From 8ccce7f949ecf47abe2f140b45d9b9e1b9c80888 Mon Sep 17 00:00:00 2001 From: JezuzLizard Date: Tue, 8 Mar 2022 06:51:12 -0800 Subject: [PATCH] [MP] Added remaining MP GSCs. --- .../character/c_mp_german_shepherd_vest.gsc | 10 +- .../c_mp_german_shepherd_vest_black.gsc | 10 +- .../common_mp/maps/mp/_serverfaceanim_mp.gsc | 85 +- .../maps/mp/animscripts/dog_combat.gsc | 125 +- .../maps/mp/animscripts/dog_death.gsc | 48 +- .../maps/mp/animscripts/dog_flashed.gsc | 41 +- .../maps/mp/animscripts/dog_init.gsc | 129 +- .../maps/mp/animscripts/dog_jump.gsc | 20 +- .../maps/mp/animscripts/dog_move.gsc | 298 +- .../maps/mp/animscripts/dog_pain.gsc | 46 +- .../maps/mp/animscripts/dog_stop.gsc | 209 +- .../maps/mp/animscripts/dog_turn.gsc | 160 +- .../common_mp/maps/mp/animscripts/shared.gsc | 473 +- .../mp/animscripts/traverse/jump_down_40.gsc | 10 +- .../mp/animscripts/traverse/jump_down_56.gsc | 10 +- .../mp/animscripts/traverse/jump_down_96.gsc | 10 +- .../mp/animscripts/traverse/mantle_on_40.gsc | 10 +- .../mp/animscripts/traverse/mantle_on_56.gsc | 10 +- .../mp/animscripts/traverse/mantle_on_80.gsc | 10 +- .../mp/animscripts/traverse/mantle_on_96.gsc | 10 +- .../animscripts/traverse/mantle_over_40.gsc | 10 +- .../animscripts/traverse/mantle_window_36.gsc | 10 +- .../maps/mp/animscripts/traverse/shared.gsc | 346 +- .../animscripts/traverse/through_hole_42.gsc | 42 +- .../common_mp/maps/mp/animscripts/utility.gsc | 192 +- .../common_mp/maps/mp/killstreaks/_dogs.gsc | 1493 ++--- .../patch_mp/codescripts/character_mp.gsc | 21 +- .../patch_mp/codescripts/delete.gsc | 39 +- .../patch_mp/codescripts/struct.gsc | 40 +- .../patch_mp/common_scripts/utility.gsc | 2552 ++++---- .../patch_mp/maps/mp/_acousticsensor.gsc | 266 +- .../patch_mp/maps/mp/_ambientpackage.gsc | 3 + Multiplayer Core/patch_mp/maps/mp/_art.gsc | 784 ++- Multiplayer Core/patch_mp/maps/mp/_audio.gsc | 228 +- .../patch_mp/maps/mp/_ballistic_knife.gsc | 465 +- Multiplayer Core/patch_mp/maps/mp/_bb.gsc | 127 +- .../patch_mp/maps/mp/_bouncingbetty.gsc | 288 +- .../patch_mp/maps/mp/_burnplayer.gsc | 1017 ++- Multiplayer Core/patch_mp/maps/mp/_busing.gsc | 26 +- .../patch_mp/maps/mp/_challenges.gsc | 3288 +++++----- .../patch_mp/maps/mp/_compass.gsc | 129 +- .../patch_mp/maps/mp/_createfx.gsc | 5310 +++++++-------- .../patch_mp/maps/mp/_createfxmenu.gsc | 1540 +++-- .../patch_mp/maps/mp/_createfxundo.gsc | 837 ++- Multiplayer Core/patch_mp/maps/mp/_decoy.gsc | 523 +- Multiplayer Core/patch_mp/maps/mp/_demo.gsc | 170 +- .../patch_mp/maps/mp/_destructible.gsc | 753 +-- .../patch_mp/maps/mp/_development_dvars.gsc | 10 +- .../patch_mp/maps/mp/_empgrenade.gsc | 292 +- .../patch_mp/maps/mp/_entityheadicons.gsc | 250 +- .../patch_mp/maps/mp/_explosive_bolt.gsc | 16 +- .../patch_mp/maps/mp/_flashgrenades.gsc | 340 +- Multiplayer Core/patch_mp/maps/mp/_fx.gsc | 649 +- Multiplayer Core/patch_mp/maps/mp/_fxanim.gsc | 8 +- .../patch_mp/maps/mp/_gameadvertisement.gsc | 779 ++- .../patch_mp/maps/mp/_gamerep.gsc | 627 +- .../patch_mp/maps/mp/_global_fx.gsc | 94 +- .../patch_mp/maps/mp/_hacker_tool.gsc | 1236 ++-- .../patch_mp/maps/mp/_heatseekingmissile.gsc | 1077 ++- .../patch_mp/maps/mp/_interactive_objects.gsc | 718 +- Multiplayer Core/patch_mp/maps/mp/_load.gsc | 957 ++- Multiplayer Core/patch_mp/maps/mp/_medals.gsc | 50 +- Multiplayer Core/patch_mp/maps/mp/_menus.gsc | 5 +- .../patch_mp/maps/mp/_mgturret.gsc | 517 +- .../patch_mp/maps/mp/_multi_extracam.gsc | 5 +- Multiplayer Core/patch_mp/maps/mp/_music.gsc | 42 +- Multiplayer Core/patch_mp/maps/mp/_pc.gsc | 6 +- Multiplayer Core/patch_mp/maps/mp/_popups.gsc | 636 +- .../patch_mp/maps/mp/_proximity_grenade.gsc | 351 +- .../patch_mp/maps/mp/_riotshield.gsc | 768 ++- .../patch_mp/maps/mp/_satchel_charge.gsc | 77 +- .../patch_mp/maps/mp/_scoreevents.gsc | 1410 ++-- .../patch_mp/maps/mp/_scrambler.gsc | 358 +- .../patch_mp/maps/mp/_script_gen.gsc | 577 +- .../patch_mp/maps/mp/_sensor_grenade.gsc | 365 +- .../patch_mp/maps/mp/_smokegrenade.gsc | 103 +- .../patch_mp/maps/mp/_sticky_grenade.gsc | 16 +- Multiplayer Core/patch_mp/maps/mp/_tabun.gsc | 903 ++- .../patch_mp/maps/mp/_tacticalinsertion.gsc | 657 +- .../patch_mp/maps/mp/_teargrenades.gsc | 309 +- .../patch_mp/maps/mp/_treadfx.gsc | 216 +- .../patch_mp/maps/mp/_trophy_system.gsc | 615 +- .../patch_mp/maps/mp/_utility.gsc | 4218 ++++++------ .../patch_mp/maps/mp/_vehicles.gsc | 2436 ++++--- .../maps/mp/animscripts/dog_combat.gsc | 163 +- .../patch_mp/maps/mp/animscripts/dog_init.gsc | 102 +- .../patch_mp/maps/mp/bots/_bot.gsc | 4472 +++++++------ .../patch_mp/maps/mp/bots/_bot_combat.gsc | 3184 +++++---- .../patch_mp/maps/mp/bots/_bot_conf.gsc | 170 +- .../patch_mp/maps/mp/bots/_bot_ctf.gsc | 665 +- .../patch_mp/maps/mp/bots/_bot_dem.gsc | 598 +- .../patch_mp/maps/mp/bots/_bot_dom.gsc | 757 ++- .../patch_mp/maps/mp/bots/_bot_hack.gsc | 326 +- .../patch_mp/maps/mp/bots/_bot_hq.gsc | 636 +- .../patch_mp/maps/mp/bots/_bot_koth.gsc | 514 +- .../patch_mp/maps/mp/bots/_bot_loadout.gsc | 1012 +-- .../patch_mp/maps/mp/bots/_bot_sd.gsc | 814 +-- .../maps/mp/gametypes/_battlechatter_mp.gsc | 1963 +++--- .../maps/mp/gametypes/_callbacksetup.gsc | 263 +- .../patch_mp/maps/mp/gametypes/_class.gsc | 2078 +++--- .../patch_mp/maps/mp/gametypes/_clientids.gsc | 23 +- .../patch_mp/maps/mp/gametypes/_copter.gsc | 1420 ++-- .../maps/mp/gametypes/_damagefeedback.gsc | 290 +- .../maps/mp/gametypes/_deathicons.gsc | 156 +- .../patch_mp/maps/mp/gametypes/_dev.gsc | 5757 ++++++++--------- .../patch_mp/maps/mp/gametypes/_dev_class.gsc | 847 ++- .../maps/mp/gametypes/_friendicons.gsc | 172 +- .../maps/mp/gametypes/_gameobjects.gsc | 4672 +++++++------ .../maps/mp/gametypes/_globalentities.gsc | 2 + .../maps/mp/gametypes/_globallogic.gsc | 1 - .../maps/mp/gametypes/_globallogic_actor.gsc | 383 +- .../maps/mp/gametypes/_globallogic_audio.gsc | 1554 ++--- .../mp/gametypes/_globallogic_defaults.gsc | 460 +- .../maps/mp/gametypes/_globallogic_player.gsc | 5062 +++++++-------- .../maps/mp/gametypes/_globallogic_score.gsc | 2448 ++++--- .../maps/mp/gametypes/_globallogic_spawn.gsc | 1613 +++-- .../maps/mp/gametypes/_globallogic_ui.gsc | 1175 ++-- .../maps/mp/gametypes/_globallogic_utils.gsc | 840 ++- .../mp/gametypes/_globallogic_vehicle.gsc | 746 +-- .../maps/mp/gametypes/_healthoverlay.gsc | 486 +- .../maps/mp/gametypes/_hostmigration.gsc | 569 +- .../patch_mp/maps/mp/gametypes/_hud.gsc | 324 +- .../maps/mp/gametypes/_hud_message.gsc | 2548 ++++---- .../patch_mp/maps/mp/gametypes/_hud_util.gsc | 1846 +++--- .../patch_mp/maps/mp/gametypes/_killcam.gsc | 1287 ++-- .../patch_mp/maps/mp/gametypes/_menus.gsc | 323 +- .../patch_mp/maps/mp/gametypes/_objpoints.gsc | 271 +- .../patch_mp/maps/mp/gametypes/_perplayer.gsc | 301 +- .../maps/mp/gametypes/_persistence.gsc | 757 +-- .../patch_mp/maps/mp/gametypes/_pregame.gsc | 500 +- .../patch_mp/maps/mp/gametypes/_rank.gsc | 1375 ++-- .../maps/mp/gametypes/_scoreboard.gsc | 31 +- .../maps/mp/gametypes/_serversettings.gsc | 369 +- .../maps/mp/gametypes/_shellshock.gsc | 82 +- .../patch_mp/maps/mp/gametypes/_spawning.gsc | 2094 +++--- .../maps/mp/gametypes/_spawnlogic.gsc | 3772 +++++------ .../maps/mp/gametypes/_spectating.gsc | 407 +- .../maps/mp/gametypes/_tweakables.gsc | 704 +- .../patch_mp/maps/mp/gametypes/_wager.gsc | 1577 +++-- .../maps/mp/gametypes/_weapon_utils.gsc | 170 +- .../maps/mp/gametypes/_weaponobjects.gsc | 4451 ++++++------- .../patch_mp/maps/mp/gametypes/_weapons.gsc | 3691 +++++------ .../patch_mp/maps/mp/gametypes/conf.gsc | 876 ++- .../patch_mp/maps/mp/gametypes/ctf.gsc | 2143 +++--- .../patch_mp/maps/mp/gametypes/dem.gsc | 2310 ++++--- .../patch_mp/maps/mp/gametypes/dm.gsc | 218 +- .../patch_mp/maps/mp/gametypes/dom.gsc | 2595 ++++---- .../patch_mp/maps/mp/gametypes/gun.gsc | 703 +- .../patch_mp/maps/mp/gametypes/hq.gsc | 2258 ++++--- .../patch_mp/maps/mp/gametypes/koth.gsc | 2524 ++++---- .../patch_mp/maps/mp/gametypes/oic.gsc | 584 +- .../patch_mp/maps/mp/gametypes/oneflag.gsc | 2466 ++++--- .../patch_mp/maps/mp/gametypes/sas.gsc | 495 +- .../patch_mp/maps/mp/gametypes/sd.gsc | 1656 +++-- .../patch_mp/maps/mp/gametypes/shrp.gsc | 1208 ++-- .../patch_mp/maps/mp/gametypes/tdm.gsc | 489 +- .../patch_mp/maps/mp/killstreaks/_ai_tank.gsc | 2437 ++++--- .../maps/mp/killstreaks/_airsupport.gsc | 1321 ++-- .../patch_mp/maps/mp/killstreaks/_dogs.gsc | 1572 +++-- .../patch_mp/maps/mp/killstreaks/_emp.gsc | 852 ++- .../maps/mp/killstreaks/_helicopter.gsc | 4527 +++++++------ .../maps/mp/killstreaks/_helicopter_guard.gsc | 1244 ++-- .../mp/killstreaks/_helicopter_gunner.gsc | 2685 ++++---- .../mp/killstreaks/_killstreak_weapons.gsc | 1071 ++- .../maps/mp/killstreaks/_killstreakrules.gsc | 665 +- .../maps/mp/killstreaks/_killstreaks.gsc | 3122 +++++---- .../maps/mp/killstreaks/_missile_drone.gsc | 1077 ++- .../maps/mp/killstreaks/_missile_swarm.gsc | 1236 ++-- .../maps/mp/killstreaks/_planemortar.gsc | 557 +- .../patch_mp/maps/mp/killstreaks/_qrdrone.gsc | 2358 ++++--- .../patch_mp/maps/mp/killstreaks/_radar.gsc | 457 +- .../patch_mp/maps/mp/killstreaks/_rcbomb.gsc | 1292 ++-- .../maps/mp/killstreaks/_remote_weapons.gsc | 780 ++- .../maps/mp/killstreaks/_remotemissile.gsc | 1807 +++--- .../maps/mp/killstreaks/_remotemortar.gsc | 1375 ++-- .../maps/mp/killstreaks/_spyplane.gsc | 1802 +++--- .../maps/mp/killstreaks/_straferun.gsc | 1604 +++-- .../maps/mp/killstreaks/_supplycrate.gsc | 7 +- .../maps/mp/killstreaks/_supplydrop.gsc | 4432 +++++++------ .../mp/killstreaks/_turret_killstreak.gsc | 4381 ++++++------- .../patch_mp/maps/mp/mp_bridge.gsc | 331 +- .../patch_mp/maps/mp/mp_carrier.gsc | 256 +- .../patch_mp/maps/mp/mp_castaway.gsc | 112 +- .../patch_mp/maps/mp/mp_concert.gsc | 198 +- Multiplayer Core/patch_mp/maps/mp/mp_dig.gsc | 103 +- .../patch_mp/maps/mp/mp_dockside.gsc | 292 +- .../patch_mp/maps/mp/mp_dockside_crane.gsc | 1268 ++-- .../patch_mp/maps/mp/mp_downhill.gsc | 104 +- .../patch_mp/maps/mp/mp_downhill_cablecar.gsc | 1372 ++-- .../patch_mp/maps/mp/mp_drone.gsc | 186 +- .../patch_mp/maps/mp/mp_express.gsc | 131 +- .../patch_mp/maps/mp/mp_express_train.gsc | 1142 ++-- .../patch_mp/maps/mp/mp_frostbite.gsc | 308 +- .../patch_mp/maps/mp/mp_hijacked.gsc | 376 +- .../patch_mp/maps/mp/mp_hydro.gsc | 839 ++- Multiplayer Core/patch_mp/maps/mp/mp_la.gsc | 218 +- .../patch_mp/maps/mp/mp_magma.gsc | 449 +- .../patch_mp/maps/mp/mp_meltdown.gsc | 77 +- .../patch_mp/maps/mp/mp_mirage.gsc | 76 +- .../patch_mp/maps/mp/mp_nightclub.gsc | 194 +- .../patch_mp/maps/mp/mp_nuketown_2020.gsc | 839 +-- .../patch_mp/maps/mp/mp_overflow.gsc | 286 +- .../patch_mp/maps/mp/mp_paintball.gsc | 212 +- Multiplayer Core/patch_mp/maps/mp/mp_pod.gsc | 136 +- Multiplayer Core/patch_mp/maps/mp/mp_raid.gsc | 152 +- .../patch_mp/maps/mp/mp_skate.gsc | 103 +- .../patch_mp/maps/mp/mp_slums.gsc | 394 +- .../patch_mp/maps/mp/mp_socotra.gsc | 155 +- .../patch_mp/maps/mp/mp_studio.gsc | 695 +- .../patch_mp/maps/mp/mp_takeoff.gsc | 564 +- .../patch_mp/maps/mp/mp_turbine.gsc | 203 +- .../patch_mp/maps/mp/mp_uplink.gsc | 173 +- .../patch_mp/maps/mp/mp_vertigo.gsc | 308 +- .../patch_mp/maps/mp/mp_village.gsc | 243 +- .../patch_mp/maps/mp/teams/_teams.gsc | 619 +- .../patch_mp/maps/mp/teams/_teamset.gsc | 43 +- .../maps/mp/teams/_teamset_multiteam.gsc | 389 +- 217 files changed, 93508 insertions(+), 100413 deletions(-) diff --git a/Multiplayer Core/common_mp/character/c_mp_german_shepherd_vest.gsc b/Multiplayer Core/common_mp/character/c_mp_german_shepherd_vest.gsc index ce0fe5a..955cac7 100644 --- a/Multiplayer Core/common_mp/character/c_mp_german_shepherd_vest.gsc +++ b/Multiplayer Core/common_mp/character/c_mp_german_shepherd_vest.gsc @@ -1,12 +1,14 @@ +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool main() { - self setmodel( "german_shepherd_vest" ); - self.voice = "american"; - self.skeleton = "base"; + self setmodel( "german_shepherd_vest" ); + self.voice = "american"; + self.skeleton = "base"; } precache() { - precachemodel( "german_shepherd_vest" ); + precachemodel( "german_shepherd_vest" ); } diff --git a/Multiplayer Core/common_mp/character/c_mp_german_shepherd_vest_black.gsc b/Multiplayer Core/common_mp/character/c_mp_german_shepherd_vest_black.gsc index c1bab6d..ed40bc5 100644 --- a/Multiplayer Core/common_mp/character/c_mp_german_shepherd_vest_black.gsc +++ b/Multiplayer Core/common_mp/character/c_mp_german_shepherd_vest_black.gsc @@ -1,12 +1,14 @@ +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool main() { - self setmodel( "german_shepherd_vest_black" ); - self.voice = "american"; - self.skeleton = "base"; + self setmodel( "german_shepherd_vest_black" ); + self.voice = "american"; + self.skeleton = "base"; } precache() { - precachemodel( "german_shepherd_vest_black" ); + precachemodel( "german_shepherd_vest_black" ); } diff --git a/Multiplayer Core/common_mp/maps/mp/_serverfaceanim_mp.gsc b/Multiplayer Core/common_mp/maps/mp/_serverfaceanim_mp.gsc index bbd52a4..57936ef 100644 --- a/Multiplayer Core/common_mp/maps/mp/_serverfaceanim_mp.gsc +++ b/Multiplayer Core/common_mp/maps/mp/_serverfaceanim_mp.gsc @@ -1,56 +1,61 @@ -#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() { - for ( ;; ) - { - level waittill( "connecting", player ); - player thread onplayerspawned(); - } + for (;;) + { + level waittill( "connecting", player ); + + player thread onplayerspawned(); + } } onplayerspawned() { - self endon( "disconnect" ); - for ( ;; ) - { - self waittill( "spawned_player" ); - self thread init_serverfaceanim(); - } + self endon( "disconnect" ); + + for (;;) + { + self waittill( "spawned_player" ); + + self thread init_serverfaceanim(); + } } init_serverfaceanim() { - self.do_face_anims = 1; - if ( !isDefined( level.face_event_handler ) ) - { - level.face_event_handler = spawnstruct(); - level.face_event_handler.events = []; - level.face_event_handler.events[ "death" ] = "face_death"; - level.face_event_handler.events[ "grenade danger" ] = "face_alert"; - level.face_event_handler.events[ "bulletwhizby" ] = "face_alert"; - level.face_event_handler.events[ "projectile_impact" ] = "face_alert"; - level.face_event_handler.events[ "explode" ] = "face_alert"; - level.face_event_handler.events[ "alert" ] = "face_alert"; - level.face_event_handler.events[ "shoot" ] = "face_shoot_single"; - level.face_event_handler.events[ "melee" ] = "face_melee"; - level.face_event_handler.events[ "damage" ] = "face_pain"; - level thread wait_for_face_event(); - } + self.do_face_anims = 1; + + if ( !isdefined( level.face_event_handler ) ) + { + level.face_event_handler = spawnstruct(); + level.face_event_handler.events = []; + level.face_event_handler.events["death"] = "face_death"; + level.face_event_handler.events["grenade danger"] = "face_alert"; + level.face_event_handler.events["bulletwhizby"] = "face_alert"; + level.face_event_handler.events["projectile_impact"] = "face_alert"; + level.face_event_handler.events["explode"] = "face_alert"; + level.face_event_handler.events["alert"] = "face_alert"; + level.face_event_handler.events["shoot"] = "face_shoot_single"; + level.face_event_handler.events["melee"] = "face_melee"; + level.face_event_handler.events["damage"] = "face_pain"; + level thread wait_for_face_event(); + } } wait_for_face_event() { - while ( 1 ) - { - level waittill( "face", face_notify, ent ); - if ( isDefined( ent ) && isDefined( ent.do_face_anims ) && ent.do_face_anims ) - { - if ( isDefined( level.face_event_handler.events[ face_notify ] ) ) - { - ent sendfaceevent( level.face_event_handler.events[ face_notify ] ); - } - } - } + while ( true ) + { + level waittill( "face", face_notify, ent ); + + if ( isdefined( ent ) && isdefined( ent.do_face_anims ) && ent.do_face_anims ) + { + if ( isdefined( level.face_event_handler.events[face_notify] ) ) + ent sendfaceevent( level.face_event_handler.events[face_notify] ); + } + } } diff --git a/Multiplayer Core/common_mp/maps/mp/animscripts/dog_combat.gsc b/Multiplayer Core/common_mp/maps/mp/animscripts/dog_combat.gsc index 5686230..acb4bcf 100644 --- a/Multiplayer Core/common_mp/maps/mp/animscripts/dog_combat.gsc +++ b/Multiplayer Core/common_mp/maps/mp/animscripts/dog_combat.gsc @@ -1,86 +1,87 @@ -#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" ); - self maps/mp/animscripts/shared::donotetracksfortime( 1,4, "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" ); + self maps\mp\animscripts\shared::donotetracksfortime( 1.4, "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( player ) { - return 0; + return 0; } diff --git a/Multiplayer Core/common_mp/maps/mp/animscripts/dog_death.gsc b/Multiplayer Core/common_mp/maps/mp/animscripts/dog_death.gsc index 8f65047..408d5ac 100644 --- a/Multiplayer Core/common_mp/maps/mp/animscripts/dog_death.gsc +++ b/Multiplayer Core/common_mp/maps/mp/animscripts/dog_death.gsc @@ -1,30 +1,34 @@ -#include maps/mp/animscripts/shared; -#include maps/mp/animscripts/utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\animscripts\utility; +#include maps\mp\animscripts\shared; main() { - debug_anim_print( "dog_death::main()" ); - self setaimanimweights( 0, 0 ); - self endon( "killanimscript" ); - if ( isDefined( self.a.nodeath ) ) - { + debug_anim_print( "dog_death::main()" ); + self setaimanimweights( 0, 0 ); + self endon( "killanimscript" ); + + if ( isdefined( self.a.nodeath ) ) + { /# - assert( self.a.nodeath, "Nodeath needs to be set to true or undefined." ); + assert( self.a.nodeath, "Nodeath needs to be set to true or undefined." ); #/ - wait 3; - return; - } - self unlink(); - if ( isDefined( self.enemy ) && isDefined( self.enemy.syncedmeleetarget ) && self.enemy.syncedmeleetarget == self ) - { - self.enemy.syncedmeleetarget = undefined; - } - death_anim = "death_" + getanimdirection( self.damageyaw ); + wait 3; + return; + } + + self unlink(); + + if ( isdefined( self.enemy ) && isdefined( self.enemy.syncedmeleetarget ) && self.enemy.syncedmeleetarget == self ) + self.enemy.syncedmeleetarget = undefined; + + death_anim = "death_" + getanimdirection( self.damageyaw ); /# - println( death_anim ); + println( death_anim ); #/ - self animmode( "gravity", 0 ); - debug_anim_print( "dog_death::main() - Setting " + death_anim ); - self setanimstate( death_anim ); - self maps/mp/animscripts/shared::donotetracks( "done" ); + self animmode( "gravity", 0 ); + debug_anim_print( "dog_death::main() - Setting " + death_anim ); + self setanimstate( death_anim ); + self maps\mp\animscripts\shared::donotetracks( "done" ); } diff --git a/Multiplayer Core/common_mp/maps/mp/animscripts/dog_flashed.gsc b/Multiplayer Core/common_mp/maps/mp/animscripts/dog_flashed.gsc index e86fde0..ed89182 100644 --- a/Multiplayer Core/common_mp/maps/mp/animscripts/dog_flashed.gsc +++ b/Multiplayer Core/common_mp/maps/mp/animscripts/dog_flashed.gsc @@ -1,29 +1,28 @@ -#include maps/mp/animscripts/shared; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\animscripts\shared; main() { - self endon( "killanimscript" ); - self endon( "stop_flashbang_effect" ); - wait randomfloatrange( 0, 0,4 ); - duration = self startflashbanged() * 0,001; - self setanimstate( "flashed" ); - self maps/mp/animscripts/shared::donotetracks( "done" ); - self setflashbanged( 0 ); - self.flashed = 0; - self notify( "stop_flashbang_effect" ); + self endon( "killanimscript" ); + self endon( "stop_flashbang_effect" ); + wait( randomfloatrange( 0, 0.4 ) ); + duration = self startflashbanged() * 0.001; + self setanimstate( "flashed" ); + self maps\mp\animscripts\shared::donotetracks( "done" ); + self setflashbanged( 0 ); + self.flashed = 0; + self notify( "stop_flashbang_effect" ); } startflashbanged() { - if ( isDefined( self.flashduration ) ) - { - duration = self.flashduration; - } - else - { - duration = self getflashbangedstrength() * 1000; - } - self.flashendtime = getTime() + duration; - self notify( "flashed" ); - return duration; + if ( isdefined( self.flashduration ) ) + duration = self.flashduration; + else + duration = self getflashbangedstrength() * 1000; + + self.flashendtime = gettime() + duration; + self notify( "flashed" ); + return duration; } diff --git a/Multiplayer Core/common_mp/maps/mp/animscripts/dog_init.gsc b/Multiplayer Core/common_mp/maps/mp/animscripts/dog_init.gsc index 5c6d6bc..b807e09 100644 --- a/Multiplayer Core/common_mp/maps/mp/animscripts/dog_init.gsc +++ b/Multiplayer Core/common_mp/maps/mp/animscripts/dog_init.gsc @@ -1,78 +1,75 @@ -#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; 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.dogattackplayerdist = 50; - level.dogattackplayercloserangedist = 50; - 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.dogattackplayerdist = 50; + level.dogattackplayercloserangedist = 50; + 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 ) - { - if ( isDefined( self.enemy ) ) - { - if ( isplayer( self.enemy ) ) - { - stance = self.enemy getstance(); - if ( stance == "prone" ) - { - self.meleeattackdist = level.dogattackplayercloserangedist; - } - else - { - self.meleeattackdist = level.dogattackplayerdist; - } - break; - } - else - { - self.meleeattackdist = level.dogattackplayerdist; - } - } - wait 1; - } + self endon( "death" ); + + while ( true ) + { + if ( isdefined( self.enemy ) ) + { + if ( isplayer( self.enemy ) ) + { + stance = self.enemy getstance(); + + if ( stance == "prone" ) + self.meleeattackdist = level.dogattackplayercloserangedist; + else + self.meleeattackdist = level.dogattackplayerdist; + } + else + self.meleeattackdist = level.dogattackplayerdist; + } + + wait 1; + } } diff --git a/Multiplayer Core/common_mp/maps/mp/animscripts/dog_jump.gsc b/Multiplayer Core/common_mp/maps/mp/animscripts/dog_jump.gsc index acfb82a..80dd040 100644 --- a/Multiplayer Core/common_mp/maps/mp/animscripts/dog_jump.gsc +++ b/Multiplayer Core/common_mp/maps/mp/animscripts/dog_jump.gsc @@ -1,13 +1,15 @@ -#include maps/mp/animscripts/shared; -#include maps/mp/animscripts/utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\animscripts\utility; +#include maps\mp\animscripts\shared; main() { - self endon( "killanimscript" ); - debug_anim_print( "dog_jump::main()" ); - self setaimanimweights( 0, 0 ); - self.safetochangescript = 0; - self setanimstate( "traverse_wallhop" ); - maps/mp/animscripts/shared::donotetracks( "done" ); - self.safetochangescript = 1; + self endon( "killanimscript" ); + debug_anim_print( "dog_jump::main()" ); + self setaimanimweights( 0, 0 ); + self.safetochangescript = 0; + self setanimstate( "traverse_wallhop" ); + maps\mp\animscripts\shared::donotetracks( "done" ); + self.safetochangescript = 1; } diff --git a/Multiplayer Core/common_mp/maps/mp/animscripts/dog_move.gsc b/Multiplayer Core/common_mp/maps/mp/animscripts/dog_move.gsc index af8604d..cddef29 100644 --- a/Multiplayer Core/common_mp/maps/mp/animscripts/dog_move.gsc +++ b/Multiplayer Core/common_mp/maps/mp/animscripts/dog_move.gsc @@ -1,185 +1,173 @@ -#include maps/mp/animscripts/dog_stop; -#include maps/mp/animscripts/shared; -#include maps/mp/animscripts/utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\animscripts\utility; +#include maps\mp\animscripts\shared; +#include maps\mp\animscripts\dog_stop; setup_sound_variables() { - level.dog_sounds[ "far" ] = spawnstruct(); - level.dog_sounds[ "close" ] = spawnstruct(); - level.dog_sounds[ "close" ].minrange = 0; - level.dog_sounds[ "close" ].maxrange = 500; - level.dog_sounds[ "close" ].sound = "aml_dog_bark_close"; - level.dog_sounds[ "close" ].soundlengthplaceholder = 0,2; - level.dog_sounds[ "close" ].aftersoundwaitmin = 0,1; - level.dog_sounds[ "close" ].aftersoundwaitmax = 0,3; - level.dog_sounds[ "close" ].minrangesqr = level.dog_sounds[ "close" ].minrange * level.dog_sounds[ "close" ].minrange; - level.dog_sounds[ "close" ].maxrangesqr = level.dog_sounds[ "close" ].maxrange * level.dog_sounds[ "close" ].maxrange; - level.dog_sounds[ "far" ].minrange = 500; - level.dog_sounds[ "far" ].maxrange = 0; - level.dog_sounds[ "far" ].sound = "aml_dog_bark"; - level.dog_sounds[ "far" ].soundlengthplaceholder = 0,2; - level.dog_sounds[ "far" ].aftersoundwaitmin = 0,1; - level.dog_sounds[ "far" ].aftersoundwaitmax = 0,3; - level.dog_sounds[ "far" ].minrangesqr = level.dog_sounds[ "far" ].minrange * level.dog_sounds[ "far" ].minrange; - level.dog_sounds[ "far" ].maxrangesqr = level.dog_sounds[ "far" ].maxrange * level.dog_sounds[ "far" ].maxrange; + level.dog_sounds["far"] = spawnstruct(); + level.dog_sounds["close"] = spawnstruct(); + level.dog_sounds["close"].minrange = 0; + level.dog_sounds["close"].maxrange = 500; + level.dog_sounds["close"].sound = "aml_dog_bark_close"; + level.dog_sounds["close"].soundlengthplaceholder = 0.2; + level.dog_sounds["close"].aftersoundwaitmin = 0.1; + level.dog_sounds["close"].aftersoundwaitmax = 0.3; + level.dog_sounds["close"].minrangesqr = level.dog_sounds["close"].minrange * level.dog_sounds["close"].minrange; + level.dog_sounds["close"].maxrangesqr = level.dog_sounds["close"].maxrange * level.dog_sounds["close"].maxrange; + level.dog_sounds["far"].minrange = 500; + level.dog_sounds["far"].maxrange = 0; + level.dog_sounds["far"].sound = "aml_dog_bark"; + level.dog_sounds["far"].soundlengthplaceholder = 0.2; + level.dog_sounds["far"].aftersoundwaitmin = 0.1; + level.dog_sounds["far"].aftersoundwaitmax = 0.3; + level.dog_sounds["far"].minrangesqr = level.dog_sounds["far"].minrange * level.dog_sounds["far"].minrange; + level.dog_sounds["far"].maxrangesqr = level.dog_sounds["far"].maxrange * level.dog_sounds["far"].maxrange; } main() { - self endon( "killanimscript" ); - debug_anim_print( "dog_move::main()" ); - self setaimanimweights( 0, 0 ); - do_movement = 1; + self endon( "killanimscript" ); + debug_anim_print( "dog_move::main()" ); + self setaimanimweights( 0, 0 ); + do_movement = 1; /# - if ( !debug_allow_movement() ) - { - do_movement = 0; + if ( !debug_allow_movement() ) + do_movement = 0; #/ - } - if ( isDefined( level.hostmigrationtimer ) ) - { - do_movement = 0; - } - if ( !isDefined( self.traversecomplete ) && !isDefined( self.skipstartmove ) && self.a.movement == "run" && do_movement ) - { - self startmove(); - blendtime = 0; - } - else - { - blendtime = 0,2; - } - self.traversecomplete = undefined; - self.skipstartmove = undefined; - if ( do_movement ) - { - if ( shouldrun() ) - { - debug_anim_print( "dog_move::main() - Setting move_run" ); - self setanimstate( "move_run" ); - maps/mp/animscripts/shared::donotetracksfortime( 0,1, "done" ); - debug_anim_print( "dog_move::main() - move_run wait 0.1 done " ); - } - else - { - debug_anim_print( "dog_move::main() - Setting move_start " ); - self setanimstate( "move_walk" ); - maps/mp/animscripts/shared::donotetracksfortime( 0,1, "done" ); - } - } - self thread maps/mp/animscripts/dog_stop::lookattarget( "normal" ); - while ( 1 ) - { - self moveloop(); - if ( self.a.movement == "run" ) - { - if ( self.disablearrivals == 0 ) - { - self thread stopmove(); - } - self waittill( "run" ); - } - } + if ( isdefined( level.hostmigrationtimer ) ) + do_movement = 0; + + if ( !isdefined( self.traversecomplete ) && !isdefined( self.skipstartmove ) && self.a.movement == "run" && do_movement ) + { + self startmove(); + blendtime = 0; + } + else + blendtime = 0.2; + + self.traversecomplete = undefined; + self.skipstartmove = undefined; + + if ( do_movement ) + { + if ( shouldrun() ) + { + debug_anim_print( "dog_move::main() - Setting move_run" ); + self setanimstate( "move_run" ); + maps\mp\animscripts\shared::donotetracksfortime( 0.1, "done" ); + debug_anim_print( "dog_move::main() - move_run wait 0.1 done " ); + } + else + { + debug_anim_print( "dog_move::main() - Setting move_start " ); + self setanimstate( "move_walk" ); + maps\mp\animscripts\shared::donotetracksfortime( 0.1, "done" ); + } + } + + self thread maps\mp\animscripts\dog_stop::lookattarget( "normal" ); + + while ( true ) + { + self moveloop(); + + if ( self.a.movement == "run" ) + { + if ( self.disablearrivals == 0 ) + self thread stopmove(); + + self waittill( "run" ); + } + } } moveloop() { - self endon( "killanimscript" ); - self endon( "stop_soon" ); - while ( 1 ) - { - do_movement = 1; + self endon( "killanimscript" ); + self endon( "stop_soon" ); + + while ( true ) + { + do_movement = 1; /# - if ( !debug_allow_movement() ) - { - do_movement = 0; + if ( !debug_allow_movement() ) + do_movement = 0; #/ - } - if ( isDefined( level.hostmigrationtimer ) ) - { - do_movement = 0; - } - while ( !do_movement ) - { - self setaimanimweights( 0, 0 ); - self setanimstate( "stop_idle" ); - maps/mp/animscripts/shared::donotetracks( "done" ); - } - if ( self.disablearrivals ) - { - self.stopanimdistsq = 0; - } - else - { - self.stopanimdistsq = level.dogstoppingdistsq; - } - if ( shouldrun() ) - { - debug_anim_print( "dog_move::moveLoop() - Setting move_run" ); - self setanimstate( "move_run" ); - maps/mp/animscripts/shared::donotetracksfortime( 0,2, "done" ); - debug_anim_print( "dog_move::moveLoop() - move_run wait 0.2 done " ); - continue; - } - else - { - debug_anim_print( "dog_move::moveLoop() - Setting move_walk " ); - self setanimstate( "move_walk" ); - maps/mp/animscripts/shared::donotetracksfortime( 0,2, "done" ); - debug_anim_print( "dog_move::moveLoop() - move_walk wait 0.2 done " ); - } - } + if ( isdefined( level.hostmigrationtimer ) ) + do_movement = 0; + + if ( !do_movement ) + { + self setaimanimweights( 0, 0 ); + self setanimstate( "stop_idle" ); + maps\mp\animscripts\shared::donotetracks( "done" ); + continue; + } + + if ( self.disablearrivals ) + self.stopanimdistsq = 0; + else + self.stopanimdistsq = level.dogstoppingdistsq; + + if ( shouldrun() ) + { + debug_anim_print( "dog_move::moveLoop() - Setting move_run" ); + self setanimstate( "move_run" ); + maps\mp\animscripts\shared::donotetracksfortime( 0.2, "done" ); + debug_anim_print( "dog_move::moveLoop() - move_run wait 0.2 done " ); + } + else + { + debug_anim_print( "dog_move::moveLoop() - Setting move_walk " ); + self setanimstate( "move_walk" ); + maps\mp\animscripts\shared::donotetracksfortime( 0.2, "done" ); + debug_anim_print( "dog_move::moveLoop() - move_walk wait 0.2 done " ); + } + } } startmove() { - debug_anim_print( "dog_move::startMove() - Setting move_start " ); - self setanimstate( "move_start" ); - maps/mp/animscripts/shared::donotetracks( "done" ); - debug_anim_print( "dog_move::startMove() - move_start notify done." ); - self animmode( "none", 0 ); - self set_orient_mode( "face motion" ); + debug_anim_print( "dog_move::startMove() - Setting move_start " ); + self setanimstate( "move_start" ); + maps\mp\animscripts\shared::donotetracks( "done" ); + debug_anim_print( "dog_move::startMove() - move_start notify done." ); + self animmode( "none", 0 ); + self set_orient_mode( "face motion" ); } stopmove() { - self endon( "killanimscript" ); - self endon( "run" ); - debug_anim_print( "dog_move::stopMove() - Setting move_stop" ); - self setanimstate( "move_stop" ); - maps/mp/animscripts/shared::donotetracks( "done" ); - debug_anim_print( "dog_move::stopMove() - move_stop notify done." ); + self endon( "killanimscript" ); + self endon( "run" ); + debug_anim_print( "dog_move::stopMove() - Setting move_stop" ); + self setanimstate( "move_stop" ); + maps\mp\animscripts\shared::donotetracks( "done" ); + debug_anim_print( "dog_move::stopMove() - move_stop notify done." ); } shouldrun() { /# - if ( getDvarInt( #"DFB12081" ) != 0 ) - { - return 1; - } - else - { - if ( getDvarInt( #"D5D7999B" ) != 0 ) - { - return 0; + if ( getdvarint( _hash_DFB12081 ) != 0 ) + return true; + else if ( getdvarint( _hash_D5D7999B ) != 0 ) + return false; #/ - } - } - if ( isDefined( self.enemy ) ) - { - return 1; - } - if ( self.lookaheaddist <= 90 ) - { - return 0; - } - angles = vectorToAngle( self.lookaheaddir ); - yaw_desired = absangleclamp180( angles[ 1 ] ); - yaw = absangleclamp180( self.angles[ 1 ] ); - if ( abs( yaw_desired - yaw ) >= 8 ) - { - return 0; - } - return 1; + if ( isdefined( self.enemy ) ) + return true; + + if ( self.lookaheaddist <= 90 ) + return false; + + angles = vectortoangles( self.lookaheaddir ); + yaw_desired = absangleclamp180( angles[1] ); + yaw = absangleclamp180( self.angles[1] ); + + if ( abs( yaw_desired - yaw ) >= 8 ) + return false; + + return true; } diff --git a/Multiplayer Core/common_mp/maps/mp/animscripts/dog_pain.gsc b/Multiplayer Core/common_mp/maps/mp/animscripts/dog_pain.gsc index d218129..2b6fc2f 100644 --- a/Multiplayer Core/common_mp/maps/mp/animscripts/dog_pain.gsc +++ b/Multiplayer Core/common_mp/maps/mp/animscripts/dog_pain.gsc @@ -1,26 +1,28 @@ -#include maps/mp/animscripts/shared; -#include maps/mp/animscripts/utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\animscripts\utility; +#include maps\mp\animscripts\shared; main() { - debug_anim_print( "dog_pain::main() " ); - self endon( "killanimscript" ); - self setaimanimweights( 0, 0 ); - if ( isDefined( self.enemy ) && isDefined( self.enemy.syncedmeleetarget ) && self.enemy.syncedmeleetarget == self ) - { - self unlink(); - self.enemy.syncedmeleetarget = undefined; - } - speed = length( self getvelocity() ); - pain_anim = getanimdirection( self.damageyaw ); - if ( speed > level.dogrunpainspeed ) - { - pain_anim = "pain_run_" + pain_anim; - } - else - { - pain_anim = "pain_" + pain_anim; - } - self setanimstate( pain_anim ); - self maps/mp/animscripts/shared::donotetracksfortime( 0,2, "done" ); + debug_anim_print( "dog_pain::main() " ); + self endon( "killanimscript" ); + self setaimanimweights( 0, 0 ); + + if ( isdefined( self.enemy ) && isdefined( self.enemy.syncedmeleetarget ) && self.enemy.syncedmeleetarget == self ) + { + self unlink(); + self.enemy.syncedmeleetarget = undefined; + } + + speed = length( self getvelocity() ); + pain_anim = getanimdirection( self.damageyaw ); + + if ( speed > level.dogrunpainspeed ) + pain_anim = "pain_run_" + pain_anim; + else + pain_anim = "pain_" + pain_anim; + + self setanimstate( pain_anim ); + self maps\mp\animscripts\shared::donotetracksfortime( 0.2, "done" ); } diff --git a/Multiplayer Core/common_mp/maps/mp/animscripts/dog_stop.gsc b/Multiplayer Core/common_mp/maps/mp/animscripts/dog_stop.gsc index 0b6e630..43d1909 100644 --- a/Multiplayer Core/common_mp/maps/mp/animscripts/dog_stop.gsc +++ b/Multiplayer Core/common_mp/maps/mp/animscripts/dog_stop.gsc @@ -1,132 +1,129 @@ -#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; main() { - debug_anim_print( "dog_stop::main()" ); - self endon( "killanimscript" ); - self setaimanimweights( 0, 0 ); - self thread lookattarget( "attackIdle" ); - while ( 1 ) - { - if ( shouldattackidle() ) - { - self randomattackidle(); - maps/mp/animscripts/shared::donotetracks( "done" ); - } - else - { - self set_orient_mode( "face current" ); - debug_anim_print( "dog_stop::main() - Setting stop_idle" ); - self notify( "stop tracking" ); - self setaimanimweights( 0, 0 ); - self setanimstate( "stop_idle" ); - maps/mp/animscripts/shared::donotetracks( "done" ); - self thread lookattarget( "attackIdle" ); - } - debug_anim_print( "dog_stop::main() - stop idle loop notify done." ); - } + debug_anim_print( "dog_stop::main()" ); + self endon( "killanimscript" ); + self setaimanimweights( 0, 0 ); + self thread lookattarget( "attackIdle" ); + + while ( true ) + { + if ( shouldattackidle() ) + { + self randomattackidle(); + maps\mp\animscripts\shared::donotetracks( "done" ); + } + else + { + self set_orient_mode( "face current" ); + debug_anim_print( "dog_stop::main() - Setting stop_idle" ); + self notify( "stop tracking" ); + self setaimanimweights( 0, 0 ); + self setanimstate( "stop_idle" ); + maps\mp\animscripts\shared::donotetracks( "done" ); + self thread lookattarget( "attackIdle" ); + } + + debug_anim_print( "dog_stop::main() - stop idle loop notify done." ); + } } isfacingenemy( tolerancecosangle ) { /# - assert( isDefined( self.enemy ) ); + assert( isdefined( self.enemy ) ); #/ - vectoenemy = self.enemy.origin - self.origin; - disttoenemy = length( vectoenemy ); - if ( disttoenemy < 1 ) - { - return 1; - } - forward = anglesToForward( self.angles ); - val1 = ( forward[ 0 ] * vectoenemy[ 0 ] ) + ( forward[ 1 ] * vectoenemy[ 1 ] ); - val2 = ( ( forward[ 0 ] * vectoenemy[ 0 ] ) + ( forward[ 1 ] * vectoenemy[ 1 ] ) ) / disttoenemy; - return ( ( ( forward[ 0 ] * vectoenemy[ 0 ] ) + ( forward[ 1 ] * vectoenemy[ 1 ] ) ) / disttoenemy ) > tolerancecosangle; + vectoenemy = self.enemy.origin - self.origin; + disttoenemy = length( vectoenemy ); + + if ( disttoenemy < 1 ) + return 1; + + forward = anglestoforward( self.angles ); + val1 = forward[0] * vectoenemy[0] + forward[1] * vectoenemy[1]; + val2 = ( forward[0] * vectoenemy[0] + forward[1] * vectoenemy[1] ) / disttoenemy; + return ( forward[0] * vectoenemy[0] + forward[1] * vectoenemy[1] ) / disttoenemy > tolerancecosangle; } randomattackidle() { - if ( isfacingenemy( -0,5 ) ) - { - self set_orient_mode( "face current" ); - } - else - { - self set_orient_mode( "face enemy" ); - } - if ( should_growl() ) - { - debug_anim_print( "dog_stop::main() - Setting stop_attackidle_growl" ); - self setanimstate( "stop_attackidle_growl" ); - return; - } - idlechance = 33; - barkchance = 66; - if ( isDefined( self.mode ) ) - { - if ( self.mode == "growl" ) - { - idlechance = 15; - barkchance = 30; - } - else - { - if ( self.mode == "bark" ) - { - idlechance = 15; - barkchance = 85; - } - } - } - rand = randomint( 100 ); - if ( rand < idlechance ) - { - debug_anim_print( "dog_stop::main() - Setting stop_attackidle" ); - self setanimstate( "stop_attackidle" ); - } - else if ( rand < barkchance ) - { - debug_anim_print( "dog_stop::main() - Setting stop_attackidle_bark " ); - self setanimstate( "stop_attackidle_bark" ); - } - else - { - debug_anim_print( "dog_stop::main() - Setting stop_attackidle_growl " ); - self setanimstate( "stop_attackidle_growl" ); - } + if ( isfacingenemy( -0.5 ) ) + self set_orient_mode( "face current" ); + else + self set_orient_mode( "face enemy" ); + + if ( should_growl() ) + { + debug_anim_print( "dog_stop::main() - Setting stop_attackidle_growl" ); + self setanimstate( "stop_attackidle_growl" ); + return; + } + + idlechance = 33; + barkchance = 66; + + if ( isdefined( self.mode ) ) + { + if ( self.mode == "growl" ) + { + idlechance = 15; + barkchance = 30; + } + else if ( self.mode == "bark" ) + { + idlechance = 15; + barkchance = 85; + } + } + + rand = randomint( 100 ); + + if ( rand < idlechance ) + { + debug_anim_print( "dog_stop::main() - Setting stop_attackidle" ); + self setanimstate( "stop_attackidle" ); + } + else if ( rand < barkchance ) + { + debug_anim_print( "dog_stop::main() - Setting stop_attackidle_bark " ); + self setanimstate( "stop_attackidle_bark" ); + } + else + { + debug_anim_print( "dog_stop::main() - Setting stop_attackidle_growl " ); + self setanimstate( "stop_attackidle_growl" ); + } } shouldattackidle() { - if ( isDefined( self.enemy ) && isalive( self.enemy ) ) - { - return distancesquared( self.origin, self.enemy.origin ) < 1000000; - } + return isdefined( self.enemy ) && isalive( self.enemy ) && distancesquared( self.origin, self.enemy.origin ) < 1000000; } should_growl() { - if ( isDefined( self.script_growl ) ) - { - return 1; - } - if ( !isalive( self.enemy ) ) - { - return 1; - } - return !self cansee( self.enemy ); + if ( isdefined( self.script_growl ) ) + return 1; + + if ( !isalive( self.enemy ) ) + return 1; + + return !self cansee( self.enemy ); } lookattarget( lookposeset ) { - self endon( "killanimscript" ); - self endon( "stop tracking" ); - debug_anim_print( "dog_stop::lookAtTarget() - Starting look at " + lookposeset ); - self.rightaimlimit = 90; - self.leftaimlimit = -90; - self.upaimlimit = 45; - self.downaimlimit = -45; - self maps/mp/animscripts/shared::setanimaimweight( 1, 0,2 ); - self maps/mp/animscripts/shared::trackloop(); + self endon( "killanimscript" ); + self endon( "stop tracking" ); + debug_anim_print( "dog_stop::lookAtTarget() - Starting look at " + lookposeset ); + self.rightaimlimit = 90; + self.leftaimlimit = -90; + self.upaimlimit = 45; + self.downaimlimit = -45; + self maps\mp\animscripts\shared::setanimaimweight( 1, 0.2 ); + self maps\mp\animscripts\shared::trackloop(); } diff --git a/Multiplayer Core/common_mp/maps/mp/animscripts/dog_turn.gsc b/Multiplayer Core/common_mp/maps/mp/animscripts/dog_turn.gsc index 4d759cc..2c9f1a3 100644 --- a/Multiplayer Core/common_mp/maps/mp/animscripts/dog_turn.gsc +++ b/Multiplayer Core/common_mp/maps/mp/animscripts/dog_turn.gsc @@ -1,117 +1,123 @@ -#include maps/mp/animscripts/shared; -#include maps/mp/animscripts/utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\animscripts\utility; +#include maps\mp\animscripts\shared; main() { - self endon( "killanimscript" ); - debug_turn_print( "dog_turn::main()" ); - self setaimanimweights( 0, 0 ); - self.safetochangescript = 0; - deltayaw = self getdeltaturnyaw(); - if ( need_to_turn_around( deltayaw ) ) - { - turn_180( deltayaw ); - } - else - { - turn_90( deltayaw ); - } - move_out_of_turn(); - self.skipstartmove = 1; - self.safetochangescript = 1; + self endon( "killanimscript" ); + debug_turn_print( "dog_turn::main()" ); + self setaimanimweights( 0, 0 ); + self.safetochangescript = 0; + deltayaw = self getdeltaturnyaw(); + + if ( need_to_turn_around( deltayaw ) ) + turn_180( deltayaw ); + else + turn_90( deltayaw ); + + move_out_of_turn(); + self.skipstartmove = 1; + self.safetochangescript = 1; } need_to_turn_around( deltayaw ) { - angle = getDvarFloat( "dog_turn180_angle" ); - if ( deltayaw >= angle || deltayaw <= ( -1 * angle ) ) - { - debug_turn_print( "dog_turn::need_to_turn_around(): " + deltayaw + " YES" ); - return 1; - } - debug_turn_print( "dog_turn::need_to_turn_around(): " + deltayaw + " NO" ); - return 0; + angle = getdvarfloat( "dog_turn180_angle" ); + + if ( deltayaw >= angle || deltayaw <= -1 * angle ) + { + debug_turn_print( "dog_turn::need_to_turn_around(): " + deltayaw + " YES" ); + return true; + } + + debug_turn_print( "dog_turn::need_to_turn_around(): " + deltayaw + " NO" ); + return false; } do_turn_anim( stopped_anim, run_anim, wait_time, run_wait_time ) { - speed = length( self getvelocity() ); - do_anim = stopped_anim; - if ( level.dogrunturnspeed < speed ) - { - do_anim = run_anim; - wait_time = run_wait_time; - } - debug_turn_print( "dog_turn::do_turn_anim() - Setting " + do_anim ); - self setanimstate( do_anim ); - maps/mp/animscripts/shared::donotetracksfortime( run_wait_time, "done" ); - debug_turn_print( "dog_turn::do_turn_anim() - done with " + do_anim + " wait time " + run_wait_time ); + speed = length( self getvelocity() ); + do_anim = stopped_anim; + + if ( level.dogrunturnspeed < speed ) + { + do_anim = run_anim; + wait_time = run_wait_time; + } + + debug_turn_print( "dog_turn::do_turn_anim() - Setting " + do_anim ); + self setanimstate( do_anim ); + maps\mp\animscripts\shared::donotetracksfortime( run_wait_time, "done" ); + debug_turn_print( "dog_turn::do_turn_anim() - done with " + do_anim + " wait time " + run_wait_time ); } turn_left() { - self do_turn_anim( "move_turn_left", "move_run_turn_left", 0,5, 0,5 ); + self do_turn_anim( "move_turn_left", "move_run_turn_left", 0.5, 0.5 ); } turn_right() { - self do_turn_anim( "move_turn_right", "move_run_turn_right", 0,5, 0,5 ); + self do_turn_anim( "move_turn_right", "move_run_turn_right", 0.5, 0.5 ); } turn_180_left() { - self do_turn_anim( "move_turn_around_left", "move_run_turn_around_left", 0,5, 0,7 ); + self do_turn_anim( "move_turn_around_left", "move_run_turn_around_left", 0.5, 0.7 ); } turn_180_right() { - self do_turn_anim( "move_turn_around_right", "move_run_turn_around_right", 0,5, 0,7 ); + self do_turn_anim( "move_turn_around_right", "move_run_turn_around_right", 0.5, 0.7 ); } move_out_of_turn() { - if ( self.a.movement == "run" ) - { - debug_turn_print( "dog_turn::move_out_of_turn() - Setting move_run" ); - self setanimstate( "move_run" ); - maps/mp/animscripts/shared::donotetracksfortime( 0,1, "done" ); - debug_turn_print( "dog_turn::move_out_of_turn() - move_run wait 0.1 done " ); - } - else - { - debug_turn_print( "dog_turn::move_out_of_turn() - Setting move_start " ); - self setanimstate( "move_walk" ); - } + if ( self.a.movement == "run" ) + { + debug_turn_print( "dog_turn::move_out_of_turn() - Setting move_run" ); + self setanimstate( "move_run" ); + maps\mp\animscripts\shared::donotetracksfortime( 0.1, "done" ); + debug_turn_print( "dog_turn::move_out_of_turn() - move_run wait 0.1 done " ); + } + else + { + debug_turn_print( "dog_turn::move_out_of_turn() - Setting move_start " ); + self setanimstate( "move_walk" ); + } } turn_90( deltayaw ) { - self animmode( "zonly_physics", 0 ); - debug_turn_print( "dog_turn::turn_90() deltaYaw: " + deltayaw ); - if ( deltayaw > 0 ) - { - debug_turn_print( "dog_turn::turn_90() left", 1 ); - self turn_left(); - } - else - { - debug_turn_print( "dog_turn::turn_90() right", 1 ); - self turn_right(); - } + self animmode( "zonly_physics", 0 ); + debug_turn_print( "dog_turn::turn_90() deltaYaw: " + deltayaw ); + + if ( deltayaw > 0 ) + { + debug_turn_print( "dog_turn::turn_90() left", 1 ); + self turn_left(); + } + else + { + debug_turn_print( "dog_turn::turn_90() right", 1 ); + self turn_right(); + } } turn_180( deltayaw ) { - self animmode( "zonly_physics", 0 ); - debug_turn_print( "dog_turn::turn_180() deltaYaw: " + deltayaw ); - if ( deltayaw > 0 ) - { - debug_turn_print( "dog_turn::turn_180() left", 1 ); - self turn_180_left(); - } - else - { - debug_turn_print( "dog_turn::turn_180() right", 1 ); - self turn_180_right(); - } + self animmode( "zonly_physics", 0 ); + debug_turn_print( "dog_turn::turn_180() deltaYaw: " + deltayaw ); + + if ( deltayaw > 0 ) + { + debug_turn_print( "dog_turn::turn_180() left", 1 ); + self turn_180_left(); + } + else + { + debug_turn_print( "dog_turn::turn_180() right", 1 ); + self turn_180_right(); + } } diff --git a/Multiplayer Core/common_mp/maps/mp/animscripts/shared.gsc b/Multiplayer Core/common_mp/maps/mp/animscripts/shared.gsc index ee523c7..a5c4b3a 100644 --- a/Multiplayer Core/common_mp/maps/mp/animscripts/shared.gsc +++ b/Multiplayer Core/common_mp/maps/mp/animscripts/shared.gsc @@ -1,306 +1,287 @@ -#include maps/mp/_utility; -#include maps/mp/animscripts/utility; -#include common_scripts/utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include common_scripts\utility; +#include maps\mp\animscripts\utility; +#include maps\mp\_utility; handledogsoundnotetracks( note ) { - if ( note == "sound_dogstep_run_default" ) - { - return 1; - } - prefix = getsubstr( note, 0, 5 ); - if ( prefix != "sound" ) - { - return 0; - } - return 1; + if ( note == "sound_dogstep_run_default" ) + return true; + + prefix = getsubstr( note, 0, 5 ); + + if ( prefix != "sound" ) + return false; + + return true; } growling() { - return isDefined( self.script_growl ); + return isdefined( self.script_growl ); } handlenotetrack( note, flagname, customfunction, var1 ) { /# - if ( getDvarInt( #"6EBEB982" ) ) - { - println( "dog notetrack: " + flagname + " " + note + " " + getTime() ); + if ( getdvarint( _hash_6EBEB982 ) ) + println( "dog notetrack: " + flagname + " " + note + " " + gettime() ); #/ - } - if ( isai( self ) && self.type == "dog" ) - { - if ( handledogsoundnotetracks( note ) ) - { - return; - } - } - switch( note ) - { - case "end": - case "finish": - case "undefined": - return note; - default: - if ( isDefined( customfunction ) ) - { - if ( !isDefined( var1 ) ) - { - return [[ customfunction ]]( note ); - } - else - { - return [[ customfunction ]]( note, var1 ); - } - } - } - } + if ( isai( self ) && self.type == "dog" ) + { + if ( handledogsoundnotetracks( note ) ) + return; + } + + switch ( note ) + { + case "undefined": + case "finish": + case "end": + return note; + default: + if ( isdefined( customfunction ) ) + { + if ( !isdefined( var1 ) ) + return [[ customfunction ]]( note ); + else + return [[ customfunction ]]( note, var1 ); + } + + break; + } } donotetracks( flagname, customfunction, var1 ) { - for ( ;; ) - { - self waittill( flagname, note ); - if ( !isDefined( note ) ) - { - note = "undefined"; - } - val = self handlenotetrack( note, flagname, customfunction, var1 ); - if ( isDefined( val ) ) - { - return val; - } - } + for (;;) + { + self waittill( flagname, note ); + + if ( !isdefined( note ) ) + note = "undefined"; + + val = self handlenotetrack( note, flagname, customfunction, var1 ); + + if ( isdefined( val ) ) + return val; + } } donotetracksforeverproc( notetracksfunc, flagname, killstring, customfunction, var1 ) { - if ( isDefined( killstring ) ) - { - self endon( killstring ); - } - self endon( "killanimscript" ); - for ( ;; ) - { - time = getTime(); - returnednote = [[ notetracksfunc ]]( flagname, customfunction, var1 ); - timetaken = getTime() - time; - if ( timetaken < 0,05 ) - { - time = getTime(); - returnednote = [[ notetracksfunc ]]( flagname, customfunction, var1 ); - timetaken = getTime() - time; - if ( timetaken < 0,05 ) - { + if ( isdefined( killstring ) ) + self endon( killstring ); + + self endon( "killanimscript" ); + + for (;;) + { + time = gettime(); + returnednote = [[ notetracksfunc ]]( flagname, customfunction, var1 ); + timetaken = gettime() - time; + + if ( timetaken < 0.05 ) + { + time = gettime(); + returnednote = [[ notetracksfunc ]]( flagname, customfunction, var1 ); + timetaken = gettime() - time; + + if ( timetaken < 0.05 ) + { /# - println( getTime() + " mapsmpanimscriptsshared::DoNoteTracksForever is trying to cause an infinite loop on anim " + flagname + ", returned " + returnednote + "." ); + println( gettime() + " mapsmpanimscriptsshared::DoNoteTracksForever is trying to cause an infinite loop on anim " + flagname + ", returned " + returnednote + "." ); #/ - wait ( 0,05 - timetaken ); - } - } - } + wait( 0.05 - timetaken ); + } + } + } } donotetracksforever( flagname, killstring, customfunction, var1 ) { - donotetracksforeverproc( ::donotetracks, flagname, killstring, customfunction, var1 ); + donotetracksforeverproc( ::donotetracks, flagname, killstring, customfunction, var1 ); } donotetracksfortimeproc( donotetracksforeverfunc, time, flagname, customfunction, ent, var1 ) { - ent endon( "stop_notetracks" ); - [[ donotetracksforeverfunc ]]( flagname, undefined, customfunction, var1 ); + ent endon( "stop_notetracks" ); + [[ donotetracksforeverfunc ]]( flagname, undefined, customfunction, var1 ); } donotetracksfortime( time, flagname, customfunction, var1 ) { - ent = spawnstruct(); - ent thread donotetracksfortimeendnotify( time ); - donotetracksfortimeproc( ::donotetracksforever, time, flagname, customfunction, ent, var1 ); + ent = spawnstruct(); + ent thread donotetracksfortimeendnotify( time ); + donotetracksfortimeproc( ::donotetracksforever, time, flagname, customfunction, ent, var1 ); } donotetracksfortimeendnotify( time ) { - wait time; - self notify( "stop_notetracks" ); + wait( time ); + self notify( "stop_notetracks" ); } trackloop() { - players = get_players(); - deltachangeperframe = 5; - aimblendtime = 0,05; - prevyawdelta = 0; - prevpitchdelta = 0; - maxyawdeltachange = 5; - maxpitchdeltachange = 5; - pitchadd = 0; - yawadd = 0; - if ( self.type != "dog" || self.type == "zombie" && self.type == "zombie_dog" ) - { - domaxanglecheck = 0; - self.shootent = self.enemy; - } - else - { - domaxanglecheck = 1; - if ( self.a.script == "cover_crouch" && isDefined( self.a.covermode ) && self.a.covermode == "lean" ) - { - pitchadd = -1 * anim.covercrouchleanpitch; - } - if ( self.a.script != "cover_left" && self.a.script == "cover_right" && isDefined( self.a.cornermode ) && self.a.cornermode == "lean" ) - { - yawadd = self.covernode.angles[ 1 ] - self.angles[ 1 ]; - } - } - yawdelta = 0; - pitchdelta = 0; - firstframe = 1; - for ( ;; ) - { - incranimaimweight(); - selfshootatpos = ( self.origin[ 0 ], self.origin[ 1 ], self geteye()[ 2 ] ); - shootpos = undefined; - if ( isDefined( self.enemy ) ) - { - shootpos = self.enemy getshootatpos(); - } - if ( !isDefined( shootpos ) ) - { - yawdelta = 0; - pitchdelta = 0; - } - else - { - vectortoshootpos = shootpos - selfshootatpos; - anglestoshootpos = vectorToAngle( vectortoshootpos ); - pitchdelta = 360 - anglestoshootpos[ 0 ]; - pitchdelta = angleClamp180( pitchdelta + pitchadd ); - yawdelta = self.angles[ 1 ] - anglestoshootpos[ 1 ]; - yawdelta = angleClamp180( yawdelta + yawadd ); - } - if ( domaxanglecheck || abs( yawdelta ) > 60 && abs( pitchdelta ) > 60 ) - { - yawdelta = 0; - pitchdelta = 0; - } - else - { - if ( yawdelta > self.rightaimlimit ) - { - yawdelta = self.rightaimlimit; - } - else - { - if ( yawdelta < self.leftaimlimit ) - { - yawdelta = self.leftaimlimit; - } - } - if ( pitchdelta > self.upaimlimit ) - { - pitchdelta = self.upaimlimit; - break; - } - else - { - if ( pitchdelta < self.downaimlimit ) - { - pitchdelta = self.downaimlimit; - } - } - } - if ( firstframe ) - { - firstframe = 0; - } - else - { - yawdeltachange = yawdelta - prevyawdelta; - if ( abs( yawdeltachange ) > maxyawdeltachange ) - { - yawdelta = prevyawdelta + ( maxyawdeltachange * sign( yawdeltachange ) ); - } - pitchdeltachange = pitchdelta - prevpitchdelta; - if ( abs( pitchdeltachange ) > maxpitchdeltachange ) - { - pitchdelta = prevpitchdelta + ( maxpitchdeltachange * sign( pitchdeltachange ) ); - } - } - prevyawdelta = yawdelta; - prevpitchdelta = pitchdelta; - updown = 0; - leftright = 0; - if ( yawdelta > 0 ) - { + players = get_players(); + deltachangeperframe = 5; + aimblendtime = 0.05; + prevyawdelta = 0; + prevpitchdelta = 0; + maxyawdeltachange = 5; + maxpitchdeltachange = 5; + pitchadd = 0; + yawadd = 0; + + if ( self.type == "dog" || self.type == "zombie" || self.type == "zombie_dog" ) + { + domaxanglecheck = 0; + self.shootent = self.enemy; + } + else + { + domaxanglecheck = 1; + + if ( self.a.script == "cover_crouch" && isdefined( self.a.covermode ) && self.a.covermode == "lean" ) + pitchadd = -1 * anim.covercrouchleanpitch; + + if ( ( self.a.script == "cover_left" || self.a.script == "cover_right" ) && isdefined( self.a.cornermode ) && self.a.cornermode == "lean" ) + yawadd = self.covernode.angles[1] - self.angles[1]; + } + + yawdelta = 0; + pitchdelta = 0; + firstframe = 1; + + for (;;) + { + incranimaimweight(); + selfshootatpos = ( self.origin[0], self.origin[1], self geteye()[2] ); + shootpos = undefined; + + if ( isdefined( self.enemy ) ) + shootpos = self.enemy getshootatpos(); + + if ( !isdefined( shootpos ) ) + { + yawdelta = 0; + pitchdelta = 0; + } + else + { + vectortoshootpos = shootpos - selfshootatpos; + anglestoshootpos = vectortoangles( vectortoshootpos ); + pitchdelta = 360 - anglestoshootpos[0]; + pitchdelta = angleclamp180( pitchdelta + pitchadd ); + yawdelta = self.angles[1] - anglestoshootpos[1]; + yawdelta = angleclamp180( yawdelta + yawadd ); + } + + if ( domaxanglecheck && ( abs( yawdelta ) > 60 || abs( pitchdelta ) > 60 ) ) + { + yawdelta = 0; + pitchdelta = 0; + } + else + { + if ( yawdelta > self.rightaimlimit ) + yawdelta = self.rightaimlimit; + else if ( yawdelta < self.leftaimlimit ) + yawdelta = self.leftaimlimit; + + if ( pitchdelta > self.upaimlimit ) + pitchdelta = self.upaimlimit; + else if ( pitchdelta < self.downaimlimit ) + pitchdelta = self.downaimlimit; + } + + if ( firstframe ) + firstframe = 0; + else + { + yawdeltachange = yawdelta - prevyawdelta; + + if ( abs( yawdeltachange ) > maxyawdeltachange ) + yawdelta = prevyawdelta + maxyawdeltachange * sign( yawdeltachange ); + + pitchdeltachange = pitchdelta - prevpitchdelta; + + if ( abs( pitchdeltachange ) > maxpitchdeltachange ) + pitchdelta = prevpitchdelta + maxpitchdeltachange * sign( pitchdeltachange ); + } + + prevyawdelta = yawdelta; + prevpitchdelta = pitchdelta; + updown = 0; + leftright = 0; + + if ( yawdelta > 0 ) + { /# - assert( yawdelta <= self.rightaimlimit ); + assert( yawdelta <= self.rightaimlimit ); #/ - weight = ( yawdelta / self.rightaimlimit ) * self.a.aimweight; - leftright = weight; - } - else - { - if ( yawdelta < 0 ) - { + weight = yawdelta / self.rightaimlimit * self.a.aimweight; + leftright = weight; + } + else if ( yawdelta < 0 ) + { /# - assert( yawdelta >= self.leftaimlimit ); + assert( yawdelta >= self.leftaimlimit ); #/ - weight = ( yawdelta / self.leftaimlimit ) * self.a.aimweight; - leftright = -1 * weight; - } - } - if ( pitchdelta > 0 ) - { + weight = yawdelta / self.leftaimlimit * self.a.aimweight; + leftright = -1 * weight; + } + + if ( pitchdelta > 0 ) + { /# - assert( pitchdelta <= self.upaimlimit ); + assert( pitchdelta <= self.upaimlimit ); #/ - weight = ( pitchdelta / self.upaimlimit ) * self.a.aimweight; - updown = weight; - } - else - { - if ( pitchdelta < 0 ) - { + weight = pitchdelta / self.upaimlimit * self.a.aimweight; + updown = weight; + } + else if ( pitchdelta < 0 ) + { /# - assert( pitchdelta >= self.downaimlimit ); + assert( pitchdelta >= self.downaimlimit ); #/ - weight = ( pitchdelta / self.downaimlimit ) * self.a.aimweight; - updown = -1 * weight; - } - } - self setaimanimweights( updown, leftright ); - wait 0,05; - } + weight = pitchdelta / self.downaimlimit * self.a.aimweight; + updown = -1 * weight; + } + + self setaimanimweights( updown, leftright ); + wait 0.05; + } } setanimaimweight( goalweight, goaltime ) { - if ( !isDefined( goaltime ) || goaltime <= 0 ) - { - self.a.aimweight = goalweight; - self.a.aimweight_start = goalweight; - self.a.aimweight_end = goalweight; - self.a.aimweight_transframes = 0; - } - else - { - self.a.aimweight = goalweight; - self.a.aimweight_start = self.a.aimweight; - self.a.aimweight_end = goalweight; - self.a.aimweight_transframes = int( goaltime * 20 ); - } - self.a.aimweight_t = 0; + if ( !isdefined( goaltime ) || goaltime <= 0 ) + { + self.a.aimweight = goalweight; + self.a.aimweight_start = goalweight; + self.a.aimweight_end = goalweight; + self.a.aimweight_transframes = 0; + } + else + { + self.a.aimweight = goalweight; + self.a.aimweight_start = self.a.aimweight; + self.a.aimweight_end = goalweight; + self.a.aimweight_transframes = int( goaltime * 20 ); + } + + self.a.aimweight_t = 0; } incranimaimweight() { - if ( self.a.aimweight_t < self.a.aimweight_transframes ) - { - self.a.aimweight_t++; - t = ( 1 * self.a.aimweight_t ) / self.a.aimweight_transframes; - self.a.aimweight = ( self.a.aimweight_start * ( 1 - t ) ) + ( self.a.aimweight_end * t ); - } + if ( self.a.aimweight_t < self.a.aimweight_transframes ) + { + self.a.aimweight_t++; + t = 1.0 * self.a.aimweight_t / self.a.aimweight_transframes; + self.a.aimweight = self.a.aimweight_start * ( 1 - t ) + self.a.aimweight_end * t; + } } diff --git a/Multiplayer Core/common_mp/maps/mp/animscripts/traverse/jump_down_40.gsc b/Multiplayer Core/common_mp/maps/mp/animscripts/traverse/jump_down_40.gsc index 073ee80..9b98856 100644 --- a/Multiplayer Core/common_mp/maps/mp/animscripts/traverse/jump_down_40.gsc +++ b/Multiplayer Core/common_mp/maps/mp/animscripts/traverse/jump_down_40.gsc @@ -1,9 +1,9 @@ -#include maps/mp/animscripts/traverse/shared; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\animscripts\traverse\shared; main() { - if ( self.type == "dog" ) - { - dog_jump_down( 40, 3 ); - } + if ( self.type == "dog" ) + dog_jump_down( 40, 3 ); } diff --git a/Multiplayer Core/common_mp/maps/mp/animscripts/traverse/jump_down_56.gsc b/Multiplayer Core/common_mp/maps/mp/animscripts/traverse/jump_down_56.gsc index f9821b7..c97ff08 100644 --- a/Multiplayer Core/common_mp/maps/mp/animscripts/traverse/jump_down_56.gsc +++ b/Multiplayer Core/common_mp/maps/mp/animscripts/traverse/jump_down_56.gsc @@ -1,9 +1,9 @@ -#include maps/mp/animscripts/traverse/shared; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\animscripts\traverse\shared; main() { - if ( self.type == "dog" ) - { - dog_jump_down( 56, 7 ); - } + if ( self.type == "dog" ) + dog_jump_down( 56, 7 ); } diff --git a/Multiplayer Core/common_mp/maps/mp/animscripts/traverse/jump_down_96.gsc b/Multiplayer Core/common_mp/maps/mp/animscripts/traverse/jump_down_96.gsc index bfdf70d..895eb96 100644 --- a/Multiplayer Core/common_mp/maps/mp/animscripts/traverse/jump_down_96.gsc +++ b/Multiplayer Core/common_mp/maps/mp/animscripts/traverse/jump_down_96.gsc @@ -1,9 +1,9 @@ -#include maps/mp/animscripts/traverse/shared; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\animscripts\traverse\shared; main() { - if ( self.type == "dog" ) - { - dog_jump_down_far( 96, 11, 0,65 ); - } + if ( self.type == "dog" ) + dog_jump_down_far( 96, 11, 0.65 ); } diff --git a/Multiplayer Core/common_mp/maps/mp/animscripts/traverse/mantle_on_40.gsc b/Multiplayer Core/common_mp/maps/mp/animscripts/traverse/mantle_on_40.gsc index 29e90a5..b7a8592 100644 --- a/Multiplayer Core/common_mp/maps/mp/animscripts/traverse/mantle_on_40.gsc +++ b/Multiplayer Core/common_mp/maps/mp/animscripts/traverse/mantle_on_40.gsc @@ -1,9 +1,9 @@ -#include maps/mp/animscripts/traverse/shared; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\animscripts\traverse\shared; main() { - if ( self.type == "dog" ) - { - dog_jump_up( 40, 3 ); - } + if ( self.type == "dog" ) + dog_jump_up( 40, 3 ); } diff --git a/Multiplayer Core/common_mp/maps/mp/animscripts/traverse/mantle_on_56.gsc b/Multiplayer Core/common_mp/maps/mp/animscripts/traverse/mantle_on_56.gsc index 5010ac0..6cdf0e8 100644 --- a/Multiplayer Core/common_mp/maps/mp/animscripts/traverse/mantle_on_56.gsc +++ b/Multiplayer Core/common_mp/maps/mp/animscripts/traverse/mantle_on_56.gsc @@ -1,9 +1,9 @@ -#include maps/mp/animscripts/traverse/shared; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\animscripts\traverse\shared; main() { - if ( self.type == "dog" ) - { - dog_jump_up( 56, 5 ); - } + if ( self.type == "dog" ) + dog_jump_up( 56.0, 5 ); } diff --git a/Multiplayer Core/common_mp/maps/mp/animscripts/traverse/mantle_on_80.gsc b/Multiplayer Core/common_mp/maps/mp/animscripts/traverse/mantle_on_80.gsc index feffef2..a188d73 100644 --- a/Multiplayer Core/common_mp/maps/mp/animscripts/traverse/mantle_on_80.gsc +++ b/Multiplayer Core/common_mp/maps/mp/animscripts/traverse/mantle_on_80.gsc @@ -1,9 +1,9 @@ -#include maps/mp/animscripts/traverse/shared; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\animscripts\traverse\shared; main() { - if ( self.type == "dog" ) - { - dog_jump_up_high( 80, 8 ); - } + if ( self.type == "dog" ) + dog_jump_up_high( 80.0, 8 ); } diff --git a/Multiplayer Core/common_mp/maps/mp/animscripts/traverse/mantle_on_96.gsc b/Multiplayer Core/common_mp/maps/mp/animscripts/traverse/mantle_on_96.gsc index 5bb110a..6639b89 100644 --- a/Multiplayer Core/common_mp/maps/mp/animscripts/traverse/mantle_on_96.gsc +++ b/Multiplayer Core/common_mp/maps/mp/animscripts/traverse/mantle_on_96.gsc @@ -1,9 +1,9 @@ -#include maps/mp/animscripts/traverse/shared; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\animscripts\traverse\shared; main() { - if ( self.type == "dog" ) - { - dog_jump_up_high( 96, 9 ); - } + if ( self.type == "dog" ) + dog_jump_up_high( 96.0, 9 ); } diff --git a/Multiplayer Core/common_mp/maps/mp/animscripts/traverse/mantle_over_40.gsc b/Multiplayer Core/common_mp/maps/mp/animscripts/traverse/mantle_over_40.gsc index 018da80..02c9133 100644 --- a/Multiplayer Core/common_mp/maps/mp/animscripts/traverse/mantle_over_40.gsc +++ b/Multiplayer Core/common_mp/maps/mp/animscripts/traverse/mantle_over_40.gsc @@ -1,9 +1,9 @@ -#include maps/mp/animscripts/traverse/shared; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\animscripts\traverse\shared; main() { - if ( self.type == "dog" ) - { - dog_wall_and_window_hop( "traverse_window", 40 ); - } + if ( self.type == "dog" ) + dog_wall_and_window_hop( "traverse_window", 40 ); } diff --git a/Multiplayer Core/common_mp/maps/mp/animscripts/traverse/mantle_window_36.gsc b/Multiplayer Core/common_mp/maps/mp/animscripts/traverse/mantle_window_36.gsc index fdb1825..b569c32 100644 --- a/Multiplayer Core/common_mp/maps/mp/animscripts/traverse/mantle_window_36.gsc +++ b/Multiplayer Core/common_mp/maps/mp/animscripts/traverse/mantle_window_36.gsc @@ -1,9 +1,9 @@ -#include maps/mp/animscripts/traverse/shared; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\animscripts\traverse\shared; main() { - if ( self.type == "dog" ) - { - dog_wall_and_window_hop( "traverse_window", 36 ); - } + if ( self.type == "dog" ) + dog_wall_and_window_hop( "traverse_window", 36 ); } diff --git a/Multiplayer Core/common_mp/maps/mp/animscripts/traverse/shared.gsc b/Multiplayer Core/common_mp/maps/mp/animscripts/traverse/shared.gsc index cbd7fe5..279b040 100644 --- a/Multiplayer Core/common_mp/maps/mp/animscripts/traverse/shared.gsc +++ b/Multiplayer Core/common_mp/maps/mp/animscripts/traverse/shared.gsc @@ -1,227 +1,207 @@ -#include maps/mp/animscripts/shared; -#include common_scripts/utility; -#include maps/mp/_utility; -#include maps/mp/animscripts/utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\animscripts\utility; +#include maps\mp\_utility; +#include common_scripts\utility; +#include maps\mp\animscripts\shared; init_traverse() { - point = getent( self.target, "targetname" ); - if ( isDefined( point ) ) - { - self.traverse_height = point.origin[ 2 ]; - point delete(); - } - else - { - point = getstruct( self.target, "targetname" ); - if ( isDefined( point ) ) - { - self.traverse_height = point.origin[ 2 ]; - } - } + point = getent( self.target, "targetname" ); + + if ( isdefined( point ) ) + { + self.traverse_height = point.origin[2]; + point delete(); + } + else + { + point = getstruct( self.target, "targetname" ); + + if ( isdefined( point ) ) + self.traverse_height = point.origin[2]; + } } teleportthread( verticaloffset ) { - self endon( "killanimscript" ); - self notify( "endTeleportThread" ); - self endon( "endTeleportThread" ); - reps = 5; - offset = ( 0, 0, verticaloffset / reps ); - i = 0; - while ( i < reps ) - { - self teleport( self.origin + offset ); - wait 0,05; - i++; - } + self endon( "killanimscript" ); + self notify( "endTeleportThread" ); + self endon( "endTeleportThread" ); + reps = 5; + offset = ( 0, 0, verticaloffset / reps ); + + for ( i = 0; i < reps; i++ ) + { + self teleport( self.origin + offset ); + wait 0.05; + } } teleportthreadex( verticaloffset, delay, frames ) { - self endon( "killanimscript" ); - self notify( "endTeleportThread" ); - self endon( "endTeleportThread" ); - if ( verticaloffset == 0 ) - { - return; - } - wait delay; - amount = verticaloffset / frames; - if ( amount > 10 ) - { - amount = 10; - } - else - { - if ( amount < -10 ) - { - amount = -10; - } - } - offset = ( 0, 0, amount ); - i = 0; - while ( i < frames ) - { - self teleport( self.origin + offset ); - wait 0,05; - i++; - } + self endon( "killanimscript" ); + self notify( "endTeleportThread" ); + self endon( "endTeleportThread" ); + + if ( verticaloffset == 0 ) + return; + + wait( delay ); + amount = verticaloffset / frames; + + if ( amount > 10.0 ) + amount = 10.0; + else if ( amount < -10.0 ) + amount = -10.0; + + offset = ( 0, 0, amount ); + + for ( i = 0; i < frames; i++ ) + { + self teleport( self.origin + offset ); + wait 0.05; + } } dog_wall_and_window_hop( traversename, height ) { - self endon( "killanimscript" ); - self traversemode( "nogravity" ); - self traversemode( "noclip" ); - startnode = self getnegotiationstartnode(); + self endon( "killanimscript" ); + self traversemode( "nogravity" ); + self traversemode( "noclip" ); + startnode = self getnegotiationstartnode(); /# - assert( isDefined( startnode ) ); + assert( isdefined( startnode ) ); #/ - self orientmode( "face angle", startnode.angles[ 1 ] ); - if ( isDefined( startnode.traverse_height ) ) - { - realheight = startnode.traverse_height - startnode.origin[ 2 ]; - self thread teleportthread( realheight - height ); - } - else - { - if ( height != 36 ) - { - self thread teleportthreadex( height - 36, 0,2, 7 ); - } - } - debug_anim_print( "traverse::dog_wall_and_window_hop() - Setting " + traversename ); - self setanimstate( traversename ); - maps/mp/animscripts/shared::donotetracksfortime( 1, "done" ); - debug_anim_print( "traverse::dog_wall_and_window_hop() - " + traversename ); - self.traversecomplete = 1; + self orientmode( "face angle", startnode.angles[1] ); + + if ( isdefined( startnode.traverse_height ) ) + { + realheight = startnode.traverse_height - startnode.origin[2]; + self thread teleportthread( realheight - height ); + } + else if ( height != 36.0 ) + self thread teleportthreadex( height - 36.0, 0.2, 7 ); + + debug_anim_print( "traverse::dog_wall_and_window_hop() - Setting " + traversename ); + self setanimstate( traversename ); + maps\mp\animscripts\shared::donotetracksfortime( 1.0, "done" ); + debug_anim_print( "traverse::dog_wall_and_window_hop() - " + traversename ); + self.traversecomplete = 1; } dog_jump_down( height, frames, time ) { - self endon( "killanimscript" ); - self traversemode( "noclip" ); - if ( !isDefined( time ) ) - { - time = 0,3; - } - startnode = self getnegotiationstartnode(); + self endon( "killanimscript" ); + self traversemode( "noclip" ); + + if ( !isdefined( time ) ) + time = 0.3; + + startnode = self getnegotiationstartnode(); /# - assert( isDefined( startnode ) ); + assert( isdefined( startnode ) ); #/ - self orientmode( "face angle", startnode.angles[ 1 ] ); - if ( isDefined( startnode.traverse_height ) ) - { - realheight = startnode.traverse_height - startnode.origin[ 2 ]; - self thread teleportthread( realheight - height ); - } - else - { - if ( height != 40 ) - { - self thread teleportthreadex( height - 40, 0,1, frames ); - } - } - debug_anim_print( "traverse::dog_jump_down() - Setting traverse_jump_down_40" ); - self setanimstate( "traverse_jump_down_40" ); - maps/mp/animscripts/shared::donotetracksfortime( time, "done" ); - debug_anim_print( "traverse::dog_jump_down() - traverse_jump_down_40 " ); - self traversemode( "gravity" ); - self.traversecomplete = 1; + self orientmode( "face angle", startnode.angles[1] ); + + if ( isdefined( startnode.traverse_height ) ) + { + realheight = startnode.traverse_height - startnode.origin[2]; + self thread teleportthread( realheight - height ); + } + else if ( height != 40.0 ) + self thread teleportthreadex( height - 40.0, 0.1, frames ); + + debug_anim_print( "traverse::dog_jump_down() - Setting traverse_jump_down_40" ); + self setanimstate( "traverse_jump_down_40" ); + maps\mp\animscripts\shared::donotetracksfortime( time, "done" ); + debug_anim_print( "traverse::dog_jump_down() - traverse_jump_down_40 " ); + self traversemode( "gravity" ); + self.traversecomplete = 1; } dog_jump_down_far( height, frames, time ) { - self endon( "killanimscript" ); - self traversemode( "noclip" ); - if ( !isDefined( time ) ) - { - time = 0,3; - } - startnode = self getnegotiationstartnode(); + self endon( "killanimscript" ); + self traversemode( "noclip" ); + + if ( !isdefined( time ) ) + time = 0.3; + + startnode = self getnegotiationstartnode(); /# - assert( isDefined( startnode ) ); + assert( isdefined( startnode ) ); #/ - self orientmode( "face angle", startnode.angles[ 1 ] ); - if ( isDefined( startnode.traverse_height ) ) - { - realheight = startnode.traverse_height - startnode.origin[ 2 ]; - self thread teleportthread( realheight - height ); - } - else - { - if ( height != 80 ) - { - self thread teleportthreadex( 80 - height, 0,1, frames ); - } - } - debug_anim_print( "traverse::dog_jump_down() - Setting traverse_jump_down_80" ); - self setanimstate( "traverse_jump_down_80" ); - maps/mp/animscripts/shared::donotetracksfortime( time, "done" ); - debug_anim_print( "traverse::dog_jump_down() - traverse_jump_down_80 " ); - self traversemode( "gravity" ); - self.traversecomplete = 1; + self orientmode( "face angle", startnode.angles[1] ); + + if ( isdefined( startnode.traverse_height ) ) + { + realheight = startnode.traverse_height - startnode.origin[2]; + self thread teleportthread( realheight - height ); + } + else if ( height != 80.0 ) + self thread teleportthreadex( 80.0 - height, 0.1, frames ); + + debug_anim_print( "traverse::dog_jump_down() - Setting traverse_jump_down_80" ); + self setanimstate( "traverse_jump_down_80" ); + maps\mp\animscripts\shared::donotetracksfortime( time, "done" ); + debug_anim_print( "traverse::dog_jump_down() - traverse_jump_down_80 " ); + self traversemode( "gravity" ); + self.traversecomplete = 1; } dog_jump_up( height, frames ) { - self endon( "killanimscript" ); - self traversemode( "noclip" ); - startnode = self getnegotiationstartnode(); + self endon( "killanimscript" ); + self traversemode( "noclip" ); + startnode = self getnegotiationstartnode(); /# - assert( isDefined( startnode ) ); + assert( isdefined( startnode ) ); #/ - self orientmode( "face angle", startnode.angles[ 1 ] ); - if ( isDefined( startnode.traverse_height ) ) - { - realheight = startnode.traverse_height - startnode.origin[ 2 ]; - self thread teleportthread( realheight - height ); - } - else - { - if ( height != 40 ) - { - self thread teleportthreadex( height - 40, 0,2, frames ); - } - } - debug_anim_print( "traverse::dog_jump_up() - Setting traverse_jump_up_40" ); - self setanimstate( "traverse_jump_up_40" ); - maps/mp/animscripts/shared::donotetracksfortime( 0,5, "done" ); - debug_anim_print( "traverse::dog_jump_up() - traverse_jump_up_40 " ); - self traversemode( "gravity" ); - self.traversecomplete = 1; + self orientmode( "face angle", startnode.angles[1] ); + + if ( isdefined( startnode.traverse_height ) ) + { + realheight = startnode.traverse_height - startnode.origin[2]; + self thread teleportthread( realheight - height ); + } + else if ( height != 40.0 ) + self thread teleportthreadex( height - 40.0, 0.2, frames ); + + debug_anim_print( "traverse::dog_jump_up() - Setting traverse_jump_up_40" ); + self setanimstate( "traverse_jump_up_40" ); + maps\mp\animscripts\shared::donotetracksfortime( 0.5, "done" ); + debug_anim_print( "traverse::dog_jump_up() - traverse_jump_up_40 " ); + self traversemode( "gravity" ); + self.traversecomplete = 1; } dog_jump_up_high( height, frames ) { /# - assert( self.type == "dog", "Only dogs can do this traverse currently." ); + assert( self.type == "dog", "Only dogs can do this traverse currently." ); #/ - self endon( "killanimscript" ); - self traversemode( "nogravity" ); - self traversemode( "noclip" ); - startnode = self getnegotiationstartnode(); + self endon( "killanimscript" ); + self traversemode( "nogravity" ); + self traversemode( "noclip" ); + startnode = self getnegotiationstartnode(); /# - assert( isDefined( startnode ) ); + assert( isdefined( startnode ) ); #/ - self orientmode( "face angle", startnode.angles[ 1 ] ); - if ( isDefined( startnode.traverse_height ) ) - { - realheight = startnode.traverse_height - startnode.origin[ 2 ]; - self thread teleportthreadex( height - 80, 0,2, frames ); - } - else - { - if ( height != 80 ) - { - self thread teleportthreadex( height - 80, 0,2, frames ); - } - } - debug_anim_print( "traverse::dog_jump_up_80() - Setting traverse_jump_up_80" ); - self setanimstate( "traverse_jump_up_80" ); - maps/mp/animscripts/shared::donotetracksfortime( 0,6, "done" ); - debug_anim_print( "traverse::dog_jump_up_80() - traverse_jump_up_80 " ); - self traversemode( "gravity" ); - self.traversecomplete = 1; + self orientmode( "face angle", startnode.angles[1] ); + + if ( isdefined( startnode.traverse_height ) ) + { + realheight = startnode.traverse_height - startnode.origin[2]; + self thread teleportthreadex( height - 80, 0.2, frames ); + } + else if ( height != 80.0 ) + self thread teleportthreadex( height - 80.0, 0.2, frames ); + + debug_anim_print( "traverse::dog_jump_up_80() - Setting traverse_jump_up_80" ); + self setanimstate( "traverse_jump_up_80" ); + maps\mp\animscripts\shared::donotetracksfortime( 0.6, "done" ); + debug_anim_print( "traverse::dog_jump_up_80() - traverse_jump_up_80 " ); + self traversemode( "gravity" ); + self.traversecomplete = 1; } diff --git a/Multiplayer Core/common_mp/maps/mp/animscripts/traverse/through_hole_42.gsc b/Multiplayer Core/common_mp/maps/mp/animscripts/traverse/through_hole_42.gsc index 85d77b8..3877e6f 100644 --- a/Multiplayer Core/common_mp/maps/mp/animscripts/traverse/through_hole_42.gsc +++ b/Multiplayer Core/common_mp/maps/mp/animscripts/traverse/through_hole_42.gsc @@ -1,25 +1,29 @@ -#include maps/mp/animscripts/shared; -#include maps/mp/animscripts/utility; -#include maps/mp/animscripts/traverse/shared; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\animscripts\traverse\shared; +#include maps\mp\animscripts\utility; +#include maps\mp\animscripts\shared; main() { - self endon( "killanimscript" ); - self traversemode( "nogravity" ); - self traversemode( "noclip" ); - startnode = self getnegotiationstartnode(); + self endon( "killanimscript" ); + self traversemode( "nogravity" ); + self traversemode( "noclip" ); + startnode = self getnegotiationstartnode(); /# - assert( isDefined( startnode ) ); + assert( isdefined( startnode ) ); #/ - self orientmode( "face angle", startnode.angles[ 1 ] ); - if ( isDefined( startnode.traverse_height ) ) - { - realheight = startnode.traverse_height - startnode.origin[ 2 ]; - self thread teleportthread( realheight ); - } - debug_anim_print( "traverse::through_hole()" ); - self setanimstate( "traverse_through_hole_42" ); - maps/mp/animscripts/shared::donotetracksfortime( 1, "done" ); - debug_anim_print( "traverse::through_hole()" ); - self.traversecomplete = 1; + self orientmode( "face angle", startnode.angles[1] ); + + if ( isdefined( startnode.traverse_height ) ) + { + realheight = startnode.traverse_height - startnode.origin[2]; + self thread teleportthread( realheight ); + } + + debug_anim_print( "traverse::through_hole()" ); + self setanimstate( "traverse_through_hole_42" ); + maps\mp\animscripts\shared::donotetracksfortime( 1.0, "done" ); + debug_anim_print( "traverse::through_hole()" ); + self.traversecomplete = 1; } diff --git a/Multiplayer Core/common_mp/maps/mp/animscripts/utility.gsc b/Multiplayer Core/common_mp/maps/mp/animscripts/utility.gsc index 6b325aa..66154d0 100644 --- a/Multiplayer Core/common_mp/maps/mp/animscripts/utility.gsc +++ b/Multiplayer Core/common_mp/maps/mp/animscripts/utility.gsc @@ -1,166 +1,138 @@ +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool anim_get_dvar_int( dvar, def ) { - return int( anim_get_dvar( dvar, def ) ); + return int( anim_get_dvar( dvar, def ) ); } anim_get_dvar( dvar, def ) { - if ( getDvar( dvar ) != "" ) - { - return getDvarFloat( dvar ); - } - else - { - setdvar( dvar, def ); - return def; - } + if ( getdvar( dvar ) != "" ) + return getdvarfloat( dvar ); + else + { + setdvar( dvar, def ); + return def; + } } set_orient_mode( mode, val1 ) { /# - if ( level.dog_debug_orient == self getentnum() ) - { - if ( isDefined( val1 ) ) - { - println( "DOG: Setting orient mode: " + mode + " " + val1 + " " + getTime() ); - } - else - { - println( "DOG: Setting orient mode: " + mode + " " + getTime() ); + if ( level.dog_debug_orient == self getentnum() ) + { + if ( isdefined( val1 ) ) + println( "DOG: Setting orient mode: " + mode + " " + val1 + " " + gettime() ); + else + println( "DOG: Setting orient mode: " + mode + " " + gettime() ); + } #/ - } - } - if ( isDefined( val1 ) ) - { - self orientmode( mode, val1 ); - } - else - { - self orientmode( mode ); - } + if ( isdefined( val1 ) ) + self orientmode( mode, val1 ); + else + self orientmode( mode ); } debug_anim_print( text ) { /# - if ( level.dog_debug_anims ) - { - println( ( text + " " ) + getTime() ); - } - if ( level.dog_debug_anims_ent == self getentnum() ) - { - println( ( text + " " ) + getTime() ); + if ( level.dog_debug_anims ) + println( text + " " + gettime() ); + + if ( level.dog_debug_anims_ent == self getentnum() ) + println( text + " " + gettime() ); #/ - } } debug_turn_print( text, line ) { /# - if ( level.dog_debug_turns == self getentnum() ) - { - duration = 200; - currentyawcolor = ( 1, 0, 1 ); - lookaheadyawcolor = ( 1, 0, 1 ); - desiredyawcolor = ( 1, 0, 1 ); - currentyaw = angleClamp180( self.angles[ 1 ] ); - desiredyaw = angleClamp180( self.desiredangle ); - lookaheaddir = self.lookaheaddir; - lookaheadangles = vectorToAngle( lookaheaddir ); - lookaheadyaw = angleClamp180( lookaheadangles[ 1 ] ); - println( ( text + " " ) + getTime() + " cur: " + currentyaw + " look: " + lookaheadyaw + " desired: " + desiredyaw ); + if ( level.dog_debug_turns == self getentnum() ) + { + duration = 200; + currentyawcolor = ( 1, 1, 1 ); + lookaheadyawcolor = ( 1, 0, 0 ); + desiredyawcolor = ( 1, 1, 0 ); + currentyaw = angleclamp180( self.angles[1] ); + desiredyaw = angleclamp180( self.desiredangle ); + lookaheaddir = self.lookaheaddir; + lookaheadangles = vectortoangles( lookaheaddir ); + lookaheadyaw = angleclamp180( lookaheadangles[1] ); + println( text + " " + gettime() + " cur: " + currentyaw + " look: " + lookaheadyaw + " desired: " + desiredyaw ); + } #/ - } } debug_allow_movement() { /# - return anim_get_dvar_int( "debug_dog_allow_movement", "1" ); + return anim_get_dvar_int( "debug_dog_allow_movement", "1" ); #/ - return 1; + return 1; } debug_allow_combat() { /# - return anim_get_dvar_int( "debug_dog_allow_combat", "1" ); + return anim_get_dvar_int( "debug_dog_allow_combat", "1" ); #/ - return 1; + return 1; } current_yaw_line_debug( duration ) { /# - currentyawcolor = []; - currentyawcolor[ 0 ] = ( 1, 0, 1 ); - currentyawcolor[ 1 ] = ( 1, 0, 1 ); - current_color_index = 0; - start_time = getTime(); - if ( !isDefined( level.lastdebugheight ) ) - { - level.lastdebugheight = 15; - } - while ( ( getTime() - start_time ) < 1000 ) - { - pos1 = ( self.origin[ 0 ], self.origin[ 1 ], self.origin[ 2 ] + level.lastdebugheight ); - pos2 = pos1 + vectorScale( anglesToForward( self.angles ), ( current_color_index + 1 ) * 10 ); - line( pos1, pos2, currentyawcolor[ current_color_index ], 0,3, 1, duration ); - current_color_index = ( current_color_index + 1 ) % currentyawcolor.size; - wait 0,05; - } - if ( level.lastdebugheight == 15 ) - { - level.lastdebugheight = 30; - } - else - { - level.lastdebugheight = 15; + currentyawcolor = []; + currentyawcolor[0] = ( 0, 0, 1 ); + currentyawcolor[1] = ( 1, 0, 1 ); + current_color_index = 0; + start_time = gettime(); + + if ( !isdefined( level.lastdebugheight ) ) + level.lastdebugheight = 15; + + while ( gettime() - start_time < 1000 ) + { + pos1 = ( self.origin[0], self.origin[1], self.origin[2] + level.lastdebugheight ); + pos2 = pos1 + vectorscale( anglestoforward( self.angles ), ( current_color_index + 1 ) * 10 ); + line( pos1, pos2, currentyawcolor[current_color_index], 0.3, 1, duration ); + current_color_index = ( current_color_index + 1 ) % currentyawcolor.size; + wait 0.05; + } + + if ( level.lastdebugheight == 15 ) + level.lastdebugheight = 30; + else + level.lastdebugheight = 15; #/ - } } getanimdirection( damageyaw ) { - if ( damageyaw > 135 || damageyaw <= -135 ) - { - return "front"; - } - else - { - if ( damageyaw > 45 && damageyaw <= 135 ) - { - return "right"; - } - else - { - if ( damageyaw > -45 && damageyaw <= 45 ) - { - return "back"; - } - else - { - return "left"; - } - } - } - return "front"; + if ( damageyaw > 135 || damageyaw <= -135 ) + return "front"; + else if ( damageyaw > 45 && damageyaw <= 135 ) + return "right"; + else if ( damageyaw > -45 && damageyaw <= 45 ) + return "back"; + else + return "left"; + + return "front"; } setfootstepeffect( name, fx ) { /# - assert( isDefined( name ), "Need to define the footstep surface type." ); + assert( isdefined( name ), "Need to define the footstep surface type." ); #/ /# - assert( isDefined( fx ), "Need to define the mud footstep effect." ); + assert( isdefined( fx ), "Need to define the mud footstep effect." ); #/ - if ( !isDefined( anim.optionalstepeffects ) ) - { - anim.optionalstepeffects = []; - } - anim.optionalstepeffects[ anim.optionalstepeffects.size ] = name; - level._effect[ "step_" + name ] = fx; + if ( !isdefined( anim.optionalstepeffects ) ) + anim.optionalstepeffects = []; + + anim.optionalstepeffects[anim.optionalstepeffects.size] = name; + level._effect["step_" + name] = fx; } diff --git a/Multiplayer Core/common_mp/maps/mp/killstreaks/_dogs.gsc b/Multiplayer Core/common_mp/maps/mp/killstreaks/_dogs.gsc index cd940bf..3041f42 100644 --- a/Multiplayer Core/common_mp/maps/mp/killstreaks/_dogs.gsc +++ b/Multiplayer Core/common_mp/maps/mp/killstreaks/_dogs.gsc @@ -1,963 +1,904 @@ -#include maps/mp/gametypes/_dev; -#include maps/mp/killstreaks/_supplydrop; -#include maps/mp/_scoreevents; -#include maps/mp/gametypes/_weapons; -#include maps/mp/gametypes/_spawning; -#include maps/mp/gametypes/_battlechatter_mp; -#include maps/mp/killstreaks/_killstreakrules; -#include maps/mp/killstreaks/_killstreaks; -#include maps/mp/gametypes/_tweakables; -#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\_tweakables; +#include maps\mp\killstreaks\_killstreaks; +#include maps\mp\killstreaks\_killstreakrules; +#include maps\mp\gametypes\_battlechatter_mp; +#include maps\mp\gametypes\_spawning; +#include maps\mp\gametypes\_weapons; +#include maps\mp\_scoreevents; +#include maps\mp\killstreaks\_supplydrop; +#include maps\mp\gametypes\_dev; init() { - precachemodel( "german_shepherd_vest" ); - precachemodel( "german_shepherd_vest_black" ); - level.dog_targets = []; - level.dog_targets[ level.dog_targets.size ] = "trigger_radius"; - level.dog_targets[ level.dog_targets.size ] = "trigger_multiple"; - level.dog_targets[ level.dog_targets.size ] = "trigger_use_touch"; + precachemodel( "german_shepherd_vest" ); + precachemodel( "german_shepherd_vest_black" ); + level.dog_targets = []; + level.dog_targets[level.dog_targets.size] = "trigger_radius"; + level.dog_targets[level.dog_targets.size] = "trigger_multiple"; + level.dog_targets[level.dog_targets.size] = "trigger_use_touch"; /# - level thread devgui_dog_think(); + level thread devgui_dog_think(); #/ } initkillstreak() { - if ( maps/mp/gametypes/_tweakables::gettweakablevalue( "killstreak", "allowdogs" ) ) - { - maps/mp/killstreaks/_killstreaks::registerkillstreak( "dogs_mp", "dogs_mp", "killstreak_dogs", "dogs_used", ::usekillstreakdogs, 1 ); - maps/mp/killstreaks/_killstreaks::registerkillstreakstrings( "dogs_mp", &"KILLSTREAK_EARNED_DOGS", &"KILLSTREAK_DOGS_NOT_AVAILABLE", &"KILLSTREAK_DOGS_INBOUND" ); - maps/mp/killstreaks/_killstreaks::registerkillstreakdialog( "dogs_mp", "mpl_killstreak_dogs", "kls_dogs_used", "", "kls_dogs_enemy", "", "kls_dogs_ready" ); - maps/mp/killstreaks/_killstreaks::registerkillstreakdevdvar( "dogs_mp", "scr_givedogs" ); - maps/mp/killstreaks/_killstreaks::setkillstreakteamkillpenaltyscale( "dogs_mp", 0 ); - maps/mp/killstreaks/_killstreaks::registerkillstreakaltweapon( "dogs_mp", "dog_bite_mp" ); - } + if ( maps\mp\gametypes\_tweakables::gettweakablevalue( "killstreak", "allowdogs" ) ) + { + maps\mp\killstreaks\_killstreaks::registerkillstreak( "dogs_mp", "dogs_mp", "killstreak_dogs", "dogs_used", ::usekillstreakdogs, 1 ); + maps\mp\killstreaks\_killstreaks::registerkillstreakstrings( "dogs_mp", &"KILLSTREAK_EARNED_DOGS", &"KILLSTREAK_DOGS_NOT_AVAILABLE", &"KILLSTREAK_DOGS_INBOUND" ); + maps\mp\killstreaks\_killstreaks::registerkillstreakdialog( "dogs_mp", "mpl_killstreak_dogs", "kls_dogs_used", "", "kls_dogs_enemy", "", "kls_dogs_ready" ); + maps\mp\killstreaks\_killstreaks::registerkillstreakdevdvar( "dogs_mp", "scr_givedogs" ); + maps\mp\killstreaks\_killstreaks::setkillstreakteamkillpenaltyscale( "dogs_mp", 0.0 ); + maps\mp\killstreaks\_killstreaks::registerkillstreakaltweapon( "dogs_mp", "dog_bite_mp" ); + } } usekillstreakdogs( hardpointtype ) { - if ( !dog_killstreak_init() ) - { - return 0; - } - if ( !self maps/mp/killstreaks/_killstreakrules::iskillstreakallowed( hardpointtype, self.team ) ) - { - return 0; - } - killstreak_id = self maps/mp/killstreaks/_killstreakrules::killstreakstart( "dogs_mp", self.team ); - self thread ownerhadactivedogs(); - if ( killstreak_id == -1 ) - { - return 0; - } - while ( level.teambased ) - { - _a71 = level.teams; - _k71 = getFirstArrayKey( _a71 ); - while ( isDefined( _k71 ) ) - { - team = _a71[ _k71 ]; - if ( team == self.team ) - { - } - else - { - thread maps/mp/gametypes/_battlechatter_mp::onkillstreakused( "dogs", team ); - } - _k71 = getNextArrayKey( _a71, _k71 ); - } - } - self maps/mp/killstreaks/_killstreaks::playkillstreakstartdialog( "dogs_mp", self.team, 1 ); - level.globalkillstreakscalled++; - self addweaponstat( "dogs_mp", "used", 1 ); - ownerdeathcount = self.deathcount; - level thread dog_manager_spawn_dogs( self, ownerdeathcount, killstreak_id ); - level notify( "called_in_the_dogs" ); - return 1; + if ( !dog_killstreak_init() ) + return false; + + if ( !self maps\mp\killstreaks\_killstreakrules::iskillstreakallowed( hardpointtype, self.team ) ) + return false; + + killstreak_id = self maps\mp\killstreaks\_killstreakrules::killstreakstart( "dogs_mp", self.team ); + self thread ownerhadactivedogs(); + + if ( killstreak_id == -1 ) + return false; + + if ( level.teambased ) + { + foreach ( team in level.teams ) + { + if ( team == self.team ) + continue; + + thread maps\mp\gametypes\_battlechatter_mp::onkillstreakused( "dogs", team ); + } + } + + self maps\mp\killstreaks\_killstreaks::playkillstreakstartdialog( "dogs_mp", self.team, 1 ); + level.globalkillstreakscalled++; + self addweaponstat( "dogs_mp", "used", 1 ); + ownerdeathcount = self.deathcount; + level thread dog_manager_spawn_dogs( self, ownerdeathcount, killstreak_id ); + level notify( "called_in_the_dogs" ); + return true; } ownerhadactivedogs() { - self endon( "disconnect" ); - self.dogsactive = 1; - self.dogsactivekillstreak = 0; - self waittill_any( "death", "game_over", "dogs_complete" ); - self.dogsactivekillstreak = 0; - self.dogsactive = undefined; + self endon( "disconnect" ); + self.dogsactive = 1; + self.dogsactivekillstreak = 0; + self waittill_any( "death", "game_over", "dogs_complete" ); + self.dogsactivekillstreak = 0; + self.dogsactive = undefined; } dog_killstreak_init() { - dog_spawner = getent( "dog_spawner", "targetname" ); - if ( !isDefined( dog_spawner ) ) - { + dog_spawner = getent( "dog_spawner", "targetname" ); + + if ( !isdefined( dog_spawner ) ) + { /# - println( "No dog spawners found in map" ); + println( "No dog spawners found in map" ); #/ - return 0; - } - spawns = getnodearray( "spawn", "script_noteworthy" ); - if ( spawns.size <= 0 ) - { + return false; + } + + spawns = getnodearray( "spawn", "script_noteworthy" ); + + if ( spawns.size <= 0 ) + { /# - println( "No dog spawn nodes found in map" ); + println( "No dog spawn nodes found in map" ); #/ - return 0; - } - exits = getnodearray( "exit", "script_noteworthy" ); - if ( exits.size <= 0 ) - { + return false; + } + + exits = getnodearray( "exit", "script_noteworthy" ); + + if ( exits.size <= 0 ) + { /# - println( "No dog exit nodes found in map" ); + println( "No dog exit nodes found in map" ); #/ - return 0; - } - return 1; + return false; + } + + return true; } dog_set_model() { - self setmodel( "german_shepherd_vest" ); - self setenemymodel( "german_shepherd_vest_black" ); + self setmodel( "german_shepherd_vest" ); + self setenemymodel( "german_shepherd_vest_black" ); } init_dog() { /# - assert( isai( self ) ); + assert( isai( self ) ); #/ - self.targetname = "attack_dog"; - self.animtree = "dog.atr"; - self.type = "dog"; - self.accuracy = 0,2; - self.health = 100; - self.maxhealth = 100; - self.aiweapon = "dog_bite_mp"; - self.secondaryweapon = ""; - self.sidearm = ""; - self.grenadeammo = 0; - self.goalradius = 128; - self.nododgemove = 1; - self.ignoresuppression = 1; - self.suppressionthreshold = 1; - self.disablearrivals = 0; - self.pathenemyfightdist = 512; - self.soundmod = "dog"; - self.meleeattackdist = 90; - self thread dog_health_regen(); - self thread selfdefensechallenge(); + self.targetname = "attack_dog"; + self.animtree = "dog.atr"; + self.type = "dog"; + self.accuracy = 0.2; + self.health = 100; + self.maxhealth = 100; + self.aiweapon = "dog_bite_mp"; + self.secondaryweapon = ""; + self.sidearm = ""; + self.grenadeammo = 0; + self.goalradius = 128; + self.nododgemove = 1; + self.ignoresuppression = 1; + self.suppressionthreshold = 1; + self.disablearrivals = 0; + self.pathenemyfightdist = 512; + self.soundmod = "dog"; + self.meleeattackdist = 90; + self thread dog_health_regen(); + self thread selfdefensechallenge(); } get_spawn_node( owner, team ) { - spawns = getnodearray( "spawn", "script_noteworthy" ); - return spawns[ randomint( spawns.size ) ]; + spawns = getnodearray( "spawn", "script_noteworthy" ); + return spawns[randomint( spawns.size )]; } get_score_for_spawn( origin, team ) { - players = get_players(); - score = 0; - _a201 = players; - _k201 = getFirstArrayKey( _a201 ); - while ( isDefined( _k201 ) ) - { - player = _a201[ _k201 ]; - if ( !isDefined( player ) ) - { - } - else if ( !isalive( player ) ) - { - } - else if ( player.sessionstate != "playing" ) - { - } - else if ( distancesquared( player.origin, origin ) > 4194304 ) - { - } - else if ( player.team == team ) - { - score++; - } - else - { - score--; + players = get_players(); + score = 0; - } - _k201 = getNextArrayKey( _a201, _k201 ); - } - return score; + foreach ( player in players ) + { + if ( !isdefined( player ) ) + continue; + + if ( !isalive( player ) ) + continue; + + if ( player.sessionstate != "playing" ) + continue; + + if ( distancesquared( player.origin, origin ) > 4194304 ) + continue; + + if ( player.team == team ) + { + score++; + continue; + } + + score--; + } + + return score; } dog_set_owner( owner, team, requireddeathcount ) { - self setentityowner( owner ); - self.aiteam = team; - self.requireddeathcount = requireddeathcount; + self setentityowner( owner ); + self.aiteam = team; + self.requireddeathcount = requireddeathcount; } dog_create_spawn_influencer() { - self maps/mp/gametypes/_spawning::create_dog_influencers(); + self maps\mp\gametypes\_spawning::create_dog_influencers(); } dog_manager_spawn_dog( owner, team, spawn_node, requireddeathcount ) { - dog_spawner = getent( "dog_spawner", "targetname" ); - dog = dog_spawner spawnactor(); - dog forceteleport( spawn_node.origin, spawn_node.angles ); - dog init_dog(); - dog dog_set_owner( owner, team, requireddeathcount ); - dog dog_set_model(); - dog dog_create_spawn_influencer(); - dog thread dog_owner_kills(); - dog thread dog_notify_level_on_death(); - dog thread dog_patrol(); - dog thread maps/mp/gametypes/_weapons::monitor_dog_special_grenades(); - return dog; + dog_spawner = getent( "dog_spawner", "targetname" ); + dog = dog_spawner spawnactor(); + dog forceteleport( spawn_node.origin, spawn_node.angles ); + dog init_dog(); + dog dog_set_owner( owner, team, requireddeathcount ); + dog dog_set_model(); + dog dog_create_spawn_influencer(); + dog thread dog_owner_kills(); + dog thread dog_notify_level_on_death(); + dog thread dog_patrol(); + dog thread maps\mp\gametypes\_weapons::monitor_dog_special_grenades(); + return dog; } dog_manager_spawn_dogs( owner, deathcount, killstreak_id ) { - requireddeathcount = deathcount; - team = owner.team; - level.dog_abort = 0; - owner thread dog_manager_abort(); - level thread dog_manager_game_ended(); - count = 0; - while ( count < 10 ) - { - if ( level.dog_abort ) - { - break; - } - else - { - dogs = dog_manager_get_dogs(); - while ( dogs.size < 5 && count < 10 && !level.dog_abort ) - { - node = get_spawn_node( owner, team ); - level dog_manager_spawn_dog( owner, team, node, requireddeathcount ); - count++; - wait randomfloatrange( 2, 5 ); - dogs = dog_manager_get_dogs(); - } - level waittill( "dog_died" ); - } - } - for ( ;; ) - { - dogs = dog_manager_get_dogs(); - if ( dogs.size <= 0 ) - { - maps/mp/killstreaks/_killstreakrules::killstreakstop( "dogs_mp", team, killstreak_id ); - if ( isDefined( owner ) ) - { - owner notify( "dogs_complete" ); - } - return; - } - level waittill( "dog_died" ); - } + requireddeathcount = deathcount; + team = owner.team; + level.dog_abort = 0; + owner thread dog_manager_abort(); + level thread dog_manager_game_ended(); + count = 0; + + while ( count < 10 ) + { + if ( level.dog_abort ) + break; + + for ( dogs = dog_manager_get_dogs(); dogs.size < 5 && count < 10 && !level.dog_abort; dogs = dog_manager_get_dogs() ) + { + node = get_spawn_node( owner, team ); + level dog_manager_spawn_dog( owner, team, node, requireddeathcount ); + count++; + wait( randomfloatrange( 2, 5 ) ); + } + + level waittill( "dog_died" ); + } + + for (;;) + { + dogs = dog_manager_get_dogs(); + + if ( dogs.size <= 0 ) + { + maps\mp\killstreaks\_killstreakrules::killstreakstop( "dogs_mp", team, killstreak_id ); + + if ( isdefined( owner ) ) + owner notify( "dogs_complete" ); + + return; + } + + level waittill( "dog_died" ); + } } dog_abort() { - level.dog_abort = 1; - dogs = dog_manager_get_dogs(); - _a324 = dogs; - _k324 = getFirstArrayKey( _a324 ); - while ( isDefined( _k324 ) ) - { - dog = _a324[ _k324 ]; - dog notify( "abort" ); - _k324 = getNextArrayKey( _a324, _k324 ); - } - level notify( "dog_abort" ); + level.dog_abort = 1; + dogs = dog_manager_get_dogs(); + + foreach ( dog in dogs ) + dog notify( "abort" ); + + level notify( "dog_abort" ); } dog_manager_abort() { - level endon( "dog_abort" ); - self wait_endon( 50, "disconnect", "joined_team", "joined_specators" ); - dog_abort(); + level endon( "dog_abort" ); + self wait_endon( 50, "disconnect", "joined_team", "joined_specators" ); + dog_abort(); } dog_manager_game_ended() { - level endon( "dog_abort" ); - level waittill( "game_ended" ); - dog_abort(); + level endon( "dog_abort" ); + + level waittill( "game_ended" ); + + dog_abort(); } dog_notify_level_on_death() { - self waittill( "death" ); - level notify( "dog_died" ); + self waittill( "death" ); + + level notify( "dog_died" ); } dog_leave() { - self clearentitytarget(); - self.ignoreall = 1; - self.goalradius = 30; - self setgoalnode( self dog_get_exit_node() ); - self wait_endon( 20, "goal", "bad_path" ); - self delete(); + self clearentitytarget(); + self.ignoreall = 1; + self.goalradius = 30; + self setgoalnode( self dog_get_exit_node() ); + self wait_endon( 20, "goal", "bad_path" ); + self delete(); } dog_patrol() { - self endon( "death" ); + self endon( "death" ); /# - self endon( "debug_patrol" ); + self endon( "debug_patrol" ); #/ - for ( ;; ) - { - if ( level.dog_abort ) - { - self dog_leave(); - return; - } - if ( isDefined( self.enemy ) ) - { - wait randomintrange( 3, 5 ); - continue; - } - else - { - nodes = []; - objectives = dog_patrol_near_objective(); - i = 0; - while ( i < objectives.size ) - { - objective = random( objectives ); - nodes = getnodesinradius( objective.origin, 256, 64, 512, "Path", 16 ); - if ( nodes.size ) - { - break; - } - else - { - i++; - } - } - if ( !nodes.size ) - { - player = self dog_patrol_near_enemy(); - if ( isDefined( player ) ) - { - nodes = getnodesinradius( player.origin, 1024, 0, 128, "Path", 8 ); - } - } - if ( !nodes.size && isDefined( self.script_owner ) ) - { - if ( isalive( self.script_owner ) && self.script_owner.sessionstate == "playing" ) - { - nodes = getnodesinradius( self.script_owner.origin, 512, 256, 512, "Path", 16 ); - } - } - if ( !nodes.size ) - { - nodes = getnodesinradius( self.origin, 1024, 512, 512, "Path" ); - } - while ( nodes.size ) - { - nodes = array_randomize( nodes ); - _a429 = nodes; - _k429 = getFirstArrayKey( _a429 ); - while ( isDefined( _k429 ) ) - { - node = _a429[ _k429 ]; - if ( isDefined( node.script_noteworthy ) ) - { - } - else if ( isDefined( node.dog_claimed ) && isalive( node.dog_claimed ) ) - { - } - else - { - self setgoalnode( node ); - node.dog_claimed = self; - nodes = []; - event = self waittill_any_return( "goal", "bad_path", "enemy", "abort" ); - if ( event == "goal" ) - { - wait_endon( randomintrange( 3, 5 ), "damage", "enemy", "abort" ); - } - node.dog_claimed = undefined; - break; - } - _k429 = getNextArrayKey( _a429, _k429 ); - } - } - wait 0,5; - } - } + for (;;) + { + if ( level.dog_abort ) + { + self dog_leave(); + return; + } + + if ( isdefined( self.enemy ) ) + { + wait( randomintrange( 3, 5 ) ); + continue; + } + + nodes = []; + objectives = dog_patrol_near_objective(); + + for ( i = 0; i < objectives.size; i++ ) + { + objective = random( objectives ); + nodes = getnodesinradius( objective.origin, 256, 64, 512, "Path", 16 ); + + if ( nodes.size ) + break; + } + + if ( !nodes.size ) + { + player = self dog_patrol_near_enemy(); + + if ( isdefined( player ) ) + nodes = getnodesinradius( player.origin, 1024, 0, 128, "Path", 8 ); + } + + if ( !nodes.size && isdefined( self.script_owner ) ) + { + if ( isalive( self.script_owner ) && self.script_owner.sessionstate == "playing" ) + nodes = getnodesinradius( self.script_owner.origin, 512, 256, 512, "Path", 16 ); + } + + if ( !nodes.size ) + nodes = getnodesinradius( self.origin, 1024, 512, 512, "Path" ); + + if ( nodes.size ) + { + nodes = array_randomize( nodes ); + + foreach ( node in nodes ) + { + if ( isdefined( node.script_noteworthy ) ) + continue; + + if ( isdefined( node.dog_claimed ) && isalive( node.dog_claimed ) ) + continue; + + self setgoalnode( node ); + node.dog_claimed = self; + nodes = []; + event = self waittill_any_return( "goal", "bad_path", "enemy", "abort" ); + + if ( event == "goal" ) + wait_endon( randomintrange( 3, 5 ), "damage", "enemy", "abort" ); + + node.dog_claimed = undefined; + break; + } + } + + wait 0.5; + } } dog_patrol_near_objective() { - if ( !isDefined( level.dog_objectives ) ) - { - level.dog_objectives = []; - level.dog_objective_next_update = 0; - } - if ( level.gametype == "tdm" || level.gametype == "dm" ) - { - return level.dog_objectives; - } - if ( getTime() >= level.dog_objective_next_update ) - { - level.dog_objectives = []; - _a478 = level.dog_targets; - _k478 = getFirstArrayKey( _a478 ); - while ( isDefined( _k478 ) ) - { - target = _a478[ _k478 ]; - ents = getentarray( target, "classname" ); - _a482 = ents; - _k482 = getFirstArrayKey( _a482 ); - while ( isDefined( _k482 ) ) - { - ent = _a482[ _k482 ]; - if ( level.gametype == "koth" ) - { - if ( isDefined( ent.targetname ) && ent.targetname == "radiotrigger" ) - { - level.dog_objectives[ level.dog_objectives.size ] = ent; - } - } - else if ( level.gametype == "sd" ) - { - if ( isDefined( ent.targetname ) && ent.targetname == "bombzone" ) - { - level.dog_objectives[ level.dog_objectives.size ] = ent; - } - } - else if ( !isDefined( ent.script_gameobjectname ) ) - { - } - else if ( !issubstr( ent.script_gameobjectname, level.gametype ) ) - { - } - else - { - level.dog_objectives[ level.dog_objectives.size ] = ent; - } - _k482 = getNextArrayKey( _a482, _k482 ); - } - _k478 = getNextArrayKey( _a478, _k478 ); - } - level.dog_objective_next_update = getTime() + randomintrange( 5000, 10000 ); - } - return level.dog_objectives; + if ( !isdefined( level.dog_objectives ) ) + { + level.dog_objectives = []; + level.dog_objective_next_update = 0; + } + + if ( level.gametype == "tdm" || level.gametype == "dm" ) + return level.dog_objectives; + + if ( gettime() >= level.dog_objective_next_update ) + { + level.dog_objectives = []; + + foreach ( target in level.dog_targets ) + { + ents = getentarray( target, "classname" ); + + foreach ( ent in ents ) + { + if ( level.gametype == "koth" ) + { + if ( isdefined( ent.targetname ) && ent.targetname == "radiotrigger" ) + level.dog_objectives[level.dog_objectives.size] = ent; + + continue; + } + + if ( level.gametype == "sd" ) + { + if ( isdefined( ent.targetname ) && ent.targetname == "bombzone" ) + level.dog_objectives[level.dog_objectives.size] = ent; + + continue; + } + + if ( !isdefined( ent.script_gameobjectname ) ) + continue; + + if ( !issubstr( ent.script_gameobjectname, level.gametype ) ) + continue; + + level.dog_objectives[level.dog_objectives.size] = ent; + } + } + + level.dog_objective_next_update = gettime() + randomintrange( 5000, 10000 ); + } + + return level.dog_objectives; } dog_patrol_near_enemy() { - players = get_players(); - closest = undefined; - distsq = 99999999; - _a531 = players; - _k531 = getFirstArrayKey( _a531 ); - while ( isDefined( _k531 ) ) - { - player = _a531[ _k531 ]; - if ( !isDefined( player ) ) - { - } - else if ( !isalive( player ) ) - { - } - else if ( player.sessionstate != "playing" ) - { - } - else if ( isDefined( self.script_owner ) && player == self.script_owner ) - { - } - else - { - if ( level.teambased ) - { - if ( player.team == self.aiteam ) - { - break; - } - } - else if ( ( getTime() - player.lastfiretime ) > 3000 ) - { - break; - } - else if ( !isDefined( closest ) ) - { - closest = player; - distsq = distancesquared( self.origin, player.origin ); - break; - } - else - { - d = distancesquared( self.origin, player.origin ); - if ( d < distsq ) - { - closest = player; - distsq = d; - } - } - } - _k531 = getNextArrayKey( _a531, _k531 ); - } - return closest; + players = get_players(); + closest = undefined; + distsq = 99999999; + + foreach ( player in players ) + { + if ( !isdefined( player ) ) + continue; + + if ( !isalive( player ) ) + continue; + + if ( player.sessionstate != "playing" ) + continue; + + if ( isdefined( self.script_owner ) && player == self.script_owner ) + continue; + + if ( level.teambased ) + { + if ( player.team == self.aiteam ) + continue; + } + + if ( gettime() - player.lastfiretime > 3000 ) + continue; + + if ( !isdefined( closest ) ) + { + closest = player; + distsq = distancesquared( self.origin, player.origin ); + continue; + } + + d = distancesquared( self.origin, player.origin ); + + if ( d < distsq ) + { + closest = player; + distsq = d; + } + } + + return closest; } dog_manager_get_dogs() { - dogs = getentarray( "attack_dog", "targetname" ); - return dogs; + dogs = getentarray( "attack_dog", "targetname" ); + return dogs; } dog_owner_kills() { - if ( !isDefined( self.script_owner ) ) - { - return; - } - self endon( "clear_owner" ); - self endon( "death" ); - self.script_owner endon( "disconnect" ); - while ( 1 ) - { - self waittill( "killed", player ); - self.script_owner notify( "dog_handler" ); - } + if ( !isdefined( self.script_owner ) ) + return; + + self endon( "clear_owner" ); + self endon( "death" ); + self.script_owner endon( "disconnect" ); + + while ( true ) + { + self waittill( "killed", player ); + + self.script_owner notify( "dog_handler" ); + } } dog_health_regen() { - self endon( "death" ); - interval = 0,5; - regen_interval = int( ( self.health / 5 ) * interval ); - regen_start = 2; - for ( ;; ) - { - self waittill( "damage", damage, attacker, direction, point, type, tagname, modelname, partname, weaponname, idflags ); - self trackattackerdamage( attacker, weaponname ); - self thread dog_health_regen_think( regen_start, interval, regen_interval ); - } + self endon( "death" ); + interval = 0.5; + regen_interval = int( self.health / 5 * interval ); + regen_start = 2; + + for (;;) + { + self waittill( "damage", damage, attacker, direction, point, type, tagname, modelname, partname, weaponname, idflags ); + + self trackattackerdamage( attacker, weaponname ); + self thread dog_health_regen_think( regen_start, interval, regen_interval ); + } } trackattackerdamage( attacker, weapon ) { - if ( isDefined( attacker ) || !isplayer( attacker ) && !isDefined( self.script_owner ) ) - { - return; - } - if ( level.teambased || attacker.team == self.script_owner.team && attacker == self ) - { - return; - } - if ( !isDefined( self.attackerdata ) || !isDefined( self.attackers ) ) - { - self.attackerdata = []; - self.attackers = []; - } - if ( !isDefined( self.attackerdata[ attacker.clientid ] ) ) - { - self.attackerclientid[ attacker.clientid ] = spawnstruct(); - self.attackers[ self.attackers.size ] = attacker; - } + if ( !isdefined( attacker ) || !isplayer( attacker ) || !isdefined( self.script_owner ) ) + return; + + if ( level.teambased && attacker.team == self.script_owner.team || attacker == self ) + return; + + if ( !isdefined( self.attackerdata ) || !isdefined( self.attackers ) ) + { + self.attackerdata = []; + self.attackers = []; + } + + if ( !isdefined( self.attackerdata[attacker.clientid] ) ) + { + self.attackerclientid[attacker.clientid] = spawnstruct(); + self.attackers[self.attackers.size] = attacker; + } } resetattackerdamage() { - self.attackerdata = []; - self.attackers = []; + self.attackerdata = []; + self.attackers = []; } dog_health_regen_think( delay, interval, regen_interval ) { - self endon( "death" ); - self endon( "damage" ); - wait delay; - step = 0; - while ( step <= 5 ) - { - if ( self.health >= 100 ) - { - break; - } - else - { - self.health += regen_interval; - wait interval; - step += interval; - } - } - self resetattackerdamage(); - self.health = 100; + self endon( "death" ); + self endon( "damage" ); + wait( delay ); + + for ( step = 0; step <= 5; step += interval ) + { + if ( self.health >= 100 ) + break; + + self.health += regen_interval; + wait( interval ); + } + + self resetattackerdamage(); + self.health = 100; } selfdefensechallenge() { - self waittill( "death", attacker ); - if ( isDefined( attacker ) && isplayer( attacker ) ) - { - if ( isDefined( self.script_owner ) && self.script_owner == attacker ) - { - return; - } - if ( level.teambased && isDefined( self.script_owner ) && self.script_owner.team == attacker.team ) - { - return; - } - while ( isDefined( self.attackers ) ) - { - _a689 = self.attackers; - _k689 = getFirstArrayKey( _a689 ); - while ( isDefined( _k689 ) ) - { - player = _a689[ _k689 ]; - if ( player != attacker ) - { - maps/mp/_scoreevents::processscoreevent( "killed_dog_assist", player ); - } - _k689 = getNextArrayKey( _a689, _k689 ); - } - } - attacker notify( "selfdefense_dog" ); - } + self waittill( "death", attacker ); + + if ( isdefined( attacker ) && isplayer( attacker ) ) + { + if ( isdefined( self.script_owner ) && self.script_owner == attacker ) + return; + + if ( level.teambased && isdefined( self.script_owner ) && self.script_owner.team == attacker.team ) + return; + + if ( isdefined( self.attackers ) ) + { + foreach ( player in self.attackers ) + { + if ( player != attacker ) + maps\mp\_scoreevents::processscoreevent( "killed_dog_assist", player ); + } + } + + attacker notify( "selfdefense_dog" ); + } } dog_get_exit_node() { - exits = getnodearray( "exit", "script_noteworthy" ); - return getclosest( self.origin, exits ); + exits = getnodearray( "exit", "script_noteworthy" ); + return getclosest( self.origin, exits ); } flash_dogs( area ) { - self endon( "disconnect" ); - dogs = dog_manager_get_dogs(); - _a714 = dogs; - _k714 = getFirstArrayKey( _a714 ); - while ( isDefined( _k714 ) ) - { - dog = _a714[ _k714 ]; - if ( !isalive( dog ) ) - { - } - else - { - if ( dog istouching( area ) ) - { - do_flash = 1; - if ( isplayer( self ) ) - { - if ( level.teambased && dog.aiteam == self.team ) - { - do_flash = 0; - break; - } - else - { - if ( !level.teambased && isDefined( dog.script_owner ) && self == dog.script_owner ) - { - do_flash = 0; - } - } - } - if ( isDefined( dog.lastflashed ) && ( dog.lastflashed + 1500 ) > getTime() ) - { - do_flash = 0; - } - if ( do_flash ) - { - dog setflashbanged( 1, 500 ); - dog.lastflashed = getTime(); - } - } - } - _k714 = getNextArrayKey( _a714, _k714 ); - } + self endon( "disconnect" ); + dogs = dog_manager_get_dogs(); + + foreach ( dog in dogs ) + { + if ( !isalive( dog ) ) + continue; + + if ( dog istouching( area ) ) + { + do_flash = 1; + + if ( isplayer( self ) ) + { + if ( level.teambased && dog.aiteam == self.team ) + do_flash = 0; + else if ( !level.teambased && isdefined( dog.script_owner ) && self == dog.script_owner ) + do_flash = 0; + } + + if ( isdefined( dog.lastflashed ) && dog.lastflashed + 1500 > gettime() ) + do_flash = 0; + + if ( do_flash ) + { + dog setflashbanged( 1, 500 ); + dog.lastflashed = gettime(); + } + } + } } devgui_dog_think() { /# - setdvar( "devgui_dog", "" ); - debug_patrol = 0; - for ( ;; ) - { - cmd = getDvar( "devgui_dog" ); - switch( cmd ) - { - case "spawn_friendly": - player = gethostplayer(); - devgui_dog_spawn( player.team ); - break; - case "spawn_enemy": - player = gethostplayer(); - _a769 = level.teams; - _k769 = getFirstArrayKey( _a769 ); - while ( isDefined( _k769 ) ) - { - team = _a769[ _k769 ]; - if ( team == player.team ) - { - } - else - { - devgui_dog_spawn( team ); - } - _k769 = getNextArrayKey( _a769, _k769 ); - } - case "delete_dogs": - level dog_abort(); - break; - case "dog_camera": - devgui_dog_camera(); - break; - case "spawn_crate": - devgui_crate_spawn(); - break; - case "delete_crates": - devgui_crate_delete(); - break; - case "show_spawns": - devgui_spawn_show(); - break; - case "show_exits": - devgui_exit_show(); - break; - case "debug_route": - devgui_debug_route(); - break; - } - if ( cmd != "" ) - { - setdvar( "devgui_dog", "" ); - } - wait 0,5; + setdvar( "devgui_dog", "" ); + debug_patrol = 0; + + for (;;) + { + cmd = getdvar( "devgui_dog" ); + + switch ( cmd ) + { + case "spawn_friendly": + player = gethostplayer(); + devgui_dog_spawn( player.team ); + break; + case "spawn_enemy": + player = gethostplayer(); + + foreach ( team in level.teams ) + { + if ( team == player.team ) + continue; + + devgui_dog_spawn( team ); + } + + break; + case "delete_dogs": + level dog_abort(); + break; + case "dog_camera": + devgui_dog_camera(); + break; + case "spawn_crate": + devgui_crate_spawn(); + break; + case "delete_crates": + devgui_crate_delete(); + break; + case "show_spawns": + devgui_spawn_show(); + break; + case "show_exits": + devgui_exit_show(); + break; + case "debug_route": + devgui_debug_route(); + break; + } + + if ( cmd != "" ) + setdvar( "devgui_dog", "" ); + + wait 0.5; + } #/ - } - } } devgui_dog_spawn( team ) { /# - player = gethostplayer(); - dog_spawner = getent( "dog_spawner", "targetname" ); - level.dog_abort = 0; - if ( !isDefined( dog_spawner ) ) - { - iprintln( "No dog spawners found in map" ); - return; - } - direction = player getplayerangles(); - direction_vec = anglesToForward( direction ); - eye = player geteye(); - scale = 8000; - direction_vec = ( direction_vec[ 0 ] * scale, direction_vec[ 1 ] * scale, direction_vec[ 2 ] * scale ); - trace = bullettrace( eye, eye + direction_vec, 0, undefined ); - nodes = getnodesinradius( trace[ "position" ], 256, 0, 128, "Path", 8 ); - if ( !nodes.size ) - { - iprintln( "No nodes found near crosshair position" ); - return; - } - iprintln( "Spawning dog at your crosshair position" ); - node = getclosest( trace[ "position" ], nodes ); - dog = dog_manager_spawn_dog( player, player.team, node, 5 ); - if ( team != player.team ) - { - dog.aiteam = team; - dog clearentityowner(); - dog notify( "clear_owner" ); + player = gethostplayer(); + dog_spawner = getent( "dog_spawner", "targetname" ); + level.dog_abort = 0; + + if ( !isdefined( dog_spawner ) ) + { + iprintln( "No dog spawners found in map" ); + return; + } + + direction = player getplayerangles(); + direction_vec = anglestoforward( direction ); + eye = player geteye(); + scale = 8000; + direction_vec = ( direction_vec[0] * scale, direction_vec[1] * scale, direction_vec[2] * scale ); + trace = bullettrace( eye, eye + direction_vec, 0, undefined ); + nodes = getnodesinradius( trace["position"], 256, 0, 128, "Path", 8 ); + + if ( !nodes.size ) + { + iprintln( "No nodes found near crosshair position" ); + return; + } + + iprintln( "Spawning dog at your crosshair position" ); + node = getclosest( trace["position"], nodes ); + dog = dog_manager_spawn_dog( player, player.team, node, 5 ); + + if ( team != player.team ) + { + dog.aiteam = team; + dog clearentityowner(); + dog notify( "clear_owner" ); + } #/ - } } devgui_dog_camera() { /# - player = gethostplayer(); - if ( !isDefined( level.devgui_dog_camera ) ) - { - level.devgui_dog_camera = 0; - } - dog = undefined; - dogs = dog_manager_get_dogs(); - if ( dogs.size <= 0 ) - { - level.devgui_dog_camera = undefined; - player cameraactivate( 0 ); - return; - } - i = 0; - while ( i < dogs.size ) - { - dog = dogs[ i ]; - if ( !isDefined( dog ) || !isalive( dog ) ) - { - dog = undefined; - i++; - continue; - } - else - { - if ( !isDefined( dog.cam ) ) - { - forward = anglesToForward( dog.angles ); - dog.cam = spawn( "script_model", ( dog.origin + vectorScale( ( 1, 0, 0 ), 50 ) ) + ( forward * -100 ) ); - dog.cam setmodel( "tag_origin" ); - dog.cam linkto( dog ); - } - if ( dog getentitynumber() <= level.devgui_dog_camera ) - { - dog = undefined; - i++; - continue; - } - else - { - } - } - i++; - } - if ( isDefined( dog ) ) - { - level.devgui_dog_camera = dog getentitynumber(); - player camerasetposition( dog.cam ); - player camerasetlookat( dog ); - player cameraactivate( 1 ); - } - else level.devgui_dog_camera = undefined; - player cameraactivate( 0 ); + player = gethostplayer(); + + if ( !isdefined( level.devgui_dog_camera ) ) + level.devgui_dog_camera = 0; + + dog = undefined; + dogs = dog_manager_get_dogs(); + + if ( dogs.size <= 0 ) + { + level.devgui_dog_camera = undefined; + player cameraactivate( 0 ); + return; + } + + for ( i = 0; i < dogs.size; i++ ) + { + dog = dogs[i]; + + if ( !isdefined( dog ) || !isalive( dog ) ) + { + dog = undefined; + continue; + } + + if ( !isdefined( dog.cam ) ) + { + forward = anglestoforward( dog.angles ); + dog.cam = spawn( "script_model", dog.origin + vectorscale( ( 0, 0, 1 ), 50.0 ) + forward * -100 ); + dog.cam setmodel( "tag_origin" ); + dog.cam linkto( dog ); + } + + if ( dog getentitynumber() <= level.devgui_dog_camera ) + { + dog = undefined; + continue; + } + + break; + } + + if ( isdefined( dog ) ) + { + level.devgui_dog_camera = dog getentitynumber(); + player camerasetposition( dog.cam ); + player camerasetlookat( dog ); + player cameraactivate( 1 ); + } + else + { + level.devgui_dog_camera = undefined; + player cameraactivate( 0 ); + } #/ } devgui_crate_spawn() { /# - player = gethostplayer(); - direction = player getplayerangles(); - direction_vec = anglesToForward( direction ); - eye = player geteye(); - scale = 8000; - direction_vec = ( direction_vec[ 0 ] * scale, direction_vec[ 1 ] * scale, direction_vec[ 2 ] * scale ); - trace = bullettrace( eye, eye + direction_vec, 0, undefined ); - killcament = spawn( "script_model", player.origin ); - level thread maps/mp/killstreaks/_supplydrop::dropcrate( trace[ "position" ] + vectorScale( ( 1, 0, 0 ), 25 ), direction, "supplydrop_mp", player, player.team, killcament ); + player = gethostplayer(); + direction = player getplayerangles(); + direction_vec = anglestoforward( direction ); + eye = player geteye(); + scale = 8000; + direction_vec = ( direction_vec[0] * scale, direction_vec[1] * scale, direction_vec[2] * scale ); + trace = bullettrace( eye, eye + direction_vec, 0, undefined ); + killcament = spawn( "script_model", player.origin ); + level thread maps\mp\killstreaks\_supplydrop::dropcrate( trace["position"] + vectorscale( ( 0, 0, 1 ), 25.0 ), direction, "supplydrop_mp", player, player.team, killcament ); #/ } devgui_crate_delete() { /# - if ( !isDefined( level.devgui_crates ) ) - { - return; - } - i = 0; - while ( i < level.devgui_crates.size ) - { - level.devgui_crates[ i ] delete(); - i++; - } - level.devgui_crates = []; + if ( !isdefined( level.devgui_crates ) ) + return; + + for ( i = 0; i < level.devgui_crates.size; i++ ) + level.devgui_crates[i] delete(); + + level.devgui_crates = []; #/ } devgui_spawn_show() { /# - if ( !isDefined( level.dog_spawn_show ) ) - { - level.dog_spawn_show = 1; - } - else - { - level.dog_spawn_show = !level.dog_spawn_show; - } - if ( !level.dog_spawn_show ) - { - level notify( "hide_dog_spawns" ); - return; - } - spawns = getnodearray( "spawn", "script_noteworthy" ); - color = ( 1, 0, 0 ); - i = 0; - while ( i < spawns.size ) - { - maps/mp/gametypes/_dev::showonespawnpoint( spawns[ i ], color, "hide_dog_spawns", 32, "dog_spawn" ); - i++; + if ( !isdefined( level.dog_spawn_show ) ) + level.dog_spawn_show = 1; + else + level.dog_spawn_show = !level.dog_spawn_show; + + if ( !level.dog_spawn_show ) + { + level notify( "hide_dog_spawns" ); + return; + } + + spawns = getnodearray( "spawn", "script_noteworthy" ); + color = ( 0, 1, 0 ); + + for ( i = 0; i < spawns.size; i++ ) + maps\mp\gametypes\_dev::showonespawnpoint( spawns[i], color, "hide_dog_spawns", 32, "dog_spawn" ); #/ - } } devgui_exit_show() { /# - if ( !isDefined( level.dog_exit_show ) ) - { - level.dog_exit_show = 1; - } - else - { - level.dog_exit_show = !level.dog_exit_show; - } - if ( !level.dog_exit_show ) - { - level notify( "hide_dog_exits" ); - return; - } - exits = getnodearray( "exit", "script_noteworthy" ); - color = ( 1, 0, 0 ); - i = 0; - while ( i < exits.size ) - { - maps/mp/gametypes/_dev::showonespawnpoint( exits[ i ], color, "hide_dog_exits", 32, "dog_exit" ); - i++; + if ( !isdefined( level.dog_exit_show ) ) + level.dog_exit_show = 1; + else + level.dog_exit_show = !level.dog_exit_show; + + if ( !level.dog_exit_show ) + { + level notify( "hide_dog_exits" ); + return; + } + + exits = getnodearray( "exit", "script_noteworthy" ); + color = ( 1, 0, 0 ); + + for ( i = 0; i < exits.size; i++ ) + maps\mp\gametypes\_dev::showonespawnpoint( exits[i], color, "hide_dog_exits", 32, "dog_exit" ); #/ - } } dog_debug_patrol( node1, node2 ) { /# - self endon( "death" ); - self endon( "debug_patrol" ); - for ( ;; ) - { - self setgoalnode( node1 ); - self waittill_any( "goal", "bad_path" ); - wait 1; - self setgoalnode( node2 ); - self waittill_any( "goal", "bad_path" ); - wait 1; + self endon( "death" ); + self endon( "debug_patrol" ); + + for (;;) + { + self setgoalnode( node1 ); + self waittill_any( "goal", "bad_path" ); + wait 1; + self setgoalnode( node2 ); + self waittill_any( "goal", "bad_path" ); + wait 1; + } #/ - } } devgui_debug_route() { /# - iprintln( "Choose nodes with 'A' or press 'B' to cancel" ); - nodes = maps/mp/gametypes/_dev::dev_get_node_pair(); - if ( !isDefined( nodes ) ) - { - iprintln( "Route Debug Cancelled" ); - return; - } - iprintln( "Sending dog to chosen nodes" ); - dogs = dog_manager_get_dogs(); - if ( isDefined( dogs[ 0 ] ) ) - { - dogs[ 0 ] notify( "debug_patrol" ); - dogs[ 0 ] thread dog_debug_patrol( nodes[ 0 ], nodes[ 1 ] ); + iprintln( "Choose nodes with 'A' or press 'B' to cancel" ); + nodes = maps\mp\gametypes\_dev::dev_get_node_pair(); + + if ( !isdefined( nodes ) ) + { + iprintln( "Route Debug Cancelled" ); + return; + } + + iprintln( "Sending dog to chosen nodes" ); + dogs = dog_manager_get_dogs(); + + if ( isdefined( dogs[0] ) ) + { + dogs[0] notify( "debug_patrol" ); + dogs[0] thread dog_debug_patrol( nodes[0], nodes[1] ); + } #/ - } } diff --git a/Multiplayer Core/patch_mp/codescripts/character_mp.gsc b/Multiplayer Core/patch_mp/codescripts/character_mp.gsc index 12268be..6086847 100644 --- a/Multiplayer Core/patch_mp/codescripts/character_mp.gsc +++ b/Multiplayer Core/patch_mp/codescripts/character_mp.gsc @@ -1,20 +1,19 @@ -//checked includes matches cerberus output -#include codescripts/character; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include codescripts\character; -setmodelfromarray( a ) //checked matches cerberus output +setmodelfromarray( a ) { - self setmodel( a[ randomint( a.size ) ] ); + self setmodel( a[randomint( a.size )] ); } -precachemodelarray( a ) //checked changed to match cerberus output +precachemodelarray( a ) { - for ( i = 0; i < a.size; i++ ) - { - precachemodel( a[ i ] ); - } + for ( i = 0; i < a.size; i++ ) + precachemodel( a[i] ); } -attachfromarray( a ) //checked matches cerberus output +attachfromarray( a ) { - self attach( codescripts/character::randomelement( a ), "", 1 ); + self attach( codescripts\character::randomelement( a ), "", 1 ); } diff --git a/Multiplayer Core/patch_mp/codescripts/delete.gsc b/Multiplayer Core/patch_mp/codescripts/delete.gsc index 1cc28b2..67cd584 100644 --- a/Multiplayer Core/patch_mp/codescripts/delete.gsc +++ b/Multiplayer Core/patch_mp/codescripts/delete.gsc @@ -1,27 +1,26 @@ +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool -main() //checked changed to match cerberus output +main() { - /* /# - assert( isDefined( self ) ); + assert( isdefined( self ) ); #/ - */ - wait 0; - if ( isDefined( self ) ) - { - /* + wait 0; + + if ( isdefined( self ) ) + { /# - if ( isDefined( self.classname ) ) - { - if ( self.classname == "trigger_once" || self.classname == "trigger_radius" || self.classname == "trigger_multiple" ) - { - println( "" ); - println( "*** trigger debug: delete.gsc is deleting trigger with ent#: " + self getentitynumber() + " at origin: " + self.origin ); - println( "" ); + if ( isdefined( self.classname ) ) + { + if ( self.classname == "trigger_once" || self.classname == "trigger_radius" || self.classname == "trigger_multiple" ) + { + println( "" ); + println( "*** trigger debug: delete.gsc is deleting trigger with ent#: " + self getentitynumber() + " at origin: " + self.origin ); + println( "" ); + } + } #/ - } - } - */ - self delete(); - } + self delete(); + } } diff --git a/Multiplayer Core/patch_mp/codescripts/struct.gsc b/Multiplayer Core/patch_mp/codescripts/struct.gsc index 71b5502..d9c0839 100644 --- a/Multiplayer Core/patch_mp/codescripts/struct.gsc +++ b/Multiplayer Core/patch_mp/codescripts/struct.gsc @@ -1,29 +1,29 @@ +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool -initstructs() //checked matches cerberus output +initstructs() { - level.struct = []; + level.struct = []; } -createstruct() //checked matches cerberus output +createstruct() { - struct = spawnstruct(); - level.struct[ level.struct.size ] = struct; - return struct; + struct = spawnstruct(); + level.struct[level.struct.size] = struct; + return struct; } -findstruct( position ) //checked changed to match cerberus output see info.md +findstruct( position ) { - foreach ( key in level.struct_class_names ) - { - foreach ( s_array in level.struct_class_names[ key ] ) - { - foreach ( struct in s_array ) - { - if(distancesquared( struct.origin, position ) < 1 ) - { - return struct; - } - } - } - } + foreach ( key, _ in level.struct_class_names ) + { + foreach ( val, s_array in level.struct_class_names[key] ) + { + foreach ( struct in s_array ) + { + if ( distancesquared( struct.origin, position ) < 1 ) + return struct; + } + } + } } diff --git a/Multiplayer Core/patch_mp/common_scripts/utility.gsc b/Multiplayer Core/patch_mp/common_scripts/utility.gsc index 256268e..cea261c 100644 --- a/Multiplayer Core/patch_mp/common_scripts/utility.gsc +++ b/Multiplayer Core/patch_mp/common_scripts/utility.gsc @@ -1,2011 +1,1739 @@ +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool init_session_mode_flags() { - level.gamemode_public_match = 0; - level.gamemode_private_match = 1; - level.gamemode_local_splitscreen = 2; - level.gamemode_wager_match = 3; - level.gamemode_theater = 5; - level.gamemode_league_match = 6; - level.gamemode_rts = 7; - level.language = getDvar( "language" ); + level.gamemode_public_match = 0; + level.gamemode_private_match = 1; + level.gamemode_local_splitscreen = 2; + level.gamemode_wager_match = 3; + level.gamemode_theater = 5; + level.gamemode_league_match = 6; + level.gamemode_rts = 7; + level.language = getdvar( "language" ); } empty( a, b, c, d, e ) { + } add_to_array( array, item, allow_dupes ) { - if ( !isDefined( item ) ) - { - return array; - } - if ( !isDefined( allow_dupes ) ) - { - allow_dupes = 1; - } - if ( !isDefined( array ) ) - { - array[ 0 ] = item; - } - else - { - if ( allow_dupes || !isinarray( array, item ) ) - { - array[ array.size ] = item; - } - } - return array; + if ( !isdefined( item ) ) + return array; + + if ( !isdefined( allow_dupes ) ) + allow_dupes = 1; + + if ( !isdefined( array ) ) + array[0] = item; + else if ( allow_dupes || !isinarray( array, item ) ) + array[array.size] = item; + + return array; } array_copy( array ) { - a_copy = []; - _a92 = array; - _k92 = getFirstArrayKey( _a92 ); - while ( isDefined( _k92 ) ) - { - elem = _a92[ _k92 ]; - a_copy[ a_copy.size ] = elem; - _k92 = getNextArrayKey( _a92, _k92 ); - } - return a_copy; + a_copy = []; + + foreach ( elem in array ) + a_copy[a_copy.size] = elem; + + return a_copy; } array_delete( array, is_struct ) { - _a109 = array; - _k109 = getFirstArrayKey( _a109 ); - while ( isDefined( _k109 ) ) - { - ent = _a109[ _k109 ]; - if ( isDefined( is_struct ) && is_struct ) - { - ent structdelete(); - ent = undefined; - } - else - { - if ( isDefined( ent ) ) - { - ent delete(); - } - } - _k109 = getNextArrayKey( _a109, _k109 ); - } + foreach ( ent in array ) + { + if ( isdefined( is_struct ) && is_struct ) + { + ent structdelete(); + ent = undefined; + continue; + } + + if ( isdefined( ent ) ) + ent delete(); + } } array_randomize( array ) { - i = 0; - while ( i < array.size ) - { - j = randomint( array.size ); - temp = array[ i ]; - array[ i ] = array[ j ]; - array[ j ] = temp; - i++; - } - return array; + for ( i = 0; i < array.size; i++ ) + { + j = randomint( array.size ); + temp = array[i]; + array[i] = array[j]; + array[j] = temp; + } + + return array; } array_reverse( array ) { - array2 = []; - i = array.size - 1; - while ( i >= 0 ) - { - array2[ array2.size ] = array[ i ]; - i--; + array2 = []; - } - return array2; + for ( i = array.size - 1; i >= 0; i-- ) + array2[array2.size] = array[i]; + + return array2; } array_exclude( array, arrayexclude ) { - newarray = array; - if ( isarray( arrayexclude ) ) - { - i = 0; - while ( i < arrayexclude.size ) - { - arrayremovevalue( newarray, arrayexclude[ i ] ); - i++; - } - } - else arrayremovevalue( newarray, arrayexclude ); - return newarray; + newarray = array; + + if ( isarray( arrayexclude ) ) + { + for ( i = 0; i < arrayexclude.size; i++ ) + arrayremovevalue( newarray, arrayexclude[i] ); + } + else + arrayremovevalue( newarray, arrayexclude ); + + return newarray; } array_notify( ents, notifier ) { - i = 0; - while ( i < ents.size ) - { - ents[ i ] notify( notifier ); - i++; - } + for ( i = 0; i < ents.size; i++ ) + ents[i] notify( notifier ); } array_wait( array, msg, timeout ) { - keys = getarraykeys( array ); - structs = []; - i = 0; - while ( i < keys.size ) - { - key = keys[ i ]; - structs[ key ] = spawnstruct(); - structs[ key ]._array_wait = 1; - structs[ key ] thread array_waitlogic1( array[ key ], msg, timeout ); - i++; - } - i = 0; - while ( i < keys.size ) - { - key = keys[ i ]; - if ( isDefined( array[ key ] ) && structs[ key ]._array_wait ) - { - structs[ key ] waittill( "_array_wait" ); - } - i++; - } + keys = getarraykeys( array ); + structs = []; + + for ( i = 0; i < keys.size; i++ ) + { + key = keys[i]; + structs[key] = spawnstruct(); + structs[key]._array_wait = 1; + structs[key] thread array_waitlogic1( array[key], msg, timeout ); + } + + for ( i = 0; i < keys.size; i++ ) + { + key = keys[i]; + + if ( isdefined( array[key] ) && structs[key]._array_wait ) + structs[key] waittill( "_array_wait" ); + } } array_wait_any( array, msg, timeout ) { - if ( array.size == 0 ) - { - return undefined; - } - keys = getarraykeys( array ); - structs = []; - internal_msg = msg + "array_wait"; - i = 0; - while ( i < keys.size ) - { - key = keys[ i ]; - structs[ key ] = spawnstruct(); - structs[ key ]._array_wait = 1; - structs[ key ] thread array_waitlogic3( array[ key ], msg, internal_msg, timeout ); - i++; - } - level waittill( internal_msg, ent ); - return ent; + if ( array.size == 0 ) + return undefined; + + keys = getarraykeys( array ); + structs = []; + internal_msg = msg + "array_wait"; + + for ( i = 0; i < keys.size; i++ ) + { + key = keys[i]; + structs[key] = spawnstruct(); + structs[key]._array_wait = 1; + structs[key] thread array_waitlogic3( array[key], msg, internal_msg, timeout ); + } + + level waittill( internal_msg, ent ); + + return ent; } array_waitlogic1( ent, msg, timeout ) { - self array_waitlogic2( ent, msg, timeout ); - self._array_wait = 0; - self notify( "_array_wait" ); + self array_waitlogic2( ent, msg, timeout ); + self._array_wait = 0; + self notify( "_array_wait" ); } array_waitlogic2( ent, msg, timeout ) { - ent endon( msg ); - ent endon( "death" ); - if ( isDefined( timeout ) ) - { - wait timeout; - } - else - { - ent waittill( msg ); - } + ent endon( msg ); + ent endon( "death" ); + + if ( isdefined( timeout ) ) + wait( timeout ); + else + ent waittill( msg ); } array_waitlogic3( ent, msg, internal_msg, timeout ) { - if ( msg != "death" ) - { - ent endon( "death" ); - } - level endon( internal_msg ); - self array_waitlogic2( ent, msg, timeout ); - level notify( internal_msg ); + if ( msg != "death" ) + ent endon( "death" ); + + level endon( internal_msg ); + self array_waitlogic2( ent, msg, timeout ); + level notify( internal_msg, ent ); } array_check_for_dupes( array, single ) { - i = 0; - while ( i < array.size ) - { - if ( array[ i ] == single ) - { - return 0; - } - i++; - } - return 1; + for ( i = 0; i < array.size; i++ ) + { + if ( array[i] == single ) + return false; + } + + return true; } array_swap( array, index1, index2 ) { /# - assert( index1 < array.size, "index1 to swap out of range" ); + assert( index1 < array.size, "index1 to swap out of range" ); #/ /# - assert( index2 < array.size, "index2 to swap out of range" ); + assert( index2 < array.size, "index2 to swap out of range" ); #/ - temp = array[ index1 ]; - array[ index1 ] = array[ index2 ]; - array[ index2 ] = temp; - return array; + temp = array[index1]; + array[index1] = array[index2]; + array[index2] = temp; + return array; } array_average( array ) { /# - assert( isarray( array ) ); + assert( isarray( array ) ); #/ /# - assert( array.size > 0 ); + assert( array.size > 0 ); #/ - total = 0; - i = 0; - while ( i < array.size ) - { - total += array[ i ]; - i++; - } - return total / array.size; + total = 0; + + for ( i = 0; i < array.size; i++ ) + total += array[i]; + + return total / array.size; } array_std_deviation( array, mean ) { /# - assert( isarray( array ) ); + assert( isarray( array ) ); #/ /# - assert( array.size > 0 ); + assert( array.size > 0 ); #/ - tmp = []; - i = 0; - while ( i < array.size ) - { - tmp[ i ] = ( array[ i ] - mean ) * ( array[ i ] - mean ); - i++; - } - total = 0; - i = 0; - while ( i < tmp.size ) - { - total += tmp[ i ]; - i++; - } - return sqrt( total / array.size ); + tmp = []; + + for ( i = 0; i < array.size; i++ ) + tmp[i] = ( array[i] - mean ) * ( array[i] - mean ); + + total = 0; + + for ( i = 0; i < tmp.size; i++ ) + total += tmp[i]; + + return sqrt( total / array.size ); } random_normal_distribution( mean, std_deviation, lower_bound, upper_bound ) { - x1 = 0; - x2 = 0; - w = 1; - y1 = 0; - while ( w >= 1 ) - { - x1 = ( 2 * randomfloatrange( 0, 1 ) ) - 1; - x2 = ( 2 * randomfloatrange( 0, 1 ) ) - 1; - w = ( x1 * x1 ) + ( x2 * x2 ); - } - w = sqrt( ( -2 * log( w ) ) / w ); - y1 = x1 * w; - number = mean + ( y1 * std_deviation ); - if ( isDefined( lower_bound ) && number < lower_bound ) - { - number = lower_bound; - } - if ( isDefined( upper_bound ) && number > upper_bound ) - { - number = upper_bound; - } - return number; + x1 = 0; + x2 = 0; + w = 1; + y1 = 0; + + while ( w >= 1 ) + { + x1 = 2 * randomfloatrange( 0, 1 ) - 1; + x2 = 2 * randomfloatrange( 0, 1 ) - 1; + w = x1 * x1 + x2 * x2; + } + + w = sqrt( -2.0 * log( w ) / w ); + y1 = x1 * w; + number = mean + y1 * std_deviation; + + if ( isdefined( lower_bound ) && number < lower_bound ) + number = lower_bound; + + if ( isdefined( upper_bound ) && number > upper_bound ) + number = upper_bound; + + return number; } random( array ) { - keys = getarraykeys( array ); - return array[ keys[ randomint( keys.size ) ] ]; + keys = getarraykeys( array ); + return array[keys[randomint( keys.size )]]; } get_players( str_team ) { - if ( isDefined( str_team ) ) - { - return getplayers( str_team ); - } - else - { - return getplayers(); - } + if ( isdefined( str_team ) ) + return getplayers( str_team ); + else + return getplayers(); } is_prefix( msg, prefix ) { - if ( prefix.size > msg.size ) - { - return 0; - } - i = 0; - while ( i < prefix.size ) - { - if ( msg[ i ] != prefix[ i ] ) - { - return 0; - } - i++; - } - return 1; + if ( prefix.size > msg.size ) + return false; + + for ( i = 0; i < prefix.size; i++ ) + { + if ( msg[i] != prefix[i] ) + return false; + } + + return true; } is_suffix( msg, suffix ) { - if ( suffix.size > msg.size ) - { - return 0; - } - i = 0; - while ( i < suffix.size ) - { - if ( msg[ ( msg.size - 1 ) - i ] != suffix[ ( suffix.size - 1 ) - i ] ) - { - return 0; - } - i++; - } - return 1; + if ( suffix.size > msg.size ) + return false; + + for ( i = 0; i < suffix.size; i++ ) + { + if ( msg[msg.size - 1 - i] != suffix[suffix.size - 1 - i] ) + return false; + } + + return true; } vector_compare( vec1, vec2 ) { - if ( abs( vec1[ 0 ] - vec2[ 0 ] ) < 0,001 && abs( vec1[ 1 ] - vec2[ 1 ] ) < 0,001 ) - { - return abs( vec1[ 2 ] - vec2[ 2 ] ) < 0,001; - } + return abs( vec1[0] - vec2[0] ) < 0.001 && abs( vec1[1] - vec2[1] ) < 0.001 && abs( vec1[2] - vec2[2] ) < 0.001; } draw_debug_line( start, end, timer ) { /# - i = 0; - while ( i < ( timer * 20 ) ) - { - line( start, end, ( 1, 1, 0,5 ) ); - wait 0,05; - i++; + for ( i = 0; i < timer * 20; i++ ) + { + line( start, end, ( 1, 1, 0.5 ) ); + wait 0.05; + } #/ - } } waittillend( msg ) { - self waittillmatch( msg ); - return "end"; + self waittillmatch( msg, "end" ); } random_vector( max_length ) { - return ( randomfloatrange( -1 * max_length, max_length ), randomfloatrange( -1 * max_length, max_length ), randomfloatrange( -1 * max_length, max_length ) ); + return ( randomfloatrange( -1 * max_length, max_length ), randomfloatrange( -1 * max_length, max_length ), randomfloatrange( -1 * max_length, max_length ) ); } angle_dif( oldangle, newangle ) { - outvalue = ( oldangle - newangle ) % 360; - if ( outvalue < 0 ) - { - outvalue += 360; - } - if ( outvalue > 180 ) - { - outvalue = ( outvalue - 360 ) * -1; - } - return outvalue; + outvalue = ( oldangle - newangle ) % 360; + + if ( outvalue < 0 ) + outvalue += 360; + + if ( outvalue > 180 ) + outvalue = ( outvalue - 360 ) * -1; + + return outvalue; } sign( x ) { - if ( x >= 0 ) - { - return 1; - } - return -1; + if ( x >= 0 ) + return 1; + + return -1; } track( spot_to_track ) { - if ( isDefined( self.current_target ) ) - { - if ( spot_to_track == self.current_target ) - { - return; - } - } - self.current_target = spot_to_track; + if ( isdefined( self.current_target ) ) + { + if ( spot_to_track == self.current_target ) + return; + } + + self.current_target = spot_to_track; } clear_exception( type ) { /# - assert( isDefined( self.exception[ type ] ) ); + assert( isdefined( self.exception[type] ) ); #/ - self.exception[ type ] = anim.defaultexception; + self.exception[type] = anim.defaultexception; } set_exception( type, func ) { /# - assert( isDefined( self.exception[ type ] ) ); + assert( isdefined( self.exception[type] ) ); #/ - self.exception[ type ] = func; + self.exception[type] = func; } set_all_exceptions( exceptionfunc ) { - keys = getarraykeys( self.exception ); - i = 0; - while ( i < keys.size ) - { - self.exception[ keys[ i ] ] = exceptionfunc; - i++; - } + keys = getarraykeys( self.exception ); + + for ( i = 0; i < keys.size; i++ ) + self.exception[keys[i]] = exceptionfunc; } cointoss() { - return randomint( 100 ) >= 50; + return randomint( 100 ) >= 50; } waittill_string( msg, ent ) { - if ( msg != "death" ) - { - self endon( "death" ); - } - ent endon( "die" ); - self waittill( msg ); - ent notify( "returned" ); + if ( msg != "death" ) + self endon( "death" ); + + ent endon( "die" ); + + self waittill( msg ); + + ent notify( "returned", msg ); } waittill_multiple( string1, string2, string3, string4, string5 ) { - self endon( "death" ); - ent = spawnstruct(); - ent.threads = 0; - if ( isDefined( string1 ) ) - { - self thread waittill_string( string1, ent ); - ent.threads++; - } - if ( isDefined( string2 ) ) - { - self thread waittill_string( string2, ent ); - ent.threads++; - } - if ( isDefined( string3 ) ) - { - self thread waittill_string( string3, ent ); - ent.threads++; - } - if ( isDefined( string4 ) ) - { - self thread waittill_string( string4, ent ); - ent.threads++; - } - if ( isDefined( string5 ) ) - { - self thread waittill_string( string5, ent ); - ent.threads++; - } - while ( ent.threads ) - { - ent waittill( "returned" ); - ent.threads--; + self endon( "death" ); + ent = spawnstruct(); + ent.threads = 0; - } - ent notify( "die" ); + if ( isdefined( string1 ) ) + { + self thread waittill_string( string1, ent ); + ent.threads++; + } + + if ( isdefined( string2 ) ) + { + self thread waittill_string( string2, ent ); + ent.threads++; + } + + if ( isdefined( string3 ) ) + { + self thread waittill_string( string3, ent ); + ent.threads++; + } + + if ( isdefined( string4 ) ) + { + self thread waittill_string( string4, ent ); + ent.threads++; + } + + if ( isdefined( string5 ) ) + { + self thread waittill_string( string5, ent ); + ent.threads++; + } + + while ( ent.threads ) + { + ent waittill( "returned" ); + + ent.threads--; + } + + ent notify( "die" ); } waittill_multiple_ents( ent1, string1, ent2, string2, ent3, string3, ent4, string4 ) { - self endon( "death" ); - ent = spawnstruct(); - ent.threads = 0; - if ( isDefined( ent1 ) ) - { -/# - assert( isDefined( string1 ) ); -#/ - ent1 thread waittill_string( string1, ent ); - ent.threads++; - } - if ( isDefined( ent2 ) ) - { -/# - assert( isDefined( string2 ) ); -#/ - ent2 thread waittill_string( string2, ent ); - ent.threads++; - } - if ( isDefined( ent3 ) ) - { -/# - assert( isDefined( string3 ) ); -#/ - ent3 thread waittill_string( string3, ent ); - ent.threads++; - } - if ( isDefined( ent4 ) ) - { -/# - assert( isDefined( string4 ) ); -#/ - ent4 thread waittill_string( string4, ent ); - ent.threads++; - } - while ( ent.threads ) - { - ent waittill( "returned" ); - ent.threads--; + self endon( "death" ); + ent = spawnstruct(); + ent.threads = 0; - } - ent notify( "die" ); + if ( isdefined( ent1 ) ) + { +/# + assert( isdefined( string1 ) ); +#/ + ent1 thread waittill_string( string1, ent ); + ent.threads++; + } + + if ( isdefined( ent2 ) ) + { +/# + assert( isdefined( string2 ) ); +#/ + ent2 thread waittill_string( string2, ent ); + ent.threads++; + } + + if ( isdefined( ent3 ) ) + { +/# + assert( isdefined( string3 ) ); +#/ + ent3 thread waittill_string( string3, ent ); + ent.threads++; + } + + if ( isdefined( ent4 ) ) + { +/# + assert( isdefined( string4 ) ); +#/ + ent4 thread waittill_string( string4, ent ); + ent.threads++; + } + + while ( ent.threads ) + { + ent waittill( "returned" ); + + ent.threads--; + } + + ent notify( "die" ); } waittill_any_return( string1, string2, string3, string4, string5, string6, string7 ) { - if ( isDefined( string1 ) && string1 != "death" && isDefined( string2 ) && string2 != "death" && isDefined( string3 ) && string3 != "death" && isDefined( string4 ) && string4 != "death" && isDefined( string5 ) && string5 != "death" && isDefined( string6 ) && string6 != "death" || !isDefined( string7 ) && string7 != "death" ) - { - self endon( "death" ); - } - ent = spawnstruct(); - if ( isDefined( string1 ) ) - { - self thread waittill_string( string1, ent ); - } - if ( isDefined( string2 ) ) - { - self thread waittill_string( string2, ent ); - } - if ( isDefined( string3 ) ) - { - self thread waittill_string( string3, ent ); - } - if ( isDefined( string4 ) ) - { - self thread waittill_string( string4, ent ); - } - if ( isDefined( string5 ) ) - { - self thread waittill_string( string5, ent ); - } - if ( isDefined( string6 ) ) - { - self thread waittill_string( string6, ent ); - } - if ( isDefined( string7 ) ) - { - self thread waittill_string( string7, ent ); - } - ent waittill( "returned", msg ); - ent notify( "die" ); - return msg; + if ( ( !isdefined( string1 ) || string1 != "death" ) && ( !isdefined( string2 ) || string2 != "death" ) && ( !isdefined( string3 ) || string3 != "death" ) && ( !isdefined( string4 ) || string4 != "death" ) && ( !isdefined( string5 ) || string5 != "death" ) && ( !isdefined( string6 ) || string6 != "death" ) && ( !isdefined( string7 ) || string7 != "death" ) ) + self endon( "death" ); + + ent = spawnstruct(); + + if ( isdefined( string1 ) ) + self thread waittill_string( string1, ent ); + + if ( isdefined( string2 ) ) + self thread waittill_string( string2, ent ); + + if ( isdefined( string3 ) ) + self thread waittill_string( string3, ent ); + + if ( isdefined( string4 ) ) + self thread waittill_string( string4, ent ); + + if ( isdefined( string5 ) ) + self thread waittill_string( string5, ent ); + + if ( isdefined( string6 ) ) + self thread waittill_string( string6, ent ); + + if ( isdefined( string7 ) ) + self thread waittill_string( string7, ent ); + + ent waittill( "returned", msg ); + + ent notify( "die" ); + return msg; } waittill_any_array_return( a_notifies ) { - if ( isinarray( a_notifies, "death" ) ) - { - self endon( "death" ); - } - s_tracker = spawnstruct(); - _a825 = a_notifies; - _k825 = getFirstArrayKey( _a825 ); - while ( isDefined( _k825 ) ) - { - str_notify = _a825[ _k825 ]; - if ( isDefined( str_notify ) ) - { - self thread waittill_string( str_notify, s_tracker ); - } - _k825 = getNextArrayKey( _a825, _k825 ); - } - s_tracker waittill( "returned", msg ); - s_tracker notify( "die" ); - return msg; + if ( isinarray( a_notifies, "death" ) ) + self endon( "death" ); + + s_tracker = spawnstruct(); + + foreach ( str_notify in a_notifies ) + { + if ( isdefined( str_notify ) ) + self thread waittill_string( str_notify, s_tracker ); + } + + s_tracker waittill( "returned", msg ); + + s_tracker notify( "die" ); + return msg; } waittill_any( str_notify1, str_notify2, str_notify3, str_notify4, str_notify5 ) { /# - assert( isDefined( str_notify1 ) ); + assert( isdefined( str_notify1 ) ); #/ - waittill_any_array( array( str_notify1, str_notify2, str_notify3, str_notify4, str_notify5 ) ); + waittill_any_array( array( str_notify1, str_notify2, str_notify3, str_notify4, str_notify5 ) ); } waittill_any_array( a_notifies ) { /# - assert( isDefined( a_notifies[ 0 ] ), "At least the first element has to be defined for waittill_any_array." ); + assert( isdefined( a_notifies[0] ), "At least the first element has to be defined for waittill_any_array." ); #/ - i = 1; - while ( i < a_notifies.size ) - { - if ( isDefined( a_notifies[ i ] ) ) - { - self endon( a_notifies[ i ] ); - } - i++; - } - self waittill( a_notifies[ 0 ] ); + for ( i = 1; i < a_notifies.size; i++ ) + { + if ( isdefined( a_notifies[i] ) ) + self endon( a_notifies[i] ); + } + + self waittill( a_notifies[0] ); } waittill_any_timeout( n_timeout, string1, string2, string3, string4, string5 ) { - if ( isDefined( string1 ) && string1 != "death" && isDefined( string2 ) && string2 != "death" && isDefined( string3 ) && string3 != "death" && isDefined( string4 ) && string4 != "death" || !isDefined( string5 ) && string5 != "death" ) - { - self endon( "death" ); - } - ent = spawnstruct(); - if ( isDefined( string1 ) ) - { - self thread waittill_string( string1, ent ); - } - if ( isDefined( string2 ) ) - { - self thread waittill_string( string2, ent ); - } - if ( isDefined( string3 ) ) - { - self thread waittill_string( string3, ent ); - } - if ( isDefined( string4 ) ) - { - self thread waittill_string( string4, ent ); - } - if ( isDefined( string5 ) ) - { - self thread waittill_string( string5, ent ); - } - ent thread _timeout( n_timeout ); - ent waittill( "returned", msg ); - ent notify( "die" ); - return msg; + if ( ( !isdefined( string1 ) || string1 != "death" ) && ( !isdefined( string2 ) || string2 != "death" ) && ( !isdefined( string3 ) || string3 != "death" ) && ( !isdefined( string4 ) || string4 != "death" ) && ( !isdefined( string5 ) || string5 != "death" ) ) + self endon( "death" ); + + ent = spawnstruct(); + + if ( isdefined( string1 ) ) + self thread waittill_string( string1, ent ); + + if ( isdefined( string2 ) ) + self thread waittill_string( string2, ent ); + + if ( isdefined( string3 ) ) + self thread waittill_string( string3, ent ); + + if ( isdefined( string4 ) ) + self thread waittill_string( string4, ent ); + + if ( isdefined( string5 ) ) + self thread waittill_string( string5, ent ); + + ent thread _timeout( n_timeout ); + + ent waittill( "returned", msg ); + + ent notify( "die" ); + return msg; } _timeout( delay ) { - self endon( "die" ); - wait delay; - self notify( "returned" ); + self endon( "die" ); + wait( delay ); + self notify( "returned", "timeout" ); } waittill_any_ents( ent1, string1, ent2, string2, ent3, string3, ent4, string4, ent5, string5, ent6, string6, ent7, string7 ) { /# - assert( isDefined( ent1 ) ); + assert( isdefined( ent1 ) ); #/ /# - assert( isDefined( string1 ) ); + assert( isdefined( string1 ) ); #/ - if ( isDefined( ent2 ) && isDefined( string2 ) ) - { - ent2 endon( string2 ); - } - if ( isDefined( ent3 ) && isDefined( string3 ) ) - { - ent3 endon( string3 ); - } - if ( isDefined( ent4 ) && isDefined( string4 ) ) - { - ent4 endon( string4 ); - } - if ( isDefined( ent5 ) && isDefined( string5 ) ) - { - ent5 endon( string5 ); - } - if ( isDefined( ent6 ) && isDefined( string6 ) ) - { - ent6 endon( string6 ); - } - if ( isDefined( ent7 ) && isDefined( string7 ) ) - { - ent7 endon( string7 ); - } - ent1 waittill( string1 ); + if ( isdefined( ent2 ) && isdefined( string2 ) ) + ent2 endon( string2 ); + + if ( isdefined( ent3 ) && isdefined( string3 ) ) + ent3 endon( string3 ); + + if ( isdefined( ent4 ) && isdefined( string4 ) ) + ent4 endon( string4 ); + + if ( isdefined( ent5 ) && isdefined( string5 ) ) + ent5 endon( string5 ); + + if ( isdefined( ent6 ) && isdefined( string6 ) ) + ent6 endon( string6 ); + + if ( isdefined( ent7 ) && isdefined( string7 ) ) + ent7 endon( string7 ); + + ent1 waittill( string1 ); } waittill_any_ents_two( ent1, string1, ent2, string2 ) { /# - assert( isDefined( ent1 ) ); + assert( isdefined( ent1 ) ); #/ /# - assert( isDefined( string1 ) ); + assert( isdefined( string1 ) ); #/ - if ( isDefined( ent2 ) && isDefined( string2 ) ) - { - ent2 endon( string2 ); - } - ent1 waittill( string1 ); + if ( isdefined( ent2 ) && isdefined( string2 ) ) + ent2 endon( string2 ); + + ent1 waittill( string1 ); } waittill_flag_exists( msg ) { - while ( !flag_exists( msg ) ) - { - waittillframeend; - if ( flag_exists( msg ) ) - { - return; - } - else - { - wait 0,05; - } - } + while ( !flag_exists( msg ) ) + { + waittillframeend; + + if ( flag_exists( msg ) ) + break; + + wait 0.05; + } } isflashed() { - if ( !isDefined( self.flashendtime ) ) - { - return 0; - } - return getTime() < self.flashendtime; + if ( !isdefined( self.flashendtime ) ) + return 0; + + return gettime() < self.flashendtime; } isstunned() { - if ( !isDefined( self.flashendtime ) ) - { - return 0; - } - return getTime() < self.flashendtime; + if ( !isdefined( self.flashendtime ) ) + return 0; + + return gettime() < self.flashendtime; } flag( flagname ) { /# - assert( isDefined( flagname ), "Tried to check flag but the flag was not defined." ); + assert( isdefined( flagname ), "Tried to check flag but the flag was not defined." ); #/ /# - assert( isDefined( level.flag[ flagname ] ), "Tried to check flag " + flagname + " but the flag was not initialized." ); + assert( isdefined( level.flag[flagname] ), "Tried to check flag " + flagname + " but the flag was not initialized." ); #/ - if ( !level.flag[ flagname ] ) - { - return 0; - } - return 1; + if ( !level.flag[flagname] ) + return false; + + return true; } flag_delete( flagname ) { - if ( isDefined( level.flag[ flagname ] ) ) - { - } - else - { + if ( isdefined( level.flag[flagname] ) ) + level.flag[flagname] = undefined; + else + { /# - println( "flag_delete() called on flag that does not exist: " + flagname ); + println( "flag_delete() called on flag that does not exist: " + flagname ); #/ - } + } } flag_init( flagname, val, b_is_trigger ) { - if ( !isDefined( b_is_trigger ) ) - { - b_is_trigger = 0; - } - if ( !isDefined( level.flag ) ) - { - level.flag = []; - } - if ( !isDefined( level.sp_stat_tracking_func ) ) - { - level.sp_stat_tracking_func = ::empty; - } - if ( !isDefined( level.first_frame ) ) - { + if ( !isdefined( b_is_trigger ) ) + b_is_trigger = 0; + + if ( !isdefined( level.flag ) ) + level.flag = []; + + if ( !isdefined( level.sp_stat_tracking_func ) ) + level.sp_stat_tracking_func = ::empty; + + if ( !isdefined( level.first_frame ) ) + { /# - assert( !isDefined( level.flag[ flagname ] ), "Attempt to reinitialize existing flag: " + flagname ); + assert( !isdefined( level.flag[flagname] ), "Attempt to reinitialize existing flag: " + flagname ); #/ - } - if ( isDefined( val ) && val ) - { - level.flag[ flagname ] = 1; - } - else - { - level.flag[ flagname ] = 0; - } - if ( b_is_trigger ) - { - if ( !isDefined( level.trigger_flags ) ) - { - init_trigger_flags(); - level.trigger_flags[ flagname ] = []; - } - else - { - if ( !isDefined( level.trigger_flags[ flagname ] ) ) - { - level.trigger_flags[ flagname ] = []; - } - } - } - if ( is_suffix( flagname, "aa_" ) ) - { - thread [[ level.sp_stat_tracking_func ]]( flagname ); - } + } + + if ( isdefined( val ) && val ) + level.flag[flagname] = 1; + else + level.flag[flagname] = 0; + + if ( b_is_trigger ) + { + if ( !isdefined( level.trigger_flags ) ) + { + init_trigger_flags(); + level.trigger_flags[flagname] = []; + } + else if ( !isdefined( level.trigger_flags[flagname] ) ) + level.trigger_flags[flagname] = []; + } + + if ( is_suffix( flagname, "aa_" ) ) + thread [[ level.sp_stat_tracking_func ]]( flagname ); } flag_set( flagname ) { /# - assert( isDefined( level.flag[ flagname ] ), "Attempt to set a flag before calling flag_init: " + flagname ); + assert( isdefined( level.flag[flagname] ), "Attempt to set a flag before calling flag_init: " + flagname ); #/ - level.flag[ flagname ] = 1; - level notify( flagname ); - set_trigger_flag_permissions( flagname ); + level.flag[flagname] = 1; + level notify( flagname ); + set_trigger_flag_permissions( flagname ); } flag_set_for_time( n_time, str_flag ) { - level notify( "set_flag_for_time:" + str_flag ); - flag_set( str_flag ); - level endon( "set_flag_for_time:" + str_flag ); - wait n_time; - flag_clear( str_flag ); + level notify( "set_flag_for_time:" + str_flag ); + flag_set( str_flag ); + level endon( "set_flag_for_time:" + str_flag ); + wait( n_time ); + flag_clear( str_flag ); } flag_toggle( flagname ) { - if ( flag( flagname ) ) - { - flag_clear( flagname ); - } - else - { - flag_set( flagname ); - } + if ( flag( flagname ) ) + flag_clear( flagname ); + else + flag_set( flagname ); } flag_wait( flagname ) { - level waittill_flag_exists( flagname ); - while ( !level.flag[ flagname ] ) - { - level waittill( flagname ); - } + level waittill_flag_exists( flagname ); + + while ( !level.flag[flagname] ) + level waittill( flagname ); } flag_wait_any( str_flag1, str_flag2, str_flag3, str_flag4, str_flag5 ) { - level flag_wait_any_array( array( str_flag1, str_flag2, str_flag3, str_flag4, str_flag5 ) ); + level flag_wait_any_array( array( str_flag1, str_flag2, str_flag3, str_flag4, str_flag5 ) ); } flag_wait_any_array( a_flags ) { - while ( 1 ) - { - i = 0; - while ( i < a_flags.size ) - { - if ( flag( a_flags[ i ] ) ) - { - return a_flags[ i ]; - } - i++; - } - level waittill_any_array( a_flags ); - } + while ( true ) + { + for ( i = 0; i < a_flags.size; i++ ) + { + if ( flag( a_flags[i] ) ) + return a_flags[i]; + } + + level waittill_any_array( a_flags ); + } } flag_clear( flagname ) { /# - assert( isDefined( level.flag[ flagname ] ), "Attempt to set a flag before calling flag_init: " + flagname ); + assert( isdefined( level.flag[flagname] ), "Attempt to set a flag before calling flag_init: " + flagname ); #/ - if ( level.flag[ flagname ] ) - { - level.flag[ flagname ] = 0; - level notify( flagname ); - set_trigger_flag_permissions( flagname ); - } + if ( level.flag[flagname] ) + { + level.flag[flagname] = 0; + level notify( flagname ); + set_trigger_flag_permissions( flagname ); + } } flag_waitopen( flagname ) { - while ( level.flag[ flagname ] ) - { - level waittill( flagname ); - } + while ( level.flag[flagname] ) + level waittill( flagname ); } flag_waitopen_array( a_flags ) { - _a1324 = a_flags; - _k1324 = getFirstArrayKey( _a1324 ); - while ( isDefined( _k1324 ) ) - { - str_flag = _a1324[ _k1324 ]; - if ( flag( str_flag ) ) - { - flag_waitopen( str_flag ); - break; - } - _k1324 = getNextArrayKey( _a1324, _k1324 ); - } + foreach ( str_flag in a_flags ) + { + if ( flag( str_flag ) ) + { + flag_waitopen( str_flag ); + continue; + } + } } flag_exists( flagname ) { - if ( self == level ) - { - if ( !isDefined( level.flag ) ) - { - return 0; - } - if ( isDefined( level.flag[ flagname ] ) ) - { - return 1; - } - } - else - { - if ( !isDefined( self.ent_flag ) ) - { - return 0; - } - if ( isDefined( self.ent_flag[ flagname ] ) ) - { - return 1; - } - } - return 0; + if ( self == level ) + { + if ( !isdefined( level.flag ) ) + return false; + + if ( isdefined( level.flag[flagname] ) ) + return true; + } + else + { + if ( !isdefined( self.ent_flag ) ) + return false; + + if ( isdefined( self.ent_flag[flagname] ) ) + return true; + } + + return false; } script_gen_dump_addline( string, signature ) { - if ( !isDefined( string ) ) - { - string = "nowrite"; - } - if ( !isDefined( level._loadstarted ) ) - { - if ( !isDefined( level.script_gen_dump_preload ) ) - { - level.script_gen_dump_preload = []; - } - struct = spawnstruct(); - struct.string = string; - struct.signature = signature; - level.script_gen_dump_preload[ level.script_gen_dump_preload.size ] = struct; - return; - } - if ( !isDefined( level.script_gen_dump[ signature ] ) ) - { - level.script_gen_dump_reasons[ level.script_gen_dump_reasons.size ] = "Added: " + string; - } - level.script_gen_dump[ signature ] = string; - level.script_gen_dump2[ signature ] = string; + if ( !isdefined( string ) ) + string = "nowrite"; + + if ( !isdefined( level._loadstarted ) ) + { + if ( !isdefined( level.script_gen_dump_preload ) ) + level.script_gen_dump_preload = []; + + struct = spawnstruct(); + struct.string = string; + struct.signature = signature; + level.script_gen_dump_preload[level.script_gen_dump_preload.size] = struct; + return; + } + + if ( !isdefined( level.script_gen_dump[signature] ) ) + level.script_gen_dump_reasons[level.script_gen_dump_reasons.size] = "Added: " + string; + + level.script_gen_dump[signature] = string; + level.script_gen_dump2[signature] = string; } array_func( entities, func, arg1, arg2, arg3, arg4, arg5, arg6 ) { - if ( !isDefined( entities ) ) - { - return; - } - if ( isarray( entities ) ) - { - while ( entities.size ) - { - keys = getarraykeys( entities ); - i = 0; - while ( i < keys.size ) - { - single_func( entities[ keys[ i ] ], func, arg1, arg2, arg3, arg4, arg5, arg6 ); - i++; - } - } - } - else single_func( entities, func, arg1, arg2, arg3, arg4, arg5, arg6 ); + if ( !isdefined( entities ) ) + return; + + if ( isarray( entities ) ) + { + if ( entities.size ) + { + keys = getarraykeys( entities ); + + for ( i = 0; i < keys.size; i++ ) + single_func( entities[keys[i]], func, arg1, arg2, arg3, arg4, arg5, arg6 ); + } + } + else + single_func( entities, func, arg1, arg2, arg3, arg4, arg5, arg6 ); } single_func( entity, func, arg1, arg2, arg3, arg4, arg5, arg6 ) { - if ( !isDefined( entity ) ) - { - entity = level; - } - if ( isDefined( arg6 ) ) - { - return entity [[ func ]]( arg1, arg2, arg3, arg4, arg5, arg6 ); - } - else - { - if ( isDefined( arg5 ) ) - { - return entity [[ func ]]( arg1, arg2, arg3, arg4, arg5 ); - } - else - { - if ( isDefined( arg4 ) ) - { - return entity [[ func ]]( arg1, arg2, arg3, arg4 ); - } - else - { - if ( isDefined( arg3 ) ) - { - return entity [[ func ]]( arg1, arg2, arg3 ); - } - else - { - if ( isDefined( arg2 ) ) - { - return entity [[ func ]]( arg1, arg2 ); - } - else - { - if ( isDefined( arg1 ) ) - { - return entity [[ func ]]( arg1 ); - } - else - { - return entity [[ func ]](); - } - } - } - } - } - } + if ( !isdefined( entity ) ) + entity = level; + + if ( isdefined( arg6 ) ) + return entity [[ func ]]( arg1, arg2, arg3, arg4, arg5, arg6 ); + else if ( isdefined( arg5 ) ) + return entity [[ func ]]( arg1, arg2, arg3, arg4, arg5 ); + else if ( isdefined( arg4 ) ) + return entity [[ func ]]( arg1, arg2, arg3, arg4 ); + else if ( isdefined( arg3 ) ) + return entity [[ func ]]( arg1, arg2, arg3 ); + else if ( isdefined( arg2 ) ) + return entity [[ func ]]( arg1, arg2 ); + else if ( isdefined( arg1 ) ) + return entity [[ func ]]( arg1 ); + else + return entity [[ func ]](); } new_func( func, arg1, arg2, arg3, arg4, arg5, arg6 ) { - s_func = spawnstruct(); - s_func.func = func; - s_func.arg1 = arg1; - s_func.arg2 = arg2; - s_func.arg3 = arg3; - s_func.arg4 = arg4; - s_func.arg5 = arg5; - s_func.arg6 = arg6; - return s_func; + s_func = spawnstruct(); + s_func.func = func; + s_func.arg1 = arg1; + s_func.arg2 = arg2; + s_func.arg3 = arg3; + s_func.arg4 = arg4; + s_func.arg5 = arg5; + s_func.arg6 = arg6; + return s_func; } call_func( s_func ) { - return single_func( self, s_func.func, s_func.arg1, s_func.arg2, s_func.arg3, s_func.arg4, s_func.arg5, s_func.arg6 ); + return single_func( self, s_func.func, s_func.arg1, s_func.arg2, s_func.arg3, s_func.arg4, s_func.arg5, s_func.arg6 ); } array_thread( entities, func, arg1, arg2, arg3, arg4, arg5, arg6 ) { /# - assert( isDefined( entities ), "Undefined entity array passed to common_scriptsutility::array_thread" ); + assert( isdefined( entities ), "Undefined entity array passed to common_scriptsutility::array_thread" ); #/ /# - assert( isDefined( func ), "Undefined function passed to common_scriptsutility::array_thread" ); + assert( isdefined( func ), "Undefined function passed to common_scriptsutility::array_thread" ); #/ - if ( isarray( entities ) ) - { - if ( isDefined( arg6 ) ) - { - _a1554 = entities; - _k1554 = getFirstArrayKey( _a1554 ); - while ( isDefined( _k1554 ) ) - { - ent = _a1554[ _k1554 ]; - ent thread [[ func ]]( arg1, arg2, arg3, arg4, arg5, arg6 ); - _k1554 = getNextArrayKey( _a1554, _k1554 ); - } - } - else if ( isDefined( arg5 ) ) - { - _a1561 = entities; - _k1561 = getFirstArrayKey( _a1561 ); - while ( isDefined( _k1561 ) ) - { - ent = _a1561[ _k1561 ]; - ent thread [[ func ]]( arg1, arg2, arg3, arg4, arg5 ); - _k1561 = getNextArrayKey( _a1561, _k1561 ); - } - } - else if ( isDefined( arg4 ) ) - { - _a1568 = entities; - _k1568 = getFirstArrayKey( _a1568 ); - while ( isDefined( _k1568 ) ) - { - ent = _a1568[ _k1568 ]; - ent thread [[ func ]]( arg1, arg2, arg3, arg4 ); - _k1568 = getNextArrayKey( _a1568, _k1568 ); - } - } - else if ( isDefined( arg3 ) ) - { - _a1575 = entities; - _k1575 = getFirstArrayKey( _a1575 ); - while ( isDefined( _k1575 ) ) - { - ent = _a1575[ _k1575 ]; - ent thread [[ func ]]( arg1, arg2, arg3 ); - _k1575 = getNextArrayKey( _a1575, _k1575 ); - } - } - else if ( isDefined( arg2 ) ) - { - _a1582 = entities; - _k1582 = getFirstArrayKey( _a1582 ); - while ( isDefined( _k1582 ) ) - { - ent = _a1582[ _k1582 ]; - ent thread [[ func ]]( arg1, arg2 ); - _k1582 = getNextArrayKey( _a1582, _k1582 ); - } - } - else if ( isDefined( arg1 ) ) - { - _a1589 = entities; - _k1589 = getFirstArrayKey( _a1589 ); - while ( isDefined( _k1589 ) ) - { - ent = _a1589[ _k1589 ]; - ent thread [[ func ]]( arg1 ); - _k1589 = getNextArrayKey( _a1589, _k1589 ); - } - } - else _a1596 = entities; - _k1596 = getFirstArrayKey( _a1596 ); - while ( isDefined( _k1596 ) ) - { - ent = _a1596[ _k1596 ]; - ent thread [[ func ]](); - _k1596 = getNextArrayKey( _a1596, _k1596 ); - } - } - else single_thread( entities, func, arg1, arg2, arg3, arg4, arg5, arg6 ); + if ( isarray( entities ) ) + { + if ( isdefined( arg6 ) ) + { + foreach ( ent in entities ) + ent thread [[ func ]]( arg1, arg2, arg3, arg4, arg5, arg6 ); + } + else if ( isdefined( arg5 ) ) + { + foreach ( ent in entities ) + ent thread [[ func ]]( arg1, arg2, arg3, arg4, arg5 ); + } + else if ( isdefined( arg4 ) ) + { + foreach ( ent in entities ) + ent thread [[ func ]]( arg1, arg2, arg3, arg4 ); + } + else if ( isdefined( arg3 ) ) + { + foreach ( ent in entities ) + ent thread [[ func ]]( arg1, arg2, arg3 ); + } + else if ( isdefined( arg2 ) ) + { + foreach ( ent in entities ) + ent thread [[ func ]]( arg1, arg2 ); + } + else if ( isdefined( arg1 ) ) + { + foreach ( ent in entities ) + ent thread [[ func ]]( arg1 ); + } + else + { + foreach ( ent in entities ) + ent thread [[ func ]](); + } + } + else + single_thread( entities, func, arg1, arg2, arg3, arg4, arg5, arg6 ); } array_ent_thread( entities, func, arg1, arg2, arg3, arg4, arg5 ) { /# - assert( isDefined( entities ), "Undefined entity array passed to common_scriptsutility::array_ent_thread" ); + assert( isdefined( entities ), "Undefined entity array passed to common_scriptsutility::array_ent_thread" ); #/ /# - assert( isDefined( func ), "Undefined function passed to common_scriptsutility::array_ent_thread" ); + assert( isdefined( func ), "Undefined function passed to common_scriptsutility::array_ent_thread" ); #/ - if ( isarray( entities ) ) - { - while ( entities.size ) - { - keys = getarraykeys( entities ); - i = 0; - while ( i < keys.size ) - { - single_thread( self, func, entities[ keys[ i ] ], arg1, arg2, arg3, arg4, arg5 ); - i++; - } - } - } - else single_thread( self, func, entities, arg1, arg2, arg3, arg4, arg5 ); + if ( isarray( entities ) ) + { + if ( entities.size ) + { + keys = getarraykeys( entities ); + + for ( i = 0; i < keys.size; i++ ) + single_thread( self, func, entities[keys[i]], arg1, arg2, arg3, arg4, arg5 ); + } + } + else + single_thread( self, func, entities, arg1, arg2, arg3, arg4, arg5 ); } single_thread( entity, func, arg1, arg2, arg3, arg4, arg5, arg6 ) { /# - assert( isDefined( entity ), "Undefined entity passed to common_scriptsutility::single_thread()" ); + assert( isdefined( entity ), "Undefined entity passed to common_scriptsutility::single_thread()" ); #/ - if ( isDefined( arg6 ) ) - { - entity thread [[ func ]]( arg1, arg2, arg3, arg4, arg5, arg6 ); - } - else if ( isDefined( arg5 ) ) - { - entity thread [[ func ]]( arg1, arg2, arg3, arg4, arg5 ); - } - else if ( isDefined( arg4 ) ) - { - entity thread [[ func ]]( arg1, arg2, arg3, arg4 ); - } - else if ( isDefined( arg3 ) ) - { - entity thread [[ func ]]( arg1, arg2, arg3 ); - } - else if ( isDefined( arg2 ) ) - { - entity thread [[ func ]]( arg1, arg2 ); - } - else if ( isDefined( arg1 ) ) - { - entity thread [[ func ]]( arg1 ); - } - else - { - entity thread [[ func ]](); - } + if ( isdefined( arg6 ) ) + entity thread [[ func ]]( arg1, arg2, arg3, arg4, arg5, arg6 ); + else if ( isdefined( arg5 ) ) + entity thread [[ func ]]( arg1, arg2, arg3, arg4, arg5 ); + else if ( isdefined( arg4 ) ) + entity thread [[ func ]]( arg1, arg2, arg3, arg4 ); + else if ( isdefined( arg3 ) ) + entity thread [[ func ]]( arg1, arg2, arg3 ); + else if ( isdefined( arg2 ) ) + entity thread [[ func ]]( arg1, arg2 ); + else if ( isdefined( arg1 ) ) + entity thread [[ func ]]( arg1 ); + else + entity thread [[ func ]](); } remove_undefined_from_array( array ) { - newarray = []; - i = 0; - while ( i < array.size ) - { - if ( !isDefined( array[ i ] ) ) - { - i++; - continue; - } - else - { - newarray[ newarray.size ] = array[ i ]; - } - i++; - } - return newarray; + newarray = []; + + for ( i = 0; i < array.size; i++ ) + { + if ( !isdefined( array[i] ) ) + continue; + + newarray[newarray.size] = array[i]; + } + + return newarray; } trigger_on( name, type ) { - if ( isDefined( name ) ) - { - if ( !isDefined( type ) ) - { - type = "targetname"; - } - ents = getentarray( name, type ); - array_thread( ents, ::trigger_on_proc ); - } - else - { - self trigger_on_proc(); - } + if ( isdefined( name ) ) + { + if ( !isdefined( type ) ) + type = "targetname"; + + ents = getentarray( name, type ); + array_thread( ents, ::trigger_on_proc ); + } + else + self trigger_on_proc(); } trigger_on_proc() { - if ( isDefined( self.realorigin ) ) - { - self.origin = self.realorigin; - } - self.trigger_off = undefined; + if ( isdefined( self.realorigin ) ) + self.origin = self.realorigin; + + self.trigger_off = undefined; } trigger_off( name, type ) { - if ( isDefined( name ) ) - { - if ( !isDefined( type ) ) - { - type = "targetname"; - } - ents = getentarray( name, type ); - array_thread( ents, ::trigger_off_proc ); - } - else - { - self trigger_off_proc(); - } + if ( isdefined( name ) ) + { + if ( !isdefined( type ) ) + type = "targetname"; + + ents = getentarray( name, type ); + array_thread( ents, ::trigger_off_proc ); + } + else + self trigger_off_proc(); } trigger_off_proc() { - if ( !isDefined( self.trigger_off ) || !self.trigger_off ) - { - self.realorigin = self.origin; - self.origin += vectorScale( ( 0, 0, -1 ), 10000 ); - self.trigger_off = 1; - } + if ( !isdefined( self.trigger_off ) || !self.trigger_off ) + { + self.realorigin = self.origin; + self.origin += vectorscale( ( 0, 0, -1 ), 10000.0 ); + self.trigger_off = 1; + } } trigger_wait( str_name, str_key, e_entity ) { - if ( !isDefined( str_key ) ) - { - str_key = "targetname"; - } - if ( isDefined( str_name ) ) - { - triggers = getentarray( str_name, str_key ); + if ( !isdefined( str_key ) ) + str_key = "targetname"; + + if ( isdefined( str_name ) ) + { + triggers = getentarray( str_name, str_key ); /# - assert( triggers.size > 0, "trigger not found: " + str_name + " key: " + str_key ); + assert( triggers.size > 0, "trigger not found: " + str_name + " key: " + str_key ); #/ - if ( triggers.size == 1 ) - { - trigger_hit = triggers[ 0 ]; - trigger_hit _trigger_wait( e_entity ); - } - else - { - s_tracker = spawnstruct(); - array_thread( triggers, ::_trigger_wait_think, s_tracker, e_entity ); - s_tracker waittill( "trigger", e_other, trigger_hit ); - trigger_hit.who = e_other; - } - level notify( str_name ); - return trigger_hit; - } - else - { - return _trigger_wait( e_entity ); - } + if ( triggers.size == 1 ) + { + trigger_hit = triggers[0]; + trigger_hit _trigger_wait( e_entity ); + } + else + { + s_tracker = spawnstruct(); + array_thread( triggers, ::_trigger_wait_think, s_tracker, e_entity ); + + s_tracker waittill( "trigger", e_other, trigger_hit ); + + trigger_hit.who = e_other; + } + + level notify( str_name, trigger_hit.who ); + return trigger_hit; + } + else + return _trigger_wait( e_entity ); } _trigger_wait( e_entity ) { - if ( is_look_trigger( self ) ) - { - self waittill( "trigger_look", e_other ); - } - else - { - self waittill( "trigger", e_other ); - } - if ( isDefined( e_entity )self.who = e_other; - return self; + do + { + if ( is_look_trigger( self ) ) + { + self waittill( "trigger_look", e_other ); + + continue; + } + + self waittill( "trigger", e_other ); + } + while ( isdefined( e_entity ) && e_other != e_entity ); + + self.who = e_other; + return self; } _trigger_wait_think( s_tracker, e_entity ) { - self endon( "death" ); - s_tracker endon( "trigger" ); - e_other = _trigger_wait( e_entity ); - s_tracker notify( "trigger" ); + self endon( "death" ); + s_tracker endon( "trigger" ); + e_other = _trigger_wait( e_entity ); + s_tracker notify( "trigger", e_other, self ); } trigger_use( str_name, str_key, ent, b_assert ) { - if ( !isDefined( str_key ) ) - { - str_key = "targetname"; - } - if ( !isDefined( b_assert ) ) - { - b_assert = 1; - } - if ( !isDefined( ent ) ) - { - ent = get_players()[ 0 ]; - } - if ( isDefined( str_name ) ) - { - e_trig = getent( str_name, str_key ); - if ( !isDefined( e_trig ) ) - { - if ( b_assert ) - { + if ( !isdefined( str_key ) ) + str_key = "targetname"; + + if ( !isdefined( b_assert ) ) + b_assert = 1; + + if ( !isdefined( ent ) ) + ent = get_players()[0]; + + if ( isdefined( str_name ) ) + { + e_trig = getent( str_name, str_key ); + + if ( !isdefined( e_trig ) ) + { + if ( b_assert ) + { /# - assertmsg( "trigger not found: " + str_name + " key: " + str_key ); + assertmsg( "trigger not found: " + str_name + " key: " + str_key ); #/ - } - return; - } - } - else - { - e_trig = self; - str_name = self.targetname; - } - e_trig useby( ent ); - level notify( str_name ); - if ( is_look_trigger( e_trig ) ) - { - e_trig notify( "trigger_look" ); - } - return e_trig; + } + + return; + } + } + else + { + e_trig = self; + str_name = self.targetname; + } + + e_trig useby( ent ); + level notify( str_name, ent ); + + if ( is_look_trigger( e_trig ) ) + e_trig notify( "trigger_look" ); + + return e_trig; } set_trigger_flag_permissions( msg ) { - if ( !isDefined( level.trigger_flags ) || !isDefined( level.trigger_flags[ msg ] ) ) - { - return; - } - level.trigger_flags[ msg ] = remove_undefined_from_array( level.trigger_flags[ msg ] ); - array_thread( level.trigger_flags[ msg ], ::update_trigger_based_on_flags ); + if ( !isdefined( level.trigger_flags ) || !isdefined( level.trigger_flags[msg] ) ) + return; + + level.trigger_flags[msg] = remove_undefined_from_array( level.trigger_flags[msg] ); + array_thread( level.trigger_flags[msg], ::update_trigger_based_on_flags ); } update_trigger_based_on_flags() { - true_on = 1; - while ( isDefined( self.script_flag_true ) ) - { - true_on = 0; - tokens = create_flags_and_return_tokens( self.script_flag_true ); - i = 0; - while ( i < tokens.size ) - { - if ( flag( tokens[ i ] ) ) - { - true_on = 1; - break; - } - else - { - i++; - } - } - } - false_on = 1; - while ( isDefined( self.script_flag_false ) ) - { - tokens = create_flags_and_return_tokens( self.script_flag_false ); - i = 0; - while ( i < tokens.size ) - { - if ( flag( tokens[ i ] ) ) - { - false_on = 0; - break; - } - else - { - i++; - } - } - } - if ( true_on ) - { - [[ level.trigger_func[ false_on ] ]](); - } + true_on = 1; + + if ( isdefined( self.script_flag_true ) ) + { + true_on = 0; + tokens = create_flags_and_return_tokens( self.script_flag_true ); + + for ( i = 0; i < tokens.size; i++ ) + { + if ( flag( tokens[i] ) ) + { + true_on = 1; + break; + } + } + } + + false_on = 1; + + if ( isdefined( self.script_flag_false ) ) + { + tokens = create_flags_and_return_tokens( self.script_flag_false ); + + for ( i = 0; i < tokens.size; i++ ) + { + if ( flag( tokens[i] ) ) + { + false_on = 0; + break; + } + } + } + + [[ level.trigger_func[true_on && false_on] ]](); } create_flags_and_return_tokens( flags ) { - tokens = strtok( flags, " " ); - i = 0; - while ( i < tokens.size ) - { - if ( !isDefined( level.flag[ tokens[ i ] ] ) ) - { - flag_init( tokens[ i ], undefined, 1 ); - } - i++; - } - return tokens; + tokens = strtok( flags, " " ); + + for ( i = 0; i < tokens.size; i++ ) + { + if ( !isdefined( level.flag[tokens[i]] ) ) + flag_init( tokens[i], undefined, 1 ); + } + + return tokens; } init_trigger_flags() { - level.trigger_flags = []; - level.trigger_func[ 1 ] = ::trigger_on; - level.trigger_func[ 0 ] = ::trigger_off; + level.trigger_flags = []; + level.trigger_func[1] = ::trigger_on; + level.trigger_func[0] = ::trigger_off; } is_look_trigger( trig ) { - if ( isDefined( trig ) ) - { - if ( trig has_spawnflag( 256 ) ) - { - if ( !isDefined( trig.classname ) && isDefined( "trigger_damage" ) && isDefined( trig.classname ) && isDefined( "trigger_damage" )} - } - else - { - } - return 0; + return isdefined( trig ) ? trig has_spawnflag( 256 ) && !( !isdefined( trig.classname ) && !isdefined( "trigger_damage" ) || isdefined( trig.classname ) && isdefined( "trigger_damage" ) && trig.classname == "trigger_damage" ) : 0; } is_trigger_once( trig ) { - if ( isDefined( trig ) ) - { - if ( !trig has_spawnflag( 1024 ) ) - { - if ( !isDefined( self.classname ) && isDefined( "trigger_once" ) ) - { - if ( isDefined( self.classname ) && isDefined( "trigger_once" ) ) - { - } - } - } - } - else - { - } - return 0; + return isdefined( trig ) ? trig has_spawnflag( 1024 ) || !isdefined( self.classname ) && !isdefined( "trigger_once" ) || isdefined( self.classname ) && isdefined( "trigger_once" ) && self.classname == "trigger_once" : 0; } getstruct( name, type ) { - if ( !isDefined( type ) ) - { - type = "targetname"; - } + if ( !isdefined( type ) ) + type = "targetname"; /# - assert( isDefined( level.struct_class_names ), "Tried to getstruct before the structs were init" ); + assert( isdefined( level.struct_class_names ), "Tried to getstruct before the structs were init" ); #/ - array = level.struct_class_names[ type ][ name ]; - if ( !isDefined( array ) ) - { - return undefined; - } - if ( array.size > 1 ) - { + array = level.struct_class_names[type][name]; + + if ( !isdefined( array ) ) + return undefined; + + if ( array.size > 1 ) + { /# - assertmsg( "getstruct used for more than one struct of type " + type + " called " + name + "." ); + assertmsg( "getstruct used for more than one struct of type " + type + " called " + name + "." ); #/ - return undefined; - } - return array[ 0 ]; + return undefined; + } + + return array[0]; } getstructarray( name, type ) { - if ( !isDefined( type ) ) - { - type = "targetname"; - } + if ( !isdefined( type ) ) + type = "targetname"; /# - assert( isDefined( level.struct_class_names ), "Tried to getstruct before the structs were init" ); + assert( isdefined( level.struct_class_names ), "Tried to getstruct before the structs were init" ); #/ - array = level.struct_class_names[ type ][ name ]; - if ( !isDefined( array ) ) - { - return []; - } - return array; + array = level.struct_class_names[type][name]; + + if ( !isdefined( array ) ) + return []; + + return array; } structdelete() { - if ( isDefined( self.target ) && isDefined( level.struct_class_names[ "target" ][ self.target ] ) ) - { - } - if ( isDefined( self.targetname ) && isDefined( level.struct_class_names[ "targetname" ][ self.targetname ] ) ) - { - } - if ( isDefined( self.script_noteworthy ) && isDefined( level.struct_class_names[ "script_noteworthy" ][ self.script_noteworthy ] ) ) - { - } - if ( isDefined( self.script_linkname ) && isDefined( level.struct_class_names[ "script_linkname" ][ self.script_linkname ] ) ) - { - } + if ( isdefined( self.target ) && isdefined( level.struct_class_names["target"][self.target] ) ) + level.struct_class_names["target"][self.target] = undefined; + + if ( isdefined( self.targetname ) && isdefined( level.struct_class_names["targetname"][self.targetname] ) ) + level.struct_class_names["targetname"][self.targetname] = undefined; + + if ( isdefined( self.script_noteworthy ) && isdefined( level.struct_class_names["script_noteworthy"][self.script_noteworthy] ) ) + level.struct_class_names["script_noteworthy"][self.script_noteworthy] = undefined; + + if ( isdefined( self.script_linkname ) && isdefined( level.struct_class_names["script_linkname"][self.script_linkname] ) ) + level.struct_class_names["script_linkname"][self.script_linkname] = undefined; } struct_class_init() { /# - assert( !isDefined( level.struct_class_names ), "level.struct_class_names is being initialized in the wrong place! It shouldn't be initialized yet." ); + assert( !isdefined( level.struct_class_names ), "level.struct_class_names is being initialized in the wrong place! It shouldn't be initialized yet." ); #/ - level.struct_class_names = []; - level.struct_class_names[ "target" ] = []; - level.struct_class_names[ "targetname" ] = []; - level.struct_class_names[ "script_noteworthy" ] = []; - level.struct_class_names[ "script_linkname" ] = []; - level.struct_class_names[ "script_unitrigger_type" ] = []; - _a2064 = level.struct; - _k2064 = getFirstArrayKey( _a2064 ); - while ( isDefined( _k2064 ) ) - { - s_struct = _a2064[ _k2064 ]; - if ( isDefined( s_struct.targetname ) ) - { - if ( !isDefined( level.struct_class_names[ "targetname" ][ s_struct.targetname ] ) ) - { - level.struct_class_names[ "targetname" ][ s_struct.targetname ] = []; - } - size = level.struct_class_names[ "targetname" ][ s_struct.targetname ].size; - level.struct_class_names[ "targetname" ][ s_struct.targetname ][ size ] = s_struct; - } - if ( isDefined( s_struct.target ) ) - { - if ( !isDefined( level.struct_class_names[ "target" ][ s_struct.target ] ) ) - { - level.struct_class_names[ "target" ][ s_struct.target ] = []; - } - size = level.struct_class_names[ "target" ][ s_struct.target ].size; - level.struct_class_names[ "target" ][ s_struct.target ][ size ] = s_struct; - } - if ( isDefined( s_struct.script_noteworthy ) ) - { - if ( !isDefined( level.struct_class_names[ "script_noteworthy" ][ s_struct.script_noteworthy ] ) ) - { - level.struct_class_names[ "script_noteworthy" ][ s_struct.script_noteworthy ] = []; - } - size = level.struct_class_names[ "script_noteworthy" ][ s_struct.script_noteworthy ].size; - level.struct_class_names[ "script_noteworthy" ][ s_struct.script_noteworthy ][ size ] = s_struct; - } - if ( isDefined( s_struct.script_linkname ) ) - { + level.struct_class_names = []; + level.struct_class_names["target"] = []; + level.struct_class_names["targetname"] = []; + level.struct_class_names["script_noteworthy"] = []; + level.struct_class_names["script_linkname"] = []; + level.struct_class_names["script_unitrigger_type"] = []; + + foreach ( s_struct in level.struct ) + { + if ( isdefined( s_struct.targetname ) ) + { + if ( !isdefined( level.struct_class_names["targetname"][s_struct.targetname] ) ) + level.struct_class_names["targetname"][s_struct.targetname] = []; + + size = level.struct_class_names["targetname"][s_struct.targetname].size; + level.struct_class_names["targetname"][s_struct.targetname][size] = s_struct; + } + + if ( isdefined( s_struct.target ) ) + { + if ( !isdefined( level.struct_class_names["target"][s_struct.target] ) ) + level.struct_class_names["target"][s_struct.target] = []; + + size = level.struct_class_names["target"][s_struct.target].size; + level.struct_class_names["target"][s_struct.target][size] = s_struct; + } + + if ( isdefined( s_struct.script_noteworthy ) ) + { + if ( !isdefined( level.struct_class_names["script_noteworthy"][s_struct.script_noteworthy] ) ) + level.struct_class_names["script_noteworthy"][s_struct.script_noteworthy] = []; + + size = level.struct_class_names["script_noteworthy"][s_struct.script_noteworthy].size; + level.struct_class_names["script_noteworthy"][s_struct.script_noteworthy][size] = s_struct; + } + + if ( isdefined( s_struct.script_linkname ) ) + { /# - assert( !isDefined( level.struct_class_names[ "script_linkname" ][ s_struct.script_linkname ] ), "Two structs have the same linkname" ); + assert( !isdefined( level.struct_class_names["script_linkname"][s_struct.script_linkname] ), "Two structs have the same linkname" ); #/ - level.struct_class_names[ "script_linkname" ][ s_struct.script_linkname ][ 0 ] = s_struct; - } - if ( isDefined( s_struct.script_unitrigger_type ) ) - { - if ( !isDefined( level.struct_class_names[ "script_unitrigger_type" ][ s_struct.script_unitrigger_type ] ) ) - { - level.struct_class_names[ "script_unitrigger_type" ][ s_struct.script_unitrigger_type ] = []; - } - size = level.struct_class_names[ "script_unitrigger_type" ][ s_struct.script_unitrigger_type ].size; - level.struct_class_names[ "script_unitrigger_type" ][ s_struct.script_unitrigger_type ][ size ] = s_struct; - } - _k2064 = getNextArrayKey( _a2064, _k2064 ); - } + level.struct_class_names["script_linkname"][s_struct.script_linkname][0] = s_struct; + } + + if ( isdefined( s_struct.script_unitrigger_type ) ) + { + if ( !isdefined( level.struct_class_names["script_unitrigger_type"][s_struct.script_unitrigger_type] ) ) + level.struct_class_names["script_unitrigger_type"][s_struct.script_unitrigger_type] = []; + + size = level.struct_class_names["script_unitrigger_type"][s_struct.script_unitrigger_type].size; + level.struct_class_names["script_unitrigger_type"][s_struct.script_unitrigger_type][size] = s_struct; + } + } } fileprint_start( file ) { /# - filename = file; - file = openfile( filename, "write" ); - level.fileprint = file; - level.fileprintlinecount = 0; - level.fileprint_filename = filename; + filename = file; + file = openfile( filename, "write" ); + level.fileprint = file; + level.fileprintlinecount = 0; + level.fileprint_filename = filename; #/ } fileprint_map_start( file ) { /# - file = "map_source/" + file + ".map"; - fileprint_start( file ); - level.fileprint_mapentcount = 0; - fileprint_map_header( 1 ); + file = "map_source/" + file + ".map"; + fileprint_start( file ); + level.fileprint_mapentcount = 0; + fileprint_map_header( 1 ); #/ } fileprint_chk( file, str ) { /# - level.fileprintlinecount++; - if ( level.fileprintlinecount > 400 ) - { - wait 0,05; - level.fileprintlinecount++; - level.fileprintlinecount = 0; - } - fprintln( file, str ); + level.fileprintlinecount++; + + if ( level.fileprintlinecount > 400 ) + { + wait 0.05; + level.fileprintlinecount++; + level.fileprintlinecount = 0; + } + + fprintln( file, str ); #/ } fileprint_map_header( binclude_blank_worldspawn ) { - if ( !isDefined( binclude_blank_worldspawn ) ) - { - binclude_blank_worldspawn = 0; - } + if ( !isdefined( binclude_blank_worldspawn ) ) + binclude_blank_worldspawn = 0; /# - assert( isDefined( level.fileprint ) ); + assert( isdefined( level.fileprint ) ); #/ /# - fileprint_chk( level.fileprint, "iwmap 4" ); - fileprint_chk( level.fileprint, ""000_Global" flags active" ); - fileprint_chk( level.fileprint, ""The Map" flags" ); - if ( !binclude_blank_worldspawn ) - { - return; - } - fileprint_map_entity_start(); - fileprint_map_keypairprint( "classname", "worldspawn" ); - fileprint_map_entity_end(); + fileprint_chk( level.fileprint, "iwmap 4" ); + fileprint_chk( level.fileprint, "\"000_Global\" flags active" ); + fileprint_chk( level.fileprint, "\"The Map\" flags" ); + + if ( !binclude_blank_worldspawn ) + return; + + fileprint_map_entity_start(); + fileprint_map_keypairprint( "classname", "worldspawn" ); + fileprint_map_entity_end(); #/ } fileprint_map_keypairprint( key1, key2 ) { /# - assert( isDefined( level.fileprint ) ); - fileprint_chk( level.fileprint, """ + key1 + "" "" + key2 + """ ); + assert( isdefined( level.fileprint ) ); + fileprint_chk( level.fileprint, "\"" + key1 + "\" \"" + key2 + "\"" ); #/ } fileprint_map_entity_start() { /# - assert( !isDefined( level.fileprint_entitystart ) ); - level.fileprint_entitystart = 1; - assert( isDefined( level.fileprint ) ); - fileprint_chk( level.fileprint, "// entity " + level.fileprint_mapentcount ); - fileprint_chk( level.fileprint, "{" ); - level.fileprint_mapentcount++; + assert( !isdefined( level.fileprint_entitystart ) ); + level.fileprint_entitystart = 1; + assert( isdefined( level.fileprint ) ); + fileprint_chk( level.fileprint, "// entity " + level.fileprint_mapentcount ); + fileprint_chk( level.fileprint, "{" ); + level.fileprint_mapentcount++; #/ } fileprint_map_entity_end() { /# - assert( isDefined( level.fileprint_entitystart ) ); - assert( isDefined( level.fileprint ) ); - level.fileprint_entitystart = undefined; - fileprint_chk( level.fileprint, "}" ); + assert( isdefined( level.fileprint_entitystart ) ); + assert( isdefined( level.fileprint ) ); + level.fileprint_entitystart = undefined; + fileprint_chk( level.fileprint, "}" ); #/ } fileprint_end() { /# - assert( !isDefined( level.fileprint_entitystart ) ); - saved = closefile( level.fileprint ); - if ( saved != 1 ) - { - println( "-----------------------------------" ); - println( " " ); - println( "file write failure" ); - println( "file with name: " + level.fileprint_filename ); - println( "make sure you checkout the file you are trying to save" ); - println( "note: USE P4 Search to find the file and check that one out" ); - println( " Do not checkin files in from the xenonoutput folder, " ); - println( " this is junctioned to the proper directory where you need to go" ); - println( "junctions looks like this" ); - println( " " ); - println( "..\\xenonOutput\\scriptdata\\createfx ..\\share\\raw\\maps\\createfx" ); - println( "..\\xenonOutput\\scriptdata\\createart ..\\share\\raw\\maps\\createart" ); - println( "..\\xenonOutput\\scriptdata\\vision ..\\share\\raw\\vision" ); - println( "..\\xenonOutput\\scriptdata\\scriptgen ..\\share\\raw\\maps\\scriptgen" ); - println( "..\\xenonOutput\\scriptdata\\zone_source ..\\xenon\\zone_source" ); - println( "..\\xenonOutput\\accuracy ..\\share\\raw\\accuracy" ); - println( "..\\xenonOutput\\scriptdata\\map_source ..\\map_source\\xenon_export" ); - println( " " ); - println( "-----------------------------------" ); - println( "File not saved( see console.log for info ) " ); - } - level.fileprint = undefined; - level.fileprint_filename = undefined; + assert( !isdefined( level.fileprint_entitystart ) ); + saved = closefile( level.fileprint ); + + if ( saved != 1 ) + { + println( "-----------------------------------" ); + println( " " ); + println( "file write failure" ); + println( "file with name: " + level.fileprint_filename ); + println( "make sure you checkout the file you are trying to save" ); + println( "note: USE P4 Search to find the file and check that one out" ); + println( " Do not checkin files in from the xenonoutput folder, " ); + println( " this is junctioned to the proper directory where you need to go" ); + println( "junctions looks like this" ); + println( " " ); + println( "..\xenonOutput\scriptdata\createfx ..\share\raw\maps\createfx" ); + println( "..\xenonOutput\scriptdata\createart ..\share\raw\maps\createart" ); + println( "..\xenonOutput\scriptdata\vision ..\share\raw\vision" ); + println( "..\xenonOutput\scriptdata\scriptgen ..\share\raw\maps\scriptgen" ); + println( "..\xenonOutput\scriptdata\zone_source ..\xenon\zone_source" ); + println( "..\xenonOutput\accuracy ..\share\raw\accuracy" ); + println( "..\xenonOutput\scriptdata\map_source ..\map_source\xenon_export" ); + println( " " ); + println( "-----------------------------------" ); + println( "File not saved( see console.log for info ) " ); + } + + level.fileprint = undefined; + level.fileprint_filename = undefined; #/ } fileprint_radiant_vec( vector ) { /# - string = "" + vector[ 0 ] + " " + vector[ 1 ] + " " + vector[ 2 ] + ""; - return string; + string = "" + vector[0] + " " + vector[1] + " " + vector[2] + ""; + return string; #/ } is_mature() { - if ( level.onlinegame ) - { - return 1; - } - return getlocalprofileint( "cg_mature" ); + if ( level.onlinegame ) + return 1; + + return getlocalprofileint( "cg_mature" ); } is_german_build() { - if ( level.language == "german" ) - { - return 1; - } - return 0; + if ( level.language == "german" ) + return true; + + return false; } is_gib_restricted_build() { - if ( getDvar( "language" ) == "japanese" ) - { - return 1; - } - return 0; + if ( getdvar( "language" ) == "japanese" ) + return true; + + return false; } is_true( check ) { - if ( isDefined( check ) ) - { - return check; - } + return isdefined( check ) && check; } is_false( check ) { - if ( isDefined( check ) ) - { - return !check; - } + return isdefined( check ) && !check; } has_spawnflag( spawnflags ) { - if ( isDefined( self.spawnflags ) ) - { - return ( self.spawnflags & spawnflags ) == spawnflags; - } - return 0; + if ( isdefined( self.spawnflags ) ) + return ( self.spawnflags & spawnflags ) == spawnflags; + + return 0; } clamp( val, val_min, val_max ) { - if ( val < val_min ) - { - val = val_min; - } - else - { - if ( val > val_max ) - { - val = val_max; - } - } - return val; + if ( val < val_min ) + val = val_min; + else if ( val > val_max ) + val = val_max; + + return val; } linear_map( num, min_a, max_a, min_b, max_b ) { - return clamp( ( ( ( num - min_a ) / ( max_a - min_a ) ) * ( max_b - min_b ) ) + min_b, min_b, max_b ); + return clamp( ( num - min_a ) / ( max_a - min_a ) * ( max_b - min_b ) + min_b, min_b, max_b ); } lag( desired, curr, k, dt ) { - r = 0; - if ( ( k * dt ) >= 1 || k <= 0 ) - { - r = desired; - } - else - { - err = desired - curr; - r = curr + ( k * err * dt ); - } - return r; + r = 0.0; + + if ( k * dt >= 1.0 || k <= 0.0 ) + r = desired; + else + { + err = desired - curr; + r = curr + k * err * dt; + } + + return r; } death_notify_wrapper( attacker, damagetype ) { - level notify( "face" ); - self notify( "death" ); + level notify( "face", "death", self ); + self notify( "death", attacker, damagetype ); } damage_notify_wrapper( damage, attacker, direction_vec, point, type, modelname, tagname, partname, idflags ) { - level notify( "face" ); - self notify( "damage" ); + level notify( "face", "damage", self ); + self notify( "damage", damage, attacker, direction_vec, point, type, modelname, tagname, partname, idflags ); } explode_notify_wrapper() { - level notify( "face" ); - self notify( "explode" ); + level notify( "face", "explode", self ); + self notify( "explode" ); } alert_notify_wrapper() { - level notify( "face" ); - self notify( "alert" ); + level notify( "face", "alert", self ); + self notify( "alert" ); } shoot_notify_wrapper() { - level notify( "face" ); - self notify( "shoot" ); + level notify( "face", "shoot", self ); + self notify( "shoot" ); } melee_notify_wrapper() { - level notify( "face" ); - self notify( "melee" ); + level notify( "face", "melee", self ); + self notify( "melee" ); } isusabilityenabled() { - return !self.disabledusability; + return !self.disabledusability; } _disableusability() { - self.disabledusability++; - self disableusability(); + self.disabledusability++; + self disableusability(); } _enableusability() { - self.disabledusability--; - + self.disabledusability--; /# - assert( self.disabledusability >= 0 ); + assert( self.disabledusability >= 0 ); #/ - if ( !self.disabledusability ) - { - self enableusability(); - } + if ( !self.disabledusability ) + self enableusability(); } resetusability() { - self.disabledusability = 0; - self enableusability(); + self.disabledusability = 0; + self enableusability(); } _disableweapon() { - if ( !isDefined( self.disabledweapon ) ) - { - self.disabledweapon = 0; - } - self.disabledweapon++; - self disableweapons(); + if ( !isdefined( self.disabledweapon ) ) + self.disabledweapon = 0; + + self.disabledweapon++; + self disableweapons(); } _enableweapon() { - self.disabledweapon--; - + self.disabledweapon--; /# - assert( self.disabledweapon >= 0 ); + assert( self.disabledweapon >= 0 ); #/ - if ( !self.disabledweapon ) - { - self enableweapons(); - } + if ( !self.disabledweapon ) + self enableweapons(); } isweaponenabled() { - return !self.disabledweapon; + return !self.disabledweapon; } delay_thread( timer, func, param1, param2, param3, param4, param5, param6 ) { - self thread _delay_thread_proc( func, timer, param1, param2, param3, param4, param5, param6 ); + self thread _delay_thread_proc( func, timer, param1, param2, param3, param4, param5, param6 ); } _delay_thread_proc( func, timer, param1, param2, param3, param4, param5, param6 ) { - self endon( "death" ); - self endon( "disconnect" ); - wait timer; - single_thread( self, func, param1, param2, param3, param4, param5, param6 ); + self endon( "death" ); + self endon( "disconnect" ); + wait( timer ); + single_thread( self, func, param1, param2, param3, param4, param5, param6 ); } delay_notify( str_notify, n_delay, str_endon ) { /# - assert( isDefined( str_notify ) ); + assert( isdefined( str_notify ) ); #/ /# - assert( isDefined( n_delay ) ); + assert( isdefined( n_delay ) ); #/ - self thread _delay_notify_proc( str_notify, n_delay, str_endon ); + self thread _delay_notify_proc( str_notify, n_delay, str_endon ); } _delay_notify_proc( str_notify, n_delay, str_endon ) { - self endon( "death" ); - if ( isDefined( str_endon ) ) - { - self endon( str_endon ); - } - if ( n_delay > 0 ) - { - wait n_delay; - } - self notify( str_notify ); + self endon( "death" ); + + if ( isdefined( str_endon ) ) + self endon( str_endon ); + + if ( n_delay > 0 ) + wait( n_delay ); + + self notify( str_notify ); } notify_delay_with_ender( snotifystring, fdelay, ender ) { - if ( isDefined( ender ) ) - { - level endon( ender ); - } + if ( isdefined( ender ) ) + level endon( ender ); /# - assert( isDefined( self ) ); + assert( isdefined( self ) ); #/ /# - assert( isDefined( snotifystring ) ); + assert( isdefined( snotifystring ) ); #/ /# - assert( isDefined( fdelay ) ); + assert( isdefined( fdelay ) ); #/ - self endon( "death" ); - if ( fdelay > 0 ) - { - wait fdelay; - } - if ( !isDefined( self ) ) - { - return; - } - self notify( snotifystring ); + self endon( "death" ); + + if ( fdelay > 0 ) + wait( fdelay ); + + if ( !isdefined( self ) ) + return; + + self notify( snotifystring ); } diff --git a/Multiplayer Core/patch_mp/maps/mp/_acousticsensor.gsc b/Multiplayer Core/patch_mp/maps/mp/_acousticsensor.gsc index 81b983a..499b88d 100644 --- a/Multiplayer Core/patch_mp/maps/mp/_acousticsensor.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/_acousticsensor.gsc @@ -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; + } + } +} diff --git a/Multiplayer Core/patch_mp/maps/mp/_ambientpackage.gsc b/Multiplayer Core/patch_mp/maps/mp/_ambientpackage.gsc index e69de29..df94d58 100644 --- a/Multiplayer Core/patch_mp/maps/mp/_ambientpackage.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/_ambientpackage.gsc @@ -0,0 +1,3 @@ +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool + diff --git a/Multiplayer Core/patch_mp/maps/mp/_art.gsc b/Multiplayer Core/patch_mp/maps/mp/_art.gsc index 84313fc..050b7f2 100644 --- a/Multiplayer Core/patch_mp/maps/mp/_art.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/_art.gsc @@ -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(); + } #/ - } } diff --git a/Multiplayer Core/patch_mp/maps/mp/_audio.gsc b/Multiplayer Core/patch_mp/maps/mp/_audio.gsc index 6c64822..039e1ac 100644 --- a/Multiplayer Core/patch_mp/maps/mp/_audio.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/_audio.gsc @@ -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; } diff --git a/Multiplayer Core/patch_mp/maps/mp/_ballistic_knife.gsc b/Multiplayer Core/patch_mp/maps/mp/_ballistic_knife.gsc index e8b0fd5..e9eca74 100644 --- a/Multiplayer Core/patch_mp/maps/mp/_ballistic_knife.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/_ballistic_knife.gsc @@ -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 ); +} diff --git a/Multiplayer Core/patch_mp/maps/mp/_bb.gsc b/Multiplayer Core/patch_mp/maps/mp/_bb.gsc index 5318f42..9c095c5 100644 --- a/Multiplayer Core/patch_mp/maps/mp/_bb.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/_bb.gsc @@ -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; } diff --git a/Multiplayer Core/patch_mp/maps/mp/_bouncingbetty.gsc b/Multiplayer Core/patch_mp/maps/mp/_bouncingbetty.gsc index 6d051ed..7a5815d 100644 --- a/Multiplayer Core/patch_mp/maps/mp/_bouncingbetty.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/_bouncingbetty.gsc @@ -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(); +} diff --git a/Multiplayer Core/patch_mp/maps/mp/_burnplayer.gsc b/Multiplayer Core/patch_mp/maps/mp/_burnplayer.gsc index 56a5368..d31fc46 100644 --- a/Multiplayer Core/patch_mp/maps/mp/_burnplayer.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/_burnplayer.gsc @@ -1,582 +1,569 @@ -//checked includes match cerberus output -#include maps/mp/gametypes/_damagefeedback; -#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 +#include common_scripts\utility; +#include maps\mp\_utility; +#include maps\mp\gametypes\_globallogic_player; +#include maps\mp\gametypes\_damagefeedback; -initburnplayer() //checked matches cerberus output +initburnplayer() { - level.flamedamage = 15; - level.flameburntime = 1.5; + level.flamedamage = 15; + level.flameburntime = 1.5; } -hitwithincendiary( attacker, inflictor, mod ) //checked changed to match cerberus output +hitwithincendiary( attacker, inflictor, mod ) { - if ( isDefined( self.burning ) ) - { - return; - } - self starttanning(); - self thread waitthenstoptanning( level.flameburntime ); - self endon( "disconnect" ); - attacker endon( "disconnect" ); - waittillframeend; - self.burning = 1; - self thread burn_blocker(); - tagarray = []; - if ( isai( self ) ) - { - tagarray[ tagarray.size ] = "J_Wrist_RI"; - tagarray[ tagarray.size ] = "J_Wrist_LE"; - tagarray[ tagarray.size ] = "J_Elbow_LE"; - tagarray[ tagarray.size ] = "J_Elbow_RI"; - tagarray[ tagarray.size ] = "J_Knee_RI"; - tagarray[ tagarray.size ] = "J_Knee_LE"; - tagarray[ tagarray.size ] = "J_Ankle_RI"; - tagarray[ tagarray.size ] = "J_Ankle_LE"; - } - else - { - tagarray[ tagarray.size ] = "J_Wrist_RI"; - tagarray[ tagarray.size ] = "J_Wrist_LE"; - tagarray[ tagarray.size ] = "J_Elbow_LE"; - tagarray[ tagarray.size ] = "J_Elbow_RI"; - tagarray[ tagarray.size ] = "J_Knee_RI"; - tagarray[ tagarray.size ] = "J_Knee_LE"; - tagarray[ tagarray.size ] = "J_Ankle_RI"; - tagarray[ tagarray.size ] = "J_Ankle_LE"; - if ( isplayer( self ) && self.health > 0 ) - { - self setburn( 3 ); - } - } - if ( isDefined( level._effect[ "character_fire_death_torso" ] ) ) - { - for ( arrayIndex = 0; arrayIndex < tagArray.size; arrayIndex++ ) - { - playfxontag( level._effect[ "character_fire_death_sm" ], self, tagarray[ arrayindex ] ); - } - } - if ( isai( self ) ) - { - playfxontag( level._effect[ "character_fire_death_torso" ], self, "J_Spine1" ); - } - else - { - playfxontag( level._effect[ "character_fire_death_torso" ], self, "J_SpineLower" ); - } - if ( !isalive( self ) ) - { - return; - } - if ( isplayer( self ) ) - { - self thread watchforwater( 7 ); - self thread watchfordeath(); - } + if ( isdefined( self.burning ) ) + return; + + self starttanning(); + self thread waitthenstoptanning( level.flameburntime ); + self endon( "disconnect" ); + attacker endon( "disconnect" ); + waittillframeend; + self.burning = 1; + self thread burn_blocker(); + tagarray = []; + + if ( isai( self ) ) + { + tagarray[tagarray.size] = "J_Wrist_RI"; + tagarray[tagarray.size] = "J_Wrist_LE"; + tagarray[tagarray.size] = "J_Elbow_LE"; + tagarray[tagarray.size] = "J_Elbow_RI"; + tagarray[tagarray.size] = "J_Knee_RI"; + tagarray[tagarray.size] = "J_Knee_LE"; + tagarray[tagarray.size] = "J_Ankle_RI"; + tagarray[tagarray.size] = "J_Ankle_LE"; + } + else + { + tagarray[tagarray.size] = "J_Wrist_RI"; + tagarray[tagarray.size] = "J_Wrist_LE"; + tagarray[tagarray.size] = "J_Elbow_LE"; + tagarray[tagarray.size] = "J_Elbow_RI"; + tagarray[tagarray.size] = "J_Knee_RI"; + tagarray[tagarray.size] = "J_Knee_LE"; + tagarray[tagarray.size] = "J_Ankle_RI"; + tagarray[tagarray.size] = "J_Ankle_LE"; + + if ( isplayer( self ) && self.health > 0 ) + self setburn( 3.0 ); + } + + if ( isdefined( level._effect["character_fire_death_torso"] ) ) + { + for ( arrayindex = 0; arrayindex < tagarray.size; arrayindex++ ) + playfxontag( level._effect["character_fire_death_sm"], self, tagarray[arrayindex] ); + } + + if ( isai( self ) ) + playfxontag( level._effect["character_fire_death_torso"], self, "J_Spine1" ); + else + playfxontag( level._effect["character_fire_death_torso"], self, "J_SpineLower" ); + + if ( !isalive( self ) ) + return; + + if ( isplayer( self ) ) + { + self thread watchforwater( 7 ); + self thread watchfordeath(); + } } -hitwithnapalmstrike( attacker, inflictor, mod ) //checked changed to match cerberus output +hitwithnapalmstrike( attacker, inflictor, mod ) { - if ( isDefined( self.burning ) || self hasperk( "specialty_fireproof" ) ) - { - return; - } - self starttanning(); - self thread waitthenstoptanning( level.flameburntime ); - self endon( "disconnect" ); - attacker endon( "disconnect" ); - self endon( "death" ); - if ( isDefined( self.burning ) ) - { - return; - } - self thread burn_blocker(); - waittillframeend; - self.burning = 1; - self thread burn_blocker(); - tagarray = []; - if ( isai( self ) ) - { - tagarray[ tagarray.size ] = "J_Wrist_RI"; - tagarray[ tagarray.size ] = "J_Wrist_LE"; - tagarray[ tagarray.size ] = "J_Elbow_LE"; - tagarray[ tagarray.size ] = "J_Elbow_RI"; - tagarray[ tagarray.size ] = "J_Knee_RI"; - tagarray[ tagarray.size ] = "J_Knee_LE"; - tagarray[ tagarray.size ] = "J_Ankle_RI"; - tagarray[ tagarray.size ] = "J_Ankle_LE"; - } - else - { - tagarray[ tagarray.size ] = "J_Wrist_RI"; - tagarray[ tagarray.size ] = "J_Wrist_LE"; - tagarray[ tagarray.size ] = "J_Elbow_LE"; - tagarray[ tagarray.size ] = "J_Elbow_RI"; - tagarray[ tagarray.size ] = "J_Knee_RI"; - tagarray[ tagarray.size ] = "J_Knee_LE"; - tagarray[ tagarray.size ] = "J_Ankle_RI"; - tagarray[ tagarray.size ] = "J_Ankle_LE"; - if ( isplayer( self ) ) - { - self setburn( 3 ); - } - } - if ( isDefined( level._effect[ "character_fire_death_sm" ] ) ) - { - for ( arrayindex = 0; arrayindex < tagarray.size; arrayindex++ ) - { - playfxontag( level._effect[ "character_fire_death_sm" ], self, tagarray[ arrayindex ] ); - arrayindex++; - } - } - if ( isDefined( level._effect[ "character_fire_death_torso" ] ) ) - { - playfxontag( level._effect[ "character_fire_death_torso" ], self, "J_SpineLower" ); - } - if ( !isalive( self ) ) - { - return; - } - self thread donapalmstrikedamage( attacker, inflictor, mod ); - if ( isplayer( self ) ) - { - self thread watchforwater( 7 ); - self thread watchfordeath(); - } + if ( isdefined( self.burning ) || self hasperk( "specialty_fireproof" ) ) + return; + + self starttanning(); + self thread waitthenstoptanning( level.flameburntime ); + self endon( "disconnect" ); + attacker endon( "disconnect" ); + self endon( "death" ); + + if ( isdefined( self.burning ) ) + return; + + self thread burn_blocker(); + waittillframeend; + self.burning = 1; + self thread burn_blocker(); + tagarray = []; + + if ( isai( self ) ) + { + tagarray[tagarray.size] = "J_Wrist_RI"; + tagarray[tagarray.size] = "J_Wrist_LE"; + tagarray[tagarray.size] = "J_Elbow_LE"; + tagarray[tagarray.size] = "J_Elbow_RI"; + tagarray[tagarray.size] = "J_Knee_RI"; + tagarray[tagarray.size] = "J_Knee_LE"; + tagarray[tagarray.size] = "J_Ankle_RI"; + tagarray[tagarray.size] = "J_Ankle_LE"; + } + else + { + tagarray[tagarray.size] = "J_Wrist_RI"; + tagarray[tagarray.size] = "J_Wrist_LE"; + tagarray[tagarray.size] = "J_Elbow_LE"; + tagarray[tagarray.size] = "J_Elbow_RI"; + tagarray[tagarray.size] = "J_Knee_RI"; + tagarray[tagarray.size] = "J_Knee_LE"; + tagarray[tagarray.size] = "J_Ankle_RI"; + tagarray[tagarray.size] = "J_Ankle_LE"; + + if ( isplayer( self ) ) + self setburn( 3.0 ); + } + + if ( isdefined( level._effect["character_fire_death_sm"] ) ) + { + for ( arrayindex = 0; arrayindex < tagarray.size; arrayindex++ ) + playfxontag( level._effect["character_fire_death_sm"], self, tagarray[arrayindex] ); + } + + if ( isdefined( level._effect["character_fire_death_torso"] ) ) + playfxontag( level._effect["character_fire_death_torso"], self, "J_SpineLower" ); + + if ( !isalive( self ) ) + return; + + self thread donapalmstrikedamage( attacker, inflictor, mod ); + + if ( isplayer( self ) ) + { + self thread watchforwater( 7 ); + self thread watchfordeath(); + } } -walkedthroughflames( attacker, inflictor, weapon ) //checked changed to match cerberus output +walkedthroughflames( attacker, inflictor, weapon ) { - if ( isDefined( self.burning ) || self hasperk( "specialty_fireproof" ) ) - { - return; - } - self starttanning(); - self thread waitthenstoptanning( level.flameburntime ); - self endon( "disconnect" ); - waittillframeend; - self.burning = 1; - self thread burn_blocker(); - tagarray = []; - if ( isai( self ) ) - { - tagarray[ tagarray.size ] = "J_Wrist_RI"; - tagarray[ tagarray.size ] = "J_Wrist_LE"; - tagarray[ tagarray.size ] = "J_Elbow_LE"; - tagarray[ tagarray.size ] = "J_Elbow_RI"; - tagarray[ tagarray.size ] = "J_Knee_RI"; - tagarray[ tagarray.size ] = "J_Knee_LE"; - tagarray[ tagarray.size ] = "J_Ankle_RI"; - tagarray[ tagarray.size ] = "J_Ankle_LE"; - } - else - { - tagarray[ tagarray.size ] = "J_Knee_RI"; - tagarray[ tagarray.size ] = "J_Knee_LE"; - tagarray[ tagarray.size ] = "J_Ankle_RI"; - tagarray[ tagarray.size ] = "J_Ankle_LE"; - } - if ( isDefined( level._effect[ "character_fire_player_sm" ] ) ) - { - for ( arrayindex = 0; arrayindex < tagarray.size; arrayindex++ ) - { - playfxontag( level._effect[ "character_fire_player_sm" ], self, tagarray[ arrayindex ] ); - } - } - if ( !isalive( self ) ) - { - return; - } - self thread doflamedamage( attacker, inflictor, weapon, 1 ); - if ( isplayer( self ) ) - { - self thread watchforwater( 7 ); - self thread watchfordeath(); - } + if ( isdefined( self.burning ) || self hasperk( "specialty_fireproof" ) ) + return; + + self starttanning(); + self thread waitthenstoptanning( level.flameburntime ); + self endon( "disconnect" ); + waittillframeend; + self.burning = 1; + self thread burn_blocker(); + tagarray = []; + + if ( isai( self ) ) + { + tagarray[tagarray.size] = "J_Wrist_RI"; + tagarray[tagarray.size] = "J_Wrist_LE"; + tagarray[tagarray.size] = "J_Elbow_LE"; + tagarray[tagarray.size] = "J_Elbow_RI"; + tagarray[tagarray.size] = "J_Knee_RI"; + tagarray[tagarray.size] = "J_Knee_LE"; + tagarray[tagarray.size] = "J_Ankle_RI"; + tagarray[tagarray.size] = "J_Ankle_LE"; + } + else + { + tagarray[tagarray.size] = "J_Knee_RI"; + tagarray[tagarray.size] = "J_Knee_LE"; + tagarray[tagarray.size] = "J_Ankle_RI"; + tagarray[tagarray.size] = "J_Ankle_LE"; + } + + if ( isdefined( level._effect["character_fire_player_sm"] ) ) + { + for ( arrayindex = 0; arrayindex < tagarray.size; arrayindex++ ) + playfxontag( level._effect["character_fire_player_sm"], self, tagarray[arrayindex] ); + } + + if ( !isalive( self ) ) + return; + + self thread doflamedamage( attacker, inflictor, weapon, 1.0 ); + + if ( isplayer( self ) ) + { + self thread watchforwater( 7 ); + self thread watchfordeath(); + } } -burnedwithflamethrower( attacker, inflictor, weapon ) //checked changed to match cerberus output +burnedwithflamethrower( attacker, inflictor, weapon ) { - if ( isDefined( self.burning ) ) - { - return; - } - self starttanning(); - self thread waitthenstoptanning( level.flameburntime ); - self endon( "disconnect" ); - waittillframeend; - self.burning = 1; - self thread burn_blocker(); - tagarray = []; - if ( isai( self ) ) - { - tagarray[ 0 ] = "J_Spine1"; - tagarray[ 1 ] = "J_Elbow_LE"; - tagarray[ 2 ] = "J_Elbow_RI"; - tagarray[ 3 ] = "J_Head"; - tagarray[ 4 ] = "j_knee_ri"; - tagarray[ 5 ] = "j_knee_le"; - } - else - { - tagarray[ 0 ] = "J_Elbow_RI"; - tagarray[ 1 ] = "j_knee_ri"; - tagarray[ 2 ] = "j_knee_le"; - if ( isplayer( self ) && self.health > 0 ) - { - self setburn( 3 ); - } - } - if ( isplayer( self ) && isalive( self ) ) - { - self thread watchforwater( 7 ); - self thread watchfordeath(); - } - if ( isDefined( level._effect[ "character_fire_player_sm" ] ) ) - { - for ( arrayindex = 0; arrayindex < tagarray.size; arrayindex++ ) - { - playfxontag( level._effect[ "character_fire_player_sm" ], self, tagarray[ arrayindex ] ); - } - } + if ( isdefined( self.burning ) ) + return; + + self starttanning(); + self thread waitthenstoptanning( level.flameburntime ); + self endon( "disconnect" ); + waittillframeend; + self.burning = 1; + self thread burn_blocker(); + tagarray = []; + + if ( isai( self ) ) + { + tagarray[0] = "J_Spine1"; + tagarray[1] = "J_Elbow_LE"; + tagarray[2] = "J_Elbow_RI"; + tagarray[3] = "J_Head"; + tagarray[4] = "j_knee_ri"; + tagarray[5] = "j_knee_le"; + } + else + { + tagarray[0] = "J_Elbow_RI"; + tagarray[1] = "j_knee_ri"; + tagarray[2] = "j_knee_le"; + + if ( isplayer( self ) && self.health > 0 ) + self setburn( 3.0 ); + } + + if ( isplayer( self ) && isalive( self ) ) + { + self thread watchforwater( 7 ); + self thread watchfordeath(); + } + + if ( isdefined( level._effect["character_fire_player_sm"] ) ) + { + for ( arrayindex = 0; arrayindex < tagarray.size; arrayindex++ ) + playfxontag( level._effect["character_fire_player_sm"], self, tagarray[arrayindex] ); + } } -burnedwithdragonsbreath( attacker, inflictor, weapon ) //checked changed to match cerberus output +burnedwithdragonsbreath( attacker, inflictor, weapon ) { - if ( isDefined( self.burning ) ) - { - return; - } - self starttanning(); - self thread waitthenstoptanning( level.flameburntime ); - self endon( "disconnect" ); - waittillframeend; - self.burning = 1; - self thread burn_blocker(); - tagarray = []; - if ( isai( self ) ) - { - tagarray[ 0 ] = "J_Spine1"; - tagarray[ 1 ] = "J_Elbow_LE"; - tagarray[ 2 ] = "J_Elbow_RI"; - tagarray[ 3 ] = "J_Head"; - tagarray[ 4 ] = "j_knee_ri"; - tagarray[ 5 ] = "j_knee_le"; - } - else - { - tagarray[ 0 ] = "j_spinelower"; - tagarray[ 1 ] = "J_Elbow_RI"; - tagarray[ 2 ] = "j_knee_ri"; - tagarray[ 3 ] = "j_knee_le"; - if ( isplayer( self ) && self.health > 0 ) - { - self setburn( 3 ); - } - } - if ( isplayer( self ) && isalive( self ) ) - { - self thread watchforwater( 7 ); - self thread watchfordeath(); - return; - } - if ( isDefined( level._effect[ "character_fire_player_sm" ] ) ) - { - for ( arrayindex = 0; arrayindex < tagarray.size; arrayindex++ ) - { - playfxontag( level._effect[ "character_fire_player_sm" ], self, tagarray[ arrayindex ] ); - } - } + if ( isdefined( self.burning ) ) + return; + + self starttanning(); + self thread waitthenstoptanning( level.flameburntime ); + self endon( "disconnect" ); + waittillframeend; + self.burning = 1; + self thread burn_blocker(); + tagarray = []; + + if ( isai( self ) ) + { + tagarray[0] = "J_Spine1"; + tagarray[1] = "J_Elbow_LE"; + tagarray[2] = "J_Elbow_RI"; + tagarray[3] = "J_Head"; + tagarray[4] = "j_knee_ri"; + tagarray[5] = "j_knee_le"; + } + else + { + tagarray[0] = "j_spinelower"; + tagarray[1] = "J_Elbow_RI"; + tagarray[2] = "j_knee_ri"; + tagarray[3] = "j_knee_le"; + + if ( isplayer( self ) && self.health > 0 ) + self setburn( 3.0 ); + } + + if ( isplayer( self ) && isalive( self ) ) + { + self thread watchforwater( 7 ); + self thread watchfordeath(); + return; + } + + if ( isdefined( level._effect["character_fire_player_sm"] ) ) + { + for ( arrayindex = 0; arrayindex < tagarray.size; arrayindex++ ) + playfxontag( level._effect["character_fire_player_sm"], self, tagarray[arrayindex] ); + } } -burnedtodeath() //checked matches cerberus output +burnedtodeath() { - self.burning = 1; - self thread burn_blocker(); - self starttanning(); - self thread doburningsound(); - self thread waitthenstoptanning( level.flameburntime ); + self.burning = 1; + self thread burn_blocker(); + self starttanning(); + self thread doburningsound(); + self thread waitthenstoptanning( level.flameburntime ); } -watchfordeath() //checked matches cerberus output +watchfordeath() { - self endon( "disconnect" ); - self notify( "watching for death while on fire" ); - self endon( "watching for death while on fire" ); - self waittill( "death" ); - if ( isplayer( self ) ) - { - self _stopburning(); - } - self.burning = undefined; + self endon( "disconnect" ); + self notify( "watching for death while on fire" ); + self endon( "watching for death while on fire" ); + + self waittill( "death" ); + + if ( isplayer( self ) ) + self _stopburning(); + + self.burning = undefined; } -watchforwater( time ) //checked matches cerberus output +watchforwater( time ) { - self endon( "disconnect" ); - self notify( "watching for water" ); - self endon( "watching for water" ); - wait 0.1; - looptime = 0.1; - while ( time > 0 ) - { - wait looptime; - if ( self depthofplayerinwater() > 0 ) - { - finish_burn(); - time = 0; - } - time -= looptime; - } + self endon( "disconnect" ); + self notify( "watching for water" ); + self endon( "watching for water" ); + wait 0.1; + looptime = 0.1; + + while ( time > 0 ) + { + wait( looptime ); + + if ( self depthofplayerinwater() > 0 ) + { + finish_burn(); + time = 0; + } + + time -= looptime; + } } -finish_burn() //checked changed to match cerberus output +finish_burn() { - self notify( "stop burn damage" ); - tagarray = []; - tagarray[ 0 ] = "j_spinelower"; - tagarray[ 1 ] = "J_Elbow_RI"; - tagarray[ 2 ] = "J_Head"; - tagarray[ 3 ] = "j_knee_ri"; - tagarray[ 4 ] = "j_knee_le"; - if ( isDefined( level._effect[ "fx_fire_player_sm_smk_2sec" ] ) ) - { - for ( arrayindex = 0; arrayindex < tagarray.size; arrayindex++ ) - { - playfxontag( level._effect[ "fx_fire_player_sm_smk_2sec" ], self, tagarray[ arrayindex ] ); - } - } - self.burning = undefined; - self _stopburning(); - self.ingroundnapalm = 0; + self notify( "stop burn damage" ); + tagarray = []; + tagarray[0] = "j_spinelower"; + tagarray[1] = "J_Elbow_RI"; + tagarray[2] = "J_Head"; + tagarray[3] = "j_knee_ri"; + tagarray[4] = "j_knee_le"; + + if ( isdefined( level._effect["fx_fire_player_sm_smk_2sec"] ) ) + { + for ( arrayindex = 0; arrayindex < tagarray.size; arrayindex++ ) + playfxontag( level._effect["fx_fire_player_sm_smk_2sec"], self, tagarray[arrayindex] ); + } + + self.burning = undefined; + self _stopburning(); + self.ingroundnapalm = 0; } -donapalmstrikedamage( attacker, inflictor, mod ) //checked matches cerberus output +donapalmstrikedamage( attacker, inflictor, mod ) { - if ( isai( self ) ) - { - dodognapalmstrikedamage( attacker, inflictor, mod ); - return; - } - self endon( "death" ); - self endon( "disconnect" ); - attacker endon( "disconnect" ); - self endon( "stop burn damage" ); - while ( isDefined( level.napalmstrikedamage ) && isDefined( self ) && self depthofplayerinwater() < 1 ) - { - self dodamage( level.napalmstrikedamage, self.origin, attacker, attacker, "none", mod, 0, "napalm_mp" ); - wait 1; - } + if ( isai( self ) ) + { + dodognapalmstrikedamage( attacker, inflictor, mod ); + return; + } + + self endon( "death" ); + self endon( "disconnect" ); + attacker endon( "disconnect" ); + self endon( "stop burn damage" ); + + while ( isdefined( level.napalmstrikedamage ) && isdefined( self ) && self depthofplayerinwater() < 1 ) + { + self dodamage( level.napalmstrikedamage, self.origin, attacker, attacker, "none", mod, 0, "napalm_mp" ); + wait 1; + } } -donapalmgrounddamage( attacker, inflictor, mod ) //checked changed to match cerberus output dvars taken from beta dump +donapalmgrounddamage( attacker, inflictor, mod ) { - if ( self hasperk( "specialty_fireproof" ) ) - { - return; - } - if ( level.teambased ) - { - if ( attacker != self && attacker.team == self.team ) - { - return; - } - } - if ( isai( self ) ) - { - dodognapalmgrounddamage( attacker, inflictor, mod ); - return; - } - if ( isDefined( self.burning ) ) - { - return; - } - self thread burn_blocker(); - self endon( "death" ); - self endon( "disconnect" ); - attacker endon( "disconnect" ); - self endon( "stop burn damage" ); - if ( isDefined( level.groundburntime ) ) - { - if ( getDvar( "scr_groundBurnTime" ) == "" ) - { - waittime = level.groundburntime; - } - else - { - waittime = getDvarFloat( "scr_groundBurnTime" ); - } - } - else - { - waittime = 100; - } - self walkedthroughflames( attacker, inflictor, "napalm_mp" ); - self.ingroundnapalm = 1; - while ( isDefined( level.napalmgrounddamage ) ) - { - if ( getDvar( "scr_napalmGroundDamage" ) == "" ) - { - napalmgrounddamage = level.napalmgrounddamage; - } - else - { - napalmgrounddamage = getDvarFloat( "scr_napalmGroundDamage" ); - } - while ( isDefined( self ) && isDefined( inflictor ) && self depthofplayerinwater() < 1 && waittime > 0 ) - { - self dodamage( level.napalmgrounddamage, self.origin, attacker, inflictor, "none", mod, 0, "napalm_mp" ); - if ( isplayer( self ) ) - { - self setburn( 1.1 ); - } - wait 1; - waittime -= 1; - } - } - self.ingroundnapalm = 0; + if ( self hasperk( "specialty_fireproof" ) ) + return; + + if ( level.teambased ) + { + if ( attacker != self && attacker.team == self.team ) + return; + } + + if ( isai( self ) ) + { + dodognapalmgrounddamage( attacker, inflictor, mod ); + return; + } + + if ( isdefined( self.burning ) ) + return; + + self thread burn_blocker(); + self endon( "death" ); + self endon( "disconnect" ); + attacker endon( "disconnect" ); + self endon( "stop burn damage" ); + + if ( isdefined( level.groundburntime ) ) + { + if ( getdvar( _hash_6EC13261 ) == "" ) + waittime = level.groundburntime; + else + waittime = getdvarfloat( _hash_6EC13261 ); + } + else + waittime = 100; + + self walkedthroughflames( attacker, inflictor, "napalm_mp" ); + self.ingroundnapalm = 1; + + if ( isdefined( level.napalmgrounddamage ) ) + { + if ( getdvar( _hash_3FFA6673 ) == "" ) + napalmgrounddamage = level.napalmgrounddamage; + else + napalmgrounddamage = getdvarfloat( _hash_3FFA6673 ); + + while ( isdefined( self ) && isdefined( inflictor ) && self depthofplayerinwater() < 1 && waittime > 0 ) + { + self dodamage( level.napalmgrounddamage, self.origin, attacker, inflictor, "none", mod, 0, "napalm_mp" ); + + if ( isplayer( self ) ) + self setburn( 1.1 ); + + wait 1; + waittime -= 1; + } + } + + self.ingroundnapalm = 0; } -dodognapalmstrikedamage( attacker, inflictor, mod ) //checked matches cerberus output +dodognapalmstrikedamage( attacker, inflictor, mod ) { - attacker endon( "disconnect" ); - self endon( "death" ); - self endon( "stop burn damage" ); - while ( isDefined( level.napalmstrikedamage ) && isDefined( self ) ) - { - self dodamage( level.napalmstrikedamage, self.origin, attacker, attacker, "none", mod ); - wait 1; - } + attacker endon( "disconnect" ); + self endon( "death" ); + self endon( "stop burn damage" ); + + while ( isdefined( level.napalmstrikedamage ) && isdefined( self ) ) + { + self dodamage( level.napalmstrikedamage, self.origin, attacker, attacker, "none", mod ); + wait 1; + } } -dodognapalmgrounddamage( attacker, inflictor, mod ) //checked matches cerberus output +dodognapalmgrounddamage( attacker, inflictor, mod ) { - attacker endon( "disconnect" ); - self endon( "death" ); - self endon( "stop burn damage" ); - while ( isDefined( level.napalmgrounddamage ) && isDefined( self ) ) - { - self dodamage( level.napalmgrounddamage, self.origin, attacker, attacker, "none", mod, 0, "napalm_mp" ); - wait 1; - } + attacker endon( "disconnect" ); + self endon( "death" ); + self endon( "stop burn damage" ); + + while ( isdefined( level.napalmgrounddamage ) && isdefined( self ) ) + { + self dodamage( level.napalmgrounddamage, self.origin, attacker, attacker, "none", mod, 0, "napalm_mp" ); + wait 1; + } } -burn_blocker() //checked matches cerberus output +burn_blocker() { - self endon( "disconnect" ); - self endon( "death" ); - wait 3; - self.burning = undefined; + self endon( "disconnect" ); + self endon( "death" ); + wait 3; + self.burning = undefined; } -doflamedamage( attacker, inflictor, weapon, time ) //checked matches cerberus output +doflamedamage( attacker, inflictor, weapon, time ) { - if ( isai( self ) ) - { - dodogflamedamage( attacker, inflictor, weapon, time ); - return; - } - if ( isDefined( attacker ) ) - { - attacker endon( "disconnect" ); - } - self endon( "death" ); - self endon( "disconnect" ); - self endon( "stop burn damage" ); - self thread doburningsound(); - self notify( "snd_burn_scream" ); - wait_time = 1; - while ( isDefined( level.flamedamage ) && isDefined( self ) && self depthofplayerinwater() < 1 && time > 0 ) - { - if ( isDefined( attacker ) && isDefined( inflictor ) && isDefined( weapon ) ) - { - if ( maps/mp/gametypes/_globallogic_player::dodamagefeedback( weapon, attacker ) ) - { - attacker maps/mp/gametypes/_damagefeedback::updatedamagefeedback(); - } - self dodamage( level.flamedamage, self.origin, attacker, inflictor, "none", "MOD_BURNED", 0, weapon ); - } - else - { - self dodamage( level.flamedamage, self.origin ); - } - wait wait_time; - time -= wait_time; - } - self thread finish_burn(); + if ( isai( self ) ) + { + dodogflamedamage( attacker, inflictor, weapon, time ); + return; + } + + if ( isdefined( attacker ) ) + attacker endon( "disconnect" ); + + self endon( "death" ); + self endon( "disconnect" ); + self endon( "stop burn damage" ); + self thread doburningsound(); + self notify( "snd_burn_scream" ); + wait_time = 1.0; + + while ( isdefined( level.flamedamage ) && isdefined( self ) && self depthofplayerinwater() < 1 && time > 0 ) + { + if ( isdefined( attacker ) && isdefined( inflictor ) && isdefined( weapon ) ) + { + if ( maps\mp\gametypes\_globallogic_player::dodamagefeedback( weapon, attacker ) ) + attacker maps\mp\gametypes\_damagefeedback::updatedamagefeedback(); + + self dodamage( level.flamedamage, self.origin, attacker, inflictor, "none", "MOD_BURNED", 0, weapon ); + } + else + self dodamage( level.flamedamage, self.origin ); + + wait( wait_time ); + time -= wait_time; + } + + self thread finish_burn(); } -dodogflamedamage( attacker, inflictor, weapon, time ) //checked changed to match cerberus output +dodogflamedamage( attacker, inflictor, weapon, time ) { - if ( isDefined( attacker ) || !isDefined( inflictor ) || !isDefined( weapon ) ) - { - return; - } - attacker endon( "disconnect" ); - self endon( "death" ); - self endon( "stop burn damage" ); - self thread doburningsound(); - wait_time = 1; - while ( isDefined( level.flamedamage ) && isDefined( self ) && time > 0 ) - { - self dodamage( level.flamedamage, self.origin, attacker, inflictor, "none", "MOD_BURNED", 0, weapon ); - wait wait_time; - time -= wait_time; - } + if ( !isdefined( attacker ) || !isdefined( inflictor ) || !isdefined( weapon ) ) + return; + + attacker endon( "disconnect" ); + self endon( "death" ); + self endon( "stop burn damage" ); + self thread doburningsound(); + wait_time = 1.0; + + while ( isdefined( level.flamedamage ) && isdefined( self ) && time > 0 ) + { + self dodamage( level.flamedamage, self.origin, attacker, inflictor, "none", "MOD_BURNED", 0, weapon ); + wait( wait_time ); + time -= wait_time; + } } -waitthenstoptanning( time ) //checked matches cerberus output +waitthenstoptanning( time ) { - self endon( "disconnect" ); - self endon( "death" ); - wait time; - self _stopburning(); + self endon( "disconnect" ); + self endon( "death" ); + wait( time ); + self _stopburning(); } -doburningsound() //checked matches cerberus output +doburningsound() { - self endon( "disconnect" ); - self endon( "death" ); - fire_sound_ent = spawn( "script_origin", self.origin ); - fire_sound_ent linkto( self, "tag_origin", ( 0, 0, 0 ), ( 0, 0, 0 ) ); - fire_sound_ent playloopsound( "mpl_player_burn_loop" ); - self thread firesounddeath( fire_sound_ent ); - self waittill( "StopBurnSound" ); - if ( isDefined( fire_sound_ent ) ) - { - fire_sound_ent stoploopsound( 0.5 ); - } - wait 0.5; - if ( isDefined( fire_sound_ent ) ) - { - fire_sound_ent delete(); - } - /* + self endon( "disconnect" ); + self endon( "death" ); + fire_sound_ent = spawn( "script_origin", self.origin ); + fire_sound_ent linkto( self, "tag_origin", ( 0, 0, 0 ), ( 0, 0, 0 ) ); + fire_sound_ent playloopsound( "mpl_player_burn_loop" ); + self thread firesounddeath( fire_sound_ent ); + + self waittill( "StopBurnSound" ); + + if ( isdefined( fire_sound_ent ) ) + fire_sound_ent stoploopsound( 0.5 ); + + wait 0.5; + + if ( isdefined( fire_sound_ent ) ) + fire_sound_ent delete(); /# - println( "sound stop burning" ); + println( "sound stop burning" ); #/ - */ } -_stopburning() //checked matches cerberus output +_stopburning() { - self endon( "disconnect" ); - self notify( "StopBurnSound" ); - if ( isDefined( self ) ) - { - self stopburning(); - } + self endon( "disconnect" ); + self notify( "StopBurnSound" ); + + if ( isdefined( self ) ) + self stopburning(); } -firesounddeath( ent ) //checked matches cerberus output +firesounddeath( ent ) { - ent endon( "death" ); - self waittill_any( "death", "disconnect" ); - ent delete(); - /* + ent endon( "death" ); + self waittill_any( "death", "disconnect" ); + ent delete(); /# - println( "sound delete burning" ); + println( "sound delete burning" ); #/ - */ } diff --git a/Multiplayer Core/patch_mp/maps/mp/_busing.gsc b/Multiplayer Core/patch_mp/maps/mp/_busing.gsc index f773131..5a8bf36 100644 --- a/Multiplayer Core/patch_mp/maps/mp/_busing.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/_busing.gsc @@ -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; } diff --git a/Multiplayer Core/patch_mp/maps/mp/_challenges.gsc b/Multiplayer Core/patch_mp/maps/mp/_challenges.gsc index 7a2c03a..167ec67 100644 --- a/Multiplayer Core/patch_mp/maps/mp/_challenges.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/_challenges.gsc @@ -1,2117 +1,1881 @@ -#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() { - if ( !isDefined( level.challengescallbacks ) ) - { - level.challengescallbacks = []; - } - waittillframeend; - if ( canprocesschallenges() ) - { - registerchallengescallback( "playerKilled", ::challengekills ); - registerchallengescallback( "gameEnd", ::challengegameend ); - registerchallengescallback( "roundEnd", ::challengeroundend ); - } - level thread onplayerconnect(); - _a24 = level.teams; - _k24 = getFirstArrayKey( _a24 ); - while ( isDefined( _k24 ) ) - { - team = _a24[ _k24 ]; - initteamchallenges( team ); - _k24 = getNextArrayKey( _a24, _k24 ); - } + if ( !isdefined( level.challengescallbacks ) ) + level.challengescallbacks = []; + + waittillframeend; + + if ( canprocesschallenges() ) + { + registerchallengescallback( "playerKilled", ::challengekills ); + registerchallengescallback( "gameEnd", ::challengegameend ); + registerchallengescallback( "roundEnd", ::challengeroundend ); + } + + level thread onplayerconnect(); + + foreach ( team in level.teams ) + initteamchallenges( team ); } addflyswatterstat( weapon, aircraft ) { - if ( !isDefined( self.pers[ "flyswattercount" ] ) ) - { - self.pers[ "flyswattercount" ] = 0; - } - self addweaponstat( weapon, "destroyed_aircraft", 1 ); - self.pers[ "flyswattercount" ]++; - if ( self.pers[ "flyswattercount" ] == 5 ) - { - self addweaponstat( weapon, "destroyed_5_aircraft", 1 ); - } - if ( isDefined( aircraft ) && isDefined( aircraft.birthtime ) ) - { - if ( ( getTime() - aircraft.birthtime ) < 20000 ) - { - self addweaponstat( weapon, "destroyed_aircraft_under20s", 1 ); - } - } - if ( !isDefined( self.destroyedaircrafttime ) ) - { - self.destroyedaircrafttime = []; - } - if ( isDefined( self.destroyedaircrafttime[ weapon ] ) && ( getTime() - self.destroyedaircrafttime[ weapon ] ) < 10000 ) - { - self addweaponstat( weapon, "destroyed_2aircraft_quickly", 1 ); - } - else - { - self.destroyedaircrafttime[ weapon ] = getTime(); - } + if ( !isdefined( self.pers["flyswattercount"] ) ) + self.pers["flyswattercount"] = 0; + + self addweaponstat( weapon, "destroyed_aircraft", 1 ); + self.pers["flyswattercount"]++; + + if ( self.pers["flyswattercount"] == 5 ) + self addweaponstat( weapon, "destroyed_5_aircraft", 1 ); + + if ( isdefined( aircraft ) && isdefined( aircraft.birthtime ) ) + { + if ( gettime() - aircraft.birthtime < 20000 ) + self addweaponstat( weapon, "destroyed_aircraft_under20s", 1 ); + } + + if ( !isdefined( self.destroyedaircrafttime ) ) + self.destroyedaircrafttime = []; + + if ( isdefined( self.destroyedaircrafttime[weapon] ) && gettime() - self.destroyedaircrafttime[weapon] < 10000 ) + { + self addweaponstat( weapon, "destroyed_2aircraft_quickly", 1 ); + self.destroyedaircrafttime[weapon] = undefined; + } + else + self.destroyedaircrafttime[weapon] = gettime(); } canprocesschallenges() { /# - if ( getdvarintdefault( "scr_debug_challenges", 0 ) ) - { - return 1; + if ( getdvarintdefault( "scr_debug_challenges", 0 ) ) + return true; #/ - } - if ( level.rankedmatch || level.wagermatch ) - { - return 1; - } - return 0; + if ( level.rankedmatch || level.wagermatch ) + return true; + + return false; } initteamchallenges( team ) { - if ( !isDefined( game[ "challenge" ] ) ) - { - game[ "challenge" ] = []; - } - if ( !isDefined( game[ "challenge" ][ team ] ) ) - { - game[ "challenge" ][ team ] = []; - game[ "challenge" ][ team ][ "plantedBomb" ] = 0; - game[ "challenge" ][ team ][ "destroyedBombSite" ] = 0; - game[ "challenge" ][ team ][ "capturedFlag" ] = 0; - } - game[ "challenge" ][ team ][ "allAlive" ] = 1; + if ( !isdefined( game["challenge"] ) ) + game["challenge"] = []; + + if ( !isdefined( game["challenge"][team] ) ) + { + game["challenge"][team] = []; + game["challenge"][team]["plantedBomb"] = 0; + game["challenge"][team]["destroyedBombSite"] = 0; + game["challenge"][team]["capturedFlag"] = 0; + } + + game["challenge"][team]["allAlive"] = 1; } registerchallengescallback( callback, func ) { - if ( !isDefined( level.challengescallbacks[ callback ] ) ) - { - level.challengescallbacks[ callback ] = []; - } - level.challengescallbacks[ callback ][ level.challengescallbacks[ callback ].size ] = func; + if ( !isdefined( level.challengescallbacks[callback] ) ) + level.challengescallbacks[callback] = []; + + level.challengescallbacks[callback][level.challengescallbacks[callback].size] = func; } dochallengecallback( callback, data ) { - if ( !isDefined( level.challengescallbacks ) ) - { - return; - } - if ( !isDefined( level.challengescallbacks[ callback ] ) ) - { - return; - } - if ( isDefined( data ) ) - { - i = 0; - while ( i < level.challengescallbacks[ callback ].size ) - { - thread [[ level.challengescallbacks[ callback ][ i ] ]]( data ); - i++; - } - } - else i = 0; - while ( i < level.challengescallbacks[ callback ].size ) - { - thread [[ level.challengescallbacks[ callback ][ i ] ]](); - i++; - } + if ( !isdefined( level.challengescallbacks ) ) + return; + + if ( !isdefined( level.challengescallbacks[callback] ) ) + return; + + if ( isdefined( data ) ) + { + for ( i = 0; i < level.challengescallbacks[callback].size; i++ ) + thread [[ level.challengescallbacks[callback][i] ]]( data ); + } + else + { + for ( i = 0; i < level.challengescallbacks[callback].size; i++ ) + thread [[ level.challengescallbacks[callback][i] ]](); + } } onplayerconnect() { - for ( ;; ) - { - level waittill( "connected", player ); - player thread initchallengedata(); - player thread spawnwatcher(); - player thread monitorreloads(); - } + for (;;) + { + level waittill( "connected", player ); + + player thread initchallengedata(); + player thread spawnwatcher(); + player thread monitorreloads(); + } } monitorreloads() { - self endon( "disconnect" ); - while ( 1 ) - { - self waittill( "reload" ); - currentweapon = self getcurrentweapon(); - while ( currentweapon == "none" ) - { - continue; - } - time = getTime(); - self.lastreloadtime = time; - if ( currentweapon == "crossbow_mp" ) - { - self.crossbowclipkillcount = 0; - } - if ( weaponhasattachment( currentweapon, "dualclip" ) ) - { - self thread reloadthenkill( currentweapon ); - } - } + self endon( "disconnect" ); + + while ( true ) + { + self waittill( "reload" ); + + currentweapon = self getcurrentweapon(); + + if ( currentweapon == "none" ) + continue; + + time = gettime(); + self.lastreloadtime = time; + + if ( currentweapon == "crossbow_mp" ) + self.crossbowclipkillcount = 0; + + if ( weaponhasattachment( currentweapon, "dualclip" ) ) + self thread reloadthenkill( currentweapon ); + } } reloadthenkill( reloadweapon ) { - self endon( "disconnect" ); - self endon( "death" ); - self endon( "reloadThenKillTimedOut" ); - self notify( "reloadThenKillStart" ); - self endon( "reloadThenKillStart" ); - self thread reloadthenkilltimeout( 5 ); - for ( ;; ) - { - self waittill( "killed_enemy_player", time, weapon ); - if ( reloadweapon == weapon ) - { - self addplayerstat( "reload_then_kill_dualclip", 1 ); - } - } + self endon( "disconnect" ); + self endon( "death" ); + self endon( "reloadThenKillTimedOut" ); + self notify( "reloadThenKillStart" ); + self endon( "reloadThenKillStart" ); + self thread reloadthenkilltimeout( 5 ); + + for (;;) + { + self waittill( "killed_enemy_player", time, weapon ); + + if ( reloadweapon == weapon ) + self addplayerstat( "reload_then_kill_dualclip", 1 ); + } } reloadthenkilltimeout( time ) { - self endon( "disconnect" ); - self endon( "death" ); - self endon( "reloadThenKillStart" ); - wait time; - self notify( "reloadThenKillTimedOut" ); + self endon( "disconnect" ); + self endon( "death" ); + self endon( "reloadThenKillStart" ); + wait( time ); + self notify( "reloadThenKillTimedOut" ); } initchallengedata() { - self.pers[ "bulletStreak" ] = 0; - self.pers[ "lastBulletKillTime" ] = 0; - self.pers[ "stickExplosiveKill" ] = 0; - self.pers[ "carepackagesCalled" ] = 0; - self.explosiveinfo = []; + self.pers["bulletStreak"] = 0; + self.pers["lastBulletKillTime"] = 0; + self.pers["stickExplosiveKill"] = 0; + self.pers["carepackagesCalled"] = 0; + self.explosiveinfo = []; } isdamagefromplayercontrolledaitank( eattacker, einflictor, sweapon ) { - if ( sweapon == "ai_tank_drone_gun_mp" ) - { - if ( isDefined( eattacker ) && isDefined( eattacker.remoteweapon ) && isDefined( einflictor ) ) - { - if ( isDefined( einflictor.controlled ) && einflictor.controlled == 1 ) - { - if ( eattacker.remoteweapon == einflictor ) - { - return 1; - } - } - } - } - else - { - if ( sweapon == "ai_tank_drone_rocket_mp" ) - { - if ( isDefined( einflictor ) && !isDefined( einflictor.from_ai ) ) - { - return 1; - } - } - } - return 0; + if ( sweapon == "ai_tank_drone_gun_mp" ) + { + if ( isdefined( eattacker ) && isdefined( eattacker.remoteweapon ) && isdefined( einflictor ) ) + { + if ( isdefined( einflictor.controlled ) && einflictor.controlled == 1 ) + { + if ( eattacker.remoteweapon == einflictor ) + return true; + } + } + } + else if ( sweapon == "ai_tank_drone_rocket_mp" ) + { + if ( isdefined( einflictor ) && !isdefined( einflictor.from_ai ) ) + return true; + } + + return false; } isdamagefromplayercontrolledsentry( eattacker, einflictor, sweapon ) { - if ( sweapon == "auto_gun_turret_mp" ) - { - if ( isDefined( eattacker ) && isDefined( eattacker.remoteweapon ) && isDefined( einflictor ) ) - { - if ( eattacker.remoteweapon == einflictor ) - { - if ( isDefined( einflictor.controlled ) && einflictor.controlled == 1 ) - { - return 1; - } - } - } - } - return 0; + if ( sweapon == "auto_gun_turret_mp" ) + { + if ( isdefined( eattacker ) && isdefined( eattacker.remoteweapon ) && isdefined( einflictor ) ) + { + if ( eattacker.remoteweapon == einflictor ) + { + if ( isdefined( einflictor.controlled ) && einflictor.controlled == 1 ) + return true; + } + } + } + + return false; } challengekills( data, time ) { - victim = data.victim; - player = data.attacker; - attacker = data.attacker; - time = data.time; - victim = data.victim; - weapon = data.sweapon; - time = data.time; - inflictor = data.einflictor; - meansofdeath = data.smeansofdeath; - wasplanting = data.wasplanting; - wasdefusing = data.wasdefusing; - lastweaponbeforetoss = data.lastweaponbeforetoss; - ownerweaponatlaunch = data.ownerweaponatlaunch; - if ( !isDefined( data.sweapon ) ) - { - return; - } - if ( !isDefined( player ) || !isplayer( player ) ) - { - return; - } - weaponclass = getweaponclass( weapon ); - game[ "challenge" ][ victim.team ][ "allAlive" ] = 0; - if ( level.teambased ) - { - if ( player.team == victim.team ) - { - return; - } - } - else - { - if ( player == victim ) - { - return; - } - } - if ( isdamagefromplayercontrolledaitank( player, inflictor, weapon ) == 1 ) - { - player addplayerstat( "kill_with_remote_control_ai_tank", 1 ); - } - if ( weapon == "auto_gun_turret_mp" ) - { - if ( isDefined( inflictor ) ) - { - if ( !isDefined( inflictor.killcount ) ) - { - inflictor.killcount = 0; - } - inflictor.killcount++; - if ( inflictor.killcount >= 5 ) - { - inflictor.killcount = 0; - player addplayerstat( "killstreak_5_with_sentry_gun", 1 ); - } - } - if ( isdamagefromplayercontrolledsentry( player, inflictor, weapon ) == 1 ) - { - player addplayerstat( "kill_with_remote_control_sentry_gun", 1 ); - } - } - if ( weapon == "minigun_mp" || weapon == "inventory_minigun_mp" ) - { - player.deathmachinekills++; - if ( player.deathmachinekills >= 5 ) - { - player.deathmachinekills = 0; - player addplayerstat( "killstreak_5_with_death_machine", 1 ); - } - } - if ( data.waslockingon == 1 && weapon == "chopper_minigun_mp" ) - { - player addplayerstat( "kill_enemy_locking_on_with_chopper_gunner", 1 ); - } - if ( isDefined( level.iskillstreakweapon ) ) - { - if ( [[ level.iskillstreakweapon ]]( data.sweapon ) ) - { - return; - } - } - attacker notify( "killed_enemy_player" ); - if ( isDefined( player.primaryloadoutweapon ) || weapon == player.primaryloadoutweapon && isDefined( player.primaryloadoutaltweapon ) && weapon == player.primaryloadoutaltweapon ) - { - if ( player isbonuscardactive( 0, player.class_num ) ) - { - player addbonuscardstat( 0, "kills", 1, player.class_num ); - player addplayerstat( "kill_with_loadout_weapon_with_3_attachments", 1 ); - } - if ( isDefined( player.secondaryweaponkill ) && player.secondaryweaponkill == 1 ) - { - player.primaryweaponkill = 0; - player.secondaryweaponkill = 0; - if ( player isbonuscardactive( 2, player.class_num ) ) - { - player addbonuscardstat( 2, "kills", 1, player.class_num ); - player addplayerstat( "kill_with_both_primary_weapons", 1 ); - } - } - else - { - player.primaryweaponkill = 1; - } - } - else - { - if ( isDefined( player.secondaryloadoutweapon ) || weapon == player.secondaryloadoutweapon && isDefined( player.secondaryloadoutaltweapon ) && weapon == player.secondaryloadoutaltweapon ) - { - if ( player isbonuscardactive( 1, player.class_num ) ) - { - player addbonuscardstat( 1, "kills", 1, player.class_num ); - } - if ( isDefined( player.primaryweaponkill ) && player.primaryweaponkill == 1 ) - { - player.primaryweaponkill = 0; - player.secondaryweaponkill = 0; - if ( player isbonuscardactive( 2, player.class_num ) ) - { - player addbonuscardstat( 2, "kills", 1, player.class_num ); - player addplayerstat( "kill_with_both_primary_weapons", 1 ); - } - } - else - { - player.secondaryweaponkill = 1; - } - } - } - if ( !player isbonuscardactive( 5, player.class_num ) || player isbonuscardactive( 4, player.class_num ) && player isbonuscardactive( 3, player.class_num ) ) - { - player addplayerstat( "kill_with_2_perks_same_category", 1 ); - } - baseweaponname = getreffromitemindex( getbaseweaponitemindex( weapon ) ) + "_mp"; - if ( isDefined( player.weaponkills[ baseweaponname ] ) ) - { - player.weaponkills[ baseweaponname ]++; - if ( player.weaponkills[ baseweaponname ] == 5 ) - { - player addweaponstat( baseweaponname, "killstreak_5", 1 ); - } - if ( player.weaponkills[ baseweaponname ] == 10 ) - { - player addweaponstat( baseweaponname, "killstreak_10", 1 ); - } - } - else - { - player.weaponkills[ baseweaponname ] = 1; - } - attachmentname = player getweaponoptic( weapon ); - if ( isDefined( attachmentname ) && attachmentname != "" ) - { - if ( isDefined( player.attachmentkills[ attachmentname ] ) ) - { - player.attachmentkills[ attachmentname ]++; - if ( player.attachmentkills[ attachmentname ] == 5 ) - { - player addweaponstat( weapon, "killstreak_5_attachment", 1 ); - } - } - else - { - player.attachmentkills[ attachmentname ] = 1; - } - } -/# - assert( isDefined( player.activecounteruavs ) ); -#/ -/# - assert( isDefined( player.activeuavs ) ); -#/ -/# - assert( isDefined( player.activesatellites ) ); -#/ - if ( player.activeuavs > 0 ) - { - player addplayerstat( "kill_while_uav_active", 1 ); - } - if ( player.activecounteruavs > 0 ) - { - player addplayerstat( "kill_while_cuav_active", 1 ); - } - if ( player.activesatellites > 0 ) - { - player addplayerstat( "kill_while_satellite_active", 1 ); - } - if ( isDefined( attacker.tacticalinsertiontime ) && ( attacker.tacticalinsertiontime + 5000 ) > time ) - { - player addplayerstat( "kill_after_tac_insert", 1 ); - player addweaponstat( "tactical_insertion_mp", "CombatRecordStat", 1 ); - } - if ( isDefined( victim.tacticalinsertiontime ) && ( victim.tacticalinsertiontime + 5000 ) > time ) - { - player addweaponstat( "tactical_insertion_mp", "headshots", 1 ); - } - if ( isDefined( level.isplayertrackedfunc ) ) - { - if ( attacker [[ level.isplayertrackedfunc ]]( victim, time ) ) - { - attacker addplayerstat( "kill_enemy_revealed_by_sensor", 1 ); - attacker addweaponstat( "sensor_grenade_mp", "CombatRecordStat", 1 ); - } - } - if ( level.teambased ) - { - activeempowner = level.empowners[ player.team ]; - if ( isDefined( activeempowner ) ) - { - if ( activeempowner == player ) - { - player addplayerstat( "kill_while_emp_active", 1 ); - } - } - } - else - { - if ( isDefined( level.empplayer ) ) - { - if ( level.empplayer == player ) - { - player addplayerstat( "kill_while_emp_active", 1 ); - } - } - } - if ( isDefined( player.flakjacketclaymore[ victim.clientid ] ) && player.flakjacketclaymore[ victim.clientid ] == 1 ) - { - player addplayerstat( "survive_claymore_kill_planter_flak_jacket_equipped", 1 ); - } - if ( isDefined( player.dogsactive ) ) - { - if ( weapon != "dog_bite_mp" ) - { - player.dogsactivekillstreak++; - if ( player.dogsactivekillstreak > 5 ) - { - player addplayerstat( "killstreak_5_dogs", 1 ); - } - } - } - isstunned = 0; - if ( victim maps/mp/_utility::isflashbanged() ) - { - if ( isDefined( victim.lastflashedby ) && victim.lastflashedby == player ) - { - player addplayerstat( "kill_flashed_enemy", 1 ); - player addweaponstat( "flash_grenade_mp", "CombatRecordStat", 1 ); - } - isstunned = 1; - } - if ( isDefined( victim.concussionendtime ) && victim.concussionendtime > getTime() ) - { - if ( isDefined( victim.lastconcussedby ) && victim.lastconcussedby == player ) - { - player addplayerstat( "kill_concussed_enemy", 1 ); - player addweaponstat( "concussion_grenade_mp", "CombatRecordStat", 1 ); - } - isstunned = 1; - } - if ( isDefined( player.laststunnedby ) ) - { - if ( player.laststunnedby == victim && ( player.laststunnedtime + 5000 ) > time ) - { - player addplayerstat( "kill_enemy_who_shocked_you", 1 ); - } - } - if ( isDefined( victim.laststunnedby ) && ( victim.laststunnedtime + 5000 ) > time ) - { - isstunned = 1; - if ( victim.laststunnedby == player ) - { - player addplayerstat( "kill_shocked_enemy", 1 ); - player addweaponstat( "proximity_grenade_mp", "CombatRecordStat", 1 ); - if ( data.smeansofdeath == "MOD_MELEE" ) - { - player addplayerstat( "shock_enemy_then_stab_them", 1 ); - } - } - } - if ( ( player.mantletime + 5000 ) > time ) - { - player addplayerstat( "mantle_then_kill", 1 ); - } - if ( isDefined( player.tookweaponfrom ) && isDefined( player.tookweaponfrom[ weapon ] ) && isDefined( player.tookweaponfrom[ weapon ].previousowner ) ) - { - if ( level.teambased ) - { - if ( player.tookweaponfrom[ weapon ].previousowner.team != player.team ) - { - player.pickedupweaponkills[ weapon ]++; - player addplayerstat( "kill_enemy_with_picked_up_weapon", 1 ); - } - } - else - { - player.pickedupweaponkills[ weapon ]++; - player addplayerstat( "kill_enemy_with_picked_up_weapon", 1 ); - } - if ( player.pickedupweaponkills[ weapon ] >= 5 ) - { - player.pickedupweaponkills[ weapon ] = 0; - player addplayerstat( "killstreak_5_picked_up_weapon", 1 ); - } - } - if ( isDefined( victim.explosiveinfo[ "originalOwnerKill" ] ) && victim.explosiveinfo[ "originalOwnerKill" ] == 1 ) - { - if ( victim.explosiveinfo[ "damageExplosiveKill" ] == 1 ) - { - player addplayerstat( "kill_enemy_shoot_their_explosive", 1 ); - } - } - if ( data.attackerstance == "crouch" ) - { - player addplayerstat( "kill_enemy_while_crouched", 1 ); - } - else - { - if ( data.attackerstance == "prone" ) - { - player addplayerstat( "kill_enemy_while_prone", 1 ); - } - } - if ( data.victimstance == "prone" ) - { - player addplayerstat( "kill_prone_enemy", 1 ); - } - if ( data.smeansofdeath != "MOD_HEAD_SHOT" || data.smeansofdeath == "MOD_PISTOL_BULLET" && data.smeansofdeath == "MOD_RIFLE_BULLET" ) - { - player genericbulletkill( data, victim, weapon ); - } - if ( level.teambased ) - { - if ( !isDefined( player.pers[ "kill_every_enemy" ] ) && level.playercount[ victim.pers[ "team" ] ] > 3 && player.pers[ "killed_players" ].size >= level.playercount[ victim.pers[ "team" ] ] ) - { - player addplayerstat( "kill_every_enemy", 1 ); - player.pers[ "kill_every_enemy" ] = 1; - } - } - switch( weaponclass ) - { - case "weapon_pistol": - if ( data.smeansofdeath == "MOD_HEAD_SHOT" ) - { - player.pers[ "pistolHeadshot" ]++; - if ( player.pers[ "pistolHeadshot" ] >= 10 ) - { - player.pers[ "pistolHeadshot" ] = 0; - player addplayerstat( "pistolHeadshot_10_onegame", 1 ); - } - } - break; - case "weapon_assault": - if ( data.smeansofdeath == "MOD_HEAD_SHOT" ) - { - player.pers[ "assaultRifleHeadshot" ]++; - if ( player.pers[ "assaultRifleHeadshot" ] >= 5 ) - { - player.pers[ "assaultRifleHeadshot" ] = 0; - player addplayerstat( "headshot_assault_5_onegame", 1 ); - } - } - break; - case "weapon_lmg": - case "weapon_smg": - case "weapon_sniper": - if ( isDefined( victim.firsttimedamaged ) && victim.firsttimedamaged == time ) - { - player addplayerstat( "kill_enemy_one_bullet_sniper", 1 ); - player addweaponstat( weapon, "kill_enemy_one_bullet_sniper", 1 ); - if ( !isDefined( player.pers[ "one_shot_sniper_kills" ] ) ) - { - player.pers[ "one_shot_sniper_kills" ] = 0; - } - player.pers[ "one_shot_sniper_kills" ]++; - if ( player.pers[ "one_shot_sniper_kills" ] == 10 ) - { - player addplayerstat( "kill_10_enemy_one_bullet_sniper_onegame", 1 ); - } - } - break; - case "weapon_cqb": - if ( isDefined( victim.firsttimedamaged ) && victim.firsttimedamaged == time ) - { - player addplayerstat( "kill_enemy_one_bullet_shotgun", 1 ); - player addweaponstat( weapon, "kill_enemy_one_bullet_shotgun", 1 ); - if ( !isDefined( player.pers[ "one_shot_shotgun_kills" ] ) ) - { - player.pers[ "one_shot_shotgun_kills" ] = 0; - } - player.pers[ "one_shot_shotgun_kills" ]++; - if ( player.pers[ "one_shot_shotgun_kills" ] == 10 ) - { - player addplayerstat( "kill_10_enemy_one_bullet_shotgun_onegame", 1 ); - } - } - break; - } - if ( data.smeansofdeath == "MOD_MELEE" ) - { - if ( weaponhasattachment( weapon, "tacknife" ) ) - { - player addplayerstat( "kill_enemy_with_tacknife", 1 ); - player bladekill(); - } - else if ( weapon == "knife_ballistic_mp" ) - { - player bladekill(); - player addweaponstat( weapon, "ballistic_knife_melee", 1 ); - } - else if ( weapon == "knife_held_mp" || weapon == "knife_mp" ) - { - player bladekill(); - } - else - { - if ( weapon == "riotshield_mp" ) - { - if ( ( victim.lastfiretime + 3000 ) > time ) - { - player addweaponstat( weapon, "shield_melee_while_enemy_shooting", 1 ); - } - } - } - } - else - { - if ( data.smeansofdeath == "MOD_IMPACT" && baseweaponname == "crossbow_mp" ) - { - if ( weaponhasattachment( weapon, "stackfire" ) ) - { - player addplayerstat( "KILL_CROSSBOW_STACKFIRE", 1 ); - } - } - else - { - if ( isDefined( ownerweaponatlaunch ) ) - { - if ( weaponhasattachment( ownerweaponatlaunch, "stackfire" ) ) - { - player addplayerstat( "KILL_CROSSBOW_STACKFIRE", 1 ); - } - } - } - if ( weapon == "knife_ballistic_mp" ) - { - player bladekill(); - if ( isDefined( player.retreivedblades ) && player.retreivedblades > 0 ) - { - player.retreivedblades--; + victim = data.victim; + player = data.attacker; + attacker = data.attacker; + time = data.time; + victim = data.victim; + weapon = data.sweapon; + time = data.time; + inflictor = data.einflictor; + meansofdeath = data.smeansofdeath; + wasplanting = data.wasplanting; + wasdefusing = data.wasdefusing; + lastweaponbeforetoss = data.lastweaponbeforetoss; + ownerweaponatlaunch = data.ownerweaponatlaunch; - player addweaponstat( weapon, "kill_retrieved_blade", 1 ); - } - } - } - lethalgrenadekill = 0; - switch( weapon ) - { - case "bouncingbetty_mp": - lethalgrenadekill = 1; - player notify( "lethalGrenadeKill" ); - break; - case "hatchet_mp": - player bladekill(); - lethalgrenadekill = 1; - player notify( "lethalGrenadeKill" ); - if ( isDefined( lastweaponbeforetoss ) ) - { - if ( lastweaponbeforetoss == level.riotshield_name ) - { - player addweaponstat( level.riotshield_name, "hatchet_kill_with_shield_equiped", 1 ); - player addplayerstat( "hatchet_kill_with_shield_equiped", 1 ); - } - } - break; - case "claymore_mp": - lethalgrenadekill = 1; - player notify( "lethalGrenadeKill" ); - player addplayerstat( "kill_with_claymore", 1 ); - if ( data.washacked ) - { - player addplayerstat( "kill_with_hacked_claymore", 1 ); - } - break; - case "satchel_charge_mp": - lethalgrenadekill = 1; - player notify( "lethalGrenadeKill" ); - player addplayerstat( "kill_with_c4", 1 ); - break; - case "destructible_car_mp": - player addplayerstat( "kill_enemy_withcar", 1 ); - if ( isDefined( inflictor.destroyingweapon ) ) - { - player addweaponstat( inflictor.destroyingweapon, "kills_from_cars", 1 ); - } - break; - case "sticky_grenade_mp": - lethalgrenadekill = 1; - player notify( "lethalGrenadeKill" ); - if ( isDefined( victim.explosiveinfo[ "stuckToPlayer" ] ) && victim.explosiveinfo[ "stuckToPlayer" ] == victim ) - { - attacker.pers[ "stickExplosiveKill" ]++; - if ( attacker.pers[ "stickExplosiveKill" ] >= 5 ) - { - attacker.pers[ "stickExplosiveKill" ] = 0; - player addplayerstat( "stick_explosive_kill_5_onegame", 1 ); - } - } - break; - case "frag_grenade_mp": - lethalgrenadekill = 1; - player notify( "lethalGrenadeKill" ); - if ( isDefined( data.victim.explosiveinfo[ "cookedKill" ] ) && data.victim.explosiveinfo[ "cookedKill" ] == 1 ) - { - player addplayerstat( "kill_with_cooked_grenade", 1 ); - } - if ( isDefined( data.victim.explosiveinfo[ "throwbackKill" ] ) && data.victim.explosiveinfo[ "throwbackKill" ] == 1 ) - { - player addplayerstat( "kill_with_tossed_back_lethal", 1 ); - } - break; - case "crossbow_mp": - case "explosive_bolt_mp": - if ( !isDefined( player.crossbowclipkillcount ) ) - { - player.crossbowclipkillcount = 0; - } - player.crossbowclipkillcount++; - if ( player.crossbowclipkillcount >= weaponclipsize( "crossbow_mp" ) ) - { - player.crossbowclipkillcount = 0; - player addweaponstat( "crossbow_mp", "crossbow_kill_clip", 1 ); - } - break; - } - if ( lethalgrenadekill ) - { - if ( player isbonuscardactive( 6, player.class_num ) ) - { - player addbonuscardstat( 6, "kills", 1, player.class_num ); - if ( !isDefined( player.pers[ "dangerCloseKills" ] ) ) - { - player.pers[ "dangerCloseKills" ] = 0; - } - player.pers[ "dangerCloseKills" ]++; - if ( player.pers[ "dangerCloseKills" ] == 5 ) - { - player addplayerstat( "kill_with_dual_lethal_grenades", 1 ); - } - } - } - player perkkills( victim, isstunned, time ); - } + if ( !isdefined( data.sweapon ) ) + return; + + if ( !isdefined( player ) || !isplayer( player ) ) + return; + + weaponclass = getweaponclass( weapon ); + game["challenge"][victim.team]["allAlive"] = 0; + + if ( level.teambased ) + { + if ( player.team == victim.team ) + return; + } + else if ( player == victim ) + return; + + if ( isdamagefromplayercontrolledaitank( player, inflictor, weapon ) == 1 ) + player addplayerstat( "kill_with_remote_control_ai_tank", 1 ); + + if ( weapon == "auto_gun_turret_mp" ) + { + if ( isdefined( inflictor ) ) + { + if ( !isdefined( inflictor.killcount ) ) + inflictor.killcount = 0; + + inflictor.killcount++; + + if ( inflictor.killcount >= 5 ) + { + inflictor.killcount = 0; + player addplayerstat( "killstreak_5_with_sentry_gun", 1 ); + } + } + + if ( isdamagefromplayercontrolledsentry( player, inflictor, weapon ) == 1 ) + player addplayerstat( "kill_with_remote_control_sentry_gun", 1 ); + } + + if ( weapon == "minigun_mp" || weapon == "inventory_minigun_mp" ) + { + player.deathmachinekills++; + + if ( player.deathmachinekills >= 5 ) + { + player.deathmachinekills = 0; + player addplayerstat( "killstreak_5_with_death_machine", 1 ); + } + } + + if ( data.waslockingon == 1 && weapon == "chopper_minigun_mp" ) + player addplayerstat( "kill_enemy_locking_on_with_chopper_gunner", 1 ); + + if ( isdefined( level.iskillstreakweapon ) ) + { + if ( [[ level.iskillstreakweapon ]]( data.sweapon ) ) + return; + } + + attacker notify( "killed_enemy_player", time, weapon ); + + if ( isdefined( player.primaryloadoutweapon ) && weapon == player.primaryloadoutweapon || isdefined( player.primaryloadoutaltweapon ) && weapon == player.primaryloadoutaltweapon ) + { + if ( player isbonuscardactive( 0, player.class_num ) ) + { + player addbonuscardstat( 0, "kills", 1, player.class_num ); + player addplayerstat( "kill_with_loadout_weapon_with_3_attachments", 1 ); + } + + if ( isdefined( player.secondaryweaponkill ) && player.secondaryweaponkill == 1 ) + { + player.primaryweaponkill = 0; + player.secondaryweaponkill = 0; + + if ( player isbonuscardactive( 2, player.class_num ) ) + { + player addbonuscardstat( 2, "kills", 1, player.class_num ); + player addplayerstat( "kill_with_both_primary_weapons", 1 ); + } + } + else + player.primaryweaponkill = 1; + } + else if ( isdefined( player.secondaryloadoutweapon ) && weapon == player.secondaryloadoutweapon || isdefined( player.secondaryloadoutaltweapon ) && weapon == player.secondaryloadoutaltweapon ) + { + if ( player isbonuscardactive( 1, player.class_num ) ) + player addbonuscardstat( 1, "kills", 1, player.class_num ); + + if ( isdefined( player.primaryweaponkill ) && player.primaryweaponkill == 1 ) + { + player.primaryweaponkill = 0; + player.secondaryweaponkill = 0; + + if ( player isbonuscardactive( 2, player.class_num ) ) + { + player addbonuscardstat( 2, "kills", 1, player.class_num ); + player addplayerstat( "kill_with_both_primary_weapons", 1 ); + } + } + else + player.secondaryweaponkill = 1; + } + + if ( player isbonuscardactive( 5, player.class_num ) || player isbonuscardactive( 4, player.class_num ) || player isbonuscardactive( 3, player.class_num ) ) + player addplayerstat( "kill_with_2_perks_same_category", 1 ); + + baseweaponname = getreffromitemindex( getbaseweaponitemindex( weapon ) ) + "_mp"; + + if ( isdefined( player.weaponkills[baseweaponname] ) ) + { + player.weaponkills[baseweaponname]++; + + if ( player.weaponkills[baseweaponname] == 5 ) + player addweaponstat( baseweaponname, "killstreak_5", 1 ); + + if ( player.weaponkills[baseweaponname] == 10 ) + player addweaponstat( baseweaponname, "killstreak_10", 1 ); + } + else + player.weaponkills[baseweaponname] = 1; + + attachmentname = player getweaponoptic( weapon ); + + if ( isdefined( attachmentname ) && attachmentname != "" ) + { + if ( isdefined( player.attachmentkills[attachmentname] ) ) + { + player.attachmentkills[attachmentname]++; + + if ( player.attachmentkills[attachmentname] == 5 ) + player addweaponstat( weapon, "killstreak_5_attachment", 1 ); + } + else + player.attachmentkills[attachmentname] = 1; + } +/# + assert( isdefined( player.activecounteruavs ) ); +#/ +/# + assert( isdefined( player.activeuavs ) ); +#/ +/# + assert( isdefined( player.activesatellites ) ); +#/ + if ( player.activeuavs > 0 ) + player addplayerstat( "kill_while_uav_active", 1 ); + + if ( player.activecounteruavs > 0 ) + player addplayerstat( "kill_while_cuav_active", 1 ); + + if ( player.activesatellites > 0 ) + player addplayerstat( "kill_while_satellite_active", 1 ); + + if ( isdefined( attacker.tacticalinsertiontime ) && attacker.tacticalinsertiontime + 5000 > time ) + { + player addplayerstat( "kill_after_tac_insert", 1 ); + player addweaponstat( "tactical_insertion_mp", "CombatRecordStat", 1 ); + } + + if ( isdefined( victim.tacticalinsertiontime ) && victim.tacticalinsertiontime + 5000 > time ) + player addweaponstat( "tactical_insertion_mp", "headshots", 1 ); + + if ( isdefined( level.isplayertrackedfunc ) ) + { + if ( attacker [[ level.isplayertrackedfunc ]]( victim, time ) ) + { + attacker addplayerstat( "kill_enemy_revealed_by_sensor", 1 ); + attacker addweaponstat( "sensor_grenade_mp", "CombatRecordStat", 1 ); + } + } + + if ( level.teambased ) + { + activeempowner = level.empowners[player.team]; + + if ( isdefined( activeempowner ) ) + { + if ( activeempowner == player ) + player addplayerstat( "kill_while_emp_active", 1 ); + } + } + else if ( isdefined( level.empplayer ) ) + { + if ( level.empplayer == player ) + player addplayerstat( "kill_while_emp_active", 1 ); + } + + if ( isdefined( player.flakjacketclaymore[victim.clientid] ) && player.flakjacketclaymore[victim.clientid] == 1 ) + player addplayerstat( "survive_claymore_kill_planter_flak_jacket_equipped", 1 ); + + if ( isdefined( player.dogsactive ) ) + { + if ( weapon != "dog_bite_mp" ) + { + player.dogsactivekillstreak++; + + if ( player.dogsactivekillstreak > 5 ) + player addplayerstat( "killstreak_5_dogs", 1 ); + } + } + + isstunned = 0; + + if ( victim maps\mp\_utility::isflashbanged() ) + { + if ( isdefined( victim.lastflashedby ) && victim.lastflashedby == player ) + { + player addplayerstat( "kill_flashed_enemy", 1 ); + player addweaponstat( "flash_grenade_mp", "CombatRecordStat", 1 ); + } + + isstunned = 1; + } + + if ( isdefined( victim.concussionendtime ) && victim.concussionendtime > gettime() ) + { + if ( isdefined( victim.lastconcussedby ) && victim.lastconcussedby == player ) + { + player addplayerstat( "kill_concussed_enemy", 1 ); + player addweaponstat( "concussion_grenade_mp", "CombatRecordStat", 1 ); + } + + isstunned = 1; + } + + if ( isdefined( player.laststunnedby ) ) + { + if ( player.laststunnedby == victim && player.laststunnedtime + 5000 > time ) + player addplayerstat( "kill_enemy_who_shocked_you", 1 ); + } + + if ( isdefined( victim.laststunnedby ) && victim.laststunnedtime + 5000 > time ) + { + isstunned = 1; + + if ( victim.laststunnedby == player ) + { + player addplayerstat( "kill_shocked_enemy", 1 ); + player addweaponstat( "proximity_grenade_mp", "CombatRecordStat", 1 ); + + if ( data.smeansofdeath == "MOD_MELEE" ) + player addplayerstat( "shock_enemy_then_stab_them", 1 ); + } + } + + if ( player.mantletime + 5000 > time ) + player addplayerstat( "mantle_then_kill", 1 ); + + if ( isdefined( player.tookweaponfrom ) && isdefined( player.tookweaponfrom[weapon] ) && isdefined( player.tookweaponfrom[weapon].previousowner ) ) + { + if ( level.teambased ) + { + if ( player.tookweaponfrom[weapon].previousowner.team != player.team ) + { + player.pickedupweaponkills[weapon]++; + player addplayerstat( "kill_enemy_with_picked_up_weapon", 1 ); + } + } + else + { + player.pickedupweaponkills[weapon]++; + player addplayerstat( "kill_enemy_with_picked_up_weapon", 1 ); + } + + if ( player.pickedupweaponkills[weapon] >= 5 ) + { + player.pickedupweaponkills[weapon] = 0; + player addplayerstat( "killstreak_5_picked_up_weapon", 1 ); + } + } + + if ( isdefined( victim.explosiveinfo["originalOwnerKill"] ) && victim.explosiveinfo["originalOwnerKill"] == 1 ) + { + if ( victim.explosiveinfo["damageExplosiveKill"] == 1 ) + player addplayerstat( "kill_enemy_shoot_their_explosive", 1 ); + } + + if ( data.attackerstance == "crouch" ) + player addplayerstat( "kill_enemy_while_crouched", 1 ); + else if ( data.attackerstance == "prone" ) + player addplayerstat( "kill_enemy_while_prone", 1 ); + + if ( data.victimstance == "prone" ) + player addplayerstat( "kill_prone_enemy", 1 ); + + if ( data.smeansofdeath == "MOD_HEAD_SHOT" || data.smeansofdeath == "MOD_PISTOL_BULLET" || data.smeansofdeath == "MOD_RIFLE_BULLET" ) + player genericbulletkill( data, victim, weapon ); + + if ( level.teambased ) + { + if ( !isdefined( player.pers["kill_every_enemy"] ) && ( level.playercount[victim.pers["team"]] > 3 && player.pers["killed_players"].size >= level.playercount[victim.pers["team"]] ) ) + { + player addplayerstat( "kill_every_enemy", 1 ); + player.pers["kill_every_enemy"] = 1; + } + } + + switch ( weaponclass ) + { + case "weapon_pistol": + if ( data.smeansofdeath == "MOD_HEAD_SHOT" ) + { + player.pers["pistolHeadshot"]++; + + if ( player.pers["pistolHeadshot"] >= 10 ) + { + player.pers["pistolHeadshot"] = 0; + player addplayerstat( "pistolHeadshot_10_onegame", 1 ); + } + } + + break; + case "weapon_assault": + if ( data.smeansofdeath == "MOD_HEAD_SHOT" ) + { + player.pers["assaultRifleHeadshot"]++; + + if ( player.pers["assaultRifleHeadshot"] >= 5 ) + { + player.pers["assaultRifleHeadshot"] = 0; + player addplayerstat( "headshot_assault_5_onegame", 1 ); + } + } + + break; + case "weapon_smg": + case "weapon_lmg": + break; + case "weapon_sniper": + if ( isdefined( victim.firsttimedamaged ) && victim.firsttimedamaged == time ) + { + player addplayerstat( "kill_enemy_one_bullet_sniper", 1 ); + player addweaponstat( weapon, "kill_enemy_one_bullet_sniper", 1 ); + + if ( !isdefined( player.pers["one_shot_sniper_kills"] ) ) + player.pers["one_shot_sniper_kills"] = 0; + + player.pers["one_shot_sniper_kills"]++; + + if ( player.pers["one_shot_sniper_kills"] == 10 ) + player addplayerstat( "kill_10_enemy_one_bullet_sniper_onegame", 1 ); + } + + break; + case "weapon_cqb": + if ( isdefined( victim.firsttimedamaged ) && victim.firsttimedamaged == time ) + { + player addplayerstat( "kill_enemy_one_bullet_shotgun", 1 ); + player addweaponstat( weapon, "kill_enemy_one_bullet_shotgun", 1 ); + + if ( !isdefined( player.pers["one_shot_shotgun_kills"] ) ) + player.pers["one_shot_shotgun_kills"] = 0; + + player.pers["one_shot_shotgun_kills"]++; + + if ( player.pers["one_shot_shotgun_kills"] == 10 ) + player addplayerstat( "kill_10_enemy_one_bullet_shotgun_onegame", 1 ); + } + + break; + } + + if ( data.smeansofdeath == "MOD_MELEE" ) + { + if ( weaponhasattachment( weapon, "tacknife" ) ) + { + player addplayerstat( "kill_enemy_with_tacknife", 1 ); + player bladekill(); + } + else if ( weapon == "knife_ballistic_mp" ) + { + player bladekill(); + player addweaponstat( weapon, "ballistic_knife_melee", 1 ); + } + else if ( weapon == "knife_held_mp" || weapon == "knife_mp" ) + player bladekill(); + else if ( weapon == "riotshield_mp" ) + { + if ( victim.lastfiretime + 3000 > time ) + player addweaponstat( weapon, "shield_melee_while_enemy_shooting", 1 ); + } + } + else + { + if ( data.smeansofdeath == "MOD_IMPACT" && baseweaponname == "crossbow_mp" ) + { + if ( weaponhasattachment( weapon, "stackfire" ) ) + player addplayerstat( "KILL_CROSSBOW_STACKFIRE", 1 ); + } + else if ( isdefined( ownerweaponatlaunch ) ) + { + if ( weaponhasattachment( ownerweaponatlaunch, "stackfire" ) ) + player addplayerstat( "KILL_CROSSBOW_STACKFIRE", 1 ); + } + + if ( weapon == "knife_ballistic_mp" ) + { + player bladekill(); + + if ( isdefined( player.retreivedblades ) && player.retreivedblades > 0 ) + { + player.retreivedblades--; + player addweaponstat( weapon, "kill_retrieved_blade", 1 ); + } + } + } + + lethalgrenadekill = 0; + + switch ( weapon ) + { + case "bouncingbetty_mp": + lethalgrenadekill = 1; + player notify( "lethalGrenadeKill" ); + break; + case "hatchet_mp": + player bladekill(); + lethalgrenadekill = 1; + player notify( "lethalGrenadeKill" ); + + if ( isdefined( lastweaponbeforetoss ) ) + { + if ( lastweaponbeforetoss == level.riotshield_name ) + { + player addweaponstat( level.riotshield_name, "hatchet_kill_with_shield_equiped", 1 ); + player addplayerstat( "hatchet_kill_with_shield_equiped", 1 ); + } + } + + break; + case "claymore_mp": + lethalgrenadekill = 1; + player notify( "lethalGrenadeKill" ); + player addplayerstat( "kill_with_claymore", 1 ); + + if ( data.washacked ) + player addplayerstat( "kill_with_hacked_claymore", 1 ); + + break; + case "satchel_charge_mp": + lethalgrenadekill = 1; + player notify( "lethalGrenadeKill" ); + player addplayerstat( "kill_with_c4", 1 ); + break; + case "destructible_car_mp": + player addplayerstat( "kill_enemy_withcar", 1 ); + + if ( isdefined( inflictor.destroyingweapon ) ) + player addweaponstat( inflictor.destroyingweapon, "kills_from_cars", 1 ); + + break; + case "sticky_grenade_mp": + lethalgrenadekill = 1; + player notify( "lethalGrenadeKill" ); + + if ( isdefined( victim.explosiveinfo["stuckToPlayer"] ) && victim.explosiveinfo["stuckToPlayer"] == victim ) + { + attacker.pers["stickExplosiveKill"]++; + + if ( attacker.pers["stickExplosiveKill"] >= 5 ) + { + attacker.pers["stickExplosiveKill"] = 0; + player addplayerstat( "stick_explosive_kill_5_onegame", 1 ); + } + } + + break; + case "frag_grenade_mp": + lethalgrenadekill = 1; + player notify( "lethalGrenadeKill" ); + + if ( isdefined( data.victim.explosiveinfo["cookedKill"] ) && data.victim.explosiveinfo["cookedKill"] == 1 ) + player addplayerstat( "kill_with_cooked_grenade", 1 ); + + if ( isdefined( data.victim.explosiveinfo["throwbackKill"] ) && data.victim.explosiveinfo["throwbackKill"] == 1 ) + player addplayerstat( "kill_with_tossed_back_lethal", 1 ); + + break; + case "explosive_bolt_mp": + case "crossbow_mp": + if ( !isdefined( player.crossbowclipkillcount ) ) + player.crossbowclipkillcount = 0; + + player.crossbowclipkillcount++; + + if ( player.crossbowclipkillcount >= weaponclipsize( "crossbow_mp" ) ) + { + player.crossbowclipkillcount = 0; + player addweaponstat( "crossbow_mp", "crossbow_kill_clip", 1 ); + } + + break; + } + + if ( lethalgrenadekill ) + { + if ( player isbonuscardactive( 6, player.class_num ) ) + { + player addbonuscardstat( 6, "kills", 1, player.class_num ); + + if ( !isdefined( player.pers["dangerCloseKills"] ) ) + player.pers["dangerCloseKills"] = 0; + + player.pers["dangerCloseKills"]++; + + if ( player.pers["dangerCloseKills"] == 5 ) + player addplayerstat( "kill_with_dual_lethal_grenades", 1 ); + } + } + + player perkkills( victim, isstunned, time ); } perkkills( victim, isstunned, time ) { - player = self; - if ( player hasperk( "specialty_movefaster" ) ) - { - player addplayerstat( "perk_movefaster_kills", 1 ); - } - if ( player hasperk( "specialty_noname" ) ) - { - player addplayerstat( "perk_noname_kills", 1 ); - } - if ( player hasperk( "specialty_quieter" ) ) - { - player addplayerstat( "perk_quieter_kills", 1 ); - } - if ( player hasperk( "specialty_longersprint" ) ) - { - if ( isDefined( player.lastsprinttime ) && ( getTime() - player.lastsprinttime ) < 2500 ) - { - player addplayerstat( "perk_longersprint", 1 ); - } - } - if ( player hasperk( "specialty_fastmantle" ) ) - { - if ( isDefined( player.lastsprinttime ) && ( getTime() - player.lastsprinttime ) < 2500 && player playerads() >= 1 ) - { - player addplayerstat( "perk_fastmantle_kills", 1 ); - } - } - if ( player hasperk( "specialty_loudenemies" ) ) - { - player addplayerstat( "perk_loudenemies_kills", 1 ); - } - if ( isstunned == 1 && player hasperk( "specialty_stunprotection" ) ) - { - player addplayerstat( "perk_protection_stun_kills", 1 ); - } + player = self; + + if ( player hasperk( "specialty_movefaster" ) ) + player addplayerstat( "perk_movefaster_kills", 1 ); + + if ( player hasperk( "specialty_noname" ) ) + player addplayerstat( "perk_noname_kills", 1 ); + + if ( player hasperk( "specialty_quieter" ) ) + player addplayerstat( "perk_quieter_kills", 1 ); + + if ( player hasperk( "specialty_longersprint" ) ) + { + if ( isdefined( player.lastsprinttime ) && gettime() - player.lastsprinttime < 2500 ) + player addplayerstat( "perk_longersprint", 1 ); + } + + if ( player hasperk( "specialty_fastmantle" ) ) + { + if ( isdefined( player.lastsprinttime ) && gettime() - player.lastsprinttime < 2500 && player playerads() >= 1 ) + player addplayerstat( "perk_fastmantle_kills", 1 ); + } + + if ( player hasperk( "specialty_loudenemies" ) ) + player addplayerstat( "perk_loudenemies_kills", 1 ); + + if ( isstunned == 1 && player hasperk( "specialty_stunprotection" ) ) + player addplayerstat( "perk_protection_stun_kills", 1 ); /# - assert( isDefined( victim.activecounteruavs ) ); + assert( isdefined( victim.activecounteruavs ) ); #/ - activeemp = 0; - if ( level.teambased ) - { - _a905 = level.teams; - _k905 = getFirstArrayKey( _a905 ); - while ( isDefined( _k905 ) ) - { - team = _a905[ _k905 ]; - if ( team == player.team ) - { - } - else - { - if ( isDefined( level.empowners[ team ] ) ) - { - activeemp = 1; - break; - } - } - else - { - _k905 = getNextArrayKey( _a905, _k905 ); - } - } - } - else if ( isDefined( level.empplayer ) ) - { - if ( level.empplayer != player ) - { - activeemp = 1; - } - } - activecuav = 0; - if ( level.teambased ) - { - _a932 = level.teams; - _k932 = getFirstArrayKey( _a932 ); - while ( isDefined( _k932 ) ) - { - team = _a932[ _k932 ]; - if ( team == player.team ) - { - } - else - { - if ( level.activecounteruavs[ team ] > 0 ) - { - activecuav = 1; - break; - } - } - else - { - _k932 = getNextArrayKey( _a932, _k932 ); - } - } - } - else players = level.players; - i = 0; - while ( i < players.size ) - { - if ( players[ i ] != player ) - { - if ( isDefined( level.activecounteruavs[ players[ i ].entnum ] ) && level.activecounteruavs[ players[ i ].entnum ] > 0 ) - { - activecuav = 1; - break; - } - } - else - { - i++; - } - } - if ( activecuav == 1 || activeemp == 1 ) - { - if ( player hasperk( "specialty_immunecounteruav" ) ) - { - player addplayerstat( "perk_immune_cuav_kills", 1 ); - } - } - activeuavvictim = 0; - if ( level.teambased ) - { - if ( level.activeuavs[ victim.team ] > 0 ) - { - activeuavvictim = 1; - } - } - else - { - if ( isDefined( level.activeuavs[ victim.entnum ] ) ) - { - activeuavvictim = level.activeuavs[ victim.entnum ] > 0; - } - } - if ( activeuavvictim == 1 ) - { - if ( player hasperk( "specialty_gpsjammer" ) ) - { - player addplayerstat( "perk_gpsjammer_immune_kills", 1 ); - } - } - if ( ( player.lastweaponchange + 5000 ) > time ) - { - if ( player hasperk( "specialty_fastweaponswitch" ) ) - { - player addplayerstat( "perk_fastweaponswitch_kill_after_swap", 1 ); - } - } - if ( player.scavenged == 1 ) - { - if ( player hasperk( "specialty_scavenger" ) ) - { - player addplayerstat( "perk_scavenger_kills_after_resupply", 1 ); - } - } + activeemp = 0; + + if ( level.teambased ) + { + foreach ( team in level.teams ) + { + if ( team == player.team ) + continue; + + if ( isdefined( level.empowners[team] ) ) + { + activeemp = 1; + break; + } + } + } + else if ( isdefined( level.empplayer ) ) + { + if ( level.empplayer != player ) + activeemp = 1; + } + + activecuav = 0; + + if ( level.teambased ) + { + foreach ( team in level.teams ) + { + if ( team == player.team ) + continue; + + if ( level.activecounteruavs[team] > 0 ) + { + activecuav = 1; + break; + } + } + } + else + { + players = level.players; + + for ( i = 0; i < players.size; i++ ) + { + if ( players[i] != player ) + { + if ( isdefined( level.activecounteruavs[players[i].entnum] ) && level.activecounteruavs[players[i].entnum] > 0 ) + { + activecuav = 1; + break; + } + } + } + } + + if ( activecuav == 1 || activeemp == 1 ) + { + if ( player hasperk( "specialty_immunecounteruav" ) ) + player addplayerstat( "perk_immune_cuav_kills", 1 ); + } + + activeuavvictim = 0; + + if ( level.teambased ) + { + if ( level.activeuavs[victim.team] > 0 ) + activeuavvictim = 1; + } + else + activeuavvictim = isdefined( level.activeuavs[victim.entnum] ) && level.activeuavs[victim.entnum] > 0; + + if ( activeuavvictim == 1 ) + { + if ( player hasperk( "specialty_gpsjammer" ) ) + player addplayerstat( "perk_gpsjammer_immune_kills", 1 ); + } + + if ( player.lastweaponchange + 5000 > time ) + { + if ( player hasperk( "specialty_fastweaponswitch" ) ) + player addplayerstat( "perk_fastweaponswitch_kill_after_swap", 1 ); + } + + if ( player.scavenged == 1 ) + { + if ( player hasperk( "specialty_scavenger" ) ) + player addplayerstat( "perk_scavenger_kills_after_resupply", 1 ); + } } flakjacketprotected( weapon, attacker ) { - if ( weapon == "claymore_mp" ) - { - self.flakjacketclaymore[ attacker.clientid ] = 1; - } - self addplayerstat( "perk_flak_survive", 1 ); + if ( weapon == "claymore_mp" ) + self.flakjacketclaymore[attacker.clientid] = 1; + + self addplayerstat( "perk_flak_survive", 1 ); } earnedkillstreak() { - if ( self hasperk( "specialty_earnmoremomentum" ) ) - { - self addplayerstat( "perk_earnmoremomentum_earn_streak", 1 ); - } + if ( self hasperk( "specialty_earnmoremomentum" ) ) + self addplayerstat( "perk_earnmoremomentum_earn_streak", 1 ); } genericbulletkill( data, victim, weapon ) { - player = self; - time = data.time; - if ( player.pers[ "lastBulletKillTime" ] == time ) - { - player.pers[ "bulletStreak" ]++; - } - else - { - player.pers[ "bulletStreak" ] = 1; - } - player.pers[ "lastBulletKillTime" ] = time; - if ( data.victim.idflagstime == time ) - { - if ( data.victim.idflags & level.idflags_penetration ) - { - player addplayerstat( "kill_enemy_through_wall", 1 ); - if ( isDefined( weapon ) && weaponhasattachment( weapon, "fmj" ) ) - { - player addplayerstat( "kill_enemy_through_wall_with_fmj", 1 ); - } - } - } + player = self; + time = data.time; + + if ( player.pers["lastBulletKillTime"] == time ) + player.pers["bulletStreak"]++; + else + player.pers["bulletStreak"] = 1; + + player.pers["lastBulletKillTime"] = time; + + if ( data.victim.idflagstime == time ) + { + if ( data.victim.idflags & level.idflags_penetration ) + { + player addplayerstat( "kill_enemy_through_wall", 1 ); + + if ( isdefined( weapon ) && weaponhasattachment( weapon, "fmj" ) ) + player addplayerstat( "kill_enemy_through_wall_with_fmj", 1 ); + } + } } ishighestscoringplayer( player ) { - if ( !isDefined( player.score ) || player.score < 1 ) - { - return 0; - } - players = level.players; - if ( level.teambased ) - { - team = player.pers[ "team" ]; - } - else - { - team = "all"; - } - highscore = player.score; - i = 0; - while ( i < players.size ) - { - if ( !isDefined( players[ i ].score ) ) - { - i++; - continue; - } - else if ( players[ i ] == player ) - { - i++; - continue; - } - else if ( players[ i ].score < 1 ) - { - i++; - continue; - } - else if ( team != "all" && players[ i ].pers[ "team" ] != team ) - { - i++; - continue; - } - else - { - if ( players[ i ].score >= highscore ) - { - return 0; - } - } - i++; - } - return 1; + if ( !isdefined( player.score ) || player.score < 1 ) + return false; + + players = level.players; + + if ( level.teambased ) + team = player.pers["team"]; + else + team = "all"; + + highscore = player.score; + + for ( i = 0; i < players.size; i++ ) + { + if ( !isdefined( players[i].score ) ) + continue; + + if ( players[i] == player ) + continue; + + if ( players[i].score < 1 ) + continue; + + if ( team != "all" && players[i].pers["team"] != team ) + continue; + + if ( players[i].score >= highscore ) + return false; + } + + return true; } spawnwatcher() { - self endon( "disconnect" ); - self.pers[ "stickExplosiveKill" ] = 0; - self.pers[ "pistolHeadshot" ] = 0; - self.pers[ "assaultRifleHeadshot" ] = 0; - self.pers[ "killNemesis" ] = 0; - while ( 1 ) - { - self waittill( "spawned_player" ); - self.pers[ "longshotsPerLife" ] = 0; - self.flakjacketclaymore = []; - self.weaponkills = []; - self.attachmentkills = []; - self.retreivedblades = 0; - self.lastreloadtime = 0; - self.crossbowclipkillcount = 0; - self thread watchfordtp(); - self thread watchformantle(); - self thread monitor_player_sprint(); - } + self endon( "disconnect" ); + self.pers["stickExplosiveKill"] = 0; + self.pers["pistolHeadshot"] = 0; + self.pers["assaultRifleHeadshot"] = 0; + self.pers["killNemesis"] = 0; + + while ( true ) + { + self waittill( "spawned_player" ); + + self.pers["longshotsPerLife"] = 0; + self.flakjacketclaymore = []; + self.weaponkills = []; + self.attachmentkills = []; + self.retreivedblades = 0; + self.lastreloadtime = 0; + self.crossbowclipkillcount = 0; + self thread watchfordtp(); + self thread watchformantle(); + self thread monitor_player_sprint(); + } } pickedupballisticknife() { - self.retreivedblades++; + self.retreivedblades++; } watchfordtp() { - self endon( "disconnect" ); - self endon( "death" ); - self.dtptime = 0; - while ( 1 ) - { - self waittill( "dtp_end" ); - self.dtptime = getTime() + 4000; - } + self endon( "disconnect" ); + self endon( "death" ); + + for ( self.dtptime = 0; 1; self.dtptime = gettime() + 4000 ) + self waittill( "dtp_end" ); } watchformantle() { - self endon( "disconnect" ); - self endon( "death" ); - self.mantletime = 0; - while ( 1 ) - { - self waittill( "mantle_start", mantleendtime ); - self.mantletime = mantleendtime; - } + self endon( "disconnect" ); + self endon( "death" ); + + for ( self.mantletime = 0; 1; self.mantletime = mantleendtime ) + self waittill( "mantle_start", mantleendtime ); } disarmedhackedcarepackage() { - self addplayerstat( "disarm_hacked_carepackage", 1 ); + self addplayerstat( "disarm_hacked_carepackage", 1 ); } destroyed_car() { - if ( !isDefined( self ) || !isplayer( self ) ) - { - return; - } - self addplayerstat( "destroy_car", 1 ); + if ( !isdefined( self ) || !isplayer( self ) ) + return; + + self addplayerstat( "destroy_car", 1 ); } killednemesis() { - self.pers[ "killNemesis" ]++; - if ( self.pers[ "killNemesis" ] >= 5 ) - { - self.pers[ "killNemesis" ] = 0; - self addplayerstat( "kill_nemesis", 1 ); - } + self.pers["killNemesis"]++; + + if ( self.pers["killNemesis"] >= 5 ) + { + self.pers["killNemesis"] = 0; + self addplayerstat( "kill_nemesis", 1 ); + } } killwhiledamagingwithhpm() { - self addplayerstat( "kill_while_damaging_with_microwave_turret", 1 ); + self addplayerstat( "kill_while_damaging_with_microwave_turret", 1 ); } longdistancehatchetkill() { - self addplayerstat( "long_distance_hatchet_kill", 1 ); + self addplayerstat( "long_distance_hatchet_kill", 1 ); } blockedsatellite() { - self addplayerstat( "activate_cuav_while_enemy_satelite_active", 1 ); + self addplayerstat( "activate_cuav_while_enemy_satelite_active", 1 ); } longdistancekill() { - self.pers[ "longshotsPerLife" ]++; - if ( self.pers[ "longshotsPerLife" ] >= 3 ) - { - self.pers[ "longshotsPerLife" ] = 0; - self addplayerstat( "longshot_3_onelife", 1 ); - } + self.pers["longshotsPerLife"]++; + + if ( self.pers["longshotsPerLife"] >= 3 ) + { + self.pers["longshotsPerLife"] = 0; + self addplayerstat( "longshot_3_onelife", 1 ); + } } challengeroundend( data ) { - player = data.player; - winner = data.winner; - if ( endedearly( winner ) ) - { - return; - } - if ( level.teambased ) - { - winnerscore = game[ "teamScores" ][ winner ]; - loserscore = getlosersteamscores( winner ); - } - switch( level.gametype ) - { - case "sd": - if ( player.team == winner ) - { - if ( game[ "challenge" ][ winner ][ "allAlive" ] ) - { - player addgametypestat( "round_win_no_deaths", 1 ); - } - if ( isDefined( player.lastmansddefeat3enemies ) ) - { - player addgametypestat( "last_man_defeat_3_enemies", 1 ); - } - } - break; - default: - } - } + player = data.player; + winner = data.winner; + + if ( endedearly( winner ) ) + return; + + if ( level.teambased ) + { + winnerscore = game["teamScores"][winner]; + loserscore = getlosersteamscores( winner ); + } + + switch ( level.gametype ) + { + case "sd": + if ( player.team == winner ) + { + if ( game["challenge"][winner]["allAlive"] ) + player addgametypestat( "round_win_no_deaths", 1 ); + + if ( isdefined( player.lastmansddefeat3enemies ) ) + player addgametypestat( "last_man_defeat_3_enemies", 1 ); + } + + break; + default: + break; + } } roundend( winner ) { - wait 0,05; - data = spawnstruct(); - data.time = getTime(); - if ( level.teambased ) - { - if ( isDefined( winner ) && isDefined( level.teams[ winner ] ) ) - { - data.winner = winner; - } - } - else - { - if ( isDefined( winner ) ) - { - data.winner = winner; - } - } - index = 0; - while ( index < level.placement[ "all" ].size ) - { - data.player = level.placement[ "all" ][ index ]; - data.place = index; - dochallengecallback( "roundEnd", data ); - index++; - } + wait 0.05; + data = spawnstruct(); + data.time = gettime(); + + if ( level.teambased ) + { + if ( isdefined( winner ) && isdefined( level.teams[winner] ) ) + data.winner = winner; + } + else if ( isdefined( winner ) ) + data.winner = winner; + + for ( index = 0; index < level.placement["all"].size; index++ ) + { + data.player = level.placement["all"][index]; + data.place = index; + dochallengecallback( "roundEnd", data ); + } } gameend( winner ) { - wait 0,05; - data = spawnstruct(); - data.time = getTime(); - if ( level.teambased ) - { - if ( isDefined( winner ) && isDefined( level.teams[ winner ] ) ) - { - data.winner = winner; - } - } - else - { - if ( isDefined( winner ) && isplayer( winner ) ) - { - data.winner = winner; - } - } - index = 0; - while ( index < level.placement[ "all" ].size ) - { - data.player = level.placement[ "all" ][ index ]; - data.place = index; - dochallengecallback( "gameEnd", data ); - index++; - } + wait 0.05; + data = spawnstruct(); + data.time = gettime(); + + if ( level.teambased ) + { + if ( isdefined( winner ) && isdefined( level.teams[winner] ) ) + data.winner = winner; + } + else if ( isdefined( winner ) && isplayer( winner ) ) + data.winner = winner; + + for ( index = 0; index < level.placement["all"].size; index++ ) + { + data.player = level.placement["all"][index]; + data.place = index; + dochallengecallback( "gameEnd", data ); + } } getfinalkill( player ) { - if ( isplayer( player ) ) - { - player addplayerstat( "get_final_kill", 1 ); - } + if ( isplayer( player ) ) + player addplayerstat( "get_final_kill", 1 ); } destroyrcbomb( weaponname ) { - self destroyscorestreak( weaponname ); - if ( weaponname == "hatchet_mp" ) - { - self addplayerstat( "destroy_rcbomb_with_hatchet", 1 ); - } + self destroyscorestreak( weaponname ); + + if ( weaponname == "hatchet_mp" ) + self addplayerstat( "destroy_rcbomb_with_hatchet", 1 ); } capturedcrate() { - if ( isDefined( self.lastrescuedby ) && isDefined( self.lastrescuedtime ) ) - { - if ( ( self.lastrescuedtime + 5000 ) > getTime() ) - { - self.lastrescuedby addplayerstat( "defend_teammate_who_captured_package", 1 ); - } - } + if ( isdefined( self.lastrescuedby ) && isdefined( self.lastrescuedtime ) ) + { + if ( self.lastrescuedtime + 5000 > gettime() ) + self.lastrescuedby addplayerstat( "defend_teammate_who_captured_package", 1 ); + } } destroyscorestreak( weaponname ) { - if ( isDefined( weaponname ) && weaponname == "qrdrone_turret_mp" ) - { - self addplayerstat( "destroy_score_streak_with_qrdrone", 1 ); - } + if ( isdefined( weaponname ) && weaponname == "qrdrone_turret_mp" ) + self addplayerstat( "destroy_score_streak_with_qrdrone", 1 ); } capturedobjective( capturetime ) { - if ( isDefined( self.smokegrenadetime ) && isDefined( self.smokegrenadeposition ) ) - { - if ( ( self.smokegrenadetime + 14000 ) > capturetime ) - { - distsq = distancesquared( self.smokegrenadeposition, self.origin ); - if ( distsq < 57600 ) - { - self addplayerstat( "capture_objective_in_smoke", 1 ); - self addweaponstat( "willy_pete_mp", "CombatRecordStat", 1 ); - return; - } - } - } + if ( isdefined( self.smokegrenadetime ) && isdefined( self.smokegrenadeposition ) ) + { + if ( self.smokegrenadetime + 14000 > capturetime ) + { + distsq = distancesquared( self.smokegrenadeposition, self.origin ); + + if ( distsq < 57600 ) + { + self addplayerstat( "capture_objective_in_smoke", 1 ); + self addweaponstat( "willy_pete_mp", "CombatRecordStat", 1 ); + } + else + { + + } + } + } } hackedordestroyedequipment() { - if ( self hasperk( "specialty_showenemyequipment" ) ) - { - self addplayerstat( "perk_hacker_destroy", 1 ); - } + if ( self hasperk( "specialty_showenemyequipment" ) ) + self addplayerstat( "perk_hacker_destroy", 1 ); } destroyedequipment( weaponname ) { - if ( isDefined( weaponname ) && weaponname == "emp_grenade_mp" ) - { - self addplayerstat( "destroy_equipment_with_emp_grenade", 1 ); - self addweaponstat( "emp_grenade_mp", "combatRecordStat", 1 ); - } - self addplayerstat( "destroy_equipment", 1 ); - self hackedordestroyedequipment(); + if ( isdefined( weaponname ) && weaponname == "emp_grenade_mp" ) + { + self addplayerstat( "destroy_equipment_with_emp_grenade", 1 ); + self addweaponstat( "emp_grenade_mp", "combatRecordStat", 1 ); + } + + self addplayerstat( "destroy_equipment", 1 ); + self hackedordestroyedequipment(); } destroyedtacticalinsert() { - if ( !isDefined( self.pers[ "tacticalInsertsDestroyed" ] ) ) - { - self.pers[ "tacticalInsertsDestroyed" ] = 0; - } - self.pers[ "tacticalInsertsDestroyed" ]++; - if ( self.pers[ "tacticalInsertsDestroyed" ] >= 5 ) - { - self.pers[ "tacticalInsertsDestroyed" ] = 0; - self addplayerstat( "destroy_5_tactical_inserts", 1 ); - } + if ( !isdefined( self.pers["tacticalInsertsDestroyed"] ) ) + self.pers["tacticalInsertsDestroyed"] = 0; + + self.pers["tacticalInsertsDestroyed"]++; + + if ( self.pers["tacticalInsertsDestroyed"] >= 5 ) + { + self.pers["tacticalInsertsDestroyed"] = 0; + self addplayerstat( "destroy_5_tactical_inserts", 1 ); + } } bladekill() { - if ( !isDefined( self.pers[ "bladeKills" ] ) ) - { - self.pers[ "bladeKills" ] = 0; - } - self.pers[ "bladeKills" ]++; - if ( self.pers[ "bladeKills" ] >= 15 ) - { - self.pers[ "bladeKills" ] = 0; - self addplayerstat( "kill_15_with_blade", 1 ); - } + if ( !isdefined( self.pers["bladeKills"] ) ) + self.pers["bladeKills"] = 0; + + self.pers["bladeKills"]++; + + if ( self.pers["bladeKills"] >= 15 ) + { + self.pers["bladeKills"] = 0; + self addplayerstat( "kill_15_with_blade", 1 ); + } } destroyedexplosive( weaponname ) { - self destroyedequipment( weaponname ); - self addplayerstat( "destroy_explosive", 1 ); + self destroyedequipment( weaponname ); + self addplayerstat( "destroy_explosive", 1 ); } assisted() { - self addplayerstat( "assist", 1 ); + self addplayerstat( "assist", 1 ); } earnedmicrowaveassistscore( score ) { - self addplayerstat( "assist_score_microwave_turret", score ); - self addplayerstat( "assist_score_killstreak", score ); + self addplayerstat( "assist_score_microwave_turret", score ); + self addplayerstat( "assist_score_killstreak", score ); } earnedcuavassistscore( score ) { - self addplayerstat( "assist_score_cuav", score ); - self addplayerstat( "assist_score_killstreak", score ); - self addweaponstat( "counteruav_mp", "assists", 1 ); + self addplayerstat( "assist_score_cuav", score ); + self addplayerstat( "assist_score_killstreak", score ); + self addweaponstat( "counteruav_mp", "assists", 1 ); } earneduavassistscore( score ) { - self addplayerstat( "assist_score_uav", score ); - self addplayerstat( "assist_score_killstreak", score ); - self addweaponstat( "radar_mp", "assists", 1 ); + self addplayerstat( "assist_score_uav", score ); + self addplayerstat( "assist_score_killstreak", score ); + self addweaponstat( "radar_mp", "assists", 1 ); } earnedsatelliteassistscore( score ) { - self addplayerstat( "assist_score_satellite", score ); - self addplayerstat( "assist_score_killstreak", score ); - self addweaponstat( "radardirection_mp", "assists", 1 ); + self addplayerstat( "assist_score_satellite", score ); + self addplayerstat( "assist_score_killstreak", score ); + self addweaponstat( "radardirection_mp", "assists", 1 ); } earnedempassistscore( score ) { - self addplayerstat( "assist_score_emp", score ); - self addplayerstat( "assist_score_killstreak", score ); - self addweaponstat( "emp_mp", "assists", 1 ); + self addplayerstat( "assist_score_emp", score ); + self addplayerstat( "assist_score_killstreak", score ); + self addweaponstat( "emp_mp", "assists", 1 ); } teamcompletedchallenge( team, challenge ) { - players = get_players(); - i = 0; - while ( i < players.size ) - { - if ( isDefined( players[ i ].team ) && players[ i ].team == team ) - { - players[ i ] addgametypestat( challenge, 1 ); - } - i++; - } + players = get_players(); + + for ( i = 0; i < players.size; i++ ) + { + if ( isdefined( players[i].team ) && players[i].team == team ) + players[i] addgametypestat( challenge, 1 ); + } } endedearly( winner ) { - if ( level.hostforcedend ) - { - return 1; - } - if ( !isDefined( winner ) ) - { - return 1; - } - if ( level.teambased ) - { - if ( winner == "tie" ) - { - return 1; - } - } - return 0; + if ( level.hostforcedend ) + return true; + + if ( !isdefined( winner ) ) + return true; + + if ( level.teambased ) + { + if ( winner == "tie" ) + return true; + } + + return false; } getlosersteamscores( winner ) { - teamscores = 0; - _a1474 = level.teams; - _k1474 = getFirstArrayKey( _a1474 ); - while ( isDefined( _k1474 ) ) - { - team = _a1474[ _k1474 ]; - if ( team == winner ) - { - } - else - { - teamscores += game[ "teamScores" ][ team ]; - } - _k1474 = getNextArrayKey( _a1474, _k1474 ); - } - return teamscores; + teamscores = 0; + + foreach ( team in level.teams ) + { + if ( team == winner ) + continue; + + teamscores += game["teamScores"][team]; + } + + return teamscores; } didloserfailchallenge( winner, challenge ) { - _a1487 = level.teams; - _k1487 = getFirstArrayKey( _a1487 ); - while ( isDefined( _k1487 ) ) - { - team = _a1487[ _k1487 ]; - if ( team == winner ) - { - } - else - { - if ( game[ "challenge" ][ team ][ challenge ] ) - { - return 0; - } - } - _k1487 = getNextArrayKey( _a1487, _k1487 ); - } - return 1; + foreach ( team in level.teams ) + { + if ( team == winner ) + continue; + + if ( game["challenge"][team][challenge] ) + return false; + } + + return true; } challengegameend( data ) { - player = data.player; - winner = data.winner; - if ( isDefined( level.scoreeventgameendcallback ) ) - { - [[ level.scoreeventgameendcallback ]]( data ); - } - if ( endedearly( winner ) ) - { - return; - } - if ( level.teambased ) - { - winnerscore = game[ "teamScores" ][ winner ]; - loserscore = getlosersteamscores( winner ); - } - switch( level.gametype ) - { - case "tdm": - if ( player.team == winner ) - { - if ( winnerscore >= ( loserscore + 20 ) ) - { - player addgametypestat( "CRUSH", 1 ); - } - } - mostkillsleastdeaths = 1; - index = 0; - while ( index < level.placement[ "all" ].size ) - { - if ( level.placement[ "all" ][ index ].deaths < player.deaths ) - { - mostkillsleastdeaths = 0; - } - if ( level.placement[ "all" ][ index ].kills > player.kills ) - { - mostkillsleastdeaths = 0; - } - index++; - } - if ( mostkillsleastdeaths && player.kills > 0 && level.placement[ "all" ].size > 3 ) - { - player addgametypestat( "most_kills_least_deaths", 1 ); - } - break; - case "dm": - if ( player == winner ) - { - if ( level.placement[ "all" ].size >= 2 ) - { - secondplace = level.placement[ "all" ][ 1 ]; - if ( player.kills >= ( secondplace.kills + 7 ) ) - { - player addgametypestat( "CRUSH", 1 ); - } - } - } - break; - case "ctf": - if ( player.team == winner ) - { - if ( loserscore == 0 ) - { - player addgametypestat( "SHUT_OUT", 1 ); - } - } - break; - case "dom": - if ( player.team == winner ) - { - if ( winnerscore >= ( loserscore + 70 ) ) - { - player addgametypestat( "CRUSH", 1 ); - } - } - break; - case "hq": - if ( player.team == winner && winnerscore > 0 ) - { - if ( winnerscore >= ( loserscore + 70 ) ) - { - player addgametypestat( "CRUSH", 1 ); - } - } - break; - case "koth": - if ( player.team == winner && winnerscore > 0 ) - { - if ( winnerscore >= ( loserscore + 70 ) ) - { - player addgametypestat( "CRUSH", 1 ); - } - } - if ( player.team == winner && winnerscore > 0 ) - { - if ( winnerscore >= ( loserscore + 110 ) ) - { - player addgametypestat( "ANNIHILATION", 1 ); - } - } - break; - case "dem": - if ( player.team == game[ "defenders" ] && player.team == winner ) - { - if ( loserscore == 0 ) - { - player addgametypestat( "SHUT_OUT", 1 ); - } - } - break; - case "sd": - if ( player.team == winner ) - { - if ( loserscore <= 1 ) - { - player addgametypestat( "CRUSH", 1 ); - } - } - default: - break; - } - } + player = data.player; + winner = data.winner; + + if ( isdefined( level.scoreeventgameendcallback ) ) + [[ level.scoreeventgameendcallback ]]( data ); + + if ( endedearly( winner ) ) + return; + + if ( level.teambased ) + { + winnerscore = game["teamScores"][winner]; + loserscore = getlosersteamscores( winner ); + } + + switch ( level.gametype ) + { + case "tdm": + if ( player.team == winner ) + { + if ( winnerscore >= loserscore + 20 ) + player addgametypestat( "CRUSH", 1 ); + } + + mostkillsleastdeaths = 1; + + for ( index = 0; index < level.placement["all"].size; index++ ) + { + if ( level.placement["all"][index].deaths < player.deaths ) + mostkillsleastdeaths = 0; + + if ( level.placement["all"][index].kills > player.kills ) + mostkillsleastdeaths = 0; + } + + if ( mostkillsleastdeaths && player.kills > 0 && level.placement["all"].size > 3 ) + player addgametypestat( "most_kills_least_deaths", 1 ); + + break; + case "dm": + if ( player == winner ) + { + if ( level.placement["all"].size >= 2 ) + { + secondplace = level.placement["all"][1]; + + if ( player.kills >= secondplace.kills + 7 ) + player addgametypestat( "CRUSH", 1 ); + } + } + + break; + case "ctf": + if ( player.team == winner ) + { + if ( loserscore == 0 ) + player addgametypestat( "SHUT_OUT", 1 ); + } + + break; + case "dom": + if ( player.team == winner ) + { + if ( winnerscore >= loserscore + 70 ) + player addgametypestat( "CRUSH", 1 ); + } + + break; + case "hq": + if ( player.team == winner && winnerscore > 0 ) + { + if ( winnerscore >= loserscore + 70 ) + player addgametypestat( "CRUSH", 1 ); + } + + break; + case "koth": + if ( player.team == winner && winnerscore > 0 ) + { + if ( winnerscore >= loserscore + 70 ) + player addgametypestat( "CRUSH", 1 ); + } + + if ( player.team == winner && winnerscore > 0 ) + { + if ( winnerscore >= loserscore + 110 ) + player addgametypestat( "ANNIHILATION", 1 ); + } + + break; + case "dem": + if ( player.team == game["defenders"] && player.team == winner ) + { + if ( loserscore == 0 ) + player addgametypestat( "SHUT_OUT", 1 ); + } + + break; + case "sd": + if ( player.team == winner ) + { + if ( loserscore <= 1 ) + player addgametypestat( "CRUSH", 1 ); + } + default: + break; + } } multikill( killcount, weapon ) { - if ( killcount >= 3 && isDefined( self.lastkillwheninjured ) ) - { - if ( ( self.lastkillwheninjured + 5000 ) > getTime() ) - { - self addplayerstat( "multikill_3_near_death", 1 ); - } - } + if ( killcount >= 3 && isdefined( self.lastkillwheninjured ) ) + { + if ( self.lastkillwheninjured + 5000 > gettime() ) + self addplayerstat( "multikill_3_near_death", 1 ); + } } domattackermultikill( killcount ) { - self addgametypestat( "kill_2_enemies_capturing_your_objective", 1 ); + self addgametypestat( "kill_2_enemies_capturing_your_objective", 1 ); } totaldomination( team ) { - teamcompletedchallenge( team, "control_3_points_3_minutes" ); + teamcompletedchallenge( team, "control_3_points_3_minutes" ); } holdflagentirematch( team, label ) { - switch( label ) - { - case "_a": - event = "hold_a_entire_match"; - break; - case "_b": - event = "hold_b_entire_match"; - break; - case "_c": - event = "hold_c_entire_match"; - break; - default: - return; - } - teamcompletedchallenge( team, event ); + switch ( label ) + { + case "_a": + event = "hold_a_entire_match"; + break; + case "_b": + event = "hold_b_entire_match"; + break; + case "_c": + event = "hold_c_entire_match"; + break; + default: + return; + } + + teamcompletedchallenge( team, event ); } capturedbfirstminute() { - self addgametypestat( "capture_b_first_minute", 1 ); + self addgametypestat( "capture_b_first_minute", 1 ); } controlzoneentirely( team ) { - teamcompletedchallenge( team, "control_zone_entirely" ); + teamcompletedchallenge( team, "control_zone_entirely" ); } multi_lmg_smg_kill() { - self addplayerstat( "multikill_3_lmg_or_smg_hip_fire", 1 ); + self addplayerstat( "multikill_3_lmg_or_smg_hip_fire", 1 ); } killedzoneattacker( weapon ) { - if ( weapon != "planemortar_mp" || weapon == "remote_missile_missile_mp" && weapon == "remote_missile_bomblet_mp" ) - { - self thread updatezonemultikills(); - } + if ( weapon == "planemortar_mp" || weapon == "remote_missile_missile_mp" || weapon == "remote_missile_bomblet_mp" ) + self thread updatezonemultikills(); } killeddog() { - origin = self.origin; - while ( level.teambased ) - { - teammates = get_team_alive_players_s( self.team ); - _a1714 = teammates.a; - _k1714 = getFirstArrayKey( _a1714 ); - while ( isDefined( _k1714 ) ) - { - player = _a1714[ _k1714 ]; - if ( player == self ) - { - } - else - { - distsq = distancesquared( origin, player.origin ); - if ( distsq < 57600 ) - { - self addplayerstat( "killed_dog_close_to_teammate", 1 ); - return; - } - } - else - { - _k1714 = getNextArrayKey( _a1714, _k1714 ); - } - } - } + origin = self.origin; + + if ( level.teambased ) + { + teammates = get_team_alive_players_s( self.team ); + + foreach ( player in teammates.a ) + { + if ( player == self ) + continue; + + distsq = distancesquared( origin, player.origin ); + + if ( distsq < 57600 ) + { + self addplayerstat( "killed_dog_close_to_teammate", 1 ); + break; + } + } + } } updatezonemultikills() { - self endon( "disconnect" ); - level endon( "game_ended" ); - self notify( "updateRecentZoneKills" ); - self endon( "updateRecentZoneKills" ); - if ( !isDefined( self.recentzonekillcount ) ) - { - self.recentzonekillcount = 0; - } - self.recentzonekillcount++; - wait 4; - if ( self.recentzonekillcount > 1 ) - { - self addplayerstat( "multikill_2_zone_attackers", 1 ); - } - self.recentzonekillcount = 0; + self endon( "disconnect" ); + level endon( "game_ended" ); + self notify( "updateRecentZoneKills" ); + self endon( "updateRecentZoneKills" ); + + if ( !isdefined( self.recentzonekillcount ) ) + self.recentzonekillcount = 0; + + self.recentzonekillcount++; + wait 4.0; + + if ( self.recentzonekillcount > 1 ) + self addplayerstat( "multikill_2_zone_attackers", 1 ); + + self.recentzonekillcount = 0; } multi_rcbomb_kill() { - self addplayerstat( "muiltikill_2_with_rcbomb", 1 ); + self addplayerstat( "muiltikill_2_with_rcbomb", 1 ); } multi_remotemissile_kill() { - self addplayerstat( "multikill_3_remote_missile", 1 ); + self addplayerstat( "multikill_3_remote_missile", 1 ); } multi_mgl_kill() { - self addplayerstat( "multikill_3_with_mgl", 1 ); + self addplayerstat( "multikill_3_with_mgl", 1 ); } immediatecapture() { - self addgametypestat( "immediate_capture", 1 ); + self addgametypestat( "immediate_capture", 1 ); } killedlastcontester() { - self addgametypestat( "contest_then_capture", 1 ); + self addgametypestat( "contest_then_capture", 1 ); } bothbombsdetonatewithintime() { - self addgametypestat( "both_bombs_detonate_10_seconds", 1 ); + self addgametypestat( "both_bombs_detonate_10_seconds", 1 ); } fullclipnomisses( weaponclass, weapon ) { + } destroyedturret( weaponname ) { - self destroyscorestreak( weaponname ); - self addplayerstat( "destroy_turret", 1 ); + self destroyscorestreak( weaponname ); + self addplayerstat( "destroy_turret", 1 ); } calledincarepackage() { - self.pers[ "carepackagesCalled" ]++; - if ( self.pers[ "carepackagesCalled" ] >= 3 ) - { - self addplayerstat( "call_in_3_care_packages", 1 ); - self.pers[ "carepackagesCalled" ] = 0; - } + self.pers["carepackagesCalled"]++; + + if ( self.pers["carepackagesCalled"] >= 3 ) + { + self addplayerstat( "call_in_3_care_packages", 1 ); + self.pers["carepackagesCalled"] = 0; + } } destroyedhelicopter( attacker, weapon, damagetype, playercontrolled ) { - attacker destroyscorestreak( weapon ); - if ( damagetype == "MOD_RIFLE_BULLET" || damagetype == "MOD_PISTOL_BULLET" ) - { - attacker addplayerstat( "destroyed_helicopter_with_bullet", 1 ); - } + attacker destroyscorestreak( weapon ); + + if ( damagetype == "MOD_RIFLE_BULLET" || damagetype == "MOD_PISTOL_BULLET" ) + attacker addplayerstat( "destroyed_helicopter_with_bullet", 1 ); } destroyedqrdrone( damagetype, weapon ) { - self destroyscorestreak( weapon ); - self addplayerstat( "destroy_qrdrone", 1 ); - if ( damagetype == "MOD_RIFLE_BULLET" || damagetype == "MOD_PISTOL_BULLET" ) - { - self addplayerstat( "destroyed_qrdrone_with_bullet", 1 ); - } - self destroyedplayercontrolledaircraft(); + self destroyscorestreak( weapon ); + self addplayerstat( "destroy_qrdrone", 1 ); + + if ( damagetype == "MOD_RIFLE_BULLET" || damagetype == "MOD_PISTOL_BULLET" ) + self addplayerstat( "destroyed_qrdrone_with_bullet", 1 ); + + self destroyedplayercontrolledaircraft(); } destroyedplayercontrolledaircraft() { - if ( self hasperk( "specialty_noname" ) ) - { - self addplayerstat( "destroy_helicopter", 1 ); - } + if ( self hasperk( "specialty_noname" ) ) + self addplayerstat( "destroy_helicopter", 1 ); } destroyedaircraft( attacker, weapon ) { - attacker destroyscorestreak( weapon ); - if ( isDefined( weapon ) ) - { - if ( weapon == "emp_mp" || weapon == "killstreak_emp_mp" ) - { - attacker addplayerstat( "destroy_aircraft_with_emp", 1 ); - } - else - { - if ( weapon == "missile_drone_projectile_mp" || weapon == "missile_drone_mp" ) - { - attacker addplayerstat( "destroy_aircraft_with_missile_drone", 1 ); - } - } - } - if ( attacker hasperk( "specialty_nottargetedbyairsupport" ) ) - { - attacker addplayerstat( "perk_nottargetedbyairsupport_destroy_aircraft", 1 ); - } - attacker addplayerstat( "destroy_aircraft", 1 ); + attacker destroyscorestreak( weapon ); + + if ( isdefined( weapon ) ) + { + if ( weapon == "emp_mp" || weapon == "killstreak_emp_mp" ) + attacker addplayerstat( "destroy_aircraft_with_emp", 1 ); + else if ( weapon == "missile_drone_projectile_mp" || weapon == "missile_drone_mp" ) + attacker addplayerstat( "destroy_aircraft_with_missile_drone", 1 ); + } + + if ( attacker hasperk( "specialty_nottargetedbyairsupport" ) ) + attacker addplayerstat( "perk_nottargetedbyairsupport_destroy_aircraft", 1 ); + + attacker addplayerstat( "destroy_aircraft", 1 ); } killstreakten() { - primary = self getloadoutitem( self.class_num, "primary" ); - if ( primary != 0 ) - { - return; - } - secondary = self getloadoutitem( self.class_num, "secondary" ); - if ( secondary != 0 ) - { - return; - } - primarygrenade = self getloadoutitem( self.class_num, "primarygrenade" ); - if ( primarygrenade != 0 ) - { - return; - } - specialgrenade = self getloadoutitem( self.class_num, "specialgrenade" ); - if ( specialgrenade != 0 ) - { - return; - } - numspecialties = 0; - while ( numspecialties < level.maxspecialties ) - { - perk = self getloadoutitem( self.class_num, "specialty" + ( numspecialties + 1 ) ); - if ( perk != 0 ) - { - return; - } - numspecialties++; - } - self addplayerstat( "killstreak_10_no_weapons_perks", 1 ); + primary = self getloadoutitem( self.class_num, "primary" ); + + if ( primary != 0 ) + return; + + secondary = self getloadoutitem( self.class_num, "secondary" ); + + if ( secondary != 0 ) + return; + + primarygrenade = self getloadoutitem( self.class_num, "primarygrenade" ); + + if ( primarygrenade != 0 ) + return; + + specialgrenade = self getloadoutitem( self.class_num, "specialgrenade" ); + + if ( specialgrenade != 0 ) + return; + + for ( numspecialties = 0; numspecialties < level.maxspecialties; numspecialties++ ) + { + perk = self getloadoutitem( self.class_num, "specialty" + ( numspecialties + 1 ) ); + + if ( perk != 0 ) + return; + } + + self addplayerstat( "killstreak_10_no_weapons_perks", 1 ); } scavengedgrenade() { - self endon( "disconnect" ); - self endon( "death" ); - self notify( "scavengedGrenade" ); - self endon( "scavengedGrenade" ); - for ( ;; ) - { - self waittill( "lethalGrenadeKill" ); - self addplayerstat( "kill_with_resupplied_lethal_grenade", 1 ); - } + self endon( "disconnect" ); + self endon( "death" ); + self notify( "scavengedGrenade" ); + self endon( "scavengedGrenade" ); + + for (;;) + { + self waittill( "lethalGrenadeKill" ); + + self addplayerstat( "kill_with_resupplied_lethal_grenade", 1 ); + } } stunnedtankwithempgrenade( attacker ) { - attacker addplayerstat( "stun_aitank_wIth_emp_grenade", 1 ); + attacker addplayerstat( "stun_aitank_wIth_emp_grenade", 1 ); } playerkilled( einflictor, attacker, idamage, smeansofdeath, sweapon, shitloc, attackerstance ) { /# - print( level.gametype ); + print( level.gametype ); #/ - self.anglesondeath = self getplayerangles(); - if ( isDefined( attacker ) ) - { - attacker.anglesonkill = attacker getplayerangles(); - } - if ( !isDefined( sweapon ) ) - { - sweapon = "none"; - } - self endon( "disconnect" ); - data = spawnstruct(); - data.victim = self; - data.victimstance = self getstance(); - data.einflictor = einflictor; - data.attacker = attacker; - data.attackerstance = attackerstance; - data.idamage = idamage; - data.smeansofdeath = smeansofdeath; - data.sweapon = sweapon; - data.shitloc = shitloc; - data.time = getTime(); - if ( isDefined( einflictor ) && isDefined( einflictor.lastweaponbeforetoss ) ) - { - data.lastweaponbeforetoss = einflictor.lastweaponbeforetoss; - } - if ( isDefined( einflictor ) && isDefined( einflictor.ownerweaponatlaunch ) ) - { - data.ownerweaponatlaunch = einflictor.ownerweaponatlaunch; - } - waslockingon = 0; - if ( isDefined( einflictor.locking_on ) ) - { - waslockingon |= einflictor.locking_on; - } - if ( isDefined( einflictor.locked_on ) ) - { - waslockingon |= einflictor.locked_on; - } - waslockingon &= 1 << data.victim.entnum; - if ( waslockingon != 0 ) - { - data.waslockingon = 1; - } - else - { - data.waslockingon = 0; - } - data.washacked = einflictor maps/mp/_utility::ishacked(); - data.wasplanting = data.victim.isplanting; - if ( !isDefined( data.wasplanting ) ) - { - data.wasplanting = 0; - } - data.wasdefusing = data.victim.isdefusing; - if ( !isDefined( data.wasdefusing ) ) - { - data.wasdefusing = 0; - } - data.victimweapon = data.victim.currentweapon; - data.victimonground = data.victim isonground(); - if ( isplayer( attacker ) ) - { - data.attackeronground = data.attacker isonground(); - if ( !isDefined( data.attackerstance ) ) - { - data.attackerstance = data.attacker getstance(); - } - } - else - { - data.attackeronground = 0; - data.attackerstance = "stand"; - } - waitandprocessplayerkilledcallback( data ); - data.attacker notify( "playerKilledChallengesProcessed" ); + self.anglesondeath = self getplayerangles(); + + if ( isdefined( attacker ) ) + attacker.anglesonkill = attacker getplayerangles(); + + if ( !isdefined( sweapon ) ) + sweapon = "none"; + + self endon( "disconnect" ); + data = spawnstruct(); + data.victim = self; + data.victimstance = self getstance(); + data.einflictor = einflictor; + data.attacker = attacker; + data.attackerstance = attackerstance; + data.idamage = idamage; + data.smeansofdeath = smeansofdeath; + data.sweapon = sweapon; + data.shitloc = shitloc; + data.time = gettime(); + + if ( isdefined( einflictor ) && isdefined( einflictor.lastweaponbeforetoss ) ) + data.lastweaponbeforetoss = einflictor.lastweaponbeforetoss; + + if ( isdefined( einflictor ) && isdefined( einflictor.ownerweaponatlaunch ) ) + data.ownerweaponatlaunch = einflictor.ownerweaponatlaunch; + + waslockingon = 0; + + if ( isdefined( einflictor.locking_on ) ) + waslockingon |= einflictor.locking_on; + + if ( isdefined( einflictor.locked_on ) ) + waslockingon |= einflictor.locked_on; + + waslockingon &= 1 << data.victim.entnum; + + if ( waslockingon != 0 ) + data.waslockingon = 1; + else + data.waslockingon = 0; + + data.washacked = einflictor maps\mp\_utility::ishacked(); + data.wasplanting = data.victim.isplanting; + + if ( !isdefined( data.wasplanting ) ) + data.wasplanting = 0; + + data.wasdefusing = data.victim.isdefusing; + + if ( !isdefined( data.wasdefusing ) ) + data.wasdefusing = 0; + + data.victimweapon = data.victim.currentweapon; + data.victimonground = data.victim isonground(); + + if ( isplayer( attacker ) ) + { + data.attackeronground = data.attacker isonground(); + + if ( !isdefined( data.attackerstance ) ) + data.attackerstance = data.attacker getstance(); + } + else + { + data.attackeronground = 0; + data.attackerstance = "stand"; + } + + waitandprocessplayerkilledcallback( data ); + data.attacker notify( "playerKilledChallengesProcessed" ); } waittillslowprocessallowed() { - while ( level.lastslowprocessframe == getTime() ) - { - wait 0,05; - } - level.lastslowprocessframe = getTime(); + while ( level.lastslowprocessframe == gettime() ) + wait 0.05; + + level.lastslowprocessframe = gettime(); } doscoreeventcallback( callback, data ) { - if ( !isDefined( level.scoreeventcallbacks ) ) - { - return; - } - if ( !isDefined( level.scoreeventcallbacks[ callback ] ) ) - { - return; - } - if ( isDefined( data ) ) - { - i = 0; - while ( i < level.scoreeventcallbacks[ callback ].size ) - { - thread [[ level.scoreeventcallbacks[ callback ][ i ] ]]( data ); - i++; - } - } - else i = 0; - while ( i < level.scoreeventcallbacks[ callback ].size ) - { - thread [[ level.scoreeventcallbacks[ callback ][ i ] ]](); - i++; - } + if ( !isdefined( level.scoreeventcallbacks ) ) + return; + + if ( !isdefined( level.scoreeventcallbacks[callback] ) ) + return; + + if ( isdefined( data ) ) + { + for ( i = 0; i < level.scoreeventcallbacks[callback].size; i++ ) + thread [[ level.scoreeventcallbacks[callback][i] ]]( data ); + } + else + { + for ( i = 0; i < level.scoreeventcallbacks[callback].size; i++ ) + thread [[ level.scoreeventcallbacks[callback][i] ]](); + } } waitandprocessplayerkilledcallback( data ) { - if ( isDefined( data.attacker ) ) - { - data.attacker endon( "disconnect" ); - } - wait 0,05; - waittillslowprocessallowed(); - level thread dochallengecallback( "playerKilled", data ); - level thread doscoreeventcallback( "playerKilled", data ); + if ( isdefined( data.attacker ) ) + data.attacker endon( "disconnect" ); + + wait 0.05; + waittillslowprocessallowed(); + level thread dochallengecallback( "playerKilled", data ); + level thread doscoreeventcallback( "playerKilled", data ); } weaponisknife( weapon ) { - if ( weapon != "knife_held_mp" || weapon == "knife_mp" && weapon == "knife_ballistic_mp" ) - { - return 1; - } - return 0; + if ( weapon == "knife_held_mp" || weapon == "knife_mp" || weapon == "knife_ballistic_mp" ) + return true; + + return false; } eventreceived( eventname ) { - self endon( "disconnect" ); - waittillslowprocessallowed(); - switch( level.gametype ) - { - case "tdm": - if ( eventname == "killstreak_10" ) - { - self addgametypestat( "killstreak_10", 1 ); - } - else if ( eventname == "killstreak_15" ) - { - self addgametypestat( "killstreak_15", 1 ); - } - else if ( eventname == "killstreak_20" ) - { - self addgametypestat( "killstreak_20", 1 ); - } - else if ( eventname == "multikill_3" ) - { - self addgametypestat( "multikill_3", 1 ); - } - else if ( eventname == "kill_enemy_who_killed_teammate" ) - { - self addgametypestat( "kill_enemy_who_killed_teammate", 1 ); - } - else - { - if ( eventname == "kill_enemy_injuring_teammate" ) - { - self addgametypestat( "kill_enemy_injuring_teammate", 1 ); - } - } - break; - case "dm": - if ( eventname == "killstreak_10" ) - { - self addgametypestat( "killstreak_10", 1 ); - } - else if ( eventname == "killstreak_15" ) - { - self addgametypestat( "killstreak_15", 1 ); - } - else if ( eventname == "killstreak_20" ) - { - self addgametypestat( "killstreak_20", 1 ); - } - else - { - if ( eventname == "killstreak_30" ) - { - self addgametypestat( "killstreak_30", 1 ); - } - } - break; - case "sd": - if ( eventname == "defused_bomb_last_man_alive" ) - { - self addgametypestat( "defused_bomb_last_man_alive", 1 ); - } - else if ( eventname == "elimination_and_last_player_alive" ) - { - self addgametypestat( "elimination_and_last_player_alive", 1 ); - } - else if ( eventname == "killed_bomb_planter" ) - { - self addgametypestat( "killed_bomb_planter", 1 ); - } - else - { - if ( eventname == "killed_bomb_defuser" ) - { - self addgametypestat( "killed_bomb_defuser", 1 ); - } - } - break; - case "ctf": - if ( eventname == "kill_flag_carrier" ) - { - self addgametypestat( "kill_flag_carrier", 1 ); - } - else - { - if ( eventname == "defend_flag_carrier" ) - { - self addgametypestat( "defend_flag_carrier", 1 ); - } - } - break; - case "dem": - if ( eventname == "killed_bomb_planter" ) - { - self addgametypestat( "killed_bomb_planter", 1 ); - } - else - { - if ( eventname == "killed_bomb_defuser" ) - { - self addgametypestat( "killed_bomb_defuser", 1 ); - } - } - break; - default: - } - } + self endon( "disconnect" ); + waittillslowprocessallowed(); + + switch ( level.gametype ) + { + case "tdm": + if ( eventname == "killstreak_10" ) + self addgametypestat( "killstreak_10", 1 ); + else if ( eventname == "killstreak_15" ) + self addgametypestat( "killstreak_15", 1 ); + else if ( eventname == "killstreak_20" ) + self addgametypestat( "killstreak_20", 1 ); + else if ( eventname == "multikill_3" ) + self addgametypestat( "multikill_3", 1 ); + else if ( eventname == "kill_enemy_who_killed_teammate" ) + self addgametypestat( "kill_enemy_who_killed_teammate", 1 ); + else if ( eventname == "kill_enemy_injuring_teammate" ) + self addgametypestat( "kill_enemy_injuring_teammate", 1 ); + + break; + case "dm": + if ( eventname == "killstreak_10" ) + self addgametypestat( "killstreak_10", 1 ); + else if ( eventname == "killstreak_15" ) + self addgametypestat( "killstreak_15", 1 ); + else if ( eventname == "killstreak_20" ) + self addgametypestat( "killstreak_20", 1 ); + else if ( eventname == "killstreak_30" ) + self addgametypestat( "killstreak_30", 1 ); + + break; + case "sd": + if ( eventname == "defused_bomb_last_man_alive" ) + self addgametypestat( "defused_bomb_last_man_alive", 1 ); + else if ( eventname == "elimination_and_last_player_alive" ) + self addgametypestat( "elimination_and_last_player_alive", 1 ); + else if ( eventname == "killed_bomb_planter" ) + self addgametypestat( "killed_bomb_planter", 1 ); + else if ( eventname == "killed_bomb_defuser" ) + self addgametypestat( "killed_bomb_defuser", 1 ); + + break; + case "ctf": + if ( eventname == "kill_flag_carrier" ) + self addgametypestat( "kill_flag_carrier", 1 ); + else if ( eventname == "defend_flag_carrier" ) + self addgametypestat( "defend_flag_carrier", 1 ); + + break; + case "dem": + if ( eventname == "killed_bomb_planter" ) + self addgametypestat( "killed_bomb_planter", 1 ); + else if ( eventname == "killed_bomb_defuser" ) + self addgametypestat( "killed_bomb_defuser", 1 ); + + break; + default: + break; + } } monitor_player_sprint() { - self endon( "disconnect" ); - self endon( "death" ); - self.lastsprinttime = undefined; - while ( 1 ) - { - self waittill( "sprint_begin" ); - self waittill( "sprint_end" ); - self.lastsprinttime = getTime(); - } + self endon( "disconnect" ); + self endon( "death" ); + + for ( self.lastsprinttime = undefined; 1; self.lastsprinttime = gettime() ) + { + self waittill( "sprint_begin" ); + + self waittill( "sprint_end" ); + } } diff --git a/Multiplayer Core/patch_mp/maps/mp/_compass.gsc b/Multiplayer Core/patch_mp/maps/mp/_compass.gsc index 76437c2..d2e8842 100644 --- a/Multiplayer Core/patch_mp/maps/mp/_compass.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/_compass.gsc @@ -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 ); } diff --git a/Multiplayer Core/patch_mp/maps/mp/_createfx.gsc b/Multiplayer Core/patch_mp/maps/mp/_createfx.gsc index 8d142f8..4af95df 100644 --- a/Multiplayer Core/patch_mp/maps/mp/_createfx.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/_createfx.gsc @@ -1,3273 +1,2937 @@ -#include maps/mp/_script_gen; -#include maps/mp/_fx; -#include maps/mp/_createfxundo; -#include maps/mp/_createfxmenu; -#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\_createfxmenu; +#include maps\mp\_createfxundo; +#include maps\mp\_fx; +#include maps\mp\_script_gen; createfx() { /# - println( "^2Running CreateFX 2.0" ); + println( "^2Running CreateFX 2.0" ); #/ - if ( ismp() ) - { - init_mp_paths(); - level.timelimitoverride = 1; - } - else - { - init_sp_paths(); - } - precachemodel( "fx_axis_createfx" ); - precacheshader( "black" ); - if ( getDvar( "createfx_scaleid" ) == "" ) - { - setdvar( "createfx_scaleid", "0.5" ); - } - if ( getDvar( "createfx_print_frames" ) == "" ) - { - setdvar( "createfx_print_frames", "3" ); - } - if ( getDvar( "createfx_drawaxis" ) == "" ) - { - setdvar( "createfx_drawaxis", "1" ); - } - if ( getDvar( "createfx_drawaxis_range" ) == "" ) - { - setdvar( "createfx_drawaxis_range", "2000" ); - } - if ( getDvar( "createfx_autosave_time" ) == "" ) - { - setdvar( "createfx_autosave_time", "300" ); - } - if ( getDvar( "createfx_oneshot_min_delay" ) == "" ) - { - setdvar( "createfx_oneshot_min_delay", "-100" ); - } - if ( getDvar( "createfx_oneshot_max_delay" ) == "" ) - { - setdvar( "createfx_oneshot_max_delay", "-15" ); - } - flag_init( "createfx_saving" ); - if ( !isDefined( level.createfx ) ) - { - level.createfx = []; - } - if ( !isDefined( level.cfx_uniqueid ) ) - { - level.cfx_uniqueid = 0; - } - level.cfx_last_action = "none"; - if ( !ismp() ) - { - level thread [[ level.cfx_func_run_gump_func ]](); - } - if ( isDefined( level.createfx_callback_thread ) ) - { - level thread [[ level.createfx_callback_thread ]](); - } - if ( ismp() ) - { - level.callbackplayerdisconnect = ::empty; - level.callbackplayerdamage = ::damage_void; - level.callbackplayerkilled = ::empty; - level.callbackplayerconnect = ::callback_playerconnect; - while ( !isDefined( level.player ) ) - { - wait 0,05; - } - thread createfxdelay(); - } - level.is_camera_on = 0; - thread createfxlogic(); - level waittill( "eternity" ); + if ( ismp() ) + { + init_mp_paths(); + level.timelimitoverride = 1; + } + else + init_sp_paths(); + + precachemodel( "fx_axis_createfx" ); + precacheshader( "black" ); + + if ( getdvar( "createfx_scaleid" ) == "" ) + setdvar( "createfx_scaleid", "0.5" ); + + if ( getdvar( "createfx_print_frames" ) == "" ) + setdvar( "createfx_print_frames", "3" ); + + if ( getdvar( "createfx_drawaxis" ) == "" ) + setdvar( "createfx_drawaxis", "1" ); + + if ( getdvar( "createfx_drawaxis_range" ) == "" ) + setdvar( "createfx_drawaxis_range", "2000" ); + + if ( getdvar( "createfx_autosave_time" ) == "" ) + setdvar( "createfx_autosave_time", "300" ); + + if ( getdvar( "createfx_oneshot_min_delay" ) == "" ) + setdvar( "createfx_oneshot_min_delay", "-100" ); + + if ( getdvar( "createfx_oneshot_max_delay" ) == "" ) + setdvar( "createfx_oneshot_max_delay", "-15" ); + + flag_init( "createfx_saving" ); + + if ( !isdefined( level.createfx ) ) + level.createfx = []; + + if ( !isdefined( level.cfx_uniqueid ) ) + level.cfx_uniqueid = 0; + + level.cfx_last_action = "none"; + + if ( !ismp() ) + level thread [[ level.cfx_func_run_gump_func ]](); + + if ( isdefined( level.createfx_callback_thread ) ) + level thread [[ level.createfx_callback_thread ]](); + + if ( ismp() ) + { + level.callbackplayerdisconnect = ::empty; + level.callbackplayerdamage = ::damage_void; + level.callbackplayerkilled = ::empty; + level.callbackplayerconnect = ::callback_playerconnect; + + while ( !isdefined( level.player ) ) + wait 0.05; + + thread createfxdelay(); + } + + level.is_camera_on = 0; + thread createfxlogic(); + + level waittill( "eternity" ); } fx_init() { - if ( ismp() ) - { - init_client_mp_variables(); - } - else - { - init_client_sp_variables(); - } - level.exploderfunction = level.cfx_exploder_before; - waittillframeend; - waittillframeend; - level.exploderfunction = level.cfx_exploder_after; - level.non_fx_ents = 0; - if ( level.createfx_enabled ) - { - triggers = getentarray( "trigger_multiple", "classname" ); - i = 0; - while ( i < triggers.size ) - { - triggers[ i ] delete(); - i++; - } - triggers = getentarray( "trigger_once", "classname" ); - i = 0; - while ( i < triggers.size ) - { - triggers[ i ] delete(); - i++; - } - triggers = getentarray( "trigger_box", "classname" ); - i = 0; - while ( i < triggers.size ) - { - triggers[ i ] delete(); - i++; - } - triggers = getentarray( "trigger_radius", "classname" ); - i = 0; - while ( i < triggers.size ) - { - triggers[ i ] delete(); - i++; - } - triggers = getentarray( "trigger_lookat", "classname" ); - i = 0; - while ( i < triggers.size ) - { - triggers[ i ] delete(); - i++; - } - triggers = getentarray( "trigger_damage", "classname" ); - i = 0; - while ( i < triggers.size ) - { - triggers[ i ] delete(); - i++; - } - sm = getentarray( "spawn_manager", "classname" ); - i = 0; - while ( i < sm.size ) - { - sm[ i ] delete(); - i++; - } - delete_spawns(); - if ( !ismp() ) - { - delete_arrays_in_sp(); + if ( ismp() ) + init_client_mp_variables(); + else + init_client_sp_variables(); + + level.exploderfunction = level.cfx_exploder_before; + waittillframeend; + waittillframeend; + level.exploderfunction = level.cfx_exploder_after; + level.non_fx_ents = 0; + + if ( level.createfx_enabled ) + { + triggers = getentarray( "trigger_multiple", "classname" ); + + for ( i = 0; i < triggers.size; i++ ) + triggers[i] delete(); + + triggers = getentarray( "trigger_once", "classname" ); + + for ( i = 0; i < triggers.size; i++ ) + triggers[i] delete(); + + triggers = getentarray( "trigger_box", "classname" ); + + for ( i = 0; i < triggers.size; i++ ) + triggers[i] delete(); + + triggers = getentarray( "trigger_radius", "classname" ); + + for ( i = 0; i < triggers.size; i++ ) + triggers[i] delete(); + + triggers = getentarray( "trigger_lookat", "classname" ); + + for ( i = 0; i < triggers.size; i++ ) + triggers[i] delete(); + + triggers = getentarray( "trigger_damage", "classname" ); + + for ( i = 0; i < triggers.size; i++ ) + triggers[i] delete(); + + sm = getentarray( "spawn_manager", "classname" ); + + for ( i = 0; i < sm.size; i++ ) + sm[i] delete(); + + delete_spawns(); + + if ( !ismp() ) + { + delete_arrays_in_sp(); /# - println( "We're not in MP!" ); + println( "We're not in MP!" ); #/ - } - } - i = 0; - while ( i < level.createfxent.size ) - { - ent = level.createfxent[ i ]; - ent set_forward_and_up_vectors(); - if ( level.clientscripts ) - { - if ( !level.createfx_enabled ) - { - i++; - continue; - } - } - else - { - if ( isDefined( ent.model ) ) - { - level.non_fx_ents++; - } - if ( ent.v[ "type" ] == "loopfx" ) - { - ent thread [[ level.cfx_func_loopfx ]](); - } - if ( ent.v[ "type" ] == "oneshotfx" ) - { - ent thread [[ level.cfx_func_oneshotfx ]](); - } - if ( ent.v[ "type" ] == "soundfx" ) - { - ent thread [[ level.cfx_func_soundfx ]](); - } - } - i++; - } + } + } + + for ( i = 0; i < level.createfxent.size; i++ ) + { + ent = level.createfxent[i]; + ent set_forward_and_up_vectors(); + + if ( level.clientscripts ) + { + if ( !level.createfx_enabled ) + continue; + } + + if ( isdefined( ent.model ) ) + level.non_fx_ents++; + + if ( ent.v["type"] == "loopfx" ) + ent thread [[ level.cfx_func_loopfx ]](); + + if ( ent.v["type"] == "oneshotfx" ) + ent thread [[ level.cfx_func_oneshotfx ]](); + + if ( ent.v["type"] == "soundfx" ) + ent thread [[ level.cfx_func_soundfx ]](); + } } add_effect( name, effect ) { - if ( !isDefined( level._effect ) ) - { - level._effect = []; - } - level._effect[ name ] = loadfx( effect ); + if ( !isdefined( level._effect ) ) + level._effect = []; + + level._effect[name] = loadfx( effect ); } createeffect( type, fxid ) { - ent = undefined; - if ( !isDefined( level.createfx_enabled ) ) - { - level.createfx_enabled = getDvar( "createfx" ) != ""; - } - if ( !isDefined( level.createfxent ) ) - { - level.createfxent = []; - } - if ( level.createfx_enabled ) - { - if ( !isDefined( level.cfx_uniqueid ) ) - { - level.cfx_uniqueid = 0; - } - ent = spawnstruct(); - ent.uniqueid = level.cfx_uniqueid; - level.cfx_uniqueid++; - } - else if ( type == "exploder" ) - { - ent = spawnstruct(); - } - else - { - if ( !isDefined( level._fake_createfx_struct ) ) - { - level._fake_createfx_struct = spawnstruct(); - } - ent = level._fake_createfx_struct; - } - level.createfxent[ level.createfxent.size ] = ent; - ent.v = []; - ent.v[ "type" ] = type; - ent.v[ "fxid" ] = fxid; - ent.v[ "angles" ] = ( 1, 1, 1 ); - ent.v[ "origin" ] = ( 1, 1, 1 ); - ent.drawn = 1; - return ent; + ent = undefined; + + if ( !isdefined( level.createfx_enabled ) ) + level.createfx_enabled = getdvar( "createfx" ) != ""; + + if ( !isdefined( level.createfxent ) ) + level.createfxent = []; + + if ( level.createfx_enabled ) + { + if ( !isdefined( level.cfx_uniqueid ) ) + level.cfx_uniqueid = 0; + + ent = spawnstruct(); + ent.uniqueid = level.cfx_uniqueid; + level.cfx_uniqueid++; + } + else if ( type == "exploder" ) + ent = spawnstruct(); + else + { + if ( !isdefined( level._fake_createfx_struct ) ) + level._fake_createfx_struct = spawnstruct(); + + ent = level._fake_createfx_struct; + } + + level.createfxent[level.createfxent.size] = ent; + ent.v = []; + ent.v["type"] = type; + ent.v["fxid"] = fxid; + ent.v["angles"] = ( 0, 0, 0 ); + ent.v["origin"] = ( 0, 0, 0 ); + ent.drawn = 1; + return ent; } createloopsound() { - ent = spawnstruct(); - if ( !isDefined( level.createfxent ) ) - { - level.createfxent = []; - } - level.createfxent[ level.createfxent.size ] = ent; - ent.v = []; - ent.v[ "type" ] = "soundfx"; - ent.v[ "fxid" ] = "No FX"; - ent.v[ "soundalias" ] = "nil"; - ent.v[ "angles" ] = ( 1, 1, 1 ); - ent.v[ "origin" ] = ( 1, 1, 1 ); - ent.drawn = 1; - return ent; + ent = spawnstruct(); + + if ( !isdefined( level.createfxent ) ) + level.createfxent = []; + + level.createfxent[level.createfxent.size] = ent; + ent.v = []; + ent.v["type"] = "soundfx"; + ent.v["fxid"] = "No FX"; + ent.v["soundalias"] = "nil"; + ent.v["angles"] = ( 0, 0, 0 ); + ent.v["origin"] = ( 0, 0, 0 ); + ent.drawn = 1; + return ent; } set_forward_and_up_vectors() { - self.v[ "up" ] = anglesToUp( self.v[ "angles" ] ); - self.v[ "forward" ] = anglesToForward( self.v[ "angles" ] ); + self.v["up"] = anglestoup( self.v["angles"] ); + self.v["forward"] = anglestoforward( self.v["angles"] ); } createfxlogic() { - waittillframeend; - menu_init(); - if ( !ismp() ) - { - players = get_players(); - if ( !isDefined( players ) || players.size == 0 ) - { - level waittill( "first_player_ready" ); - } - } + waittillframeend; + menu_init(); + + if ( !ismp() ) + { + players = get_players(); + + if ( !isdefined( players ) || players.size == 0 ) + level waittill( "first_player_ready" ); + } /# - adddebugcommand( "noclip" ); + adddebugcommand( "noclip" ); #/ - if ( !isDefined( level._effect ) ) - { - level._effect = []; - } - if ( getDvar( "createfx_map" ) == "" ) - { - setdvar( "createfx_map", level.script ); - } - else - { - if ( getDvar( "createfx_map" ) == level.script ) - { - if ( !ismp() ) - { - playerpos = []; - playerpos[ 0 ] = getDvarInt( #"274F266C" ); - playerpos[ 1 ] = getDvarInt( #"274F266D" ); - playerpos[ 2 ] = getDvarInt( #"274F266E" ); - player = get_players()[ 0 ]; - player setorigin( ( playerpos[ 0 ], playerpos[ 1 ], playerpos[ 2 ] ) ); - } - } - } + if ( !isdefined( level._effect ) ) + level._effect = []; + + if ( getdvar( "createfx_map" ) == "" ) + setdvar( "createfx_map", level.script ); + else if ( getdvar( "createfx_map" ) == level.script ) + { + if ( !ismp() ) + { + playerpos = []; + playerpos[0] = getdvarint( _hash_274F266C ); + playerpos[1] = getdvarint( _hash_274F266D ); + playerpos[2] = getdvarint( _hash_274F266E ); + player = get_players()[0]; + player setorigin( ( playerpos[0], playerpos[1], playerpos[2] ) ); + } + } /# - filename = level.cfx_server_scriptdata + level.script + "_fx.gsc"; - file = openfile( filename, "append" ); - level.write_error = ""; - if ( file == -1 ) - { - level.write_error = filename; - } - else - { - closefile( file ); + filename = level.cfx_server_scriptdata + level.script + "_fx.gsc"; + file = openfile( filename, "append" ); + level.write_error = ""; + + if ( file == -1 ) + level.write_error = filename; + else + closefile( file ); #/ - } - level.createfxhudelements = []; - level.createfx_hudelements = 100; - stroffsetx = []; - stroffsety = []; - stroffsetx[ 0 ] = 0; - stroffsety[ 0 ] = 0; - stroffsetx[ 1 ] = 1; - stroffsety[ 1 ] = 1; - stroffsetx[ 2 ] = -2; - stroffsety[ 2 ] = 1; - setdvar( "fx", "nil" ); - crosshair = newdebughudelem(); - crosshair.location = 0; - crosshair.alignx = "center"; - crosshair.aligny = "middle"; - crosshair.foreground = 1; - crosshair.fontscale = 2; - crosshair.sort = 20; - crosshair.alpha = 1; - crosshair.x = 320; - crosshair.y = 233; - crosshair settext( "." ); - center_text_init(); - level.cleartextmarker = newdebughudelem(); - level.cleartextmarker.alpha = 0; - level.cleartextmarker settext( "marker" ); - i = 0; - while ( i < level.createfx_hudelements ) - { - newstrarray = []; - p = 0; - while ( p < 2 ) - { - newstr = newhudelem(); - newstr.alignx = "left"; - newstr.location = 0; - newstr.foreground = 1; - newstr.fontscale = 1,1; - newstr.sort = 20 - p; - newstr.alpha = 1; - newstr.x = 0 + stroffsetx[ p ]; - newstr.y = ( 60 + stroffsety[ p ] ) + ( i * 15 ); - if ( p > 0 ) - { - newstr.color = ( 1, 1, 1 ); - } - newstrarray[ newstrarray.size ] = newstr; - p++; - } - level.createfxhudelements[ i ] = newstrarray; - i++; - } - level.selectedmove_up = 0; - level.selectedmove_forward = 0; - level.selectedmove_right = 0; - level.selectedrotate_pitch = 0; - level.selectedrotate_roll = 0; - level.selectedrotate_yaw = 0; - level.selected_fx = []; - level.selected_fx_ents = []; - level.createfx_lockedlist = []; - level.createfx_lockedlist[ "escape" ] = 1; - level.createfx_lockedlist[ "BUTTON_LSHLDR" ] = 1; - level.createfx_lockedlist[ "BUTTON_RSHLDR" ] = 1; - level.createfx_lockedlist[ "mouse1" ] = 1; - level.createfx_lockedlist[ "ctrl" ] = 1; - level.createfx_draw_enabled = 1; - level.buttonisheld = []; - axismode = 0; - colors = []; - colors[ "loopfx" ][ "selected" ] = ( 1, 1, 0,2 ); - colors[ "loopfx" ][ "highlighted" ] = ( 0,4, 0,95, 1 ); - colors[ "loopfx" ][ "default" ] = ( 0,3, 0,5, 1 ); - colors[ "oneshotfx" ][ "selected" ] = ( 1, 1, 0,2 ); - colors[ "oneshotfx" ][ "highlighted" ] = ( 0,33, 0,97, 1 ); - colors[ "oneshotfx" ][ "default" ] = ( 0,1, 0,73, 0,73 ); - colors[ "exploder" ][ "selected" ] = ( 1, 1, 0,2 ); - colors[ "exploder" ][ "highlighted" ] = ( 1, 0,1, 0,1 ); - colors[ "exploder" ][ "default" ] = ( 1, 0,1, 0,1 ); - colors[ "rainfx" ][ "selected" ] = ( 1, 1, 0,2 ); - colors[ "rainfx" ][ "highlighted" ] = ( 0,95, 0,4, 0,95 ); - colors[ "rainfx" ][ "default" ] = ( 0,78, 0, 0,73 ); - colors[ "soundfx" ][ "selected" ] = ( 1, 1, 0,2 ); - colors[ "soundfx" ][ "highlighted" ] = ( 0,5, 1, 0,75 ); - colors[ "soundfx" ][ "default" ] = ( 0,2, 0,9, 0,2 ); - lasthighlightedent = undefined; - level.fx_rotating = 0; - setmenu( "none" ); - level.createfx_selecting = 0; - level.createfx_last_player_origin = ( 1, 1, 1 ); - level.createfx_last_player_forward = ( 1, 1, 1 ); - level.createfx_last_view_change_test = 0; - player = get_players()[ 0 ]; - black = newdebughudelem(); - black.x = -120; - black.y = 200; - black.foreground = 0; - black setshader( "black", 250, 160 ); - black.alpha = 0; - level.createfx_inputlocked = 0; - help_on_last_frame = 0; - i = 0; - while ( i < level.createfxent.size ) - { - ent = level.createfxent[ i ]; - ent post_entity_creation_function(); - i++; - } - thread draw_distance(); - lastselectentity = undefined; - thread createfx_autosave(); - if ( !ismp() ) - { - make_sp_player_invulnerable( player ); - } - for ( ;; ) - { - player = get_players()[ 0 ]; - changedselectedents = 0; - right = anglesToRight( player getplayerangles() ); - forward = anglesToForward( player getplayerangles() ); - up = anglesToUp( player getplayerangles() ); - dot = 0,85; - placeent_vector = vectorScale( forward, 750 ); - level.createfxcursor = bullettrace( player geteye(), player geteye() + placeent_vector, 0, undefined ); - highlightedent = undefined; - level.buttonclick = []; - level.button_is_kb = []; - process_button_held_and_clicked(); - ctrlheld = button_is_held( "ctrl", "BUTTON_LSHLDR" ); - shiftheld = button_is_held( "shift" ); - functionheld = button_is_held( "f" ); - leftclick = button_is_clicked( "mouse1", "BUTTON_A" ); - leftheld = button_is_held( "mouse1", "BUTTON_A" ); - create_fx_menu(); - if ( button_is_clicked( "BUTTON_X" ) || shiftheld && button_is_clicked( "x" ) ) - { - axismode = !axismode; - } - if ( button_is_clicked( "F2" ) || functionheld && button_is_clicked( "2" ) ) - { - toggle_createfx_drawing(); - } - if ( button_is_clicked( "F3" ) || functionheld && button_is_clicked( "3" ) ) - { - print_ambient_fx_inventory(); - } - if ( button_is_clicked( "F5" ) || functionheld && button_is_clicked( "5" ) ) - { - createfx_save(); - } - if ( button_is_clicked( "ins", "i" ) ) - { - insert_effect(); - } - if ( button_is_clicked( "c" ) ) - { - if ( level.is_camera_on == 0 ) - { + level.createfxhudelements = []; + level.createfx_hudelements = 100; + stroffsetx = []; + stroffsety = []; + stroffsetx[0] = 0; + stroffsety[0] = 0; + stroffsetx[1] = 1; + stroffsety[1] = 1; + stroffsetx[2] = -2; + stroffsety[2] = 1; + setdvar( "fx", "nil" ); + crosshair = newdebughudelem(); + crosshair.location = 0; + crosshair.alignx = "center"; + crosshair.aligny = "middle"; + crosshair.foreground = 1; + crosshair.fontscale = 2; + crosshair.sort = 20; + crosshair.alpha = 1; + crosshair.x = 320; + crosshair.y = 233; + crosshair settext( "." ); + center_text_init(); + level.cleartextmarker = newdebughudelem(); + level.cleartextmarker.alpha = 0; + level.cleartextmarker settext( "marker" ); + + for ( i = 0; i < level.createfx_hudelements; i++ ) + { + newstrarray = []; + + for ( p = 0; p < 2; p++ ) + { + newstr = newhudelem(); + newstr.alignx = "left"; + newstr.location = 0; + newstr.foreground = 1; + newstr.fontscale = 1.1; + newstr.sort = 20 - p; + newstr.alpha = 1; + newstr.x = 0 + stroffsetx[p]; + newstr.y = 60 + stroffsety[p] + i * 15; + + if ( p > 0 ) + newstr.color = ( 0, 0, 0 ); + + newstrarray[newstrarray.size] = newstr; + } + + level.createfxhudelements[i] = newstrarray; + } + + level.selectedmove_up = 0; + level.selectedmove_forward = 0; + level.selectedmove_right = 0; + level.selectedrotate_pitch = 0; + level.selectedrotate_roll = 0; + level.selectedrotate_yaw = 0; + level.selected_fx = []; + level.selected_fx_ents = []; + level.createfx_lockedlist = []; + level.createfx_lockedlist["escape"] = 1; + level.createfx_lockedlist["BUTTON_LSHLDR"] = 1; + level.createfx_lockedlist["BUTTON_RSHLDR"] = 1; + level.createfx_lockedlist["mouse1"] = 1; + level.createfx_lockedlist["ctrl"] = 1; + level.createfx_draw_enabled = 1; + level.buttonisheld = []; + axismode = 0; + colors = []; + colors["loopfx"]["selected"] = ( 1.0, 1.0, 0.2 ); + colors["loopfx"]["highlighted"] = ( 0.4, 0.95, 1.0 ); + colors["loopfx"]["default"] = ( 0.3, 0.5, 1.0 ); + colors["oneshotfx"]["selected"] = ( 1.0, 1.0, 0.2 ); + colors["oneshotfx"]["highlighted"] = ( 0.33, 0.97, 1.0 ); + colors["oneshotfx"]["default"] = ( 0.1, 0.73, 0.73 ); + colors["exploder"]["selected"] = ( 1.0, 1.0, 0.2 ); + colors["exploder"]["highlighted"] = ( 1.0, 0.1, 0.1 ); + colors["exploder"]["default"] = ( 1.0, 0.1, 0.1 ); + colors["rainfx"]["selected"] = ( 1.0, 1.0, 0.2 ); + colors["rainfx"]["highlighted"] = ( 0.95, 0.4, 0.95 ); + colors["rainfx"]["default"] = ( 0.78, 0.0, 0.73 ); + colors["soundfx"]["selected"] = ( 1.0, 1.0, 0.2 ); + colors["soundfx"]["highlighted"] = ( 0.5, 1.0, 0.75 ); + colors["soundfx"]["default"] = ( 0.2, 0.9, 0.2 ); + lasthighlightedent = undefined; + level.fx_rotating = 0; + setmenu( "none" ); + level.createfx_selecting = 0; + level.createfx_last_player_origin = ( 0, 0, 0 ); + level.createfx_last_player_forward = ( 0, 0, 0 ); + level.createfx_last_view_change_test = 0; + player = get_players()[0]; + black = newdebughudelem(); + black.x = -120; + black.y = 200; + black.foreground = 0; + black setshader( "black", 250, 160 ); + black.alpha = 0; + level.createfx_inputlocked = 0; + help_on_last_frame = 0; + + for ( i = 0; i < level.createfxent.size; i++ ) + { + ent = level.createfxent[i]; + ent post_entity_creation_function(); + } + + thread draw_distance(); + lastselectentity = undefined; + thread createfx_autosave(); + + if ( !ismp() ) + make_sp_player_invulnerable( player ); + + for (;;) + { + player = get_players()[0]; + changedselectedents = 0; + right = anglestoright( player getplayerangles() ); + forward = anglestoforward( player getplayerangles() ); + up = anglestoup( player getplayerangles() ); + dot = 0.85; + placeent_vector = vectorscale( forward, 750 ); + level.createfxcursor = bullettrace( player geteye(), player geteye() + placeent_vector, 0, undefined ); + highlightedent = undefined; + level.buttonclick = []; + level.button_is_kb = []; + process_button_held_and_clicked(); + ctrlheld = button_is_held( "ctrl", "BUTTON_LSHLDR" ); + shiftheld = button_is_held( "shift" ); + functionheld = button_is_held( "f" ); + leftclick = button_is_clicked( "mouse1", "BUTTON_A" ); + leftheld = button_is_held( "mouse1", "BUTTON_A" ); + create_fx_menu(); + + if ( button_is_clicked( "BUTTON_X" ) || shiftheld && button_is_clicked( "x" ) ) + axismode = !axismode; + + if ( button_is_clicked( "F2" ) || functionheld && button_is_clicked( "2" ) ) + toggle_createfx_drawing(); + + if ( button_is_clicked( "F3" ) || functionheld && button_is_clicked( "3" ) ) + print_ambient_fx_inventory(); + + if ( button_is_clicked( "F5" ) || functionheld && button_is_clicked( "5" ) ) + createfx_save(); + + if ( button_is_clicked( "ins", "i" ) ) + insert_effect(); + + if ( button_is_clicked( "c" ) ) + { + if ( level.is_camera_on == 0 ) + { /# - adddebugcommand( "noclip" ); + adddebugcommand( "noclip" ); #/ - level thread handle_camera(); - level.is_camera_on = 1; - break; - } - else - { - if ( level.is_camera_on == 1 ) - { + level thread handle_camera(); + level.is_camera_on = 1; + } + else if ( level.is_camera_on == 1 ) + { /# - adddebugcommand( "noclip" ); + adddebugcommand( "noclip" ); #/ - level notify( "new_camera" ); - level.is_camera_on = 0; - axismode = 0; - } - } - } - if ( button_is_held( "BUTTON_RTRIG" ) && level.is_camera_on ) - { - axismode = 1; - } - else - { - if ( !button_is_held( "BUTTON_RTRIG" ) && level.is_camera_on ) - { - axismode = 0; - } - } - if ( button_is_clicked( "del" ) || !shiftheld && button_is_clicked( "d" ) ) - { - delete_pressed(); - } - if ( button_is_clicked( "end" ) || shiftheld && button_is_clicked( "d" ) ) - { - drop_selection_to_ground(); - changedselectedents = 1; - } - if ( button_is_clicked( "s" ) ) - { - setmenu( "select_by_property" ); - wait 0,05; - } - if ( isDefined( level.cfx_selected_prop ) ) - { - if ( ctrlheld ) - { - select_ents_by_property( level.cfx_selected_prop, 1 ); - } - else - { - select_ents_by_property( level.cfx_selected_prop ); - } - level.cfx_selected_prop = undefined; - } - if ( button_is_clicked( "j" ) ) - { - setmenu( "jump_to_effect" ); - draw_effects_list( "Select effect to jump to:" ); - } - if ( button_is_clicked( "escape" ) ) - { - clear_settable_fx(); - } - if ( button_is_clicked( "space" ) && !shiftheld ) - { - set_off_exploders(); - } - if ( button_is_clicked( "space" ) && shiftheld ) - { - turn_off_exploders(); - } - if ( button_is_clicked( "tab", "BUTTON_RSHLDR" ) ) - { - move_selection_to_cursor(); - changedselectedents = 1; - } - if ( button_is_clicked( "z" ) ) - { - if ( shiftheld ) - { - break; - } - else - { - undo(); - } - } - if ( button_is_held( "q", "F1" ) ) - { - help_on_last_frame = 1; - show_help(); - wait 0,05; - continue; - } - else if ( help_on_last_frame == 1 ) - { - clear_fx_hudelements(); - help_on_last_frame = 0; - } - if ( button_is_clicked( "BUTTON_LSTICK" ) && !ctrlheld ) - { - copy_ents(); - } - if ( button_is_clicked( "BUTTON_RSTICK" ) ) - { - if ( ctrlheld ) - { - paste_ents_onto_ents(); - break; - } - else - { - paste_ents(); - } - } - if ( isDefined( level.selected_fx_option_index ) ) - { - menu_fx_option_set(); - } - if ( button_is_held( "BUTTON_RTRIG" ) && button_is_held( "BUTTON_LTRIG" ) ) - { - move_player_around_map_fast(); - wait 0,25; - continue; - } - else - { - if ( menu( "none" ) ) - { - if ( button_is_clicked( "rightarrow" ) ) - { - move_player_to_next_same_effect( 1, lastselectentity ); - break; - } - else - { - if ( button_is_clicked( "leftarrow" ) ) - { - move_player_to_next_same_effect( 0, lastselectentity ); - } - } - } - if ( level.write_error != "" ) - { - level notify( "write_error" ); - thread write_error_msg( level.write_error ); - level.write_error = ""; - } - highlightedent = level.fx_highlightedent; - if ( leftclick || ( getTime() - level.createfx_last_view_change_test ) > 250 ) - { - if ( !leftclick || vector_changed( level.createfx_last_player_origin, player.origin ) && dot_changed( level.createfx_last_player_forward, forward ) ) - { - i = 0; - while ( i < level.createfxent.size ) - { - ent = level.createfxent[ i ]; - if ( !ent.drawn ) - { - i++; - continue; - } - else difference = vectornormalize( ent.v[ "origin" ] - ( player.origin + vectorScale( ( 1, 1, 1 ), 55 ) ) ); - newdot = vectordot( forward, difference ); - if ( newdot < dot ) - { - i++; - continue; - } - else if ( newdot == dot ) - { - if ( ent_is_selected( ent ) ) - { - i++; - continue; - } - } - else - { - dot = newdot; - highlightedent = ent; - highlightedent.last_fx_index = i; - } - i++; - } - level.fx_highlightedent = highlightedent; - level.createfx_last_player_origin = player.origin; - level.createfx_last_player_forward = forward; - } - level.createfx_last_view_change_test = getTime(); - } - if ( isDefined( highlightedent ) ) - { - if ( isDefined( lasthighlightedent ) ) - { - if ( lasthighlightedent != highlightedent ) - { - if ( !ent_is_selected( lasthighlightedent ) ) - { - lasthighlightedent thread entity_highlight_disable(); - } - if ( !ent_is_selected( highlightedent ) ) - { - highlightedent thread entity_highlight_enable(); - } - } - break; - } - else - { - if ( !ent_is_selected( highlightedent ) ) - { - highlightedent thread entity_highlight_enable(); - } - } - } - manipulate_createfx_ents( highlightedent, leftclick, leftheld, ctrlheld, colors, right ); - if ( axismode && level.selected_fx_ents.size > 0 ) - { - thread process_fx_rotater(); - if ( button_is_clicked( "enter", "r" ) ) - { - reset_axis_of_selected_ents(); - } - if ( button_is_clicked( "v" ) ) - { - copy_angles_of_selected_ents(); - } - while ( getDvarInt( "createfx_drawaxis" ) == 1 ) - { - i = 0; - while ( i < level.selected_fx_ents.size ) - { - level.selected_fx_ents[ i ] draw_axis(); - i++; - } - } - if ( level.selectedrotate_pitch != 0 || level.selectedrotate_yaw != 0 && level.selectedrotate_roll != 0 ) - { - changedselectedents = 1; - } - wait 0,05; - } - else - { - stop_drawing_axis_models(); - selectedmove_vector = get_selected_move_vector(); - if ( distancesquared( ( 1, 1, 1 ), selectedmove_vector ) > 0 ) - { - changedselectedents = 1; - if ( level.cfx_last_action != "translate" ) - { - store_undo_state( "edit", level.selected_fx_ents ); - level.cfx_last_action = "translate"; - } - } - i = 0; - while ( i < level.selected_fx_ents.size ) - { - ent = level.selected_fx_ents[ i ]; - if ( isDefined( ent.model ) ) - { - i++; - continue; - } - else - { - ent.v[ "origin" ] += selectedmove_vector; - } - i++; - } - wait 0,05; - } - if ( changedselectedents ) - { - update_selected_entities(); - } - lasthighlightedent = highlightedent; - if ( last_selected_entity_has_changed( lastselectentity ) ) - { - level.effect_list_offset = 0; - clear_settable_fx(); - setmenu( "none" ); - } - if ( level.selected_fx_ents.size ) - { - lastselectentity = level.selected_fx_ents[ level.selected_fx_ents.size - 1 ]; - break; - } - else - { - lastselectentity = undefined; - } - } - } + level notify( "new_camera" ); + level.is_camera_on = 0; + axismode = 0; + } + } + + if ( button_is_held( "BUTTON_RTRIG" ) && level.is_camera_on ) + axismode = 1; + else if ( !button_is_held( "BUTTON_RTRIG" ) && level.is_camera_on ) + axismode = 0; + + if ( button_is_clicked( "del" ) || !shiftheld && button_is_clicked( "d" ) ) + delete_pressed(); + + if ( button_is_clicked( "end" ) || shiftheld && button_is_clicked( "d" ) ) + { + drop_selection_to_ground(); + changedselectedents = 1; + } + + if ( button_is_clicked( "s" ) ) + { + setmenu( "select_by_property" ); + wait 0.05; + } + + if ( isdefined( level.cfx_selected_prop ) ) + { + if ( ctrlheld ) + select_ents_by_property( level.cfx_selected_prop, 1 ); + else + select_ents_by_property( level.cfx_selected_prop ); + + level.cfx_selected_prop = undefined; + } + + if ( button_is_clicked( "j" ) ) + { + setmenu( "jump_to_effect" ); + draw_effects_list( "Select effect to jump to:" ); + } + + if ( button_is_clicked( "escape" ) ) + clear_settable_fx(); + + if ( button_is_clicked( "space" ) && !shiftheld ) + set_off_exploders(); + + if ( button_is_clicked( "space" ) && shiftheld ) + turn_off_exploders(); + + if ( button_is_clicked( "tab", "BUTTON_RSHLDR" ) ) + { + move_selection_to_cursor(); + changedselectedents = 1; + } + + if ( button_is_clicked( "z" ) ) + { + if ( shiftheld ) + { + + } + else + undo(); + } + + if ( button_is_held( "q", "F1" ) ) + { + help_on_last_frame = 1; + show_help(); + wait 0.05; + continue; + } + else if ( help_on_last_frame == 1 ) + { + clear_fx_hudelements(); + help_on_last_frame = 0; + } + + if ( button_is_clicked( "BUTTON_LSTICK" ) && !ctrlheld ) + copy_ents(); + + if ( button_is_clicked( "BUTTON_RSTICK" ) ) + { + if ( ctrlheld ) + paste_ents_onto_ents(); + else + paste_ents(); + } + + if ( isdefined( level.selected_fx_option_index ) ) + menu_fx_option_set(); + + if ( button_is_held( "BUTTON_RTRIG" ) && button_is_held( "BUTTON_LTRIG" ) ) + { + move_player_around_map_fast(); + wait 0.25; + continue; + } + + if ( menu( "none" ) ) + { + if ( button_is_clicked( "rightarrow" ) ) + move_player_to_next_same_effect( 1, lastselectentity ); + else if ( button_is_clicked( "leftarrow" ) ) + move_player_to_next_same_effect( 0, lastselectentity ); + } + + if ( level.write_error != "" ) + { + level notify( "write_error" ); + thread write_error_msg( level.write_error ); + level.write_error = ""; + } + + highlightedent = level.fx_highlightedent; + + if ( leftclick || gettime() - level.createfx_last_view_change_test > 250 ) + { + if ( leftclick || vector_changed( level.createfx_last_player_origin, player.origin ) || dot_changed( level.createfx_last_player_forward, forward ) ) + { + for ( i = 0; i < level.createfxent.size; i++ ) + { + ent = level.createfxent[i]; + + if ( !ent.drawn ) + continue; + + difference = vectornormalize( ent.v["origin"] - player.origin + vectorscale( ( 0, 0, 1 ), 55.0 ) ); + newdot = vectordot( forward, difference ); + + if ( newdot < dot ) + continue; + + if ( newdot == dot ) + { + if ( ent_is_selected( ent ) ) + continue; + } + + dot = newdot; + highlightedent = ent; + highlightedent.last_fx_index = i; + } + + level.fx_highlightedent = highlightedent; + level.createfx_last_player_origin = player.origin; + level.createfx_last_player_forward = forward; + } + + level.createfx_last_view_change_test = gettime(); + } + + if ( isdefined( highlightedent ) ) + { + if ( isdefined( lasthighlightedent ) ) + { + if ( lasthighlightedent != highlightedent ) + { + if ( !ent_is_selected( lasthighlightedent ) ) + lasthighlightedent thread entity_highlight_disable(); + + if ( !ent_is_selected( highlightedent ) ) + highlightedent thread entity_highlight_enable(); + } + } + else if ( !ent_is_selected( highlightedent ) ) + highlightedent thread entity_highlight_enable(); + } + + manipulate_createfx_ents( highlightedent, leftclick, leftheld, ctrlheld, colors, right ); + + if ( axismode && level.selected_fx_ents.size > 0 ) + { + thread process_fx_rotater(); + + if ( button_is_clicked( "enter", "r" ) ) + reset_axis_of_selected_ents(); + + if ( button_is_clicked( "v" ) ) + copy_angles_of_selected_ents(); + + if ( getdvarint( "createfx_drawaxis" ) == 1 ) + { + for ( i = 0; i < level.selected_fx_ents.size; i++ ) + level.selected_fx_ents[i] draw_axis(); + } + + if ( level.selectedrotate_pitch != 0 || level.selectedrotate_yaw != 0 || level.selectedrotate_roll != 0 ) + changedselectedents = 1; + + wait 0.05; + } + else + { + stop_drawing_axis_models(); + selectedmove_vector = get_selected_move_vector(); + + if ( distancesquared( ( 0, 0, 0 ), selectedmove_vector ) > 0 ) + { + changedselectedents = 1; + + if ( level.cfx_last_action != "translate" ) + { + store_undo_state( "edit", level.selected_fx_ents ); + level.cfx_last_action = "translate"; + } + } + + for ( i = 0; i < level.selected_fx_ents.size; i++ ) + { + ent = level.selected_fx_ents[i]; + + if ( isdefined( ent.model ) ) + continue; + + ent.v["origin"] += selectedmove_vector; + } + + wait 0.05; + } + + if ( changedselectedents ) + update_selected_entities(); + + lasthighlightedent = highlightedent; + + if ( last_selected_entity_has_changed( lastselectentity ) ) + { + level.effect_list_offset = 0; + clear_settable_fx(); + setmenu( "none" ); + } + + if ( level.selected_fx_ents.size ) + { + lastselectentity = level.selected_fx_ents[level.selected_fx_ents.size - 1]; + continue; + } + + lastselectentity = undefined; + } } toggle_createfx_drawing() { - level.createfx_draw_enabled = !level.createfx_draw_enabled; + level.createfx_draw_enabled = !level.createfx_draw_enabled; } manipulate_createfx_ents( highlightedent, leftclick, leftheld, ctrlheld, colors, right ) { - if ( !level.createfx_draw_enabled ) - { - clear_fx_hudelements(); - return; - } - scale = getDvarFloat( "createfx_scaleid" ); - print_frames = getDvarInt( "createfx_print_frames" ); - if ( !isDefined( level.createfx_manipulate_offset ) ) - { - level.createfx_manipulate_offset = 0; - } - offset = level.createfx_manipulate_offset; - level.createfx_manipulate_offset = ( level.createfx_manipulate_offset + 1 ) % print_frames; - i = offset; - while ( i < level.createfxent.size ) - { - ent = level.createfxent[ i ]; - if ( !ent.drawn ) - { - } - else if ( isDefined( highlightedent ) && ent == highlightedent ) - { - } - else colorindex = "default"; - if ( index_is_selected( i ) ) - { - colorindex = "selected"; - } + if ( !level.createfx_draw_enabled ) + { + clear_fx_hudelements(); + return; + } + + scale = getdvarfloat( "createfx_scaleid" ); + print_frames = getdvarint( "createfx_print_frames" ); + + if ( !isdefined( level.createfx_manipulate_offset ) ) + level.createfx_manipulate_offset = 0; + + offset = level.createfx_manipulate_offset; + level.createfx_manipulate_offset = ( level.createfx_manipulate_offset + 1 ) % print_frames; + + for ( i = offset; i < level.createfxent.size; i += print_frames ) + { + ent = level.createfxent[i]; + + if ( !ent.drawn ) + continue; + + if ( isdefined( highlightedent ) && ent == highlightedent ) + { + continue; + continue; + } + + colorindex = "default"; + + if ( index_is_selected( i ) ) + colorindex = "selected"; /# - print3d( ent.v[ "origin" ], ".", colors[ ent.v[ "type" ] ][ colorindex ], 1, scale, print_frames ); + print3d( ent.v["origin"], ".", colors[ent.v["type"]][colorindex], 1, scale, print_frames ); #/ - if ( ent.textalpha > 0 ) - { - printright = vectorScale( right, ( ent.v[ "fxid" ].size * -2,93 ) * scale ); - printup = ( 0, 0, 15 * scale ); + if ( ent.textalpha > 0 ) + { + printright = vectorscale( right, ent.v["fxid"].size * -2.93 * scale ); + printup = ( 0, 0, 15 * scale ); /# - print3d( ent.v[ "origin" ] + printright + printup, ent.v[ "fxid" ], colors[ ent.v[ "type" ] ][ colorindex ], ent.textalpha, scale, print_frames ); + print3d( ent.v["origin"] + printright + printup, ent.v["fxid"], colors[ent.v["type"]][colorindex], ent.textalpha, scale, print_frames ); #/ - } - i += print_frames; - } - if ( isDefined( highlightedent ) ) - { - if ( !entities_are_selected() ) - { - display_fx_info( highlightedent ); - } - if ( leftclick ) - { - entwasselected = index_is_selected( highlightedent.last_fx_index ); - level.createfx_selecting = !entwasselected; - if ( !ctrlheld ) - { - selectedsize = level.selected_fx_ents.size; - clear_entity_selection(); - if ( entwasselected && selectedsize == 1 ) - { - select_entity( highlightedent.last_fx_index, highlightedent ); - } - } - toggle_entity_selection( highlightedent.last_fx_index, highlightedent ); - } - else - { - if ( leftheld ) - { - if ( ctrlheld ) - { - if ( level.createfx_selecting ) - { - select_entity( highlightedent.last_fx_index, highlightedent ); - } - if ( !level.createfx_selecting ) - { - deselect_entity( highlightedent.last_fx_index, highlightedent ); - } - } - } - } - colorindex = "highlighted"; - if ( index_is_selected( highlightedent.last_fx_index ) ) - { - colorindex = "selected"; - } + } + } + + if ( isdefined( highlightedent ) ) + { + if ( !entities_are_selected() ) + display_fx_info( highlightedent ); + + if ( leftclick ) + { + entwasselected = index_is_selected( highlightedent.last_fx_index ); + level.createfx_selecting = !entwasselected; + + if ( !ctrlheld ) + { + selectedsize = level.selected_fx_ents.size; + clear_entity_selection(); + + if ( entwasselected && selectedsize == 1 ) + select_entity( highlightedent.last_fx_index, highlightedent ); + } + + toggle_entity_selection( highlightedent.last_fx_index, highlightedent ); + } + else if ( leftheld ) + { + if ( ctrlheld ) + { + if ( level.createfx_selecting ) + select_entity( highlightedent.last_fx_index, highlightedent ); + + if ( !level.createfx_selecting ) + deselect_entity( highlightedent.last_fx_index, highlightedent ); + } + } + + colorindex = "highlighted"; + + if ( index_is_selected( highlightedent.last_fx_index ) ) + colorindex = "selected"; /# - print3d( highlightedent.v[ "origin" ], ".", colors[ highlightedent.v[ "type" ] ][ colorindex ], 1, scale, 1 ); + print3d( highlightedent.v["origin"], ".", colors[highlightedent.v["type"]][colorindex], 1, scale, 1 ); #/ - if ( highlightedent.textalpha > 0 ) - { - printright = vectorScale( right, ( highlightedent.v[ "fxid" ].size * -2,93 ) * scale ); - printup = ( 0, 0, 15 * scale ); + if ( highlightedent.textalpha > 0 ) + { + printright = vectorscale( right, highlightedent.v["fxid"].size * -2.93 * scale ); + printup = ( 0, 0, 15 * scale ); /# - print3d( highlightedent.v[ "origin" ] + printright + printup, highlightedent.v[ "fxid" ], colors[ highlightedent.v[ "type" ] ][ colorindex ], highlightedent.textalpha, scale, 1 ); + print3d( highlightedent.v["origin"] + printright + printup, highlightedent.v["fxid"], colors[highlightedent.v["type"]][colorindex], highlightedent.textalpha, scale, 1 ); #/ - } - } + } + } } clear_settable_fx() { - level.createfx_inputlocked = 0; - setdvar( "fx", "nil" ); - level.selected_fx_option_index = undefined; - reset_fx_hud_colors(); + level.createfx_inputlocked = 0; + setdvar( "fx", "nil" ); + level.selected_fx_option_index = undefined; + reset_fx_hud_colors(); } reset_fx_hud_colors() { - i = 0; - while ( i < level.createfx_hudelements ) - { - level.createfxhudelements[ i ][ 0 ].color = ( 1, 1, 1 ); - i++; - } + for ( i = 0; i < level.createfx_hudelements; i++ ) + level.createfxhudelements[i][0].color = ( 1, 1, 1 ); } button_is_held( name, name2 ) { - if ( isDefined( name2 ) ) - { - if ( isDefined( level.buttonisheld[ name2 ] ) ) - { - return 1; - } - } - return isDefined( level.buttonisheld[ name ] ); + if ( isdefined( name2 ) ) + { + if ( isdefined( level.buttonisheld[name2] ) ) + return 1; + } + + return isdefined( level.buttonisheld[name] ); } button_is_clicked( name, name2 ) { - if ( isDefined( name2 ) ) - { - if ( isDefined( level.buttonclick[ name2 ] ) ) - { - return 1; - } - } - return isDefined( level.buttonclick[ name ] ); + if ( isdefined( name2 ) ) + { + if ( isdefined( level.buttonclick[name2] ) ) + return 1; + } + + return isdefined( level.buttonclick[name] ); } toggle_entity_selection( index, ent ) { - if ( isDefined( level.selected_fx[ index ] ) ) - { - deselect_entity( index, ent ); - } - else - { - select_entity( index, ent ); - } + if ( isdefined( level.selected_fx[index] ) ) + deselect_entity( index, ent ); + else + select_entity( index, ent ); } select_entity( index, ent, skip_undo ) { - if ( isDefined( level.selected_fx[ index ] ) ) - { - return; - } - ent.last_fx_index = index; - if ( !isDefined( skip_undo ) && level.cfx_last_action != "none" ) - { - store_undo_state( "edit", level.selected_fx_ents ); - level.cfx_last_action = "none"; - } - clear_settable_fx(); - level notify( "new_ent_selection" ); - ent thread entity_highlight_enable(); - level.selected_fx[ index ] = 1; - level.selected_fx_ents[ level.selected_fx_ents.size ] = ent; + if ( isdefined( level.selected_fx[index] ) ) + return; + + ent.last_fx_index = index; + + if ( !isdefined( skip_undo ) && level.cfx_last_action != "none" ) + { + store_undo_state( "edit", level.selected_fx_ents ); + level.cfx_last_action = "none"; + } + + clear_settable_fx(); + level notify( "new_ent_selection" ); + ent thread entity_highlight_enable(); + level.selected_fx[index] = 1; + level.selected_fx_ents[level.selected_fx_ents.size] = ent; } ent_is_highlighted( ent ) { - if ( !isDefined( level.fx_highlightedent ) ) - { - return 0; - } - return ent == level.fx_highlightedent; + if ( !isdefined( level.fx_highlightedent ) ) + return 0; + + return ent == level.fx_highlightedent; } deselect_entity( index, ent ) { - if ( !isDefined( level.selected_fx[ index ] ) ) - { - return; - } - if ( level.cfx_last_action != "none" ) - { - store_undo_state( "edit", level.selected_fx_ents ); - level.cfx_last_action = "none"; - } - clear_settable_fx(); - level notify( "new_ent_selection" ); - if ( !ent_is_highlighted( ent ) ) - { - ent thread entity_highlight_disable(); - } - newarray = []; - i = 0; - while ( i < level.selected_fx_ents.size ) - { - if ( level.selected_fx_ents[ i ] != ent ) - { - newarray[ newarray.size ] = level.selected_fx_ents[ i ]; - } - i++; - } - level.selected_fx_ents = newarray; + if ( !isdefined( level.selected_fx[index] ) ) + return; + + if ( level.cfx_last_action != "none" ) + { + store_undo_state( "edit", level.selected_fx_ents ); + level.cfx_last_action = "none"; + } + + clear_settable_fx(); + level notify( "new_ent_selection" ); + level.selected_fx[index] = undefined; + + if ( !ent_is_highlighted( ent ) ) + ent thread entity_highlight_disable(); + + newarray = []; + + for ( i = 0; i < level.selected_fx_ents.size; i++ ) + { + if ( level.selected_fx_ents[i] != ent ) + newarray[newarray.size] = level.selected_fx_ents[i]; + } + + level.selected_fx_ents = newarray; } index_is_selected( index ) { - return isDefined( level.selected_fx[ index ] ); + return isdefined( level.selected_fx[index] ); } ent_is_selected( ent ) { - i = 0; - while ( i < level.selected_fx_ents.size ) - { - if ( level.selected_fx_ents[ i ] == ent ) - { - return 1; - } - i++; - } - return 0; + for ( i = 0; i < level.selected_fx_ents.size; i++ ) + { + if ( level.selected_fx_ents[i] == ent ) + return true; + } + + return false; } clear_entity_selection( skip_undo ) { - if ( !isDefined( skip_undo ) && level.cfx_last_action != "none" ) - { - store_undo_state( "edit", level.selected_fx_ents ); - level.cfx_last_action = "none"; - } - i = 0; - while ( i < level.selected_fx_ents.size ) - { - if ( !ent_is_highlighted( level.selected_fx_ents[ i ] ) ) - { - level.selected_fx_ents[ i ] thread entity_highlight_disable(); - } - i++; - } - level.selected_fx = []; - level.selected_fx_ents = []; + if ( !isdefined( skip_undo ) && level.cfx_last_action != "none" ) + { + store_undo_state( "edit", level.selected_fx_ents ); + level.cfx_last_action = "none"; + } + + for ( i = 0; i < level.selected_fx_ents.size; i++ ) + { + if ( !ent_is_highlighted( level.selected_fx_ents[i] ) ) + level.selected_fx_ents[i] thread entity_highlight_disable(); + } + + level.selected_fx = []; + level.selected_fx_ents = []; } draw_axis() { - if ( isDefined( self.draw_axis_model ) ) - { - return; - } - self.draw_axis_model = spawn_axis_model( self.v[ "origin" ], self.v[ "angles" ] ); - level thread draw_axis_think( self ); - if ( !isDefined( level.draw_axis_models ) ) - { - level.draw_axis_models = []; - } - level.draw_axis_models[ level.draw_axis_models.size ] = self.draw_axis_model; + if ( isdefined( self.draw_axis_model ) ) + return; + + self.draw_axis_model = spawn_axis_model( self.v["origin"], self.v["angles"] ); + level thread draw_axis_think( self ); + + if ( !isdefined( level.draw_axis_models ) ) + level.draw_axis_models = []; + + level.draw_axis_models[level.draw_axis_models.size] = self.draw_axis_model; } spawn_axis_model( origin, angles ) { - model = spawn( "script_model", origin ); - model setmodel( "fx_axis_createfx" ); - model.angles = angles; - return model; + model = spawn( "script_model", origin ); + model setmodel( "fx_axis_createfx" ); + model.angles = angles; + return model; } draw_axis_think( axis_parent ) { - axis_model = axis_parent.draw_axis_model; - axis_model endon( "death" ); - player = get_players()[ 0 ]; - range = getDvarInt( "createfx_drawaxis_range" ); - i = 0; - while ( 1 ) - { - if ( !isDefined( axis_parent ) ) - { - break; - } - else - { - if ( distancesquared( axis_model.origin, player.origin ) > ( range * range ) ) - { - if ( isDefined( axis_model ) ) - { - axis_model delete(); - arrayremovevalue( level.draw_axis_models, undefined ); - } - } - else - { - if ( !isDefined( axis_model ) ) - { - axis_model = spawn_axis_model( axis_parent.v[ "origin" ], axis_parent.v[ "angles" ] ); - axis_parent.draw_axis_model = axis_model; - level.draw_axis_models[ level.draw_axis_models.size ] = axis_model; - } - } - axis_model.origin = axis_parent.v[ "origin" ]; - axis_model.angles = axis_parent.v[ "angles" ]; - wait 0,1; - i++; - if ( i >= 10 ) - { - range = getDvarInt( "createfx_drawaxis_range" ); - i = 0; - } - } - } - if ( isDefined( axis_model ) ) - { - axis_model delete(); - } + axis_model = axis_parent.draw_axis_model; + axis_model endon( "death" ); + player = get_players()[0]; + range = getdvarint( "createfx_drawaxis_range" ); + + for ( i = 0; 1; i = 0 ) + { + asm_cond( !isdefined( axis_parent ), loc_48FC ); + asm_jump( loc_49CC ); + asm_cond( distancesquared( axis_model.origin, player.origin ) > range * range, loc_4940 ); + asm_cond( isdefined( axis_model ), loc_493D ); + axis_model delete(); + arrayremovevalue( level.draw_axis_models, undefined ); + asm_jump( loc_4980 ); + asm_cond( !isdefined( axis_model ), loc_4980 ); + axis_model = spawn_axis_model( axis_parent.v["origin"], axis_parent.v["angles"] ); + axis_parent.draw_axis_model = axis_model; + level.draw_axis_models[level.draw_axis_models.size] = axis_model; + axis_model.origin = axis_parent.v["origin"]; + axis_model.angles = axis_parent.v["angles"]; + wait 0.1; + i++; + asm_cond( i >= 10, loc_49C8 ); + range = getdvarint( "createfx_drawaxis_range" ); + } + + if ( isdefined( axis_model ) ) + axis_model delete(); } stop_drawing_axis_models() { - if ( isDefined( level.draw_axis_models ) ) - { - i = 0; - while ( i < level.draw_axis_models.size ) - { - if ( isDefined( level.draw_axis_models[ i ] ) ) - { - level.draw_axis_models[ i ] delete(); - } - i++; - } - arrayremovevalue( level.draw_axis_models, undefined ); - } + if ( isdefined( level.draw_axis_models ) ) + { + for ( i = 0; i < level.draw_axis_models.size; i++ ) + { + if ( isdefined( level.draw_axis_models[i] ) ) + level.draw_axis_models[i] delete(); + } + + arrayremovevalue( level.draw_axis_models, undefined ); + } } clear_fx_hudelements() { - level.cfx_center_text[ level.cfx_center_text_max - 1 ] clearalltextafterhudelem(); - i = 0; - while ( i < level.createfx_hudelements ) - { - p = 0; - while ( p < 2 ) - { - level.createfxhudelements[ i ][ p ] settext( "" ); - p++; - } - i++; - } - level.fxhudelements = 0; + level.cfx_center_text[level.cfx_center_text_max - 1] clearalltextafterhudelem(); + + for ( i = 0; i < level.createfx_hudelements; i++ ) + { + for ( p = 0; p < 2; p++ ) + level.createfxhudelements[i][p] settext( "" ); + } + + level.fxhudelements = 0; } set_fx_hudelement( text ) { - if ( ismp() && !isDefined( level.createfx_delay_done ) ) - { - return; - } - if ( level.fxhudelements < level.createfx_hudelements ) - { - p = 0; - while ( p < 2 ) - { - level.createfxhudelements[ level.fxhudelements ][ p ] settext( text ); - p++; - } - level.fxhudelements++; - } + if ( ismp() && !isdefined( level.createfx_delay_done ) ) + return; + + if ( level.fxhudelements < level.createfx_hudelements ) + { + for ( p = 0; p < 2; p++ ) + level.createfxhudelements[level.fxhudelements][p] settext( text ); + + level.fxhudelements++; + } } buttondown( button, button2 ) { - if ( !buttonpressed_internal( button ) ) - { - return buttonpressed_internal( button2 ); - } + return buttonpressed_internal( button ) || buttonpressed_internal( button2 ); } buttonpressed_internal( button ) { - if ( !isDefined( button ) ) - { - return 0; - } - if ( kb_locked( button ) ) - { - return 0; - } - player = get_players()[ 0 ]; - return player buttonpressed( button ); + if ( !isdefined( button ) ) + return 0; + + if ( kb_locked( button ) ) + return 0; + + player = get_players()[0]; + return player buttonpressed( button ); } get_selected_move_vector() { - player = get_players()[ 0 ]; - yaw = player getplayerangles()[ 1 ]; - angles = ( 0, yaw, 0 ); - right = anglesToRight( angles ); - forward = anglesToForward( angles ); - up = anglesToUp( angles ); - ctrlheld = button_is_held( "ctrl", "BUTTON_LSHLDR" ); - if ( buttondown( "kp_uparrow", "DPAD_UP" ) ) - { - if ( level.selectedmove_forward < 0 ) - { - level.selectedmove_forward = 0; - } - if ( ctrlheld ) - { - level.selectedmove_forward = 0,1; - wait 0,05; - } - else - { - level.selectedmove_forward += 1; - } - } - else if ( buttondown( "kp_downarrow", "DPAD_DOWN" ) ) - { - if ( level.selectedmove_forward > 0 ) - { - level.selectedmove_forward = 0; - } - if ( ctrlheld ) - { - level.selectedmove_forward = -1 * 0,1; - wait 0,05; - } - else - { - level.selectedmove_forward -= 1; - } - } - else - { - level.selectedmove_forward = 0; - } - if ( buttondown( "kp_rightarrow", "DPAD_RIGHT" ) ) - { - if ( level.selectedmove_right < 0 ) - { - level.selectedmove_right = 0; - } - if ( ctrlheld ) - { - level.selectedmove_right = 0,1; - wait 0,05; - } - else - { - level.selectedmove_right += 1; - } - } - else if ( buttondown( "kp_leftarrow", "DPAD_LEFT" ) ) - { - if ( level.selectedmove_right > 0 ) - { - level.selectedmove_right = 0; - } - if ( ctrlheld ) - { - level.selectedmove_right = -1 * 0,1; - wait 0,05; - } - else - { - level.selectedmove_right -= 1; - } - } - else - { - level.selectedmove_right = 0; - } - if ( buttondown( "BUTTON_Y" ) ) - { - if ( level.selectedmove_up < 0 ) - { - level.selectedmove_up = 0; - } - if ( ctrlheld ) - { - level.selectedmove_up = 0,1; - wait 0,05; - } - else - { - level.selectedmove_up += 1; - } - } - else if ( buttondown( "BUTTON_B" ) ) - { - if ( level.selectedmove_up > 0 ) - { - level.selectedmove_up = 0; - } - if ( ctrlheld ) - { - level.selectedmove_up = -1 * 0,1; - wait 0,05; - } - else - { - level.selectedmove_up -= 1; - } - } - else - { - level.selectedmove_up = 0; - } - vector = ( 1, 1, 1 ); - vector += vectorScale( forward, level.selectedmove_forward ); - vector += vectorScale( right, level.selectedmove_right ); - vector += vectorScale( up, level.selectedmove_up ); - return vector; + player = get_players()[0]; + yaw = player getplayerangles()[1]; + angles = ( 0, yaw, 0 ); + right = anglestoright( angles ); + forward = anglestoforward( angles ); + up = anglestoup( angles ); + ctrlheld = button_is_held( "ctrl", "BUTTON_LSHLDR" ); + + if ( buttondown( "kp_uparrow", "DPAD_UP" ) ) + { + if ( level.selectedmove_forward < 0 ) + level.selectedmove_forward = 0; + + if ( ctrlheld ) + { + level.selectedmove_forward = 0.1; + wait 0.05; + } + else + level.selectedmove_forward += 1; + } + else if ( buttondown( "kp_downarrow", "DPAD_DOWN" ) ) + { + if ( level.selectedmove_forward > 0 ) + level.selectedmove_forward = 0; + + if ( ctrlheld ) + { + level.selectedmove_forward = -1 * 0.1; + wait 0.05; + } + else + level.selectedmove_forward -= 1; + } + else + level.selectedmove_forward = 0; + + if ( buttondown( "kp_rightarrow", "DPAD_RIGHT" ) ) + { + if ( level.selectedmove_right < 0 ) + level.selectedmove_right = 0; + + if ( ctrlheld ) + { + level.selectedmove_right = 0.1; + wait 0.05; + } + else + level.selectedmove_right += 1; + } + else if ( buttondown( "kp_leftarrow", "DPAD_LEFT" ) ) + { + if ( level.selectedmove_right > 0 ) + level.selectedmove_right = 0; + + if ( ctrlheld ) + { + level.selectedmove_right = -1 * 0.1; + wait 0.05; + } + else + level.selectedmove_right -= 1; + } + else + level.selectedmove_right = 0; + + if ( buttondown( "BUTTON_Y" ) ) + { + if ( level.selectedmove_up < 0 ) + level.selectedmove_up = 0; + + if ( ctrlheld ) + { + level.selectedmove_up = 0.1; + wait 0.05; + } + else + level.selectedmove_up += 1; + } + else if ( buttondown( "BUTTON_B" ) ) + { + if ( level.selectedmove_up > 0 ) + level.selectedmove_up = 0; + + if ( ctrlheld ) + { + level.selectedmove_up = -1 * 0.1; + wait 0.05; + } + else + level.selectedmove_up -= 1; + } + else + level.selectedmove_up = 0; + + vector = ( 0, 0, 0 ); + vector += vectorscale( forward, level.selectedmove_forward ); + vector += vectorscale( right, level.selectedmove_right ); + vector += vectorscale( up, level.selectedmove_up ); + return vector; } process_button_held_and_clicked() { - add_button( "mouse1" ); - add_kb_button( "shift" ); - add_kb_button( "ctrl" ); - add_button( "BUTTON_RSHLDR" ); - add_button( "BUTTON_LSHLDR" ); - add_button( "BUTTON_RSTICK" ); - add_button( "BUTTON_LSTICK" ); - add_button( "BUTTON_A" ); - add_button( "BUTTON_B" ); - add_button( "BUTTON_X" ); - add_button( "BUTTON_Y" ); - add_button( "DPAD_UP" ); - add_button( "DPAD_LEFT" ); - add_button( "DPAD_RIGHT" ); - add_button( "DPAD_DOWN" ); - add_kb_button( "escape" ); - add_button( "BUTTON_RTRIG" ); - add_button( "BUTTON_LTRIG" ); - add_kb_button( "a" ); - add_button( "F1" ); - add_button( "F5" ); - add_button( "F2" ); - add_kb_button( "c" ); - add_kb_button( "d" ); - add_kb_button( "f" ); - add_kb_button( "h" ); - add_kb_button( "i" ); - add_kb_button( "j" ); - add_kb_button( "k" ); - add_kb_button( "l" ); - add_kb_button( "m" ); - add_kb_button( "p" ); - add_kb_button( "q" ); - add_kb_button( "r" ); - add_kb_button( "s" ); - add_kb_button( "v" ); - add_kb_button( "x" ); - add_kb_button( "z" ); - add_button( "del" ); - add_kb_button( "end" ); - add_kb_button( "tab" ); - add_kb_button( "ins" ); - add_kb_button( "add" ); - add_kb_button( "space" ); - add_kb_button( "enter" ); - add_kb_button( "leftarrow" ); - add_kb_button( "rightarrow" ); - add_kb_button( "1" ); - add_kb_button( "2" ); - add_kb_button( "3" ); - add_kb_button( "4" ); - add_kb_button( "5" ); - add_kb_button( "6" ); - add_kb_button( "7" ); - add_kb_button( "8" ); - add_kb_button( "9" ); - add_kb_button( "0" ); - add_kb_button( "~" ); + add_button( "mouse1" ); + add_kb_button( "shift" ); + add_kb_button( "ctrl" ); + add_button( "BUTTON_RSHLDR" ); + add_button( "BUTTON_LSHLDR" ); + add_button( "BUTTON_RSTICK" ); + add_button( "BUTTON_LSTICK" ); + add_button( "BUTTON_A" ); + add_button( "BUTTON_B" ); + add_button( "BUTTON_X" ); + add_button( "BUTTON_Y" ); + add_button( "DPAD_UP" ); + add_button( "DPAD_LEFT" ); + add_button( "DPAD_RIGHT" ); + add_button( "DPAD_DOWN" ); + add_kb_button( "escape" ); + add_button( "BUTTON_RTRIG" ); + add_button( "BUTTON_LTRIG" ); + add_kb_button( "a" ); + add_button( "F1" ); + add_button( "F5" ); + add_button( "F2" ); + add_kb_button( "c" ); + add_kb_button( "d" ); + add_kb_button( "f" ); + add_kb_button( "h" ); + add_kb_button( "i" ); + add_kb_button( "j" ); + add_kb_button( "k" ); + add_kb_button( "l" ); + add_kb_button( "m" ); + add_kb_button( "p" ); + add_kb_button( "q" ); + add_kb_button( "r" ); + add_kb_button( "s" ); + add_kb_button( "v" ); + add_kb_button( "x" ); + add_kb_button( "z" ); + add_button( "del" ); + add_kb_button( "end" ); + add_kb_button( "tab" ); + add_kb_button( "ins" ); + add_kb_button( "add" ); + add_kb_button( "space" ); + add_kb_button( "enter" ); + add_kb_button( "leftarrow" ); + add_kb_button( "rightarrow" ); + add_kb_button( "1" ); + add_kb_button( "2" ); + add_kb_button( "3" ); + add_kb_button( "4" ); + add_kb_button( "5" ); + add_kb_button( "6" ); + add_kb_button( "7" ); + add_kb_button( "8" ); + add_kb_button( "9" ); + add_kb_button( "0" ); + add_kb_button( "~" ); } locked( name ) { - if ( isDefined( level.createfx_lockedlist[ name ] ) ) - { - return 0; - } - return kb_locked( name ); + if ( isdefined( level.createfx_lockedlist[name] ) ) + return 0; + + return kb_locked( name ); } kb_locked( name ) { - if ( level.createfx_inputlocked ) - { - return isDefined( level.button_is_kb[ name ] ); - } + return level.createfx_inputlocked && isdefined( level.button_is_kb[name] ); } add_button( name ) { - player = get_players()[ 0 ]; - if ( locked( name ) ) - { - return; - } - if ( !isDefined( level.buttonisheld[ name ] ) ) - { - if ( player buttonpressed( name ) ) - { - level.buttonisheld[ name ] = 1; - level.buttonclick[ name ] = 1; - } - } - else - { - if ( !player buttonpressed( name ) ) - { - } - } + player = get_players()[0]; + + if ( locked( name ) ) + return; + + if ( !isdefined( level.buttonisheld[name] ) ) + { + if ( player buttonpressed( name ) ) + { + level.buttonisheld[name] = 1; + level.buttonclick[name] = 1; + } + } + else if ( !player buttonpressed( name ) ) + level.buttonisheld[name] = undefined; } add_kb_button( name ) { - level.button_is_kb[ name ] = 1; - add_button( name ); + level.button_is_kb[name] = 1; + add_button( name ); } set_anglemod_move_vector() { /# - ctrlheld = button_is_held( "ctrl", "BUTTON_LSHLDR" ); - players = get_players(); - if ( level.is_camera_on == 1 ) - { - newmovement = players[ 0 ] getnormalizedmovement(); - dolly_movement = players[ 0 ] getnormalizedcameramovement(); - if ( newmovement[ 1 ] <= -0,3 ) - { - level.selectedrotate_yaw -= 1; - } - else if ( newmovement[ 1 ] >= 0,3 ) - { - level.selectedrotate_yaw += 1; - } - else if ( buttondown( "kp_leftarrow", "DPAD_LEFT" ) ) - { - if ( level.selectedrotate_yaw < 0 ) - { - level.selectedrotate_yaw = 0; - } - level.selectedrotate_yaw += 0,1; - } - else if ( buttondown( "kp_rightarrow", "DPAD_RIGHT" ) ) - { - if ( level.selectedrotate_yaw > 0 ) - { - level.selectedrotate_yaw = 0; - } - level.selectedrotate_yaw -= 0,1; - } - else - { - level.selectedrotate_yaw = 0; - } - if ( dolly_movement[ 0 ] <= -0,2 ) - { - level.selectedrotate_pitch += 1; - } - else if ( dolly_movement[ 0 ] >= 0,2 ) - { - level.selectedrotate_pitch -= 1; - } - else if ( buttondown( "kp_uparrow", "DPAD_UP" ) ) - { - if ( level.selectedrotate_pitch < 0 ) - { - level.selectedrotate_pitch = 0; - } - level.selectedrotate_pitch += 0,1; - } - else if ( buttondown( "kp_downarrow", "DPAD_DOWN" ) ) - { - if ( level.selectedrotate_pitch > 0 ) - { - level.selectedrotate_pitch = 0; - } - level.selectedrotate_pitch -= 0,1; - } - else - { - level.selectedrotate_pitch = 0; - } - if ( buttondown( "BUTTON_Y" ) ) - { - if ( level.selectedrotate_roll < 0 ) - { - level.selectedrotate_roll = 0; - } - level.selectedrotate_roll += 0,1; - } - else if ( buttondown( "BUTTON_B" ) ) - { - if ( level.selectedrotate_roll > 0 ) - { - level.selectedrotate_roll = 0; - } - level.selectedrotate_roll -= 0,1; - } - else - { - level.selectedrotate_roll = 0; - } - } - else if ( buttondown( "kp_uparrow", "DPAD_UP" ) ) - { - if ( level.selectedrotate_pitch < 0 ) - { - level.selectedrotate_pitch = 0; - } - if ( ctrlheld ) - { - level.selectedrotate_pitch = 0,1; - wait 0,05; - } - else - { - level.selectedrotate_pitch += 1; - } - } - else if ( buttondown( "kp_downarrow", "DPAD_DOWN" ) ) - { - if ( level.selectedrotate_pitch > 0 ) - { - level.selectedrotate_pitch = 0; - } - if ( ctrlheld ) - { - level.selectedrotate_pitch = -1 * 0,1; - wait 0,05; - } - else - { - level.selectedrotate_pitch -= 1; - } - } - else - { - level.selectedrotate_pitch = 0; - } - if ( buttondown( "kp_leftarrow", "DPAD_LEFT" ) ) - { - if ( level.selectedrotate_yaw < 0 ) - { - level.selectedrotate_yaw = 0; - } - if ( ctrlheld ) - { - level.selectedrotate_yaw = 0,1; - wait 0,05; - } - else - { - level.selectedrotate_yaw += 1; - } - } - else if ( buttondown( "kp_rightarrow", "DPAD_RIGHT" ) ) - { - if ( level.selectedrotate_yaw > 0 ) - { - level.selectedrotate_yaw = 0; - } - if ( ctrlheld ) - { - level.selectedrotate_yaw = -1 * 0,1; - wait 0,05; - } - else - { - level.selectedrotate_yaw -= 1; - } - } - else - { - level.selectedrotate_yaw = 0; - } - if ( buttondown( "BUTTON_Y" ) ) - { - if ( level.selectedrotate_roll < 0 ) - { - level.selectedrotate_roll = 0; - } - if ( ctrlheld ) - { - level.selectedrotate_roll = 0,1; - wait 0,05; - } - else - { - level.selectedrotate_roll += 1; - } - } - else if ( buttondown( "BUTTON_B" ) ) - { - if ( level.selectedrotate_roll > 0 ) - { - level.selectedrotate_roll = 0; - } - if ( ctrlheld ) - { - level.selectedrotate_roll = -1 * 0,1; - wait 0,05; - } - else - { - level.selectedrotate_roll -= 1; - } - } - else - { - level.selectedrotate_roll = 0; + ctrlheld = button_is_held( "ctrl", "BUTTON_LSHLDR" ); + players = get_players(); + + if ( level.is_camera_on == 1 ) + { + newmovement = players[0] getnormalizedmovement(); + dolly_movement = players[0] getnormalizedcameramovement(); + + if ( newmovement[1] <= -0.3 ) + level.selectedrotate_yaw -= 1; + else if ( newmovement[1] >= 0.3 ) + level.selectedrotate_yaw += 1; + else if ( buttondown( "kp_leftarrow", "DPAD_LEFT" ) ) + { + if ( level.selectedrotate_yaw < 0 ) + level.selectedrotate_yaw = 0; + + level.selectedrotate_yaw += 0.1; + } + else if ( buttondown( "kp_rightarrow", "DPAD_RIGHT" ) ) + { + if ( level.selectedrotate_yaw > 0 ) + level.selectedrotate_yaw = 0; + + level.selectedrotate_yaw -= 0.1; + } + else + level.selectedrotate_yaw = 0; + + if ( dolly_movement[0] <= -0.2 ) + level.selectedrotate_pitch += 1; + else if ( dolly_movement[0] >= 0.2 ) + level.selectedrotate_pitch -= 1; + else if ( buttondown( "kp_uparrow", "DPAD_UP" ) ) + { + if ( level.selectedrotate_pitch < 0 ) + level.selectedrotate_pitch = 0; + + level.selectedrotate_pitch += 0.1; + } + else if ( buttondown( "kp_downarrow", "DPAD_DOWN" ) ) + { + if ( level.selectedrotate_pitch > 0 ) + level.selectedrotate_pitch = 0; + + level.selectedrotate_pitch -= 0.1; + } + else + level.selectedrotate_pitch = 0; + + if ( buttondown( "BUTTON_Y" ) ) + { + if ( level.selectedrotate_roll < 0 ) + level.selectedrotate_roll = 0; + + level.selectedrotate_roll += 0.1; + } + else if ( buttondown( "BUTTON_B" ) ) + { + if ( level.selectedrotate_roll > 0 ) + level.selectedrotate_roll = 0; + + level.selectedrotate_roll -= 0.1; + } + else + level.selectedrotate_roll = 0; + } + else + { + if ( buttondown( "kp_uparrow", "DPAD_UP" ) ) + { + if ( level.selectedrotate_pitch < 0 ) + level.selectedrotate_pitch = 0; + + if ( ctrlheld ) + { + level.selectedrotate_pitch = 0.1; + wait 0.05; + } + else + level.selectedrotate_pitch += 1; + } + else if ( buttondown( "kp_downarrow", "DPAD_DOWN" ) ) + { + if ( level.selectedrotate_pitch > 0 ) + level.selectedrotate_pitch = 0; + + if ( ctrlheld ) + { + level.selectedrotate_pitch = -1 * 0.1; + wait 0.05; + } + else + level.selectedrotate_pitch -= 1; + } + else + level.selectedrotate_pitch = 0; + + if ( buttondown( "kp_leftarrow", "DPAD_LEFT" ) ) + { + if ( level.selectedrotate_yaw < 0 ) + level.selectedrotate_yaw = 0; + + if ( ctrlheld ) + { + level.selectedrotate_yaw = 0.1; + wait 0.05; + } + else + level.selectedrotate_yaw += 1; + } + else if ( buttondown( "kp_rightarrow", "DPAD_RIGHT" ) ) + { + if ( level.selectedrotate_yaw > 0 ) + level.selectedrotate_yaw = 0; + + if ( ctrlheld ) + { + level.selectedrotate_yaw = -1 * 0.1; + wait 0.05; + } + else + level.selectedrotate_yaw -= 1; + } + else + level.selectedrotate_yaw = 0; + + if ( buttondown( "BUTTON_Y" ) ) + { + if ( level.selectedrotate_roll < 0 ) + level.selectedrotate_roll = 0; + + if ( ctrlheld ) + { + level.selectedrotate_roll = 0.1; + wait 0.05; + } + else + level.selectedrotate_roll += 1; + } + else if ( buttondown( "BUTTON_B" ) ) + { + if ( level.selectedrotate_roll > 0 ) + level.selectedrotate_roll = 0; + + if ( ctrlheld ) + { + level.selectedrotate_roll = -1 * 0.1; + wait 0.05; + } + else + level.selectedrotate_roll -= 1; + } + else + level.selectedrotate_roll = 0; + } #/ - } } cfxprintln( file, string ) { /# - if ( file == -1 ) - { - return; - } - fprintln( file, string ); + if ( file == -1 ) + return; + + fprintln( file, string ); #/ } update_save_bar( number ) { - level notify( "saving_start" ); - level endon( "saving_start" ); - level.current_saving_number = 0; - while ( level.current_saving_number < level.createfxent.size ) - { - center_text_clear(); - center_text_add( "Saving Createfx to File" ); - center_text_add( "Saving effect " + level.current_saving_number + "/" + level.createfxent.size ); - center_text_add( "Do not reset Xenon until saving is complete." ); - wait 0,05; - center_text_clear(); - } - center_text_add( "Saving Complete." ); - center_text_add( level.createfxent.size + " effects saved to files." ); + level notify( "saving_start" ); + level endon( "saving_start" ); + level.current_saving_number = 0; + + while ( level.current_saving_number < level.createfxent.size ) + { + center_text_clear(); + center_text_add( "Saving Createfx to File" ); + center_text_add( "Saving effect " + level.current_saving_number + "/" + level.createfxent.size ); + center_text_add( "Do not reset Xenon until saving is complete." ); + wait 0.05; + center_text_clear(); + } + + center_text_add( "Saving Complete." ); + center_text_add( level.createfxent.size + " effects saved to files." ); } generate_fx_log( type, autosave ) { /# - autosave = isDefined( autosave ); - if ( type == "server" ) - { - if ( !autosave ) - { - filename = level.cfx_server_scriptdata + level.script + "_fx.gsc"; - } - else - { - filename = level.cfx_server_scriptdata + "backup.gsc"; - } - call_loop = level.cfx_server_loop; - call_oneshot = level.cfx_server_oneshot; - call_exploder = level.cfx_server_exploder; - call_loopsound = level.cfx_server_loopsound; - } - else if ( type == "client" ) - { - if ( !autosave ) - { - filename = level.cfx_client_scriptdata + level.script + "_fx.csc"; - } - else - { - filename = level.cfx_client_scriptdata + "backup.csc"; - } - call_loop = level.cfx_client_loop; - call_oneshot = level.cfx_client_oneshot; - call_exploder = level.cfx_client_exploder; - call_loopsound = level.cfx_client_loopsound; - } - else - { - println( "^1Error: Improper type in generate_fx_log()" ); - return; - } - file = openfile( filename, "write" ); - if ( file == -1 ) - { - level.write_error = filename; - if ( type == "server" ) - { - return 1; - } - else - { - if ( type == "client" ) - { - return 2; - } - else - { - return 3; - } - } - } - else - { - cfxprintln( file, "//_createfx generated. Do not touch!!" ); - cfxprintln( file, "main()" ); - cfxprintln( file, "{" ); - p = 0; - while ( p < level.createfxent.size ) - { - ent = level.createfxent[ p ]; - origin = []; - angles = []; - i = 0; - while ( i < 3 ) - { - origin[ i ] = ent.v[ "origin" ][ i ]; - angles[ i ] = ent.v[ "angles" ][ i ]; - if ( origin[ i ] < 0,1 && origin[ i ] > ( 0,1 * -1 ) ) - { - origin[ i ] = 0; - } - if ( angles[ i ] < 0,1 && angles[ i ] > ( 0,1 * -1 ) ) - { - angles[ i ] = 0; - } - i++; - } - ent.v[ "origin" ] = ( origin[ 0 ], origin[ 1 ], origin[ 2 ] ); - ent.v[ "angles" ] = ( angles[ 0 ], angles[ 1 ], angles[ 2 ] ); - p++; - } - if ( !autosave ) - { - println( " *** CREATING EFFECT, COPY THESE LINES TO ", level.script, "_fx.gsc *** " ); - } - cfxprintln( file, "// CreateFX entities placed: " + ( level.createfxent.size - level.non_fx_ents ) ); - breather = 0; - if ( autosave ) - { - breather_pause = 1; - } - else - { - breather_pause = 5; - } - i = 0; - while ( i < level.createfxent.size ) - { - e = level.createfxent[ i ]; - assert( isDefined( e.v[ "type" ] ), "effect at origin " + e.v[ "origin" ] + " has no type" ); - if ( isDefined( e.model ) ) - { - i++; - continue; - } - else if ( e.v[ "fxid" ] == "No FX" ) - { - i++; - continue; - } - else - { - output_name = "\t"; - output_props = "\t"; - ent_type = e.v[ "type" ]; - if ( ent_type == "loopfx" ) - { - output_name += "ent = " + call_loop + "( "" + e.v[ "fxid" ] + "" );"; - } - if ( ent_type == "oneshotfx" ) - { - output_name += "ent = " + call_oneshot + "( "" + e.v[ "fxid" ] + "" );"; - } - if ( ent_type == "exploder" ) - { - output_name += "ent = " + call_exploder + "( "" + e.v[ "fxid" ] + "" );"; - } - if ( ent_type == "soundfx" ) - { - output_name += "ent = " + call_loopsound + "();"; - } - output_props += get_fx_options( e ); - cfxprintln( file, output_name ); - cfxprintln( file, output_props ); - cfxprintln( file, "\t" ); - breather++; - if ( breather >= breather_pause ) - { - wait 0,05; - breather = 0; - } - } - i++; - } - if ( level.bscriptgened ) - { - script_gen_dump_addline( level.cfx_server_scriptgendump, level.script + "_fx" ); - [[ level.cfx_func_script_gen_dump ]](); - } - cfxprintln( file, "}" ); - saved = closefile( file ); - assert( saved == 1, "File not saved (see above message?): " + filename ); - println( "CreateFX entities placed: " + ( level.createfxent.size - level.non_fx_ents ) ); - return 0; + autosave = isdefined( autosave ); + + if ( type == "server" ) + { + if ( !autosave ) + filename = level.cfx_server_scriptdata + level.script + "_fx.gsc"; + else + filename = level.cfx_server_scriptdata + "backup.gsc"; + + call_loop = level.cfx_server_loop; + call_oneshot = level.cfx_server_oneshot; + call_exploder = level.cfx_server_exploder; + call_loopsound = level.cfx_server_loopsound; + } + else if ( type == "client" ) + { + if ( !autosave ) + filename = level.cfx_client_scriptdata + level.script + "_fx.csc"; + else + filename = level.cfx_client_scriptdata + "backup.csc"; + + call_loop = level.cfx_client_loop; + call_oneshot = level.cfx_client_oneshot; + call_exploder = level.cfx_client_exploder; + call_loopsound = level.cfx_client_loopsound; + } + else + { + println( "^1Error: Improper type in generate_fx_log()" ); + return; + } + + file = openfile( filename, "write" ); + + if ( file == -1 ) + { + level.write_error = filename; + + if ( type == "server" ) + return 1; + else if ( type == "client" ) + return 2; + else + return 3; + } + else + { + cfxprintln( file, "//_createfx generated. Do not touch!!" ); + cfxprintln( file, "main()" ); + cfxprintln( file, "{" ); + + for ( p = 0; p < level.createfxent.size; p++ ) + { + ent = level.createfxent[p]; + origin = []; + angles = []; + + for ( i = 0; i < 3; i++ ) + { + origin[i] = ent.v["origin"][i]; + angles[i] = ent.v["angles"][i]; + + if ( origin[i] < 0.1 && origin[i] > 0.1 * -1 ) + origin[i] = 0; + + if ( angles[i] < 0.1 && angles[i] > 0.1 * -1 ) + angles[i] = 0; + } + + ent.v["origin"] = ( origin[0], origin[1], origin[2] ); + ent.v["angles"] = ( angles[0], angles[1], angles[2] ); + } + + if ( !autosave ) + println( " *** CREATING EFFECT, COPY THESE LINES TO ", level.script, "_fx.gsc *** " ); + + cfxprintln( file, "// CreateFX entities placed: " + level.createfxent.size - level.non_fx_ents ); + breather = 0; + + if ( autosave ) + breather_pause = 1; + else + breather_pause = 5; + + for ( i = 0; i < level.createfxent.size; i++ ) + { + e = level.createfxent[i]; +/# + assert( isdefined( e.v["type"] ), "effect at origin " + e.v["origin"] + " has no type" ); +#/ + if ( isdefined( e.model ) ) + continue; + + if ( e.v["fxid"] == "No FX" ) + continue; + + output_name = "\t"; + output_props = "\t"; + ent_type = e.v["type"]; + + if ( ent_type == "loopfx" ) + output_name += ( "ent = " + call_loop + "( \"" + e.v["fxid"] + "\" );" ); + + if ( ent_type == "oneshotfx" ) + output_name += ( "ent = " + call_oneshot + "( \"" + e.v["fxid"] + "\" );" ); + + if ( ent_type == "exploder" ) + output_name += ( "ent = " + call_exploder + "( \"" + e.v["fxid"] + "\" );" ); + + if ( ent_type == "soundfx" ) + output_name += ( "ent = " + call_loopsound + "();" ); + + output_props += get_fx_options( e ); + cfxprintln( file, output_name ); + cfxprintln( file, output_props ); + cfxprintln( file, "\t" ); + breather++; + + if ( breather >= breather_pause ) + { + wait 0.05; + breather = 0; + } + } + + if ( level.bscriptgened ) + { + script_gen_dump_addline( level.cfx_server_scriptgendump, level.script + "_fx" ); + [[ level.cfx_func_script_gen_dump ]](); + } + + cfxprintln( file, "}" ); + saved = closefile( file ); +/# + assert( saved == 1, "File not saved (see above message?): " + filename ); +#/ + println( "CreateFX entities placed: " + level.createfxent.size - level.non_fx_ents ); + return 0; + } #/ - } } get_fx_options( ent ) { - output_props = ""; - i = 0; - while ( i < level.createfx_options.size ) - { - option = level.createfx_options[ i ]; - if ( !isDefined( ent.v[ option[ "name" ] ] ) ) - { - i++; - continue; - } - else if ( !mask( option[ "mask" ], ent.v[ "type" ] ) ) - { - i++; - continue; - } - else if ( option[ "type" ] == "string" ) - { - if ( option[ "name" ] == "fxid" ) - { - i++; - continue; - } - else output_props += "ent.v[ "" + option[ "name" ] + "" ] = "" + ent.v[ option[ "name" ] ] + ""; "; - i++; - continue; - } - else - { - output_props += "ent.v[ "" + option[ "name" ] + "" ] = " + ent.v[ option[ "name" ] ] + "; "; - } - i++; - } - return output_props; + output_props = ""; + + for ( i = 0; i < level.createfx_options.size; i++ ) + { + option = level.createfx_options[i]; + + if ( !isdefined( ent.v[option["name"]] ) ) + continue; + + if ( !mask( option["mask"], ent.v["type"] ) ) + continue; + + if ( option["type"] == "string" ) + { + if ( option["name"] == "fxid" ) + continue; + + output_props += ( "ent.v[ \"" + option["name"] + "\" ] = \"" + ent.v[option["name"]] + "\"; " ); + continue; + } + + output_props += ( "ent.v[ \"" + option["name"] + "\" ] = " + ent.v[option["name"]] + "; " ); + } + + return output_props; } entity_highlight_disable() { - self notify( "highlight change" ); - self endon( "highlight change" ); - for ( ;; ) - { - self.textalpha -= 0,05; - if ( self.textalpha < 0,4 ) - { - break; - } - else - { - wait 0,05; - } - } - self.textalpha = 0,4; + self notify( "highlight change" ); + self endon( "highlight change" ); + + for (;;) + { + self.textalpha -= 0.05; + + if ( self.textalpha < 0.4 ) + break; + + wait 0.05; + } + + self.textalpha = 0.4; } entity_highlight_enable() { - self notify( "highlight change" ); - self endon( "highlight change" ); - for ( ;; ) - { - self.textalpha += 0,05; - if ( self.textalpha > 1 ) - { - break; - } - else - { - wait 0,05; - } - } - self.textalpha = 1; + self notify( "highlight change" ); + self endon( "highlight change" ); + + for (;;) + { + self.textalpha += 0.05; + + if ( self.textalpha > 1 ) + break; + + wait 0.05; + } + + self.textalpha = 1; } get_center_of_array( array ) { - center = ( 1, 1, 1 ); - i = 0; - while ( i < array.size ) - { - center = ( center[ 0 ] + array[ i ].v[ "origin" ][ 0 ], center[ 1 ] + array[ i ].v[ "origin" ][ 1 ], center[ 2 ] + array[ i ].v[ "origin" ][ 2 ] ); - i++; - } - return ( center[ 0 ] / array.size, center[ 1 ] / array.size, center[ 2 ] / array.size ); + center = ( 0, 0, 0 ); + + for ( i = 0; i < array.size; i++ ) + center = ( center[0] + array[i].v["origin"][0], center[1] + array[i].v["origin"][1], center[2] + array[i].v["origin"][2] ); + + return ( center[0] / array.size, center[1] / array.size, center[2] / array.size ); } rotation_is_occuring() { - if ( level.selectedrotate_roll != 0 ) - { - return 1; - } - if ( level.selectedrotate_pitch != 0 ) - { - return 1; - } - return level.selectedrotate_yaw != 0; + if ( level.selectedrotate_roll != 0 ) + return 1; + + if ( level.selectedrotate_pitch != 0 ) + return 1; + + return level.selectedrotate_yaw != 0; } process_fx_rotater() { - if ( level.fx_rotating ) - { - return; - } - set_anglemod_move_vector(); - if ( !rotation_is_occuring() ) - { - return; - } - level.fx_rotating = 1; - if ( level.cfx_last_action != "rotate" ) - { - store_undo_state( "edit", level.selected_fx_ents ); - level.cfx_last_action = "rotate"; - } - if ( level.selected_fx_ents.size > 1 ) - { - center = get_center_of_array( level.selected_fx_ents ); - org = spawn( "script_origin", center ); - org.v[ "angles" ] = level.selected_fx_ents[ 0 ].v[ "angles" ]; - org.v[ "origin" ] = center; - rotater = []; - i = 0; - while ( i < level.selected_fx_ents.size ) - { - rotater[ i ] = spawn( "script_origin", level.selected_fx_ents[ i ].v[ "origin" ] ); - rotater[ i ].angles = level.selected_fx_ents[ i ].v[ "angles" ]; - rotater[ i ] linkto( org ); - i++; - } - rotate_over_time( org, rotater ); - org delete(); - i = 0; - while ( i < rotater.size ) - { - rotater[ i ] delete(); - i++; - } - } - else if ( level.selected_fx_ents.size == 1 ) - { - ent = level.selected_fx_ents[ 0 ]; - rotater = spawn( "script_origin", ( 1, 1, 1 ) ); - rotater.angles = ent.v[ "angles" ]; - if ( level.selectedrotate_pitch != 0 ) - { - rotater devaddpitch( level.selectedrotate_pitch ); - } - else if ( level.selectedrotate_yaw != 0 ) - { - rotater devaddyaw( level.selectedrotate_yaw ); - } - else - { - rotater devaddroll( level.selectedrotate_roll ); - } - ent.v[ "angles" ] = rotater.angles; - rotater delete(); - wait 0,05; - } - level.fx_rotating = 0; + if ( level.fx_rotating ) + return; + + set_anglemod_move_vector(); + + if ( !rotation_is_occuring() ) + return; + + level.fx_rotating = 1; + + if ( level.cfx_last_action != "rotate" ) + { + store_undo_state( "edit", level.selected_fx_ents ); + level.cfx_last_action = "rotate"; + } + + if ( level.selected_fx_ents.size > 1 ) + { + center = get_center_of_array( level.selected_fx_ents ); + org = spawn( "script_origin", center ); + org.v["angles"] = level.selected_fx_ents[0].v["angles"]; + org.v["origin"] = center; + rotater = []; + + for ( i = 0; i < level.selected_fx_ents.size; i++ ) + { + rotater[i] = spawn( "script_origin", level.selected_fx_ents[i].v["origin"] ); + rotater[i].angles = level.selected_fx_ents[i].v["angles"]; + rotater[i] linkto( org ); + } + + rotate_over_time( org, rotater ); + org delete(); + + for ( i = 0; i < rotater.size; i++ ) + rotater[i] delete(); + } + else if ( level.selected_fx_ents.size == 1 ) + { + ent = level.selected_fx_ents[0]; + rotater = spawn( "script_origin", ( 0, 0, 0 ) ); + rotater.angles = ent.v["angles"]; + + if ( level.selectedrotate_pitch != 0 ) + rotater devaddpitch( level.selectedrotate_pitch ); + else if ( level.selectedrotate_yaw != 0 ) + rotater devaddyaw( level.selectedrotate_yaw ); + else + rotater devaddroll( level.selectedrotate_roll ); + + ent.v["angles"] = rotater.angles; + rotater delete(); + wait 0.05; + } + + level.fx_rotating = 0; } rotate_over_time( org, rotater ) { - level endon( "new_ent_selection" ); - p = 0; - while ( p < 2 ) - { - if ( level.selectedrotate_pitch != 0 ) - { - org devaddpitch( level.selectedrotate_pitch ); - } - else if ( level.selectedrotate_yaw != 0 ) - { - org devaddyaw( level.selectedrotate_yaw ); - } - else - { - org devaddroll( level.selectedrotate_roll ); - } - wait 0,05; - i = 0; - while ( i < level.selected_fx_ents.size ) - { - ent = level.selected_fx_ents[ i ]; - if ( isDefined( ent.model ) ) - { - i++; - continue; - } - else - { - ent.v[ "origin" ] = rotater[ i ].origin; - ent.v[ "angles" ] = rotater[ i ].angles; - } - i++; - } - p++; - } + level endon( "new_ent_selection" ); + + for ( p = 0; p < 2; p++ ) + { + if ( level.selectedrotate_pitch != 0 ) + org devaddpitch( level.selectedrotate_pitch ); + else if ( level.selectedrotate_yaw != 0 ) + org devaddyaw( level.selectedrotate_yaw ); + else + org devaddroll( level.selectedrotate_roll ); + + wait 0.05; + + for ( i = 0; i < level.selected_fx_ents.size; i++ ) + { + ent = level.selected_fx_ents[i]; + + if ( isdefined( ent.model ) ) + continue; + + ent.v["origin"] = rotater[i].origin; + ent.v["angles"] = rotater[i].angles; + } + } } delete_pressed() { - if ( level.createfx_inputlocked ) - { - remove_selected_option(); - return; - } - delete_selection(); + if ( level.createfx_inputlocked ) + { + remove_selected_option(); + return; + } + + delete_selection(); } remove_selected_option() { - if ( !isDefined( level.selected_fx_option_index ) ) - { - return; - } - name = level.createfx_options[ level.selected_fx_option_index ][ "name" ]; - i = 0; - while ( i < level.createfxent.size ) - { - ent = level.createfxent[ i ]; - if ( !ent_is_selected( ent ) ) - { - i++; - continue; - } - else - { - ent remove_option( name ); - } - i++; - } - update_selected_entities(); - clear_settable_fx(); + if ( !isdefined( level.selected_fx_option_index ) ) + return; + + name = level.createfx_options[level.selected_fx_option_index]["name"]; + + for ( i = 0; i < level.createfxent.size; i++ ) + { + ent = level.createfxent[i]; + + if ( !ent_is_selected( ent ) ) + continue; + + ent remove_option( name ); + } + + update_selected_entities(); + clear_settable_fx(); } remove_option( name ) { + self.v[name] = undefined; } delete_selection() { - newarray = []; - if ( level.selected_fx_ents.size < 1 ) - { - return; - } - store_undo_state( "delete", level.selected_fx_ents ); - level.cfx_last_action = "none"; - i = 0; - while ( i < level.createfxent.size ) - { - ent = level.createfxent[ i ]; - if ( ent_is_selected( ent ) ) - { - if ( isDefined( ent.looper ) ) - { - ent.looper delete(); - } - level.fx_highlightedent = undefined; - ent notify( "stop_loop" ); - i++; - continue; - } - else - { - newarray[ newarray.size ] = ent; - } - i++; - } - level.createfxent = newarray; - level.selected_fx = []; - level.selected_fx_ents = []; - clear_fx_hudelements(); + newarray = []; + + if ( level.selected_fx_ents.size < 1 ) + return; + + store_undo_state( "delete", level.selected_fx_ents ); + level.cfx_last_action = "none"; + + for ( i = 0; i < level.createfxent.size; i++ ) + { + ent = level.createfxent[i]; + + if ( ent_is_selected( ent ) ) + { + if ( isdefined( ent.looper ) ) + ent.looper delete(); + + level.fx_highlightedent = undefined; + ent notify( "stop_loop" ); + continue; + } + + newarray[newarray.size] = ent; + } + + level.createfxent = newarray; + level.selected_fx = []; + level.selected_fx_ents = []; + clear_fx_hudelements(); } move_selection_to_cursor( skip_undo ) { - origin = level.createfxcursor[ "position" ]; - if ( level.selected_fx_ents.size <= 0 ) - { - return; - } - if ( !isDefined( skip_undo ) && level.cfx_last_action != "move_to_cursor" ) - { - store_undo_state( "edit", level.selected_fx_ents ); - level.cfx_last_action = "move_to_cursor"; - } - center = get_center_of_array( level.selected_fx_ents ); - difference = center - origin; - i = 0; - while ( i < level.selected_fx_ents.size ) - { - ent = level.selected_fx_ents[ i ]; - if ( isDefined( ent.model ) ) - { - i++; - continue; - } - else - { - ent.v[ "origin" ] -= difference; - } - i++; - } + origin = level.createfxcursor["position"]; + + if ( level.selected_fx_ents.size <= 0 ) + return; + + if ( !isdefined( skip_undo ) && level.cfx_last_action != "move_to_cursor" ) + { + store_undo_state( "edit", level.selected_fx_ents ); + level.cfx_last_action = "move_to_cursor"; + } + + center = get_center_of_array( level.selected_fx_ents ); + difference = center - origin; + + for ( i = 0; i < level.selected_fx_ents.size; i++ ) + { + ent = level.selected_fx_ents[i]; + + if ( isdefined( ent.model ) ) + continue; + + ent.v["origin"] -= difference; + } } insert_effect() { - setmenu( "creation" ); - level.effect_list_offset = 0; - clear_fx_hudelements(); - set_fx_hudelement( "Pick effect type to create:" ); - set_fx_hudelement( "1. One Shot fx" ); - set_fx_hudelement( "2. Looping fx" ); - set_fx_hudelement( "3. Exploder" ); - set_fx_hudelement( "4. Looping sound" ); - set_fx_hudelement( "(c) Cancel" ); - set_fx_hudelement( "(x) Exit" ); + setmenu( "creation" ); + level.effect_list_offset = 0; + clear_fx_hudelements(); + set_fx_hudelement( "Pick effect type to create:" ); + set_fx_hudelement( "1. One Shot fx" ); + set_fx_hudelement( "2. Looping fx" ); + set_fx_hudelement( "3. Exploder" ); + set_fx_hudelement( "4. Looping sound" ); + set_fx_hudelement( "(c) Cancel" ); + set_fx_hudelement( "(x) Exit" ); } show_help() { - clear_fx_hudelements(); - set_fx_hudelement( "Help:" ); - set_fx_hudelement( "I Insert effect" ); - set_fx_hudelement( "Shift + D Delete selected effects" ); - set_fx_hudelement( "F + 5 Save" ); - set_fx_hudelement( "A button Toggle the selection of the current effect" ); - set_fx_hudelement( "X button Toggle effect rotation mode" ); - set_fx_hudelement( "Y button Move selected effects up or rotate X axis" ); - set_fx_hudelement( "B button Move selected effects down or rotate X axis" ); - set_fx_hudelement( "D-pad Up/Down Move selected effects Forward/Backward or rotate Y axis" ); - set_fx_hudelement( "D-pad Left/Right Move selected effects Left/Right or rotate Z axis" ); - set_fx_hudelement( "R Shoulder Move selected effects to the cursor" ); - set_fx_hudelement( "L Shoulder Hold to select multiple effects" ); - set_fx_hudelement( "Right Arrow Next page in options menu" ); - set_fx_hudelement( "Left Arrow Previous page in options menu" ); - set_fx_hudelement( "A Add option to the selected effects" ); - set_fx_hudelement( "X Exit effect options menu" ); - set_fx_hudelement( "Shift + D Drop selected effects to the ground" ); - set_fx_hudelement( "R Reset the rotation of the selected effects" ); - set_fx_hudelement( "L Stick Copy effects" ); - set_fx_hudelement( "R Stick Paste effects" ); - set_fx_hudelement( "V Copy the angles from the most recently selected fx onto all selected fx." ); - set_fx_hudelement( "F + 2 Toggle CreateFX dot and menu drawing" ); - set_fx_hudelement( "U UFO" ); - set_fx_hudelement( "N Noclip" ); - set_fx_hudelement( "R Trig + L Trig Jump forward 8000 units" ); - set_fx_hudelement( "T Toggle Timescale FAST" ); - set_fx_hudelement( "Y Toggle Timescale SLOW" ); - set_fx_hudelement( "H Toggle FX Visibility" ); - set_fx_hudelement( "W Toggle effect wireframe" ); - set_fx_hudelement( "P Toggle FX Profile" ); + clear_fx_hudelements(); + set_fx_hudelement( "Help:" ); + set_fx_hudelement( "I Insert effect" ); + set_fx_hudelement( "Shift + D Delete selected effects" ); + set_fx_hudelement( "F + 5 Save" ); + set_fx_hudelement( "A button Toggle the selection of the current effect" ); + set_fx_hudelement( "X button Toggle effect rotation mode" ); + set_fx_hudelement( "Y button Move selected effects up or rotate X axis" ); + set_fx_hudelement( "B button Move selected effects down or rotate X axis" ); + set_fx_hudelement( "D-pad Up/Down Move selected effects Forward/Backward or rotate Y axis" ); + set_fx_hudelement( "D-pad Left/Right Move selected effects Left/Right or rotate Z axis" ); + set_fx_hudelement( "R Shoulder Move selected effects to the cursor" ); + set_fx_hudelement( "L Shoulder Hold to select multiple effects" ); + set_fx_hudelement( "Right Arrow Next page in options menu" ); + set_fx_hudelement( "Left Arrow Previous page in options menu" ); + set_fx_hudelement( "A Add option to the selected effects" ); + set_fx_hudelement( "X Exit effect options menu" ); + set_fx_hudelement( "Shift + D Drop selected effects to the ground" ); + set_fx_hudelement( "R Reset the rotation of the selected effects" ); + set_fx_hudelement( "L Stick Copy effects" ); + set_fx_hudelement( "R Stick Paste effects" ); + set_fx_hudelement( "V Copy the angles from the most recently selected fx onto all selected fx." ); + set_fx_hudelement( "F + 2 Toggle CreateFX dot and menu drawing" ); + set_fx_hudelement( "U UFO" ); + set_fx_hudelement( "N Noclip" ); + set_fx_hudelement( "R Trig + L Trig Jump forward 8000 units" ); + set_fx_hudelement( "T Toggle Timescale FAST" ); + set_fx_hudelement( "Y Toggle Timescale SLOW" ); + set_fx_hudelement( "H Toggle FX Visibility" ); + set_fx_hudelement( "W Toggle effect wireframe" ); + set_fx_hudelement( "P Toggle FX Profile" ); } center_text_init() { - level.cfx_center_text = []; - level.cfx_center_text_index = 0; - level.cfx_center_text_max = 3; - new_array = []; - p = 0; - while ( p < level.cfx_center_text_max ) - { - center_hud = newdebughudelem(); - center_hud settext( " " ); - center_hud.horzalign = "center"; - center_hud.vertalign = "middle"; - center_hud.alignx = "center"; - center_hud.aligny = "middle"; - center_hud.foreground = 1; - center_hud.fontscale = 1,1; - center_hud.sort = 21; - center_hud.alpha = 1; - center_hud.color = ( 1, 1, 1 ); - center_hud.y = p * 25; - new_array[ p ] = center_hud; - p++; - } - level.cfx_center_text = new_array; + level.cfx_center_text = []; + level.cfx_center_text_index = 0; + level.cfx_center_text_max = 3; + new_array = []; + + for ( p = 0; p < level.cfx_center_text_max; p++ ) + { + center_hud = newdebughudelem(); + center_hud settext( " " ); + center_hud.horzalign = "center"; + center_hud.vertalign = "middle"; + center_hud.alignx = "center"; + center_hud.aligny = "middle"; + center_hud.foreground = 1; + center_hud.fontscale = 1.1; + center_hud.sort = 21; + center_hud.alpha = 1; + center_hud.color = ( 1, 0, 0 ); + center_hud.y = p * 25; + new_array[p] = center_hud; + } + + level.cfx_center_text = new_array; } center_text_add( text ) { - if ( isDefined( text ) && isDefined( level.cfx_center_text ) ) - { - level.cfx_center_text[ level.cfx_center_text_index ] settext( text ); - level.cfx_center_text_index++; - if ( level.cfx_center_text_index >= level.cfx_center_text_max ) - { - level.cfx_center_text_index = level.cfx_center_text_max - 1; - } - } + if ( isdefined( text ) && isdefined( level.cfx_center_text ) ) + { + level.cfx_center_text[level.cfx_center_text_index] settext( text ); + level.cfx_center_text_index++; + + if ( level.cfx_center_text_index >= level.cfx_center_text_max ) + level.cfx_center_text_index = level.cfx_center_text_max - 1; + } } center_text_clear() { - p = 0; - while ( p < level.cfx_center_text_max ) - { - level.cfx_center_text[ p ] settext( " " ); - p++; - } - level.cfx_center_text_index = 0; + for ( p = 0; p < level.cfx_center_text_max; p++ ) + level.cfx_center_text[p] settext( " " ); + + level.cfx_center_text_index = 0; } write_error_msg( filename ) { - level notify( "write_error" ); - level endon( "write_error" ); - while ( isDefined( filename ) ) - { - center_text_clear(); - center_text_add( "File " + filename + " is not writeable." ); - center_text_add( "If it's checked out, restart your computer!" ); - center_text_add( "Hold the A Button to dismiss." ); - for ( ;; ) - { - player = get_players()[ 0 ]; - if ( player buttonpressed( "BUTTON_A" ) ) - { - center_text_clear(); - level.write_error = ""; - return; - } - else - { - wait 0,25; - } - } - } + level notify( "write_error" ); + level endon( "write_error" ); + + if ( isdefined( filename ) ) + { + center_text_clear(); + center_text_add( "File " + filename + " is not writeable." ); + center_text_add( "If it's checked out, restart your computer!" ); + center_text_add( "Hold the A Button to dismiss." ); + + for (;;) + { + player = get_players()[0]; + + if ( player buttonpressed( "BUTTON_A" ) ) + { + center_text_clear(); + level.write_error = ""; + break; + } + + wait 0.25; + } + } } select_last_entity( skip_undo ) { - select_entity( level.createfxent.size - 1, level.createfxent[ level.createfxent.size - 1 ], skip_undo ); + select_entity( level.createfxent.size - 1, level.createfxent[level.createfxent.size - 1], skip_undo ); } post_entity_creation_function() { - self.textalpha = 0; - self.drawn = 1; + self.textalpha = 0; + self.drawn = 1; } copy_ents() { - if ( level.selected_fx_ents.size <= 0 ) - { - return; - } - array = []; - i = 0; - while ( i < level.selected_fx_ents.size ) - { - ent = level.selected_fx_ents[ i ]; - newent = spawnstruct(); - newent.v = ent.v; - newent post_entity_creation_function(); - array[ array.size ] = newent; - i++; - } - level.stored_ents = array; + if ( level.selected_fx_ents.size <= 0 ) + return; + + array = []; + + for ( i = 0; i < level.selected_fx_ents.size; i++ ) + { + ent = level.selected_fx_ents[i]; + newent = spawnstruct(); + newent.v = ent.v; + newent post_entity_creation_function(); + array[array.size] = newent; + } + + level.stored_ents = array; } paste_ents() { - delay_min = getDvarInt( "createfx_oneshot_min_delay" ); - delay_max = getDvarInt( "createfx_oneshot_max_delay" ); - if ( delay_min > delay_max ) - { - temp = delay_min; - delay_min = delay_max; - delay_max = temp; - } - if ( !isDefined( level.stored_ents ) ) - { - return; - } - clear_entity_selection(); - if ( level.cfx_last_action != "none" ) - { - store_undo_state( "edit", level.selected_fx_ents ); - } - level.cfx_last_action = "none"; - i = 0; - while ( i < level.stored_ents.size ) - { - level.stored_ents[ i ].uniqueid = level.cfx_uniqueid; - level.cfx_uniqueid++; - if ( level.stored_ents[ i ].v[ "type" ] == "oneshotfx" ) - { - level.stored_ents[ i ].v[ "delay" ] = randomintrange( delay_min, delay_max ); - } - add_and_select_entity( level.stored_ents[ i ], "skip_undo" ); - i++; - } - move_selection_to_cursor( "skip_undo" ); - update_selected_entities(); - store_undo_state( "add", level.stored_ents ); - level.stored_ents = []; - copy_ents(); + delay_min = getdvarint( "createfx_oneshot_min_delay" ); + delay_max = getdvarint( "createfx_oneshot_max_delay" ); + + if ( delay_min > delay_max ) + { + temp = delay_min; + delay_min = delay_max; + delay_max = temp; + } + + if ( !isdefined( level.stored_ents ) ) + return; + + clear_entity_selection(); + + if ( level.cfx_last_action != "none" ) + store_undo_state( "edit", level.selected_fx_ents ); + + level.cfx_last_action = "none"; + + for ( i = 0; i < level.stored_ents.size; i++ ) + { + level.stored_ents[i].uniqueid = level.cfx_uniqueid; + level.cfx_uniqueid++; + + if ( level.stored_ents[i].v["type"] == "oneshotfx" ) + level.stored_ents[i].v["delay"] = randomintrange( delay_min, delay_max ); + + add_and_select_entity( level.stored_ents[i], "skip_undo" ); + } + + move_selection_to_cursor( "skip_undo" ); + update_selected_entities(); + store_undo_state( "add", level.stored_ents ); + level.stored_ents = []; + copy_ents(); } paste_ents_onto_ents() { - if ( !isDefined( level.stored_ents ) || !isDefined( level.selected_fx_ents ) ) - { - return; - } - if ( level.stored_ents.size < 1 || level.selected_fx_ents.size < 1 ) - { - return; - } - if ( level.stored_ents.size != level.selected_fx_ents.size ) - { + if ( !isdefined( level.stored_ents ) || !isdefined( level.selected_fx_ents ) ) + return; + + if ( level.stored_ents.size < 1 || level.selected_fx_ents.size < 1 ) + return; + + if ( level.stored_ents.size != level.selected_fx_ents.size ) + { /# - println( "^2CreateFX: Number of source ents must match the number of destination ents for Paste Into to work." ); + println( "^2CreateFX: Number of source ents must match the number of destination ents for Paste Into to work." ); #/ - return; - } - if ( level.cfx_last_action != "none" ) - { - store_undo_state( "edit", level.selected_fx_ents ); - } - level.cfx_last_action = "none"; - selected_ents_temp = level.selected_fx_ents; - i = 0; - while ( i < level.stored_ents.size ) - { - source_ent = level.stored_ents[ i ]; - target_ent = level.selected_fx_ents[ i ]; - source_ent.uniqueid = level.cfx_uniqueid; - level.cfx_uniqueid++; - source_ent.v[ "angles" ] = target_ent.v[ "angles" ]; - source_ent.v[ "origin" ] = target_ent.v[ "origin" ]; - add_and_select_entity( source_ent, "skip_undo" ); - i++; - } - i = 0; - while ( i < selected_ents_temp.size ) - { - deselect_entity( selected_ents_temp[ i ].last_fx_index, selected_ents_temp[ i ] ); - i++; - } - update_selected_entities(); - store_undo_state( "add", level.stored_ents ); - level.stored_ents = []; - copy_ents(); + return; + } + + if ( level.cfx_last_action != "none" ) + store_undo_state( "edit", level.selected_fx_ents ); + + level.cfx_last_action = "none"; + selected_ents_temp = level.selected_fx_ents; + + for ( i = 0; i < level.stored_ents.size; i++ ) + { + source_ent = level.stored_ents[i]; + target_ent = level.selected_fx_ents[i]; + source_ent.uniqueid = level.cfx_uniqueid; + level.cfx_uniqueid++; + source_ent.v["angles"] = target_ent.v["angles"]; + source_ent.v["origin"] = target_ent.v["origin"]; + add_and_select_entity( source_ent, "skip_undo" ); + } + + for ( i = 0; i < selected_ents_temp.size; i++ ) + deselect_entity( selected_ents_temp[i].last_fx_index, selected_ents_temp[i] ); + + update_selected_entities(); + store_undo_state( "add", level.stored_ents ); + level.stored_ents = []; + copy_ents(); } add_and_select_entity( ent, skip_undo ) { - level.createfxent[ level.createfxent.size ] = ent; - select_last_entity( skip_undo ); + level.createfxent[level.createfxent.size] = ent; + select_last_entity( skip_undo ); } stop_fx_looper() { - if ( isDefined( self.looper ) ) - { - self.looper delete(); - } - self [[ level.cfx_func_stop_loopsound ]](); + if ( isdefined( self.looper ) ) + self.looper delete(); + + self [[ level.cfx_func_stop_loopsound ]](); } restart_fx_looper() { - stop_fx_looper(); - self set_forward_and_up_vectors(); - if ( self.v[ "type" ] == "loopfx" ) - { - self [[ level.cfx_func_create_looper ]](); - } - if ( self.v[ "type" ] == "oneshotfx" ) - { - self [[ level.cfx_func_create_triggerfx ]](); - } - if ( self.v[ "type" ] == "soundfx" ) - { - self [[ level.cfx_func_create_loopsound ]](); - } + stop_fx_looper(); + self set_forward_and_up_vectors(); + + if ( self.v["type"] == "loopfx" ) + self [[ level.cfx_func_create_looper ]](); + + if ( self.v["type"] == "oneshotfx" ) + self [[ level.cfx_func_create_triggerfx ]](); + + if ( self.v["type"] == "soundfx" ) + self [[ level.cfx_func_create_loopsound ]](); } update_selected_entities() { - i = 0; - while ( i < level.selected_fx_ents.size ) - { - ent = level.selected_fx_ents[ i ]; - ent restart_fx_looper(); - i++; - } + for ( i = 0; i < level.selected_fx_ents.size; i++ ) + { + ent = level.selected_fx_ents[i]; + ent restart_fx_looper(); + } } copy_angles_of_selected_ents() { - level notify( "new_ent_selection" ); - if ( level.cfx_last_action != "copy_angles" ) - { - store_undo_state( "edit", level.selected_fx_ents ); - level.cfx_last_action = "copy_angles"; - } - i = 0; - while ( i < level.selected_fx_ents.size ) - { - ent = level.selected_fx_ents[ i ]; - ent.v[ "angles" ] = level.selected_fx_ents[ level.selected_fx_ents.size - 1 ].v[ "angles" ]; - ent set_forward_and_up_vectors(); - i++; - } - update_selected_entities(); + level notify( "new_ent_selection" ); + + if ( level.cfx_last_action != "copy_angles" ) + { + store_undo_state( "edit", level.selected_fx_ents ); + level.cfx_last_action = "copy_angles"; + } + + for ( i = 0; i < level.selected_fx_ents.size; i++ ) + { + ent = level.selected_fx_ents[i]; + ent.v["angles"] = level.selected_fx_ents[level.selected_fx_ents.size - 1].v["angles"]; + ent set_forward_and_up_vectors(); + } + + update_selected_entities(); } reset_axis_of_selected_ents() { - level notify( "new_ent_selection" ); - if ( level.cfx_last_action != "reset_axis" ) - { - store_undo_state( "edit", level.selected_fx_ents ); - level.cfx_last_action = "reset_axis"; - } - i = 0; - while ( i < level.selected_fx_ents.size ) - { - ent = level.selected_fx_ents[ i ]; - ent.v[ "angles" ] = ( 1, 1, 1 ); - ent set_forward_and_up_vectors(); - i++; - } - update_selected_entities(); + level notify( "new_ent_selection" ); + + if ( level.cfx_last_action != "reset_axis" ) + { + store_undo_state( "edit", level.selected_fx_ents ); + level.cfx_last_action = "reset_axis"; + } + + for ( i = 0; i < level.selected_fx_ents.size; i++ ) + { + ent = level.selected_fx_ents[i]; + ent.v["angles"] = ( 0, 0, 0 ); + ent set_forward_and_up_vectors(); + } + + update_selected_entities(); } last_selected_entity_has_changed( lastselectentity ) { - if ( isDefined( lastselectentity ) ) - { - if ( !entities_are_selected() ) - { - return 1; - } - } - else - { - return entities_are_selected(); - } - return lastselectentity != level.selected_fx_ents[ level.selected_fx_ents.size - 1 ]; + if ( isdefined( lastselectentity ) ) + { + if ( !entities_are_selected() ) + return 1; + } + else + return entities_are_selected(); + + return lastselectentity != level.selected_fx_ents[level.selected_fx_ents.size - 1]; } createfx_showorigin( id, org, delay, org2, type, exploder, id2, firefx, firefxdelay, firefxsound, fxsound, fxquake, fxdamage, soundalias, repeat, delay_min, delay_max, damage_radius, firefxtimeout ) { + } drop_selection_to_ground() { - if ( level.cfx_last_action != "drop_to_ground" ) - { - store_undo_state( "edit", level.selected_fx_ents ); - level.cfx_last_action = "drop_to_ground"; - } - i = 0; - while ( i < level.selected_fx_ents.size ) - { - ent = level.selected_fx_ents[ i ]; - trace = bullettrace( ent.v[ "origin" ], ent.v[ "origin" ] + vectorScale( ( 1, 1, 1 ), 2048 ), 0, undefined ); - ent.v[ "origin" ] = trace[ "position" ]; - i++; - } + if ( level.cfx_last_action != "drop_to_ground" ) + { + store_undo_state( "edit", level.selected_fx_ents ); + level.cfx_last_action = "drop_to_ground"; + } + + for ( i = 0; i < level.selected_fx_ents.size; i++ ) + { + ent = level.selected_fx_ents[i]; + trace = bullettrace( ent.v["origin"], ent.v["origin"] + vectorscale( ( 0, 0, -1 ), 2048.0 ), 0, undefined ); + ent.v["origin"] = trace["position"]; + } } set_off_exploders() { - level notify( "createfx_exploder_reset" ); - exploders = []; - i = 0; - while ( i < level.selected_fx_ents.size ) - { - ent = level.selected_fx_ents[ i ]; - if ( isDefined( ent.v[ "exploder" ] ) ) - { - exploders[ ent.v[ "exploder" ] ] = 1; - } - i++; - } - keys = getarraykeys( exploders ); - i = 0; - while ( i < keys.size ) - { - exploder( keys[ i ] ); - i++; - } + level notify( "createfx_exploder_reset" ); + exploders = []; + + for ( i = 0; i < level.selected_fx_ents.size; i++ ) + { + ent = level.selected_fx_ents[i]; + + if ( isdefined( ent.v["exploder"] ) ) + exploders[ent.v["exploder"]] = 1; + } + + keys = getarraykeys( exploders ); + + for ( i = 0; i < keys.size; i++ ) + exploder( keys[i] ); } turn_off_exploders() { - level notify( "createfx_exploder_reset" ); - exploders = []; - i = 0; - while ( i < level.selected_fx_ents.size ) - { - ent = level.selected_fx_ents[ i ]; - if ( isDefined( ent.v[ "exploder" ] ) ) - { - exploders[ ent.v[ "exploder" ] ] = 1; - } - i++; - } - keys = getarraykeys( exploders ); - i = 0; - while ( i < keys.size ) - { - stop_exploder( keys[ i ] ); - i++; - } + level notify( "createfx_exploder_reset" ); + exploders = []; + + for ( i = 0; i < level.selected_fx_ents.size; i++ ) + { + ent = level.selected_fx_ents[i]; + + if ( isdefined( ent.v["exploder"] ) ) + exploders[ent.v["exploder"]] = 1; + } + + keys = getarraykeys( exploders ); + + for ( i = 0; i < keys.size; i++ ) + stop_exploder( keys[i] ); } draw_distance() { - count = 0; - last_pos = ( 1, 1, 1 ); - if ( getDvarInt( "createfx_drawdist" ) == 0 ) - { - setdvar( "createfx_drawdist", "1500" ); - } - player = get_players()[ 0 ]; - for ( ;; ) - { - maxdist = getDvarInt( "createfx_drawdist" ); - maxdistsqr = maxdist * maxdist; + count = 0; + last_pos = ( 0, 0, 0 ); + + if ( getdvarint( "createfx_drawdist" ) == 0 ) + setdvar( "createfx_drawdist", "1500" ); + + player = get_players()[0]; + + for (;;) + { + maxdist = getdvarint( "createfx_drawdist" ); + maxdistsqr = maxdist * maxdist; /# - if ( flag( "createfx_saving" ) ) - { - println( "Waiting for createfx to save..." ); + if ( flag( "createfx_saving" ) ) + println( "Waiting for createfx to save..." ); #/ - } - flag_waitopen( "createfx_saving" ); - i = 0; - while ( i < level.createfxent.size ) - { - ent = level.createfxent[ i ]; - if ( ent_is_selected( ent ) ) - { - ent.drawn = 1; - count++; - continue; - } - else - { - ent.drawn = distancesquared( player.origin, ent.v[ "origin" ] ) <= maxdistsqr; - } - count++; - if ( count > 50 ) - { - count = 0; - wait 0,05; - } - i++; - } - wait 0,1; - while ( distancesquared( player.origin, last_pos ) < 2500 ) - { - wait 0,1; - } - last_pos = player.origin; - } + flag_waitopen( "createfx_saving" ); + + for ( i = 0; i < level.createfxent.size; i++ ) + { + ent = level.createfxent[i]; + + if ( ent_is_selected( ent ) ) + ent.drawn = 1; + else + ent.drawn = distancesquared( player.origin, ent.v["origin"] ) <= maxdistsqr; + + count++; + + if ( count > 50 ) + { + count = 0; + wait 0.05; + } + } + + wait 0.1; + + while ( distancesquared( player.origin, last_pos ) < 2500 ) + wait 0.1; + + last_pos = player.origin; + } } createfx_save( autosave ) { - flag_waitopen( "createfx_saving" ); - flag_set( "createfx_saving" ); - resettimeout(); - if ( isDefined( autosave ) ) - { - savemode = "AUTOSAVE"; - } - else - { - savemode = "USER SAVE"; - } - type = "server"; - old_time = getTime(); + flag_waitopen( "createfx_saving" ); + flag_set( "createfx_saving" ); + resettimeout(); + + if ( isdefined( autosave ) ) + savemode = "AUTOSAVE"; + else + savemode = "USER SAVE"; + + type = "server"; + old_time = gettime(); /# - println( "\n^3#### CREATEFX SERVER " + savemode + " BEGIN ####" ); + println( "\n^3#### CREATEFX SERVER " + savemode + " BEGIN ####" ); #/ - file_error = generate_fx_log( type, autosave ); + file_error = generate_fx_log( type, autosave ); /# - println( ( "^3#### CREATEFX SERVER " + savemode + " END (Time: " ) + ( ( getTime() - old_time ) * 0,001 ) + " seconds)####" ); + println( "^3#### CREATEFX SERVER " + savemode + " END (Time: " + ( gettime() - old_time ) * 0.001 + " seconds)####" ); #/ - if ( file_error ) - { + if ( file_error ) + { /# - println( "^3#### CREATEFX " + savemode + " CANCELLED ####" ); + println( "^3#### CREATEFX " + savemode + " CANCELLED ####" ); #/ - createfx_emergency_backup(); - } - else - { - if ( level.clientscripts && !isDefined( autosave ) ) - { - old_time = getTime(); + createfx_emergency_backup(); + } + else + { + if ( level.clientscripts && !isdefined( autosave ) ) + { + old_time = gettime(); /# - println( "\n^3#### CREATEFX CLIENT " + savemode + " BEGIN ####" ); + println( "\n^3#### CREATEFX CLIENT " + savemode + " BEGIN ####" ); #/ - file_error = generate_fx_log( "client" ); + file_error = generate_fx_log( "client" ); /# - println( ( "^3#### CREATEFX CLIENT " + savemode + " END (Time: " ) + ( ( getTime() - old_time ) * 0,001 ) + " seconds)####" ); + println( "^3#### CREATEFX CLIENT " + savemode + " END (Time: " + ( gettime() - old_time ) * 0.001 + " seconds)####" ); #/ - if ( file_error ) - { + if ( file_error ) + { /# - iprintln( "CreateFX clientscript file is not writeable! Aborting save." ); + iprintln( "CreateFX clientscript file is not writeable! Aborting save." ); #/ /# - println( "^3#### CREATEFX " + savemode + " CANCELLED ####" ); + println( "^3#### CREATEFX " + savemode + " CANCELLED ####" ); #/ - return; - } - } - flag_clear( "createfx_saving" ); - } + return; + } + } + + flag_clear( "createfx_saving" ); + } } createfx_autosave() { - for ( ;; ) - { - wait_time = getDvarInt( "createfx_autosave_time" ); - if ( wait_time < 120 || isstring( wait_time ) ) - { - wait_time = 120; - } - wait wait_time; - if ( !flag( "createfx_saving" ) ) - { - createfx_save( 1 ); - } - } + for (;;) + { + wait_time = getdvarint( "createfx_autosave_time" ); + + if ( wait_time < 120 || isstring( wait_time ) ) + wait_time = 120; + + wait( wait_time ); + + if ( !flag( "createfx_saving" ) ) + createfx_save( 1 ); + } } createfx_emergency_backup() { /# - println( "^5#### CREATEFX EMERGENCY BACKUP BEGIN ####" ); + println( "^5#### CREATEFX EMERGENCY BACKUP BEGIN ####" ); #/ - file_error = generate_fx_log( "server", 1 ); - if ( file_error ) - { + file_error = generate_fx_log( "server", 1 ); + + if ( file_error ) + { /# - iprintln( "Error saving to backup.gsc. All is lost!" ); + iprintln( "Error saving to backup.gsc. All is lost!" ); #/ - } - else - { + } + else + { /# - println( "^5#### CREATEFX EMERGENCY BACKUP END ####" ); + println( "^5#### CREATEFX EMERGENCY BACKUP END ####" ); #/ - } - flag_clear( "createfx_saving" ); + } + + flag_clear( "createfx_saving" ); } move_player_around_map_fast() { - player = get_players()[ 0 ]; - direction = player getplayerangles(); - direction_vec = anglesToForward( direction ); - eye = player geteye(); - trace = bullettrace( eye, eye + vectorScale( direction_vec, 20000 ), 0, undefined ); - dist = distance( eye, trace[ "position" ] ); - position = eye + vectorScale( direction_vec, dist - 64 ); - player setorigin( position ); + player = get_players()[0]; + direction = player getplayerangles(); + direction_vec = anglestoforward( direction ); + eye = player geteye(); + trace = bullettrace( eye, eye + vectorscale( direction_vec, 20000 ), 0, undefined ); + dist = distance( eye, trace["position"] ); + position = eye + vectorscale( direction_vec, dist - 64 ); + player setorigin( position ); } move_player_to_next_same_effect( forward_search, lastselectentity ) { - player = get_players()[ 0 ]; - direction = player getplayerangles(); - direction_vec = anglesToForward( direction ); - if ( !isDefined( forward_search ) ) - { - forward_search = 1; - } - ent = level.selected_fx_ents[ level.selected_fx_ents.size - 1 ]; - start_index = 0; - if ( level.selected_fx_ents.size <= 0 ) - { - if ( forward_search ) - { - ent = level.cfx_next_ent; - } - else - { - ent = level.cfx_previous_ent; - } - if ( isDefined( ent ) ) - { - index = get_ent_index( ent ); - if ( index >= 0 ) - { - select_entity( index, ent ); - position = ent.v[ "origin" ] - vectorScale( direction_vec, 175 ); - player setorigin( position ); - level.cfx_previous_ent = ent; - level.cfx_next_ent = get_next_ent_with_same_id( index, ent.v[ "fxid" ] ); - } - else if ( forward_search ) - { - level.cfx_next_ent = undefined; - } - else - { - level.cfx_previous_ent = undefined; - } - } - return; - } - if ( level.selected_fx_ents.size == 1 ) - { - i = 0; - while ( i < level.createfxent.size ) - { - if ( isDefined( level.selected_fx[ i ] ) ) - { - start_index = i; - deselect_entity( i, ent ); - break; - } - else - { - i++; - } - } - if ( forward_search ) - { - level.cfx_previous_ent = ent; - ent = get_next_ent_with_same_id( i, ent.v[ "fxid" ] ); - select_entity( level.ent_found_index, ent ); - position = ent.v[ "origin" ] - vectorScale( direction_vec, 175 ); - player setorigin( position ); - level.cfx_next_ent = get_next_ent_with_same_id( level.ent_found_index, ent.v[ "fxid" ] ); - return; - } - else - { - level.cfx_next_ent = ent; - ent = get_previous_ent_with_same_id( i, ent.v[ "fxid" ] ); - select_entity( level.ent_found_index, ent ); - position = ent.v[ "origin" ] - vectorScale( direction_vec, 175 ); - player setorigin( position ); - level.cfx_previous_ent = get_previous_ent_with_same_id( level.ent_found_index, ent.v[ "fxid" ] ); - return; - } - } - else - { - if ( isDefined( level.last_ent_moved_to ) && !last_selected_entity_has_changed( lastselectentity ) ) - { - ent = level.last_ent_moved_to; - } - i = 0; - while ( i < level.selected_fx_ents.size ) - { - if ( ent == level.selected_fx_ents[ i ] ) - { - break; - } - else - { - i++; - } - } - if ( forward_search ) - { - if ( i < ( level.selected_fx_ents.size - 1 ) ) - { - i++; - ent = level.selected_fx_ents[ i ]; - } - else - { - ent = level.selected_fx_ents[ 0 ]; - } - } - else if ( i > 0 ) - { - ent = level.selected_fx_ents[ i - 1 ]; - } - else - { - ent = level.selected_fx_ents[ level.selected_fx_ents.size - 1 ]; - } - level.last_ent_moved_to = ent; - position = ent.v[ "origin" ] - vectorScale( direction_vec, 175 ); - player setorigin( position ); - } + player = get_players()[0]; + direction = player getplayerangles(); + direction_vec = anglestoforward( direction ); + + if ( !isdefined( forward_search ) ) + forward_search = 1; + + ent = level.selected_fx_ents[level.selected_fx_ents.size - 1]; + start_index = 0; + + if ( level.selected_fx_ents.size <= 0 ) + { + if ( forward_search ) + ent = level.cfx_next_ent; + else + ent = level.cfx_previous_ent; + + if ( isdefined( ent ) ) + { + index = get_ent_index( ent ); + + if ( index >= 0 ) + { + select_entity( index, ent ); + position = ent.v["origin"] - vectorscale( direction_vec, 175 ); + player setorigin( position ); + level.cfx_previous_ent = ent; + level.cfx_next_ent = get_next_ent_with_same_id( index, ent.v["fxid"] ); + } + else if ( forward_search ) + level.cfx_next_ent = undefined; + else + level.cfx_previous_ent = undefined; + } + + return; + } + + if ( level.selected_fx_ents.size == 1 ) + { + for ( i = 0; i < level.createfxent.size; i++ ) + { + if ( isdefined( level.selected_fx[i] ) ) + { + start_index = i; + deselect_entity( i, ent ); + break; + } + } + + if ( forward_search ) + { + level.cfx_previous_ent = ent; + ent = get_next_ent_with_same_id( i, ent.v["fxid"] ); + select_entity( level.ent_found_index, ent ); + position = ent.v["origin"] - vectorscale( direction_vec, 175 ); + player setorigin( position ); + level.cfx_next_ent = get_next_ent_with_same_id( level.ent_found_index, ent.v["fxid"] ); + return; + } + else + { + level.cfx_next_ent = ent; + ent = get_previous_ent_with_same_id( i, ent.v["fxid"] ); + select_entity( level.ent_found_index, ent ); + position = ent.v["origin"] - vectorscale( direction_vec, 175 ); + player setorigin( position ); + level.cfx_previous_ent = get_previous_ent_with_same_id( level.ent_found_index, ent.v["fxid"] ); + return; + } + } + else + { + if ( isdefined( level.last_ent_moved_to ) && !last_selected_entity_has_changed( lastselectentity ) ) + ent = level.last_ent_moved_to; + + for ( i = 0; i < level.selected_fx_ents.size; i++ ) + { + if ( ent == level.selected_fx_ents[i] ) + break; + } + + if ( forward_search ) + { + if ( i < level.selected_fx_ents.size - 1 ) + { + i++; + ent = level.selected_fx_ents[i]; + } + else + ent = level.selected_fx_ents[0]; + } + else if ( i > 0 ) + ent = level.selected_fx_ents[i - 1]; + else + ent = level.selected_fx_ents[level.selected_fx_ents.size - 1]; + + level.last_ent_moved_to = ent; + position = ent.v["origin"] - vectorscale( direction_vec, 175 ); + player setorigin( position ); + } } get_next_ent_with_same_id( index, ent_id ) { - i = index + 1; - while ( i < level.createfxent.size ) - { - if ( ent_id == level.createfxent[ i ].v[ "fxid" ] ) - { - level.ent_found_index = i; - return level.createfxent[ i ]; - } - i++; - } - i = 0; - while ( i < index ) - { - if ( ent_id == level.createfxent[ i ].v[ "fxid" ] ) - { - level.ent_found_index = i; - return level.createfxent[ i ]; - } - i++; - } - level.ent_found_index = index; - return level.createfxent[ index ]; + for ( i = index + 1; i < level.createfxent.size; i++ ) + { + if ( ent_id == level.createfxent[i].v["fxid"] ) + { + level.ent_found_index = i; + return level.createfxent[i]; + } + } + + for ( i = 0; i < index; i++ ) + { + if ( ent_id == level.createfxent[i].v["fxid"] ) + { + level.ent_found_index = i; + return level.createfxent[i]; + } + } + + level.ent_found_index = index; + return level.createfxent[index]; } get_previous_ent_with_same_id( index, ent_id ) { - i = index - 1; - while ( i > 0 ) - { - if ( ent_id == level.createfxent[ i ].v[ "fxid" ] ) - { - level.ent_found_index = i; - return level.createfxent[ i ]; - } - i--; + for ( i = index - 1; i > 0; i-- ) + { + if ( ent_id == level.createfxent[i].v["fxid"] ) + { + level.ent_found_index = i; + return level.createfxent[i]; + } + } - } - i = level.createfxent.size - 1; - while ( i > index ) - { - if ( ent_id == level.createfxent[ i ].v[ "fxid" ] ) - { - level.ent_found_index = i; - return level.createfxent[ i ]; - } - i--; + for ( i = level.createfxent.size - 1; i > index; i-- ) + { + if ( ent_id == level.createfxent[i].v["fxid"] ) + { + level.ent_found_index = i; + return level.createfxent[i]; + } + } - } - level.ent_found_index = index; - return level.createfxent[ index ]; + level.ent_found_index = index; + return level.createfxent[index]; } get_ent_index( ent ) { - i = 0; - while ( i < level.createfxent.size ) - { - if ( ent == level.createfxent[ i ] ) - { - return i; - } - i++; - } - return -1; + for ( i = 0; i < level.createfxent.size; i++ ) + { + if ( ent == level.createfxent[i] ) + return i; + } + + return -1; } select_ents_by_property( property, add_to_selection ) { - ent = level.selected_fx_ents[ level.selected_fx_ents.size - 1 ]; - prop_to_match = ent.v[ property ]; - if ( !isDefined( add_to_selection ) ) - { - clear_entity_selection(); - } - i = 0; - while ( i < level.createfxent.size ) - { - if ( isDefined( level.createfxent[ i ].v[ property ] ) ) - { - if ( level.createfxent[ i ].v[ property ] == prop_to_match ) - { - select_entity( i, level.createfxent[ i ] ); - } - } - i++; - } + ent = level.selected_fx_ents[level.selected_fx_ents.size - 1]; + prop_to_match = ent.v[property]; + + if ( !isdefined( add_to_selection ) ) + clear_entity_selection(); + + for ( i = 0; i < level.createfxent.size; i++ ) + { + if ( isdefined( level.createfxent[i].v[property] ) ) + { + if ( level.createfxent[i].v[property] == prop_to_match ) + select_entity( i, level.createfxent[i] ); + } + } } print_ambient_fx_inventory() { /# - fx_list = get_level_ambient_fx(); - ent_list = []; - fx_list_count = []; - println( "\n\n^2INVENTORY OF AMBIENT EFFECTS: " ); - i = 0; - while ( i < level.createfxent.size ) - { - ent_list[ i ] = level.createfxent[ i ].v[ "fxid" ]; - i++; - } - i = 0; - while ( i < fx_list.size ) - { - count = 0; - j = 0; - while ( j < ent_list.size ) - { - if ( fx_list[ i ] == ent_list[ j ] ) - { - count++; - ent_list[ j ] = ""; - } - j++; - } - fx_list_count[ i ] = count; - i++; - } - i = 0; - while ( i < ( fx_list_count.size - 1 ) ) - { - j = i + 1; - while ( j < fx_list_count.size ) - { - if ( fx_list_count[ j ] < fx_list_count[ i ] ) - { - temp_count = fx_list_count[ i ]; - temp_id = fx_list[ i ]; - fx_list_count[ i ] = fx_list_count[ j ]; - fx_list[ i ] = fx_list[ j ]; - fx_list_count[ j ] = temp_count; - fx_list[ j ] = temp_id; - } - j++; - } - i++; - } - i = 0; - while ( i < fx_list_count.size ) - { - switch( fx_list_count[ i ] ) - { - case 0: - print( "^1" ); - break; - case 1: - print( "^3" ); - break; - default: - } - print( fx_list_count[ i ] + "\t" + fx_list[ i ] + "\n" ); - i++; - } - print( "\n" ); + fx_list = get_level_ambient_fx(); + ent_list = []; + fx_list_count = []; + println( "\n\n^2INVENTORY OF AMBIENT EFFECTS: " ); + + for ( i = 0; i < level.createfxent.size; i++ ) + ent_list[i] = level.createfxent[i].v["fxid"]; + + for ( i = 0; i < fx_list.size; i++ ) + { + count = 0; + + for ( j = 0; j < ent_list.size; j++ ) + { + if ( fx_list[i] == ent_list[j] ) + { + count++; + ent_list[j] = ""; + } + } + + fx_list_count[i] = count; + } + + for ( i = 0; i < fx_list_count.size - 1; i++ ) + { + for ( j = i + 1; j < fx_list_count.size; j++ ) + { + if ( fx_list_count[j] < fx_list_count[i] ) + { + temp_count = fx_list_count[i]; + temp_id = fx_list[i]; + fx_list_count[i] = fx_list_count[j]; + fx_list[i] = fx_list[j]; + fx_list_count[j] = temp_count; + fx_list[j] = temp_id; + } + } + } + + for ( i = 0; i < fx_list_count.size; i++ ) + { + switch ( fx_list_count[i] ) + { + case "0": + print( "^1" ); + break; + case "1": + print( "^3" ); + break; + default: + break; + } + + print( fx_list_count[i] + "\t" + fx_list[i] + "\n" ); + } + + print( "\n" ); #/ - } } vector_changed( old, new ) { - if ( distancesquared( old, new ) >= 1 ) - { - return 1; - } - return 0; + if ( distancesquared( old, new ) >= 1 ) + return true; + + return false; } dot_changed( old, new ) { - dot = vectordot( old, new ); - if ( dot < 1 ) - { - return 1; - } - return 0; + dot = vectordot( old, new ); + + if ( dot < 1 ) + return true; + + return false; } damage_void( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, timeoffset, boneindex ) { + } handle_camera() { /# - level notify( "new_camera" ); - level endon( "new_camera" ); - movement = ( 1, 1, 1 ); - if ( !isDefined( level.camera ) ) - { - level.camera = spawn( "script_origin", ( 1, 1, 1 ) ); - level.camera setmodel( "tag_origin" ); - } - players = get_players(); - players[ 0 ] playerlinktodelta( level.camera, "tag_origin", 1, 0, 0, 0, 0, 1 ); - players[ 0 ] disableweapons(); - level.camera_snapto = 1; - level.stick_camera = 1; - level.camera_prev_snapto = 0; - level.cameravec = ( 90, 150, 20 ); - model = undefined; - n_y_vector = 0; - n_x_vector = 0; - zoom_level = 300; - b_changes_x = 0; - b_changes_z = 0; - b_changes_y = 0; - test_string = ""; - for ( ;; ) - { - while ( 1 ) - { - if ( level.camera_snapto > 0 ) - { - if ( level.stick_camera ) - { - originoffset = vectorScale( level.cameravec, -1 ); - temp_offset = originoffset + vectorScale( ( 1, 1, 1 ), 60 ); - anglesoffset = vectorToAngle( temp_offset ); - if ( level.camera_prev_snapto == level.camera_snapto ) - { - players = get_players(); - newmovement = players[ 0 ] getnormalizedmovement(); - dolly_movement = players[ 0 ] getnormalizedcameramovement(); - if ( button_is_held( "BUTTON_LTRIG" ) || button_is_held( "BUTTON_RTRIG" ) ) - { - } - else - { - if ( newmovement[ 1 ] <= -0,4 ) - { - n_y_vector += -0,2; - b_changes_y = 1; - } - else if ( newmovement[ 1 ] >= 0,4 ) - { - n_y_vector += 0,2; - b_changes_y = 1; - } - else - { - b_changes_y = 0; - } - if ( newmovement[ 0 ] <= -0,4 ) - { - n_x_vector += -0,4; - b_changes_x = 1; - } - else if ( newmovement[ 0 ] >= 0,4 ) - { - n_x_vector += 0,4; - b_changes_x = 1; - } - else - { - b_changes_x = 0; - } - if ( dolly_movement[ 0 ] <= -0,4 ) - { - zoom_level += 30; - b_changes_z = 1; - } - else if ( dolly_movement[ 0 ] >= 0,4 ) - { - zoom_level += -30; - b_changes_z = 1; - } - else - { - b_changes_z = 0; - } - if ( !b_changes_z || b_changes_x && b_changes_y ) - { - newmovement = ( n_x_vector, n_y_vector, newmovement[ 2 ] ); - movement = ( 1, 1, 1 ); - movement = vectorScale( movement, 0,8 ) + vectorScale( newmovement, 1 - 0,8 ); - tilt = max( 0, 10 + ( movement[ 0 ] * 160 ) ); - level.cameravec = ( cos( movement[ 1 ] * 180 ) * zoom_level, sin( movement[ 1 ] * 180 ) * zoom_level, tilt ); - iprintln( level.cameravec[ 0 ] + " " + level.cameravec[ 1 ] + " " + level.cameravec[ 2 ] ); - } - } - } - else - { - level.camera_prev_snapto = level.camera_snapto; - } - if ( isDefined( level.current_select_ent ) ) - { - originoffset = vectorScale( level.cameravec, -1 ); - temp_offset = originoffset + vectorScale( ( 1, 1, 1 ), 60 ); - anglesoffset = vectorToAngle( temp_offset ); - if ( !isDefined( model ) ) - { - model = spawn( "script_origin", level.current_select_ent.v[ "origin" ] ); - model setmodel( "tag_origin" ); - } - if ( model.origin != level.current_select_ent.v[ "origin" ] ) - { - model.origin = level.current_select_ent.v[ "origin" ]; - } - level.camera linkto( model, "tag_origin", level.cameravec, anglesoffset ); - break; - } - else - { - wait 0,05; - } - } - } - else level.camera unlink(); - } - wait 0,05; + level notify( "new_camera" ); + level endon( "new_camera" ); + movement = ( 0, 0, 0 ); + + if ( !isdefined( level.camera ) ) + { + level.camera = spawn( "script_origin", ( 0, 0, 0 ) ); + level.camera setmodel( "tag_origin" ); + } + + players = get_players(); + players[0] playerlinktodelta( level.camera, "tag_origin", 1, 0, 0, 0, 0, 1 ); + players[0] disableweapons(); + level.camera_snapto = 1; + level.stick_camera = 1; + level.camera_prev_snapto = 0; + level.cameravec = ( 90, 150, 20 ); + model = undefined; + n_y_vector = 0; + n_x_vector = 0; + zoom_level = 300; + b_changes_x = 0; + b_changes_z = 0; + b_changes_y = 0; + test_string = ""; + + while ( true ) + { + if ( level.camera_snapto > 0 ) + { + if ( level.stick_camera ) + { + originoffset = vectorscale( level.cameravec, -1 ); + temp_offset = originoffset + vectorscale( ( 0, 0, -1 ), 60.0 ); + anglesoffset = vectortoangles( temp_offset ); + + if ( level.camera_prev_snapto == level.camera_snapto ) + { + players = get_players(); + newmovement = players[0] getnormalizedmovement(); + dolly_movement = players[0] getnormalizedcameramovement(); + + if ( button_is_held( "BUTTON_LTRIG" ) || button_is_held( "BUTTON_RTRIG" ) ) + { + + } + else + { + if ( newmovement[1] <= -0.4 ) + { + n_y_vector += -0.2; + b_changes_y = 1; + } + else if ( newmovement[1] >= 0.4 ) + { + n_y_vector += 0.2; + b_changes_y = 1; + } + else + b_changes_y = 0; + + if ( newmovement[0] <= -0.4 ) + { + n_x_vector += -0.4; + b_changes_x = 1; + } + else if ( newmovement[0] >= 0.4 ) + { + n_x_vector += 0.4; + b_changes_x = 1; + } + else + b_changes_x = 0; + + if ( dolly_movement[0] <= -0.4 ) + { + zoom_level += 30; + b_changes_z = 1; + } + else if ( dolly_movement[0] >= 0.4 ) + { + zoom_level += -30; + b_changes_z = 1; + } + else + b_changes_z = 0; + + if ( b_changes_z || b_changes_x || b_changes_y ) + { + newmovement = ( n_x_vector, n_y_vector, newmovement[2] ); + movement = ( 0, 0, 0 ); + movement = vectorscale( movement, 0.8 ) + vectorscale( newmovement, 1 - 0.8 ); + tilt = max( 0, 10 + movement[0] * 160 ); + level.cameravec = ( cos( movement[1] * 180 ) * zoom_level, sin( movement[1] * 180 ) * zoom_level, tilt ); + iprintln( level.cameravec[0] + " " + level.cameravec[1] + " " + level.cameravec[2] ); + } + } + } + else + level.camera_prev_snapto = level.camera_snapto; + + if ( isdefined( level.current_select_ent ) ) + { + originoffset = vectorscale( level.cameravec, -1 ); + temp_offset = originoffset + vectorscale( ( 0, 0, -1 ), 60.0 ); + anglesoffset = vectortoangles( temp_offset ); + + if ( !isdefined( model ) ) + { + model = spawn( "script_origin", level.current_select_ent.v["origin"] ); + model setmodel( "tag_origin" ); + } + + if ( model.origin != level.current_select_ent.v["origin"] ) + model.origin = level.current_select_ent.v["origin"]; + + level.camera linkto( model, "tag_origin", level.cameravec, anglesoffset ); + } + else + { + wait 0.05; + continue; + } + } + else + level.camera unlink(); + } + + wait 0.05; + } #/ - } } camera_hud_toggle( text ) { - if ( isDefined( level.camera_hud ) ) - { - level.camera_hud destroy(); - } - level.camera_hud = newdebughudelem(); - level.camera_hud settext( text ); - level.camera_hud.horzalign = "left"; - level.camera_hud.vertalign = "bottom"; - level.camera_hud.alignx = "left"; - level.camera_hud.aligny = "bottom"; - level.camera_hud.foreground = 1; - level.camera_hud.fontscale = 1,1; - level.camera_hud.sort = 21; - level.camera_hud.alpha = 1; - level.camera_hud.color = ( 1, 1, 1 ); + if ( isdefined( level.camera_hud ) ) + level.camera_hud destroy(); + + level.camera_hud = newdebughudelem(); + level.camera_hud settext( text ); + level.camera_hud.horzalign = "left"; + level.camera_hud.vertalign = "bottom"; + level.camera_hud.alignx = "left"; + level.camera_hud.aligny = "bottom"; + level.camera_hud.foreground = 1; + level.camera_hud.fontscale = 1.1; + level.camera_hud.sort = 21; + level.camera_hud.alpha = 1; + level.camera_hud.color = ( 1, 1, 1 ); } init_sp_paths() { + } make_sp_player_invulnerable( player ) { + } delete_arrays_in_sp() { + } used_in_animation( sp ) { + } init_client_sp_variables() { + } init_mp_paths() { - level.cfx_server_scriptdata = "mpcreatefx/"; - level.cfx_client_scriptdata = "mpclientcreatefx/"; - level.cfx_server_loop = "maps\\mp\\_utility::createLoopEffect"; - level.cfx_server_oneshot = "maps\\mp\\_utility::createOneshotEffect"; - level.cfx_server_exploder = "maps\\mp\\_utility::createExploder"; - level.cfx_server_loopsound = "maps\\mp\\_createfx::createLoopSound"; - level.cfx_server_scriptgendump = "maps\\mp\\createfx\\" + level.script + "_fx::main();"; - level.cfx_client_loop = "clientscripts\\mp\\_fx::createLoopEffect"; - level.cfx_client_oneshot = "clientscripts\\mp\\_fx::createOneshotEffect"; - level.cfx_client_exploder = "clientscripts\\mp\\_fx::createExploder"; - level.cfx_client_loopsound = "clientscripts\\mp\\_fx::createLoopSound"; - level.cfx_client_scriptgendump = "clientscripts\\mp\\_createfx\\" + level.script + "_fx::main();"; - level.cfx_func_run_gump_func = ::empty; - level.cfx_func_loopfx = ::maps/mp/_fx::loopfxthread; - level.cfx_func_oneshotfx = ::maps/mp/_fx::oneshotfxthread; - level.cfx_func_soundfx = ::maps/mp/_fx::create_loopsound; - level.cfx_func_script_gen_dump = ::maps/mp/_script_gen::script_gen_dump; - level.cfx_func_stop_loopsound = ::maps/mp/_fx::stop_loopsound; - level.cfx_func_create_looper = ::maps/mp/_fx::create_looper; - level.cfx_func_create_triggerfx = ::maps/mp/_fx::create_triggerfx; - level.cfx_func_create_loopsound = ::maps/mp/_fx::create_loopsound; + level.cfx_server_scriptdata = "mpcreatefx/"; + level.cfx_client_scriptdata = "mpclientcreatefx/"; + level.cfx_server_loop = "maps\mp\_utility::createLoopEffect"; + level.cfx_server_oneshot = "maps\mp\_utility::createOneshotEffect"; + level.cfx_server_exploder = "maps\mp\_utility::createExploder"; + level.cfx_server_loopsound = "maps\mp\_createfx::createLoopSound"; + level.cfx_server_scriptgendump = "maps\mp\createfx\" + level.script + "_fx::main();"; + level.cfx_client_loop = "clientscripts\mp\_fx::createLoopEffect"; + level.cfx_client_oneshot = "clientscripts\mp\_fx::createOneshotEffect"; + level.cfx_client_exploder = "clientscripts\mp\_fx::createExploder"; + level.cfx_client_loopsound = "clientscripts\mp\_fx::createLoopSound"; + level.cfx_client_scriptgendump = "clientscripts\mp\_createfx\" + level.script + "_fx::main();"; + level.cfx_func_run_gump_func = ::empty; + level.cfx_func_loopfx = maps\mp\_fx::loopfxthread; + level.cfx_func_oneshotfx = maps\mp\_fx::oneshotfxthread; + level.cfx_func_soundfx = maps\mp\_fx::create_loopsound; + level.cfx_func_script_gen_dump = maps\mp\_script_gen::script_gen_dump; + level.cfx_func_stop_loopsound = maps\mp\_fx::stop_loopsound; + level.cfx_func_create_looper = maps\mp\_fx::create_looper; + level.cfx_func_create_triggerfx = maps\mp\_fx::create_triggerfx; + level.cfx_func_create_loopsound = maps\mp\_fx::create_loopsound; } callback_playerconnect() { - self waittill( "begin" ); - if ( !isDefined( level.hasspawned ) ) - { - spawnpoints = getentarray( "mp_global_intermission", "classname" ); - if ( !spawnpoints.size ) - { - spawnpoints = getentarray( "info_player_start", "classname" ); - } + self waittill( "begin" ); + + if ( !isdefined( level.hasspawned ) ) + { + spawnpoints = getentarray( "mp_global_intermission", "classname" ); + + if ( !spawnpoints.size ) + spawnpoints = getentarray( "info_player_start", "classname" ); /# - assert( spawnpoints.size ); + assert( spawnpoints.size ); #/ - spawnpoint = spawnpoints[ 0 ]; - self.sessionteam = "none"; - self.sessionstate = "playing"; - if ( !level.teambased ) - { - self.ffateam = "none"; - } - self spawn( spawnpoint.origin, spawnpoint.angles ); - level.player = self; - level.hasspawned = 1; - } - else - { - kick( self.name ); - } + spawnpoint = spawnpoints[0]; + self.sessionteam = "none"; + self.sessionstate = "playing"; + + if ( !level.teambased ) + self.ffateam = "none"; + + self spawn( spawnpoint.origin, spawnpoint.angles ); + level.player = self; + level.hasspawned = 1; + } + else + kick( self.name ); } delete_spawns() { - spawn_classes = []; - spawn_classes[ spawn_classes.size ] = "mp_dm_spawn"; - spawn_classes[ spawn_classes.size ] = "mp_tdm_spawn"; - spawn_classes[ spawn_classes.size ] = "mp_dom_spawn"; - spawn_classes[ spawn_classes.size ] = "mp_dom_spawn_axis_start"; - spawn_classes[ spawn_classes.size ] = "mp_dom_spawn_allies_start"; - spawn_classes[ spawn_classes.size ] = "mp_res_spawn_allies"; - spawn_classes[ spawn_classes.size ] = "mp_res_spawn_axis"; - spawn_classes[ spawn_classes.size ] = "mp_res_spawn_axis_start"; - spawn_classes[ spawn_classes.size ] = "mp_dem_spawn_attacker"; - spawn_classes[ spawn_classes.size ] = "mp_dem_spawn_attacker_a"; - spawn_classes[ spawn_classes.size ] = "mp_dem_spawn_attacker_b"; - spawn_classes[ spawn_classes.size ] = "mp_dem_spawn_attacker_c"; - spawn_classes[ spawn_classes.size ] = "mp_dem_spawn_attacker_start"; - spawn_classes[ spawn_classes.size ] = "mp_dem_spawn_attackerOT_start"; - spawn_classes[ spawn_classes.size ] = "mp_dem_spawn_defender"; - spawn_classes[ spawn_classes.size ] = "mp_dem_spawn_defender_a"; - spawn_classes[ spawn_classes.size ] = "mp_dem_spawn_defender_b"; - spawn_classes[ spawn_classes.size ] = "mp_dem_spawn_defender_c"; - spawn_classes[ spawn_classes.size ] = "mp_dem_spawn_defender_start"; - spawn_classes[ spawn_classes.size ] = "mp_dem_spawn_defenderOT_start"; - _a4256 = spawn_classes; - _k4256 = getFirstArrayKey( _a4256 ); - while ( isDefined( _k4256 ) ) - { - class = _a4256[ _k4256 ]; - spawns = getentarray( class, "classname" ); - _a4260 = spawns; - _k4260 = getFirstArrayKey( _a4260 ); - while ( isDefined( _k4260 ) ) - { - spawn = _a4260[ _k4260 ]; - spawn delete(); - _k4260 = getNextArrayKey( _a4260, _k4260 ); - } - _k4256 = getNextArrayKey( _a4256, _k4256 ); - } + spawn_classes = []; + spawn_classes[spawn_classes.size] = "mp_dm_spawn"; + spawn_classes[spawn_classes.size] = "mp_tdm_spawn"; + spawn_classes[spawn_classes.size] = "mp_dom_spawn"; + spawn_classes[spawn_classes.size] = "mp_dom_spawn_axis_start"; + spawn_classes[spawn_classes.size] = "mp_dom_spawn_allies_start"; + spawn_classes[spawn_classes.size] = "mp_res_spawn_allies"; + spawn_classes[spawn_classes.size] = "mp_res_spawn_axis"; + spawn_classes[spawn_classes.size] = "mp_res_spawn_axis_start"; + spawn_classes[spawn_classes.size] = "mp_dem_spawn_attacker"; + spawn_classes[spawn_classes.size] = "mp_dem_spawn_attacker_a"; + spawn_classes[spawn_classes.size] = "mp_dem_spawn_attacker_b"; + spawn_classes[spawn_classes.size] = "mp_dem_spawn_attacker_c"; + spawn_classes[spawn_classes.size] = "mp_dem_spawn_attacker_start"; + spawn_classes[spawn_classes.size] = "mp_dem_spawn_attackerOT_start"; + spawn_classes[spawn_classes.size] = "mp_dem_spawn_defender"; + spawn_classes[spawn_classes.size] = "mp_dem_spawn_defender_a"; + spawn_classes[spawn_classes.size] = "mp_dem_spawn_defender_b"; + spawn_classes[spawn_classes.size] = "mp_dem_spawn_defender_c"; + spawn_classes[spawn_classes.size] = "mp_dem_spawn_defender_start"; + spawn_classes[spawn_classes.size] = "mp_dem_spawn_defenderOT_start"; + + foreach ( class in spawn_classes ) + { + spawns = getentarray( class, "classname" ); + + foreach ( spawn in spawns ) + spawn delete(); + } } createfxdelay() { - wait 10; - level.createfx_delay_done = 1; + wait 10; + level.createfx_delay_done = 1; } init_client_mp_variables() { - level.cfx_exploder_before = ::maps/mp/_utility::exploder_before_load; - level.cfx_exploder_after = ::maps/mp/_utility::exploder_after_load; + level.cfx_exploder_before = maps\mp\_utility::exploder_before_load; + level.cfx_exploder_after = maps\mp\_utility::exploder_after_load; } diff --git a/Multiplayer Core/patch_mp/maps/mp/_createfxmenu.gsc b/Multiplayer Core/patch_mp/maps/mp/_createfxmenu.gsc index 163c53f..2e27bec 100644 --- a/Multiplayer Core/patch_mp/maps/mp/_createfxmenu.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/_createfxmenu.gsc @@ -1,1019 +1,941 @@ -#include maps/mp/_createfxundo; -#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\_createfxundo; menu( name ) { /# - return level.create_fx_menu == name; + return level.create_fx_menu == name; #/ } setmenu( name ) { /# - level.create_fx_menu = name; + level.create_fx_menu = name; #/ } create_fx_menu() { /# - if ( button_is_clicked( "escape", "x" ) ) - { - exit_menu(); - return; - } - if ( menu( "creation" ) ) - { - if ( button_is_clicked( "1" ) ) - { - setmenu( "create_oneshot" ); - draw_effects_list(); - return; - } - if ( button_is_clicked( "2" ) ) - { - setmenu( "create_loopfx" ); - draw_effects_list(); - return; - } - if ( button_is_clicked( "3" ) ) - { - setmenu( "create_exploder" ); - draw_effects_list(); - return; - } - if ( button_is_clicked( "4" ) ) - { - setmenu( "create_loopsound" ); - ent = createloopsound(); - finish_creating_entity( ent ); - setmenu( "none" ); - return; - } - } - if ( !menu( "create_oneshot" ) && !menu( "create_loopfx" ) || menu( "create_exploder" ) && menu( "change_fxid" ) ) - { - if ( button_is_clicked( "rightarrow" ) ) - { - increment_list_offset(); - draw_effects_list(); - } - if ( button_is_clicked( "leftarrow" ) ) - { - decrement_list_offset(); - draw_effects_list(); - } - menu_fx_creation(); - } - else - { - if ( menu( "none" ) ) - { - menu_change_selected_fx(); - if ( entities_are_selected() ) - { - display_fx_info( get_last_selected_entity() ); - if ( button_is_clicked( "a" ) ) - { - clear_settable_fx(); - setmenu( "add_options" ); - } - } - return; - } - else if ( menu( "add_options" ) ) - { - if ( !entities_are_selected() ) - { - clear_fx_hudelements(); - setmenu( "none" ); - return; - } - display_fx_add_options( get_last_selected_entity() ); - if ( button_is_clicked( "rightarrow" ) ) - { - increment_list_offset(); - } - if ( button_is_clicked( "leftarrow" ) ) - { - decrement_list_offset(); - } - return; - } - else if ( menu( "jump_to_effect" ) ) - { - if ( button_is_clicked( "rightarrow" ) ) - { - increment_list_offset(); - draw_effects_list( "Select effect to jump to:" ); - } - if ( button_is_clicked( "leftarrow" ) ) - { - decrement_list_offset(); - draw_effects_list( "Select effect to jump to:" ); - } - jump_to_effect(); - return; - } - else if ( menu( "select_by_property" ) ) - { - menu_selection(); - if ( button_is_clicked( "rightarrow" ) ) - { - increment_list_offset(); - } - if ( button_is_clicked( "leftarrow" ) ) - { - decrement_list_offset(); - } - return; - } - else if ( menu( "change_type" ) ) - { - if ( !entities_are_selected() ) - { - clear_fx_hudelements(); - setmenu( "none" ); - return; - return; - } - else - { - menu_fx_type(); + if ( button_is_clicked( "escape", "x" ) ) + { + exit_menu(); + return; + } + + if ( menu( "creation" ) ) + { + if ( button_is_clicked( "1" ) ) + { + setmenu( "create_oneshot" ); + draw_effects_list(); + return; + } + + if ( button_is_clicked( "2" ) ) + { + setmenu( "create_loopfx" ); + draw_effects_list(); + return; + } + + if ( button_is_clicked( "3" ) ) + { + setmenu( "create_exploder" ); + draw_effects_list(); + return; + } + + if ( button_is_clicked( "4" ) ) + { + setmenu( "create_loopsound" ); + ent = createloopsound(); + finish_creating_entity( ent ); + setmenu( "none" ); + return; + } + } + + if ( menu( "create_oneshot" ) || menu( "create_loopfx" ) || menu( "create_exploder" ) || menu( "change_fxid" ) ) + { + if ( button_is_clicked( "rightarrow" ) ) + { + increment_list_offset(); + draw_effects_list(); + } + + if ( button_is_clicked( "leftarrow" ) ) + { + decrement_list_offset(); + draw_effects_list(); + } + + menu_fx_creation(); + } + else if ( menu( "none" ) ) + { + menu_change_selected_fx(); + + if ( entities_are_selected() ) + { + display_fx_info( get_last_selected_entity() ); + + if ( button_is_clicked( "a" ) ) + { + clear_settable_fx(); + setmenu( "add_options" ); + } + } + } + else if ( menu( "add_options" ) ) + { + if ( !entities_are_selected() ) + { + clear_fx_hudelements(); + setmenu( "none" ); + return; + } + + display_fx_add_options( get_last_selected_entity() ); + + if ( button_is_clicked( "rightarrow" ) ) + increment_list_offset(); + + if ( button_is_clicked( "leftarrow" ) ) + decrement_list_offset(); + } + else if ( menu( "jump_to_effect" ) ) + { + if ( button_is_clicked( "rightarrow" ) ) + { + increment_list_offset(); + draw_effects_list( "Select effect to jump to:" ); + } + + if ( button_is_clicked( "leftarrow" ) ) + { + decrement_list_offset(); + draw_effects_list( "Select effect to jump to:" ); + } + + jump_to_effect(); + } + else if ( menu( "select_by_property" ) ) + { + menu_selection(); + + if ( button_is_clicked( "rightarrow" ) ) + increment_list_offset(); + + if ( button_is_clicked( "leftarrow" ) ) + decrement_list_offset(); + } + else if ( menu( "change_type" ) ) + { + if ( !entities_are_selected() ) + { + clear_fx_hudelements(); + setmenu( "none" ); + return; + } + else + menu_fx_type(); + } #/ - } - } - } } exit_menu() { /# - clear_fx_hudelements(); - clear_entity_selection(); - update_selected_entities(); - setmenu( "none" ); + clear_fx_hudelements(); + clear_entity_selection(); + update_selected_entities(); + setmenu( "none" ); #/ } get_last_selected_entity() { /# - return level.selected_fx_ents[ level.selected_fx_ents.size - 1 ]; + return level.selected_fx_ents[level.selected_fx_ents.size - 1]; #/ } menu_fx_creation() { /# - count = 0; - picked_fx = undefined; - keys = get_level_ambient_fx(); - i = level.effect_list_offset; - while ( i < keys.size ) - { - count += 1; - button_to_check = count; - if ( button_to_check == 10 ) - { - button_to_check = 0; - } - if ( button_is_clicked( button_to_check + "" ) && !button_is_held( "f" ) ) - { - picked_fx = keys[ i ]; - break; - } - else - { - if ( count > level.effect_list_offset_max ) - { - break; - } - else - { - i++; - } - } - } - if ( !isDefined( picked_fx ) ) - { - return; - } - if ( menu( "change_fxid" ) ) - { - apply_option_to_selected_fx( get_option( "fxid" ), picked_fx ); - level.effect_list_offset = 0; - clear_fx_hudelements(); - setmenu( "none" ); - return; - } - ent = undefined; - if ( menu( "create_loopfx" ) ) - { - ent = createloopeffect( picked_fx ); - } - if ( menu( "create_oneshot" ) ) - { - ent = createoneshoteffect( picked_fx ); - delay_min = getDvarInt( "createfx_oneshot_min_delay" ); - delay_max = getDvarInt( "createfx_oneshot_max_delay" ); - if ( delay_min > delay_max ) - { - temp = delay_min; - delay_min = delay_max; - delay_max = temp; - } - ent.v[ "delay" ] = randomintrange( delay_min, delay_max ); - } - if ( menu( "create_exploder" ) ) - { - ent = createexploder( picked_fx ); - } - finish_creating_entity( ent ); - if ( level.cfx_last_action != "none" ) - { - store_undo_state( "edit", level.selected_fx_ents ); - } - store_undo_state( "add", level.createfxent[ level.createfxent.size - 1 ] ); - level.cfx_last_action = "none"; - setmenu( "none" ); + count = 0; + picked_fx = undefined; + keys = get_level_ambient_fx(); + + for ( i = level.effect_list_offset; i < keys.size; i++ ) + { + count += 1; + button_to_check = count; + + if ( button_to_check == 10 ) + button_to_check = 0; + + if ( button_is_clicked( button_to_check + "" ) && !button_is_held( "f" ) ) + { + picked_fx = keys[i]; + break; + } + + if ( count > level.effect_list_offset_max ) + break; + } + + if ( !isdefined( picked_fx ) ) + return; + + if ( menu( "change_fxid" ) ) + { + apply_option_to_selected_fx( get_option( "fxid" ), picked_fx ); + level.effect_list_offset = 0; + clear_fx_hudelements(); + setmenu( "none" ); + return; + } + + ent = undefined; + + if ( menu( "create_loopfx" ) ) + ent = createloopeffect( picked_fx ); + + if ( menu( "create_oneshot" ) ) + { + ent = createoneshoteffect( picked_fx ); + delay_min = getdvarint( "createfx_oneshot_min_delay" ); + delay_max = getdvarint( "createfx_oneshot_max_delay" ); + + if ( delay_min > delay_max ) + { + temp = delay_min; + delay_min = delay_max; + delay_max = temp; + } + + ent.v["delay"] = randomintrange( delay_min, delay_max ); + } + + if ( menu( "create_exploder" ) ) + ent = createexploder( picked_fx ); + + finish_creating_entity( ent ); + + if ( level.cfx_last_action != "none" ) + store_undo_state( "edit", level.selected_fx_ents ); + + store_undo_state( "add", level.createfxent[level.createfxent.size - 1] ); + level.cfx_last_action = "none"; + setmenu( "none" ); #/ } finish_creating_entity( ent ) { /# - ent.v[ "angles" ] = vectorToAngle( ( ent.v[ "origin" ] + vectorScale( ( 1, 1, 0 ), 100 ) ) - ent.v[ "origin" ] ); - assert( isDefined( ent ) ); - ent post_entity_creation_function(); - clear_entity_selection(); - select_last_entity( "skip_undo" ); - move_selection_to_cursor( "skip_undo" ); - update_selected_entities(); + ent.v["angles"] = vectortoangles( ent.v["origin"] + vectorscale( ( 0, 0, 1 ), 100.0 ) - ent.v["origin"] ); + assert( isdefined( ent ) ); + ent post_entity_creation_function(); + clear_entity_selection(); + select_last_entity( "skip_undo" ); + move_selection_to_cursor( "skip_undo" ); + update_selected_entities(); #/ } change_effect_to_oneshot( ent ) { /# - if ( ent.v[ "type" ] == "oneshotfx" ) - { - return; - } - if ( ent.v[ "type" ] == "exploder" ) - { - } - if ( !isDefined( ent.v[ "delay" ] ) || ent.v[ "delay" ] == 0 ) - { - delay_min = getDvarInt( "createfx_oneshot_min_delay" ); - delay_max = getDvarInt( "createfx_oneshot_max_delay" ); - if ( delay_min > delay_max ) - { - temp = delay_min; - delay_min = delay_max; - delay_max = temp; - } - ent.v[ "delay" ] = randomintrange( delay_min, delay_max ); - } - ent.v[ "type" ] = "oneshotfx"; + if ( ent.v["type"] == "oneshotfx" ) + return; + + if ( ent.v["type"] == "exploder" ) + { + ent.v["exploder"] = undefined; + ent.v["exploder_type"] = undefined; + ent.v["soundalias"] = undefined; + } + + if ( !isdefined( ent.v["delay"] ) || ent.v["delay"] == 0 ) + { + delay_min = getdvarint( "createfx_oneshot_min_delay" ); + delay_max = getdvarint( "createfx_oneshot_max_delay" ); + + if ( delay_min > delay_max ) + { + temp = delay_min; + delay_min = delay_max; + delay_max = temp; + } + + ent.v["delay"] = randomintrange( delay_min, delay_max ); + } + + ent.v["type"] = "oneshotfx"; #/ } change_effect_to_loop( ent ) { /# - if ( ent.v[ "type" ] == "loopfx" ) - { - return; - } - if ( ent.v[ "type" ] == "exploder" ) - { - } - if ( !isDefined( ent.v[ "delay" ] ) || ent.v[ "delay" ] <= 0 ) - { - ent.v[ "delay" ] = 1; - } - ent.v[ "type" ] = "loopfx"; + if ( ent.v["type"] == "loopfx" ) + return; + + if ( ent.v["type"] == "exploder" ) + { + ent.v["exploder"] = undefined; + ent.v["exploder_type"] = undefined; + ent.v["soundalias"] = undefined; + } + + if ( !isdefined( ent.v["delay"] ) || ent.v["delay"] <= 0 ) + ent.v["delay"] = 1; + + ent.v["type"] = "loopfx"; #/ } change_effect_to_exploder( ent ) { /# - if ( ent.v[ "type" ] == "exploder" ) - { - return; - } - ent.v[ "type" ] = "exploder"; - if ( !isDefined( ent.v[ "delay" ] ) || ent.v[ "delay" ] < 0 ) - { - ent.v[ "delay" ] = 0; - } - ent.v[ "exploder" ] = 1; - ent.v[ "exploder_type" ] = "normal"; + if ( ent.v["type"] == "exploder" ) + return; + + ent.v["type"] = "exploder"; + + if ( !isdefined( ent.v["delay"] ) || ent.v["delay"] < 0 ) + ent.v["delay"] = 0; + + ent.v["exploder"] = 1; + ent.v["exploder_type"] = "normal"; #/ } change_ent_type( newtype ) { /# - store_undo_state( "edit", level.selected_fx_ents ); - level.cfx_last_action = "ent_type"; - if ( newtype == "oneshotfx" ) - { - i = 0; - while ( i < level.selected_fx_ents.size ) - { - change_effect_to_oneshot( level.selected_fx_ents[ i ] ); - i++; - } - } - else if ( newtype == "loopfx" ) - { - i = 0; - while ( i < level.selected_fx_ents.size ) - { - change_effect_to_loop( level.selected_fx_ents[ i ] ); - i++; - } - } - else while ( newtype == "exploder" ) - { - i = 0; - while ( i < level.selected_fx_ents.size ) - { - change_effect_to_exploder( level.selected_fx_ents[ i ] ); - i++; + store_undo_state( "edit", level.selected_fx_ents ); + level.cfx_last_action = "ent_type"; + + if ( newtype == "oneshotfx" ) + { + for ( i = 0; i < level.selected_fx_ents.size; i++ ) + change_effect_to_oneshot( level.selected_fx_ents[i] ); + } + else if ( newtype == "loopfx" ) + { + for ( i = 0; i < level.selected_fx_ents.size; i++ ) + change_effect_to_loop( level.selected_fx_ents[i] ); + } + else if ( newtype == "exploder" ) + { + for ( i = 0; i < level.selected_fx_ents.size; i++ ) + change_effect_to_exploder( level.selected_fx_ents[i] ); + } #/ - } - } } menu_init() { /# - level.createfx_options = []; - addoption( "string", "type", "Type", "oneshotfx", "fx" ); - addoption( "string", "fxid", "Name", "nil", "fx" ); - addoption( "vector", "origin", "Origin", ( 1, 1, 0 ), "fx" ); - addoption( "vector", "angles", "Angles", ( 1, 1, 0 ), "fx" ); - addoption( "float", "delay", "Repeat rate/start delay", 0,5, "fx" ); - addoption( "int", "repeat", "Number of times to repeat", 5, "exploder" ); - addoption( "float", "primlightfrac", "Primary light fraction", 1, "fx" ); - addoption( "int", "lightoriginoffs", "Light origin offset", 64, "fx" ); - addoption( "float", "delay_min", "Minimum time between repeats", 1, "exploder" ); - addoption( "float", "delay_max", "Maximum time between repeats", 2, "exploder" ); - addoption( "float", "fire_range", "Fire damage range", 0, "fx" ); - addoption( "string", "firefx", "2nd FX id", "nil", "exploder" ); - addoption( "float", "firefxdelay", "2nd FX id repeat rate", 0,5, "exploder" ); - addoption( "float", "firefxtimeout", "2nd FX timeout", 5, "exploder" ); - addoption( "string", "firefxsound", "2nd FX soundalias", "nil", "exploder" ); - addoption( "string", "ender", "Level notify for ending 2nd FX", "nil", "exploder" ); - addoption( "string", "rumble", "Rumble", "nil", "exploder" ); - addoption( "float", "damage", "Radius damage", 150, "exploder" ); - addoption( "float", "damage_radius", "Radius of radius damage", 250, "exploder" ); - addoption( "int", "exploder", "Exploder", 1, "exploder" ); - addoption( "string", "earthquake", "Earthquake", "nil", "exploder" ); - addoption( "string", "soundalias", "Soundalias", "nil", "all" ); - addoption( "int", "stoppable", "Can be stopped from script", "1", "all" ); - level.effect_list_offset = 0; - level.effect_list_offset_max = 9; - level.createfxmasks = []; - level.createfxmasks[ "all" ] = []; - level.createfxmasks[ "all" ][ "exploder" ] = 1; - level.createfxmasks[ "all" ][ "oneshotfx" ] = 1; - level.createfxmasks[ "all" ][ "loopfx" ] = 1; - level.createfxmasks[ "all" ][ "soundfx" ] = 1; - level.createfxmasks[ "fx" ] = []; - level.createfxmasks[ "fx" ][ "exploder" ] = 1; - level.createfxmasks[ "fx" ][ "oneshotfx" ] = 1; - level.createfxmasks[ "fx" ][ "loopfx" ] = 1; - level.createfxmasks[ "exploder" ] = []; - level.createfxmasks[ "exploder" ][ "exploder" ] = 1; - level.createfxmasks[ "loopfx" ] = []; - level.createfxmasks[ "loopfx" ][ "loopfx" ] = 1; - level.createfxmasks[ "oneshotfx" ] = []; - level.createfxmasks[ "oneshotfx" ][ "oneshotfx" ] = 1; - level.createfxmasks[ "soundfx" ] = []; - level.createfxmasks[ "soundfx" ][ "soundalias" ] = 1; + level.createfx_options = []; + addoption( "string", "type", "Type", "oneshotfx", "fx" ); + addoption( "string", "fxid", "Name", "nil", "fx" ); + addoption( "vector", "origin", "Origin", ( 0, 0, 0 ), "fx" ); + addoption( "vector", "angles", "Angles", ( 0, 0, 0 ), "fx" ); + addoption( "float", "delay", "Repeat rate/start delay", 0.5, "fx" ); + addoption( "int", "repeat", "Number of times to repeat", 5, "exploder" ); + addoption( "float", "primlightfrac", "Primary light fraction", 1.0, "fx" ); + addoption( "int", "lightoriginoffs", "Light origin offset", 64, "fx" ); + addoption( "float", "delay_min", "Minimum time between repeats", 1, "exploder" ); + addoption( "float", "delay_max", "Maximum time between repeats", 2, "exploder" ); + addoption( "float", "fire_range", "Fire damage range", 0, "fx" ); + addoption( "string", "firefx", "2nd FX id", "nil", "exploder" ); + addoption( "float", "firefxdelay", "2nd FX id repeat rate", 0.5, "exploder" ); + addoption( "float", "firefxtimeout", "2nd FX timeout", 5, "exploder" ); + addoption( "string", "firefxsound", "2nd FX soundalias", "nil", "exploder" ); + addoption( "string", "ender", "Level notify for ending 2nd FX", "nil", "exploder" ); + addoption( "string", "rumble", "Rumble", "nil", "exploder" ); + addoption( "float", "damage", "Radius damage", 150, "exploder" ); + addoption( "float", "damage_radius", "Radius of radius damage", 250, "exploder" ); + addoption( "int", "exploder", "Exploder", 1, "exploder" ); + addoption( "string", "earthquake", "Earthquake", "nil", "exploder" ); + addoption( "string", "soundalias", "Soundalias", "nil", "all" ); + addoption( "int", "stoppable", "Can be stopped from script", "1", "all" ); + level.effect_list_offset = 0; + level.effect_list_offset_max = 9; + level.createfxmasks = []; + level.createfxmasks["all"] = []; + level.createfxmasks["all"]["exploder"] = 1; + level.createfxmasks["all"]["oneshotfx"] = 1; + level.createfxmasks["all"]["loopfx"] = 1; + level.createfxmasks["all"]["soundfx"] = 1; + level.createfxmasks["fx"] = []; + level.createfxmasks["fx"]["exploder"] = 1; + level.createfxmasks["fx"]["oneshotfx"] = 1; + level.createfxmasks["fx"]["loopfx"] = 1; + level.createfxmasks["exploder"] = []; + level.createfxmasks["exploder"]["exploder"] = 1; + level.createfxmasks["loopfx"] = []; + level.createfxmasks["loopfx"]["loopfx"] = 1; + level.createfxmasks["oneshotfx"] = []; + level.createfxmasks["oneshotfx"]["oneshotfx"] = 1; + level.createfxmasks["soundfx"] = []; + level.createfxmasks["soundfx"]["soundalias"] = 1; #/ } get_last_selected_ent() { /# - return level.selected_fx_ents[ level.selected_fx_ents.size - 1 ]; + return level.selected_fx_ents[level.selected_fx_ents.size - 1]; #/ } entities_are_selected() { /# - return level.selected_fx_ents.size > 0; + return level.selected_fx_ents.size > 0; #/ } menu_change_selected_fx() { /# - if ( !level.selected_fx_ents.size ) - { - return; - } - count = 0; - drawncount = 0; - ent = get_last_selected_ent(); - i = 0; - while ( i < level.createfx_options.size ) - { - option = level.createfx_options[ i ]; - if ( !isDefined( ent.v[ option[ "name" ] ] ) ) - { - i++; - continue; - } - else count++; - if ( count < level.effect_list_offset ) - { - i++; - continue; - } - else - { - drawncount++; - button_to_check = drawncount; - if ( button_to_check == 10 ) - { - button_to_check = 0; - } - if ( button_is_clicked( button_to_check + "" ) && !button_is_held( "f" ) ) - { - prepare_option_for_change( option, drawncount ); - return; - } - else - { - if ( drawncount > level.effect_list_offset_max ) - { - return; - } - } - else - { - i++; + if ( !level.selected_fx_ents.size ) + return; + + count = 0; + drawncount = 0; + ent = get_last_selected_ent(); + + for ( i = 0; i < level.createfx_options.size; i++ ) + { + option = level.createfx_options[i]; + + if ( !isdefined( ent.v[option["name"]] ) ) + continue; + + count++; + + if ( count < level.effect_list_offset ) + continue; + + drawncount++; + button_to_check = drawncount; + + if ( button_to_check == 10 ) + button_to_check = 0; + + if ( button_is_clicked( button_to_check + "" ) && !button_is_held( "f" ) ) + { + prepare_option_for_change( option, drawncount ); + break; + } + + if ( drawncount > level.effect_list_offset_max ) + break; + } #/ - } - } - } } prepare_option_for_change( option, drawncount ) { /# - if ( option[ "name" ] == "fxid" ) - { - setmenu( "change_fxid" ); - draw_effects_list(); - return; - } - if ( option[ "name" ] == "type" ) - { - setmenu( "change_type" ); - return; - } - level.createfx_inputlocked = 1; - set_option_index( option[ "name" ] ); - setdvar( "fx", "nil" ); - level.createfxhudelements[ drawncount + 1 ][ 0 ].color = ( 1, 1, 0 ); + if ( option["name"] == "fxid" ) + { + setmenu( "change_fxid" ); + draw_effects_list(); + return; + } + + if ( option["name"] == "type" ) + { + setmenu( "change_type" ); + return; + } + + level.createfx_inputlocked = 1; + set_option_index( option["name"] ); + setdvar( "fx", "nil" ); + level.createfxhudelements[drawncount + 1][0].color = ( 1, 1, 0 ); #/ } menu_fx_option_set() { /# - if ( getDvar( "fx" ) == "nil" ) - { - return; - } - option = get_selected_option(); - setting = undefined; - if ( option[ "type" ] == "string" ) - { - setting = getDvar( "fx" ); - } - if ( option[ "type" ] == "int" ) - { - setting = getDvarInt( "fx" ); - } - if ( option[ "type" ] == "float" ) - { - setting = getDvarFloat( "fx" ); - } - if ( option[ "type" ] == "vector" ) - { - setting = getDvar( "fx" ); - temparray = strtok( setting, " " ); - if ( temparray.size == 3 ) - { - setting = ( float( temparray[ 0 ] ), float( temparray[ 1 ] ), float( temparray[ 2 ] ) ); - } - else - { - clear_settable_fx(); - return; - } - } - apply_option_to_selected_fx( option, setting ); + if ( getdvar( "fx" ) == "nil" ) + return; + + option = get_selected_option(); + setting = undefined; + + if ( option["type"] == "string" ) + setting = getdvar( "fx" ); + + if ( option["type"] == "int" ) + setting = getdvarint( "fx" ); + + if ( option["type"] == "float" ) + setting = getdvarfloat( "fx" ); + + if ( option["type"] == "vector" ) + { + setting = getdvar( "fx" ); + temparray = strtok( setting, " " ); + + if ( temparray.size == 3 ) + setting = ( float( temparray[0] ), float( temparray[1] ), float( temparray[2] ) ); + else + { + clear_settable_fx(); + return; + } + } + + apply_option_to_selected_fx( option, setting ); #/ } menu_fx_type() { /# - clear_fx_hudelements(); - set_fx_hudelement( "Change effect type to:" ); - set_fx_hudelement( " (1) Oneshot" ); - set_fx_hudelement( " (2) Looped" ); - set_fx_hudelement( " (3) Exploder" ); - set_fx_hudelement( "(x) Exit >" ); - if ( button_is_clicked( "1" ) && !button_is_held( "f" ) ) - { - change_ent_type( "oneshotfx" ); - setmenu( "none" ); - } - else - { - if ( button_is_clicked( "2" ) && !button_is_held( "f" ) ) - { - change_ent_type( "loopfx" ); - setmenu( "none" ); - } - else - { - if ( button_is_clicked( "3" ) && !button_is_held( "f" ) ) - { - change_ent_type( "exploder" ); - setmenu( "none" ); - } - } - } - if ( menu( "none" ) ) - { - update_selected_entities(); + clear_fx_hudelements(); + set_fx_hudelement( "Change effect type to:" ); + set_fx_hudelement( " (1) Oneshot" ); + set_fx_hudelement( " (2) Looped" ); + set_fx_hudelement( " (3) Exploder" ); + set_fx_hudelement( "(x) Exit >" ); + + if ( button_is_clicked( "1" ) && !button_is_held( "f" ) ) + { + change_ent_type( "oneshotfx" ); + setmenu( "none" ); + } + else if ( button_is_clicked( "2" ) && !button_is_held( "f" ) ) + { + change_ent_type( "loopfx" ); + setmenu( "none" ); + } + else if ( button_is_clicked( "3" ) && !button_is_held( "f" ) ) + { + change_ent_type( "exploder" ); + setmenu( "none" ); + } + + if ( menu( "none" ) ) + update_selected_entities(); #/ - } } menu_selection() { /# - clear_fx_hudelements(); - set_fx_hudelement( "Select all by property:" ); - drawncount = 0; - option_number = 0; - ent = level.selected_fx_ents[ level.selected_fx_ents.size - 1 ]; - if ( level.selected_fx_ents.size < 1 ) - { - set_fx_hudelement( "No ent is selected." ); - } - else i = level.effect_list_offset; - while ( i < level.createfx_options.size ) - { - if ( drawncount > level.effect_list_offset_max ) - { - break; - } - else if ( drawncount > ent.v.size ) - { - break; - } - else - { - prop_name = level.createfx_options[ i ][ "name" ]; - option_number = drawncount + 1; - if ( isDefined( ent.v[ prop_name ] ) ) - { - if ( button_is_clicked( option_number + "" ) && !button_is_held( "f" ) ) - { - level.cfx_selected_prop = prop_name; - menunone(); - level.effect_list_offset = 0; - return; - } - prop_desc = level.createfx_options[ i ][ "description" ]; - set_fx_hudelement( ( option_number + ". " ) + prop_desc + ": " + ent.v[ prop_name ] ); - drawncount++; - i++; - continue; - } - i++; - } - } - if ( drawncount > level.effect_list_offset_max ) - { - pages = ceil( ent.v.size / level.effect_list_offset_max ); - current_page = ( level.effect_list_offset / level.effect_list_offset_max ) + 1; - set_fx_hudelement( "(<-) Page " + current_page + " of " + pages + " (->)" ); - } - set_fx_hudelement( "(x) Exit >" ); + clear_fx_hudelements(); + set_fx_hudelement( "Select all by property:" ); + drawncount = 0; + option_number = 0; + ent = level.selected_fx_ents[level.selected_fx_ents.size - 1]; + + if ( level.selected_fx_ents.size < 1 ) + set_fx_hudelement( "No ent is selected." ); + else + { + for ( i = level.effect_list_offset; i < level.createfx_options.size; i++ ) + { + if ( drawncount > level.effect_list_offset_max ) + break; + + if ( drawncount > ent.v.size ) + break; + + prop_name = level.createfx_options[i]["name"]; + option_number = drawncount + 1; + + if ( isdefined( ent.v[prop_name] ) ) + { + if ( button_is_clicked( option_number + "" ) && !button_is_held( "f" ) ) + { + level.cfx_selected_prop = prop_name; + menunone(); + level.effect_list_offset = 0; + return; + } + + prop_desc = level.createfx_options[i]["description"]; + set_fx_hudelement( option_number + ". " + prop_desc + ": " + ent.v[prop_name] ); + drawncount++; + continue; + } + } + } + + if ( drawncount > level.effect_list_offset_max ) + { + pages = ceil( ent.v.size / level.effect_list_offset_max ); + current_page = level.effect_list_offset / level.effect_list_offset_max + 1; + set_fx_hudelement( "(<-) Page " + current_page + " of " + pages + " (->)" ); + } + + set_fx_hudelement( "(x) Exit >" ); #/ } apply_option_to_selected_fx( option, setting ) { /# - if ( level.cfx_last_action != option[ "name" ] ) - { - store_undo_state( "edit", level.selected_fx_ents ); - level.cfx_last_action = option[ "name" ]; - } - i = 0; - while ( i < level.selected_fx_ents.size ) - { - ent = level.selected_fx_ents[ i ]; - if ( mask( option[ "mask" ], ent.v[ "type" ] ) ) - { - ent.v[ option[ "name" ] ] = setting; - } - i++; - } - update_selected_entities(); - clear_settable_fx(); + if ( level.cfx_last_action != option["name"] ) + { + store_undo_state( "edit", level.selected_fx_ents ); + level.cfx_last_action = option["name"]; + } + + for ( i = 0; i < level.selected_fx_ents.size; i++ ) + { + ent = level.selected_fx_ents[i]; + + if ( mask( option["mask"], ent.v["type"] ) ) + ent.v[option["name"]] = setting; + } + + update_selected_entities(); + clear_settable_fx(); #/ } set_option_index( name ) { /# - i = 0; - while ( i < level.createfx_options.size ) - { - if ( level.createfx_options[ i ][ "name" ] != name ) - { - i++; - continue; - } - else - { - level.selected_fx_option_index = i; - return; - } - i++; + for ( i = 0; i < level.createfx_options.size; i++ ) + { + if ( level.createfx_options[i]["name"] != name ) + continue; + + level.selected_fx_option_index = i; + return; + } #/ - } } get_selected_option() { /# - return level.createfx_options[ level.selected_fx_option_index ]; + return level.createfx_options[level.selected_fx_option_index]; #/ } mask( type, name ) { /# - return isDefined( level.createfxmasks[ type ][ name ] ); + return isdefined( level.createfxmasks[type][name] ); #/ } addoption( type, name, description, defaultsetting, mask ) { /# - option = []; - option[ "type" ] = type; - option[ "name" ] = name; - option[ "description" ] = description; - option[ "default" ] = defaultsetting; - option[ "mask" ] = mask; - level.createfx_options[ level.createfx_options.size ] = option; + option = []; + option["type"] = type; + option["name"] = name; + option["description"] = description; + option["default"] = defaultsetting; + option["mask"] = mask; + level.createfx_options[level.createfx_options.size] = option; #/ } get_option( name ) { /# - i = 0; - while ( i < level.createfx_options.size ) - { - if ( level.createfx_options[ i ][ "name" ] == name ) - { - return level.createfx_options[ i ]; - } - i++; + for ( i = 0; i < level.createfx_options.size; i++ ) + { + if ( level.createfx_options[i]["name"] == name ) + return level.createfx_options[i]; + } #/ - } } display_fx_info( ent ) { /# - if ( !menu( "none" ) ) - { - return; - } - clear_fx_hudelements(); - if ( !level.createfx_draw_enabled ) - { - return; - } - set_fx_hudelement( "Selected: " + level.selected_fx_ents.size + " Distance: " + get_distance_from_ent( ent ) ); - level.createfxhudelements[ 0 ][ 0 ].color = ( 1, 1, 0 ); - set_fx_hudelement( "Name: " + ent.v[ "fxid" ] ); - if ( entities_are_selected() ) - { - count = 0; - drawncount = 0; - i = 0; - while ( i < level.createfx_options.size ) - { - option = level.createfx_options[ i ]; - if ( !isDefined( ent.v[ option[ "name" ] ] ) ) - { - i++; - continue; - } - else count++; - if ( count < level.effect_list_offset ) - { - i++; - continue; - } - else - { - drawncount++; - set_fx_hudelement( ( drawncount + ". " ) + option[ "description" ] + ": " + ent.v[ option[ "name" ] ] ); - if ( drawncount > level.effect_list_offset_max ) - { - more = 1; - break; - } - } - else - { - i++; - } - } - if ( count > level.effect_list_offset_max ) - { - pages = ceil( level.createfx_options.size / level.effect_list_offset_max ); - current_page = ( level.effect_list_offset / level.effect_list_offset_max ) + 1; - set_fx_hudelement( "(<-) Page " + current_page + " of " + pages + " (->)" ); - } - set_fx_hudelement( "(a) Add >" ); - set_fx_hudelement( "(x) Exit >" ); - } - else - { - set_fx_hudelement( "Origin: " + ent.v[ "origin" ] ); - set_fx_hudelement( "Angles: " + ent.v[ "angles" ] ); + if ( !menu( "none" ) ) + return; + + clear_fx_hudelements(); + + if ( !level.createfx_draw_enabled ) + return; + + set_fx_hudelement( "Selected: " + level.selected_fx_ents.size + " Distance: " + get_distance_from_ent( ent ) ); + level.createfxhudelements[0][0].color = ( 1, 1, 0 ); + set_fx_hudelement( "Name: " + ent.v["fxid"] ); + + if ( entities_are_selected() ) + { + count = 0; + drawncount = 0; + + for ( i = 0; i < level.createfx_options.size; i++ ) + { + option = level.createfx_options[i]; + + if ( !isdefined( ent.v[option["name"]] ) ) + continue; + + count++; + + if ( count < level.effect_list_offset ) + continue; + + drawncount++; + set_fx_hudelement( drawncount + ". " + option["description"] + ": " + ent.v[option["name"]] ); + + if ( drawncount > level.effect_list_offset_max ) + { + more = 1; + break; + } + } + + if ( count > level.effect_list_offset_max ) + { + pages = ceil( level.createfx_options.size / level.effect_list_offset_max ); + current_page = level.effect_list_offset / level.effect_list_offset_max + 1; + set_fx_hudelement( "(<-) Page " + current_page + " of " + pages + " (->)" ); + } + + set_fx_hudelement( "(a) Add >" ); + set_fx_hudelement( "(x) Exit >" ); + } + else + { + set_fx_hudelement( "Origin: " + ent.v["origin"] ); + set_fx_hudelement( "Angles: " + ent.v["angles"] ); + } #/ - } } display_fx_add_options( ent ) { /# - assert( menu( "add_options" ) ); - assert( entities_are_selected() ); - clear_fx_hudelements(); - set_fx_hudelement( "Selected: " + level.selected_fx_ents.size + " Distance: " + get_distance_from_ent( ent ) ); - level.createfxhudelements[ 0 ][ 0 ].color = ( 1, 1, 0 ); - set_fx_hudelement( "Name: " + ent.v[ "fxid" ] ); - set_fx_hudelement( "Origin: " + ent.v[ "origin" ] ); - set_fx_hudelement( "Angles: " + ent.v[ "angles" ] ); - count = 0; - drawncount = 0; - if ( level.effect_list_offset >= level.createfx_options.size ) - { - level.effect_list_offset = 0; - } - i = 0; - while ( i < level.createfx_options.size ) - { - option = level.createfx_options[ i ]; - if ( isDefined( ent.v[ option[ "name" ] ] ) ) - { - i++; - continue; - } - else if ( !mask( option[ "mask" ], ent.v[ "type" ] ) ) - { - i++; - continue; - } - else count++; - if ( count < level.effect_list_offset ) - { - i++; - continue; - } - else if ( drawncount >= level.effect_list_offset_max ) - { - i++; - continue; - } - else - { - drawncount++; - button_to_check = drawncount; - if ( button_to_check == 10 ) - { - button_to_check = 0; - } - if ( button_is_clicked( button_to_check + "" ) && !button_is_held( "f" ) ) - { - add_option_to_selected_entities( option ); - menunone(); - return; - } - set_fx_hudelement( ( button_to_check + ". " ) + option[ "description" ] ); - } - i++; - } - if ( count > level.effect_list_offset_max ) - { - pages = ceil( level.createfx_options.size / level.effect_list_offset_max ); - current_page = ( level.effect_list_offset / level.effect_list_offset_max ) + 1; - set_fx_hudelement( "(<-) Page " + current_page + " of " + pages + " (->)" ); - } - set_fx_hudelement( "(x) Exit >" ); + assert( menu( "add_options" ) ); + assert( entities_are_selected() ); + clear_fx_hudelements(); + set_fx_hudelement( "Selected: " + level.selected_fx_ents.size + " Distance: " + get_distance_from_ent( ent ) ); + level.createfxhudelements[0][0].color = ( 1, 1, 0 ); + set_fx_hudelement( "Name: " + ent.v["fxid"] ); + set_fx_hudelement( "Origin: " + ent.v["origin"] ); + set_fx_hudelement( "Angles: " + ent.v["angles"] ); + count = 0; + drawncount = 0; + + if ( level.effect_list_offset >= level.createfx_options.size ) + level.effect_list_offset = 0; + + for ( i = 0; i < level.createfx_options.size; i++ ) + { + option = level.createfx_options[i]; + + if ( isdefined( ent.v[option["name"]] ) ) + continue; + + if ( !mask( option["mask"], ent.v["type"] ) ) + continue; + + count++; + + if ( count < level.effect_list_offset ) + continue; + + if ( drawncount >= level.effect_list_offset_max ) + continue; + + drawncount++; + button_to_check = drawncount; + + if ( button_to_check == 10 ) + button_to_check = 0; + + if ( button_is_clicked( button_to_check + "" ) && !button_is_held( "f" ) ) + { + add_option_to_selected_entities( option ); + menunone(); + return; + } + + set_fx_hudelement( button_to_check + ". " + option["description"] ); + } + + if ( count > level.effect_list_offset_max ) + { + pages = ceil( level.createfx_options.size / level.effect_list_offset_max ); + current_page = level.effect_list_offset / level.effect_list_offset_max + 1; + set_fx_hudelement( "(<-) Page " + current_page + " of " + pages + " (->)" ); + } + + set_fx_hudelement( "(x) Exit >" ); #/ } add_option_to_selected_entities( option ) { /# - i = 0; - while ( i < level.selected_fx_ents.size ) - { - ent = level.selected_fx_ents[ i ]; - if ( mask( option[ "mask" ], ent.v[ "type" ] ) ) - { - ent.v[ option[ "name" ] ] = option[ "default" ]; - } - i++; + for ( i = 0; i < level.selected_fx_ents.size; i++ ) + { + ent = level.selected_fx_ents[i]; + + if ( mask( option["mask"], ent.v["type"] ) ) + ent.v[option["name"]] = option["default"]; + } #/ - } } menunone() { /# - level.effect_list_offset = 0; - clear_fx_hudelements(); - setmenu( "none" ); + level.effect_list_offset = 0; + clear_fx_hudelements(); + setmenu( "none" ); #/ } draw_effects_list( title ) { /# - clear_fx_hudelements(); - if ( !isDefined( title ) ) - { - title = "Pick an effect:"; - } - set_fx_hudelement( title ); - count = 0; - more = 0; - keys = get_level_ambient_fx(); - if ( level.effect_list_offset >= keys.size ) - { - level.effect_list_offset = 0; - } - else - { - if ( level.effect_list_offset < 0 ) - { - level.effect_list_offset = int( floor( keys.size / level.effect_list_offset_max ) * level.effect_list_offset_max ); - } - } - i = level.effect_list_offset; - while ( i < keys.size ) - { - count += 1; - set_fx_hudelement( ( count + ". " ) + keys[ i ] ); - if ( count >= level.effect_list_offset_max ) - { - more = 1; - break; - } - else - { - i++; - } - } - if ( keys.size > level.effect_list_offset_max ) - { - pages = ceil( keys.size / level.effect_list_offset_max ); - current_page = ( level.effect_list_offset / level.effect_list_offset_max ) + 1; - set_fx_hudelement( "(<-) Page " + current_page + " of " + pages + " (->)" ); + clear_fx_hudelements(); + + if ( !isdefined( title ) ) + title = "Pick an effect:"; + + set_fx_hudelement( title ); + count = 0; + more = 0; + keys = get_level_ambient_fx(); + + if ( level.effect_list_offset >= keys.size ) + level.effect_list_offset = 0; + else if ( level.effect_list_offset < 0 ) + level.effect_list_offset = int( floor( keys.size / level.effect_list_offset_max ) * level.effect_list_offset_max ); + + for ( i = level.effect_list_offset; i < keys.size; i++ ) + { + count += 1; + set_fx_hudelement( count + ". " + keys[i] ); + + if ( count >= level.effect_list_offset_max ) + { + more = 1; + break; + } + } + + if ( keys.size > level.effect_list_offset_max ) + { + pages = ceil( keys.size / level.effect_list_offset_max ); + current_page = level.effect_list_offset / level.effect_list_offset_max + 1; + set_fx_hudelement( "(<-) Page " + current_page + " of " + pages + " (->)" ); + } #/ - } } increment_list_offset() { /# - level.effect_list_offset += level.effect_list_offset_max; + level.effect_list_offset += level.effect_list_offset_max; #/ } decrement_list_offset() { /# - level.effect_list_offset -= level.effect_list_offset_max; + level.effect_list_offset -= level.effect_list_offset_max; #/ } jump_to_effect() { /# - count = 0; - picked_fxid = undefined; - keys = get_level_ambient_fx(); - i = level.effect_list_offset; - while ( i < keys.size ) - { - count += 1; - button_to_check = count; - if ( button_to_check == 10 ) - { - button_to_check = 0; - } - if ( button_is_clicked( button_to_check + "" ) && !button_is_held( "f" ) ) - { - picked_fxid = keys[ i ]; - break; - } - else - { - if ( count > level.effect_list_offset_max ) - { - break; - } - else - { - i++; - } - } - } - if ( !isDefined( picked_fxid ) ) - { - return; - } - clear_entity_selection(); - ent = get_next_ent_with_same_id( -1, picked_fxid ); - if ( isDefined( ent ) ) - { - level.cfx_next_ent = ent; - move_player_to_next_same_effect( 1 ); - } - else - { - iprintln( "Effect " + picked_fxid + " has not been placed." ); - } - level.effect_list_offset = 0; - clear_fx_hudelements(); - setmenu( "none" ); + count = 0; + picked_fxid = undefined; + keys = get_level_ambient_fx(); + + for ( i = level.effect_list_offset; i < keys.size; i++ ) + { + count += 1; + button_to_check = count; + + if ( button_to_check == 10 ) + button_to_check = 0; + + if ( button_is_clicked( button_to_check + "" ) && !button_is_held( "f" ) ) + { + picked_fxid = keys[i]; + break; + } + + if ( count > level.effect_list_offset_max ) + break; + } + + if ( !isdefined( picked_fxid ) ) + return; + + clear_entity_selection(); + ent = get_next_ent_with_same_id( -1, picked_fxid ); + + if ( isdefined( ent ) ) + { + level.cfx_next_ent = ent; + move_player_to_next_same_effect( 1 ); + } + else + iprintln( "Effect " + picked_fxid + " has not been placed." ); + + level.effect_list_offset = 0; + clear_fx_hudelements(); + setmenu( "none" ); #/ } get_level_ambient_fx() { /# - if ( !isDefined( level._effect_keys ) ) - { - keys = getarraykeys( level._effect ); - level._effect_keys = []; - k = 0; - i = 0; - while ( i < keys.size ) - { - if ( issubstr( keys[ i ], "fx_" ) ) - { - level._effect_keys[ k ] = keys[ i ]; - k++; - } - i++; - } - if ( level._effect_keys.size == 0 ) - { - level._effect_keys = keys; - } - } - return level._effect_keys; + if ( !isdefined( level._effect_keys ) ) + { + keys = getarraykeys( level._effect ); + level._effect_keys = []; + k = 0; + + for ( i = 0; i < keys.size; i++ ) + { + if ( issubstr( keys[i], "fx_" ) ) + { + level._effect_keys[k] = keys[i]; + k++; + } + } + + if ( level._effect_keys.size == 0 ) + level._effect_keys = keys; + } + + return level._effect_keys; #/ } get_distance_from_ent( ent ) { /# - player = get_players()[ 0 ]; - return distance( player geteye(), ent.v[ "origin" ] ); + player = get_players()[0]; + return distance( player geteye(), ent.v["origin"] ); #/ } diff --git a/Multiplayer Core/patch_mp/maps/mp/_createfxundo.gsc b/Multiplayer Core/patch_mp/maps/mp/_createfxundo.gsc index 082e0ed..3ef987b 100644 --- a/Multiplayer Core/patch_mp/maps/mp/_createfxundo.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/_createfxundo.gsc @@ -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" ); #/ } diff --git a/Multiplayer Core/patch_mp/maps/mp/_decoy.gsc b/Multiplayer Core/patch_mp/maps/mp/_decoy.gsc index 8a2a62d..a1cec80 100644 --- a/Multiplayer Core/patch_mp/maps/mp/_decoy.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/_decoy.gsc @@ -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] ); + } } diff --git a/Multiplayer Core/patch_mp/maps/mp/_demo.gsc b/Multiplayer Core/patch_mp/maps/mp/_demo.gsc index 4440fc5..ce5101f 100644 --- a/Multiplayer Core/patch_mp/maps/mp/_demo.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/_demo.gsc @@ -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 ); +} diff --git a/Multiplayer Core/patch_mp/maps/mp/_destructible.gsc b/Multiplayer Core/patch_mp/maps/mp/_destructible.gsc index 67d278e..0611cc3 100644 --- a/Multiplayer Core/patch_mp/maps/mp/_destructible.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/_destructible.gsc @@ -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 ); } diff --git a/Multiplayer Core/patch_mp/maps/mp/_development_dvars.gsc b/Multiplayer Core/patch_mp/maps/mp/_development_dvars.gsc index dbe8b9e..5da6e55 100644 --- a/Multiplayer Core/patch_mp/maps/mp/_development_dvars.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/_development_dvars.gsc @@ -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() { + } diff --git a/Multiplayer Core/patch_mp/maps/mp/_empgrenade.gsc b/Multiplayer Core/patch_mp/maps/mp/_empgrenade.gsc index c0e22fd..efc3cc9 100644 --- a/Multiplayer Core/patch_mp/maps/mp/_empgrenade.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/_empgrenade.gsc @@ -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" ); +} diff --git a/Multiplayer Core/patch_mp/maps/mp/_entityheadicons.gsc b/Multiplayer Core/patch_mp/maps/mp/_entityheadicons.gsc index 55623ae..6687737 100644 --- a/Multiplayer Core/patch_mp/maps/mp/_entityheadicons.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/_entityheadicons.gsc @@ -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]; } - diff --git a/Multiplayer Core/patch_mp/maps/mp/_explosive_bolt.gsc b/Multiplayer Core/patch_mp/maps/mp/_explosive_bolt.gsc index 5ba50e7..86ae4c3 100644 --- a/Multiplayer Core/patch_mp/maps/mp/_explosive_bolt.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/_explosive_bolt.gsc @@ -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 ) { + } diff --git a/Multiplayer Core/patch_mp/maps/mp/_flashgrenades.gsc b/Multiplayer Core/patch_mp/maps/mp/_flashgrenades.gsc index 53e8e53..14a7300 100644 --- a/Multiplayer Core/patch_mp/maps/mp/_flashgrenades.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/_flashgrenades.gsc @@ -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(); +} diff --git a/Multiplayer Core/patch_mp/maps/mp/_fx.gsc b/Multiplayer Core/patch_mp/maps/mp/_fx.gsc index 568ef04..32ef5e4 100644 --- a/Multiplayer Core/patch_mp/maps/mp/_fx.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/_fx.gsc @@ -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; } diff --git a/Multiplayer Core/patch_mp/maps/mp/_fxanim.gsc b/Multiplayer Core/patch_mp/maps/mp/_fxanim.gsc index 9f2b401..73937d3 100644 --- a/Multiplayer Core/patch_mp/maps/mp/_fxanim.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/_fxanim.gsc @@ -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"] = []; } diff --git a/Multiplayer Core/patch_mp/maps/mp/_gameadvertisement.gsc b/Multiplayer Core/patch_mp/maps/mp/_gameadvertisement.gsc index 5e07f2f..475b542 100644 --- a/Multiplayer Core/patch_mp/maps/mp/_gameadvertisement.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/_gameadvertisement.gsc @@ -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’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 ); + } + } + } + } #/ - } } diff --git a/Multiplayer Core/patch_mp/maps/mp/_gamerep.gsc b/Multiplayer Core/patch_mp/maps/mp/_gamerep.gsc index 23ef7b0..f1da803 100644 --- a/Multiplayer Core/patch_mp/maps/mp/_gamerep.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/_gamerep.gsc @@ -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] ); } diff --git a/Multiplayer Core/patch_mp/maps/mp/_global_fx.gsc b/Multiplayer Core/patch_mp/maps/mp/_global_fx.gsc index d9abfeb..5b002ac 100644 --- a/Multiplayer Core/patch_mp/maps/mp/_global_fx.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/_global_fx.gsc @@ -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; } diff --git a/Multiplayer Core/patch_mp/maps/mp/_hacker_tool.gsc b/Multiplayer Core/patch_mp/maps/mp/_hacker_tool.gsc index 384a425..cb0dc1b 100644 --- a/Multiplayer Core/patch_mp/maps/mp/_hacker_tool.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/_hacker_tool.gsc @@ -1,746 +1,722 @@ -#include maps/mp/gametypes/_weaponobjects; -#include maps/mp/killstreaks/_supplydrop; -#include maps/mp/_heatseekingmissile; -#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 +#include maps\mp\_utility; +#include common_scripts\utility; +#include maps\mp\gametypes\_hud_util; +#include maps\mp\_heatseekingmissile; +#include maps\mp\killstreaks\_supplydrop; +#include maps\mp\gametypes\_weaponobjects; init() { - level.hackertoolmaxequipmentdistance = 2000; - level.hackertoolmaxequipmentdistancesq = level.hackertoolmaxequipmentdistance * level.hackertoolmaxequipmentdistance; - level.hackertoolnosighthackdistance = 750; - level.hackertoollostsightlimitms = 450; - level.hackertoollockonradius = 20; - level.hackertoollockonfov = 65; - level.hackertoolhacktimems = 0,5; - level.equipmenthackertoolradius = 60; - level.equipmenthackertooltimems = 50; - level.carepackagehackertoolradius = 60; - level.carepackagehackertooltimems = getgametypesetting( "crateCaptureTime" ) * 500; - level.carepackagefriendlyhackertooltimems = getgametypesetting( "crateCaptureTime" ) * 2000; - level.carepackageownerhackertooltimems = 250; - level.sentryhackertoolradius = 80; - level.sentryhackertooltimems = 4000; - level.microwavehackertoolradius = 80; - level.microwavehackertooltimems = 4000; - level.vehiclehackertoolradius = 80; - level.vehiclehackertooltimems = 4000; - level.rcxdhackertooltimems = 1500; - level.rcxdhackertoolradius = 20; - level.uavhackertooltimems = 4000; - level.uavhackertoolradius = 40; - level.cuavhackertooltimems = 4000; - level.cuavhackertoolradius = 40; - level.carepackagechopperhackertooltimems = 3000; - level.carepackagechopperhackertoolradius = 60; - level.littlebirdhackertooltimems = 4000; - level.littlebirdhackertoolradius = 80; - level.qrdronehackertooltimems = 3000; - level.qrdronehackertoolradius = 60; - level.aitankhackertooltimems = 4000; - level.aitankhackertoolradius = 60; - level.stealthchopperhackertooltimems = 4000; - level.stealthchopperhackertoolradius = 80; - level.warthoghackertooltimems = 4000; - level.warthoghackertoolradius = 80; - level.lodestarhackertooltimems = 4000; - level.lodestarhackertoolradius = 60; - level.choppergunnerhackertooltimems = 4000; - level.choppergunnerhackertoolradius = 260; - thread onplayerconnect(); + level.hackertoolmaxequipmentdistance = 2000; + level.hackertoolmaxequipmentdistancesq = level.hackertoolmaxequipmentdistance * level.hackertoolmaxequipmentdistance; + level.hackertoolnosighthackdistance = 750; + level.hackertoollostsightlimitms = 450; + level.hackertoollockonradius = 20; + level.hackertoollockonfov = 65; + level.hackertoolhacktimems = 0.5; + level.equipmenthackertoolradius = 60; + level.equipmenthackertooltimems = 50; + level.carepackagehackertoolradius = 60; + level.carepackagehackertooltimems = getgametypesetting( "crateCaptureTime" ) * 500; + level.carepackagefriendlyhackertooltimems = getgametypesetting( "crateCaptureTime" ) * 2000; + level.carepackageownerhackertooltimems = 250; + level.sentryhackertoolradius = 80; + level.sentryhackertooltimems = 4000; + level.microwavehackertoolradius = 80; + level.microwavehackertooltimems = 4000; + level.vehiclehackertoolradius = 80; + level.vehiclehackertooltimems = 4000; + level.rcxdhackertooltimems = 1500; + level.rcxdhackertoolradius = 20; + level.uavhackertooltimems = 4000; + level.uavhackertoolradius = 40; + level.cuavhackertooltimems = 4000; + level.cuavhackertoolradius = 40; + level.carepackagechopperhackertooltimems = 3000; + level.carepackagechopperhackertoolradius = 60; + level.littlebirdhackertooltimems = 4000; + level.littlebirdhackertoolradius = 80; + level.qrdronehackertooltimems = 3000; + level.qrdronehackertoolradius = 60; + level.aitankhackertooltimems = 4000; + level.aitankhackertoolradius = 60; + level.stealthchopperhackertooltimems = 4000; + level.stealthchopperhackertoolradius = 80; + level.warthoghackertooltimems = 4000; + level.warthoghackertoolradius = 80; + level.lodestarhackertooltimems = 4000; + level.lodestarhackertoolradius = 60; + level.choppergunnerhackertooltimems = 4000; + level.choppergunnerhackertoolradius = 260; + thread onplayerconnect(); } onplayerconnect() { - for ( ;; ) - { - level waittill( "connecting", player ); - player thread onplayerspawned(); - } + for (;;) + { + level waittill( "connecting", player ); + + player thread onplayerspawned(); + } } onplayerspawned() { - self endon( "disconnect" ); - for ( ;; ) - { - self waittill( "spawned_player" ); - self clearhackertarget(); - self thread watchhackertooluse(); - self thread watchhackertoolfired(); - } + self endon( "disconnect" ); + + for (;;) + { + self waittill( "spawned_player" ); + + self clearhackertarget(); + self thread watchhackertooluse(); + self thread watchhackertoolfired(); + } } clearhackertarget() { - self notify( "stop_lockon_sound" ); - self notify( "stop_locked_sound" ); - self.stingerlocksound = undefined; - self stoprumble( "stinger_lock_rumble" ); - self.hackertoollockstarttime = 0; - self.hackertoollockstarted = 0; - self.hackertoollockfinalized = 0; - self.hackertoollocktimeelapsed = 0; - self setweaponheatpercent( "pda_hack_mp", 0 ); - if ( isDefined( self.hackertooltarget ) ) - { - lockingon( self.hackertooltarget, 0 ); - lockedon( self.hackertooltarget, 0 ); - } - self.hackertooltarget = undefined; - self weaponlockfree(); - self weaponlocktargettooclose( 0 ); - self weaponlocknoclearance( 0 ); - self stoplocalsound( game[ "locking_on_sound" ] ); - self stoplocalsound( game[ "locked_on_sound" ] ); - self destroylockoncanceledmessage(); + self notify( "stop_lockon_sound" ); + self notify( "stop_locked_sound" ); + self.stingerlocksound = undefined; + self stoprumble( "stinger_lock_rumble" ); + self.hackertoollockstarttime = 0; + self.hackertoollockstarted = 0; + self.hackertoollockfinalized = 0; + self.hackertoollocktimeelapsed = 0.0; + self setweaponheatpercent( "pda_hack_mp", 0.0 ); + + if ( isdefined( self.hackertooltarget ) ) + { + lockingon( self.hackertooltarget, 0 ); + lockedon( self.hackertooltarget, 0 ); + } + + self.hackertooltarget = undefined; + self weaponlockfree(); + self weaponlocktargettooclose( 0 ); + self weaponlocknoclearance( 0 ); + self stoplocalsound( game["locking_on_sound"] ); + self stoplocalsound( game["locked_on_sound"] ); + self destroylockoncanceledmessage(); } watchhackertoolfired() { - self endon( "disconnect" ); - self endon( "death" ); - while ( 1 ) - { - self waittill( "hacker_tool_fired", hackertooltarget ); - if ( isDefined( hackertooltarget ) ) - { - if ( isentityhackablecarepackage( hackertooltarget ) ) - { - maps/mp/killstreaks/_supplydrop::givecratecapturemedal( hackertooltarget, self ); - hackertooltarget notify( "captured" ); - } - if ( isentityhackableweaponobject( hackertooltarget ) || isDefined( hackertooltarget.hackertrigger ) ) - { - hackertooltarget.hackertrigger notify( "trigger" ); - } - else - { - if ( isDefined( hackertooltarget.classname ) && hackertooltarget.classname == "grenade" ) - { - damage = 1; - } - else - { - if ( isDefined( hackertooltarget.maxhealth ) ) - { - damage = hackertooltarget.maxhealth + 1; - break; - } - else - { - damage = 999999; - } - } - if ( isDefined( hackertooltarget.numflares ) && hackertooltarget.numflares > 0 ) - { - damage = 1; - hackertooltarget.numflares--; + self endon( "disconnect" ); + self endon( "death" ); - hackertooltarget maps/mp/_heatseekingmissile::missiletarget_playflarefx(); - } - hackertooltarget dodamage( damage, self.origin, self, self, 0, "MOD_UNKNOWN", 0, "pda_hack_mp" ); - } - self addplayerstat( "hack_enemy_target", 1 ); - self addweaponstat( "pda_hack_mp", "used", 1 ); - } - clearhackertarget(); - self forceoffhandend(); - clip_ammo = self getweaponammoclip( "pda_hack_mp" ); - clip_ammo--; + while ( true ) + { + self waittill( "hacker_tool_fired", hackertooltarget ); + if ( isdefined( hackertooltarget ) ) + { + if ( isentityhackablecarepackage( hackertooltarget ) ) + { + maps\mp\killstreaks\_supplydrop::givecratecapturemedal( hackertooltarget, self ); + hackertooltarget notify( "captured", self, 1 ); + } + + if ( isentityhackableweaponobject( hackertooltarget ) || isdefined( hackertooltarget.hackertrigger ) ) + hackertooltarget.hackertrigger notify( "trigger", self, 1 ); + else + { + if ( isdefined( hackertooltarget.classname ) && hackertooltarget.classname == "grenade" ) + damage = 1; + else if ( isdefined( hackertooltarget.maxhealth ) ) + damage = hackertooltarget.maxhealth + 1; + else + damage = 999999; + + if ( isdefined( hackertooltarget.numflares ) && hackertooltarget.numflares > 0 ) + { + damage = 1; + hackertooltarget.numflares--; + hackertooltarget maps\mp\_heatseekingmissile::missiletarget_playflarefx(); + } + + hackertooltarget dodamage( damage, self.origin, self, self, 0, "MOD_UNKNOWN", 0, "pda_hack_mp" ); + } + + self addplayerstat( "hack_enemy_target", 1 ); + self addweaponstat( "pda_hack_mp", "used", 1 ); + } + + clearhackertarget(); + self forceoffhandend(); + clip_ammo = self getweaponammoclip( "pda_hack_mp" ); + clip_ammo--; /# - assert( clip_ammo >= 0 ); + assert( clip_ammo >= 0 ); #/ - self setweaponammoclip( "pda_hack_mp", clip_ammo ); - self switchtoweapon( self getlastweapon() ); - } + self setweaponammoclip( "pda_hack_mp", clip_ammo ); + self switchtoweapon( self getlastweapon() ); + } } watchhackertooluse() { - self endon( "disconnect" ); - self endon( "death" ); - for ( ;; ) - { - self waittill( "grenade_pullback", weapon ); - if ( weapon == "pda_hack_mp" ) - { - wait 0,05; - if ( self isusingoffhand() && self getcurrentoffhand() == "pda_hack_mp" ) - { - self thread hackertooltargetloop(); - self thread watchhackertoolend(); - self thread watchforgrenadefire(); - self thread watchhackertoolinterrupt(); - } - } - } + self endon( "disconnect" ); + self endon( "death" ); + + for (;;) + { + self waittill( "grenade_pullback", weapon ); + + if ( weapon == "pda_hack_mp" ) + { + wait 0.05; + + if ( self isusingoffhand() && self getcurrentoffhand() == "pda_hack_mp" ) + { + self thread hackertooltargetloop(); + self thread watchhackertoolend(); + self thread watchforgrenadefire(); + self thread watchhackertoolinterrupt(); + } + } + } } watchhackertoolinterrupt() { - self endon( "disconnect" ); - self endon( "hacker_tool_fired" ); - self endon( "death" ); - self endon( "weapon_change" ); - self endon( "grenade_fire" ); - while ( 1 ) - { - level waittill( "use_interrupt", interrupttarget ); - if ( self.hackertooltarget == interrupttarget ) - { - clearhackertarget(); - } - wait 0,05; - } + self endon( "disconnect" ); + self endon( "hacker_tool_fired" ); + self endon( "death" ); + self endon( "weapon_change" ); + self endon( "grenade_fire" ); + + while ( true ) + { + level waittill( "use_interrupt", interrupttarget ); + + if ( self.hackertooltarget == interrupttarget ) + clearhackertarget(); + + wait 0.05; + } } watchhackertoolend() { - self endon( "disconnect" ); - self endon( "hacker_tool_fired" ); - msg = self waittill_any_return( "weapon_change", "death" ); - clearhackertarget(); + self endon( "disconnect" ); + self endon( "hacker_tool_fired" ); + msg = self waittill_any_return( "weapon_change", "death" ); + clearhackertarget(); } watchforgrenadefire() { - self endon( "disconnect" ); - self endon( "hacker_tool_fired" ); - self endon( "weapon_change" ); - self endon( "death" ); - while ( 1 ) - { - self waittill( "grenade_fire", grenade, grenadename, respawnfromhack ); - if ( isDefined( respawnfromhack ) && respawnfromhack ) - { - continue; - } - clearhackertarget(); - clip_ammo = self getweaponammoclip( "pda_hack_mp" ); - clip_max_ammo = weaponclipsize( "pda_hack_mp" ); - if ( clip_ammo < clip_max_ammo ) - { - clip_ammo++; - } - self setweaponammoclip( "pda_hack_mp", clip_ammo ); - return; - } + self endon( "disconnect" ); + self endon( "hacker_tool_fired" ); + self endon( "weapon_change" ); + self endon( "death" ); + + while ( true ) + { + self waittill( "grenade_fire", grenade, grenadename, respawnfromhack ); + + if ( isdefined( respawnfromhack ) && respawnfromhack ) + continue; + + clearhackertarget(); + clip_ammo = self getweaponammoclip( "pda_hack_mp" ); + clip_max_ammo = weaponclipsize( "pda_hack_mp" ); + + if ( clip_ammo < clip_max_ammo ) + clip_ammo++; + + self setweaponammoclip( "pda_hack_mp", clip_ammo ); + break; + } } hackertooltargetloop() { - self endon( "disconnect" ); - self endon( "death" ); - self endon( "weapon_change" ); - self endon( "grenade_fire" ); - while ( 1 ) - { - wait 0,05; - if ( self.hackertoollockfinalized ) - { - while ( !self isvalidhackertooltarget( self.hackertooltarget ) ) - { - self clearhackertarget(); - } - passed = self hackersoftsighttest(); - while ( !passed ) - { - continue; - } - lockingon( self.hackertooltarget, 0 ); - lockedon( self.hackertooltarget, 1 ); - thread looplocallocksound( game[ "locked_on_sound" ], 0,75 ); - self notify( "hacker_tool_fired" ); - return; - } - while ( self.hackertoollockstarted ) - { - while ( !self isvalidhackertooltarget( self.hackertooltarget ) ) - { - self clearhackertarget(); - } - locklengthms = self gethacktime( self.hackertooltarget ); - while ( locklengthms == 0 ) - { - self clearhackertarget(); - } - if ( self.hackertoollocktimeelapsed == 0 ) - { - self playlocalsound( "evt_hacker_hacking" ); - } - lockingon( self.hackertooltarget, 1 ); - lockedon( self.hackertooltarget, 0 ); - passed = self hackersoftsighttest(); - while ( !passed ) - { - continue; - } - if ( self.hackertoollostsightlinetime == 0 ) - { - self.hackertoollocktimeelapsed += 0,05; - hackpercentage = self.hackertoollocktimeelapsed / ( locklengthms / 1000 ); - self setweaponheatpercent( "pda_hack_mp", hackpercentage ); - } - while ( self.hackertoollocktimeelapsed < ( locklengthms / 1000 ) ) - { - continue; - } + self endon( "disconnect" ); + self endon( "death" ); + self endon( "weapon_change" ); + self endon( "grenade_fire" ); + + while ( true ) + { + wait 0.05; + + if ( self.hackertoollockfinalized ) + { + if ( !self isvalidhackertooltarget( self.hackertooltarget ) ) + { + self clearhackertarget(); + continue; + } + + passed = self hackersoftsighttest(); + + if ( !passed ) + continue; + + lockingon( self.hackertooltarget, 0 ); + lockedon( self.hackertooltarget, 1 ); + thread looplocallocksound( game["locked_on_sound"], 0.75 ); + self notify( "hacker_tool_fired", self.hackertooltarget ); + return; + } + + if ( self.hackertoollockstarted ) + { + if ( !self isvalidhackertooltarget( self.hackertooltarget ) ) + { + self clearhackertarget(); + continue; + } + + locklengthms = self gethacktime( self.hackertooltarget ); + + if ( locklengthms == 0 ) + { + self clearhackertarget(); + continue; + } + + if ( self.hackertoollocktimeelapsed == 0.0 ) + self playlocalsound( "evt_hacker_hacking" ); + + lockingon( self.hackertooltarget, 1 ); + lockedon( self.hackertooltarget, 0 ); + passed = self hackersoftsighttest(); + + if ( !passed ) + continue; + + if ( self.hackertoollostsightlinetime == 0 ) + { + self.hackertoollocktimeelapsed += 0.05; + hackpercentage = self.hackertoollocktimeelapsed / ( locklengthms / 1000 ); + self setweaponheatpercent( "pda_hack_mp", hackpercentage ); + } + + if ( self.hackertoollocktimeelapsed < locklengthms / 1000 ) + continue; /# - assert( isDefined( self.hackertooltarget ) ); + assert( isdefined( self.hackertooltarget ) ); #/ - self notify( "stop_lockon_sound" ); - self.hackertoollockfinalized = 1; - self weaponlockfinalize( self.hackertooltarget ); - } - besttarget = self getbesthackertooltarget(); - while ( !isDefined( besttarget ) ) - { - self destroylockoncanceledmessage(); - } - while ( !self locksighttest( besttarget ) && distance2d( self.origin, besttarget.origin ) > level.hackertoolnosighthackdistance ) - { - self destroylockoncanceledmessage(); - } - while ( self locksighttest( besttarget ) && isDefined( besttarget.lockondelay ) && besttarget.lockondelay ) - { - self displaylockoncanceledmessage(); - } - self destroylockoncanceledmessage(); - initlockfield( besttarget ); - self.hackertooltarget = besttarget; - self.hackertoollockstarttime = getTime(); - self.hackertoollockstarted = 1; - self.hackertoollostsightlinetime = 0; - self.hackertoollocktimeelapsed = 0; - self setweaponheatpercent( "pda_hack_mp", 0 ); - self thread looplocalseeksound( game[ "locking_on_sound" ], 0,6 ); - } + self notify( "stop_lockon_sound" ); + self.hackertoollockfinalized = 1; + self weaponlockfinalize( self.hackertooltarget ); + continue; + } + + besttarget = self getbesthackertooltarget(); + + if ( !isdefined( besttarget ) ) + { + self destroylockoncanceledmessage(); + continue; + } + + if ( !self locksighttest( besttarget ) && distance2d( self.origin, besttarget.origin ) > level.hackertoolnosighthackdistance ) + { + self destroylockoncanceledmessage(); + continue; + } + + if ( self locksighttest( besttarget ) && isdefined( besttarget.lockondelay ) && besttarget.lockondelay ) + { + self displaylockoncanceledmessage(); + continue; + } + + self destroylockoncanceledmessage(); + initlockfield( besttarget ); + self.hackertooltarget = besttarget; + self.hackertoollockstarttime = gettime(); + self.hackertoollockstarted = 1; + self.hackertoollostsightlinetime = 0; + self.hackertoollocktimeelapsed = 0.0; + self setweaponheatpercent( "pda_hack_mp", 0.0 ); + self thread looplocalseeksound( game["locking_on_sound"], 0.6 ); + } } getbesthackertooltarget() { - targetsvalid = []; - targetsall = arraycombine( target_getarray(), level.missileentities, 0, 0 ); - targetsall = arraycombine( targetsall, level.hackertooltargets, 0, 0 ); - idx = 0; - while ( idx < targetsall.size ) - { - target_ent = targetsall[ idx ]; - if ( !isDefined( target_ent ) || !isDefined( target_ent.owner ) ) - { - idx++; - continue; - } - else - { + targetsvalid = []; + targetsall = arraycombine( target_getarray(), level.missileentities, 0, 0 ); + targetsall = arraycombine( targetsall, level.hackertooltargets, 0, 0 ); + + for ( idx = 0; idx < targetsall.size; idx++ ) + { + target_ent = targetsall[idx]; + + if ( !isdefined( target_ent ) || !isdefined( target_ent.owner ) ) + continue; /# - if ( getDvar( "scr_freelock" ) == "1" ) - { - if ( self iswithinhackertoolreticle( targetsall[ idx ] ) ) - { - targetsvalid[ targetsvalid.size ] = targetsall[ idx ]; - } - idx++; - continue; + if ( getdvar( "scr_freelock" ) == "1" ) + { + if ( self iswithinhackertoolreticle( targetsall[idx] ) ) + targetsvalid[targetsvalid.size] = targetsall[idx]; + + continue; + } #/ - } - else if ( level.teambased ) - { - if ( isentityhackablecarepackage( target_ent ) ) - { - if ( self iswithinhackertoolreticle( target_ent ) ) - { - targetsvalid[ targetsvalid.size ] = target_ent; - } - } - else if ( isDefined( target_ent.team ) ) - { - if ( target_ent.team != self.team ) - { - if ( self iswithinhackertoolreticle( target_ent ) ) - { - targetsvalid[ targetsvalid.size ] = target_ent; - } - } - } - else - { - if ( isDefined( target_ent.owner.team ) ) - { - if ( target_ent.owner.team != self.team ) - { - if ( self iswithinhackertoolreticle( target_ent ) ) - { - targetsvalid[ targetsvalid.size ] = target_ent; - } - } - } - } - idx++; - continue; - } - else if ( self iswithinhackertoolreticle( target_ent ) ) - { - if ( isentityhackablecarepackage( target_ent ) ) - { - targetsvalid[ targetsvalid.size ] = target_ent; - idx++; - continue; - } - else - { - if ( isDefined( target_ent.owner ) && self != target_ent.owner ) - { - targetsvalid[ targetsvalid.size ] = target_ent; - } - } - } - } - idx++; - } - chosenent = undefined; - if ( targetsvalid.size != 0 ) - { - chosenent = targetsvalid[ 0 ]; - } - return chosenent; + if ( level.teambased ) + { + if ( isentityhackablecarepackage( target_ent ) ) + { + if ( self iswithinhackertoolreticle( target_ent ) ) + targetsvalid[targetsvalid.size] = target_ent; + } + else if ( isdefined( target_ent.team ) ) + { + if ( target_ent.team != self.team ) + { + if ( self iswithinhackertoolreticle( target_ent ) ) + targetsvalid[targetsvalid.size] = target_ent; + } + } + else if ( isdefined( target_ent.owner.team ) ) + { + if ( target_ent.owner.team != self.team ) + { + if ( self iswithinhackertoolreticle( target_ent ) ) + targetsvalid[targetsvalid.size] = target_ent; + } + } + + continue; + } + + if ( self iswithinhackertoolreticle( target_ent ) ) + { + if ( isentityhackablecarepackage( target_ent ) ) + { + targetsvalid[targetsvalid.size] = target_ent; + continue; + } + + if ( isdefined( target_ent.owner ) && self != target_ent.owner ) + targetsvalid[targetsvalid.size] = target_ent; + } + } + + chosenent = undefined; + + if ( targetsvalid.size != 0 ) + chosenent = targetsvalid[0]; + + return chosenent; } iswithinhackertoolreticle( target ) { - radius = gethackertoolradius( target ); - return target_isincircle( target, self, level.hackertoollockonfov, radius, 0 ); + radius = gethackertoolradius( target ); + return target_isincircle( target, self, level.hackertoollockonfov, radius, 0.0 ); } isentityhackableweaponobject( entity ) { - if ( isDefined( entity.classname ) && entity.classname == "grenade" ) - { - if ( isDefined( entity.name ) ) - { - watcher = maps/mp/gametypes/_weaponobjects::getweaponobjectwatcherbyweapon( entity.name ); - if ( isDefined( watcher ) ) - { - if ( watcher.hackable ) - { + if ( isdefined( entity.classname ) && entity.classname == "grenade" ) + { + if ( isdefined( entity.name ) ) + { + watcher = maps\mp\gametypes\_weaponobjects::getweaponobjectwatcherbyweapon( entity.name ); + + if ( isdefined( watcher ) ) + { + if ( watcher.hackable ) + { /# - assert( isDefined( watcher.hackertoolradius ) ); - assert( isDefined( watcher.hackertooltimems ) ); + assert( isdefined( watcher.hackertoolradius ) ); + assert( isdefined( watcher.hackertooltimems ) ); #/ - return 1; - } - } - } - } - return 0; + return true; + } + } + } + } + + return false; } getweaponobjecthackerradius( entity ) { /# - assert( isDefined( entity.classname ) ); - assert( isDefined( entity.name ) ); + assert( isdefined( entity.classname ) ); + assert( isdefined( entity.name ) ); #/ - watcher = maps/mp/gametypes/_weaponobjects::getweaponobjectwatcherbyweapon( entity.name ); + watcher = maps\mp\gametypes\_weaponobjects::getweaponobjectwatcherbyweapon( entity.name ); /# - assert( watcher.hackable ); - assert( isDefined( watcher.hackertoolradius ) ); + assert( watcher.hackable ); + assert( isdefined( watcher.hackertoolradius ) ); #/ - return watcher.hackertoolradius; + return watcher.hackertoolradius; } getweaponobjecthacktimems( entity ) { /# - assert( isDefined( entity.classname ) ); - assert( isDefined( entity.name ) ); + assert( isdefined( entity.classname ) ); + assert( isdefined( entity.name ) ); #/ - watcher = maps/mp/gametypes/_weaponobjects::getweaponobjectwatcherbyweapon( entity.name ); + watcher = maps\mp\gametypes\_weaponobjects::getweaponobjectwatcherbyweapon( entity.name ); /# - assert( watcher.hackable ); - assert( isDefined( watcher.hackertooltimems ) ); + assert( watcher.hackable ); + assert( isdefined( watcher.hackertooltimems ) ); #/ - return watcher.hackertooltimems; + return watcher.hackertooltimems; } isentityhackablecarepackage( entity ) { - if ( isDefined( entity.model ) ) - { - return entity.model == "t6_wpn_supply_drop_ally"; - } - else - { - return 0; - } + if ( isdefined( entity.model ) ) + return entity.model == "t6_wpn_supply_drop_ally"; + else + return 0; } isvalidhackertooltarget( ent ) { - if ( !isDefined( ent ) ) - { - return 0; - } - if ( self isusingremote() ) - { - return 0; - } - if ( self isempjammed() ) - { - return 0; - } - if ( !target_istarget( ent ) && !isentityhackableweaponobject( ent ) && !isinarray( level.hackertooltargets, ent ) ) - { - return 0; - } - if ( isentityhackableweaponobject( ent ) ) - { - if ( distancesquared( self.origin, ent.origin ) > level.hackertoolmaxequipmentdistancesq ) - { - return 0; - } - } - return 1; + if ( !isdefined( ent ) ) + return false; + + if ( self isusingremote() ) + return false; + + if ( self isempjammed() ) + return false; + + if ( !target_istarget( ent ) && !isentityhackableweaponobject( ent ) && !isinarray( level.hackertooltargets, ent ) ) + return false; + + if ( isentityhackableweaponobject( ent ) ) + { + if ( distancesquared( self.origin, ent.origin ) > level.hackertoolmaxequipmentdistancesq ) + return false; + } + + return true; } hackersoftsighttest() { - passed = 1; - locklengthms = 0; - if ( isDefined( self.hackertooltarget ) ) - { - locklengthms = self gethacktime( self.hackertooltarget ); - } - if ( self isempjammed() || locklengthms == 0 ) - { - self clearhackertarget(); - passed = 0; - } - else - { - if ( iswithinhackertoolreticle( self.hackertooltarget ) ) - { - self.hackertoollostsightlinetime = 0; - } - else - { - if ( self.hackertoollostsightlinetime == 0 ) - { - self.hackertoollostsightlinetime = getTime(); - } - timepassed = getTime() - self.hackertoollostsightlinetime; - if ( timepassed >= level.hackertoollostsightlimitms ) - { - self clearhackertarget(); - passed = 0; - } - } - } - return passed; + passed = 1; + locklengthms = 0; + + if ( isdefined( self.hackertooltarget ) ) + locklengthms = self gethacktime( self.hackertooltarget ); + + if ( self isempjammed() || locklengthms == 0 ) + { + self clearhackertarget(); + passed = 0; + } + else if ( iswithinhackertoolreticle( self.hackertooltarget ) ) + self.hackertoollostsightlinetime = 0; + else + { + if ( self.hackertoollostsightlinetime == 0 ) + self.hackertoollostsightlinetime = gettime(); + + timepassed = gettime() - self.hackertoollostsightlinetime; + + if ( timepassed >= level.hackertoollostsightlimitms ) + { + self clearhackertarget(); + passed = 0; + } + } + + return passed; } registerwithhackertool( radius, hacktimems ) { - self endon( "death" ); - if ( isDefined( radius ) ) - { - self.hackertoolradius = radius; - } - else - { - self.hackertoolradius = level.hackertoollockonradius; - } - if ( isDefined( hacktimems ) ) - { - self.hackertooltimems = hacktimems; - } - else - { - self.hackertooltimems = level.hackertoolhacktimems; - } - self thread watchhackableentitydeath(); - level.hackertooltargets[ level.hackertooltargets.size ] = self; + self endon( "death" ); + + if ( isdefined( radius ) ) + self.hackertoolradius = radius; + else + self.hackertoolradius = level.hackertoollockonradius; + + if ( isdefined( hacktimems ) ) + self.hackertooltimems = hacktimems; + else + self.hackertooltimems = level.hackertoolhacktimems; + + self thread watchhackableentitydeath(); + level.hackertooltargets[level.hackertooltargets.size] = self; } watchhackableentitydeath() { - self waittill( "death" ); - arrayremovevalue( level.hackertooltargets, self ); + self waittill( "death" ); + + arrayremovevalue( level.hackertooltargets, self ); } gethackertoolradius( target ) { - radius = 20; - if ( isentityhackablecarepackage( target ) ) - { + radius = 20; + + if ( isentityhackablecarepackage( target ) ) + { /# - assert( isDefined( target.hackertoolradius ) ); + assert( isdefined( target.hackertoolradius ) ); #/ - radius = target.hackertoolradius; - break; -} -else if ( isentityhackableweaponobject( target ) ) -{ - radius = getweaponobjecthackerradius( target ); - break; -} -else if ( isDefined( target.hackertoolradius ) ) -{ -radius = target.hackertoolradius; -break; -} -else radius = level.vehiclehackertoolradius; -switch( target.model ) -{ -case "veh_t6_drone_uav": -radius = level.uavhackertoolradius; -break; -case "veh_t6_drone_cuav": -radius = level.cuavhackertoolradius; -break; -case "t5_veh_rcbomb_axis": -radius = level.rcxdhackertoolradius; -break; -case "veh_iw_mh6_littlebird_mp": -radius = level.carepackagechopperhackertoolradius; -break; -case "veh_t6_drone_quad_rotor_mp": -case "veh_t6_drone_quad_rotor_mp_alt": -radius = level.qrdronehackertoolradius; -break; -case "veh_t6_drone_tank": -case "veh_t6_drone_tank_alt": -radius = level.aitankhackertoolradius; -break; -case "veh_t6_air_attack_heli_mp_dark": -case "veh_t6_air_attack_heli_mp_light": -radius = level.stealthchopperhackertoolradius; -break; -case "veh_t6_drone_overwatch_dark": -case "veh_t6_drone_overwatch_light": -radius = level.littlebirdhackertoolradius; -break; -case "veh_t6_drone_pegasus": -radius = level.lodestarhackertoolradius; -break; -case "veh_iw_air_apache_killstreak": -radius = level.choppergunnerhackertoolradius; -break; -case "veh_t6_air_a10f": -case "veh_t6_air_a10f_alt": -radius = level.warthoghackertoolradius; -break; -} -return radius; + radius = target.hackertoolradius; + } + else if ( isentityhackableweaponobject( target ) ) + radius = getweaponobjecthackerradius( target ); + else if ( isdefined( target.hackertoolradius ) ) + radius = target.hackertoolradius; + else + { + radius = level.vehiclehackertoolradius; + + switch ( target.model ) + { + case "veh_t6_drone_uav": + radius = level.uavhackertoolradius; + break; + case "veh_t6_drone_cuav": + radius = level.cuavhackertoolradius; + break; + case "t5_veh_rcbomb_axis": + radius = level.rcxdhackertoolradius; + break; + case "veh_iw_mh6_littlebird_mp": + radius = level.carepackagechopperhackertoolradius; + break; + case "veh_t6_drone_quad_rotor_mp_alt": + case "veh_t6_drone_quad_rotor_mp": + radius = level.qrdronehackertoolradius; + break; + case "veh_t6_drone_tank_alt": + case "veh_t6_drone_tank": + radius = level.aitankhackertoolradius; + break; + case "veh_t6_air_attack_heli_mp_light": + case "veh_t6_air_attack_heli_mp_dark": + radius = level.stealthchopperhackertoolradius; + break; + case "veh_t6_drone_overwatch_light": + case "veh_t6_drone_overwatch_dark": + radius = level.littlebirdhackertoolradius; + break; + case "veh_t6_drone_pegasus": + radius = level.lodestarhackertoolradius; + break; + case "veh_iw_air_apache_killstreak": + radius = level.choppergunnerhackertoolradius; + break; + case "veh_t6_air_a10f_alt": + case "veh_t6_air_a10f": + radius = level.warthoghackertoolradius; + break; + } + } + + return radius; } gethacktime( target ) { - time = 500; - if ( isentityhackablecarepackage( target ) ) - { + time = 500; + + if ( isentityhackablecarepackage( target ) ) + { /# - assert( isDefined( target.hackertooltimems ) ); + assert( isdefined( target.hackertooltimems ) ); #/ - if ( isDefined( target.owner ) && target.owner == self ) - { - time = level.carepackageownerhackertooltimems; - } - else - { - if ( isDefined( target.owner ) && target.owner.team == self.team ) - { - time = level.carepackagefriendlyhackertooltimems; - } - else - { - time = level.carepackagehackertooltimems; - } - } - break; -} -else if ( isentityhackableweaponobject( target ) ) -{ - time = getweaponobjecthacktimems( target ); - break; -} -else if ( isDefined( target.hackertooltimems ) ) -{ -time = target.hackertooltimems; -break; -} -else time = level.vehiclehackertooltimems; -switch( target.model ) -{ -case "veh_t6_drone_uav": -time = level.uavhackertooltimems; -break; -case "veh_t6_drone_cuav": -time = level.cuavhackertooltimems; -break; -case "t5_veh_rcbomb_axis": -time = level.rcxdhackertooltimems; -break; -case "veh_t6_drone_supply_alt": -case "veh_t6_drone_supply_alt": -time = level.carepackagechopperhackertooltimems; -break; -case "veh_t6_drone_quad_rotor_mp": -case "veh_t6_drone_quad_rotor_mp_alt": -time = level.qrdronehackertooltimems; -break; -case "veh_t6_drone_tank": -case "veh_t6_drone_tank_alt": -time = level.aitankhackertooltimems; -break; -case "veh_t6_air_attack_heli_mp_dark": -case "veh_t6_air_attack_heli_mp_light": -time = level.stealthchopperhackertooltimems; -break; -case "veh_t6_drone_overwatch_dark": -case "veh_t6_drone_overwatch_light": -time = level.littlebirdhackertooltimems; -break; -case "veh_t6_drone_pegasus": -time = level.lodestarhackertooltimems; -break; -case "veh_t6_air_v78_vtol_killstreak": -case "veh_t6_air_v78_vtol_killstreak_alt": -time = level.choppergunnerhackertooltimems; -break; -case "veh_t6_air_a10f": -case "veh_t6_air_a10f_alt": -time = level.warthoghackertooltimems; -break; -} -return time; + if ( isdefined( target.owner ) && target.owner == self ) + time = level.carepackageownerhackertooltimems; + else if ( isdefined( target.owner ) && target.owner.team == self.team ) + time = level.carepackagefriendlyhackertooltimems; + else + time = level.carepackagehackertooltimems; + } + else if ( isentityhackableweaponobject( target ) ) + time = getweaponobjecthacktimems( target ); + else if ( isdefined( target.hackertooltimems ) ) + time = target.hackertooltimems; + else + { + time = level.vehiclehackertooltimems; + + switch ( target.model ) + { + case "veh_t6_drone_uav": + time = level.uavhackertooltimems; + break; + case "veh_t6_drone_cuav": + time = level.cuavhackertooltimems; + break; + case "t5_veh_rcbomb_axis": + time = level.rcxdhackertooltimems; + break; + case "veh_t6_drone_supply_alt": + case "veh_t6_drone_supply_alt": + time = level.carepackagechopperhackertooltimems; + break; + case "veh_t6_drone_quad_rotor_mp_alt": + case "veh_t6_drone_quad_rotor_mp": + time = level.qrdronehackertooltimems; + break; + case "veh_t6_drone_tank_alt": + case "veh_t6_drone_tank": + time = level.aitankhackertooltimems; + break; + case "veh_t6_air_attack_heli_mp_light": + case "veh_t6_air_attack_heli_mp_dark": + time = level.stealthchopperhackertooltimems; + break; + case "veh_t6_drone_overwatch_light": + case "veh_t6_drone_overwatch_dark": + time = level.littlebirdhackertooltimems; + break; + case "veh_t6_drone_pegasus": + time = level.lodestarhackertooltimems; + break; + case "veh_t6_air_v78_vtol_killstreak_alt": + case "veh_t6_air_v78_vtol_killstreak": + time = level.choppergunnerhackertooltimems; + break; + case "veh_t6_air_a10f_alt": + case "veh_t6_air_a10f": + time = level.warthoghackertooltimems; + break; + } + } + + return time; } tunables() { /# - while ( 1 ) - { - level.hackertoollostsightlimitms = weapons_get_dvar_int( "scr_hackerToolLostSightLimitMs", 1000 ); - level.hackertoollockonradius = weapons_get_dvar( "scr_hackerToolLockOnRadius", 20 ); - level.hackertoollockonfov = weapons_get_dvar_int( "scr_hackerToolLockOnFOV", 65 ); - level.rcxd_time = weapons_get_dvar( "scr_rcxd_time", 1,5 ); - level.uav_time = weapons_get_dvar_int( "scr_uav_time", 4 ); - level.cuav_time = weapons_get_dvar_int( "scr_cuav_time", 4 ); - level.care_package_chopper_time = weapons_get_dvar_int( "scr_care_package_chopper_time", 3 ); - level.guardian_time = weapons_get_dvar_int( "scr_guardian_time", 5 ); - level.sentry_time = weapons_get_dvar_int( "scr_sentry_time", 5 ); - level.wasp_time = weapons_get_dvar_int( "scr_wasp_time", 5 ); - level.agr_time = weapons_get_dvar_int( "scr_agr_time", 5 ); - level.stealth_helicopter_time = weapons_get_dvar_int( "scr_stealth_helicopter_time", 7 ); - level.escort_drone_time = weapons_get_dvar_int( "scr_escort_drone_time", 7 ); - level.warthog_time = weapons_get_dvar_int( "scr_warthog_time", 7 ); - level.lodestar_time = weapons_get_dvar_int( "scr_lodestar_time", 7 ); - level.chopper_gunner_time = weapons_get_dvar_int( "scr_chopper_gunner_time", 7 ); - wait 1; + while ( true ) + { + level.hackertoollostsightlimitms = weapons_get_dvar_int( "scr_hackerToolLostSightLimitMs", 1000 ); + level.hackertoollockonradius = weapons_get_dvar( "scr_hackerToolLockOnRadius", 20 ); + level.hackertoollockonfov = weapons_get_dvar_int( "scr_hackerToolLockOnFOV", 65 ); + level.rcxd_time = weapons_get_dvar( "scr_rcxd_time", 1.5 ); + level.uav_time = weapons_get_dvar_int( "scr_uav_time", 4 ); + level.cuav_time = weapons_get_dvar_int( "scr_cuav_time", 4 ); + level.care_package_chopper_time = weapons_get_dvar_int( "scr_care_package_chopper_time", 3 ); + level.guardian_time = weapons_get_dvar_int( "scr_guardian_time", 5 ); + level.sentry_time = weapons_get_dvar_int( "scr_sentry_time", 5 ); + level.wasp_time = weapons_get_dvar_int( "scr_wasp_time", 5 ); + level.agr_time = weapons_get_dvar_int( "scr_agr_time", 5 ); + level.stealth_helicopter_time = weapons_get_dvar_int( "scr_stealth_helicopter_time", 7 ); + level.escort_drone_time = weapons_get_dvar_int( "scr_escort_drone_time", 7 ); + level.warthog_time = weapons_get_dvar_int( "scr_warthog_time", 7 ); + level.lodestar_time = weapons_get_dvar_int( "scr_lodestar_time", 7 ); + level.chopper_gunner_time = weapons_get_dvar_int( "scr_chopper_gunner_time", 7 ); + wait 1.0; + } #/ - } } diff --git a/Multiplayer Core/patch_mp/maps/mp/_heatseekingmissile.gsc b/Multiplayer Core/patch_mp/maps/mp/_heatseekingmissile.gsc index a9dc455..2292601 100644 --- a/Multiplayer Core/patch_mp/maps/mp/_heatseekingmissile.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/_heatseekingmissile.gsc @@ -1,688 +1,687 @@ -#include maps/mp/killstreaks/_airsupport; -#include maps/mp/killstreaks/_helicopter; -#include maps/mp/gametypes/_weapon_utils; -#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\_weapon_utils; +#include maps\mp\killstreaks\_helicopter; +#include maps\mp\killstreaks\_airsupport; init() { - precacherumble( "stinger_lock_rumble" ); - game[ "locking_on_sound" ] = "uin_alert_lockon_start"; - game[ "locked_on_sound" ] = "uin_alert_lockon"; - precachestring( &"MP_CANNOT_LOCKON_TO_TARGET" ); - thread onplayerconnect(); - level.fx_flare = loadfx( "vehicle/vexplosion/fx_heli_chaff" ); + precacherumble( "stinger_lock_rumble" ); + game["locking_on_sound"] = "uin_alert_lockon_start"; + game["locked_on_sound"] = "uin_alert_lockon"; + precachestring( &"MP_CANNOT_LOCKON_TO_TARGET" ); + thread onplayerconnect(); + level.fx_flare = loadfx( "vehicle/vexplosion/fx_heli_chaff" ); /# - setdvar( "scr_freelock", "0" ); + setdvar( "scr_freelock", "0" ); #/ } onplayerconnect() { - for ( ;; ) - { - level waittill( "connecting", player ); - player thread onplayerspawned(); - } + for (;;) + { + level waittill( "connecting", player ); + + player thread onplayerspawned(); + } } onplayerspawned() { - self endon( "disconnect" ); - for ( ;; ) - { - self waittill( "spawned_player" ); - self clearirtarget(); - thread stingertoggleloop(); - self thread stingerfirednotify(); - } + self endon( "disconnect" ); + + for (;;) + { + self waittill( "spawned_player" ); + + self clearirtarget(); + thread stingertoggleloop(); + self thread stingerfirednotify(); + } } clearirtarget() { - self notify( "stinger_irt_cleartarget" ); - self notify( "stop_lockon_sound" ); - self notify( "stop_locked_sound" ); - self.stingerlocksound = undefined; - self stoprumble( "stinger_lock_rumble" ); - self.stingerlockstarttime = 0; - self.stingerlockstarted = 0; - self.stingerlockfinalized = 0; - if ( isDefined( self.stingertarget ) ) - { - lockingon( self.stingertarget, 0 ); - lockedon( self.stingertarget, 0 ); - } - self.stingertarget = undefined; - self weaponlockfree(); - self weaponlocktargettooclose( 0 ); - self weaponlocknoclearance( 0 ); - self stoplocalsound( game[ "locking_on_sound" ] ); - self stoplocalsound( game[ "locked_on_sound" ] ); - self destroylockoncanceledmessage(); + self notify( "stinger_irt_cleartarget" ); + self notify( "stop_lockon_sound" ); + self notify( "stop_locked_sound" ); + self.stingerlocksound = undefined; + self stoprumble( "stinger_lock_rumble" ); + self.stingerlockstarttime = 0; + self.stingerlockstarted = 0; + self.stingerlockfinalized = 0; + + if ( isdefined( self.stingertarget ) ) + { + lockingon( self.stingertarget, 0 ); + lockedon( self.stingertarget, 0 ); + } + + self.stingertarget = undefined; + self weaponlockfree(); + self weaponlocktargettooclose( 0 ); + self weaponlocknoclearance( 0 ); + self stoplocalsound( game["locking_on_sound"] ); + self stoplocalsound( game["locked_on_sound"] ); + self destroylockoncanceledmessage(); } stingerfirednotify() { - self endon( "disconnect" ); - self endon( "death" ); - while ( 1 ) - { - self waittill( "missile_fire", missile, weap ); - if ( maps/mp/gametypes/_weapon_utils::isguidedrocketlauncherweapon( weap ) ) - { - if ( isDefined( self.stingertarget ) && self.stingerlockfinalized ) - { - self.stingertarget notify( "stinger_fired_at_me" ); - } - level notify( "missile_fired" ); - self notify( "stinger_fired" ); - } - } + self endon( "disconnect" ); + self endon( "death" ); + + while ( true ) + { + self waittill( "missile_fire", missile, weap ); + + if ( maps\mp\gametypes\_weapon_utils::isguidedrocketlauncherweapon( weap ) ) + { + if ( isdefined( self.stingertarget ) && self.stingerlockfinalized ) + self.stingertarget notify( "stinger_fired_at_me", missile, weap, self ); + + level notify( "missile_fired", self, missile, self.stingertarget, self.stingerlockfinalized ); + self notify( "stinger_fired", missile, weap ); + } + } } stingertoggleloop() { - self endon( "disconnect" ); - self endon( "death" ); - for ( ;; ) - { - self waittill( "weapon_change", weapon ); - while ( maps/mp/gametypes/_weapon_utils::isguidedrocketlauncherweapon( weapon ) ) - { - abort = 0; - while ( !self playerstingerads() ) - { - wait 0,05; - if ( !maps/mp/gametypes/_weapon_utils::isguidedrocketlauncherweapon( self getcurrentweapon() ) ) - { - abort = 1; - break; - } - else - { - } - } - if ( abort ) - { - break; - } - else self thread stingerirtloop(); - while ( self playerstingerads() ) - { - wait 0,05; - } - self notify( "stinger_IRT_off" ); - self clearirtarget(); - weapon = self getcurrentweapon(); - } - } + self endon( "disconnect" ); + self endon( "death" ); + + for (;;) + { + self waittill( "weapon_change", weapon ); + + while ( maps\mp\gametypes\_weapon_utils::isguidedrocketlauncherweapon( weapon ) ) + { + abort = 0; + + while ( !self playerstingerads() ) + { + wait 0.05; + + if ( !maps\mp\gametypes\_weapon_utils::isguidedrocketlauncherweapon( self getcurrentweapon() ) ) + { + abort = 1; + break; + } + } + + if ( abort ) + break; + + self thread stingerirtloop(); + + while ( self playerstingerads() ) + wait 0.05; + + self notify( "stinger_IRT_off" ); + self clearirtarget(); + weapon = self getcurrentweapon(); + } + } } stingerirtloop() { - self endon( "disconnect" ); - self endon( "death" ); - self endon( "stinger_IRT_off" ); - locklength = self getlockonspeed(); - for ( ;; ) - { - wait 0,05; - if ( self.stingerlockfinalized ) - { - passed = softsighttest(); - if ( !passed ) - { - continue; - } - else if ( !isstillvalidtarget( self.stingertarget ) ) - { - self clearirtarget(); - continue; - } - else if ( !self.stingertarget.locked_on ) - { - self.stingertarget notify( "missile_lock" ); - } - lockingon( self.stingertarget, 0 ); - lockedon( self.stingertarget, 1 ); - thread looplocallocksound( game[ "locked_on_sound" ], 0,75 ); - continue; - } - else if ( self.stingerlockstarted ) - { - if ( !isstillvalidtarget( self.stingertarget ) ) - { - self clearirtarget(); - continue; - } - else lockingon( self.stingertarget, 1 ); - lockedon( self.stingertarget, 0 ); - passed = softsighttest(); - if ( !passed ) - { - continue; - } - else timepassed = getTime() - self.stingerlockstarttime; - if ( timepassed < locklength ) - { - continue; - } - else /# - assert( isDefined( self.stingertarget ) ); + self endon( "disconnect" ); + self endon( "death" ); + self endon( "stinger_IRT_off" ); + locklength = self getlockonspeed(); + + for (;;) + { + wait 0.05; + + if ( self.stingerlockfinalized ) + { + passed = softsighttest(); + + if ( !passed ) + continue; + + if ( !isstillvalidtarget( self.stingertarget ) ) + { + self clearirtarget(); + continue; + } + + if ( !self.stingertarget.locked_on ) + self.stingertarget notify( "missile_lock", self ); + + lockingon( self.stingertarget, 0 ); + lockedon( self.stingertarget, 1 ); + thread looplocallocksound( game["locked_on_sound"], 0.75 ); + continue; + } + + if ( self.stingerlockstarted ) + { + if ( !isstillvalidtarget( self.stingertarget ) ) + { + self clearirtarget(); + continue; + } + + lockingon( self.stingertarget, 1 ); + lockedon( self.stingertarget, 0 ); + passed = softsighttest(); + + if ( !passed ) + continue; + + timepassed = gettime() - self.stingerlockstarttime; + + if ( timepassed < locklength ) + continue; +/# + assert( isdefined( self.stingertarget ) ); #/ - self notify( "stop_lockon_sound" ); - self.stingerlockfinalized = 1; - self weaponlockfinalize( self.stingertarget ); - continue; - } - else besttarget = self getbeststingertarget(); - if ( !isDefined( besttarget ) ) - { - self destroylockoncanceledmessage(); - continue; - } - else if ( !self locksighttest( besttarget ) ) - { - self destroylockoncanceledmessage(); - continue; - } - else if ( self locksighttest( besttarget ) && isDefined( besttarget.lockondelay ) && besttarget.lockondelay ) - { - self displaylockoncanceledmessage(); - continue; - } - else - { - self destroylockoncanceledmessage(); - initlockfield( besttarget ); - self.stingertarget = besttarget; - self.stingerlockstarttime = getTime(); - self.stingerlockstarted = 1; - self.stingerlostsightlinetime = 0; - self thread looplocalseeksound( game[ "locking_on_sound" ], 0,6 ); - } - } + self notify( "stop_lockon_sound" ); + self.stingerlockfinalized = 1; + self weaponlockfinalize( self.stingertarget ); + continue; + } + + besttarget = self getbeststingertarget(); + + if ( !isdefined( besttarget ) ) + { + self destroylockoncanceledmessage(); + continue; + } + + if ( !self locksighttest( besttarget ) ) + { + self destroylockoncanceledmessage(); + continue; + } + + if ( self locksighttest( besttarget ) && isdefined( besttarget.lockondelay ) && besttarget.lockondelay ) + { + self displaylockoncanceledmessage(); + continue; + } + + self destroylockoncanceledmessage(); + initlockfield( besttarget ); + self.stingertarget = besttarget; + self.stingerlockstarttime = gettime(); + self.stingerlockstarted = 1; + self.stingerlostsightlinetime = 0; + self thread looplocalseeksound( game["locking_on_sound"], 0.6 ); + } } destroylockoncanceledmessage() { - if ( isDefined( self.lockoncanceledmessage ) ) - { - self.lockoncanceledmessage destroy(); - } + if ( isdefined( self.lockoncanceledmessage ) ) + self.lockoncanceledmessage destroy(); } displaylockoncanceledmessage() { - if ( isDefined( self.lockoncanceledmessage ) ) - { - return; - } - self.lockoncanceledmessage = newclienthudelem( self ); - self.lockoncanceledmessage.fontscale = 1,25; - self.lockoncanceledmessage.x = 0; - self.lockoncanceledmessage.y = 50; - self.lockoncanceledmessage.alignx = "center"; - self.lockoncanceledmessage.aligny = "top"; - self.lockoncanceledmessage.horzalign = "center"; - self.lockoncanceledmessage.vertalign = "top"; - self.lockoncanceledmessage.foreground = 1; - self.lockoncanceledmessage.hidewhendead = 0; - self.lockoncanceledmessage.hidewheninmenu = 1; - self.lockoncanceledmessage.archived = 0; - self.lockoncanceledmessage.alpha = 1; - self.lockoncanceledmessage settext( &"MP_CANNOT_LOCKON_TO_TARGET" ); + if ( isdefined( self.lockoncanceledmessage ) ) + return; + + self.lockoncanceledmessage = newclienthudelem( self ); + self.lockoncanceledmessage.fontscale = 1.25; + self.lockoncanceledmessage.x = 0; + self.lockoncanceledmessage.y = 50; + self.lockoncanceledmessage.alignx = "center"; + self.lockoncanceledmessage.aligny = "top"; + self.lockoncanceledmessage.horzalign = "center"; + self.lockoncanceledmessage.vertalign = "top"; + self.lockoncanceledmessage.foreground = 1; + self.lockoncanceledmessage.hidewhendead = 0; + self.lockoncanceledmessage.hidewheninmenu = 1; + self.lockoncanceledmessage.archived = 0; + self.lockoncanceledmessage.alpha = 1.0; + self.lockoncanceledmessage settext( &"MP_CANNOT_LOCKON_TO_TARGET" ); } getbeststingertarget() { - targetsall = target_getarray(); - targetsvalid = []; - idx = 0; - while ( idx < targetsall.size ) - { + targetsall = target_getarray(); + targetsvalid = []; + + for ( idx = 0; idx < targetsall.size; idx++ ) + { /# - if ( getDvar( "scr_freelock" ) == "1" ) - { - if ( self insidestingerreticlenolock( targetsall[ idx ] ) ) - { - targetsvalid[ targetsvalid.size ] = targetsall[ idx ]; - } - idx++; - continue; + if ( getdvar( "scr_freelock" ) == "1" ) + { + if ( self insidestingerreticlenolock( targetsall[idx] ) ) + targetsvalid[targetsvalid.size] = targetsall[idx]; + + continue; + } #/ - } - else if ( level.teambased ) - { - if ( isDefined( targetsall[ idx ].team ) && targetsall[ idx ].team != self.team ) - { - if ( self insidestingerreticlenolock( targetsall[ idx ] ) ) - { - targetsvalid[ targetsvalid.size ] = targetsall[ idx ]; - } - } - idx++; - continue; - } - else - { - if ( self insidestingerreticlenolock( targetsall[ idx ] ) ) - { - if ( isDefined( targetsall[ idx ].owner ) && self != targetsall[ idx ].owner ) - { - targetsvalid[ targetsvalid.size ] = targetsall[ idx ]; - } - } - } - idx++; - } - if ( targetsvalid.size == 0 ) - { - return undefined; - } - chosenent = targetsvalid[ 0 ]; - if ( targetsvalid.size > 1 ) - { - } - return chosenent; + if ( level.teambased ) + { + if ( isdefined( targetsall[idx].team ) && targetsall[idx].team != self.team ) + { + if ( self insidestingerreticlenolock( targetsall[idx] ) ) + targetsvalid[targetsvalid.size] = targetsall[idx]; + } + + continue; + } + + if ( self insidestingerreticlenolock( targetsall[idx] ) ) + { + if ( isdefined( targetsall[idx].owner ) && self != targetsall[idx].owner ) + targetsvalid[targetsvalid.size] = targetsall[idx]; + } + } + + if ( targetsvalid.size == 0 ) + return undefined; + + chosenent = targetsvalid[0]; + + if ( targetsvalid.size > 1 ) + { + + } + + return chosenent; } insidestingerreticlenolock( target ) { - radius = self getlockonradius(); - return target_isincircle( target, self, 65, radius ); + radius = self getlockonradius(); + return target_isincircle( target, self, 65, radius ); } insidestingerreticlelocked( target ) { - radius = self getlockonradius(); - return target_isincircle( target, self, 65, radius ); + radius = self getlockonradius(); + return target_isincircle( target, self, 65, radius ); } isstillvalidtarget( ent ) { - if ( !isDefined( ent ) ) - { - return 0; - } - if ( !target_istarget( ent ) ) - { - return 0; - } - if ( !insidestingerreticlelocked( ent ) ) - { - return 0; - } - return 1; + if ( !isdefined( ent ) ) + return false; + + if ( !target_istarget( ent ) ) + return false; + + if ( !insidestingerreticlelocked( ent ) ) + return false; + + return true; } playerstingerads() { - return self playerads() == 1; + return self playerads() == 1.0; } looplocalseeksound( alias, interval ) { - self endon( "stop_lockon_sound" ); - self endon( "disconnect" ); - self endon( "death" ); - for ( ;; ) - { - self playlocalsound( alias ); - self playrumbleonentity( "stinger_lock_rumble" ); - wait ( interval / 2 ); - } + self endon( "stop_lockon_sound" ); + self endon( "disconnect" ); + self endon( "death" ); + + for (;;) + { + self playlocalsound( alias ); + self playrumbleonentity( "stinger_lock_rumble" ); + wait( interval / 2 ); + } } looplocallocksound( alias, interval ) { - self endon( "stop_locked_sound" ); - self endon( "disconnect" ); - self endon( "death" ); - if ( isDefined( self.stingerlocksound ) ) - { - return; - } - self.stingerlocksound = 1; - for ( ;; ) - { - self playlocalsound( alias ); - self playrumbleonentity( "stinger_lock_rumble" ); - wait ( interval / 6 ); - self playlocalsound( alias ); - self playrumbleonentity( "stinger_lock_rumble" ); - wait ( interval / 6 ); - self playlocalsound( alias ); - self playrumbleonentity( "stinger_lock_rumble" ); - wait ( interval / 6 ); - self stoprumble( "stinger_lock_rumble" ); - } - self.stingerlocksound = undefined; + self endon( "stop_locked_sound" ); + self endon( "disconnect" ); + self endon( "death" ); + + if ( isdefined( self.stingerlocksound ) ) + return; + + self.stingerlocksound = 1; + + for (;;) + { + self playlocalsound( alias ); + self playrumbleonentity( "stinger_lock_rumble" ); + wait( interval / 6 ); + self playlocalsound( alias ); + self playrumbleonentity( "stinger_lock_rumble" ); + wait( interval / 6 ); + self playlocalsound( alias ); + self playrumbleonentity( "stinger_lock_rumble" ); + wait( interval / 6 ); + self stoprumble( "stinger_lock_rumble" ); + } + + self.stingerlocksound = undefined; } locksighttest( target ) { - eyepos = self geteye(); - if ( !isDefined( target ) ) - { - return 0; - } - passed = bullettracepassed( eyepos, target.origin, 0, target ); - if ( passed ) - { - return 1; - } - front = target getpointinbounds( 1, 0, 0 ); - passed = bullettracepassed( eyepos, front, 0, target ); - if ( passed ) - { - return 1; - } - back = target getpointinbounds( -1, 0, 0 ); - passed = bullettracepassed( eyepos, back, 0, target ); - if ( passed ) - { - return 1; - } - return 0; + eyepos = self geteye(); + + if ( !isdefined( target ) ) + return false; + + passed = bullettracepassed( eyepos, target.origin, 0, target ); + + if ( passed ) + return true; + + front = target getpointinbounds( 1, 0, 0 ); + passed = bullettracepassed( eyepos, front, 0, target ); + + if ( passed ) + return true; + + back = target getpointinbounds( -1, 0, 0 ); + passed = bullettracepassed( eyepos, back, 0, target ); + + if ( passed ) + return true; + + return false; } softsighttest() { - lost_sight_limit = 500; - if ( self locksighttest( self.stingertarget ) ) - { - self.stingerlostsightlinetime = 0; - return 1; - } - if ( self.stingerlostsightlinetime == 0 ) - { - self.stingerlostsightlinetime = getTime(); - } - timepassed = getTime() - self.stingerlostsightlinetime; - if ( timepassed >= lost_sight_limit ) - { - self clearirtarget(); - return 0; - } - return 1; + lost_sight_limit = 500; + + if ( self locksighttest( self.stingertarget ) ) + { + self.stingerlostsightlinetime = 0; + return true; + } + + if ( self.stingerlostsightlinetime == 0 ) + self.stingerlostsightlinetime = gettime(); + + timepassed = gettime() - self.stingerlostsightlinetime; + + if ( timepassed >= lost_sight_limit ) + { + self clearirtarget(); + return false; + } + + return true; } initlockfield( target ) { - if ( isDefined( target.locking_on ) ) - { - return; - } - target.locking_on = 0; - target.locked_on = 0; + if ( isdefined( target.locking_on ) ) + return; + + target.locking_on = 0; + target.locked_on = 0; } lockingon( target, lock ) { /# - assert( isDefined( target.locking_on ) ); + assert( isdefined( target.locking_on ) ); #/ - clientnum = self getentitynumber(); - if ( lock ) - { - target notify( "locking on" ); - target.locking_on |= 1 << clientnum; - self thread watchclearlockingon( target, clientnum ); - } - else - { - self notify( "locking_on_cleared" ); - target.locking_on &= 1 << clientnum; - } + clientnum = self getentitynumber(); + + if ( lock ) + { + target notify( "locking on" ); + target.locking_on |= 1 << clientnum; + self thread watchclearlockingon( target, clientnum ); + } + else + { + self notify( "locking_on_cleared" ); + target.locking_on &= ~( 1 << clientnum ); + } } watchclearlockingon( target, clientnum ) { - target endon( "death" ); - self endon( "locking_on_cleared" ); - self waittill_any( "death", "disconnect" ); - target.locking_on &= 1 << clientnum; + target endon( "death" ); + self endon( "locking_on_cleared" ); + self waittill_any( "death", "disconnect" ); + target.locking_on &= ~( 1 << clientnum ); } lockedon( target, lock ) { /# - assert( isDefined( target.locked_on ) ); + assert( isdefined( target.locked_on ) ); #/ - clientnum = self getentitynumber(); - if ( lock ) - { - target.locked_on |= 1 << clientnum; - self thread watchclearlockedon( target, clientnum ); - } - else - { - self notify( "locked_on_cleared" ); - target.locked_on &= 1 << clientnum; - } + clientnum = self getentitynumber(); + + if ( lock ) + { + target.locked_on |= 1 << clientnum; + self thread watchclearlockedon( target, clientnum ); + } + else + { + self notify( "locked_on_cleared" ); + target.locked_on &= ~( 1 << clientnum ); + } } watchclearlockedon( target, clientnum ) { - self endon( "locked_on_cleared" ); - self waittill_any( "death", "disconnect" ); - if ( isDefined( target ) ) - { - target.locked_on &= 1 << clientnum; - } + self endon( "locked_on_cleared" ); + self waittill_any( "death", "disconnect" ); + + if ( isdefined( target ) ) + target.locked_on &= ~( 1 << clientnum ); } missiletarget_lockonmonitor( player, endon1, endon2 ) { - self endon( "death" ); - if ( isDefined( endon1 ) ) - { - self endon( endon1 ); - } - if ( isDefined( endon2 ) ) - { - self endon( endon2 ); - } - for ( ;; ) - { - if ( target_istarget( self ) ) - { - } - wait 0,1; - } + self endon( "death" ); + + if ( isdefined( endon1 ) ) + self endon( endon1 ); + + if ( isdefined( endon2 ) ) + self endon( endon2 ); + + for (;;) + { + if ( target_istarget( self ) ) + { + + } + + wait 0.1; + } } _incomingmissile( missile ) { - if ( !isDefined( self.incoming_missile ) ) - { - self.incoming_missile = 0; - } - self.incoming_missile++; - self thread _incomingmissiletracker( missile ); + if ( !isdefined( self.incoming_missile ) ) + self.incoming_missile = 0; + + self.incoming_missile++; + self thread _incomingmissiletracker( missile ); } _incomingmissiletracker( missile ) { - self endon( "death" ); - missile waittill( "death" ); - self.incoming_missile--; + self endon( "death" ); + missile waittill( "death" ); + + self.incoming_missile--; /# - assert( self.incoming_missile >= 0 ); + assert( self.incoming_missile >= 0 ); #/ } missiletarget_ismissileincoming() { - if ( !isDefined( self.incoming_missile ) ) - { - return 0; - } - if ( self.incoming_missile ) - { - return 1; - } - return 0; + if ( !isdefined( self.incoming_missile ) ) + return false; + + if ( self.incoming_missile ) + return true; + + return false; } missiletarget_handleincomingmissile( responsefunc, endon1, endon2 ) { - level endon( "game_ended" ); - self endon( "death" ); - if ( isDefined( endon1 ) ) - { - self endon( endon1 ); - } - if ( isDefined( endon2 ) ) - { - self endon( endon2 ); - } - for ( ;; ) - { - self waittill( "stinger_fired_at_me", missile, weap, attacker ); - _incomingmissile( missile ); - if ( isDefined( responsefunc ) ) - { - [[ responsefunc ]]( missile, attacker, weap, endon1, endon2 ); - } - } + level endon( "game_ended" ); + self endon( "death" ); + + if ( isdefined( endon1 ) ) + self endon( endon1 ); + + if ( isdefined( endon2 ) ) + self endon( endon2 ); + + for (;;) + { + self waittill( "stinger_fired_at_me", missile, weap, attacker ); + + _incomingmissile( missile ); + + if ( isdefined( responsefunc ) ) + [[ responsefunc ]]( missile, attacker, weap, endon1, endon2 ); + } } missiletarget_proximitydetonateincomingmissile( endon1, endon2 ) { - missiletarget_handleincomingmissile( ::missiletarget_proximitydetonate, endon1, endon2 ); + missiletarget_handleincomingmissile( ::missiletarget_proximitydetonate, endon1, endon2 ); } _missiledetonate( attacker, weapon ) { - self endon( "death" ); - radiusdamage( self.origin, 500, 600, 600, attacker, undefined, weapon ); - wait 0,05; - self detonate(); - wait 0,05; - self delete(); + self endon( "death" ); + radiusdamage( self.origin, 500, 600, 600, attacker, undefined, weapon ); + wait 0.05; + self detonate(); + wait 0.05; + self delete(); } missiletarget_proximitydetonate( missile, attacker, weapon, endon1, endon2 ) { - level endon( "game_ended" ); - missile endon( "death" ); - if ( isDefined( endon1 ) ) - { - self endon( endon1 ); - } - if ( isDefined( endon2 ) ) - { - self endon( endon2 ); - } - mindist = distance( missile.origin, self.origin ); - lastcenter = self.origin; - missile missile_settarget( self ); - for ( ;; ) - { - if ( !isDefined( self ) ) - { - center = lastcenter; - } - else - { - center = self.origin; - } - lastcenter = center; - curdist = distance( missile.origin, center ); - if ( curdist < 3500 && isDefined( self.numflares ) && self.numflares > 0 ) - { - self.numflares--; + level endon( "game_ended" ); + missile endon( "death" ); - self thread missiletarget_playflarefx(); - self maps/mp/killstreaks/_helicopter::trackassists( attacker, 0, 1 ); - newtarget = self missiletarget_deployflares( missile.origin, missile.angles ); - missile missile_settarget( newtarget ); - missiletarget = newtarget; - return; - } - if ( curdist < mindist ) - { - mindist = curdist; - } - if ( curdist > mindist ) - { - if ( curdist > 500 ) - { - return; - } - missile thread _missiledetonate( attacker, weapon ); - } - wait 0,05; - } + if ( isdefined( endon1 ) ) + self endon( endon1 ); + + if ( isdefined( endon2 ) ) + self endon( endon2 ); + + mindist = distance( missile.origin, self.origin ); + lastcenter = self.origin; + missile missile_settarget( self ); + + for (;;) + { + if ( !isdefined( self ) ) + center = lastcenter; + else + center = self.origin; + + lastcenter = center; + curdist = distance( missile.origin, center ); + + if ( curdist < 3500 && isdefined( self.numflares ) && self.numflares > 0 ) + { + self.numflares--; + self thread missiletarget_playflarefx(); + self maps\mp\killstreaks\_helicopter::trackassists( attacker, 0, 1 ); + newtarget = self missiletarget_deployflares( missile.origin, missile.angles ); + missile missile_settarget( newtarget ); + missiletarget = newtarget; + return; + } + + if ( curdist < mindist ) + mindist = curdist; + + if ( curdist > mindist ) + { + if ( curdist > 500 ) + return; + + missile thread _missiledetonate( attacker, weapon ); + } + + wait 0.05; + } } missiletarget_playflarefx() { - if ( !isDefined( self ) ) - { - return; - } - flare_fx = level.fx_flare; - if ( isDefined( self.fx_flare ) ) - { - flare_fx = self.fx_flare; - } - if ( isDefined( self.flare_ent ) ) - { - playfxontag( flare_fx, self.flare_ent, "tag_origin" ); - } - else - { - playfxontag( flare_fx, self, "tag_origin" ); - } - if ( isDefined( self.owner ) ) - { - self playsoundtoplayer( "veh_huey_chaff_drop_plr", self.owner ); - } - self playsound( "veh_huey_chaff_explo_npc" ); + if ( !isdefined( self ) ) + return; + + flare_fx = level.fx_flare; + + if ( isdefined( self.fx_flare ) ) + flare_fx = self.fx_flare; + + if ( isdefined( self.flare_ent ) ) + playfxontag( flare_fx, self.flare_ent, "tag_origin" ); + else + playfxontag( flare_fx, self, "tag_origin" ); + + if ( isdefined( self.owner ) ) + self playsoundtoplayer( "veh_huey_chaff_drop_plr", self.owner ); + + self playsound( "veh_huey_chaff_explo_npc" ); } missiletarget_deployflares( origin, angles ) { - vec_toforward = anglesToForward( self.angles ); - vec_toright = anglesToRight( self.angles ); - vec_tomissileforward = anglesToForward( angles ); - delta = self.origin - origin; - dot = vectordot( vec_tomissileforward, vec_toright ); - sign = 1; - if ( dot > 0 ) - { - sign = -1; - } - flare_dir = vectornormalize( vectorScale( vec_toforward, -0,5 ) + vectorScale( vec_toright, sign ) ); - velocity = vectorScale( flare_dir, randomintrange( 200, 400 ) ); - velocity = ( velocity[ 0 ], velocity[ 1 ], velocity[ 2 ] - randomintrange( 10, 100 ) ); - flareorigin = self.origin; - flareorigin += vectorScale( flare_dir, randomintrange( 500, 700 ) ); - flareorigin += vectorScale( ( 1, 0, 0 ), 500 ); - if ( isDefined( self.flareoffset ) ) - { - flareorigin += self.flareoffset; - } - flareobject = spawn( "script_origin", flareorigin ); - flareobject.angles = self.angles; - flareobject setmodel( "tag_origin" ); - flareobject movegravity( velocity, 5 ); - flareobject thread deleteaftertime( 5 ); - self thread debug_tracker( flareobject ); - return flareobject; + vec_toforward = anglestoforward( self.angles ); + vec_toright = anglestoright( self.angles ); + vec_tomissileforward = anglestoforward( angles ); + delta = self.origin - origin; + dot = vectordot( vec_tomissileforward, vec_toright ); + sign = 1; + + if ( dot > 0 ) + sign = -1; + + flare_dir = vectornormalize( vectorscale( vec_toforward, -0.5 ) + vectorscale( vec_toright, sign ) ); + velocity = vectorscale( flare_dir, randomintrange( 200, 400 ) ); + velocity = ( velocity[0], velocity[1], velocity[2] - randomintrange( 10, 100 ) ); + flareorigin = self.origin; + flareorigin += vectorscale( flare_dir, randomintrange( 500, 700 ) ); + flareorigin += vectorscale( ( 0, 0, 1 ), 500.0 ); + + if ( isdefined( self.flareoffset ) ) + flareorigin += self.flareoffset; + + flareobject = spawn( "script_origin", flareorigin ); + flareobject.angles = self.angles; + flareobject setmodel( "tag_origin" ); + flareobject movegravity( velocity, 5.0 ); + flareobject thread deleteaftertime( 5.0 ); + self thread debug_tracker( flareobject ); + return flareobject; } debug_tracker( target ) { - target endon( "death" ); - while ( 1 ) - { - maps/mp/killstreaks/_airsupport::debug_sphere( target.origin, 10, ( 1, 0, 0 ), 1, 1 ); - wait 0,05; - } + target endon( "death" ); + + while ( true ) + { + maps\mp\killstreaks\_airsupport::debug_sphere( target.origin, 10, ( 1, 0, 0 ), 1, 1 ); + wait 0.05; + } } diff --git a/Multiplayer Core/patch_mp/maps/mp/_interactive_objects.gsc b/Multiplayer Core/patch_mp/maps/mp/_interactive_objects.gsc index 490fd54..148d9d5 100644 --- a/Multiplayer Core/patch_mp/maps/mp/_interactive_objects.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/_interactive_objects.gsc @@ -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; } diff --git a/Multiplayer Core/patch_mp/maps/mp/_load.gsc b/Multiplayer Core/patch_mp/maps/mp/_load.gsc index 2231be4..7e577f9 100644 --- a/Multiplayer Core/patch_mp/maps/mp/_load.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/_load.gsc @@ -1,537 +1,516 @@ -#include maps/mp/gametypes/_spawnlogic; -#include maps/mp/animscripts/traverse/shared; -#include maps/mp/animscripts/utility; -#include maps/mp/_load; -#include maps/mp/_createfx; -#include maps/mp/_music; -#include maps/mp/_busing; -#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; +#include maps\mp\gametypes\_spawning; +#include maps\mp\gametypes\_tweakables; +#include maps\mp\_destructible; +#include maps\mp\_riotshield; +#include maps\mp\_vehicles; +#include maps\mp\killstreaks\_dogs; +#include maps\mp\killstreaks\_ai_tank; +#include maps\mp\killstreaks\_rcbomb; +#include maps\mp\killstreaks\_helicopter_guard; +#include maps\mp\_trophy_system; +#include maps\mp\_proximity_grenade; +#include maps\mp\_audio; +#include maps\mp\_busing; +#include maps\mp\_music; +#include maps\mp\_fxanim; +#include maps\mp\_interactive_objects; +#include maps\mp\_serverfaceanim_mp; +#include maps\mp\_art; +#include maps\mp\_createfx; +#include maps\mp\_global_fx; +#include maps\mp\_demo; +#include maps\mp\_development_dvars; +#include maps\mp\_load; +#include maps\mp\animscripts\utility; +#include maps\mp\animscripts\traverse\shared; +#include maps\mp\gametypes\_spawnlogic; main( bscriptgened, bcsvgened, bsgenabled ) { - if ( !isDefined( level.script_gen_dump_reasons ) ) - { - level.script_gen_dump_reasons = []; - } - if ( !isDefined( bsgenabled ) ) - { - level.script_gen_dump_reasons[ level.script_gen_dump_reasons.size ] = "First run"; - } - if ( !isDefined( bcsvgened ) ) - { - bcsvgened = 0; - } - level.bcsvgened = bcsvgened; - if ( !isDefined( bscriptgened ) ) - { - bscriptgened = 0; - } - else - { - bscriptgened = 1; - } - level.bscriptgened = bscriptgened; - level._loadstarted = 1; - struct_class_init(); - level.clientscripts = getDvar( "cg_usingClientScripts" ) != ""; - level._client_exploders = []; - level._client_exploder_ids = []; - if ( !isDefined( level.flag ) ) - { - level.flag = []; - level.flags_lock = []; - } - if ( !isDefined( level.timeofday ) ) - { - level.timeofday = "day"; - } - flag_init( "scriptgen_done" ); - level.script_gen_dump_reasons = []; - if ( !isDefined( level.script_gen_dump ) ) - { - level.script_gen_dump = []; - level.script_gen_dump_reasons[ 0 ] = "First run"; - } - if ( !isDefined( level.script_gen_dump2 ) ) - { - level.script_gen_dump2 = []; - } - if ( isDefined( level.createfxent ) ) - { - script_gen_dump_addline( "maps\\mp\\createfx\\" + level.script + "_fx::main();", level.script + "_fx" ); - } - while ( isDefined( level.script_gen_dump_preload ) ) - { - i = 0; - while ( i < level.script_gen_dump_preload.size ) - { - script_gen_dump_addline( level.script_gen_dump_preload[ i ].string, level.script_gen_dump_preload[ i ].signature ); - i++; - } - } - if ( getDvar( "scr_RequiredMapAspectratio" ) == "" ) - { - setdvar( "scr_RequiredMapAspectratio", "1" ); - } - setdvar( "r_waterFogTest", 0 ); - setdvar( "tu6_player_shallowWaterHeight", "0.0" ); - precacherumble( "reload_small" ); - precacherumble( "reload_medium" ); - precacherumble( "reload_large" ); - precacherumble( "reload_clipin" ); - precacherumble( "reload_clipout" ); - precacherumble( "reload_rechamber" ); - precacherumble( "pullout_small" ); - precacherumble( "buzz_high" ); - precacherumble( "riotshield_impact" ); - registerclientsys( "levelNotify" ); - level.aitriggerspawnflags = getaitriggerflags(); - level.vehicletriggerspawnflags = getvehicletriggerflags(); - level.physicstracemaskphysics = 1; - level.physicstracemaskvehicle = 2; - level.physicstracemaskwater = 4; - level.physicstracemaskclip = 8; - level.physicstracecontentsvehicleclip = 16; - level.createfx_enabled = getDvar( "createfx" ) != ""; - if ( !sessionmodeiszombiesgame() ) - { - thread maps/mp/gametypes/_spawning::init(); - thread maps/mp/gametypes/_tweakables::init(); - thread maps/mp/_destructible::init(); - thread maps/mp/_riotshield::register(); - thread maps/mp/_vehicles::init(); - thread maps/mp/killstreaks/_dogs::init(); - thread maps/mp/killstreaks/_ai_tank::register(); - thread maps/mp/killstreaks/_rcbomb::register(); - thread maps/mp/killstreaks/_helicopter_guard::register(); - thread maps/mp/_trophy_system::register(); - thread maps/mp/_proximity_grenade::register(); - maps/mp/_audio::init(); - thread maps/mp/_busing::businit(); - thread maps/mp/_music::music_init(); - thread maps/mp/_fxanim::init(); - } - else - { - level thread start_intro_screen_zm(); - thread maps/mp/_interactive_objects::init(); - maps/mp/_audio::init(); - thread maps/mp/_busing::businit(); - thread maps/mp/_music::music_init(); - thread maps/mp/_fxanim::init(); - thread maps/mp/_serverfaceanim_mp::init(); - if ( level.createfx_enabled ) - { - setinitialplayersconnected(); - } - } - visionsetnight( "default_night" ); - setup_traversals(); - maps/mp/_art::main(); - setupexploders(); - parse_structs(); - if ( sessionmodeiszombiesgame() ) - { - thread footsteps(); - } + if ( !isdefined( level.script_gen_dump_reasons ) ) + level.script_gen_dump_reasons = []; + + if ( !isdefined( bsgenabled ) ) + level.script_gen_dump_reasons[level.script_gen_dump_reasons.size] = "First run"; + + if ( !isdefined( bcsvgened ) ) + bcsvgened = 0; + + level.bcsvgened = bcsvgened; + + if ( !isdefined( bscriptgened ) ) + bscriptgened = 0; + else + bscriptgened = 1; + + level.bscriptgened = bscriptgened; + level._loadstarted = 1; + struct_class_init(); + level.clientscripts = getdvar( "cg_usingClientScripts" ) != ""; + level._client_exploders = []; + level._client_exploder_ids = []; + + if ( !isdefined( level.flag ) ) + { + level.flag = []; + level.flags_lock = []; + } + + if ( !isdefined( level.timeofday ) ) + level.timeofday = "day"; + + flag_init( "scriptgen_done" ); + level.script_gen_dump_reasons = []; + + if ( !isdefined( level.script_gen_dump ) ) + { + level.script_gen_dump = []; + level.script_gen_dump_reasons[0] = "First run"; + } + + if ( !isdefined( level.script_gen_dump2 ) ) + level.script_gen_dump2 = []; + + if ( isdefined( level.createfxent ) ) + script_gen_dump_addline( "maps\mp\createfx\" + level.script + "_fx::main();", level.script + "_fx" ); + + if ( isdefined( level.script_gen_dump_preload ) ) + { + for ( i = 0; i < level.script_gen_dump_preload.size; i++ ) + script_gen_dump_addline( level.script_gen_dump_preload[i].string, level.script_gen_dump_preload[i].signature ); + } + + if ( getdvar( "scr_RequiredMapAspectratio" ) == "" ) + setdvar( "scr_RequiredMapAspectratio", "1" ); + + setdvar( "r_waterFogTest", 0 ); + setdvar( "tu6_player_shallowWaterHeight", "0.0" ); + precacherumble( "reload_small" ); + precacherumble( "reload_medium" ); + precacherumble( "reload_large" ); + precacherumble( "reload_clipin" ); + precacherumble( "reload_clipout" ); + precacherumble( "reload_rechamber" ); + precacherumble( "pullout_small" ); + precacherumble( "buzz_high" ); + precacherumble( "riotshield_impact" ); + registerclientsys( "levelNotify" ); + level.aitriggerspawnflags = getaitriggerflags(); + level.vehicletriggerspawnflags = getvehicletriggerflags(); + level.physicstracemaskphysics = 1; + level.physicstracemaskvehicle = 2; + level.physicstracemaskwater = 4; + level.physicstracemaskclip = 8; + level.physicstracecontentsvehicleclip = 16; + level.createfx_enabled = getdvar( "createfx" ) != ""; + + if ( !sessionmodeiszombiesgame() ) + { + thread maps\mp\gametypes\_spawning::init(); + thread maps\mp\gametypes\_tweakables::init(); + thread maps\mp\_destructible::init(); + thread maps\mp\_riotshield::register(); + thread maps\mp\_vehicles::init(); + thread maps\mp\killstreaks\_dogs::init(); + thread maps\mp\killstreaks\_ai_tank::register(); + thread maps\mp\killstreaks\_rcbomb::register(); + thread maps\mp\killstreaks\_helicopter_guard::register(); + thread maps\mp\_trophy_system::register(); + thread maps\mp\_proximity_grenade::register(); + maps\mp\_audio::init(); + thread maps\mp\_busing::businit(); + thread maps\mp\_music::music_init(); + thread maps\mp\_fxanim::init(); + } + else + { + level thread start_intro_screen_zm(); + thread maps\mp\_interactive_objects::init(); + maps\mp\_audio::init(); + thread maps\mp\_busing::businit(); + thread maps\mp\_music::music_init(); + thread maps\mp\_fxanim::init(); + thread maps\mp\_serverfaceanim_mp::init(); + + if ( level.createfx_enabled ) + setinitialplayersconnected(); + } + + visionsetnight( "default_night" ); + setup_traversals(); + maps\mp\_art::main(); + setupexploders(); + parse_structs(); + + if ( sessionmodeiszombiesgame() ) + thread footsteps(); /# - level thread level_notify_listener(); - level thread client_notify_listener(); + level thread level_notify_listener(); + level thread client_notify_listener(); #/ - thread maps/mp/_createfx::fx_init(); - if ( level.createfx_enabled ) - { - calculate_map_center(); - maps/mp/_createfx::createfx(); - } - if ( getDvar( #"F7B30924" ) == "1" ) - { - maps/mp/_global_fx::main(); - level waittill( "eternity" ); - } - thread maps/mp/_global_fx::main(); - maps/mp/_demo::init(); - if ( !sessionmodeiszombiesgame() ) - { - thread maps/mp/_development_dvars::init(); - } - p = 0; - while ( p < 6 ) - { - switch( p ) - { - case 0: - triggertype = "trigger_multiple"; - break; - case 1: - triggertype = "trigger_once"; - break; - case 2: - triggertype = "trigger_use"; - break; - case 3: - triggertype = "trigger_radius"; - break; - case 4: - triggertype = "trigger_lookat"; - break; - default: + thread maps\mp\_createfx::fx_init(); + + if ( level.createfx_enabled ) + { + calculate_map_center(); + maps\mp\_createfx::createfx(); + } + + if ( getdvar( "r_reflectionProbeGenerate" ) == "1" ) + { + maps\mp\_global_fx::main(); + + level waittill( "eternity" ); + } + + thread maps\mp\_global_fx::main(); + maps\mp\_demo::init(); + + if ( !sessionmodeiszombiesgame() ) + thread maps\mp\_development_dvars::init(); + + for ( p = 0; p < 6; p++ ) + { + switch ( p ) + { + case "0": + triggertype = "trigger_multiple"; + break; + case "1": + triggertype = "trigger_once"; + break; + case "2": + triggertype = "trigger_use"; + break; + case "3": + triggertype = "trigger_radius"; + break; + case "4": + triggertype = "trigger_lookat"; + break; + default: /# - assert( p == 5 ); + assert( p == 5 ); #/ - triggertype = "trigger_damage"; - break; - } - triggers = getentarray( triggertype, "classname" ); - i = 0; - while ( i < triggers.size ) - { - if ( isDefined( triggers[ i ].script_prefab_exploder ) ) - { - triggers[ i ].script_exploder = triggers[ i ].script_prefab_exploder; - } - if ( isDefined( triggers[ i ].script_exploder ) ) - { - level thread maps/mp/_load::exploder_load( triggers[ i ] ); - } - i++; - } - p++; - } + triggertype = "trigger_damage"; + break; + } + + triggers = getentarray( triggertype, "classname" ); + + for ( i = 0; i < triggers.size; i++ ) + { + if ( isdefined( triggers[i].script_prefab_exploder ) ) + triggers[i].script_exploder = triggers[i].script_prefab_exploder; + + if ( isdefined( triggers[i].script_exploder ) ) + level thread maps\mp\_load::exploder_load( triggers[i] ); + } + } } level_notify_listener() { - while ( 1 ) - { - val = getDvar( "level_notify" ); - if ( val != "" ) - { - level notify( val ); - setdvar( "level_notify", "" ); - } - wait 0,2; - } + while ( true ) + { + val = getdvar( "level_notify" ); + + if ( val != "" ) + { + level notify( val ); + setdvar( "level_notify", "" ); + } + + wait 0.2; + } } client_notify_listener() { - while ( 1 ) - { - val = getDvar( "client_notify" ); - if ( val != "" ) - { - clientnotify( val ); - setdvar( "client_notify", "" ); - } - wait 0,2; - } + while ( true ) + { + val = getdvar( "client_notify" ); + + if ( val != "" ) + { + clientnotify( val ); + setdvar( "client_notify", "" ); + } + + wait 0.2; + } } footsteps() { - maps/mp/animscripts/utility::setfootstepeffect( "asphalt", loadfx( "bio/player/fx_footstep_dust" ) ); - maps/mp/animscripts/utility::setfootstepeffect( "brick", loadfx( "bio/player/fx_footstep_dust" ) ); - maps/mp/animscripts/utility::setfootstepeffect( "carpet", loadfx( "bio/player/fx_footstep_dust" ) ); - maps/mp/animscripts/utility::setfootstepeffect( "cloth", loadfx( "bio/player/fx_footstep_dust" ) ); - maps/mp/animscripts/utility::setfootstepeffect( "concrete", loadfx( "bio/player/fx_footstep_dust" ) ); - maps/mp/animscripts/utility::setfootstepeffect( "dirt", loadfx( "bio/player/fx_footstep_sand" ) ); - maps/mp/animscripts/utility::setfootstepeffect( "foliage", loadfx( "bio/player/fx_footstep_sand" ) ); - maps/mp/animscripts/utility::setfootstepeffect( "gravel", loadfx( "bio/player/fx_footstep_dust" ) ); - maps/mp/animscripts/utility::setfootstepeffect( "grass", loadfx( "bio/player/fx_footstep_dust" ) ); - maps/mp/animscripts/utility::setfootstepeffect( "metal", loadfx( "bio/player/fx_footstep_dust" ) ); - maps/mp/animscripts/utility::setfootstepeffect( "mud", loadfx( "bio/player/fx_footstep_mud" ) ); - maps/mp/animscripts/utility::setfootstepeffect( "paper", loadfx( "bio/player/fx_footstep_dust" ) ); - maps/mp/animscripts/utility::setfootstepeffect( "plaster", loadfx( "bio/player/fx_footstep_dust" ) ); - maps/mp/animscripts/utility::setfootstepeffect( "rock", loadfx( "bio/player/fx_footstep_dust" ) ); - maps/mp/animscripts/utility::setfootstepeffect( "sand", loadfx( "bio/player/fx_footstep_sand" ) ); - maps/mp/animscripts/utility::setfootstepeffect( "water", loadfx( "bio/player/fx_footstep_water" ) ); - maps/mp/animscripts/utility::setfootstepeffect( "wood", loadfx( "bio/player/fx_footstep_dust" ) ); + maps\mp\animscripts\utility::setfootstepeffect( "asphalt", loadfx( "bio/player/fx_footstep_dust" ) ); + maps\mp\animscripts\utility::setfootstepeffect( "brick", loadfx( "bio/player/fx_footstep_dust" ) ); + maps\mp\animscripts\utility::setfootstepeffect( "carpet", loadfx( "bio/player/fx_footstep_dust" ) ); + maps\mp\animscripts\utility::setfootstepeffect( "cloth", loadfx( "bio/player/fx_footstep_dust" ) ); + maps\mp\animscripts\utility::setfootstepeffect( "concrete", loadfx( "bio/player/fx_footstep_dust" ) ); + maps\mp\animscripts\utility::setfootstepeffect( "dirt", loadfx( "bio/player/fx_footstep_sand" ) ); + maps\mp\animscripts\utility::setfootstepeffect( "foliage", loadfx( "bio/player/fx_footstep_sand" ) ); + maps\mp\animscripts\utility::setfootstepeffect( "gravel", loadfx( "bio/player/fx_footstep_dust" ) ); + maps\mp\animscripts\utility::setfootstepeffect( "grass", loadfx( "bio/player/fx_footstep_dust" ) ); + maps\mp\animscripts\utility::setfootstepeffect( "metal", loadfx( "bio/player/fx_footstep_dust" ) ); + maps\mp\animscripts\utility::setfootstepeffect( "mud", loadfx( "bio/player/fx_footstep_mud" ) ); + maps\mp\animscripts\utility::setfootstepeffect( "paper", loadfx( "bio/player/fx_footstep_dust" ) ); + maps\mp\animscripts\utility::setfootstepeffect( "plaster", loadfx( "bio/player/fx_footstep_dust" ) ); + maps\mp\animscripts\utility::setfootstepeffect( "rock", loadfx( "bio/player/fx_footstep_dust" ) ); + maps\mp\animscripts\utility::setfootstepeffect( "sand", loadfx( "bio/player/fx_footstep_sand" ) ); + maps\mp\animscripts\utility::setfootstepeffect( "water", loadfx( "bio/player/fx_footstep_water" ) ); + maps\mp\animscripts\utility::setfootstepeffect( "wood", loadfx( "bio/player/fx_footstep_dust" ) ); } parse_structs() { - i = 0; - while ( i < level.struct.size ) - { - if ( isDefined( level.struct[ i ].targetname ) ) - { - if ( level.struct[ i ].targetname == "flak_fire_fx" ) - { - level._effect[ "flak20_fire_fx" ] = loadfx( "weapon/tracer/fx_tracer_flak_single_noExp" ); - level._effect[ "flak38_fire_fx" ] = loadfx( "weapon/tracer/fx_tracer_quad_20mm_Flak38_noExp" ); - level._effect[ "flak_cloudflash_night" ] = loadfx( "weapon/flak/fx_flak_cloudflash_night" ); - level._effect[ "flak_burst_single" ] = loadfx( "weapon/flak/fx_flak_single_day_dist" ); - } - if ( level.struct[ i ].targetname == "fake_fire_fx" ) - { - level._effect[ "distant_muzzleflash" ] = loadfx( "weapon/muzzleflashes/heavy" ); - } - if ( level.struct[ i ].targetname == "spotlight_fx" ) - { - level._effect[ "spotlight_beam" ] = loadfx( "env/light/fx_ray_spotlight_md" ); - } - } - i++; - } + for ( i = 0; i < level.struct.size; i++ ) + { + if ( isdefined( level.struct[i].targetname ) ) + { + if ( level.struct[i].targetname == "flak_fire_fx" ) + { + level._effect["flak20_fire_fx"] = loadfx( "weapon/tracer/fx_tracer_flak_single_noExp" ); + level._effect["flak38_fire_fx"] = loadfx( "weapon/tracer/fx_tracer_quad_20mm_Flak38_noExp" ); + level._effect["flak_cloudflash_night"] = loadfx( "weapon/flak/fx_flak_cloudflash_night" ); + level._effect["flak_burst_single"] = loadfx( "weapon/flak/fx_flak_single_day_dist" ); + } + + if ( level.struct[i].targetname == "fake_fire_fx" ) + level._effect["distant_muzzleflash"] = loadfx( "weapon/muzzleflashes/heavy" ); + + if ( level.struct[i].targetname == "spotlight_fx" ) + level._effect["spotlight_beam"] = loadfx( "env/light/fx_ray_spotlight_md" ); + } + } } exploder_load( trigger ) { - level endon( "killexplodertridgers" + trigger.script_exploder ); - trigger waittill( "trigger" ); - if ( isDefined( trigger.script_chance ) && randomfloat( 1 ) > trigger.script_chance ) - { - if ( isDefined( trigger.script_delay ) ) - { - wait trigger.script_delay; - } - else - { - wait 4; - } - level thread exploder_load( trigger ); - return; - } - maps/mp/_utility::exploder( trigger.script_exploder ); - level notify( "killexplodertridgers" + trigger.script_exploder ); + level endon( "killexplodertridgers" + trigger.script_exploder ); + + trigger waittill( "trigger" ); + + if ( isdefined( trigger.script_chance ) && randomfloat( 1 ) > trigger.script_chance ) + { + if ( isdefined( trigger.script_delay ) ) + wait( trigger.script_delay ); + else + wait 4; + + level thread exploder_load( trigger ); + return; + } + + maps\mp\_utility::exploder( trigger.script_exploder ); + level notify( "killexplodertridgers" + trigger.script_exploder ); } setupexploders() { - ents = getentarray( "script_brushmodel", "classname" ); - smodels = getentarray( "script_model", "classname" ); - i = 0; - while ( i < smodels.size ) - { - ents[ ents.size ] = smodels[ i ]; - i++; - } - i = 0; - while ( i < ents.size ) - { - if ( isDefined( ents[ i ].script_prefab_exploder ) ) - { - ents[ i ].script_exploder = ents[ i ].script_prefab_exploder; - } - if ( isDefined( ents[ i ].script_exploder ) ) - { - if ( ents[ i ].model == "fx" || !isDefined( ents[ i ].targetname ) && ents[ i ].targetname != "exploderchunk" ) - { - ents[ i ] hide(); - i++; - continue; - } - else - { - if ( isDefined( ents[ i ].targetname ) && ents[ i ].targetname == "exploder" ) - { - ents[ i ] hide(); - ents[ i ] notsolid(); - i++; - continue; - } - else - { - if ( isDefined( ents[ i ].targetname ) && ents[ i ].targetname == "exploderchunk" ) - { - ents[ i ] hide(); - ents[ i ] notsolid(); - } - } - } - } - i++; - } - script_exploders = []; - potentialexploders = getentarray( "script_brushmodel", "classname" ); - i = 0; - while ( i < potentialexploders.size ) - { - if ( isDefined( potentialexploders[ i ].script_prefab_exploder ) ) - { - potentialexploders[ i ].script_exploder = potentialexploders[ i ].script_prefab_exploder; - } - if ( isDefined( potentialexploders[ i ].script_exploder ) ) - { - script_exploders[ script_exploders.size ] = potentialexploders[ i ]; - } - i++; - } - potentialexploders = getentarray( "script_model", "classname" ); - i = 0; - while ( i < potentialexploders.size ) - { - if ( isDefined( potentialexploders[ i ].script_prefab_exploder ) ) - { - potentialexploders[ i ].script_exploder = potentialexploders[ i ].script_prefab_exploder; - } - if ( isDefined( potentialexploders[ i ].script_exploder ) ) - { - script_exploders[ script_exploders.size ] = potentialexploders[ i ]; - } - i++; - } - potentialexploders = getentarray( "item_health", "classname" ); - i = 0; - while ( i < potentialexploders.size ) - { - if ( isDefined( potentialexploders[ i ].script_prefab_exploder ) ) - { - potentialexploders[ i ].script_exploder = potentialexploders[ i ].script_prefab_exploder; - } - if ( isDefined( potentialexploders[ i ].script_exploder ) ) - { - script_exploders[ script_exploders.size ] = potentialexploders[ i ]; - } - i++; - } - if ( !isDefined( level.createfxent ) ) - { - level.createfxent = []; - } - acceptabletargetnames = []; - acceptabletargetnames[ "exploderchunk visible" ] = 1; - acceptabletargetnames[ "exploderchunk" ] = 1; - acceptabletargetnames[ "exploder" ] = 1; - i = 0; - while ( i < script_exploders.size ) - { - exploder = script_exploders[ i ]; - ent = createexploder( exploder.script_fxid ); - ent.v = []; - ent.v[ "origin" ] = exploder.origin; - ent.v[ "angles" ] = exploder.angles; - ent.v[ "delay" ] = exploder.script_delay; - ent.v[ "firefx" ] = exploder.script_firefx; - ent.v[ "firefxdelay" ] = exploder.script_firefxdelay; - ent.v[ "firefxsound" ] = exploder.script_firefxsound; - ent.v[ "firefxtimeout" ] = exploder.script_firefxtimeout; - ent.v[ "earthquake" ] = exploder.script_earthquake; - ent.v[ "damage" ] = exploder.script_damage; - ent.v[ "damage_radius" ] = exploder.script_radius; - ent.v[ "soundalias" ] = exploder.script_soundalias; - ent.v[ "repeat" ] = exploder.script_repeat; - ent.v[ "delay_min" ] = exploder.script_delay_min; - ent.v[ "delay_max" ] = exploder.script_delay_max; - ent.v[ "target" ] = exploder.target; - ent.v[ "ender" ] = exploder.script_ender; - ent.v[ "type" ] = "exploder"; - if ( !isDefined( exploder.script_fxid ) ) - { - ent.v[ "fxid" ] = "No FX"; - } - else - { - ent.v[ "fxid" ] = exploder.script_fxid; - } - ent.v[ "exploder" ] = exploder.script_exploder; + ents = getentarray( "script_brushmodel", "classname" ); + smodels = getentarray( "script_model", "classname" ); + + for ( i = 0; i < smodels.size; i++ ) + ents[ents.size] = smodels[i]; + + for ( i = 0; i < ents.size; i++ ) + { + if ( isdefined( ents[i].script_prefab_exploder ) ) + ents[i].script_exploder = ents[i].script_prefab_exploder; + + if ( isdefined( ents[i].script_exploder ) ) + { + if ( ents[i].model == "fx" && ( !isdefined( ents[i].targetname ) || ents[i].targetname != "exploderchunk" ) ) + { + ents[i] hide(); + continue; + } + + if ( isdefined( ents[i].targetname ) && ents[i].targetname == "exploder" ) + { + ents[i] hide(); + ents[i] notsolid(); + continue; + } + + if ( isdefined( ents[i].targetname ) && ents[i].targetname == "exploderchunk" ) + { + ents[i] hide(); + ents[i] notsolid(); + } + } + } + + script_exploders = []; + potentialexploders = getentarray( "script_brushmodel", "classname" ); + + for ( i = 0; i < potentialexploders.size; i++ ) + { + if ( isdefined( potentialexploders[i].script_prefab_exploder ) ) + potentialexploders[i].script_exploder = potentialexploders[i].script_prefab_exploder; + + if ( isdefined( potentialexploders[i].script_exploder ) ) + script_exploders[script_exploders.size] = potentialexploders[i]; + } + + potentialexploders = getentarray( "script_model", "classname" ); + + for ( i = 0; i < potentialexploders.size; i++ ) + { + if ( isdefined( potentialexploders[i].script_prefab_exploder ) ) + potentialexploders[i].script_exploder = potentialexploders[i].script_prefab_exploder; + + if ( isdefined( potentialexploders[i].script_exploder ) ) + script_exploders[script_exploders.size] = potentialexploders[i]; + } + + potentialexploders = getentarray( "item_health", "classname" ); + + for ( i = 0; i < potentialexploders.size; i++ ) + { + if ( isdefined( potentialexploders[i].script_prefab_exploder ) ) + potentialexploders[i].script_exploder = potentialexploders[i].script_prefab_exploder; + + if ( isdefined( potentialexploders[i].script_exploder ) ) + script_exploders[script_exploders.size] = potentialexploders[i]; + } + + if ( !isdefined( level.createfxent ) ) + level.createfxent = []; + + acceptabletargetnames = []; + acceptabletargetnames["exploderchunk visible"] = 1; + acceptabletargetnames["exploderchunk"] = 1; + acceptabletargetnames["exploder"] = 1; + + for ( i = 0; i < script_exploders.size; i++ ) + { + exploder = script_exploders[i]; + ent = createexploder( exploder.script_fxid ); + ent.v = []; + ent.v["origin"] = exploder.origin; + ent.v["angles"] = exploder.angles; + ent.v["delay"] = exploder.script_delay; + ent.v["firefx"] = exploder.script_firefx; + ent.v["firefxdelay"] = exploder.script_firefxdelay; + ent.v["firefxsound"] = exploder.script_firefxsound; + ent.v["firefxtimeout"] = exploder.script_firefxtimeout; + ent.v["earthquake"] = exploder.script_earthquake; + ent.v["damage"] = exploder.script_damage; + ent.v["damage_radius"] = exploder.script_radius; + ent.v["soundalias"] = exploder.script_soundalias; + ent.v["repeat"] = exploder.script_repeat; + ent.v["delay_min"] = exploder.script_delay_min; + ent.v["delay_max"] = exploder.script_delay_max; + ent.v["target"] = exploder.target; + ent.v["ender"] = exploder.script_ender; + ent.v["type"] = "exploder"; + + if ( !isdefined( exploder.script_fxid ) ) + ent.v["fxid"] = "No FX"; + else + ent.v["fxid"] = exploder.script_fxid; + + ent.v["exploder"] = exploder.script_exploder; /# - assert( isDefined( exploder.script_exploder ), "Exploder at origin " + exploder.origin + " has no script_exploder" ); + assert( isdefined( exploder.script_exploder ), "Exploder at origin " + exploder.origin + " has no script_exploder" ); #/ - if ( !isDefined( ent.v[ "delay" ] ) ) - { - ent.v[ "delay" ] = 0; - } - if ( isDefined( exploder.target ) ) - { - org = getent( ent.v[ "target" ], "targetname" ).origin; - ent.v[ "angles" ] = vectorToAngle( org - ent.v[ "origin" ] ); - } - if ( exploder.classname == "script_brushmodel" || isDefined( exploder.model ) ) - { - ent.model = exploder; - ent.model.disconnect_paths = exploder.script_disconnectpaths; - } - if ( isDefined( exploder.targetname ) && isDefined( acceptabletargetnames[ exploder.targetname ] ) ) - { - ent.v[ "exploder_type" ] = exploder.targetname; - } - else - { - ent.v[ "exploder_type" ] = "normal"; - } - ent maps/mp/_createfx::post_entity_creation_function(); - i++; - } - level.createfxexploders = []; - i = 0; - while ( i < level.createfxent.size ) - { - ent = level.createfxent[ i ]; - if ( ent.v[ "type" ] != "exploder" ) - { - i++; - continue; - } - else - { - ent.v[ "exploder_id" ] = getexploderid( ent ); - if ( !isDefined( level.createfxexploders[ ent.v[ "exploder" ] ] ) ) - { - level.createfxexploders[ ent.v[ "exploder" ] ] = []; - } - level.createfxexploders[ ent.v[ "exploder" ] ][ level.createfxexploders[ ent.v[ "exploder" ] ].size ] = ent; - } - i++; - } + if ( !isdefined( ent.v["delay"] ) ) + ent.v["delay"] = 0; + + if ( isdefined( exploder.target ) ) + { + org = getent( ent.v["target"], "targetname" ).origin; + ent.v["angles"] = vectortoangles( org - ent.v["origin"] ); + } + + if ( exploder.classname == "script_brushmodel" || isdefined( exploder.model ) ) + { + ent.model = exploder; + ent.model.disconnect_paths = exploder.script_disconnectpaths; + } + + if ( isdefined( exploder.targetname ) && isdefined( acceptabletargetnames[exploder.targetname] ) ) + ent.v["exploder_type"] = exploder.targetname; + else + ent.v["exploder_type"] = "normal"; + + ent maps\mp\_createfx::post_entity_creation_function(); + } + + level.createfxexploders = []; + + for ( i = 0; i < level.createfxent.size; i++ ) + { + ent = level.createfxent[i]; + + if ( ent.v["type"] != "exploder" ) + continue; + + ent.v["exploder_id"] = getexploderid( ent ); + + if ( !isdefined( level.createfxexploders[ent.v["exploder"]] ) ) + level.createfxexploders[ent.v["exploder"]] = []; + + level.createfxexploders[ent.v["exploder"]][level.createfxexploders[ent.v["exploder"]].size] = ent; + } } setup_traversals() { - potential_traverse_nodes = getallnodes(); - i = 0; - while ( i < potential_traverse_nodes.size ) - { - node = potential_traverse_nodes[ i ]; - if ( node.type == "Begin" ) - { - node maps/mp/animscripts/traverse/shared::init_traverse(); - } - i++; - } + potential_traverse_nodes = getallnodes(); + + for ( i = 0; i < potential_traverse_nodes.size; i++ ) + { + node = potential_traverse_nodes[i]; + + if ( node.type == "Begin" ) + node maps\mp\animscripts\traverse\shared::init_traverse(); + } } calculate_map_center() { - if ( !isDefined( level.mapcenter ) ) - { - level.nodesmins = ( 0, 0, 0 ); - level.nodesmaxs = ( 0, 0, 0 ); - level.mapcenter = maps/mp/gametypes/_spawnlogic::findboxcenter( level.nodesmins, level.nodesmaxs ); + if ( !isdefined( level.mapcenter ) ) + { + level.nodesmins = ( 0, 0, 0 ); + level.nodesmaxs = ( 0, 0, 0 ); + level.mapcenter = maps\mp\gametypes\_spawnlogic::findboxcenter( level.nodesmins, level.nodesmaxs ); /# - println( "map center: ", level.mapcenter ); + println( "map center: ", level.mapcenter ); #/ - setmapcenter( level.mapcenter ); - } + setmapcenter( level.mapcenter ); + } } start_intro_screen_zm() { - if ( level.createfx_enabled ) - { - return; - } - if ( !isDefined( level.introscreen ) ) - { - level.introscreen = newhudelem(); - level.introscreen.x = 0; - level.introscreen.y = 0; - level.introscreen.horzalign = "fullscreen"; - level.introscreen.vertalign = "fullscreen"; - level.introscreen.foreground = 0; - level.introscreen setshader( "black", 640, 480 ); - wait 0,05; - } - level.introscreen.alpha = 1; - players = get_players(); - i = 0; - while ( i < players.size ) - { - players[ i ] freezecontrols( 1 ); - i++; - } - wait 1; + if ( level.createfx_enabled ) + return; + + if ( !isdefined( level.introscreen ) ) + { + level.introscreen = newhudelem(); + level.introscreen.x = 0; + level.introscreen.y = 0; + level.introscreen.horzalign = "fullscreen"; + level.introscreen.vertalign = "fullscreen"; + level.introscreen.foreground = 0; + level.introscreen setshader( "black", 640, 480 ); + wait 0.05; + } + + level.introscreen.alpha = 1; + players = get_players(); + + for ( i = 0; i < players.size; i++ ) + players[i] freezecontrols( 1 ); + + wait 1; } diff --git a/Multiplayer Core/patch_mp/maps/mp/_medals.gsc b/Multiplayer Core/patch_mp/maps/mp/_medals.gsc index 1882351..669a0e8 100644 --- a/Multiplayer Core/patch_mp/maps/mp/_medals.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/_medals.gsc @@ -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 ); } diff --git a/Multiplayer Core/patch_mp/maps/mp/_menus.gsc b/Multiplayer Core/patch_mp/maps/mp/_menus.gsc index 7aa46bf..fee04c6 100644 --- a/Multiplayer Core/patch_mp/maps/mp/_menus.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/_menus.gsc @@ -1,4 +1,7 @@ +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool -init() //checked matches cerberus output +init() { + } diff --git a/Multiplayer Core/patch_mp/maps/mp/_mgturret.gsc b/Multiplayer Core/patch_mp/maps/mp/_mgturret.gsc index 5ab3ee2..5a9ef61 100644 --- a/Multiplayer Core/patch_mp/maps/mp/_mgturret.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/_mgturret.gsc @@ -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; + } +} diff --git a/Multiplayer Core/patch_mp/maps/mp/_multi_extracam.gsc b/Multiplayer Core/patch_mp/maps/mp/_multi_extracam.gsc index 7aa46bf..fee04c6 100644 --- a/Multiplayer Core/patch_mp/maps/mp/_multi_extracam.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/_multi_extracam.gsc @@ -1,4 +1,7 @@ +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool -init() //checked matches cerberus output +init() { + } diff --git a/Multiplayer Core/patch_mp/maps/mp/_music.gsc b/Multiplayer Core/patch_mp/maps/mp/_music.gsc index d7435a0..8d9c2db 100644 --- a/Multiplayer Core/patch_mp/maps/mp/_music.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/_music.gsc @@ -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; } diff --git a/Multiplayer Core/patch_mp/maps/mp/_pc.gsc b/Multiplayer Core/patch_mp/maps/mp/_pc.gsc index 09fbeb4..6351907 100644 --- a/Multiplayer Core/patch_mp/maps/mp/_pc.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/_pc.gsc @@ -1,5 +1,7 @@ +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool -pcserver() //checked matches cerberus output +pcserver() { - pcserverupdateplaylist(); + pcserverupdateplaylist(); } diff --git a/Multiplayer Core/patch_mp/maps/mp/_popups.gsc b/Multiplayer Core/patch_mp/maps/mp/_popups.gsc index cace8df..a4db174 100644 --- a/Multiplayer Core/patch_mp/maps/mp/_popups.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/_popups.gsc @@ -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" ); } diff --git a/Multiplayer Core/patch_mp/maps/mp/_proximity_grenade.gsc b/Multiplayer Core/patch_mp/maps/mp/_proximity_grenade.gsc index 21daf90..4c64866 100644 --- a/Multiplayer Core/patch_mp/maps/mp/_proximity_grenade.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/_proximity_grenade.gsc @@ -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 ); } diff --git a/Multiplayer Core/patch_mp/maps/mp/_riotshield.gsc b/Multiplayer Core/patch_mp/maps/mp/_riotshield.gsc index 9dfdb07..c9a26b8 100644 --- a/Multiplayer Core/patch_mp/maps/mp/_riotshield.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/_riotshield.gsc @@ -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 ); } diff --git a/Multiplayer Core/patch_mp/maps/mp/_satchel_charge.gsc b/Multiplayer Core/patch_mp/maps/mp/_satchel_charge.gsc index 887c54b..6ace53b 100644 --- a/Multiplayer Core/patch_mp/maps/mp/_satchel_charge.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/_satchel_charge.gsc @@ -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 ); } diff --git a/Multiplayer Core/patch_mp/maps/mp/_scoreevents.gsc b/Multiplayer Core/patch_mp/maps/mp/_scoreevents.gsc index 883e92b..0de92c6 100644 --- a/Multiplayer Core/patch_mp/maps/mp/_scoreevents.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/_scoreevents.gsc @@ -1,838 +1,780 @@ -#include maps/mp/gametypes/_globallogic_score; -#include maps/mp/gametypes/_rank; -#include maps/mp/killstreaks/_killstreaks; -#include maps/mp/_scoreevents; -#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\_scoreevents; +#include maps\mp\_challenges; +#include maps\mp\killstreaks\_killstreaks; +#include maps\mp\gametypes\_rank; +#include maps\mp\gametypes\_globallogic_score; init() { - level.scoreeventcallbacks = []; - level.scoreeventgameendcallback = ::ongameend; - registerscoreeventcallback( "playerKilled", ::scoreeventplayerkill ); + level.scoreeventcallbacks = []; + level.scoreeventgameendcallback = ::ongameend; + registerscoreeventcallback( "playerKilled", maps\mp\_scoreevents::scoreeventplayerkill ); } scoreeventtablelookupint( index, scoreeventcolumn ) { - return int( tablelookup( "mp/scoreInfo.csv", 0, index, scoreeventcolumn ) ); + return int( tablelookup( "mp/scoreInfo.csv", 0, index, scoreeventcolumn ) ); } scoreeventtablelookup( index, scoreeventcolumn ) { - return tablelookup( "mp/scoreInfo.csv", 0, index, scoreeventcolumn ); + return tablelookup( "mp/scoreInfo.csv", 0, index, scoreeventcolumn ); } getscoreeventcolumn( gametype ) { - columnoffset = getcolumnoffsetforgametype( gametype ); + columnoffset = getcolumnoffsetforgametype( gametype ); /# - assert( columnoffset >= 0 ); + assert( columnoffset >= 0 ); #/ - if ( columnoffset >= 0 ) - { - columnoffset += 0; - } - return columnoffset; + if ( columnoffset >= 0 ) + columnoffset += 0; + + return columnoffset; } getxpeventcolumn( gametype ) { - columnoffset = getcolumnoffsetforgametype( gametype ); + columnoffset = getcolumnoffsetforgametype( gametype ); /# - assert( columnoffset >= 0 ); + assert( columnoffset >= 0 ); #/ - if ( columnoffset >= 0 ) - { - columnoffset += 1; - } - return columnoffset; + if ( columnoffset >= 0 ) + columnoffset += 1; + + return columnoffset; } getcolumnoffsetforgametype( gametype ) { - foundgamemode = 0; - if ( !isDefined( level.scoreeventtableid ) ) - { - level.scoreeventtableid = getscoreeventtableid(); - } + foundgamemode = 0; + + if ( !isdefined( level.scoreeventtableid ) ) + level.scoreeventtableid = getscoreeventtableid(); /# - assert( isDefined( level.scoreeventtableid ) ); + assert( isdefined( level.scoreeventtableid ) ); #/ - if ( !isDefined( level.scoreeventtableid ) ) - { - return -1; - } - gamemodecolumn = 11; - for ( ;; ) - { - column_header = tablelookupcolumnforrow( level.scoreeventtableid, 0, gamemodecolumn ); - if ( column_header == "" ) - { - gamemodecolumn = 11; - break; - } - else if ( column_header == ( level.gametype + " score" ) ) - { - foundgamemode = 1; - break; - } - else - { - gamemodecolumn += 2; - } - } + if ( !isdefined( level.scoreeventtableid ) ) + return -1; + + gamemodecolumn = 11; + + for (;;) + { + column_header = tablelookupcolumnforrow( level.scoreeventtableid, 0, gamemodecolumn ); + + if ( column_header == "" ) + { + gamemodecolumn = 11; + break; + } + + if ( column_header == level.gametype + " score" ) + { + foundgamemode = 1; + break; + } + + gamemodecolumn += 2; + } /# - assert( foundgamemode, "Could not find gamemode in scoreInfo.csv:" + gametype ); + assert( foundgamemode, "Could not find gamemode in scoreInfo.csv:" + gametype ); #/ - return gamemodecolumn; + return gamemodecolumn; } getscoreeventtableid() { - scoreinfotableloaded = 0; - scoreinfotableid = tablelookupfindcoreasset( "mp/scoreInfo.csv" ); - if ( isDefined( scoreinfotableid ) ) - { - scoreinfotableloaded = 1; - } + scoreinfotableloaded = 0; + scoreinfotableid = tablelookupfindcoreasset( "mp/scoreInfo.csv" ); + + if ( isdefined( scoreinfotableid ) ) + scoreinfotableloaded = 1; /# - assert( scoreinfotableloaded, "Score Event Table is not loaded: " + "mp/scoreInfo.csv" ); + assert( scoreinfotableloaded, "Score Event Table is not loaded: " + "mp/scoreInfo.csv" ); #/ - return scoreinfotableid; + return scoreinfotableid; } isregisteredevent( type ) { - if ( isDefined( level.scoreinfo[ type ] ) ) - { - return 1; - } - else - { - return 0; - } + if ( isdefined( level.scoreinfo[type] ) ) + return true; + else + return false; } shouldaddrankxp( player ) { - if ( !isDefined( level.rankcap ) || level.rankcap == 0 ) - { - return 1; - } - if ( player.pers[ "plevel" ] > 0 || player.pers[ "rank" ] > level.rankcap ) - { - return 0; - } - return 1; + if ( !isdefined( level.rankcap ) || level.rankcap == 0 ) + return true; + + if ( player.pers["plevel"] > 0 || player.pers["rank"] > level.rankcap ) + return false; + + return true; } processscoreevent( event, player, victim, weapon ) { - pixbeginevent( "processScoreEvent" ); - scoregiven = 0; - if ( !isplayer( player ) ) - { + pixbeginevent( "processScoreEvent" ); + scoregiven = 0; + + if ( !isplayer( player ) ) + { /# - assertmsg( "processScoreEvent called on non player entity: " + event ); + assertmsg( "processScoreEvent called on non player entity: " + event ); #/ - return scoregiven; - } - player thread maps/mp/_challenges::eventreceived( event ); - if ( isregisteredevent( event ) ) - { - allowplayerscore = 0; - if ( !isDefined( weapon ) || maps/mp/killstreaks/_killstreaks::iskillstreakweapon( weapon ) == 0 ) - { - allowplayerscore = 1; - } - else - { - allowplayerscore = maps/mp/gametypes/_rank::killstreakweaponsallowedscore( event ); - } - if ( allowplayerscore ) - { - scoregiven = maps/mp/gametypes/_globallogic_score::giveplayerscore( event, player, victim, weapon, undefined ); - isscoreevent = scoregiven > 0; - } - } - if ( shouldaddrankxp( player ) ) - { - player addrankxp( event, weapon, isscoreevent ); - } - pixendevent(); - return scoregiven; + return scoregiven; + } + + player thread maps\mp\_challenges::eventreceived( event ); + + if ( isregisteredevent( event ) ) + { + allowplayerscore = 0; + + if ( !isdefined( weapon ) || maps\mp\killstreaks\_killstreaks::iskillstreakweapon( weapon ) == 0 ) + allowplayerscore = 1; + else + allowplayerscore = maps\mp\gametypes\_rank::killstreakweaponsallowedscore( event ); + + if ( allowplayerscore ) + { + scoregiven = maps\mp\gametypes\_globallogic_score::giveplayerscore( event, player, victim, weapon, undefined ); + isscoreevent = scoregiven > 0; + } + } + + if ( shouldaddrankxp( player ) ) + player addrankxp( event, weapon, isscoreevent ); + + pixendevent(); + return scoregiven; } registerscoreeventcallback( callback, func ) { - if ( !isDefined( level.scoreeventcallbacks[ callback ] ) ) - { - level.scoreeventcallbacks[ callback ] = []; - } - level.scoreeventcallbacks[ callback ][ level.scoreeventcallbacks[ callback ].size ] = func; + if ( !isdefined( level.scoreeventcallbacks[callback] ) ) + level.scoreeventcallbacks[callback] = []; + + level.scoreeventcallbacks[callback][level.scoreeventcallbacks[callback].size] = func; } scoreeventplayerkill( data, time ) { - victim = data.victim; - attacker = data.attacker; - time = data.time; - level.numkills++; - victim = data.victim; - attacker.lastkilledplayer = victim; - wasdefusing = data.wasdefusing; - wasplanting = data.wasplanting; - wasonground = data.victimonground; - meansofdeath = data.smeansofdeath; - if ( isDefined( data.sweapon ) ) - { - weapon = data.sweapon; - weaponclass = getweaponclass( data.sweapon ); - killstreak = getkillstreakfromweapon( data.sweapon ); - } - victim.anglesondeath = victim getplayerangles(); - if ( meansofdeath != "MOD_GRENADE" && meansofdeath != "MOD_GRENADE_SPLASH" && meansofdeath != "MOD_EXPLOSIVE" && meansofdeath != "MOD_EXPLOSIVE_SPLASH" || meansofdeath == "MOD_PROJECTILE" && meansofdeath == "MOD_PROJECTILE_SPLASH" ) - { - if ( weapon == "none" && isDefined( data.victim.explosiveinfo[ "weapon" ] ) ) - { - weapon = data.victim.explosiveinfo[ "weapon" ]; - } - } - while ( level.teambased ) - { - attacker.lastkilltime = time; - if ( isDefined( victim.lastkilltime ) && victim.lastkilltime > ( time - 3000 ) ) - { - if ( isDefined( victim.lastkilledplayer ) && victim.lastkilledplayer isenemyplayer( attacker ) == 0 && attacker != victim.lastkilledplayer ) - { - processscoreevent( "kill_enemy_who_killed_teammate", attacker, victim, weapon ); - victim recordkillmodifier( "avenger" ); - } - } - while ( isDefined( victim.damagedplayers ) ) - { - keys = getarraykeys( victim.damagedplayers ); - i = 0; - while ( i < keys.size ) - { - key = keys[ i ]; - if ( key == attacker.clientid ) - { - i++; - continue; - } - else if ( !isDefined( victim.damagedplayers[ key ].entity ) ) - { - i++; - continue; - } - else if ( attacker isenemyplayer( victim.damagedplayers[ key ].entity ) ) - { - i++; - continue; - } - else - { - if ( ( time - victim.damagedplayers[ key ].time ) < 1000 ) - { - processscoreevent( "kill_enemy_injuring_teammate", attacker, victim, weapon ); - if ( isDefined( victim.damagedplayers[ key ].entity ) ) - { - victim.damagedplayers[ key ].entity.lastrescuedby = attacker; - victim.damagedplayers[ key ].entity.lastrescuedtime = time; - } - victim recordkillmodifier( "defender" ); - } - } - i++; - } - } - } - switch( weapon ) - { - case "hatchet_mp": - attacker.pers[ "tomahawks" ]++; - attacker.tomahawks = attacker.pers[ "tomahawks" ]; - processscoreevent( "hatchet_kill", attacker, victim, weapon ); - if ( isDefined( data.victim.explosiveinfo[ "projectile_bounced" ] ) && data.victim.explosiveinfo[ "projectile_bounced" ] == 1 ) - { - level.globalbankshots++; - processscoreevent( "bounce_hatchet_kill", attacker, victim, weapon ); - } - break; - case "knife_ballistic_mp": - if ( meansofdeath == "MOD_PISTOL_BULLET" || meansofdeath == "MOD_HEAD_SHOT" ) - { - processscoreevent( "ballistic_knife_kill", attacker, victim, data.sweapon ); - } - attacker addweaponstat( weapon, "ballistic_knife_kill", 1 ); - break; - case "inventory_supplydrop_mp": - case "supplydrop_mp": - if ( meansofdeath == "MOD_HIT_BY_OBJECT" || meansofdeath == "MOD_CRUSH" ) - { - processscoreevent( "kill_enemy_with_care_package_crush", attacker, victim, weapon ); - } - else - { - processscoreevent( "kill_enemy_with_hacked_care_package", attacker, victim, weapon ); - } - break; - } - if ( isDefined( data.victimweapon ) ) - { - if ( data.victimweapon == "minigun_mp" ) - { - processscoreevent( "killed_death_machine_enemy", attacker, victim, weapon ); - } - else - { - if ( data.victimweapon == "m32_mp" ) - { - processscoreevent( "killed_multiple_grenade_launcher_enemy", attacker, victim, weapon ); - } - } - } - attacker thread updatemultikills( weapon, weaponclass, killstreak ); - if ( level.numkills == 1 ) - { - victim recordkillmodifier( "firstblood" ); - processscoreevent( "first_kill", attacker, victim, weapon ); - } - else - { - if ( isDefined( attacker.lastkilledby ) ) - { - if ( attacker.lastkilledby == victim ) - { - level.globalpaybacks++; - processscoreevent( "revenge_kill", attacker, victim, weapon ); - attacker addweaponstat( weapon, "revenge_kill", 1 ); - victim recordkillmodifier( "revenge" ); - attacker.lastkilledby = undefined; - } - } - if ( victim maps/mp/killstreaks/_killstreaks::isonakillstreak() ) - { - level.globalbuzzkills++; - processscoreevent( "stop_enemy_killstreak", attacker, victim, weapon ); - victim recordkillmodifier( "buzzkill" ); - } - if ( isDefined( victim.lastmansd ) && victim.lastmansd == 1 ) - { - processscoreevent( "final_kill_elimination", attacker, victim, weapon ); - if ( isDefined( attacker.lastmansd ) && attacker.lastmansd == 1 ) - { - processscoreevent( "elimination_and_last_player_alive", attacker, victim, weapon ); - } - } - } - if ( is_weapon_valid( meansofdeath, weapon, weaponclass ) ) - { - if ( isDefined( victim.vattackerorigin ) ) - { - attackerorigin = victim.vattackerorigin; - } - else - { - attackerorigin = attacker.origin; - } - disttovictim = distancesquared( victim.origin, attackerorigin ); - weap_min_dmg_range = get_distance_for_weapon( weapon, weaponclass ); - if ( disttovictim > weap_min_dmg_range ) - { - attacker maps/mp/_challenges::longdistancekill(); - if ( weapon == "hatchet_mp" ) - { - attacker maps/mp/_challenges::longdistancehatchetkill(); - } - processscoreevent( "longshot_kill", attacker, victim, weapon ); - attacker addweaponstat( weapon, "longshot_kill", 1 ); - attacker.pers[ "longshots" ]++; - attacker.longshots = attacker.pers[ "longshots" ]; - victim recordkillmodifier( "longshot" ); - } - } - if ( isalive( attacker ) ) - { - if ( attacker.health < ( attacker.maxhealth * 0,35 ) ) - { - attacker.lastkillwheninjured = time; - processscoreevent( "kill_enemy_when_injured", attacker, victim, weapon ); - attacker addweaponstat( weapon, "kill_enemy_when_injured", 1 ); - if ( attacker hasperk( "specialty_bulletflinch" ) ) - { - attacker addplayerstat( "perk_bulletflinch_kills", 1 ); - } - } - } - else - { - if ( isDefined( attacker.deathtime ) && ( attacker.deathtime + 800 ) < time && !attacker isinvehicle() ) - { - level.globalafterlifes++; - processscoreevent( "kill_enemy_after_death", attacker, victim, weapon ); - victim recordkillmodifier( "posthumous" ); - } - } - if ( attacker.cur_death_streak >= 3 ) - { - level.globalcomebacks++; - processscoreevent( "comeback_from_deathstreak", attacker, victim, weapon ); - victim recordkillmodifier( "comeback" ); - } - if ( isDefined( victim.beingmicrowavedby ) && weapon != "microwave_turret_mp" ) - { - if ( victim.beingmicrowavedby != attacker && attacker isenemyplayer( victim.beingmicrowavedby ) == 0 ) - { - scoregiven = processscoreevent( "microwave_turret_assist", victim.beingmicrowavedby, victim, weapon ); - if ( isDefined( scoregiven ) && isDefined( victim.beingmicrowavedby ) ) - { - victim.beingmicrowavedby maps/mp/_challenges::earnedmicrowaveassistscore( scoregiven ); - } - } - else - { - attacker maps/mp/_challenges::killwhiledamagingwithhpm(); - } - } - if ( meansofdeath == "MOD_MELEE" && weapon != "riotshield_mp" ) - { - attacker.pers[ "stabs" ]++; - attacker.stabs = attacker.pers[ "stabs" ]; - vangles = victim.anglesondeath[ 1 ]; - pangles = attacker.anglesonkill[ 1 ]; - anglediff = angleClamp180( vangles - pangles ); - if ( anglediff > -30 && anglediff < 70 ) - { - level.globalbackstabs++; - processscoreevent( "backstabber_kill", attacker, victim, weapon ); - attacker addweaponstat( weapon, "backstabber_kill", 1 ); - attacker.pers[ "backstabs" ]++; - attacker.backstabs = attacker.pers[ "backstabs" ]; - } - } - else - { - if ( isDefined( victim.firsttimedamaged ) && victim.firsttimedamaged == time ) - { - if ( weaponclass == "weapon_sniper" ) - { - attacker thread updateoneshotmultikills( victim, weapon, victim.firsttimedamaged ); - attacker addweaponstat( weapon, "kill_enemy_one_bullet", 1 ); - } - } - if ( isDefined( attacker.tookweaponfrom[ weapon ] ) && isDefined( attacker.tookweaponfrom[ weapon ].previousowner ) ) - { - pickedupweapon = attacker.tookweaponfrom[ weapon ]; - if ( pickedupweapon.previousowner == victim ) - { - processscoreevent( "kill_enemy_with_their_weapon", attacker, victim, weapon ); - attacker addweaponstat( weapon, "kill_enemy_with_their_weapon", 1 ); - if ( isDefined( pickedupweapon.sweapon ) && isDefined( pickedupweapon.smeansofdeath ) ) - { - if ( pickedupweapon.sweapon == "knife_held_mp" && pickedupweapon.smeansofdeath == "MOD_MELEE" ) - { - attacker addweaponstat( "knife_held_mp", "kill_enemy_with_their_weapon", 1 ); - } - } - } - } - } - if ( wasdefusing ) - { - processscoreevent( "killed_bomb_defuser", attacker, victim, weapon ); - } - else - { - if ( wasplanting ) - { - processscoreevent( "killed_bomb_planter", attacker, victim, weapon ); - } - } - specificweaponkill( attacker, victim, weapon, killstreak ); - if ( !isDefined( killstreak ) && isDefined( attacker.dtptime ) && ( attacker.dtptime + 5000 ) > time ) - { - attacker.dtptime = 0; - if ( attacker getstance() == "prone" ) - { - processscoreevent( "kill_enemy_recent_dive_prone", attacker, self, weapon ); - } - } - if ( isDefined( killstreak ) ) - { - victim recordkillmodifier( "killstreak" ); - } - attacker.cur_death_streak = 0; - attacker disabledeathstreak(); + victim = data.victim; + attacker = data.attacker; + time = data.time; + level.numkills++; + victim = data.victim; + attacker.lastkilledplayer = victim; + wasdefusing = data.wasdefusing; + wasplanting = data.wasplanting; + wasonground = data.victimonground; + meansofdeath = data.smeansofdeath; + + if ( isdefined( data.sweapon ) ) + { + weapon = data.sweapon; + weaponclass = getweaponclass( data.sweapon ); + killstreak = getkillstreakfromweapon( data.sweapon ); + } + + victim.anglesondeath = victim getplayerangles(); + + if ( meansofdeath == "MOD_GRENADE" || meansofdeath == "MOD_GRENADE_SPLASH" || meansofdeath == "MOD_EXPLOSIVE" || meansofdeath == "MOD_EXPLOSIVE_SPLASH" || meansofdeath == "MOD_PROJECTILE" || meansofdeath == "MOD_PROJECTILE_SPLASH" ) + { + if ( weapon == "none" && isdefined( data.victim.explosiveinfo["weapon"] ) ) + weapon = data.victim.explosiveinfo["weapon"]; + } + + if ( level.teambased ) + { + attacker.lastkilltime = time; + + if ( isdefined( victim.lastkilltime ) && victim.lastkilltime > time - 3000 ) + { + if ( isdefined( victim.lastkilledplayer ) && victim.lastkilledplayer isenemyplayer( attacker ) == 0 && attacker != victim.lastkilledplayer ) + { + processscoreevent( "kill_enemy_who_killed_teammate", attacker, victim, weapon ); + victim recordkillmodifier( "avenger" ); + } + } + + if ( isdefined( victim.damagedplayers ) ) + { + keys = getarraykeys( victim.damagedplayers ); + + for ( i = 0; i < keys.size; i++ ) + { + key = keys[i]; + + if ( key == attacker.clientid ) + continue; + + if ( !isdefined( victim.damagedplayers[key].entity ) ) + continue; + + if ( attacker isenemyplayer( victim.damagedplayers[key].entity ) ) + continue; + + if ( time - victim.damagedplayers[key].time < 1000 ) + { + processscoreevent( "kill_enemy_injuring_teammate", attacker, victim, weapon ); + + if ( isdefined( victim.damagedplayers[key].entity ) ) + { + victim.damagedplayers[key].entity.lastrescuedby = attacker; + victim.damagedplayers[key].entity.lastrescuedtime = time; + } + + victim recordkillmodifier( "defender" ); + } + } + } + } + + switch ( weapon ) + { + case "hatchet_mp": + attacker.pers["tomahawks"]++; + attacker.tomahawks = attacker.pers["tomahawks"]; + processscoreevent( "hatchet_kill", attacker, victim, weapon ); + + if ( isdefined( data.victim.explosiveinfo["projectile_bounced"] ) && data.victim.explosiveinfo["projectile_bounced"] == 1 ) + { + level.globalbankshots++; + processscoreevent( "bounce_hatchet_kill", attacker, victim, weapon ); + } + + break; + case "knife_ballistic_mp": + if ( meansofdeath == "MOD_PISTOL_BULLET" || meansofdeath == "MOD_HEAD_SHOT" ) + processscoreevent( "ballistic_knife_kill", attacker, victim, data.sweapon ); + + attacker addweaponstat( weapon, "ballistic_knife_kill", 1 ); + break; + case "supplydrop_mp": + case "inventory_supplydrop_mp": + if ( meansofdeath == "MOD_HIT_BY_OBJECT" || meansofdeath == "MOD_CRUSH" ) + processscoreevent( "kill_enemy_with_care_package_crush", attacker, victim, weapon ); + else + processscoreevent( "kill_enemy_with_hacked_care_package", attacker, victim, weapon ); + + break; + } + + if ( isdefined( data.victimweapon ) ) + { + if ( data.victimweapon == "minigun_mp" ) + processscoreevent( "killed_death_machine_enemy", attacker, victim, weapon ); + else if ( data.victimweapon == "m32_mp" ) + processscoreevent( "killed_multiple_grenade_launcher_enemy", attacker, victim, weapon ); + } + + attacker thread updatemultikills( weapon, weaponclass, killstreak ); + + if ( level.numkills == 1 ) + { + victim recordkillmodifier( "firstblood" ); + processscoreevent( "first_kill", attacker, victim, weapon ); + } + else + { + if ( isdefined( attacker.lastkilledby ) ) + { + if ( attacker.lastkilledby == victim ) + { + level.globalpaybacks++; + processscoreevent( "revenge_kill", attacker, victim, weapon ); + attacker addweaponstat( weapon, "revenge_kill", 1 ); + victim recordkillmodifier( "revenge" ); + attacker.lastkilledby = undefined; + } + } + + if ( victim maps\mp\killstreaks\_killstreaks::isonakillstreak() ) + { + level.globalbuzzkills++; + processscoreevent( "stop_enemy_killstreak", attacker, victim, weapon ); + victim recordkillmodifier( "buzzkill" ); + } + + if ( isdefined( victim.lastmansd ) && victim.lastmansd == 1 ) + { + processscoreevent( "final_kill_elimination", attacker, victim, weapon ); + + if ( isdefined( attacker.lastmansd ) && attacker.lastmansd == 1 ) + processscoreevent( "elimination_and_last_player_alive", attacker, victim, weapon ); + } + } + + if ( is_weapon_valid( meansofdeath, weapon, weaponclass ) ) + { + if ( isdefined( victim.vattackerorigin ) ) + attackerorigin = victim.vattackerorigin; + else + attackerorigin = attacker.origin; + + disttovictim = distancesquared( victim.origin, attackerorigin ); + weap_min_dmg_range = get_distance_for_weapon( weapon, weaponclass ); + + if ( disttovictim > weap_min_dmg_range ) + { + attacker maps\mp\_challenges::longdistancekill(); + + if ( weapon == "hatchet_mp" ) + attacker maps\mp\_challenges::longdistancehatchetkill(); + + processscoreevent( "longshot_kill", attacker, victim, weapon ); + attacker addweaponstat( weapon, "longshot_kill", 1 ); + attacker.pers["longshots"]++; + attacker.longshots = attacker.pers["longshots"]; + victim recordkillmodifier( "longshot" ); + } + } + + if ( isalive( attacker ) ) + { + if ( attacker.health < attacker.maxhealth * 0.35 ) + { + attacker.lastkillwheninjured = time; + processscoreevent( "kill_enemy_when_injured", attacker, victim, weapon ); + attacker addweaponstat( weapon, "kill_enemy_when_injured", 1 ); + + if ( attacker hasperk( "specialty_bulletflinch" ) ) + attacker addplayerstat( "perk_bulletflinch_kills", 1 ); + } + } + else if ( isdefined( attacker.deathtime ) && attacker.deathtime + 800 < time && !attacker isinvehicle() ) + { + level.globalafterlifes++; + processscoreevent( "kill_enemy_after_death", attacker, victim, weapon ); + victim recordkillmodifier( "posthumous" ); + } + + if ( attacker.cur_death_streak >= 3 ) + { + level.globalcomebacks++; + processscoreevent( "comeback_from_deathstreak", attacker, victim, weapon ); + victim recordkillmodifier( "comeback" ); + } + + if ( isdefined( victim.beingmicrowavedby ) && weapon != "microwave_turret_mp" ) + { + if ( victim.beingmicrowavedby != attacker && attacker isenemyplayer( victim.beingmicrowavedby ) == 0 ) + { + scoregiven = processscoreevent( "microwave_turret_assist", victim.beingmicrowavedby, victim, weapon ); + + if ( isdefined( scoregiven ) && isdefined( victim.beingmicrowavedby ) ) + victim.beingmicrowavedby maps\mp\_challenges::earnedmicrowaveassistscore( scoregiven ); + } + else + attacker maps\mp\_challenges::killwhiledamagingwithhpm(); + } + + if ( meansofdeath == "MOD_MELEE" && weapon != "riotshield_mp" ) + { + attacker.pers["stabs"]++; + attacker.stabs = attacker.pers["stabs"]; + vangles = victim.anglesondeath[1]; + pangles = attacker.anglesonkill[1]; + anglediff = angleclamp180( vangles - pangles ); + + if ( anglediff > -30 && anglediff < 70 ) + { + level.globalbackstabs++; + processscoreevent( "backstabber_kill", attacker, victim, weapon ); + attacker addweaponstat( weapon, "backstabber_kill", 1 ); + attacker.pers["backstabs"]++; + attacker.backstabs = attacker.pers["backstabs"]; + } + } + else + { + if ( isdefined( victim.firsttimedamaged ) && victim.firsttimedamaged == time ) + { + if ( weaponclass == "weapon_sniper" ) + { + attacker thread updateoneshotmultikills( victim, weapon, victim.firsttimedamaged ); + attacker addweaponstat( weapon, "kill_enemy_one_bullet", 1 ); + } + } + + if ( isdefined( attacker.tookweaponfrom[weapon] ) && isdefined( attacker.tookweaponfrom[weapon].previousowner ) ) + { + pickedupweapon = attacker.tookweaponfrom[weapon]; + + if ( pickedupweapon.previousowner == victim ) + { + processscoreevent( "kill_enemy_with_their_weapon", attacker, victim, weapon ); + attacker addweaponstat( weapon, "kill_enemy_with_their_weapon", 1 ); + + if ( isdefined( pickedupweapon.sweapon ) && isdefined( pickedupweapon.smeansofdeath ) ) + { + if ( pickedupweapon.sweapon == "knife_held_mp" && pickedupweapon.smeansofdeath == "MOD_MELEE" ) + attacker addweaponstat( "knife_held_mp", "kill_enemy_with_their_weapon", 1 ); + } + } + } + } + + if ( wasdefusing ) + processscoreevent( "killed_bomb_defuser", attacker, victim, weapon ); + else if ( wasplanting ) + processscoreevent( "killed_bomb_planter", attacker, victim, weapon ); + + specificweaponkill( attacker, victim, weapon, killstreak ); + + if ( !isdefined( killstreak ) && isdefined( attacker.dtptime ) && attacker.dtptime + 5000 > time ) + { + attacker.dtptime = 0; + + if ( attacker getstance() == "prone" ) + processscoreevent( "kill_enemy_recent_dive_prone", attacker, self, weapon ); + } + + if ( isdefined( killstreak ) ) + victim recordkillmodifier( "killstreak" ); + + attacker.cur_death_streak = 0; + attacker disabledeathstreak(); } specificweaponkill( attacker, victim, weapon, killstreak ) { - switchweapon = weapon; - if ( isDefined( killstreak ) ) - { - switchweapon = killstreak; - } - switch( switchweapon ) - { - case "crossbow_mp": - case "explosive_bolt_mp": - if ( isDefined( victim.explosiveinfo[ "stuckToPlayer" ] ) && victim.explosiveinfo[ "stuckToPlayer" ] == victim ) - { - event = "crossbow_kill"; - } - else - { - return; - } - break; - case "rcbomb_mp": - event = "rcxd_kill"; - break; - case "remote_missile_mp": - event = "remote_missile_kill"; - break; - case "missile_drone_mp": - event = "missile_drone_kill"; - break; - case "autoturret_mp": - event = "sentry_gun_kill"; - break; - case "planemortar_mp": - event = "plane_mortar_kill"; - break; - case "inventory_minigun_mp": - case "minigun_mp": - event = "death_machine_kill"; - break; - case "inventory_m32_mp": - case "m32_mp": - event = "multiple_grenade_launcher_kill"; - break; - case "qrdrone_mp": - event = "qrdrone_kill"; - break; - case "ai_tank_drop_mp": - event = "aitank_kill"; - break; - case "helicopter_guard_mp": - event = "helicopter_guard_kill"; - break; - case "straferun_mp": - event = "strafe_run_kill"; - break; - case "remote_mortar_mp": - event = "remote_mortar_kill"; - break; - case "helicopter_player_gunner_mp": - event = "helicopter_gunner_kill"; - break; - case "dogs_mp": - event = "dogs_kill"; - break; - case "missile_swarm_mp": - event = "missile_swarm_kill"; - break; - case "helicopter_comlink_mp": - event = "helicopter_comlink_kill"; - break; - case "microwaveturret_mp": - event = "microwave_turret_kill"; - break; - default: - return; - } - processscoreevent( event, attacker, victim, weapon ); + switchweapon = weapon; + + if ( isdefined( killstreak ) ) + switchweapon = killstreak; + + switch ( switchweapon ) + { + case "explosive_bolt_mp": + case "crossbow_mp": + if ( isdefined( victim.explosiveinfo["stuckToPlayer"] ) && victim.explosiveinfo["stuckToPlayer"] == victim ) + event = "crossbow_kill"; + else + return; + + break; + case "rcbomb_mp": + event = "rcxd_kill"; + break; + case "remote_missile_mp": + event = "remote_missile_kill"; + break; + case "missile_drone_mp": + event = "missile_drone_kill"; + break; + case "autoturret_mp": + event = "sentry_gun_kill"; + break; + case "planemortar_mp": + event = "plane_mortar_kill"; + break; + case "minigun_mp": + case "inventory_minigun_mp": + event = "death_machine_kill"; + break; + case "m32_mp": + case "inventory_m32_mp": + event = "multiple_grenade_launcher_kill"; + break; + case "qrdrone_mp": + event = "qrdrone_kill"; + break; + case "ai_tank_drop_mp": + event = "aitank_kill"; + break; + case "helicopter_guard_mp": + event = "helicopter_guard_kill"; + break; + case "straferun_mp": + event = "strafe_run_kill"; + break; + case "remote_mortar_mp": + event = "remote_mortar_kill"; + break; + case "helicopter_player_gunner_mp": + event = "helicopter_gunner_kill"; + break; + case "dogs_mp": + event = "dogs_kill"; + break; + case "missile_swarm_mp": + event = "missile_swarm_kill"; + break; + case "helicopter_comlink_mp": + event = "helicopter_comlink_kill"; + break; + case "microwaveturret_mp": + event = "microwave_turret_kill"; + break; + default: + return; + } + + processscoreevent( event, attacker, victim, weapon ); } multikill( killcount, weapon ) { /# - assert( killcount > 1 ); + assert( killcount > 1 ); #/ - self maps/mp/_challenges::multikill( killcount, weapon ); - if ( killcount > 8 ) - { - processscoreevent( "multikill_more_than_8", self, undefined, weapon ); - } - else - { - processscoreevent( "multikill_" + killcount, self, undefined, weapon ); - } - self recordmultikill( killcount ); + self maps\mp\_challenges::multikill( killcount, weapon ); + + if ( killcount > 8 ) + processscoreevent( "multikill_more_than_8", self, undefined, weapon ); + else + processscoreevent( "multikill_" + killcount, self, undefined, weapon ); + + self recordmultikill( killcount ); } uninterruptedobitfeedkills( attacker, sweapon ) { - self endon( "disconnect" ); - wait 0,1; - waittillslowprocessallowed(); - wait 0,1; - maps/mp/_scoreevents::processscoreevent( "uninterrupted_obit_feed_kills", attacker, self, sweapon ); + self endon( "disconnect" ); + wait 0.1; + waittillslowprocessallowed(); + wait 0.1; + maps\mp\_scoreevents::processscoreevent( "uninterrupted_obit_feed_kills", attacker, self, sweapon ); } is_weapon_valid( meansofdeath, weapon, weaponclass ) { - valid_weapon = 0; - if ( get_distance_for_weapon( weapon, weaponclass ) == 0 ) - { - valid_weapon = 0; - } - else if ( meansofdeath == "MOD_PISTOL_BULLET" || meansofdeath == "MOD_RIFLE_BULLET" ) - { - valid_weapon = 1; - } - else - { - if ( meansofdeath == "MOD_HEAD_SHOT" ) - { - valid_weapon = 1; - } - else - { - if ( weapon == "hatchet_mp" && meansofdeath == "MOD_IMPACT" ) - { - valid_weapon = 1; - } - } - } - return valid_weapon; + valid_weapon = 0; + + if ( get_distance_for_weapon( weapon, weaponclass ) == 0 ) + valid_weapon = 0; + else if ( meansofdeath == "MOD_PISTOL_BULLET" || meansofdeath == "MOD_RIFLE_BULLET" ) + valid_weapon = 1; + else if ( meansofdeath == "MOD_HEAD_SHOT" ) + valid_weapon = 1; + else if ( weapon == "hatchet_mp" && meansofdeath == "MOD_IMPACT" ) + valid_weapon = 1; + + return valid_weapon; } updatemultikills( weapon, weaponclass, killstreak ) { - self endon( "disconnect" ); - level endon( "game_ended" ); - self notify( "updateRecentKills" ); - self endon( "updateRecentKills" ); - baseweaponname = getreffromitemindex( getbaseweaponitemindex( weapon ) ) + "_mp"; - if ( !isDefined( self.recentkillcount ) ) - { - self.recentkillcount = 0; - } - if ( !isDefined( self.recentkillcountweapon ) || self.recentkillcountweapon != baseweaponname ) - { - self.recentkillcountsameweapon = 0; - self.recentkillcountweapon = baseweaponname; - } - if ( !isDefined( killstreak ) ) - { - self.recentkillcountsameweapon++; - self.recentkillcount++; - } - if ( !isDefined( self.recent_lmg_smg_killcount ) ) - { - self.recent_lmg_smg_killcount = 0; - } - if ( !isDefined( self.recentremotemissilekillcount ) ) - { - self.recentremotemissilekillcount = 0; - } - if ( !isDefined( self.recentremotemissileattackerkillcount ) ) - { - self.recentremotemissileattackerkillcount = 0; - } - if ( !isDefined( self.recentrcbombkillcount ) ) - { - self.recentrcbombkillcount = 0; - } - if ( !isDefined( self.recentrcbombattackerkillcount ) ) - { - self.recentrcbombattackerkillcount = 0; - } - if ( !isDefined( self.recentmglkillcount ) ) - { - self.recentmglkillcount = 0; - } - if ( isDefined( weaponclass ) ) - { - if ( weaponclass == "weapon_lmg" || weaponclass == "weapon_smg" ) - { - if ( self playerads() < 1 ) - { - self.recent_lmg_smg_killcount++; - } - } - } - if ( isDefined( killstreak ) ) - { - switch( killstreak ) - { - case "remote_missile_mp": - self.recentremotemissilekillcount++; - break; - case "rcbomb_mp": - self.recentrcbombkillcount++; - break; - case "inventory_m32_mp": - case "m32_mp": - self.recentmglkillcount++; - break; - } - } - if ( self.recentkillcountsameweapon == 2 ) - { - self addweaponstat( weapon, "multikill_2", 1 ); - } - else if ( self.recentkillcountsameweapon == 3 ) - { - self addweaponstat( weapon, "multikill_3", 1 ); - } - self waittilltimeoutordeath( 4 ); - if ( self.recent_lmg_smg_killcount >= 3 ) - { - self maps/mp/_challenges::multi_lmg_smg_kill(); - } - if ( self.recentrcbombkillcount >= 2 ) - { - self maps/mp/_challenges::multi_rcbomb_kill(); - } - if ( self.recentmglkillcount >= 3 ) - { - self maps/mp/_challenges::multi_mgl_kill(); - } - if ( self.recentremotemissilekillcount >= 3 ) - { - self maps/mp/_challenges::multi_remotemissile_kill(); - } - if ( self.recentkillcount > 1 ) - { - self multikill( self.recentkillcount, weapon ); - } - self.recentkillcount = 0; - self.recentkillcountsameweapon = 0; - self.recentkillcountweapon = undefined; - self.recent_lmg_smg_killcount = 0; - self.recentremotemissilekillcount = 0; - self.recentremotemissileattackerkillcount = 0; - self.recentrcbombkillcount = 0; - self.recentmglkillcount = 0; + self endon( "disconnect" ); + level endon( "game_ended" ); + self notify( "updateRecentKills" ); + self endon( "updateRecentKills" ); + baseweaponname = getreffromitemindex( getbaseweaponitemindex( weapon ) ) + "_mp"; + + if ( !isdefined( self.recentkillcount ) ) + self.recentkillcount = 0; + + if ( !isdefined( self.recentkillcountweapon ) || self.recentkillcountweapon != baseweaponname ) + { + self.recentkillcountsameweapon = 0; + self.recentkillcountweapon = baseweaponname; + } + + if ( !isdefined( killstreak ) ) + { + self.recentkillcountsameweapon++; + self.recentkillcount++; + } + + if ( !isdefined( self.recent_lmg_smg_killcount ) ) + self.recent_lmg_smg_killcount = 0; + + if ( !isdefined( self.recentremotemissilekillcount ) ) + self.recentremotemissilekillcount = 0; + + if ( !isdefined( self.recentremotemissileattackerkillcount ) ) + self.recentremotemissileattackerkillcount = 0; + + if ( !isdefined( self.recentrcbombkillcount ) ) + self.recentrcbombkillcount = 0; + + if ( !isdefined( self.recentrcbombattackerkillcount ) ) + self.recentrcbombattackerkillcount = 0; + + if ( !isdefined( self.recentmglkillcount ) ) + self.recentmglkillcount = 0; + + if ( isdefined( weaponclass ) ) + { + if ( weaponclass == "weapon_lmg" || weaponclass == "weapon_smg" ) + { + if ( self playerads() < 1.0 ) + self.recent_lmg_smg_killcount++; + } + } + + if ( isdefined( killstreak ) ) + { + switch ( killstreak ) + { + case "remote_missile_mp": + self.recentremotemissilekillcount++; + break; + case "rcbomb_mp": + self.recentrcbombkillcount++; + break; + case "m32_mp": + case "inventory_m32_mp": + self.recentmglkillcount++; + break; + } + } + + if ( self.recentkillcountsameweapon == 2 ) + self addweaponstat( weapon, "multikill_2", 1 ); + else if ( self.recentkillcountsameweapon == 3 ) + self addweaponstat( weapon, "multikill_3", 1 ); + + self waittilltimeoutordeath( 4.0 ); + + if ( self.recent_lmg_smg_killcount >= 3 ) + self maps\mp\_challenges::multi_lmg_smg_kill(); + + if ( self.recentrcbombkillcount >= 2 ) + self maps\mp\_challenges::multi_rcbomb_kill(); + + if ( self.recentmglkillcount >= 3 ) + self maps\mp\_challenges::multi_mgl_kill(); + + if ( self.recentremotemissilekillcount >= 3 ) + self maps\mp\_challenges::multi_remotemissile_kill(); + + if ( self.recentkillcount > 1 ) + self multikill( self.recentkillcount, weapon ); + + self.recentkillcount = 0; + self.recentkillcountsameweapon = 0; + self.recentkillcountweapon = undefined; + self.recent_lmg_smg_killcount = 0; + self.recentremotemissilekillcount = 0; + self.recentremotemissileattackerkillcount = 0; + self.recentrcbombkillcount = 0; + self.recentmglkillcount = 0; } waittilltimeoutordeath( timeout ) { - self endon( "death" ); - wait timeout; + self endon( "death" ); + wait( timeout ); } updateoneshotmultikills( victim, weapon, firsttimedamaged ) { - self endon( "death" ); - self endon( "disconnect" ); - self notify( "updateoneshotmultikills" + firsttimedamaged ); - self endon( "updateoneshotmultikills" + firsttimedamaged ); - if ( !isDefined( self.oneshotmultikills ) ) - { - self.oneshotmultikills = 0; - } - self.oneshotmultikills++; - wait 1; - if ( self.oneshotmultikills > 1 ) - { - processscoreevent( "kill_enemies_one_bullet", self, victim, weapon ); - } - else - { - processscoreevent( "kill_enemy_one_bullet", self, victim, weapon ); - } - self.oneshotmultikills = 0; + self endon( "death" ); + self endon( "disconnect" ); + self notify( "updateoneshotmultikills" + firsttimedamaged ); + self endon( "updateoneshotmultikills" + firsttimedamaged ); + + if ( !isdefined( self.oneshotmultikills ) ) + self.oneshotmultikills = 0; + + self.oneshotmultikills++; + wait 1.0; + + if ( self.oneshotmultikills > 1 ) + processscoreevent( "kill_enemies_one_bullet", self, victim, weapon ); + else + processscoreevent( "kill_enemy_one_bullet", self, victim, weapon ); + + self.oneshotmultikills = 0; } get_distance_for_weapon( weapon, weaponclass ) { - distance = 0; - switch( weaponclass ) - { - case "weapon_smg": - distance = 1562500; - break; - case "weapon_assault": - distance = 2250000; - break; - case "weapon_lmg": - distance = 2250000; - break; - case "weapon_sniper": - distance = 3062500; - break; - case "weapon_pistol": - distance = 490000; - break; - case "weapon_cqb": - distance = 422500; - break; - case "weapon_special": - if ( weapon == "knife_ballistic_mp" ) - { - distance = 2250000; - } - else if ( weapon == "crossbow_mp" ) - { - distance = 2250000; - } - else - { - if ( weapon == "metalstorm_mp" ) - { - distance = 3062500; - } - } - break; - case "weapon_grenade": - if ( weapon == "hatchet_mp" ) - { - distance = 6250000; - } - break; - default: - distance = 0; - break; - } - return distance; + distance = 0; + + switch ( weaponclass ) + { + case "weapon_smg": + distance = 1562500; + break; + case "weapon_assault": + distance = 2250000; + break; + case "weapon_lmg": + distance = 2250000; + break; + case "weapon_sniper": + distance = 3062500; + break; + case "weapon_pistol": + distance = 490000; + break; + case "weapon_cqb": + distance = 422500; + break; + case "weapon_special": + if ( weapon == "knife_ballistic_mp" ) + distance = 2250000; + else if ( weapon == "crossbow_mp" ) + distance = 2250000; + else if ( weapon == "metalstorm_mp" ) + distance = 3062500; + + break; + case "weapon_grenade": + if ( weapon == "hatchet_mp" ) + distance = 6250000; + + break; + default: + distance = 0; + break; + } + + return distance; } decrementlastobituaryplayercountafterfade() { - level endon( "reset_obituary_count" ); - wait 5; - level.lastobituaryplayercount--; - + level endon( "reset_obituary_count" ); + wait 5; + level.lastobituaryplayercount--; /# - assert( level.lastobituaryplayercount >= 0 ); + assert( level.lastobituaryplayercount >= 0 ); #/ } ongameend( data ) { - player = data.player; - winner = data.winner; - while ( isDefined( winner ) ) - { - if ( level.teambased ) - { - if ( winner != "tie" && player.team == winner ) - { - processscoreevent( "won_match", player ); - return; - } - break; - } - else - { - placement = level.placement[ "all" ]; - topthreeplayers = min( 3, placement.size ); - index = 0; - while ( index < topthreeplayers ) - { - if ( level.placement[ "all" ][ index ] == player ) - { - processscoreevent( "won_match", player ); - return; - } - index++; - } - } - } - processscoreevent( "completed_match", player ); + player = data.player; + winner = data.winner; + + if ( isdefined( winner ) ) + { + if ( level.teambased ) + { + if ( winner != "tie" && player.team == winner ) + { + processscoreevent( "won_match", player ); + return; + } + } + else + { + placement = level.placement["all"]; + topthreeplayers = min( 3, placement.size ); + + for ( index = 0; index < topthreeplayers; index++ ) + { + if ( level.placement["all"][index] == player ) + { + processscoreevent( "won_match", player ); + return; + } + } + } + } + + processscoreevent( "completed_match", player ); } diff --git a/Multiplayer Core/patch_mp/maps/mp/_scrambler.gsc b/Multiplayer Core/patch_mp/maps/mp/_scrambler.gsc index 05644ca..2fb68a5 100644 --- a/Multiplayer Core/patch_mp/maps/mp/_scrambler.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/_scrambler.gsc @@ -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; +} diff --git a/Multiplayer Core/patch_mp/maps/mp/_script_gen.gsc b/Multiplayer Core/patch_mp/maps/mp/_script_gen.gsc index f5dbda6..cb9a7ff 100644 --- a/Multiplayer Core/patch_mp/maps/mp/_script_gen.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/_script_gen.gsc @@ -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 ); #/ - } } diff --git a/Multiplayer Core/patch_mp/maps/mp/_sensor_grenade.gsc b/Multiplayer Core/patch_mp/maps/mp/_sensor_grenade.gsc index 1ba4006..10dad7b 100644 --- a/Multiplayer Core/patch_mp/maps/mp/_sensor_grenade.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/_sensor_grenade.gsc @@ -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; + } + } +} diff --git a/Multiplayer Core/patch_mp/maps/mp/_smokegrenade.gsc b/Multiplayer Core/patch_mp/maps/mp/_smokegrenade.gsc index a0d7287..b068ed9 100644 --- a/Multiplayer Core/patch_mp/maps/mp/_smokegrenade.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/_smokegrenade.gsc @@ -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 ); + } } diff --git a/Multiplayer Core/patch_mp/maps/mp/_sticky_grenade.gsc b/Multiplayer Core/patch_mp/maps/mp/_sticky_grenade.gsc index 5ba50e7..86ae4c3 100644 --- a/Multiplayer Core/patch_mp/maps/mp/_sticky_grenade.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/_sticky_grenade.gsc @@ -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 ) { + } diff --git a/Multiplayer Core/patch_mp/maps/mp/_tabun.gsc b/Multiplayer Core/patch_mp/maps/mp/_tabun.gsc index 7567940..64d9126 100644 --- a/Multiplayer Core/patch_mp/maps/mp/_tabun.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/_tabun.gsc @@ -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; } diff --git a/Multiplayer Core/patch_mp/maps/mp/_tacticalinsertion.gsc b/Multiplayer Core/patch_mp/maps/mp/_tacticalinsertion.gsc index 636e4f0..2a1c62b 100644 --- a/Multiplayer Core/patch_mp/maps/mp/_tacticalinsertion.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/_tacticalinsertion.gsc @@ -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" ); + } } diff --git a/Multiplayer Core/patch_mp/maps/mp/_teargrenades.gsc b/Multiplayer Core/patch_mp/maps/mp/_teargrenades.gsc index 18f8fb2..15670df 100644 --- a/Multiplayer Core/patch_mp/maps/mp/_teargrenades.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/_teargrenades.gsc @@ -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; + } +} diff --git a/Multiplayer Core/patch_mp/maps/mp/_treadfx.gsc b/Multiplayer Core/patch_mp/maps/mp/_treadfx.gsc index 577128f..87ed2be 100644 --- a/Multiplayer Core/patch_mp/maps/mp/_treadfx.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/_treadfx.gsc @@ -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] ); +} diff --git a/Multiplayer Core/patch_mp/maps/mp/_trophy_system.gsc b/Multiplayer Core/patch_mp/maps/mp/_trophy_system.gsc index b90c2f6..e54be44 100644 --- a/Multiplayer Core/patch_mp/maps/mp/_trophy_system.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/_trophy_system.gsc @@ -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; + } + } } diff --git a/Multiplayer Core/patch_mp/maps/mp/_utility.gsc b/Multiplayer Core/patch_mp/maps/mp/_utility.gsc index 0157398..70e5702 100644 --- a/Multiplayer Core/patch_mp/maps/mp/_utility.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/_utility.gsc @@ -1,3077 +1,2721 @@ -#include maps/mp/_utility; -#include maps/mp/_createfx; -#include maps/mp/gametypes/_hud_util; -#include common_scripts/utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include common_scripts\utility; +#include maps\mp\gametypes\_hud_util; +#include maps\mp\_createfx; +#include maps\mp\_utility; addcallback( event, func ) { /# - assert( isDefined( event ), "Trying to set a callback on an undefined event." ); + assert( isdefined( event ), "Trying to set a callback on an undefined event." ); #/ - if ( !isDefined( level._callbacks ) || !isDefined( level._callbacks[ event ] ) ) - { - level._callbacks[ event ] = []; - } - level._callbacks[ event ] = add_to_array( level._callbacks[ event ], func, 0 ); + if ( !isdefined( level._callbacks ) || !isdefined( level._callbacks[event] ) ) + level._callbacks[event] = []; + + level._callbacks[event] = add_to_array( level._callbacks[event], func, 0 ); } callback( event ) { - while ( isDefined( level._callbacks ) && isDefined( level._callbacks[ event ] ) ) - { - i = 0; - while ( i < level._callbacks[ event ].size ) - { - callback = level._callbacks[ event ][ i ]; - if ( isDefined( callback ) ) - { - self thread [[ callback ]](); - } - i++; - } - } + if ( isdefined( level._callbacks ) && isdefined( level._callbacks[event] ) ) + { + for ( i = 0; i < level._callbacks[event].size; i++ ) + { + callback = level._callbacks[event][i]; + + if ( isdefined( callback ) ) + self thread [[ callback ]](); + } + } } onfinalizeinitialization_callback( func ) { - addcallback( "on_finalize_initialization", func ); + addcallback( "on_finalize_initialization", func ); } triggeroff() { - if ( !isDefined( self.realorigin ) ) - { - self.realorigin = self.origin; - } - if ( self.origin == self.realorigin ) - { - self.origin += vectorScale( ( 0, 0, 1 ), 10000 ); - } + if ( !isdefined( self.realorigin ) ) + self.realorigin = self.origin; + + if ( self.origin == self.realorigin ) + self.origin += vectorscale( ( 0, 0, -1 ), 10000.0 ); } triggeron() { - if ( isDefined( self.realorigin ) ) - { - self.origin = self.realorigin; - } + if ( isdefined( self.realorigin ) ) + self.origin = self.realorigin; } error( msg ) { /# - println( "^c*ERROR* ", msg ); - wait 0,05; - if ( getDvar( "debug" ) != "1" ) - { - assertmsg( "This is a forced error - attach the log file" ); + println( "^c*ERROR* ", msg ); + wait 0.05; + + if ( getdvar( _hash_F49A52C ) != "1" ) + { +/# + assertmsg( "This is a forced error - attach the log file" ); +#/ + } #/ - } } warning( msg ) { /# - println( "^1WARNING: " + msg ); + println( "^1WARNING: " + msg ); #/ } spawn_array_struct() { - s = spawnstruct(); - s.a = []; - return s; + s = spawnstruct(); + s.a = []; + return s; } within_fov( start_origin, start_angles, end_origin, fov ) { - normal = vectornormalize( end_origin - start_origin ); - forward = anglesToForward( start_angles ); - dot = vectordot( forward, normal ); - return dot >= fov; + normal = vectornormalize( end_origin - start_origin ); + forward = anglestoforward( start_angles ); + dot = vectordot( forward, normal ); + return dot >= fov; } append_array_struct( dst_s, src_s ) { - i = 0; - while ( i < src_s.a.size ) - { - dst_s.a[ dst_s.a.size ] = src_s.a[ i ]; - i++; - } + for ( i = 0; i < src_s.a.size; i++ ) + dst_s.a[dst_s.a.size] = src_s.a[i]; } exploder( num ) { - [[ level.exploderfunction ]]( num ); + [[ level.exploderfunction ]]( num ); } exploder_stop( num ) { - stop_exploder( num ); + stop_exploder( num ); } exploder_sound() { - if ( isDefined( self.script_delay ) ) - { - wait self.script_delay; - } - self playsound( level.scr_sound[ self.script_sound ] ); + if ( isdefined( self.script_delay ) ) + wait( self.script_delay ); + + self playsound( level.scr_sound[self.script_sound] ); } cannon_effect() { - if ( isDefined( self.v[ "repeat" ] ) ) - { - i = 0; - while ( i < self.v[ "repeat" ] ) - { - playfx( level._effect[ self.v[ "fxid" ] ], self.v[ "origin" ], self.v[ "forward" ], self.v[ "up" ] ); - self exploder_delay(); - i++; - } - return; - } - self exploder_delay(); - if ( isDefined( self.looper ) ) - { - self.looper delete(); - } - self.looper = spawnfx( getfx( self.v[ "fxid" ] ), self.v[ "origin" ], self.v[ "forward" ], self.v[ "up" ] ); - triggerfx( self.looper ); - exploder_playsound(); + if ( isdefined( self.v["repeat"] ) ) + { + for ( i = 0; i < self.v["repeat"]; i++ ) + { + playfx( level._effect[self.v["fxid"]], self.v["origin"], self.v["forward"], self.v["up"] ); + self exploder_delay(); + } + + return; + } + + self exploder_delay(); + + if ( isdefined( self.looper ) ) + self.looper delete(); + + self.looper = spawnfx( getfx( self.v["fxid"] ), self.v["origin"], self.v["forward"], self.v["up"] ); + triggerfx( self.looper ); + exploder_playsound(); } exploder_delay() { - if ( !isDefined( self.v[ "delay" ] ) ) - { - self.v[ "delay" ] = 0; - } - min_delay = self.v[ "delay" ]; - max_delay = self.v[ "delay" ] + 0,001; - if ( isDefined( self.v[ "delay_min" ] ) ) - { - min_delay = self.v[ "delay_min" ]; - } - if ( isDefined( self.v[ "delay_max" ] ) ) - { - max_delay = self.v[ "delay_max" ]; - } - if ( min_delay > 0 ) - { - wait randomfloatrange( min_delay, max_delay ); - } + if ( !isdefined( self.v["delay"] ) ) + self.v["delay"] = 0; + + min_delay = self.v["delay"]; + max_delay = self.v["delay"] + 0.001; + + if ( isdefined( self.v["delay_min"] ) ) + min_delay = self.v["delay_min"]; + + if ( isdefined( self.v["delay_max"] ) ) + max_delay = self.v["delay_max"]; + + if ( min_delay > 0 ) + wait( randomfloatrange( min_delay, max_delay ) ); } exploder_playsound() { - if ( !isDefined( self.v[ "soundalias" ] ) || self.v[ "soundalias" ] == "nil" ) - { - return; - } - play_sound_in_space( self.v[ "soundalias" ], self.v[ "origin" ] ); + if ( !isdefined( self.v["soundalias"] ) || self.v["soundalias"] == "nil" ) + return; + + play_sound_in_space( self.v["soundalias"], self.v["origin"] ); } brush_delete() { - num = self.v[ "exploder" ]; - if ( isDefined( self.v[ "delay" ] ) ) - { - wait self.v[ "delay" ]; - } - else - { - wait 0,05; - } - if ( !isDefined( self.model ) ) - { - return; - } + num = self.v["exploder"]; + + if ( isdefined( self.v["delay"] ) ) + wait( self.v["delay"] ); + else + wait 0.05; + + if ( !isdefined( self.model ) ) + return; /# - assert( isDefined( self.model ) ); + assert( isdefined( self.model ) ); #/ - if ( level.createfx_enabled ) - { - if ( isDefined( self.exploded ) ) - { - return; - } - self.exploded = 1; - self.model hide(); - self.model notsolid(); - wait 3; - self.exploded = undefined; - self.model show(); - self.model solid(); - return; - } - if ( !isDefined( self.v[ "fxid" ] ) || self.v[ "fxid" ] == "No FX" ) - { - } - waittillframeend; - self.model delete(); + if ( level.createfx_enabled ) + { + if ( isdefined( self.exploded ) ) + return; + + self.exploded = 1; + self.model hide(); + self.model notsolid(); + wait 3; + self.exploded = undefined; + self.model show(); + self.model solid(); + return; + } + + if ( !isdefined( self.v["fxid"] ) || self.v["fxid"] == "No FX" ) + self.v["exploder"] = undefined; + + waittillframeend; + self.model delete(); } brush_show() { - if ( isDefined( self.v[ "delay" ] ) ) - { - wait self.v[ "delay" ]; - } + if ( isdefined( self.v["delay"] ) ) + wait( self.v["delay"] ); /# - assert( isDefined( self.model ) ); + assert( isdefined( self.model ) ); #/ - self.model show(); - self.model solid(); - if ( level.createfx_enabled ) - { - if ( isDefined( self.exploded ) ) - { - return; - } - self.exploded = 1; - wait 3; - self.exploded = undefined; - self.model hide(); - self.model notsolid(); - } + self.model show(); + self.model solid(); + + if ( level.createfx_enabled ) + { + if ( isdefined( self.exploded ) ) + return; + + self.exploded = 1; + wait 3; + self.exploded = undefined; + self.model hide(); + self.model notsolid(); + } } brush_throw() { - if ( isDefined( self.v[ "delay" ] ) ) - { - wait self.v[ "delay" ]; - } - ent = undefined; - if ( isDefined( self.v[ "target" ] ) ) - { - ent = getent( self.v[ "target" ], "targetname" ); - } - if ( !isDefined( ent ) ) - { - self.model delete(); - return; - } - self.model show(); - startorg = self.v[ "origin" ]; - startang = self.v[ "angles" ]; - org = ent.origin; - temp_vec = org - self.v[ "origin" ]; - x = temp_vec[ 0 ]; - y = temp_vec[ 1 ]; - z = temp_vec[ 2 ]; - self.model rotatevelocity( ( x, y, z ), 12 ); - self.model movegravity( ( x, y, z ), 12 ); - if ( level.createfx_enabled ) - { - if ( isDefined( self.exploded ) ) - { - return; - } - self.exploded = 1; - wait 3; - self.exploded = undefined; - self.v[ "origin" ] = startorg; - self.v[ "angles" ] = startang; - self.model hide(); - return; - } - wait 6; - self.model delete(); + if ( isdefined( self.v["delay"] ) ) + wait( self.v["delay"] ); + + ent = undefined; + + if ( isdefined( self.v["target"] ) ) + ent = getent( self.v["target"], "targetname" ); + + if ( !isdefined( ent ) ) + { + self.model delete(); + return; + } + + self.model show(); + startorg = self.v["origin"]; + startang = self.v["angles"]; + org = ent.origin; + temp_vec = org - self.v["origin"]; + x = temp_vec[0]; + y = temp_vec[1]; + z = temp_vec[2]; + self.model rotatevelocity( ( x, y, z ), 12 ); + self.model movegravity( ( x, y, z ), 12 ); + + if ( level.createfx_enabled ) + { + if ( isdefined( self.exploded ) ) + return; + + self.exploded = 1; + wait 3; + self.exploded = undefined; + self.v["origin"] = startorg; + self.v["angles"] = startang; + self.model hide(); + return; + } + + self.v["exploder"] = undefined; + wait 6; + self.model delete(); } getplant() { - start = self.origin + vectorScale( ( 0, 0, 1 ), 10 ); - range = 11; - forward = anglesToForward( self.angles ); - forward = vectorScale( forward, range ); - traceorigins[ 0 ] = start + forward; - traceorigins[ 1 ] = start; - trace = bullettrace( traceorigins[ 0 ], traceorigins[ 0 ] + vectorScale( ( 0, 0, 1 ), 18 ), 0, undefined ); - if ( trace[ "fraction" ] < 1 ) - { - temp = spawnstruct(); - temp.origin = trace[ "position" ]; - temp.angles = orienttonormal( trace[ "normal" ] ); - return temp; - } - trace = bullettrace( traceorigins[ 1 ], traceorigins[ 1 ] + vectorScale( ( 0, 0, 1 ), 18 ), 0, undefined ); - if ( trace[ "fraction" ] < 1 ) - { - temp = spawnstruct(); - temp.origin = trace[ "position" ]; - temp.angles = orienttonormal( trace[ "normal" ] ); - return temp; - } - traceorigins[ 2 ] = start + vectorScale( ( 0, 0, 1 ), 16 ); - traceorigins[ 3 ] = start + vectorScale( ( 0, 0, 1 ), 16 ); - traceorigins[ 4 ] = start + vectorScale( ( 0, 0, 1 ), 16 ); - traceorigins[ 5 ] = start + vectorScale( ( 0, 0, 1 ), 16 ); - besttracefraction = undefined; - besttraceposition = undefined; - i = 0; - while ( i < traceorigins.size ) - { - trace = bullettrace( traceorigins[ i ], traceorigins[ i ] + vectorScale( ( 0, 0, 1 ), 1000 ), 0, undefined ); - if ( !isDefined( besttracefraction ) || trace[ "fraction" ] < besttracefraction ) - { - besttracefraction = trace[ "fraction" ]; - besttraceposition = trace[ "position" ]; - } - i++; - } - if ( besttracefraction == 1 ) - { - besttraceposition = self.origin; - } - temp = spawnstruct(); - temp.origin = besttraceposition; - temp.angles = orienttonormal( trace[ "normal" ] ); - return temp; + start = self.origin + vectorscale( ( 0, 0, 1 ), 10.0 ); + range = 11; + forward = anglestoforward( self.angles ); + forward = vectorscale( forward, range ); + traceorigins[0] = start + forward; + traceorigins[1] = start; + trace = bullettrace( traceorigins[0], traceorigins[0] + vectorscale( ( 0, 0, -1 ), 18.0 ), 0, undefined ); + + if ( trace["fraction"] < 1 ) + { + temp = spawnstruct(); + temp.origin = trace["position"]; + temp.angles = orienttonormal( trace["normal"] ); + return temp; + } + + trace = bullettrace( traceorigins[1], traceorigins[1] + vectorscale( ( 0, 0, -1 ), 18.0 ), 0, undefined ); + + if ( trace["fraction"] < 1 ) + { + temp = spawnstruct(); + temp.origin = trace["position"]; + temp.angles = orienttonormal( trace["normal"] ); + return temp; + } + + traceorigins[2] = start + vectorscale( ( 1, 1, 0 ), 16.0 ); + traceorigins[3] = start + vectorscale( ( 1, -1, 0 ), 16.0 ); + traceorigins[4] = start + vectorscale( ( -1, -1, 0 ), 16.0 ); + traceorigins[5] = start + vectorscale( ( -1, 1, 0 ), 16.0 ); + besttracefraction = undefined; + besttraceposition = undefined; + + for ( i = 0; i < traceorigins.size; i++ ) + { + trace = bullettrace( traceorigins[i], traceorigins[i] + vectorscale( ( 0, 0, -1 ), 1000.0 ), 0, undefined ); + + if ( !isdefined( besttracefraction ) || trace["fraction"] < besttracefraction ) + { + besttracefraction = trace["fraction"]; + besttraceposition = trace["position"]; + } + } + + if ( besttracefraction == 1 ) + besttraceposition = self.origin; + + temp = spawnstruct(); + temp.origin = besttraceposition; + temp.angles = orienttonormal( trace["normal"] ); + return temp; } orienttonormal( normal ) { - hor_normal = ( normal[ 0 ], normal[ 1 ], 0 ); - hor_length = length( hor_normal ); - if ( !hor_length ) - { - return ( 0, 0, 1 ); - } - hor_dir = vectornormalize( hor_normal ); - neg_height = normal[ 2 ] * -1; - tangent = ( hor_dir[ 0 ] * neg_height, hor_dir[ 1 ] * neg_height, hor_length ); - plant_angle = vectorToAngle( tangent ); - return plant_angle; + hor_normal = ( normal[0], normal[1], 0 ); + hor_length = length( hor_normal ); + + if ( !hor_length ) + return ( 0, 0, 0 ); + + hor_dir = vectornormalize( hor_normal ); + neg_height = normal[2] * -1; + tangent = ( hor_dir[0] * neg_height, hor_dir[1] * neg_height, hor_length ); + plant_angle = vectortoangles( tangent ); + return plant_angle; } array_levelthread( ents, process, var, excluders ) { - exclude = []; - i = 0; - while ( i < ents.size ) - { - exclude[ i ] = 0; - i++; - } - while ( isDefined( excluders ) ) - { - i = 0; - while ( i < ents.size ) - { - p = 0; - while ( p < excluders.size ) - { - if ( ents[ i ] == excluders[ p ] ) - { - exclude[ i ] = 1; - } - p++; - } - i++; - } - } - i = 0; - while ( i < ents.size ) - { - if ( !exclude[ i ] ) - { - if ( isDefined( var ) ) - { - level thread [[ process ]]( ents[ i ], var ); - i++; - continue; - } - else - { - level thread [[ process ]]( ents[ i ] ); - } - } - i++; - } + exclude = []; + + for ( i = 0; i < ents.size; i++ ) + exclude[i] = 0; + + if ( isdefined( excluders ) ) + { + for ( i = 0; i < ents.size; i++ ) + { + for ( p = 0; p < excluders.size; p++ ) + { + if ( ents[i] == excluders[p] ) + exclude[i] = 1; + } + } + } + + for ( i = 0; i < ents.size; i++ ) + { + if ( !exclude[i] ) + { + if ( isdefined( var ) ) + { + level thread [[ process ]]( ents[i], var ); + continue; + } + + level thread [[ process ]]( ents[i] ); + } + } } deleteplacedentity( entity ) { - entities = getentarray( entity, "classname" ); - i = 0; - while ( i < entities.size ) - { - entities[ i ] delete(); - i++; - } + entities = getentarray( entity, "classname" ); + + for ( i = 0; i < entities.size; i++ ) + entities[i] delete(); } playsoundonplayers( sound, team ) { /# - assert( isDefined( level.players ) ); + assert( isdefined( level.players ) ); #/ - if ( level.splitscreen ) - { - if ( isDefined( level.players[ 0 ] ) ) - { - level.players[ 0 ] playlocalsound( sound ); - } - } - else if ( isDefined( team ) ) - { - i = 0; - while ( i < level.players.size ) - { - player = level.players[ i ]; - if ( isDefined( player.pers[ "team" ] ) && player.pers[ "team" ] == team ) - { - player playlocalsound( sound ); - } - i++; - } - } - else i = 0; - while ( i < level.players.size ) - { - level.players[ i ] playlocalsound( sound ); - i++; - } + if ( level.splitscreen ) + { + if ( isdefined( level.players[0] ) ) + level.players[0] playlocalsound( sound ); + } + else if ( isdefined( team ) ) + { + for ( i = 0; i < level.players.size; i++ ) + { + player = level.players[i]; + + if ( isdefined( player.pers["team"] ) && player.pers["team"] == team ) + player playlocalsound( sound ); + } + } + else + { + for ( i = 0; i < level.players.size; i++ ) + level.players[i] playlocalsound( sound ); + } } get_player_height() { - return 70; + return 70.0; } isbulletimpactmod( smeansofdeath ) { - if ( !issubstr( smeansofdeath, "BULLET" ) ) - { - return smeansofdeath == "MOD_HEAD_SHOT"; - } + return issubstr( smeansofdeath, "BULLET" ) || smeansofdeath == "MOD_HEAD_SHOT"; } get_team_alive_players_s( teamname ) { - teamplayers_s = spawn_array_struct(); - while ( isDefined( teamname ) && isDefined( level.aliveplayers ) && isDefined( level.aliveplayers[ teamname ] ) ) - { - i = 0; - while ( i < level.aliveplayers[ teamname ].size ) - { - teamplayers_s.a[ teamplayers_s.a.size ] = level.aliveplayers[ teamname ][ i ]; - i++; - } - } - return teamplayers_s; + teamplayers_s = spawn_array_struct(); + + if ( isdefined( teamname ) && isdefined( level.aliveplayers ) && isdefined( level.aliveplayers[teamname] ) ) + { + for ( i = 0; i < level.aliveplayers[teamname].size; i++ ) + teamplayers_s.a[teamplayers_s.a.size] = level.aliveplayers[teamname][i]; + } + + return teamplayers_s; } get_all_alive_players_s() { - allplayers_s = spawn_array_struct(); - while ( isDefined( level.aliveplayers ) ) - { - keys = getarraykeys( level.aliveplayers ); - i = 0; - while ( i < keys.size ) - { - team = keys[ i ]; - j = 0; - while ( j < level.aliveplayers[ team ].size ) - { - allplayers_s.a[ allplayers_s.a.size ] = level.aliveplayers[ team ][ j ]; - j++; - } - i++; - } - } - return allplayers_s; + allplayers_s = spawn_array_struct(); + + if ( isdefined( level.aliveplayers ) ) + { + keys = getarraykeys( level.aliveplayers ); + + for ( i = 0; i < keys.size; i++ ) + { + team = keys[i]; + + for ( j = 0; j < level.aliveplayers[team].size; j++ ) + allplayers_s.a[allplayers_s.a.size] = level.aliveplayers[team][j]; + } + } + + return allplayers_s; } waitrespawnbutton() { - self endon( "disconnect" ); - self endon( "end_respawn" ); - while ( self usebuttonpressed() != 1 ) - { - wait 0,05; - } + self endon( "disconnect" ); + self endon( "end_respawn" ); + + while ( self usebuttonpressed() != 1 ) + wait 0.05; } setlowermessage( text, time, combinemessageandtimer ) { - if ( !isDefined( self.lowermessage ) ) - { - return; - } - if ( isDefined( self.lowermessageoverride ) && text != &"" ) - { - text = self.lowermessageoverride; - time = undefined; - } - self notify( "lower_message_set" ); - self.lowermessage settext( text ); - if ( isDefined( time ) && time > 0 ) - { - if ( !isDefined( combinemessageandtimer ) || !combinemessageandtimer ) - { - self.lowertimer.label = &""; - } - else - { - self.lowermessage settext( "" ); - self.lowertimer.label = text; - } - self.lowertimer settimer( time ); - } - else - { - self.lowertimer settext( "" ); - self.lowertimer.label = &""; - } - if ( self issplitscreen() ) - { - self.lowermessage.fontscale = 1,4; - } - self.lowermessage fadeovertime( 0,05 ); - self.lowermessage.alpha = 1; - self.lowertimer fadeovertime( 0,05 ); - self.lowertimer.alpha = 1; + if ( !isdefined( self.lowermessage ) ) + return; + + if ( isdefined( self.lowermessageoverride ) && text != &"" ) + { + text = self.lowermessageoverride; + time = undefined; + } + + self notify( "lower_message_set" ); + self.lowermessage settext( text ); + + if ( isdefined( time ) && time > 0 ) + { + if ( !isdefined( combinemessageandtimer ) || !combinemessageandtimer ) + self.lowertimer.label = &""; + else + { + self.lowermessage settext( "" ); + self.lowertimer.label = text; + } + + self.lowertimer settimer( time ); + } + else + { + self.lowertimer settext( "" ); + self.lowertimer.label = &""; + } + + if ( self issplitscreen() ) + self.lowermessage.fontscale = 1.4; + + self.lowermessage fadeovertime( 0.05 ); + self.lowermessage.alpha = 1; + self.lowertimer fadeovertime( 0.05 ); + self.lowertimer.alpha = 1; } setlowermessagevalue( text, value, combinemessage ) { - if ( !isDefined( self.lowermessage ) ) - { - return; - } - if ( isDefined( self.lowermessageoverride ) && text != &"" ) - { - text = self.lowermessageoverride; - time = undefined; - } - self notify( "lower_message_set" ); - if ( !isDefined( combinemessage ) || !combinemessage ) - { - self.lowermessage settext( text ); - } - else - { - self.lowermessage settext( "" ); - } - if ( isDefined( value ) && value > 0 ) - { - if ( !isDefined( combinemessage ) || !combinemessage ) - { - self.lowertimer.label = &""; - } - else - { - self.lowertimer.label = text; - } - self.lowertimer setvalue( value ); - } - else - { - self.lowertimer settext( "" ); - self.lowertimer.label = &""; - } - if ( self issplitscreen() ) - { - self.lowermessage.fontscale = 1,4; - } - self.lowermessage fadeovertime( 0,05 ); - self.lowermessage.alpha = 1; - self.lowertimer fadeovertime( 0,05 ); - self.lowertimer.alpha = 1; + if ( !isdefined( self.lowermessage ) ) + return; + + if ( isdefined( self.lowermessageoverride ) && text != &"" ) + { + text = self.lowermessageoverride; + time = undefined; + } + + self notify( "lower_message_set" ); + + if ( !isdefined( combinemessage ) || !combinemessage ) + self.lowermessage settext( text ); + else + self.lowermessage settext( "" ); + + if ( isdefined( value ) && value > 0 ) + { + if ( !isdefined( combinemessage ) || !combinemessage ) + self.lowertimer.label = &""; + else + self.lowertimer.label = text; + + self.lowertimer setvalue( value ); + } + else + { + self.lowertimer settext( "" ); + self.lowertimer.label = &""; + } + + if ( self issplitscreen() ) + self.lowermessage.fontscale = 1.4; + + self.lowermessage fadeovertime( 0.05 ); + self.lowermessage.alpha = 1; + self.lowertimer fadeovertime( 0.05 ); + self.lowertimer.alpha = 1; } clearlowermessage( fadetime ) { - if ( !isDefined( self.lowermessage ) ) - { - return; - } - self notify( "lower_message_set" ); - if ( !isDefined( fadetime ) || fadetime == 0 ) - { - setlowermessage( &"" ); - } - else - { - self endon( "disconnect" ); - self endon( "lower_message_set" ); - self.lowermessage fadeovertime( fadetime ); - self.lowermessage.alpha = 0; - self.lowertimer fadeovertime( fadetime ); - self.lowertimer.alpha = 0; - wait fadetime; - self setlowermessage( "" ); - } + if ( !isdefined( self.lowermessage ) ) + return; + + self notify( "lower_message_set" ); + + if ( !isdefined( fadetime ) || fadetime == 0 ) + setlowermessage( &"" ); + else + { + self endon( "disconnect" ); + self endon( "lower_message_set" ); + self.lowermessage fadeovertime( fadetime ); + self.lowermessage.alpha = 0; + self.lowertimer fadeovertime( fadetime ); + self.lowertimer.alpha = 0; + wait( fadetime ); + self setlowermessage( "" ); + } } printonteam( text, team ) { /# - assert( isDefined( level.players ) ); + assert( isdefined( level.players ) ); #/ - i = 0; - while ( i < level.players.size ) - { - player = level.players[ i ]; - if ( isDefined( player.pers[ "team" ] ) && player.pers[ "team" ] == team ) - { - player iprintln( text ); - } - i++; - } + for ( i = 0; i < level.players.size; i++ ) + { + player = level.players[i]; + + if ( isdefined( player.pers["team"] ) && player.pers["team"] == team ) + player iprintln( text ); + } } printboldonteam( text, team ) { /# - assert( isDefined( level.players ) ); + assert( isdefined( level.players ) ); #/ - i = 0; - while ( i < level.players.size ) - { - player = level.players[ i ]; - if ( isDefined( player.pers[ "team" ] ) && player.pers[ "team" ] == team ) - { - player iprintlnbold( text ); - } - i++; - } + for ( i = 0; i < level.players.size; i++ ) + { + player = level.players[i]; + + if ( isdefined( player.pers["team"] ) && player.pers["team"] == team ) + player iprintlnbold( text ); + } } printboldonteamarg( text, team, arg ) { /# - assert( isDefined( level.players ) ); + assert( isdefined( level.players ) ); #/ - i = 0; - while ( i < level.players.size ) - { - player = level.players[ i ]; - if ( isDefined( player.pers[ "team" ] ) && player.pers[ "team" ] == team ) - { - player iprintlnbold( text, arg ); - } - i++; - } + for ( i = 0; i < level.players.size; i++ ) + { + player = level.players[i]; + + if ( isdefined( player.pers["team"] ) && player.pers["team"] == team ) + player iprintlnbold( text, arg ); + } } printonteamarg( text, team, arg ) { + } printonplayers( text, team ) { - players = level.players; - i = 0; - while ( i < players.size ) - { - if ( isDefined( team ) ) - { - if ( isDefined( players[ i ].pers[ "team" ] ) && players[ i ].pers[ "team" ] == team ) - { - players[ i ] iprintln( text ); - } - i++; - continue; - } - else - { - players[ i ] iprintln( text ); - } - i++; - } + players = level.players; + + for ( i = 0; i < players.size; i++ ) + { + if ( isdefined( team ) ) + { + if ( isdefined( players[i].pers["team"] ) && players[i].pers["team"] == team ) + players[i] iprintln( text ); + + continue; + } + + players[i] iprintln( text ); + } } printandsoundoneveryone( team, enemyteam, printfriendly, printenemy, soundfriendly, soundenemy, printarg ) { - shoulddosounds = isDefined( soundfriendly ); - shoulddoenemysounds = 0; - if ( isDefined( soundenemy ) ) - { + shoulddosounds = isdefined( soundfriendly ); + shoulddoenemysounds = 0; + + if ( isdefined( soundenemy ) ) + { /# - assert( shoulddosounds ); + assert( shoulddosounds ); #/ - shoulddoenemysounds = 1; - } - if ( !isDefined( printarg ) ) - { - printarg = ""; - } - if ( level.splitscreen || !shoulddosounds ) - { - i = 0; - while ( i < level.players.size ) - { - player = level.players[ i ]; - playerteam = player.pers[ "team" ]; - if ( isDefined( playerteam ) ) - { - if ( playerteam == team && isDefined( printfriendly ) && printfriendly != &"" ) - { - player iprintln( printfriendly, printarg ); - i++; - continue; - } - else - { - if ( isDefined( printenemy ) && printenemy != &"" ) - { - if ( isDefined( enemyteam ) && playerteam == enemyteam ) - { - player iprintln( printenemy, printarg ); - i++; - continue; - } - else - { - if ( !isDefined( enemyteam ) && playerteam != team ) - { - player iprintln( printenemy, printarg ); - } - } - } - } - } - i++; - } - if ( shoulddosounds ) - { + shoulddoenemysounds = 1; + } + + if ( !isdefined( printarg ) ) + printarg = ""; + + if ( level.splitscreen || !shoulddosounds ) + { + for ( i = 0; i < level.players.size; i++ ) + { + player = level.players[i]; + playerteam = player.pers["team"]; + + if ( isdefined( playerteam ) ) + { + if ( playerteam == team && isdefined( printfriendly ) && printfriendly != &"" ) + { + player iprintln( printfriendly, printarg ); + continue; + } + + if ( isdefined( printenemy ) && printenemy != &"" ) + { + if ( isdefined( enemyteam ) && playerteam == enemyteam ) + { + player iprintln( printenemy, printarg ); + continue; + } + + if ( !isdefined( enemyteam ) && playerteam != team ) + player iprintln( printenemy, printarg ); + } + } + } + + if ( shoulddosounds ) + { /# - assert( level.splitscreen ); + assert( level.splitscreen ); #/ - level.players[ 0 ] playlocalsound( soundfriendly ); - } - } - else - { + level.players[0] playlocalsound( soundfriendly ); + } + } + else + { /# - assert( shoulddosounds ); + assert( shoulddosounds ); #/ - if ( shoulddoenemysounds ) - { - i = 0; - while ( i < level.players.size ) - { - player = level.players[ i ]; - playerteam = player.pers[ "team" ]; - if ( isDefined( playerteam ) ) - { - if ( playerteam == team ) - { - if ( isDefined( printfriendly ) && printfriendly != &"" ) - { - player iprintln( printfriendly, printarg ); - } - player playlocalsound( soundfriendly ); - i++; - continue; - } - else - { - if ( isDefined( enemyteam ) || playerteam == enemyteam && !isDefined( enemyteam ) && playerteam != team ) - { - if ( isDefined( printenemy ) && printenemy != &"" ) - { - player iprintln( printenemy, printarg ); - } - player playlocalsound( soundenemy ); - } - } - } - i++; - } - } - else i = 0; - while ( i < level.players.size ) - { - player = level.players[ i ]; - playerteam = player.pers[ "team" ]; - if ( isDefined( playerteam ) ) - { - if ( playerteam == team ) - { - if ( isDefined( printfriendly ) && printfriendly != &"" ) - { - player iprintln( printfriendly, printarg ); - } - player playlocalsound( soundfriendly ); - i++; - continue; - } - else if ( isDefined( printenemy ) && printenemy != &"" ) - { - if ( isDefined( enemyteam ) && playerteam == enemyteam ) - { - player iprintln( printenemy, printarg ); - i++; - continue; - } - else - { - if ( !isDefined( enemyteam ) && playerteam != team ) - { - player iprintln( printenemy, printarg ); - } - } - } - } - i++; - } - } + if ( shoulddoenemysounds ) + { + for ( i = 0; i < level.players.size; i++ ) + { + player = level.players[i]; + playerteam = player.pers["team"]; + + if ( isdefined( playerteam ) ) + { + if ( playerteam == team ) + { + if ( isdefined( printfriendly ) && printfriendly != &"" ) + player iprintln( printfriendly, printarg ); + + player playlocalsound( soundfriendly ); + continue; + } + + if ( isdefined( enemyteam ) && playerteam == enemyteam || !isdefined( enemyteam ) && playerteam != team ) + { + if ( isdefined( printenemy ) && printenemy != &"" ) + player iprintln( printenemy, printarg ); + + player playlocalsound( soundenemy ); + } + } + } + } + else + { + for ( i = 0; i < level.players.size; i++ ) + { + player = level.players[i]; + playerteam = player.pers["team"]; + + if ( isdefined( playerteam ) ) + { + if ( playerteam == team ) + { + if ( isdefined( printfriendly ) && printfriendly != &"" ) + player iprintln( printfriendly, printarg ); + + player playlocalsound( soundfriendly ); + continue; + } + + if ( isdefined( printenemy ) && printenemy != &"" ) + { + if ( isdefined( enemyteam ) && playerteam == enemyteam ) + { + player iprintln( printenemy, printarg ); + continue; + } + + if ( !isdefined( enemyteam ) && playerteam != team ) + player iprintln( printenemy, printarg ); + } + } + } + } + } } _playlocalsound( soundalias ) { - if ( level.splitscreen && !self ishost() ) - { - return; - } - self playlocalsound( soundalias ); + if ( level.splitscreen && !self ishost() ) + return; + + self playlocalsound( soundalias ); } dvarintvalue( dvar, defval, minval, maxval ) { - dvar = "scr_" + level.gametype + "_" + dvar; - if ( getDvar( dvar ) == "" ) - { - setdvar( dvar, defval ); - return defval; - } - value = getDvarInt( dvar ); - if ( value > maxval ) - { - value = maxval; - } - else if ( value < minval ) - { - value = minval; - } - else - { - return value; - } - setdvar( dvar, value ); - return value; + dvar = "scr_" + level.gametype + "_" + dvar; + + if ( getdvar( dvar ) == "" ) + { + setdvar( dvar, defval ); + return defval; + } + + value = getdvarint( dvar ); + + if ( value > maxval ) + value = maxval; + else if ( value < minval ) + value = minval; + else + return value; + + setdvar( dvar, value ); + return value; } dvarfloatvalue( dvar, defval, minval, maxval ) { - dvar = "scr_" + level.gametype + "_" + dvar; - if ( getDvar( dvar ) == "" ) - { - setdvar( dvar, defval ); - return defval; - } - value = getDvarFloat( dvar ); - if ( value > maxval ) - { - value = maxval; - } - else if ( value < minval ) - { - value = minval; - } - else - { - return value; - } - setdvar( dvar, value ); - return value; + dvar = "scr_" + level.gametype + "_" + dvar; + + if ( getdvar( dvar ) == "" ) + { + setdvar( dvar, defval ); + return defval; + } + + value = getdvarfloat( dvar ); + + if ( value > maxval ) + value = maxval; + else if ( value < minval ) + value = minval; + else + return value; + + setdvar( dvar, value ); + return value; } play_sound_on_tag( alias, tag ) { - if ( isDefined( tag ) ) - { - org = spawn( "script_origin", self gettagorigin( tag ) ); - org linkto( self, tag, ( 0, 0, 1 ), ( 0, 0, 1 ) ); - } - else - { - org = spawn( "script_origin", ( 0, 0, 1 ) ); - org.origin = self.origin; - org.angles = self.angles; - org linkto( self ); - } - org playsound( alias ); - wait 5; - org delete(); + if ( isdefined( tag ) ) + { + org = spawn( "script_origin", self gettagorigin( tag ) ); + org linkto( self, tag, ( 0, 0, 0 ), ( 0, 0, 0 ) ); + } + else + { + org = spawn( "script_origin", ( 0, 0, 0 ) ); + org.origin = self.origin; + org.angles = self.angles; + org linkto( self ); + } + + org playsound( alias ); + wait 5.0; + org delete(); } createloopeffect( fxid ) { - ent = maps/mp/_createfx::createeffect( "loopfx", fxid ); - ent.v[ "delay" ] = 0,5; - return ent; + ent = maps\mp\_createfx::createeffect( "loopfx", fxid ); + ent.v["delay"] = 0.5; + return ent; } createoneshoteffect( fxid ) { - ent = maps/mp/_createfx::createeffect( "oneshotfx", fxid ); - ent.v[ "delay" ] = -15; - return ent; + ent = maps\mp\_createfx::createeffect( "oneshotfx", fxid ); + ent.v["delay"] = -15; + return ent; } loop_fx_sound( alias, origin, ender, timeout ) { - org = spawn( "script_origin", ( 0, 0, 1 ) ); - if ( isDefined( ender ) ) - { - thread loop_sound_delete( ender, org ); - self endon( ender ); - } - org.origin = origin; - org playloopsound( alias ); - if ( !isDefined( timeout ) ) - { - return; - } - wait timeout; + org = spawn( "script_origin", ( 0, 0, 0 ) ); + + if ( isdefined( ender ) ) + { + thread loop_sound_delete( ender, org ); + self endon( ender ); + } + + org.origin = origin; + org playloopsound( alias ); + + if ( !isdefined( timeout ) ) + return; + + wait( timeout ); } exploder_damage() { - if ( isDefined( self.v[ "delay" ] ) ) - { - delay = self.v[ "delay" ]; - } - else - { - delay = 0; - } - if ( isDefined( self.v[ "damage_radius" ] ) ) - { - radius = self.v[ "damage_radius" ]; - } - else - { - radius = 128; - } - damage = self.v[ "damage" ]; - origin = self.v[ "origin" ]; - wait delay; - radiusdamage( origin, radius, damage, damage ); + if ( isdefined( self.v["delay"] ) ) + delay = self.v["delay"]; + else + delay = 0; + + if ( isdefined( self.v["damage_radius"] ) ) + radius = self.v["damage_radius"]; + else + radius = 128; + + damage = self.v["damage"]; + origin = self.v["origin"]; + wait( delay ); + radiusdamage( origin, radius, damage, damage ); } exploder_before_load( num ) { - waittillframeend; - waittillframeend; - activate_exploder( num ); + waittillframeend; + waittillframeend; + activate_exploder( num ); } exploder_after_load( num ) { - activate_exploder( num ); + activate_exploder( num ); } getexploderid( ent ) { - if ( !isDefined( level._exploder_ids ) ) - { - level._exploder_ids = []; - level._exploder_id = 1; - } - if ( !isDefined( level._exploder_ids[ ent.v[ "exploder" ] ] ) ) - { - level._exploder_ids[ ent.v[ "exploder" ] ] = level._exploder_id; - level._exploder_id++; - } - return level._exploder_ids[ ent.v[ "exploder" ] ]; + if ( !isdefined( level._exploder_ids ) ) + { + level._exploder_ids = []; + level._exploder_id = 1; + } + + if ( !isdefined( level._exploder_ids[ent.v["exploder"]] ) ) + { + level._exploder_ids[ent.v["exploder"]] = level._exploder_id; + level._exploder_id++; + } + + return level._exploder_ids[ent.v["exploder"]]; } activate_exploder_on_clients( num ) { - if ( !isDefined( level._exploder_ids[ num ] ) ) - { - return; - } - if ( !isDefined( level._client_exploders[ num ] ) ) - { - level._client_exploders[ num ] = 1; - } - if ( !isDefined( level._client_exploder_ids[ num ] ) ) - { - level._client_exploder_ids[ num ] = 1; - } - activateclientexploder( level._exploder_ids[ num ] ); + if ( !isdefined( level._exploder_ids[num] ) ) + return; + + if ( !isdefined( level._client_exploders[num] ) ) + level._client_exploders[num] = 1; + + if ( !isdefined( level._client_exploder_ids[num] ) ) + level._client_exploder_ids[num] = 1; + + activateclientexploder( level._exploder_ids[num] ); } delete_exploder_on_clients( num ) { - if ( !isDefined( level._exploder_ids[ num ] ) ) - { - return; - } - if ( !isDefined( level._client_exploders[ num ] ) ) - { - return; - } - deactivateclientexploder( level._exploder_ids[ num ] ); + if ( !isdefined( level._exploder_ids[num] ) ) + return; + + if ( !isdefined( level._client_exploders[num] ) ) + return; + + level._client_exploders[num] = undefined; + level._client_exploder_ids[num] = undefined; + deactivateclientexploder( level._exploder_ids[num] ); } activate_individual_exploder() { - level notify( "exploder" + self.v[ "exploder" ] ); - if ( !level.createfx_enabled && level.clientscripts || !isDefined( level._exploder_ids[ int( self.v[ "exploder" ] ) ] ) && isDefined( self.v[ "exploder_server" ] ) ) - { + level notify( "exploder" + self.v["exploder"] ); + + if ( level.createfx_enabled || !level.clientscripts || !isdefined( level._exploder_ids[int( self.v["exploder"] )] ) || isdefined( self.v["exploder_server"] ) ) + { /# - println( "Exploder " + self.v[ "exploder" ] + " created on server." ); + println( "Exploder " + self.v["exploder"] + " created on server." ); #/ - if ( isDefined( self.v[ "firefx" ] ) ) - { - self thread fire_effect(); - } - if ( isDefined( self.v[ "fxid" ] ) && self.v[ "fxid" ] != "No FX" ) - { - self thread cannon_effect(); - } - else - { - if ( isDefined( self.v[ "soundalias" ] ) ) - { - self thread sound_effect(); - } - } - } - if ( isDefined( self.v[ "trailfx" ] ) ) - { - self thread trail_effect(); - } - if ( isDefined( self.v[ "damage" ] ) ) - { - self thread exploder_damage(); - } - if ( self.v[ "exploder_type" ] == "exploder" ) - { - self thread brush_show(); - } - else if ( self.v[ "exploder_type" ] == "exploderchunk" || self.v[ "exploder_type" ] == "exploderchunk visible" ) - { - self thread brush_throw(); - } - else - { - self thread brush_delete(); - } + if ( isdefined( self.v["firefx"] ) ) + self thread fire_effect(); + + if ( isdefined( self.v["fxid"] ) && self.v["fxid"] != "No FX" ) + self thread cannon_effect(); + else if ( isdefined( self.v["soundalias"] ) ) + self thread sound_effect(); + } + + if ( isdefined( self.v["trailfx"] ) ) + self thread trail_effect(); + + if ( isdefined( self.v["damage"] ) ) + self thread exploder_damage(); + + if ( self.v["exploder_type"] == "exploder" ) + self thread brush_show(); + else if ( self.v["exploder_type"] == "exploderchunk" || self.v["exploder_type"] == "exploderchunk visible" ) + self thread brush_throw(); + else + self thread brush_delete(); } trail_effect() { - self exploder_delay(); - if ( !isDefined( self.v[ "trailfxtag" ] ) ) - { - self.v[ "trailfxtag" ] = "tag_origin"; - } - temp_ent = undefined; - if ( self.v[ "trailfxtag" ] == "tag_origin" ) - { - playfxontag( level._effect[ self.v[ "trailfx" ] ], self.model, self.v[ "trailfxtag" ] ); - } - else - { - temp_ent = spawn( "script_model", self.model.origin ); - temp_ent setmodel( "tag_origin" ); - temp_ent linkto( self.model, self.v[ "trailfxtag" ] ); - playfxontag( level._effect[ self.v[ "trailfx" ] ], temp_ent, "tag_origin" ); - } - if ( isDefined( self.v[ "trailfxsound" ] ) ) - { - if ( !isDefined( temp_ent ) ) - { - self.model playloopsound( self.v[ "trailfxsound" ] ); - } - else - { - temp_ent playloopsound( self.v[ "trailfxsound" ] ); - } - } - if ( isDefined( self.v[ "ender" ] ) && isDefined( temp_ent ) ) - { - level thread trail_effect_ender( temp_ent, self.v[ "ender" ] ); - } - if ( !isDefined( self.v[ "trailfxtimeout" ] ) ) - { - return; - } - wait self.v[ "trailfxtimeout" ]; - if ( isDefined( temp_ent ) ) - { - temp_ent delete(); - } + self exploder_delay(); + + if ( !isdefined( self.v["trailfxtag"] ) ) + self.v["trailfxtag"] = "tag_origin"; + + temp_ent = undefined; + + if ( self.v["trailfxtag"] == "tag_origin" ) + playfxontag( level._effect[self.v["trailfx"]], self.model, self.v["trailfxtag"] ); + else + { + temp_ent = spawn( "script_model", self.model.origin ); + temp_ent setmodel( "tag_origin" ); + temp_ent linkto( self.model, self.v["trailfxtag"] ); + playfxontag( level._effect[self.v["trailfx"]], temp_ent, "tag_origin" ); + } + + if ( isdefined( self.v["trailfxsound"] ) ) + { + if ( !isdefined( temp_ent ) ) + self.model playloopsound( self.v["trailfxsound"] ); + else + temp_ent playloopsound( self.v["trailfxsound"] ); + } + + if ( isdefined( self.v["ender"] ) && isdefined( temp_ent ) ) + level thread trail_effect_ender( temp_ent, self.v["ender"] ); + + if ( !isdefined( self.v["trailfxtimeout"] ) ) + return; + + wait( self.v["trailfxtimeout"] ); + + if ( isdefined( temp_ent ) ) + temp_ent delete(); } trail_effect_ender( ent, ender ) { - ent endon( "death" ); - self waittill( ender ); - ent delete(); + ent endon( "death" ); + + self waittill( ender ); + + ent delete(); } activate_exploder( num ) { - num = int( num ); + num = int( num ); /# - if ( level.createfx_enabled ) - { - i = 0; - while ( i < level.createfxent.size ) - { - ent = level.createfxent[ i ]; - if ( !isDefined( ent ) ) - { - i++; - continue; - } - else if ( ent.v[ "type" ] != "exploder" ) - { - i++; - continue; - } - else if ( !isDefined( ent.v[ "exploder" ] ) ) - { - i++; - continue; - } - else if ( ent.v[ "exploder" ] != num ) - { - i++; - continue; - } - else - { - if ( isDefined( ent.v[ "exploder_server" ] ) ) - { - client_send = 0; - } - ent activate_individual_exploder(); - } - i++; - } - return; + if ( level.createfx_enabled ) + { + for ( i = 0; i < level.createfxent.size; i++ ) + { + ent = level.createfxent[i]; + + if ( !isdefined( ent ) ) + continue; + + if ( ent.v["type"] != "exploder" ) + continue; + + if ( !isdefined( ent.v["exploder"] ) ) + continue; + + if ( ent.v["exploder"] != num ) + continue; + + if ( isdefined( ent.v["exploder_server"] ) ) + client_send = 0; + + ent activate_individual_exploder(); + } + + return; + } #/ - } - client_send = 1; - while ( isDefined( level.createfxexploders[ num ] ) ) - { - i = 0; - while ( i < level.createfxexploders[ num ].size ) - { - if ( client_send && isDefined( level.createfxexploders[ num ][ i ].v[ "exploder_server" ] ) ) - { - client_send = 0; - } - level.createfxexploders[ num ][ i ] activate_individual_exploder(); - i++; - } - } - if ( level.clientscripts ) - { - if ( !level.createfx_enabled && client_send == 1 ) - { - activate_exploder_on_clients( num ); - } - } + client_send = 1; + + if ( isdefined( level.createfxexploders[num] ) ) + { + for ( i = 0; i < level.createfxexploders[num].size; i++ ) + { + if ( client_send && isdefined( level.createfxexploders[num][i].v["exploder_server"] ) ) + client_send = 0; + + level.createfxexploders[num][i] activate_individual_exploder(); + } + } + + if ( level.clientscripts ) + { + if ( !level.createfx_enabled && client_send == 1 ) + activate_exploder_on_clients( num ); + } } stop_exploder( num ) { - num = int( num ); - if ( level.clientscripts ) - { - if ( !level.createfx_enabled ) - { - delete_exploder_on_clients( num ); - } - } - while ( isDefined( level.createfxexploders[ num ] ) ) - { - i = 0; - while ( i < level.createfxexploders[ num ].size ) - { - if ( !isDefined( level.createfxexploders[ num ][ i ].looper ) ) - { - i++; - continue; - } - else - { - level.createfxexploders[ num ][ i ].looper delete(); - } - i++; - } - } + num = int( num ); + + if ( level.clientscripts ) + { + if ( !level.createfx_enabled ) + delete_exploder_on_clients( num ); + } + + if ( isdefined( level.createfxexploders[num] ) ) + { + for ( i = 0; i < level.createfxexploders[num].size; i++ ) + { + if ( !isdefined( level.createfxexploders[num][i].looper ) ) + continue; + + level.createfxexploders[num][i].looper delete(); + } + } } sound_effect() { - self effect_soundalias(); + self effect_soundalias(); } effect_soundalias() { - if ( !isDefined( self.v[ "delay" ] ) ) - { - self.v[ "delay" ] = 0; - } - origin = self.v[ "origin" ]; - alias = self.v[ "soundalias" ]; - wait self.v[ "delay" ]; - play_sound_in_space( alias, origin ); + if ( !isdefined( self.v["delay"] ) ) + self.v["delay"] = 0; + + origin = self.v["origin"]; + alias = self.v["soundalias"]; + wait( self.v["delay"] ); + play_sound_in_space( alias, origin ); } play_sound_in_space( alias, origin, master ) { - org = spawn( "script_origin", ( 0, 0, 1 ) ); - if ( !isDefined( origin ) ) - { - origin = self.origin; - } - org.origin = origin; - if ( isDefined( master ) && master ) - { - org playsoundasmaster( alias ); - } - else - { - org playsound( alias ); - } - wait 10; - org delete(); + org = spawn( "script_origin", ( 0, 0, 1 ) ); + + if ( !isdefined( origin ) ) + origin = self.origin; + + org.origin = origin; + + if ( isdefined( master ) && master ) + org playsoundasmaster( alias ); + else + org playsound( alias ); + + wait 10.0; + org delete(); } loop_sound_in_space( alias, origin, ender ) { - org = spawn( "script_origin", ( 0, 0, 1 ) ); - if ( !isDefined( origin ) ) - { - origin = self.origin; - } - org.origin = origin; - org playloopsound( alias ); - level waittill( ender ); - org stoploopsound(); - wait 0,1; - org delete(); + org = spawn( "script_origin", ( 0, 0, 1 ) ); + + if ( !isdefined( origin ) ) + origin = self.origin; + + org.origin = origin; + org playloopsound( alias ); + + level waittill( ender ); + + org stoploopsound(); + wait 0.1; + org delete(); } fire_effect() { - if ( !isDefined( self.v[ "delay" ] ) ) - { - self.v[ "delay" ] = 0; - } - delay = self.v[ "delay" ]; - if ( isDefined( self.v[ "delay_min" ] ) && isDefined( self.v[ "delay_max" ] ) ) - { - delay = self.v[ "delay_min" ] + randomfloat( self.v[ "delay_max" ] - self.v[ "delay_min" ] ); - } - forward = self.v[ "forward" ]; - up = self.v[ "up" ]; - org = undefined; - firefxsound = self.v[ "firefxsound" ]; - origin = self.v[ "origin" ]; - firefx = self.v[ "firefx" ]; - ender = self.v[ "ender" ]; - if ( !isDefined( ender ) ) - { - ender = "createfx_effectStopper"; - } - timeout = self.v[ "firefxtimeout" ]; - firefxdelay = 0,5; - if ( isDefined( self.v[ "firefxdelay" ] ) ) - { - firefxdelay = self.v[ "firefxdelay" ]; - } - wait delay; - if ( isDefined( firefxsound ) ) - { - level thread loop_fx_sound( firefxsound, origin, ender, timeout ); - } - playfx( level._effect[ firefx ], self.v[ "origin" ], forward, up ); + if ( !isdefined( self.v["delay"] ) ) + self.v["delay"] = 0; + + delay = self.v["delay"]; + + if ( isdefined( self.v["delay_min"] ) && isdefined( self.v["delay_max"] ) ) + delay = self.v["delay_min"] + randomfloat( self.v["delay_max"] - self.v["delay_min"] ); + + forward = self.v["forward"]; + up = self.v["up"]; + org = undefined; + firefxsound = self.v["firefxsound"]; + origin = self.v["origin"]; + firefx = self.v["firefx"]; + ender = self.v["ender"]; + + if ( !isdefined( ender ) ) + ender = "createfx_effectStopper"; + + timeout = self.v["firefxtimeout"]; + firefxdelay = 0.5; + + if ( isdefined( self.v["firefxdelay"] ) ) + firefxdelay = self.v["firefxdelay"]; + + wait( delay ); + + if ( isdefined( firefxsound ) ) + level thread loop_fx_sound( firefxsound, origin, ender, timeout ); + + playfx( level._effect[firefx], self.v["origin"], forward, up ); } loop_sound_delete( ender, ent ) { - ent endon( "death" ); - self waittill( ender ); - ent delete(); + ent endon( "death" ); + + self waittill( ender ); + + ent delete(); } createexploder( fxid ) { - ent = maps/mp/_createfx::createeffect( "exploder", fxid ); - ent.v[ "delay" ] = 0; - ent.v[ "exploder" ] = 1; - ent.v[ "exploder_type" ] = "normal"; - return ent; + ent = maps\mp\_createfx::createeffect( "exploder", fxid ); + ent.v["delay"] = 0; + ent.v["exploder"] = 1; + ent.v["exploder_type"] = "normal"; + return ent; } getotherteam( team ) { - if ( team == "allies" ) - { - return "axis"; - } - else - { - if ( team == "axis" ) - { - return "allies"; - } - else - { - return "allies"; - } - } + if ( team == "allies" ) + return "axis"; + else if ( team == "axis" ) + return "allies"; + else + return "allies"; /# - assertmsg( "getOtherTeam: invalid team " + team ); + assertmsg( "getOtherTeam: invalid team " + team ); #/ } getteammask( team ) { - if ( level.teambased || !isDefined( team ) && !isDefined( level.spawnsystem.ispawn_teammask[ team ] ) ) - { - return level.spawnsystem.ispawn_teammask_free; - } - return level.spawnsystem.ispawn_teammask[ team ]; + if ( !level.teambased || !isdefined( team ) || !isdefined( level.spawnsystem.ispawn_teammask[team] ) ) + return level.spawnsystem.ispawn_teammask_free; + + return level.spawnsystem.ispawn_teammask[team]; } getotherteamsmask( skip_team ) { - mask = 0; - _a1408 = level.teams; - _k1408 = getFirstArrayKey( _a1408 ); - while ( isDefined( _k1408 ) ) - { - team = _a1408[ _k1408 ]; - if ( team == skip_team ) - { - } - else - { - mask |= getteammask( team ); - } - _k1408 = getNextArrayKey( _a1408, _k1408 ); - } - return mask; + mask = 0; + + foreach ( team in level.teams ) + { + if ( team == skip_team ) + continue; + + mask |= getteammask( team ); + } + + return mask; } wait_endon( waittime, endonstring, endonstring2, endonstring3, endonstring4 ) { - self endon( endonstring ); - if ( isDefined( endonstring2 ) ) - { - self endon( endonstring2 ); - } - if ( isDefined( endonstring3 ) ) - { - self endon( endonstring3 ); - } - if ( isDefined( endonstring4 ) ) - { - self endon( endonstring4 ); - } - wait waittime; - return 1; + self endon( endonstring ); + + if ( isdefined( endonstring2 ) ) + self endon( endonstring2 ); + + if ( isdefined( endonstring3 ) ) + self endon( endonstring3 ); + + if ( isdefined( endonstring4 ) ) + self endon( endonstring4 ); + + wait( waittime ); + return 1; } ismg( weapon ) { - return issubstr( weapon, "_bipod_" ); + return issubstr( weapon, "_bipod_" ); } plot_points( plotpoints, r, g, b, timer ) { /# - lastpoint = plotpoints[ 0 ]; - if ( !isDefined( r ) ) - { - r = 1; - } - if ( !isDefined( g ) ) - { - g = 1; - } - if ( !isDefined( b ) ) - { - b = 1; - } - if ( !isDefined( timer ) ) - { - timer = 0,05; - } - i = 1; - while ( i < plotpoints.size ) - { - line( lastpoint, plotpoints[ i ], ( r, g, b ), 1, timer ); - lastpoint = plotpoints[ i ]; - i++; + lastpoint = plotpoints[0]; + + if ( !isdefined( r ) ) + r = 1; + + if ( !isdefined( g ) ) + g = 1; + + if ( !isdefined( b ) ) + b = 1; + + if ( !isdefined( timer ) ) + timer = 0.05; + + for ( i = 1; i < plotpoints.size; i++ ) + { + line( lastpoint, plotpoints[i], ( r, g, b ), 1, timer ); + lastpoint = plotpoints[i]; + } #/ - } } player_flag_wait( msg ) { - while ( !self.flag[ msg ] ) - { - self waittill( msg ); - } + while ( !self.flag[msg] ) + self waittill( msg ); } player_flag_wait_either( flag1, flag2 ) { - for ( ;; ) - { - if ( flag( flag1 ) ) - { - return; - } - if ( flag( flag2 ) ) - { - return; - } - self waittill_either( flag1, flag2 ); - } + for (;;) + { + if ( flag( flag1 ) ) + return; + + if ( flag( flag2 ) ) + return; + + self waittill_either( flag1, flag2 ); + } } player_flag_waitopen( msg ) { - while ( self.flag[ msg ] ) - { - self waittill( msg ); - } + while ( self.flag[msg] ) + self waittill( msg ); } player_flag_init( message, trigger ) { - if ( !isDefined( self.flag ) ) - { - self.flag = []; - self.flags_lock = []; - } + if ( !isdefined( self.flag ) ) + { + self.flag = []; + self.flags_lock = []; + } /# - assert( !isDefined( self.flag[ message ] ), "Attempt to reinitialize existing message: " + message ); + assert( !isdefined( self.flag[message] ), "Attempt to reinitialize existing message: " + message ); #/ - self.flag[ message ] = 0; + self.flag[message] = 0; /# - self.flags_lock[ message ] = 0; + self.flags_lock[message] = 0; #/ } player_flag_set_delayed( message, delay ) { - wait delay; - player_flag_set( message ); + wait( delay ); + player_flag_set( message ); } player_flag_set( message ) { /# - assert( isDefined( self.flag[ message ] ), "Attempt to set a flag before calling flag_init: " + message ); - assert( self.flag[ message ] == self.flags_lock[ message ] ); - self.flags_lock[ message ] = 1; + assert( isdefined( self.flag[message] ), "Attempt to set a flag before calling flag_init: " + message ); + assert( self.flag[message] == self.flags_lock[message] ); + self.flags_lock[message] = 1; #/ - self.flag[ message ] = 1; - self notify( message ); + self.flag[message] = 1; + self notify( message ); } player_flag_clear( message ) { /# - assert( isDefined( self.flag[ message ] ), "Attempt to set a flag before calling flag_init: " + message ); - assert( self.flag[ message ] == self.flags_lock[ message ] ); - self.flags_lock[ message ] = 0; + assert( isdefined( self.flag[message] ), "Attempt to set a flag before calling flag_init: " + message ); + assert( self.flag[message] == self.flags_lock[message] ); + self.flags_lock[message] = 0; #/ - self.flag[ message ] = 0; - self notify( message ); + self.flag[message] = 0; + self notify( message ); } player_flag( message ) { /# - assert( isDefined( message ), "Tried to check flag but the flag was not defined." ); + assert( isdefined( message ), "Tried to check flag but the flag was not defined." ); #/ - if ( !self.flag[ message ] ) - { - return 0; - } - return 1; + if ( !self.flag[message] ) + return false; + + return true; } registerclientsys( ssysname ) { - if ( !isDefined( level._clientsys ) ) - { - level._clientsys = []; - } - if ( level._clientsys.size >= 32 ) - { + if ( !isdefined( level._clientsys ) ) + level._clientsys = []; + + if ( level._clientsys.size >= 32 ) + { /# - error( "Max num client systems exceeded." ); + error( "Max num client systems exceeded." ); #/ - return; - } - if ( isDefined( level._clientsys[ ssysname ] ) ) - { + return; + } + + if ( isdefined( level._clientsys[ssysname] ) ) + { /# - error( "Attempt to re-register client system : " + ssysname ); + error( "Attempt to re-register client system : " + ssysname ); #/ - return; - } - else - { - level._clientsys[ ssysname ] = spawnstruct(); - level._clientsys[ ssysname ].sysid = clientsysregister( ssysname ); - } + return; + } + else + { + level._clientsys[ssysname] = spawnstruct(); + level._clientsys[ssysname].sysid = clientsysregister( ssysname ); + } } setclientsysstate( ssysname, ssysstate, player ) { - if ( !isDefined( level._clientsys ) ) - { + if ( !isdefined( level._clientsys ) ) + { /# - error( "setClientSysState called before registration of any systems." ); + error( "setClientSysState called before registration of any systems." ); #/ - return; - } - if ( !isDefined( level._clientsys[ ssysname ] ) ) - { + return; + } + + if ( !isdefined( level._clientsys[ssysname] ) ) + { /# - error( "setClientSysState called on unregistered system " + ssysname ); + error( "setClientSysState called on unregistered system " + ssysname ); #/ - return; - } - if ( isDefined( player ) ) - { - player clientsyssetstate( level._clientsys[ ssysname ].sysid, ssysstate ); - } - else - { - clientsyssetstate( level._clientsys[ ssysname ].sysid, ssysstate ); - level._clientsys[ ssysname ].sysstate = ssysstate; - } + return; + } + + if ( isdefined( player ) ) + player clientsyssetstate( level._clientsys[ssysname].sysid, ssysstate ); + else + { + clientsyssetstate( level._clientsys[ssysname].sysid, ssysstate ); + level._clientsys[ssysname].sysstate = ssysstate; + } } getclientsysstate( ssysname ) { - if ( !isDefined( level._clientsys ) ) - { + if ( !isdefined( level._clientsys ) ) + { /# - error( "Cannot getClientSysState before registering any client systems." ); + error( "Cannot getClientSysState before registering any client systems." ); #/ - return ""; - } - if ( !isDefined( level._clientsys[ ssysname ] ) ) - { + return ""; + } + + if ( !isdefined( level._clientsys[ssysname] ) ) + { /# - error( "Client system " + ssysname + " cannot return state, as it is unregistered." ); + error( "Client system " + ssysname + " cannot return state, as it is unregistered." ); #/ - return ""; - } - if ( isDefined( level._clientsys[ ssysname ].sysstate ) ) - { - return level._clientsys[ ssysname ].sysstate; - } - return ""; + return ""; + } + + if ( isdefined( level._clientsys[ssysname].sysstate ) ) + return level._clientsys[ssysname].sysstate; + + return ""; } clientnotify( event ) { - if ( level.clientscripts ) - { - if ( isplayer( self ) ) - { - maps/mp/_utility::setclientsysstate( "levelNotify", event, self ); - return; - } - else - { - maps/mp/_utility::setclientsysstate( "levelNotify", event ); - } - } + if ( level.clientscripts ) + { + if ( isplayer( self ) ) + maps\mp\_utility::setclientsysstate( "levelNotify", event, self ); + else + maps\mp\_utility::setclientsysstate( "levelNotify", event ); + } } alphabet_compare( a, b ) { - list = []; - val = 1; - list[ "0" ] = val; - val++; - list[ "1" ] = val; - val++; - list[ "2" ] = val; - val++; - list[ "3" ] = val; - val++; - list[ "4" ] = val; - val++; - list[ "5" ] = val; - val++; - list[ "6" ] = val; - val++; - list[ "7" ] = val; - val++; - list[ "8" ] = val; - val++; - list[ "9" ] = val; - val++; - list[ "_" ] = val; - val++; - list[ "a" ] = val; - val++; - list[ "b" ] = val; - val++; - list[ "c" ] = val; - val++; - list[ "d" ] = val; - val++; - list[ "e" ] = val; - val++; - list[ "f" ] = val; - val++; - list[ "g" ] = val; - val++; - list[ "h" ] = val; - val++; - list[ "i" ] = val; - val++; - list[ "j" ] = val; - val++; - list[ "k" ] = val; - val++; - list[ "l" ] = val; - val++; - list[ "m" ] = val; - val++; - list[ "n" ] = val; - val++; - list[ "o" ] = val; - val++; - list[ "p" ] = val; - val++; - list[ "q" ] = val; - val++; - list[ "r" ] = val; - val++; - list[ "s" ] = val; - val++; - list[ "t" ] = val; - val++; - list[ "u" ] = val; - val++; - list[ "v" ] = val; - val++; - list[ "w" ] = val; - val++; - list[ "x" ] = val; - val++; - list[ "y" ] = val; - val++; - list[ "z" ] = val; - val++; - a = tolower( a ); - b = tolower( b ); - val1 = 0; - if ( isDefined( list[ a ] ) ) - { - val1 = list[ a ]; - } - val2 = 0; - if ( isDefined( list[ b ] ) ) - { - val2 = list[ b ]; - } - if ( val1 > val2 ) - { - return "1st"; - } - if ( val1 < val2 ) - { - return "2nd"; - } - return "same"; + list = []; + val = 1; + list["0"] = val; + val++; + list["1"] = val; + val++; + list["2"] = val; + val++; + list["3"] = val; + val++; + list["4"] = val; + val++; + list["5"] = val; + val++; + list["6"] = val; + val++; + list["7"] = val; + val++; + list["8"] = val; + val++; + list["9"] = val; + val++; + list["_"] = val; + val++; + list["a"] = val; + val++; + list["b"] = val; + val++; + list["c"] = val; + val++; + list["d"] = val; + val++; + list["e"] = val; + val++; + list["f"] = val; + val++; + list["g"] = val; + val++; + list["h"] = val; + val++; + list["i"] = val; + val++; + list["j"] = val; + val++; + list["k"] = val; + val++; + list["l"] = val; + val++; + list["m"] = val; + val++; + list["n"] = val; + val++; + list["o"] = val; + val++; + list["p"] = val; + val++; + list["q"] = val; + val++; + list["r"] = val; + val++; + list["s"] = val; + val++; + list["t"] = val; + val++; + list["u"] = val; + val++; + list["v"] = val; + val++; + list["w"] = val; + val++; + list["x"] = val; + val++; + list["y"] = val; + val++; + list["z"] = val; + val++; + a = tolower( a ); + b = tolower( b ); + val1 = 0; + + if ( isdefined( list[a] ) ) + val1 = list[a]; + + val2 = 0; + + if ( isdefined( list[b] ) ) + val2 = list[b]; + + if ( val1 > val2 ) + return "1st"; + + if ( val1 < val2 ) + return "2nd"; + + return "same"; } is_later_in_alphabet( string1, string2 ) { - count = string1.size; - if ( count >= string2.size ) - { - count = string2.size; - } - i = 0; - while ( i < count ) - { - val = alphabet_compare( string1[ i ], string2[ i ] ); - if ( val == "1st" ) - { - return 1; - } - if ( val == "2nd" ) - { - return 0; - } - i++; - } - return string1.size > string2.size; + count = string1.size; + + if ( count >= string2.size ) + count = string2.size; + + for ( i = 0; i < count; i++ ) + { + val = alphabet_compare( string1[i], string2[i] ); + + if ( val == "1st" ) + return 1; + + if ( val == "2nd" ) + return 0; + } + + return string1.size > string2.size; } alphabetize( array ) { - if ( array.size <= 1 ) - { - return array; - } - count = 0; - for ( ;; ) - { - changed = 0; - i = 0; - while ( i < ( array.size - 1 ) ) - { - if ( is_later_in_alphabet( array[ i ], array[ i + 1 ] ) ) - { - val = array[ i ]; - array[ i ] = array[ i + 1 ]; - array[ i + 1 ] = val; - changed = 1; - count++; - if ( count >= 9 ) - { - count = 0; - wait 0,05; - } - } - i++; - } - if ( !changed ) - { - return array; - } - } - return array; + if ( array.size <= 1 ) + return array; + + count = 0; + + for (;;) + { + changed = 0; + + for ( i = 0; i < array.size - 1; i++ ) + { + if ( is_later_in_alphabet( array[i], array[i + 1] ) ) + { + val = array[i]; + array[i] = array[i + 1]; + array[i + 1] = val; + changed = 1; + count++; + + if ( count >= 9 ) + { + count = 0; + wait 0.05; + } + } + } + + if ( !changed ) + return array; + } + + return array; } get_players() { - players = getplayers(); - return players; + players = getplayers(); + return players; } getfx( fx ) { /# - assert( isDefined( level._effect[ fx ] ), "Fx " + fx + " is not defined in level._effect." ); + assert( isdefined( level._effect[fx] ), "Fx " + fx + " is not defined in level._effect." ); #/ - return level._effect[ fx ]; + return level._effect[fx]; } struct_arrayspawn() { - struct = spawnstruct(); - struct.array = []; - struct.lastindex = 0; - return struct; + struct = spawnstruct(); + struct.array = []; + struct.lastindex = 0; + return struct; } structarray_add( struct, object ) { /# - assert( !isDefined( object.struct_array_index ) ); + assert( !isdefined( object.struct_array_index ) ); #/ - struct.array[ struct.lastindex ] = object; - object.struct_array_index = struct.lastindex; - struct.lastindex++; + struct.array[struct.lastindex] = object; + object.struct_array_index = struct.lastindex; + struct.lastindex++; } structarray_remove( struct, object ) { - structarray_swaptolast( struct, object ); - struct.lastindex--; - + structarray_swaptolast( struct, object ); + struct.array[struct.lastindex - 1] = undefined; + struct.lastindex--; } structarray_swaptolast( struct, object ) { - struct structarray_swap( struct.array[ struct.lastindex - 1 ], object ); + struct structarray_swap( struct.array[struct.lastindex - 1], object ); } structarray_shuffle( struct, shuffle ) { - i = 0; - while ( i < shuffle ) - { - struct structarray_swap( struct.array[ i ], struct.array[ randomint( struct.lastindex ) ] ); - i++; - } + for ( i = 0; i < shuffle; i++ ) + struct structarray_swap( struct.array[i], struct.array[randomint( struct.lastindex )] ); } structarray_swap( object1, object2 ) { - index1 = object1.struct_array_index; - index2 = object2.struct_array_index; - self.array[ index2 ] = object1; - self.array[ index1 ] = object2; - self.array[ index1 ].struct_array_index = index1; - self.array[ index2 ].struct_array_index = index2; + index1 = object1.struct_array_index; + index2 = object2.struct_array_index; + self.array[index2] = object1; + self.array[index1] = object2; + self.array[index1].struct_array_index = index1; + self.array[index2].struct_array_index = index2; } waittill_either( msg1, msg2 ) { - self endon( msg1 ); - self waittill( msg2 ); + self endon( msg1 ); + + self waittill( msg2 ); } combinearrays( array1, array2 ) { /# - if ( !isDefined( array1 ) ) - { - assert( isDefined( array2 ) ); - } + assert( isdefined( array1 ) || isdefined( array2 ) ); #/ - if ( !isDefined( array1 ) && isDefined( array2 ) ) - { - return array2; - } - if ( !isDefined( array2 ) && isDefined( array1 ) ) - { - return array1; - } - _a1822 = array2; - _k1822 = getFirstArrayKey( _a1822 ); - while ( isDefined( _k1822 ) ) - { - elem = _a1822[ _k1822 ]; - array1[ array1.size ] = elem; - _k1822 = getNextArrayKey( _a1822, _k1822 ); - } - return array1; + if ( !isdefined( array1 ) && isdefined( array2 ) ) + return array2; + + if ( !isdefined( array2 ) && isdefined( array1 ) ) + return array1; + + foreach ( elem in array2 ) + array1[array1.size] = elem; + + return array1; } getclosest( org, array, dist ) { - return comparesizes( org, array, dist, ::closerfunc ); + return comparesizes( org, array, dist, ::closerfunc ); } getclosestfx( org, fxarray, dist ) { - return comparesizesfx( org, fxarray, dist, ::closerfunc ); + return comparesizesfx( org, fxarray, dist, ::closerfunc ); } getfarthest( org, array, dist ) { - return comparesizes( org, array, dist, ::fartherfunc ); + return comparesizes( org, array, dist, ::fartherfunc ); } comparesizesfx( org, array, dist, comparefunc ) { - if ( !array.size ) - { - return undefined; - } - if ( isDefined( dist ) ) - { - distsqr = dist * dist; - struct = undefined; - keys = getarraykeys( array ); - i = 0; - while ( i < keys.size ) - { - newdistsqr = distancesquared( array[ keys[ i ] ].v[ "origin" ], org ); - if ( [[ comparefunc ]]( newdistsqr, distsqr ) ) - { - i++; - continue; - } - else - { - distsqr = newdistsqr; - struct = array[ keys[ i ] ]; - } - i++; - } - return struct; - } - keys = getarraykeys( array ); - struct = array[ keys[ 0 ] ]; - distsqr = distancesquared( struct.v[ "origin" ], org ); - i = 1; - while ( i < keys.size ) - { - newdistsqr = distancesquared( array[ keys[ i ] ].v[ "origin" ], org ); - if ( [[ comparefunc ]]( newdistsqr, distsqr ) ) - { - i++; - continue; - } - else - { - distsqr = newdistsqr; - struct = array[ keys[ i ] ]; - } - i++; - } - return struct; + if ( !array.size ) + return undefined; + + if ( isdefined( dist ) ) + { + distsqr = dist * dist; + struct = undefined; + keys = getarraykeys( array ); + + for ( i = 0; i < keys.size; i++ ) + { + newdistsqr = distancesquared( array[keys[i]].v["origin"], org ); + + if ( [[ comparefunc ]]( newdistsqr, distsqr ) ) + continue; + + distsqr = newdistsqr; + struct = array[keys[i]]; + } + + return struct; + } + + keys = getarraykeys( array ); + struct = array[keys[0]]; + distsqr = distancesquared( struct.v["origin"], org ); + + for ( i = 1; i < keys.size; i++ ) + { + newdistsqr = distancesquared( array[keys[i]].v["origin"], org ); + + if ( [[ comparefunc ]]( newdistsqr, distsqr ) ) + continue; + + distsqr = newdistsqr; + struct = array[keys[i]]; + } + + return struct; } comparesizes( org, array, dist, comparefunc ) { - if ( !array.size ) - { - return undefined; - } - if ( isDefined( dist ) ) - { - distsqr = dist * dist; - ent = undefined; - keys = getarraykeys( array ); - i = 0; - while ( i < keys.size ) - { - if ( !isDefined( array[ keys[ i ] ] ) ) - { - i++; - continue; - } - else newdistsqr = distancesquared( array[ keys[ i ] ].origin, org ); - if ( [[ comparefunc ]]( newdistsqr, distsqr ) ) - { - i++; - continue; - } - else - { - distsqr = newdistsqr; - ent = array[ keys[ i ] ]; - } - i++; - } - return ent; - } - keys = getarraykeys( array ); - ent = array[ keys[ 0 ] ]; - distsqr = distancesquared( ent.origin, org ); - i = 1; - while ( i < keys.size ) - { - if ( !isDefined( array[ keys[ i ] ] ) ) - { - i++; - continue; - } - else newdistsqr = distancesquared( array[ keys[ i ] ].origin, org ); - if ( [[ comparefunc ]]( newdistsqr, distsqr ) ) - { - i++; - continue; - } - else - { - distsqr = newdistsqr; - ent = array[ keys[ i ] ]; - } - i++; - } - return ent; + if ( !array.size ) + return undefined; + + if ( isdefined( dist ) ) + { + distsqr = dist * dist; + ent = undefined; + keys = getarraykeys( array ); + + for ( i = 0; i < keys.size; i++ ) + { + if ( !isdefined( array[keys[i]] ) ) + continue; + + newdistsqr = distancesquared( array[keys[i]].origin, org ); + + if ( [[ comparefunc ]]( newdistsqr, distsqr ) ) + continue; + + distsqr = newdistsqr; + ent = array[keys[i]]; + } + + return ent; + } + + keys = getarraykeys( array ); + ent = array[keys[0]]; + distsqr = distancesquared( ent.origin, org ); + + for ( i = 1; i < keys.size; i++ ) + { + if ( !isdefined( array[keys[i]] ) ) + continue; + + newdistsqr = distancesquared( array[keys[i]].origin, org ); + + if ( [[ comparefunc ]]( newdistsqr, distsqr ) ) + continue; + + distsqr = newdistsqr; + ent = array[keys[i]]; + } + + return ent; } closerfunc( dist1, dist2 ) { - return dist1 >= dist2; + return dist1 >= dist2; } fartherfunc( dist1, dist2 ) { - return dist1 <= dist2; + return dist1 <= dist2; } get_array_of_closest( org, array, excluders, max, maxdist ) { - if ( !isDefined( max ) ) - { - max = array.size; - } - if ( !isDefined( excluders ) ) - { - excluders = []; - } - maxdists2rd = undefined; - if ( isDefined( maxdist ) ) - { - maxdists2rd = maxdist * maxdist; - } - dist = []; - index = []; - i = 0; - while ( i < array.size ) - { - if ( !isDefined( array[ i ] ) ) - { - i++; - continue; - } - else excluded = 0; - p = 0; - while ( p < excluders.size ) - { - if ( array[ i ] != excluders[ p ] ) - { - p++; - continue; - } - else - { - excluded = 1; - break; - } - p++; - } - if ( excluded ) - { - i++; - continue; - } - else length = distancesquared( org, array[ i ].origin ); - if ( isDefined( maxdists2rd ) && maxdists2rd < length ) - { - i++; - continue; - } - else - { - dist[ dist.size ] = length; - index[ index.size ] = i; - } - i++; - } - for ( ;; ) - { - change = 0; - i = 0; - while ( i < ( dist.size - 1 ) ) - { - if ( dist[ i ] <= dist[ i + 1 ] ) - { - i++; - continue; - } - else - { - change = 1; - temp = dist[ i ]; - dist[ i ] = dist[ i + 1 ]; - dist[ i + 1 ] = temp; - temp = index[ i ]; - index[ i ] = index[ i + 1 ]; - index[ i + 1 ] = temp; - } - i++; - } - if ( !change ) - { - break; - } - else - { - } - } - newarray = []; - if ( max > dist.size ) - { - max = dist.size; - } - i = 0; - while ( i < max ) - { - newarray[ i ] = array[ index[ i ] ]; - i++; - } - return newarray; + if ( !isdefined( max ) ) + max = array.size; + + if ( !isdefined( excluders ) ) + excluders = []; + + maxdists2rd = undefined; + + if ( isdefined( maxdist ) ) + maxdists2rd = maxdist * maxdist; + + dist = []; + index = []; + + for ( i = 0; i < array.size; i++ ) + { + if ( !isdefined( array[i] ) ) + continue; + + excluded = 0; + + for ( p = 0; p < excluders.size; p++ ) + { + if ( array[i] != excluders[p] ) + continue; + + excluded = 1; + break; + } + + if ( excluded ) + continue; + + length = distancesquared( org, array[i].origin ); + + if ( isdefined( maxdists2rd ) && maxdists2rd < length ) + continue; + + dist[dist.size] = length; + index[index.size] = i; + } + + for (;;) + { + change = 0; + + for ( i = 0; i < dist.size - 1; i++ ) + { + if ( dist[i] <= dist[i + 1] ) + continue; + + change = 1; + temp = dist[i]; + dist[i] = dist[i + 1]; + dist[i + 1] = temp; + temp = index[i]; + index[i] = index[i + 1]; + index[i + 1] = temp; + } + + if ( !change ) + break; + } + + newarray = []; + + if ( max > dist.size ) + max = dist.size; + + for ( i = 0; i < max; i++ ) + newarray[i] = array[index[i]]; + + return newarray; } set_dvar_if_unset( dvar, value, reset ) { - if ( !isDefined( reset ) ) - { - reset = 0; - } - if ( reset || getDvar( dvar ) == "" ) - { - setdvar( dvar, value ); - return value; - } - return getDvar( dvar ); + if ( !isdefined( reset ) ) + reset = 0; + + if ( reset || getdvar( dvar ) == "" ) + { + setdvar( dvar, value ); + return value; + } + + return getdvar( dvar ); } set_dvar_float_if_unset( dvar, value, reset ) { - if ( !isDefined( reset ) ) - { - reset = 0; - } - if ( reset || getDvar( dvar ) == "" ) - { - setdvar( dvar, value ); - } - return getDvarFloat( dvar ); + if ( !isdefined( reset ) ) + reset = 0; + + if ( reset || getdvar( dvar ) == "" ) + setdvar( dvar, value ); + + return getdvarfloat( dvar ); } set_dvar_int_if_unset( dvar, value, reset ) { - if ( !isDefined( reset ) ) - { - reset = 0; - } - if ( reset || getDvar( dvar ) == "" ) - { - setdvar( dvar, value ); - return int( value ); - } - return getDvarInt( dvar ); + if ( !isdefined( reset ) ) + reset = 0; + + if ( reset || getdvar( dvar ) == "" ) + { + setdvar( dvar, value ); + return int( value ); + } + + return getdvarint( dvar ); } drawcylinder( pos, rad, height, duration, stop_notify ) { /# - if ( !isDefined( duration ) ) - { - duration = 0; - } - level thread drawcylinder_think( pos, rad, height, duration, stop_notify ); + if ( !isdefined( duration ) ) + duration = 0; + + level thread drawcylinder_think( pos, rad, height, duration, stop_notify ); #/ } drawcylinder_think( pos, rad, height, seconds, stop_notify ) { /# - if ( isDefined( stop_notify ) ) - { - level endon( stop_notify ); - } - stop_time = getTime() + ( seconds * 1000 ); - currad = rad; - curheight = height; - for ( ;; ) - { - if ( seconds > 0 && stop_time <= getTime() ) - { - return; - } - r = 0; - while ( r < 20 ) - { - 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 ) ); - r++; - } - wait 0,05; + if ( isdefined( stop_notify ) ) + level endon( stop_notify ); + + stop_time = gettime() + seconds * 1000; + currad = rad; + curheight = height; + + for (;;) + { + if ( seconds > 0 && stop_time <= gettime() ) + return; + + 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 ) ); + } + + wait 0.05; + } #/ - } } is_bot() { - if ( isplayer( self ) && isDefined( self.pers[ "isBot" ] ) ) - { - return self.pers[ "isBot" ] != 0; - } + return isplayer( self ) && isdefined( self.pers["isBot"] ) && self.pers["isBot"] != 0; } add_trigger_to_ent( ent ) { - if ( !isDefined( ent._triggers ) ) - { - ent._triggers = []; - } - ent._triggers[ self getentitynumber() ] = 1; + if ( !isdefined( ent._triggers ) ) + ent._triggers = []; + + ent._triggers[self getentitynumber()] = 1; } remove_trigger_from_ent( ent ) { - if ( !isDefined( ent ) ) - { - return; - } - if ( !isDefined( ent._triggers ) ) - { - return; - } - if ( !isDefined( ent._triggers[ self getentitynumber() ] ) ) - { - return; - } - ent._triggers[ self getentitynumber() ] = 0; + if ( !isdefined( ent ) ) + return; + + if ( !isdefined( ent._triggers ) ) + return; + + if ( !isdefined( ent._triggers[self getentitynumber()] ) ) + return; + + ent._triggers[self getentitynumber()] = 0; } ent_already_in_trigger( trig ) { - if ( !isDefined( self._triggers ) ) - { - return 0; - } - if ( !isDefined( self._triggers[ trig getentitynumber() ] ) ) - { - return 0; - } - if ( !self._triggers[ trig getentitynumber() ] ) - { - return 0; - } - return 1; + if ( !isdefined( self._triggers ) ) + return false; + + if ( !isdefined( self._triggers[trig getentitynumber()] ) ) + return false; + + if ( !self._triggers[trig getentitynumber()] ) + return false; + + return true; } trigger_thread_death_monitor( ent, ender ) { - ent waittill( "death" ); - self endon( ender ); - self remove_trigger_from_ent( ent ); + ent waittill( "death" ); + + self endon( ender ); + self remove_trigger_from_ent( ent ); } trigger_thread( ent, on_enter_payload, on_exit_payload ) { - ent endon( "entityshutdown" ); - ent endon( "death" ); - if ( ent ent_already_in_trigger( self ) ) - { - return; - } - self add_trigger_to_ent( ent ); - ender = "end_trig_death_monitor" + self getentitynumber() + " " + ent getentitynumber(); - self thread trigger_thread_death_monitor( ent, ender ); - endon_condition = "leave_trigger_" + self getentitynumber(); - if ( isDefined( on_enter_payload ) ) - { - self thread [[ on_enter_payload ]]( ent, endon_condition ); - } - while ( isDefined( ent ) && ent istouching( self ) ) - { - wait 0,01; - } - ent notify( endon_condition ); - if ( isDefined( ent ) && isDefined( on_exit_payload ) ) - { - self thread [[ on_exit_payload ]]( ent ); - } - if ( isDefined( ent ) ) - { - self remove_trigger_from_ent( ent ); - } - self notify( ender ); + ent endon( "entityshutdown" ); + ent endon( "death" ); + + if ( ent ent_already_in_trigger( self ) ) + return; + + self add_trigger_to_ent( ent ); + ender = "end_trig_death_monitor" + self getentitynumber() + " " + ent getentitynumber(); + self thread trigger_thread_death_monitor( ent, ender ); + endon_condition = "leave_trigger_" + self getentitynumber(); + + if ( isdefined( on_enter_payload ) ) + self thread [[ on_enter_payload ]]( ent, endon_condition ); + + while ( isdefined( ent ) && ent istouching( self ) ) + wait 0.01; + + ent notify( endon_condition ); + + if ( isdefined( ent ) && isdefined( on_exit_payload ) ) + self thread [[ on_exit_payload ]]( ent ); + + if ( isdefined( ent ) ) + self remove_trigger_from_ent( ent ); + + self notify( ender ); } isoneround() { - if ( level.roundlimit == 1 ) - { - return 1; - } - return 0; + if ( level.roundlimit == 1 ) + return true; + + return false; } isfirstround() { - if ( level.roundlimit > 1 && game[ "roundsplayed" ] == 0 ) - { - return 1; - } - return 0; + if ( level.roundlimit > 1 && game["roundsplayed"] == 0 ) + return true; + + return false; } islastround() { - if ( level.roundlimit > 1 && game[ "roundsplayed" ] >= ( level.roundlimit - 1 ) ) - { - return 1; - } - return 0; + if ( level.roundlimit > 1 && game["roundsplayed"] >= level.roundlimit - 1 ) + return true; + + return false; } waslastround() { - if ( level.forcedend ) - { - return 1; - } - if ( isDefined( level.shouldplayovertimeround ) ) - { - if ( [[ level.shouldplayovertimeround ]]() ) - { - level.nextroundisovertime = 1; - return 0; - } - else - { - if ( isDefined( game[ "overtime_round" ] ) ) - { - return 1; - } - } - } - if ( !hitroundlimit() || hitscorelimit() && hitroundwinlimit() ) - { - return 1; - } - return 0; + if ( level.forcedend ) + return true; + + if ( isdefined( level.shouldplayovertimeround ) ) + { + if ( [[ level.shouldplayovertimeround ]]() ) + { + level.nextroundisovertime = 1; + return false; + } + else if ( isdefined( game["overtime_round"] ) ) + return true; + } + + if ( hitroundlimit() || hitscorelimit() || hitroundwinlimit() ) + return true; + + return false; } hitroundlimit() { - if ( level.roundlimit <= 0 ) - { - return 0; - } - return getroundsplayed() >= level.roundlimit; + if ( level.roundlimit <= 0 ) + return 0; + + return getroundsplayed() >= level.roundlimit; } anyteamhitroundwinlimit() { - _a2296 = level.teams; - _k2296 = getFirstArrayKey( _a2296 ); - while ( isDefined( _k2296 ) ) - { - team = _a2296[ _k2296 ]; - if ( getroundswon( team ) >= level.roundwinlimit ) - { - return 1; - } - _k2296 = getNextArrayKey( _a2296, _k2296 ); - } - return 0; + foreach ( team in level.teams ) + { + if ( getroundswon( team ) >= level.roundwinlimit ) + return true; + } + + return false; } anyteamhitroundlimitwithdraws() { - tie_wins = game[ "roundswon" ][ "tie" ]; - _a2309 = level.teams; - _k2309 = getFirstArrayKey( _a2309 ); - while ( isDefined( _k2309 ) ) - { - team = _a2309[ _k2309 ]; - if ( ( getroundswon( team ) + tie_wins ) >= level.roundwinlimit ) - { - return 1; - } - _k2309 = getNextArrayKey( _a2309, _k2309 ); - } - return 0; + tie_wins = game["roundswon"]["tie"]; + + foreach ( team in level.teams ) + { + if ( getroundswon( team ) + tie_wins >= level.roundwinlimit ) + return true; + } + + return false; } getroundwinlimitwinningteam() { - max_wins = 0; - winning_team = undefined; - _a2323 = level.teams; - _k2323 = getFirstArrayKey( _a2323 ); - while ( isDefined( _k2323 ) ) - { - team = _a2323[ _k2323 ]; - wins = getroundswon( team ); - if ( !isDefined( winning_team ) ) - { - max_wins = wins; - winning_team = team; - } - else if ( wins == max_wins ) - { - winning_team = "tie"; - } - else - { - if ( wins > max_wins ) - { - max_wins = wins; - winning_team = team; - } - } - _k2323 = getNextArrayKey( _a2323, _k2323 ); - } - return winning_team; + max_wins = 0; + winning_team = undefined; + + foreach ( team in level.teams ) + { + wins = getroundswon( team ); + + if ( !isdefined( winning_team ) ) + { + max_wins = wins; + winning_team = team; + continue; + } + + if ( wins == max_wins ) + { + winning_team = "tie"; + continue; + } + + if ( wins > max_wins ) + { + max_wins = wins; + winning_team = team; + } + } + + return winning_team; } hitroundwinlimit() { - if ( !isDefined( level.roundwinlimit ) || level.roundwinlimit <= 0 ) - { - return 0; - } - if ( anyteamhitroundwinlimit() ) - { - return 1; - } - if ( anyteamhitroundlimitwithdraws() ) - { - if ( getroundwinlimitwinningteam() != "tie" ) - { - return 1; - } - } - return 0; + if ( !isdefined( level.roundwinlimit ) || level.roundwinlimit <= 0 ) + return false; + + if ( anyteamhitroundwinlimit() ) + return true; + + if ( anyteamhitroundlimitwithdraws() ) + { + if ( getroundwinlimitwinningteam() != "tie" ) + return true; + } + + return false; } anyteamhitscorelimit() { - _a2379 = level.teams; - _k2379 = getFirstArrayKey( _a2379 ); - while ( isDefined( _k2379 ) ) - { - team = _a2379[ _k2379 ]; - if ( game[ "teamScores" ][ team ] >= level.scorelimit ) - { - return 1; - } - _k2379 = getNextArrayKey( _a2379, _k2379 ); - } - return 0; + foreach ( team in level.teams ) + { + if ( game["teamScores"][team] >= level.scorelimit ) + return true; + } + + return false; } hitscorelimit() { - if ( isscoreroundbased() ) - { - return 0; - } - if ( level.scorelimit <= 0 ) - { - return 0; - } - if ( level.teambased ) - { - if ( anyteamhitscorelimit() ) - { - return 1; - } - } - else - { - i = 0; - while ( i < level.players.size ) - { - player = level.players[ i ]; - if ( isDefined( player.pointstowin ) && player.pointstowin >= level.scorelimit ) - { - return 1; - } - i++; - } - } - return 0; + if ( isscoreroundbased() ) + return false; + + if ( level.scorelimit <= 0 ) + return false; + + if ( level.teambased ) + { + if ( anyteamhitscorelimit() ) + return true; + } + else + { + for ( i = 0; i < level.players.size; i++ ) + { + player = level.players[i]; + + if ( isdefined( player.pointstowin ) && player.pointstowin >= level.scorelimit ) + return true; + } + } + + return false; } getroundswon( team ) { - return game[ "roundswon" ][ team ]; + return game["roundswon"][team]; } getotherteamsroundswon( skip_team ) { - roundswon = 0; - _a2423 = level.teams; - _k2423 = getFirstArrayKey( _a2423 ); - while ( isDefined( _k2423 ) ) - { - team = _a2423[ _k2423 ]; - if ( team == skip_team ) - { - } - else - { - roundswon += game[ "roundswon" ][ team ]; - } - _k2423 = getNextArrayKey( _a2423, _k2423 ); - } - return roundswon; + roundswon = 0; + + foreach ( team in level.teams ) + { + if ( team == skip_team ) + continue; + + roundswon += game["roundswon"][team]; + } + + return roundswon; } getroundsplayed() { - return game[ "roundsplayed" ]; + return game["roundsplayed"]; } isscoreroundbased() { - return level.scoreroundbased; + return level.scoreroundbased; } isroundbased() { - if ( level.roundlimit != 1 && level.roundwinlimit != 1 ) - { - return 1; - } - return 0; + if ( level.roundlimit != 1 && level.roundwinlimit != 1 ) + return true; + + return false; } waittillnotmoving() { - if ( self ishacked() ) - { - wait 0,05; - return; - } - if ( self.classname == "grenade" ) - { - self waittill( "stationary" ); - } - else prevorigin = self.origin; - while ( 1 ) - { - wait 0,15; - if ( self.origin == prevorigin ) - { - return; - } - else - { - prevorigin = self.origin; - } - } + if ( self ishacked() ) + { + wait 0.05; + return; + } + + if ( self.classname == "grenade" ) + self waittill( "stationary" ); + else + { + for ( prevorigin = self.origin; 1; prevorigin = self.origin ) + { + wait 0.15; + + if ( self.origin == prevorigin ) + break; + } + } } mayapplyscreeneffect() { /# - assert( isDefined( self ) ); + assert( isdefined( self ) ); #/ /# - assert( isplayer( self ) ); + assert( isplayer( self ) ); #/ - return !isDefined( self.viewlockedentity ); + return !isdefined( self.viewlockedentity ); } getdvarfloatdefault( dvarname, defaultvalue ) { - value = getDvar( dvarname ); - if ( value != "" ) - { - return float( value ); - } - return defaultvalue; + value = getdvar( dvarname ); + + if ( value != "" ) + return float( value ); + + return defaultvalue; } getdvarintdefault( dvarname, defaultvalue ) { - value = getDvar( dvarname ); - if ( value != "" ) - { - return int( value ); - } - return defaultvalue; + value = getdvar( dvarname ); + + if ( value != "" ) + return int( value ); + + return defaultvalue; } closestpointonline( point, linestart, lineend ) { - linemagsqrd = lengthsquared( lineend - linestart ); - t = ( ( ( ( point[ 0 ] - linestart[ 0 ] ) * ( lineend[ 0 ] - linestart[ 0 ] ) ) + ( ( point[ 1 ] - linestart[ 1 ] ) * ( lineend[ 1 ] - linestart[ 1 ] ) ) ) + ( ( point[ 2 ] - linestart[ 2 ] ) * ( lineend[ 2 ] - linestart[ 2 ] ) ) ) / linemagsqrd; - if ( t < 0 ) - { - return linestart; - } - else - { - if ( t > 1 ) - { - return lineend; - } - } - start_x = linestart[ 0 ] + ( t * ( lineend[ 0 ] - linestart[ 0 ] ) ); - start_y = linestart[ 1 ] + ( t * ( lineend[ 1 ] - linestart[ 1 ] ) ); - start_z = linestart[ 2 ] + ( t * ( lineend[ 2 ] - linestart[ 2 ] ) ); - return ( start_x, start_y, start_z ); + linemagsqrd = lengthsquared( lineend - linestart ); + t = ( ( point[0] - linestart[0] ) * ( lineend[0] - linestart[0] ) + ( point[1] - linestart[1] ) * ( lineend[1] - linestart[1] ) + ( point[2] - linestart[2] ) * ( lineend[2] - linestart[2] ) ) / linemagsqrd; + + if ( t < 0.0 ) + return linestart; + else if ( t > 1.0 ) + return lineend; + + start_x = linestart[0] + t * ( lineend[0] - linestart[0] ); + start_y = linestart[1] + t * ( lineend[1] - linestart[1] ); + start_z = linestart[2] + t * ( lineend[2] - linestart[2] ); + return ( start_x, start_y, start_z ); } isstrstart( string1, substr ) { - return getsubstr( string1, 0, substr.size ) == substr; + return getsubstr( string1, 0, substr.size ) == substr; } spread_array_thread( entities, process, var1, var2, var3 ) { - keys = getarraykeys( entities ); - if ( isDefined( var3 ) ) - { - i = 0; - while ( i < keys.size ) - { - entities[ keys[ i ] ] thread [[ process ]]( var1, var2, var3 ); - wait 0,1; - i++; - } - return; - } - if ( isDefined( var2 ) ) - { - i = 0; - while ( i < keys.size ) - { - entities[ keys[ i ] ] thread [[ process ]]( var1, var2 ); - wait 0,1; - i++; - } - return; - } - if ( isDefined( var1 ) ) - { - i = 0; - while ( i < keys.size ) - { - entities[ keys[ i ] ] thread [[ process ]]( var1 ); - wait 0,1; - i++; - } - return; - } - i = 0; - while ( i < keys.size ) - { - entities[ keys[ i ] ] thread [[ process ]](); - wait 0,1; - i++; - } + keys = getarraykeys( entities ); + + if ( isdefined( var3 ) ) + { + for ( i = 0; i < keys.size; i++ ) + { + entities[keys[i]] thread [[ process ]]( var1, var2, var3 ); + wait 0.1; + } + + return; + } + + if ( isdefined( var2 ) ) + { + for ( i = 0; i < keys.size; i++ ) + { + entities[keys[i]] thread [[ process ]]( var1, var2 ); + wait 0.1; + } + + return; + } + + if ( isdefined( var1 ) ) + { + for ( i = 0; i < keys.size; i++ ) + { + entities[keys[i]] thread [[ process ]]( var1 ); + wait 0.1; + } + + return; + } + + for ( i = 0; i < keys.size; i++ ) + { + entities[keys[i]] thread [[ process ]](); + wait 0.1; + } } freeze_player_controls( boolean ) { /# - assert( isDefined( boolean ), "'freeze_player_controls()' has not been passed an argument properly." ); + assert( isdefined( boolean ), "'freeze_player_controls()' has not been passed an argument properly." ); #/ - if ( boolean && isDefined( self ) ) - { - self freezecontrols( boolean ); - } - else - { - if ( !boolean && isDefined( self ) && !level.gameended ) - { - self freezecontrols( boolean ); - } - } + if ( boolean && isdefined( self ) ) + self freezecontrols( boolean ); + else if ( !boolean && isdefined( self ) && !level.gameended ) + self freezecontrols( boolean ); } gethostplayer() { - players = get_players(); - index = 0; - while ( index < players.size ) - { - if ( players[ index ] ishost() ) - { - return players[ index ]; - } - index++; - } + players = get_players(); + + for ( index = 0; index < players.size; index++ ) + { + if ( players[index] ishost() ) + return players[index]; + } } gethostplayerforbots() { - players = get_players(); - index = 0; - while ( index < players.size ) - { - if ( players[ index ] ishostforbots() ) - { - return players[ index ]; - } - index++; - } + players = get_players(); + + for ( index = 0; index < players.size; index++ ) + { + if ( players[index] ishostforbots() ) + return players[index]; + } } ispregame() { - if ( isDefined( level.pregame ) ) - { - return level.pregame; - } + return isdefined( level.pregame ) && level.pregame; } iskillstreaksenabled() { - if ( isDefined( level.killstreaksenabled ) ) - { - return level.killstreaksenabled; - } + return isdefined( level.killstreaksenabled ) && level.killstreaksenabled; } isrankenabled() { - if ( isDefined( level.rankenabled ) ) - { - return level.rankenabled; - } + return isdefined( level.rankenabled ) && level.rankenabled; } playsmokesound( position, duration, startsound, stopsound, loopsound ) { - smokesound = spawn( "script_origin", ( 0, 0, 1 ) ); - smokesound.origin = position; - smokesound playsound( startsound ); - smokesound playloopsound( loopsound ); - if ( duration > 0,5 ) - { - wait ( duration - 0,5 ); - } - thread playsoundinspace( stopsound, position ); - smokesound stoploopsound( 0,5 ); - wait 0,5; - smokesound delete(); + smokesound = spawn( "script_origin", ( 0, 0, 1 ) ); + smokesound.origin = position; + smokesound playsound( startsound ); + smokesound playloopsound( loopsound ); + + if ( duration > 0.5 ) + wait( duration - 0.5 ); + + thread playsoundinspace( stopsound, position ); + smokesound stoploopsound( 0.5 ); + wait 0.5; + smokesound delete(); } playsoundinspace( alias, origin, master ) { - org = spawn( "script_origin", ( 0, 0, 1 ) ); - if ( !isDefined( origin ) ) - { - origin = self.origin; - } - org.origin = origin; - if ( isDefined( master ) && master ) - { - org playsoundasmaster( alias ); - } - else - { - org playsound( alias ); - } - wait 10; - org delete(); + org = spawn( "script_origin", ( 0, 0, 1 ) ); + + if ( !isdefined( origin ) ) + origin = self.origin; + + org.origin = origin; + + if ( isdefined( master ) && master ) + org playsoundasmaster( alias ); + else + org playsound( alias ); + + wait 10.0; + org delete(); } get2dyaw( start, end ) { - yaw = 0; - vector = ( end[ 0 ] - start[ 0 ], end[ 1 ] - start[ 1 ], 0 ); - return vectoangles( vector ); + yaw = 0; + vector = ( end[0] - start[0], end[1] - start[1], 0 ); + return vectoangles( vector ); } vectoangles( vector ) { - yaw = 0; - vecx = vector[ 0 ]; - vecy = vector[ 1 ]; - if ( vecx == 0 && vecy == 0 ) - { - return 0; - } - if ( vecy < 0,001 && vecy > -0,001 ) - { - vecy = 0,001; - } - yaw = atan( vecx / vecy ); - if ( vecy < 0 ) - { - yaw += 180; - } - return 90 - yaw; + yaw = 0; + vecx = vector[0]; + vecy = vector[1]; + + if ( vecx == 0 && vecy == 0 ) + return 0; + + if ( vecy < 0.001 && vecy > -0.001 ) + vecy = 0.001; + + yaw = atan( vecx / vecy ); + + if ( vecy < 0 ) + yaw += 180; + + return 90 - yaw; } deleteaftertime( time ) { /# - assert( isDefined( self ) ); + assert( isdefined( self ) ); #/ /# - assert( isDefined( time ) ); + assert( isdefined( time ) ); #/ /# - assert( time >= 0,05 ); + assert( time >= 0.05 ); #/ - self thread deleteaftertimethread( time ); + self thread deleteaftertimethread( time ); } deleteaftertimethread( time ) { - self endon( "death" ); - wait time; - self delete(); + self endon( "death" ); + wait( time ); + self delete(); } setusingremote( remotename ) { - if ( isDefined( self.carryicon ) ) - { - self.carryicon.alpha = 0; - } + if ( isdefined( self.carryicon ) ) + self.carryicon.alpha = 0; /# - assert( !self isusingremote() ); + assert( !self isusingremote() ); #/ - self.usingremote = remotename; - self disableoffhandweapons(); - self notify( "using_remote" ); + self.usingremote = remotename; + self disableoffhandweapons(); + self notify( "using_remote" ); } getremotename() { /# - assert( self isusingremote() ); + assert( self isusingremote() ); #/ - return self.usingremote; + return self.usingremote; } isusingremote() { - return isDefined( self.usingremote ); + return isdefined( self.usingremote ); } getlastweapon() { - last_weapon = undefined; - if ( self hasweapon( self.lastnonkillstreakweapon ) ) - { - last_weapon = self.lastnonkillstreakweapon; - } - else - { - if ( self hasweapon( self.lastdroppableweapon ) ) - { - last_weapon = self.lastdroppableweapon; - } - } + last_weapon = undefined; + + if ( self hasweapon( self.lastnonkillstreakweapon ) ) + last_weapon = self.lastnonkillstreakweapon; + else if ( self hasweapon( self.lastdroppableweapon ) ) + last_weapon = self.lastdroppableweapon; /# - assert( isDefined( last_weapon ) ); + assert( isdefined( last_weapon ) ); #/ - return last_weapon; + return last_weapon; } freezecontrolswrapper( frozen ) { - if ( isDefined( level.hostmigrationtimer ) ) - { - self freeze_player_controls( 1 ); - return; - } - self freeze_player_controls( frozen ); + if ( isdefined( level.hostmigrationtimer ) ) + { + self freeze_player_controls( 1 ); + return; + } + + self freeze_player_controls( frozen ); } setobjectivetext( team, text ) { - game[ "strings" ][ "objective_" + team ] = text; - precachestring( text ); + game["strings"]["objective_" + team] = text; + precachestring( text ); } setobjectivescoretext( team, text ) { - game[ "strings" ][ "objective_score_" + team ] = text; - precachestring( text ); + game["strings"]["objective_score_" + team] = text; + precachestring( text ); } setobjectivehinttext( team, text ) { - game[ "strings" ][ "objective_hint_" + team ] = text; - precachestring( text ); + game["strings"]["objective_hint_" + team] = text; + precachestring( text ); } getobjectivetext( team ) { - return game[ "strings" ][ "objective_" + team ]; + return game["strings"]["objective_" + team]; } getobjectivescoretext( team ) { - return game[ "strings" ][ "objective_score_" + team ]; + return game["strings"]["objective_score_" + team]; } getobjectivehinttext( team ) { - return game[ "strings" ][ "objective_hint_" + team ]; + return game["strings"]["objective_hint_" + team]; } registerroundswitch( minvalue, maxvalue ) { - level.roundswitch = clamp( getgametypesetting( "roundSwitch" ), minvalue, maxvalue ); - level.roundswitchmin = minvalue; - level.roundswitchmax = maxvalue; + level.roundswitch = clamp( getgametypesetting( "roundSwitch" ), minvalue, maxvalue ); + level.roundswitchmin = minvalue; + level.roundswitchmax = maxvalue; } registerroundlimit( minvalue, maxvalue ) { - level.roundlimit = clamp( getgametypesetting( "roundLimit" ), minvalue, maxvalue ); - level.roundlimitmin = minvalue; - level.roundlimitmax = maxvalue; + level.roundlimit = clamp( getgametypesetting( "roundLimit" ), minvalue, maxvalue ); + level.roundlimitmin = minvalue; + level.roundlimitmax = maxvalue; } registerroundwinlimit( minvalue, maxvalue ) { - level.roundwinlimit = clamp( getgametypesetting( "roundWinLimit" ), minvalue, maxvalue ); - level.roundwinlimitmin = minvalue; - level.roundwinlimitmax = maxvalue; + level.roundwinlimit = clamp( getgametypesetting( "roundWinLimit" ), minvalue, maxvalue ); + level.roundwinlimitmin = minvalue; + level.roundwinlimitmax = maxvalue; } registerscorelimit( minvalue, maxvalue ) { - level.scorelimit = clamp( getgametypesetting( "scoreLimit" ), minvalue, maxvalue ); - level.scorelimitmin = minvalue; - level.scorelimitmax = maxvalue; - setdvar( "ui_scorelimit", level.scorelimit ); + level.scorelimit = clamp( getgametypesetting( "scoreLimit" ), minvalue, maxvalue ); + level.scorelimitmin = minvalue; + level.scorelimitmax = maxvalue; + setdvar( "ui_scorelimit", level.scorelimit ); } registertimelimit( minvalue, maxvalue ) { - level.timelimit = clamp( getgametypesetting( "timeLimit" ), minvalue, maxvalue ); - level.timelimitmin = minvalue; - level.timelimitmax = maxvalue; - setdvar( "ui_timelimit", level.timelimit ); + level.timelimit = clamp( getgametypesetting( "timeLimit" ), minvalue, maxvalue ); + level.timelimitmin = minvalue; + level.timelimitmax = maxvalue; + setdvar( "ui_timelimit", level.timelimit ); } registernumlives( minvalue, maxvalue ) { - level.numlives = clamp( getgametypesetting( "playerNumLives" ), minvalue, maxvalue ); - level.numlivesmin = minvalue; - level.numlivesmax = maxvalue; + level.numlives = clamp( getgametypesetting( "playerNumLives" ), minvalue, maxvalue ); + level.numlivesmin = minvalue; + level.numlivesmax = maxvalue; } getplayerfromclientnum( clientnum ) { - if ( clientnum < 0 ) - { - return undefined; - } - i = 0; - while ( i < level.players.size ) - { - if ( level.players[ i ] getentitynumber() == clientnum ) - { - return level.players[ i ]; - } - i++; - } - return undefined; + if ( clientnum < 0 ) + return undefined; + + for ( i = 0; i < level.players.size; i++ ) + { + if ( level.players[i] getentitynumber() == clientnum ) + return level.players[i]; + } + + return undefined; } setclientfield( field_name, value ) { - if ( self == level ) - { - codesetworldclientfield( field_name, value ); - } - else - { - codesetclientfield( self, field_name, value ); - } + if ( self == level ) + codesetworldclientfield( field_name, value ); + else + codesetclientfield( self, field_name, value ); } setclientfieldtoplayer( field_name, value ) { - codesetplayerstateclientfield( self, field_name, value ); + codesetplayerstateclientfield( self, field_name, value ); } getclientfield( field_name ) { - if ( self == level ) - { - return codegetworldclientfield( field_name ); - } - else - { - return codegetclientfield( self, field_name ); - } + if ( self == level ) + return codegetworldclientfield( field_name ); + else + return codegetclientfield( self, field_name ); } getclientfieldtoplayer( field_name ) { - return codegetplayerstateclientfield( self, field_name ); + return codegetplayerstateclientfield( self, field_name ); } isenemyplayer( player ) { /# - assert( isDefined( player ) ); + assert( isdefined( player ) ); #/ - if ( !isplayer( player ) ) - { - return 0; - } - if ( level.teambased ) - { - if ( player.team == self.team ) - { - return 0; - } - } - else - { - if ( player == self ) - { - return 0; - } - } - return 1; + if ( !isplayer( player ) ) + return false; + + if ( level.teambased ) + { + if ( player.team == self.team ) + return false; + } + else if ( player == self ) + return false; + + return true; } getweaponclass( weapon ) { /# - assert( isDefined( weapon ) ); + assert( isdefined( weapon ) ); #/ - if ( !isDefined( weapon ) ) - { - return undefined; - } - if ( !isDefined( level.weaponclassarray ) ) - { - level.weaponclassarray = []; - } - if ( isDefined( level.weaponclassarray[ weapon ] ) ) - { - return level.weaponclassarray[ weapon ]; - } - baseweaponindex = getbaseweaponitemindex( weapon ) + 1; - weaponclass = tablelookupcolumnforrow( "mp/statstable.csv", baseweaponindex, 2 ); - level.weaponclassarray[ weapon ] = weaponclass; - return weaponclass; + if ( !isdefined( weapon ) ) + return undefined; + + if ( !isdefined( level.weaponclassarray ) ) + level.weaponclassarray = []; + + if ( isdefined( level.weaponclassarray[weapon] ) ) + return level.weaponclassarray[weapon]; + + baseweaponindex = getbaseweaponitemindex( weapon ) + 1; + weaponclass = tablelookupcolumnforrow( "mp/statstable.csv", baseweaponindex, 2 ); + level.weaponclassarray[weapon] = weaponclass; + return weaponclass; } ispressbuild() { - buildtype = getDvar( #"19B966D7" ); - if ( isDefined( buildtype ) && buildtype == "press" ) - { - return 1; - } - return 0; + buildtype = getdvar( _hash_19B966D7 ); + + if ( isdefined( buildtype ) && buildtype == "press" ) + return true; + + return false; } isflashbanged() { - if ( isDefined( self.flashendtime ) ) - { - return getTime() < self.flashendtime; - } + return isdefined( self.flashendtime ) && gettime() < self.flashendtime; } ishacked() { - if ( isDefined( self.hacked ) ) - { - return self.hacked; - } + return isdefined( self.hacked ) && self.hacked; } domaxdamage( origin, attacker, inflictor, headshot, mod ) { - if ( isDefined( self.damagedtodeath ) && self.damagedtodeath ) - { - return; - } - if ( isDefined( self.maxhealth ) ) - { - damage = self.maxhealth + 1; - } - else - { - damage = self.health + 1; - } - self.damagedtodeath = 1; - self dodamage( damage, origin, attacker, inflictor, headshot, mod ); + if ( isdefined( self.damagedtodeath ) && self.damagedtodeath ) + return; + + if ( isdefined( self.maxhealth ) ) + damage = self.maxhealth + 1; + else + damage = self.health + 1; + + self.damagedtodeath = 1; + self dodamage( damage, origin, attacker, inflictor, headshot, mod ); } diff --git a/Multiplayer Core/patch_mp/maps/mp/_vehicles.gsc b/Multiplayer Core/patch_mp/maps/mp/_vehicles.gsc index 97ce0c6..93e26bd 100644 --- a/Multiplayer Core/patch_mp/maps/mp/_vehicles.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/_vehicles.gsc @@ -1,1633 +1,1543 @@ -#include maps/mp/gametypes/_spawning; -#include maps/mp/killstreaks/_qrdrone; -#include maps/mp/killstreaks/_rcbomb; -#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\killstreaks\_rcbomb; +#include maps\mp\killstreaks\_qrdrone; +#include maps\mp\gametypes\_spawning; -#using_animtree( "mp_vehicles" ); +#using_animtree("mp_vehicles"); init() { - precachevehicle( get_default_vehicle_name() ); - setdvar( "scr_veh_cleanupdebugprint", "0" ); - setdvar( "scr_veh_driversarehidden", "1" ); - setdvar( "scr_veh_driversareinvulnerable", "1" ); - setdvar( "scr_veh_alive_cleanuptimemin", "119" ); - setdvar( "scr_veh_alive_cleanuptimemax", "120" ); - setdvar( "scr_veh_dead_cleanuptimemin", "20" ); - setdvar( "scr_veh_dead_cleanuptimemax", "30" ); - setdvar( "scr_veh_cleanuptime_dmgfactor_min", "0.33" ); - setdvar( "scr_veh_cleanuptime_dmgfactor_max", "1.0" ); - setdvar( "scr_veh_cleanuptime_dmgfactor_deadtread", "0.25" ); - setdvar( "scr_veh_cleanuptime_dmgfraction_curve_begin", "0.0" ); - setdvar( "scr_veh_cleanuptime_dmgfraction_curve_end", "1.0" ); - setdvar( "scr_veh_cleanupabandoned", "1" ); - setdvar( "scr_veh_cleanupdrifted", "1" ); - setdvar( "scr_veh_cleanupmaxspeedmph", "1" ); - setdvar( "scr_veh_cleanupmindistancefeet", "75" ); - setdvar( "scr_veh_waittillstoppedandmindist_maxtime", "10" ); - setdvar( "scr_veh_waittillstoppedandmindist_maxtimeenabledistfeet", "5" ); - setdvar( "scr_veh_respawnafterhuskcleanup", "1" ); - setdvar( "scr_veh_respawntimemin", "50" ); - setdvar( "scr_veh_respawntimemax", "90" ); - setdvar( "scr_veh_respawnwait_maxiterations", "30" ); - setdvar( "scr_veh_respawnwait_iterationwaitseconds", "1" ); - setdvar( "scr_veh_disablerespawn", "0" ); - setdvar( "scr_veh_disableoverturndamage", "0" ); - setdvar( "scr_veh_explosion_spawnfx", "1" ); - setdvar( "scr_veh_explosion_doradiusdamage", "1" ); - setdvar( "scr_veh_explosion_radius", "256" ); - setdvar( "scr_veh_explosion_mindamage", "20" ); - setdvar( "scr_veh_explosion_maxdamage", "200" ); - setdvar( "scr_veh_ondeath_createhusk", "1" ); - setdvar( "scr_veh_ondeath_usevehicleashusk", "1" ); - setdvar( "scr_veh_explosion_husk_forcepointvariance", "30" ); - setdvar( "scr_veh_explosion_husk_horzvelocityvariance", "25" ); - setdvar( "scr_veh_explosion_husk_vertvelocitymin", "100" ); - setdvar( "scr_veh_explosion_husk_vertvelocitymax", "200" ); - setdvar( "scr_veh_explode_on_cleanup", "1" ); - setdvar( "scr_veh_disappear_maxwaittime", "60" ); - setdvar( "scr_veh_disappear_maxpreventdistancefeet", "30" ); - setdvar( "scr_veh_disappear_maxpreventvisibilityfeet", "150" ); - setdvar( "scr_veh_health_tank", "1350" ); - level.vehicle_drivers_are_invulnerable = getDvarInt( "scr_veh_driversareinvulnerable" ); - level.onejectoccupants = ::vehicle_eject_all_occupants; - level.vehiclehealths[ "panzer4_mp" ] = 2600; - level.vehiclehealths[ "t34_mp" ] = 2600; - setdvar( "scr_veh_health_jeep", "700" ); - if ( init_vehicle_entities() ) - { - level.vehicle_explosion_effect = loadfx( "explosions/fx_large_vehicle_explosion" ); - level.veh_husk_models = []; - if ( isDefined( level.use_new_veh_husks ) ) - { - level.veh_husk_models[ "t34_mp" ] = "veh_t34_destroyed_mp"; - } - if ( isDefined( level.onaddvehiclehusks ) ) - { - [[ level.onaddvehiclehusks ]](); - } - keys = getarraykeys( level.veh_husk_models ); - i = 0; - while ( i < keys.size ) - { - precachemodel( level.veh_husk_models[ keys[ i ] ] ); - i++; - } - precacherumble( "tank_damage_light_mp" ); - precacherumble( "tank_damage_heavy_mp" ); - level._effect[ "tanksquish" ] = loadfx( "maps/see2/fx_body_blood_splat" ); - } - chopper_player_get_on_gun = %int_huey_gunner_on; - chopper_door_open = %v_huey_door_open; - chopper_door_open_state = %v_huey_door_open_state; - chopper_door_closed_state = %v_huey_door_close_state; - killbrushes = getentarray( "water_killbrush", "targetname" ); - _a123 = killbrushes; - _k123 = getFirstArrayKey( _a123 ); - while ( isDefined( _k123 ) ) - { - brush = _a123[ _k123 ]; - brush thread water_killbrush_think(); - _k123 = getNextArrayKey( _a123, _k123 ); - } - return; + precachevehicle( get_default_vehicle_name() ); + setdvar( "scr_veh_cleanupdebugprint", "0" ); + setdvar( "scr_veh_driversarehidden", "1" ); + setdvar( "scr_veh_driversareinvulnerable", "1" ); + setdvar( "scr_veh_alive_cleanuptimemin", "119" ); + setdvar( "scr_veh_alive_cleanuptimemax", "120" ); + setdvar( "scr_veh_dead_cleanuptimemin", "20" ); + setdvar( "scr_veh_dead_cleanuptimemax", "30" ); + setdvar( "scr_veh_cleanuptime_dmgfactor_min", "0.33" ); + setdvar( "scr_veh_cleanuptime_dmgfactor_max", "1.0" ); + setdvar( "scr_veh_cleanuptime_dmgfactor_deadtread", "0.25" ); + setdvar( "scr_veh_cleanuptime_dmgfraction_curve_begin", "0.0" ); + setdvar( "scr_veh_cleanuptime_dmgfraction_curve_end", "1.0" ); + setdvar( "scr_veh_cleanupabandoned", "1" ); + setdvar( "scr_veh_cleanupdrifted", "1" ); + setdvar( "scr_veh_cleanupmaxspeedmph", "1" ); + setdvar( "scr_veh_cleanupmindistancefeet", "75" ); + setdvar( "scr_veh_waittillstoppedandmindist_maxtime", "10" ); + setdvar( "scr_veh_waittillstoppedandmindist_maxtimeenabledistfeet", "5" ); + setdvar( "scr_veh_respawnafterhuskcleanup", "1" ); + setdvar( "scr_veh_respawntimemin", "50" ); + setdvar( "scr_veh_respawntimemax", "90" ); + setdvar( "scr_veh_respawnwait_maxiterations", "30" ); + setdvar( "scr_veh_respawnwait_iterationwaitseconds", "1" ); + setdvar( "scr_veh_disablerespawn", "0" ); + setdvar( "scr_veh_disableoverturndamage", "0" ); + setdvar( "scr_veh_explosion_spawnfx", "1" ); + setdvar( "scr_veh_explosion_doradiusdamage", "1" ); + setdvar( "scr_veh_explosion_radius", "256" ); + setdvar( "scr_veh_explosion_mindamage", "20" ); + setdvar( "scr_veh_explosion_maxdamage", "200" ); + setdvar( "scr_veh_ondeath_createhusk", "1" ); + setdvar( "scr_veh_ondeath_usevehicleashusk", "1" ); + setdvar( "scr_veh_explosion_husk_forcepointvariance", "30" ); + setdvar( "scr_veh_explosion_husk_horzvelocityvariance", "25" ); + setdvar( "scr_veh_explosion_husk_vertvelocitymin", "100" ); + setdvar( "scr_veh_explosion_husk_vertvelocitymax", "200" ); + setdvar( "scr_veh_explode_on_cleanup", "1" ); + setdvar( "scr_veh_disappear_maxwaittime", "60" ); + setdvar( "scr_veh_disappear_maxpreventdistancefeet", "30" ); + setdvar( "scr_veh_disappear_maxpreventvisibilityfeet", "150" ); + setdvar( "scr_veh_health_tank", "1350" ); + level.vehicle_drivers_are_invulnerable = getdvarint( "scr_veh_driversareinvulnerable" ); + level.onejectoccupants = ::vehicle_eject_all_occupants; + level.vehiclehealths["panzer4_mp"] = 2600; + level.vehiclehealths["t34_mp"] = 2600; + setdvar( "scr_veh_health_jeep", "700" ); + + if ( init_vehicle_entities() ) + { + level.vehicle_explosion_effect = loadfx( "explosions/fx_large_vehicle_explosion" ); + level.veh_husk_models = []; + + if ( isdefined( level.use_new_veh_husks ) ) + level.veh_husk_models["t34_mp"] = "veh_t34_destroyed_mp"; + + if ( isdefined( level.onaddvehiclehusks ) ) + [[ level.onaddvehiclehusks ]](); + + keys = getarraykeys( level.veh_husk_models ); + + for ( i = 0; i < keys.size; i++ ) + precachemodel( level.veh_husk_models[keys[i]] ); + + precacherumble( "tank_damage_light_mp" ); + precacherumble( "tank_damage_heavy_mp" ); + level._effect["tanksquish"] = loadfx( "maps/see2/fx_body_blood_splat" ); + } + + chopper_player_get_on_gun = %int_huey_gunner_on; + chopper_door_open = %v_huey_door_open; + chopper_door_open_state = %v_huey_door_open_state; + chopper_door_closed_state = %v_huey_door_close_state; + killbrushes = getentarray( "water_killbrush", "targetname" ); + + foreach ( brush in killbrushes ) + brush thread water_killbrush_think(); } water_killbrush_think() { - for ( ;; ) - { - self waittill( "trigger", entity ); - if ( isDefined( entity ) ) - { - if ( isDefined( entity.targetname ) ) - { - if ( entity.targetname == "rcbomb" ) - { - entity maps/mp/killstreaks/_rcbomb::rcbomb_force_explode(); - break; - } - else - { - if ( entity.targetname == "talon" && !is_true( entity.dead ) ) - { - entity notify( "death" ); - } - } - } - if ( isDefined( entity.helitype ) && entity.helitype == "qrdrone" ) - { - entity maps/mp/killstreaks/_qrdrone::qrdrone_force_destroy(); - } - } - } + for (;;) + { + self waittill( "trigger", entity ); + + if ( isdefined( entity ) ) + { + if ( isdefined( entity.targetname ) ) + { + if ( entity.targetname == "rcbomb" ) + entity maps\mp\killstreaks\_rcbomb::rcbomb_force_explode(); + else if ( entity.targetname == "talon" && !is_true( entity.dead ) ) + entity notify( "death" ); + } + + if ( isdefined( entity.helitype ) && entity.helitype == "qrdrone" ) + entity maps\mp\killstreaks\_qrdrone::qrdrone_force_destroy(); + } + } } initialize_vehicle_damage_effects_for_level() { - k_mild_damage_index = 0; - k_moderate_damage_index = 1; - k_severe_damage_index = 2; - k_total_damage_index = 3; - k_mild_damage_health_percentage = 0,85; - k_moderate_damage_health_percentage = 0,55; - k_severe_damage_health_percentage = 0,35; - k_total_damage_health_percentage = 0; - level.k_mild_damage_health_percentage = k_mild_damage_health_percentage; - level.k_moderate_damage_health_percentage = k_moderate_damage_health_percentage; - level.k_severe_damage_health_percentage = k_severe_damage_health_percentage; - level.k_total_damage_health_percentage = k_total_damage_health_percentage; - level.vehicles_damage_states = []; - level.vehicles_husk_effects = []; - level.vehicles_damage_treadfx = []; - vehicle_name = get_default_vehicle_name(); - level.vehicles_damage_states[ vehicle_name ] = []; - level.vehicles_damage_treadfx[ vehicle_name ] = []; - level.vehicles_damage_states[ vehicle_name ][ k_mild_damage_index ] = spawnstruct(); - level.vehicles_damage_states[ vehicle_name ][ k_mild_damage_index ].health_percentage = k_mild_damage_health_percentage; - level.vehicles_damage_states[ vehicle_name ][ k_mild_damage_index ].effect_array = []; - level.vehicles_damage_states[ vehicle_name ][ k_mild_damage_index ].effect_array[ 0 ] = spawnstruct(); - level.vehicles_damage_states[ vehicle_name ][ k_mild_damage_index ].effect_array[ 0 ].damage_effect = loadfx( "vehicle/vfire/fx_tank_sherman_smldr" ); - level.vehicles_damage_states[ vehicle_name ][ k_mild_damage_index ].effect_array[ 0 ].sound_effect = undefined; - level.vehicles_damage_states[ vehicle_name ][ k_mild_damage_index ].effect_array[ 0 ].vehicle_tag = "tag_origin"; - level.vehicles_damage_states[ vehicle_name ][ k_moderate_damage_index ] = spawnstruct(); - level.vehicles_damage_states[ vehicle_name ][ k_moderate_damage_index ].health_percentage = k_moderate_damage_health_percentage; - level.vehicles_damage_states[ vehicle_name ][ k_moderate_damage_index ].effect_array = []; - level.vehicles_damage_states[ vehicle_name ][ k_moderate_damage_index ].effect_array[ 0 ] = spawnstruct(); - level.vehicles_damage_states[ vehicle_name ][ k_moderate_damage_index ].effect_array[ 0 ].damage_effect = loadfx( "vehicle/vfire/fx_vfire_med_12" ); - level.vehicles_damage_states[ vehicle_name ][ k_moderate_damage_index ].effect_array[ 0 ].sound_effect = undefined; - level.vehicles_damage_states[ vehicle_name ][ k_moderate_damage_index ].effect_array[ 0 ].vehicle_tag = "tag_origin"; - level.vehicles_damage_states[ vehicle_name ][ k_severe_damage_index ] = spawnstruct(); - level.vehicles_damage_states[ vehicle_name ][ k_severe_damage_index ].health_percentage = k_severe_damage_health_percentage; - level.vehicles_damage_states[ vehicle_name ][ k_severe_damage_index ].effect_array = []; - level.vehicles_damage_states[ vehicle_name ][ k_severe_damage_index ].effect_array[ 0 ] = spawnstruct(); - level.vehicles_damage_states[ vehicle_name ][ k_severe_damage_index ].effect_array[ 0 ].damage_effect = loadfx( "vehicle/vfire/fx_vfire_sherman" ); - level.vehicles_damage_states[ vehicle_name ][ k_severe_damage_index ].effect_array[ 0 ].sound_effect = undefined; - level.vehicles_damage_states[ vehicle_name ][ k_severe_damage_index ].effect_array[ 0 ].vehicle_tag = "tag_origin"; - level.vehicles_damage_states[ vehicle_name ][ k_total_damage_index ] = spawnstruct(); - level.vehicles_damage_states[ vehicle_name ][ k_total_damage_index ].health_percentage = k_total_damage_health_percentage; - level.vehicles_damage_states[ vehicle_name ][ k_total_damage_index ].effect_array = []; - level.vehicles_damage_states[ vehicle_name ][ k_total_damage_index ].effect_array[ 0 ] = spawnstruct(); - level.vehicles_damage_states[ vehicle_name ][ k_total_damage_index ].effect_array[ 0 ].damage_effect = loadfx( "explosions/fx_large_vehicle_explosion" ); - level.vehicles_damage_states[ vehicle_name ][ k_total_damage_index ].effect_array[ 0 ].sound_effect = "vehicle_explo"; - level.vehicles_damage_states[ vehicle_name ][ k_total_damage_index ].effect_array[ 0 ].vehicle_tag = "tag_origin"; - default_husk_effects = spawnstruct(); - default_husk_effects.damage_effect = undefined; - default_husk_effects.sound_effect = undefined; - default_husk_effects.vehicle_tag = "tag_origin"; - level.vehicles_husk_effects[ vehicle_name ] = default_husk_effects; - return; + k_mild_damage_index = 0; + k_moderate_damage_index = 1; + k_severe_damage_index = 2; + k_total_damage_index = 3; + k_mild_damage_health_percentage = 0.85; + k_moderate_damage_health_percentage = 0.55; + k_severe_damage_health_percentage = 0.35; + k_total_damage_health_percentage = 0; + level.k_mild_damage_health_percentage = k_mild_damage_health_percentage; + level.k_moderate_damage_health_percentage = k_moderate_damage_health_percentage; + level.k_severe_damage_health_percentage = k_severe_damage_health_percentage; + level.k_total_damage_health_percentage = k_total_damage_health_percentage; + level.vehicles_damage_states = []; + level.vehicles_husk_effects = []; + level.vehicles_damage_treadfx = []; + vehicle_name = get_default_vehicle_name(); + level.vehicles_damage_states[vehicle_name] = []; + level.vehicles_damage_treadfx[vehicle_name] = []; + level.vehicles_damage_states[vehicle_name][k_mild_damage_index] = spawnstruct(); + level.vehicles_damage_states[vehicle_name][k_mild_damage_index].health_percentage = k_mild_damage_health_percentage; + level.vehicles_damage_states[vehicle_name][k_mild_damage_index].effect_array = []; + level.vehicles_damage_states[vehicle_name][k_mild_damage_index].effect_array[0] = spawnstruct(); + level.vehicles_damage_states[vehicle_name][k_mild_damage_index].effect_array[0].damage_effect = loadfx( "vehicle/vfire/fx_tank_sherman_smldr" ); + level.vehicles_damage_states[vehicle_name][k_mild_damage_index].effect_array[0].sound_effect = undefined; + level.vehicles_damage_states[vehicle_name][k_mild_damage_index].effect_array[0].vehicle_tag = "tag_origin"; + level.vehicles_damage_states[vehicle_name][k_moderate_damage_index] = spawnstruct(); + level.vehicles_damage_states[vehicle_name][k_moderate_damage_index].health_percentage = k_moderate_damage_health_percentage; + level.vehicles_damage_states[vehicle_name][k_moderate_damage_index].effect_array = []; + level.vehicles_damage_states[vehicle_name][k_moderate_damage_index].effect_array[0] = spawnstruct(); + level.vehicles_damage_states[vehicle_name][k_moderate_damage_index].effect_array[0].damage_effect = loadfx( "vehicle/vfire/fx_vfire_med_12" ); + level.vehicles_damage_states[vehicle_name][k_moderate_damage_index].effect_array[0].sound_effect = undefined; + level.vehicles_damage_states[vehicle_name][k_moderate_damage_index].effect_array[0].vehicle_tag = "tag_origin"; + level.vehicles_damage_states[vehicle_name][k_severe_damage_index] = spawnstruct(); + level.vehicles_damage_states[vehicle_name][k_severe_damage_index].health_percentage = k_severe_damage_health_percentage; + level.vehicles_damage_states[vehicle_name][k_severe_damage_index].effect_array = []; + level.vehicles_damage_states[vehicle_name][k_severe_damage_index].effect_array[0] = spawnstruct(); + level.vehicles_damage_states[vehicle_name][k_severe_damage_index].effect_array[0].damage_effect = loadfx( "vehicle/vfire/fx_vfire_sherman" ); + level.vehicles_damage_states[vehicle_name][k_severe_damage_index].effect_array[0].sound_effect = undefined; + level.vehicles_damage_states[vehicle_name][k_severe_damage_index].effect_array[0].vehicle_tag = "tag_origin"; + level.vehicles_damage_states[vehicle_name][k_total_damage_index] = spawnstruct(); + level.vehicles_damage_states[vehicle_name][k_total_damage_index].health_percentage = k_total_damage_health_percentage; + level.vehicles_damage_states[vehicle_name][k_total_damage_index].effect_array = []; + level.vehicles_damage_states[vehicle_name][k_total_damage_index].effect_array[0] = spawnstruct(); + level.vehicles_damage_states[vehicle_name][k_total_damage_index].effect_array[0].damage_effect = loadfx( "explosions/fx_large_vehicle_explosion" ); + level.vehicles_damage_states[vehicle_name][k_total_damage_index].effect_array[0].sound_effect = "vehicle_explo"; + level.vehicles_damage_states[vehicle_name][k_total_damage_index].effect_array[0].vehicle_tag = "tag_origin"; + default_husk_effects = spawnstruct(); + default_husk_effects.damage_effect = undefined; + default_husk_effects.sound_effect = undefined; + default_husk_effects.vehicle_tag = "tag_origin"; + level.vehicles_husk_effects[vehicle_name] = default_husk_effects; } get_vehicle_name( vehicle ) { - name = ""; - if ( isDefined( vehicle ) ) - { - if ( isDefined( vehicle.vehicletype ) ) - { - name = vehicle.vehicletype; - } - } - return name; + name = ""; + + if ( isdefined( vehicle ) ) + { + if ( isdefined( vehicle.vehicletype ) ) + name = vehicle.vehicletype; + } + + return name; } get_default_vehicle_name() { - return "defaultvehicle_mp"; + return "defaultvehicle_mp"; } get_vehicle_name_key_for_damage_states( vehicle ) { - vehicle_name = get_vehicle_name( vehicle ); - if ( !isDefined( level.vehicles_damage_states[ vehicle_name ] ) ) - { - vehicle_name = get_default_vehicle_name(); - } - return vehicle_name; + vehicle_name = get_vehicle_name( vehicle ); + + if ( !isdefined( level.vehicles_damage_states[vehicle_name] ) ) + vehicle_name = get_default_vehicle_name(); + + return vehicle_name; } get_vehicle_damage_state_index_from_health_percentage( vehicle ) { - damage_state_index = -1; - vehicle_name = get_vehicle_name_key_for_damage_states(); - test_index = 0; - while ( test_index < level.vehicles_damage_states[ vehicle_name ].size ) - { - if ( vehicle.current_health_percentage <= level.vehicles_damage_states[ vehicle_name ][ test_index ].health_percentage ) - { - damage_state_index = test_index; - test_index++; - continue; - } - else - { - } - test_index++; - } - return damage_state_index; + damage_state_index = -1; + vehicle_name = get_vehicle_name_key_for_damage_states(); + + for ( test_index = 0; test_index < level.vehicles_damage_states[vehicle_name].size; test_index++ ) + { + if ( vehicle.current_health_percentage <= level.vehicles_damage_states[vehicle_name][test_index].health_percentage ) + { + damage_state_index = test_index; + continue; + } + + break; + } + + return damage_state_index; } update_damage_effects( vehicle, attacker ) { - if ( vehicle.initial_state.health > 0 ) - { - previous_damage_state_index = get_vehicle_damage_state_index_from_health_percentage( vehicle ); - vehicle.current_health_percentage = vehicle.health / vehicle.initial_state.health; - current_damage_state_index = get_vehicle_damage_state_index_from_health_percentage( vehicle ); - if ( previous_damage_state_index != current_damage_state_index ) - { - vehicle notify( "damage_state_changed" ); - if ( previous_damage_state_index < 0 ) - { - start_damage_state_index = 0; - } - else - { - start_damage_state_index = previous_damage_state_index + 1; - } - play_damage_state_effects( vehicle, start_damage_state_index, current_damage_state_index ); - if ( vehicle.health <= 0 ) - { - vehicle kill_vehicle( attacker ); - } - } - } - return; + if ( vehicle.initial_state.health > 0 ) + { + previous_damage_state_index = get_vehicle_damage_state_index_from_health_percentage( vehicle ); + vehicle.current_health_percentage = vehicle.health / vehicle.initial_state.health; + current_damage_state_index = get_vehicle_damage_state_index_from_health_percentage( vehicle ); + + if ( previous_damage_state_index != current_damage_state_index ) + { + vehicle notify( "damage_state_changed" ); + + if ( previous_damage_state_index < 0 ) + start_damage_state_index = 0; + else + start_damage_state_index = previous_damage_state_index + 1; + + play_damage_state_effects( vehicle, start_damage_state_index, current_damage_state_index ); + + if ( vehicle.health <= 0 ) + vehicle kill_vehicle( attacker ); + } + } } play_damage_state_effects( vehicle, start_damage_state_index, end_damage_state_index ) { - vehicle_name = get_vehicle_name_key_for_damage_states( vehicle ); - damage_state_index = start_damage_state_index; - while ( damage_state_index <= end_damage_state_index ) - { - effect_index = 0; - while ( effect_index < level.vehicles_damage_states[ vehicle_name ][ damage_state_index ].effect_array.size ) - { - effects = level.vehicles_damage_states[ vehicle_name ][ damage_state_index ].effect_array[ effect_index ]; - vehicle thread play_vehicle_effects( effects ); - effect_index++; - } - damage_state_index++; - } - return; + vehicle_name = get_vehicle_name_key_for_damage_states( vehicle ); + + for ( damage_state_index = start_damage_state_index; damage_state_index <= end_damage_state_index; damage_state_index++ ) + { + for ( effect_index = 0; effect_index < level.vehicles_damage_states[vehicle_name][damage_state_index].effect_array.size; effect_index++ ) + { + effects = level.vehicles_damage_states[vehicle_name][damage_state_index].effect_array[effect_index]; + vehicle thread play_vehicle_effects( effects ); + } + } } play_vehicle_effects( effects, isdamagedtread ) { - self endon( "delete" ); - self endon( "removed" ); - if ( !isDefined( isdamagedtread ) || isdamagedtread == 0 ) - { - self endon( "damage_state_changed" ); - } - if ( isDefined( effects.sound_effect ) ) - { - self playsound( effects.sound_effect ); - } - waittime = 0; - if ( isDefined( effects.damage_effect_loop_time ) ) - { - waittime = effects.damage_effect_loop_time; - } - while ( waittime > 0 ) - { - if ( isDefined( effects.damage_effect ) ) - { - playfxontag( effects.damage_effect, self, effects.vehicle_tag ); - } - wait waittime; - } + self endon( "delete" ); + self endon( "removed" ); + + if ( !isdefined( isdamagedtread ) || isdamagedtread == 0 ) + self endon( "damage_state_changed" ); + + if ( isdefined( effects.sound_effect ) ) + self playsound( effects.sound_effect ); + + waittime = 0; + + if ( isdefined( effects.damage_effect_loop_time ) ) + waittime = effects.damage_effect_loop_time; + + while ( waittime > 0 ) + { + if ( isdefined( effects.damage_effect ) ) + playfxontag( effects.damage_effect, self, effects.vehicle_tag ); + + wait( waittime ); + } } init_vehicle_entities() { - vehicles = getentarray( "script_vehicle", "classname" ); - array_thread( vehicles, ::init_original_vehicle ); - if ( isDefined( vehicles ) ) - { - return vehicles.size; - } - return 0; + vehicles = getentarray( "script_vehicle", "classname" ); + array_thread( vehicles, ::init_original_vehicle ); + + if ( isdefined( vehicles ) ) + return vehicles.size; + + return 0; } precache_vehicles() { + } register_vehicle() { - if ( !isDefined( level.vehicles_list ) ) - { - level.vehicles_list = []; - } - level.vehicles_list[ level.vehicles_list.size ] = self; + if ( !isdefined( level.vehicles_list ) ) + level.vehicles_list = []; + + level.vehicles_list[level.vehicles_list.size] = self; } manage_vehicles() { - if ( !isDefined( level.vehicles_list ) ) - { - return 1; - } - else - { - max_vehicles = getmaxvehicles(); - newarray = []; - i = 0; - while ( i < level.vehicles_list.size ) - { - if ( isDefined( level.vehicles_list[ i ] ) ) - { - newarray[ newarray.size ] = level.vehicles_list[ i ]; - } - i++; - } - level.vehicles_list = newarray; - vehiclestodelete = ( level.vehicles_list.size + 1 ) - max_vehicles; - if ( vehiclestodelete > 0 ) - { - newarray = []; - i = 0; - while ( i < level.vehicles_list.size ) - { - vehicle = level.vehicles_list[ i ]; - if ( vehiclestodelete > 0 ) - { - if ( isDefined( vehicle.is_husk ) && !isDefined( vehicle.permanentlyremoved ) ) - { - deleted = vehicle husk_do_cleanup(); - if ( deleted ) - { - vehiclestodelete--; + if ( !isdefined( level.vehicles_list ) ) + return 1; + else + { + max_vehicles = getmaxvehicles(); + newarray = []; - i++; - continue; - } - } - } - else - { - newarray[ newarray.size ] = vehicle; - } - i++; - } - level.vehicles_list = newarray; - } - return level.vehicles_list.size < max_vehicles; - } + for ( i = 0; i < level.vehicles_list.size; i++ ) + { + if ( isdefined( level.vehicles_list[i] ) ) + newarray[newarray.size] = level.vehicles_list[i]; + } + + level.vehicles_list = newarray; + vehiclestodelete = level.vehicles_list.size + 1 - max_vehicles; + + if ( vehiclestodelete > 0 ) + { + newarray = []; + + for ( i = 0; i < level.vehicles_list.size; i++ ) + { + vehicle = level.vehicles_list[i]; + + if ( vehiclestodelete > 0 ) + { + if ( isdefined( vehicle.is_husk ) && !isdefined( vehicle.permanentlyremoved ) ) + { + deleted = vehicle husk_do_cleanup(); + + if ( deleted ) + { + vehiclestodelete--; + continue; + } + } + } + + newarray[newarray.size] = vehicle; + } + + level.vehicles_list = newarray; + } + + return level.vehicles_list.size < max_vehicles; + } } init_vehicle() { - self register_vehicle(); - if ( isDefined( level.vehiclehealths ) && isDefined( level.vehiclehealths[ self.vehicletype ] ) ) - { - self.maxhealth = level.vehiclehealths[ self.vehicletype ]; - } - else - { - self.maxhealth = getDvarInt( "scr_veh_health_tank" ); + self register_vehicle(); + + if ( isdefined( level.vehiclehealths ) && isdefined( level.vehiclehealths[self.vehicletype] ) ) + self.maxhealth = level.vehiclehealths[self.vehicletype]; + else + { + self.maxhealth = getdvarint( "scr_veh_health_tank" ); /# - println( "No health specified for vehicle type " + self.vehicletype + "! Using default..." ); + println( "No health specified for vehicle type " + self.vehicletype + "! Using default..." ); #/ - } - self.health = self.maxhealth; - self vehicle_record_initial_values(); - self init_vehicle_threads(); - self maps/mp/gametypes/_spawning::create_vehicle_influencers(); + } + + self.health = self.maxhealth; + self vehicle_record_initial_values(); + self init_vehicle_threads(); + self maps\mp\gametypes\_spawning::create_vehicle_influencers(); } initialize_vehicle_damage_state_data() { - if ( self.initial_state.health > 0 ) - { - self.current_health_percentage = self.health / self.initial_state.health; - self.previous_health_percentage = self.health / self.initial_state.health; - } - else - { - self.current_health_percentage = 1; - self.previous_health_percentage = 1; - } - return; + if ( self.initial_state.health > 0 ) + { + self.current_health_percentage = self.health / self.initial_state.health; + self.previous_health_percentage = self.health / self.initial_state.health; + } + else + { + self.current_health_percentage = 1; + self.previous_health_percentage = 1; + } } init_original_vehicle() { - self.original_vehicle = 1; - self init_vehicle(); + self.original_vehicle = 1; + self init_vehicle(); } vehicle_wait_player_enter_t() { - self endon( "transmute" ); - self endon( "death" ); - self endon( "delete" ); - while ( 1 ) - { - self waittill( "enter_vehicle", player ); - player thread player_wait_exit_vehicle_t(); - player player_update_vehicle_hud( 1, self ); - } + self endon( "transmute" ); + self endon( "death" ); + self endon( "delete" ); + + while ( true ) + { + self waittill( "enter_vehicle", player ); + + player thread player_wait_exit_vehicle_t(); + player player_update_vehicle_hud( 1, self ); + } } player_wait_exit_vehicle_t() { - self endon( "disconnect" ); - self waittill( "exit_vehicle", vehicle ); - self player_update_vehicle_hud( 0, vehicle ); + self endon( "disconnect" ); + + self waittill( "exit_vehicle", vehicle ); + + self player_update_vehicle_hud( 0, vehicle ); } vehicle_wait_damage_t() { - self endon( "transmute" ); - self endon( "death" ); - self endon( "delete" ); - while ( 1 ) - { - self waittill( "damage" ); - occupants = self getvehoccupants(); - while ( isDefined( occupants ) ) - { - i = 0; - while ( i < occupants.size ) - { - occupants[ i ] player_update_vehicle_hud( 1, self ); - i++; - } - } - } + self endon( "transmute" ); + self endon( "death" ); + self endon( "delete" ); + + while ( true ) + { + self waittill( "damage" ); + + occupants = self getvehoccupants(); + + if ( isdefined( occupants ) ) + { + for ( i = 0; i < occupants.size; i++ ) + occupants[i] player_update_vehicle_hud( 1, self ); + } + } } player_update_vehicle_hud( show, vehicle ) { - if ( show ) - { - if ( !isDefined( self.vehiclehud ) ) - { - self.vehiclehud = createbar( ( 0, 0, 1 ), 64, 16 ); - self.vehiclehud setpoint( "CENTER", "BOTTOM", 0, -40 ); - self.vehiclehud.alpha = 0,75; - } - self.vehiclehud updatebar( vehicle.health / vehicle.initial_state.health ); - } - else - { - if ( isDefined( self.vehiclehud ) ) - { - self.vehiclehud destroyelem(); - } - } - if ( getDvar( #"480B1A1D" ) != "" ) - { - if ( getDvarInt( #"480B1A1D" ) != 0 ) - { - if ( show ) - { - if ( !isDefined( self.vehiclehudhealthnumbers ) ) - { - self.vehiclehudhealthnumbers = createfontstring( "default", 2 ); - self.vehiclehudhealthnumbers setparent( self.vehiclehud ); - self.vehiclehudhealthnumbers setpoint( "LEFT", "RIGHT", 8, 0 ); - self.vehiclehudhealthnumbers.alpha = 0,75; - self.vehiclehudhealthnumbers.hidewheninmenu = 0; - self.vehiclehudhealthnumbers.archived = 0; - } - self.vehiclehudhealthnumbers setvalue( vehicle.health ); - return; - } - else - { - if ( isDefined( self.vehiclehudhealthnumbers ) ) - { - self.vehiclehudhealthnumbers destroyelem(); - } - } - } - } + if ( show ) + { + if ( !isdefined( self.vehiclehud ) ) + { + self.vehiclehud = createbar( ( 1, 1, 1 ), 64, 16 ); + self.vehiclehud setpoint( "CENTER", "BOTTOM", 0, -40 ); + self.vehiclehud.alpha = 0.75; + } + + self.vehiclehud updatebar( vehicle.health / vehicle.initial_state.health ); + } + else if ( isdefined( self.vehiclehud ) ) + self.vehiclehud destroyelem(); + + if ( getdvar( _hash_480B1A1D ) != "" ) + { + if ( getdvarint( _hash_480B1A1D ) != 0 ) + { + if ( show ) + { + if ( !isdefined( self.vehiclehudhealthnumbers ) ) + { + self.vehiclehudhealthnumbers = createfontstring( "default", 2.0 ); + self.vehiclehudhealthnumbers setparent( self.vehiclehud ); + self.vehiclehudhealthnumbers setpoint( "LEFT", "RIGHT", 8, 0 ); + self.vehiclehudhealthnumbers.alpha = 0.75; + self.vehiclehudhealthnumbers.hidewheninmenu = 0; + self.vehiclehudhealthnumbers.archived = 0; + } + + self.vehiclehudhealthnumbers setvalue( vehicle.health ); + } + else if ( isdefined( self.vehiclehudhealthnumbers ) ) + self.vehiclehudhealthnumbers destroyelem(); + } + } } init_vehicle_threads() { - self thread vehicle_fireweapon_t(); - self thread vehicle_abandoned_by_drift_t(); - self thread vehicle_abandoned_by_occupants_t(); - self thread vehicle_damage_t(); - self thread vehicle_ghost_entering_occupants_t(); - self thread vehicle_recycle_spawner_t(); - self thread vehicle_disconnect_paths(); - if ( isDefined( level.enablevehiclehealthbar ) && level.enablevehiclehealthbar ) - { - self thread vehicle_wait_player_enter_t(); - self thread vehicle_wait_damage_t(); - } - self thread vehicle_wait_tread_damage(); - self thread vehicle_overturn_eject_occupants(); - if ( getDvarInt( "scr_veh_disableoverturndamage" ) == 0 ) - { - self thread vehicle_overturn_suicide(); - } + self thread vehicle_fireweapon_t(); + self thread vehicle_abandoned_by_drift_t(); + self thread vehicle_abandoned_by_occupants_t(); + self thread vehicle_damage_t(); + self thread vehicle_ghost_entering_occupants_t(); + self thread vehicle_recycle_spawner_t(); + self thread vehicle_disconnect_paths(); + + if ( isdefined( level.enablevehiclehealthbar ) && level.enablevehiclehealthbar ) + { + self thread vehicle_wait_player_enter_t(); + self thread vehicle_wait_damage_t(); + } + + self thread vehicle_wait_tread_damage(); + self thread vehicle_overturn_eject_occupants(); + + if ( getdvarint( "scr_veh_disableoverturndamage" ) == 0 ) + self thread vehicle_overturn_suicide(); /# - self thread cleanup_debug_print_t(); - self thread cleanup_debug_print_clearmsg_t(); + self thread cleanup_debug_print_t(); + self thread cleanup_debug_print_clearmsg_t(); #/ } build_template( type, model, typeoverride ) { - if ( isDefined( typeoverride ) ) - { - type = typeoverride; - } - if ( !isDefined( level.vehicle_death_fx ) ) - { - level.vehicle_death_fx = []; - } - if ( !isDefined( level.vehicle_death_fx[ type ] ) ) - { - level.vehicle_death_fx[ type ] = []; - } - level.vehicle_compassicon[ type ] = 0; - level.vehicle_team[ type ] = "axis"; - level.vehicle_life[ type ] = 999; - level.vehicle_hasmainturret[ model ] = 0; - level.vehicle_mainturrets[ model ] = []; - level.vtmodel = model; - level.vttype = type; + if ( isdefined( typeoverride ) ) + type = typeoverride; + + if ( !isdefined( level.vehicle_death_fx ) ) + level.vehicle_death_fx = []; + + if ( !isdefined( level.vehicle_death_fx[type] ) ) + level.vehicle_death_fx[type] = []; + + level.vehicle_compassicon[type] = 0; + level.vehicle_team[type] = "axis"; + level.vehicle_life[type] = 999; + level.vehicle_hasmainturret[model] = 0; + level.vehicle_mainturrets[model] = []; + level.vtmodel = model; + level.vttype = type; } build_rumble( rumble, scale, duration, radius, basetime, randomaditionaltime ) { - if ( !isDefined( level.vehicle_rumble ) ) - { - level.vehicle_rumble = []; - } - struct = build_quake( scale, duration, radius, basetime, randomaditionaltime ); + if ( !isdefined( level.vehicle_rumble ) ) + level.vehicle_rumble = []; + + struct = build_quake( scale, duration, radius, basetime, randomaditionaltime ); /# - assert( isDefined( rumble ) ); + assert( isdefined( rumble ) ); #/ - precacherumble( rumble ); - struct.rumble = rumble; - level.vehicle_rumble[ level.vttype ] = struct; - precacherumble( "tank_damaged_rumble_mp" ); + precacherumble( rumble ); + struct.rumble = rumble; + level.vehicle_rumble[level.vttype] = struct; + precacherumble( "tank_damaged_rumble_mp" ); } build_quake( scale, duration, radius, basetime, randomaditionaltime ) { - struct = spawnstruct(); - struct.scale = scale; - struct.duration = duration; - struct.radius = radius; - if ( isDefined( basetime ) ) - { - struct.basetime = basetime; - } - if ( isDefined( randomaditionaltime ) ) - { - struct.randomaditionaltime = randomaditionaltime; - } - return struct; + struct = spawnstruct(); + struct.scale = scale; + struct.duration = duration; + struct.radius = radius; + + if ( isdefined( basetime ) ) + struct.basetime = basetime; + + if ( isdefined( randomaditionaltime ) ) + struct.randomaditionaltime = randomaditionaltime; + + return struct; } build_exhaust( effect ) { - level.vehicle_exhaust[ level.vtmodel ] = loadfx( effect ); + level.vehicle_exhaust[level.vtmodel] = loadfx( effect ); } cleanup_debug_print_t() { - self endon( "transmute" ); - self endon( "death" ); - self endon( "delete" ); + self endon( "transmute" ); + self endon( "death" ); + self endon( "delete" ); /# - while ( 1 ) - { - if ( isDefined( self.debug_message ) && getDvarInt( "scr_veh_cleanupdebugprint" ) != 0 ) - { - print3d( self.origin + vectorScale( ( 0, 0, 1 ), 150 ), self.debug_message, ( 0, 0, 1 ), 1, 1, 1 ); - } - wait 0,01; + while ( true ) + { + if ( isdefined( self.debug_message ) && getdvarint( "scr_veh_cleanupdebugprint" ) != 0 ) + print3d( self.origin + vectorscale( ( 0, 0, 1 ), 150.0 ), self.debug_message, ( 0, 1, 0 ), 1, 1, 1 ); + + wait 0.01; + } #/ - } } cleanup_debug_print_clearmsg_t() { - self endon( "transmute" ); - self endon( "death" ); - self endon( "delete" ); + self endon( "transmute" ); + self endon( "death" ); + self endon( "delete" ); /# - while ( 1 ) - { - self waittill( "enter_vehicle" ); - self.debug_message = undefined; + while ( true ) + { + self waittill( "enter_vehicle" ); + + self.debug_message = undefined; + } #/ - } } cleanup_debug_print( message ) { /# - self.debug_message = message; + self.debug_message = message; #/ } vehicle_abandoned_by_drift_t() { - self endon( "transmute" ); - self endon( "death" ); - self endon( "delete" ); - self wait_then_cleanup_vehicle( "Drift Test", "scr_veh_cleanupdrifted" ); + self endon( "transmute" ); + self endon( "death" ); + self endon( "delete" ); + self wait_then_cleanup_vehicle( "Drift Test", "scr_veh_cleanupdrifted" ); } vehicle_abandoned_by_occupants_timeout_t() { - self endon( "transmute" ); - self endon( "death" ); - self endon( "delete" ); - self wait_then_cleanup_vehicle( "Abandon Test", "scr_veh_cleanupabandoned" ); + self endon( "transmute" ); + self endon( "death" ); + self endon( "delete" ); + self wait_then_cleanup_vehicle( "Abandon Test", "scr_veh_cleanupabandoned" ); } wait_then_cleanup_vehicle( test_name, cleanup_dvar_name ) { - self endon( "enter_vehicle" ); - self wait_until_severely_damaged(); - self do_alive_cleanup_wait( test_name ); - self wait_for_vehicle_to_stop_outside_min_radius(); - self cleanup( test_name, cleanup_dvar_name, ::vehicle_recycle ); + self endon( "enter_vehicle" ); + self wait_until_severely_damaged(); + self do_alive_cleanup_wait( test_name ); + self wait_for_vehicle_to_stop_outside_min_radius(); + self cleanup( test_name, cleanup_dvar_name, ::vehicle_recycle ); } wait_until_severely_damaged() { - while ( 1 ) - { - health_percentage = self.health / self.initial_state.health; - if ( isDefined( level.k_severe_damage_health_percentage ) ) - { - self cleanup_debug_print( "Damage Test: Still healthy - (" + health_percentage + " >= " + level.k_severe_damage_health_percentage + ") and working treads" ); - } - else - { - self cleanup_debug_print( "Damage Test: Still healthy and working treads" ); - } - self waittill( "damage" ); - health_percentage = self.health / self.initial_state.health; - if ( health_percentage < level.k_severe_damage_health_percentage ) - { - return; - } - else - { - } - } + while ( true ) + { + health_percentage = self.health / self.initial_state.health; + + if ( isdefined( level.k_severe_damage_health_percentage ) ) + self cleanup_debug_print( "Damage Test: Still healthy - (" + health_percentage + " >= " + level.k_severe_damage_health_percentage + ") and working treads" ); + else + self cleanup_debug_print( "Damage Test: Still healthy and working treads" ); + + self waittill( "damage" ); + + health_percentage = self.health / self.initial_state.health; + + if ( health_percentage < level.k_severe_damage_health_percentage ) + break; + } } get_random_cleanup_wait_time( state ) { - varnameprefix = "scr_veh_" + state + "_cleanuptime"; - mintime = getDvarFloat( varnameprefix + "min" ); - maxtime = getDvarFloat( varnameprefix + "max" ); - if ( maxtime > mintime ) - { - return randomfloatrange( mintime, maxtime ); - } - else - { - return maxtime; - } + varnameprefix = "scr_veh_" + state + "_cleanuptime"; + mintime = getdvarfloat( varnameprefix + "min" ); + maxtime = getdvarfloat( varnameprefix + "max" ); + + if ( maxtime > mintime ) + return randomfloatrange( mintime, maxtime ); + else + return maxtime; } do_alive_cleanup_wait( test_name ) { - initialrandomwaitseconds = get_random_cleanup_wait_time( "alive" ); - secondswaited = 0; - seconds_per_iteration = 1; - while ( 1 ) - { - curve_begin = getDvarFloat( "scr_veh_cleanuptime_dmgfraction_curve_begin" ); - curve_end = getDvarFloat( "scr_veh_cleanuptime_dmgfraction_curve_end" ); - factor_min = getDvarFloat( "scr_veh_cleanuptime_dmgfactor_min" ); - factor_max = getDvarFloat( "scr_veh_cleanuptime_dmgfactor_max" ); - treaddeaddamagefactor = getDvarFloat( "scr_veh_cleanuptime_dmgfactor_deadtread" ); - damagefraction = 0; - if ( self is_vehicle() ) - { - damagefraction = ( self.initial_state.health - self.health ) / self.initial_state.health; - } - else - { - damagefraction = 1; - } - damagefactor = 0; - if ( damagefraction <= curve_begin ) - { - damagefactor = factor_max; - } - else if ( damagefraction >= curve_end ) - { - damagefactor = factor_min; - } - else - { - dydx = ( factor_min - factor_max ) / ( curve_end - curve_begin ); - damagefactor = factor_max + ( ( damagefraction - curve_begin ) * dydx ); - } - totalsecstowait = initialrandomwaitseconds * damagefactor; - if ( secondswaited >= totalsecstowait ) - { - return; - } - else - { - self cleanup_debug_print( ( test_name + ": Waiting " ) + ( totalsecstowait - secondswaited ) + "s" ); - wait seconds_per_iteration; - secondswaited += seconds_per_iteration; - } - } + initialrandomwaitseconds = get_random_cleanup_wait_time( "alive" ); + secondswaited = 0.0; + seconds_per_iteration = 1.0; + + while ( true ) + { + curve_begin = getdvarfloat( "scr_veh_cleanuptime_dmgfraction_curve_begin" ); + curve_end = getdvarfloat( "scr_veh_cleanuptime_dmgfraction_curve_end" ); + factor_min = getdvarfloat( "scr_veh_cleanuptime_dmgfactor_min" ); + factor_max = getdvarfloat( "scr_veh_cleanuptime_dmgfactor_max" ); + treaddeaddamagefactor = getdvarfloat( "scr_veh_cleanuptime_dmgfactor_deadtread" ); + damagefraction = 0.0; + + if ( self is_vehicle() ) + damagefraction = ( self.initial_state.health - self.health ) / self.initial_state.health; + else + damagefraction = 1.0; + + damagefactor = 0.0; + + if ( damagefraction <= curve_begin ) + damagefactor = factor_max; + else if ( damagefraction >= curve_end ) + damagefactor = factor_min; + else + { + dydx = ( factor_min - factor_max ) / ( curve_end - curve_begin ); + damagefactor = factor_max + ( damagefraction - curve_begin ) * dydx; + } + + totalsecstowait = initialrandomwaitseconds * damagefactor; + + if ( secondswaited >= totalsecstowait ) + break; + + self cleanup_debug_print( test_name + ": Waiting " + totalsecstowait - secondswaited + "s" ); + wait( seconds_per_iteration ); + secondswaited += seconds_per_iteration; + } } do_dead_cleanup_wait( test_name ) { - total_secs_to_wait = get_random_cleanup_wait_time( "dead" ); - seconds_waited = 0; - seconds_per_iteration = 1; - while ( seconds_waited < total_secs_to_wait ) - { - self cleanup_debug_print( ( test_name + ": Waiting " ) + ( total_secs_to_wait - seconds_waited ) + "s" ); - wait seconds_per_iteration; - seconds_waited += seconds_per_iteration; - } + total_secs_to_wait = get_random_cleanup_wait_time( "dead" ); + seconds_waited = 0.0; + seconds_per_iteration = 1.0; + + while ( seconds_waited < total_secs_to_wait ) + { + self cleanup_debug_print( test_name + ": Waiting " + total_secs_to_wait - seconds_waited + "s" ); + wait( seconds_per_iteration ); + seconds_waited += seconds_per_iteration; + } } cleanup( test_name, cleanup_dvar_name, cleanup_func ) { - keep_waiting = 1; - while ( keep_waiting ) - { - if ( isDefined( cleanup_dvar_name ) ) - { - cleanupenabled = getDvarInt( cleanup_dvar_name ) != 0; - } - if ( cleanupenabled != 0 ) - { - self [[ cleanup_func ]](); - return; - } - else - { - keep_waiting = 0; -/# - self cleanup_debug_print( "Cleanup disabled for " + test_name + " ( dvar = " + cleanup_dvar_name + " )" ); - wait 5; - keep_waiting = 1; -#/ - } - } + for ( keep_waiting = 1; keep_waiting; keep_waiting = 1 ) + { + cleanupenabled = !isdefined( cleanup_dvar_name ) || getdvarint( cleanup_dvar_name ) != 0; + + if ( cleanupenabled != 0 ) + { + self [[ cleanup_func ]](); + break; + } + + keep_waiting = 0; + devblock( loc_395E ); + self cleanup_debug_print( "Cleanup disabled for " + test_name + " ( dvar = " + cleanup_dvar_name + " )" ); + wait 5.0; + } } vehicle_wait_tread_damage() { - self endon( "death" ); - self endon( "delete" ); - vehicle_name = get_vehicle_name( self ); - while ( 1 ) - { - self waittill( "broken", brokennotify ); - if ( brokennotify == "left_tread_destroyed" ) - { - if ( isDefined( level.vehicles_damage_treadfx[ vehicle_name ] ) && isDefined( level.vehicles_damage_treadfx[ vehicle_name ][ 0 ] ) ) - { - self thread play_vehicle_effects( level.vehicles_damage_treadfx[ vehicle_name ][ 0 ], 1 ); - } - continue; - } - else - { - if ( brokennotify == "right_tread_destroyed" ) - { - if ( isDefined( level.vehicles_damage_treadfx[ vehicle_name ] ) && isDefined( level.vehicles_damage_treadfx[ vehicle_name ][ 1 ] ) ) - { - self thread play_vehicle_effects( level.vehicles_damage_treadfx[ vehicle_name ][ 1 ], 1 ); - } - } - } - } + self endon( "death" ); + self endon( "delete" ); + vehicle_name = get_vehicle_name( self ); + + while ( true ) + { + self waittill( "broken", brokennotify ); + + if ( brokennotify == "left_tread_destroyed" ) + { + if ( isdefined( level.vehicles_damage_treadfx[vehicle_name] ) && isdefined( level.vehicles_damage_treadfx[vehicle_name][0] ) ) + self thread play_vehicle_effects( level.vehicles_damage_treadfx[vehicle_name][0], 1 ); + } + else if ( brokennotify == "right_tread_destroyed" ) + { + if ( isdefined( level.vehicles_damage_treadfx[vehicle_name] ) && isdefined( level.vehicles_damage_treadfx[vehicle_name][1] ) ) + self thread play_vehicle_effects( level.vehicles_damage_treadfx[vehicle_name][1], 1 ); + } + } } wait_for_vehicle_to_stop_outside_min_radius() { - maxwaittime = getDvarFloat( "scr_veh_waittillstoppedandmindist_maxtime" ); - iterationwaitseconds = 1; - maxwaittimeenabledistinches = 12 * getDvarFloat( "scr_veh_waittillstoppedandmindist_maxtimeenabledistfeet" ); - initialorigin = self.initial_state.origin; - totalsecondswaited = 0; - while ( totalsecondswaited < maxwaittime ) - { - speedmph = self getspeedmph(); - cutoffmph = getDvarFloat( "scr_veh_cleanupmaxspeedmph" ); - if ( speedmph > cutoffmph ) - { - cleanup_debug_print( "(" + ( maxwaittime - totalsecondswaited ) + "s) Speed: " + speedmph + ">" + cutoffmph ); - } - else - { - } - wait iterationwaitseconds; - totalsecondswaited += iterationwaitseconds; - } + maxwaittime = getdvarfloat( "scr_veh_waittillstoppedandmindist_maxtime" ); + iterationwaitseconds = 1.0; + maxwaittimeenabledistinches = 12 * getdvarfloat( "scr_veh_waittillstoppedandmindist_maxtimeenabledistfeet" ); + initialorigin = self.initial_state.origin; + + for ( totalsecondswaited = 0.0; totalsecondswaited < maxwaittime; totalsecondswaited += iterationwaitseconds ) + { + speedmph = self getspeedmph(); + cutoffmph = getdvarfloat( "scr_veh_cleanupmaxspeedmph" ); + + if ( speedmph > cutoffmph ) + cleanup_debug_print( "(" + maxwaittime - totalsecondswaited + "s) Speed: " + speedmph + ">" + cutoffmph ); + else + break; + + wait( iterationwaitseconds ); + } } vehicle_abandoned_by_occupants_t() { - self endon( "transmute" ); - self endon( "death" ); - self endon( "delete" ); - while ( 1 ) - { - self waittill( "exit_vehicle" ); - occupants = self getvehoccupants(); - if ( occupants.size == 0 ) - { - self play_start_stop_sound( "tank_shutdown_sfx" ); - self thread vehicle_abandoned_by_occupants_timeout_t(); - } - } + self endon( "transmute" ); + self endon( "death" ); + self endon( "delete" ); + + while ( true ) + { + self waittill( "exit_vehicle" ); + + occupants = self getvehoccupants(); + + if ( occupants.size == 0 ) + { + self play_start_stop_sound( "tank_shutdown_sfx" ); + self thread vehicle_abandoned_by_occupants_timeout_t(); + } + } } play_start_stop_sound( sound_alias, modulation ) { - if ( isDefined( self.start_stop_sfxid ) ) - { - } - self.start_stop_sfxid = self playsound( sound_alias ); + if ( isdefined( self.start_stop_sfxid ) ) + { + + } + + self.start_stop_sfxid = self playsound( sound_alias ); } vehicle_ghost_entering_occupants_t() { - self endon( "transmute" ); - self endon( "death" ); - self endon( "delete" ); - while ( 1 ) - { - self waittill( "enter_vehicle", player, seat ); - isdriver = seat == 0; - if ( getDvarInt( "scr_veh_driversarehidden" ) != 0 && isdriver ) - { - player ghost(); - } - occupants = self getvehoccupants(); - if ( occupants.size == 1 ) - { - self play_start_stop_sound( "tank_startup_sfx" ); - } - player thread player_change_seat_handler_t( self ); - player thread player_leave_vehicle_cleanup_t( self ); - } + self endon( "transmute" ); + self endon( "death" ); + self endon( "delete" ); + + while ( true ) + { + self waittill( "enter_vehicle", player, seat ); + + isdriver = seat == 0; + + if ( getdvarint( "scr_veh_driversarehidden" ) != 0 && isdriver ) + player ghost(); + + occupants = self getvehoccupants(); + + if ( occupants.size == 1 ) + self play_start_stop_sound( "tank_startup_sfx" ); + + player thread player_change_seat_handler_t( self ); + player thread player_leave_vehicle_cleanup_t( self ); + } } player_is_occupant_invulnerable( smeansofdeath ) { - if ( self isremotecontrolling() ) - { - return 0; - } - if ( !isDefined( level.vehicle_drivers_are_invulnerable ) ) - { - level.vehicle_drivers_are_invulnerable = 0; - } - if ( level.vehicle_drivers_are_invulnerable ) - { - invulnerable = self player_is_driver(); - } - return invulnerable; + if ( self isremotecontrolling() ) + return 0; + + if ( !isdefined( level.vehicle_drivers_are_invulnerable ) ) + level.vehicle_drivers_are_invulnerable = 0; + + invulnerable = level.vehicle_drivers_are_invulnerable && self player_is_driver(); + return invulnerable; } player_is_driver() { - if ( !isalive( self ) ) - { - return 0; - } - vehicle = self getvehicleoccupied(); - if ( isDefined( vehicle ) ) - { - seat = vehicle getoccupantseat( self ); - if ( isDefined( seat ) && seat == 0 ) - { - return 1; - } - } - return 0; + if ( !isalive( self ) ) + return false; + + vehicle = self getvehicleoccupied(); + + if ( isdefined( vehicle ) ) + { + seat = vehicle getoccupantseat( self ); + + if ( isdefined( seat ) && seat == 0 ) + return true; + } + + return false; } player_change_seat_handler_t( vehicle ) { - self endon( "disconnect" ); - self endon( "exit_vehicle" ); - while ( 1 ) - { - self waittill( "change_seat", vehicle, oldseat, newseat ); - isdriver = newseat == 0; - if ( isdriver ) - { - if ( getDvarInt( "scr_veh_driversarehidden" ) != 0 ) - { - self ghost(); - } - continue; - } - else - { - self show(); - } - } + self endon( "disconnect" ); + self endon( "exit_vehicle" ); + + while ( true ) + { + self waittill( "change_seat", vehicle, oldseat, newseat ); + + isdriver = newseat == 0; + + if ( isdriver ) + { + if ( getdvarint( "scr_veh_driversarehidden" ) != 0 ) + self ghost(); + } + else + self show(); + } } player_leave_vehicle_cleanup_t( vehicle ) { - self endon( "disconnect" ); - self waittill( "exit_vehicle" ); - currentweapon = self getcurrentweapon(); - if ( self.lastweapon != currentweapon && self.lastweapon != "none" ) - { - self switchtoweapon( self.lastweapon ); - } - self show(); + self endon( "disconnect" ); + + self waittill( "exit_vehicle" ); + + currentweapon = self getcurrentweapon(); + + if ( self.lastweapon != currentweapon && self.lastweapon != "none" ) + self switchtoweapon( self.lastweapon ); + + self show(); } vehicle_is_tank() { - if ( self.vehicletype != "sherman_mp" && self.vehicletype != "panzer4_mp" && self.vehicletype != "type97_mp" ) - { - return self.vehicletype == "t34_mp"; - } + return self.vehicletype == "sherman_mp" || self.vehicletype == "panzer4_mp" || self.vehicletype == "type97_mp" || self.vehicletype == "t34_mp"; } vehicle_record_initial_values() { - if ( !isDefined( self.initial_state ) ) - { - self.initial_state = spawnstruct(); - } - if ( isDefined( self.origin ) ) - { - self.initial_state.origin = self.origin; - } - if ( isDefined( self.angles ) ) - { - self.initial_state.angles = self.angles; - } - if ( isDefined( self.health ) ) - { - self.initial_state.health = self.health; - } - self initialize_vehicle_damage_state_data(); - return; + if ( !isdefined( self.initial_state ) ) + self.initial_state = spawnstruct(); + + if ( isdefined( self.origin ) ) + self.initial_state.origin = self.origin; + + if ( isdefined( self.angles ) ) + self.initial_state.angles = self.angles; + + if ( isdefined( self.health ) ) + self.initial_state.health = self.health; + + self initialize_vehicle_damage_state_data(); } vehicle_fireweapon_t() { - self endon( "transmute" ); - self endon( "death" ); - self endon( "delete" ); - for ( ;; ) - { - self waittill( "turret_fire", player ); - if ( isDefined( player ) && isalive( player ) && player isinvehicle() ) - { - self fireweapon(); - } - } + self endon( "transmute" ); + self endon( "death" ); + self endon( "delete" ); + + for (;;) + { + self waittill( "turret_fire", player ); + + if ( isdefined( player ) && isalive( player ) && player isinvehicle() ) + self fireweapon(); + } } vehicle_should_explode_on_cleanup() { - return getDvarInt( "scr_veh_explode_on_cleanup" ) != 0; + return getdvarint( "scr_veh_explode_on_cleanup" ) != 0; } vehicle_recycle() { - self wait_for_unnoticeable_cleanup_opportunity(); - self.recycling = 1; - self suicide(); + self wait_for_unnoticeable_cleanup_opportunity(); + self.recycling = 1; + self suicide(); } wait_for_vehicle_overturn() { - self endon( "transmute" ); - self endon( "death" ); - self endon( "delete" ); - worldup = anglesToUp( vectorScale( ( 0, 0, 1 ), 90 ) ); - overturned = 0; - while ( !overturned ) - { - if ( isDefined( self.angles ) ) - { - up = anglesToUp( self.angles ); - dot = vectordot( up, worldup ); - if ( dot <= 0 ) - { - overturned = 1; - } - } - if ( !overturned ) - { - wait 1; - } - } + self endon( "transmute" ); + self endon( "death" ); + self endon( "delete" ); + worldup = anglestoup( vectorscale( ( 0, 1, 0 ), 90.0 ) ); + overturned = 0; + + while ( !overturned ) + { + if ( isdefined( self.angles ) ) + { + up = anglestoup( self.angles ); + dot = vectordot( up, worldup ); + + if ( dot <= 0.0 ) + overturned = 1; + } + + if ( !overturned ) + wait 1.0; + } } vehicle_overturn_eject_occupants() { - self endon( "transmute" ); - self endon( "death" ); - self endon( "delete" ); - for ( ;; ) - { - self waittill( "veh_ejectoccupants" ); - if ( isDefined( level.onejectoccupants ) ) - { - [[ level.onejectoccupants ]](); - } - wait 0,25; - } + self endon( "transmute" ); + self endon( "death" ); + self endon( "delete" ); + + for (;;) + { + self waittill( "veh_ejectoccupants" ); + + if ( isdefined( level.onejectoccupants ) ) + [[ level.onejectoccupants ]](); + + wait 0.25; + } } vehicle_eject_all_occupants() { - occupants = self getvehoccupants(); - while ( isDefined( occupants ) ) - { - i = 0; - while ( i < occupants.size ) - { - if ( isDefined( occupants[ i ] ) ) - { - occupants[ i ] unlink(); - } - i++; - } - } + occupants = self getvehoccupants(); + + if ( isdefined( occupants ) ) + { + for ( i = 0; i < occupants.size; i++ ) + { + if ( isdefined( occupants[i] ) ) + occupants[i] unlink(); + } + } } vehicle_overturn_suicide() { - self endon( "transmute" ); - self endon( "death" ); - self endon( "delete" ); - self wait_for_vehicle_overturn(); - seconds = randomfloatrange( 5, 7 ); - wait seconds; - damageorigin = self.origin + vectorScale( ( 0, 0, 1 ), 25 ); - self finishvehicleradiusdamage( self, self, 32000, 32000, 32000, 0, "MOD_EXPLOSIVE", "defaultweapon_mp", damageorigin, 400, -1, ( 0, 0, 1 ), 0 ); + self endon( "transmute" ); + self endon( "death" ); + self endon( "delete" ); + self wait_for_vehicle_overturn(); + seconds = randomfloatrange( 5, 7 ); + wait( seconds ); + damageorigin = self.origin + vectorscale( ( 0, 0, 1 ), 25.0 ); + self finishvehicleradiusdamage( self, self, 32000, 32000, 32000, 0, "MOD_EXPLOSIVE", "defaultweapon_mp", damageorigin, 400, -1, ( 0, 0, 1 ), 0 ); } suicide() { - self kill_vehicle( self ); + self kill_vehicle( self ); } kill_vehicle( attacker ) { - damageorigin = self.origin + ( 0, 0, 1 ); - self finishvehicleradiusdamage( attacker, attacker, 32000, 32000, 10, 0, "MOD_EXPLOSIVE", "defaultweapon_mp", damageorigin, 400, -1, ( 0, 0, 1 ), 0 ); + damageorigin = self.origin + ( 0, 0, 1 ); + self finishvehicleradiusdamage( attacker, attacker, 32000, 32000, 10, 0, "MOD_EXPLOSIVE", "defaultweapon_mp", damageorigin, 400, -1, ( 0, 0, 1 ), 0 ); } value_with_default( preferred_value, default_value ) { - if ( isDefined( preferred_value ) ) - { - return preferred_value; - } - return default_value; + if ( isdefined( preferred_value ) ) + return preferred_value; + + return default_value; } vehicle_transmute( attacker ) { - deathorigin = self.origin; - deathangles = self.angles; - modelname = self vehgetmodel(); - vehicle_name = get_vehicle_name_key_for_damage_states( self ); - respawn_parameters = spawnstruct(); - respawn_parameters.origin = self.initial_state.origin; - respawn_parameters.angles = self.initial_state.angles; - respawn_parameters.health = self.initial_state.health; - respawn_parameters.modelname = modelname; - respawn_parameters.targetname = value_with_default( self.targetname, "" ); - respawn_parameters.vehicletype = value_with_default( self.vehicletype, "" ); - respawn_parameters.destructibledef = self.destructibledef; - vehiclewasdestroyed = !isDefined( self.recycling ); - if ( vehiclewasdestroyed || vehicle_should_explode_on_cleanup() ) - { - _spawn_explosion( deathorigin ); - if ( vehiclewasdestroyed && getDvarInt( "scr_veh_explosion_doradiusdamage" ) != 0 ) - { - explosionradius = getDvarInt( "scr_veh_explosion_radius" ); - explosionmindamage = getDvarInt( "scr_veh_explosion_mindamage" ); - explosionmaxdamage = getDvarInt( "scr_veh_explosion_maxdamage" ); - self kill_vehicle( attacker ); - self radiusdamage( deathorigin, explosionradius, explosionmaxdamage, explosionmindamage, attacker, "MOD_EXPLOSIVE", self.vehicletype + "_explosion_mp" ); - } - } - self notify( "transmute" ); - respawn_vehicle_now = 1; - if ( vehiclewasdestroyed && getDvarInt( "scr_veh_ondeath_createhusk" ) != 0 ) - { - if ( getDvarInt( "scr_veh_ondeath_usevehicleashusk" ) != 0 ) - { - husk = self; - self.is_husk = 1; - } - else - { - husk = _spawn_husk( deathorigin, deathangles, modelname ); - } - husk _init_husk( vehicle_name, respawn_parameters ); - if ( getDvarInt( "scr_veh_respawnafterhuskcleanup" ) != 0 ) - { - respawn_vehicle_now = 0; - } - } - if ( !isDefined( self.is_husk ) ) - { - self remove_vehicle_from_world(); - } - if ( getDvarInt( "scr_veh_disablerespawn" ) != 0 ) - { - respawn_vehicle_now = 0; - } - if ( respawn_vehicle_now ) - { - respawn_vehicle( respawn_parameters ); - } + deathorigin = self.origin; + deathangles = self.angles; + modelname = self vehgetmodel(); + vehicle_name = get_vehicle_name_key_for_damage_states( self ); + respawn_parameters = spawnstruct(); + respawn_parameters.origin = self.initial_state.origin; + respawn_parameters.angles = self.initial_state.angles; + respawn_parameters.health = self.initial_state.health; + respawn_parameters.modelname = modelname; + respawn_parameters.targetname = value_with_default( self.targetname, "" ); + respawn_parameters.vehicletype = value_with_default( self.vehicletype, "" ); + respawn_parameters.destructibledef = self.destructibledef; + vehiclewasdestroyed = !isdefined( self.recycling ); + + if ( vehiclewasdestroyed || vehicle_should_explode_on_cleanup() ) + { + _spawn_explosion( deathorigin ); + + if ( vehiclewasdestroyed && getdvarint( "scr_veh_explosion_doradiusdamage" ) != 0 ) + { + explosionradius = getdvarint( "scr_veh_explosion_radius" ); + explosionmindamage = getdvarint( "scr_veh_explosion_mindamage" ); + explosionmaxdamage = getdvarint( "scr_veh_explosion_maxdamage" ); + self kill_vehicle( attacker ); + self radiusdamage( deathorigin, explosionradius, explosionmaxdamage, explosionmindamage, attacker, "MOD_EXPLOSIVE", self.vehicletype + "_explosion_mp" ); + } + } + + self notify( "transmute" ); + respawn_vehicle_now = 1; + + if ( vehiclewasdestroyed && getdvarint( "scr_veh_ondeath_createhusk" ) != 0 ) + { + if ( getdvarint( "scr_veh_ondeath_usevehicleashusk" ) != 0 ) + { + husk = self; + self.is_husk = 1; + } + else + husk = _spawn_husk( deathorigin, deathangles, modelname ); + + husk _init_husk( vehicle_name, respawn_parameters ); + + if ( getdvarint( "scr_veh_respawnafterhuskcleanup" ) != 0 ) + respawn_vehicle_now = 0; + } + + if ( !isdefined( self.is_husk ) ) + self remove_vehicle_from_world(); + + if ( getdvarint( "scr_veh_disablerespawn" ) != 0 ) + respawn_vehicle_now = 0; + + if ( respawn_vehicle_now ) + respawn_vehicle( respawn_parameters ); } respawn_vehicle( respawn_parameters ) { - mintime = getDvarInt( "scr_veh_respawntimemin" ); - maxtime = getDvarInt( "scr_veh_respawntimemax" ); - seconds = randomfloatrange( mintime, maxtime ); - wait seconds; - wait_until_vehicle_position_wont_telefrag( respawn_parameters.origin ); - if ( !manage_vehicles() ) - { + mintime = getdvarint( "scr_veh_respawntimemin" ); + maxtime = getdvarint( "scr_veh_respawntimemax" ); + seconds = randomfloatrange( mintime, maxtime ); + wait( seconds ); + wait_until_vehicle_position_wont_telefrag( respawn_parameters.origin ); + + if ( !manage_vehicles() ) + { /# - iprintln( "Vehicle can't respawn because MAX_VEHICLES has been reached and none of the vehicles could be cleaned up." ); + iprintln( "Vehicle can't respawn because MAX_VEHICLES has been reached and none of the vehicles could be cleaned up." ); #/ - } - else - { - if ( isDefined( respawn_parameters.destructibledef ) ) - { - vehicle = spawnvehicle( respawn_parameters.modelname, respawn_parameters.targetname, respawn_parameters.vehicletype, respawn_parameters.origin, respawn_parameters.angles, respawn_parameters.destructibledef ); - } - else - { - vehicle = spawnvehicle( respawn_parameters.modelname, respawn_parameters.targetname, respawn_parameters.vehicletype, respawn_parameters.origin, respawn_parameters.angles ); - } - vehicle.vehicletype = respawn_parameters.vehicletype; - vehicle.destructibledef = respawn_parameters.destructibledef; - vehicle.health = respawn_parameters.health; - vehicle init_vehicle(); - vehicle vehicle_telefrag_griefers_at_position( respawn_parameters.origin ); - } + } + else + { + if ( isdefined( respawn_parameters.destructibledef ) ) + vehicle = spawnvehicle( respawn_parameters.modelname, respawn_parameters.targetname, respawn_parameters.vehicletype, respawn_parameters.origin, respawn_parameters.angles, respawn_parameters.destructibledef ); + else + vehicle = spawnvehicle( respawn_parameters.modelname, respawn_parameters.targetname, respawn_parameters.vehicletype, respawn_parameters.origin, respawn_parameters.angles ); + + vehicle.vehicletype = respawn_parameters.vehicletype; + vehicle.destructibledef = respawn_parameters.destructibledef; + vehicle.health = respawn_parameters.health; + vehicle init_vehicle(); + vehicle vehicle_telefrag_griefers_at_position( respawn_parameters.origin ); + } } remove_vehicle_from_world() { - self notify( "removed" ); - if ( isDefined( self.original_vehicle ) ) - { - if ( !isDefined( self.permanentlyremoved ) ) - { - self.permanentlyremoved = 1; - self thread hide_vehicle(); - } - return 0; - } - else - { - self _delete_entity(); - return 1; - } + self notify( "removed" ); + + if ( isdefined( self.original_vehicle ) ) + { + if ( !isdefined( self.permanentlyremoved ) ) + { + self.permanentlyremoved = 1; + self thread hide_vehicle(); + } + + return false; + } + else + { + self _delete_entity(); + return true; + } } _delete_entity() { /# + #/ - self delete(); + self delete(); } hide_vehicle() { - under_the_world = ( self.origin[ 0 ], self.origin[ 1 ], self.origin[ 2 ] - 10000 ); - self.origin = under_the_world; - wait 0,1; - self hide(); - self notify( "hidden_permanently" ); + under_the_world = ( self.origin[0], self.origin[1], self.origin[2] - 10000 ); + self.origin = under_the_world; + wait 0.1; + self hide(); + self notify( "hidden_permanently" ); } wait_for_unnoticeable_cleanup_opportunity() { - maxpreventdistancefeet = getDvarInt( "scr_veh_disappear_maxpreventdistancefeet" ); - maxpreventvisibilityfeet = getDvarInt( "scr_veh_disappear_maxpreventvisibilityfeet" ); - maxpreventdistanceinchessq = 144 * maxpreventdistancefeet * maxpreventdistancefeet; - maxpreventvisibilityinchessq = 144 * maxpreventvisibilityfeet * maxpreventvisibilityfeet; - maxsecondstowait = getDvarFloat( "scr_veh_disappear_maxwaittime" ); - iterationwaitseconds = 1; - secondswaited = 0; - while ( secondswaited < maxsecondstowait ) - { - players_s = get_all_alive_players_s(); - oktocleanup = 1; - j = 0; - while ( j < players_s.a.size && oktocleanup ) - { - player = players_s.a[ j ]; - distinchessq = distancesquared( self.origin, player.origin ); - if ( distinchessq < maxpreventdistanceinchessq ) - { - self cleanup_debug_print( "(" + ( maxsecondstowait - secondswaited ) + "s) Player too close: " + distinchessq + "<" + maxpreventdistanceinchessq ); - oktocleanup = 0; - j++; - continue; - } - else - { - if ( distinchessq < maxpreventvisibilityinchessq ) - { - vehiclevisibilityfromplayer = self sightconetrace( player.origin, player, anglesToForward( player.angles ) ); - if ( vehiclevisibilityfromplayer > 0 ) - { - self cleanup_debug_print( "(" + ( maxsecondstowait - secondswaited ) + "s) Player can see" ); - oktocleanup = 0; - } - } - } - j++; - } - if ( oktocleanup ) - { - return; - } - wait iterationwaitseconds; - secondswaited += iterationwaitseconds; - } + maxpreventdistancefeet = getdvarint( "scr_veh_disappear_maxpreventdistancefeet" ); + maxpreventvisibilityfeet = getdvarint( "scr_veh_disappear_maxpreventvisibilityfeet" ); + maxpreventdistanceinchessq = 144 * maxpreventdistancefeet * maxpreventdistancefeet; + maxpreventvisibilityinchessq = 144 * maxpreventvisibilityfeet * maxpreventvisibilityfeet; + maxsecondstowait = getdvarfloat( "scr_veh_disappear_maxwaittime" ); + iterationwaitseconds = 1.0; + + for ( secondswaited = 0.0; secondswaited < maxsecondstowait; secondswaited += iterationwaitseconds ) + { + players_s = get_all_alive_players_s(); + oktocleanup = 1; + + for ( j = 0; j < players_s.a.size && oktocleanup; j++ ) + { + player = players_s.a[j]; + distinchessq = distancesquared( self.origin, player.origin ); + + if ( distinchessq < maxpreventdistanceinchessq ) + { + self cleanup_debug_print( "(" + maxsecondstowait - secondswaited + "s) Player too close: " + distinchessq + "<" + maxpreventdistanceinchessq ); + oktocleanup = 0; + continue; + } + + if ( distinchessq < maxpreventvisibilityinchessq ) + { + vehiclevisibilityfromplayer = self sightconetrace( player.origin, player, anglestoforward( player.angles ) ); + + if ( vehiclevisibilityfromplayer > 0 ) + { + self cleanup_debug_print( "(" + maxsecondstowait - secondswaited + "s) Player can see" ); + oktocleanup = 0; + } + } + } + + if ( oktocleanup ) + return; + + wait( iterationwaitseconds ); + } } wait_until_vehicle_position_wont_telefrag( position ) { - maxiterations = getDvarInt( "scr_veh_respawnwait_maxiterations" ); - iterationwaitseconds = getDvarInt( "scr_veh_respawnwait_iterationwaitseconds" ); - i = 0; - while ( i < maxiterations ) - { - if ( !vehicle_position_will_telefrag( position ) ) - { - return; - } - wait iterationwaitseconds; - i++; - } + maxiterations = getdvarint( "scr_veh_respawnwait_maxiterations" ); + iterationwaitseconds = getdvarint( "scr_veh_respawnwait_iterationwaitseconds" ); + + for ( i = 0; i < maxiterations; i++ ) + { + if ( !vehicle_position_will_telefrag( position ) ) + return; + + wait( iterationwaitseconds ); + } } vehicle_position_will_telefrag( position ) { - players_s = get_all_alive_players_s(); - i = 0; - while ( i < players_s.a.size ) - { - if ( players_s.a[ i ] player_vehicle_position_will_telefrag( position ) ) - { - return 1; - } - i++; - } - return 0; + players_s = get_all_alive_players_s(); + + for ( i = 0; i < players_s.a.size; i++ ) + { + if ( players_s.a[i] player_vehicle_position_will_telefrag( position ) ) + return true; + } + + return false; } vehicle_telefrag_griefers_at_position( position ) { - attacker = self; - inflictor = self; - players_s = get_all_alive_players_s(); - i = 0; - while ( i < players_s.a.size ) - { - player = players_s.a[ i ]; - if ( player player_vehicle_position_will_telefrag( position ) ) - { - player dodamage( 20000, player.origin + ( 0, 0, 1 ), attacker, inflictor, "none" ); - } - i++; - } + attacker = self; + inflictor = self; + players_s = get_all_alive_players_s(); + + for ( i = 0; i < players_s.a.size; i++ ) + { + player = players_s.a[i]; + + if ( player player_vehicle_position_will_telefrag( position ) ) + player dodamage( 20000, player.origin + ( 0, 0, 1 ), attacker, inflictor, "none" ); + } } player_vehicle_position_will_telefrag( position ) { - distanceinches = 240; - mindistinchessq = distanceinches * distanceinches; - distinchessq = distancesquared( self.origin, position ); - return distinchessq < mindistinchessq; + distanceinches = 240; + mindistinchessq = distanceinches * distanceinches; + distinchessq = distancesquared( self.origin, position ); + return distinchessq < mindistinchessq; } vehicle_recycle_spawner_t() { - self endon( "delete" ); - self waittill( "death", attacker ); - if ( isDefined( self ) ) - { - self vehicle_transmute( attacker ); - } + self endon( "delete" ); + + self waittill( "death", attacker ); + + if ( isdefined( self ) ) + self vehicle_transmute( attacker ); } vehicle_play_explosion_sound() { - self playsound( "car_explo_large" ); + self playsound( "car_explo_large" ); } vehicle_damage_t() { - self endon( "delete" ); - self endon( "removed" ); - for ( ;; ) - { - self waittill( "damage", damage, attacker ); - players = get_players(); - i = 0; - while ( i < players.size ) - { - if ( !isalive( players[ i ] ) ) - { - i++; - continue; - } - else vehicle = players[ i ] getvehicleoccupied(); - if ( isDefined( vehicle ) && self == vehicle && players[ i ] player_is_driver() ) - { - if ( damage > 0 ) - { - earthquake( damage / 400, 1, players[ i ].origin, 512, players[ i ] ); - } - if ( damage > 100 ) - { + self endon( "delete" ); + self endon( "removed" ); + + for (;;) + { + self waittill( "damage", damage, attacker ); + + players = get_players(); + + for ( i = 0; i < players.size; i++ ) + { + if ( !isalive( players[i] ) ) + continue; + + vehicle = players[i] getvehicleoccupied(); + + if ( isdefined( vehicle ) && self == vehicle && players[i] player_is_driver() ) + { + if ( damage > 0 ) + earthquake( damage / 400, 1.0, players[i].origin, 512, players[i] ); + + if ( damage > 100.0 ) + { /# - println( "Playing heavy rumble." ); + println( "Playing heavy rumble." ); #/ - players[ i ] playrumbleonentity( "tank_damage_heavy_mp" ); - i++; - continue; - } - else - { - if ( damage > 10 ) - { + players[i] playrumbleonentity( "tank_damage_heavy_mp" ); + continue; + } + + if ( damage > 10.0 ) + { /# - println( "Playing light rumble." ); + println( "Playing light rumble." ); #/ - players[ i ] playrumbleonentity( "tank_damage_light_mp" ); - } - } - } - i++; - } - update_damage_effects( self, attacker ); - if ( self.health <= 0 ) - { - return; - } - } + players[i] playrumbleonentity( "tank_damage_light_mp" ); + } + } + } + + update_damage_effects( self, attacker ); + + if ( self.health <= 0 ) + return; + } } _spawn_husk( origin, angles, modelname ) { - husk = spawn( "script_model", origin ); - husk.angles = angles; - husk setmodel( modelname ); - husk.health = 1; - husk setcandamage( 0 ); - return husk; + husk = spawn( "script_model", origin ); + husk.angles = angles; + husk setmodel( modelname ); + husk.health = 1; + husk setcandamage( 0 ); + return husk; } is_vehicle() { - return isDefined( self.vehicletype ); + return isdefined( self.vehicletype ); } swap_to_husk_model() { - if ( isDefined( self.vehicletype ) ) - { - husk_model = level.veh_husk_models[ self.vehicletype ]; - if ( isDefined( husk_model ) ) - { - self setmodel( husk_model ); - } - } + if ( isdefined( self.vehicletype ) ) + { + husk_model = level.veh_husk_models[self.vehicletype]; + + if ( isdefined( husk_model ) ) + self setmodel( husk_model ); + } } _init_husk( vehicle_name, respawn_parameters ) { - self swap_to_husk_model(); - effects = level.vehicles_husk_effects[ vehicle_name ]; - self play_vehicle_effects( effects ); - self.respawn_parameters = respawn_parameters; - forcepointvariance = getDvarInt( "scr_veh_explosion_husk_forcepointvariance" ); - horzvelocityvariance = getDvarInt( "scr_veh_explosion_husk_horzvelocityvariance" ); - vertvelocitymin = getDvarInt( "scr_veh_explosion_husk_vertvelocitymin" ); - vertvelocitymax = getDvarInt( "scr_veh_explosion_husk_vertvelocitymax" ); - forcepointx = randomfloatrange( 0 - forcepointvariance, forcepointvariance ); - forcepointy = randomfloatrange( 0 - forcepointvariance, forcepointvariance ); - forcepoint = ( forcepointx, forcepointy, 0 ); - forcepoint += self.origin; - initialvelocityx = randomfloatrange( 0 - horzvelocityvariance, horzvelocityvariance ); - initialvelocityy = randomfloatrange( 0 - horzvelocityvariance, horzvelocityvariance ); - initialvelocityz = randomfloatrange( vertvelocitymin, vertvelocitymax ); - initialvelocity = ( initialvelocityx, initialvelocityy, initialvelocityz ); - if ( self is_vehicle() ) - { - self launchvehicle( initialvelocity, forcepoint ); - } - else - { - self physicslaunch( forcepoint, initialvelocity ); - } - self thread husk_cleanup_t(); + self swap_to_husk_model(); + effects = level.vehicles_husk_effects[vehicle_name]; + self play_vehicle_effects( effects ); + self.respawn_parameters = respawn_parameters; + forcepointvariance = getdvarint( "scr_veh_explosion_husk_forcepointvariance" ); + horzvelocityvariance = getdvarint( "scr_veh_explosion_husk_horzvelocityvariance" ); + vertvelocitymin = getdvarint( "scr_veh_explosion_husk_vertvelocitymin" ); + vertvelocitymax = getdvarint( "scr_veh_explosion_husk_vertvelocitymax" ); + forcepointx = randomfloatrange( 0 - forcepointvariance, forcepointvariance ); + forcepointy = randomfloatrange( 0 - forcepointvariance, forcepointvariance ); + forcepoint = ( forcepointx, forcepointy, 0 ); + forcepoint += self.origin; + initialvelocityx = randomfloatrange( 0 - horzvelocityvariance, horzvelocityvariance ); + initialvelocityy = randomfloatrange( 0 - horzvelocityvariance, horzvelocityvariance ); + initialvelocityz = randomfloatrange( vertvelocitymin, vertvelocitymax ); + initialvelocity = ( initialvelocityx, initialvelocityy, initialvelocityz ); + + if ( self is_vehicle() ) + self launchvehicle( initialvelocity, forcepoint ); + else + self physicslaunch( forcepoint, initialvelocity ); + + self thread husk_cleanup_t(); /# - self thread cleanup_debug_print_t(); + self thread cleanup_debug_print_t(); #/ } husk_cleanup_t() { - self endon( "death" ); - self endon( "delete" ); - self endon( "hidden_permanently" ); - respawn_parameters = self.respawn_parameters; - self do_dead_cleanup_wait( "Husk Cleanup Test" ); - self wait_for_unnoticeable_cleanup_opportunity(); - self thread final_husk_cleanup_t( respawn_parameters ); + self endon( "death" ); + self endon( "delete" ); + self endon( "hidden_permanently" ); + respawn_parameters = self.respawn_parameters; + self do_dead_cleanup_wait( "Husk Cleanup Test" ); + self wait_for_unnoticeable_cleanup_opportunity(); + self thread final_husk_cleanup_t( respawn_parameters ); } final_husk_cleanup_t( respawn_parameters ) { - self husk_do_cleanup(); - if ( getDvarInt( "scr_veh_respawnafterhuskcleanup" ) != 0 ) - { - if ( getDvarInt( "scr_veh_disablerespawn" ) == 0 ) - { - respawn_vehicle( respawn_parameters ); - } - } + self husk_do_cleanup(); + + if ( getdvarint( "scr_veh_respawnafterhuskcleanup" ) != 0 ) + { + if ( getdvarint( "scr_veh_disablerespawn" ) == 0 ) + respawn_vehicle( respawn_parameters ); + } } husk_do_cleanup() { - self _spawn_explosion( self.origin ); - if ( self is_vehicle() ) - { - return self remove_vehicle_from_world(); - } - else - { - self _delete_entity(); - return 1; - } + self _spawn_explosion( self.origin ); + + if ( self is_vehicle() ) + return self remove_vehicle_from_world(); + else + { + self _delete_entity(); + return 1; + } } _spawn_explosion( origin ) { - if ( getDvarInt( "scr_veh_explosion_spawnfx" ) == 0 ) - { - return; - } - if ( isDefined( level.vehicle_explosion_effect ) ) - { - forward = ( 0, 0, 1 ); - rot = randomfloat( 360 ); - up = ( cos( rot ), sin( rot ), 0 ); - playfx( level.vehicle_explosion_effect, origin, forward, up ); - } - thread _play_sound_in_space( "vehicle_explo", origin ); + if ( getdvarint( "scr_veh_explosion_spawnfx" ) == 0 ) + return; + + if ( isdefined( level.vehicle_explosion_effect ) ) + { + forward = ( 0, 0, 1 ); + rot = randomfloat( 360 ); + up = ( cos( rot ), sin( rot ), 0 ); + playfx( level.vehicle_explosion_effect, origin, forward, up ); + } + + thread _play_sound_in_space( "vehicle_explo", origin ); } _play_sound_in_space( soundeffectname, origin ) { - org = spawn( "script_origin", origin ); - org.origin = origin; - org playsound( soundeffectname ); - wait 10; - org delete(); + org = spawn( "script_origin", origin ); + org.origin = origin; + org playsound( soundeffectname ); + wait 10; + org delete(); } vehicle_get_occupant_team() { - occupants = self getvehoccupants(); - if ( occupants.size != 0 ) - { - occupant = occupants[ 0 ]; - if ( isplayer( occupant ) ) - { - return occupant.team; - } - } - return "free"; + occupants = self getvehoccupants(); + + if ( occupants.size != 0 ) + { + occupant = occupants[0]; + + if ( isplayer( occupant ) ) + return occupant.team; + } + + return "free"; } vehicledeathwaiter() { - self notify( "vehicleDeathWaiter" ); - self endon( "vehicleDeathWaiter" ); - self endon( "disconnect" ); - while ( 1 ) - { - self waittill( "vehicle_death", vehicle_died ); - if ( vehicle_died ) - { - self.diedonvehicle = 1; - continue; - } - else - { - self.diedonturret = 1; - } - } + self notify( "vehicleDeathWaiter" ); + self endon( "vehicleDeathWaiter" ); + self endon( "disconnect" ); + + while ( true ) + { + self waittill( "vehicle_death", vehicle_died ); + + if ( vehicle_died ) + self.diedonvehicle = 1; + else + self.diedonturret = 1; + } } turretdeathwaiter() { + } vehicle_kill_disconnect_paths_forever() { - self notify( "kill_disconnect_paths_forever" ); + self notify( "kill_disconnect_paths_forever" ); } vehicle_disconnect_paths() { - self endon( "death" ); - self endon( "kill_disconnect_paths_forever" ); - if ( isDefined( self.script_disconnectpaths ) && !self.script_disconnectpaths ) - { - self.dontdisconnectpaths = 1; - return; - } - wait randomfloat( 1 ); - while ( isDefined( self ) ) - { - while ( self getspeed() < 1 ) - { - if ( !isDefined( self.dontdisconnectpaths ) ) - { - self disconnectpaths(); - } - self notify( "speed_zero_path_disconnect" ); - while ( self getspeed() < 1 ) - { - wait 0,05; - } - } - self connectpaths(); - wait 1; - } + self endon( "death" ); + self endon( "kill_disconnect_paths_forever" ); + + if ( isdefined( self.script_disconnectpaths ) && !self.script_disconnectpaths ) + { + self.dontdisconnectpaths = 1; + return; + } + + wait( randomfloat( 1 ) ); + + while ( isdefined( self ) ) + { + if ( self getspeed() < 1 ) + { + if ( !isdefined( self.dontdisconnectpaths ) ) + self disconnectpaths(); + + self notify( "speed_zero_path_disconnect" ); + + while ( self getspeed() < 1 ) + wait 0.05; + } + + self connectpaths(); + wait 1; + } } follow_path( node ) { - self endon( "death" ); + self endon( "death" ); /# - assert( isDefined( node ), "vehicle_path() called without a path" ); + assert( isdefined( node ), "vehicle_path() called without a path" ); #/ - self notify( "newpath" ); - if ( isDefined( node ) ) - { - self.attachedpath = node; - } - pathstart = self.attachedpath; - self.currentnode = self.attachedpath; - if ( !isDefined( pathstart ) ) - { - return; - } - self attachpath( pathstart ); - self startpath(); - self endon( "newpath" ); - nextpoint = pathstart; - while ( isDefined( nextpoint ) ) - { - self waittill( "reached_node", nextpoint ); - self.currentnode = nextpoint; - nextpoint notify( "trigger" ); - if ( isDefined( nextpoint.script_noteworthy ) ) - { - self notify( nextpoint.script_noteworthy ); - self notify( "noteworthy" ); - } - waittillframeend; - } + self notify( "newpath" ); + + if ( isdefined( node ) ) + self.attachedpath = node; + + pathstart = self.attachedpath; + self.currentnode = self.attachedpath; + + if ( !isdefined( pathstart ) ) + return; + + self attachpath( pathstart ); + self startpath(); + self endon( "newpath" ); + nextpoint = pathstart; + + while ( isdefined( nextpoint ) ) + { + self waittill( "reached_node", nextpoint ); + + self.currentnode = nextpoint; + nextpoint notify( "trigger", self ); + + if ( isdefined( nextpoint.script_noteworthy ) ) + { + self notify( nextpoint.script_noteworthy ); + self notify( "noteworthy", nextpoint.script_noteworthy, nextpoint ); + } + + waittillframeend; + } } diff --git a/Multiplayer Core/patch_mp/maps/mp/animscripts/dog_combat.gsc b/Multiplayer Core/patch_mp/maps/mp/animscripts/dog_combat.gsc index 54d4f91..655371a 100644 --- a/Multiplayer Core/patch_mp/maps/mp/animscripts/dog_combat.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/animscripts/dog_combat.gsc @@ -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; } diff --git a/Multiplayer Core/patch_mp/maps/mp/animscripts/dog_init.gsc b/Multiplayer Core/patch_mp/maps/mp/animscripts/dog_init.gsc index c8439f7..26af7b0 100644 --- a/Multiplayer Core/patch_mp/maps/mp/animscripts/dog_init.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/animscripts/dog_init.gsc @@ -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; + } } diff --git a/Multiplayer Core/patch_mp/maps/mp/bots/_bot.gsc b/Multiplayer Core/patch_mp/maps/mp/bots/_bot.gsc index d3e82a5..2b08813 100644 --- a/Multiplayer Core/patch_mp/maps/mp/bots/_bot.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/bots/_bot.gsc @@ -1,2583 +1,2443 @@ -#include maps/mp/gametypes/_dev; -#include maps/mp/killstreaks/_killstreakrules; -#include maps/mp/killstreaks/_killstreaks; -#include maps/mp/bots/_bot_conf; -#include maps/mp/bots/_bot_hq; -#include maps/mp/bots/_bot_koth; -#include maps/mp/bots/_bot_dom; -#include maps/mp/bots/_bot_dem; -#include maps/mp/bots/_bot_ctf; -#include maps/mp/bots/_bot; -#include maps/mp/killstreaks/_radar; -#include maps/mp/teams/_teams; -#include maps/mp/gametypes/_weapons; -#include maps/mp/gametypes/_rank; -#include maps/mp/bots/_bot_combat; -#include maps/mp/bots/_bot_loadout; -#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\bots\_bot_loadout; +#include maps\mp\bots\_bot_combat; +#include maps\mp\gametypes\_rank; +#include maps\mp\gametypes\_weapons; +#include maps\mp\teams\_teams; +#include maps\mp\killstreaks\_radar; +#include maps\mp\bots\_bot; +#include maps\mp\bots\_bot_ctf; +#include maps\mp\bots\_bot_dem; +#include maps\mp\bots\_bot_dom; +#include maps\mp\bots\_bot_koth; +#include maps\mp\bots\_bot_hq; +#include maps\mp\bots\_bot_conf; +#include maps\mp\killstreaks\_killstreaks; +#include maps\mp\killstreaks\_killstreakrules; +#include maps\mp\gametypes\_dev; -init() //checked matches cerberus output +init() { - /* /# - level thread bot_system_devgui_think(); + level thread bot_system_devgui_think(); #/ - */ - level thread maps/mp/bots/_bot_loadout::init(); - if ( !bot_gametype_allowed() ) - { - return; - } - if ( level.rankedmatch && !is_bot_ranked_match() ) - { - return; - } - bot_friends = getDvarInt( "bot_friends" ); - bot_enemies = getDvarInt( "bot_enemies" ); - if ( bot_friends <= 0 && bot_enemies <= 0 ) - { - return; - } - bot_wait_for_host(); - bot_set_difficulty(); - if ( is_bot_comp_stomp() ) - { - team = bot_choose_comp_stomp_team(); - level thread bot_comp_stomp_think( team ); - } - else if ( is_bot_ranked_match() ) - { - level thread bot_ranked_think(); - } - else - { - level thread bot_local_think(); - } + level thread maps\mp\bots\_bot_loadout::init(); + + if ( !bot_gametype_allowed() ) + return; + + if ( level.rankedmatch && !is_bot_ranked_match() ) + return; + + bot_friends = getdvarint( "bot_friends" ); + bot_enemies = getdvarint( "bot_enemies" ); + + if ( bot_friends <= 0 && bot_enemies <= 0 ) + return; + + bot_wait_for_host(); + bot_set_difficulty(); + + if ( is_bot_comp_stomp() ) + { + team = bot_choose_comp_stomp_team(); + level thread bot_comp_stomp_think( team ); + } + else if ( is_bot_ranked_match() ) + level thread bot_ranked_think(); + else + level thread bot_local_think(); } -spawn_bot( team ) //checked matches cerberus output +spawn_bot( team ) { - bot = addtestclient(); - if ( isDefined( bot ) ) - { - bot.pers[ "isBot" ] = 1; - if ( team != "autoassign" ) - { - bot.pers[ "team" ] = team; - } - bot thread bot_spawn_think( team ); - return 1; - } - return 0; + bot = addtestclient(); + + if ( isdefined( bot ) ) + { + bot.pers["isBot"] = 1; + + if ( team != "autoassign" ) + bot.pers["team"] = team; + + bot thread bot_spawn_think( team ); + return true; + } + + return false; } -getenemyteamwithlowestplayercount( player_team ) //checked partially changed to match cerberus output did not use foreach with continue to prevent infinite loop due to continue +getenemyteamwithlowestplayercount( player_team ) { - counts = []; - foreach ( team in level.teams ) - { - counts[ team ] = 0; - } - i = 0; - players = get_players(); - while ( i < players.size ) - { - if ( !isDefined( players[ i ].team ) ) - { - i++; - continue; - } - if ( !isDefined( counts[ players[ i ].team ] ) ) - { - i++; - continue; - } - counts[ players[ i ].team ]++; - i++; - } - count = 999999; - enemy_team = player_team; - foreach ( team in level.teams ) - { - if ( team == player_team ) - { - } - else if ( team == "spectator" ) - { - } - else if ( counts[ team ] < count ) - { - enemy_team = team; - count = counts[ team ]; - } - } - return enemy_team; + counts = []; + + foreach ( team in level.teams ) + counts[team] = 0; + + foreach ( player in level.players ) + { + if ( !isdefined( player.team ) ) + continue; + + if ( !isdefined( counts[player.team] ) ) + continue; + + counts[player.team]++; + } + + count = 999999; + enemy_team = player_team; + + foreach ( team in level.teams ) + { + if ( team == player_team ) + continue; + + if ( team == "spectator" ) + continue; + + if ( counts[team] < count ) + { + enemy_team = team; + count = counts[team]; + } + } + + return enemy_team; } -getenemyteamwithgreatestbotcount( player_team ) //checked partially changed to match cerberus output did not use foreach with continue to prevent infinite loop due to continue +getenemyteamwithgreatestbotcount( player_team ) { - counts = []; - foreach ( team in level.teams ) - { - counts[ team ] = 0; - } - i = 0; - players = get_players(); - while ( i < players.size ) - { - if ( !isDefined( players[ i ].team ) ) - { - i++; - continue; - } - if ( !isDefined( counts[ players[ i ].team ] ) ) - { - i++; - continue; - } - if ( !players[ i ] maps/mp/_utility::is_bot() ) - { - i++; - continue; - } - counts[ players[ i ].team ]++; - i++; - } - count = -1; - enemy_team = undefined; - foreach ( team in level.teams ) - { - if ( team == player_team ) - { - } - else if ( team == "spectator" ) - { - } - else if ( counts[ team ] > count ) - { - enemy_team = team; - count = counts[ team ]; - } - } - return enemy_team; + counts = []; + + foreach ( team in level.teams ) + counts[team] = 0; + + foreach ( player in level.players ) + { + if ( !isdefined( player.team ) ) + continue; + + if ( !isdefined( counts[player.team] ) ) + continue; + + if ( !player is_bot() ) + continue; + + counts[player.team]++; + } + + count = -1; + enemy_team = undefined; + + foreach ( team in level.teams ) + { + if ( team == player_team ) + continue; + + if ( team == "spectator" ) + continue; + + if ( counts[team] > count ) + { + enemy_team = team; + count = counts[team]; + } + } + + return enemy_team; } -bot_wait_for_host() //checked does not match cerberus output did not change +bot_wait_for_host() { - host = gethostplayerforbots(); - while ( !isDefined( host ) ) - { - wait 0.25; - host = gethostplayerforbots(); - } - if ( level.prematchperiod > 0 && level.inprematchperiod == 1 ) - { - wait 1; - } + for ( host = gethostplayerforbots(); !isdefined( host ); host = gethostplayerforbots() ) + wait 0.25; + + if ( level.prematchperiod > 0 && level.inprematchperiod == 1 ) + wait 1; } -bot_count_humans( team ) //checked partially changed to match cerberus output did not use foreach with continue to prevent infinite loop due to continue +bot_count_humans( team ) { - players = get_players(); - count = 0; - i = 0; - while ( i < players.size ) - { - if ( players[ i ] maps/mp/_utility::is_bot() ) - { - i++; - continue; - } - if ( isDefined( team ) ) - { - if ( getassignedteam( players[ i ] ) == team ) - { - count++; - } - i++; - continue; - } - count++; - i++; - } - return count; + players = get_players(); + count = 0; + + foreach ( player in players ) + { + if ( player is_bot() ) + continue; + + if ( isdefined( team ) ) + { + if ( getassignedteam( player ) == team ) + count++; + + continue; + } + + count++; + } + + return count; } -bot_count_bots( team ) //checked partially changed to match cerberus output did not use foreach with continue to prevent infinite loop due to continue +bot_count_bots( team ) { - players = get_players(); - count = 0; - i = 0; - while ( i < players.size ) - { - if ( !players[ i ] maps/mp/_utility::is_bot() ) - { - i++; - continue; - } - if ( isDefined( team ) ) - { - if ( isDefined( players[ i ].team ) && players[ i ].team == team ) - { - count++; - } - i++; - continue; - } - count++; - i++; - } - return count; + players = get_players(); + count = 0; + + foreach ( player in players ) + { + if ( !player is_bot() ) + continue; + + if ( isdefined( team ) ) + { + if ( isdefined( player.team ) && player.team == team ) + count++; + + continue; + } + + count++; + } + + return count; } -bot_count_enemy_bots( friend_team ) //checked partially changed to match cerberus output did not use foreach with continue to prevent infinite loop due to continue +bot_count_enemy_bots( friend_team ) { - if ( !level.teambased ) - { - return bot_count_bots(); - } - enemies = 0; - foreach ( team in level.teams ) - { - if ( team == friend_team ) - { - } - else - { - enemies += bot_count_bots( team ); - } - } - return enemies; + if ( !level.teambased ) + return bot_count_bots(); + + enemies = 0; + + foreach ( team in level.teams ) + { + if ( team == friend_team ) + continue; + + enemies += bot_count_bots( team ); + } + + return enemies; } -bot_choose_comp_stomp_team() //checked matches cerberus output +bot_choose_comp_stomp_team() { - host = gethostplayerforbots(); - /* + host = gethostplayerforbots(); /# - assert( isDefined( host ) ); + assert( isdefined( host ) ); #/ - */ - teamkeys = getarraykeys( level.teams ); - /* + teamkeys = getarraykeys( level.teams ); /# - assert( teamkeys.size == 2 ); + assert( teamkeys.size == 2 ); #/ - */ - enemy_team = host.pers[ "team" ]; - /* + enemy_team = host.pers["team"]; /# - if ( isDefined( enemy_team ) ) - { - assert( enemy_team != "spectator" ); - } + assert( isdefined( enemy_team ) && enemy_team != "spectator" ); #/ - */ - return getotherteam( enemy_team ); + return getotherteam( enemy_team ); } -bot_comp_stomp_think( team ) //checked partially changed to match cerberus output +bot_comp_stomp_think( team ) { - for ( ;; ) - { - humans = bot_count_humans(); - bots = bot_count_bots(); - if ( humans == bots ) - { - } - else if ( bots < humans ) - { - spawn_bot( team ); - } - if ( bots > humans ) - { - bot_comp_stomp_remove( team ); - } - wait 1; - } - wait 3; + for (;;) + { + for (;;) + { + humans = bot_count_humans(); + bots = bot_count_bots(); + + if ( humans == bots ) + break; + + if ( bots < humans ) + spawn_bot( team ); + + if ( bots > humans ) + bot_comp_stomp_remove( team ); + + wait 1; + } + + wait 3; + } } -bot_comp_stomp_remove( team ) //checked partially changed to match cerberus output did not use foreach with continue to prevent infinite loop due to continue +bot_comp_stomp_remove( team ) { - players = get_players(); - bots = []; - remove = undefined; - i = 0; - while ( i < players.size ) - { - if ( !isDefined( players[ i ].team ) ) - { - i++; - continue; - } - if ( players[ i ] maps/mp/_utility::is_bot() ) - { - if ( level.teambased ) - { - if ( players[ i ].team == team ) - { - bots[ bots.size ] = players[ i ]; - } - i++; - continue; - } - bots[ bots.size ] = players[ i ]; - } - i++; - } - if ( !bots.size ) - { - return; - } - foreach ( bot in bots ) - { - if ( !bot maps/mp/bots/_bot_combat::bot_has_enemy() ) - { - remove = bot; - break; - } - } - if ( !isDefined( remove ) ) - { - remove = random( bots ); - } - remove botleavegame(); + players = get_players(); + bots = []; + remove = undefined; + + foreach ( player in players ) + { + if ( !isdefined( player.team ) ) + continue; + + if ( player is_bot() ) + { + if ( level.teambased ) + { + if ( player.team == team ) + bots[bots.size] = player; + + continue; + } + + bots[bots.size] = player; + } + } + + if ( !bots.size ) + return; + + foreach ( bot in bots ) + { + if ( !bot maps\mp\bots\_bot_combat::bot_has_enemy() ) + { + remove = bot; + break; + } + } + + if ( !isdefined( remove ) ) + remove = random( bots ); + + remove botleavegame(); } -bot_ranked_remove() //checked changed to match cerberus output +bot_ranked_remove() { - if ( !level.teambased ) - { - bot_comp_stomp_remove(); - return; - } - high = -1; - highest_team = undefined; - foreach ( team in level.teams ) - { - count = countplayers( team ); - if ( count > high ) - { - high = count; - highest_team = team; - } - } - bot_comp_stomp_remove( highest_team ); + if ( !level.teambased ) + { + bot_comp_stomp_remove(); + return; + } + + high = -1; + highest_team = undefined; + + foreach ( team in level.teams ) + { + count = countplayers( team ); + + if ( count > high ) + { + high = count; + highest_team = team; + } + } + + bot_comp_stomp_remove( highest_team ); } -bot_ranked_count( team ) //checked changed to match cerberus output +bot_ranked_count( team ) { - count = countplayers( team ); - if ( count < 6 ) - { - spawn_bot( team ); - return 1; - } - else if ( count > 6 ) - { - bot_comp_stomp_remove( team ); - return 1; - } - return 0; + count = countplayers( team ); + + if ( count < 6 ) + { + spawn_bot( team ); + return true; + } + else if ( count > 6 ) + { + bot_comp_stomp_remove( team ); + return true; + } + + return false; } -bot_ranked_think() //checked partially changed to match cerberus output //changed at own discretion +bot_ranked_think() { - level endon( "game_ended" ); - wait 5; - for ( ;; ) - { - wait 1; - teams = []; - teams[ 0 ] = "axis"; - teams[ 1 ] = "allies"; - if ( cointoss() ) - { - teams[ 0 ] = "allies"; - teams[ 1 ] = "axis"; - } - if ( !bot_ranked_count( teams[ 0 ] ) && !bot_ranked_count( teams[ 1 ] ) ) - { - break; //not in cerberus output but leaving here anyway= - } - } - for ( ;; ) - { - level waittill_any( "connected", "disconnect" ); - wait 5; - while ( isDefined( level.hostmigrationtimer ) ) - { - wait 1; - } - } + level endon( "game_ended" ); + wait 5; + + for (;;) + { + for (;;) + { + wait 1; + teams = []; + teams[0] = "axis"; + teams[1] = "allies"; + + if ( cointoss() ) + { + teams[0] = "allies"; + teams[1] = "axis"; + } + + if ( !bot_ranked_count( teams[0] ) && !bot_ranked_count( teams[1] ) ) + break; + } + + level waittill_any( "connected", "disconnect" ); + wait 5; + + while ( isdefined( level.hostmigrationtimer ) ) + wait 1; + } } -bot_local_friends( expected_friends, max, host_team ) //checked matches cerberus output +bot_local_friends( expected_friends, max, host_team ) { - if ( level.teambased ) - { - players = get_players(); - friends = bot_count_bots( host_team ); - if ( friends < expected_friends && players.size < max ) - { - spawn_bot( host_team ); - return 1; - } - if ( friends > expected_friends ) - { - bot_comp_stomp_remove( host_team ); - return 1; - } - } - return 0; + if ( level.teambased ) + { + players = get_players(); + friends = bot_count_bots( host_team ); + + if ( friends < expected_friends && players.size < max ) + { + spawn_bot( host_team ); + return true; + } + + if ( friends > expected_friends ) + { + bot_comp_stomp_remove( host_team ); + return true; + } + } + + return false; } -bot_local_enemies( expected_enemies, max, host_team ) //checked matches cerberus output +bot_local_enemies( expected_enemies, max, host_team ) { - enemies = bot_count_enemy_bots( host_team ); - players = get_players(); - if ( enemies < expected_enemies && players.size < max ) - { - team = getenemyteamwithlowestplayercount( host_team ); - spawn_bot( team ); - return 1; - } - if ( enemies > expected_enemies ) - { - team = getenemyteamwithgreatestbotcount( host_team ); - if ( isDefined( team ) ) - { - bot_comp_stomp_remove( team ); - } - return 1; - } - return 0; + enemies = bot_count_enemy_bots( host_team ); + players = get_players(); + + if ( enemies < expected_enemies && players.size < max ) + { + team = getenemyteamwithlowestplayercount( host_team ); + spawn_bot( team ); + return true; + } + + if ( enemies > expected_enemies ) + { + team = getenemyteamwithgreatestbotcount( host_team ); + + if ( isdefined( team ) ) + bot_comp_stomp_remove( team ); + + return true; + } + + return false; } -bot_local_think() //checked changed at own discretion +bot_local_think() { - wait 5; - host = gethostplayerforbots(); - /* + wait 5; + host = gethostplayerforbots(); /# - assert( isDefined( host ) ); + assert( isdefined( host ) ); #/ - */ - host_team = host.team; - if ( !isDefined( host_team ) || host_team == "spectator" ) - { - host_team = "allies"; - } - bot_expected_friends = getDvarInt( "bot_friends" ); - bot_expected_enemies = getDvarInt( "bot_enemies" ); - if ( islocalgame() ) - { - } - else - { - } - max_players = 18; - for ( ;; ) - { - if ( bot_local_friends( bot_expected_friends, max_players, host_team ) ) - { - wait 0.5; - continue; - } - if ( bot_local_enemies( bot_expected_enemies, max_players, host_team ) ) - { - wait 0.5; - continue; - } - wait 3; - } + host_team = host.team; + + if ( !isdefined( host_team ) || host_team == "spectator" ) + host_team = "allies"; + + bot_expected_friends = getdvarint( "bot_friends" ); + bot_expected_enemies = getdvarint( "bot_enemies" ); + max_players = islocalgame() ? 10 : 18; + + for (;;) + { + for (;;) + { + if ( bot_local_friends( bot_expected_friends, max_players, host_team ) ) + { + wait 0.5; + continue; + } + + if ( bot_local_enemies( bot_expected_enemies, max_players, host_team ) ) + { + wait 0.5; + continue; + } + + break; + } + + wait 3; + } } -is_bot_ranked_match() //checked changed at own discretion +is_bot_ranked_match() { - bot_enemies = getDvarInt( "bot_enemies" ); - isdedicatedbotsoak = getDvarInt( "sv_botsoak" ); //dvar taken from bo3 no guarantees it works - if ( level.rankedmatch && bot_enemies && isdedicatedbotsoak == 0 ) - { - return 1; - } - return 0; + bot_enemies = getdvarint( "bot_enemies" ); + isdedicatedbotsoak = getdvarint( _hash_E76315E0 ); + return level.rankedmatch && bot_enemies && 0 == isdedicatedbotsoak; } -is_bot_comp_stomp() //checked changed at own discretion +is_bot_comp_stomp() { - if ( is_bot_ranked_match() && !getDvarInt( "party_autoteams" ) ) - { - return 1; - } - return 0; + return is_bot_ranked_match() && !getdvarint( "party_autoteams" ); } -bot_spawn_think( team ) //checked changed to match cerberus output +bot_spawn_think( team ) { - self endon( "disconnect" ); - while ( !isDefined( self.pers[ "bot_loadout" ] ) ) - { - wait 0.1; - } - while ( !isDefined( self.team ) ) - { - wait 0.05; - } - if ( level.teambased ) - { - self notify( "menuresponse", game["menu_team"], team ); - wait 0.5; - } - self notify( "joined_team" ); - bot_classes = bot_build_classes(); - self notify( "menuresponse", "changeclass", random(bot_classes) ); + self endon( "disconnect" ); + + while ( !isdefined( self.pers["bot_loadout"] ) ) + wait 0.1; + + while ( !isdefined( self.team ) ) + wait 0.05; + + if ( level.teambased ) + { + self notify( "menuresponse", game["menu_team"], team ); + wait 0.5; + } + + self notify( "joined_team" ); + bot_classes = bot_build_classes(); + self notify( "menuresponse", "changeclass", random( bot_classes ) ); } -bot_build_classes() //checked matches cerberus output +bot_build_classes() { - bot_classes = []; - if ( !self isitemlocked( maps/mp/gametypes/_rank::getitemindex( "feature_cac" ) ) ) - { - bot_classes[ bot_classes.size ] = "custom0"; - bot_classes[ bot_classes.size ] = "custom1"; - bot_classes[ bot_classes.size ] = "custom2"; - bot_classes[ bot_classes.size ] = "custom3"; - bot_classes[ bot_classes.size ] = "custom4"; - if ( randomint( 100 ) < 10 ) - { - bot_classes[ bot_classes.size ] = "class_smg"; - bot_classes[ bot_classes.size ] = "class_cqb"; - bot_classes[ bot_classes.size ] = "class_assault"; - bot_classes[ bot_classes.size ] = "class_lmg"; - bot_classes[ bot_classes.size ] = "class_sniper"; - } - } - else - { - bot_classes[ bot_classes.size ] = "class_smg"; - bot_classes[ bot_classes.size ] = "class_cqb"; - bot_classes[ bot_classes.size ] = "class_assault"; - bot_classes[ bot_classes.size ] = "class_lmg"; - bot_classes[ bot_classes.size ] = "class_sniper"; - } - return bot_classes; + bot_classes = []; + + if ( !self isitemlocked( maps\mp\gametypes\_rank::getitemindex( "feature_cac" ) ) ) + { + bot_classes[bot_classes.size] = "custom0"; + bot_classes[bot_classes.size] = "custom1"; + bot_classes[bot_classes.size] = "custom2"; + bot_classes[bot_classes.size] = "custom3"; + bot_classes[bot_classes.size] = "custom4"; + + if ( randomint( 100 ) < 10 ) + { + bot_classes[bot_classes.size] = "class_smg"; + bot_classes[bot_classes.size] = "class_cqb"; + bot_classes[bot_classes.size] = "class_assault"; + bot_classes[bot_classes.size] = "class_lmg"; + bot_classes[bot_classes.size] = "class_sniper"; + } + } + else + { + bot_classes[bot_classes.size] = "class_smg"; + bot_classes[bot_classes.size] = "class_cqb"; + bot_classes[bot_classes.size] = "class_assault"; + bot_classes[bot_classes.size] = "class_lmg"; + bot_classes[bot_classes.size] = "class_sniper"; + } + + return bot_classes; } -bot_choose_class() //checked partially changed to match cerberus output did not use foreach with continue to prevent infinite loop due to continue +bot_choose_class() { - bot_classes = bot_build_classes(); - if ( !self maps/mp/bots/_bot_combat::threat_requires_rocket( self.bot.attacker ) || self maps/mp/bots/_bot_combat::threat_is_qrdrone( self.bot.attacker ) && !maps/mp/bots/_bot_combat::threat_is_warthog( self.bot.attacker ) ) - { - if ( randomint( 100 ) < 75 ) - { - bot_classes[ bot_classes.size ] = "class_smg"; - bot_classes[ bot_classes.size ] = "class_cqb"; - bot_classes[ bot_classes.size ] = "class_assault"; - bot_classes[ bot_classes.size ] = "class_lmg"; - bot_classes[ bot_classes.size ] = "class_sniper"; - } - i = 0; - while ( i < bot_classes.size ) - { - sidearm = self getloadoutweapon( i, "secondary" ); - if ( sidearm == "fhj18_mp" ) - { - self notify( "menuresponse", "changeclass", bot_classes[ i ] ); - i++; - continue; - } - if ( sidearm == "smaw_mp" ) - { - bot_classes[ bot_classes.size ] = bot_classes[ i ]; - bot_classes[ bot_classes.size ] = bot_classes[ i ]; - bot_classes[ bot_classes.size ] = bot_classes[ i ]; - } - i++; - } - } - else if ( maps/mp/bots/_bot_combat::threat_requires_rocket( self.bot.attacker ) || maps/mp/bots/_bot_combat::threat_is_warthog( self.bot.attacker ) ) - { - for ( i = 0; i < bot_classes.size; i++ ) - { - perks = self getloadoutperks( i ); - foreach ( perk in perks ) - { - if ( perk == "specialty_nottargetedbyairsupport" ) - { - bot_classes[ bot_classes.size ] = bot_classes[ i ]; - bot_classes[ bot_classes.size ] = bot_classes[ i ]; - bot_classes[ bot_classes.size ] = bot_classes[ i ]; - } - } - } - } - self notify( "menuresponse", "changeclass", random(bot_classes) ); + bot_classes = bot_build_classes(); + + if ( ( self maps\mp\bots\_bot_combat::threat_requires_rocket( self.bot.attacker ) || self maps\mp\bots\_bot_combat::threat_is_qrdrone( self.bot.attacker ) ) && !maps\mp\bots\_bot_combat::threat_is_warthog( self.bot.attacker ) ) + { + if ( randomint( 100 ) < 75 ) + { + bot_classes[bot_classes.size] = "class_smg"; + bot_classes[bot_classes.size] = "class_cqb"; + bot_classes[bot_classes.size] = "class_assault"; + bot_classes[bot_classes.size] = "class_lmg"; + bot_classes[bot_classes.size] = "class_sniper"; + } + + for ( i = 0; i < bot_classes.size; i++ ) + { + sidearm = self getloadoutweapon( i, "secondary" ); + + if ( sidearm == "fhj18_mp" ) + { + self notify( "menuresponse", "changeclass", bot_classes[i] ); + return; + continue; + } + + if ( sidearm == "smaw_mp" ) + { + bot_classes[bot_classes.size] = bot_classes[i]; + bot_classes[bot_classes.size] = bot_classes[i]; + bot_classes[bot_classes.size] = bot_classes[i]; + } + } + } + + if ( maps\mp\bots\_bot_combat::threat_requires_rocket( self.bot.attacker ) || maps\mp\bots\_bot_combat::threat_is_warthog( self.bot.attacker ) ) + { + for ( i = 0; i < bot_classes.size; i++ ) + { + perks = self getloadoutperks( i ); + + foreach ( perk in perks ) + { + if ( perk == "specialty_nottargetedbyairsupport" ) + { + bot_classes[bot_classes.size] = bot_classes[i]; + bot_classes[bot_classes.size] = bot_classes[i]; + bot_classes[bot_classes.size] = bot_classes[i]; + } + } + } + } + + self notify( "menuresponse", "changeclass", random( bot_classes ) ); } -bot_spawn() //checked matches cerberus output +bot_spawn() { - self endon( "disconnect" ); - /* + self endon( "disconnect" ); /# - weapon = undefined; - if ( getDvarInt( "scr_botsHasPlayerWeapon" ) != 0 ) - { - player = gethostplayer(); - weapon = player getcurrentweapon(); - } - if ( getDvar( "devgui_bot_weapon" ) != "" ) - { - weapon = getDvar( "devgui_bot_weapon" ); - } - if ( isDefined( weapon ) ) - { - self maps/mp/gametypes/_weapons::detach_all_weapons(); - self takeallweapons(); - self giveweapon( weapon ); - self switchtoweapon( weapon ); - self setspawnweapon( weapon ); - self maps/mp/teams/_teams::set_player_model( self.team, weapon ); + weapon = undefined; + + if ( getdvarint( "scr_botsHasPlayerWeapon" ) != 0 ) + { + player = gethostplayer(); + weapon = player getcurrentweapon(); + } + + if ( getdvar( "devgui_bot_weapon" ) != "" ) + weapon = getdvar( "devgui_bot_weapon" ); + + if ( isdefined( weapon ) ) + { + self maps\mp\gametypes\_weapons::detach_all_weapons(); + self takeallweapons(); + self giveweapon( weapon ); + self switchtoweapon( weapon ); + self setspawnweapon( weapon ); + self maps\mp\teams\_teams::set_player_model( self.team, weapon ); + } #/ - } - */ - self bot_spawn_init(); - if ( isDefined( self.bot_first_spawn ) ) - { - self bot_choose_class(); - } - self.bot_first_spawn = 1; - self thread bot_main(); - /* + self bot_spawn_init(); + + if ( isdefined( self.bot_first_spawn ) ) + self bot_choose_class(); + + self.bot_first_spawn = 1; + self thread bot_main(); /# - self thread bot_devgui_think(); + self thread bot_devgui_think(); #/ - */ } -bot_spawn_init() //checked matches cerberus output +bot_spawn_init() { - time = getTime(); - if ( !isDefined( self.bot ) ) - { - self.bot = spawnstruct(); - self.bot.threat = spawnstruct(); - } - self.bot.glass_origin = undefined; - self.bot.ignore_entity = []; - self.bot.previous_origin = self.origin; - self.bot.time_ads = 0; - self.bot.update_c4 = time + randomintrange( 1000, 3000 ); - self.bot.update_crate = time + randomintrange( 1000, 3000 ); - self.bot.update_crouch = time + randomintrange( 1000, 3000 ); - self.bot.update_failsafe = time + randomintrange( 1000, 3000 ); - self.bot.update_idle_lookat = time + randomintrange( 1000, 3000 ); - self.bot.update_killstreak = time + randomintrange( 1000, 3000 ); - self.bot.update_lookat = time + randomintrange( 1000, 3000 ); - self.bot.update_objective = time + randomintrange( 1000, 3000 ); - self.bot.update_objective_patrol = time + randomintrange( 1000, 3000 ); - self.bot.update_patrol = time + randomintrange( 1000, 3000 ); - self.bot.update_toss = time + randomintrange( 1000, 3000 ); - self.bot.update_launcher = time + randomintrange( 1000, 3000 ); - self.bot.update_weapon = time + randomintrange( 1000, 3000 ); - difficulty = bot_get_difficulty(); - switch( difficulty ) - { - case "easy": - self.bot.think_interval = 0.5; - self.bot.fov = 0.4226; - break; - case "normal": - self.bot.think_interval = 0.25; - self.bot.fov = 0.0872; - break; - case "hard": - self.bot.think_interval = 0.2; - self.bot.fov = -0.1736; - break; - case "fu": - self.bot.think_interval = 0.1; - self.bot.fov = -0.9396; - break; - default: - self.bot.think_interval = 0.25; - self.bot.fov = 0.0872; - break; - } - self.bot.threat.entity = undefined; - self.bot.threat.position = ( 0, 0, 0 ); - self.bot.threat.time_first_sight = 0; - self.bot.threat.time_recent_sight = 0; - self.bot.threat.time_aim_interval = 0; - self.bot.threat.time_aim_correct = 0; - self.bot.threat.update_riotshield = 0; + time = gettime(); + + if ( !isdefined( self.bot ) ) + { + self.bot = spawnstruct(); + self.bot.threat = spawnstruct(); + } + + self.bot.glass_origin = undefined; + self.bot.ignore_entity = []; + self.bot.previous_origin = self.origin; + self.bot.time_ads = 0; + self.bot.update_c4 = time + randomintrange( 1000, 3000 ); + self.bot.update_crate = time + randomintrange( 1000, 3000 ); + self.bot.update_crouch = time + randomintrange( 1000, 3000 ); + self.bot.update_failsafe = time + randomintrange( 1000, 3000 ); + self.bot.update_idle_lookat = time + randomintrange( 1000, 3000 ); + self.bot.update_killstreak = time + randomintrange( 1000, 3000 ); + self.bot.update_lookat = time + randomintrange( 1000, 3000 ); + self.bot.update_objective = time + randomintrange( 1000, 3000 ); + self.bot.update_objective_patrol = time + randomintrange( 1000, 3000 ); + self.bot.update_patrol = time + randomintrange( 1000, 3000 ); + self.bot.update_toss = time + randomintrange( 1000, 3000 ); + self.bot.update_launcher = time + randomintrange( 1000, 3000 ); + self.bot.update_weapon = time + randomintrange( 1000, 3000 ); + difficulty = bot_get_difficulty(); + + switch ( difficulty ) + { + case "easy": + self.bot.think_interval = 0.5; + self.bot.fov = 0.4226; + break; + case "normal": + self.bot.think_interval = 0.25; + self.bot.fov = 0.0872; + break; + case "hard": + self.bot.think_interval = 0.2; + self.bot.fov = -0.1736; + break; + case "fu": + self.bot.think_interval = 0.1; + self.bot.fov = -0.9396; + break; + default: + self.bot.think_interval = 0.25; + self.bot.fov = 0.0872; + break; + } + + self.bot.threat.entity = undefined; + self.bot.threat.position = ( 0, 0, 0 ); + self.bot.threat.time_first_sight = 0; + self.bot.threat.time_recent_sight = 0; + self.bot.threat.time_aim_interval = 0; + self.bot.threat.time_aim_correct = 0; + self.bot.threat.update_riotshield = 0; } bot_wakeup_think() { - self endon( "death" ); - self endon( "disconnect" ); - level endon( "game_ended" ); - for ( ;; ) - { - wait self.bot.think_interval; - self notify( "wakeup" ); - } + self endon( "death" ); + self endon( "disconnect" ); + level endon( "game_ended" ); + + for (;;) + { + wait( self.bot.think_interval ); + self notify( "wakeup" ); + } } -bot_damage_think() //checked changed to match cerberus output +bot_damage_think() { - self notify( "bot_damage_think" ); - self endon( "bot_damage_think" ); - self endon( "disconnect" ); - level endon( "game_ended" ); - for ( ;; ) - { - self waittill( "damage", damage, attacker, direction, point, mod, unused1, unused2, unused3, weapon, flags, inflictor ); - if ( attacker.classname == "worldspawn" ) - { - continue; - } - else if ( isDefined( weapon ) ) - { - if ( weapon == "proximity_grenade_mp" || weapon == "proximity_grenade_aoe_mp" ) - { - continue; - } - if ( weapon == "claymore_mp" ) - { - continue; - } - if ( weapon == "satchel_charge_mp" ) - { - continue; - } - if ( weapon == "bouncingbetty_mp" ) - { - continue; - } - } - if ( isDefined( inflictor ) ) - { - switch( inflictor.classname ) - { - case "auto_turret": - case "script_vehicle": - attacker = inflictor; - break; - } - } - if ( isDefined( attacker.viewlockedentity ) ) - { - attacker = attacker.viewlockedentity; - } - if ( maps/mp/bots/_bot_combat::threat_requires_rocket( attacker ) || maps/mp/bots/_bot_combat::threat_is_warthog( attacker ) ) - { - level thread bot_killstreak_dangerous_think( self.origin, self.team, attacker ); - } - self.bot.attacker = attacker; - self notify( "wakeup", damage, attacker, direction ); - } + self notify( "bot_damage_think" ); + self endon( "bot_damage_think" ); + self endon( "disconnect" ); + level endon( "game_ended" ); + + for (;;) + { + self waittill( "damage", damage, attacker, direction, point, mod, unused1, unused2, unused3, weapon, flags, inflictor ); + + if ( attacker.classname == "worldspawn" ) + continue; + + if ( isdefined( weapon ) ) + { + if ( weapon == "proximity_grenade_mp" || weapon == "proximity_grenade_aoe_mp" ) + continue; + else if ( weapon == "claymore_mp" ) + continue; + else if ( weapon == "satchel_charge_mp" ) + continue; + else if ( weapon == "bouncingbetty_mp" ) + continue; + } + + if ( isdefined( inflictor ) ) + { + switch ( inflictor.classname ) + { + case "script_vehicle": + case "auto_turret": + attacker = inflictor; + break; + } + } + + if ( isdefined( attacker.viewlockedentity ) ) + attacker = attacker.viewlockedentity; + + if ( maps\mp\bots\_bot_combat::threat_requires_rocket( attacker ) || maps\mp\bots\_bot_combat::threat_is_warthog( attacker ) ) + level thread bot_killstreak_dangerous_think( self.origin, self.team, attacker ); + + self.bot.attacker = attacker; + self notify( "wakeup", damage, attacker, direction ); + } } -bot_killcam_think() //checked matches cerberus output +bot_killcam_think() { - self notify( "bot_killcam_think" ); - self endon( "bot_killcam_think" ); - self endon( "disconnect" ); - level endon( "game_ended" ); - wait_time = 0.5; - if ( level.playerrespawndelay ) - { - wait_time = level.playerrespawndelay + 1.5; - } - if ( !level.killcam ) - { - self waittill( "death" ); - } - else - { - self waittill( "begin_killcam" ); - } - wait wait_time; - for ( ;; ) - { - self pressusebutton( 0.1 ); - wait 0.5; - } + self notify( "bot_killcam_think" ); + self endon( "bot_killcam_think" ); + self endon( "disconnect" ); + level endon( "game_ended" ); + wait_time = 0.5; + + if ( level.playerrespawndelay ) + wait_time = level.playerrespawndelay + 1.5; + + if ( !level.killcam ) + self waittill( "death" ); + else + self waittill( "begin_killcam" ); + + wait( wait_time ); + + for (;;) + { + self pressusebutton( 0.1 ); + wait 0.5; + } } -bot_glass_think() //checked matches cerberus output +bot_glass_think() { - self endon( "death" ); - self endon( "disconnect" ); - level endon( "game_ended" ); - for ( ;; ) - { - self waittill( "glass", origin ); - self.bot.glass_origin = origin; - self notify( "wakeup" ); - } + self endon( "death" ); + self endon( "disconnect" ); + level endon( "game_ended" ); + + for (;;) + { + self waittill( "glass", origin ); + + self.bot.glass_origin = origin; + self notify( "wakeup" ); + } } -bot_main() //checked matches cerberus output +bot_main() { - self endon( "death" ); - self endon( "disconnect" ); - level endon( "game_ended" ); - if ( level.inprematchperiod ) - { - level waittill( "prematch_over" ); - self.bot.update_failsafe = getTime() + randomintrange( 1000, 3000 ); - } - self thread bot_wakeup_think(); - self thread bot_damage_think(); - self thread bot_killcam_think(); - self thread bot_glass_think(); - for ( ;; ) - { - self waittill( "wakeup", damage, attacker, direction ); - if ( self isremotecontrolling() ) - { - continue; - } - else - { - self maps/mp/bots/_bot_combat::bot_combat_think( damage, attacker, direction ); - self bot_update_glass(); - self bot_update_patrol(); - self bot_update_lookat(); - self bot_update_killstreak(); - self bot_update_wander(); - self bot_update_c4(); - self bot_update_launcher(); - self bot_update_weapon(); - if ( cointoss() ) - { - self bot_update_toss_flash(); - self bot_update_toss_frag(); - } - else - { - self bot_update_toss_frag(); - self bot_update_toss_flash(); - } - self [[ level.bot_gametype ]](); - } - } + self endon( "death" ); + self endon( "disconnect" ); + level endon( "game_ended" ); + + if ( level.inprematchperiod ) + { + level waittill( "prematch_over" ); + + self.bot.update_failsafe = gettime() + randomintrange( 1000, 3000 ); + } + + self thread bot_wakeup_think(); + self thread bot_damage_think(); + self thread bot_killcam_think(); + self thread bot_glass_think(); + + for (;;) + { + self waittill( "wakeup", damage, attacker, direction ); + + if ( self isremotecontrolling() ) + continue; + + self maps\mp\bots\_bot_combat::bot_combat_think( damage, attacker, direction ); + self bot_update_glass(); + self bot_update_patrol(); + self bot_update_lookat(); + self bot_update_killstreak(); + self bot_update_wander(); + self bot_update_c4(); + self bot_update_launcher(); + self bot_update_weapon(); + + if ( cointoss() ) + { + self bot_update_toss_flash(); + self bot_update_toss_frag(); + } + else + { + self bot_update_toss_frag(); + self bot_update_toss_flash(); + } + + self [[ level.bot_gametype ]](); + } } -bot_failsafe_node_valid( nearest, node ) //checked changed to match cerberus output +bot_failsafe_node_valid( nearest, node ) { - if ( isDefined( node.script_noteworthy ) ) - { - return 0; - } - if ( ( node.origin[ 2 ] - self.origin[ 2 ] ) > 18 ) - { - return 0; - } - if ( nearest == node ) - { - return 0; - } - if ( !nodesvisible( nearest, node ) ) - { - return 0; - } - if ( self bot_friend_in_radius( node.origin, 32 ) ) - { - return 0; - } - if ( isDefined( level.spawn_all ) && level.spawn_all.size > 0 ) - { - spawns = arraysort( level.spawn_all, node.origin ); - } - else if ( isDefined( level.spawnpoints ) && level.spawnpoints.size > 0 ) - { - spawns = arraysort( level.spawnpoints, node.origin ); - } - else if ( isDefined( level.spawn_start ) && level.spawn_start.size > 0 ) - { - spawns = arraycombine( level.spawn_start[ "allies" ], level.spawn_start[ "axis" ], 1, 0 ); - spawns = arraysort( spawns, node.origin ); - } - else - { - return 0; - } - goal = bot_nearest_node( spawns[ 0 ].origin ); - if ( isDefined( goal ) && findpath( node.origin, goal.origin, undefined, 0, 1 ) ) - { - return 1; - } - return 0; + if ( isdefined( node.script_noteworthy ) ) + return false; + + if ( node.origin[2] - self.origin[2] > 18 ) + return false; + + if ( nearest == node ) + return false; + + if ( !nodesvisible( nearest, node ) ) + return false; + + if ( self bot_friend_in_radius( node.origin, 32 ) ) + return false; + + if ( isdefined( level.spawn_all ) && level.spawn_all.size > 0 ) + spawns = arraysort( level.spawn_all, node.origin ); + else if ( isdefined( level.spawnpoints ) && level.spawnpoints.size > 0 ) + spawns = arraysort( level.spawnpoints, node.origin ); + else if ( isdefined( level.spawn_start ) && level.spawn_start.size > 0 ) + { + spawns = arraycombine( level.spawn_start["allies"], level.spawn_start["axis"], 1, 0 ); + spawns = arraysort( spawns, node.origin ); + } + else + return false; + + goal = bot_nearest_node( spawns[0].origin ); + + if ( isdefined( goal ) && findpath( node.origin, goal.origin, undefined, 0, 1 ) ) + return true; + + return false; } -bot_get_mantle_start() //checked changed at own discretion +bot_get_mantle_start() { - dist = self getlookaheaddist(); - dir = self getlookaheaddir(); - if ( dist > 0 && isDefined( dir ) ) - { - forward = anglesToForward( self.angles ); - if ( vectordot( dir, forward ) < 0 ) - { - dir = vectorScale( dir, dist ); - origin = self.origin + dir; - nodes = getnodesinradius( origin, 16, 0, 16, "Begin" ); - //if ( nodes.size && nodes[ 0 ].spawnflags & 8388608 ) - if ( nodes.size && nodes[ 0 ].spawnflags ) - { - return nodes[ 0 ]; - } - } - } - return undefined; + dist = self getlookaheaddist(); + dir = self getlookaheaddir(); + + if ( dist > 0 && isdefined( dir ) ) + { + forward = anglestoforward( self.angles ); + + if ( vectordot( dir, forward ) < 0 ) + { + dir = vectorscale( dir, dist ); + origin = self.origin + dir; + nodes = getnodesinradius( origin, 16, 0, 16, "Begin" ); + + if ( nodes.size && nodes[0].spawnflags & 8388608 ) + return nodes[0]; + } + } + + return undefined; } -bot_is_traversing() //checked changed at own discretion +bot_is_traversing() { - if ( !self isonground() && !self ismantling() && !self isonladder() ) - { - return 1; - } - return 0; + if ( !self isonground() ) + return !self ismantling() && !self isonladder(); + + return 0; } -bot_update_failsafe() //checked partially changed to match cerberus output //did not change while loop to foreach to prevent infinite continue loop bug +bot_update_failsafe() { - time = getTime(); - if ( ( time - self.spawntime ) < 7500 ) - { - return; - } - if ( bot_is_traversing() ) - { - wait 0.25; - node = bot_get_mantle_start(); - if ( isDefined( node ) ) - { - end = getnode( node.target, "targetname" ); - self clearlookat(); - self botsetfailsafenode( end ); - self wait_endon( 1, "goal" ); - self botsetfailsafenode(); - return; - } - } - if ( time < self.bot.update_failsafe ) - { - return; - } - if ( !self ismantling() || self isonladder() && !self isonground() ) - { - wait randomfloatrange( 0.1, 0.25 ); - return; - } - if ( !self atgoal() && distance2dsquared( self.bot.previous_origin, self.origin ) < 256 ) - { - nodes = getnodesinradius( self.origin, 512, 0 ); - nodes = array_randomize( nodes ); - nearest = bot_nearest_node( self.origin ); - failsafe = 0; - if ( isDefined( nearest ) ) - { - i = 0; - while ( i < nodes.size ) - { - if ( !bot_failsafe_node_valid( nearest, nodes[ i ] ) ) - { - i++; - continue; - } - else - { - self botsetfailsafenode( nodes[ i ] ); - wait 0.5; - self.bot.update_idle_lookat = 0; - self bot_update_lookat(); - self cancelgoal( "enemy_patrol" ); - self wait_endon( 4, "goal" ); - self botsetfailsafenode(); - self bot_update_lookat(); - failsafe = 1; - break; - } - i++; - } - } - else if ( !failsafe && nodes.size ) - { - node = random( nodes ); - self botsetfailsafenode( node ); - wait 0.5; - self.bot.update_idle_lookat = 0; - self bot_update_lookat(); - self cancelgoal( "enemy_patrol" ); - self wait_endon( 4, "goal" ); - self botsetfailsafenode(); - self bot_update_lookat(); - } - } - self.bot.update_failsafe = getTime() + 3500; - self.bot.previous_origin = self.origin; + time = gettime(); + + if ( time - self.spawntime < 7500 ) + return; + + if ( bot_is_traversing() ) + { + wait 0.25; + node = bot_get_mantle_start(); + + if ( isdefined( node ) ) + { + end = getnode( node.target, "targetname" ); + self clearlookat(); + self botsetfailsafenode( end ); + self wait_endon( 1, "goal" ); + self botsetfailsafenode(); + return; + } + } + + if ( time < self.bot.update_failsafe ) + return; + + if ( self ismantling() || self isonladder() || !self isonground() ) + { + wait( randomfloatrange( 0.1, 0.25 ) ); + return; + } + + if ( !self atgoal() && distance2dsquared( self.bot.previous_origin, self.origin ) < 256 ) + { + nodes = getnodesinradius( self.origin, 512, 0 ); + nodes = array_randomize( nodes ); + nearest = bot_nearest_node( self.origin ); + failsafe = 0; + + if ( isdefined( nearest ) ) + { + foreach ( node in nodes ) + { + if ( !bot_failsafe_node_valid( nearest, node ) ) + continue; + + self botsetfailsafenode( node ); + wait 0.5; + self.bot.update_idle_lookat = 0; + self bot_update_lookat(); + self cancelgoal( "enemy_patrol" ); + self wait_endon( 4, "goal" ); + self botsetfailsafenode(); + self bot_update_lookat(); + failsafe = 1; + break; + } + } + + if ( !failsafe && nodes.size ) + { + node = random( nodes ); + self botsetfailsafenode( node ); + wait 0.5; + self.bot.update_idle_lookat = 0; + self bot_update_lookat(); + self cancelgoal( "enemy_patrol" ); + self wait_endon( 4, "goal" ); + self botsetfailsafenode(); + self bot_update_lookat(); + } + } + + self.bot.update_failsafe = gettime() + 3500; + self.bot.previous_origin = self.origin; } -bot_update_crouch() //checked changed to match cerberus output +bot_update_crouch() { - time = getTime(); - if ( time < self.bot.update_crouch ) - { - return; - } - if ( self atgoal() ) - { - return; - } - if ( self ismantling() || self isonladder() && !self isonground() ) - { - return; - } - dist = self getlookaheaddist(); - if ( dist > 0 ) - { - dir = self getlookaheaddir(); - /* + time = gettime(); + + if ( time < self.bot.update_crouch ) + return; + + if ( self atgoal() ) + return; + + if ( self ismantling() || self isonladder() || !self isonground() ) + return; + + dist = self getlookaheaddist(); + + if ( dist > 0 ) + { + dir = self getlookaheaddir(); /# - assert( isDefined( dir ) ); + assert( isdefined( dir ) ); #/ - */ - dir = vectorScale( dir, dist ); - start = self.origin + vectorScale( ( 0, 0, 1 ), 70 ); - end = start + dir; - if ( dist >= 256 ) - { - self.bot.update_crouch = time + 1500; - } - if ( self getstance() == "stand" ) - { - trace = worldtrace( start, end ); - if ( trace[ "fraction" ] < 1 ) - { - self setstance( "crouch" ); - self.bot.update_crouch = time + 2500; - } - } - else if ( self getstance() == "crouch" ) - { - trace = worldtrace( start, end ); - if ( trace[ "fraction" ] >= 1 ) - { - self setstance( "stand" ); - } - } - } + dir = vectorscale( dir, dist ); + start = self.origin + vectorscale( ( 0, 0, 1 ), 70.0 ); + end = start + dir; + + if ( dist >= 256 ) + self.bot.update_crouch = time + 1500; + + if ( self getstance() == "stand" ) + { + trace = worldtrace( start, end ); + + if ( trace["fraction"] < 1 ) + { + self setstance( "crouch" ); + self.bot.update_crouch = time + 2500; + } + } + else if ( self getstance() == "crouch" ) + { + trace = worldtrace( start, end ); + + if ( trace["fraction"] >= 1 ) + self setstance( "stand" ); + } + } } -bot_update_glass() //checked matches cerberus output +bot_update_glass() { - if ( isDefined( self.bot.glass_origin ) ) - { - forward = anglesToForward( self.angles ); - dir = vectornormalize( self.bot.glass_origin - self.origin ); - dot = vectordot( forward, dir ); - if ( dot > 0 ) - { - self lookat( self.bot.glass_origin ); - wait_time = 0.5 * ( 1 - dot ); - wait_time = clamp( wait_time, 0.05, 0.5 ); - wait wait_time; - self pressmelee(); - wait 0.25; - self clearlookat(); - self.bot.glass_origin = undefined; - } - } + if ( isdefined( self.bot.glass_origin ) ) + { + forward = anglestoforward( self.angles ); + dir = vectornormalize( self.bot.glass_origin - self.origin ); + dot = vectordot( forward, dir ); + + if ( dot > 0 ) + { + self lookat( self.bot.glass_origin ); + wait_time = 0.5 * ( 1 - dot ); + wait_time = clamp( wait_time, 0.05, 0.5 ); + wait( wait_time ); + self pressmelee(); + wait 0.25; + self clearlookat(); + self.bot.glass_origin = undefined; + } + } } -bot_has_radar() //checked changed at own discretion +bot_has_radar() { - if ( ( maps/mp/killstreaks/_radar::teamhasspyplane( self.team ) || maps/mp/killstreaks/_radar::teamhassatellite( self.team ) ) && level.teambased ) - { - return 1; - } - if ( is_true( self.hasspyplane ) || is_true( self.hassatellite ) ) - { - return 1; - } - return 0; + if ( level.teambased ) + return maps\mp\killstreaks\_radar::teamhasspyplane( self.team ) || maps\mp\killstreaks\_radar::teamhassatellite( self.team ); + + return isdefined( self.hasspyplane ) && self.hasspyplane || isdefined( self.hassatellite ) && self.hassatellite; } -bot_get_enemies( on_radar ) //checked partially changed to match cerberus output //did not change while loop to for loop to prevent infinite continue bug +bot_get_enemies( on_radar ) { - if ( !isDefined( on_radar ) ) - { - on_radar = 0; - } - enemies = self getenemies( 1 ); - /* + if ( !isdefined( on_radar ) ) + on_radar = 0; + + enemies = self getenemies( 1 ); /# - for ( i = 0; i < enemies.size; i++ ) - { - if ( enemies[ i ] isinmovemode( "ufo", "noclip" ) ) - { - arrayremoveindex( enemies, i ); - i--; - - } + for ( i = 0; i < enemies.size; i++ ) + { + if ( enemies[i] isinmovemode( "ufo", "noclip" ) ) + { + arrayremoveindex( enemies, i ); + i--; + } + } #/ - } - */ - if ( on_radar && !self bot_has_radar() ) - { - i = 0; - while ( i < enemies.size ) - { - if ( !isDefined( enemies[ i ].lastfiretime ) ) - { - arrayremoveindex( enemies, i ); - i--; - i++; - continue; - } - if ( ( getTime() - enemies[ i ].lastfiretime ) > 2000 ) - { - arrayremoveindex( enemies, i ); - i--; - i++; - continue; - } - i++; - } - } - return enemies; + if ( on_radar && !self bot_has_radar() ) + { + for ( i = 0; i < enemies.size; i++ ) + { + if ( !isdefined( enemies[i].lastfiretime ) ) + { + arrayremoveindex( enemies, i ); + i--; + continue; + } + + if ( gettime() - enemies[i].lastfiretime > 2000 ) + { + arrayremoveindex( enemies, i ); + i--; + } + } + } + + return enemies; } -bot_get_friends() //checked changed to match cerberus output +bot_get_friends() { - friends = self getfriendlies( 1 ); - /* + friends = self getfriendlies( 1 ); /# - for ( i = 0; i < friends.size; i++ ) - { - if ( friends[ i ] isinmovemode( "ufo", "noclip" ) ) - { - arrayremoveindex( friends, i ); - i--; - } + for ( i = 0; i < friends.size; i++ ) + { + if ( friends[i] isinmovemode( "ufo", "noclip" ) ) + { + arrayremoveindex( friends, i ); + i--; + } + } #/ - } - */ - return friends; + return friends; } -bot_friend_goal_in_radius( goal_name, origin, radius ) //checked changed to match cerberus output +bot_friend_goal_in_radius( goal_name, origin, radius ) { - count = 0; - friends = bot_get_friends(); - foreach ( friend in friends ) - { - if ( friend maps/mp/_utility::is_bot() ) - { - goal = friend getgoal( goal_name ); - if ( isDefined( goal ) && distancesquared( origin, goal ) < radius * radius ) - { - count++; - } - } - } - return count; + count = 0; + friends = bot_get_friends(); + + foreach ( friend in friends ) + { + if ( friend is_bot() ) + { + goal = friend getgoal( goal_name ); + + if ( isdefined( goal ) && distancesquared( origin, goal ) < radius * radius ) + count++; + } + } + + return count; } -bot_friend_in_radius( origin, radius ) //checked changed to match cerberus output +bot_friend_in_radius( origin, radius ) { - friends = bot_get_friends(); - foreach ( friend in friends ) - { - if ( distancesquared( friend.origin, origin ) < ( radius * radius ) ) - { - return 1; - } - } - return 0; + friends = bot_get_friends(); + + foreach ( friend in friends ) + { + if ( distancesquared( friend.origin, origin ) < radius * radius ) + return true; + } + + return false; } -bot_get_closest_enemy( origin, on_radar ) //checked matches cerberus output +bot_get_closest_enemy( origin, on_radar ) { - enemies = self bot_get_enemies( on_radar ); - enemies = arraysort( enemies, origin ); - if ( enemies.size ) - { - return enemies[ 0 ]; - } - return undefined; + enemies = self bot_get_enemies( on_radar ); + enemies = arraysort( enemies, origin ); + + if ( enemies.size ) + return enemies[0]; + + return undefined; } -bot_update_wander() //checked changed to match cerberus output +bot_update_wander() { - goal = self getgoal( "wander" ); - if ( isDefined( goal ) ) - { - if ( distancesquared( goal, self.origin ) > 65536 ) - { - return; - } - } - if ( isDefined( level.spawn_all ) && level.spawn_all.size > 0 ) - { - spawns = arraysort( level.spawn_all, self.origin ); - } - if ( isDefined( level.spawnpoints ) && level.spawnpoints.size > 0 ) - { - spawns = arraysort( level.spawnpoints, self.origin ); - } - if ( isDefined( level.spawn_start ) && level.spawn_start.size > 0 ) - { - spawns = arraycombine( level.spawn_start[ "allies" ], level.spawn_start[ "axis" ], 1, 0 ); - spawns = arraysort( spawns, self.origin ); - } - else - { - return; - } - far = int( spawns.size / 2 ); - far = randomintrange( far, spawns.size ); - goal = bot_nearest_node( spawns[ far ].origin ); - if ( !isDefined( goal ) ) - { - return; - } - self addgoal( goal, 24, 1, "wander" ); + goal = self getgoal( "wander" ); + + if ( isdefined( goal ) ) + { + if ( distancesquared( goal, self.origin ) > 65536 ) + return; + } + + if ( isdefined( level.spawn_all ) && level.spawn_all.size > 0 ) + spawns = arraysort( level.spawn_all, self.origin ); + else if ( isdefined( level.spawnpoints ) && level.spawnpoints.size > 0 ) + spawns = arraysort( level.spawnpoints, self.origin ); + else if ( isdefined( level.spawn_start ) && level.spawn_start.size > 0 ) + { + spawns = arraycombine( level.spawn_start["allies"], level.spawn_start["axis"], 1, 0 ); + spawns = arraysort( spawns, self.origin ); + } + else + return; + + far = int( spawns.size / 2 ); + far = randomintrange( far, spawns.size ); + goal = bot_nearest_node( spawns[far].origin ); + + if ( !isdefined( goal ) ) + return; + + self addgoal( goal, 24, 1, "wander" ); } -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 = self getgoal( "wander" ); - if ( isDefined( spawn ) ) - { - node = getvisiblenode( self.origin, spawn ); - } - if ( isDefined( node ) && distancesquared( self.origin, node.origin ) > 1024 ) - { - return node.origin; - } - return undefined; + 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 = self getgoal( "wander" ); + + if ( isdefined( spawn ) ) + node = getvisiblenode( self.origin, spawn ); + + if ( isdefined( node ) && distancesquared( self.origin, node.origin ) > 1024 ) + return node.origin; + + return undefined; } -bot_update_lookat() //checked changed to match cerberus output +bot_update_lookat() { - path = 0; - if ( isDefined( self getlookaheaddir() ) ) - { - path = 1; - } - if ( !path && getTime() > self.bot.update_idle_lookat ) - { - origin = bot_get_look_at(); - if ( !isDefined( origin ) ) - { - return; - } - self lookat( origin + vectorScale( ( 0, 0, 1 ), 16 ) ); - self.bot.update_idle_lookat = getTime() + randomintrange( 1500, 3000 ); - } - else if ( path && self.bot.update_idle_lookat > 0 ) - { - self clearlookat(); - self.bot.update_idle_lookat = 0; - } + path = isdefined( self getlookaheaddir() ); + + if ( !path && gettime() > self.bot.update_idle_lookat ) + { + origin = bot_get_look_at(); + + if ( !isdefined( origin ) ) + return; + + self lookat( origin + vectorscale( ( 0, 0, 1 ), 16.0 ) ); + self.bot.update_idle_lookat = gettime() + randomintrange( 1500, 3000 ); + } + else if ( path && self.bot.update_idle_lookat > 0 ) + { + self clearlookat(); + self.bot.update_idle_lookat = 0; + } } -bot_update_patrol() //checked matches cerberus output +bot_update_patrol() { - closest = bot_get_closest_enemy( self.origin, 1 ); - if ( isDefined( closest ) && distancesquared( self.origin, closest.origin ) < 262144 ) - { - goal = self getgoal( "enemy_patrol" ); - if ( isDefined( goal ) && distancesquared( goal, closest.origin ) > 16384 ) - { - self cancelgoal( "enemy_patrol" ); - self.bot.update_patrol = 0; - } - } - if ( getTime() < self.bot.update_patrol ) - { - return; - } - self maps/mp/bots/_bot_combat::bot_patrol_near_enemy(); - self.bot.update_patrol = getTime() + randomintrange( 5000, 10000 ); + closest = bot_get_closest_enemy( self.origin, 1 ); + + if ( isdefined( closest ) && distancesquared( self.origin, closest.origin ) < 262144 ) + { + goal = self getgoal( "enemy_patrol" ); + + if ( isdefined( goal ) && distancesquared( goal, closest.origin ) > 16384 ) + { + self cancelgoal( "enemy_patrol" ); + self.bot.update_patrol = 0; + } + } + + if ( gettime() < self.bot.update_patrol ) + return; + + self maps\mp\bots\_bot_combat::bot_patrol_near_enemy(); + self.bot.update_patrol = gettime() + randomintrange( 5000, 10000 ); } -bot_update_toss_flash() //checked matches cerberus output +bot_update_toss_flash() { - if ( bot_get_difficulty() == "easy" ) - { - return; - } - time = getTime(); - if ( ( time - self.spawntime ) < 7500 ) - { - return; - } - if ( time < self.bot.update_toss ) - { - return; - } - self.bot.update_toss = time + 1500; - if ( self getweaponammostock( "sensor_grenade_mp" ) <= 0 && self getweaponammostock( "proximity_grenade_mp" ) <= 0 && self getweaponammostock( "trophy_system_mp" ) <= 0 ) - { - return; - } - enemy = self maps/mp/bots/_bot::bot_get_closest_enemy( self.origin, 1 ); - node = undefined; - if ( isDefined( enemy ) ) - { - node = getvisiblenode( self.origin, enemy.origin ); - } - if ( isDefined( node ) && distancesquared( self.origin, node.origin ) < 65536 ) - { - self lookat( node.origin ); - wait 0.75; - self pressattackbutton( 2 ); - self.bot.update_toss = time + 20000; - self clearlookat(); - } + if ( bot_get_difficulty() == "easy" ) + return; + + time = gettime(); + + if ( time - self.spawntime < 7500 ) + return; + + if ( time < self.bot.update_toss ) + return; + + self.bot.update_toss = time + 1500; + + if ( self getweaponammostock( "sensor_grenade_mp" ) <= 0 && self getweaponammostock( "proximity_grenade_mp" ) <= 0 && self getweaponammostock( "trophy_system_mp" ) <= 0 ) + return; + + enemy = self maps\mp\bots\_bot::bot_get_closest_enemy( self.origin, 1 ); + node = undefined; + + if ( isdefined( enemy ) ) + node = getvisiblenode( self.origin, enemy.origin ); + + if ( isdefined( node ) && distancesquared( self.origin, node.origin ) < 65536 ) + { + self lookat( node.origin ); + wait 0.75; + self pressattackbutton( 2 ); + self.bot.update_toss = time + 20000; + self clearlookat(); + } } -bot_update_toss_frag() //checked matches cerberus output +bot_update_toss_frag() { - if ( bot_get_difficulty() == "easy" ) - { - return; - } - time = getTime(); - if ( ( time - self.spawntime ) < 7500 ) - { - return; - } - if ( time < self.bot.update_toss ) - { - return; - } - self.bot.update_toss = time + 1500; - if ( self getweaponammostock( "bouncingbetty_mp" ) <= 0 && self getweaponammostock( "claymore_mp" ) <= 0 && self getweaponammostock( "satchel_charge_mp" ) <= 0 ) - { - return; - } - enemy = self maps/mp/bots/_bot::bot_get_closest_enemy( self.origin, 1 ); - node = undefined; - if ( isDefined( enemy ) ) - { - node = getvisiblenode( self.origin, enemy.origin ); - } - if ( isDefined( node ) && distancesquared( self.origin, node.origin ) < 65536 ) - { - self lookat( node.origin ); - wait 0.75; - self pressattackbutton( 1 ); - self.bot.update_toss = time + 20000; - self clearlookat(); - } + if ( bot_get_difficulty() == "easy" ) + return; + + time = gettime(); + + if ( time - self.spawntime < 7500 ) + return; + + if ( time < self.bot.update_toss ) + return; + + self.bot.update_toss = time + 1500; + + if ( self getweaponammostock( "bouncingbetty_mp" ) <= 0 && self getweaponammostock( "claymore_mp" ) <= 0 && self getweaponammostock( "satchel_charge_mp" ) <= 0 ) + return; + + enemy = self maps\mp\bots\_bot::bot_get_closest_enemy( self.origin, 1 ); + node = undefined; + + if ( isdefined( enemy ) ) + node = getvisiblenode( self.origin, enemy.origin ); + + if ( isdefined( node ) && distancesquared( self.origin, node.origin ) < 65536 ) + { + self lookat( node.origin ); + wait 0.75; + self pressattackbutton( 1 ); + self.bot.update_toss = time + 20000; + self clearlookat(); + } } -bot_set_rank() //checked partially changed to match cerberus output //did not change while loop to for loop to prevent infinite loop due to continue +bot_set_rank() { - players = get_players(); - ranks = []; - bot_ranks = []; - human_ranks = []; - i = 0; - while ( i < players.size ) - { - if ( players[ i ] == self ) - { - i++; - continue; - } - if ( isDefined( players[ i ].pers[ "rank" ] ) ) - { - if ( players[ i ] maps/mp/_utility::is_bot() ) - { - bot_ranks[ bot_ranks.size ] = players[ i ].pers[ "rank" ]; - i++; - continue; - } - human_ranks[ human_ranks.size ] = players[ i ].pers[ "rank" ]; - } - i++; - } - if ( !human_ranks.size ) - { - human_ranks[ human_ranks.size ] = 10; - } - human_avg = array_average( human_ranks ); - while ( ( bot_ranks.size + human_ranks.size ) < 5 ) - { - r = human_avg + randomintrange( -5, 5 ); - rank = clamp( r, 0, level.maxrank ); - human_ranks[ human_ranks.size ] = rank; - } - ranks = arraycombine( human_ranks, bot_ranks, 1, 0 ); - avg = array_average( ranks ); - s = array_std_deviation( ranks, avg ); - rank = int( random_normal_distribution( avg, s, 0, level.maxrank ) ); - self.pers[ "rank" ] = rank; - self.pers[ "rankxp" ] = maps/mp/gametypes/_rank::getrankinfominxp( rank ); - self setrank( rank ); - self maps/mp/gametypes/_rank::syncxpstat(); + players = get_players(); + ranks = []; + bot_ranks = []; + human_ranks = []; + + for ( i = 0; i < players.size; i++ ) + { + if ( players[i] == self ) + continue; + + if ( isdefined( players[i].pers["rank"] ) ) + { + if ( players[i] is_bot() ) + { + bot_ranks[bot_ranks.size] = players[i].pers["rank"]; + continue; + } + + human_ranks[human_ranks.size] = players[i].pers["rank"]; + } + } + + if ( !human_ranks.size ) + human_ranks[human_ranks.size] = 10; + + human_avg = array_average( human_ranks ); + + while ( bot_ranks.size + human_ranks.size < 5 ) + { + r = human_avg + randomintrange( -5, 5 ); + rank = clamp( r, 0, level.maxrank ); + human_ranks[human_ranks.size] = rank; + } + + ranks = arraycombine( human_ranks, bot_ranks, 1, 0 ); + avg = array_average( ranks ); + s = array_std_deviation( ranks, avg ); + rank = int( random_normal_distribution( avg, s, 0, level.maxrank ) ); + self.pers["rank"] = rank; + self.pers["rankxp"] = maps\mp\gametypes\_rank::getrankinfominxp( rank ); + self setrank( rank ); + self maps\mp\gametypes\_rank::syncxpstat(); } -bot_gametype_allowed() //checked matches cerberus output +bot_gametype_allowed() { - level.bot_gametype = ::gametype_void; - switch( level.gametype ) - { - case "dm": - case "tdm": - return 1; - case "ctf": - level.bot_gametype = maps/mp/bots/_bot_ctf::bot_ctf_think; - return 1; - case "dem": - level.bot_gametype = maps/mp/bots/_bot_dem::bot_dem_think; - return 1; - case "dom": - level.bot_gametype = maps/mp/bots/_bot_dom::bot_dom_think; - return 1; - case "koth": - level.bot_gametype = maps/mp/bots/_bot_koth::bot_koth_think; - return 1; - case "hq": - level.bot_gametype = maps/mp/bots/_bot_hq::bot_hq_think; - return 1; - case "conf": - level.bot_gametype = maps/mp/bots/_bot_conf::bot_conf_think; - return 1; - } - return 0; + level.bot_gametype = ::gametype_void; + + switch ( level.gametype ) + { + case "tdm": + case "dm": + return true; + case "ctf": + level.bot_gametype = maps\mp\bots\_bot_ctf::bot_ctf_think; + return true; + case "dem": + level.bot_gametype = maps\mp\bots\_bot_dem::bot_dem_think; + return true; + case "dom": + level.bot_gametype = maps\mp\bots\_bot_dom::bot_dom_think; + return true; + case "koth": + level.bot_gametype = maps\mp\bots\_bot_koth::bot_koth_think; + return true; + case "hq": + level.bot_gametype = maps\mp\bots\_bot_hq::bot_hq_think; + return true; + case "conf": + level.bot_gametype = maps\mp\bots\_bot_conf::bot_conf_think; + return true; + } + + return false; } -bot_get_difficulty() //checked matches cerberus output +bot_get_difficulty() { - level.bot_difficulty = "normal"; - difficulty = getdvarintdefault( "bot_difficulty", 1 ); - if ( difficulty == 0 ) - { - level.bot_difficulty = "easy"; - } - else if ( difficulty == 1 ) - { - level.bot_difficulty = "normal"; - } - else if ( difficulty == 2 ) - { - level.bot_difficulty = "hard"; - } - else if ( difficulty == 3 ) - { - level.bot_difficulty = "fu"; - } - return level.bot_difficulty; + if ( !isdefined( level.bot_difficulty ) ) + { + level.bot_difficulty = "normal"; + difficulty = getdvarintdefault( "bot_difficulty", 1 ); + + if ( difficulty == 0 ) + level.bot_difficulty = "easy"; + else if ( difficulty == 1 ) + level.bot_difficulty = "normal"; + else if ( difficulty == 2 ) + level.bot_difficulty = "hard"; + else if ( difficulty == 3 ) + level.bot_difficulty = "fu"; + } + + return level.bot_difficulty; } -bot_set_difficulty() //checked changed to match cerberus output +bot_set_difficulty() { - difficulty = bot_get_difficulty(); - if ( difficulty == "fu" ) - { - setdvar( "bot_MinDeathTime", "250" ); - setdvar( "bot_MaxDeathTime", "500" ); - setdvar( "bot_MinFireTime", "100" ); - setdvar( "bot_MaxFireTime", "250" ); - setdvar( "bot_PitchUp", "-5" ); - setdvar( "bot_PitchDown", "10" ); - setdvar( "bot_Fov", "160" ); - setdvar( "bot_MinAdsTime", "3000" ); - setdvar( "bot_MaxAdsTime", "5000" ); - setdvar( "bot_MinCrouchTime", "100" ); - setdvar( "bot_MaxCrouchTime", "400" ); - setdvar( "bot_TargetLeadBias", "2" ); - setdvar( "bot_MinReactionTime", "40" ); - setdvar( "bot_MaxReactionTime", "70" ); - setdvar( "bot_StrafeChance", "1" ); - setdvar( "bot_MinStrafeTime", "3000" ); - setdvar( "bot_MaxStrafeTime", "6000" ); - setdvar( "scr_help_dist", "512" ); - setdvar( "bot_AllowGrenades", "1" ); - setdvar( "bot_MinGrenadeTime", "1500" ); - setdvar( "bot_MaxGrenadeTime", "4000" ); - setdvar( "bot_MeleeDist", "70" ); - setdvar( "bot_YawSpeed", "2" ); - } - else if ( difficulty == "hard" ) - { - setdvar( "bot_MinDeathTime", "250" ); - setdvar( "bot_MaxDeathTime", "500" ); - setdvar( "bot_MinFireTime", "400" ); - setdvar( "bot_MaxFireTime", "600" ); - setdvar( "bot_PitchUp", "-5" ); - setdvar( "bot_PitchDown", "10" ); - setdvar( "bot_Fov", "100" ); - setdvar( "bot_MinAdsTime", "3000" ); - setdvar( "bot_MaxAdsTime", "5000" ); - setdvar( "bot_MinCrouchTime", "100" ); - setdvar( "bot_MaxCrouchTime", "400" ); - setdvar( "bot_TargetLeadBias", "2" ); - setdvar( "bot_MinReactionTime", "400" ); - setdvar( "bot_MaxReactionTime", "700" ); - setdvar( "bot_StrafeChance", "0.9" ); - setdvar( "bot_MinStrafeTime", "3000" ); - setdvar( "bot_MaxStrafeTime", "6000" ); - setdvar( "scr_help_dist", "384" ); - setdvar( "bot_AllowGrenades", "1" ); - setdvar( "bot_MinGrenadeTime", "1500" ); - setdvar( "bot_MaxGrenadeTime", "4000" ); - setdvar( "bot_MeleeDist", "70" ); - setdvar( "bot_YawSpeed", "1.4" ); - } - else if ( difficulty == "easy" ) - { - setdvar( "bot_MinDeathTime", "1000" ); - setdvar( "bot_MaxDeathTime", "2000" ); - setdvar( "bot_MinFireTime", "900" ); - setdvar( "bot_MaxFireTime", "1000" ); - setdvar( "bot_PitchUp", "-20" ); - setdvar( "bot_PitchDown", "40" ); - setdvar( "bot_Fov", "50" ); - setdvar( "bot_MinAdsTime", "3000" ); - setdvar( "bot_MaxAdsTime", "5000" ); - setdvar( "bot_MinCrouchTime", "4000" ); - setdvar( "bot_MaxCrouchTime", "6000" ); - setdvar( "bot_TargetLeadBias", "8" ); - setdvar( "bot_MinReactionTime", "1200" ); - setdvar( "bot_MaxReactionTime", "1600" ); - setdvar( "bot_StrafeChance", "0.1" ); - setdvar( "bot_MinStrafeTime", "3000" ); - setdvar( "bot_MaxStrafeTime", "6000" ); - setdvar( "scr_help_dist", "256" ); - setdvar( "bot_AllowGrenades", "0" ); - setdvar( "bot_MeleeDist", "40" ); - } - else - { - setdvar( "bot_MinDeathTime", "500" ); - setdvar( "bot_MaxDeathTime", "1000" ); - setdvar( "bot_MinFireTime", "600" ); - setdvar( "bot_MaxFireTime", "800" ); - setdvar( "bot_PitchUp", "-10" ); - setdvar( "bot_PitchDown", "20" ); - setdvar( "bot_Fov", "70" ); - setdvar( "bot_MinAdsTime", "3000" ); - setdvar( "bot_MaxAdsTime", "5000" ); - setdvar( "bot_MinCrouchTime", "2000" ); - setdvar( "bot_MaxCrouchTime", "4000" ); - setdvar( "bot_TargetLeadBias", "4" ); - setdvar( "bot_MinReactionTime", "600" ); - setdvar( "bot_MaxReactionTime", "800" ); - setdvar( "bot_StrafeChance", "0.6" ); - setdvar( "bot_MinStrafeTime", "3000" ); - setdvar( "bot_MaxStrafeTime", "6000" ); - setdvar( "scr_help_dist", "256" ); - setdvar( "bot_AllowGrenades", "1" ); - setdvar( "bot_MinGrenadeTime", "1500" ); - setdvar( "bot_MaxGrenadeTime", "4000" ); - setdvar( "bot_MeleeDist", "70" ); - setdvar( "bot_YawSpeed", "1.2" ); - } - if ( level.gametype == "oic" && difficulty == "fu" ) - { - setdvar( "bot_MinReactionTime", "400" ); - setdvar( "bot_MaxReactionTime", "500" ); - setdvar( "bot_MinAdsTime", "1000" ); - setdvar( "bot_MaxAdsTime", "2000" ); - } - if ( ( difficulty == "hard" || difficulty == "fu" ) && level.gametype == "oic" ) - { - setdvar( "bot_SprintDistance", "256" ); - } + difficulty = bot_get_difficulty(); + + if ( difficulty == "fu" ) + { + setdvar( "bot_MinDeathTime", "250" ); + setdvar( "bot_MaxDeathTime", "500" ); + setdvar( "bot_MinFireTime", "100" ); + setdvar( "bot_MaxFireTime", "250" ); + setdvar( "bot_PitchUp", "-5" ); + setdvar( "bot_PitchDown", "10" ); + setdvar( "bot_Fov", "160" ); + setdvar( "bot_MinAdsTime", "3000" ); + setdvar( "bot_MaxAdsTime", "5000" ); + setdvar( "bot_MinCrouchTime", "100" ); + setdvar( "bot_MaxCrouchTime", "400" ); + setdvar( "bot_TargetLeadBias", "2" ); + setdvar( "bot_MinReactionTime", "40" ); + setdvar( "bot_MaxReactionTime", "70" ); + setdvar( "bot_StrafeChance", "1" ); + setdvar( "bot_MinStrafeTime", "3000" ); + setdvar( "bot_MaxStrafeTime", "6000" ); + setdvar( "scr_help_dist", "512" ); + setdvar( "bot_AllowGrenades", "1" ); + setdvar( "bot_MinGrenadeTime", "1500" ); + setdvar( "bot_MaxGrenadeTime", "4000" ); + setdvar( "bot_MeleeDist", "70" ); + setdvar( "bot_YawSpeed", "2" ); + } + else if ( difficulty == "hard" ) + { + setdvar( "bot_MinDeathTime", "250" ); + setdvar( "bot_MaxDeathTime", "500" ); + setdvar( "bot_MinFireTime", "400" ); + setdvar( "bot_MaxFireTime", "600" ); + setdvar( "bot_PitchUp", "-5" ); + setdvar( "bot_PitchDown", "10" ); + setdvar( "bot_Fov", "100" ); + setdvar( "bot_MinAdsTime", "3000" ); + setdvar( "bot_MaxAdsTime", "5000" ); + setdvar( "bot_MinCrouchTime", "100" ); + setdvar( "bot_MaxCrouchTime", "400" ); + setdvar( "bot_TargetLeadBias", "2" ); + setdvar( "bot_MinReactionTime", "400" ); + setdvar( "bot_MaxReactionTime", "700" ); + setdvar( "bot_StrafeChance", "0.9" ); + setdvar( "bot_MinStrafeTime", "3000" ); + setdvar( "bot_MaxStrafeTime", "6000" ); + setdvar( "scr_help_dist", "384" ); + setdvar( "bot_AllowGrenades", "1" ); + setdvar( "bot_MinGrenadeTime", "1500" ); + setdvar( "bot_MaxGrenadeTime", "4000" ); + setdvar( "bot_MeleeDist", "70" ); + setdvar( "bot_YawSpeed", "1.4" ); + } + else if ( difficulty == "easy" ) + { + setdvar( "bot_MinDeathTime", "1000" ); + setdvar( "bot_MaxDeathTime", "2000" ); + setdvar( "bot_MinFireTime", "900" ); + setdvar( "bot_MaxFireTime", "1000" ); + setdvar( "bot_PitchUp", "-20" ); + setdvar( "bot_PitchDown", "40" ); + setdvar( "bot_Fov", "50" ); + setdvar( "bot_MinAdsTime", "3000" ); + setdvar( "bot_MaxAdsTime", "5000" ); + setdvar( "bot_MinCrouchTime", "4000" ); + setdvar( "bot_MaxCrouchTime", "6000" ); + setdvar( "bot_TargetLeadBias", "8" ); + setdvar( "bot_MinReactionTime", "1200" ); + setdvar( "bot_MaxReactionTime", "1600" ); + setdvar( "bot_StrafeChance", "0.1" ); + setdvar( "bot_MinStrafeTime", "3000" ); + setdvar( "bot_MaxStrafeTime", "6000" ); + setdvar( "scr_help_dist", "256" ); + setdvar( "bot_AllowGrenades", "0" ); + setdvar( "bot_MeleeDist", "40" ); + } + else + { + setdvar( "bot_MinDeathTime", "500" ); + setdvar( "bot_MaxDeathTime", "1000" ); + setdvar( "bot_MinFireTime", "600" ); + setdvar( "bot_MaxFireTime", "800" ); + setdvar( "bot_PitchUp", "-10" ); + setdvar( "bot_PitchDown", "20" ); + setdvar( "bot_Fov", "70" ); + setdvar( "bot_MinAdsTime", "3000" ); + setdvar( "bot_MaxAdsTime", "5000" ); + setdvar( "bot_MinCrouchTime", "2000" ); + setdvar( "bot_MaxCrouchTime", "4000" ); + setdvar( "bot_TargetLeadBias", "4" ); + setdvar( "bot_MinReactionTime", "600" ); + setdvar( "bot_MaxReactionTime", "800" ); + setdvar( "bot_StrafeChance", "0.6" ); + setdvar( "bot_MinStrafeTime", "3000" ); + setdvar( "bot_MaxStrafeTime", "6000" ); + setdvar( "scr_help_dist", "256" ); + setdvar( "bot_AllowGrenades", "1" ); + setdvar( "bot_MinGrenadeTime", "1500" ); + setdvar( "bot_MaxGrenadeTime", "4000" ); + setdvar( "bot_MeleeDist", "70" ); + setdvar( "bot_YawSpeed", "1.2" ); + } + + if ( level.gametype == "oic" && difficulty == "fu" ) + { + setdvar( "bot_MinReactionTime", "400" ); + setdvar( "bot_MaxReactionTime", "500" ); + setdvar( "bot_MinAdsTime", "1000" ); + setdvar( "bot_MaxAdsTime", "2000" ); + } + + if ( level.gametype == "oic" && ( difficulty == "hard" || difficulty == "fu" ) ) + setdvar( "bot_SprintDistance", "256" ); } bot_update_c4() { - if ( !isDefined( self.weaponobjectwatcherarray ) ) - { - return; - } - time = getTime(); - if ( time < self.bot.update_c4 ) - { - return; - } - self.bot.update_c4 = time + randomintrange( 1000, 2000 ); - radius = getweaponexplosionradius( "satchel_charge_mp" ); - foreach ( watcher in self.weaponobjectwatcherarray ) - { - if ( watcher.name == "satchel_charge" ) - { - break; - } - } - if ( watcher.objectarray.size ) - { - i = 0; - while ( i < watcherArray.objectarray.size ) - { - if ( !isDefined( watcher.objectarray[ i ] ) ) - { - i++; - continue; - } - enemy = bot_get_closest_enemy( watcher.objectarray[ i ].origin, 0 ); - if ( !isDefined( enemy ) ) - { - return; - } - if ( distancesquared( enemy.origin, watcher.objectarray[ i ].origin ) < radius * radius ) - { - self pressattackbutton( 1 ); - return; - } - i++; - } - } + if ( !isdefined( self.weaponobjectwatcherarray ) ) + return; + + time = gettime(); + + if ( time < self.bot.update_c4 ) + return; + + self.bot.update_c4 = time + randomintrange( 1000, 2000 ); + radius = getweaponexplosionradius( "satchel_charge_mp" ); + + foreach ( watcher in self.weaponobjectwatcherarray ) + { + if ( watcher.name == "satchel_charge" ) + break; + } + + if ( watcher.objectarray.size ) + { + foreach ( weapon in watcher.objectarray ) + { + if ( !isdefined( weapon ) ) + continue; + + enemy = bot_get_closest_enemy( weapon.origin, 0 ); + + if ( !isdefined( enemy ) ) + return; + + if ( distancesquared( enemy.origin, weapon.origin ) < radius * radius ) + { + self pressattackbutton( 1 ); + return; + } + } + } } -bot_update_launcher() //checked partially changed to match cerberus output //continues in foreach bad see github for more info +bot_update_launcher() { - time = getTime(); - if ( time < self.bot.update_launcher ) - { - return; - } - self.bot.update_launcher = time + randomintrange( 5000, 10000 ); - if ( !self maps/mp/bots/_bot_combat::bot_has_launcher() ) - { - return; - } - enemies = self getthreats( -1 ); - i = 0; - while ( i < enemies.size ) - { - if ( !target_istarget( enemies[ i ] ) ) - { - i++; - continue; - } - if ( maps/mp/bots/_bot_combat::threat_is_warthog( enemies[ i ] ) ) - { - i++; - continue; - } - if ( !maps/mp/bots/_bot_combat::threat_requires_rocket( enemies[ i ] ) ) - { - i++; - continue; - } - origin = self getplayercamerapos(); - angles = vectorToAngles( enemies[ i ].origin - origin ); - if ( angles[ 0 ] < 290 ) - { - i++; - continue; - } - if ( self botsighttracepassed( enemies[ i ] ) ) - { - self maps/mp/bots/_bot_combat::bot_lookat_entity( enemies[ i ] ); - return; - } - i++; - } + time = gettime(); + + if ( time < self.bot.update_launcher ) + return; + + self.bot.update_launcher = time + randomintrange( 5000, 10000 ); + + if ( !self maps\mp\bots\_bot_combat::bot_has_launcher() ) + return; + + enemies = self getthreats( -1 ); + + foreach ( enemy in enemies ) + { + if ( !target_istarget( enemy ) ) + continue; + + if ( maps\mp\bots\_bot_combat::threat_is_warthog( enemy ) ) + continue; + + if ( !maps\mp\bots\_bot_combat::threat_requires_rocket( enemy ) ) + continue; + + origin = self getplayercamerapos(); + angles = vectortoangles( enemy.origin - origin ); + + if ( angles[0] < 290 ) + continue; + + if ( self botsighttracepassed( enemy ) ) + { + self maps\mp\bots\_bot_combat::bot_lookat_entity( enemy ); + return; + } + } } bot_update_weapon() { - time = getTime(); - if ( time < self.bot.update_weapon ) - { - return; - } - self.bot.update_weapon = time + randomintrange( 5000, 7500 ); - weapon = self getcurrentweapon(); - ammo = self getweaponammoclip( weapon ) + self getweaponammostock( weapon ); - if ( weapon == "none" ) - { - return; - } - if ( self maps/mp/bots/_bot_combat::bot_can_reload() ) - { - frac = 0.5; - if ( maps/mp/bots/_bot_combat::bot_has_lmg() ) - { - frac = 0.25; - } - frac += randomfloatrange( -0.1, 0.1 ); - if ( maps/mp/bots/_bot_combat::bot_weapon_ammo_frac() < frac ) - { - self pressusebutton( 0.1 ); - return; - } - } - if ( ammo && !self maps/mp/bots/_bot_combat::bot_has_pistol() && !self maps/mp/bots/_bot_combat::bot_using_launcher() ) - { - return; - } - primaries = self getweaponslistprimaries(); - foreach ( primary in primaries ) - { - if ( primary == "knife_held_mp" ) - { - i++; - continue; - } - if ( ( self getweaponammoclip( primary ) || self getweaponammostock( primary ) ) && primary != weapon ) - { - self switchtoweapon( primary ); - return; - } - i++; - } + time = gettime(); + + if ( time < self.bot.update_weapon ) + return; + + self.bot.update_weapon = time + randomintrange( 5000, 7500 ); + weapon = self getcurrentweapon(); + ammo = self getweaponammoclip( weapon ) + self getweaponammostock( weapon ); + + if ( weapon == "none" ) + return; + + if ( self maps\mp\bots\_bot_combat::bot_can_reload() ) + { + frac = 0.5; + + if ( maps\mp\bots\_bot_combat::bot_has_lmg() ) + frac = 0.25; + + frac += randomfloatrange( -0.1, 0.1 ); + + if ( maps\mp\bots\_bot_combat::bot_weapon_ammo_frac() < frac ) + { + self pressusebutton( 0.1 ); + return; + } + } + + if ( ammo && !self maps\mp\bots\_bot_combat::bot_has_pistol() && !self maps\mp\bots\_bot_combat::bot_using_launcher() ) + return; + + primaries = self getweaponslistprimaries(); + + foreach ( primary in primaries ) + { + if ( primary == "knife_held_mp" ) + continue; + + if ( primary != weapon && ( self getweaponammoclip( primary ) || self getweaponammostock( primary ) ) ) + { + self switchtoweapon( primary ); + return; + } + } } -bot_update_crate() //checked partially changed to match cerberus output continue in foreach bad see github for more info +bot_update_crate() { - time = getTime(); - if ( time < self.bot.update_crate ) - { - return; - } - self.bot.update_crate = time + randomintrange( 1000, 3000 ); - self cancelgoal( "care package" ); - radius = getDvarFloat( "player_useRadius" ); - crates = getentarray( "care_package", "script_noteworthy" ); - i = 0; - while ( i < crates.size ) - { - if ( distancesquared( self.origin, crates[ i ].origin ) < radius * radius ) - { - if ( isDefined( crates[ i ].hacker ) ) - { - if ( crates[ i ].hacker == self ) - { - i++; - continue; - } - if ( crates[ i ].hacker.team == self.team ) - { - i++; - continue; - } - } - if ( crates[ i ].owner == self ) - { - time = ( level.crateownerusetime / 1000 ) + 0.5; - } - else - { - time = ( level.cratenonownerusetime / 1000 ) + 0.5; - } - self setstance( "crouch" ); - self addgoal( self.origin, 24, 4, "care package" ); - self pressusebutton( time ); - wait time; - self setstance( "stand" ); - self cancelgoal( "care package" ); - self.bot.update_crate = getTime() + randomintrange( 1000, 3000 ); - return; - } - i++; - } - if ( self getweaponammostock( "pda_hack_mp" ) ) - { - i = 0; - while ( i < crates.size ) - { - if ( !isDefined( crates[ i ].friendlyobjid ) ) - { - i++; - continue; - } - if ( isDefined( crates[ i ].hacker ) ) - { - if ( crates[ i ].hacker == self ) - { - i++; - continue; - } - else if ( crates[ i ].hacker.team == self.team ) - { - i++; - continue; - } - } - if ( self botsighttracepassed( crates[ i ] ) ) - { - self lookat( crates[ i ].origin ); - self addgoal( self.origin, 24, 4, "care package" ); - wait 0.75; - start = getTime(); - if ( !isDefined( crates[ i ].owner ) ) - { - self cancelgoal( "care package" ); - return; - } - if ( crates[ i ].owner == self ) - { - end = level.crateownerusetime + 1000; - i++; - continue; - } - end = level.cratenonownerusetime + 1000; - while ( getTime() < start + end ) - { - self pressattackbutton( 2 ); - wait 0.05; - } - self.bot.update_crate = getTime() + randomintrange( 1000, 3000 ); - self cancelgoal( "care package" ); - return; - } - i++; - } - } + time = gettime(); + + if ( time < self.bot.update_crate ) + return; + + self.bot.update_crate = time + randomintrange( 1000, 3000 ); + self cancelgoal( "care package" ); + radius = getdvarfloat( "player_useRadius" ); + crates = getentarray( "care_package", "script_noteworthy" ); + + foreach ( crate in crates ) + { + if ( distancesquared( self.origin, crate.origin ) < radius * radius ) + { + if ( isdefined( crate.hacker ) ) + { + if ( crate.hacker == self ) + continue; + + if ( crate.hacker.team == self.team ) + continue; + } + + if ( crate.owner == self ) + time = level.crateownerusetime / 1000 + 0.5; + else + time = level.cratenonownerusetime / 1000 + 0.5; + + self setstance( "crouch" ); + self addgoal( self.origin, 24, 4, "care package" ); + self pressusebutton( time ); + wait( time ); + self setstance( "stand" ); + self cancelgoal( "care package" ); + self.bot.update_crate = gettime() + randomintrange( 1000, 3000 ); + return; + } + } + + if ( self getweaponammostock( "pda_hack_mp" ) ) + { + foreach ( crate in crates ) + { + if ( !isdefined( crate.friendlyobjid ) ) + continue; + + if ( isdefined( crate.hacker ) ) + { + if ( crate.hacker == self ) + continue; + + if ( crate.hacker.team == self.team ) + continue; + } + + if ( self botsighttracepassed( crate ) ) + { + self lookat( crate.origin ); + self addgoal( self.origin, 24, 4, "care package" ); + wait 0.75; + start = gettime(); + + if ( !isdefined( crate.owner ) ) + { + self cancelgoal( "care package" ); + return; + } + + if ( crate.owner == self ) + end = level.crateownerusetime + 1000; + else + end = level.cratenonownerusetime + 1000; + + while ( gettime() < start + end ) + { + self pressattackbutton( 2 ); + wait 0.05; + } + + self.bot.update_crate = gettime() + randomintrange( 1000, 3000 ); + self cancelgoal( "care package" ); + return; + } + } + } } -bot_update_killstreak() //checked partially changed to match cerberus output see info about continues on the github +bot_update_killstreak() { - if ( !level.loadoutkillstreaksenabled ) - { - return; - } - time = getTime(); - if ( time < self.bot.update_killstreak ) - { - return; - } - if ( self isweaponviewonlylinked() ) - { - return; - } - /* + if ( !level.loadoutkillstreaksenabled ) + return; + + time = gettime(); + + if ( time < self.bot.update_killstreak ) + return; + + if ( self isweaponviewonlylinked() ) + return; /# - if ( !getDvarInt( "scr_botsAllowKillstreaks" ) ) - { - return; + if ( !getdvarint( "scr_botsAllowKillstreaks" ) ) + return; #/ - } - */ - self.bot.update_killstreak = time + randomintrange( 1000, 3000 ); - weapons = self getweaponslist(); - ks_weapon = undefined; - inventoryweapon = self getinventoryweapon(); - i = 0; - - while ( i < weapons.size ) - { - if ( self getweaponammoclip( weapons[ i ] ) <= 0 && !isDefined( inventoryweapon ) || weapons[ i ] != inventoryweapon ) - { - i++; - continue; - } - if ( iskillstreakweapon( weapons[ i ] ) ) - { - killstreak = maps/mp/killstreaks/_killstreaks::getkillstreakforweapon( weapons[ i ] ); - if ( self maps/mp/killstreaks/_killstreakrules::iskillstreakallowed( killstreak, self.team ) ) - { - ks_weapon = weapons[ i ]; - break; - } - } - i++; - } - if ( !isDefined( ks_weapon ) ) - { - return; - } - killstreak = maps/mp/killstreaks/_killstreaks::getkillstreakforweapon( ks_weapon ); - killstreak_ref = maps/mp/killstreaks/_killstreaks::getkillstreakmenuname( killstreak ); - if ( !isDefined( killstreak_ref ) ) - { - return; - } - switch( killstreak_ref ) - { - case "killstreak_helicopter_comlink": - bot_killstreak_location( 1, weapon ); - break; - case "killstreak_planemortar": - bot_killstreak_location( 3, weapon ); - break; - case "killstreak_ai_tank_drop": - case "killstreak_missile_drone": - case "killstreak_supply_drop": - self bot_use_supply_drop( weapon ); - break; - case "killstreak_auto_turret": - case "killstreak_microwave_turret": - case "killstreak_tow_turret": - self bot_turret_location( weapon ); - break; - case "killstreak_helicopter_player_gunner": - case "killstreak_qrdrone": - case "killstreak_rcbomb": - case "killstreak_remote_mortar": - return; - case "killstreak_remote_missile": - if ( ( time - self.spawntime ) < 6000 ) - { - self switchtoweapon( weapons[ i ] ); - self waittill( "weapon_change_complete" ); - wait 1.5; - self pressattackbutton(); - } - return; - default: - self switchtoweapon( weapons[ i ] ); - break; - } + self.bot.update_killstreak = time + randomintrange( 1000, 3000 ); + weapons = self getweaponslist(); + ks_weapon = undefined; + inventoryweapon = self getinventoryweapon(); + + foreach ( weapon in weapons ) + { + if ( self getweaponammoclip( weapon ) <= 0 && ( !isdefined( inventoryweapon ) || weapon != inventoryweapon ) ) + continue; + + if ( iskillstreakweapon( weapon ) ) + { + killstreak = maps\mp\killstreaks\_killstreaks::getkillstreakforweapon( weapon ); + + if ( self maps\mp\killstreaks\_killstreakrules::iskillstreakallowed( killstreak, self.team ) ) + { + ks_weapon = weapon; + break; + } + } + } + + if ( !isdefined( ks_weapon ) ) + return; + + killstreak = maps\mp\killstreaks\_killstreaks::getkillstreakforweapon( ks_weapon ); + killstreak_ref = maps\mp\killstreaks\_killstreaks::getkillstreakmenuname( killstreak ); + + if ( !isdefined( killstreak_ref ) ) + return; + + switch ( killstreak_ref ) + { + case "killstreak_helicopter_comlink": + bot_killstreak_location( 1, weapon ); + break; + case "killstreak_planemortar": + bot_killstreak_location( 3, weapon ); + break; + case "killstreak_supply_drop": + case "killstreak_missile_drone": + case "killstreak_ai_tank_drop": + self bot_use_supply_drop( weapon ); + break; + case "killstreak_tow_turret": + case "killstreak_microwave_turret": + case "killstreak_auto_turret": + self bot_turret_location( weapon ); + break; + case "killstreak_remote_mortar": + case "killstreak_rcbomb": + case "killstreak_qrdrone": + case "killstreak_helicopter_player_gunner": + return; + case "killstreak_remote_missile": + if ( time - self.spawntime < 6000 ) + { + self switchtoweapon( weapon ); + + self waittill( "weapon_change_complete" ); + + wait 1.5; + self pressattackbutton(); + } + + return; + default: + self switchtoweapon( weapon ); + break; + } } -bot_get_vehicle_entity() //checked changed to match cerberus output +bot_get_vehicle_entity() { - if ( self isremotecontrolling() ) - { - if ( isDefined( self.rcbomb ) ) - { - return self.rcbomb; - } - else if ( isDefined( self.qrdrone ) ) - { - return self.qrdrone; - } - } - return undefined; + if ( self isremotecontrolling() ) + { + if ( isdefined( self.rcbomb ) ) + return self.rcbomb; + else if ( isdefined( self.qrdrone ) ) + return self.qrdrone; + } + + return undefined; } -bot_rccar_think() //checked partially changed to match cerberus output check the github for info on continues +bot_rccar_think() { - self endon( "disconnect" ); - self endon( "rcbomb_done" ); - self endon( "weapon_object_destroyed" ); - level endon( "game_ended" ); - wait 2; - self thread bot_rccar_kill(); - for ( ;; ) - { - wait 0.5; - ent = self bot_get_vehicle_entity(); - if ( !isDefined( ent ) ) - { - return; - } - players = get_players(); - i = 0; - while ( i < players.size ) - { - player = players[ i ]; - if ( player == self ) - { - i++; - continue; - } - if ( !isalive( player ) ) - { - i++; - continue; - } - if ( level.teambased && player.team == self.team ) - { - i++; - continue; - } - /* + self endon( "disconnect" ); + self endon( "rcbomb_done" ); + self endon( "weapon_object_destroyed" ); + level endon( "game_ended" ); + wait 2; + self thread bot_rccar_kill(); + + for (;;) + { + wait 0.5; + ent = self bot_get_vehicle_entity(); + + if ( !isdefined( ent ) ) + return; + + players = get_players(); + + for ( i = 0; i < players.size; i++ ) + { + player = players[i]; + + if ( player == self ) + continue; + + if ( !isalive( player ) ) + continue; + + if ( level.teambased && player.team == self.team ) + continue; /# - if ( player isinmovemode( "ufo", "noclip" ) ) - { - i++; - continue; + if ( player isinmovemode( "ufo", "noclip" ) ) + continue; #/ - } - */ - if ( bot_get_difficulty() == "easy" ) - { - if ( distancesquared( ent.origin, player.origin ) < 262144 ) - { - self pressattackbutton(); - } - i++; - continue; - } - if ( distancesquared( ent.origin, player.origin ) < 40000 ) - { - self pressattackbutton(); - } - i++; - } - } + if ( bot_get_difficulty() == "easy" ) + { + if ( distancesquared( ent.origin, player.origin ) < 262144 ) + self pressattackbutton(); + + continue; + } + + if ( distancesquared( ent.origin, player.origin ) < 40000 ) + self pressattackbutton(); + } + } } -bot_rccar_kill() //checked matches cerberus output +bot_rccar_kill() { - self endon( "disconnect" ); - self endon( "rcbomb_done" ); - self endon( "weapon_object_destroyed" ); - level endon( "game_ended" ); - og_origin = self.origin; - for ( ;; ) - { - wait 1; - ent = bot_get_vehicle_entity(); - if ( !isDefined( ent ) ) - { - return; - } - if ( distancesquared( og_origin, ent.origin ) < 256 ) - { - wait 2; - if ( !isDefined( ent ) ) - { - return; - } - if ( distancesquared( og_origin, ent.origin ) < 256 ) - { - self pressattackbutton(); - } - } - og_origin = ent.origin; - } + self endon( "disconnect" ); + self endon( "rcbomb_done" ); + self endon( "weapon_object_destroyed" ); + level endon( "game_ended" ); + og_origin = self.origin; + + for (;;) + { + wait 1; + ent = bot_get_vehicle_entity(); + + if ( !isdefined( ent ) ) + return; + + if ( distancesquared( og_origin, ent.origin ) < 256 ) + { + wait 2; + + if ( !isdefined( ent ) ) + return; + + if ( distancesquared( og_origin, ent.origin ) < 256 ) + self pressattackbutton(); + } + + og_origin = ent.origin; + } } -bot_turret_location( weapon ) //checked matches cerberus output +bot_turret_location( weapon ) { - enemy = bot_get_closest_enemy( self.origin ); - if ( !isDefined( enemy ) ) - { - return; - } - forward = anglesToForward( self getplayerangles() ); - forward = vectornormalize( forward ); - delta = enemy.origin - self.origin; - delta = vectornormalize( delta ); - dot = vectordot( forward, delta ); - if ( dot < 0.707 ) - { - return; - } - node = getvisiblenode( self.origin, enemy.origin ); - if ( !isDefined( node ) ) - { - return; - } - if ( distancesquared( self.origin, node.origin ) < 262144 ) - { - return; - } - delta = node.origin - self.origin; - delta = vectornormalize( delta ); - dot = vectordot( forward, delta ); - if ( dot < 0.707 ) - { - return; - } - self thread weapon_switch_failsafe(); - self switchtoweapon( weapon ); - self waittill( "weapon_change_complete" ); - self freeze_player_controls( 1 ); - wait 1; - self freeze_player_controls( 0 ); - bot_use_item( weapon ); - self switchtoweapon( self.lastnonkillstreakweapon ); + enemy = bot_get_closest_enemy( self.origin ); + + if ( !isdefined( enemy ) ) + return; + + forward = anglestoforward( self getplayerangles() ); + forward = vectornormalize( forward ); + delta = enemy.origin - self.origin; + delta = vectornormalize( delta ); + dot = vectordot( forward, delta ); + + if ( dot < 0.707 ) + return; + + node = getvisiblenode( self.origin, enemy.origin ); + + if ( !isdefined( node ) ) + return; + + if ( distancesquared( self.origin, node.origin ) < 262144 ) + return; + + delta = node.origin - self.origin; + delta = vectornormalize( delta ); + dot = vectordot( forward, delta ); + + if ( dot < 0.707 ) + return; + + self thread weapon_switch_failsafe(); + self switchtoweapon( weapon ); + + self waittill( "weapon_change_complete" ); + + self freeze_player_controls( 1 ); + wait 1; + self freeze_player_controls( 0 ); + bot_use_item( weapon ); + self switchtoweapon( self.lastnonkillstreakweapon ); } -bot_use_supply_drop( weapon ) //checked changed to match cerberus output +bot_use_supply_drop( weapon ) { - if ( weapon == "inventory_supplydrop_mp" || weapon == "supplydrop_mp" ) - { - if ( ( getTime() - self.spawntime ) > 5000 ) - { - return; - } - } - yaw = ( 0, self.angles[ 1 ], 0 ); - dir = anglesToForward( yaw ); - dir = vectornormalize( dir ); - drop_point = self.origin + vectorScale( dir, 384 ); - end = drop_point + vectorScale( ( 0, 0, 0 ), 2048 ); - if ( !sighttracepassed( drop_point, end, 0, undefined ) ) - { - return; - } - if ( !sighttracepassed( self.origin, end, 0, undefined ) ) - { - return; - } - end = drop_point - vectorScale( ( 0, 0, 1 ), 32 ); - if ( bullettracepassed( drop_point, end, 0, undefined ) ) - { - return; - } - self addgoal( self.origin, 24, 4, "killstreak" ); - if ( weapon == "missile_drone_mp" || weapon == "inventory_missile_drone_mp" ) - { - self lookat( drop_point + vectorScale( ( 0, 0, 1 ), 384 ) ); - } - else - { - self lookat( drop_point ); - } - wait 0.5; - if ( self getcurrentweapon() != weapon ) - { - self thread weapon_switch_failsafe(); - self switchtoweapon( weapon ); - self waittill( "weapon_change_complete" ); - } - bot_use_item( weapon ); - self switchtoweapon( self.lastnonkillstreakweapon ); - self clearlookat(); - self cancelgoal( "killstreak" ); + if ( weapon == "inventory_supplydrop_mp" || weapon == "supplydrop_mp" ) + { + if ( gettime() - self.spawntime > 5000 ) + return; + } + + yaw = ( 0, self.angles[1], 0 ); + dir = anglestoforward( yaw ); + dir = vectornormalize( dir ); + drop_point = self.origin + vectorscale( dir, 384 ); + end = drop_point + vectorscale( ( 0, 0, 1 ), 2048.0 ); + + if ( !sighttracepassed( drop_point, end, 0, undefined ) ) + return; + + if ( !sighttracepassed( self.origin, end, 0, undefined ) ) + return; + + end = drop_point - vectorscale( ( 0, 0, 1 ), 32.0 ); + + if ( bullettracepassed( drop_point, end, 0, undefined ) ) + return; + + self addgoal( self.origin, 24, 4, "killstreak" ); + + if ( weapon == "missile_drone_mp" || weapon == "inventory_missile_drone_mp" ) + self lookat( drop_point + vectorscale( ( 0, 0, 1 ), 384.0 ) ); + else + self lookat( drop_point ); + + wait 0.5; + + if ( self getcurrentweapon() != weapon ) + { + self thread weapon_switch_failsafe(); + self switchtoweapon( weapon ); + + self waittill( "weapon_change_complete" ); + } + + bot_use_item( weapon ); + self switchtoweapon( self.lastnonkillstreakweapon ); + self clearlookat(); + self cancelgoal( "killstreak" ); } bot_use_item( weapon ) { - self pressattackbutton(); - wait 0.5; - for ( i = 0; i < 10; i++ ) - { - if ( self getcurrentweapon() == weapon || self getcurrentweapon() == "none" ) - { - self pressattackbutton(); - } - else - { - return; - } - wait 0.5; - } + self pressattackbutton(); + wait 0.5; + + for ( i = 0; i < 10; i++ ) + { + if ( self getcurrentweapon() == weapon || self getcurrentweapon() == "none" ) + self pressattackbutton(); + else + return; + + wait 0.5; + } } -bot_killstreak_location( num, weapon ) //checked changed to match cerberus output +bot_killstreak_location( num, weapon ) { - enemies = bot_get_enemies(); - if ( !enemies.size ) - { - return; - } - if ( !self switchtoweapon( weapon ) ) - { - return; - } - self waittill( "weapon_change" ); - self freeze_player_controls( 1 ); - wait_time = 1; - while ( !isDefined( self.selectinglocation ) || self.selectinglocation == 0 ) - { - wait 0.05; - wait_time -= 0.05; - if ( wait_time <= 0 ) - { - self freeze_player_controls( 0 ); - self switchtoweapon( self.lastnonkillstreakweapon ); - return; - } - } - wait 2; - for ( i = 0; i < num; i++ ) - { - enemies = bot_get_enemies(); - if ( enemies.size ) - { - enemy = random( enemies ); - self notify( "confirm_location" ); - } - wait 0.25; - } - self freeze_player_controls( 0 ); + enemies = bot_get_enemies(); + + if ( !enemies.size ) + return; + + if ( !self switchtoweapon( weapon ) ) + return; + + self waittill( "weapon_change" ); + + self freeze_player_controls( 1 ); + wait_time = 1; + + while ( !isdefined( self.selectinglocation ) || self.selectinglocation == 0 ) + { + wait 0.05; + wait_time -= 0.05; + + if ( wait_time <= 0 ) + { + self freeze_player_controls( 0 ); + self switchtoweapon( self.lastnonkillstreakweapon ); + return; + } + } + + wait 2; + + for ( i = 0; i < num; i++ ) + { + enemies = bot_get_enemies(); + + if ( enemies.size ) + { + enemy = random( enemies ); + self notify( "confirm_location", enemy.origin, 0 ); + } + + wait 0.25; + } + + self freeze_player_controls( 0 ); } -bot_killstreak_dangerous_think( origin, team, attacker ) //checked changed to match cerberus output +bot_killstreak_dangerous_think( origin, team, attacker ) { - if ( !level.teambased ) - { - return; - } - nodes = getnodesinradius( origin + vectorScale( ( 0, 0, 1 ), 384 ), 384, 0 ); - foreach ( node in nodes ) - { - if ( node isdangerous( team ) ) - { - return; - } - } - foreach ( node in nodes ) - { - node setdangerous( team, 1 ); - } - attacker wait_endon( 25, "death" ); - foreach ( node in nodes ) - { - node setdangerous( team, 0 ); - } + if ( !level.teambased ) + return; + + nodes = getnodesinradius( origin + vectorscale( ( 0, 0, 1 ), 384.0 ), 384, 0 ); + + foreach ( node in nodes ) + { + if ( node isdangerous( team ) ) + return; + } + + foreach ( node in nodes ) + node setdangerous( team, 1 ); + + attacker wait_endon( 25, "death" ); + + foreach ( node in nodes ) + node setdangerous( team, 0 ); } -weapon_switch_failsafe() //checked changed to match cerberus output +weapon_switch_failsafe() { - self endon( "death" ); - self endon( "disconnect" ); - self endon( "weapon_change_complete" ); - wait 10; - self notify( "weapon_change_complete" ); + self endon( "death" ); + self endon( "disconnect" ); + self endon( "weapon_change_complete" ); + wait 10; + self notify( "weapon_change_complete" ); } -bot_dive_to_prone( exit_stance ) //checked changed to match cerberus output +bot_dive_to_prone( exit_stance ) { - self pressdtpbutton(); - event = self waittill_any_timeout( 0.25, "dtp_start" ); - if ( event == "dtp_start" ) - { - self waittill( "dtp_end" ); - self setstance( "prone" ); - wait 0.35; - self setstance( exit_stance ); - } + self pressdtpbutton(); + event = self waittill_any_timeout( 0.25, "dtp_start" ); + + if ( event == "dtp_start" ) + { + self waittill( "dtp_end" ); + + self setstance( "prone" ); + wait 0.35; + self setstance( exit_stance ); + } } -gametype_void() //checked changed to match cerberus output +gametype_void() { + } -bot_debug_star( origin, seconds, color ) //didn't check dev call +bot_debug_star( origin, seconds, color ) { - /* /# - if ( !isDefined( seconds ) ) - { - seconds = 1; - } - if ( !isDefined( color ) ) - { - color = ( 0, 0, 0 ); - } - frames = int( 20 * seconds ); - debugstar( origin, frames, color ); + if ( !isdefined( seconds ) ) + seconds = 1; + + if ( !isdefined( color ) ) + color = ( 1, 0, 0 ); + + frames = int( 20 * seconds ); + debugstar( origin, frames, color ); #/ - */ } -bot_debug_circle( origin, radius, seconds, color ) //didn't check dev call +bot_debug_circle( origin, radius, seconds, color ) { - /* /# - if ( !isDefined( seconds ) ) - { - seconds = 1; - } - if ( !isDefined( color ) ) - { - color = ( 0, 0, 0 ); - } - frames = int( 20 * seconds ); - circle( origin, radius, color, 0, 1, frames ); + if ( !isdefined( seconds ) ) + seconds = 1; + + if ( !isdefined( color ) ) + color = ( 1, 0, 0 ); + + frames = int( 20 * seconds ); + circle( origin, radius, color, 0, 1, frames ); #/ - */ } -bot_debug_box( origin, mins, maxs, yaw, seconds, color ) //didn't check dev call +bot_debug_box( origin, mins, maxs, yaw, seconds, color ) { - /* /# - if ( !isDefined( yaw ) ) - { - yaw = 0; - } - if ( !isDefined( seconds ) ) - { - seconds = 1; - } - if ( !isDefined( color ) ) - { - color = ( 0, 0, 0 ); - } - frames = int( 20 * seconds ); - box( origin, mins, maxs, yaw, color, 1, 0, frames ); + if ( !isdefined( yaw ) ) + yaw = 0; + + if ( !isdefined( seconds ) ) + seconds = 1; + + if ( !isdefined( color ) ) + color = ( 1, 0, 0 ); + + frames = int( 20 * seconds ); + box( origin, mins, maxs, yaw, color, 1, 0, frames ); #/ - */ } -bot_devgui_think()//didn't check dev call -{ - /* -/# - self endon( "death" ); - self endon( "disconnect" ); - setdvar( "devgui_bot", "" ); - setdvar( "scr_bot_follow", "0" ); - for ( ;; ) - { - wait 1; - reset = 1; - switch( getDvar( "devgui_bot" ) ) - { - case "crosshair": - if ( getDvarInt( "scr_bot_follow" ) != 0 ) - { - iprintln( "Bot following enabled" ); - self thread bot_crosshair_follow(); - } - else - { - iprintln( "Bot following disabled" ); - self notify( "crosshair_follow_off" ); - setdvar( "bot_AllowMovement", "0" ); - } - break; - case "laststand": - setdvar( "scr_forcelaststand", "1" ); - self setperk( "specialty_pistoldeath" ); - self setperk( "specialty_finalstand" ); - self dodamage( self.health, self.origin ); - break; - case "": - default: - reset = 0; - break; - } - if ( reset ) - { - setdvar( "devgui_bot", "" ); - } -#/ - } - */ -} - -bot_system_devgui_think() //didn't check dev call +bot_devgui_think() { - /* /# - setdvar( "devgui_bot", "" ); - setdvar( "devgui_bot_weapon", "" ); - for ( ;; ) - { - wait 1; - reset = 1; - switch( getDvar( "devgui_bot" ) ) - { - case "spawn_friendly": - player = gethostplayer(); - team = player.team; - devgui_bot_spawn( team ); - break; - case "spawn_enemy": - player = gethostplayer(); - team = getenemyteamwithlowestplayercount( player.team ); - devgui_bot_spawn( team ); - break; - case "loadout": - case "player_weapon": - players = get_players(); - _a2692 = players; - _k2692 = getFirstArrayKey( _a2692 ); - while ( isDefined( _k2692 ) ) - { - player = _a2692[ _k2692 ]; - if ( !player maps/mp/_utility::is_bot() ) - { - } - else - { - host = gethostplayer(); - weapon = host getcurrentweapon(); - player maps/mp/gametypes/_weapons::detach_all_weapons(); - player takeallweapons(); - player giveweapon( weapon ); - player switchtoweapon( weapon ); - player setspawnweapon( weapon ); - player maps/mp/teams/_teams::set_player_model( player.team, weapon ); - } - _k2692 = getNextArrayKey( _a2692, _k2692 ); - } - case "routes": - devgui_debug_route(); - break; - case "": - default: - reset = 0; - break; - } - if ( reset ) - { - setdvar( "devgui_bot", "" ); - } + self endon( "death" ); + self endon( "disconnect" ); + setdvar( "devgui_bot", "" ); + setdvar( "scr_bot_follow", "0" ); + + for (;;) + { + wait 1; + reset = 1; + + switch ( getdvar( "devgui_bot" ) ) + { + case "crosshair": + if ( getdvarint( "scr_bot_follow" ) != 0 ) + { + iprintln( "Bot following enabled" ); + self thread bot_crosshair_follow(); + } + else + { + iprintln( "Bot following disabled" ); + self notify( "crosshair_follow_off" ); + setdvar( "bot_AllowMovement", "0" ); + } + + break; + case "laststand": + setdvar( "scr_forcelaststand", "1" ); + self setperk( "specialty_pistoldeath" ); + self setperk( "specialty_finalstand" ); + self dodamage( self.health, self.origin ); + break; + case "": + default: + reset = 0; + break; + } + + if ( reset ) + setdvar( "devgui_bot", "" ); + } #/ - } - } - */ } -bot_crosshair_follow() //didn't check dev call +bot_system_devgui_think() { - /* /# - self notify( "crosshair_follow_off" ); - self endon( "death" ); - self endon( "disconnect" ); - self endon( "crosshair_follow_off" ); - for ( ;; ) - { - wait 1; - setdvar( "bot_AllowMovement", "1" ); - setdvar( "bot_IgnoreHumans", "1" ); - setdvar( "bot_ForceStand", "1" ); - player = gethostplayerforbots(); - direction = player getplayerangles(); - direction_vec = anglesToForward( direction ); - eye = player geteye(); - scale = 8000; - direction_vec = ( direction_vec[ 0 ] * scale, direction_vec[ 1 ] * scale, direction_vec[ 2 ] * scale ); - trace = bullettrace( eye, eye + direction_vec, 0, undefined ); - origin = trace[ "position" ] + ( 0, 0, 0 ); - if ( distancesquared( self.origin, origin ) > 16384 ) - { - } + setdvar( "devgui_bot", "" ); + setdvar( "devgui_bot_weapon", "" ); + + for (;;) + { + wait 1; + reset = 1; + + switch ( getdvar( "devgui_bot" ) ) + { + case "spawn_friendly": + player = gethostplayer(); + team = player.team; + devgui_bot_spawn( team ); + break; + case "spawn_enemy": + player = gethostplayer(); + team = getenemyteamwithlowestplayercount( player.team ); + devgui_bot_spawn( team ); + break; + case "player_weapon": + case "loadout": + players = get_players(); + + foreach ( player in players ) + { + if ( !player is_bot() ) + continue; + + host = gethostplayer(); + weapon = host getcurrentweapon(); + player maps\mp\gametypes\_weapons::detach_all_weapons(); + player takeallweapons(); + player giveweapon( weapon ); + player switchtoweapon( weapon ); + player setspawnweapon( weapon ); + player maps\mp\teams\_teams::set_player_model( player.team, weapon ); + } + + break; + case "routes": + devgui_debug_route(); + break; + case "": + default: + reset = 0; + break; + } + + if ( reset ) + setdvar( "devgui_bot", "" ); + } #/ - } - */ } -bot_debug_patrol( node1, node2 ) //didn't check dev call +bot_crosshair_follow() { - /* /# - self endon( "death" ); - self endon( "debug_patrol" ); - for ( ;; ) - { - self addgoal( node1, 24, 4, "debug_route" ); - self waittill( "debug_route", result ); - if ( result == "failed" ) - { - self cancelgoal( "debug_route" ); - wait 5; - } - self addgoal( node2, 24, 4, "debug_route" ); - self waittill( "debug_route", result ); - if ( result == "failed" ) - { - self cancelgoal( "debug_route" ); - wait 5; - } + self notify( "crosshair_follow_off" ); + self endon( "death" ); + self endon( "disconnect" ); + self endon( "crosshair_follow_off" ); + + for (;;) + { + wait 1; + setdvar( "bot_AllowMovement", "1" ); + setdvar( "bot_IgnoreHumans", "1" ); + setdvar( "bot_ForceStand", "1" ); + player = gethostplayerforbots(); + direction = player getplayerangles(); + direction_vec = anglestoforward( direction ); + eye = player geteye(); + scale = 8000; + direction_vec = ( direction_vec[0] * scale, direction_vec[1] * scale, direction_vec[2] * scale ); + trace = bullettrace( eye, eye + direction_vec, 0, undefined ); + origin = trace["position"] + ( 0, 0, 0 ); + + if ( distancesquared( self.origin, origin ) > 16384 ) + { + + } + } #/ - } - */ } -devgui_debug_route() //didn't check dev call +bot_debug_patrol( node1, node2 ) { - /* /# - iprintln( "Choose nodes with 'A' or press 'B' to cancel" ); - nodes = maps/mp/gametypes/_dev::dev_get_node_pair(); - if ( !isDefined( nodes ) ) - { - iprintln( "Route Debug Cancelled" ); - return; - } - iprintln( "Sending bots to chosen nodes" ); - players = get_players(); - _a2804 = players; - _k2804 = getFirstArrayKey( _a2804 ); - while ( isDefined( _k2804 ) ) - { - player = _a2804[ _k2804 ]; - if ( !player maps/mp/_utility::is_bot() ) - { - } - else - { - player notify( "debug_patrol" ); - player thread bot_debug_patrol( nodes[ 0 ], nodes[ 1 ] ); - } - _k2804 = getNextArrayKey( _a2804, _k2804 ); + self endon( "death" ); + self endon( "debug_patrol" ); + + for (;;) + { + self addgoal( node1, 24, 4, "debug_route" ); + + self waittill( "debug_route", result ); + + if ( result == "failed" ) + { + self cancelgoal( "debug_route" ); + wait 5; + } + + self addgoal( node2, 24, 4, "debug_route" ); + + self waittill( "debug_route", result ); + + if ( result == "failed" ) + { + self cancelgoal( "debug_route" ); + wait 5; + } + } #/ - } - */ } -devgui_bot_spawn( team ) //didn't check dev call +devgui_debug_route() { - /* /# - player = gethostplayer(); - direction = player getplayerangles(); - direction_vec = anglesToForward( direction ); - eye = player geteye(); - scale = 8000; - direction_vec = ( direction_vec[ 0 ] * scale, direction_vec[ 1 ] * scale, direction_vec[ 2 ] * scale ); - trace = bullettrace( eye, eye + direction_vec, 0, undefined ); - direction_vec = player.origin - trace[ "position" ]; - direction = vectorToAngles( direction_vec ); - bot = addtestclient(); - if ( !isDefined( bot ) ) - { - println( "Could not add test client" ); - return; - } - bot.pers[ "isBot" ] = 1; - bot thread bot_spawn_think( team ); - yaw = direction[ 1 ]; - bot thread devgui_bot_spawn_think( trace[ "position" ], yaw ); + iprintln( "Choose nodes with 'A' or press 'B' to cancel" ); + nodes = maps\mp\gametypes\_dev::dev_get_node_pair(); + + if ( !isdefined( nodes ) ) + { + iprintln( "Route Debug Cancelled" ); + return; + } + + iprintln( "Sending bots to chosen nodes" ); + players = get_players(); + + foreach ( player in players ) + { + if ( !player is_bot() ) + continue; + + player notify( "debug_patrol" ); + player thread bot_debug_patrol( nodes[0], nodes[1] ); + } #/ - */ } -devgui_bot_spawn_think( origin, yaw ) //didn't check dev call +devgui_bot_spawn( team ) { - /* /# - self endon( "disconnect" ); - for ( ;; ) - { - self waittill( "spawned_player" ); - self setorigin( origin ); - angles = ( 0, yaw, 0 ); - self setplayerangles( angles ); + player = gethostplayer(); + direction = player getplayerangles(); + direction_vec = anglestoforward( direction ); + eye = player geteye(); + scale = 8000; + direction_vec = ( direction_vec[0] * scale, direction_vec[1] * scale, direction_vec[2] * scale ); + trace = bullettrace( eye, eye + direction_vec, 0, undefined ); + direction_vec = player.origin - trace["position"]; + direction = vectortoangles( direction_vec ); + bot = addtestclient(); + + if ( !isdefined( bot ) ) + { + println( "Could not add test client" ); + return; + } + + bot.pers["isBot"] = 1; + bot thread bot_spawn_think( team ); + yaw = direction[1]; + bot thread devgui_bot_spawn_think( trace["position"], yaw ); #/ - } - */ } +devgui_bot_spawn_think( origin, yaw ) +{ +/# + self endon( "disconnect" ); + for (;;) + { + self waittill( "spawned_player" ); - - - - - - - - + self setorigin( origin ); + angles = ( 0, yaw, 0 ); + self setplayerangles( angles ); + } +#/ +} diff --git a/Multiplayer Core/patch_mp/maps/mp/bots/_bot_combat.gsc b/Multiplayer Core/patch_mp/maps/mp/bots/_bot_combat.gsc index d67e1a2..b21c171 100644 --- a/Multiplayer Core/patch_mp/maps/mp/bots/_bot_combat.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/bots/_bot_combat.gsc @@ -1,1870 +1,1708 @@ -#include maps/mp/gametypes/_weapon_utils; -#include maps/mp/bots/_bot; -#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\bots\_bot; +#include maps\mp\gametypes\_weapon_utils; -bot_combat_think( damage, attacker, direction ) //checked partially changed to match cerberus output changed at own discretion +bot_combat_think( damage, attacker, direction ) { - self allowattack( 0 ); - self pressads( 0 ); - for ( ;; ) - { - if ( self atgoal( "enemy_patrol" ) ) - { - self cancelgoal( "enemy_patrol" ); - } - self maps/mp/bots/_bot::bot_update_failsafe(); - self maps/mp/bots/_bot::bot_update_crouch(); - self maps/mp/bots/_bot::bot_update_crate(); - if ( !bot_can_do_combat() ) - { - return; - } - difficulty = maps/mp/bots/_bot::bot_get_difficulty(); - /* + self allowattack( 0 ); + self pressads( 0 ); + + for (;;) + { + if ( self atgoal( "enemy_patrol" ) ) + self cancelgoal( "enemy_patrol" ); + + self maps\mp\bots\_bot::bot_update_failsafe(); + self maps\mp\bots\_bot::bot_update_crouch(); + self maps\mp\bots\_bot::bot_update_crate(); + + if ( !bot_can_do_combat() ) + return; + + difficulty = maps\mp\bots\_bot::bot_get_difficulty(); /# - if ( bot_has_enemy() ) - { - if ( getDvarInt( "bot_IgnoreHumans" ) ) - { - if ( isplayer( self.bot.threat.entity ) && !self.bot.threat.entity is_bot() ) - { - self bot_combat_idle(); + if ( bot_has_enemy() ) + { + if ( getdvarint( "bot_IgnoreHumans" ) ) + { + if ( isplayer( self.bot.threat.entity ) && !self.bot.threat.entity is_bot() ) + self bot_combat_idle(); + } + } #/ - } - } - } - */ - sight = bot_best_enemy(); - bot_select_weapon(); - ent = self.bot.threat.entity; - pos = self.bot.threat.position; - if ( !sight ) - { - if ( threat_is_player() ) - { - if ( distancesquared( self.origin, ent.origin ) < 65536 ) - { - prediction = self predictposition( ent, 4 ); - height = ent getplayerviewheight(); - self lookat( prediction + ( 0, 0, height ) ); - self addgoal( ent.origin, 24, 4, "enemy_patrol" ); - self allowattack( 0 ); - wait 0.05; - continue; - } - else - { - self addgoal( self.origin, 24, 3, "enemy_patrol" ); - if ( difficulty != "easy" && cointoss() ) - { - self bot_combat_throw_lethal( pos ); - self bot_combat_throw_tactical( pos ); - } - bot_combat_dead(); - self addgoal( pos, 24, 4, "enemy_patrol" ); - } - } - bot_combat_idle( damage, attacker, direction ); - return; - } - else if ( threat_dead() ) - { - bot_combat_dead(); - return; - } - bot_update_cover(); - bot_combat_main(); - if ( threat_is_turret() ) - { - bot_turret_set_dangerous( ent ); - bot_combat_throw_smoke( ent.origin ); - } - if ( !threat_is_turret() || threat_is_ai_tank() || threat_is_equipment() ) - { - bot_combat_throw_emp( ent.origin ); - bot_combat_throw_lethal( ent.origin ); - } - else if ( threat_is_qrdrone() ) - { - bot_combat_throw_emp( ent.origin ); - break; - } - else if ( threat_requires_rocket( ent ) ) - { - self cancelgoal( "enemy_patrol" ); - self addgoal( self.origin, 24, 4, "cover" ); - } - if ( difficulty == "easy" ) - { - wait 0.5; - continue; - } - if ( difficulty == "normal" ) - { - wait 0.25; - continue; - } - if ( difficulty == "hard" ) - { - wait 0.1; - continue; - } - wait 0.05; //fu difficulty - } + sight = bot_best_enemy(); + bot_select_weapon(); + ent = self.bot.threat.entity; + pos = self.bot.threat.position; + + if ( !sight ) + { + if ( threat_is_player() ) + { + if ( distancesquared( self.origin, ent.origin ) < 65536 ) + { + prediction = self predictposition( ent, 4 ); + height = ent getplayerviewheight(); + self lookat( prediction + ( 0, 0, height ) ); + self addgoal( ent.origin, 24, 4, "enemy_patrol" ); + self allowattack( 0 ); + wait 0.05; + continue; + } + else + { + self addgoal( self.origin, 24, 3, "enemy_patrol" ); + + if ( difficulty != "easy" && cointoss() ) + { + self bot_combat_throw_lethal( pos ); + self bot_combat_throw_tactical( pos ); + } + + bot_combat_dead(); + self addgoal( pos, 24, 4, "enemy_patrol" ); + } + } + + bot_combat_idle( damage, attacker, direction ); + return; + } + else if ( threat_dead() ) + { + bot_combat_dead(); + return; + } + + bot_update_cover(); + bot_combat_main(); + + if ( threat_is_turret() ) + { + bot_turret_set_dangerous( ent ); + bot_combat_throw_smoke( ent.origin ); + } + + if ( threat_is_turret() || threat_is_ai_tank() || threat_is_equipment() ) + { + bot_combat_throw_emp( ent.origin ); + bot_combat_throw_lethal( ent.origin ); + } + else if ( threat_is_qrdrone() ) + bot_combat_throw_emp( ent.origin ); + else if ( threat_requires_rocket( ent ) ) + { + self cancelgoal( "enemy_patrol" ); + self addgoal( self.origin, 24, 4, "cover" ); + } + + if ( difficulty == "easy" ) + { + wait 0.5; + continue; + } + + if ( difficulty == "normal" ) + { + wait 0.25; + continue; + } + + if ( difficulty == "hard" ) + { + wait 0.1; + continue; + } + + wait 0.05; + } } -bot_can_do_combat() //checked matches cerberus output +bot_can_do_combat() { - if ( self ismantling() || self isonladder() ) - { - return 0; - } - return 1; + if ( self ismantling() || self isonladder() ) + return false; + + return true; } -threat_dead() //checked changed at own discretion +threat_dead() { - if ( bot_has_enemy() ) - { - ent = self.bot.threat.entity; - if ( threat_is_turret() && is_true( ent.dead ) ) - { - return 1; - } - if ( threat_is_qrdrone() && is_true( ent.crash_accel ) ) - { - return 1; - } - if ( !isalive( ent ) ) - { - return 1; - } - return 0; - } - return 0; + if ( bot_has_enemy() ) + { + ent = self.bot.threat.entity; + + if ( threat_is_turret() ) + return isdefined( ent.dead ) && ent.dead; + else if ( threat_is_qrdrone() ) + return isdefined( ent.crash_accel ) && ent.crash_accel; + + return !isalive( ent ); + } + + return 1; } -bot_can_reload() //checked changed to match cerberus output +bot_can_reload() { - weapon = self getcurrentweapon(); - if ( weapon == "none" ) - { - return 0; - } - if ( !self getweaponammostock( weapon ) ) - { - return 0; - } - if ( self isreloading() || self isswitchingweapons() || self isthrowinggrenade() ) - { - return 0; - } - return 1; + weapon = self getcurrentweapon(); + + if ( weapon == "none" ) + return false; + + if ( !self getweaponammostock( weapon ) ) + return false; + + if ( self isreloading() || self isswitchingweapons() || self isthrowinggrenade() ) + return false; + + return true; } -bot_combat_idle( damage, attacker, direction ) //checked matches cerberus output +bot_combat_idle( damage, attacker, direction ) { - self pressads( 0 ); - self allowattack( 0 ); - self allowsprint( 1 ); - bot_clear_enemy(); - weapon = self getcurrentweapon(); - if ( bot_can_reload() ) - { - frac = 0.5; - if ( bot_has_lmg() ) - { - frac = 0.25; - } - frac += randomfloatrange( -0.1, 0.1 ); - if ( bot_weapon_ammo_frac() < frac ) - { - self pressusebutton( 0.1 ); - } - } - if ( isDefined( damage ) ) - { - bot_patrol_near_enemy( damage, attacker, direction ); - return; - } - self cancelgoal( "cover" ); - self cancelgoal( "flee" ); + self pressads( 0 ); + self allowattack( 0 ); + self allowsprint( 1 ); + bot_clear_enemy(); + weapon = self getcurrentweapon(); + + if ( bot_can_reload() ) + { + frac = 0.5; + + if ( bot_has_lmg() ) + frac = 0.25; + + frac += randomfloatrange( -0.1, 0.1 ); + + if ( bot_weapon_ammo_frac() < frac ) + self pressusebutton( 0.1 ); + } + + if ( isdefined( damage ) ) + { + bot_patrol_near_enemy( damage, attacker, direction ); + return; + } + + self cancelgoal( "cover" ); + self cancelgoal( "flee" ); } -bot_combat_dead( damage ) //checked matches cerberus output +bot_combat_dead( damage ) { - difficulty = maps/mp/bots/_bot::bot_get_difficulty(); - switch( difficulty ) - { - case "easy": - wait 0.75; - break; - case "normal": - wait 0.5; - break; - case "hard": - wait 0.25; - break; - case "fu": - wait 0.1; - break; - } - self allowattack( 0 ); - switch( difficulty ) - { - case "easy": - case "normal": - wait 1; - break; - case "hard": - wait_endon( 0.5, "damage" ); - break; - case "fu": - wait_endon( 0.25, "damage" ); - break; - } - bot_clear_enemy(); + difficulty = maps\mp\bots\_bot::bot_get_difficulty(); + + switch ( difficulty ) + { + case "easy": + wait 0.75; + break; + case "normal": + wait 0.5; + break; + case "hard": + wait 0.25; + break; + case "fu": + wait 0.1; + break; + } + + self allowattack( 0 ); + + switch ( difficulty ) + { + case "normal": + case "easy": + wait 1; + break; + case "hard": + wait_endon( 0.5, "damage" ); + break; + case "fu": + wait_endon( 0.25, "damage" ); + break; + } + + bot_clear_enemy(); } -bot_combat_main() //checked partially changed to match cerberus output changed at own discretion +bot_combat_main() { - weapon = self getcurrentweapon(); - currentammo = self getweaponammoclip( weapon ) + self getweaponammostock( weapon ); - if ( !currentammo || bot_has_melee_weapon() ) - { - if ( threat_is_player() || threat_is_dog() ) - { - bot_combat_melee( weapon ); - } - return; - } - time = getTime(); - if ( !bot_should_hip_fire() && self.bot.threat.dot > 0.96 ) - { - ads = 1; - } - difficulty = maps/mp/bots/_bot::bot_get_difficulty(); - if ( ads ) - { - self pressads( 1 ); - } - else - { - self pressads( 0 ); - } - if ( ads && self playerads() < 1 ) - { - ratio = int( floor( bot_get_converge_time() / bot_get_converge_rate() ) ); - step = ratio % 50; - self.bot.threat.time_aim_interval = ratio - step; - self.bot.threat.time_aim_correct = time; - ideal = bot_update_aim( 4 ); - bot_update_lookat( ideal, 0 ); - return; - } - frames = 4; - frames += randomintrange( 0, 3 ); - if ( difficulty != "fu" ) - { - if ( distancesquared( self.bot.threat.entity.origin, self.bot.threat.position ) > 225 ) - { - self.bot.threat.time_aim_correct = time; - if ( time > self.bot.threat.time_first_sight ) - { - self.bot.threat.time_first_sight = time - 100; - } - } - } - if ( time >= self.bot.threat.time_aim_correct ) - { - self.bot.threat.time_aim_correct += self.bot.threat.time_aim_interval; - frac = ( time - self.bot.threat.time_first_sight ) / bot_get_converge_time(); - frac = clamp( frac, 0, 1 ); - if ( !threat_is_player() ) - { - frac = 1; - } - self.bot.threat.aim_target = bot_update_aim( frames ); - self.bot.threat.position = self.bot.threat.entity.origin; - bot_update_lookat( self.bot.threat.aim_target, frac ); - } - if ( difficulty == "hard" || difficulty == "fu" ) - { - if ( bot_on_target( self.bot.threat.entity.origin, 30 ) ) - { - self allowattack( 1 ); - } - else - { - self allowattack( 0 ); - } - } - else if ( bot_on_target( self.bot.threat.aim_target, 45 ) ) - { - self allowattack( 1 ); - } - else - { - self allowattack( 0 ); - } - if ( threat_is_equipment() ) - { - if ( bot_on_target( self.bot.threat.entity.origin, 3 ) ) - { - self allowattack( 1 ); - } - else - { - self allowattack( 0 ); - } - } - if ( is_true( self.stingerlockstarted ) ) - { - self allowattack( self.stingerlockfinalized ); - return; - } - if ( threat_is_player() ) - { - if ( self iscarryingturret() && self.bot.threat.dot > 0 ) - { - self pressattackbutton(); - } - if ( self.bot.threat.dot > 0 && distance2dsquared( self.origin, self.bot.threat.entity.origin ) < bot_get_melee_range_sq() ) - { - self addgoal( self.bot.threat.entity.origin, 24, 4, "enemy_patrol" ); - self pressmelee(); - } - } - if ( threat_using_riotshield() ) - { - self bot_riotshield_think( self.bot.threat.entity ); - } - else if ( bot_has_shotgun() ) - { - self bot_shotgun_think(); - } + weapon = self getcurrentweapon(); + currentammo = self getweaponammoclip( weapon ) + self getweaponammostock( weapon ); + + if ( !currentammo || bot_has_melee_weapon() ) + { + if ( threat_is_player() || threat_is_dog() ) + bot_combat_melee( weapon ); + + return; + } + + time = gettime(); + ads = !bot_should_hip_fire() && self.bot.threat.dot > 0.96; + difficulty = maps\mp\bots\_bot::bot_get_difficulty(); + + if ( ads ) + self pressads( 1 ); + else + self pressads( 0 ); + + if ( ads && self playerads() < 1 ) + { + ratio = int( floor( bot_get_converge_time() / bot_get_converge_rate() ) ); + step = ratio % 50; + self.bot.threat.time_aim_interval = ratio - step; + self.bot.threat.time_aim_correct = time; + ideal = bot_update_aim( 4 ); + bot_update_lookat( ideal, 0 ); + return; + } + + frames = 4; + frames += randomintrange( 0, 3 ); + + if ( difficulty != "fu" ) + { + if ( distancesquared( self.bot.threat.entity.origin, self.bot.threat.position ) > 225 ) + { + self.bot.threat.time_aim_correct = time; + + if ( time > self.bot.threat.time_first_sight ) + self.bot.threat.time_first_sight = time - 100; + } + } + + if ( time >= self.bot.threat.time_aim_correct ) + { + self.bot.threat.time_aim_correct += self.bot.threat.time_aim_interval; + frac = ( time - self.bot.threat.time_first_sight ) / bot_get_converge_time(); + frac = clamp( frac, 0, 1 ); + + if ( !threat_is_player() ) + frac = 1; + + self.bot.threat.aim_target = bot_update_aim( frames ); + self.bot.threat.position = self.bot.threat.entity.origin; + bot_update_lookat( self.bot.threat.aim_target, frac ); + } + + if ( difficulty == "hard" || difficulty == "fu" ) + { + if ( bot_on_target( self.bot.threat.entity.origin, 30 ) ) + self allowattack( 1 ); + else + self allowattack( 0 ); + } + else if ( bot_on_target( self.bot.threat.aim_target, 45 ) ) + self allowattack( 1 ); + else + self allowattack( 0 ); + + if ( threat_is_equipment() ) + { + if ( bot_on_target( self.bot.threat.entity.origin, 3 ) ) + self allowattack( 1 ); + else + self allowattack( 0 ); + } + + if ( isdefined( self.stingerlockstarted ) && self.stingerlockstarted ) + { + self allowattack( self.stingerlockfinalized ); + return; + } + + if ( threat_is_player() ) + { + if ( self iscarryingturret() && self.bot.threat.dot > 0 ) + self pressattackbutton(); + + if ( self.bot.threat.dot > 0 && distance2dsquared( self.origin, self.bot.threat.entity.origin ) < bot_get_melee_range_sq() ) + { + self addgoal( self.bot.threat.entity.origin, 24, 4, "enemy_patrol" ); + self pressmelee(); + } + } + + if ( threat_using_riotshield() ) + self bot_riotshield_think( self.bot.threat.entity ); + else if ( bot_has_shotgun() ) + self bot_shotgun_think(); } -bot_combat_melee( weapon ) //checked partially changed to match cerberus output +bot_combat_melee( weapon ) { - if ( !threat_is_player() && !threat_is_dog() ) - { - threat_ignore( self.bot.threat.entity, 60 ); - self bot_clear_enemy(); - return; - } - self cancelgoal( "cover" ); - self pressads( 0 ); - self allowattack( 0 ); - for ( ;; ) - { - if ( !isalive( self.bot.threat.entity ) ) - { - self bot_clear_enemy(); - self cancelgoal( "enemy_patrol" ); - return; - } - if ( self isthrowinggrenade() || self isswitchingweapons() ) - { - self cancelgoal( "enemy_patrol" ); - return; - } - if ( !bot_has_melee_weapon() && self getweaponammoclip( weapon ) ) - { - self cancelgoal( "enemy_patrol" ); - return; - } - frames = 4; - prediction = self predictposition( self.bot.threat.entity, frames ); - if ( !isplayer( self.bot.threat.entity ) ) - { - height = self.bot.threat.entity getcentroid()[ 2 ] - prediction[ 2 ]; - return prediction + ( 0, 0, height ); - } - else - { - height = self.bot.threat.entity getplayerviewheight(); - } - self lookat( prediction + ( 0, 0, height ) ); - distsq = distance2dsquared( self.origin, prediction ); - dot = bot_dot_product( self.bot.threat.entity.origin ); - if ( dot > 0 && distsq < bot_get_melee_range_sq() ) - { - if ( self.bot.threat.entity getstance() == "prone" ) - { - self setstance( "crouch" ); - } - if ( weapon == "knife_held_mp" ) - { - self pressattackbutton(); - wait 0.1; - } - else - { - self pressmelee(); - wait 0.1; - } - } - goal = self getgoal( "enemy_patrol" ); - if ( !isDefined( goal ) || distancesquared( prediction, goal ) > bot_get_melee_range_sq() ) - { - if ( !findpath( self.origin, prediction, undefined, 0, 1 ) ) - { - threat_ignore( self.bot.threat.entity, 10 ); - self bot_clear_enemy(); - self cancelgoal( "enemy_patrol" ); - return; - } - if ( weapon == "riotshield_mp" ) - { - if ( maps/mp/bots/_bot::bot_get_difficulty() != "easy" ) - { - self setstance( "crouch" ); - self allowsprint( 0 ); - } - } - self addgoal( prediction, 4, 4, "enemy_patrol" ); - } - wait 0.05; - } + if ( !threat_is_player() && !threat_is_dog() ) + { + threat_ignore( self.bot.threat.entity, 60 ); + self bot_clear_enemy(); + return; + } + + self cancelgoal( "cover" ); + self pressads( 0 ); + self allowattack( 0 ); + + for (;;) + { + if ( !isalive( self.bot.threat.entity ) ) + { + self bot_clear_enemy(); + self cancelgoal( "enemy_patrol" ); + return; + } + + if ( self isthrowinggrenade() || self isswitchingweapons() ) + { + self cancelgoal( "enemy_patrol" ); + return; + } + + if ( !bot_has_melee_weapon() && self getweaponammoclip( weapon ) ) + { + self cancelgoal( "enemy_patrol" ); + return; + } + + frames = 4; + prediction = self predictposition( self.bot.threat.entity, frames ); + + if ( !isplayer( self.bot.threat.entity ) ) + { + height = self.bot.threat.entity getcentroid()[2] - prediction[2]; + return prediction + ( 0, 0, height ); + } + else + height = self.bot.threat.entity getplayerviewheight(); + + self lookat( prediction + ( 0, 0, height ) ); + distsq = distance2dsquared( self.origin, prediction ); + dot = bot_dot_product( self.bot.threat.entity.origin ); + + if ( dot > 0 && distsq < bot_get_melee_range_sq() ) + { + if ( self.bot.threat.entity getstance() == "prone" ) + self setstance( "crouch" ); + + if ( weapon == "knife_held_mp" ) + { + self pressattackbutton(); + wait 0.1; + } + else + { + self pressmelee(); + wait 0.1; + } + } + + goal = self getgoal( "enemy_patrol" ); + + if ( !isdefined( goal ) || distancesquared( prediction, goal ) > bot_get_melee_range_sq() ) + { + if ( !findpath( self.origin, prediction, undefined, 0, 1 ) ) + { + threat_ignore( self.bot.threat.entity, 10 ); + self bot_clear_enemy(); + self cancelgoal( "enemy_patrol" ); + return; + } + + if ( weapon == "riotshield_mp" ) + { + if ( maps\mp\bots\_bot::bot_get_difficulty() != "easy" ) + { + self setstance( "crouch" ); + self allowsprint( 0 ); + } + } + + self addgoal( prediction, 4, 4, "enemy_patrol" ); + } + + wait 0.05; + } } -bot_get_fov() //checked matches cerberus output +bot_get_fov() { - weapon = self getcurrentweapon(); - reduction = 1; - if ( weapon != "none" && isweaponscopeoverlay( weapon ) && self playerads() >= 1 ) - { - reduction = 0.25; - } - return self.bot.fov * reduction; + weapon = self getcurrentweapon(); + reduction = 1; + + if ( weapon != "none" && isweaponscopeoverlay( weapon ) && self playerads() >= 1 ) + reduction = 0.25; + + return self.bot.fov * reduction; } -bot_get_converge_time() //checked changed at own discretion +bot_get_converge_time() { - difficulty = maps/mp/bots/_bot::bot_get_difficulty(); - switch( difficulty ) - { - case "easy": - return 3500; - case "normal": - return 2000; - case "hard": - return 1500; - case "fu": - return 100; - default: - return 2000; - } + difficulty = maps\mp\bots\_bot::bot_get_difficulty(); + + switch ( difficulty ) + { + case "easy": + return 3500.0; + break; + case "normal": + return 2000; + break; + case "hard": + return 1500.0; + break; + case "fu": + return 100.0; + break; + } + + return 2000; } -bot_get_converge_rate() //checked changed at own discretion +bot_get_converge_rate() { - difficulty = maps/mp/bots/_bot::bot_get_difficulty(); - switch( difficulty ) - { - case "easy": - return 2; - case "normal": - return 4; - case "hard": - return 5; - case "fu": - return 7; - default: - return 4; - } + difficulty = maps\mp\bots\_bot::bot_get_difficulty(); + + switch ( difficulty ) + { + case "easy": + return 2; + break; + case "normal": + return 4; + break; + case "hard": + return 5; + break; + case "fu": + return 7; + break; + } + + return 4; } -bot_get_melee_range_sq() //checked changed at own discretion +bot_get_melee_range_sq() { - difficulty = maps/mp/bots/_bot::bot_get_difficulty(); - switch( difficulty ) - { - case "easy": - return 1600; - case "normal": - return 4900; - case "hard": - return 4900; - case "fu": - return 4900; - default: - return 4900; - } + difficulty = maps\mp\bots\_bot::bot_get_difficulty(); + + switch ( difficulty ) + { + case "easy": + return 1600; + break; + case "normal": + return 4900; + break; + case "hard": + return 4900; + break; + case "fu": + return 4900; + break; + } + + return 4900; } -bot_get_aim_error() //checked changed at own discretion +bot_get_aim_error() { - difficulty = maps/mp/bots/_bot::bot_get_difficulty(); - switch( difficulty ) - { - case "easy": - return 30; - case "normal": - return 20; - case "hard": - return 15; - case "fu": - return 2; - default: - return 20; - } + difficulty = maps\mp\bots\_bot::bot_get_difficulty(); + + switch ( difficulty ) + { + case "easy": + return 30; + break; + case "normal": + return 20; + break; + case "hard": + return 15; + break; + case "fu": + return 2; + break; + } + + return 20; } -bot_update_lookat( origin, frac ) //checked matches cerberus output +bot_update_lookat( origin, frac ) { - angles = vectorToAngles( origin - self.origin ); - right = anglesToRight( angles ); - error = bot_get_aim_error() * ( 1 - frac ); - if ( cointoss() ) - { - error *= -1; - } - height = origin[ 2 ] - self.bot.threat.entity.origin[ 2 ]; - height *= 1 - frac; - if ( cointoss() ) - { - height *= -1; - } - end = origin + ( right * error ); - end += ( 0, 0, height ); - red = 1 - frac; - green = frac; - self lookat( end ); + angles = vectortoangles( origin - self.origin ); + right = anglestoright( angles ); + error = bot_get_aim_error() * ( 1 - frac ); + + if ( cointoss() ) + error *= -1; + + height = origin[2] - self.bot.threat.entity.origin[2]; + height *= ( 1 - frac ); + + if ( cointoss() ) + height *= -1; + + end = origin + right * error; + end += ( 0, 0, height ); + red = 1 - frac; + green = frac; + self lookat( end ); } -bot_on_target( aim_target, radius ) //checked matches cerberus output +bot_on_target( aim_target, radius ) { - angles = self getplayerangles(); - forward = anglesToForward( angles ); - origin = self getplayercamerapos(); - len = distance( aim_target, origin ); - end = origin + ( forward * len ); - if ( distance2dsquared( aim_target, end ) < ( radius * radius ) ) - { - return 1; - } - return 0; + angles = self getplayerangles(); + forward = anglestoforward( angles ); + origin = self getplayercamerapos(); + len = distance( aim_target, origin ); + end = origin + forward * len; + + if ( distance2dsquared( aim_target, end ) < radius * radius ) + return true; + + return false; } -bot_dot_product( origin ) //checked matches cerberus output +bot_dot_product( origin ) { - angles = self getplayerangles(); - forward = anglesToForward( angles ); - delta = origin - self getplayercamerapos(); - delta = vectornormalize( delta ); - dot = vectordot( forward, delta ); - return dot; + angles = self getplayerangles(); + forward = anglestoforward( angles ); + delta = origin - self getplayercamerapos(); + delta = vectornormalize( delta ); + dot = vectordot( forward, delta ); + return dot; } -bot_has_enemy() //checked changed at own discretion +bot_has_enemy() { - if ( isDefined( self.bot.threat.entity ) ) - { - return 1; - } - return 0; + return isdefined( self.bot.threat.entity ); } -threat_is_player() //checked changed at own discretion +threat_is_player() { - ent = self.bot.threat.entity; - if ( isDefined( ent ) && isplayer( ent ) ) - { - return 1; - } - return 0; + ent = self.bot.threat.entity; + return isdefined( ent ) && isplayer( ent ); } -threat_is_dog() //checked changed at own discretion +threat_is_dog() { - ent = self.bot.threat.entity; - if ( isDefined( ent ) && isai( ent ) ) - { - return 1; - } - return 0; + ent = self.bot.threat.entity; + return isdefined( ent ) && isai( ent ); } -threat_is_turret() //checked changed at own discretion +threat_is_turret() { - ent = self.bot.threat.entity; - if ( isDefined( ent ) && ent.classname == "auto_turret" ) - { - return 1; - } - return 0; + ent = self.bot.threat.entity; + return isdefined( ent ) && ent.classname == "auto_turret"; } -threat_is_ai_tank() //checked changed at own discretion +threat_is_ai_tank() { - ent = self.bot.threat.entity; - if ( isDefined( ent ) && isDefined( ent.targetname ) && ent.targetname == "talon" ) - { - return 1; - } - return 0; + ent = self.bot.threat.entity; + return isdefined( ent ) && isdefined( ent.targetname ) && ent.targetname == "talon"; } -threat_is_qrdrone( ent ) //checked changed at own discretion +threat_is_qrdrone( ent ) { - if ( !isDefined( ent ) ) - { - ent = self.bot.threat.entity; - } - if ( isDefined( ent ) && isDefined( ent.helitype ) && ent.helitype == "qrdrone" ) - { - return 1; - } - return 0; + if ( !isdefined( ent ) ) + ent = self.bot.threat.entity; + + return isdefined( ent ) && isdefined( ent.helitype ) && ent.helitype == "qrdrone"; } -threat_using_riotshield() //checked changed at own discretion +threat_using_riotshield() { - if ( threat_is_player() ) - { - weapon = self.bot.threat.entity getcurrentweapon(); - if ( weapon == "riotshield_mp" ) - { - return ; - } - } - return 0; + if ( threat_is_player() ) + { + weapon = self.bot.threat.entity getcurrentweapon(); + return weapon == "riotshield_mp"; + } + + return 0; } -threat_is_equipment() //checked changed at own discretion +threat_is_equipment() { - ent = self.bot.threat.entity; - if ( !isDefined( ent ) ) - { - return 0; - } - if ( threat_is_player() ) - { - return 0; - } - if ( isDefined( ent.model ) && ent.model == "t6_wpn_tac_insert_world" ) - { - return 1; - } - if ( isDefined( ent.name ) && isweaponequipment( ent.name ) ) - { - return 1; - } - return 0; + ent = self.bot.threat.entity; + + if ( !isdefined( ent ) ) + return 0; + + if ( threat_is_player() ) + return 0; + + if ( isdefined( ent.model ) && ent.model == "t6_wpn_tac_insert_world" ) + return 1; + + return isdefined( ent.name ) && isweaponequipment( ent.name ); } -bot_clear_enemy() //checked matches cerberus output +bot_clear_enemy() { - self clearlookat(); - self.bot.threat.entity = undefined; + self clearlookat(); + self.bot.threat.entity = undefined; } -bot_best_enemy() //checked partially changed to match cerberus output did not change while loop to foreach see github for more info +bot_best_enemy() { - fov = bot_get_fov(); - ent = self.bot.threat.entity; - if ( isDefined( ent ) ) - { - if ( isplayer( ent ) || isai( ent ) ) - { - dot = bot_dot_product( ent.origin ); - if ( dot >= fov ) - { - if ( self botsighttracepassed( ent ) ) - { - self.bot.threat.time_recent_sight = getTime(); - self.bot.threat.dot = dot; - return 1; - } - } - } - } - enemies = self getthreats( fov ); - i = 0; - while ( i < enemies.size ) - { - if ( threat_should_ignore( enemies[ i ] ) ) - { - i++; - continue; - } - if ( !isplayer( enemies[ i ] ) && enemies[ i ].classname != "grenade" ) - { - if ( level.gametype == "hack" ) - { - if ( enemies[ i ].classname == "script_vehicle" ) - { - i++; - continue; - } - } - if ( enemies[ i ].classname == "auto_turret" ) - { - if ( isDefined( enemies[ i ].dead ) && enemies[ i ].dead || is_true( enemies[ i ].carried ) ) - { - i++; - continue; - } - if ( !is_true( enemies[ i ].turret_active ) ) - { - i++; - continue; - } - } - if ( threat_requires_rocket( enemies[ i ] ) ) - { - if ( !bot_has_launcher() ) - { - i++; - continue; - } - origin = self getplayercamerapos(); - angles = vectorToAngles( enemies[ i ].origin - origin ); - if ( angles[ 0 ] < 290 ) - { - threat_ignore( enemies[ i ], 3.5 ); - i++; - continue; - } - } - } - if ( self botsighttracepassed( enemies[ i ] ) ) - { - self.bot.threat.entity = enemies[ i ]; - self.bot.threat.time_first_sight = getTime(); - self.bot.threat.time_recent_sight = getTime(); - self.bot.threat.dot = bot_dot_product( enemies[ i ].origin ); - self.bot.threat.position = enemies[ i ].origin; - return 1; - } - i++; - } - return 0; + fov = bot_get_fov(); + ent = self.bot.threat.entity; + + if ( isdefined( ent ) ) + { + if ( isplayer( ent ) || isai( ent ) ) + { + dot = bot_dot_product( ent.origin ); + + if ( dot >= fov ) + { + if ( self botsighttracepassed( ent ) ) + { + self.bot.threat.time_recent_sight = gettime(); + self.bot.threat.dot = dot; + return true; + } + } + } + } + + enemies = self getthreats( fov ); + + foreach ( enemy in enemies ) + { + if ( threat_should_ignore( enemy ) ) + continue; + + if ( !isplayer( enemy ) && enemy.classname != "grenade" ) + { + if ( level.gametype == "hack" ) + { + if ( enemy.classname == "script_vehicle" ) + continue; + } + + if ( enemy.classname == "auto_turret" ) + { + if ( isdefined( enemy.dead ) && enemy.dead || isdefined( enemy.carried ) && enemy.carried ) + continue; + + if ( !( isdefined( enemy.turret_active ) && enemy.turret_active ) ) + continue; + } + + if ( threat_requires_rocket( enemy ) ) + { + if ( !bot_has_launcher() ) + continue; + + origin = self getplayercamerapos(); + angles = vectortoangles( enemy.origin - origin ); + + if ( angles[0] < 290 ) + { + threat_ignore( enemy, 3.5 ); + continue; + } + } + } + + if ( self botsighttracepassed( enemy ) ) + { + self.bot.threat.entity = enemy; + self.bot.threat.time_first_sight = gettime(); + self.bot.threat.time_recent_sight = gettime(); + self.bot.threat.dot = bot_dot_product( enemy.origin ); + self.bot.threat.position = enemy.origin; + return true; + } + } + + return false; } -threat_requires_rocket( enemy ) //checked changed to match cerberus output +threat_requires_rocket( enemy ) { - if ( !isDefined( enemy ) || isplayer( enemy ) ) - { - return 0; - } - if ( isDefined( enemy.helitype ) && enemy.helitype == "qrdrone" ) - { - return 0; - } - if ( isDefined( enemy.targetname ) ) - { - if ( enemy.targetname == "remote_mortar" ) - { - return 1; - } - else if ( enemy.targetname == "uav" || enemy.targetname == "counteruav" ) - { - return 1; - } - } - if ( enemy.classname == "script_vehicle" && enemy.vehicleclass == "helicopter" ) - { - return 1; - } - return 0; + if ( !isdefined( enemy ) || isplayer( enemy ) ) + return false; + + if ( isdefined( enemy.helitype ) && enemy.helitype == "qrdrone" ) + return false; + + if ( isdefined( enemy.targetname ) ) + { + if ( enemy.targetname == "remote_mortar" ) + return true; + else if ( enemy.targetname == "uav" || enemy.targetname == "counteruav" ) + return true; + } + + if ( enemy.classname == "script_vehicle" && enemy.vehicleclass == "helicopter" ) + return true; + + return false; } -threat_is_warthog( enemy ) //checked matches cerberus output +threat_is_warthog( enemy ) { - if ( !isDefined( enemy ) || isplayer( enemy ) ) - { - return 0; - } - if ( enemy.classname == "script_vehicle" && enemy.vehicleclass == "plane" ) - { - return 1; - } - return 0; + if ( !isdefined( enemy ) || isplayer( enemy ) ) + return false; + + if ( enemy.classname == "script_vehicle" && enemy.vehicleclass == "plane" ) + return true; + + return false; } -threat_should_ignore( entity ) //checked matches cerberus output +threat_should_ignore( entity ) { - ignore_time = self.bot.ignore_entity[ entity getentitynumber() ]; - if ( isDefined( ignore_time ) ) - { - if ( getTime() < ignore_time ) - { - return 1; - } - } - return 0; + ignore_time = self.bot.ignore_entity[entity getentitynumber()]; + + if ( isdefined( ignore_time ) ) + { + if ( gettime() < ignore_time ) + return true; + } + + return false; } -threat_ignore( entity, secs ) //checked matches cerberus output +threat_ignore( entity, secs ) { - self.bot.ignore_entity[ entity getentitynumber() ] = getTime() + secs * 1000; + self.bot.ignore_entity[entity getentitynumber()] = gettime() + secs * 1000; } -bot_update_aim( frames ) //checked matches cerberus output +bot_update_aim( frames ) { - ent = self.bot.threat.entity; - prediction = self predictposition( ent, frames ); - if ( bot_using_launcher() && !threat_requires_rocket( ent ) ) - { - return prediction - ( 0, 0, randomintrange( 0, 10 ) ); - } - if ( !threat_is_player() ) - { - height = ent getcentroid()[ 2 ] - prediction[ 2 ]; - return prediction + ( 0, 0, height ); - } - height = ent getplayerviewheight(); - if ( threat_using_riotshield() ) - { - dot = ent bot_dot_product( self.origin ); - if ( dot > 0.8 && ent getstance() == "stand" ) - { - return prediction + vectorScale( ( 0, 0, 1 ), 5 ); - } - } - torso = prediction + ( 0, 0, height / 1.6 ); - return torso; + ent = self.bot.threat.entity; + prediction = self predictposition( ent, frames ); + + if ( bot_using_launcher() && !threat_requires_rocket( ent ) ) + return prediction - ( 0, 0, randomintrange( 0, 10 ) ); + + if ( !threat_is_player() ) + { + height = ent getcentroid()[2] - prediction[2]; + return prediction + ( 0, 0, height ); + } + + height = ent getplayerviewheight(); + + if ( threat_using_riotshield() ) + { + dot = ent bot_dot_product( self.origin ); + + if ( dot > 0.8 && ent getstance() == "stand" ) + return prediction + vectorscale( ( 0, 0, 1 ), 5.0 ); + } + + torso = prediction + ( 0, 0, height / 1.6 ); + return torso; } -bot_update_cover() //checked partially changed to match cerberus output did not change while loop to foreach see the github for more info +bot_update_cover() { - if ( maps/mp/bots/_bot::bot_get_difficulty() == "easy" ) - { - return; - } - if ( bot_has_melee_weapon() ) - { - self cancelgoal( "cover" ); - self cancelgoal( "flee" ); - return; - } - if ( threat_using_riotshield() ) - { - self cancelgoal( "enemy_patrol" ); - self cancelgoal( "flee" ); - return; - } - enemy = self.bot.threat.entity; - if ( threat_is_turret() && !bot_has_sniper() && !bot_has_melee_weapon() ) - { - goal = enemy turret_get_attack_node(); - if ( isDefined( goal ) ) - { - self cancelgoal( "enemy_patrol" ); - self addgoal( goal, 24, 3, "cover" ); - } - } - if ( !isplayer( enemy ) ) - { - return; - } - dot = enemy bot_dot_product( self.origin ); - if ( dot < 0.8 && !bot_has_shotgun() ) - { - self cancelgoal( "cover" ); - self cancelgoal( "flee" ); - return; - } - ammo_frac = bot_weapon_ammo_frac(); - health_frac = bot_health_frac(); - cover_score = dot - ammo_frac - health_frac; - if ( bot_should_hip_fire() && !bot_has_shotgun() ) - { - cover_score += 1; - } - if ( cover_score > 0.25 ) - { - nodes = getnodesinradiussorted( self.origin, 1024, 256, 512, "Path", 8 ); - nearest = bot_nearest_node( enemy.origin ); - if ( isDefined( nearest ) && !self hasgoal( "flee" ) ) - { - foreach ( node in nodes ) - { - if ( !nodesvisible( nearest, node ) && !nodescanpath( nearest, node ) ) - { - self cancelgoal( "cover" ); - self cancelgoal( "enemy_patrol" ); - self addgoal( node, 24, 4, "flee" ); - return; - } - } - } - } - else if ( cover_score > -0.25 ) - { - if ( self hasgoal( "cover" ) ) - { - return; - } - nodes = getnodesinradiussorted( self.origin, 512, 0, 256, "Cover" ); - if ( !nodes.size ) - { - nodes = getnodesinradiussorted( self.origin, 256, 0, 256, "Path", 8 ); - } - nearest = bot_nearest_node( enemy.origin ); - if ( isDefined( nearest ) ) - { - i = 0; - while ( i < nodes.size ) - { - if ( !canclaimnode( nodes[ i ], self.team ) ) - { - i++; - continue; - } - else if ( nodes[ i ].type != "Path" && !within_fov( nodes[ i ].origin, nodes[ i ].angles, enemy.origin, bot_get_fov() ) ) - { - i++; - continue; - } - else - { - if ( !nodescanpath( nearest, nodes[ i ] ) && nodesvisible( nearest, nodes[ i ] ) ) - { - if ( nodes[ i ].type == "Cover Left" ) - { - right = anglesToRight( nodes[ i ].angles ); - dir = vectorScale( right, 16 ); - node = nodes[ i ].origin - dir; - } - else if ( nodes[ i ].type == "Cover Right" ) - { - right = anglesToRight( nodes[ i ].angles ); - dir = vectorScale( right, 16 ); - node = nodes[ i ].origin + dir; - } - self cancelgoal( "flee" ); - self cancelgoal( "enemy_patrol" ); - self addgoal( nodes[ i ], 8, 4, "cover" ); - return; - } - } - i++; - } - } - } - else if ( bot_has_shotgun() ) - { - self addgoal( enemy.origin, 24, 4, "cover" ); - } + if ( maps\mp\bots\_bot::bot_get_difficulty() == "easy" ) + return; + + if ( bot_has_melee_weapon() ) + { + self cancelgoal( "cover" ); + self cancelgoal( "flee" ); + return; + } + + if ( threat_using_riotshield() ) + { + self cancelgoal( "enemy_patrol" ); + self cancelgoal( "flee" ); + return; + } + + enemy = self.bot.threat.entity; + + if ( threat_is_turret() && !bot_has_sniper() && !bot_has_melee_weapon() ) + { + goal = enemy turret_get_attack_node(); + + if ( isdefined( goal ) ) + { + self cancelgoal( "enemy_patrol" ); + self addgoal( goal, 24, 3, "cover" ); + } + } + + if ( !isplayer( enemy ) ) + return; + + dot = enemy bot_dot_product( self.origin ); + + if ( dot < 0.8 && !bot_has_shotgun() ) + { + self cancelgoal( "cover" ); + self cancelgoal( "flee" ); + return; + } + + ammo_frac = bot_weapon_ammo_frac(); + health_frac = bot_health_frac(); + cover_score = dot - ammo_frac - health_frac; + + if ( bot_should_hip_fire() && !bot_has_shotgun() ) + cover_score += 1; + + if ( cover_score > 0.25 ) + { + nodes = getnodesinradiussorted( self.origin, 1024, 256, 512, "Path", 8 ); + nearest = bot_nearest_node( enemy.origin ); + + if ( isdefined( nearest ) && !self hasgoal( "flee" ) ) + { + foreach ( node in nodes ) + { + if ( !nodesvisible( nearest, node ) && !nodescanpath( nearest, node ) ) + { + self cancelgoal( "cover" ); + self cancelgoal( "enemy_patrol" ); + self addgoal( node, 24, 4, "flee" ); + return; + } + } + } + } + else if ( cover_score > -0.25 ) + { + if ( self hasgoal( "cover" ) ) + return; + + nodes = getnodesinradiussorted( self.origin, 512, 0, 256, "Cover" ); + + if ( !nodes.size ) + nodes = getnodesinradiussorted( self.origin, 256, 0, 256, "Path", 8 ); + + nearest = bot_nearest_node( enemy.origin ); + + if ( isdefined( nearest ) ) + { + foreach ( node in nodes ) + { + if ( !canclaimnode( node, self.team ) ) + continue; + + if ( node.type != "Path" && !within_fov( node.origin, node.angles, enemy.origin, bot_get_fov() ) ) + continue; + + if ( !nodescanpath( nearest, node ) && nodesvisible( nearest, node ) ) + { + if ( node.type == "Cover Left" ) + { + right = anglestoright( node.angles ); + dir = vectorscale( right, 16 ); + node = node.origin - dir; + } + else if ( node.type == "Cover Right" ) + { + right = anglestoright( node.angles ); + dir = vectorscale( right, 16 ); + node = node.origin + dir; + } + + self cancelgoal( "flee" ); + self cancelgoal( "enemy_patrol" ); + self addgoal( node, 8, 4, "cover" ); + return; + } + } + } + } + else if ( bot_has_shotgun() ) + self addgoal( enemy.origin, 24, 4, "cover" ); } -bot_update_attack( enemy, dot_from, dot_to, sight, aim_target ) //checked matches cerberus output +bot_update_attack( enemy, dot_from, dot_to, sight, aim_target ) { - self allowattack( 0 ); - self pressads( 0 ); - if ( sight == 0 ) - { - return; - } - weapon = self getcurrentweapon(); - if ( weapon == "none" ) - { - return; - } - radius = 50; - if ( dot_to > 0.9 ) - { - self pressads( 1 ); - } - ads = 1; - if ( bot_should_hip_fire() ) - { - self pressads( 0 ); - ads = 0; - radius = 15; - } - if ( isweaponscopeoverlay( weapon ) && ads ) - { - if ( self playerads() < 1 ) - { - self.bot.time_ads = getTime(); - } - if ( getTime() < ( self.bot.time_ads + 1000 ) ) - { - return; - } - } - if ( !ads || self playerads() >= 1 ) - { - self allowattack( 1 ); - } + self allowattack( 0 ); + self pressads( 0 ); + + if ( sight == 0 ) + return; + + weapon = self getcurrentweapon(); + + if ( weapon == "none" ) + return; + + radius = 50; + + if ( dot_to > 0.9 ) + self pressads( 1 ); + + ads = 1; + + if ( bot_should_hip_fire() ) + { + self pressads( 0 ); + ads = 0; + radius = 15; + } + + if ( isweaponscopeoverlay( weapon ) && ads ) + { + if ( self playerads() < 1 ) + self.bot.time_ads = gettime(); + + if ( gettime() < self.bot.time_ads + 1000 ) + return; + } + + if ( !ads || self playerads() >= 1 ) + self allowattack( 1 ); } -bot_weapon_ammo_frac() //checked matches cerberus output +bot_weapon_ammo_frac() { - if ( self isreloading() || self isswitchingweapons() ) - { - return 0; - } - weapon = self getcurrentweapon(); - if ( weapon == "none" ) - { - return 1; - } - total = weaponclipsize( weapon ); - if ( total <= 0 ) - { - return 1; - } - current = self getweaponammoclip( weapon ); - return current / total; + if ( self isreloading() || self isswitchingweapons() ) + return 0; + + weapon = self getcurrentweapon(); + + if ( weapon == "none" ) + return 1; + + total = weaponclipsize( weapon ); + + if ( total <= 0 ) + return 1; + + current = self getweaponammoclip( weapon ); + return current / total; } -bot_select_weapon() //checked partially changed to match cerberus output did not change while loop to foreach see github for more info +bot_select_weapon() { - if ( self isthrowinggrenade() || self isswitchingweapons() || self isreloading() ) - { - return; - } - if ( !self isonground() ) - { - return; - } - ent = self.bot.threat.entity; - if ( !isDefined( ent ) ) - { - return; - } - primaries = self getweaponslistprimaries(); - weapon = self getcurrentweapon(); - stock = self getweaponammostock( weapon ); - clip = self getweaponammoclip( weapon ); - if ( weapon == "none" ) - { - return; - } - if ( threat_requires_rocket( ent ) || threat_is_qrdrone() ) - { - if ( !bot_using_launcher() ) - { - i = 0; - while ( i < primaries.size ) - { - if ( !self getweaponammoclip( primaries[ i ] ) && !self getweaponammostock( primaries[ i ] ) ) - { - i++; - continue; - } - if ( primaries[ i ] == "smaw_mp" || primaries[ i ] == "fhj18_mp" ) - { - self switchtoweapon( primaries[ i ] ); - return; - } - i++; - } - } - else if ( !clip && !stock && !threat_is_qrdrone() ) - { - threat_ignore( ent, 5 ); - } - return; - } - else if ( weapon == "fhj18_mp" && !target_istarget( ent ) ) - { - foreach ( primary in primaries ) - { - if ( primary != weapon ) - { - self switchtoweapon( primary ); - return; - } - } - return; - } - if ( !clip ) - { - if ( stock ) - { - if ( weaponhasattachment( weapon, "fastreload" ) ) - { - return; - } - } - i = 0; - while ( i < primaries.size ) - { - if ( primaries[ i ] == weapon || primaries[ i ] == "fhj18_mp" ) - { - i++; - continue; - } - if ( self getweaponammoclip( primaries[ i ] ) ) - { - self switchtoweapon( primaries[ i ] ); - return; - } - i++; - } - if ( bot_using_launcher() || bot_has_lmg() ) - { - i = 0; - while ( i < primaries.size ) - { - if ( primaries[ i ] == weapon || primaries[ i ] == "fhj18_mp" ) - { - i++; - continue; - } - else - { - self switchtoweapon( primaries[ i ] ); - return; - } - i++; - } - } - } + if ( self isthrowinggrenade() || self isswitchingweapons() || self isreloading() ) + return; + + if ( !self isonground() ) + return; + + ent = self.bot.threat.entity; + + if ( !isdefined( ent ) ) + return; + + primaries = self getweaponslistprimaries(); + weapon = self getcurrentweapon(); + stock = self getweaponammostock( weapon ); + clip = self getweaponammoclip( weapon ); + + if ( weapon == "none" ) + return; + + if ( threat_requires_rocket( ent ) || threat_is_qrdrone() ) + { + if ( !bot_using_launcher() ) + { + foreach ( primary in primaries ) + { + if ( !self getweaponammoclip( primary ) && !self getweaponammostock( primary ) ) + continue; + + if ( primary == "smaw_mp" || primary == "fhj18_mp" ) + { + self switchtoweapon( primary ); + return; + } + } + } + else if ( !clip && !stock && !threat_is_qrdrone() ) + threat_ignore( ent, 5 ); + + return; + } + else if ( weapon == "fhj18_mp" && !target_istarget( ent ) ) + { + foreach ( primary in primaries ) + { + if ( primary != weapon ) + { + self switchtoweapon( primary ); + return; + } + } + + return; + } + + if ( !clip ) + { + if ( stock ) + { + if ( weaponhasattachment( weapon, "fastreload" ) ) + return; + } + + foreach ( primary in primaries ) + { + if ( primary == weapon || primary == "fhj18_mp" ) + continue; + + if ( self getweaponammoclip( primary ) ) + { + self switchtoweapon( primary ); + return; + } + } + + if ( bot_using_launcher() || bot_has_lmg() ) + { + foreach ( primary in primaries ) + { + if ( primary == weapon || primary == "fhj18_mp" ) + continue; + + self switchtoweapon( primary ); + return; + } + } + } } -bot_has_shotgun() //checked changed at own discretion +bot_has_shotgun() { - weapon = self getcurrentweapon(); - if ( weapon == "none" ) - { - return 0; - } - if ( weaponisdualwield( weapon ) ) - { - return 1; - } - if ( bot_has_weapon_class( "spread" ) || bot_has_weapon_class( "pistol spread" ) ) - { - return 1; - } - return 0; + weapon = self getcurrentweapon(); + + if ( weapon == "none" ) + return 0; + + if ( weaponisdualwield( weapon ) ) + return 1; + + return bot_has_weapon_class( "spread" ) || bot_has_weapon_class( "pistol spread" ); } -bot_has_crossbow() //checked changed at own discretion +bot_has_crossbow() { - weapon = self getcurrentweapon(); - if ( weapon == "crossbow_mp" ) - { - return 1; - } - return 0; + weapon = self getcurrentweapon(); + return weapon == "crossbow_mp"; } -bot_has_launcher() //checked matches cerberus output +bot_has_launcher() { - if ( self getweaponammoclip( "smaw_mp" ) > 0 || self getweaponammostock( "smaw_mp" ) > 0 ) - { - return 1; - } - if ( self getweaponammoclip( "fhj18_mp" ) > 0 || self getweaponammostock( "fhj18_mp" ) > 0 ) - { - return 1; - } - return 0; + if ( self getweaponammoclip( "smaw_mp" ) > 0 || self getweaponammostock( "smaw_mp" ) > 0 ) + return true; + + if ( self getweaponammoclip( "fhj18_mp" ) > 0 || self getweaponammostock( "fhj18_mp" ) > 0 ) + return true; + + return false; } -bot_has_melee_weapon() //checked changed at own discretion +bot_has_melee_weapon() { - weapon = self getcurrentweapon(); - if ( weapon == "fhj18_mp" ) - { - if ( isDefined( self.bot.threat.entity ) && !target_istarget( self.bot.threat.entity ) ) - { - return 1; - } - } - if ( weapon == "riotshield_mp" || weapon == "knife_held_mp" ) - { - return 1; - } - return 0; + weapon = self getcurrentweapon(); + + if ( weapon == "fhj18_mp" ) + { + if ( isdefined( self.bot.threat.entity ) && !target_istarget( self.bot.threat.entity ) ) + return 1; + } + + return weapon == "riotshield_mp" || weapon == "knife_held_mp"; } -bot_has_pistol() //checked changed at own discretion +bot_has_pistol() { - if ( bot_has_weapon_class( "pistol" ) || bot_has_weapon_class( "pistol spread" ) ) - { - return 1; - } - return 0; + return bot_has_weapon_class( "pistol" ) || bot_has_weapon_class( "pistol spread" ); } -bot_has_lmg() //checked changed at own discretion +bot_has_lmg() { - if ( bot_has_weapon_class( "mg" ) ) - { - return 1; - } - return 0; + return bot_has_weapon_class( "mg" ); } -bot_has_sniper() //checked changed at own discretion +bot_has_sniper() { - if ( bot_has_weapon_class( "sniper" ) ) - { - return 1; - } - return 0; + return bot_has_weapon_class( "sniper" ); } -bot_using_launcher() //checked changed at own discretion +bot_using_launcher() { - weapon = self getcurrentweapon(); - if ( weapon == "smaw_mp" || weapon == "fhj18_mp" || weapon == "usrpg_mp" ) - { - return 1; - } - return 0; + weapon = self getcurrentweapon(); + return weapon == "smaw_mp" || weapon == "fhj18_mp" || weapon == "usrpg_mp"; } -bot_has_minigun() //checked changed at own discretion +bot_has_minigun() { - weapon = self getcurrentweapon(); - if ( weapon == "minigun_mp" || weapon == "inventory_minigun_mp" ) - { - return 1; - } - return 0; + weapon = self getcurrentweapon(); + return weapon == "minigun_mp" || weapon == "inventory_minigun_mp"; } -bot_has_weapon_class( class ) //checked changed at own discretion +bot_has_weapon_class( class ) { - if ( self isreloading() ) - { - return 0; - } - weapon = self getcurrentweapon(); - if ( weapon == "none" ) - { - return 0; - } - if ( weaponclass( weapon ) == class ) - { - return 1; - } - return 0; + if ( self isreloading() ) + return 0; + + weapon = self getcurrentweapon(); + + if ( weapon == "none" ) + return 0; + + return weaponclass( weapon ) == class; } -bot_health_frac() //checked matches cerberus output +bot_health_frac() { - return self.health / self.maxhealth; + return self.health / self.maxhealth; } -bot_should_hip_fire() //checked matches cerberus output +bot_should_hip_fire() { - enemy = self.bot.threat.entity; - weapon = self getcurrentweapon(); - if ( weapon == "none" ) - { - return 0; - } - if ( weaponisdualwield( weapon ) ) - { - return 1; - } - class = weaponclass( weapon ); - if ( isplayer( enemy ) && class == "spread" ) - { - return 1; - } - distsq = distancesquared( self.origin, enemy.origin ); - distcheck = 0; - switch( class ) - { - case "mg": - distcheck = 250; - break; - case "smg": - distcheck = 350; - break; - case "spread": - distcheck = 400; - break; - case "pistol": - distcheck = 200; - break; - case "rocketlauncher": - distcheck = 0; - break; - case "rifle": - default: - distcheck = 300; - break; - } - if ( isweaponscopeoverlay( weapon ) ) - { - distcheck = 500; - } - return distsq < ( distcheck * distcheck ); + enemy = self.bot.threat.entity; + weapon = self getcurrentweapon(); + + if ( weapon == "none" ) + return 0; + + if ( weaponisdualwield( weapon ) ) + return 1; + + class = weaponclass( weapon ); + + if ( isplayer( enemy ) && class == "spread" ) + return 1; + + distsq = distancesquared( self.origin, enemy.origin ); + distcheck = 0; + + switch ( class ) + { + case "mg": + distcheck = 250; + break; + case "smg": + distcheck = 350; + break; + case "spread": + distcheck = 400; + break; + case "pistol": + distcheck = 200; + break; + case "rocketlauncher": + distcheck = 0; + break; + case "rifle": + default: + distcheck = 300; + break; + } + + if ( isweaponscopeoverlay( weapon ) ) + distcheck = 500; + + return distsq < distcheck * distcheck; } -bot_patrol_near_enemy( damage, attacker, direction ) //checked matches cerberus output +bot_patrol_near_enemy( damage, attacker, direction ) { - if ( threat_is_warthog( attacker ) ) - { - return; - } - if ( threat_requires_rocket( attacker ) && !self bot_has_launcher() ) - { - return; - } - if ( isDefined( attacker ) ) - { - self bot_lookat_entity( attacker ); - } - if ( maps/mp/bots/_bot::bot_get_difficulty() == "easy" ) - { - return; - } - if ( !isDefined( attacker ) ) - { - attacker = self maps/mp/bots/_bot::bot_get_closest_enemy( self.origin, 1 ); - } - if ( !isDefined( attacker ) ) - { - return; - } - if ( attacker.classname == "auto_turret" ) - { - self bot_turret_set_dangerous( attacker ); - } - node = bot_nearest_node( attacker.origin ); - if ( !isDefined( node ) ) - { - nodes = getnodesinradiussorted( attacker.origin, 1024, 0, 512, "Path", 8 ); - if ( nodes.size ) - { - node = nodes[ 0 ]; - } - } - if ( isDefined( node ) ) - { - if ( isDefined( damage ) ) - { - self addgoal( node, 24, 4, "enemy_patrol" ); - return; - } - else - { - self addgoal( node, 24, 2, "enemy_patrol" ); - } - } + if ( threat_is_warthog( attacker ) ) + return; + + if ( threat_requires_rocket( attacker ) && !self bot_has_launcher() ) + return; + + if ( isdefined( attacker ) ) + self bot_lookat_entity( attacker ); + + if ( maps\mp\bots\_bot::bot_get_difficulty() == "easy" ) + return; + + if ( !isdefined( attacker ) ) + attacker = self maps\mp\bots\_bot::bot_get_closest_enemy( self.origin, 1 ); + + if ( !isdefined( attacker ) ) + return; + + if ( attacker.classname == "auto_turret" ) + self bot_turret_set_dangerous( attacker ); + + node = bot_nearest_node( attacker.origin ); + + if ( !isdefined( node ) ) + { + nodes = getnodesinradiussorted( attacker.origin, 1024, 0, 512, "Path", 8 ); + + if ( nodes.size ) + node = nodes[0]; + } + + if ( isdefined( node ) ) + { + if ( isdefined( damage ) ) + self addgoal( node, 24, 4, "enemy_patrol" ); + else + self addgoal( node, 24, 2, "enemy_patrol" ); + } } -bot_nearest_node( origin ) //checked matches cerberus output +bot_nearest_node( origin ) { - node = getnearestnode( origin ); - if ( isDefined( node ) ) - { - return node; - } - nodes = getnodesinradiussorted( origin, 256, 0, 256 ); - if ( nodes.size ) - { - return nodes[ 0 ]; - } - return undefined; + node = getnearestnode( origin ); + + if ( isdefined( node ) ) + return node; + + nodes = getnodesinradiussorted( origin, 256, 0, 256 ); + + if ( nodes.size ) + return nodes[0]; + + return undefined; } -bot_lookat_entity( entity ) //checked matches cerberus output +bot_lookat_entity( entity ) { - if ( isplayer( entity ) && entity getstance() != "prone" ) - { - if ( distancesquared( self.origin, entity.origin ) < 65536 ) - { - origin = entity getcentroid() + vectorScale( ( 0, 0, 1 ), 10 ); - self lookat( origin ); - return; - } - } - offset = target_getoffset( entity ); - if ( isDefined( offset ) ) - { - self lookat( entity.origin + offset ); - } - else - { - self lookat( entity getcentroid() ); - } + if ( isplayer( entity ) && entity getstance() != "prone" ) + { + if ( distancesquared( self.origin, entity.origin ) < 65536 ) + { + origin = entity getcentroid() + vectorscale( ( 0, 0, 1 ), 10.0 ); + self lookat( origin ); + return; + } + } + + offset = target_getoffset( entity ); + + if ( isdefined( offset ) ) + self lookat( entity.origin + offset ); + else + self lookat( entity getcentroid() ); } -bot_combat_throw_lethal( origin ) //checked partially changed to match cerberus output did not change while loop to foreach see the github for more info +bot_combat_throw_lethal( origin ) { - weapons = self getweaponslist(); - radius = 256; - if ( self hasperk( "specialty_flakjacket" ) ) - { - radius *= 0.25; - } - if ( distancesquared( self.origin, origin ) < radius * radius ) - { - return 0; - } - i = 0; - while ( i < weapons.size ) - { - if ( self getweaponammostock( weapons[ i ] ) <= 0 ) - { - i++; - continue; - } - if ( weapons[ i ] == "frag_grenade_mp" || weapons[ i ] == "sticky_grenade_mp" ) - { - if ( self throwgrenade( weapons[ i ], origin ) ) - { - return 1; - } - } - i++; - } - return 0; + weapons = self getweaponslist(); + radius = 256; + + if ( self hasperk( "specialty_flakjacket" ) ) + radius *= 0.25; + + if ( distancesquared( self.origin, origin ) < radius * radius ) + return false; + + foreach ( weapon in weapons ) + { + if ( self getweaponammostock( weapon ) <= 0 ) + continue; + + if ( weapon == "frag_grenade_mp" || weapon == "sticky_grenade_mp" ) + { + if ( self throwgrenade( weapon, origin ) ) + return true; + } + } + + return false; } -bot_combat_throw_tactical( origin ) //checked partially changed to match cerberus output did not change while loop to foreach see the github for more info +bot_combat_throw_tactical( origin ) { - weapons = self getweaponslist(); - if ( !self hasperk( "specialty_flashprotection" ) ) - { - if ( distancesquared( self.origin, origin ) < 422500 ) - { - return 0; - } - } - i = 0; - while ( i < weapons.size ) - { - if ( self getweaponammostock( weapons[ i ] ) <= 0 ) - { - i++; - continue; - } - if ( weapons[ i ] == "flash_grenade_mp" || weapons[ i ] == "concussion_grenade_mp" ) - { - if ( self throwgrenade( weapons[ i ], origin ) ) - { - return 1; - } - } - i++; - } - return 0; + weapons = self getweaponslist(); + + if ( !self hasperk( "specialty_flashprotection" ) ) + { + if ( distancesquared( self.origin, origin ) < 422500 ) + return false; + } + + foreach ( weapon in weapons ) + { + if ( self getweaponammostock( weapon ) <= 0 ) + continue; + + if ( weapon == "flash_grenade_mp" || weapon == "concussion_grenade_mp" ) + { + if ( self throwgrenade( weapon, origin ) ) + return true; + } + } + + return false; } -bot_combat_throw_smoke( origin ) //checked partially changed to match cerberus output did not change while loop to foreach see the github for more info +bot_combat_throw_smoke( origin ) { - if ( self getweaponammostock( "willy_pete_mp" ) <= 0 ) - { - return 0; - } - time = getTime(); - i = 0; - players = get_players(); - while ( i < players.size ) - { - if ( !isDefined( players[ i ].smokegrenadetime ) ) - { - i++; - continue; - } - if ( ( time - players[ i ].smokegrenadetime ) > 12000 ) - { - i++; - continue; - } - if ( distancesquared( origin, players[ i ].smokegrenadeposition ) < 65536 ) - { - return 0; - } - i++; - } - return self throwgrenade( "willy_pete_mp", origin ); + if ( self getweaponammostock( "willy_pete_mp" ) <= 0 ) + return 0; + + time = gettime(); + + foreach ( player in level.players ) + { + if ( !isdefined( player.smokegrenadetime ) ) + continue; + + if ( time - player.smokegrenadetime > 12000 ) + continue; + + if ( distancesquared( origin, player.smokegrenadeposition ) < 65536 ) + return 0; + } + + return self throwgrenade( "willy_pete_mp", origin ); } -bot_combat_throw_emp( origin ) //checked matches cerberus output +bot_combat_throw_emp( origin ) { - if ( self getweaponammostock( "emp_mp" ) <= 0 ) - { - return 0; - } - return self throwgrenade( "emp_mp", origin ); + if ( self getweaponammostock( "emp_mp" ) <= 0 ) + return 0; + + return self throwgrenade( "emp_mp", origin ); } -bot_combat_throw_proximity( origin ) //checked changed to match cerberus output +bot_combat_throw_proximity( origin ) { - foreach ( missile in level.missileentities ) - { - if ( isDefined( missile ) && distancesquared( missile.origin, origin ) < 65536 ) - { - return 0; - } - } - return self throwgrenade( "proximity_grenade_mp", origin ); + foreach ( missile in level.missileentities ) + { + if ( isdefined( missile ) && distancesquared( missile.origin, origin ) < 65536 ) + return 0; + } + + return self throwgrenade( "proximity_grenade_mp", origin ); } -bot_combat_tactical_insertion( origin ) //checked changed to match cerberus output +bot_combat_tactical_insertion( origin ) { - foreach ( missile in level.missileentities ) - { - if ( isDefined( missile ) && distancesquared( missile.origin, origin ) < 65536 ) - { - return 0; - } - } - return self throwgrenade( "tactical_insertion_mp", origin ); + foreach ( missile in level.missileentities ) + { + if ( isdefined( missile ) && distancesquared( missile.origin, origin ) < 65536 ) + return 0; + } + + return self throwgrenade( "tactical_insertion_mp", origin ); } -bot_combat_toss_flash( origin ) //checked changed to match cerberus output +bot_combat_toss_flash( origin ) { - if ( maps/mp/bots/_bot::bot_get_difficulty() == "easy" ) - { - return 0; - } - if ( self getweaponammostock( "sensor_grenade_mp" ) <= 0 && self getweaponammostock( "proximity_grenade_mp" ) <= 0 && self getweaponammostock( "trophy_system_mp" ) <= 0 ) - { - return 0; - } - foreach ( missile in level.missileentities ) - { - if ( isDefined( missile ) && distancesquared( missile.origin, origin ) < 65536 ) - { - return 0; - } - } - self pressattackbutton( 2 ); - return 1; + if ( maps\mp\bots\_bot::bot_get_difficulty() == "easy" ) + return false; + + if ( self getweaponammostock( "sensor_grenade_mp" ) <= 0 && self getweaponammostock( "proximity_grenade_mp" ) <= 0 && self getweaponammostock( "trophy_system_mp" ) <= 0 ) + return false; + + foreach ( missile in level.missileentities ) + { + if ( isdefined( missile ) && distancesquared( missile.origin, origin ) < 65536 ) + return false; + } + + self pressattackbutton( 2 ); + return true; } -bot_combat_toss_frag( origin ) //checked changed to match cerberus output +bot_combat_toss_frag( origin ) { - if ( maps/mp/bots/_bot::bot_get_difficulty() == "easy" ) - { - return 0; - } - if ( self getweaponammostock( "bouncingbetty_mp" ) <= 0 && self getweaponammostock( "claymore_mp" ) <= 0 && self getweaponammostock( "satchel_charge_mp" ) <= 0 ) - { - return 0; - } - foreach ( missile in level.missileentities ) - { - if ( isDefined( missile ) && distancesquared( missile.origin, origin ) < 16384 ) - { - return 0; - } - } - self pressattackbutton( 1 ); - return 1; + if ( maps\mp\bots\_bot::bot_get_difficulty() == "easy" ) + return false; + + if ( self getweaponammostock( "bouncingbetty_mp" ) <= 0 && self getweaponammostock( "claymore_mp" ) <= 0 && self getweaponammostock( "satchel_charge_mp" ) <= 0 ) + return false; + + foreach ( missile in level.missileentities ) + { + if ( isdefined( missile ) && distancesquared( missile.origin, origin ) < 16384 ) + return false; + } + + self pressattackbutton( 1 ); + return true; } -bot_shotgun_think() //checked partially changed to match cerberus output did not change foreach to while loop see github for more info +bot_shotgun_think() { - if ( self isthrowinggrenade() || self isswitchingweapons() ) - { - return; - } - enemy = self.bot.threat.entity; - weapon = self getcurrentweapon(); - self allowattack( 0 ); - distsq = distancesquared( enemy.origin, self.origin ); - if ( threat_is_turret() ) - { - goal = enemy turret_get_attack_node(); - if ( isDefined( goal ) ) - { - self cancelgoal( "enemy_patrol" ); - self addgoal( goal, 24, 4, "cover" ); - } - if ( weapon != "none" && !weaponisdualwield( weapon ) && distsq < 65536 ) - { - self pressads( 1 ); - } - } - else if ( self getweaponammoclip( weapon ) && distsq < 90000 ) - { - self cancelgoal( "enemy_patrol" ); - self addgoal( self.origin, 24, 4, "cover" ); - } - dot = self bot_dot_product( self.bot.threat.aim_target ); - if ( distsq < 250000 && dot > 0.98 ) - { - self allowattack( 1 ); - return; - } - if ( maps/mp/bots/_bot::bot_get_difficulty() == "easy" ) - { - return; - } - if ( self threat_is_player() ) - { - dot = enemy bot_dot_product( self.origin ); - if ( dot < 0.9 ) - { - return; - } - } - else - { - return; - } - primariesArray = self getweaponslistprimaries(); - weapon = self getcurrentweapon(); - i = 0; - primaries = getArrayKeys( primariesArray ); - while ( i < primaries.size ) - { - if ( primaries[ i ] == weapon ) - { - i++; - continue; - } - if ( !self getweaponammoclip( primaries[ i ] ) ) - { - i++; - continue; - } - if ( maps/mp/gametypes/_weapon_utils::isguidedrocketlauncherweapon( primaries[ i ] ) ) - { - i++; - continue; - } - class = weaponclass( primaries[ i ] ); - if ( class == "spread" || class == "pistol spread" || class == "melee" && class == "item" ) - { - i++; - continue; - } - if ( self switchtoweapon( primaries[ i ] ) ) - { - return; - } - i++; - } - if ( self getweaponammostock( "willy_pete_mp" ) > 0 ) - { - self pressattackbutton( 2 ); - return; - } + if ( self isthrowinggrenade() || self isswitchingweapons() ) + return; + + enemy = self.bot.threat.entity; + weapon = self getcurrentweapon(); + self allowattack( 0 ); + distsq = distancesquared( enemy.origin, self.origin ); + + if ( threat_is_turret() ) + { + goal = enemy turret_get_attack_node(); + + if ( isdefined( goal ) ) + { + self cancelgoal( "enemy_patrol" ); + self addgoal( goal, 24, 4, "cover" ); + } + + if ( weapon != "none" && !weaponisdualwield( weapon ) && distsq < 65536 ) + self pressads( 1 ); + } + else if ( self getweaponammoclip( weapon ) && distsq < 90000 ) + { + self cancelgoal( "enemy_patrol" ); + self addgoal( self.origin, 24, 4, "cover" ); + } + + dot = self bot_dot_product( self.bot.threat.aim_target ); + + if ( distsq < 250000 && dot > 0.98 ) + { + self allowattack( 1 ); + return; + } + + if ( maps\mp\bots\_bot::bot_get_difficulty() == "easy" ) + return; + + if ( self threat_is_player() ) + { + dot = enemy bot_dot_product( self.origin ); + + if ( dot < 0.9 ) + return; + } + else + return; + + primaries = self getweaponslistprimaries(); + weapon = self getcurrentweapon(); + + foreach ( primary in primaries ) + { + if ( primary == weapon ) + continue; + + if ( !self getweaponammoclip( primary ) ) + continue; + + if ( maps\mp\gametypes\_weapon_utils::isguidedrocketlauncherweapon( primary ) ) + continue; + + class = weaponclass( primary ); + + if ( class == "spread" || class == "pistol spread" || class == "melee" || class == "item" ) + continue; + + if ( self switchtoweapon( primary ) ) + return; + } + + if ( self getweaponammostock( "willy_pete_mp" ) > 0 ) + { + self pressattackbutton( 2 ); + return; + } } -bot_turret_set_dangerous( turret ) //checked partially changed to match cerberus output did not change while loop to foreach see github for more info +bot_turret_set_dangerous( turret ) { - if ( !level.teambased ) - { - return; - } - if ( is_true( turret.dead ) || is_true( turret.carried ) ) - { - return; - } - if ( !is_true( turret.turret_active ) ) - { - return; - } - if ( turret.dangerous_nodes.size ) - { - return; - } - nearest = bot_turret_nearest_node( turret ); - if ( !isDefined( nearest ) ) - { - return; - } - forward = anglesToForward( turret.angles ); - if ( turret.turrettype == "sentry" ) - { - nodes = getvisiblenodes( nearest ); - foreach ( node in nodes ) - { - dir = vectornormalize( node.origin - turret.origin ); - dot = vectordot( forward, dir ); - if ( dot >= 0.5 ) - { - turret turret_mark_node_dangerous( node ); - } - } - } - if ( turret.turrettype == "microwave" ) - { - nodes = getnodesinradius( turret.origin, level.microwave_radius, 0 ); - i = 0; - while ( i < nodes.size ) - { - if ( !nodesvisible( nearest, nodes[ i ] ) ) - { - i++; - continue; - } - dir = vectornormalize( nodes[ i ].origin - turret.origin ); - dot = vectordot( forward, dir ); - if ( dot >= level.microwave_turret_cone_dot ) - { - turret turret_mark_node_dangerous( nodes[ i ] ); - } - i++; - } - } + if ( !level.teambased ) + return; + + if ( isdefined( turret.dead ) && turret.dead || isdefined( turret.carried ) && turret.carried ) + return; + + if ( !( isdefined( turret.turret_active ) && turret.turret_active ) ) + return; + + if ( turret.dangerous_nodes.size ) + return; + + nearest = bot_turret_nearest_node( turret ); + + if ( !isdefined( nearest ) ) + return; + + forward = anglestoforward( turret.angles ); + + if ( turret.turrettype == "sentry" ) + { + nodes = getvisiblenodes( nearest ); + + foreach ( node in nodes ) + { + dir = vectornormalize( node.origin - turret.origin ); + dot = vectordot( forward, dir ); + + if ( dot >= 0.5 ) + turret turret_mark_node_dangerous( node ); + } + } + else if ( turret.turrettype == "microwave" ) + { + nodes = getnodesinradius( turret.origin, level.microwave_radius, 0 ); + + foreach ( node in nodes ) + { + if ( !nodesvisible( nearest, node ) ) + continue; + + dir = vectornormalize( node.origin - turret.origin ); + dot = vectordot( forward, dir ); + + if ( dot >= level.microwave_turret_cone_dot ) + turret turret_mark_node_dangerous( node ); + } + } } -bot_turret_nearest_node( turret ) //checked changed to match cerberus output +bot_turret_nearest_node( turret ) { - nodes = getnodesinradiussorted( turret.origin, 256, 0 ); - forward = anglesToForward( turret.angles ); - foreach ( node in nodes ) - { - dir = vectornormalize( node.origin - turret.origin ); - dot = vectordot( forward, dir ); - if ( dot > 0.5 ) - { - return node; - } - } - if ( nodes.size ) - { - return nodes[ 0 ]; - } - return undefined; + nodes = getnodesinradiussorted( turret.origin, 256, 0 ); + forward = anglestoforward( turret.angles ); + + foreach ( node in nodes ) + { + dir = vectornormalize( node.origin - turret.origin ); + dot = vectordot( forward, dir ); + + if ( dot > 0.5 ) + return node; + } + + if ( nodes.size ) + return nodes[0]; + + return undefined; } -turret_mark_node_dangerous( node ) //checked partially changed to match cerberus output did not change while loop to foreach see github for more info +turret_mark_node_dangerous( node ) { - i = 0; - teams = getArrayKeys( level.teams ); - while ( i < level.teams.size ) - { - if ( teams[ i ] == self.owner.team ) - { - i++; - continue; - } - node setdangerous( teams[ i ], 1 ); - i++; - } - self.dangerous_nodes[ self.dangerous_nodes.size ] = node; + foreach ( team in level.teams ) + { + if ( team == self.owner.team ) + continue; + + node setdangerous( team, 1 ); + } + + self.dangerous_nodes[self.dangerous_nodes.size] = node; } -turret_get_attack_node() //checked partially changed to match cerberus output did not change while loop to foreach see github for more info +turret_get_attack_node() { - nearest = bot_nearest_node( self.origin ); - if ( !isDefined( nearest ) ) - { - return undefined; - } - nodes = getnodesinradiussorted( self.origin, 512, 64 ); - forward = anglesToForward( self.angles ); - i = 0; - while ( i < nodes.size ) - { - if ( !nodesvisible( nodes[ i ], nearest ) ) - { - i++; - continue; - } - dir = vectornormalize( nodes[ i ].origin - self.origin ); - dot = vectordot( forward, dir ); - if ( dot < 0.5 ) - { - return nodes[ i ]; - } - i++; - } - return undefined; + nearest = bot_nearest_node( self.origin ); + + if ( !isdefined( nearest ) ) + return undefined; + + nodes = getnodesinradiussorted( self.origin, 512, 64 ); + forward = anglestoforward( self.angles ); + + foreach ( node in nodes ) + { + if ( !nodesvisible( node, nearest ) ) + continue; + + dir = vectornormalize( node.origin - self.origin ); + dot = vectordot( forward, dir ); + + if ( dot < 0.5 ) + return node; + } + + return undefined; } -bot_riotshield_think( enemy ) //checked matches cerberus output +bot_riotshield_think( enemy ) { - dot = enemy bot_dot_product( self.origin ); - if ( !bot_has_crossbow() && !bot_using_launcher() && enemy getstance() != "stand" ) - { - if ( dot > 0.8 ) - { - self allowattack( 0 ); - } - } - forward = anglesToForward( enemy.angles ); - origin = enemy.origin + forward * randomintrange( 256, 512 ); - if ( self bot_combat_throw_lethal( origin ) ) - { - return; - } - if ( self bot_combat_throw_tactical( origin ) ) - { - return; - } - if ( self throwgrenade( "proximity_grenade_mp", origin ) ) - { - return; - } - if ( self atgoal( "cover" ) ) - { - self.bot.threat.update_riotshield = 0; - } - if ( getTime() > self.bot.threat.update_riotshield ) - { - self thread bot_riotshield_dangerous_think( enemy ); - self.bot.threat.update_riotshield = getTime() + randomintrange( 5000, 7500 ); - } + dot = enemy bot_dot_product( self.origin ); + + if ( !bot_has_crossbow() && !bot_using_launcher() && enemy getstance() != "stand" ) + { + if ( dot > 0.8 ) + self allowattack( 0 ); + } + + forward = anglestoforward( enemy.angles ); + origin = enemy.origin + forward * randomintrange( 256, 512 ); + + if ( self bot_combat_throw_lethal( origin ) ) + return; + + if ( self bot_combat_throw_tactical( origin ) ) + return; + + if ( self throwgrenade( "proximity_grenade_mp", origin ) ) + return; + + if ( self atgoal( "cover" ) ) + self.bot.threat.update_riotshield = 0; + + if ( gettime() > self.bot.threat.update_riotshield ) + { + self thread bot_riotshield_dangerous_think( enemy ); + self.bot.threat.update_riotshield = gettime() + randomintrange( 5000, 7500 ); + } } -bot_riotshield_dangerous_think( enemy, goal ) //checked partially changed to match cerberus output +bot_riotshield_dangerous_think( enemy, goal ) { - nearest = bot_nearest_node( enemy.origin ); - if ( !isDefined( nearest ) ) - { - threat_ignore( enemy, 10 ); - return; - } - nodes = getnodesinradius( enemy.origin, 768, 0 ); - if ( !nodes.size ) - { - threat_ignore( enemy, 10 ); - return; - } - nodes = array_randomize( nodes ); - forward = anglesToForward( enemy.angles ); - i = 0; - while ( i < nodes.size ) - { - if ( !nodesvisible( nodes[ i ], nearest ) ) - { - i++; - continue; - } - dir = vectornormalize( nodes[ i ].origin - enemy.origin ); - dot = vectordot( forward, dir ); - if ( dot < 0 ) - { - if ( distancesquared( self.origin, enemy.origin ) < 262144 ) - { - self addgoal( nodes[ i ], 24, 4, "cover" ); - } - else - { - self addgoal( nodes[ i ], 24, 3, "cover" ); - } - break; - } - i++; - } - if ( !level.teambased ) - { - return; - } - nodes = getnodesinradius( enemy.origin, 512, 0 ); - foreach ( node in nodes ) - { - dir = vectornormalize( node.origin - enemy.origin ); - dot = vectordot( forward, dir ); - if ( dot >= 0.5 ) - { - node setdangerous( self.team, 1 ); - } - } - enemy wait_endon( 5, "death" ); - foreach ( node in nodes ) - { - node setdangerous( self.team, 0 ); - } + nearest = bot_nearest_node( enemy.origin ); + + if ( !isdefined( nearest ) ) + { + threat_ignore( enemy, 10 ); + return; + } + + nodes = getnodesinradius( enemy.origin, 768, 0 ); + + if ( !nodes.size ) + { + threat_ignore( enemy, 10 ); + return; + } + + nodes = array_randomize( nodes ); + forward = anglestoforward( enemy.angles ); + + foreach ( node in nodes ) + { + if ( !nodesvisible( node, nearest ) ) + continue; + + dir = vectornormalize( node.origin - enemy.origin ); + dot = vectordot( forward, dir ); + + if ( dot < 0 ) + { + if ( distancesquared( self.origin, enemy.origin ) < 262144 ) + self addgoal( node, 24, 4, "cover" ); + else + self addgoal( node, 24, 3, "cover" ); + + break; + } + } + + if ( !level.teambased ) + return; + + nodes = getnodesinradius( enemy.origin, 512, 0 ); + + foreach ( node in nodes ) + { + dir = vectornormalize( node.origin - enemy.origin ); + dot = vectordot( forward, dir ); + + if ( dot >= 0.5 ) + node setdangerous( self.team, 1 ); + } + + enemy wait_endon( 5, "death" ); + + foreach ( node in nodes ) + node setdangerous( self.team, 0 ); } - - - - - diff --git a/Multiplayer Core/patch_mp/maps/mp/bots/_bot_conf.gsc b/Multiplayer Core/patch_mp/maps/mp/bots/_bot_conf.gsc index b103a62..9e80281 100644 --- a/Multiplayer Core/patch_mp/maps/mp/bots/_bot_conf.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/bots/_bot_conf.gsc @@ -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; } - - diff --git a/Multiplayer Core/patch_mp/maps/mp/bots/_bot_ctf.gsc b/Multiplayer Core/patch_mp/maps/mp/bots/_bot_ctf.gsc index 058c3df..19c1443 100644 --- a/Multiplayer Core/patch_mp/maps/mp/bots/_bot_ctf.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/bots/_bot_ctf.gsc @@ -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; } - - diff --git a/Multiplayer Core/patch_mp/maps/mp/bots/_bot_dem.gsc b/Multiplayer Core/patch_mp/maps/mp/bots/_bot_dem.gsc index f3ce629..7f425b0 100644 --- a/Multiplayer Core/patch_mp/maps/mp/bots/_bot_dem.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/bots/_bot_dem.gsc @@ -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; +} diff --git a/Multiplayer Core/patch_mp/maps/mp/bots/_bot_dom.gsc b/Multiplayer Core/patch_mp/maps/mp/bots/_bot_dom.gsc index 536162d..ef182c5 100644 --- a/Multiplayer Core/patch_mp/maps/mp/bots/_bot_dom.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/bots/_bot_dom.gsc @@ -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; +} diff --git a/Multiplayer Core/patch_mp/maps/mp/bots/_bot_hack.gsc b/Multiplayer Core/patch_mp/maps/mp/bots/_bot_hack.gsc index c94ffc7..9f7506e 100644 --- a/Multiplayer Core/patch_mp/maps/mp/bots/_bot_hack.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/bots/_bot_hack.gsc @@ -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; + } + } + } + } +} diff --git a/Multiplayer Core/patch_mp/maps/mp/bots/_bot_hq.gsc b/Multiplayer Core/patch_mp/maps/mp/bots/_bot_hq.gsc index af7d1c7..7409292 100644 --- a/Multiplayer Core/patch_mp/maps/mp/bots/_bot_hq.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/bots/_bot_hq.gsc @@ -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; } - diff --git a/Multiplayer Core/patch_mp/maps/mp/bots/_bot_koth.gsc b/Multiplayer Core/patch_mp/maps/mp/bots/_bot_koth.gsc index 7856df7..d97c1b5 100644 --- a/Multiplayer Core/patch_mp/maps/mp/bots/_bot_koth.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/bots/_bot_koth.gsc @@ -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]; } - - diff --git a/Multiplayer Core/patch_mp/maps/mp/bots/_bot_loadout.gsc b/Multiplayer Core/patch_mp/maps/mp/bots/_bot_loadout.gsc index e889e66..a00309c 100644 --- a/Multiplayer Core/patch_mp/maps/mp/bots/_bot_loadout.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/bots/_bot_loadout.gsc @@ -1,546 +1,556 @@ -#include maps/mp/gametypes/_rank; -#include maps/mp/bots/_bot; -#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\bots\_bot; +#include maps\mp\gametypes\_rank; -init() //checked changed to match cerberus output +init() { - level endon( "game_ended" ); - level.bot_banned_killstreaks = array( "KILLSTREAK_RCBOMB", "KILLSTREAK_QRDRONE", "KILLSTREAK_REMOTE_MISSILE", "KILLSTREAK_REMOTE_MORTAR", "KILLSTREAK_HELICOPTER_GUNNER" ); - for ( ;; ) - { - level waittill( "connected", player ); - if ( !player istestclient() ) - { - continue; - } - player thread on_bot_connect(); - } + level endon( "game_ended" ); + level.bot_banned_killstreaks = array( "KILLSTREAK_RCBOMB", "KILLSTREAK_QRDRONE", "KILLSTREAK_REMOTE_MISSILE", "KILLSTREAK_REMOTE_MORTAR", "KILLSTREAK_HELICOPTER_GUNNER" ); + + for (;;) + { + level waittill( "connected", player ); + + if ( !player istestclient() ) + continue; + + player thread on_bot_connect(); + } } -on_bot_connect() //checked changed to match cerberus output +on_bot_connect() { - self endon( "disconnect" ); - if ( isDefined( self.pers[ "bot_loadout" ] ) ) - { - return; - } - wait 0.1; - if ( ( self getentitynumber() % 2 ) == 0 ) - { - wait 0.05; - } - self maps/mp/bots/_bot::bot_set_rank(); - if ( level.onlinegame && !sessionmodeisprivate() ) - { - self botsetdefaultclass( 5, "class_assault" ); - self botsetdefaultclass( 6, "class_smg" ); - self botsetdefaultclass( 7, "class_lmg" ); - self botsetdefaultclass( 8, "class_cqb" ); - self botsetdefaultclass( 9, "class_sniper" ); - } - else - { - self botsetdefaultclass( 5, "class_assault" ); - self botsetdefaultclass( 6, "class_smg" ); - self botsetdefaultclass( 7, "class_lmg" ); - self botsetdefaultclass( 8, "class_cqb" ); - self botsetdefaultclass( 9, "class_sniper" ); - } - max_allocation = 10; - for ( i = 1; i <= 3; i++ ) - { - if ( self isitemlocked( maps/mp/gametypes/_rank::getitemindex( "feature_allocation_slot_" + i ) ) ) - { - max_allocation--; - } - } - self bot_construct_loadout( max_allocation ); - self.pers[ "bot_loadout" ] = 1; + self endon( "disconnect" ); + + if ( isdefined( self.pers["bot_loadout"] ) ) + return; + + wait 0.1; + + if ( self getentitynumber() % 2 == 0 ) + wait 0.05; + + self maps\mp\bots\_bot::bot_set_rank(); + + if ( level.onlinegame && !sessionmodeisprivate() ) + { + self botsetdefaultclass( 5, "class_assault" ); + self botsetdefaultclass( 6, "class_smg" ); + self botsetdefaultclass( 7, "class_lmg" ); + self botsetdefaultclass( 8, "class_cqb" ); + self botsetdefaultclass( 9, "class_sniper" ); + } + else + { + self botsetdefaultclass( 5, "class_assault" ); + self botsetdefaultclass( 6, "class_smg" ); + self botsetdefaultclass( 7, "class_lmg" ); + self botsetdefaultclass( 8, "class_cqb" ); + self botsetdefaultclass( 9, "class_sniper" ); + } + + max_allocation = 10; + + for ( i = 1; i <= 3; i++ ) + { + if ( self isitemlocked( maps\mp\gametypes\_rank::getitemindex( "feature_allocation_slot_" + i ) ) ) + max_allocation--; + } + + self bot_construct_loadout( max_allocation ); + self.pers["bot_loadout"] = 1; } -bot_construct_loadout( allocation_max ) //checked matches cerberus output +bot_construct_loadout( allocation_max ) { - if ( self isitemlocked( maps/mp/gametypes/_rank::getitemindex( "feature_cac" ) ) ) - { - return; - } - pixbeginevent( "bot_construct_loadout" ); - item_list = bot_build_item_list(); - bot_construct_class( 0, item_list, allocation_max ); - bot_construct_class( 1, item_list, allocation_max ); - bot_construct_class( 2, item_list, allocation_max ); - bot_construct_class( 3, item_list, allocation_max ); - bot_construct_class( 4, item_list, allocation_max ); - killstreaks = item_list[ "killstreak1" ]; - if ( isDefined( item_list[ "killstreak2" ] ) ) - { - killstreaks = arraycombine( killstreaks, item_list[ "killstreak2" ], 1, 0 ); - } - if ( isDefined( item_list[ "killstreak3" ] ) ) - { - killstreaks = arraycombine( killstreaks, item_list[ "killstreak3" ], 1, 0 ); - } - if ( isDefined( killstreaks ) && killstreaks.size ) - { - bot_choose_weapon( 0, killstreaks ); - bot_choose_weapon( 0, killstreaks ); - bot_choose_weapon( 0, killstreaks ); - } - self.claimed_items = undefined; - pixendevent(); + if ( self isitemlocked( maps\mp\gametypes\_rank::getitemindex( "feature_cac" ) ) ) + return; + + pixbeginevent( "bot_construct_loadout" ); + item_list = bot_build_item_list(); + bot_construct_class( 0, item_list, allocation_max ); + bot_construct_class( 1, item_list, allocation_max ); + bot_construct_class( 2, item_list, allocation_max ); + bot_construct_class( 3, item_list, allocation_max ); + bot_construct_class( 4, item_list, allocation_max ); + killstreaks = item_list["killstreak1"]; + + if ( isdefined( item_list["killstreak2"] ) ) + killstreaks = arraycombine( killstreaks, item_list["killstreak2"], 1, 0 ); + + if ( isdefined( item_list["killstreak3"] ) ) + killstreaks = arraycombine( killstreaks, item_list["killstreak3"], 1, 0 ); + + if ( isdefined( killstreaks ) && killstreaks.size ) + { + bot_choose_weapon( 0, killstreaks ); + bot_choose_weapon( 0, killstreaks ); + bot_choose_weapon( 0, killstreaks ); + } + + self.claimed_items = undefined; + pixendevent(); } -bot_construct_class( class, items, allocation_max ) //checked partially changed to match cerberus output did not change while loop to for loop see github for more info +bot_construct_class( class, items, allocation_max ) { - allocation = 0; - claimed_count = bot_build_claimed_list( items ); - self.claimed_items = []; - while ( allocation < allocation_max ) - { - secondary_chance = 40; - remaining = allocation_max - allocation; - if ( remaining >= 1 && bot_make_choice( 95, claimed_count[ "primary" ], 1 ) ) - { - weapon = bot_choose_weapon( class, items[ "primary" ] ); - claimed_count[ "primary" ]++; - allocation++; - bot_choose_weapon_option( class, "camo", 0 ); - bot_choose_weapon_option( class, "reticle", 0 ); - allocation += bot_choose_primary_attachments( class, weapon, allocation, allocation_max ); - } - else if ( !claimed_count[ "primary" ] ) - { - secondary_chance = 100; - } - remaining = allocation_max - allocation; - if ( remaining >= 1 && bot_make_choice( secondary_chance, claimed_count[ "secondary" ], 1 ) ) - { - if ( remaining >= 2 && randomint( 100 ) < 10 ) - { - self botclassadditem( class, "BONUSCARD_OVERKILL" ); - weapon = bot_choose_weapon( class, items[ "primary" ] ); - allocation++; - continue; - } - else - { - weapon = bot_choose_weapon( class, items[ "secondary" ] ); - bot_choose_weapon_option( class, "camo", 1 ); - } - allocation++; - claimed_count[ "secondary" ]++; - allocation += bot_choose_secondary_attachments( class, weapon, allocation, allocation_max ); - } - perks_chance = 50; - lethal_chance = 30; - tactical_chance = 20; - if ( claimed_count[ "specialty1" ] && claimed_count[ "specialty2" ] && claimed_count[ "specialty3" ] ) - { - perks_chance = 0; - } - if ( claimed_count[ "primarygrenade" ] ) - { - lethal_chance = 0; - } - if ( claimed_count[ "specialgrenade" ] ) - { - tactical_chance = 0; - } - if ( ( perks_chance + lethal_chance + tactical_chance ) <= 0 ) - { - return; - } - next_action = bot_chose_action( "perks", perks_chance, "lethal", lethal_chance, "tactical", tactical_chance, "none", 0 ); - if ( next_action == "perks" ) - { - remaining = allocation_max - allocation; - if ( remaining >= 3 && !claimed_count[ "specialty1" ] && randomint( 100 ) < 25 ) - { - self botclassadditem( class, "BONUSCARD_PERK_1_GREED" ); - bot_choose_weapon( class, items[ "specialty1" ] ); - bot_choose_weapon( class, items[ "specialty1" ] ); - claimed_count[ "specialty1" ] = 2; - allocation += 3; - } - remaining = allocation_max - allocation; - if ( remaining >= 3 && !claimed_count[ "specialty2" ] && randomint( 100 ) < 25 ) - { - self botclassadditem( class, "BONUSCARD_PERK_2_GREED" ); - bot_choose_weapon( class, items[ "specialty2" ] ); - bot_choose_weapon( class, items[ "specialty2" ] ); - claimed_count[ "specialty2" ] = 2; - allocation += 3; - } - remaining = allocation_max - allocation; - if ( remaining >= 3 && !claimed_count[ "specialty3" ] && randomint( 100 ) < 25 ) - { - self botclassadditem( class, "BONUSCARD_PERK_3_GREED" ); - bot_choose_weapon( class, items[ "specialty3" ] ); - bot_choose_weapon( class, items[ "specialty3" ] ); - claimed_count[ "specialty3" ] = 2; - allocation += 3; - } - remaining = allocation_max - allocation; - i = 0; - while ( i < 3 ) - { - perks = []; - remaining = allocation_max - allocation; - if ( remaining > 0 ) - { - if ( !claimed_count[ "specialty1" ] ) - { - perks[ perks.size ] = "specialty1"; - } - if ( !claimed_count[ "specialty2" ] ) - { - perks[ perks.size ] = "specialty2"; - } - if ( !claimed_count[ "specialty3" ] ) - { - perks[ perks.size ] = "specialty3"; - } - if ( perks.size ) - { - perk = random( perks ); - bot_choose_weapon( class, items[ perk ] ); - claimed_count[ perk ]++; - allocation++; - i++; - continue; - } - } - i++; - } - } - else if ( next_action == "lethal" ) - { - remaining = allocation_max - allocation; - if ( remaining >= 2 && randomint( 100 ) < 50 ) - { - if ( !claimed_count[ "primarygrenade" ] ) - { - bot_choose_weapon( class, items[ "primarygrenade" ] ); - claimed_count[ "primarygrenade" ]++; - allocation++; - } - self botclassadditem( class, "BONUSCARD_DANGER_CLOSE" ); - allocation++; - } - else if ( remaining >= 1 && !claimed_count[ "primarygrenade" ] ) - { - bot_choose_weapon( class, items[ "primarygrenade" ] ); - claimed_count[ "primarygrenade" ]++; - allocation++; - } - } - else if ( next_action == "tactical" ) - { - remaining = allocation_max - allocation; - if ( remaining >= 2 && !claimed_count[ "specialgrenade" ] && randomint( 100 ) < 50 ) - { - weapon = bot_choose_weapon( class, items[ "specialgrenade" ] ); - if ( weapon == "WEAPON_TACTICAL_INSERTION" || weapon == "WEAPON_WILLY_PETE" ) - { - claimed_count[ "specialgrenade" ] = 1; - allocation += 1; - } - else - { - self botclassadditem( class, weapon ); - claimed_count[ "specialgrenade" ] = 2; - allocation += 2; - } - } - else if ( remaining >= 1 && !claimed_count[ "specialgrenade" ] ) - { - bot_choose_weapon( class, items[ "specialgrenade" ] ); - claimed_count[ "specialgrenade" ]++; - allocation++; - } - } - } + allocation = 0; + claimed_count = bot_build_claimed_list( items ); + self.claimed_items = []; + + while ( allocation < allocation_max ) + { + secondary_chance = 40; + remaining = allocation_max - allocation; + + if ( remaining >= 1 && bot_make_choice( 95, claimed_count["primary"], 1 ) ) + { + weapon = bot_choose_weapon( class, items["primary"] ); + claimed_count["primary"]++; + allocation++; + bot_choose_weapon_option( class, "camo", 0 ); + bot_choose_weapon_option( class, "reticle", 0 ); + allocation += bot_choose_primary_attachments( class, weapon, allocation, allocation_max ); + } + else if ( !claimed_count["primary"] ) + secondary_chance = 100; + + remaining = allocation_max - allocation; + + if ( remaining >= 1 && bot_make_choice( secondary_chance, claimed_count["secondary"], 1 ) ) + { + if ( remaining >= 2 && randomint( 100 ) < 10 ) + { + self botclassadditem( class, "BONUSCARD_OVERKILL" ); + weapon = bot_choose_weapon( class, items["primary"] ); + allocation++; + } + else + { + weapon = bot_choose_weapon( class, items["secondary"] ); + bot_choose_weapon_option( class, "camo", 1 ); + } + + allocation++; + claimed_count["secondary"]++; + allocation += bot_choose_secondary_attachments( class, weapon, allocation, allocation_max ); + } + + perks_chance = 50; + lethal_chance = 30; + tactical_chance = 20; + + if ( claimed_count["specialty1"] && claimed_count["specialty2"] && claimed_count["specialty3"] ) + perks_chance = 0; + + if ( claimed_count["primarygrenade"] ) + lethal_chance = 0; + + if ( claimed_count["specialgrenade"] ) + tactical_chance = 0; + + if ( perks_chance + lethal_chance + tactical_chance <= 0 ) + return; + + next_action = bot_chose_action( "perks", perks_chance, "lethal", lethal_chance, "tactical", tactical_chance, "none", 0 ); + + if ( next_action == "perks" ) + { + remaining = allocation_max - allocation; + + if ( remaining >= 3 && !claimed_count["specialty1"] && randomint( 100 ) < 25 ) + { + self botclassadditem( class, "BONUSCARD_PERK_1_GREED" ); + bot_choose_weapon( class, items["specialty1"] ); + bot_choose_weapon( class, items["specialty1"] ); + claimed_count["specialty1"] = 2; + allocation += 3; + } + + remaining = allocation_max - allocation; + + if ( remaining >= 3 && !claimed_count["specialty2"] && randomint( 100 ) < 25 ) + { + self botclassadditem( class, "BONUSCARD_PERK_2_GREED" ); + bot_choose_weapon( class, items["specialty2"] ); + bot_choose_weapon( class, items["specialty2"] ); + claimed_count["specialty2"] = 2; + allocation += 3; + } + + remaining = allocation_max - allocation; + + if ( remaining >= 3 && !claimed_count["specialty3"] && randomint( 100 ) < 25 ) + { + self botclassadditem( class, "BONUSCARD_PERK_3_GREED" ); + bot_choose_weapon( class, items["specialty3"] ); + bot_choose_weapon( class, items["specialty3"] ); + claimed_count["specialty3"] = 2; + allocation += 3; + } + + remaining = allocation_max - allocation; + + for ( i = 0; i < 3; i++ ) + { + perks = []; + remaining = allocation_max - allocation; + + if ( remaining > 0 ) + { + if ( !claimed_count["specialty1"] ) + perks[perks.size] = "specialty1"; + + if ( !claimed_count["specialty2"] ) + perks[perks.size] = "specialty2"; + + if ( !claimed_count["specialty3"] ) + perks[perks.size] = "specialty3"; + + if ( perks.size ) + { + perk = random( perks ); + bot_choose_weapon( class, items[perk] ); + claimed_count[perk]++; + allocation++; + continue; + } + + break; + } + } + } + else if ( next_action == "lethal" ) + { + remaining = allocation_max - allocation; + + if ( remaining >= 2 && randomint( 100 ) < 50 ) + { + if ( !claimed_count["primarygrenade"] ) + { + bot_choose_weapon( class, items["primarygrenade"] ); + claimed_count["primarygrenade"]++; + allocation++; + } + + self botclassadditem( class, "BONUSCARD_DANGER_CLOSE" ); + allocation++; + } + else if ( remaining >= 1 && !claimed_count["primarygrenade"] ) + { + bot_choose_weapon( class, items["primarygrenade"] ); + claimed_count["primarygrenade"]++; + allocation++; + } + } + else if ( next_action == "tactical" ) + { + remaining = allocation_max - allocation; + + if ( remaining >= 2 && !claimed_count["specialgrenade"] && randomint( 100 ) < 50 ) + { + weapon = bot_choose_weapon( class, items["specialgrenade"] ); + + if ( weapon == "WEAPON_TACTICAL_INSERTION" || weapon == "WEAPON_WILLY_PETE" ) + { + claimed_count["specialgrenade"] = 1; + allocation += 1; + } + else + { + self botclassadditem( class, weapon ); + claimed_count["specialgrenade"] = 2; + allocation += 2; + } + } + else if ( remaining >= 1 && !claimed_count["specialgrenade"] ) + { + bot_choose_weapon( class, items["specialgrenade"] ); + claimed_count["specialgrenade"]++; + allocation++; + } + } + } } -bot_make_choice( chance, claimed, max_claim ) //checked changed at own discretion +bot_make_choice( chance, claimed, max_claim ) { - if ( claimed < max_claim && randomint( 100 ) < chance ) - { - return 1; - } - return 0; + return claimed < max_claim && randomint( 100 ) < chance; } -bot_chose_action( action1, chance1, action2, chance2, action3, chance3, action4, chance4 ) //checked changed to match cerberus output +bot_chose_action( action1, chance1, action2, chance2, action3, chance3, action4, chance4 ) { - chance1 = int( chance1 / 10 ); - chance2 = int( chance2 / 10 ); - chance3 = int( chance3 / 10 ); - chance4 = int( chance4 / 10 ); - actions = []; - for ( i = 0; i < chance1; i++ ) - { - actions[ actions.size ] = action1; - } - for ( i = 0; i < chance2; i++ ) - { - actions[ actions.size ] = action2; - } - for ( i = 0; i < chance3; i++ ) - { - actions[ actions.size ] = action3; - } - for ( i = 0; i < chance4; i++ ) - { - actions[ actions.size ] = action4; - } - return random( actions ); + chance1 = int( chance1 / 10 ); + chance2 = int( chance2 / 10 ); + chance3 = int( chance3 / 10 ); + chance4 = int( chance4 / 10 ); + actions = []; + + for ( i = 0; i < chance1; i++ ) + actions[actions.size] = action1; + + for ( i = 0; i < chance2; i++ ) + actions[actions.size] = action2; + + for ( i = 0; i < chance3; i++ ) + actions[actions.size] = action3; + + for ( i = 0; i < chance4; i++ ) + actions[actions.size] = action4; + + return random( actions ); } -bot_item_is_claimed( item ) //checked changed to match cerberus output +bot_item_is_claimed( item ) { - foreach ( claim in self.claimed_items ) - { - if ( claim == item ) - { - return 1; - } - } - return 0; + foreach ( claim in self.claimed_items ) + { + if ( claim == item ) + return true; + } + + return false; } -bot_choose_weapon( class, items ) //checked changed to match cerberus output +bot_choose_weapon( class, items ) { - if ( !isDefined( items ) || !items.size ) - { - return undefined; - } - start = randomint( items.size ); - for ( i = 0; i < items.size; i++ ) - { - weapon = items[ start ]; - if ( !bot_item_is_claimed( weapon ) ) - { - break; - } - start = ( start + 1 ) % items.size; - } - self.claimed_items[ self.claimed_items.size ] = weapon; - self botclassadditem( class, weapon ); - return weapon; + if ( !isdefined( items ) || !items.size ) + return undefined; + + start = randomint( items.size ); + + for ( i = 0; i < items.size; i++ ) + { + weapon = items[start]; + + if ( !bot_item_is_claimed( weapon ) ) + break; + + start = ( start + 1 ) % items.size; + } + + self.claimed_items[self.claimed_items.size] = weapon; + self botclassadditem( class, weapon ); + return weapon; } -bot_build_weapon_options_list( optiontype ) //checked changed to match cerberus output +bot_build_weapon_options_list( optiontype ) { - level.botweaponoptionsid[ optiontype ] = []; - level.botweaponoptionsprob[ optiontype ] = []; - prob = 0; - for ( row = 0; row < 255; row++ ) - { - if ( tablelookupcolumnforrow( "mp/attachmentTable.csv", row, 1 ) == optiontype ) - { - index = level.botweaponoptionsid[ optiontype ].size; - level.botweaponoptionsid[ optiontype ][ index ] = int( tablelookupcolumnforrow( "mp/attachmentTable.csv", row, 0 ) ); - prob += int( tablelookupcolumnforrow( "mp/attachmentTable.csv", row, 15 ) ); - level.botweaponoptionsprob[ optiontype ][ index ] = prob; - } - } + level.botweaponoptionsid[optiontype] = []; + level.botweaponoptionsprob[optiontype] = []; + prob = 0; + + for ( row = 0; row < 255; row++ ) + { + if ( tablelookupcolumnforrow( "mp/attachmentTable.csv", row, 1 ) == optiontype ) + { + index = level.botweaponoptionsid[optiontype].size; + level.botweaponoptionsid[optiontype][index] = int( tablelookupcolumnforrow( "mp/attachmentTable.csv", row, 0 ) ); + prob += int( tablelookupcolumnforrow( "mp/attachmentTable.csv", row, 15 ) ); + level.botweaponoptionsprob[optiontype][index] = prob; + } + } } -bot_choose_weapon_option( class, optiontype, primary ) //checked changed to match cerberus output may need to review order of operations +bot_choose_weapon_option( class, optiontype, primary ) { - if ( !isDefined( level.botweaponoptionsid ) ) - { - level.botweaponoptionsid = []; - level.botweaponoptionsprob = []; - bot_build_weapon_options_list( "camo" ); - bot_build_weapon_options_list( "reticle" ); - } - if ( !level.onlinegame && !level.systemlink ) - { - return; - } - numoptions = level.botweaponoptionsprob[ optiontype ].size; - maxprob = level.botweaponoptionsprob[ optiontype ][ numoptions - 1 ]; - if ( !level.systemlink && self.pers[ "rank" ] < 20 ) - { - maxprob += ( 4 * maxprob ) * ( ( 20 - self.pers[ "rank" ] ) / 20 ); - } - rnd = randomint( int( maxprob ) ); - for ( i = 0; i < numoptions; i++ ) - { - if ( level.botweaponoptionsprob[ optiontype ][ i ] > rnd ) - { - self botclasssetweaponoption( class, primary, optiontype, level.botweaponoptionsid[ optiontype ][ i ] ); - return; - } - } + if ( !isdefined( level.botweaponoptionsid ) ) + { + level.botweaponoptionsid = []; + level.botweaponoptionsprob = []; + bot_build_weapon_options_list( "camo" ); + bot_build_weapon_options_list( "reticle" ); + } + + if ( !level.onlinegame && !level.systemlink ) + return; + + numoptions = level.botweaponoptionsprob[optiontype].size; + maxprob = level.botweaponoptionsprob[optiontype][numoptions - 1]; + + if ( !level.systemlink && self.pers["rank"] < 20 ) + maxprob += 4 * maxprob * ( 20 - self.pers["rank"] ) / 20; + + rnd = randomint( int( maxprob ) ); + + for ( i = 0; i < numoptions; i++ ) + { + if ( level.botweaponoptionsprob[optiontype][i] > rnd ) + { + self botclasssetweaponoption( class, primary, optiontype, level.botweaponoptionsid[optiontype][i] ); + break; + } + } } -bot_choose_primary_attachments( class, weapon, allocation, allocation_max ) //checked changed to match cerberus output +bot_choose_primary_attachments( class, weapon, allocation, allocation_max ) { - attachments = getweaponattachments( weapon ); - remaining = allocation_max - allocation; - if ( !attachments.size || !remaining ) - { - return 0; - } - attachment_action = bot_chose_action( "3_attachments", 25, "2_attachments", 35, "1_attachments", 35, "none", 5 ); - if ( remaining >= 4 && attachment_action == "3_attachments" ) - { - a1 = random( attachments ); - self botclassaddattachment( class, weapon, a1, "primaryattachment1" ); - count = 1; - attachments = getweaponattachments( weapon, a1 ); - if ( attachments.size ) - { - a2 = random( attachments ); - self botclassaddattachment( class, weapon, a2, "primaryattachment2" ); - count++; - attachments = getweaponattachments( weapon, a1, a2 ); - if ( attachments.size ) - { - a3 = random( attachments ); - self botclassadditem( class, "BONUSCARD_PRIMARY_GUNFIGHTER" ); - self botclassaddattachment( class, weapon, a3, "primaryattachment3" ); - return 4; - } - } - return count; - } - else if ( remaining >= 2 && attachment_action == "2_attachments" ) - { - a1 = random( attachments ); - self botclassaddattachment( class, weapon, a1, "primaryattachment1" ); - attachments = getweaponattachments( weapon, a1 ); - if ( attachments.size ) - { - a2 = random( attachments ); - self botclassaddattachment( class, weapon, a2, "primaryattachment2" ); - return 2; - } - return 1; - } - else if ( remaining >= 1 && attachment_action == "1_attachments" ) - { - a = random( attachments ); - self botclassaddattachment( class, weapon, a, "primaryattachment1" ); - return 1; - } - return 0; + attachments = getweaponattachments( weapon ); + remaining = allocation_max - allocation; + + if ( !attachments.size || !remaining ) + return 0; + + attachment_action = bot_chose_action( "3_attachments", 25, "2_attachments", 35, "1_attachments", 35, "none", 5 ); + + if ( remaining >= 4 && attachment_action == "3_attachments" ) + { + a1 = random( attachments ); + self botclassaddattachment( class, weapon, a1, "primaryattachment1" ); + count = 1; + attachments = getweaponattachments( weapon, a1 ); + + if ( attachments.size ) + { + a2 = random( attachments ); + self botclassaddattachment( class, weapon, a2, "primaryattachment2" ); + count++; + attachments = getweaponattachments( weapon, a1, a2 ); + + if ( attachments.size ) + { + a3 = random( attachments ); + self botclassadditem( class, "BONUSCARD_PRIMARY_GUNFIGHTER" ); + self botclassaddattachment( class, weapon, a3, "primaryattachment3" ); + return 4; + } + } + + return count; + } + else if ( remaining >= 2 && attachment_action == "2_attachments" ) + { + a1 = random( attachments ); + self botclassaddattachment( class, weapon, a1, "primaryattachment1" ); + attachments = getweaponattachments( weapon, a1 ); + + if ( attachments.size ) + { + a2 = random( attachments ); + self botclassaddattachment( class, weapon, a2, "primaryattachment2" ); + return 2; + } + + return 1; + } + else if ( remaining >= 1 && attachment_action == "1_attachments" ) + { + a = random( attachments ); + self botclassaddattachment( class, weapon, a, "primaryattachment1" ); + return 1; + } + + return 0; } -bot_choose_secondary_attachments( class, weapon, allocation, allocation_max ) //checked changed to match cerberus output +bot_choose_secondary_attachments( class, weapon, allocation, allocation_max ) { - attachments = getweaponattachments( weapon ); - remaining = allocation_max - allocation; - if ( !attachments.size || !remaining ) - { - return 0; - } - attachment_action = bot_chose_action( "2_attachments", 10, "1_attachments", 40, "none", 50, "none", 0 ); - if ( remaining >= 3 && attachment_action == "2_attachments" ) - { - a1 = random( attachments ); - self botclassaddattachment( class, weapon, a1, "secondaryattachment1" ); - attachments = getweaponattachments( weapon, a1 ); - if ( attachments.size ) - { - a2 = random( attachments ); - self botclassadditem( class, "BONUSCARD_SECONDARY_GUNFIGHTER" ); - self botclassaddattachment( class, weapon, a2, "secondaryattachment2" ); - return 3; - } - return 1; - } - else if ( remaining >= 1 && attachment_action == "1_attachments" ) - { - a = random( attachments ); - self botclassaddattachment( class, weapon, a, "secondaryattachment1" ); - return 1; - } - return 0; + attachments = getweaponattachments( weapon ); + remaining = allocation_max - allocation; + + if ( !attachments.size || !remaining ) + return 0; + + attachment_action = bot_chose_action( "2_attachments", 10, "1_attachments", 40, "none", 50, "none", 0 ); + + if ( remaining >= 3 && attachment_action == "2_attachments" ) + { + a1 = random( attachments ); + self botclassaddattachment( class, weapon, a1, "secondaryattachment1" ); + attachments = getweaponattachments( weapon, a1 ); + + if ( attachments.size ) + { + a2 = random( attachments ); + self botclassadditem( class, "BONUSCARD_SECONDARY_GUNFIGHTER" ); + self botclassaddattachment( class, weapon, a2, "secondaryattachment2" ); + return 3; + } + + return 1; + } + else if ( remaining >= 1 && attachment_action == "1_attachments" ) + { + a = random( attachments ); + self botclassaddattachment( class, weapon, a, "secondaryattachment1" ); + return 1; + } + + return 0; } -bot_build_item_list() //checked partially changed to match cerberus output did not change while loop to for loop see github for more info +bot_build_item_list() { - pixbeginevent( "bot_build_item_list" ); - items = []; - i = 0; - while ( i < 256 ) - { - row = tablelookuprownum( level.statstableid, 0, i ); - if ( row > -1 ) - { - slot = tablelookupcolumnforrow( level.statstableid, row, 13 ); - if ( slot == "" ) - { - i++; - continue; - } - number = int( tablelookupcolumnforrow( level.statstableid, row, 0 ) ); - if ( self isitemlocked( number ) ) - { - i++; - continue; - } - allocation = int( tablelookupcolumnforrow( level.statstableid, row, 12 ) ); - if ( allocation < 0 ) - { - i++; - continue; - } - name = tablelookupcolumnforrow( level.statstableid, row, 3 ); - if ( bot_item_is_banned( slot, name ) ) - { - i++; - continue; - } - if ( !isDefined( items[ slot ] ) ) - { - items[ slot ] = []; - } - items[ slot ][ items[ slot ].size ] = name; - } - i++; - } - pixendevent(); - return items; + pixbeginevent( "bot_build_item_list" ); + items = []; + + for ( i = 0; i < 256; i++ ) + { + row = tablelookuprownum( level.statstableid, 0, i ); + + if ( row > -1 ) + { + slot = tablelookupcolumnforrow( level.statstableid, row, 13 ); + + if ( slot == "" ) + continue; + + number = int( tablelookupcolumnforrow( level.statstableid, row, 0 ) ); + + if ( self isitemlocked( number ) ) + continue; + + allocation = int( tablelookupcolumnforrow( level.statstableid, row, 12 ) ); + + if ( allocation < 0 ) + continue; + + name = tablelookupcolumnforrow( level.statstableid, row, 3 ); + + if ( bot_item_is_banned( slot, name ) ) + continue; + + if ( !isdefined( items[slot] ) ) + items[slot] = []; + + items[slot][items[slot].size] = name; + } + } + + pixendevent(); + return items; } -bot_item_is_banned( slot, item ) //checked changed to match cerberus output +bot_item_is_banned( slot, item ) { - if ( item == "WEAPON_KNIFE_BALLISTIC" ) - { - return 1; - } - if ( /* getDvarInt( #"97A055DA" ) == 0 && */ item == "WEAPON_PEACEKEEPER" ) - { - return 1; - } - if ( slot != "killstreak1" && slot != "killstreak2" && slot != "killstreak3" ) - { - return 0; - } - foreach ( banned in level.bot_banned_killstreaks ) - { - if ( item == banned ) - { - return 1; - } - } - return 0; + if ( item == "WEAPON_KNIFE_BALLISTIC" ) + return true; + + if ( getdvarint( "tu6_enableDLCWeapons" ) == 0 && item == "WEAPON_PEACEKEEPER" ) + return true; + + if ( slot != "killstreak1" && slot != "killstreak2" && slot != "killstreak3" ) + return false; + + foreach ( banned in level.bot_banned_killstreaks ) + { + if ( item == banned ) + return true; + } + + return false; } -bot_build_claimed_list( items ) //checked changed to match cerberus output +bot_build_claimed_list( items ) { - claimed = []; - keys = getarraykeys( items ); - foreach ( key in keys ) - { - claimed[ key ] = 0; - } - return claimed; -} + claimed = []; + keys = getarraykeys( items ); + foreach ( key in keys ) + claimed[key] = 0; + + return claimed; +} diff --git a/Multiplayer Core/patch_mp/maps/mp/bots/_bot_sd.gsc b/Multiplayer Core/patch_mp/maps/mp/bots/_bot_sd.gsc index 53f49ec..c07e50a 100644 --- a/Multiplayer Core/patch_mp/maps/mp/bots/_bot_sd.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/bots/_bot_sd.gsc @@ -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; + } + } +} diff --git a/Multiplayer Core/patch_mp/maps/mp/gametypes/_battlechatter_mp.gsc b/Multiplayer Core/patch_mp/maps/mp/gametypes/_battlechatter_mp.gsc index a159c3a..40b4831 100644 --- a/Multiplayer Core/patch_mp/maps/mp/gametypes/_battlechatter_mp.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/gametypes/_battlechatter_mp.gsc @@ -1,1141 +1,1134 @@ -//checked includes match cerberus output -#include maps/mp/killstreaks/_killstreaks; -#include maps/mp/gametypes/_globallogic; -#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 -init() //checked changed to match cerberus output +init() { - if ( level.createfx_enabled ) - { - return; - } - foreach ( team in level.teams ) - { - /* + if ( level.createfx_enabled ) + return; + + foreach ( team in level.teams ) + { /# - assert( isDefined( level.teamprefix[ team ] ) ); + assert( isdefined( level.teamprefix[team] ) ); #/ /# - assert( isDefined( level.teamprefix[ team ] ) ); + assert( isdefined( level.teamprefix[team] ) ); #/ - */ - level.isteamspeaking[ team ] = 0; - level.speakers[ team ] = []; - } - level.bcsounds = []; - level.bcsounds[ "inform_attack" ] = "attack"; - level.bcsounds[ "c4_out" ] = "c4"; - level.bcsounds[ "claymore_out" ] = "claymore"; - level.bcsounds[ "emp_out" ] = "emp"; - level.bcsounds[ "flash_out" ] = "flash"; - level.bcsounds[ "gas_out" ] = "gas"; - level.bcsounds[ "frag_out" ] = "grenade"; - level.bcsounds[ "revive_out" ] = "revive"; - level.bcsounds[ "smoke_out" ] = "smoke"; - level.bcsounds[ "sticky_out" ] = "sticky"; - level.bcsounds[ "gas_incoming" ] = "gas"; - level.bcsounds[ "grenade_incoming" ] = "incoming"; - level.bcsounds[ "kill" ] = "kill"; - level.bcsounds[ "kill_sniper" ] = "kill_sniper"; - level.bcsounds[ "revive" ] = "need_revive"; - level.bcsounds[ "reload" ] = "reloading"; - level.bcsounds[ "enemy" ] = "threat"; - level.bcsounds[ "sniper" ] = "sniper"; - level.bcsounds[ "conc_out" ] = "attack_stun"; - level.bcsounds[ "satchel_plant" ] = "attack_throwsatchel"; - level.bcsounds[ "casualty" ] = "casualty_gen"; - level.bcsounds[ "flare_out" ] = "attack_flare"; - level.bcsounds[ "betty_plant" ] = "plant"; - level.bcsounds[ "landmark" ] = "landmark"; - level.bcsounds[ "taunt" ] = "taunt"; - level.bcsounds[ "killstreak_enemy" ] = "enemy"; - level.bcsounds[ "killstreak_taunt" ] = "kls"; - level.bcsounds[ "kill_killstreak" ] = "killstreak"; - level.bcsounds[ "destructible" ] = "destructible_near"; - level.bcsounds[ "teammate" ] = "teammate_near"; - level.bcsounds[ "gametype" ] = "gametype"; - level.bcsounds[ "squad" ] = "squad"; - level.bcsounds[ "gametype" ] = "gametype"; - level.bcsounds[ "perk" ] = "perk_equip"; - level.bcsounds[ "pain" ] = "pain"; - level.bcsounds[ "death" ] = "death"; - level.bcsounds[ "breathing" ] = "breathing"; - level.bcsounds[ "inform_need" ] = "need"; - level.bcsounds[ "scream" ] = "scream"; - level.bcsounds[ "fire" ] = "fire"; - setdvar( "bcmp_weapon_delay", "2000" ); - setdvar( "bcmp_weapon_fire_probability", "80" ); - setdvar( "bcmp_weapon_reload_probability", "60" ); - setdvar( "bcmp_weapon_fire_threat_probability", "80" ); - setdvar( "bcmp_sniper_kill_probability", "20" ); - setdvar( "bcmp_ally_kill_probability", "60" ); - setdvar( "bcmp_killstreak_incoming_probability", "100" ); - setdvar( "bcmp_perk_call_probability", "100" ); - setdvar( "bcmp_incoming_grenade_probability", "5" ); - setdvar( "bcmp_toss_grenade_probability", "20" ); - setdvar( "bcmp_toss_trophy_probability", "80" ); - setdvar( "bcmp_kill_inform_probability", "40" ); - setdvar( "bcmp_pain_small_probability", "0" ); - setdvar( "bcmp_breathing_probability", "0" ); - setdvar( "bcmp_pain_delay", ".5" ); - setdvar( "bcmp_last_stand_delay", "3" ); - setdvar( "bcmp_breathing_delay", "" ); - setdvar( "bcmp_enemy_contact_delay", "30" ); - setdvar( "bcmp_enemy_contact_level_delay", "15" ); - level.bcweapondelay = getDvarInt( "bcmp_weapon_delay" ); - level.bcweaponfireprobability = getDvarInt( "bcmp_weapon_fire_probability" ); - level.bcweaponreloadprobability = getDvarInt( "bcmp_weapon_reload_probability" ); - level.bcweaponfirethreatprobability = getDvarInt( "bcmp_weapon_fire_threat_probability" ); - level.bcsniperkillprobability = getDvarInt( "bcmp_sniper_kill_probability" ); - level.bcallykillprobability = getDvarInt( "bcmp_ally_kill_probability" ); - level.bckillstreakincomingprobability = getDvarInt( "bcmp_killstreak_incoming_probability" ); - level.bcperkcallprobability = getDvarInt( "bcmp_perk_call_probability" ); - level.bcincominggrenadeprobability = getDvarInt( "bcmp_incoming_grenade_probability" ); - level.bctossgrenadeprobability = getDvarInt( "bcmp_toss_grenade_probability" ); - level.bctosstrophyprobability = getDvarInt( "bcmp_toss_trophy_probability" ); - level.bckillinformprobability = getDvarInt( "bcmp_kill_inform_probability" ); - level.bcpainsmallprobability = getDvarInt( "bcmp_pain_small_probability" ); - level.bcpaindelay = getDvarInt( "bcmp_pain_delay" ); - level.bclaststanddelay = getDvarInt( "bcmp_last_stand_delay" ); - level.bcmp_breathing_delay = getDvarInt( "bcmp_breathing_delay" ); - level.bcmp_enemy_contact_delay = getDvarInt( "bcmp_enemy_contact_delay" ); - level.bcmp_enemy_contact_level_delay = getDvarInt( "bcmp_enemy_contact_level_delay" ); - level.bcmp_breathing_probability = getDvarInt( "bcmp_breathing_probability" ); - level.allowbattlechatter = getgametypesetting( "allowBattleChatter" ); - level.landmarks = getentarray( "trigger_landmark", "targetname" ); - level.enemyspotteddialog = 1; - level thread enemycontactleveldelay(); - level thread onplayerconnect(); - level thread updatebcdvars(); - level.battlechatter_init = 1; + level.isteamspeaking[team] = 0; + level.speakers[team] = []; + } + + level.bcsounds = []; + level.bcsounds["inform_attack"] = "attack"; + level.bcsounds["c4_out"] = "c4"; + level.bcsounds["claymore_out"] = "claymore"; + level.bcsounds["emp_out"] = "emp"; + level.bcsounds["flash_out"] = "flash"; + level.bcsounds["gas_out"] = "gas"; + level.bcsounds["frag_out"] = "grenade"; + level.bcsounds["revive_out"] = "revive"; + level.bcsounds["smoke_out"] = "smoke"; + level.bcsounds["sticky_out"] = "sticky"; + level.bcsounds["gas_incoming"] = "gas"; + level.bcsounds["grenade_incoming"] = "incoming"; + level.bcsounds["kill"] = "kill"; + level.bcsounds["kill_sniper"] = "kill_sniper"; + level.bcsounds["revive"] = "need_revive"; + level.bcsounds["reload"] = "reloading"; + level.bcsounds["enemy"] = "threat"; + level.bcsounds["sniper"] = "sniper"; + level.bcsounds["conc_out"] = "attack_stun"; + level.bcsounds["satchel_plant"] = "attack_throwsatchel"; + level.bcsounds["casualty"] = "casualty_gen"; + level.bcsounds["flare_out"] = "attack_flare"; + level.bcsounds["betty_plant"] = "plant"; + level.bcsounds["landmark"] = "landmark"; + level.bcsounds["taunt"] = "taunt"; + level.bcsounds["killstreak_enemy"] = "enemy"; + level.bcsounds["killstreak_taunt"] = "kls"; + level.bcsounds["kill_killstreak"] = "killstreak"; + level.bcsounds["destructible"] = "destructible_near"; + level.bcsounds["teammate"] = "teammate_near"; + level.bcsounds["gametype"] = "gametype"; + level.bcsounds["squad"] = "squad"; + level.bcsounds["gametype"] = "gametype"; + level.bcsounds["perk"] = "perk_equip"; + level.bcsounds["pain"] = "pain"; + level.bcsounds["death"] = "death"; + level.bcsounds["breathing"] = "breathing"; + level.bcsounds["inform_need"] = "need"; + level.bcsounds["scream"] = "scream"; + level.bcsounds["fire"] = "fire"; + setdvar( "bcmp_weapon_delay", "2000" ); + setdvar( "bcmp_weapon_fire_probability", "80" ); + setdvar( "bcmp_weapon_reload_probability", "60" ); + setdvar( "bcmp_weapon_fire_threat_probability", "80" ); + setdvar( "bcmp_sniper_kill_probability", "20" ); + setdvar( "bcmp_ally_kill_probability", "60" ); + setdvar( "bcmp_killstreak_incoming_probability", "100" ); + setdvar( "bcmp_perk_call_probability", "100" ); + setdvar( "bcmp_incoming_grenade_probability", "5" ); + setdvar( "bcmp_toss_grenade_probability", "20" ); + setdvar( "bcmp_toss_trophy_probability", "80" ); + setdvar( "bcmp_kill_inform_probability", "40" ); + setdvar( "bcmp_pain_small_probability", "0" ); + setdvar( "bcmp_breathing_probability", "0" ); + setdvar( "bcmp_pain_delay", ".5" ); + setdvar( "bcmp_last_stand_delay", "3" ); + setdvar( "bcmp_breathing_delay", "" ); + setdvar( "bcmp_enemy_contact_delay", "30" ); + setdvar( "bcmp_enemy_contact_level_delay", "15" ); + level.bcweapondelay = getdvarint( "bcmp_weapon_delay" ); + level.bcweaponfireprobability = getdvarint( "bcmp_weapon_fire_probability" ); + level.bcweaponreloadprobability = getdvarint( "bcmp_weapon_reload_probability" ); + level.bcweaponfirethreatprobability = getdvarint( "bcmp_weapon_fire_threat_probability" ); + level.bcsniperkillprobability = getdvarint( "bcmp_sniper_kill_probability" ); + level.bcallykillprobability = getdvarint( "bcmp_ally_kill_probability" ); + level.bckillstreakincomingprobability = getdvarint( "bcmp_killstreak_incoming_probability" ); + level.bcperkcallprobability = getdvarint( "bcmp_perk_call_probability" ); + level.bcincominggrenadeprobability = getdvarint( "bcmp_incoming_grenade_probability" ); + level.bctossgrenadeprobability = getdvarint( "bcmp_toss_grenade_probability" ); + level.bctosstrophyprobability = getdvarint( "bcmp_toss_trophy_probability" ); + level.bckillinformprobability = getdvarint( "bcmp_kill_inform_probability" ); + level.bcpainsmallprobability = getdvarint( "bcmp_pain_small_probability" ); + level.bcpaindelay = getdvarint( "bcmp_pain_delay" ); + level.bclaststanddelay = getdvarint( "bcmp_last_stand_delay" ); + level.bcmp_breathing_delay = getdvarint( "bcmp_breathing_delay" ); + level.bcmp_enemy_contact_delay = getdvarint( "bcmp_enemy_contact_delay" ); + level.bcmp_enemy_contact_level_delay = getdvarint( "bcmp_enemy_contact_level_delay" ); + level.bcmp_breathing_probability = getdvarint( "bcmp_breathing_probability" ); + level.allowbattlechatter = getgametypesetting( "allowBattleChatter" ); + level.landmarks = getentarray( "trigger_landmark", "targetname" ); + level.enemyspotteddialog = 1; + level thread enemycontactleveldelay(); + level thread onplayerconnect(); + level thread updatebcdvars(); + level.battlechatter_init = 1; } -onplayerconnect() //checked matches cerberus output +onplayerconnect() { - for ( ;; ) - { - level waittill( "connecting", player ); - player thread onjoinedteam(); - player thread onplayerspawned(); - } + for (;;) + { + level waittill( "connecting", player ); + + player thread onjoinedteam(); + player thread onplayerspawned(); + } } -updatebcdvars() //checked matches cerberus output +updatebcdvars() { - level endon( "game_ended" ); - for ( ;; ) - { - level.bcweapondelay = getDvarInt( "bcmp_weapon_delay" ); - level.bckillinformprobability = getDvarInt( "bcmp_kill_inform_probability" ); - level.bcweaponfireprobability = getDvarInt( "bcmp_weapon_fire_probability" ); - level.bcsniperkillprobability = getDvarInt( "bcmp_sniper_kill_probability" ); - level thread maps/mp/gametypes/_globallogic::updateteamstatus(); - wait 2; - } + level endon( "game_ended" ); + + for (;;) + { + level.bcweapondelay = getdvarint( "bcmp_weapon_delay" ); + level.bckillinformprobability = getdvarint( "bcmp_kill_inform_probability" ); + level.bcweaponfireprobability = getdvarint( "bcmp_weapon_fire_probability" ); + level.bcsniperkillprobability = getdvarint( "bcmp_sniper_kill_probability" ); + level thread maps\mp\gametypes\_globallogic::updateteamstatus(); + wait 2.0; + } } -onjoinedteam() //checked matches cerberus output +onjoinedteam() { - self endon( "disconnect" ); - for ( ;; ) - { - self waittill( "joined_team" ); - self.pers[ "bcVoiceNumber" ] = randomintrange( 0, 3 ); - self.pilotisspeaking = 0; - } + self endon( "disconnect" ); + + for (;;) + { + self waittill( "joined_team" ); + + self.pers["bcVoiceNumber"] = randomintrange( 0, 3 ); + self.pilotisspeaking = 0; + } } -onjoinedspectators() //checked matches cerberus output +onjoinedspectators() { - self endon( "disconnect" ); - for ( ;; ) - { - self waittill( "joined_spectators" ); - } + self endon( "disconnect" ); + + for (;;) + self waittill( "joined_spectators" ); } -onplayerspawned() //checked changed to match cerberus output +onplayerspawned() { - self endon( "disconnect" ); - for ( ;; ) - { - self waittill( "spawned_player" ); - self.lastbcattempttime = 0; - self.heartbeatsnd = 0; - self.soundmod = "player"; - self.bcvoicenumber = self.pers[ "bcVoiceNumber" ]; - self.pilotisspeaking = 0; - if ( level.splitscreen ) - { - continue; - } - self thread reloadtracking(); - self thread grenadetracking(); - self thread enemythreat(); - self thread stickygrenadetracking(); - self thread painvox(); - self thread allyrevive(); - self thread onfirescream(); - self thread deathvox(); - self thread watchmissileusage(); - } + self endon( "disconnect" ); + + for (;;) + { + self waittill( "spawned_player" ); + + self.lastbcattempttime = 0; + self.heartbeatsnd = 0; + self.soundmod = "player"; + self.bcvoicenumber = self.pers["bcVoiceNumber"]; + self.pilotisspeaking = 0; + + if ( level.splitscreen ) + continue; + + self thread reloadtracking(); + self thread grenadetracking(); + self thread enemythreat(); + self thread stickygrenadetracking(); + self thread painvox(); + self thread allyrevive(); + self thread onfirescream(); + self thread deathvox(); + self thread watchmissileusage(); + } } enemycontactleveldelay() { - while ( 1 ) //checked matches cerberus output - { - level waittill( "level_enemy_spotted" ); - level.enemyspotteddialog = 0; - wait level.bcmp_enemy_contact_level_delay; - level.enemyspotteddialog = 1; - } + while ( true ) + { + level waittill( "level_enemy_spotted" ); + + level.enemyspotteddialog = 0; + wait( level.bcmp_enemy_contact_level_delay ); + level.enemyspotteddialog = 1; + } } -breathinghurtvox() //checked matches cerberus output +breathinghurtvox() { - self endon( "death" ); - self endon( "disconnect" ); - level endon( "game_ended" ); - for ( ;; ) - { - self waittill( "snd_breathing_hurt" ); - if ( randomintrange( 0, 100 ) >= level.bcmp_breathing_probability ) - { - wait 0.5; - if ( isalive( self ) ) - { - level thread mpsaylocalsound( self, "breathing", "hurt", 0, 1 ); - } - } - wait level.bcmp_breathing_delay; - } + self endon( "death" ); + self endon( "disconnect" ); + level endon( "game_ended" ); + + for (;;) + { + self waittill( "snd_breathing_hurt" ); + + if ( randomintrange( 0, 100 ) >= level.bcmp_breathing_probability ) + { + wait 0.5; + + if ( isalive( self ) ) + level thread mpsaylocalsound( self, "breathing", "hurt", 0, 1 ); + } + + wait( level.bcmp_breathing_delay ); + } } -onfirescream() //checked matches cerberus output +onfirescream() { - self endon( "death" ); - self endon( "disconnect" ); - for ( ;; ) - { - self waittill( "snd_burn_scream" ); - if ( randomintrange( 0, 100 ) >= level.bcmp_breathing_probability ) - { - wait 0.5; - if ( isalive( self ) ) - { - level thread mpsaylocalsound( self, "fire", "scream" ); - } - } - wait level.bcmp_breathing_delay; - } + self endon( "death" ); + self endon( "disconnect" ); + + for (;;) + { + self waittill( "snd_burn_scream" ); + + if ( randomintrange( 0, 100 ) >= level.bcmp_breathing_probability ) + { + wait 0.5; + + if ( isalive( self ) ) + level thread mpsaylocalsound( self, "fire", "scream" ); + } + + wait( level.bcmp_breathing_delay ); + } } -breathingbettervox() //checked matches cerberus output +breathingbettervox() { - self endon( "death" ); - self endon( "disconnect" ); - level endon( "game_ended" ); - for ( ;; ) - { - self waittill( "snd_breathing_better" ); - if ( isalive( self ) ) - { - level thread mpsaylocalsound( self, "breathing", "better", 0, 1 ); - } - } + self endon( "death" ); + self endon( "disconnect" ); + level endon( "game_ended" ); + + for (;;) + { + self waittill( "snd_breathing_better" ); + + if ( isalive( self ) ) + level thread mpsaylocalsound( self, "breathing", "better", 0, 1 ); + } } -laststandvox() //checked matches cerberus output +laststandvox() { - self endon( "death" ); - self endon( "disconnect" ); - self waittill( "snd_last_stand" ); - for ( ;; ) - { - self waittill( "weapon_fired" ); - if ( isalive( self ) ) - { - level thread mpsaylocalsound( self, "perk", "laststand" ); - } - wait level.bclaststanddelay; - } + self endon( "death" ); + self endon( "disconnect" ); + + self waittill( "snd_last_stand" ); + + for (;;) + { + self waittill( "weapon_fired" ); + + if ( isalive( self ) ) + level thread mpsaylocalsound( self, "perk", "laststand" ); + + wait( level.bclaststanddelay ); + } } -allyrevive() //checked matches cerberus output +allyrevive() { - self endon( "death" ); - self endon( "disconnect" ); - for ( ;; ) - { - self waittill( "snd_ally_revive" ); - if ( isalive( self ) ) - { - level thread mpsaylocalsound( self, "inform_attack", "revive" ); - } - wait level.bclaststanddelay; - } + self endon( "death" ); + self endon( "disconnect" ); + + for (;;) + { + self waittill( "snd_ally_revive" ); + + if ( isalive( self ) ) + level thread mpsaylocalsound( self, "inform_attack", "revive" ); + + wait( level.bclaststanddelay ); + } } -painvox() //checked matches cerberus output +painvox() { - self endon( "death" ); - self endon( "disconnect" ); - for ( ;; ) - { - self waittill( "snd_pain_player" ); - if ( randomintrange( 0, 100 ) >= level.bcpainsmallprobability ) - { - if ( isalive( self ) ) - { - soundalias = level.teamprefix[ self.team ] + self.bcvoicenumber + "_" + level.bcsounds[ "pain" ] + "_" + "small"; - self thread dosound( soundalias ); - } - } - wait level.bcpaindelay; - } + self endon( "death" ); + self endon( "disconnect" ); + + for (;;) + { + self waittill( "snd_pain_player" ); + + if ( randomintrange( 0, 100 ) >= level.bcpainsmallprobability ) + { + if ( isalive( self ) ) + { + soundalias = level.teamprefix[self.team] + self.bcvoicenumber + "_" + level.bcsounds["pain"] + "_" + "small"; + self thread dosound( soundalias ); + } + } + + wait( level.bcpaindelay ); + } } -deathvox() //checked matches cerberus output +deathvox() { - self endon( "disconnect" ); - self waittill( "death" ); - if ( self.team != "spectator" ) - { - soundalias = level.teamprefix[ self.team ] + self.bcvoicenumber + "_" + level.bcsounds[ "pain" ] + "_" + "death"; - self thread dosound( soundalias ); - } + self endon( "disconnect" ); + + self waittill( "death" ); + + if ( self.team != "spectator" ) + { + soundalias = level.teamprefix[self.team] + self.bcvoicenumber + "_" + level.bcsounds["pain"] + "_" + "death"; + self thread dosound( soundalias ); + } } -stickygrenadetracking() //checked matches cerberus output +stickygrenadetracking() { - self endon( "death" ); - self endon( "disconnect" ); - self endon( "sticky_explode" ); - for ( ;; ) - { - self waittill( "grenade_stuck", grenade ); - if ( isDefined( grenade ) ) - { - grenade.stucktoplayer = self; - } - if ( isalive( self ) ) - { - level thread mpsaylocalsound( self, "grenade_incoming", "sticky" ); - } - self notify( "sticky_explode" ); - } + self endon( "death" ); + self endon( "disconnect" ); + self endon( "sticky_explode" ); + + for (;;) + { + self waittill( "grenade_stuck", grenade ); + + if ( isdefined( grenade ) ) + grenade.stucktoplayer = self; + + if ( isalive( self ) ) + level thread mpsaylocalsound( self, "grenade_incoming", "sticky" ); + + self notify( "sticky_explode" ); + } } -onplayersuicideorteamkill( player, type ) //checked matches cerberus output +onplayersuicideorteamkill( player, type ) { - self endon( "disconnect" ); - waittillframeend; - if ( !isDefined( level.battlechatter_init ) ) - { - return; - } - if ( !level.teambased ) - { - return; - } - myteam = player.team; - if ( isDefined( level.aliveplayers[ myteam ] ) ) - { - if ( level.aliveplayers[ myteam ].size ) - { - index = checkdistancetoevent( player, 1000000 ); - if ( isDefined( index ) ) - { - wait 1; - if ( isalive( level.aliveplayers[ myteam ][ index ] ) ) - { - level thread mpsaylocalsound( level.aliveplayers[ myteam ][ index ], "teammate", type ); - } - } - } - } + self endon( "disconnect" ); + waittillframeend; + + if ( !isdefined( level.battlechatter_init ) ) + return; + + if ( !level.teambased ) + return; + + myteam = player.team; + + if ( isdefined( level.aliveplayers[myteam] ) ) + { + if ( level.aliveplayers[myteam].size ) + { + index = checkdistancetoevent( player, 1000000 ); + + if ( isdefined( index ) ) + { + wait 1.0; + + if ( isalive( level.aliveplayers[myteam][index] ) ) + level thread mpsaylocalsound( level.aliveplayers[myteam][index], "teammate", type ); + } + } + } } -onplayerkillstreak( player ) //checked matches cerberus output +onplayerkillstreak( player ) { - player endon( "disconnect" ); + player endon( "disconnect" ); } -onkillstreakused( killstreak, team ) //checked matches cerberus output +onkillstreakused( killstreak, team ) { + } -onplayernearexplodable( object, type ) //checked matches cerberus output +onplayernearexplodable( object, type ) { - self endon( "disconnect" ); - self endon( "explosion_started" ); + self endon( "disconnect" ); + self endon( "explosion_started" ); } -shoeboxtracking() //checked matches cerberus output +shoeboxtracking() { - self endon( "death" ); - self endon( "disconnect" ); - while ( 1 ) - { - self waittill( "begin_firing" ); - weaponname = self getcurrentweapon(); - if ( weaponname == "mine_shoebox_mp" ) - { - level thread mpsaylocalsound( self, "satchel_plant", "shoebox" ); - } - } + self endon( "death" ); + self endon( "disconnect" ); + + while ( true ) + { + self waittill( "begin_firing" ); + + weaponname = self getcurrentweapon(); + + if ( weaponname == "mine_shoebox_mp" ) + level thread mpsaylocalsound( self, "satchel_plant", "shoebox" ); + } } -checkweaponreload( weapon ) //checked matches cerberus output +checkweaponreload( weapon ) { - switch( weapon ) - { - case "crossbow_mp": - case "fhj18_mp": - case "judge_mp": - case "smaw_mp": - case "usrpg_mp": - return 0; - default: - return 1; - } + switch ( weapon ) + { + case "usrpg_mp": + case "smaw_mp": + case "judge_mp": + case "fhj18_mp": + case "crossbow_mp": + return false; + default: + return true; + } } -reloadtracking() //checked matches cerberus output +reloadtracking() { - self endon( "death" ); - self endon( "disconnect" ); - for ( ;; ) - { - self waittill( "reload_start" ); - if ( randomintrange( 0, 100 ) >= level.bcweaponreloadprobability ) - { - weaponname = self getcurrentweapon(); - weaponshouldreload = checkweaponreload( weaponname ); - if ( weaponshouldreload ) - { - level thread mpsaylocalsound( self, "reload", "gen" ); - } - } - } + self endon( "death" ); + self endon( "disconnect" ); + + for (;;) + { + self waittill( "reload_start" ); + + if ( randomintrange( 0, 100 ) >= level.bcweaponreloadprobability ) + { + weaponname = self getcurrentweapon(); + weaponshouldreload = checkweaponreload( weaponname ); + + if ( weaponshouldreload ) + level thread mpsaylocalsound( self, "reload", "gen" ); + } + } } -perkspecificbattlechatter( type, checkdistance ) //checked matches cerberus output +perkspecificbattlechatter( type, checkdistance ) { - self endon( "death" ); - self endon( "disconnect" ); - self endon( "perk_done" ); + self endon( "death" ); + self endon( "disconnect" ); + self endon( "perk_done" ); } -enemythreat() //checked matches cerberus output +enemythreat() { - self endon( "death" ); - self endon( "disconnect" ); - for ( ;; ) - { - self waittill( "weapon_fired" ); - if ( level.enemyspotteddialog ) - { - if ( ( getTime() - self.lastbcattempttime ) > level.bcmp_enemy_contact_delay ) - { - shooter = self; - myteam = self.team; - closest_enemy = shooter get_closest_player_enemy(); - self.lastbcattempttime = getTime(); - if ( isDefined( closest_enemy ) ) - { - if ( randomintrange( 0, 100 ) >= level.bcweaponfirethreatprobability ) - { - area = 360000; - if ( distancesquared( closest_enemy.origin, self.origin ) < area ) - { - level thread mpsaylocalsound( closest_enemy, "enemy", "infantry", 0 ); - level notify( "level_enemy_spotted" ); - } - } - } - } - } - } + self endon( "death" ); + self endon( "disconnect" ); + + for (;;) + { + self waittill( "weapon_fired" ); + + if ( level.enemyspotteddialog ) + { + if ( gettime() - self.lastbcattempttime > level.bcmp_enemy_contact_delay ) + { + shooter = self; + myteam = self.team; + closest_enemy = shooter get_closest_player_enemy(); + self.lastbcattempttime = gettime(); + + if ( isdefined( closest_enemy ) ) + { + if ( randomintrange( 0, 100 ) >= level.bcweaponfirethreatprobability ) + { + area = 360000; + + if ( distancesquared( closest_enemy.origin, self.origin ) < area ) + { + level thread mpsaylocalsound( closest_enemy, "enemy", "infantry", 0 ); + level notify( "level_enemy_spotted" ); + } + } + } + } + } + } } -weaponfired() //checked changed to match cerberus output +weaponfired() { - self endon( "death" ); - self endon( "disconnect" ); - for ( ;; ) - { - self waittill( "weapon_fired" ); - if ( ( getTime() - self.lastbcattempttime ) > level.bcweapondelay ) - { - self.lastbcattempttime = getTime(); - if ( randomintrange( 0, 100 ) >= level.bcweaponfireprobability ) - { - self.landmarkent = self getlandmark(); - if ( isDefined( self.landmarkent ) ) - { - myteam = self.team; - foreach ( team in level.teams ) - { - if ( team == myteam ) - { - break; - } - keys = getarraykeys( level.squads[ team ] ); - for ( i = 0; i < keys.size; i++ ) - { - if ( level.squads[ team ][ keys[ i ] ].size ) - { - index = randomintrange( 0, level.squads[ team ][ keys[ i ] ].size ); - level thread mpsaylocalsound( level.squads[ team ][ keys[ i ] ][ index ], "enemy", "infantry" ); - } - } - } - } - } - } - } + self endon( "death" ); + self endon( "disconnect" ); + + for (;;) + { + self waittill( "weapon_fired" ); + + if ( gettime() - self.lastbcattempttime > level.bcweapondelay ) + { + self.lastbcattempttime = gettime(); + + if ( randomintrange( 0, 100 ) >= level.bcweaponfireprobability ) + { + self.landmarkent = self getlandmark(); + + if ( isdefined( self.landmarkent ) ) + { + myteam = self.team; + + foreach ( team in level.teams ) + { + if ( team == myteam ) + continue; + + keys = getarraykeys( level.squads[team] ); + + for ( i = 0; i < keys.size; i++ ) + { + if ( level.squads[team][keys[i]].size ) + { + index = randomintrange( 0, level.squads[team][keys[i]].size ); + level thread mpsaylocalsound( level.squads[team][keys[i]][index], "enemy", "infantry" ); + } + } + } + } + } + } + } } -killedbysniper( sniper ) //checked matches cerberus output +killedbysniper( sniper ) { - self endon( "disconnect" ); - sniper endon( "disconnect" ); - waittillframeend; - if ( !isDefined( level.battlechatter_init ) ) - { - return; - } - victim = self; - if ( level.hardcoremode || !level.teambased ) - { - return; - } - sniper.issniperspotted = 1; - if ( randomintrange( 0, 100 ) >= level.bcsniperkillprobability ) - { - sniperteam = sniper.team; - victimteam = self.team; - index = checkdistancetoevent( victim, 1000000 ); - if ( isDefined( index ) ) - { - level thread mpsaylocalsound( level.aliveplayers[ victimteam ][ index ], "enemy", "sniper", 0 ); - } - } + self endon( "disconnect" ); + sniper endon( "disconnect" ); + waittillframeend; + + if ( !isdefined( level.battlechatter_init ) ) + return; + + victim = self; + + if ( level.hardcoremode || !level.teambased ) + return; + + sniper.issniperspotted = 1; + + if ( randomintrange( 0, 100 ) >= level.bcsniperkillprobability ) + { + sniperteam = sniper.team; + victimteam = self.team; + index = checkdistancetoevent( victim, 1000000 ); + + if ( isdefined( index ) ) + level thread mpsaylocalsound( level.aliveplayers[victimteam][index], "enemy", "sniper", 0 ); + } } -playerkilled( attacker ) //checked matches cerberus output +playerkilled( attacker ) { - self endon( "disconnect" ); - if ( !isplayer( attacker ) ) - { - return; - } - waittillframeend; - if ( !isDefined( level.battlechatter_init ) ) - { - return; - } - victim = self; - if ( level.hardcoremode ) - { - return; - } - if ( randomintrange( 0, 100 ) >= level.bcallykillprobability ) - { - attackerteam = attacker.team; - victimteam = self.team; - closest_ally = victim get_closest_player_ally(); - area = 1000000; - if ( isDefined( closest_ally ) ) - { - if ( distancesquared( closest_ally.origin, self.origin ) < area ) - { - level thread mpsaylocalsound( closest_ally, "inform_attack", "revive", 0 ); - } - } - } + self endon( "disconnect" ); + + if ( !isplayer( attacker ) ) + return; + + waittillframeend; + + if ( !isdefined( level.battlechatter_init ) ) + return; + + victim = self; + + if ( level.hardcoremode ) + return; + + if ( randomintrange( 0, 100 ) >= level.bcallykillprobability ) + { + attackerteam = attacker.team; + victimteam = self.team; + closest_ally = victim get_closest_player_ally(); + area = 1000000; + + if ( isdefined( closest_ally ) ) + { + if ( distancesquared( closest_ally.origin, self.origin ) < area ) + level thread mpsaylocalsound( closest_ally, "inform_attack", "revive", 0 ); + } + } } -grenadetracking() //checked changed to match cerberus output +grenadetracking() { - self endon( "death" ); - self endon( "disconnect" ); - for ( ;; ) - { - self waittill( "grenade_fire", grenade, weaponname ); - if ( weaponname == "frag_grenade_mp" ) - { - if ( randomintrange( 0, 100 ) >= level.bctossgrenadeprobability ) - { - level thread mpsaylocalsound( self, "inform_attack", "grenade" ); - } - level thread incominggrenadetracking( self, grenade, "grenade" ); - continue; - } - if ( weaponname == "satchel_charge_mp" ) - { - if ( randomintrange( 0, 100 ) >= level.bctossgrenadeprobability ) - { - level thread mpsaylocalsound( self, "inform_attack", "c4" ); - } - continue; - } - if ( weaponname == "emp_grenade_mp" ) - { - if ( randomintrange( 0, 100 ) >= level.bctossgrenadeprobability ) - { - level thread mpsaylocalsound( self, "inform_attack", "emp" ); - } - continue; - } - if ( weaponname == "claymore_mp" ) - { - if ( randomintrange( 0, 100 ) >= level.bctossgrenadeprobability ) - { - level thread mpsaylocalsound( self, "inform_attack", "claymore" ); - } - continue; - } - if ( weaponname == "flash_grenade_mp" ) - { - if ( randomintrange( 0, 100 ) >= level.bctossgrenadeprobability ) - { - level thread mpsaylocalsound( self, "inform_attack", "flash" ); - } - continue; - } - if ( weaponname == "sticky_grenade_mp" ) - { - if ( randomintrange( 0, 100 ) >= level.bctossgrenadeprobability ) - { - level thread mpsaylocalsound( self, "inform_attack", "sticky" ); - } - continue; - } - if ( weaponname == "tabun_gas_mp" ) - { - if ( randomintrange( 0, 100 ) >= level.bctossgrenadeprobability ) - { - level thread mpsaylocalsound( self, "inform_attack", "gas" ); - } - continue; - } - if ( weaponname == "willy_pete_mp" ) - { - if ( randomintrange( 0, 100 ) >= level.bctossgrenadeprobability ) - { - level thread mpsaylocalsound( self, "inform_attack", "smoke" ); - } - continue; - } - if ( weaponname == "hatchet_mp" || weaponname == "proximity_grenade_mp" ) - { - if ( randomintrange( 0, 100 ) >= level.bctossgrenadeprobability ) - { - level thread mpsaylocalsound( self, "inform_attack", "hatchet" ); - } - continue; - } - if ( weaponname == "concussion_grenade_mp" ) - { - if ( randomintrange( 0, 100 ) >= level.bctossgrenadeprobability ) - { - level thread mpsaylocalsound( self, "inform_attack", "concussion" ); - } - continue; - } - if ( weaponname == "scrambler_mp" ) - { - if ( randomintrange( 0, 100 ) >= level.bctossgrenadeprobability ) - { - level thread mpsaylocalsound( self, "inform_attack", "scrambler" ); - } - continue; - } - if ( weaponname == "tactical_insertion_mp" ) - { - if ( randomintrange( 0, 100 ) >= level.bctossgrenadeprobability ) - { - level thread mpsaylocalsound( self, "inform_attack", "tactical" ); - } - continue; - } - if ( weaponname == "bouncingbetty_mp" ) - { - if ( randomintrange( 0, 100 ) >= level.bctosstrophyprobability ) - { - level thread mpsaylocalsound( self, "inform_attack", "c4" ); - } - continue; - } - if ( weaponname == "sensor_grenade_mp" ) - { - if ( randomintrange( 0, 100 ) >= level.bctossgrenadeprobability ) - { - level thread mpsaylocalsound( self, "inform_attack", "hatchet" ); - } - continue; - } - if ( weaponname == "trophy_system_mp" ) - { - if ( randomintrange( 0, 100 ) >= level.bctosstrophyprobability ) - { - level thread mpsaylocalsound( self, "inform_attack", "scrambler" ); - } - } - } + self endon( "death" ); + self endon( "disconnect" ); + + for (;;) + { + self waittill( "grenade_fire", grenade, weaponname ); + + if ( weaponname == "frag_grenade_mp" ) + { + if ( randomintrange( 0, 100 ) >= level.bctossgrenadeprobability ) + level thread mpsaylocalsound( self, "inform_attack", "grenade" ); + + level thread incominggrenadetracking( self, grenade, "grenade" ); + continue; + } + + if ( weaponname == "satchel_charge_mp" ) + { + if ( randomintrange( 0, 100 ) >= level.bctossgrenadeprobability ) + level thread mpsaylocalsound( self, "inform_attack", "c4" ); + + continue; + } + + if ( weaponname == "emp_grenade_mp" ) + { + if ( randomintrange( 0, 100 ) >= level.bctossgrenadeprobability ) + level thread mpsaylocalsound( self, "inform_attack", "emp" ); + + continue; + } + + if ( weaponname == "claymore_mp" ) + { + if ( randomintrange( 0, 100 ) >= level.bctossgrenadeprobability ) + level thread mpsaylocalsound( self, "inform_attack", "claymore" ); + + continue; + } + + if ( weaponname == "flash_grenade_mp" ) + { + if ( randomintrange( 0, 100 ) >= level.bctossgrenadeprobability ) + level thread mpsaylocalsound( self, "inform_attack", "flash" ); + + continue; + } + + if ( weaponname == "sticky_grenade_mp" ) + { + if ( randomintrange( 0, 100 ) >= level.bctossgrenadeprobability ) + level thread mpsaylocalsound( self, "inform_attack", "sticky" ); + + continue; + } + + if ( weaponname == "tabun_gas_mp" ) + { + if ( randomintrange( 0, 100 ) >= level.bctossgrenadeprobability ) + level thread mpsaylocalsound( self, "inform_attack", "gas" ); + + continue; + } + + if ( weaponname == "willy_pete_mp" ) + { + if ( randomintrange( 0, 100 ) >= level.bctossgrenadeprobability ) + level thread mpsaylocalsound( self, "inform_attack", "smoke" ); + + continue; + } + + if ( weaponname == "hatchet_mp" || weaponname == "proximity_grenade_mp" ) + { + if ( randomintrange( 0, 100 ) >= level.bctossgrenadeprobability ) + level thread mpsaylocalsound( self, "inform_attack", "hatchet" ); + + continue; + } + + if ( weaponname == "concussion_grenade_mp" ) + { + if ( randomintrange( 0, 100 ) >= level.bctossgrenadeprobability ) + level thread mpsaylocalsound( self, "inform_attack", "concussion" ); + + continue; + } + + if ( weaponname == "scrambler_mp" ) + { + if ( randomintrange( 0, 100 ) >= level.bctossgrenadeprobability ) + level thread mpsaylocalsound( self, "inform_attack", "scrambler" ); + + continue; + } + + if ( weaponname == "tactical_insertion_mp" ) + { + if ( randomintrange( 0, 100 ) >= level.bctossgrenadeprobability ) + level thread mpsaylocalsound( self, "inform_attack", "tactical" ); + + continue; + } + + if ( weaponname == "bouncingbetty_mp" ) + { + if ( randomintrange( 0, 100 ) >= level.bctosstrophyprobability ) + level thread mpsaylocalsound( self, "inform_attack", "c4" ); + + continue; + } + + if ( weaponname == "sensor_grenade_mp" ) + { + if ( randomintrange( 0, 100 ) >= level.bctossgrenadeprobability ) + level thread mpsaylocalsound( self, "inform_attack", "hatchet" ); + + continue; + } + + if ( weaponname == "trophy_system_mp" ) + { + if ( randomintrange( 0, 100 ) >= level.bctosstrophyprobability ) + level thread mpsaylocalsound( self, "inform_attack", "scrambler" ); + } + } } -watchmissileusage() //checked changed to match cerberus output +watchmissileusage() { - self endon( "death" ); - self endon( "disconnect" ); - level endon( "game_ended" ); - for ( ;; ) - { - self waittill( "missile_fire", missile, weapon_name ); - if ( weapon_name == "usrpg_mp" ) - { - level thread incominggrenadetracking( self, missile, "rpg", 0.2 ); - } - return; - } + self endon( "death" ); + self endon( "disconnect" ); + level endon( "game_ended" ); + + for (;;) + { + self waittill( "missile_fire", missile, weapon_name ); + + if ( weapon_name == "usrpg_mp" ) + { + level thread incominggrenadetracking( self, missile, "rpg", 0.2 ); + continue; + } + + return; + } } -incominggrenadetracking( thrower, grenade, type, waittime ) //checked matches cerberus output +incominggrenadetracking( thrower, grenade, type, waittime ) { - if ( randomintrange( 0, 100 ) >= level.bcincominggrenadeprobability ) - { - if ( !isDefined( waittime ) ) - { - waittime = 1; - } - wait waittime; - if ( !isDefined( thrower ) ) - { - return; - } - if ( thrower.team == "spectator" ) - { - return; - } - enemyteam = thrower.team; - if ( level.players.size ) - { - player = checkdistancetoobject( 250000, grenade, enemyteam, thrower ); - if ( isDefined( player ) ) - { - level thread mpsaylocalsound( player, "grenade_incoming", type ); - } - } - } + if ( randomintrange( 0, 100 ) >= level.bcincominggrenadeprobability ) + { + if ( !isdefined( waittime ) ) + waittime = 1.0; + + wait( waittime ); + + if ( !isdefined( thrower ) ) + return; + + if ( thrower.team == "spectator" ) + return; + + enemyteam = thrower.team; + + if ( level.players.size ) + { + player = checkdistancetoobject( 250000, grenade, enemyteam, thrower ); + + if ( isdefined( player ) ) + level thread mpsaylocalsound( player, "grenade_incoming", type ); + } + } } -incomingspecialgrenadetracking( type ) //checked matches cerberus output +incomingspecialgrenadetracking( type ) { - self endon( "death" ); - self endon( "disconnect" ); - self endon( "grenade_ended" ); - for ( ;; ) - { - if ( randomintrange( 0, 100 ) >= level.bcincominggrenadeprobability ) - { - if ( level.aliveplayers[ self.team ].size || !level.teambased && level.players.size ) - { - level thread mpsaylocalsound( self, "grenade_incoming", type ); - self notify( "grenade_ended" ); - } - } - wait 3; - } + self endon( "death" ); + self endon( "disconnect" ); + self endon( "grenade_ended" ); + + for (;;) + { + if ( randomintrange( 0, 100 ) >= level.bcincominggrenadeprobability ) + { + if ( level.aliveplayers[self.team].size || !level.teambased && level.players.size ) + { + level thread mpsaylocalsound( self, "grenade_incoming", type ); + self notify( "grenade_ended" ); + } + } + + wait 3.0; + } } -gametypespecificbattlechatter( event, team ) //checked changed to match the beta dump _battlechatter_mp.gsc +gametypespecificbattlechatter( event, team ) { - self endon( "death" ); - self endon( "disconnect" ); - self endon( "event_ended" ); - for ( ;; ) - { - if ( isDefined( team ) ) - { + self endon( "death" ); + self endon( "disconnect" ); + self endon( "event_ended" ); - index = CheckDistanceToEvent( self, 300 * 300 ); - if ( isDefined( index ) ) - { - level thread mpSayLocalSound( level.alivePlayers[ team ][ index ], "gametype", event ); - self notify( "event_ended" ); - } - } - else - { - foreach ( team in level.teams ) - { - index = randomIntRange( 0, level.alivePlayers[ team ].size ); - level thread mpSayLocalSound( level.alivePlayers[ team ][ index ], "gametype", event ); - } - } - wait 1; - } + for (;;) + { + if ( isdefined( team ) ) + { + index = checkdistancetoevent( self, 90000 ); + + if ( isdefined( index ) ) + { + level thread mpsaylocalsound( level.aliveplayers[team][index], "gametype", event ); + self notify( "event_ended" ); + } + } + else + { + foreach ( team in level.teams ) + { + index = randomintrange( 0, level.aliveplayers[team].size ); + level thread mpsaylocalsound( level.aliveplayers[team][index], "gametype", event ); + } + } + + wait 1.0; + } } -checkweaponkill( weapon ) //checked matches cerberus output +checkweaponkill( weapon ) { - switch( weapon ) - { - case "cobra_20mm_comlink_mp": - case "knife_mp": - return 1; - default: - return 0; - } + switch ( weapon ) + { + case "knife_mp": + case "cobra_20mm_comlink_mp": + return true; + default: + return false; + } } -saykillbattlechatter( attacker, sweapon, victim ) //checked changed to match cerberus output +saykillbattlechatter( attacker, sweapon, victim ) { - if ( checkweaponkill( sweapon ) ) - { - return; - } - if ( is_true( victim.issniperspotted ) && randomintrange( 0, 100 ) >= level.bckillinformprobability ) - { - level thread saylocalsounddelayed( attacker, "kill", "sniper", 0.75 ); - victim.issniperspotted = 0; - } - else if ( isDefined( level.bckillinformprobability ) && randomintrange( 0, 100 ) >= level.bckillinformprobability ) - { - if ( !maps/mp/killstreaks/_killstreaks::iskillstreakweapon( sweapon ) ) - { - level thread saylocalsounddelayed( attacker, "kill", "infantry", 0.75 ); - } - } + if ( checkweaponkill( sweapon ) ) + return; + + if ( isdefined( victim.issniperspotted ) && victim.issniperspotted && randomintrange( 0, 100 ) >= level.bckillinformprobability ) + { + level thread saylocalsounddelayed( attacker, "kill", "sniper", 0.75 ); + victim.issniperspotted = 0; + } + else if ( isdefined( level.bckillinformprobability ) && randomintrange( 0, 100 ) >= level.bckillinformprobability ) + { + if ( !maps\mp\killstreaks\_killstreaks::iskillstreakweapon( sweapon ) ) + level thread saylocalsounddelayed( attacker, "kill", "infantry", 0.75 ); + } } -saylocalsounddelayed( player, soundtype1, soundtype2, delay ) //checked matches cerberus output +saylocalsounddelayed( player, soundtype1, soundtype2, delay ) { - player endon( "death" ); - player endon( "disconnect" ); - if ( !isDefined( level.battlechatter_init ) ) - { - return; - } - wait delay; - mpsaylocalsound( player, soundtype1, soundtype2 ); + player endon( "death" ); + player endon( "disconnect" ); + + if ( !isdefined( level.battlechatter_init ) ) + return; + + wait( delay ); + mpsaylocalsound( player, soundtype1, soundtype2 ); } -saylocalsound( player, soundtype ) //checked matches cerberus output +saylocalsound( player, soundtype ) { - player endon( "death" ); - player endon( "disconnect" ); - if ( isspeakerinrange( player ) ) - { - return; - } - if ( player.team != "spectator" ) - { - soundalias = level.teamprefix[ player.team ] + player.bcvoicenumber + "_" + level.bcsounds[ soundtype ]; - } + player endon( "death" ); + player endon( "disconnect" ); + + if ( isspeakerinrange( player ) ) + return; + + if ( player.team != "spectator" ) + soundalias = level.teamprefix[player.team] + player.bcvoicenumber + "_" + level.bcsounds[soundtype]; } -mpsaylocalsound( player, partone, parttwo, checkspeakers, is2d ) //checked changed to match cerberus output +mpsaylocalsound( player, partone, parttwo, checkspeakers, is2d ) { - player endon( "death" ); - player endon( "disconnect" ); - if ( level.players.size <= 1 ) - { - return; - } - if ( !isDefined( checkspeakers ) ) - { - if ( isspeakerinrange( player ) ) - { - return; - } - } - if ( player hasperk( "specialty_quieter" ) ) - { - return; - } - if ( player.team != "spectator" ) - { - soundalias = level.teamprefix[ player.team ] + player.bcvoicenumber + "_" + level.bcsounds[ partone ] + "_" + parttwo; - if ( isDefined( is2d ) ) - { - player thread dosound( soundalias, is2d ); - } - else - { - player thread dosound( soundalias ); - } - } + player endon( "death" ); + player endon( "disconnect" ); + + if ( level.players.size <= 1 ) + return; + + if ( !isdefined( checkspeakers ) ) + { + if ( isspeakerinrange( player ) ) + return; + } + + if ( player hasperk( "specialty_quieter" ) ) + return; + + if ( player.team != "spectator" ) + { + soundalias = level.teamprefix[player.team] + player.bcvoicenumber + "_" + level.bcsounds[partone] + "_" + parttwo; + + if ( isdefined( is2d ) ) + player thread dosound( soundalias, is2d ); + else + player thread dosound( soundalias ); + } } -mpsaylocationallocalsound( player, prefix, partone, parttwo ) //checked matches cerberus output +mpsaylocationallocalsound( player, prefix, partone, parttwo ) { - player endon( "death" ); - player endon( "disconnect" ); - if ( level.players.size <= 1 ) - { - return; - } - if ( isspeakerinrange( player ) ) - { - return; - } - if ( player.team != "spectator" ) - { - soundalias1 = level.teamprefix[ player.team ] + player.bcvoicenumber + "_" + level.bcsounds[ prefix ]; - soundalias2 = level.teamprefix[ player.team ] + player.bcvoicenumber + "_" + level.bcsounds[ partone ] + "_" + parttwo; - player thread dolocationalsound( soundalias1, soundalias2 ); - } + player endon( "death" ); + player endon( "disconnect" ); + + if ( level.players.size <= 1 ) + return; + + if ( isspeakerinrange( player ) ) + return; + + if ( player.team != "spectator" ) + { + soundalias1 = level.teamprefix[player.team] + player.bcvoicenumber + "_" + level.bcsounds[prefix]; + soundalias2 = level.teamprefix[player.team] + player.bcvoicenumber + "_" + level.bcsounds[partone] + "_" + parttwo; + player thread dolocationalsound( soundalias1, soundalias2 ); + } } -dosound( soundalias, is2d ) //checked changed to match cerberus output +dosound( soundalias, is2d ) { - team = self.team; - level addspeaker( self, team ); - if ( isDefined( is2d ) ) - { - self playlocalsound( soundalias ); - } - else if ( level.allowbattlechatter && level.teambased ) - { - self playsoundontag( soundalias, "J_Head" ); - } - self thread waitplaybacktime( soundalias ); - self waittill_any( soundalias, "death", "disconnect" ); - level removespeaker( self, team ); + team = self.team; + level addspeaker( self, team ); + + if ( isdefined( is2d ) ) + self playlocalsound( soundalias ); + else if ( level.allowbattlechatter && level.teambased ) + self playsoundontag( soundalias, "J_Head" ); + + self thread waitplaybacktime( soundalias ); + self waittill_any( soundalias, "death", "disconnect" ); + level removespeaker( self, team ); } -dolocationalsound( soundalias1, soundalias2 ) //checked matches cerberus output +dolocationalsound( soundalias1, soundalias2 ) { - team = self.team; - level addspeaker( self, team ); - if ( level.allowbattlechatter && level.teambased ) - { - self playbattlechattertoteam( soundalias1, soundalias2, team, self ); - } - self thread waitplaybacktime( soundalias1 ); - self waittill_any( soundalias1, "death", "disconnect" ); - level removespeaker( self, team ); + team = self.team; + level addspeaker( self, team ); + + if ( level.allowbattlechatter && level.teambased ) + self playbattlechattertoteam( soundalias1, soundalias2, team, self ); + + self thread waitplaybacktime( soundalias1 ); + self waittill_any( soundalias1, "death", "disconnect" ); + level removespeaker( self, team ); } -waitplaybacktime( soundalias ) //checked matches cerberus output +waitplaybacktime( soundalias ) { - self endon( "death" ); - self endon( "disconnect" ); - playbacktime = soundgetplaybacktime( soundalias ); - if ( playbacktime >= 0 ) - { - waittime = playbacktime * 0,001; - wait waittime; - } - else - { - wait 1; - } - self notify( soundalias ); + self endon( "death" ); + self endon( "disconnect" ); + playbacktime = soundgetplaybacktime( soundalias ); + + if ( playbacktime >= 0 ) + { + waittime = playbacktime * 0.001; + wait( waittime ); + } + else + wait 1.0; + + self notify( soundalias ); } -isspeakerinrange( player ) //checked changed to match cerberus output +isspeakerinrange( player ) { - player endon( "death" ); - player endon( "disconnect" ); - distsq = 1000000; - if ( isDefined( player ) && isDefined( player.team ) && player.team != "spectator" ) - { - for ( index = 0; index < level.speakers[player.team].size; index++ ) - { - teammate = level.speakers[ player.team ][ index ]; - if ( teammate == player ) - { - return 1; - } - if ( distancesquared( teammate.origin, player.origin ) < distsq ) - { - return 1; - } - } - } - return 0; + player endon( "death" ); + player endon( "disconnect" ); + distsq = 1000000; + + if ( isdefined( player ) && isdefined( player.team ) && player.team != "spectator" ) + { + for ( index = 0; index < level.speakers[player.team].size; index++ ) + { + teammate = level.speakers[player.team][index]; + + if ( teammate == player ) + return true; + + if ( distancesquared( teammate.origin, player.origin ) < distsq ) + return true; + } + } + + return false; } -addspeaker( player, team ) //checked matches cerberus output +addspeaker( player, team ) { - level.speakers[ team ][ level.speakers[ team ].size ] = player; + level.speakers[team][level.speakers[team].size] = player; } -removespeaker( player, team ) //checked partially changed to match cerberus output did not change while loop to for loop see github for more info +removespeaker( player, team ) { - newspeakers = []; - index = 0; - while ( index < level.speakers[ team ].size ) - { - if ( level.speakers[ team ][ index ] == player ) - { - index++; - continue; - } - newspeakers[ newspeakers.size ] = level.speakers[ team ][ index ]; - index++; - } - level.speakers[ team ] = newspeakers; + newspeakers = []; + + for ( index = 0; index < level.speakers[team].size; index++ ) + { + if ( level.speakers[team][index] == player ) + continue; + + newspeakers[newspeakers.size] = level.speakers[team][index]; + } + + level.speakers[team] = newspeakers; } -getlandmark() //checked changed to match cerberus output +getlandmark() { - landmarks = level.landmarks; - for ( i = 0; i < landmarks.size; i++ ) - { - if ( self istouching( landmarks[ i ] ) && isDefined( landmarks[ i ].script_landmark ) ) - { - return landmarks[ i ]; - } - } - return undefined; + landmarks = level.landmarks; + + for ( i = 0; i < landmarks.size; i++ ) + { + if ( self istouching( landmarks[i] ) && isdefined( landmarks[i].script_landmark ) ) + return landmarks[i]; + } + + return undefined; } -checkdistancetoevent( player, area ) //checked partially changed to match cerberus output did not change while loop to for loop see github for more info +checkdistancetoevent( player, area ) { - if ( !isDefined( player ) ) - { - return undefined; - } - index = 0; - while ( index < level.aliveplayers[ player.team ].size ) - { - teammate = level.aliveplayers[ player.team ][ index ]; - if ( !isDefined( teammate ) ) - { - index++; - continue; - } - if ( teammate == player ) - { - index++; - continue; - } - if ( distancesquared( teammate.origin, player.origin ) < area ) - { - return index; - } - index++; - } + if ( !isdefined( player ) ) + return undefined; + + for ( index = 0; index < level.aliveplayers[player.team].size; index++ ) + { + teammate = level.aliveplayers[player.team][index]; + + if ( !isdefined( teammate ) ) + continue; + + if ( teammate == player ) + continue; + + if ( distancesquared( teammate.origin, player.origin ) < area ) + return index; + } } -checkdistancetoenemy( enemy, area, team ) //checked changed to match cerberus output +checkdistancetoenemy( enemy, area, team ) { - if ( !isDefined( enemy ) ) - { - return undefined; - } - for ( index = 0; index < level.aliveplayers[team].size; index++ ) - { - player = level.aliveplayers[ team ][ index ]; - if ( distancesquared( enemy.origin, player.origin ) < area ) - { - return index; - } - } + if ( !isdefined( enemy ) ) + return undefined; + + for ( index = 0; index < level.aliveplayers[team].size; index++ ) + { + player = level.aliveplayers[team][index]; + + if ( distancesquared( enemy.origin, player.origin ) < area ) + return index; + } } -checkdistancetoobject( area, object, ignoreteam, ignoreent ) //checked partially changed to match cerberus output did not change while loops to for loops see github for more info +checkdistancetoobject( area, object, ignoreteam, ignoreent ) { - if ( isDefined( ignoreteam ) ) - { - foreach ( team in level.teams ) - { - i = 0; - while ( i < level.aliveplayers[ team ].size ) - { - player = level.aliveplayers[ team ][ i ]; - if ( isDefined( ignoreent ) && player == ignoreent ) - { - i++; - continue; - } - if ( isDefined( object ) && distancesquared( player.origin, object.origin ) < area ) - { - return player; - } - i++; - } - } - } - i = 0; - while ( i < level.players.size ) - { - player = level.players[ i ]; - if ( isDefined( ignoreent ) && player == ignoreent ) - { - i++; - continue; - } - if ( isalive( player ) ) - { - if ( isDefined( object ) && distancesquared( player.origin, object.origin ) < area ) - { - return player; - } - } - i++; - } + if ( isdefined( ignoreteam ) ) + { + foreach ( team in level.teams ) + { + for ( i = 0; i < level.aliveplayers[team].size; i++ ) + { + player = level.aliveplayers[team][i]; + + if ( isdefined( ignoreent ) && player == ignoreent ) + continue; + + if ( isdefined( object ) && distancesquared( player.origin, object.origin ) < area ) + return player; + } + } + } + else + { + for ( i = 0; i < level.players.size; i++ ) + { + player = level.players[i]; + + if ( isdefined( ignoreent ) && player == ignoreent ) + continue; + + if ( isalive( player ) ) + { + if ( isdefined( object ) && distancesquared( player.origin, object.origin ) < area ) + return player; + } + } + } } -get_closest_player_enemy() //checked partially changed to match cerberus output did not use continue in foreach see github for more info +get_closest_player_enemy() { - players = getplayers(); - players = arraysort( players, self.origin ); - foreach ( player in players ) - { - if ( !isDefined( player ) || !isalive( player ) ) - { - } - else if ( player.sessionstate != "playing" ) - { - } - else if ( player == self ) - { - } - else if ( level.teambased && self.team == player.team ) - { - } - else - { - return player; - } - } - return undefined; + players = getplayers(); + players = arraysort( players, self.origin ); + + foreach ( player in players ) + { + if ( !isdefined( player ) || !isalive( player ) ) + continue; + + if ( player.sessionstate != "playing" ) + continue; + + if ( player == self ) + continue; + + if ( level.teambased && self.team == player.team ) + continue; + + return player; + } + + return undefined; } -get_closest_player_ally() //checked partially changed to match cerberus output did not use continue in foreach see github for more info +get_closest_player_ally() { - if ( !level.teambased ) - { - return undefined; - } - players = getplayers( self.team ); - players = arraysort( players, self.origin ); - foreach ( player in players ) - { - if ( !isDefined( player ) || !isalive( player ) ) - { - } - else if ( player.sessionstate != "playing" ) - { - } - else if ( player == self ) - { - } - else - { - return player; - } - } - return undefined; -} + if ( !level.teambased ) + return undefined; + players = getplayers( self.team ); + players = arraysort( players, self.origin ); + + foreach ( player in players ) + { + if ( !isdefined( player ) || !isalive( player ) ) + continue; + + if ( player.sessionstate != "playing" ) + continue; + + if ( player == self ) + continue; + + return player; + } + + return undefined; +} diff --git a/Multiplayer Core/patch_mp/maps/mp/gametypes/_callbacksetup.gsc b/Multiplayer Core/patch_mp/maps/mp/gametypes/_callbacksetup.gsc index a435745..781467f 100644 --- a/Multiplayer Core/patch_mp/maps/mp/gametypes/_callbacksetup.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/gametypes/_callbacksetup.gsc @@ -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() { -} +} diff --git a/Multiplayer Core/patch_mp/maps/mp/gametypes/_class.gsc b/Multiplayer Core/patch_mp/maps/mp/gametypes/_class.gsc index 76157dd..66252a7 100644 --- a/Multiplayer Core/patch_mp/maps/mp/gametypes/_class.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/gametypes/_class.gsc @@ -1,1300 +1,1146 @@ -//checked includes match cerberus output -#include maps/mp/_challenges; -#include maps/mp/gametypes/_dev; -#include maps/mp/teams/_teams; -#include maps/mp/gametypes/_class; -#include maps/mp/killstreaks/_killstreak_weapons; -#include maps/mp/killstreaks/_killstreaks; -#include maps/mp/gametypes/_tweakables; -#include maps/mp/_utility; -#include common_scripts/utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool -init() //checked partially changed to match cerberus output and beta dump did not change while loop to for loop see github for more info +init() { - level.classmap[ "class_smg" ] = "CLASS_SMG"; - level.classmap[ "class_cqb" ] = "CLASS_CQB"; - level.classmap[ "class_assault" ] = "CLASS_ASSAULT"; - level.classmap[ "class_lmg" ] = "CLASS_LMG"; - level.classmap[ "class_sniper" ] = "CLASS_SNIPER"; - level.classmap[ "custom0" ] = "CLASS_CUSTOM1"; - level.classmap[ "custom1" ] = "CLASS_CUSTOM2"; - level.classmap[ "custom2" ] = "CLASS_CUSTOM3"; - level.classmap[ "custom3" ] = "CLASS_CUSTOM4"; - level.classmap[ "custom4" ] = "CLASS_CUSTOM5"; - level.classmap[ "custom5" ] = "CLASS_CUSTOM6"; - level.classmap[ "custom6" ] = "CLASS_CUSTOM7"; - level.classmap[ "custom7" ] = "CLASS_CUSTOM8"; - level.classmap[ "custom8" ] = "CLASS_CUSTOM9"; - level.classmap[ "custom9" ] = "CLASS_CUSTOM10"; - level.maxkillstreaks = 4; - level.maxspecialties = 6; - level.maxbonuscards = 3; - level.maxallocation = getgametypesetting( "maxAllocation" ); - level.loadoutkillstreaksenabled = getgametypesetting( "loadoutKillstreaksEnabled" ); - level.prestigenumber = 5; - level.defaultclass = "CLASS_ASSAULT"; - if ( maps/mp/gametypes/_tweakables::gettweakablevalue( "weapon", "allowfrag" ) ) - { - level.weapons[ "frag" ] = "frag_grenade_mp"; - } - else - { - level.weapons[ "frag" ] = ""; - } - if ( maps/mp/gametypes/_tweakables::gettweakablevalue( "weapon", "allowsmoke" ) ) - { - level.weapons[ "smoke" ] = "smoke_grenade_mp"; - } - else - { - level.weapons[ "smoke" ] = ""; - } - if ( maps/mp/gametypes/_tweakables::gettweakablevalue( "weapon", "allowflash" ) ) - { - level.weapons[ "flash" ] = "flash_grenade_mp"; - } - else - { - level.weapons[ "flash" ] = ""; - } - level.weapons[ "concussion" ] = "concussion_grenade_mp"; - if ( maps/mp/gametypes/_tweakables::gettweakablevalue( "weapon", "allowsatchel" ) ) - { - level.weapons[ "satchel_charge" ] = "satchel_charge_mp"; - } - else - { - level.weapons[ "satchel_charge" ] = ""; - } - if ( maps/mp/gametypes/_tweakables::gettweakablevalue( "weapon", "allowbetty" ) ) - { - level.weapons[ "betty" ] = "mine_bouncing_betty_mp"; - } - else - { - level.weapons[ "betty" ] = ""; - } - if ( maps/mp/gametypes/_tweakables::gettweakablevalue( "weapon", "allowrpgs" ) ) - { - level.weapons[ "rpg" ] = "rpg_mp"; - } - else - { - level.weapons[ "rpg" ] = ""; - } - create_class_exclusion_list(); - cac_init(); - load_default_loadout( "CLASS_SMG", 10 ); - load_default_loadout( "CLASS_CQB", 11 ); - load_default_loadout( "CLASS_ASSAULT", 12 ); - load_default_loadout( "CLASS_LMG", 13 ); - load_default_loadout( "CLASS_SNIPER", 14 ); - level.primary_weapon_array = []; - level.side_arm_array = []; - level.grenade_array = []; - level.inventory_array = []; - max_weapon_num = 99; - i = 0; - while ( i < max_weapon_num ) - { - if ( !isDefined( level.tbl_weaponids[ i ] ) || level.tbl_weaponids[ i ][ "group" ] == "" ) - { - i++; - continue; - } - if ( !isDefined( level.tbl_weaponids[ i ] ) || level.tbl_weaponids[ i ][ "reference" ] == "" ) - { - i++; - continue; - } - weapon_type = level.tbl_weaponids[ i ][ "group" ]; - weapon = level.tbl_weaponids[ i ][ "reference" ]; - attachment = level.tbl_weaponids[ i ][ "attachment" ]; - weapon_class_register( weapon + "_mp", weapon_type ); - if ( isDefined( attachment ) && attachment != "" ) - { - attachment_tokens = strtok( attachment, " " ); - if ( isDefined( attachment_tokens ) ) - { - if ( attachment_tokens.size == 0 ) - { - weapon_class_register( ( weapon + "_" ) + attachment + "_mp", weapon_type ); - } - else - { - for ( k = 0; k < attachment_tokens.size; k++ ) - { - weapon_class_register( ( weapon + "_" ) + attachment_tokens[ k ] + "_mp", weapon_type ); - } - } - } - } - i++; - } - precacheshader( "waypoint_second_chance" ); - level thread onplayerconnecting(); + level.classmap["class_smg"] = "CLASS_SMG"; + level.classmap["class_cqb"] = "CLASS_CQB"; + level.classmap["class_assault"] = "CLASS_ASSAULT"; + level.classmap["class_lmg"] = "CLASS_LMG"; + level.classmap["class_sniper"] = "CLASS_SNIPER"; + level.classmap["custom0"] = "CLASS_CUSTOM1"; + level.classmap["custom1"] = "CLASS_CUSTOM2"; + level.classmap["custom2"] = "CLASS_CUSTOM3"; + level.classmap["custom3"] = "CLASS_CUSTOM4"; + level.classmap["custom4"] = "CLASS_CUSTOM5"; + level.classmap["custom5"] = "CLASS_CUSTOM6"; + level.classmap["custom6"] = "CLASS_CUSTOM7"; + level.classmap["custom7"] = "CLASS_CUSTOM8"; + level.classmap["custom8"] = "CLASS_CUSTOM9"; + level.classmap["custom9"] = "CLASS_CUSTOM10"; + level.maxkillstreaks = 4; + level.maxspecialties = 6; + level.maxbonuscards = 3; + level.maxallocation = getgametypesetting( "maxAllocation" ); + level.loadoutkillstreaksenabled = getgametypesetting( "loadoutKillstreaksEnabled" ); + level.prestigenumber = 5; + level.defaultclass = "CLASS_ASSAULT"; + + if ( maps\mp\gametypes\_tweakables::gettweakablevalue( "weapon", "allowfrag" ) ) + level.weapons["frag"] = "frag_grenade_mp"; + else + level.weapons["frag"] = ""; + + if ( maps\mp\gametypes\_tweakables::gettweakablevalue( "weapon", "allowsmoke" ) ) + level.weapons["smoke"] = "smoke_grenade_mp"; + else + level.weapons["smoke"] = ""; + + if ( maps\mp\gametypes\_tweakables::gettweakablevalue( "weapon", "allowflash" ) ) + level.weapons["flash"] = "flash_grenade_mp"; + else + level.weapons["flash"] = ""; + + level.weapons["concussion"] = "concussion_grenade_mp"; + + if ( maps\mp\gametypes\_tweakables::gettweakablevalue( "weapon", "allowsatchel" ) ) + level.weapons["satchel_charge"] = "satchel_charge_mp"; + else + level.weapons["satchel_charge"] = ""; + + if ( maps\mp\gametypes\_tweakables::gettweakablevalue( "weapon", "allowbetty" ) ) + level.weapons["betty"] = "mine_bouncing_betty_mp"; + else + level.weapons["betty"] = ""; + + if ( maps\mp\gametypes\_tweakables::gettweakablevalue( "weapon", "allowrpgs" ) ) + level.weapons["rpg"] = "rpg_mp"; + else + level.weapons["rpg"] = ""; + + create_class_exclusion_list(); + cac_init(); + load_default_loadout( "CLASS_SMG", 10 ); + load_default_loadout( "CLASS_CQB", 11 ); + load_default_loadout( "CLASS_ASSAULT", 12 ); + load_default_loadout( "CLASS_LMG", 13 ); + load_default_loadout( "CLASS_SNIPER", 14 ); + level.primary_weapon_array = []; + level.side_arm_array = []; + level.grenade_array = []; + level.inventory_array = []; + max_weapon_num = 99; + + for ( i = 0; i < max_weapon_num; i++ ) + { + if ( !isdefined( level.tbl_weaponids[i] ) || level.tbl_weaponids[i]["group"] == "" ) + continue; + + if ( !isdefined( level.tbl_weaponids[i] ) || level.tbl_weaponids[i]["reference"] == "" ) + continue; + + weapon_type = level.tbl_weaponids[i]["group"]; + weapon = level.tbl_weaponids[i]["reference"]; + attachment = level.tbl_weaponids[i]["attachment"]; + weapon_class_register( weapon + "_mp", weapon_type ); + + if ( isdefined( attachment ) && attachment != "" ) + { + attachment_tokens = strtok( attachment, " " ); + + if ( isdefined( attachment_tokens ) ) + { + if ( attachment_tokens.size == 0 ) + { + weapon_class_register( weapon + "_" + attachment + "_mp", weapon_type ); + continue; + } + + for ( k = 0; k < attachment_tokens.size; k++ ) + weapon_class_register( weapon + "_" + attachment_tokens[k] + "_mp", weapon_type ); + } + } + } + + precacheshader( "waypoint_second_chance" ); + level thread onplayerconnecting(); } -create_class_exclusion_list() //checked changed to match the beta dump +create_class_exclusion_list() { - currentdvar = 0; - level.itemexclusions = []; - while ( getDvarInt( "item_exclusion_" + currentdvar ) ) - { - level.itemexclusions[ currentdvar ] = getDvarInt( "item_exclusion_" + currentdvar ); - currentdvar++; - } - level.attachmentexclusions = []; - currentdvar = 0; - while ( getDvar( "attachment_exclusion_" + currentdvar ) != "" ) - { - level.attachmentexclusions[ currentdvar ] = getDvar( "attachment_exclusion_" + currentdvar ); - currentdvar++; - } + currentdvar = 0; + level.itemexclusions = []; + + while ( getdvarint( _hash_32DF55CC + currentdvar ) ) + { + level.itemexclusions[currentdvar] = getdvarint( _hash_32DF55CC + currentdvar ); + currentdvar++; + } + + level.attachmentexclusions = []; + + for ( currentdvar = 0; getdvar( _hash_7F6F03E6 + currentdvar ) != ""; currentdvar++ ) + level.attachmentexclusions[currentdvar] = getdvar( _hash_7F6F03E6 + currentdvar ); } -is_item_excluded( itemindex ) //checked changed to match cerberus output +is_item_excluded( itemindex ) { - if ( !level.onlinegame ) - { - return 0; - } - numexclusions = level.itemexclusions.size; - for ( exclusionindex = 0; exclusionindex < numexclusions; exclusionindex++ ) - { - if ( itemindex == level.itemexclusions[ exclusionindex ] ) - { - return 1; - } - } - return 0; + if ( !level.onlinegame ) + return false; + + numexclusions = level.itemexclusions.size; + + for ( exclusionindex = 0; exclusionindex < numexclusions; exclusionindex++ ) + { + if ( itemindex == level.itemexclusions[exclusionindex] ) + return true; + } + + return false; } -is_attachment_excluded( attachment ) //checked changed to match cerberus output +is_attachment_excluded( attachment ) { - numexclusions = level.attachmentexclusions.size; - for ( exclusionindex = 0; exclusionindex < numexclusions; exclusionindex++ ) - { - if ( attachment == level.attachmentexclusions[ exclusionindex ] ) - { - return 1; - } - } - return 0; + numexclusions = level.attachmentexclusions.size; + + for ( exclusionindex = 0; exclusionindex < numexclusions; exclusionindex++ ) + { + if ( attachment == level.attachmentexclusions[exclusionindex] ) + return true; + } + + return false; } -set_statstable_id() //checked matches cerberus output +set_statstable_id() { - if ( !isDefined( level.statstableid ) ) - { - level.statstableid = tablelookupfindcoreasset( "mp/statsTable.csv" ); - } + if ( !isdefined( level.statstableid ) ) + level.statstableid = tablelookupfindcoreasset( "mp/statsTable.csv" ); } -get_item_count( itemreference ) //checked matches cerberus output +get_item_count( itemreference ) { - set_statstable_id(); - itemcount = int( tablelookup( level.statstableid, 4, itemreference, 5 ) ); - if ( itemcount < 1 ) - { - itemcount = 1; - } - return itemcount; + set_statstable_id(); + itemcount = int( tablelookup( level.statstableid, 4, itemreference, 5 ) ); + + if ( itemcount < 1 ) + itemcount = 1; + + return itemcount; } -getdefaultclassslotwithexclusions( classname, slotname ) //checked matches cerberus output +getdefaultclassslotwithexclusions( classname, slotname ) { - itemreference = getdefaultclassslot( classname, slotname ); - set_statstable_id(); - itemindex = int( tablelookup( level.statstableid, 4, itemreference, 0 ) ); - if ( is_item_excluded( itemindex ) ) - { - itemreference = tablelookup( level.statstableid, 0, 0, 4 ); - } - return itemreference; + itemreference = getdefaultclassslot( classname, slotname ); + set_statstable_id(); + itemindex = int( tablelookup( level.statstableid, 4, itemreference, 0 ) ); + + if ( is_item_excluded( itemindex ) ) + itemreference = tablelookup( level.statstableid, 0, 0, 4 ); + + return itemreference; } -load_default_loadout( class, classnum ) //checked matches cerberus output +load_default_loadout( class, classnum ) { - level.classtoclassnum[ class ] = classnum; + level.classtoclassnum[class] = classnum; } -weapon_class_register( weapon, weapon_type ) //checked matches cerberus output +weapon_class_register( weapon, weapon_type ) { - if ( issubstr( "weapon_smg weapon_cqb weapon_assault weapon_lmg weapon_sniper weapon_shotgun weapon_launcher weapon_special", weapon_type ) ) - { - level.primary_weapon_array[ weapon ] = 1; - } - else if ( issubstr( "weapon_pistol", weapon_type ) ) - { - level.side_arm_array[ weapon ] = 1; - } - else if ( weapon_type == "weapon_grenade" ) - { - level.grenade_array[ weapon ] = 1; - } - else if ( weapon_type == "weapon_explosive" ) - { - level.inventory_array[ weapon ] = 1; - } - else if ( weapon_type == "weapon_rifle" ) - { - level.inventory_array[ weapon ] = 1; - } - else - { - /* + if ( issubstr( "weapon_smg weapon_cqb weapon_assault weapon_lmg weapon_sniper weapon_shotgun weapon_launcher weapon_special", weapon_type ) ) + level.primary_weapon_array[weapon] = 1; + else if ( issubstr( "weapon_pistol", weapon_type ) ) + level.side_arm_array[weapon] = 1; + else if ( weapon_type == "weapon_grenade" ) + level.grenade_array[weapon] = 1; + else if ( weapon_type == "weapon_explosive" ) + level.inventory_array[weapon] = 1; + else if ( weapon_type == "weapon_rifle" ) + level.inventory_array[weapon] = 1; + else + { /# - assert( 0, "Weapon group info is missing from statsTable for: " + weapon_type ); + assert( 0, "Weapon group info is missing from statsTable for: " + weapon_type ); #/ - */ - } + } } -cac_init() //checked changed to match cerberus output +cac_init() { - level.tbl_weaponids = []; - set_statstable_id(); - for ( i = 0; i < 256; i++ ) - { - itemrow = tablelookuprownum( level.statstableid, 0, i ); - if ( itemrow > -1 ) - { - group_s = tablelookupcolumnforrow( level.statstableid, itemrow, 2 ); - if ( issubstr( group_s, "weapon_" ) ) - { - reference_s = tablelookupcolumnforrow( level.statstableid, itemrow, 4 ); - if ( reference_s != "" ) - { - level.tbl_weaponids[ i ][ "reference" ] = reference_s; - level.tbl_weaponids[ i ][ "group" ] = group_s; - level.tbl_weaponids[ i ][ "count" ] = int( tablelookupcolumnforrow( level.statstableid, itemrow, 5 ) ); - level.tbl_weaponids[ i ][ "attachment" ] = tablelookupcolumnforrow( level.statstableid, itemrow, 8 ); - } - } - } - } - level.perknames = []; - for ( i = 0; i < 256; i++ ) - { - itemrow = tablelookuprownum( level.statstableid, 0, i ); - if ( itemrow > -1 ) - { - group_s = tablelookupcolumnforrow( level.statstableid, itemrow, 2 ); - if ( group_s == "specialty" ) - { - reference_s = tablelookupcolumnforrow( level.statstableid, itemrow, 4 ); - if ( reference_s != "" ) - { - perkicon = tablelookupcolumnforrow( level.statstableid, itemrow, 6 ); - perkname = tablelookupistring( level.statstableid, 0, i, 3 ); - precachestring( perkname ); - precacheshader( perkicon ); - level.perknames[ perkicon ] = perkname; - } - } - } - } - level.killstreaknames = []; - level.killstreakicons = []; - level.killstreakindices = []; - for ( i = 0; i < 256; i++ ) - { - itemrow = tablelookuprownum( level.statstableid, 0, i ); - if ( itemrow > -1 ) - { - group_s = tablelookupcolumnforrow( level.statstableid, itemrow, 2 ); - if ( group_s == "killstreak" ) - { - reference_s = tablelookupcolumnforrow( level.statstableid, itemrow, 4 ); - if ( reference_s != "" ) - { - level.tbl_killstreakdata[ i ] = reference_s; - level.killstreakindices[ reference_s ] = i; - icon = tablelookupcolumnforrow( level.statstableid, itemrow, 6 ); - name = tablelookupistring( level.statstableid, 0, i, 3 ); - precachestring( name ); - level.killstreaknames[ reference_s ] = name; - level.killstreakicons[ reference_s ] = icon; - level.killstreakindices[ reference_s ] = i; - precacheshader( icon ); - precacheshader( icon + "_drop" ); - } - } - } - } + level.tbl_weaponids = []; + set_statstable_id(); + + for ( i = 0; i < 256; i++ ) + { + itemrow = tablelookuprownum( level.statstableid, 0, i ); + + if ( itemrow > -1 ) + { + group_s = tablelookupcolumnforrow( level.statstableid, itemrow, 2 ); + + if ( issubstr( group_s, "weapon_" ) ) + { + reference_s = tablelookupcolumnforrow( level.statstableid, itemrow, 4 ); + + if ( reference_s != "" ) + { + level.tbl_weaponids[i]["reference"] = reference_s; + level.tbl_weaponids[i]["group"] = group_s; + level.tbl_weaponids[i]["count"] = int( tablelookupcolumnforrow( level.statstableid, itemrow, 5 ) ); + level.tbl_weaponids[i]["attachment"] = tablelookupcolumnforrow( level.statstableid, itemrow, 8 ); + } + } + } + } + + level.perknames = []; + + for ( i = 0; i < 256; i++ ) + { + itemrow = tablelookuprownum( level.statstableid, 0, i ); + + if ( itemrow > -1 ) + { + group_s = tablelookupcolumnforrow( level.statstableid, itemrow, 2 ); + + if ( group_s == "specialty" ) + { + reference_s = tablelookupcolumnforrow( level.statstableid, itemrow, 4 ); + + if ( reference_s != "" ) + { + perkicon = tablelookupcolumnforrow( level.statstableid, itemrow, 6 ); + perkname = tablelookupistring( level.statstableid, 0, i, 3 ); + precachestring( perkname ); + precacheshader( perkicon ); + level.perknames[perkicon] = perkname; + } + } + } + } + + level.killstreaknames = []; + level.killstreakicons = []; + level.killstreakindices = []; + + for ( i = 0; i < 256; i++ ) + { + itemrow = tablelookuprownum( level.statstableid, 0, i ); + + if ( itemrow > -1 ) + { + group_s = tablelookupcolumnforrow( level.statstableid, itemrow, 2 ); + + if ( group_s == "killstreak" ) + { + reference_s = tablelookupcolumnforrow( level.statstableid, itemrow, 4 ); + + if ( reference_s != "" ) + { + level.tbl_killstreakdata[i] = reference_s; + level.killstreakindices[reference_s] = i; + icon = tablelookupcolumnforrow( level.statstableid, itemrow, 6 ); + name = tablelookupistring( level.statstableid, 0, i, 3 ); + precachestring( name ); + level.killstreaknames[reference_s] = name; + level.killstreakicons[reference_s] = icon; + level.killstreakindices[reference_s] = i; + precacheshader( icon ); + precacheshader( icon + "_drop" ); + } + } + } + } } -getclasschoice( response ) //checked matches cerberus output +getclasschoice( response ) { - /* /# - assert( isDefined( level.classmap[ response ] ) ); + assert( isdefined( level.classmap[response] ) ); #/ - */ - return level.classmap[ response ]; + return level.classmap[response]; } -getloadoutitemfromddlstats( customclassnum, loadoutslot ) //checked matches cerberus output +getloadoutitemfromddlstats( customclassnum, loadoutslot ) { - itemindex = self getloadoutitem( customclassnum, loadoutslot ); - if ( is_item_excluded( itemindex ) && !is_warlord_perk( itemindex ) ) - { - return 0; - } - return itemindex; + itemindex = self getloadoutitem( customclassnum, loadoutslot ); + + if ( is_item_excluded( itemindex ) && !is_warlord_perk( itemindex ) ) + return 0; + + return itemindex; } -getattachmentstring( weaponnum, attachmentnum ) //checked matches cerberus output +getattachmentstring( weaponnum, attachmentnum ) { - attachmentstring = getitemattachment( weaponnum, attachmentnum ); - if ( attachmentstring != "none" && !is_attachment_excluded( attachmentstring ) ) - { - attachmentstring += "_"; - } - else - { - attachmentstring = ""; - } - return attachmentstring; + attachmentstring = getitemattachment( weaponnum, attachmentnum ); + + if ( attachmentstring != "none" && !is_attachment_excluded( attachmentstring ) ) + attachmentstring += "_"; + else + attachmentstring = ""; + + return attachmentstring; } -getattachmentsdisabled() //checked matches cerberus output +getattachmentsdisabled() { - if ( !isDefined( level.attachmentsdisabled ) ) - { - return 0; - } - return level.attachmentsdisabled; + if ( !isdefined( level.attachmentsdisabled ) ) + return 0; + + return level.attachmentsdisabled; } -getkillstreakindex( class, killstreaknum ) //checked changed to match beta dump +getkillstreakindex( class, killstreaknum ) { - killstreaknum++; - killstreakstring = "killstreak" + killstreaknum; - if ( getDvarInt( "custom_killstreak_mode" ) == 2 ) - { - return getDvarInt( "custom_" + killstreakstring ); - } - else - { - return self getloadoutitem( class, killstreakstring ); - } + killstreaknum++; + killstreakstring = "killstreak" + killstreaknum; + + if ( getdvarint( _hash_826EB3B9 ) == 2 ) + return getdvarint( _hash_E1D3321F + killstreakstring ); + else + return self getloadoutitem( class, killstreakstring ); } -givekillstreaks( classnum ) //checked changed to match cerberus output +givekillstreaks( classnum ) { - self.killstreak = []; - if ( !level.loadoutkillstreaksenabled ) - { - return; - } - sortedkillstreaks = []; - currentkillstreak = 0; - for ( killstreaknum = 0; killstreaknum < level.maxkillstreaks; killstreaknum++ ) - { - killstreakindex = getkillstreakindex( classnum, killstreaknum ); - if ( isDefined( killstreakindex ) && killstreakindex > 0 ) - { - /* + self.killstreak = []; + + if ( !level.loadoutkillstreaksenabled ) + return; + + sortedkillstreaks = []; + currentkillstreak = 0; + + for ( killstreaknum = 0; killstreaknum < level.maxkillstreaks; killstreaknum++ ) + { + killstreakindex = getkillstreakindex( classnum, killstreaknum ); + + if ( isdefined( killstreakindex ) && killstreakindex > 0 ) + { /# - assert( isDefined( level.tbl_killstreakdata[ killstreakindex ] ), "KillStreak #:" + killstreakindex + "'s data is undefined" ); + assert( isdefined( level.tbl_killstreakdata[killstreakindex] ), "KillStreak #:" + killstreakindex + "'s data is undefined" ); #/ - */ - if ( isDefined( level.tbl_killstreakdata[ killstreakindex ] ) ) - { - self.killstreak[ currentkillstreak ] = level.tbl_killstreakdata[ killstreakindex ]; - if ( is_true( level.usingmomentum ) ) - { - killstreaktype = maps/mp/killstreaks/_killstreaks::getkillstreakbymenuname( self.killstreak[ currentkillstreak ] ); - if ( isDefined( killstreaktype ) ) - { - weapon = maps/mp/killstreaks/_killstreaks::getkillstreakweapon( killstreaktype ); - self giveweapon( weapon ); - if ( is_true( level.usingscorestreaks ) ) - { - if ( maps/mp/killstreaks/_killstreak_weapons::isheldkillstreakweapon( weapon ) ) - { - if ( !isDefined( self.pers[ "held_killstreak_ammo_count" ][ weapon ] ) ) - { - self.pers[ "held_killstreak_ammo_count" ][ weapon ] = 0; - } - if ( !isDefined( self.pers[ "held_killstreak_clip_count" ][ weapon ] ) ) - { - self.pers[ "held_killstreak_clip_count" ][ weapon ] = 0; - } - if ( self.pers[ "held_killstreak_ammo_count" ][ weapon ] > 0 ) - { - self setweaponammoclip( weapon, self.pers[ "held_killstreak_clip_count" ][ weapon ] ); - self setweaponammostock( weapon, self.pers[ "held_killstreak_ammo_count" ][ weapon ] - self.pers[ "held_killstreak_clip_count" ][ weapon ] ); - } - else - { - self maps/mp/gametypes/_class::setweaponammooverall( weapon, 0 ); - } - } - else - { - quantity = self.pers[ "killstreak_quantity" ][ weapon ]; - if ( !isDefined( quantity ) ) - { - quantity = 0; - } - self setweaponammoclip( weapon, quantity ); - } - } - sortdata = spawnstruct(); - sortdata.cost = level.killstreaks[ killstreaktype ].momentumcost; - sortdata.weapon = weapon; - sortindex = 0; - for ( sortindex = 0; sortindex < sortedkillstreaks.size; sortindex++ ) - { - if ( sortedkillstreaks[ sortindex ].cost > sortdata.cost ) - { - break; - } - } - for ( i = sortedkillstreaks.size; i > sortindex; i-- ) - { - sortedkillstreaks[ i ] = sortedkillstreaks[ i - 1 ]; - } - sortedkillstreaks[ sortindex ] = sortdata; - } - } - currentkillstreak++; - } - } - } - actionslotorder = []; - actionslotorder[ 0 ] = 4; - actionslotorder[ 1 ] = 2; - actionslotorder[ 2 ] = 1; - if( is_true( level.usingmomentum ) ) - { - for ( sortIndex = 0 ; (sortIndex < sortedKillstreaks.size && sortIndex < actionSlotOrder.size) ; sortIndex++ ) - { - self setactionslot( actionslotorder[ sortindex ], "weapon", sortedkillstreaks[ sortindex ].weapon ); - } - } + + if ( isdefined( level.tbl_killstreakdata[killstreakindex] ) ) + { + self.killstreak[currentkillstreak] = level.tbl_killstreakdata[killstreakindex]; + + if ( isdefined( level.usingmomentum ) && level.usingmomentum ) + { + killstreaktype = maps\mp\killstreaks\_killstreaks::getkillstreakbymenuname( self.killstreak[currentkillstreak] ); + + if ( isdefined( killstreaktype ) ) + { + weapon = maps\mp\killstreaks\_killstreaks::getkillstreakweapon( killstreaktype ); + self giveweapon( weapon ); + + if ( isdefined( level.usingscorestreaks ) && level.usingscorestreaks ) + { + if ( maps\mp\killstreaks\_killstreak_weapons::isheldkillstreakweapon( weapon ) ) + { + if ( !isdefined( self.pers["held_killstreak_ammo_count"][weapon] ) ) + self.pers["held_killstreak_ammo_count"][weapon] = 0; + + if ( !isdefined( self.pers["held_killstreak_clip_count"][weapon] ) ) + self.pers["held_killstreak_clip_count"][weapon] = 0; + + if ( self.pers["held_killstreak_ammo_count"][weapon] > 0 ) + { + self setweaponammoclip( weapon, self.pers["held_killstreak_clip_count"][weapon] ); + self setweaponammostock( weapon, self.pers["held_killstreak_ammo_count"][weapon] - self.pers["held_killstreak_clip_count"][weapon] ); + } + else + self maps\mp\gametypes\_class::setweaponammooverall( weapon, 0 ); + } + else + { + quantity = self.pers["killstreak_quantity"][weapon]; + + if ( !isdefined( quantity ) ) + quantity = 0; + + self setweaponammoclip( weapon, quantity ); + } + } + + sortdata = spawnstruct(); + sortdata.cost = level.killstreaks[killstreaktype].momentumcost; + sortdata.weapon = weapon; + sortindex = 0; + + for ( sortindex = 0; sortindex < sortedkillstreaks.size; sortindex++ ) + { + if ( sortedkillstreaks[sortindex].cost > sortdata.cost ) + break; + } + + for ( i = sortedkillstreaks.size; i > sortindex; i-- ) + sortedkillstreaks[i] = sortedkillstreaks[i - 1]; + + sortedkillstreaks[sortindex] = sortdata; + } + } + + currentkillstreak++; + } + } + } + + actionslotorder = []; + actionslotorder[0] = 4; + actionslotorder[1] = 2; + actionslotorder[2] = 1; + + if ( isdefined( level.usingmomentum ) && level.usingmomentum ) + { + for ( sortindex = 0; sortindex < sortedkillstreaks.size && sortindex < actionslotorder.size; sortindex++ ) + self setactionslot( actionslotorder[sortindex], "weapon", sortedkillstreaks[sortindex].weapon ); + } } -is_warlord_perk( itemindex ) //checked matches cerberus output +is_warlord_perk( itemindex ) { - if ( itemindex == 168 || itemindex == 169 ) - { - return 1; - } - else - { - return 0; - } + if ( itemindex == 168 || itemindex == 169 ) + return true; + else + return false; } -isperkgroup( perkname ) //checked changed at own discretion +isperkgroup( perkname ) { - if ( isDefined( perkname ) && isstring( perkname ) ) - { - return 1; - } - return 0; + return isdefined( perkname ) && isstring( perkname ); } -logclasschoice( class, primaryweapon, specialtype, perks ) //checked changed to match cerberus output +logclasschoice( class, primaryweapon, specialtype, perks ) { - if ( class == self.lastclass ) - { - return; - } - self logstring( "choseclass: " + class + " weapon: " + primaryweapon + " special: " + specialtype ); - for ( i = 0; i < perks.size; i++ ) - { - self logstring( "perk" + i + ": " + perks[ i ] ); - } - self.lastclass = class; + if ( class == self.lastclass ) + return; + + self logstring( "choseclass: " + class + " weapon: " + primaryweapon + " special: " + specialtype ); + + for ( i = 0; i < perks.size; i++ ) + self logstring( "perk" + i + ": " + perks[i] ); + + self.lastclass = class; } -reset_specialty_slots( class_num ) //checked matches cerberus output +reset_specialty_slots( class_num ) { - self.specialty = []; + self.specialty = []; } -initstaticweaponstime() //checked matches cerberus output +initstaticweaponstime() { - self.staticweaponsstarttime = getTime(); + self.staticweaponsstarttime = gettime(); } -initweaponattachments( weaponname ) //checked matches cerberus output +initweaponattachments( weaponname ) { - self.currentweaponstarttime = getTime(); - self.currentweapon = weaponname; + self.currentweaponstarttime = gettime(); + self.currentweapon = weaponname; } -isequipmentallowed( equipment ) //checked matches cerberus output +isequipmentallowed( equipment ) { - if ( equipment == "camera_spike_mp" && self issplitscreen() ) - { - return 0; - } - if ( equipment == level.tacticalinsertionweapon && level.disabletacinsert ) - { - return 0; - } - return 1; + if ( equipment == "camera_spike_mp" && self issplitscreen() ) + return false; + + if ( equipment == level.tacticalinsertionweapon && level.disabletacinsert ) + return false; + + return true; } -isleagueitemrestricted( item ) //checked matches cerberus output +isleagueitemrestricted( item ) { - if ( level.leaguematch ) - { - return isitemrestricted( item ); - } - return 0; + if ( level.leaguematch ) + return isitemrestricted( item ); + + return 0; } -giveloadoutlevelspecific( team, class ) //checked matches cerberus output +giveloadoutlevelspecific( team, class ) { - pixbeginevent( "giveLoadoutLevelSpecific" ); - if ( isDefined( level.givecustomcharacters ) ) - { - self [[ level.givecustomcharacters ]](); - } - if ( isDefined( level.givecustomloadout ) ) - { - self [[ level.givecustomloadout ]](); - } - pixendevent(); + pixbeginevent( "giveLoadoutLevelSpecific" ); + + if ( isdefined( level.givecustomcharacters ) ) + self [[ level.givecustomcharacters ]](); + + if ( isdefined( level.givecustomloadout ) ) + self [[ level.givecustomloadout ]](); + + pixendevent(); } -removeduplicateattachments( weapon ) //checked changed to match cerberus output +removeduplicateattachments( weapon ) { - if ( !isDefined( weapon ) ) - { - return undefined; - } - attachments = strtok( weapon, "+" ); - for ( attachmentindex = 1; attachmentindex < attachments.size; attachmentindex++ ) - { - for ( attachmentindex2 = attachmentindex + 1; attachmentindex2 < attachments.size; attachmentindex2++ ) - { - if ( attachments[ attachmentindex ] == attachments[ attachmentindex2 ] ) - { - attachments[ attachmentindex2 ] = "none"; - } - } - } - uniqueattachmentsweapon = attachments[ 0 ]; - for ( attachmentindex = 1; attachmentindex < attachments.size; attachmentindex++ ) - { - if ( attachments[ attachmentindex ] != "none" ) - { - uniqueattachmentsweapon = ( uniqueattachmentsweapon + "+" ) + attachments[ attachmentindex ]; - } - } - return uniqueattachmentsweapon; + if ( !isdefined( weapon ) ) + return undefined; + + attachments = strtok( weapon, "+" ); + + for ( attachmentindex = 1; attachmentindex < attachments.size; attachmentindex++ ) + { + for ( attachmentindex2 = attachmentindex + 1; attachmentindex2 < attachments.size; attachmentindex2++ ) + { + if ( attachments[attachmentindex] == attachments[attachmentindex2] ) + attachments[attachmentindex2] = "none"; + } + } + + uniqueattachmentsweapon = attachments[0]; + + for ( attachmentindex = 1; attachmentindex < attachments.size; attachmentindex++ ) + { + if ( attachments[attachmentindex] != "none" ) + uniqueattachmentsweapon = uniqueattachmentsweapon + "+" + attachments[attachmentindex]; + } + + return uniqueattachmentsweapon; } -giveloadout( team, class ) //checked partially changed to match cerberus output did not use continue in for loop see github for more info +giveloadout( team, class ) { - pixbeginevent( "giveLoadout" ); - self takeallweapons(); - primaryindex = 0; - self.specialty = []; - self.killstreak = []; - primaryweapon = undefined; - self notify( "give_map" ); - class_num_for_killstreaks = 0; - primaryweaponoptions = 0; - secondaryweaponoptions = 0; - playerrenderoptions = 0; - primarygrenadecount = 0; - iscustomclass = 0; - if ( issubstr( class, "CLASS_CUSTOM" ) ) - { - pixbeginevent( "custom class" ); - class_num = int( class[ class.size - 1 ] ) - 1; - if ( class_num == -1 ) - { - class_num = 9; - } - self.class_num = class_num; - self reset_specialty_slots( class_num ); - playerrenderoptions = self calcplayeroptions( class_num ); - class_num_for_killstreaks = class_num; - iscustomclass = 1; - pixendevent(); - } - else - { - pixbeginevent( "default class" ); - /* + pixbeginevent( "giveLoadout" ); + self takeallweapons(); + primaryindex = 0; + self.specialty = []; + self.killstreak = []; + primaryweapon = undefined; + self notify( "give_map" ); + class_num_for_killstreaks = 0; + primaryweaponoptions = 0; + secondaryweaponoptions = 0; + playerrenderoptions = 0; + primarygrenadecount = 0; + iscustomclass = 0; + + if ( issubstr( class, "CLASS_CUSTOM" ) ) + { + pixbeginevent( "custom class" ); + class_num = int( class[class.size - 1] ) - 1; + + if ( -1 == class_num ) + class_num = 9; + + self.class_num = class_num; + self reset_specialty_slots( class_num ); + playerrenderoptions = self calcplayeroptions( class_num ); + class_num_for_killstreaks = class_num; + iscustomclass = 1; + pixendevent(); + } + else + { + pixbeginevent( "default class" ); /# - assert( isDefined( self.pers[ "class" ] ), "Player during spawn and loadout got no class!" ); + assert( isdefined( self.pers["class"] ), "Player during spawn and loadout got no class!" ); #/ - */ - class_num = level.classtoclassnum[ class ]; - self.class_num = class_num; - pixendevent(); - } - knifeweaponoptions = self calcweaponoptions( class_num, 2 ); - self giveweapon( "knife_mp", 0, knifeweaponoptions ); - self.specialty = self getloadoutperks( class_num ); - if ( level.leaguematch ) - { - for ( i = 0; i < self.specialty.size; i++ ) - { - if ( isleagueitemrestricted( self.specialty[ i ] ) ) - { - arrayremoveindex( self.specialty, i ); - i--; + class_num = level.classtoclassnum[class]; + self.class_num = class_num; + pixendevent(); + } - } - } - } - self register_perks(); - self setactionslot( 3, "altMode" ); - self setactionslot( 4, "" ); - givekillstreaks( class_num_for_killstreaks ); - spawnweapon = ""; - initialweaponcount = 0; - if ( isDefined( self.pers[ "weapon" ] ) && self.pers[ "weapon" ] != "none" && !maps/mp/killstreaks/_killstreaks::iskillstreakweapon( self.pers[ "weapon" ] ) ) - { - weapon = self.pers[ "weapon" ]; - } - else - { - weapon = self getloadoutweapon( class_num, "primary" ); - weapon = removeduplicateattachments( weapon ); - if ( maps/mp/killstreaks/_killstreaks::iskillstreakweapon( weapon ) ) - { - weapon = "weapon_null_mp"; - } - } - sidearm = self getloadoutweapon( class_num, "secondary" ); - sidearm = removeduplicateattachments( sidearm ); - if ( maps/mp/killstreaks/_killstreaks::iskillstreakweapon( sidearm ) ) - { - sidearm = "weapon_null_mp"; - } - self.primaryweaponkill = 0; - self.secondaryweaponkill = 0; - if ( self isbonuscardactive( 2, self.class_num ) ) - { - self.primaryloadoutweapon = weapon; - self.primaryloadoutaltweapon = weaponaltweaponname( weapon ); - self.secondaryloadoutweapon = sidearm; - self.secondaryloadoutaltweapon = weaponaltweaponname( sidearm ); - } - else if ( self isbonuscardactive( 0, self.class_num ) ) - { - self.primaryloadoutweapon = weapon; - } - if ( self isbonuscardactive( 1, self.class_num ) ) - { - self.secondaryloadoutweapon = sidearm; - } - if ( sidearm != "weapon_null_mp" ) - { - secondaryweaponoptions = self calcweaponoptions( class_num, 1 ); - } - primaryweapon = weapon; - if ( primaryweapon != "weapon_null_mp" ) - { - primaryweaponoptions = self calcweaponoptions( class_num, 0 ); - } - if ( sidearm != "" && sidearm != "weapon_null_mp" && sidearm != "weapon_null" ) - { - self giveweapon( sidearm, 0, secondaryweaponoptions ); - if ( self hasperk( "specialty_extraammo" ) ) - { - self givemaxammo( sidearm ); - } - spawnweapon = sidearm; - initialweaponcount++; - } - primaryweapon = weapon; - primarytokens = strtok( primaryweapon, "_" ); - self.pers[ "primaryWeapon" ] = primarytokens[ 0 ]; - /* + knifeweaponoptions = self calcweaponoptions( class_num, 2 ); + self giveweapon( "knife_mp", 0, knifeweaponoptions ); + self.specialty = self getloadoutperks( class_num ); + + if ( level.leaguematch ) + { + for ( i = 0; i < self.specialty.size; i++ ) + { + if ( isleagueitemrestricted( self.specialty[i] ) ) + { + arrayremoveindex( self.specialty, i ); + i--; + } + } + } + + self register_perks(); + self setactionslot( 3, "altMode" ); + self setactionslot( 4, "" ); + givekillstreaks( class_num_for_killstreaks ); + spawnweapon = ""; + initialweaponcount = 0; + + if ( isdefined( self.pers["weapon"] ) && self.pers["weapon"] != "none" && !maps\mp\killstreaks\_killstreaks::iskillstreakweapon( self.pers["weapon"] ) ) + weapon = self.pers["weapon"]; + else + { + weapon = self getloadoutweapon( class_num, "primary" ); + weapon = removeduplicateattachments( weapon ); + + if ( maps\mp\killstreaks\_killstreaks::iskillstreakweapon( weapon ) ) + weapon = "weapon_null_mp"; + } + + sidearm = self getloadoutweapon( class_num, "secondary" ); + sidearm = removeduplicateattachments( sidearm ); + + if ( maps\mp\killstreaks\_killstreaks::iskillstreakweapon( sidearm ) ) + sidearm = "weapon_null_mp"; + + self.primaryweaponkill = 0; + self.secondaryweaponkill = 0; + + if ( self isbonuscardactive( 2, self.class_num ) ) + { + self.primaryloadoutweapon = weapon; + self.primaryloadoutaltweapon = weaponaltweaponname( weapon ); + self.secondaryloadoutweapon = sidearm; + self.secondaryloadoutaltweapon = weaponaltweaponname( sidearm ); + } + else + { + if ( self isbonuscardactive( 0, self.class_num ) ) + self.primaryloadoutweapon = weapon; + + if ( self isbonuscardactive( 1, self.class_num ) ) + self.secondaryloadoutweapon = sidearm; + } + + if ( sidearm != "weapon_null_mp" ) + secondaryweaponoptions = self calcweaponoptions( class_num, 1 ); + + primaryweapon = weapon; + + if ( primaryweapon != "weapon_null_mp" ) + primaryweaponoptions = self calcweaponoptions( class_num, 0 ); + + if ( sidearm != "" && sidearm != "weapon_null_mp" && sidearm != "weapon_null" ) + { + self giveweapon( sidearm, 0, secondaryweaponoptions ); + + if ( self hasperk( "specialty_extraammo" ) ) + self givemaxammo( sidearm ); + + spawnweapon = sidearm; + initialweaponcount++; + } + + primaryweapon = weapon; + primarytokens = strtok( primaryweapon, "_" ); + self.pers["primaryWeapon"] = primarytokens[0]; /# - println( "^5GiveWeapon( " + weapon + " ) -- weapon" ); + println( "^5GiveWeapon( " + weapon + " ) -- weapon" ); #/ - */ - if ( primaryweapon != "" && primaryweapon != "weapon_null_mp" && primaryweapon != "weapon_null" ) - { - if ( self hasperk( "specialty_extraammo" ) ) - { - self givemaxammo( primaryweapon ); - } - self giveweapon( primaryweapon, 0, primaryweaponoptions ); - spawnweapon = primaryweapon; - initialweaponcount++; - } - if ( initialweaponcount < 2 ) - { - self giveweapon( "knife_held_mp", 0, knifeweaponoptions ); - if ( initialweaponcount == 0 ) - { - spawnweapon = "knife_held_mp"; - } - } - if ( !isDefined( self.spawnweapon ) && isDefined( self.pers[ "spawnWeapon" ] ) ) - { - self.spawnweapon = self.pers[ "spawnWeapon" ]; - } - if ( isDefined( self.spawnweapon ) && doesweaponreplacespawnweapon( self.spawnweapon, spawnweapon ) && !self.pers[ "changed_class" ] ) - { - spawnweapon = self.spawnweapon; - } - self.pers[ "changed_class" ] = 0; - /* + + if ( primaryweapon != "" && primaryweapon != "weapon_null_mp" && primaryweapon != "weapon_null" ) + { + if ( self hasperk( "specialty_extraammo" ) ) + self givemaxammo( primaryweapon ); + + self giveweapon( primaryweapon, 0, primaryweaponoptions ); + spawnweapon = primaryweapon; + initialweaponcount++; + } + + if ( initialweaponcount < 2 ) + { + self giveweapon( "knife_held_mp", 0, knifeweaponoptions ); + + if ( initialweaponcount == 0 ) + spawnweapon = "knife_held_mp"; + } + + if ( !isdefined( self.spawnweapon ) && isdefined( self.pers["spawnWeapon"] ) ) + self.spawnweapon = self.pers["spawnWeapon"]; + + if ( isdefined( self.spawnweapon ) && doesweaponreplacespawnweapon( self.spawnweapon, spawnweapon ) && !self.pers["changed_class"] ) + spawnweapon = self.spawnweapon; + + self.pers["changed_class"] = 0; /# - assert( spawnweapon != "" ); + assert( spawnweapon != "" ); #/ - */ - self.spawnweapon = spawnweapon; - self.pers[ "spawnWeapon" ] = self.spawnweapon; - self setspawnweapon( spawnweapon ); - grenadetypeprimary = self getloadoutitemref( class_num, "primarygrenade" ); - if ( isleagueitemrestricted( grenadetypeprimary ) ) - { - grenadetypeprimary = ""; - } - if ( maps/mp/killstreaks/_killstreaks::iskillstreakweapon( grenadetypeprimary + "_mp" ) ) - { - grenadetypeprimary = ""; - } - grenadetypesecondary = self getloadoutitemref( class_num, "specialgrenade" ); - if ( isleagueitemrestricted( grenadetypesecondary ) ) - { - grenadetypesecondary = ""; - } - if ( maps/mp/killstreaks/_killstreaks::iskillstreakweapon( grenadetypesecondary + "_mp" ) ) - { - grenadetypesecondary = ""; - } - if ( grenadetypeprimary != "" && grenadetypeprimary != "weapon_null_mp" && isequipmentallowed( grenadetypeprimary ) ) - { - grenadetypeprimary += "_mp"; - primarygrenadecount = self getloadoutitem( class_num, "primarygrenadecount" ); - } - if ( grenadetypesecondary != "" && grenadetypesecondary != "weapon_null_mp" && isequipmentallowed( grenadetypesecondary ) ) - { - grenadetypesecondary += "_mp"; - grenadesecondarycount = self getloadoutitem( class_num, "specialgrenadecount" ); - } - if ( grenadetypeprimary != "" && grenadetypeprimary != "weapon_null_mp" && !isequipmentallowed( grenadetypeprimary ) ) - { - if ( grenadetypesecondary != level.weapons[ "frag" ] ) - { - grenadetypeprimary = level.weapons[ "frag" ]; - } - else - { - grenadetypeprimary = level.weapons[ "flash" ]; - } - } - /* + self.spawnweapon = spawnweapon; + self.pers["spawnWeapon"] = self.spawnweapon; + self setspawnweapon( spawnweapon ); + grenadetypeprimary = self getloadoutitemref( class_num, "primarygrenade" ); + + if ( isleagueitemrestricted( grenadetypeprimary ) ) + grenadetypeprimary = ""; + + if ( maps\mp\killstreaks\_killstreaks::iskillstreakweapon( grenadetypeprimary + "_mp" ) ) + grenadetypeprimary = ""; + + grenadetypesecondary = self getloadoutitemref( class_num, "specialgrenade" ); + + if ( isleagueitemrestricted( grenadetypesecondary ) ) + grenadetypesecondary = ""; + + if ( maps\mp\killstreaks\_killstreaks::iskillstreakweapon( grenadetypesecondary + "_mp" ) ) + grenadetypesecondary = ""; + + if ( grenadetypeprimary != "" && grenadetypeprimary != "weapon_null_mp" && isequipmentallowed( grenadetypeprimary ) ) + { + grenadetypeprimary += "_mp"; + primarygrenadecount = self getloadoutitem( class_num, "primarygrenadecount" ); + } + + if ( grenadetypesecondary != "" && grenadetypesecondary != "weapon_null_mp" && isequipmentallowed( grenadetypesecondary ) ) + { + grenadetypesecondary += "_mp"; + grenadesecondarycount = self getloadoutitem( class_num, "specialgrenadecount" ); + } + + if ( !( grenadetypeprimary != "" && grenadetypeprimary != "weapon_null_mp" && isequipmentallowed( grenadetypeprimary ) ) ) + { + if ( grenadetypesecondary != level.weapons["frag"] ) + grenadetypeprimary = level.weapons["frag"]; + else + grenadetypeprimary = level.weapons["flash"]; + } + /# - println( "^5GiveWeapon( " + grenadetypeprimary + " ) -- grenadeTypePrimary" ); + println( "^5GiveWeapon( " + grenadetypeprimary + " ) -- grenadeTypePrimary" ); #/ - */ - self giveweapon( grenadetypeprimary ); - self setweaponammoclip( grenadetypeprimary, primarygrenadecount ); - self switchtooffhand( grenadetypeprimary ); - self.grenadetypeprimary = grenadetypeprimary; - self.grenadetypeprimarycount = primarygrenadecount; - if ( self.grenadetypeprimarycount > 1 ) - { - self dualgrenadesactive(); - } - if ( grenadetypesecondary != "" && grenadetypesecondary != "weapon_null_mp" && isequipmentallowed( grenadetypesecondary ) ) - { - self setoffhandsecondaryclass( grenadetypesecondary ); - /* + self giveweapon( grenadetypeprimary ); + self setweaponammoclip( grenadetypeprimary, primarygrenadecount ); + self switchtooffhand( grenadetypeprimary ); + self.grenadetypeprimary = grenadetypeprimary; + self.grenadetypeprimarycount = primarygrenadecount; + + if ( self.grenadetypeprimarycount > 1 ) + self dualgrenadesactive(); + + if ( grenadetypesecondary != "" && grenadetypesecondary != "weapon_null_mp" && isequipmentallowed( grenadetypesecondary ) ) + { + self setoffhandsecondaryclass( grenadetypesecondary ); /# - println( "^5GiveWeapon( " + grenadetypesecondary + " ) -- grenadeTypeSecondary" ); + println( "^5GiveWeapon( " + grenadetypesecondary + " ) -- grenadeTypeSecondary" ); #/ - */ - self giveweapon( grenadetypesecondary ); - self setweaponammoclip( grenadetypesecondary, grenadesecondarycount ); - self.grenadetypesecondary = grenadetypesecondary; - self.grenadetypesecondarycount = grenadesecondarycount; - } - self bbclasschoice( class_num, primaryweapon, sidearm ); - if ( !sessionmodeiszombiesgame() ) - { - for ( i = 0; i < 3; i++ ) - { - if ( level.loadoutkillstreaksenabled && isDefined( self.killstreak[ i ] ) && isDefined( level.killstreakindices[ self.killstreak[ i ] ] ) ) - { - killstreaks[ i ] = level.killstreakindices[ self.killstreak[ i ] ]; - } - else - { - killstreaks[ i ] = 0; - } - } - self recordloadoutperksandkillstreaks( primaryweapon, sidearm, grenadetypeprimary, grenadetypesecondary, killstreaks[ 0 ], killstreaks[ 1 ], killstreaks[ 2 ] ); - } - self maps/mp/teams/_teams::set_player_model( team, weapon ); - self initstaticweaponstime(); - self thread initweaponattachments( spawnweapon ); - self setplayerrenderoptions( playerrenderoptions ); - if ( isDefined( self.movementspeedmodifier ) ) - { - self setmovespeedscale( self.movementspeedmodifier * self getmovespeedscale() ); - } - if ( isDefined( level.givecustomloadout ) ) - { - spawnweapon = self [[ level.givecustomloadout ]](); - if ( isDefined( spawnweapon ) ) - { - self thread initweaponattachments( spawnweapon ); - } - } - self cac_selector(); - if ( !isDefined( self.firstspawn ) ) - { - if ( isDefined( spawnweapon ) ) - { - self initialweaponraise( spawnweapon ); - } - else - { - self initialweaponraise( weapon ); - } - } - else - { - self seteverhadweaponall( 1 ); - } - self.firstspawn = 0; - pixendevent(); + self giveweapon( grenadetypesecondary ); + self setweaponammoclip( grenadetypesecondary, grenadesecondarycount ); + self.grenadetypesecondary = grenadetypesecondary; + self.grenadetypesecondarycount = grenadesecondarycount; + } + + self bbclasschoice( class_num, primaryweapon, sidearm ); + + if ( !sessionmodeiszombiesgame() ) + { + for ( i = 0; i < 3; i++ ) + { + if ( level.loadoutkillstreaksenabled && isdefined( self.killstreak[i] ) && isdefined( level.killstreakindices[self.killstreak[i]] ) ) + { + killstreaks[i] = level.killstreakindices[self.killstreak[i]]; + continue; + } + + killstreaks[i] = 0; + } + + self recordloadoutperksandkillstreaks( primaryweapon, sidearm, grenadetypeprimary, grenadetypesecondary, killstreaks[0], killstreaks[1], killstreaks[2] ); + } + + self maps\mp\teams\_teams::set_player_model( team, weapon ); + self initstaticweaponstime(); + self thread initweaponattachments( spawnweapon ); + self setplayerrenderoptions( playerrenderoptions ); + + if ( isdefined( self.movementspeedmodifier ) ) + self setmovespeedscale( self.movementspeedmodifier * self getmovespeedscale() ); + + if ( isdefined( level.givecustomloadout ) ) + { + spawnweapon = self [[ level.givecustomloadout ]](); + + if ( isdefined( spawnweapon ) ) + self thread initweaponattachments( spawnweapon ); + } + + self cac_selector(); + + if ( !isdefined( self.firstspawn ) ) + { + if ( isdefined( spawnweapon ) ) + self initialweaponraise( spawnweapon ); + else + self initialweaponraise( weapon ); + } + else + self seteverhadweaponall( 1 ); + + self.firstspawn = 0; + pixendevent(); } -setweaponammooverall( weaponname, amount ) //checked matches cerberus output +setweaponammooverall( weaponname, amount ) { - if ( isweaponcliponly( weaponname ) ) - { - self setweaponammoclip( weaponname, amount ); - } - else - { - self setweaponammoclip( weaponname, amount ); - diff = amount - self getweaponammoclip( weaponname ); - /* + if ( isweaponcliponly( weaponname ) ) + self setweaponammoclip( weaponname, amount ); + else + { + self setweaponammoclip( weaponname, amount ); + diff = amount - self getweaponammoclip( weaponname ); /# - assert( diff >= 0 ); + assert( diff >= 0 ); #/ - */ - self setweaponammostock( weaponname, diff ); - } + self setweaponammostock( weaponname, diff ); + } } -onplayerconnecting() //checked matches cerberus output +onplayerconnecting() { - for ( ;; ) - { - level waittill( "connecting", player ); - if ( !level.oldschool ) - { - if ( !isDefined( player.pers[ "class" ] ) ) - { - player.pers[ "class" ] = ""; - } - player.class = player.pers[ "class" ]; - player.lastclass = ""; - } - player.detectexplosives = 0; - player.bombsquadicons = []; - player.bombsquadids = []; - player.reviveicons = []; - player.reviveids = []; - } + for (;;) + { + level waittill( "connecting", player ); + + if ( !level.oldschool ) + { + if ( !isdefined( player.pers["class"] ) ) + player.pers["class"] = ""; + + player.class = player.pers["class"]; + player.lastclass = ""; + } + + player.detectexplosives = 0; + player.bombsquadicons = []; + player.bombsquadids = []; + player.reviveicons = []; + player.reviveids = []; + } } -fadeaway( waitdelay, fadedelay ) //checked matches cerberus output +fadeaway( waitdelay, fadedelay ) { - wait waitdelay; - self fadeovertime( fadedelay ); - self.alpha = 0; + wait( waitdelay ); + self fadeovertime( fadedelay ); + self.alpha = 0; } -setclass( newclass ) //checked matches cerberus output +setclass( newclass ) { - self.curclass = newclass; + self.curclass = newclass; } -initperkdvars() //checked matches cerberus output +initperkdvars() { - level.cac_armorpiercing_data = cac_get_dvar_int( "perk_armorpiercing", "40" ) / 100; - level.cac_bulletdamage_data = cac_get_dvar_int( "perk_bulletDamage", "35" ); - level.cac_fireproof_data = cac_get_dvar_int( "perk_fireproof", "95" ); - level.cac_armorvest_data = cac_get_dvar_int( "perk_armorVest", "80" ); - level.cac_explosivedamage_data = cac_get_dvar_int( "perk_explosiveDamage", "25" ); - level.cac_flakjacket_data = cac_get_dvar_int( "perk_flakJacket", "35" ); - level.cac_flakjacket_hardcore_data = cac_get_dvar_int( "perk_flakJacket_hardcore", "9" ); + level.cac_armorpiercing_data = cac_get_dvar_int( "perk_armorpiercing", "40" ) / 100; + level.cac_bulletdamage_data = cac_get_dvar_int( "perk_bulletDamage", "35" ); + level.cac_fireproof_data = cac_get_dvar_int( "perk_fireproof", "95" ); + level.cac_armorvest_data = cac_get_dvar_int( "perk_armorVest", "80" ); + level.cac_explosivedamage_data = cac_get_dvar_int( "perk_explosiveDamage", "25" ); + level.cac_flakjacket_data = cac_get_dvar_int( "perk_flakJacket", "35" ); + level.cac_flakjacket_hardcore_data = cac_get_dvar_int( "perk_flakJacket_hardcore", "9" ); } -cac_selector() //checked changed to match cerberus output +cac_selector() { - perks = self.specialty; - self.detectexplosives = 0; - for ( i = 0; i < perks.size; i++ ) - { - perk = perks[ i ]; - if ( perk == "specialty_detectexplosive" ) - { - self.detectexplosives = 1; - } - } + perks = self.specialty; + self.detectexplosives = 0; + + for ( i = 0; i < perks.size; i++ ) + { + perk = perks[i]; + + if ( perk == "specialty_detectexplosive" ) + self.detectexplosives = 1; + } } -register_perks() //checked changed at own discretion did not use continue in for loop see github for more info +register_perks() { - perks = self.specialty; - self clearperks(); - for ( i = 0; i < perks.size; i++ ) - { - perk = perks[ i ]; - if ( perk == "specialty_null" || issubstr( perk, "specialty_weapon_" ) || perk == "weapon_null" ) - { - } - else if ( !level.perksenabled ) - { - } - else - { - self setperk( perk ); - } - } - /* + perks = self.specialty; + self clearperks(); + + for ( i = 0; i < perks.size; i++ ) + { + perk = perks[i]; + + if ( perk == "specialty_null" || issubstr( perk, "specialty_weapon_" ) || perk == "weapon_null" ) + continue; + + if ( !level.perksenabled ) + continue; + + self setperk( perk ); + } + /# - maps/mp/gametypes/_dev::giveextraperks(); + maps\mp\gametypes\_dev::giveextraperks(); #/ - */ } -cac_get_dvar_int( dvar, def ) //checked matches cerberus output +cac_get_dvar_int( dvar, def ) { - return int( cac_get_dvar( dvar, def ) ); + return int( cac_get_dvar( dvar, def ) ); } -cac_get_dvar( dvar, def ) //checked matches cerberus output +cac_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; + } } -cac_modified_vehicle_damage( victim, attacker, damage, meansofdeath, weapon, inflictor ) //checked changed to match cerberus output dvars obtained from beta dump +cac_modified_vehicle_damage( victim, attacker, damage, meansofdeath, weapon, inflictor ) { - if ( !isDefined( victim ) || !isDefined( attacker ) || !isplayer( attacker ) ) - { - return damage; - } - if ( !isDefined( damage ) || !isDefined( meansofdeath ) || !isDefined( weapon ) ) - { - return damage; - } - old_damage = damage; - final_damage = damage; - if ( attacker hasperk( "specialty_bulletdamage" ) && isprimarydamage( meansofdeath ) ) - { - final_damage = ( damage * ( 100 + level.cac_bulletdamage_data ) ) / 100; - /* + if ( !isdefined( victim ) || !isdefined( attacker ) || !isplayer( attacker ) ) + return damage; + + if ( !isdefined( damage ) || !isdefined( meansofdeath ) || !isdefined( weapon ) ) + return damage; + + old_damage = damage; + final_damage = damage; + + if ( attacker hasperk( "specialty_bulletdamage" ) && isprimarydamage( meansofdeath ) ) + { + final_damage = damage * ( 100 + level.cac_bulletdamage_data ) / 100; /# - if ( getDvarInt( "scr_perkdebug" ) ) - { - println( "Perk/> " + attacker.name + "'s bullet damage did extra damage to vehicle" ); + if ( getdvarint( _hash_5ABA6445 ) ) + println( "Perk/> " + attacker.name + "'s bullet damage did extra damage to vehicle" ); #/ - } - */ - } - else if ( attacker hasperk( "specialty_explosivedamage" ) && isplayerexplosiveweapon( weapon, meansofdeath ) ) - { - final_damage = ( damage * ( 100 + level.cac_explosivedamage_data ) ) / 100; - /* + } + else if ( attacker hasperk( "specialty_explosivedamage" ) && isplayerexplosiveweapon( weapon, meansofdeath ) ) + { + final_damage = damage * ( 100 + level.cac_explosivedamage_data ) / 100; /# - if ( getDvarInt( "scr_perkdebug" ) ) - { - println( "Perk/> " + attacker.name + "'s explosive damage did extra damage to vehicle" ); + if ( getdvarint( _hash_5ABA6445 ) ) + println( "Perk/> " + attacker.name + "'s explosive damage did extra damage to vehicle" ); #/ - } - */ - } - else - { - final_damage = old_damage; - } - /* + } + else + final_damage = old_damage; + /# - if ( getDvarInt( "scr_perkdebug" ) ) - { - println( "Perk/> Damage Factor: " + ( final_damage / old_damage ) + " - Pre Damage: " + old_damage + " - Post Damage: " + final_damage ); + if ( getdvarint( _hash_5ABA6445 ) ) + println( "Perk/> Damage Factor: " + final_damage / old_damage + " - Pre Damage: " + old_damage + " - Post Damage: " + final_damage ); #/ - } - */ - return int( final_damage ); + return int( final_damage ); } -cac_modified_damage( victim, attacker, damage, mod, weapon, inflictor, hitloc ) //checked changed to match cerberus output certain order of operations changed to match beta dump +cac_modified_damage( victim, attacker, damage, mod, weapon, inflictor, hitloc ) { - /* /# - assert( isDefined( victim ) ); + assert( isdefined( victim ) ); #/ /# - assert( isDefined( attacker ) ); + assert( isdefined( attacker ) ); #/ /# - assert( isplayer( victim ) ); + assert( isplayer( victim ) ); #/ - */ - if ( victim == attacker ) - { - return damage; - } - if ( !isplayer( attacker ) ) - { - return damage; - } - if ( damage <= 0 ) - { - return damage; - } - /* + + if ( victim == attacker ) + return damage; + + if ( !isplayer( attacker ) ) + return damage; + + if ( damage <= 0 ) + return damage; + /# - debug = 0; - if ( getDvarInt( "scr_perkdebug" ) ) - { - debug = 1; + debug = 0; + + if ( getdvarint( _hash_5ABA6445 ) ) + debug = 1; #/ - } - */ - final_damage = damage; - if ( attacker hasperk( "specialty_bulletdamage" ) && isprimarydamage( mod ) ) - { - if ( victim hasperk( "specialty_armorvest" ) && !isheaddamage( hitloc ) ) - { - /* + final_damage = damage; + + if ( attacker hasperk( "specialty_bulletdamage" ) && isprimarydamage( mod ) ) + { + if ( victim hasperk( "specialty_armorvest" ) && !isheaddamage( hitloc ) ) + { /# - if ( debug ) - { - println( "Perk/> " + victim.name + "'s armor countered " + attacker.name + "'s increased bullet damage" ); + if ( debug ) + println( "Perk/> " + victim.name + "'s armor countered " + attacker.name + "'s increased bullet damage" ); #/ - } - */ - } - else - { - final_damage = damage * ( 100 + level.cac_bulletdamage_data ) / 100; - /* + } + else + { + final_damage = damage * ( 100 + level.cac_bulletdamage_data ) / 100; /# - if ( debug ) - { - println( "Perk/> " + attacker.name + "'s bullet damage did extra damage to " + victim.name ); + if ( debug ) + println( "Perk/> " + attacker.name + "'s bullet damage did extra damage to " + victim.name ); #/ - } - */ - } - } - else if ( victim hasperk( "specialty_armorvest" ) && isprimarydamage( mod ) && !isheaddamage( hitloc ) ) - { - final_damage = damage * ( level.cac_armorvest_data * 0.01 ); - /* + } + } + else if ( victim hasperk( "specialty_armorvest" ) && isprimarydamage( mod ) && !isheaddamage( hitloc ) ) + { + final_damage = damage * ( level.cac_armorvest_data * 0.01 ); /# - if ( debug ) - { - println( "Perk/> " + attacker.name + "'s bullet damage did less damage to " + victim.name ); + if ( debug ) + println( "Perk/> " + attacker.name + "'s bullet damage did less damage to " + victim.name ); #/ - } - */ - } - else if ( victim hasperk( "specialty_fireproof" ) && isfiredamage( weapon, mod ) ) - { - final_damage = damage * ( ( 100 - level.cac_fireproof_data ) / 100 ); - /* + } + else if ( victim hasperk( "specialty_fireproof" ) && isfiredamage( weapon, mod ) ) + { + final_damage = damage * ( 100 - level.cac_fireproof_data ) / 100; /# - if ( debug ) - { - println( "Perk/> " + attacker.name + "'s flames did less damage to " + victim.name ); + if ( debug ) + println( "Perk/> " + attacker.name + "'s flames did less damage to " + victim.name ); #/ - } - */ - } - else if ( attacker hasperk( "specialty_explosivedamage" ) && isplayerexplosiveweapon( weapon, mod ) ) - { - final_damage = damage * ( 100 + level.cac_explosivedamage_data ) / 100; - /* + } + else if ( attacker hasperk( "specialty_explosivedamage" ) && isplayerexplosiveweapon( weapon, mod ) ) + { + final_damage = damage * ( 100 + level.cac_explosivedamage_data ) / 100; /# - if ( debug ) - { - println( "Perk/> " + attacker.name + "'s explosive damage did extra damage to " + victim.name ); + if ( debug ) + println( "Perk/> " + attacker.name + "'s explosive damage did extra damage to " + victim.name ); #/ - } - */ - } - else if ( victim hasperk( "specialty_flakjacket" ) && isexplosivedamage( weapon, mod ) && !victim grenadestuck( inflictor ) ) - { - if ( level.hardcoremode ) - { - } - else - { - } - cac_data = level.cac_flakjacket_data; - if ( level.teambased && attacker.team != victim.team ) - { - victim thread maps/mp/_challenges::flakjacketprotected( weapon, attacker ); - } - else if ( attacker != victim ) - { - victim thread maps/mp/_challenges::flakjacketprotected( weapon, attacker ); - } - final_damage = int( damage * ( cac_data / 100 ) ); - /* + } + else if ( victim hasperk( "specialty_flakjacket" ) && isexplosivedamage( weapon, mod ) && !victim grenadestuck( inflictor ) ) + { + cac_data = level.hardcoremode ? level.cac_flakjacket_hardcore_data : level.cac_flakjacket_data; + + if ( level.teambased && attacker.team != victim.team ) + victim thread maps\mp\_challenges::flakjacketprotected( weapon, attacker ); + else if ( attacker != victim ) + victim thread maps\mp\_challenges::flakjacketprotected( weapon, attacker ); + + final_damage = int( damage * cac_data / 100 ); /# - if ( debug ) - { - println( "Perk/> " + victim.name + "'s flak jacket decreased " + attacker.name + "'s grenade damage" ); + if ( debug ) + println( "Perk/> " + victim.name + "'s flak jacket decreased " + attacker.name + "'s grenade damage" ); #/ - } - */ - } - /* + } + /# - victim.cac_debug_damage_type = tolower( mod ); - victim.cac_debug_original_damage = damage; - victim.cac_debug_final_damage = final_damage; - victim.cac_debug_location = tolower( hitloc ); - victim.cac_debug_weapon = tolower( weapon ); - victim.cac_debug_range = int( distance( attacker.origin, victim.origin ) ); - if ( debug ) - { - println( "Perk/> Damage Factor: " + ( final_damage / damage ) + " - Pre Damage: " + damage + " - Post Damage: " + final_damage ); + victim.cac_debug_damage_type = tolower( mod ); + victim.cac_debug_original_damage = damage; + victim.cac_debug_final_damage = final_damage; + victim.cac_debug_location = tolower( hitloc ); + victim.cac_debug_weapon = tolower( weapon ); + victim.cac_debug_range = int( distance( attacker.origin, victim.origin ) ); + + if ( debug ) + println( "Perk/> Damage Factor: " + final_damage / damage + " - Pre Damage: " + damage + " - Post Damage: " + final_damage ); #/ - } - */ - final_damage = int( final_damage ); - if ( final_damage < 1 ) - { - final_damage = 1; - } - return final_damage; + final_damage = int( final_damage ); + + if ( final_damage < 1 ) + final_damage = 1; + + return final_damage; } -isexplosivedamage( weapon, meansofdeath ) //checked matches cerberus output +isexplosivedamage( weapon, meansofdeath ) { - if ( isDefined( weapon ) ) - { - switch( weapon ) - { - case "briefcase_bomb_mp": - case "concussion_grenade_mp": - case "emp_grenade_mp": - case "flash_grenade_mp": - case "proximity_grenade_mp": - case "tabun_gas_mp": - case "willy_pete_mp": - return 0; - } - } - switch( meansofdeath ) - { - case "MOD_EXPLOSIVE": - case "MOD_GRENADE": - case "MOD_GRENADE_SPLASH": - case "MOD_PROJECTILE_SPLASH": - return 1; - } - return 0; + if ( isdefined( weapon ) ) + { + switch ( weapon ) + { + case "willy_pete_mp": + case "tabun_gas_mp": + case "proximity_grenade_mp": + case "flash_grenade_mp": + case "emp_grenade_mp": + case "concussion_grenade_mp": + case "briefcase_bomb_mp": + return false; + } + } + + switch ( meansofdeath ) + { + case "MOD_PROJECTILE_SPLASH": + case "MOD_GRENADE_SPLASH": + case "MOD_GRENADE": + case "MOD_EXPLOSIVE": + return true; + } + + return false; } -hastacticalmask( player ) //checked changed at own discretion +hastacticalmask( player ) { - if ( player hasperk( "specialty_stunprotection" ) || player hasperk( "specialty_flashprotection" ) || player hasperk( "specialty_proximityprotection" ) ) - { - return 1; - } - return 0; + return player hasperk( "specialty_stunprotection" ) || player hasperk( "specialty_flashprotection" ) || player hasperk( "specialty_proximityprotection" ); } -isprimarydamage( meansofdeath ) //checked changed at own discretion +isprimarydamage( meansofdeath ) { - if ( meansofdeath == "MOD_RIFLE_BULLET" || meansofdeath == "MOD_PISTOL_BULLET" ) - { - return 1; - } - return 0; + return meansofdeath == "MOD_RIFLE_BULLET" || meansofdeath == "MOD_PISTOL_BULLET"; } -isfiredamage( weapon, meansofdeath ) //checked changed at own discretion +isfiredamage( weapon, meansofdeath ) { - if ( ( meansofdeath == "MOD_BURNED" || meansofdeath == "MOD_GRENADE" ) && isSubStr( weapon, "napalm_" ) ) - { - return 1; - } - if ( isSubStr( weapon, "napalm_" ) && meansofdeath == "MOD_GRENADE_SPLASH" ) - { - return 1; - } - if ( ( isSubStr( weapon, "flame" ) || isSubStr( weapon, "napalmblob_" ) ) && ( meansofdeath == "MOD_BURNED" || meansofdeath == "MOD_GRENADE" ) ) - { - return 1; - } - if ( ( isSubStr( weapon, "flame" ) || isSubStr( weapon, "napalmblob_" ) ) && meansofdeath == "MOD_GRENADE_SPLASH" ) - { - return 1; - } - if ( getsubstr( weapon, 0, 3 ) == "ft_" ) - { - return 1; - } - return 0; + if ( ( issubstr( weapon, "flame" ) || issubstr( weapon, "napalmblob_" ) || issubstr( weapon, "napalm_" ) ) && ( meansofdeath == "MOD_BURNED" || meansofdeath == "MOD_GRENADE" || meansofdeath == "MOD_GRENADE_SPLASH" ) ) + return true; + + if ( getsubstr( weapon, 0, 3 ) == "ft_" ) + return true; + + return false; } -isplayerexplosiveweapon( weapon, meansofdeath ) //checked matches cerberus output +isplayerexplosiveweapon( weapon, meansofdeath ) { - if ( !isexplosivedamage( weapon, meansofdeath ) ) - { - return 0; - } - switch( weapon ) - { - case "airstrike_mp": - case "artillery_mp": - case "cobra_ffar_mp": - case "hind_ffar_mp": - case "mortar_mp": - case "napalm_mp": - return 1; - } - return 1; + if ( !isexplosivedamage( weapon, meansofdeath ) ) + return false; + + switch ( weapon ) + { + case "napalm_mp": + case "mortar_mp": + case "hind_ffar_mp": + case "cobra_ffar_mp": + case "artillery_mp": + case "airstrike_mp": + return true; + } + + return true; } -isheaddamage( hitloc ) //checked changed at own discretion +isheaddamage( hitloc ) { - if ( hitloc == "helmet" || hitloc == "head" || hitloc == "neck" ) - { - return 1; - } - return 0; + return hitloc == "helmet" || hitloc == "head" || hitloc == "neck"; } -grenadestuck( inflictor ) //checked changed at own discretion +grenadestuck( inflictor ) { - if ( isDefined( inflictor ) && isDefined( inflictor.stucktoplayer ) && inflictor.stucktoplayer == self ) - { - return 1; - } - return 0; + return isdefined( inflictor ) && isdefined( inflictor.stucktoplayer ) && inflictor.stucktoplayer == self; } - - diff --git a/Multiplayer Core/patch_mp/maps/mp/gametypes/_clientids.gsc b/Multiplayer Core/patch_mp/maps/mp/gametypes/_clientids.gsc index de3aadd..7611d6b 100644 --- a/Multiplayer Core/patch_mp/maps/mp/gametypes/_clientids.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/gametypes/_clientids.gsc @@ -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++; + } } diff --git a/Multiplayer Core/patch_mp/maps/mp/gametypes/_copter.gsc b/Multiplayer Core/patch_mp/maps/mp/gametypes/_copter.gsc index d87cf0e..1fe1984 100644 --- a/Multiplayer Core/patch_mp/maps/mp/gametypes/_copter.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/gametypes/_copter.gsc @@ -1,793 +1,777 @@ -//checked no includes -//added for is_true check -#include common_scripts/utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool -init() //checked changed to match cerberus output +init() { - level.coptermodel = "vehicle_cobra_helicopter_fly"; - precachemodel( level.coptermodel ); - level.copter_maxaccel = 200; - level.copter_maxvel = 700; - level.copter_rotspeed = 90; - level.copter_accellookahead = 2; - level.coptercenteroffset = vectorScale( ( 0, 0, 1 ), 72 ); - level.coptertargetoffset = vectorScale( ( 0, 0, 1 ), 45 ); - level.copterexplosion = loadfx( "explosions/fx_default_explosion" ); - level.copterfinalexplosion = loadfx( "explosions/fx_large_vehicle_explosion" ); + level.coptermodel = "vehicle_cobra_helicopter_fly"; + precachemodel( level.coptermodel ); + level.copter_maxaccel = 200; + level.copter_maxvel = 700; + level.copter_rotspeed = 90; + level.copter_accellookahead = 2; + level.coptercenteroffset = vectorscale( ( 0, 0, 1 ), 72.0 ); + level.coptertargetoffset = vectorscale( ( 0, 0, 1 ), 45.0 ); + level.copterexplosion = loadfx( "explosions/fx_default_explosion" ); + level.copterfinalexplosion = loadfx( "explosions/fx_large_vehicle_explosion" ); } -getabovebuildingslocation( location ) //checked changed to match cerberus output +getabovebuildingslocation( location ) { - trace = bullettrace( location + vectorScale( ( 0, 0, 1 ), 10000 ), location, 0, undefined ); - startorigin = trace[ "position" ] + vectorScale( ( 0, 0, -1 ), 514 ); - zpos = 0; - maxxpos = 13; - maxypos = 13; - for ( xpos = 0; xpos < maxxpos; xpos++ ) - { - for ( ypos = 0; ypos < maxypos; ypos++ ) - { - thisstartorigin = startorigin + ( ( ( xpos / ( maxxpos - 1 ) ) - 0.5 ) * 1024, ( ( ypos / ( maxypos - 1 ) ) - 0.5 ) * 1024, 0 ); - thisorigin = bullettrace( thisstartorigin, thisstartorigin + vectorScale( ( 0, 0, -1 ), 10000 ), 0, undefined ); - zpos += thisorigin[ "position" ][ 2 ]; - } - } - zpos /= maxxpos * maxypos; - zpos += 850; - return ( location[ 0 ], location[ 1 ], zpos ); + trace = bullettrace( location + vectorscale( ( 0, 0, 1 ), 10000.0 ), location, 0, undefined ); + startorigin = trace["position"] + vectorscale( ( 0, 0, -1 ), 514.0 ); + zpos = 0; + maxxpos = 13; + maxypos = 13; + + for ( xpos = 0; xpos < maxxpos; xpos++ ) + { + for ( ypos = 0; ypos < maxypos; ypos++ ) + { + thisstartorigin = startorigin + ( ( xpos / ( maxxpos - 1 ) - 0.5 ) * 1024, ( ypos / ( maxypos - 1 ) - 0.5 ) * 1024, 0 ); + thisorigin = bullettrace( thisstartorigin, thisstartorigin + vectorscale( ( 0, 0, -1 ), 10000.0 ), 0, undefined ); + zpos += thisorigin["position"][2]; + } + } + + zpos /= maxxpos * maxypos; + zpos += 850; + return ( location[0], location[1], zpos ); } -vectorangle( v1, v2 ) //checked changed to match cerberus output +vectorangle( v1, v2 ) { - dot = vectordot( v1, v2 ); - if ( dot >= 1 ) - { - return 0; - } - else if ( dot <= -1 ) - { - return 180; - } - return acos( dot ); + dot = vectordot( v1, v2 ); + + if ( dot >= 1 ) + return 0; + else if ( dot <= -1 ) + return 180; + + return acos( dot ); } -vectortowardsothervector( v1, v2, angle ) //checked matches cerberus output +vectortowardsothervector( v1, v2, angle ) { - dot = vectordot( v1, v2 ); - if ( dot <= -1 ) - { - return v1; - } - v3 = vectornormalize( v2 - vectorScale( v1, dot ) ); - return vectorScale( v1, cos( angle ) ) + vectorScale( v3, sin( angle ) ); + dot = vectordot( v1, v2 ); + + if ( dot <= -1 ) + return v1; + + v3 = vectornormalize( v2 - vectorscale( v1, dot ) ); + return vectorscale( v1, cos( angle ) ) + vectorscale( v3, sin( angle ) ); } -veclength( v ) //checked changed to match cerberus output +veclength( v ) { - return distance( ( 0, 0, 0 ), v ); + return distance( ( 0, 0, 0 ), v ); } -createcopter( location, team, damagetrig ) //checked changed to match cerberus output dvars taken from the beta dump +createcopter( location, team, damagetrig ) { - location = getabovebuildingslocation( location ); - scriptorigin = spawn( "script_origin", location ); - scriptorigin.angles = vectorToAngle( ( 1, 0, 0 ) ); - copter = spawn( "script_model", location ); - copter.angles = vectorToAngle( ( 1, 0, 0 ) ); - copter linkto( scriptorigin ); - scriptorigin.copter = copter; - copter setmodel( level.coptermodel ); - copter playloopsound( "mp_copter_ambience" ); - damagetrig.origin = scriptorigin.origin; - damagetrig thread mylinkto( scriptorigin ); - scriptorigin.damagetrig = damagetrig; - scriptorigin.finaldest = location; - scriptorigin.finalzdest = location[ 2 ]; - scriptorigin.desireddir = ( 1, 0, 0 ); - scriptorigin.desireddirentity = undefined; - scriptorigin.desireddirentityoffset = ( 0, 0, 0 ); - scriptorigin.vel = ( 0, 0, 0 ); - scriptorigin.dontascend = 0; - scriptorigin.health = 2000; - if ( getDvar( "scr_copter_health" ) != "" ) - { - scriptorigin.health = getDvarFloat( "scr_copter_health" ); - } - scriptorigin.team = team; - scriptorigin thread copterai(); - scriptorigin thread copterdamage( damagetrig ); - return scriptorigin; + location = getabovebuildingslocation( location ); + scriptorigin = spawn( "script_origin", location ); + scriptorigin.angles = vectortoangles( ( 1, 0, 0 ) ); + copter = spawn( "script_model", location ); + copter.angles = vectortoangles( ( 0, 1, 0 ) ); + copter linkto( scriptorigin ); + scriptorigin.copter = copter; + copter setmodel( level.coptermodel ); + copter playloopsound( "mp_copter_ambience" ); + damagetrig.origin = scriptorigin.origin; + damagetrig thread mylinkto( scriptorigin ); + scriptorigin.damagetrig = damagetrig; + scriptorigin.finaldest = location; + scriptorigin.finalzdest = location[2]; + scriptorigin.desireddir = ( 1, 0, 0 ); + scriptorigin.desireddirentity = undefined; + scriptorigin.desireddirentityoffset = ( 0, 0, 0 ); + scriptorigin.vel = ( 0, 0, 0 ); + scriptorigin.dontascend = 0; + scriptorigin.health = 2000; + + if ( getdvar( _hash_A8262D2E ) != "" ) + scriptorigin.health = getdvarfloat( _hash_A8262D2E ); + + scriptorigin.team = team; + scriptorigin thread copterai(); + scriptorigin thread copterdamage( damagetrig ); + return scriptorigin; } -makecopterpassive() //checked matches cerberus output +makecopterpassive() { - self.damagetrig notify( "unlink" ); - self.damagetrig = undefined; - self notify( "passive" ); - self.desireddirentity = undefined; - self.desireddir = undefined; + self.damagetrig notify( "unlink" ); + self.damagetrig = undefined; + self notify( "passive" ); + self.desireddirentity = undefined; + self.desireddir = undefined; } -makecopteractive( damagetrig ) //checked matches cerberus output +makecopteractive( damagetrig ) { - damagetrig.origin = self.origin; - damagetrig thread mylinkto( self ); - self.damagetrig = damagetrig; - self thread copterai(); - self thread copterdamage( damagetrig ); + damagetrig.origin = self.origin; + damagetrig thread mylinkto( self ); + self.damagetrig = damagetrig; + self thread copterai(); + self thread copterdamage( damagetrig ); } -mylinkto( obj ) //checked matches cerberus output +mylinkto( obj ) { - self endon( "unlink" ); - while ( 1 ) - { - self.angles = obj.angles; - self.origin = obj.origin; - wait 0.1; - } + self endon( "unlink" ); + + while ( true ) + { + self.angles = obj.angles; + self.origin = obj.origin; + wait 0.1; + } } -setcopterdefensearea( areaent ) //checked changed to match cerberus output +setcopterdefensearea( areaent ) { - self.areaent = areaent; - self.areadescentpoints = []; - if ( isDefined( areaent.target ) ) - { - self.areadescentpoints = getentarray( areaent.target, "targetname" ); - } - for ( i = 0; i < self.areadescentpoints.size; i++ ) - { - self.areadescentpoints[ i ].targetent = getent( self.areadescentpoints[ i ].target, "targetname" ); - } + self.areaent = areaent; + self.areadescentpoints = []; + + if ( isdefined( areaent.target ) ) + self.areadescentpoints = getentarray( areaent.target, "targetname" ); + + for ( i = 0; i < self.areadescentpoints.size; i++ ) + self.areadescentpoints[i].targetent = getent( self.areadescentpoints[i].target, "targetname" ); } -copterai() //checked changed to match cerberus output and partially the beta dump +copterai() { - self thread coptermove(); - self thread coptershoot(); - self endon( "death" ); - self endon( "passive" ); - flying = 1; - descendingent = undefined; - reacheddescendingent = 0; - returningtoarea = 0; - while ( 1 ) - { - if ( !isDefined( self.areaent ) ) - { - wait 1; - continue; - } - players = level.players; - enemytargets = []; - if ( self.team != "neutral" ) - { - for ( i = 0; i < players.size; i++ ) - { - if ( isalive( players[ i ] ) && isDefined( players[ i ].pers[ "team" ] ) && players[ i ].pers[ "team" ] != self.team && !isDefined( players[ i ].usingobj ) ) - { - playerorigin = players[ i ].origin; - playerorigin = ( playerorigin[ 0 ], playerorigin[ 1 ], self.areaent.origin[ 2 ] ); - if ( distance( playerorigin, self.areaent.origin ) < self.areaent.radius ) - { - enemytargets[ enemytargets.size ] = players[ i ]; - } - } - } - } - insidetargets = []; - outsidetargets = []; - skyheight = bullettrace( self.origin, self.origin + vectorScale( ( 0, 0, 1 ), 10000 ), 0, undefined )[ "position" ][ 2 ] - 10; - besttarget = undefined; - bestweight = 0; - for ( i = 0; i < enemytargets.size; i++ ) - { - inside = 0; - trace = bullettrace( enemytargets[ i ].origin + vectorScale( ( 0, 0, 1 ), 10 ), enemytargets[ i ].origin + vectorScale( ( 0, 0, 1 ), 10000 ), 0, undefined ); - if ( trace[ "position" ][ 2 ] >= skyheight ) - { - outsidetargets[ outsidetargets.size ] = enemytargets[ i ]; - } - else - { - insidetargets[ insidetargets.size ] = enemytargets[ i ]; - } - } - gotopos = undefined; - calcedgotopos = 0; - olddescendingent = undefined; - if ( flying ) - { - if ( outsidetargets.size == 0 && insidetargets.size > 0 && self.areadescentpoints.size > 0 ) - { - flying = 0; - result = determinebestent( insidetargets, self.areadescentpoints, self.origin ); - descendingent = result[ "descendEnt" ]; - if ( isDefined( descendingent ) ) - { - gotopos = result[ "position" ]; - } - else - { - flying = 1; - } - } - } - else - { - olddescendingent = descendingent; - if ( insidetargets.size == 0 ) - { - flying = 1; - } - else if ( outsidetargets.size > 0 ) - { - if ( !isDefined( descendingent ) ) - { - flying = 1; - } - else - { - calcedgotopos = 1; - gotopos = determinebestpos( insidetargets, descendingent, self.origin ); - if ( !isDefined( gotopos ) ) - { - flying = 1; - } - } - } - if ( isDefined( descendingent ) ) - { - if ( !calcedgotopos ) - { - gotopos = determinebestpos( insidetargets, descendingent, self.origin ); - } - } - if ( !isDefined( gotopos ) ) - { - result = determinebestent( insidetargets, self.areadescentpoints, self.origin ); - if ( isDefined( result[ "descendEnt" ] ) ) - { - descendingent = result[ "descendEnt" ]; - gotopos = result[ "position" ]; - reacheddescendingent = 0; - } - else if ( isDefined( descendingent ) ) - { - if ( isDefined( self.finaldest ) ) - { - gotopos = self.finaldest; - } - else - { - gotopos = descendingent.origin; - } - } - else - { - gotopos = undefined; - } - } - if ( !isDefined( gotopos ) ) - { - flying = 1; - } - } - if ( flying ) - { - desireddist = 2560; - disttoarea = distance( ( self.origin[ 0 ], self.origin[ 1 ], self.areaent.origin[ 2 ] ), self.areaent.origin ); - if ( outsidetargets.size == 0 && disttoarea > ( self.areaent.radius + ( desireddist * 0.25 ) ) ) - { - returningtoarea = 1; - } - else - { - if ( disttoarea < ( self.areaent.radius * 0.5 ) ) - { - returningtoarea = 0; - } - } - if ( outsidetargets.size == 0 && !returningtoarea ) - { - if ( self.team != "neutral" ) - { - i = 0; - while ( i < players.size ) - { - if ( isalive( players[ i ] ) && isDefined( players[ i ].pers[ "team" ] ) && players[ i ].pers[ "team" ] != self.team && !isDefined( players[ i ].usingobj ) ) - { - playerorigin = players[ i ].origin; - playerorigin = ( playerorigin[ 0 ], playerorigin[ 1 ], self.areaent.origin[ 2 ] ); - if ( distance( players[ i ].origin, self.areaent.origin ) > self.areaent.radius ) - { - outsidetargets[ outsidetargets.size ] = players[ i ]; - } - } - i++; - } - } - } - best = undefined; - bestdist = 0; - for ( i = 0; i < outsidetargets.size; i++ ) - { - dist = abs( distance( outsidetargets[ i ].origin, self.origin ) - desireddist ); - if ( !isDefined( best ) || dist < bestdist ) - { - best = outsidetargets[ i ]; - bestdist = dist; - } - } - if ( isDefined( best ) ) - { - attackpos = best.origin + level.coptertargetoffset; - gotopos = determinebestattackpos( attackpos, self.origin, desireddist ); - self setcopterdest( gotopos, 0 ); - self.desireddir = vectornormalize( attackpos - gotopos ); - self.desireddirentity = best; - self.desireddirentityoffset = level.coptertargetoffset; - wait 1; - } - else - { - gotopos = getrandompos( self.areaent.origin, self.areaent.radius ); - self setcopterdest( gotopos, 0 ); - self.desireddir = undefined; - self.desireddirentity = undefined; - wait 1; - } - continue; - } - else - { - if ( distance( self.origin, descendingent.origin ) < descendingent.radius ) - { - reacheddescendingent = 1; - } - if ( isdefined( oldDescendingEnt ) && oldDescendingEnt == descendingEnt ) - { - goDirectly = 1; - } - else - { - goDirectly = 0; - } - if ( goDirectly && reachedDescendingEnt ) - { - goDirectly = 1; - } - else - { - goDirectly = 0; - } - self.desireddir = vectornormalize( descendingent.targetent.origin - gotopos - level.coptercenteroffset ); - self.desireddirentity = descendingent.targetent; - self.desireddirentityoffset = ( 0, 0, 0 ); - if ( gotopos != self.origin ) - { - self setcopterdest( gotopos - level.coptercenteroffset, 1, godirectly ); - wait 0.3; - } - else - { - wait 0.3; - } - } - } + self thread coptermove(); + self thread coptershoot(); + self endon( "death" ); + self endon( "passive" ); + flying = 1; + descendingent = undefined; + reacheddescendingent = 0; + returningtoarea = 0; + + while ( true ) + { + if ( !isdefined( self.areaent ) ) + { + wait 1; + continue; + } + + players = level.players; + enemytargets = []; + + if ( self.team != "neutral" ) + { + for ( i = 0; i < players.size; i++ ) + { + if ( isalive( players[i] ) && isdefined( players[i].pers["team"] ) && players[i].pers["team"] != self.team && !isdefined( players[i].usingobj ) ) + { + playerorigin = players[i].origin; + playerorigin = ( playerorigin[0], playerorigin[1], self.areaent.origin[2] ); + + if ( distance( playerorigin, self.areaent.origin ) < self.areaent.radius ) + enemytargets[enemytargets.size] = players[i]; + } + } + } + + insidetargets = []; + outsidetargets = []; + skyheight = bullettrace( self.origin, self.origin + vectorscale( ( 0, 0, 1 ), 10000.0 ), 0, undefined )["position"][2] - 10; + besttarget = undefined; + bestweight = 0; + + for ( i = 0; i < enemytargets.size; i++ ) + { + inside = 0; + trace = bullettrace( enemytargets[i].origin + vectorscale( ( 0, 0, 1 ), 10.0 ), enemytargets[i].origin + vectorscale( ( 0, 0, 1 ), 10000.0 ), 0, undefined ); + + if ( trace["position"][2] >= skyheight ) + { + outsidetargets[outsidetargets.size] = enemytargets[i]; + continue; + } + + insidetargets[insidetargets.size] = enemytargets[i]; + } + + gotopos = undefined; + calcedgotopos = 0; + olddescendingent = undefined; + + if ( flying ) + { + if ( outsidetargets.size == 0 && insidetargets.size > 0 && self.areadescentpoints.size > 0 ) + { + flying = 0; + result = determinebestent( insidetargets, self.areadescentpoints, self.origin ); + descendingent = result["descendEnt"]; + + if ( isdefined( descendingent ) ) + gotopos = result["position"]; + else + flying = 1; + } + } + else + { + olddescendingent = descendingent; + + if ( insidetargets.size == 0 ) + flying = 1; + else + { + if ( outsidetargets.size > 0 ) + { + if ( !isdefined( descendingent ) ) + flying = 1; + else + { + calcedgotopos = 1; + gotopos = determinebestpos( insidetargets, descendingent, self.origin ); + + if ( !isdefined( gotopos ) ) + flying = 1; + } + } + + if ( isdefined( descendingent ) ) + { + if ( !calcedgotopos ) + gotopos = determinebestpos( insidetargets, descendingent, self.origin ); + } + + if ( !isdefined( gotopos ) ) + { + result = determinebestent( insidetargets, self.areadescentpoints, self.origin ); + + if ( isdefined( result["descendEnt"] ) ) + { + descendingent = result["descendEnt"]; + gotopos = result["position"]; + reacheddescendingent = 0; + } + else if ( isdefined( descendingent ) ) + { + if ( isdefined( self.finaldest ) ) + gotopos = self.finaldest; + else + gotopos = descendingent.origin; + } + else + gotopos = undefined; + } + + if ( !isdefined( gotopos ) ) + flying = 1; + } + } + + if ( flying ) + { + desireddist = 2560.0; + disttoarea = distance( ( self.origin[0], self.origin[1], self.areaent.origin[2] ), self.areaent.origin ); + + if ( outsidetargets.size == 0 && disttoarea > self.areaent.radius + desireddist * 0.25 ) + returningtoarea = 1; + else if ( disttoarea < self.areaent.radius * 0.5 ) + returningtoarea = 0; + + if ( outsidetargets.size == 0 && !returningtoarea ) + { + if ( self.team != "neutral" ) + { + for ( i = 0; i < players.size; i++ ) + { + if ( isalive( players[i] ) && isdefined( players[i].pers["team"] ) && players[i].pers["team"] != self.team && !isdefined( players[i].usingobj ) ) + { + playerorigin = players[i].origin; + playerorigin = ( playerorigin[0], playerorigin[1], self.areaent.origin[2] ); + + if ( distance( players[i].origin, self.areaent.origin ) > self.areaent.radius ) + outsidetargets[outsidetargets.size] = players[i]; + } + } + } + } + + best = undefined; + bestdist = 0; + + for ( i = 0; i < outsidetargets.size; i++ ) + { + dist = abs( distance( outsidetargets[i].origin, self.origin ) - desireddist ); + + if ( !isdefined( best ) || dist < bestdist ) + { + best = outsidetargets[i]; + bestdist = dist; + } + } + + if ( isdefined( best ) ) + { + attackpos = best.origin + level.coptertargetoffset; + gotopos = determinebestattackpos( attackpos, self.origin, desireddist ); + self setcopterdest( gotopos, 0 ); + self.desireddir = vectornormalize( attackpos - gotopos ); + self.desireddirentity = best; + self.desireddirentityoffset = level.coptertargetoffset; + wait 1; + } + else + { + gotopos = getrandompos( self.areaent.origin, self.areaent.radius ); + self setcopterdest( gotopos, 0 ); + self.desireddir = undefined; + self.desireddirentity = undefined; + wait 1; + } + } + else + { + if ( distance( self.origin, descendingent.origin ) < descendingent.radius ) + reacheddescendingent = 1; + + godirectly = isdefined( olddescendingent ) && olddescendingent == descendingent; + godirectly = godirectly && reacheddescendingent; + self.desireddir = vectornormalize( descendingent.targetent.origin - ( gotopos - level.coptercenteroffset ) ); + self.desireddirentity = descendingent.targetent; + self.desireddirentityoffset = ( 0, 0, 0 ); + + if ( gotopos != self.origin ) + { + self setcopterdest( gotopos - level.coptercenteroffset, 1, godirectly ); + wait 0.3; + } + else + wait 0.3; + } + } } -determinebestpos( targets, descendent, startorigin ) //checked changed to match cerberus output +determinebestpos( targets, descendent, startorigin ) { - targetpos = descendent.targetent.origin; - circleradius = distance( targetpos, descendent.origin ); - bestpoint = undefined; - bestdist = 0; - for ( i = 0; i < targets.size; i++ ) - { - enemypos = targets[ i ].origin + level.coptertargetoffset; - passed = bullettracepassed( enemypos, targetpos, 0, undefined ); - if ( passed ) - { - dir = targetpos - enemypos; - dir = ( dir[ 0 ], dir[ 1 ], 0 ); - isect = vectorScale( vectornormalize( dir ), circleradius ) + targetpos; - isect = ( isect[ 0 ], isect[ 1 ], descendent.origin[ 2 ] ); - dist = distance( isect, descendent.origin ); - if ( dist <= descendent.radius ) - { - dist = distance( isect, startorigin ); - if ( !isDefined( bestpoint ) || dist < bestdist ) - { - bestdist = dist; - bestpoint = isect; - } - } - } - } - return bestpoint; + targetpos = descendent.targetent.origin; + circleradius = distance( targetpos, descendent.origin ); + bestpoint = undefined; + bestdist = 0; + + for ( i = 0; i < targets.size; i++ ) + { + enemypos = targets[i].origin + level.coptertargetoffset; + passed = bullettracepassed( enemypos, targetpos, 0, undefined ); + + if ( passed ) + { + dir = targetpos - enemypos; + dir = ( dir[0], dir[1], 0 ); + isect = vectorscale( vectornormalize( dir ), circleradius ) + targetpos; + isect = ( isect[0], isect[1], descendent.origin[2] ); + dist = distance( isect, descendent.origin ); + + if ( dist <= descendent.radius ) + { + dist = distance( isect, startorigin ); + + if ( !isdefined( bestpoint ) || dist < bestdist ) + { + bestdist = dist; + bestpoint = isect; + } + } + } + } + + return bestpoint; } -determinebestent( targets, descendents, startorigin ) //checked changed to match cerberus output +determinebestent( targets, descendents, startorigin ) { - result = []; - bestpos = undefined; - bestent = 0; - bestdist = 0; - for ( i = 0; i < descendents.size; i++ ) - { - thispos = determinebestpos( targets, descendents[ i ], startorigin ); - if ( isDefined( thispos ) ) - { - thisdist = distance( thispos, startorigin ); - if ( !isDefined( bestpos ) || thisdist < bestdist ) - { - bestpos = thispos; - bestent = i; - bestdist = thisdist; - } - } - } - if ( isDefined( bestpos ) ) - { - result[ "descendEnt" ] = descendents[ bestent ]; - result[ "position" ] = bestpos; - return result; - } - return result; + result = []; + bestpos = undefined; + bestent = 0; + bestdist = 0; + + for ( i = 0; i < descendents.size; i++ ) + { + thispos = determinebestpos( targets, descendents[i], startorigin ); + + if ( isdefined( thispos ) ) + { + thisdist = distance( thispos, startorigin ); + + if ( !isdefined( bestpos ) || thisdist < bestdist ) + { + bestpos = thispos; + bestent = i; + bestdist = thisdist; + } + } + } + + if ( isdefined( bestpos ) ) + { + result["descendEnt"] = descendents[bestent]; + result["position"] = bestpos; + return result; + } + + result["descendEnt"] = undefined; + return result; } -determinebestattackpos( targetpos, curpos, desireddist ) //checked changed to match cerberus output +determinebestattackpos( targetpos, curpos, desireddist ) { - targetposcopterheight = ( targetpos[ 0 ], targetpos[ 1 ], curpos[ 2 ] ); - attackdirx = curpos - targetposcopterheight; - attackdirx = vectornormalize( attackdirx ); - attackdiry = ( 0 - attackdirx[ 1 ], attackdirx[ 0 ], 0 ); - bestpos = undefined; - bestdist = 0; - for ( i = 0; i < 8; i++ ) - { - theta = ( i / 8 ) * 360; - thisdir = vectorScale( attackdirx, cos( theta ) ) + vectorScale( attackdiry, sin( theta ) ); - traceend = targetposcopterheight + vectorScale( thisdir, desireddist ); - losexists = bullettracepassed( targetpos, traceend, 0, undefined ); - if ( losexists ) - { - thisdist = distance( traceend, curpos ); - if ( !isDefined( bestpos ) || thisdist < bestdist ) - { - bestpos = traceend; - bestdist = thisdist; - } - } - } - gotopos = undefined; - if ( isDefined( bestpos ) ) - { - gotopos = bestpos; - } - else - { - dist = distance( targetposcopterheight, curpos ); - if ( dist > desireddist ) - { - gotopos = self.origin + vectorScale( vectornormalize( attackdirx ), 0 - dist - desireddist ); - } - else - { - gotopos = self.origin; - } - } - return gotopos; + targetposcopterheight = ( targetpos[0], targetpos[1], curpos[2] ); + attackdirx = curpos - targetposcopterheight; + attackdirx = vectornormalize( attackdirx ); + attackdiry = ( 0 - attackdirx[1], attackdirx[0], 0 ); + bestpos = undefined; + bestdist = 0; + + for ( i = 0; i < 8; i++ ) + { + theta = i / 8.0 * 360; + thisdir = vectorscale( attackdirx, cos( theta ) ) + vectorscale( attackdiry, sin( theta ) ); + traceend = targetposcopterheight + vectorscale( thisdir, desireddist ); + losexists = bullettracepassed( targetpos, traceend, 0, undefined ); + + if ( losexists ) + { + thisdist = distance( traceend, curpos ); + + if ( !isdefined( bestpos ) || thisdist < bestdist ) + { + bestpos = traceend; + bestdist = thisdist; + } + } + } + + gotopos = undefined; + + if ( isdefined( bestpos ) ) + gotopos = bestpos; + else + { + dist = distance( targetposcopterheight, curpos ); + + if ( dist > desireddist ) + gotopos = self.origin + vectorscale( vectornormalize( attackdirx ), 0 - ( dist - desireddist ) ); + else + gotopos = self.origin; + } + + return gotopos; } -getrandompos( origin, radius ) //checked does not match cerberus output does match beta dump leaving as is +getrandompos( origin, radius ) { - pos = origin + ( ( randomfloat( 2 ) - 1 ) * radius, ( randomfloat( 2 ) - 1 ) * radius, 0 ); - while ( distancesquared( pos, origin ) > ( radius * radius ) ) - { - pos = origin + ( ( randomfloat( 2 ) - 1 ) * radius, ( randomfloat( 2 ) - 1 ) * radius, 0 ); - } - return pos; + for ( pos = origin + ( ( randomfloat( 2 ) - 1 ) * radius, ( randomfloat( 2 ) - 1 ) * radius, 0 ); distancesquared( pos, origin ) > radius * radius; pos = origin + ( ( randomfloat( 2 ) - 1 ) * radius, ( randomfloat( 2 ) - 1 ) * radius, 0 ) ) + { + + } + + return pos; } -coptershoot() //checked changed to match cerberus output +coptershoot() { - self endon( "death" ); - self endon( "passive" ); - costhreshold = cos( 10 ); - while ( 1 ) - { - if ( isDefined( self.desireddirentity ) && isDefined( self.desireddirentity.origin ) ) - { - mypos = self.origin + level.coptercenteroffset; - enemypos = self.desireddirentity.origin + self.desireddirentityoffset; - curdir = anglesToForward( self.angles ); - enemydirraw = enemypos - mypos; - enemydir = vectornormalize( enemydirraw ); - if ( vectordot( curdir, enemydir ) > costhreshold ) - { - canseetarget = bullettracepassed( mypos, enemypos, 0, undefined ); - if ( !canseetarget && isplayer( self.desireddirentity ) && isalive( self.desireddirentity ) ) - { - canseetarget = bullettracepassed( mypos, self.desireddirentity geteye(), 0, undefined ); - } - if ( canseetarget ) - { - self playsound( "mp_copter_shoot" ); - numshots = 20; - for ( i = 0; i < numshots; i++ ) - { - mypos = self.origin + level.coptercenteroffset; - dir = anglesToForward( self.angles ); - dir += ( ( randomfloat( 2 ) - 1 ) * 0.015, ( randomfloat( 2 ) - 1 ) * 0.015, ( randomfloat( 2 ) - 1 ) * 0.015 ); - dir = vectornormalize( dir ); - self mymagicbullet( mypos, dir ); - wait 0.075; - } - wait 0.25; - } - } - } - wait 0.25; - } + self endon( "death" ); + self endon( "passive" ); + costhreshold = cos( 10 ); + + while ( true ) + { + if ( isdefined( self.desireddirentity ) && isdefined( self.desireddirentity.origin ) ) + { + mypos = self.origin + level.coptercenteroffset; + enemypos = self.desireddirentity.origin + self.desireddirentityoffset; + curdir = anglestoforward( self.angles ); + enemydirraw = enemypos - mypos; + enemydir = vectornormalize( enemydirraw ); + + if ( vectordot( curdir, enemydir ) > costhreshold ) + { + canseetarget = bullettracepassed( mypos, enemypos, 0, undefined ); + + if ( !canseetarget && isplayer( self.desireddirentity ) && isalive( self.desireddirentity ) ) + canseetarget = bullettracepassed( mypos, self.desireddirentity geteye(), 0, undefined ); + + if ( canseetarget ) + { + self playsound( "mp_copter_shoot" ); + numshots = 20; + + for ( i = 0; i < numshots; i++ ) + { + mypos = self.origin + level.coptercenteroffset; + dir = anglestoforward( self.angles ); + dir += ( ( randomfloat( 2 ) - 1 ) * 0.015, ( randomfloat( 2 ) - 1 ) * 0.015, ( randomfloat( 2 ) - 1 ) * 0.015 ); + dir = vectornormalize( dir ); + self mymagicbullet( mypos, dir ); + wait 0.075; + } + + wait 0.25; + } + } + } + + wait 0.25; + } } -mymagicbullet( pos, dir ) //checked matches cerberus output dvars found in beta dump +mymagicbullet( pos, dir ) { - damage = 20; - if ( getDvar( "scr_copter_damage" ) != "" ) - { - damage = getDvarInt( "scr_copter_damage" ); - } - trace = bullettrace( pos, pos + vectorScale( dir, 10000 ), 1, undefined ); - if ( isDefined( trace[ "entity" ] ) && isplayer( trace[ "entity" ] ) && isalive( trace[ "entity" ] ) ) - { - trace[ "entity" ] thread [[ level.callbackplayerdamage ]]( self, self, damage, 0, "MOD_RIFLE_BULLET", "copter", self.origin, dir, "none", 0, 0 ); - } + damage = 20; + + if ( getdvar( _hash_9E8F8CB7 ) != "" ) + damage = getdvarint( _hash_9E8F8CB7 ); + + trace = bullettrace( pos, pos + vectorscale( dir, 10000 ), 1, undefined ); + + if ( isdefined( trace["entity"] ) && isplayer( trace["entity"] ) && isalive( trace["entity"] ) ) + trace["entity"] thread [[ level.callbackplayerdamage ]]( self, self, damage, 0, "MOD_RIFLE_BULLET", "copter", self.origin, dir, "none", 0, 0 ); } -setcopterdest( newlocation, descend, dontascend ) //checked matches cerberus output +setcopterdest( newlocation, descend, dontascend ) { - self.finaldest = getabovebuildingslocation( newlocation ); - if ( is_true( descend ) ) - { - self.finalzdest = newlocation[ 2 ]; - } - else - { - self.finalzdest = self.finaldest[ 2 ]; - } - self.intransit = 1; - self.dontascend = 0; - if ( isDefined( dontascend ) ) - { - self.dontascend = dontascend; - } + self.finaldest = getabovebuildingslocation( newlocation ); + + if ( isdefined( descend ) && descend ) + self.finalzdest = newlocation[2]; + else + self.finalzdest = self.finaldest[2]; + + self.intransit = 1; + self.dontascend = 0; + + if ( isdefined( dontascend ) ) + self.dontascend = dontascend; } -notifyarrived() //checked matches cerberus output +notifyarrived() { - wait 0.05; - self notify( "arrived" ); + wait 0.05; + self notify( "arrived" ); } -coptermove() //checked changed to match cerberus output +coptermove() { - self endon( "death" ); - if ( isDefined( self.coptermoverunning ) ) - { - return; - } - self.coptermoverunning = 1; - self.intransit = 0; - interval = 0.15; - zinterp = 0.1; - tiltamnt = 0; - while ( 1 ) - { - horizdistsquared = distancesquared( ( self.origin[ 0 ], self.origin[ 1 ], 0 ), ( self.finaldest[ 0 ], self.finaldest[ 1 ], 0 ) ); - donemoving = horizdistsquared < 100; - neardest = horizdistsquared < 65536; - self.intransit = 1; - desiredz = 0; - movinghorizontally = 1; - movingvertically = 0; - if ( self.dontascend ) - { - movingvertically = 1; - } - else if ( !neardest ) - { - desiredz = getabovebuildingslocation( self.origin )[ 2 ]; - movinghorizontally = abs( self.origin[ 2 ] - desiredz ) <= 256; - movingvertically = !movinghorizontally; - } - else - { - movingvertically = 1; - } - if ( movinghorizontally ) - { - if ( movingvertically ) - { - thisdest = ( self.finaldest[ 0 ], self.finaldest[ 1 ], self.finalzdest ); - } - else - { - thisdest = self.finaldest; - } - } - else - { - /* + self endon( "death" ); + + if ( isdefined( self.coptermoverunning ) ) + return; + + self.coptermoverunning = 1; + self.intransit = 0; + interval = 0.15; + zinterp = 0.1; + tiltamnt = 0; + + while ( true ) + { + horizdistsquared = distancesquared( ( self.origin[0], self.origin[1], 0 ), ( self.finaldest[0], self.finaldest[1], 0 ) ); + donemoving = horizdistsquared < 100; + neardest = horizdistsquared < 65536; + self.intransit = 1; + desiredz = 0; + movinghorizontally = 1; + movingvertically = 0; + + if ( self.dontascend ) + movingvertically = 1; + else if ( !neardest ) + { + desiredz = getabovebuildingslocation( self.origin )[2]; + movinghorizontally = abs( self.origin[2] - desiredz ) <= 256; + movingvertically = !movinghorizontally; + } + else + movingvertically = 1; + + if ( movinghorizontally ) + { + if ( movingvertically ) + thisdest = ( self.finaldest[0], self.finaldest[1], self.finalzdest ); + else + thisdest = self.finaldest; + } + else + { /# - assert( movingvertically ); + assert( movingvertically ); #/ - */ - thisdest = ( self.origin[ 0 ], self.origin[ 1 ], desiredz ); - } - movevec = thisdest - self.origin; - idealaccel = vectorScale( thisdest - ( self.origin + vectorScale( self.vel, level.copter_accellookahead ) ), interval ); - vlen = veclength( idealaccel ); - if ( vlen > level.copter_maxaccel ) - { - idealaccel = vectorScale( idealaccel, level.copter_maxaccel / vlen ); - } - self.vel += idealaccel; - vlen = veclength( self.vel ); - if ( vlen > level.copter_maxvel ) - { - self.vel = vectorScale( self.vel, level.copter_maxvel / vlen ); - } - thisdest = self.origin + vectorScale( self.vel, interval ); - self moveto( thisdest, interval * 0.999 ); - speed = veclength( self.vel ); - if ( isDefined( self.desireddirentity ) && isDefined( self.desireddirentity.origin ) ) - { - self.destdir = vectornormalize( ( self.desireddirentity.origin + self.desireddirentityoffset ) - ( self.origin + level.coptercenteroffset ) ); - } - else if ( isDefined( self.desireddir ) ) - { - self.destdir = self.desireddir; - break; - } - else if ( movingvertically ) - { - self.destdir = anglesToForward( self.angles ); - self.destdir = vectornormalize( ( self.destdir[ 0 ], self.destdir[ 1 ], 0 ) ); - break; - } - else - { - tiltamnt = speed / level.copter_maxvel; - tiltamnt = ( tiltamnt - 0.1 ) / 0.9; - if ( tiltamnt < 0 ) - { - tiltamnt = 0; - } - self.destdir = movevec; - self.destdir = vectornormalize( ( self.destdir[ 0 ], self.destdir[ 1 ], 0 ) ); - tiltamnt *= 1 - ( vectorangle( anglesToForward( self.angles ), self.destdir ) / 180 ); - self.destdir = vectornormalize( ( self.destdir[ 0 ], self.destdir[ 1 ], tiltamnt * -0.4 ) ); - } - newdir = self.destdir; - if ( newdir[ 2 ] < -0.4 ) - { - newdir = vectornormalize( ( newdir[ 0 ], newdir[ 1 ], -0.4 ) ); - } - copterangles = self.angles; - copterangles = combineangles( copterangles, vectorScale( ( 0, 0, -1 ), 90 ) ); - olddir = anglesToForward( copterangles ); - thisrotspeed = level.copter_rotspeed; - olddir2d = vectornormalize( ( olddir[ 0 ], olddir[ 1 ], 0 ) ); - newdir2d = vectornormalize( ( newdir[ 0 ], newdir[ 1 ], 0 ) ); - angle = vectorangle( olddir2d, newdir2d ); - angle3d = vectorangle( olddir, newdir ); - if ( angle > 0.001 && thisrotspeed > 0.001 ) - { - thisangle = thisrotspeed * interval; - if ( thisangle > angle ) - { - thisangle = angle; - } - newdir2d = vectortowardsothervector( olddir2d, newdir2d, thisangle ); - oldz = olddir[ 2 ] / veclength( ( olddir[ 0 ], olddir[ 1 ], 0 ) ); - newz = newdir[ 2 ] / veclength( ( newdir[ 0 ], newdir[ 1 ], 0 ) ); - interpz = oldz + ( ( newz - oldz ) * ( thisangle / angle ) ); - newdir = vectornormalize( ( newdir2d[ 0 ], newdir2d[ 1 ], interpz ) ); - copterangles = vectorToAngle( newdir ); - copterangles = combineangles( copterangles, vectorScale( ( 0, -1, 0 ), 90 ) ); - self rotateto( copterangles, interval * 0.999 ); - } - else if ( angle3d > 0.001 && thisrotspeed > 0.001 ) - { - thisangle = thisrotspeed * interval; - if ( thisangle > angle3d ) - { - thisangle = angle3d; - } - newdir = vectortowardsothervector( olddir, newdir, thisangle ); - newdir = vectornormalize( newdir ); - copterangles = vectorToAngle( newdir ); - copterangles = combineangles( copterangles, vectorScale( ( 0, -1, 0 ), 90 ) ); - self rotateto( copterangles, interval * 0.999 ); - } - wait interval; - } + thisdest = ( self.origin[0], self.origin[1], desiredz ); + } + + movevec = thisdest - self.origin; + idealaccel = vectorscale( thisdest - self.origin + vectorscale( self.vel, level.copter_accellookahead ), interval ); + vlen = veclength( idealaccel ); + + if ( vlen > level.copter_maxaccel ) + idealaccel = vectorscale( idealaccel, level.copter_maxaccel / vlen ); + + self.vel += idealaccel; + vlen = veclength( self.vel ); + + if ( vlen > level.copter_maxvel ) + self.vel = vectorscale( self.vel, level.copter_maxvel / vlen ); + + thisdest = self.origin + vectorscale( self.vel, interval ); + self moveto( thisdest, interval * 0.999 ); + speed = veclength( self.vel ); + + if ( isdefined( self.desireddirentity ) && isdefined( self.desireddirentity.origin ) ) + self.destdir = vectornormalize( self.desireddirentity.origin + self.desireddirentityoffset - self.origin + level.coptercenteroffset ); + else if ( isdefined( self.desireddir ) ) + self.destdir = self.desireddir; + else if ( movingvertically ) + { + self.destdir = anglestoforward( self.angles ); + self.destdir = vectornormalize( ( self.destdir[0], self.destdir[1], 0 ) ); + } + else + { + tiltamnt = speed / level.copter_maxvel; + tiltamnt = ( tiltamnt - 0.1 ) / 0.9; + + if ( tiltamnt < 0 ) + tiltamnt = 0; + + self.destdir = movevec; + self.destdir = vectornormalize( ( self.destdir[0], self.destdir[1], 0 ) ); + tiltamnt *= ( 1 - vectorangle( anglestoforward( self.angles ), self.destdir ) / 180 ); + self.destdir = vectornormalize( ( self.destdir[0], self.destdir[1], tiltamnt * -0.4 ) ); + } + + newdir = self.destdir; + + if ( newdir[2] < -0.4 ) + newdir = vectornormalize( ( newdir[0], newdir[1], -0.4 ) ); + + copterangles = self.angles; + copterangles = combineangles( copterangles, vectorscale( ( 0, 1, 0 ), 90.0 ) ); + olddir = anglestoforward( copterangles ); + thisrotspeed = level.copter_rotspeed; + olddir2d = vectornormalize( ( olddir[0], olddir[1], 0 ) ); + newdir2d = vectornormalize( ( newdir[0], newdir[1], 0 ) ); + angle = vectorangle( olddir2d, newdir2d ); + angle3d = vectorangle( olddir, newdir ); + + if ( angle > 0.001 && thisrotspeed > 0.001 ) + { + thisangle = thisrotspeed * interval; + + if ( thisangle > angle ) + thisangle = angle; + + newdir2d = vectortowardsothervector( olddir2d, newdir2d, thisangle ); + oldz = olddir[2] / veclength( ( olddir[0], olddir[1], 0 ) ); + newz = newdir[2] / veclength( ( newdir[0], newdir[1], 0 ) ); + interpz = oldz + ( newz - oldz ) * thisangle / angle; + newdir = vectornormalize( ( newdir2d[0], newdir2d[1], interpz ) ); + copterangles = vectortoangles( newdir ); + copterangles = combineangles( copterangles, vectorscale( ( 0, -1, 0 ), 90.0 ) ); + self rotateto( copterangles, interval * 0.999 ); + } + else if ( angle3d > 0.001 && thisrotspeed > 0.001 ) + { + thisangle = thisrotspeed * interval; + + if ( thisangle > angle3d ) + thisangle = angle3d; + + newdir = vectortowardsothervector( olddir, newdir, thisangle ); + newdir = vectornormalize( newdir ); + copterangles = vectortoangles( newdir ); + copterangles = combineangles( copterangles, vectorscale( ( 0, -1, 0 ), 90.0 ) ); + self rotateto( copterangles, interval * 0.999 ); + } + + wait( interval ); + } } copterdamage( damagetrig ) { - self endon( "passive" ); - while ( 1 ) - { - damagetrig waittill( "damage", amount, attacker ); - if ( isDefined( attacker ) && isplayer( attacker ) && isDefined( attacker.pers[ "team" ] ) && attacker.pers[ "team" ] == self.team ) - { - continue; - } - self.health -= amount; - if ( self.health <= 0 ) - { - self thread copterdie(); - return; - } - } + self endon( "passive" ); + + while ( true ) + { + damagetrig waittill( "damage", amount, attacker ); + + if ( isdefined( attacker ) && isplayer( attacker ) && isdefined( attacker.pers["team"] ) && attacker.pers["team"] == self.team ) + continue; + + self.health -= amount; + + if ( self.health <= 0 ) + { + self thread copterdie(); + return; + } + } } -copterdie() //checked changed to match cerberus output +copterdie() { - self endon( "passive" ); - self death_notify_wrapper(); - self.dead = 1; - self thread copterexplodefx(); - interval = 0.2; - rottime = 15; - self rotateyaw( 360 + randomfloat( 360 ), rottime ); - self rotatepitch( 360 + randomfloat( 360 ), rottime ); - self rotateroll( 360 + randomfloat( 360 ), rottime ); - while ( 1 ) - { - self.vel += vectorScale( vectorScale( ( 0, 0, -1 ), 200 ), interval ); - newpos = self.origin + vectorScale( self.vel, interval ); - pathclear = bullettracepassed( self.origin, newpos, 0, undefined ); - if ( !pathclear ) - { - break; - } - self moveto( newpos, interval * 0,999 ); - wait interval; - } - playfx( level.copterfinalexplosion, self.origin ); - fakeself = spawn( "script_origin", self.origin ); - fakeself playsound( "mp_copter_explosion" ); - self notify( "finaldeath" ); - deletecopter(); - wait 2; - fakeself delete(); + self endon( "passive" ); + self death_notify_wrapper(); + self.dead = 1; + self thread copterexplodefx(); + interval = 0.2; + rottime = 15; + self rotateyaw( 360 + randomfloat( 360 ), rottime ); + self rotatepitch( 360 + randomfloat( 360 ), rottime ); + self rotateroll( 360 + randomfloat( 360 ), rottime ); + + while ( true ) + { + self.vel += vectorscale( vectorscale( ( 0, 0, -1 ), 200.0 ), interval ); + newpos = self.origin + vectorscale( self.vel, interval ); + pathclear = bullettracepassed( self.origin, newpos, 0, undefined ); + + if ( !pathclear ) + break; + + self moveto( newpos, interval * 0.999 ); + wait( interval ); + } + + playfx( level.copterfinalexplosion, self.origin ); + fakeself = spawn( "script_origin", self.origin ); + fakeself playsound( "mp_copter_explosion" ); + self notify( "finaldeath" ); + deletecopter(); + wait 2; + fakeself delete(); } -deletecopter() //checked matches cerberus output +deletecopter() { - if ( isDefined( self.damagetrig ) ) - { - self.damagetrig notify( "unlink" ); - self.damagetrig = undefined; - } - self.copter delete(); - self delete(); + if ( isdefined( self.damagetrig ) ) + { + self.damagetrig notify( "unlink" ); + self.damagetrig = undefined; + } + + self.copter delete(); + self delete(); } -copterexplodefx() //checked matches cerberus output +copterexplodefx() { - self endon( "finaldeath" ); - while ( 1 ) - { - playfx( level.copterexplosion, self.origin ); - self playsound( "mp_copter_explosion" ); - wait ( 0.5 + randomfloat( 1 ) ); - } -} + self endon( "finaldeath" ); + while ( true ) + { + playfx( level.copterexplosion, self.origin ); + self playsound( "mp_copter_explosion" ); + wait( 0.5 + randomfloat( 1 ) ); + } +} diff --git a/Multiplayer Core/patch_mp/maps/mp/gametypes/_damagefeedback.gsc b/Multiplayer Core/patch_mp/maps/mp/gametypes/_damagefeedback.gsc index e16144a..8102f0a 100644 --- a/Multiplayer Core/patch_mp/maps/mp/gametypes/_damagefeedback.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/gametypes/_damagefeedback.gsc @@ -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; +} diff --git a/Multiplayer Core/patch_mp/maps/mp/gametypes/_deathicons.gsc b/Multiplayer Core/patch_mp/maps/mp/gametypes/_deathicons.gsc index 0bb7c2a..f7013a5 100644 --- a/Multiplayer Core/patch_mp/maps/mp/gametypes/_deathicons.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/gametypes/_deathicons.gsc @@ -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; +} diff --git a/Multiplayer Core/patch_mp/maps/mp/gametypes/_dev.gsc b/Multiplayer Core/patch_mp/maps/mp/gametypes/_dev.gsc index 0c8ba67..46066a9 100644 --- a/Multiplayer Core/patch_mp/maps/mp/gametypes/_dev.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/gametypes/_dev.gsc @@ -1,3566 +1,3301 @@ -#include maps/mp/bots/_bot; -#include maps/mp/killstreaks/_supplydrop; -#include maps/mp/killstreaks/_killstreakrules; -#include maps/mp/killstreaks/_radar; -#include maps/mp/killstreaks/_helicopter_gunner; -#include maps/mp/killstreaks/_helicopter; -#include maps/mp/gametypes/_killcam; -#include maps/mp/gametypes/_hud_message; -#include maps/mp/gametypes/_rank; -#include maps/mp/gametypes/_globallogic; -#include maps/mp/gametypes/_globallogic_utils; -#include maps/mp/killstreaks/_killstreaks; -#include maps/mp/gametypes/_globallogic_score; -#include maps/mp/gametypes/_dev_class; -#include maps/mp/_utility; -#include common_scripts/utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool init() { /# - if ( sessionmodeiszombiesgame() ) - { - for ( ;; ) - { - updatedevsettingszm(); - wait 0,5; - } - return; - } - if ( getDvar( "scr_showspawns" ) == "" ) - { - setdvar( "scr_showspawns", "0" ); - } - if ( getDvar( "scr_showstartspawns" ) == "" ) - { - setdvar( "scr_showstartspawns", "0" ); - } - if ( getDvar( "scr_botsHasPlayerWeapon" ) == "" ) - { - setdvar( "scr_botsHasPlayerWeapon", "0" ); - } - if ( getDvar( "scr_botsGrenadesOnly" ) == "" ) - { - setdvar( "scr_botsGrenadesOnly", "0" ); - } - if ( getDvar( "scr_botsSpecialGrenadesOnly" ) == "" ) - { - setdvar( "scr_botsSpecialGrenadesOnly", "0" ); - } - if ( getDvar( "scr_devHeliPathsDebugDraw" ) == "" ) - { - setdvar( "scr_devHeliPathsDebugDraw", "0" ); - } - if ( getDvar( "scr_devStrafeRunPathDebugDraw" ) == "" ) - { - setdvar( "scr_devStrafeRunPathDebugDraw", "0" ); - } - if ( getDvar( "scr_show_hq_spawns" ) == "" ) - { - setdvar( "scr_show_hq_spawns", "" ); - } - if ( getDvar( "scr_testScriptRuntimeError" ) == "" ) - { - setdvar( "scr_testScriptRuntimeError", "0" ); - } - precachemodel( "defaultactor" ); - precachestring( &"testPlayerScoreForTan" ); - thread testscriptruntimeerror(); - thread testdvars(); - thread addtestclients(); - thread addenemyheli(); - thread addenemyu2(); - thread addtestcarepackage(); - thread removetestclients(); - thread watch_botsdvars(); - thread devhelipathdebugdraw(); - thread devstraferunpathdebugdraw(); - thread maps/mp/gametypes/_dev_class::dev_cac_init(); - thread maps/mp/gametypes/_globallogic_score::setplayermomentumdebug(); - setdvar( "scr_giveperk", "" ); - setdvar( "scr_forceevent", "" ); - setdvar( "scr_draw_triggers", "0" ); - thread engagement_distance_debug_toggle(); - thread equipment_dev_gui(); - thread grenade_dev_gui(); - setdvar( "debug_dynamic_ai_spawning", "0" ); - level.bot_overlay = 0; - level.bot_threat = 0; - level.bot_path = 0; - level.dem_spawns = []; - while ( level.gametype == "dem" ) - { - extra_spawns = []; - extra_spawns[ 0 ] = "mp_dem_spawn_attacker_a"; - extra_spawns[ 1 ] = "mp_dem_spawn_attacker_b"; - extra_spawns[ 2 ] = "mp_dem_spawn_defender_a"; - extra_spawns[ 3 ] = "mp_dem_spawn_defender_b"; - i = 0; - while ( i < extra_spawns.size ) - { - points = getentarray( extra_spawns[ i ], "classname" ); - if ( isDefined( points ) && points.size > 0 ) - { - level.dem_spawns = arraycombine( level.dem_spawns, points, 1, 0 ); - } - i++; - } - } - thread onplayerconnect(); - for ( ;; ) - { - updatedevsettings(); - wait 0,5; + if ( sessionmodeiszombiesgame() ) + { + for (;;) + { + updatedevsettingszm(); + wait 0.5; + } + + return; + } + + if ( getdvar( "scr_showspawns" ) == "" ) + setdvar( "scr_showspawns", "0" ); + + if ( getdvar( "scr_showstartspawns" ) == "" ) + setdvar( "scr_showstartspawns", "0" ); + + if ( getdvar( "scr_botsHasPlayerWeapon" ) == "" ) + setdvar( "scr_botsHasPlayerWeapon", "0" ); + + if ( getdvar( "scr_botsGrenadesOnly" ) == "" ) + setdvar( "scr_botsGrenadesOnly", "0" ); + + if ( getdvar( "scr_botsSpecialGrenadesOnly" ) == "" ) + setdvar( "scr_botsSpecialGrenadesOnly", "0" ); + + if ( getdvar( "scr_devHeliPathsDebugDraw" ) == "" ) + setdvar( "scr_devHeliPathsDebugDraw", "0" ); + + if ( getdvar( "scr_devStrafeRunPathDebugDraw" ) == "" ) + setdvar( "scr_devStrafeRunPathDebugDraw", "0" ); + + if ( getdvar( "scr_show_hq_spawns" ) == "" ) + setdvar( "scr_show_hq_spawns", "" ); + + if ( getdvar( "scr_testScriptRuntimeError" ) == "" ) + setdvar( "scr_testScriptRuntimeError", "0" ); + + precachemodel( "defaultactor" ); + precachestring( &"testPlayerScoreForTan" ); + thread testscriptruntimeerror(); + thread testdvars(); + thread addtestclients(); + thread addenemyheli(); + thread addenemyu2(); + thread addtestcarepackage(); + thread removetestclients(); + thread watch_botsdvars(); + thread devhelipathdebugdraw(); + thread devstraferunpathdebugdraw(); + thread maps\mp\gametypes\_dev_class::dev_cac_init(); + thread maps\mp\gametypes\_globallogic_score::setplayermomentumdebug(); + setdvar( "scr_giveperk", "" ); + setdvar( "scr_forceevent", "" ); + setdvar( "scr_draw_triggers", "0" ); + thread engagement_distance_debug_toggle(); + thread equipment_dev_gui(); + thread grenade_dev_gui(); + setdvar( "debug_dynamic_ai_spawning", "0" ); + level.bot_overlay = 0; + level.bot_threat = 0; + level.bot_path = 0; + level.dem_spawns = []; + + if ( level.gametype == "dem" ) + { + extra_spawns = []; + extra_spawns[0] = "mp_dem_spawn_attacker_a"; + extra_spawns[1] = "mp_dem_spawn_attacker_b"; + extra_spawns[2] = "mp_dem_spawn_defender_a"; + extra_spawns[3] = "mp_dem_spawn_defender_b"; + + for ( i = 0; i < extra_spawns.size; i++ ) + { + points = getentarray( extra_spawns[i], "classname" ); + + if ( isdefined( points ) && points.size > 0 ) + level.dem_spawns = arraycombine( level.dem_spawns, points, 1, 0 ); + } + } + + thread onplayerconnect(); + + for (;;) + { + updatedevsettings(); + wait 0.5; + } #/ - } } onplayerconnect() { /# - for ( ;; ) - { - level waittill( "connecting", player ); + for (;;) + level waittill( "connecting", player ); #/ - } } updatehardpoints() { /# - keys = getarraykeys( level.killstreaks ); - i = 0; - while ( i < keys.size ) - { - if ( !isDefined( level.killstreaks[ keys[ i ] ].devdvar ) ) - { - i++; - continue; - } - else - { - dvar = level.killstreaks[ keys[ i ] ].devdvar; - if ( getDvarInt( dvar ) == 1 ) - { - _a148 = level.players; - _k148 = getFirstArrayKey( _a148 ); - while ( isDefined( _k148 ) ) - { - player = _a148[ _k148 ]; - if ( isDefined( level.usingmomentum ) && level.usingmomentum && isDefined( level.usingscorestreaks ) && level.usingscorestreaks ) - { - player maps/mp/killstreaks/_killstreaks::givekillstreak( keys[ i ] ); - } - else - { - if ( player is_bot() ) - { - player.bot[ "killstreaks" ] = []; - player.bot[ "killstreaks" ][ 0 ] = maps/mp/killstreaks/_killstreaks::getkillstreakmenuname( keys[ i ] ); - killstreakweapon = maps/mp/killstreaks/_killstreaks::getkillstreakweapon( keys[ i ] ); - player maps/mp/killstreaks/_killstreaks::givekillstreakweapon( killstreakweapon, 1 ); - maps/mp/gametypes/_globallogic_score::_setplayermomentum( player, 2000 ); - break; - } - else - { - player maps/mp/killstreaks/_killstreaks::givekillstreak( keys[ i ] ); - } - } - _k148 = getNextArrayKey( _a148, _k148 ); - } - setdvar( dvar, "0" ); - } - } - i++; + keys = getarraykeys( level.killstreaks ); + + for ( i = 0; i < keys.size; i++ ) + { + if ( !isdefined( level.killstreaks[keys[i]].devdvar ) ) + continue; + + dvar = level.killstreaks[keys[i]].devdvar; + + if ( getdvarint( dvar ) == 1 ) + { + foreach ( player in level.players ) + { + if ( isdefined( level.usingmomentum ) && level.usingmomentum && isdefined( level.usingscorestreaks ) && level.usingscorestreaks ) + { + player maps\mp\killstreaks\_killstreaks::givekillstreak( keys[i] ); + continue; + } + + if ( player is_bot() ) + { + player.bot["killstreaks"] = []; + player.bot["killstreaks"][0] = maps\mp\killstreaks\_killstreaks::getkillstreakmenuname( keys[i] ); + killstreakweapon = maps\mp\killstreaks\_killstreaks::getkillstreakweapon( keys[i] ); + player maps\mp\killstreaks\_killstreaks::givekillstreakweapon( killstreakweapon, 1 ); + maps\mp\gametypes\_globallogic_score::_setplayermomentum( player, 2000 ); + continue; + } + + player maps\mp\killstreaks\_killstreaks::givekillstreak( keys[i] ); + } + + setdvar( dvar, "0" ); + } + } #/ - } } warpalltohost( team ) { /# - host = gethostplayer(); - players = get_players(); - origin = host.origin; - nodes = getnodesinradius( origin, 128, 32, 128, "Path" ); - angles = host getplayerangles(); - yaw = ( 0, angles[ 1 ], 0 ); - forward = anglesToForward( yaw ); - spawn_origin = origin + ( forward * 128 ) + vectorScale( ( 0, 1, 0 ), 16 ); - if ( !bullettracepassed( host geteye(), spawn_origin, 0, host ) ) - { - spawn_origin = undefined; - } - i = 0; - while ( i < players.size ) - { - if ( players[ i ] == host ) - { - i++; - continue; - } - else if ( isDefined( team ) ) - { - if ( team == "enemies_host" && host.team == players[ i ].team ) - { - i++; - continue; - } - else - { - if ( team == "friendlies_host" && host.team != players[ i ].team ) - { - i++; - continue; - } - } - else - { - if ( isDefined( spawn_origin ) ) - { - players[ i ] setorigin( spawn_origin ); - i++; - continue; - } - else if ( nodes.size > 0 ) - { - node = random( nodes ); - players[ i ] setorigin( node.origin ); - i++; - continue; - } - else - { - players[ i ] setorigin( origin ); - } - } - } - i++; - } - setdvar( "scr_playerwarp", "" ); + host = gethostplayer(); + players = get_players(); + origin = host.origin; + nodes = getnodesinradius( origin, 128, 32, 128, "Path" ); + angles = host getplayerangles(); + yaw = ( 0.0, angles[1], 0.0 ); + forward = anglestoforward( yaw ); + spawn_origin = origin + forward * 128 + vectorscale( ( 0, 0, 1 ), 16.0 ); + + if ( !bullettracepassed( host geteye(), spawn_origin, 0, host ) ) + spawn_origin = undefined; + + for ( i = 0; i < players.size; i++ ) + { + if ( players[i] == host ) + continue; + + if ( isdefined( team ) ) + { + if ( team == "enemies_host" && host.team == players[i].team ) + continue; + + if ( team == "friendlies_host" && host.team != players[i].team ) + continue; + } + + if ( isdefined( spawn_origin ) ) + { + players[i] setorigin( spawn_origin ); + continue; + } + + if ( nodes.size > 0 ) + { + node = random( nodes ); + players[i] setorigin( node.origin ); + continue; + } + + players[i] setorigin( origin ); + } + + setdvar( "scr_playerwarp", "" ); #/ } updatedevsettingszm() { /# - if ( level.players.size > 0 ) - { - if ( getDvar( "r_streamDumpDistance" ) == "3" ) - { - if ( !isDefined( level.streamdumpteamindex ) ) - { - level.streamdumpteamindex = 0; - } - else - { - level.streamdumpteamindex++; - } - numpoints = 0; - spawnpoints = []; - location = level.scr_zm_map_start_location; - if ( location != "default" && location == "" && isDefined( level.default_start_location ) ) - { - location = level.default_start_location; - } - match_string = ( level.scr_zm_ui_gametype + "_" ) + location; - if ( level.streamdumpteamindex < level.teams.size ) - { - structs = getstructarray( "initial_spawn", "script_noteworthy" ); - while ( isDefined( structs ) ) - { - _a260 = structs; - _k260 = getFirstArrayKey( _a260 ); - while ( isDefined( _k260 ) ) - { - struct = _a260[ _k260 ]; - while ( isDefined( struct.script_string ) ) - { - tokens = strtok( struct.script_string, " " ); - _a265 = tokens; - _k265 = getFirstArrayKey( _a265 ); - while ( isDefined( _k265 ) ) - { - token = _a265[ _k265 ]; - if ( token == match_string ) - { - spawnpoints[ spawnpoints.size ] = struct; - } - _k265 = getNextArrayKey( _a265, _k265 ); - } - } - _k260 = getNextArrayKey( _a260, _k260 ); - } - } - if ( !isDefined( spawnpoints ) || spawnpoints.size == 0 ) - { - spawnpoints = getstructarray( "initial_spawn_points", "targetname" ); - } - if ( isDefined( spawnpoints ) ) - { - numpoints = spawnpoints.size; - } - } - if ( numpoints == 0 ) - { - setdvar( "r_streamDumpDistance", "0" ); - level.streamdumpteamindex = -1; - return; - } - else - { - averageorigin = ( 0, 1, 0 ); - averageangles = ( 0, 1, 0 ); - _a294 = spawnpoints; - _k294 = getFirstArrayKey( _a294 ); - while ( isDefined( _k294 ) ) - { - spawnpoint = _a294[ _k294 ]; - averageorigin += spawnpoint.origin / numpoints; - averageangles += spawnpoint.angles / numpoints; - _k294 = getNextArrayKey( _a294, _k294 ); - } - level.players[ 0 ] setplayerangles( averageangles ); - level.players[ 0 ] setorigin( averageorigin ); - wait 0,05; - setdvar( "r_streamDumpDistance", "2" ); + if ( level.players.size > 0 ) + { + if ( getdvar( "r_streamDumpDistance" ) == "3" ) + { + if ( !isdefined( level.streamdumpteamindex ) ) + level.streamdumpteamindex = 0; + else + level.streamdumpteamindex++; + + numpoints = 0; + spawnpoints = []; + location = level.scr_zm_map_start_location; + + if ( ( location == "default" || location == "" ) && isdefined( level.default_start_location ) ) + location = level.default_start_location; + + match_string = level.scr_zm_ui_gametype + "_" + location; + + if ( level.streamdumpteamindex < level.teams.size ) + { + structs = getstructarray( "initial_spawn", "script_noteworthy" ); + + if ( isdefined( structs ) ) + { + foreach ( struct in structs ) + { + if ( isdefined( struct.script_string ) ) + { + tokens = strtok( struct.script_string, " " ); + + foreach ( token in tokens ) + { + if ( token == match_string ) + spawnpoints[spawnpoints.size] = struct; + } + } + } + } + + if ( !isdefined( spawnpoints ) || spawnpoints.size == 0 ) + spawnpoints = getstructarray( "initial_spawn_points", "targetname" ); + + if ( isdefined( spawnpoints ) ) + numpoints = spawnpoints.size; + } + + if ( numpoints == 0 ) + { + setdvar( "r_streamDumpDistance", "0" ); + level.streamdumpteamindex = -1; + } + else + { + averageorigin = ( 0, 0, 0 ); + averageangles = ( 0, 0, 0 ); + + foreach ( spawnpoint in spawnpoints ) + { + averageorigin += spawnpoint.origin / numpoints; + averageangles += spawnpoint.angles / numpoints; + } + + level.players[0] setplayerangles( averageangles ); + level.players[0] setorigin( averageorigin ); + wait 0.05; + setdvar( "r_streamDumpDistance", "2" ); + } + } + } #/ - } - } - } } updatedevsettings() { /# - show_spawns = getDvarInt( "scr_showspawns" ); - show_start_spawns = getDvarInt( "scr_showstartspawns" ); - player = gethostplayer(); - if ( show_spawns >= 1 ) - { - show_spawns = 1; - } - else - { - show_spawns = 0; - } - if ( show_start_spawns >= 1 ) - { - show_start_spawns = 1; - } - else - { - show_start_spawns = 0; - } - if ( !isDefined( level.show_spawns ) || level.show_spawns != show_spawns ) - { - level.show_spawns = show_spawns; - setdvar( "scr_showspawns", level.show_spawns ); - if ( level.show_spawns ) - { - showspawnpoints(); - } - else - { - hidespawnpoints(); - } - } - if ( !isDefined( level.show_start_spawns ) || level.show_start_spawns != show_start_spawns ) - { - level.show_start_spawns = show_start_spawns; - setdvar( "scr_showstartspawns", level.show_start_spawns ); - if ( level.show_start_spawns ) - { - showstartspawnpoints(); - } - else - { - hidestartspawnpoints(); - } - } - updateminimapsetting(); - if ( level.players.size > 0 ) - { - updatehardpoints(); - if ( getDvar( "scr_playerwarp" ) == "host" ) - { - warpalltohost(); - } - else if ( getDvar( "scr_playerwarp" ) == "enemies_host" ) - { - warpalltohost( getDvar( "scr_playerwarp" ) ); - } - else if ( getDvar( "scr_playerwarp" ) == "friendlies_host" ) - { - warpalltohost( getDvar( "scr_playerwarp" ) ); - } - else if ( getDvar( "scr_playerwarp" ) == "next_start_spawn" ) - { - players = get_players(); - setdvar( "scr_playerwarp", "" ); - if ( !isDefined( level.devgui_start_spawn_index ) ) - { - level.devgui_start_spawn_index = 0; - } - player = gethostplayer(); - spawns = level.spawn_start[ player.pers[ "team" ] ]; - if ( !isDefined( spawns ) || spawns.size <= 0 ) - { - return; - } - i = 0; - while ( i < players.size ) - { - players[ i ] setorigin( spawns[ level.devgui_start_spawn_index ].origin ); - players[ i ] setplayerangles( spawns[ level.devgui_start_spawn_index ].angles ); - i++; - } - level.devgui_start_spawn_index++; - if ( level.devgui_start_spawn_index >= spawns.size ) - { - level.devgui_start_spawn_index = 0; - } - } - else if ( getDvar( "scr_playerwarp" ) == "prev_start_spawn" ) - { - players = get_players(); - setdvar( "scr_playerwarp", "" ); - if ( !isDefined( level.devgui_start_spawn_index ) ) - { - level.devgui_start_spawn_index = 0; - } - player = gethostplayer(); - spawns = level.spawn_start[ player.pers[ "team" ] ]; - if ( !isDefined( spawns ) || spawns.size <= 0 ) - { - return; - } - i = 0; - while ( i < players.size ) - { - players[ i ] setorigin( spawns[ level.devgui_start_spawn_index ].origin ); - players[ i ] setplayerangles( spawns[ level.devgui_start_spawn_index ].angles ); - i++; - } - level.devgui_start_spawn_index--; + show_spawns = getdvarint( "scr_showspawns" ); + show_start_spawns = getdvarint( "scr_showstartspawns" ); + player = gethostplayer(); - if ( level.devgui_start_spawn_index < 0 ) - { - level.devgui_start_spawn_index = spawns.size - 1; - } - } - else if ( getDvar( "scr_playerwarp" ) == "next_spawn" ) - { - players = get_players(); - setdvar( "scr_playerwarp", "" ); - if ( !isDefined( level.devgui_spawn_index ) ) - { - level.devgui_spawn_index = 0; - } - spawns = level.spawnpoints; - spawns = arraycombine( spawns, level.dem_spawns, 1, 0 ); - if ( !isDefined( spawns ) || spawns.size <= 0 ) - { - return; - } - i = 0; - while ( i < players.size ) - { - players[ i ] setorigin( spawns[ level.devgui_spawn_index ].origin ); - players[ i ] setplayerangles( spawns[ level.devgui_spawn_index ].angles ); - i++; - } - level.devgui_spawn_index++; - if ( level.devgui_spawn_index >= spawns.size ) - { - level.devgui_spawn_index = 0; - } - } - else if ( getDvar( "scr_playerwarp" ) == "prev_spawn" ) - { - players = get_players(); - setdvar( "scr_playerwarp", "" ); - if ( !isDefined( level.devgui_spawn_index ) ) - { - level.devgui_spawn_index = 0; - } - spawns = level.spawnpoints; - spawns = arraycombine( spawns, level.dem_spawns, 1, 0 ); - if ( !isDefined( spawns ) || spawns.size <= 0 ) - { - return; - } - i = 0; - while ( i < players.size ) - { - players[ i ] setorigin( spawns[ level.devgui_spawn_index ].origin ); - players[ i ] setplayerangles( spawns[ level.devgui_spawn_index ].angles ); - i++; - } - level.devgui_spawn_index--; + if ( show_spawns >= 1 ) + show_spawns = 1; + else + show_spawns = 0; - if ( level.devgui_spawn_index < 0 ) - { - level.devgui_spawn_index = spawns.size - 1; - } - } - else if ( getDvar( "scr_devgui_spawn" ) != "" ) - { - player = gethostplayer(); - if ( !isDefined( player.devgui_spawn_active ) ) - { - player.devgui_spawn_active = 0; - } - if ( !player.devgui_spawn_active ) - { - iprintln( "Previous spawn bound to D-Pad Left" ); - iprintln( "Next spawn bound to D-Pad Right" ); - player.devgui_spawn_active = 1; - player thread devgui_spawn_think(); - } - else - { - player notify( "devgui_spawn_think" ); - player.devgui_spawn_active = 0; - player setactionslot( 3, "altMode" ); - player setactionslot( 4, "nightvision" ); - } - setdvar( "scr_devgui_spawn", "" ); - } - else if ( getDvar( "scr_player_ammo" ) != "" ) - { - players = get_players(); - if ( !isDefined( level.devgui_unlimited_ammo ) ) - { - level.devgui_unlimited_ammo = 1; - } - else - { - level.devgui_unlimited_ammo = !level.devgui_unlimited_ammo; - } - if ( level.devgui_unlimited_ammo ) - { - iprintln( "Giving unlimited ammo to all players" ); - } - else - { - iprintln( "Stopping unlimited ammo for all players" ); - } - i = 0; - while ( i < players.size ) - { - if ( level.devgui_unlimited_ammo ) - { - players[ i ] thread devgui_unlimited_ammo(); - i++; - continue; - } - else - { - players[ i ] notify( "devgui_unlimited_ammo" ); - } - i++; - } - setdvar( "scr_player_ammo", "" ); - } - else if ( getDvar( "scr_player_momentum" ) != "" ) - { - if ( !isDefined( level.devgui_unlimited_momentum ) ) - { - level.devgui_unlimited_momentum = 1; - } - else - { - level.devgui_unlimited_momentum = !level.devgui_unlimited_momentum; - } - if ( level.devgui_unlimited_momentum ) - { - iprintln( "Giving unlimited momentum to all players" ); - level thread devgui_unlimited_momentum(); - } - else - { - iprintln( "Stopping unlimited momentum for all players" ); - level notify( "devgui_unlimited_momentum" ); - } - setdvar( "scr_player_momentum", "" ); - } - else if ( getDvar( "scr_give_player_score" ) != "" ) - { - level thread devgui_increase_momentum( getDvarInt( "scr_give_player_score" ) ); - setdvar( "scr_give_player_score", "" ); - } - else if ( getDvar( "scr_player_zero_ammo" ) != "" ) - { - players = get_players(); - i = 0; - while ( i < players.size ) - { - player = players[ i ]; - weapons = player getweaponslist(); - arrayremovevalue( weapons, "knife_mp" ); - j = 0; - while ( j < weapons.size ) - { - if ( weapons[ j ] == "none" ) - { - j++; - continue; - } - else - { - player setweaponammostock( weapons[ j ], 0 ); - player setweaponammoclip( weapons[ j ], 0 ); - } - j++; - } - i++; - } - setdvar( "scr_player_zero_ammo", "" ); - } - else if ( getDvar( "scr_emp_jammed" ) != "" ) - { - players = get_players(); - i = 0; - while ( i < players.size ) - { - player = players[ i ]; - if ( getDvar( "scr_emp_jammed" ) == "0" ) - { - player setempjammed( 0 ); - i++; - continue; - } - else - { - player setempjammed( 1 ); - } - i++; - } - setdvar( "scr_emp_jammed", "" ); - } - else if ( getDvar( "scr_round_pause" ) != "" ) - { - if ( !level.timerstopped ) - { - iprintln( "Pausing Round Timer" ); - maps/mp/gametypes/_globallogic_utils::pausetimer(); - } - else - { - iprintln( "Resuming Round Timer" ); - maps/mp/gametypes/_globallogic_utils::resumetimer(); - } - setdvar( "scr_round_pause", "" ); - } - else if ( getDvar( "scr_round_end" ) != "" ) - { - level maps/mp/gametypes/_globallogic::forceend(); - setdvar( "scr_round_end", "" ); - } - else if ( getDvar( "scr_health_debug" ) != "" ) - { - players = get_players(); - host = gethostplayer(); - if ( !isDefined( host.devgui_health_debug ) ) - { - host.devgui_health_debug = 0; - } - if ( host.devgui_health_debug ) - { - host.devgui_health_debug = 0; - i = 0; - while ( i < players.size ) - { - players[ i ] notify( "devgui_health_debug" ); - if ( isDefined( players[ i ].debug_health_bar ) ) - { - players[ i ].debug_health_bar destroy(); - players[ i ].debug_health_text destroy(); - players[ i ].debug_health_bar = undefined; - players[ i ].debug_health_text = undefined; - } - i++; - } - } - else host.devgui_health_debug = 1; - i = 0; - while ( i < players.size ) - { - players[ i ] thread devgui_health_debug(); - i++; - } - setdvar( "scr_health_debug", "" ); - } - else - { - if ( getDvar( "scr_show_hq_spawns" ) != "" ) - { - if ( !isDefined( level.devgui_show_hq ) ) - { - level.devgui_show_hq = 0; - } - if ( level.gametype == "koth" && isDefined( level.radios ) ) - { - if ( !level.devgui_show_hq ) - { - i = 0; - while ( i < level.radios.size ) - { - color = ( 0, 1, 0 ); - level showonespawnpoint( level.radios[ i ], color, "hide_hq_points", 32, "hq_spawn" ); - i++; - } - } - else level notify( "hide_hq_points" ); - level.devgui_show_hq = !level.devgui_show_hq; - } - setdvar( "scr_show_hq_spawns", "" ); - } - } - if ( getDvar( "r_streamDumpDistance" ) == "3" ) - { - if ( !isDefined( level.streamdumpteamindex ) ) - { - level.streamdumpteamindex = 0; - } - else - { - level.streamdumpteamindex++; - } - numpoints = 0; - if ( level.streamdumpteamindex < level.teams.size ) - { - teamname = getarraykeys( level.teams )[ level.streamdumpteamindex ]; - if ( isDefined( level.spawn_start[ teamname ] ) ) - { - numpoints = level.spawn_start[ teamname ].size; - } - } - if ( numpoints == 0 ) - { - setdvar( "r_streamDumpDistance", "0" ); - level.streamdumpteamindex = -1; - } - else - { - averageorigin = ( 0, 1, 0 ); - averageangles = ( 0, 1, 0 ); - _a761 = level.spawn_start[ teamname ]; - _k761 = getFirstArrayKey( _a761 ); - while ( isDefined( _k761 ) ) - { - spawnpoint = _a761[ _k761 ]; - averageorigin += spawnpoint.origin / numpoints; - averageangles += spawnpoint.angles / numpoints; - _k761 = getNextArrayKey( _a761, _k761 ); - } - level.players[ 0 ] setplayerangles( averageangles ); - level.players[ 0 ] setorigin( averageorigin ); - wait 0,05; - setdvar( "r_streamDumpDistance", "2" ); - } - } - } - if ( getDvar( "scr_giveperk" ) == "0" ) - { - players = get_players(); - iprintln( "Taking all perks from all players" ); - i = 0; - while ( i < players.size ) - { - players[ i ] clearperks(); - i++; - } - setdvar( "scr_giveperk", "" ); - } - if ( getDvar( "scr_giveperk" ) != "" ) - { - perk = getDvar( "scr_giveperk" ); - specialties = strtok( perk, "|" ); - players = get_players(); - iprintln( "Giving all players perk: '" + perk + "'" ); - i = 0; - while ( i < players.size ) - { - j = 0; - while ( j < specialties.size ) - { - players[ i ] setperk( specialties[ j ] ); - players[ i ].extraperks[ specialties[ j ] ] = 1; - j++; - } - i++; - } - setdvar( "scr_giveperk", "" ); - } - if ( getDvar( "scr_forcegrenade" ) != "" ) - { - force_grenade_throw( getDvar( "scr_forcegrenade" ) ); - setdvar( "scr_forcegrenade", "" ); - } - if ( getDvar( "scr_forceevent" ) != "" ) - { - event = getDvar( "scr_forceevent" ); - player = gethostplayer(); - forward = anglesToForward( player.angles ); - right = anglesToRight( player.angles ); - if ( event == "painfront" ) - { - player dodamage( 1, player.origin + forward ); - } - else if ( event == "painback" ) - { - player dodamage( 1, player.origin - forward ); - } - else if ( event == "painleft" ) - { - player dodamage( 1, player.origin - right ); - } - else - { - if ( event == "painright" ) - { - player dodamage( 1, player.origin + right ); - } - } - setdvar( "scr_forceevent", "" ); - } - if ( getDvar( "scr_takeperk" ) != "" ) - { - perk = getDvar( "scr_takeperk" ); - i = 0; - while ( i < level.players.size ) - { - level.players[ i ] unsetperk( perk ); - i++; - } - setdvar( "scr_takeperk", "" ); - } - if ( getDvar( "scr_x_kills_y" ) != "" ) - { - nametokens = strtok( getDvar( "scr_x_kills_y" ), " " ); - if ( nametokens.size > 1 ) - { - thread xkillsy( nametokens[ 0 ], nametokens[ 1 ] ); - } - setdvar( "scr_x_kills_y", "" ); - } - if ( getDvar( "scr_usedogs" ) != "" ) - { - ownername = getDvar( "scr_usedogs" ); - setdvar( "scr_usedogs", "" ); - owner = undefined; - index = 0; - while ( index < level.players.size ) - { - if ( level.players[ index ].name == ownername ) - { - owner = level.players[ index ]; - } - index++; - } - if ( isDefined( owner ) ) - { - owner maps/mp/killstreaks/_killstreaks::triggerkillstreak( "dogs_mp" ); - } - } - while ( getDvar( "scr_set_level" ) != "" ) - { - player.pers[ "rank" ] = 0; - player.pers[ "rankxp" ] = 0; - newrank = min( getDvarInt( "scr_set_level" ), 54 ); - newrank = max( newrank, 1 ); - setdvar( "scr_set_level", "" ); - lastxp = 0; - index = 0; - while ( index <= newrank ) - { - newxp = maps/mp/gametypes/_rank::getrankinfominxp( index ); - player thread maps/mp/gametypes/_rank::giverankxp( "kill", newxp - lastxp ); - lastxp = newxp; - wait 0,25; - self notify( "cancel_notify" ); - index++; - } - } - if ( getDvar( "scr_givexp" ) != "" ) - { - player thread maps/mp/gametypes/_rank::giverankxp( "challenge", getDvarInt( "scr_givexp" ), 1 ); - setdvar( "scr_givexp", "" ); - } - if ( getDvar( "scr_do_notify" ) != "" ) - { - i = 0; - while ( i < level.players.size ) - { - level.players[ i ] maps/mp/gametypes/_hud_message::oldnotifymessage( getDvar( "scr_do_notify" ), getDvar( "scr_do_notify" ), game[ "icons" ][ "allies" ] ); - i++; - } - announcement( getDvar( "scr_do_notify" ), 0 ); - setdvar( "scr_do_notify", "" ); - } - while ( getDvar( #"4F1284FA" ) != "" ) - { - ents = getentarray(); - level.entarray = []; - level.entcounts = []; - level.entgroups = []; - index = 0; - while ( index < ents.size ) - { - classname = ents[ index ].classname; - if ( !issubstr( classname, "_spawn" ) ) - { - curent = ents[ index ]; - level.entarray[ level.entarray.size ] = curent; - if ( !isDefined( level.entcounts[ classname ] ) ) - { - level.entcounts[ classname ] = 0; - } - level.entcounts[ classname ]++; - if ( !isDefined( level.entgroups[ classname ] ) ) - { - level.entgroups[ classname ] = []; - } - level.entgroups[ classname ][ level.entgroups[ classname ].size ] = curent; - } - index++; - } - } - if ( getDvar( "debug_dynamic_ai_spawning" ) == "1" && !isDefined( level.larry ) ) - { - thread larry_thread(); - } - else - { - if ( getDvar( "debug_dynamic_ai_spawning" ) == "0" ) - { - level notify( "kill_larry" ); - } - } - if ( level.bot_overlay == 0 && getDvarInt( #"1CBC4852" ) == 1 ) - { - level thread bot_overlay_think(); - level.bot_overlay = 1; - } - else - { - if ( level.bot_overlay == 1 && getDvarInt( #"1CBC4852" ) == 0 ) - { - level bot_overlay_stop(); - level.bot_overlay = 0; - } - } - if ( level.bot_threat == 0 && getDvarInt( #"68A98D18" ) == 1 ) - { - level thread bot_threat_think(); - level.bot_threat = 1; - } - else - { - if ( level.bot_threat == 1 && getDvarInt( #"68A98D18" ) == 0 ) - { - level bot_threat_stop(); - level.bot_threat = 0; - } - } - if ( level.bot_path == 0 && getDvarInt( #"D6F2CC5D" ) == 1 ) - { - level thread bot_path_think(); - level.bot_path = 1; - } - else - { - if ( level.bot_path == 1 && getDvarInt( #"D6F2CC5D" ) == 0 ) - { - level bot_path_stop(); - level.bot_path = 0; - } - } - if ( getDvarInt( "scr_force_finalkillcam" ) == 1 ) - { - level thread maps/mp/gametypes/_killcam::dofinalkillcam(); - level thread waitthennotifyfinalkillcam(); - } - if ( getDvarInt( "scr_force_roundkillcam" ) == 1 ) - { - level thread maps/mp/gametypes/_killcam::dofinalkillcam(); - level thread waitthennotifyroundkillcam(); - } - if ( !level.bot_overlay && !level.bot_threat && !level.bot_path ) - { - level notify( "bot_dpad_terminate" ); + if ( show_start_spawns >= 1 ) + show_start_spawns = 1; + else + show_start_spawns = 0; + + if ( !isdefined( level.show_spawns ) || level.show_spawns != show_spawns ) + { + level.show_spawns = show_spawns; + setdvar( "scr_showspawns", level.show_spawns ); + + if ( level.show_spawns ) + showspawnpoints(); + else + hidespawnpoints(); + } + + if ( !isdefined( level.show_start_spawns ) || level.show_start_spawns != show_start_spawns ) + { + level.show_start_spawns = show_start_spawns; + setdvar( "scr_showstartspawns", level.show_start_spawns ); + + if ( level.show_start_spawns ) + showstartspawnpoints(); + else + hidestartspawnpoints(); + } + + updateminimapsetting(); + + if ( level.players.size > 0 ) + { + updatehardpoints(); + + if ( getdvar( "scr_playerwarp" ) == "host" ) + warpalltohost(); + else if ( getdvar( "scr_playerwarp" ) == "enemies_host" ) + warpalltohost( getdvar( "scr_playerwarp" ) ); + else if ( getdvar( "scr_playerwarp" ) == "friendlies_host" ) + warpalltohost( getdvar( "scr_playerwarp" ) ); + else if ( getdvar( "scr_playerwarp" ) == "next_start_spawn" ) + { + players = get_players(); + setdvar( "scr_playerwarp", "" ); + + if ( !isdefined( level.devgui_start_spawn_index ) ) + level.devgui_start_spawn_index = 0; + + player = gethostplayer(); + spawns = level.spawn_start[player.pers["team"]]; + + if ( !isdefined( spawns ) || spawns.size <= 0 ) + return; + + for ( i = 0; i < players.size; i++ ) + { + players[i] setorigin( spawns[level.devgui_start_spawn_index].origin ); + players[i] setplayerangles( spawns[level.devgui_start_spawn_index].angles ); + } + + level.devgui_start_spawn_index++; + + if ( level.devgui_start_spawn_index >= spawns.size ) + level.devgui_start_spawn_index = 0; + } + else if ( getdvar( "scr_playerwarp" ) == "prev_start_spawn" ) + { + players = get_players(); + setdvar( "scr_playerwarp", "" ); + + if ( !isdefined( level.devgui_start_spawn_index ) ) + level.devgui_start_spawn_index = 0; + + player = gethostplayer(); + spawns = level.spawn_start[player.pers["team"]]; + + if ( !isdefined( spawns ) || spawns.size <= 0 ) + return; + + for ( i = 0; i < players.size; i++ ) + { + players[i] setorigin( spawns[level.devgui_start_spawn_index].origin ); + players[i] setplayerangles( spawns[level.devgui_start_spawn_index].angles ); + } + + level.devgui_start_spawn_index--; + + if ( level.devgui_start_spawn_index < 0 ) + level.devgui_start_spawn_index = spawns.size - 1; + } + else if ( getdvar( "scr_playerwarp" ) == "next_spawn" ) + { + players = get_players(); + setdvar( "scr_playerwarp", "" ); + + if ( !isdefined( level.devgui_spawn_index ) ) + level.devgui_spawn_index = 0; + + spawns = level.spawnpoints; + spawns = arraycombine( spawns, level.dem_spawns, 1, 0 ); + + if ( !isdefined( spawns ) || spawns.size <= 0 ) + return; + + for ( i = 0; i < players.size; i++ ) + { + players[i] setorigin( spawns[level.devgui_spawn_index].origin ); + players[i] setplayerangles( spawns[level.devgui_spawn_index].angles ); + } + + level.devgui_spawn_index++; + + if ( level.devgui_spawn_index >= spawns.size ) + level.devgui_spawn_index = 0; + } + else if ( getdvar( "scr_playerwarp" ) == "prev_spawn" ) + { + players = get_players(); + setdvar( "scr_playerwarp", "" ); + + if ( !isdefined( level.devgui_spawn_index ) ) + level.devgui_spawn_index = 0; + + spawns = level.spawnpoints; + spawns = arraycombine( spawns, level.dem_spawns, 1, 0 ); + + if ( !isdefined( spawns ) || spawns.size <= 0 ) + return; + + for ( i = 0; i < players.size; i++ ) + { + players[i] setorigin( spawns[level.devgui_spawn_index].origin ); + players[i] setplayerangles( spawns[level.devgui_spawn_index].angles ); + } + + level.devgui_spawn_index--; + + if ( level.devgui_spawn_index < 0 ) + level.devgui_spawn_index = spawns.size - 1; + } + else if ( getdvar( "scr_devgui_spawn" ) != "" ) + { + player = gethostplayer(); + + if ( !isdefined( player.devgui_spawn_active ) ) + player.devgui_spawn_active = 0; + + if ( !player.devgui_spawn_active ) + { + iprintln( "Previous spawn bound to D-Pad Left" ); + iprintln( "Next spawn bound to D-Pad Right" ); + player.devgui_spawn_active = 1; + player thread devgui_spawn_think(); + } + else + { + player notify( "devgui_spawn_think" ); + player.devgui_spawn_active = 0; + player setactionslot( 3, "altMode" ); + player setactionslot( 4, "nightvision" ); + } + + setdvar( "scr_devgui_spawn", "" ); + } + else if ( getdvar( "scr_player_ammo" ) != "" ) + { + players = get_players(); + + if ( !isdefined( level.devgui_unlimited_ammo ) ) + level.devgui_unlimited_ammo = 1; + else + level.devgui_unlimited_ammo = !level.devgui_unlimited_ammo; + + if ( level.devgui_unlimited_ammo ) + iprintln( "Giving unlimited ammo to all players" ); + else + iprintln( "Stopping unlimited ammo for all players" ); + + for ( i = 0; i < players.size; i++ ) + { + if ( level.devgui_unlimited_ammo ) + { + players[i] thread devgui_unlimited_ammo(); + continue; + } + + players[i] notify( "devgui_unlimited_ammo" ); + } + + setdvar( "scr_player_ammo", "" ); + } + else if ( getdvar( "scr_player_momentum" ) != "" ) + { + if ( !isdefined( level.devgui_unlimited_momentum ) ) + level.devgui_unlimited_momentum = 1; + else + level.devgui_unlimited_momentum = !level.devgui_unlimited_momentum; + + if ( level.devgui_unlimited_momentum ) + { + iprintln( "Giving unlimited momentum to all players" ); + level thread devgui_unlimited_momentum(); + } + else + { + iprintln( "Stopping unlimited momentum for all players" ); + level notify( "devgui_unlimited_momentum" ); + } + + setdvar( "scr_player_momentum", "" ); + } + else if ( getdvar( "scr_give_player_score" ) != "" ) + { + level thread devgui_increase_momentum( getdvarint( "scr_give_player_score" ) ); + setdvar( "scr_give_player_score", "" ); + } + else if ( getdvar( "scr_player_zero_ammo" ) != "" ) + { + players = get_players(); + + for ( i = 0; i < players.size; i++ ) + { + player = players[i]; + weapons = player getweaponslist(); + arrayremovevalue( weapons, "knife_mp" ); + + for ( j = 0; j < weapons.size; j++ ) + { + if ( weapons[j] == "none" ) + continue; + + player setweaponammostock( weapons[j], 0 ); + player setweaponammoclip( weapons[j], 0 ); + } + } + + setdvar( "scr_player_zero_ammo", "" ); + } + else if ( getdvar( "scr_emp_jammed" ) != "" ) + { + players = get_players(); + + for ( i = 0; i < players.size; i++ ) + { + player = players[i]; + + if ( getdvar( "scr_emp_jammed" ) == "0" ) + { + player setempjammed( 0 ); + continue; + } + + player setempjammed( 1 ); + } + + setdvar( "scr_emp_jammed", "" ); + } + else if ( getdvar( "scr_round_pause" ) != "" ) + { + if ( !level.timerstopped ) + { + iprintln( "Pausing Round Timer" ); + maps\mp\gametypes\_globallogic_utils::pausetimer(); + } + else + { + iprintln( "Resuming Round Timer" ); + maps\mp\gametypes\_globallogic_utils::resumetimer(); + } + + setdvar( "scr_round_pause", "" ); + } + else if ( getdvar( "scr_round_end" ) != "" ) + { + level maps\mp\gametypes\_globallogic::forceend(); + setdvar( "scr_round_end", "" ); + } + else if ( getdvar( "scr_health_debug" ) != "" ) + { + players = get_players(); + host = gethostplayer(); + + if ( !isdefined( host.devgui_health_debug ) ) + host.devgui_health_debug = 0; + + if ( host.devgui_health_debug ) + { + host.devgui_health_debug = 0; + + for ( i = 0; i < players.size; i++ ) + { + players[i] notify( "devgui_health_debug" ); + + if ( isdefined( players[i].debug_health_bar ) ) + { + players[i].debug_health_bar destroy(); + players[i].debug_health_text destroy(); + players[i].debug_health_bar = undefined; + players[i].debug_health_text = undefined; + } + } + } + else + { + host.devgui_health_debug = 1; + + for ( i = 0; i < players.size; i++ ) + players[i] thread devgui_health_debug(); + } + + setdvar( "scr_health_debug", "" ); + } + else if ( getdvar( "scr_show_hq_spawns" ) != "" ) + { + if ( !isdefined( level.devgui_show_hq ) ) + level.devgui_show_hq = 0; + + if ( level.gametype == "koth" && isdefined( level.radios ) ) + { + if ( !level.devgui_show_hq ) + { + for ( i = 0; i < level.radios.size; i++ ) + { + color = ( 1, 0, 0 ); + level showonespawnpoint( level.radios[i], color, "hide_hq_points", 32, "hq_spawn" ); + } + } + else + level notify( "hide_hq_points" ); + + level.devgui_show_hq = !level.devgui_show_hq; + } + + setdvar( "scr_show_hq_spawns", "" ); + } + + if ( getdvar( "r_streamDumpDistance" ) == "3" ) + { + if ( !isdefined( level.streamdumpteamindex ) ) + level.streamdumpteamindex = 0; + else + level.streamdumpteamindex++; + + numpoints = 0; + + if ( level.streamdumpteamindex < level.teams.size ) + { + teamname = getarraykeys( level.teams )[level.streamdumpteamindex]; + + if ( isdefined( level.spawn_start[teamname] ) ) + numpoints = level.spawn_start[teamname].size; + } + + if ( numpoints == 0 ) + { + setdvar( "r_streamDumpDistance", "0" ); + level.streamdumpteamindex = -1; + } + else + { + averageorigin = ( 0, 0, 0 ); + averageangles = ( 0, 0, 0 ); + + foreach ( spawnpoint in level.spawn_start[teamname] ) + { + averageorigin += spawnpoint.origin / numpoints; + averageangles += spawnpoint.angles / numpoints; + } + + level.players[0] setplayerangles( averageangles ); + level.players[0] setorigin( averageorigin ); + wait 0.05; + setdvar( "r_streamDumpDistance", "2" ); + } + } + } + + if ( getdvar( "scr_giveperk" ) == "0" ) + { + players = get_players(); + iprintln( "Taking all perks from all players" ); + + for ( i = 0; i < players.size; i++ ) + players[i] clearperks(); + + setdvar( "scr_giveperk", "" ); + } + + if ( getdvar( "scr_giveperk" ) != "" ) + { + perk = getdvar( "scr_giveperk" ); + specialties = strtok( perk, "|" ); + players = get_players(); + iprintln( "Giving all players perk: '" + perk + "'" ); + + for ( i = 0; i < players.size; i++ ) + { + for ( j = 0; j < specialties.size; j++ ) + { + players[i] setperk( specialties[j] ); + players[i].extraperks[specialties[j]] = 1; + } + } + + setdvar( "scr_giveperk", "" ); + } + + if ( getdvar( "scr_forcegrenade" ) != "" ) + { + force_grenade_throw( getdvar( "scr_forcegrenade" ) ); + setdvar( "scr_forcegrenade", "" ); + } + + if ( getdvar( "scr_forceevent" ) != "" ) + { + event = getdvar( "scr_forceevent" ); + player = gethostplayer(); + forward = anglestoforward( player.angles ); + right = anglestoright( player.angles ); + + if ( event == "painfront" ) + player dodamage( 1, player.origin + forward ); + else if ( event == "painback" ) + player dodamage( 1, player.origin - forward ); + else if ( event == "painleft" ) + player dodamage( 1, player.origin - right ); + else if ( event == "painright" ) + player dodamage( 1, player.origin + right ); + + setdvar( "scr_forceevent", "" ); + } + + if ( getdvar( "scr_takeperk" ) != "" ) + { + perk = getdvar( "scr_takeperk" ); + + for ( i = 0; i < level.players.size; i++ ) + { + level.players[i] unsetperk( perk ); + level.players[i].extraperks[perk] = undefined; + } + + setdvar( "scr_takeperk", "" ); + } + + if ( getdvar( "scr_x_kills_y" ) != "" ) + { + nametokens = strtok( getdvar( "scr_x_kills_y" ), " " ); + + if ( nametokens.size > 1 ) + thread xkillsy( nametokens[0], nametokens[1] ); + + setdvar( "scr_x_kills_y", "" ); + } + + if ( getdvar( "scr_usedogs" ) != "" ) + { + ownername = getdvar( "scr_usedogs" ); + setdvar( "scr_usedogs", "" ); + owner = undefined; + + for ( index = 0; index < level.players.size; index++ ) + { + if ( level.players[index].name == ownername ) + owner = level.players[index]; + } + + if ( isdefined( owner ) ) + owner maps\mp\killstreaks\_killstreaks::triggerkillstreak( "dogs_mp" ); + } + + if ( getdvar( "scr_set_level" ) != "" ) + { + player.pers["rank"] = 0; + player.pers["rankxp"] = 0; + newrank = min( getdvarint( "scr_set_level" ), 54 ); + newrank = max( newrank, 1 ); + setdvar( "scr_set_level", "" ); + lastxp = 0; + + for ( index = 0; index <= newrank; index++ ) + { + newxp = maps\mp\gametypes\_rank::getrankinfominxp( index ); + player thread maps\mp\gametypes\_rank::giverankxp( "kill", newxp - lastxp ); + lastxp = newxp; + wait 0.25; + self notify( "cancel_notify" ); + } + } + + if ( getdvar( "scr_givexp" ) != "" ) + { + player thread maps\mp\gametypes\_rank::giverankxp( "challenge", getdvarint( "scr_givexp" ), 1 ); + setdvar( "scr_givexp", "" ); + } + + if ( getdvar( "scr_do_notify" ) != "" ) + { + for ( i = 0; i < level.players.size; i++ ) + level.players[i] maps\mp\gametypes\_hud_message::oldnotifymessage( getdvar( "scr_do_notify" ), getdvar( "scr_do_notify" ), game["icons"]["allies"] ); + + announcement( getdvar( "scr_do_notify" ), 0 ); + setdvar( "scr_do_notify", "" ); + } + + if ( getdvar( _hash_4F1284FA ) != "" ) + { + ents = getentarray(); + level.entarray = []; + level.entcounts = []; + level.entgroups = []; + + for ( index = 0; index < ents.size; index++ ) + { + classname = ents[index].classname; + + if ( !issubstr( classname, "_spawn" ) ) + { + curent = ents[index]; + level.entarray[level.entarray.size] = curent; + + if ( !isdefined( level.entcounts[classname] ) ) + level.entcounts[classname] = 0; + + level.entcounts[classname]++; + + if ( !isdefined( level.entgroups[classname] ) ) + level.entgroups[classname] = []; + + level.entgroups[classname][level.entgroups[classname].size] = curent; + } + } + } + + if ( getdvar( "debug_dynamic_ai_spawning" ) == "1" && !isdefined( level.larry ) ) + thread larry_thread(); + else if ( getdvar( "debug_dynamic_ai_spawning" ) == "0" ) + level notify( "kill_larry" ); + + if ( level.bot_overlay == 0 && getdvarint( _hash_1CBC4852 ) == 1 ) + { + level thread bot_overlay_think(); + level.bot_overlay = 1; + } + else if ( level.bot_overlay == 1 && getdvarint( _hash_1CBC4852 ) == 0 ) + { + level bot_overlay_stop(); + level.bot_overlay = 0; + } + + if ( level.bot_threat == 0 && getdvarint( _hash_68A98D18 ) == 1 ) + { + level thread bot_threat_think(); + level.bot_threat = 1; + } + else if ( level.bot_threat == 1 && getdvarint( _hash_68A98D18 ) == 0 ) + { + level bot_threat_stop(); + level.bot_threat = 0; + } + + if ( level.bot_path == 0 && getdvarint( _hash_D6F2CC5D ) == 1 ) + { + level thread bot_path_think(); + level.bot_path = 1; + } + else if ( level.bot_path == 1 && getdvarint( _hash_D6F2CC5D ) == 0 ) + { + level bot_path_stop(); + level.bot_path = 0; + } + + if ( getdvarint( "scr_force_finalkillcam" ) == 1 ) + { + level thread maps\mp\gametypes\_killcam::dofinalkillcam(); + level thread waitthennotifyfinalkillcam(); + } + + if ( getdvarint( "scr_force_roundkillcam" ) == 1 ) + { + level thread maps\mp\gametypes\_killcam::dofinalkillcam(); + level thread waitthennotifyroundkillcam(); + } + + if ( !level.bot_overlay && !level.bot_threat && !level.bot_path ) + level notify( "bot_dpad_terminate" ); #/ - } } waitthennotifyroundkillcam() { /# - wait 0,05; - level notify( "play_final_killcam" ); - setdvar( "scr_force_roundkillcam", 0 ); + wait 0.05; + level notify( "play_final_killcam" ); + setdvar( "scr_force_roundkillcam", 0 ); #/ } waitthennotifyfinalkillcam() { /# - wait 0,05; - level notify( "play_final_killcam" ); - wait 0,05; - setdvar( "scr_force_finalkillcam", 0 ); + wait 0.05; + level notify( "play_final_killcam" ); + wait 0.05; + setdvar( "scr_force_finalkillcam", 0 ); #/ } devgui_spawn_think() { /# - self notify( "devgui_spawn_think" ); - self endon( "devgui_spawn_think" ); - self endon( "disconnect" ); - dpad_left = 0; - dpad_right = 0; - for ( ;; ) - { - self setactionslot( 3, "" ); - self setactionslot( 4, "" ); - if ( !dpad_left && self buttonpressed( "DPAD_LEFT" ) ) - { - setdvar( "scr_playerwarp", "prev_spawn" ); - dpad_left = 1; - } - else - { - if ( !self buttonpressed( "DPAD_LEFT" ) ) - { - dpad_left = 0; - } - } - if ( !dpad_right && self buttonpressed( "DPAD_RIGHT" ) ) - { - setdvar( "scr_playerwarp", "next_spawn" ); - dpad_right = 1; - } - else - { - if ( !self buttonpressed( "DPAD_RIGHT" ) ) - { - dpad_right = 0; - } - } - wait 0,05; + self notify( "devgui_spawn_think" ); + self endon( "devgui_spawn_think" ); + self endon( "disconnect" ); + dpad_left = 0; + dpad_right = 0; + + for (;;) + { + self setactionslot( 3, "" ); + self setactionslot( 4, "" ); + + if ( !dpad_left && self buttonpressed( "DPAD_LEFT" ) ) + { + setdvar( "scr_playerwarp", "prev_spawn" ); + dpad_left = 1; + } + else if ( !self buttonpressed( "DPAD_LEFT" ) ) + dpad_left = 0; + + if ( !dpad_right && self buttonpressed( "DPAD_RIGHT" ) ) + { + setdvar( "scr_playerwarp", "next_spawn" ); + dpad_right = 1; + } + else if ( !self buttonpressed( "DPAD_RIGHT" ) ) + dpad_right = 0; + + wait 0.05; + } #/ - } } devgui_unlimited_ammo() { /# - self notify( "devgui_unlimited_ammo" ); - self endon( "devgui_unlimited_ammo" ); - self endon( "disconnect" ); - for ( ;; ) - { - wait 0,1; - weapons = []; - weapons[ 0 ] = self getcurrentweapon(); - weapons[ 1 ] = self getcurrentoffhand(); - i = 0; - while ( i < weapons.size ) - { - if ( weapons[ i ] == "none" ) - { - i++; - continue; - } - else if ( maps/mp/killstreaks/_killstreaks::iskillstreakweapon( weapons[ i ] ) ) - { - i++; - continue; - } - else - { - self givemaxammo( weapons[ i ] ); - } - i++; - } + self notify( "devgui_unlimited_ammo" ); + self endon( "devgui_unlimited_ammo" ); + self endon( "disconnect" ); + + for (;;) + { + wait 0.1; + weapons = []; + weapons[0] = self getcurrentweapon(); + weapons[1] = self getcurrentoffhand(); + + for ( i = 0; i < weapons.size; i++ ) + { + if ( weapons[i] == "none" ) + continue; + + if ( maps\mp\killstreaks\_killstreaks::iskillstreakweapon( weapons[i] ) ) + continue; + + self givemaxammo( weapons[i] ); + } + } #/ - } } devgui_unlimited_momentum() { /# - level notify( "devgui_unlimited_momentum" ); - level endon( "devgui_unlimited_momentum" ); - for ( ;; ) - { - wait 1; - players = get_players(); - _a1088 = players; - _k1088 = getFirstArrayKey( _a1088 ); - while ( isDefined( _k1088 ) ) - { - player = _a1088[ _k1088 ]; - if ( !isDefined( player ) ) - { - } - else if ( !isalive( player ) ) - { - } - else if ( player.sessionstate != "playing" ) - { - } - else - { - maps/mp/gametypes/_globallogic_score::_setplayermomentum( player, 5000 ); - } - _k1088 = getNextArrayKey( _a1088, _k1088 ); - } + level notify( "devgui_unlimited_momentum" ); + level endon( "devgui_unlimited_momentum" ); + + for (;;) + { + wait 1; + players = get_players(); + + foreach ( player in players ) + { + if ( !isdefined( player ) ) + continue; + + if ( !isalive( player ) ) + continue; + + if ( player.sessionstate != "playing" ) + continue; + + maps\mp\gametypes\_globallogic_score::_setplayermomentum( player, 5000 ); + } + } #/ - } } devgui_increase_momentum( score ) { /# - players = get_players(); - _a1114 = players; - _k1114 = getFirstArrayKey( _a1114 ); - while ( isDefined( _k1114 ) ) - { - player = _a1114[ _k1114 ]; - if ( !isDefined( player ) ) - { - } - else if ( !isalive( player ) ) - { - } - else if ( player.sessionstate != "playing" ) - { - } - else - { - player maps/mp/gametypes/_globallogic_score::giveplayermomentumnotification( score, &"testPlayerScoreForTan", "PLAYER_SCORE", 0 ); - } - _k1114 = getNextArrayKey( _a1114, _k1114 ); + players = get_players(); + + foreach ( player in players ) + { + if ( !isdefined( player ) ) + continue; + + if ( !isalive( player ) ) + continue; + + if ( player.sessionstate != "playing" ) + continue; + + player maps\mp\gametypes\_globallogic_score::giveplayermomentumnotification( score, &"testPlayerScoreForTan", "PLAYER_SCORE", 0 ); + } #/ - } } devgui_health_debug() { /# - self notify( "devgui_health_debug" ); - self endon( "devgui_health_debug" ); - self endon( "disconnect" ); - x = 80; - y = 40; - self.debug_health_bar = newclienthudelem( self ); - self.debug_health_bar.x = x + 80; - self.debug_health_bar.y = y + 2; - self.debug_health_bar.alignx = "left"; - self.debug_health_bar.aligny = "top"; - self.debug_health_bar.horzalign = "fullscreen"; - self.debug_health_bar.vertalign = "fullscreen"; - self.debug_health_bar.alpha = 1; - self.debug_health_bar.foreground = 1; - self.debug_health_bar setshader( "black", 1, 8 ); - self.debug_health_text = newclienthudelem( self ); - self.debug_health_text.x = x + 80; - self.debug_health_text.y = y; - self.debug_health_text.alignx = "left"; - self.debug_health_text.aligny = "top"; - self.debug_health_text.horzalign = "fullscreen"; - self.debug_health_text.vertalign = "fullscreen"; - self.debug_health_text.alpha = 1; - self.debug_health_text.fontscale = 1; - self.debug_health_text.foreground = 1; - if ( !isDefined( self.maxhealth ) || self.maxhealth <= 0 ) - { - self.maxhealth = 100; - } - for ( ;; ) - { - wait 0,05; - width = ( self.health / self.maxhealth ) * 300; - width = int( max( width, 1 ) ); - self.debug_health_bar setshader( "black", width, 8 ); - self.debug_health_text setvalue( self.health ); + self notify( "devgui_health_debug" ); + self endon( "devgui_health_debug" ); + self endon( "disconnect" ); + x = 80; + y = 40; + self.debug_health_bar = newclienthudelem( self ); + self.debug_health_bar.x = x + 80; + self.debug_health_bar.y = y + 2; + self.debug_health_bar.alignx = "left"; + self.debug_health_bar.aligny = "top"; + self.debug_health_bar.horzalign = "fullscreen"; + self.debug_health_bar.vertalign = "fullscreen"; + self.debug_health_bar.alpha = 1; + self.debug_health_bar.foreground = 1; + self.debug_health_bar setshader( "black", 1, 8 ); + self.debug_health_text = newclienthudelem( self ); + self.debug_health_text.x = x + 80; + self.debug_health_text.y = y; + self.debug_health_text.alignx = "left"; + self.debug_health_text.aligny = "top"; + self.debug_health_text.horzalign = "fullscreen"; + self.debug_health_text.vertalign = "fullscreen"; + self.debug_health_text.alpha = 1; + self.debug_health_text.fontscale = 1; + self.debug_health_text.foreground = 1; + + if ( !isdefined( self.maxhealth ) || self.maxhealth <= 0 ) + self.maxhealth = 100; + + for (;;) + { + wait 0.05; + width = self.health / self.maxhealth * 300; + width = int( max( width, 1 ) ); + self.debug_health_bar setshader( "black", width, 8 ); + self.debug_health_text setvalue( self.health ); + } #/ - } } giveextraperks() { /# - if ( !isDefined( self.extraperks ) ) - { - return; - } - perks = getarraykeys( self.extraperks ); - i = 0; - while ( i < perks.size ) - { - self setperk( perks[ i ] ); - i++; + if ( !isdefined( self.extraperks ) ) + return; + + perks = getarraykeys( self.extraperks ); + + for ( i = 0; i < perks.size; i++ ) + self setperk( perks[i] ); #/ - } } xkillsy( attackername, victimname ) { /# - attacker = undefined; - victim = undefined; - index = 0; - while ( index < level.players.size ) - { - if ( level.players[ index ].name == attackername ) - { - attacker = level.players[ index ]; - index++; - continue; - } - else - { - if ( level.players[ index ].name == victimname ) - { - victim = level.players[ index ]; - } - } - index++; - } - if ( !isalive( attacker ) || !isalive( victim ) ) - { - return; - } - victim thread [[ level.callbackplayerdamage ]]( attacker, attacker, 1000, 0, "MOD_RIFLE_BULLET", "none", ( 0, 1, 0 ), ( 0, 1, 0 ), "none", 0, 0 ); + attacker = undefined; + victim = undefined; + + for ( index = 0; index < level.players.size; index++ ) + { + if ( level.players[index].name == attackername ) + { + attacker = level.players[index]; + continue; + } + + if ( level.players[index].name == victimname ) + victim = level.players[index]; + } + + if ( !isalive( attacker ) || !isalive( victim ) ) + return; + + victim thread [[ level.callbackplayerdamage ]]( attacker, attacker, 1000, 0, "MOD_RIFLE_BULLET", "none", ( 0, 0, 0 ), ( 0, 0, 0 ), "none", 0, 0 ); #/ } updateminimapsetting() { /# - requiredmapaspectratio = getDvarFloat( "scr_RequiredMapAspectratio" ); - if ( !isDefined( level.minimapheight ) ) - { - setdvar( "scr_minimap_height", "0" ); - level.minimapheight = 0; - } - minimapheight = getDvarFloat( "scr_minimap_height" ); - if ( minimapheight != level.minimapheight ) - { - if ( minimapheight <= 0 ) - { - gethostplayer() cameraactivate( 0 ); - level.minimapheight = minimapheight; - level notify( "end_draw_map_bounds" ); - } - if ( minimapheight > 0 ) - { - level.minimapheight = minimapheight; - players = get_players(); - if ( players.size > 0 ) - { - player = gethostplayer(); - corners = getentarray( "minimap_corner", "targetname" ); - if ( corners.size == 2 ) - { - viewpos = corners[ 0 ].origin + corners[ 1 ].origin; - viewpos = ( viewpos[ 0 ] * 0,5, viewpos[ 1 ] * 0,5, viewpos[ 2 ] * 0,5 ); - level thread minimapwarn( corners ); - maxcorner = ( corners[ 0 ].origin[ 0 ], corners[ 0 ].origin[ 1 ], viewpos[ 2 ] ); - mincorner = ( corners[ 0 ].origin[ 0 ], corners[ 0 ].origin[ 1 ], viewpos[ 2 ] ); - if ( corners[ 1 ].origin[ 0 ] > corners[ 0 ].origin[ 0 ] ) - { - maxcorner = ( corners[ 1 ].origin[ 0 ], maxcorner[ 1 ], maxcorner[ 2 ] ); - } - else - { - mincorner = ( corners[ 1 ].origin[ 0 ], mincorner[ 1 ], mincorner[ 2 ] ); - } - if ( corners[ 1 ].origin[ 1 ] > corners[ 0 ].origin[ 1 ] ) - { - maxcorner = ( maxcorner[ 0 ], corners[ 1 ].origin[ 1 ], maxcorner[ 2 ] ); - } - else - { - mincorner = ( mincorner[ 0 ], corners[ 1 ].origin[ 1 ], mincorner[ 2 ] ); - } - viewpostocorner = maxcorner - viewpos; - viewpos = ( viewpos[ 0 ], viewpos[ 1 ], viewpos[ 2 ] + minimapheight ); - northvector = ( cos( getnorthyaw() ), sin( getnorthyaw() ), 0 ); - eastvector = ( northvector[ 1 ], 0 - northvector[ 0 ], 0 ); - disttotop = vectordot( northvector, viewpostocorner ); - if ( disttotop < 0 ) - { - disttotop = 0 - disttotop; - } - disttoside = vectordot( eastvector, viewpostocorner ); - if ( disttoside < 0 ) - { - disttoside = 0 - disttoside; - } - if ( requiredmapaspectratio > 0 ) - { - mapaspectratio = disttoside / disttotop; - if ( mapaspectratio < requiredmapaspectratio ) - { - incr = requiredmapaspectratio / mapaspectratio; - disttoside *= incr; - addvec = vecscale( eastvector, vectordot( eastvector, maxcorner - viewpos ) * ( incr - 1 ) ); - mincorner -= addvec; - maxcorner += addvec; - } - else - { - incr = mapaspectratio / requiredmapaspectratio; - disttotop *= incr; - addvec = vecscale( northvector, vectordot( northvector, maxcorner - viewpos ) * ( incr - 1 ) ); - mincorner -= addvec; - maxcorner += addvec; - } - } - if ( level.console ) - { - aspectratioguess = 1,777778; - angleside = 2 * atan( ( disttoside * 0,8 ) / minimapheight ); - angletop = 2 * atan( ( disttotop * aspectratioguess * 0,8 ) / minimapheight ); - } - else - { - aspectratioguess = 1,333333; - angleside = 2 * atan( disttoside / minimapheight ); - angletop = 2 * atan( ( disttotop * aspectratioguess ) / minimapheight ); - } - if ( angleside > angletop ) - { - angle = angleside; - } - else - { - angle = angletop; - } - znear = minimapheight - 1000; - if ( znear < 16 ) - { - znear = 16; - } - if ( znear > 10000 ) - { - znear = 10000; - } - player camerasetposition( viewpos, ( 90, getnorthyaw(), 0 ) ); - player cameraactivate( 1 ); - player takeallweapons(); - setdvar( "cg_drawGun", 0 ); - setdvar( "cg_draw2D", 0 ); - setdvar( "cg_drawFPS", 0 ); - setdvar( "fx_enable", 0 ); - setdvar( "r_fog", 0 ); - setdvar( "r_highLodDist", 0 ); - setdvar( "r_znear", znear ); - setdvar( "r_lodscale", 0 ); - setdvar( "r_lodScaleRigid", 0 ); - setdvar( "cg_drawVersion", 0 ); - setdvar( "sm_enable", 1 ); - setdvar( "player_view_pitch_down", 90 ); - setdvar( "player_view_pitch_up", 0 ); - setdvar( "cg_fov", angle ); - setdvar( "cg_fovMin", 1 ); - setdvar( "debug_show_viewpos", "0" ); - if ( isDefined( level.objpoints ) ) - { - i = 0; - while ( i < level.objpointnames.size ) - { - if ( isDefined( level.objpoints[ level.objpointnames[ i ] ] ) ) - { - level.objpoints[ level.objpointnames[ i ] ] destroy(); - } - i++; - } - level.objpoints = []; - level.objpointnames = []; - } - thread drawminimapbounds( viewpos, mincorner, maxcorner ); - } - else - { - println( "^1Error: There are not exactly 2 "minimap_corner" entities in the level." ); - } - return; - } - else - { - setdvar( "scr_minimap_height", "0" ); + requiredmapaspectratio = getdvarfloat( "scr_RequiredMapAspectratio" ); + + if ( !isdefined( level.minimapheight ) ) + { + setdvar( "scr_minimap_height", "0" ); + level.minimapheight = 0; + } + + minimapheight = getdvarfloat( "scr_minimap_height" ); + + if ( minimapheight != level.minimapheight ) + { + if ( minimapheight <= 0 ) + { + gethostplayer() cameraactivate( 0 ); + level.minimapheight = minimapheight; + level notify( "end_draw_map_bounds" ); + } + + if ( minimapheight > 0 ) + { + level.minimapheight = minimapheight; + players = get_players(); + + if ( players.size > 0 ) + { + player = gethostplayer(); + corners = getentarray( "minimap_corner", "targetname" ); + + if ( corners.size == 2 ) + { + viewpos = corners[0].origin + corners[1].origin; + viewpos = ( viewpos[0] * 0.5, viewpos[1] * 0.5, viewpos[2] * 0.5 ); + level thread minimapwarn( corners ); + maxcorner = ( corners[0].origin[0], corners[0].origin[1], viewpos[2] ); + mincorner = ( corners[0].origin[0], corners[0].origin[1], viewpos[2] ); + + if ( corners[1].origin[0] > corners[0].origin[0] ) + maxcorner = ( corners[1].origin[0], maxcorner[1], maxcorner[2] ); + else + mincorner = ( corners[1].origin[0], mincorner[1], mincorner[2] ); + + if ( corners[1].origin[1] > corners[0].origin[1] ) + maxcorner = ( maxcorner[0], corners[1].origin[1], maxcorner[2] ); + else + mincorner = ( mincorner[0], corners[1].origin[1], mincorner[2] ); + + viewpostocorner = maxcorner - viewpos; + viewpos = ( viewpos[0], viewpos[1], viewpos[2] + minimapheight ); + northvector = ( cos( getnorthyaw() ), sin( getnorthyaw() ), 0 ); + eastvector = ( northvector[1], 0 - northvector[0], 0 ); + disttotop = vectordot( northvector, viewpostocorner ); + + if ( disttotop < 0 ) + disttotop = 0 - disttotop; + + disttoside = vectordot( eastvector, viewpostocorner ); + + if ( disttoside < 0 ) + disttoside = 0 - disttoside; + + if ( requiredmapaspectratio > 0 ) + { + mapaspectratio = disttoside / disttotop; + + if ( mapaspectratio < requiredmapaspectratio ) + { + incr = requiredmapaspectratio / mapaspectratio; + disttoside *= incr; + addvec = vecscale( eastvector, vectordot( eastvector, maxcorner - viewpos ) * ( incr - 1 ) ); + mincorner -= addvec; + maxcorner += addvec; + } + else + { + incr = mapaspectratio / requiredmapaspectratio; + disttotop *= incr; + addvec = vecscale( northvector, vectordot( northvector, maxcorner - viewpos ) * ( incr - 1 ) ); + mincorner -= addvec; + maxcorner += addvec; + } + } + + if ( level.console ) + { + aspectratioguess = 1.77778; + angleside = 2 * atan( disttoside * 0.8 / minimapheight ); + angletop = 2 * atan( disttotop * aspectratioguess * 0.8 / minimapheight ); + } + else + { + aspectratioguess = 1.33333; + angleside = 2 * atan( disttoside / minimapheight ); + angletop = 2 * atan( disttotop * aspectratioguess / minimapheight ); + } + + if ( angleside > angletop ) + angle = angleside; + else + angle = angletop; + + znear = minimapheight - 1000; + + if ( znear < 16 ) + znear = 16; + + if ( znear > 10000 ) + znear = 10000; + + player camerasetposition( viewpos, ( 90, getnorthyaw(), 0 ) ); + player cameraactivate( 1 ); + player takeallweapons(); + setdvar( "cg_drawGun", 0 ); + setdvar( "cg_draw2D", 0 ); + setdvar( "cg_drawFPS", 0 ); + setdvar( "fx_enable", 0 ); + setdvar( "r_fog", 0 ); + setdvar( "r_highLodDist", 0 ); + setdvar( "r_znear", znear ); + setdvar( "r_lodscale", 0 ); + setdvar( "r_lodScaleRigid", 0 ); + setdvar( "cg_drawVersion", 0 ); + setdvar( "sm_enable", 1 ); + setdvar( "player_view_pitch_down", 90 ); + setdvar( "player_view_pitch_up", 0 ); + setdvar( "cg_fov", angle ); + setdvar( "cg_fovMin", 1 ); + setdvar( "debug_show_viewpos", "0" ); + + if ( isdefined( level.objpoints ) ) + { + for ( i = 0; i < level.objpointnames.size; i++ ) + { + if ( isdefined( level.objpoints[level.objpointnames[i]] ) ) + level.objpoints[level.objpointnames[i]] destroy(); + } + + level.objpoints = []; + level.objpointnames = []; + } + + thread drawminimapbounds( viewpos, mincorner, maxcorner ); + } + else + println( "^1Error: There are not exactly 2 \"minimap_corner\" entities in the level." ); + } + else + setdvar( "scr_minimap_height", "0" ); + } + } #/ - } - } - } } vecscale( vec, scalar ) { /# - return ( vec[ 0 ] * scalar, vec[ 1 ] * scalar, vec[ 2 ] * scalar ); + return ( vec[0] * scalar, vec[1] * scalar, vec[2] * scalar ); #/ } drawminimapbounds( viewpos, mincorner, maxcorner ) { /# - level notify( "end_draw_map_bounds" ); - level endon( "end_draw_map_bounds" ); - viewheight = viewpos[ 2 ] - maxcorner[ 2 ]; - north = ( cos( getnorthyaw() ), sin( getnorthyaw() ), 0 ); - diaglen = length( mincorner - maxcorner ); - mincorneroffset = mincorner - viewpos; - mincorneroffset = vectornormalize( ( mincorneroffset[ 0 ], mincorneroffset[ 1 ], 0 ) ); - mincorner += vecscale( mincorneroffset, ( diaglen * 1 ) / 800 ); - maxcorneroffset = maxcorner - viewpos; - maxcorneroffset = vectornormalize( ( maxcorneroffset[ 0 ], maxcorneroffset[ 1 ], 0 ) ); - maxcorner += vecscale( maxcorneroffset, ( diaglen * 1 ) / 800 ); - diagonal = maxcorner - mincorner; - side = vecscale( north, vectordot( diagonal, north ) ); - sidenorth = vecscale( north, abs( vectordot( diagonal, north ) ) ); - corner0 = mincorner; - corner1 = mincorner + side; - corner2 = maxcorner; - corner3 = maxcorner - side; - toppos = vecscale( mincorner + maxcorner, 0,5 ) + vecscale( sidenorth, 0,51 ); - textscale = diaglen * 0,003; - while ( 1 ) - { - line( corner0, corner1 ); - line( corner1, corner2 ); - line( corner2, corner3 ); - line( corner3, corner0 ); - print3d( toppos, "This Side Up", ( 0, 1, 0 ), 1, textscale ); - wait 0,05; + level notify( "end_draw_map_bounds" ); + level endon( "end_draw_map_bounds" ); + viewheight = viewpos[2] - maxcorner[2]; + north = ( cos( getnorthyaw() ), sin( getnorthyaw() ), 0 ); + diaglen = length( mincorner - maxcorner ); + mincorneroffset = mincorner - viewpos; + mincorneroffset = vectornormalize( ( mincorneroffset[0], mincorneroffset[1], 0 ) ); + mincorner += vecscale( mincorneroffset, diaglen * 1 / 800 ); + maxcorneroffset = maxcorner - viewpos; + maxcorneroffset = vectornormalize( ( maxcorneroffset[0], maxcorneroffset[1], 0 ) ); + maxcorner += vecscale( maxcorneroffset, diaglen * 1 / 800 ); + diagonal = maxcorner - mincorner; + side = vecscale( north, vectordot( diagonal, north ) ); + sidenorth = vecscale( north, abs( vectordot( diagonal, north ) ) ); + corner0 = mincorner; + corner1 = mincorner + side; + corner2 = maxcorner; + corner3 = maxcorner - side; + toppos = vecscale( mincorner + maxcorner, 0.5 ) + vecscale( sidenorth, 0.51 ); + textscale = diaglen * 0.003; + + while ( true ) + { + line( corner0, corner1 ); + line( corner1, corner2 ); + line( corner2, corner3 ); + line( corner3, corner0 ); + print3d( toppos, "This Side Up", ( 1, 1, 1 ), 1, textscale ); + wait 0.05; + } #/ - } } minimapwarn( corners ) { /# - threshold = 10; - width = abs( corners[ 0 ].origin[ 0 ] - corners[ 1 ].origin[ 0 ] ); - width = int( width ); - height = abs( corners[ 0 ].origin[ 1 ] - corners[ 1 ].origin[ 1 ] ); - height = int( height ); - while ( abs( width - height ) > threshold ) - { - for ( ;; ) - { - iprintln( "^1Warning: Minimap corners do not form a square (width: " + width + " height: " + height + ")\n" ); - if ( height > width ) - { - scale = height / width; - iprintln( "^1Warning: The compass minimap might be scaled: " + scale + " units in height more than width\n" ); - } - else - { - scale = width / height; - iprintln( "^1Warning: The compass minimap might be scaled: " + scale + " units in width more than height\n" ); - } - wait 10; + threshold = 10; + width = abs( corners[0].origin[0] - corners[1].origin[0] ); + width = int( width ); + height = abs( corners[0].origin[1] - corners[1].origin[1] ); + height = int( height ); + + if ( abs( width - height ) > threshold ) + { + for (;;) + { + iprintln( "^1Warning: Minimap corners do not form a square (width: " + width + " height: " + height + ")\n" ); + + if ( height > width ) + { + scale = height / width; + iprintln( "^1Warning: The compass minimap might be scaled: " + scale + " units in height more than width\n" ); + } + else + { + scale = width / height; + iprintln( "^1Warning: The compass minimap might be scaled: " + scale + " units in width more than height\n" ); + } + + wait 10; + } + } #/ - } - } } testscriptruntimeerrorassert() { /# - wait 1; - assert( 0 ); + wait 1; + assert( 0 ); #/ } testscriptruntimeerror2() { /# - myundefined = "test"; - if ( myundefined == 1 ) - { - println( "undefined in testScriptRuntimeError2\n" ); + myundefined = "test"; + + if ( myundefined == 1 ) + println( "undefined in testScriptRuntimeError2\n" ); #/ - } } testscriptruntimeerror1() { /# - testscriptruntimeerror2(); + testscriptruntimeerror2(); #/ } testscriptruntimeerror() { /# - wait 5; - for ( ;; ) - { - if ( getDvar( "scr_testScriptRuntimeError" ) != "0" ) - { - break; - } - else - { - wait 1; - } - } - myerror = getDvar( "scr_testScriptRuntimeError" ); - setdvar( "scr_testScriptRuntimeError", "0" ); - if ( myerror == "assert" ) - { - testscriptruntimeerrorassert(); - } - else - { - testscriptruntimeerror1(); - } - thread testscriptruntimeerror(); + wait 5; + + for (;;) + { + if ( getdvar( "scr_testScriptRuntimeError" ) != "0" ) + break; + + wait 1; + } + + myerror = getdvar( "scr_testScriptRuntimeError" ); + setdvar( "scr_testScriptRuntimeError", "0" ); + + if ( myerror == "assert" ) + testscriptruntimeerrorassert(); + else + testscriptruntimeerror1(); + + thread testscriptruntimeerror(); #/ } testdvars() { /# - wait 5; - for ( ;; ) - { - if ( getDvar( "scr_testdvar" ) != "" ) - { - break; - } - else - { - wait 1; - } - } - tokens = strtok( getDvar( "scr_testdvar" ), " " ); - dvarname = tokens[ 0 ]; - dvarvalue = tokens[ 1 ]; - setdvar( dvarname, dvarvalue ); - setdvar( "scr_testdvar", "" ); - thread testdvars(); + wait 5; + + for (;;) + { + if ( getdvar( "scr_testdvar" ) != "" ) + break; + + wait 1; + } + + tokens = strtok( getdvar( "scr_testdvar" ), " " ); + dvarname = tokens[0]; + dvarvalue = tokens[1]; + setdvar( dvarname, dvarvalue ); + setdvar( "scr_testdvar", "" ); + thread testdvars(); #/ } addtestclients() { /# - wait 5; - for ( ;; ) - { - if ( getDvarInt( "scr_testclients" ) > 0 ) - { - break; - } - else - { - wait 1; - } - } - playsoundonplayers( "vox_kls_dav_spawn" ); - testclients = getDvarInt( "scr_testclients" ); - setdvar( "scr_testclients", 0 ); - i = 0; - while ( i < testclients ) - { - ent[ i ] = addtestclient(); - if ( !isDefined( ent[ i ] ) ) - { - println( "Could not add test client" ); - wait 1; - i++; - continue; - } - else - { - ent[ i ].pers[ "isBot" ] = 1; - ent[ i ] thread testclient( "autoassign" ); - } - i++; - } - thread addtestclients(); + wait 5; + + for (;;) + { + if ( getdvarint( "scr_testclients" ) > 0 ) + break; + + wait 1; + } + + playsoundonplayers( "vox_kls_dav_spawn" ); + testclients = getdvarint( "scr_testclients" ); + setdvar( "scr_testclients", 0 ); + + for ( i = 0; i < testclients; i++ ) + { + ent[i] = addtestclient(); + + if ( !isdefined( ent[i] ) ) + { + println( "Could not add test client" ); + wait 1; + continue; + } + + ent[i].pers["isBot"] = 1; + ent[i] thread testclient( "autoassign" ); + } + + thread addtestclients(); #/ } addenemyheli() { /# - wait 5; - for ( ;; ) - { - if ( getDvarInt( "scr_spawnenemyheli" ) > 0 ) - { - break; - } - else - { - wait 1; - } - } - enemyheli = getDvarInt( "scr_spawnenemyheli" ); - setdvar( "scr_spawnenemyheli", 0 ); - team = "autoassign"; - player = gethostplayer(); - if ( isDefined( player.pers[ "team" ] ) ) - { - team = getotherteam( player.pers[ "team" ] ); - } - ent = getormakebot( team ); - if ( !isDefined( ent ) ) - { - println( "Could not add test client" ); - wait 1; - thread addenemyheli(); - return; - } - switch( enemyheli ) - { - case 1: - level.helilocation = ent.origin; - ent thread maps/mp/killstreaks/_helicopter::usekillstreakhelicopter( "helicopter_comlink_mp" ); - wait 0,5; - ent notify( "confirm_location" ); - break; - case 2: - ent thread maps/mp/killstreaks/_helicopter_gunner::heli_gunner_killstreak( "helicopter_player_gunner_mp" ); - break; - } - thread addenemyheli(); + wait 5; + + for (;;) + { + if ( getdvarint( "scr_spawnenemyheli" ) > 0 ) + break; + + wait 1; + } + + enemyheli = getdvarint( "scr_spawnenemyheli" ); + setdvar( "scr_spawnenemyheli", 0 ); + team = "autoassign"; + player = gethostplayer(); + + if ( isdefined( player.pers["team"] ) ) + team = getotherteam( player.pers["team"] ); + + ent = getormakebot( team ); + + if ( !isdefined( ent ) ) + { + println( "Could not add test client" ); + wait 1; + thread addenemyheli(); + return; + } + + switch ( enemyheli ) + { + case 1: + level.helilocation = ent.origin; + ent thread maps\mp\killstreaks\_helicopter::usekillstreakhelicopter( "helicopter_comlink_mp" ); + wait 0.5; + ent notify( "confirm_location", level.helilocation ); + break; + case 2: + ent thread maps\mp\killstreaks\_helicopter_gunner::heli_gunner_killstreak( "helicopter_player_gunner_mp" ); + break; + } + + thread addenemyheli(); #/ } getormakebot( team ) { /# - i = 0; - while ( i < level.players.size ) - { - if ( level.players[ i ].team == team ) - { - if ( isDefined( level.players[ i ].pers[ "isBot" ] ) && level.players[ i ].pers[ "isBot" ] ) - { - return level.players[ i ]; - } - } - i++; - } - ent = addtestclient(); - if ( isDefined( ent ) ) - { - playsoundonplayers( "vox_kls_dav_spawn" ); - ent.pers[ "isBot" ] = 1; - ent thread testclient( team ); - wait 1; - } - return ent; + for ( i = 0; i < level.players.size; i++ ) + { + if ( level.players[i].team == team ) + { + if ( isdefined( level.players[i].pers["isBot"] ) && level.players[i].pers["isBot"] ) + return level.players[i]; + } + } + + ent = addtestclient(); + + if ( isdefined( ent ) ) + { + playsoundonplayers( "vox_kls_dav_spawn" ); + ent.pers["isBot"] = 1; + ent thread testclient( team ); + wait 1; + } + + return ent; #/ } addenemyu2() { /# - wait 5; - for ( ;; ) - { - if ( getDvarInt( "scr_spawnenemyu2" ) > 0 ) - { - break; - } - else - { - wait 1; - } - } - type = getDvarInt( "scr_spawnenemyu2" ); - setdvar( "scr_spawnenemyu2", 0 ); - team = "autoassign"; - player = gethostplayer(); - if ( isDefined( player.team ) ) - { - team = getotherteam( player.team ); - } - ent = getormakebot( team ); - if ( !isDefined( ent ) ) - { - println( "Could not add test client" ); - wait 1; - thread addenemyu2(); - return; - } - if ( type == 3 ) - { - ent thread maps/mp/killstreaks/_radar::usekillstreaksatellite( "radardirection_mp" ); - } - else if ( type == 2 ) - { - ent thread maps/mp/killstreaks/_radar::usekillstreakcounteruav( "counteruav_mp" ); - } - else - { - ent thread maps/mp/killstreaks/_radar::usekillstreakradar( "radar_mp" ); - } - thread addenemyu2(); + wait 5; + + for (;;) + { + if ( getdvarint( "scr_spawnenemyu2" ) > 0 ) + break; + + wait 1; + } + + type = getdvarint( "scr_spawnenemyu2" ); + setdvar( "scr_spawnenemyu2", 0 ); + team = "autoassign"; + player = gethostplayer(); + + if ( isdefined( player.team ) ) + team = getotherteam( player.team ); + + ent = getormakebot( team ); + + if ( !isdefined( ent ) ) + { + println( "Could not add test client" ); + wait 1; + thread addenemyu2(); + return; + } + + if ( type == 3 ) + ent thread maps\mp\killstreaks\_radar::usekillstreaksatellite( "radardirection_mp" ); + else if ( type == 2 ) + ent thread maps\mp\killstreaks\_radar::usekillstreakcounteruav( "counteruav_mp" ); + else + ent thread maps\mp\killstreaks\_radar::usekillstreakradar( "radar_mp" ); + + thread addenemyu2(); #/ } addtestcarepackage() { /# - wait 5; - for ( ;; ) - { - if ( getDvarInt( "scr_givetestsupplydrop" ) > 0 ) - { - break; - } - else - { - wait 1; - } - } - supplydrop = getDvarInt( "scr_givetestsupplydrop" ); - team = "autoassign"; - player = gethostplayer(); - if ( isDefined( player.pers[ "team" ] ) ) - { - switch( supplydrop ) - { - case 2: - team = getotherteam( player.pers[ "team" ] ); - break; - case 1: - default: - team = player.pers[ "team" ]; - break; - } - } - setdvar( "scr_givetestsupplydrop", 0 ); - ent = getormakebot( team ); - if ( !isDefined( ent ) ) - { - println( "Could not add test client" ); - wait 1; - thread addtestcarepackage(); - return; - } - ent maps/mp/killstreaks/_killstreakrules::killstreakstart( "supply_drop_mp", team ); - ent thread maps/mp/killstreaks/_supplydrop::helidelivercrate( ent.origin, "supplydrop_mp", ent, team ); - thread addtestcarepackage(); + wait 5; + + for (;;) + { + if ( getdvarint( "scr_givetestsupplydrop" ) > 0 ) + break; + + wait 1; + } + + supplydrop = getdvarint( "scr_givetestsupplydrop" ); + team = "autoassign"; + player = gethostplayer(); + + if ( isdefined( player.pers["team"] ) ) + { + switch ( supplydrop ) + { + case 2: + team = getotherteam( player.pers["team"] ); + break; + case 1: + default: + team = player.pers["team"]; + break; + } + } + + setdvar( "scr_givetestsupplydrop", 0 ); + ent = getormakebot( team ); + + if ( !isdefined( ent ) ) + { + println( "Could not add test client" ); + wait 1; + thread addtestcarepackage(); + return; + } + + ent maps\mp\killstreaks\_killstreakrules::killstreakstart( "supply_drop_mp", team ); + ent thread maps\mp\killstreaks\_supplydrop::helidelivercrate( ent.origin, "supplydrop_mp", ent, team ); + thread addtestcarepackage(); #/ } removetestclients() { /# - wait 5; - for ( ;; ) - { - if ( getDvarInt( "scr_testclientsremove" ) > 0 ) - { - break; - } - else - { - wait 1; - } - } - playsoundonplayers( "vox_kls_dav_kill" ); - removetype = getDvarInt( "scr_testclientsremove" ); - setdvar( "scr_testclientsremove", 0 ); - host = gethostplayer(); - players = level.players; - i = 0; - while ( i < players.size ) - { - if ( isDefined( players[ i ].pers[ "isBot" ] ) && players[ i ].pers[ "isBot" ] == 1 ) - { - if ( removetype == 2 && host.team != players[ i ].team ) - { - i++; - continue; - } - else - { - if ( removetype == 3 && host.team == players[ i ].team ) - { - i++; - continue; - } - else - { - kick( players[ i ] getentitynumber() ); - } - } - } - i++; - } - thread removetestclients(); + wait 5; + + for (;;) + { + if ( getdvarint( "scr_testclientsremove" ) > 0 ) + break; + + wait 1; + } + + playsoundonplayers( "vox_kls_dav_kill" ); + removetype = getdvarint( "scr_testclientsremove" ); + setdvar( "scr_testclientsremove", 0 ); + host = gethostplayer(); + players = level.players; + + for ( i = 0; i < players.size; i++ ) + { + if ( isdefined( players[i].pers["isBot"] ) && players[i].pers["isBot"] == 1 ) + { + if ( removetype == 2 && host.team != players[i].team ) + continue; + + if ( removetype == 3 && host.team == players[i].team ) + continue; + + kick( players[i] getentitynumber() ); + } + } + + thread removetestclients(); #/ } testclient( team ) { /# - self endon( "disconnect" ); - while ( !isDefined( self.pers[ "team" ] ) ) - { - wait 0,05; - } - if ( level.teambased ) - { - self notify( "menuresponse" ); - wait 0,5; - } - while ( 1 ) - { - classes = maps/mp/bots/_bot::bot_build_classes(); - self notify( "menuresponse" ); - self waittill( "spawned_player" ); - wait 0,1; + self endon( "disconnect" ); + + while ( !isdefined( self.pers["team"] ) ) + wait 0.05; + + if ( level.teambased ) + { + self notify( "menuresponse", game["menu_team"], team ); + wait 0.5; + } + + while ( true ) + { + classes = maps\mp\bots\_bot::bot_build_classes(); + self notify( "menuresponse", "changeclass", random( classes ) ); + + self waittill( "spawned_player" ); + + wait 0.1; + } #/ - } } showonespawnpoint( spawn_point, color, notification, height, print ) { /# - if ( !isDefined( height ) || height <= 0 ) - { - height = get_player_height(); - } - if ( !isDefined( print ) ) - { - print = spawn_point.classname; - } - center = spawn_point.origin; - forward = anglesToForward( spawn_point.angles ); - right = anglesToRight( spawn_point.angles ); - forward = vectorScale( forward, 16 ); - right = vectorScale( right, 16 ); - a = ( center + forward ) - right; - b = center + forward + right; - c = ( center - forward ) + right; - d = center - forward - right; - thread lineuntilnotified( a, b, color, 0, notification ); - thread lineuntilnotified( b, c, color, 0, notification ); - thread lineuntilnotified( c, d, color, 0, notification ); - thread lineuntilnotified( d, a, color, 0, notification ); - thread lineuntilnotified( a, a + ( 0, 0, height ), color, 0, notification ); - thread lineuntilnotified( b, b + ( 0, 0, height ), color, 0, notification ); - thread lineuntilnotified( c, c + ( 0, 0, height ), color, 0, notification ); - thread lineuntilnotified( d, d + ( 0, 0, height ), color, 0, notification ); - a += ( 0, 0, height ); - b += ( 0, 0, height ); - c += ( 0, 0, height ); - d += ( 0, 0, height ); - thread lineuntilnotified( a, b, color, 0, notification ); - thread lineuntilnotified( b, c, color, 0, notification ); - thread lineuntilnotified( c, d, color, 0, notification ); - thread lineuntilnotified( d, a, color, 0, notification ); - center += ( 0, 0, height / 2 ); - arrow_forward = anglesToForward( spawn_point.angles ); - arrowhead_forward = anglesToForward( spawn_point.angles ); - arrowhead_right = anglesToRight( spawn_point.angles ); - arrow_forward = vectorScale( arrow_forward, 32 ); - arrowhead_forward = vectorScale( arrowhead_forward, 24 ); - arrowhead_right = vectorScale( arrowhead_right, 8 ); - a = center + arrow_forward; - b = ( center + arrowhead_forward ) - arrowhead_right; - c = center + arrowhead_forward + arrowhead_right; - thread lineuntilnotified( center, a, color, 0, notification ); - thread lineuntilnotified( a, b, color, 0, notification ); - thread lineuntilnotified( a, c, color, 0, notification ); - thread print3duntilnotified( spawn_point.origin + ( 0, 0, height ), print, color, 1, 1, notification ); - return; + if ( !isdefined( height ) || height <= 0 ) + height = get_player_height(); + + if ( !isdefined( print ) ) + print = spawn_point.classname; + + center = spawn_point.origin; + forward = anglestoforward( spawn_point.angles ); + right = anglestoright( spawn_point.angles ); + forward = vectorscale( forward, 16 ); + right = vectorscale( right, 16 ); + a = center + forward - right; + b = center + forward + right; + c = center - forward + right; + d = center - forward - right; + thread lineuntilnotified( a, b, color, 0, notification ); + thread lineuntilnotified( b, c, color, 0, notification ); + thread lineuntilnotified( c, d, color, 0, notification ); + thread lineuntilnotified( d, a, color, 0, notification ); + thread lineuntilnotified( a, a + ( 0, 0, height ), color, 0, notification ); + thread lineuntilnotified( b, b + ( 0, 0, height ), color, 0, notification ); + thread lineuntilnotified( c, c + ( 0, 0, height ), color, 0, notification ); + thread lineuntilnotified( d, d + ( 0, 0, height ), color, 0, notification ); + a += ( 0, 0, height ); + b += ( 0, 0, height ); + c += ( 0, 0, height ); + d += ( 0, 0, height ); + thread lineuntilnotified( a, b, color, 0, notification ); + thread lineuntilnotified( b, c, color, 0, notification ); + thread lineuntilnotified( c, d, color, 0, notification ); + thread lineuntilnotified( d, a, color, 0, notification ); + center += ( 0, 0, height / 2 ); + arrow_forward = anglestoforward( spawn_point.angles ); + arrowhead_forward = anglestoforward( spawn_point.angles ); + arrowhead_right = anglestoright( spawn_point.angles ); + arrow_forward = vectorscale( arrow_forward, 32 ); + arrowhead_forward = vectorscale( arrowhead_forward, 24 ); + arrowhead_right = vectorscale( arrowhead_right, 8 ); + a = center + arrow_forward; + b = center + arrowhead_forward - arrowhead_right; + c = center + arrowhead_forward + arrowhead_right; + thread lineuntilnotified( center, a, color, 0, notification ); + thread lineuntilnotified( a, b, color, 0, notification ); + thread lineuntilnotified( a, c, color, 0, notification ); + thread print3duntilnotified( spawn_point.origin + ( 0, 0, height ), print, color, 1, 1, notification ); + return; #/ } showspawnpoints() { /# - while ( isDefined( level.spawnpoints ) ) - { - color = ( 0, 1, 0 ); - spawn_point_index = 0; - while ( spawn_point_index < level.spawnpoints.size ) - { - showonespawnpoint( level.spawnpoints[ spawn_point_index ], color, "hide_spawnpoints" ); - spawn_point_index++; - } - } - i = 0; - while ( i < level.dem_spawns.size ) - { - color = ( 0, 1, 0 ); - showonespawnpoint( level.dem_spawns[ i ], color, "hide_spawnpoints" ); - i++; - } - return; + if ( isdefined( level.spawnpoints ) ) + { + color = ( 1, 1, 1 ); + + for ( spawn_point_index = 0; spawn_point_index < level.spawnpoints.size; spawn_point_index++ ) + showonespawnpoint( level.spawnpoints[spawn_point_index], color, "hide_spawnpoints" ); + } + + for ( i = 0; i < level.dem_spawns.size; i++ ) + { + color = ( 0, 1, 0 ); + showonespawnpoint( level.dem_spawns[i], color, "hide_spawnpoints" ); + } + + return; #/ } hidespawnpoints() { /# - level notify( "hide_spawnpoints" ); - return; + level notify( "hide_spawnpoints" ); + return; #/ } showstartspawnpoints() { /# - if ( !level.teambased ) - { - return; - } - if ( !isDefined( level.spawn_start ) ) - { - return; - } - team_colors = []; - team_colors[ "axis" ] = ( 0, 1, 0 ); - team_colors[ "allies" ] = ( 0, 1, 1 ); - team_colors[ "team3" ] = ( 0, 1, 0 ); - team_colors[ "team4" ] = ( 0, 1, 0 ); - team_colors[ "team5" ] = ( 0, 1, 0 ); - team_colors[ "team6" ] = ( 1, 0,7, 0 ); - team_colors[ "team7" ] = ( 0,25, 0,25, 1 ); - team_colors[ "team8" ] = ( 0,88, 0, 1 ); - _a1908 = level.teams; - _k1908 = getFirstArrayKey( _a1908 ); - while ( isDefined( _k1908 ) ) - { - team = _a1908[ _k1908 ]; - color = team_colors[ team ]; - _a1912 = level.spawn_start[ team ]; - _k1912 = getFirstArrayKey( _a1912 ); - while ( isDefined( _k1912 ) ) - { - spawnpoint = _a1912[ _k1912 ]; - showonespawnpoint( spawnpoint, color, "hide_startspawnpoints" ); - _k1912 = getNextArrayKey( _a1912, _k1912 ); - } - _k1908 = getNextArrayKey( _a1908, _k1908 ); - } - return; + if ( !level.teambased ) + return; + + if ( !isdefined( level.spawn_start ) ) + return; + + team_colors = []; + team_colors["axis"] = ( 1, 0, 1 ); + team_colors["allies"] = ( 0, 1, 1 ); + team_colors["team3"] = ( 1, 1, 0 ); + team_colors["team4"] = ( 0, 1, 0 ); + team_colors["team5"] = ( 0, 0, 1 ); + team_colors["team6"] = ( 1, 0.7, 0 ); + team_colors["team7"] = ( 0.25, 0.25, 1.0 ); + team_colors["team8"] = ( 0.88, 0, 1 ); + + foreach ( team in level.teams ) + { + color = team_colors[team]; + + foreach ( spawnpoint in level.spawn_start[team] ) + showonespawnpoint( spawnpoint, color, "hide_startspawnpoints" ); + } + + return; #/ } hidestartspawnpoints() { /# - level notify( "hide_startspawnpoints" ); - return; + level notify( "hide_startspawnpoints" ); + return; #/ } print3duntilnotified( origin, text, color, alpha, scale, notification ) { /# - level endon( notification ); - for ( ;; ) - { - print3d( origin, text, color, alpha, scale ); - wait 0,05; + level endon( notification ); + + for (;;) + { + print3d( origin, text, color, alpha, scale ); + wait 0.05; + } #/ - } } lineuntilnotified( start, end, color, depthtest, notification ) { /# - level endon( notification ); - for ( ;; ) - { - line( start, end, color, depthtest ); - wait 0,05; + level endon( notification ); + + for (;;) + { + line( start, end, color, depthtest ); + wait 0.05; + } #/ - } } engagement_distance_debug_toggle() { /# - level endon( "kill_engage_dist_debug_toggle_watcher" ); - if ( !isDefined( getDvarInt( "debug_engage_dists" ) ) ) - { - setdvar( "debug_engage_dists", "0" ); - } - laststate = getDvarInt( "debug_engage_dists" ); - while ( 1 ) - { - currentstate = getDvarInt( "debug_engage_dists" ); - if ( dvar_turned_on( currentstate ) && !dvar_turned_on( laststate ) ) - { - weapon_engage_dists_init(); - thread debug_realtime_engage_dist(); - laststate = currentstate; - } - else - { - if ( !dvar_turned_on( currentstate ) && dvar_turned_on( laststate ) ) - { - level notify( "kill_all_engage_dist_debug" ); - laststate = currentstate; - } - } - wait 0,3; + level endon( "kill_engage_dist_debug_toggle_watcher" ); + + if ( !isdefined( getdvarint( "debug_engage_dists" ) ) ) + setdvar( "debug_engage_dists", "0" ); + + laststate = getdvarint( "debug_engage_dists" ); + + while ( true ) + { + currentstate = getdvarint( "debug_engage_dists" ); + + if ( dvar_turned_on( currentstate ) && !dvar_turned_on( laststate ) ) + { + weapon_engage_dists_init(); + thread debug_realtime_engage_dist(); + laststate = currentstate; + } + else if ( !dvar_turned_on( currentstate ) && dvar_turned_on( laststate ) ) + { + level notify( "kill_all_engage_dist_debug" ); + laststate = currentstate; + } + + wait 0.3; + } #/ - } } dvar_turned_on( val ) { /# - if ( val <= 0 ) - { - return 0; - } - else - { - return 1; + if ( val <= 0 ) + return false; + else + return true; #/ - } } engagement_distance_debug_init() { /# - level.debug_xpos = -50; - level.debug_ypos = 250; - level.debug_yinc = 18; - level.debug_fontscale = 1,5; - level.white = ( 0, 1, 0 ); - level.green = ( 0, 1, 0 ); - level.yellow = ( 0, 1, 0 ); - level.red = ( 0, 1, 0 ); - level.realtimeengagedist = newhudelem(); - level.realtimeengagedist.alignx = "left"; - level.realtimeengagedist.fontscale = level.debug_fontscale; - level.realtimeengagedist.x = level.debug_xpos; - level.realtimeengagedist.y = level.debug_ypos; - level.realtimeengagedist.color = level.white; - level.realtimeengagedist settext( "Current Engagement Distance: " ); - xpos = level.debug_xpos + 207; - level.realtimeengagedist_value = newhudelem(); - level.realtimeengagedist_value.alignx = "left"; - level.realtimeengagedist_value.fontscale = level.debug_fontscale; - level.realtimeengagedist_value.x = xpos; - level.realtimeengagedist_value.y = level.debug_ypos; - level.realtimeengagedist_value.color = level.white; - level.realtimeengagedist_value setvalue( 0 ); - xpos += 37; - level.realtimeengagedist_middle = newhudelem(); - level.realtimeengagedist_middle.alignx = "left"; - level.realtimeengagedist_middle.fontscale = level.debug_fontscale; - level.realtimeengagedist_middle.x = xpos; - level.realtimeengagedist_middle.y = level.debug_ypos; - level.realtimeengagedist_middle.color = level.white; - level.realtimeengagedist_middle settext( " units, SHORT/LONG by " ); - xpos += 105; - level.realtimeengagedist_offvalue = newhudelem(); - level.realtimeengagedist_offvalue.alignx = "left"; - level.realtimeengagedist_offvalue.fontscale = level.debug_fontscale; - level.realtimeengagedist_offvalue.x = xpos; - level.realtimeengagedist_offvalue.y = level.debug_ypos; - level.realtimeengagedist_offvalue.color = level.white; - level.realtimeengagedist_offvalue setvalue( 0 ); - hudobjarray = []; - hudobjarray[ 0 ] = level.realtimeengagedist; - hudobjarray[ 1 ] = level.realtimeengagedist_value; - hudobjarray[ 2 ] = level.realtimeengagedist_middle; - hudobjarray[ 3 ] = level.realtimeengagedist_offvalue; - return hudobjarray; + level.debug_xpos = -50; + level.debug_ypos = 250; + level.debug_yinc = 18; + level.debug_fontscale = 1.5; + level.white = ( 1, 1, 1 ); + level.green = ( 0, 1, 0 ); + level.yellow = ( 1, 1, 0 ); + level.red = ( 1, 0, 0 ); + level.realtimeengagedist = newhudelem(); + level.realtimeengagedist.alignx = "left"; + level.realtimeengagedist.fontscale = level.debug_fontscale; + level.realtimeengagedist.x = level.debug_xpos; + level.realtimeengagedist.y = level.debug_ypos; + level.realtimeengagedist.color = level.white; + level.realtimeengagedist settext( "Current Engagement Distance: " ); + xpos = level.debug_xpos + 207; + level.realtimeengagedist_value = newhudelem(); + level.realtimeengagedist_value.alignx = "left"; + level.realtimeengagedist_value.fontscale = level.debug_fontscale; + level.realtimeengagedist_value.x = xpos; + level.realtimeengagedist_value.y = level.debug_ypos; + level.realtimeengagedist_value.color = level.white; + level.realtimeengagedist_value setvalue( 0 ); + xpos += 37; + level.realtimeengagedist_middle = newhudelem(); + level.realtimeengagedist_middle.alignx = "left"; + level.realtimeengagedist_middle.fontscale = level.debug_fontscale; + level.realtimeengagedist_middle.x = xpos; + level.realtimeengagedist_middle.y = level.debug_ypos; + level.realtimeengagedist_middle.color = level.white; + level.realtimeengagedist_middle settext( " units, SHORT/LONG by " ); + xpos += 105; + level.realtimeengagedist_offvalue = newhudelem(); + level.realtimeengagedist_offvalue.alignx = "left"; + level.realtimeengagedist_offvalue.fontscale = level.debug_fontscale; + level.realtimeengagedist_offvalue.x = xpos; + level.realtimeengagedist_offvalue.y = level.debug_ypos; + level.realtimeengagedist_offvalue.color = level.white; + level.realtimeengagedist_offvalue setvalue( 0 ); + hudobjarray = []; + hudobjarray[0] = level.realtimeengagedist; + hudobjarray[1] = level.realtimeengagedist_value; + hudobjarray[2] = level.realtimeengagedist_middle; + hudobjarray[3] = level.realtimeengagedist_offvalue; + return hudobjarray; #/ } engage_dist_debug_hud_destroy( hudarray, killnotify ) { /# - level waittill( killnotify ); - i = 0; - while ( i < hudarray.size ) - { - hudarray[ i ] destroy(); - i++; + level waittill( killnotify ); + + for ( i = 0; i < hudarray.size; i++ ) + hudarray[i] destroy(); #/ - } } weapon_engage_dists_init() { /# - level.engagedists = []; - genericpistol = spawnstruct(); - genericpistol.engagedistmin = 125; - genericpistol.engagedistoptimal = 225; - genericpistol.engagedistmulligan = 50; - genericpistol.engagedistmax = 400; - shotty = spawnstruct(); - shotty.engagedistmin = 50; - shotty.engagedistoptimal = 200; - shotty.engagedistmulligan = 75; - shotty.engagedistmax = 350; - genericsmg = spawnstruct(); - genericsmg.engagedistmin = 100; - genericsmg.engagedistoptimal = 275; - genericsmg.engagedistmulligan = 100; - genericsmg.engagedistmax = 500; - genericlmg = spawnstruct(); - genericlmg.engagedistmin = 325; - genericlmg.engagedistoptimal = 550; - genericlmg.engagedistmulligan = 150; - genericlmg.engagedistmax = 850; - genericriflesa = spawnstruct(); - genericriflesa.engagedistmin = 325; - genericriflesa.engagedistoptimal = 550; - genericriflesa.engagedistmulligan = 150; - genericriflesa.engagedistmax = 850; - genericriflebolt = spawnstruct(); - genericriflebolt.engagedistmin = 350; - genericriflebolt.engagedistoptimal = 600; - genericriflebolt.engagedistmulligan = 150; - genericriflebolt.engagedistmax = 900; - generichmg = spawnstruct(); - generichmg.engagedistmin = 390; - generichmg.engagedistoptimal = 600; - generichmg.engagedistmulligan = 100; - generichmg.engagedistmax = 900; - genericsniper = spawnstruct(); - genericsniper.engagedistmin = 950; - genericsniper.engagedistoptimal = 1700; - genericsniper.engagedistmulligan = 300; - genericsniper.engagedistmax = 3000; - engage_dists_add( "colt_mp", genericpistol ); - engage_dists_add( "nambu_mp", genericpistol ); - engage_dists_add( "tokarev_mp", genericpistol ); - engage_dists_add( "walther_mp", genericpistol ); - engage_dists_add( "thompson_mp", genericsmg ); - engage_dists_add( "type100_smg_mp", genericsmg ); - engage_dists_add( "ppsh_mp", genericsmg ); - engage_dists_add( "mp40_mp", genericsmg ); - engage_dists_add( "stg44_mp", genericsmg ); - engage_dists_add( "sten_mp", genericsmg ); - engage_dists_add( "sten_silenced_mp", genericsmg ); - engage_dists_add( "shotgun_mp", shotty ); - engage_dists_add( "bar_mp", genericlmg ); - engage_dists_add( "bar_bipod_mp", genericlmg ); - engage_dists_add( "type99_lmg_mp", genericlmg ); - engage_dists_add( "type99_lmg_bipod_mp", genericlmg ); - engage_dists_add( "dp28_mp", genericlmg ); - engage_dists_add( "dp28_bipod_mp", genericlmg ); - engage_dists_add( "fg42_mp", genericlmg ); - engage_dists_add( "fg42_bipod_mp", genericlmg ); - engage_dists_add( "bren_mp", genericlmg ); - engage_dists_add( "bren_bipod_mp", genericlmg ); - engage_dists_add( "m1garand_mp", genericriflesa ); - engage_dists_add( "m1garand_bayonet_mp", genericriflesa ); - engage_dists_add( "m1carbine_mp", genericriflesa ); - engage_dists_add( "m1carbine_bayonet_mp", genericriflesa ); - engage_dists_add( "svt40_mp", genericriflesa ); - engage_dists_add( "gewehr43_mp", genericriflesa ); - engage_dists_add( "springfield_mp", genericriflebolt ); - engage_dists_add( "springfield_bayonet_mp", genericriflebolt ); - engage_dists_add( "type99_rifle_mp", genericriflebolt ); - engage_dists_add( "type99_rifle_bayonet_mp", genericriflebolt ); - engage_dists_add( "mosin_rifle_mp", genericriflebolt ); - engage_dists_add( "mosin_rifle_bayonet_mp", genericriflebolt ); - engage_dists_add( "kar98k_mp", genericriflebolt ); - engage_dists_add( "kar98k_bayonet_mp", genericriflebolt ); - engage_dists_add( "lee_enfield_mp", genericriflebolt ); - engage_dists_add( "lee_enfield_bayonet_mp", genericriflebolt ); - engage_dists_add( "30cal_mp", generichmg ); - engage_dists_add( "30cal_bipod_mp", generichmg ); - engage_dists_add( "mg42_mp", generichmg ); - engage_dists_add( "mg42_bipod_mp", generichmg ); - engage_dists_add( "springfield_scoped_mp", genericsniper ); - engage_dists_add( "type99_rifle_scoped_mp", genericsniper ); - engage_dists_add( "mosin_rifle_scoped_mp", genericsniper ); - engage_dists_add( "kar98k_scoped_mp", genericsniper ); - engage_dists_add( "fg42_scoped_mp", genericsniper ); - engage_dists_add( "lee_enfield_scoped_mp", genericsniper ); - level thread engage_dists_watcher(); + level.engagedists = []; + genericpistol = spawnstruct(); + genericpistol.engagedistmin = 125; + genericpistol.engagedistoptimal = 225; + genericpistol.engagedistmulligan = 50; + genericpistol.engagedistmax = 400; + shotty = spawnstruct(); + shotty.engagedistmin = 50; + shotty.engagedistoptimal = 200; + shotty.engagedistmulligan = 75; + shotty.engagedistmax = 350; + genericsmg = spawnstruct(); + genericsmg.engagedistmin = 100; + genericsmg.engagedistoptimal = 275; + genericsmg.engagedistmulligan = 100; + genericsmg.engagedistmax = 500; + genericlmg = spawnstruct(); + genericlmg.engagedistmin = 325; + genericlmg.engagedistoptimal = 550; + genericlmg.engagedistmulligan = 150; + genericlmg.engagedistmax = 850; + genericriflesa = spawnstruct(); + genericriflesa.engagedistmin = 325; + genericriflesa.engagedistoptimal = 550; + genericriflesa.engagedistmulligan = 150; + genericriflesa.engagedistmax = 850; + genericriflebolt = spawnstruct(); + genericriflebolt.engagedistmin = 350; + genericriflebolt.engagedistoptimal = 600; + genericriflebolt.engagedistmulligan = 150; + genericriflebolt.engagedistmax = 900; + generichmg = spawnstruct(); + generichmg.engagedistmin = 390; + generichmg.engagedistoptimal = 600; + generichmg.engagedistmulligan = 100; + generichmg.engagedistmax = 900; + genericsniper = spawnstruct(); + genericsniper.engagedistmin = 950; + genericsniper.engagedistoptimal = 1700; + genericsniper.engagedistmulligan = 300; + genericsniper.engagedistmax = 3000; + engage_dists_add( "colt_mp", genericpistol ); + engage_dists_add( "nambu_mp", genericpistol ); + engage_dists_add( "tokarev_mp", genericpistol ); + engage_dists_add( "walther_mp", genericpistol ); + engage_dists_add( "thompson_mp", genericsmg ); + engage_dists_add( "type100_smg_mp", genericsmg ); + engage_dists_add( "ppsh_mp", genericsmg ); + engage_dists_add( "mp40_mp", genericsmg ); + engage_dists_add( "stg44_mp", genericsmg ); + engage_dists_add( "sten_mp", genericsmg ); + engage_dists_add( "sten_silenced_mp", genericsmg ); + engage_dists_add( "shotgun_mp", shotty ); + engage_dists_add( "bar_mp", genericlmg ); + engage_dists_add( "bar_bipod_mp", genericlmg ); + engage_dists_add( "type99_lmg_mp", genericlmg ); + engage_dists_add( "type99_lmg_bipod_mp", genericlmg ); + engage_dists_add( "dp28_mp", genericlmg ); + engage_dists_add( "dp28_bipod_mp", genericlmg ); + engage_dists_add( "fg42_mp", genericlmg ); + engage_dists_add( "fg42_bipod_mp", genericlmg ); + engage_dists_add( "bren_mp", genericlmg ); + engage_dists_add( "bren_bipod_mp", genericlmg ); + engage_dists_add( "m1garand_mp", genericriflesa ); + engage_dists_add( "m1garand_bayonet_mp", genericriflesa ); + engage_dists_add( "m1carbine_mp", genericriflesa ); + engage_dists_add( "m1carbine_bayonet_mp", genericriflesa ); + engage_dists_add( "svt40_mp", genericriflesa ); + engage_dists_add( "gewehr43_mp", genericriflesa ); + engage_dists_add( "springfield_mp", genericriflebolt ); + engage_dists_add( "springfield_bayonet_mp", genericriflebolt ); + engage_dists_add( "type99_rifle_mp", genericriflebolt ); + engage_dists_add( "type99_rifle_bayonet_mp", genericriflebolt ); + engage_dists_add( "mosin_rifle_mp", genericriflebolt ); + engage_dists_add( "mosin_rifle_bayonet_mp", genericriflebolt ); + engage_dists_add( "kar98k_mp", genericriflebolt ); + engage_dists_add( "kar98k_bayonet_mp", genericriflebolt ); + engage_dists_add( "lee_enfield_mp", genericriflebolt ); + engage_dists_add( "lee_enfield_bayonet_mp", genericriflebolt ); + engage_dists_add( "30cal_mp", generichmg ); + engage_dists_add( "30cal_bipod_mp", generichmg ); + engage_dists_add( "mg42_mp", generichmg ); + engage_dists_add( "mg42_bipod_mp", generichmg ); + engage_dists_add( "springfield_scoped_mp", genericsniper ); + engage_dists_add( "type99_rifle_scoped_mp", genericsniper ); + engage_dists_add( "mosin_rifle_scoped_mp", genericsniper ); + engage_dists_add( "kar98k_scoped_mp", genericsniper ); + engage_dists_add( "fg42_scoped_mp", genericsniper ); + engage_dists_add( "lee_enfield_scoped_mp", genericsniper ); + level thread engage_dists_watcher(); #/ } engage_dists_add( weapontypestr, values ) { /# - level.engagedists[ weapontypestr ] = values; + level.engagedists[weapontypestr] = values; #/ } get_engage_dists( weapontypestr ) { /# - if ( isDefined( level.engagedists[ weapontypestr ] ) ) - { - return level.engagedists[ weapontypestr ]; - } - else - { - return undefined; + if ( isdefined( level.engagedists[weapontypestr] ) ) + return level.engagedists[weapontypestr]; + else + return undefined; #/ - } } engage_dists_watcher() { /# - level endon( "kill_all_engage_dist_debug" ); - level endon( "kill_engage_dists_watcher" ); - while ( 1 ) - { - player = gethostplayer(); - playerweapon = player getcurrentweapon(); - if ( !isDefined( player.lastweapon ) ) - { - player.lastweapon = playerweapon; - } - else - { - while ( player.lastweapon == playerweapon ) - { - wait 0,05; - } - } - values = get_engage_dists( playerweapon ); - if ( isDefined( values ) ) - { - level.weaponengagedistvalues = values; - } - else - { - level.weaponengagedistvalues = undefined; - } - player.lastweapon = playerweapon; - wait 0,05; + level endon( "kill_all_engage_dist_debug" ); + level endon( "kill_engage_dists_watcher" ); + + while ( true ) + { + player = gethostplayer(); + playerweapon = player getcurrentweapon(); + + if ( !isdefined( player.lastweapon ) ) + player.lastweapon = playerweapon; + else if ( player.lastweapon == playerweapon ) + { + wait 0.05; + continue; + } + + values = get_engage_dists( playerweapon ); + + if ( isdefined( values ) ) + level.weaponengagedistvalues = values; + else + level.weaponengagedistvalues = undefined; + + player.lastweapon = playerweapon; + wait 0.05; + } #/ - } } debug_realtime_engage_dist() { /# - level endon( "kill_all_engage_dist_debug" ); - level endon( "kill_realtime_engagement_distance_debug" ); - hudobjarray = engagement_distance_debug_init(); - level thread engage_dist_debug_hud_destroy( hudobjarray, "kill_all_engage_dist_debug" ); - level.debugrtengagedistcolor = level.green; - player = gethostplayer(); - while ( 1 ) - { - lasttracepos = ( 0, 1, 0 ); - direction = player getplayerangles(); - direction_vec = anglesToForward( direction ); - eye = player geteye(); - eye = ( eye[ 0 ], eye[ 1 ], eye[ 2 ] + 20 ); - trace = bullettrace( eye, eye + vectorScale( direction_vec, 10000 ), 1, player ); - tracepoint = trace[ "position" ]; - tracenormal = trace[ "normal" ]; - tracedist = int( distance( eye, tracepoint ) ); - if ( tracepoint != lasttracepos ) - { - lasttracepos = tracepoint; - if ( !isDefined( level.weaponengagedistvalues ) ) - { - hudobj_changecolor( hudobjarray, level.white ); - hudobjarray engagedist_hud_changetext( "nodata", tracedist ); - break; - } - else engagedistmin = level.weaponengagedistvalues.engagedistmin; - engagedistoptimal = level.weaponengagedistvalues.engagedistoptimal; - engagedistmulligan = level.weaponengagedistvalues.engagedistmulligan; - engagedistmax = level.weaponengagedistvalues.engagedistmax; - if ( tracedist >= engagedistmin && tracedist <= engagedistmax ) - { - if ( tracedist >= ( engagedistoptimal - engagedistmulligan ) && tracedist <= ( engagedistoptimal + engagedistmulligan ) ) - { - hudobjarray engagedist_hud_changetext( "optimal", tracedist ); - hudobj_changecolor( hudobjarray, level.green ); - } - else - { - hudobjarray engagedist_hud_changetext( "ok", tracedist ); - hudobj_changecolor( hudobjarray, level.yellow ); - } - break; - } - else - { - if ( tracedist < engagedistmin ) - { - hudobj_changecolor( hudobjarray, level.red ); - hudobjarray engagedist_hud_changetext( "short", tracedist ); - break; - } - else - { - if ( tracedist > engagedistmax ) - { - hudobj_changecolor( hudobjarray, level.red ); - hudobjarray engagedist_hud_changetext( "long", tracedist ); - } - } - } - } - thread plot_circle_fortime( 1, 5, 0,05, level.debugrtengagedistcolor, tracepoint, tracenormal ); - thread plot_circle_fortime( 1, 1, 0,05, level.debugrtengagedistcolor, tracepoint, tracenormal ); - wait 0,05; + level endon( "kill_all_engage_dist_debug" ); + level endon( "kill_realtime_engagement_distance_debug" ); + hudobjarray = engagement_distance_debug_init(); + level thread engage_dist_debug_hud_destroy( hudobjarray, "kill_all_engage_dist_debug" ); + level.debugrtengagedistcolor = level.green; + player = gethostplayer(); + + while ( true ) + { + lasttracepos = ( 0, 0, 0 ); + direction = player getplayerangles(); + direction_vec = anglestoforward( direction ); + eye = player geteye(); + eye = ( eye[0], eye[1], eye[2] + 20 ); + trace = bullettrace( eye, eye + vectorscale( direction_vec, 10000 ), 1, player ); + tracepoint = trace["position"]; + tracenormal = trace["normal"]; + tracedist = int( distance( eye, tracepoint ) ); + + if ( tracepoint != lasttracepos ) + { + lasttracepos = tracepoint; + + if ( !isdefined( level.weaponengagedistvalues ) ) + { + hudobj_changecolor( hudobjarray, level.white ); + hudobjarray engagedist_hud_changetext( "nodata", tracedist ); + } + else + { + engagedistmin = level.weaponengagedistvalues.engagedistmin; + engagedistoptimal = level.weaponengagedistvalues.engagedistoptimal; + engagedistmulligan = level.weaponengagedistvalues.engagedistmulligan; + engagedistmax = level.weaponengagedistvalues.engagedistmax; + + if ( tracedist >= engagedistmin && tracedist <= engagedistmax ) + { + if ( tracedist >= engagedistoptimal - engagedistmulligan && tracedist <= engagedistoptimal + engagedistmulligan ) + { + hudobjarray engagedist_hud_changetext( "optimal", tracedist ); + hudobj_changecolor( hudobjarray, level.green ); + } + else + { + hudobjarray engagedist_hud_changetext( "ok", tracedist ); + hudobj_changecolor( hudobjarray, level.yellow ); + } + } + else if ( tracedist < engagedistmin ) + { + hudobj_changecolor( hudobjarray, level.red ); + hudobjarray engagedist_hud_changetext( "short", tracedist ); + } + else if ( tracedist > engagedistmax ) + { + hudobj_changecolor( hudobjarray, level.red ); + hudobjarray engagedist_hud_changetext( "long", tracedist ); + } + } + } + + thread plot_circle_fortime( 1, 5, 0.05, level.debugrtengagedistcolor, tracepoint, tracenormal ); + thread plot_circle_fortime( 1, 1, 0.05, level.debugrtengagedistcolor, tracepoint, tracenormal ); + wait 0.05; + } #/ - } } hudobj_changecolor( hudobjarray, newcolor ) { /# - i = 0; - while ( i < hudobjarray.size ) - { - hudobj = hudobjarray[ i ]; - if ( hudobj.color != newcolor ) - { - hudobj.color = newcolor; - level.debugrtengagedistcolor = newcolor; - } - i++; + for ( i = 0; i < hudobjarray.size; i++ ) + { + hudobj = hudobjarray[i]; + + if ( hudobj.color != newcolor ) + { + hudobj.color = newcolor; + level.debugrtengagedistcolor = newcolor; + } + } #/ - } } engagedist_hud_changetext( engagedisttype, units ) { /# - if ( !isDefined( level.lastdisttype ) ) - { - level.lastdisttype = "none"; - } - if ( engagedisttype == "optimal" ) - { - self[ 1 ] setvalue( units ); - self[ 2 ] settext( "units: OPTIMAL!" ); - self[ 3 ].alpha = 0; - } - else if ( engagedisttype == "ok" ) - { - self[ 1 ] setvalue( units ); - self[ 2 ] settext( "units: OK!" ); - self[ 3 ].alpha = 0; - } - else if ( engagedisttype == "short" ) - { - amountunder = level.weaponengagedistvalues.engagedistmin - units; - self[ 1 ] setvalue( units ); - self[ 3 ] setvalue( amountunder ); - self[ 3 ].alpha = 1; - if ( level.lastdisttype != engagedisttype ) - { - self[ 2 ] settext( "units: SHORT by " ); - } - } - else if ( engagedisttype == "long" ) - { - amountover = units - level.weaponengagedistvalues.engagedistmax; - self[ 1 ] setvalue( units ); - self[ 3 ] setvalue( amountover ); - self[ 3 ].alpha = 1; - if ( level.lastdisttype != engagedisttype ) - { - self[ 2 ] settext( "units: LONG by " ); - } - } - else - { - if ( engagedisttype == "nodata" ) - { - self[ 1 ] setvalue( units ); - self[ 2 ] settext( " units: (NO CURRENT WEAPON VALUES)" ); - self[ 3 ].alpha = 0; - } - } - level.lastdisttype = engagedisttype; + if ( !isdefined( level.lastdisttype ) ) + level.lastdisttype = "none"; + + if ( engagedisttype == "optimal" ) + { + self[1] setvalue( units ); + self[2] settext( "units: OPTIMAL!" ); + self[3].alpha = 0; + } + else if ( engagedisttype == "ok" ) + { + self[1] setvalue( units ); + self[2] settext( "units: OK!" ); + self[3].alpha = 0; + } + else if ( engagedisttype == "short" ) + { + amountunder = level.weaponengagedistvalues.engagedistmin - units; + self[1] setvalue( units ); + self[3] setvalue( amountunder ); + self[3].alpha = 1; + + if ( level.lastdisttype != engagedisttype ) + self[2] settext( "units: SHORT by " ); + } + else if ( engagedisttype == "long" ) + { + amountover = units - level.weaponengagedistvalues.engagedistmax; + self[1] setvalue( units ); + self[3] setvalue( amountover ); + self[3].alpha = 1; + + if ( level.lastdisttype != engagedisttype ) + self[2] settext( "units: LONG by " ); + } + else if ( engagedisttype == "nodata" ) + { + self[1] setvalue( units ); + self[2] settext( " units: (NO CURRENT WEAPON VALUES)" ); + self[3].alpha = 0; + } + + level.lastdisttype = engagedisttype; #/ } plot_circle_fortime( radius1, radius2, time, color, origin, normal ) { /# - if ( !isDefined( color ) ) - { - color = ( 0, 1, 0 ); - } - hangtime = 0,05; - circleres = 6; - hemires = circleres / 2; - circleinc = 360 / circleres; - circleres++; - plotpoints = []; - rad = 0; - timer = getTime() + ( time * 1000 ); - radius = radius1; - while ( getTime() < timer ) - { - radius = radius2; - angletoplayer = vectorToAngle( normal ); - i = 0; - while ( i < circleres ) - { - plotpoints[ plotpoints.size ] = origin + vectorScale( anglesToForward( angletoplayer + ( rad, 90, 0 ) ), radius ); - rad += circleinc; - i++; - } - maps/mp/_utility::plot_points( plotpoints, color[ 0 ], color[ 1 ], color[ 2 ], hangtime ); - plotpoints = []; - wait hangtime; + if ( !isdefined( color ) ) + color = ( 0, 1, 0 ); + + hangtime = 0.05; + circleres = 6; + hemires = circleres / 2; + circleinc = 360 / circleres; + circleres++; + plotpoints = []; + rad = 0.0; + timer = gettime() + time * 1000; + radius = radius1; + + while ( gettime() < timer ) + { + radius = radius2; + angletoplayer = vectortoangles( normal ); + + for ( i = 0; i < circleres; i++ ) + { + plotpoints[plotpoints.size] = origin + vectorscale( anglestoforward( angletoplayer + ( rad, 90, 0 ) ), radius ); + rad += circleinc; + } + + maps\mp\_utility::plot_points( plotpoints, color[0], color[1], color[2], hangtime ); + plotpoints = []; + wait( hangtime ); + } #/ - } } larry_thread() { /# - setdvar( "bot_AllowMovement", "0" ); - setdvar( "bot_PressAttackBtn", "0" ); - setdvar( "bot_PressMeleeBtn", "0" ); - level.larry = spawnstruct(); - player = gethostplayer(); - player thread larry_init( level.larry ); - level waittill( "kill_larry" ); - larry_hud_destroy( level.larry ); - if ( isDefined( level.larry.model ) ) - { - level.larry.model delete(); - } - while ( isDefined( level.larry.ai ) ) - { - i = 0; - while ( i < level.larry.ai.size ) - { - kick( level.larry.ai[ i ] getentitynumber() ); - i++; - } - } - level.larry = undefined; + setdvar( "bot_AllowMovement", "0" ); + setdvar( "bot_PressAttackBtn", "0" ); + setdvar( "bot_PressMeleeBtn", "0" ); + level.larry = spawnstruct(); + player = gethostplayer(); + player thread larry_init( level.larry ); + + level waittill( "kill_larry" ); + + larry_hud_destroy( level.larry ); + + if ( isdefined( level.larry.model ) ) + level.larry.model delete(); + + if ( isdefined( level.larry.ai ) ) + { + for ( i = 0; i < level.larry.ai.size; i++ ) + kick( level.larry.ai[i] getentitynumber() ); + } + + level.larry = undefined; #/ } larry_init( larry ) { /# - level endon( "kill_larry" ); - larry_hud_init( larry ); - larry.model = spawn( "script_model", ( 0, 1, 0 ) ); - larry.model setmodel( "defaultactor" ); - larry.ai = []; - wait 0,1; - for ( ;; ) - { - wait 0,05; - if ( larry.ai.size > 0 ) - { - larry.model hide(); - continue; - } - else - { - direction = self getplayerangles(); - direction_vec = anglesToForward( direction ); - eye = self geteye(); - trace = bullettrace( eye, eye + vectorScale( direction_vec, 8000 ), 0, undefined ); - dist = distance( eye, trace[ "position" ] ); - position = eye + vectorScale( direction_vec, dist - 64 ); - larry.model.origin = position; - larry.model.angles = self.angles + vectorScale( ( 0, 1, 0 ), 180 ); - while ( self usebuttonpressed() ) - { - self larry_ai( larry ); - while ( self usebuttonpressed() ) - { - wait 0,05; - } - } - } + level endon( "kill_larry" ); + larry_hud_init( larry ); + larry.model = spawn( "script_model", ( 0, 0, 0 ) ); + larry.model setmodel( "defaultactor" ); + larry.ai = []; + wait 0.1; + + for (;;) + { + wait 0.05; + + if ( larry.ai.size > 0 ) + { + larry.model hide(); + continue; + } + + direction = self getplayerangles(); + direction_vec = anglestoforward( direction ); + eye = self geteye(); + trace = bullettrace( eye, eye + vectorscale( direction_vec, 8000 ), 0, undefined ); + dist = distance( eye, trace["position"] ); + position = eye + vectorscale( direction_vec, dist - 64 ); + larry.model.origin = position; + larry.model.angles = self.angles + vectorscale( ( 0, 1, 0 ), 180.0 ); + + if ( self usebuttonpressed() ) + { + self larry_ai( larry ); + + while ( self usebuttonpressed() ) + wait 0.05; + } + } #/ - } } larry_ai( larry ) { /# - larry.ai[ larry.ai.size ] = addtestclient(); - i = larry.ai.size - 1; - larry.ai[ i ].pers[ "isBot" ] = 1; - larry.ai[ i ] thread testclient( "autoassign" ); - larry.ai[ i ] thread larry_ai_thread( larry, larry.model.origin, larry.model.angles ); - larry.ai[ i ] thread larry_ai_damage( larry ); - larry.ai[ i ] thread larry_ai_health( larry ); + larry.ai[larry.ai.size] = addtestclient(); + i = larry.ai.size - 1; + larry.ai[i].pers["isBot"] = 1; + larry.ai[i] thread testclient( "autoassign" ); + larry.ai[i] thread larry_ai_thread( larry, larry.model.origin, larry.model.angles ); + larry.ai[i] thread larry_ai_damage( larry ); + larry.ai[i] thread larry_ai_health( larry ); #/ } larry_ai_thread( larry, origin, angles ) { /# - level endon( "kill_larry" ); - for ( ;; ) - { - self waittill( "spawned_player" ); - larry.menu[ larry.menu_health ] setvalue( self.health ); - larry.menu[ larry.menu_damage ] settext( "" ); - larry.menu[ larry.menu_range ] settext( "" ); - larry.menu[ larry.menu_hitloc ] settext( "" ); - larry.menu[ larry.menu_weapon ] settext( "" ); - larry.menu[ larry.menu_perks ] settext( "" ); - self setorigin( origin ); - self setplayerangles( angles ); - self clearperks(); + level endon( "kill_larry" ); + + for (;;) + { + self waittill( "spawned_player" ); + + larry.menu[larry.menu_health] setvalue( self.health ); + larry.menu[larry.menu_damage] settext( "" ); + larry.menu[larry.menu_range] settext( "" ); + larry.menu[larry.menu_hitloc] settext( "" ); + larry.menu[larry.menu_weapon] settext( "" ); + larry.menu[larry.menu_perks] settext( "" ); + self setorigin( origin ); + self setplayerangles( angles ); + self clearperks(); + } #/ - } } larry_ai_damage( larry ) { /# - level endon( "kill_larry" ); - for ( ;; ) - { - self waittill( "damage", damage, attacker, dir, point ); - if ( !isDefined( attacker ) ) - { - continue; - } - else player = gethostplayer(); - if ( !isDefined( player ) ) - { - continue; - } - else if ( attacker != player ) - { - continue; - } - else eye = player geteye(); - range = int( distance( eye, point ) ); - larry.menu[ larry.menu_health ] setvalue( self.health ); - larry.menu[ larry.menu_damage ] setvalue( damage ); - larry.menu[ larry.menu_range ] setvalue( range ); - if ( isDefined( self.cac_debug_location ) ) - { - larry.menu[ larry.menu_hitloc ] settext( self.cac_debug_location ); - } - else - { - larry.menu[ larry.menu_hitloc ] settext( "" ); - } - if ( isDefined( self.cac_debug_weapon ) ) - { - larry.menu[ larry.menu_weapon ] settext( self.cac_debug_weapon ); - continue; - } - else - { - larry.menu[ larry.menu_weapon ] settext( "" ); - } + level endon( "kill_larry" ); + + for (;;) + { + self waittill( "damage", damage, attacker, dir, point ); + + if ( !isdefined( attacker ) ) + continue; + + player = gethostplayer(); + + if ( !isdefined( player ) ) + continue; + + if ( attacker != player ) + continue; + + eye = player geteye(); + range = int( distance( eye, point ) ); + larry.menu[larry.menu_health] setvalue( self.health ); + larry.menu[larry.menu_damage] setvalue( damage ); + larry.menu[larry.menu_range] setvalue( range ); + + if ( isdefined( self.cac_debug_location ) ) + larry.menu[larry.menu_hitloc] settext( self.cac_debug_location ); + else + larry.menu[larry.menu_hitloc] settext( "" ); + + if ( isdefined( self.cac_debug_weapon ) ) + { + larry.menu[larry.menu_weapon] settext( self.cac_debug_weapon ); + continue; + } + + larry.menu[larry.menu_weapon] settext( "" ); + } #/ - } } larry_ai_health( larry ) { /# - level endon( "kill_larry" ); - for ( ;; ) - { - wait 0,05; - larry.menu[ larry.menu_health ] setvalue( self.health ); + level endon( "kill_larry" ); + + for (;;) + { + wait 0.05; + larry.menu[larry.menu_health] setvalue( self.health ); + } #/ - } } larry_hud_init( larry ) { /# - x = -45; - y = 275; - menu_name = "larry_menu"; - larry.hud = new_hud( menu_name, undefined, x, y, 1 ); - larry.hud setshader( "white", 135, 65 ); - larry.hud.alignx = "left"; - larry.hud.aligny = "top"; - larry.hud.sort = 10; - larry.hud.alpha = 0,6; - larry.hud.color = vectorScale( ( 0, 1, 0 ), 0,5 ); - larry.menu[ 0 ] = new_hud( menu_name, "Larry Health:", x + 5, y + 10, 1 ); - larry.menu[ 1 ] = new_hud( menu_name, "Damage:", x + 5, y + 20, 1 ); - larry.menu[ 2 ] = new_hud( menu_name, "Range:", x + 5, y + 30, 1 ); - larry.menu[ 3 ] = new_hud( menu_name, "Hit Location:", x + 5, y + 40, 1 ); - larry.menu[ 4 ] = new_hud( menu_name, "Weapon:", x + 5, y + 50, 1 ); - larry.cleartextmarker = newdebughudelem(); - larry.cleartextmarker.alpha = 0; - larry.cleartextmarker settext( "marker" ); - larry.menu_health = larry.menu.size; - larry.menu_damage = larry.menu.size + 1; - larry.menu_range = larry.menu.size + 2; - larry.menu_hitloc = larry.menu.size + 3; - larry.menu_weapon = larry.menu.size + 4; - larry.menu_perks = larry.menu.size + 5; - x_offset = 70; - larry.menu[ larry.menu_health ] = new_hud( menu_name, "", x + x_offset, y + 10, 1 ); - larry.menu[ larry.menu_damage ] = new_hud( menu_name, "", x + x_offset, y + 20, 1 ); - larry.menu[ larry.menu_range ] = new_hud( menu_name, "", x + x_offset, y + 30, 1 ); - larry.menu[ larry.menu_hitloc ] = new_hud( menu_name, "", x + x_offset, y + 40, 1 ); - larry.menu[ larry.menu_weapon ] = new_hud( menu_name, "", x + x_offset, y + 50, 1 ); - larry.menu[ larry.menu_perks ] = new_hud( menu_name, "", x + x_offset, y + 60, 1 ); + x = -45; + y = 275; + menu_name = "larry_menu"; + larry.hud = new_hud( menu_name, undefined, x, y, 1 ); + larry.hud setshader( "white", 135, 65 ); + larry.hud.alignx = "left"; + larry.hud.aligny = "top"; + larry.hud.sort = 10; + larry.hud.alpha = 0.6; + larry.hud.color = vectorscale( ( 0, 0, 1 ), 0.5 ); + larry.menu[0] = new_hud( menu_name, "Larry Health:", x + 5, y + 10, 1 ); + larry.menu[1] = new_hud( menu_name, "Damage:", x + 5, y + 20, 1 ); + larry.menu[2] = new_hud( menu_name, "Range:", x + 5, y + 30, 1 ); + larry.menu[3] = new_hud( menu_name, "Hit Location:", x + 5, y + 40, 1 ); + larry.menu[4] = new_hud( menu_name, "Weapon:", x + 5, y + 50, 1 ); + larry.cleartextmarker = newdebughudelem(); + larry.cleartextmarker.alpha = 0; + larry.cleartextmarker settext( "marker" ); + larry.menu_health = larry.menu.size; + larry.menu_damage = larry.menu.size + 1; + larry.menu_range = larry.menu.size + 2; + larry.menu_hitloc = larry.menu.size + 3; + larry.menu_weapon = larry.menu.size + 4; + larry.menu_perks = larry.menu.size + 5; + x_offset = 70; + larry.menu[larry.menu_health] = new_hud( menu_name, "", x + x_offset, y + 10, 1 ); + larry.menu[larry.menu_damage] = new_hud( menu_name, "", x + x_offset, y + 20, 1 ); + larry.menu[larry.menu_range] = new_hud( menu_name, "", x + x_offset, y + 30, 1 ); + larry.menu[larry.menu_hitloc] = new_hud( menu_name, "", x + x_offset, y + 40, 1 ); + larry.menu[larry.menu_weapon] = new_hud( menu_name, "", x + x_offset, y + 50, 1 ); + larry.menu[larry.menu_perks] = new_hud( menu_name, "", x + x_offset, y + 60, 1 ); #/ } larry_hud_destroy( larry ) { /# - if ( isDefined( larry.hud ) ) - { - larry.hud destroy(); - i = 0; - while ( i < larry.menu.size ) - { - larry.menu[ i ] destroy(); - i++; - } - larry.cleartextmarker destroy(); + if ( isdefined( larry.hud ) ) + { + larry.hud destroy(); + + for ( i = 0; i < larry.menu.size; i++ ) + larry.menu[i] destroy(); + + larry.cleartextmarker destroy(); + } #/ - } } new_hud( hud_name, msg, x, y, scale ) { /# - if ( !isDefined( level.hud_array ) ) - { - level.hud_array = []; - } - if ( !isDefined( level.hud_array[ hud_name ] ) ) - { - level.hud_array[ hud_name ] = []; - } - hud = set_hudelem( msg, x, y, scale ); - level.hud_array[ hud_name ][ level.hud_array[ hud_name ].size ] = hud; - return hud; + if ( !isdefined( level.hud_array ) ) + level.hud_array = []; + + if ( !isdefined( level.hud_array[hud_name] ) ) + level.hud_array[hud_name] = []; + + hud = set_hudelem( msg, x, y, scale ); + level.hud_array[hud_name][level.hud_array[hud_name].size] = hud; + return hud; #/ } set_hudelem( text, x, y, scale, alpha, sort, debug_hudelem ) { /# - if ( !isDefined( alpha ) ) - { - alpha = 1; - } - if ( !isDefined( scale ) ) - { - scale = 1; - } - if ( !isDefined( sort ) ) - { - sort = 20; - } - hud = newdebughudelem(); - hud.debug_hudelem = 1; - hud.location = 0; - hud.alignx = "left"; - hud.aligny = "middle"; - hud.foreground = 1; - hud.fontscale = scale; - hud.sort = sort; - hud.alpha = alpha; - hud.x = x; - hud.y = y; - hud.og_scale = scale; - if ( isDefined( text ) ) - { - hud settext( text ); - } - return hud; + if ( !isdefined( alpha ) ) + alpha = 1; + + if ( !isdefined( scale ) ) + scale = 1; + + if ( !isdefined( sort ) ) + sort = 20; + + hud = newdebughudelem(); + hud.debug_hudelem = 1; + hud.location = 0; + hud.alignx = "left"; + hud.aligny = "middle"; + hud.foreground = 1; + hud.fontscale = scale; + hud.sort = sort; + hud.alpha = alpha; + hud.x = x; + hud.y = y; + hud.og_scale = scale; + + if ( isdefined( text ) ) + hud settext( text ); + + return hud; #/ } watch_botsdvars() { /# - hasplayerweaponprev = getDvarInt( "scr_botsHasPlayerWeapon" ); - grenadesonlyprev = getDvarInt( "scr_botsGrenadesOnly" ); - secondarygrenadesonlyprev = getDvarInt( "scr_botsSpecialGrenadesOnly" ); - while ( 1 ) - { - if ( hasplayerweaponprev != getDvarInt( "scr_botsHasPlayerWeapon" ) ) - { - hasplayerweaponprev = getDvarInt( "scr_botsHasPlayerWeapon" ); - if ( hasplayerweaponprev ) - { - iprintlnbold( "LARRY has player weapon: ON" ); - break; - } - else - { - iprintlnbold( "LARRY has player weapon: OFF" ); - } - } - if ( grenadesonlyprev != getDvarInt( "scr_botsGrenadesOnly" ) ) - { - grenadesonlyprev = getDvarInt( "scr_botsGrenadesOnly" ); - if ( grenadesonlyprev ) - { - iprintlnbold( "LARRY using grenades only: ON" ); - break; - } - else - { - iprintlnbold( "LARRY using grenades only: OFF" ); - } - } - if ( secondarygrenadesonlyprev != getDvarInt( "scr_botsSpecialGrenadesOnly" ) ) - { - secondarygrenadesonlyprev = getDvarInt( "scr_botsSpecialGrenadesOnly" ); - if ( secondarygrenadesonlyprev ) - { - iprintlnbold( "LARRY using secondary grenades only: ON" ); - break; - } - else - { - iprintlnbold( "LARRY using secondary grenades only: OFF" ); - } - } - wait 1; + hasplayerweaponprev = getdvarint( "scr_botsHasPlayerWeapon" ); + grenadesonlyprev = getdvarint( "scr_botsGrenadesOnly" ); + secondarygrenadesonlyprev = getdvarint( "scr_botsSpecialGrenadesOnly" ); + + while ( true ) + { + if ( hasplayerweaponprev != getdvarint( "scr_botsHasPlayerWeapon" ) ) + { + hasplayerweaponprev = getdvarint( "scr_botsHasPlayerWeapon" ); + + if ( hasplayerweaponprev ) + iprintlnbold( "LARRY has player weapon: ON" ); + else + iprintlnbold( "LARRY has player weapon: OFF" ); + } + + if ( grenadesonlyprev != getdvarint( "scr_botsGrenadesOnly" ) ) + { + grenadesonlyprev = getdvarint( "scr_botsGrenadesOnly" ); + + if ( grenadesonlyprev ) + iprintlnbold( "LARRY using grenades only: ON" ); + else + iprintlnbold( "LARRY using grenades only: OFF" ); + } + + if ( secondarygrenadesonlyprev != getdvarint( "scr_botsSpecialGrenadesOnly" ) ) + { + secondarygrenadesonlyprev = getdvarint( "scr_botsSpecialGrenadesOnly" ); + + if ( secondarygrenadesonlyprev ) + iprintlnbold( "LARRY using secondary grenades only: ON" ); + else + iprintlnbold( "LARRY using secondary grenades only: OFF" ); + } + + wait 1.0; + } #/ - } } getattachmentchangemodifierbutton() { /# - return "BUTTON_X"; + return "BUTTON_X"; #/ } watchattachmentchange() { /# - self endon( "disconnect" ); - clientnum = self getentitynumber(); - if ( clientnum != 0 ) - { - return; - } - dpad_left = 0; - dpad_right = 0; - dpad_up = 0; - dpad_down = 0; - lstick_down = 0; - dpad_modifier_button = getattachmentchangemodifierbutton(); - for ( ;; ) - { - if ( self buttonpressed( dpad_modifier_button ) ) - { - if ( !dpad_left && self buttonpressed( "DPAD_LEFT" ) ) - { - self giveweaponnextattachment( "muzzle" ); - dpad_left = 1; - self thread print_weapon_name(); - } - if ( !dpad_right && self buttonpressed( "DPAD_RIGHT" ) ) - { - self giveweaponnextattachment( "trigger" ); - dpad_right = 1; - self thread print_weapon_name(); - } - if ( !dpad_up && self buttonpressed( "DPAD_UP" ) ) - { - self giveweaponnextattachment( "top" ); - dpad_up = 1; - self thread print_weapon_name(); - } - if ( !dpad_down && self buttonpressed( "DPAD_DOWN" ) ) - { - self giveweaponnextattachment( "bottom" ); - dpad_down = 1; - self thread print_weapon_name(); - } - if ( !lstick_down && self buttonpressed( "BUTTON_LSTICK" ) ) - { - self giveweaponnextattachment( "gunperk" ); - lstick_down = 1; - self thread print_weapon_name(); - } - } - if ( !self buttonpressed( "DPAD_LEFT" ) ) - { - dpad_left = 0; - } - if ( !self buttonpressed( "DPAD_RIGHT" ) ) - { - dpad_right = 0; - } - if ( !self buttonpressed( "DPAD_UP" ) ) - { - dpad_up = 0; - } - if ( !self buttonpressed( "DPAD_DOWN" ) ) - { - dpad_down = 0; - } - if ( !self buttonpressed( "BUTTON_LSTICK" ) ) - { - lstick_down = 0; - } - wait 0,05; + self endon( "disconnect" ); + clientnum = self getentitynumber(); + + if ( clientnum != 0 ) + return; + + dpad_left = 0; + dpad_right = 0; + dpad_up = 0; + dpad_down = 0; + lstick_down = 0; + dpad_modifier_button = getattachmentchangemodifierbutton(); + + for (;;) + { + if ( self buttonpressed( dpad_modifier_button ) ) + { + if ( !dpad_left && self buttonpressed( "DPAD_LEFT" ) ) + { + self giveweaponnextattachment( "muzzle" ); + dpad_left = 1; + self thread print_weapon_name(); + } + + if ( !dpad_right && self buttonpressed( "DPAD_RIGHT" ) ) + { + self giveweaponnextattachment( "trigger" ); + dpad_right = 1; + self thread print_weapon_name(); + } + + if ( !dpad_up && self buttonpressed( "DPAD_UP" ) ) + { + self giveweaponnextattachment( "top" ); + dpad_up = 1; + self thread print_weapon_name(); + } + + if ( !dpad_down && self buttonpressed( "DPAD_DOWN" ) ) + { + self giveweaponnextattachment( "bottom" ); + dpad_down = 1; + self thread print_weapon_name(); + } + + if ( !lstick_down && self buttonpressed( "BUTTON_LSTICK" ) ) + { + self giveweaponnextattachment( "gunperk" ); + lstick_down = 1; + self thread print_weapon_name(); + } + } + + if ( !self buttonpressed( "DPAD_LEFT" ) ) + dpad_left = 0; + + if ( !self buttonpressed( "DPAD_RIGHT" ) ) + dpad_right = 0; + + if ( !self buttonpressed( "DPAD_UP" ) ) + dpad_up = 0; + + if ( !self buttonpressed( "DPAD_DOWN" ) ) + dpad_down = 0; + + if ( !self buttonpressed( "BUTTON_LSTICK" ) ) + lstick_down = 0; + + wait 0.05; + } #/ - } } print_weapon_name() { /# - self notify( "print_weapon_name" ); - self endon( "print_weapon_name" ); - wait 0,2; - if ( self isswitchingweapons() ) - { - self waittill( "weapon_change_complete", weapon_name ); - fail_safe = 0; - while ( weapon_name == "none" ) - { - self waittill( "weapon_change_complete", weapon_name ); - wait 0,05; - fail_safe++; - if ( fail_safe > 120 ) - { - break; - } - else - { - } - } - } - else weapon_name = self getcurrentweapon(); - printweaponname = getdvarintdefault( "scr_print_weapon_name", 1 ); - if ( printweaponname ) - { - iprintlnbold( weapon_name ); + self notify( "print_weapon_name" ); + self endon( "print_weapon_name" ); + wait 0.2; + + if ( self isswitchingweapons() ) + { + self waittill( "weapon_change_complete", weapon_name ); + + fail_safe = 0; + + while ( weapon_name == "none" ) + { + self waittill( "weapon_change_complete", weapon_name ); + + wait 0.05; + fail_safe++; + + if ( fail_safe > 120 ) + break; + } + } + else + weapon_name = self getcurrentweapon(); + + printweaponname = getdvarintdefault( "scr_print_weapon_name", 1 ); + + if ( printweaponname ) + iprintlnbold( weapon_name ); #/ - } } set_equipment_list() { /# - if ( isDefined( level.dev_equipment ) ) - { - return; - } - level.dev_equipment = []; - level.dev_equipment[ 1 ] = "acoustic_sensor_mp"; - level.dev_equipment[ 2 ] = "camera_spike_mp"; - level.dev_equipment[ 3 ] = "claymore_mp"; - level.dev_equipment[ 4 ] = "satchel_charge_mp"; - level.dev_equipment[ 5 ] = "scrambler_mp"; - level.dev_equipment[ 6 ] = "tactical_insertion_mp"; - level.dev_equipment[ 7 ] = "bouncingbetty_mp"; - level.dev_equipment[ 8 ] = "trophy_system_mp"; - level.dev_equipment[ 9 ] = "pda_hack_mp"; + if ( isdefined( level.dev_equipment ) ) + return; + + level.dev_equipment = []; + level.dev_equipment[1] = "acoustic_sensor_mp"; + level.dev_equipment[2] = "camera_spike_mp"; + level.dev_equipment[3] = "claymore_mp"; + level.dev_equipment[4] = "satchel_charge_mp"; + level.dev_equipment[5] = "scrambler_mp"; + level.dev_equipment[6] = "tactical_insertion_mp"; + level.dev_equipment[7] = "bouncingbetty_mp"; + level.dev_equipment[8] = "trophy_system_mp"; + level.dev_equipment[9] = "pda_hack_mp"; #/ } set_grenade_list() { /# - if ( isDefined( level.dev_grenade ) ) - { - return; - } - level.dev_grenade = []; - level.dev_grenade[ 1 ] = "frag_grenade_mp"; - level.dev_grenade[ 2 ] = "sticky_grenade_mp"; - level.dev_grenade[ 3 ] = "hatchet_mp"; - level.dev_grenade[ 4 ] = "willy_pete_mp"; - level.dev_grenade[ 5 ] = "proximity_grenade_mp"; - level.dev_grenade[ 6 ] = "flash_grenade_mp"; - level.dev_grenade[ 7 ] = "concussion_grenade_mp"; - level.dev_grenade[ 8 ] = "nightingale_mp"; - level.dev_grenade[ 9 ] = "emp_grenade_mp"; - level.dev_grenade[ 10 ] = "sensor_grenade_mp"; + if ( isdefined( level.dev_grenade ) ) + return; + + level.dev_grenade = []; + level.dev_grenade[1] = "frag_grenade_mp"; + level.dev_grenade[2] = "sticky_grenade_mp"; + level.dev_grenade[3] = "hatchet_mp"; + level.dev_grenade[4] = "willy_pete_mp"; + level.dev_grenade[5] = "proximity_grenade_mp"; + level.dev_grenade[6] = "flash_grenade_mp"; + level.dev_grenade[7] = "concussion_grenade_mp"; + level.dev_grenade[8] = "nightingale_mp"; + level.dev_grenade[9] = "emp_grenade_mp"; + level.dev_grenade[10] = "sensor_grenade_mp"; #/ } take_all_grenades_and_equipment( player ) { /# - i = 0; - while ( i < level.dev_equipment.size ) - { - player takeweapon( level.dev_equipment[ i + 1 ] ); - i++; - } - i = 0; - while ( i < level.dev_grenade.size ) - { - player takeweapon( level.dev_grenade[ i + 1 ] ); - i++; + for ( i = 0; i < level.dev_equipment.size; i++ ) + player takeweapon( level.dev_equipment[i + 1] ); + + for ( i = 0; i < level.dev_grenade.size; i++ ) + player takeweapon( level.dev_grenade[i + 1] ); #/ - } } equipment_dev_gui() { /# - set_equipment_list(); - set_grenade_list(); - setdvar( "scr_give_equipment", "" ); - while ( 1 ) - { - wait 0,5; - devgui_int = getDvarInt( "scr_give_equipment" ); - if ( devgui_int != 0 ) - { - i = 0; - while ( i < level.players.size ) - { - take_all_grenades_and_equipment( level.players[ i ] ); - level.players[ i ] giveweapon( level.dev_equipment[ devgui_int ] ); - i++; - } - setdvar( "scr_give_equipment", "0" ); - } + set_equipment_list(); + set_grenade_list(); + setdvar( "scr_give_equipment", "" ); + + while ( true ) + { + wait 0.5; + devgui_int = getdvarint( "scr_give_equipment" ); + + if ( devgui_int != 0 ) + { + for ( i = 0; i < level.players.size; i++ ) + { + take_all_grenades_and_equipment( level.players[i] ); + level.players[i] giveweapon( level.dev_equipment[devgui_int] ); + } + + setdvar( "scr_give_equipment", "0" ); + } + } #/ - } } grenade_dev_gui() { /# - set_equipment_list(); - set_grenade_list(); - setdvar( "scr_give_grenade", "" ); - while ( 1 ) - { - wait 0,5; - devgui_int = getDvarInt( "scr_give_grenade" ); - if ( devgui_int != 0 ) - { - i = 0; - while ( i < level.players.size ) - { - take_all_grenades_and_equipment( level.players[ i ] ); - level.players[ i ] giveweapon( level.dev_grenade[ devgui_int ] ); - i++; - } - setdvar( "scr_give_grenade", "0" ); - } + set_equipment_list(); + set_grenade_list(); + setdvar( "scr_give_grenade", "" ); + + while ( true ) + { + wait 0.5; + devgui_int = getdvarint( "scr_give_grenade" ); + + if ( devgui_int != 0 ) + { + for ( i = 0; i < level.players.size; i++ ) + { + take_all_grenades_and_equipment( level.players[i] ); + level.players[i] giveweapon( level.dev_grenade[devgui_int] ); + } + + setdvar( "scr_give_grenade", "0" ); + } + } #/ - } } force_grenade_throw( weapon ) { /# - setdvar( "bot_AllowMovement", "0" ); - setdvar( "bot_PressAttackBtn", "0" ); - setdvar( "bot_PressMeleeBtn", "0" ); - setdvar( "scr_botsAllowKillstreaks", "0" ); - host = gethostplayer(); - if ( !isDefined( host.team ) ) - { - iprintln( "Unable to determine host player team" ); - return; - } - bot = getormakebot( getotherteam( host.team ) ); - if ( !isDefined( bot ) ) - { - iprintln( "Could not add test client" ); - return; - } - angles = host getplayerangles(); - angles = ( 0, angles[ 1 ], 0 ); - dir = anglesToForward( angles ); - dir = vectornormalize( dir ); - origin = host geteye() + vectorScale( dir, 256 ); - velocity = vectorScale( dir, -1024 ); - grenade = bot magicgrenade( weapon, origin, velocity ); - grenade setteam( bot.team ); - grenade setowner( bot ); + setdvar( "bot_AllowMovement", "0" ); + setdvar( "bot_PressAttackBtn", "0" ); + setdvar( "bot_PressMeleeBtn", "0" ); + setdvar( "scr_botsAllowKillstreaks", "0" ); + host = gethostplayer(); + + if ( !isdefined( host.team ) ) + { + iprintln( "Unable to determine host player team" ); + return; + } + + bot = getormakebot( getotherteam( host.team ) ); + + if ( !isdefined( bot ) ) + { + iprintln( "Could not add test client" ); + return; + } + + angles = host getplayerangles(); + angles = ( 0, angles[1], 0 ); + dir = anglestoforward( angles ); + dir = vectornormalize( dir ); + origin = host geteye() + vectorscale( dir, 256 ); + velocity = vectorscale( dir, -1024 ); + grenade = bot magicgrenade( weapon, origin, velocity ); + grenade setteam( bot.team ); + grenade setowner( bot ); #/ } bot_dpad_think() { /# - level notify( "bot_dpad_stop" ); - level endon( "bot_dpad_stop" ); - level endon( "bot_dpad_terminate" ); - if ( !isDefined( level.bot_index ) ) - { - level.bot_index = 0; - } - host = gethostplayer(); - while ( !isDefined( host ) ) - { - wait 0,5; - host = gethostplayer(); - level.bot_index = 0; - } - dpad_left = 0; - dpad_right = 0; - for ( ;; ) - { - wait 0,05; - host setactionslot( 3, "" ); - host setactionslot( 4, "" ); - players = get_players(); - max = players.size; - if ( !dpad_left && host buttonpressed( "DPAD_LEFT" ) ) - { - level.bot_index--; + level notify( "bot_dpad_stop" ); + level endon( "bot_dpad_stop" ); + level endon( "bot_dpad_terminate" ); - if ( level.bot_index < 0 ) - { - level.bot_index = max - 1; - } - if ( !players[ level.bot_index ] is_bot() ) - { - continue; - } - else dpad_left = 1; - } - else - { - if ( !host buttonpressed( "DPAD_LEFT" ) ) - { - dpad_left = 0; - } - } - if ( !dpad_right && host buttonpressed( "DPAD_RIGHT" ) ) - { - level.bot_index++; - if ( level.bot_index >= max ) - { - level.bot_index = 0; - } - if ( !players[ level.bot_index ] is_bot() ) - { - continue; - } - else - { - dpad_right = 1; - } - else - { - if ( !host buttonpressed( "DPAD_RIGHT" ) ) - { - dpad_right = 0; - } - } - level notify( "bot_index_changed" ); - } + if ( !isdefined( level.bot_index ) ) + level.bot_index = 0; + + host = gethostplayer(); + + while ( !isdefined( host ) ) + { + wait 0.5; + host = gethostplayer(); + level.bot_index = 0; + } + + dpad_left = 0; + dpad_right = 0; + + for (;;) + { + wait 0.05; + host setactionslot( 3, "" ); + host setactionslot( 4, "" ); + players = get_players(); + max = players.size; + + if ( !dpad_left && host buttonpressed( "DPAD_LEFT" ) ) + { + level.bot_index--; + + if ( level.bot_index < 0 ) + level.bot_index = max - 1; + + if ( !players[level.bot_index] is_bot() ) + continue; + + dpad_left = 1; + } + else if ( !host buttonpressed( "DPAD_LEFT" ) ) + dpad_left = 0; + + if ( !dpad_right && host buttonpressed( "DPAD_RIGHT" ) ) + { + level.bot_index++; + + if ( level.bot_index >= max ) + level.bot_index = 0; + + if ( !players[level.bot_index] is_bot() ) + continue; + + dpad_right = 1; + } + else if ( !host buttonpressed( "DPAD_RIGHT" ) ) + dpad_right = 0; + + level notify( "bot_index_changed" ); + } #/ - } } bot_overlay_think() { /# - level endon( "bot_overlay_stop" ); - level thread bot_dpad_think(); - iprintln( "Previous Bot bound to D-Pad Left" ); - iprintln( "Next Bot bound to D-Pad Right" ); - for ( ;; ) - { - if ( getDvarInt( "bot_Debug" ) != level.bot_index ) - { - setdvar( "bot_Debug", level.bot_index ); - } - level waittill( "bot_index_changed" ); + level endon( "bot_overlay_stop" ); + level thread bot_dpad_think(); + iprintln( "Previous Bot bound to D-Pad Left" ); + iprintln( "Next Bot bound to D-Pad Right" ); + + for (;;) + { + if ( getdvarint( "bot_Debug" ) != level.bot_index ) + setdvar( "bot_Debug", level.bot_index ); + + level waittill( "bot_index_changed" ); + } #/ - } } bot_threat_think() { /# - level endon( "bot_threat_stop" ); - level thread bot_dpad_think(); - iprintln( "Previous Bot bound to D-Pad Left" ); - iprintln( "Next Bot bound to D-Pad Right" ); - for ( ;; ) - { - if ( getDvarInt( "bot_DebugThreat" ) != level.bot_index ) - { - setdvar( "bot_DebugThreat", level.bot_index ); - } - level waittill( "bot_index_changed" ); + level endon( "bot_threat_stop" ); + level thread bot_dpad_think(); + iprintln( "Previous Bot bound to D-Pad Left" ); + iprintln( "Next Bot bound to D-Pad Right" ); + + for (;;) + { + if ( getdvarint( "bot_DebugThreat" ) != level.bot_index ) + setdvar( "bot_DebugThreat", level.bot_index ); + + level waittill( "bot_index_changed" ); + } #/ - } } bot_path_think() { /# - level endon( "bot_path_stop" ); - level thread bot_dpad_think(); - iprintln( "Previous Bot bound to D-Pad Left" ); - iprintln( "Next Bot bound to D-Pad Right" ); - for ( ;; ) - { - if ( getDvarInt( "bot_DebugPaths" ) != level.bot_index ) - { - setdvar( "bot_DebugPaths", level.bot_index ); - } - level waittill( "bot_index_changed" ); + level endon( "bot_path_stop" ); + level thread bot_dpad_think(); + iprintln( "Previous Bot bound to D-Pad Left" ); + iprintln( "Next Bot bound to D-Pad Right" ); + + for (;;) + { + if ( getdvarint( "bot_DebugPaths" ) != level.bot_index ) + setdvar( "bot_DebugPaths", level.bot_index ); + + level waittill( "bot_index_changed" ); + } #/ - } } bot_overlay_stop() { /# - level notify( "bot_overlay_stop" ); - setdvar( "bot_Debug", "-1" ); + level notify( "bot_overlay_stop" ); + setdvar( "bot_Debug", "-1" ); #/ } bot_path_stop() { /# - level notify( "bot_path_stop" ); - setdvar( "bot_DebugPaths", "-1" ); + level notify( "bot_path_stop" ); + setdvar( "bot_DebugPaths", "-1" ); #/ } bot_threat_stop() { /# - level notify( "bot_threat_stop" ); - setdvar( "bot_DebugThreat", "-1" ); + level notify( "bot_threat_stop" ); + setdvar( "bot_DebugThreat", "-1" ); #/ } devstraferunpathdebugdraw() { /# - white = ( 0, 1, 0 ); - red = ( 0, 1, 0 ); - green = ( 0, 1, 0 ); - blue = ( 0, 1, 0 ); - violet = ( 0,4, 0, 0,6 ); - maxdrawtime = 10; - drawtime = maxdrawtime; - origintextoffset = vectorScale( ( 0, 1, 0 ), 50 ); - endonmsg = "devStopStrafeRunPathDebugDraw"; - while ( 1 ) - { - if ( getDvarInt( "scr_devStrafeRunPathDebugDraw" ) > 0 ) - { - nodes = []; - end = 0; - node = getvehiclenode( "warthog_start", "targetname" ); - while ( !isDefined( node ) ) - { - println( "No strafe run path found" ); - setdvar( "scr_devStrafeRunPathDebugDraw", "0" ); - } - while ( isDefined( node.target ) ) - { - new_node = getvehiclenode( node.target, "targetname" ); - _a3325 = nodes; - _k3325 = getFirstArrayKey( _a3325 ); - while ( isDefined( _k3325 ) ) - { - n = _a3325[ _k3325 ]; - if ( n == new_node ) - { - end = 1; - } - _k3325 = getNextArrayKey( _a3325, _k3325 ); - } - textscale = 30; - if ( drawtime == maxdrawtime ) - { - node thread drawpathsegment( new_node, violet, violet, 1, textscale, origintextoffset, drawtime, endonmsg ); - } - if ( isDefined( node.script_noteworthy ) ) - { - textscale = 10; - switch( node.script_noteworthy ) - { - case "strafe_start": - textcolor = green; - textalpha = 1; - break; - case "strafe_stop": - textcolor = red; - textalpha = 1; - break; - case "strafe_leave": - textcolor = white; - textalpha = 1; - break; - } - switch( node.script_noteworthy ) - { - case "strafe_leave": - case "strafe_start": - case "strafe_stop": - sides = 10; - radius = 100; - if ( drawtime == maxdrawtime ) - { - sphere( node.origin, radius, textcolor, textalpha, 1, sides, drawtime * 1000 ); - } - node draworiginlines(); - node drawnoteworthytext( textcolor, textalpha, textscale ); - break; - break; - } - } - if ( end ) - { - break; - } - else nodes[ nodes.size ] = new_node; - node = new_node; - } - drawtime -= 0,05; - if ( drawtime < 0 ) - { - drawtime = maxdrawtime; - } - wait 0,05; - continue; - } - else - { - wait 1; - } + white = ( 1, 1, 1 ); + red = ( 1, 0, 0 ); + green = ( 0, 1, 0 ); + blue = ( 0, 0, 1 ); + violet = ( 0.4, 0, 0.6 ); + maxdrawtime = 10; + drawtime = maxdrawtime; + origintextoffset = vectorscale( ( 0, 0, -1 ), 50.0 ); + endonmsg = "devStopStrafeRunPathDebugDraw"; + + while ( true ) + { + if ( getdvarint( "scr_devStrafeRunPathDebugDraw" ) > 0 ) + { + nodes = []; + end = 0; + node = getvehiclenode( "warthog_start", "targetname" ); + + if ( !isdefined( node ) ) + { + println( "No strafe run path found" ); + setdvar( "scr_devStrafeRunPathDebugDraw", "0" ); + continue; + } + + while ( isdefined( node.target ) ) + { + new_node = getvehiclenode( node.target, "targetname" ); + + foreach ( n in nodes ) + { + if ( n == new_node ) + end = 1; + } + + textscale = 30; + + if ( drawtime == maxdrawtime ) + node thread drawpathsegment( new_node, violet, violet, 1, textscale, origintextoffset, drawtime, endonmsg ); + + if ( isdefined( node.script_noteworthy ) ) + { + textscale = 10; + + switch ( node.script_noteworthy ) + { + case "strafe_start": + textcolor = green; + textalpha = 1; + break; + case "strafe_stop": + textcolor = red; + textalpha = 1; + break; + case "strafe_leave": + textcolor = white; + textalpha = 1; + break; + } + + switch ( node.script_noteworthy ) + { + case "strafe_stop": + case "strafe_start": + case "strafe_leave": + sides = 10; + radius = 100; + + if ( drawtime == maxdrawtime ) + sphere( node.origin, radius, textcolor, textalpha, 1, sides, drawtime * 1000 ); + + node draworiginlines(); + node drawnoteworthytext( textcolor, textalpha, textscale ); + break; + } + } + + if ( end ) + break; + + nodes[nodes.size] = new_node; + node = new_node; + } + + drawtime -= 0.05; + + if ( drawtime < 0 ) + drawtime = maxdrawtime; + + wait 0.05; + } + else + wait 1; + } #/ - } } devhelipathdebugdraw() { /# - white = ( 0, 1, 0 ); - red = ( 0, 1, 0 ); - green = ( 0, 1, 0 ); - blue = ( 0, 1, 0 ); - textcolor = white; - textalpha = 1; - textscale = 1; - maxdrawtime = 10; - drawtime = maxdrawtime; - origintextoffset = vectorScale( ( 0, 1, 0 ), 50 ); - endonmsg = "devStopHeliPathsDebugDraw"; - while ( 1 ) - { - if ( getDvarInt( "scr_devHeliPathsDebugDraw" ) > 0 ) - { - script_origins = getentarray( "script_origin", "classname" ); - _a3424 = script_origins; - _k3424 = getFirstArrayKey( _a3424 ); - while ( isDefined( _k3424 ) ) - { - ent = _a3424[ _k3424 ]; - if ( isDefined( ent.targetname ) ) - { - switch( ent.targetname ) - { - case "heli_start": - textcolor = blue; - textalpha = 1; - textscale = 3; - break; - case "heli_loop_start": - textcolor = green; - textalpha = 1; - textscale = 3; - break; - case "heli_attack_area": - textcolor = red; - textalpha = 1; - textscale = 3; - break; - case "heli_leave": - textcolor = white; - textalpha = 1; - textscale = 3; - break; - } - switch( ent.targetname ) - { - case "heli_attack_area": - case "heli_leave": - case "heli_loop_start": - case "heli_start": - if ( drawtime == maxdrawtime ) - { - ent thread drawpath( textcolor, white, textalpha, textscale, origintextoffset, drawtime, endonmsg ); - } - ent draworiginlines(); - ent drawtargetnametext( textcolor, textalpha, textscale ); - ent draworigintext( textcolor, textalpha, textscale, origintextoffset ); - break; - break; - } - } - _k3424 = getNextArrayKey( _a3424, _k3424 ); - } - drawtime -= 0,05; - if ( drawtime < 0 ) - { - drawtime = maxdrawtime; - } - } - if ( getDvarInt( "scr_devHeliPathsDebugDraw" ) == 0 ) - { - level notify( endonmsg ); - drawtime = maxdrawtime; - wait 1; - } - wait 0,05; + white = ( 1, 1, 1 ); + red = ( 1, 0, 0 ); + green = ( 0, 1, 0 ); + blue = ( 0, 0, 1 ); + textcolor = white; + textalpha = 1; + textscale = 1; + maxdrawtime = 10; + drawtime = maxdrawtime; + origintextoffset = vectorscale( ( 0, 0, -1 ), 50.0 ); + endonmsg = "devStopHeliPathsDebugDraw"; + + while ( true ) + { + if ( getdvarint( "scr_devHeliPathsDebugDraw" ) > 0 ) + { + script_origins = getentarray( "script_origin", "classname" ); + + foreach ( ent in script_origins ) + { + if ( isdefined( ent.targetname ) ) + { + switch ( ent.targetname ) + { + case "heli_start": + textcolor = blue; + textalpha = 1; + textscale = 3; + break; + case "heli_loop_start": + textcolor = green; + textalpha = 1; + textscale = 3; + break; + case "heli_attack_area": + textcolor = red; + textalpha = 1; + textscale = 3; + break; + case "heli_leave": + textcolor = white; + textalpha = 1; + textscale = 3; + break; + } + + switch ( ent.targetname ) + { + case "heli_start": + case "heli_loop_start": + case "heli_leave": + case "heli_attack_area": + if ( drawtime == maxdrawtime ) + ent thread drawpath( textcolor, white, textalpha, textscale, origintextoffset, drawtime, endonmsg ); + + ent draworiginlines(); + ent drawtargetnametext( textcolor, textalpha, textscale ); + ent draworigintext( textcolor, textalpha, textscale, origintextoffset ); + continue; + } + } + } + + drawtime -= 0.05; + + if ( drawtime < 0 ) + drawtime = maxdrawtime; + } + + if ( getdvarint( "scr_devHeliPathsDebugDraw" ) == 0 ) + { + level notify( endonmsg ); + drawtime = maxdrawtime; + wait 1; + } + + wait 0.05; + } #/ - } } draworiginlines() { /# - red = ( 0, 1, 0 ); - green = ( 0, 1, 0 ); - blue = ( 0, 1, 0 ); - line( self.origin, self.origin + ( anglesToForward( self.angles ) * 10 ), red ); - line( self.origin, self.origin + ( anglesToRight( self.angles ) * 10 ), green ); - line( self.origin, self.origin + ( anglesToUp( self.angles ) * 10 ), blue ); + red = ( 1, 0, 0 ); + green = ( 0, 1, 0 ); + blue = ( 0, 0, 1 ); + line( self.origin, self.origin + anglestoforward( self.angles ) * 10, red ); + line( self.origin, self.origin + anglestoright( self.angles ) * 10, green ); + line( self.origin, self.origin + anglestoup( self.angles ) * 10, blue ); #/ } drawtargetnametext( textcolor, textalpha, textscale, textoffset ) { /# - if ( !isDefined( textoffset ) ) - { - textoffset = ( 0, 1, 0 ); - } - print3d( self.origin + textoffset, self.targetname, textcolor, textalpha, textscale ); + if ( !isdefined( textoffset ) ) + textoffset = ( 0, 0, 0 ); + + print3d( self.origin + textoffset, self.targetname, textcolor, textalpha, textscale ); #/ } drawnoteworthytext( textcolor, textalpha, textscale, textoffset ) { /# - if ( !isDefined( textoffset ) ) - { - textoffset = ( 0, 1, 0 ); - } - print3d( self.origin + textoffset, self.script_noteworthy, textcolor, textalpha, textscale ); + if ( !isdefined( textoffset ) ) + textoffset = ( 0, 0, 0 ); + + print3d( self.origin + textoffset, self.script_noteworthy, textcolor, textalpha, textscale ); #/ } draworigintext( textcolor, textalpha, textscale, textoffset ) { /# - if ( !isDefined( textoffset ) ) - { - textoffset = ( 0, 1, 0 ); - } - originstring = "(" + self.origin[ 0 ] + ", " + self.origin[ 1 ] + ", " + self.origin[ 2 ] + ")"; - print3d( self.origin + textoffset, originstring, textcolor, textalpha, textscale ); + if ( !isdefined( textoffset ) ) + textoffset = ( 0, 0, 0 ); + + originstring = "(" + self.origin[0] + ", " + self.origin[1] + ", " + self.origin[2] + ")"; + print3d( self.origin + textoffset, originstring, textcolor, textalpha, textscale ); #/ } drawspeedacceltext( textcolor, textalpha, textscale, textoffset ) { /# - if ( isDefined( self.script_airspeed ) ) - { - print3d( self.origin + ( 0, 0, textoffset[ 2 ] * 2 ), "script_airspeed:" + self.script_airspeed, textcolor, textalpha, textscale ); - } - if ( isDefined( self.script_accel ) ) - { - print3d( self.origin + ( 0, 0, textoffset[ 2 ] * 3 ), "script_accel:" + self.script_accel, textcolor, textalpha, textscale ); + if ( isdefined( self.script_airspeed ) ) + print3d( self.origin + ( 0, 0, textoffset[2] * 2 ), "script_airspeed:" + self.script_airspeed, textcolor, textalpha, textscale ); + + if ( isdefined( self.script_accel ) ) + print3d( self.origin + ( 0, 0, textoffset[2] * 3 ), "script_accel:" + self.script_accel, textcolor, textalpha, textscale ); #/ - } } drawpath( linecolor, textcolor, textalpha, textscale, textoffset, drawtime, endonmsg ) { /# - level endon( endonmsg ); - ent = self; - entfirsttarget = ent.targetname; - while ( isDefined( ent.target ) ) - { - enttarget = getent( ent.target, "targetname" ); - ent thread drawpathsegment( enttarget, linecolor, textcolor, textalpha, textscale, textoffset, drawtime, endonmsg ); - if ( ent.targetname == "heli_loop_start" ) - { - entfirsttarget = ent.target; - } - else - { - if ( ent.target == entfirsttarget ) - { - return; - } - } - else - { - ent = enttarget; - wait 0,05; + level endon( endonmsg ); + ent = self; + entfirsttarget = ent.targetname; + + while ( isdefined( ent.target ) ) + { + enttarget = getent( ent.target, "targetname" ); + ent thread drawpathsegment( enttarget, linecolor, textcolor, textalpha, textscale, textoffset, drawtime, endonmsg ); + + if ( ent.targetname == "heli_loop_start" ) + entfirsttarget = ent.target; + else if ( ent.target == entfirsttarget ) + break; + + ent = enttarget; + wait 0.05; + } #/ - } - } } drawpathsegment( enttarget, linecolor, textcolor, textalpha, textscale, textoffset, drawtime, endonmsg ) { /# - level endon( endonmsg ); - while ( drawtime > 0 ) - { - if ( isDefined( self.targetname ) && self.targetname == "warthog_start" ) - { - print3d( self.origin + textoffset, self.targetname, textcolor, textalpha, textscale ); - } - line( self.origin, enttarget.origin, linecolor ); - self drawspeedacceltext( textcolor, textalpha, textscale, textoffset ); - drawtime -= 0,05; - wait 0,05; + level endon( endonmsg ); + + while ( drawtime > 0 ) + { + if ( isdefined( self.targetname ) && self.targetname == "warthog_start" ) + print3d( self.origin + textoffset, self.targetname, textcolor, textalpha, textscale ); + + line( self.origin, enttarget.origin, linecolor ); + self drawspeedacceltext( textcolor, textalpha, textscale, textoffset ); + drawtime -= 0.05; + wait 0.05; + } #/ - } } get_lookat_origin( player ) { /# - angles = player getplayerangles(); - forward = anglesToForward( angles ); - dir = vectorScale( forward, 8000 ); - eye = player geteye(); - trace = bullettrace( eye, eye + dir, 0, undefined ); - return trace[ "position" ]; + angles = player getplayerangles(); + forward = anglestoforward( angles ); + dir = vectorscale( forward, 8000 ); + eye = player geteye(); + trace = bullettrace( eye, eye + dir, 0, undefined ); + return trace["position"]; #/ } draw_pathnode( node, color ) { /# - if ( !isDefined( color ) ) - { - color = ( 0, 1, 0 ); - } - box( node.origin, vectorScale( ( 0, 1, 0 ), 16 ), vectorScale( ( 0, 1, 0 ), 16 ), 0, color, 1, 0, 1 ); + if ( !isdefined( color ) ) + color = ( 1, 0, 1 ); + + box( node.origin, vectorscale( ( -1, -1, 0 ), 16.0 ), vectorscale( ( 1, 1, 1 ), 16.0 ), 0, color, 1, 0, 1 ); #/ } draw_pathnode_think( node, color ) { /# - level endon( "draw_pathnode_stop" ); - for ( ;; ) - { - draw_pathnode( node, color ); - wait 0,05; + level endon( "draw_pathnode_stop" ); + + for (;;) + { + draw_pathnode( node, color ); + wait 0.05; + } #/ - } } draw_pathnodes_stop() { /# - wait 5; - level notify( "draw_pathnode_stop" ); + wait 5; + level notify( "draw_pathnode_stop" ); #/ } node_get( player ) { /# - for ( ;; ) - { - wait 0,05; - origin = get_lookat_origin( player ); - node = getnearestnode( origin ); - if ( !isDefined( node ) ) - { - continue; - } - else if ( player buttonpressed( "BUTTON_A" ) ) - { - return node; - } - else - { - if ( player buttonpressed( "BUTTON_B" ) ) - { - return undefined; - } - } - if ( node.type == "Path" ) - { - draw_pathnode( node, ( 0, 1, 0 ) ); - continue; - } - else - { - draw_pathnode( node, ( 0,85, 0,85, 0,1 ) ); - } + for (;;) + { + wait 0.05; + origin = get_lookat_origin( player ); + node = getnearestnode( origin ); + + if ( !isdefined( node ) ) + continue; + + if ( player buttonpressed( "BUTTON_A" ) ) + return node; + else if ( player buttonpressed( "BUTTON_B" ) ) + return undefined; + + if ( node.type == "Path" ) + { + draw_pathnode( node, ( 1, 0, 1 ) ); + continue; + } + + draw_pathnode( node, ( 0.85, 0.85, 0.1 ) ); + } #/ - } } dev_get_node_pair() { /# - player = gethostplayer(); - start = undefined; - while ( !isDefined( start ) ) - { - start = node_get( player ); - if ( player buttonpressed( "BUTTON_B" ) ) - { - level notify( "draw_pathnode_stop" ); - return undefined; - } - } - level thread draw_pathnode_think( start, ( 0, 1, 0 ) ); - while ( player buttonpressed( "BUTTON_A" ) ) - { - wait 0,05; - } - end = undefined; - while ( !isDefined( end ) ) - { - end = node_get( player ); - if ( player buttonpressed( "BUTTON_B" ) ) - { - level notify( "draw_pathnode_stop" ); - return undefined; - } - } - level thread draw_pathnode_think( end, ( 0, 1, 0 ) ); - level thread draw_pathnodes_stop(); - array = []; - array[ 0 ] = start; - array[ 1 ] = end; - return array; + player = gethostplayer(); + start = undefined; + + while ( !isdefined( start ) ) + { + start = node_get( player ); + + if ( player buttonpressed( "BUTTON_B" ) ) + { + level notify( "draw_pathnode_stop" ); + return undefined; + } + } + + level thread draw_pathnode_think( start, ( 0, 1, 0 ) ); + + while ( player buttonpressed( "BUTTON_A" ) ) + wait 0.05; + + end = undefined; + + while ( !isdefined( end ) ) + { + end = node_get( player ); + + if ( player buttonpressed( "BUTTON_B" ) ) + { + level notify( "draw_pathnode_stop" ); + return undefined; + } + } + + level thread draw_pathnode_think( end, ( 0, 1, 0 ) ); + level thread draw_pathnodes_stop(); + array = []; + array[0] = start; + array[1] = end; + return array; #/ } diff --git a/Multiplayer Core/patch_mp/maps/mp/gametypes/_dev_class.gsc b/Multiplayer Core/patch_mp/maps/mp/gametypes/_dev_class.gsc index 688d59c..d538569 100644 --- a/Multiplayer Core/patch_mp/maps/mp/gametypes/_dev_class.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/gametypes/_dev_class.gsc @@ -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(); #/ } diff --git a/Multiplayer Core/patch_mp/maps/mp/gametypes/_friendicons.gsc b/Multiplayer Core/patch_mp/maps/mp/gametypes/_friendicons.gsc index 59bc9ce..b9ff4ce 100644 --- a/Multiplayer Core/patch_mp/maps/mp/gametypes/_friendicons.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/gametypes/_friendicons.gsc @@ -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 = ""; + } + } + } +} diff --git a/Multiplayer Core/patch_mp/maps/mp/gametypes/_gameobjects.gsc b/Multiplayer Core/patch_mp/maps/mp/gametypes/_gameobjects.gsc index 72715f9..a3c83f3 100644 --- a/Multiplayer Core/patch_mp/maps/mp/gametypes/_gameobjects.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/gametypes/_gameobjects.gsc @@ -1,2753 +1,2577 @@ -//checked includes match cerberus output -#include maps/mp/gametypes/_tweakables; -#include maps/mp/killstreaks/_radar; -#include maps/mp/killstreaks/_killstreaks; -#include maps/mp/gametypes/_hostmigration; -#include maps/mp/gametypes/_weapons; -#include maps/mp/gametypes/_objpoints; -#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 -main( allowed ) //checked changed to match cerberus output +main( allowed ) { - level.vehiclesenabled = getgametypesetting( "vehiclesEnabled" ); - level.vehiclestimed = getgametypesetting( "vehiclesTimed" ); - level.objectivepingdelay = getgametypesetting( "objectivePingTime" ); - level.nonteambasedteam = "allies"; - /* + level.vehiclesenabled = getgametypesetting( "vehiclesEnabled" ); + level.vehiclestimed = getgametypesetting( "vehiclesTimed" ); + level.objectivepingdelay = getgametypesetting( "objectivePingTime" ); + level.nonteambasedteam = "allies"; /# - if ( level.script == "mp_vehicle_test" ) - { - level.vehiclesenabled = 1; + if ( level.script == "mp_vehicle_test" ) + level.vehiclesenabled = 1; #/ - } - */ - if ( level.vehiclesenabled ) - { - allowed[ allowed.size ] = "vehicle"; - filter_script_vehicles_from_vehicle_descriptors( allowed ); - } - entities = getentarray(); - for ( entity_index = entities.size - 1; entity_index >= 0; entity_index-- ) - { - entity = entities[ entity_index ]; - if ( !entity_is_allowed( entity, allowed ) ) - { - entity delete(); - } - } - return; + if ( level.vehiclesenabled ) + { + allowed[allowed.size] = "vehicle"; + filter_script_vehicles_from_vehicle_descriptors( allowed ); + } + + entities = getentarray(); + + for ( entity_index = entities.size - 1; entity_index >= 0; entity_index-- ) + { + entity = entities[entity_index]; + + if ( !entity_is_allowed( entity, allowed ) ) + entity delete(); + } + + return; } -entity_is_allowed( entity, allowed_game_modes ) //checked changed to match cerberus output +entity_is_allowed( entity, allowed_game_modes ) { - if ( is_true( level.createfx_enabled ) ) - { - return 1; - } - allowed = 1; - if ( isDefined( entity.script_gameobjectname ) && entity.script_gameobjectname != "[all_modes]" ) - { - allowed = 0; - gameobjectnames = strtok( entity.script_gameobjectname, " " ); - for ( i = 0; i < allowed_game_modes.size && !allowed; i++ ) - { - for ( j = 0; j < gameobjectnames.size && !allowed; j++ ) - { - allowed = gameobjectnames[ j ] == allowed_game_modes[ i ]; - } - } - } - return allowed; + if ( isdefined( level.createfx_enabled ) && level.createfx_enabled ) + return 1; + + allowed = 1; + + if ( isdefined( entity.script_gameobjectname ) && entity.script_gameobjectname != "[all_modes]" ) + { + allowed = 0; + gameobjectnames = strtok( entity.script_gameobjectname, " " ); + + for ( i = 0; i < allowed_game_modes.size && !allowed; i++ ) + { + for ( j = 0; j < gameobjectnames.size && !allowed; j++ ) + allowed = gameobjectnames[j] == allowed_game_modes[i]; + } + } + + return allowed; } -filter_script_vehicles_from_vehicle_descriptors( allowed_game_modes ) //checked changed to match cerberus output +filter_script_vehicles_from_vehicle_descriptors( allowed_game_modes ) { - vehicle_descriptors = getentarray( "vehicle_descriptor", "targetname" ); - script_vehicles = getentarray( "script_vehicle", "classname" ); - vehicles_to_remove = []; - for ( descriptor_index = 0; descriptor_index < vehicle_descriptors.size; descriptor_index++ ) - { - descriptor = vehicle_descriptors[ descriptor_index ]; - closest_distance_sq = 1E+12; - closest_vehicle = undefined; - for ( vehicle_index = 0; vehicle_index < script_vehicles.size; vehicle_index++ ) - { - vehicle = script_vehicles[ vehicle_index ]; - dsquared = distancesquared( vehicle getorigin(), descriptor getorigin() ); - if ( dsquared < closest_distance_sq ) - { - closest_distance_sq = dsquared; - closest_vehicle = vehicle; - } - } - if ( isDefined( closest_vehicle ) ) - { - if ( !entity_is_allowed( descriptor, allowed_game_modes ) ) - { - vehicles_to_remove[ vehicles_to_remove.size ] = closest_vehicle; - } - } - } - for ( vehicle_index = 0; vehicle_index < vehicles_to_remove.size; vehicle_index++ ) - { - vehicles_to_remove[ vehicle_index ] delete(); - } - return; + vehicle_descriptors = getentarray( "vehicle_descriptor", "targetname" ); + script_vehicles = getentarray( "script_vehicle", "classname" ); + vehicles_to_remove = []; + + for ( descriptor_index = 0; descriptor_index < vehicle_descriptors.size; descriptor_index++ ) + { + descriptor = vehicle_descriptors[descriptor_index]; + closest_distance_sq = 1e+12; + closest_vehicle = undefined; + + for ( vehicle_index = 0; vehicle_index < script_vehicles.size; vehicle_index++ ) + { + vehicle = script_vehicles[vehicle_index]; + dsquared = distancesquared( vehicle getorigin(), descriptor getorigin() ); + + if ( dsquared < closest_distance_sq ) + { + closest_distance_sq = dsquared; + closest_vehicle = vehicle; + } + } + + if ( isdefined( closest_vehicle ) ) + { + if ( !entity_is_allowed( descriptor, allowed_game_modes ) ) + vehicles_to_remove[vehicles_to_remove.size] = closest_vehicle; + } + } + + for ( vehicle_index = 0; vehicle_index < vehicles_to_remove.size; vehicle_index++ ) + vehicles_to_remove[vehicle_index] delete(); + + return; } -init() //checked matches cerberus output +init() { - level.numgametypereservedobjectives = 0; - level.releasedobjectives = []; - if ( !sessionmodeiszombiesgame() ) - { - precacheitem( "briefcase_bomb_mp" ); - precacheitem( "briefcase_bomb_defuse_mp" ); - } - level thread onplayerconnect(); + level.numgametypereservedobjectives = 0; + level.releasedobjectives = []; + + if ( !sessionmodeiszombiesgame() ) + { + precacheitem( "briefcase_bomb_mp" ); + precacheitem( "briefcase_bomb_defuse_mp" ); + } + + level thread onplayerconnect(); } -onplayerconnect() //checked matches cerberus output +onplayerconnect() { - level endon( "game_ended" ); - for ( ;; ) - { - level waittill( "connecting", player ); - player thread onplayerspawned(); - player thread ondisconnect(); - } + level endon( "game_ended" ); + + for (;;) + { + level waittill( "connecting", player ); + + player thread onplayerspawned(); + player thread ondisconnect(); + } } -onplayerspawned() //checked matches cerberus output +onplayerspawned() { - self endon( "disconnect" ); - level endon( "game_ended" ); - for ( ;; ) - { - self waittill( "spawned_player" ); - self thread ondeath(); - self.touchtriggers = []; - self.carryobject = undefined; - self.claimtrigger = undefined; - self.canpickupobject = 1; - self.disabledweapon = 0; - self.killedinuse = undefined; - } + self endon( "disconnect" ); + level endon( "game_ended" ); + + for (;;) + { + self waittill( "spawned_player" ); + + self thread ondeath(); + self.touchtriggers = []; + self.carryobject = undefined; + self.claimtrigger = undefined; + self.canpickupobject = 1; + self.disabledweapon = 0; + self.killedinuse = undefined; + } } -ondeath() //checked matches cerberus output +ondeath() { - level endon( "game_ended" ); - self waittill( "death" ); - if ( isDefined( self.carryobject ) ) - { - self.carryobject thread setdropped(); - } + level endon( "game_ended" ); + + self waittill( "death" ); + + if ( isdefined( self.carryobject ) ) + self.carryobject thread setdropped(); } -ondisconnect() //checked matches cerberus output +ondisconnect() { - level endon( "game_ended" ); - self waittill( "disconnect" ); - if ( isDefined( self.carryobject ) ) - { - self.carryobject thread setdropped(); - } + level endon( "game_ended" ); + + self waittill( "disconnect" ); + + if ( isdefined( self.carryobject ) ) + self.carryobject thread setdropped(); } -createcarryobject( ownerteam, trigger, visuals, offset, objectivename ) //checked changed to match cerberus output +createcarryobject( ownerteam, trigger, visuals, offset, objectivename ) { - carryobject = spawnstruct(); - carryobject.type = "carryObject"; - carryobject.curorigin = trigger.origin; - carryobject.ownerteam = ownerteam; - carryobject.entnum = trigger getentitynumber(); - if ( issubstr( trigger.classname, "use" ) ) - { - carryobject.triggertype = "use"; - } - else - { - carryobject.triggertype = "proximity"; - } - trigger.baseorigin = trigger.origin; - carryobject.trigger = trigger; - carryobject.useweapon = undefined; - if ( !isDefined( offset ) ) - { - offset = ( 0, 0, 0 ); - } - carryobject.offset3d = offset; - carryobject.newstyle = 0; - if ( isDefined( objectivename ) ) - { - carryobject.newstyle = 1; - } - else - { - objectivename = &""; - } - for ( index = 0; index < visuals.size; index++ ) - { - visuals[ index ].baseorigin = visuals[ index ].origin; - visuals[ index ].baseangles = visuals[ index ].angles; - } - carryobject.visuals = visuals; - carryobject.compassicons = []; - carryobject.objid = []; - if ( !carryobject.newstyle ) - { - foreach ( team in level.teams ) - { - carryobject.objid[ team ] = getnextobjid(); - } - } - carryobject.objidpingfriendly = 0; - carryobject.objidpingenemy = 0; - level.objidstart += 2; - if ( !carryobject.newstyle ) - { - if ( level.teambased ) - { - foreach ( team in level.teams ) - { - objective_add( carryobject.objid[ team ], "invisible", carryobject.curorigin ); - objective_team( carryobject.objid[ team ], team ); - carryobject.objpoints[ team ] = maps/mp/gametypes/_objpoints::createteamobjpoint( "objpoint_" + team + "_" + carryobject.entnum, carryobject.curorigin + offset, team, undefined ); - carryobject.objpoints[ team ].alpha = 0; - } - } - else - { - objective_add( carryobject.objid[ level.nonteambasedteam ], "invisible", carryobject.curorigin ); - carryobject.objpoints[ level.nonteambasedteam ] = maps/mp/gametypes/_objpoints::createteamobjpoint( "objpoint_" + level.nonteambasedteam + "_" + carryobject.entnum, carryobject.curorigin + offset, "all", undefined ); - carryobject.objpoints[ level.nonteambasedteam ].alpha = 0; - } - } - carryobject.objectiveid = getnextobjid(); - objective_add( carryobject.objectiveid, "invisible", carryobject.curorigin, objectivename ); - carryobject.carrier = undefined; - carryobject.isresetting = 0; - carryobject.interactteam = "none"; - carryobject.allowweapons = 0; - carryobject.visiblecarriermodel = undefined; - carryobject.worldicons = []; - carryobject.carriervisible = 0; - carryobject.visibleteam = "none"; - carryobject.worldiswaypoint = []; - carryobject.carryicon = undefined; - carryobject.ondrop = undefined; - carryobject.onpickup = undefined; - carryobject.onreset = undefined; - if ( carryobject.triggertype == "use" ) - { - carryobject thread carryobjectusethink(); - } - else - { - carryobject.numtouching[ "neutral" ] = 0; - carryobject.numtouching[ "none" ] = 0; - carryobject.touchlist[ "neutral" ] = []; - carryobject.touchlist[ "none" ] = []; - foreach ( team in level.teams ) - { - carryobject.numtouching[ team ] = 0; - carryobject.touchlist[ team ] = []; - } - carryobject.curprogress = 0; - carryobject.usetime = 0; - carryobject.userate = 0; - carryobject.claimteam = "none"; - carryobject.claimplayer = undefined; - carryobject.lastclaimteam = "none"; - carryobject.lastclaimtime = 0; - carryobject.claimgraceperiod = 0; - carryobject.mustmaintainclaim = 0; - carryobject.cancontestclaim = 0; - carryobject.decayprogress = 0; - carryobject.teamusetimes = []; - carryobject.teamusetexts = []; - carryobject.onuse = ::setpickedup; - carryobject thread useobjectproxthink(); - } - carryobject thread updatecarryobjectorigin(); - carryobject thread updatecarryobjectobjectiveorigin(); - return carryobject; + carryobject = spawnstruct(); + carryobject.type = "carryObject"; + carryobject.curorigin = trigger.origin; + carryobject.ownerteam = ownerteam; + carryobject.entnum = trigger getentitynumber(); + + if ( issubstr( trigger.classname, "use" ) ) + carryobject.triggertype = "use"; + else + carryobject.triggertype = "proximity"; + + trigger.baseorigin = trigger.origin; + carryobject.trigger = trigger; + carryobject.useweapon = undefined; + + if ( !isdefined( offset ) ) + offset = ( 0, 0, 0 ); + + carryobject.offset3d = offset; + carryobject.newstyle = 0; + + if ( isdefined( objectivename ) ) + carryobject.newstyle = 1; + else + objectivename = &""; + + for ( index = 0; index < visuals.size; index++ ) + { + visuals[index].baseorigin = visuals[index].origin; + visuals[index].baseangles = visuals[index].angles; + } + + carryobject.visuals = visuals; + carryobject.compassicons = []; + carryobject.objid = []; + + if ( !carryobject.newstyle ) + { + foreach ( team in level.teams ) + carryobject.objid[team] = getnextobjid(); + } + + carryobject.objidpingfriendly = 0; + carryobject.objidpingenemy = 0; + level.objidstart += 2; + + if ( !carryobject.newstyle ) + { + if ( level.teambased ) + { + foreach ( team in level.teams ) + { + objective_add( carryobject.objid[team], "invisible", carryobject.curorigin ); + objective_team( carryobject.objid[team], team ); + carryobject.objpoints[team] = maps\mp\gametypes\_objpoints::createteamobjpoint( "objpoint_" + team + "_" + carryobject.entnum, carryobject.curorigin + offset, team, undefined ); + carryobject.objpoints[team].alpha = 0; + } + } + else + { + objective_add( carryobject.objid[level.nonteambasedteam], "invisible", carryobject.curorigin ); + carryobject.objpoints[level.nonteambasedteam] = maps\mp\gametypes\_objpoints::createteamobjpoint( "objpoint_" + level.nonteambasedteam + "_" + carryobject.entnum, carryobject.curorigin + offset, "all", undefined ); + carryobject.objpoints[level.nonteambasedteam].alpha = 0; + } + } + + carryobject.objectiveid = getnextobjid(); + objective_add( carryobject.objectiveid, "invisible", carryobject.curorigin, objectivename ); + carryobject.carrier = undefined; + carryobject.isresetting = 0; + carryobject.interactteam = "none"; + carryobject.allowweapons = 0; + carryobject.visiblecarriermodel = undefined; + carryobject.worldicons = []; + carryobject.carriervisible = 0; + carryobject.visibleteam = "none"; + carryobject.worldiswaypoint = []; + carryobject.carryicon = undefined; + carryobject.ondrop = undefined; + carryobject.onpickup = undefined; + carryobject.onreset = undefined; + + if ( carryobject.triggertype == "use" ) + carryobject thread carryobjectusethink(); + else + { + carryobject.numtouching["neutral"] = 0; + carryobject.numtouching["none"] = 0; + carryobject.touchlist["neutral"] = []; + carryobject.touchlist["none"] = []; + + foreach ( team in level.teams ) + { + carryobject.numtouching[team] = 0; + carryobject.touchlist[team] = []; + } + + carryobject.curprogress = 0; + carryobject.usetime = 0; + carryobject.userate = 0; + carryobject.claimteam = "none"; + carryobject.claimplayer = undefined; + carryobject.lastclaimteam = "none"; + carryobject.lastclaimtime = 0; + carryobject.claimgraceperiod = 0; + carryobject.mustmaintainclaim = 0; + carryobject.cancontestclaim = 0; + carryobject.decayprogress = 0; + carryobject.teamusetimes = []; + carryobject.teamusetexts = []; + carryobject.onuse = ::setpickedup; + carryobject thread useobjectproxthink(); + } + + carryobject thread updatecarryobjectorigin(); + carryobject thread updatecarryobjectobjectiveorigin(); + return carryobject; } -carryobjectusethink() //checked changed to match cerberus output +carryobjectusethink() { - level endon( "game_ended" ); - self.trigger endon( "destroyed" ); - while ( 1 ) - { - self.trigger waittill( "trigger", player ); - if ( self.isresetting ) - { - continue; - } - if ( !isalive( player ) ) - { - continue; - } - if ( is_true( player.laststand ) ) - { - continue; - } - if ( !self caninteractwith( player ) ) - { - continue; - } - if ( !player.canpickupobject ) - { - continue; - } - if ( player.throwinggrenade ) - { - continue; - } - if ( isDefined( self.carrier ) ) - { - continue; - } - if ( player isinvehicle() ) - { - continue; - } - if ( player isweaponviewonlylinked() ) - { - continue; - } - if ( !player istouching( self.trigger ) ) - { - continue; - } - self setpickedup( player ); - } + level endon( "game_ended" ); + self.trigger endon( "destroyed" ); + + while ( true ) + { + self.trigger waittill( "trigger", player ); + + if ( self.isresetting ) + continue; + + if ( !isalive( player ) ) + continue; + + if ( isdefined( player.laststand ) && player.laststand ) + continue; + + if ( !self caninteractwith( player ) ) + continue; + + if ( !player.canpickupobject ) + continue; + + if ( player.throwinggrenade ) + continue; + + if ( isdefined( self.carrier ) ) + continue; + + if ( player isinvehicle() ) + continue; + + if ( player isweaponviewonlylinked() ) + continue; + + if ( !player istouching( self.trigger ) ) + continue; + + self setpickedup( player ); + } } -carryobjectproxthink() //checked changed to match cerberus output +carryobjectproxthink() { - level endon( "game_ended" ); - self.trigger endon( "destroyed" ); - while ( 1 ) - { - self.trigger waittill( "trigger", player ); - if ( self.isresetting ) - { - continue; - } - if ( !isalive( player ) ) - { - continue; - } - if ( is_true( player.laststand ) ) - { - continue; - } - if ( !self caninteractwith( player ) ) - { - continue; - } - if ( !player.canpickupobject ) - { - continue; - } - if ( player.throwinggrenade ) - { - continue; - } - if ( isDefined( self.carrier ) ) - { - continue; - } - if ( player isinvehicle() ) - { - continue; - } - if ( player isweaponviewonlylinked() ) - { - continue; - } - if ( !player istouching( self.trigger ) ) - { - continue; - } - self setpickedup( player ); - } + level endon( "game_ended" ); + self.trigger endon( "destroyed" ); + + while ( true ) + { + self.trigger waittill( "trigger", player ); + + if ( self.isresetting ) + continue; + + if ( !isalive( player ) ) + continue; + + if ( isdefined( player.laststand ) && player.laststand ) + continue; + + if ( !self caninteractwith( player ) ) + continue; + + if ( !player.canpickupobject ) + continue; + + if ( player.throwinggrenade ) + continue; + + if ( isdefined( self.carrier ) ) + continue; + + if ( player isinvehicle() ) + continue; + + if ( player isweaponviewonlylinked() ) + continue; + + if ( !player istouching( self.trigger ) ) + continue; + + self setpickedup( player ); + } } -pickupobjectdelay( origin ) //checked changed to match beta dump +pickupobjectdelay( origin ) { - level endon( "game_ended" ); - self endon( "death" ); - self endon( "disconnect" ); - self.canpickupobject = 0; - for ( ;; ) - { - if ( distancesquared( self.origin, origin ) > 4096 ) - { - break; - } - wait 0.2; - } - self.canpickupobject = 1; + level endon( "game_ended" ); + self endon( "death" ); + self endon( "disconnect" ); + self.canpickupobject = 0; + + for (;;) + { + if ( distancesquared( self.origin, origin ) > 4096 ) + break; + + wait 0.2; + } + + self.canpickupobject = 1; } -setpickedup( player ) //checked changed to match cerberus output +setpickedup( player ) { - if ( !isalive( player ) ) - { - return; - } - if ( isDefined( player.carryobject ) ) - { - if ( is_true( player.carryobject.swappable ) ) - { - player.carryobject thread setdropped(); - } - else if ( isDefined( self.onpickupfailed ) ) - { - self [[ self.onpickupfailed ]]( player ); - } - return; - } - player giveobject( self ); - self setcarrier( player ); - for ( index = 0; index < self.visuals.size; index++ ) - { - self.visuals[ index ] thread hideobject(); - } - self.trigger.origin += vectorScale( ( 0, 0, 1 ), 10000 ); - self notify( "pickup_object" ); - if ( isDefined( self.onpickup ) ) - { - self [[ self.onpickup ]]( player ); - } - self updatecompassicons(); - self updateworldicons(); - self updateobjective(); + if ( !isalive( player ) ) + return; + + if ( isdefined( player.carryobject ) ) + { + if ( is_true( player.carryobject.swappable ) ) + player.carryobject thread setdropped(); + else + { + if ( isdefined( self.onpickupfailed ) ) + self [[ self.onpickupfailed ]]( player ); + + return; + } + } + + player giveobject( self ); + self setcarrier( player ); + + for ( index = 0; index < self.visuals.size; index++ ) + self.visuals[index] thread hideobject(); + + self.trigger.origin += vectorscale( ( 0, 0, 1 ), 10000.0 ); + self notify( "pickup_object" ); + + if ( isdefined( self.onpickup ) ) + self [[ self.onpickup ]]( player ); + + self updatecompassicons(); + self updateworldicons(); + self updateobjective(); } -hideobject() //checked changed to match cerberus output +hideobject() { - radius = 32; - origin = self.origin; - grenades = getentarray( "grenade", "classname" ); - radiussq = radius * radius; - linkedgrenades = []; - linkedgrenadesindex = 0; - self hide(); - for ( i = 0; i < grenades.size; i++ ) - { - if ( distancesquared( origin, grenades[ i ].origin ) < radiussq ) - { - if ( grenades[ i ] islinkedto( self ) ) - { - linkedgrenades[ linkedgrenadesindex ] = grenades[ i ]; - linkedgrenades[ linkedgrenadesindex ] unlink(); - linkedgrenadesindex++; - } - } - } - self.origin += vectorScale( ( 0, 0, 1 ), 10000 ); - waittillframeend; - for ( i = 0; i < linkedgrenadesindex; i++ ) - { - linkedgrenades[ i ] launch( vectorScale( ( 1, 1, 1 ), 5 ) ); - } + radius = 32; + origin = self.origin; + grenades = getentarray( "grenade", "classname" ); + radiussq = radius * radius; + linkedgrenades = []; + linkedgrenadesindex = 0; + self hide(); + + for ( i = 0; i < grenades.size; i++ ) + { + if ( distancesquared( origin, grenades[i].origin ) < radiussq ) + { + if ( grenades[i] islinkedto( self ) ) + { + linkedgrenades[linkedgrenadesindex] = grenades[i]; + linkedgrenades[linkedgrenadesindex] unlink(); + linkedgrenadesindex++; + } + } + } + + self.origin += vectorscale( ( 0, 0, 1 ), 10000.0 ); + waittillframeend; + + for ( i = 0; i < linkedgrenadesindex; i++ ) + linkedgrenades[i] launch( vectorscale( ( 1, 1, 1 ), 5.0 ) ); } -updatecarryobjectorigin() //checked changed to match beta dump +updatecarryobjectorigin() { - level endon( "game_ended" ); - self.trigger endon( "destroyed" ); - if ( self.newstyle ) - { - return; - } - objpingdelay = level.objectivepingdelay; - for ( ;; ) - { - if ( isDefined( self.carrier ) && level.teambased ) - { - self.curorigin = self.carrier.origin + vectorScale( ( 0, 0, 1 ), 75 ); - foreach ( team in level.teams ) - { - self.objpoints[ team ] maps/mp/gametypes/_objpoints::updateorigin( self.curorigin ); - } - if ( ( self.visibleteam == "friendly" || self.visibleteam == "any" ) && self.objidpingfriendly ) - { - foreach ( team in level.teams ) - { - if ( self isfriendlyteam( team ) ) - { - if ( self.objpoints[ team ].isshown ) - { - self.objpoints[ team ].alpha = self.objpoints[ team ].basealpha; - self.objpoints[ team ] fadeovertime( objpingdelay + 1 ); - self.objpoints[ team ].alpha = 0; - } - objective_position( self.objid[ team ], self.curorigin ); - } - } - } - if ( ( self.visibleteam == "enemy" && self.visibleteam == "any" ) && self.objidpingenemy ) - { - if ( !self isfriendlyteam( team ) ) - { - if ( self.objpoints[ team ].isshown ) - { - self.objpoints[ team ].alpha = self.objpoints[ team ].basealpha; - self.objpoints[ team ] fadeovertime( objpingdelay + 1 ); - self.objpoints[ team ].alpha = 0; - } - objective_position( self.objid[ team ], self.curorigin ); - } - } - self wait_endon( objpingdelay, "dropped", "reset" ); - } - else if ( isDefined( self.carrier ) ) - { - self.curorigin = self.carrier.origin + vectorScale( ( 0, 0, 1 ), 75 ); - self.objpoints[ level.nonteambasedteam ] maps/mp/gametypes/_objpoints::updateorigin( self.curorigin ); - objective_position( self.objid[ level.nonteambasedteam ], self.curorigin ); - wait 0.05; - } - else - { - if ( level.teambased ) - { - foreach ( team in level.teams ) - { - self.objpoints[ team ] maps/mp/gametypes/_objpoints::updateorigin( self.curorigin + self.offset3d ); - } - } - else - { - self.objpoints[ level.nonteambasedteam ] maps/mp/gametypes/_objpoints::updateorigin( self.curorigin + self.offset3d ); - } - wait 0.05; - } - } + level endon( "game_ended" ); + self.trigger endon( "destroyed" ); + + if ( self.newstyle ) + return; + + objpingdelay = level.objectivepingdelay; + + for (;;) + { + if ( isdefined( self.carrier ) && level.teambased ) + { + self.curorigin = self.carrier.origin + vectorscale( ( 0, 0, 1 ), 75.0 ); + + foreach ( team in level.teams ) + self.objpoints[team] maps\mp\gametypes\_objpoints::updateorigin( self.curorigin ); + + if ( ( self.visibleteam == "friendly" || self.visibleteam == "any" ) && self.objidpingfriendly ) + { + foreach ( team in level.teams ) + { + if ( self isfriendlyteam( team ) ) + { + if ( self.objpoints[team].isshown ) + { + self.objpoints[team].alpha = self.objpoints[team].basealpha; + self.objpoints[team] fadeovertime( objpingdelay + 1.0 ); + self.objpoints[team].alpha = 0; + } + + objective_position( self.objid[team], self.curorigin ); + } + } + } + + if ( ( self.visibleteam == "enemy" || self.visibleteam == "any" ) && self.objidpingenemy ) + { + if ( !self isfriendlyteam( team ) ) + { + if ( self.objpoints[team].isshown ) + { + self.objpoints[team].alpha = self.objpoints[team].basealpha; + self.objpoints[team] fadeovertime( objpingdelay + 1.0 ); + self.objpoints[team].alpha = 0; + } + + objective_position( self.objid[team], self.curorigin ); + } + } + + self wait_endon( objpingdelay, "dropped", "reset" ); + continue; + } + + if ( isdefined( self.carrier ) ) + { + self.curorigin = self.carrier.origin + vectorscale( ( 0, 0, 1 ), 75.0 ); + self.objpoints[level.nonteambasedteam] maps\mp\gametypes\_objpoints::updateorigin( self.curorigin ); + objective_position( self.objid[level.nonteambasedteam], self.curorigin ); + wait 0.05; + continue; + } + + if ( level.teambased ) + { + foreach ( team in level.teams ) + self.objpoints[team] maps\mp\gametypes\_objpoints::updateorigin( self.curorigin + self.offset3d ); + } + else + self.objpoints[level.nonteambasedteam] maps\mp\gametypes\_objpoints::updateorigin( self.curorigin + self.offset3d ); + + wait 0.05; + } } -updatecarryobjectobjectiveorigin() //checked changed to match beta dump +updatecarryobjectobjectiveorigin() { - level endon( "game_ended" ); - self.trigger endon( "destroyed" ); - if ( !self.newstyle ) - { - return; - } - objpingdelay = level.objectivepingdelay; - for ( ;; ) - { - if ( isDefined( self.carrier ) ) - { - self.curorigin = self.carrier.origin; - objective_position( self.objectiveid, self.curorigin ); - self wait_endon( objpingdelay, "dropped", "reset" ); - } - else - { - objective_position( self.objectiveid, self.curorigin ); - wait 0.05; - } - } + level endon( "game_ended" ); + self.trigger endon( "destroyed" ); + + if ( !self.newstyle ) + return; + + objpingdelay = level.objectivepingdelay; + + for (;;) + { + if ( isdefined( self.carrier ) ) + { + self.curorigin = self.carrier.origin; + objective_position( self.objectiveid, self.curorigin ); + self wait_endon( objpingdelay, "dropped", "reset" ); + continue; + } + + objective_position( self.objectiveid, self.curorigin ); + wait 0.05; + } } -giveobject( object ) //checked changed to match beta dump +giveobject( object ) { - /* /# - assert( !isDefined( self.carryobject ) ); + assert( !isdefined( self.carryobject ) ); #/ - */ - self.carryobject = object; - self thread trackcarrier(); - if ( !object.allowweapons ) - { - self _disableweapon(); - self thread manualdropthink(); - } - self.disallowvehicleusage = 1; - if ( isDefined( object.visiblecarriermodel ) ) - { - self maps/mp/gametypes/_weapons::forcestowedweaponupdate(); - } - if ( !object.newstyle ) - { - if ( isDefined( object.carryicon ) ) - { - if ( self issplitscreen() ) - { - self.carryicon = createicon( object.carryicon, 35, 35 ); - self.carryicon.x = -130; - self.carryicon.y = -90; - self.carryicon.horzalign = "right"; - self.carryicon.vertalign = "bottom"; - } - else - { - self.carryicon = createicon( object.carryicon, 50, 50 ); - if ( !object.allowweapons ) - { - self.carryicon setpoint( "CENTER", "CENTER", 0, 60 ); - } - else - { - self.carryicon.x = 130; - self.carryicon.y = -60; - self.carryicon.horzalign = "user_left"; - self.carryicon.vertalign = "user_bottom"; - } - } - self.carryicon.alpha = 0.75; - self.carryicon.hidewhileremotecontrolling = 1; - self.carryicon.hidewheninkillcam = 1; - } - } + self.carryobject = object; + self thread trackcarrier(); + + if ( !object.allowweapons ) + { + self _disableweapon(); + self thread manualdropthink(); + } + + self.disallowvehicleusage = 1; + + if ( isdefined( object.visiblecarriermodel ) ) + self maps\mp\gametypes\_weapons::forcestowedweaponupdate(); + + if ( !object.newstyle ) + { + if ( isdefined( object.carryicon ) ) + { + if ( self issplitscreen() ) + { + self.carryicon = createicon( object.carryicon, 35, 35 ); + self.carryicon.x = -130; + self.carryicon.y = -90; + self.carryicon.horzalign = "right"; + self.carryicon.vertalign = "bottom"; + } + else + { + self.carryicon = createicon( object.carryicon, 50, 50 ); + + if ( !object.allowweapons ) + self.carryicon setpoint( "CENTER", "CENTER", 0, 60 ); + else + { + self.carryicon.x = 130; + self.carryicon.y = -60; + self.carryicon.horzalign = "user_left"; + self.carryicon.vertalign = "user_bottom"; + } + } + + self.carryicon.alpha = 0.75; + self.carryicon.hidewhileremotecontrolling = 1; + self.carryicon.hidewheninkillcam = 1; + } + } } -returnhome() //checked changed to match cerberus output +returnhome() { - self.isresetting = 1; - self notify( "reset" ); - for ( index = 0; index < self.visuals.size; index++ ) - { - self.visuals[ index ].origin = self.visuals[ index ].baseorigin; - self.visuals[ index ].angles = self.visuals[ index ].baseangles; - self.visuals[ index ] show(); - } - self.trigger.origin = self.trigger.baseorigin; - self.curorigin = self.trigger.origin; - if ( isDefined( self.onreset ) ) - { - self [[ self.onreset ]](); - } - self clearcarrier(); - updateworldicons(); - updatecompassicons(); - updateobjective(); - self.isresetting = 0; + self.isresetting = 1; + self notify( "reset" ); + + for ( index = 0; index < self.visuals.size; index++ ) + { + self.visuals[index].origin = self.visuals[index].baseorigin; + self.visuals[index].angles = self.visuals[index].baseangles; + self.visuals[index] show(); + } + + self.trigger.origin = self.trigger.baseorigin; + self.curorigin = self.trigger.origin; + + if ( isdefined( self.onreset ) ) + self [[ self.onreset ]](); + + self clearcarrier(); + updateworldicons(); + updatecompassicons(); + updateobjective(); + self.isresetting = 0; } -isobjectawayfromhome() //checked matches cerberus output +isobjectawayfromhome() { - if ( isDefined( self.carrier ) ) - { - return 1; - } - if ( distancesquared( self.trigger.origin, self.trigger.baseorigin ) > 4 ) - { - return 1; - } - return 0; + if ( isdefined( self.carrier ) ) + return true; + + if ( distancesquared( self.trigger.origin, self.trigger.baseorigin ) > 4 ) + return true; + + return false; } -setposition( origin, angles ) //checked changed to match cerberus output +setposition( origin, angles ) { - self.isresetting = 1; - for ( index = 0; index < self.visuals.size; index++ ) - { - visual = self.visuals[ index ]; - visual.origin = origin; - visual.angles = angles; - visual show(); - } - self.trigger.origin = origin; - self.curorigin = self.trigger.origin; - self clearcarrier(); - updateworldicons(); - updatecompassicons(); - updateobjective(); - self.isresetting = 0; + self.isresetting = 1; + + for ( index = 0; index < self.visuals.size; index++ ) + { + visual = self.visuals[index]; + visual.origin = origin; + visual.angles = angles; + visual show(); + } + + self.trigger.origin = origin; + self.curorigin = self.trigger.origin; + self clearcarrier(); + updateworldicons(); + updatecompassicons(); + updateobjective(); + self.isresetting = 0; } -onplayerlaststand() //checked matches cerberus output +onplayerlaststand() { - if ( isDefined( self.carryobject ) ) - { - self.carryobject thread setdropped(); - } + if ( isdefined( self.carryobject ) ) + self.carryobject thread setdropped(); } -setdropped() //checked changed to match cerberus output +setdropped() { - self.isresetting = 1; - self notify( "dropped" ); - startorigin = ( 0, 0, 0 ); - endorigin = ( 0, 0, 0 ); - body = undefined; - if ( isDefined( self.carrier ) && self.carrier.team != "spectator" ) - { - startorigin = self.carrier.origin + vectorScale( ( 0, 0, 1 ), 20 ); - endorigin = self.carrier.origin - vectorScale( ( 0, 0, 1 ), 2000 ); - body = self.carrier.body; - self.visuals[ 0 ].origin = self.carrier.origin; - } - else - { - startorigin = self.safeorigin + vectorScale( ( 0, 0, 1 ), 20 ); - endorigin = self.safeorigin - vectorScale( ( 0, 0, 1 ), 20 ); - } - trace = playerphysicstrace( startorigin, endorigin ); - angletrace = bullettrace( startorigin, endorigin, 0, body ); - droppingplayer = self.carrier; - if ( isDefined( trace ) ) - { - tempangle = randomfloat( 360 ); - droporigin = trace; - if ( angletrace[ "fraction" ] < 1 && distance( angletrace[ "position" ], trace ) < 10 ) - { - forward = ( cos( tempangle ), sin( tempangle ), 0 ); - forward = vectornormalize( forward - vectorScale( angletrace[ "normal" ], vectordot( forward, angletrace[ "normal" ] ) ) ); - dropangles = vectorToAngle( forward ); - } - else - { - dropangles = ( 0, tempangle, 0 ); - } - for ( index = 0; index < self.visuals.size; index++ ) - { - self.visuals[ index ].origin = droporigin; - self.visuals[ index ].angles = dropangles; - self.visuals[ index ] show(); - } - self.trigger.origin = droporigin; - self.curorigin = self.trigger.origin; - self thread pickuptimeout( trace[ 2 ], startorigin[ 2 ] ); - } - else - { - for ( index = 0; index < self.visuals.size; index++ ) - { - self.visuals[ index ].origin = self.visuals[ index ].baseorigin; - self.visuals[ index ].angles = self.visuals[ index ].baseangles; - self.visuals[ index ] show(); - } - self.trigger.origin = self.trigger.baseorigin; - self.curorigin = self.trigger.baseorigin; - } - if ( isDefined( self.ondrop ) ) - { - self [[ self.ondrop ]]( droppingplayer ); - } - self clearcarrier(); - self updatecompassicons(); - self updateworldicons(); - self updateobjective(); - self.isresetting = 0; + self.isresetting = 1; + self notify( "dropped" ); + startorigin = ( 0, 0, 0 ); + endorigin = ( 0, 0, 0 ); + body = undefined; + + if ( isdefined( self.carrier ) && self.carrier.team != "spectator" ) + { + startorigin = self.carrier.origin + vectorscale( ( 0, 0, 1 ), 20.0 ); + endorigin = self.carrier.origin - vectorscale( ( 0, 0, 1 ), 2000.0 ); + body = self.carrier.body; + self.visuals[0].origin = self.carrier.origin; + } + else + { + startorigin = self.safeorigin + vectorscale( ( 0, 0, 1 ), 20.0 ); + endorigin = self.safeorigin - vectorscale( ( 0, 0, 1 ), 20.0 ); + } + + trace = playerphysicstrace( startorigin, endorigin ); + angletrace = bullettrace( startorigin, endorigin, 0, body ); + droppingplayer = self.carrier; + + if ( isdefined( trace ) ) + { + tempangle = randomfloat( 360 ); + droporigin = trace; + + if ( angletrace["fraction"] < 1 && distance( angletrace["position"], trace ) < 10.0 ) + { + forward = ( cos( tempangle ), sin( tempangle ), 0 ); + forward = vectornormalize( forward - vectorscale( angletrace["normal"], vectordot( forward, angletrace["normal"] ) ) ); + dropangles = vectortoangles( forward ); + } + else + dropangles = ( 0, tempangle, 0 ); + + for ( index = 0; index < self.visuals.size; index++ ) + { + self.visuals[index].origin = droporigin; + self.visuals[index].angles = dropangles; + self.visuals[index] show(); + } + + self.trigger.origin = droporigin; + self.curorigin = self.trigger.origin; + self thread pickuptimeout( trace[2], startorigin[2] ); + } + else + { + for ( index = 0; index < self.visuals.size; index++ ) + { + self.visuals[index].origin = self.visuals[index].baseorigin; + self.visuals[index].angles = self.visuals[index].baseangles; + self.visuals[index] show(); + } + + self.trigger.origin = self.trigger.baseorigin; + self.curorigin = self.trigger.baseorigin; + } + + if ( isdefined( self.ondrop ) ) + self [[ self.ondrop ]]( droppingplayer ); + + self clearcarrier(); + self updatecompassicons(); + self updateworldicons(); + self updateobjective(); + self.isresetting = 0; } -setcarrier( carrier ) //checked matches cerberus output +setcarrier( carrier ) { - self.carrier = carrier; - objective_setplayerusing( self.objectiveid, carrier ); - self thread updatevisibilityaccordingtoradar(); + self.carrier = carrier; + objective_setplayerusing( self.objectiveid, carrier ); + self thread updatevisibilityaccordingtoradar(); } -clearcarrier() //checked matches cerberus output +clearcarrier() { - if ( !isDefined( self.carrier ) ) - { - return; - } - self.carrier takeobject( self ); - objective_clearplayerusing( self.objectiveid, self.carrier ); - self.carrier = undefined; - self notify( "carrier_cleared" ); + if ( !isdefined( self.carrier ) ) + return; + + self.carrier takeobject( self ); + objective_clearplayerusing( self.objectiveid, self.carrier ); + self.carrier = undefined; + self notify( "carrier_cleared" ); } -shouldbereset( minz, maxz ) //checked changed to match cerberus output +shouldbereset( minz, maxz ) { - minetriggers = getentarray( "minefield", "targetname" ); - hurttriggers = getentarray( "trigger_hurt", "classname" ); - elevators = getentarray( "script_elevator", "targetname" ); - for ( index = 0; index < minetriggers.size; index++ ) - { - if ( self.visuals[ 0 ] istouchingswept( minetriggers[ index ], minz, maxz ) ) - { - return 1; - } - } - for ( index = 0; index < hurttriggers.size; index++ ) - { - if ( self.visuals[ 0 ] istouchingswept( hurttriggers[ index ], minz, maxz ) ) - { - return 1; - } - } - for ( index = 0; index < elevators.size; index++ ) - { - /* + minetriggers = getentarray( "minefield", "targetname" ); + hurttriggers = getentarray( "trigger_hurt", "classname" ); + elevators = getentarray( "script_elevator", "targetname" ); + + for ( index = 0; index < minetriggers.size; index++ ) + { + if ( self.visuals[0] istouchingswept( minetriggers[index], minz, maxz ) ) + return true; + } + + for ( index = 0; index < hurttriggers.size; index++ ) + { + if ( self.visuals[0] istouchingswept( hurttriggers[index], minz, maxz ) ) + return true; + } + + for ( index = 0; index < elevators.size; index++ ) + { /# - assert( isDefined( elevators[ index ].occupy_volume ) ); + assert( isdefined( elevators[index].occupy_volume ) ); #/ - */ - if ( self.visuals[ 0 ] istouchingswept( elevators[ index ].occupy_volume, minz, maxz ) ) - { - return 1; - } - } - return 0; + + if ( self.visuals[0] istouchingswept( elevators[index].occupy_volume, minz, maxz ) ) + return true; + } + + return false; } -pickuptimeout( minz, maxz ) //checked matches cerberus output +pickuptimeout( minz, maxz ) { - self endon( "pickup_object" ); - self endon( "stop_pickup_timeout" ); - wait 0.05; - if ( self shouldbereset( minz, maxz ) ) - { - self returnhome(); - return; - } - if ( isDefined( self.autoresettime ) ) - { - wait self.autoresettime; - if ( !isDefined( self.carrier ) ) - { - self returnhome(); - } - } + self endon( "pickup_object" ); + self endon( "stop_pickup_timeout" ); + wait 0.05; + + if ( self shouldbereset( minz, maxz ) ) + { + self returnhome(); + return; + } + + if ( isdefined( self.autoresettime ) ) + { + wait( self.autoresettime ); + + if ( !isdefined( self.carrier ) ) + self returnhome(); + } } -takeobject( object ) //checked matches cerberus output +takeobject( object ) { - if ( isDefined( self.carryicon ) ) - { - self.carryicon destroyelem(); - } - if ( isDefined( object.visiblecarriermodel ) ) - { - self maps/mp/gametypes/_weapons::detach_all_weapons(); - } - self.carryobject = undefined; - if ( !isalive( self ) ) - { - return; - } - self notify( "drop_object" ); - self.disallowvehicleusage = 0; - if ( object.triggertype == "proximity" ) - { - self thread pickupobjectdelay( object.trigger.origin ); - } - if ( isDefined( object.visiblecarriermodel ) ) - { - self maps/mp/gametypes/_weapons::forcestowedweaponupdate(); - } - if ( !object.allowweapons ) - { - self _enableweapon(); - } + if ( isdefined( self.carryicon ) ) + self.carryicon destroyelem(); + + if ( isdefined( object.visiblecarriermodel ) ) + self maps\mp\gametypes\_weapons::detach_all_weapons(); + + self.carryobject = undefined; + + if ( !isalive( self ) ) + return; + + self notify( "drop_object" ); + self.disallowvehicleusage = 0; + + if ( object.triggertype == "proximity" ) + self thread pickupobjectdelay( object.trigger.origin ); + + if ( isdefined( object.visiblecarriermodel ) ) + self maps\mp\gametypes\_weapons::forcestowedweaponupdate(); + + if ( !object.allowweapons ) + self _enableweapon(); } -trackcarrier() //checked matches cerberus output +trackcarrier() { - level endon( "game_ended" ); - self endon( "disconnect" ); - self endon( "death" ); - self endon( "drop_object" ); - while ( isDefined( self.carryobject ) && isalive( self ) ) - { - if ( self isonground() ) - { - trace = bullettrace( self.origin + vectorScale( ( 0, 0, 1 ), 20 ), self.origin - vectorScale( ( 0, 0, 1 ), 20 ), 0, undefined ); - if ( trace[ "fraction" ] < 1 ) - { - self.carryobject.safeorigin = trace[ "position" ]; - } - } - wait 0.05; - } + level endon( "game_ended" ); + self endon( "disconnect" ); + self endon( "death" ); + self endon( "drop_object" ); + + while ( isdefined( self.carryobject ) && isalive( self ) ) + { + if ( self isonground() ) + { + trace = bullettrace( self.origin + vectorscale( ( 0, 0, 1 ), 20.0 ), self.origin - vectorscale( ( 0, 0, 1 ), 20.0 ), 0, undefined ); + + if ( trace["fraction"] < 1 ) + self.carryobject.safeorigin = trace["position"]; + } + + wait 0.05; + } } -manualdropthink() //checked changed to match beta dump +manualdropthink() { - level endon( "game_ended" ); - self endon( "disconnect" ); - self endon( "death" ); - self endon( "drop_object" ); - for ( ;; ) - { - while ( self attackbuttonpressed() || self fragbuttonpressed() || self secondaryoffhandbuttonpressed() || self meleebuttonpressed() ) - { - wait 0.05; - } - while ( !self attackbuttonpressed() && !self fragbuttonpressed() && !self secondaryoffhandbuttonpressed() && !self meleebuttonpressed() ) - { - wait 0.05; - } - if ( isDefined( self.carryobject ) && !self usebuttonpressed() ) - { - self.carryobject thread setdropped(); - } - } + level endon( "game_ended" ); + self endon( "disconnect" ); + self endon( "death" ); + self endon( "drop_object" ); + + for (;;) + { + while ( self attackbuttonpressed() || self fragbuttonpressed() || self secondaryoffhandbuttonpressed() || self meleebuttonpressed() ) + wait 0.05; + + while ( !self attackbuttonpressed() && !self fragbuttonpressed() && !self secondaryoffhandbuttonpressed() && !self meleebuttonpressed() ) + wait 0.05; + + if ( isdefined( self.carryobject ) && !self usebuttonpressed() ) + self.carryobject thread setdropped(); + } } -createuseobject( ownerteam, trigger, visuals, offset, objectivename ) //checked changed to match cerberus output +createuseobject( ownerteam, trigger, visuals, offset, objectivename ) { - useobject = spawnstruct(); - useobject.type = "useObject"; - useobject.curorigin = trigger.origin; - useobject.ownerteam = ownerteam; - useobject.entnum = trigger getentitynumber(); - useobject.keyobject = undefined; - if ( issubstr( trigger.classname, "use" ) ) - { - useobject.triggertype = "use"; - } - else - { - useobject.triggertype = "proximity"; - } - useobject.trigger = trigger; - for ( index = 0; index < visuals.size; index++ ) - { - visuals[ index ].baseorigin = visuals[ index ].origin; - visuals[ index ].baseangles = visuals[ index ].angles; - } - useobject.visuals = visuals; - if ( !isDefined( offset ) ) - { - offset = ( 0, 0, 0 ); - } - useobject.offset3d = offset; - useobject.newstyle = 0; - if ( isDefined( objectivename ) ) - { - useobject.newstyle = 1; - } - else - { - objectivename = &""; - } - useobject.compassicons = []; - useobject.objid = []; - if ( !useobject.newstyle ) - { - foreach ( team in level.teams ) - { - useobject.objid[ team ] = getnextobjid(); - } - if ( level.teambased ) - { - foreach ( team in level.teams ) - { - objective_add( useobject.objid[ team ], "invisible", useobject.curorigin ); - objective_team( useobject.objid[ team ], team ); - } - } - else - { - objective_add( useobject.objid[ level.nonteambasedteam ], "invisible", useobject.curorigin ); - } - } - useobject.objectiveid = getnextobjid(); - objective_add( useobject.objectiveid, "invisible", useobject.curorigin + offset, objectivename ); - if ( !useobject.newstyle ) - { - if ( level.teambased ) - { - foreach ( team in level.teams ) - { - useobject.objpoints[ team ] = maps/mp/gametypes/_objpoints::createteamobjpoint( "objpoint_" + team + "_" + useobject.entnum, useobject.curorigin + offset, team, undefined ); - useobject.objpoints[ team ].alpha = 0; - } - } - else - { - useobject.objpoints[ level.nonteambasedteam ] = maps/mp/gametypes/_objpoints::createteamobjpoint( "objpoint_allies_" + useobject.entnum, useobject.curorigin + offset, "all", undefined ); - useobject.objpoints[ level.nonteambasedteam ].alpha = 0; - } - } - useobject.interactteam = "none"; - useobject.worldicons = []; - useobject.visibleteam = "none"; - useobject.worldiswaypoint = []; - useobject.onuse = undefined; - useobject.oncantuse = undefined; - useobject.usetext = "default"; - useobject.usetime = 10000; - useobject clearprogress(); - useobject.decayprogress = 0; - if ( useobject.triggertype == "proximity" ) - { - useobject.numtouching[ "neutral" ] = 0; - useobject.numtouching[ "none" ] = 0; - useobject.touchlist[ "neutral" ] = []; - useobject.touchlist[ "none" ] = []; - foreach ( team in level.teams ) - { - useobject.numtouching[ team ] = 0; - useobject.touchlist[ team ] = []; - } - useobject.teamusetimes = []; - useobject.teamusetexts = []; - useobject.userate = 0; - useobject.claimteam = "none"; - useobject.claimplayer = undefined; - useobject.lastclaimteam = "none"; - useobject.lastclaimtime = 0; - useobject.claimgraceperiod = 1; - useobject.mustmaintainclaim = 0; - useobject.cancontestclaim = 0; - useobject thread useobjectproxthink(); - } - else - { - useobject.userate = 1; - useobject thread useobjectusethink(); - } - return useobject; + useobject = spawnstruct(); + useobject.type = "useObject"; + useobject.curorigin = trigger.origin; + useobject.ownerteam = ownerteam; + useobject.entnum = trigger getentitynumber(); + useobject.keyobject = undefined; + + if ( issubstr( trigger.classname, "use" ) ) + useobject.triggertype = "use"; + else + useobject.triggertype = "proximity"; + + useobject.trigger = trigger; + + for ( index = 0; index < visuals.size; index++ ) + { + visuals[index].baseorigin = visuals[index].origin; + visuals[index].baseangles = visuals[index].angles; + } + + useobject.visuals = visuals; + + if ( !isdefined( offset ) ) + offset = ( 0, 0, 0 ); + + useobject.offset3d = offset; + useobject.newstyle = 0; + + if ( isdefined( objectivename ) ) + useobject.newstyle = 1; + else + objectivename = &""; + + useobject.compassicons = []; + useobject.objid = []; + + if ( !useobject.newstyle ) + { + foreach ( team in level.teams ) + useobject.objid[team] = getnextobjid(); + + if ( level.teambased ) + { + foreach ( team in level.teams ) + { + objective_add( useobject.objid[team], "invisible", useobject.curorigin ); + objective_team( useobject.objid[team], team ); + } + } + else + objective_add( useobject.objid[level.nonteambasedteam], "invisible", useobject.curorigin ); + } + + useobject.objectiveid = getnextobjid(); + objective_add( useobject.objectiveid, "invisible", useobject.curorigin + offset, objectivename ); + + if ( !useobject.newstyle ) + { + if ( level.teambased ) + { + foreach ( team in level.teams ) + { + useobject.objpoints[team] = maps\mp\gametypes\_objpoints::createteamobjpoint( "objpoint_" + team + "_" + useobject.entnum, useobject.curorigin + offset, team, undefined ); + useobject.objpoints[team].alpha = 0; + } + } + else + { + useobject.objpoints[level.nonteambasedteam] = maps\mp\gametypes\_objpoints::createteamobjpoint( "objpoint_allies_" + useobject.entnum, useobject.curorigin + offset, "all", undefined ); + useobject.objpoints[level.nonteambasedteam].alpha = 0; + } + } + + useobject.interactteam = "none"; + useobject.worldicons = []; + useobject.visibleteam = "none"; + useobject.worldiswaypoint = []; + useobject.onuse = undefined; + useobject.oncantuse = undefined; + useobject.usetext = "default"; + useobject.usetime = 10000; + useobject clearprogress(); + useobject.decayprogress = 0; + + if ( useobject.triggertype == "proximity" ) + { + useobject.numtouching["neutral"] = 0; + useobject.numtouching["none"] = 0; + useobject.touchlist["neutral"] = []; + useobject.touchlist["none"] = []; + + foreach ( team in level.teams ) + { + useobject.numtouching[team] = 0; + useobject.touchlist[team] = []; + } + + useobject.teamusetimes = []; + useobject.teamusetexts = []; + useobject.userate = 0; + useobject.claimteam = "none"; + useobject.claimplayer = undefined; + useobject.lastclaimteam = "none"; + useobject.lastclaimtime = 0; + useobject.claimgraceperiod = 1.0; + useobject.mustmaintainclaim = 0; + useobject.cancontestclaim = 0; + useobject thread useobjectproxthink(); + } + else + { + useobject.userate = 1; + useobject thread useobjectusethink(); + } + + return useobject; } -setkeyobject( object ) //checked matches cerberus output +setkeyobject( object ) { - if ( !isDefined( object ) ) - { - self.keyobject = undefined; - return; - } - if ( !isDefined( self.keyobject ) ) - { - self.keyobject = []; - } - self.keyobject[ self.keyobject.size ] = object; + if ( !isdefined( object ) ) + { + self.keyobject = undefined; + return; + } + + if ( !isdefined( self.keyobject ) ) + self.keyobject = []; + + self.keyobject[self.keyobject.size] = object; } -haskeyobject( use ) //checked changed to match cerberus output +haskeyobject( use ) { - for ( x = 0; x < use.keyobject.size; x++ ) - { - if ( isDefined( self.carryobject ) && isDefined( use.keyobject[ x ] ) && self.carryobject == use.keyobject[ x ] ) - { - return 1; - } - } - return 0; + for ( x = 0; x < use.keyobject.size; x++ ) + { + if ( isdefined( self.carryobject ) && isdefined( use.keyobject[x] ) && self.carryobject == use.keyobject[x] ) + return true; + } + + return false; } -useobjectusethink() //checked changed to match cerberus output +useobjectusethink() { - level endon( "game_ended" ); - self.trigger endon( "destroyed" ); - while ( 1 ) - { - self.trigger waittill( "trigger", player ); - if ( !isalive( player ) ) - { - continue; - } - if ( !self caninteractwith( player ) ) - { - continue; - } - if ( !player isonground() ) - { - continue; - } - if ( player isinvehicle() ) - { - continue; - } - if ( isDefined( self.keyobject ) && !isDefined( player.carryobject ) || !player haskeyobject( self ) ) - { - if ( isDefined( self.oncantuse ) ) - { - self [[ self.oncantuse ]]( player ); - } - } - result = 1; - if ( self.usetime > 0 ) - { - if ( isDefined( self.onbeginuse ) ) - { - self [[ self.onbeginuse ]]( player ); - } - team = player.pers[ "team" ]; - result = self useholdthink( player ); - if ( isDefined( self.onenduse ) ) - { - self [[ self.onenduse ]]( team, player, result ); - } - } - if ( !result ) - { - continue; - } - if ( isDefined( self.onuse ) ) - { - self [[ self.onuse ]]( player ); - } - } + level endon( "game_ended" ); + self.trigger endon( "destroyed" ); + + while ( true ) + { + self.trigger waittill( "trigger", player ); + + if ( !isalive( player ) ) + continue; + + if ( !self caninteractwith( player ) ) + continue; + + if ( !player isonground() ) + continue; + + if ( player isinvehicle() ) + continue; + + if ( isdefined( self.keyobject ) && ( !isdefined( player.carryobject ) || !player haskeyobject( self ) ) ) + { + if ( isdefined( self.oncantuse ) ) + self [[ self.oncantuse ]]( player ); + + continue; + } + + result = 1; + + if ( self.usetime > 0 ) + { + if ( isdefined( self.onbeginuse ) ) + self [[ self.onbeginuse ]]( player ); + + team = player.pers["team"]; + result = self useholdthink( player ); + + if ( isdefined( self.onenduse ) ) + self [[ self.onenduse ]]( team, player, result ); + } + + if ( !result ) + continue; + + if ( isdefined( self.onuse ) ) + self [[ self.onuse ]]( player ); + } } -getearliestclaimplayer() //checked changed to match cerberus output +getearliestclaimplayer() { - /* /# - assert( self.claimteam != "none" ); + assert( self.claimteam != "none" ); #/ - */ - team = self.claimteam; - earliestplayer = self.claimplayer; - if ( self.touchlist[ team ].size > 0 ) - { - earliesttime = undefined; - players = getarraykeys( self.touchlist[ team ] ); - for ( index = 0; index < players.size; index++ ) - { - touchdata = self.touchlist[ team ][ players[ index ] ]; - if ( !isDefined( earliesttime ) || touchdata.starttime < earliesttime ) - { - earliestplayer = touchdata.player; - earliesttime = touchdata.starttime; - } - } - } - return earliestplayer; + team = self.claimteam; + earliestplayer = self.claimplayer; + + if ( self.touchlist[team].size > 0 ) + { + earliesttime = undefined; + players = getarraykeys( self.touchlist[team] ); + + for ( index = 0; index < players.size; index++ ) + { + touchdata = self.touchlist[team][players[index]]; + + if ( !isdefined( earliesttime ) || touchdata.starttime < earliesttime ) + { + earliestplayer = touchdata.player; + earliesttime = touchdata.starttime; + } + } + } + + return earliestplayer; } -useobjectproxthink() //checked changed to match beta dump +useobjectproxthink() { - level endon( "game_ended" ); - self.trigger endon( "destroyed" ); - self thread proxtriggerthink(); - while ( 1 ) - { - if ( self.usetime && self.curprogress >= self.usetime ) - { - self clearprogress(); - creditplayer = getearliestclaimplayer(); - if ( isDefined( self.onenduse ) ) - { - self [[ self.onenduse ]]( self getclaimteam(), creditplayer, isDefined( creditplayer ) ); - } - if ( isDefined( creditplayer ) && isDefined( self.onuse ) ) - { - self [[ self.onuse ]]( creditplayer ); - } - if ( !self.mustmaintainclaim ) - { - self setclaimteam( "none" ); - self.claimplayer = undefined; - } - } - if ( self.claimteam != "none" ) - { - if ( self useobjectlockedforteam( self.claimteam ) ) - { - if ( isDefined( self.onenduse ) ) - { - self [[ self.onenduse ]]( self getclaimteam(), self.claimplayer, 0 ); - } - self setclaimteam( "none" ); - self.claimplayer = undefined; - self clearprogress(); - } - else - { - if ( !self.mustmaintainclaim || self getownerteam() != self getclaimteam() && self.usetime ) - { - if ( self.decayprogress && !self.numtouching[ self.claimteam ] ) - { - if ( isDefined( self.claimplayer ) ) - { - if ( isDefined( self.onenduse ) ) - { - self [[ self.onenduse ]]( self getclaimteam(), self.claimplayer, 0 ); - } - self.claimplayer = undefined; - } - decayscale = 0; - if ( self.decaytime ) - { - decayscale = self.usetime / self.decaytime; - } - self.curprogress -= 50 * self.userate * decayscale; - if ( self.curprogress <= 0 ) - { - self clearprogress(); - } - self updatecurrentprogress(); - if ( isDefined( self.onuseupdate ) ) - { - self [[ self.onuseupdate ]]( self getclaimteam(), self.curprogress / self.usetime, ( 50 * self.userate * decayscale ) / self.usetime ); - } - if ( self.curprogress == 0 ) - { - self setclaimteam( "none" ); - } - } - else if ( !self.numtouching[ self.claimteam ] ) - { - if ( isDefined( self.onenduse ) ) - { - self [[ self.onenduse ]]( self getclaimteam(), self.claimplayer, 0 ); - } - self setclaimteam( "none" ); - self.claimplayer = undefined; - break; - } - else - { - self.curprogress += 50 * self.userate; - self updatecurrentprogress(); - if ( isDefined( self.onuseupdate ) ) - { - self [[ self.onuseupdate ]]( self getclaimteam(), self.curprogress / self.usetime, ( 50 * self.userate ) / self.usetime ); - } - } - } - else if ( !self.mustmaintainclaim ) - { - if ( isDefined( self.onuse ) ) - { - self [[ self.onuse ]]( self.claimplayer ); - } - if ( !self.mustmaintainclaim ) - { - self setclaimteam( "none" ); - self.claimplayer = undefined; - } - } - else if ( !self.numtouching[ self.claimteam ] ) - { - if ( isDefined( self.onunoccupied ) ) - { - self [[ self.onunoccupied ]](); - } - self setclaimteam( "none" ); - self.claimplayer = undefined; - } - else if ( self.cancontestclaim ) - { - numother = getnumtouchingexceptteam( self.claimteam ); - if ( numother > 0 ) - { - if ( isDefined( self.oncontested ) ) - { - self [[ self.oncontested ]](); - } - self setclaimteam( "none" ); - self.claimplayer = undefined; - } - } - } - } - else if ( self.curprogress > 0 && ( getTime() - self.lastclaimtime ) > ( self.claimgraceperiod * 1000 ) ) - { - self clearprogress(); - } - if ( self.mustmaintainclaim && self getownerteam() != "none" ) - { - if ( !self.numtouching[ self getownerteam() ] ) - { - if ( isDefined( self.onunoccupied ) ) - { - self [[ self.onunoccupied ]](); - } - } - else if ( self.cancontestclaim && self.lastclaimteam != "none" && self.numtouching[ self.lastclaimteam ] ) - { - numother = getnumtouchingexceptteam( self.lastclaimteam ); - if ( numother == 0 ) - { - if ( isDefined( self.onuncontested ) ) - { - self [[ self.onuncontested ]]( self.lastclaimteam ); - } - } - } - } - wait 0.05; - maps/mp/gametypes/_hostmigration::waittillhostmigrationdone(); - } + level endon( "game_ended" ); + self.trigger endon( "destroyed" ); + self thread proxtriggerthink(); + + while ( true ) + { + if ( self.usetime && self.curprogress >= self.usetime ) + { + self clearprogress(); + creditplayer = getearliestclaimplayer(); + + if ( isdefined( self.onenduse ) ) + self [[ self.onenduse ]]( self getclaimteam(), creditplayer, isdefined( creditplayer ) ); + + if ( isdefined( creditplayer ) && isdefined( self.onuse ) ) + self [[ self.onuse ]]( creditplayer ); + + if ( !self.mustmaintainclaim ) + { + self setclaimteam( "none" ); + self.claimplayer = undefined; + } + } + + if ( self.claimteam != "none" ) + { + if ( self useobjectlockedforteam( self.claimteam ) ) + { + if ( isdefined( self.onenduse ) ) + self [[ self.onenduse ]]( self getclaimteam(), self.claimplayer, 0 ); + + self setclaimteam( "none" ); + self.claimplayer = undefined; + self clearprogress(); + } + else if ( self.usetime && ( !self.mustmaintainclaim || self getownerteam() != self getclaimteam() ) ) + { + if ( self.decayprogress && !self.numtouching[self.claimteam] ) + { + if ( isdefined( self.claimplayer ) ) + { + if ( isdefined( self.onenduse ) ) + self [[ self.onenduse ]]( self getclaimteam(), self.claimplayer, 0 ); + + self.claimplayer = undefined; + } + + decayscale = 0; + + if ( self.decaytime ) + decayscale = self.usetime / self.decaytime; + + self.curprogress -= 50 * self.userate * decayscale; + + if ( self.curprogress <= 0 ) + self clearprogress(); + + self updatecurrentprogress(); + + if ( isdefined( self.onuseupdate ) ) + self [[ self.onuseupdate ]]( self getclaimteam(), self.curprogress / self.usetime, 50 * self.userate * decayscale / self.usetime ); + + if ( self.curprogress == 0 ) + self setclaimteam( "none" ); + } + else if ( !self.numtouching[self.claimteam] ) + { + if ( isdefined( self.onenduse ) ) + self [[ self.onenduse ]]( self getclaimteam(), self.claimplayer, 0 ); + + self setclaimteam( "none" ); + self.claimplayer = undefined; + } + else + { + self.curprogress += 50 * self.userate; + self updatecurrentprogress(); + + if ( isdefined( self.onuseupdate ) ) + self [[ self.onuseupdate ]]( self getclaimteam(), self.curprogress / self.usetime, 50 * self.userate / self.usetime ); + } + } + else if ( !self.mustmaintainclaim ) + { + if ( isdefined( self.onuse ) ) + self [[ self.onuse ]]( self.claimplayer ); + + if ( !self.mustmaintainclaim ) + { + self setclaimteam( "none" ); + self.claimplayer = undefined; + } + } + else if ( !self.numtouching[self.claimteam] ) + { + if ( isdefined( self.onunoccupied ) ) + self [[ self.onunoccupied ]](); + + self setclaimteam( "none" ); + self.claimplayer = undefined; + } + else if ( self.cancontestclaim ) + { + numother = getnumtouchingexceptteam( self.claimteam ); + + if ( numother > 0 ) + { + if ( isdefined( self.oncontested ) ) + self [[ self.oncontested ]](); + + self setclaimteam( "none" ); + self.claimplayer = undefined; + } + } + } + else + { + if ( self.curprogress > 0 && gettime() - self.lastclaimtime > self.claimgraceperiod * 1000 ) + self clearprogress(); + + if ( self.mustmaintainclaim && self getownerteam() != "none" ) + { + if ( !self.numtouching[self getownerteam()] ) + { + if ( isdefined( self.onunoccupied ) ) + self [[ self.onunoccupied ]](); + } + else if ( self.cancontestclaim && self.lastclaimteam != "none" && self.numtouching[self.lastclaimteam] ) + { + numother = getnumtouchingexceptteam( self.lastclaimteam ); + + if ( numother == 0 ) + { + if ( isdefined( self.onuncontested ) ) + self [[ self.onuncontested ]]( self.lastclaimteam ); + } + } + } + } + + wait 0.05; + maps\mp\gametypes\_hostmigration::waittillhostmigrationdone(); + } } -useobjectlockedforteam( team ) //checked matches cerberus output +useobjectlockedforteam( team ) { - if ( isDefined( self.teamlock ) && isDefined( level.teams[ team ] ) ) - { - return self.teamlock[ team ]; - } - return 0; + if ( isdefined( self.teamlock ) && isdefined( level.teams[team] ) ) + return self.teamlock[team]; + + return 0; } -canclaim( player ) //checked matches cerberus output +canclaim( player ) { - if ( isDefined( self.carrier ) ) - { - return 0; - } - if ( self.cancontestclaim ) - { - numother = getnumtouchingexceptteam( player.pers[ "team" ] ); - if ( numother != 0 ) - { - return 0; - } - } - if ( !isDefined( self.keyobject ) || isDefined( player.carryobject ) && player haskeyobject( self ) ) - { - return 1; - } - return 0; + if ( isdefined( self.carrier ) ) + return false; + + if ( self.cancontestclaim ) + { + numother = getnumtouchingexceptteam( player.pers["team"] ); + + if ( numother != 0 ) + return false; + } + + if ( !isdefined( self.keyobject ) || isdefined( player.carryobject ) && player haskeyobject( self ) ) + return true; + + return false; } -proxtriggerthink() //checked changed to match cerberus output +proxtriggerthink() { - level endon( "game_ended" ); - self.trigger endon( "destroyed" ); - entitynumber = self.entnum; - while ( 1 ) - { - self.trigger waittill( "trigger", player ); - if ( !isalive( player ) || self useobjectlockedforteam( player.pers[ "team" ] ) ) - { - continue; - } - if ( player.spawntime == getTime() ) - { - continue; - } - if ( player isweaponviewonlylinked() ) - { - continue; - } - if ( self isexcluded( player ) ) - { - continue; - } - if ( self caninteractwith( player ) && self.claimteam == "none" ) - { - if ( self canclaim( player ) ) - { - setclaimteam( player.pers[ "team" ] ); - self.claimplayer = player; - relativeteam = self getrelativeteam( player.pers[ "team" ] ); - if ( isDefined( self.teamusetimes[ relativeteam ] ) ) - { - self.usetime = self.teamusetimes[ relativeteam ]; - } - if ( self.usetime && isDefined( self.onbeginuse ) ) - { - self [[ self.onbeginuse ]]( self.claimplayer ); - } - } - else if ( isDefined( self.oncantuse ) ) - { - self [[ self.oncantuse ]]( player ); - } - } - if ( isalive( player ) && !isDefined( player.touchtriggers[ entitynumber ] ) ) - { - player thread triggertouchthink( self ); - } - } + level endon( "game_ended" ); + self.trigger endon( "destroyed" ); + entitynumber = self.entnum; + + while ( true ) + { + self.trigger waittill( "trigger", player ); + + if ( !isalive( player ) || self useobjectlockedforteam( player.pers["team"] ) ) + continue; + + if ( player.spawntime == gettime() ) + continue; + + if ( player isweaponviewonlylinked() ) + continue; + + if ( self isexcluded( player ) ) + continue; + + if ( self caninteractwith( player ) && self.claimteam == "none" ) + { + if ( self canclaim( player ) ) + { + setclaimteam( player.pers["team"] ); + self.claimplayer = player; + relativeteam = self getrelativeteam( player.pers["team"] ); + + if ( isdefined( self.teamusetimes[relativeteam] ) ) + self.usetime = self.teamusetimes[relativeteam]; + + if ( self.usetime && isdefined( self.onbeginuse ) ) + self [[ self.onbeginuse ]]( self.claimplayer ); + } + else if ( isdefined( self.oncantuse ) ) + self [[ self.oncantuse ]]( player ); + } + + if ( isalive( player ) && !isdefined( player.touchtriggers[entitynumber] ) ) + player thread triggertouchthink( self ); + } } -isexcluded( player ) //checked changed to match cerberus output +isexcluded( player ) { - if ( !isDefined( self.exclusions ) ) - { - return 0; - } - foreach ( exclusion in self.exclusions ) - { - if ( exclusion istouching( player ) ) - { - return 1; - } - } - return 0; + if ( !isdefined( self.exclusions ) ) + return false; + + foreach ( exclusion in self.exclusions ) + { + if ( exclusion istouching( player ) ) + return true; + } + + return false; } -clearprogress() //checked matches cerberus output +clearprogress() { - self.curprogress = 0; - self updatecurrentprogress(); - if ( isDefined( self.onuseclear ) ) - { - self [[ self.onuseclear ]](); - } + self.curprogress = 0; + self updatecurrentprogress(); + + if ( isdefined( self.onuseclear ) ) + self [[ self.onuseclear ]](); } -setclaimteam( newteam ) //checked changed to match cerberus output +setclaimteam( newteam ) { - /* /# - assert( newteam != self.claimteam ); + assert( newteam != self.claimteam ); #/ - */ - if ( self.claimteam == "none" && ( getTime() - self.lastclaimtime ) > ( self.claimgraceperiod * 1000 ) ) - { - self clearprogress(); - } - else if ( newteam != "none" && newteam != self.lastclaimteam ) - { - self clearprogress(); - } - self.lastclaimteam = self.claimteam; - self.lastclaimtime = getTime(); - self.claimteam = newteam; - self updateuserate(); + + if ( self.claimteam == "none" && gettime() - self.lastclaimtime > self.claimgraceperiod * 1000 ) + self clearprogress(); + else if ( newteam != "none" && newteam != self.lastclaimteam ) + self clearprogress(); + + self.lastclaimteam = self.claimteam; + self.lastclaimtime = gettime(); + self.claimteam = newteam; + self updateuserate(); } -getclaimteam() //checked matches cerberus output +getclaimteam() { - return self.claimteam; + return self.claimteam; } -continuetriggertouchthink( team, object ) //checked matches cerberus output +continuetriggertouchthink( team, object ) { - if ( !isalive( self ) ) - { - return 0; - } - if ( self useobjectlockedforteam( team ) ) - { - return 0; - } - if ( !self istouching( object.trigger ) ) - { - return 0; - } - return 1; + if ( !isalive( self ) ) + return false; + + if ( self useobjectlockedforteam( team ) ) + return false; + + if ( !self istouching( object.trigger ) ) + return false; + + return true; } -triggertouchthink( object ) //checked changed to match cerberus output +triggertouchthink( object ) { - team = self.pers[ "team" ]; - score = 1; - object.numtouching[ team ] += score; - if ( object.usetime ) - { - object updateuserate(); - } - touchname = "player" + self.clientid; - struct = spawnstruct(); - struct.player = self; - struct.starttime = getTime(); - object.touchlist[ team ][ touchname ] = struct; - objective_setplayerusing( object.objectiveid, self ); - self.touchtriggers[ object.entnum ] = object.trigger; - if ( isDefined( object.ontouchuse ) ) - { - object [[ object.ontouchuse ]]( self ); - } - while ( self continuetriggertouchthink( team, object ) ) - { - if ( object.usetime ) - { - self updateproxbar( object, 0 ); - } - wait 0.05; - } - if ( isDefined( self ) ) - { - if ( object.usetime ) - { - self updateproxbar( object, 1 ); - } - self.touchtriggers[object.entnum] = undefined; - objective_clearplayerusing( object.objectiveid, self ); - } - if ( level.gameended ) - { - return; - } - object.touchlist[team][touchname] = undefined; - object.numtouching[ team ] -= score; - if ( object.numtouching[ team ] < 1 ) - { - object.numtouching[ team ] = 0; - } - if ( object.usetime ) - { - if ( object.numtouching[ team ] <= 0 && object.curprogress >= object.usetime ) - { - object.curprogress = object.usetime - 1; - object updatecurrentprogress(); - } - } - if ( isDefined( self ) && isDefined( object.onendtouchuse ) ) - { - object [[ object.onendtouchuse ]]( self ); - } - object updateuserate(); + team = self.pers["team"]; + score = 1; + object.numtouching[team] += score; + + if ( object.usetime ) + object updateuserate(); + + touchname = "player" + self.clientid; + struct = spawnstruct(); + struct.player = self; + struct.starttime = gettime(); + object.touchlist[team][touchname] = struct; + objective_setplayerusing( object.objectiveid, self ); + self.touchtriggers[object.entnum] = object.trigger; + + if ( isdefined( object.ontouchuse ) ) + object [[ object.ontouchuse ]]( self ); + + while ( self continuetriggertouchthink( team, object ) ) + { + if ( object.usetime ) + self updateproxbar( object, 0 ); + + wait 0.05; + } + + if ( isdefined( self ) ) + { + if ( object.usetime ) + self updateproxbar( object, 1 ); + + self.touchtriggers[object.entnum] = undefined; + objective_clearplayerusing( object.objectiveid, self ); + } + + if ( level.gameended ) + return; + + object.touchlist[team][touchname] = undefined; + object.numtouching[team] -= score; + + if ( object.numtouching[team] < 1 ) + object.numtouching[team] = 0; + + if ( object.usetime ) + { + if ( object.numtouching[team] <= 0 && object.curprogress >= object.usetime ) + { + object.curprogress = object.usetime - 1; + object updatecurrentprogress(); + } + } + + if ( isdefined( self ) && isdefined( object.onendtouchuse ) ) + object [[ object.onendtouchuse ]]( self ); + + object updateuserate(); } -updateproxbar( object, forceremove ) //checked changed to match beta dump +updateproxbar( object, forceremove ) { - if ( object.newstyle ) - { - return; - } - if ( !forceremove && object.decayprogress ) - { - if ( !object caninteractwith( self ) ) - { - if ( isDefined( self.proxbar ) ) - { - self.proxbar hideelem(); - } - if ( isDefined( self.proxbartext ) ) - { - self.proxbartext hideelem(); - } - return; - } - else - { - if ( !isDefined( self.proxbar ) ) - { - self.proxbar = createprimaryprogressbar(); - self.proxbar.lastuserate = -1; - } - if ( self.pers[ "team" ] == object.claimteam ) - { - if ( self.proxbar.bar.color != ( 1, 1, 1 ) ) - { - self.proxbar.bar.color = ( 1, 1, 1 ); - self.proxbar.lastuserate = -1; - } - } - else - { - if ( self.proxbar.bar.color != ( 1, 0, 0 ) ) - { - self.proxbar.bar.color = ( 1, 0, 0 ); - self.proxbar.lastuserate = -1; - } - } - } - } - else if ( !forceremove || !object caninteractwith( self ) || self.pers[ "team" ] != object.claimteam ) - { - if ( isDefined( self.proxbar ) ) - { - self.proxbar hideelem(); - } - if ( isDefined( self.proxbartext ) ) - { - self.proxbartext hideelem(); - } - return; - } - if ( !isDefined( self.proxbar ) ) - { - self.proxbar = createprimaryprogressbar(); - self.proxbar.lastuserate = -1; - self.proxbar.lasthostmigrationstate = 0; - } - if ( self.proxbar.hidden ) - { - self.proxbar showelem(); - self.proxbar.lastuserate = -1; - self.proxbar.lasthostmigrationstate = 0; - } - if ( !isDefined( self.proxbartext ) ) - { - self.proxbartext = createprimaryprogressbartext(); - self.proxbartext settext( object.usetext ); - } - if ( self.proxbartext.hidden ) - { - self.proxbartext showelem(); - self.proxbartext settext( object.usetext ); - } - if ( self.proxbar.lastuserate != object.userate || self.proxbar.lasthostmigrationstate != isDefined( level.hostmigrationtimer ) ) - { - if ( object.curprogress > object.usetime ) - { - object.curprogress = object.usetime; - } - if ( object.decayprogress && self.pers[ "team" ] != object.claimteam ) - { - if ( object.curprogress > 0 ) - { - progress = object.curprogress / object.usetime; - rate = ( 1000 / object.usetime ) * ( object.userate * -1 ); - if ( isDefined( level.hostmigrationtimer ) ) - { - rate = 0; - } - self.proxbar updatebar( progress, rate ); - } - } - else - { - progress = object.curprogress / object.usetime; - rate = ( 1000 / object.usetime ) * object.userate; - if ( isDefined( level.hostmigrationtimer ) ) - { - rate = 0; - } - self.proxbar updatebar( progress, rate ); - } - self.proxbar.lasthostmigrationstate = isDefined( level.hostmigrationtimer ); - self.proxbar.lastuserate = object.userate; - } + if ( object.newstyle ) + return; + + if ( !forceremove && object.decayprogress ) + { + if ( !object caninteractwith( self ) ) + { + if ( isdefined( self.proxbar ) ) + self.proxbar hideelem(); + + if ( isdefined( self.proxbartext ) ) + self.proxbartext hideelem(); + + return; + } + else + { + if ( !isdefined( self.proxbar ) ) + { + self.proxbar = createprimaryprogressbar(); + self.proxbar.lastuserate = -1; + } + + if ( self.pers["team"] == object.claimteam ) + { + if ( self.proxbar.bar.color != ( 1, 1, 1 ) ) + { + self.proxbar.bar.color = ( 1, 1, 1 ); + self.proxbar.lastuserate = -1; + } + } + else if ( self.proxbar.bar.color != ( 1, 0, 0 ) ) + { + self.proxbar.bar.color = ( 1, 0, 0 ); + self.proxbar.lastuserate = -1; + } + } + } + else if ( forceremove || !object caninteractwith( self ) || self.pers["team"] != object.claimteam ) + { + if ( isdefined( self.proxbar ) ) + self.proxbar hideelem(); + + if ( isdefined( self.proxbartext ) ) + self.proxbartext hideelem(); + + return; + } + + if ( !isdefined( self.proxbar ) ) + { + self.proxbar = createprimaryprogressbar(); + self.proxbar.lastuserate = -1; + self.proxbar.lasthostmigrationstate = 0; + } + + if ( self.proxbar.hidden ) + { + self.proxbar showelem(); + self.proxbar.lastuserate = -1; + self.proxbar.lasthostmigrationstate = 0; + } + + if ( !isdefined( self.proxbartext ) ) + { + self.proxbartext = createprimaryprogressbartext(); + self.proxbartext settext( object.usetext ); + } + + if ( self.proxbartext.hidden ) + { + self.proxbartext showelem(); + self.proxbartext settext( object.usetext ); + } + + if ( self.proxbar.lastuserate != object.userate || self.proxbar.lasthostmigrationstate != isdefined( level.hostmigrationtimer ) ) + { + if ( object.curprogress > object.usetime ) + object.curprogress = object.usetime; + + if ( object.decayprogress && self.pers["team"] != object.claimteam ) + { + if ( object.curprogress > 0 ) + { + progress = object.curprogress / object.usetime; + rate = 1000 / object.usetime * ( object.userate * -1 ); + + if ( isdefined( level.hostmigrationtimer ) ) + rate = 0; + + self.proxbar updatebar( progress, rate ); + } + } + else + { + progress = object.curprogress / object.usetime; + rate = 1000 / object.usetime * object.userate; + + if ( isdefined( level.hostmigrationtimer ) ) + rate = 0; + + self.proxbar updatebar( progress, rate ); + } + + self.proxbar.lasthostmigrationstate = isdefined( level.hostmigrationtimer ); + self.proxbar.lastuserate = object.userate; + } } -getnumtouchingexceptteam( ignoreteam ) //checked partially changed to match cerberus output see github for more info +getnumtouchingexceptteam( ignoreteam ) { - numtouching = 0; - foreach ( team in level.teams ) - { - if ( ignoreteam == team ) - { - } - else - { - numtouching += self.numtouching[ team ]; - } - } - return numtouching; + numtouching = 0; + + foreach ( team in level.teams ) + { + if ( ignoreteam == team ) + continue; + + numtouching += self.numtouching[team]; + } + + return numtouching; } -updateuserate() //checked changed to match beta dump +updateuserate() { - numclaimants = self.numtouching[ self.claimteam ]; - numother = 0; - numother = getnumtouchingexceptteam( self.claimteam ); - self.userate = 0; - if ( self.decayprogress ) - { - if ( numclaimants && !numother ) - { - self.userate = numclaimants; - } - else if ( !numclaimants && numother ) - { - self.userate = numother; - } - else if ( !numclaimants && !numother ) - { - self.userate = 0; - } - } - else - { - if ( numclaimants && !numother ) - { - self.userate = numclaimants; - } - } - if ( isDefined( self.onupdateuserate ) ) - { - self [[ self.onupdateuserate ]](); - } + numclaimants = self.numtouching[self.claimteam]; + numother = 0; + numother = getnumtouchingexceptteam( self.claimteam ); + self.userate = 0; + + if ( self.decayprogress ) + { + if ( numclaimants && !numother ) + self.userate = numclaimants; + else if ( !numclaimants && numother ) + self.userate = numother; + else if ( !numclaimants && !numother ) + self.userate = 0; + } + else if ( numclaimants && !numother ) + self.userate = numclaimants; + + if ( isdefined( self.onupdateuserate ) ) + self [[ self.onupdateuserate ]](); } -useholdthink( player ) //checked changed to match cerberus output +useholdthink( player ) { - player notify( "use_hold" ); - if ( !is_true( self.dontlinkplayertotrigger ) ) - { - player playerlinkto( self.trigger ); - player playerlinkedoffsetenable(); - } - player clientclaimtrigger( self.trigger ); - player.claimtrigger = self.trigger; - useweapon = self.useweapon; - lastweapon = player getcurrentweapon(); - if ( isDefined( useweapon ) ) - { - /* + player notify( "use_hold" ); + + if ( !is_true( self.dontlinkplayertotrigger ) ) + { + player playerlinkto( self.trigger ); + player playerlinkedoffsetenable(); + } + + player clientclaimtrigger( self.trigger ); + player.claimtrigger = self.trigger; + useweapon = self.useweapon; + lastweapon = player getcurrentweapon(); + + if ( isdefined( useweapon ) ) + { /# - assert( isDefined( lastweapon ) ); + assert( isdefined( lastweapon ) ); #/ - */ - if ( lastweapon == useweapon ) - { - /* + + if ( lastweapon == useweapon ) + { /# - assert( isDefined( player.lastnonuseweapon ) ); + assert( isdefined( player.lastnonuseweapon ) ); #/ - */ - lastweapon = player.lastnonuseweapon; - } - /* + lastweapon = player.lastnonuseweapon; + } + /# - assert( lastweapon != useweapon ); + assert( lastweapon != useweapon ); #/ - */ - player.lastnonuseweapon = lastweapon; - player giveweapon( useweapon ); - player setweaponammostock( useweapon, 0 ); - player setweaponammoclip( useweapon, 0 ); - player switchtoweapon( useweapon ); - } - else - { - player _disableweapon(); - } - self clearprogress(); - self.inuse = 1; - self.userate = 0; - objective_setplayerusing( self.objectiveid, player ); - player thread personalusebar( self ); - result = useholdthinkloop( player, lastweapon ); - if ( isDefined( player ) ) - { - objective_clearplayerusing( self.objectiveid, player ); - self clearprogress(); - if ( isDefined( player.attachedusemodel ) ) - { - player detach( player.attachedusemodel, "tag_inhand" ); - player.attachedusemodel = undefined; - } - player notify( "done_using" ); - } - if ( isDefined( useweapon ) && isDefined( player ) ) - { - player thread takeuseweapon( useweapon ); - } - if ( is_true( result ) ) - { - return 1; - } - if ( isDefined( player ) ) - { - player.claimtrigger = undefined; - if ( isDefined( useweapon ) ) - { - ammo = player getweaponammoclip( lastweapon ); - if ( lastweapon != "none" && !maps/mp/killstreaks/_killstreaks::iskillstreakweapon( lastweapon ) && isweaponequipment( lastweapon ) && player getweaponammoclip( lastweapon ) != 0 ) - { - player switchtoweapon( lastweapon ); - } - else - { - player takeweapon( useweapon ); - player switchtolastnonkillstreakweapon(); - } - } - else if ( isalive( player ) ) - { - player _enableweapon(); - } - if ( !is_true( self.dontlinkplayertotrigger ) ) - { - player unlink(); - } - if ( !isalive( player ) ) - { - player.killedinuse = 1; - } - } - self.inuse = 0; - if ( self.trigger.classname == "trigger_radius_use" ) - { - player clientreleasetrigger( self.trigger ); - } - else - { - self.trigger releaseclaimedtrigger(); - } - return 0; + player.lastnonuseweapon = lastweapon; + player giveweapon( useweapon ); + player setweaponammostock( useweapon, 0 ); + player setweaponammoclip( useweapon, 0 ); + player switchtoweapon( useweapon ); + } + else + player _disableweapon(); + + self clearprogress(); + self.inuse = 1; + self.userate = 0; + objective_setplayerusing( self.objectiveid, player ); + player thread personalusebar( self ); + result = useholdthinkloop( player, lastweapon ); + + if ( isdefined( player ) ) + { + objective_clearplayerusing( self.objectiveid, player ); + self clearprogress(); + + if ( isdefined( player.attachedusemodel ) ) + { + player detach( player.attachedusemodel, "tag_inhand" ); + player.attachedusemodel = undefined; + } + + player notify( "done_using" ); + } + + if ( isdefined( useweapon ) && isdefined( player ) ) + player thread takeuseweapon( useweapon ); + + if ( isdefined( result ) && result ) + return true; + + if ( isdefined( player ) ) + { + player.claimtrigger = undefined; + + if ( isdefined( useweapon ) ) + { + ammo = player getweaponammoclip( lastweapon ); + + if ( lastweapon != "none" && !maps\mp\killstreaks\_killstreaks::iskillstreakweapon( lastweapon ) && !( isweaponequipment( lastweapon ) && player getweaponammoclip( lastweapon ) == 0 ) ) + player switchtoweapon( lastweapon ); + else + { + player takeweapon( useweapon ); + player switchtolastnonkillstreakweapon(); + } + } + else if ( isalive( player ) ) + player _enableweapon(); + + if ( !is_true( self.dontlinkplayertotrigger ) ) + player unlink(); + + if ( !isalive( player ) ) + player.killedinuse = 1; + } + + self.inuse = 0; + + if ( self.trigger.classname == "trigger_radius_use" ) + player clientreleasetrigger( self.trigger ); + else + self.trigger releaseclaimedtrigger(); + + return false; } -takeuseweapon( useweapon ) //checked changed to match cerberus output +takeuseweapon( useweapon ) { - self endon( "use_hold" ); - self endon( "death" ); - self endon( "disconnect" ); - level endon( "game_ended" ); - while ( self getcurrentweapon() == useweapon && !self.throwinggrenade ) - { - wait 0.05; - } - self takeweapon( useweapon ); + self endon( "use_hold" ); + self endon( "death" ); + self endon( "disconnect" ); + level endon( "game_ended" ); + + while ( self getcurrentweapon() == useweapon && !self.throwinggrenade ) + wait 0.05; + + self takeweapon( useweapon ); } -continueholdthinkloop( player, waitforweapon, timedout, usetime ) //checked matches cerberus output +continueholdthinkloop( player, waitforweapon, timedout, usetime ) { - maxwaittime = 1.5; - if ( !isalive( player ) ) - { - return 0; - } - if ( is_true( player.laststand ) ) - { - return 0; - } - if ( self.curprogress >= usetime ) - { - return 0; - } - if ( !player usebuttonpressed() ) - { - return 0; - } - if ( player.throwinggrenade ) - { - return 0; - } - if ( player meleebuttonpressed() ) - { - return 0; - } - if ( player isinvehicle() ) - { - return 0; - } - if ( player isremotecontrolling() ) - { - return 0; - } - if ( player isweaponviewonlylinked() ) - { - return 0; - } - if ( !player istouching( self.trigger ) ) - { - return 0; - } - if ( !self.userate && !waitforweapon ) - { - return 0; - } - if ( waitforweapon && timedout > maxwaittime ) - { - return 0; - } - return 1; + maxwaittime = 1.5; + + if ( !isalive( player ) ) + return false; + + if ( isdefined( player.laststand ) && player.laststand ) + return false; + + if ( self.curprogress >= usetime ) + return false; + + if ( !player usebuttonpressed() ) + return false; + + if ( player.throwinggrenade ) + return false; + + if ( player meleebuttonpressed() ) + return false; + + if ( player isinvehicle() ) + return false; + + if ( player isremotecontrolling() ) + return false; + + if ( player isweaponviewonlylinked() ) + return false; + + if ( !player istouching( self.trigger ) ) + return false; + + if ( !self.userate && !waitforweapon ) + return false; + + if ( waitforweapon && timedout > maxwaittime ) + return false; + + return true; } -updatecurrentprogress() //checked matches cerberus output +updatecurrentprogress() { - if ( self.usetime ) - { - if ( isDefined( self.curprogress ) ) - { - progress = float( self.curprogress ) / self.usetime; - } - else - { - progress = 0; - } - objective_setprogress( self.objectiveid, clamp( progress, 0, 1 ) ); - } + if ( self.usetime ) + { + if ( isdefined( self.curprogress ) ) + progress = float( self.curprogress ) / self.usetime; + else + progress = 0; + + objective_setprogress( self.objectiveid, clamp( progress, 0, 1 ) ); + } } -useholdthinkloop( player, lastweapon ) //checked changed to match beta dump +useholdthinkloop( player, lastweapon ) { - level endon( "game_ended" ); - self endon( "disabled" ); - useweapon = self.useweapon; - waitforweapon = 1; - timedout = 0; - usetime = self.usetime; - while ( self continueholdthinkloop( player, waitforweapon, timedout, usetime ) ) - { - timedout += 0.05; - if ( !isDefined( useweapon ) || player getcurrentweapon() == useweapon ) - { - self.curprogress += 50 * self.userate; - self updatecurrentprogress(); - self.userate = 1; - waitforweapon = 0; - } - else - { - self.userate = 0; - } - if ( self.curprogress >= usetime ) - { - self.inuse = 0; - player clientreleasetrigger( self.trigger ); - player.claimtrigger = undefined; - if ( isDefined( useweapon ) ) - { - if ( lastweapon != "none" && !maps/mp/killstreaks/_killstreaks::iskillstreakweapon( lastweapon ) && !( isweaponequipment( lastweapon ) && player getweaponammoclip( lastweapon ) == 0 ) ) - { - player switchtoweapon( lastweapon ); - } - else - { - player takeweapon( useweapon ); - player switchtolastnonkillstreakweapon(); - } - } - else - { - player _enableweapon(); - } - if ( !is_true( self.dontlinkplayertotrigger ) ) - { - player unlink(); - } - wait 0.05; - return isalive( player ); - } - wait 0.05; - maps/mp/gametypes/_hostmigration::waittillhostmigrationdone(); - } - return 0; + level endon( "game_ended" ); + self endon( "disabled" ); + useweapon = self.useweapon; + waitforweapon = 1; + timedout = 0; + usetime = self.usetime; + + while ( self continueholdthinkloop( player, waitforweapon, timedout, usetime ) ) + { + timedout += 0.05; + + if ( !isdefined( useweapon ) || player getcurrentweapon() == useweapon ) + { + self.curprogress += 50 * self.userate; + self updatecurrentprogress(); + self.userate = 1; + waitforweapon = 0; + } + else + self.userate = 0; + + if ( self.curprogress >= usetime ) + { + self.inuse = 0; + player clientreleasetrigger( self.trigger ); + player.claimtrigger = undefined; + + if ( isdefined( useweapon ) ) + { + if ( lastweapon != "none" && !maps\mp\killstreaks\_killstreaks::iskillstreakweapon( lastweapon ) && !( isweaponequipment( lastweapon ) && player getweaponammoclip( lastweapon ) == 0 ) ) + player switchtoweapon( lastweapon ); + else + { + player takeweapon( useweapon ); + player switchtolastnonkillstreakweapon(); + } + } + else + player _enableweapon(); + + if ( !is_true( self.dontlinkplayertotrigger ) ) + player unlink(); + + wait 0.05; + return isalive( player ); + } + + wait 0.05; + maps\mp\gametypes\_hostmigration::waittillhostmigrationdone(); + } + + return 0; } -personalusebar( object ) //checked matches cerberus output +personalusebar( object ) { - self endon( "disconnect" ); - if ( object.newstyle ) - { - return; - } - if ( isDefined( self.usebar ) ) - { - return; - } - self.usebar = createprimaryprogressbar(); - self.usebartext = createprimaryprogressbartext(); - self.usebartext settext( object.usetext ); - usetime = object.usetime; - lastrate = -1; - lasthostmigrationstate = isDefined( level.hostmigrationtimer ); - while ( isalive( self ) && object.inuse && !level.gameended ) - { - if ( lastrate != object.userate || lasthostmigrationstate != isDefined( level.hostmigrationtimer ) ) - { - if ( object.curprogress > usetime ) - { - object.curprogress = usetime; - } - if ( object.decayprogress && self.pers[ "team" ] != object.claimteam ) - { - if ( object.curprogress > 0 ) - { - progress = object.curprogress / usetime; - rate = ( 1000 / usetime ) * ( object.userate * -1 ); - if ( isDefined( level.hostmigrationtimer ) ) - { - rate = 0; - } - self.proxbar updatebar( progress, rate ); - } - } - else - { - progress = object.curprogress / usetime; - rate = ( 1000 / usetime ) * object.userate; - if ( isDefined( level.hostmigrationtimer ) ) - { - rate = 0; - } - self.usebar updatebar( progress, rate ); - } - if ( !object.userate ) - { - self.usebar hideelem(); - self.usebartext hideelem(); - } - else - { - self.usebar showelem(); - self.usebartext showelem(); - } - } - lastrate = object.userate; - lasthostmigrationstate = isDefined( level.hostmigrationtimer ); - wait 0.05; - } - self.usebar destroyelem(); - self.usebartext destroyelem(); + self endon( "disconnect" ); + + if ( object.newstyle ) + return; + + if ( isdefined( self.usebar ) ) + return; + + self.usebar = createprimaryprogressbar(); + self.usebartext = createprimaryprogressbartext(); + self.usebartext settext( object.usetext ); + usetime = object.usetime; + lastrate = -1; + lasthostmigrationstate = isdefined( level.hostmigrationtimer ); + + while ( isalive( self ) && object.inuse && !level.gameended ) + { + if ( lastrate != object.userate || lasthostmigrationstate != isdefined( level.hostmigrationtimer ) ) + { + if ( object.curprogress > usetime ) + object.curprogress = usetime; + + if ( object.decayprogress && self.pers["team"] != object.claimteam ) + { + if ( object.curprogress > 0 ) + { + progress = object.curprogress / usetime; + rate = 1000 / usetime * ( object.userate * -1 ); + + if ( isdefined( level.hostmigrationtimer ) ) + rate = 0; + + self.proxbar updatebar( progress, rate ); + } + } + else + { + progress = object.curprogress / usetime; + rate = 1000 / usetime * object.userate; + + if ( isdefined( level.hostmigrationtimer ) ) + rate = 0; + + self.usebar updatebar( progress, rate ); + } + + if ( !object.userate ) + { + self.usebar hideelem(); + self.usebartext hideelem(); + } + else + { + self.usebar showelem(); + self.usebartext showelem(); + } + } + + lastrate = object.userate; + lasthostmigrationstate = isdefined( level.hostmigrationtimer ); + wait 0.05; + } + + self.usebar destroyelem(); + self.usebartext destroyelem(); } -updatetrigger() //checked changed to match cerberus output +updatetrigger() { - if ( self.triggertype != "use" ) - { - return; - } - if ( self.interactteam == "none" ) - { - self.trigger.origin -= vectorScale( ( 0, 0, 1 ), 50000 ); - } - else if ( self.interactteam == "any" || !level.teambased ) - { - self.trigger.origin = self.curorigin; - self.trigger setteamfortrigger( "none" ); - } - else if ( self.interactteam == "friendly" ) - { - self.trigger.origin = self.curorigin; - if ( isDefined( level.teams[ self.ownerteam ] ) ) - { - self.trigger setteamfortrigger( self.ownerteam ); - } - else - { - self.trigger.origin -= vectorScale( ( 0, 0, 1 ), 50000 ); - } - } - else if ( self.interactteam == "enemy" ) - { - self.trigger.origin = self.curorigin; - self.trigger setexcludeteamfortrigger( self.ownerteam ); - } + if ( self.triggertype != "use" ) + return; + + if ( self.interactteam == "none" ) + self.trigger.origin -= vectorscale( ( 0, 0, 1 ), 50000.0 ); + else if ( self.interactteam == "any" || !level.teambased ) + { + self.trigger.origin = self.curorigin; + self.trigger setteamfortrigger( "none" ); + } + else if ( self.interactteam == "friendly" ) + { + self.trigger.origin = self.curorigin; + + if ( isdefined( level.teams[self.ownerteam] ) ) + self.trigger setteamfortrigger( self.ownerteam ); + else + self.trigger.origin -= vectorscale( ( 0, 0, 1 ), 50000.0 ); + } + else if ( self.interactteam == "enemy" ) + { + self.trigger.origin = self.curorigin; + self.trigger setexcludeteamfortrigger( self.ownerteam ); + } } -updateobjective() //checked matches cerberus output +updateobjective() { - if ( !self.newstyle ) - { - return; - } - objective_team( self.objectiveid, self.ownerteam ); - if ( self.visibleteam == "any" ) - { - objective_state( self.objectiveid, "active" ); - objective_visibleteams( self.objectiveid, level.spawnsystem.ispawn_teammask[ "all" ] ); - } - else if ( self.visibleteam == "friendly" ) - { - objective_state( self.objectiveid, "active" ); - objective_visibleteams( self.objectiveid, level.spawnsystem.ispawn_teammask[ self.ownerteam ] ); - } - else if ( self.visibleteam == "enemy" ) - { - objective_state( self.objectiveid, "active" ); - objective_visibleteams( self.objectiveid, level.spawnsystem.ispawn_teammask[ "all" ] & level.spawnsystem.ispawn_teammask[ self.ownerteam ] ); - } - else - { - objective_state( self.objectiveid, "invisible" ); - objective_visibleteams( self.objectiveid, 0 ); - } - if ( self.type == "carryObject" ) - { - if ( isalive( self.carrier ) ) - { - objective_onentity( self.objectiveid, self.carrier ); - return; - } - else - { - objective_clearentity( self.objectiveid ); - } - } + if ( !self.newstyle ) + return; + + objective_team( self.objectiveid, self.ownerteam ); + + if ( self.visibleteam == "any" ) + { + objective_state( self.objectiveid, "active" ); + objective_visibleteams( self.objectiveid, level.spawnsystem.ispawn_teammask["all"] ); + } + else if ( self.visibleteam == "friendly" ) + { + objective_state( self.objectiveid, "active" ); + objective_visibleteams( self.objectiveid, level.spawnsystem.ispawn_teammask[self.ownerteam] ); + } + else if ( self.visibleteam == "enemy" ) + { + objective_state( self.objectiveid, "active" ); + objective_visibleteams( self.objectiveid, level.spawnsystem.ispawn_teammask["all"] & ~level.spawnsystem.ispawn_teammask[self.ownerteam] ); + } + else + { + objective_state( self.objectiveid, "invisible" ); + objective_visibleteams( self.objectiveid, 0 ); + } + + if ( self.type == "carryObject" ) + { + if ( isalive( self.carrier ) ) + objective_onentity( self.objectiveid, self.carrier ); + else + objective_clearentity( self.objectiveid ); + } } -updateworldicons() //checked matches cerberus output +updateworldicons() { - if ( self.visibleteam == "any" ) - { - updateworldicon( "friendly", 1 ); - updateworldicon( "enemy", 1 ); - } - else if ( self.visibleteam == "friendly" ) - { - updateworldicon( "friendly", 1 ); - updateworldicon( "enemy", 0 ); - } - else if ( self.visibleteam == "enemy" ) - { - updateworldicon( "friendly", 0 ); - updateworldicon( "enemy", 1 ); - } - else - { - updateworldicon( "friendly", 0 ); - updateworldicon( "enemy", 0 ); - } + if ( self.visibleteam == "any" ) + { + updateworldicon( "friendly", 1 ); + updateworldicon( "enemy", 1 ); + } + else if ( self.visibleteam == "friendly" ) + { + updateworldicon( "friendly", 1 ); + updateworldicon( "enemy", 0 ); + } + else if ( self.visibleteam == "enemy" ) + { + updateworldicon( "friendly", 0 ); + updateworldicon( "enemy", 1 ); + } + else + { + updateworldicon( "friendly", 0 ); + updateworldicon( "enemy", 0 ); + } } -updateworldicon( relativeteam, showicon ) //checked partially changed to match cerberus output see info.md +updateworldicon( relativeteam, showicon ) { - if ( self.newstyle ) - { - return; - } - if ( !isDefined( self.worldicons[ relativeteam ] ) ) - { - showicon = 0; - } - updateteams = getupdateteams( relativeteam ); - index = 0; - while ( index < updateteams.size ) - { - if ( !level.teambased && updateteams[ index ] != level.nonteambasedteam ) - { - index++; - continue; - } - else - { - opname = "objpoint_" + updateteams[ index ] + "_" + self.entnum; - objpoint = maps/mp/gametypes/_objpoints::getobjpointbyname( opname ); - objpoint notify( "stop_flashing_thread" ); - objpoint thread maps/mp/gametypes/_objpoints::stopflashing(); - if ( showicon ) - { - objpoint setshader( self.worldicons[ relativeteam ], level.objpointsize, level.objpointsize ); - objpoint fadeovertime( 0.05 ); - objpoint.alpha = objpoint.basealpha; - objpoint.isshown = 1; - iswaypoint = 1; - if ( isDefined( self.worldiswaypoint[ relativeteam ] ) ) - { - iswaypoint = self.worldiswaypoint[ relativeteam ]; - } - if ( isDefined( self.compassicons[ relativeteam ] ) ) - { - objpoint setwaypoint( iswaypoint, self.worldicons[ relativeteam ] ); - } - else - { - objpoint setwaypoint( iswaypoint ); - } - if ( self.type == "carryObject" ) - { - if ( isDefined( self.carrier ) && !shouldpingobject( relativeteam ) ) - { - objpoint settargetent( self.carrier ); - break; - } - else - { - objpoint cleartargetent(); - } - } - index++; - continue; - } - objpoint fadeovertime( 0,05 ); - objpoint.alpha = 0; - objpoint.isshown = 0; - objpoint cleartargetent(); - } - index++; - } + if ( self.newstyle ) + return; + + if ( !isdefined( self.worldicons[relativeteam] ) ) + showicon = 0; + + updateteams = getupdateteams( relativeteam ); + + for ( index = 0; index < updateteams.size; index++ ) + { + if ( !level.teambased && updateteams[index] != level.nonteambasedteam ) + continue; + + opname = "objpoint_" + updateteams[index] + "_" + self.entnum; + objpoint = maps\mp\gametypes\_objpoints::getobjpointbyname( opname ); + objpoint notify( "stop_flashing_thread" ); + objpoint thread maps\mp\gametypes\_objpoints::stopflashing(); + + if ( showicon ) + { + objpoint setshader( self.worldicons[relativeteam], level.objpointsize, level.objpointsize ); + objpoint fadeovertime( 0.05 ); + objpoint.alpha = objpoint.basealpha; + objpoint.isshown = 1; + iswaypoint = 1; + + if ( isdefined( self.worldiswaypoint[relativeteam] ) ) + iswaypoint = self.worldiswaypoint[relativeteam]; + + if ( isdefined( self.compassicons[relativeteam] ) ) + objpoint setwaypoint( iswaypoint, self.worldicons[relativeteam] ); + else + objpoint setwaypoint( iswaypoint ); + + if ( self.type == "carryObject" ) + { + if ( isdefined( self.carrier ) && !shouldpingobject( relativeteam ) ) + objpoint settargetent( self.carrier ); + else + objpoint cleartargetent(); + } + + continue; + } + + objpoint fadeovertime( 0.05 ); + objpoint.alpha = 0; + objpoint.isshown = 0; + objpoint cleartargetent(); + } } -updatecompassicons() //checked matches cerberus output +updatecompassicons() { - if ( self.visibleteam == "any" ) - { - updatecompassicon( "friendly", 1 ); - updatecompassicon( "enemy", 1 ); - } - else if ( self.visibleteam == "friendly" ) - { - updatecompassicon( "friendly", 1 ); - updatecompassicon( "enemy", 0 ); - } - else if ( self.visibleteam == "enemy" ) - { - updatecompassicon( "friendly", 0 ); - updatecompassicon( "enemy", 1 ); - } - else - { - updatecompassicon( "friendly", 0 ); - updatecompassicon( "enemy", 0 ); - } + if ( self.visibleteam == "any" ) + { + updatecompassicon( "friendly", 1 ); + updatecompassicon( "enemy", 1 ); + } + else if ( self.visibleteam == "friendly" ) + { + updatecompassicon( "friendly", 1 ); + updatecompassicon( "enemy", 0 ); + } + else if ( self.visibleteam == "enemy" ) + { + updatecompassicon( "friendly", 0 ); + updatecompassicon( "enemy", 1 ); + } + else + { + updatecompassicon( "friendly", 0 ); + updatecompassicon( "enemy", 0 ); + } } -updatecompassicon( relativeteam, showicon ) //checked partially changed to match cerberus output see info.md +updatecompassicon( relativeteam, showicon ) { - if ( self.newstyle ) - { - return; - } - updateteams = getupdateteams( relativeteam ); - index = 0; - while ( index < updateteams.size ) - { - showiconthisteam = showicon; - if ( !showiconthisteam && shouldshowcompassduetoradar( updateteams[ index ] ) ) - { - showiconthisteam = 1; - } - if ( level.teambased ) - { - objid = self.objid[ updateteams[ index ] ]; - } - else - { - objid = self.objid[ level.nonteambasedteam ]; - } - if ( !isDefined( self.compassicons[ relativeteam ] ) || !showiconthisteam ) - { - objective_state( objid, "invisible" ); - index++; - continue; - } - objective_icon( objid, self.compassicons[ relativeteam ] ); - objective_state( objid, "active" ); - if ( self.type == "carryObject" ) - { - if ( isalive( self.carrier ) && !shouldpingobject( relativeteam ) ) - { - objective_onentity( objid, self.carrier ); - index++; - continue; - } - objective_position( objid, self.curorigin ); - } - index++; - } + if ( self.newstyle ) + return; + + updateteams = getupdateteams( relativeteam ); + + for ( index = 0; index < updateteams.size; index++ ) + { + showiconthisteam = showicon; + + if ( !showiconthisteam && shouldshowcompassduetoradar( updateteams[index] ) ) + showiconthisteam = 1; + + if ( level.teambased ) + objid = self.objid[updateteams[index]]; + else + objid = self.objid[level.nonteambasedteam]; + + if ( !isdefined( self.compassicons[relativeteam] ) || !showiconthisteam ) + { + objective_state( objid, "invisible" ); + continue; + } + + objective_icon( objid, self.compassicons[relativeteam] ); + objective_state( objid, "active" ); + + if ( self.type == "carryObject" ) + { + if ( isalive( self.carrier ) && !shouldpingobject( relativeteam ) ) + { + objective_onentity( objid, self.carrier ); + continue; + } + + objective_position( objid, self.curorigin ); + } + } } -shouldpingobject( relativeteam ) //checked changed to match cerberus output +shouldpingobject( relativeteam ) { - if ( relativeteam == "friendly" && self.objidpingfriendly ) - { - return 1; - } - else if ( relativeteam == "enemy" && self.objidpingenemy ) - { - return 1; - } - return 0; + if ( relativeteam == "friendly" && self.objidpingfriendly ) + return true; + else if ( relativeteam == "enemy" && self.objidpingenemy ) + return true; + + return false; } -getupdateteams( relativeteam ) //checked changed to match beta dump +getupdateteams( relativeteam ) { - updateteams = []; - if ( level.teambased ) - { - if ( relativeteam == "friendly" ) - { - foreach ( team in level.teams ) - { - if ( self isfriendlyteam( team ) ) - { - updateteams[ updateteams.size ] = team; - } - } - } - else if ( relativeteam == "enemy" ) - { - foreach ( team in level.teams ) - { - if ( !self isfriendlyteam( team ) ) - { - updateteams[ updateteams.size ] = team; - } - } - } - } - else - { - if ( relativeteam == "friendly" ) - { - updateteams[ updateteams.size ] = level.nonteambasedteam; - } - else - { - updateteams[ updateteams.size ] = "axis"; - } - } - return updateteams; + updateteams = []; + + if ( level.teambased ) + { + if ( relativeteam == "friendly" ) + { + foreach ( team in level.teams ) + { + if ( self isfriendlyteam( team ) ) + updateteams[updateteams.size] = team; + } + } + else if ( relativeteam == "enemy" ) + { + foreach ( team in level.teams ) + { + if ( !self isfriendlyteam( team ) ) + updateteams[updateteams.size] = team; + } + } + } + else if ( relativeteam == "friendly" ) + updateteams[updateteams.size] = level.nonteambasedteam; + else + updateteams[updateteams.size] = "axis"; + + return updateteams; } -shouldshowcompassduetoradar( team ) //checked matches cerberus output +shouldshowcompassduetoradar( team ) { - showcompass = 0; - if ( !isDefined( self.carrier ) ) - { - return 0; - } - if ( self.carrier hasperk( "specialty_gpsjammer" ) == 0 ) - { - if ( maps/mp/killstreaks/_radar::teamhasspyplane( team ) ) - { - showcompass = 1; - } - } - if ( maps/mp/killstreaks/_radar::teamhassatellite( team ) ) - { - showcompass = 1; - } - return showcompass; + showcompass = 0; + + if ( !isdefined( self.carrier ) ) + return 0; + + if ( self.carrier hasperk( "specialty_gpsjammer" ) == 0 ) + { + if ( maps\mp\killstreaks\_radar::teamhasspyplane( team ) ) + showcompass = 1; + } + + if ( maps\mp\killstreaks\_radar::teamhassatellite( team ) ) + showcompass = 1; + + return showcompass; } -updatevisibilityaccordingtoradar() //checked matches cerberus output +updatevisibilityaccordingtoradar() { - self endon( "death" ); - self endon( "carrier_cleared" ); - while ( 1 ) - { - level waittill( "radar_status_change" ); - self updatecompassicons(); - } + self endon( "death" ); + self endon( "carrier_cleared" ); + + while ( true ) + { + level waittill( "radar_status_change" ); + + self updatecompassicons(); + } } -setownerteam( team ) //checked matches cerberus output +setownerteam( team ) { - self.ownerteam = team; - self updatetrigger(); - self updatecompassicons(); - self updateworldicons(); - self updateobjective(); + self.ownerteam = team; + self updatetrigger(); + self updatecompassicons(); + self updateworldicons(); + self updateobjective(); } -getownerteam() //checked matches cerberus output +getownerteam() { - return self.ownerteam; + return self.ownerteam; } -setdecaytime( time ) //checked matches cerberus output +setdecaytime( time ) { - self.decaytime = int( time * 1000 ); + self.decaytime = int( time * 1000 ); } -setusetime( time ) //checked matches cerberus output +setusetime( time ) { - self.usetime = int( time * 1000 ); + self.usetime = int( time * 1000 ); } -setusetext( text ) //checked matches cerberus output +setusetext( text ) { - self.usetext = text; + self.usetext = text; } -setteamusetime( relativeteam, time ) //checked matches cerberus output +setteamusetime( relativeteam, time ) { - self.teamusetimes[ relativeteam ] = int( time * 1000 ); + self.teamusetimes[relativeteam] = int( time * 1000 ); } -setteamusetext( relativeteam, text ) //checked matches cerberus output +setteamusetext( relativeteam, text ) { - self.teamusetexts[ relativeteam ] = text; + self.teamusetexts[relativeteam] = text; } -setusehinttext( text ) //checked matches cerberus output +setusehinttext( text ) { - self.trigger sethintstring( text ); + self.trigger sethintstring( text ); } -allowcarry( relativeteam ) //checked matches cerberus output +allowcarry( relativeteam ) { - allowuse( relativeteam ); + allowuse( relativeteam ); } -allowuse( relativeteam ) //checked matches cerberus output +allowuse( relativeteam ) { - self.interactteam = relativeteam; - updatetrigger(); + self.interactteam = relativeteam; + updatetrigger(); } -setvisibleteam( relativeteam ) //checked matches cerberus output +setvisibleteam( relativeteam ) { - self.visibleteam = relativeteam; - if ( !maps/mp/gametypes/_tweakables::gettweakablevalue( "hud", "showobjicons" ) ) - { - self.visibleteam = "none"; - } - updatecompassicons(); - updateworldicons(); - updateobjective(); + self.visibleteam = relativeteam; + + if ( !maps\mp\gametypes\_tweakables::gettweakablevalue( "hud", "showobjicons" ) ) + self.visibleteam = "none"; + + updatecompassicons(); + updateworldicons(); + updateobjective(); } -setmodelvisibility( visibility ) //checked changed to match beta dump +setmodelvisibility( visibility ) { - if ( visibility ) - { - for ( index = 0; index < self.visuals.size; index++ ) - { - self.visuals[ index ] show(); - if ( self.visuals[ index ].classname == "script_brushmodel" || self.visuals[ index ].classname == "script_model" ) - { - self.visuals[ index ] thread makesolid(); - } - } - } - else - { - for ( index = 0; index < self.visuals.size; index++ ) - { - self.visuals[ index ] hide(); - if ( self.visuals[ index ].classname == "script_brushmodel" || self.visuals[ index ].classname == "script_model" ) - { - self.visuals[ index ] notify( "changing_solidness" ); - self.visuals[ index ] notsolid(); - } - } - } + if ( visibility ) + { + for ( index = 0; index < self.visuals.size; index++ ) + { + self.visuals[index] show(); + + if ( self.visuals[index].classname == "script_brushmodel" || self.visuals[index].classname == "script_model" ) + self.visuals[index] thread makesolid(); + } + } + else + { + for ( index = 0; index < self.visuals.size; index++ ) + { + self.visuals[index] hide(); + + if ( self.visuals[index].classname == "script_brushmodel" || self.visuals[index].classname == "script_model" ) + { + self.visuals[index] notify( "changing_solidness" ); + self.visuals[index] notsolid(); + } + } + } } -makesolid() //checked changed to match cerberus output +makesolid() { - self endon( "death" ); - self notify( "changing_solidness" ); - self endon( "changing_solidness" ); - while ( 1 ) - { - for ( i = 0; i < level.players.size; i++ ) - { - if ( level.players[ i ] istouching( self ) ) - { - break; - } - } - if ( i == level.players.size ) - { - self solid(); - return; - } - wait 0.05; - } + self endon( "death" ); + self notify( "changing_solidness" ); + self endon( "changing_solidness" ); + + while ( true ) + { + for ( i = 0; i < level.players.size; i++ ) + { + if ( level.players[i] istouching( self ) ) + break; + } + + if ( i == level.players.size ) + { + self solid(); + break; + } + + wait 0.05; + } } -setcarriervisible( relativeteam ) //checked matches cerberus output +setcarriervisible( relativeteam ) { - self.carriervisible = relativeteam; + self.carriervisible = relativeteam; } -setcanuse( relativeteam ) //checked matches cerberus output +setcanuse( relativeteam ) { - self.useteam = relativeteam; + self.useteam = relativeteam; } -set2dicon( relativeteam, shader ) //checked matches cerberus output +set2dicon( relativeteam, shader ) { - self.compassicons[ relativeteam ] = shader; - updatecompassicons(); + self.compassicons[relativeteam] = shader; + updatecompassicons(); } -set3dicon( relativeteam, shader ) //checked matches cerberus output +set3dicon( relativeteam, shader ) { - self.worldicons[ relativeteam ] = shader; - updateworldicons(); + self.worldicons[relativeteam] = shader; + updateworldicons(); } -set3duseicon( relativeteam, shader ) //checked matches cerberus output +set3duseicon( relativeteam, shader ) { - self.worlduseicons[ relativeteam ] = shader; + self.worlduseicons[relativeteam] = shader; } -set3diswaypoint( relativeteam, waypoint ) //checked matches cerberus output +set3diswaypoint( relativeteam, waypoint ) { - self.worldiswaypoint[ relativeteam ] = waypoint; + self.worldiswaypoint[relativeteam] = waypoint; } -setcarryicon( shader ) //checked matches cerberus output +setcarryicon( shader ) { - self.carryicon = shader; + self.carryicon = shader; } -setvisiblecarriermodel( visiblemodel ) //checked matches cerberus output +setvisiblecarriermodel( visiblemodel ) { - self.visiblecarriermodel = visiblemodel; + self.visiblecarriermodel = visiblemodel; } -getvisiblecarriermodel() //checked matches cerberus output +getvisiblecarriermodel() { - return self.visiblecarriermodel; + return self.visiblecarriermodel; } -destroyobject( deletetrigger, forcehide ) //checked changed to match cerberus output +destroyobject( deletetrigger, forcehide ) { - if ( !isDefined( forcehide ) ) - { - forcehide = 1; - } - self disableobject( forcehide ); - foreach ( visual in self.visuals ) - { - visual hide(); - visual delete(); - } - self.trigger notify( "destroyed" ); - if ( is_true( deletetrigger ) ) - { - self.trigger delete(); - } - else - { - self.trigger triggeron(); - } + if ( !isdefined( forcehide ) ) + forcehide = 1; + + self disableobject( forcehide ); + + foreach ( visual in self.visuals ) + { + visual hide(); + visual delete(); + } + + self.trigger notify( "destroyed" ); + + if ( is_true( deletetrigger ) ) + self.trigger delete(); + else + self.trigger triggeron(); } -disableobject( forcehide ) //checked changed to match cerberus output +disableobject( forcehide ) { - self notify( "disabled" ); - if ( self.type == "carryObject" || is_true( forcehide ) ) - { - if ( isDefined( self.carrier ) ) - { - self.carrier takeobject( self ); - } - for ( index = 0; index < self.visuals.size; index++ ) - { - self.visuals[ index ] hide(); - } - } - self.trigger triggeroff(); - self setvisibleteam( "none" ); + self notify( "disabled" ); + + if ( self.type == "carryObject" || isdefined( forcehide ) && forcehide ) + { + if ( isdefined( self.carrier ) ) + self.carrier takeobject( self ); + + for ( index = 0; index < self.visuals.size; index++ ) + self.visuals[index] hide(); + } + + self.trigger triggeroff(); + self setvisibleteam( "none" ); } -enableobject( forceshow ) //checked changed to match cerberus output +enableobject( forceshow ) { - if ( self.type == "carryObject" || is_true( forceshow ) ) - { - for ( index = 0; index < self.visuals.size; index++ ) - { - self.visuals[ index ] show(); - } - } - self.trigger triggeron(); - self setvisibleteam( "any" ); + if ( self.type == "carryObject" || isdefined( forceshow ) && forceshow ) + { + for ( index = 0; index < self.visuals.size; index++ ) + self.visuals[index] show(); + } + + self.trigger triggeron(); + self setvisibleteam( "any" ); } -getrelativeteam( team ) //checked changed to match cerberus output +getrelativeteam( team ) { - if ( self.ownerteam == "any" ) - { - return "friendly"; - } - if ( team == self.ownerteam ) - { - return "friendly"; - } - else if ( team == getenemyteam( self.ownerteam ) ) - { - return "enemy"; - } - else - { - return "neutral"; - } + if ( self.ownerteam == "any" ) + return "friendly"; + + if ( team == self.ownerteam ) + return "friendly"; + else if ( team == getenemyteam( self.ownerteam ) ) + return "enemy"; + else + return "neutral"; } isfriendlyteam( team ) { - if ( !level.teambased ) - { - return 1; - } - if ( self.ownerteam == "any" ) - { - return 1; - } - if ( self.ownerteam == team ) - { - return 1; - } - return 0; + if ( !level.teambased ) + return true; + + if ( self.ownerteam == "any" ) + return true; + + if ( self.ownerteam == team ) + return true; + + return false; } -caninteractwith( player ) //checked changed to match beta dump +caninteractwith( player ) { - team = player.pers[ "team" ]; - switch( self.interactteam ) - { - case "none": - return 0; - case "any": - return 1; - case "friendly": - if ( level.teambased ) - { - if ( team == self.ownerteam ) - { - return 1; - } - else - { - return 0; - } - } - else - { - if ( player == self.ownerteam ) - { - return 1; - } - else - { - return 0; - } - } - case "enemy": - if ( level.teambased ) - { - if ( team != self.ownerteam ) - { - return 1; - } - else if ( is_true( self.decayprogress ) && self.curprogress > 0 ) - { - return 1; - } - else - { - return 0; - } - } - else - { - if ( player != self.ownerteam ) - { - return 1; - } - else - { - return 0; - } - } - default: - /* + team = player.pers["team"]; + + switch ( self.interactteam ) + { + case "none": + return false; + case "any": + return true; + case "friendly": + if ( level.teambased ) + { + if ( team == self.ownerteam ) + return true; + else + return false; + } + else if ( player == self.ownerteam ) + return true; + else + return false; + case "enemy": + if ( level.teambased ) + { + if ( team != self.ownerteam ) + return true; + else if ( isdefined( self.decayprogress ) && self.decayprogress && self.curprogress > 0 ) + return true; + else + return false; + } + else if ( player != self.ownerteam ) + return true; + else + return false; + default: /# - assert( 0, "invalid interactTeam" ); + assert( 0, "invalid interactTeam" ); #/ - */ - return 0; - } + return false; + } } -isteam( team ) //checked matches cerberus output +isteam( team ) { - if ( team == "neutral" ) - { - return 1; - } - if ( isDefined( level.teams[ team ] ) ) - { - return 1; - } - if ( team == "any" ) - { - return 1; - } - if ( team == "none" ) - { - return 1; - } - return 0; + if ( team == "neutral" ) + return true; + + if ( isdefined( level.teams[team] ) ) + return true; + + if ( team == "any" ) + return true; + + if ( team == "none" ) + return true; + + return false; } -isrelativeteam( relativeteam ) //checked matches cerberus output +isrelativeteam( relativeteam ) { - if ( relativeteam == "friendly" ) - { - return 1; - } - if ( relativeteam == "enemy" ) - { - return 1; - } - if ( relativeteam == "any" ) - { - return 1; - } - if ( relativeteam == "none" ) - { - return 1; - } - return 0; + if ( relativeteam == "friendly" ) + return true; + + if ( relativeteam == "enemy" ) + return true; + + if ( relativeteam == "any" ) + return true; + + if ( relativeteam == "none" ) + return true; + + return false; } -getenemyteam( team ) //checked changed to match cerberus output +getenemyteam( team ) { - if ( team == "neutral" ) - { - return "none"; - } - else if ( team == "allies" ) - { - return "axis"; - } - else - { - return "allies"; - } + if ( team == "neutral" ) + return "none"; + else if ( team == "allies" ) + return "axis"; + else + return "allies"; } -getnextobjid() //checked matches cerberus output +getnextobjid() { - nextid = 0; - if ( level.releasedobjectives.size > 0 ) - { - nextid = level.releasedobjectives[ level.releasedobjectives.size - 1 ]; - } - else - { - nextid = level.numgametypereservedobjectives; - level.numgametypereservedobjectives++; - } - /* + nextid = 0; + + if ( level.releasedobjectives.size > 0 ) + { + nextid = level.releasedobjectives[level.releasedobjectives.size - 1]; + level.releasedobjectives[level.releasedobjectives.size - 1] = undefined; + } + else + { + nextid = level.numgametypereservedobjectives; + level.numgametypereservedobjectives++; + } + /# - if ( nextid >= 32 ) - { - println( "^3SCRIPT WARNING: Ran out of objective IDs" ); + if ( nextid >= 32 ) + println( "^3SCRIPT WARNING: Ran out of objective IDs" ); #/ - } - */ - if ( nextid > 31 ) - { - nextid = 31; - } - return nextid; + + if ( nextid > 31 ) + nextid = 31; + + return nextid; } -releaseobjid( objid ) //checked changed to match cerberus output +releaseobjid( objid ) { - /* /# - assert( objid < level.numgametypereservedobjectives ); + assert( objid < level.numgametypereservedobjectives ); #/ - */ - for ( i = 0; i < level.releasedobjectives.size; i++ ) - { - if ( objid == level.releasedobjectives[ i ] && objid == 31 ) - { - return; - } - /* + + for ( i = 0; i < level.releasedobjectives.size; i++ ) + { + if ( objid == level.releasedobjectives[i] && objid == 31 ) + return; + /# - assert( objid != level.releasedobjectives[ i ] ); + assert( objid != level.releasedobjectives[i] ); #/ - */ - } - level.releasedobjectives[ level.releasedobjectives.size ] = objid; + } + + level.releasedobjectives[level.releasedobjectives.size] = objid; } -getlabel() //checked matches cerberus output +getlabel() { - label = self.trigger.script_label; - if ( !isDefined( label ) ) - { - label = ""; - return label; - } - if ( label[ 0 ] != "_" ) - { - return "_" + label; - } - return label; + label = self.trigger.script_label; + + if ( !isdefined( label ) ) + { + label = ""; + return label; + } + + if ( label[0] != "_" ) + return "_" + label; + + return label; } -mustmaintainclaim( enabled ) //checked matches cerberus output +mustmaintainclaim( enabled ) { - self.mustmaintainclaim = enabled; + self.mustmaintainclaim = enabled; } -cancontestclaim( enabled ) //checked matches cerberus output +cancontestclaim( enabled ) { - self.cancontestclaim = enabled; + self.cancontestclaim = enabled; } -setflags( flags ) //checked matches cerberus output +setflags( flags ) { - objective_setgamemodeflags( self.objectiveid, flags ); + objective_setgamemodeflags( self.objectiveid, flags ); } -getflags( flags ) //checked matches cerberus output +getflags( flags ) { - return objective_getgamemodeflags( self.objectiveid ); + return objective_getgamemodeflags( self.objectiveid ); } - - diff --git a/Multiplayer Core/patch_mp/maps/mp/gametypes/_globalentities.gsc b/Multiplayer Core/patch_mp/maps/mp/gametypes/_globalentities.gsc index e69de29..592d38c 100644 --- a/Multiplayer Core/patch_mp/maps/mp/gametypes/_globalentities.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/gametypes/_globalentities.gsc @@ -0,0 +1,2 @@ +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool diff --git a/Multiplayer Core/patch_mp/maps/mp/gametypes/_globallogic.gsc b/Multiplayer Core/patch_mp/maps/mp/gametypes/_globallogic.gsc index 1985674..77a1374 100644 --- a/Multiplayer Core/patch_mp/maps/mp/gametypes/_globallogic.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/gametypes/_globallogic.gsc @@ -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 ) ) diff --git a/Multiplayer Core/patch_mp/maps/mp/gametypes/_globallogic_actor.gsc b/Multiplayer Core/patch_mp/maps/mp/gametypes/_globallogic_actor.gsc index 5fc7cba..861b0c3 100644 --- a/Multiplayer Core/patch_mp/maps/mp/gametypes/_globallogic_actor.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/gametypes/_globallogic_actor.gsc @@ -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(); + } + } +} diff --git a/Multiplayer Core/patch_mp/maps/mp/gametypes/_globallogic_audio.gsc b/Multiplayer Core/patch_mp/maps/mp/gametypes/_globallogic_audio.gsc index 456be6c..a92e876 100644 --- a/Multiplayer Core/patch_mp/maps/mp/gametypes/_globallogic_audio.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/gametypes/_globallogic_audio.gsc @@ -1,1004 +1,878 @@ -//checked includes match cerberus output -#include maps/mp/_music; -#include maps/mp/gametypes/_globallogic_audio; -#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 -init() //checked matches cerberus output +init() { - game[ "music" ][ "defeat" ] = "mus_defeat"; - game[ "music" ][ "victory_spectator" ] = "mus_defeat"; - game[ "music" ][ "winning" ] = "mus_time_running_out_winning"; - game[ "music" ][ "losing" ] = "mus_time_running_out_losing"; - game[ "music" ][ "match_end" ] = "mus_match_end"; - game[ "music" ][ "victory_tie" ] = "mus_defeat"; - game[ "music" ][ "suspense" ] = []; - game[ "music" ][ "suspense" ][ game[ "music" ][ "suspense" ].size ] = "mus_suspense_01"; - game[ "music" ][ "suspense" ][ game[ "music" ][ "suspense" ].size ] = "mus_suspense_02"; - game[ "music" ][ "suspense" ][ game[ "music" ][ "suspense" ].size ] = "mus_suspense_03"; - game[ "music" ][ "suspense" ][ game[ "music" ][ "suspense" ].size ] = "mus_suspense_04"; - game[ "music" ][ "suspense" ][ game[ "music" ][ "suspense" ].size ] = "mus_suspense_05"; - game[ "music" ][ "suspense" ][ game[ "music" ][ "suspense" ].size ] = "mus_suspense_06"; - game[ "dialog" ][ "mission_success" ] = "mission_success"; - game[ "dialog" ][ "mission_failure" ] = "mission_fail"; - game[ "dialog" ][ "mission_draw" ] = "draw"; - game[ "dialog" ][ "round_success" ] = "encourage_win"; - game[ "dialog" ][ "round_failure" ] = "encourage_lost"; - game[ "dialog" ][ "round_draw" ] = "draw"; - game[ "dialog" ][ "timesup" ] = "timesup"; - game[ "dialog" ][ "winning" ] = "winning"; - game[ "dialog" ][ "losing" ] = "losing"; - game[ "dialog" ][ "min_draw" ] = "min_draw"; - game[ "dialog" ][ "lead_lost" ] = "lead_lost"; - game[ "dialog" ][ "lead_tied" ] = "tied"; - game[ "dialog" ][ "lead_taken" ] = "lead_taken"; - game[ "dialog" ][ "last_alive" ] = "lastalive"; - game[ "dialog" ][ "boost" ] = "generic_boost"; - if ( !isDefined( game[ "dialog" ][ "offense_obj" ] ) ) - { - game[ "dialog" ][ "offense_obj" ] = "generic_boost"; - } - if ( !isDefined( game[ "dialog" ][ "defense_obj" ] ) ) - { - game[ "dialog" ][ "defense_obj" ] = "generic_boost"; - } - game[ "dialog" ][ "hardcore" ] = "hardcore"; - game[ "dialog" ][ "oldschool" ] = "oldschool"; - game[ "dialog" ][ "highspeed" ] = "highspeed"; - game[ "dialog" ][ "tactical" ] = "tactical"; - game[ "dialog" ][ "challenge" ] = "challengecomplete"; - game[ "dialog" ][ "promotion" ] = "promotion"; - game[ "dialog" ][ "bomb_acquired" ] = "sd_bomb_taken"; - game[ "dialog" ][ "bomb_taken" ] = "sd_bomb_taken_taken"; - game[ "dialog" ][ "bomb_lost" ] = "sd_bomb_drop"; - game[ "dialog" ][ "bomb_defused" ] = "sd_bomb_defused"; - game[ "dialog" ][ "bomb_planted" ] = "sd_bomb_planted"; - game[ "dialog" ][ "obj_taken" ] = "securedobj"; - game[ "dialog" ][ "obj_lost" ] = "lostobj"; - game[ "dialog" ][ "obj_defend" ] = "defend_start"; - game[ "dialog" ][ "obj_destroy" ] = "destroy_start"; - game[ "dialog" ][ "obj_capture" ] = "capture_obj"; - game[ "dialog" ][ "objs_capture" ] = "capture_objs"; - game[ "dialog" ][ "hq_located" ] = "hq_located"; - game[ "dialog" ][ "hq_enemy_captured" ] = "hq_capture"; - game[ "dialog" ][ "hq_enemy_destroyed" ] = "hq_defend"; - game[ "dialog" ][ "hq_secured" ] = "hq_secured"; - game[ "dialog" ][ "hq_offline" ] = "hq_offline"; - game[ "dialog" ][ "hq_online" ] = "hq_online"; - game[ "dialog" ][ "koth_located" ] = "koth_located"; - game[ "dialog" ][ "koth_captured" ] = "koth_captured"; - game[ "dialog" ][ "koth_lost" ] = "koth_lost"; - game[ "dialog" ][ "koth_secured" ] = "koth_secured"; - game[ "dialog" ][ "koth_contested" ] = "koth_contest"; - game[ "dialog" ][ "koth_offline" ] = "koth_offline"; - game[ "dialog" ][ "koth_online" ] = "koth_online"; - game[ "dialog" ][ "move_to_new" ] = "new_positions"; - game[ "dialog" ][ "attack" ] = "attack"; - game[ "dialog" ][ "defend" ] = "defend"; - game[ "dialog" ][ "offense" ] = "offense"; - game[ "dialog" ][ "defense" ] = "defense"; - game[ "dialog" ][ "halftime" ] = "sd_halftime"; - game[ "dialog" ][ "overtime" ] = "overtime"; - game[ "dialog" ][ "side_switch" ] = "switchingsides"; - game[ "dialog" ][ "flag_taken" ] = "ourflag"; - game[ "dialog" ][ "flag_dropped" ] = "ourflag_drop"; - game[ "dialog" ][ "flag_returned" ] = "ourflag_return"; - game[ "dialog" ][ "flag_captured" ] = "ourflag_capt"; - game[ "dialog" ][ "enemy_flag_taken" ] = "enemyflag"; - game[ "dialog" ][ "enemy_flag_dropped" ] = "enemyflag_drop"; - game[ "dialog" ][ "enemy_flag_returned" ] = "enemyflag_return"; - game[ "dialog" ][ "enemy_flag_captured" ] = "enemyflag_capt"; - game[ "dialog" ][ "securing_a" ] = "dom_securing_a"; - game[ "dialog" ][ "securing_b" ] = "dom_securing_b"; - game[ "dialog" ][ "securing_c" ] = "dom_securing_c"; - game[ "dialog" ][ "securing_d" ] = "dom_securing_d"; - game[ "dialog" ][ "securing_e" ] = "dom_securing_e"; - game[ "dialog" ][ "securing_f" ] = "dom_securing_f"; - game[ "dialog" ][ "secured_a" ] = "dom_secured_a"; - game[ "dialog" ][ "secured_b" ] = "dom_secured_b"; - game[ "dialog" ][ "secured_c" ] = "dom_secured_c"; - game[ "dialog" ][ "secured_d" ] = "dom_secured_d"; - game[ "dialog" ][ "secured_e" ] = "dom_secured_e"; - game[ "dialog" ][ "secured_f" ] = "dom_secured_f"; - game[ "dialog" ][ "losing_a" ] = "dom_losing_a"; - game[ "dialog" ][ "losing_b" ] = "dom_losing_b"; - game[ "dialog" ][ "losing_c" ] = "dom_losing_c"; - game[ "dialog" ][ "losing_d" ] = "dom_losing_d"; - game[ "dialog" ][ "losing_e" ] = "dom_losing_e"; - game[ "dialog" ][ "losing_f" ] = "dom_losing_f"; - game[ "dialog" ][ "lost_a" ] = "dom_lost_a"; - game[ "dialog" ][ "lost_b" ] = "dom_lost_b"; - game[ "dialog" ][ "lost_c" ] = "dom_lost_c"; - game[ "dialog" ][ "lost_d" ] = "dom_lost_d"; - game[ "dialog" ][ "lost_e" ] = "dom_lost_e"; - game[ "dialog" ][ "lost_f" ] = "dom_lost_f"; - game[ "dialog" ][ "enemy_a" ] = "dom_enemy_a"; - game[ "dialog" ][ "enemy_b" ] = "dom_enemy_b"; - game[ "dialog" ][ "enemy_c" ] = "dom_enemy_c"; - game[ "dialog" ][ "enemy_d" ] = "dom_enemy_d"; - game[ "dialog" ][ "enemy_e" ] = "dom_enemy_e"; - game[ "dialog" ][ "enemy_f" ] = "dom_enemy_f"; - game[ "dialog" ][ "secure_flag" ] = "secure_flag"; - game[ "dialog" ][ "securing_flag" ] = "securing_flag"; - game[ "dialog" ][ "losing_flag" ] = "losing_flag"; - game[ "dialog" ][ "lost_flag" ] = "lost_flag"; - game[ "dialog" ][ "oneflag_enemy" ] = "oneflag_enemy"; - game[ "dialog" ][ "oneflag_friendly" ] = "oneflag_friendly"; - game[ "dialog" ][ "lost_all" ] = "dom_lock_theytake"; - game[ "dialog" ][ "secure_all" ] = "dom_lock_wetake"; - game[ "dialog" ][ "squad_move" ] = "squad_move"; - game[ "dialog" ][ "squad_30sec" ] = "squad_30sec"; - game[ "dialog" ][ "squad_winning" ] = "squad_onemin_vic"; - game[ "dialog" ][ "squad_losing" ] = "squad_onemin_loss"; - game[ "dialog" ][ "squad_down" ] = "squad_down"; - game[ "dialog" ][ "squad_bomb" ] = "squad_bomb"; - game[ "dialog" ][ "squad_plant" ] = "squad_plant"; - game[ "dialog" ][ "squad_take" ] = "squad_takeobj"; - game[ "dialog" ][ "kicked" ] = "player_kicked"; - game[ "dialog" ][ "sentry_destroyed" ] = "dest_sentry"; - game[ "dialog" ][ "sentry_hacked" ] = "kls_turret_hacked"; - game[ "dialog" ][ "microwave_destroyed" ] = "dest_microwave"; - game[ "dialog" ][ "microwave_hacked" ] = "kls_microwave_hacked"; - game[ "dialog" ][ "sam_destroyed" ] = "dest_sam"; - game[ "dialog" ][ "tact_destroyed" ] = "dest_tact"; - game[ "dialog" ][ "equipment_destroyed" ] = "dest_equip"; - game[ "dialog" ][ "hacked_equip" ] = "hacked_equip"; - game[ "dialog" ][ "uav_destroyed" ] = "kls_u2_destroyed"; - game[ "dialog" ][ "cuav_destroyed" ] = "kls_cu2_destroyed"; - game[ "dialog" ][ "wm_in_the_money" ] = "mpl_wager_top3_gain"; - game[ "dialog" ][ "wm_oot_money" ] = "mpl_wager_top3_loss"; - level.dialoggroups = []; - level thread post_match_snapshot_watcher(); + game["music"]["defeat"] = "mus_defeat"; + game["music"]["victory_spectator"] = "mus_defeat"; + game["music"]["winning"] = "mus_time_running_out_winning"; + game["music"]["losing"] = "mus_time_running_out_losing"; + game["music"]["match_end"] = "mus_match_end"; + game["music"]["victory_tie"] = "mus_defeat"; + game["music"]["suspense"] = []; + game["music"]["suspense"][game["music"]["suspense"].size] = "mus_suspense_01"; + game["music"]["suspense"][game["music"]["suspense"].size] = "mus_suspense_02"; + game["music"]["suspense"][game["music"]["suspense"].size] = "mus_suspense_03"; + game["music"]["suspense"][game["music"]["suspense"].size] = "mus_suspense_04"; + game["music"]["suspense"][game["music"]["suspense"].size] = "mus_suspense_05"; + game["music"]["suspense"][game["music"]["suspense"].size] = "mus_suspense_06"; + game["dialog"]["mission_success"] = "mission_success"; + game["dialog"]["mission_failure"] = "mission_fail"; + game["dialog"]["mission_draw"] = "draw"; + game["dialog"]["round_success"] = "encourage_win"; + game["dialog"]["round_failure"] = "encourage_lost"; + game["dialog"]["round_draw"] = "draw"; + game["dialog"]["timesup"] = "timesup"; + game["dialog"]["winning"] = "winning"; + game["dialog"]["losing"] = "losing"; + game["dialog"]["min_draw"] = "min_draw"; + game["dialog"]["lead_lost"] = "lead_lost"; + game["dialog"]["lead_tied"] = "tied"; + game["dialog"]["lead_taken"] = "lead_taken"; + game["dialog"]["last_alive"] = "lastalive"; + game["dialog"]["boost"] = "generic_boost"; + + if ( !isdefined( game["dialog"]["offense_obj"] ) ) + game["dialog"]["offense_obj"] = "generic_boost"; + + if ( !isdefined( game["dialog"]["defense_obj"] ) ) + game["dialog"]["defense_obj"] = "generic_boost"; + + game["dialog"]["hardcore"] = "hardcore"; + game["dialog"]["oldschool"] = "oldschool"; + game["dialog"]["highspeed"] = "highspeed"; + game["dialog"]["tactical"] = "tactical"; + game["dialog"]["challenge"] = "challengecomplete"; + game["dialog"]["promotion"] = "promotion"; + game["dialog"]["bomb_acquired"] = "sd_bomb_taken"; + game["dialog"]["bomb_taken"] = "sd_bomb_taken_taken"; + game["dialog"]["bomb_lost"] = "sd_bomb_drop"; + game["dialog"]["bomb_defused"] = "sd_bomb_defused"; + game["dialog"]["bomb_planted"] = "sd_bomb_planted"; + game["dialog"]["obj_taken"] = "securedobj"; + game["dialog"]["obj_lost"] = "lostobj"; + game["dialog"]["obj_defend"] = "defend_start"; + game["dialog"]["obj_destroy"] = "destroy_start"; + game["dialog"]["obj_capture"] = "capture_obj"; + game["dialog"]["objs_capture"] = "capture_objs"; + game["dialog"]["hq_located"] = "hq_located"; + game["dialog"]["hq_enemy_captured"] = "hq_capture"; + game["dialog"]["hq_enemy_destroyed"] = "hq_defend"; + game["dialog"]["hq_secured"] = "hq_secured"; + game["dialog"]["hq_offline"] = "hq_offline"; + game["dialog"]["hq_online"] = "hq_online"; + game["dialog"]["koth_located"] = "koth_located"; + game["dialog"]["koth_captured"] = "koth_captured"; + game["dialog"]["koth_lost"] = "koth_lost"; + game["dialog"]["koth_secured"] = "koth_secured"; + game["dialog"]["koth_contested"] = "koth_contest"; + game["dialog"]["koth_offline"] = "koth_offline"; + game["dialog"]["koth_online"] = "koth_online"; + game["dialog"]["move_to_new"] = "new_positions"; + game["dialog"]["attack"] = "attack"; + game["dialog"]["defend"] = "defend"; + game["dialog"]["offense"] = "offense"; + game["dialog"]["defense"] = "defense"; + game["dialog"]["halftime"] = "sd_halftime"; + game["dialog"]["overtime"] = "overtime"; + game["dialog"]["side_switch"] = "switchingsides"; + game["dialog"]["flag_taken"] = "ourflag"; + game["dialog"]["flag_dropped"] = "ourflag_drop"; + game["dialog"]["flag_returned"] = "ourflag_return"; + game["dialog"]["flag_captured"] = "ourflag_capt"; + game["dialog"]["enemy_flag_taken"] = "enemyflag"; + game["dialog"]["enemy_flag_dropped"] = "enemyflag_drop"; + game["dialog"]["enemy_flag_returned"] = "enemyflag_return"; + game["dialog"]["enemy_flag_captured"] = "enemyflag_capt"; + game["dialog"]["securing_a"] = "dom_securing_a"; + game["dialog"]["securing_b"] = "dom_securing_b"; + game["dialog"]["securing_c"] = "dom_securing_c"; + game["dialog"]["securing_d"] = "dom_securing_d"; + game["dialog"]["securing_e"] = "dom_securing_e"; + game["dialog"]["securing_f"] = "dom_securing_f"; + game["dialog"]["secured_a"] = "dom_secured_a"; + game["dialog"]["secured_b"] = "dom_secured_b"; + game["dialog"]["secured_c"] = "dom_secured_c"; + game["dialog"]["secured_d"] = "dom_secured_d"; + game["dialog"]["secured_e"] = "dom_secured_e"; + game["dialog"]["secured_f"] = "dom_secured_f"; + game["dialog"]["losing_a"] = "dom_losing_a"; + game["dialog"]["losing_b"] = "dom_losing_b"; + game["dialog"]["losing_c"] = "dom_losing_c"; + game["dialog"]["losing_d"] = "dom_losing_d"; + game["dialog"]["losing_e"] = "dom_losing_e"; + game["dialog"]["losing_f"] = "dom_losing_f"; + game["dialog"]["lost_a"] = "dom_lost_a"; + game["dialog"]["lost_b"] = "dom_lost_b"; + game["dialog"]["lost_c"] = "dom_lost_c"; + game["dialog"]["lost_d"] = "dom_lost_d"; + game["dialog"]["lost_e"] = "dom_lost_e"; + game["dialog"]["lost_f"] = "dom_lost_f"; + game["dialog"]["enemy_a"] = "dom_enemy_a"; + game["dialog"]["enemy_b"] = "dom_enemy_b"; + game["dialog"]["enemy_c"] = "dom_enemy_c"; + game["dialog"]["enemy_d"] = "dom_enemy_d"; + game["dialog"]["enemy_e"] = "dom_enemy_e"; + game["dialog"]["enemy_f"] = "dom_enemy_f"; + game["dialog"]["secure_flag"] = "secure_flag"; + game["dialog"]["securing_flag"] = "securing_flag"; + game["dialog"]["losing_flag"] = "losing_flag"; + game["dialog"]["lost_flag"] = "lost_flag"; + game["dialog"]["oneflag_enemy"] = "oneflag_enemy"; + game["dialog"]["oneflag_friendly"] = "oneflag_friendly"; + game["dialog"]["lost_all"] = "dom_lock_theytake"; + game["dialog"]["secure_all"] = "dom_lock_wetake"; + game["dialog"]["squad_move"] = "squad_move"; + game["dialog"]["squad_30sec"] = "squad_30sec"; + game["dialog"]["squad_winning"] = "squad_onemin_vic"; + game["dialog"]["squad_losing"] = "squad_onemin_loss"; + game["dialog"]["squad_down"] = "squad_down"; + game["dialog"]["squad_bomb"] = "squad_bomb"; + game["dialog"]["squad_plant"] = "squad_plant"; + game["dialog"]["squad_take"] = "squad_takeobj"; + game["dialog"]["kicked"] = "player_kicked"; + game["dialog"]["sentry_destroyed"] = "dest_sentry"; + game["dialog"]["sentry_hacked"] = "kls_turret_hacked"; + game["dialog"]["microwave_destroyed"] = "dest_microwave"; + game["dialog"]["microwave_hacked"] = "kls_microwave_hacked"; + game["dialog"]["sam_destroyed"] = "dest_sam"; + game["dialog"]["tact_destroyed"] = "dest_tact"; + game["dialog"]["equipment_destroyed"] = "dest_equip"; + game["dialog"]["hacked_equip"] = "hacked_equip"; + game["dialog"]["uav_destroyed"] = "kls_u2_destroyed"; + game["dialog"]["cuav_destroyed"] = "kls_cu2_destroyed"; + game["dialog"]["wm_in_the_money"] = "mpl_wager_top3_gain"; + game["dialog"]["wm_oot_money"] = "mpl_wager_top3_loss"; + level.dialoggroups = []; + level thread post_match_snapshot_watcher(); } -registerdialoggroup( group, skipifcurrentlyplayinggroup ) //checked changed to match cerberus output +registerdialoggroup( group, skipifcurrentlyplayinggroup ) { - if ( !isDefined( level.dialoggroups ) ) - { - level.dialoggroups = []; - } - else if ( isDefined( level.dialoggroup[ group ] ) ) - { - /* + if ( !isdefined( level.dialoggroups ) ) + level.dialoggroups = []; + else if ( isdefined( level.dialoggroup[group] ) ) + { /# - error( "registerDialogGroup: Dialog group " + group + " already registered." ); + error( "registerDialogGroup: Dialog group " + group + " already registered." ); #/ - */ - return; - } - level.dialoggroup[ group ] = spawnstruct(); - level.dialoggroup[ group ].group = group; - level.dialoggroup[ group ].skipifcurrentlyplayinggroup = skipifcurrentlyplayinggroup; - level.dialoggroup[ group ].currentcount = 0; + return; + } + + level.dialoggroup[group] = spawnstruct(); + level.dialoggroup[group].group = group; + level.dialoggroup[group].skipifcurrentlyplayinggroup = skipifcurrentlyplayinggroup; + level.dialoggroup[group].currentcount = 0; } -sndstartmusicsystem() //checked matches cerberus output dvars taken from beta dump +sndstartmusicsystem() { - self endon( "disconnect" ); - if ( game[ "state" ] == "postgame" ) - { - return; - } - if ( game[ "state" ] == "pregame" ) - { - /* + self endon( "disconnect" ); + + if ( game["state"] == "postgame" ) + return; + + if ( game["state"] == "pregame" ) + { /# - if ( getDvarInt( "debug_music" ) > 0 ) - { - println( "Music System - music state is undefined Waiting 15 seconds to set music state" ); + if ( getdvarint( _hash_BC4784C ) > 0 ) + println( "Music System - music state is undefined Waiting 15 seconds to set music state" ); #/ - } - */ - wait 45; - if ( !isDefined( level.nextmusicstate ) ) - { - self.pers[ "music" ].currentstate = "UNDERSCORE"; - self thread suspensemusic(); - } - } - if ( !isDefined( level.nextmusicstate ) ) - { - /* + wait 45; + + if ( !isdefined( level.nextmusicstate ) ) + { + self.pers["music"].currentstate = "UNDERSCORE"; + self thread suspensemusic(); + } + } + + if ( !isdefined( level.nextmusicstate ) ) + { /# - if ( getDvarInt( "debug_music" ) > 0 ) - { - println( "Music System - music state is undefined Waiting 15 seconds to set music state" ); + if ( getdvarint( _hash_BC4784C ) > 0 ) + println( "Music System - music state is undefined Waiting 15 seconds to set music state" ); #/ - } - */ - self.pers[ "music" ].currentstate = "UNDERSCORE"; - self thread suspensemusic(); - } + self.pers["music"].currentstate = "UNDERSCORE"; + self thread suspensemusic(); + } } -suspensemusicforplayer() //checked matches cerberus output dvar taken from beta dump +suspensemusicforplayer() { - self endon( "disconnect" ); - self thread set_music_on_player( "UNDERSCORE", 0 ); - /* + self endon( "disconnect" ); + self thread set_music_on_player( "UNDERSCORE", 0 ); /# - if ( getDvarInt( "debug_music" ) > 0 ) - { - println( "Music System - Setting Music State Random Underscore " + self.pers[ "music" ].returnstate + " On player " + self getentitynumber() ); + if ( getdvarint( _hash_BC4784C ) > 0 ) + println( "Music System - Setting Music State Random Underscore " + self.pers["music"].returnstate + " On player " + self getentitynumber() ); #/ - } - */ } -suspensemusic( random ) //checked changed to match cerberus output dvars taken from beta dump +suspensemusic( random ) { - level endon( "game_ended" ); - level endon( "match_ending_soon" ); - self endon( "disconnect" ); - /* + level endon( "game_ended" ); + level endon( "match_ending_soon" ); + self endon( "disconnect" ); /# - if ( getDvarInt( "debug_music" ) > 0 ) - { - println( "Music System - Starting random underscore" ); + if ( getdvarint( _hash_BC4784C ) > 0 ) + println( "Music System - Starting random underscore" ); #/ - } - */ - while ( 1 ) - { - wait randomintrange( 25, 60 ); - /* + + while ( true ) + { + wait( randomintrange( 25, 60 ) ); /# - if ( getDvarInt( "debug_music" ) > 0 ) - { - println( "Music System - Checking for random underscore" ); + if ( getdvarint( _hash_BC4784C ) > 0 ) + println( "Music System - Checking for random underscore" ); #/ - } - */ - if ( !isDefined( self.pers[ "music" ].inque ) ) - { - self.pers[ "music" ].inque = 0; - } - if ( self.pers[ "music" ].inque ) - { - /* + + if ( !isdefined( self.pers["music"].inque ) ) + self.pers["music"].inque = 0; + + if ( self.pers["music"].inque ) + { /# - if ( getDvarInt( "debug_music" ) > 0 ) - { - println( "Music System - Inque no random underscore" ); + if ( getdvarint( _hash_BC4784C ) > 0 ) + println( "Music System - Inque no random underscore" ); #/ - } - */ - continue; - } - if ( !isDefined( self.pers[ "music" ].currentstate ) ) - { - self.pers[ "music" ].currentstate = "SILENT"; - } - if ( randomint( 100 ) < self.underscorechance && self.pers[ "music" ].currentstate != "ACTION" && self.pers[ "music" ].currentstate != "TIME_OUT" ) - { - self thread suspensemusicforplayer(); - self.underscorechance -= 20; - /* + continue; + } + + if ( !isdefined( self.pers["music"].currentstate ) ) + self.pers["music"].currentstate = "SILENT"; + + if ( randomint( 100 ) < self.underscorechance && self.pers["music"].currentstate != "ACTION" && self.pers["music"].currentstate != "TIME_OUT" ) + { + self thread suspensemusicforplayer(); + self.underscorechance -= 20; /# - if ( getDvarInt( "debug_music" ) > 0 ) - { - println( "Music System - Starting random underscore" ); + if ( getdvarint( _hash_BC4784C ) > 0 ) + println( "Music System - Starting random underscore" ); #/ - } - */ - } - } + } + } } -leaderdialogforotherteams( dialog, skip_team, squad_dialog ) //checked changed to match cerberus output +leaderdialogforotherteams( dialog, skip_team, squad_dialog ) { - foreach ( team in level.teams ) - { - if ( team != skip_team ) - { - leaderdialog( dialog, team, undefined, undefined, squad_dialog ); - } - } + foreach ( team in level.teams ) + { + if ( team != skip_team ) + leaderdialog( dialog, team, undefined, undefined, squad_dialog ); + } } -announceroundwinner( winner, delay ) //checked changed to match cerberus output +announceroundwinner( winner, delay ) { - if ( delay > 0 ) - { - wait delay; - } - if ( !isDefined( winner ) || isplayer( winner ) ) - { - return; - } - if ( isDefined( level.teams[ winner ] ) ) - { - leaderdialog( "round_success", winner ); - leaderdialogforotherteams( "round_failure", winner ); - } - else - { - foreach ( team in level.teams ) - { - thread playsoundonplayers( "mus_round_draw" + "_" + level.teampostfix[ team ] ); - } - leaderdialog( "round_draw" ); - } + if ( delay > 0 ) + wait( delay ); + + if ( !isdefined( winner ) || isplayer( winner ) ) + return; + + if ( isdefined( level.teams[winner] ) ) + { + leaderdialog( "round_success", winner ); + leaderdialogforotherteams( "round_failure", winner ); + } + else + { + foreach ( team in level.teams ) + thread playsoundonplayers( "mus_round_draw" + "_" + level.teampostfix[team] ); + + leaderdialog( "round_draw" ); + } } -announcegamewinner( winner, delay ) //checked matches cerberus output +announcegamewinner( winner, delay ) { - if ( delay > 0 ) - { - wait delay; - } - if ( !isDefined( winner ) || isplayer( winner ) ) - { - return; - } - if ( isDefined( level.teams[ winner ] ) ) - { - leaderdialog( "mission_success", winner ); - leaderdialogforotherteams( "mission_failure", winner ); - } - else - { - leaderdialog( "mission_draw" ); - } + if ( delay > 0 ) + wait( delay ); + + if ( !isdefined( winner ) || isplayer( winner ) ) + return; + + if ( isdefined( level.teams[winner] ) ) + { + leaderdialog( "mission_success", winner ); + leaderdialogforotherteams( "mission_failure", winner ); + } + else + leaderdialog( "mission_draw" ); } -doflameaudio() //checked matches cerberus output +doflameaudio() { - self endon( "disconnect" ); - waittillframeend; - if ( !isDefined( self.lastflamehurtaudio ) ) - { - self.lastflamehurtaudio = 0; - } - currenttime = getTime(); - if ( ( self.lastflamehurtaudio + level.fire_audio_repeat_duration + randomint( level.fire_audio_random_max_duration ) ) < currenttime ) - { - self playlocalsound( "vox_pain_small" ); - self.lastflamehurtaudio = currenttime; - } + self endon( "disconnect" ); + waittillframeend; + + if ( !isdefined( self.lastflamehurtaudio ) ) + self.lastflamehurtaudio = 0; + + currenttime = gettime(); + + if ( self.lastflamehurtaudio + level.fire_audio_repeat_duration + randomint( level.fire_audio_random_max_duration ) < currenttime ) + { + self playlocalsound( "vox_pain_small" ); + self.lastflamehurtaudio = currenttime; + } } -leaderdialog( dialog, team, group, excludelist, squaddialog ) //checked changed to match beta dump +leaderdialog( dialog, team, group, excludelist, squaddialog ) { - /* /# - assert( isDefined( level.players ) ); + assert( isdefined( level.players ) ); #/ - */ - if ( level.wagermatch ) - { - return; - } - if ( !isDefined( team ) ) - { - dialogs = []; - foreach ( team in level.teams ) - { - dialogs[ team ] = dialog; - } - leaderdialogallteams( dialogs, group, excludelist ); - return; - } - if ( isDefined( excludelist ) ) - { - for ( i = 0; i < level.players.size; i++ ) - { - player = level.players[ i ]; - if ( isDefined( player.pers[ "team" ] ) && player.pers[ "team" ] == team && !maps/mp/gametypes/_globallogic_utils::isexcluded( player, excludelist ) ) - { - player leaderdialogonplayer( dialog, group ); - } - } - } - else - { - for ( i = 0; i < level.players.size; i++ ) - { - player = level.players[ i ]; - if ( isDefined( player.pers[ "team" ] ) && player.pers[ "team" ] == team ) - { - player leaderdialogonplayer( dialog, group ); - } - } - } + + if ( level.wagermatch ) + return; + + if ( !isdefined( team ) ) + { + dialogs = []; + + foreach ( team in level.teams ) + dialogs[team] = dialog; + + leaderdialogallteams( dialogs, group, excludelist ); + return; + } + + if ( isdefined( excludelist ) ) + { + for ( i = 0; i < level.players.size; i++ ) + { + player = level.players[i]; + + if ( isdefined( player.pers["team"] ) && player.pers["team"] == team && !maps\mp\gametypes\_globallogic_utils::isexcluded( player, excludelist ) ) + player leaderdialogonplayer( dialog, group ); + } + } + else + { + for ( i = 0; i < level.players.size; i++ ) + { + player = level.players[i]; + + if ( isdefined( player.pers["team"] ) && player.pers["team"] == team ) + player leaderdialogonplayer( dialog, group ); + } + } } -leaderdialogallteams( dialogs, group, excludelist ) //checked partially changed to match cerberus see info.md +leaderdialogallteams( dialogs, group, excludelist ) { - /* /# - assert( isDefined( level.players ) ); + assert( isdefined( level.players ) ); #/ - */ - i = 0; - while ( i < level.players.size ) - { - player = level.players[ i ]; - team = player.pers[ "team" ]; - if ( !isDefined( team ) ) - { - i++; - continue; - } - if ( !isDefined( dialogs[ team ] ) ) - { - i++; - continue; - } - if ( isDefined( excludelist ) && maps/mp/gametypes/_globallogic_utils::isexcluded( player, excludelist ) ) - { - i++; - continue; - } - player leaderdialogonplayer( dialogs[ team ], group ); - i++; - } + + for ( i = 0; i < level.players.size; i++ ) + { + player = level.players[i]; + team = player.pers["team"]; + + if ( !isdefined( team ) ) + continue; + + if ( !isdefined( dialogs[team] ) ) + continue; + + if ( isdefined( excludelist ) && maps\mp\gametypes\_globallogic_utils::isexcluded( player, excludelist ) ) + continue; + + player leaderdialogonplayer( dialogs[team], group ); + } } -flushdialog() //checked changed to match cerberus output +flushdialog() { - foreach ( player in level.players ) - { - player flushdialogonplayer(); - } + foreach ( player in level.players ) + player flushdialogonplayer(); } -flushdialogonplayer() //checked matches cerberus output +flushdialogonplayer() { - self.leaderdialoggroups = []; - self.leaderdialogqueue = []; - self.leaderdialogactive = 0; - self.currentleaderdialoggroup = ""; - self notify( "flush_dialog" ); + self.leaderdialoggroups = []; + self.leaderdialogqueue = []; + self.leaderdialogactive = 0; + self.currentleaderdialoggroup = ""; + self notify( "flush_dialog" ); } -flushgroupdialog( group ) //checked changed to match cerberus output +flushgroupdialog( group ) { - foreach ( player in level.players ) - { - player flushgroupdialogonplayer( group ); - } + foreach ( player in level.players ) + player flushgroupdialogonplayer( group ); } -flushgroupdialogonplayer( group ) //checked changed to match cerberus output +flushgroupdialogonplayer( group ) { - self.leaderdialoggroups[ group ] = undefined; - arrayremovevalue( self.leaderdialogqueue, group ); - if ( self.leaderdialogqueue.size == 0 ) - { - self flushdialogonplayer(); - } + self.leaderdialoggroups[group] = undefined; + arrayremovevalue( self.leaderdialogqueue, group ); + + if ( self.leaderdialogqueue.size == 0 ) + self flushdialogonplayer(); } -addgroupdialogtoplayer( dialog, group ) //checked changed to match cerberus output +addgroupdialogtoplayer( dialog, group ) { - if ( !isDefined( level.dialoggroup[ group ] ) ) - { - /* + if ( !isdefined( level.dialoggroup[group] ) ) + { /# - error( "leaderDialogOnPlayer: Dialog group " + group + " is not registered" ); + error( "leaderDialogOnPlayer: Dialog group " + group + " is not registered" ); #/ - */ - return 0; - } - addtoqueue = 0; - if ( !isDefined( self.leaderdialoggroups[ group ] ) ) - { - addtoqueue = 1; - } - if ( !level.dialoggroup[ group ].skipifcurrentlyplayinggroup ) - { - if ( self.currentleaderdialog == dialog && ( self.currentleaderdialogtime + 2000 ) > getTime() ) - { - self.leaderdialoggroups[ group ] = undefined; - arrayremovevalue( self.leaderdialogqueue, group ); - if ( self.leaderdialogqueue.size == 0 ) - { - self flushdialogonplayer(); - } - return 0; - } - } - else if ( self.currentleaderdialoggroup == group ) - { - return 0; - } - self.leaderdialoggroups[ group ] = dialog; - return addtoqueue; + return 0; + } + + addtoqueue = 0; + + if ( !isdefined( self.leaderdialoggroups[group] ) ) + addtoqueue = 1; + + if ( !level.dialoggroup[group].skipifcurrentlyplayinggroup ) + { + if ( self.currentleaderdialog == dialog && self.currentleaderdialogtime + 2000 > gettime() ) + { + self.leaderdialoggroups[group] = undefined; + arrayremovevalue( self.leaderdialogqueue, group ); + + if ( self.leaderdialogqueue.size == 0 ) + self flushdialogonplayer(); + + return 0; + } + } + else if ( self.currentleaderdialoggroup == group ) + return 0; + + self.leaderdialoggroups[group] = dialog; + return addtoqueue; } -leaderdialogonplayer( dialog, group ) //checked matches cerberus output +leaderdialogonplayer( dialog, group ) { - /* /# - assert( isDefined( dialog ) ); + assert( isdefined( dialog ) ); #/ - */ - team = self.pers[ "team" ]; - if ( !isDefined( team ) ) - { - return; - } - if ( !isDefined( level.teams[ team ] ) ) - { - return; - } - if ( isDefined( group ) ) - { - if ( !addgroupdialogtoplayer( dialog, group ) ) - { - return; - } - dialog = group; - } - if ( self.leaderdialogqueue.size < 10 ) - { - self.leaderdialogqueue[ self.leaderdialogqueue.size ] = dialog; - } - if ( !self.leaderdialogactive ) - { - self thread playnextleaderdialog(); - } + team = self.pers["team"]; + + if ( !isdefined( team ) ) + return; + + if ( !isdefined( level.teams[team] ) ) + return; + + if ( isdefined( group ) ) + { + if ( !addgroupdialogtoplayer( dialog, group ) ) + return; + + dialog = group; + } + + if ( self.leaderdialogqueue.size < 10 ) + self.leaderdialogqueue[self.leaderdialogqueue.size] = dialog; + + if ( !self.leaderdialogactive ) + self thread playnextleaderdialog(); } -waitforsound( sound, extratime ) //checked matches cerberus output +waitforsound( sound, extratime ) { - if ( !isDefined( extratime ) ) - { - extratime = 0.1; - } - time = soundgetplaybacktime( sound ); - if ( time < 0 ) - { - wait ( 3 + extratime ); - } - else - { - wait ( ( time * 0.001 ) + extratime ); - } + if ( !isdefined( extratime ) ) + extratime = 0.1; + + time = soundgetplaybacktime( sound ); + + if ( time < 0 ) + wait( 3.0 + extratime ); + else + wait( time * 0.001 + extratime ); } -playnextleaderdialog() //checked changed to match cerberus output +playnextleaderdialog() { - self endon( "disconnect" ); - self endon( "flush_dialog" ); - if ( !is_true( level.allowannouncer ) ) - { - return; - } - self.leaderdialogactive = 1; - waittillframeend; - /* + self endon( "disconnect" ); + self endon( "flush_dialog" ); + + if ( isdefined( level.allowannouncer ) && !level.allowannouncer ) + return; + + self.leaderdialogactive = 1; + waittillframeend; /# - assert( self.leaderdialogqueue.size > 0 ); + assert( self.leaderdialogqueue.size > 0 ); #/ - */ - dialog = self.leaderdialogqueue[ 0 ]; - /* + dialog = self.leaderdialogqueue[0]; /# - assert( isDefined( dialog ) ); + assert( isdefined( dialog ) ); #/ - */ - arrayremoveindex( self.leaderdialogqueue, 0 ); - team = self.pers[ "team" ]; - if ( isDefined( self.leaderdialoggroups[ dialog ] ) ) - { - group = dialog; - dialog = self.leaderdialoggroups[ group ]; - self.leaderdialoggroups[ group ] = undefined; - self.currentleaderdialoggroup = group; - } - if ( level.wagermatch ) - { - faction = "vox_wm_"; - } - else - { - faction = game[ "voice" ][ team ]; - } - if ( !isDefined( faction ) ) - { - return; - } - sound_name = faction + game[ "dialog" ][ dialog ]; - if ( level.allowannouncer ) - { - self playlocalsound( sound_name ); - self.currentleaderdialog = dialog; - self.currentleaderdialogtime = getTime(); - } - waitforsound( sound_name ); - self.leaderdialogactive = 0; - self.currentleaderdialoggroup = ""; - self.currentleaderdialog = ""; - if ( self.leaderdialogqueue.size > 0 ) - { - self thread playnextleaderdialog(); - } + arrayremoveindex( self.leaderdialogqueue, 0 ); + team = self.pers["team"]; + + if ( isdefined( self.leaderdialoggroups[dialog] ) ) + { + group = dialog; + dialog = self.leaderdialoggroups[group]; + self.leaderdialoggroups[group] = undefined; + self.currentleaderdialoggroup = group; + } + + if ( level.wagermatch ) + faction = "vox_wm_"; + else + faction = game["voice"][team]; + + if ( !isdefined( faction ) ) + return; + + sound_name = faction + game["dialog"][dialog]; + + if ( level.allowannouncer ) + { + self playlocalsound( sound_name ); + self.currentleaderdialog = dialog; + self.currentleaderdialogtime = gettime(); + } + + waitforsound( sound_name ); + self.leaderdialogactive = 0; + self.currentleaderdialoggroup = ""; + self.currentleaderdialog = ""; + + if ( self.leaderdialogqueue.size > 0 ) + self thread playnextleaderdialog(); } -isteamwinning( checkteam ) //checked changed to match cerberus output +isteamwinning( checkteam ) { - score = game[ "teamScores" ][ checkteam ]; - foreach ( team in level.teams ) - { - if ( team != checkteam ) - { - if ( game[ "teamScores" ][ team ] >= score ) - { - return 0; - } - } - } - return 1; + score = game["teamScores"][checkteam]; + + foreach ( team in level.teams ) + { + if ( team != checkteam ) + { + if ( game["teamScores"][team] >= score ) + return false; + } + } + + return true; } -announceteamiswinning() //checked changed to match cerberus output +announceteamiswinning() { - foreach ( team in level.teams ) - { - if ( isteamwinning( team ) ) - { - leaderdialog( "winning", team, undefined, undefined, "squad_winning" ); - leaderdialogforotherteams( "losing", team, "squad_losing" ); - return 1; - } - } - return 0; + foreach ( team in level.teams ) + { + if ( isteamwinning( team ) ) + { + leaderdialog( "winning", team, undefined, undefined, "squad_winning" ); + leaderdialogforotherteams( "losing", team, "squad_losing" ); + return true; + } + } + + return false; } -musiccontroller() //checked changed to match cerberus output +musiccontroller() { - level endon( "game_ended" ); - level thread musictimesout(); - level waittill( "match_ending_soon" ); - if ( islastround() || isoneround() ) - { - if ( level.teambased ) - { - if ( !announceteamiswinning() ) - { - leaderdialog( "min_draw" ); - } - } - level waittill( "match_ending_very_soon" ); - foreach ( team in level.teams ) - { - leaderdialog( "timesup", team, undefined, undefined, "squad_30sec" ); - } - } - else - { - level waittill( "match_ending_vox" ); - leaderdialog( "timesup" ); - } + level endon( "game_ended" ); + level thread musictimesout(); + + level waittill( "match_ending_soon" ); + + if ( islastround() || isoneround() ) + { + if ( level.teambased ) + { + if ( !announceteamiswinning() ) + leaderdialog( "min_draw" ); + } + + level waittill( "match_ending_very_soon" ); + + foreach ( team in level.teams ) + leaderdialog( "timesup", team, undefined, undefined, "squad_30sec" ); + } + else + { + level waittill( "match_ending_vox" ); + + leaderdialog( "timesup" ); + } } -musictimesout() //checked matches cerberus output +musictimesout() { - level endon( "game_ended" ); - level waittill( "match_ending_very_soon" ); - thread maps/mp/gametypes/_globallogic_audio::set_music_on_team( "TIME_OUT", "both", 1, 0 ); + level endon( "game_ended" ); + + level waittill( "match_ending_very_soon" ); + + thread maps\mp\gametypes\_globallogic_audio::set_music_on_team( "TIME_OUT", "both", 1, 0 ); } -actionmusicset() //checked matches cerberus output +actionmusicset() { - level endon( "game_ended" ); - level.playingactionmusic = 1; - wait 45; - level.playingactionmusic = 0; + level endon( "game_ended" ); + level.playingactionmusic = 1; + wait 45; + level.playingactionmusic = 0; } -play_2d_on_team( alias, team ) //checked changed to match cerberus output +play_2d_on_team( alias, team ) { - /* /# - assert( isDefined( level.players ) ); + assert( isdefined( level.players ) ); #/ - */ - for ( i = 0; i < level.players.size; i++ ) - { - player = level.players[ i ]; - if ( isDefined( player.pers[ "team" ] ) && player.pers[ "team" ] == team ) - { - player playlocalsound( alias ); - } - } + + for ( i = 0; i < level.players.size; i++ ) + { + player = level.players[i]; + + if ( isdefined( player.pers["team"] ) && player.pers["team"] == team ) + player playlocalsound( alias ); + } } -set_music_on_team( state, team, save_state, return_state, wait_time ) //checked partially changed to match cerberus output see info.md dvars taken from beta dump +set_music_on_team( state, team, save_state, return_state, wait_time ) { - if ( sessionmodeiszombiesgame() ) - { - return; - } - /* + if ( sessionmodeiszombiesgame() ) + return; + /# - assert( isDefined( level.players ) ); + assert( isdefined( level.players ) ); #/ - */ - if ( !isDefined( team ) ) - { - team = "both"; - /* + + if ( !isdefined( team ) ) + { + team = "both"; /# - if ( getDvarInt( "debug_music" ) > 0 ) - { - println( "Music System - team undefined: Setting to both" ); + if ( getdvarint( _hash_BC4784C ) > 0 ) + println( "Music System - team undefined: Setting to both" ); #/ - } - */ - } - if ( !isDefined( save_state ) ) - { - save_sate = 0; - /* + } + + if ( !isdefined( save_state ) ) + { + save_sate = 0; /# - if ( getDvarInt( "debug_music" ) > 0 ) - { - println( "Music System - save_sate undefined: Setting to false" ); + if ( getdvarint( _hash_BC4784C ) > 0 ) + println( "Music System - save_sate undefined: Setting to false" ); #/ - } - */ - } - if ( !isDefined( return_state ) ) - { - return_state = 0; - /* + } + + if ( !isdefined( return_state ) ) + { + return_state = 0; /# - if ( getDvarInt( "debug_music" ) > 0 ) - { - println( "Music System - Music System - return_state undefined: Setting to false" ); + if ( getdvarint( _hash_BC4784C ) > 0 ) + println( "Music System - Music System - return_state undefined: Setting to false" ); #/ - } - */ - } - if ( !isDefined( wait_time ) ) - { - wait_time = 0; - /* + } + + if ( !isdefined( wait_time ) ) + { + wait_time = 0; /# - if ( getDvarInt( "debug_music" ) > 0 ) - { - println( "Music System - wait_time undefined: Setting to 0" ); + if ( getdvarint( _hash_BC4784C ) > 0 ) + println( "Music System - wait_time undefined: Setting to 0" ); #/ - } - */ - } - for ( i = 0; i < level.players.size; i++ ) - { - player = level.players[ i ]; - if ( team == "both" ) - { - player thread set_music_on_player( state, save_state, return_state, wait_time ); - } - else - { - if ( isDefined( player.pers[ "team" ] ) && player.pers[ "team" ] == team ) - { - player thread set_music_on_player( state, save_state, return_state, wait_time ); - /* + } + + for ( i = 0; i < level.players.size; i++ ) + { + player = level.players[i]; + + if ( team == "both" ) + { + player thread set_music_on_player( state, save_state, return_state, wait_time ); + continue; + } + + if ( isdefined( player.pers["team"] ) && player.pers["team"] == team ) + { + player thread set_music_on_player( state, save_state, return_state, wait_time ); /# - if ( getDvarInt( "debug_music" ) > 0 ) - { - println( "Music System - Setting Music State " + state + " On player " + player getentitynumber() ); + if ( getdvarint( _hash_BC4784C ) > 0 ) + println( "Music System - Setting Music State " + state + " On player " + player getentitynumber() ); #/ - } - */ - } - } - } + } + } } -set_music_on_player( state, save_state, return_state, wait_time ) //checked matches cerberus output dvars taken from beta dump +set_music_on_player( state, save_state, return_state, wait_time ) { - self endon( "disconnect" ); - if ( sessionmodeiszombiesgame() ) - { - return; - } - /* + self endon( "disconnect" ); + + if ( sessionmodeiszombiesgame() ) + return; + /# - assert( isplayer( self ) ); + assert( isplayer( self ) ); #/ - */ - if ( !isDefined( save_state ) ) - { - save_state = 0; - /* + + if ( !isdefined( save_state ) ) + { + save_state = 0; /# - if ( getDvarInt( "debug_music" ) > 0 ) - { - println( "Music System - Music System - save_sate undefined: Setting to false" ); + if ( getdvarint( _hash_BC4784C ) > 0 ) + println( "Music System - Music System - save_sate undefined: Setting to false" ); #/ - } - */ - } - if ( !isDefined( return_state ) ) - { - return_state = 0; - /* + } + + if ( !isdefined( return_state ) ) + { + return_state = 0; /# - if ( getDvarInt( "debug_music" ) > 0 ) - { - println( "Music System - Music System - return_state undefined: Setting to false" ); + if ( getdvarint( _hash_BC4784C ) > 0 ) + println( "Music System - Music System - return_state undefined: Setting to false" ); #/ - } - */ - } - if ( !isDefined( wait_time ) ) - { - wait_time = 0; - /* + } + + if ( !isdefined( wait_time ) ) + { + wait_time = 0; /# - if ( getDvarInt( "debug_music" ) > 0 ) - { - println( "Music System - wait_time undefined: Setting to 0" ); + if ( getdvarint( _hash_BC4784C ) > 0 ) + println( "Music System - wait_time undefined: Setting to 0" ); #/ - } - */ - } - if ( !isDefined( state ) ) - { - state = "UNDERSCORE"; - /* + } + + if ( !isdefined( state ) ) + { + state = "UNDERSCORE"; /# - if ( getDvarInt( "debug_music" ) > 0 ) - { - println( "Music System - state undefined: Setting to UNDERSCORE" ); + if ( getdvarint( _hash_BC4784C ) > 0 ) + println( "Music System - state undefined: Setting to UNDERSCORE" ); #/ - } - */ - } - maps/mp/_music::setmusicstate( state, self ); - if ( isDefined( self.pers[ "music" ].currentstate ) && save_state ) - { - self.pers[ "music" ].returnstate = state; - /* + } + + maps\mp\_music::setmusicstate( state, self ); + + if ( isdefined( self.pers["music"].currentstate ) && save_state ) + { + self.pers["music"].returnstate = state; /# - if ( getDvarInt( "debug_music" ) > 0 ) - { - println( "Music System - Saving Music State " + self.pers[ "music" ].returnstate + " On " + self getentitynumber() ); + if ( getdvarint( _hash_BC4784C ) > 0 ) + println( "Music System - Saving Music State " + self.pers["music"].returnstate + " On " + self getentitynumber() ); #/ - } - */ - } - self.pers[ "music" ].previousstate = self.pers[ "music" ].currentstate; - self.pers[ "music" ].currentstate = state; - /* + } + + self.pers["music"].previousstate = self.pers["music"].currentstate; + self.pers["music"].currentstate = state; /# - if ( getDvarInt( "debug_music" ) > 0 ) - { - println( "Music System - Setting Music State " + state + " On player " + self getentitynumber() ); + if ( getdvarint( _hash_BC4784C ) > 0 ) + println( "Music System - Setting Music State " + state + " On player " + self getentitynumber() ); #/ - } - */ - if ( isDefined( self.pers[ "music" ].returnstate ) && return_state ) - { - /* + + if ( isdefined( self.pers["music"].returnstate ) && return_state ) + { /# - if ( getDvarInt( "debug_music" ) > 0 ) - { - println( "Music System - Starting Return State " + self.pers[ "music" ].returnstate + " On " + self getentitynumber() ); + if ( getdvarint( _hash_BC4784C ) > 0 ) + println( "Music System - Starting Return State " + self.pers["music"].returnstate + " On " + self getentitynumber() ); #/ - } - */ - self set_next_music_state( self.pers[ "music" ].returnstate, wait_time ); - } + self set_next_music_state( self.pers["music"].returnstate, wait_time ); + } } -return_music_state_player( wait_time ) //checked matches cerberus output dvars taken from beta dump +return_music_state_player( wait_time ) { - if ( !isDefined( wait_time ) ) - { - wait_time = 0; - /* + if ( !isdefined( wait_time ) ) + { + wait_time = 0; /# - if ( getDvarInt( "debug_music" ) > 0 ) - { - println( "Music System - wait_time undefined: Setting to 0" ); + if ( getdvarint( _hash_BC4784C ) > 0 ) + println( "Music System - wait_time undefined: Setting to 0" ); #/ - } - */ - } - self set_next_music_state( self.pers[ "music" ].returnstate, wait_time ); + } + + self set_next_music_state( self.pers["music"].returnstate, wait_time ); } -return_music_state_team( team, wait_time ) //checked partially changed to match cerberus output see info.md dvars taken from beta dump +return_music_state_team( team, wait_time ) { - if ( !isDefined( wait_time ) ) - { - wait_time = 0; - /* + if ( !isdefined( wait_time ) ) + { + wait_time = 0; /# - if ( getDvarInt( "debug_music" ) > 0 ) - { - println( "Music System - wait_time undefined: Setting to 0" ); + if ( getdvarint( _hash_BC4784C ) > 0 ) + println( "Music System - wait_time undefined: Setting to 0" ); #/ - } - */ - } - for ( i = 0; i < level.players.size; i++ ) - { - player = level.players[ i ]; - if ( team == "both" ) - { - player thread set_next_music_state( self.pers[ "music" ].returnstate, wait_time ); - } - else - { - if ( isDefined( player.pers[ "team" ] ) && player.pers[ "team" ] == team ) - { - player thread set_next_music_state( self.pers[ "music" ].returnstate, wait_time ); - /* + } + + for ( i = 0; i < level.players.size; i++ ) + { + player = level.players[i]; + + if ( team == "both" ) + { + player thread set_next_music_state( self.pers["music"].returnstate, wait_time ); + continue; + } + + if ( isdefined( player.pers["team"] ) && player.pers["team"] == team ) + { + player thread set_next_music_state( self.pers["music"].returnstate, wait_time ); /# - if ( getDvarInt( "debug_music" ) > 0 ) - { - println( "Music System - Setting Music State " + self.pers[ "music" ].returnstate + " On player " + player getentitynumber() ); + if ( getdvarint( _hash_BC4784C ) > 0 ) + println( "Music System - Setting Music State " + self.pers["music"].returnstate + " On player " + player getentitynumber() ); #/ - } - */ - } - } - } + } + } } -set_next_music_state( nextstate, wait_time ) //checked matches cerberus output dvars taken from beta dump +set_next_music_state( nextstate, wait_time ) { - self endon( "disconnect" ); - self.pers[ "music" ].nextstate = nextstate; - /* + self endon( "disconnect" ); + self.pers["music"].nextstate = nextstate; /# - if ( getDvarInt( "debug_music" ) > 0 ) - { - println( "Music System - Setting next Music State " + self.pers[ "music" ].nextstate + " On " + self getentitynumber() ); + if ( getdvarint( _hash_BC4784C ) > 0 ) + println( "Music System - Setting next Music State " + self.pers["music"].nextstate + " On " + self getentitynumber() ); #/ - } - */ - if ( !isDefined( self.pers[ "music" ].inque ) ) - { - self.pers[ "music" ].inque = 0; - } - if ( self.pers[ "music" ].inque ) - { - return; - /* + + if ( !isdefined( self.pers["music"].inque ) ) + self.pers["music"].inque = 0; + + if ( self.pers["music"].inque ) + { + return; /# - println( "Music System - Music state in que" ); + println( "Music System - Music state in que" ); #/ - */ - } - else - { - self.pers[ "music" ].inque = 1; - if ( wait_time ) - { - wait wait_time; - } - self set_music_on_player( self.pers[ "music" ].nextstate, 0 ); - self.pers[ "music" ].inque = 0; - } + } + else + { + self.pers["music"].inque = 1; + + if ( wait_time ) + wait( wait_time ); + + self set_music_on_player( self.pers["music"].nextstate, 0 ); + self.pers["music"].inque = 0; + } } -getroundswitchdialog( switchtype ) //checked matches cerberus output +getroundswitchdialog( switchtype ) { - switch( switchtype ) - { - case "halftime": - return "halftime"; - case "overtime": - return "overtime"; - default: - return "side_switch"; - } + switch ( switchtype ) + { + case "halftime": + return "halftime"; + case "overtime": + return "overtime"; + default: + return "side_switch"; + } } -post_match_snapshot_watcher() //checked matches cerberus output +post_match_snapshot_watcher() { - level waittill( "game_ended" ); - level clientnotify( "pm" ); - level waittill( "sfade" ); - level clientnotify( "pmf" ); -} + level waittill( "game_ended" ); + level clientnotify( "pm" ); + + level waittill( "sfade" ); + + level clientnotify( "pmf" ); +} diff --git a/Multiplayer Core/patch_mp/maps/mp/gametypes/_globallogic_defaults.gsc b/Multiplayer Core/patch_mp/maps/mp/gametypes/_globallogic_defaults.gsc index 1c66075..9a43eeb 100644 --- a/Multiplayer Core/patch_mp/maps/mp/gametypes/_globallogic_defaults.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/gametypes/_globallogic_defaults.gsc @@ -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" ); } - diff --git a/Multiplayer Core/patch_mp/maps/mp/gametypes/_globallogic_player.gsc b/Multiplayer Core/patch_mp/maps/mp/gametypes/_globallogic_player.gsc index 6551604..90b9d8d 100644 --- a/Multiplayer Core/patch_mp/maps/mp/gametypes/_globallogic_player.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/gametypes/_globallogic_player.gsc @@ -1,2816 +1,2604 @@ -//checked includes changed to match cerberus output -#include maps/mp/gametypes/_globallogic_vehicle; -#include maps/mp/_burnplayer; -#include maps/mp/gametypes/_deathicons; -#include maps/mp/gametypes/_tweakables; -#include maps/mp/gametypes/_globallogic_audio; -#include maps/mp/gametypes/_killcam; -#include maps/mp/gametypes/_spawnlogic; -#include maps/mp/_medals; -#include maps/mp/killstreaks/_straferun; -#include maps/mp/_challenges; -#include maps/mp/gametypes/_rank; -#include maps/mp/teams/_teams; -#include maps/mp/_demo; -#include maps/mp/gametypes/_weapon_utils; -#include maps/mp/gametypes/_damagefeedback; -#include maps/mp/gametypes/_weapons; -#include maps/mp/_scoreevents; -#include maps/mp/gametypes/_battlechatter_mp; -#include maps/mp/_vehicles; -#include maps/mp/gametypes/_class; -#include maps/mp/gametypes/_hud_message; -#include maps/mp/gametypes/_hud_util; -#include maps/mp/gametypes/_spawning; -#include maps/mp/gametypes/_globallogic_utils; -#include maps/mp/gametypes/_spectating; -#include maps/mp/gametypes/_globallogic_spawn; -#include maps/mp/gametypes/_globallogic_ui; -#include maps/mp/gametypes/_hostmigration; -#include maps/mp/_flashgrenades; -#include maps/mp/gametypes/_globallogic_score; -#include maps/mp/_gamerep; -#include maps/mp/gametypes/_persistence; -#include maps/mp/gametypes/_globallogic; -#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 -freezeplayerforroundend() //checked matches cerberus output +freezeplayerforroundend() { - self clearlowermessage(); - self closemenu(); - self closeingamemenu(); - self freeze_player_controls( 1 ); - if ( !sessionmodeiszombiesgame() ) - { - currentweapon = self getcurrentweapon(); - if ( maps/mp/killstreaks/_killstreaks::iskillstreakweapon( currentweapon ) && !maps/mp/killstreaks/_killstreak_weapons::isheldkillstreakweapon( currentweapon ) ) - { - self takeweapon( currentweapon ); - } - } + self clearlowermessage(); + self closemenu(); + self closeingamemenu(); + self freeze_player_controls( 1 ); + + if ( !sessionmodeiszombiesgame() ) + { + currentweapon = self getcurrentweapon(); + + if ( maps\mp\killstreaks\_killstreaks::iskillstreakweapon( currentweapon ) && !maps\mp\killstreaks\_killstreak_weapons::isheldkillstreakweapon( currentweapon ) ) + self takeweapon( currentweapon ); + } } -callback_playerconnect() //checked partially changed to match cerberus output partially changed to match beta dump +callback_playerconnect() { - thread notifyconnecting(); - self.statusicon = "hud_status_connecting"; - self waittill( "begin" ); - if ( isDefined( level.reset_clientdvars ) ) - { - self [[ level.reset_clientdvars ]](); - } - waittillframeend; - self.statusicon = ""; - self.guid = self getguid(); - matchrecorderincrementheaderstat( "playerCountJoined", 1 ); - profilelog_begintiming( 4, "ship" ); - level notify( "connected", self ); - if ( self ishost() ) - { - self thread maps/mp/gametypes/_globallogic::listenforgameend(); - } - if ( !level.splitscreen && !isDefined( self.pers[ "score" ] ) ) - { - iprintln( &"MP_CONNECTED", self ); - } - if ( !isDefined( self.pers[ "score" ] ) ) - { - self thread maps/mp/gametypes/_persistence::adjustrecentstats(); - self maps/mp/gametypes/_persistence::setafteractionreportstat( "valid", 0 ); - if ( gamemodeismode( level.gamemode_wager_match ) && !self ishost() ) - { - self maps/mp/gametypes/_persistence::setafteractionreportstat( "wagerMatchFailed", 1 ); - } - else - { - self maps/mp/gametypes/_persistence::setafteractionreportstat( "wagerMatchFailed", 0 ); - } - } - if ( level.rankedmatch && !isDefined( self.pers[ "matchesPlayedStatsTracked" ] ) || level.wagermatch && !isDefined( self.pers[ "matchesPlayedStatsTracked" ] ) || level.leaguematch && !isDefined( self.pers[ "matchesPlayedStatsTracked" ] ) ) - { - gamemode = maps/mp/gametypes/_globallogic::getcurrentgamemode(); - self maps/mp/gametypes/_globallogic::incrementmatchcompletionstat( gamemode, "played", "started" ); - if ( !isDefined( self.pers[ "matchesHostedStatsTracked" ] ) && self islocaltohost() ) - { - self maps/mp/gametypes/_globallogic::incrementmatchcompletionstat( gamemode, "hosted", "started" ); - self.pers[ "matchesHostedStatsTracked" ] = 1; - } - self.pers[ "matchesPlayedStatsTracked" ] = 1; - self thread maps/mp/gametypes/_persistence::uploadstatssoon(); - } - self maps/mp/_gamerep::gamerepplayerconnected(); - lpselfnum = self getentitynumber(); - lpguid = self getguid(); - logprint( "J;" + lpguid + ";" + lpselfnum + ";" + self.name + "\n" ); - bbprint( "mpjoins", "name %s client %s", self.name, lpselfnum ); - if ( !sessionmodeiszombiesgame() ) - { - self setclientuivisibilityflag( "hud_visible", 1 ); - } - if ( level.forceradar == 1 ) - { - self.pers[ "hasRadar" ] = 1; - self.hasspyplane = 1; - level.activeuavs[ self getentitynumber() ] = 1; - } - if ( level.forceradar == 2 ) - { - self setclientuivisibilityflag( "g_compassShowEnemies", level.forceradar ); - } - else - { - self setclientuivisibilityflag( "g_compassShowEnemies", 0 ); - } - self setclientplayersprinttime( level.playersprinttime ); - self setclientnumlives( level.numlives ); - makedvarserverinfo( "cg_drawTalk", 1 ); - if ( level.hardcoremode ) - { - self setclientdrawtalk( 3 ); - } - if ( sessionmodeiszombiesgame() ) - { - self [[ level.player_stats_init ]](); - } - else - { - self maps/mp/gametypes/_globallogic_score::initpersstat( "score" ); - if ( level.resetplayerscoreeveryround ) - { - self.pers[ "score" ] = 0; - } - self.score = self.pers[ "score" ]; - self maps/mp/gametypes/_globallogic_score::initpersstat( "pointstowin" ); - if ( level.scoreroundbased ) - { - self.pers[ "pointstowin" ] = 0; - } - self.pointstowin = self.pers[ "pointstowin" ]; - self maps/mp/gametypes/_globallogic_score::initpersstat( "momentum", 0 ); - self.momentum = self maps/mp/gametypes/_globallogic_score::getpersstat( "momentum" ); - self maps/mp/gametypes/_globallogic_score::initpersstat( "suicides" ); - self.suicides = self maps/mp/gametypes/_globallogic_score::getpersstat( "suicides" ); - self maps/mp/gametypes/_globallogic_score::initpersstat( "headshots" ); - self.headshots = self maps/mp/gametypes/_globallogic_score::getpersstat( "headshots" ); - self maps/mp/gametypes/_globallogic_score::initpersstat( "challenges" ); - self.challenges = self maps/mp/gametypes/_globallogic_score::getpersstat( "challenges" ); - self maps/mp/gametypes/_globallogic_score::initpersstat( "kills" ); - self.kills = self maps/mp/gametypes/_globallogic_score::getpersstat( "kills" ); - self maps/mp/gametypes/_globallogic_score::initpersstat( "deaths" ); - self.deaths = self maps/mp/gametypes/_globallogic_score::getpersstat( "deaths" ); - self maps/mp/gametypes/_globallogic_score::initpersstat( "assists" ); - self.assists = self maps/mp/gametypes/_globallogic_score::getpersstat( "assists" ); - self maps/mp/gametypes/_globallogic_score::initpersstat( "defends", 0 ); - self.defends = self maps/mp/gametypes/_globallogic_score::getpersstat( "defends" ); - self maps/mp/gametypes/_globallogic_score::initpersstat( "offends", 0 ); - self.offends = self maps/mp/gametypes/_globallogic_score::getpersstat( "offends" ); - self maps/mp/gametypes/_globallogic_score::initpersstat( "plants", 0 ); - self.plants = self maps/mp/gametypes/_globallogic_score::getpersstat( "plants" ); - self maps/mp/gametypes/_globallogic_score::initpersstat( "defuses", 0 ); - self.defuses = self maps/mp/gametypes/_globallogic_score::getpersstat( "defuses" ); - self maps/mp/gametypes/_globallogic_score::initpersstat( "returns", 0 ); - self.returns = self maps/mp/gametypes/_globallogic_score::getpersstat( "returns" ); - self maps/mp/gametypes/_globallogic_score::initpersstat( "captures", 0 ); - self.captures = self maps/mp/gametypes/_globallogic_score::getpersstat( "captures" ); - self maps/mp/gametypes/_globallogic_score::initpersstat( "destructions", 0 ); - self.destructions = self maps/mp/gametypes/_globallogic_score::getpersstat( "destructions" ); - self maps/mp/gametypes/_globallogic_score::initpersstat( "backstabs", 0 ); - self.backstabs = self maps/mp/gametypes/_globallogic_score::getpersstat( "backstabs" ); - self maps/mp/gametypes/_globallogic_score::initpersstat( "longshots", 0 ); - self.longshots = self maps/mp/gametypes/_globallogic_score::getpersstat( "longshots" ); - self maps/mp/gametypes/_globallogic_score::initpersstat( "survived", 0 ); - self.survived = self maps/mp/gametypes/_globallogic_score::getpersstat( "survived" ); - self maps/mp/gametypes/_globallogic_score::initpersstat( "stabs", 0 ); - self.stabs = self maps/mp/gametypes/_globallogic_score::getpersstat( "stabs" ); - self maps/mp/gametypes/_globallogic_score::initpersstat( "tomahawks", 0 ); - self.tomahawks = self maps/mp/gametypes/_globallogic_score::getpersstat( "tomahawks" ); - self maps/mp/gametypes/_globallogic_score::initpersstat( "humiliated", 0 ); - self.humiliated = self maps/mp/gametypes/_globallogic_score::getpersstat( "humiliated" ); - self maps/mp/gametypes/_globallogic_score::initpersstat( "x2score", 0 ); - self.x2score = self maps/mp/gametypes/_globallogic_score::getpersstat( "x2score" ); - self maps/mp/gametypes/_globallogic_score::initpersstat( "agrkills", 0 ); - self.x2score = self maps/mp/gametypes/_globallogic_score::getpersstat( "agrkills" ); - self maps/mp/gametypes/_globallogic_score::initpersstat( "hacks", 0 ); - self.x2score = self maps/mp/gametypes/_globallogic_score::getpersstat( "hacks" ); - self maps/mp/gametypes/_globallogic_score::initpersstat( "killsconfirmed", 0 ); - self.killsconfirmed = self maps/mp/gametypes/_globallogic_score::getpersstat( "killsconfirmed" ); - self maps/mp/gametypes/_globallogic_score::initpersstat( "killsdenied", 0 ); - self.killsdenied = self maps/mp/gametypes/_globallogic_score::getpersstat( "killsdenied" ); - self maps/mp/gametypes/_globallogic_score::initpersstat( "sessionbans", 0 ); - self.sessionbans = self maps/mp/gametypes/_globallogic_score::getpersstat( "sessionbans" ); - self maps/mp/gametypes/_globallogic_score::initpersstat( "gametypeban", 0 ); - self maps/mp/gametypes/_globallogic_score::initpersstat( "time_played_total", 0 ); - self maps/mp/gametypes/_globallogic_score::initpersstat( "time_played_alive", 0 ); - self maps/mp/gametypes/_globallogic_score::initpersstat( "teamkills", 0 ); - self maps/mp/gametypes/_globallogic_score::initpersstat( "teamkills_nostats", 0 ); - self.teamkillpunish = 0; - if ( level.minimumallowedteamkills >= 0 && self.pers[ "teamkills_nostats" ] > level.minimumallowedteamkills ) - { - self thread reduceteamkillsovertime(); - } - } - if ( getDvar( "r_reflectionProbeGenerate" ) == "1" ) - { - level waittill( "eternity" ); - } - self.killedplayerscurrent = []; - if ( !isDefined( self.pers[ "best_kill_streak" ] ) ) - { - self.pers[ "killed_players" ] = []; - self.pers[ "killed_by" ] = []; - self.pers[ "nemesis_tracking" ] = []; - self.pers[ "artillery_kills" ] = 0; - self.pers[ "dog_kills" ] = 0; - self.pers[ "nemesis_name" ] = ""; - self.pers[ "nemesis_rank" ] = 0; - self.pers[ "nemesis_rankIcon" ] = 0; - self.pers[ "nemesis_xp" ] = 0; - self.pers[ "nemesis_xuid" ] = ""; - self.pers[ "best_kill_streak" ] = 0; - } - if ( !isDefined( self.pers[ "music" ] ) ) - { - self.pers[ "music" ] = spawnstruct(); - self.pers[ "music" ].spawn = 0; - self.pers[ "music" ].inque = 0; - self.pers[ "music" ].currentstate = "SILENT"; - self.pers[ "music" ].previousstate = "SILENT"; - self.pers[ "music" ].nextstate = "UNDERSCORE"; - self.pers[ "music" ].returnstate = "UNDERSCORE"; - } - self.leaderdialogqueue = []; - self.leaderdialogactive = 0; - self.leaderdialoggroups = []; - self.currentleaderdialoggroup = ""; - self.currentleaderdialog = ""; - self.currentleaderdialogtime = 0; - if ( !isDefined( self.pers[ "cur_kill_streak" ] ) ) - { - self.pers[ "cur_kill_streak" ] = 0; - } - if ( !isDefined( self.pers[ "cur_total_kill_streak" ] ) ) - { - self.pers[ "cur_total_kill_streak" ] = 0; - self setplayercurrentstreak( 0 ); - } - if ( !isDefined( self.pers[ "totalKillstreakCount" ] ) ) - { - self.pers[ "totalKillstreakCount" ] = 0; - } - if ( !isDefined( self.pers[ "killstreaksEarnedThisKillstreak" ] ) ) - { - self.pers[ "killstreaksEarnedThisKillstreak" ] = 0; - } - if ( is_true( level.usingscorestreaks ) && !isDefined( self.pers[ "killstreak_quantity" ] ) ) - { - self.pers[ "killstreak_quantity" ] = []; - } - if ( is_true( level.usingscorestreaks ) && !isDefined( self.pers[ "held_killstreak_ammo_count" ] ) ) - { - self.pers[ "held_killstreak_ammo_count" ] = []; - } - if ( is_true( level.usingscorestreaks ) && !isDefined( self.pers[ "held_killstreak_clip_count" ] ) ) - { - self.pers[ "held_killstreak_clip_count" ] = []; - } - if ( !isDefined( self.pers[ "changed_class" ] ) ) - { - self.pers[ "changed_class" ] = 0; - } - self.lastkilltime = 0; - self.cur_death_streak = 0; - self disabledeathstreak(); - self.death_streak = 0; - self.kill_streak = 0; - self.gametype_kill_streak = 0; - self.spawnqueueindex = -1; - self.deathtime = 0; - if ( level.onlinegame ) - { - self.death_streak = self getdstat( "HighestStats", "death_streak" ); - self.kill_streak = self getdstat( "HighestStats", "kill_streak" ); - self.gametype_kill_streak = self maps/mp/gametypes/_persistence::statgetwithgametype( "kill_streak" ); - } - self.lastgrenadesuicidetime = -1; - self.teamkillsthisround = 0; - if ( isDefined( level.livesdonotreset ) || !level.livesdonotreset && !isDefined( self.pers[ "lives" ] ) ) - { - self.pers[ "lives" ] = level.numlives; - } - if ( !level.teambased ) - { - } - self.hasspawned = 0; - self.waitingtospawn = 0; - self.wantsafespawn = 0; - self.deathcount = 0; - self.wasaliveatmatchstart = 0; - self thread maps/mp/_flashgrenades::monitorflash(); - level.players[ level.players.size ] = self; - if ( level.splitscreen ) - { - setdvar( "splitscreen_playerNum", level.players.size ); - } - if ( game[ "state" ] == "postgame" ) - { - self.pers[ "needteam" ] = 1; - self.pers[ "team" ] = "spectator"; - self.team = "spectator"; - self setclientuivisibilityflag( "hud_visible", 0 ); - self [[ level.spawnintermission ]](); - self closemenu(); - self closeingamemenu(); - profilelog_endtiming( 4, "gs=" + game[ "state" ] + " zom=" + sessionmodeiszombiesgame() ); - return; - } - if ( ( level.rankedmatch || level.wagermatch ) && !isDefined( self.pers[ "lossAlreadyReported" ] ) || level.leaguematch && !isDefined( self.pers[ "lossAlreadyReported" ] ) ) - { - if ( level.leaguematch ) - { - self recordleaguepreloser(); - } - else - { - maps/mp/gametypes/_globallogic_score::updatelossstats( self ); - } - self.pers[ "lossAlreadyReported" ] = 1; - } - if ( !isDefined( self.pers[ "winstreakAlreadyCleared" ] ) ) - { - self maps/mp/gametypes/_globallogic_score::backupandclearwinstreaks(); - self.pers[ "winstreakAlreadyCleared" ] = 1; - } - if ( self istestclient() ) - { - self.pers[ "isBot" ] = 1; - } - if ( level.rankedmatch || level.leaguematch ) - { - self maps/mp/gametypes/_persistence::setafteractionreportstat( "demoFileID", "0" ); - } - level endon( "game_ended" ); - if ( isDefined( level.hostmigrationtimer ) ) - { - self thread maps/mp/gametypes/_hostmigration::hostmigrationtimerthink(); - } - if ( level.oldschool ) - { - self.pers["class"] = undefined; - self.class = self.pers[ "class" ]; - } - if ( isDefined( self.pers[ "team" ] ) ) - { - self.team = self.pers[ "team" ]; - } - if ( isDefined( self.pers[ "class" ] ) ) - { - self.class = self.pers[ "class" ]; - } - if ( !isDefined( self.pers[ "team" ] ) || isDefined( self.pers[ "needteam" ] ) ) - { - self.pers[ "team" ] = "spectator"; - self.team = "spectator"; - self.sessionstate = "dead"; - self maps/mp/gametypes/_globallogic_ui::updateobjectivetext(); - [[ level.spawnspectator ]](); - [[ level.autoassign ]]( 0 ); - if ( level.rankedmatch || level.leaguematch ) - { - self thread maps/mp/gametypes/_globallogic_spawn::kickifdontspawn(); - } - if ( self.pers[ "team" ] == "spectator" ) - { - self.sessionteam = "spectator"; - if ( !level.teambased ) - { - self.ffateam = "spectator"; - } - self thread spectate_player_watcher(); - } - if ( level.teambased ) - { - self.sessionteam = self.pers[ "team" ]; - if ( !isalive( self ) ) - { - self.statusicon = "hud_status_dead"; - } - self thread maps/mp/gametypes/_spectating::setspectatepermissions(); - } - } - else if ( self.pers[ "team" ] == "spectator" ) - { - self setclientscriptmainmenu( game[ "menu_class" ] ); - [[ level.spawnspectator ]](); - self.sessionteam = "spectator"; - self.sessionstate = "spectator"; - if ( !level.teambased ) - { - self.ffateam = "spectator"; - } - self thread spectate_player_watcher(); - } - else - { - self.sessionteam = self.pers[ "team" ]; - self.sessionstate = "dead"; - if ( !level.teambased ) - { - self.ffateam = self.pers[ "team" ]; - } - self maps/mp/gametypes/_globallogic_ui::updateobjectivetext(); - [[ level.spawnspectator ]](); - if ( maps/mp/gametypes/_globallogic_utils::isvalidclass( self.pers[ "class" ] ) ) - { - self thread [[ level.spawnclient ]](); - } - else - { - self maps/mp/gametypes/_globallogic_ui::showmainmenuforteam(); - } - self thread maps/mp/gametypes/_spectating::setspectatepermissions(); - } - if ( self.sessionteam != "spectator" ) - { - self thread maps/mp/gametypes/_spawning::onspawnplayer_unified( 1 ); - } - profilelog_endtiming( 4, "gs=" + game[ "state" ] + " zom=" + sessionmodeiszombiesgame() ); - if ( isDefined( self.pers[ "isBot" ] ) ) - { - return; - } + thread notifyconnecting(); + self.statusicon = "hud_status_connecting"; + + self waittill( "begin" ); + + if ( isdefined( level.reset_clientdvars ) ) + self [[ level.reset_clientdvars ]](); + + waittillframeend; + self.statusicon = ""; + self.guid = self getguid(); + matchrecorderincrementheaderstat( "playerCountJoined", 1 ); + profilelog_begintiming( 4, "ship" ); + level notify( "connected", self ); + + if ( self ishost() ) + self thread maps\mp\gametypes\_globallogic::listenforgameend(); + + if ( !level.splitscreen && !isdefined( self.pers["score"] ) ) + iprintln( &"MP_CONNECTED", self ); + + if ( !isdefined( self.pers["score"] ) ) + { + self thread maps\mp\gametypes\_persistence::adjustrecentstats(); + self maps\mp\gametypes\_persistence::setafteractionreportstat( "valid", 0 ); + + if ( gamemodeismode( level.gamemode_wager_match ) && !self ishost() ) + self maps\mp\gametypes\_persistence::setafteractionreportstat( "wagerMatchFailed", 1 ); + else + self maps\mp\gametypes\_persistence::setafteractionreportstat( "wagerMatchFailed", 0 ); + } + + if ( ( level.rankedmatch || level.wagermatch || level.leaguematch ) && !isdefined( self.pers["matchesPlayedStatsTracked"] ) ) + { + gamemode = maps\mp\gametypes\_globallogic::getcurrentgamemode(); + self maps\mp\gametypes\_globallogic::incrementmatchcompletionstat( gamemode, "played", "started" ); + + if ( !isdefined( self.pers["matchesHostedStatsTracked"] ) && self islocaltohost() ) + { + self maps\mp\gametypes\_globallogic::incrementmatchcompletionstat( gamemode, "hosted", "started" ); + self.pers["matchesHostedStatsTracked"] = 1; + } + + self.pers["matchesPlayedStatsTracked"] = 1; + self thread maps\mp\gametypes\_persistence::uploadstatssoon(); + } + + self maps\mp\_gamerep::gamerepplayerconnected(); + lpselfnum = self getentitynumber(); + lpguid = self getguid(); + logprint( "J;" + lpguid + ";" + lpselfnum + ";" + self.name + "\n" ); + bbprint( "mpjoins", "name %s client %s", self.name, lpselfnum ); + + if ( !sessionmodeiszombiesgame() ) + self setclientuivisibilityflag( "hud_visible", 1 ); + + if ( level.forceradar == 1 ) + { + self.pers["hasRadar"] = 1; + self.hasspyplane = 1; + level.activeuavs[self getentitynumber()] = 1; + } + + if ( level.forceradar == 2 ) + self setclientuivisibilityflag( "g_compassShowEnemies", level.forceradar ); + else + self setclientuivisibilityflag( "g_compassShowEnemies", 0 ); + + self setclientplayersprinttime( level.playersprinttime ); + self setclientnumlives( level.numlives ); + makedvarserverinfo( "cg_drawTalk", 1 ); + + if ( level.hardcoremode ) + self setclientdrawtalk( 3 ); + + if ( sessionmodeiszombiesgame() ) + self [[ level.player_stats_init ]](); + else + { + self maps\mp\gametypes\_globallogic_score::initpersstat( "score" ); + + if ( level.resetplayerscoreeveryround ) + self.pers["score"] = 0; + + self.score = self.pers["score"]; + self maps\mp\gametypes\_globallogic_score::initpersstat( "pointstowin" ); + + if ( level.scoreroundbased ) + self.pers["pointstowin"] = 0; + + self.pointstowin = self.pers["pointstowin"]; + self maps\mp\gametypes\_globallogic_score::initpersstat( "momentum", 0 ); + self.momentum = self maps\mp\gametypes\_globallogic_score::getpersstat( "momentum" ); + self maps\mp\gametypes\_globallogic_score::initpersstat( "suicides" ); + self.suicides = self maps\mp\gametypes\_globallogic_score::getpersstat( "suicides" ); + self maps\mp\gametypes\_globallogic_score::initpersstat( "headshots" ); + self.headshots = self maps\mp\gametypes\_globallogic_score::getpersstat( "headshots" ); + self maps\mp\gametypes\_globallogic_score::initpersstat( "challenges" ); + self.challenges = self maps\mp\gametypes\_globallogic_score::getpersstat( "challenges" ); + self maps\mp\gametypes\_globallogic_score::initpersstat( "kills" ); + self.kills = self maps\mp\gametypes\_globallogic_score::getpersstat( "kills" ); + self maps\mp\gametypes\_globallogic_score::initpersstat( "deaths" ); + self.deaths = self maps\mp\gametypes\_globallogic_score::getpersstat( "deaths" ); + self maps\mp\gametypes\_globallogic_score::initpersstat( "assists" ); + self.assists = self maps\mp\gametypes\_globallogic_score::getpersstat( "assists" ); + self maps\mp\gametypes\_globallogic_score::initpersstat( "defends", 0 ); + self.defends = self maps\mp\gametypes\_globallogic_score::getpersstat( "defends" ); + self maps\mp\gametypes\_globallogic_score::initpersstat( "offends", 0 ); + self.offends = self maps\mp\gametypes\_globallogic_score::getpersstat( "offends" ); + self maps\mp\gametypes\_globallogic_score::initpersstat( "plants", 0 ); + self.plants = self maps\mp\gametypes\_globallogic_score::getpersstat( "plants" ); + self maps\mp\gametypes\_globallogic_score::initpersstat( "defuses", 0 ); + self.defuses = self maps\mp\gametypes\_globallogic_score::getpersstat( "defuses" ); + self maps\mp\gametypes\_globallogic_score::initpersstat( "returns", 0 ); + self.returns = self maps\mp\gametypes\_globallogic_score::getpersstat( "returns" ); + self maps\mp\gametypes\_globallogic_score::initpersstat( "captures", 0 ); + self.captures = self maps\mp\gametypes\_globallogic_score::getpersstat( "captures" ); + self maps\mp\gametypes\_globallogic_score::initpersstat( "destructions", 0 ); + self.destructions = self maps\mp\gametypes\_globallogic_score::getpersstat( "destructions" ); + self maps\mp\gametypes\_globallogic_score::initpersstat( "backstabs", 0 ); + self.backstabs = self maps\mp\gametypes\_globallogic_score::getpersstat( "backstabs" ); + self maps\mp\gametypes\_globallogic_score::initpersstat( "longshots", 0 ); + self.longshots = self maps\mp\gametypes\_globallogic_score::getpersstat( "longshots" ); + self maps\mp\gametypes\_globallogic_score::initpersstat( "survived", 0 ); + self.survived = self maps\mp\gametypes\_globallogic_score::getpersstat( "survived" ); + self maps\mp\gametypes\_globallogic_score::initpersstat( "stabs", 0 ); + self.stabs = self maps\mp\gametypes\_globallogic_score::getpersstat( "stabs" ); + self maps\mp\gametypes\_globallogic_score::initpersstat( "tomahawks", 0 ); + self.tomahawks = self maps\mp\gametypes\_globallogic_score::getpersstat( "tomahawks" ); + self maps\mp\gametypes\_globallogic_score::initpersstat( "humiliated", 0 ); + self.humiliated = self maps\mp\gametypes\_globallogic_score::getpersstat( "humiliated" ); + self maps\mp\gametypes\_globallogic_score::initpersstat( "x2score", 0 ); + self.x2score = self maps\mp\gametypes\_globallogic_score::getpersstat( "x2score" ); + self maps\mp\gametypes\_globallogic_score::initpersstat( "agrkills", 0 ); + self.x2score = self maps\mp\gametypes\_globallogic_score::getpersstat( "agrkills" ); + self maps\mp\gametypes\_globallogic_score::initpersstat( "hacks", 0 ); + self.x2score = self maps\mp\gametypes\_globallogic_score::getpersstat( "hacks" ); + self maps\mp\gametypes\_globallogic_score::initpersstat( "killsconfirmed", 0 ); + self.killsconfirmed = self maps\mp\gametypes\_globallogic_score::getpersstat( "killsconfirmed" ); + self maps\mp\gametypes\_globallogic_score::initpersstat( "killsdenied", 0 ); + self.killsdenied = self maps\mp\gametypes\_globallogic_score::getpersstat( "killsdenied" ); + self maps\mp\gametypes\_globallogic_score::initpersstat( "sessionbans", 0 ); + self.sessionbans = self maps\mp\gametypes\_globallogic_score::getpersstat( "sessionbans" ); + self maps\mp\gametypes\_globallogic_score::initpersstat( "gametypeban", 0 ); + self maps\mp\gametypes\_globallogic_score::initpersstat( "time_played_total", 0 ); + self maps\mp\gametypes\_globallogic_score::initpersstat( "time_played_alive", 0 ); + self maps\mp\gametypes\_globallogic_score::initpersstat( "teamkills", 0 ); + self maps\mp\gametypes\_globallogic_score::initpersstat( "teamkills_nostats", 0 ); + self.teamkillpunish = 0; + + if ( level.minimumallowedteamkills >= 0 && self.pers["teamkills_nostats"] > level.minimumallowedteamkills ) + self thread reduceteamkillsovertime(); + } + + if ( getdvar( "r_reflectionProbeGenerate" ) == "1" ) + level waittill( "eternity" ); + + self.killedplayerscurrent = []; + + if ( !isdefined( self.pers["best_kill_streak"] ) ) + { + self.pers["killed_players"] = []; + self.pers["killed_by"] = []; + self.pers["nemesis_tracking"] = []; + self.pers["artillery_kills"] = 0; + self.pers["dog_kills"] = 0; + self.pers["nemesis_name"] = ""; + self.pers["nemesis_rank"] = 0; + self.pers["nemesis_rankIcon"] = 0; + self.pers["nemesis_xp"] = 0; + self.pers["nemesis_xuid"] = ""; + self.pers["best_kill_streak"] = 0; + } + + if ( !isdefined( self.pers["music"] ) ) + { + self.pers["music"] = spawnstruct(); + self.pers["music"].spawn = 0; + self.pers["music"].inque = 0; + self.pers["music"].currentstate = "SILENT"; + self.pers["music"].previousstate = "SILENT"; + self.pers["music"].nextstate = "UNDERSCORE"; + self.pers["music"].returnstate = "UNDERSCORE"; + } + + self.leaderdialogqueue = []; + self.leaderdialogactive = 0; + self.leaderdialoggroups = []; + self.currentleaderdialoggroup = ""; + self.currentleaderdialog = ""; + self.currentleaderdialogtime = 0; + + if ( !isdefined( self.pers["cur_kill_streak"] ) ) + self.pers["cur_kill_streak"] = 0; + + if ( !isdefined( self.pers["cur_total_kill_streak"] ) ) + { + self.pers["cur_total_kill_streak"] = 0; + self setplayercurrentstreak( 0 ); + } + + if ( !isdefined( self.pers["totalKillstreakCount"] ) ) + self.pers["totalKillstreakCount"] = 0; + + if ( !isdefined( self.pers["killstreaksEarnedThisKillstreak"] ) ) + self.pers["killstreaksEarnedThisKillstreak"] = 0; + + if ( isdefined( level.usingscorestreaks ) && level.usingscorestreaks && !isdefined( self.pers["killstreak_quantity"] ) ) + self.pers["killstreak_quantity"] = []; + + if ( isdefined( level.usingscorestreaks ) && level.usingscorestreaks && !isdefined( self.pers["held_killstreak_ammo_count"] ) ) + self.pers["held_killstreak_ammo_count"] = []; + + if ( isdefined( level.usingscorestreaks ) && level.usingscorestreaks && !isdefined( self.pers["held_killstreak_clip_count"] ) ) + self.pers["held_killstreak_clip_count"] = []; + + if ( !isdefined( self.pers["changed_class"] ) ) + self.pers["changed_class"] = 0; + + self.lastkilltime = 0; + self.cur_death_streak = 0; + self disabledeathstreak(); + self.death_streak = 0; + self.kill_streak = 0; + self.gametype_kill_streak = 0; + self.spawnqueueindex = -1; + self.deathtime = 0; + + if ( level.onlinegame ) + { + self.death_streak = self getdstat( "HighestStats", "death_streak" ); + self.kill_streak = self getdstat( "HighestStats", "kill_streak" ); + self.gametype_kill_streak = self maps\mp\gametypes\_persistence::statgetwithgametype( "kill_streak" ); + } + + self.lastgrenadesuicidetime = -1; + self.teamkillsthisround = 0; + + if ( !isdefined( level.livesdonotreset ) || !level.livesdonotreset || !isdefined( self.pers["lives"] ) ) + self.pers["lives"] = level.numlives; + + if ( !level.teambased ) + self.pers["team"] = undefined; + + self.hasspawned = 0; + self.waitingtospawn = 0; + self.wantsafespawn = 0; + self.deathcount = 0; + self.wasaliveatmatchstart = 0; + self thread maps\mp\_flashgrenades::monitorflash(); + level.players[level.players.size] = self; + + if ( level.splitscreen ) + setdvar( "splitscreen_playerNum", level.players.size ); + + if ( game["state"] == "postgame" ) + { + self.pers["needteam"] = 1; + self.pers["team"] = "spectator"; + self.team = "spectator"; + self setclientuivisibilityflag( "hud_visible", 0 ); + self [[ level.spawnintermission ]](); + self closemenu(); + self closeingamemenu(); + profilelog_endtiming( 4, "gs=" + game["state"] + " zom=" + sessionmodeiszombiesgame() ); + return; + } + + if ( ( level.rankedmatch || level.wagermatch || level.leaguematch ) && !isdefined( self.pers["lossAlreadyReported"] ) ) + { + if ( level.leaguematch ) + self recordleaguepreloser(); + + maps\mp\gametypes\_globallogic_score::updatelossstats( self ); + self.pers["lossAlreadyReported"] = 1; + } + + if ( !isdefined( self.pers["winstreakAlreadyCleared"] ) ) + { + self maps\mp\gametypes\_globallogic_score::backupandclearwinstreaks(); + self.pers["winstreakAlreadyCleared"] = 1; + } + + if ( self istestclient() ) + self.pers["isBot"] = 1; + + if ( level.rankedmatch || level.leaguematch ) + self maps\mp\gametypes\_persistence::setafteractionreportstat( "demoFileID", "0" ); + + level endon( "game_ended" ); + + if ( isdefined( level.hostmigrationtimer ) ) + self thread maps\mp\gametypes\_hostmigration::hostmigrationtimerthink(); + + if ( level.oldschool ) + { + self.pers["class"] = undefined; + self.class = self.pers["class"]; + } + + if ( isdefined( self.pers["team"] ) ) + self.team = self.pers["team"]; + + if ( isdefined( self.pers["class"] ) ) + self.class = self.pers["class"]; + + if ( !isdefined( self.pers["team"] ) || isdefined( self.pers["needteam"] ) ) + { + self.pers["needteam"] = undefined; + self.pers["team"] = "spectator"; + self.team = "spectator"; + self.sessionstate = "dead"; + self maps\mp\gametypes\_globallogic_ui::updateobjectivetext(); + [[ level.spawnspectator ]](); + [[ level.autoassign ]]( 0 ); + + if ( level.rankedmatch || level.leaguematch ) + self thread maps\mp\gametypes\_globallogic_spawn::kickifdontspawn(); + + if ( self.pers["team"] == "spectator" ) + { + self.sessionteam = "spectator"; + + if ( !level.teambased ) + self.ffateam = "spectator"; + + self thread spectate_player_watcher(); + } + + if ( level.teambased ) + { + self.sessionteam = self.pers["team"]; + + if ( !isalive( self ) ) + self.statusicon = "hud_status_dead"; + + self thread maps\mp\gametypes\_spectating::setspectatepermissions(); + } + } + else if ( self.pers["team"] == "spectator" ) + { + self setclientscriptmainmenu( game["menu_class"] ); + [[ level.spawnspectator ]](); + self.sessionteam = "spectator"; + self.sessionstate = "spectator"; + + if ( !level.teambased ) + self.ffateam = "spectator"; + + self thread spectate_player_watcher(); + } + else + { + self.sessionteam = self.pers["team"]; + self.sessionstate = "dead"; + + if ( !level.teambased ) + self.ffateam = self.pers["team"]; + + self maps\mp\gametypes\_globallogic_ui::updateobjectivetext(); + [[ level.spawnspectator ]](); + + if ( maps\mp\gametypes\_globallogic_utils::isvalidclass( self.pers["class"] ) ) + self thread [[ level.spawnclient ]](); + else + self maps\mp\gametypes\_globallogic_ui::showmainmenuforteam(); + + self thread maps\mp\gametypes\_spectating::setspectatepermissions(); + } + + if ( self.sessionteam != "spectator" ) + self thread maps\mp\gametypes\_spawning::onspawnplayer_unified( 1 ); + + profilelog_endtiming( 4, "gs=" + game["state"] + " zom=" + sessionmodeiszombiesgame() ); + + if ( isdefined( self.pers["isBot"] ) ) + return; } -spectate_player_watcher() //checked changed to match beta dump +spectate_player_watcher() { - self endon( "disconnect" ); - if ( !level.splitscreen && !level.hardcoremode && getDvarInt( "scr_showperksonspawn" ) == 1 && game[ "state" ] != "postgame" && !isDefined( self.perkhudelem ) ) - { - if ( level.perksenabled == 1 ) - { - self maps/mp/gametypes/_hud_util::showperks(); - } - self thread maps/mp/gametypes/_globallogic_ui::hideloadoutaftertime( 0 ); - } - self.watchingactiveclient = 1; - self.waitingforplayerstext = undefined; - while ( 1 ) - { - if ( self.pers[ "team" ] != "spectator" || level.gameended ) - { - self maps/mp/gametypes/_hud_message::clearshoutcasterwaitingmessage(); - self freezecontrols( 0 ); - self.watchingactiveclient = 0; - return; - } - else - { - count = 0; - for ( i = 0; i < level.players.size; i++ ) - { - if ( level.players[ i ].team != "spectator" ) - { - count++; - break; - } - } - if ( count > 0 ) - { - if ( !self.watchingactiveclient ) - { - self maps/mp/gametypes/_hud_message::clearshoutcasterwaitingmessage(); - self freezecontrols( 0 ); - } - self.watchingactiveclient = 1; - } - else - { - if ( self.watchingactiveclient ) - { - [[ level.onspawnspectator ]](); - self freezecontrols( 1 ); - self maps/mp/gametypes/_hud_message::setshoutcasterwaitingmessage(); - } - self.watchingactiveclient = 0; - } - wait 0.5; - } - } + self endon( "disconnect" ); + + if ( !level.splitscreen && !level.hardcoremode && getdvarint( "scr_showperksonspawn" ) == 1 && game["state"] != "postgame" && !isdefined( self.perkhudelem ) ) + { + if ( level.perksenabled == 1 ) + self maps\mp\gametypes\_hud_util::showperks(); + + self thread maps\mp\gametypes\_globallogic_ui::hideloadoutaftertime( 0 ); + } + + self.watchingactiveclient = 1; + self.waitingforplayerstext = undefined; + + while ( true ) + { + if ( self.pers["team"] != "spectator" || level.gameended ) + { + self maps\mp\gametypes\_hud_message::clearshoutcasterwaitingmessage(); + self freezecontrols( 0 ); + self.watchingactiveclient = 0; + break; + } + else + { + count = 0; + + for ( i = 0; i < level.players.size; i++ ) + { + if ( level.players[i].team != "spectator" ) + { + count++; + break; + } + } + + if ( count > 0 ) + { + if ( !self.watchingactiveclient ) + { + self maps\mp\gametypes\_hud_message::clearshoutcasterwaitingmessage(); + self freezecontrols( 0 ); + } + + self.watchingactiveclient = 1; + } + else + { + if ( self.watchingactiveclient ) + { + [[ level.onspawnspectator ]](); + self freezecontrols( 1 ); + self maps\mp\gametypes\_hud_message::setshoutcasterwaitingmessage(); + } + + self.watchingactiveclient = 0; + } + + wait 0.5; + } + } } -callback_playermigrated() //checked matches cerberus output +callback_playermigrated() { - /* /# - println( "Player " + self.name + " finished migrating at time " + getTime() ); + println( "Player " + self.name + " finished migrating at time " + gettime() ); #/ - */ - if ( is_true( self.connected ) ) - { - self maps/mp/gametypes/_globallogic_ui::updateobjectivetext(); - } - level.hostmigrationreturnedplayercount++; - if ( level.hostmigrationreturnedplayercount >= ( ( level.players.size * 2 ) / 3 ) ) - { - /* + + if ( isdefined( self.connected ) && self.connected ) + self maps\mp\gametypes\_globallogic_ui::updateobjectivetext(); + + level.hostmigrationreturnedplayercount++; + + if ( level.hostmigrationreturnedplayercount >= level.players.size * 2 / 3 ) + { /# - println( "2/3 of players have finished migrating" ); + println( "2/3 of players have finished migrating" ); #/ - */ - level notify( "hostmigration_enoughplayers" ); - } + level notify( "hostmigration_enoughplayers" ); + } } -callback_playerdisconnect() //checked changed to match cerberus output +callback_playerdisconnect() { - profilelog_begintiming( 5, "ship" ); - if ( game[ "state" ] != "postgame" && !level.gameended ) - { - gamelength = maps/mp/gametypes/_globallogic::getgamelength(); - self maps/mp/gametypes/_globallogic::bbplayermatchend( gamelength, "MP_PLAYER_DISCONNECT", 0 ); - } - self removeplayerondisconnect(); - if ( level.splitscreen ) - { - players = level.players; - if ( players.size <= 1 ) - { - level thread maps/mp/gametypes/_globallogic::forceend(); - } - setdvar( "splitscreen_playerNum", players.size ); - } - if ( isDefined( self.score ) && isDefined( self.pers[ "team" ] ) ) - { - self logstring( "team: score " + self.pers[ "team" ] + ":" + self.score ); - level.dropteam += 1; - } - [[ level.onplayerdisconnect ]](); - lpselfnum = self getentitynumber(); - lpguid = self getguid(); - logprint( "Q;" + lpguid + ";" + lpselfnum + ";" + self.name + "\n" ); - self maps/mp/_gamerep::gamerepplayerdisconnected(); - for ( entry = 0; entry < level.players.size; entry++ ) - { - if ( level.players[ entry ] == self ) - { - while ( entry < ( level.players.size - 1 ) ) - { - level.players[ entry ] = level.players[ entry + 1 ]; - entry++; - } - level.players[ entry ] = undefined; - break; - } - } - for ( entry = 0; entry < level.players.size; entry++ ) - { - if ( isDefined( level.players[ entry ].pers[ "killed_players" ][ self.name ] ) ) - { - level.players[ entry ].pers[ "killed_players" ][ self.name ] = undefined; - } - if ( isDefined( level.players[ entry ].killedplayerscurrent[ self.name ] ) ) - { - level.players[ entry ].killedplayerscurrent[ self.name ] = undefined; - } - if ( isDefined( level.players[ entry ].pers[ "killed_by" ][ self.name ] ) ) - { - level.players[ entry ].pers[ "killed_by" ][ self.name ] = undefined; - } - if ( isDefined( level.players[ entry ].pers[ "nemesis_tracking" ][ self.name ] ) ) - { - level.players[ entry ].pers[ "nemesis_tracking" ][ self.name ] = undefined; - } - if ( level.players[ entry ].pers[ "nemesis_name" ] == self.name ) - { - level.players[ entry ] choosenextbestnemesis(); - } - } - if ( level.gameended ) - { - self maps/mp/gametypes/_globallogic::removedisconnectedplayerfromplacement(); - } - level thread maps/mp/gametypes/_globallogic::updateteamstatus(); - profilelog_endtiming( 5, "gs=" + game[ "state" ] + " zom=" + sessionmodeiszombiesgame() ); + profilelog_begintiming( 5, "ship" ); + + if ( game["state"] != "postgame" && !level.gameended ) + { + gamelength = maps\mp\gametypes\_globallogic::getgamelength(); + self maps\mp\gametypes\_globallogic::bbplayermatchend( gamelength, "MP_PLAYER_DISCONNECT", 0 ); + } + + self removeplayerondisconnect(); + + if ( level.splitscreen ) + { + players = level.players; + + if ( players.size <= 1 ) + level thread maps\mp\gametypes\_globallogic::forceend(); + + setdvar( "splitscreen_playerNum", players.size ); + } + + if ( isdefined( self.score ) && isdefined( self.pers["team"] ) ) + { + self logstring( "team: score " + self.pers["team"] + ":" + self.score ); + level.dropteam += 1; + } + + [[ level.onplayerdisconnect ]](); + lpselfnum = self getentitynumber(); + lpguid = self getguid(); + logprint( "Q;" + lpguid + ";" + lpselfnum + ";" + self.name + "\n" ); + self maps\mp\_gamerep::gamerepplayerdisconnected(); + + for ( entry = 0; entry < level.players.size; entry++ ) + { + if ( level.players[entry] == self ) + { + while ( entry < level.players.size - 1 ) + { + level.players[entry] = level.players[entry + 1]; + entry++; + } + + level.players[entry] = undefined; + break; + } + } + + for ( entry = 0; entry < level.players.size; entry++ ) + { + if ( isdefined( level.players[entry].pers["killed_players"][self.name] ) ) + level.players[entry].pers["killed_players"][self.name] = undefined; + + if ( isdefined( level.players[entry].killedplayerscurrent[self.name] ) ) + level.players[entry].killedplayerscurrent[self.name] = undefined; + + if ( isdefined( level.players[entry].pers["killed_by"][self.name] ) ) + level.players[entry].pers["killed_by"][self.name] = undefined; + + if ( isdefined( level.players[entry].pers["nemesis_tracking"][self.name] ) ) + level.players[entry].pers["nemesis_tracking"][self.name] = undefined; + + if ( level.players[entry].pers["nemesis_name"] == self.name ) + level.players[entry] choosenextbestnemesis(); + } + + if ( level.gameended ) + self maps\mp\gametypes\_globallogic::removedisconnectedplayerfromplacement(); + + level thread maps\mp\gametypes\_globallogic::updateteamstatus(); + profilelog_endtiming( 5, "gs=" + game["state"] + " zom=" + sessionmodeiszombiesgame() ); } -callback_playermelee( eattacker, idamage, sweapon, vorigin, vdir, boneindex, shieldhit ) //checked matches cerberus output +callback_playermelee( eattacker, idamage, sweapon, vorigin, vdir, boneindex, shieldhit ) { - hit = 1; - if ( level.teambased && self.team == eattacker.team ) - { - if ( level.friendlyfire == 0 ) - { - hit = 0; - } - } - self finishmeleehit( eattacker, sweapon, vorigin, vdir, boneindex, shieldhit, hit ); + hit = 1; + + if ( level.teambased && self.team == eattacker.team ) + { + if ( level.friendlyfire == 0 ) + hit = 0; + } + + self finishmeleehit( eattacker, sweapon, vorigin, vdir, boneindex, shieldhit, hit ); } -choosenextbestnemesis() //checked changed to match cerberus output +choosenextbestnemesis() { - nemesisarray = self.pers[ "nemesis_tracking" ]; - nemesisarraykeys = getarraykeys( nemesisarray ); - nemesisamount = 0; - nemesisname = ""; - if ( nemesisarraykeys.size > 0 ) - { - for ( i = 0; i < nemesisarraykeys.size; i++ ) - { - nemesisarraykey = nemesisarraykeys[ i ]; - if ( nemesisarray[ nemesisarraykey ] > nemesisamount ) - { - nemesisname = nemesisarraykey; - nemesisamount = nemesisarray[ nemesisarraykey ]; - } - } - } - self.pers[ "nemesis_name" ] = nemesisname; - if ( nemesisname != "" ) - { - for ( playerindex = 0; playerindex < level.players.size; playerindex++ ) - { - if ( level.players[ playerindex ].name == nemesisname ) - { - nemesisplayer = level.players[ playerindex ]; - self.pers[ "nemesis_rank" ] = nemesisplayer.pers[ "rank" ]; - self.pers[ "nemesis_rankIcon" ] = nemesisplayer.pers[ "rankxp" ]; - self.pers[ "nemesis_xp" ] = nemesisplayer.pers[ "prestige" ]; - self.pers[ "nemesis_xuid" ] = nemesisplayer getxuid( 1 ); - break; - } - } - } - else - { - self.pers[ "nemesis_xuid" ] = ""; - } + nemesisarray = self.pers["nemesis_tracking"]; + nemesisarraykeys = getarraykeys( nemesisarray ); + nemesisamount = 0; + nemesisname = ""; + + if ( nemesisarraykeys.size > 0 ) + { + for ( i = 0; i < nemesisarraykeys.size; i++ ) + { + nemesisarraykey = nemesisarraykeys[i]; + + if ( nemesisarray[nemesisarraykey] > nemesisamount ) + { + nemesisname = nemesisarraykey; + nemesisamount = nemesisarray[nemesisarraykey]; + } + } + } + + self.pers["nemesis_name"] = nemesisname; + + if ( nemesisname != "" ) + { + for ( playerindex = 0; playerindex < level.players.size; playerindex++ ) + { + if ( level.players[playerindex].name == nemesisname ) + { + nemesisplayer = level.players[playerindex]; + self.pers["nemesis_rank"] = nemesisplayer.pers["rank"]; + self.pers["nemesis_rankIcon"] = nemesisplayer.pers["rankxp"]; + self.pers["nemesis_xp"] = nemesisplayer.pers["prestige"]; + self.pers["nemesis_xuid"] = nemesisplayer getxuid( 1 ); + break; + } + } + } + else + self.pers["nemesis_xuid"] = ""; } -removeplayerondisconnect() //checked changed to match cerberus output +removeplayerondisconnect() { - for ( entry = 0; entry < level.players.size; entry++ ) - { - if ( level.players[ entry ] == self ) - { - while ( entry < ( level.players.size - 1 ) ) - { - level.players[ entry ] = level.players[ entry + 1 ]; - entry++; - } - level.players[ entry ] = undefined; - break; - } - } + for ( entry = 0; entry < level.players.size; entry++ ) + { + if ( level.players[entry] == self ) + { + while ( entry < level.players.size - 1 ) + { + level.players[entry] = level.players[entry + 1]; + entry++; + } + + level.players[entry] = undefined; + break; + } + } } -custom_gamemodes_modified_damage( victim, eattacker, idamage, smeansofdeath, sweapon, einflictor, shitloc ) //matches cerberus output +custom_gamemodes_modified_damage( victim, eattacker, idamage, smeansofdeath, sweapon, einflictor, shitloc ) { - if ( level.onlinegame && !sessionmodeisprivate() ) - { - return idamage; - } - if ( isDefined( eattacker ) && isDefined( eattacker.damagemodifier ) ) - { - idamage *= eattacker.damagemodifier; - } - if ( smeansofdeath == "MOD_PISTOL_BULLET" || smeansofdeath == "MOD_RIFLE_BULLET" ) - { - idamage = int( idamage * level.bulletdamagescalar ); - } - return idamage; + if ( level.onlinegame && !sessionmodeisprivate() ) + return idamage; + + if ( isdefined( eattacker ) && isdefined( eattacker.damagemodifier ) ) + idamage *= eattacker.damagemodifier; + + if ( smeansofdeath == "MOD_PISTOL_BULLET" || smeansofdeath == "MOD_RIFLE_BULLET" ) + idamage = int( idamage * level.bulletdamagescalar ); + + return idamage; } -figureoutattacker( eattacker ) //checked changed to match cerberus output +figureoutattacker( eattacker ) { - if ( isDefined( eattacker ) ) - { - if ( isai( eattacker ) && isDefined( eattacker.script_owner ) ) - { - team = self.team; - if ( isai( self ) && isDefined( self.aiteam ) ) - { - team = self.aiteam; - } - if ( eattacker.script_owner.team != team ) - { - eattacker = eattacker.script_owner; - } - } - if ( eattacker.classname == "script_vehicle" && isDefined( eattacker.owner ) ) - { - eattacker = eattacker.owner; - } - else if ( eattacker.classname == "auto_turret" && isDefined( eattacker.owner ) ) - { - eattacker = eattacker.owner; - } - } - return eattacker; + if ( isdefined( eattacker ) ) + { + if ( isai( eattacker ) && isdefined( eattacker.script_owner ) ) + { + team = self.team; + + if ( isai( self ) && isdefined( self.aiteam ) ) + team = self.aiteam; + + if ( eattacker.script_owner.team != team ) + eattacker = eattacker.script_owner; + } + + if ( eattacker.classname == "script_vehicle" && isdefined( eattacker.owner ) ) + eattacker = eattacker.owner; + else if ( eattacker.classname == "auto_turret" && isdefined( eattacker.owner ) ) + eattacker = eattacker.owner; + } + + return eattacker; } -figureoutweapon( sweapon, einflictor ) //checked changed to match cerberus output +figureoutweapon( sweapon, einflictor ) { - 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"; - } - } - return sweapon; + 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"; + } + + return sweapon; } -isplayerimmunetokillstreak( eattacker, sweapon ) //checked matches cerberus output +isplayerimmunetokillstreak( eattacker, sweapon ) { - if ( level.hardcoremode ) - { - return 0; - } - if ( !isDefined( eattacker ) ) - { - return 0; - } - if ( self != eattacker ) - { - return 0; - } - if ( sweapon != "straferun_gun_mp" && sweapon != "straferun_rockets_mp" ) - { - return 0; - } - return 1; + if ( level.hardcoremode ) + return false; + + if ( !isdefined( eattacker ) ) + return false; + + if ( self != eattacker ) + return false; + + if ( sweapon != "straferun_gun_mp" && sweapon != "straferun_rockets_mp" ) + return false; + + return true; } -callback_playerdamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex ) //checked partially changed to match beta dump changed at own discretion +callback_playerdamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex ) { - profilelog_begintiming( 6, "ship" ); - if ( game[ "state" ] == "postgame" ) - { - return; - } - if ( self.sessionteam == "spectator" ) - { - return; - } - if ( !is_true( self.candocombat ) ) - { - return; - } - if ( isDefined( eattacker ) && isplayer( eattacker ) && !is_true( eattacker.candocombat ) ) - { - return; - } - if ( isDefined( level.hostmigrationtimer ) ) - { - return; - } - if ( sweapon == "ai_tank_drone_gun_mp" || sweapon == "ai_tank_drone_rocket_mp" && !level.hardcoremode ) - { - if ( isDefined( eattacker ) && eattacker == self ) - { - if ( isDefined( einflictor ) && isDefined( einflictor.from_ai ) ) - { - return; - } - } - if ( isDefined( eattacker ) && isDefined( eattacker.owner ) && eattacker.owner == self ) - { - return; - } - } - if ( sweapon == "emp_grenade_mp" ) - { - if ( self hasperk( "specialty_immuneemp" ) ) - { - return; - } - self notify( "emp_grenaded", eattacker ); - } - if ( isDefined( eattacker ) ) - { - idamage = maps/mp/gametypes/_class::cac_modified_damage( self, eattacker, idamage, smeansofdeath, sweapon, einflictor, shitloc ); - } - idamage = custom_gamemodes_modified_damage( self, eattacker, idamage, smeansofdeath, sweapon, einflictor, shitloc ); - idamage = int( idamage ); - self.idflags = idflags; - self.idflagstime = getTime(); - eattacker = figureoutattacker( eattacker ); - pixbeginevent( "PlayerDamage flags/tweaks" ); - if ( !isDefined( vdir ) ) - { - idflags |= level.idflags_no_knockback; - } - friendly = 0; - if ( self.health != self.maxhealth ) - { - self notify( "snd_pain_player" ); - } - if ( isDefined( einflictor ) && isDefined( einflictor.script_noteworthy ) ) - { - if ( einflictor.script_noteworthy == "ragdoll_now" ) - { - smeansofdeath = "MOD_FALLING"; - } - if ( isDefined( level.overrideweaponfunc ) ) - { - sweapon = [[ level.overrideweaponfunc ]]( sweapon, einflictor.script_noteworthy ); - } - } - if ( maps/mp/gametypes/_globallogic_utils::isheadshot( sweapon, shitloc, smeansofdeath, einflictor ) && isplayer( eattacker ) ) - { - smeansofdeath = "MOD_HEAD_SHOT"; - } - if ( level.onplayerdamage != maps/mp/gametypes/_globallogic::blank ) - { - modifieddamage = [[ level.onplayerdamage ]]( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime ); - if ( isDefined( modifieddamage ) ) - { - if ( modifieddamage <= 0 ) - { - return; - } - idamage = modifieddamage; - } - } - if ( level.onlyheadshots ) - { - if ( smeansofdeath == "MOD_PISTOL_BULLET" || smeansofdeath == "MOD_RIFLE_BULLET" ) - { - return; - } - else if ( smeansofdeath == "MOD_HEAD_SHOT" ) - { - idamage = 150; - } - } - if ( self maps/mp/_vehicles::player_is_occupant_invulnerable( smeansofdeath ) ) - { - return; - } - if ( isDefined( eattacker ) && isplayer( eattacker ) && self.team != eattacker.team ) - { - self.lastattackweapon = sweapon; - } - sweapon = figureoutweapon( sweapon, einflictor ); - pixendevent(); - if ( idflags & level.idflags_penetration && isplayer( eattacker ) && eattacker hasperk( "specialty_bulletpenetration" ) ) - { - self thread maps/mp/gametypes/_battlechatter_mp::perkspecificbattlechatter( "deepimpact", 1 ); - } - if ( isplayer( eattacker ) && self isenemyplayer( eattacker ) == 0 ) - { - attackerishittingteammate = 1; - } - else - { - attackerishittingteammate = 0; - } - if ( shitloc == "riotshield" ) - { - if ( attackerishittingteammate && level.friendlyfire == 0 ) - { - return; - } - if ( smeansofdeath == "MOD_PISTOL_BULLET" || smeansofdeath == "MOD_RIFLE_BULLET" && !maps/mp/killstreaks/_killstreaks::iskillstreakweapon( sweapon ) && !attackerishittingteammate ) - { - if ( self.hasriotshieldequipped ) - { - if ( isplayer( eattacker ) ) - { - eattacker.lastattackedshieldplayer = self; - eattacker.lastattackedshieldtime = getTime(); - } - previous_shield_damage = self.shielddamageblocked; - self.shielddamageblocked += idamage; - if ( ( self.shielddamageblocked % 400 ) < ( previous_shield_damage % 400 ) ) - { - score_event = "shield_blocked_damage"; - if ( self.shielddamageblocked > 2000 ) - { - score_event = "shield_blocked_damage_reduced"; - } - if ( isDefined( level.scoreinfo[ score_event ][ "value" ] ) ) - { - self addweaponstat( "riotshield_mp", "score_from_blocked_damage", level.scoreinfo[ score_event ][ "value" ] ); - } - thread maps/mp/_scoreevents::processscoreevent( score_event, self ); - } - } - } - if ( idflags & level.idflags_shield_explosive_impact ) - { - shitloc = "none"; - if ( idflags & level.idflags_shield_explosive_impact_huge ) - { - idamage *= 0; - } - } - else if ( idflags & level.idflags_shield_explosive_splash ) - { - if ( isDefined( einflictor ) && isDefined( einflictor.stucktoplayer ) && einflictor.stucktoplayer == self ) - { - idamage = 101; - } - shitloc = "none"; - } - else - { - return; - } - } - if ( idflags & level.idflags_no_protection ) - { - if ( ( smeansofdeath == "MOD_GAS" || maps/mp/gametypes/_class::isexplosivedamage( undefined, smeansofdeath ) ) && isDefined( einflictor ) ) - { - if ( ( einflictor.classname == "grenade" || sweapon == "tabun_gas_mp" ) && ( self.lastspawntime + 3500 ) > getTime() && distancesquared( einflictor.origin, self.lastspawnpoint.origin ) < 62500 ) - { - return; - } - if ( self isplayerimmunetokillstreak( eattacker, sweapon ) ) - { - return; - } - self.explosiveinfo = []; - self.explosiveinfo[ "damageTime" ] = getTime(); - self.explosiveinfo[ "damageId" ] = einflictor getentitynumber(); - self.explosiveinfo[ "originalOwnerKill" ] = 0; - self.explosiveinfo[ "bulletPenetrationKill" ] = 0; - self.explosiveinfo[ "chainKill" ] = 0; - self.explosiveinfo[ "damageExplosiveKill" ] = 0; - self.explosiveinfo[ "chainKill" ] = 0; - self.explosiveinfo[ "cookedKill" ] = 0; - self.explosiveinfo[ "weapon" ] = sweapon; - self.explosiveinfo[ "originalowner" ] = einflictor.originalowner; - isfrag = sweapon == "frag_grenade_mp"; - if ( isDefined( eattacker ) && eattacker != self ) - { - if ( ( sweapon == "satchel_charge_mp" || sweapon == "claymore_mp" ) && isDefined( eattacker ) && isDefined( einflictor.owner ) || sweapon == "bouncingbetty_mp" && isDefined( eattacker ) && isDefined( einflictor.owner ) ) - { - self.explosiveinfo[ "originalOwnerKill" ] = einflictor.owner == self; - self.explosiveinfo[ "damageExplosiveKill" ] = isDefined( einflictor.wasdamaged ); - self.explosiveinfo[ "chainKill" ] = isDefined( einflictor.waschained ); - self.explosiveinfo[ "wasJustPlanted" ] = isDefined( einflictor.wasjustplanted ); - self.explosiveinfo[ "bulletPenetrationKill" ] = isDefined( einflictor.wasdamagedfrombulletpenetration ); - self.explosiveinfo[ "cookedKill" ] = 0; - } - if ( sweapon == "sticky_grenade_mp" || sweapon == "explosive_bolt_mp" && isDefined( einflictor ) && isDefined( einflictor.stucktoplayer ) ) - { - self.explosiveinfo[ "stuckToPlayer" ] = einflictor.stucktoplayer; - } - if ( sweapon == "proximity_grenade_mp" || sweapon == "proximity_grenade_aoe_mp" ) - { - self.laststunnedby = eattacker; - self.laststunnedtime = self.idflagstime; - } - if ( isDefined( eattacker.lastgrenadesuicidetime ) && eattacker.lastgrenadesuicidetime >= ( getTime() - 50 ) && isfrag ) - { - self.explosiveinfo[ "suicideGrenadeKill" ] = 1; - } - else - { - self.explosiveinfo[ "suicideGrenadeKill" ] = 0; - } - } - if ( isfrag ) - { - self.explosiveinfo[ "cookedKill" ] = isDefined( einflictor.iscooked ); - self.explosiveinfo[ "throwbackKill" ] = isDefined( einflictor.threwback ); - } - if ( isDefined( eattacker ) && isplayer( eattacker ) && eattacker != self ) - { - self maps/mp/gametypes/_globallogic_score::setinflictorstat( einflictor, eattacker, sweapon ); - } - } - if ( smeansofdeath == "MOD_IMPACT" && isDefined( eattacker ) && isplayer( eattacker ) && eattacker != self ) - { - if ( sweapon != "knife_ballistic_mp" ) - { - self maps/mp/gametypes/_globallogic_score::setinflictorstat( einflictor, eattacker, sweapon ); - } - if ( sweapon == "hatchet_mp" && isDefined( einflictor ) ) - { - self.explosiveinfo[ "projectile_bounced" ] = isDefined( einflictor.bounced ); - } - } - if ( isplayer( eattacker ) ) - { - eattacker.pers[ "participation" ]++; - } - prevhealthratio = self.health / self.maxhealth; - if ( level.teambased && isplayer( eattacker ) && self != eattacker && self.team == eattacker.team ) - { - pixmarker( "BEGIN: PlayerDamage player" ); - if ( level.friendlyfire == 0 ) - { - if ( sweapon == "artillery_mp" || sweapon == "airstrike_mp" || sweapon == "napalm_mp" || sweapon == "mortar_mp" ) - { - self damageshellshockandrumble( eattacker, einflictor, sweapon, smeansofdeath, idamage ); - } - return; - } - else if ( level.friendlyfire == 1 ) - { - if ( idamage < 1 ) - { - idamage = 1; - } - if ( level.friendlyfiredelay && level.friendlyfiredelaytime >= ( ( getTime() - level.starttime - level.discardtime ) / 1000 ) ) - { - eattacker.lastdamagewasfromenemy = 0; - eattacker.friendlydamage = 1; - eattacker finishplayerdamagewrapper( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex ); - eattacker.friendlydamage = undefined; - } - else - { - self.lastdamagewasfromenemy = 0; - self finishplayerdamagewrapper( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex ); - } - } - else if ( level.friendlyfire == 2 && isalive( eattacker ) ) - { - idamage = int( idamage * 0.5 ); - if ( idamage < 1 ) - { - idamage = 1; - } - eattacker.lastdamagewasfromenemy = 0; - eattacker.friendlydamage = 1; - eattacker finishplayerdamagewrapper( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex ); - eattacker.friendlydamage = undefined; - } - else if ( level.friendlyfire == 3 && isalive( eattacker ) ) - { - idamage = int( idamage * 0.5 ); - if ( idamage < 1 ) - { - idamage = 1; - } - self.lastdamagewasfromenemy = 0; - eattacker.lastdamagewasfromenemy = 0; - self finishplayerdamagewrapper( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex ); - eattacker.friendlydamage = 1; - eattacker finishplayerdamagewrapper( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex ); - eattacker.friendlydamage = undefined; - } - friendly = 1; - pixmarker( "END: PlayerDamage player" ); - } - else - { - if ( idamage < 1 ) - { - idamage = 1; - } - if ( isDefined( eattacker ) && isplayer( eattacker ) && allowedassistweapon( sweapon ) ) - { - self trackattackerdamage( eattacker, idamage, smeansofdeath, sweapon ); - } - giveinflictorownerassist( eattacker, einflictor, idamage, smeansofdeath, sweapon ); - if ( isDefined( eattacker ) ) - { - level.lastlegitimateattacker = eattacker; - } - if ( isDefined( eattacker ) && isplayer( eattacker ) && isDefined( sweapon ) && !issubstr( smeansofdeath, "MOD_MELEE" ) ) - { - eattacker thread maps/mp/gametypes/_weapons::checkhit( sweapon ); - } - if ( ( smeansofdeath == "MOD_GRENADE" || smeansofdeath == "MOD_GRENADE_SPLASH" ) && isDefined( einflictor.iscooked ) ) - { - self.wascooked = getTime(); - } - else - { - self.wascooked = undefined; - } - if ( isDefined( eattacker ) && eattacker != self ) - { - self.lastdamagewasfromenemy = 1; - } - else - { - self.lastdamagewasfromenemy = 0; - } - if ( self.lastdamagewasfromenemy ) - { - if ( isplayer( eattacker ) ) - { - if ( isDefined( eattacker.damagedplayers[ self.clientid ] ) == 0 ) - { - eattacker.damagedplayers[ self.clientid ] = spawnstruct(); - } - eattacker.damagedplayers[ self.clientid ].time = getTime(); - eattacker.damagedplayers[ self.clientid ].entity = self; - } - } - self finishplayerdamagewrapper( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex ); - } - if ( isDefined( eattacker ) && isplayer( eattacker ) && eattacker != self ) - { - if ( dodamagefeedback( sweapon, einflictor, idamage, smeansofdeath ) ) - { - if ( idamage > 0 ) - { - if ( self.health > 0 ) - { - perkfeedback = doperkfeedback( self, sweapon, smeansofdeath, einflictor ); - } - eattacker thread maps/mp/gametypes/_damagefeedback::updatedamagefeedback( smeansofdeath, einflictor, perkfeedback ); - } - } - } - self.hasdonecombat = 1; - } - if ( isDefined( eattacker ) && eattacker != self && !friendly ) - { - level.usestartspawns = 0; - } - pixbeginevent( "PlayerDamage log" ); - /* + profilelog_begintiming( 6, "ship" ); + + if ( game["state"] == "postgame" ) + return; + + if ( self.sessionteam == "spectator" ) + return; + + if ( isdefined( self.candocombat ) && !self.candocombat ) + return; + + if ( isdefined( eattacker ) && isplayer( eattacker ) && isdefined( eattacker.candocombat ) && !eattacker.candocombat ) + return; + + if ( isdefined( level.hostmigrationtimer ) ) + return; + + if ( ( sweapon == "ai_tank_drone_gun_mp" || sweapon == "ai_tank_drone_rocket_mp" ) && !level.hardcoremode ) + { + if ( isdefined( eattacker ) && eattacker == self ) + { + if ( isdefined( einflictor ) && isdefined( einflictor.from_ai ) ) + return; + } + + if ( isdefined( eattacker ) && isdefined( eattacker.owner ) && eattacker.owner == self ) + return; + } + + if ( sweapon == "emp_grenade_mp" ) + { + if ( self hasperk( "specialty_immuneemp" ) ) + return; + + self notify( "emp_grenaded", eattacker ); + } + + if ( isdefined( eattacker ) ) + idamage = maps\mp\gametypes\_class::cac_modified_damage( self, eattacker, idamage, smeansofdeath, sweapon, einflictor, shitloc ); + + idamage = custom_gamemodes_modified_damage( self, eattacker, idamage, smeansofdeath, sweapon, einflictor, shitloc ); + idamage = int( idamage ); + self.idflags = idflags; + self.idflagstime = gettime(); + eattacker = figureoutattacker( eattacker ); + pixbeginevent( "PlayerDamage flags/tweaks" ); + + if ( !isdefined( vdir ) ) + idflags |= level.idflags_no_knockback; + + friendly = 0; + + if ( self.health != self.maxhealth ) + self notify( "snd_pain_player" ); + + if ( isdefined( einflictor ) && isdefined( einflictor.script_noteworthy ) ) + { + if ( einflictor.script_noteworthy == "ragdoll_now" ) + smeansofdeath = "MOD_FALLING"; + + if ( isdefined( level.overrideweaponfunc ) ) + sweapon = [[ level.overrideweaponfunc ]]( sweapon, einflictor.script_noteworthy ); + } + + if ( maps\mp\gametypes\_globallogic_utils::isheadshot( sweapon, shitloc, smeansofdeath, einflictor ) && isplayer( eattacker ) ) + smeansofdeath = "MOD_HEAD_SHOT"; + + if ( level.onplayerdamage != maps\mp\gametypes\_globallogic::blank ) + { + modifieddamage = [[ level.onplayerdamage ]]( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime ); + + if ( isdefined( modifieddamage ) ) + { + if ( modifieddamage <= 0 ) + return; + + idamage = modifieddamage; + } + } + + if ( level.onlyheadshots ) + { + if ( smeansofdeath == "MOD_PISTOL_BULLET" || smeansofdeath == "MOD_RIFLE_BULLET" ) + return; + else if ( smeansofdeath == "MOD_HEAD_SHOT" ) + idamage = 150; + } + + if ( self maps\mp\_vehicles::player_is_occupant_invulnerable( smeansofdeath ) ) + return; + + if ( isdefined( eattacker ) && isplayer( eattacker ) && self.team != eattacker.team ) + self.lastattackweapon = sweapon; + + sweapon = figureoutweapon( sweapon, einflictor ); + pixendevent(); + + if ( idflags & level.idflags_penetration && isplayer( eattacker ) && eattacker hasperk( "specialty_bulletpenetration" ) ) + self thread maps\mp\gametypes\_battlechatter_mp::perkspecificbattlechatter( "deepimpact", 1 ); + + attackerishittingteammate = isplayer( eattacker ) && self isenemyplayer( eattacker ) == 0; + + if ( shitloc == "riotshield" ) + { + if ( attackerishittingteammate && level.friendlyfire == 0 ) + return; + + if ( ( smeansofdeath == "MOD_PISTOL_BULLET" || smeansofdeath == "MOD_RIFLE_BULLET" ) && !maps\mp\killstreaks\_killstreaks::iskillstreakweapon( sweapon ) && !attackerishittingteammate ) + { + if ( self.hasriotshieldequipped ) + { + if ( isplayer( eattacker ) ) + { + eattacker.lastattackedshieldplayer = self; + eattacker.lastattackedshieldtime = gettime(); + } + + previous_shield_damage = self.shielddamageblocked; + self.shielddamageblocked += idamage; + + if ( self.shielddamageblocked % 400 < previous_shield_damage % 400 ) + { + score_event = "shield_blocked_damage"; + + if ( self.shielddamageblocked > 2000 ) + score_event = "shield_blocked_damage_reduced"; + + if ( isdefined( level.scoreinfo[score_event]["value"] ) ) + self addweaponstat( "riotshield_mp", "score_from_blocked_damage", level.scoreinfo[score_event]["value"] ); + + thread maps\mp\_scoreevents::processscoreevent( score_event, self ); + } + } + } + + if ( idflags & level.idflags_shield_explosive_impact ) + { + shitloc = "none"; + + if ( !( idflags & level.idflags_shield_explosive_impact_huge ) ) + idamage *= 0.0; + } + else if ( idflags & level.idflags_shield_explosive_splash ) + { + if ( isdefined( einflictor ) && isdefined( einflictor.stucktoplayer ) && einflictor.stucktoplayer == self ) + idamage = 101; + + shitloc = "none"; + } + else + return; + } + + if ( !( idflags & level.idflags_no_protection ) ) + { + if ( isdefined( einflictor ) && ( smeansofdeath == "MOD_GAS" || maps\mp\gametypes\_class::isexplosivedamage( undefined, smeansofdeath ) ) ) + { + if ( ( einflictor.classname == "grenade" || sweapon == "tabun_gas_mp" ) && self.lastspawntime + 3500 > gettime() && distancesquared( einflictor.origin, self.lastspawnpoint.origin ) < 62500 ) + return; + + if ( self isplayerimmunetokillstreak( eattacker, sweapon ) ) + return; + + self.explosiveinfo = []; + self.explosiveinfo["damageTime"] = gettime(); + self.explosiveinfo["damageId"] = einflictor getentitynumber(); + self.explosiveinfo["originalOwnerKill"] = 0; + self.explosiveinfo["bulletPenetrationKill"] = 0; + self.explosiveinfo["chainKill"] = 0; + self.explosiveinfo["damageExplosiveKill"] = 0; + self.explosiveinfo["chainKill"] = 0; + self.explosiveinfo["cookedKill"] = 0; + self.explosiveinfo["weapon"] = sweapon; + self.explosiveinfo["originalowner"] = einflictor.originalowner; + isfrag = sweapon == "frag_grenade_mp"; + + if ( isdefined( eattacker ) && eattacker != self ) + { + if ( isdefined( eattacker ) && isdefined( einflictor.owner ) && ( sweapon == "satchel_charge_mp" || sweapon == "claymore_mp" || sweapon == "bouncingbetty_mp" ) ) + { + self.explosiveinfo["originalOwnerKill"] = einflictor.owner == self; + self.explosiveinfo["damageExplosiveKill"] = isdefined( einflictor.wasdamaged ); + self.explosiveinfo["chainKill"] = isdefined( einflictor.waschained ); + self.explosiveinfo["wasJustPlanted"] = isdefined( einflictor.wasjustplanted ); + self.explosiveinfo["bulletPenetrationKill"] = isdefined( einflictor.wasdamagedfrombulletpenetration ); + self.explosiveinfo["cookedKill"] = 0; + } + + if ( ( sweapon == "sticky_grenade_mp" || sweapon == "explosive_bolt_mp" ) && isdefined( einflictor ) && isdefined( einflictor.stucktoplayer ) ) + self.explosiveinfo["stuckToPlayer"] = einflictor.stucktoplayer; + + if ( sweapon == "proximity_grenade_mp" || sweapon == "proximity_grenade_aoe_mp" ) + { + self.laststunnedby = eattacker; + self.laststunnedtime = self.idflagstime; + } + + if ( isdefined( eattacker.lastgrenadesuicidetime ) && eattacker.lastgrenadesuicidetime >= gettime() - 50 && isfrag ) + self.explosiveinfo["suicideGrenadeKill"] = 1; + else + self.explosiveinfo["suicideGrenadeKill"] = 0; + } + + if ( isfrag ) + { + self.explosiveinfo["cookedKill"] = isdefined( einflictor.iscooked ); + self.explosiveinfo["throwbackKill"] = isdefined( einflictor.threwback ); + } + + if ( isdefined( eattacker ) && isplayer( eattacker ) && eattacker != self ) + self maps\mp\gametypes\_globallogic_score::setinflictorstat( einflictor, eattacker, sweapon ); + } + + if ( smeansofdeath == "MOD_IMPACT" && isdefined( eattacker ) && isplayer( eattacker ) && eattacker != self ) + { + if ( sweapon != "knife_ballistic_mp" ) + self maps\mp\gametypes\_globallogic_score::setinflictorstat( einflictor, eattacker, sweapon ); + + if ( sweapon == "hatchet_mp" && isdefined( einflictor ) ) + self.explosiveinfo["projectile_bounced"] = isdefined( einflictor.bounced ); + } + + if ( isplayer( eattacker ) ) + eattacker.pers["participation"]++; + + prevhealthratio = self.health / self.maxhealth; + + if ( level.teambased && isplayer( eattacker ) && self != eattacker && self.team == eattacker.team ) + { + pixmarker( "BEGIN: PlayerDamage player" ); + + if ( level.friendlyfire == 0 ) + { + if ( sweapon == "artillery_mp" || sweapon == "airstrike_mp" || sweapon == "napalm_mp" || sweapon == "mortar_mp" ) + self damageshellshockandrumble( eattacker, einflictor, sweapon, smeansofdeath, idamage ); + + return; + } + else if ( level.friendlyfire == 1 ) + { + if ( idamage < 1 ) + idamage = 1; + + if ( level.friendlyfiredelay && level.friendlyfiredelaytime >= ( gettime() - level.starttime - level.discardtime ) / 1000 ) + { + eattacker.lastdamagewasfromenemy = 0; + eattacker.friendlydamage = 1; + eattacker finishplayerdamagewrapper( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex ); + eattacker.friendlydamage = undefined; + } + else + { + self.lastdamagewasfromenemy = 0; + self finishplayerdamagewrapper( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex ); + } + } + else if ( level.friendlyfire == 2 && isalive( eattacker ) ) + { + idamage = int( idamage * 0.5 ); + + if ( idamage < 1 ) + idamage = 1; + + eattacker.lastdamagewasfromenemy = 0; + eattacker.friendlydamage = 1; + eattacker finishplayerdamagewrapper( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex ); + eattacker.friendlydamage = undefined; + } + else if ( level.friendlyfire == 3 && isalive( eattacker ) ) + { + idamage = int( idamage * 0.5 ); + + if ( idamage < 1 ) + idamage = 1; + + self.lastdamagewasfromenemy = 0; + eattacker.lastdamagewasfromenemy = 0; + self finishplayerdamagewrapper( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex ); + eattacker.friendlydamage = 1; + eattacker finishplayerdamagewrapper( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex ); + eattacker.friendlydamage = undefined; + } + + friendly = 1; + pixmarker( "END: PlayerDamage player" ); + } + else + { + if ( idamage < 1 ) + idamage = 1; + + if ( isdefined( eattacker ) && isplayer( eattacker ) && allowedassistweapon( sweapon ) ) + self trackattackerdamage( eattacker, idamage, smeansofdeath, sweapon ); + + giveinflictorownerassist( eattacker, einflictor, idamage, smeansofdeath, sweapon ); + + if ( isdefined( eattacker ) ) + level.lastlegitimateattacker = eattacker; + + if ( isdefined( eattacker ) && isplayer( eattacker ) && isdefined( sweapon ) && !issubstr( smeansofdeath, "MOD_MELEE" ) ) + eattacker thread maps\mp\gametypes\_weapons::checkhit( sweapon ); + + if ( ( smeansofdeath == "MOD_GRENADE" || smeansofdeath == "MOD_GRENADE_SPLASH" ) && isdefined( einflictor.iscooked ) ) + self.wascooked = gettime(); + else + self.wascooked = undefined; + + self.lastdamagewasfromenemy = isdefined( eattacker ) && eattacker != self; + + if ( self.lastdamagewasfromenemy ) + { + if ( isplayer( eattacker ) ) + { + if ( isdefined( eattacker.damagedplayers[self.clientid] ) == 0 ) + eattacker.damagedplayers[self.clientid] = spawnstruct(); + + eattacker.damagedplayers[self.clientid].time = gettime(); + eattacker.damagedplayers[self.clientid].entity = self; + } + } + + self finishplayerdamagewrapper( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex ); + } + + if ( isdefined( eattacker ) && isplayer( eattacker ) && eattacker != self ) + { + if ( dodamagefeedback( sweapon, einflictor, idamage, smeansofdeath ) ) + { + if ( idamage > 0 ) + { + if ( self.health > 0 ) + perkfeedback = doperkfeedback( self, sweapon, smeansofdeath, einflictor ); + + eattacker thread maps\mp\gametypes\_damagefeedback::updatedamagefeedback( smeansofdeath, einflictor, perkfeedback ); + } + } + } + + self.hasdonecombat = 1; + } + + if ( isdefined( eattacker ) && eattacker != self && !friendly ) + level.usestartspawns = 0; + + pixbeginevent( "PlayerDamage log" ); /# - if ( getDvarInt( "g_debugDamage" ) ) - { - println( "client:" + self getentitynumber() + " health:" + self.health + " attacker:" + eattacker.clientid + " inflictor is player:" + isplayer( einflictor ) + " damage:" + idamage + " hitLoc:" + shitloc ); + if ( getdvarint( "g_debugDamage" ) ) + println( "client:" + self getentitynumber() + " health:" + self.health + " attacker:" + eattacker.clientid + " inflictor is player:" + isplayer( einflictor ) + " damage:" + idamage + " hitLoc:" + shitloc ); #/ - } - */ - if ( self.sessionstate != "dead" ) - { - lpselfnum = self getentitynumber(); - lpselfname = self.name; - lpselfteam = self.team; - lpselfguid = self getguid(); - lpattackerteam = ""; - lpattackerorigin = ( 0, 0, 0 ); - if ( isplayer( eattacker ) ) - { - lpattacknum = eattacker getentitynumber(); - lpattackguid = eattacker getguid(); - lpattackname = eattacker.name; - lpattackerteam = eattacker.team; - lpattackerorigin = eattacker.origin; - bbprint( "mpattacks", "gametime %d attackerspawnid %d attackerweapon %s attackerx %d attackery %d attackerz %d victimspawnid %d victimx %d victimy %d victimz %d damage %d damagetype %s damagelocation %s death %d", getTime(), getplayerspawnid( eattacker ), sweapon, lpattackerorigin, getplayerspawnid( self ), self.origin, idamage, smeansofdeath, shitloc, 0 ); - } - else - { - lpattacknum = -1; - lpattackguid = ""; - lpattackname = ""; - lpattackerteam = "world"; - bbprint( "mpattacks", "gametime %d attackerweapon %s victimspawnid %d victimx %d victimy %d victimz %d damage %d damagetype %s damagelocation %s death %d", getTime(), sweapon, getplayerspawnid( self ), self.origin, idamage, smeansofdeath, shitloc, 0 ); - } - logprint( "D;" + lpselfguid + ";" + lpselfnum + ";" + lpselfteam + ";" + lpselfname + ";" + lpattackguid + ";" + lpattacknum + ";" + lpattackerteam + ";" + lpattackname + ";" + sweapon + ";" + idamage + ";" + smeansofdeath + ";" + shitloc + "\n" ); - } - pixendevent(); - profilelog_endtiming( 6, "gs=" + game[ "state" ] + " zom=" + sessionmodeiszombiesgame() ); + + if ( self.sessionstate != "dead" ) + { + lpselfnum = self getentitynumber(); + lpselfname = self.name; + lpselfteam = self.team; + lpselfguid = self getguid(); + lpattackerteam = ""; + lpattackerorigin = ( 0, 0, 0 ); + + if ( isplayer( eattacker ) ) + { + lpattacknum = eattacker getentitynumber(); + lpattackguid = eattacker getguid(); + lpattackname = eattacker.name; + lpattackerteam = eattacker.team; + lpattackerorigin = eattacker.origin; + bbprint( "mpattacks", "gametime %d attackerspawnid %d attackerweapon %s attackerx %d attackery %d attackerz %d victimspawnid %d victimx %d victimy %d victimz %d damage %d damagetype %s damagelocation %s death %d", gettime(), getplayerspawnid( eattacker ), sweapon, lpattackerorigin, getplayerspawnid( self ), self.origin, idamage, smeansofdeath, shitloc, 0 ); + } + else + { + lpattacknum = -1; + lpattackguid = ""; + lpattackname = ""; + lpattackerteam = "world"; + bbprint( "mpattacks", "gametime %d attackerweapon %s victimspawnid %d victimx %d victimy %d victimz %d damage %d damagetype %s damagelocation %s death %d", gettime(), sweapon, getplayerspawnid( self ), self.origin, idamage, smeansofdeath, shitloc, 0 ); + } + + logprint( "D;" + lpselfguid + ";" + lpselfnum + ";" + lpselfteam + ";" + lpselfname + ";" + lpattackguid + ";" + lpattacknum + ";" + lpattackerteam + ";" + lpattackname + ";" + sweapon + ";" + idamage + ";" + smeansofdeath + ";" + shitloc + "\n" ); + } + + pixendevent(); + profilelog_endtiming( 6, "gs=" + game["state"] + " zom=" + sessionmodeiszombiesgame() ); } -resetattackerlist() //checked matches cerberus output +resetattackerlist() { - self.attackers = []; - self.attackerdata = []; - self.attackerdamage = []; - self.firsttimedamaged = 0; + self.attackers = []; + self.attackerdata = []; + self.attackerdamage = []; + self.firsttimedamaged = 0; } -dodamagefeedback( sweapon, einflictor, idamage, smeansofdeath ) //checked matches cerberus output +dodamagefeedback( sweapon, einflictor, idamage, smeansofdeath ) { - if ( !isDefined( sweapon ) ) - { - return 0; - } - if ( level.allowhitmarkers == 0 ) - { - return 0; - } - if ( level.allowhitmarkers == 1 ) - { - if ( isDefined( smeansofdeath ) && isDefined( idamage ) ) - { - if ( istacticalhitmarker( sweapon, smeansofdeath, idamage ) ) - { - return 0; - } - } - } - return 1; + if ( !isdefined( sweapon ) ) + return false; + + if ( level.allowhitmarkers == 0 ) + return false; + + if ( level.allowhitmarkers == 1 ) + { + if ( isdefined( smeansofdeath ) && isdefined( idamage ) ) + { + if ( istacticalhitmarker( sweapon, smeansofdeath, idamage ) ) + return false; + } + } + + return true; } -istacticalhitmarker( sweapon, smeansofdeath, idamage ) //checked changed to match cerberus output +istacticalhitmarker( sweapon, smeansofdeath, idamage ) { - if ( isgrenade( sweapon ) ) - { - if ( sweapon == "willy_pete_mp" ) - { - if ( smeansofdeath == "MOD_GRENADE_SPLASH" ) - { - return 1; - } - } - else if ( idamage == 1 ) - { - return 1; - } - } - return 0; + if ( isgrenade( sweapon ) ) + { + if ( sweapon == "willy_pete_mp" ) + { + if ( smeansofdeath == "MOD_GRENADE_SPLASH" ) + return true; + } + else if ( idamage == 1 ) + return true; + } + + return false; } -doperkfeedback( player, sweapon, smeansofdeath, einflictor ) //checked changed to match cerberus output +doperkfeedback( player, sweapon, smeansofdeath, einflictor ) { - perkfeedback = undefined; - hastacticalmask = maps/mp/gametypes/_class::hastacticalmask( player ); - hasflakjacket = player hasperk( "specialty_flakjacket" ); - isexplosivedamage = maps/mp/gametypes/_class::isexplosivedamage( sweapon, smeansofdeath ); - isflashorstundamage = maps/mp/gametypes/_weapon_utils::isflashorstundamage( sweapon, smeansofdeath ); - if ( isflashorstundamage && hastacticalmask ) - { - perkfeedback = "tacticalMask"; - } - else if ( isexplosivedamage && hasflakjacket && !isaikillstreakdamage( sweapon, einflictor ) ) - { - perkfeedback = "flakjacket"; - } - return perkfeedback; + perkfeedback = undefined; + hastacticalmask = maps\mp\gametypes\_class::hastacticalmask( player ); + hasflakjacket = player hasperk( "specialty_flakjacket" ); + isexplosivedamage = maps\mp\gametypes\_class::isexplosivedamage( sweapon, smeansofdeath ); + isflashorstundamage = maps\mp\gametypes\_weapon_utils::isflashorstundamage( sweapon, smeansofdeath ); + + if ( isflashorstundamage && hastacticalmask ) + perkfeedback = "tacticalMask"; + else if ( isexplosivedamage && hasflakjacket && !isaikillstreakdamage( sweapon, einflictor ) ) + perkfeedback = "flakjacket"; + + return perkfeedback; } -isaikillstreakdamage( sweapon, einflictor ) //checked matches cerberus output +isaikillstreakdamage( sweapon, einflictor ) { - switch( sweapon ) - { - case "ai_tank_drone_rocket_mp": - return isDefined( einflictor.firedbyai ); - case "missile_swarm_projectile_mp": - return 1; - case "planemortar_mp": - return 1; - case "chopper_minigun_mp": - return 1; - case "straferun_rockets_mp": - return 1; - case "littlebird_guard_minigun_mp": - return 1; - case "cobra_20mm_comlink_mp": - return 1; - } - return 0; + switch ( sweapon ) + { + case "ai_tank_drone_rocket_mp": + return isdefined( einflictor.firedbyai ); + case "missile_swarm_projectile_mp": + return 1; + case "planemortar_mp": + return 1; + case "chopper_minigun_mp": + return 1; + case "straferun_rockets_mp": + return 1; + case "littlebird_guard_minigun_mp": + return 1; + case "cobra_20mm_comlink_mp": + return 1; + } + + return 0; } -finishplayerdamagewrapper( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex ) //checked matches cerberus output dvar taken from beta dump +finishplayerdamagewrapper( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex ) { - pixbeginevent( "finishPlayerDamageWrapper" ); - if ( !level.console && idflags & level.idflags_penetration && isplayer( eattacker ) ) - { - /* + pixbeginevent( "finishPlayerDamageWrapper" ); + + if ( !level.console && idflags & level.idflags_penetration && isplayer( eattacker ) ) + { /# - println( "penetrated:" + self getentitynumber() + " health:" + self.health + " attacker:" + eattacker.clientid + " inflictor is player:" + isplayer( einflictor ) + " damage:" + idamage + " hitLoc:" + shitloc ); + println( "penetrated:" + self getentitynumber() + " health:" + self.health + " attacker:" + eattacker.clientid + " inflictor is player:" + isplayer( einflictor ) + " damage:" + idamage + " hitLoc:" + shitloc ); #/ - */ - eattacker addplayerstat( "penetration_shots", 1 ); - } - self finishplayerdamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex ); - if ( getDvar( "scr_csmode" ) != "" ) - { - self shellshock( "damage_mp", 0.2 ); - } - self damageshellshockandrumble( eattacker, einflictor, sweapon, smeansofdeath, idamage ); - pixendevent(); + eattacker addplayerstat( "penetration_shots", 1 ); + } + + self finishplayerdamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex ); + + if ( getdvar( "scr_csmode" ) != "" ) + self shellshock( "damage_mp", 0.2 ); + + self damageshellshockandrumble( eattacker, einflictor, sweapon, smeansofdeath, idamage ); + pixendevent(); } -allowedassistweapon( weapon ) //checked matches cerberus output +allowedassistweapon( weapon ) { - if ( !maps/mp/killstreaks/_killstreaks::iskillstreakweapon( weapon ) ) - { - return 1; - } - if ( maps/mp/killstreaks/_killstreaks::iskillstreakweaponassistallowed( weapon ) ) - { - return 1; - } - return 0; + if ( !maps\mp\killstreaks\_killstreaks::iskillstreakweapon( weapon ) ) + return true; + + if ( maps\mp\killstreaks\_killstreaks::iskillstreakweaponassistallowed( weapon ) ) + return true; + + return false; } -playerkilled_killstreaks( attacker, sweapon ) //checked matches cerberus output +playerkilled_killstreaks( attacker, sweapon ) { - if ( !isDefined( self.switching_teams ) ) - { - if ( isplayer( attacker ) && level.teambased && attacker != self && self.team == attacker.team ) - { - self.pers[ "cur_kill_streak" ] = 0; - self.pers[ "cur_total_kill_streak" ] = 0; - self.pers[ "totalKillstreakCount" ] = 0; - self.pers[ "killstreaksEarnedThisKillstreak" ] = 0; - self setplayercurrentstreak( 0 ); - } - else - { - self maps/mp/gametypes/_globallogic_score::incpersstat( "deaths", 1, 1, 1 ); - self.deaths = self maps/mp/gametypes/_globallogic_score::getpersstat( "deaths" ); - self updatestatratio( "kdratio", "kills", "deaths" ); - if ( self.pers[ "cur_kill_streak" ] > self.pers[ "best_kill_streak" ] ) - { - self.pers[ "best_kill_streak" ] = self.pers[ "cur_kill_streak" ]; - } - self.pers[ "kill_streak_before_death" ] = self.pers[ "cur_kill_streak" ]; - self.pers[ "cur_kill_streak" ] = 0; - self.pers[ "cur_total_kill_streak" ] = 0; - self.pers[ "totalKillstreakCount" ] = 0; - self.pers[ "killstreaksEarnedThisKillstreak" ] = 0; - self setplayercurrentstreak( 0 ); - self.cur_death_streak++; - if ( self.cur_death_streak > self.death_streak ) - { - if ( level.rankedmatch && !level.disablestattracking ) - { - self setdstat( "HighestStats", "death_streak", self.cur_death_streak ); - } - self.death_streak = self.cur_death_streak; - } - if ( self.cur_death_streak >= getDvarInt( "perk_deathStreakCountRequired" ) ) - { - self enabledeathstreak(); - } - } - } - else - { - self.pers[ "totalKillstreakCount" ] = 0; - self.pers[ "killstreaksEarnedThisKillstreak" ] = 0; - } - if ( !sessionmodeiszombiesgame() && maps/mp/killstreaks/_killstreaks::iskillstreakweapon( sweapon ) ) - { - level.globalkillstreaksdeathsfrom++; - } + if ( !isdefined( self.switching_teams ) ) + { + if ( isplayer( attacker ) && level.teambased && attacker != self && self.team == attacker.team ) + { + self.pers["cur_kill_streak"] = 0; + self.pers["cur_total_kill_streak"] = 0; + self.pers["totalKillstreakCount"] = 0; + self.pers["killstreaksEarnedThisKillstreak"] = 0; + self setplayercurrentstreak( 0 ); + } + else + { + self maps\mp\gametypes\_globallogic_score::incpersstat( "deaths", 1, 1, 1 ); + self.deaths = self maps\mp\gametypes\_globallogic_score::getpersstat( "deaths" ); + self updatestatratio( "kdratio", "kills", "deaths" ); + + if ( self.pers["cur_kill_streak"] > self.pers["best_kill_streak"] ) + self.pers["best_kill_streak"] = self.pers["cur_kill_streak"]; + + self.pers["kill_streak_before_death"] = self.pers["cur_kill_streak"]; + self.pers["cur_kill_streak"] = 0; + self.pers["cur_total_kill_streak"] = 0; + self.pers["totalKillstreakCount"] = 0; + self.pers["killstreaksEarnedThisKillstreak"] = 0; + self setplayercurrentstreak( 0 ); + self.cur_death_streak++; + + if ( self.cur_death_streak > self.death_streak ) + { + if ( level.rankedmatch && !level.disablestattracking ) + self setdstat( "HighestStats", "death_streak", self.cur_death_streak ); + + self.death_streak = self.cur_death_streak; + } + + if ( self.cur_death_streak >= getdvarint( "perk_deathStreakCountRequired" ) ) + self enabledeathstreak(); + } + } + else + { + self.pers["totalKillstreakCount"] = 0; + self.pers["killstreaksEarnedThisKillstreak"] = 0; + } + + if ( !sessionmodeiszombiesgame() && maps\mp\killstreaks\_killstreaks::iskillstreakweapon( sweapon ) ) + level.globalkillstreaksdeathsfrom++; } -playerkilled_weaponstats( attacker, sweapon, smeansofdeath, wasinlaststand, lastweaponbeforedroppingintolaststand, inflictor ) //checked partially changed to match cerberus output see info.md +playerkilled_weaponstats( attacker, sweapon, smeansofdeath, wasinlaststand, lastweaponbeforedroppingintolaststand, inflictor ) { - if ( level.teambased && self.team != attacker.team && isplayer( attacker ) && attacker != self ) - { - self addweaponstat( sweapon, "deaths", 1 ); - if ( wasinlaststand && isDefined( lastweaponbeforedroppingintolaststand ) ) - { - weaponname = lastweaponbeforedroppingintolaststand; - } - else - { - weaponname = self.lastdroppableweapon; - } - if ( isDefined( weaponname ) ) - { - self addweaponstat( weaponname, "deathsDuringUse", 1 ); - } - if ( smeansofdeath != "MOD_FALLING" ) - { - if ( sweapon == "explosive_bolt_mp" && isDefined( inflictor ) && isDefined( inflictor.ownerweaponatlaunch ) && inflictor.owneradsatlaunch ) - { - attacker addweaponstat( inflictor.ownerweaponatlaunch, "kills", 1, attacker.class_num, 1 ); - } - else - { - attacker addweaponstat( sweapon, "kills", 1, attacker.class_num ); - } - } - if ( smeansofdeath == "MOD_HEAD_SHOT" ) - { - attacker addweaponstat( sweapon, "headshots", 1 ); - } - if ( smeansofdeath == "MOD_PROJECTILE" ) - { - attacker addweaponstat( sweapon, "direct_hit_kills", 1 ); - } - } - else if ( !level.teambased && isplayer( attacker ) && attacker != self ) - { - self addweaponstat( sweapon, "deaths", 1 ); - if ( wasinlaststand && isDefined( lastweaponbeforedroppingintolaststand ) ) - { - weaponname = lastweaponbeforedroppingintolaststand; - } - else - { - weaponname = self.lastdroppableweapon; - } - if ( isDefined( weaponname ) ) - { - self addweaponstat( weaponname, "deathsDuringUse", 1 ); - } - if ( smeansofdeath != "MOD_FALLING" ) - { - if ( sweapon == "explosive_bolt_mp" && isDefined( inflictor ) && isDefined( inflictor.ownerweaponatlaunch ) && inflictor.owneradsatlaunch ) - { - attacker addweaponstat( inflictor.ownerweaponatlaunch, "kills", 1, attacker.class_num, 1 ); - } - else - { - attacker addweaponstat( sweapon, "kills", 1, attacker.class_num ); - } - } - if ( smeansofdeath == "MOD_HEAD_SHOT" ) - { - attacker addweaponstat( sweapon, "headshots", 1 ); - } - if ( smeansofdeath == "MOD_PROJECTILE" ) - { - attacker addweaponstat( sweapon, "direct_hit_kills", 1 ); - } - } + if ( isplayer( attacker ) && attacker != self && ( !level.teambased || level.teambased && self.team != attacker.team ) ) + { + self addweaponstat( sweapon, "deaths", 1 ); + + if ( wasinlaststand && isdefined( lastweaponbeforedroppingintolaststand ) ) + weaponname = lastweaponbeforedroppingintolaststand; + else + weaponname = self.lastdroppableweapon; + + if ( isdefined( weaponname ) ) + self addweaponstat( weaponname, "deathsDuringUse", 1 ); + + if ( smeansofdeath != "MOD_FALLING" ) + { + if ( sweapon == "explosive_bolt_mp" && isdefined( inflictor ) && isdefined( inflictor.ownerweaponatlaunch ) && inflictor.owneradsatlaunch ) + attacker addweaponstat( inflictor.ownerweaponatlaunch, "kills", 1, attacker.class_num, 1 ); + else + attacker addweaponstat( sweapon, "kills", 1, attacker.class_num ); + } + + if ( smeansofdeath == "MOD_HEAD_SHOT" ) + attacker addweaponstat( sweapon, "headshots", 1 ); + + if ( smeansofdeath == "MOD_PROJECTILE" ) + attacker addweaponstat( sweapon, "direct_hit_kills", 1 ); + } } -playerkilled_obituary( attacker, einflictor, sweapon, smeansofdeath ) //checked partially changed to match beta dump +playerkilled_obituary( attacker, einflictor, sweapon, smeansofdeath ) { - if ( isplayer( attacker ) || self isenemyplayer( attacker ) == 0 || isDefined( sweapon ) && maps/mp/killstreaks/_killstreaks::iskillstreakweapon( sweapon ) ) - { - level notify( "reset_obituary_count" ); - level.lastobituaryplayercount = 0; - level.lastobituaryplayer = undefined; - } - else - { - if ( isDefined( level.lastobituaryplayer ) && level.lastobituaryplayer == attacker ) - { - level.lastobituaryplayercount++; - } - else - { - level notify( "reset_obituary_count" ); - level.lastobituaryplayer = attacker; - level.lastobituaryplayercount = 1; - } - level thread maps/mp/_scoreevents::decrementlastobituaryplayercountafterfade(); - if ( level.lastobituaryplayercount >= 4 ) - { - level notify( "reset_obituary_count" ); - level.lastobituaryplayercount = 0; - level.lastobituaryplayer = undefined; - self thread uninterruptedobitfeedkills( attacker, sweapon ); - } - } - overrideentitycamera = maps/mp/killstreaks/_killstreaks::shouldoverrideentitycameraindemo( attacker, sweapon ); - if ( level.teambased && isDefined( attacker.pers ) && self.team == attacker.team && smeansofdeath == "MOD_GRENADE" && level.friendlyfire == 0 ) - { - obituary( self, self, sweapon, smeansofdeath ); - maps/mp/_demo::bookmark( "kill", getTime(), self, self, 0, einflictor, overrideentitycamera ); - } - else - { - obituary( self, attacker, sweapon, smeansofdeath ); - maps/mp/_demo::bookmark( "kill", getTime(), self, attacker, 0, einflictor, overrideentitycamera ); - } + if ( !isplayer( attacker ) || self isenemyplayer( attacker ) == 0 || isdefined( sweapon ) && maps\mp\killstreaks\_killstreaks::iskillstreakweapon( sweapon ) ) + { + level notify( "reset_obituary_count" ); + level.lastobituaryplayercount = 0; + level.lastobituaryplayer = undefined; + } + else + { + if ( isdefined( level.lastobituaryplayer ) && level.lastobituaryplayer == attacker ) + level.lastobituaryplayercount++; + else + { + level notify( "reset_obituary_count" ); + level.lastobituaryplayer = attacker; + level.lastobituaryplayercount = 1; + } + + level thread maps\mp\_scoreevents::decrementlastobituaryplayercountafterfade(); + + if ( level.lastobituaryplayercount >= 4 ) + { + level notify( "reset_obituary_count" ); + level.lastobituaryplayercount = 0; + level.lastobituaryplayer = undefined; + self thread uninterruptedobitfeedkills( attacker, sweapon ); + } + } + + overrideentitycamera = maps\mp\killstreaks\_killstreaks::shouldoverrideentitycameraindemo( attacker, sweapon ); + + if ( level.teambased && isdefined( attacker.pers ) && self.team == attacker.team && smeansofdeath == "MOD_GRENADE" && level.friendlyfire == 0 ) + { + obituary( self, self, sweapon, smeansofdeath ); + maps\mp\_demo::bookmark( "kill", gettime(), self, self, 0, einflictor, overrideentitycamera ); + } + else + { + obituary( self, attacker, sweapon, smeansofdeath ); + maps\mp\_demo::bookmark( "kill", gettime(), self, attacker, 0, einflictor, overrideentitycamera ); + } } -playerkilled_suicide( einflictor, attacker, smeansofdeath, sweapon, shitloc ) //checked matches cerberus output +playerkilled_suicide( einflictor, attacker, smeansofdeath, sweapon, shitloc ) { - awardassists = 0; - if ( isDefined( self.switching_teams ) ) - { - if ( !level.teambased && isDefined( level.teams[ self.leaving_team ] ) && isDefined( level.teams[ self.joining_team ] ) && level.teams[ self.leaving_team ] != level.teams[ self.joining_team ] ) - { - playercounts = self maps/mp/teams/_teams::countplayers(); - playercounts[ self.leaving_team ]--; + awardassists = 0; - playercounts[ self.joining_team ]++; - if ( ( playercounts[ self.joining_team ] - playercounts[ self.leaving_team ] ) > 1 ) - { - thread maps/mp/_scoreevents::processscoreevent( "suicide", self ); - self thread maps/mp/gametypes/_rank::giverankxp( "suicide" ); - self maps/mp/gametypes/_globallogic_score::incpersstat( "suicides", 1 ); - self.suicides = self maps/mp/gametypes/_globallogic_score::getpersstat( "suicides" ); - } - } - } - else - { - thread maps/mp/_scoreevents::processscoreevent( "suicide", self ); - self maps/mp/gametypes/_globallogic_score::incpersstat( "suicides", 1 ); - self.suicides = self maps/mp/gametypes/_globallogic_score::getpersstat( "suicides" ); - if ( smeansofdeath == "MOD_SUICIDE" && shitloc == "none" && self.throwinggrenade ) - { - self.lastgrenadesuicidetime = getTime(); - } - if ( level.maxsuicidesbeforekick > 0 && level.maxsuicidesbeforekick <= self.suicides ) - { - self notify( "teamKillKicked" ); - self suicidekick(); - } - thread maps/mp/gametypes/_battlechatter_mp::onplayersuicideorteamkill( self, "suicide" ); - awardassists = 1; - self.suicide = 1; - } - if ( isDefined( self.friendlydamage ) ) - { - self iprintln( &"MP_FRIENDLY_FIRE_WILL_NOT" ); - if ( level.teamkillpointloss ) - { - scoresub = self [[ level.getteamkillscore ]]( einflictor, attacker, smeansofdeath, sweapon ); - score = maps/mp/gametypes/_globallogic_score::_getplayerscore( attacker ) - scoresub; - if ( score < 0 ) - { - score = 0; - } - maps/mp/gametypes/_globallogic_score::_setplayerscore( attacker, score ); - } - } - return awardassists; + if ( isdefined( self.switching_teams ) ) + { + if ( !level.teambased && ( isdefined( level.teams[self.leaving_team] ) && isdefined( level.teams[self.joining_team] ) && level.teams[self.leaving_team] != level.teams[self.joining_team] ) ) + { + playercounts = self maps\mp\teams\_teams::countplayers(); + playercounts[self.leaving_team]--; + playercounts[self.joining_team]++; + + if ( playercounts[self.joining_team] - playercounts[self.leaving_team] > 1 ) + { + thread maps\mp\_scoreevents::processscoreevent( "suicide", self ); + self thread maps\mp\gametypes\_rank::giverankxp( "suicide" ); + self maps\mp\gametypes\_globallogic_score::incpersstat( "suicides", 1 ); + self.suicides = self maps\mp\gametypes\_globallogic_score::getpersstat( "suicides" ); + } + } + } + else + { + thread maps\mp\_scoreevents::processscoreevent( "suicide", self ); + self maps\mp\gametypes\_globallogic_score::incpersstat( "suicides", 1 ); + self.suicides = self maps\mp\gametypes\_globallogic_score::getpersstat( "suicides" ); + + if ( smeansofdeath == "MOD_SUICIDE" && shitloc == "none" && self.throwinggrenade ) + self.lastgrenadesuicidetime = gettime(); + + if ( level.maxsuicidesbeforekick > 0 && level.maxsuicidesbeforekick <= self.suicides ) + { + self notify( "teamKillKicked" ); + self suicidekick(); + } + + thread maps\mp\gametypes\_battlechatter_mp::onplayersuicideorteamkill( self, "suicide" ); + awardassists = 1; + self.suicide = 1; + } + + if ( isdefined( self.friendlydamage ) ) + { + self iprintln( &"MP_FRIENDLY_FIRE_WILL_NOT" ); + + if ( level.teamkillpointloss ) + { + scoresub = self [[ level.getteamkillscore ]]( einflictor, attacker, smeansofdeath, sweapon ); + score = maps\mp\gametypes\_globallogic_score::_getplayerscore( attacker ) - scoresub; + + if ( score < 0 ) + score = 0; + + maps\mp\gametypes\_globallogic_score::_setplayerscore( attacker, score ); + } + } + + return awardassists; } -playerkilled_teamkill( einflictor, attacker, smeansofdeath, sweapon, shitloc ) //checked matches cerberus output +playerkilled_teamkill( einflictor, attacker, smeansofdeath, sweapon, shitloc ) { - thread maps/mp/_scoreevents::processscoreevent( "team_kill", attacker ); - self.teamkilled = 1; - if ( !ignoreteamkills( sweapon, smeansofdeath ) ) - { - teamkill_penalty = self [[ level.getteamkillpenalty ]]( einflictor, attacker, smeansofdeath, sweapon ); - attacker maps/mp/gametypes/_globallogic_score::incpersstat( "teamkills_nostats", teamkill_penalty, 0 ); - attacker maps/mp/gametypes/_globallogic_score::incpersstat( "teamkills", 1 ); - attacker.teamkillsthisround++; - if ( level.teamkillpointloss ) - { - scoresub = self [[ level.getteamkillscore ]]( einflictor, attacker, smeansofdeath, sweapon ); - score = maps/mp/gametypes/_globallogic_score::_getplayerscore( attacker ) - scoresub; - if ( score < 0 ) - { - score = 0; - } - maps/mp/gametypes/_globallogic_score::_setplayerscore( attacker, score ); - } - if ( maps/mp/gametypes/_globallogic_utils::gettimepassed() < 5000 ) - { - teamkilldelay = 1; - } - else if ( attacker.pers[ "teamkills_nostats" ] > 1 && maps/mp/gametypes/_globallogic_utils::gettimepassed() < ( 8000 + ( attacker.pers[ "teamkills_nostats" ] * 1000 ) ) ) - { - teamkilldelay = 1; - } - else - { - teamkilldelay = attacker teamkilldelay(); - } - if ( teamkilldelay > 0 ) - { - attacker.teamkillpunish = 1; - attacker thread wait_and_suicide(); - if ( attacker shouldteamkillkick( teamkilldelay ) ) - { - attacker notify( "teamKillKicked" ); - attacker teamkillkick(); - } - attacker thread reduceteamkillsovertime(); - } - if ( isplayer( attacker ) ) - { - thread maps/mp/gametypes/_battlechatter_mp::onplayersuicideorteamkill( attacker, "teamkill" ); - } - } + thread maps\mp\_scoreevents::processscoreevent( "team_kill", attacker ); + self.teamkilled = 1; + + if ( !ignoreteamkills( sweapon, smeansofdeath ) ) + { + teamkill_penalty = self [[ level.getteamkillpenalty ]]( einflictor, attacker, smeansofdeath, sweapon ); + attacker maps\mp\gametypes\_globallogic_score::incpersstat( "teamkills_nostats", teamkill_penalty, 0 ); + attacker maps\mp\gametypes\_globallogic_score::incpersstat( "teamkills", 1 ); + attacker.teamkillsthisround++; + + if ( level.teamkillpointloss ) + { + scoresub = self [[ level.getteamkillscore ]]( einflictor, attacker, smeansofdeath, sweapon ); + score = maps\mp\gametypes\_globallogic_score::_getplayerscore( attacker ) - scoresub; + + if ( score < 0 ) + score = 0; + + maps\mp\gametypes\_globallogic_score::_setplayerscore( attacker, score ); + } + + if ( maps\mp\gametypes\_globallogic_utils::gettimepassed() < 5000 ) + teamkilldelay = 1; + else if ( attacker.pers["teamkills_nostats"] > 1 && maps\mp\gametypes\_globallogic_utils::gettimepassed() < 8000 + attacker.pers["teamkills_nostats"] * 1000 ) + teamkilldelay = 1; + else + teamkilldelay = attacker teamkilldelay(); + + if ( teamkilldelay > 0 ) + { + attacker.teamkillpunish = 1; + attacker thread wait_and_suicide(); + + if ( attacker shouldteamkillkick( teamkilldelay ) ) + { + attacker notify( "teamKillKicked" ); + attacker teamkillkick(); + } + + attacker thread reduceteamkillsovertime(); + } + + if ( isplayer( attacker ) ) + thread maps\mp\gametypes\_battlechatter_mp::onplayersuicideorteamkill( attacker, "teamkill" ); + } } -wait_and_suicide() //checked matches cerberus output +wait_and_suicide() { - self endon( "disconnect" ); - self freezecontrolswrapper( 1 ); - wait 0.25; - self suicide(); + self endon( "disconnect" ); + self freezecontrolswrapper( 1 ); + wait 0.25; + self suicide(); } -playerkilled_awardassists( einflictor, attacker, sweapon, lpattackteam ) //checked partially changed to match cerberus output see info.md +playerkilled_awardassists( einflictor, attacker, sweapon, lpattackteam ) { - pixbeginevent( "PlayerKilled assists" ); - if ( isDefined( self.attackers ) ) - { - j = 0; - while ( j < self.attackers.size ) - { - player = self.attackers[ j ]; - if ( !isDefined( player ) ) - { - j++; - continue; - } - if ( player == attacker ) - { - j++; - continue; - } - if ( player.team != lpattackteam ) - { - j++; - continue; - } - damage_done = self.attackerdamage[ player.clientid ].damage; - player thread maps/mp/gametypes/_globallogic_score::processassist( self, damage_done, self.attackerdamage[ player.clientid ].weapon ); - j++; - } - } - if ( level.teambased ) - { - self maps/mp/gametypes/_globallogic_score::processkillstreakassists( attacker, einflictor, sweapon ); - } - if ( isDefined( self.lastattackedshieldplayer ) && isDefined( self.lastattackedshieldtime ) && self.lastattackedshieldplayer != attacker ) - { - if ( ( getTime() - self.lastattackedshieldtime ) < 4000 ) - { - self.lastattackedshieldplayer thread maps/mp/gametypes/_globallogic_score::processshieldassist( self ); - } - } - pixendevent(); + pixbeginevent( "PlayerKilled assists" ); + + if ( isdefined( self.attackers ) ) + { + for ( j = 0; j < self.attackers.size; j++ ) + { + player = self.attackers[j]; + + if ( !isdefined( player ) ) + continue; + + if ( player == attacker ) + continue; + + if ( player.team != lpattackteam ) + continue; + + damage_done = self.attackerdamage[player.clientid].damage; + player thread maps\mp\gametypes\_globallogic_score::processassist( self, damage_done, self.attackerdamage[player.clientid].weapon ); + } + } + + if ( level.teambased ) + self maps\mp\gametypes\_globallogic_score::processkillstreakassists( attacker, einflictor, sweapon ); + + if ( isdefined( self.lastattackedshieldplayer ) && isdefined( self.lastattackedshieldtime ) && self.lastattackedshieldplayer != attacker ) + { + if ( gettime() - self.lastattackedshieldtime < 4000 ) + self.lastattackedshieldplayer thread maps\mp\gametypes\_globallogic_score::processshieldassist( self ); + } + + pixendevent(); } -playerkilled_kill( einflictor, attacker, smeansofdeath, sweapon, shitloc ) //checked changed to match cerberus output +playerkilled_kill( einflictor, attacker, smeansofdeath, sweapon, shitloc ) { - maps/mp/gametypes/_globallogic_score::inctotalkills( attacker.team ); - attacker thread maps/mp/gametypes/_globallogic_score::givekillstats( smeansofdeath, sweapon, self ); - if ( isalive( attacker ) ) - { - pixbeginevent( "killstreak" ); - if ( !isDefined( einflictor ) || !isDefined( einflictor.requireddeathcount ) || attacker.deathcount == einflictor.requireddeathcount ) - { - shouldgivekillstreak = maps/mp/killstreaks/_killstreaks::shouldgivekillstreak( sweapon ); - if ( shouldgivekillstreak ) - { - attacker maps/mp/killstreaks/_killstreaks::addtokillstreakcount( sweapon ); - } - attacker.pers[ "cur_total_kill_streak" ]++; - attacker setplayercurrentstreak( attacker.pers[ "cur_total_kill_streak" ] ); - if ( isDefined( level.killstreaks ) && shouldgivekillstreak ) - { - attacker.pers[ "cur_kill_streak" ]++; - if ( attacker.pers[ "cur_kill_streak" ] >= 2 ) - { - if ( attacker.pers[ "cur_kill_streak" ] == 10 ) - { - attacker maps/mp/_challenges::killstreakten(); - } - if ( attacker.pers[ "cur_kill_streak" ] <= 30 ) - { - maps/mp/_scoreevents::processscoreevent( "killstreak_" + attacker.pers[ "cur_kill_streak" ], attacker, self, sweapon ); - } - else - { - maps/mp/_scoreevents::processscoreevent( "killstreak_more_than_30", attacker, self, sweapon ); - } - } - if ( !isDefined( level.usingmomentum ) || !level.usingmomentum ) - { - attacker thread maps/mp/killstreaks/_killstreaks::givekillstreakforstreak(); - } - } - } - if ( isplayer( attacker ) ) - { - self thread maps/mp/gametypes/_battlechatter_mp::onplayerkillstreak( attacker ); - } - pixendevent(); - } - if ( attacker.pers[ "cur_kill_streak" ] > attacker.kill_streak ) - { - if ( level.rankedmatch && !level.disablestattracking ) - { - attacker setdstat( "HighestStats", "kill_streak", attacker.pers[ "totalKillstreakCount" ] ); - } - attacker.kill_streak = attacker.pers[ "cur_kill_streak" ]; - } - if ( attacker.pers[ "cur_kill_streak" ] > attacker.gametype_kill_streak ) - { - attacker maps/mp/gametypes/_persistence::statsetwithgametype( "kill_streak", attacker.pers[ "cur_kill_streak" ] ); - attacker.gametype_kill_streak = attacker.pers[ "cur_kill_streak" ]; - } - killstreak = maps/mp/killstreaks/_killstreaks::getkillstreakforweapon( sweapon ); - if ( isDefined( killstreak ) ) - { - if ( maps/mp/_scoreevents::isregisteredevent( killstreak ) ) - { - maps/mp/_scoreevents::processscoreevent( killstreak, attacker, self, sweapon ); - } - if ( sweapon == "straferun_gun_mp" || sweapon == "straferun_rockets_mp" ) - { - attacker maps/mp/killstreaks/_straferun::addstraferunkill(); - } - } - else if ( smeansofdeath == "MOD_MELEE" && level.gametype == "gun" ) - { - } - else - { - maps/mp/_scoreevents::processscoreevent( "kill", attacker, self, sweapon ); - } - if ( smeansofdeath == "MOD_HEAD_SHOT" ) - { - maps/mp/_scoreevents::processscoreevent( "headshot", attacker, self, sweapon ); - } - else if ( smeansofdeath == "MOD_MELEE" ) - { - if ( sweapon == "riotshield_mp" ) - { - maps/mp/_scoreevents::processscoreevent( "melee_kill_with_riot_shield", attacker, self, sweapon ); - if ( isDefined( attacker.class_num ) ) - { - primaryweaponnum = attacker getloadoutitem( attacker.class_num, "primary" ); - secondaryweaponnum = attacker getloadoutitem( attacker.class_num, "secondary" ); - if ( primaryweaponnum && level.tbl_weaponids[ primaryweaponnum ][ "reference" ] == "riotshield" && !secondaryweaponnum || secondaryweaponnum && level.tbl_weaponids[ secondaryweaponnum ][ "reference" ] == "riotshield" && !primaryweaponnum ) - { - attacker addweaponstat( sweapon, "NoLethalKills", 1 ); - } - } - } - else - { - maps/mp/_scoreevents::processscoreevent( "melee_kill", attacker, self, sweapon ); - } - } - attacker thread maps/mp/gametypes/_globallogic_score::trackattackerkill( self.name, self.pers[ "rank" ], self.pers[ "rankxp" ], self.pers[ "prestige" ], self getxuid( 1 ) ); - attackername = attacker.name; - self thread maps/mp/gametypes/_globallogic_score::trackattackeedeath( attackername, attacker.pers[ "rank" ], attacker.pers[ "rankxp" ], attacker.pers[ "prestige" ], attacker getxuid( 1 ) ); - self thread maps/mp/_medals::setlastkilledby( attacker ); - attacker thread maps/mp/gametypes/_globallogic_score::inckillstreaktracker( sweapon ); - if ( level.teambased && attacker.team != "spectator" ) - { - if ( isai( attacker ) ) - { - maps/mp/gametypes/_globallogic_score::giveteamscore( "kill", attacker.aiteam, attacker, self ); - } - else - { - maps/mp/gametypes/_globallogic_score::giveteamscore( "kill", attacker.team, attacker, self ); - } - } - scoresub = level.deathpointloss; - if ( scoresub != 0 ) - { - maps/mp/gametypes/_globallogic_score::_setplayerscore( self, maps/mp/gametypes/_globallogic_score::_getplayerscore( self ) - scoresub ); - } - level thread playkillbattlechatter( attacker, sweapon, self ); + maps\mp\gametypes\_globallogic_score::inctotalkills( attacker.team ); + attacker thread maps\mp\gametypes\_globallogic_score::givekillstats( smeansofdeath, sweapon, self ); + + if ( isalive( attacker ) ) + { + pixbeginevent( "killstreak" ); + + if ( !isdefined( einflictor ) || !isdefined( einflictor.requireddeathcount ) || attacker.deathcount == einflictor.requireddeathcount ) + { + shouldgivekillstreak = maps\mp\killstreaks\_killstreaks::shouldgivekillstreak( sweapon ); + + if ( shouldgivekillstreak ) + attacker maps\mp\killstreaks\_killstreaks::addtokillstreakcount( sweapon ); + + attacker.pers["cur_total_kill_streak"]++; + attacker setplayercurrentstreak( attacker.pers["cur_total_kill_streak"] ); + + if ( isdefined( level.killstreaks ) && shouldgivekillstreak ) + { + attacker.pers["cur_kill_streak"]++; + + if ( attacker.pers["cur_kill_streak"] >= 2 ) + { + if ( attacker.pers["cur_kill_streak"] == 10 ) + attacker maps\mp\_challenges::killstreakten(); + + if ( attacker.pers["cur_kill_streak"] <= 30 ) + maps\mp\_scoreevents::processscoreevent( "killstreak_" + attacker.pers["cur_kill_streak"], attacker, self, sweapon ); + else + maps\mp\_scoreevents::processscoreevent( "killstreak_more_than_30", attacker, self, sweapon ); + } + + if ( !isdefined( level.usingmomentum ) || !level.usingmomentum ) + attacker thread maps\mp\killstreaks\_killstreaks::givekillstreakforstreak(); + } + } + + if ( isplayer( attacker ) ) + self thread maps\mp\gametypes\_battlechatter_mp::onplayerkillstreak( attacker ); + + pixendevent(); + } + + if ( attacker.pers["cur_kill_streak"] > attacker.kill_streak ) + { + if ( level.rankedmatch && !level.disablestattracking ) + attacker setdstat( "HighestStats", "kill_streak", attacker.pers["totalKillstreakCount"] ); + + attacker.kill_streak = attacker.pers["cur_kill_streak"]; + } + + if ( attacker.pers["cur_kill_streak"] > attacker.gametype_kill_streak ) + { + attacker maps\mp\gametypes\_persistence::statsetwithgametype( "kill_streak", attacker.pers["cur_kill_streak"] ); + attacker.gametype_kill_streak = attacker.pers["cur_kill_streak"]; + } + + killstreak = maps\mp\killstreaks\_killstreaks::getkillstreakforweapon( sweapon ); + + if ( isdefined( killstreak ) ) + { + if ( maps\mp\_scoreevents::isregisteredevent( killstreak ) ) + maps\mp\_scoreevents::processscoreevent( killstreak, attacker, self, sweapon ); + + if ( sweapon == "straferun_gun_mp" || sweapon == "straferun_rockets_mp" ) + attacker maps\mp\killstreaks\_straferun::addstraferunkill(); + } + else + { + if ( smeansofdeath == "MOD_MELEE" && level.gametype == "gun" ) + { + + } + else + maps\mp\_scoreevents::processscoreevent( "kill", attacker, self, sweapon ); + + if ( smeansofdeath == "MOD_HEAD_SHOT" ) + maps\mp\_scoreevents::processscoreevent( "headshot", attacker, self, sweapon ); + else if ( smeansofdeath == "MOD_MELEE" ) + { + if ( sweapon == "riotshield_mp" ) + { + maps\mp\_scoreevents::processscoreevent( "melee_kill_with_riot_shield", attacker, self, sweapon ); + + if ( isdefined( attacker.class_num ) ) + { + primaryweaponnum = attacker getloadoutitem( attacker.class_num, "primary" ); + secondaryweaponnum = attacker getloadoutitem( attacker.class_num, "secondary" ); + + if ( primaryweaponnum && level.tbl_weaponids[primaryweaponnum]["reference"] == "riotshield" && !secondaryweaponnum || secondaryweaponnum && level.tbl_weaponids[secondaryweaponnum]["reference"] == "riotshield" && !primaryweaponnum ) + attacker addweaponstat( sweapon, "NoLethalKills", 1 ); + } + } + else + maps\mp\_scoreevents::processscoreevent( "melee_kill", attacker, self, sweapon ); + } + } + + attacker thread maps\mp\gametypes\_globallogic_score::trackattackerkill( self.name, self.pers["rank"], self.pers["rankxp"], self.pers["prestige"], self getxuid( 1 ) ); + attackername = attacker.name; + self thread maps\mp\gametypes\_globallogic_score::trackattackeedeath( attackername, attacker.pers["rank"], attacker.pers["rankxp"], attacker.pers["prestige"], attacker getxuid( 1 ) ); + self thread maps\mp\_medals::setlastkilledby( attacker ); + attacker thread maps\mp\gametypes\_globallogic_score::inckillstreaktracker( sweapon ); + + if ( level.teambased && attacker.team != "spectator" ) + { + if ( isai( attacker ) ) + maps\mp\gametypes\_globallogic_score::giveteamscore( "kill", attacker.aiteam, attacker, self ); + else + maps\mp\gametypes\_globallogic_score::giveteamscore( "kill", attacker.team, attacker, self ); + } + + scoresub = level.deathpointloss; + + if ( scoresub != 0 ) + maps\mp\gametypes\_globallogic_score::_setplayerscore( self, maps\mp\gametypes\_globallogic_score::_getplayerscore( self ) - scoresub ); + + level thread playkillbattlechatter( attacker, sweapon, self ); } -callback_playerkilled( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ) //checked partially changed to match cerberus output changed at own discretion +callback_playerkilled( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ) { - profilelog_begintiming( 7, "ship" ); - self endon( "spawned" ); - self notify( "killed_player" ); - if ( self.sessionteam == "spectator" ) - { - return; - } - if ( game[ "state" ] == "postgame" ) - { - return; - } - self needsrevive( 0 ); - if ( isDefined( self.burning ) && self.burning == 1 ) - { - self setburn( 0 ); - } - self.suicide = 0; - self.teamkilled = 0; - if ( isDefined( level.takelivesondeath ) && level.takelivesondeath == 1 ) - { - if ( self.pers[ "lives" ] ) - { - self.pers[ "lives" ]--; + profilelog_begintiming( 7, "ship" ); + self endon( "spawned" ); + self notify( "killed_player" ); - if ( self.pers[ "lives" ] == 0 ) - { - level notify( "player_eliminated" ); - self notify( "player_eliminated" ); - } - } - } - self thread flushgroupdialogonplayer( "item_destroyed" ); - sweapon = updateweapon( einflictor, sweapon ); - pixbeginevent( "PlayerKilled pre constants" ); - wasinlaststand = 0; - deathtimeoffset = 0; - lastweaponbeforedroppingintolaststand = undefined; - attackerstance = undefined; - self.laststandthislife = undefined; - self.vattackerorigin = undefined; - if ( isDefined( self.uselaststandparams ) ) - { - self.uselaststandparams = undefined; - /* + if ( self.sessionteam == "spectator" ) + return; + + if ( game["state"] == "postgame" ) + return; + + self needsrevive( 0 ); + + if ( isdefined( self.burning ) && self.burning == 1 ) + self setburn( 0 ); + + self.suicide = 0; + self.teamkilled = 0; + + if ( isdefined( level.takelivesondeath ) && level.takelivesondeath == 1 ) + { + if ( self.pers["lives"] ) + { + self.pers["lives"]--; + + if ( self.pers["lives"] == 0 ) + { + level notify( "player_eliminated" ); + self notify( "player_eliminated" ); + } + } + } + + self thread flushgroupdialogonplayer( "item_destroyed" ); + sweapon = updateweapon( einflictor, sweapon ); + pixbeginevent( "PlayerKilled pre constants" ); + wasinlaststand = 0; + deathtimeoffset = 0; + lastweaponbeforedroppingintolaststand = undefined; + attackerstance = undefined; + self.laststandthislife = undefined; + self.vattackerorigin = undefined; + + if ( isdefined( self.uselaststandparams ) ) + { + self.uselaststandparams = undefined; /# - assert( isDefined( self.laststandparams ) ); + assert( isdefined( self.laststandparams ) ); #/ - */ - if ( !level.teambased || !isDefined( attacker ) || !isplayer( attacker ) || attacker.team != self.team || attacker == self ) - { - einflictor = self.laststandparams.einflictor; - attacker = self.laststandparams.attacker; - attackerstance = self.laststandparams.attackerstance; - idamage = self.laststandparams.idamage; - smeansofdeath = self.laststandparams.smeansofdeath; - sweapon = self.laststandparams.sweapon; - vdir = self.laststandparams.vdir; - shitloc = self.laststandparams.shitloc; - self.vattackerorigin = self.laststandparams.vattackerorigin; - deathtimeoffset = ( getTime() - self.laststandparams.laststandstarttime ) / 1000; - self thread maps/mp/gametypes/_battlechatter_mp::perkspecificbattlechatter( "secondchance" ); - if ( isDefined( self.previousprimary ) ) - { - wasinlaststand = 1; - lastweaponbeforedroppingintolaststand = self.previousprimary; - } - } - self.laststandparams = undefined; - } - bestplayer = undefined; - bestplayermeansofdeath = undefined; - obituarymeansofdeath = undefined; - bestplayerweapon = undefined; - obituaryweapon = sweapon; - assistedsuicide = 0; - if ( !isDefined( attacker ) || attacker.classname == "trigger_hurt" || attacker.classname == "worldspawn" || isDefined( attacker.ismagicbullet ) && attacker.ismagicbullet != 1 || attacker == self && isDefined( self.attackers ) ) - { - if ( !isDefined( bestplayer ) ) - { - i = 0; - while ( i < self.attackers.size ) - { - player = self.attackers[ i ]; - if ( !isDefined( player ) ) - { - i++; - continue; - } - if ( !isDefined( self.attackerdamage[ player.clientid ] ) || !isDefined( self.attackerdamage[ player.clientid ].damage ) ) - { - i++; - continue; - } - if ( player == self || level.teambased && player.team == self.team ) - { - i++; - continue; - } - if ( ( self.attackerdamage[ player.clientid ].lasttimedamaged + 2500 ) < getTime() ) - { - i++; - continue; - } - if ( !allowedassistweapon( self.attackerdamage[ player.clientid ].weapon ) ) - { - i++; - continue; - } - if ( self.attackerdamage[ player.clientid ].damage > 1 && !isDefined( bestplayer ) ) - { - bestplayer = player; - bestplayermeansofdeath = self.attackerdamage[ player.clientid ].meansofdeath; - bestplayerweapon = self.attackerdamage[ player.clientid ].weapon; - i++; - continue; - } - if ( isDefined( bestplayer ) && self.attackerdamage[ player.clientid ].damage > self.attackerdamage[ bestplayer.clientid ].damage ) - { - bestplayer = player; - bestplayermeansofdeath = self.attackerdamage[ player.clientid ].meansofdeath; - bestplayerweapon = self.attackerdamage[ player.clientid ].weapon; - } - i++; - } - } - if ( isDefined( bestplayer ) ) - { - maps/mp/_scoreevents::processscoreevent( "assisted_suicide", bestplayer, self, sweapon ); - self recordkillmodifier( "assistedsuicide" ); - assistedsuicide = 1; - } - } - if ( isDefined( bestplayer ) ) - { - attacker = bestplayer; - obituarymeansofdeath = bestplayermeansofdeath; - obituaryweapon = bestplayerweapon; - if ( isDefined( bestplayerweapon ) ) - { - sweapon = bestplayerweapon; - } - } - if ( isplayer( attacker ) ) - { - attacker.damagedplayers[ self.clientid ] = undefined; - } - self.deathtime = getTime(); - attacker = updateattacker( attacker, sweapon ); - einflictor = updateinflictor( einflictor ); - smeansofdeath = self playerkilled_updatemeansofdeath( attacker, einflictor, sweapon, smeansofdeath, shitloc ); - if ( !isDefined( obituarymeansofdeath ) ) - { - obituarymeansofdeath = smeansofdeath; - } - if ( isDefined( self.hasriotshieldequipped ) && self.hasriotshieldequipped == 1 ) - { - self detachshieldmodel( level.carriedshieldmodel, "tag_weapon_left" ); - self.hasriotshield = 0; - self.hasriotshieldequipped = 0; - } - self thread updateglobalbotkilledcounter(); - self playerkilled_weaponstats( attacker, sweapon, smeansofdeath, wasinlaststand, lastweaponbeforedroppingintolaststand, einflictor ); - self playerkilled_obituary( attacker, einflictor, obituaryweapon, obituarymeansofdeath ); - maps/mp/gametypes/_spawnlogic::deathoccured( self, attacker ); - self.sessionstate = "dead"; - self.statusicon = "hud_status_dead"; - self.pers[ "weapon" ] = undefined; - self.killedplayerscurrent = []; - self.deathcount++; - /* + + if ( !level.teambased || !isdefined( attacker ) || !isplayer( attacker ) || attacker.team != self.team || attacker == self ) + { + einflictor = self.laststandparams.einflictor; + attacker = self.laststandparams.attacker; + attackerstance = self.laststandparams.attackerstance; + idamage = self.laststandparams.idamage; + smeansofdeath = self.laststandparams.smeansofdeath; + sweapon = self.laststandparams.sweapon; + vdir = self.laststandparams.vdir; + shitloc = self.laststandparams.shitloc; + self.vattackerorigin = self.laststandparams.vattackerorigin; + deathtimeoffset = ( gettime() - self.laststandparams.laststandstarttime ) / 1000; + self thread maps\mp\gametypes\_battlechatter_mp::perkspecificbattlechatter( "secondchance" ); + + if ( isdefined( self.previousprimary ) ) + { + wasinlaststand = 1; + lastweaponbeforedroppingintolaststand = self.previousprimary; + } + } + + self.laststandparams = undefined; + } + + bestplayer = undefined; + bestplayermeansofdeath = undefined; + obituarymeansofdeath = undefined; + bestplayerweapon = undefined; + obituaryweapon = sweapon; + assistedsuicide = 0; + + if ( ( !isdefined( attacker ) || attacker.classname == "trigger_hurt" || attacker.classname == "worldspawn" || isdefined( attacker.ismagicbullet ) && attacker.ismagicbullet == 1 || attacker == self ) && isdefined( self.attackers ) ) + { + if ( !isdefined( bestplayer ) ) + { + for ( i = 0; i < self.attackers.size; i++ ) + { + player = self.attackers[i]; + + if ( !isdefined( player ) ) + continue; + + if ( !isdefined( self.attackerdamage[player.clientid] ) || !isdefined( self.attackerdamage[player.clientid].damage ) ) + continue; + + if ( player == self || level.teambased && player.team == self.team ) + continue; + + if ( self.attackerdamage[player.clientid].lasttimedamaged + 2500 < gettime() ) + continue; + + if ( !allowedassistweapon( self.attackerdamage[player.clientid].weapon ) ) + continue; + + if ( self.attackerdamage[player.clientid].damage > 1 && !isdefined( bestplayer ) ) + { + bestplayer = player; + bestplayermeansofdeath = self.attackerdamage[player.clientid].meansofdeath; + bestplayerweapon = self.attackerdamage[player.clientid].weapon; + continue; + } + + if ( isdefined( bestplayer ) && self.attackerdamage[player.clientid].damage > self.attackerdamage[bestplayer.clientid].damage ) + { + bestplayer = player; + bestplayermeansofdeath = self.attackerdamage[player.clientid].meansofdeath; + bestplayerweapon = self.attackerdamage[player.clientid].weapon; + } + } + } + + if ( isdefined( bestplayer ) ) + { + maps\mp\_scoreevents::processscoreevent( "assisted_suicide", bestplayer, self, sweapon ); + self recordkillmodifier( "assistedsuicide" ); + assistedsuicide = 1; + } + } + + if ( isdefined( bestplayer ) ) + { + attacker = bestplayer; + obituarymeansofdeath = bestplayermeansofdeath; + obituaryweapon = bestplayerweapon; + + if ( isdefined( bestplayerweapon ) ) + sweapon = bestplayerweapon; + } + + if ( isplayer( attacker ) ) + attacker.damagedplayers[self.clientid] = undefined; + + self.deathtime = gettime(); + attacker = updateattacker( attacker, sweapon ); + einflictor = updateinflictor( einflictor ); + smeansofdeath = self playerkilled_updatemeansofdeath( attacker, einflictor, sweapon, smeansofdeath, shitloc ); + + if ( !isdefined( obituarymeansofdeath ) ) + obituarymeansofdeath = smeansofdeath; + + if ( isdefined( self.hasriotshieldequipped ) && self.hasriotshieldequipped == 1 ) + { + self detachshieldmodel( level.carriedshieldmodel, "tag_weapon_left" ); + self.hasriotshield = 0; + self.hasriotshieldequipped = 0; + } + + self thread updateglobalbotkilledcounter(); + self playerkilled_weaponstats( attacker, sweapon, smeansofdeath, wasinlaststand, lastweaponbeforedroppingintolaststand, einflictor ); + self playerkilled_obituary( attacker, einflictor, obituaryweapon, obituarymeansofdeath ); + maps\mp\gametypes\_spawnlogic::deathoccured( self, attacker ); + self.sessionstate = "dead"; + self.statusicon = "hud_status_dead"; + self.pers["weapon"] = undefined; + self.killedplayerscurrent = []; + self.deathcount++; /# - println( "players(" + self.clientid + ") death count ++: " + self.deathcount ); + println( "players(" + self.clientid + ") death count ++: " + self.deathcount ); #/ - */ - self playerkilled_killstreaks( attacker, sweapon ); - lpselfnum = self getentitynumber(); - lpselfname = self.name; - lpattackguid = ""; - lpattackname = ""; - lpselfteam = self.team; - lpselfguid = self getguid(); - lpattackteam = ""; - lpattackorigin = ( 0, 0, 0 ); - lpattacknum = -1; - awardassists = 0; - wasteamkill = 0; - wassuicide = 0; - pixendevent(); - maps/mp/_scoreevents::processscoreevent( "death", self, self, sweapon ); - self.pers[ "resetMomentumOnSpawn" ] = 1; - if ( isplayer( attacker ) ) - { - lpattackguid = attacker getguid(); - lpattackname = attacker.name; - lpattackteam = attacker.team; - lpattackorigin = attacker.origin; - if ( attacker == self || assistedsuicide == 1 ) - { - dokillcam = 0; - wassuicide = 1; - awardassists = self playerkilled_suicide( einflictor, attacker, smeansofdeath, sweapon, shitloc ); - } - else - { - pixbeginevent( "PlayerKilled attacker" ); - lpattacknum = attacker getentitynumber(); - dokillcam = 1; - if ( level.teambased && self.team == attacker.team && smeansofdeath == "MOD_GRENADE" && level.friendlyfire == 0 ) - { - } - else if ( level.teambased && self.team == attacker.team ) - { - wasteamkill = 1; - self playerkilled_teamkill( einflictor, attacker, smeansofdeath, sweapon, shitloc ); - } - else - { - self playerkilled_kill( einflictor, attacker, smeansofdeath, sweapon, shitloc ); - if ( level.teambased ) - { - awardassists = 1; - } - } - pixendevent(); - } - } - else if ( isDefined( attacker ) && attacker.classname == "trigger_hurt" || isDefined( attacker ) && attacker.classname == "worldspawn" ) - { - dokillcam = 0; - lpattacknum = -1; - lpattackguid = ""; - lpattackname = ""; - lpattackteam = "world"; - thread maps/mp/_scoreevents::processscoreevent( "suicide", self ); - self maps/mp/gametypes/_globallogic_score::incpersstat( "suicides", 1 ); - self.suicides = self maps/mp/gametypes/_globallogic_score::getpersstat( "suicides" ); - self.suicide = 1; - thread maps/mp/gametypes/_battlechatter_mp::onplayersuicideorteamkill( self, "suicide" ); - awardassists = 1; - if ( level.maxsuicidesbeforekick > 0 && level.maxsuicidesbeforekick <= self.suicides ) - { - self notify( "teamKillKicked" ); - self suicidekick(); - } - } - else - { - dokillcam = 0; - lpattacknum = -1; - lpattackguid = ""; - lpattackname = ""; - lpattackteam = "world"; - wassuicide = 1; - if ( isDefined( einflictor ) && isDefined( einflictor.killcament ) ) - { - dokillcam = 1; - lpattacknum = self getentitynumber(); - wassuicide = 0; - } - if ( isDefined( attacker ) && isDefined( attacker.team ) && isDefined( level.teams[ attacker.team ] ) ) - { - if ( attacker.team != self.team ) - { - if ( level.teambased ) - { - maps/mp/gametypes/_globallogic_score::giveteamscore( "kill", attacker.team, attacker, self ); - } - wassuicide = 0; - } - } - awardassists = 1; - } - if ( !level.ingraceperiod ) - { - if ( smeansofdeath != "MOD_GRENADE" && smeansofdeath != "MOD_GRENADE_SPLASH" && smeansofdeath != "MOD_EXPLOSIVE" && smeansofdeath != "MOD_EXPLOSIVE_SPLASH" && smeansofdeath != "MOD_PROJECTILE_SPLASH" ) - { - self maps/mp/gametypes/_weapons::dropscavengerfordeath( attacker ); - } - if ( !wasteamkill && !wassuicide ) - { - self maps/mp/gametypes/_weapons::dropweaponfordeath( attacker, sweapon, smeansofdeath ); - self maps/mp/gametypes/_weapons::dropoffhand(); - } - } - if ( sessionmodeiszombiesgame() ) - { - awardassists = 0; - } - if ( awardassists ) - { - self playerkilled_awardassists( einflictor, attacker, sweapon, lpattackteam ); - } - pixbeginevent( "PlayerKilled post constants" ); - self.lastattacker = attacker; - self.lastdeathpos = self.origin; - if ( ( !level.teambased || attacker.team != self.team ) && isDefined( attacker ) && isplayer( attacker ) && attacker != self ) - { - self thread maps/mp/_challenges::playerkilled( einflictor, attacker, idamage, smeansofdeath, sweapon, shitloc, attackerstance ); - } - else - { - self notify( "playerKilledChallengesProcessed" ); - } - if ( isDefined( self.attackers ) ) - { - self.attackers = []; - } - if ( isplayer( attacker ) ) - { - if ( maps/mp/killstreaks/_killstreaks::iskillstreakweapon( sweapon ) ) - { - killstreak = maps/mp/killstreaks/_killstreaks::getkillstreakforweapon( sweapon ); - bbprint( "mpattacks", "gametime %d attackerspawnid %d attackerweapon %s attackerx %d attackery %d attackerz %d victimspawnid %d victimx %d victimy %d victimz %d damage %d damagetype %s damagelocation %s death %d killstreak %s", getTime(), getplayerspawnid( attacker ), sweapon, lpattackorigin, getplayerspawnid( self ), self.origin, idamage, smeansofdeath, shitloc, 1, killstreak ); - } - else - { - bbprint( "mpattacks", "gametime %d attackerspawnid %d attackerweapon %s attackerx %d attackery %d attackerz %d victimspawnid %d victimx %d victimy %d victimz %d damage %d damagetype %s damagelocation %s death %d", getTime(), getplayerspawnid( attacker ), sweapon, lpattackorigin, getplayerspawnid( self ), self.origin, idamage, smeansofdeath, shitloc, 1 ); - } - } - else - { - bbprint( "mpattacks", "gametime %d attackerweapon %s victimspawnid %d victimx %d victimy %d victimz %d damage %d damagetype %s damagelocation %s death %d", getTime(), sweapon, getplayerspawnid( self ), self.origin, idamage, smeansofdeath, shitloc, 1 ); - } - logprint( "K;" + lpselfguid + ";" + lpselfnum + ";" + lpselfteam + ";" + lpselfname + ";" + lpattackguid + ";" + lpattacknum + ";" + lpattackteam + ";" + lpattackname + ";" + sweapon + ";" + idamage + ";" + smeansofdeath + ";" + shitloc + "\n" ); - attackerstring = "none"; - if ( isplayer( attacker ) ) - { - attackerstring = attacker getxuid() + "(" + lpattackname + ")"; - } - self logstring( "d " + smeansofdeath + "(" + sweapon + ") a:" + attackerstring + " d:" + idamage + " l:" + shitloc + " @ " + int( self.origin[ 0 ] ) + " " + int( self.origin[ 1 ] ) + " " + int( self.origin[ 2 ] ) ); - level thread maps/mp/gametypes/_globallogic::updateteamstatus(); - killcamentity = self getkillcamentity( attacker, einflictor, sweapon ); - killcamentityindex = -1; - killcamentitystarttime = 0; - if ( isDefined( killcamentity ) ) - { - killcamentityindex = killcamentity getentitynumber(); - if ( isDefined( killcamentity.starttime ) ) - { - killcamentitystarttime = killcamentity.starttime; - } - else - { - killcamentitystarttime = killcamentity.birthtime; - } - if ( !isDefined( killcamentitystarttime ) ) - { - killcamentitystarttime = 0; - } - } - if ( isDefined( self.killstreak_waitamount ) && self.killstreak_waitamount > 0 ) - { - dokillcam = 0; - } - self maps/mp/gametypes/_weapons::detachcarryobjectmodel(); - died_in_vehicle = 0; - if ( isDefined( self.diedonvehicle ) ) - { - died_in_vehicle = self.diedonvehicle; - } - hit_by_train = 0; - if ( isDefined( attacker ) && isDefined( attacker.targetname ) && attacker.targetname == "train" ) - { - hit_by_train = 1; - } - pixendevent(); - pixbeginevent( "PlayerKilled body and gibbing" ); - if ( !died_in_vehicle && !hit_by_train ) - { - vattackerorigin = undefined; - if ( isDefined( attacker ) ) - { - vattackerorigin = attacker.origin; - } - ragdoll_now = 0; - if ( is_true( self.usingvehicle ) && isDefined( self.vehicleposition ) && self.vehicleposition == 1 ) - { - ragdoll_now = 1; - } - body = self cloneplayer( deathanimduration ); - if ( isDefined( body ) ) - { - self createdeadbody( idamage, smeansofdeath, sweapon, shitloc, vdir, vattackerorigin, deathanimduration, einflictor, ragdoll_now, body ); - } - } - pixendevent(); - thread maps/mp/gametypes/_globallogic_spawn::spawnqueuedclient( self.team, attacker ); - self.switching_teams = undefined; - self.joining_team = undefined; - self.leaving_team = undefined; - self thread [[ level.onplayerkilled ]]( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ); - for ( icb = 0; icb < level.onplayerkilledextraunthreadedcbs.size; icb++ ) - { - self [[ level.onplayerkilledextraunthreadedcbs[ icb ] ]]( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ); - } - self.wantsafespawn = 0; - perks = []; - killstreaks = maps/mp/gametypes/_globallogic::getkillstreaks( attacker ); - if ( !isDefined( self.killstreak_waitamount ) ) - { - self thread [[ level.spawnplayerprediction ]](); - } - profilelog_endtiming( 7, "gs=" + game[ "state" ] + " zom=" + sessionmodeiszombiesgame() ); - if ( wasteamkill == 0 && assistedsuicide == 0 && hit_by_train == 0 && smeansofdeath != "MOD_SUICIDE" && isDefined( attacker ) && attacker.classname != "trigger_hurt" && attacker.classname != "worldspawn" && self != attacker && !isDefined( attacker.disablefinalkillcam ) ) - { - level thread maps/mp/gametypes/_killcam::recordkillcamsettings( lpattacknum, self getentitynumber(), sweapon, self.deathtime, deathtimeoffset, psoffsettime, killcamentityindex, killcamentitystarttime, perks, killstreaks, attacker ); - } - wait 0.25; - weaponclass = getweaponclass( sweapon ); - if ( weaponclass == "weapon_sniper" ) - { - self thread maps/mp/gametypes/_battlechatter_mp::killedbysniper( attacker ); - } - else - { - self thread maps/mp/gametypes/_battlechatter_mp::playerkilled( attacker ); - } - self.cancelkillcam = 0; - self thread maps/mp/gametypes/_killcam::cancelkillcamonuse(); - defaultplayerdeathwatchtime = 1.75; - if ( isDefined( level.overrideplayerdeathwatchtimer ) ) - { - defaultplayerdeathwatchtime = [[ level.overrideplayerdeathwatchtimer ]]( defaultplayerdeathwatchtime ); - } - maps/mp/gametypes/_globallogic_utils::waitfortimeornotifies( defaultplayerdeathwatchtime ); - self notify( "death_delay_finished" ); - /* + self playerkilled_killstreaks( attacker, sweapon ); + lpselfnum = self getentitynumber(); + lpselfname = self.name; + lpattackguid = ""; + lpattackname = ""; + lpselfteam = self.team; + lpselfguid = self getguid(); + lpattackteam = ""; + lpattackorigin = ( 0, 0, 0 ); + lpattacknum = -1; + awardassists = 0; + wasteamkill = 0; + wassuicide = 0; + pixendevent(); + maps\mp\_scoreevents::processscoreevent( "death", self, self, sweapon ); + self.pers["resetMomentumOnSpawn"] = 1; + + if ( isplayer( attacker ) ) + { + lpattackguid = attacker getguid(); + lpattackname = attacker.name; + lpattackteam = attacker.team; + lpattackorigin = attacker.origin; + + if ( attacker == self || assistedsuicide == 1 ) + { + dokillcam = 0; + wassuicide = 1; + awardassists = self playerkilled_suicide( einflictor, attacker, smeansofdeath, sweapon, shitloc ); + } + else + { + pixbeginevent( "PlayerKilled attacker" ); + lpattacknum = attacker getentitynumber(); + dokillcam = 1; + + if ( level.teambased && self.team == attacker.team && smeansofdeath == "MOD_GRENADE" && level.friendlyfire == 0 ) + { + + } + else if ( level.teambased && self.team == attacker.team ) + { + wasteamkill = 1; + self playerkilled_teamkill( einflictor, attacker, smeansofdeath, sweapon, shitloc ); + } + else + { + self playerkilled_kill( einflictor, attacker, smeansofdeath, sweapon, shitloc ); + + if ( level.teambased ) + awardassists = 1; + } + + pixendevent(); + } + } + else if ( isdefined( attacker ) && ( attacker.classname == "trigger_hurt" || attacker.classname == "worldspawn" ) ) + { + dokillcam = 0; + lpattacknum = -1; + lpattackguid = ""; + lpattackname = ""; + lpattackteam = "world"; + thread maps\mp\_scoreevents::processscoreevent( "suicide", self ); + self maps\mp\gametypes\_globallogic_score::incpersstat( "suicides", 1 ); + self.suicides = self maps\mp\gametypes\_globallogic_score::getpersstat( "suicides" ); + self.suicide = 1; + thread maps\mp\gametypes\_battlechatter_mp::onplayersuicideorteamkill( self, "suicide" ); + awardassists = 1; + + if ( level.maxsuicidesbeforekick > 0 && level.maxsuicidesbeforekick <= self.suicides ) + { + self notify( "teamKillKicked" ); + self suicidekick(); + } + } + else + { + dokillcam = 0; + lpattacknum = -1; + lpattackguid = ""; + lpattackname = ""; + lpattackteam = "world"; + wassuicide = 1; + + if ( isdefined( einflictor ) && isdefined( einflictor.killcament ) ) + { + dokillcam = 1; + lpattacknum = self getentitynumber(); + wassuicide = 0; + } + + if ( isdefined( attacker ) && isdefined( attacker.team ) && isdefined( level.teams[attacker.team] ) ) + { + if ( attacker.team != self.team ) + { + if ( level.teambased ) + maps\mp\gametypes\_globallogic_score::giveteamscore( "kill", attacker.team, attacker, self ); + + wassuicide = 0; + } + } + + awardassists = 1; + } + + if ( !level.ingraceperiod ) + { + if ( smeansofdeath != "MOD_GRENADE" && smeansofdeath != "MOD_GRENADE_SPLASH" && smeansofdeath != "MOD_EXPLOSIVE" && smeansofdeath != "MOD_EXPLOSIVE_SPLASH" && smeansofdeath != "MOD_PROJECTILE_SPLASH" ) + self maps\mp\gametypes\_weapons::dropscavengerfordeath( attacker ); + + if ( !wasteamkill && !wassuicide ) + { + self maps\mp\gametypes\_weapons::dropweaponfordeath( attacker, sweapon, smeansofdeath ); + self maps\mp\gametypes\_weapons::dropoffhand(); + } + } + + if ( sessionmodeiszombiesgame() ) + awardassists = 0; + + if ( awardassists ) + self playerkilled_awardassists( einflictor, attacker, sweapon, lpattackteam ); + + pixbeginevent( "PlayerKilled post constants" ); + self.lastattacker = attacker; + self.lastdeathpos = self.origin; + + if ( isdefined( attacker ) && isplayer( attacker ) && attacker != self && ( !level.teambased || attacker.team != self.team ) ) + self thread maps\mp\_challenges::playerkilled( einflictor, attacker, idamage, smeansofdeath, sweapon, shitloc, attackerstance ); + else + self notify( "playerKilledChallengesProcessed" ); + + if ( isdefined( self.attackers ) ) + self.attackers = []; + + if ( isplayer( attacker ) ) + { + if ( maps\mp\killstreaks\_killstreaks::iskillstreakweapon( sweapon ) ) + { + killstreak = maps\mp\killstreaks\_killstreaks::getkillstreakforweapon( sweapon ); + bbprint( "mpattacks", "gametime %d attackerspawnid %d attackerweapon %s attackerx %d attackery %d attackerz %d victimspawnid %d victimx %d victimy %d victimz %d damage %d damagetype %s damagelocation %s death %d killstreak %s", gettime(), getplayerspawnid( attacker ), sweapon, lpattackorigin, getplayerspawnid( self ), self.origin, idamage, smeansofdeath, shitloc, 1, killstreak ); + } + else + bbprint( "mpattacks", "gametime %d attackerspawnid %d attackerweapon %s attackerx %d attackery %d attackerz %d victimspawnid %d victimx %d victimy %d victimz %d damage %d damagetype %s damagelocation %s death %d", gettime(), getplayerspawnid( attacker ), sweapon, lpattackorigin, getplayerspawnid( self ), self.origin, idamage, smeansofdeath, shitloc, 1 ); + } + else + bbprint( "mpattacks", "gametime %d attackerweapon %s victimspawnid %d victimx %d victimy %d victimz %d damage %d damagetype %s damagelocation %s death %d", gettime(), sweapon, getplayerspawnid( self ), self.origin, idamage, smeansofdeath, shitloc, 1 ); + + logprint( "K;" + lpselfguid + ";" + lpselfnum + ";" + lpselfteam + ";" + lpselfname + ";" + lpattackguid + ";" + lpattacknum + ";" + lpattackteam + ";" + lpattackname + ";" + sweapon + ";" + idamage + ";" + smeansofdeath + ";" + shitloc + "\n" ); + attackerstring = "none"; + + if ( isplayer( attacker ) ) + attackerstring = attacker getxuid() + "(" + lpattackname + ")"; + + self logstring( "d " + smeansofdeath + "(" + sweapon + ") a:" + attackerstring + " d:" + idamage + " l:" + shitloc + " @ " + int( self.origin[0] ) + " " + int( self.origin[1] ) + " " + int( self.origin[2] ) ); + level thread maps\mp\gametypes\_globallogic::updateteamstatus(); + killcamentity = self getkillcamentity( attacker, einflictor, sweapon ); + killcamentityindex = -1; + killcamentitystarttime = 0; + + if ( isdefined( killcamentity ) ) + { + killcamentityindex = killcamentity getentitynumber(); + + if ( isdefined( killcamentity.starttime ) ) + killcamentitystarttime = killcamentity.starttime; + else + killcamentitystarttime = killcamentity.birthtime; + + if ( !isdefined( killcamentitystarttime ) ) + killcamentitystarttime = 0; + } + + if ( isdefined( self.killstreak_waitamount ) && self.killstreak_waitamount > 0 ) + dokillcam = 0; + + self maps\mp\gametypes\_weapons::detachcarryobjectmodel(); + died_in_vehicle = 0; + + if ( isdefined( self.diedonvehicle ) ) + died_in_vehicle = self.diedonvehicle; + + hit_by_train = 0; + + if ( isdefined( attacker ) && isdefined( attacker.targetname ) && attacker.targetname == "train" ) + hit_by_train = 1; + + pixendevent(); + pixbeginevent( "PlayerKilled body and gibbing" ); + + if ( !died_in_vehicle && !hit_by_train ) + { + vattackerorigin = undefined; + + if ( isdefined( attacker ) ) + vattackerorigin = attacker.origin; + + ragdoll_now = 0; + + if ( isdefined( self.usingvehicle ) && self.usingvehicle && isdefined( self.vehicleposition ) && self.vehicleposition == 1 ) + ragdoll_now = 1; + + body = self cloneplayer( deathanimduration ); + + if ( isdefined( body ) ) + self createdeadbody( idamage, smeansofdeath, sweapon, shitloc, vdir, vattackerorigin, deathanimduration, einflictor, ragdoll_now, body ); + } + + pixendevent(); + thread maps\mp\gametypes\_globallogic_spawn::spawnqueuedclient( self.team, attacker ); + self.switching_teams = undefined; + self.joining_team = undefined; + self.leaving_team = undefined; + self thread [[ level.onplayerkilled ]]( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ); + + for ( icb = 0; icb < level.onplayerkilledextraunthreadedcbs.size; icb++ ) + self [[ level.onplayerkilledextraunthreadedcbs[icb] ]]( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ); + + self.wantsafespawn = 0; + perks = []; + killstreaks = maps\mp\gametypes\_globallogic::getkillstreaks( attacker ); + + if ( !isdefined( self.killstreak_waitamount ) ) + self thread [[ level.spawnplayerprediction ]](); + + profilelog_endtiming( 7, "gs=" + game["state"] + " zom=" + sessionmodeiszombiesgame() ); + + if ( wasteamkill == 0 && assistedsuicide == 0 && hit_by_train == 0 && smeansofdeath != "MOD_SUICIDE" && !( !isdefined( attacker ) || attacker.classname == "trigger_hurt" || attacker.classname == "worldspawn" || attacker == self || isdefined( attacker.disablefinalkillcam ) ) ) + level thread maps\mp\gametypes\_killcam::recordkillcamsettings( lpattacknum, self getentitynumber(), sweapon, self.deathtime, deathtimeoffset, psoffsettime, killcamentityindex, killcamentitystarttime, perks, killstreaks, attacker ); + + wait 0.25; + weaponclass = getweaponclass( sweapon ); + + if ( weaponclass == "weapon_sniper" ) + self thread maps\mp\gametypes\_battlechatter_mp::killedbysniper( attacker ); + else + self thread maps\mp\gametypes\_battlechatter_mp::playerkilled( attacker ); + + self.cancelkillcam = 0; + self thread maps\mp\gametypes\_killcam::cancelkillcamonuse(); + defaultplayerdeathwatchtime = 1.75; + + if ( isdefined( level.overrideplayerdeathwatchtimer ) ) + defaultplayerdeathwatchtime = [[ level.overrideplayerdeathwatchtimer ]]( defaultplayerdeathwatchtime ); + + maps\mp\gametypes\_globallogic_utils::waitfortimeornotifies( defaultplayerdeathwatchtime ); + self notify( "death_delay_finished" ); /# - if ( getDvarInt( "scr_forcekillcam" ) != 0 ) - { - dokillcam = 1; - if ( lpattacknum < 0 ) - { - lpattacknum = self getentitynumber(); + if ( getdvarint( _hash_C1849218 ) != 0 ) + { + dokillcam = 1; + + if ( lpattacknum < 0 ) + lpattacknum = self getentitynumber(); + } #/ - } - } - */ - if ( hit_by_train ) - { - if ( killcamentitystarttime > ( self.deathtime - 2500 ) ) - { - dokillcam = 0; - } - } - if ( game[ "state" ] != "playing" ) - { - return; - } - self.respawntimerstarttime = getTime(); - if ( !self.cancelkillcam && dokillcam && level.killcam ) - { - if ( !level.numLives && !self.pers[ "lives" ] ) - { - livesleft = 0; - } - else - { - livesleft = 1; - } - timeuntilspawn = maps/mp/gametypes/_globallogic_spawn::timeuntilspawn( 1 ); - if ( !level.playerqueuedrespawn && livesleft && timeuntilspawn <= 0 ) - { - willrespawnimmediately = 1; - } - else - { - willrespawnimmediately = 0; - } - self maps/mp/gametypes/_killcam::killcam( lpattacknum, self getentitynumber(), killcamentity, killcamentityindex, killcamentitystarttime, sweapon, self.deathtime, deathtimeoffset, psoffsettime, willrespawnimmediately, maps/mp/gametypes/_globallogic_utils::timeuntilroundend(), perks, killstreaks, attacker ); - } - if ( game[ "state" ] != "playing" ) - { - self.sessionstate = "dead"; - self.spectatorclient = -1; - self.killcamtargetentity = -1; - self.killcamentity = -1; - self.archivetime = 0; - self.psoffsettime = 0; - return; - } - waittillkillstreakdone(); - userespawntime = 1; - if ( isDefined( level.hostmigrationtimer ) ) - { - userespawntime = 0; - } - maps/mp/gametypes/_hostmigration::waittillhostmigrationcountdown(); - if ( maps/mp/gametypes/_globallogic_utils::isvalidclass( self.class ) ) - { - timepassed = undefined; - if ( isDefined( self.respawntimerstarttime ) && userespawntime ) - { - timepassed = ( getTime() - self.respawntimerstarttime ) / 1000; - } - self thread [[ level.spawnclient ]]( timepassed ); - self.respawntimerstarttime = undefined; - } + + if ( hit_by_train ) + { + if ( killcamentitystarttime > self.deathtime - 2500 ) + dokillcam = 0; + } + + if ( game["state"] != "playing" ) + return; + + self.respawntimerstarttime = gettime(); + + if ( !self.cancelkillcam && dokillcam && level.killcam ) + { + livesleft = !( level.numlives && !self.pers["lives"] ); + timeuntilspawn = maps\mp\gametypes\_globallogic_spawn::timeuntilspawn( 1 ); + willrespawnimmediately = livesleft && timeuntilspawn <= 0 && !level.playerqueuedrespawn; + self maps\mp\gametypes\_killcam::killcam( lpattacknum, self getentitynumber(), killcamentity, killcamentityindex, killcamentitystarttime, sweapon, self.deathtime, deathtimeoffset, psoffsettime, willrespawnimmediately, maps\mp\gametypes\_globallogic_utils::timeuntilroundend(), perks, killstreaks, attacker ); + } + + if ( game["state"] != "playing" ) + { + self.sessionstate = "dead"; + self.spectatorclient = -1; + self.killcamtargetentity = -1; + self.killcamentity = -1; + self.archivetime = 0; + self.psoffsettime = 0; + return; + } + + waittillkillstreakdone(); + userespawntime = 1; + + if ( isdefined( level.hostmigrationtimer ) ) + userespawntime = 0; + + maps\mp\gametypes\_hostmigration::waittillhostmigrationcountdown(); + + if ( maps\mp\gametypes\_globallogic_utils::isvalidclass( self.class ) ) + { + timepassed = undefined; + + if ( isdefined( self.respawntimerstarttime ) && userespawntime ) + timepassed = ( gettime() - self.respawntimerstarttime ) / 1000; + + self thread [[ level.spawnclient ]]( timepassed ); + self.respawntimerstarttime = undefined; + } } -updateglobalbotkilledcounter() //checked matches cerberus output +updateglobalbotkilledcounter() { - if ( isDefined( self.pers[ "isBot" ] ) ) - { - level.globallarryskilled++; - } + if ( isdefined( self.pers["isBot"] ) ) + level.globallarryskilled++; } -waittillkillstreakdone() //checked matches cerberus output +waittillkillstreakdone() { - if ( isDefined( self.killstreak_waitamount ) ) - { - starttime = getTime(); - waittime = self.killstreak_waitamount * 1000; - while ( getTime() < ( starttime + waittime ) && isDefined( self.killstreak_waitamount ) ) - { - wait 0.1; - } - wait 2; - self.killstreak_waitamount = undefined; - } + if ( isdefined( self.killstreak_waitamount ) ) + { + starttime = gettime(); + waittime = self.killstreak_waitamount * 1000; + + while ( gettime() < starttime + waittime && isdefined( self.killstreak_waitamount ) ) + wait 0.1; + + wait 2.0; + self.killstreak_waitamount = undefined; + } } -suicidekick() //checked matches cerberus output +suicidekick() { - self maps/mp/gametypes/_globallogic_score::incpersstat( "sessionbans", 1 ); - self endon( "disconnect" ); - waittillframeend; - maps/mp/gametypes/_globallogic::gamehistoryplayerkicked(); - ban( self getentitynumber() ); - maps/mp/gametypes/_globallogic_audio::leaderdialog( "kicked" ); + self maps\mp\gametypes\_globallogic_score::incpersstat( "sessionbans", 1 ); + self endon( "disconnect" ); + waittillframeend; + maps\mp\gametypes\_globallogic::gamehistoryplayerkicked(); + ban( self getentitynumber() ); + maps\mp\gametypes\_globallogic_audio::leaderdialog( "kicked" ); } -teamkillkick() //checked matches cerberus output +teamkillkick() { - self maps/mp/gametypes/_globallogic_score::incpersstat( "sessionbans", 1 ); - self endon( "disconnect" ); - waittillframeend; - playlistbanquantum = maps/mp/gametypes/_tweakables::gettweakablevalue( "team", "teamkillerplaylistbanquantum" ); - playlistbanpenalty = maps/mp/gametypes/_tweakables::gettweakablevalue( "team", "teamkillerplaylistbanpenalty" ); - if ( playlistbanquantum > 0 && playlistbanpenalty > 0 ) - { - timeplayedtotal = self getdstat( "playerstatslist", "time_played_total", "StatValue" ); - minutesplayed = timeplayedtotal / 60; - freebees = 2; - banallowance = int( floor( minutesplayed / playlistbanquantum ) ) + freebees; - if ( self.sessionbans > banallowance ) - { - self setdstat( "playerstatslist", "gametypeban", "StatValue", timeplayedtotal + ( playlistbanpenalty * 60 ) ); - } - } - maps/mp/gametypes/_globallogic::gamehistoryplayerkicked(); - ban( self getentitynumber() ); - maps/mp/gametypes/_globallogic_audio::leaderdialog( "kicked" ); + self maps\mp\gametypes\_globallogic_score::incpersstat( "sessionbans", 1 ); + self endon( "disconnect" ); + waittillframeend; + playlistbanquantum = maps\mp\gametypes\_tweakables::gettweakablevalue( "team", "teamkillerplaylistbanquantum" ); + playlistbanpenalty = maps\mp\gametypes\_tweakables::gettweakablevalue( "team", "teamkillerplaylistbanpenalty" ); + + if ( playlistbanquantum > 0 && playlistbanpenalty > 0 ) + { + timeplayedtotal = self getdstat( "playerstatslist", "time_played_total", "StatValue" ); + minutesplayed = timeplayedtotal / 60; + freebees = 2; + banallowance = int( floor( minutesplayed / playlistbanquantum ) ) + freebees; + + if ( self.sessionbans > banallowance ) + self setdstat( "playerstatslist", "gametypeban", "StatValue", timeplayedtotal + playlistbanpenalty * 60 ); + } + + maps\mp\gametypes\_globallogic::gamehistoryplayerkicked(); + ban( self getentitynumber() ); + maps\mp\gametypes\_globallogic_audio::leaderdialog( "kicked" ); } -teamkilldelay() //checked matches cerberus output +teamkilldelay() { - teamkills = self.pers[ "teamkills_nostats" ]; - if ( level.minimumallowedteamkills < 0 || teamkills <= level.minimumallowedteamkills ) - { - return 0; - } - exceeded = teamkills - level.minimumallowedteamkills; - return level.teamkillspawndelay * exceeded; + teamkills = self.pers["teamkills_nostats"]; + + if ( level.minimumallowedteamkills < 0 || teamkills <= level.minimumallowedteamkills ) + return 0; + + exceeded = teamkills - level.minimumallowedteamkills; + return level.teamkillspawndelay * exceeded; } -shouldteamkillkick( teamkilldelay ) //checked matches cerberus output +shouldteamkillkick( teamkilldelay ) { - if ( teamkilldelay && level.minimumallowedteamkills >= 0 ) - { - if ( maps/mp/gametypes/_globallogic_utils::gettimepassed() >= 5000 ) - { - return 1; - } - if ( self.pers[ "teamkills_nostats" ] > 1 ) - { - return 1; - } - } - return 0; + if ( teamkilldelay && level.minimumallowedteamkills >= 0 ) + { + if ( maps\mp\gametypes\_globallogic_utils::gettimepassed() >= 5000 ) + return true; + + if ( self.pers["teamkills_nostats"] > 1 ) + return true; + } + + return false; } -reduceteamkillsovertime() //checked changed to match cerberus output +reduceteamkillsovertime() { - timeperoneteamkillreduction = 20; - reductionpersecond = 1 / timeperoneteamkillreduction; - while ( 1 ) - { - if ( isalive( self ) ) - { - self.pers[ "teamkills_nostats" ] -= reductionpersecond; - if ( self.pers[ "teamkills_nostats" ] < level.minimumallowedteamkills ) - { - self.pers[ "teamkills_nostats" ] = level.minimumallowedteamkills; - break; - } - } - wait 1; - } + timeperoneteamkillreduction = 20.0; + reductionpersecond = 1.0 / timeperoneteamkillreduction; + + while ( true ) + { + if ( isalive( self ) ) + { + self.pers["teamkills_nostats"] -= reductionpersecond; + + if ( self.pers["teamkills_nostats"] < level.minimumallowedteamkills ) + { + self.pers["teamkills_nostats"] = level.minimumallowedteamkills; + break; + } + } + + wait 1; + } } -ignoreteamkills( sweapon, smeansofdeath ) //checked matches cerberus output +ignoreteamkills( sweapon, smeansofdeath ) { - if ( sessionmodeiszombiesgame() ) - { - return 1; - } - if ( smeansofdeath == "MOD_MELEE" ) - { - return 0; - } - if ( sweapon == "briefcase_bomb_mp" ) - { - return 1; - } - if ( sweapon == "supplydrop_mp" ) - { - return 1; - } - return 0; + if ( sessionmodeiszombiesgame() ) + return true; + + if ( smeansofdeath == "MOD_MELEE" ) + return false; + + if ( sweapon == "briefcase_bomb_mp" ) + return true; + + if ( sweapon == "supplydrop_mp" ) + return true; + + return false; } -callback_playerlaststand( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ) //checked matches cerberus output +callback_playerlaststand( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ) { + } -damageshellshockandrumble( eattacker, einflictor, sweapon, smeansofdeath, idamage ) //checked matches cerberus output +damageshellshockandrumble( eattacker, einflictor, sweapon, smeansofdeath, idamage ) { - self thread maps/mp/gametypes/_weapons::onweapondamage( eattacker, einflictor, sweapon, smeansofdeath, idamage ); - self playrumbleonentity( "damage_heavy" ); + self thread maps\mp\gametypes\_weapons::onweapondamage( eattacker, einflictor, sweapon, smeansofdeath, idamage ); + self playrumbleonentity( "damage_heavy" ); } -createdeadbody( idamage, smeansofdeath, sweapon, shitloc, vdir, vattackerorigin, deathanimduration, einflictor, ragdoll_jib, body ) //checked changed to match cerberus output +createdeadbody( idamage, smeansofdeath, sweapon, shitloc, vdir, vattackerorigin, deathanimduration, einflictor, ragdoll_jib, body ) { - if ( smeansofdeath == "MOD_HIT_BY_OBJECT" && self getstance() == "prone" ) - { - self.body = body; - if ( !isDefined( self.switching_teams ) ) - { - thread maps/mp/gametypes/_deathicons::adddeathicon( body, self, self.team, 5 ); - } - return; - } - if ( isDefined( level.ragdoll_override ) && self [[ level.ragdoll_override ]]( idamage, smeansofdeath, sweapon, shitloc, vdir, vattackerorigin, deathanimduration, einflictor, ragdoll_jib, body ) ) - { - return; - } - if ( ragdoll_jib || self isonladder() || self ismantling() || smeansofdeath == "MOD_CRUSH" || smeansofdeath == "MOD_HIT_BY_OBJECT" ) - { - body startragdoll(); - } - if ( !self isonground() ) - { - if ( getDvarInt( "scr_disable_air_death_ragdoll" ) == 0 ) - { - body startragdoll(); - } - } - if ( self is_explosive_ragdoll( sweapon, einflictor ) ) - { - body start_explosive_ragdoll( vdir, sweapon ); - } - thread delaystartragdoll( body, shitloc, vdir, sweapon, einflictor, smeansofdeath ); - if ( smeansofdeath == "MOD_BURNED" || isDefined( self.burning ) ) - { - body maps/mp/_burnplayer::burnedtodeath(); - } - if ( smeansofdeath == "MOD_CRUSH" ) - { - body maps/mp/gametypes/_globallogic_vehicle::vehiclecrush(); - } - self.body = body; - if ( !isDefined( self.switching_teams ) ) - { - thread maps/mp/gametypes/_deathicons::adddeathicon( body, self, self.team, 5 ); - } + if ( smeansofdeath == "MOD_HIT_BY_OBJECT" && self getstance() == "prone" ) + { + self.body = body; + + if ( !isdefined( self.switching_teams ) ) + thread maps\mp\gametypes\_deathicons::adddeathicon( body, self, self.team, 5.0 ); + + return; + } + + if ( isdefined( level.ragdoll_override ) && self [[ level.ragdoll_override ]]( idamage, smeansofdeath, sweapon, shitloc, vdir, vattackerorigin, deathanimduration, einflictor, ragdoll_jib, body ) ) + return; + + if ( ragdoll_jib || self isonladder() || self ismantling() || smeansofdeath == "MOD_CRUSH" || smeansofdeath == "MOD_HIT_BY_OBJECT" ) + body startragdoll(); + + if ( !self isonground() ) + { + if ( getdvarint( "scr_disable_air_death_ragdoll" ) == 0 ) + body startragdoll(); + } + + if ( self is_explosive_ragdoll( sweapon, einflictor ) ) + body start_explosive_ragdoll( vdir, sweapon ); + + thread delaystartragdoll( body, shitloc, vdir, sweapon, einflictor, smeansofdeath ); + + if ( smeansofdeath == "MOD_BURNED" || isdefined( self.burning ) ) + body maps\mp\_burnplayer::burnedtodeath(); + + if ( smeansofdeath == "MOD_CRUSH" ) + body maps\mp\gametypes\_globallogic_vehicle::vehiclecrush(); + + self.body = body; + + if ( !isdefined( self.switching_teams ) ) + thread maps\mp\gametypes\_deathicons::adddeathicon( body, self, self.team, 5.0 ); } -is_explosive_ragdoll( weapon, inflictor ) //checked matches cerberus output +is_explosive_ragdoll( weapon, inflictor ) { - if ( !isDefined( weapon ) ) - { - return 0; - } - if ( weapon == "destructible_car_mp" || weapon == "explodable_barrel_mp" ) - { - return 1; - } - if ( weapon == "sticky_grenade_mp" || weapon == "explosive_bolt_mp" ) - { - if ( isDefined( inflictor ) && isDefined( inflictor.stucktoplayer ) ) - { - if ( inflictor.stucktoplayer == self ) - { - return 1; - } - } - } - return 0; + if ( !isdefined( weapon ) ) + return false; + + if ( weapon == "destructible_car_mp" || weapon == "explodable_barrel_mp" ) + return true; + + if ( weapon == "sticky_grenade_mp" || weapon == "explosive_bolt_mp" ) + { + if ( isdefined( inflictor ) && isdefined( inflictor.stucktoplayer ) ) + { + if ( inflictor.stucktoplayer == self ) + return true; + } + } + + return false; } -start_explosive_ragdoll( dir, weapon ) //checked partially changed to match cerberus output see info.md +start_explosive_ragdoll( dir, weapon ) { - if ( !isDefined( self ) ) - { - return; - } - x = randomintrange( 50, 100 ); - y = randomintrange( 50, 100 ); - z = randomintrange( 10, 20 ); - if ( ( weapon == "sticky_grenade_mp" || weapon == "explosive_bolt_mp" ) && isDefined( weapon ) ) - { - if ( isDefined( dir ) && lengthsquared( dir ) > 0 ) - { - x = dir[ 0 ] * x; - y = dir[ 1 ] * y; - } - } - else if ( cointoss() ) - { - x *= -1; - } - if ( cointoss() ) - { - y *= -1; - } - self startragdoll(); - self launchragdoll( ( x, y, z ) ); + if ( !isdefined( self ) ) + return; + + x = randomintrange( 50, 100 ); + y = randomintrange( 50, 100 ); + z = randomintrange( 10, 20 ); + + if ( isdefined( weapon ) && ( weapon == "sticky_grenade_mp" || weapon == "explosive_bolt_mp" ) ) + { + if ( isdefined( dir ) && lengthsquared( dir ) > 0 ) + { + x = dir[0] * x; + y = dir[1] * y; + } + } + else + { + if ( cointoss() ) + x *= -1; + + if ( cointoss() ) + y *= -1; + } + + self startragdoll(); + self launchragdoll( ( x, y, z ) ); } -notifyconnecting() //checked changed to match cerberus output +notifyconnecting() { - waittillframeend; - if ( isDefined( self ) ) - { - level notify( "connecting", self ); - } + waittillframeend; + + if ( isdefined( self ) ) + level notify( "connecting", self ); } -delaystartragdoll( ent, shitloc, vdir, sweapon, einflictor, smeansofdeath ) //checked changed to match cerberus output +delaystartragdoll( ent, shitloc, vdir, sweapon, einflictor, smeansofdeath ) { - if ( isDefined( ent ) ) - { - deathanim = ent getcorpseanim(); - if ( animhasnotetrack( deathanim, "ignore_ragdoll" ) ) - { - return; - } - } - if ( level.oldschool ) - { - if ( !isDefined( vdir ) ) - { - vdir = ( 0, 0, 0 ); - } - explosionpos = ent.origin + ( 0, 0, maps/mp/gametypes/_globallogic_utils::gethitlocheight( shitloc ) ); - explosionpos -= vdir * 20; - explosionradius = 40; - explosionforce = 0.75; - if ( smeansofdeath == "MOD_IMPACT" || smeansofdeath == "MOD_EXPLOSIVE" || !issubstr( smeansofdeath, "MOD_GRENADE" ) || !issubstr( smeansofdeath, "MOD_PROJECTILE" ) || shitloc == "head" || shitloc == "helmet" ) - { - explosionforce = 2.5; - } - ent startragdoll( 1 ); - wait 0.05; - if ( !isDefined( ent ) ) - { - return; - } - physicsexplosionsphere( explosionpos, explosionradius, explosionradius / 2, explosionforce ); - return; - } - wait 0.2; - if ( !isDefined( ent ) ) - { - return; - } - if ( ent isragdoll() ) - { - return; - } - deathanim = ent getcorpseanim(); - startfrac = 0.35; - if ( animhasnotetrack( deathanim, "start_ragdoll" ) ) - { - times = getnotetracktimes( deathanim, "start_ragdoll" ); - if ( isDefined( times ) ) - { - startfrac = times[ 0 ]; - } - } - waittime = startfrac * getanimlength( deathanim ); - wait waittime; - if ( isDefined( ent ) ) - { - ent startragdoll( 1 ); - } + if ( isdefined( ent ) ) + { + deathanim = ent getcorpseanim(); + + if ( animhasnotetrack( deathanim, "ignore_ragdoll" ) ) + return; + } + + if ( level.oldschool ) + { + if ( !isdefined( vdir ) ) + vdir = ( 0, 0, 0 ); + + explosionpos = ent.origin + ( 0, 0, maps\mp\gametypes\_globallogic_utils::gethitlocheight( shitloc ) ); + explosionpos -= vdir * 20; + explosionradius = 40; + explosionforce = 0.75; + + if ( smeansofdeath == "MOD_IMPACT" || smeansofdeath == "MOD_EXPLOSIVE" || issubstr( smeansofdeath, "MOD_GRENADE" ) || issubstr( smeansofdeath, "MOD_PROJECTILE" ) || shitloc == "head" || shitloc == "helmet" ) + explosionforce = 2.5; + + ent startragdoll( 1 ); + wait 0.05; + + if ( !isdefined( ent ) ) + return; + + physicsexplosionsphere( explosionpos, explosionradius, explosionradius / 2, explosionforce ); + return; + } + + wait 0.2; + + if ( !isdefined( ent ) ) + return; + + if ( ent isragdoll() ) + return; + + deathanim = ent getcorpseanim(); + startfrac = 0.35; + + if ( animhasnotetrack( deathanim, "start_ragdoll" ) ) + { + times = getnotetracktimes( deathanim, "start_ragdoll" ); + + if ( isdefined( times ) ) + startfrac = times[0]; + } + + waittime = startfrac * getanimlength( deathanim ); + wait( waittime ); + + if ( isdefined( ent ) ) + ent startragdoll( 1 ); } -trackattackerdamage( eattacker, idamage, smeansofdeath, sweapon ) //checked matches cerberus output +trackattackerdamage( eattacker, idamage, smeansofdeath, sweapon ) { - /* /# - assert( isplayer( eattacker ) ); + assert( isplayer( eattacker ) ); #/ - */ - if ( self.attackerdata.size == 0 ) - { - self.firsttimedamaged = getTime(); - } - if ( !isDefined( self.attackerdata[ eattacker.clientid ] ) ) - { - self.attackerdamage[ eattacker.clientid ] = spawnstruct(); - self.attackerdamage[ eattacker.clientid ].damage = idamage; - self.attackerdamage[ eattacker.clientid ].meansofdeath = smeansofdeath; - self.attackerdamage[ eattacker.clientid ].weapon = sweapon; - self.attackerdamage[ eattacker.clientid ].time = getTime(); - self.attackers[ self.attackers.size ] = eattacker; - self.attackerdata[ eattacker.clientid ] = 0; - } - else - { - self.attackerdamage[ eattacker.clientid ].damage += idamage; - self.attackerdamage[ eattacker.clientid ].meansofdeath = smeansofdeath; - self.attackerdamage[ eattacker.clientid ].weapon = sweapon; - if ( !isDefined( self.attackerdamage[ eattacker.clientid ].time ) ) - { - self.attackerdamage[ eattacker.clientid ].time = getTime(); - } - } - self.attackerdamage[ eattacker.clientid ].lasttimedamaged = getTime(); - if ( maps/mp/gametypes/_weapons::isprimaryweapon( sweapon ) ) - { - self.attackerdata[ eattacker.clientid ] = 1; - } + + if ( self.attackerdata.size == 0 ) + self.firsttimedamaged = gettime(); + + if ( !isdefined( self.attackerdata[eattacker.clientid] ) ) + { + self.attackerdamage[eattacker.clientid] = spawnstruct(); + self.attackerdamage[eattacker.clientid].damage = idamage; + self.attackerdamage[eattacker.clientid].meansofdeath = smeansofdeath; + self.attackerdamage[eattacker.clientid].weapon = sweapon; + self.attackerdamage[eattacker.clientid].time = gettime(); + self.attackers[self.attackers.size] = eattacker; + self.attackerdata[eattacker.clientid] = 0; + } + else + { + self.attackerdamage[eattacker.clientid].damage += idamage; + self.attackerdamage[eattacker.clientid].meansofdeath = smeansofdeath; + self.attackerdamage[eattacker.clientid].weapon = sweapon; + + if ( !isdefined( self.attackerdamage[eattacker.clientid].time ) ) + self.attackerdamage[eattacker.clientid].time = gettime(); + } + + self.attackerdamage[eattacker.clientid].lasttimedamaged = gettime(); + + if ( maps\mp\gametypes\_weapons::isprimaryweapon( sweapon ) ) + self.attackerdata[eattacker.clientid] = 1; } -giveinflictorownerassist( eattacker, einflictor, idamage, smeansofdeath, sweapon ) //checked matches cerberus output +giveinflictorownerassist( eattacker, einflictor, idamage, smeansofdeath, sweapon ) { - if ( !isDefined( einflictor ) ) - { - return; - } - if ( !isDefined( einflictor.owner ) ) - { - return; - } - if ( !isDefined( einflictor.ownergetsassist ) ) - { - return; - } - if ( !einflictor.ownergetsassist ) - { - return; - } - /* + if ( !isdefined( einflictor ) ) + return; + + if ( !isdefined( einflictor.owner ) ) + return; + + if ( !isdefined( einflictor.ownergetsassist ) ) + return; + + if ( !einflictor.ownergetsassist ) + return; + /# - assert( isplayer( einflictor.owner ) ); + assert( isplayer( einflictor.owner ) ); #/ - */ - self trackattackerdamage( einflictor.owner, idamage, smeansofdeath, sweapon ); + self trackattackerdamage( einflictor.owner, idamage, smeansofdeath, sweapon ); } -playerkilled_updatemeansofdeath( attacker, einflictor, sweapon, smeansofdeath, shitloc ) //checked matches cerberus output +playerkilled_updatemeansofdeath( attacker, einflictor, sweapon, smeansofdeath, shitloc ) { - if ( maps/mp/gametypes/_globallogic_utils::isheadshot( sweapon, shitloc, smeansofdeath, einflictor ) && isplayer( attacker ) ) - { - return "MOD_HEAD_SHOT"; - } - switch( sweapon ) - { - case "crossbow_mp": - case "knife_ballistic_mp": - if ( smeansofdeath != "MOD_HEAD_SHOT" && smeansofdeath != "MOD_MELEE" ) - { - smeansofdeath = "MOD_PISTOL_BULLET"; - } - break; - case "dog_bite_mp": - smeansofdeath = "MOD_PISTOL_BULLET"; - break; - case "destructible_car_mp": - smeansofdeath = "MOD_EXPLOSIVE"; - break; - case "explodable_barrel_mp": - smeansofdeath = "MOD_EXPLOSIVE"; - break; - } - return smeansofdeath; + if ( maps\mp\gametypes\_globallogic_utils::isheadshot( sweapon, shitloc, smeansofdeath, einflictor ) && isplayer( attacker ) ) + return "MOD_HEAD_SHOT"; + + switch ( sweapon ) + { + case "knife_ballistic_mp": + case "crossbow_mp": + if ( smeansofdeath != "MOD_HEAD_SHOT" && smeansofdeath != "MOD_MELEE" ) + smeansofdeath = "MOD_PISTOL_BULLET"; + + break; + case "dog_bite_mp": + smeansofdeath = "MOD_PISTOL_BULLET"; + break; + case "destructible_car_mp": + smeansofdeath = "MOD_EXPLOSIVE"; + break; + case "explodable_barrel_mp": + smeansofdeath = "MOD_EXPLOSIVE"; + break; + } + + return smeansofdeath; } -updateattacker( attacker, weapon ) //checked changed to match cerberus output +updateattacker( attacker, weapon ) { - if ( isai( attacker ) && isDefined( attacker.script_owner ) ) - { - if ( !level.teambased || attacker.script_owner.team != self.team ) - { - attacker = attacker.script_owner; - } - } - if ( attacker.classname == "script_vehicle" && isDefined( attacker.owner ) ) - { - attacker notify( "killed", self ); - attacker = attacker.owner; - } - if ( isai( attacker ) ) - { - attacker notify( "killed", self ); - } - if ( isDefined( self.capturinglastflag ) && self.capturinglastflag == 1 ) - { - attacker.lastcapkiller = 1; - } - if ( isDefined( attacker ) && isDefined( weapon ) && weapon == "planemortar_mp" ) - { - if ( !isDefined( attacker.planemortarbda ) ) - { - attacker.planemortarbda = 0; - } - attacker.planemortarbda++; - } - if ( isDefined( attacker ) && isDefined( weapon ) && weapon == "straferun_rockets_mp" || weapon == "straferun_gun_mp" ) - { - if ( isDefined( attacker.straferunbda ) ) - { - attacker.straferunbda++; - } - } - return attacker; + if ( isai( attacker ) && isdefined( attacker.script_owner ) ) + { + if ( !level.teambased || attacker.script_owner.team != self.team ) + attacker = attacker.script_owner; + } + + if ( attacker.classname == "script_vehicle" && isdefined( attacker.owner ) ) + { + attacker notify( "killed", self ); + attacker = attacker.owner; + } + + if ( isai( attacker ) ) + attacker notify( "killed", self ); + + if ( isdefined( self.capturinglastflag ) && self.capturinglastflag == 1 ) + attacker.lastcapkiller = 1; + + if ( isdefined( attacker ) && isdefined( weapon ) && weapon == "planemortar_mp" ) + { + if ( !isdefined( attacker.planemortarbda ) ) + attacker.planemortarbda = 0; + + attacker.planemortarbda++; + } + + if ( isdefined( attacker ) && isdefined( weapon ) && ( weapon == "straferun_rockets_mp" || weapon == "straferun_gun_mp" ) ) + { + if ( isdefined( attacker.straferunbda ) ) + attacker.straferunbda++; + } + + return attacker; } -updateinflictor( einflictor ) //checked changed to match cerberus output +updateinflictor( einflictor ) { - if ( isDefined( einflictor ) && einflictor.classname == "script_vehicle" ) - { - einflictor notify( "killed", self ); - if ( isDefined( einflictor.bda ) ) - { - einflictor.bda++; - } - } - return einflictor; + if ( isdefined( einflictor ) && einflictor.classname == "script_vehicle" ) + { + einflictor notify( "killed", self ); + + if ( isdefined( einflictor.bda ) ) + einflictor.bda++; + } + + return einflictor; } -updateweapon( einflictor, sweapon ) //checked changed to match cerberus output +updateweapon( einflictor, sweapon ) { - 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"; - } - } - return sweapon; + 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"; + } + + return sweapon; } -getclosestkillcamentity( attacker, killcamentities, depth ) //checked partially changed to match cerberus output see info.md +getclosestkillcamentity( attacker, killcamentities, depth ) { - if ( !isDefined( depth ) ) - { - depth = 0; - } - closestkillcament = undefined; - closestkillcamentindex = undefined; - closestkillcamentdist = undefined; - origin = undefined; - foreach ( killcament in killcamentities ) - { - if ( killcament == attacker ) - { - } - else - { - origin = killcament.origin; - if ( isDefined( killcament.offsetpoint ) ) - { - origin += killcament.offsetpoint; - } - dist = distancesquared( self.origin, origin ); - if ( !isDefined( closestkillcament ) || dist < closestkillcamentdist ) - { - closestkillcament = killcament; - closestkillcamentdist = dist; - closestkillcamentindex = killcamentindex; - } - } - } - if ( depth < 3 && isDefined( closestkillcament ) ) - { - if ( !bullettracepassed( closestkillcament.origin, self.origin, 0, self ) ) - { - betterkillcament = getclosestkillcamentity( attacker, killcamentities, depth + 1 ); - if ( isDefined( betterkillcament ) ) - { - closestkillcament = betterkillcament; - } - } - } - return closestkillcament; + if ( !isdefined( depth ) ) + depth = 0; + + closestkillcament = undefined; + closestkillcamentindex = undefined; + closestkillcamentdist = undefined; + origin = undefined; + + foreach ( killcamentindex, killcament in killcamentities ) + { + if ( killcament == attacker ) + continue; + + origin = killcament.origin; + + if ( isdefined( killcament.offsetpoint ) ) + origin += killcament.offsetpoint; + + dist = distancesquared( self.origin, origin ); + + if ( !isdefined( closestkillcament ) || dist < closestkillcamentdist ) + { + closestkillcament = killcament; + closestkillcamentdist = dist; + closestkillcamentindex = killcamentindex; + } + } + + if ( depth < 3 && isdefined( closestkillcament ) ) + { + if ( !bullettracepassed( closestkillcament.origin, self.origin, 0, self ) ) + { + killcamentities[closestkillcamentindex] = undefined; + betterkillcament = getclosestkillcamentity( attacker, killcamentities, depth + 1 ); + + if ( isdefined( betterkillcament ) ) + closestkillcament = betterkillcament; + } + } + + return closestkillcament; } -getkillcamentity( attacker, einflictor, sweapon ) //checked changed to match cerberus output +getkillcamentity( attacker, einflictor, sweapon ) { - if ( !isDefined( einflictor ) ) - { - return undefined; - } - if ( einflictor == attacker ) - { - if ( !isDefined( einflictor.ismagicbullet ) ) - { - return undefined; - } - if ( !is_true( einflictor.ismagicbullet ) ) - { - return undefined; - } - } - else if ( isDefined( level.levelspecifickillcam ) ) - { - levelspecifickillcament = self [[ level.levelspecifickillcam ]](); - if ( isDefined( levelspecifickillcament ) ) - { - return levelspecifickillcament; - } - } - if ( sweapon == "m220_tow_mp" ) - { - return undefined; - } - if ( isDefined( einflictor.killcament ) ) - { - if ( einflictor.killcament == attacker ) - { - return undefined; - } - return einflictor.killcament; - } - else if ( isDefined( einflictor.killcamentities ) ) - { - return getclosestkillcamentity( attacker, einflictor.killcamentities ); - } - if ( isDefined( einflictor.script_gameobjectname ) && einflictor.script_gameobjectname == "bombzone" ) - { - return einflictor.killcament; - } - return einflictor; + if ( !isdefined( einflictor ) ) + return undefined; + + if ( einflictor == attacker ) + { + if ( !isdefined( einflictor.ismagicbullet ) ) + return undefined; + + if ( isdefined( einflictor.ismagicbullet ) && !einflictor.ismagicbullet ) + return undefined; + } + else if ( isdefined( level.levelspecifickillcam ) ) + { + levelspecifickillcament = self [[ level.levelspecifickillcam ]](); + + if ( isdefined( levelspecifickillcament ) ) + return levelspecifickillcament; + } + + if ( sweapon == "m220_tow_mp" ) + return undefined; + + if ( isdefined( einflictor.killcament ) ) + { + if ( einflictor.killcament == attacker ) + return undefined; + + return einflictor.killcament; + } + else if ( isdefined( einflictor.killcamentities ) ) + return getclosestkillcamentity( attacker, einflictor.killcamentities ); + + if ( isdefined( einflictor.script_gameobjectname ) && einflictor.script_gameobjectname == "bombzone" ) + return einflictor.killcament; + + return einflictor; } -playkillbattlechatter( attacker, sweapon, victim ) //checked matches cerberus output +playkillbattlechatter( attacker, sweapon, victim ) { - if ( isplayer( attacker ) ) - { - if ( !maps/mp/killstreaks/_killstreaks::iskillstreakweapon( sweapon ) ) - { - level thread maps/mp/gametypes/_battlechatter_mp::saykillbattlechatter( attacker, sweapon, victim ); - } - } + if ( isplayer( attacker ) ) + { + if ( !maps\mp\killstreaks\_killstreaks::iskillstreakweapon( sweapon ) ) + level thread maps\mp\gametypes\_battlechatter_mp::saykillbattlechatter( attacker, sweapon, victim ); + } } - - diff --git a/Multiplayer Core/patch_mp/maps/mp/gametypes/_globallogic_score.gsc b/Multiplayer Core/patch_mp/maps/mp/gametypes/_globallogic_score.gsc index be500f4..4535a1d 100644 --- a/Multiplayer Core/patch_mp/maps/mp/gametypes/_globallogic_score.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/gametypes/_globallogic_score.gsc @@ -1,1474 +1,1360 @@ -//checked includes match cerberus output -#include maps/mp/bots/_bot; -#include maps/mp/gametypes/_globallogic_audio; -#include maps/mp/gametypes/_globallogic_score; -#include maps/mp/_challenges; -#include maps/mp/gametypes/_class; -#include maps/mp/killstreaks/_killstreak_weapons; -#include maps/mp/killstreaks/_killstreaks; -#include maps/mp/gametypes/_globallogic; -#include maps/mp/gametypes/_wager; -#include maps/mp/gametypes/_persistence; -#include maps/mp/_bb; -#include maps/mp/_scoreevents; -#include maps/mp/gametypes/_rank; -#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 -updatematchbonusscores( winner ) //checked partially changed to match beta dump see info.md +updatematchbonusscores( winner ) { - if ( !game[ "timepassed" ] ) - { - return; - } - if ( !level.rankedmatch ) - { - return; - } - if ( level.teambased && isDefined( winner ) ) - { - if ( winner == "endregulation" ) - { - return; - } - } - if ( !level.timelimit || level.forcedend ) - { - gamelength = maps/mp/gametypes/_globallogic_utils::gettimepassed() / 1000; - gamelength = min( gamelength, 1200 ); - if ( level.gametype == "twar" && game[ "roundsplayed" ] > 0 ) - { - gamelength += level.timelimit * 60; - } - } - else - { - gamelength = level.timelimit * 60; - } - if ( level.teambased ) - { - winningteam = "tie"; - foreach ( team in level.teams ) - { - if ( winner == team ) - { - winningteam = team; - break; - } - } - if ( winningteam != "tie" ) - { - winnerscale = 1; - loserscale = 0.5; - } - else - { - winnerscale = 0.75; - loserscale = 0.75; - } - players = level.players; - i = 0; - while ( i < players.size ) - { - player = players[ i ]; - if ( player.timeplayed[ "total" ] < 1 || player.pers[ "participation" ] < 1 ) - { - player thread maps/mp/gametypes/_rank::endgameupdate(); - i++; - continue; - } - totaltimeplayed = player.timeplayed[ "total" ]; - if ( totaltimeplayed > gamelength ) - { - totaltimeplayed = gamelength; - } - if ( level.hostforcedend && player ishost() ) - { - i++; - continue; - } - if ( player.pers[ "score" ] < 0 ) - { - i++; - continue; - } - spm = player maps/mp/gametypes/_rank::getspm(); - if ( winningteam == "tie" ) - { - playerscore = int( ( winnerscale * ( gamelength / 60 ) * spm ) * ( totaltimeplayed / gamelength ) ); - player thread givematchbonus( "tie", playerscore ); - player.matchbonus = playerscore; - i++; - continue; - } - if ( isDefined( player.pers[ "team" ] ) && player.pers[ "team" ] == winningteam ) - { - playerscore = int( ( winnerscale * ( gamelength / 60 ) * spm ) * ( totaltimeplayed / gamelength ) ); - player thread givematchbonus( "win", playerscore ); - player.matchbonus = playerscore; - i++; - continue; - } - if ( isDefined( player.pers[ "team" ] ) && player.pers[ "team" ] != "spectator" ) - { - playerscore = int( ( loserscale * ( gamelength / 60 ) * spm ) * ( totaltimeplayed / gamelength ) ); - player thread givematchbonus( "loss", playerscore ); - player.matchbonus = playerscore; - } - i++; - } - } - else - { - if ( isDefined( winner ) ) - { - winnerscale = 1; - loserscale = 0.5; - } - else - { - winnerscale = 0.75; - loserscale = 0.75; - } - players = level.players; - i = 0; - while ( i < players.size ) - { - player = players[ i ]; - if ( player.timeplayed[ "total" ] < 1 || player.pers[ "participation" ] < 1 ) - { - player thread maps/mp/gametypes/_rank::endgameupdate(); - i++; - continue; - } - totaltimeplayed = player.timeplayed[ "total" ]; - if ( totaltimeplayed > gamelength ) - { - totaltimeplayed = gamelength; - } - spm = player maps/mp/gametypes/_rank::getspm(); - iswinner = 0; - for ( pidx = 0; pidx < min(level.placement[ "all" ][ 0 ].size, 3 ); pidx++ ) - { - if ( level.placement[ "all" ][ pidx ] != player ) - { - } - else - { - iswinner = 1; - } - } - if ( iswinner ) - { - playerscore = int( ( winnerscale * ( gamelength / 60 ) * spm ) * ( totaltimeplayed / gamelength ) ); - player thread givematchbonus( "win", playerscore ); - player.matchbonus = playerscore; - i++; - continue; - } - playerscore = int( ( loserscale * ( gamelength / 60 ) * spm ) * ( totaltimeplayed / gamelength ) ); - player thread givematchbonus( "loss", playerscore ); - player.matchbonus = playerscore; - i++; - } - } + if ( !game["timepassed"] ) + return; + + if ( !level.rankedmatch ) + return; + + if ( level.teambased && isdefined( winner ) ) + { + if ( winner == "endregulation" ) + return; + } + + if ( !level.timelimit || level.forcedend ) + { + gamelength = maps\mp\gametypes\_globallogic_utils::gettimepassed() / 1000; + gamelength = min( gamelength, 1200 ); + + if ( level.gametype == "twar" && game["roundsplayed"] > 0 ) + gamelength += level.timelimit * 60; + } + else + gamelength = level.timelimit * 60; + + if ( level.teambased ) + { + winningteam = "tie"; + + foreach ( team in level.teams ) + { + if ( winner == team ) + { + winningteam = team; + break; + } + } + + if ( winningteam != "tie" ) + { + winnerscale = 1.0; + loserscale = 0.5; + } + else + { + winnerscale = 0.75; + loserscale = 0.75; + } + + players = level.players; + + for ( i = 0; i < players.size; i++ ) + { + player = players[i]; + + if ( player.timeplayed["total"] < 1 || player.pers["participation"] < 1 ) + { + player thread maps\mp\gametypes\_rank::endgameupdate(); + continue; + } + + totaltimeplayed = player.timeplayed["total"]; + + if ( totaltimeplayed > gamelength ) + totaltimeplayed = gamelength; + + if ( level.hostforcedend && player ishost() ) + continue; + + if ( player.pers["score"] < 0 ) + continue; + + spm = player maps\mp\gametypes\_rank::getspm(); + + if ( winningteam == "tie" ) + { + playerscore = int( winnerscale * ( gamelength / 60 * spm ) * totaltimeplayed / gamelength ); + player thread givematchbonus( "tie", playerscore ); + player.matchbonus = playerscore; + continue; + } + + if ( isdefined( player.pers["team"] ) && player.pers["team"] == winningteam ) + { + playerscore = int( winnerscale * ( gamelength / 60 * spm ) * totaltimeplayed / gamelength ); + player thread givematchbonus( "win", playerscore ); + player.matchbonus = playerscore; + continue; + } + + if ( isdefined( player.pers["team"] ) && player.pers["team"] != "spectator" ) + { + playerscore = int( loserscale * ( gamelength / 60 * spm ) * totaltimeplayed / gamelength ); + player thread givematchbonus( "loss", playerscore ); + player.matchbonus = playerscore; + } + } + } + else + { + if ( isdefined( winner ) ) + { + winnerscale = 1.0; + loserscale = 0.5; + } + else + { + winnerscale = 0.75; + loserscale = 0.75; + } + + players = level.players; + + for ( i = 0; i < players.size; i++ ) + { + player = players[i]; + + if ( player.timeplayed["total"] < 1 || player.pers["participation"] < 1 ) + { + player thread maps\mp\gametypes\_rank::endgameupdate(); + continue; + } + + totaltimeplayed = player.timeplayed["total"]; + + if ( totaltimeplayed > gamelength ) + totaltimeplayed = gamelength; + + spm = player maps\mp\gametypes\_rank::getspm(); + iswinner = 0; + + for ( pidx = 0; pidx < min( level.placement["all"][0].size, 3 ); pidx++ ) + { + if ( level.placement["all"][pidx] != player ) + continue; + + iswinner = 1; + } + + if ( iswinner ) + { + playerscore = int( winnerscale * ( gamelength / 60 * spm ) * totaltimeplayed / gamelength ); + player thread givematchbonus( "win", playerscore ); + player.matchbonus = playerscore; + continue; + } + + playerscore = int( loserscale * ( gamelength / 60 * spm ) * totaltimeplayed / gamelength ); + player thread givematchbonus( "loss", playerscore ); + player.matchbonus = playerscore; + } + } } -givematchbonus( scoretype, score ) //checked matches cerberus output +givematchbonus( scoretype, score ) { - self endon( "disconnect" ); - level waittill( "give_match_bonus" ); - if ( maps/mp/_scoreevents::shouldaddrankxp( self ) ) - { - self addrankxpvalue( scoretype, score ); - } - self maps/mp/gametypes/_rank::endgameupdate(); + self endon( "disconnect" ); + + level waittill( "give_match_bonus" ); + + if ( maps\mp\_scoreevents::shouldaddrankxp( self ) ) + self addrankxpvalue( scoretype, score ); + + self maps\mp\gametypes\_rank::endgameupdate(); } -doskillupdate( winner ) //checked matches cerberus output +doskillupdate( winner ) { - skillupdate( winner, level.teambased ); + skillupdate( winner, level.teambased ); } -gethighestscoringplayer() //checked partially changed to match cerberus output see info.md +gethighestscoringplayer() { - players = level.players; - winner = undefined; - tie = 0; - i = 0; - while ( i < players.size ) - { - if ( !isDefined( players[ i ].pointstowin ) ) - { - i++; - continue; - } - if ( players[ i ].pointstowin < 1 ) - { - i++; - continue; - } - if ( !isDefined( winner ) || players[ i ].pointstowin > winner.pointstowin ) - { - winner = players[ i ]; - tie = 0; - i++; - continue; - } - if ( players[ i ].pointstowin == winner.pointstowin ) - { - tie = 1; - } - i++; - } - if ( tie || !isDefined( winner ) ) - { - return undefined; - } - else - { - return winner; - } + players = level.players; + winner = undefined; + tie = 0; + + for ( i = 0; i < players.size; i++ ) + { + if ( !isdefined( players[i].pointstowin ) ) + continue; + + if ( players[i].pointstowin < 1 ) + continue; + + if ( !isdefined( winner ) || players[i].pointstowin > winner.pointstowin ) + { + winner = players[i]; + tie = 0; + continue; + } + + if ( players[i].pointstowin == winner.pointstowin ) + tie = 1; + } + + if ( tie || !isdefined( winner ) ) + return undefined; + else + return winner; } -resetscorechain() //checked matches cerberus output +resetscorechain() { - self notify( "reset_score_chain" ); - self.scorechain = 0; - self.rankupdatetotal = 0; + self notify( "reset_score_chain" ); + self.scorechain = 0; + self.rankupdatetotal = 0; } -scorechaintimer() //checked matches cerberus output +scorechaintimer() { - self notify( "score_chain_timer" ); - self endon( "reset_score_chain" ); - self endon( "score_chain_timer" ); - self endon( "death" ); - self endon( "disconnect" ); - wait 20; - self thread resetscorechain(); + self notify( "score_chain_timer" ); + self endon( "reset_score_chain" ); + self endon( "score_chain_timer" ); + self endon( "death" ); + self endon( "disconnect" ); + wait 20; + self thread resetscorechain(); } -roundtonearestfive( score ) //checked matches cerberus output +roundtonearestfive( score ) { - rounding = score % 5; - if ( rounding <= 2 ) - { - return score - rounding; - } - else - { - return score + ( 5 - rounding ); - } + rounding = score % 5; + + if ( rounding <= 2 ) + return score - rounding; + else + return score + 5 - rounding; } -giveplayermomentumnotification( score, label, descvalue, countstowardrampage ) //checked matches cerberus output +giveplayermomentumnotification( score, label, descvalue, countstowardrampage ) { - rampagebonus = 0; - if ( is_true( level.usingrampage ) ) - { - if ( countstowardrampage ) - { - if ( !isDefined( self.scorechain ) ) - { - self.scorechain = 0; - } - self.scorechain++; - self thread scorechaintimer(); - } - if ( isDefined( self.scorechain ) && self.scorechain >= 999 ) - { - rampagebonus = roundtonearestfive( int( ( score * level.rampagebonusscale ) + 0.5 ) ); - } - } - if ( score != 0 ) - { - self luinotifyevent( &"score_event", 3, label, score, rampagebonus ); - self luinotifyeventtospectators( &"score_event", 3, label, score, rampagebonus ); - } - score += rampagebonus; - if ( score > 0 && self hasperk( "specialty_earnmoremomentum" ) ) - { - score = roundtonearestfive( int( ( score * getDvarFloat( "perk_killstreakMomentumMultiplier" ) ) + 0.5 ) ); - } - if ( isalive( self ) ) - { - _setplayermomentum( self, self.pers[ "momentum" ] + score ); - } + rampagebonus = 0; + + if ( isdefined( level.usingrampage ) && level.usingrampage ) + { + if ( countstowardrampage ) + { + if ( !isdefined( self.scorechain ) ) + self.scorechain = 0; + + self.scorechain++; + self thread scorechaintimer(); + } + + if ( isdefined( self.scorechain ) && self.scorechain >= 999 ) + rampagebonus = roundtonearestfive( int( score * level.rampagebonusscale + 0.5 ) ); + } + + if ( score != 0 ) + { + self luinotifyevent( &"score_event", 3, label, score, rampagebonus ); + self luinotifyeventtospectators( &"score_event", 3, label, score, rampagebonus ); + } + + score += rampagebonus; + + if ( score > 0 && self hasperk( "specialty_earnmoremomentum" ) ) + score = roundtonearestfive( int( score * getdvarfloat( "perk_killstreakMomentumMultiplier" ) + 0.5 ) ); + + if ( isalive( self ) ) + _setplayermomentum( self, self.pers["momentum"] + score ); } -resetplayermomentumonspawn() //checked matches cerberus output +resetplayermomentumonspawn() { - if ( is_true( level.usingscorestreaks ) ) - { - _setplayermomentum( self, 0 ); - self thread resetscorechain(); - } + if ( isdefined( level.usingscorestreaks ) && level.usingscorestreaks ) + { + _setplayermomentum( self, 0 ); + self thread resetscorechain(); + } } -giveplayermomentum( event, player, victim, weapon, descvalue ) //checked matches cerberus output +giveplayermomentum( event, player, victim, weapon, descvalue ) { - if ( isDefined( level.disablemomentum ) && level.disablemomentum == 1 ) - { - return; - } - score = maps/mp/gametypes/_rank::getscoreinfovalue( event ); - /* + if ( isdefined( level.disablemomentum ) && level.disablemomentum == 1 ) + return; + + score = maps\mp\gametypes\_rank::getscoreinfovalue( event ); /# - assert( isDefined( score ) ); + assert( isdefined( score ) ); #/ - */ - label = maps/mp/gametypes/_rank::getscoreinfolabel( event ); - countstowardrampage = maps/mp/gametypes/_rank::doesscoreinfocounttowardrampage( event ); - if ( event == "death" ) - { - _setplayermomentum( victim, victim.pers[ "momentum" ] + score ); - } - if ( score == 0 ) - { - return; - } - if ( !isDefined( label ) ) - { - /* + label = maps\mp\gametypes\_rank::getscoreinfolabel( event ); + countstowardrampage = maps\mp\gametypes\_rank::doesscoreinfocounttowardrampage( event ); + + if ( event == "death" ) + _setplayermomentum( victim, victim.pers["momentum"] + score ); + + if ( score == 0 ) + return; + + if ( !isdefined( label ) ) + { /# - assertmsg( event + " label undefined" ); + assertmsg( event + " label undefined" ); #/ - */ - player giveplayermomentumnotification( score, "", descvalue, countstowardrampage ); - return; - } - if ( level.gameended ) - { - return; - } - player giveplayermomentumnotification( score, label, descvalue, countstowardrampage ); + player giveplayermomentumnotification( score, "", descvalue, countstowardrampage ); + return; + } + + if ( level.gameended ) + return; + + player giveplayermomentumnotification( score, label, descvalue, countstowardrampage ); } -giveplayerscore( event, player, victim, weapon, descvalue ) //checked matches cerberus output +giveplayerscore( event, player, victim, weapon, descvalue ) { - scorediff = 0; - momentum = player.pers[ "momentum" ]; - giveplayermomentum( event, player, victim, weapon, descvalue ); - newmomentum = player.pers[ "momentum" ]; - if ( level.overrideplayerscore ) - { - return 0; - } - pixbeginevent( "level.onPlayerScore" ); - score = player.pers[ "score" ]; - [[ level.onplayerscore ]]( event, player, victim ); - newscore = player.pers[ "score" ]; - pixendevent(); - bbprint( "mpplayerscore", "spawnid %d gametime %d type %s player %s delta %d deltamomentum %d team %s", getplayerspawnid( player ), getTime(), event, player.name, newscore - score, newmomentum - momentum, player.team ); - player maps/mp/_bb::bbaddtostat( "score", newscore - score ); - if ( score == newscore ) - { - return 0; - } - pixbeginevent( "givePlayerScore" ); - recordplayerstats( player, "score", newscore ); - scorediff = newscore - score; - challengesenabled = !level.disablechallenges; - player addplayerstatwithgametype( "score", scorediff ); - if ( challengesenabled ) - { - player addplayerstat( "CAREER_SCORE", scorediff ); - } - if ( level.hardcoremode ) - { - player addplayerstat( "SCORE_HC", scorediff ); - if ( challengesenabled ) - { - player addplayerstat( "CAREER_SCORE_HC", scorediff ); - } - } - if ( level.multiteam ) - { - player addplayerstat( "SCORE_MULTITEAM", scorediff ); - if ( challengesenabled ) - { - player addplayerstat( "CAREER_SCORE_MULTITEAM", scorediff ); - } - } - if ( !level.disablestattracking && isDefined( player.pers[ "lastHighestScore" ] ) && newscore > player.pers[ "lastHighestScore" ] ) - { - player setdstat( "HighestStats", "highest_score", newscore ); - } - player maps/mp/gametypes/_persistence::addrecentstat( 0, 0, "score", scorediff ); - pixendevent(); - return scorediff; + scorediff = 0; + momentum = player.pers["momentum"]; + giveplayermomentum( event, player, victim, weapon, descvalue ); + newmomentum = player.pers["momentum"]; + + if ( level.overrideplayerscore ) + return 0; + + pixbeginevent( "level.onPlayerScore" ); + score = player.pers["score"]; + [[ level.onplayerscore ]]( event, player, victim ); + newscore = player.pers["score"]; + pixendevent(); + bbprint( "mpplayerscore", "spawnid %d gametime %d type %s player %s delta %d deltamomentum %d team %s", getplayerspawnid( player ), gettime(), event, player.name, newscore - score, newmomentum - momentum, player.team ); + player maps\mp\_bb::bbaddtostat( "score", newscore - score ); + + if ( score == newscore ) + return 0; + + pixbeginevent( "givePlayerScore" ); + recordplayerstats( player, "score", newscore ); + scorediff = newscore - score; + challengesenabled = !level.disablechallenges; + player addplayerstatwithgametype( "score", scorediff ); + + if ( challengesenabled ) + player addplayerstat( "CAREER_SCORE", scorediff ); + + if ( level.hardcoremode ) + { + player addplayerstat( "SCORE_HC", scorediff ); + + if ( challengesenabled ) + player addplayerstat( "CAREER_SCORE_HC", scorediff ); + } + + if ( level.multiteam ) + { + player addplayerstat( "SCORE_MULTITEAM", scorediff ); + + if ( challengesenabled ) + player addplayerstat( "CAREER_SCORE_MULTITEAM", scorediff ); + } + + if ( !level.disablestattracking && isdefined( player.pers["lastHighestScore"] ) && newscore > player.pers["lastHighestScore"] ) + player setdstat( "HighestStats", "highest_score", newscore ); + + player maps\mp\gametypes\_persistence::addrecentstat( 0, 0, "score", scorediff ); + pixendevent(); + return scorediff; } -default_onplayerscore( event, player, victim ) //checked matches cerberus output +default_onplayerscore( event, player, victim ) { - score = maps/mp/gametypes/_rank::getscoreinfovalue( event ); - /* + score = maps\mp\gametypes\_rank::getscoreinfovalue( event ); /# - assert( isDefined( score ) ); + assert( isdefined( score ) ); #/ - */ - if ( level.wagermatch ) - { - player thread maps/mp/gametypes/_rank::updaterankscorehud( score ); - } - _setplayerscore( player, player.pers[ "score" ] + score ); + + if ( level.wagermatch ) + player thread maps\mp\gametypes\_rank::updaterankscorehud( score ); + + _setplayerscore( player, player.pers["score"] + score ); } -_setplayerscore( player, score ) //checked matches cerberus output +_setplayerscore( player, score ) { - if ( score == player.pers[ "score" ] ) - { - return; - } - if ( !level.rankedmatch ) - { - player thread maps/mp/gametypes/_rank::updaterankscorehud( score - player.pers[ "score" ] ); - } - player.pers[ "score" ] = score; - player.score = player.pers[ "score" ]; - recordplayerstats( player, "score", player.pers[ "score" ] ); - if ( level.wagermatch ) - { - player thread maps/mp/gametypes/_wager::playerscored(); - } + if ( score == player.pers["score"] ) + return; + + if ( !level.rankedmatch ) + player thread maps\mp\gametypes\_rank::updaterankscorehud( score - player.pers["score"] ); + + player.pers["score"] = score; + player.score = player.pers["score"]; + recordplayerstats( player, "score", player.pers["score"] ); + + if ( level.wagermatch ) + player thread maps\mp\gametypes\_wager::playerscored(); } -_getplayerscore( player ) //checked matches cerberus output +_getplayerscore( player ) { - return player.pers[ "score" ]; + return player.pers["score"]; } -playtop3sounds() //checked changed to match cerberus output +playtop3sounds() { - wait 0.05; - maps/mp/gametypes/_globallogic::updateplacement(); - for ( i = 0; i < level.placement[ "all" ].size; i++ ) - { - prevscoreplace = level.placement[ "all" ][ i ].prevscoreplace; - if ( !isDefined( prevscoreplace ) ) - { - prevscoreplace = 1; - } - currentscoreplace = i + 1; - for ( j = i - 1; j >= 0; j-- ) - { - if ( level.placement[ "all" ][ i ].score == level.placement[ "all" ][ j ].score ) - { - currentscoreplace--; - } - } - wasinthemoney = prevscoreplace <= 3; - isinthemoney = currentscoreplace <= 3; - level.placement[ "all" ][ i ].prevscoreplace = currentscoreplace; - } + wait 0.05; + maps\mp\gametypes\_globallogic::updateplacement(); + + for ( i = 0; i < level.placement["all"].size; i++ ) + { + prevscoreplace = level.placement["all"][i].prevscoreplace; + + if ( !isdefined( prevscoreplace ) ) + prevscoreplace = 1; + + currentscoreplace = i + 1; + + for ( j = i - 1; j >= 0; j-- ) + { + if ( level.placement["all"][i].score == level.placement["all"][j].score ) + currentscoreplace--; + } + + wasinthemoney = prevscoreplace <= 3; + isinthemoney = currentscoreplace <= 3; + level.placement["all"][i].prevscoreplace = currentscoreplace; + } } -setpointstowin( points ) //checked matches cerberus output +setpointstowin( points ) { - self.pers[ "pointstowin" ] = clamp( points, 0, 65000 ); - self.pointstowin = self.pers[ "pointstowin" ]; - self thread maps/mp/gametypes/_globallogic::checkscorelimit(); - self thread maps/mp/gametypes/_globallogic::checkplayerscorelimitsoon(); - level thread playtop3sounds(); + self.pers["pointstowin"] = clamp( points, 0, 65000 ); + self.pointstowin = self.pers["pointstowin"]; + self thread maps\mp\gametypes\_globallogic::checkscorelimit(); + self thread maps\mp\gametypes\_globallogic::checkplayerscorelimitsoon(); + level thread playtop3sounds(); } -givepointstowin( points ) //checked matches cerberus output +givepointstowin( points ) { - self setpointstowin( self.pers[ "pointstowin" ] + points ); + self setpointstowin( self.pers["pointstowin"] + points ); } -_setplayermomentum( player, momentum ) //checked changed to match cerberus output +_setplayermomentum( player, momentum ) { - momentum = clamp( momentum, 0, 2000 ); - oldmomentum = player.pers[ "momentum" ]; - if ( momentum == oldmomentum ) - { - return; - } - player maps/mp/_bb::bbaddtostat( "momentum", momentum - oldmomentum ); - if ( momentum > oldmomentum ) - { - highestmomentumcost = 0; - numkillstreaks = 0; - if ( isDefined( player.killstreak ) ) - { - numkillstreaks = player.killstreak.size; - } - killstreaktypearray = []; - for ( currentkillstreak = 0; currentkillstreak < numkillstreaks; currentkillstreak++ ) - { - killstreaktype = maps/mp/killstreaks/_killstreaks::getkillstreakbymenuname( player.killstreak[ currentkillstreak ] ); - if ( isDefined( killstreaktype ) ) - { - momentumcost = level.killstreaks[ killstreaktype ].momentumcost; - if ( momentumcost > highestmomentumcost ) - { - highestmomentumcost = momentumcost; - } - killstreaktypearray[ killstreaktypearray.size ] = killstreaktype; - } - } - _giveplayerkillstreakinternal( player, momentum, oldmomentum, killstreaktypearray ); - while ( highestmomentumcost > 0 && momentum >= highestmomentumcost ) - { - oldmomentum = 0; - momentum -= highestmomentumcost; - _giveplayerkillstreakinternal( player, momentum, oldmomentum, killstreaktypearray ); - } - } - player.pers[ "momentum" ] = momentum; - player.momentum = player.pers[ "momentum" ]; + momentum = clamp( momentum, 0, 2000 ); + oldmomentum = player.pers["momentum"]; + + if ( momentum == oldmomentum ) + return; + + player maps\mp\_bb::bbaddtostat( "momentum", momentum - oldmomentum ); + + if ( momentum > oldmomentum ) + { + highestmomentumcost = 0; + numkillstreaks = 0; + + if ( isdefined( player.killstreak ) ) + numkillstreaks = player.killstreak.size; + + killstreaktypearray = []; + + for ( currentkillstreak = 0; currentkillstreak < numkillstreaks; currentkillstreak++ ) + { + killstreaktype = maps\mp\killstreaks\_killstreaks::getkillstreakbymenuname( player.killstreak[currentkillstreak] ); + + if ( isdefined( killstreaktype ) ) + { + momentumcost = level.killstreaks[killstreaktype].momentumcost; + + if ( momentumcost > highestmomentumcost ) + highestmomentumcost = momentumcost; + + killstreaktypearray[killstreaktypearray.size] = killstreaktype; + } + } + + _giveplayerkillstreakinternal( player, momentum, oldmomentum, killstreaktypearray ); + + while ( highestmomentumcost > 0 && momentum >= highestmomentumcost ) + { + oldmomentum = 0; + momentum -= highestmomentumcost; + _giveplayerkillstreakinternal( player, momentum, oldmomentum, killstreaktypearray ); + } + } + + player.pers["momentum"] = momentum; + player.momentum = player.pers["momentum"]; } -_giveplayerkillstreakinternal( player, momentum, oldmomentum, killstreaktypearray ) //checked changed to match beta dump +_giveplayerkillstreakinternal( player, momentum, oldmomentum, killstreaktypearray ) { - for ( killstreaktypeindex = 0; killstreaktypeindex < killstreaktypearray.size; killstreaktypeindex++ ) - { - killstreaktype = killstreaktypearray[ killstreaktypeindex ]; - momentumcost = level.killstreaks[ killstreaktype ].momentumcost; - if ( momentumcost > oldmomentum && momentumcost <= momentum ) - { - weapon = maps/mp/killstreaks/_killstreaks::getkillstreakweapon( killstreaktype ); - if ( is_true( level.usingscorestreaks ) ) - { - if ( maps/mp/killstreaks/_killstreak_weapons::isheldkillstreakweapon( weapon ) ) - { - if ( !isDefined( player.pers[ "held_killstreak_ammo_count" ][ weapon ] ) ) - { - player.pers[ "held_killstreak_ammo_count" ][ weapon ] = 0; - } - if ( !isDefined( player.pers[ "killstreak_quantity" ][ weapon ] ) ) - { - player.pers[ "killstreak_quantity" ][ weapon ] = 0; - } - currentweapon = player getcurrentweapon(); - if ( currentweapon == weapon ) - { - if ( player.pers[ "killstreak_quantity" ][ weapon ] < level.scorestreaksmaxstacking ) - { - player.pers[ "killstreak_quantity" ][ weapon ]++; - } - } - else - { - player.pers[ "held_killstreak_clip_count" ][ weapon ] = weaponclipsize( weapon ); - player.pers[ "held_killstreak_ammo_count" ][ weapon ] = weaponmaxammo( weapon ); - player maps/mp/gametypes/_class::setweaponammooverall( weapon, player.pers[ "held_killstreak_ammo_count" ][ weapon ] ); - } - } - else - { - player maps/mp/_challenges::earnedkillstreak(); - player maps/mp/killstreaks/_killstreaks::changekillstreakquantity( weapon, 1 ); - } - player maps/mp/killstreaks/_killstreaks::addkillstreaktoqueue( level.killstreaks[ killstreaktype ].menuname, 0, killstreaktype ); - killstreaktypeindex++; - continue; - } - else - { - player maps/mp/killstreaks/_killstreaks::addkillstreaktoqueue( level.killstreaks[ killstreaktype ].menuname, 0, killstreaktype ); - activeeventname = "reward_active"; - if ( isDefined( weapon ) ) - { - neweventname = weapon + "_active"; - if ( maps/mp/_scoreevents::isregisteredevent( neweventname ) ) - { - activeeventname = neweventname; - } - } - } - } - } + for ( killstreaktypeindex = 0; killstreaktypeindex < killstreaktypearray.size; killstreaktypeindex++ ) + { + killstreaktype = killstreaktypearray[killstreaktypeindex]; + momentumcost = level.killstreaks[killstreaktype].momentumcost; + + if ( momentumcost > oldmomentum && momentumcost <= momentum ) + { + weapon = maps\mp\killstreaks\_killstreaks::getkillstreakweapon( killstreaktype ); + + if ( isdefined( level.usingscorestreaks ) && level.usingscorestreaks ) + { + if ( maps\mp\killstreaks\_killstreak_weapons::isheldkillstreakweapon( weapon ) ) + { + if ( !isdefined( player.pers["held_killstreak_ammo_count"][weapon] ) ) + player.pers["held_killstreak_ammo_count"][weapon] = 0; + + if ( !isdefined( player.pers["killstreak_quantity"][weapon] ) ) + player.pers["killstreak_quantity"][weapon] = 0; + + currentweapon = player getcurrentweapon(); + + if ( currentweapon == weapon ) + { + if ( player.pers["killstreak_quantity"][weapon] < level.scorestreaksmaxstacking ) + player.pers["killstreak_quantity"][weapon]++; + } + else + { + player.pers["held_killstreak_clip_count"][weapon] = weaponclipsize( weapon ); + player.pers["held_killstreak_ammo_count"][weapon] = weaponmaxammo( weapon ); + player maps\mp\gametypes\_class::setweaponammooverall( weapon, player.pers["held_killstreak_ammo_count"][weapon] ); + } + } + else + { + player maps\mp\_challenges::earnedkillstreak(); + player maps\mp\killstreaks\_killstreaks::changekillstreakquantity( weapon, 1 ); + } + + player maps\mp\killstreaks\_killstreaks::addkillstreaktoqueue( level.killstreaks[killstreaktype].menuname, 0, killstreaktype ); + continue; + } + + player maps\mp\killstreaks\_killstreaks::addkillstreaktoqueue( level.killstreaks[killstreaktype].menuname, 0, killstreaktype ); + activeeventname = "reward_active"; + + if ( isdefined( weapon ) ) + { + neweventname = weapon + "_active"; + + if ( maps\mp\_scoreevents::isregisteredevent( neweventname ) ) + activeeventname = neweventname; + } + } + } } -setplayermomentumdebug() //checked matches cerberus output +setplayermomentumdebug() { - /* /# - setdvar( "sv_momentumPercent", 0 ); - while ( 1 ) - { - wait 1; - momentumpercent = getdvarfloatdefault( "sv_momentumPercent", 0 ); - if ( momentumpercent != 0 ) - { - player = gethostplayer(); - if ( !isDefined( player ) ) - { - return; - } - if ( isDefined( player.killstreak ) ) - { - _setplayermomentum( player, int( 2000 * ( momentumpercent / 100 ) ) ); - } - } + setdvar( "sv_momentumPercent", 0.0 ); + + while ( true ) + { + wait 1; + momentumpercent = getdvarfloatdefault( "sv_momentumPercent", 0.0 ); + + if ( momentumpercent != 0.0 ) + { + player = gethostplayer(); + + if ( !isdefined( player ) ) + return; + + if ( isdefined( player.killstreak ) ) + _setplayermomentum( player, int( 2000 * momentumpercent / 100 ) ); + } + } #/ - } - */ } -giveteamscore( event, team, player, victim ) //checked matches cerberus output +giveteamscore( event, team, player, victim ) { - if ( level.overrideteamscore ) - { - return; - } - pixbeginevent( "level.onTeamScore" ); - teamscore = game[ "teamScores" ][ team ]; - [[ level.onteamscore ]]( event, team ); - pixendevent(); - newscore = game[ "teamScores" ][ team ]; - bbprint( "mpteamscores", "gametime %d event %s team %d diff %d score %d", getTime(), event, team, newscore - teamscore, newscore ); - if ( teamscore == newscore ) - { - return; - } - updateteamscores( team ); - thread maps/mp/gametypes/_globallogic::checkscorelimit(); + if ( level.overrideteamscore ) + return; + + pixbeginevent( "level.onTeamScore" ); + teamscore = game["teamScores"][team]; + [[ level.onteamscore ]]( event, team ); + pixendevent(); + newscore = game["teamScores"][team]; + bbprint( "mpteamscores", "gametime %d event %s team %d diff %d score %d", gettime(), event, team, newscore - teamscore, newscore ); + + if ( teamscore == newscore ) + return; + + updateteamscores( team ); + thread maps\mp\gametypes\_globallogic::checkscorelimit(); } -giveteamscoreforobjective_delaypostprocessing( team, score ) //checked matches cerberus output +giveteamscoreforobjective_delaypostprocessing( team, score ) { - teamscore = game[ "teamScores" ][ team ]; - onteamscore_incrementscore( score, team ); - newscore = game[ "teamScores" ][ team ]; - bbprint( "mpteamobjscores", "gametime %d team %d diff %d score %d", getTime(), team, newscore - teamscore, newscore ); - if ( teamscore == newscore ) - { - return; - } - updateteamscores( team ); + teamscore = game["teamScores"][team]; + onteamscore_incrementscore( score, team ); + newscore = game["teamScores"][team]; + bbprint( "mpteamobjscores", "gametime %d team %d diff %d score %d", gettime(), team, newscore - teamscore, newscore ); + + if ( teamscore == newscore ) + return; + + updateteamscores( team ); } -postprocessteamscores( teams ) //cjecked changed to match cerberus output +postprocessteamscores( teams ) { - foreach ( team in teams ) - { - onteamscore_postprocess( team ); - } - thread maps/mp/gametypes/_globallogic::checkscorelimit(); + foreach ( team in teams ) + onteamscore_postprocess( team ); + + thread maps\mp\gametypes\_globallogic::checkscorelimit(); } -giveteamscoreforobjective( team, score ) //checked matches cerberus output +giveteamscoreforobjective( team, score ) { - if ( !isDefined( level.teams[ team ] ) ) - { - return; - } - teamscore = game[ "teamScores" ][ team ]; - onteamscore( score, team ); - newscore = game[ "teamScores" ][ team ]; - bbprint( "mpteamobjscores", "gametime %d team %d diff %d score %d", getTime(), team, newscore - teamscore, newscore ); - if ( teamscore == newscore ) - { - return; - } - updateteamscores( team ); - thread maps/mp/gametypes/_globallogic::checkscorelimit(); + if ( !isdefined( level.teams[team] ) ) + return; + + teamscore = game["teamScores"][team]; + onteamscore( score, team ); + newscore = game["teamScores"][team]; + bbprint( "mpteamobjscores", "gametime %d team %d diff %d score %d", gettime(), team, newscore - teamscore, newscore ); + + if ( teamscore == newscore ) + return; + + updateteamscores( team ); + thread maps\mp\gametypes\_globallogic::checkscorelimit(); } -_setteamscore( team, teamscore ) //checked matches cerberus output +_setteamscore( team, teamscore ) { - if ( teamscore == game[ "teamScores" ][ team ] ) - { - return; - } - game[ "teamScores" ][ team ] = clamp( teamscore, 0, 1000000 ); - updateteamscores( team ); - thread maps/mp/gametypes/_globallogic::checkscorelimit(); + if ( teamscore == game["teamScores"][team] ) + return; + + game["teamScores"][team] = clamp( teamscore, 0, 1000000 ); + updateteamscores( team ); + thread maps\mp\gametypes\_globallogic::checkscorelimit(); } -resetteamscores() //checked changed to match cerberus output +resetteamscores() { - if ( isDefined( level.roundscorecarry ) || level.roundscorecarry == 0 || maps/mp/_utility::isfirstround() ) - { - foreach ( team in level.teams ) - { - game[ "teamScores" ][ team ] = 0; - } - } - maps/mp/gametypes/_globallogic_score::updateallteamscores(); + if ( !isdefined( level.roundscorecarry ) || level.roundscorecarry == 0 || maps\mp\_utility::isfirstround() ) + { + foreach ( team in level.teams ) + game["teamScores"][team] = 0; + } + + maps\mp\gametypes\_globallogic_score::updateallteamscores(); } -resetallscores() //checked matches cerberus output +resetallscores() { - resetteamscores(); - resetplayerscores(); + resetteamscores(); + resetplayerscores(); } -resetplayerscores() //checked changed to match cerberus output +resetplayerscores() { - players = level.players; - winner = undefined; - tie = 0; - for ( i = 0; i < players.size; i++ ) - { - if ( isDefined( players[ i ].pers[ "score" ] ) ) - { - _setplayerscore( players[ i ], 0 ); - } - } + players = level.players; + winner = undefined; + tie = 0; + + for ( i = 0; i < players.size; i++ ) + { + if ( isdefined( players[i].pers["score"] ) ) + _setplayerscore( players[i], 0 ); + } } -updateteamscores( team ) //checked matches cerberus output +updateteamscores( team ) { - setteamscore( team, game[ "teamScores" ][ team ] ); - level thread maps/mp/gametypes/_globallogic::checkteamscorelimitsoon( team ); + setteamscore( team, game["teamScores"][team] ); + level thread maps\mp\gametypes\_globallogic::checkteamscorelimitsoon( team ); } -updateallteamscores() //checked changed to match cerberus output +updateallteamscores() { - foreach ( team in level.teams ) - { - updateteamscores( team ); - } + foreach ( team in level.teams ) + updateteamscores( team ); } -_getteamscore( team ) //checked matches cerberus output +_getteamscore( team ) { - return game[ "teamScores" ][ team ]; + return game["teamScores"][team]; } -gethighestteamscoreteam() //checked changed to match cerberus output +gethighestteamscoreteam() { - score = 0; - winning_teams = []; - foreach ( team in level.teams ) - { - team_score = game[ "teamScores" ][ team ]; - if ( team_score > score ) - { - score = team_score; - winning_teams = []; - } - if ( team_score == score ) - { - winning_teams[ team ] = team; - } - } - return winning_teams; + score = 0; + winning_teams = []; + + foreach ( team in level.teams ) + { + team_score = game["teamScores"][team]; + + if ( team_score > score ) + { + score = team_score; + winning_teams = []; + } + + if ( team_score == score ) + winning_teams[team] = team; + } + + return winning_teams; } -areteamarraysequal( teamsa, teamsb ) //checked changed to match cerberus output +areteamarraysequal( teamsa, teamsb ) { - if ( teamsa.size != teamsb.size ) - { - return 0; - } - foreach ( team in teamsa ) - { - if ( !isDefined( teamsb[ team ] ) ) - { - return 0; - } - } - return 1; + if ( teamsa.size != teamsb.size ) + return false; + + foreach ( team in teamsa ) + { + if ( !isdefined( teamsb[team] ) ) + return false; + } + + return true; } -onteamscore( score, team ) //checked matches cerberus output +onteamscore( score, team ) { - onteamscore_incrementscore( score, team ); - onteamscore_postprocess( team ); + onteamscore_incrementscore( score, team ); + onteamscore_postprocess( team ); } -onteamscore_incrementscore( score, team ) //checked matches cerberus output +onteamscore_incrementscore( score, team ) { - game[ "teamScores" ][ team ] += score; - if ( game[ "teamScores" ][ team ] < 0 ) - { - game[ "teamScores" ][ team ] = 0; - } - if ( level.scorelimit && game[ "teamScores" ][ team ] > level.scorelimit ) - { - game[ "teamScores" ][ team ] = level.scorelimit; - } + game["teamScores"][team] += score; + + if ( game["teamScores"][team] < 0 ) + game["teamScores"][team] = 0; + + if ( level.scorelimit && game["teamScores"][team] > level.scorelimit ) + game["teamScores"][team] = level.scorelimit; } -onteamscore_postprocess( team ) //checked partially changed to match cerberus output see info.md +onteamscore_postprocess( team ) { - if ( level.splitscreen ) - { - return; - } - if ( level.scorelimit == 1 ) - { - return; - } - iswinning = gethighestteamscoreteam(); - if ( iswinning.size == 0 ) - { - return; - } - if ( ( getTime() - level.laststatustime ) < 5000 ) - { - return; - } - if ( areteamarraysequal( iswinning, level.waswinning ) ) - { - return; - } - if ( iswinning.size == 1 ) - { - level.laststatustime = getTime(); - foreach ( team in iswinning ) - { - if ( isDefined( level.waswinning[ team ] ) ) - { - if ( level.waswinning.size == 1 ) - { - } - else - { - maps/mp/gametypes/_globallogic_audio::leaderdialog( "lead_taken", team, "status" ); - } - } - else - { - maps/mp/gametypes/_globallogic_audio::leaderdialog( "lead_taken", team, "status" ); - } - } - } - else - { - return; - } - if ( level.waswinning.size == 1 ) - { - foreach ( team in level.waswinning ) - { - if ( isDefined( iswinning[ team ] ) ) - { - if ( iswinning.size == 1 ) - { - } - else if ( level.waswinning.size > 1 ) - { - } - else - { - maps/mp/gametypes/_globallogic_audio::leaderdialog( "lead_lost", team, "status" ); - } - } - else - { - maps/mp/gametypes/_globallogic_audio::leaderdialog( "lead_lost", team, "status" ); - } - } - } - level.waswinning = iswinning; + if ( level.splitscreen ) + return; + + if ( level.scorelimit == 1 ) + return; + + iswinning = gethighestteamscoreteam(); + + if ( iswinning.size == 0 ) + return; + + if ( gettime() - level.laststatustime < 5000 ) + return; + + if ( areteamarraysequal( iswinning, level.waswinning ) ) + return; + + if ( iswinning.size == 1 ) + { + level.laststatustime = gettime(); + + foreach ( team in iswinning ) + { + if ( isdefined( level.waswinning[team] ) ) + { + if ( level.waswinning.size == 1 ) + continue; + } + + maps\mp\gametypes\_globallogic_audio::leaderdialog( "lead_taken", team, "status" ); + } + } + else + return; + + if ( level.waswinning.size == 1 ) + { + foreach ( team in level.waswinning ) + { + if ( isdefined( iswinning[team] ) ) + { + if ( iswinning.size == 1 ) + continue; + + if ( level.waswinning.size > 1 ) + continue; + } + + maps\mp\gametypes\_globallogic_audio::leaderdialog( "lead_lost", team, "status" ); + } + } + + level.waswinning = iswinning; } -default_onteamscore( event, team ) //checked matches cerberus output +default_onteamscore( event, team ) { - score = maps/mp/gametypes/_rank::getscoreinfovalue( event ); - /* + score = maps\mp\gametypes\_rank::getscoreinfovalue( event ); /# - assert( isDefined( score ) ); + assert( isdefined( score ) ); #/ - */ - onteamscore( score, team ); + onteamscore( score, team ); } -initpersstat( dataname, record_stats ) //checked matches cerberus output +initpersstat( dataname, record_stats ) { - if ( !isDefined( self.pers[ dataname ] ) ) - { - self.pers[ dataname ] = 0; - } - if ( !isDefined( record_stats ) || record_stats == 1 ) - { - recordplayerstats( self, dataname, int( self.pers[ dataname ] ) ); - } + if ( !isdefined( self.pers[dataname] ) ) + self.pers[dataname] = 0; + + if ( !isdefined( record_stats ) || record_stats == 1 ) + recordplayerstats( self, dataname, int( self.pers[dataname] ) ); } -getpersstat( dataname ) //checked matches cerberus output +getpersstat( dataname ) { - return self.pers[ dataname ]; + return self.pers[dataname]; } -incpersstat( dataname, increment, record_stats, includegametype ) //checked matches cerberus output +incpersstat( dataname, increment, record_stats, includegametype ) { - pixbeginevent( "incPersStat" ); - self.pers[ dataname ] += increment; - if ( is_true( includegametype ) ) - { - self addplayerstatwithgametype( dataname, increment ); - } - else - { - self addplayerstat( dataname, increment ); - } - if ( !isDefined( record_stats ) || record_stats == 1 ) - { - self thread threadedrecordplayerstats( dataname ); - } - pixendevent(); + pixbeginevent( "incPersStat" ); + self.pers[dataname] += increment; + + if ( isdefined( includegametype ) && includegametype ) + self addplayerstatwithgametype( dataname, increment ); + else + self addplayerstat( dataname, increment ); + + if ( !isdefined( record_stats ) || record_stats == 1 ) + self thread threadedrecordplayerstats( dataname ); + + pixendevent(); } -threadedrecordplayerstats( dataname ) //checked matches cerberus output +threadedrecordplayerstats( dataname ) { - self endon( "disconnect" ); - waittillframeend; - recordplayerstats( self, dataname, self.pers[ dataname ] ); + self endon( "disconnect" ); + waittillframeend; + recordplayerstats( self, dataname, self.pers[dataname] ); } -updatewinstats( winner ) //checked matches cerberus output +updatewinstats( winner ) { - winner addplayerstatwithgametype( "losses", -1 ); - winner addplayerstatwithgametype( "wins", 1 ); - if ( level.hardcoremode ) - { - winner addplayerstat( "wins_HC", 1 ); - } - if ( level.multiteam ) - { - winner addplayerstat( "wins_MULTITEAM", 1 ); - } - winner updatestatratio( "wlratio", "wins", "losses" ); - restorewinstreaks( winner ); - winner addplayerstatwithgametype( "cur_win_streak", 1 ); - winner notify( "win" ); - cur_gamemode_win_streak = winner maps/mp/gametypes/_persistence::statgetwithgametype( "cur_win_streak" ); - gamemode_win_streak = winner maps/mp/gametypes/_persistence::statgetwithgametype( "win_streak" ); - cur_win_streak = winner getdstat( "playerstatslist", "cur_win_streak", "StatValue" ); - if ( !level.disablestattracking && cur_win_streak > winner getdstat( "HighestStats", "win_streak" ) ) - { - winner setdstat( "HighestStats", "win_streak", cur_win_streak ); - } - if ( cur_gamemode_win_streak > gamemode_win_streak ) - { - winner maps/mp/gametypes/_persistence::statsetwithgametype( "win_streak", cur_gamemode_win_streak ); - } - if ( maps/mp/bots/_bot::is_bot_ranked_match() ) - { - combattrainingwins = winner getdstat( "combatTrainingWins" ); - winner setdstat( "combatTrainingWins", combattrainingwins + 1 ); - } + winner addplayerstatwithgametype( "losses", -1 ); + winner addplayerstatwithgametype( "wins", 1 ); + + if ( level.hardcoremode ) + winner addplayerstat( "wins_HC", 1 ); + + if ( level.multiteam ) + winner addplayerstat( "wins_MULTITEAM", 1 ); + + winner updatestatratio( "wlratio", "wins", "losses" ); + restorewinstreaks( winner ); + winner addplayerstatwithgametype( "cur_win_streak", 1 ); + winner notify( "win" ); + cur_gamemode_win_streak = winner maps\mp\gametypes\_persistence::statgetwithgametype( "cur_win_streak" ); + gamemode_win_streak = winner maps\mp\gametypes\_persistence::statgetwithgametype( "win_streak" ); + cur_win_streak = winner getdstat( "playerstatslist", "cur_win_streak", "StatValue" ); + + if ( !level.disablestattracking && cur_win_streak > winner getdstat( "HighestStats", "win_streak" ) ) + winner setdstat( "HighestStats", "win_streak", cur_win_streak ); + + if ( cur_gamemode_win_streak > gamemode_win_streak ) + winner maps\mp\gametypes\_persistence::statsetwithgametype( "win_streak", cur_gamemode_win_streak ); + + if ( maps\mp\bots\_bot::is_bot_ranked_match() ) + { + combattrainingwins = winner getdstat( "combatTrainingWins" ); + winner setdstat( "combatTrainingWins", combattrainingwins + 1 ); + } } -updatelossstats( loser ) //checked matches cerberus output +updatelossstats( loser ) { - loser addplayerstatwithgametype( "losses", 1 ); - loser updatestatratio( "wlratio", "wins", "losses" ); - loser notify( "loss" ); + loser addplayerstatwithgametype( "losses", 1 ); + loser updatestatratio( "wlratio", "wins", "losses" ); + loser notify( "loss" ); } -updatetiestats( loser ) //checked matches cerberus output +updatetiestats( loser ) { - loser addplayerstatwithgametype( "losses", -1 ); - loser addplayerstatwithgametype( "ties", 1 ); - loser updatestatratio( "wlratio", "wins", "losses" ); - if ( !level.disablestattracking ) - { - loser setdstat( "playerstatslist", "cur_win_streak", "StatValue", 0 ); - } - loser notify( "tie" ); + loser addplayerstatwithgametype( "losses", -1 ); + loser addplayerstatwithgametype( "ties", 1 ); + loser updatestatratio( "wlratio", "wins", "losses" ); + + if ( !level.disablestattracking ) + loser setdstat( "playerstatslist", "cur_win_streak", "StatValue", 0 ); + + loser notify( "tie" ); } -updatewinlossstats( winner ) //checked partially changed to match beta dump see info.md +updatewinlossstats( winner ) { - if ( !waslastround() && !level.hostforcedend ) - { - return; - } - players = level.players; - if ( !isDefined( winner ) || isDefined( winner ) && !isplayer( winner ) && winner == "tie" ) - { - i = 0; - while ( i < players.size ) - { - if ( !isDefined( players[ i ].pers[ "team" ] ) ) - { - i++; - continue; - } - if ( level.hostforcedend && players[ i ] ishost() ) - { - i++; - continue; - } - updatetiestats( players[ i ] ); - i++; - } - } - else if ( isplayer( winner ) ) - { - if ( level.hostforcedend && winner ishost() ) - { - return; - } - updatewinstats( winner ); - if ( !level.teambased ) - { - placement = level.placement[ "all" ]; - topthreeplayers = min( 3, placement.size ); - for ( index = 1; index < topthreeplayers; index++ ) - { - nexttopplayer = placement[ index ]; - updatewinstats( nexttopplayer ); - } - } - } - else - { - i = 0; - while ( i < players.size ) - { - if ( !isDefined( players[ i ].pers[ "team" ] ) ) - { - i++; - continue; - } - if ( level.hostforcedend && players[ i ] ishost() ) - { - i++; - continue; - } - if ( winner == "tie" ) - { - updatetiestats( players[ i ] ); - } - else if ( players[ i ].pers[ "team" ] == winner ) - { - updatewinstats( players[ i ] ); - } - else - { - if ( !level.disablestattracking ) - { - players[ i ] setdstat( "playerstatslist", "cur_win_streak", "StatValue", 0 ); - } - } - i++; - } - } + if ( !waslastround() && !level.hostforcedend ) + return; + + players = level.players; + + if ( !isdefined( winner ) || isdefined( winner ) && !isplayer( winner ) && winner == "tie" ) + { + for ( i = 0; i < players.size; i++ ) + { + if ( !isdefined( players[i].pers["team"] ) ) + continue; + + if ( level.hostforcedend && players[i] ishost() ) + continue; + + updatetiestats( players[i] ); + } + } + else if ( isplayer( winner ) ) + { + if ( level.hostforcedend && winner ishost() ) + return; + + updatewinstats( winner ); + + if ( !level.teambased ) + { + placement = level.placement["all"]; + topthreeplayers = min( 3, placement.size ); + + for ( index = 1; index < topthreeplayers; index++ ) + { + nexttopplayer = placement[index]; + updatewinstats( nexttopplayer ); + } + } + } + else + { + for ( i = 0; i < players.size; i++ ) + { + if ( !isdefined( players[i].pers["team"] ) ) + continue; + + if ( level.hostforcedend && players[i] ishost() ) + continue; + + if ( winner == "tie" ) + { + updatetiestats( players[i] ); + continue; + } + + if ( players[i].pers["team"] == winner ) + { + updatewinstats( players[i] ); + continue; + } + + if ( !level.disablestattracking ) + players[i] setdstat( "playerstatslist", "cur_win_streak", "StatValue", 0 ); + } + } } -backupandclearwinstreaks() //checked matches cerberus output +backupandclearwinstreaks() { - self.pers[ "winStreak" ] = self getdstat( "playerstatslist", "cur_win_streak", "StatValue" ); - if ( !level.disablestattracking ) - { - self setdstat( "playerstatslist", "cur_win_streak", "StatValue", 0 ); - } - self.pers[ "winStreakForGametype" ] = maps/mp/gametypes/_persistence::statgetwithgametype( "cur_win_streak" ); - self maps/mp/gametypes/_persistence::statsetwithgametype( "cur_win_streak", 0 ); + self.pers["winStreak"] = self getdstat( "playerstatslist", "cur_win_streak", "StatValue" ); + + if ( !level.disablestattracking ) + self setdstat( "playerstatslist", "cur_win_streak", "StatValue", 0 ); + + self.pers["winStreakForGametype"] = maps\mp\gametypes\_persistence::statgetwithgametype( "cur_win_streak" ); + self maps\mp\gametypes\_persistence::statsetwithgametype( "cur_win_streak", 0 ); } -restorewinstreaks( winner ) //checked matches cerberus output +restorewinstreaks( winner ) { - if ( !level.disablestattracking ) - { - winner setdstat( "playerstatslist", "cur_win_streak", "StatValue", winner.pers[ "winStreak" ] ); - } - winner maps/mp/gametypes/_persistence::statsetwithgametype( "cur_win_streak", winner.pers[ "winStreakForGametype" ] ); + if ( !level.disablestattracking ) + winner setdstat( "playerstatslist", "cur_win_streak", "StatValue", winner.pers["winStreak"] ); + + winner maps\mp\gametypes\_persistence::statsetwithgametype( "cur_win_streak", winner.pers["winStreakForGametype"] ); } -inckillstreaktracker( sweapon ) //checked matches cerberus output +inckillstreaktracker( sweapon ) { - self endon( "disconnect" ); - waittillframeend; - if ( sweapon == "artillery_mp" ) - { - self.pers[ "artillery_kills" ]++; - } - if ( sweapon == "dog_bite_mp" ) - { - self.pers[ "dog_kills" ]++; - } + self endon( "disconnect" ); + waittillframeend; + + if ( sweapon == "artillery_mp" ) + self.pers["artillery_kills"]++; + + if ( sweapon == "dog_bite_mp" ) + self.pers["dog_kills"]++; } -trackattackerkill( name, rank, xp, prestige, xuid ) //checked changed to match cerberus output +trackattackerkill( name, rank, xp, prestige, xuid ) { - self endon( "disconnect" ); - attacker = self; - waittillframeend; - pixbeginevent( "trackAttackerKill" ); - if ( !isDefined( attacker.pers[ "killed_players" ][ name ] ) ) - { - attacker.pers[ "killed_players" ][ name ] = 0; - } - if ( !isDefined( attacker.killedplayerscurrent[ name ] ) ) - { - attacker.killedplayerscurrent[ name ] = 0; - } - if ( !isDefined( attacker.pers[ "nemesis_tracking" ][ name ] ) ) - { - attacker.pers[ "nemesis_tracking" ][ name ] = 0; - } - attacker.pers[ "killed_players" ][ name ]++; - attacker.killedplayerscurrent[ name ]++; - attacker.pers[ "nemesis_tracking" ][ name ] += 1; - if ( attacker.pers[ "nemesis_name" ] == name ) - { - attacker maps/mp/_challenges::killednemesis(); - } - if ( attacker.pers[ "nemesis_name" ] == "" || attacker.pers[ "nemesis_tracking" ][ name ] > attacker.pers[ "nemesis_tracking" ][ attacker.pers[ "nemesis_name" ] ] ) - { - attacker.pers[ "nemesis_name" ] = name; - attacker.pers[ "nemesis_rank" ] = rank; - attacker.pers[ "nemesis_rankIcon" ] = prestige; - attacker.pers[ "nemesis_xp" ] = xp; - attacker.pers[ "nemesis_xuid" ] = xuid; - } - else if ( isDefined( attacker.pers[ "nemesis_name" ] ) && attacker.pers[ "nemesis_name" ] == name ) - { - attacker.pers[ "nemesis_rank" ] = rank; - attacker.pers[ "nemesis_xp" ] = xp; - } - if ( !isDefined( attacker.lastkilledvictim ) || !isDefined( attacker.lastkilledvictimcount ) ) - { - attacker.lastkilledvictim = name; - attacker.lastkilledvictimcount = 0; - } - if ( attacker.lastkilledvictim == name ) - { - attacker.lastkilledvictimcount++; - if ( attacker.lastkilledvictimcount >= 5 ) - { - attacker.lastkilledvictimcount = 0; - attacker addplayerstat( "streaker", 1 ); - } - } - else - { - attacker.lastkilledvictim = name; - attacker.lastkilledvictimcount = 1; - } - pixendevent(); + self endon( "disconnect" ); + attacker = self; + waittillframeend; + pixbeginevent( "trackAttackerKill" ); + + if ( !isdefined( attacker.pers["killed_players"][name] ) ) + attacker.pers["killed_players"][name] = 0; + + if ( !isdefined( attacker.killedplayerscurrent[name] ) ) + attacker.killedplayerscurrent[name] = 0; + + if ( !isdefined( attacker.pers["nemesis_tracking"][name] ) ) + attacker.pers["nemesis_tracking"][name] = 0; + + attacker.pers["killed_players"][name]++; + attacker.killedplayerscurrent[name]++; + attacker.pers["nemesis_tracking"][name] += 1.0; + + if ( attacker.pers["nemesis_name"] == name ) + attacker maps\mp\_challenges::killednemesis(); + + if ( attacker.pers["nemesis_name"] == "" || attacker.pers["nemesis_tracking"][name] > attacker.pers["nemesis_tracking"][attacker.pers["nemesis_name"]] ) + { + attacker.pers["nemesis_name"] = name; + attacker.pers["nemesis_rank"] = rank; + attacker.pers["nemesis_rankIcon"] = prestige; + attacker.pers["nemesis_xp"] = xp; + attacker.pers["nemesis_xuid"] = xuid; + } + else if ( isdefined( attacker.pers["nemesis_name"] ) && attacker.pers["nemesis_name"] == name ) + { + attacker.pers["nemesis_rank"] = rank; + attacker.pers["nemesis_xp"] = xp; + } + + if ( !isdefined( attacker.lastkilledvictim ) || !isdefined( attacker.lastkilledvictimcount ) ) + { + attacker.lastkilledvictim = name; + attacker.lastkilledvictimcount = 0; + } + + if ( attacker.lastkilledvictim == name ) + { + attacker.lastkilledvictimcount++; + + if ( attacker.lastkilledvictimcount >= 5 ) + { + attacker.lastkilledvictimcount = 0; + attacker addplayerstat( "streaker", 1 ); + } + } + else + { + attacker.lastkilledvictim = name; + attacker.lastkilledvictimcount = 1; + } + + pixendevent(); } -trackattackeedeath( attackername, rank, xp, prestige, xuid ) //checked changed to match cerberus output +trackattackeedeath( attackername, rank, xp, prestige, xuid ) { - self endon( "disconnect" ); - waittillframeend; - pixbeginevent( "trackAttackeeDeath" ); - if ( !isDefined( self.pers[ "killed_by" ][ attackername ] ) ) - { - self.pers[ "killed_by" ][ attackername ] = 0; - } - self.pers[ "killed_by" ][ attackername ]++; - if ( !isDefined( self.pers[ "nemesis_tracking" ][ attackername ] ) ) - { - self.pers[ "nemesis_tracking" ][ attackername ] = 0; - } - self.pers[ "nemesis_tracking" ][ attackername ] += 1.5; - if ( self.pers[ "nemesis_name" ] == "" || self.pers[ "nemesis_tracking" ][ attackername ] > self.pers[ "nemesis_tracking" ][ self.pers[ "nemesis_name" ] ] ) - { - self.pers[ "nemesis_name" ] = attackername; - self.pers[ "nemesis_rank" ] = rank; - self.pers[ "nemesis_rankIcon" ] = prestige; - self.pers[ "nemesis_xp" ] = xp; - self.pers[ "nemesis_xuid" ] = xuid; - } - else if ( isDefined( self.pers[ "nemesis_name" ] ) && self.pers[ "nemesis_name" ] == attackername ) - { - self.pers[ "nemesis_rank" ] = rank; - self.pers[ "nemesis_xp" ] = xp; - } - if ( self.pers[ "nemesis_name" ] == attackername && self.pers[ "nemesis_tracking" ][ attackername ] >= 2 ) - { - self setclientuivisibilityflag( "killcam_nemesis", 1 ); - } - else - { - self setclientuivisibilityflag( "killcam_nemesis", 0 ); - } - pixendevent(); + self endon( "disconnect" ); + waittillframeend; + pixbeginevent( "trackAttackeeDeath" ); + + if ( !isdefined( self.pers["killed_by"][attackername] ) ) + self.pers["killed_by"][attackername] = 0; + + self.pers["killed_by"][attackername]++; + + if ( !isdefined( self.pers["nemesis_tracking"][attackername] ) ) + self.pers["nemesis_tracking"][attackername] = 0; + + self.pers["nemesis_tracking"][attackername] += 1.5; + + if ( self.pers["nemesis_name"] == "" || self.pers["nemesis_tracking"][attackername] > self.pers["nemesis_tracking"][self.pers["nemesis_name"]] ) + { + self.pers["nemesis_name"] = attackername; + self.pers["nemesis_rank"] = rank; + self.pers["nemesis_rankIcon"] = prestige; + self.pers["nemesis_xp"] = xp; + self.pers["nemesis_xuid"] = xuid; + } + else if ( isdefined( self.pers["nemesis_name"] ) && self.pers["nemesis_name"] == attackername ) + { + self.pers["nemesis_rank"] = rank; + self.pers["nemesis_xp"] = xp; + } + + if ( self.pers["nemesis_name"] == attackername && self.pers["nemesis_tracking"][attackername] >= 2 ) + self setclientuivisibilityflag( "killcam_nemesis", 1 ); + else + self setclientuivisibilityflag( "killcam_nemesis", 0 ); + + pixendevent(); } -default_iskillboosting() //checked matches cerberus output +default_iskillboosting() { - return 0; + return 0; } -givekillstats( smeansofdeath, sweapon, evictim ) //checked matches cerberus output +givekillstats( smeansofdeath, sweapon, evictim ) { - self endon( "disconnect" ); - waittillframeend; - if ( level.rankedmatch && self [[ level.iskillboosting ]]() ) - { - /* + self endon( "disconnect" ); + waittillframeend; + + if ( level.rankedmatch && self [[ level.iskillboosting ]]() ) + { /# - self iprintlnbold( "GAMETYPE DEBUG: NOT GIVING YOU OFFENSIVE CREDIT AS BOOSTING PREVENTION" ); + self iprintlnbold( "GAMETYPE DEBUG: NOT GIVING YOU OFFENSIVE CREDIT AS BOOSTING PREVENTION" ); #/ - */ - return; - } - pixbeginevent( "giveKillStats" ); - self maps/mp/gametypes/_globallogic_score::incpersstat( "kills", 1, 1, 1 ); - self.kills = self maps/mp/gametypes/_globallogic_score::getpersstat( "kills" ); - self updatestatratio( "kdratio", "kills", "deaths" ); - attacker = self; - if ( smeansofdeath == "MOD_HEAD_SHOT" && !maps/mp/killstreaks/_killstreaks::iskillstreakweapon( sweapon ) ) - { - attacker thread incpersstat( "headshots", 1, 1, 0 ); - attacker.headshots = attacker.pers[ "headshots" ]; - if ( isDefined( evictim ) ) - { - evictim recordkillmodifier( "headshot" ); - } - } - pixendevent(); + return; + } + + pixbeginevent( "giveKillStats" ); + self maps\mp\gametypes\_globallogic_score::incpersstat( "kills", 1, 1, 1 ); + self.kills = self maps\mp\gametypes\_globallogic_score::getpersstat( "kills" ); + self updatestatratio( "kdratio", "kills", "deaths" ); + attacker = self; + + if ( smeansofdeath == "MOD_HEAD_SHOT" && !maps\mp\killstreaks\_killstreaks::iskillstreakweapon( sweapon ) ) + { + attacker thread incpersstat( "headshots", 1, 1, 0 ); + attacker.headshots = attacker.pers["headshots"]; + + if ( isdefined( evictim ) ) + evictim recordkillmodifier( "headshot" ); + } + + pixendevent(); } -inctotalkills( team ) //checked matches cerberus output +inctotalkills( team ) { - if ( level.teambased && isDefined( level.teams[ team ] ) ) - { - game[ "totalKillsTeam" ][ team ]++; - } - game[ "totalKills" ]++; + if ( level.teambased && isdefined( level.teams[team] ) ) + game["totalKillsTeam"][team]++; + + game["totalKills"]++; } -setinflictorstat( einflictor, eattacker, sweapon ) //checked changed to match cerberus output +setinflictorstat( einflictor, eattacker, sweapon ) { - if ( !isDefined( eattacker ) ) - { - return; - } - if ( !isDefined( einflictor ) ) - { - eattacker addweaponstat( sweapon, "hits", 1 ); - return; - } - if ( !isDefined( einflictor.playeraffectedarray ) ) - { - einflictor.playeraffectedarray = []; - } - foundnewplayer = 1; - for ( i = 0; i < einflictor.playeraffectedarray.size; i++ ) - { - if ( einflictor.playeraffectedarray[ i ] == self ) - { - foundnewplayer = 0; - break; - } - } - if ( foundnewplayer ) - { - einflictor.playeraffectedarray[ einflictor.playeraffectedarray.size ] = self; - if ( sweapon == "concussion_grenade_mp" || sweapon == "tabun_gas_mp" ) - { - eattacker addweaponstat( sweapon, "used", 1 ); - } - eattacker addweaponstat( sweapon, "hits", 1 ); - } + if ( !isdefined( eattacker ) ) + return; + + if ( !isdefined( einflictor ) ) + { + eattacker addweaponstat( sweapon, "hits", 1 ); + return; + } + + if ( !isdefined( einflictor.playeraffectedarray ) ) + einflictor.playeraffectedarray = []; + + foundnewplayer = 1; + + for ( i = 0; i < einflictor.playeraffectedarray.size; i++ ) + { + if ( einflictor.playeraffectedarray[i] == self ) + { + foundnewplayer = 0; + break; + } + } + + if ( foundnewplayer ) + { + einflictor.playeraffectedarray[einflictor.playeraffectedarray.size] = self; + + if ( sweapon == "concussion_grenade_mp" || sweapon == "tabun_gas_mp" ) + eattacker addweaponstat( sweapon, "used", 1 ); + + eattacker addweaponstat( sweapon, "hits", 1 ); + } } -processshieldassist( killedplayer ) //checked matches cerberus output +processshieldassist( killedplayer ) { - self endon( "disconnect" ); - killedplayer endon( "disconnect" ); - wait 0.05; - maps/mp/gametypes/_globallogic_utils::waittillslowprocessallowed(); - if ( !isDefined( level.teams[ self.pers[ "team" ] ] ) ) - { - return; - } - if ( self.pers[ "team" ] == killedplayer.pers[ "team" ] ) - { - return; - } - if ( !level.teambased ) - { - return; - } - self maps/mp/gametypes/_globallogic_score::incpersstat( "assists", 1, 1, 1 ); - self.assists = self maps/mp/gametypes/_globallogic_score::getpersstat( "assists" ); - maps/mp/_scoreevents::processscoreevent( "shield_assist", self, killedplayer, "riotshield_mp" ); + self endon( "disconnect" ); + killedplayer endon( "disconnect" ); + wait 0.05; + maps\mp\gametypes\_globallogic_utils::waittillslowprocessallowed(); + + if ( !isdefined( level.teams[self.pers["team"]] ) ) + return; + + if ( self.pers["team"] == killedplayer.pers["team"] ) + return; + + if ( !level.teambased ) + return; + + self maps\mp\gametypes\_globallogic_score::incpersstat( "assists", 1, 1, 1 ); + self.assists = self maps\mp\gametypes\_globallogic_score::getpersstat( "assists" ); + maps\mp\_scoreevents::processscoreevent( "shield_assist", self, killedplayer, "riotshield_mp" ); } -processassist( killedplayer, damagedone, weapon ) //checked changed to match cerberus output +processassist( killedplayer, damagedone, weapon ) { - self endon( "disconnect" ); - killedplayer endon( "disconnect" ); - wait 0.05; - maps/mp/gametypes/_globallogic_utils::waittillslowprocessallowed(); - if ( !isDefined( level.teams[ self.pers[ "team" ] ] ) ) - { - return; - } - if ( self.pers[ "team" ] == killedplayer.pers[ "team" ] ) - { - return; - } - if ( !level.teambased ) - { - return; - } - assist_level = "assist"; - assist_level_value = int( ceil( damagedone / 25 ) ); - if ( assist_level_value < 1 ) - { - assist_level_value = 1; - } - else if ( assist_level_value > 3 ) - { - assist_level_value = 3; - } - assist_level = ( assist_level + "_" ) + ( assist_level_value * 25 ); - self maps/mp/gametypes/_globallogic_score::incpersstat( "assists", 1, 1, 1 ); - self.assists = self maps/mp/gametypes/_globallogic_score::getpersstat( "assists" ); - if ( isDefined( weapon ) ) - { - self addweaponstat( weapon, "assists", 1 ); - } - switch( weapon ) - { - case "concussion_grenade_mp": - assist_level = "assist_concussion"; - break; - case "flash_grenade_mp": - assist_level = "assist_flash"; - break; - case "emp_grenade_mp": - assist_level = "assist_emp"; - break; - case "proximity_grenade_aoe_mp": - case "proximity_grenade_mp": - assist_level = "assist_proximity"; - break; - } - self maps/mp/_challenges::assisted(); - maps/mp/_scoreevents::processscoreevent( assist_level, self, killedplayer, weapon ); + self endon( "disconnect" ); + killedplayer endon( "disconnect" ); + wait 0.05; + maps\mp\gametypes\_globallogic_utils::waittillslowprocessallowed(); + + if ( !isdefined( level.teams[self.pers["team"]] ) ) + return; + + if ( self.pers["team"] == killedplayer.pers["team"] ) + return; + + if ( !level.teambased ) + return; + + assist_level = "assist"; + assist_level_value = int( ceil( damagedone / 25 ) ); + + if ( assist_level_value < 1 ) + assist_level_value = 1; + else if ( assist_level_value > 3 ) + assist_level_value = 3; + + assist_level = assist_level + "_" + assist_level_value * 25; + self maps\mp\gametypes\_globallogic_score::incpersstat( "assists", 1, 1, 1 ); + self.assists = self maps\mp\gametypes\_globallogic_score::getpersstat( "assists" ); + + if ( isdefined( weapon ) ) + self addweaponstat( weapon, "assists", 1 ); + + switch ( weapon ) + { + case "concussion_grenade_mp": + assist_level = "assist_concussion"; + break; + case "flash_grenade_mp": + assist_level = "assist_flash"; + break; + case "emp_grenade_mp": + assist_level = "assist_emp"; + break; + case "proximity_grenade_mp": + case "proximity_grenade_aoe_mp": + assist_level = "assist_proximity"; + break; + } + + self maps\mp\_challenges::assisted(); + maps\mp\_scoreevents::processscoreevent( assist_level, self, killedplayer, weapon ); } -processkillstreakassists( attacker, inflictor, weaponname ) //checked partially changed to match cerberus output see info.md +processkillstreakassists( attacker, inflictor, weaponname ) { - if ( isDefined( attacker ) || !isDefined( attacker.team ) || self isenemyplayer( attacker ) == 0 ) - { - return; - } - if ( self == attacker || attacker.classname == "trigger_hurt" || attacker.classname == "worldspawn" ) - { - return; - } - enemycuavactive = 0; - if ( attacker hasperk( "specialty_immunecounteruav" ) == 0 ) - { - foreach ( team in level.teams ) - { - if ( team == attacker.team ) - { - } - else - { - if ( level.activecounteruavs[ team ] > 0 ) - { - enemycuavactive = 1; - } - } - } - } - foreach ( player in level.players ) - { - if ( player.team != attacker.team ) - { - } - else if ( player.team == "spectator" ) - { - } - else if ( player == attacker ) - { - } - else if ( player.sessionstate != "playing" ) - { - } - else - { - /* + if ( !isdefined( attacker ) || !isdefined( attacker.team ) || self isenemyplayer( attacker ) == 0 ) + return; + + if ( self == attacker || attacker.classname == "trigger_hurt" || attacker.classname == "worldspawn" ) + return; + + enemycuavactive = 0; + + if ( attacker hasperk( "specialty_immunecounteruav" ) == 0 ) + { + foreach ( team in level.teams ) + { + if ( team == attacker.team ) + continue; + + if ( level.activecounteruavs[team] > 0 ) + enemycuavactive = 1; + } + } + + foreach ( player in level.players ) + { + if ( player.team != attacker.team ) + continue; + + if ( player.team == "spectator" ) + continue; + + if ( player == attacker ) + continue; + + if ( player.sessionstate != "playing" ) + continue; + /# - assert( isDefined( player.activecounteruavs ) ); + assert( isdefined( player.activecounteruavs ) ); #/ /# - assert( isDefined( player.activeuavs ) ); + assert( isdefined( player.activeuavs ) ); #/ /# - assert( isDefined( player.activesatellites ) ); + assert( isdefined( player.activesatellites ) ); #/ - */ - if ( player.activecounteruavs > 0 && !maps/mp/killstreaks/_killstreaks::iskillstreakweapon( weaponname ) ) - { - scoregiven = thread maps/mp/_scoreevents::processscoreevent( "counter_uav_assist", player ); - if ( isDefined( scoregiven ) ) - { - player maps/mp/_challenges::earnedcuavassistscore( scoregiven ); - } - } - if ( enemycuavactive == 0 ) - { - if ( player.activeuavs > 0 && !maps/mp/killstreaks/_killstreaks::iskillstreakweapon( weaponname ) ) - { - scoregiven = thread maps/mp/_scoreevents::processscoreevent( "uav_assist", player ); - if ( isDefined( scoregiven ) ) - { - player maps/mp/_challenges::earneduavassistscore( scoregiven ); - } - } - if ( player.activesatellites > 0 && !maps/mp/killstreaks/_killstreaks::iskillstreakweapon( weaponname ) ) - { - scoregiven = thread maps/mp/_scoreevents::processscoreevent( "satellite_assist", player ); - if ( isDefined( scoregiven ) ) - { - player maps/mp/_challenges::earnedsatelliteassistscore( scoregiven ); - } - } - } - } - } - foreach ( assistteam in level.teams ) - { - if ( assistteam == self.team ) - { - } - else if ( attacker.team != assistteam ) - { - } - else - { - activeempowner = level.empowners[ assistteam ]; - if ( isDefined( activeempowner ) && isplayer( activeempowner ) ) - { - if ( isDefined( attacker ) && activeempowner != attacker ) - { - if ( isDefined( activeempowner.emptime ) && activeempowner.spawntime < activeempowner.emptime ) - { - scoregiven = maps/mp/_scoreevents::processscoreevent( "emp_assist", activeempowner ); - if ( isDefined( scoregiven ) ) - { - activeempowner maps/mp/_challenges::earnedempassistscore( scoregiven ); - } - } - } - } - } - } + + if ( player.activecounteruavs > 0 && !maps\mp\killstreaks\_killstreaks::iskillstreakweapon( weaponname ) ) + { + scoregiven = thread maps\mp\_scoreevents::processscoreevent( "counter_uav_assist", player ); + + if ( isdefined( scoregiven ) ) + player maps\mp\_challenges::earnedcuavassistscore( scoregiven ); + } + + if ( enemycuavactive == 0 ) + { + if ( player.activeuavs > 0 && !maps\mp\killstreaks\_killstreaks::iskillstreakweapon( weaponname ) ) + { + scoregiven = thread maps\mp\_scoreevents::processscoreevent( "uav_assist", player ); + + if ( isdefined( scoregiven ) ) + player maps\mp\_challenges::earneduavassistscore( scoregiven ); + } + + if ( player.activesatellites > 0 && !maps\mp\killstreaks\_killstreaks::iskillstreakweapon( weaponname ) ) + { + scoregiven = thread maps\mp\_scoreevents::processscoreevent( "satellite_assist", player ); + + if ( isdefined( scoregiven ) ) + player maps\mp\_challenges::earnedsatelliteassistscore( scoregiven ); + } + } + } + + foreach ( assistteam in level.teams ) + { + if ( assistteam == self.team ) + continue; + + if ( attacker.team != assistteam ) + continue; + + activeempowner = level.empowners[assistteam]; + + if ( isdefined( activeempowner ) && isplayer( activeempowner ) ) + { + if ( isdefined( attacker ) && activeempowner != attacker ) + { + if ( isdefined( activeempowner.emptime ) && activeempowner.spawntime < activeempowner.emptime ) + { + scoregiven = maps\mp\_scoreevents::processscoreevent( "emp_assist", activeempowner ); + + if ( isdefined( scoregiven ) ) + activeempowner maps\mp\_challenges::earnedempassistscore( scoregiven ); + } + } + } + } } -xpratethread() //checked matches cerberus output dvar taken from beta dump +xpratethread() { - /* /# - self endon( "death" ); - self endon( "disconnect" ); - level endon( "game_ended" ); - while ( level.inprematchperiod ) - { - wait 0.05; - } - for ( ;; ) - { - wait 5; - if ( isDefined( level.teams[ level.players[ 0 ].pers[ "team" ] ] ) ) - { - self maps/mp/gametypes/_rank::giverankxp( "kill", int( min( getDvarInt( "scr_xprate" ), 50 ) ) ); - } -#/ - } - */ -} + self endon( "death" ); + self endon( "disconnect" ); + level endon( "game_ended" ); + while ( level.inprematchperiod ) + wait 0.05; + + for (;;) + { + wait 5.0; + + if ( isdefined( level.teams[level.players[0].pers["team"]] ) ) + self maps\mp\gametypes\_rank::giverankxp( "kill", int( min( getdvarint( _hash_F8D00F60 ), 50 ) ) ); + } +#/ +} diff --git a/Multiplayer Core/patch_mp/maps/mp/gametypes/_globallogic_spawn.gsc b/Multiplayer Core/patch_mp/maps/mp/gametypes/_globallogic_spawn.gsc index 5167548..ed95e1f 100644 --- a/Multiplayer Core/patch_mp/maps/mp/gametypes/_globallogic_spawn.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/gametypes/_globallogic_spawn.gsc @@ -1,944 +1,875 @@ -//checked includes match cerberus output -#include maps/mp/gametypes/_spawnlogic; -#include maps/mp/gametypes/_globallogic_defaults; -#include maps/mp/gametypes/_hostmigration; -#include maps/mp/gametypes/_spectating; -#include maps/mp/_vehicles; -#include maps/mp/killstreaks/_killstreaks; -#include maps/mp/bots/_bot; -#include maps/mp/gametypes/_globallogic_ui; -#include maps/mp/gametypes/_hud_util; -#include maps/mp/gametypes/_class; -#include maps/mp/gametypes/_globallogic; -#include maps/mp/gametypes/_globallogic_utils; -#include maps/mp/gametypes/_globallogic_score; -#include maps/mp/gametypes/_globallogic_audio; -#include maps/mp/gametypes/_persistence; -#include maps/mp/gametypes/_hud_message; -#include maps/mp/gametypes/_spawning; -#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 -timeuntilspawn( includeteamkilldelay ) //checked matches cerberus output +timeuntilspawn( includeteamkilldelay ) { - if ( level.ingraceperiod && !self.hasspawned ) - { - return 0; - } - respawndelay = 0; - if ( self.hasspawned ) - { - result = self [[ level.onrespawndelay ]](); - if ( isDefined( result ) ) - { - respawndelay = result; - } - else - { - respawndelay = level.playerrespawndelay; - } - if ( self.suicide && level.suicidespawndelay > 0 ) - { - respawndelay += level.suicidespawndelay; - } - if ( self.teamkilled && level.teamkilledspawndelay > 0 ) - { - respawndelay += level.teamkilledspawndelay; - } - if ( includeteamkilldelay && is_true( self.teamkillpunish ) ) - { - respawndelay += maps/mp/gametypes/_globallogic_player::teamkilldelay(); - } - } - wavebased = level.waverespawndelay > 0; - if ( wavebased ) - { - return self timeuntilwavespawn( respawndelay ); - } - return respawndelay; + if ( level.ingraceperiod && !self.hasspawned ) + return 0; + + respawndelay = 0; + + if ( self.hasspawned ) + { + result = self [[ level.onrespawndelay ]](); + + if ( isdefined( result ) ) + respawndelay = result; + else + respawndelay = level.playerrespawndelay; + + if ( self.suicide && level.suicidespawndelay > 0 ) + respawndelay += level.suicidespawndelay; + + if ( self.teamkilled && level.teamkilledspawndelay > 0 ) + respawndelay += level.teamkilledspawndelay; + + if ( includeteamkilldelay && is_true( self.teamkillpunish ) ) + respawndelay += maps\mp\gametypes\_globallogic_player::teamkilldelay(); + } + + wavebased = level.waverespawndelay > 0; + + if ( wavebased ) + return self timeuntilwavespawn( respawndelay ); + + return respawndelay; } -allteamshaveexisted() //checked changed to match cerberus output +allteamshaveexisted() { - foreach ( team in level.teams ) - { - if ( !level.everexisted[ team ] ) - { - return 0; - } - } - return 1; + foreach ( team in level.teams ) + { + if ( !level.everexisted[team] ) + return false; + } + + return true; } -mayspawn() //checked partially changed to match cerberus output changed at own discretion +mayspawn() { - if ( isDefined( level.mayspawn ) && !self [[ level.mayspawn ]]() ) - { - return 0; - } - if ( level.inovertime ) - { - return 0; - } - if ( level.playerqueuedrespawn && !isDefined( self.allowqueuespawn ) && !level.ingraceperiod && !level.usestartspawns ) - { - return 0; - } - if ( level.numlives ) - { - if ( level.teambased ) - { - gamehasstarted = allteamshaveexisted(); - } - else if ( level.maxplayercount > 1 || !isoneround() && !isfirstround() ) - { - gamehasstarted = 1; - } - else - { - gamehasstarted = 0; - } - if ( !self.pers[ "lives" ] ) - { - return 0; - } - else if ( gamehasstarted ) - { - if ( !level.ingraceperiod && !self.hasspawned && !level.wagermatch ) - { - return 0; - } - } - } - return 1; + if ( isdefined( level.mayspawn ) && !self [[ level.mayspawn ]]() ) + return false; + + if ( level.inovertime ) + return false; + + if ( level.playerqueuedrespawn && !isdefined( self.allowqueuespawn ) && !level.ingraceperiod && !level.usestartspawns ) + return false; + + if ( level.numlives ) + { + if ( level.teambased ) + gamehasstarted = allteamshaveexisted(); + else + gamehasstarted = level.maxplayercount > 1 || !isoneround() && !isfirstround(); + + if ( !self.pers["lives"] ) + return false; + else if ( gamehasstarted ) + { + if ( !level.ingraceperiod && !self.hasspawned && !level.wagermatch ) + return false; + } + } + + return true; } -timeuntilwavespawn( minimumwait ) //checked matches cerberus output +timeuntilwavespawn( minimumwait ) { - earliestspawntime = getTime() + ( minimumwait * 1000 ); - lastwavetime = level.lastwave[ self.pers[ "team" ] ]; - wavedelay = level.wavedelay[ self.pers[ "team" ] ] * 1000; - if ( wavedelay == 0 ) - { - return 0; - } - numwavespassedearliestspawntime = ( earliestspawntime - lastwavetime ) / wavedelay; - numwaves = ceil( numwavespassedearliestspawntime ); - timeofspawn = lastwavetime + ( numwaves * wavedelay ); - if ( isDefined( self.wavespawnindex ) ) - { - timeofspawn += 50 * self.wavespawnindex; - } - return ( timeofspawn - getTime() ) / 1000; + earliestspawntime = gettime() + minimumwait * 1000; + lastwavetime = level.lastwave[self.pers["team"]]; + wavedelay = level.wavedelay[self.pers["team"]] * 1000; + + if ( wavedelay == 0 ) + return 0; + + numwavespassedearliestspawntime = ( earliestspawntime - lastwavetime ) / wavedelay; + numwaves = ceil( numwavespassedearliestspawntime ); + timeofspawn = lastwavetime + numwaves * wavedelay; + + if ( isdefined( self.wavespawnindex ) ) + timeofspawn += 50 * self.wavespawnindex; + + return ( timeofspawn - gettime() ) / 1000; } -stoppoisoningandflareonspawn() //checked matches cerberus output +stoppoisoningandflareonspawn() { - self endon( "disconnect" ); - self.inpoisonarea = 0; - self.inburnarea = 0; - self.inflarevisionarea = 0; - self.ingroundnapalm = 0; + self endon( "disconnect" ); + self.inpoisonarea = 0; + self.inburnarea = 0; + self.inflarevisionarea = 0; + self.ingroundnapalm = 0; } -spawnplayerprediction() //checked matches cerberus output dvar taken from beta dump +spawnplayerprediction() { - self endon( "disconnect" ); - self endon( "end_respawn" ); - self endon( "game_ended" ); - self endon( "joined_spectators" ); - self endon( "spawned" ); - while ( 1 ) - { - wait 0.5; - if ( isDefined( level.onspawnplayerunified ) && getDvarInt( "scr_disableunifiedspawning" ) == 0 ) - { - maps/mp/gametypes/_spawning::onspawnplayer_unified( 1 ); - continue; - } - else - { - self [[ level.onspawnplayer ]]( 1 ); - } - } + self endon( "disconnect" ); + self endon( "end_respawn" ); + self endon( "game_ended" ); + self endon( "joined_spectators" ); + self endon( "spawned" ); + + while ( true ) + { + wait 0.5; + + if ( isdefined( level.onspawnplayerunified ) && getdvarint( _hash_CF6EEB8B ) == 0 ) + maps\mp\gametypes\_spawning::onspawnplayer_unified( 1 ); + else + self [[ level.onspawnplayer ]]( 1 ); + } } -doinitialspawnmessaging() //checked changed to match cerberus output +doinitialspawnmessaging() { - self endon( "disconnect" ); - if ( is_true( level.disableprematchmessages ) ) - { - return; - } - team = self.pers[ "team" ]; - thread maps/mp/gametypes/_hud_message::showinitialfactionpopup( team ); - if ( ( !level.splitscreen || self == level.players[ 0 ] ) && isDefined( game[ "dialog" ][ "gametype" ] ) ) - { - if ( !isDefined( level.infinalfight ) || !level.infinalfight ) - { - if ( level.hardcoremode && maps/mp/gametypes/_persistence::ispartygamemode() == 0 ) - { - self maps/mp/gametypes/_globallogic_audio::leaderdialogonplayer( "gametype_hardcore" ); - } - else - { - self maps/mp/gametypes/_globallogic_audio::leaderdialogonplayer( "gametype" ); - } - } - } - while ( level.inprematchperiod ) - { - wait 0.05; - } - hintmessage = getobjectivehinttext( team ); - if ( isDefined( hintmessage ) ) - { - self thread maps/mp/gametypes/_hud_message::hintmessage( hintmessage ); - } - if ( team == game[ "attackers" ] ) - { - self maps/mp/gametypes/_globallogic_audio::leaderdialogonplayer( "offense_obj", "introboost" ); - } - else - { - self maps/mp/gametypes/_globallogic_audio::leaderdialogonplayer( "defense_obj", "introboost" ); - } + self endon( "disconnect" ); + + if ( isdefined( level.disableprematchmessages ) && level.disableprematchmessages ) + return; + + team = self.pers["team"]; + thread maps\mp\gametypes\_hud_message::showinitialfactionpopup( team ); + + if ( isdefined( game["dialog"]["gametype"] ) && ( !level.splitscreen || self == level.players[0] ) ) + { + if ( !isdefined( level.infinalfight ) || !level.infinalfight ) + { + if ( level.hardcoremode && maps\mp\gametypes\_persistence::ispartygamemode() == 0 ) + self maps\mp\gametypes\_globallogic_audio::leaderdialogonplayer( "gametype_hardcore" ); + else + self maps\mp\gametypes\_globallogic_audio::leaderdialogonplayer( "gametype" ); + } + } + + while ( level.inprematchperiod ) + wait 0.05; + + hintmessage = getobjectivehinttext( team ); + + if ( isdefined( hintmessage ) ) + self thread maps\mp\gametypes\_hud_message::hintmessage( hintmessage ); + + if ( team == game["attackers"] ) + self maps\mp\gametypes\_globallogic_audio::leaderdialogonplayer( "offense_obj", "introboost" ); + else + self maps\mp\gametypes\_globallogic_audio::leaderdialogonplayer( "defense_obj", "introboost" ); } -spawnplayer() //checked changed to match cerberus output dvars taken from beta dump +spawnplayer() { - pixbeginevent( "spawnPlayer_preUTS" ); - self endon( "disconnect" ); - self endon( "joined_spectators" ); - self notify( "spawned" ); - level notify( "player_spawned" ); - self notify( "end_respawn" ); - self setspawnvariables(); - if ( !self.hasspawned ) - { - self.underscorechance = 70; - self thread maps/mp/gametypes/_globallogic_audio::sndstartmusicsystem(); - } - if ( isDefined( self.pers[ "resetMomentumOnSpawn" ] ) && self.pers[ "resetMomentumOnSpawn" ] ) - { - self maps/mp/gametypes/_globallogic_score::resetplayermomentumonspawn(); - self.pers["resetMomentumOnSpawn"] = undefined; - } - if ( level.teambased ) - { - self.sessionteam = self.team; - } - else - { - self.sessionteam = "none"; - self.ffateam = self.team; - } - hadspawned = self.hasspawned; - self.sessionstate = "playing"; - self.spectatorclient = -1; - self.killcamentity = -1; - self.archivetime = 0; - self.psoffsettime = 0; - self.statusicon = ""; - self.damagedplayers = []; - if ( getDvarInt( "scr_csmode" ) > 0 ) - { - self.maxhealth = getDvarInt( "scr_csmode" ); - } - else - { - self.maxhealth = level.playermaxhealth; - } - self.health = self.maxhealth; - self.friendlydamage = undefined; - self.hasspawned = 1; - self.spawntime = getTime(); - self.afk = 0; - if ( ( !isDefined( level.takelivesondeath ) || level.takelivesondeath == 0 ) && self.pers[ "lives" ] ) - { - self.pers[ "lives" ]--; + pixbeginevent( "spawnPlayer_preUTS" ); + self endon( "disconnect" ); + self endon( "joined_spectators" ); + self notify( "spawned" ); + level notify( "player_spawned" ); + self notify( "end_respawn" ); + self setspawnvariables(); - if ( self.pers[ "lives" ] == 0 ) - { - level notify( "player_eliminated" ); - self notify( "player_eliminated" ); - } - } - self.laststand = undefined; - self.revivingteammate = 0; - self.burning = undefined; - self.nextkillstreakfree = undefined; - self.activeuavs = 0; - self.activecounteruavs = 0; - self.activesatellites = 0; - self.deathmachinekills = 0; - self.disabledweapon = 0; - self resetusability(); - self maps/mp/gametypes/_globallogic_player::resetattackerlist(); - self.diedonvehicle = undefined; - if ( !self.wasaliveatmatchstart ) - { - if ( level.ingraceperiod || maps/mp/gametypes/_globallogic_utils::gettimepassed() < 20000 ) - { - self.wasaliveatmatchstart = 1; - } - } - self setdepthoffield( 0, 0, 512, 512, 4, 0 ); - self resetfov(); - pixbeginevent( "onSpawnPlayer" ); - if ( isDefined( level.onspawnplayerunified ) && getDvarInt( "scr_disableunifiedspawning" ) == 0 ) - { - self [[ level.onspawnplayerunified ]](); - } - else - { - self [[ level.onspawnplayer ]]( 0 ); - } - if ( isDefined( level.playerspawnedcb ) ) - { - self [[ level.playerspawnedcb ]](); - } - pixendevent(); - pixendevent(); - level thread maps/mp/gametypes/_globallogic::updateteamstatus(); - pixbeginevent( "spawnPlayer_postUTS" ); - self thread stoppoisoningandflareonspawn(); - self.sensorgrenadedata = undefined; - self stopburning(); - /* + if ( !self.hasspawned ) + { + self.underscorechance = 70; + self thread maps\mp\gametypes\_globallogic_audio::sndstartmusicsystem(); + } + + if ( isdefined( self.pers["resetMomentumOnSpawn"] ) && self.pers["resetMomentumOnSpawn"] ) + { + self maps\mp\gametypes\_globallogic_score::resetplayermomentumonspawn(); + self.pers["resetMomentumOnSpawn"] = undefined; + } + + if ( level.teambased ) + self.sessionteam = self.team; + else + { + self.sessionteam = "none"; + self.ffateam = self.team; + } + + hadspawned = self.hasspawned; + self.sessionstate = "playing"; + self.spectatorclient = -1; + self.killcamentity = -1; + self.archivetime = 0; + self.psoffsettime = 0; + self.statusicon = ""; + self.damagedplayers = []; + + if ( getdvarint( "scr_csmode" ) > 0 ) + self.maxhealth = getdvarint( "scr_csmode" ); + else + self.maxhealth = level.playermaxhealth; + + self.health = self.maxhealth; + self.friendlydamage = undefined; + self.hasspawned = 1; + self.spawntime = gettime(); + self.afk = 0; + + if ( self.pers["lives"] && ( !isdefined( level.takelivesondeath ) || level.takelivesondeath == 0 ) ) + { + self.pers["lives"]--; + + if ( self.pers["lives"] == 0 ) + { + level notify( "player_eliminated" ); + self notify( "player_eliminated" ); + } + } + + self.laststand = undefined; + self.revivingteammate = 0; + self.burning = undefined; + self.nextkillstreakfree = undefined; + self.activeuavs = 0; + self.activecounteruavs = 0; + self.activesatellites = 0; + self.deathmachinekills = 0; + self.disabledweapon = 0; + self resetusability(); + self maps\mp\gametypes\_globallogic_player::resetattackerlist(); + self.diedonvehicle = undefined; + + if ( !self.wasaliveatmatchstart ) + { + if ( level.ingraceperiod || maps\mp\gametypes\_globallogic_utils::gettimepassed() < 20000 ) + self.wasaliveatmatchstart = 1; + } + + self setdepthoffield( 0, 0, 512, 512, 4, 0 ); + self resetfov(); + pixbeginevent( "onSpawnPlayer" ); + + if ( isdefined( level.onspawnplayerunified ) && getdvarint( _hash_CF6EEB8B ) == 0 ) + self [[ level.onspawnplayerunified ]](); + else + self [[ level.onspawnplayer ]]( 0 ); + + if ( isdefined( level.playerspawnedcb ) ) + self [[ level.playerspawnedcb ]](); + + pixendevent(); + pixendevent(); + level thread maps\mp\gametypes\_globallogic::updateteamstatus(); + pixbeginevent( "spawnPlayer_postUTS" ); + self thread stoppoisoningandflareonspawn(); + self.sensorgrenadedata = undefined; + self stopburning(); /# - assert( maps/mp/gametypes/_globallogic_utils::isvalidclass( self.class ) ); + assert( maps\mp\gametypes\_globallogic_utils::isvalidclass( self.class ) ); #/ - */ - if ( sessionmodeiszombiesgame() ) - { - self maps/mp/gametypes/_class::giveloadoutlevelspecific( self.team, self.class ); - } - else - { - self maps/mp/gametypes/_class::setclass( self.class ); - self maps/mp/gametypes/_class::giveloadout( self.team, self.class ); - } - if ( level.inprematchperiod ) - { - self freeze_player_controls( 1 ); - team = self.pers[ "team" ]; - if ( isDefined( self.pers[ "music" ].spawn ) && self.pers[ "music" ].spawn == 0 ) - { - if ( level.wagermatch ) - { - music = "SPAWN_WAGER"; - } - else - { - music = game[ "music" ][ "spawn_" + team ]; - } - self thread maps/mp/gametypes/_globallogic_audio::set_music_on_player( music, 0, 0 ); - self.pers[ "music" ].spawn = 1; - } - if ( level.splitscreen ) - { - if ( isDefined( level.playedstartingmusic ) ) - { - music = undefined; - } - else - { - level.playedstartingmusic = 1; - } - } - self thread doinitialspawnmessaging(); - } - else - { - self freeze_player_controls( 0 ); - self enableweapons(); - if ( !hadspawned && game[ "state" ] == "playing" ) - { - pixbeginevent( "sound" ); - team = self.team; - if ( isDefined( self.pers[ "music" ].spawn ) && self.pers[ "music" ].spawn == 0 ) - { - music = game[ "music" ][ "spawn_short" + team ]; - self thread maps/mp/gametypes/_globallogic_audio::set_music_on_player( music, 0, 0 ); - self.pers[ "music" ].spawn = 1; - } - if ( level.splitscreen ) - { - if ( isDefined( level.playedstartingmusic ) ) - { - music = undefined; - } - else - { - level.playedstartingmusic = 1; - } - } - self thread doinitialspawnmessaging(); - pixendevent(); - } - } - if ( getDvar( "scr_showperksonspawn" ) == "" ) - { - setdvar( "scr_showperksonspawn", "0" ); - } - if ( level.hardcoremode ) - { - setdvar( "scr_showperksonspawn", "0" ); - } - if ( getDvarInt( "scr_showperksonspawn" ) == 1 && game[ "state" ] != "postgame" ) - { - pixbeginevent( "showperksonspawn" ); - if ( level.perksenabled == 1 ) - { - self maps/mp/gametypes/_hud_util::showperks(); - } - self thread maps/mp/gametypes/_globallogic_ui::hideloadoutaftertime( 3 ); - self thread maps/mp/gametypes/_globallogic_ui::hideloadoutondeath(); - pixendevent(); - } - if ( isDefined( self.pers[ "momentum" ] ) ) - { - self.momentum = self.pers[ "momentum" ]; - } - pixendevent(); - waittillframeend; - self notify( "spawned_player" ); - self logstring( "S " + self.origin[ 0 ] + " " + self.origin[ 1 ] + " " + self.origin[ 2 ] ); - setdvar( "scr_selecting_location", "" ); - if ( self is_bot() ) - { - pixbeginevent( "bot" ); - self thread maps/mp/bots/_bot::bot_spawn(); - pixendevent(); - } - if ( !sessionmodeiszombiesgame() ) - { - self thread maps/mp/killstreaks/_killstreaks::killstreakwaiter(); - self thread maps/mp/_vehicles::vehicledeathwaiter(); - self thread maps/mp/_vehicles::turretdeathwaiter(); - } - /* + + if ( sessionmodeiszombiesgame() ) + self maps\mp\gametypes\_class::giveloadoutlevelspecific( self.team, self.class ); + else + { + self maps\mp\gametypes\_class::setclass( self.class ); + self maps\mp\gametypes\_class::giveloadout( self.team, self.class ); + } + + if ( level.inprematchperiod ) + { + self freeze_player_controls( 1 ); + team = self.pers["team"]; + + if ( isdefined( self.pers["music"].spawn ) && self.pers["music"].spawn == 0 ) + { + if ( level.wagermatch ) + music = "SPAWN_WAGER"; + else + music = game["music"]["spawn_" + team]; + + self thread maps\mp\gametypes\_globallogic_audio::set_music_on_player( music, 0, 0 ); + self.pers["music"].spawn = 1; + } + + if ( level.splitscreen ) + { + if ( isdefined( level.playedstartingmusic ) ) + music = undefined; + else + level.playedstartingmusic = 1; + } + + self thread doinitialspawnmessaging(); + } + else + { + self freeze_player_controls( 0 ); + self enableweapons(); + + if ( !hadspawned && game["state"] == "playing" ) + { + pixbeginevent( "sound" ); + team = self.team; + + if ( isdefined( self.pers["music"].spawn ) && self.pers["music"].spawn == 0 ) + { + music = game["music"]["spawn_short" + team]; + self thread maps\mp\gametypes\_globallogic_audio::set_music_on_player( music, 0, 0 ); + self.pers["music"].spawn = 1; + } + + if ( level.splitscreen ) + { + if ( isdefined( level.playedstartingmusic ) ) + music = undefined; + else + level.playedstartingmusic = 1; + } + + self thread doinitialspawnmessaging(); + pixendevent(); + } + } + + if ( getdvar( "scr_showperksonspawn" ) == "" ) + setdvar( "scr_showperksonspawn", "0" ); + + if ( level.hardcoremode ) + setdvar( "scr_showperksonspawn", "0" ); + + if ( getdvarint( "scr_showperksonspawn" ) == 1 && game["state"] != "postgame" ) + { + pixbeginevent( "showperksonspawn" ); + + if ( level.perksenabled == 1 ) + self maps\mp\gametypes\_hud_util::showperks(); + + self thread maps\mp\gametypes\_globallogic_ui::hideloadoutaftertime( 3.0 ); + self thread maps\mp\gametypes\_globallogic_ui::hideloadoutondeath(); + pixendevent(); + } + + if ( isdefined( self.pers["momentum"] ) ) + self.momentum = self.pers["momentum"]; + + pixendevent(); + waittillframeend; + self notify( "spawned_player" ); + self logstring( "S " + self.origin[0] + " " + self.origin[1] + " " + self.origin[2] ); + setdvar( "scr_selecting_location", "" ); + + if ( self is_bot() ) + { + pixbeginevent( "bot" ); + self thread maps\mp\bots\_bot::bot_spawn(); + pixendevent(); + } + + if ( !sessionmodeiszombiesgame() ) + { + self thread maps\mp\killstreaks\_killstreaks::killstreakwaiter(); + self thread maps\mp\_vehicles::vehicledeathwaiter(); + self thread maps\mp\_vehicles::turretdeathwaiter(); + } + /# - if ( getDvarInt( "scr_xprate" ) > 0 ) - { - self thread maps/mp/gametypes/_globallogic_score::xpratethread(); + if ( getdvarint( _hash_F8D00F60 ) > 0 ) + self thread maps\mp\gametypes\_globallogic_score::xpratethread(); #/ - } - */ - if ( game[ "state" ] == "postgame" ) - { - /* + + if ( game["state"] == "postgame" ) + { /# - assert( !level.intermission ); + assert( !level.intermission ); #/ - */ - self maps/mp/gametypes/_globallogic_player::freezeplayerforroundend(); - } + self maps\mp\gametypes\_globallogic_player::freezeplayerforroundend(); + } } -spawnspectator( origin, angles ) //checked matches cerberus output +spawnspectator( origin, angles ) { - self notify( "spawned" ); - self notify( "end_respawn" ); - in_spawnspectator( origin, angles ); + self notify( "spawned" ); + self notify( "end_respawn" ); + in_spawnspectator( origin, angles ); } -respawn_asspectator( origin, angles ) //checked matches cerberus output +respawn_asspectator( origin, angles ) { - in_spawnspectator( origin, angles ); + in_spawnspectator( origin, angles ); } -in_spawnspectator( origin, angles ) //checked matches cerberus output +in_spawnspectator( origin, angles ) { - pixmarker( "BEGIN: in_spawnSpectator" ); - self setspawnvariables(); - if ( self.pers[ "team" ] == "spectator" ) - { - self clearlowermessage(); - } - self.sessionstate = "spectator"; - self.spectatorclient = -1; - self.killcamentity = -1; - self.archivetime = 0; - self.psoffsettime = 0; - self.friendlydamage = undefined; - if ( self.pers[ "team" ] == "spectator" ) - { - self.statusicon = ""; - } - else - { - self.statusicon = "hud_status_dead"; - } - maps/mp/gametypes/_spectating::setspectatepermissionsformachine(); - [[ level.onspawnspectator ]]( origin, angles ); - if ( level.teambased && !level.splitscreen ) - { - self thread spectatorthirdpersonness(); - } - level thread maps/mp/gametypes/_globallogic::updateteamstatus(); - pixmarker( "END: in_spawnSpectator" ); + pixmarker( "BEGIN: in_spawnSpectator" ); + self setspawnvariables(); + + if ( self.pers["team"] == "spectator" ) + self clearlowermessage(); + + self.sessionstate = "spectator"; + self.spectatorclient = -1; + self.killcamentity = -1; + self.archivetime = 0; + self.psoffsettime = 0; + self.friendlydamage = undefined; + + if ( self.pers["team"] == "spectator" ) + self.statusicon = ""; + else + self.statusicon = "hud_status_dead"; + + maps\mp\gametypes\_spectating::setspectatepermissionsformachine(); + [[ level.onspawnspectator ]]( origin, angles ); + + if ( level.teambased && !level.splitscreen ) + self thread spectatorthirdpersonness(); + + level thread maps\mp\gametypes\_globallogic::updateteamstatus(); + pixmarker( "END: in_spawnSpectator" ); } -spectatorthirdpersonness() //checked matches cerberus output +spectatorthirdpersonness() { - self endon( "disconnect" ); - self endon( "spawned" ); - self notify( "spectator_thirdperson_thread" ); - self endon( "spectator_thirdperson_thread" ); - self.spectatingthirdperson = 0; + self endon( "disconnect" ); + self endon( "spawned" ); + self notify( "spectator_thirdperson_thread" ); + self endon( "spectator_thirdperson_thread" ); + self.spectatingthirdperson = 0; } -forcespawn( time ) //checked matches cerberus output +forcespawn( time ) { - self endon( "death" ); - self endon( "disconnect" ); - self endon( "spawned" ); - if ( !isDefined( time ) ) - { - time = 60; - } - wait time; - if ( self.hasspawned ) - { - return; - } - if ( self.pers[ "team" ] == "spectator" ) - { - return; - } - if ( !maps/mp/gametypes/_globallogic_utils::isvalidclass( self.pers[ "class" ] ) ) - { - self.pers[ "class" ] = "CLASS_CUSTOM1"; - self.class = self.pers[ "class" ]; - } - self maps/mp/gametypes/_globallogic_ui::closemenus(); - self thread [[ level.spawnclient ]](); + self endon( "death" ); + self endon( "disconnect" ); + self endon( "spawned" ); + + if ( !isdefined( time ) ) + time = 60; + + wait( time ); + + if ( self.hasspawned ) + return; + + if ( self.pers["team"] == "spectator" ) + return; + + if ( !maps\mp\gametypes\_globallogic_utils::isvalidclass( self.pers["class"] ) ) + { + self.pers["class"] = "CLASS_CUSTOM1"; + self.class = self.pers["class"]; + } + + self maps\mp\gametypes\_globallogic_ui::closemenus(); + self thread [[ level.spawnclient ]](); } -kickifdontspawn() //checked matches cerberus output +kickifdontspawn() { - /* /# - if ( getDvarInt( "scr_hostmigrationtest" ) == 1 ) - { - return; + if ( getdvarint( "scr_hostmigrationtest" ) == 1 ) + return; #/ - } - */ - if ( self ishost() ) - { - return; - } - self kickifidontspawninternal(); + + if ( self ishost() ) + return; + + self kickifidontspawninternal(); } -kickifidontspawninternal() //checked matches cerberus output dvars taken from beta dump +kickifidontspawninternal() { - self endon( "death" ); - self endon( "disconnect" ); - self endon( "spawned" ); - waittime = 90; - if ( getDvar( "scr_kick_time" ) != "" ) - { - waittime = getDvarFloat( "scr_kick_time" ); - } - mintime = 45; - if ( getDvar( "scr_kick_time" ) != "" ) - { - mintime = getDvarFloat( "scr_kick_time" ); - } - starttime = getTime(); - kickwait( waittime ); - timepassed = ( getTime() - starttime ) / 1000; - if ( timepassed < ( waittime - 0.1 ) && timepassed < mintime ) - { - return; - } - if ( self.hasspawned ) - { - return; - } - if ( sessionmodeisprivate() ) - { - return; - } - if ( self.pers[ "team" ] == "spectator" ) - { - return; - } - if ( !mayspawn() ) - { - return; - } - maps/mp/gametypes/_globallogic::gamehistoryplayerkicked(); - kick( self getentitynumber() ); + self endon( "death" ); + self endon( "disconnect" ); + self endon( "spawned" ); + waittime = 90; + + if ( getdvar( _hash_4257CF5C ) != "" ) + waittime = getdvarfloat( _hash_4257CF5C ); + + mintime = 45; + + if ( getdvar( _hash_DF057E0 ) != "" ) + mintime = getdvarfloat( _hash_DF057E0 ); + + starttime = gettime(); + kickwait( waittime ); + timepassed = ( gettime() - starttime ) / 1000; + + if ( timepassed < waittime - 0.1 && timepassed < mintime ) + return; + + if ( self.hasspawned ) + return; + + if ( sessionmodeisprivate() ) + return; + + if ( self.pers["team"] == "spectator" ) + return; + + if ( !mayspawn() ) + return; + + maps\mp\gametypes\_globallogic::gamehistoryplayerkicked(); + kick( self getentitynumber() ); } -kickwait( waittime ) //checked matches cerberus output +kickwait( waittime ) { - level endon( "game_ended" ); - maps/mp/gametypes/_hostmigration::waitlongdurationwithhostmigrationpause( waittime ); + level endon( "game_ended" ); + maps\mp\gametypes\_hostmigration::waitlongdurationwithhostmigrationpause( waittime ); } -spawninterroundintermission() //checked matches cerberus output +spawninterroundintermission() { - self notify( "spawned" ); - self notify( "end_respawn" ); - self setspawnvariables(); - self clearlowermessage(); - self freeze_player_controls( 0 ); - self.sessionstate = "spectator"; - self.spectatorclient = -1; - self.killcamentity = -1; - self.archivetime = 0; - self.psoffsettime = 0; - self.friendlydamage = undefined; - self maps/mp/gametypes/_globallogic_defaults::default_onspawnintermission(); - self setorigin( self.origin ); - self setplayerangles( self.angles ); - self setdepthoffield( 0, 128, 512, 4000, 6, 1.8 ); + self notify( "spawned" ); + self notify( "end_respawn" ); + self setspawnvariables(); + self clearlowermessage(); + self freeze_player_controls( 0 ); + self.sessionstate = "spectator"; + self.spectatorclient = -1; + self.killcamentity = -1; + self.archivetime = 0; + self.psoffsettime = 0; + self.friendlydamage = undefined; + self maps\mp\gametypes\_globallogic_defaults::default_onspawnintermission(); + self setorigin( self.origin ); + self setplayerangles( self.angles ); + self setdepthoffield( 0, 128, 512, 4000, 6, 1.8 ); } -spawnintermission( usedefaultcallback ) //checked matches cerberus output +spawnintermission( usedefaultcallback ) { - self notify( "spawned" ); - self notify( "end_respawn" ); - self endon( "disconnect" ); - self setspawnvariables(); - self clearlowermessage(); - self freeze_player_controls( 0 ); - self.sessionstate = "intermission"; - self.spectatorclient = -1; - self.killcamentity = -1; - self.archivetime = 0; - self.psoffsettime = 0; - self.friendlydamage = undefined; - if ( is_true( usedefaultcallback ) ) - { - maps/mp/gametypes/_globallogic_defaults::default_onspawnintermission(); - } - else - { - [[ level.onspawnintermission ]](); - } - self setdepthoffield( 0, 128, 512, 4000, 6, 1.8 ); + self notify( "spawned" ); + self notify( "end_respawn" ); + self endon( "disconnect" ); + self setspawnvariables(); + self clearlowermessage(); + self freeze_player_controls( 0 ); + self.sessionstate = "intermission"; + self.spectatorclient = -1; + self.killcamentity = -1; + self.archivetime = 0; + self.psoffsettime = 0; + self.friendlydamage = undefined; + + if ( isdefined( usedefaultcallback ) && usedefaultcallback ) + maps\mp\gametypes\_globallogic_defaults::default_onspawnintermission(); + else + [[ level.onspawnintermission ]](); + + self setdepthoffield( 0, 128, 512, 4000, 6, 1.8 ); } -spawnqueuedclientonteam( team ) //checked partially changed to match cerberus output did not use continue in for loop see github info.md +spawnqueuedclientonteam( team ) { - player_to_spawn = undefined; - for ( i = 0; i < level.deadplayers[ team ].size; i++ ) - { - player = level.deadplayers[ team ][ i ]; - if ( player.waitingtospawn ) - { - } - else - { - player_to_spawn = player; - break; - } - } - if ( isDefined( player_to_spawn ) ) - { - player_to_spawn.allowqueuespawn = 1; - player_to_spawn maps/mp/gametypes/_globallogic_ui::closemenus(); - player_to_spawn thread [[ level.spawnclient ]](); - } + player_to_spawn = undefined; + + for ( i = 0; i < level.deadplayers[team].size; i++ ) + { + player = level.deadplayers[team][i]; + + if ( player.waitingtospawn ) + continue; + + player_to_spawn = player; + break; + } + + if ( isdefined( player_to_spawn ) ) + { + player_to_spawn.allowqueuespawn = 1; + player_to_spawn maps\mp\gametypes\_globallogic_ui::closemenus(); + player_to_spawn thread [[ level.spawnclient ]](); + } } -spawnqueuedclient( dead_player_team, killer ) //checked partially changed to match cerberus output did not use continue in foreach see github info.md +spawnqueuedclient( dead_player_team, killer ) { - if ( !level.playerqueuedrespawn ) - { - return; - } - maps/mp/gametypes/_globallogic_utils::waittillslowprocessallowed(); - spawn_team = undefined; - if ( isDefined( killer ) && isDefined( killer.team ) && isDefined( level.teams[ killer.team ] ) ) - { - spawn_team = killer.team; - } - if ( isDefined( spawn_team ) ) - { - spawnqueuedclientonteam( spawn_team ); - return; - } - foreach ( team in level.teams ) - { - if ( team == dead_player_team ) - { - } - else - { - spawnqueuedclientonteam( team ); - } - } + if ( !level.playerqueuedrespawn ) + return; + + maps\mp\gametypes\_globallogic_utils::waittillslowprocessallowed(); + spawn_team = undefined; + + if ( isdefined( killer ) && isdefined( killer.team ) && isdefined( level.teams[killer.team] ) ) + spawn_team = killer.team; + + if ( isdefined( spawn_team ) ) + { + spawnqueuedclientonteam( spawn_team ); + return; + } + + foreach ( team in level.teams ) + { + if ( team == dead_player_team ) + continue; + + spawnqueuedclientonteam( team ); + } } -allteamsnearscorelimit() //checked changed to match cerberus output +allteamsnearscorelimit() { - if ( !level.teambased ) - { - return 0; - } - if ( level.scorelimit <= 1 ) - { - return 0; - } - foreach ( team in level.teams ) - { - if ( ( level.scorelimit - 1 ) < game[ "teamScores" ][ team ] ) - { - return 0; - } - } - return 1; + if ( !level.teambased ) + return false; + + if ( level.scorelimit <= 1 ) + return false; + + foreach ( team in level.teams ) + { + if ( !( game["teamScores"][team] >= level.scorelimit - 1 ) ) + return false; + } + + return true; } -shouldshowrespawnmessage() //checked matches cerberus output +shouldshowrespawnmessage() { - if ( waslastround() ) - { - return 0; - } - if ( isoneround() ) - { - return 0; - } - if ( is_true( level.livesdonotreset ) ) - { - return 0; - } - if ( allteamsnearscorelimit() ) - { - return 0; - } - return 1; + if ( waslastround() ) + return false; + + if ( isoneround() ) + return false; + + if ( isdefined( level.livesdonotreset ) && level.livesdonotreset ) + return false; + + if ( allteamsnearscorelimit() ) + return false; + + return true; } -default_spawnmessage() //checked matches cerberus output +default_spawnmessage() { - setlowermessage( game[ "strings" ][ "spawn_next_round" ] ); - self thread maps/mp/gametypes/_globallogic_ui::removespawnmessageshortly( 3 ); + setlowermessage( game["strings"]["spawn_next_round"] ); + self thread maps\mp\gametypes\_globallogic_ui::removespawnmessageshortly( 3 ); } -showspawnmessage() //checked matches cerberus output +showspawnmessage() { - if ( shouldshowrespawnmessage() ) - { - self thread [[ level.spawnmessage ]](); - } + if ( shouldshowrespawnmessage() ) + self thread [[ level.spawnmessage ]](); } -spawnclient( timealreadypassed ) //checked matches cerberus output +spawnclient( timealreadypassed ) { - pixbeginevent( "spawnClient" ); - /* + pixbeginevent( "spawnClient" ); /# - assert( isDefined( self.team ) ); + assert( isdefined( self.team ) ); #/ /# - assert( maps/mp/gametypes/_globallogic_utils::isvalidclass( self.class ) ); + assert( maps\mp\gametypes\_globallogic_utils::isvalidclass( self.class ) ); #/ - */ - if ( !self mayspawn() ) - { - currentorigin = self.origin; - currentangles = self.angles; - self showspawnmessage(); - self thread [[ level.spawnspectator ]]( currentorigin + vectorScale( ( 0, 0, 1 ), 60 ), currentangles ); - pixendevent(); - return; - } - if ( self.waitingtospawn ) - { - pixendevent(); - return; - } - self.waitingtospawn = 1; - self.allowqueuespawn = undefined; - self waitandspawnclient( timealreadypassed ); - if ( isDefined( self ) ) - { - self.waitingtospawn = 0; - } - pixendevent(); + + if ( !self mayspawn() ) + { + currentorigin = self.origin; + currentangles = self.angles; + self showspawnmessage(); + self thread [[ level.spawnspectator ]]( currentorigin + vectorscale( ( 0, 0, 1 ), 60.0 ), currentangles ); + pixendevent(); + return; + } + + if ( self.waitingtospawn ) + { + pixendevent(); + return; + } + + self.waitingtospawn = 1; + self.allowqueuespawn = undefined; + self waitandspawnclient( timealreadypassed ); + + if ( isdefined( self ) ) + self.waitingtospawn = 0; + + pixendevent(); } -waitandspawnclient( timealreadypassed ) //checked matches cerberus output +waitandspawnclient( timealreadypassed ) { - self endon( "disconnect" ); - self endon( "end_respawn" ); - level endon( "game_ended" ); - if ( !isDefined( timealreadypassed ) ) - { - timealreadypassed = 0; - } - spawnedasspectator = 0; - if ( is_true( self.teamkillpunish ) ) - { - teamkilldelay = maps/mp/gametypes/_globallogic_player::teamkilldelay(); - if ( teamkilldelay > timealreadypassed ) - { - teamkilldelay -= timealreadypassed; - timealreadypassed = 0; - } - else - { - timealreadypassed -= teamkilldelay; - teamkilldelay = 0; - } - if ( teamkilldelay > 0 ) - { - setlowermessage( &"MP_FRIENDLY_FIRE_WILL_NOT", teamkilldelay ); - self thread respawn_asspectator( self.origin + vectorScale( ( 0, 0, 1 ), 60 ), self.angles ); - spawnedasspectator = 1; - wait teamkilldelay; - } - self.teamkillpunish = 0; - } - if ( !isDefined( self.wavespawnindex ) && isDefined( level.waveplayerspawnindex[ self.team ] ) ) - { - self.wavespawnindex = level.waveplayerspawnindex[ self.team ]; - level.waveplayerspawnindex[ self.team ]++; - } - timeuntilspawn = timeuntilspawn( 0 ); - if ( timeuntilspawn > timealreadypassed ) - { - timeuntilspawn -= timealreadypassed; - timealreadypassed = 0; - } - else - { - timealreadypassed -= timeuntilspawn; - timeuntilspawn = 0; - } - if ( timeuntilspawn > 0 ) - { - if ( level.playerqueuedrespawn ) - { - setlowermessage( game[ "strings" ][ "you_will_spawn" ], timeuntilspawn ); - } - else if ( self issplitscreen() ) - { - setlowermessage( game[ "strings" ][ "waiting_to_spawn_ss" ], timeuntilspawn, 1 ); - } - else - { - setlowermessage( game[ "strings" ][ "waiting_to_spawn" ], timeuntilspawn ); - } - if ( !spawnedasspectator ) - { - spawnorigin = self.origin + vectorScale( ( 0, 0, 1 ), 60 ); - spawnangles = self.angles; - if ( isDefined( level.useintermissionpointsonwavespawn ) && [[ level.useintermissionpointsonwavespawn ]]() == 1 ) - { - spawnpoint = maps/mp/gametypes/_spawnlogic::getrandomintermissionpoint(); - if ( isDefined( spawnpoint ) ) - { - spawnorigin = spawnpoint.origin; - spawnangles = spawnpoint.angles; - } - } - self thread respawn_asspectator( spawnorigin, spawnangles ); - } - spawnedasspectator = 1; - self maps/mp/gametypes/_globallogic_utils::waitfortimeornotify( timeuntilspawn, "force_spawn" ); - self notify( "stop_wait_safe_spawn_button" ); - } - if ( isDefined( level.gametypespawnwaiter ) ) - { - if ( !spawnedasspectator ) - { - self thread respawn_asspectator( self.origin + vectorScale( ( 0, 0, 1 ), 60 ), self.angles ); - } - spawnedasspectator = 1; - if ( !( self [[ level.gametypespawnwaiter ]]() ) ) - { - self.waitingtospawn = 0; - self clearlowermessage(); - self.wavespawnindex = undefined; - self.respawntimerstarttime = undefined; - return; - } - } - wavebased = level.waverespawndelay > 0; - if ( !level.playerforcerespawn && self.hasspawned && !wavebased && !self.wantsafespawn && !level.playerqueuedrespawn ) - { - setlowermessage( game[ "strings" ][ "press_to_spawn" ] ); - if ( !spawnedasspectator ) - { - self thread respawn_asspectator( self.origin + vectorScale( ( 0, 0, 1 ), 60 ), self.angles ); - } - spawnedasspectator = 1; - self waitrespawnorsafespawnbutton(); - } - self.waitingtospawn = 0; - self clearlowermessage(); - self.wavespawnindex = undefined; - self.respawntimerstarttime = undefined; - self thread [[ level.spawnplayer ]](); + self endon( "disconnect" ); + self endon( "end_respawn" ); + level endon( "game_ended" ); + + if ( !isdefined( timealreadypassed ) ) + timealreadypassed = 0; + + spawnedasspectator = 0; + + if ( is_true( self.teamkillpunish ) ) + { + teamkilldelay = maps\mp\gametypes\_globallogic_player::teamkilldelay(); + + if ( teamkilldelay > timealreadypassed ) + { + teamkilldelay -= timealreadypassed; + timealreadypassed = 0; + } + else + { + timealreadypassed -= teamkilldelay; + teamkilldelay = 0; + } + + if ( teamkilldelay > 0 ) + { + setlowermessage( &"MP_FRIENDLY_FIRE_WILL_NOT", teamkilldelay ); + self thread respawn_asspectator( self.origin + vectorscale( ( 0, 0, 1 ), 60.0 ), self.angles ); + spawnedasspectator = 1; + wait( teamkilldelay ); + } + + self.teamkillpunish = 0; + } + + if ( !isdefined( self.wavespawnindex ) && isdefined( level.waveplayerspawnindex[self.team] ) ) + { + self.wavespawnindex = level.waveplayerspawnindex[self.team]; + level.waveplayerspawnindex[self.team]++; + } + + timeuntilspawn = timeuntilspawn( 0 ); + + if ( timeuntilspawn > timealreadypassed ) + { + timeuntilspawn -= timealreadypassed; + timealreadypassed = 0; + } + else + { + timealreadypassed -= timeuntilspawn; + timeuntilspawn = 0; + } + + if ( timeuntilspawn > 0 ) + { + if ( level.playerqueuedrespawn ) + setlowermessage( game["strings"]["you_will_spawn"], timeuntilspawn ); + else if ( self issplitscreen() ) + setlowermessage( game["strings"]["waiting_to_spawn_ss"], timeuntilspawn, 1 ); + else + setlowermessage( game["strings"]["waiting_to_spawn"], timeuntilspawn ); + + if ( !spawnedasspectator ) + { + spawnorigin = self.origin + vectorscale( ( 0, 0, 1 ), 60.0 ); + spawnangles = self.angles; + + if ( isdefined( level.useintermissionpointsonwavespawn ) && [[ level.useintermissionpointsonwavespawn ]]() == 1 ) + { + spawnpoint = maps\mp\gametypes\_spawnlogic::getrandomintermissionpoint(); + + if ( isdefined( spawnpoint ) ) + { + spawnorigin = spawnpoint.origin; + spawnangles = spawnpoint.angles; + } + } + + self thread respawn_asspectator( spawnorigin, spawnangles ); + } + + spawnedasspectator = 1; + self maps\mp\gametypes\_globallogic_utils::waitfortimeornotify( timeuntilspawn, "force_spawn" ); + self notify( "stop_wait_safe_spawn_button" ); + } + + if ( isdefined( level.gametypespawnwaiter ) ) + { + if ( !spawnedasspectator ) + self thread respawn_asspectator( self.origin + vectorscale( ( 0, 0, 1 ), 60.0 ), self.angles ); + + spawnedasspectator = 1; + + if ( !self [[ level.gametypespawnwaiter ]]() ) + { + self.waitingtospawn = 0; + self clearlowermessage(); + self.wavespawnindex = undefined; + self.respawntimerstarttime = undefined; + return; + } + } + + wavebased = level.waverespawndelay > 0; + + if ( !level.playerforcerespawn && self.hasspawned && !wavebased && !self.wantsafespawn && !level.playerqueuedrespawn ) + { + setlowermessage( game["strings"]["press_to_spawn"] ); + + if ( !spawnedasspectator ) + self thread respawn_asspectator( self.origin + vectorscale( ( 0, 0, 1 ), 60.0 ), self.angles ); + + spawnedasspectator = 1; + self waitrespawnorsafespawnbutton(); + } + + self.waitingtospawn = 0; + self clearlowermessage(); + self.wavespawnindex = undefined; + self.respawntimerstarttime = undefined; + self thread [[ level.spawnplayer ]](); } -waitrespawnorsafespawnbutton() //checked changed to match cerberus output +waitrespawnorsafespawnbutton() { - self endon( "disconnect" ); - self endon( "end_respawn" ); - while ( 1 ) - { - if ( self usebuttonpressed() ) - { - return; - } - wait 0.05; - } + self endon( "disconnect" ); + self endon( "end_respawn" ); + + while ( true ) + { + if ( self usebuttonpressed() ) + break; + + wait 0.05; + } } -waitinspawnqueue() //checked matches cerberus output +waitinspawnqueue() { - self endon( "disconnect" ); - self endon( "end_respawn" ); - if ( !level.ingraceperiod && !level.usestartspawns ) - { - currentorigin = self.origin; - currentangles = self.angles; - self thread [[ level.spawnspectator ]]( currentorigin + vectorScale( ( 0, 0, 1 ), 60 ), currentangles ); - self waittill( "queue_respawn" ); - } + self endon( "disconnect" ); + self endon( "end_respawn" ); + + if ( !level.ingraceperiod && !level.usestartspawns ) + { + currentorigin = self.origin; + currentangles = self.angles; + self thread [[ level.spawnspectator ]]( currentorigin + vectorscale( ( 0, 0, 1 ), 60.0 ), currentangles ); + + self waittill( "queue_respawn" ); + } } -setthirdperson( value ) //checked matches cerberus output +setthirdperson( value ) { - if ( !level.console ) - { - return; - } - if ( !isDefined( self.spectatingthirdperson ) || value != self.spectatingthirdperson ) - { - self.spectatingthirdperson = value; - if ( value ) - { - self setclientthirdperson( 1 ); - self setdepthoffield( 0, 128, 512, 4000, 6, 1.8 ); - } - else - { - self setclientthirdperson( 0 ); - self setdepthoffield( 0, 0, 512, 4000, 4, 0 ); - } - self resetfov(); - } + if ( !level.console ) + return; + + if ( !isdefined( self.spectatingthirdperson ) || value != self.spectatingthirdperson ) + { + self.spectatingthirdperson = value; + + if ( value ) + { + self setclientthirdperson( 1 ); + self setdepthoffield( 0, 128, 512, 4000, 6, 1.8 ); + } + else + { + self setclientthirdperson( 0 ); + self setdepthoffield( 0, 0, 512, 4000, 4, 0 ); + } + + self resetfov(); + } } -setspawnvariables() //checked matches cerberus output +setspawnvariables() { - resettimeout(); - self stopshellshock(); - self stoprumble( "damage_heavy" ); + resettimeout(); + self stopshellshock(); + self stoprumble( "damage_heavy" ); } - - diff --git a/Multiplayer Core/patch_mp/maps/mp/gametypes/_globallogic_ui.gsc b/Multiplayer Core/patch_mp/maps/mp/gametypes/_globallogic_ui.gsc index e867d60..6881a21 100644 --- a/Multiplayer Core/patch_mp/maps/mp/gametypes/_globallogic_ui.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/gametypes/_globallogic_ui.gsc @@ -1,686 +1,629 @@ -//checked includes match cerberus output -#include maps/mp/gametypes/_class; -#include maps/mp/gametypes/_globallogic_player; -#include maps/mp/gametypes/_spectating; -#include maps/mp/gametypes/_globallogic; -#include maps/mp/gametypes/_pregame; -#include maps/mp/teams/_teams; -#include maps/mp/bots/_bot; -#include maps/mp/killstreaks/_killstreaks; -#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 -init() //checked matches cerberus output +init() { - precachestring( &"MP_HALFTIME" ); - precachestring( &"MP_OVERTIME" ); - precachestring( &"MP_ROUNDEND" ); - precachestring( &"MP_INTERMISSION" ); - precachestring( &"MP_SWITCHING_SIDES_CAPS" ); - precachestring( &"MP_FRIENDLY_FIRE_WILL_NOT" ); - precachestring( &"MP_RAMPAGE" ); - precachestring( &"medal_received" ); - precachestring( &"killstreak_received" ); - precachestring( &"prox_grenade_notify" ); - precachestring( &"player_callout" ); - precachestring( &"score_event" ); - precachestring( &"rank_up" ); - precachestring( &"gun_level_complete" ); - precachestring( &"challenge_complete" ); - if ( level.splitscreen ) - { - precachestring( &"MP_ENDED_GAME" ); - } - else - { - precachestring( &"MP_HOST_ENDED_GAME" ); - } + precachestring( &"MP_HALFTIME" ); + precachestring( &"MP_OVERTIME" ); + precachestring( &"MP_ROUNDEND" ); + precachestring( &"MP_INTERMISSION" ); + precachestring( &"MP_SWITCHING_SIDES_CAPS" ); + precachestring( &"MP_FRIENDLY_FIRE_WILL_NOT" ); + precachestring( &"MP_RAMPAGE" ); + precachestring( &"medal_received" ); + precachestring( &"killstreak_received" ); + precachestring( &"prox_grenade_notify" ); + precachestring( &"player_callout" ); + precachestring( &"score_event" ); + precachestring( &"rank_up" ); + precachestring( &"gun_level_complete" ); + precachestring( &"challenge_complete" ); + + if ( level.splitscreen ) + precachestring( &"MP_ENDED_GAME" ); + else + precachestring( &"MP_HOST_ENDED_GAME" ); } -setupcallbacks() //checked matches cerberus output +setupcallbacks() { - level.autoassign = ::menuautoassign; - level.spectator = ::menuspectator; - level.class = ::menuclass; - level.teammenu = ::menuteam; + level.autoassign = ::menuautoassign; + level.spectator = ::menuspectator; + level.class = ::menuclass; + level.teammenu = ::menuteam; } -hideloadoutaftertime( delay ) //checked matches cerberus output +hideloadoutaftertime( delay ) { - self endon( "disconnect" ); - self endon( "perks_hidden" ); - wait delay; - self thread hideallperks( 0.4 ); - self notify( "perks_hidden" ); + self endon( "disconnect" ); + self endon( "perks_hidden" ); + wait( delay ); + self thread hideallperks( 0.4 ); + self notify( "perks_hidden" ); } -hideloadoutondeath() //checked matches cerberus output +hideloadoutondeath() { - self endon( "disconnect" ); - self endon( "perks_hidden" ); - self waittill( "death" ); - self hideallperks(); - self notify( "perks_hidden" ); + self endon( "disconnect" ); + self endon( "perks_hidden" ); + + self waittill( "death" ); + + self hideallperks(); + self notify( "perks_hidden" ); } -hideloadoutonkill() //checked matches cerberus output +hideloadoutonkill() { - self endon( "disconnect" ); - self endon( "death" ); - self endon( "perks_hidden" ); - self waittill( "killed_player" ); - self hideallperks(); - self notify( "perks_hidden" ); + self endon( "disconnect" ); + self endon( "death" ); + self endon( "perks_hidden" ); + + self waittill( "killed_player" ); + + self hideallperks(); + self notify( "perks_hidden" ); } -freegameplayhudelems() //checked changed to match cerberus output +freegameplayhudelems() { - if ( isDefined( self.perkicon ) ) - { - for ( numspecialties = 0; numspecialties < level.maxspecialties; numspecialties++ ) - { - if ( isDefined( self.perkicon[ numspecialties ] ) ) - { - self.perkicon[ numspecialties ] destroyelem(); - self.perkname[ numspecialties ] destroyelem(); - } - } - } - if ( isDefined( self.perkhudelem ) ) - { - self.perkhudelem destroyelem(); - } - if ( isDefined( self.killstreakicon ) ) - { - if ( isDefined( self.killstreakicon[ 0 ] ) ) - { - self.killstreakicon[ 0 ] destroyelem(); - } - if ( isDefined( self.killstreakicon[ 1 ] ) ) - { - self.killstreakicon[ 1 ] destroyelem(); - } - if ( isDefined( self.killstreakicon[ 2 ] ) ) - { - self.killstreakicon[ 2 ] destroyelem(); - } - if ( isDefined( self.killstreakicon[ 3 ] ) ) - { - self.killstreakicon[ 3 ] destroyelem(); - } - if ( isDefined( self.killstreakicon[ 4 ] ) ) - { - self.killstreakicon[ 4 ] destroyelem(); - } - } - self notify( "perks_hidden" ); - if ( isDefined( self.lowermessage ) ) - { - self.lowermessage destroyelem(); - } - if ( isDefined( self.lowertimer ) ) - { - self.lowertimer destroyelem(); - } - if ( isDefined( self.proxbar ) ) - { - self.proxbar destroyelem(); - } - if ( isDefined( self.proxbartext ) ) - { - self.proxbartext destroyelem(); - } - if ( isDefined( self.carryicon ) ) - { - self.carryicon destroyelem(); - } - maps/mp/killstreaks/_killstreaks::destroykillstreaktimers(); + if ( isdefined( self.perkicon ) ) + { + for ( numspecialties = 0; numspecialties < level.maxspecialties; numspecialties++ ) + { + if ( isdefined( self.perkicon[numspecialties] ) ) + { + self.perkicon[numspecialties] destroyelem(); + self.perkname[numspecialties] destroyelem(); + } + } + } + + if ( isdefined( self.perkhudelem ) ) + self.perkhudelem destroyelem(); + + if ( isdefined( self.killstreakicon ) ) + { + if ( isdefined( self.killstreakicon[0] ) ) + self.killstreakicon[0] destroyelem(); + + if ( isdefined( self.killstreakicon[1] ) ) + self.killstreakicon[1] destroyelem(); + + if ( isdefined( self.killstreakicon[2] ) ) + self.killstreakicon[2] destroyelem(); + + if ( isdefined( self.killstreakicon[3] ) ) + self.killstreakicon[3] destroyelem(); + + if ( isdefined( self.killstreakicon[4] ) ) + self.killstreakicon[4] destroyelem(); + } + + self notify( "perks_hidden" ); + + if ( isdefined( self.lowermessage ) ) + self.lowermessage destroyelem(); + + if ( isdefined( self.lowertimer ) ) + self.lowertimer destroyelem(); + + if ( isdefined( self.proxbar ) ) + self.proxbar destroyelem(); + + if ( isdefined( self.proxbartext ) ) + self.proxbartext destroyelem(); + + if ( isdefined( self.carryicon ) ) + self.carryicon destroyelem(); + + maps\mp\killstreaks\_killstreaks::destroykillstreaktimers(); } -teamplayercountsequal( playercounts ) //checked partially changed to match cerberus output did not use continue see github for more info +teamplayercountsequal( playercounts ) { - count = undefined; - foreach ( team in level.teams ) - { - if ( !isDefined( count ) ) - { - count = playercounts[ team ]; - } - else - { - if ( count != playercounts[ team ] ) - { - return 0; - } - } - } - return 1; + count = undefined; + + foreach ( team in level.teams ) + { + if ( !isdefined( count ) ) + { + count = playercounts[team]; + continue; + } + + if ( count != playercounts[team] ) + return false; + } + + return true; } -teamwithlowestplayercount( playercounts, ignore_team ) //checked changed to match cerberus output +teamwithlowestplayercount( playercounts, ignore_team ) { - count = 9999; - lowest_team = undefined; - foreach ( team in level.teams ) - { - if ( count > playercounts[ team ] ) - { - count = playercounts[ team ]; - lowest_team = team; - } - } - return lowest_team; + count = 9999; + lowest_team = undefined; + + foreach ( team in level.teams ) + { + if ( count > playercounts[team] ) + { + count = playercounts[team]; + lowest_team = team; + } + } + + return lowest_team; } -menuautoassign( comingfrommenu ) //checked changed to match cerberus output +menuautoassign( comingfrommenu ) { - teamkeys = getarraykeys( level.teams ); - assignment = teamkeys[ randomint( teamkeys.size ) ]; - self closemenus(); - if ( is_true( level.forceallallies ) ) - { - assignment = "allies"; - } - else if ( level.teambased ) - { - if ( getDvarInt( "party_autoteams" ) == 1 ) - { - if ( level.allow_teamchange == "1" || self.hasspawned && comingfrommenu ) - { - assignment = ""; - } - } - else - { - team = getassignedteam( self ); - switch( team ) - { - case 1: - assignment = teamkeys[ 1 ]; - break; - case 2: - assignment = teamkeys[ 0 ]; - break; - case 3: - assignment = teamkeys[ 2 ]; - break; - case 4: - if ( !isDefined( level.forceautoassign ) || !level.forceautoassign ) - { - self setclientscriptmainmenu( game[ "menu_class" ] ); - return; - } - default: - assignment = ""; - if ( isDefined( level.teams[ team ] ) ) - { - assignment = team; - } - else if ( team == "spectator" && !level.forceautoassign ) - { - self setclientscriptmainmenu( game[ "menu_class" ] ); - return; - } - } - } - if ( assignment == "" || getDvarInt( "party_autoteams" ) == 0 ) - { - if ( sessionmodeiszombiesgame() ) - { - assignment = "allies"; - } - else if ( maps/mp/bots/_bot::is_bot_comp_stomp() ) - { - host = gethostplayerforbots(); - /* + teamkeys = getarraykeys( level.teams ); + assignment = teamkeys[randomint( teamkeys.size )]; + self closemenus(); + + if ( isdefined( level.forceallallies ) && level.forceallallies ) + assignment = "allies"; + else if ( level.teambased ) + { + if ( getdvarint( "party_autoteams" ) == 1 ) + { + if ( level.allow_teamchange == "1" && ( self.hasspawned || comingfrommenu ) ) + assignment = ""; + else + { + team = getassignedteam( self ); + + switch ( team ) + { + case 1: + assignment = teamkeys[1]; + break; + case 2: + assignment = teamkeys[0]; + break; + case 3: + assignment = teamkeys[2]; + break; + case 4: + if ( !isdefined( level.forceautoassign ) || !level.forceautoassign ) + { + self setclientscriptmainmenu( game["menu_class"] ); + return; + } + default: + assignment = ""; + + if ( isdefined( level.teams[team] ) ) + assignment = team; + else if ( team == "spectator" && !level.forceautoassign ) + { + self setclientscriptmainmenu( game["menu_class"] ); + return; + } + } + } + } + + if ( assignment == "" || getdvarint( "party_autoteams" ) == 0 ) + { + if ( sessionmodeiszombiesgame() ) + assignment = "allies"; + else if ( maps\mp\bots\_bot::is_bot_comp_stomp() ) + { + host = gethostplayerforbots(); /# - assert( isDefined( host ) ); + assert( isdefined( host ) ); #/ - */ - if ( !isDefined( host.team ) || host.team == "spectator" ) - { - host.team = random( teamkeys ); - } - if ( !self is_bot() ) - { - assignment = host.team; - } - else - { - assignment = getotherteam( host.team ); - } - } - else - { - playercounts = self maps/mp/teams/_teams::countplayers(); - if ( teamplayercountsequal( playercounts ) ) - { - if ( !level.splitscreen && self issplitscreen() ) - { - assignment = self getsplitscreenteam(); - if ( assignment == "" ) - { - assignment = pickteamfromscores( teamkeys ); - } - } - else - { - assignment = pickteamfromscores( teamkeys ); - } - } - else - { - assignment = teamwithlowestplayercount( playercounts, "none" ); - } - } - } - if ( assignment == self.pers[ "team" ] && self.sessionstate == "playing" || self.sessionstate == "dead" ) - { - self beginclasschoice(); - return; - } - } - else if ( getDvarInt( "party_autoteams" ) == 1 ) - { - if ( level.allow_teamchange != "1" || !self.hasspawned && !comingfrommenu ) - { - team = getassignedteam( self ); - if ( isDefined( level.teams[ team ] ) ) - { - assignment = team; - } - else if ( team == "spectator" && !level.forceautoassign ) - { - self setclientscriptmainmenu( game[ "menu_class" ] ); - return; - } - } - } - if ( assignment != self.pers[ "team" ] && self.sessionstate == "playing" || self.sessionstate == "dead" ) - { - self.switching_teams = 1; - self.joining_team = assignment; - self.leaving_team = self.pers[ "team" ]; - self suicide(); - } - self.pers[ "team" ] = assignment; - self.team = assignment; - self.pers["class"] = undefined; - self.class = undefined; - self.pers["weapon"] = undefined; - self.pers["savedmodel"] = undefined; - self updateobjectivetext(); - if ( level.teambased ) - { - self.sessionteam = assignment; - } - else - { - self.sessionteam = "none"; - self.ffateam = assignment; - } - if ( !isalive( self ) ) - { - self.statusicon = "hud_status_dead"; - } - self notify( "joined_team" ); - level notify( "joined_team" ); - self notify( "end_respawn" ); - if ( ispregame() ) - { - if ( !self is_bot() ) - { - pclass = self maps/mp/gametypes/_pregame::get_pregame_class(); - self closemenu(); - self closeingamemenu(); - self.selectedclass = 1; - self [[ level.class ]]( pclass ); - self setclientscriptmainmenu( game[ "menu_class" ] ); - return; - } - } - if ( ispregamegamestarted() ) - { - if ( self is_bot() && isDefined( self.pers[ "class" ] ) ) - { - pclass = self.pers[ "class" ]; - self closemenu(); - self closeingamemenu(); - self.selectedclass = 1; - self [[ level.class ]]( pclass ); - return; - } - } - self beginclasschoice(); - self setclientscriptmainmenu( game[ "menu_class" ] ); + + if ( !isdefined( host.team ) || host.team == "spectator" ) + host.team = random( teamkeys ); + + if ( !self is_bot() ) + assignment = host.team; + else + assignment = getotherteam( host.team ); + } + else + { + playercounts = self maps\mp\teams\_teams::countplayers(); + + if ( teamplayercountsequal( playercounts ) ) + { + if ( !level.splitscreen && self issplitscreen() ) + { + assignment = self getsplitscreenteam(); + + if ( assignment == "" ) + assignment = pickteamfromscores( teamkeys ); + } + else + assignment = pickteamfromscores( teamkeys ); + } + else + assignment = teamwithlowestplayercount( playercounts, "none" ); + } + } + + if ( assignment == self.pers["team"] && ( self.sessionstate == "playing" || self.sessionstate == "dead" ) ) + { + self beginclasschoice(); + return; + } + } + else if ( getdvarint( "party_autoteams" ) == 1 ) + { + if ( level.allow_teamchange != "1" || !self.hasspawned && !comingfrommenu ) + { + team = getassignedteam( self ); + + if ( isdefined( level.teams[team] ) ) + assignment = team; + else if ( team == "spectator" && !level.forceautoassign ) + { + self setclientscriptmainmenu( game["menu_class"] ); + return; + } + } + } + + if ( assignment != self.pers["team"] && ( self.sessionstate == "playing" || self.sessionstate == "dead" ) ) + { + self.switching_teams = 1; + self.joining_team = assignment; + self.leaving_team = self.pers["team"]; + self suicide(); + } + + self.pers["team"] = assignment; + self.team = assignment; + self.pers["class"] = undefined; + self.class = undefined; + self.pers["weapon"] = undefined; + self.pers["savedmodel"] = undefined; + self updateobjectivetext(); + + if ( level.teambased ) + self.sessionteam = assignment; + else + { + self.sessionteam = "none"; + self.ffateam = assignment; + } + + if ( !isalive( self ) ) + self.statusicon = "hud_status_dead"; + + self notify( "joined_team" ); + level notify( "joined_team" ); + self notify( "end_respawn" ); + + if ( ispregame() ) + { + if ( !self is_bot() ) + { + pclass = self maps\mp\gametypes\_pregame::get_pregame_class(); + self closemenu(); + self closeingamemenu(); + self.selectedclass = 1; + self [[ level.class ]]( pclass ); + self setclientscriptmainmenu( game["menu_class"] ); + return; + } + } + + if ( ispregamegamestarted() ) + { + if ( self is_bot() && isdefined( self.pers["class"] ) ) + { + pclass = self.pers["class"]; + self closemenu(); + self closeingamemenu(); + self.selectedclass = 1; + self [[ level.class ]]( pclass ); + return; + } + } + + self beginclasschoice(); + self setclientscriptmainmenu( game["menu_class"] ); } -teamscoresequal() //checked partially changed to match cerberus output did not use continue in foreach see github for more info +teamscoresequal() { - score = undefined; - foreach ( team in level.teams ) - { - if ( !isDefined( score ) ) - { - score = getteamscore( team ); - } - else - { - if ( score != getteamscore( team ) ) - { - return 0; - } - } - } - return 1; + score = undefined; + + foreach ( team in level.teams ) + { + if ( !isdefined( score ) ) + { + score = getteamscore( team ); + continue; + } + + if ( score != getteamscore( team ) ) + return false; + } + + return true; } teamwithlowestscore() { - score = 99999999; - lowest_team = undefined; - foreach ( team in level.teams ) - { - if ( score > getteamscore( team ) ) - { - lowest_team = team; - } - } - return lowest_team; + score = 99999999; + lowest_team = undefined; + + foreach ( team in level.teams ) + { + if ( score > getteamscore( team ) ) + lowest_team = team; + } + + return lowest_team; } -pickteamfromscores( teams ) //checked matches cerberus output +pickteamfromscores( teams ) { - assignment = "allies"; - if ( teamscoresequal() ) - { - assignment = teams[ randomint( teams.size ) ]; - } - else - { - assignment = teamwithlowestscore(); - } - return assignment; + assignment = "allies"; + + if ( teamscoresequal() ) + assignment = teams[randomint( teams.size )]; + else + assignment = teamwithlowestscore(); + + return assignment; } -getsplitscreenteam() //checked partially changed to match cerberus output did not use for loop see github for more info +getsplitscreenteam() { - index = 0; - while ( index < level.players.size ) - { - if ( !isDefined( level.players[ index ] ) ) - { - index++; - continue; - } - if ( level.players[ index ] == self ) - { - index++; - continue; - } - if ( !self isplayeronsamemachine( level.players[ index ] ) ) - { - index++; - continue; - } - team = level.players[ index ].sessionteam; - if ( team != "spectator" ) - { - return team; - } - index++; - } - return ""; + for ( index = 0; index < level.players.size; index++ ) + { + if ( !isdefined( level.players[index] ) ) + continue; + + if ( level.players[index] == self ) + continue; + + if ( !self isplayeronsamemachine( level.players[index] ) ) + continue; + + team = level.players[index].sessionteam; + + if ( team != "spectator" ) + return team; + } + + return ""; } -updateobjectivetext() //checked matches cerberus output +updateobjectivetext() { - if ( sessionmodeiszombiesgame() || self.pers[ "team" ] == "spectator" ) - { - self setclientcgobjectivetext( "" ); - return; - } - if ( level.scorelimit > 0 ) - { - self setclientcgobjectivetext( getobjectivescoretext( self.pers[ "team" ] ) ); - } - else - { - self setclientcgobjectivetext( getobjectivetext( self.pers[ "team" ] ) ); - } + if ( sessionmodeiszombiesgame() || self.pers["team"] == "spectator" ) + { + self setclientcgobjectivetext( "" ); + return; + } + + if ( level.scorelimit > 0 ) + self setclientcgobjectivetext( getobjectivescoretext( self.pers["team"] ) ); + else + self setclientcgobjectivetext( getobjectivetext( self.pers["team"] ) ); } -closemenus() //checked matches cerberus output +closemenus() { - self closemenu(); - self closeingamemenu(); + self closemenu(); + self closeingamemenu(); } -beginclasschoice( forcenewchoice ) //checked matches cerberus output +beginclasschoice( forcenewchoice ) { - /* /# - assert( isDefined( level.teams[ self.pers[ "team" ] ] ) ); + assert( isdefined( level.teams[self.pers["team"]] ) ); #/ - */ - team = self.pers[ "team" ]; - if ( level.disableclassselection == 1 || getDvarInt( "migration_soak" ) == 1 ) - { - self.pers[ "class" ] = level.defaultclass; - self.class = level.defaultclass; - if ( self.sessionstate != "playing" && game[ "state" ] == "playing" ) - { - self thread [[ level.spawnclient ]](); - } - level thread maps/mp/gametypes/_globallogic::updateteamstatus(); - self thread maps/mp/gametypes/_spectating::setspectatepermissionsformachine(); - return; - } - if ( level.wagermatch ) - { - self openmenu( game[ "menu_changeclass_wager" ] ); - } - else if ( getDvarInt( "barebones_class_mode" ) ) - { - self openmenu( game[ "menu_changeclass_barebones" ] ); - } - else - { - self openmenu( game[ "menu_changeclass_" + team ] ); - } + team = self.pers["team"]; + + if ( level.disableclassselection == 1 || getdvarint( "migration_soak" ) == 1 ) + { + self.pers["class"] = level.defaultclass; + self.class = level.defaultclass; + + if ( self.sessionstate != "playing" && game["state"] == "playing" ) + self thread [[ level.spawnclient ]](); + + level thread maps\mp\gametypes\_globallogic::updateteamstatus(); + self thread maps\mp\gametypes\_spectating::setspectatepermissionsformachine(); + return; + } + + if ( level.wagermatch ) + self openmenu( game["menu_changeclass_wager"] ); + else if ( getdvarint( "barebones_class_mode" ) ) + self openmenu( game["menu_changeclass_barebones"] ); + else + self openmenu( game["menu_changeclass_" + team] ); } -showmainmenuforteam() //checked matches cerberus output +showmainmenuforteam() { - /* /# - assert( isDefined( level.teams[ self.pers[ "team" ] ] ) ); + assert( isdefined( level.teams[self.pers["team"]] ) ); #/ - */ - team = self.pers[ "team" ]; - if ( level.wagermatch ) - { - self openmenu( game[ "menu_changeclass_wager" ] ); - } - else - { - self openmenu( game[ "menu_changeclass_" + team ] ); - } + team = self.pers["team"]; + + if ( level.wagermatch ) + self openmenu( game["menu_changeclass_wager"] ); + else + self openmenu( game["menu_changeclass_" + team] ); } -menuteam( team ) //checked changed to match cerberus output +menuteam( team ) { - self closemenus(); - if ( !level.console && level.allow_teamchange == "0" && is_true( self.hasdonecombat ) ) - { - return; - } - if ( self.pers[ "team" ] != team ) - { - if ( level.ingraceperiod && !isDefined( self.hasdonecombat ) || !self.hasdonecombat ) - { - self.hasspawned = 0; - } - if ( self.sessionstate == "playing" ) - { - self.switching_teams = 1; - self.joining_team = team; - self.leaving_team = self.pers[ "team" ]; - self suicide(); - } - self.pers[ "team" ] = team; - self.team = team; - self.pers[ "class" ] = undefined; - self.class = undefined; - self.pers[ "weapon" ] = undefined; - self.pers[ "savedmodel" ] = undefined; - self updateobjectivetext(); - if ( !level.rankedmatch && !level.leaguematch ) - { - self.sessionstate = "spectator"; - } - if ( level.teambased ) - { - self.sessionteam = team; - } - else - { - self.sessionteam = "none"; - self.ffateam = team; - } - self setclientscriptmainmenu( game[ "menu_class" ] ); - self notify( "joined_team" ); - level notify( "joined_team" ); - self notify( "end_respawn" ); - } - self beginclasschoice(); + self closemenus(); + + if ( !level.console && level.allow_teamchange == "0" && ( isdefined( self.hasdonecombat ) && self.hasdonecombat ) ) + return; + + if ( self.pers["team"] != team ) + { + if ( level.ingraceperiod && ( !isdefined( self.hasdonecombat ) || !self.hasdonecombat ) ) + self.hasspawned = 0; + + if ( self.sessionstate == "playing" ) + { + self.switching_teams = 1; + self.joining_team = team; + self.leaving_team = self.pers["team"]; + self suicide(); + } + + self.pers["team"] = team; + self.team = team; + self.pers["class"] = undefined; + self.class = undefined; + self.pers["weapon"] = undefined; + self.pers["savedmodel"] = undefined; + self updateobjectivetext(); + + if ( !level.rankedmatch && !level.leaguematch ) + self.sessionstate = "spectator"; + + if ( level.teambased ) + self.sessionteam = team; + else + { + self.sessionteam = "none"; + self.ffateam = team; + } + + self setclientscriptmainmenu( game["menu_class"] ); + self notify( "joined_team" ); + level notify( "joined_team" ); + self notify( "end_respawn" ); + } + + self beginclasschoice(); } -menuspectator() //checked changed to match cerberus output +menuspectator() { - self closemenus(); - if ( self.pers[ "team" ] != "spectator" ) - { - if ( isalive( self ) ) - { - self.switching_teams = 1; - self.joining_team = "spectator"; - self.leaving_team = self.pers[ "team" ]; - self suicide(); - } - self.pers[ "team" ] = "spectator"; - self.team = "spectator"; - self.pers[ "class" ] = undefined; - self.class = undefined; - self.pers[ "weapon" ] = undefined; - self.pers[ "savedmodel" ] = undefined; - self updateobjectivetext(); - self.sessionteam = "spectator"; - if ( !level.teambased ) - { - self.ffateam = "spectator"; - } - [[ level.spawnspectator ]](); - self thread maps/mp/gametypes/_globallogic_player::spectate_player_watcher(); - self setclientscriptmainmenu( game[ "menu_class" ] ); - self notify( "joined_spectators" ); - } + self closemenus(); + + if ( self.pers["team"] != "spectator" ) + { + if ( isalive( self ) ) + { + self.switching_teams = 1; + self.joining_team = "spectator"; + self.leaving_team = self.pers["team"]; + self suicide(); + } + + self.pers["team"] = "spectator"; + self.team = "spectator"; + self.pers["class"] = undefined; + self.class = undefined; + self.pers["weapon"] = undefined; + self.pers["savedmodel"] = undefined; + self updateobjectivetext(); + self.sessionteam = "spectator"; + + if ( !level.teambased ) + self.ffateam = "spectator"; + + [[ level.spawnspectator ]](); + self thread maps\mp\gametypes\_globallogic_player::spectate_player_watcher(); + self setclientscriptmainmenu( game["menu_class"] ); + self notify( "joined_spectators" ); + } } -menuclass( response ) //checked changed to match cerberus output +menuclass( response ) { - self closemenus(); - if ( !isDefined( self.pers[ "team" ] ) || !isDefined( level.teams[ self.pers[ "team" ] ] ) ) - { - return; - } - class = self maps/mp/gametypes/_class::getclasschoice( response ); - if ( isDefined( self.pers[ "class" ] ) && self.pers[ "class" ] == class ) - { - return; - } - self.pers[ "changed_class" ] = 1; - self notify( "changed_class" ); - if ( isDefined( self.curclass ) && self.curclass == class ) - { - self.pers[ "changed_class" ] = 0; - } - if ( ispregame() ) - { - self maps/mp/gametypes/_pregame::onplayerclasschange( response ); - } - if ( self.sessionstate == "playing" ) - { - self.pers[ "class" ] = class; - self.class = class; - if ( game[ "state" ] == "postgame" ) - { - return; - } - if ( isDefined( self.usingsupplystation ) ) - { - supplystationclasschange = self.usingsupplystation; - } - self.usingsupplystation = 0; - if ( level.ingraceperiod && !self.hasdonecombat || supplystationclasschange ) - { - self maps/mp/gametypes/_class::setclass( self.pers[ "class" ] ); - self.tag_stowed_back = undefined; - self.tag_stowed_hip = undefined; - self maps/mp/gametypes/_class::giveloadout( self.pers[ "team" ], self.pers[ "class" ] ); - self maps/mp/killstreaks/_killstreaks::giveownedkillstreak(); - } - else if ( !self issplitscreen() ) - { - self iprintlnbold( game[ "strings" ][ "change_class" ] ); - } - } - else - { - self.pers[ "class" ] = class; - self.class = class; - self.pers[ "weapon" ] = undefined; - if ( game[ "state" ] == "postgame" ) - { - return; - } - if ( self.sessionstate != "spectator" ) - { - if ( self isinvehicle() ) - { - return; - } - if ( self isremotecontrolling() ) - { - return; - } - if ( self isweaponviewonlylinked() ) - { - return 0; - } - } - if ( game[ "state" ] == "playing" ) - { - timepassed = undefined; - if ( isDefined( self.respawntimerstarttime ) ) - { - timepassed = ( getTime() - self.respawntimerstarttime ) / 1000; - } - self thread [[ level.spawnclient ]]( timepassed ); - self.respawntimerstarttime = undefined; - } - } - level thread maps/mp/gametypes/_globallogic::updateteamstatus(); - self thread maps/mp/gametypes/_spectating::setspectatepermissionsformachine(); + self closemenus(); + + if ( !isdefined( self.pers["team"] ) || !isdefined( level.teams[self.pers["team"]] ) ) + return; + + class = self maps\mp\gametypes\_class::getclasschoice( response ); + + if ( isdefined( self.pers["class"] ) && self.pers["class"] == class ) + return; + + self.pers["changed_class"] = 1; + self notify( "changed_class" ); + + if ( isdefined( self.curclass ) && self.curclass == class ) + self.pers["changed_class"] = 0; + + if ( ispregame() ) + self maps\mp\gametypes\_pregame::onplayerclasschange( response ); + + if ( self.sessionstate == "playing" ) + { + self.pers["class"] = class; + self.class = class; + self.pers["weapon"] = undefined; + + if ( game["state"] == "postgame" ) + return; + + supplystationclasschange = isdefined( self.usingsupplystation ) && self.usingsupplystation; + self.usingsupplystation = 0; + + if ( level.ingraceperiod && !self.hasdonecombat || supplystationclasschange ) + { + self maps\mp\gametypes\_class::setclass( self.pers["class"] ); + self.tag_stowed_back = undefined; + self.tag_stowed_hip = undefined; + self maps\mp\gametypes\_class::giveloadout( self.pers["team"], self.pers["class"] ); + self maps\mp\killstreaks\_killstreaks::giveownedkillstreak(); + } + else if ( !self issplitscreen() ) + self iprintlnbold( game["strings"]["change_class"] ); + } + else + { + self.pers["class"] = class; + self.class = class; + self.pers["weapon"] = undefined; + + if ( game["state"] == "postgame" ) + return; + + if ( self.sessionstate != "spectator" ) + { + if ( self isinvehicle() ) + return; + + if ( self isremotecontrolling() ) + return; + + if ( self isweaponviewonlylinked() ) + return 0; + } + + if ( game["state"] == "playing" ) + { + timepassed = undefined; + + if ( isdefined( self.respawntimerstarttime ) ) + timepassed = ( gettime() - self.respawntimerstarttime ) / 1000; + + self thread [[ level.spawnclient ]]( timepassed ); + self.respawntimerstarttime = undefined; + } + } + + level thread maps\mp\gametypes\_globallogic::updateteamstatus(); + self thread maps\mp\gametypes\_spectating::setspectatepermissionsformachine(); } -removespawnmessageshortly( delay ) //checked matches cerberus output +removespawnmessageshortly( delay ) { - self endon( "disconnect" ); - waittillframeend; - self endon( "end_respawn" ); - wait delay; - self clearlowermessage( 2 ); + self endon( "disconnect" ); + waittillframeend; + self endon( "end_respawn" ); + wait( delay ); + self clearlowermessage( 2.0 ); } - diff --git a/Multiplayer Core/patch_mp/maps/mp/gametypes/_globallogic_utils.gsc b/Multiplayer Core/patch_mp/maps/mp/gametypes/_globallogic_utils.gsc index 2d929c2..cfc4743 100644 --- a/Multiplayer Core/patch_mp/maps/mp/gametypes/_globallogic_utils.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/gametypes/_globallogic_utils.gsc @@ -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 ); +} diff --git a/Multiplayer Core/patch_mp/maps/mp/gametypes/_globallogic_vehicle.gsc b/Multiplayer Core/patch_mp/maps/mp/gametypes/_globallogic_vehicle.gsc index b35c4f4..9ebcf13 100644 --- a/Multiplayer Core/patch_mp/maps/mp/gametypes/_globallogic_vehicle.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/gametypes/_globallogic_vehicle.gsc @@ -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; +} diff --git a/Multiplayer Core/patch_mp/maps/mp/gametypes/_healthoverlay.gsc b/Multiplayer Core/patch_mp/maps/mp/gametypes/_healthoverlay.gsc index 6e04572..ac19bb5 100644 --- a/Multiplayer Core/patch_mp/maps/mp/gametypes/_healthoverlay.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/gametypes/_healthoverlay.gsc @@ -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; + } +} diff --git a/Multiplayer Core/patch_mp/maps/mp/gametypes/_hostmigration.gsc b/Multiplayer Core/patch_mp/maps/mp/gametypes/_hostmigration.gsc index d89e3d4..d3aa5fd 100644 --- a/Multiplayer Core/patch_mp/maps/mp/gametypes/_hostmigration.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/gametypes/_hostmigration.gsc @@ -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; +} diff --git a/Multiplayer Core/patch_mp/maps/mp/gametypes/_hud.gsc b/Multiplayer Core/patch_mp/maps/mp/gametypes/_hud.gsc index d64974c..72482ed 100644 --- a/Multiplayer Core/patch_mp/maps/mp/gametypes/_hud.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/gametypes/_hud.gsc @@ -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; + } +} diff --git a/Multiplayer Core/patch_mp/maps/mp/gametypes/_hud_message.gsc b/Multiplayer Core/patch_mp/maps/mp/gametypes/_hud_message.gsc index 3ba1591..be9704b 100644 --- a/Multiplayer Core/patch_mp/maps/mp/gametypes/_hud_message.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/gametypes/_hud_message.gsc @@ -1,1394 +1,1346 @@ -//checked includes match cerberus output -#include maps/mp/_utility; -#include maps/mp/gametypes/_globallogic_audio; -#include maps/mp/_music; -#include maps/mp/gametypes/_hud_message; -#include maps/mp/gametypes/_hud_util; -#include common_scripts/utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool -init() //checked matches cerberus output +init() { - precachestring( &"MENU_POINTS" ); - precachestring( &"MP_FIRSTPLACE_NAME" ); - precachestring( &"MP_SECONDPLACE_NAME" ); - precachestring( &"MP_THIRDPLACE_NAME" ); - precachestring( &"MP_WAGER_PLACE_NAME" ); - precachestring( &"MP_MATCH_BONUS_IS" ); - precachestring( &"MP_CODPOINTS_MATCH_BONUS_IS" ); - precachestring( &"MP_WAGER_WINNINGS_ARE" ); - precachestring( &"MP_WAGER_SIDEBET_WINNINGS_ARE" ); - precachestring( &"MP_WAGER_IN_THE_MONEY" ); - precachestring( &"faction_popup" ); - game[ "strings" ][ "draw" ] = &"MP_DRAW_CAPS"; - game[ "strings" ][ "round_draw" ] = &"MP_ROUND_DRAW_CAPS"; - game[ "strings" ][ "round_win" ] = &"MP_ROUND_WIN_CAPS"; - game[ "strings" ][ "round_loss" ] = &"MP_ROUND_LOSS_CAPS"; - game[ "strings" ][ "victory" ] = &"MP_VICTORY_CAPS"; - game[ "strings" ][ "defeat" ] = &"MP_DEFEAT_CAPS"; - game[ "strings" ][ "game_over" ] = &"MP_GAME_OVER_CAPS"; - game[ "strings" ][ "halftime" ] = &"MP_HALFTIME_CAPS"; - game[ "strings" ][ "overtime" ] = &"MP_OVERTIME_CAPS"; - game[ "strings" ][ "roundend" ] = &"MP_ROUNDEND_CAPS"; - game[ "strings" ][ "intermission" ] = &"MP_INTERMISSION_CAPS"; - game[ "strings" ][ "side_switch" ] = &"MP_SWITCHING_SIDES_CAPS"; - game[ "strings" ][ "match_bonus" ] = &"MP_MATCH_BONUS_IS"; - game[ "strings" ][ "codpoints_match_bonus" ] = &"MP_CODPOINTS_MATCH_BONUS_IS"; - game[ "strings" ][ "wager_winnings" ] = &"MP_WAGER_WINNINGS_ARE"; - game[ "strings" ][ "wager_sidebet_winnings" ] = &"MP_WAGER_SIDEBET_WINNINGS_ARE"; - game[ "strings" ][ "wager_inthemoney" ] = &"MP_WAGER_IN_THE_MONEY_CAPS"; - game[ "strings" ][ "wager_loss" ] = &"MP_WAGER_LOSS_CAPS"; - game[ "strings" ][ "wager_topwinners" ] = &"MP_WAGER_TOPWINNERS"; - game[ "menu_endgameupdate" ] = "endgameupdate"; - precachemenu( game[ "menu_endgameupdate" ] ); - level thread onplayerconnect(); + precachestring( &"MENU_POINTS" ); + precachestring( &"MP_FIRSTPLACE_NAME" ); + precachestring( &"MP_SECONDPLACE_NAME" ); + precachestring( &"MP_THIRDPLACE_NAME" ); + precachestring( &"MP_WAGER_PLACE_NAME" ); + precachestring( &"MP_MATCH_BONUS_IS" ); + precachestring( &"MP_CODPOINTS_MATCH_BONUS_IS" ); + precachestring( &"MP_WAGER_WINNINGS_ARE" ); + precachestring( &"MP_WAGER_SIDEBET_WINNINGS_ARE" ); + precachestring( &"MP_WAGER_IN_THE_MONEY" ); + precachestring( &"faction_popup" ); + game["strings"]["draw"] = &"MP_DRAW_CAPS"; + game["strings"]["round_draw"] = &"MP_ROUND_DRAW_CAPS"; + game["strings"]["round_win"] = &"MP_ROUND_WIN_CAPS"; + game["strings"]["round_loss"] = &"MP_ROUND_LOSS_CAPS"; + game["strings"]["victory"] = &"MP_VICTORY_CAPS"; + game["strings"]["defeat"] = &"MP_DEFEAT_CAPS"; + game["strings"]["game_over"] = &"MP_GAME_OVER_CAPS"; + game["strings"]["halftime"] = &"MP_HALFTIME_CAPS"; + game["strings"]["overtime"] = &"MP_OVERTIME_CAPS"; + game["strings"]["roundend"] = &"MP_ROUNDEND_CAPS"; + game["strings"]["intermission"] = &"MP_INTERMISSION_CAPS"; + game["strings"]["side_switch"] = &"MP_SWITCHING_SIDES_CAPS"; + game["strings"]["match_bonus"] = &"MP_MATCH_BONUS_IS"; + game["strings"]["codpoints_match_bonus"] = &"MP_CODPOINTS_MATCH_BONUS_IS"; + game["strings"]["wager_winnings"] = &"MP_WAGER_WINNINGS_ARE"; + game["strings"]["wager_sidebet_winnings"] = &"MP_WAGER_SIDEBET_WINNINGS_ARE"; + game["strings"]["wager_inthemoney"] = &"MP_WAGER_IN_THE_MONEY_CAPS"; + game["strings"]["wager_loss"] = &"MP_WAGER_LOSS_CAPS"; + game["strings"]["wager_topwinners"] = &"MP_WAGER_TOPWINNERS"; + game["menu_endgameupdate"] = "endgameupdate"; + precachemenu( game["menu_endgameupdate"] ); + level thread onplayerconnect(); } -onplayerconnect() //checked matches cerberus output +onplayerconnect() { - for ( ;; ) - { - level waittill( "connecting", player ); - player thread hintmessagedeaththink(); - player thread lowermessagethink(); - player thread initnotifymessage(); - player thread initcustomgametypeheader(); - } + for (;;) + { + level waittill( "connecting", player ); + + player thread hintmessagedeaththink(); + player thread lowermessagethink(); + player thread initnotifymessage(); + player thread initcustomgametypeheader(); + } } -initcustomgametypeheader() //checked matches cerberus output +initcustomgametypeheader() { - font = "default"; - titlesize = 2.5; - self.customgametypeheader = createfontstring( font, titlesize ); - self.customgametypeheader setpoint( "TOP", undefined, 0, 30 ); - self.customgametypeheader.glowalpha = 1; - self.customgametypeheader.hidewheninmenu = 1; - self.customgametypeheader.archived = 0; - self.customgametypeheader.color = ( 1, 1, 0.6 ); - self.customgametypeheader.alpha = 1; - titlesize = 2; - self.customgametypesubheader = createfontstring( font, titlesize ); - self.customgametypesubheader setparent( self.customgametypeheader ); - self.customgametypesubheader setpoint( "TOP", "BOTTOM", 0, 0 ); - self.customgametypesubheader.glowalpha = 1; - self.customgametypesubheader.hidewheninmenu = 1; - self.customgametypesubheader.archived = 0; - self.customgametypesubheader.color = ( 1, 1, 0.6 ); - self.customgametypesubheader.alpha = 1; + font = "default"; + titlesize = 2.5; + self.customgametypeheader = createfontstring( font, titlesize ); + self.customgametypeheader setpoint( "TOP", undefined, 0, 30 ); + self.customgametypeheader.glowalpha = 1; + self.customgametypeheader.hidewheninmenu = 1; + self.customgametypeheader.archived = 0; + self.customgametypeheader.color = ( 1, 1, 0.6 ); + self.customgametypeheader.alpha = 1; + titlesize = 2.0; + self.customgametypesubheader = createfontstring( font, titlesize ); + self.customgametypesubheader setparent( self.customgametypeheader ); + self.customgametypesubheader setpoint( "TOP", "BOTTOM", 0, 0 ); + self.customgametypesubheader.glowalpha = 1; + self.customgametypesubheader.hidewheninmenu = 1; + self.customgametypesubheader.archived = 0; + self.customgametypesubheader.color = ( 1, 1, 0.6 ); + self.customgametypesubheader.alpha = 1; } -hintmessage( hinttext, duration ) //checked matches cerberus output +hintmessage( hinttext, duration ) { - notifydata = spawnstruct(); - notifydata.notifytext = hinttext; - notifydata.duration = duration; - notifymessage( notifydata ); + notifydata = spawnstruct(); + notifydata.notifytext = hinttext; + notifydata.duration = duration; + notifymessage( notifydata ); } -hintmessageplayers( players, hinttext, duration ) //checked changed to match cerberus output +hintmessageplayers( players, hinttext, duration ) { - notifydata = spawnstruct(); - notifydata.notifytext = hinttext; - notifydata.duration = duration; - for ( i = 0; i < players.size; i++ ) - { - players[ i ] notifymessage( notifydata ); - } + notifydata = spawnstruct(); + notifydata.notifytext = hinttext; + notifydata.duration = duration; + + for ( i = 0; i < players.size; i++ ) + players[i] notifymessage( notifydata ); } -showinitialfactionpopup( team ) //checked matches cerberus output +showinitialfactionpopup( team ) { - self luinotifyevent( &"faction_popup", 1, game[ "strings" ][ team + "_name" ] ); - maps/mp/gametypes/_hud_message::oldnotifymessage( undefined, undefined, undefined, undefined ); + self luinotifyevent( &"faction_popup", 1, game["strings"][team + "_name"] ); + maps\mp\gametypes\_hud_message::oldnotifymessage( undefined, undefined, undefined, undefined ); } -initnotifymessage() //checked matches cerberus output +initnotifymessage() { - if ( !sessionmodeiszombiesgame() ) - { - if ( self issplitscreen() ) - { - titlesize = 2; - textsize = 1.4; - iconsize = 24; - font = "big"; - point = "TOP"; - relativepoint = "BOTTOM"; - yoffset = 30; - xoffset = 30; - } - else - { - titlesize = 2.5; - textsize = 1.75; - iconsize = 30; - font = "big"; - point = "TOP"; - relativepoint = "BOTTOM"; - yoffset = 0; - xoffset = 0; - } - } - else if ( self issplitscreen() ) - { - titlesize = 2; - textsize = 1.4; - iconsize = 24; - font = "big"; - point = "TOP"; - relativepoint = "BOTTOM"; - yoffset = 30; - xoffset = 30; - } - else - { - titlesize = 2.5; - textsize = 1.75; - iconsize = 30; - font = "big"; - point = "BOTTOM LEFT"; - relativepoint = "TOP"; - yoffset = 0; - xoffset = 0; - } - self.notifytitle = createfontstring( font, titlesize ); - self.notifytitle setpoint( point, undefined, xoffset, yoffset ); - self.notifytitle.glowalpha = 1; - self.notifytitle.hidewheninmenu = 1; - self.notifytitle.archived = 0; - self.notifytitle.alpha = 0; - self.notifytext = createfontstring( font, textsize ); - self.notifytext setparent( self.notifytitle ); - self.notifytext setpoint( point, relativepoint, 0, 0 ); - self.notifytext.glowalpha = 1; - self.notifytext.hidewheninmenu = 1; - self.notifytext.archived = 0; - self.notifytext.alpha = 0; - self.notifytext2 = createfontstring( font, textsize ); - self.notifytext2 setparent( self.notifytitle ); - self.notifytext2 setpoint( point, relativepoint, 0, 0 ); - self.notifytext2.glowalpha = 1; - self.notifytext2.hidewheninmenu = 1; - self.notifytext2.archived = 0; - self.notifytext2.alpha = 0; - self.notifyicon = createicon( "white", iconsize, iconsize ); - self.notifyicon setparent( self.notifytext2 ); - self.notifyicon setpoint( point, relativepoint, 0, 0 ); - self.notifyicon.hidewheninmenu = 1; - self.notifyicon.archived = 0; - self.notifyicon.alpha = 0; - self.doingnotify = 0; - self.notifyqueue = []; + if ( !sessionmodeiszombiesgame() ) + { + if ( self issplitscreen() ) + { + titlesize = 2.0; + textsize = 1.4; + iconsize = 24; + font = "big"; + point = "TOP"; + relativepoint = "BOTTOM"; + yoffset = 30; + xoffset = 30; + } + else + { + titlesize = 2.5; + textsize = 1.75; + iconsize = 30; + font = "big"; + point = "TOP"; + relativepoint = "BOTTOM"; + yoffset = 0; + xoffset = 0; + } + } + else if ( self issplitscreen() ) + { + titlesize = 2.0; + textsize = 1.4; + iconsize = 24; + font = "big"; + point = "TOP"; + relativepoint = "BOTTOM"; + yoffset = 30; + xoffset = 30; + } + else + { + titlesize = 2.5; + textsize = 1.75; + iconsize = 30; + font = "big"; + point = "BOTTOM LEFT"; + relativepoint = "TOP"; + yoffset = 0; + xoffset = 0; + } + + self.notifytitle = createfontstring( font, titlesize ); + self.notifytitle setpoint( point, undefined, xoffset, yoffset ); + self.notifytitle.glowalpha = 1; + self.notifytitle.hidewheninmenu = 1; + self.notifytitle.archived = 0; + self.notifytitle.alpha = 0; + self.notifytext = createfontstring( font, textsize ); + self.notifytext setparent( self.notifytitle ); + self.notifytext setpoint( point, relativepoint, 0, 0 ); + self.notifytext.glowalpha = 1; + self.notifytext.hidewheninmenu = 1; + self.notifytext.archived = 0; + self.notifytext.alpha = 0; + self.notifytext2 = createfontstring( font, textsize ); + self.notifytext2 setparent( self.notifytitle ); + self.notifytext2 setpoint( point, relativepoint, 0, 0 ); + self.notifytext2.glowalpha = 1; + self.notifytext2.hidewheninmenu = 1; + self.notifytext2.archived = 0; + self.notifytext2.alpha = 0; + self.notifyicon = createicon( "white", iconsize, iconsize ); + self.notifyicon setparent( self.notifytext2 ); + self.notifyicon setpoint( point, relativepoint, 0, 0 ); + self.notifyicon.hidewheninmenu = 1; + self.notifyicon.archived = 0; + self.notifyicon.alpha = 0; + self.doingnotify = 0; + self.notifyqueue = []; } -oldnotifymessage( titletext, notifytext, iconname, glowcolor, sound, duration ) //checked matches cerberus output +oldnotifymessage( titletext, notifytext, iconname, glowcolor, sound, duration ) { - if ( level.wagermatch && !level.teambased ) - { - return; - } - notifydata = spawnstruct(); - notifydata.titletext = titletext; - notifydata.notifytext = notifytext; - notifydata.iconname = iconname; - notifydata.sound = sound; - notifydata.duration = duration; - self.startmessagenotifyqueue[ self.startmessagenotifyqueue.size ] = notifydata; - self notify( "received award" ); + if ( level.wagermatch && !level.teambased ) + return; + + notifydata = spawnstruct(); + notifydata.titletext = titletext; + notifydata.notifytext = notifytext; + notifydata.iconname = iconname; + notifydata.sound = sound; + notifydata.duration = duration; + self.startmessagenotifyqueue[self.startmessagenotifyqueue.size] = notifydata; + self notify( "received award" ); } -notifymessage( notifydata ) //checked matches cerberus output +notifymessage( notifydata ) { - self endon( "death" ); - self endon( "disconnect" ); - self.messagenotifyqueue[ self.messagenotifyqueue.size ] = notifydata; - self notify( "received award" ); + self endon( "death" ); + self endon( "disconnect" ); + self.messagenotifyqueue[self.messagenotifyqueue.size] = notifydata; + self notify( "received award" ); } -playnotifyloop( duration ) //checked changed to match cerberus output +playnotifyloop( duration ) { - playnotifyloop = spawn( "script_origin", ( 0, 0, 0 ) ); - playnotifyloop playloopsound( "uin_notify_data_loop" ); - duration -= 4; - if ( duration < 1 ) - { - duration = 1; - } - wait duration; - playnotifyloop delete(); + playnotifyloop = spawn( "script_origin", ( 0, 0, 0 ) ); + playnotifyloop playloopsound( "uin_notify_data_loop" ); + duration -= 4; + + if ( duration < 1 ) + duration = 1; + + wait( duration ); + playnotifyloop delete(); } -shownotifymessage( notifydata, duration ) //checked matches cerberus output +shownotifymessage( notifydata, duration ) { - self endon( "disconnect" ); - self.doingnotify = 1; - waitrequirevisibility( 0 ); - self notify( "notifyMessageBegin" ); - self thread resetoncancel(); - if ( isDefined( notifydata.sound ) ) - { - self playlocalsound( notifydata.sound ); - } - if ( isDefined( notifydata.musicstate ) ) - { - self maps/mp/_music::setmusicstate( notifydata.music ); - } - if ( isDefined( notifydata.leadersound ) ) - { - self maps/mp/gametypes/_globallogic_audio::leaderdialogonplayer( notifydata.leadersound ); - } - if ( isDefined( notifydata.glowcolor ) ) - { - glowcolor = notifydata.glowcolor; - } - else - { - glowcolor = ( 0, 0, 0 ); - } - if ( isDefined( notifydata.color ) ) - { - color = notifydata.color; - } - else - { - color = ( 1, 1, 1 ); - } - anchorelem = self.notifytitle; - if ( isDefined( notifydata.titletext ) ) - { - if ( isDefined( notifydata.titlelabel ) ) - { - self.notifytitle.label = notifydata.titlelabel; - } - else - { - self.notifytitle.label = &""; - } - if ( isDefined( notifydata.titlelabel ) && !isDefined( notifydata.titleisstring ) ) - { - self.notifytitle setvalue( notifydata.titletext ); - } - else - { - self.notifytitle settext( notifydata.titletext ); - } - self.notifytitle setcod7decodefx( 200, int( duration * 1000 ), 600 ); - self.notifytitle.glowcolor = glowcolor; - self.notifytitle.color = color; - self.notifytitle.alpha = 1; - } - if ( isDefined( notifydata.notifytext ) ) - { - if ( isDefined( notifydata.textlabel ) ) - { - self.notifytext.label = notifydata.textlabel; - } - else - { - self.notifytext.label = &""; - } - if ( isDefined( notifydata.textlabel ) && !isDefined( notifydata.textisstring ) ) - { - self.notifytext setvalue( notifydata.notifytext ); - } - else - { - self.notifytext settext( notifydata.notifytext ); - } - self.notifytext setcod7decodefx( 100, int( duration * 1000 ), 600 ); - self.notifytext.glowcolor = glowcolor; - self.notifytext.color = color; - self.notifytext.alpha = 1; - anchorelem = self.notifytext; - } - if ( isDefined( notifydata.notifytext2 ) ) - { - if ( self issplitscreen() ) - { - if ( isDefined( notifydata.text2label ) ) - { - self iprintlnbold( notifydata.text2label, notifydata.notifytext2 ); - } - else - { - self iprintlnbold( notifydata.notifytext2 ); - } - } - else - { - self.notifytext2 setparent( anchorelem ); - if ( isDefined( notifydata.text2label ) ) - { - self.notifytext2.label = notifydata.text2label; - } - else - { - self.notifytext2.label = &""; - } - self.notifytext2 settext( notifydata.notifytext2 ); - self.notifytext2 setpulsefx( 100, int( duration * 1000 ), 1000 ); - self.notifytext2.glowcolor = glowcolor; - self.notifytext2.color = color; - self.notifytext2.alpha = 1; - anchorelem = self.notifytext2; - } - } - if ( isDefined( notifydata.iconname ) ) - { - iconwidth = 60; - iconheight = 60; - if ( isDefined( notifydata.iconwidth ) ) - { - iconwidth = notifydata.iconwidth; - } - if ( isDefined( notifydata.iconheight ) ) - { - iconheight = notifydata.iconheight; - } - self.notifyicon setparent( anchorelem ); - self.notifyicon setshader( notifydata.iconname, iconwidth, iconheight ); - self.notifyicon.alpha = 0; - self.notifyicon fadeovertime( 1 ); - self.notifyicon.alpha = 1; - waitrequirevisibility( duration ); - self.notifyicon fadeovertime( 0,75 ); - self.notifyicon.alpha = 0; - } - else - { - waitrequirevisibility( duration ); - } - self notify( "notifyMessageDone" ); - self.doingnotify = 0; + self endon( "disconnect" ); + self.doingnotify = 1; + waitrequirevisibility( 0 ); + self notify( "notifyMessageBegin", duration ); + self thread resetoncancel(); + + if ( isdefined( notifydata.sound ) ) + self playlocalsound( notifydata.sound ); + + if ( isdefined( notifydata.musicstate ) ) + self maps\mp\_music::setmusicstate( notifydata.music ); + + if ( isdefined( notifydata.leadersound ) ) + self maps\mp\gametypes\_globallogic_audio::leaderdialogonplayer( notifydata.leadersound ); + + if ( isdefined( notifydata.glowcolor ) ) + glowcolor = notifydata.glowcolor; + else + glowcolor = ( 0, 0, 0 ); + + if ( isdefined( notifydata.color ) ) + color = notifydata.color; + else + color = ( 1, 1, 1 ); + + anchorelem = self.notifytitle; + + if ( isdefined( notifydata.titletext ) ) + { + if ( isdefined( notifydata.titlelabel ) ) + self.notifytitle.label = notifydata.titlelabel; + else + self.notifytitle.label = &""; + + if ( isdefined( notifydata.titlelabel ) && !isdefined( notifydata.titleisstring ) ) + self.notifytitle setvalue( notifydata.titletext ); + else + self.notifytitle settext( notifydata.titletext ); + + self.notifytitle setcod7decodefx( 200, int( duration * 1000 ), 600 ); + self.notifytitle.glowcolor = glowcolor; + self.notifytitle.color = color; + self.notifytitle.alpha = 1; + } + + if ( isdefined( notifydata.notifytext ) ) + { + if ( isdefined( notifydata.textlabel ) ) + self.notifytext.label = notifydata.textlabel; + else + self.notifytext.label = &""; + + if ( isdefined( notifydata.textlabel ) && !isdefined( notifydata.textisstring ) ) + self.notifytext setvalue( notifydata.notifytext ); + else + self.notifytext settext( notifydata.notifytext ); + + self.notifytext setcod7decodefx( 100, int( duration * 1000 ), 600 ); + self.notifytext.glowcolor = glowcolor; + self.notifytext.color = color; + self.notifytext.alpha = 1; + anchorelem = self.notifytext; + } + + if ( isdefined( notifydata.notifytext2 ) ) + { + if ( self issplitscreen() ) + { + if ( isdefined( notifydata.text2label ) ) + self iprintlnbold( notifydata.text2label, notifydata.notifytext2 ); + else + self iprintlnbold( notifydata.notifytext2 ); + } + else + { + self.notifytext2 setparent( anchorelem ); + + if ( isdefined( notifydata.text2label ) ) + self.notifytext2.label = notifydata.text2label; + else + self.notifytext2.label = &""; + + self.notifytext2 settext( notifydata.notifytext2 ); + self.notifytext2 setpulsefx( 100, int( duration * 1000 ), 1000 ); + self.notifytext2.glowcolor = glowcolor; + self.notifytext2.color = color; + self.notifytext2.alpha = 1; + anchorelem = self.notifytext2; + } + } + + if ( isdefined( notifydata.iconname ) ) + { + iconwidth = 60; + iconheight = 60; + + if ( isdefined( notifydata.iconwidth ) ) + iconwidth = notifydata.iconwidth; + + if ( isdefined( notifydata.iconheight ) ) + iconheight = notifydata.iconheight; + + self.notifyicon setparent( anchorelem ); + self.notifyicon setshader( notifydata.iconname, iconwidth, iconheight ); + self.notifyicon.alpha = 0; + self.notifyicon fadeovertime( 1.0 ); + self.notifyicon.alpha = 1; + waitrequirevisibility( duration ); + self.notifyicon fadeovertime( 0.75 ); + self.notifyicon.alpha = 0; + } + else + waitrequirevisibility( duration ); + + self notify( "notifyMessageDone" ); + self.doingnotify = 0; } -waitrequirevisibility( waittime ) //checked matches cerberus output +waitrequirevisibility( waittime ) { - interval = 0.05; - while ( !self canreadtext() ) - { - wait interval; - } - while ( waittime > 0 ) - { - wait interval; - if ( self canreadtext() ) - { - waittime -= interval; - } - } + interval = 0.05; + + while ( !self canreadtext() ) + wait( interval ); + + while ( waittime > 0 ) + { + wait( interval ); + + if ( self canreadtext() ) + waittime -= interval; + } } -canreadtext() //checked matches cerberus output +canreadtext() { - if ( self maps/mp/_utility::isflashbanged() ) - { - return 0; - } - return 1; + if ( self maps\mp\_utility::isflashbanged() ) + return false; + + return true; } -resetondeath() //checked matches cerberus output +resetondeath() { - self endon( "notifyMessageDone" ); - self endon( "disconnect" ); - level endon( "game_ended" ); - self waittill( "death" ); - resetnotify(); + self endon( "notifyMessageDone" ); + self endon( "disconnect" ); + level endon( "game_ended" ); + + self waittill( "death" ); + + resetnotify(); } -resetoncancel() //checked matches cerberus output +resetoncancel() { - self notify( "resetOnCancel" ); - self endon( "resetOnCancel" ); - self endon( "notifyMessageDone" ); - self endon( "disconnect" ); - level waittill( "cancel_notify" ); - resetnotify(); + self notify( "resetOnCancel" ); + self endon( "resetOnCancel" ); + self endon( "notifyMessageDone" ); + self endon( "disconnect" ); + + level waittill( "cancel_notify" ); + + resetnotify(); } -resetnotify() //checked matches cerberus output +resetnotify() { - self.notifytitle.alpha = 0; - self.notifytext.alpha = 0; - self.notifyicon.alpha = 0; - self.doingnotify = 0; + self.notifytitle.alpha = 0; + self.notifytext.alpha = 0; + self.notifyicon.alpha = 0; + self.doingnotify = 0; } -hintmessagedeaththink() //checked matches cerberus output +hintmessagedeaththink() { - self endon( "disconnect" ); - for ( ;; ) - { - self waittill( "death" ); - if ( isDefined( self.hintmessage ) ) - { - self.hintmessage destroyelem(); - } - } + self endon( "disconnect" ); + + for (;;) + { + self waittill( "death" ); + + if ( isdefined( self.hintmessage ) ) + self.hintmessage destroyelem(); + } } -lowermessagethink() //checked matches cerberus output +lowermessagethink() { - self endon( "disconnect" ); - messagetexty = level.lowertexty; - if ( self issplitscreen() ) - { - messagetexty = level.lowertexty - 50; - } - self.lowermessage = createfontstring( "default", level.lowertextfontsize ); - self.lowermessage setpoint( "CENTER", level.lowertextyalign, 0, messagetexty ); - self.lowermessage settext( "" ); - self.lowermessage.archived = 0; - timerfontsize = 1.5; - if ( self issplitscreen() ) - { - timerfontsize = 1.4; - } - self.lowertimer = createfontstring( "default", timerfontsize ); - self.lowertimer setparent( self.lowermessage ); - self.lowertimer setpoint( "TOP", "BOTTOM", 0, 0 ); - self.lowertimer settext( "" ); - self.lowertimer.archived = 0; + self endon( "disconnect" ); + messagetexty = level.lowertexty; + + if ( self issplitscreen() ) + messagetexty = level.lowertexty - 50; + + self.lowermessage = createfontstring( "default", level.lowertextfontsize ); + self.lowermessage setpoint( "CENTER", level.lowertextyalign, 0, messagetexty ); + self.lowermessage settext( "" ); + self.lowermessage.archived = 0; + timerfontsize = 1.5; + + if ( self issplitscreen() ) + timerfontsize = 1.4; + + self.lowertimer = createfontstring( "default", timerfontsize ); + self.lowertimer setparent( self.lowermessage ); + self.lowertimer setpoint( "TOP", "BOTTOM", 0, 0 ); + self.lowertimer settext( "" ); + self.lowertimer.archived = 0; } -setmatchscorehudelemforteam( team ) //checked matches cerberus output +setmatchscorehudelemforteam( team ) { - if ( level.roundscorecarry ) - { - self setvalue( getteamscore( team ) ); - } - else - { - self setvalue( getroundswon( team ) ); - } + if ( level.roundscorecarry ) + self setvalue( getteamscore( team ) ); + else + self setvalue( getroundswon( team ) ); } -teamoutcomenotify( winner, isround, endreasontext ) //checked partially changed to match cerberus output see info.md +teamoutcomenotify( winner, isround, endreasontext ) { - self endon( "disconnect" ); - self notify( "reset_outcome" ); - team = self.pers[ "team" ]; - if ( isDefined( team ) && team == "spectator" ) - { - for ( i = 0; i < level.players.size; i++ ) - { - if ( self.currentspectatingclient == level.players[ i ].clientid ) - { - team = level.players[ i ].pers[ "team" ]; - break; - } - } - } - if ( !isDefined( team ) || !isDefined( level.teams[ team ] ) ) - { - team = "allies"; - } - while ( self.doingnotify ) - { - wait 0.05; - } - self endon( "reset_outcome" ); - headerfont = "extrabig"; - font = "default"; - if ( self issplitscreen() ) - { - titlesize = 2; - textsize = 1.5; - iconsize = 30; - spacing = 10; - } - else - { - titlesize = 3; - textsize = 2; - iconsize = 70; - spacing = 25; - } - duration = 60000; - outcometitle = createfontstring( headerfont, titlesize ); - outcometitle setpoint( "TOP", undefined, 0, 30 ); - outcometitle.glowalpha = 1; - outcometitle.hidewheninmenu = 0; - outcometitle.archived = 0; - outcometitle.immunetodemogamehudsettings = 1; - outcometitle.immunetodemofreecamera = 1; - outcometext = createfontstring( font, 2 ); - outcometext setparent( outcometitle ); - outcometext setpoint( "TOP", "BOTTOM", 0, 0 ); - outcometext.glowalpha = 1; - outcometext.hidewheninmenu = 0; - outcometext.archived = 0; - outcometext.immunetodemogamehudsettings = 1; - outcometext.immunetodemofreecamera = 1; - if ( winner == "halftime" ) - { - outcometitle settext( game[ "strings" ][ "halftime" ] ); - outcometitle.color = ( 1, 1, 1 ); - winner = "allies"; - } - else if ( winner == "intermission" ) - { - outcometitle settext( game[ "strings" ][ "intermission" ] ); - outcometitle.color = ( 1, 1, 1 ); - winner = "allies"; - } - else if ( winner == "roundend" ) - { - outcometitle settext( game[ "strings" ][ "roundend" ] ); - outcometitle.color = ( 1, 1, 1 ); - winner = "allies"; - } - else if ( winner == "overtime" ) - { - outcometitle settext( game[ "strings" ][ "overtime" ] ); - outcometitle.color = ( 1, 1, 1 ); - winner = "allies"; - } - else if ( winner == "tie" ) - { - if ( isround ) - { - outcometitle settext( game[ "strings" ][ "round_draw" ] ); - } - else - { - outcometitle settext( game[ "strings" ][ "draw" ] ); - } - outcometitle.color = ( 0.29, 0.61, 0.7 ); - winner = "allies"; - } - else if ( isDefined( self.pers[ "team" ] ) && winner == team ) - { - if ( isround ) - { - outcometitle settext( game[ "strings" ][ "round_win" ] ); - } - else - { - outcometitle settext( game[ "strings" ][ "victory" ] ); - } - outcometitle.color = ( 0.42, 0.68, 0.46 ); - if ( isDefined( level.endvictoryreasontext ) ) - { - endreasontext = level.endvictoryreasontext; - } - } - else - { - if ( isround ) - { - outcometitle settext( game[ "strings" ][ "round_loss" ] ); - } - else - { - outcometitle settext( game[ "strings" ][ "defeat" ] ); - } - outcometitle.color = ( 0.73, 0.29, 0.19 ); - if ( isDefined( level.enddefeatreasontext ) ) - { - endreasontext = level.enddefeatreasontext; - } - } - outcometext settext( endreasontext ); - outcometitle setcod7decodefx( 200, duration, 600 ); - outcometext setpulsefx( 100, duration, 1000 ); - iconspacing = 100; - currentx = ( ( level.teamcount - 1 ) * -1 * iconspacing ) / 2; - teamicons = []; - teamicons[ team ] = createicon( game[ "icons" ][ team ], iconsize, iconsize ); - teamicons[ team ] setparent( outcometext ); - teamicons[ team ] setpoint( "TOP", "BOTTOM", currentx, spacing ); - teamicons[ team ].hidewheninmenu = 0; - teamicons[ team ].archived = 0; - teamicons[ team ].immunetodemogamehudsettings = 1; - teamicons[ team ].immunetodemofreecamera = 1; - teamicons[ team ].alpha = 0; - teamicons[ team ] fadeovertime( 0,5 ); - teamicons[ team ].alpha = 1; - currentx += iconspacing; - foreach ( enemyteam in level.teams ) - { - if ( team == enemyteam ) - { - } - else - { - teamicons[ enemyteam ] = createicon( game[ "icons" ][ enemyteam ], iconsize, iconsize ); - teamicons[ enemyteam ] setparent( outcometext ); - teamicons[ enemyteam ] setpoint( "TOP", "BOTTOM", currentx, spacing ); - teamicons[ enemyteam ].hidewheninmenu = 0; - teamicons[ enemyteam ].archived = 0; - teamicons[ enemyteam ].immunetodemogamehudsettings = 1; - teamicons[ enemyteam ].immunetodemofreecamera = 1; - teamicons[ enemyteam ].alpha = 0; - teamicons[ enemyteam ] fadeovertime( 0,5 ); - teamicons[ enemyteam ].alpha = 1; - currentx += iconspacing; - } - } - teamscores = []; - teamscores[ team ] = createfontstring( font, titlesize ); - teamscores[ team ] setparent( teamicons[ team ] ); - teamscores[ team ] setpoint( "TOP", "BOTTOM", 0, spacing ); - teamscores[ team ].glowalpha = 1; - if ( isround ) - { - teamscores[ team ] setvalue( getteamscore( team ) ); - } - else - { - teamscores[ team ] [[ level.setmatchscorehudelemforteam ]]( team ); - } - teamscores[ team ].hidewheninmenu = 0; - teamscores[ team ].archived = 0; - teamscores[ team ].immunetodemogamehudsettings = 1; - teamscores[ team ].immunetodemofreecamera = 1; - teamscores[ team ] setpulsefx( 100, duration, 1000 ); - foreach ( enemyteam in level.teams ) - { - if ( team == enemyteam ) - { - } - else - { - teamscores[ enemyteam ] = createfontstring( headerfont, titlesize ); - teamscores[ enemyteam ] setparent( teamicons[ enemyteam ] ); - teamscores[ enemyteam ] setpoint( "TOP", "BOTTOM", 0, spacing ); - teamscores[ enemyteam ].glowalpha = 1; - if ( isround ) - { - teamscores[ enemyteam ] setvalue( getteamscore( enemyteam ) ); - } - else - { - teamscores[ enemyteam ] [[ level.setmatchscorehudelemforteam ]]( enemyteam ); - } - teamscores[ enemyteam ].hidewheninmenu = 0; - teamscores[ enemyteam ].archived = 0; - teamscores[ enemyteam ].immunetodemogamehudsettings = 1; - teamscores[ enemyteam ].immunetodemofreecamera = 1; - teamscores[ enemyteam ] setpulsefx( 100, duration, 1000 ); - } - } - font = "objective"; - matchbonus = undefined; - if ( isDefined( self.matchbonus ) ) - { - bonus = ceil( self.matchbonus * level.xpscale ); - if ( bonus > 0 ) - { - matchbonus = createfontstring( font, 2 ); - matchbonus setparent( outcometext ); - matchbonus setpoint( "TOP", "BOTTOM", 0, iconsize + ( spacing * 3 ) + teamscores[ team ].height ); - matchbonus.glowalpha = 1; - matchbonus.hidewheninmenu = 0; - matchbonus.archived = 0; - matchbonus.immunetodemogamehudsettings = 1; - matchbonus.immunetodemofreecamera = 1; - matchbonus.label = game[ "strings" ][ "match_bonus" ]; - matchbonus setvalue( bonus ); - } - } - self thread resetoutcomenotify( teamicons, teamscores, outcometitle, outcometext ); + self endon( "disconnect" ); + self notify( "reset_outcome" ); + team = self.pers["team"]; + + if ( isdefined( team ) && team == "spectator" ) + { + for ( i = 0; i < level.players.size; i++ ) + { + if ( self.currentspectatingclient == level.players[i].clientid ) + { + team = level.players[i].pers["team"]; + break; + } + } + } + + if ( !isdefined( team ) || !isdefined( level.teams[team] ) ) + team = "allies"; + + while ( self.doingnotify ) + wait 0.05; + + self endon( "reset_outcome" ); + headerfont = "extrabig"; + font = "default"; + + if ( self issplitscreen() ) + { + titlesize = 2.0; + textsize = 1.5; + iconsize = 30; + spacing = 10; + } + else + { + titlesize = 3.0; + textsize = 2.0; + iconsize = 70; + spacing = 25; + } + + duration = 60000; + outcometitle = createfontstring( headerfont, titlesize ); + outcometitle setpoint( "TOP", undefined, 0, 30 ); + outcometitle.glowalpha = 1; + outcometitle.hidewheninmenu = 0; + outcometitle.archived = 0; + outcometitle.immunetodemogamehudsettings = 1; + outcometitle.immunetodemofreecamera = 1; + outcometext = createfontstring( font, 2.0 ); + outcometext setparent( outcometitle ); + outcometext setpoint( "TOP", "BOTTOM", 0, 0 ); + outcometext.glowalpha = 1; + outcometext.hidewheninmenu = 0; + outcometext.archived = 0; + outcometext.immunetodemogamehudsettings = 1; + outcometext.immunetodemofreecamera = 1; + + if ( winner == "halftime" ) + { + outcometitle settext( game["strings"]["halftime"] ); + outcometitle.color = ( 1, 1, 1 ); + winner = "allies"; + } + else if ( winner == "intermission" ) + { + outcometitle settext( game["strings"]["intermission"] ); + outcometitle.color = ( 1, 1, 1 ); + winner = "allies"; + } + else if ( winner == "roundend" ) + { + outcometitle settext( game["strings"]["roundend"] ); + outcometitle.color = ( 1, 1, 1 ); + winner = "allies"; + } + else if ( winner == "overtime" ) + { + outcometitle settext( game["strings"]["overtime"] ); + outcometitle.color = ( 1, 1, 1 ); + winner = "allies"; + } + else if ( winner == "tie" ) + { + if ( isround ) + outcometitle settext( game["strings"]["round_draw"] ); + else + outcometitle settext( game["strings"]["draw"] ); + + outcometitle.color = ( 0.29, 0.61, 0.7 ); + winner = "allies"; + } + else if ( isdefined( self.pers["team"] ) && winner == team ) + { + if ( isround ) + outcometitle settext( game["strings"]["round_win"] ); + else + outcometitle settext( game["strings"]["victory"] ); + + outcometitle.color = ( 0.42, 0.68, 0.46 ); + + if ( isdefined( level.endvictoryreasontext ) ) + endreasontext = level.endvictoryreasontext; + } + else + { + if ( isround ) + outcometitle settext( game["strings"]["round_loss"] ); + else + outcometitle settext( game["strings"]["defeat"] ); + + outcometitle.color = ( 0.73, 0.29, 0.19 ); + + if ( isdefined( level.enddefeatreasontext ) ) + endreasontext = level.enddefeatreasontext; + } + + outcometext settext( endreasontext ); + outcometitle setcod7decodefx( 200, duration, 600 ); + outcometext setpulsefx( 100, duration, 1000 ); + iconspacing = 100; + currentx = ( level.teamcount - 1 ) * -1 * iconspacing / 2; + teamicons = []; + teamicons[team] = createicon( game["icons"][team], iconsize, iconsize ); + teamicons[team] setparent( outcometext ); + teamicons[team] setpoint( "TOP", "BOTTOM", currentx, spacing ); + teamicons[team].hidewheninmenu = 0; + teamicons[team].archived = 0; + teamicons[team].immunetodemogamehudsettings = 1; + teamicons[team].immunetodemofreecamera = 1; + teamicons[team].alpha = 0; + teamicons[team] fadeovertime( 0.5 ); + teamicons[team].alpha = 1; + currentx += iconspacing; + + foreach ( enemyteam in level.teams ) + { + if ( team == enemyteam ) + continue; + + teamicons[enemyteam] = createicon( game["icons"][enemyteam], iconsize, iconsize ); + teamicons[enemyteam] setparent( outcometext ); + teamicons[enemyteam] setpoint( "TOP", "BOTTOM", currentx, spacing ); + teamicons[enemyteam].hidewheninmenu = 0; + teamicons[enemyteam].archived = 0; + teamicons[enemyteam].immunetodemogamehudsettings = 1; + teamicons[enemyteam].immunetodemofreecamera = 1; + teamicons[enemyteam].alpha = 0; + teamicons[enemyteam] fadeovertime( 0.5 ); + teamicons[enemyteam].alpha = 1; + currentx += iconspacing; + } + + teamscores = []; + teamscores[team] = createfontstring( font, titlesize ); + teamscores[team] setparent( teamicons[team] ); + teamscores[team] setpoint( "TOP", "BOTTOM", 0, spacing ); + teamscores[team].glowalpha = 1; + + if ( isround ) + teamscores[team] setvalue( getteamscore( team ) ); + else + teamscores[team] [[ level.setmatchscorehudelemforteam ]]( team ); + + teamscores[team].hidewheninmenu = 0; + teamscores[team].archived = 0; + teamscores[team].immunetodemogamehudsettings = 1; + teamscores[team].immunetodemofreecamera = 1; + teamscores[team] setpulsefx( 100, duration, 1000 ); + + foreach ( enemyteam in level.teams ) + { + if ( team == enemyteam ) + continue; + + teamscores[enemyteam] = createfontstring( headerfont, titlesize ); + teamscores[enemyteam] setparent( teamicons[enemyteam] ); + teamscores[enemyteam] setpoint( "TOP", "BOTTOM", 0, spacing ); + teamscores[enemyteam].glowalpha = 1; + + if ( isround ) + teamscores[enemyteam] setvalue( getteamscore( enemyteam ) ); + else + teamscores[enemyteam] [[ level.setmatchscorehudelemforteam ]]( enemyteam ); + + teamscores[enemyteam].hidewheninmenu = 0; + teamscores[enemyteam].archived = 0; + teamscores[enemyteam].immunetodemogamehudsettings = 1; + teamscores[enemyteam].immunetodemofreecamera = 1; + teamscores[enemyteam] setpulsefx( 100, duration, 1000 ); + } + + font = "objective"; + matchbonus = undefined; + + if ( isdefined( self.matchbonus ) ) + { + bonus = ceil( self.matchbonus * level.xpscale ); + + if ( bonus > 0 ) + { + matchbonus = createfontstring( font, 2.0 ); + matchbonus setparent( outcometext ); + matchbonus setpoint( "TOP", "BOTTOM", 0, iconsize + spacing * 3 + teamscores[team].height ); + matchbonus.glowalpha = 1; + matchbonus.hidewheninmenu = 0; + matchbonus.archived = 0; + matchbonus.immunetodemogamehudsettings = 1; + matchbonus.immunetodemofreecamera = 1; + matchbonus.label = game["strings"]["match_bonus"]; + matchbonus setvalue( bonus ); + } + } + + self thread resetoutcomenotify( teamicons, teamscores, outcometitle, outcometext ); } -teamoutcomenotifyzombie( winner, isround, endreasontext ) //checked changed to match beta dump +teamoutcomenotifyzombie( winner, isround, endreasontext ) { - self endon( "disconnect" ); - self notify( "reset_outcome" ); - team = self.pers[ "team" ]; - if ( isDefined( team ) && team == "spectator" ) - { - for ( i = 0; i < level.players.size; i++ ) - { - if ( self.currentspectatingclient == level.players[ i ].clientid ) - { - team = level.players[ i ].pers[ "team" ]; - break; - } - } - } - if ( !isDefined( team ) || !isDefined( level.teams[ team ] ) ) - { - team = "allies"; - } - while ( self.doingnotify ) - { - wait 0.05; - } - self endon( "reset_outcome" ); - if ( level.splitscreen ) - { - titlesize = 2; - spacing = 10; - font = "default"; - } - else - { - titlesize = 3; - spacing = 50; - font = "objective"; - } - outcometitle = createfontstring( font, titlesize ); - outcometitle setpoint( "TOP", undefined, 0, spacing ); - outcometitle.glowalpha = 1; - outcometitle.hidewheninmenu = 0; - outcometitle.archived = 0; - outcometitle.immunetodemogamehudsettings = 1; - outcometitle.immunetodemofreecamera = 1; - outcometitle settext( endreasontext ); - outcometitle setpulsefx( 100, 60000, 1000 ); - self thread resetoutcomenotify( undefined, undefined, outcometitle ); + self endon( "disconnect" ); + self notify( "reset_outcome" ); + team = self.pers["team"]; + + if ( isdefined( team ) && team == "spectator" ) + { + for ( i = 0; i < level.players.size; i++ ) + { + if ( self.currentspectatingclient == level.players[i].clientid ) + { + team = level.players[i].pers["team"]; + break; + } + } + } + + if ( !isdefined( team ) || !isdefined( level.teams[team] ) ) + team = "allies"; + + while ( self.doingnotify ) + wait 0.05; + + self endon( "reset_outcome" ); + + if ( level.splitscreen ) + { + titlesize = 2.0; + spacing = 10; + font = "default"; + } + else + { + titlesize = 3.0; + spacing = 50; + font = "objective"; + } + + outcometitle = createfontstring( font, titlesize ); + outcometitle setpoint( "TOP", undefined, 0, spacing ); + outcometitle.glowalpha = 1; + outcometitle.hidewheninmenu = 0; + outcometitle.archived = 0; + outcometitle.immunetodemogamehudsettings = 1; + outcometitle.immunetodemofreecamera = 1; + outcometitle settext( endreasontext ); + outcometitle setpulsefx( 100, 60000, 1000 ); + self thread resetoutcomenotify( undefined, undefined, outcometitle ); } -isintop( players, topn ) //checkee changed to match cerberus output +isintop( players, topn ) { - for ( i = 0; i < topn; i++ ) - { - if ( isDefined( players[ i ] ) && self == players[ i ] ) - { - return 1; - } - } - return 0; + for ( i = 0; i < topn; i++ ) + { + if ( isdefined( players[i] ) && self == players[i] ) + return true; + } + + return false; } -outcomenotify( winner, isroundend, endreasontext ) //checked matches cerberus output +outcomenotify( winner, isroundend, endreasontext ) { - self endon( "disconnect" ); - self notify( "reset_outcome" ); - while ( self.doingnotify ) - { - wait 0.05; - } - self endon( "reset_outcome" ); - headerfont = "extrabig"; - font = "default"; - if ( self issplitscreen() ) - { - titlesize = 2; - winnersize = 1.5; - othersize = 1.5; - iconsize = 30; - spacing = 10; - } - else - { - titlesize = 3; - winnersize = 2; - othersize = 1.5; - iconsize = 30; - spacing = 20; - } - duration = 60000; - players = level.placement[ "all" ]; - outcometitle = createfontstring( headerfont, titlesize ); - outcometitle setpoint( "TOP", undefined, 0, spacing ); - if ( !maps/mp/_utility::isoneround() && !isroundend ) - { - outcometitle settext( game[ "strings" ][ "game_over" ] ); - } - else - { - if ( players[ 0 ].pointstowin == 0 ) - { - outcometitle settext( game[ "strings" ][ "tie" ] ); - } - else if ( self isintop( players, 3 ) ) - { - outcometitle settext( game[ "strings" ][ "victory" ] ); - outcometitle.color = ( 0.42, 0.68, 0.46 ); - } - else - { - outcometitle settext( game[ "strings" ][ "defeat" ] ); - outcometitle.color = ( 0.73, 0.29, 0.19 ); - } - } - outcometitle.glowalpha = 1; - outcometitle.hidewheninmenu = 0; - outcometitle.archived = 0; - outcometitle.immunetodemogamehudsettings = 1; - outcometitle.immunetodemofreecamera = 1; - outcometitle setcod7decodefx( 200, duration, 600 ); - outcometext = createfontstring( font, 2 ); - outcometext setparent( outcometitle ); - outcometext setpoint( "TOP", "BOTTOM", 0, 0 ); - outcometext.glowalpha = 1; - outcometext.hidewheninmenu = 0; - outcometext.archived = 0; - outcometext.immunetodemogamehudsettings = 1; - outcometext.immunetodemofreecamera = 1; - outcometext settext( endreasontext ); - firsttitle = createfontstring( font, winnersize ); - firsttitle setparent( outcometext ); - firsttitle setpoint( "TOP", "BOTTOM", 0, spacing ); - firsttitle.glowalpha = 1; - firsttitle.hidewheninmenu = 0; - firsttitle.archived = 0; - firsttitle.immunetodemogamehudsettings = 1; - firsttitle.immunetodemofreecamera = 1; - if ( isDefined( players[ 0 ] ) ) - { - firsttitle.label = &"MP_FIRSTPLACE_NAME"; - firsttitle setplayernamestring( players[ 0 ] ); - firsttitle setcod7decodefx( 175, duration, 600 ); - } - secondtitle = createfontstring( font, othersize ); - secondtitle setparent( firsttitle ); - secondtitle setpoint( "TOP", "BOTTOM", 0, spacing ); - secondtitle.glowalpha = 1; - secondtitle.hidewheninmenu = 0; - secondtitle.archived = 0; - secondtitle.immunetodemogamehudsettings = 1; - secondtitle.immunetodemofreecamera = 1; - if ( isDefined( players[ 1 ] ) ) - { - secondtitle.label = &"MP_SECONDPLACE_NAME"; - secondtitle setplayernamestring( players[ 1 ] ); - secondtitle setcod7decodefx( 175, duration, 600 ); - } - thirdtitle = createfontstring( font, othersize ); - thirdtitle setparent( secondtitle ); - thirdtitle setpoint( "TOP", "BOTTOM", 0, spacing ); - thirdtitle setparent( secondtitle ); - thirdtitle.glowalpha = 1; - thirdtitle.hidewheninmenu = 0; - thirdtitle.archived = 0; - thirdtitle.immunetodemogamehudsettings = 1; - thirdtitle.immunetodemofreecamera = 1; - if ( isDefined( players[ 2 ] ) ) - { - thirdtitle.label = &"MP_THIRDPLACE_NAME"; - thirdtitle setplayernamestring( players[ 2 ] ); - thirdtitle setcod7decodefx( 175, duration, 600 ); - } - matchbonus = createfontstring( font, 2 ); - matchbonus setparent( thirdtitle ); - matchbonus setpoint( "TOP", "BOTTOM", 0, spacing ); - matchbonus.glowalpha = 1; - matchbonus.hidewheninmenu = 0; - matchbonus.archived = 0; - matchbonus.immunetodemogamehudsettings = 1; - matchbonus.immunetodemofreecamera = 1; - if ( isDefined( self.matchbonus ) ) - { - bonus = ceil( self.matchbonus * level.xpscale ); - if ( bonus > 0 ) - { - matchbonus.label = game[ "strings" ][ "match_bonus" ]; - matchbonus setvalue( bonus ); - } - } - self thread updateoutcome( firsttitle, secondtitle, thirdtitle ); - self thread resetoutcomenotify( undefined, undefined, outcometitle, outcometext, firsttitle, secondtitle, thirdtitle, matchbonus ); + self endon( "disconnect" ); + self notify( "reset_outcome" ); + + while ( self.doingnotify ) + wait 0.05; + + self endon( "reset_outcome" ); + headerfont = "extrabig"; + font = "default"; + + if ( self issplitscreen() ) + { + titlesize = 2.0; + winnersize = 1.5; + othersize = 1.5; + iconsize = 30; + spacing = 10; + } + else + { + titlesize = 3.0; + winnersize = 2.0; + othersize = 1.5; + iconsize = 30; + spacing = 20; + } + + duration = 60000; + players = level.placement["all"]; + outcometitle = createfontstring( headerfont, titlesize ); + outcometitle setpoint( "TOP", undefined, 0, spacing ); + + if ( !maps\mp\_utility::isoneround() && !isroundend ) + outcometitle settext( game["strings"]["game_over"] ); + else if ( players[0].pointstowin == 0 ) + outcometitle settext( game["strings"]["tie"] ); + else if ( self isintop( players, 3 ) ) + { + outcometitle settext( game["strings"]["victory"] ); + outcometitle.color = ( 0.42, 0.68, 0.46 ); + } + else + { + outcometitle settext( game["strings"]["defeat"] ); + outcometitle.color = ( 0.73, 0.29, 0.19 ); + } + + outcometitle.glowalpha = 1; + outcometitle.hidewheninmenu = 0; + outcometitle.archived = 0; + outcometitle.immunetodemogamehudsettings = 1; + outcometitle.immunetodemofreecamera = 1; + outcometitle setcod7decodefx( 200, duration, 600 ); + outcometext = createfontstring( font, 2.0 ); + outcometext setparent( outcometitle ); + outcometext setpoint( "TOP", "BOTTOM", 0, 0 ); + outcometext.glowalpha = 1; + outcometext.hidewheninmenu = 0; + outcometext.archived = 0; + outcometext.immunetodemogamehudsettings = 1; + outcometext.immunetodemofreecamera = 1; + outcometext settext( endreasontext ); + firsttitle = createfontstring( font, winnersize ); + firsttitle setparent( outcometext ); + firsttitle setpoint( "TOP", "BOTTOM", 0, spacing ); + firsttitle.glowalpha = 1; + firsttitle.hidewheninmenu = 0; + firsttitle.archived = 0; + firsttitle.immunetodemogamehudsettings = 1; + firsttitle.immunetodemofreecamera = 1; + + if ( isdefined( players[0] ) ) + { + firsttitle.label = &"MP_FIRSTPLACE_NAME"; + firsttitle setplayernamestring( players[0] ); + firsttitle setcod7decodefx( 175, duration, 600 ); + } + + secondtitle = createfontstring( font, othersize ); + secondtitle setparent( firsttitle ); + secondtitle setpoint( "TOP", "BOTTOM", 0, spacing ); + secondtitle.glowalpha = 1; + secondtitle.hidewheninmenu = 0; + secondtitle.archived = 0; + secondtitle.immunetodemogamehudsettings = 1; + secondtitle.immunetodemofreecamera = 1; + + if ( isdefined( players[1] ) ) + { + secondtitle.label = &"MP_SECONDPLACE_NAME"; + secondtitle setplayernamestring( players[1] ); + secondtitle setcod7decodefx( 175, duration, 600 ); + } + + thirdtitle = createfontstring( font, othersize ); + thirdtitle setparent( secondtitle ); + thirdtitle setpoint( "TOP", "BOTTOM", 0, spacing ); + thirdtitle setparent( secondtitle ); + thirdtitle.glowalpha = 1; + thirdtitle.hidewheninmenu = 0; + thirdtitle.archived = 0; + thirdtitle.immunetodemogamehudsettings = 1; + thirdtitle.immunetodemofreecamera = 1; + + if ( isdefined( players[2] ) ) + { + thirdtitle.label = &"MP_THIRDPLACE_NAME"; + thirdtitle setplayernamestring( players[2] ); + thirdtitle setcod7decodefx( 175, duration, 600 ); + } + + matchbonus = createfontstring( font, 2.0 ); + matchbonus setparent( thirdtitle ); + matchbonus setpoint( "TOP", "BOTTOM", 0, spacing ); + matchbonus.glowalpha = 1; + matchbonus.hidewheninmenu = 0; + matchbonus.archived = 0; + matchbonus.immunetodemogamehudsettings = 1; + matchbonus.immunetodemofreecamera = 1; + + if ( isdefined( self.matchbonus ) ) + { + bonus = ceil( self.matchbonus * level.xpscale ); + + if ( bonus > 0 ) + { + matchbonus.label = game["strings"]["match_bonus"]; + matchbonus setvalue( bonus ); + } + } + + self thread updateoutcome( firsttitle, secondtitle, thirdtitle ); + self thread resetoutcomenotify( undefined, undefined, outcometitle, outcometext, firsttitle, secondtitle, thirdtitle, matchbonus ); } -wageroutcomenotify( winner, endreasontext ) //checked changed to match cerberus output +wageroutcomenotify( winner, endreasontext ) { - self endon( "disconnect" ); - self notify( "reset_outcome" ); - while ( self.doingnotify ) - { - wait 0.05; - } - setmatchflag( "enable_popups", 0 ); - self endon( "reset_outcome" ); - headerfont = "extrabig"; - font = "objective"; - if ( self issplitscreen() ) - { - titlesize = 2; - winnersize = 1.5; - othersize = 1.5; - iconsize = 30; - spacing = 2; - } - else - { - titlesize = 3; - winnersize = 2; - othersize = 1.5; - iconsize = 30; - spacing = 20; - } - halftime = 0; - if ( is_true( level.sidebet ) ) - { - halftime = 1; - } - duration = 60000; - players = level.placement[ "all" ]; - outcometitle = createfontstring( headerfont, titlesize ); - outcometitle setpoint( "TOP", undefined, 0, spacing ); - if ( halftime ) - { - outcometitle settext( game[ "strings" ][ "intermission" ] ); - outcometitle.color = ( 1, 1, 0 ); - outcometitle.glowcolor = ( 1, 0, 0 ); - } - else if ( isDefined( level.dontcalcwagerwinnings ) && level.dontcalcwagerwinnings == 1 ) - { - outcometitle settext( game[ "strings" ][ "wager_topwinners" ] ); - outcometitle.color = ( 0.42, 0.68, 0.46 ); - } - else - { - if ( isDefined( self.wagerwinnings ) && self.wagerwinnings > 0 ) - { - outcometitle settext( game[ "strings" ][ "wager_inthemoney" ] ); - outcometitle.color = ( 0.42, 0.68, 0.46 ); - } - else - { - outcometitle settext( game[ "strings" ][ "wager_loss" ] ); - outcometitle.color = ( 0.73, 0.29, 0.19 ); - } - } - outcometitle.glowalpha = 1; - outcometitle.hidewheninmenu = 0; - outcometitle.archived = 0; - outcometitle.immunetodemogamehudsettings = 1; - outcometitle.immunetodemofreecamera = 1; - outcometitle setcod7decodefx( 200, duration, 600 ); - outcometext = createfontstring( font, 2 ); - outcometext setparent( outcometitle ); - outcometext setpoint( "TOP", "BOTTOM", 0, 0 ); - outcometext.glowalpha = 1; - outcometext.hidewheninmenu = 0; - outcometext.archived = 0; - outcometext.immunetodemogamehudsettings = 1; - outcometext.immunetodemofreecamera = 1; - outcometext settext( endreasontext ); - playernamehudelems = []; - playercphudelems = []; - numplayers = players.size; - for ( i = 0; i < numplayers; i++ ) - { - if ( !halftime && isDefined( players[ i ] ) ) - { - secondtitle = createfontstring( font, othersize ); - if ( playernamehudelems.size == 0 ) - { - secondtitle setparent( outcometext ); - secondtitle setpoint( "TOP_LEFT", "BOTTOM", -175, spacing * 3 ); - } - else - { - secondtitle setparent( playernamehudelems[ playernamehudelems.size - 1 ] ); - secondtitle setpoint( "TOP_LEFT", "BOTTOM_LEFT", 0, spacing ); - } - secondtitle.glowalpha = 1; - secondtitle.hidewheninmenu = 0; - secondtitle.archived = 0; - secondtitle.immunetodemogamehudsettings = 1; - secondtitle.immunetodemofreecamera = 1; - secondtitle.label = &"MP_WAGER_PLACE_NAME"; - secondtitle.playernum = i; - secondtitle setplayernamestring( players[ i ] ); - playernamehudelems[ playernamehudelems.size ] = secondtitle; - secondcp = createfontstring( font, othersize ); - secondcp setparent( secondtitle ); - secondcp setpoint( "TOP_RIGHT", "TOP_LEFT", 350, 0 ); - secondcp.glowalpha = 1; - secondcp.hidewheninmenu = 0; - secondcp.archived = 0; - secondcp.immunetodemogamehudsettings = 1; - secondcp.immunetodemofreecamera = 1; - secondcp.label = &"MENU_POINTS"; - secondcp.currentvalue = 0; - if ( isDefined( players[ i ].wagerwinnings ) ) - { - secondcp.targetvalue = players[ i ].wagerwinnings; - } - else - { - secondcp.targetvalue = 0; - } - if ( secondcp.targetvalue > 0 ) - { - secondcp.color = ( 0.42, 0.68, 0.46 ); - } - secondcp setvalue( 0 ); - playercphudelems[ playercphudelems.size ] = secondcp; - } - } - self thread updatewageroutcome( playernamehudelems, playercphudelems ); - self thread resetwageroutcomenotify( playernamehudelems, playercphudelems, outcometitle, outcometext ); - if ( halftime ) - { - return; - } - stillupdating = 1; - countupduration = 2; - cpincrement = 9999; - if ( isDefined( playercphudelems[ 0 ] ) ) - { - cpincrement = int( playercphudelems[ 0 ].targetvalue / ( countupduration / 0.05 ) ); - if ( cpincrement < 1 ) - { - cpincrement = 1; - } - } - while ( stillupdating ) - { - stillupdating = 0; - for ( i = 0; i < playercphudelems.size; i++ ) - { - if ( isDefined( playercphudelems[ i ] ) && playercphudelems[ i ].currentvalue < playercphudelems[ i ].targetvalue ) - { - playercphudelems[ i ].currentvalue += cpincrement; - if ( playercphudelems[ i ].currentvalue > playercphudelems[ i ].targetvalue ) - { - playercphudelems[ i ].currentvalue = playercphudelems[ i ].targetvalue; - } - playercphudelems[ i ] setvalue( playercphudelems[ i ].currentvalue ); - stillupdating = 1; - } - } - wait 0.05; - } + self endon( "disconnect" ); + self notify( "reset_outcome" ); + + while ( self.doingnotify ) + wait 0.05; + + setmatchflag( "enable_popups", 0 ); + self endon( "reset_outcome" ); + headerfont = "extrabig"; + font = "objective"; + + if ( self issplitscreen() ) + { + titlesize = 2.0; + winnersize = 1.5; + othersize = 1.5; + iconsize = 30; + spacing = 2; + } + else + { + titlesize = 3.0; + winnersize = 2.0; + othersize = 1.5; + iconsize = 30; + spacing = 20; + } + + halftime = 0; + + if ( isdefined( level.sidebet ) && level.sidebet ) + halftime = 1; + + duration = 60000; + players = level.placement["all"]; + outcometitle = createfontstring( headerfont, titlesize ); + outcometitle setpoint( "TOP", undefined, 0, spacing ); + + if ( halftime ) + { + outcometitle settext( game["strings"]["intermission"] ); + outcometitle.color = ( 1, 1, 0 ); + outcometitle.glowcolor = ( 1, 0, 0 ); + } + else if ( isdefined( level.dontcalcwagerwinnings ) && level.dontcalcwagerwinnings == 1 ) + { + outcometitle settext( game["strings"]["wager_topwinners"] ); + outcometitle.color = ( 0.42, 0.68, 0.46 ); + } + else if ( isdefined( self.wagerwinnings ) && self.wagerwinnings > 0 ) + { + outcometitle settext( game["strings"]["wager_inthemoney"] ); + outcometitle.color = ( 0.42, 0.68, 0.46 ); + } + else + { + outcometitle settext( game["strings"]["wager_loss"] ); + outcometitle.color = ( 0.73, 0.29, 0.19 ); + } + + outcometitle.glowalpha = 1; + outcometitle.hidewheninmenu = 0; + outcometitle.archived = 0; + outcometitle.immunetodemogamehudsettings = 1; + outcometitle.immunetodemofreecamera = 1; + outcometitle setcod7decodefx( 200, duration, 600 ); + outcometext = createfontstring( font, 2.0 ); + outcometext setparent( outcometitle ); + outcometext setpoint( "TOP", "BOTTOM", 0, 0 ); + outcometext.glowalpha = 1; + outcometext.hidewheninmenu = 0; + outcometext.archived = 0; + outcometext.immunetodemogamehudsettings = 1; + outcometext.immunetodemofreecamera = 1; + outcometext settext( endreasontext ); + playernamehudelems = []; + playercphudelems = []; + numplayers = players.size; + + for ( i = 0; i < numplayers; i++ ) + { + if ( !halftime && isdefined( players[i] ) ) + { + secondtitle = createfontstring( font, othersize ); + + if ( playernamehudelems.size == 0 ) + { + secondtitle setparent( outcometext ); + secondtitle setpoint( "TOP_LEFT", "BOTTOM", -175, spacing * 3 ); + } + else + { + secondtitle setparent( playernamehudelems[playernamehudelems.size - 1] ); + secondtitle setpoint( "TOP_LEFT", "BOTTOM_LEFT", 0, spacing ); + } + + secondtitle.glowalpha = 1; + secondtitle.hidewheninmenu = 0; + secondtitle.archived = 0; + secondtitle.immunetodemogamehudsettings = 1; + secondtitle.immunetodemofreecamera = 1; + secondtitle.label = &"MP_WAGER_PLACE_NAME"; + secondtitle.playernum = i; + secondtitle setplayernamestring( players[i] ); + playernamehudelems[playernamehudelems.size] = secondtitle; + secondcp = createfontstring( font, othersize ); + secondcp setparent( secondtitle ); + secondcp setpoint( "TOP_RIGHT", "TOP_LEFT", 350, 0 ); + secondcp.glowalpha = 1; + secondcp.hidewheninmenu = 0; + secondcp.archived = 0; + secondcp.immunetodemogamehudsettings = 1; + secondcp.immunetodemofreecamera = 1; + secondcp.label = &"MENU_POINTS"; + secondcp.currentvalue = 0; + + if ( isdefined( players[i].wagerwinnings ) ) + secondcp.targetvalue = players[i].wagerwinnings; + else + secondcp.targetvalue = 0; + + if ( secondcp.targetvalue > 0 ) + secondcp.color = ( 0.42, 0.68, 0.46 ); + + secondcp setvalue( 0 ); + playercphudelems[playercphudelems.size] = secondcp; + } + } + + self thread updatewageroutcome( playernamehudelems, playercphudelems ); + self thread resetwageroutcomenotify( playernamehudelems, playercphudelems, outcometitle, outcometext ); + + if ( halftime ) + return; + + stillupdating = 1; + countupduration = 2; + cpincrement = 9999; + + if ( isdefined( playercphudelems[0] ) ) + { + cpincrement = int( playercphudelems[0].targetvalue / ( countupduration / 0.05 ) ); + + if ( cpincrement < 1 ) + cpincrement = 1; + } + + while ( stillupdating ) + { + stillupdating = 0; + + for ( i = 0; i < playercphudelems.size; i++ ) + { + if ( isdefined( playercphudelems[i] ) && playercphudelems[i].currentvalue < playercphudelems[i].targetvalue ) + { + playercphudelems[i].currentvalue += cpincrement; + + if ( playercphudelems[i].currentvalue > playercphudelems[i].targetvalue ) + playercphudelems[i].currentvalue = playercphudelems[i].targetvalue; + + playercphudelems[i] setvalue( playercphudelems[i].currentvalue ); + stillupdating = 1; + } + } + + wait 0.05; + } } -teamwageroutcomenotify( winner, isroundend, endreasontext ) //checked partially changed to match cerberus output see info.md +teamwageroutcomenotify( winner, isroundend, endreasontext ) { - self endon( "disconnect" ); - self notify( "reset_outcome" ); - team = self.pers[ "team" ]; - if ( !isDefined( team ) || !isDefined( level.teams[ team ] ) ) - { - team = "allies"; - } - wait 0.05; - while ( self.doingnotify ) - { - wait 0.05; - } - self endon( "reset_outcome" ); - headerfont = "extrabig"; - font = "objective"; - if ( self issplitscreen() ) - { - titlesize = 2; - textsize = 1.5; - iconsize = 30; - spacing = 10; - } - else - { - titlesize = 3; - textsize = 2; - iconsize = 70; - spacing = 15; - } - halftime = 0; - if ( is_true( level.sidebet ) ) - { - halftime = 1; - } - duration = 60000; - outcometitle = createfontstring( headerfont, titlesize ); - outcometitle setpoint( "TOP", undefined, 0, spacing ); - outcometitle.glowalpha = 1; - outcometitle.hidewheninmenu = 0; - outcometitle.archived = 0; - outcometitle.immunetodemogamehudsettings = 1; - outcometitle.immunetodemofreecamera = 1; - outcometext = createfontstring( font, 2 ); - outcometext setparent( outcometitle ); - outcometext setpoint( "TOP", "BOTTOM", 0, 0 ); - outcometext.glowalpha = 1; - outcometext.hidewheninmenu = 0; - outcometext.archived = 0; - outcometext.immunetodemogamehudsettings = 1; - outcometext.immunetodemofreecamera = 1; - if ( winner == "tie" ) - { - if ( isroundend ) - { - outcometitle settext( game[ "strings" ][ "round_draw" ] ); - } - else - { - outcometitle settext( game[ "strings" ][ "draw" ] ); - } - outcometitle.color = ( 1, 1, 1 ); - winner = "allies"; - } - else if ( winner == "overtime" ) - { - outcometitle settext( game[ "strings" ][ "overtime" ] ); - outcometitle.color = ( 1, 1, 1 ); - } - else if ( isDefined( self.pers[ "team" ] ) && winner == team ) - { - if ( isroundend ) - { - outcometitle settext( game[ "strings" ][ "round_win" ] ); - } - else - { - outcometitle settext( game[ "strings" ][ "victory" ] ); - } - outcometitle.color = ( 0.42, 0.68, 0.46 ); - } - else - { - if ( isroundend ) - { - outcometitle settext( game[ "strings" ][ "round_loss" ] ); - } - else - { - outcometitle settext( game[ "strings" ][ "defeat" ] ); - } - outcometitle.color = ( 0.73, 0.29, 0.19 ); - } - if ( !isDefined( level.dontshowendreason ) || !level.dontshowendreason ) - { - outcometext settext( endreasontext ); - } - outcometitle setpulsefx( 100, duration, 1000 ); - outcometext setpulsefx( 100, duration, 1000 ); - teamicons = []; - teamicons[ team ] = createicon( game[ "icons" ][ team ], iconsize, iconsize ); - teamicons[ team ] setparent( outcometext ); - teamicons[ team ] setpoint( "TOP", "BOTTOM", -60, spacing ); - teamicons[ team ].hidewheninmenu = 0; - teamicons[ team ].archived = 0; - teamicons[ team ].alpha = 0; - teamicons[ team ] fadeovertime( 0.5 ); - teamicons[ team ].alpha = 1; - teamicons[ team ].immunetodemogamehudsettings = 1; - teamicons[ team ].immunetodemofreecamera = 1; - foreach ( enemyteam in level.teams ) - { - if ( team == enemyteam ) - { - } - else - { - teamicons[ enemyteam ] = createicon( game[ "icons" ][ enemyteam ], iconsize, iconsize ); - teamicons[ enemyteam ] setparent( outcometext ); - teamicons[ enemyteam ] setpoint( "TOP", "BOTTOM", 60, spacing ); - teamicons[ enemyteam ].hidewheninmenu = 0; - teamicons[ enemyteam ].archived = 0; - teamicons[ enemyteam ].alpha = 0; - teamicons[ enemyteam ] fadeovertime( 0.5 ); - teamicons[ enemyteam ].alpha = 1; - teamicons[ enemyteam ].immunetodemogamehudsettings = 1; - teamicons[ enemyteam ].immunetodemofreecamera = 1; - } - } - teamscores = []; - teamscores[ team ] = createfontstring( font, titlesize ); - teamscores[ team ] setparent( teamicons[ team ] ); - teamscores[ team ] setpoint( "TOP", "BOTTOM", 0, spacing ); - teamscores[ team ].glowalpha = 1; - teamscores[ team ] setvalue( getteamscore( team ) ); - teamscores[ team ].hidewheninmenu = 0; - teamscores[ team ].archived = 0; - teamscores[ team ].immunetodemogamehudsettings = 1; - teamscores[ team ].immunetodemofreecamera = 1; - teamscores[ team ] setpulsefx( 100, duration, 1000 ); - foreach ( enemyteam in level.teams ) - { - if ( team == enemyteam ) - { - } - else - { - teamscores[ enemyteam ] = createfontstring( font, titlesize ); - teamscores[ enemyteam ] setparent( teamicons[ enemyteam ] ); - teamscores[ enemyteam ] setpoint( "TOP", "BOTTOM", 0, spacing ); - teamscores[ enemyteam ].glowalpha = 1; - teamscores[ enemyteam ] setvalue( getteamscore( enemyteam ) ); - teamscores[ enemyteam ].hidewheninmenu = 0; - teamscores[ enemyteam ].archived = 0; - teamscores[ enemyteam ].immunetodemogamehudsettings = 1; - teamscores[ enemyteam ].immunetodemofreecamera = 1; - teamscores[ enemyteam ] setpulsefx( 100, duration, 1000 ); - } - } - matchbonus = undefined; - sidebetwinnings = undefined; - if ( !isroundend && !halftime && isDefined( self.wagerwinnings ) ) - { - matchbonus = createfontstring( font, 2 ); - matchbonus setparent( outcometext ); - matchbonus setpoint( "TOP", "BOTTOM", 0, iconsize + ( spacing * 3 ) + teamscores[ team ].height ); - matchbonus.glowalpha = 1; - matchbonus.hidewheninmenu = 0; - matchbonus.archived = 0; - matchbonus.immunetodemogamehudsettings = 1; - matchbonus.immunetodemofreecamera = 1; - matchbonus.label = game[ "strings" ][ "wager_winnings" ]; - matchbonus setvalue( self.wagerwinnings ); - if ( is_true( game[ "side_bets" ] ) ) - { - sidebetwinnings = createfontstring( font, 2 ); - sidebetwinnings setparent( matchbonus ); - sidebetwinnings setpoint( "TOP", "BOTTOM", 0, spacing ); - sidebetwinnings.glowalpha = 1; - sidebetwinnings.hidewheninmenu = 0; - sidebetwinnings.archived = 0; - sidebetwinnings.immunetodemogamehudsettings = 1; - sidebetwinnings.immunetodemofreecamera = 1; - sidebetwinnings.label = game[ "strings" ][ "wager_sidebet_winnings" ]; - sidebetwinnings setvalue( self.pers[ "wager_sideBetWinnings" ] ); - } - } - self thread resetoutcomenotify( teamicons, teamscores, outcometitle, outcometext, matchbonus, sidebetwinnings ); + self endon( "disconnect" ); + self notify( "reset_outcome" ); + team = self.pers["team"]; + + if ( !isdefined( team ) || !isdefined( level.teams[team] ) ) + team = "allies"; + + wait 0.05; + + while ( self.doingnotify ) + wait 0.05; + + self endon( "reset_outcome" ); + headerfont = "extrabig"; + font = "objective"; + + if ( self issplitscreen() ) + { + titlesize = 2.0; + textsize = 1.5; + iconsize = 30; + spacing = 10; + } + else + { + titlesize = 3.0; + textsize = 2.0; + iconsize = 70; + spacing = 15; + } + + halftime = 0; + + if ( isdefined( level.sidebet ) && level.sidebet ) + halftime = 1; + + duration = 60000; + outcometitle = createfontstring( headerfont, titlesize ); + outcometitle setpoint( "TOP", undefined, 0, spacing ); + outcometitle.glowalpha = 1; + outcometitle.hidewheninmenu = 0; + outcometitle.archived = 0; + outcometitle.immunetodemogamehudsettings = 1; + outcometitle.immunetodemofreecamera = 1; + outcometext = createfontstring( font, 2.0 ); + outcometext setparent( outcometitle ); + outcometext setpoint( "TOP", "BOTTOM", 0, 0 ); + outcometext.glowalpha = 1; + outcometext.hidewheninmenu = 0; + outcometext.archived = 0; + outcometext.immunetodemogamehudsettings = 1; + outcometext.immunetodemofreecamera = 1; + + if ( winner == "tie" ) + { + if ( isroundend ) + outcometitle settext( game["strings"]["round_draw"] ); + else + outcometitle settext( game["strings"]["draw"] ); + + outcometitle.color = ( 1, 1, 1 ); + winner = "allies"; + } + else if ( winner == "overtime" ) + { + outcometitle settext( game["strings"]["overtime"] ); + outcometitle.color = ( 1, 1, 1 ); + } + else if ( isdefined( self.pers["team"] ) && winner == team ) + { + if ( isroundend ) + outcometitle settext( game["strings"]["round_win"] ); + else + outcometitle settext( game["strings"]["victory"] ); + + outcometitle.color = ( 0.42, 0.68, 0.46 ); + } + else + { + if ( isroundend ) + outcometitle settext( game["strings"]["round_loss"] ); + else + outcometitle settext( game["strings"]["defeat"] ); + + outcometitle.color = ( 0.73, 0.29, 0.19 ); + } + + if ( !isdefined( level.dontshowendreason ) || !level.dontshowendreason ) + outcometext settext( endreasontext ); + + outcometitle setpulsefx( 100, duration, 1000 ); + outcometext setpulsefx( 100, duration, 1000 ); + teamicons = []; + teamicons[team] = createicon( game["icons"][team], iconsize, iconsize ); + teamicons[team] setparent( outcometext ); + teamicons[team] setpoint( "TOP", "BOTTOM", -60, spacing ); + teamicons[team].hidewheninmenu = 0; + teamicons[team].archived = 0; + teamicons[team].alpha = 0; + teamicons[team] fadeovertime( 0.5 ); + teamicons[team].alpha = 1; + teamicons[team].immunetodemogamehudsettings = 1; + teamicons[team].immunetodemofreecamera = 1; + + foreach ( enemyteam in level.teams ) + { + if ( team == enemyteam ) + continue; + + teamicons[enemyteam] = createicon( game["icons"][enemyteam], iconsize, iconsize ); + teamicons[enemyteam] setparent( outcometext ); + teamicons[enemyteam] setpoint( "TOP", "BOTTOM", 60, spacing ); + teamicons[enemyteam].hidewheninmenu = 0; + teamicons[enemyteam].archived = 0; + teamicons[enemyteam].alpha = 0; + teamicons[enemyteam] fadeovertime( 0.5 ); + teamicons[enemyteam].alpha = 1; + teamicons[enemyteam].immunetodemogamehudsettings = 1; + teamicons[enemyteam].immunetodemofreecamera = 1; + } + + teamscores = []; + teamscores[team] = createfontstring( font, titlesize ); + teamscores[team] setparent( teamicons[team] ); + teamscores[team] setpoint( "TOP", "BOTTOM", 0, spacing ); + teamscores[team].glowalpha = 1; + teamscores[team] setvalue( getteamscore( team ) ); + teamscores[team].hidewheninmenu = 0; + teamscores[team].archived = 0; + teamscores[team].immunetodemogamehudsettings = 1; + teamscores[team].immunetodemofreecamera = 1; + teamscores[team] setpulsefx( 100, duration, 1000 ); + + foreach ( enemyteam in level.teams ) + { + if ( team == enemyteam ) + continue; + + teamscores[enemyteam] = createfontstring( font, titlesize ); + teamscores[enemyteam] setparent( teamicons[enemyteam] ); + teamscores[enemyteam] setpoint( "TOP", "BOTTOM", 0, spacing ); + teamscores[enemyteam].glowalpha = 1; + teamscores[enemyteam] setvalue( getteamscore( enemyteam ) ); + teamscores[enemyteam].hidewheninmenu = 0; + teamscores[enemyteam].archived = 0; + teamscores[enemyteam].immunetodemogamehudsettings = 1; + teamscores[enemyteam].immunetodemofreecamera = 1; + teamscores[enemyteam] setpulsefx( 100, duration, 1000 ); + } + + matchbonus = undefined; + sidebetwinnings = undefined; + + if ( !isroundend && !halftime && isdefined( self.wagerwinnings ) ) + { + matchbonus = createfontstring( font, 2.0 ); + matchbonus setparent( outcometext ); + matchbonus setpoint( "TOP", "BOTTOM", 0, iconsize + spacing * 3 + teamscores[team].height ); + matchbonus.glowalpha = 1; + matchbonus.hidewheninmenu = 0; + matchbonus.archived = 0; + matchbonus.immunetodemogamehudsettings = 1; + matchbonus.immunetodemofreecamera = 1; + matchbonus.label = game["strings"]["wager_winnings"]; + matchbonus setvalue( self.wagerwinnings ); + + if ( isdefined( game["side_bets"] ) && game["side_bets"] ) + { + sidebetwinnings = createfontstring( font, 2.0 ); + sidebetwinnings setparent( matchbonus ); + sidebetwinnings setpoint( "TOP", "BOTTOM", 0, spacing ); + sidebetwinnings.glowalpha = 1; + sidebetwinnings.hidewheninmenu = 0; + sidebetwinnings.archived = 0; + sidebetwinnings.immunetodemogamehudsettings = 1; + sidebetwinnings.immunetodemofreecamera = 1; + sidebetwinnings.label = game["strings"]["wager_sidebet_winnings"]; + sidebetwinnings setvalue( self.pers["wager_sideBetWinnings"] ); + } + } + + self thread resetoutcomenotify( teamicons, teamscores, outcometitle, outcometext, matchbonus, sidebetwinnings ); } -destroyhudelem( hudelem ) //checked matches cerberus output +destroyhudelem( hudelem ) { - if ( isDefined( hudelem ) ) - { - hudelem destroyelem(); - } + if ( isdefined( hudelem ) ) + hudelem destroyelem(); } -resetoutcomenotify( hudelemlist1, hudelemlist2, hudelem3, hudelem4, hudelem5, hudelem6, hudelem7, hudelem8, hudelem9, hudelem10 ) //checked changed to match beta dump +resetoutcomenotify( hudelemlist1, hudelemlist2, hudelem3, hudelem4, hudelem5, hudelem6, hudelem7, hudelem8, hudelem9, hudelem10 ) { - self endon( "disconnect" ); - self waittill( "reset_outcome" ); - destroyhudelem( hudelem3 ); - destroyhudelem( hudelem4 ); - destroyhudelem( hudelem5 ); - destroyhudelem( hudelem6 ); - destroyhudelem( hudelem7 ); - destroyhudelem( hudelem8 ); - destroyhudelem( hudelem9 ); - destroyhudelem( hudelem10 ); - if ( isDefined( hudelemlist1 ) ) - { - foreach ( elem in hudelemlist1 ) - { - destroyhudelem( elem ); - } - } - if ( isDefined( hudelemlist2 ) ) - { - foreach ( elem in hudelemlist2 ) - { - destroyhudelem( elem ); - } - } + self endon( "disconnect" ); + + self waittill( "reset_outcome" ); + + destroyhudelem( hudelem3 ); + destroyhudelem( hudelem4 ); + destroyhudelem( hudelem5 ); + destroyhudelem( hudelem6 ); + destroyhudelem( hudelem7 ); + destroyhudelem( hudelem8 ); + destroyhudelem( hudelem9 ); + destroyhudelem( hudelem10 ); + + if ( isdefined( hudelemlist1 ) ) + { + foreach ( elem in hudelemlist1 ) + destroyhudelem( elem ); + } + + if ( isdefined( hudelemlist2 ) ) + { + foreach ( elem in hudelemlist2 ) + destroyhudelem( elem ); + } } -resetwageroutcomenotify( playernamehudelems, playercphudelems, outcometitle, outcometext ) //checked changed to match cerberus output +resetwageroutcomenotify( playernamehudelems, playercphudelems, outcometitle, outcometext ) { - self endon( "disconnect" ); - self waittill( "reset_outcome" ); - for ( i = playernamehudelems.size - 1; i >= 0; i-- ) - { - if ( isDefined( playernamehudelems[ i ] ) ) - { - playernamehudelems[ i ] destroy(); - } - } - for ( i = playercphudelems.size - 1; i >= 0; i-- ) - { - if ( isDefined( playercphudelems[ i ] ) ) - { - playercphudelems[ i ] destroy(); - } - } - if ( isDefined( outcometext ) ) - { - outcometext destroy(); - } - if ( isDefined( outcometitle ) ) - { - outcometitle destroy(); - } + self endon( "disconnect" ); + + self waittill( "reset_outcome" ); + + for ( i = playernamehudelems.size - 1; i >= 0; i-- ) + { + if ( isdefined( playernamehudelems[i] ) ) + playernamehudelems[i] destroy(); + } + + for ( i = playercphudelems.size - 1; i >= 0; i-- ) + { + if ( isdefined( playercphudelems[i] ) ) + playercphudelems[i] destroy(); + } + + if ( isdefined( outcometext ) ) + outcometext destroy(); + + if ( isdefined( outcometitle ) ) + outcometitle destroy(); } -updateoutcome( firsttitle, secondtitle, thirdtitle ) //checked changed to match cerberus output +updateoutcome( firsttitle, secondtitle, thirdtitle ) { - self endon( "disconnect" ); - self endon( "reset_outcome" ); - while ( 1 ) - { - self waittill( "update_outcome" ); - players = level.placement[ "all" ]; - if ( isDefined( firsttitle ) && isDefined( players[ 0 ] ) ) - { - firsttitle setplayernamestring( players[ 0 ] ); - } - else if ( isDefined( firsttitle ) ) - { - firsttitle.alpha = 0; - } - if ( isDefined( secondtitle ) && isDefined( players[ 1 ] ) ) - { - secondtitle setplayernamestring( players[ 1 ] ); - } - else if ( isDefined( secondtitle ) ) - { - secondtitle.alpha = 0; - } - if ( isDefined( thirdtitle ) && isDefined( players[ 2 ] ) ) - { - thirdtitle setplayernamestring( players[ 2 ] ); - } - else if ( isDefined( thirdtitle ) ) - { - thirdtitle.alpha = 0; - } - } + self endon( "disconnect" ); + self endon( "reset_outcome" ); + + while ( true ) + { + self waittill( "update_outcome" ); + + players = level.placement["all"]; + + if ( isdefined( firsttitle ) && isdefined( players[0] ) ) + firsttitle setplayernamestring( players[0] ); + else if ( isdefined( firsttitle ) ) + firsttitle.alpha = 0; + + if ( isdefined( secondtitle ) && isdefined( players[1] ) ) + secondtitle setplayernamestring( players[1] ); + else if ( isdefined( secondtitle ) ) + secondtitle.alpha = 0; + + if ( isdefined( thirdtitle ) && isdefined( players[2] ) ) + thirdtitle setplayernamestring( players[2] ); + else if ( isdefined( thirdtitle ) ) + thirdtitle.alpha = 0; + } } -updatewageroutcome( playernamehudelems, playercphudelems ) //checked changed to match betad ump +updatewageroutcome( playernamehudelems, playercphudelems ) { - self endon( "disconnect" ); - self endon( "reset_outcome" ); - while ( 1 ) - { - self waittill( "update_outcome" ); - players = level.placement[ "all" ]; - for ( i = 0; i < playernamehudelems.size; i++ ) - { - if ( isDefined( playernamehudelems[ i ] ) && isDefined( players[ playernamehudelems[ i ].playernum ] ) ) - { - playernamehudelems[ i ] setplayernamestring( players[ playernamehudelems[ i ].playernum ] ); - } - else - { - if ( isDefined( playernamehudelems[ i ] ) ) - { - playernamehudelems[ i ].alpha = 0; - } - if ( isDefined( playercphudelems[ i ] ) ) - { - playercphudelems[ i ].alpha = 0; - } - } - } - } + self endon( "disconnect" ); + self endon( "reset_outcome" ); + + while ( true ) + { + self waittill( "update_outcome" ); + + players = level.placement["all"]; + + for ( i = 0; i < playernamehudelems.size; i++ ) + { + if ( isdefined( playernamehudelems[i] ) && isdefined( players[playernamehudelems[i].playernum] ) ) + { + playernamehudelems[i] setplayernamestring( players[playernamehudelems[i].playernum] ); + continue; + } + + if ( isdefined( playernamehudelems[i] ) ) + playernamehudelems[i].alpha = 0; + + if ( isdefined( playercphudelems[i] ) ) + playercphudelems[i].alpha = 0; + } + } } -setshoutcasterwaitingmessage() //checked matches cerberus output +setshoutcasterwaitingmessage() { - if ( !isDefined( self.waitingforplayerstext ) ) - { - self.waitingforplayerstext = createfontstring( "objective", 2.5 ); - self.waitingforplayerstext setpoint( "CENTER", "CENTER", 0, -80 ); - self.waitingforplayerstext.sort = 1001; - self.waitingforplayerstext settext( &"MP_WAITING_FOR_PLAYERS_SHOUTCASTER" ); - self.waitingforplayerstext.foreground = 0; - self.waitingforplayerstext.hidewheninmenu = 1; - } + if ( !isdefined( self.waitingforplayerstext ) ) + { + self.waitingforplayerstext = createfontstring( "objective", 2.5 ); + self.waitingforplayerstext setpoint( "CENTER", "CENTER", 0, -80 ); + self.waitingforplayerstext.sort = 1001; + self.waitingforplayerstext settext( &"MP_WAITING_FOR_PLAYERS_SHOUTCASTER" ); + self.waitingforplayerstext.foreground = 0; + self.waitingforplayerstext.hidewheninmenu = 1; + } } -clearshoutcasterwaitingmessage() //checked matches cerberus output +clearshoutcasterwaitingmessage() { - if ( isDefined( self.waitingforplayerstext ) ) - { - destroyhudelem( self.waitingforplayerstext ); - self.waitingforplayerstext = undefined; - } + if ( isdefined( self.waitingforplayerstext ) ) + { + destroyhudelem( self.waitingforplayerstext ); + self.waitingforplayerstext = undefined; + } } - diff --git a/Multiplayer Core/patch_mp/maps/mp/gametypes/_hud_util.gsc b/Multiplayer Core/patch_mp/maps/mp/gametypes/_hud_util.gsc index 9a13bb7..be6aa99 100644 --- a/Multiplayer Core/patch_mp/maps/mp/gametypes/_hud_util.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/gametypes/_hud_util.gsc @@ -1,1145 +1,1055 @@ -//checked includes match cerberus output -#include maps/mp/_utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool -setparent( element ) //checked matches cerberus output +setparent( element ) { - if ( isDefined( self.parent ) && self.parent == element ) - { - return; - } - if ( isDefined( self.parent ) ) - { - self.parent removechild( self ); - } - self.parent = element; - self.parent addchild( self ); - if ( isDefined( self.point ) ) - { - self setpoint( self.point, self.relativepoint, self.xoffset, self.yoffset ); - } - else - { - self setpoint( "TOP" ); - } + if ( isdefined( self.parent ) && self.parent == element ) + return; + + if ( isdefined( self.parent ) ) + self.parent removechild( self ); + + self.parent = element; + self.parent addchild( self ); + + if ( isdefined( self.point ) ) + self setpoint( self.point, self.relativepoint, self.xoffset, self.yoffset ); + else + self setpoint( "TOP" ); } -getparent() //checked matches cerberus output +getparent() { - return self.parent; + return self.parent; } -addchild( element ) //checked matches cerberus output +addchild( element ) { - element.index = self.children.size; - self.children[ self.children.size ] = element; + element.index = self.children.size; + self.children[self.children.size] = element; } -removechild( element ) //checked matches cerberus output +removechild( element ) { - element.parent = undefined; - if ( self.children[ self.children.size - 1 ] != element ) - { - self.children[ element.index ] = self.children[ self.children.size - 1 ]; - self.children[ element.index ].index = element.index; - } - element.index = undefined; + element.parent = undefined; + + if ( self.children[self.children.size - 1] != element ) + { + self.children[element.index] = self.children[self.children.size - 1]; + self.children[element.index].index = element.index; + } + + self.children[self.children.size - 1] = undefined; + element.index = undefined; } -setpoint( point, relativepoint, xoffset, yoffset, movetime ) //checked matches cerberus output +setpoint( point, relativepoint, xoffset, yoffset, movetime ) { - if ( !isDefined( movetime ) ) - { - movetime = 0; - } - element = self getparent(); - if ( movetime ) - { - self moveovertime( movetime ); - } - if ( !isDefined( xoffset ) ) - { - xoffset = 0; - } - self.xoffset = xoffset; - if ( !isDefined( yoffset ) ) - { - yoffset = 0; - } - self.yoffset = yoffset; - self.point = point; - self.alignx = "center"; - self.aligny = "middle"; - switch( point ) - { - case "CENTER": - break; - case "TOP": - self.aligny = "top"; - break; - case "BOTTOM": - self.aligny = "bottom"; - break; - case "LEFT": - self.alignx = "left"; - break; - case "RIGHT": - self.alignx = "right"; - break; - case "TOPRIGHT": - case "TOP_RIGHT": - self.aligny = "top"; - self.alignx = "right"; - break; - case "TOPLEFT": - case "TOP_LEFT": - self.aligny = "top"; - self.alignx = "left"; - break; - case "TOPCENTER": - self.aligny = "top"; - self.alignx = "center"; - break; - case "BOTTOM RIGHT": - case "BOTTOM_RIGHT": - self.aligny = "bottom"; - self.alignx = "right"; - break; - case "BOTTOM LEFT": - case "BOTTOM_LEFT": - self.aligny = "bottom"; - self.alignx = "left"; - break; - default: - /* + if ( !isdefined( movetime ) ) + movetime = 0; + + element = self getparent(); + + if ( movetime ) + self moveovertime( movetime ); + + if ( !isdefined( xoffset ) ) + xoffset = 0; + + self.xoffset = xoffset; + + if ( !isdefined( yoffset ) ) + yoffset = 0; + + self.yoffset = yoffset; + self.point = point; + self.alignx = "center"; + self.aligny = "middle"; + + switch ( point ) + { + case "CENTER": + break; + case "TOP": + self.aligny = "top"; + break; + case "BOTTOM": + self.aligny = "bottom"; + break; + case "LEFT": + self.alignx = "left"; + break; + case "RIGHT": + self.alignx = "right"; + break; + case "TOP_RIGHT": + case "TOPRIGHT": + self.aligny = "top"; + self.alignx = "right"; + break; + case "TOP_LEFT": + case "TOPLEFT": + self.aligny = "top"; + self.alignx = "left"; + break; + case "TOPCENTER": + self.aligny = "top"; + self.alignx = "center"; + break; + case "BOTTOM_RIGHT": + case "BOTTOM RIGHT": + self.aligny = "bottom"; + self.alignx = "right"; + break; + case "BOTTOM_LEFT": + case "BOTTOM LEFT": + self.aligny = "bottom"; + self.alignx = "left"; + break; + default: /# - println( "^3Warning: unknown point passed to setPoint(): " + point ); + println( "^3Warning: unknown point passed to setPoint(): " + point ); #/ - */ - break; - } - if ( !isDefined( relativepoint ) ) - { - relativepoint = point; - } - self.relativepoint = relativepoint; - relativex = "center"; - relativey = "middle"; - switch( relativepoint ) - { - case "CENTER": - break; - case "TOP": - relativey = "top"; - break; - case "BOTTOM": - relativey = "bottom"; - break; - case "LEFT": - relativex = "left"; - break; - case "RIGHT": - relativex = "right"; - break; - case "TOPRIGHT": - case "TOP_RIGHT": - relativey = "top"; - relativex = "right"; - break; - case "TOPLEFT": - case "TOP_LEFT": - relativey = "top"; - relativex = "left"; - break; - case "TOPCENTER": - relativey = "top"; - relativex = "center"; - break; - case "BOTTOM RIGHT": - case "BOTTOM_RIGHT": - relativey = "bottom"; - relativex = "right"; - break; - case "BOTTOM LEFT": - case "BOTTOM_LEFT": - relativey = "bottom"; - relativex = "left"; - break; - default: - /* + break; + } + + if ( !isdefined( relativepoint ) ) + relativepoint = point; + + self.relativepoint = relativepoint; + relativex = "center"; + relativey = "middle"; + + switch ( relativepoint ) + { + case "CENTER": + break; + case "TOP": + relativey = "top"; + break; + case "BOTTOM": + relativey = "bottom"; + break; + case "LEFT": + relativex = "left"; + break; + case "RIGHT": + relativex = "right"; + break; + case "TOP_RIGHT": + case "TOPRIGHT": + relativey = "top"; + relativex = "right"; + break; + case "TOP_LEFT": + case "TOPLEFT": + relativey = "top"; + relativex = "left"; + break; + case "TOPCENTER": + relativey = "top"; + relativex = "center"; + break; + case "BOTTOM_RIGHT": + case "BOTTOM RIGHT": + relativey = "bottom"; + relativex = "right"; + break; + case "BOTTOM_LEFT": + case "BOTTOM LEFT": + relativey = "bottom"; + relativex = "left"; + break; + default: /# - println( "^3Warning: unknown relativePoint passed to setPoint(): " + relativepoint ); + println( "^3Warning: unknown relativePoint passed to setPoint(): " + relativepoint ); #/ - */ - break; - } - if ( element == level.uiparent ) - { - self.horzalign = relativex; - self.vertalign = relativey; - } - else - { - self.horzalign = element.horzalign; - self.vertalign = element.vertalign; - } - if ( relativex == element.alignx ) - { - offsetx = 0; - xfactor = 0; - } - else if ( relativex == "center" || element.alignx == "center" ) - { - offsetx = int( element.width / 2 ); - if ( relativex == "left" || element.alignx == "right" ) - { - xfactor = -1; - } - else - { - xfactor = 1; - } - } - else - { - offsetx = element.width; - if ( relativex == "left" ) - { - xfactor = -1; - } - else - { - xfactor = 1; - } - } - self.x = element.x + ( offsetx * xfactor ); - if ( relativey == element.aligny ) - { - offsety = 0; - yfactor = 0; - } - else if ( relativey == "middle" || element.aligny == "middle" ) - { - offsety = int( element.height / 2 ); - if ( relativey == "top" || element.aligny == "bottom" ) - { - yfactor = -1; - } - else - { - yfactor = 1; - } - } - else - { - offsety = element.height; - if ( relativey == "top" ) - { - yfactor = -1; - } - else - { - yfactor = 1; - } - } - self.y = element.y + ( offsety * yfactor ); - self.x += self.xoffset; - self.y += self.yoffset; - switch( self.elemtype ) - { - case "bar": - setpointbar( point, relativepoint, xoffset, yoffset ); - self.barframe setparent( self getparent() ); - self.barframe setpoint( point, relativepoint, xoffset, yoffset ); - break; - } - self updatechildren(); + break; + } + + if ( element == level.uiparent ) + { + self.horzalign = relativex; + self.vertalign = relativey; + } + else + { + self.horzalign = element.horzalign; + self.vertalign = element.vertalign; + } + + if ( relativex == element.alignx ) + { + offsetx = 0; + xfactor = 0; + } + else if ( relativex == "center" || element.alignx == "center" ) + { + offsetx = int( element.width / 2 ); + + if ( relativex == "left" || element.alignx == "right" ) + xfactor = -1; + else + xfactor = 1; + } + else + { + offsetx = element.width; + + if ( relativex == "left" ) + xfactor = -1; + else + xfactor = 1; + } + + self.x = element.x + offsetx * xfactor; + + if ( relativey == element.aligny ) + { + offsety = 0; + yfactor = 0; + } + else if ( relativey == "middle" || element.aligny == "middle" ) + { + offsety = int( element.height / 2 ); + + if ( relativey == "top" || element.aligny == "bottom" ) + yfactor = -1; + else + yfactor = 1; + } + else + { + offsety = element.height; + + if ( relativey == "top" ) + yfactor = -1; + else + yfactor = 1; + } + + self.y = element.y + offsety * yfactor; + self.x += self.xoffset; + self.y += self.yoffset; + + switch ( self.elemtype ) + { + case "bar": + setpointbar( point, relativepoint, xoffset, yoffset ); + self.barframe setparent( self getparent() ); + self.barframe setpoint( point, relativepoint, xoffset, yoffset ); + break; + } + + self updatechildren(); } -setpointbar( point, relativepoint, xoffset, yoffset ) //checked changed to match cerberus output +setpointbar( point, relativepoint, xoffset, yoffset ) { - self.bar.horzalign = self.horzalign; - self.bar.vertalign = self.vertalign; - self.bar.alignx = "left"; - self.bar.aligny = self.aligny; - self.bar.y = self.y; - if ( self.alignx == "left" ) - { - self.bar.x = self.x; - } - else if ( self.alignx == "right" ) - { - self.bar.x = self.x - self.width; - } - else - { - self.bar.x = self.x - int( self.width / 2 ); - } - if ( self.aligny == "top" ) - { - self.bar.y = self.y; - } - else if ( self.aligny == "bottom" ) - { - self.bar.y = self.y; - } - self updatebar( self.bar.frac ); + self.bar.horzalign = self.horzalign; + self.bar.vertalign = self.vertalign; + self.bar.alignx = "left"; + self.bar.aligny = self.aligny; + self.bar.y = self.y; + + if ( self.alignx == "left" ) + self.bar.x = self.x; + else if ( self.alignx == "right" ) + self.bar.x = self.x - self.width; + else + self.bar.x = self.x - int( self.width / 2 ); + + if ( self.aligny == "top" ) + self.bar.y = self.y; + else if ( self.aligny == "bottom" ) + self.bar.y = self.y; + + self updatebar( self.bar.frac ); } -updatebar( barfrac, rateofchange ) //checked matches cerberus output +updatebar( barfrac, rateofchange ) { - if ( self.elemtype == "bar" ) - { - updatebarscale( barfrac, rateofchange ); - } + if ( self.elemtype == "bar" ) + updatebarscale( barfrac, rateofchange ); } -updatebarscale( barfrac, rateofchange ) //checked changed to match cerberus output +updatebarscale( barfrac, rateofchange ) { - barwidth = int( ( self.width * barfrac ) + 0.5 ); - if ( !barwidth ) - { - barwidth = 1; - } - self.bar.frac = barfrac; - self.bar setshader( self.bar.shader, barwidth, self.height ); - /* + barwidth = int( self.width * barfrac + 0.5 ); + + if ( !barwidth ) + barwidth = 1; + + self.bar.frac = barfrac; + self.bar setshader( self.bar.shader, barwidth, self.height ); /# - assert( barwidth <= self.width, "barWidth <= self.width: " + barwidth + " <= " + self.width + " - barFrac was " + barfrac ); + assert( barwidth <= self.width, "barWidth <= self.width: " + barwidth + " <= " + self.width + " - barFrac was " + barfrac ); #/ - */ - if ( isDefined( rateofchange ) && barwidth < self.width ) - { - if ( rateofchange > 0 ) - { - /* + + if ( isdefined( rateofchange ) && barwidth < self.width ) + { + if ( rateofchange > 0 ) + { /# - assert( ( ( 1 - barfrac ) / rateofchange ) > 0, "barFrac: " + barfrac + "rateOfChange: " + rateofchange ); + assert( ( 1 - barfrac ) / rateofchange > 0, "barFrac: " + barfrac + "rateOfChange: " + rateofchange ); #/ - */ - self.bar scaleovertime( ( 1 - barfrac ) / rateofchange, self.width, self.height ); - } - else if ( rateofchange < 0 ) - { - /* + self.bar scaleovertime( ( 1 - barfrac ) / rateofchange, self.width, self.height ); + } + else if ( rateofchange < 0 ) + { /# - assert( ( barfrac / ( -1 * rateofchange ) ) > 0, "barFrac: " + barfrac + "rateOfChange: " + rateofchange ); + assert( barfrac / -1 * rateofchange > 0, "barFrac: " + barfrac + "rateOfChange: " + rateofchange ); #/ - */ - self.bar scaleovertime( barfrac / ( -1 * rateofchange ), 1, self.height ); - } - } - self.bar.rateofchange = rateofchange; - self.bar.lastupdatetime = getTime(); + self.bar scaleovertime( barfrac / -1 * rateofchange, 1, self.height ); + } + } + + self.bar.rateofchange = rateofchange; + self.bar.lastupdatetime = gettime(); } -createfontstring( font, fontscale ) //checked matches cerberus output +createfontstring( font, fontscale ) { - fontelem = newclienthudelem( self ); - fontelem.elemtype = "font"; - fontelem.font = font; - fontelem.fontscale = fontscale; - fontelem.x = 0; - fontelem.y = 0; - fontelem.width = 0; - fontelem.height = int( level.fontheight * fontscale ); - fontelem.xoffset = 0; - fontelem.yoffset = 0; - fontelem.children = []; - fontelem setparent( level.uiparent ); - fontelem.hidden = 0; - return fontelem; + fontelem = newclienthudelem( self ); + fontelem.elemtype = "font"; + fontelem.font = font; + fontelem.fontscale = fontscale; + fontelem.x = 0; + fontelem.y = 0; + fontelem.width = 0; + fontelem.height = int( level.fontheight * fontscale ); + fontelem.xoffset = 0; + fontelem.yoffset = 0; + fontelem.children = []; + fontelem setparent( level.uiparent ); + fontelem.hidden = 0; + return fontelem; } -createserverfontstring( font, fontscale, team ) //checked matches cerberus output +createserverfontstring( font, fontscale, team ) { - if ( isDefined( team ) ) - { - fontelem = newteamhudelem( team ); - } - else - { - fontelem = newhudelem(); - } - fontelem.elemtype = "font"; - fontelem.font = font; - fontelem.fontscale = fontscale; - fontelem.x = 0; - fontelem.y = 0; - fontelem.width = 0; - fontelem.height = int( level.fontheight * fontscale ); - fontelem.xoffset = 0; - fontelem.yoffset = 0; - fontelem.children = []; - fontelem setparent( level.uiparent ); - fontelem.hidden = 0; - return fontelem; + if ( isdefined( team ) ) + fontelem = newteamhudelem( team ); + else + fontelem = newhudelem(); + + fontelem.elemtype = "font"; + fontelem.font = font; + fontelem.fontscale = fontscale; + fontelem.x = 0; + fontelem.y = 0; + fontelem.width = 0; + fontelem.height = int( level.fontheight * fontscale ); + fontelem.xoffset = 0; + fontelem.yoffset = 0; + fontelem.children = []; + fontelem setparent( level.uiparent ); + fontelem.hidden = 0; + return fontelem; } -createservertimer( font, fontscale, team ) //checked matches cerberus output +createservertimer( font, fontscale, team ) { - if ( isDefined( team ) ) - { - timerelem = newteamhudelem( team ); - } - else - { - timerelem = newhudelem(); - } - timerelem.elemtype = "timer"; - timerelem.font = font; - timerelem.fontscale = fontscale; - timerelem.x = 0; - timerelem.y = 0; - timerelem.width = 0; - timerelem.height = int( level.fontheight * fontscale ); - timerelem.xoffset = 0; - timerelem.yoffset = 0; - timerelem.children = []; - timerelem setparent( level.uiparent ); - timerelem.hidden = 0; - return timerelem; + if ( isdefined( team ) ) + timerelem = newteamhudelem( team ); + else + timerelem = newhudelem(); + + timerelem.elemtype = "timer"; + timerelem.font = font; + timerelem.fontscale = fontscale; + timerelem.x = 0; + timerelem.y = 0; + timerelem.width = 0; + timerelem.height = int( level.fontheight * fontscale ); + timerelem.xoffset = 0; + timerelem.yoffset = 0; + timerelem.children = []; + timerelem setparent( level.uiparent ); + timerelem.hidden = 0; + return timerelem; } -createclienttimer( font, fontscale ) //checked matches cerberus output +createclienttimer( font, fontscale ) { - timerelem = newclienthudelem( self ); - timerelem.elemtype = "timer"; - timerelem.font = font; - timerelem.fontscale = fontscale; - timerelem.x = 0; - timerelem.y = 0; - timerelem.width = 0; - timerelem.height = int( level.fontheight * fontscale ); - timerelem.xoffset = 0; - timerelem.yoffset = 0; - timerelem.children = []; - timerelem setparent( level.uiparent ); - timerelem.hidden = 0; - return timerelem; + timerelem = newclienthudelem( self ); + timerelem.elemtype = "timer"; + timerelem.font = font; + timerelem.fontscale = fontscale; + timerelem.x = 0; + timerelem.y = 0; + timerelem.width = 0; + timerelem.height = int( level.fontheight * fontscale ); + timerelem.xoffset = 0; + timerelem.yoffset = 0; + timerelem.children = []; + timerelem setparent( level.uiparent ); + timerelem.hidden = 0; + return timerelem; } -createicon( shader, width, height ) //checked matches cerberus output +createicon( shader, width, height ) { - iconelem = newclienthudelem( self ); - iconelem.elemtype = "icon"; - iconelem.x = 0; - iconelem.y = 0; - iconelem.width = width; - iconelem.height = height; - iconelem.xoffset = 0; - iconelem.yoffset = 0; - iconelem.children = []; - iconelem setparent( level.uiparent ); - iconelem.hidden = 0; - if ( isDefined( shader ) ) - { - iconelem setshader( shader, width, height ); - } - return iconelem; + iconelem = newclienthudelem( self ); + iconelem.elemtype = "icon"; + iconelem.x = 0; + iconelem.y = 0; + iconelem.width = width; + iconelem.height = height; + iconelem.xoffset = 0; + iconelem.yoffset = 0; + iconelem.children = []; + iconelem setparent( level.uiparent ); + iconelem.hidden = 0; + + if ( isdefined( shader ) ) + iconelem setshader( shader, width, height ); + + return iconelem; } -createservericon( shader, width, height, team ) //checked matches cerberus output +createservericon( shader, width, height, team ) { - if ( isDefined( team ) ) - { - iconelem = newteamhudelem( team ); - } - else - { - iconelem = newhudelem(); - } - iconelem.elemtype = "icon"; - iconelem.x = 0; - iconelem.y = 0; - iconelem.width = width; - iconelem.height = height; - iconelem.xoffset = 0; - iconelem.yoffset = 0; - iconelem.children = []; - iconelem setparent( level.uiparent ); - iconelem.hidden = 0; - if ( isDefined( shader ) ) - { - iconelem setshader( shader, width, height ); - } - return iconelem; + if ( isdefined( team ) ) + iconelem = newteamhudelem( team ); + else + iconelem = newhudelem(); + + iconelem.elemtype = "icon"; + iconelem.x = 0; + iconelem.y = 0; + iconelem.width = width; + iconelem.height = height; + iconelem.xoffset = 0; + iconelem.yoffset = 0; + iconelem.children = []; + iconelem setparent( level.uiparent ); + iconelem.hidden = 0; + + if ( isdefined( shader ) ) + iconelem setshader( shader, width, height ); + + return iconelem; } -createserverbar( color, width, height, flashfrac, team, selected ) //checked changed to match cerberus output +createserverbar( color, width, height, flashfrac, team, selected ) { - if ( isDefined( team ) ) - { - barelem = newteamhudelem( team ); - } - else - { - barelem = newhudelem(); - } - barelem.x = 0; - barelem.y = 0; - barelem.frac = 0; - barelem.color = color; - barelem.sort = -2; - barelem.shader = "progress_bar_fill"; - barelem setshader( "progress_bar_fill", width, height ); - barelem.hidden = 0; - if ( isDefined( flashfrac ) ) - { - barelem.flashfrac = flashfrac; - } - if ( isDefined( team ) ) - { - barelemframe = newteamhudelem( team ); - } - else - { - barelemframe = newhudelem(); - } - barelemframe.elemtype = "icon"; - barelemframe.x = 0; - barelemframe.y = 0; - barelemframe.width = width; - barelemframe.height = height; - barelemframe.xoffset = 0; - barelemframe.yoffset = 0; - barelemframe.bar = barelem; - barelemframe.barframe = barelemframe; - barelemframe.children = []; - barelemframe.sort = -1; - barelemframe.color = ( 1, 1, 1 ); - barelemframe setparent( level.uiparent ); - if ( isDefined( selected ) ) - { - barelemframe setshader( "progress_bar_fg_sel", width, height ); - } - else - { - barelemframe setshader( "progress_bar_fg", width, height ); - } - barelemframe.hidden = 0; - if ( isDefined( team ) ) - { - barelembg = newteamhudelem( team ); - } - else - { - barelembg = newhudelem(); - } - barelembg.elemtype = "bar"; - barelembg.x = 0; - barelembg.y = 0; - barelembg.width = width; - barelembg.height = height; - barelembg.xoffset = 0; - barelembg.yoffset = 0; - barelembg.bar = barelem; - barelembg.barframe = barelemframe; - barelembg.children = []; - barelembg.sort = -3; - barelembg.color = ( 0, 0, 0 ); - barelembg.alpha = 0.5; - barelembg setparent( level.uiparent ); - barelembg setshader( "progress_bar_bg", width, height ); - barelembg.hidden = 0; - return barelembg; + if ( isdefined( team ) ) + barelem = newteamhudelem( team ); + else + barelem = newhudelem(); + + barelem.x = 0; + barelem.y = 0; + barelem.frac = 0; + barelem.color = color; + barelem.sort = -2; + barelem.shader = "progress_bar_fill"; + barelem setshader( "progress_bar_fill", width, height ); + barelem.hidden = 0; + + if ( isdefined( flashfrac ) ) + barelem.flashfrac = flashfrac; + + if ( isdefined( team ) ) + barelemframe = newteamhudelem( team ); + else + barelemframe = newhudelem(); + + barelemframe.elemtype = "icon"; + barelemframe.x = 0; + barelemframe.y = 0; + barelemframe.width = width; + barelemframe.height = height; + barelemframe.xoffset = 0; + barelemframe.yoffset = 0; + barelemframe.bar = barelem; + barelemframe.barframe = barelemframe; + barelemframe.children = []; + barelemframe.sort = -1; + barelemframe.color = ( 1, 1, 1 ); + barelemframe setparent( level.uiparent ); + + if ( isdefined( selected ) ) + barelemframe setshader( "progress_bar_fg_sel", width, height ); + else + barelemframe setshader( "progress_bar_fg", width, height ); + + barelemframe.hidden = 0; + + if ( isdefined( team ) ) + barelembg = newteamhudelem( team ); + else + barelembg = newhudelem(); + + barelembg.elemtype = "bar"; + barelembg.x = 0; + barelembg.y = 0; + barelembg.width = width; + barelembg.height = height; + barelembg.xoffset = 0; + barelembg.yoffset = 0; + barelembg.bar = barelem; + barelembg.barframe = barelemframe; + barelembg.children = []; + barelembg.sort = -3; + barelembg.color = ( 0, 0, 0 ); + barelembg.alpha = 0.5; + barelembg setparent( level.uiparent ); + barelembg setshader( "progress_bar_bg", width, height ); + barelembg.hidden = 0; + return barelembg; } -createbar( color, width, height, flashfrac ) //checked changed to match cerberus output +createbar( color, width, height, flashfrac ) { - barelem = newclienthudelem( self ); - barelem.x = 0; - barelem.y = 0; - barelem.frac = 0; - barelem.color = color; - barelem.sort = -2; - barelem.shader = "progress_bar_fill"; - barelem setshader( "progress_bar_fill", width, height ); - barelem.hidden = 0; - if ( isDefined( flashfrac ) ) - { - barelem.flashfrac = flashfrac; - } - barelemframe = newclienthudelem( self ); - barelemframe.elemtype = "icon"; - barelemframe.x = 0; - barelemframe.y = 0; - barelemframe.width = width; - barelemframe.height = height; - barelemframe.xoffset = 0; - barelemframe.yoffset = 0; - barelemframe.bar = barelem; - barelemframe.barframe = barelemframe; - barelemframe.children = []; - barelemframe.sort = -1; - barelemframe.color = ( 1, 1, 1 ); - barelemframe setparent( level.uiparent ); - barelemframe.hidden = 0; - barelembg = newclienthudelem( self ); - barelembg.elemtype = "bar"; - if ( !level.splitscreen ) - { - barelembg.x = -2; - barelembg.y = -2; - } - barelembg.width = width; - barelembg.height = height; - barelembg.xoffset = 0; - barelembg.yoffset = 0; - barelembg.bar = barelem; - barelembg.barframe = barelemframe; - barelembg.children = []; - barelembg.sort = -3; - barelembg.color = ( 0, 0, 0 ); - barelembg.alpha = 0.5; - barelembg setparent( level.uiparent ); - if ( !level.splitscreen ) - { - barelembg setshader( "progress_bar_bg", width + 4, height + 4 ); - } - else - { - barelembg setshader( "progress_bar_bg", width + 0, height + 0 ); - } - barelembg.hidden = 0; - return barelembg; + barelem = newclienthudelem( self ); + barelem.x = 0; + barelem.y = 0; + barelem.frac = 0; + barelem.color = color; + barelem.sort = -2; + barelem.shader = "progress_bar_fill"; + barelem setshader( "progress_bar_fill", width, height ); + barelem.hidden = 0; + + if ( isdefined( flashfrac ) ) + barelem.flashfrac = flashfrac; + + barelemframe = newclienthudelem( self ); + barelemframe.elemtype = "icon"; + barelemframe.x = 0; + barelemframe.y = 0; + barelemframe.width = width; + barelemframe.height = height; + barelemframe.xoffset = 0; + barelemframe.yoffset = 0; + barelemframe.bar = barelem; + barelemframe.barframe = barelemframe; + barelemframe.children = []; + barelemframe.sort = -1; + barelemframe.color = ( 1, 1, 1 ); + barelemframe setparent( level.uiparent ); + barelemframe.hidden = 0; + barelembg = newclienthudelem( self ); + barelembg.elemtype = "bar"; + + if ( !level.splitscreen ) + { + barelembg.x = -2; + barelembg.y = -2; + } + + barelembg.width = width; + barelembg.height = height; + barelembg.xoffset = 0; + barelembg.yoffset = 0; + barelembg.bar = barelem; + barelembg.barframe = barelemframe; + barelembg.children = []; + barelembg.sort = -3; + barelembg.color = ( 0, 0, 0 ); + barelembg.alpha = 0.5; + barelembg setparent( level.uiparent ); + + if ( !level.splitscreen ) + barelembg setshader( "progress_bar_bg", width + 4, height + 4 ); + else + barelembg setshader( "progress_bar_bg", width + 0, height + 0 ); + + barelembg.hidden = 0; + return barelembg; } -getcurrentfraction() //checked matches cerberus output +getcurrentfraction() { - frac = self.bar.frac; - if ( isDefined( self.bar.rateofchange ) ) - { - frac += ( getTime() - self.bar.lastupdatetime ) * self.bar.rateofchange; - if ( frac > 1 ) - { - frac = 1; - } - if ( frac < 0 ) - { - frac = 0; - } - } - return frac; + frac = self.bar.frac; + + if ( isdefined( self.bar.rateofchange ) ) + { + frac += ( gettime() - self.bar.lastupdatetime ) * self.bar.rateofchange; + + if ( frac > 1 ) + frac = 1; + + if ( frac < 0 ) + frac = 0; + } + + return frac; } -createprimaryprogressbar() //checked changed to match cerberus output +createprimaryprogressbar() { - bar = createbar( ( 1, 1, 1 ), level.primaryprogressbarwidth, level.primaryprogressbarheight ); - if ( level.splitscreen ) - { - bar setpoint( "TOP", undefined, level.primaryprogressbarx, level.primaryprogressbary ); - } - else - { - bar setpoint( "CENTER", undefined, level.primaryprogressbarx, level.primaryprogressbary ); - } - return bar; + bar = createbar( ( 1, 1, 1 ), level.primaryprogressbarwidth, level.primaryprogressbarheight ); + + if ( level.splitscreen ) + bar setpoint( "TOP", undefined, level.primaryprogressbarx, level.primaryprogressbary ); + else + bar setpoint( "CENTER", undefined, level.primaryprogressbarx, level.primaryprogressbary ); + + return bar; } -createprimaryprogressbartext() //checked matches cerberus output +createprimaryprogressbartext() { - text = createfontstring( "objective", level.primaryprogressbarfontsize ); - if ( level.splitscreen ) - { - text setpoint( "TOP", undefined, level.primaryprogressbartextx, level.primaryprogressbartexty ); - } - else - { - text setpoint( "CENTER", undefined, level.primaryprogressbartextx, level.primaryprogressbartexty ); - } - text.sort = -1; - return text; + text = createfontstring( "objective", level.primaryprogressbarfontsize ); + + if ( level.splitscreen ) + text setpoint( "TOP", undefined, level.primaryprogressbartextx, level.primaryprogressbartexty ); + else + text setpoint( "CENTER", undefined, level.primaryprogressbartextx, level.primaryprogressbartexty ); + + text.sort = -1; + return text; } -createsecondaryprogressbar() //checked changed to match cerberus output +createsecondaryprogressbar() { - secondaryprogressbarheight = getdvarintdefault( "scr_secondaryProgressBarHeight", level.secondaryprogressbarheight ); - secondaryprogressbarx = getdvarintdefault( "scr_secondaryProgressBarX", level.secondaryprogressbarx ); - secondaryprogressbary = getdvarintdefault( "scr_secondaryProgressBarY", level.secondaryprogressbary ); - bar = createbar( ( 1, 1, 1 ), level.secondaryprogressbarwidth, secondaryprogressbarheight ); - if ( level.splitscreen ) - { - bar setpoint( "TOP", undefined, secondaryprogressbarx, secondaryprogressbary ); - } - else - { - bar setpoint( "CENTER", undefined, secondaryprogressbarx, secondaryprogressbary ); - } - return bar; + secondaryprogressbarheight = getdvarintdefault( "scr_secondaryProgressBarHeight", level.secondaryprogressbarheight ); + secondaryprogressbarx = getdvarintdefault( "scr_secondaryProgressBarX", level.secondaryprogressbarx ); + secondaryprogressbary = getdvarintdefault( "scr_secondaryProgressBarY", level.secondaryprogressbary ); + bar = createbar( ( 1, 1, 1 ), level.secondaryprogressbarwidth, secondaryprogressbarheight ); + + if ( level.splitscreen ) + bar setpoint( "TOP", undefined, secondaryprogressbarx, secondaryprogressbary ); + else + bar setpoint( "CENTER", undefined, secondaryprogressbarx, secondaryprogressbary ); + + return bar; } -createsecondaryprogressbartext() //checked matches cerberus output +createsecondaryprogressbartext() { - secondaryprogressbartextx = getdvarintdefault( "scr_btx", level.secondaryprogressbartextx ); - secondaryprogressbartexty = getdvarintdefault( "scr_bty", level.secondaryprogressbartexty ); - text = createfontstring( "objective", level.primaryprogressbarfontsize ); - if ( level.splitscreen ) - { - text setpoint( "TOP", undefined, secondaryprogressbartextx, secondaryprogressbartexty ); - } - else - { - text setpoint( "CENTER", undefined, secondaryprogressbartextx, secondaryprogressbartexty ); - } - text.sort = -1; - return text; + secondaryprogressbartextx = getdvarintdefault( "scr_btx", level.secondaryprogressbartextx ); + secondaryprogressbartexty = getdvarintdefault( "scr_bty", level.secondaryprogressbartexty ); + text = createfontstring( "objective", level.primaryprogressbarfontsize ); + + if ( level.splitscreen ) + text setpoint( "TOP", undefined, secondaryprogressbartextx, secondaryprogressbartexty ); + else + text setpoint( "CENTER", undefined, secondaryprogressbartextx, secondaryprogressbartexty ); + + text.sort = -1; + return text; } -createteamprogressbar( team ) //checked matches cerberus output +createteamprogressbar( team ) { - bar = createserverbar( ( 1, 0, 0 ), level.teamprogressbarwidth, level.teamprogressbarheight, undefined, team ); - bar setpoint( "TOP", undefined, 0, level.teamprogressbary ); - return bar; + bar = createserverbar( ( 1, 0, 0 ), level.teamprogressbarwidth, level.teamprogressbarheight, undefined, team ); + bar setpoint( "TOP", undefined, 0, level.teamprogressbary ); + return bar; } -createteamprogressbartext( team ) //checked matches cerberus output +createteamprogressbartext( team ) { - text = createserverfontstring( "default", level.teamprogressbarfontsize, team ); - text setpoint( "TOP", undefined, 0, level.teamprogressbartexty ); - return text; + text = createserverfontstring( "default", level.teamprogressbarfontsize, team ); + text setpoint( "TOP", undefined, 0, level.teamprogressbartexty ); + return text; } -setflashfrac( flashfrac ) //checked matches cerberus output +setflashfrac( flashfrac ) { - self.bar.flashfrac = flashfrac; + self.bar.flashfrac = flashfrac; } -hideelem() //checked matches cerberus output +hideelem() { - if ( self.hidden ) - { - return; - } - self.hidden = 1; - if ( self.alpha != 0 ) - { - self.alpha = 0; - } - if ( self.elemtype == "bar" || self.elemtype == "bar_shader" ) - { - self.bar.hidden = 1; - if ( self.bar.alpha != 0 ) - { - self.bar.alpha = 0; - } - self.barframe.hidden = 1; - if ( self.barframe.alpha != 0 ) - { - self.barframe.alpha = 0; - } - } + if ( self.hidden ) + return; + + self.hidden = 1; + + if ( self.alpha != 0 ) + self.alpha = 0; + + if ( self.elemtype == "bar" || self.elemtype == "bar_shader" ) + { + self.bar.hidden = 1; + + if ( self.bar.alpha != 0 ) + self.bar.alpha = 0; + + self.barframe.hidden = 1; + + if ( self.barframe.alpha != 0 ) + self.barframe.alpha = 0; + } } -showelem() //checked changed to match cerberus output +showelem() { - if ( !self.hidden ) - { - return; - } - self.hidden = 0; - if ( self.elemtype == "bar" || self.elemtype == "bar_shader" ) - { - if ( self.alpha != 0.5 ) - { - self.alpha = 0.5; - } - self.bar.hidden = 0; - if ( self.bar.alpha != 1 ) - { - self.bar.alpha = 1; - } - self.barframe.hidden = 0; - if ( self.barframe.alpha != 1 ) - { - self.barframe.alpha = 1; - } - } - else if ( self.alpha != 1 ) - { - self.alpha = 1; - } + if ( !self.hidden ) + return; + + self.hidden = 0; + + if ( self.elemtype == "bar" || self.elemtype == "bar_shader" ) + { + if ( self.alpha != 0.5 ) + self.alpha = 0.5; + + self.bar.hidden = 0; + + if ( self.bar.alpha != 1 ) + self.bar.alpha = 1; + + self.barframe.hidden = 0; + + if ( self.barframe.alpha != 1 ) + self.barframe.alpha = 1; + } + else if ( self.alpha != 1 ) + self.alpha = 1; } -flashthread() //checked changed to match beta dump +flashthread() { - self endon( "death" ); - if ( !self.hidden ) - { - self.alpha = 1; - } - while ( 1 ) - { - if ( self.frac >= self.flashfrac ) - { - if ( !self.hidden ) - { - self fadeovertime( 0.3 ); - self.alpha = 0.2; - wait 0.35; - self fadeovertime( 0.3 ); - self.alpha = 1; - } - wait 0.7; - } - else - { - if ( !self.hidden && self.alpha != 1 ) - { - self.alpha = 1; - } - wait 0.05; - } - } + self endon( "death" ); + + if ( !self.hidden ) + self.alpha = 1; + + while ( true ) + { + if ( self.frac >= self.flashfrac ) + { + if ( !self.hidden ) + { + self fadeovertime( 0.3 ); + self.alpha = 0.2; + wait 0.35; + self fadeovertime( 0.3 ); + self.alpha = 1; + } + + wait 0.7; + } + else + { + if ( !self.hidden && self.alpha != 1 ) + self.alpha = 1; + + wait 0.05; + } + } } -destroyelem() //checked changed to match cerberus output +destroyelem() { - tempchildren = []; - for ( index = 0; index < self.children.size; index++ ) - { - if ( isDefined( self.children[ index ] ) ) - { - tempchildren[ tempchildren.size ] = self.children[ index ]; - } - } - for ( index = 0; index < tempchildren.size; index++ ) - { - tempchildren[ index ] setparent( self getparent() ); - } - if ( self.elemtype == "bar" || self.elemtype == "bar_shader" ) - { - self.bar destroy(); - self.barframe destroy(); - } - self destroy(); + tempchildren = []; + + for ( index = 0; index < self.children.size; index++ ) + { + if ( isdefined( self.children[index] ) ) + tempchildren[tempchildren.size] = self.children[index]; + } + + for ( index = 0; index < tempchildren.size; index++ ) + tempchildren[index] setparent( self getparent() ); + + if ( self.elemtype == "bar" || self.elemtype == "bar_shader" ) + { + self.bar destroy(); + self.barframe destroy(); + } + + self destroy(); } -seticonshader( shader ) //checked matches cerberus output +seticonshader( shader ) { - self setshader( shader, self.width, self.height ); + self setshader( shader, self.width, self.height ); } -setwidth( width ) //checked matches cerberus output +setwidth( width ) { - self.width = width; + self.width = width; } -setheight( height ) //checked matches cerberus output +setheight( height ) { - self.height = height; + self.height = height; } -setsize( width, height ) //checked matches cerberus output +setsize( width, height ) { - self.width = width; - self.height = height; + self.width = width; + self.height = height; } -updatechildren() //checked changed to match cerberus output +updatechildren() { - for ( index = 0; index < self.children.size; index++ ) - { - child = self.children[ index ]; - child setpoint( child.point, child.relativepoint, child.xoffset, child.yoffset ); - } + for ( index = 0; index < self.children.size; index++ ) + { + child = self.children[index]; + child setpoint( child.point, child.relativepoint, child.xoffset, child.yoffset ); + } } -createloadouticon( player, verindex, horindex, xpos, ypos ) //checked matches cerberus output +createloadouticon( player, verindex, horindex, xpos, ypos ) { - iconsize = 32; - if ( player issplitscreen() ) - { - iconsize = 22; - } - ypos -= 90 + ( iconsize * ( 3 - verindex ) ); - xpos -= 10 + ( iconsize * horindex ); - icon = createicon( "white", iconsize, iconsize ); - icon setpoint( "BOTTOM RIGHT", "BOTTOM RIGHT", xpos, ypos ); - icon.horzalign = "user_right"; - icon.vertalign = "user_bottom"; - icon.archived = 0; - icon.foreground = 0; - return icon; + iconsize = 32; + + if ( player issplitscreen() ) + iconsize = 22; + + ypos -= 90 + iconsize * ( 3 - verindex ); + xpos -= 10 + iconsize * horindex; + icon = createicon( "white", iconsize, iconsize ); + icon setpoint( "BOTTOM RIGHT", "BOTTOM RIGHT", xpos, ypos ); + icon.horzalign = "user_right"; + icon.vertalign = "user_bottom"; + icon.archived = 0; + icon.foreground = 0; + return icon; } -setloadouticoncoords( player, verindex, horindex, xpos, ypos ) //checked matches cerberus output +setloadouticoncoords( player, verindex, horindex, xpos, ypos ) { - iconsize = 32; - if ( player issplitscreen() ) - { - iconsize = 22; - } - ypos -= 90 + ( iconsize * ( 3 - verindex ) ); - xpos -= 10 + ( iconsize * horindex ); - self setpoint( "BOTTOM RIGHT", "BOTTOM RIGHT", xpos, ypos ); - self.horzalign = "user_right"; - self.vertalign = "user_bottom"; - self.archived = 0; - self.foreground = 0; - self.alpha = 1; + iconsize = 32; + + if ( player issplitscreen() ) + iconsize = 22; + + ypos -= 90 + iconsize * ( 3 - verindex ); + xpos -= 10 + iconsize * horindex; + self setpoint( "BOTTOM RIGHT", "BOTTOM RIGHT", xpos, ypos ); + self.horzalign = "user_right"; + self.vertalign = "user_bottom"; + self.archived = 0; + self.foreground = 0; + self.alpha = 1; } -setloadouttextcoords( xcoord ) //checked matches cerberus output +setloadouttextcoords( xcoord ) { - self setpoint( "RIGHT", "LEFT", xcoord, 0 ); + self setpoint( "RIGHT", "LEFT", xcoord, 0 ); } -createloadouttext( icon, xcoord ) //checked matches cerberus output +createloadouttext( icon, xcoord ) { - text = createfontstring( "small", 1 ); - text setparent( icon ); - text setpoint( "RIGHT", "LEFT", xcoord, 0 ); - text.archived = 0; - text.alignx = "right"; - text.aligny = "middle"; - text.foreground = 0; - return text; + text = createfontstring( "small", 1 ); + text setparent( icon ); + text setpoint( "RIGHT", "LEFT", xcoord, 0 ); + text.archived = 0; + text.alignx = "right"; + text.aligny = "middle"; + text.foreground = 0; + return text; } -showloadoutattribute( iconelem, icon, alpha, textelem, text ) //checked matches cerberus output +showloadoutattribute( iconelem, icon, alpha, textelem, text ) { - iconsize = 32; - iconelem.alpha = alpha; - if ( alpha ) - { - iconelem setshader( icon, iconsize, iconsize ); - } - if ( isDefined( textelem ) ) - { - textelem.alpha = alpha; - if ( alpha ) - { - textelem settext( text ); - } - } + iconsize = 32; + iconelem.alpha = alpha; + + if ( alpha ) + iconelem setshader( icon, iconsize, iconsize ); + + if ( isdefined( textelem ) ) + { + textelem.alpha = alpha; + + if ( alpha ) + textelem settext( text ); + } } -hideloadoutattribute( iconelem, fadetime, textelem, hidetextonly ) //checked matches cerberus output +hideloadoutattribute( iconelem, fadetime, textelem, hidetextonly ) { - if ( isDefined( fadetime ) ) - { - if ( !isDefined( hidetextonly ) || !hidetextonly ) - { - iconelem fadeovertime( fadetime ); - } - if ( isDefined( textelem ) ) - { - textelem fadeovertime( fadetime ); - } - } - if ( !isDefined( hidetextonly ) || !hidetextonly ) - { - iconelem.alpha = 0; - } - if ( isDefined( textelem ) ) - { - textelem.alpha = 0; - } + if ( isdefined( fadetime ) ) + { + if ( !isdefined( hidetextonly ) || !hidetextonly ) + iconelem fadeovertime( fadetime ); + + if ( isdefined( textelem ) ) + textelem fadeovertime( fadetime ); + } + + if ( !isdefined( hidetextonly ) || !hidetextonly ) + iconelem.alpha = 0; + + if ( isdefined( textelem ) ) + textelem.alpha = 0; } -showperks() //checked matches cerberus output +showperks() { - ypos = 40; - if ( self issplitscreen() ) - { - ypos = 5; - } - if ( !isDefined( self.perkhudelem ) ) - { - self.perkhudelem = createloadouticon( self, 0, 0, 200, ypos ); - } - else - { - self.perkhudelem setloadouticoncoords( self, 0, 0, 200, ypos ); - } - self.perkhudelem setperks( self ); - self.perkhudelem.x = -20; - self.perkhudelem.alpha = 0; - self.perkhudelem fadeovertime( 0.4 ); - self.perkhudelem.alpha = 1; - self.perkhudelem.hidewheninmenu = 1; + ypos = 40; + + if ( self issplitscreen() ) + ypos = 5; + + if ( !isdefined( self.perkhudelem ) ) + self.perkhudelem = createloadouticon( self, 0, 0, 200, ypos ); + else + self.perkhudelem setloadouticoncoords( self, 0, 0, 200, ypos ); + + self.perkhudelem setperks( self ); + self.perkhudelem.x = -20; + self.perkhudelem.alpha = 0; + self.perkhudelem fadeovertime( 0.4 ); + self.perkhudelem.alpha = 1; + self.perkhudelem.hidewheninmenu = 1; } -showperk( index, perk, ypos ) //checked matches cerberus output +showperk( index, perk, ypos ) { - /* /# - assert( game[ "state" ] != "postgame" ); + assert( game["state"] != "postgame" ); #/ - */ - if ( !isDefined( self.perkicon ) ) - { - self.perkicon = []; - self.perkname = []; - } - if ( !isDefined( self.perkicon[ index ] ) ) - { - /* + + if ( !isdefined( self.perkicon ) ) + { + self.perkicon = []; + self.perkname = []; + } + + if ( !isdefined( self.perkicon[index] ) ) + { /# - assert( !isDefined( self.perkname[ index ] ) ); + assert( !isdefined( self.perkname[index] ) ); #/ - */ - self.perkicon[ index ] = createloadouticon( self, index, 0, 200, ypos ); - self.perkname[ index ] = createloadouttext( self.perkicon[ index ], 160 ); - } - else - { - self.perkicon[ index ] setloadouticoncoords( self, index, 0, 200, ypos ); - self.perkname[ index ] setloadouttextcoords( 160 ); - } - if ( perk != "perk_null" || perk == "weapon_null" && perk == "specialty_null" ) - { - alpha = 0; - } - else - { - /* + self.perkicon[index] = createloadouticon( self, index, 0, 200, ypos ); + self.perkname[index] = createloadouttext( self.perkicon[index], 160 ); + } + else + { + self.perkicon[index] setloadouticoncoords( self, index, 0, 200, ypos ); + self.perkname[index] setloadouttextcoords( 160 ); + } + + if ( perk == "perk_null" || perk == "weapon_null" || perk == "specialty_null" ) + alpha = 0; + else + { /# - assert( isDefined( level.perknames[ perk ] ), perk ); + assert( isdefined( level.perknames[perk] ), perk ); #/ - */ - alpha = 1; - } - showloadoutattribute( self.perkicon[ index ], perk, alpha, self.perkname[ index ], level.perknames[ perk ] ); - self.perkicon[ index ] moveovertime( 0.3 ); - self.perkicon[ index ].x = -5; - self.perkicon[ index ].hidewheninmenu = 1; - self.perkname[ index ] moveovertime( 0.3 ); - self.perkname[ index ].x = -40; - self.perkname[ index ].hidewheninmenu = 1; + alpha = 1; + } + + showloadoutattribute( self.perkicon[index], perk, alpha, self.perkname[index], level.perknames[perk] ); + self.perkicon[index] moveovertime( 0.3 ); + self.perkicon[index].x = -5; + self.perkicon[index].hidewheninmenu = 1; + self.perkname[index] moveovertime( 0.3 ); + self.perkname[index].x = -40; + self.perkname[index].hidewheninmenu = 1; } -hideperks( fadetime ) //checked matches cerberus output +hideperks( fadetime ) { - if ( level.perksenabled == 1 ) - { - if ( game[ "state" ] == "postgame" ) - { - /* + if ( level.perksenabled == 1 ) + { + if ( game["state"] == "postgame" ) + { /# - assert( !isDefined( self.perkhudelem ) ); + assert( !isdefined( self.perkhudelem ) ); #/ - */ - return; - } - } - /* + return; + } + } + /# - assert( isDefined( self.perkhudelem ) ); + assert( isdefined( self.perkhudelem ) ); #/ - */ - if ( isDefined( self.perkhudelem ) ) - { - hideloadoutattribute( self.perkhudelem, fadetime ); - } + + if ( isdefined( self.perkhudelem ) ) + hideloadoutattribute( self.perkhudelem, fadetime ); } -hideperk( index, fadetime, hidetextonly ) //checked matches cerberus output +hideperk( index, fadetime, hidetextonly ) { - if ( !isDefined( fadetime ) ) - { - fadetime = 0.05; - } - if ( level.perksenabled == 1 ) - { - if ( game[ "state" ] == "postgame" ) - { - if ( isDefined( self.perkicon ) ) - { - /* + if ( !isdefined( fadetime ) ) + fadetime = 0.05; + + if ( level.perksenabled == 1 ) + { + if ( game["state"] == "postgame" ) + { + if ( isdefined( self.perkicon ) ) + { /# - assert( !isDefined( self.perkicon[ index ] ) ); + assert( !isdefined( self.perkicon[index] ) ); #/ /# - assert( !isDefined( self.perkname[ index ] ) ); + assert( !isdefined( self.perkname[index] ) ); #/ - */ - } - return; - } - /* + } + + return; + } + /# - assert( isDefined( self.perkicon[ index ] ) ); + assert( isdefined( self.perkicon[index] ) ); #/ /# - assert( isDefined( self.perkname[ index ] ) ); + assert( isdefined( self.perkname[index] ) ); #/ - */ - if ( isDefined( self.perkicon ) && isDefined( self.perkicon[ index ] ) && isDefined( self.perkname ) && isDefined( self.perkname[ index ] ) ) - { - hideloadoutattribute( self.perkicon[ index ], fadetime, self.perkname[ index ], hidetextonly ); - } - } + + if ( isdefined( self.perkicon ) && isdefined( self.perkicon[index] ) && isdefined( self.perkname ) && isdefined( self.perkname[index] ) ) + hideloadoutattribute( self.perkicon[index], fadetime, self.perkname[index], hidetextonly ); + } } -hideallperks( fadetime, hidetextonly ) //checked matches cerberus output +hideallperks( fadetime, hidetextonly ) { - if ( level.perksenabled == 1 ) - { - hideperks( fadetime ); - } + if ( level.perksenabled == 1 ) + hideperks( fadetime ); } -showkillstreak( index, killstreak, xpos, ypos ) //checked matches cerberus output +showkillstreak( index, killstreak, xpos, ypos ) { - /* /# - assert( game[ "state" ] != "postgame" ); + assert( game["state"] != "postgame" ); #/ - */ - if ( !isDefined( self.killstreakicon ) ) - { - self.killstreakicon = []; - } - if ( !isDefined( self.killstreakicon[ index ] ) ) - { - self.killstreakicon[ index ] = createloadouticon( self, 3, ( self.killstreak.size - 1 ) - index, xpos, ypos ); - } - if ( killstreak == "killstreak_null" || killstreak == "weapon_null" ) - { - alpha = 0; - } - else - { - /* + + if ( !isdefined( self.killstreakicon ) ) + self.killstreakicon = []; + + if ( !isdefined( self.killstreakicon[index] ) ) + self.killstreakicon[index] = createloadouticon( self, 3, self.killstreak.size - 1 - index, xpos, ypos ); + + if ( killstreak == "killstreak_null" || killstreak == "weapon_null" ) + alpha = 0; + else + { /# - assert( isDefined( level.killstreakicons[ killstreak ] ), killstreak ); + assert( isdefined( level.killstreakicons[killstreak] ), killstreak ); #/ - */ - alpha = 1; - } - showloadoutattribute( self.killstreakicon[ index ], level.killstreakicons[ killstreak ], alpha ); + alpha = 1; + } + + showloadoutattribute( self.killstreakicon[index], level.killstreakicons[killstreak], alpha ); } -hidekillstreak( index, fadetime ) //checked matches cerberus output +hidekillstreak( index, fadetime ) { - if ( iskillstreaksenabled() ) - { - if ( game[ "state" ] == "postgame" ) - { - /* + if ( iskillstreaksenabled() ) + { + if ( game["state"] == "postgame" ) + { /# - assert( !isDefined( self.killstreakicon[ index ] ) ); + assert( !isdefined( self.killstreakicon[index] ) ); #/ - */ - return; - } - /* + return; + } + /# - assert( isDefined( self.killstreakicon[ index ] ) ); + assert( isdefined( self.killstreakicon[index] ) ); #/ - */ - hideloadoutattribute( self.killstreakicon[ index ], fadetime ); - } + hideloadoutattribute( self.killstreakicon[index], fadetime ); + } } -setgamemodeinfopoint() //checked matches cerberus output +setgamemodeinfopoint() { - self.x = 11; - self.y = 120; - self.horzalign = "user_left"; - self.vertalign = "user_top"; - self.alignx = "left"; - self.aligny = "top"; + self.x = 11; + self.y = 120; + self.horzalign = "user_left"; + self.vertalign = "user_top"; + self.alignx = "left"; + self.aligny = "top"; } - diff --git a/Multiplayer Core/patch_mp/maps/mp/gametypes/_killcam.gsc b/Multiplayer Core/patch_mp/maps/mp/gametypes/_killcam.gsc index eadf209..96aed6c 100644 --- a/Multiplayer Core/patch_mp/maps/mp/gametypes/_killcam.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/gametypes/_killcam.gsc @@ -1,762 +1,763 @@ -#include maps/mp/gametypes/_globallogic_spawn; -#include maps/mp/gametypes/_spectating; -#include maps/mp/_tacticalinsertion; -#include maps/mp/_challenges; -#include maps/mp/gametypes/_globallogic; -#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 -init() //checked matches cerberus output +init() { - precachestring( &"PLATFORM_PRESS_TO_SKIP" ); - precachestring( &"PLATFORM_PRESS_TO_RESPAWN" ); - precacheshader( "white" ); - level.killcam = getgametypesetting( "allowKillcam" ); - level.finalkillcam = getgametypesetting( "allowFinalKillcam" ); - initfinalkillcam(); + precachestring( &"PLATFORM_PRESS_TO_SKIP" ); + precachestring( &"PLATFORM_PRESS_TO_RESPAWN" ); + precacheshader( "white" ); + level.killcam = getgametypesetting( "allowKillcam" ); + level.finalkillcam = getgametypesetting( "allowFinalKillcam" ); + initfinalkillcam(); } -initfinalkillcam() //checked changed to match cerberus output +initfinalkillcam() { - level.finalkillcamsettings = []; - initfinalkillcamteam( "none" ); - foreach ( team in level.teams ) - { - initfinalkillcamteam( team ); - } - level.finalkillcam_winner = undefined; + level.finalkillcamsettings = []; + initfinalkillcamteam( "none" ); + + foreach ( team in level.teams ) + initfinalkillcamteam( team ); + + level.finalkillcam_winner = undefined; } -initfinalkillcamteam( team ) //checked matches cerberus output +initfinalkillcamteam( team ) { - level.finalkillcamsettings[ team ] = spawnstruct(); - clearfinalkillcamteam( team ); + level.finalkillcamsettings[team] = spawnstruct(); + clearfinalkillcamteam( team ); } -clearfinalkillcamteam( team ) //checked matches cerberus output +clearfinalkillcamteam( team ) { - level.finalkillcamsettings[ team ].spectatorclient = undefined; - level.finalkillcamsettings[ team ].weapon = undefined; - level.finalkillcamsettings[ team ].deathtime = undefined; - level.finalkillcamsettings[ team ].deathtimeoffset = undefined; - level.finalkillcamsettings[ team ].offsettime = undefined; - level.finalkillcamsettings[ team ].entityindex = undefined; - level.finalkillcamsettings[ team ].targetentityindex = undefined; - level.finalkillcamsettings[ team ].entitystarttime = undefined; - level.finalkillcamsettings[ team ].perks = undefined; - level.finalkillcamsettings[ team ].killstreaks = undefined; - level.finalkillcamsettings[ team ].attacker = undefined; + level.finalkillcamsettings[team].spectatorclient = undefined; + level.finalkillcamsettings[team].weapon = undefined; + level.finalkillcamsettings[team].deathtime = undefined; + level.finalkillcamsettings[team].deathtimeoffset = undefined; + level.finalkillcamsettings[team].offsettime = undefined; + level.finalkillcamsettings[team].entityindex = undefined; + level.finalkillcamsettings[team].targetentityindex = undefined; + level.finalkillcamsettings[team].entitystarttime = undefined; + level.finalkillcamsettings[team].perks = undefined; + level.finalkillcamsettings[team].killstreaks = undefined; + level.finalkillcamsettings[team].attacker = undefined; } -recordkillcamsettings( spectatorclient, targetentityindex, sweapon, deathtime, deathtimeoffset, offsettime, entityindex, entitystarttime, perks, killstreaks, attacker ) //checked matches cerberus output +recordkillcamsettings( spectatorclient, targetentityindex, sweapon, deathtime, deathtimeoffset, offsettime, entityindex, entitystarttime, perks, killstreaks, attacker ) { - if ( level.teambased && isDefined( attacker.team ) && isDefined( level.teams[ attacker.team ] ) ) - { - team = attacker.team; - level.finalkillcamsettings[ team ].spectatorclient = spectatorclient; - level.finalkillcamsettings[ team ].weapon = sweapon; - level.finalkillcamsettings[ team ].deathtime = deathtime; - level.finalkillcamsettings[ team ].deathtimeoffset = deathtimeoffset; - level.finalkillcamsettings[ team ].offsettime = offsettime; - level.finalkillcamsettings[ team ].entityindex = entityindex; - level.finalkillcamsettings[ team ].targetentityindex = targetentityindex; - level.finalkillcamsettings[ team ].entitystarttime = entitystarttime; - level.finalkillcamsettings[ team ].perks = perks; - level.finalkillcamsettings[ team ].killstreaks = killstreaks; - level.finalkillcamsettings[ team ].attacker = attacker; - } - level.finalkillcamsettings[ "none" ].spectatorclient = spectatorclient; - level.finalkillcamsettings[ "none" ].weapon = sweapon; - level.finalkillcamsettings[ "none" ].deathtime = deathtime; - level.finalkillcamsettings[ "none" ].deathtimeoffset = deathtimeoffset; - level.finalkillcamsettings[ "none" ].offsettime = offsettime; - level.finalkillcamsettings[ "none" ].entityindex = entityindex; - level.finalkillcamsettings[ "none" ].targetentityindex = targetentityindex; - level.finalkillcamsettings[ "none" ].entitystarttime = entitystarttime; - level.finalkillcamsettings[ "none" ].perks = perks; - level.finalkillcamsettings[ "none" ].killstreaks = killstreaks; - level.finalkillcamsettings[ "none" ].attacker = attacker; + if ( level.teambased && isdefined( attacker.team ) && isdefined( level.teams[attacker.team] ) ) + { + team = attacker.team; + level.finalkillcamsettings[team].spectatorclient = spectatorclient; + level.finalkillcamsettings[team].weapon = sweapon; + level.finalkillcamsettings[team].deathtime = deathtime; + level.finalkillcamsettings[team].deathtimeoffset = deathtimeoffset; + level.finalkillcamsettings[team].offsettime = offsettime; + level.finalkillcamsettings[team].entityindex = entityindex; + level.finalkillcamsettings[team].targetentityindex = targetentityindex; + level.finalkillcamsettings[team].entitystarttime = entitystarttime; + level.finalkillcamsettings[team].perks = perks; + level.finalkillcamsettings[team].killstreaks = killstreaks; + level.finalkillcamsettings[team].attacker = attacker; + } + + level.finalkillcamsettings["none"].spectatorclient = spectatorclient; + level.finalkillcamsettings["none"].weapon = sweapon; + level.finalkillcamsettings["none"].deathtime = deathtime; + level.finalkillcamsettings["none"].deathtimeoffset = deathtimeoffset; + level.finalkillcamsettings["none"].offsettime = offsettime; + level.finalkillcamsettings["none"].entityindex = entityindex; + level.finalkillcamsettings["none"].targetentityindex = targetentityindex; + level.finalkillcamsettings["none"].entitystarttime = entitystarttime; + level.finalkillcamsettings["none"].perks = perks; + level.finalkillcamsettings["none"].killstreaks = killstreaks; + level.finalkillcamsettings["none"].attacker = attacker; } -erasefinalkillcam() //checked changed to match cerberus output +erasefinalkillcam() { - clearfinalkillcamteam( "none" ); - foreach ( team in level.teams ) - { - clearfinalkillcamteam( team ); - } - level.finalkillcam_winner = undefined; + clearfinalkillcamteam( "none" ); + + foreach ( team in level.teams ) + clearfinalkillcamteam( team ); + + level.finalkillcam_winner = undefined; } -finalkillcamwaiter() //checked matches cerberus output +finalkillcamwaiter() { - if ( !isDefined( level.finalkillcam_winner ) ) - { - return 0; - } - level waittill( "final_killcam_done" ); - return 1; + if ( !isdefined( level.finalkillcam_winner ) ) + return false; + + level waittill( "final_killcam_done" ); + + return true; } -postroundfinalkillcam() //checked matches cerberus output +postroundfinalkillcam() { - if ( is_true( level.sidebet ) ) - { - return; - } - level notify( "play_final_killcam" ); - maps/mp/gametypes/_globallogic::resetoutcomeforallplayers(); - finalkillcamwaiter(); + if ( isdefined( level.sidebet ) && level.sidebet ) + return; + + level notify( "play_final_killcam" ); + maps\mp\gametypes\_globallogic::resetoutcomeforallplayers(); + finalkillcamwaiter(); } -dofinalkillcam() //checked changed to match cerberus output +dofinalkillcam() { - level waittill( "play_final_killcam" ); - level.infinalkillcam = 1; - winner = "none"; - if ( isDefined( level.finalkillcam_winner ) ) - { - winner = level.finalkillcam_winner; - } - if ( !isDefined( level.finalkillcamsettings[ winner ].targetentityindex ) ) - { - level.infinalkillcam = 0; - level notify( "final_killcam_done" ); - return; - } - if ( isDefined( level.finalkillcamsettings[ winner ].attacker ) ) - { - maps/mp/_challenges::getfinalkill( level.finalkillcamsettings[ winner ].attacker ); - } - visionsetnaked( getDvar( "mapname" ), 0 ); - players = level.players; - for ( index = 0; index < players.size; index++ ) - { - player = players[ index ]; - player closemenu(); - player closeingamemenu(); - player thread finalkillcam( winner ); - } - wait 0.1; - while ( areanyplayerswatchingthekillcam() ) - { - wait 0.05; - } - level notify( "final_killcam_done" ); - level.infinalkillcam = 0; + level waittill( "play_final_killcam" ); + + level.infinalkillcam = 1; + winner = "none"; + + if ( isdefined( level.finalkillcam_winner ) ) + winner = level.finalkillcam_winner; + + if ( !isdefined( level.finalkillcamsettings[winner].targetentityindex ) ) + { + level.infinalkillcam = 0; + level notify( "final_killcam_done" ); + return; + } + + if ( isdefined( level.finalkillcamsettings[winner].attacker ) ) + maps\mp\_challenges::getfinalkill( level.finalkillcamsettings[winner].attacker ); + + visionsetnaked( getdvar( "mapname" ), 0.0 ); + players = level.players; + + for ( index = 0; index < players.size; index++ ) + { + player = players[index]; + player closemenu(); + player closeingamemenu(); + player thread finalkillcam( winner ); + } + + wait 0.1; + + while ( areanyplayerswatchingthekillcam() ) + wait 0.05; + + level notify( "final_killcam_done" ); + level.infinalkillcam = 0; } -startlastkillcam() //checked matches cerberus output +startlastkillcam() { + } -areanyplayerswatchingthekillcam() //checked changed to match cerberus output +areanyplayerswatchingthekillcam() { - players = level.players; - for ( index = 0; index < players.size; index++ ) - { - player = players[ index ]; - if ( isDefined( player.killcam ) ) - { - return 1; - } - } - return 0; + players = level.players; + + for ( index = 0; index < players.size; index++ ) + { + player = players[index]; + + if ( isdefined( player.killcam ) ) + return true; + } + + return false; } -killcam( attackernum, targetnum, killcamentity, killcamentityindex, killcamentitystarttime, sweapon, deathtime, deathtimeoffset, offsettime, respawn, maxtime, perks, killstreaks, attacker ) //checked changed to match cerberus output +killcam( attackernum, targetnum, killcamentity, killcamentityindex, killcamentitystarttime, sweapon, deathtime, deathtimeoffset, offsettime, respawn, maxtime, perks, killstreaks, attacker ) { - self endon( "disconnect" ); - self endon( "spawned" ); - level endon( "game_ended" ); - if ( attackernum < 0 ) - { - return; - } - postdeathdelay = ( getTime() - deathtime ) / 1000; - predelay = postdeathdelay + deathtimeoffset; - camtime = calckillcamtime( sweapon, killcamentitystarttime, predelay, respawn, maxtime ); - postdelay = calcpostdelay(); - killcamlength = camtime + postdelay; - if ( isDefined( maxtime ) && killcamlength > maxtime ) - { - if ( maxtime < 2 ) - { - return; - } - if ( ( maxtime - camtime ) >= 1 ) - { - postdelay = maxtime - camtime; - } - else - { - postdelay = 1; - camtime = maxtime - 1; - } - killcamlength = camtime + postdelay; - } - killcamoffset = camtime + predelay; - self notify( "begin_killcam", getTime() ); - killcamstarttime = getTime() - ( killcamoffset * 1000 ); - self.sessionstate = "spectator"; - self.spectatorclient = attackernum; - self.killcamentity = -1; - if ( killcamentityindex >= 0 ) - { - self thread setkillcamentity( killcamentityindex, killcamentitystarttime - killcamstarttime - 100 ); - } - self.killcamtargetentity = targetnum; - self.archivetime = killcamoffset; - self.killcamlength = killcamlength; - self.psoffsettime = offsettime; - recordkillcamsettings( attackernum, targetnum, sweapon, deathtime, deathtimeoffset, offsettime, killcamentityindex, killcamentitystarttime, perks, killstreaks, attacker ); - foreach ( team in level.teams ) - { - self allowspectateteam( team, 1 ); - } - self allowspectateteam( "freelook", 1 ); - self allowspectateteam( "none", 1 ); - self thread endedkillcamcleanup(); - wait 0.05; - if ( self.archivetime <= predelay ) - { - self.sessionstate = "dead"; - self.spectatorclient = -1; - self.killcamentity = -1; - self.archivetime = 0; - self.psoffsettime = 0; - self notify( "end_killcam" ); - return; - } - self thread checkforabruptkillcamend(); - self.killcam = 1; - self addkillcamskiptext( respawn ); - if ( !self issplitscreen() && level.perksenabled == 1 ) - { - self addkillcamtimer( camtime ); - self maps/mp/gametypes/_hud_util::showperks(); - } - self thread spawnedkillcamcleanup(); - self thread waitskipkillcambutton(); - self thread waitteamchangeendkillcam(); - self thread waitkillcamtime(); - self thread maps/mp/_tacticalinsertion::cancel_button_think(); - self waittill( "end_killcam" ); - self endkillcam( 0 ); - self.sessionstate = "dead"; - self.spectatorclient = -1; - self.killcamentity = -1; - self.archivetime = 0; - self.psoffsettime = 0; + self endon( "disconnect" ); + self endon( "spawned" ); + level endon( "game_ended" ); + + if ( attackernum < 0 ) + return; + + postdeathdelay = ( gettime() - deathtime ) / 1000; + predelay = postdeathdelay + deathtimeoffset; + camtime = calckillcamtime( sweapon, killcamentitystarttime, predelay, respawn, maxtime ); + postdelay = calcpostdelay(); + killcamlength = camtime + postdelay; + + if ( isdefined( maxtime ) && killcamlength > maxtime ) + { + if ( maxtime < 2 ) + return; + + if ( maxtime - camtime >= 1 ) + postdelay = maxtime - camtime; + else + { + postdelay = 1; + camtime = maxtime - 1; + } + + killcamlength = camtime + postdelay; + } + + killcamoffset = camtime + predelay; + self notify( "begin_killcam", gettime() ); + killcamstarttime = gettime() - killcamoffset * 1000; + self.sessionstate = "spectator"; + self.spectatorclient = attackernum; + self.killcamentity = -1; + + if ( killcamentityindex >= 0 ) + self thread setkillcamentity( killcamentityindex, killcamentitystarttime - killcamstarttime - 100 ); + + self.killcamtargetentity = targetnum; + self.archivetime = killcamoffset; + self.killcamlength = killcamlength; + self.psoffsettime = offsettime; + recordkillcamsettings( attackernum, targetnum, sweapon, deathtime, deathtimeoffset, offsettime, killcamentityindex, killcamentitystarttime, perks, killstreaks, attacker ); + + foreach ( team in level.teams ) + self allowspectateteam( team, 1 ); + + self allowspectateteam( "freelook", 1 ); + self allowspectateteam( "none", 1 ); + self thread endedkillcamcleanup(); + wait 0.05; + + if ( self.archivetime <= predelay ) + { + self.sessionstate = "dead"; + self.spectatorclient = -1; + self.killcamentity = -1; + self.archivetime = 0; + self.psoffsettime = 0; + self notify( "end_killcam" ); + return; + } + + self thread checkforabruptkillcamend(); + self.killcam = 1; + self addkillcamskiptext( respawn ); + + if ( !self issplitscreen() && level.perksenabled == 1 ) + { + self addkillcamtimer( camtime ); + self maps\mp\gametypes\_hud_util::showperks(); + } + + self thread spawnedkillcamcleanup(); + self thread waitskipkillcambutton(); + self thread waitteamchangeendkillcam(); + self thread waitkillcamtime(); + self thread maps\mp\_tacticalinsertion::cancel_button_think(); + + self waittill( "end_killcam" ); + + self endkillcam( 0 ); + self.sessionstate = "dead"; + self.spectatorclient = -1; + self.killcamentity = -1; + self.archivetime = 0; + self.psoffsettime = 0; } -setkillcamentity( killcamentityindex, delayms ) //checked matches cerberus output +setkillcamentity( killcamentityindex, delayms ) { - self endon( "disconnect" ); - self endon( "end_killcam" ); - self endon( "spawned" ); - if ( delayms > 0 ) - { - wait ( delayms / 1000 ); - } - self.killcamentity = killcamentityindex; + self endon( "disconnect" ); + self endon( "end_killcam" ); + self endon( "spawned" ); + + if ( delayms > 0 ) + wait( delayms / 1000 ); + + self.killcamentity = killcamentityindex; } -waitkillcamtime() //checked matches cerberus output +waitkillcamtime() { - self endon( "disconnect" ); - self endon( "end_killcam" ); - wait ( self.killcamlength - 0.05 ); - self notify( "end_killcam" ); + self endon( "disconnect" ); + self endon( "end_killcam" ); + wait( self.killcamlength - 0.05 ); + self notify( "end_killcam" ); } -waitfinalkillcamslowdown( deathtime, starttime ) //checked matches cerberus output +waitfinalkillcamslowdown( deathtime, starttime ) { - self endon( "disconnect" ); - self endon( "end_killcam" ); - secondsuntildeath = ( deathtime - starttime ) / 1000; - deathtime = getTime() + ( secondsuntildeath * 1000 ); - waitbeforedeath = 2; - maps/mp/_utility::setclientsysstate( "levelNotify", "fkcb" ); - wait max( 0, secondsuntildeath - waitbeforedeath ); - setslowmotion( 1, 0.25, waitbeforedeath ); - wait ( waitbeforedeath + 0.5 ); - setslowmotion( 0.25, 1, 1 ); - wait 0.5; - maps/mp/_utility::setclientsysstate( "levelNotify", "fkce" ); + self endon( "disconnect" ); + self endon( "end_killcam" ); + secondsuntildeath = ( deathtime - starttime ) / 1000; + deathtime = gettime() + secondsuntildeath * 1000; + waitbeforedeath = 2; + maps\mp\_utility::setclientsysstate( "levelNotify", "fkcb" ); + wait( max( 0, secondsuntildeath - waitbeforedeath ) ); + setslowmotion( 1.0, 0.25, waitbeforedeath ); + wait( waitbeforedeath + 0.5 ); + setslowmotion( 0.25, 1, 1.0 ); + wait 0.5; + maps\mp\_utility::setclientsysstate( "levelNotify", "fkce" ); } -waitskipkillcambutton() //checked matches cerberus output +waitskipkillcambutton() { - self endon( "disconnect" ); - self endon( "end_killcam" ); - while ( self usebuttonpressed() ) - { - wait 0.05; - } - while ( !self usebuttonpressed() ) - { - wait 0.05; - } - self notify( "end_killcam" ); - self clientnotify( "fkce" ); + self endon( "disconnect" ); + self endon( "end_killcam" ); + + while ( self usebuttonpressed() ) + wait 0.05; + + while ( !self usebuttonpressed() ) + wait 0.05; + + self notify( "end_killcam" ); + self clientnotify( "fkce" ); } -waitteamchangeendkillcam() //checked matches cerberus output +waitteamchangeendkillcam() { - self endon( "disconnect" ); - self endon( "end_killcam" ); - self waittill( "changed_class" ); - endkillcam( 0 ); + self endon( "disconnect" ); + self endon( "end_killcam" ); + + self waittill( "changed_class" ); + + endkillcam( 0 ); } -waitskipkillcamsafespawnbutton() //checked matches cerberus output +waitskipkillcamsafespawnbutton() { - self endon( "disconnect" ); - self endon( "end_killcam" ); - while ( self fragbuttonpressed() ) - { - wait 0.05; - } - while ( !self fragbuttonpressed() ) - { - wait 0.05; - } - self.wantsafespawn = 1; - self notify( "end_killcam" ); + self endon( "disconnect" ); + self endon( "end_killcam" ); + + while ( self fragbuttonpressed() ) + wait 0.05; + + while ( !self fragbuttonpressed() ) + wait 0.05; + + self.wantsafespawn = 1; + self notify( "end_killcam" ); } -endkillcam( final ) //checked matches cerberus output +endkillcam( final ) { - if ( isDefined( self.kc_skiptext ) ) - { - self.kc_skiptext.alpha = 0; - } - if ( isDefined( self.kc_timer ) ) - { - self.kc_timer.alpha = 0; - } - self.killcam = undefined; - if ( !self issplitscreen() ) - { - self hideallperks(); - } - self thread maps/mp/gametypes/_spectating::setspectatepermissions(); + if ( isdefined( self.kc_skiptext ) ) + self.kc_skiptext.alpha = 0; + + if ( isdefined( self.kc_timer ) ) + self.kc_timer.alpha = 0; + + self.killcam = undefined; + + if ( !self issplitscreen() ) + self hideallperks(); + + self thread maps\mp\gametypes\_spectating::setspectatepermissions(); } -checkforabruptkillcamend() //checked changed to match cerberus output +checkforabruptkillcamend() { - self endon( "disconnect" ); - self endon( "end_killcam" ); - while ( 1 ) - { - if ( self.archivetime <= 0 ) - { - break; - } - wait 0.05; - } - self notify( "end_killcam" ); + self endon( "disconnect" ); + self endon( "end_killcam" ); + + while ( true ) + { + if ( self.archivetime <= 0 ) + break; + + wait 0.05; + } + + self notify( "end_killcam" ); } -spawnedkillcamcleanup() //checked matches cerberus output +spawnedkillcamcleanup() { - self endon( "end_killcam" ); - self endon( "disconnect" ); - self waittill( "spawned" ); - self endkillcam( 0 ); + self endon( "end_killcam" ); + self endon( "disconnect" ); + + self waittill( "spawned" ); + + self endkillcam( 0 ); } -spectatorkillcamcleanup( attacker ) //checked matches cerberus output +spectatorkillcamcleanup( attacker ) { - self endon( "end_killcam" ); - self endon( "disconnect" ); - attacker endon( "disconnect" ); - attacker waittill( "begin_killcam", attackerkcstarttime ); - waittime = max( 0, attackerkcstarttime - self.deathtime - 50 ); - wait waittime; - self endkillcam( 0 ); + self endon( "end_killcam" ); + self endon( "disconnect" ); + attacker endon( "disconnect" ); + + attacker waittill( "begin_killcam", attackerkcstarttime ); + + waittime = max( 0, attackerkcstarttime - self.deathtime - 50 ); + wait( waittime ); + self endkillcam( 0 ); } -endedkillcamcleanup() //checked matches cerberus output +endedkillcamcleanup() { - self endon( "end_killcam" ); - self endon( "disconnect" ); - level waittill( "game_ended" ); - self endkillcam( 0 ); + self endon( "end_killcam" ); + self endon( "disconnect" ); + + level waittill( "game_ended" ); + + self endkillcam( 0 ); } -endedfinalkillcamcleanup() //checked matches cerberus output +endedfinalkillcamcleanup() { - self endon( "end_killcam" ); - self endon( "disconnect" ); - level waittill( "game_ended" ); - self endkillcam( 1 ); + self endon( "end_killcam" ); + self endon( "disconnect" ); + + level waittill( "game_ended" ); + + self endkillcam( 1 ); } -cancelkillcamusebutton() //checked matches cerberus output +cancelkillcamusebutton() { - return self usebuttonpressed(); + return self usebuttonpressed(); } -cancelkillcamsafespawnbutton() //checked matches cerberus output +cancelkillcamsafespawnbutton() { - return self fragbuttonpressed(); + return self fragbuttonpressed(); } -cancelkillcamcallback() //checked matches cerberus output +cancelkillcamcallback() { - self.cancelkillcam = 1; + self.cancelkillcam = 1; } -cancelkillcamsafespawncallback() //checked matches cerberus output +cancelkillcamsafespawncallback() { - self.cancelkillcam = 1; - self.wantsafespawn = 1; + self.cancelkillcam = 1; + self.wantsafespawn = 1; } -cancelkillcamonuse() //checked matches cerberus output +cancelkillcamonuse() { - self thread cancelkillcamonuse_specificbutton( ::cancelkillcamusebutton, ::cancelkillcamcallback ); + self thread cancelkillcamonuse_specificbutton( ::cancelkillcamusebutton, ::cancelkillcamcallback ); } -cancelkillcamonuse_specificbutton( pressingbuttonfunc, finishedfunc ) //checked changed at own discretion +cancelkillcamonuse_specificbutton( pressingbuttonfunc, finishedfunc ) { - self endon( "death_delay_finished" ); - self endon( "disconnect" ); - level endon( "game_ended" ); - for ( ;; ) - { - if ( !self [[ pressingbuttonfunc ]]() ) - { - wait 0.05; - continue; - } - buttontime = 0; - while ( self [[ pressingbuttonfunc ]]() ) - { - buttontime += 0.05; - wait 0.05; - } - if ( buttontime >= 0.5 ) - { - continue; - } - buttontime = 0; - while ( !( self [[ pressingbuttonfunc ]]() ) && buttontime < 0.5 ) - { - buttontime += 0.05; - wait 0.05; - } - if ( buttontime >= 0.5 ) - { - continue; - } - else - { - self [[ finishedfunc ]](); - return; - } - wait 0.05; - } + self endon( "death_delay_finished" ); + self endon( "disconnect" ); + level endon( "game_ended" ); + + for (;;) + { + if ( !self [[ pressingbuttonfunc ]]() ) + { + wait 0.05; + continue; + } + + buttontime = 0; + + while ( self [[ pressingbuttonfunc ]]() ) + { + buttontime += 0.05; + wait 0.05; + } + + if ( buttontime >= 0.5 ) + continue; + + buttontime = 0; + + while ( !self [[ pressingbuttonfunc ]]() && buttontime < 0.5 ) + { + buttontime += 0.05; + wait 0.05; + } + + if ( buttontime >= 0.5 ) + continue; + + self [[ finishedfunc ]](); + return; + } } -finalkillcam( winner ) //checked changed to match cerberus output +finalkillcam( winner ) { - self endon( "disconnect" ); - level endon( "game_ended" ); - if ( waslastround() ) - { - setmatchflag( "final_killcam", 1 ); - setmatchflag( "round_end_killcam", 0 ); - } - else - { - setmatchflag( "final_killcam", 0 ); - setmatchflag( "round_end_killcam", 1 ); - } - /* + self endon( "disconnect" ); + level endon( "game_ended" ); + + if ( waslastround() ) + { + setmatchflag( "final_killcam", 1 ); + setmatchflag( "round_end_killcam", 0 ); + } + else + { + setmatchflag( "final_killcam", 0 ); + setmatchflag( "round_end_killcam", 1 ); + } + /# - if ( getDvarInt( "scr_force_finalkillcam" ) == 1 ) - { - setmatchflag( "final_killcam", 1 ); - setmatchflag( "round_end_killcam", 0 ); + if ( getdvarint( "scr_force_finalkillcam" ) == 1 ) + { + setmatchflag( "final_killcam", 1 ); + setmatchflag( "round_end_killcam", 0 ); + } #/ - } - */ - if ( level.console ) - { - self maps/mp/gametypes/_globallogic_spawn::setthirdperson( 0 ); - } - killcamsettings = level.finalkillcamsettings[ winner ]; - postdeathdelay = ( getTime() - killcamsettings.deathtime ) / 1000; - predelay = postdeathdelay + killcamsettings.deathtimeoffset; - camtime = calckillcamtime( killcamsettings.weapon, killcamsettings.entitystarttime, predelay, 0, undefined ); - postdelay = calcpostdelay(); - killcamoffset = camtime + predelay; - killcamlength = ( camtime + postdelay ) - 0.05; - killcamstarttime = getTime() - ( killcamoffset * 1000 ); - self notify( "begin_killcam", getTime() ); - self.sessionstate = "spectator"; - self.spectatorclient = killcamsettings.spectatorclient; - self.killcamentity = -1; - if ( killcamsettings.entityindex >= 0 ) - { - self thread setkillcamentity( killcamsettings.entityindex, killcamsettings.entitystarttime - killcamstarttime - 100 ); - } - self.killcamtargetentity = killcamsettings.targetentityindex; - self.archivetime = killcamoffset; - self.killcamlength = killcamlength; - self.psoffsettime = killcamsettings.offsettime; - foreach ( team in level.teams ) - { - self allowspectateteam( team, 1 ); - } - self allowspectateteam( "freelook", 1 ); - self allowspectateteam( "none", 1 ); - self thread endedfinalkillcamcleanup(); - wait 0.05; - if ( self.archivetime <= predelay ) - { - self.sessionstate = "dead"; - self.spectatorclient = -1; - self.killcamentity = -1; - self.archivetime = 0; - self.psoffsettime = 0; - self notify( "end_killcam" ); - return; - } - self thread checkforabruptkillcamend(); - self.killcam = 1; - if ( !self issplitscreen() ) - { - self addkillcamtimer( camtime ); - } - self thread waitkillcamtime(); - self thread waitfinalkillcamslowdown( level.finalkillcamsettings[ winner ].deathtime, killcamstarttime ); - self waittill( "end_killcam" ); - self endkillcam( 1 ); - setmatchflag( "final_killcam", 0 ); - setmatchflag( "round_end_killcam", 0 ); - self spawnendoffinalkillcam(); + + if ( level.console ) + self maps\mp\gametypes\_globallogic_spawn::setthirdperson( 0 ); + + killcamsettings = level.finalkillcamsettings[winner]; + postdeathdelay = ( gettime() - killcamsettings.deathtime ) / 1000; + predelay = postdeathdelay + killcamsettings.deathtimeoffset; + camtime = calckillcamtime( killcamsettings.weapon, killcamsettings.entitystarttime, predelay, 0, undefined ); + postdelay = calcpostdelay(); + killcamoffset = camtime + predelay; + killcamlength = camtime + postdelay - 0.05; + killcamstarttime = gettime() - killcamoffset * 1000; + self notify( "begin_killcam", gettime() ); + self.sessionstate = "spectator"; + self.spectatorclient = killcamsettings.spectatorclient; + self.killcamentity = -1; + + if ( killcamsettings.entityindex >= 0 ) + self thread setkillcamentity( killcamsettings.entityindex, killcamsettings.entitystarttime - killcamstarttime - 100 ); + + self.killcamtargetentity = killcamsettings.targetentityindex; + self.archivetime = killcamoffset; + self.killcamlength = killcamlength; + self.psoffsettime = killcamsettings.offsettime; + + foreach ( team in level.teams ) + self allowspectateteam( team, 1 ); + + self allowspectateteam( "freelook", 1 ); + self allowspectateteam( "none", 1 ); + self thread endedfinalkillcamcleanup(); + wait 0.05; + + if ( self.archivetime <= predelay ) + { + self.sessionstate = "dead"; + self.spectatorclient = -1; + self.killcamentity = -1; + self.archivetime = 0; + self.psoffsettime = 0; + self notify( "end_killcam" ); + return; + } + + self thread checkforabruptkillcamend(); + self.killcam = 1; + + if ( !self issplitscreen() ) + self addkillcamtimer( camtime ); + + self thread waitkillcamtime(); + self thread waitfinalkillcamslowdown( level.finalkillcamsettings[winner].deathtime, killcamstarttime ); + + self waittill( "end_killcam" ); + + self endkillcam( 1 ); + setmatchflag( "final_killcam", 0 ); + setmatchflag( "round_end_killcam", 0 ); + self spawnendoffinalkillcam(); } -spawnendoffinalkillcam() //checked matches cerberus output +spawnendoffinalkillcam() { - [[ level.spawnspectator ]](); - self freezecontrols( 1 ); + [[ level.spawnspectator ]](); + self freezecontrols( 1 ); } -iskillcamentityweapon( sweapon ) //checked matches cerberus output +iskillcamentityweapon( sweapon ) { - if ( sweapon == "planemortar_mp" ) - { - return 1; - } - return 0; + if ( sweapon == "planemortar_mp" ) + return true; + + return false; } -iskillcamgrenadeweapon( sweapon ) //checked changed to match cerberus output +iskillcamgrenadeweapon( sweapon ) { - if ( sweapon == "frag_grenade_mp" ) - { - return 1; - } - else if ( sweapon == "frag_grenade_short_mp" ) - { - return 1; - } - else if ( sweapon == "sticky_grenade_mp" ) - { - return 1; - } - else if ( sweapon == "tabun_gas_mp" ) - { - return 1; - } - return 0; + if ( sweapon == "frag_grenade_mp" ) + return true; + else if ( sweapon == "frag_grenade_short_mp" ) + return true; + else if ( sweapon == "sticky_grenade_mp" ) + return true; + else if ( sweapon == "tabun_gas_mp" ) + return true; + + return false; } -calckillcamtime( sweapon, entitystarttime, predelay, respawn, maxtime ) //checked matches cerberus output dvars found in another dump +calckillcamtime( sweapon, entitystarttime, predelay, respawn, maxtime ) { - camtime = 0; - if ( getDvar( "scr_killcam_time" ) == "" ) - { - if ( iskillcamentityweapon( sweapon ) ) - { - camtime = ( ( getTime() - entitystarttime ) / 1000 ) - predelay - 0.1; - } - else if ( !respawn ) - { - camtime = 5; - } - else if ( iskillcamgrenadeweapon( sweapon ) ) - { - camtime = 4.25; - } - else - { - camtime = 2.5; - } - } - else - { - camtime = getDvarFloat( "scr_killcam_time" ); - } - if ( isDefined( maxtime ) ) - { - if ( camtime > maxtime ) - { - camtime = maxtime; - } - if ( camtime < 0.05 ) - { - camtime = 0.05; - } - } - return camtime; + camtime = 0.0; + + if ( getdvar( _hash_C45D9077 ) == "" ) + { + if ( iskillcamentityweapon( sweapon ) ) + camtime = ( gettime() - entitystarttime ) / 1000 - predelay - 0.1; + else if ( !respawn ) + camtime = 5.0; + else if ( iskillcamgrenadeweapon( sweapon ) ) + camtime = 4.25; + else + camtime = 2.5; + } + else + camtime = getdvarfloat( _hash_C45D9077 ); + + if ( isdefined( maxtime ) ) + { + if ( camtime > maxtime ) + camtime = maxtime; + + if ( camtime < 0.05 ) + camtime = 0.05; + } + + return camtime; } -calcpostdelay() //checked matches cerberus output dvars found in another dump +calcpostdelay() { - postdelay = 0; - if ( getDvar( "scr_killcam_posttime" ) == "" ) - { - postdelay = 2; - } - else - { - postdelay = getDvarFloat( "scr_killcam_posttime" ); - if ( postdelay < 0.05 ) - { - postdelay = 0.05; - } - } - return postdelay; + postdelay = 0; + + if ( getdvar( _hash_D34D95D ) == "" ) + postdelay = 2; + else + { + postdelay = getdvarfloat( _hash_D34D95D ); + + if ( postdelay < 0.05 ) + postdelay = 0.05; + } + + return postdelay; } -addkillcamskiptext( respawn ) //checked matches cerberus output +addkillcamskiptext( respawn ) { - if ( !isDefined( self.kc_skiptext ) ) - { - self.kc_skiptext = newclienthudelem( self ); - self.kc_skiptext.archived = 0; - self.kc_skiptext.x = 0; - self.kc_skiptext.alignx = "center"; - self.kc_skiptext.aligny = "middle"; - self.kc_skiptext.horzalign = "center"; - self.kc_skiptext.vertalign = "bottom"; - self.kc_skiptext.sort = 1; - self.kc_skiptext.font = "objective"; - } - if ( self issplitscreen() ) - { - self.kc_skiptext.y = -100; - self.kc_skiptext.fontscale = 1.4; - } - else - { - self.kc_skiptext.y = -120; - self.kc_skiptext.fontscale = 2; - } - if ( respawn ) - { - self.kc_skiptext settext( &"PLATFORM_PRESS_TO_RESPAWN" ); - } - else - { - self.kc_skiptext settext( &"PLATFORM_PRESS_TO_SKIP" ); - } - self.kc_skiptext.alpha = 1; + if ( !isdefined( self.kc_skiptext ) ) + { + self.kc_skiptext = newclienthudelem( self ); + self.kc_skiptext.archived = 0; + self.kc_skiptext.x = 0; + self.kc_skiptext.alignx = "center"; + self.kc_skiptext.aligny = "middle"; + self.kc_skiptext.horzalign = "center"; + self.kc_skiptext.vertalign = "bottom"; + self.kc_skiptext.sort = 1; + self.kc_skiptext.font = "objective"; + } + + if ( self issplitscreen() ) + { + self.kc_skiptext.y = -100; + self.kc_skiptext.fontscale = 1.4; + } + else + { + self.kc_skiptext.y = -120; + self.kc_skiptext.fontscale = 2; + } + + if ( respawn ) + self.kc_skiptext settext( &"PLATFORM_PRESS_TO_RESPAWN" ); + else + self.kc_skiptext settext( &"PLATFORM_PRESS_TO_SKIP" ); + + self.kc_skiptext.alpha = 1; } -addkillcamtimer( camtime ) //checked matches cerberus output +addkillcamtimer( camtime ) { + } -initkcelements() //checked matches cerberus output +initkcelements() { - if ( !isDefined( self.kc_skiptext ) ) - { - self.kc_skiptext = newclienthudelem( self ); - self.kc_skiptext.archived = 0; - self.kc_skiptext.x = 0; - self.kc_skiptext.alignx = "center"; - self.kc_skiptext.aligny = "top"; - self.kc_skiptext.horzalign = "center_adjustable"; - self.kc_skiptext.vertalign = "top_adjustable"; - self.kc_skiptext.sort = 1; - self.kc_skiptext.font = "default"; - self.kc_skiptext.foreground = 1; - self.kc_skiptext.hidewheninmenu = 1; - if ( self issplitscreen() ) - { - self.kc_skiptext.y = 20; - self.kc_skiptext.fontscale = 1.2; - } - else - { - self.kc_skiptext.y = 32; - self.kc_skiptext.fontscale = 1.8; - } - } - if ( !isDefined( self.kc_othertext ) ) - { - self.kc_othertext = newclienthudelem( self ); - self.kc_othertext.archived = 0; - self.kc_othertext.y = 48; - self.kc_othertext.alignx = "left"; - self.kc_othertext.aligny = "top"; - self.kc_othertext.horzalign = "center"; - self.kc_othertext.vertalign = "middle"; - self.kc_othertext.sort = 10; - self.kc_othertext.font = "small"; - self.kc_othertext.foreground = 1; - self.kc_othertext.hidewheninmenu = 1; - if ( self issplitscreen() ) - { - self.kc_othertext.x = 16; - self.kc_othertext.fontscale = 1.2; - } - else - { - self.kc_othertext.x = 32; - self.kc_othertext.fontscale = 1.6; - } - } - if ( !isDefined( self.kc_icon ) ) - { - self.kc_icon = newclienthudelem( self ); - self.kc_icon.archived = 0; - self.kc_icon.x = 16; - self.kc_icon.y = 16; - self.kc_icon.alignx = "left"; - self.kc_icon.aligny = "top"; - self.kc_icon.horzalign = "center"; - self.kc_icon.vertalign = "middle"; - self.kc_icon.sort = 1; - self.kc_icon.foreground = 1; - self.kc_icon.hidewheninmenu = 1; - } - if ( !self issplitscreen() ) - { - if ( !isDefined( self.kc_timer ) ) - { - self.kc_timer = createfontstring( "hudbig", 1 ); - self.kc_timer.archived = 0; - self.kc_timer.x = 0; - self.kc_timer.alignx = "center"; - self.kc_timer.aligny = "middle"; - self.kc_timer.horzalign = "center_safearea"; - self.kc_timer.vertalign = "top_adjustable"; - self.kc_timer.y = 42; - self.kc_timer.sort = 1; - self.kc_timer.font = "hudbig"; - self.kc_timer.foreground = 1; - self.kc_timer.color = vectorScale( ( 1, 1, 1 ), 0.85 ); - self.kc_timer.hidewheninmenu = 1; - } - } -} + if ( !isdefined( self.kc_skiptext ) ) + { + self.kc_skiptext = newclienthudelem( self ); + self.kc_skiptext.archived = 0; + self.kc_skiptext.x = 0; + self.kc_skiptext.alignx = "center"; + self.kc_skiptext.aligny = "top"; + self.kc_skiptext.horzalign = "center_adjustable"; + self.kc_skiptext.vertalign = "top_adjustable"; + self.kc_skiptext.sort = 1; + self.kc_skiptext.font = "default"; + self.kc_skiptext.foreground = 1; + self.kc_skiptext.hidewheninmenu = 1; + if ( self issplitscreen() ) + { + self.kc_skiptext.y = 20; + self.kc_skiptext.fontscale = 1.2; + } + else + { + self.kc_skiptext.y = 32; + self.kc_skiptext.fontscale = 1.8; + } + } + + if ( !isdefined( self.kc_othertext ) ) + { + self.kc_othertext = newclienthudelem( self ); + self.kc_othertext.archived = 0; + self.kc_othertext.y = 48; + self.kc_othertext.alignx = "left"; + self.kc_othertext.aligny = "top"; + self.kc_othertext.horzalign = "center"; + self.kc_othertext.vertalign = "middle"; + self.kc_othertext.sort = 10; + self.kc_othertext.font = "small"; + self.kc_othertext.foreground = 1; + self.kc_othertext.hidewheninmenu = 1; + + if ( self issplitscreen() ) + { + self.kc_othertext.x = 16; + self.kc_othertext.fontscale = 1.2; + } + else + { + self.kc_othertext.x = 32; + self.kc_othertext.fontscale = 1.6; + } + } + + if ( !isdefined( self.kc_icon ) ) + { + self.kc_icon = newclienthudelem( self ); + self.kc_icon.archived = 0; + self.kc_icon.x = 16; + self.kc_icon.y = 16; + self.kc_icon.alignx = "left"; + self.kc_icon.aligny = "top"; + self.kc_icon.horzalign = "center"; + self.kc_icon.vertalign = "middle"; + self.kc_icon.sort = 1; + self.kc_icon.foreground = 1; + self.kc_icon.hidewheninmenu = 1; + } + + if ( !self issplitscreen() ) + { + if ( !isdefined( self.kc_timer ) ) + { + self.kc_timer = createfontstring( "hudbig", 1.0 ); + self.kc_timer.archived = 0; + self.kc_timer.x = 0; + self.kc_timer.alignx = "center"; + self.kc_timer.aligny = "middle"; + self.kc_timer.horzalign = "center_safearea"; + self.kc_timer.vertalign = "top_adjustable"; + self.kc_timer.y = 42; + self.kc_timer.sort = 1; + self.kc_timer.font = "hudbig"; + self.kc_timer.foreground = 1; + self.kc_timer.color = vectorscale( ( 1, 1, 1 ), 0.85 ); + self.kc_timer.hidewheninmenu = 1; + } + } +} diff --git a/Multiplayer Core/patch_mp/maps/mp/gametypes/_menus.gsc b/Multiplayer Core/patch_mp/maps/mp/gametypes/_menus.gsc index 5af1e64..1a66843 100644 --- a/Multiplayer Core/patch_mp/maps/mp/gametypes/_menus.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/gametypes/_menus.gsc @@ -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 ); + } + } +} diff --git a/Multiplayer Core/patch_mp/maps/mp/gametypes/_objpoints.gsc b/Multiplayer Core/patch_mp/maps/mp/gametypes/_objpoints.gsc index 88debdb..0dfb71e 100644 --- a/Multiplayer Core/patch_mp/maps/mp/gametypes/_objpoints.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/gametypes/_objpoints.gsc @@ -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; +} diff --git a/Multiplayer Core/patch_mp/maps/mp/gametypes/_perplayer.gsc b/Multiplayer Core/patch_mp/maps/mp/gametypes/_perplayer.gsc index a95a168..79e5a72 100644 --- a/Multiplayer Core/patch_mp/maps/mp/gametypes/_perplayer.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/gametypes/_perplayer.gsc @@ -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 ); +} diff --git a/Multiplayer Core/patch_mp/maps/mp/gametypes/_persistence.gsc b/Multiplayer Core/patch_mp/maps/mp/gametypes/_persistence.gsc index 31b7205..f98cfcf 100644 --- a/Multiplayer Core/patch_mp/maps/mp/gametypes/_persistence.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/gametypes/_persistence.gsc @@ -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 ) { -} +} diff --git a/Multiplayer Core/patch_mp/maps/mp/gametypes/_pregame.gsc b/Multiplayer Core/patch_mp/maps/mp/gametypes/_pregame.gsc index 5673fb1..1d1a33f 100644 --- a/Multiplayer Core/patch_mp/maps/mp/gametypes/_pregame.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/gametypes/_pregame.gsc @@ -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"; +} diff --git a/Multiplayer Core/patch_mp/maps/mp/gametypes/_rank.gsc b/Multiplayer Core/patch_mp/maps/mp/gametypes/_rank.gsc index 70d4579..c544f30 100644 --- a/Multiplayer Core/patch_mp/maps/mp/gametypes/_rank.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/gametypes/_rank.gsc @@ -1,846 +1,805 @@ -//checked includes match cerberus output -#include maps/mp/gametypes/_globallogic; -#include maps/mp/gametypes/_hud; -#include maps/mp/gametypes/_hud_util; -#include maps/mp/_scoreevents; -#include maps/mp/_utility; -#include common_scripts/utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool -init() //checked partially changed to match cerberus output changed at own discretion +init() { - level.scoreinfo = []; - level.xpscale = getDvarFloat( "scr_xpscale" ); - level.codpointsxpscale = getDvarFloat( "scr_codpointsxpscale" ); - level.codpointsmatchscale = getDvarFloat( "scr_codpointsmatchscale" ); - level.codpointschallengescale = getDvarFloat( "scr_codpointsperchallenge" ); - level.rankxpcap = getDvarInt( "scr_rankXpCap" ); - level.codpointscap = getDvarInt( "scr_codPointsCap" ); - level.usingmomentum = 1; - level.usingscorestreaks = getDvarInt( "scr_scorestreaks" ) != 0; - level.scorestreaksmaxstacking = getDvarInt( "scr_scorestreaks_maxstacking" ); - level.maxinventoryscorestreaks = getdvarintdefault( "scr_maxinventory_scorestreaks", 3 ); - if ( !isDefined( level.usingscorestreaks ) || !level.usingscorestreaks ) - { - level.usingrampage = 1; - } - level.rampagebonusscale = getDvarFloat( "scr_rampagebonusscale" ); - level.ranktable = []; - precacheshader( "white" ); - precachestring( &"RANK_PLAYER_WAS_PROMOTED_N" ); - precachestring( &"RANK_PLAYER_WAS_PROMOTED" ); - precachestring( &"RANK_PROMOTED" ); - precachestring( &"MP_PLUS" ); - precachestring( &"RANK_ROMANI" ); - precachestring( &"RANK_ROMANII" ); - precachestring( &"MP_SCORE_KILL" ); - if ( !sessionmodeiszombiesgame() ) - { - initscoreinfo(); - } - level.maxrank = int( tablelookup( "mp/rankTable.csv", 0, "maxrank", 1 ) ); - level.maxprestige = int( tablelookup( "mp/rankIconTable.csv", 0, "maxprestige", 1 ) ); - for ( pid = 0; pid <= level.maxprestige; pid++ ) - { - for ( rid = 0; rid <= level.maxrank; rid++ ) - { - precacheshader( tablelookup( "mp/rankIconTable.csv", 0, rid, pid + 1 ) ); - } - } - rankid = 0; - rankname = tablelookup( "mp/ranktable.csv", 0, rankid, 1 ); - /* + level.scoreinfo = []; + level.xpscale = getdvarfloat( "scr_xpscale" ); + level.codpointsxpscale = getdvarfloat( "scr_codpointsxpscale" ); + level.codpointsmatchscale = getdvarfloat( "scr_codpointsmatchscale" ); + level.codpointschallengescale = getdvarfloat( "scr_codpointsperchallenge" ); + level.rankxpcap = getdvarint( "scr_rankXpCap" ); + level.codpointscap = getdvarint( "scr_codPointsCap" ); + level.usingmomentum = 1; + level.usingscorestreaks = getdvarint( "scr_scorestreaks" ) != 0; + level.scorestreaksmaxstacking = getdvarint( "scr_scorestreaks_maxstacking" ); + level.maxinventoryscorestreaks = getdvarintdefault( "scr_maxinventory_scorestreaks", 3 ); + level.usingrampage = !isdefined( level.usingscorestreaks ) || !level.usingscorestreaks; + level.rampagebonusscale = getdvarfloat( "scr_rampagebonusscale" ); + level.ranktable = []; + precacheshader( "white" ); + precachestring( &"RANK_PLAYER_WAS_PROMOTED_N" ); + precachestring( &"RANK_PLAYER_WAS_PROMOTED" ); + precachestring( &"RANK_PROMOTED" ); + precachestring( &"MP_PLUS" ); + precachestring( &"RANK_ROMANI" ); + precachestring( &"RANK_ROMANII" ); + precachestring( &"MP_SCORE_KILL" ); + + if ( !sessionmodeiszombiesgame() ) + initscoreinfo(); + + level.maxrank = int( tablelookup( "mp/rankTable.csv", 0, "maxrank", 1 ) ); + level.maxprestige = int( tablelookup( "mp/rankIconTable.csv", 0, "maxprestige", 1 ) ); + pid = 0; + rid = 0; + + for ( pid = 0; pid <= level.maxprestige; pid++ ) + { + for ( rid = 0; rid <= level.maxrank; rid++ ) + precacheshader( tablelookup( "mp/rankIconTable.csv", 0, rid, pid + 1 ) ); + } + + rankid = 0; + rankname = tablelookup( "mp/ranktable.csv", 0, rankid, 1 ); /# - if ( isDefined( rankname ) ) - { - assert( rankname != "" ); - } + assert( isdefined( rankname ) && rankname != "" ); #/ - */ - while ( isDefined( rankname ) && rankname != "" ) - { - level.ranktable[ rankid ][ 1 ] = tablelookup( "mp/ranktable.csv", 0, rankid, 1 ); - level.ranktable[ rankid ][ 2 ] = tablelookup( "mp/ranktable.csv", 0, rankid, 2 ); - level.ranktable[ rankid ][ 3 ] = tablelookup( "mp/ranktable.csv", 0, rankid, 3 ); - level.ranktable[ rankid ][ 7 ] = tablelookup( "mp/ranktable.csv", 0, rankid, 7 ); - level.ranktable[ rankid ][ 14 ] = tablelookup( "mp/ranktable.csv", 0, rankid, 14 ); - precachestring( tablelookupistring( "mp/ranktable.csv", 0, rankid, 16 ) ); - rankid++; - rankname = tablelookup( "mp/ranktable.csv", 0, rankid, 1 ); - } - level thread onplayerconnect(); + + while ( isdefined( rankname ) && rankname != "" ) + { + level.ranktable[rankid][1] = tablelookup( "mp/ranktable.csv", 0, rankid, 1 ); + level.ranktable[rankid][2] = tablelookup( "mp/ranktable.csv", 0, rankid, 2 ); + level.ranktable[rankid][3] = tablelookup( "mp/ranktable.csv", 0, rankid, 3 ); + level.ranktable[rankid][7] = tablelookup( "mp/ranktable.csv", 0, rankid, 7 ); + level.ranktable[rankid][14] = tablelookup( "mp/ranktable.csv", 0, rankid, 14 ); + precachestring( tablelookupistring( "mp/ranktable.csv", 0, rankid, 16 ) ); + rankid++; + rankname = tablelookup( "mp/ranktable.csv", 0, rankid, 1 ); + } + + level thread onplayerconnect(); } -initscoreinfo() //checked changed to match cerberus output +initscoreinfo() { - scoreinfotableid = getscoreeventtableid(); - /* + scoreinfotableid = getscoreeventtableid(); /# - assert( isDefined( scoreinfotableid ) ); + assert( isdefined( scoreinfotableid ) ); #/ - */ - if ( !isDefined( scoreinfotableid ) ) - { - return; - } - scorecolumn = getscoreeventcolumn( level.gametype ); - xpcolumn = getxpeventcolumn( level.gametype ); - /* + + if ( !isdefined( scoreinfotableid ) ) + return; + + scorecolumn = getscoreeventcolumn( level.gametype ); + xpcolumn = getxpeventcolumn( level.gametype ); /# - assert( scorecolumn >= 0 ); + assert( scorecolumn >= 0 ); #/ - */ - if ( scorecolumn < 0 ) - { - return; - } - /* + + if ( scorecolumn < 0 ) + return; + /# - assert( xpcolumn >= 0 ); + assert( xpcolumn >= 0 ); #/ - */ - if ( xpcolumn < 0 ) - { - return; - } - for ( row = 1; row < 512; row++ ) - { - type = tablelookupcolumnforrow( scoreinfotableid, row, 0 ); - if ( type != "" ) - { - labelstring = tablelookupcolumnforrow( scoreinfotableid, row, 1 ); - label = undefined; - if ( labelstring != "" ) - { - label = tablelookupistring( scoreinfotableid, 0, type, 1 ); - } - scorevalue = int( tablelookupcolumnforrow( scoreinfotableid, row, scorecolumn ) ); - registerscoreinfo( type, scorevalue, label ); - if ( maps/mp/_utility::getroundsplayed() == 0 ) - { - xpvalue = float( tablelookupcolumnforrow( scoreinfotableid, row, xpcolumn ) ); - setddlstat = tablelookupcolumnforrow( scoreinfotableid, row, 5 ); - addplayerstat = 0; - if ( setddlstat == "TRUE" ) - { - addplayerstat = 1; - } - ismedal = 0; - istring = tablelookupistring( scoreinfotableid, 0, type, 2 ); - if ( isDefined( istring ) && istring != &"" ) - { - ismedal = 1; - } - demobookmarkpriority = int( tablelookupcolumnforrow( scoreinfotableid, row, 6 ) ); - if ( !isDefined( demobookmarkpriority ) ) - { - demobookmarkpriority = 0; - } - registerxp( type, xpvalue, addplayerstat, ismedal, demobookmarkpriority, row ); - } - allowkillstreakweapons = tablelookupcolumnforrow( scoreinfotableid, row, 4 ); - if ( allowkillstreakweapons == "TRUE" ) - { - level.scoreinfo[ type ][ "allowKillstreakWeapons" ] = 1; - } - } - } + + if ( xpcolumn < 0 ) + return; + + for ( row = 1; row < 512; row++ ) + { + type = tablelookupcolumnforrow( scoreinfotableid, row, 0 ); + + if ( type != "" ) + { + labelstring = tablelookupcolumnforrow( scoreinfotableid, row, 1 ); + label = undefined; + + if ( labelstring != "" ) + label = tablelookupistring( scoreinfotableid, 0, type, 1 ); + + scorevalue = int( tablelookupcolumnforrow( scoreinfotableid, row, scorecolumn ) ); + registerscoreinfo( type, scorevalue, label ); + + if ( maps\mp\_utility::getroundsplayed() == 0 ) + { + xpvalue = float( tablelookupcolumnforrow( scoreinfotableid, row, xpcolumn ) ); + setddlstat = tablelookupcolumnforrow( scoreinfotableid, row, 5 ); + addplayerstat = 0; + + if ( setddlstat == "TRUE" ) + addplayerstat = 1; + + ismedal = 0; + istring = tablelookupistring( scoreinfotableid, 0, type, 2 ); + + if ( isdefined( istring ) && istring != &"" ) + ismedal = 1; + + demobookmarkpriority = int( tablelookupcolumnforrow( scoreinfotableid, row, 6 ) ); + + if ( !isdefined( demobookmarkpriority ) ) + demobookmarkpriority = 0; + + registerxp( type, xpvalue, addplayerstat, ismedal, demobookmarkpriority, row ); + } + + allowkillstreakweapons = tablelookupcolumnforrow( scoreinfotableid, row, 4 ); + + if ( allowkillstreakweapons == "TRUE" ) + level.scoreinfo[type]["allowKillstreakWeapons"] = 1; + } + } } -getrankxpcapped( inrankxp ) //checked matches cerberus output +getrankxpcapped( inrankxp ) { - if ( is_true( level.rankxpcap ) && level.rankxpcap <= inrankxp ) - { - return level.rankxpcap; - } - return inrankxp; + if ( isdefined( level.rankxpcap ) && level.rankxpcap && level.rankxpcap <= inrankxp ) + return level.rankxpcap; + + return inrankxp; } -getcodpointscapped( incodpoints ) //checked matches cerberus output +getcodpointscapped( incodpoints ) { - if ( is_true( level.codpointscap ) && level.codpointscap <= incodpoints ) - { - return level.codpointscap; - } - return incodpoints; + if ( isdefined( level.codpointscap ) && level.codpointscap && level.codpointscap <= incodpoints ) + return level.codpointscap; + + return incodpoints; } -registerscoreinfo( type, value, label ) //checked matches cerberus output +registerscoreinfo( type, value, label ) { - overridedvar = "scr_" + level.gametype + "_score_" + type; - if ( getDvar( overridedvar ) != "" ) - { - value = getDvarInt( overridedvar ); - } - if ( type == "kill" ) - { - multiplier = getgametypesetting( "killEventScoreMultiplier" ); - level.scoreinfo[ type ][ "value" ] = int( ( multiplier + 1 ) * value ); - } - else - { - level.scoreinfo[ type ][ "value" ] = value; - } - if ( isDefined( label ) ) - { - precachestring( label ); - level.scoreinfo[ type ][ "label" ] = label; - } + overridedvar = "scr_" + level.gametype + "_score_" + type; + + if ( getdvar( overridedvar ) != "" ) + value = getdvarint( overridedvar ); + + if ( type == "kill" ) + { + multiplier = getgametypesetting( "killEventScoreMultiplier" ); + level.scoreinfo[type]["value"] = int( ( multiplier + 1.0 ) * value ); + } + else + level.scoreinfo[type]["value"] = value; + + if ( isdefined( label ) ) + { + precachestring( label ); + level.scoreinfo[type]["label"] = label; + } } -getscoreinfovalue( type ) //checked matches cerberus output +getscoreinfovalue( type ) { - if ( isDefined( level.scoreinfo[ type ] ) ) - { - return level.scoreinfo[ type ][ "value" ]; - } + if ( isdefined( level.scoreinfo[type] ) ) + return level.scoreinfo[type]["value"]; } -getscoreinfolabel( type ) //checked matches cerberus output +getscoreinfolabel( type ) { - return level.scoreinfo[ type ][ "label" ]; + return level.scoreinfo[type]["label"]; } -killstreakweaponsallowedscore( type ) //checked matches cerberus output +killstreakweaponsallowedscore( type ) { - if ( isDefined( level.scoreinfo[ type ][ "allowKillstreakWeapons" ] ) && level.scoreinfo[ type ][ "allowKillstreakWeapons" ] == 1 ) - { - return 1; - } - else - { - return 0; - } + if ( isdefined( level.scoreinfo[type]["allowKillstreakWeapons"] ) && level.scoreinfo[type]["allowKillstreakWeapons"] == 1 ) + return true; + else + return false; } -doesscoreinfocounttowardrampage( type ) //checked changed at own discretion +doesscoreinfocounttowardrampage( type ) { - if ( isDefined( level.scoreinfo[ type ][ "rampage" ] ) && level.scoreinfo[ type ][ "rampage" ] ) - { - return 1; - } - return 0; + return isdefined( level.scoreinfo[type]["rampage"] ) && level.scoreinfo[type]["rampage"]; } -getrankinfominxp( rankid ) //checked matches cerberus output +getrankinfominxp( rankid ) { - return int( level.ranktable[ rankid ][ 2 ] ); + return int( level.ranktable[rankid][2] ); } -getrankinfoxpamt( rankid ) //checked matches cerberus output +getrankinfoxpamt( rankid ) { - return int( level.ranktable[ rankid ][ 3 ] ); + return int( level.ranktable[rankid][3] ); } -getrankinfomaxxp( rankid ) //checked matches cerberus output +getrankinfomaxxp( rankid ) { - return int( level.ranktable[ rankid ][ 7 ] ); + return int( level.ranktable[rankid][7] ); } -getrankinfofull( rankid ) //checked matches cerberus output +getrankinfofull( rankid ) { - return tablelookupistring( "mp/ranktable.csv", 0, rankid, 16 ); + return tablelookupistring( "mp/ranktable.csv", 0, rankid, 16 ); } -getrankinfoicon( rankid, prestigeid ) //checked matches cerberus output +getrankinfoicon( rankid, prestigeid ) { - return tablelookup( "mp/rankIconTable.csv", 0, rankid, prestigeid + 1 ); + return tablelookup( "mp/rankIconTable.csv", 0, rankid, prestigeid + 1 ); } -getrankinfolevel( rankid ) //checked matches cerberus output +getrankinfolevel( rankid ) { - return int( tablelookup( "mp/ranktable.csv", 0, rankid, 13 ) ); + return int( tablelookup( "mp/ranktable.csv", 0, rankid, 13 ) ); } -getrankinfocodpointsearned( rankid ) //checked matches cerberus output +getrankinfocodpointsearned( rankid ) { - return int( tablelookup( "mp/ranktable.csv", 0, rankid, 17 ) ); + return int( tablelookup( "mp/ranktable.csv", 0, rankid, 17 ) ); } -shouldkickbyrank() //checked matches cerberus output +shouldkickbyrank() { - if ( self ishost() ) - { - return 0; - } - if ( level.rankcap > 0 && self.pers[ "rank" ] > level.rankcap ) - { - return 1; - } - if ( level.rankcap > 0 && level.minprestige == 0 && self.pers[ "plevel" ] > 0 ) - { - return 1; - } - if ( level.minprestige > self.pers[ "plevel" ] ) - { - return 1; - } - return 0; + if ( self ishost() ) + return false; + + if ( level.rankcap > 0 && self.pers["rank"] > level.rankcap ) + return true; + + if ( level.rankcap > 0 && level.minprestige == 0 && self.pers["plevel"] > 0 ) + return true; + + if ( level.minprestige > self.pers["plevel"] ) + return true; + + return false; } -getcodpointsstat() //checked matches cerberus output +getcodpointsstat() { - codpoints = self getdstat( "playerstatslist", "CODPOINTS", "StatValue" ); - codpointscapped = getcodpointscapped( codpoints ); - if ( codpoints > codpointscapped ) - { - self setcodpointsstat( codpointscapped ); - } - return codpointscapped; + codpoints = self getdstat( "playerstatslist", "CODPOINTS", "StatValue" ); + codpointscapped = getcodpointscapped( codpoints ); + + if ( codpoints > codpointscapped ) + self setcodpointsstat( codpointscapped ); + + return codpointscapped; } -setcodpointsstat( codpoints ) //checked matches cerberus output +setcodpointsstat( codpoints ) { - self setdstat( "PlayerStatsList", "CODPOINTS", "StatValue", getcodpointscapped( codpoints ) ); + self setdstat( "PlayerStatsList", "CODPOINTS", "StatValue", getcodpointscapped( codpoints ) ); } -getrankxpstat() //checked matches cerberus output +getrankxpstat() { - rankxp = self getdstat( "playerstatslist", "RANKXP", "StatValue" ); - rankxpcapped = getrankxpcapped( rankxp ); - if ( rankxp > rankxpcapped ) - { - self setdstat( "playerstatslist", "RANKXP", "StatValue", rankxpcapped ); - } - return rankxpcapped; + rankxp = self getdstat( "playerstatslist", "RANKXP", "StatValue" ); + rankxpcapped = getrankxpcapped( rankxp ); + + if ( rankxp > rankxpcapped ) + self setdstat( "playerstatslist", "RANKXP", "StatValue", rankxpcapped ); + + return rankxpcapped; } -onplayerconnect() //checked changed to match cerberus output +onplayerconnect() { - for ( ;; ) - { - level waittill( "connected", player ); - player.pers[ "rankxp" ] = player getrankxpstat(); - player.pers[ "codpoints" ] = player getcodpointsstat(); - player.pers[ "currencyspent" ] = player getdstat( "playerstatslist", "currencyspent", "StatValue" ); - rankid = player getrankforxp( player getrankxp() ); - player.pers[ "rank" ] = rankid; - player.pers[ "plevel" ] = player getdstat( "playerstatslist", "PLEVEL", "StatValue" ); - if ( player shouldkickbyrank() ) - { - kick( player getentitynumber() ); - continue; - } - if ( !isDefined( player.pers[ "participation" ] ) || level.gametype == "twar" && game[ "roundsplayed" ] >= 0 && player.pers[ "participation" ] >= 0 ) - { - player.pers[ "participation" ] = 0; - } - player.rankupdatetotal = 0; - player.cur_ranknum = rankid; - /* + for (;;) + { + level waittill( "connected", player ); + + player.pers["rankxp"] = player getrankxpstat(); + player.pers["codpoints"] = player getcodpointsstat(); + player.pers["currencyspent"] = player getdstat( "playerstatslist", "currencyspent", "StatValue" ); + rankid = player getrankforxp( player getrankxp() ); + player.pers["rank"] = rankid; + player.pers["plevel"] = player getdstat( "playerstatslist", "PLEVEL", "StatValue" ); + + if ( player shouldkickbyrank() ) + { + kick( player getentitynumber() ); + continue; + } + + if ( !isdefined( player.pers["participation"] ) || !( level.gametype == "twar" && 0 < game["roundsplayed"] && 0 < player.pers["participation"] ) ) + player.pers["participation"] = 0; + + player.rankupdatetotal = 0; + player.cur_ranknum = rankid; /# - assert( isDefined( player.cur_ranknum ), "rank: " + rankid + " does not have an index, check mp/ranktable.csv" ); + assert( isdefined( player.cur_ranknum ), "rank: " + rankid + " does not have an index, check mp/ranktable.csv" ); #/ - */ - prestige = player getdstat( "playerstatslist", "plevel", "StatValue" ); - player setrank( rankid, prestige ); - player.pers[ "prestige" ] = prestige; - if ( !isDefined( player.pers[ "summary" ] ) ) - { - player.pers[ "summary" ] = []; - player.pers[ "summary" ][ "xp" ] = 0; - player.pers[ "summary" ][ "score" ] = 0; - player.pers[ "summary" ][ "challenge" ] = 0; - player.pers[ "summary" ][ "match" ] = 0; - player.pers[ "summary" ][ "misc" ] = 0; - player.pers[ "summary" ][ "codpoints" ] = 0; - } - if ( !level.rankedmatch || level.wagermatch && level.leaguematch ) - { - player setdstat( "AfterActionReportStats", "lobbyPopup", "none" ); - } - if ( level.rankedmatch ) - { - player setdstat( "playerstatslist", "rank", "StatValue", rankid ); - player setdstat( "playerstatslist", "minxp", "StatValue", getrankinfominxp( rankid ) ); - player setdstat( "playerstatslist", "maxxp", "StatValue", getrankinfomaxxp( rankid ) ); - player setdstat( "playerstatslist", "lastxp", "StatValue", getrankxpcapped( player.pers[ "rankxp" ] ) ); - } - player.explosivekills[ 0 ] = 0; - player thread onplayerspawned(); - player thread onjoinedteam(); - player thread onjoinedspectators(); - } + prestige = player getdstat( "playerstatslist", "plevel", "StatValue" ); + player setrank( rankid, prestige ); + player.pers["prestige"] = prestige; + + if ( !isdefined( player.pers["summary"] ) ) + { + player.pers["summary"] = []; + player.pers["summary"]["xp"] = 0; + player.pers["summary"]["score"] = 0; + player.pers["summary"]["challenge"] = 0; + player.pers["summary"]["match"] = 0; + player.pers["summary"]["misc"] = 0; + player.pers["summary"]["codpoints"] = 0; + } + + if ( level.rankedmatch || level.wagermatch || level.leaguematch ) + player setdstat( "AfterActionReportStats", "lobbyPopup", "none" ); + + if ( level.rankedmatch ) + { + player setdstat( "playerstatslist", "rank", "StatValue", rankid ); + player setdstat( "playerstatslist", "minxp", "StatValue", getrankinfominxp( rankid ) ); + player setdstat( "playerstatslist", "maxxp", "StatValue", getrankinfomaxxp( rankid ) ); + player setdstat( "playerstatslist", "lastxp", "StatValue", getrankxpcapped( player.pers["rankxp"] ) ); + } + + player.explosivekills[0] = 0; + player thread onplayerspawned(); + player thread onjoinedteam(); + player thread onjoinedspectators(); + } } -onjoinedteam() //checked matches cerberus output +onjoinedteam() { - self endon( "disconnect" ); - for ( ;; ) - { - self waittill( "joined_team" ); - self thread removerankhud(); - } + self endon( "disconnect" ); + + for (;;) + { + self waittill( "joined_team" ); + + self thread removerankhud(); + } } -onjoinedspectators() //checked matches cerberus output +onjoinedspectators() { - self endon( "disconnect" ); - for ( ;; ) - { - self waittill( "joined_spectators" ); - self thread removerankhud(); - } + self endon( "disconnect" ); + + for (;;) + { + self waittill( "joined_spectators" ); + + self thread removerankhud(); + } } -onplayerspawned() //checked matches cerberus output +onplayerspawned() { - self endon( "disconnect" ); - for ( ;; ) - { - self waittill( "spawned_player" ); - if ( !isDefined( self.hud_rankscroreupdate ) ) - { - self.hud_rankscroreupdate = newscorehudelem( self ); - self.hud_rankscroreupdate.horzalign = "center"; - self.hud_rankscroreupdate.vertalign = "middle"; - self.hud_rankscroreupdate.alignx = "center"; - self.hud_rankscroreupdate.aligny = "middle"; - self.hud_rankscroreupdate.x = 0; - if ( self issplitscreen() ) - { - self.hud_rankscroreupdate.y = -15; - } - else - { - self.hud_rankscroreupdate.y = -60; - } - self.hud_rankscroreupdate.font = "default"; - self.hud_rankscroreupdate.fontscale = 2; - self.hud_rankscroreupdate.archived = 0; - self.hud_rankscroreupdate.color = ( 1, 1, 0.5 ); - self.hud_rankscroreupdate.alpha = 0; - self.hud_rankscroreupdate.sort = 50; - self.hud_rankscroreupdate maps/mp/gametypes/_hud::fontpulseinit(); - } - } + self endon( "disconnect" ); + + for (;;) + { + self waittill( "spawned_player" ); + + if ( !isdefined( self.hud_rankscroreupdate ) ) + { + self.hud_rankscroreupdate = newscorehudelem( self ); + self.hud_rankscroreupdate.horzalign = "center"; + self.hud_rankscroreupdate.vertalign = "middle"; + self.hud_rankscroreupdate.alignx = "center"; + self.hud_rankscroreupdate.aligny = "middle"; + self.hud_rankscroreupdate.x = 0; + + if ( self issplitscreen() ) + self.hud_rankscroreupdate.y = -15; + else + self.hud_rankscroreupdate.y = -60; + + self.hud_rankscroreupdate.font = "default"; + self.hud_rankscroreupdate.fontscale = 2.0; + self.hud_rankscroreupdate.archived = 0; + self.hud_rankscroreupdate.color = ( 1, 1, 0.5 ); + self.hud_rankscroreupdate.alpha = 0; + self.hud_rankscroreupdate.sort = 50; + self.hud_rankscroreupdate maps\mp\gametypes\_hud::fontpulseinit(); + } + } } -inccodpoints( amount ) //checked matches cerberus output +inccodpoints( amount ) { - if ( !isrankenabled() ) - { - return; - } - if ( !level.rankedmatch ) - { - return; - } - newcodpoints = getcodpointscapped( self.pers[ "codpoints" ] + amount ); - if ( newcodpoints > self.pers[ "codpoints" ] ) - { - self.pers[ "summary" ][ "codpoints" ] += newcodpoints - self.pers[ "codpoints" ]; - } - self.pers[ "codpoints" ] = newcodpoints; - setcodpointsstat( int( newcodpoints ) ); + if ( !isrankenabled() ) + return; + + if ( !level.rankedmatch ) + return; + + newcodpoints = getcodpointscapped( self.pers["codpoints"] + amount ); + + if ( newcodpoints > self.pers["codpoints"] ) + self.pers["summary"]["codpoints"] += newcodpoints - self.pers["codpoints"]; + + self.pers["codpoints"] = newcodpoints; + setcodpointsstat( int( newcodpoints ) ); } -atleastoneplayeroneachteam() //checked changed to match cerberus output +atleastoneplayeroneachteam() { - foreach ( team in level.teams ) - { - if ( !level.playercount[ team ] ) - { - return 0; - } - } - return 1; + foreach ( team in level.teams ) + { + if ( !level.playercount[team] ) + return false; + } + + return true; } -giverankxp( type, value, devadd ) //checked changed to match cerberus output +giverankxp( type, value, devadd ) { - self endon( "disconnect" ); - if ( sessionmodeiszombiesgame() ) - { - return; - } - if ( level.teambased && !atleastoneplayeroneachteam() && !isDefined( devadd ) ) - { - return; - } - else if ( !level.teambased && maps/mp/gametypes/_globallogic::totalplayercount() < 2 && !isDefined( devadd ) ) - { - return; - } - if ( !isrankenabled() ) - { - return; - } - pixbeginevent( "giveRankXP" ); - if ( !isDefined( value ) ) - { - value = getscoreinfovalue( type ); - } - if ( level.rankedmatch ) - { - bbprint( "mpplayerxp", "gametime %d, player %s, type %s, delta %d", getTime(), self.name, type, value ); - } - switch( type ) - { - case "assault": - case "assault_assist": - case "assist": - case "assist_25": - case "assist_50": - case "assist_75": - case "capture": - case "defend": - case "defuse": - case "destroyer": - case "dogassist": - case "dogkill": - case "headshot": - case "helicopterassist": - case "helicopterassist_25": - case "helicopterassist_50": - case "helicopterassist_75": - case "helicopterkill": - case "kill": - case "medal": - case "pickup": - case "plant": - case "rcbombdestroy": - case "return": - case "revive": - case "spyplaneassist": - case "spyplanekill": - value = int( value * level.xpscale ); - break; - default: - if ( level.xpscale == 0 ) - { - value = 0; - } - break; - } - xpincrease = self incrankxp( value ); - if ( level.rankedmatch ) - { - self updaterank(); - } - if ( value != 0 ) - { - self syncxpstat(); - } - if ( is_true( self.enabletext ) && !level.hardcoremode ) - { - if ( type == "teamkill" ) - { - self thread updaterankscorehud( 0 - getscoreinfovalue( "kill" ) ); - } - else - { - self thread updaterankscorehud( value ); - } - } - switch( type ) - { - case "assault": - case "assist": - case "assist_25": - case "assist_50": - case "assist_75": - case "capture": - case "defend": - case "headshot": - case "helicopterassist": - case "helicopterassist_25": - case "helicopterassist_50": - case "helicopterassist_75": - case "kill": - case "medal": - case "pickup": - case "return": - case "revive": - case "suicide": - case "teamkill": - self.pers[ "summary" ][ "score" ] += value; - inccodpoints( round_this_number( value * level.codpointsxpscale ) ); - break; - case "loss": - case "tie": - case "win": - self.pers[ "summary" ][ "match" ] += value; - inccodpoints( round_this_number( value * level.codpointsmatchscale ) ); - break; - case "challenge": - self.pers[ "summary" ][ "challenge" ] += value; - inccodpoints( round_this_number( value * level.codpointschallengescale ) ); - break; - default: - self.pers[ "summary" ][ "misc" ] += value; - self.pers[ "summary" ][ "match" ] += value; - inccodpoints( round_this_number( value * level.codpointsmatchscale ) ); - break; - } - self.pers[ "summary" ][ "xp" ] += xpincrease; - pixendevent(); + self endon( "disconnect" ); + + if ( sessionmodeiszombiesgame() ) + return; + + if ( level.teambased && !atleastoneplayeroneachteam() && !isdefined( devadd ) ) + return; + else if ( !level.teambased && maps\mp\gametypes\_globallogic::totalplayercount() < 2 && !isdefined( devadd ) ) + return; + + if ( !isrankenabled() ) + return; + + pixbeginevent( "giveRankXP" ); + + if ( !isdefined( value ) ) + value = getscoreinfovalue( type ); + + if ( level.rankedmatch ) + bbprint( "mpplayerxp", "gametime %d, player %s, type %s, delta %d", gettime(), self.name, type, value ); + + switch ( type ) + { + case "spyplanekill": + case "spyplaneassist": + case "revive": + case "return": + case "rcbombdestroy": + case "plant": + case "pickup": + case "medal": + case "kill": + case "helicopterkill": + case "helicopterassist_75": + case "helicopterassist_50": + case "helicopterassist_25": + case "helicopterassist": + case "headshot": + case "dogkill": + case "dogassist": + case "destroyer": + case "defuse": + case "defend": + case "capture": + case "assist_75": + case "assist_50": + case "assist_25": + case "assist": + case "assault_assist": + case "assault": + value = int( value * level.xpscale ); + break; + default: + if ( level.xpscale == 0 ) + value = 0; + + break; + } + + xpincrease = self incrankxp( value ); + + if ( level.rankedmatch ) + self updaterank(); + + if ( value != 0 ) + self syncxpstat(); + + if ( isdefined( self.enabletext ) && self.enabletext && !level.hardcoremode ) + { + if ( type == "teamkill" ) + self thread updaterankscorehud( 0 - getscoreinfovalue( "kill" ) ); + else + self thread updaterankscorehud( value ); + } + + switch ( type ) + { + case "teamkill": + case "suicide": + case "revive": + case "return": + case "pickup": + case "medal": + case "kill": + case "helicopterassist_75": + case "helicopterassist_50": + case "helicopterassist_25": + case "helicopterassist": + case "headshot": + case "defend": + case "capture": + case "assist_75": + case "assist_50": + case "assist_25": + case "assist": + case "assault": + self.pers["summary"]["score"] += value; + inccodpoints( round_this_number( value * level.codpointsxpscale ) ); + break; + case "win": + case "tie": + case "loss": + self.pers["summary"]["match"] += value; + inccodpoints( round_this_number( value * level.codpointsmatchscale ) ); + break; + case "challenge": + self.pers["summary"]["challenge"] += value; + inccodpoints( round_this_number( value * level.codpointschallengescale ) ); + break; + default: + self.pers["summary"]["misc"] += value; + self.pers["summary"]["match"] += value; + inccodpoints( round_this_number( value * level.codpointsmatchscale ) ); + break; + } + + self.pers["summary"]["xp"] += xpincrease; + pixendevent(); } -round_this_number( value ) //checked matches cerberus output +round_this_number( value ) { - value = int( value + 0.5 ); - return value; + value = int( value + 0.5 ); + return value; } -updaterank() //checked matches cerberus output +updaterank() { - newrankid = self getrank(); - if ( newrankid == self.pers[ "rank" ] ) - { - return 0; - } - oldrank = self.pers[ "rank" ]; - rankid = self.pers[ "rank" ]; - self.pers[ "rank" ] = newrankid; - while ( rankid <= newrankid ) - { - self setdstat( "playerstatslist", "rank", "StatValue", rankid ); - self setdstat( "playerstatslist", "minxp", "StatValue", int( level.ranktable[ rankid ][ 2 ] ) ); - self setdstat( "playerstatslist", "maxxp", "StatValue", int( level.ranktable[ rankid ][ 7 ] ) ); - self.setpromotion = 1; - if ( level.rankedmatch && level.gameended && !self issplitscreen() ) - { - self setdstat( "AfterActionReportStats", "lobbyPopup", "promotion" ); - } - if ( rankid != oldrank ) - { - codpointsearnedforrank = getrankinfocodpointsearned( rankid ); - inccodpoints( codpointsearnedforrank ); - if ( !isDefined( self.pers[ "rankcp" ] ) ) - { - self.pers[ "rankcp" ] = 0; - } - self.pers[ "rankcp" ] += codpointsearnedforrank; - } - rankid++; - } - self logstring( "promoted from " + oldrank + " to " + newrankid + " timeplayed: " + self getdstat( "playerstatslist", "time_played_total", "StatValue" ) ); - self setrank( newrankid ); - return 1; + newrankid = self getrank(); + + if ( newrankid == self.pers["rank"] ) + return false; + + oldrank = self.pers["rank"]; + rankid = self.pers["rank"]; + self.pers["rank"] = newrankid; + + while ( rankid <= newrankid ) + { + self setdstat( "playerstatslist", "rank", "StatValue", rankid ); + self setdstat( "playerstatslist", "minxp", "StatValue", int( level.ranktable[rankid][2] ) ); + self setdstat( "playerstatslist", "maxxp", "StatValue", int( level.ranktable[rankid][7] ) ); + self.setpromotion = 1; + + if ( level.rankedmatch && level.gameended && !self issplitscreen() ) + self setdstat( "AfterActionReportStats", "lobbyPopup", "promotion" ); + + if ( rankid != oldrank ) + { + codpointsearnedforrank = getrankinfocodpointsearned( rankid ); + inccodpoints( codpointsearnedforrank ); + + if ( !isdefined( self.pers["rankcp"] ) ) + self.pers["rankcp"] = 0; + + self.pers["rankcp"] += codpointsearnedforrank; + } + + rankid++; + } + + self logstring( "promoted from " + oldrank + " to " + newrankid + " timeplayed: " + self getdstat( "playerstatslist", "time_played_total", "StatValue" ) ); + self setrank( newrankid ); + return true; } -codecallback_rankup( rank, prestige, unlocktokensadded ) //checked matches cerberus output +codecallback_rankup( rank, prestige, unlocktokensadded ) { - if ( rank > 8 ) - { - self giveachievement( "MP_MISC_1" ); - } - self luinotifyevent( &"rank_up", 3, rank, prestige, unlocktokensadded ); - self luinotifyeventtospectators( &"rank_up", 3, rank, prestige, unlocktokensadded ); + if ( rank > 8 ) + self giveachievement( "MP_MISC_1" ); + + self luinotifyevent( &"rank_up", 3, rank, prestige, unlocktokensadded ); + self luinotifyeventtospectators( &"rank_up", 3, rank, prestige, unlocktokensadded ); } -getitemindex( refstring ) //checked matches cerberus output +getitemindex( refstring ) { - itemindex = int( tablelookup( "mp/statstable.csv", 4, refstring, 0 ) ); - /* + itemindex = int( tablelookup( "mp/statstable.csv", 4, refstring, 0 ) ); /# - assert( itemindex > 0, "statsTable refstring " + refstring + " has invalid index: " + itemindex ); + assert( itemindex > 0, "statsTable refstring " + refstring + " has invalid index: " + itemindex ); #/ - */ - return itemindex; + return itemindex; } -endgameupdate() //checked matches cerberus output +endgameupdate() { - player = self; + player = self; } -updaterankscorehud( amount ) //checked matches cerberus output +updaterankscorehud( amount ) { - self endon( "disconnect" ); - self endon( "joined_team" ); - self endon( "joined_spectators" ); - if ( is_true( level.usingmomentum ) ) - { - return; - } - if ( amount == 0 ) - { - return; - } - self notify( "update_score" ); - self endon( "update_score" ); - self.rankupdatetotal += amount; - wait 0.05; - if ( isDefined( self.hud_rankscroreupdate ) ) - { - if ( self.rankupdatetotal < 0 ) - { - self.hud_rankscroreupdate.label = &""; - self.hud_rankscroreupdate.color = ( 0.73, 0.19, 0.19 ); - } - else - { - self.hud_rankscroreupdate.label = &"MP_PLUS"; - self.hud_rankscroreupdate.color = ( 1, 1, 0.5 ); - } - self.hud_rankscroreupdate setvalue( self.rankupdatetotal ); - self.hud_rankscroreupdate.alpha = 0.85; - self.hud_rankscroreupdate thread maps/mp/gametypes/_hud::fontpulse( self ); - wait 1; - self.hud_rankscroreupdate fadeovertime( 0.75 ); - self.hud_rankscroreupdate.alpha = 0; - self.rankupdatetotal = 0; - } + self endon( "disconnect" ); + self endon( "joined_team" ); + self endon( "joined_spectators" ); + + if ( isdefined( level.usingmomentum ) && level.usingmomentum ) + return; + + if ( amount == 0 ) + return; + + self notify( "update_score" ); + self endon( "update_score" ); + self.rankupdatetotal += amount; + wait 0.05; + + if ( isdefined( self.hud_rankscroreupdate ) ) + { + if ( self.rankupdatetotal < 0 ) + { + self.hud_rankscroreupdate.label = &""; + self.hud_rankscroreupdate.color = ( 0.73, 0.19, 0.19 ); + } + else + { + self.hud_rankscroreupdate.label = &"MP_PLUS"; + self.hud_rankscroreupdate.color = ( 1, 1, 0.5 ); + } + + self.hud_rankscroreupdate setvalue( self.rankupdatetotal ); + self.hud_rankscroreupdate.alpha = 0.85; + self.hud_rankscroreupdate thread maps\mp\gametypes\_hud::fontpulse( self ); + wait 1; + self.hud_rankscroreupdate fadeovertime( 0.75 ); + self.hud_rankscroreupdate.alpha = 0; + self.rankupdatetotal = 0; + } } -updatemomentumhud( amount, reason, reasonvalue ) //checked matches cerberus output +updatemomentumhud( amount, reason, reasonvalue ) { - self endon( "disconnect" ); - self endon( "joined_team" ); - self endon( "joined_spectators" ); - if ( amount == 0 ) - { - return; - } - self notify( "update_score" ); - self endon( "update_score" ); - self.rankupdatetotal += amount; - if ( isDefined( self.hud_rankscroreupdate ) ) - { - if ( self.rankupdatetotal < 0 ) - { - self.hud_rankscroreupdate.label = &""; - self.hud_rankscroreupdate.color = ( 0.73, 0.19, 0.19 ); - } - else - { - self.hud_rankscroreupdate.label = &"MP_PLUS"; - self.hud_rankscroreupdate.color = ( 1, 1, 0.5 ); - } - self.hud_rankscroreupdate setvalue( self.rankupdatetotal ); - self.hud_rankscroreupdate.alpha = 0.85; - self.hud_rankscroreupdate thread maps/mp/gametypes/_hud::fontpulse( self ); - if ( isDefined( self.hud_momentumreason ) ) - { - if ( isDefined( reason ) ) - { - if ( isDefined( reasonvalue ) ) - { - self.hud_momentumreason.label = reason; - self.hud_momentumreason setvalue( reasonvalue ); - } - else - { - self.hud_momentumreason.label = reason; - self.hud_momentumreason setvalue( amount ); - } - self.hud_momentumreason.alpha = 0.85; - self.hud_momentumreason thread maps/mp/gametypes/_hud::fontpulse( self ); - } - else - { - self.hud_momentumreason fadeovertime( 0.01 ); - self.hud_momentumreason.alpha = 0; - } - } - wait 1; - self.hud_rankscroreupdate fadeovertime( 0.75 ); - self.hud_rankscroreupdate.alpha = 0; - if ( isDefined( self.hud_momentumreason ) && isDefined( reason ) ) - { - self.hud_momentumreason fadeovertime( 0.75 ); - self.hud_momentumreason.alpha = 0; - } - wait 0.75; - self.rankupdatetotal = 0; - } + self endon( "disconnect" ); + self endon( "joined_team" ); + self endon( "joined_spectators" ); + + if ( amount == 0 ) + return; + + self notify( "update_score" ); + self endon( "update_score" ); + self.rankupdatetotal += amount; + + if ( isdefined( self.hud_rankscroreupdate ) ) + { + if ( self.rankupdatetotal < 0 ) + { + self.hud_rankscroreupdate.label = &""; + self.hud_rankscroreupdate.color = ( 0.73, 0.19, 0.19 ); + } + else + { + self.hud_rankscroreupdate.label = &"MP_PLUS"; + self.hud_rankscroreupdate.color = ( 1, 1, 0.5 ); + } + + self.hud_rankscroreupdate setvalue( self.rankupdatetotal ); + self.hud_rankscroreupdate.alpha = 0.85; + self.hud_rankscroreupdate thread maps\mp\gametypes\_hud::fontpulse( self ); + + if ( isdefined( self.hud_momentumreason ) ) + { + if ( isdefined( reason ) ) + { + if ( isdefined( reasonvalue ) ) + { + self.hud_momentumreason.label = reason; + self.hud_momentumreason setvalue( reasonvalue ); + } + else + { + self.hud_momentumreason.label = reason; + self.hud_momentumreason setvalue( amount ); + } + + self.hud_momentumreason.alpha = 0.85; + self.hud_momentumreason thread maps\mp\gametypes\_hud::fontpulse( self ); + } + else + { + self.hud_momentumreason fadeovertime( 0.01 ); + self.hud_momentumreason.alpha = 0; + } + } + + wait 1; + self.hud_rankscroreupdate fadeovertime( 0.75 ); + self.hud_rankscroreupdate.alpha = 0; + + if ( isdefined( self.hud_momentumreason ) && isdefined( reason ) ) + { + self.hud_momentumreason fadeovertime( 0.75 ); + self.hud_momentumreason.alpha = 0; + } + + wait 0.75; + self.rankupdatetotal = 0; + } } -removerankhud() //checked matches cerberus output +removerankhud() { - if ( isDefined( self.hud_rankscroreupdate ) ) - { - self.hud_rankscroreupdate.alpha = 0; - } - if ( isDefined( self.hud_momentumreason ) ) - { - self.hud_momentumreason.alpha = 0; - } + if ( isdefined( self.hud_rankscroreupdate ) ) + self.hud_rankscroreupdate.alpha = 0; + + if ( isdefined( self.hud_momentumreason ) ) + self.hud_momentumreason.alpha = 0; } -getrank() //checked matches cerberus output +getrank() { - rankxp = getrankxpcapped( self.pers[ "rankxp" ] ); - rankid = self.pers[ "rank" ]; - if ( rankxp < ( getrankinfominxp( rankid ) + getrankinfoxpamt( rankid ) ) ) - { - return rankid; - } - else - { - return self getrankforxp( rankxp ); - } + rankxp = getrankxpcapped( self.pers["rankxp"] ); + rankid = self.pers["rank"]; + + if ( rankxp < getrankinfominxp( rankid ) + getrankinfoxpamt( rankid ) ) + return rankid; + else + return self getrankforxp( rankxp ); } -getrankforxp( xpval ) //checked matches cerberus output +getrankforxp( xpval ) { - rankid = 0; - rankname = level.ranktable[ rankid ][ 1 ]; - /* + rankid = 0; + rankname = level.ranktable[rankid][1]; /# - assert( isDefined( rankname ) ); + assert( isdefined( rankname ) ); #/ - */ - while ( isDefined( rankname ) && rankname != "" ) - { - if ( xpval < ( getrankinfominxp( rankid ) + getrankinfoxpamt( rankid ) ) ) - { - return rankid; - } - rankid++; - if ( isDefined( level.ranktable[ rankid ] ) ) - { - rankname = level.ranktable[ rankid ][ 1 ]; - continue; - } - else - { - rankname = undefined; - } - } - rankid--; - return rankid; + while ( isdefined( rankname ) && rankname != "" ) + { + if ( xpval < getrankinfominxp( rankid ) + getrankinfoxpamt( rankid ) ) + return rankid; + + rankid++; + + if ( isdefined( level.ranktable[rankid] ) ) + rankname = level.ranktable[rankid][1]; + else + rankname = undefined; + } + + rankid--; + return rankid; } -getspm() //checked matches cerberus output +getspm() { - ranklevel = self getrank() + 1; - return ( 3 + ( ranklevel * 0.5 ) ) * 10; + ranklevel = self getrank() + 1; + return ( 3 + ranklevel * 0.5 ) * 10; } -getrankxp() //checked matches cerberus output +getrankxp() { - return getrankxpcapped( self.pers[ "rankxp" ] ); + return getrankxpcapped( self.pers["rankxp"] ); } -incrankxp( amount ) //checked matches cerberus output +incrankxp( amount ) { - if ( !level.rankedmatch ) - { - return 0; - } - xp = self getrankxp(); - newxp = getrankxpcapped( xp + amount ); - if ( self.pers[ "rank" ] == level.maxrank && newxp >= getrankinfomaxxp( level.maxrank ) ) - { - newxp = getrankinfomaxxp( level.maxrank ); - } - xpincrease = getrankxpcapped( newxp ) - self.pers[ "rankxp" ]; - if ( xpincrease < 0 ) - { - xpincrease = 0; - } - self.pers[ "rankxp" ] = getrankxpcapped( newxp ); - return xpincrease; + if ( !level.rankedmatch ) + return 0; + + xp = self getrankxp(); + newxp = getrankxpcapped( xp + amount ); + + if ( self.pers["rank"] == level.maxrank && newxp >= getrankinfomaxxp( level.maxrank ) ) + newxp = getrankinfomaxxp( level.maxrank ); + + xpincrease = getrankxpcapped( newxp ) - self.pers["rankxp"]; + + if ( xpincrease < 0 ) + xpincrease = 0; + + self.pers["rankxp"] = getrankxpcapped( newxp ); + return xpincrease; } -syncxpstat() //checked matches cerberus output +syncxpstat() { - xp = getrankxpcapped( self getrankxp() ); - cp = getcodpointscapped( int( self.pers[ "codpoints" ] ) ); - self setdstat( "playerstatslist", "rankxp", "StatValue", xp ); - self setdstat( "playerstatslist", "codpoints", "StatValue", cp ); + xp = getrankxpcapped( self getrankxp() ); + cp = getcodpointscapped( int( self.pers["codpoints"] ) ); + self setdstat( "playerstatslist", "rankxp", "StatValue", xp ); + self setdstat( "playerstatslist", "codpoints", "StatValue", cp ); } - diff --git a/Multiplayer Core/patch_mp/maps/mp/gametypes/_scoreboard.gsc b/Multiplayer Core/patch_mp/maps/mp/gametypes/_scoreboard.gsc index d7e63dd..8364641 100644 --- a/Multiplayer Core/patch_mp/maps/mp/gametypes/_scoreboard.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/gametypes/_scoreboard.gsc @@ -1,18 +1,19 @@ +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool -init() //checked matches cerberus output +init() { - if ( level.createfx_enabled ) - { - return; - } - if ( sessionmodeiszombiesgame() ) - { - setdvar( "g_TeamIcon_Axis", "faction_cia" ); - setdvar( "g_TeamIcon_Allies", "faction_cdc" ); - } - else - { - setdvar( "g_TeamIcon_Axis", game[ "icons" ][ "axis" ] ); - setdvar( "g_TeamIcon_Allies", game[ "icons" ][ "allies" ] ); - } + if ( level.createfx_enabled ) + return; + + if ( sessionmodeiszombiesgame() ) + { + setdvar( "g_TeamIcon_Axis", "faction_cia" ); + setdvar( "g_TeamIcon_Allies", "faction_cdc" ); + } + else + { + setdvar( "g_TeamIcon_Axis", game["icons"]["axis"] ); + setdvar( "g_TeamIcon_Allies", game["icons"]["allies"] ); + } } diff --git a/Multiplayer Core/patch_mp/maps/mp/gametypes/_serversettings.gsc b/Multiplayer Core/patch_mp/maps/mp/gametypes/_serversettings.gsc index cb34b8a..ff5002b 100644 --- a/Multiplayer Core/patch_mp/maps/mp/gametypes/_serversettings.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/gametypes/_serversettings.gsc @@ -1,202 +1,191 @@ +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool -init() //checked matches cerberus output +init() { - level.hostname = getDvar( "sv_hostname" ); - if ( level.hostname == "" ) - { - level.hostname = "CoDHost"; - } - setdvar( "sv_hostname", level.hostname ); - setdvar( "ui_hostname", level.hostname ); - makedvarserverinfo( "ui_hostname", "CoDHost" ); - level.motd = getDvar( "scr_motd" ); - if ( level.motd == "" ) - { - level.motd = ""; - } - setdvar( "scr_motd", level.motd ); - setdvar( "ui_motd", level.motd ); - makedvarserverinfo( "ui_motd", "" ); - level.allowvote = getDvar( "g_allowVote" ); - if ( level.allowvote == "" ) - { - level.allowvote = "1"; - } - setdvar( "g_allowvote", level.allowvote ); - setdvar( "ui_allowvote", level.allowvote ); - makedvarserverinfo( "ui_allowvote", "1" ); - level.allow_teamchange = "0"; - if ( sessionmodeisprivate() || !sessionmodeisonlinegame() ) - { - level.allow_teamchange = "1"; - } - setdvar( "ui_allow_teamchange", level.allow_teamchange ); - level.friendlyfire = getgametypesetting( "friendlyfiretype" ); - setdvar( "ui_friendlyfire", level.friendlyfire ); - makedvarserverinfo( "ui_friendlyfire", "0" ); - if ( getDvar( "scr_mapsize" ) == "" ) - { - setdvar( "scr_mapsize", "64" ); - } - else if ( getDvarFloat( "scr_mapsize" ) >= 64 ) - { - setdvar( "scr_mapsize", "64" ); - } - else if ( getDvarFloat( "scr_mapsize" ) >= 32 ) - { - setdvar( "scr_mapsize", "32" ); - } - else if ( getDvarFloat( "scr_mapsize" ) >= 16 ) - { - setdvar( "scr_mapsize", "16" ); - } - else - { - setdvar( "scr_mapsize", "8" ); - } - level.mapsize = getDvarFloat( "scr_mapsize" ); - constraingametype( getDvar( "g_gametype" ) ); - constrainmapsize( level.mapsize ); - for ( ;; ) - { - updateserversettings(); - wait 5; - } + level.hostname = getdvar( "sv_hostname" ); + + if ( level.hostname == "" ) + level.hostname = "CoDHost"; + + setdvar( "sv_hostname", level.hostname ); + setdvar( "ui_hostname", level.hostname ); + makedvarserverinfo( "ui_hostname", "CoDHost" ); + level.motd = getdvar( "scr_motd" ); + + if ( level.motd == "" ) + level.motd = ""; + + setdvar( "scr_motd", level.motd ); + setdvar( "ui_motd", level.motd ); + makedvarserverinfo( "ui_motd", "" ); + level.allowvote = getdvar( "g_allowVote" ); + + if ( level.allowvote == "" ) + level.allowvote = "1"; + + setdvar( "g_allowvote", level.allowvote ); + setdvar( "ui_allowvote", level.allowvote ); + makedvarserverinfo( "ui_allowvote", "1" ); + level.allow_teamchange = "0"; + + if ( sessionmodeisprivate() || !sessionmodeisonlinegame() ) + level.allow_teamchange = "1"; + + setdvar( "ui_allow_teamchange", level.allow_teamchange ); + level.friendlyfire = getgametypesetting( "friendlyfiretype" ); + setdvar( "ui_friendlyfire", level.friendlyfire ); + makedvarserverinfo( "ui_friendlyfire", "0" ); + + if ( getdvar( "scr_mapsize" ) == "" ) + setdvar( "scr_mapsize", "64" ); + else if ( getdvarfloat( "scr_mapsize" ) >= 64 ) + setdvar( "scr_mapsize", "64" ); + else if ( getdvarfloat( "scr_mapsize" ) >= 32 ) + setdvar( "scr_mapsize", "32" ); + else if ( getdvarfloat( "scr_mapsize" ) >= 16 ) + setdvar( "scr_mapsize", "16" ); + else + setdvar( "scr_mapsize", "8" ); + + level.mapsize = getdvarfloat( "scr_mapsize" ); + constraingametype( getdvar( "g_gametype" ) ); + constrainmapsize( level.mapsize ); + + for (;;) + { + updateserversettings(); + wait 5; + } } -updateserversettings() //checked matches cerberus output +updateserversettings() { - sv_hostname = getDvar( "sv_hostname" ); - if ( level.hostname != sv_hostname ) - { - level.hostname = sv_hostname; - setdvar( "ui_hostname", level.hostname ); - } - scr_motd = getDvar( "scr_motd" ); - if ( level.motd != scr_motd ) - { - level.motd = scr_motd; - setdvar( "ui_motd", level.motd ); - } - g_allowvote = getDvar( "g_allowVote" ); - if ( level.allowvote != g_allowvote ) - { - level.allowvote = g_allowvote; - setdvar( "ui_allowvote", level.allowvote ); - } - scr_friendlyfire = getgametypesetting( "friendlyfiretype" ); - if ( level.friendlyfire != scr_friendlyfire ) - { - level.friendlyfire = scr_friendlyfire; - setdvar( "ui_friendlyfire", level.friendlyfire ); - } + sv_hostname = getdvar( "sv_hostname" ); + + if ( level.hostname != sv_hostname ) + { + level.hostname = sv_hostname; + setdvar( "ui_hostname", level.hostname ); + } + + scr_motd = getdvar( "scr_motd" ); + + if ( level.motd != scr_motd ) + { + level.motd = scr_motd; + setdvar( "ui_motd", level.motd ); + } + + g_allowvote = getdvar( "g_allowVote" ); + + if ( level.allowvote != g_allowvote ) + { + level.allowvote = g_allowvote; + setdvar( "ui_allowvote", level.allowvote ); + } + + scr_friendlyfire = getgametypesetting( "friendlyfiretype" ); + + if ( level.friendlyfire != scr_friendlyfire ) + { + level.friendlyfire = scr_friendlyfire; + setdvar( "ui_friendlyfire", level.friendlyfire ); + } } -constraingametype( gametype ) //checked partially changed to match cerberus output did not change while loop to for for loop because of infinite loop caused by continues +constraingametype( gametype ) { - entities = getentarray(); - i = 0; - while ( i < entities.size ) - { - entity = entities[ i ]; - if ( gametype == "dm" ) - { - if ( isDefined( entity.script_gametype_dm ) && entity.script_gametype_dm != "1" ) - { - entity delete(); - } - i++; - continue; - } - if ( gametype == "tdm" ) - { - if ( isDefined( entity.script_gametype_tdm ) && entity.script_gametype_tdm != "1" ) - { - entity delete(); - } - i++; - continue; - } - if ( gametype == "ctf" ) - { - if ( isDefined( entity.script_gametype_ctf ) && entity.script_gametype_ctf != "1" ) - { - entity delete(); - } - i++; - continue; - } - if ( gametype == "hq" ) - { - if ( isDefined( entity.script_gametype_hq ) && entity.script_gametype_hq != "1" ) - { - entity delete(); - } - i++; - continue; - } - if ( gametype == "sd" ) - { - if ( isDefined( entity.script_gametype_sd ) && entity.script_gametype_sd != "1" ) - { - entity delete(); - } - i++; - continue; - } - if ( gametype == "koth" ) - { - if ( isDefined( entity.script_gametype_koth ) && entity.script_gametype_koth != "1" ) - { - entity delete(); - } - } - i++; - } + entities = getentarray(); + + for ( i = 0; i < entities.size; i++ ) + { + entity = entities[i]; + + if ( gametype == "dm" ) + { + if ( isdefined( entity.script_gametype_dm ) && entity.script_gametype_dm != "1" ) + entity delete(); + + continue; + } + + if ( gametype == "tdm" ) + { + if ( isdefined( entity.script_gametype_tdm ) && entity.script_gametype_tdm != "1" ) + entity delete(); + + continue; + } + + if ( gametype == "ctf" ) + { + if ( isdefined( entity.script_gametype_ctf ) && entity.script_gametype_ctf != "1" ) + entity delete(); + + continue; + } + + if ( gametype == "hq" ) + { + if ( isdefined( entity.script_gametype_hq ) && entity.script_gametype_hq != "1" ) + entity delete(); + + continue; + } + + if ( gametype == "sd" ) + { + if ( isdefined( entity.script_gametype_sd ) && entity.script_gametype_sd != "1" ) + entity delete(); + + continue; + } + + if ( gametype == "koth" ) + { + if ( isdefined( entity.script_gametype_koth ) && entity.script_gametype_koth != "1" ) + entity delete(); + } + } } -constrainmapsize( mapsize ) //checked partially changed to match cerberus output did not change while loop to for for loop because of infinite loop caused by continues +constrainmapsize( mapsize ) { - entities = getentarray(); - i = 0; - while ( i < entities.size ) - { - entity = entities[ i ]; - if ( int( mapsize ) == 8 ) - { - if ( isDefined( entity.script_mapsize_08 ) && entity.script_mapsize_08 != "1" ) - { - entity delete(); - } - i++; - continue; - } - if ( int( mapsize ) == 16 ) - { - if ( isDefined( entity.script_mapsize_16 ) && entity.script_mapsize_16 != "1" ) - { - entity delete(); - } - i++; - continue; - } - if ( int( mapsize ) == 32 ) - { - if ( isDefined( entity.script_mapsize_32 ) && entity.script_mapsize_32 != "1" ) - { - entity delete(); - } - i++; - continue; - } - if ( int( mapsize ) == 64 ) - { - if ( isDefined( entity.script_mapsize_64 ) && entity.script_mapsize_64 != "1" ) - { - entity delete(); - } - } - i++; - } -} + entities = getentarray(); + for ( i = 0; i < entities.size; i++ ) + { + entity = entities[i]; + + if ( int( mapsize ) == 8 ) + { + if ( isdefined( entity.script_mapsize_08 ) && entity.script_mapsize_08 != "1" ) + entity delete(); + + continue; + } + + if ( int( mapsize ) == 16 ) + { + if ( isdefined( entity.script_mapsize_16 ) && entity.script_mapsize_16 != "1" ) + entity delete(); + + continue; + } + + if ( int( mapsize ) == 32 ) + { + if ( isdefined( entity.script_mapsize_32 ) && entity.script_mapsize_32 != "1" ) + entity delete(); + + continue; + } + + if ( int( mapsize ) == 64 ) + { + if ( isdefined( entity.script_mapsize_64 ) && entity.script_mapsize_64 != "1" ) + entity delete(); + } + } +} diff --git a/Multiplayer Core/patch_mp/maps/mp/gametypes/_shellshock.gsc b/Multiplayer Core/patch_mp/maps/mp/gametypes/_shellshock.gsc index 8a29ed1..1ff3fc3 100644 --- a/Multiplayer Core/patch_mp/maps/mp/gametypes/_shellshock.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/gametypes/_shellshock.gsc @@ -1,65 +1,57 @@ -#include common_scripts/utility; -#include maps/mp/_utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool init() { - precacheshellshock( "frag_grenade_mp" ); - precacheshellshock( "damage_mp" ); - precacherumble( "artillery_rumble" ); - precacherumble( "grenade_rumble" ); + precacheshellshock( "frag_grenade_mp" ); + precacheshellshock( "damage_mp" ); + precacherumble( "artillery_rumble" ); + precacherumble( "grenade_rumble" ); } shellshockondamage( cause, damage ) { - if ( self maps/mp/_utility::isflashbanged() ) - { - return; - } - if ( cause == "MOD_EXPLOSIVE" || cause == "MOD_GRENADE" || cause == "MOD_GRENADE_SPLASH" || cause == "MOD_PROJECTILE" || cause == "MOD_PROJECTILE_SPLASH" ) - { - time = 0; - if ( damage >= 90 ) - { - time = 4; - } - else if ( damage >= 50 ) - { - time = 3; - } - else if ( damage >= 25 ) - { - time = 2; - } - if ( damage > 10 ) - { - time = 2; - } - if ( time ) - { - if ( self mayapplyscreeneffect() ) - { - self shellshock( "frag_grenade_mp", 0.5 ); - } - } - } + if ( self maps\mp\_utility::isflashbanged() ) + return; + + if ( cause == "MOD_EXPLOSIVE" || cause == "MOD_GRENADE" || cause == "MOD_GRENADE_SPLASH" || cause == "MOD_PROJECTILE" || cause == "MOD_PROJECTILE_SPLASH" ) + { + time = 0; + + if ( damage >= 90 ) + time = 4; + else if ( damage >= 50 ) + time = 3; + else if ( damage >= 25 ) + time = 2; + else if ( damage > 10 ) + time = 2; + + if ( time ) + { + if ( self mayapplyscreeneffect() ) + self shellshock( "frag_grenade_mp", 0.5 ); + } + } } endondeath() { - self waittill( "death" ); - waittillframeend; - self notify( "end_explode" ); + self waittill( "death" ); + + waittillframeend; + self notify( "end_explode" ); } endontimer( timer ) { - self endon( "disconnect" ); - wait timer; - self notify( "end_on_timer" ); + self endon( "disconnect" ); + wait( timer ); + self notify( "end_on_timer" ); } rcbomb_earthquake( position ) { - playrumbleonposition( "grenade_rumble", position ); - earthquake( 0.5, 0.5, self.origin, 512 ); + playrumbleonposition( "grenade_rumble", position ); + earthquake( 0.5, 0.5, self.origin, 512 ); } diff --git a/Multiplayer Core/patch_mp/maps/mp/gametypes/_spawning.gsc b/Multiplayer Core/patch_mp/maps/mp/gametypes/_spawning.gsc index 1f428cd..66b6c7e 100644 --- a/Multiplayer Core/patch_mp/maps/mp/gametypes/_spawning.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/gametypes/_spawning.gsc @@ -1,1275 +1,1169 @@ -//checked includes match cerberus output -#include maps/mp/gametypes/_spawnlogic; -#include maps/mp/gametypes/_callbacksetup; -#include maps/mp/_tacticalinsertion; -#include maps/mp/killstreaks/_airsupport; -#include common_scripts/utility; -#include maps/mp/_utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool -init() //checked changed to match cerberus output dvars taken from beta dump +init() { - if ( !isDefined( level.gamemodespawndvars ) ) - { - level.gamemodespawndvars = ::default_gamemodespawndvars; - } - level init_spawn_system(); - level.recently_deceased = []; - foreach ( team in level.teams ) - { - level.recently_deceased[ team ] = spawn_array_struct(); - } - level thread onplayerconnect(); - if ( getDvar( "scr_spawn_visibility_check_max" ) == "" ) - { - level.spawn_visibility_check_max = 20; - } - else - { - level.spawn_visibility_check_max = getDvarInt( "scr_spawn_visibility_check_max" ); - } - level.spawnprotectiontime = getgametypesetting( "spawnprotectiontime" ); - /* + if ( !isdefined( level.gamemodespawndvars ) ) + level.gamemodespawndvars = ::default_gamemodespawndvars; + + level init_spawn_system(); + level.recently_deceased = []; + + foreach ( team in level.teams ) + level.recently_deceased[team] = spawn_array_struct(); + + level thread onplayerconnect(); + + if ( getdvar( _hash_AD6C19FE ) == "" ) + level.spawn_visibility_check_max = 20; + else + level.spawn_visibility_check_max = getdvarint( _hash_AD6C19FE ); + + level.spawnprotectiontime = getgametypesetting( "spawnprotectiontime" ); /# - setdvar( "scr_debug_spawn_player", "" ); - setdvar( "scr_debug_render_spawn_data", "1" ); - setdvar( "scr_debug_render_snapshotmode", "0" ); - setdvar( "scr_spawn_point_test_mode", "0" ); - level.test_spawn_point_index = 0; - setdvar( "scr_debug_render_spawn_text", "1" ); + setdvar( "scr_debug_spawn_player", "" ); + setdvar( "scr_debug_render_spawn_data", "1" ); + setdvar( "scr_debug_render_snapshotmode", "0" ); + setdvar( "scr_spawn_point_test_mode", "0" ); + level.test_spawn_point_index = 0; + setdvar( "scr_debug_render_spawn_text", "1" ); #/ - */ - return; + return; } -default_gamemodespawndvars( reset_dvars ) //checked matches cerberus output +default_gamemodespawndvars( reset_dvars ) { + } -init_spawn_system() //checked changed to match cerberus output +init_spawn_system() { - level.spawnsystem = spawnstruct(); - spawnsystem = level.spawnsystem; - level get_player_spawning_dvars( 1 ); - level thread initialize_player_spawning_dvars(); - spawnsystem.einfluencer_shape_sphere = 0; - spawnsystem.einfluencer_shape_cylinder = 1; - spawnsystem.einfluencer_type_normal = 0; - spawnsystem.einfluencer_type_player = 1; - spawnsystem.einfluencer_type_weapon = 2; - spawnsystem.einfluencer_type_dog = 3; - spawnsystem.einfluencer_type_vehicle = 4; - spawnsystem.einfluencer_type_game_mode = 6; - spawnsystem.einfluencer_type_enemy_spawned = 7; - spawnsystem.einfluencer_curve_constant = 0; - spawnsystem.einfluencer_curve_linear = 1; - spawnsystem.einfluencer_curve_steep = 2; - spawnsystem.einfluencer_curve_inverse_linear = 3; - spawnsystem.einfluencer_curve_negative_to_positive = 4; - spawnsystem.ispawn_teammask = []; - spawnsystem.ispawn_teammask_free = 1; - spawnsystem.ispawn_teammask[ "free" ] = spawnsystem.ispawn_teammask_free; - all = spawnsystem.ispawn_teammask_free; - count = 1; - foreach ( team in level.teams ) - { - //spawnsystem.ispawn_teammask[ team ] = 1 << count; //current compiler doesn't support bit shift left/right - all |= spawnsystem.ispawn_teammask[ team ]; - count++; - } - spawnsystem.ispawn_teammask[ "all" ] = all; + level.spawnsystem = spawnstruct(); + spawnsystem = level.spawnsystem; + level get_player_spawning_dvars( 1 ); + level thread initialize_player_spawning_dvars(); + spawnsystem.einfluencer_shape_sphere = 0; + spawnsystem.einfluencer_shape_cylinder = 1; + spawnsystem.einfluencer_type_normal = 0; + spawnsystem.einfluencer_type_player = 1; + spawnsystem.einfluencer_type_weapon = 2; + spawnsystem.einfluencer_type_dog = 3; + spawnsystem.einfluencer_type_vehicle = 4; + spawnsystem.einfluencer_type_game_mode = 6; + spawnsystem.einfluencer_type_enemy_spawned = 7; + spawnsystem.einfluencer_curve_constant = 0; + spawnsystem.einfluencer_curve_linear = 1; + spawnsystem.einfluencer_curve_steep = 2; + spawnsystem.einfluencer_curve_inverse_linear = 3; + spawnsystem.einfluencer_curve_negative_to_positive = 4; + spawnsystem.ispawn_teammask = []; + spawnsystem.ispawn_teammask_free = 1; + spawnsystem.ispawn_teammask["free"] = spawnsystem.ispawn_teammask_free; + all = spawnsystem.ispawn_teammask_free; + count = 1; + + foreach ( team in level.teams ) + { + spawnsystem.ispawn_teammask[team] = 1 << count; + all |= spawnsystem.ispawn_teammask[team]; + count++; + } + + spawnsystem.ispawn_teammask["all"] = all; } -onplayerconnect() //checked matches cerberus output +onplayerconnect() { - level endon( "game_ended" ); - for ( ;; ) - { - level waittill( "connecting", player ); - player setentertime( getTime() ); - player thread onplayerspawned(); - player thread ondisconnect(); - player thread onteamchange(); - player thread ongrenadethrow(); - } + level endon( "game_ended" ); + + for (;;) + { + level waittill( "connecting", player ); + + player setentertime( gettime() ); + player thread onplayerspawned(); + player thread ondisconnect(); + player thread onteamchange(); + player thread ongrenadethrow(); + } } -onplayerspawned() //checked matches cerberus output +onplayerspawned() { - self endon( "disconnect" ); - level endon( "game_ended" ); - for ( ;; ) - { - self waittill( "spawned_player" ); - self maps/mp/killstreaks/_airsupport::clearmonitoredspeed(); - self thread initialspawnprotection(); - self thread monitorgpsjammer(); - if ( is_true( self.pers[ "hasRadar" ] ) ) - { - self.hasspyplane = 1; - } - self enable_player_influencers( 1 ); - self thread ondeath(); - } + self endon( "disconnect" ); + level endon( "game_ended" ); + + for (;;) + { + self waittill( "spawned_player" ); + + self maps\mp\killstreaks\_airsupport::clearmonitoredspeed(); + self thread initialspawnprotection(); + self thread monitorgpsjammer(); + + if ( isdefined( self.pers["hasRadar"] ) && self.pers["hasRadar"] ) + self.hasspyplane = 1; + + self enable_player_influencers( 1 ); + self thread ondeath(); + } } -monitorgpsjammer() //checked changed to match cerberus output +monitorgpsjammer() { - self endon( "death" ); - self endon( "disconnect" ); - if ( self hasperk( "specialty_gpsjammer" ) == 0 ) - { - return; - } - self gpsjammeractive(); - graceperiods = getdvarintdefault( "perk_gpsjammer_graceperiods", 4 ); - minspeed = getdvarintdefault( "perk_gpsjammer_min_speed", 100 ); - mindistance = getdvarintdefault( "perk_gpsjammer_min_distance", 10 ); - timeperiod = getdvarintdefault( "perk_gpsjammer_time_period", 200 ); - timeperiodsec = timeperiod / 1000; - minspeedsq = minspeed * minspeed; - mindistancesq = mindistance * mindistance; - if ( minspeedsq == 0 ) - { - return; - } - /* + self endon( "death" ); + self endon( "disconnect" ); + + if ( self hasperk( "specialty_gpsjammer" ) == 0 ) + return; + + self gpsjammeractive(); + graceperiods = getdvarintdefault( "perk_gpsjammer_graceperiods", 4 ); + minspeed = getdvarintdefault( "perk_gpsjammer_min_speed", 100 ); + mindistance = getdvarintdefault( "perk_gpsjammer_min_distance", 10 ); + timeperiod = getdvarintdefault( "perk_gpsjammer_time_period", 200 ); + timeperiodsec = timeperiod / 1000; + minspeedsq = minspeed * minspeed; + mindistancesq = mindistance * mindistance; + + if ( minspeedsq == 0 ) + return; + /# - assert( timeperiodsec >= 0.05 ); + assert( timeperiodsec >= 0.05 ); #/ - */ - if ( timeperiodsec < 0.05 ) - { - return; - } - hasperk = 1; - statechange = 0; - faileddistancecheck = 0; - currentfailcount = 0; - timepassed = 0; - timesincedistancecheck = 0; - previousorigin = self.origin; - gpsjammerprotection = 0; - while ( 1 ) - { - /* + + if ( timeperiodsec < 0.05 ) + return; + + hasperk = 1; + statechange = 0; + faileddistancecheck = 0; + currentfailcount = 0; + timepassed = 0; + timesincedistancecheck = 0; + previousorigin = self.origin; + gpsjammerprotection = 0; + + while ( true ) + { /# - graceperiods = getdvarintdefault( "perk_gpsjammer_graceperiods", graceperiods ); - minspeed = getdvarintdefault( "perk_gpsjammer_min_speed", minspeed ); - mindistance = getdvarintdefault( "perk_gpsjammer_min_distance", mindistance ); - timeperiod = getdvarintdefault( "perk_gpsjammer_time_period", timeperiod ); - timeperiodsec = timeperiod / 1000; - minspeedsq = minspeed * minspeed; - mindistancesq = mindistance * mindistance; + graceperiods = getdvarintdefault( "perk_gpsjammer_graceperiods", graceperiods ); + minspeed = getdvarintdefault( "perk_gpsjammer_min_speed", minspeed ); + mindistance = getdvarintdefault( "perk_gpsjammer_min_distance", mindistance ); + timeperiod = getdvarintdefault( "perk_gpsjammer_time_period", timeperiod ); + timeperiodsec = timeperiod / 1000; + minspeedsq = minspeed * minspeed; + mindistancesq = mindistance * mindistance; #/ - */ - gpsjammerprotection = 0; - if ( isusingremote() || is_true( self.isplanting ) || is_true( self.isdefusing ) ) - { - gpsjammerprotection = 1; - } - else if ( timesincedistancecheck > 1 ) - { - timesincedistancecheck = 0; - if ( distancesquared( previousorigin, self.origin ) < mindistancesq ) - { - faileddistancecheck = 1; - } - else - { - faileddistancecheck = 0; - } - previousorigin = self.origin; - } - velocity = self getvelocity(); - speedsq = lengthsquared( velocity ); - if ( speedsq > minspeedsq && faileddistancecheck == 0 ) - { - gpsjammerprotection = 1; - } - if ( gpsjammerprotection == 1 ) - { - currentfailcount = 0; - if ( hasperk == 0 ) - { - statechange = 0; - hasperk = 1; - self gpsjammeractive(); - } - } - else - { - currentfailcount++; - if ( hasperk == 1 && currentfailcount >= graceperiods ) - { - statechange = 1; - hasperk = 0; - self gpsjammerinactive(); - } - } - if ( statechange == 1 ) - { - level notify( "radar_status_change" ); - } - timesincedistancecheck += timeperiodsec; - wait timeperiodsec; - } + gpsjammerprotection = 0; + + if ( isusingremote() || is_true( self.isplanting ) || is_true( self.isdefusing ) ) + gpsjammerprotection = 1; + else + { + if ( timesincedistancecheck > 1 ) + { + timesincedistancecheck = 0; + + if ( distancesquared( previousorigin, self.origin ) < mindistancesq ) + faileddistancecheck = 1; + else + faileddistancecheck = 0; + + previousorigin = self.origin; + } + + velocity = self getvelocity(); + speedsq = lengthsquared( velocity ); + + if ( speedsq > minspeedsq && faileddistancecheck == 0 ) + gpsjammerprotection = 1; + } + + if ( gpsjammerprotection == 1 ) + { + currentfailcount = 0; + + if ( hasperk == 0 ) + { + statechange = 0; + hasperk = 1; + self gpsjammeractive(); + } + } + else + { + currentfailcount++; + + if ( hasperk == 1 && currentfailcount >= graceperiods ) + { + statechange = 1; + hasperk = 0; + self gpsjammerinactive(); + } + } + + if ( statechange == 1 ) + level notify( "radar_status_change" ); + + timesincedistancecheck += timeperiodsec; + wait( timeperiodsec ); + } } -ondeath() //checked matches cerberus output +ondeath() { - self endon( "disconnect" ); - level endon( "game_ended" ); - self waittill( "death" ); - self enable_player_influencers( 0 ); - self create_body_influencers(); + self endon( "disconnect" ); + level endon( "game_ended" ); + + self waittill( "death" ); + + self enable_player_influencers( 0 ); + self create_body_influencers(); } -onteamchange() //checked matches cerberus output +onteamchange() { - self endon( "disconnect" ); - level endon( "game_ended" ); - while ( 1 ) - { - self waittill( "joined_team" ); - self player_influencers_set_team(); - wait 0.05; - } + self endon( "disconnect" ); + level endon( "game_ended" ); + + while ( true ) + { + self waittill( "joined_team" ); + + self player_influencers_set_team(); + wait 0.05; + } } -ongrenadethrow() //checked matches cerberus output +ongrenadethrow() { - self endon( "disconnect" ); - level endon( "game_ended" ); - while ( 1 ) - { - self waittill( "grenade_fire", grenade, weaponname ); - level thread create_grenade_influencers( self.pers[ "team" ], weaponname, grenade ); - wait 0.05; - } + self endon( "disconnect" ); + level endon( "game_ended" ); + + while ( true ) + { + self waittill( "grenade_fire", grenade, weaponname ); + + level thread create_grenade_influencers( self.pers["team"], weaponname, grenade ); + wait 0.05; + } } -ondisconnect() //checked matches cerberus output +ondisconnect() { - level endon( "game_ended" ); - self waittill( "disconnect" ); + level endon( "game_ended" ); + + self waittill( "disconnect" ); } -get_score_curve_index( curve ) //checked matches cerberus output +get_score_curve_index( curve ) { - switch( curve ) - { - case "linear": - return level.spawnsystem.einfluencer_curve_linear; - case "steep": - return level.spawnsystem.einfluencer_curve_steep; - case "inverse_linear": - return level.spawnsystem.einfluencer_curve_linear; - case "negative_to_positive": - return level.spawnsystem.einfluencer_curve_negative_to_positive; - case "constant": - default: - return level.spawnsystem.einfluencer_curve_constant; - } + switch ( curve ) + { + case "linear": + return level.spawnsystem.einfluencer_curve_linear; + case "steep": + return level.spawnsystem.einfluencer_curve_steep; + case "inverse_linear": + return level.spawnsystem.einfluencer_curve_linear; + case "negative_to_positive": + return level.spawnsystem.einfluencer_curve_negative_to_positive; + case "constant": + default: + return level.spawnsystem.einfluencer_curve_constant; + } } -get_influencer_type_index( curve ) //checked matches cerberus output +get_influencer_type_index( curve ) { + } -create_player_influencers() //checked changed to match cerberus output +create_player_influencers() { - /* /# - assert( !isDefined( self.influencer_enemy_sphere ) ); + assert( !isdefined( self.influencer_enemy_sphere ) ); #/ /# - assert( !isDefined( self.influencer_weapon_cylinder ) ); + assert( !isdefined( self.influencer_weapon_cylinder ) ); #/ /# - if ( level.teambased ) - { - assert( !isDefined( self.influencer_friendly_sphere ) ); - } + assert( !level.teambased || !isdefined( self.influencer_friendly_sphere ) ); #/ /# - if ( level.teambased ) - { - assert( !isDefined( self.influencer_friendly_cylinder ) ); - } + assert( !level.teambased || !isdefined( self.influencer_friendly_cylinder ) ); #/ - */ - if ( !level.teambased ) - { - team_mask = level.spawnsystem.ispawn_teammask_free; - other_team_mask = level.spawnsystem.ispawn_teammask_free; - weapon_team_mask = level.spawnsystem.ispawn_teammask_free; - } - else if ( isDefined( self.pers[ "team" ] ) ) - { - team = self.pers[ "team" ]; - team_mask = getteammask( team ); - other_team_mask = getotherteamsmask( team ); - weapon_team_mask = getotherteamsmask( team ); - } - else - { - team_mask = 0; - other_team_mask = 0; - weapon_team_mask = 0; - } - if ( level.hardcoremode ) - { - weapon_team_mask |= team_mask; - } - angles = self.angles; - origin = self.origin; - up = ( 0, 0, 1 ); - forward = ( 1, 0, 0 ); - cylinder_forward = up; - cylinder_up = forward; - self.influencer_enemy_sphere = addsphereinfluencer( level.spawnsystem.einfluencer_type_player, origin, level.spawnsystem.enemy_influencer_radius, level.spawnsystem.enemy_influencer_score, other_team_mask, "enemy,r,s", get_score_curve_index( level.spawnsystem.enemy_influencer_score_curve ), 0, self ); - if ( level.teambased ) - { - cylinder_up = -1 * forward; - self.influencer_friendly_sphere = addsphereinfluencer( level.spawnsystem.einfluencer_type_player, origin, level.spawnsystem.friend_weak_influencer_radius, level.spawnsystem.friend_weak_influencer_score, team_mask, "friend_weak,r,s", get_score_curve_index( level.spawnsystem.friend_weak_influencer_score_curve ), 0, self ); - } - self.spawn_influencers_created = 1; - if ( !isDefined( self.pers[ "team" ] ) || self.pers[ "team" ] == "spectator" ) - { - self enable_player_influencers( 0 ); - } + + if ( !level.teambased ) + { + team_mask = level.spawnsystem.ispawn_teammask_free; + other_team_mask = level.spawnsystem.ispawn_teammask_free; + weapon_team_mask = level.spawnsystem.ispawn_teammask_free; + } + else if ( isdefined( self.pers["team"] ) ) + { + team = self.pers["team"]; + team_mask = getteammask( team ); + other_team_mask = getotherteamsmask( team ); + weapon_team_mask = getotherteamsmask( team ); + } + else + { + team_mask = 0; + other_team_mask = 0; + weapon_team_mask = 0; + } + + if ( level.hardcoremode ) + weapon_team_mask |= team_mask; + + angles = self.angles; + origin = self.origin; + up = ( 0, 0, 1 ); + forward = ( 1, 0, 0 ); + cylinder_forward = up; + cylinder_up = forward; + self.influencer_enemy_sphere = addsphereinfluencer( level.spawnsystem.einfluencer_type_player, origin, level.spawnsystem.enemy_influencer_radius, level.spawnsystem.enemy_influencer_score, other_team_mask, "enemy,r,s", get_score_curve_index( level.spawnsystem.enemy_influencer_score_curve ), 0, self ); + + if ( level.teambased ) + { + cylinder_up = -1.0 * forward; + self.influencer_friendly_sphere = addsphereinfluencer( level.spawnsystem.einfluencer_type_player, origin, level.spawnsystem.friend_weak_influencer_radius, level.spawnsystem.friend_weak_influencer_score, team_mask, "friend_weak,r,s", get_score_curve_index( level.spawnsystem.friend_weak_influencer_score_curve ), 0, self ); + } + + self.spawn_influencers_created = 1; + + if ( !isdefined( self.pers["team"] ) || self.pers["team"] == "spectator" ) + self enable_player_influencers( 0 ); } -remove_player_influencers() //checked matches cerberus output +remove_player_influencers() { - if ( level.teambased && isDefined( self.influencer_friendly_sphere ) ) - { - removeinfluencer( self.influencer_friendly_sphere ); - self.influencer_friendly_sphere = undefined; - } - if ( level.teambased && isDefined( self.influencer_friendly_cylinder ) ) - { - removeinfluencer( self.influencer_friendly_cylinder ); - self.influencer_friendly_cylinder = undefined; - } - if ( isDefined( self.influencer_enemy_sphere ) ) - { - removeinfluencer( self.influencer_enemy_sphere ); - self.influencer_enemy_sphere = undefined; - } - if ( isDefined( self.influencer_weapon_cylinder ) ) - { - removeinfluencer( self.influencer_weapon_cylinder ); - self.influencer_weapon_cylinder = undefined; - } + if ( level.teambased && isdefined( self.influencer_friendly_sphere ) ) + { + removeinfluencer( self.influencer_friendly_sphere ); + self.influencer_friendly_sphere = undefined; + } + + if ( level.teambased && isdefined( self.influencer_friendly_cylinder ) ) + { + removeinfluencer( self.influencer_friendly_cylinder ); + self.influencer_friendly_cylinder = undefined; + } + + if ( isdefined( self.influencer_enemy_sphere ) ) + { + removeinfluencer( self.influencer_enemy_sphere ); + self.influencer_enemy_sphere = undefined; + } + + if ( isdefined( self.influencer_weapon_cylinder ) ) + { + removeinfluencer( self.influencer_weapon_cylinder ); + self.influencer_weapon_cylinder = undefined; + } } -enable_player_influencers( enabled ) //checked matches cerberus output +enable_player_influencers( enabled ) { - if ( !isDefined( self.spawn_influencers_created ) ) - { - self create_player_influencers(); - } - if ( isDefined( self.influencer_friendly_sphere ) ) - { - enableinfluencer( self.influencer_friendly_sphere, enabled ); - } - if ( isDefined( self.influencer_friendly_cylinder ) ) - { - enableinfluencer( self.influencer_friendly_cylinder, enabled ); - } - if ( isDefined( self.influencer_enemy_sphere ) ) - { - enableinfluencer( self.influencer_enemy_sphere, enabled ); - } - if ( isDefined( self.influencer_weapon_cylinder ) ) - { - enableinfluencer( self.influencer_weapon_cylinder, enabled ); - } + if ( !isdefined( self.spawn_influencers_created ) ) + self create_player_influencers(); + + if ( isdefined( self.influencer_friendly_sphere ) ) + enableinfluencer( self.influencer_friendly_sphere, enabled ); + + if ( isdefined( self.influencer_friendly_cylinder ) ) + enableinfluencer( self.influencer_friendly_cylinder, enabled ); + + if ( isdefined( self.influencer_enemy_sphere ) ) + enableinfluencer( self.influencer_enemy_sphere, enabled ); + + if ( isdefined( self.influencer_weapon_cylinder ) ) + enableinfluencer( self.influencer_weapon_cylinder, enabled ); } -player_influencers_set_team() //checked matches cerberus output +player_influencers_set_team() { - if ( !level.teambased ) - { - team_mask = level.spawnsystem.ispawn_teammask_free; - other_team_mask = level.spawnsystem.ispawn_teammask_free; - weapon_team_mask = level.spawnsystem.ispawn_teammask_free; - } - else - { - team = self.pers[ "team" ]; - team_mask = getteammask( team ); - other_team_mask = getotherteamsmask( team ); - weapon_team_mask = getotherteamsmask( team ); - } - if ( level.friendlyfire != 0 && level.teambased ) - { - weapon_team_mask |= team_mask; - } - if ( isDefined( self.influencer_friendly_sphere ) ) - { - setinfluencerteammask( self.influencer_friendly_sphere, team_mask ); - } - if ( isDefined( self.influencer_friendly_cylinder ) ) - { - setinfluencerteammask( self.influencer_friendly_cylinder, team_mask ); - } - if ( isDefined( self.influencer_enemy_sphere ) ) - { - setinfluencerteammask( self.influencer_enemy_sphere, other_team_mask ); - } - if ( isDefined( self.influencer_weapon_cylinder ) ) - { - setinfluencerteammask( self.influencer_weapon_cylinder, weapon_team_mask ); - } + if ( !level.teambased ) + { + team_mask = level.spawnsystem.ispawn_teammask_free; + other_team_mask = level.spawnsystem.ispawn_teammask_free; + weapon_team_mask = level.spawnsystem.ispawn_teammask_free; + } + else + { + team = self.pers["team"]; + team_mask = getteammask( team ); + other_team_mask = getotherteamsmask( team ); + weapon_team_mask = getotherteamsmask( team ); + } + + if ( level.friendlyfire != 0 && level.teambased ) + weapon_team_mask |= team_mask; + + if ( isdefined( self.influencer_friendly_sphere ) ) + setinfluencerteammask( self.influencer_friendly_sphere, team_mask ); + + if ( isdefined( self.influencer_friendly_cylinder ) ) + setinfluencerteammask( self.influencer_friendly_cylinder, team_mask ); + + if ( isdefined( self.influencer_enemy_sphere ) ) + setinfluencerteammask( self.influencer_enemy_sphere, other_team_mask ); + + if ( isdefined( self.influencer_weapon_cylinder ) ) + setinfluencerteammask( self.influencer_weapon_cylinder, weapon_team_mask ); } -create_body_influencers() //checked matches cerberus output +create_body_influencers() { - if ( level.teambased ) - { - team_mask = getteammask( self.pers[ "team" ] ); - } - else - { - team_mask = level.spawnsystem.ispawn_teammask_free; - } - addsphereinfluencer( level.spawnsystem.einfluencer_type_normal, self.origin, level.spawnsystem.dead_friend_influencer_radius, level.spawnsystem.dead_friend_influencer_score, team_mask, "dead_friend,r,s", get_score_curve_index( level.spawnsystem.dead_friend_influencer_score_curve ), level.spawnsystem.dead_friend_influencer_timeout_seconds ); + if ( level.teambased ) + team_mask = getteammask( self.pers["team"] ); + else + team_mask = level.spawnsystem.ispawn_teammask_free; + + addsphereinfluencer( level.spawnsystem.einfluencer_type_normal, self.origin, level.spawnsystem.dead_friend_influencer_radius, level.spawnsystem.dead_friend_influencer_score, team_mask, "dead_friend,r,s", get_score_curve_index( level.spawnsystem.dead_friend_influencer_score_curve ), level.spawnsystem.dead_friend_influencer_timeout_seconds ); } -create_grenade_influencers( parent_team, weaponname, grenade ) //checked matches cerberus output +create_grenade_influencers( parent_team, weaponname, grenade ) { - pixbeginevent( "create_grenade_influencers" ); - if ( !level.teambased ) - { - weapon_team_mask = level.spawnsystem.ispawn_teammask_free; - } - else - { - weapon_team_mask = getotherteamsmask( parent_team ); - if ( level.friendlyfire ) - { - weapon_team_mask |= getteammask( parent_team ); - } - } - if ( issubstr( weaponname, "napalmblob" ) || issubstr( weaponname, "gl_" ) ) - { - pixendevent(); - return; - } - timeout = 0; - if ( weaponname == "tabun_gas_mp" ) - { - timeout = 7; - } - if ( isDefined( grenade.origin ) ) - { - if ( weaponname == "claymore_mp" || weaponname == "bouncingbetty_mp" ) - { - addsphereinfluencer( level.spawnsystem.einfluencer_type_normal, grenade.origin, level.spawnsystem.claymore_influencer_radius, level.spawnsystem.claymore_influencer_score, weapon_team_mask, "claymore,r,s", get_score_curve_index( level.spawnsystem.claymore_influencer_score_curve ), timeout, grenade ); - } - else - { - addsphereinfluencer( level.spawnsystem.einfluencer_type_normal, grenade.origin, level.spawnsystem.grenade_influencer_radius, level.spawnsystem.grenade_influencer_score, weapon_team_mask, "grenade,r,s", get_score_curve_index( level.spawnsystem.grenade_influencer_score_curve ), timeout, grenade ); - } - } - pixendevent(); + pixbeginevent( "create_grenade_influencers" ); + + if ( !level.teambased ) + weapon_team_mask = level.spawnsystem.ispawn_teammask_free; + else + { + weapon_team_mask = getotherteamsmask( parent_team ); + + if ( level.friendlyfire ) + weapon_team_mask |= getteammask( parent_team ); + } + + if ( issubstr( weaponname, "napalmblob" ) || issubstr( weaponname, "gl_" ) ) + { + pixendevent(); + return; + } + + timeout = 0; + + if ( weaponname == "tabun_gas_mp" ) + timeout = 7.0; + + if ( isdefined( grenade.origin ) ) + { + if ( weaponname == "claymore_mp" || weaponname == "bouncingbetty_mp" ) + addsphereinfluencer( level.spawnsystem.einfluencer_type_normal, grenade.origin, level.spawnsystem.claymore_influencer_radius, level.spawnsystem.claymore_influencer_score, weapon_team_mask, "claymore,r,s", get_score_curve_index( level.spawnsystem.claymore_influencer_score_curve ), timeout, grenade ); + else + addsphereinfluencer( level.spawnsystem.einfluencer_type_normal, grenade.origin, level.spawnsystem.grenade_influencer_radius, level.spawnsystem.grenade_influencer_score, weapon_team_mask, "grenade,r,s", get_score_curve_index( level.spawnsystem.grenade_influencer_score_curve ), timeout, grenade ); + } + + pixendevent(); } -create_napalm_fire_influencers( point, direction, parent_team, duration ) //checked matches cerberus output +create_napalm_fire_influencers( point, direction, parent_team, duration ) { - timeout = duration; - weapon_team_mask = 0; - offset = vectorScale( anglesToForward( direction ), 1100 ); - addsphereinfluencer( level.spawnsystem.einfluencer_type_normal, point + ( 2 * offset ), level.spawnsystem.napalm_influencer_radius, level.spawnsystem.napalm_influencer_score, weapon_team_mask, "napalm,r,s", get_score_curve_index( level.spawnsystem.napalm_influencer_score_curve ), timeout ); - addsphereinfluencer( level.spawnsystem.einfluencer_type_normal, point + offset, level.spawnsystem.napalm_influencer_radius, level.spawnsystem.napalm_influencer_score, weapon_team_mask, "napalm,r,s", get_score_curve_index( level.spawnsystem.napalm_influencer_score_curve ), timeout ); - addsphereinfluencer( level.spawnsystem.einfluencer_type_normal, point, level.spawnsystem.napalm_influencer_radius, level.spawnsystem.napalm_influencer_score, weapon_team_mask, "napalm,r,s", get_score_curve_index( level.spawnsystem.napalm_influencer_score_curve ), timeout ); - addsphereinfluencer( level.spawnsystem.einfluencer_type_normal, point - offset, level.spawnsystem.napalm_influencer_radius, level.spawnsystem.napalm_influencer_score, weapon_team_mask, "napalm,r,s", get_score_curve_index( level.spawnsystem.napalm_influencer_score_curve ), timeout ); + timeout = duration; + weapon_team_mask = 0; + offset = vectorscale( anglestoforward( direction ), 1100 ); + addsphereinfluencer( level.spawnsystem.einfluencer_type_normal, point + 2.0 * offset, level.spawnsystem.napalm_influencer_radius, level.spawnsystem.napalm_influencer_score, weapon_team_mask, "napalm,r,s", get_score_curve_index( level.spawnsystem.napalm_influencer_score_curve ), timeout ); + addsphereinfluencer( level.spawnsystem.einfluencer_type_normal, point + offset, level.spawnsystem.napalm_influencer_radius, level.spawnsystem.napalm_influencer_score, weapon_team_mask, "napalm,r,s", get_score_curve_index( level.spawnsystem.napalm_influencer_score_curve ), timeout ); + addsphereinfluencer( level.spawnsystem.einfluencer_type_normal, point, level.spawnsystem.napalm_influencer_radius, level.spawnsystem.napalm_influencer_score, weapon_team_mask, "napalm,r,s", get_score_curve_index( level.spawnsystem.napalm_influencer_score_curve ), timeout ); + addsphereinfluencer( level.spawnsystem.einfluencer_type_normal, point - offset, level.spawnsystem.napalm_influencer_radius, level.spawnsystem.napalm_influencer_score, weapon_team_mask, "napalm,r,s", get_score_curve_index( level.spawnsystem.napalm_influencer_score_curve ), timeout ); } -create_auto_turret_influencer( point, parent_team, angles ) //checked matches cerberus output +create_auto_turret_influencer( point, parent_team, angles ) { - if ( !level.teambased ) - { - weapon_team_mask = level.spawnsystem.ispawn_teammask_free; - } - else - { - weapon_team_mask = getotherteamsmask( parent_team ); - } - projected_point = point + vectorScale( anglesToForward( angles ), level.spawnsystem.auto_turret_influencer_radius * 0.7 ); - influencerid = addsphereinfluencer( level.spawnsystem.einfluencer_type_normal, projected_point, level.spawnsystem.auto_turret_influencer_radius, level.spawnsystem.auto_turret_influencer_score, weapon_team_mask, "auto_turret,r,s", get_score_curve_index( level.spawnsystem.auto_turret_influencer_score_curve ) ); - return influencerid; + if ( !level.teambased ) + weapon_team_mask = level.spawnsystem.ispawn_teammask_free; + else + weapon_team_mask = getotherteamsmask( parent_team ); + + projected_point = point + vectorscale( anglestoforward( angles ), level.spawnsystem.auto_turret_influencer_radius * 0.7 ); + influencerid = addsphereinfluencer( level.spawnsystem.einfluencer_type_normal, projected_point, level.spawnsystem.auto_turret_influencer_radius, level.spawnsystem.auto_turret_influencer_score, weapon_team_mask, "auto_turret,r,s", get_score_curve_index( level.spawnsystem.auto_turret_influencer_score_curve ) ); + return influencerid; } -create_auto_turret_influencer_close( point, parent_team, angles ) //checked matches cerberus output +create_auto_turret_influencer_close( point, parent_team, angles ) { - if ( !level.teambased ) - { - weapon_team_mask = level.spawnsystem.ispawn_teammask_free; - } - else - { - weapon_team_mask = getotherteamsmask( parent_team ); - } - projected_point = point + vectorScale( anglesToForward( angles ), level.spawnsystem.auto_turret_influencer_close_radius * 0.7 ); - influencerid = addsphereinfluencer( level.spawnsystem.einfluencer_type_normal, projected_point, level.spawnsystem.auto_turret_influencer_close_radius, level.spawnsystem.auto_turret_influencer_close_score, weapon_team_mask, "auto_turret_close,r,s", get_score_curve_index( level.spawnsystem.auto_turret_influencer_close_score_curve ) ); - return influencerid; + if ( !level.teambased ) + weapon_team_mask = level.spawnsystem.ispawn_teammask_free; + else + weapon_team_mask = getotherteamsmask( parent_team ); + + projected_point = point + vectorscale( anglestoforward( angles ), level.spawnsystem.auto_turret_influencer_close_radius * 0.7 ); + influencerid = addsphereinfluencer( level.spawnsystem.einfluencer_type_normal, projected_point, level.spawnsystem.auto_turret_influencer_close_radius, level.spawnsystem.auto_turret_influencer_close_score, weapon_team_mask, "auto_turret_close,r,s", get_score_curve_index( level.spawnsystem.auto_turret_influencer_close_score_curve ) ); + return influencerid; } -create_dog_influencers() //checked matches cerberus output +create_dog_influencers() { - if ( !level.teambased ) - { - dog_enemy_team_mask = level.spawnsystem.ispawn_teammask_free; - } - else - { - dog_enemy_team_mask = getotherteamsmask( self.aiteam ); - } - addsphereinfluencer( level.spawnsystem.einfluencer_type_dog, self.origin, level.spawnsystem.dog_influencer_radius, level.spawnsystem.dog_influencer_score, dog_enemy_team_mask, "dog,r,s", get_score_curve_index( level.spawnsystem.dog_influencer_score_curve ), 0, self ); + if ( !level.teambased ) + dog_enemy_team_mask = level.spawnsystem.ispawn_teammask_free; + else + dog_enemy_team_mask = getotherteamsmask( self.aiteam ); + + addsphereinfluencer( level.spawnsystem.einfluencer_type_dog, self.origin, level.spawnsystem.dog_influencer_radius, level.spawnsystem.dog_influencer_score, dog_enemy_team_mask, "dog,r,s", get_score_curve_index( level.spawnsystem.dog_influencer_score_curve ), 0, self ); } -create_helicopter_influencers( parent_team ) //checked matches cerberus output +create_helicopter_influencers( parent_team ) { - if ( !level.teambased ) - { - team_mask = level.spawnsystem.ispawn_teammask_free; - } - else - { - team_mask = getotherteamsmask( parent_team ); - } - self.influencer_helicopter_cylinder = addcylinderinfluencer( level.spawnsystem.einfluencer_type_normal, self.origin, ( 0, 0, 0 ), ( 0, 0, 0 ), level.spawnsystem.helicopter_influencer_radius, level.spawnsystem.helicopter_influencer_length, level.spawnsystem.helicopter_influencer_score, team_mask, "helicopter,r,s", get_score_curve_index( level.spawnsystem.helicopter_influencer_score_curve ), 0, self ); + if ( !level.teambased ) + team_mask = level.spawnsystem.ispawn_teammask_free; + else + team_mask = getotherteamsmask( parent_team ); + + self.influencer_helicopter_cylinder = addcylinderinfluencer( level.spawnsystem.einfluencer_type_normal, self.origin, ( 0, 0, 0 ), ( 0, 0, 0 ), level.spawnsystem.helicopter_influencer_radius, level.spawnsystem.helicopter_influencer_length, level.spawnsystem.helicopter_influencer_score, team_mask, "helicopter,r,s", get_score_curve_index( level.spawnsystem.helicopter_influencer_score_curve ), 0, self ); } -remove_helicopter_influencers() //checked matches cerberus output +remove_helicopter_influencers() { - if ( isDefined( self.influencer_helicopter_cylinder ) ) - { - removeinfluencer( self.influencer_helicopter_cylinder ); - } - self.influencer_helicopter_cylinder = undefined; + if ( isdefined( self.influencer_helicopter_cylinder ) ) + removeinfluencer( self.influencer_helicopter_cylinder ); + + self.influencer_helicopter_cylinder = undefined; } -create_tvmissile_influencers( parent_team ) //checked matches cerberus output +create_tvmissile_influencers( parent_team ) { - if ( !level.teambased || is_hardcore() ) - { - team_mask = level.spawnsystem.ispawn_teammask_free; - } - else - { - team_mask = getotherteamsmask( parent_team ); - } - self.influencer_tvmissile_cylinder = addcylinderinfluencer( level.spawnsystem.einfluencer_type_normal, self.origin, ( 0, 0, 0 ), ( 0, 0, 0 ), level.spawnsystem.tvmissile_influencer_radius, level.spawnsystem.tvmissile_influencer_length, level.spawnsystem.tvmissile_influencer_score, team_mask, "tvmissile,r,s", get_score_curve_index( level.spawnsystem.tvmissile_influencer_score_curve ), 0, self ); + if ( !level.teambased || is_hardcore() ) + team_mask = level.spawnsystem.ispawn_teammask_free; + else + team_mask = getotherteamsmask( parent_team ); + + self.influencer_tvmissile_cylinder = addcylinderinfluencer( level.spawnsystem.einfluencer_type_normal, self.origin, ( 0, 0, 0 ), ( 0, 0, 0 ), level.spawnsystem.tvmissile_influencer_radius, level.spawnsystem.tvmissile_influencer_length, level.spawnsystem.tvmissile_influencer_score, team_mask, "tvmissile,r,s", get_score_curve_index( level.spawnsystem.tvmissile_influencer_score_curve ), 0, self ); } -remove_tvmissile_influencers() //checked matches cerberus output +remove_tvmissile_influencers() { - if ( isDefined( self.influencer_tvmissile_cylinder ) ) - { - removeinfluencer( self.influencer_tvmissile_cylinder ); - } - self.influencer_tvmissile_cylinder = undefined; + if ( isdefined( self.influencer_tvmissile_cylinder ) ) + removeinfluencer( self.influencer_tvmissile_cylinder ); + + self.influencer_tvmissile_cylinder = undefined; } -create_artillery_influencers( point, radius ) //checked changed to match cerberus output +create_artillery_influencers( point, radius ) { - weapon_team_mask = 0; - if ( radius < 0 ) - { - thisradius = level.spawnsystem.artillery_influencer_radius; - } - else - { - thisradius = radius; - } - return addcylinderinfluencer( level.spawnsystem.einfluencer_type_normal, point + vectorScale( ( 0, 0, 0 ), 2000 ), ( 1, 0, 0 ), ( 0, 0, 1 ), thisradius, 5000, level.spawnsystem.artillery_influencer_score, weapon_team_mask, "artillery,s,r", get_score_curve_index( level.spawnsystem.artillery_influencer_score_curve ), 7 ); + weapon_team_mask = 0; + + if ( radius < 0 ) + thisradius = level.spawnsystem.artillery_influencer_radius; + else + thisradius = radius; + + return addcylinderinfluencer( level.spawnsystem.einfluencer_type_normal, point + vectorscale( ( 0, 0, -1 ), 2000.0 ), ( 1, 0, 0 ), ( 0, 0, 1 ), thisradius, 5000, level.spawnsystem.artillery_influencer_score, weapon_team_mask, "artillery,s,r", get_score_curve_index( level.spawnsystem.artillery_influencer_score_curve ), 7 ); } -create_vehicle_influencers() //checked changed to match cerberus output +create_vehicle_influencers() { - weapon_team_mask = 0; - vehicleradius = 144; - cylinderlength = level.spawnsystem.vehicle_influencer_lead_seconds; - up = ( 0, 0, 1 ); - forward = ( 1, 0, 0 ); - cylinder_forward = up; - cylinder_up = forward; - return addcylinderinfluencer( level.spawnsystem.einfluencer_type_vehicle, self.origin, cylinder_forward, cylinder_up, vehicleradius, cylinderlength, level.spawnsystem.vehicle_influencer_score, weapon_team_mask, "vehicle,s", get_score_curve_index( level.spawnsystem.vehicle_influencer_score_curve ), 0, self ); + weapon_team_mask = 0; + vehicleradius = 144; + cylinderlength = level.spawnsystem.vehicle_influencer_lead_seconds; + up = ( 0, 0, 1 ); + forward = ( 1, 0, 0 ); + cylinder_forward = up; + cylinder_up = forward; + return addcylinderinfluencer( level.spawnsystem.einfluencer_type_vehicle, self.origin, cylinder_forward, cylinder_up, vehicleradius, cylinderlength, level.spawnsystem.vehicle_influencer_score, weapon_team_mask, "vehicle,s", get_score_curve_index( level.spawnsystem.vehicle_influencer_score_curve ), 0, self ); } -create_rcbomb_influencers( team ) //checked matches cerberus output +create_rcbomb_influencers( team ) { - if ( !level.teambased ) - { - other_team_mask = level.spawnsystem.ispawn_teammask_free; - } - else - { - other_team_mask = getotherteamsmask( team ); - } - return addsphereinfluencer( level.spawnsystem.einfluencer_type_normal, self.origin, level.spawnsystem.rcbomb_influencer_radius, level.spawnsystem.rcbomb_influencer_score, other_team_mask, "rcbomb,r,s", get_score_curve_index( level.spawnsystem.rcbomb_influencer_score_curve ), 0, self ); + if ( !level.teambased ) + other_team_mask = level.spawnsystem.ispawn_teammask_free; + else + other_team_mask = getotherteamsmask( team ); + + return addsphereinfluencer( level.spawnsystem.einfluencer_type_normal, self.origin, level.spawnsystem.rcbomb_influencer_radius, level.spawnsystem.rcbomb_influencer_score, other_team_mask, "rcbomb,r,s", get_score_curve_index( level.spawnsystem.rcbomb_influencer_score_curve ), 0, self ); } -create_qrdrone_influencers( team ) //checked matches cerberus output +create_qrdrone_influencers( team ) { - if ( !level.teambased ) - { - other_team_mask = level.spawnsystem.ispawn_teammask_free; - } - else - { - other_team_mask = getotherteamsmask( team ); - } - self.influencer_qrdrone_cylinder = addcylinderinfluencer( level.spawnsystem.einfluencer_type_normal, self.origin, ( 0, 0, 0 ), ( 0, 0, 0 ), level.spawnsystem.qrdrone_cylinder_influencer_radius, level.spawnsystem.qrdrone_cylinder_influencer_length, level.spawnsystem.qrdrone_cylinder_influencer_score, other_team_mask, "qrdrone_cyl,r,s", get_score_curve_index( level.spawnsystem.qrdrone_cylinder_influencer_score_curve ), 0, self ); - return addsphereinfluencer( level.spawnsystem.einfluencer_type_normal, self.origin, level.spawnsystem.qrdrone_influencer_radius, level.spawnsystem.qrdrone_influencer_score, other_team_mask, "qrdrone,r,s", get_score_curve_index( level.spawnsystem.qrdrone_influencer_score_curve ), 0, self ); + if ( !level.teambased ) + other_team_mask = level.spawnsystem.ispawn_teammask_free; + else + other_team_mask = getotherteamsmask( team ); + + self.influencer_qrdrone_cylinder = addcylinderinfluencer( level.spawnsystem.einfluencer_type_normal, self.origin, ( 0, 0, 0 ), ( 0, 0, 0 ), level.spawnsystem.qrdrone_cylinder_influencer_radius, level.spawnsystem.qrdrone_cylinder_influencer_length, level.spawnsystem.qrdrone_cylinder_influencer_score, other_team_mask, "qrdrone_cyl,r,s", get_score_curve_index( level.spawnsystem.qrdrone_cylinder_influencer_score_curve ), 0, self ); + return addsphereinfluencer( level.spawnsystem.einfluencer_type_normal, self.origin, level.spawnsystem.qrdrone_influencer_radius, level.spawnsystem.qrdrone_influencer_score, other_team_mask, "qrdrone,r,s", get_score_curve_index( level.spawnsystem.qrdrone_influencer_score_curve ), 0, self ); } -create_aitank_influencers( team ) //checked matches cerberus output +create_aitank_influencers( team ) { - if ( !level.teambased ) - { - other_team_mask = level.spawnsystem.ispawn_teammask_free; - } - else - { - other_team_mask = getotherteamsmask( team ); - } - return addsphereinfluencer( level.spawnsystem.einfluencer_type_normal, self.origin, level.spawnsystem.aitank_influencer_radius, level.spawnsystem.aitank_influencer_score, other_team_mask, "aitank,r,s", get_score_curve_index( level.spawnsystem.aitank_influencer_score_curve ), 0, self ); + if ( !level.teambased ) + other_team_mask = level.spawnsystem.ispawn_teammask_free; + else + other_team_mask = getotherteamsmask( team ); + + return addsphereinfluencer( level.spawnsystem.einfluencer_type_normal, self.origin, level.spawnsystem.aitank_influencer_radius, level.spawnsystem.aitank_influencer_score, other_team_mask, "aitank,r,s", get_score_curve_index( level.spawnsystem.aitank_influencer_score_curve ), 0, self ); } -create_pegasus_influencer( origin, team ) //checked matches cerberus output +create_pegasus_influencer( origin, team ) { - if ( !level.teambased ) - { - other_team_mask = level.spawnsystem.ispawn_teammask_free; - } - else - { - other_team_mask = getotherteamsmask( team ); - } - return addsphereinfluencer( level.spawnsystem.einfluencer_type_normal, origin, level.spawnsystem.pegasus_influencer_radius, level.spawnsystem.pegasus_influencer_score, other_team_mask, "pegasus,r,s", get_score_curve_index( level.spawnsystem.pegasus_influencer_score_curve ), 0 ); + if ( !level.teambased ) + other_team_mask = level.spawnsystem.ispawn_teammask_free; + else + other_team_mask = getotherteamsmask( team ); + + return addsphereinfluencer( level.spawnsystem.einfluencer_type_normal, origin, level.spawnsystem.pegasus_influencer_radius, level.spawnsystem.pegasus_influencer_score, other_team_mask, "pegasus,r,s", get_score_curve_index( level.spawnsystem.pegasus_influencer_score_curve ), 0 ); } -create_map_placed_influencers() //checked partially changed to match cerberus output see info.md +create_map_placed_influencers() { - staticinfluencerents = getentarray( "mp_uspawn_influencer", "classname" ); - i = 0; - while ( i < staticinfluencerents.size ) - { - staticinfluencerent = staticinfluencerents[ i ]; - if ( isDefined( staticinfluencerent.script_gameobjectname ) && staticinfluencerent.script_gameobjectname == "twar" ) - { - i++; - continue; - } - create_map_placed_influencer( staticinfluencerent ); - i++; - } + staticinfluencerents = getentarray( "mp_uspawn_influencer", "classname" ); + + for ( i = 0; i < staticinfluencerents.size; i++ ) + { + staticinfluencerent = staticinfluencerents[i]; + + if ( isdefined( staticinfluencerent.script_gameobjectname ) && staticinfluencerent.script_gameobjectname == "twar" ) + continue; + + create_map_placed_influencer( staticinfluencerent ); + } } -create_map_placed_influencer( influencer_entity, optional_score_override ) //checked matches cerberus output +create_map_placed_influencer( influencer_entity, optional_score_override ) { - influencer_id = -1; - if ( isDefined( influencer_entity.script_shape ) && isDefined( influencer_entity.script_score ) && isDefined( influencer_entity.script_score_curve ) ) - { - switch( influencer_entity.script_shape ) - { - case "sphere": - if ( isDefined( influencer_entity.radius ) ) - { - if ( isDefined( optional_score_override ) ) - { - score = optional_score_override; - } - else - { - score = influencer_entity.script_score; - } - influencer_id = addsphereinfluencer( level.spawnsystem.einfluencer_type_game_mode, influencer_entity.origin, influencer_entity.radius, score, getteammask( influencer_entity.script_team ), "*map_defined", get_score_curve_index( influencer_entity.script_score_curve ) ); - } - else - { - /* + influencer_id = -1; + + if ( isdefined( influencer_entity.script_shape ) && isdefined( influencer_entity.script_score ) && isdefined( influencer_entity.script_score_curve ) ) + { + switch ( influencer_entity.script_shape ) + { + case "sphere": + if ( isdefined( influencer_entity.radius ) ) + { + if ( isdefined( optional_score_override ) ) + score = optional_score_override; + else + score = influencer_entity.script_score; + + influencer_id = addsphereinfluencer( level.spawnsystem.einfluencer_type_game_mode, influencer_entity.origin, influencer_entity.radius, score, getteammask( influencer_entity.script_team ), "*map_defined", get_score_curve_index( influencer_entity.script_score_curve ) ); + } + else + { /# - assertmsg( "Radiant-placed sphere spawn influencers require 'radius' parameter" ); + assertmsg( "Radiant-placed sphere spawn influencers require 'radius' parameter" ); #/ - */ - } - break; - case "cylinder": - if ( isDefined( influencer_entity.radius ) && isDefined( influencer_entity.height ) ) - { - if ( isDefined( optional_score_override ) ) - { - score = optional_score_override; - } - else - { - score = influencer_entity.script_score; - } - influencer_id = addcylinderinfluencer( level.spawnsystem.einfluencer_type_game_mode, influencer_entity.origin, anglesToForward( influencer_entity.angles ), anglesToUp( influencer_entity.angles ), influencer_entity.radius, influencer_entity.height, score, getteammask( influencer_entity.script_team ), "*map_defined", get_score_curve_index( influencer_entity.script_score_curve ) ); - } - else - { - /* + } + + break; + case "cylinder": + if ( isdefined( influencer_entity.radius ) && isdefined( influencer_entity.height ) ) + { + if ( isdefined( optional_score_override ) ) + score = optional_score_override; + else + score = influencer_entity.script_score; + + influencer_id = addcylinderinfluencer( level.spawnsystem.einfluencer_type_game_mode, influencer_entity.origin, anglestoforward( influencer_entity.angles ), anglestoup( influencer_entity.angles ), influencer_entity.radius, influencer_entity.height, score, getteammask( influencer_entity.script_team ), "*map_defined", get_score_curve_index( influencer_entity.script_score_curve ) ); + } + else + { /# - assertmsg( "Radiant-placed cylinder spawn influencers require 'radius' and 'height' parameters" ); -#/ - */ - } - break; - default: - /* -/# - assertmsg( "Unsupported script_shape value ("" + influencer_entity.script_shape + "") for unified spawning system static influencer. Supported shapes are "cylinder" and "sphere"." ); + assertmsg( "Radiant-placed cylinder spawn influencers require 'radius' and 'height' parameters" ); #/ - */ - break; - } - } - else - { - /* + } + + break; + default: /# - assertmsg( "Radiant-placed spawn influencers require 'script_shape', 'script_score' and 'script_score_curve' parameters" ); + assertmsg( "Unsupported script_shape value (\"" + influencer_entity.script_shape + "\") for unified spawning system static influencer. Supported shapes are \"cylinder\" and \"sphere\"." ); #/ - */ - } - return influencer_id; -} - -create_enemy_spawned_influencers( origin, team ) //checked matches cerberus output -{ - if ( !level.teambased ) - { - other_team_mask = level.spawnsystem.ispawn_teammask_free; - } - else - { - other_team_mask = getotherteamsmask( team ); - } - return addsphereinfluencer( level.spawnsystem.einfluencer_type_enemy_spawned, origin, level.spawnsystem.enemy_spawned_influencer_radius, level.spawnsystem.enemy_spawned_influencer_score, other_team_mask, "enemy_spawned,r,s", get_score_curve_index( level.spawnsystem.enemy_spawned_influencer_score_curve ), level.spawnsystem.enemy_spawned_influencer_timeout_seconds ); -} - -updateallspawnpoints() //checked changed to match beta dump -{ - foreach ( team in level.teams ) - { - gatherspawnentities( team ); - } - clearspawnpoints(); - if ( level.teambased ) - { - foreach ( team in level.teams ) - { - addspawnpoints( team, level.unified_spawn_points[ team ].a ); - } - } - else - { - foreach ( team in level.teams ) - { - addspawnpoints( "free", level.unified_spawn_points[ team ].a ); - } - } - remove_unused_spawn_entities(); -} - -initialize_player_spawning_dvars() //checked matches cerberus output -{ - /* + break; + } + } + else + { /# - reset_dvars = 1; - while ( 1 ) - { - get_player_spawning_dvars( reset_dvars ); - reset_dvars = 0; - wait 2; + assertmsg( "Radiant-placed spawn influencers require 'script_shape', 'script_score' and 'script_score_curve' parameters" ); #/ - } - */ + } + + return influencer_id; } -get_player_spawning_dvars( reset_dvars ) //checked matches cerberus output +create_enemy_spawned_influencers( origin, team ) { - k_player_height = get_player_height(); - player_height_times_10 = "" + ( 10 * k_player_height ); - ss = level.spawnsystem; - player_influencer_radius = 15 * k_player_height; - player_influencer_score = 150; - dog_influencer_radius = 10 * k_player_height; - dog_influencer_score = 150; - ss.script_based_influencer_system = set_dvar_int_if_unset( "scr_script_based_influencer_system", "0", reset_dvars ); - ss.randomness_range = set_dvar_float_if_unset( "scr_spawn_randomness_range", "0", reset_dvars ); - ss.objective_facing_bonus = set_dvar_float_if_unset( "scr_spawn_objective_facing_bonus", "0", reset_dvars ); - if ( level.multiteam ) - { - ss.friend_weak_influencer_score = set_dvar_float_if_unset( "scr_spawn_friend_weak_influencer_score", "200", reset_dvars ); - ss.friend_weak_influencer_score_curve = set_dvar_if_unset( "scr_spawn_friend_weak_influencer_score_curve", "linear", reset_dvars ); - ss.friend_weak_influencer_radius = set_dvar_float_if_unset( "scr_spawn_friend_weak_influencer_radius", "1200", reset_dvars ); - } - else - { - ss.friend_weak_influencer_score = set_dvar_float_if_unset( "scr_spawn_friend_weak_influencer_score", "20", reset_dvars ); - ss.friend_weak_influencer_score_curve = set_dvar_if_unset( "scr_spawn_friend_weak_influencer_score_curve", "linear", reset_dvars ); - ss.friend_weak_influencer_radius = set_dvar_float_if_unset( "scr_spawn_friend_weak_influencer_radius", "700", reset_dvars ); - } - ss.enemy_influencer_score = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_score", "-150", reset_dvars ); - ss.enemy_influencer_score_curve = set_dvar_if_unset( "scr_spawn_enemy_influencer_score_curve", "linear", reset_dvars ); - ss.enemy_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_radius", "2600", reset_dvars ); - ss.dead_friend_influencer_timeout_seconds = set_dvar_float_if_unset( "scr_spawn_dead_friend_influencer_timeout_seconds", "20", reset_dvars ); - ss.dead_friend_influencer_count = set_dvar_float_if_unset( "scr_spawn_dead_friend_influencer_count", "7", reset_dvars ); - ss.dead_friend_influencer_score = set_dvar_float_if_unset( "scr_spawn_dead_friend_influencer_score", "-100", reset_dvars ); - ss.dead_friend_influencer_score_curve = set_dvar_if_unset( "scr_spawn_dead_friend_influencer_score_curve", "steep", reset_dvars ); - ss.dead_friend_influencer_radius = set_dvar_float_if_unset( "scr_spawn_dead_friend_influencer_radius", player_height_times_10, reset_dvars ); - ss.vehicle_influencer_score = set_dvar_float_if_unset( "scr_spawn_vehicle_influencer_score", "-50", reset_dvars ); - ss.vehicle_influencer_score_curve = set_dvar_if_unset( "scr_spawn_vehicle_influencer_score_curve", "linear", reset_dvars ); - ss.vehicle_influencer_lead_seconds = set_dvar_float_if_unset( "scr_spawn_vehicle_influencer_lead_seconds", "3", reset_dvars ); - ss.dog_influencer_score = set_dvar_float_if_unset( "scr_spawn_dog_influencer_score", "-150", reset_dvars ); - ss.dog_influencer_score_curve = set_dvar_if_unset( "scr_spawn_dog_influencer_score_curve", "steep", reset_dvars ); - ss.dog_influencer_radius = set_dvar_float_if_unset( "scr_spawn_dog_influencer_radius", "" + ( 15 * k_player_height ), reset_dvars ); - ss.artillery_influencer_score = set_dvar_float_if_unset( "scr_spawn_artillery_influencer_score", "-600", reset_dvars ); - ss.artillery_influencer_score_curve = set_dvar_if_unset( "scr_spawn_artillery_influencer_score_curve", "linear", reset_dvars ); - ss.artillery_influencer_radius = set_dvar_float_if_unset( "scr_spawn_artillery_influencer_radius", "1200", reset_dvars ); - ss.grenade_influencer_score = set_dvar_float_if_unset( "scr_spawn_grenade_influencer_score", "-300", reset_dvars ); - ss.grenade_influencer_score_curve = set_dvar_if_unset( "scr_spawn_grenade_influencer_score_curve", "linear", reset_dvars ); - ss.grenade_influencer_radius = set_dvar_float_if_unset( "scr_spawn_grenade_influencer_radius", "" + ( 8 * k_player_height ), reset_dvars ); - ss.grenade_endpoint_influencer_score = set_dvar_float_if_unset( "scr_spawn_grenade_endpoint_influencer_score", "-300", reset_dvars ); - ss.grenade_endpoint_influencer_score_curve = set_dvar_if_unset( "scr_spawn_grenade_endpoint_influencer_score_curve", "linear", reset_dvars ); - ss.grenade_endpoint_influencer_radius = set_dvar_float_if_unset( "scr_spawn_grenade_endpoint_influencer_radius", "" + ( 8 * k_player_height ), reset_dvars ); - ss.claymore_influencer_score = set_dvar_float_if_unset( "scr_spawn_claymore_influencer_score", "-150", reset_dvars ); - ss.claymore_influencer_score_curve = set_dvar_if_unset( "scr_spawn_claymore_influencer_score_curve", "steep", reset_dvars ); - ss.claymore_influencer_radius = set_dvar_float_if_unset( "scr_spawn_claymore_influencer_radius", "" + ( 9 * k_player_height ), reset_dvars ); - ss.napalm_influencer_score = set_dvar_float_if_unset( "scr_spawn_napalm_influencer_score", "-500", reset_dvars ); - ss.napalm_influencer_score_curve = set_dvar_if_unset( "scr_spawn_napalm_influencer_score_curve", "linear", reset_dvars ); - ss.napalm_influencer_radius = set_dvar_float_if_unset( "scr_spawn_napalm_influencer_radius", "" + 750, reset_dvars ); - ss.auto_turret_influencer_score = set_dvar_float_if_unset( "scr_spawn_auto_turret_influencer_score", "-650", reset_dvars ); - ss.auto_turret_influencer_score_curve = set_dvar_if_unset( "scr_spawn_auto_turret_influencer_score_curve", "linear", reset_dvars ); - ss.auto_turret_influencer_radius = set_dvar_float_if_unset( "scr_spawn_auto_turret_influencer_radius", "" + 1200, reset_dvars ); - ss.auto_turret_influencer_close_score = set_dvar_float_if_unset( "scr_spawn_auto_turret_influencer_close_score", "-250000", reset_dvars ); - ss.auto_turret_influencer_close_score_curve = set_dvar_if_unset( "scr_spawn_auto_turret_influencer_close_score_curve", "constant", reset_dvars ); - ss.auto_turret_influencer_close_radius = set_dvar_float_if_unset( "scr_spawn_auto_turret_influencer_close_radius", "" + 500, reset_dvars ); - ss.rcbomb_influencer_score = set_dvar_float_if_unset( "scr_spawn_rcbomb_influencer_score", "-200", reset_dvars ); - ss.rcbomb_influencer_score_curve = set_dvar_if_unset( "scr_spawn_rcbomb_influencer_score_curve", "steep", reset_dvars ); - ss.rcbomb_influencer_radius = set_dvar_float_if_unset( "scr_spawn_rcbomb_influencer_radius", "" + ( 25 * k_player_height ), reset_dvars ); - ss.qrdrone_influencer_score = set_dvar_float_if_unset( "scr_spawn_qrdrone_influencer_score", "-200", reset_dvars ); - ss.qrdrone_influencer_score_curve = set_dvar_if_unset( "scr_spawn_qrdrone_influencer_score_curve", "steep", reset_dvars ); - ss.qrdrone_influencer_radius = set_dvar_float_if_unset( "scr_spawn_qrdrone_influencer_radius", "" + ( 25 * k_player_height ), reset_dvars ); - ss.qrdrone_cylinder_influencer_score = set_dvar_float_if_unset( "scr_spawn_qrdrone_cylinder_influencer_score", "-300", reset_dvars ); - ss.qrdrone_cylinder_influencer_score_curve = set_dvar_if_unset( "scr_spawn_qrdrone_cylinder_influencer_score_curve", "linear", reset_dvars ); - ss.qrdrone_cylinder_influencer_radius = set_dvar_float_if_unset( "scr_spawn_qrdrone_cylinder_influencer_radius", 1000, reset_dvars ); - ss.qrdrone_cylinder_influencer_length = set_dvar_float_if_unset( "scr_spawn_qrdrone_cylinder_influencer_length", 2000, reset_dvars ); - ss.aitank_influencer_score = set_dvar_float_if_unset( "scr_spawn_aitank_influencer_score", "-200", reset_dvars ); - ss.aitank_influencer_score_curve = set_dvar_if_unset( "scr_spawn_aitank_influencer_score_curve", "linear", reset_dvars ); - ss.aitank_influencer_radius = set_dvar_float_if_unset( "scr_spawn_aitank_influencer_radius", "" + ( 25 * k_player_height ), reset_dvars ); - ss.enemy_spawned_influencer_score_curve = set_dvar_if_unset( "scr_spawn_enemy_spawned_influencer_score_curve", "constant", reset_dvars ); - if ( level.multiteam ) - { - ss.enemy_spawned_influencer_score = set_dvar_float_if_unset( "scr_spawn_enemy_spawned_influencer_score", "-400", reset_dvars ); - ss.enemy_spawned_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_spawned_influencer_radius", "" + 1100, reset_dvars ); - } - else if ( level.teambased ) - { - ss.enemy_spawned_influencer_score = set_dvar_float_if_unset( "scr_spawn_enemy_spawned_influencer_score", "-400", reset_dvars ); - ss.enemy_spawned_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_spawned_influencer_radius", "" + 1100, reset_dvars ); - } - else - { - ss.enemy_spawned_influencer_score = set_dvar_float_if_unset( "scr_spawn_enemy_spawned_influencer_score", "-400", reset_dvars ); - ss.enemy_spawned_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_spawned_influencer_radius", "" + 1000, reset_dvars ); - } - ss.enemy_spawned_influencer_timeout_seconds = set_dvar_float_if_unset( "scr_spawn_enemy_spawned_influencer_timeout_seconds", "7", reset_dvars ); - ss.helicopter_influencer_score = set_dvar_float_if_unset( "scr_spawn_helicopter_influencer_score", "-500", reset_dvars ); - ss.helicopter_influencer_score_curve = set_dvar_if_unset( "scr_spawn_helicopter_influencer_score_curve", "linear", reset_dvars ); - ss.helicopter_influencer_radius = set_dvar_float_if_unset( "scr_spawn_helicopter_influencer_radius", "" + 2000, reset_dvars ); - ss.helicopter_influencer_length = set_dvar_float_if_unset( "scr_spawn_helicopter_influencer_length", "" + 3500, reset_dvars ); - ss.tvmissile_influencer_score = set_dvar_float_if_unset( "scr_spawn_tvmissile_influencer_score", "-400", reset_dvars ); - ss.tvmissile_influencer_score_curve = set_dvar_if_unset( "scr_spawn_tvmissile_influencer_score_curve", "linear", reset_dvars ); - ss.tvmissile_influencer_radius = set_dvar_float_if_unset( "scr_spawn_tvmissile_influencer_radius", "" + 2000, reset_dvars ); - ss.tvmissile_influencer_length = set_dvar_float_if_unset( "scr_spawn_tvmissile_influencer_length", "" + 3000, reset_dvars ); - ss.pegasus_influencer_score = set_dvar_float_if_unset( "scr_spawn_pegasus_influencer_score", "-250", reset_dvars ); - ss.pegasus_influencer_score_curve = set_dvar_if_unset( "scr_spawn_pegasus_influencer_score_curve", "linear", reset_dvars ); - ss.pegasus_influencer_radius = set_dvar_float_if_unset( "scr_spawn_pegasus_influencer_radius", "" + ( 20 * k_player_height ), reset_dvars ); - if ( !isDefined( ss.unifiedsideswitching ) ) - { - ss.unifiedsideswitching = 1; - } - [[ level.gamemodespawndvars ]]( reset_dvars ); - if ( isDefined( level.levelspawndvars ) ) - { - [[ level.levelspawndvars ]]( reset_dvars ); - } - setspawnpointrandomvariation( ss.randomness_range ); + if ( !level.teambased ) + other_team_mask = level.spawnsystem.ispawn_teammask_free; + else + other_team_mask = getotherteamsmask( team ); + + return addsphereinfluencer( level.spawnsystem.einfluencer_type_enemy_spawned, origin, level.spawnsystem.enemy_spawned_influencer_radius, level.spawnsystem.enemy_spawned_influencer_score, other_team_mask, "enemy_spawned,r,s", get_score_curve_index( level.spawnsystem.enemy_spawned_influencer_score_curve ), level.spawnsystem.enemy_spawned_influencer_timeout_seconds ); } -level_use_unified_spawning( use ) //checked matches cerberus output +updateallspawnpoints() { + foreach ( team in level.teams ) + gatherspawnentities( team ); + + clearspawnpoints(); + + if ( level.teambased ) + { + foreach ( team in level.teams ) + addspawnpoints( team, level.unified_spawn_points[team].a ); + } + else + { + foreach ( team in level.teams ) + addspawnpoints( "free", level.unified_spawn_points[team].a ); + } + + remove_unused_spawn_entities(); } -onspawnplayer_unified( predictedspawn ) //checked changed to match cerberus output dvar taken from beta dump +initialize_player_spawning_dvars() { - if ( !isDefined( predictedspawn ) ) - { - predictedspawn = 0; - } - /* /# - if ( getDvarInt( "scr_spawn_point_test_mode" ) != 0 ) - { - spawn_point = get_debug_spawnpoint( self ); - self spawn( spawn_point.origin, spawn_point.angles ); - return; + reset_dvars = 1; + + while ( true ) + { + get_player_spawning_dvars( reset_dvars ); + reset_dvars = 0; + wait 2; + } #/ - } - */ - use_new_spawn_system = 1; - initial_spawn = 1; - if ( isDefined( self.uspawn_already_spawned ) ) - { - initial_spawn = !self.uspawn_already_spawned; - } - if ( level.usestartspawns ) - { - use_new_spawn_system = 0; - } - if ( level.gametype == "sd" ) - { - use_new_spawn_system = 0; - } - set_dvar_if_unset( "scr_spawn_force_unified", "0" ); - spawnoverride = self maps/mp/_tacticalinsertion::overridespawn( predictedspawn ); - if ( use_new_spawn_system || getDvarInt( "scr_spawn_force_unified" ) != 0 ) - { - if ( !spawnoverride ) - { - spawn_point = getspawnpoint( self, predictedspawn ); - if ( isDefined( spawn_point ) ) - { - if ( predictedspawn ) - { - self predictspawnpoint( spawn_point.origin, spawn_point.angles ); - } - else - { - create_enemy_spawned_influencers( spawn_point.origin, self.pers[ "team" ] ); - self spawn( spawn_point.origin, spawn_point.angles ); - } - } - else - { - /* +} + +get_player_spawning_dvars( reset_dvars ) +{ + k_player_height = get_player_height(); + player_height_times_10 = "" + 10.0 * k_player_height; + ss = level.spawnsystem; + player_influencer_radius = 15.0 * k_player_height; + player_influencer_score = 150.0; + dog_influencer_radius = 10.0 * k_player_height; + dog_influencer_score = 150.0; + ss.script_based_influencer_system = set_dvar_int_if_unset( "scr_script_based_influencer_system", "0", reset_dvars ); + ss.randomness_range = set_dvar_float_if_unset( "scr_spawn_randomness_range", "0", reset_dvars ); + ss.objective_facing_bonus = set_dvar_float_if_unset( "scr_spawn_objective_facing_bonus", "0", reset_dvars ); + + if ( level.multiteam ) + { + ss.friend_weak_influencer_score = set_dvar_float_if_unset( "scr_spawn_friend_weak_influencer_score", "200", reset_dvars ); + ss.friend_weak_influencer_score_curve = set_dvar_if_unset( "scr_spawn_friend_weak_influencer_score_curve", "linear", reset_dvars ); + ss.friend_weak_influencer_radius = set_dvar_float_if_unset( "scr_spawn_friend_weak_influencer_radius", "1200", reset_dvars ); + } + else + { + ss.friend_weak_influencer_score = set_dvar_float_if_unset( "scr_spawn_friend_weak_influencer_score", "20", reset_dvars ); + ss.friend_weak_influencer_score_curve = set_dvar_if_unset( "scr_spawn_friend_weak_influencer_score_curve", "linear", reset_dvars ); + ss.friend_weak_influencer_radius = set_dvar_float_if_unset( "scr_spawn_friend_weak_influencer_radius", "700", reset_dvars ); + } + + ss.enemy_influencer_score = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_score", "-150", reset_dvars ); + ss.enemy_influencer_score_curve = set_dvar_if_unset( "scr_spawn_enemy_influencer_score_curve", "linear", reset_dvars ); + ss.enemy_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_radius", "2600", reset_dvars ); + ss.dead_friend_influencer_timeout_seconds = set_dvar_float_if_unset( "scr_spawn_dead_friend_influencer_timeout_seconds", "20", reset_dvars ); + ss.dead_friend_influencer_count = set_dvar_float_if_unset( "scr_spawn_dead_friend_influencer_count", "7", reset_dvars ); + ss.dead_friend_influencer_score = set_dvar_float_if_unset( "scr_spawn_dead_friend_influencer_score", "-100", reset_dvars ); + ss.dead_friend_influencer_score_curve = set_dvar_if_unset( "scr_spawn_dead_friend_influencer_score_curve", "steep", reset_dvars ); + ss.dead_friend_influencer_radius = set_dvar_float_if_unset( "scr_spawn_dead_friend_influencer_radius", player_height_times_10, reset_dvars ); + ss.vehicle_influencer_score = set_dvar_float_if_unset( "scr_spawn_vehicle_influencer_score", "-50", reset_dvars ); + ss.vehicle_influencer_score_curve = set_dvar_if_unset( "scr_spawn_vehicle_influencer_score_curve", "linear", reset_dvars ); + ss.vehicle_influencer_lead_seconds = set_dvar_float_if_unset( "scr_spawn_vehicle_influencer_lead_seconds", "3", reset_dvars ); + ss.dog_influencer_score = set_dvar_float_if_unset( "scr_spawn_dog_influencer_score", "-150", reset_dvars ); + ss.dog_influencer_score_curve = set_dvar_if_unset( "scr_spawn_dog_influencer_score_curve", "steep", reset_dvars ); + ss.dog_influencer_radius = set_dvar_float_if_unset( "scr_spawn_dog_influencer_radius", "" + 15.0 * k_player_height, reset_dvars ); + ss.artillery_influencer_score = set_dvar_float_if_unset( "scr_spawn_artillery_influencer_score", "-600", reset_dvars ); + ss.artillery_influencer_score_curve = set_dvar_if_unset( "scr_spawn_artillery_influencer_score_curve", "linear", reset_dvars ); + ss.artillery_influencer_radius = set_dvar_float_if_unset( "scr_spawn_artillery_influencer_radius", "1200", reset_dvars ); + ss.grenade_influencer_score = set_dvar_float_if_unset( "scr_spawn_grenade_influencer_score", "-300", reset_dvars ); + ss.grenade_influencer_score_curve = set_dvar_if_unset( "scr_spawn_grenade_influencer_score_curve", "linear", reset_dvars ); + ss.grenade_influencer_radius = set_dvar_float_if_unset( "scr_spawn_grenade_influencer_radius", "" + 8.0 * k_player_height, reset_dvars ); + ss.grenade_endpoint_influencer_score = set_dvar_float_if_unset( "scr_spawn_grenade_endpoint_influencer_score", "-300", reset_dvars ); + ss.grenade_endpoint_influencer_score_curve = set_dvar_if_unset( "scr_spawn_grenade_endpoint_influencer_score_curve", "linear", reset_dvars ); + ss.grenade_endpoint_influencer_radius = set_dvar_float_if_unset( "scr_spawn_grenade_endpoint_influencer_radius", "" + 8.0 * k_player_height, reset_dvars ); + ss.claymore_influencer_score = set_dvar_float_if_unset( "scr_spawn_claymore_influencer_score", "-150", reset_dvars ); + ss.claymore_influencer_score_curve = set_dvar_if_unset( "scr_spawn_claymore_influencer_score_curve", "steep", reset_dvars ); + ss.claymore_influencer_radius = set_dvar_float_if_unset( "scr_spawn_claymore_influencer_radius", "" + 9.0 * k_player_height, reset_dvars ); + ss.napalm_influencer_score = set_dvar_float_if_unset( "scr_spawn_napalm_influencer_score", "-500", reset_dvars ); + ss.napalm_influencer_score_curve = set_dvar_if_unset( "scr_spawn_napalm_influencer_score_curve", "linear", reset_dvars ); + ss.napalm_influencer_radius = set_dvar_float_if_unset( "scr_spawn_napalm_influencer_radius", "" + 750, reset_dvars ); + ss.auto_turret_influencer_score = set_dvar_float_if_unset( "scr_spawn_auto_turret_influencer_score", "-650", reset_dvars ); + ss.auto_turret_influencer_score_curve = set_dvar_if_unset( "scr_spawn_auto_turret_influencer_score_curve", "linear", reset_dvars ); + ss.auto_turret_influencer_radius = set_dvar_float_if_unset( "scr_spawn_auto_turret_influencer_radius", "" + 1200, reset_dvars ); + ss.auto_turret_influencer_close_score = set_dvar_float_if_unset( "scr_spawn_auto_turret_influencer_close_score", "-250000", reset_dvars ); + ss.auto_turret_influencer_close_score_curve = set_dvar_if_unset( "scr_spawn_auto_turret_influencer_close_score_curve", "constant", reset_dvars ); + ss.auto_turret_influencer_close_radius = set_dvar_float_if_unset( "scr_spawn_auto_turret_influencer_close_radius", "" + 500, reset_dvars ); + ss.rcbomb_influencer_score = set_dvar_float_if_unset( "scr_spawn_rcbomb_influencer_score", "-200", reset_dvars ); + ss.rcbomb_influencer_score_curve = set_dvar_if_unset( "scr_spawn_rcbomb_influencer_score_curve", "steep", reset_dvars ); + ss.rcbomb_influencer_radius = set_dvar_float_if_unset( "scr_spawn_rcbomb_influencer_radius", "" + 25.0 * k_player_height, reset_dvars ); + ss.qrdrone_influencer_score = set_dvar_float_if_unset( "scr_spawn_qrdrone_influencer_score", "-200", reset_dvars ); + ss.qrdrone_influencer_score_curve = set_dvar_if_unset( "scr_spawn_qrdrone_influencer_score_curve", "steep", reset_dvars ); + ss.qrdrone_influencer_radius = set_dvar_float_if_unset( "scr_spawn_qrdrone_influencer_radius", "" + 25.0 * k_player_height, reset_dvars ); + ss.qrdrone_cylinder_influencer_score = set_dvar_float_if_unset( "scr_spawn_qrdrone_cylinder_influencer_score", "-300", reset_dvars ); + ss.qrdrone_cylinder_influencer_score_curve = set_dvar_if_unset( "scr_spawn_qrdrone_cylinder_influencer_score_curve", "linear", reset_dvars ); + ss.qrdrone_cylinder_influencer_radius = set_dvar_float_if_unset( "scr_spawn_qrdrone_cylinder_influencer_radius", 1000, reset_dvars ); + ss.qrdrone_cylinder_influencer_length = set_dvar_float_if_unset( "scr_spawn_qrdrone_cylinder_influencer_length", 2000, reset_dvars ); + ss.aitank_influencer_score = set_dvar_float_if_unset( "scr_spawn_aitank_influencer_score", "-200", reset_dvars ); + ss.aitank_influencer_score_curve = set_dvar_if_unset( "scr_spawn_aitank_influencer_score_curve", "linear", reset_dvars ); + ss.aitank_influencer_radius = set_dvar_float_if_unset( "scr_spawn_aitank_influencer_radius", "" + 25.0 * k_player_height, reset_dvars ); + ss.enemy_spawned_influencer_score_curve = set_dvar_if_unset( "scr_spawn_enemy_spawned_influencer_score_curve", "constant", reset_dvars ); + + if ( level.multiteam ) + { + ss.enemy_spawned_influencer_score = set_dvar_float_if_unset( "scr_spawn_enemy_spawned_influencer_score", "-400", reset_dvars ); + ss.enemy_spawned_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_spawned_influencer_radius", "" + 1100, reset_dvars ); + } + else if ( level.teambased ) + { + ss.enemy_spawned_influencer_score = set_dvar_float_if_unset( "scr_spawn_enemy_spawned_influencer_score", "-400", reset_dvars ); + ss.enemy_spawned_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_spawned_influencer_radius", "" + 1100, reset_dvars ); + } + else + { + ss.enemy_spawned_influencer_score = set_dvar_float_if_unset( "scr_spawn_enemy_spawned_influencer_score", "-400", reset_dvars ); + ss.enemy_spawned_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_spawned_influencer_radius", "" + 1000, reset_dvars ); + } + + ss.enemy_spawned_influencer_timeout_seconds = set_dvar_float_if_unset( "scr_spawn_enemy_spawned_influencer_timeout_seconds", "7", reset_dvars ); + ss.helicopter_influencer_score = set_dvar_float_if_unset( "scr_spawn_helicopter_influencer_score", "-500", reset_dvars ); + ss.helicopter_influencer_score_curve = set_dvar_if_unset( "scr_spawn_helicopter_influencer_score_curve", "linear", reset_dvars ); + ss.helicopter_influencer_radius = set_dvar_float_if_unset( "scr_spawn_helicopter_influencer_radius", "" + 2000, reset_dvars ); + ss.helicopter_influencer_length = set_dvar_float_if_unset( "scr_spawn_helicopter_influencer_length", "" + 3500, reset_dvars ); + ss.tvmissile_influencer_score = set_dvar_float_if_unset( "scr_spawn_tvmissile_influencer_score", "-400", reset_dvars ); + ss.tvmissile_influencer_score_curve = set_dvar_if_unset( "scr_spawn_tvmissile_influencer_score_curve", "linear", reset_dvars ); + ss.tvmissile_influencer_radius = set_dvar_float_if_unset( "scr_spawn_tvmissile_influencer_radius", "" + 2000, reset_dvars ); + ss.tvmissile_influencer_length = set_dvar_float_if_unset( "scr_spawn_tvmissile_influencer_length", "" + 3000, reset_dvars ); + ss.pegasus_influencer_score = set_dvar_float_if_unset( "scr_spawn_pegasus_influencer_score", "-250", reset_dvars ); + ss.pegasus_influencer_score_curve = set_dvar_if_unset( "scr_spawn_pegasus_influencer_score_curve", "linear", reset_dvars ); + ss.pegasus_influencer_radius = set_dvar_float_if_unset( "scr_spawn_pegasus_influencer_radius", "" + 20.0 * k_player_height, reset_dvars ); + + if ( !isdefined( ss.unifiedsideswitching ) ) + ss.unifiedsideswitching = 1; + + [[ level.gamemodespawndvars ]]( reset_dvars ); + + if ( isdefined( level.levelspawndvars ) ) + [[ level.levelspawndvars ]]( reset_dvars ); + + setspawnpointrandomvariation( ss.randomness_range ); +} + +level_use_unified_spawning( use ) +{ + +} + +onspawnplayer_unified( predictedspawn ) +{ + if ( !isdefined( predictedspawn ) ) + predictedspawn = 0; + /# - println( "ERROR: unable to locate a usable spawn point for player" ); + if ( getdvarint( "scr_spawn_point_test_mode" ) != 0 ) + { + spawn_point = get_debug_spawnpoint( self ); + self spawn( spawn_point.origin, spawn_point.angles ); + return; + } #/ - */ - maps/mp/gametypes/_callbacksetup::abortlevel(); - } - } - else if ( predictedspawn && isDefined( self.tacticalinsertion ) ) - { - self predictspawnpoint( self.tacticalinsertion.origin, self.tacticalinsertion.angles ); - } - if ( !predictedspawn ) - { - self.lastspawntime = getTime(); - self enable_player_influencers( 1 ); - } - } - else if ( !spawnoverride ) - { - [[ level.onspawnplayer ]]( predictedspawn ); - } - if ( !predictedspawn ) - { - self.uspawn_already_spawned = 1; - } - return; -} + use_new_spawn_system = 1; + initial_spawn = 1; -getspawnpoint( player_entity, predictedspawn ) //checked matches cerberus output -{ - if ( !isDefined( predictedspawn ) ) - { - predictedspawn = 0; - } - if ( level.teambased ) - { - point_team = player_entity.pers[ "team" ]; - influencer_team = player_entity.pers[ "team" ]; - } - else - { - point_team = "free"; - influencer_team = "free"; - } - if ( level.teambased && is_true( game[ "switchedsides" ] ) && level.spawnsystem.unifiedsideswitching ) - { - point_team = getotherteam( point_team ); - } - best_spawn_entity = get_best_spawnpoint( point_team, influencer_team, player_entity, predictedspawn ); - if ( !predictedspawn ) - { - player_entity.last_spawn_origin = best_spawn_entity.origin; - } - return best_spawn_entity; -} + if ( isdefined( self.uspawn_already_spawned ) ) + initial_spawn = !self.uspawn_already_spawned; -get_debug_spawnpoint( player ) //checked changed to match beta dump -{ - if ( level.teambased ) - { - team = player.pers[ "team" ]; - } - else - { - team = "free"; - } - index = level.test_spawn_point_index; - level.test_spawn_point_index++; - if ( team == "free" ) - { - spawn_counts = 0; - foreach ( team in level.teams ) - { - spawn_counts += level.unified_spawn_points[ team ].a.size; - } - if ( level.test_spawn_point_index >= spawn_counts ) - { - level.test_spawn_point_index = 0; - } - count = 0; - foreach ( team in level.teams ) - { - size = level.unified_spawn_points[ team ].a.size; - if ( level.test_spawn_point_index < ( count + size ) ) - { - return level.unified_spawn_points[ team ].a[ level.test_spawn_point_index - count ]; - } - count += size; - } - } - else - { - if ( level.test_spawn_point_index >= level.unified_spawn_points[ team ].a.size ) - { - level.test_spawn_point_index = 0; - } - return level.unified_spawn_points[ team ].a[ level.test_spawn_point_index ]; - } -} + if ( level.usestartspawns ) + use_new_spawn_system = 0; -get_best_spawnpoint( point_team, influencer_team, player, predictedspawn ) //checked matches cerberus output -{ - if ( level.teambased ) - { - vis_team_mask = getotherteamsmask( player.pers[ "team" ] ); - } - else - { - vis_team_mask = level.spawnsystem.ispawn_teammask_free; - } - scored_spawn_points = getsortedspawnpoints( point_team, influencer_team, vis_team_mask, player, predictedspawn ); - /* + if ( level.gametype == "sd" ) + use_new_spawn_system = 0; + + set_dvar_if_unset( "scr_spawn_force_unified", "0" ); + spawnoverride = self maps\mp\_tacticalinsertion::overridespawn( predictedspawn ); + + if ( use_new_spawn_system || getdvarint( "scr_spawn_force_unified" ) != 0 ) + { + if ( !spawnoverride ) + { + spawn_point = getspawnpoint( self, predictedspawn ); + + if ( isdefined( spawn_point ) ) + { + if ( predictedspawn ) + self predictspawnpoint( spawn_point.origin, spawn_point.angles ); + else + { + create_enemy_spawned_influencers( spawn_point.origin, self.pers["team"] ); + self spawn( spawn_point.origin, spawn_point.angles ); + } + } + else + { /# - assert( scored_spawn_points.size > 0 ); + println( "ERROR: unable to locate a usable spawn point for player" ); +#/ + maps\mp\gametypes\_callbacksetup::abortlevel(); + } + } + else if ( predictedspawn && isdefined( self.tacticalinsertion ) ) + self predictspawnpoint( self.tacticalinsertion.origin, self.tacticalinsertion.angles ); + + if ( !predictedspawn ) + { + self.lastspawntime = gettime(); + self enable_player_influencers( 1 ); + } + } + else if ( !spawnoverride ) + [[ level.onspawnplayer ]]( predictedspawn ); + + if ( !predictedspawn ) + self.uspawn_already_spawned = 1; + + return; +} + +getspawnpoint( player_entity, predictedspawn ) +{ + if ( !isdefined( predictedspawn ) ) + predictedspawn = 0; + + if ( level.teambased ) + { + point_team = player_entity.pers["team"]; + influencer_team = player_entity.pers["team"]; + } + else + { + point_team = "free"; + influencer_team = "free"; + } + + if ( level.teambased && isdefined( game["switchedsides"] ) && game["switchedsides"] && level.spawnsystem.unifiedsideswitching ) + point_team = getotherteam( point_team ); + + best_spawn_entity = get_best_spawnpoint( point_team, influencer_team, player_entity, predictedspawn ); + + if ( !predictedspawn ) + player_entity.last_spawn_origin = best_spawn_entity.origin; + + return best_spawn_entity; +} + +get_debug_spawnpoint( player ) +{ + if ( level.teambased ) + team = player.pers["team"]; + else + team = "free"; + + index = level.test_spawn_point_index; + level.test_spawn_point_index++; + + if ( team == "free" ) + { + spawn_counts = 0; + + foreach ( team in level.teams ) + spawn_counts += level.unified_spawn_points[team].a.size; + + if ( level.test_spawn_point_index >= spawn_counts ) + level.test_spawn_point_index = 0; + + count = 0; + + foreach ( team in level.teams ) + { + size = level.unified_spawn_points[team].a.size; + + if ( level.test_spawn_point_index < count + size ) + return level.unified_spawn_points[team].a[level.test_spawn_point_index - count]; + + count += size; + } + } + else + { + if ( level.test_spawn_point_index >= level.unified_spawn_points[team].a.size ) + level.test_spawn_point_index = 0; + + return level.unified_spawn_points[team].a[level.test_spawn_point_index]; + } +} + +get_best_spawnpoint( point_team, influencer_team, player, predictedspawn ) +{ + if ( level.teambased ) + vis_team_mask = getotherteamsmask( player.pers["team"] ); + else + vis_team_mask = level.spawnsystem.ispawn_teammask_free; + + scored_spawn_points = getsortedspawnpoints( point_team, influencer_team, vis_team_mask, player, predictedspawn ); +/# + assert( scored_spawn_points.size > 0 ); #/ /# - assert( scored_spawn_points.size == 1 ); + assert( scored_spawn_points.size == 1 ); #/ - */ - if ( !predictedspawn ) - { - bbprint( "mpspawnpointsused", "reason %s x %d y %d z %d", "point used", scored_spawn_points[ 0 ].origin ); - } - return scored_spawn_points[ 0 ]; + + if ( !predictedspawn ) + bbprint( "mpspawnpointsused", "reason %s x %d y %d z %d", "point used", scored_spawn_points[0].origin ); + + return scored_spawn_points[0]; } -gatherspawnentities( player_team ) //checked changed to match cerberus output +gatherspawnentities( player_team ) { - if ( !isDefined( level.unified_spawn_points ) ) - { - level.unified_spawn_points = []; - } - else - { - if ( isDefined( level.unified_spawn_points[ player_team ] ) ) - { - return level.unified_spawn_points[ player_team ]; - } - } - spawn_entities_s = spawn_array_struct(); - spawn_entities_s.a = getentarray( "mp_uspawn_point", "classname" ); - if ( !isDefined( spawn_entities_s.a ) ) - { - spawn_entities_s.a = []; - } - legacy_spawn_points = maps/mp/gametypes/_spawnlogic::getteamspawnpoints( player_team ); - for ( legacy_spawn_index = 0; legacy_spawn_index < legacy_spawn_points.size; legacy_spawn_index++ ) - { - spawn_entities_s.a[ spawn_entities_s.a.size ] = legacy_spawn_points[ legacy_spawn_index ]; - } - level.unified_spawn_points[ player_team ] = spawn_entities_s; - return spawn_entities_s; + if ( !isdefined( level.unified_spawn_points ) ) + level.unified_spawn_points = []; + else if ( isdefined( level.unified_spawn_points[player_team] ) ) + return level.unified_spawn_points[player_team]; + + spawn_entities_s = spawn_array_struct(); + spawn_entities_s.a = getentarray( "mp_uspawn_point", "classname" ); + + if ( !isdefined( spawn_entities_s.a ) ) + spawn_entities_s.a = []; + + legacy_spawn_points = maps\mp\gametypes\_spawnlogic::getteamspawnpoints( player_team ); + + for ( legacy_spawn_index = 0; legacy_spawn_index < legacy_spawn_points.size; legacy_spawn_index++ ) + spawn_entities_s.a[spawn_entities_s.a.size] = legacy_spawn_points[legacy_spawn_index]; + + level.unified_spawn_points[player_team] = spawn_entities_s; + return spawn_entities_s; } -is_hardcore() //checked changed at own discretion +is_hardcore() { - if ( is_true( level.hardcoremode ) ) - { - return 1; - } - return 0; + return isdefined( level.hardcoremode ) && level.hardcoremode; } teams_have_enmity( team1, team2 ) { - if ( isDefined( team1 ) || !isDefined( team2 ) || level.gametype == "dm" ) - { - return 1; - } - if ( team1 != "neutral" && team2 != "neutral" && team1 != team2 ) - { - return 1; - } - return 0; + if ( !isdefined( team1 ) || !isdefined( team2 ) || level.gametype == "dm" ) + return 1; + + return team1 != "neutral" && team2 != "neutral" && team1 != team2; } -remove_unused_spawn_entities() //checked partially changed to match cerberus output see info.md +remove_unused_spawn_entities() { - spawn_entity_types = []; - spawn_entity_types[ spawn_entity_types.size ] = "mp_dm_spawn"; - spawn_entity_types[ spawn_entity_types.size ] = "mp_tdm_spawn_allies_start"; - spawn_entity_types[ spawn_entity_types.size ] = "mp_tdm_spawn_axis_start"; - spawn_entity_types[ spawn_entity_types.size ] = "mp_tdm_spawn_team1_start"; - spawn_entity_types[ spawn_entity_types.size ] = "mp_tdm_spawn_team2_start"; - spawn_entity_types[ spawn_entity_types.size ] = "mp_tdm_spawn_team3_start"; - spawn_entity_types[ spawn_entity_types.size ] = "mp_tdm_spawn_team4_start"; - spawn_entity_types[ spawn_entity_types.size ] = "mp_tdm_spawn_team5_start"; - spawn_entity_types[ spawn_entity_types.size ] = "mp_tdm_spawn_team6_start"; - spawn_entity_types[ spawn_entity_types.size ] = "mp_tdm_spawn"; - spawn_entity_types[ spawn_entity_types.size ] = "mp_ctf_spawn_allies_start"; - spawn_entity_types[ spawn_entity_types.size ] = "mp_ctf_spawn_axis_start"; - spawn_entity_types[ spawn_entity_types.size ] = "mp_ctf_spawn_allies"; - spawn_entity_types[ spawn_entity_types.size ] = "mp_ctf_spawn_axis"; - spawn_entity_types[ spawn_entity_types.size ] = "mp_dom_spawn_allies_start"; - spawn_entity_types[ spawn_entity_types.size ] = "mp_dom_spawn_axis_start"; - spawn_entity_types[ spawn_entity_types.size ] = "mp_dom_spawn_flag_a"; - spawn_entity_types[ spawn_entity_types.size ] = "mp_dom_spawn_flag_b"; - spawn_entity_types[ spawn_entity_types.size ] = "mp_dom_spawn_flag_c"; - spawn_entity_types[ spawn_entity_types.size ] = "mp_dom_spawn"; - spawn_entity_types[ spawn_entity_types.size ] = "mp_sab_spawn_allies_start"; - spawn_entity_types[ spawn_entity_types.size ] = "mp_sab_spawn_axis_start"; - spawn_entity_types[ spawn_entity_types.size ] = "mp_sab_spawn_allies"; - spawn_entity_types[ spawn_entity_types.size ] = "mp_sab_spawn_axis"; - spawn_entity_types[ spawn_entity_types.size ] = "mp_sd_spawn_attacker"; - spawn_entity_types[ spawn_entity_types.size ] = "mp_sd_spawn_defender"; - spawn_entity_types[ spawn_entity_types.size ] = "mp_dem_spawn_attacker_start"; - spawn_entity_types[ spawn_entity_types.size ] = "mp_dem_spawn_defender_start"; - spawn_entity_types[ spawn_entity_types.size ] = "mp_dem_spawn_attackerOT_start"; - spawn_entity_types[ spawn_entity_types.size ] = "mp_dem_spawn_defenderOT_start"; - spawn_entity_types[ spawn_entity_types.size ] = "mp_dem_spawn_attacker"; - spawn_entity_types[ spawn_entity_types.size ] = "mp_dem_spawn_defender"; - spawn_entity_types[ spawn_entity_types.size ] = "mp_twar_spawn_axis_start"; - spawn_entity_types[ spawn_entity_types.size ] = "mp_twar_spawn_allies_start"; - spawn_entity_types[ spawn_entity_types.size ] = "mp_twar_spawn"; - i = 0; - while ( i < spawn_entity_types.size ) - { - if ( spawn_point_class_name_being_used( spawn_entity_types[ i ] ) ) - { - i++; - continue; - } - spawnpoints = maps/mp/gametypes/_spawnlogic::getspawnpointarray( spawn_entity_types[ i ] ); - delete_all_spawns( spawnpoints ); - i++; - } + spawn_entity_types = []; + spawn_entity_types[spawn_entity_types.size] = "mp_dm_spawn"; + spawn_entity_types[spawn_entity_types.size] = "mp_tdm_spawn_allies_start"; + spawn_entity_types[spawn_entity_types.size] = "mp_tdm_spawn_axis_start"; + spawn_entity_types[spawn_entity_types.size] = "mp_tdm_spawn_team1_start"; + spawn_entity_types[spawn_entity_types.size] = "mp_tdm_spawn_team2_start"; + spawn_entity_types[spawn_entity_types.size] = "mp_tdm_spawn_team3_start"; + spawn_entity_types[spawn_entity_types.size] = "mp_tdm_spawn_team4_start"; + spawn_entity_types[spawn_entity_types.size] = "mp_tdm_spawn_team5_start"; + spawn_entity_types[spawn_entity_types.size] = "mp_tdm_spawn_team6_start"; + spawn_entity_types[spawn_entity_types.size] = "mp_tdm_spawn"; + spawn_entity_types[spawn_entity_types.size] = "mp_ctf_spawn_allies_start"; + spawn_entity_types[spawn_entity_types.size] = "mp_ctf_spawn_axis_start"; + spawn_entity_types[spawn_entity_types.size] = "mp_ctf_spawn_allies"; + spawn_entity_types[spawn_entity_types.size] = "mp_ctf_spawn_axis"; + spawn_entity_types[spawn_entity_types.size] = "mp_dom_spawn_allies_start"; + spawn_entity_types[spawn_entity_types.size] = "mp_dom_spawn_axis_start"; + spawn_entity_types[spawn_entity_types.size] = "mp_dom_spawn_flag_a"; + spawn_entity_types[spawn_entity_types.size] = "mp_dom_spawn_flag_b"; + spawn_entity_types[spawn_entity_types.size] = "mp_dom_spawn_flag_c"; + spawn_entity_types[spawn_entity_types.size] = "mp_dom_spawn"; + spawn_entity_types[spawn_entity_types.size] = "mp_sab_spawn_allies_start"; + spawn_entity_types[spawn_entity_types.size] = "mp_sab_spawn_axis_start"; + spawn_entity_types[spawn_entity_types.size] = "mp_sab_spawn_allies"; + spawn_entity_types[spawn_entity_types.size] = "mp_sab_spawn_axis"; + spawn_entity_types[spawn_entity_types.size] = "mp_sd_spawn_attacker"; + spawn_entity_types[spawn_entity_types.size] = "mp_sd_spawn_defender"; + spawn_entity_types[spawn_entity_types.size] = "mp_dem_spawn_attacker_start"; + spawn_entity_types[spawn_entity_types.size] = "mp_dem_spawn_defender_start"; + spawn_entity_types[spawn_entity_types.size] = "mp_dem_spawn_attackerOT_start"; + spawn_entity_types[spawn_entity_types.size] = "mp_dem_spawn_defenderOT_start"; + spawn_entity_types[spawn_entity_types.size] = "mp_dem_spawn_attacker"; + spawn_entity_types[spawn_entity_types.size] = "mp_dem_spawn_defender"; + spawn_entity_types[spawn_entity_types.size] = "mp_twar_spawn_axis_start"; + spawn_entity_types[spawn_entity_types.size] = "mp_twar_spawn_allies_start"; + spawn_entity_types[spawn_entity_types.size] = "mp_twar_spawn"; + + for ( i = 0; i < spawn_entity_types.size; i++ ) + { + if ( spawn_point_class_name_being_used( spawn_entity_types[i] ) ) + continue; + + spawnpoints = maps\mp\gametypes\_spawnlogic::getspawnpointarray( spawn_entity_types[i] ); + delete_all_spawns( spawnpoints ); + } } -delete_all_spawns( spawnpoints ) //checked changed to match cerberus output +delete_all_spawns( spawnpoints ) { - for ( i = 0; i < spawnpoints.size; i++ ) - { - spawnpoints[ i ] delete(); - } + for ( i = 0; i < spawnpoints.size; i++ ) + spawnpoints[i] delete(); } -spawn_point_class_name_being_used( name ) //checked changed to match cerberus output +spawn_point_class_name_being_used( name ) { - if ( !isDefined( level.spawn_point_class_names ) ) - { - return 0; - } - for ( i = 0; i < level.spawn_point_class_names.size; i++ ) - { - if ( level.spawn_point_class_names[ i ] == name ) - { - return 1; - } - } - return 0; + if ( !isdefined( level.spawn_point_class_names ) ) + return false; + + for ( i = 0; i < level.spawn_point_class_names.size; i++ ) + { + if ( level.spawn_point_class_names[i] == name ) + return true; + } + + return false; } -codecallback_updatespawnpoints() //checked changed to match cerberus output +codecallback_updatespawnpoints() { - foreach ( team in level.teams ) - { - maps/mp/gametypes/_spawnlogic::rebuildspawnpoints( team ); - } - level.unified_spawn_points = undefined; - updateallspawnpoints(); + foreach ( team in level.teams ) + maps\mp\gametypes\_spawnlogic::rebuildspawnpoints( team ); + + level.unified_spawn_points = undefined; + updateallspawnpoints(); } -initialspawnprotection() //checked matches cerberus output +initialspawnprotection() { - self endon( "death" ); - self endon( "disconnect" ); - self thread maps/mp/killstreaks/_airsupport::monitorspeed( level.spawnprotectiontime ); - if ( !isDefined( level.spawnprotectiontime ) || level.spawnprotectiontime == 0 ) - { - return; - } - self.specialty_nottargetedbyairsupport = 1; - self spawnprotectionactive(); - wait level.spawnprotectiontime; - self spawnprotectioninactive(); - self.specialty_nottargetedbyairsupport = undefined; + self endon( "death" ); + self endon( "disconnect" ); + self thread maps\mp\killstreaks\_airsupport::monitorspeed( level.spawnprotectiontime ); + + if ( !isdefined( level.spawnprotectiontime ) || level.spawnprotectiontime == 0 ) + return; + + self.specialty_nottargetedbyairsupport = 1; + self spawnprotectionactive(); + wait( level.spawnprotectiontime ); + self spawnprotectioninactive(); + self.specialty_nottargetedbyairsupport = undefined; } -getteamstartspawnname( team, spawnpointnamebase ) //checked changed to match cerberus output +getteamstartspawnname( team, spawnpointnamebase ) { - spawn_point_team_name = team; - if ( !level.multiteam && game[ "switchedsides" ] ) - { - spawn_point_team_name = getotherteam( team ); - } - if ( level.multiteam ) - { - if ( team == "axis" ) - { - spawn_point_team_name = "team1"; - } - else if ( team == "allies" ) - { - spawn_point_team_name = "team2"; - } - if ( !isoneround() ) - { - number = int( getsubstr( spawn_point_team_name, 4, 5 ) ) - 1; - number = ( ( number + game[ "roundsplayed" ] ) % level.teams.size ) + 1; - spawn_point_team_name = "team" + number; - } - } - return ( spawnpointnamebase + "_" ) + spawn_point_team_name + "_start"; + spawn_point_team_name = team; + + if ( !level.multiteam && game["switchedsides"] ) + spawn_point_team_name = getotherteam( team ); + + if ( level.multiteam ) + { + if ( team == "axis" ) + spawn_point_team_name = "team1"; + else if ( team == "allies" ) + spawn_point_team_name = "team2"; + + if ( !isoneround() ) + { + number = int( getsubstr( spawn_point_team_name, 4, 5 ) ) - 1; + number = ( number + game["roundsplayed"] ) % level.teams.size + 1; + spawn_point_team_name = "team" + number; + } + } + + return spawnpointnamebase + "_" + spawn_point_team_name + "_start"; } -gettdmstartspawnname( team ) //checked matches cerberus output +gettdmstartspawnname( team ) { - return getteamstartspawnname( team, "mp_tdm_spawn" ); + return getteamstartspawnname( team, "mp_tdm_spawn" ); } - - diff --git a/Multiplayer Core/patch_mp/maps/mp/gametypes/_spawnlogic.gsc b/Multiplayer Core/patch_mp/maps/mp/gametypes/_spawnlogic.gsc index 53f4e63..41ef34c 100644 --- a/Multiplayer Core/patch_mp/maps/mp/gametypes/_spawnlogic.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/gametypes/_spawnlogic.gsc @@ -1,2282 +1,2034 @@ -//checked includes match cerberus output -#include maps/mp/gametypes/_spawnlogic; -#include maps/mp/gametypes/_gameobjects; -#include maps/mp/gametypes/_callbacksetup; -#include maps/mp/_utility; -#include common_scripts/utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool -onplayerconnect() //checked matches cerberus output +onplayerconnect() { - for ( ;; ) - { - level waittill( "connected", player ); - } + for (;;) + level waittill( "connected", player ); } -findboxcenter( mins, maxs ) //checked changed to match cerberus output +findboxcenter( mins, maxs ) { - center = ( 0, 0, 0 ); - center = maxs - mins; - center = ( center[ 0 ] / 2, center[ 1 ] / 2, center[ 2 ] / 2 ) + mins; - return center; + center = ( 0, 0, 0 ); + center = maxs - mins; + center = ( center[0] / 2, center[1] / 2, center[2] / 2 ) + mins; + return center; } -expandmins( mins, point ) //checked matches cerberus output +expandmins( mins, point ) { - if ( mins[ 0 ] > point[ 0 ] ) - { - mins = ( point[ 0 ], mins[ 1 ], mins[ 2 ] ); - } - if ( mins[ 1 ] > point[ 1 ] ) - { - mins = ( mins[ 0 ], point[ 1 ], mins[ 2 ] ); - } - if ( mins[ 2 ] > point[ 2 ] ) - { - mins = ( mins[ 0 ], mins[ 1 ], point[ 2 ] ); - } - return mins; + if ( mins[0] > point[0] ) + mins = ( point[0], mins[1], mins[2] ); + + if ( mins[1] > point[1] ) + mins = ( mins[0], point[1], mins[2] ); + + if ( mins[2] > point[2] ) + mins = ( mins[0], mins[1], point[2] ); + + return mins; } -expandmaxs( maxs, point ) //checked matches cerberus output +expandmaxs( maxs, point ) { - if ( maxs[ 0 ] < point[ 0 ] ) - { - maxs = ( point[ 0 ], maxs[ 1 ], maxs[ 2 ] ); - } - if ( maxs[ 1 ] < point[ 1 ] ) - { - maxs = ( maxs[ 0 ], point[ 1 ], maxs[ 2 ] ); - } - if ( maxs[ 2 ] < point[ 2 ] ) - { - maxs = ( maxs[ 0 ], maxs[ 1 ], point[ 2 ] ); - } - return maxs; + if ( maxs[0] < point[0] ) + maxs = ( point[0], maxs[1], maxs[2] ); + + if ( maxs[1] < point[1] ) + maxs = ( maxs[0], point[1], maxs[2] ); + + if ( maxs[2] < point[2] ) + maxs = ( maxs[0], maxs[1], point[2] ); + + return maxs; } -addspawnpointsinternal( team, spawnpointname ) //checked changed to match cerberus output +addspawnpointsinternal( team, spawnpointname ) { - oldspawnpoints = []; - if ( level.teamspawnpoints[ team ].size ) - { - oldspawnpoints = level.teamspawnpoints[ team ]; - } - level.teamspawnpoints[ team ] = getspawnpointarray( spawnpointname ); - if ( !isDefined( level.spawnpoints ) ) - { - level.spawnpoints = []; - } - for ( index = 0; index < level.teamspawnpoints[team].size; index++ ) - { - spawnpoint = level.teamspawnpoints[ team ][ index ]; - if ( !isDefined( spawnpoint.inited ) ) - { - spawnpoint spawnpointinit(); - level.spawnpoints[ level.spawnpoints.size ] = spawnpoint; - } - } - for ( index = 0; index < oldspawnpoints.size; index++ ) - { - origin = oldspawnpoints[ index ].origin; - level.spawnmins = expandmins( level.spawnmins, origin ); - level.spawnmaxs = expandmaxs( level.spawnmaxs, origin ); - level.teamspawnpoints[ team ][ level.teamspawnpoints[ team ].size ] = oldspawnpoints[ index ]; - } - if ( !level.teamspawnpoints[ team ].size ) - { - /* + oldspawnpoints = []; + + if ( level.teamspawnpoints[team].size ) + oldspawnpoints = level.teamspawnpoints[team]; + + level.teamspawnpoints[team] = getspawnpointarray( spawnpointname ); + + if ( !isdefined( level.spawnpoints ) ) + level.spawnpoints = []; + + for ( index = 0; index < level.teamspawnpoints[team].size; index++ ) + { + spawnpoint = level.teamspawnpoints[team][index]; + + if ( !isdefined( spawnpoint.inited ) ) + { + spawnpoint spawnpointinit(); + level.spawnpoints[level.spawnpoints.size] = spawnpoint; + } + } + + for ( index = 0; index < oldspawnpoints.size; index++ ) + { + origin = oldspawnpoints[index].origin; + level.spawnmins = expandmins( level.spawnmins, origin ); + level.spawnmaxs = expandmaxs( level.spawnmaxs, origin ); + level.teamspawnpoints[team][level.teamspawnpoints[team].size] = oldspawnpoints[index]; + } + + if ( !level.teamspawnpoints[team].size ) + { /# - println( "^1ERROR: No " + spawnpointname + " spawnpoints found in level!" ); + println( "^1ERROR: No " + spawnpointname + " spawnpoints found in level!" ); #/ - */ - maps/mp/gametypes/_callbacksetup::abortlevel(); - wait 1; - return; - } + maps\mp\gametypes\_callbacksetup::abortlevel(); + wait 1; + return; + } } -clearspawnpoints() //checked changed to match cerberus output +clearspawnpoints() { - foreach ( team in level.teams ) - { - level.teamspawnpoints[ team ] = []; - } - level.spawnpoints = []; - level.unified_spawn_points = undefined; + foreach ( team in level.teams ) + level.teamspawnpoints[team] = []; + + level.spawnpoints = []; + level.unified_spawn_points = undefined; } -addspawnpoints( team, spawnpointname ) //checked matches cerberus output +addspawnpoints( team, spawnpointname ) { - addspawnpointclassname( spawnpointname ); - addspawnpointteamclassname( team, spawnpointname ); - addspawnpointsinternal( team, spawnpointname ); + addspawnpointclassname( spawnpointname ); + addspawnpointteamclassname( team, spawnpointname ); + addspawnpointsinternal( team, spawnpointname ); } -rebuildspawnpoints( team ) //checked changed to match cerberus output +rebuildspawnpoints( team ) { - level.teamspawnpoints[ team ] = []; - for ( index = 0; index < level.spawn_point_team_class_names[team].size; index++ ) - { - addspawnpointsinternal( team, level.spawn_point_team_class_names[ team ][ index ] ); - } + level.teamspawnpoints[team] = []; + + for ( index = 0; index < level.spawn_point_team_class_names[team].size; index++ ) + addspawnpointsinternal( team, level.spawn_point_team_class_names[team][index] ); } -placespawnpoints( spawnpointname ) //checked changed to match cerberus output +placespawnpoints( spawnpointname ) { - addspawnpointclassname( spawnpointname ); - spawnpoints = getspawnpointarray( spawnpointname ); - /* + addspawnpointclassname( spawnpointname ); + spawnpoints = getspawnpointarray( spawnpointname ); /# - if ( !isDefined( level.extraspawnpointsused ) ) - { - level.extraspawnpointsused = []; + if ( !isdefined( level.extraspawnpointsused ) ) + level.extraspawnpointsused = []; #/ - } - */ - if ( !spawnpoints.size ) - { - /* + + if ( !spawnpoints.size ) + { /# - println( "^1No " + spawnpointname + " spawnpoints found in level!" ); + println( "^1No " + spawnpointname + " spawnpoints found in level!" ); #/ - */ - maps/mp/gametypes/_callbacksetup::abortlevel(); - wait 1; - return; - } - for ( index = 0; index < spawnpoints.size; index++ ) - { - spawnpoints[ index ] spawnpointinit(); - /* + maps\mp\gametypes\_callbacksetup::abortlevel(); + wait 1; + return; + } + + for ( index = 0; index < spawnpoints.size; index++ ) + { + spawnpoints[index] spawnpointinit(); /# - spawnpoints[ index ].fakeclassname = spawnpointname; - level.extraspawnpointsused[ level.extraspawnpointsused.size ] = spawnpoints[ index ]; + spawnpoints[index].fakeclassname = spawnpointname; + level.extraspawnpointsused[level.extraspawnpointsused.size] = spawnpoints[index]; #/ - */ - } + } } -dropspawnpoints( spawnpointname ) //checked changed to match cerberus output +dropspawnpoints( spawnpointname ) { - spawnpoints = getspawnpointarray( spawnpointname ); - if ( !spawnpoints.size ) - { - /* + spawnpoints = getspawnpointarray( spawnpointname ); + + if ( !spawnpoints.size ) + { /# - println( "^1No " + spawnpointname + " spawnpoints found in level!" ); + println( "^1No " + spawnpointname + " spawnpoints found in level!" ); #/ - */ - return; - } - for ( index = 0; index < spawnpoints.size; index++ ) - { - spawnpoints[ index ] placespawnpoint(); - } + return; + } + + for ( index = 0; index < spawnpoints.size; index++ ) + spawnpoints[index] placespawnpoint(); } -addspawnpointclassname( spawnpointclassname ) //checked matches cerberus output +addspawnpointclassname( spawnpointclassname ) { - if ( !isDefined( level.spawn_point_class_names ) ) - { - level.spawn_point_class_names = []; - } - level.spawn_point_class_names[ level.spawn_point_class_names.size ] = spawnpointclassname; + if ( !isdefined( level.spawn_point_class_names ) ) + level.spawn_point_class_names = []; + + level.spawn_point_class_names[level.spawn_point_class_names.size] = spawnpointclassname; } -addspawnpointteamclassname( team, spawnpointclassname ) //checked matches cerberus output +addspawnpointteamclassname( team, spawnpointclassname ) { - level.spawn_point_team_class_names[ team ][ level.spawn_point_team_class_names[ team ].size ] = spawnpointclassname; + level.spawn_point_team_class_names[team][level.spawn_point_team_class_names[team].size] = spawnpointclassname; } -getspawnpointarray( classname ) //checked changed to match cerberus output +getspawnpointarray( classname ) { - spawnpoints = getentarray( classname, "classname" ); - if ( !isDefined( level.extraspawnpoints ) || !isDefined( level.extraspawnpoints[ classname ] ) ) - { - return spawnpoints; - } - for ( i = 0; i < level.extraspawnpoints[classname].size; i++ ) - { - spawnpoints[ spawnpoints.size ] = level.extraspawnpoints[ classname ][ i ]; - } - return spawnpoints; + spawnpoints = getentarray( classname, "classname" ); + + if ( !isdefined( level.extraspawnpoints ) || !isdefined( level.extraspawnpoints[classname] ) ) + return spawnpoints; + + for ( i = 0; i < level.extraspawnpoints[classname].size; i++ ) + spawnpoints[spawnpoints.size] = level.extraspawnpoints[classname][i]; + + return spawnpoints; } -spawnpointinit() //checked changed to match cerberus output +spawnpointinit() { - spawnpoint = self; - origin = spawnpoint.origin; - if ( !level.spawnminsmaxsprimed ) - { - level.spawnmins = origin; - level.spawnmaxs = origin; - level.spawnminsmaxsprimed = 1; - } - else - { - level.spawnmins = expandmins( level.spawnmins, origin ); - level.spawnmaxs = expandmaxs( level.spawnmaxs, origin ); - } - spawnpoint placespawnpoint(); - spawnpoint.forward = anglesToForward( spawnpoint.angles ); - spawnpoint.sighttracepoint = spawnpoint.origin + vectorScale( ( 0, 0, 1 ), 50 ); - spawnpoint.inited = 1; + spawnpoint = self; + origin = spawnpoint.origin; + + if ( !level.spawnminsmaxsprimed ) + { + level.spawnmins = origin; + level.spawnmaxs = origin; + level.spawnminsmaxsprimed = 1; + } + else + { + level.spawnmins = expandmins( level.spawnmins, origin ); + level.spawnmaxs = expandmaxs( level.spawnmaxs, origin ); + } + + spawnpoint placespawnpoint(); + spawnpoint.forward = anglestoforward( spawnpoint.angles ); + spawnpoint.sighttracepoint = spawnpoint.origin + vectorscale( ( 0, 0, 1 ), 50.0 ); + spawnpoint.inited = 1; } -getteamspawnpoints( team ) //checked matches cerberus output +getteamspawnpoints( team ) { - return level.teamspawnpoints[ team ]; + return level.teamspawnpoints[team]; } -getspawnpoint_final( spawnpoints, useweights ) //checked partially changed to match cerberus output see info.md +getspawnpoint_final( spawnpoints, useweights ) { - bestspawnpoint = undefined; - if ( !isDefined( spawnpoints ) || spawnpoints.size == 0 ) - { - return undefined; - } - if ( !isDefined( useweights ) ) - { - useweights = 1; - } - if ( useweights ) - { - bestspawnpoint = getbestweightedspawnpoint( spawnpoints ); - thread spawnweightdebug( spawnpoints ); - } - else - { - i = 0; - while ( i < spawnpoints.size ) - { - if ( isDefined( self.lastspawnpoint ) && self.lastspawnpoint == spawnpoints[ i ] ) - { - i++; - continue; - } - if ( positionwouldtelefrag( spawnpoints[ i ].origin ) ) - { - i++; - continue; - } - bestspawnpoint = spawnpoints[ i ]; - break; - } - if ( !isDefined( bestspawnpoint ) ) - { - if ( isDefined( self.lastspawnpoint ) && !positionwouldtelefrag( self.lastspawnpoint.origin ) ) - { - for ( i = 0; i < spawnpoints.size; i++ ) - { - if ( spawnpoints[ i ] == self.lastspawnpoint ) - { - bestspawnpoint = spawnpoints[ i ]; - break; - } - } - } - } - } - if ( !isDefined( bestspawnpoint ) ) - { - if ( useweights ) - { - bestspawnpoint = spawnpoints[ randomint( spawnpoints.size ) ]; - } - else - { - bestspawnpoint = spawnpoints[ 0 ]; - } - } - self finalizespawnpointchoice( bestspawnpoint ); - /* + bestspawnpoint = undefined; + + if ( !isdefined( spawnpoints ) || spawnpoints.size == 0 ) + return undefined; + + if ( !isdefined( useweights ) ) + useweights = 1; + + if ( useweights ) + { + bestspawnpoint = getbestweightedspawnpoint( spawnpoints ); + thread spawnweightdebug( spawnpoints ); + } + else + { + for ( i = 0; i < spawnpoints.size; i++ ) + { + if ( isdefined( self.lastspawnpoint ) && self.lastspawnpoint == spawnpoints[i] ) + continue; + + if ( positionwouldtelefrag( spawnpoints[i].origin ) ) + continue; + + bestspawnpoint = spawnpoints[i]; + break; + } + + if ( !isdefined( bestspawnpoint ) ) + { + if ( isdefined( self.lastspawnpoint ) && !positionwouldtelefrag( self.lastspawnpoint.origin ) ) + { + for ( i = 0; i < spawnpoints.size; i++ ) + { + if ( spawnpoints[i] == self.lastspawnpoint ) + { + bestspawnpoint = spawnpoints[i]; + break; + } + } + } + } + } + + if ( !isdefined( bestspawnpoint ) ) + { + if ( useweights ) + bestspawnpoint = spawnpoints[randomint( spawnpoints.size )]; + else + bestspawnpoint = spawnpoints[0]; + } + + self finalizespawnpointchoice( bestspawnpoint ); /# - self storespawndata( spawnpoints, useweights, bestspawnpoint ); + self storespawndata( spawnpoints, useweights, bestspawnpoint ); #/ - */ - return bestspawnpoint; + return bestspawnpoint; } -finalizespawnpointchoice( spawnpoint ) //checked matches cerberus output +finalizespawnpointchoice( spawnpoint ) { - time = getTime(); - self.lastspawnpoint = spawnpoint; - self.lastspawntime = time; - spawnpoint.lastspawnedplayer = self; - spawnpoint.lastspawntime = time; + time = gettime(); + self.lastspawnpoint = spawnpoint; + self.lastspawntime = time; + spawnpoint.lastspawnedplayer = self; + spawnpoint.lastspawntime = time; } -getbestweightedspawnpoint( spawnpoints ) //checked partially changed to match cerberus output see info.md +getbestweightedspawnpoint( spawnpoints ) { - maxsighttracedspawnpoints = 3; - for ( try = 0; try <= maxsighttracedspawnpoints; try++ ) - { - bestspawnpoints = []; - bestweight = undefined; - bestspawnpoint = undefined; - i = 0; - while ( i < spawnpoints.size ) - { - if ( !isDefined( bestweight ) || spawnpoints[ i ].weight > bestweight ) - { - if ( positionwouldtelefrag( spawnpoints[ i ].origin ) ) - { - i++; - continue; - } - bestspawnpoints = []; - bestspawnpoints[ 0 ] = spawnpoints[ i ]; - bestweight = spawnpoints[ i ].weight; - i++; - continue; - } - if ( spawnpoints[ i ].weight == bestweight ) - { - if ( positionwouldtelefrag( spawnpoints[ i ].origin ) ) - { - i++; - continue; - } - bestspawnpoints[ bestspawnpoints.size ] = spawnpoints[ i ]; - } - i++; - } - if ( bestspawnpoints.size == 0 ) - { - return undefined; - } - bestspawnpoint = bestspawnpoints[ randomint( bestspawnpoints.size ) ]; - if ( try == maxsighttracedspawnpoints ) - { - return bestspawnpoint; - } - if ( isDefined( bestspawnpoint.lastsighttracetime ) && bestspawnpoint.lastsighttracetime == getTime() ) - { - return bestspawnpoint; - } - if ( !lastminutesighttraces( bestspawnpoint ) ) - { - return bestspawnpoint; - } - penalty = getlospenalty(); - /* + maxsighttracedspawnpoints = 3; + + for ( try = 0; try <= maxsighttracedspawnpoints; try++ ) + { + bestspawnpoints = []; + bestweight = undefined; + bestspawnpoint = undefined; + + for ( i = 0; i < spawnpoints.size; i++ ) + { + if ( !isdefined( bestweight ) || spawnpoints[i].weight > bestweight ) + { + if ( positionwouldtelefrag( spawnpoints[i].origin ) ) + continue; + + bestspawnpoints = []; + bestspawnpoints[0] = spawnpoints[i]; + bestweight = spawnpoints[i].weight; + continue; + } + + if ( spawnpoints[i].weight == bestweight ) + { + if ( positionwouldtelefrag( spawnpoints[i].origin ) ) + continue; + + bestspawnpoints[bestspawnpoints.size] = spawnpoints[i]; + } + } + + if ( bestspawnpoints.size == 0 ) + return undefined; + + bestspawnpoint = bestspawnpoints[randomint( bestspawnpoints.size )]; + + if ( try == maxsighttracedspawnpoints ) + return bestspawnpoint; + + if ( isdefined( bestspawnpoint.lastsighttracetime ) && bestspawnpoint.lastsighttracetime == gettime() ) + return bestspawnpoint; + + if ( !lastminutesighttraces( bestspawnpoint ) ) + return bestspawnpoint; + + penalty = getlospenalty(); /# - if ( level.storespawndata || level.debugspawning ) - { - bestspawnpoint.spawndata[ bestspawnpoint.spawndata.size ] = "Last minute sight trace: -" + penalty; + if ( level.storespawndata || level.debugspawning ) + bestspawnpoint.spawndata[bestspawnpoint.spawndata.size] = "Last minute sight trace: -" + penalty; #/ - } - */ - bestspawnpoint.weight -= penalty; - bestspawnpoint.lastsighttracetime = getTime(); - } + bestspawnpoint.weight -= penalty; + bestspawnpoint.lastsighttracetime = gettime(); + } } -checkbad( spawnpoint ) //checked partially changed to match cerberus output see info.md +checkbad( spawnpoint ) { - /* /# - i = 0; - while ( i < level.players.size ) - { - player = level.players[ i ]; - if ( !isalive( player ) || player.sessionstate != "playing" ) - { - i++; - continue; - } - if ( level.teambased && player.team == self.team ) - { - i++; - continue; - } - losexists = bullettracepassed( player.origin + vectorScale( ( 0, 0, 1 ), 50 ), spawnpoint.sighttracepoint, 0, undefined ); - if ( losexists ) - { - thread badspawnline( spawnpoint.sighttracepoint, player.origin + vectorScale( ( 0, 0, 1 ), 50 ), self.name, player.name ); - } - i++; + for ( i = 0; i < level.players.size; i++ ) + { + player = level.players[i]; + + if ( !isalive( player ) || player.sessionstate != "playing" ) + continue; + + if ( level.teambased && player.team == self.team ) + continue; + + losexists = bullettracepassed( player.origin + vectorscale( ( 0, 0, 1 ), 50.0 ), spawnpoint.sighttracepoint, 0, undefined ); + + if ( losexists ) + thread badspawnline( spawnpoint.sighttracepoint, player.origin + vectorscale( ( 0, 0, 1 ), 50.0 ), self.name, player.name ); + } #/ - } - */ } -badspawnline( start, end, name1, name2 ) //checked changed to match cerberus output +badspawnline( start, end, name1, name2 ) { - /* /# - dist = distance( start, end ); - for ( i = 0; i < 200; i++ ) - { - line( start, end, ( 1, 0, 0 ) ); - print3d( start, "Bad spawn! " + name1 + ", dist = " + dist ); - print3d( end, name2 ); - wait 0.05; + dist = distance( start, end ); + + for ( i = 0; i < 200; i++ ) + { + line( start, end, ( 1, 0, 0 ) ); + print3d( start, "Bad spawn! " + name1 + ", dist = " + dist ); + print3d( end, name2 ); + wait 0.05; + } #/ - } - */ } -storespawndata( spawnpoints, useweights, bestspawnpoint ) //checked partially changed to match cerberus output see info.md +storespawndata( spawnpoints, useweights, bestspawnpoint ) { - /* /# - if ( !isDefined( level.storespawndata ) || !level.storespawndata ) - { - return; - } - level.storespawndata = getDvarInt( "scr_recordspawndata" ); - if ( !level.storespawndata ) - { - return; - } - if ( !isDefined( level.spawnid ) ) - { - level.spawngameid = randomint( 100 ); - level.spawnid = 0; - } - if ( bestspawnpoint.classname == "mp_global_intermission" ) - { - return; - } - level.spawnid++; - file = openfile( "spawndata.txt", "append" ); - fprintfields( file, ( level.spawngameid + "." ) + level.spawnid + "," + spawnpoints.size + "," + self.name ); - for ( i = 0; i < spawnpoints.size; i++ ) - { - str = vectostr( spawnpoints[ i ].origin ) + ","; - if ( spawnpoints[ i ] == bestspawnpoint ) - { - str += "1,"; - } - else - { - str += "0,"; - } - if ( !useweights ) - { - str += "0,"; - } - else - { - str += spawnpoints[ i ].weight + ","; - } - if ( !isDefined( spawnpoints[ i ].spawndata ) ) - { - spawnpoints[ i ].spawndata = []; - } - if ( !isDefined( spawnpoints[ i ].sightchecks ) ) - { - spawnpoints[ i ].sightchecks = []; - } - str += spawnpoints[ i ].spawndata.size + ","; - for ( j = 0; j < spawnpoints[i].spawndata.size; j++ ) - { - str += spawnpoints[ i ].spawndata[ j ] + ","; - } - str += spawnpoints[ i ].sightchecks.size + ","; - for ( j = 0; j < spawnpoints[i].sightchecks.size; j++ ) - { - str += ( spawnpoints[ i ].sightchecks[ j ].penalty + "," ) + vectostr( spawnpoints[ i ].origin ) + ","; - } - fprintfields( file, str ); - } - obj = spawnstruct(); - getallalliedandenemyplayers( obj ); - numallies = 0; - numenemies = 0; - str = ""; - i = 0; - while ( i < obj.allies.size ) - { - if ( obj.allies[ i ] == self ) - { - i++; - continue; - } - numallies++; - str += vectostr( obj.allies[ i ].origin ) + ","; - i++; - } - for ( i = 0; i < obj.enemies.size; i++ ) - { - numenemies++; - str += vectostr( obj.enemies[ i ].origin ) + ","; - } - str = ( numallies + "," ) + numenemies + "," + str; - fprintfields( file, str ); - otherdata = []; - if ( isDefined( level.bombguy ) ) - { - index = otherdata.size; - otherdata[ index ] = spawnstruct(); - otherdata[ index ].origin = level.bombguy.origin + vectorScale( ( 0, 0, 1 ), 20 ); - otherdata[ index ].text = "Bomb holder"; - } - else if ( isDefined( level.bombpos ) ) - { - index = otherdata.size; - otherdata[ index ] = spawnstruct(); - otherdata[ index ].origin = level.bombpos; - otherdata[ index ].text = "Bomb"; - } - if ( isDefined( level.flags ) ) - { - for ( i = 0; i < level.flags.size; i++ ) - { - index = otherdata.size; - otherdata[ index ] = spawnstruct(); - otherdata[ index ].origin = level.flags[ i ].origin; - otherdata[ index ].text = level.flags[ i ].useobj maps/mp/gametypes/_gameobjects::getownerteam() + " flag"; - } - } - str = otherdata.size + ","; - for ( i = 0; i < otherdata.size; i++ ) - { - str += vectostr( otherdata[ i ].origin ) + "," + otherdata[ i ].text + ","; - } - fprintfields( file, str ); - closefile( file ); - thisspawnid = ( level.spawngameid + "." ) + level.spawnid; - self.thisspawnid = thisspawnid; + if ( !isdefined( level.storespawndata ) || !level.storespawndata ) + return; + + level.storespawndata = getdvarint( "scr_recordspawndata" ); + + if ( !level.storespawndata ) + return; + + if ( !isdefined( level.spawnid ) ) + { + level.spawngameid = randomint( 100 ); + level.spawnid = 0; + } + + if ( bestspawnpoint.classname == "mp_global_intermission" ) + return; + + level.spawnid++; + file = openfile( "spawndata.txt", "append" ); + fprintfields( file, level.spawngameid + "." + level.spawnid + "," + spawnpoints.size + "," + self.name ); + + for ( i = 0; i < spawnpoints.size; i++ ) + { + str = vectostr( spawnpoints[i].origin ) + ","; + + if ( spawnpoints[i] == bestspawnpoint ) + str += "1,"; + else + str += "0,"; + + if ( !useweights ) + str += "0,"; + else + str += ( spawnpoints[i].weight + "," ); + + if ( !isdefined( spawnpoints[i].spawndata ) ) + spawnpoints[i].spawndata = []; + + if ( !isdefined( spawnpoints[i].sightchecks ) ) + spawnpoints[i].sightchecks = []; + + str += ( spawnpoints[i].spawndata.size + "," ); + + for ( j = 0; j < spawnpoints[i].spawndata.size; j++ ) + str += ( spawnpoints[i].spawndata[j] + "," ); + + str += ( spawnpoints[i].sightchecks.size + "," ); + + for ( j = 0; j < spawnpoints[i].sightchecks.size; j++ ) + str += ( spawnpoints[i].sightchecks[j].penalty + "," + vectostr( spawnpoints[i].origin ) + "," ); + + fprintfields( file, str ); + } + + obj = spawnstruct(); + getallalliedandenemyplayers( obj ); + numallies = 0; + numenemies = 0; + str = ""; + + for ( i = 0; i < obj.allies.size; i++ ) + { + if ( obj.allies[i] == self ) + continue; + + numallies++; + str += ( vectostr( obj.allies[i].origin ) + "," ); + } + + for ( i = 0; i < obj.enemies.size; i++ ) + { + numenemies++; + str += ( vectostr( obj.enemies[i].origin ) + "," ); + } + + str = numallies + "," + numenemies + "," + str; + fprintfields( file, str ); + otherdata = []; + + if ( isdefined( level.bombguy ) ) + { + index = otherdata.size; + otherdata[index] = spawnstruct(); + otherdata[index].origin = level.bombguy.origin + vectorscale( ( 0, 0, 1 ), 20.0 ); + otherdata[index].text = "Bomb holder"; + } + else if ( isdefined( level.bombpos ) ) + { + index = otherdata.size; + otherdata[index] = spawnstruct(); + otherdata[index].origin = level.bombpos; + otherdata[index].text = "Bomb"; + } + + if ( isdefined( level.flags ) ) + { + for ( i = 0; i < level.flags.size; i++ ) + { + index = otherdata.size; + otherdata[index] = spawnstruct(); + otherdata[index].origin = level.flags[i].origin; + otherdata[index].text = level.flags[i].useobj maps\mp\gametypes\_gameobjects::getownerteam() + " flag"; + } + } + + str = otherdata.size + ","; + + for ( i = 0; i < otherdata.size; i++ ) + str += ( vectostr( otherdata[i].origin ) + "," + otherdata[i].text + "," ); + + fprintfields( file, str ); + closefile( file ); + thisspawnid = level.spawngameid + "." + level.spawnid; + + if ( isdefined( self.thisspawnid ) ) + { + + } + + self.thisspawnid = thisspawnid; #/ - */ } -readspawndata( desiredid, relativepos ) //dev call did not check +readspawndata( desiredid, relativepos ) { - /* /# - file = openfile( "spawndata.txt", "read" ); - if ( file < 0 ) - { - return; - } - oldspawndata = level.curspawndata; - level.curspawndata = undefined; - prev = undefined; - prevthisplayer = undefined; - lookingfornextthisplayer = 0; - lookingfornext = 0; - if ( isDefined( relativepos ) && !isDefined( oldspawndata ) ) - { - return; - } - while ( 1 ) - { - if ( freadln( file ) <= 0 ) - { - break; - } - else data = spawnstruct(); - data.id = fgetarg( file, 0 ); - numspawns = int( fgetarg( file, 1 ) ); - if ( numspawns > 256 ) - { - break; - } - else data.playername = fgetarg( file, 2 ); - data.spawnpoints = []; - data.friends = []; - data.enemies = []; - data.otherdata = []; - i = 0; - while ( i < numspawns ) - { - if ( freadln( file ) <= 0 ) - { - break; - } - else spawnpoint = spawnstruct(); - spawnpoint.origin = strtovec( fgetarg( file, 0 ) ); - spawnpoint.winner = int( fgetarg( file, 1 ) ); - spawnpoint.weight = int( fgetarg( file, 2 ) ); - spawnpoint.data = []; - spawnpoint.sightchecks = []; - if ( i == 0 ) - { - data.minweight = spawnpoint.weight; - data.maxweight = spawnpoint.weight; - } - else - { - if ( spawnpoint.weight < data.minweight ) - { - data.minweight = spawnpoint.weight; - } - if ( spawnpoint.weight > data.maxweight ) - { - data.maxweight = spawnpoint.weight; - } - } - argnum = 4; - numdata = int( fgetarg( file, 3 ) ); - if ( numdata > 256 ) - { - break; - } - else j = 0; - while ( j < numdata ) - { - spawnpoint.data[ spawnpoint.data.size ] = fgetarg( file, argnum ); - argnum++; - j++; - } - numsightchecks = int( fgetarg( file, argnum ) ); - argnum++; - if ( numsightchecks > 256 ) - { - break; - } - else - { - j = 0; - while ( j < numsightchecks ) - { - index = spawnpoint.sightchecks.size; - spawnpoint.sightchecks[ index ] = spawnstruct(); - spawnpoint.sightchecks[ index ].penalty = int( fgetarg( file, argnum ) ); - argnum++; - spawnpoint.sightchecks[ index ].origin = strtovec( fgetarg( file, argnum ) ); - argnum++; - j++; - } - data.spawnpoints[ data.spawnpoints.size ] = spawnpoint; - i++; - } - } - if ( !isDefined( data.minweight ) ) - { - data.minweight = -1; - data.maxweight = 0; - } - if ( data.minweight == data.maxweight ) - { - data.minweight -= 1; - } - if ( freadln( file ) <= 0 ) - { - break; - } - else numfriends = int( fgetarg( file, 0 ) ); - numenemies = int( fgetarg( file, 1 ) ); - if ( numfriends > 32 || numenemies > 32 ) - { - break; - } - else - { - argnum = 2; - i = 0; - while ( i < numfriends ) - { - data.friends[ data.friends.size ] = strtovec( fgetarg( file, argnum ) ); - argnum++; - i++; - } - i = 0; - while ( i < numenemies ) - { - data.enemies[ data.enemies.size ] = strtovec( fgetarg( file, argnum ) ); - argnum++; - i++; - } - if ( freadln( file ) <= 0 ) - { - break; - } - else numotherdata = int( fgetarg( file, 0 ) ); - argnum = 1; - i = 0; - while ( i < numotherdata ) - { - otherdata = spawnstruct(); - otherdata.origin = strtovec( fgetarg( file, argnum ) ); - argnum++; - otherdata.text = fgetarg( file, argnum ); - argnum++; - data.otherdata[ data.otherdata.size ] = otherdata; - i++; - } - if ( isDefined( relativepos ) ) - { - if ( relativepos == "prevthisplayer" ) - { - if ( data.id == oldspawndata.id ) - { - level.curspawndata = prevthisplayer; - break; - } - else } - else if ( relativepos == "prev" ) - { - if ( data.id == oldspawndata.id ) - { - level.curspawndata = prev; - break; - } - else } - else if ( relativepos == "nextthisplayer" ) - { - if ( lookingfornextthisplayer ) - { - level.curspawndata = data; - break; - } - else if ( data.id == oldspawndata.id ) - { - lookingfornextthisplayer = 1; - } - } - else if ( relativepos == "next" ) - { - if ( lookingfornext ) - { - level.curspawndata = data; - break; - } - else if ( data.id == oldspawndata.id ) - { - lookingfornext = 1; - } - } - } - else - { - if ( data.id == desiredid ) - { - level.curspawndata = data; - break; - } - } - else - { - prev = data; - if ( isDefined( oldspawndata ) && data.playername == oldspawndata.playername ) - { - prevthisplayer = data; - } - } - } - } - closefile( file ); + file = openfile( "spawndata.txt", "read" ); + + if ( file < 0 ) + return; + + oldspawndata = level.curspawndata; + level.curspawndata = undefined; + prev = undefined; + prevthisplayer = undefined; + lookingfornextthisplayer = 0; + lookingfornext = 0; + + if ( isdefined( relativepos ) && !isdefined( oldspawndata ) ) + return; + + while ( true ) + { + if ( freadln( file ) <= 0 ) + break; + + data = spawnstruct(); + data.id = fgetarg( file, 0 ); + numspawns = int( fgetarg( file, 1 ) ); + + if ( numspawns > 256 ) + break; + + data.playername = fgetarg( file, 2 ); + data.spawnpoints = []; + data.friends = []; + data.enemies = []; + data.otherdata = []; + + for ( i = 0; i < numspawns; i++ ) + { + if ( freadln( file ) <= 0 ) + break; + + spawnpoint = spawnstruct(); + spawnpoint.origin = strtovec( fgetarg( file, 0 ) ); + spawnpoint.winner = int( fgetarg( file, 1 ) ); + spawnpoint.weight = int( fgetarg( file, 2 ) ); + spawnpoint.data = []; + spawnpoint.sightchecks = []; + + if ( i == 0 ) + { + data.minweight = spawnpoint.weight; + data.maxweight = spawnpoint.weight; + } + else + { + if ( spawnpoint.weight < data.minweight ) + data.minweight = spawnpoint.weight; + + if ( spawnpoint.weight > data.maxweight ) + data.maxweight = spawnpoint.weight; + } + + argnum = 4; + numdata = int( fgetarg( file, 3 ) ); + + if ( numdata > 256 ) + break; + + for ( j = 0; j < numdata; j++ ) + { + spawnpoint.data[spawnpoint.data.size] = fgetarg( file, argnum ); + argnum++; + } + + numsightchecks = int( fgetarg( file, argnum ) ); + argnum++; + + if ( numsightchecks > 256 ) + break; + + for ( j = 0; j < numsightchecks; j++ ) + { + index = spawnpoint.sightchecks.size; + spawnpoint.sightchecks[index] = spawnstruct(); + spawnpoint.sightchecks[index].penalty = int( fgetarg( file, argnum ) ); + argnum++; + spawnpoint.sightchecks[index].origin = strtovec( fgetarg( file, argnum ) ); + argnum++; + } + + data.spawnpoints[data.spawnpoints.size] = spawnpoint; + } + + if ( !isdefined( data.minweight ) ) + { + data.minweight = -1; + data.maxweight = 0; + } + + if ( data.minweight == data.maxweight ) + data.minweight -= 1; + + if ( freadln( file ) <= 0 ) + break; + + numfriends = int( fgetarg( file, 0 ) ); + numenemies = int( fgetarg( file, 1 ) ); + + if ( numfriends > 32 || numenemies > 32 ) + break; + + argnum = 2; + + for ( i = 0; i < numfriends; i++ ) + { + data.friends[data.friends.size] = strtovec( fgetarg( file, argnum ) ); + argnum++; + } + + for ( i = 0; i < numenemies; i++ ) + { + data.enemies[data.enemies.size] = strtovec( fgetarg( file, argnum ) ); + argnum++; + } + + if ( freadln( file ) <= 0 ) + break; + + numotherdata = int( fgetarg( file, 0 ) ); + argnum = 1; + + for ( i = 0; i < numotherdata; i++ ) + { + otherdata = spawnstruct(); + otherdata.origin = strtovec( fgetarg( file, argnum ) ); + argnum++; + otherdata.text = fgetarg( file, argnum ); + argnum++; + data.otherdata[data.otherdata.size] = otherdata; + } + + if ( isdefined( relativepos ) ) + { + if ( relativepos == "prevthisplayer" ) + { + if ( data.id == oldspawndata.id ) + { + level.curspawndata = prevthisplayer; + break; + } + } + else if ( relativepos == "prev" ) + { + if ( data.id == oldspawndata.id ) + { + level.curspawndata = prev; + break; + } + } + else if ( relativepos == "nextthisplayer" ) + { + if ( lookingfornextthisplayer ) + { + level.curspawndata = data; + break; + } + else if ( data.id == oldspawndata.id ) + lookingfornextthisplayer = 1; + } + else if ( relativepos == "next" ) + { + if ( lookingfornext ) + { + level.curspawndata = data; + break; + } + else if ( data.id == oldspawndata.id ) + lookingfornext = 1; + } + } + else if ( data.id == desiredid ) + { + level.curspawndata = data; + break; + } + + prev = data; + + if ( isdefined( oldspawndata ) && data.playername == oldspawndata.playername ) + prevthisplayer = data; + } + + closefile( file ); #/ - */ } -drawspawndata() //dev call did not check +drawspawndata() { - /* /# - level notify( "drawing_spawn_data" ); - level endon( "drawing_spawn_data" ); - textoffset = vectorScale( ( -1, -1, -1 ), 12 ); - while ( 1 ) - { - while ( !isDefined( level.curspawndata ) ) - { - wait 0,5; - } - i = 0; - while ( i < level.curspawndata.friends.size ) - { - print3d( level.curspawndata.friends[ i ], "=)", ( 0,5, 1, 0,5 ), 1, 5 ); - i++; - } - i = 0; - while ( i < level.curspawndata.enemies.size ) - { - print3d( level.curspawndata.enemies[ i ], "=(", ( 1, 0,5, 0,5 ), 1, 5 ); - i++; - } - i = 0; - while ( i < level.curspawndata.otherdata.size ) - { - print3d( level.curspawndata.otherdata[ i ].origin, level.curspawndata.otherdata[ i ].text, ( 0,5, 0,75, 1 ), 1, 2 ); - i++; - } - i = 0; - while ( i < level.curspawndata.spawnpoints.size ) - { - sp = level.curspawndata.spawnpoints[ i ]; - orig = sp.sighttracepoint; - if ( sp.winner ) - { - print3d( orig, level.curspawndata.playername + " spawned here", ( 0,5, 0,5, 1 ), 1, 2 ); - orig += textoffset; - } - amnt = ( sp.weight - level.curspawndata.minweight ) / ( level.curspawndata.maxweight - level.curspawndata.minweight ); - print3d( orig, "Weight: " + sp.weight, ( 1 - amnt, amnt, 0,5 ) ); - orig += textoffset; - j = 0; - while ( j < sp.data.size ) - { - print3d( orig, sp.data[ j ], ( -1, -1, -1 ) ); - orig += textoffset; - j++; - } - j = 0; - while ( j < sp.sightchecks.size ) - { - print3d( orig, "Sightchecks: -" + sp.sightchecks[ j ].penalty, ( 1, 0,5, 0,5 ) ); - orig += textoffset; - j++; - } - i++; - } - wait 0,05; + level notify( "drawing_spawn_data" ); + level endon( "drawing_spawn_data" ); + textoffset = vectorscale( ( 0, 0, -1 ), 12.0 ); + + while ( true ) + { + if ( !isdefined( level.curspawndata ) ) + { + wait 0.5; + continue; + } + + for ( i = 0; i < level.curspawndata.friends.size; i++ ) + print3d( level.curspawndata.friends[i], "=)", ( 0.5, 1, 0.5 ), 1, 5 ); + + for ( i = 0; i < level.curspawndata.enemies.size; i++ ) + print3d( level.curspawndata.enemies[i], "=(", ( 1, 0.5, 0.5 ), 1, 5 ); + + for ( i = 0; i < level.curspawndata.otherdata.size; i++ ) + print3d( level.curspawndata.otherdata[i].origin, level.curspawndata.otherdata[i].text, ( 0.5, 0.75, 1 ), 1, 2 ); + + for ( i = 0; i < level.curspawndata.spawnpoints.size; i++ ) + { + sp = level.curspawndata.spawnpoints[i]; + orig = sp.sighttracepoint; + + if ( sp.winner ) + { + print3d( orig, level.curspawndata.playername + " spawned here", ( 0.5, 0.5, 1 ), 1, 2 ); + orig += textoffset; + } + + amnt = ( sp.weight - level.curspawndata.minweight ) / ( level.curspawndata.maxweight - level.curspawndata.minweight ); + print3d( orig, "Weight: " + sp.weight, ( 1 - amnt, amnt, 0.5 ) ); + orig += textoffset; + + for ( j = 0; j < sp.data.size; j++ ) + { + print3d( orig, sp.data[j], ( 1, 1, 1 ) ); + orig += textoffset; + } + + for ( j = 0; j < sp.sightchecks.size; j++ ) + { + print3d( orig, "Sightchecks: -" + sp.sightchecks[j].penalty, ( 1, 0.5, 0.5 ) ); + orig += textoffset; + } + } + + wait 0.05; + } #/ - } - */ } -vectostr( vec ) //dev call did not check +vectostr( vec ) { - /* /# - return int( vec[ 0 ] ) + "/" + int( vec[ 1 ] ) + "/" + int( vec[ 2 ] ); + return int( vec[0] ) + "/" + int( vec[1] ) + "/" + int( vec[2] ); #/ - */ } -strtovec( str ) //dev call did not check +strtovec( str ) { - /* /# - parts = strtok( str, "/" ); - if ( parts.size != 3 ) - { - return ( -1, -1, -1 ); - } - return ( int( parts[ 0 ] ), int( parts[ 1 ] ), int( parts[ 2 ] ) ); + parts = strtok( str, "/" ); + + if ( parts.size != 3 ) + return ( 0, 0, 0 ); + + return ( int( parts[0] ), int( parts[1] ), int( parts[2] ) ); #/ - */ } -getspawnpoint_random( spawnpoints ) //checked changed to match cerberus output +getspawnpoint_random( spawnpoints ) { - if ( !isDefined( spawnpoints ) ) - { - return undefined; - } - for ( i = 0; i < spawnpoints.size; i++ ) - { - j = randomint( spawnpoints.size ); - spawnpoint = spawnpoints[ i ]; - spawnpoints[ i ] = spawnpoints[ j ]; - spawnpoints[ j ] = spawnpoint; - } - return getspawnpoint_final( spawnpoints, 0 ); + if ( !isdefined( spawnpoints ) ) + return undefined; + + for ( i = 0; i < spawnpoints.size; i++ ) + { + j = randomint( spawnpoints.size ); + spawnpoint = spawnpoints[i]; + spawnpoints[i] = spawnpoints[j]; + spawnpoints[j] = spawnpoint; + } + + return getspawnpoint_final( spawnpoints, 0 ); } -getallotherplayers() //checked partially changed to match cerberus output see info.md +getallotherplayers() { - aliveplayers = []; - i = 0; - while ( i < level.players.size ) - { - if ( !isDefined( level.players[ i ] ) ) - { - i++; - continue; - } - player = level.players[ i ]; - if ( player.sessionstate != "playing" || player == self ) - { - i++; - continue; - } - aliveplayers[ aliveplayers.size ] = player; - i++; - } - return aliveplayers; + aliveplayers = []; + + for ( i = 0; i < level.players.size; i++ ) + { + if ( !isdefined( level.players[i] ) ) + continue; + + player = level.players[i]; + + if ( player.sessionstate != "playing" || player == self ) + continue; + + aliveplayers[aliveplayers.size] = player; + } + + return aliveplayers; } -getallalliedandenemyplayers( obj ) //checked partially changed to match cerberus output changed at own discretion see info.md +getallalliedandenemyplayers( obj ) { - if ( level.teambased ) - { - /* + if ( level.teambased ) + { /# - assert( isDefined( level.teams[ self.team ] ) ); + assert( isdefined( level.teams[self.team] ) ); #/ - */ - obj.allies = level.aliveplayers[ self.team ]; - obj.enemies = undefined; - foreach ( team in level.teams ) - { - if ( team == self.team ) - { - } - else if ( !isDefined( obj.enemies ) ) - { - obj.enemies = level.aliveplayers[ team ]; - } - else - { - i = 0; - while ( i < level.aliveplayers[ team ].size ) - { - obj.enemies[ obj.enemies.size ] = level.aliveplayers[ team ][ i ]; - i++; - } - } - } - } - else - { - obj.allies = []; - obj.enemies = level.activeplayers; - } + obj.allies = level.aliveplayers[self.team]; + obj.enemies = undefined; + + foreach ( team in level.teams ) + { + if ( team == self.team ) + continue; + + if ( !isdefined( obj.enemies ) ) + { + obj.enemies = level.aliveplayers[team]; + continue; + } + + foreach ( player in level.aliveplayers[team] ) + obj.enemies[obj.enemies.size] = player; + } + } + else + { + obj.allies = []; + obj.enemies = level.activeplayers; + } } -initweights( spawnpoints ) //checked changed to match cerberus output +initweights( spawnpoints ) { - for ( i = 0; i < spawnpoints.size; i++ ) - { - spawnpoints[ i ].weight = 0; - } - /* + for ( i = 0; i < spawnpoints.size; i++ ) + spawnpoints[i].weight = 0; + /# - if ( level.storespawndata || level.debugspawning ) - { - for ( i = 0; i < spawnpoints.size; i++ ) - { - spawnpoints[ i ].spawndata = []; - spawnpoints[ i ].sightchecks = []; + if ( level.storespawndata || level.debugspawning ) + { + for ( i = 0; i < spawnpoints.size; i++ ) + { + spawnpoints[i].spawndata = []; + spawnpoints[i].sightchecks = []; + } + } #/ - } - } - */ } -getspawnpoint_nearteam( spawnpoints, favoredspawnpoints ) //checked partially changed to match beta dump see info.md +getspawnpoint_nearteam( spawnpoints, favoredspawnpoints ) { - if ( !isDefined( spawnpoints ) ) - { - return undefined; - } - /* + if ( !isdefined( spawnpoints ) ) + return undefined; + /# - if ( getDvar( "scr_spawn_randomly" ) == "" ) - { - setdvar( "scr_spawn_randomly", "0" ); - } - if ( getDvar( "scr_spawn_randomly" ) == "1" ) - { - return getspawnpoint_random( spawnpoints ); + if ( getdvar( "scr_spawn_randomly" ) == "" ) + setdvar( "scr_spawn_randomly", "0" ); + + if ( getdvar( "scr_spawn_randomly" ) == "1" ) + return getspawnpoint_random( spawnpoints ); #/ - } - */ - if ( getDvarInt( "scr_spawnsimple" ) > 0 ) - { - return getspawnpoint_random( spawnpoints ); - } - spawnlogic_begin(); - k_favored_spawn_point_bonus = 25000; - initweights( spawnpoints ); - obj = spawnstruct(); - getallalliedandenemyplayers( obj ); - numplayers = obj.allies.size + obj.enemies.size; - allieddistanceweight = 2; - myteam = self.team; - for ( i = 0; i < spawnpoints.size; i++ ) - { - spawnpoint = spawnpoints[ i ]; - if ( !isDefined( spawnpoint.numplayersatlastupdate ) ) - { - spawnpoint.numplayersatlastupdate = 0; - } - if ( spawnpoint.numplayersatlastupdate > 0 ) - { - allydistsum = spawnpoint.distsum[ myteam ]; - enemydistsum = spawnpoint.enemydistsum[ myteam ]; - spawnpoint.weight = ( enemydistsum - ( allieddistanceweight * allydistsum ) ) / spawnpoint.numplayersatlastupdate; - /* + + if ( getdvarint( "scr_spawnsimple" ) > 0 ) + return getspawnpoint_random( spawnpoints ); + + spawnlogic_begin(); + k_favored_spawn_point_bonus = 25000; + initweights( spawnpoints ); + obj = spawnstruct(); + getallalliedandenemyplayers( obj ); + numplayers = obj.allies.size + obj.enemies.size; + allieddistanceweight = 2; + myteam = self.team; + + for ( i = 0; i < spawnpoints.size; i++ ) + { + spawnpoint = spawnpoints[i]; + + if ( !isdefined( spawnpoint.numplayersatlastupdate ) ) + spawnpoint.numplayersatlastupdate = 0; + + if ( spawnpoint.numplayersatlastupdate > 0 ) + { + allydistsum = spawnpoint.distsum[myteam]; + enemydistsum = spawnpoint.enemydistsum[myteam]; + spawnpoint.weight = ( enemydistsum - allieddistanceweight * allydistsum ) / spawnpoint.numplayersatlastupdate; /# - if ( level.storespawndata || level.debugspawning ) - { - spawnpoint.spawndata[ spawnpoint.spawndata.size ] = "Base weight: " + int( spawnpoint.weight ) + " = (" + int( enemydistsum ) + " - " + allieddistanceweight + "*" + int( allydistsum ) + ") / " + spawnpoint.numplayersatlastupdate; + if ( level.storespawndata || level.debugspawning ) + spawnpoint.spawndata[spawnpoint.spawndata.size] = "Base weight: " + int( spawnpoint.weight ) + " = (" + int( enemydistsum ) + " - " + allieddistanceweight + "*" + int( allydistsum ) + ") / " + spawnpoint.numplayersatlastupdate; #/ - } - */ - } - else - { - spawnpoint.weight = 0; - /* + continue; + } + + spawnpoint.weight = 0; /# - if ( level.storespawndata || level.debugspawning ) - { - spawnpoint.spawndata[ spawnpoint.spawndata.size ] = "Base weight: 0"; + if ( level.storespawndata || level.debugspawning ) + spawnpoint.spawndata[spawnpoint.spawndata.size] = "Base weight: 0"; #/ - } - */ - } - } - if ( isDefined( favoredspawnpoints ) ) - { - i = 0; - while ( i < favoredspawnpoints.size ) - { - if ( isDefined( favoredspawnpoints[ i ].weight ) ) - { - favoredspawnpoints[ i ].weight += k_favored_spawn_point_bonus; - i++; - continue; - } - favoredspawnpoints[ i ].weight = k_favored_spawn_point_bonus; - i++; - } - } - avoidsamespawn( spawnpoints ); - avoidspawnreuse( spawnpoints, 1 ); - avoidweapondamage( spawnpoints ); - avoidvisibleenemies( spawnpoints, 1 ); - result = getspawnpoint_final( spawnpoints ); - /* + } + + if ( isdefined( favoredspawnpoints ) ) + { + for ( i = 0; i < favoredspawnpoints.size; i++ ) + { + if ( isdefined( favoredspawnpoints[i].weight ) ) + { + favoredspawnpoints[i].weight += k_favored_spawn_point_bonus; + continue; + } + + favoredspawnpoints[i].weight = k_favored_spawn_point_bonus; + } + } + + avoidsamespawn( spawnpoints ); + avoidspawnreuse( spawnpoints, 1 ); + avoidweapondamage( spawnpoints ); + avoidvisibleenemies( spawnpoints, 1 ); + result = getspawnpoint_final( spawnpoints ); /# - if ( getDvar( "scr_spawn_showbad" ) == "" ) - { - setdvar( "scr_spawn_showbad", "0" ); - } - if ( getDvar( "scr_spawn_showbad" ) == "1" ) - { - checkbad( result ); + if ( getdvar( "scr_spawn_showbad" ) == "" ) + setdvar( "scr_spawn_showbad", "0" ); + + if ( getdvar( "scr_spawn_showbad" ) == "1" ) + checkbad( result ); #/ - } - */ - return result; + return result; } -getspawnpoint_dm( spawnpoints ) //checked changed to match cerberus output +getspawnpoint_dm( spawnpoints ) { - if ( !isDefined( spawnpoints ) ) - { - return undefined; - } - spawnlogic_begin(); - initweights( spawnpoints ); - aliveplayers = getallotherplayers(); - idealdist = 1600; - baddist = 1200; - if ( aliveplayers.size > 0 ) - { - for ( i = 0; i < spawnpoints.size; i++ ) - { - totaldistfromideal = 0; - nearbybadamount = 0; - for ( j = 0; j < aliveplayers.size; j++ ) - { - dist = distance( spawnpoints[ i ].origin, aliveplayers[ j ].origin ); - if ( dist < baddist ) - { - nearbybadamount += ( baddist - dist ) / baddist; - } - distfromideal = abs( dist - idealdist ); - totaldistfromideal += distfromideal; - } - avgdistfromideal = totaldistfromideal / aliveplayers.size; - welldistancedamount = ( idealdist - avgdistfromideal ) / idealdist; - spawnpoints[ i ].weight = ( welldistancedamount - ( nearbybadamount * 2 ) ) + randomfloat( 0,2 ); - } - } - avoidsamespawn( spawnpoints ); - avoidspawnreuse( spawnpoints, 0 ); - avoidweapondamage( spawnpoints ); - avoidvisibleenemies( spawnpoints, 0 ); - return getspawnpoint_final( spawnpoints ); + if ( !isdefined( spawnpoints ) ) + return undefined; + + spawnlogic_begin(); + initweights( spawnpoints ); + aliveplayers = getallotherplayers(); + idealdist = 1600; + baddist = 1200; + + if ( aliveplayers.size > 0 ) + { + for ( i = 0; i < spawnpoints.size; i++ ) + { + totaldistfromideal = 0; + nearbybadamount = 0; + + for ( j = 0; j < aliveplayers.size; j++ ) + { + dist = distance( spawnpoints[i].origin, aliveplayers[j].origin ); + + if ( dist < baddist ) + nearbybadamount += ( baddist - dist ) / baddist; + + distfromideal = abs( dist - idealdist ); + totaldistfromideal += distfromideal; + } + + avgdistfromideal = totaldistfromideal / aliveplayers.size; + welldistancedamount = ( idealdist - avgdistfromideal ) / idealdist; + spawnpoints[i].weight = welldistancedamount - nearbybadamount * 2 + randomfloat( 0.2 ); + } + } + + avoidsamespawn( spawnpoints ); + avoidspawnreuse( spawnpoints, 0 ); + avoidweapondamage( spawnpoints ); + avoidvisibleenemies( spawnpoints, 0 ); + return getspawnpoint_final( spawnpoints ); } -spawnlogic_begin() //checked matches cerberus output +spawnlogic_begin() { - /* /# - level.storespawndata = getDvarInt( "scr_recordspawndata" ); - level.debugspawning = getDvarInt( "scr_spawnpointdebug" ) > 0; + level.storespawndata = getdvarint( "scr_recordspawndata" ); + level.debugspawning = getdvarint( "scr_spawnpointdebug" ) > 0; #/ - */ } -init() //checked changed to match cerberus output +init() { - /* /# - if ( getDvar( "scr_recordspawndata" ) == "" ) - { - setdvar( "scr_recordspawndata", 0 ); - } - level.storespawndata = getDvarInt( "scr_recordspawndata" ); - if ( getDvar( "scr_killbots" ) == "" ) - { - setdvar( "scr_killbots", 0 ); - } - if ( getDvar( "scr_killbottimer" ) == "" ) - { - setdvar( "scr_killbottimer", 0,25 ); - } - thread loopbotspawns(); + if ( getdvar( "scr_recordspawndata" ) == "" ) + setdvar( "scr_recordspawndata", 0 ); + + level.storespawndata = getdvarint( "scr_recordspawndata" ); + + if ( getdvar( "scr_killbots" ) == "" ) + setdvar( "scr_killbots", 0 ); + + if ( getdvar( "scr_killbottimer" ) == "" ) + setdvar( "scr_killbottimer", 0.25 ); + + thread loopbotspawns(); #/ - */ - level.spawnlogic_deaths = []; - level.spawnlogic_spawnkills = []; - level.players = []; - level.grenades = []; - level.pipebombs = []; - level.spawnmins = ( 0, 0, 0 ); - level.spawnmaxs = ( 0, 0, 0 ); - level.spawnminsmaxsprimed = 0; - if ( isDefined( level.safespawns ) ) - { - for ( i = 0; i < level.safespawns.size; i++ ) - { - level.safespawns[ i ] spawnpointinit(); - } - } - if ( getDvar( "scr_spawn_enemyavoiddist" ) == "" ) - { - setdvar( "scr_spawn_enemyavoiddist", "800" ); - } - if ( getDvar( "scr_spawn_enemyavoidweight" ) == "" ) - { - setdvar( "scr_spawn_enemyavoidweight", "0" ); - } - /* + level.spawnlogic_deaths = []; + level.spawnlogic_spawnkills = []; + level.players = []; + level.grenades = []; + level.pipebombs = []; + level.spawnmins = ( 0, 0, 0 ); + level.spawnmaxs = ( 0, 0, 0 ); + level.spawnminsmaxsprimed = 0; + + if ( isdefined( level.safespawns ) ) + { + for ( i = 0; i < level.safespawns.size; i++ ) + level.safespawns[i] spawnpointinit(); + } + + if ( getdvar( "scr_spawn_enemyavoiddist" ) == "" ) + setdvar( "scr_spawn_enemyavoiddist", "800" ); + + if ( getdvar( "scr_spawn_enemyavoidweight" ) == "" ) + setdvar( "scr_spawn_enemyavoidweight", "0" ); + /# - if ( getDvar( "scr_spawnsimple" ) == "" ) - { - setdvar( "scr_spawnsimple", "0" ); - } - if ( getDvar( "scr_spawnpointdebug" ) == "" ) - { - setdvar( "scr_spawnpointdebug", "0" ); - } - if ( getDvarInt( "scr_spawnpointdebug" ) > 0 ) - { - thread showdeathsdebug(); - thread updatedeathinfodebug(); - thread profiledebug(); - } - if ( level.storespawndata ) - { - thread allowspawndatareading(); - } - if ( getDvar( "scr_spawnprofile" ) == "" ) - { - setdvar( "scr_spawnprofile", "0" ); - } - thread watchspawnprofile(); - thread spawngraphcheck(); + if ( getdvar( "scr_spawnsimple" ) == "" ) + setdvar( "scr_spawnsimple", "0" ); + + if ( getdvar( "scr_spawnpointdebug" ) == "" ) + setdvar( "scr_spawnpointdebug", "0" ); + + if ( getdvarint( "scr_spawnpointdebug" ) > 0 ) + { + thread showdeathsdebug(); + thread updatedeathinfodebug(); + thread profiledebug(); + } + + if ( level.storespawndata ) + thread allowspawndatareading(); + + if ( getdvar( "scr_spawnprofile" ) == "" ) + setdvar( "scr_spawnprofile", "0" ); + + thread watchspawnprofile(); + thread spawngraphcheck(); #/ - */ } -watchspawnprofile() //checked changed to match cerberus output +watchspawnprofile() { - /* /# - while ( 1 ) - { - while ( 1 ) - { - if ( getDvarInt( "scr_spawnprofile" ) > 0 ) - { - break; - } - wait 0.05; - } - thread spawnprofile(); - while ( 1 ) - { - if ( getDvarInt( "scr_spawnprofile" ) <= 0 ) - { - break; - } - wait 0.05; - } - level notify( "stop_spawn_profile" ); + while ( true ) + { + while ( true ) + { + if ( getdvarint( "scr_spawnprofile" ) > 0 ) + break; + + wait 0.05; + } + + thread spawnprofile(); + + while ( true ) + { + if ( getdvarint( "scr_spawnprofile" ) <= 0 ) + break; + + wait 0.05; + } + + level notify( "stop_spawn_profile" ); + } #/ - } - */ } -spawnprofile() //checked matches cerberus output +spawnprofile() { - /* /# - level endon( "stop_spawn_profile" ); - while ( 1 ) - { - if ( level.players.size > 0 && level.spawnpoints.size > 0 ) - { - playernum = randomint( level.players.size ); - player = level.players[ playernum ]; - attempt = 1; - while ( !isDefined( player ) && attempt < level.players.size ) - { - playernum = ( playernum + 1 ) % level.players.size; - attempt++; - player = level.players[ playernum ]; - } - player getspawnpoint_nearteam( level.spawnpoints ); - } - wait 0.05; + level endon( "stop_spawn_profile" ); + + while ( true ) + { + if ( level.players.size > 0 && level.spawnpoints.size > 0 ) + { + playernum = randomint( level.players.size ); + player = level.players[playernum]; + attempt = 1; + + while ( !isdefined( player ) && attempt < level.players.size ) + { + playernum = ( playernum + 1 ) % level.players.size; + attempt++; + player = level.players[playernum]; + } + + player getspawnpoint_nearteam( level.spawnpoints ); + } + + wait 0.05; + } #/ - } - */ } -spawngraphcheck() //checked changed to match cerberus output dvar taken from beta dump +spawngraphcheck() { - /* /# - while ( 1 ) - { - if ( getDvarInt( "scr_spawngraph" ) < 1 ) - { - wait 3; - } - thread spawngraph(); - return; + while ( true ) + { + if ( getdvarint( _hash_C25B6B47 ) < 1 ) + { + wait 3; + continue; + } + + thread spawngraph(); + return; + } #/ - } - */ } -spawngraph() //dev call did not check +spawngraph() { - /* /# - w = 20; - h = 20; - weightscale = 0,1; - fakespawnpoints = []; - corners = getentarray( "minimap_corner", "targetname" ); - if ( corners.size != 2 ) - { - println( "^1 can't spawn graph: no minimap corners" ); - return; - } - min = corners[ 0 ].origin; - max = corners[ 0 ].origin; - if ( corners[ 1 ].origin[ 0 ] > max[ 0 ] ) - { - max = ( corners[ 1 ].origin[ 0 ], max[ 1 ], max[ 2 ] ); - } - else - { - min = ( corners[ 1 ].origin[ 0 ], min[ 1 ], min[ 2 ] ); - } - if ( corners[ 1 ].origin[ 1 ] > max[ 1 ] ) - { - max = ( max[ 0 ], corners[ 1 ].origin[ 1 ], max[ 2 ] ); - } - else - { - min = ( min[ 0 ], corners[ 1 ].origin[ 1 ], min[ 2 ] ); - } - i = 0; - y = 0; - while ( y < h ) - { - yamnt = y / ( h - 1 ); - x = 0; - while ( x < w ) - { - xamnt = x / ( w - 1 ); - fakespawnpoints[ i ] = spawnstruct(); - fakespawnpoints[ i ].origin = ( ( min[ 0 ] * xamnt ) + ( max[ 0 ] * ( 1 - xamnt ) ), ( min[ 1 ] * yamnt ) + ( max[ 1 ] * ( 1 - yamnt ) ), min[ 2 ] ); - fakespawnpoints[ i ].angles = ( -1, -1, -1 ); - fakespawnpoints[ i ].forward = anglesToForward( fakespawnpoints[ i ].angles ); - fakespawnpoints[ i ].sighttracepoint = fakespawnpoints[ i ].origin; - i++; - x++; - } - y++; - } - didweights = 0; - while ( 1 ) - { - spawni = 0; - numiters = 5; - i = 0; - while ( i < numiters ) - { - if ( level.players.size && isDefined( level.players[ 0 ].team ) || level.players[ 0 ].team == "spectator" && !isDefined( level.players[ 0 ].class ) ) - { - break; - } - else - { - endspawni = spawni + ( fakespawnpoints.size / numiters ); - if ( i == ( numiters - 1 ) ) - { - endspawni = fakespawnpoints.size; - } - while ( spawni < endspawni ) - { - spawnpointupdate( fakespawnpoints[ spawni ] ); - spawni++; - } - if ( didweights ) - { - level.players[ 0 ] drawspawngraph( fakespawnpoints, w, h, weightscale ); - } - wait 0,05; - i++; - } - } - while ( level.players.size && isDefined( level.players[ 0 ].team ) || level.players[ 0 ].team == "spectator" && !isDefined( level.players[ 0 ].class ) ) - { - wait 1; - } - level.players[ 0 ] getspawnpoint_nearteam( fakespawnpoints ); - i = 0; - while ( i < fakespawnpoints.size ) - { - setupspawngraphpoint( fakespawnpoints[ i ], weightscale ); - i++; - } - didweights = 1; - level.players[ 0 ] drawspawngraph( fakespawnpoints, w, h, weightscale ); - wait 0,05; + w = 20; + h = 20; + weightscale = 0.1; + fakespawnpoints = []; + corners = getentarray( "minimap_corner", "targetname" ); + + if ( corners.size != 2 ) + { + println( "^1 can't spawn graph: no minimap corners" ); + return; + } + + min = corners[0].origin; + max = corners[0].origin; + + if ( corners[1].origin[0] > max[0] ) + max = ( corners[1].origin[0], max[1], max[2] ); + else + min = ( corners[1].origin[0], min[1], min[2] ); + + if ( corners[1].origin[1] > max[1] ) + max = ( max[0], corners[1].origin[1], max[2] ); + else + min = ( min[0], corners[1].origin[1], min[2] ); + + i = 0; + + for ( y = 0; y < h; y++ ) + { + yamnt = y / ( h - 1 ); + + for ( x = 0; x < w; x++ ) + { + xamnt = x / ( w - 1 ); + fakespawnpoints[i] = spawnstruct(); + fakespawnpoints[i].origin = ( min[0] * xamnt + max[0] * ( 1 - xamnt ), min[1] * yamnt + max[1] * ( 1 - yamnt ), min[2] ); + fakespawnpoints[i].angles = ( 0, 0, 0 ); + fakespawnpoints[i].forward = anglestoforward( fakespawnpoints[i].angles ); + fakespawnpoints[i].sighttracepoint = fakespawnpoints[i].origin; + i++; + } + } + + didweights = 0; + + while ( true ) + { + spawni = 0; + numiters = 5; + + for ( i = 0; i < numiters; i++ ) + { + if ( !level.players.size || !isdefined( level.players[0].team ) || level.players[0].team == "spectator" || !isdefined( level.players[0].class ) ) + break; + + endspawni = spawni + fakespawnpoints.size / numiters; + + if ( i == numiters - 1 ) + endspawni = fakespawnpoints.size; + + while ( spawni < endspawni ) + { + spawnpointupdate( fakespawnpoints[spawni] ); + spawni++; + } + + if ( didweights ) + level.players[0] drawspawngraph( fakespawnpoints, w, h, weightscale ); + + wait 0.05; + } + + if ( !level.players.size || !isdefined( level.players[0].team ) || level.players[0].team == "spectator" || !isdefined( level.players[0].class ) ) + { + wait 1; + continue; + } + + level.players[0] getspawnpoint_nearteam( fakespawnpoints ); + + for ( i = 0; i < fakespawnpoints.size; i++ ) + setupspawngraphpoint( fakespawnpoints[i], weightscale ); + + didweights = 1; + level.players[0] drawspawngraph( fakespawnpoints, w, h, weightscale ); + wait 0.05; + } #/ - } - */ } -drawspawngraph( fakespawnpoints, w, h, weightscale ) //dev call did not check +drawspawngraph( fakespawnpoints, w, h, weightscale ) { - /* /# - i = 0; - y = 0; - while ( y < h ) - { - yamnt = y / ( h - 1 ); - x = 0; - while ( x < w ) - { - xamnt = x / ( w - 1 ); - if ( y > 0 ) - { - spawngraphline( fakespawnpoints[ i ], fakespawnpoints[ i - w ], weightscale ); - } - if ( x > 0 ) - { - spawngraphline( fakespawnpoints[ i ], fakespawnpoints[ i - 1 ], weightscale ); - } - i++; - x++; - } - y++; + i = 0; + + for ( y = 0; y < h; y++ ) + { + yamnt = y / ( h - 1 ); + + for ( x = 0; x < w; x++ ) + { + xamnt = x / ( w - 1 ); + + if ( y > 0 ) + spawngraphline( fakespawnpoints[i], fakespawnpoints[i - w], weightscale ); + + if ( x > 0 ) + spawngraphline( fakespawnpoints[i], fakespawnpoints[i - 1], weightscale ); + + i++; + } + } #/ - } - */ } -setupspawngraphpoint( s1, weightscale ) //dev call did not check +setupspawngraphpoint( s1, weightscale ) { - /* /# - s1.visible = 1; - if ( s1.weight < ( -1000 / weightscale ) ) - { - s1.visible = 0; + s1.visible = 1; + + if ( s1.weight < -1000 / weightscale ) + s1.visible = 0; #/ - } - */ } -spawngraphline( s1, s2, weightscale ) //dev call did not check +spawngraphline( s1, s2, weightscale ) { - /* /# - if ( !s1.visible || !s2.visible ) - { - return; - } - p1 = s1.origin + ( 0, 0, ( s1.weight * weightscale ) + 100 ); - p2 = s2.origin + ( 0, 0, ( s2.weight * weightscale ) + 100 ); - line( p1, p2, ( -1, -1, -1 ) ); + if ( !s1.visible || !s2.visible ) + return; + + p1 = s1.origin + ( 0, 0, s1.weight * weightscale + 100 ); + p2 = s2.origin + ( 0, 0, s2.weight * weightscale + 100 ); + line( p1, p2, ( 1, 1, 1 ) ); #/ - */ } -loopbotspawns() //dev call did not check +loopbotspawns() { - /* /# - while ( 1 ) - { - while ( getDvarInt( "scr_killbots" ) < 1 ) - { - wait 3; - } - while ( !isDefined( level.players ) ) - { - wait 0,05; - } - bots = []; - i = 0; - while ( i < level.players.size ) - { - if ( !isDefined( level.players[ i ] ) ) - { - i++; - continue; - } - else - { - if ( level.players[ i ].sessionstate == "playing" && issubstr( level.players[ i ].name, "bot" ) ) - { - bots[ bots.size ] = level.players[ i ]; - } - } - i++; - } - while ( bots.size > 0 ) - { - if ( getDvarInt( "scr_killbots" ) == 1 ) - { - killer = bots[ randomint( bots.size ) ]; - victim = bots[ randomint( bots.size ) ]; - victim thread [[ level.callbackplayerdamage ]]( killer, killer, 1000, 0, "MOD_RIFLE_BULLET", "none", ( -1, -1, -1 ), ( -1, -1, -1 ), "none", 0, 0 ); - break; - } - else - { - numkills = getDvarInt( "scr_killbots" ); - lastvictim = undefined; - index = 0; - while ( index < numkills ) - { - killer = bots[ randomint( bots.size ) ]; - victim = bots[ randomint( bots.size ) ]; - while ( isDefined( lastvictim ) && victim == lastvictim ) - { - victim = bots[ randomint( bots.size ) ]; - } - victim thread [[ level.callbackplayerdamage ]]( killer, killer, 1000, 0, "MOD_RIFLE_BULLET", "none", ( -1, -1, -1 ), ( -1, -1, -1 ), "none", 0, 0 ); - lastvictim = victim; - index++; - } - } - } - if ( getDvar( "scr_killbottimer" ) != "" ) - { - wait getDvarFloat( "scr_killbottimer" ); - continue; - } - else - { - wait 0,05; - } + while ( true ) + { + if ( getdvarint( "scr_killbots" ) < 1 ) + { + wait 3; + continue; + } + + if ( !isdefined( level.players ) ) + { + wait 0.05; + continue; + } + + bots = []; + + for ( i = 0; i < level.players.size; i++ ) + { + if ( !isdefined( level.players[i] ) ) + continue; + + if ( level.players[i].sessionstate == "playing" && issubstr( level.players[i].name, "bot" ) ) + bots[bots.size] = level.players[i]; + } + + if ( bots.size > 0 ) + { + if ( getdvarint( "scr_killbots" ) == 1 ) + { + killer = bots[randomint( bots.size )]; + victim = bots[randomint( bots.size )]; + victim thread [[ level.callbackplayerdamage ]]( killer, killer, 1000, 0, "MOD_RIFLE_BULLET", "none", ( 0, 0, 0 ), ( 0, 0, 0 ), "none", 0, 0 ); + } + else + { + numkills = getdvarint( "scr_killbots" ); + lastvictim = undefined; + + for ( index = 0; index < numkills; index++ ) + { + killer = bots[randomint( bots.size )]; + + for ( victim = bots[randomint( bots.size )]; isdefined( lastvictim ) && victim == lastvictim; victim = bots[randomint( bots.size )] ) + { + + } + + victim thread [[ level.callbackplayerdamage ]]( killer, killer, 1000, 0, "MOD_RIFLE_BULLET", "none", ( 0, 0, 0 ), ( 0, 0, 0 ), "none", 0, 0 ); + lastvictim = victim; + } + } + } + + if ( getdvar( "scr_killbottimer" ) != "" ) + wait( getdvarfloat( "scr_killbottimer" ) ); + else + wait 0.05; + } #/ - } - */ } -allowspawndatareading() //dev call did not check +allowspawndatareading() { - /* /# - setdvar( "scr_showspawnid", "" ); - prevval = getDvar( "scr_showspawnid" ); - prevrelval = getDvar( "scr_spawnidcycle" ); - readthistime = 0; - while ( 1 ) - { - val = getDvar( "scr_showspawnid" ); - relval = undefined; - while ( !isDefined( val ) || val == prevval ) - { - relval = getDvar( "scr_spawnidcycle" ); - if ( isDefined( relval ) && relval != "" ) - { - setdvar( "scr_spawnidcycle", "" ); - break; - } - else - { - wait 0,5; - } - } - prevval = val; - readthistime = 0; - readspawndata( val, relval ); - if ( !isDefined( level.curspawndata ) ) - { - println( "No spawn data to draw." ); - } - else - { - println( "Drawing spawn ID " + level.curspawndata.id ); - } - thread drawspawndata(); + setdvar( "scr_showspawnid", "" ); + prevval = getdvar( "scr_showspawnid" ); + prevrelval = getdvar( "scr_spawnidcycle" ); + readthistime = 0; + + while ( true ) + { + val = getdvar( "scr_showspawnid" ); + relval = undefined; + + if ( !isdefined( val ) || val == prevval ) + { + relval = getdvar( "scr_spawnidcycle" ); + + if ( isdefined( relval ) && relval != "" ) + setdvar( "scr_spawnidcycle", "" ); + else + { + wait 0.5; + continue; + } + } + + prevval = val; + readthistime = 0; + readspawndata( val, relval ); + + if ( !isdefined( level.curspawndata ) ) + println( "No spawn data to draw." ); + else + println( "Drawing spawn ID " + level.curspawndata.id ); + + thread drawspawndata(); + } #/ - } - */ } -showdeathsdebug() //dev call did not check +showdeathsdebug() { - /* /# - while ( 1 ) - { - while ( getDvar( "scr_spawnpointdebug" ) == "0" ) - { - wait 3; - } - time = getTime(); - i = 0; - while ( i < level.spawnlogic_deaths.size ) - { - if ( isDefined( level.spawnlogic_deaths[ i ].los ) ) - { - line( level.spawnlogic_deaths[ i ].org, level.spawnlogic_deaths[ i ].killorg, ( -1, -1, -1 ) ); - } - else - { - line( level.spawnlogic_deaths[ i ].org, level.spawnlogic_deaths[ i ].killorg, ( -1, -1, -1 ) ); - } - killer = level.spawnlogic_deaths[ i ].killer; - if ( isDefined( killer ) && isalive( killer ) ) - { - line( level.spawnlogic_deaths[ i ].killorg, killer.origin, ( 0,4, 0,4, 0,8 ) ); - } - i++; - } - p = 0; - while ( p < level.players.size ) - { - if ( !isDefined( level.players[ p ] ) ) - { - p++; - continue; - } - else - { - if ( isDefined( level.players[ p ].spawnlogic_killdist ) ) - { - print3d( level.players[ p ].origin + vectorScale( ( -1, -1, -1 ), 64 ), level.players[ p ].spawnlogic_killdist, ( -1, -1, -1 ) ); - } - } - p++; - } - oldspawnkills = level.spawnlogic_spawnkills; - level.spawnlogic_spawnkills = []; - i = 0; - while ( i < oldspawnkills.size ) - { - spawnkill = oldspawnkills[ i ]; - if ( spawnkill.dierwasspawner ) - { - line( spawnkill.spawnpointorigin, spawnkill.dierorigin, ( 0,4, 0,5, 0,4 ) ); - line( spawnkill.dierorigin, spawnkill.killerorigin, ( 0, 1, 1 ) ); - print3d( spawnkill.dierorigin + vectorScale( ( -1, -1, -1 ), 32 ), "SPAWNKILLED!", ( 0, 1, 1 ) ); - } - else - { - line( spawnkill.spawnpointorigin, spawnkill.killerorigin, ( 0,4, 0,5, 0,4 ) ); - line( spawnkill.killerorigin, spawnkill.dierorigin, ( 0, 1, 1 ) ); - print3d( spawnkill.dierorigin + vectorScale( ( -1, -1, -1 ), 32 ), "SPAWNDIED!", ( 0, 1, 1 ) ); - } - if ( ( time - spawnkill.time ) < 60000 ) - { - level.spawnlogic_spawnkills[ level.spawnlogic_spawnkills.size ] = oldspawnkills[ i ]; - } - i++; - } - wait 0,05; + while ( true ) + { + if ( getdvar( "scr_spawnpointdebug" ) == "0" ) + { + wait 3; + continue; + } + + time = gettime(); + + for ( i = 0; i < level.spawnlogic_deaths.size; i++ ) + { + if ( isdefined( level.spawnlogic_deaths[i].los ) ) + line( level.spawnlogic_deaths[i].org, level.spawnlogic_deaths[i].killorg, ( 1, 0, 0 ) ); + else + line( level.spawnlogic_deaths[i].org, level.spawnlogic_deaths[i].killorg, ( 1, 1, 1 ) ); + + killer = level.spawnlogic_deaths[i].killer; + + if ( isdefined( killer ) && isalive( killer ) ) + line( level.spawnlogic_deaths[i].killorg, killer.origin, ( 0.4, 0.4, 0.8 ) ); + } + + for ( p = 0; p < level.players.size; p++ ) + { + if ( !isdefined( level.players[p] ) ) + continue; + + if ( isdefined( level.players[p].spawnlogic_killdist ) ) + print3d( level.players[p].origin + vectorscale( ( 0, 0, 1 ), 64.0 ), level.players[p].spawnlogic_killdist, ( 1, 1, 1 ) ); + } + + oldspawnkills = level.spawnlogic_spawnkills; + level.spawnlogic_spawnkills = []; + + for ( i = 0; i < oldspawnkills.size; i++ ) + { + spawnkill = oldspawnkills[i]; + + if ( spawnkill.dierwasspawner ) + { + line( spawnkill.spawnpointorigin, spawnkill.dierorigin, ( 0.4, 0.5, 0.4 ) ); + line( spawnkill.dierorigin, spawnkill.killerorigin, ( 0, 1, 1 ) ); + print3d( spawnkill.dierorigin + vectorscale( ( 0, 0, 1 ), 32.0 ), "SPAWNKILLED!", ( 0, 1, 1 ) ); + } + else + { + line( spawnkill.spawnpointorigin, spawnkill.killerorigin, ( 0.4, 0.5, 0.4 ) ); + line( spawnkill.killerorigin, spawnkill.dierorigin, ( 0, 1, 1 ) ); + print3d( spawnkill.dierorigin + vectorscale( ( 0, 0, 1 ), 32.0 ), "SPAWNDIED!", ( 0, 1, 1 ) ); + } + + if ( time - spawnkill.time < 60000 ) + level.spawnlogic_spawnkills[level.spawnlogic_spawnkills.size] = oldspawnkills[i]; + } + + wait 0.05; + } #/ - } - */ } -updatedeathinfodebug() //checked changed to match cerberus output +updatedeathinfodebug() { - while ( 1 ) - { - if ( getDvar( "scr_spawnpointdebug" ) == "0" ) - { - wait 3; - } - updatedeathinfo(); - wait 3; - } + while ( true ) + { + if ( getdvar( "scr_spawnpointdebug" ) == "0" ) + { + wait 3; + continue; + } + + updatedeathinfo(); + wait 3; + } } -spawnweightdebug( spawnpoints ) //checked dev call did not check +spawnweightdebug( spawnpoints ) { - level notify( "stop_spawn_weight_debug" ); - level endon( "stop_spawn_weight_debug" ); - /* + level notify( "stop_spawn_weight_debug" ); + level endon( "stop_spawn_weight_debug" ); /# - while ( 1 ) - { - while ( getDvar( "scr_spawnpointdebug" ) == "0" ) - { - wait 3; - } - textoffset = vectorScale( ( -1, -1, -1 ), 12 ); - i = 0; - while ( i < spawnpoints.size ) - { - amnt = 1 * ( 1 - ( spawnpoints[ i ].weight / -100000 ) ); - if ( amnt < 0 ) - { - amnt = 0; - } - if ( amnt > 1 ) - { - amnt = 1; - } - orig = spawnpoints[ i ].origin + vectorScale( ( -1, -1, -1 ), 80 ); - print3d( orig, int( spawnpoints[ i ].weight ), ( 1, amnt, 0,5 ) ); - orig += textoffset; - while ( isDefined( spawnpoints[ i ].spawndata ) ) - { - j = 0; - while ( j < spawnpoints[ i ].spawndata.size ) - { - print3d( orig, spawnpoints[ i ].spawndata[ j ], vectorScale( ( -1, -1, -1 ), 0,5 ) ); - orig += textoffset; - j++; - } - } - while ( isDefined( spawnpoints[ i ].sightchecks ) ) - { - j = 0; - while ( j < spawnpoints[ i ].sightchecks.size ) - { - if ( spawnpoints[ i ].sightchecks[ j ].penalty == 0 ) - { - j++; - continue; - } - else - { - print3d( orig, "Sight to enemy: -" + spawnpoints[ i ].sightchecks[ j ].penalty, vectorScale( ( -1, -1, -1 ), 0,5 ) ); - orig += textoffset; - } - j++; - } - } - i++; - } - wait 0,05; + while ( true ) + { + if ( getdvar( "scr_spawnpointdebug" ) == "0" ) + { + wait 3; + continue; + } + + textoffset = vectorscale( ( 0, 0, -1 ), 12.0 ); + + for ( i = 0; i < spawnpoints.size; i++ ) + { + amnt = 1 * ( 1 - spawnpoints[i].weight / -100000 ); + + if ( amnt < 0 ) + amnt = 0; + + if ( amnt > 1 ) + amnt = 1; + + orig = spawnpoints[i].origin + vectorscale( ( 0, 0, 1 ), 80.0 ); + print3d( orig, int( spawnpoints[i].weight ), ( 1, amnt, 0.5 ) ); + orig += textoffset; + + if ( isdefined( spawnpoints[i].spawndata ) ) + { + for ( j = 0; j < spawnpoints[i].spawndata.size; j++ ) + { + print3d( orig, spawnpoints[i].spawndata[j], vectorscale( ( 1, 1, 1 ), 0.5 ) ); + orig += textoffset; + } + } + + if ( isdefined( spawnpoints[i].sightchecks ) ) + { + for ( j = 0; j < spawnpoints[i].sightchecks.size; j++ ) + { + if ( spawnpoints[i].sightchecks[j].penalty == 0 ) + continue; + + print3d( orig, "Sight to enemy: -" + spawnpoints[i].sightchecks[j].penalty, vectorscale( ( 1, 1, 1 ), 0.5 ) ); + orig += textoffset; + } + } + } + + wait 0.05; + } #/ - } - */ } -profiledebug() //checked changed to match cerberus output +profiledebug() { - while ( 1 ) - { - if ( getDvar( "scr_spawnpointprofile" ) != "1" ) - { - wait 3; - } - for ( i = 0; i < level.spawnpoints.size; i++ ) - { - level.spawnpoints[ i ].weight = randomint( 10000 ); - } - if ( level.players.size > 0 ) - { - level.players[ randomint( level.players.size ) ] getspawnpoint_nearteam( level.spawnpoints ); - } - wait 0.05; - } + while ( true ) + { + if ( getdvar( _hash_6A99E750 ) != "1" ) + { + wait 3; + continue; + } + + for ( i = 0; i < level.spawnpoints.size; i++ ) + level.spawnpoints[i].weight = randomint( 10000 ); + + if ( level.players.size > 0 ) + level.players[randomint( level.players.size )] getspawnpoint_nearteam( level.spawnpoints ); + + wait 0.05; + } } -debugnearbyplayers( players, origin ) //dev call did not check +debugnearbyplayers( players, origin ) { - /* /# - if ( getDvar( "scr_spawnpointdebug" ) == "0" ) - { - return; - } - starttime = getTime(); - while ( 1 ) - { - i = 0; - while ( i < players.size ) - { - line( players[ i ].origin, origin, ( 0,5, 1, 0,5 ) ); - i++; - } - if ( ( getTime() - starttime ) > 5000 ) - { - return; - } - wait 0,05; + if ( getdvar( "scr_spawnpointdebug" ) == "0" ) + return; + + starttime = gettime(); + + while ( true ) + { + for ( i = 0; i < players.size; i++ ) + line( players[i].origin, origin, ( 0.5, 1, 0.5 ) ); + + if ( gettime() - starttime > 5000 ) + return; + + wait 0.05; + } #/ - } - */ } -deathoccured( dier, killer ) //checked matches cerberus output +deathoccured( dier, killer ) { + } -checkforsimilardeaths( deathinfo ) //checked partially changed to match cerberus output see info.md +checkforsimilardeaths( deathinfo ) { - i = 0; - while ( i < level.spawnlogic_deaths.size ) - { - if ( level.spawnlogic_deaths[ i ].killer == deathinfo.killer ) - { - dist = distance( level.spawnlogic_deaths[ i ].org, deathinfo.org ); - if ( dist > 200 ) - { - i++; - continue; - } - dist = distance( level.spawnlogic_deaths[ i ].killorg, deathinfo.killorg ); - if ( dist > 200 ) - { - i++; - continue; - } - level.spawnlogic_deaths[ i ].remove = 1; - } - i++; - } + for ( i = 0; i < level.spawnlogic_deaths.size; i++ ) + { + if ( level.spawnlogic_deaths[i].killer == deathinfo.killer ) + { + dist = distance( level.spawnlogic_deaths[i].org, deathinfo.org ); + + if ( dist > 200 ) + continue; + + dist = distance( level.spawnlogic_deaths[i].killorg, deathinfo.killorg ); + + if ( dist > 200 ) + continue; + + level.spawnlogic_deaths[i].remove = 1; + } + } } -updatedeathinfo() //checked changed to match cerberus output +updatedeathinfo() { - time = getTime(); - for ( i = 0; i < level.spawnlogic_deaths.size; i++ ) - { - deathinfo = level.spawnlogic_deaths[ i ]; - if ( ( time - deathinfo.time ) > 90000 || isDefined( deathinfo.killer ) || isalive( deathinfo.killer ) || !isDefined( level.teams[ deathinfo.killer.team ] ) || distance( deathinfo.killer.origin, deathinfo.killorg ) > 400 ) - { - level.spawnlogic_deaths[ i ].remove = 1; - } - } - oldarray = level.spawnlogic_deaths; - level.spawnlogic_deaths = []; - start = 0; - if ( ( oldarray.size - 1024 ) > 0 ) - { - start = oldarray.size - 1024; - } - for ( i = start; i < oldarray.size; i++ ) - { - if ( !isDefined( oldarray[ i ].remove ) ) - { - level.spawnlogic_deaths[ level.spawnlogic_deaths.size ] = oldarray[ i ]; - } - } + time = gettime(); + + for ( i = 0; i < level.spawnlogic_deaths.size; i++ ) + { + deathinfo = level.spawnlogic_deaths[i]; + + if ( time - deathinfo.time > 90000 || !isdefined( deathinfo.killer ) || !isalive( deathinfo.killer ) || !isdefined( level.teams[deathinfo.killer.team] ) || distance( deathinfo.killer.origin, deathinfo.killorg ) > 400 ) + level.spawnlogic_deaths[i].remove = 1; + } + + oldarray = level.spawnlogic_deaths; + level.spawnlogic_deaths = []; + start = 0; + + if ( oldarray.size - 1024 > 0 ) + start = oldarray.size - 1024; + + for ( i = start; i < oldarray.size; i++ ) + { + if ( !isdefined( oldarray[i].remove ) ) + level.spawnlogic_deaths[level.spawnlogic_deaths.size] = oldarray[i]; + } } -ispointvulnerable( playerorigin ) //checked changed to match cerberus output +ispointvulnerable( playerorigin ) { - pos = self.origin + level.bettymodelcenteroffset; - playerpos = playerorigin + vectorScale( ( 0, 0, 1 ), 32 ); - distsqrd = distancesquared( pos, playerpos ); - forward = anglesToForward( self.angles ); - if ( distsqrd < ( level.bettydetectionradius * level.bettydetectionradius ) ) - { - playerdir = vectornormalize( playerpos - pos ); - angle = acos( vectordot( playerdir, forward ) ); - if ( angle < level.bettydetectionconeangle ) - { - return 1; - } - } - return 0; + pos = self.origin + level.bettymodelcenteroffset; + playerpos = playerorigin + vectorscale( ( 0, 0, 1 ), 32.0 ); + distsqrd = distancesquared( pos, playerpos ); + forward = anglestoforward( self.angles ); + + if ( distsqrd < level.bettydetectionradius * level.bettydetectionradius ) + { + playerdir = vectornormalize( playerpos - pos ); + angle = acos( vectordot( playerdir, forward ) ); + + if ( angle < level.bettydetectionconeangle ) + return true; + } + + return false; } -avoidweapondamage( spawnpoints ) //checked partially changed to match cerberus output see info.md +avoidweapondamage( spawnpoints ) { - if ( getDvar( "scr_spawnpointnewlogic" ) == "0" ) - { - return; - } - weapondamagepenalty = 100000; - if ( getDvar( "scr_spawnpointdeathpenalty" ) != "" && getDvar( "scr_spawnpointdeathpenalty" ) != "0" ) - { - weapondamagepenalty = getDvarFloat( "scr_spawnpointdeathpenalty" ); - } - mingrenadedistsquared = 62500; - for ( i = 0; i < spawnpoints.size; i++ ) - { - j = 0; - while ( j < level.grenades.size ) - { - if ( !isDefined( level.grenades[ j ] ) ) - { - j++; - continue; - } - if ( distancesquared( spawnpoints[ i ].origin, level.grenades[ j ].origin ) < mingrenadedistsquared ) - { - spawnpoints[ i ].weight -= weapondamagepenalty; - /* + if ( getdvar( _hash_FB71FB7 ) == "0" ) + return; + + weapondamagepenalty = 100000; + + if ( getdvar( _hash_76B8F046 ) != "" && getdvar( _hash_76B8F046 ) != "0" ) + weapondamagepenalty = getdvarfloat( _hash_76B8F046 ); + + mingrenadedistsquared = 62500; + + for ( i = 0; i < spawnpoints.size; i++ ) + { + for ( j = 0; j < level.grenades.size; j++ ) + { + if ( !isdefined( level.grenades[j] ) ) + continue; + + if ( distancesquared( spawnpoints[i].origin, level.grenades[j].origin ) < mingrenadedistsquared ) + { + spawnpoints[i].weight -= weapondamagepenalty; /# - if ( level.storespawndata || level.debugspawning ) - { - spawnpoints[ i ].spawndata[ spawnpoints[ i ].spawndata.size ] = "Was near grenade: -" + int( weapondamagepenalty ); + if ( level.storespawndata || level.debugspawning ) + spawnpoints[i].spawndata[spawnpoints[i].spawndata.size] = "Was near grenade: -" + int( weapondamagepenalty ); #/ - } - */ - } - j++; - } - } + } + } + } } -spawnperframeupdate() //checked matches cerberus output +spawnperframeupdate() { - spawnpointindex = 0; - while ( 1 ) - { - wait 0.05; - if ( !isDefined( level.spawnpoints ) ) - { - return; - } - spawnpointindex = ( spawnpointindex + 1 ) % level.spawnpoints.size; - spawnpoint = level.spawnpoints[ spawnpointindex ]; - spawnpointupdate( spawnpoint ); - } + spawnpointindex = 0; + + while ( true ) + { + wait 0.05; + + if ( !isdefined( level.spawnpoints ) ) + return; + + spawnpointindex = ( spawnpointindex + 1 ) % level.spawnpoints.size; + spawnpoint = level.spawnpoints[spawnpointindex]; + spawnpointupdate( spawnpoint ); + } } -getnonteamsum( skip_team, sums ) //checked partially changed to match cerberus output see info.md +getnonteamsum( skip_team, sums ) { - value = 0; - foreach ( team in level.teams ) - { - if ( team == skip_team ) - { - } - else - { - value += sums[ team ]; - } - } - return value; + value = 0; + + foreach ( team in level.teams ) + { + if ( team == skip_team ) + continue; + + value += sums[team]; + } + + return value; } -getnonteammindist( skip_team, mindists ) //checked partially changed to match cerberus output see info.md +getnonteammindist( skip_team, mindists ) { - dist = 9999999; - foreach ( team in level.teams ) - { - if ( team == skip_team ) - { - } - else - { - if ( dist > mindists[ team ] ) - { - dist = mindists[ team ]; - } - } - } - return dist; + dist = 9999999; + + foreach ( team in level.teams ) + { + if ( team == skip_team ) + continue; + + if ( dist > mindists[team] ) + dist = mindists[team]; + } + + return dist; } -spawnpointupdate( spawnpoint ) //checked changed to match cerberus output +spawnpointupdate( spawnpoint ) { - if ( level.teambased ) - { - sights = []; - foreach ( team in level.teams ) - { - spawnpoint.enemysights[ team ] = 0; - sights[ team ] = 0; - spawnpoint.nearbyplayers[ team ] = []; - } - } - else - { - spawnpoint.enemysights = 0; - spawnpoint.nearbyplayers[ "all" ] = []; - } - spawnpointdir = spawnpoint.forward; - debug = 0; - /* + if ( level.teambased ) + { + sights = []; + + foreach ( team in level.teams ) + { + spawnpoint.enemysights[team] = 0; + sights[team] = 0; + spawnpoint.nearbyplayers[team] = []; + } + } + else + { + spawnpoint.enemysights = 0; + spawnpoint.nearbyplayers["all"] = []; + } + + spawnpointdir = spawnpoint.forward; + debug = 0; /# - debug = getDvarInt( "scr_spawnpointdebug" ) > 0; + debug = getdvarint( "scr_spawnpointdebug" ) > 0; #/ - */ - mindist = []; - distsum = []; - if ( !level.teambased ) - { - mindist[ "all" ] = 9999999; - } - foreach ( team in level.teams ) - { - spawnpoint.distsum[ team ] = 0; - spawnpoint.enemydistsum[ team ] = 0; - spawnpoint.minenemydist[ team ] = 9999999; - mindist[ team ] = 9999999; - } - spawnpoint.numplayersatlastupdate = 0; - i = 0; - while ( i < level.players.size ) - { - player = level.players[ i ]; - if ( player.sessionstate != "playing" ) - { - i++; - continue; - } - diff = player.origin - spawnpoint.origin; - diff = ( diff[ 0 ], diff[ 1 ], 0 ); - dist = length( diff ); - team = "all"; - if ( level.teambased ) - { - team = player.team; - } - if ( dist < 1024 ) - { - spawnpoint.nearbyplayers[ team ][ spawnpoint.nearbyplayers[ team ].size ] = player; - } - if ( dist < mindist[ team ] ) - { - mindist[ team ] = dist; - } - distsum[ team ] += dist; - spawnpoint.numplayersatlastupdate++; - pdir = anglesToForward( player.angles ); - if ( vectordot( spawnpointdir, diff ) < 0 && vectordot( pdir, diff ) > 0 ) - { - i++; - continue; - } - losexists = bullettracepassed( player.origin + vectorScale( ( -1, -1, -1 ), 50 ), spawnpoint.sighttracepoint, 0, undefined ); - spawnpoint.lastsighttracetime = getTime(); - if ( losexists ) - { - if ( level.teambased ) - { - sights[ player.team ]++; - } - else - { - spawnpoint.enemysights++; - } - /* + mindist = []; + distsum = []; + + if ( !level.teambased ) + mindist["all"] = 9999999; + + foreach ( team in level.teams ) + { + spawnpoint.distsum[team] = 0; + spawnpoint.enemydistsum[team] = 0; + spawnpoint.minenemydist[team] = 9999999; + mindist[team] = 9999999; + } + + spawnpoint.numplayersatlastupdate = 0; + + for ( i = 0; i < level.players.size; i++ ) + { + player = level.players[i]; + + if ( player.sessionstate != "playing" ) + continue; + + diff = player.origin - spawnpoint.origin; + diff = ( diff[0], diff[1], 0 ); + dist = length( diff ); + team = "all"; + + if ( level.teambased ) + team = player.team; + + if ( dist < 1024 ) + spawnpoint.nearbyplayers[team][spawnpoint.nearbyplayers[team].size] = player; + + if ( dist < mindist[team] ) + mindist[team] = dist; + + distsum[team] += dist; + spawnpoint.numplayersatlastupdate++; + pdir = anglestoforward( player.angles ); + + if ( vectordot( spawnpointdir, diff ) < 0 && vectordot( pdir, diff ) > 0 ) + continue; + + losexists = bullettracepassed( player.origin + vectorscale( ( 0, 0, 1 ), 50.0 ), spawnpoint.sighttracepoint, 0, undefined ); + spawnpoint.lastsighttracetime = gettime(); + + if ( losexists ) + { + if ( level.teambased ) + sights[player.team]++; + else + spawnpoint.enemysights++; + /# - if ( debug ) - { - line( player.origin + vectorScale( ( 0, 0, 1 ), 50 ), spawnpoint.sighttracepoint, ( 0.5, 1, 0.5 ) ); + if ( debug ) + line( player.origin + vectorscale( ( 0, 0, 1 ), 50.0 ), spawnpoint.sighttracepoint, ( 0.5, 1, 0.5 ) ); #/ - } - */ - } - i++; - } - if ( level.teambased ) - { - foreach ( team in level.teams ) - { - spawnpoint.enemysights[ team ] = getnonteamsum( team, sights ); - spawnpoint.minenemydist[ team ] = getnonteammindist( team, mindist ); - spawnpoint.distsum[ team ] = distsum[ team ]; - spawnpoint.enemydistsum[ team ] = getnonteamsum( team, distsum ); - } - } - else - { - spawnpoint.distsum[ "all" ] = distsum[ "all" ]; - spawnpoint.enemydistsum[ "all" ] = distsum[ "all" ]; - spawnpoint.minenemydist[ "all" ] = mindist[ "all" ]; - } + } + } + + if ( level.teambased ) + { + foreach ( team in level.teams ) + { + spawnpoint.enemysights[team] = getnonteamsum( team, sights ); + spawnpoint.minenemydist[team] = getnonteammindist( team, mindist ); + spawnpoint.distsum[team] = distsum[team]; + spawnpoint.enemydistsum[team] = getnonteamsum( team, distsum ); + } + } + else + { + spawnpoint.distsum["all"] = distsum["all"]; + spawnpoint.enemydistsum["all"] = distsum["all"]; + spawnpoint.minenemydist["all"] = mindist["all"]; + } } -getlospenalty() //checked matches cerberus output dvars taken from beta dump +getlospenalty() { - if ( getDvar( "scr_spawnpointlospenalty" ) != "" && getDvar( "scr_spawnpointlospenalty" ) != "0" ) - { - return getDvarFloat( "scr_spawnpointlospenalty" ); - } - return 100000; + if ( getdvar( _hash_CACDB8AA ) != "" && getdvar( _hash_CACDB8AA ) != "0" ) + return getdvarfloat( _hash_CACDB8AA ); + + return 100000; } -lastminutesighttraces( spawnpoint ) //checked partially changed to match cerberus output see info.md +lastminutesighttraces( spawnpoint ) { - if ( !isDefined( spawnpoint.nearbyplayers ) ) - { - return 0; - } - closest = undefined; - closestdistsq = undefined; - secondclosest = undefined; - secondclosestdistsq = undefined; - foreach ( team in spawnpoint.nearbyplayers ) - { - if ( team == self.team ) - { - } - else - { - i = 0; - while ( i < spawnpoint.nearbyplayers[ team ].size ) - { - player = spawnpoint.nearbyplayers[ team ][ i ]; - if ( !isDefined( player ) ) - { - i++; - continue; - } - if ( player.sessionstate != "playing" ) - { - i++; - continue; - } - if ( player == self ) - { - i++; - continue; - } - distsq = distancesquared( spawnpoint.origin, player.origin ); - if ( !isDefined( closest ) || distsq < closestdistsq ) - { - secondclosest = closest; - secondclosestdistsq = closestdistsq; - closest = player; - closestdistsq = distsq; - } - else if ( !isDefined( secondclosest ) || distsq < secondclosestdistsq ) - { - secondclosest = player; - secondclosestdistsq = distsq; - } - i++; - } - } - } - if ( isDefined( closest ) ) - { - if ( bullettracepassed( closest.origin + vectorScale( ( 0, 0, 1 ), 50 ), spawnpoint.sighttracepoint, 0, undefined ) ) - { - return 1; - } - } - if ( isDefined( secondclosest ) ) - { - if ( bullettracepassed( secondclosest.origin + vectorScale( ( 0, 0, 1 ), 50 ), spawnpoint.sighttracepoint, 0, undefined ) ) - { - return 1; - } - } - return 0; + if ( !isdefined( spawnpoint.nearbyplayers ) ) + return false; + + closest = undefined; + closestdistsq = undefined; + secondclosest = undefined; + secondclosestdistsq = undefined; + + foreach ( team in spawnpoint.nearbyplayers ) + { + if ( team == self.team ) + continue; + + for ( i = 0; i < spawnpoint.nearbyplayers[team].size; i++ ) + { + player = spawnpoint.nearbyplayers[team][i]; + + if ( !isdefined( player ) ) + continue; + + if ( player.sessionstate != "playing" ) + continue; + + if ( player == self ) + continue; + + distsq = distancesquared( spawnpoint.origin, player.origin ); + + if ( !isdefined( closest ) || distsq < closestdistsq ) + { + secondclosest = closest; + secondclosestdistsq = closestdistsq; + closest = player; + closestdistsq = distsq; + continue; + } + + if ( !isdefined( secondclosest ) || distsq < secondclosestdistsq ) + { + secondclosest = player; + secondclosestdistsq = distsq; + } + } + } + + if ( isdefined( closest ) ) + { + if ( bullettracepassed( closest.origin + vectorscale( ( 0, 0, 1 ), 50.0 ), spawnpoint.sighttracepoint, 0, undefined ) ) + return true; + } + + if ( isdefined( secondclosest ) ) + { + if ( bullettracepassed( secondclosest.origin + vectorscale( ( 0, 0, 1 ), 50.0 ), spawnpoint.sighttracepoint, 0, undefined ) ) + return true; + } + + return false; } -avoidvisibleenemies( spawnpoints, teambased ) //checked partially changed to match beta dump see info.md +avoidvisibleenemies( spawnpoints, teambased ) { - if ( getDvar( "scr_spawnpointnewlogic" ) == "0" ) - { - return; - } - lospenalty = getlospenalty(); - mindistteam = self.team; - if ( teambased ) - { - i = 0; - while ( i < spawnpoints.size ) - { - if ( !isDefined( spawnpoints[ i ].enemysights ) ) - { - i++; - continue; - } - penalty = lospenalty * spawnpoints[ i ].enemysights[ self.team ]; - spawnpoints[ i ].weight -= penalty; - /* + if ( getdvar( _hash_FB71FB7 ) == "0" ) + return; + + lospenalty = getlospenalty(); + mindistteam = self.team; + + if ( teambased ) + { + for ( i = 0; i < spawnpoints.size; i++ ) + { + if ( !isdefined( spawnpoints[i].enemysights ) ) + continue; + + penalty = lospenalty * spawnpoints[i].enemysights[self.team]; + spawnpoints[i].weight -= penalty; /# - if ( level.storespawndata || level.debugspawning ) - { - index = spawnpoints[ i ].sightchecks.size; - spawnpoints[ i ].sightchecks[ index ] = spawnstruct(); - spawnpoints[ i ].sightchecks[ index ].penalty = penalty; + if ( level.storespawndata || level.debugspawning ) + { + index = spawnpoints[i].sightchecks.size; + spawnpoints[i].sightchecks[index] = spawnstruct(); + spawnpoints[i].sightchecks[index].penalty = penalty; + } #/ - } - */ - i++; - } - } - else - { - i = 0; - while ( i < spawnpoints.size ) - { - if ( !isDefined( spawnpoints[ i ].enemysights ) ) - { - i++; - continue; - } - penalty = lospenalty * spawnpoints[ i ].enemysights; - spawnpoints[ i ].weight -= penalty; - /* + } + } + else + { + for ( i = 0; i < spawnpoints.size; i++ ) + { + if ( !isdefined( spawnpoints[i].enemysights ) ) + continue; + + penalty = lospenalty * spawnpoints[i].enemysights; + spawnpoints[i].weight -= penalty; /# - if ( level.storespawndata || level.debugspawning ) - { - index = spawnpoints[ i ].sightchecks.size; - spawnpoints[ i ].sightchecks[ index ] = spawnstruct(); - spawnpoints[ i ].sightchecks[ index ].penalty = penalty; + if ( level.storespawndata || level.debugspawning ) + { + index = spawnpoints[i].sightchecks.size; + spawnpoints[i].sightchecks[index] = spawnstruct(); + spawnpoints[i].sightchecks[index].penalty = penalty; + } #/ - } - */ - i++; - } - } - mindistteam = "all"; - avoidweight = getDvarFloat( "scr_spawn_enemyavoidweight" ); - if ( avoidweight != 0 ) - { - nearbyenemyouterrange = getDvarFloat( "scr_spawn_enemyavoiddist" ); - nearbyenemyouterrangesq = nearbyenemyouterrange * nearbyenemyouterrange; - nearbyenemypenalty = 1500 * avoidweight; - nearbyenemyminorpenalty = 800 * avoidweight; - lastattackerorigin = vectorScale( ( -1, -1, -1 ), 99999 ); - lastdeathpos = vectorScale( ( -1, -1, -1 ), 99999 ); - if ( isalive( self.lastattacker ) ) - { - lastattackerorigin = self.lastattacker.origin; - } - if ( isDefined( self.lastdeathpos ) ) - { - lastdeathpos = self.lastdeathpos; - } - for ( i = 0; i < spawnpoints.size; i++ ) - { - mindist = spawnpoints[ i ].minenemydist[ mindistteam ]; - if ( mindist < ( nearbyenemyouterrange * 2 ) ) - { - penalty = nearbyenemyminorpenalty * ( 1 - ( mindist / ( nearbyenemyouterrange * 2 ) ) ); - if ( mindist < nearbyenemyouterrange ) - { - penalty += nearbyenemypenalty * ( 1 - ( mindist / nearbyenemyouterrange ) ); - } - if ( penalty > 0 ) - { - spawnpoints[ i ].weight -= penalty; - /* + } + + mindistteam = "all"; + } + + avoidweight = getdvarfloat( "scr_spawn_enemyavoidweight" ); + + if ( avoidweight != 0 ) + { + nearbyenemyouterrange = getdvarfloat( "scr_spawn_enemyavoiddist" ); + nearbyenemyouterrangesq = nearbyenemyouterrange * nearbyenemyouterrange; + nearbyenemypenalty = 1500 * avoidweight; + nearbyenemyminorpenalty = 800 * avoidweight; + lastattackerorigin = vectorscale( ( -1, -1, -1 ), 99999.0 ); + lastdeathpos = vectorscale( ( -1, -1, -1 ), 99999.0 ); + + if ( isalive( self.lastattacker ) ) + lastattackerorigin = self.lastattacker.origin; + + if ( isdefined( self.lastdeathpos ) ) + lastdeathpos = self.lastdeathpos; + + for ( i = 0; i < spawnpoints.size; i++ ) + { + mindist = spawnpoints[i].minenemydist[mindistteam]; + + if ( mindist < nearbyenemyouterrange * 2 ) + { + penalty = nearbyenemyminorpenalty * ( 1 - mindist / nearbyenemyouterrange * 2 ); + + if ( mindist < nearbyenemyouterrange ) + penalty += nearbyenemypenalty * ( 1 - mindist / nearbyenemyouterrange ); + + if ( penalty > 0 ) + { + spawnpoints[i].weight -= penalty; /# - if ( level.storespawndata || level.debugspawning ) - { - spawnpoints[ i ].spawndata[ spawnpoints[ i ].spawndata.size ] = "Nearest enemy at " + int( spawnpoints[ i ].minenemydist[ mindistteam ] ) + " units: -" + int( penalty ); + if ( level.storespawndata || level.debugspawning ) + spawnpoints[i].spawndata[spawnpoints[i].spawndata.size] = "Nearest enemy at " + int( spawnpoints[i].minenemydist[mindistteam] ) + " units: -" + int( penalty ); #/ - } - */ - } - } - } - } + } + } + } + } } -avoidspawnreuse( spawnpoints, teambased ) //checked partially changed to match beta dump see info.md +avoidspawnreuse( spawnpoints, teambased ) { - if ( getDvar( "scr_spawnpointnewlogic" ) == "0" ) - { - return; - } - time = getTime(); - maxtime = 10000; - maxdistsq = 1048576; - i = 0; - while ( i < spawnpoints.size ) - { - spawnpoint = spawnpoints[ i ]; - if ( isDefined( spawnpoint.lastspawnedplayer ) || !isDefined( spawnpoint.lastspawntime ) || !isalive( spawnpoint.lastspawnedplayer ) ) - { - i++; - continue; - } - if ( spawnpoint.lastspawnedplayer == self ) - { - i++; - continue; - } - if ( teambased && spawnpoint.lastspawnedplayer.team == self.team ) - { - i++; - continue; - } - timepassed = time - spawnpoint.lastspawntime; - if ( timepassed < maxtime ) - { - distsq = distancesquared( spawnpoint.lastspawnedplayer.origin, spawnpoint.origin ); - if ( distsq < maxdistsq ) - { - worsen = ( 5000 * ( 1 - ( distsq / maxdistsq ) ) ) * ( 1 - ( timepassed / maxtime ) ); - spawnpoint.weight -= worsen; - /* + if ( getdvar( _hash_FB71FB7 ) == "0" ) + return; + + time = gettime(); + maxtime = 10000; + maxdistsq = 1048576; + + for ( i = 0; i < spawnpoints.size; i++ ) + { + spawnpoint = spawnpoints[i]; + + if ( !isdefined( spawnpoint.lastspawnedplayer ) || !isdefined( spawnpoint.lastspawntime ) || !isalive( spawnpoint.lastspawnedplayer ) ) + continue; + + if ( spawnpoint.lastspawnedplayer == self ) + continue; + + if ( teambased && spawnpoint.lastspawnedplayer.team == self.team ) + continue; + + timepassed = time - spawnpoint.lastspawntime; + + if ( timepassed < maxtime ) + { + distsq = distancesquared( spawnpoint.lastspawnedplayer.origin, spawnpoint.origin ); + + if ( distsq < maxdistsq ) + { + worsen = 5000 * ( 1 - distsq / maxdistsq ) * ( 1 - timepassed / maxtime ); + spawnpoint.weight -= worsen; /# - if ( level.storespawndata || level.debugspawning ) - { - spawnpoint.spawndata[ spawnpoint.spawndata.size ] = "Was recently used: -" + worsen; + if ( level.storespawndata || level.debugspawning ) + spawnpoint.spawndata[spawnpoint.spawndata.size] = "Was recently used: -" + worsen; #/ - } - */ - } - else - { - spawnpoint.lastspawnedplayer = undefined; - } - } - else - { - spawnpoint.lastspawnedplayer = undefined; - } - i++; - } + } + else + spawnpoint.lastspawnedplayer = undefined; + + continue; + } + + spawnpoint.lastspawnedplayer = undefined; + } } -avoidsamespawn( spawnpoints ) //checked changed to match cerberus output +avoidsamespawn( spawnpoints ) { - if ( getDvar( "scr_spawnpointnewlogic" ) == "0" ) - { - return; - } - if ( !isDefined( self.lastspawnpoint ) ) - { - return; - } - for ( i = 0; i < spawnpoints.size; i++ ) - { - if ( spawnpoints[ i ] == self.lastspawnpoint ) - { - spawnpoints[ i ].weight -= 50000; - /* + if ( getdvar( _hash_FB71FB7 ) == "0" ) + return; + + if ( !isdefined( self.lastspawnpoint ) ) + return; + + for ( i = 0; i < spawnpoints.size; i++ ) + { + if ( spawnpoints[i] == self.lastspawnpoint ) + { + spawnpoints[i].weight -= 50000; /# - if ( level.storespawndata || level.debugspawning ) - { - spawnpoints[ i ].spawndata[ spawnpoints[ i ].spawndata.size ] = "Was last spawnpoint: -50000"; + if ( level.storespawndata || level.debugspawning ) + spawnpoints[i].spawndata[spawnpoints[i].spawndata.size] = "Was last spawnpoint: -50000"; #/ - } - */ - return; - } - } + break; + } + } } -getrandomintermissionpoint() //checked matches cerberus output +getrandomintermissionpoint() { - spawnpoints = getentarray( "mp_global_intermission", "classname" ); - if ( !spawnpoints.size ) - { - spawnpoints = getentarray( "info_player_start", "classname" ); - } - /* -/# - assert( spawnpoints.size ); -#/ - */ - spawnpoint = maps/mp/gametypes/_spawnlogic::getspawnpoint_random( spawnpoints ); - return spawnpoint; -} + spawnpoints = getentarray( "mp_global_intermission", "classname" ); + if ( !spawnpoints.size ) + spawnpoints = getentarray( "info_player_start", "classname" ); + +/# + assert( spawnpoints.size ); +#/ + spawnpoint = maps\mp\gametypes\_spawnlogic::getspawnpoint_random( spawnpoints ); + return spawnpoint; +} diff --git a/Multiplayer Core/patch_mp/maps/mp/gametypes/_spectating.gsc b/Multiplayer Core/patch_mp/maps/mp/gametypes/_spectating.gsc index 0752b8d..b311728 100644 --- a/Multiplayer Core/patch_mp/maps/mp/gametypes/_spectating.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/gametypes/_spectating.gsc @@ -1,251 +1,228 @@ +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool -init() //checked changed to match cerberus output +init() { - foreach ( team in level.teams ) - { - level.spectateoverride[ team ] = spawnstruct(); - } - level thread onplayerconnect(); + foreach ( team in level.teams ) + level.spectateoverride[team] = spawnstruct(); + + level thread onplayerconnect(); } -onplayerconnect() //checked matches cerberus output +onplayerconnect() { - for ( ;; ) - { - level waittill( "connecting", player ); - player thread onjoinedteam(); - player thread onjoinedspectators(); - player thread onplayerspawned(); - } + for (;;) + { + level waittill( "connecting", player ); + + player thread onjoinedteam(); + player thread onjoinedspectators(); + player thread onplayerspawned(); + } } -onplayerspawned() //checked matches cerberus output +onplayerspawned() { - self endon( "disconnect" ); - for ( ;; ) - { - self waittill( "spawned_player" ); - self setspectatepermissions(); - } + self endon( "disconnect" ); + + for (;;) + { + self waittill( "spawned_player" ); + + self setspectatepermissions(); + } } -onjoinedteam() //checked matches cerberus output +onjoinedteam() { - self endon( "disconnect" ); - for ( ;; ) - { - self waittill( "joined_team" ); - self setspectatepermissionsformachine(); - } + self endon( "disconnect" ); + + for (;;) + { + self waittill( "joined_team" ); + + self setspectatepermissionsformachine(); + } } -onjoinedspectators() //checked matches cerberus output +onjoinedspectators() { - self endon( "disconnect" ); - for ( ;; ) - { - self waittill( "joined_spectators" ); - self setspectatepermissionsformachine(); - } + self endon( "disconnect" ); + + for (;;) + { + self waittill( "joined_spectators" ); + + self setspectatepermissionsformachine(); + } } -updatespectatesettings() //checked changed to match cerberus output +updatespectatesettings() { - level endon( "game_ended" ); - for ( index = 0; index < level.players.size; index++ ) - { - level.players[ index ] setspectatepermissions(); - } + level endon( "game_ended" ); + + for ( index = 0; index < level.players.size; index++ ) + level.players[index] setspectatepermissions(); } -getsplitscreenteam() //checked partially changed to match cerberus output did not change while loop to for loop see github for more info +getsplitscreenteam() { - index = 0; - while ( index < level.players.size ) - { - if ( !isDefined( level.players[ index ] ) ) - { - index++; - continue; - } - if ( level.players[ index ] == self ) - { - index++; - continue; - } - if ( !self isplayeronsamemachine( level.players[ index ] ) ) - { - index++; - continue; - } - team = level.players[ index ].sessionteam; - if ( team != "spectator" ) - { - return team; - } - index++; - } - return self.sessionteam; + for ( index = 0; index < level.players.size; index++ ) + { + if ( !isdefined( level.players[index] ) ) + continue; + + if ( level.players[index] == self ) + continue; + + if ( !self isplayeronsamemachine( level.players[index] ) ) + continue; + + team = level.players[index].sessionteam; + + if ( team != "spectator" ) + return team; + } + + return self.sessionteam; } -otherlocalplayerstillalive() //checked partially changed to match cerberus output did not change while loop to for loop see github for more info +otherlocalplayerstillalive() { - index = 0; - while ( index < level.players.size ) - { - if ( !isDefined( level.players[ index ] ) ) - { - index++; - continue; - } - if ( level.players[ index ] == self ) - { - index++; - continue; - } - if ( !self isplayeronsamemachine( level.players[ index ] ) ) - { - index++; - continue; - } - if ( isalive( level.players[ index ] ) ) - { - return 1; - } - index++; - } - return 0; + for ( index = 0; index < level.players.size; index++ ) + { + if ( !isdefined( level.players[index] ) ) + continue; + + if ( level.players[index] == self ) + continue; + + if ( !self isplayeronsamemachine( level.players[index] ) ) + continue; + + if ( isalive( level.players[index] ) ) + return true; + } + + return false; } -allowspectateallteams( allow ) //checked changed to match cerberus output +allowspectateallteams( allow ) { - foreach ( team in level.teams ) - { - self allowspectateteam( team, allow ); - } + foreach ( team in level.teams ) + self allowspectateteam( team, allow ); } -allowspectateallteamsexceptteam( skip_team, allow ) //checked partially changed to match cerberus output did not use continue in foreach see github for more info +allowspectateallteamsexceptteam( skip_team, allow ) { - foreach ( team in level.teams ) - { - if ( team == skip_team ) - { - } - else - { - self allowspectateteam( team, allow ); - } - } + foreach ( team in level.teams ) + { + if ( team == skip_team ) + continue; + + self allowspectateteam( team, allow ); + } } -setspectatepermissions() //checked changed to match cerberus output +setspectatepermissions() { - team = self.sessionteam; - if ( team == "spectator" ) - { - if ( self issplitscreen() && !level.splitscreen ) - { - team = getsplitscreenteam(); - } - if ( team == "spectator" ) - { - self allowspectateallteams( 1 ); - self allowspectateteam( "freelook", 0 ); - self allowspectateteam( "none", 1 ); - self allowspectateteam( "localplayers", 1 ); - return; - } - } - spectatetype = level.spectatetype; - switch( spectatetype ) - { - case 0: - self allowspectateallteams( 0 ); - self allowspectateteam( "freelook", 0 ); - self allowspectateteam( "none", 1 ); - self allowspectateteam( "localplayers", 0 ); - break; - case 3: - if ( self issplitscreen() && self otherlocalplayerstillalive() ) - { - self allowspectateallteams( 0 ); - self allowspectateteam( "none", 0 ); - self allowspectateteam( "freelook", 0 ); - self allowspectateteam( "localplayers", 1 ); - break; - } - case 1: - if ( !level.teambased ) - { - self allowspectateallteams( 1 ); - self allowspectateteam( "none", 1 ); - self allowspectateteam( "freelook", 0 ); - self allowspectateteam( "localplayers", 1 ); - } - else if ( isDefined( team ) && isDefined( level.teams[ team ] ) ) - { - self allowspectateteam( team, 1 ); - self allowspectateallteamsexceptteam( team, 0 ); - self allowspectateteam( "freelook", 0 ); - self allowspectateteam( "none", 0 ); - self allowspectateteam( "localplayers", 1 ); - } - else - { - self allowspectateallteams( 0 ); - self allowspectateteam( "freelook", 0 ); - self allowspectateteam( "none", 0 ); - self allowspectateteam( "localplayers", 1 ); - } - break; - case 2: - self allowspectateallteams( 1 ); - self allowspectateteam( "freelook", 1 ); - self allowspectateteam( "none", 1 ); - self allowspectateteam( "localplayers", 1 ); - break; - } - if ( isDefined( team ) && isDefined( level.teams[ team ] ) ) - { - if ( isDefined( level.spectateoverride[ team ].allowfreespectate ) ) - { - self allowspectateteam( "freelook", 1 ); - } - if ( isDefined( level.spectateoverride[ team ].allowenemyspectate ) ) - { - self allowspectateallteamsexceptteam( team, 1 ); - } - } + team = self.sessionteam; + + if ( team == "spectator" ) + { + if ( self issplitscreen() && !level.splitscreen ) + team = getsplitscreenteam(); + + if ( team == "spectator" ) + { + self allowspectateallteams( 1 ); + self allowspectateteam( "freelook", 0 ); + self allowspectateteam( "none", 1 ); + self allowspectateteam( "localplayers", 1 ); + return; + } + } + + spectatetype = level.spectatetype; + + switch ( spectatetype ) + { + case 0: + self allowspectateallteams( 0 ); + self allowspectateteam( "freelook", 0 ); + self allowspectateteam( "none", 1 ); + self allowspectateteam( "localplayers", 0 ); + break; + case 3: + if ( self issplitscreen() && self otherlocalplayerstillalive() ) + { + self allowspectateallteams( 0 ); + self allowspectateteam( "none", 0 ); + self allowspectateteam( "freelook", 0 ); + self allowspectateteam( "localplayers", 1 ); + break; + } + case 1: + if ( !level.teambased ) + { + self allowspectateallteams( 1 ); + self allowspectateteam( "none", 1 ); + self allowspectateteam( "freelook", 0 ); + self allowspectateteam( "localplayers", 1 ); + } + else if ( isdefined( team ) && isdefined( level.teams[team] ) ) + { + self allowspectateteam( team, 1 ); + self allowspectateallteamsexceptteam( team, 0 ); + self allowspectateteam( "freelook", 0 ); + self allowspectateteam( "none", 0 ); + self allowspectateteam( "localplayers", 1 ); + } + else + { + self allowspectateallteams( 0 ); + self allowspectateteam( "freelook", 0 ); + self allowspectateteam( "none", 0 ); + self allowspectateteam( "localplayers", 1 ); + } + + break; + case 2: + self allowspectateallteams( 1 ); + self allowspectateteam( "freelook", 1 ); + self allowspectateteam( "none", 1 ); + self allowspectateteam( "localplayers", 1 ); + break; + } + + if ( isdefined( team ) && isdefined( level.teams[team] ) ) + { + if ( isdefined( level.spectateoverride[team].allowfreespectate ) ) + self allowspectateteam( "freelook", 1 ); + + if ( isdefined( level.spectateoverride[team].allowenemyspectate ) ) + self allowspectateallteamsexceptteam( team, 1 ); + } } -setspectatepermissionsformachine() //checked partially changed to match cerberus output did not change while loop to for loop see github for more info +setspectatepermissionsformachine() { - self setspectatepermissions(); - if ( !self issplitscreen() ) - { - return; - } - index = 0; - while ( index < level.players.size ) - { - if ( !isDefined( level.players[ index ] ) ) - { - index++; - continue; - } - else if ( level.players[ index ] == self ) - { - index++; - continue; - } - else if ( !self isplayeronsamemachine( level.players[ index ] ) ) - { - index++; - continue; - } - level.players[ index ] setspectatepermissions(); - index++; - } -} + self setspectatepermissions(); + if ( !self issplitscreen() ) + return; + + for ( index = 0; index < level.players.size; index++ ) + { + if ( !isdefined( level.players[index] ) ) + continue; + + if ( level.players[index] == self ) + continue; + + if ( !self isplayeronsamemachine( level.players[index] ) ) + continue; + + level.players[index] setspectatepermissions(); + } +} diff --git a/Multiplayer Core/patch_mp/maps/mp/gametypes/_tweakables.gsc b/Multiplayer Core/patch_mp/maps/mp/gametypes/_tweakables.gsc index 307f7a6..b0fbb5f 100644 --- a/Multiplayer Core/patch_mp/maps/mp/gametypes/_tweakables.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/gametypes/_tweakables.gsc @@ -1,401 +1,385 @@ -#include maps/mp/_utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool -gettweakabledvarvalue( category, name ) //checked matches cerberus output +gettweakabledvarvalue( category, name ) { - switch( category ) - { - case "rule": - dvar = level.rules[ name ].dvar; - break; - case "game": - dvar = level.gametweaks[ name ].dvar; - break; - case "team": - dvar = level.teamtweaks[ name ].dvar; - break; - case "player": - dvar = level.playertweaks[ name ].dvar; - break; - case "class": - dvar = level.classtweaks[ name ].dvar; - break; - case "weapon": - dvar = level.weapontweaks[ name ].dvar; - break; - case "killstreak": - dvar = level.hardpointtweaks[ name ].dvar; - break; - case "hud": - dvar = level.hudtweaks[ name ].dvar; - break; - default: - dvar = undefined; - break; - } - /* + switch ( category ) + { + case "rule": + dvar = level.rules[name].dvar; + break; + case "game": + dvar = level.gametweaks[name].dvar; + break; + case "team": + dvar = level.teamtweaks[name].dvar; + break; + case "player": + dvar = level.playertweaks[name].dvar; + break; + case "class": + dvar = level.classtweaks[name].dvar; + break; + case "weapon": + dvar = level.weapontweaks[name].dvar; + break; + case "killstreak": + dvar = level.hardpointtweaks[name].dvar; + break; + case "hud": + dvar = level.hudtweaks[name].dvar; + break; + default: + dvar = undefined; + break; + } + /# - assert( isDefined( dvar ) ); + assert( isdefined( dvar ) ); #/ - */ - value = getDvarInt( dvar ); - return value; + value = getdvarint( dvar ); + return value; } -gettweakabledvar( category, name ) //checked matches cerberus output +gettweakabledvar( category, name ) { - switch( category ) - { - case "rule": - value = level.rules[ name ].dvar; - break; - case "game": - value = level.gametweaks[ name ].dvar; - break; - case "team": - value = level.teamtweaks[ name ].dvar; - break; - case "player": - value = level.playertweaks[ name ].dvar; - break; - case "class": - value = level.classtweaks[ name ].dvar; - break; - case "weapon": - value = level.weapontweaks[ name ].dvar; - break; - case "killstreak": - value = level.hardpointtweaks[ name ].dvar; - break; - case "hud": - value = level.hudtweaks[ name ].dvar; - break; - default: - value = undefined; - break; - } - /* + switch ( category ) + { + case "rule": + value = level.rules[name].dvar; + break; + case "game": + value = level.gametweaks[name].dvar; + break; + case "team": + value = level.teamtweaks[name].dvar; + break; + case "player": + value = level.playertweaks[name].dvar; + break; + case "class": + value = level.classtweaks[name].dvar; + break; + case "weapon": + value = level.weapontweaks[name].dvar; + break; + case "killstreak": + value = level.hardpointtweaks[name].dvar; + break; + case "hud": + value = level.hudtweaks[name].dvar; + break; + default: + value = undefined; + break; + } + /# - assert( isDefined( value ) ); + assert( isdefined( value ) ); #/ - */ - return value; + return value; } -gettweakablevalue( category, name ) //checked matches cerberus output +gettweakablevalue( category, name ) { - switch( category ) - { - case "rule": - value = level.rules[ name ].value; - break; - case "game": - value = level.gametweaks[ name ].value; - break; - case "team": - value = level.teamtweaks[ name ].value; - break; - case "player": - value = level.playertweaks[ name ].value; - break; - case "class": - value = level.classtweaks[ name ].value; - break; - case "weapon": - value = level.weapontweaks[ name ].value; - break; - case "killstreak": - value = level.hardpointtweaks[ name ].value; - break; - case "hud": - value = level.hudtweaks[ name ].value; - break; - default: - value = undefined; - break; - } - overridedvar = "scr_" + level.gametype + "_" + category + "_" + name; - if ( getDvar( overridedvar ) != "" ) - { - return getDvarInt( overridedvar ); - } - /* + switch ( category ) + { + case "rule": + value = level.rules[name].value; + break; + case "game": + value = level.gametweaks[name].value; + break; + case "team": + value = level.teamtweaks[name].value; + break; + case "player": + value = level.playertweaks[name].value; + break; + case "class": + value = level.classtweaks[name].value; + break; + case "weapon": + value = level.weapontweaks[name].value; + break; + case "killstreak": + value = level.hardpointtweaks[name].value; + break; + case "hud": + value = level.hudtweaks[name].value; + break; + default: + value = undefined; + break; + } + + overridedvar = "scr_" + level.gametype + "_" + category + "_" + name; + + if ( getdvar( overridedvar ) != "" ) + return getdvarint( overridedvar ); + /# - assert( isDefined( value ) ); + assert( isdefined( value ) ); #/ - */ - return value; + return value; } -gettweakablelastvalue( category, name ) //checked matches cerberus output +gettweakablelastvalue( category, name ) { - switch( category ) - { - case "rule": - value = level.rules[ name ].lastvalue; - break; - case "game": - value = level.gametweaks[ name ].lastvalue; - break; - case "team": - value = level.teamtweaks[ name ].lastvalue; - break; - case "player": - value = level.playertweaks[ name ].lastvalue; - break; - case "class": - value = level.classtweaks[ name ].lastvalue; - break; - case "weapon": - value = level.weapontweaks[ name ].lastvalue; - break; - case "killstreak": - value = level.hardpointtweaks[ name ].lastvalue; - break; - case "hud": - value = level.hudtweaks[ name ].lastvalue; - break; - default: - value = undefined; - break; - } - /* + switch ( category ) + { + case "rule": + value = level.rules[name].lastvalue; + break; + case "game": + value = level.gametweaks[name].lastvalue; + break; + case "team": + value = level.teamtweaks[name].lastvalue; + break; + case "player": + value = level.playertweaks[name].lastvalue; + break; + case "class": + value = level.classtweaks[name].lastvalue; + break; + case "weapon": + value = level.weapontweaks[name].lastvalue; + break; + case "killstreak": + value = level.hardpointtweaks[name].lastvalue; + break; + case "hud": + value = level.hudtweaks[name].lastvalue; + break; + default: + value = undefined; + break; + } + /# - assert( isDefined( value ) ); + assert( isdefined( value ) ); #/ - */ - return value; + return value; } -settweakablevalue( category, name, value ) //checked matches cerberus output +settweakablevalue( category, name, value ) { - switch( category ) - { - case "rule": - dvar = level.rules[ name ].dvar; - break; - case "game": - dvar = level.gametweaks[ name ].dvar; - break; - case "team": - dvar = level.teamtweaks[ name ].dvar; - break; - case "player": - dvar = level.playertweaks[ name ].dvar; - break; - case "class": - dvar = level.classtweaks[ name ].dvar; - break; - case "weapon": - dvar = level.weapontweaks[ name ].dvar; - break; - case "killstreak": - dvar = level.hardpointtweaks[ name ].dvar; - break; - case "hud": - dvar = level.hudtweaks[ name ].dvar; - break; - default: - dvar = undefined; - break; - } - setdvar( dvar, value ); + switch ( category ) + { + case "rule": + dvar = level.rules[name].dvar; + break; + case "game": + dvar = level.gametweaks[name].dvar; + break; + case "team": + dvar = level.teamtweaks[name].dvar; + break; + case "player": + dvar = level.playertweaks[name].dvar; + break; + case "class": + dvar = level.classtweaks[name].dvar; + break; + case "weapon": + dvar = level.weapontweaks[name].dvar; + break; + case "killstreak": + dvar = level.hardpointtweaks[name].dvar; + break; + case "hud": + dvar = level.hudtweaks[name].dvar; + break; + default: + dvar = undefined; + break; + } + + setdvar( dvar, value ); } -settweakablelastvalue( category, name, value ) //checked changed to match cerberus output +settweakablelastvalue( category, name, value ) { - switch( category ) - { - case "rule": - level.rules[ name ].lastvalue = value; - break; - case "game": - level.gametweaks[ name ].lastvalue = value; - break; - case "team": - level.teamtweaks[ name ].lastvalue = value; - break; - case "player": - level.playertweaks[ name ].lastvalue = value; - break; - case "class": - level.classtweaks[ name ].lastvalue = value; - break; - case "weapon": - level.weapontweaks[ name ].lastvalue = value; - break; - case "killstreak": - level.hardpointtweaks[ name ].lastvalue = value; - break; - case "hud": - level.hudtweaks[ name ].lastvalue = value; - break; - default: - break; - } + switch ( category ) + { + case "rule": + level.rules[name].lastvalue = value; + break; + case "game": + level.gametweaks[name].lastvalue = value; + break; + case "team": + level.teamtweaks[name].lastvalue = value; + break; + case "player": + level.playertweaks[name].lastvalue = value; + break; + case "class": + level.classtweaks[name].lastvalue = value; + break; + case "weapon": + level.weapontweaks[name].lastvalue = value; + break; + case "killstreak": + level.hardpointtweaks[name].lastvalue = value; + break; + case "hud": + level.hudtweaks[name].lastvalue = value; + break; + default: + break; + } } -registertweakable( category, name, dvar, value ) //checked matches cerberus output +registertweakable( category, name, dvar, value ) { - if ( isstring( value ) ) - { - if ( getDvar( dvar ) == "" ) - { - setdvar( dvar, value ); - } - else - { - value = getDvar( dvar ); - } - } - else if ( getDvar( dvar ) == "" ) - { - setdvar( dvar, value ); - } - else - { - value = getDvarInt( dvar ); - } - switch( category ) - { - case "rule": - if ( !isDefined( level.rules[ name ] ) ) - { - level.rules[ name ] = spawnstruct(); - } - level.rules[ name ].value = value; - level.rules[ name ].lastvalue = value; - level.rules[ name ].dvar = dvar; - break; - case "game": - if ( !isDefined( level.gametweaks[ name ] ) ) - { - level.gametweaks[ name ] = spawnstruct(); - } - level.gametweaks[ name ].value = value; - level.gametweaks[ name ].lastvalue = value; - level.gametweaks[ name ].dvar = dvar; - break; - case "team": - if ( !isDefined( level.teamtweaks[ name ] ) ) - { - level.teamtweaks[ name ] = spawnstruct(); - } - level.teamtweaks[ name ].value = value; - level.teamtweaks[ name ].lastvalue = value; - level.teamtweaks[ name ].dvar = dvar; - break; - case "player": - if ( !isDefined( level.playertweaks[ name ] ) ) - { - level.playertweaks[ name ] = spawnstruct(); - } - level.playertweaks[ name ].value = value; - level.playertweaks[ name ].lastvalue = value; - level.playertweaks[ name ].dvar = dvar; - break; - case "class": - if ( !isDefined( level.classtweaks[ name ] ) ) - { - level.classtweaks[ name ] = spawnstruct(); - } - level.classtweaks[ name ].value = value; - level.classtweaks[ name ].lastvalue = value; - level.classtweaks[ name ].dvar = dvar; - break; - case "weapon": - if ( !isDefined( level.weapontweaks[ name ] ) ) - { - level.weapontweaks[ name ] = spawnstruct(); - } - level.weapontweaks[ name ].value = value; - level.weapontweaks[ name ].lastvalue = value; - level.weapontweaks[ name ].dvar = dvar; - break; - case "killstreak": - if ( !isDefined( level.hardpointtweaks[ name ] ) ) - { - level.hardpointtweaks[ name ] = spawnstruct(); - } - level.hardpointtweaks[ name ].value = value; - level.hardpointtweaks[ name ].lastvalue = value; - level.hardpointtweaks[ name ].dvar = dvar; - break; - case "hud": - if ( !isDefined( level.hudtweaks[ name ] ) ) - { - level.hudtweaks[ name ] = spawnstruct(); - } - level.hudtweaks[ name ].value = value; - level.hudtweaks[ name ].lastvalue = value; - level.hudtweaks[ name ].dvar = dvar; - break; - } + if ( isstring( value ) ) + { + if ( getdvar( dvar ) == "" ) + setdvar( dvar, value ); + else + value = getdvar( dvar ); + } + else if ( getdvar( dvar ) == "" ) + setdvar( dvar, value ); + else + value = getdvarint( dvar ); + + switch ( category ) + { + case "rule": + if ( !isdefined( level.rules[name] ) ) + level.rules[name] = spawnstruct(); + + level.rules[name].value = value; + level.rules[name].lastvalue = value; + level.rules[name].dvar = dvar; + break; + case "game": + if ( !isdefined( level.gametweaks[name] ) ) + level.gametweaks[name] = spawnstruct(); + + level.gametweaks[name].value = value; + level.gametweaks[name].lastvalue = value; + level.gametweaks[name].dvar = dvar; + break; + case "team": + if ( !isdefined( level.teamtweaks[name] ) ) + level.teamtweaks[name] = spawnstruct(); + + level.teamtweaks[name].value = value; + level.teamtweaks[name].lastvalue = value; + level.teamtweaks[name].dvar = dvar; + break; + case "player": + if ( !isdefined( level.playertweaks[name] ) ) + level.playertweaks[name] = spawnstruct(); + + level.playertweaks[name].value = value; + level.playertweaks[name].lastvalue = value; + level.playertweaks[name].dvar = dvar; + break; + case "class": + if ( !isdefined( level.classtweaks[name] ) ) + level.classtweaks[name] = spawnstruct(); + + level.classtweaks[name].value = value; + level.classtweaks[name].lastvalue = value; + level.classtweaks[name].dvar = dvar; + break; + case "weapon": + if ( !isdefined( level.weapontweaks[name] ) ) + level.weapontweaks[name] = spawnstruct(); + + level.weapontweaks[name].value = value; + level.weapontweaks[name].lastvalue = value; + level.weapontweaks[name].dvar = dvar; + break; + case "killstreak": + if ( !isdefined( level.hardpointtweaks[name] ) ) + level.hardpointtweaks[name] = spawnstruct(); + + level.hardpointtweaks[name].value = value; + level.hardpointtweaks[name].lastvalue = value; + level.hardpointtweaks[name].dvar = dvar; + break; + case "hud": + if ( !isdefined( level.hudtweaks[name] ) ) + level.hudtweaks[name] = spawnstruct(); + + level.hudtweaks[name].value = value; + level.hudtweaks[name].lastvalue = value; + level.hudtweaks[name].dvar = dvar; + break; + } } -init() //checked matches cerberus output +init() { - level.clienttweakables = []; - level.tweakablesinitialized = 1; - level.rules = []; - level.gametweaks = []; - level.teamtweaks = []; - level.playertweaks = []; - level.classtweaks = []; - level.weapontweaks = []; - level.hardpointtweaks = []; - level.hudtweaks = []; - registertweakable( "game", "arcadescoring", "scr_game_arcadescoring", 0 ); - registertweakable( "game", "difficulty", "scr_game_difficulty", 1 ); - registertweakable( "game", "pinups", "scr_game_pinups", 0 ); - registertweakable( "team", "teamkillerplaylistbanquantum", "scr_team_teamkillerplaylistbanquantum", 0 ); - registertweakable( "team", "teamkillerplaylistbanpenalty", "scr_team_teamkillerplaylistbanpenalty", 0 ); - registertweakable( "player", "allowrevive", "scr_player_allowrevive", 1 ); - registertweakable( "weapon", "allowfrag", "scr_weapon_allowfrags", 1 ); - registertweakable( "weapon", "allowsmoke", "scr_weapon_allowsmoke", 1 ); - registertweakable( "weapon", "allowflash", "scr_weapon_allowflash", 1 ); - registertweakable( "weapon", "allowc4", "scr_weapon_allowc4", 1 ); - registertweakable( "weapon", "allowsatchel", "scr_weapon_allowsatchel", 1 ); - registertweakable( "weapon", "allowbetty", "scr_weapon_allowbetty", 1 ); - registertweakable( "weapon", "allowrpgs", "scr_weapon_allowrpgs", 1 ); - registertweakable( "weapon", "allowmines", "scr_weapon_allowmines", 1 ); - registertweakable( "hud", "showobjicons", "ui_hud_showobjicons", 1 ); - setclienttweakable( "hud", "showobjicons" ); - registertweakable( "killstreak", "allowradar", "scr_hardpoint_allowradar", 1 ); - registertweakable( "killstreak", "allowradardirection", "scr_hardpoint_allowradardirection", 1 ); - registertweakable( "killstreak", "allowcounteruav", "scr_hardpoint_allowcounteruav", 1 ); - registertweakable( "killstreak", "allowdogs", "scr_hardpoint_allowdogs", 1 ); - registertweakable( "killstreak", "allowhelicopter_comlink", "scr_hardpoint_allowhelicopter_comlink", 1 ); - registertweakable( "killstreak", "allowrcbomb", "scr_hardpoint_allowrcbomb", 1 ); - registertweakable( "killstreak", "allowauto_turret", "scr_hardpoint_allowauto_turret", 1 ); - level thread updateuitweakables(); + level.clienttweakables = []; + level.tweakablesinitialized = 1; + level.rules = []; + level.gametweaks = []; + level.teamtweaks = []; + level.playertweaks = []; + level.classtweaks = []; + level.weapontweaks = []; + level.hardpointtweaks = []; + level.hudtweaks = []; + registertweakable( "game", "arcadescoring", "scr_game_arcadescoring", 0 ); + registertweakable( "game", "difficulty", "scr_game_difficulty", 1 ); + registertweakable( "game", "pinups", "scr_game_pinups", 0 ); + registertweakable( "team", "teamkillerplaylistbanquantum", "scr_team_teamkillerplaylistbanquantum", 0 ); + registertweakable( "team", "teamkillerplaylistbanpenalty", "scr_team_teamkillerplaylistbanpenalty", 0 ); + registertweakable( "player", "allowrevive", "scr_player_allowrevive", 1 ); + registertweakable( "weapon", "allowfrag", "scr_weapon_allowfrags", 1 ); + registertweakable( "weapon", "allowsmoke", "scr_weapon_allowsmoke", 1 ); + registertweakable( "weapon", "allowflash", "scr_weapon_allowflash", 1 ); + registertweakable( "weapon", "allowc4", "scr_weapon_allowc4", 1 ); + registertweakable( "weapon", "allowsatchel", "scr_weapon_allowsatchel", 1 ); + registertweakable( "weapon", "allowbetty", "scr_weapon_allowbetty", 1 ); + registertweakable( "weapon", "allowrpgs", "scr_weapon_allowrpgs", 1 ); + registertweakable( "weapon", "allowmines", "scr_weapon_allowmines", 1 ); + registertweakable( "hud", "showobjicons", "ui_hud_showobjicons", 1 ); + setclienttweakable( "hud", "showobjicons" ); + registertweakable( "killstreak", "allowradar", "scr_hardpoint_allowradar", 1 ); + registertweakable( "killstreak", "allowradardirection", "scr_hardpoint_allowradardirection", 1 ); + registertweakable( "killstreak", "allowcounteruav", "scr_hardpoint_allowcounteruav", 1 ); + registertweakable( "killstreak", "allowdogs", "scr_hardpoint_allowdogs", 1 ); + registertweakable( "killstreak", "allowhelicopter_comlink", "scr_hardpoint_allowhelicopter_comlink", 1 ); + registertweakable( "killstreak", "allowrcbomb", "scr_hardpoint_allowrcbomb", 1 ); + registertweakable( "killstreak", "allowauto_turret", "scr_hardpoint_allowauto_turret", 1 ); + level thread updateuitweakables(); } -setclienttweakable( category, name ) //checked matches cerberus output +setclienttweakable( category, name ) { - level.clienttweakables[ level.clienttweakables.size ] = name; + level.clienttweakables[level.clienttweakables.size] = name; } -updateuitweakables() //checked changed to match cerberus output +updateuitweakables() { - for ( ;; ) - { - for ( index = 0; index < level.clienttweakables.size; index++ ) - { - clienttweakable = level.clienttweakables[ index ]; - curvalue = gettweakabledvarvalue( "hud", clienttweakable ); - lastvalue = gettweakablelastvalue( "hud", clienttweakable ); - if ( curvalue != lastvalue ) - { - updateserverdvar( gettweakabledvar( "hud", clienttweakable ), curvalue ); - settweakablelastvalue( "hud", clienttweakable, curvalue ); - } - } - wait 1; - } + for (;;) + { + for ( index = 0; index < level.clienttweakables.size; index++ ) + { + clienttweakable = level.clienttweakables[index]; + curvalue = gettweakabledvarvalue( "hud", clienttweakable ); + lastvalue = gettweakablelastvalue( "hud", clienttweakable ); + + if ( curvalue != lastvalue ) + { + updateserverdvar( gettweakabledvar( "hud", clienttweakable ), curvalue ); + settweakablelastvalue( "hud", clienttweakable, curvalue ); + } + } + + wait 1.0; + } } -updateserverdvar( dvar, value ) //checked matches cerberus output +updateserverdvar( dvar, value ) { - makedvarserverinfo( dvar, value ); + makedvarserverinfo( dvar, value ); } - diff --git a/Multiplayer Core/patch_mp/maps/mp/gametypes/_wager.gsc b/Multiplayer Core/patch_mp/maps/mp/gametypes/_wager.gsc index d3feaae..0a4814b 100644 --- a/Multiplayer Core/patch_mp/maps/mp/gametypes/_wager.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/gametypes/_wager.gsc @@ -1,922 +1,893 @@ -//checked includes match cerberus output -#include maps/mp/killstreaks/_killstreaks; -#include maps/mp/gametypes/_class; -#include maps/mp/gametypes/_globallogic_audio; -#include maps/mp/teams/_teams; -#include maps/mp/gametypes/_globallogic; -#include maps/mp/gametypes/_persistence; -#include maps/mp/gametypes/_rank; -#include maps/mp/gametypes/_hud_util; -#include maps/mp/gametypes/_globallogic_score; -#include common_scripts/utility; -#include maps/mp/_utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool -init() //checked matches cerberus output +init() { - precachestring( &"MP_HEADS_UP" ); - precachestring( &"MP_U2_ONLINE" ); - precachestring( &"MP_BONUS_ACQUIRED" ); - if ( gamemodeismode( level.gamemode_wager_match ) && !ispregame() ) - { - level.wagermatch = 1; - if ( !isDefined( game[ "wager_pot" ] ) ) - { - game[ "wager_pot" ] = 0; - game[ "wager_initial_pot" ] = 0; - } - game[ "dialog" ][ "wm_u2_online" ] = "boost_gen_02"; - game[ "dialog" ][ "wm_in_the_money" ] = "boost_gen_06"; - game[ "dialog" ][ "wm_oot_money" ] = "boost_gen_07"; - level.poweruplist = []; - level thread onplayerconnect(); - level thread helpgameend(); - } - else - { - level.wagermatch = 0; - } - level.takelivesondeath = 1; + precachestring( &"MP_HEADS_UP" ); + precachestring( &"MP_U2_ONLINE" ); + precachestring( &"MP_BONUS_ACQUIRED" ); + + if ( gamemodeismode( level.gamemode_wager_match ) && !ispregame() ) + { + level.wagermatch = 1; + + if ( !isdefined( game["wager_pot"] ) ) + { + game["wager_pot"] = 0; + game["wager_initial_pot"] = 0; + } + + game["dialog"]["wm_u2_online"] = "boost_gen_02"; + game["dialog"]["wm_in_the_money"] = "boost_gen_06"; + game["dialog"]["wm_oot_money"] = "boost_gen_07"; + level.poweruplist = []; + level thread onplayerconnect(); + level thread helpgameend(); + } + else + level.wagermatch = 0; + + level.takelivesondeath = 1; } -onplayerconnect() //checked matches cerberus output +onplayerconnect() { - for ( ;; ) - { - level waittill( "connected", player ); - player thread ondisconnect(); - player thread initwagerplayer(); - } + for (;;) + { + level waittill( "connected", player ); + + player thread ondisconnect(); + player thread initwagerplayer(); + } } -initwagerplayer() //checked changed to match cerberus output +initwagerplayer() { - self endon( "disconnect" ); - self waittill( "spawned_player" ); - if ( !isDefined( self.pers[ "wager" ] ) ) - { - self.pers[ "wager" ] = 1; - self.pers[ "wager_sideBetWinnings" ] = 0; - self.pers[ "wager_sideBetLosses" ] = 0; - } - if ( is_true( level.inthemoneyonradar ) || is_true( level.firstplaceonradar ) ) - { - self.pers[ "hasRadar" ] = 1; - self.hasspyplane = 1; - } - else - { - self.pers[ "hasRadar" ] = 0; - self.hasspyplane = 0; - } - self thread deductplayerante(); + self endon( "disconnect" ); + + self waittill( "spawned_player" ); + + if ( !isdefined( self.pers["wager"] ) ) + { + self.pers["wager"] = 1; + self.pers["wager_sideBetWinnings"] = 0; + self.pers["wager_sideBetLosses"] = 0; + } + + if ( isdefined( level.inthemoneyonradar ) && level.inthemoneyonradar || isdefined( level.firstplaceonradar ) && level.firstplaceonradar ) + { + self.pers["hasRadar"] = 1; + self.hasspyplane = 1; + } + else + { + self.pers["hasRadar"] = 0; + self.hasspyplane = 0; + } + + self thread deductplayerante(); } -ondisconnect() //checked matches cerberus output +ondisconnect() { - level endon( "game_ended" ); - self endon( "player_eliminated" ); - self waittill( "disconnect" ); - level notify( "player_eliminated" ); + level endon( "game_ended" ); + self endon( "player_eliminated" ); + + self waittill( "disconnect" ); + + level notify( "player_eliminated" ); } -deductplayerante() //checked matches cerberus output +deductplayerante() { - if ( isDefined( self.pers[ "hasPaidWagerAnte" ] ) ) - { - return; - } - waittillframeend; - codpoints = self maps/mp/gametypes/_rank::getcodpointsstat(); - wagerbet = getDvarInt( "scr_wagerBet" ); - if ( wagerbet > codpoints ) - { - wagerbet = codpoints; - } - codpoints -= wagerbet; - self maps/mp/gametypes/_rank::setcodpointsstat( codpoints ); - if ( !self islocaltohost() ) - { - self incrementescrowforplayer( wagerbet ); - } - game[ "wager_pot" ] += wagerbet; - game[ "wager_initial_pot" ] += wagerbet; - self.pers[ "hasPaidWagerAnte" ] = 1; - self addplayerstat( "LIFETIME_BUYIN", wagerbet ); - self addrecentearningstostat( 0 - wagerbet ); - if ( isDefined( level.onwagerplayerante ) ) - { - [[ level.onwagerplayerante ]]( self, wagerbet ); - } - self thread maps/mp/gametypes/_persistence::uploadstatssoon(); + if ( isdefined( self.pers["hasPaidWagerAnte"] ) ) + return; + + waittillframeend; + codpoints = self maps\mp\gametypes\_rank::getcodpointsstat(); + wagerbet = getdvarint( "scr_wagerBet" ); + + if ( wagerbet > codpoints ) + wagerbet = codpoints; + + codpoints -= wagerbet; + self maps\mp\gametypes\_rank::setcodpointsstat( codpoints ); + + if ( !self islocaltohost() ) + self incrementescrowforplayer( wagerbet ); + + game["wager_pot"] += wagerbet; + game["wager_initial_pot"] += wagerbet; + self.pers["hasPaidWagerAnte"] = 1; + self addplayerstat( "LIFETIME_BUYIN", wagerbet ); + self addrecentearningstostat( 0 - wagerbet ); + + if ( isdefined( level.onwagerplayerante ) ) + [[ level.onwagerplayerante ]]( self, wagerbet ); + + self thread maps\mp\gametypes\_persistence::uploadstatssoon(); } -incrementescrowforplayer( amount ) //checked matches cerberus output +incrementescrowforplayer( amount ) { - if ( !isDefined( self ) || !isplayer( self ) ) - { - return; - } - if ( !isDefined( game[ "escrows" ] ) ) - { - game[ "escrows" ] = []; - } - playerxuid = self getxuid(); - if ( !isDefined( playerxuid ) ) - { - return; - } - escrowstruct = spawnstruct(); - escrowstruct.xuid = playerxuid; - escrowstruct.amount = amount; - game[ "escrows" ][ game[ "escrows" ].size ] = escrowstruct; + if ( !isdefined( self ) || !isplayer( self ) ) + return; + + if ( !isdefined( game["escrows"] ) ) + game["escrows"] = []; + + playerxuid = self getxuid(); + + if ( !isdefined( playerxuid ) ) + return; + + escrowstruct = spawnstruct(); + escrowstruct.xuid = playerxuid; + escrowstruct.amount = amount; + game["escrows"][game["escrows"].size] = escrowstruct; } -clearescrows() //checked changed to match cerberus output +clearescrows() { - if ( !isDefined( game[ "escrows" ] ) ) - { - return; - } - escrows = game[ "escrows" ]; - numescrows = escrows.size; - for ( i = 0; i < numescrows; i++ ) - { - escrowstruct = escrows[ i ]; - } - game[ "escrows" ] = []; + if ( !isdefined( game["escrows"] ) ) + return; + + escrows = game["escrows"]; + numescrows = escrows.size; + + for ( i = 0; i < numescrows; i++ ) + escrowstruct = escrows[i]; + + game["escrows"] = []; } -addrecentearningstostat( recentearnings ) //checked matches cerberus output +addrecentearningstostat( recentearnings ) { - currearnings = self maps/mp/gametypes/_persistence::getrecentstat( 1, 0, "score" ); - self maps/mp/gametypes/_persistence::setrecentstat( 1, 0, "score", currearnings + recentearnings ); + currearnings = self maps\mp\gametypes\_persistence::getrecentstat( 1, 0, "score" ); + self maps\mp\gametypes\_persistence::setrecentstat( 1, 0, "score", currearnings + recentearnings ); } -prematchperiod() //checked matches cerberus output +prematchperiod() { - if ( !level.wagermatch ) - { - return; - } + if ( !level.wagermatch ) + return; } -finalizewagerround() //checked matches cerberus output +finalizewagerround() { - if ( level.wagermatch == 0 ) - { - return; - } - determinewagerwinnings(); - if ( isDefined( level.onwagerfinalizeround ) ) - { - [[ level.onwagerfinalizeround ]](); - } + if ( level.wagermatch == 0 ) + return; + + determinewagerwinnings(); + + if ( isdefined( level.onwagerfinalizeround ) ) + [[ level.onwagerfinalizeround ]](); } determinewagerwinnings() { - if ( !isDefined( level.dontcalcwagerwinnings ) || !level.dontcalcwagerwinnings ) - { - shouldcalculatewinnings = 0; - } - else - { - shouldcalculatewinnings = 1; - } - if ( !shouldcalculatewinnings ) - { - return; - } - if ( !level.teambased ) - { - calculatefreeforallpayouts(); - } - else - { - calculateteampayouts(); - } + shouldcalculatewinnings = !isdefined( level.dontcalcwagerwinnings ) || !level.dontcalcwagerwinnings; + + if ( !shouldcalculatewinnings ) + return; + + if ( !level.teambased ) + calculatefreeforallpayouts(); + else + calculateteampayouts(); } -calculatefreeforallpayouts() //checked changed to match cerberus output +calculatefreeforallpayouts() { - playerrankings = level.placement[ "all" ]; - payoutpercentages = array( 0.5, 0.3, 0.2 ); - if ( playerrankings.size == 2 ) - { - payoutpercentages = array( 0.7, 0.3 ); - } - else if ( playerrankings.size == 1 ) - { - payoutpercentages = array( 1 ); - } - setwagerwinningsonplayers( level.players, 0 ); - if ( is_true( level.hostforcedend ) ) - { - wagerbet = getDvarInt( "scr_wagerBet" ); - for ( i = 0; i < playerrankings.size; i++ ) - { - if ( !playerrankings[ i ] islocaltohost() ) - { - playerrankings[ i ].wagerwinnings = wagerbet; - } - } - } - else if ( level.players.size == 1 ) - { - return; - } - else - { - currentpayoutpercentage = 0; - cumulativepayoutpercentage = payoutpercentages[ 0 ]; - playergroup = []; - playergroup[ playergroup.size ] = playerrankings[ 0 ]; - for ( i = 1; i < playerrankings.size; i++ ) - { - if ( playerrankings[ i ].pers[ "score" ] < playergroup[ 0 ].pers[ "score" ] ) - { - setwagerwinningsonplayers( playergroup, int( ( game[ "wager_pot" ] * cumulativepayoutpercentage ) / playergroup.size ) ); - playergroup = []; - cumulativepayoutpercentage = 0; - } - playergroup[ playergroup.size ] = playerrankings[ i ]; - currentpayoutpercentage++; - if ( isDefined( payoutpercentages[ currentpayoutpercentage ] ) ) - { - cumulativepayoutpercentage += payoutpercentages[ currentpayoutpercentage ]; - } - } - setwagerwinningsonplayers( playergroup, int( ( game[ "wager_pot" ] * cumulativepayoutpercentage ) / playergroup.size ) ); - } + playerrankings = level.placement["all"]; + payoutpercentages = array( 0.5, 0.3, 0.2 ); + + if ( playerrankings.size == 2 ) + payoutpercentages = array( 0.7, 0.3 ); + else if ( playerrankings.size == 1 ) + payoutpercentages = array( 1.0 ); + + setwagerwinningsonplayers( level.players, 0 ); + + if ( isdefined( level.hostforcedend ) && level.hostforcedend ) + { + wagerbet = getdvarint( "scr_wagerBet" ); + + for ( i = 0; i < playerrankings.size; i++ ) + { + if ( !playerrankings[i] islocaltohost() ) + playerrankings[i].wagerwinnings = wagerbet; + } + } + else if ( level.players.size == 1 ) + { + game["escrows"] = undefined; + return; + } + else + { + currentpayoutpercentage = 0; + cumulativepayoutpercentage = payoutpercentages[0]; + playergroup = []; + playergroup[playergroup.size] = playerrankings[0]; + + for ( i = 1; i < playerrankings.size; i++ ) + { + if ( playerrankings[i].pers["score"] < playergroup[0].pers["score"] ) + { + setwagerwinningsonplayers( playergroup, int( game["wager_pot"] * cumulativepayoutpercentage / playergroup.size ) ); + playergroup = []; + cumulativepayoutpercentage = 0; + } + + playergroup[playergroup.size] = playerrankings[i]; + currentpayoutpercentage++; + + if ( isdefined( payoutpercentages[currentpayoutpercentage] ) ) + cumulativepayoutpercentage += payoutpercentages[currentpayoutpercentage]; + } + + setwagerwinningsonplayers( playergroup, int( game["wager_pot"] * cumulativepayoutpercentage / playergroup.size ) ); + } } -calculateplacesbasedonscore() //checked changed to match cerberus output +calculateplacesbasedonscore() { - level.playerplaces = array( [], [], [] ); - playerrankings = level.placement[ "all" ]; - placementscores = array( playerrankings[ 0 ].pers[ "score" ], -1, -1 ); - currentplace = 0; - for ( index = 0; index < playerrankings.size && currentplace < placementscores.size; index++ ) - { - player = playerrankings[ index ]; - if ( player.pers[ "score" ] < placementscores[ currentplace ] ) - { - currentplace++; - if ( currentplace >= level.playerplaces.size ) - { - break; - } - placementscores[ currentplace ] = player.pers[ "score" ]; - } - level.playerplaces[ currentplace ][ level.playerplaces[ currentplace ].size ] = player; - } + level.playerplaces = array( [], [], [] ); + playerrankings = level.placement["all"]; + placementscores = array( playerrankings[0].pers["score"], -1, -1 ); + currentplace = 0; + + for ( index = 0; index < playerrankings.size && currentplace < placementscores.size; index++ ) + { + player = playerrankings[index]; + + if ( player.pers["score"] < placementscores[currentplace] ) + { + currentplace++; + + if ( currentplace >= level.playerplaces.size ) + break; + + placementscores[currentplace] = player.pers["score"]; + } + + level.playerplaces[currentplace][level.playerplaces[currentplace].size] = player; + } } -calculateteampayouts() //checked changed to match cerberus output +calculateteampayouts() { - winner = maps/mp/gametypes/_globallogic::determineteamwinnerbygamestat( "teamScores" ); - if ( winner == "tie" ) - { - calculatefreeforallpayouts(); - return; - } - playersonwinningteam = []; - for ( index = 0; index < level.players.size; index++ ) - { - player = level.players[ index ]; - player.wagerwinnings = 0; - if ( player.pers[ "team" ] == winner ) - { - playersonwinningteam[ playersonwinningteam.size ] = player; - } - } - if ( playersonwinningteam.size == 0 ) - { - setwagerwinningsonplayers( level.players, getDvarInt( "scr_wagerBet" ) ); - return; - } - winningssplit = int( game[ "wager_pot" ] / playersonwinningteam.size ); - setwagerwinningsonplayers( playersonwinningteam, winningssplit ); + winner = maps\mp\gametypes\_globallogic::determineteamwinnerbygamestat( "teamScores" ); + + if ( winner == "tie" ) + { + calculatefreeforallpayouts(); + return; + } + + playersonwinningteam = []; + + for ( index = 0; index < level.players.size; index++ ) + { + player = level.players[index]; + player.wagerwinnings = 0; + + if ( player.pers["team"] == winner ) + playersonwinningteam[playersonwinningteam.size] = player; + } + + if ( playersonwinningteam.size == 0 ) + { + setwagerwinningsonplayers( level.players, getdvarint( "scr_wagerBet" ) ); + return; + } + + winningssplit = int( game["wager_pot"] / playersonwinningteam.size ); + setwagerwinningsonplayers( playersonwinningteam, winningssplit ); } -setwagerwinningsonplayers( players, amount ) //checked changed to match cerberus output +setwagerwinningsonplayers( players, amount ) { - for ( index = 0; index < players.size; index++ ) - { - players[ index ].wagerwinnings = amount; - } + for ( index = 0; index < players.size; index++ ) + players[index].wagerwinnings = amount; } -finalizewagergame() //checked changed to match cerberus output +finalizewagergame() { - level.wagergamefinalized = 1; - if ( level.wagermatch == 0 ) - { - return; - } - determinewagerwinnings(); - determinetopearners(); - players = level.players; - wait 0.5; - playerrankings = level.wagertopearners; - for ( index = 0; index < players.size; index++ ) - { - player = players[ index ]; - if ( isDefined( player.pers[ "wager_sideBetWinnings" ] ) ) - { - payoutwagerwinnings( player, player.wagerwinnings + player.pers[ "wager_sideBetWinnings" ] ); - } - else - { - payoutwagerwinnings( player, player.wagerwinnings ); - } - if ( player.wagerwinnings > 0 ) - { - maps/mp/gametypes/_globallogic_score::updatewinstats( player ); - } - } - clearescrows(); + level.wagergamefinalized = 1; + + if ( level.wagermatch == 0 ) + return; + + determinewagerwinnings(); + determinetopearners(); + players = level.players; + wait 0.5; + playerrankings = level.wagertopearners; + + for ( index = 0; index < players.size; index++ ) + { + player = players[index]; + + if ( isdefined( player.pers["wager_sideBetWinnings"] ) ) + payoutwagerwinnings( player, player.wagerwinnings + player.pers["wager_sideBetWinnings"] ); + else + payoutwagerwinnings( player, player.wagerwinnings ); + + if ( player.wagerwinnings > 0 ) + maps\mp\gametypes\_globallogic_score::updatewinstats( player ); + } + + clearescrows(); } -payoutwagerwinnings( player, winnings ) //checked matches cerberus output +payoutwagerwinnings( player, winnings ) { - if ( winnings == 0 ) - { - return; - } - codpoints = player maps/mp/gametypes/_rank::getcodpointsstat(); - player maps/mp/gametypes/_rank::setcodpointsstat( codpoints + winnings ); - player addplayerstat( "LIFETIME_EARNINGS", winnings ); - player addrecentearningstostat( winnings ); + if ( winnings == 0 ) + return; + + codpoints = player maps\mp\gametypes\_rank::getcodpointsstat(); + player maps\mp\gametypes\_rank::setcodpointsstat( codpoints + winnings ); + player addplayerstat( "LIFETIME_EARNINGS", winnings ); + player addrecentearningstostat( winnings ); } -determinetopearners() //checked changed to match beta dump +determinetopearners() { - topwinnings = array( -1, -1, -1 ); - level.wagertopearners = []; - for ( index = 0; index < level.players.size; index++ ) - { - player = level.players[ index ]; - if ( !isDefined( player.wagerwinnings ) ) - { - player.wagerwinnings = 0; - } - if ( player.wagerwinnings > topwinnings[ 0 ] ) - { - topwinnings[ 2 ] = topwinnings[ 1 ]; - topwinnings[ 1 ] = topwinnings[ 0 ]; - topwinnings[ 0 ] = player.wagerwinnings; - level.wagertopearners[ 2 ] = level.wagertopearners[ 1 ]; - level.wagertopearners[ 1 ] = level.wagertopearners[ 0 ]; - level.wagertopearners[ 0 ] = player; - } - else if ( player.wagerwinnings > topwinnings[ 1 ] ) - { - topwinnings[ 2 ] = topwinnings[ 1 ]; - topwinnings[ 1 ] = player.wagerwinnings; - level.wagertopearners[ 2 ] = level.wagertopearners[ 1 ]; - level.wagertopearners[ 1 ] = player; - } - else if ( player.wagerwinnings > topwinnings[ 2 ] ) - { - topwinnings[ 2 ] = player.wagerwinnings; - level.wagertopearners[ 2 ] = player; - } - } + topwinnings = array( -1, -1, -1 ); + level.wagertopearners = []; + + for ( index = 0; index < level.players.size; index++ ) + { + player = level.players[index]; + + if ( !isdefined( player.wagerwinnings ) ) + player.wagerwinnings = 0; + + if ( player.wagerwinnings > topwinnings[0] ) + { + topwinnings[2] = topwinnings[1]; + topwinnings[1] = topwinnings[0]; + topwinnings[0] = player.wagerwinnings; + level.wagertopearners[2] = level.wagertopearners[1]; + level.wagertopearners[1] = level.wagertopearners[0]; + level.wagertopearners[0] = player; + continue; + } + + if ( player.wagerwinnings > topwinnings[1] ) + { + topwinnings[2] = topwinnings[1]; + topwinnings[1] = player.wagerwinnings; + level.wagertopearners[2] = level.wagertopearners[1]; + level.wagertopearners[1] = player; + continue; + } + + if ( player.wagerwinnings > topwinnings[2] ) + { + topwinnings[2] = player.wagerwinnings; + level.wagertopearners[2] = player; + } + } } -postroundsidebet() //checked matches cerberus output +postroundsidebet() { - if ( is_true( level.sidebet ) ) - { - level notify( "side_bet_begin" ); - level waittill( "side_bet_end" ); - } + if ( isdefined( level.sidebet ) && level.sidebet ) + { + level notify( "side_bet_begin" ); + + level waittill( "side_bet_end" ); + } } -sidebettimer() //checked changed to match cerberus output +sidebettimer() { - level endon( "side_bet_end" ); - secondstowait = ( level.sidebetendtime - getTime() ) / 1000; - if ( secondstowait < 0 ) - { - secondstowait = 0; - } - wait secondstowait; - for ( playerindex = 0; playerindex < level.players.size; playerindex++ ) - { - if ( isDefined( level.players[ playerindex ] ) ) - { - level.players[ playerindex ] closemenu(); - } - } - level notify( "side_bet_end" ); + level endon( "side_bet_end" ); + secondstowait = ( level.sidebetendtime - gettime() ) / 1000.0; + + if ( secondstowait < 0 ) + secondstowait = 0; + + wait( secondstowait ); + + for ( playerindex = 0; playerindex < level.players.size; playerindex++ ) + { + if ( isdefined( level.players[playerindex] ) ) + level.players[playerindex] closemenu(); + } + + level notify( "side_bet_end" ); } -sidebetallbetsplaced() //checked changed to match cerberus output +sidebetallbetsplaced() { - secondsleft = ( level.sidebetendtime - getTime() ) / 1000; - if ( secondsleft <= 3 ) - { - return; - } - level.sidebetendtime = getTime() + 3000; - wait 3; - for ( playerindex = 0; playerindex < level.players.size; playerindex++ ) - { - if ( isDefined( level.players[ playerindex ] ) ) - { - level.players[ playerindex ] closemenu(); - } - } - level notify( "side_bet_end" ); + secondsleft = ( level.sidebetendtime - gettime() ) / 1000.0; + + if ( secondsleft <= 3.0 ) + return; + + level.sidebetendtime = gettime() + 3000; + wait 3; + + for ( playerindex = 0; playerindex < level.players.size; playerindex++ ) + { + if ( isdefined( level.players[playerindex] ) ) + level.players[playerindex] closemenu(); + } + + level notify( "side_bet_end" ); } -setupblankrandomplayer( takeweapons, chooserandombody, weapon ) //checked changed to match cerberus output +setupblankrandomplayer( takeweapons, chooserandombody, weapon ) { - if ( !isDefined( chooserandombody ) || chooserandombody ) - { - if ( !isDefined( self.pers[ "wagerBodyAssigned" ] ) ) - { - self assignrandombody(); - self.pers[ "wagerBodyAssigned" ] = 1; - } - self maps/mp/teams/_teams::set_player_model( self.team, weapon ); - } - self clearperks(); - self.killstreak = []; - self.pers[ "killstreaks" ] = []; - self.pers[ "killstreak_has_been_used" ] = []; - self.pers[ "killstreak_unique_id" ] = []; - if ( !isDefined( takeweapons ) || takeweapons ) - { - self takeallweapons(); - } - if ( is_true( self.pers[ "hasRadar" ] ) ) - { - self.hasspyplane = 1; - } - if ( isDefined( self.powerups ) && isDefined( self.powerups.size ) ) - { - for ( i = 0; i < self.powerups.size; i++ ) - { - self applypowerup( self.powerups[ i ] ); - } - } - self setradarvisibility(); + if ( !isdefined( chooserandombody ) || chooserandombody ) + { + if ( !isdefined( self.pers["wagerBodyAssigned"] ) ) + { + self assignrandombody(); + self.pers["wagerBodyAssigned"] = 1; + } + + self maps\mp\teams\_teams::set_player_model( self.team, weapon ); + } + + self clearperks(); + self.killstreak = []; + self.pers["killstreaks"] = []; + self.pers["killstreak_has_been_used"] = []; + self.pers["killstreak_unique_id"] = []; + + if ( !isdefined( takeweapons ) || takeweapons ) + self takeallweapons(); + + if ( isdefined( self.pers["hasRadar"] ) && self.pers["hasRadar"] ) + self.hasspyplane = 1; + + if ( isdefined( self.powerups ) && isdefined( self.powerups.size ) ) + { + for ( i = 0; i < self.powerups.size; i++ ) + self applypowerup( self.powerups[i] ); + } + + self setradarvisibility(); } -assignrandombody() //checked matches cerberus output +assignrandombody() { + } -queuewagerpopup( message, points, submessage, announcement ) //checked matches cerberus output +queuewagerpopup( message, points, submessage, announcement ) { - self endon( "disconnect" ); - size = self.wagernotifyqueue.size; - self.wagernotifyqueue[ size ] = spawnstruct(); - self.wagernotifyqueue[ size ].message = message; - self.wagernotifyqueue[ size ].points = points; - self.wagernotifyqueue[ size ].submessage = submessage; - self.wagernotifyqueue[ size ].announcement = announcement; - self notify( "received award" ); + self endon( "disconnect" ); + size = self.wagernotifyqueue.size; + self.wagernotifyqueue[size] = spawnstruct(); + self.wagernotifyqueue[size].message = message; + self.wagernotifyqueue[size].points = points; + self.wagernotifyqueue[size].submessage = submessage; + self.wagernotifyqueue[size].announcement = announcement; + self notify( "received award" ); } -helpgameend() //checked changed to match beta dump +helpgameend() { - level endon( "game_ended" ); - for ( ;; ) - { - level waittill( "player_eliminated" ); - if ( !isDefined( level.numlives ) || !level.numlives ) - { - continue; - } - wait 0.05; - players = level.players; - playersleft = 0; - for ( i = 0; i < players.size; i++ ) - { - if ( isDefined( players[ i ].pers[ "lives" ] ) && players[ i ].pers[ "lives" ] > 0 ) - { - playersleft++; - } - } - if ( playersleft == 2 ) - { - for ( i = 0; i < players.size; i++ ) - { - players[ i ] queuewagerpopup( &"MP_HEADS_UP", 0, &"MP_U2_ONLINE", "wm_u2_online" ); - players[ i ].pers[ "hasRadar" ] = 1; - players[ i ].hasspyplane = 1; - level.activeuavs[ players[ i ] getentitynumber() ]++; - } - } - } + level endon( "game_ended" ); + + for (;;) + { + level waittill( "player_eliminated" ); + + if ( !isdefined( level.numlives ) || !level.numlives ) + continue; + + wait 0.05; + players = level.players; + playersleft = 0; + + for ( i = 0; i < players.size; i++ ) + { + if ( isdefined( players[i].pers["lives"] ) && players[i].pers["lives"] > 0 ) + playersleft++; + } + + if ( playersleft == 2 ) + { + for ( i = 0; i < players.size; i++ ) + { + players[i] queuewagerpopup( &"MP_HEADS_UP", 0, &"MP_U2_ONLINE", "wm_u2_online" ); + players[i].pers["hasRadar"] = 1; + players[i].hasspyplane = 1; + level.activeuavs[players[i] getentitynumber()]++; + } + } + } } -setradarvisibility() //checked changed to match cerberus output +setradarvisibility() { - prevscoreplace = self.prevscoreplace; - if ( !isDefined( prevscoreplace ) ) - { - prevscoreplace = 1; - } - if ( is_true( level.inthemoneyonradar ) ) - { - if ( prevscoreplace <= 3 && isDefined( self.score ) && self.score > 0 ) - { - self unsetperk( "specialty_gpsjammer" ); - } - else - { - self setperk( "specialty_gpsjammer" ); - } - } - else if ( is_true( level.firstplaceonradar ) ) - { - if ( prevscoreplace == 1 && isDefined( self.score ) && self.score > 0 ) - { - self unsetperk( "specialty_gpsjammer" ); - return; - } - else - { - self setperk( "specialty_gpsjammer" ); - } - } + prevscoreplace = self.prevscoreplace; + + if ( !isdefined( prevscoreplace ) ) + prevscoreplace = 1; + + if ( isdefined( level.inthemoneyonradar ) && level.inthemoneyonradar ) + { + if ( prevscoreplace <= 3 && isdefined( self.score ) && self.score > 0 ) + self unsetperk( "specialty_gpsjammer" ); + else + self setperk( "specialty_gpsjammer" ); + } + else if ( isdefined( level.firstplaceonradar ) && level.firstplaceonradar ) + { + if ( prevscoreplace == 1 && isdefined( self.score ) && self.score > 0 ) + self unsetperk( "specialty_gpsjammer" ); + else + self setperk( "specialty_gpsjammer" ); + } } -playerscored() //checked changed to match cerberus output +playerscored() { - self notify( "wager_player_scored" ); - self endon( "wager_player_scored" ); - wait 0.05; - maps/mp/gametypes/_globallogic::updateplacement(); - for ( i = 0; i < level.placement["all"].size; i++ ) - { - prevscoreplace = level.placement[ "all" ][ i ].prevscoreplace; - if ( !isDefined( prevscoreplace ) ) - { - prevscoreplace = 1; - } - currentscoreplace = i + 1; - for ( j = i - 1; j >= 0; j-- ) - { - if ( level.placement[ "all" ][ i ].score == level.placement[ "all" ][ j ].score ) - { - currentscoreplace--; + self notify( "wager_player_scored" ); + self endon( "wager_player_scored" ); + wait 0.05; + maps\mp\gametypes\_globallogic::updateplacement(); - } - } - wasinthemoney = prevscoreplace <= 3; - isinthemoney = currentscoreplace <= 3; - if ( !wasinthemoney && isinthemoney ) - { - level.placement[ "all" ][ i ] wagerannouncer( "wm_in_the_money" ); - } - else if ( wasinthemoney && !isinthemoney ) - { - level.placement[ "all" ][ i ] wagerannouncer( "wm_oot_money" ); - } - level.placement[ "all" ][ i ].prevscoreplace = currentscoreplace; - level.placement[ "all" ][ i ] setradarvisibility(); - } + for ( i = 0; i < level.placement["all"].size; i++ ) + { + prevscoreplace = level.placement["all"][i].prevscoreplace; + + if ( !isdefined( prevscoreplace ) ) + prevscoreplace = 1; + + currentscoreplace = i + 1; + + for ( j = i - 1; j >= 0; j-- ) + { + if ( level.placement["all"][i].score == level.placement["all"][j].score ) + currentscoreplace--; + } + + wasinthemoney = prevscoreplace <= 3; + isinthemoney = currentscoreplace <= 3; + + if ( !wasinthemoney && isinthemoney ) + level.placement["all"][i] wagerannouncer( "wm_in_the_money" ); + else if ( wasinthemoney && !isinthemoney ) + level.placement["all"][i] wagerannouncer( "wm_oot_money" ); + + level.placement["all"][i].prevscoreplace = currentscoreplace; + level.placement["all"][i] setradarvisibility(); + } } -wagerannouncer( dialog, group ) //checked matches cerberus output +wagerannouncer( dialog, group ) { - self maps/mp/gametypes/_globallogic_audio::leaderdialogonplayer( dialog, group ); + self maps\mp\gametypes\_globallogic_audio::leaderdialogonplayer( dialog, group ); } -createpowerup( name, type, displayname, iconmaterial ) //checked matches cerberus output +createpowerup( name, type, displayname, iconmaterial ) { - powerup = spawnstruct(); - powerup.name = []; - powerup.name[ 0 ] = name; - powerup.type = type; - powerup.displayname = displayname; - powerup.iconmaterial = iconmaterial; - return powerup; + powerup = spawnstruct(); + powerup.name = []; + powerup.name[0] = name; + powerup.type = type; + powerup.displayname = displayname; + powerup.iconmaterial = iconmaterial; + return powerup; } -addpowerup( name, type, displayname, iconmaterial ) //checked changed to match cerberus output +addpowerup( name, type, displayname, iconmaterial ) { - if ( !isDefined( level.poweruplist ) ) - { - level.poweruplist = []; - } - for ( i = 0; i < level.poweruplist.size; i++ ) - { - if ( level.poweruplist[ i ].displayname == displayname ) - { - level.poweruplist[ i ].name[ level.poweruplist[ i ].name.size ] = name; - return; - } - } - powerup = createpowerup( name, type, displayname, iconmaterial ); - level.poweruplist[ level.poweruplist.size ] = powerup; + if ( !isdefined( level.poweruplist ) ) + level.poweruplist = []; + + for ( i = 0; i < level.poweruplist.size; i++ ) + { + if ( level.poweruplist[i].displayname == displayname ) + { + level.poweruplist[i].name[level.poweruplist[i].name.size] = name; + return; + } + } + + powerup = createpowerup( name, type, displayname, iconmaterial ); + level.poweruplist[level.poweruplist.size] = powerup; } -copypowerup( powerup ) //checked matches cerberus output +copypowerup( powerup ) { - return createpowerup( powerup.name[ 0 ], powerup.type, powerup.displayname, powerup.iconmaterial ); + return createpowerup( powerup.name[0], powerup.type, powerup.displayname, powerup.iconmaterial ); } -applypowerup( powerup ) //checked changed to match cerberus output +applypowerup( powerup ) { - switch( powerup.type ) - { - case "primary": - self giveweapon( powerup.name[ 0 ] ); - self switchtoweapon( powerup.name[ 0 ] ); - break; - case "secondary": - self giveweapon( powerup.name[ 0 ] ); - break; - case "equipment": - self giveweapon( powerup.name[ 0 ] ); - self maps/mp/gametypes/_class::setweaponammooverall( powerup.name[ 0 ], 1 ); - self setactionslot( 1, "weapon", powerup.name[ 0 ] ); - break; - case "primary_grenade": - self setoffhandprimaryclass( powerup.name[ 0 ] ); - self giveweapon( powerup.name[ 0 ] ); - self setweaponammoclip( powerup.name[ 0 ], 2 ); - break; - case "secondary_grenade": - self setoffhandsecondaryclass( powerup.name[ 0 ] ); - self giveweapon( powerup.name[ 0 ] ); - self setweaponammoclip( powerup.name[ 0 ], 2 ); - break; - case "perk": - for ( i = 0; i < powerup.name.size; i++ ) - { - self setperk( powerup.name[ i ] ); - } - case "killstreak": - self maps/mp/killstreaks/_killstreaks::givekillstreak( powerup.name[ 0 ] ); - break; - case "score_multiplier": - self.scoremultiplier = powerup.name[ 0 ]; - break; - } + switch ( powerup.type ) + { + case "primary": + self giveweapon( powerup.name[0] ); + self switchtoweapon( powerup.name[0] ); + break; + case "secondary": + self giveweapon( powerup.name[0] ); + break; + case "equipment": + self giveweapon( powerup.name[0] ); + self maps\mp\gametypes\_class::setweaponammooverall( powerup.name[0], 1 ); + self setactionslot( 1, "weapon", powerup.name[0] ); + break; + case "primary_grenade": + self setoffhandprimaryclass( powerup.name[0] ); + self giveweapon( powerup.name[0] ); + self setweaponammoclip( powerup.name[0], 2 ); + break; + case "secondary_grenade": + self setoffhandsecondaryclass( powerup.name[0] ); + self giveweapon( powerup.name[0] ); + self setweaponammoclip( powerup.name[0], 2 ); + break; + case "perk": + for ( i = 0; i < powerup.name.size; i++ ) + self setperk( powerup.name[i] ); + + break; + case "killstreak": + self maps\mp\killstreaks\_killstreaks::givekillstreak( powerup.name[0] ); + break; + case "score_multiplier": + self.scoremultiplier = powerup.name[0]; + break; + } } -givepowerup( powerup, doanimation ) //checked changed to match cerberus output +givepowerup( powerup, doanimation ) { - if ( !isDefined( self.powerups ) ) - { - self.powerups = []; - } - powerupindex = self.powerups.size; - self.powerups[ powerupindex ] = copypowerup( powerup ); - for ( i = 0; i < powerup.name.size; i++ ) - { - self.powerups[ powerupindex ].name[ self.powerups[ powerupindex ].name.size ] = powerup.name[ i ]; - } - self applypowerup( self.powerups[ powerupindex ] ); - self thread showpowerupmessage( powerupindex, doanimation ); + if ( !isdefined( self.powerups ) ) + self.powerups = []; + + powerupindex = self.powerups.size; + self.powerups[powerupindex] = copypowerup( powerup ); + + for ( i = 0; i < powerup.name.size; i++ ) + self.powerups[powerupindex].name[self.powerups[powerupindex].name.size] = powerup.name[i]; + + self applypowerup( self.powerups[powerupindex] ); + self thread showpowerupmessage( powerupindex, doanimation ); } -pulsepowerupicon( powerupindex ) //checked changed to match cerberus output +pulsepowerupicon( powerupindex ) { - if ( !isDefined( self ) || !isDefined( self.powerups ) || !isDefined( self.powerups[ powerupindex ] ) || !isDefined( self.powerups[ powerupindex ].hud_elem_icon ) ) - { - return; - } - self endon( "disconnect" ); - self endon( "delete" ); - self endon( "clearing_powerups" ); - pulsepercent = 1.5; - pulsetime = 0.5; - hud_elem = self.powerups[ powerupindex ].hud_elem_icon; - if ( is_true( hud_elem.animating ) ) - { - return; - } - origx = hud_elem.x; - origy = hud_elem.y; - origwidth = hud_elem.width; - origheight = hud_elem.height; - bigwidth = origwidth * pulsepercent; - bigheight = origheight * pulsepercent; - xoffset = ( bigwidth - origwidth ) / 2; - yoffset = ( bigheight - origheight ) / 2; - hud_elem scaleovertime( 0.05, int( bigwidth ), int( bigheight ) ); - hud_elem moveovertime( 0.05 ); - hud_elem.x = origx - xoffset; - hud_elem.y = origy - yoffset; - wait 0.05; - hud_elem scaleovertime( pulsetime, origwidth, origheight ); - hud_elem moveovertime( pulsetime ); - hud_elem.x = origx; - hud_elem.y = origy; + if ( !isdefined( self ) || !isdefined( self.powerups ) || !isdefined( self.powerups[powerupindex] ) || !isdefined( self.powerups[powerupindex].hud_elem_icon ) ) + return; + + self endon( "disconnect" ); + self endon( "delete" ); + self endon( "clearing_powerups" ); + pulsepercent = 1.5; + pulsetime = 0.5; + hud_elem = self.powerups[powerupindex].hud_elem_icon; + + if ( isdefined( hud_elem.animating ) && hud_elem.animating ) + return; + + origx = hud_elem.x; + origy = hud_elem.y; + origwidth = hud_elem.width; + origheight = hud_elem.height; + bigwidth = origwidth * pulsepercent; + bigheight = origheight * pulsepercent; + xoffset = ( bigwidth - origwidth ) / 2; + yoffset = ( bigheight - origheight ) / 2; + hud_elem scaleovertime( 0.05, int( bigwidth ), int( bigheight ) ); + hud_elem moveovertime( 0.05 ); + hud_elem.x = origx - xoffset; + hud_elem.y = origy - yoffset; + wait 0.05; + hud_elem scaleovertime( pulsetime, origwidth, origheight ); + hud_elem moveovertime( pulsetime ); + hud_elem.x = origx; + hud_elem.y = origy; } -showpowerupmessage( powerupindex, doanimation ) //checked changed to match cerberus output +showpowerupmessage( powerupindex, doanimation ) { - self endon( "disconnect" ); - self endon( "delete" ); - self endon( "clearing_powerups" ); - if ( !isDefined( doanimation ) ) - { - doanimation = 1; - } - wasinprematch = level.inprematchperiod; - powerupstarty = 320; - powerupspacing = 40; - if ( self issplitscreen() ) - { - powerupstarty = 120; - powerupspacing = 35; - } - if ( isDefined( self.powerups[ powerupindex ].hud_elem ) ) - { - self.powerups[ powerupindex ].hud_elem destroy(); - } - self.powerups[ powerupindex ].hud_elem = newclienthudelem( self ); - self.powerups[ powerupindex ].hud_elem.fontscale = 1,5; - self.powerups[ powerupindex ].hud_elem.x = -125; - self.powerups[ powerupindex ].hud_elem.y = powerupstarty - ( powerupspacing * powerupindex ); - self.powerups[ powerupindex ].hud_elem.alignx = "left"; - self.powerups[ powerupindex ].hud_elem.aligny = "middle"; - self.powerups[ powerupindex ].hud_elem.horzalign = "user_right"; - self.powerups[ powerupindex ].hud_elem.vertalign = "user_top"; - self.powerups[ powerupindex ].hud_elem.color = ( 1, 1, 1 ); - self.powerups[ powerupindex ].hud_elem.foreground = 1; - self.powerups[ powerupindex ].hud_elem.hidewhendead = 0; - self.powerups[ powerupindex ].hud_elem.hidewheninmenu = 1; - self.powerups[ powerupindex ].hud_elem.hidewheninkillcam = 1; - self.powerups[ powerupindex ].hud_elem.archived = 0; - self.powerups[ powerupindex ].hud_elem.alpha = 0; - self.powerups[ powerupindex ].hud_elem settext( self.powerups[ powerupindex ].displayname ); - bigiconsize = 40; - iconsize = 32; - if ( isDefined( self.powerups[ powerupindex ].hud_elem_icon ) ) - { - self.powerups[ powerupindex ].hud_elem_icon destroy(); - } - if ( doanimation ) - { - self.powerups[ powerupindex ].hud_elem_icon = self createicon( self.powerups[ powerupindex ].iconmaterial, bigiconsize, bigiconsize ); - self.powerups[ powerupindex ].hud_elem_icon.animating = 1; - } - else - { - self.powerups[ powerupindex ].hud_elem_icon = self createicon( self.powerups[ powerupindex ].iconmaterial, iconsize, iconsize ); - } - self.powerups[ powerupindex ].hud_elem_icon.x = ( ( self.powerups[ powerupindex ].hud_elem.x - 5 ) - ( iconsize / 2 ) ) - ( bigiconsize / 2 ); - self.powerups[ powerupindex ].hud_elem_icon.y = ( powerupstarty - ( powerupspacing * powerupindex ) ) - ( bigiconsize / 2 ); - self.powerups[ powerupindex ].hud_elem_icon.horzalign = "user_right"; - self.powerups[ powerupindex ].hud_elem_icon.vertalign = "user_top"; - self.powerups[ powerupindex ].hud_elem_icon.color = ( 1, 1, 1 ); - self.powerups[ powerupindex ].hud_elem_icon.foreground = 1; - self.powerups[ powerupindex ].hud_elem_icon.hidewhendead = 0; - self.powerups[ powerupindex ].hud_elem_icon.hidewheninmenu = 1; - self.powerups[ powerupindex ].hud_elem_icon.hidewheninkillcam = 1; - self.powerups[ powerupindex ].hud_elem_icon.archived = 0; - self.powerups[ powerupindex ].hud_elem_icon.alpha = 1; - if ( !wasinprematch && doanimation ) - { - self thread queuewagerpopup( self.powerups[ powerupindex ].displayname, 0, &"MP_BONUS_ACQUIRED" ); - } - pulsetime = 0.5; - if ( doanimation ) - { - self.powerups[ powerupindex ].hud_elem fadeovertime( pulsetime ); - self.powerups[ powerupindex ].hud_elem_icon scaleovertime( pulsetime, iconsize, iconsize ); - self.powerups[ powerupindex ].hud_elem_icon.width = iconsize; - self.powerups[ powerupindex ].hud_elem_icon.height = iconsize; - self.powerups[ powerupindex ].hud_elem_icon moveovertime( pulsetime ); - } - self.powerups[ powerupindex ].hud_elem.alpha = 1; - self.powerups[ powerupindex ].hud_elem_icon.x = ( self.powerups[ powerupindex ].hud_elem.x - 5 ) - iconsize; - self.powerups[ powerupindex ].hud_elem_icon.y = ( powerupstarty - ( powerupspacing * powerupindex ) ) - ( iconsize / 2 ); - if ( doanimation ) - { - wait pulsetime; - } - if ( level.inprematchperiod ) - { - level waittill( "prematch_over" ); - } - else - { - if ( doanimation ) - { - wait pulsetime; - } - } - if ( wasinprematch && doanimation ) - { - self thread queuewagerpopup( self.powerups[ powerupindex ].displayname, 0, &"MP_BONUS_ACQUIRED" ); - } - wait 1.5; - for ( i = 0; i <= powerupindex; i++ ) - { - self.powerups[ i ].hud_elem fadeovertime( 0.25 ); - self.powerups[ i ].hud_elem.alpha = 0; - } - wait 0.25; - for ( i = 0; i <= powerupindex; i++ ) - { - self.powerups[ i ].hud_elem_icon moveovertime( 0.25 ); - self.powerups[ i ].hud_elem_icon.x = 0 - iconsize; - self.powerups[ i ].hud_elem_icon.horzalign = "user_right"; - } - self.powerups[ powerupindex ].hud_elem_icon.animating = 0; + self endon( "disconnect" ); + self endon( "delete" ); + self endon( "clearing_powerups" ); + + if ( !isdefined( doanimation ) ) + doanimation = 1; + + wasinprematch = level.inprematchperiod; + powerupstarty = 320; + powerupspacing = 40; + + if ( self issplitscreen() ) + { + powerupstarty = 120; + powerupspacing = 35; + } + + if ( isdefined( self.powerups[powerupindex].hud_elem ) ) + self.powerups[powerupindex].hud_elem destroy(); + + self.powerups[powerupindex].hud_elem = newclienthudelem( self ); + self.powerups[powerupindex].hud_elem.fontscale = 1.5; + self.powerups[powerupindex].hud_elem.x = -125; + self.powerups[powerupindex].hud_elem.y = powerupstarty - powerupspacing * powerupindex; + self.powerups[powerupindex].hud_elem.alignx = "left"; + self.powerups[powerupindex].hud_elem.aligny = "middle"; + self.powerups[powerupindex].hud_elem.horzalign = "user_right"; + self.powerups[powerupindex].hud_elem.vertalign = "user_top"; + self.powerups[powerupindex].hud_elem.color = ( 1, 1, 1 ); + self.powerups[powerupindex].hud_elem.foreground = 1; + self.powerups[powerupindex].hud_elem.hidewhendead = 0; + self.powerups[powerupindex].hud_elem.hidewheninmenu = 1; + self.powerups[powerupindex].hud_elem.hidewheninkillcam = 1; + self.powerups[powerupindex].hud_elem.archived = 0; + self.powerups[powerupindex].hud_elem.alpha = 0.0; + self.powerups[powerupindex].hud_elem settext( self.powerups[powerupindex].displayname ); + bigiconsize = 40; + iconsize = 32; + + if ( isdefined( self.powerups[powerupindex].hud_elem_icon ) ) + self.powerups[powerupindex].hud_elem_icon destroy(); + + if ( doanimation ) + { + self.powerups[powerupindex].hud_elem_icon = self createicon( self.powerups[powerupindex].iconmaterial, bigiconsize, bigiconsize ); + self.powerups[powerupindex].hud_elem_icon.animating = 1; + } + else + self.powerups[powerupindex].hud_elem_icon = self createicon( self.powerups[powerupindex].iconmaterial, iconsize, iconsize ); + + self.powerups[powerupindex].hud_elem_icon.x = self.powerups[powerupindex].hud_elem.x - 5 - iconsize / 2 - bigiconsize / 2; + self.powerups[powerupindex].hud_elem_icon.y = powerupstarty - powerupspacing * powerupindex - bigiconsize / 2; + self.powerups[powerupindex].hud_elem_icon.horzalign = "user_right"; + self.powerups[powerupindex].hud_elem_icon.vertalign = "user_top"; + self.powerups[powerupindex].hud_elem_icon.color = ( 1, 1, 1 ); + self.powerups[powerupindex].hud_elem_icon.foreground = 1; + self.powerups[powerupindex].hud_elem_icon.hidewhendead = 0; + self.powerups[powerupindex].hud_elem_icon.hidewheninmenu = 1; + self.powerups[powerupindex].hud_elem_icon.hidewheninkillcam = 1; + self.powerups[powerupindex].hud_elem_icon.archived = 0; + self.powerups[powerupindex].hud_elem_icon.alpha = 1.0; + + if ( !wasinprematch && doanimation ) + self thread queuewagerpopup( self.powerups[powerupindex].displayname, 0, &"MP_BONUS_ACQUIRED" ); + + pulsetime = 0.5; + + if ( doanimation ) + { + self.powerups[powerupindex].hud_elem fadeovertime( pulsetime ); + self.powerups[powerupindex].hud_elem_icon scaleovertime( pulsetime, iconsize, iconsize ); + self.powerups[powerupindex].hud_elem_icon.width = iconsize; + self.powerups[powerupindex].hud_elem_icon.height = iconsize; + self.powerups[powerupindex].hud_elem_icon moveovertime( pulsetime ); + } + + self.powerups[powerupindex].hud_elem.alpha = 1.0; + self.powerups[powerupindex].hud_elem_icon.x = self.powerups[powerupindex].hud_elem.x - 5 - iconsize; + self.powerups[powerupindex].hud_elem_icon.y = powerupstarty - powerupspacing * powerupindex - iconsize / 2; + + if ( doanimation ) + wait( pulsetime ); + + if ( level.inprematchperiod ) + level waittill( "prematch_over" ); + else if ( doanimation ) + wait( pulsetime ); + + if ( wasinprematch && doanimation ) + self thread queuewagerpopup( self.powerups[powerupindex].displayname, 0, &"MP_BONUS_ACQUIRED" ); + + wait 1.5; + + for ( i = 0; i <= powerupindex; i++ ) + { + self.powerups[i].hud_elem fadeovertime( 0.25 ); + self.powerups[i].hud_elem.alpha = 0; + } + + wait 0.25; + + for ( i = 0; i <= powerupindex; i++ ) + { + self.powerups[i].hud_elem_icon moveovertime( 0.25 ); + self.powerups[i].hud_elem_icon.x = 0 - iconsize; + self.powerups[i].hud_elem_icon.horzalign = "user_right"; + } + + self.powerups[powerupindex].hud_elem_icon.animating = 0; } -clearpowerups() //checked changed to match cerberus output +clearpowerups() { - self notify( "clearing_powerups" ); - while ( isDefined( self.powerups ) && isDefined( self.powerups.size ) ) - { - for ( i = 0; i < self.powerups.size; i++ ) - { - if ( isDefined( self.powerups[ i ].hud_elem ) ) - { - self.powerups[ i ].hud_elem destroy(); - } - if ( isDefined( self.powerups[ i ].hud_elem_icon ) ) - { - self.powerups[ i ].hud_elem_icon destroy(); - } - } - } - self.powerups = []; + self notify( "clearing_powerups" ); + + if ( isdefined( self.powerups ) && isdefined( self.powerups.size ) ) + { + for ( i = 0; i < self.powerups.size; i++ ) + { + if ( isdefined( self.powerups[i].hud_elem ) ) + self.powerups[i].hud_elem destroy(); + + if ( isdefined( self.powerups[i].hud_elem_icon ) ) + self.powerups[i].hud_elem_icon destroy(); + } + } + + self.powerups = []; } -trackwagerweaponusage( name, incvalue, statname ) //checked matches cerberus output +trackwagerweaponusage( name, incvalue, statname ) { - if ( !isDefined( self.wagerweaponusage ) ) - { - self.wagerweaponusage = []; - } - if ( !isDefined( self.wagerweaponusage[ name ] ) ) - { - self.wagerweaponusage[ name ] = []; - } - if ( !isDefined( self.wagerweaponusage[ name ][ statname ] ) ) - { - self.wagerweaponusage[ name ][ statname ] = 0; - } - self.wagerweaponusage[ name ][ statname ] += incvalue; + if ( !isdefined( self.wagerweaponusage ) ) + self.wagerweaponusage = []; + + if ( !isdefined( self.wagerweaponusage[name] ) ) + self.wagerweaponusage[name] = []; + + if ( !isdefined( self.wagerweaponusage[name][statname] ) ) + self.wagerweaponusage[name][statname] = 0; + + self.wagerweaponusage[name][statname] += incvalue; } -gethighestwagerweaponusage( statname ) //checked partially changed to match cerberus output did not use continues in for loop see github for more info +gethighestwagerweaponusage( statname ) { - if ( !isDefined( self.wagerweaponusage ) ) - { - return undefined; - } - bestweapon = undefined; - highestvalue = 0; - wagerweaponsused = getarraykeys( self.wagerweaponusage ); - for ( i = 0; i < wagerweaponsused.size; i++ ) - { - weaponstats = self.wagerweaponusage[ wagerweaponsused[ i ] ]; - if ( !isDefined( weaponstats[ statname ] ) || !getbaseweaponitemindex( wagerweaponsused[ i ] ) ) - { - } - else if ( !isDefined( bestweapon ) || weaponstats[ statname ] > highestvalue ) - { - bestweapon = wagerweaponsused[ i ]; - highestvalue = weaponstats[ statname ]; - } - } - return bestweapon; + if ( !isdefined( self.wagerweaponusage ) ) + return undefined; + + bestweapon = undefined; + highestvalue = 0; + wagerweaponsused = getarraykeys( self.wagerweaponusage ); + + for ( i = 0; i < wagerweaponsused.size; i++ ) + { + weaponstats = self.wagerweaponusage[wagerweaponsused[i]]; + + if ( !isdefined( weaponstats[statname] ) || !getbaseweaponitemindex( wagerweaponsused[i] ) ) + { + continue; + continue; + } + + if ( !isdefined( bestweapon ) || weaponstats[statname] > highestvalue ) + { + bestweapon = wagerweaponsused[i]; + highestvalue = weaponstats[statname]; + } + } + + return bestweapon; } -setwagerafteractionreportstats() //checked changed to match beta dump +setwagerafteractionreportstats() { - topweapon = self gethighestwagerweaponusage( "kills" ); - topkills = 0; - if ( isDefined( topweapon ) ) - { - topkills = self.wagerweaponusage[ topweapon ][ "kills" ]; - } - else - { - topweapon = self gethighestwagerweaponusage( "timeUsed" ); - } - if ( !isDefined( topweapon ) ) - { - topweapon = ""; - } - self maps/mp/gametypes/_persistence::setafteractionreportstat( "topWeaponItemIndex", getbaseweaponitemindex( topweapon ) ); - self maps/mp/gametypes/_persistence::setafteractionreportstat( "topWeaponKills", topkills ); - if ( isDefined( level.onwagerawards ) ) - { - self [[ level.onwagerawards ]](); - } - else - { - for(i = 0; i < 3; i++) - { - self maps/mp/gametypes/_persistence::setafteractionreportstat( "wagerAwards", 0, i ); - } - } -} + topweapon = self gethighestwagerweaponusage( "kills" ); + topkills = 0; + if ( isdefined( topweapon ) ) + topkills = self.wagerweaponusage[topweapon]["kills"]; + else + topweapon = self gethighestwagerweaponusage( "timeUsed" ); + + if ( !isdefined( topweapon ) ) + topweapon = ""; + + self maps\mp\gametypes\_persistence::setafteractionreportstat( "topWeaponItemIndex", getbaseweaponitemindex( topweapon ) ); + self maps\mp\gametypes\_persistence::setafteractionreportstat( "topWeaponKills", topkills ); + + if ( isdefined( level.onwagerawards ) ) + self [[ level.onwagerawards ]](); + else + { + for ( i = 0; i < 3; i++ ) + self maps\mp\gametypes\_persistence::setafteractionreportstat( "wagerAwards", 0, i ); + } +} diff --git a/Multiplayer Core/patch_mp/maps/mp/gametypes/_weapon_utils.gsc b/Multiplayer Core/patch_mp/maps/mp/gametypes/_weapon_utils.gsc index d5dbc82..038403b 100644 --- a/Multiplayer Core/patch_mp/maps/mp/gametypes/_weapon_utils.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/gametypes/_weapon_utils.gsc @@ -1,120 +1,104 @@ -#include maps/mp/killstreaks/_killstreaks; -#include maps/mp/_utility; -#include common_scripts/utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool -isgrenadelauncherweapon( weapon ) //checked matches cerberus output +isgrenadelauncherweapon( weapon ) { - if ( getsubstr( weapon, 0, 3 ) == "gl_" ) - { - return 1; - } - switch( weapon ) - { - case "china_lake_mp": - case "xm25_mp": - return 1; - default: - return 0; - } + if ( getsubstr( weapon, 0, 3 ) == "gl_" ) + return true; + + switch ( weapon ) + { + case "xm25_mp": + case "china_lake_mp": + return true; + default: + return false; + } } -isdumbrocketlauncherweapon( weapon ) //checked matches cerberus output +isdumbrocketlauncherweapon( weapon ) { - switch( weapon ) - { - case "m220_tow_mp": - case "rpg_mp": - return 1; - default: - return 0; - } + switch ( weapon ) + { + case "rpg_mp": + case "m220_tow_mp": + return true; + default: + return false; + } } -isguidedrocketlauncherweapon( weapon ) //checked matches cerberus output +isguidedrocketlauncherweapon( weapon ) { - switch( weapon ) - { - case "fhj18_mp": - case "javelin_mp": - case "m202_flash_mp": - case "m72_law_mp": - case "smaw_mp": - return 1; - default: - return 0; - } + switch ( weapon ) + { + case "smaw_mp": + case "m72_law_mp": + case "m202_flash_mp": + case "javelin_mp": + case "fhj18_mp": + return true; + default: + return false; + } } -isrocketlauncherweapon( weapon ) //checked matches cerberus output +isrocketlauncherweapon( weapon ) { - if ( isdumbrocketlauncherweapon( weapon ) ) - { - return 1; - } - if ( isguidedrocketlauncherweapon( weapon ) ) - { - return 1; - } - return 0; + if ( isdumbrocketlauncherweapon( weapon ) ) + return true; + + if ( isguidedrocketlauncherweapon( weapon ) ) + return true; + + return false; } -islauncherweapon( weapon ) //checked matches cerberus output +islauncherweapon( weapon ) { - if ( isrocketlauncherweapon( weapon ) ) - { - return 1; - } - if ( isgrenadelauncherweapon( weapon ) ) - { - return 1; - } - return 0; + if ( isrocketlauncherweapon( weapon ) ) + return true; + + if ( isgrenadelauncherweapon( weapon ) ) + return true; + + return false; } -ishackweapon( weapon ) //checked matches cerberus output +ishackweapon( weapon ) { - if ( maps/mp/killstreaks/_killstreaks::iskillstreakweapon( weapon ) ) - { - return 1; - } - if ( weapon == "briefcase_bomb_mp" ) - { - return 1; - } - return 0; + if ( maps\mp\killstreaks\_killstreaks::iskillstreakweapon( weapon ) ) + return true; + + if ( weapon == "briefcase_bomb_mp" ) + return true; + + return false; } -ispistol( weapon ) //checked changed at own discretion +ispistol( weapon ) { - if ( isDefined( level.side_arm_array[ weapon ] ) ) - { - return 1; - } - return 0; + return isdefined( level.side_arm_array[weapon] ); } -isflashorstunweapon( weapon ) //checked matches cerberus output +isflashorstunweapon( weapon ) { - if ( isDefined( weapon ) ) - { - switch( weapon ) - { - case "concussion_grenade_mp": - case "flash_grenade_mp": - case "proximity_grenade_aoe_mp": - case "proximity_grenade_mp": - return 1; - } - } - return 0; + if ( isdefined( weapon ) ) + { + switch ( weapon ) + { + case "proximity_grenade_mp": + case "proximity_grenade_aoe_mp": + case "flash_grenade_mp": + case "concussion_grenade_mp": + return true; + } + } + + return false; } -isflashorstundamage( weapon, meansofdeath ) //checked changed at own discretion +isflashorstundamage( weapon, meansofdeath ) { - if ( ( meansofdeath == "MOD_GAS" || meansofdeath == "MOD_GRENADE_SPLASH" ) && isflashorstunweapon( weapon ) ) - { - return 1; - } - return 0; + return isflashorstunweapon( weapon ) && ( meansofdeath == "MOD_GRENADE_SPLASH" || meansofdeath == "MOD_GAS" ); } - diff --git a/Multiplayer Core/patch_mp/maps/mp/gametypes/_weaponobjects.gsc b/Multiplayer Core/patch_mp/maps/mp/gametypes/_weaponobjects.gsc index cf4f957..e48d1c3 100644 --- a/Multiplayer Core/patch_mp/maps/mp/gametypes/_weaponobjects.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/gametypes/_weaponobjects.gsc @@ -1,2563 +1,2380 @@ -//checked includes match cerberus output -#include maps/mp/gametypes/_dev; -#include maps/mp/_vehicles; -#include maps/mp/gametypes/_globallogic_audio; -#include maps/mp/_entityheadicons; -#include maps/mp/gametypes/_damagefeedback; -#include maps/mp/gametypes/_globallogic_player; -#include maps/mp/_scrambler; -#include maps/mp/gametypes/_weaponobjects; -#include maps/mp/_scoreevents; -#include maps/mp/_challenges; -#include maps/mp/killstreaks/_emp; -#include maps/mp/killstreaks/_qrdrone; -#include maps/mp/killstreaks/_rcbomb; -#include maps/mp/_ballistic_knife; -#include maps/mp/_sensor_grenade; -#include maps/mp/_trophy_system; -#include maps/mp/_bouncingbetty; -#include maps/mp/_proximity_grenade; -#include maps/mp/_satchel_charge; -#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 -init() //checked matches cerberus output +init() { - /* /# - debug = weapons_get_dvar_int( "scr_weaponobject_debug", "0" ); + debug = weapons_get_dvar_int( "scr_weaponobject_debug", "0" ); #/ - */ - coneangle = weapons_get_dvar_int( "scr_weaponobject_coneangle", "70" ); - mindist = weapons_get_dvar_int( "scr_weaponobject_mindist", "20" ); - graceperiod = weapons_get_dvar( "scr_weaponobject_graceperiod", "0.6" ); - radius = weapons_get_dvar_int( "scr_weaponobject_radius", "192" ); - level thread onplayerconnect(); - level.watcherweapons = []; - level.watcherweapons = getwatcherweapons(); - level.watcherweaponnames = []; - level.watcherweaponnames = getwatchernames( level.watcherweapons ); - level.retrievableweapons = []; - level.retrievableweapons = getretrievableweapons(); - level.retrievableweaponnames = []; - level.retrievableweaponnames = getwatchernames( level.retrievableweapons ); - level.weaponobjects_headicon_offset = []; - level.weaponobjects_headicon_offset[ "default" ] = vectorScale( ( 0, 0, 1 ), 20 ); - level.weaponobjectexplodethisframe = 0; - if ( getDvar( "scr_deleteexplosivesonspawn" ) == "" ) - { - setdvar( "scr_deleteexplosivesonspawn", 1 ); - } - level.deleteexplosivesonspawn = getDvarInt( "scr_deleteexplosivesonspawn" ); - if ( sessionmodeiszombiesgame() ) - { - return; - } - precachestring( &"MP_DEFUSING_EXPLOSIVE" ); - level.claymorefxid = loadfx( "weapon/claymore/fx_claymore_laser" ); - level._equipment_spark_fx = loadfx( "weapon/grenade/fx_spark_disabled_weapon" ); - level._equipment_emp_destroy_fx = loadfx( "weapon/emp/fx_emp_explosion_equip" ); - level._equipment_explode_fx = loadfx( "explosions/fx_exp_equipment" ); - level._equipment_explode_fx_lg = loadfx( "explosions/fx_exp_equipment_lg" ); - level._effect[ "powerLight" ] = loadfx( "weapon/crossbow/fx_trail_crossbow_blink_red_os" ); - setupretrievablehintstrings(); - level.weaponobjects_headicon_offset[ "acoustic_sensor_mp" ] = vectorScale( ( 0, 0, 1 ), 25 ); - level.weaponobjects_headicon_offset[ "sensor_grenade_mp" ] = vectorScale( ( 0, 0, 1 ), 25 ); - level.weaponobjects_headicon_offset[ "camera_spike_mp" ] = vectorScale( ( 0, 0, 1 ), 35 ); - level.weaponobjects_headicon_offset[ "claymore_mp" ] = vectorScale( ( 0, 0, 1 ), 20 ); - level.weaponobjects_headicon_offset[ "bouncingbetty_mp" ] = vectorScale( ( 0, 0, 1 ), 20 ); - level.weaponobjects_headicon_offset[ "satchel_charge_mp" ] = vectorScale( ( 0, 0, 1 ), 10 ); - level.weaponobjects_headicon_offset[ "scrambler_mp" ] = vectorScale( ( 0, 0, 1 ), 20 ); - level.weaponobjects_headicon_offset[ "trophy_system_mp" ] = vectorScale( ( 0, 0, 1 ), 35 ); - level.weaponobjects_hacker_trigger_width = 32; - level.weaponobjects_hacker_trigger_height = 32; + coneangle = weapons_get_dvar_int( "scr_weaponobject_coneangle", "70" ); + mindist = weapons_get_dvar_int( "scr_weaponobject_mindist", "20" ); + graceperiod = weapons_get_dvar( "scr_weaponobject_graceperiod", "0.6" ); + radius = weapons_get_dvar_int( "scr_weaponobject_radius", "192" ); + level thread onplayerconnect(); + level.watcherweapons = []; + level.watcherweapons = getwatcherweapons(); + level.watcherweaponnames = []; + level.watcherweaponnames = getwatchernames( level.watcherweapons ); + level.retrievableweapons = []; + level.retrievableweapons = getretrievableweapons(); + level.retrievableweaponnames = []; + level.retrievableweaponnames = getwatchernames( level.retrievableweapons ); + level.weaponobjects_headicon_offset = []; + level.weaponobjects_headicon_offset["default"] = vectorscale( ( 0, 0, 1 ), 20.0 ); + level.weaponobjectexplodethisframe = 0; + + if ( getdvar( "scr_deleteexplosivesonspawn" ) == "" ) + setdvar( "scr_deleteexplosivesonspawn", 1 ); + + level.deleteexplosivesonspawn = getdvarint( "scr_deleteexplosivesonspawn" ); + + if ( sessionmodeiszombiesgame() ) + return; + + precachestring( &"MP_DEFUSING_EXPLOSIVE" ); + level.claymorefxid = loadfx( "weapon/claymore/fx_claymore_laser" ); + level._equipment_spark_fx = loadfx( "weapon/grenade/fx_spark_disabled_weapon" ); + level._equipment_emp_destroy_fx = loadfx( "weapon/emp/fx_emp_explosion_equip" ); + level._equipment_explode_fx = loadfx( "explosions/fx_exp_equipment" ); + level._equipment_explode_fx_lg = loadfx( "explosions/fx_exp_equipment_lg" ); + level._effect["powerLight"] = loadfx( "weapon/crossbow/fx_trail_crossbow_blink_red_os" ); + setupretrievablehintstrings(); + level.weaponobjects_headicon_offset["acoustic_sensor_mp"] = vectorscale( ( 0, 0, 1 ), 25.0 ); + level.weaponobjects_headicon_offset["sensor_grenade_mp"] = vectorscale( ( 0, 0, 1 ), 25.0 ); + level.weaponobjects_headicon_offset["camera_spike_mp"] = vectorscale( ( 0, 0, 1 ), 35.0 ); + level.weaponobjects_headicon_offset["claymore_mp"] = vectorscale( ( 0, 0, 1 ), 20.0 ); + level.weaponobjects_headicon_offset["bouncingbetty_mp"] = vectorscale( ( 0, 0, 1 ), 20.0 ); + level.weaponobjects_headicon_offset["satchel_charge_mp"] = vectorscale( ( 0, 0, 1 ), 10.0 ); + level.weaponobjects_headicon_offset["scrambler_mp"] = vectorscale( ( 0, 0, 1 ), 20.0 ); + level.weaponobjects_headicon_offset["trophy_system_mp"] = vectorscale( ( 0, 0, 1 ), 35.0 ); + level.weaponobjects_hacker_trigger_width = 32; + level.weaponobjects_hacker_trigger_height = 32; } -getwatchernames( weapons ) //checked changed to match cerberus output +getwatchernames( weapons ) { - names = []; - foreach ( weapon in weapons ) - { - names[ index ] = getsubstr( weapon, 0, weapon.size - 3 ); - } - return names; + names = []; + + foreach ( index, weapon in weapons ) + names[index] = getsubstr( weapon, 0, weapon.size - 3 ); + + return names; } -weapons_get_dvar_int( dvar, def ) //checked matches cerberus output +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 ) //checked matches cerberus output +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; + } } -setupretrievablehintstrings() //checked matches cerberus output +setupretrievablehintstrings() { - createretrievablehint( "hatchet", &"MP_HATCHET_PICKUP" ); - createretrievablehint( "claymore", &"MP_CLAYMORE_PICKUP" ); - createretrievablehint( "bouncingbetty", &"MP_BOUNCINGBETTY_PICKUP" ); - createretrievablehint( "trophy_system", &"MP_TROPHY_SYSTEM_PICKUP" ); - createretrievablehint( "acoustic_sensor", &"MP_ACOUSTIC_SENSOR_PICKUP" ); - createretrievablehint( "camera_spike", &"MP_CAMERA_SPIKE_PICKUP" ); - createretrievablehint( "satchel_charge", &"MP_SATCHEL_CHARGE_PICKUP" ); - createretrievablehint( "scrambler", &"MP_SCRAMBLER_PICKUP" ); - createretrievablehint( "proximity_grenade", &"MP_SHOCK_CHARGE_PICKUP" ); - createdestroyhint( "trophy_system", &"MP_TROPHY_SYSTEM_DESTROY" ); - createdestroyhint( "sensor_grenade", &"MP_SENSOR_GRENADE_DESTROY" ); - createhackerhint( "claymore_mp", &"MP_CLAYMORE_HACKING" ); - createhackerhint( "bouncingbetty_mp", &"MP_BOUNCINGBETTY_HACKING" ); - createhackerhint( "trophy_system_mp", &"MP_TROPHY_SYSTEM_HACKING" ); - createhackerhint( "acoustic_sensor_mp", &"MP_ACOUSTIC_SENSOR_HACKING" ); - createhackerhint( "camera_spike_mp", &"MP_CAMERA_SPIKE_HACKING" ); - createhackerhint( "satchel_charge_mp", &"MP_SATCHEL_CHARGE_HACKING" ); - createhackerhint( "scrambler_mp", &"MP_SCRAMBLER_HACKING" ); + createretrievablehint( "hatchet", &"MP_HATCHET_PICKUP" ); + createretrievablehint( "claymore", &"MP_CLAYMORE_PICKUP" ); + createretrievablehint( "bouncingbetty", &"MP_BOUNCINGBETTY_PICKUP" ); + createretrievablehint( "trophy_system", &"MP_TROPHY_SYSTEM_PICKUP" ); + createretrievablehint( "acoustic_sensor", &"MP_ACOUSTIC_SENSOR_PICKUP" ); + createretrievablehint( "camera_spike", &"MP_CAMERA_SPIKE_PICKUP" ); + createretrievablehint( "satchel_charge", &"MP_SATCHEL_CHARGE_PICKUP" ); + createretrievablehint( "scrambler", &"MP_SCRAMBLER_PICKUP" ); + createretrievablehint( "proximity_grenade", &"MP_SHOCK_CHARGE_PICKUP" ); + createdestroyhint( "trophy_system", &"MP_TROPHY_SYSTEM_DESTROY" ); + createdestroyhint( "sensor_grenade", &"MP_SENSOR_GRENADE_DESTROY" ); + createhackerhint( "claymore_mp", &"MP_CLAYMORE_HACKING" ); + createhackerhint( "bouncingbetty_mp", &"MP_BOUNCINGBETTY_HACKING" ); + createhackerhint( "trophy_system_mp", &"MP_TROPHY_SYSTEM_HACKING" ); + createhackerhint( "acoustic_sensor_mp", &"MP_ACOUSTIC_SENSOR_HACKING" ); + createhackerhint( "camera_spike_mp", &"MP_CAMERA_SPIKE_HACKING" ); + createhackerhint( "satchel_charge_mp", &"MP_SATCHEL_CHARGE_HACKING" ); + createhackerhint( "scrambler_mp", &"MP_SCRAMBLER_HACKING" ); } -onplayerconnect() //checked matches cerberus output +onplayerconnect() { - if ( isDefined( level._weaponobjects_on_player_connect_override ) ) - { - level thread [[ level._weaponobjects_on_player_connect_override ]](); - return; - } - for ( ;; ) - { - level waittill( "connecting", player ); - player.usedweapons = 0; - player.hits = 0; - player thread onplayerspawned(); - } + if ( isdefined( level._weaponobjects_on_player_connect_override ) ) + { + level thread [[ level._weaponobjects_on_player_connect_override ]](); + return; + } + + for (;;) + { + level waittill( "connecting", player ); + + player.usedweapons = 0; + player.hits = 0; + player thread onplayerspawned(); + } } -onplayerspawned() //checked matches cerberus output +onplayerspawned() { - self endon( "disconnect" ); - for ( ;; ) - { - self waittill( "spawned_player" ); - pixbeginevent( "onPlayerSpawned" ); - if ( !isDefined( self.watchersinitialized ) ) - { - self createbasewatchers(); - self maps/mp/_satchel_charge::createsatchelwatcher(); - self maps/mp/_proximity_grenade::createproximitygrenadewatcher(); - self maps/mp/_bouncingbetty::createbouncingbettywatcher(); - self maps/mp/_trophy_system::createtrophysystemwatcher(); - self maps/mp/_sensor_grenade::createsensorgrenadewatcher(); - self createclaymorewatcher(); - self creatercbombwatcher(); - self createqrdronewatcher(); - self createplayerhelicopterwatcher(); - self createballisticknifewatcher(); - self createhatchetwatcher(); - self createtactinsertwatcher(); - self setupretrievablewatcher(); - self thread watchweaponobjectusage(); - self.watchersinitialized = 1; - } - self resetwatchers(); - pixendevent(); - } + self endon( "disconnect" ); + + for (;;) + { + self waittill( "spawned_player" ); + + pixbeginevent( "onPlayerSpawned" ); + + if ( !isdefined( self.watchersinitialized ) ) + { + self createbasewatchers(); + self maps\mp\_satchel_charge::createsatchelwatcher(); + self maps\mp\_proximity_grenade::createproximitygrenadewatcher(); + self maps\mp\_bouncingbetty::createbouncingbettywatcher(); + self maps\mp\_trophy_system::createtrophysystemwatcher(); + self maps\mp\_sensor_grenade::createsensorgrenadewatcher(); + self createclaymorewatcher(); + self creatercbombwatcher(); + self createqrdronewatcher(); + self createplayerhelicopterwatcher(); + self createballisticknifewatcher(); + self createhatchetwatcher(); + self createtactinsertwatcher(); + self setupretrievablewatcher(); + self thread watchweaponobjectusage(); + self.watchersinitialized = 1; + } + + self resetwatchers(); + pixendevent(); + } } -resetwatchers() //checked changed to match cerberus output +resetwatchers() { - if ( !isDefined( self.weaponobjectwatcherarray ) ) - { - return undefined; - } - team = self.team; - foreach ( watcher in self.weaponobjectwatcherarray ) - { - resetweaponobjectwatcher( watcher, team ); - } + if ( !isdefined( self.weaponobjectwatcherarray ) ) + return undefined; + + team = self.team; + + foreach ( watcher in self.weaponobjectwatcherarray ) + resetweaponobjectwatcher( watcher, team ); } -createbasewatchers() //checked changed to match cerberus output +createbasewatchers() { - foreach ( weapon in level.watcherweapons ) - { - self createweaponobjectwatcher( level.watcherweaponnames[ index ], weapon, self.team ); - } - foreach ( weapon in level.retrievableweapons ) - { - self createweaponobjectwatcher( level.retrievableweaponnames[ index ], weapon, self.team ); - } + foreach ( index, weapon in level.watcherweapons ) + self createweaponobjectwatcher( level.watcherweaponnames[index], weapon, self.team ); + + foreach ( index, weapon in level.retrievableweapons ) + self createweaponobjectwatcher( level.retrievableweaponnames[index], weapon, self.team ); } -setupretrievablewatcher() //checked changed to match cerberus output +setupretrievablewatcher() { - for ( i = 0; i < level.retrievableweapons.size; i++ ) - { - watcher = getweaponobjectwatcherbyweapon( level.retrievableweapons[ i ] ); - if ( !isDefined( watcher.onspawnretrievetriggers ) ) - { - watcher.onspawnretrievetriggers = ::onspawnretrievableweaponobject; - } - if ( !isDefined( watcher.ondestroyed ) ) - { - watcher.ondestroyed = ::ondestroyed; - } - if ( !isDefined( watcher.pickup ) ) - { - watcher.pickup = ::pickup; - } - } + for ( i = 0; i < level.retrievableweapons.size; i++ ) + { + watcher = getweaponobjectwatcherbyweapon( level.retrievableweapons[i] ); + + if ( !isdefined( watcher.onspawnretrievetriggers ) ) + watcher.onspawnretrievetriggers = ::onspawnretrievableweaponobject; + + if ( !isdefined( watcher.ondestroyed ) ) + watcher.ondestroyed = ::ondestroyed; + + if ( !isdefined( watcher.pickup ) ) + watcher.pickup = ::pickup; + } } -createballisticknifewatcher() //checked matches cerberus output +createballisticknifewatcher() { - watcher = self createuseweaponobjectwatcher( "knife_ballistic", "knife_ballistic_mp", self.team ); - watcher.onspawn = maps/mp/_ballistic_knife::onspawn; - watcher.detonate = ::deleteent; - watcher.onspawnretrievetriggers = maps/mp/_ballistic_knife::onspawnretrievetrigger; - watcher.storedifferentobject = 1; + watcher = self createuseweaponobjectwatcher( "knife_ballistic", "knife_ballistic_mp", self.team ); + watcher.onspawn = maps\mp\_ballistic_knife::onspawn; + watcher.detonate = ::deleteent; + watcher.onspawnretrievetriggers = maps\mp\_ballistic_knife::onspawnretrievetrigger; + watcher.storedifferentobject = 1; } -createhatchetwatcher() //checked matches cerberus output +createhatchetwatcher() { - watcher = self createuseweaponobjectwatcher( "hatchet", "hatchet_mp", self.team ); - watcher.detonate = ::deleteent; - watcher.onspawn = ::voidonspawn; - watcher.ondamage = ::voidondamage; - watcher.onspawnretrievetriggers = ::onspawnhatchettrigger; + watcher = self createuseweaponobjectwatcher( "hatchet", "hatchet_mp", self.team ); + watcher.detonate = ::deleteent; + watcher.onspawn = ::voidonspawn; + watcher.ondamage = ::voidondamage; + watcher.onspawnretrievetriggers = ::onspawnhatchettrigger; } -createtactinsertwatcher() //checked matches cerberus output +createtactinsertwatcher() { - watcher = self createuseweaponobjectwatcher( "tactical_insertion", "tactical_insertion_mp", self.team ); - watcher.playdestroyeddialog = 0; + watcher = self createuseweaponobjectwatcher( "tactical_insertion", "tactical_insertion_mp", self.team ); + watcher.playdestroyeddialog = 0; } -creatercbombwatcher() //checked matches cerberus output +creatercbombwatcher() { - watcher = self createuseweaponobjectwatcher( "rcbomb", "rcbomb_mp", self.team ); - watcher.altdetonate = 0; - watcher.headicon = 0; - watcher.ismovable = 1; - watcher.ownergetsassist = 1; - watcher.playdestroyeddialog = 0; - watcher.deleteonkillbrush = 0; - watcher.detonate = maps/mp/killstreaks/_rcbomb::blowup; - watcher.stuntime = 1; + watcher = self createuseweaponobjectwatcher( "rcbomb", "rcbomb_mp", self.team ); + watcher.altdetonate = 0; + watcher.headicon = 0; + watcher.ismovable = 1; + watcher.ownergetsassist = 1; + watcher.playdestroyeddialog = 0; + watcher.deleteonkillbrush = 0; + watcher.detonate = maps\mp\killstreaks\_rcbomb::blowup; + watcher.stuntime = 1; } -createqrdronewatcher() //checked matches cerberus output +createqrdronewatcher() { - watcher = self createuseweaponobjectwatcher( "qrdrone", "qrdrone_turret_mp", self.team ); - watcher.altdetonate = 0; - watcher.headicon = 0; - watcher.ismovable = 1; - watcher.ownergetsassist = 1; - watcher.playdestroyeddialog = 0; - watcher.deleteonkillbrush = 0; - watcher.detonate = maps/mp/killstreaks/_qrdrone::qrdrone_blowup; - watcher.ondamage = maps/mp/killstreaks/_qrdrone::qrdrone_damagewatcher; - watcher.stuntime = 5; + watcher = self createuseweaponobjectwatcher( "qrdrone", "qrdrone_turret_mp", self.team ); + watcher.altdetonate = 0; + watcher.headicon = 0; + watcher.ismovable = 1; + watcher.ownergetsassist = 1; + watcher.playdestroyeddialog = 0; + watcher.deleteonkillbrush = 0; + watcher.detonate = maps\mp\killstreaks\_qrdrone::qrdrone_blowup; + watcher.ondamage = maps\mp\killstreaks\_qrdrone::qrdrone_damagewatcher; + watcher.stuntime = 5; } -createplayerhelicopterwatcher() //checked matches cerberus output +createplayerhelicopterwatcher() { - watcher = self createuseweaponobjectwatcher( "helicopter_player", "helicopter_player_mp", self.team ); - watcher.altdetonate = 1; - watcher.headicon = 0; + watcher = self createuseweaponobjectwatcher( "helicopter_player", "helicopter_player_mp", self.team ); + watcher.altdetonate = 1; + watcher.headicon = 0; } -createclaymorewatcher() //checked matches cerberus output +createclaymorewatcher() { - watcher = self createproximityweaponobjectwatcher( "claymore", "claymore_mp", self.team ); - watcher.watchforfire = 1; - watcher.detonate = ::claymoredetonate; - watcher.activatesound = "wpn_claymore_alert"; - watcher.hackable = 1; - watcher.hackertoolradius = level.equipmenthackertoolradius; - watcher.hackertooltimems = level.equipmenthackertooltimems; - watcher.reconmodel = "t6_wpn_claymore_world_detect"; - watcher.ownergetsassist = 1; - detectionconeangle = weapons_get_dvar_int( "scr_weaponobject_coneangle" ); - watcher.detectiondot = cos( detectionconeangle ); - watcher.detectionmindist = weapons_get_dvar_int( "scr_weaponobject_mindist" ); - watcher.detectiongraceperiod = weapons_get_dvar( "scr_weaponobject_graceperiod" ); - watcher.detonateradius = weapons_get_dvar_int( "scr_weaponobject_radius" ); - watcher.stun = ::weaponstun; - watcher.stuntime = 1; + watcher = self createproximityweaponobjectwatcher( "claymore", "claymore_mp", self.team ); + watcher.watchforfire = 1; + watcher.detonate = ::claymoredetonate; + watcher.activatesound = "wpn_claymore_alert"; + watcher.hackable = 1; + watcher.hackertoolradius = level.equipmenthackertoolradius; + watcher.hackertooltimems = level.equipmenthackertooltimems; + watcher.reconmodel = "t6_wpn_claymore_world_detect"; + watcher.ownergetsassist = 1; + detectionconeangle = weapons_get_dvar_int( "scr_weaponobject_coneangle" ); + watcher.detectiondot = cos( detectionconeangle ); + watcher.detectionmindist = weapons_get_dvar_int( "scr_weaponobject_mindist" ); + watcher.detectiongraceperiod = weapons_get_dvar( "scr_weaponobject_graceperiod" ); + watcher.detonateradius = weapons_get_dvar_int( "scr_weaponobject_radius" ); + watcher.stun = ::weaponstun; + watcher.stuntime = 1; } -waittillnotmoving_and_notstunned() //checked changed to match cerberus output +waittillnotmoving_and_notstunned() { - prevorigin = self.origin; - while ( 1 ) - { - wait 0.15; - if ( self.origin == prevorigin && !self isstunned() ) - { - break; - } - prevorigin = self.origin; - } + for ( prevorigin = self.origin; 1; prevorigin = self.origin ) + { + wait 0.15; + + if ( self.origin == prevorigin && !self isstunned() ) + break; + } } -voidonspawn( unused0, unused1 ) //checked matches cerberus output +voidonspawn( unused0, unused1 ) { + } -voidondamage( unused0 ) //checked matches cerberus output +voidondamage( unused0 ) { + } -deleteent( attacker, emp ) //checked matches cerberus output +deleteent( attacker, emp ) { - self delete(); + self delete(); } -clearfxondeath( fx ) //checked matches cerberus output +clearfxondeath( fx ) { - fx endon( "death" ); - self waittill_any( "death", "hacked" ); - fx delete(); + fx endon( "death" ); + self waittill_any( "death", "hacked" ); + fx delete(); } -deleteweaponobjectarray() //checked changed to match cerberus output +deleteweaponobjectarray() { - if ( isDefined( self.objectarray ) ) - { - for ( i = 0; i < self.objectarray.size; i++ ) - { - if ( isDefined( self.objectarray[ i ] ) ) - { - if ( isDefined( self.objectarray[ i ].minemover ) ) - { - if ( isDefined( self.objectarray[ i ].minemover.killcament ) ) - { - self.objectarray[ i ].minemover.killcament delete(); - } - self.objectarray[ i ].minemover delete(); - } - self.objectarray[ i ] delete(); - } - } - } - self.objectarray = []; + if ( isdefined( self.objectarray ) ) + { + for ( i = 0; i < self.objectarray.size; i++ ) + { + if ( isdefined( self.objectarray[i] ) ) + { + if ( isdefined( self.objectarray[i].minemover ) ) + { + if ( isdefined( self.objectarray[i].minemover.killcament ) ) + self.objectarray[i].minemover.killcament delete(); + + self.objectarray[i].minemover delete(); + } + + self.objectarray[i] delete(); + } + } + } + + self.objectarray = []; } -claymoredetonate( attacker, weaponname ) //checked matches cerberus output +claymoredetonate( 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_claymore", 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_claymore", attacker, self.owner, weaponname ); + } + } + } + + maps\mp\gametypes\_weaponobjects::weapondetonate( attacker, weaponname ); } -weapondetonate( attacker, weaponname ) //checked matches cerberus output +weapondetonate( attacker, weaponname ) { - from_emp = maps/mp/killstreaks/_emp::isempweapon( weaponname ); - if ( from_emp ) - { - self delete(); - return; - } - if ( isDefined( attacker ) ) - { - if ( isDefined( self.owner ) && attacker != self.owner ) - { - self.playdialog = 1; - } - if ( isplayer( attacker ) ) - { - self detonate( attacker ); - } - else - { - self detonate(); - } - } - else if ( isDefined( self.owner ) && isplayer( self.owner ) ) - { - self.playdialog = 0; - self detonate( self.owner ); - } - else - { - self detonate(); - } + from_emp = maps\mp\killstreaks\_emp::isempweapon( weaponname ); + + if ( from_emp ) + { + self delete(); + return; + } + + if ( isdefined( attacker ) ) + { + if ( isdefined( self.owner ) && attacker != self.owner ) + self.playdialog = 1; + + if ( isplayer( attacker ) ) + self detonate( attacker ); + else + self detonate(); + } + else if ( isdefined( self.owner ) && isplayer( self.owner ) ) + { + self.playdialog = 0; + self detonate( self.owner ); + } + else + self detonate(); } -waitanddetonate( object, delay, attacker, weaponname ) //checked changed to match cerberus output +waitanddetonate( object, delay, attacker, weaponname ) { - object endon( "death" ); - object endon( "hacked" ); - from_emp = maps/mp/killstreaks/_emp::isempweapon( weaponname ); - if ( from_emp && !( isDefined( object.name ) && object.name == "qrdrone_turret_mp" ) ) - { - object setclientflag( 15 ); - object setclientflag( 9 ); - object.stun_fx = 1; - playfx( level._equipment_emp_destroy_fx, object.origin + vectorScale( ( 0, 0, 1 ), 5 ), ( 0, randomfloat( 360 ), 0 ) ); - delay = 1.1; - } - if ( delay ) - { - wait delay; - } - if ( isDefined( object.detonated ) && object.detonated == 1 ) - { - return; - } - if ( !isDefined( self.detonate ) ) - { - return; - } - if ( isDefined( attacker ) && isplayer( attacker ) && isDefined( attacker.pers[ "team" ] ) && isDefined( object.owner ) && isDefined( object.owner.pers[ "team" ] ) ) - { - if ( level.teambased ) - { - if ( attacker.pers[ "team" ] != object.owner.pers[ "team" ] ) - { - attacker notify( "destroyed_explosive" ); - } - } - else if ( attacker != object.owner ) - { - attacker notify( "destroyed_explosive" ); - } - } - object.detonated = 1; - object [[ self.detonate ]]( attacker, weaponname ); + object endon( "death" ); + object endon( "hacked" ); + from_emp = maps\mp\killstreaks\_emp::isempweapon( weaponname ); + + if ( from_emp && !( isdefined( object.name ) && object.name == "qrdrone_turret_mp" ) ) + { + object setclientflag( 15 ); + object setclientflag( 9 ); + object.stun_fx = 1; + playfx( level._equipment_emp_destroy_fx, object.origin + vectorscale( ( 0, 0, 1 ), 5.0 ), ( 0, randomfloat( 360 ), 0 ) ); + delay = 1.1; + } + + if ( delay ) + wait( delay ); + + if ( isdefined( object.detonated ) && object.detonated == 1 ) + return; + + if ( !isdefined( self.detonate ) ) + return; + + if ( isdefined( attacker ) && isplayer( attacker ) && isdefined( attacker.pers["team"] ) && isdefined( object.owner ) && isdefined( object.owner.pers["team"] ) ) + { + if ( level.teambased ) + { + if ( attacker.pers["team"] != object.owner.pers["team"] ) + attacker notify( "destroyed_explosive" ); + } + else if ( attacker != object.owner ) + attacker notify( "destroyed_explosive" ); + } + + object.detonated = 1; + object [[ self.detonate ]]( attacker, weaponname ); } -detonateweaponobjectarray( forcedetonation, weapon ) //checked partially changed to match cerberus output see info.md +detonateweaponobjectarray( forcedetonation, weapon ) { - undetonated = []; - if ( isDefined( self.objectarray ) ) - { - i = 0; - while ( i < self.objectarray.size ) - { - if ( isDefined( self.objectarray[ i ] ) ) - { - if ( self.objectarray[ i ] isstunned() && forcedetonation == 0 ) - { - undetonated[ undetonated.size ] = self.objectarray[ i ]; - i++; - continue; - } - if ( isDefined( weapon ) ) - { - if ( weapon ishacked() && weapon.name != self.objectarray[ i ].name ) - { - undetonated[ undetonated.size ] = self.objectarray[ i ]; - i++; - continue; - } - else if ( self.objectarray[ i ] ishacked() && weapon.name != self.objectarray[ i ].name ) - { - undetonated[ undetonated.size ] = self.objectarray[ i ]; - i++; - continue; - } - } - self thread waitanddetonate( self.objectarray[ i ], 0,1, undefined, weapon ); - } - i++; - } - } - self.objectarray = undetonated; + undetonated = []; + + if ( isdefined( self.objectarray ) ) + { + for ( i = 0; i < self.objectarray.size; i++ ) + { + if ( isdefined( self.objectarray[i] ) ) + { + if ( self.objectarray[i] isstunned() && forcedetonation == 0 ) + { + undetonated[undetonated.size] = self.objectarray[i]; + continue; + } + + if ( isdefined( weapon ) ) + { + if ( weapon ishacked() && weapon.name != self.objectarray[i].name ) + { + undetonated[undetonated.size] = self.objectarray[i]; + continue; + } + else if ( self.objectarray[i] ishacked() && weapon.name != self.objectarray[i].name ) + { + undetonated[undetonated.size] = self.objectarray[i]; + continue; + } + } + + self thread waitanddetonate( self.objectarray[i], 0.1, undefined, weapon ); + } + } + } + + self.objectarray = undetonated; } -addweaponobjecttowatcher( watchername, weapon ) //checked matches cerberus output +addweaponobjecttowatcher( watchername, weapon ) { - watcher = getweaponobjectwatcher( watchername ); - /* + watcher = getweaponobjectwatcher( watchername ); /# - assert( isDefined( watcher ), "Weapon object watcher " + watchername + " does not exist" ); + assert( isdefined( watcher ), "Weapon object watcher " + watchername + " does not exist" ); #/ - */ - self addweaponobject( watcher, weapon ); + self addweaponobject( watcher, weapon ); } -addweaponobject( watcher, weapon ) //checked matches cerberus output +addweaponobject( watcher, weapon ) { - if ( !isDefined( watcher.storedifferentobject ) ) - { - watcher.objectarray[ watcher.objectarray.size ] = weapon; - } - weapon.owner = self; - weapon.detonated = 0; - weapon.name = watcher.weapon; - if ( isDefined( watcher.ondamage ) ) - { - weapon thread [[ watcher.ondamage ]]( watcher ); - } - else - { - weapon thread weaponobjectdamage( watcher ); - } - weapon.ownergetsassist = watcher.ownergetsassist; - if ( isDefined( watcher.onspawn ) ) - { - weapon thread [[ watcher.onspawn ]]( watcher, self ); - } - if ( isDefined( watcher.onspawnfx ) ) - { - weapon thread [[ watcher.onspawnfx ]](); - } - if ( isDefined( watcher.reconmodel ) ) - { - weapon thread attachreconmodel( watcher.reconmodel, self ); - } - if ( isDefined( watcher.onspawnretrievetriggers ) ) - { - weapon thread [[ watcher.onspawnretrievetriggers ]]( watcher, self ); - } - if ( watcher.hackable ) - { - weapon thread hackerinit( watcher ); - } - if ( isDefined( watcher.stun ) ) - { - weapon thread watchscramble( watcher ); - } - if ( watcher.playdestroyeddialog ) - { - weapon thread playdialogondeath( self ); - weapon thread watchobjectdamage( self ); - } - if ( watcher.deleteonkillbrush ) - { - if ( isDefined( level.deleteonkillbrushoverride ) ) - { - weapon thread [[ level.deleteonkillbrushoverride ]]( self, watcher ); - return; - } - else - { - weapon thread deleteonkillbrush( self ); - } - } + if ( !isdefined( watcher.storedifferentobject ) ) + watcher.objectarray[watcher.objectarray.size] = weapon; + + weapon.owner = self; + weapon.detonated = 0; + weapon.name = watcher.weapon; + + if ( isdefined( watcher.ondamage ) ) + weapon thread [[ watcher.ondamage ]]( watcher ); + else + weapon thread weaponobjectdamage( watcher ); + + weapon.ownergetsassist = watcher.ownergetsassist; + + if ( isdefined( watcher.onspawn ) ) + weapon thread [[ watcher.onspawn ]]( watcher, self ); + + if ( isdefined( watcher.onspawnfx ) ) + weapon thread [[ watcher.onspawnfx ]](); + + if ( isdefined( watcher.reconmodel ) ) + weapon thread attachreconmodel( watcher.reconmodel, self ); + + if ( isdefined( watcher.onspawnretrievetriggers ) ) + weapon thread [[ watcher.onspawnretrievetriggers ]]( watcher, self ); + + if ( watcher.hackable ) + weapon thread hackerinit( watcher ); + + if ( isdefined( watcher.stun ) ) + weapon thread watchscramble( watcher ); + + if ( watcher.playdestroyeddialog ) + { + weapon thread playdialogondeath( self ); + weapon thread watchobjectdamage( self ); + } + + if ( watcher.deleteonkillbrush ) + { + if ( isdefined( level.deleteonkillbrushoverride ) ) + weapon thread [[ level.deleteonkillbrushoverride ]]( self, watcher ); + else + weapon thread deleteonkillbrush( self ); + } } -watchscramble( watcher ) //checked changed to match beta dump +watchscramble( watcher ) { - self endon( "death" ); - self endon( "hacked" ); - self waittillnotmoving(); - if ( self maps/mp/_scrambler::checkscramblerstun() ) - { - self thread stunstart( watcher ); - } - else - { - self stunstop(); - } - for ( ;; ) - { - level waittill_any( "scrambler_spawn", "scrambler_death", "hacked" ); - if ( isDefined( self.owner ) && self.owner isempjammed() ) - { - continue; - } - if ( self maps/mp/_scrambler::checkscramblerstun() ) - { - self thread stunstart( watcher ); - } - else - { - self stunstop(); - } - } + self endon( "death" ); + self endon( "hacked" ); + self waittillnotmoving(); + + if ( self maps\mp\_scrambler::checkscramblerstun() ) + self thread stunstart( watcher ); + else + self stunstop(); + + for (;;) + { + level waittill_any( "scrambler_spawn", "scrambler_death", "hacked" ); + + if ( isdefined( self.owner ) && self.owner isempjammed() ) + continue; + + if ( self maps\mp\_scrambler::checkscramblerstun() ) + { + self thread stunstart( watcher ); + continue; + } + + self stunstop(); + } } -deleteweaponobjecthelper( weapon_ent ) //checked matches cerberus output +deleteweaponobjecthelper( weapon_ent ) { - if ( !isDefined( weapon_ent.name ) ) - { - return; - } - watcher = self getweaponobjectwatcherbyweapon( weapon_ent.name ); - if ( !isDefined( watcher ) ) - { - return; - } - watcher.objectarray = deleteweaponobject( watcher, weapon_ent ); + if ( !isdefined( weapon_ent.name ) ) + return; + + watcher = self getweaponobjectwatcherbyweapon( weapon_ent.name ); + + if ( !isdefined( watcher ) ) + return; + + watcher.objectarray = deleteweaponobject( watcher, weapon_ent ); } -deleteweaponobject( watcher, weapon_ent ) //checked partially changed to match cerberus output see info.md +deleteweaponobject( watcher, weapon_ent ) { - temp_objectarray = watcher.objectarray; - watcher.objectarray = []; - j = 0; - i = 0; - while ( i < temp_objectarray.size ) - { - if ( !isDefined( temp_objectarray[ i ] ) || temp_objectarray[ i ] == weapon_ent ) - { - i++; - continue; - } - watcher.objectarray[ j ] = temp_objectarray[ i ]; - j++; - i++; - } - return watcher.objectarray; + temp_objectarray = watcher.objectarray; + watcher.objectarray = []; + j = 0; + + for ( i = 0; i < temp_objectarray.size; i++ ) + { + if ( !isdefined( temp_objectarray[i] ) || temp_objectarray[i] == weapon_ent ) + continue; + + watcher.objectarray[j] = temp_objectarray[i]; + j++; + } + + return watcher.objectarray; } -weaponobjectdamage( watcher ) //checked changed to match cerberus output +weaponobjectdamage( watcher ) { - self endon( "death" ); - self endon( "hacked" ); - self setcandamage( 1 ); - self.maxhealth = 100000; - self.health = self.maxhealth; - attacker = undefined; - for ( ;; ) - { - while ( 1 ) - { - self waittill( "damage", damage, attacker, direction_vec, point, type, modelname, tagname, partname, weaponname, idflags ); - if ( isDefined( weaponname ) ) - { - switch( weaponname ) - { - case "concussion_grenade_mp": - case "flash_grenade_mp": - case "proximity_grenade_mp": - if ( watcher.stuntime > 0 ) - { - self thread 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 "willy_pete_mp": - continue; - case "emp_grenade_mp": - 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(); - } - } - break; - default: - break; - } - if ( !isplayer( attacker ) && isDefined( attacker.owner ) ) - { - attacker = attacker.owner; - } - if ( level.teambased && isplayer( attacker ) ) - { - if ( !level.hardcoremode && self.owner.team == attacker.pers[ "team" ] && self.owner != attacker ) - { - continue; - } - } - if ( maps/mp/gametypes/_globallogic_player::dodamagefeedback( weaponname, attacker ) ) - { - attacker maps/mp/gametypes/_damagefeedback::updatedamagefeedback(); - } - if ( !isvehicle( self ) && !friendlyfirecheck( self.owner, attacker ) ) - { - continue; - } - break; - } - if ( level.weaponobjectexplodethisframe ) - { - wait ( 0.1 + randomfloat( 0.4 ) ); - } - else - { - wait 0.05; - } - if ( !isDefined( self ) ) - { - return; - } - level.weaponobjectexplodethisframe = 1; - thread resetweaponobjectexplodethisframe(); - self maps/mp/_entityheadicons::setentityheadicon( "none" ); - if ( ( issubstr( type, "MOD_GRENADE_SPLASH" ) || issubstr( type, "MOD_GRENADE" ) ) && isDefined( type ) || isDefined( type ) && issubstr( type, "MOD_EXPLOSIVE" ) ) - { - self.waschained = 1; - } - if ( is_true( idflags ) & level.idflags_penetration ) - { - self.wasdamagedfrombulletpenetration = 1; - } - self.wasdamaged = 1; - watcher thread waitanddetonate( self, 0, attacker, weaponname ); - } - } + self endon( "death" ); + self endon( "hacked" ); + self setcandamage( 1 ); + self.maxhealth = 100000; + self.health = self.maxhealth; + attacker = undefined; + + while ( true ) + { + self waittill( "damage", damage, attacker, direction_vec, point, type, modelname, tagname, partname, weaponname, idflags ); + + if ( isdefined( weaponname ) ) + { + switch ( weaponname ) + { + case "proximity_grenade_mp": + case "flash_grenade_mp": + case "concussion_grenade_mp": + if ( watcher.stuntime > 0 ) + self thread 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 "willy_pete_mp": + continue; + case "emp_grenade_mp": + 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(); + } + + break; + default: + break; + } + } + + if ( !isplayer( attacker ) && isdefined( attacker.owner ) ) + attacker = attacker.owner; + + if ( level.teambased && isplayer( attacker ) ) + { + if ( !level.hardcoremode && self.owner.team == attacker.pers["team"] && self.owner != attacker ) + continue; + } + + if ( maps\mp\gametypes\_globallogic_player::dodamagefeedback( weaponname, attacker ) ) + attacker maps\mp\gametypes\_damagefeedback::updatedamagefeedback(); + + if ( !isvehicle( self ) && !friendlyfirecheck( self.owner, attacker ) ) + continue; + + break; + } + + if ( level.weaponobjectexplodethisframe ) + wait( 0.1 + randomfloat( 0.4 ) ); + else + wait 0.05; + + if ( !isdefined( self ) ) + return; + + level.weaponobjectexplodethisframe = 1; + thread resetweaponobjectexplodethisframe(); + self maps\mp\_entityheadicons::setentityheadicon( "none" ); + + if ( isdefined( type ) && ( issubstr( type, "MOD_GRENADE_SPLASH" ) || issubstr( type, "MOD_GRENADE" ) || issubstr( type, "MOD_EXPLOSIVE" ) ) ) + self.waschained = 1; + + if ( isdefined( idflags ) && idflags & level.idflags_penetration ) + self.wasdamagedfrombulletpenetration = 1; + + self.wasdamaged = 1; + watcher thread waitanddetonate( self, 0.0, attacker, weaponname ); } -playdialogondeath( owner ) //checked matches cerberus output +playdialogondeath( owner ) { - owner endon( "death" ); - owner endon( "disconnect" ); - self endon( "hacked" ); - self waittill( "death" ); - if ( is_true( self.playdialog ) ) - { - owner maps/mp/gametypes/_globallogic_audio::leaderdialogonplayer( "equipment_destroyed", "item_destroyed" ); - } + owner endon( "death" ); + owner endon( "disconnect" ); + self endon( "hacked" ); + + self waittill( "death" ); + + if ( isdefined( self.playdialog ) && self.playdialog ) + owner maps\mp\gametypes\_globallogic_audio::leaderdialogonplayer( "equipment_destroyed", "item_destroyed" ); } -watchobjectdamage( owner ) //checked changed to match cerberus output +watchobjectdamage( owner ) { - owner endon( "death" ); - owner endon( "disconnect" ); - self endon( "hacked" ); - self endon( "death" ); - while ( 1 ) - { - self waittill( "damage", damage, attacker ); - if ( isDefined( attacker ) && isplayer( attacker ) && attacker != owner ) - { - self.playdialog = 1; - } - else - { - self.playdialog = 0; - } - } + owner endon( "death" ); + owner endon( "disconnect" ); + self endon( "hacked" ); + self endon( "death" ); + + while ( true ) + { + self waittill( "damage", damage, attacker ); + + if ( isdefined( attacker ) && isplayer( attacker ) && attacker != owner ) + self.playdialog = 1; + else + self.playdialog = 0; + } } -stunstart( watcher, time ) //checked matches cerberus output +stunstart( watcher, time ) { - self endon( "death" ); - if ( self isstunned() ) - { - return; - } - if ( isDefined( self.camerahead ) ) - { - self.camerahead setclientflag( 9 ); - } - self setclientflag( 9 ); - if ( isDefined( watcher.stun ) ) - { - self thread [[ watcher.stun ]](); - } - if ( watcher.name == "rcbomb" ) - { - self.owner freezecontrolswrapper( 1 ); - } - if ( isDefined( time ) ) - { - wait time; - } - else - { - return; - } - if ( watcher.name == "rcbomb" ) - { - self.owner freezecontrolswrapper( 0 ); - } - self stunstop(); + self endon( "death" ); + + if ( self isstunned() ) + return; + + if ( isdefined( self.camerahead ) ) + self.camerahead setclientflag( 9 ); + + self setclientflag( 9 ); + + if ( isdefined( watcher.stun ) ) + self thread [[ watcher.stun ]](); + + if ( watcher.name == "rcbomb" ) + self.owner freezecontrolswrapper( 1 ); + + if ( isdefined( time ) ) + wait( time ); + else + return; + + if ( watcher.name == "rcbomb" ) + self.owner freezecontrolswrapper( 0 ); + + self stunstop(); } -stunstop() //checked matches cerberus output +stunstop() { - self notify( "not_stunned" ); - if ( isDefined( self.camerahead ) ) - { - self.camerahead clearclientflag( 9 ); - } - self clearclientflag( 9 ); + self notify( "not_stunned" ); + + if ( isdefined( self.camerahead ) ) + self.camerahead clearclientflag( 9 ); + + self clearclientflag( 9 ); } -weaponstun() //checked matches cerberus output +weaponstun() { - self endon( "death" ); - self endon( "not_stunned" ); - origin = self gettagorigin( "tag_fx" ); - if ( !isDefined( origin ) ) - { - origin = self.origin + vectorScale( ( 0, 0, 1 ), 10 ); - } - self.stun_fx = spawn( "script_model", origin ); - self.stun_fx setmodel( "tag_origin" ); - self thread stunfxthink( self.stun_fx ); - wait 0.1; - playfxontag( level._equipment_spark_fx, self.stun_fx, "tag_origin" ); - self.stun_fx playsound( "dst_disable_spark" ); + self endon( "death" ); + self endon( "not_stunned" ); + origin = self gettagorigin( "tag_fx" ); + + if ( !isdefined( origin ) ) + origin = self.origin + vectorscale( ( 0, 0, 1 ), 10.0 ); + + self.stun_fx = spawn( "script_model", origin ); + self.stun_fx setmodel( "tag_origin" ); + self thread stunfxthink( self.stun_fx ); + wait 0.1; + playfxontag( level._equipment_spark_fx, self.stun_fx, "tag_origin" ); + self.stun_fx playsound( "dst_disable_spark" ); } -stunfxthink( fx ) //checked matches cerberus output +stunfxthink( fx ) { - fx endon( "death" ); - self waittill_any( "death", "not_stunned" ); - fx delete(); + fx endon( "death" ); + self waittill_any( "death", "not_stunned" ); + fx delete(); } -isstunned() //checked matches cerberus output +isstunned() { - return isDefined( self.stun_fx ); + return isdefined( self.stun_fx ); } -resetweaponobjectexplodethisframe() //checked matches cerberus output +resetweaponobjectexplodethisframe() { - wait 0.05; - level.weaponobjectexplodethisframe = 0; + wait 0.05; + level.weaponobjectexplodethisframe = 0; } -getweaponobjectwatcher( name ) //checked changed to match cerberus output +getweaponobjectwatcher( name ) { - if ( !isDefined( self.weaponobjectwatcherarray ) ) - { - return undefined; - } - for ( watcher = 0; watcher < self.weaponobjectwatcherarray.size; watcher++ ) - { - if ( self.weaponobjectwatcherarray[ watcher ].name == name ) - { - return self.weaponobjectwatcherarray[ watcher ]; - } - } - return undefined; + if ( !isdefined( self.weaponobjectwatcherarray ) ) + return undefined; + + for ( watcher = 0; watcher < self.weaponobjectwatcherarray.size; watcher++ ) + { + if ( self.weaponobjectwatcherarray[watcher].name == name ) + return self.weaponobjectwatcherarray[watcher]; + } + + return undefined; } -getweaponobjectwatcherbyweapon( weapon ) //checked changed to match cerberus output +getweaponobjectwatcherbyweapon( weapon ) { - if ( !isDefined( self.weaponobjectwatcherarray ) ) - { - return undefined; - } - for ( watcher = 0; watcher < self.weaponobjectwatcherarray.size; watcher++ ) - { - if ( isDefined( self.weaponobjectwatcherarray[ watcher ].weapon ) && self.weaponobjectwatcherarray[ watcher ].weapon == weapon ) - { - return self.weaponobjectwatcherarray[ watcher ]; - } - if ( isDefined( self.weaponobjectwatcherarray[ watcher ].weapon ) && isDefined( self.weaponobjectwatcherarray[ watcher ].altweapon ) && self.weaponobjectwatcherarray[ watcher ].altweapon == weapon ) - { - return self.weaponobjectwatcherarray[ watcher ]; - } - } - return undefined; + if ( !isdefined( self.weaponobjectwatcherarray ) ) + return undefined; + + for ( watcher = 0; watcher < self.weaponobjectwatcherarray.size; watcher++ ) + { + if ( isdefined( self.weaponobjectwatcherarray[watcher].weapon ) && self.weaponobjectwatcherarray[watcher].weapon == weapon ) + return self.weaponobjectwatcherarray[watcher]; + + if ( isdefined( self.weaponobjectwatcherarray[watcher].weapon ) && isdefined( self.weaponobjectwatcherarray[watcher].altweapon ) && self.weaponobjectwatcherarray[watcher].altweapon == weapon ) + return self.weaponobjectwatcherarray[watcher]; + } + + return undefined; } -resetweaponobjectwatcher( watcher, ownerteam ) //checked matches cerberus output +resetweaponobjectwatcher( watcher, ownerteam ) { - if ( level.deleteexplosivesonspawn == 1 ) - { - self notify( "weapon_object_destroyed" ); - watcher deleteweaponobjectarray(); - } - watcher.ownerteam = ownerteam; + if ( level.deleteexplosivesonspawn == 1 ) + { + self notify( "weapon_object_destroyed" ); + watcher deleteweaponobjectarray(); + } + + watcher.ownerteam = ownerteam; } -createweaponobjectwatcher( name, weapon, ownerteam ) //checked matches cerberus output +createweaponobjectwatcher( name, weapon, ownerteam ) { - if ( !isDefined( self.weaponobjectwatcherarray ) ) - { - self.weaponobjectwatcherarray = []; - } - weaponobjectwatcher = getweaponobjectwatcher( name ); - if ( !isDefined( weaponobjectwatcher ) ) - { - weaponobjectwatcher = spawnstruct(); - self.weaponobjectwatcherarray[ self.weaponobjectwatcherarray.size ] = weaponobjectwatcher; - weaponobjectwatcher.name = name; - weaponobjectwatcher.type = "use"; - weaponobjectwatcher.weapon = weapon; - weaponobjectwatcher.weaponidx = getweaponindexfromname( weapon ); - weaponobjectwatcher.watchforfire = 0; - weaponobjectwatcher.hackable = 0; - weaponobjectwatcher.altdetonate = 0; - weaponobjectwatcher.detectable = 1; - weaponobjectwatcher.headicon = 1; - weaponobjectwatcher.stuntime = 0; - weaponobjectwatcher.activatesound = undefined; - weaponobjectwatcher.ignoredirection = undefined; - weaponobjectwatcher.immediatedetonation = undefined; - weaponobjectwatcher.deploysound = getweaponfiresound( weaponobjectwatcher.weaponidx ); - weaponobjectwatcher.deploysoundplayer = getweaponfiresoundplayer( weaponobjectwatcher.weaponidx ); - weaponobjectwatcher.pickupsound = getweaponpickupsound( weaponobjectwatcher.weaponidx ); - weaponobjectwatcher.pickupsoundplayer = getweaponpickupsoundplayer( weaponobjectwatcher.weaponidx ); - weaponobjectwatcher.altweapon = undefined; - weaponobjectwatcher.ownergetsassist = 0; - weaponobjectwatcher.playdestroyeddialog = 1; - weaponobjectwatcher.deleteonkillbrush = 1; - weaponobjectwatcher.deleteondifferentobjectspawn = 1; - weaponobjectwatcher.enemydestroy = 0; - weaponobjectwatcher.onspawn = undefined; - weaponobjectwatcher.onspawnfx = undefined; - weaponobjectwatcher.onspawnretrievetriggers = undefined; - weaponobjectwatcher.ondetonated = undefined; - weaponobjectwatcher.detonate = undefined; - weaponobjectwatcher.stun = undefined; - weaponobjectwatcher.ondestroyed = undefined; - if ( !isDefined( weaponobjectwatcher.objectarray ) ) - { - weaponobjectwatcher.objectarray = []; - } - } - resetweaponobjectwatcher( weaponobjectwatcher, ownerteam ); - return weaponobjectwatcher; + if ( !isdefined( self.weaponobjectwatcherarray ) ) + self.weaponobjectwatcherarray = []; + + weaponobjectwatcher = getweaponobjectwatcher( name ); + + if ( !isdefined( weaponobjectwatcher ) ) + { + weaponobjectwatcher = spawnstruct(); + self.weaponobjectwatcherarray[self.weaponobjectwatcherarray.size] = weaponobjectwatcher; + weaponobjectwatcher.name = name; + weaponobjectwatcher.type = "use"; + weaponobjectwatcher.weapon = weapon; + weaponobjectwatcher.weaponidx = getweaponindexfromname( weapon ); + weaponobjectwatcher.watchforfire = 0; + weaponobjectwatcher.hackable = 0; + weaponobjectwatcher.altdetonate = 0; + weaponobjectwatcher.detectable = 1; + weaponobjectwatcher.headicon = 1; + weaponobjectwatcher.stuntime = 0; + weaponobjectwatcher.activatesound = undefined; + weaponobjectwatcher.ignoredirection = undefined; + weaponobjectwatcher.immediatedetonation = undefined; + weaponobjectwatcher.deploysound = getweaponfiresound( weaponobjectwatcher.weaponidx ); + weaponobjectwatcher.deploysoundplayer = getweaponfiresoundplayer( weaponobjectwatcher.weaponidx ); + weaponobjectwatcher.pickupsound = getweaponpickupsound( weaponobjectwatcher.weaponidx ); + weaponobjectwatcher.pickupsoundplayer = getweaponpickupsoundplayer( weaponobjectwatcher.weaponidx ); + weaponobjectwatcher.altweapon = undefined; + weaponobjectwatcher.ownergetsassist = 0; + weaponobjectwatcher.playdestroyeddialog = 1; + weaponobjectwatcher.deleteonkillbrush = 1; + weaponobjectwatcher.deleteondifferentobjectspawn = 1; + weaponobjectwatcher.enemydestroy = 0; + weaponobjectwatcher.onspawn = undefined; + weaponobjectwatcher.onspawnfx = undefined; + weaponobjectwatcher.onspawnretrievetriggers = undefined; + weaponobjectwatcher.ondetonated = undefined; + weaponobjectwatcher.detonate = undefined; + weaponobjectwatcher.stun = undefined; + weaponobjectwatcher.ondestroyed = undefined; + + if ( !isdefined( weaponobjectwatcher.objectarray ) ) + weaponobjectwatcher.objectarray = []; + } + + resetweaponobjectwatcher( weaponobjectwatcher, ownerteam ); + return weaponobjectwatcher; } -createuseweaponobjectwatcher( name, weapon, ownerteam ) //checked matches cerberus output +createuseweaponobjectwatcher( name, weapon, ownerteam ) { - weaponobjectwatcher = createweaponobjectwatcher( name, weapon, ownerteam ); - weaponobjectwatcher.type = "use"; - weaponobjectwatcher.onspawn = ::onspawnuseweaponobject; - return weaponobjectwatcher; + weaponobjectwatcher = createweaponobjectwatcher( name, weapon, ownerteam ); + weaponobjectwatcher.type = "use"; + weaponobjectwatcher.onspawn = ::onspawnuseweaponobject; + return weaponobjectwatcher; } -createproximityweaponobjectwatcher( name, weapon, ownerteam ) //checked matches cerberus output +createproximityweaponobjectwatcher( name, weapon, ownerteam ) { - weaponobjectwatcher = createweaponobjectwatcher( name, weapon, ownerteam ); - weaponobjectwatcher.type = "proximity"; - weaponobjectwatcher.onspawn = ::onspawnproximityweaponobject; - detectionconeangle = weapons_get_dvar_int( "scr_weaponobject_coneangle" ); - weaponobjectwatcher.detectiondot = cos( detectionconeangle ); - weaponobjectwatcher.detectionmindist = weapons_get_dvar_int( "scr_weaponobject_mindist" ); - weaponobjectwatcher.detectiongraceperiod = weapons_get_dvar( "scr_weaponobject_graceperiod" ); - weaponobjectwatcher.detonateradius = weapons_get_dvar_int( "scr_weaponobject_radius" ); - return weaponobjectwatcher; + weaponobjectwatcher = createweaponobjectwatcher( name, weapon, ownerteam ); + weaponobjectwatcher.type = "proximity"; + weaponobjectwatcher.onspawn = ::onspawnproximityweaponobject; + detectionconeangle = weapons_get_dvar_int( "scr_weaponobject_coneangle" ); + weaponobjectwatcher.detectiondot = cos( detectionconeangle ); + weaponobjectwatcher.detectionmindist = weapons_get_dvar_int( "scr_weaponobject_mindist" ); + weaponobjectwatcher.detectiongraceperiod = weapons_get_dvar( "scr_weaponobject_graceperiod" ); + weaponobjectwatcher.detonateradius = weapons_get_dvar_int( "scr_weaponobject_radius" ); + return weaponobjectwatcher; } -commononspawnuseweaponobject( watcher, owner ) //checked matches cerberus output +commononspawnuseweaponobject( watcher, owner ) { - if ( watcher.detectable ) - { - if ( is_true( watcher.ismovable ) ) - { - self thread weaponobjectdetectionmovable( owner.pers[ "team" ] ); - } - else - { - self thread weaponobjectdetectiontrigger_wait( owner.pers[ "team" ] ); - } - if ( watcher.headicon && level.teambased ) - { - self waittillnotmoving(); - offset = level.weaponobjects_headicon_offset[ "default" ]; - if ( isDefined( level.weaponobjects_headicon_offset[ self.name ] ) ) - { - offset = level.weaponobjects_headicon_offset[ self.name ]; - } - if ( isDefined( self ) ) - { - self maps/mp/_entityheadicons::setentityheadicon( owner.pers[ "team" ], owner, offset ); - } - } - } + if ( watcher.detectable ) + { + if ( isdefined( watcher.ismovable ) && watcher.ismovable ) + self thread weaponobjectdetectionmovable( owner.pers["team"] ); + else + self thread weaponobjectdetectiontrigger_wait( owner.pers["team"] ); + + if ( watcher.headicon && level.teambased ) + { + self waittillnotmoving(); + offset = level.weaponobjects_headicon_offset["default"]; + + if ( isdefined( level.weaponobjects_headicon_offset[self.name] ) ) + offset = level.weaponobjects_headicon_offset[self.name]; + + if ( isdefined( self ) ) + self maps\mp\_entityheadicons::setentityheadicon( owner.pers["team"], owner, offset ); + } + } } -onspawnuseweaponobject( watcher, owner ) //checked matches cerberus output +onspawnuseweaponobject( watcher, owner ) { - self commononspawnuseweaponobject( watcher, owner ); + self commononspawnuseweaponobject( watcher, owner ); } -onspawnproximityweaponobject( watcher, owner ) //checked matches cerberus output dvar taken from beta dump +onspawnproximityweaponobject( watcher, owner ) { - self thread commononspawnuseweaponobject( watcher, owner ); - self thread proximityweaponobjectdetonation( watcher ); - /* + self thread commononspawnuseweaponobject( watcher, owner ); + self thread proximityweaponobjectdetonation( watcher ); /# - if ( getDvarInt( "scr_weaponobject_debug" ) ) - { - self thread proximityweaponobjectdebug( watcher ); + if ( getdvarint( "scr_weaponobject_debug" ) ) + self thread proximityweaponobjectdebug( watcher ); #/ - } - */ } -watchweaponobjectusage() //checked matches cerberus output +watchweaponobjectusage() { - self endon( "disconnect" ); - if ( !isDefined( self.weaponobjectwatcherarray ) ) - { - self.weaponobjectwatcherarray = []; - } - self thread watchweaponobjectspawn(); - self thread watchweaponprojectileobjectspawn(); - self thread watchweaponobjectdetonation(); - self thread watchweaponobjectaltdetonation(); - self thread watchweaponobjectaltdetonate(); - self thread deleteweaponobjectson(); + self endon( "disconnect" ); + + if ( !isdefined( self.weaponobjectwatcherarray ) ) + self.weaponobjectwatcherarray = []; + + self thread watchweaponobjectspawn(); + self thread watchweaponprojectileobjectspawn(); + self thread watchweaponobjectdetonation(); + self thread watchweaponobjectaltdetonation(); + self thread watchweaponobjectaltdetonate(); + self thread deleteweaponobjectson(); } -watchweaponobjectspawn() //checked partially changed to match cerberus output see info.md +watchweaponobjectspawn() { - self notify( "watchWeaponObjectSpawn" ); - self endon( "watchWeaponObjectSpawn" ); - self endon( "disconnect" ); - while ( 1 ) - { - self waittill( "grenade_fire", weapon, weapname ); - switch( weapname ) - { - case "acoustic_sensor_mp": - case "bouncingbetty_mp": - case "camera_spike_mp": - case "scrambler_mp": - case "tactical_insertion_mp": - break; - case "bouncingbetty_mp": - case "claymore_mp": - case "proximity_grenade_mp": - case "satchel_charge_mp": - case "sensor_grenade_mp": - case "trophy_system_mp": - i = 0; - while ( i < self.weaponobjectwatcherarray.size ) - { - if ( self.weaponobjectwatcherarray[ i ].weapon != weapname ) - { - i++; - continue; - } - objectarray_size = self.weaponobjectwatcherarray[ i ].objectarray.size; - for ( j = 0; j < objectarray_size; j++ ) - { - if ( !isDefined( self.weaponobjectwatcherarray[ i ].objectarray[ j ] ) ) - { - self.weaponobjectwatcherarray[ i ].objectarray = deleteweaponobject( self.weaponobjectwatcherarray[ i ], weapon ); - } - } - numallowed = 2; - if ( weapname == "proximity_grenade_mp" ) - { - numallowed = weapons_get_dvar_int( "scr_proximityGrenadeMaxInstances" ); - } - if ( isDefined( self.weaponobjectwatcherarray[ i ].detonate ) && self.weaponobjectwatcherarray[ i ].objectarray.size > ( numallowed - 1 ) ) - { - self.weaponobjectwatcherarray[ i ] thread waitanddetonate( self.weaponobjectwatcherarray[ i ].objectarray[ 0 ], 0.1, undefined, weapname ); - } - i++; - break; - } - default: - break; - if ( !self ishacked() ) - { - if ( weapname == "claymore_mp" || weapname == "satchel_charge_mp" || weapname == "bouncingbetty_mp" ) - { - self addweaponstat( weapname, "used", 1 ); - } - } - watcher = getweaponobjectwatcherbyweapon( weapname ); - if ( isDefined( watcher ) ) - { - self addweaponobject( watcher, weapon ); - } - } - } + self notify( "watchWeaponObjectSpawn" ); + self endon( "watchWeaponObjectSpawn" ); + self endon( "disconnect" ); + + while ( true ) + { + self waittill( "grenade_fire", weapon, weapname ); + + switch ( weapname ) + { + case "tactical_insertion_mp": + case "scrambler_mp": + case "camera_spike_mp": + case "bouncingbetty_mp": + case "acoustic_sensor_mp": + break; + case "trophy_system_mp": + case "sensor_grenade_mp": + case "satchel_charge_mp": + case "proximity_grenade_mp": + case "claymore_mp": + case "bouncingbetty_mp": + for ( i = 0; i < self.weaponobjectwatcherarray.size; i++ ) + { + if ( self.weaponobjectwatcherarray[i].weapon != weapname ) + continue; + + objectarray_size = self.weaponobjectwatcherarray[i].objectarray.size; + + for ( j = 0; j < objectarray_size; j++ ) + { + if ( !isdefined( self.weaponobjectwatcherarray[i].objectarray[j] ) ) + self.weaponobjectwatcherarray[i].objectarray = deleteweaponobject( self.weaponobjectwatcherarray[i], weapon ); + } + + numallowed = 2; + + if ( weapname == "proximity_grenade_mp" ) + numallowed = weapons_get_dvar_int( "scr_proximityGrenadeMaxInstances" ); + + if ( isdefined( self.weaponobjectwatcherarray[i].detonate ) && self.weaponobjectwatcherarray[i].objectarray.size > numallowed - 1 ) + self.weaponobjectwatcherarray[i] thread waitanddetonate( self.weaponobjectwatcherarray[i].objectarray[0], 0.1, undefined, weapname ); + } + + break; + default: + break; + } + + if ( !self ishacked() ) + { + if ( weapname == "claymore_mp" || weapname == "satchel_charge_mp" || weapname == "bouncingbetty_mp" ) + self addweaponstat( weapname, "used", 1 ); + } + + watcher = getweaponobjectwatcherbyweapon( weapname ); + + if ( isdefined( watcher ) ) + self addweaponobject( watcher, weapon ); + } } -anyobjectsinworld( weapon ) //checked partially changed to match cerberus output see info.md +anyobjectsinworld( weapon ) { - objectsinworld = 0; - i = 0; - while ( i < self.weaponobjectwatcherarray.size ) - { - if ( self.weaponobjectwatcherarray[ i ].weapon != weapon ) - { - i++; - continue; - } - if ( isDefined( self.weaponobjectwatcherarray[ i ].detonate ) && self.weaponobjectwatcherarray[ i ].objectarray.size > 0 ) - { - objectsinworld = 1; - break; - } - i++; - } - return objectsinworld; + objectsinworld = 0; + + for ( i = 0; i < self.weaponobjectwatcherarray.size; i++ ) + { + if ( self.weaponobjectwatcherarray[i].weapon != weapon ) + continue; + + if ( isdefined( self.weaponobjectwatcherarray[i].detonate ) && self.weaponobjectwatcherarray[i].objectarray.size > 0 ) + { + objectsinworld = 1; + break; + } + } + + return objectsinworld; } -watchweaponprojectileobjectspawn() //checked changed to match cerberus output +watchweaponprojectileobjectspawn() { - self endon( "disconnect" ); - while ( 1 ) - { - self waittill( "missile_fire", weapon, weapname ); - watcher = getweaponobjectwatcherbyweapon( weapname ); - if ( isDefined( watcher ) ) - { - self addweaponobject( watcher, weapon ); - objectarray_size = watcher.objectarray.size; - for ( j = 0; j < objectarray_size; j++ ) - { - if ( !isDefined( watcher.objectarray[ j ] ) ) - { - watcher.objectarray = deleteweaponobject( watcher, weapon ); - } - } - if ( isDefined( watcher.detonate ) && watcher.objectarray.size > 3 ) - { - watcher thread waitanddetonate( watcher.objectarray[ 0 ], 0,1 ); - } - } - } + self endon( "disconnect" ); + + while ( true ) + { + self waittill( "missile_fire", weapon, weapname ); + + watcher = getweaponobjectwatcherbyweapon( weapname ); + + if ( isdefined( watcher ) ) + { + self addweaponobject( watcher, weapon ); + objectarray_size = watcher.objectarray.size; + + for ( j = 0; j < objectarray_size; j++ ) + { + if ( !isdefined( watcher.objectarray[j] ) ) + watcher.objectarray = deleteweaponobject( watcher, weapon ); + } + + if ( isdefined( watcher.detonate ) && watcher.objectarray.size > 3 ) + watcher thread waitanddetonate( watcher.objectarray[0], 0.1 ); + } + } } -proximityweaponobjectdebug( watcher ) //checked changed to match cerberus output +proximityweaponobjectdebug( watcher ) { - /* /# - self waittillnotmoving(); - self thread showcone( acos( watcher.detectiondot ), watcher.detonateradius, ( 1, 0.85, 0 ) ); - self thread showcone( 60, 256, ( 1, 0, 0 ) ); + self waittillnotmoving(); + self thread showcone( acos( watcher.detectiondot ), watcher.detonateradius, ( 1, 0.85, 0 ) ); + self thread showcone( 60, 256, ( 1, 0, 0 ) ); #/ - */ } -vectorcross( v1, v2 ) //checked matches cerberus output +vectorcross( v1, v2 ) { - /* /# - return ( ( v1[ 1 ] * v2[ 2 ] ) - ( v1[ 2 ] * v2[ 1 ] ), ( v1[ 2 ] * v2[ 0 ] ) - ( v1[ 0 ] * v2[ 2 ] ), ( v1[ 0 ] * v2[ 1 ] ) - ( v1[ 1 ] * v2[ 0 ] ) ); + return ( v1[1] * v2[2] - v1[2] * v2[1], v1[2] * v2[0] - v1[0] * v2[2], v1[0] * v2[1] - v1[1] * v2[0] ); #/ - */ } -showcone( angle, range, color ) //checked changed to match cerberus output +showcone( angle, range, color ) { - /* /# - self endon( "death" ); - start = self.origin; - forward = anglesToForward( self.angles ); - right = vectorcross( forward, ( 0, 0, 1 ) ); - up = vectorcross( forward, right ); - fullforward = forward * range * cos( angle ); - sideamnt = range * sin( angle ); - while ( 1 ) - { - prevpoint = ( 0, 0, 1 ); - for ( i = 0; i <= 20; i++ ) - { - coneangle = ( i / 20 ) * 360; - point = ( start + fullforward ) + ( sideamnt * ( ( right * cos( coneangle ) ) + ( up * sin( coneangle ) ) ) ); - if ( i > 0 ) - { - line( start, point, color ); - line( prevpoint, point, color ); - } - prevpoint = point; - } - wait 0.05; + self endon( "death" ); + start = self.origin; + forward = anglestoforward( self.angles ); + right = vectorcross( forward, ( 0, 0, 1 ) ); + up = vectorcross( forward, right ); + fullforward = forward * range * cos( angle ); + sideamnt = range * sin( angle ); + + while ( true ) + { + prevpoint = ( 0, 0, 0 ); + + for ( i = 0; i <= 20; i++ ) + { + coneangle = i / 20.0 * 360; + point = start + fullforward + sideamnt * ( right * cos( coneangle ) + up * sin( coneangle ) ); + + if ( i > 0 ) + { + line( start, point, color ); + line( prevpoint, point, color ); + } + + prevpoint = point; + } + + wait 0.05; + } #/ - } - */ } -weaponobjectdetectionmovable( ownerteam ) //checked partially changed to match cerberus output see info.md +weaponobjectdetectionmovable( ownerteam ) { - self endon( "end_detection" ); - level endon( "game_ended" ); - self endon( "death" ); - self endon( "hacked" ); - if ( level.oldschool ) - { - return; - } - if ( !level.teambased ) - { - return; - } - self.detectid = "rcBomb" + getTime() + randomint( 1000000 ); - while ( !level.gameended ) - { - wait 1; - players = get_players(); - i = 0; - while ( i < players.size ) - { - player = players[ i ]; - if ( isai( player ) ) - { - i++; - continue; - } - if ( isDefined( self.model_name ) && player hasperk( "specialty_detectexplosive" ) ) - { - switch( self.model_name ) - { - case "t6_wpn_c4_world_detect": - case "t6_wpn_claymore_world_detect": - break; - default: - continue; - } - } - else - { - continue; - } - if ( player.team == ownerteam ) - { - i++; - continue; - } - if ( isDefined( player.bombsquadids[ self.detectid ] ) ) - { - i++; - continue; - } - i++; - } - } + self endon( "end_detection" ); + level endon( "game_ended" ); + self endon( "death" ); + self endon( "hacked" ); + + if ( level.oldschool ) + return; + + if ( !level.teambased ) + return; + + self.detectid = "rcBomb" + gettime() + randomint( 1000000 ); + + while ( !level.gameended ) + { + wait 1; + players = get_players(); + + for ( i = 0; i < players.size; i++ ) + { + player = players[i]; + + if ( isai( player ) ) + continue; + + if ( isdefined( self.model_name ) && player hasperk( "specialty_detectexplosive" ) ) + { + switch ( self.model_name ) + { + case "t6_wpn_claymore_world_detect": + case "t6_wpn_c4_world_detect": + break; + default: + continue; + } + } + else + continue; + + if ( player.team == ownerteam ) + continue; + + if ( isdefined( player.bombsquadids[self.detectid] ) ) + continue; + } + } } -seticonpos( item, icon, heightincrease ) //checked matches cerberus output +seticonpos( item, icon, heightincrease ) { - icon.x = item.origin[ 0 ]; - icon.y = item.origin[ 1 ]; - icon.z = item.origin[ 2 ] + heightincrease; + icon.x = item.origin[0]; + icon.y = item.origin[1]; + icon.z = item.origin[2] + heightincrease; } -weaponobjectdetectiontrigger_wait( ownerteam ) //checked matches cerberus output +weaponobjectdetectiontrigger_wait( ownerteam ) { - self endon( "death" ); - self endon( "hacked" ); - waittillnotmoving(); - if ( level.oldschool ) - { - return; - } - self thread weaponobjectdetectiontrigger( ownerteam ); + self endon( "death" ); + self endon( "hacked" ); + waittillnotmoving(); + + if ( level.oldschool ) + return; + + self thread weaponobjectdetectiontrigger( ownerteam ); } -weaponobjectdetectiontrigger( ownerteam ) //checked matches cerberus output +weaponobjectdetectiontrigger( ownerteam ) { - trigger = spawn( "trigger_radius", self.origin - vectorScale( ( 0, 0, 1 ), 128 ), 0, 512, 256 ); - trigger.detectid = "trigger" + getTime() + randomint( 1000000 ); - trigger sethintlowpriority( 1 ); - self waittill_any( "death", "hacked" ); - trigger notify( "end_detection" ); - if ( isDefined( trigger.bombsquadicon ) ) - { - trigger.bombsquadicon destroy(); - } - trigger delete(); + trigger = spawn( "trigger_radius", self.origin - vectorscale( ( 0, 0, 1 ), 128.0 ), 0, 512, 256 ); + trigger.detectid = "trigger" + gettime() + randomint( 1000000 ); + trigger sethintlowpriority( 1 ); + self waittill_any( "death", "hacked" ); + trigger notify( "end_detection" ); + + if ( isdefined( trigger.bombsquadicon ) ) + trigger.bombsquadicon destroy(); + + trigger delete(); } -hackertriggersetvisibility( owner ) //checked matches beta dump +hackertriggersetvisibility( owner ) { - self endon( "death" ); - /* + self endon( "death" ); /# - assert( isplayer( owner ) ); + assert( isplayer( owner ) ); #/ - */ - ownerteam = owner.pers[ "team" ]; - for ( ;; ) - { - if ( level.teambased ) - { - self setvisibletoallexceptteam( ownerteam ); - self setexcludeteamfortrigger( ownerteam ); - } - else - { - self setvisibletoall(); - self setteamfortrigger( "none" ); - } - if ( isDefined( owner ) ) - { - self setinvisibletoplayer( owner ); - } - level waittill_any( "player_spawned", "joined_team" ); - } + ownerteam = owner.pers["team"]; + + for (;;) + { + if ( level.teambased ) + { + self setvisibletoallexceptteam( ownerteam ); + self setexcludeteamfortrigger( ownerteam ); + } + else + { + self setvisibletoall(); + self setteamfortrigger( "none" ); + } + + if ( isdefined( owner ) ) + self setinvisibletoplayer( owner ); + + level waittill_any( "player_spawned", "joined_team" ); + } } -hackernotmoving() //checked matches cerberus output +hackernotmoving() { - self endon( "death" ); - self waittillnotmoving(); - self notify( "landed" ); + self endon( "death" ); + self waittillnotmoving(); + self notify( "landed" ); } -hackerinit( watcher ) //checked matches cerberus output +hackerinit( watcher ) { - self thread hackernotmoving(); - event = self waittill_any_return( "death", "landed" ); - if ( event == "death" ) - { - return; - } - triggerorigin = self.origin; - if ( isDefined( self.name ) && self.name == "satchel_charge_mp" ) - { - triggerorigin = self gettagorigin( "tag_fx" ); - } - self.hackertrigger = spawn( "trigger_radius_use", triggerorigin, level.weaponobjects_hacker_trigger_width, level.weaponobjects_hacker_trigger_height ); - self.hackertrigger sethintlowpriority( 1 ); - self.hackertrigger setcursorhint( "HINT_NOICON", self ); - self.hackertrigger setignoreentfortrigger( self ); - self.hackertrigger enablelinkto(); - self.hackertrigger linkto( self ); - if ( isDefined( level.hackerhints[ self.name ] ) ) - { - self.hackertrigger sethintstring( level.hackerhints[ self.name ].hint ); - } - else - { - self.hackertrigger sethintstring( &"MP_GENERIC_HACKING" ); - } - self.hackertrigger setperkfortrigger( "specialty_disarmexplosive" ); - self.hackertrigger thread hackertriggersetvisibility( self.owner ); - self thread hackerthink( self.hackertrigger, watcher ); -} + self thread hackernotmoving(); + event = self waittill_any_return( "death", "landed" ); -hackerthink( trigger, watcher ) //checked changed to match cerberus output -{ - self endon( "death" ); - for ( ;; ) - { - trigger waittill( "trigger", player, instant ); - if ( !isDefined( instant ) && !trigger hackerresult( player, self.owner ) ) - { - continue; - } - self.owner hackerremoveweapon( self ); - self.owner maps/mp/gametypes/_globallogic_audio::leaderdialogonplayer( "hacked_equip", "item_destroyed" ); - self.hacked = 1; - self setmissileowner( player ); - self setteam( player.pers[ "team" ] ); - self.owner = player; - if ( isweaponequipment( self.name ) || self.name == "proximity_grenade_mp" ) - { - maps/mp/_scoreevents::processscoreevent( "hacked", player ); - player addweaponstat( "pda_hack_mp", "CombatRecordStat", 1 ); - player maps/mp/_challenges::hackedordestroyedequipment(); - } - if ( self.name == "satchel_charge_mp" && isDefined( player.lowermessage ) ) - { - player.lowermessage settext( &"PLATFORM_SATCHEL_CHARGE_DOUBLE_TAP" ); - player.lowermessage.alpha = 1; - player.lowermessage fadeovertime( 2 ); - player.lowermessage.alpha = 0; - } - self notify( "hacked", player ); - level notify( "hacked", self, player ); - if ( self.name == "camera_spike_mp" && isDefined( self.camerahead ) ) - { - self.camerahead notify( "hacked" ); - } - if ( isDefined( watcher.stun ) ) - { - self thread stunstart( watcher, 0.75 ); - wait 0.75; - } - else - { - wait 0.05; - } - if ( isDefined( player ) && player.sessionstate == "playing" ) - { - player notify( "grenade_fire", self, self.name, 1 ); - } - else - { - watcher thread waitanddetonate( self, 0 ); - } - return; - } -} + if ( event == "death" ) + return; -hackerunfreezeplayer( player ) //checked matches cerberus output -{ - self endon( "hack_done" ); - self waittill( "death" ); - if ( isDefined( player ) ) - { - player freeze_player_controls( 0 ); - player enableweapons(); - } -} + triggerorigin = self.origin; -hackerresult( player, owner ) //checked matches cerberus output -{ - success = 1; - time = getTime(); - hacktime = getDvarFloat( "perk_disarmExplosiveTime" ); - if ( !canhack( player, owner, 1 ) ) - { - return 0; - } - self thread hackerunfreezeplayer( player ); - while ( ( time + ( hacktime * 1000 ) ) > getTime() ) - { - if ( !canhack( player, owner, 0 ) ) - { - success = 0; - break; - } - if ( !player usebuttonpressed() ) - { - success = 0; - break; - } - if ( !isDefined( self ) ) - { - success = 0; - break; - } - player freeze_player_controls( 1 ); - player disableweapons(); - if ( !isDefined( self.progressbar ) ) - { - self.progressbar = player createprimaryprogressbar(); - self.progressbar.lastuserate = -1; - self.progressbar showelem(); - self.progressbar updatebar( 0.01, 1 / hacktime ); - self.progresstext = player createprimaryprogressbartext(); - self.progresstext settext( &"MP_HACKING" ); - self.progresstext showelem(); - player playlocalsound( "evt_hacker_hacking" ); - } - wait 0.05; - } - if ( isDefined( player ) ) - { - player freeze_player_controls( 0 ); - player enableweapons(); - } - if ( isDefined( self.progressbar ) ) - { - self.progressbar destroyelem(); - self.progresstext destroyelem(); - } - if ( isDefined( self ) ) - { - self notify( "hack_done" ); - } - return success; -} + if ( isdefined( self.name ) && self.name == "satchel_charge_mp" ) + triggerorigin = self gettagorigin( "tag_fx" ); -canhack( player, owner, weapon_check ) //checked matches cerberus output -{ - if ( !isDefined( player ) ) - { - return 0; - } - if ( !isplayer( player ) ) - { - return 0; - } - if ( !isalive( player ) ) - { - return 0; - } - if ( !isDefined( owner ) ) - { - return 0; - } - if ( owner == player ) - { - return 0; - } - if ( level.teambased && player.team == owner.team ) - { - return 0; - } - if ( is_true( player.isdefusing ) ) - { - return 0; - } - if ( is_true( player.isplanting ) ) - { - return 0; - } - if ( !is_true( player.proxbar ) ) - { - return 0; - } - if ( isDefined( player.revivingteammate ) && player.revivingteammate == 1 ) - { - return 0; - } - if ( !player isonground() ) - { - return 0; - } - if ( player isinvehicle() ) - { - return 0; - } - if ( player isweaponviewonlylinked() ) - { - return 0; - } - if ( !player hasperk( "specialty_disarmexplosive" ) ) - { - return 0; - } - if ( player isempjammed() ) - { - return 0; - } - if ( is_true( player.laststand ) ) - { - return 0; - } - if ( weapon_check ) - { - if ( player isthrowinggrenade() ) - { - return 0; - } - if ( player isswitchingweapons() ) - { - return 0; - } - if ( player ismeleeing() ) - { - return 0; - } - weapon = player getcurrentweapon(); - if ( !isDefined( weapon ) ) - { - return 0; - } - if ( weapon == "none" ) - { - return 0; - } - if ( isweaponequipment( weapon ) && player isfiring() ) - { - return 0; - } - if ( isweaponspecificuse( weapon ) ) - { - return 0; - } - } - return 1; -} - -hackerremoveweapon( weapon ) //checked partially changed to match cerberus output see info.md -{ - i = 0; - while ( i < self.weaponobjectwatcherarray.size ) - { - if ( self.weaponobjectwatcherarray[ i ].weapon != weapon.name ) - { - i++; - continue; - } - objectarray_size = self.weaponobjectwatcherarray[ i ].objectarray.size; - for ( j = 0; j < objectarray_size; j++ ) - { - self.weaponobjectwatcherarray[ i ].objectarray = deleteweaponobject( self.weaponobjectwatcherarray[ i ], weapon ); - } - return; - i++; - } -} - -proximityweaponobjectdetonation( watcher ) //checked changed to match cerberus output dvar taken from beta dump -{ - self endon( "death" ); - self endon( "hacked" ); - self waittillnotmoving(); - if ( isDefined( watcher.activationdelay ) ) - { - wait watcher.activationdelay; - } - damagearea = spawn( "trigger_radius", self.origin + ( 0, 0, 0 - watcher.detonateradius ), level.aitriggerspawnflags | level.vehicletriggerspawnflags, watcher.detonateradius, watcher.detonateradius * 2 ); - damagearea enablelinkto(); - damagearea linkto( self ); - self thread deleteondeath( damagearea ); - up = anglesToUp( self.angles ); - traceorigin = self.origin + up; - while ( 1 ) - { - damagearea waittill( "trigger", ent ); - if ( getDvarInt( "scr_weaponobject_debug" ) != 1 ) - { - if ( isDefined( self.owner ) && ent == self.owner ) - { - continue; - } - if ( isDefined( self.owner ) && isvehicle( ent ) && isDefined( ent.owner ) && self.owner == ent.owner ) - { - continue; - } - if ( !friendlyfirecheck( self.owner, ent, 0 ) ) - { - continue; - } - } - if ( lengthsquared( ent getvelocity() ) < 10 && !isDefined( watcher.immediatedetonation ) ) - { - continue; - } - if ( !ent shouldaffectweaponobject( self, watcher ) ) - { - continue; - } - if ( self isstunned() ) - { - continue; - } - if ( isplayer( ent ) && !isalive( ent ) ) - { - continue; - } - if ( ent damageconetrace( traceorigin, self ) > 0 ) - { - break; - } - } - if ( isDefined( watcher.activatesound ) ) - { - self playsound( watcher.activatesound ); - } - if ( isDefined( watcher.activatefx ) ) - { - self setclientflag( 4 ); - } - ent thread deathdodger( watcher.detectiongraceperiod ); - wait watcher.detectiongraceperiod; - if ( isplayer( ent ) && ent hasperk( "specialty_delayexplosive" ) ) - { - wait getDvarFloat( "perk_delayExplosiveTime" ); - } - self maps/mp/_entityheadicons::setentityheadicon( "none" ); - self.origin = traceorigin; - if ( isDefined( self.owner ) && isplayer( self.owner ) ) - { - self [[ watcher.detonate ]]( self.owner ); - } - else - { - self [[ watcher.detonate ]](); - } -} - -shouldaffectweaponobject( object, watcher ) //checked matches cerberus output -{ - radius = getweaponexplosionradius( watcher.weapon ); - distancesqr = distancesquared( self.origin, object.origin ); - if ( ( radius * radius ) < distancesqr ) - { - return 0; - } - pos = self.origin + vectorScale( ( 0, 0, 1 ), 32 ); - if ( isDefined( watcher.ignoredirection ) ) - { - return 1; - } - dirtopos = pos - object.origin; - objectforward = anglesToForward( object.angles ); - dist = vectordot( dirtopos, objectforward ); - if ( dist < watcher.detectionmindist ) - { - return 0; - } - dirtopos = vectornormalize( dirtopos ); - dot = vectordot( dirtopos, objectforward ); - return dot > watcher.detectiondot; -} - -deathdodger( graceperiod ) //checked matches cerberus output -{ - self endon( "death" ); - self endon( "disconnect" ); - wait ( 0.2 + graceperiod ); - self notify( "death_dodger" ); -} - -deleteondeath( ent ) //checked matches cerberus output -{ - self waittill_any( "death", "hacked" ); - wait 0.05; - if ( isDefined( ent ) ) - { - ent delete(); - } -} - -testkillbrushonstationary( killbrusharray, player ) //checked changed to match cerberus output -{ - player endon( "disconnect" ); - self endon( "death" ); - self waittill( "stationary" ); - wait 0.1; - for ( i = 0; i < killbrusharray.size; i++ ) - { - if ( self istouching( killbrusharray[ i ] ) ) - { - if ( self.origin[ 2 ] > player.origin[ 2 ] ) - { - break; - } - if ( isDefined( self ) ) - { - self delete(); - } - return; - } - } -} - -deleteonkillbrush( player ) //checked changed to match cerberus output -{ - player endon( "disconnect" ); - self endon( "death" ); - self endon( "stationary" ); - killbrushes = getentarray( "trigger_hurt", "classname" ); - self thread testkillbrushonstationary( killbrushes, player ); - while ( 1 ) - { - for ( i = 0; i < killbrushes.size; i++ ) - { - if ( self istouching( killbrushes[ i ] ) ) - { - if ( self.origin[ 2 ] > player.origin[ 2 ] ) - { - break; - } - if ( isDefined( self ) ) - { - self delete(); - } - return; - } - } - wait 0.1; - } -} - -watchweaponobjectaltdetonation() //checked changed to match cerberus output -{ - self endon( "disconnect" ); - while ( 1 ) - { - self waittill( "alt_detonate" ); - if ( !isalive( self ) ) - { - continue; - } - for ( watcher = 0; watcher < self.weaponobjectwatcherarray.size; watcher++ ) - { - if ( self.weaponobjectwatcherarray[ watcher ].altdetonate ) - { - self.weaponobjectwatcherarray[ watcher ] detonateweaponobjectarray( 0 ); - } - } - } -} - -watchweaponobjectaltdetonate() //checked changed to match cerberus output -{ - self endon( "disconnect" ); - self endon( "detonated" ); - level endon( "game_ended" ); - buttontime = 0; - for ( ;; ) - { - self waittill( "doubletap_detonate" ); - if ( !isalive( self ) ) - { - continue; - } - self notify( "alt_detonate" ); - wait 0.05; - } -} - -watchweaponobjectdetonation() //checked matches cerberus output -{ - self endon( "disconnect" ); - while ( 1 ) - { - self waittill( "detonate" ); - if ( self isusingoffhand() ) - { - weap = self getcurrentoffhand(); - } - else - { - weap = self getcurrentweapon(); - } - watcher = getweaponobjectwatcherbyweapon( weap ); - if ( isDefined( watcher ) ) - { - watcher detonateweaponobjectarray( 0 ); - } - } -} - -deleteweaponobjectson() //checked changed to match cerberus output -{ - while ( 1 ) - { - msg = self waittill_any_return( "disconnect", "joined_team", "joined_spectators", "death" ); - if ( msg == "death" ) - { - continue; - } - if ( !isDefined( self.weaponobjectwatcherarray ) ) - { - return; - } - watchers = []; - for ( watcher = 0; watcher < self.weaponobjectwatcherarray.size; watcher++ ) - { - weaponobjectwatcher = spawnstruct(); - watchers[ watchers.size ] = weaponobjectwatcher; - weaponobjectwatcher.objectarray = []; - if ( isDefined( self.weaponobjectwatcherarray[ watcher ].objectarray ) ) - { - weaponobjectwatcher.objectarray = self.weaponobjectwatcherarray[ watcher ].objectarray; - } - } - wait 0.05; - for ( watcher = 0; watcher < watchers.size; watcher++ ) - { - watchers[ watcher ] deleteweaponobjectarray(); - } - if ( msg == "disconnect" ) - { - return; - } - } -} - -saydamaged( orig, amount ) //checked changed to match cerberus output -{ - /* + self.hackertrigger = spawn( "trigger_radius_use", triggerorigin, level.weaponobjects_hacker_trigger_width, level.weaponobjects_hacker_trigger_height ); /# - for ( i = 0; i < 60; i++ ) - { - print3d( orig, "damaged! " + amount ); - wait 0.05; + #/ - } - */ + self.hackertrigger sethintlowpriority( 1 ); + self.hackertrigger setcursorhint( "HINT_NOICON", self ); + self.hackertrigger setignoreentfortrigger( self ); + self.hackertrigger enablelinkto(); + self.hackertrigger linkto( self ); + + if ( isdefined( level.hackerhints[self.name] ) ) + self.hackertrigger sethintstring( level.hackerhints[self.name].hint ); + else + self.hackertrigger sethintstring( &"MP_GENERIC_HACKING" ); + + self.hackertrigger setperkfortrigger( "specialty_disarmexplosive" ); + self.hackertrigger thread hackertriggersetvisibility( self.owner ); + self thread hackerthink( self.hackertrigger, watcher ); } -showheadicon( trigger ) //checked changed to match cerberus output +hackerthink( trigger, watcher ) { - triggerdetectid = trigger.detectid; - useid = -1; - for ( index = 0; index < 4; index++ ) - { - detectid = self.bombsquadicons[ index ].detectid; - if ( detectid == triggerdetectid ) - { - return; - } - if ( detectid == "" ) - { - useid = index; - } - } - if ( useid < 0 ) - { - return; - } - self.bombsquadids[ triggerdetectid ] = 1; - self.bombsquadicons[ useid ].x = trigger.origin[ 0 ]; - self.bombsquadicons[ useid ].y = trigger.origin[ 1 ]; - self.bombsquadicons[ useid ].z = trigger.origin[ 2 ] + 24 + 128; - self.bombsquadicons[ useid ] fadeovertime( 0,25 ); - self.bombsquadicons[ useid ].alpha = 1; - self.bombsquadicons[ useid ].detectid = trigger.detectid; - while ( isalive( self ) && isDefined( trigger ) && self istouching( trigger ) ) - { - wait 0.05; - } - if ( !isDefined( self ) ) - { - return; - } - self.bombsquadicons[ useid ].detectid = ""; - self.bombsquadicons[ useid ] fadeovertime( 0,25 ); - self.bombsquadicons[ useid ].alpha = 0; - self.bombsquadids[ triggerdetectid ] = undefined; -} + self endon( "death" ); -friendlyfirecheck( owner, attacker, forcedfriendlyfirerule ) //checked changed to match cerberus output -{ - if ( !isDefined( owner ) ) - { - return 1; - } - if ( !level.teambased ) - { - return 1; - } - friendlyfirerule = level.friendlyfire; - if ( isDefined( forcedfriendlyfirerule ) ) - { - friendlyfirerule = forcedfriendlyfirerule; - } - if ( friendlyfirerule != 0 ) - { - return 1; - } - if ( attacker == owner ) - { - return 1; - } - if ( isplayer( attacker ) ) - { - if ( !isDefined( attacker.pers[ "team" ] ) ) - { - return 1; - } - if ( attacker.pers[ "team" ] != owner.pers[ "team" ] ) - { - return 1; - } - } - else if ( isai( attacker ) ) - { - if ( attacker.aiteam != owner.pers[ "team" ] ) - { - return 1; - } - } - else if ( isvehicle( attacker ) ) - { - if ( isDefined( attacker.owner ) && isplayer( attacker.owner ) ) - { - if ( attacker.owner.pers[ "team" ] != owner.pers[ "team" ] ) - { - return 1; - } - } - else - { - occupant_team = attacker maps/mp/_vehicles::vehicle_get_occupant_team(); - if ( occupant_team != owner.pers[ "team" ] ) - { - return 1; - } - } - } - return 0; -} + for (;;) + { + trigger waittill( "trigger", player, instant ); + + if ( !isdefined( instant ) && !trigger hackerresult( player, self.owner ) ) + continue; + + self.owner hackerremoveweapon( self ); + self.owner maps\mp\gametypes\_globallogic_audio::leaderdialogonplayer( "hacked_equip", "item_destroyed" ); + self.hacked = 1; + self setmissileowner( player ); + self setteam( player.pers["team"] ); + self.owner = player; + + if ( isweaponequipment( self.name ) || self.name == "proximity_grenade_mp" ) + { + maps\mp\_scoreevents::processscoreevent( "hacked", player ); + player addweaponstat( "pda_hack_mp", "CombatRecordStat", 1 ); + player maps\mp\_challenges::hackedordestroyedequipment(); + } + + if ( self.name == "satchel_charge_mp" && isdefined( player.lowermessage ) ) + { + player.lowermessage settext( &"PLATFORM_SATCHEL_CHARGE_DOUBLE_TAP" ); + player.lowermessage.alpha = 1; + player.lowermessage fadeovertime( 2.0 ); + player.lowermessage.alpha = 0; + } + + self notify( "hacked", player ); + level notify( "hacked", self, player ); + + if ( self.name == "camera_spike_mp" && isdefined( self.camerahead ) ) + self.camerahead notify( "hacked", player ); -onspawnhatchettrigger( watcher, player ) //checked changed to match cerberus output -{ - self endon( "death" ); - self setowner( player ); - self setteam( player.pers[ "team" ] ); - self.owner = player; - self.oldangles = self.angles; - self waittillnotmoving(); - waittillframeend; - if ( player.pers[ "team" ] == "spectator" ) - { - return; - } - triggerorigin = self.origin; - triggerparentent = undefined; - if ( isDefined( self.stucktoplayer ) ) - { - if ( isalive( self.stucktoplayer ) || !isDefined( self.stucktoplayer.body ) ) - { - if ( isalive( self.stucktoplayer ) ) - { - triggerparentent = self; - self unlink(); - self.angles = self.oldangles; - self launch( vectorScale( ( 1, 1, 1 ), 5 ) ); - self waittillnotmoving(); - waittillframeend; - } - else - { - triggerparentent = self.stucktoplayer; - } - } - else - { - triggerparentent = self.stucktoplayer.body; - } - } - if ( isDefined( triggerparentent ) ) - { - triggerorigin = triggerparentent.origin + vectorScale( ( 0, 0, 1 ), 10 ); - } - self.hatchetpickuptrigger = spawn( "trigger_radius", triggerorigin, 0, 50, 50 ); - self.hatchetpickuptrigger enablelinkto(); - self.hatchetpickuptrigger linkto( self ); - if ( isDefined( triggerparentent ) ) - { - self.hatchetpickuptrigger linkto( triggerparentent ); - } - self thread watchhatchettrigger( self.hatchetpickuptrigger, watcher.pickup, watcher.pickupsoundplayer, watcher.pickupsound ); - /* /# - thread switch_team( self, watcher.weapon, player ); + #/ - */ - self thread watchshutdown( player ); + + if ( isdefined( watcher.stun ) ) + { + self thread stunstart( watcher, 0.75 ); + wait 0.75; + } + else + wait 0.05; + + if ( isdefined( player ) && player.sessionstate == "playing" ) + player notify( "grenade_fire", self, self.name, 1 ); + else + watcher thread waitanddetonate( self, 0.0 ); + + return; + } } -watchhatchettrigger( trigger, callback, playersoundonuse, npcsoundonuse ) //checked changed to match cerberus output +hackerunfreezeplayer( player ) { - self endon( "delete" ); - self endon( "hacked" ); - while ( 1 ) - { - trigger waittill( "trigger", player ); - if ( !isalive( player ) ) - { - continue; - } - if ( !player isonground() ) - { - continue; - } - if ( isDefined( trigger.claimedby ) && player != trigger.claimedby ) - { - continue; - } - if ( !player hasweapon( self.name ) ) - { - continue; - } - curr_ammo = player getweaponammostock( "hatchet_mp" ); - maxammo = weaponmaxammo( "hatchet_mp" ); - if ( player.grenadetypeprimary == "hatchet_mp" ) - { - maxammo = player.grenadetypeprimarycount; - } - else if ( isDefined( player.grenadetypesecondary ) && player.grenadetypesecondary == "hatchet_mp" ) - { - maxammo = player.grenadetypesecondarycount; - } - if ( curr_ammo >= maxammo ) - { - continue; - } - if ( isDefined( playersoundonuse ) ) - { - player playlocalsound( playersoundonuse ); - } - if ( isDefined( npcsoundonuse ) ) - { - player playsound( npcsoundonuse ); - } - self thread [[ callback ]]( player ); - } + self endon( "hack_done" ); + + self waittill( "death" ); + + if ( isdefined( player ) ) + { + player freeze_player_controls( 0 ); + player enableweapons(); + } } -onspawnretrievableweaponobject( watcher, player ) //checked matches cerberus output +hackerresult( player, owner ) +{ + success = 1; + time = gettime(); + hacktime = getdvarfloat( "perk_disarmExplosiveTime" ); + + if ( !canhack( player, owner, 1 ) ) + return 0; + + self thread hackerunfreezeplayer( player ); + + while ( time + hacktime * 1000 > gettime() ) + { + if ( !canhack( player, owner, 0 ) ) + { + success = 0; + break; + } + + if ( !player usebuttonpressed() ) + { + success = 0; + break; + } + + if ( !isdefined( self ) ) + { + success = 0; + break; + } + + player freeze_player_controls( 1 ); + player disableweapons(); + + if ( !isdefined( self.progressbar ) ) + { + self.progressbar = player createprimaryprogressbar(); + self.progressbar.lastuserate = -1; + self.progressbar showelem(); + self.progressbar updatebar( 0.01, 1 / hacktime ); + self.progresstext = player createprimaryprogressbartext(); + self.progresstext settext( &"MP_HACKING" ); + self.progresstext showelem(); + player playlocalsound( "evt_hacker_hacking" ); + } + + wait 0.05; + } + + if ( isdefined( player ) ) + { + player freeze_player_controls( 0 ); + player enableweapons(); + } + + if ( isdefined( self.progressbar ) ) + { + self.progressbar destroyelem(); + self.progresstext destroyelem(); + } + + if ( isdefined( self ) ) + self notify( "hack_done" ); + + return success; +} + +canhack( player, owner, weapon_check ) +{ + if ( !isdefined( player ) ) + return false; + + if ( !isplayer( player ) ) + return false; + + if ( !isalive( player ) ) + return false; + + if ( !isdefined( owner ) ) + return false; + + if ( owner == player ) + return false; + + if ( level.teambased && player.team == owner.team ) + return false; + + if ( isdefined( player.isdefusing ) && player.isdefusing ) + return false; + + if ( isdefined( player.isplanting ) && player.isplanting ) + return false; + + if ( isdefined( player.proxbar ) && !player.proxbar.hidden ) + return false; + + if ( isdefined( player.revivingteammate ) && player.revivingteammate == 1 ) + return false; + + if ( !player isonground() ) + return false; + + if ( player isinvehicle() ) + return false; + + if ( player isweaponviewonlylinked() ) + return false; + + if ( !player hasperk( "specialty_disarmexplosive" ) ) + return false; + + if ( player isempjammed() ) + return false; + + if ( isdefined( player.laststand ) && player.laststand ) + return false; + + if ( weapon_check ) + { + if ( player isthrowinggrenade() ) + return false; + + if ( player isswitchingweapons() ) + return false; + + if ( player ismeleeing() ) + return false; + + weapon = player getcurrentweapon(); + + if ( !isdefined( weapon ) ) + return false; + + if ( weapon == "none" ) + return false; + + if ( isweaponequipment( weapon ) && player isfiring() ) + return false; + + if ( isweaponspecificuse( weapon ) ) + return false; + } + + return true; +} + +hackerremoveweapon( weapon ) +{ + for ( i = 0; i < self.weaponobjectwatcherarray.size; i++ ) + { + if ( self.weaponobjectwatcherarray[i].weapon != weapon.name ) + continue; + + objectarray_size = self.weaponobjectwatcherarray[i].objectarray.size; + + for ( j = 0; j < objectarray_size; j++ ) + self.weaponobjectwatcherarray[i].objectarray = deleteweaponobject( self.weaponobjectwatcherarray[i], weapon ); + + return; + } +} + +proximityweaponobjectdetonation( watcher ) +{ + self endon( "death" ); + self endon( "hacked" ); + self waittillnotmoving(); + + if ( isdefined( watcher.activationdelay ) ) + wait( watcher.activationdelay ); + + damagearea = spawn( "trigger_radius", self.origin + ( 0, 0, 0 - watcher.detonateradius ), level.aitriggerspawnflags | level.vehicletriggerspawnflags, watcher.detonateradius, watcher.detonateradius * 2 ); + damagearea enablelinkto(); + damagearea linkto( self ); + self thread deleteondeath( damagearea ); + up = anglestoup( self.angles ); + traceorigin = self.origin + up; + + while ( true ) + { + damagearea waittill( "trigger", ent ); + + if ( getdvarint( "scr_weaponobject_debug" ) != 1 ) + { + if ( isdefined( self.owner ) && ent == self.owner ) + continue; + + if ( isdefined( self.owner ) && isvehicle( ent ) && isdefined( ent.owner ) && self.owner == ent.owner ) + continue; + + if ( !friendlyfirecheck( self.owner, ent, 0 ) ) + continue; + } + + if ( lengthsquared( ent getvelocity() ) < 10 && !isdefined( watcher.immediatedetonation ) ) + continue; + + if ( !ent shouldaffectweaponobject( self, watcher ) ) + continue; + + if ( self isstunned() ) + continue; + + if ( isplayer( ent ) && !isalive( ent ) ) + continue; + + if ( ent damageconetrace( traceorigin, self ) > 0 ) + break; + } + + if ( isdefined( watcher.activatesound ) ) + self playsound( watcher.activatesound ); + + if ( isdefined( watcher.activatefx ) ) + self setclientflag( 4 ); + + ent thread deathdodger( watcher.detectiongraceperiod ); + wait( watcher.detectiongraceperiod ); + + if ( isplayer( ent ) && ent hasperk( "specialty_delayexplosive" ) ) + wait( getdvarfloat( "perk_delayExplosiveTime" ) ); + + self maps\mp\_entityheadicons::setentityheadicon( "none" ); + self.origin = traceorigin; + + if ( isdefined( self.owner ) && isplayer( self.owner ) ) + self [[ watcher.detonate ]]( self.owner ); + else + self [[ watcher.detonate ]](); +} + +shouldaffectweaponobject( object, watcher ) +{ + radius = getweaponexplosionradius( watcher.weapon ); + distancesqr = distancesquared( self.origin, object.origin ); + + if ( radius * radius < distancesqr ) + return 0; + + pos = self.origin + vectorscale( ( 0, 0, 1 ), 32.0 ); + + if ( isdefined( watcher.ignoredirection ) ) + return 1; + + dirtopos = pos - object.origin; + objectforward = anglestoforward( object.angles ); + dist = vectordot( dirtopos, objectforward ); + + if ( dist < watcher.detectionmindist ) + return 0; + + dirtopos = vectornormalize( dirtopos ); + dot = vectordot( dirtopos, objectforward ); + return dot > watcher.detectiondot; +} + +deathdodger( graceperiod ) +{ + self endon( "death" ); + self endon( "disconnect" ); + wait( 0.2 + graceperiod ); + self notify( "death_dodger" ); +} + +deleteondeath( ent ) +{ + self waittill_any( "death", "hacked" ); + wait 0.05; + + if ( isdefined( ent ) ) + ent delete(); +} + +testkillbrushonstationary( killbrusharray, player ) +{ + player endon( "disconnect" ); + self endon( "death" ); + + self waittill( "stationary" ); + + wait 0.1; + + for ( i = 0; i < killbrusharray.size; i++ ) + { + if ( self istouching( killbrusharray[i] ) ) + { + if ( self.origin[2] > player.origin[2] ) + break; + + if ( isdefined( self ) ) + self delete(); + + return; + } + } +} + +deleteonkillbrush( player ) +{ + player endon( "disconnect" ); + self endon( "death" ); + self endon( "stationary" ); + killbrushes = getentarray( "trigger_hurt", "classname" ); + self thread testkillbrushonstationary( killbrushes, player ); + + while ( true ) + { + for ( i = 0; i < killbrushes.size; i++ ) + { + if ( self istouching( killbrushes[i] ) ) + { + if ( self.origin[2] > player.origin[2] ) + break; + + if ( isdefined( self ) ) + self delete(); + + return; + } + } + + wait 0.1; + } +} + +watchweaponobjectaltdetonation() +{ + self endon( "disconnect" ); + + while ( true ) + { + self waittill( "alt_detonate" ); + + if ( !isalive( self ) ) + continue; + + for ( watcher = 0; watcher < self.weaponobjectwatcherarray.size; watcher++ ) + { + if ( self.weaponobjectwatcherarray[watcher].altdetonate ) + self.weaponobjectwatcherarray[watcher] detonateweaponobjectarray( 0 ); + } + } +} + +watchweaponobjectaltdetonate() +{ + self endon( "disconnect" ); + self endon( "detonated" ); + level endon( "game_ended" ); + buttontime = 0; + + for (;;) + { + self waittill( "doubletap_detonate" ); + + if ( !isalive( self ) ) + continue; + + self notify( "alt_detonate" ); + wait 0.05; + } +} + +watchweaponobjectdetonation() +{ + self endon( "disconnect" ); + + while ( true ) + { + self waittill( "detonate" ); + + if ( self isusingoffhand() ) + weap = self getcurrentoffhand(); + else + weap = self getcurrentweapon(); + + watcher = getweaponobjectwatcherbyweapon( weap ); + + if ( isdefined( watcher ) ) + watcher detonateweaponobjectarray( 0 ); + } +} + +deleteweaponobjectson() +{ + while ( true ) + { + msg = self waittill_any_return( "disconnect", "joined_team", "joined_spectators", "death" ); + + if ( msg == "death" ) + continue; + + if ( !isdefined( self.weaponobjectwatcherarray ) ) + return; + + watchers = []; + + for ( watcher = 0; watcher < self.weaponobjectwatcherarray.size; watcher++ ) + { + weaponobjectwatcher = spawnstruct(); + watchers[watchers.size] = weaponobjectwatcher; + weaponobjectwatcher.objectarray = []; + + if ( isdefined( self.weaponobjectwatcherarray[watcher].objectarray ) ) + weaponobjectwatcher.objectarray = self.weaponobjectwatcherarray[watcher].objectarray; + } + + wait 0.05; + + for ( watcher = 0; watcher < watchers.size; watcher++ ) + watchers[watcher] deleteweaponobjectarray(); + + if ( msg == "disconnect" ) + return; + } +} + +saydamaged( orig, amount ) { - self endon( "death" ); - self endon( "hacked" ); - if ( ishacked() ) - { - self thread watchshutdown( player ); - return; - } - self setowner( player ); - self setteam( player.pers[ "team" ] ); - self.owner = player; - self.oldangles = self.angles; - self waittillnotmoving(); - if ( isDefined( watcher.activationdelay ) ) - { - wait watcher.activationdelay; - } - waittillframeend; - if ( player.pers[ "team" ] == "spectator" ) - { - return; - } - triggerorigin = self.origin; - triggerparentent = undefined; - if ( isDefined( self.stucktoplayer ) ) - { - if ( isalive( self.stucktoplayer ) || !isDefined( self.stucktoplayer.body ) ) - { - triggerparentent = self.stucktoplayer; - } - else - { - triggerparentent = self.stucktoplayer.body; - } - } - if ( isDefined( triggerparentent ) ) - { - triggerorigin = triggerparentent.origin + vectorScale( ( 0, 0, 1 ), 10 ); - } - else - { - up = anglesToUp( self.angles ); - triggerorigin = self.origin + up; - } - self.pickuptrigger = spawn( "trigger_radius_use", triggerorigin ); - self.pickuptrigger sethintlowpriority( 1 ); - self.pickuptrigger setcursorhint( "HINT_NOICON", self ); - self.pickuptrigger enablelinkto(); - self.pickuptrigger linkto( self ); - self.pickuptrigger setinvisibletoall(); - self.pickuptrigger setvisibletoplayer( player ); - if ( isDefined( level.retrievehints[ watcher.name ] ) ) - { - self.pickuptrigger sethintstring( level.retrievehints[ watcher.name ].hint ); - } - else - { - self.pickuptrigger sethintstring( &"MP_GENERIC_PICKUP" ); - } - if ( level.teambased ) - { - self.pickuptrigger setteamfortrigger( player.pers[ "team" ] ); - } - else - { - self.pickuptrigger setteamfortrigger( "none" ); - } - if ( isDefined( triggerparentent ) ) - { - self.pickuptrigger linkto( triggerparentent ); - } - if ( watcher.enemydestroy ) - { - self.enemytrigger = spawn( "trigger_radius_use", triggerorigin ); - self.enemytrigger setcursorhint( "HINT_NOICON", self ); - self.enemytrigger enablelinkto(); - self.enemytrigger linkto( self ); - self.enemytrigger setinvisibletoplayer( player ); - if ( level.teambased ) - { - self.enemytrigger setexcludeteamfortrigger( player.team ); - self.enemytrigger.triggerteamignore = self.team; - } - if ( isDefined( level.destroyhints[ watcher.name ] ) ) - { - self.enemytrigger sethintstring( level.destroyhints[ watcher.name ].hint ); - } - else - { - self.enemytrigger sethintstring( &"MP_GENERIC_DESTROY" ); - } - self thread watchusetrigger( self.enemytrigger, watcher.ondestroyed ); - } - self thread watchusetrigger( self.pickuptrigger, watcher.pickup, watcher.pickupsoundplayer, watcher.pickupsound ); - /* /# - thread switch_team( self, watcher.weapon, player ); + for ( i = 0; i < 60; i++ ) + { + print3d( orig, "damaged! " + amount ); + wait 0.05; + } #/ - */ - if ( isDefined( watcher.pickup_trigger_listener ) ) - { - self thread [[ watcher.pickup_trigger_listener ]]( self.pickuptrigger, player ); - } - self thread watchshutdown( player ); } -watch_trigger_visibility( triggers, weap_name ) //checked partially changed to match cerberus output see info.md +showheadicon( trigger ) { - self notify( "watchTriggerVisibility" ); - self endon( "watchTriggerVisibility" ); - self endon( "death" ); - self endon( "hacked" ); - max_ammo = weaponmaxammo( weap_name ); - start_ammo = weaponstartammo( weap_name ); - ammo_to_check = 0; - while ( 1 ) - { - players = level.players; - for ( i = 0; i < players.size; i++ ) - { - if ( players[ i ] hasweapon( weap_name ) ) - { - ammo_to_check = max_ammo; - if ( self.owner == players[ i ] ) - { - curr_ammo = players[ i ] getweaponammostock( weap_name ) + players[ i ] getweaponammoclip( weap_name ); - if ( weap_name == "hatchet_mp" ) - { - curr_ammo = players[ i ] getweaponammostock( weap_name ); - } - if ( curr_ammo < ammo_to_check ) - { - triggers[ "owner_pickup" ] setvisibletoplayer( players[ i ] ); - triggers[ "enemy_pickup" ] setinvisibletoplayer( players[ i ] ); - } - else - { - triggers[ "owner_pickup" ] setinvisibletoplayer( players[ i ] ); - triggers[ "enemy_pickup" ] setinvisibletoplayer( players[ i ] ); - } - } - else - { - curr_ammo = players[ i ] getweaponammostock( weap_name ) + players[ i ] getweaponammoclip( weap_name ); - if ( weap_name == "hatchet_mp" ) - { - curr_ammo = players[ i ] getweaponammostock( weap_name ); - } - if ( curr_ammo < ammo_to_check ) - { - triggers[ "owner_pickup" ] setinvisibletoplayer( players[ i ] ); - triggers[ "enemy_pickup" ] setvisibletoplayer( players[ i ] ); - } - else - { - triggers[ "owner_pickup" ] setinvisibletoplayer( players[ i ] ); - triggers[ "enemy_pickup" ] setinvisibletoplayer( players[ i ] ); - } - } - } - else - { - triggers[ "owner_pickup" ] setinvisibletoplayer( players[ i ] ); - triggers[ "enemy_pickup" ] setinvisibletoplayer( players[ i ] ); - } - } - wait 0.05; - } + triggerdetectid = trigger.detectid; + useid = -1; + + for ( index = 0; index < 4; index++ ) + { + detectid = self.bombsquadicons[index].detectid; + + if ( detectid == triggerdetectid ) + return; + + if ( detectid == "" ) + useid = index; + } + + if ( useid < 0 ) + return; + + self.bombsquadids[triggerdetectid] = 1; + self.bombsquadicons[useid].x = trigger.origin[0]; + self.bombsquadicons[useid].y = trigger.origin[1]; + self.bombsquadicons[useid].z = trigger.origin[2] + 24 + 128; + self.bombsquadicons[useid] fadeovertime( 0.25 ); + self.bombsquadicons[useid].alpha = 1; + self.bombsquadicons[useid].detectid = trigger.detectid; + + while ( isalive( self ) && isdefined( trigger ) && self istouching( trigger ) ) + wait 0.05; + + if ( !isdefined( self ) ) + return; + + self.bombsquadicons[useid].detectid = ""; + self.bombsquadicons[useid] fadeovertime( 0.25 ); + self.bombsquadicons[useid].alpha = 0; + self.bombsquadids[triggerdetectid] = undefined; } -destroyent() //checked matches cerberus output +friendlyfirecheck( owner, attacker, forcedfriendlyfirerule ) { - self delete(); + if ( !isdefined( owner ) ) + return true; + + if ( !level.teambased ) + return true; + + friendlyfirerule = level.friendlyfire; + + if ( isdefined( forcedfriendlyfirerule ) ) + friendlyfirerule = forcedfriendlyfirerule; + + if ( friendlyfirerule != 0 ) + return true; + + if ( attacker == owner ) + return true; + + if ( isplayer( attacker ) ) + { + if ( !isdefined( attacker.pers["team"] ) ) + return true; + + if ( attacker.pers["team"] != owner.pers["team"] ) + return true; + } + else if ( isai( attacker ) ) + { + if ( attacker.aiteam != owner.pers["team"] ) + return true; + } + else if ( isvehicle( attacker ) ) + { + if ( isdefined( attacker.owner ) && isplayer( attacker.owner ) ) + { + if ( attacker.owner.pers["team"] != owner.pers["team"] ) + return true; + } + else + { + occupant_team = attacker maps\mp\_vehicles::vehicle_get_occupant_team(); + + if ( occupant_team != owner.pers["team"] ) + return true; + } + } + + return false; } -pickup( player ) //checked matches cerberus output +onspawnhatchettrigger( watcher, player ) { - if ( self.name != "hatchet_mp" && isDefined( self.owner ) && self.owner != player ) - { - return; - } - self notify( "picked_up" ); - self.playdialog = 0; - self destroyent(); - player giveweapon( self.name ); - clip_ammo = player getweaponammoclip( self.name ); - clip_max_ammo = weaponclipsize( self.name ); - if ( clip_ammo < clip_max_ammo ) - { - clip_ammo++; - } - player setweaponammoclip( self.name, clip_ammo ); -} + self endon( "death" ); + self setowner( player ); + self setteam( player.pers["team"] ); + self.owner = player; + self.oldangles = self.angles; + self waittillnotmoving(); + waittillframeend; -ondestroyed( attacker ) //checked matches cerberus output -{ - playfx( level._effect[ "tacticalInsertionFizzle" ], self.origin ); - self playsound( "dst_tac_insert_break" ); - self.owner maps/mp/gametypes/_globallogic_audio::leaderdialogonplayer( "equipment_destroyed", "item_destroyed" ); - self delete(); -} + if ( player.pers["team"] == "spectator" ) + return; -watchshutdown( player ) //checked matches cerberus output -{ - self waittill_any( "death", "hacked" ); - pickuptrigger = self.pickuptrigger; - hackertrigger = self.hackertrigger; - hatchetpickuptrigger = self.hatchetpickuptrigger; - enemytrigger = self.enemytrigger; - if ( isDefined( pickuptrigger ) ) - { - pickuptrigger delete(); - } - if ( isDefined( hackertrigger ) ) - { - if ( isDefined( hackertrigger.progressbar ) ) - { - hackertrigger.progressbar destroyelem(); - hackertrigger.progresstext destroyelem(); - } - hackertrigger delete(); - } - if ( isDefined( hatchetpickuptrigger ) ) - { - hatchetpickuptrigger delete(); - } - if ( isDefined( enemytrigger ) ) - { - enemytrigger delete(); - } -} + triggerorigin = self.origin; + triggerparentent = undefined; -watchusetrigger( trigger, callback, playersoundonuse, npcsoundonuse ) //checked changed to match cerberus output -{ - self endon( "delete" ); - self endon( "hacked" ); - while ( 1 ) - { - trigger waittill( "trigger", player ); - if ( !isalive( player ) ) - { - continue; - } - if ( !player isonground() ) - { - continue; - } - if ( isDefined( trigger.triggerteam ) && player.pers[ "team" ] != trigger.triggerteam ) - { - continue; - } - if ( isDefined( trigger.triggerteamignore ) && player.team == trigger.triggerteamignore ) - { - continue; - } - if ( isDefined( trigger.claimedby ) && player != trigger.claimedby ) - { - continue; - } - grenade = player.throwinggrenade; - isequipment = isweaponequipment( player getcurrentweapon() ); - if ( is_true( isequipment ) ) - { - grenade = 0; - } - if ( player usebuttonpressed() && !grenade && !player meleebuttonpressed() ) - { - if ( isDefined( playersoundonuse ) ) - { - player playlocalsound( playersoundonuse ); - } - if ( isDefined( npcsoundonuse ) ) - { - player playsound( npcsoundonuse ); - } - self thread [[ callback ]]( player ); - } - } -} + if ( isdefined( self.stucktoplayer ) ) + { + if ( isalive( self.stucktoplayer ) || !isdefined( self.stucktoplayer.body ) ) + { + if ( isalive( self.stucktoplayer ) ) + { + triggerparentent = self; + self unlink(); + self.angles = self.oldangles; + self launch( vectorscale( ( 1, 1, 1 ), 5.0 ) ); + self waittillnotmoving(); + waittillframeend; + } + else + triggerparentent = self.stucktoplayer; + } + else + triggerparentent = self.stucktoplayer.body; + } -createretrievablehint( name, hint ) //checked matches cerberus output -{ - retrievehint = spawnstruct(); - retrievehint.name = name; - retrievehint.hint = hint; - level.retrievehints[ name ] = retrievehint; -} + if ( isdefined( triggerparentent ) ) + triggerorigin = triggerparentent.origin + vectorscale( ( 0, 0, 1 ), 10.0 ); -createhackerhint( name, hint ) //checked matches cerberus output -{ - hackerhint = spawnstruct(); - hackerhint.name = name; - hackerhint.hint = hint; - level.hackerhints[ name ] = hackerhint; -} + self.hatchetpickuptrigger = spawn( "trigger_radius", triggerorigin, 0, 50, 50 ); + self.hatchetpickuptrigger enablelinkto(); + self.hatchetpickuptrigger linkto( self ); -createdestroyhint( name, hint ) //checked matches cerberus output -{ - destroyhint = spawnstruct(); - destroyhint.name = name; - destroyhint.hint = hint; - level.destroyhints[ name ] = destroyhint; -} + if ( isdefined( triggerparentent ) ) + self.hatchetpickuptrigger linkto( triggerparentent ); -attachreconmodel( modelname, owner ) //checked matches cerberus output -{ - 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 watchreconmodelfordeath( self ); - reconmodel thread resetreconmodelonevent( "joined_team", owner ); - reconmodel thread resetreconmodelonevent( "player_spawned", owner ); - self.reconmodelentity = reconmodel; -} - -resetreconmodelvisibility( owner ) //checked partially changed to match beta dump see info.md -{ - 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_detectexplosive" ) && !level.players[ i ] hasperk( "specialty_showenemyequipment" ) ) - { - i++; - continue; - } - if ( level.players[ i ].team == "spectator" ) - { - i++; - continue; - } - hasreconmodel = 0; - if ( level.players[ i ] hasperk( "specialty_detectexplosive" ) ) - { - switch( self.model_name ) - { - case "t6_wpn_c4_world_detect": - case "t6_wpn_claymore_world_detect": - hasreconmodel = 1; - break; - break; - default: - break; - } - if ( level.players[ i ] hasperk( "specialty_showenemyequipment" ) ) - { - switch( self.model_name ) - { - case "t5_weapon_scrambler_world_detect": - case "t6_wpn_bouncing_betty_world_detect": - case "t6_wpn_c4_world_detect": - case "t6_wpn_claymore_world_detect": - case "t6_wpn_motion_sensor_world_detect": - case "t6_wpn_tac_insert_detect": - case "t6_wpn_taser_mine_world_detect": - case "t6_wpn_trophy_system_world_detect": - hasreconmodel = 1; - break; - default: - break; - } - if ( !hasreconmodel ) - { - i++; - 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 ] ); - } - } - } - i++; - } -} - -watchreconmodelfordeath( parentent ) //checked changed to match cerberus output -{ - self endon( "death" ); - parentent waittill_any( "death", "hacked" ); - self delete(); -} - -resetreconmodelonevent( eventname, owner ) //checked changed to match cerberus output -{ - self endon( "death" ); - for ( ;; ) - { - level waittill( eventname, newowner ); - if ( isDefined( newowner ) ) - { - owner = newowner; - } - self resetreconmodelvisibility( owner ); - } -} - -switch_team( entity, weapon_name, owner ) //checked changed to match cerberus output -{ - /* + self thread watchhatchettrigger( self.hatchetpickuptrigger, watcher.pickup, watcher.pickupsoundplayer, watcher.pickupsound ); /# - self notify( "stop_disarmthink" ); - self endon( "stop_disarmthink" ); - self endon( "death" ); - setdvar( "scr_switch_team", "" ); - while ( 1 ) - { - wait 0.5; - devgui_int = getDvarInt( "scr_switch_team" ); - if ( devgui_int != 0 ) - { - team = "autoassign"; - player = maps/mp/gametypes/_dev::getormakebot( team ); - if ( !isDefined( player ) ) - { - println( "Could not add test client" ); - wait 1; - } - entity.owner hackerremoveweapon( entity ); - entity.hacked = 1; - entity setowner( player ); - entity setteam( player.pers[ "team" ] ); - entity.owner = player; - entity notify( "hacked", player ); - level notify( "hacked", entity, player ); - if ( entity.name == "camera_spike_mp" && isDefined( entity.camerahead ) ) - { - entity.camerahead notify( "hacked" ); - } - wait 0.05; - if ( isDefined( player ) && player.sessionstate == "playing" ) - { - player notify( "grenade_fire", self, self.name ); - } - setdvar( "scr_switch_team", "0" ); - } + thread switch_team( self, watcher.weapon, player ); #/ - } - */ + self thread watchshutdown( player ); } +watchhatchettrigger( trigger, callback, playersoundonuse, npcsoundonuse ) +{ + self endon( "delete" ); + self endon( "hacked" ); + + while ( true ) + { + trigger waittill( "trigger", player ); + + if ( !isalive( player ) ) + continue; + + if ( !player isonground() ) + continue; + + if ( isdefined( trigger.claimedby ) && player != trigger.claimedby ) + continue; + + if ( !player hasweapon( self.name ) ) + continue; + + curr_ammo = player getweaponammostock( "hatchet_mp" ); + maxammo = weaponmaxammo( "hatchet_mp" ); + + if ( player.grenadetypeprimary == "hatchet_mp" ) + maxammo = player.grenadetypeprimarycount; + else if ( isdefined( player.grenadetypesecondary ) && player.grenadetypesecondary == "hatchet_mp" ) + maxammo = player.grenadetypesecondarycount; + + if ( curr_ammo >= maxammo ) + continue; + + if ( isdefined( playersoundonuse ) ) + player playlocalsound( playersoundonuse ); + + if ( isdefined( npcsoundonuse ) ) + player playsound( npcsoundonuse ); + + self thread [[ callback ]]( player ); + } +} + +onspawnretrievableweaponobject( watcher, player ) +{ + self endon( "death" ); + self endon( "hacked" ); + + if ( ishacked() ) + { + self thread watchshutdown( player ); + return; + } + + self setowner( player ); + self setteam( player.pers["team"] ); + self.owner = player; + self.oldangles = self.angles; + self waittillnotmoving(); + + if ( isdefined( watcher.activationdelay ) ) + wait( watcher.activationdelay ); + + waittillframeend; + + if ( player.pers["team"] == "spectator" ) + return; + + triggerorigin = self.origin; + triggerparentent = undefined; + + if ( isdefined( self.stucktoplayer ) ) + { + if ( isalive( self.stucktoplayer ) || !isdefined( self.stucktoplayer.body ) ) + triggerparentent = self.stucktoplayer; + else + triggerparentent = self.stucktoplayer.body; + } + + if ( isdefined( triggerparentent ) ) + triggerorigin = triggerparentent.origin + vectorscale( ( 0, 0, 1 ), 10.0 ); + else + { + up = anglestoup( self.angles ); + triggerorigin = self.origin + up; + } + + self.pickuptrigger = spawn( "trigger_radius_use", triggerorigin ); + self.pickuptrigger sethintlowpriority( 1 ); + self.pickuptrigger setcursorhint( "HINT_NOICON", self ); + self.pickuptrigger enablelinkto(); + self.pickuptrigger linkto( self ); + self.pickuptrigger setinvisibletoall(); + self.pickuptrigger setvisibletoplayer( player ); + + if ( isdefined( level.retrievehints[watcher.name] ) ) + self.pickuptrigger sethintstring( level.retrievehints[watcher.name].hint ); + else + self.pickuptrigger sethintstring( &"MP_GENERIC_PICKUP" ); + + if ( level.teambased ) + self.pickuptrigger setteamfortrigger( player.pers["team"] ); + else + self.pickuptrigger setteamfortrigger( "none" ); + + if ( isdefined( triggerparentent ) ) + self.pickuptrigger linkto( triggerparentent ); + + if ( watcher.enemydestroy ) + { + self.enemytrigger = spawn( "trigger_radius_use", triggerorigin ); + self.enemytrigger setcursorhint( "HINT_NOICON", self ); + self.enemytrigger enablelinkto(); + self.enemytrigger linkto( self ); + self.enemytrigger setinvisibletoplayer( player ); + + if ( level.teambased ) + { + self.enemytrigger setexcludeteamfortrigger( player.team ); + self.enemytrigger.triggerteamignore = self.team; + } + + if ( isdefined( level.destroyhints[watcher.name] ) ) + self.enemytrigger sethintstring( level.destroyhints[watcher.name].hint ); + else + self.enemytrigger sethintstring( &"MP_GENERIC_DESTROY" ); + + self thread watchusetrigger( self.enemytrigger, watcher.ondestroyed ); + } + + self thread watchusetrigger( self.pickuptrigger, watcher.pickup, watcher.pickupsoundplayer, watcher.pickupsound ); +/# + thread switch_team( self, watcher.weapon, player ); +#/ + + if ( isdefined( watcher.pickup_trigger_listener ) ) + self thread [[ watcher.pickup_trigger_listener ]]( self.pickuptrigger, player ); + + self thread watchshutdown( player ); +} + +watch_trigger_visibility( triggers, weap_name ) +{ + self notify( "watchTriggerVisibility" ); + self endon( "watchTriggerVisibility" ); + self endon( "death" ); + self endon( "hacked" ); + max_ammo = weaponmaxammo( weap_name ); + start_ammo = weaponstartammo( weap_name ); + ammo_to_check = 0; + + while ( true ) + { + players = level.players; + + for ( i = 0; i < players.size; i++ ) + { + if ( players[i] hasweapon( weap_name ) ) + { + ammo_to_check = max_ammo; + + if ( self.owner == players[i] ) + { + curr_ammo = players[i] getweaponammostock( weap_name ) + players[i] getweaponammoclip( weap_name ); + + if ( weap_name == "hatchet_mp" ) + curr_ammo = players[i] getweaponammostock( weap_name ); + + if ( curr_ammo < ammo_to_check ) + { + triggers["owner_pickup"] setvisibletoplayer( players[i] ); + triggers["enemy_pickup"] setinvisibletoplayer( players[i] ); + } + else + { + triggers["owner_pickup"] setinvisibletoplayer( players[i] ); + triggers["enemy_pickup"] setinvisibletoplayer( players[i] ); + } + } + else + { + curr_ammo = players[i] getweaponammostock( weap_name ) + players[i] getweaponammoclip( weap_name ); + + if ( weap_name == "hatchet_mp" ) + curr_ammo = players[i] getweaponammostock( weap_name ); + + if ( curr_ammo < ammo_to_check ) + { + triggers["owner_pickup"] setinvisibletoplayer( players[i] ); + triggers["enemy_pickup"] setvisibletoplayer( players[i] ); + } + else + { + triggers["owner_pickup"] setinvisibletoplayer( players[i] ); + triggers["enemy_pickup"] setinvisibletoplayer( players[i] ); + } + } + + continue; + } + + triggers["owner_pickup"] setinvisibletoplayer( players[i] ); + triggers["enemy_pickup"] setinvisibletoplayer( players[i] ); + } + + wait 0.05; + } +} + +destroyent() +{ + self delete(); +} + +pickup( player ) +{ + if ( self.name != "hatchet_mp" && isdefined( self.owner ) && self.owner != player ) + return; + + self notify( "picked_up" ); + self.playdialog = 0; + self destroyent(); + player giveweapon( self.name ); + clip_ammo = player getweaponammoclip( self.name ); + clip_max_ammo = weaponclipsize( self.name ); + + if ( clip_ammo < clip_max_ammo ) + clip_ammo++; + + player setweaponammoclip( self.name, clip_ammo ); +} + +ondestroyed( 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" ); + self delete(); +} + +watchshutdown( player ) +{ + self waittill_any( "death", "hacked" ); + pickuptrigger = self.pickuptrigger; + hackertrigger = self.hackertrigger; + hatchetpickuptrigger = self.hatchetpickuptrigger; + enemytrigger = self.enemytrigger; + + if ( isdefined( pickuptrigger ) ) + pickuptrigger delete(); + + if ( isdefined( hackertrigger ) ) + { + if ( isdefined( hackertrigger.progressbar ) ) + { + hackertrigger.progressbar destroyelem(); + hackertrigger.progresstext destroyelem(); + } + + hackertrigger delete(); + } + + if ( isdefined( hatchetpickuptrigger ) ) + hatchetpickuptrigger delete(); + + if ( isdefined( enemytrigger ) ) + enemytrigger delete(); +} + +watchusetrigger( trigger, callback, playersoundonuse, npcsoundonuse ) +{ + self endon( "delete" ); + self endon( "hacked" ); + + while ( true ) + { + trigger waittill( "trigger", player ); + + if ( !isalive( player ) ) + continue; + + if ( !player isonground() ) + continue; + + if ( isdefined( trigger.triggerteam ) && player.pers["team"] != trigger.triggerteam ) + continue; + + if ( isdefined( trigger.triggerteamignore ) && player.team == trigger.triggerteamignore ) + continue; + + if ( isdefined( trigger.claimedby ) && player != trigger.claimedby ) + continue; + + grenade = player.throwinggrenade; + isequipment = isweaponequipment( player getcurrentweapon() ); + + if ( isdefined( isequipment ) && isequipment ) + grenade = 0; + + if ( player usebuttonpressed() && !grenade && !player meleebuttonpressed() ) + { + if ( isdefined( playersoundonuse ) ) + player playlocalsound( playersoundonuse ); + + if ( isdefined( npcsoundonuse ) ) + player playsound( npcsoundonuse ); + + self thread [[ callback ]]( player ); + } + } +} + +createretrievablehint( name, hint ) +{ + retrievehint = spawnstruct(); + retrievehint.name = name; + retrievehint.hint = hint; + level.retrievehints[name] = retrievehint; +} + +createhackerhint( name, hint ) +{ + hackerhint = spawnstruct(); + hackerhint.name = name; + hackerhint.hint = hint; + level.hackerhints[name] = hackerhint; +} + +createdestroyhint( name, hint ) +{ + destroyhint = spawnstruct(); + destroyhint.name = name; + destroyhint.hint = hint; + level.destroyhints[name] = destroyhint; +} + +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 watchreconmodelfordeath( self ); + reconmodel thread resetreconmodelonevent( "joined_team", owner ); + reconmodel thread resetreconmodelonevent( "player_spawned", owner ); + self.reconmodelentity = reconmodel; +} + +resetreconmodelvisibility( owner ) +{ + 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_detectexplosive" ) && !level.players[i] hasperk( "specialty_showenemyequipment" ) ) + continue; + + if ( level.players[i].team == "spectator" ) + continue; + + hasreconmodel = 0; + + if ( level.players[i] hasperk( "specialty_detectexplosive" ) ) + { + switch ( self.model_name ) + { + case "t6_wpn_claymore_world_detect": + case "t6_wpn_c4_world_detect": + hasreconmodel = 1; + break; + default: + break; + } + } + + if ( level.players[i] hasperk( "specialty_showenemyequipment" ) ) + { + switch ( self.model_name ) + { + case "t6_wpn_trophy_system_world_detect": + case "t6_wpn_taser_mine_world_detect": + case "t6_wpn_tac_insert_detect": + case "t6_wpn_motion_sensor_world_detect": + case "t6_wpn_claymore_world_detect": + case "t6_wpn_c4_world_detect": + case "t6_wpn_bouncing_betty_world_detect": + case "t5_weapon_scrambler_world_detect": + hasreconmodel = 1; + break; + default: + break; + } + } + + if ( !hasreconmodel ) + 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] ); + } +} + +watchreconmodelfordeath( parentent ) +{ + self endon( "death" ); + parentent waittill_any( "death", "hacked" ); + self delete(); +} + +resetreconmodelonevent( eventname, owner ) +{ + self endon( "death" ); + + for (;;) + { + level waittill( eventname, newowner ); + + if ( isdefined( newowner ) ) + owner = newowner; + + self resetreconmodelvisibility( owner ); + } +} + +switch_team( entity, weapon_name, owner ) +{ +/# + self notify( "stop_disarmthink" ); + self endon( "stop_disarmthink" ); + self endon( "death" ); + setdvar( "scr_switch_team", "" ); + + while ( true ) + { + wait 0.5; + devgui_int = getdvarint( "scr_switch_team" ); + + if ( devgui_int != 0 ) + { + team = "autoassign"; + player = maps\mp\gametypes\_dev::getormakebot( team ); + + if ( !isdefined( player ) ) + { + println( "Could not add test client" ); + wait 1; + continue; + } + + entity.owner hackerremoveweapon( entity ); + entity.hacked = 1; + entity setowner( player ); + entity setteam( player.pers["team"] ); + entity.owner = player; + entity notify( "hacked", player ); + level notify( "hacked", entity, player ); + + if ( entity.name == "camera_spike_mp" && isdefined( entity.camerahead ) ) + entity.camerahead notify( "hacked", player ); + + wait 0.05; + + if ( isdefined( player ) && player.sessionstate == "playing" ) + player notify( "grenade_fire", self, self.name ); + + setdvar( "scr_switch_team", "0" ); + } + } +#/ +} diff --git a/Multiplayer Core/patch_mp/maps/mp/gametypes/_weapons.gsc b/Multiplayer Core/patch_mp/maps/mp/gametypes/_weapons.gsc index ebcdc5d..bfc8775 100644 --- a/Multiplayer Core/patch_mp/maps/mp/gametypes/_weapons.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/gametypes/_weapons.gsc @@ -1,2099 +1,2000 @@ -//checked includes changed to match cerberus output -#include maps/mp/gametypes/_gameobjects; -#include maps/mp/gametypes/_shellshock; -#include maps/mp/killstreaks/_dogs; -#include maps/mp/gametypes/_globallogic_utils; -#include maps/mp/_scoreevents; -#include maps/mp/_tabun; -#include maps/mp/killstreaks/_supplydrop; -#include maps/mp/_challenges; -#include maps/mp/gametypes/_weapons; -#include maps/mp/killstreaks/_killstreak_weapons; -#include maps/mp/gametypes/_class; -#include maps/mp/_bb; -#include maps/mp/_hacker_tool; -#include maps/mp/_riotshield; -#include maps/mp/_satchel_charge; -#include maps/mp/_ballistic_knife; -#include maps/mp/_trophy_system; -#include maps/mp/_bouncingbetty; -#include maps/mp/_proximity_grenade; -#include maps/mp/_sticky_grenade; -#include maps/mp/_explosive_bolt; -#include maps/mp/_scrambler; -#include maps/mp/_tacticalinsertion; -#include maps/mp/_sensor_grenade; -#include maps/mp/_acousticsensor; -#include maps/mp/_heatseekingmissile; -#include maps/mp/_smokegrenade; -#include maps/mp/gametypes/_weaponobjects; -#include maps/mp/_entityheadicons; -#include maps/mp/_empgrenade; -#include maps/mp/_flashgrenades; -#include maps/mp/gametypes/_weapon_utils; -#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() { - precacheitem( "knife_mp" ); - precacheitem( "knife_held_mp" ); - precacheitem( "dogs_mp" ); - precacheitem( "dog_bite_mp" ); - precacheitem( "explosive_bolt_mp" ); - precachemodel( "t6_wpn_claymore_world_detect" ); - precachemodel( "t6_wpn_c4_world_detect" ); - precachemodel( "t5_weapon_scrambler_world_detect" ); - precachemodel( "t6_wpn_tac_insert_detect" ); - precachemodel( "t6_wpn_taser_mine_world_detect" ); - precachemodel( "t6_wpn_motion_sensor_world_detect" ); - precachemodel( "t6_wpn_trophy_system_world_detect" ); - precachemodel( "t6_wpn_bouncing_betty_world_detect" ); - precachemodel( "t6_wpn_tac_insert_world" ); - precachemodel( "t6_wpn_shield_stow_world" ); - precachemodel( "t6_wpn_shield_carry_world" ); - precachemodel( "t5_weapon_camera_head_world" ); - precacheitem( "scavenger_item_mp" ); - precacheitem( "scavenger_item_hack_mp" ); - precacheshader( "hud_scavenger_pickup" ); - precacheshellshock( "default" ); - precacheshellshock( "concussion_grenade_mp" ); - precacheshellshock( "tabun_gas_mp" ); - precacheshellshock( "tabun_gas_nokick_mp" ); - precacheshellshock( "proximity_grenade" ); - precacheshellshock( "proximity_grenade_exit" ); - level.missileentities = []; - level.hackertooltargets = []; - level.missileduddeletedelay = getdvarintdefault( "scr_missileDudDeleteDelay", 3 ); - thread maps/mp/_flashgrenades::main(); - thread maps/mp/_empgrenade::init(); - thread maps/mp/_entityheadicons::init(); - if ( !isDefined( level.roundstartexplosivedelay ) ) - { - level.roundstartexplosivedelay = 0; - } - level thread onplayerconnect(); - maps/mp/gametypes/_weaponobjects::init(); - maps/mp/_smokegrenade::init(); - maps/mp/_heatseekingmissile::init(); - maps/mp/_acousticsensor::init(); - maps/mp/_sensor_grenade::init(); - maps/mp/_tacticalinsertion::init(); - maps/mp/_scrambler::init(); - maps/mp/_explosive_bolt::init(); - maps/mp/_sticky_grenade::init(); - maps/mp/_proximity_grenade::init(); - maps/mp/_bouncingbetty::init(); - maps/mp/_trophy_system::init(); - maps/mp/_ballistic_knife::init(); - maps/mp/_satchel_charge::init(); - maps/mp/_riotshield::init(); - maps/mp/_hacker_tool::init(); + precacheitem( "knife_mp" ); + precacheitem( "knife_held_mp" ); + precacheitem( "dogs_mp" ); + precacheitem( "dog_bite_mp" ); + precacheitem( "explosive_bolt_mp" ); + precachemodel( "t6_wpn_claymore_world_detect" ); + precachemodel( "t6_wpn_c4_world_detect" ); + precachemodel( "t5_weapon_scrambler_world_detect" ); + precachemodel( "t6_wpn_tac_insert_detect" ); + precachemodel( "t6_wpn_taser_mine_world_detect" ); + precachemodel( "t6_wpn_motion_sensor_world_detect" ); + precachemodel( "t6_wpn_trophy_system_world_detect" ); + precachemodel( "t6_wpn_bouncing_betty_world_detect" ); + precachemodel( "t6_wpn_tac_insert_world" ); + precachemodel( "t6_wpn_shield_stow_world" ); + precachemodel( "t6_wpn_shield_carry_world" ); + precachemodel( "t5_weapon_camera_head_world" ); + precacheitem( "scavenger_item_mp" ); + precacheitem( "scavenger_item_hack_mp" ); + precacheshader( "hud_scavenger_pickup" ); + precacheshellshock( "default" ); + precacheshellshock( "concussion_grenade_mp" ); + precacheshellshock( "tabun_gas_mp" ); + precacheshellshock( "tabun_gas_nokick_mp" ); + precacheshellshock( "proximity_grenade" ); + precacheshellshock( "proximity_grenade_exit" ); + level.missileentities = []; + level.hackertooltargets = []; + level.missileduddeletedelay = getdvarintdefault( "scr_missileDudDeleteDelay", 3 ); + thread maps\mp\_flashgrenades::main(); + thread maps\mp\_empgrenade::init(); + thread maps\mp\_entityheadicons::init(); + + if ( !isdefined( level.roundstartexplosivedelay ) ) + level.roundstartexplosivedelay = 0; + + level thread onplayerconnect(); + maps\mp\gametypes\_weaponobjects::init(); + maps\mp\_smokegrenade::init(); + maps\mp\_heatseekingmissile::init(); + maps\mp\_acousticsensor::init(); + maps\mp\_sensor_grenade::init(); + maps\mp\_tacticalinsertion::init(); + maps\mp\_scrambler::init(); + maps\mp\_explosive_bolt::init(); + maps\mp\_sticky_grenade::init(); + maps\mp\_proximity_grenade::init(); + maps\mp\_bouncingbetty::init(); + maps\mp\_trophy_system::init(); + maps\mp\_ballistic_knife::init(); + maps\mp\_satchel_charge::init(); + maps\mp\_riotshield::init(); + maps\mp\_hacker_tool::init(); } -onplayerconnect() //checked matches cerberus output +onplayerconnect() { - for ( ;; ) - { - level waittill( "connecting", player ); - player.usedweapons = 0; - player.lastfiretime = 0; - player.hits = 0; - player scavenger_hud_create(); - player thread onplayerspawned(); - } + for (;;) + { + level waittill( "connecting", player ); + + player.usedweapons = 0; + player.lastfiretime = 0; + player.hits = 0; + player scavenger_hud_create(); + player thread onplayerspawned(); + } } -onplayerspawned() //checked matches cerberus output +onplayerspawned() { - self endon( "disconnect" ); - for ( ;; ) - { - self waittill( "spawned_player" ); - self.concussionendtime = 0; - self.scavenged = 0; - self.hasdonecombat = 0; - self.shielddamageblocked = 0; - self thread watchweaponusage(); - self thread watchgrenadeusage(); - self thread watchmissileusage(); - self thread watchweaponchange(); - self thread watchturretuse(); - self thread watchriotshielduse(); - self thread trackweapon(); - self.droppeddeathweapon = undefined; - self.tookweaponfrom = []; - self.pickedupweaponkills = []; - self thread updatestowedweapon(); - } + self endon( "disconnect" ); + + for (;;) + { + self waittill( "spawned_player" ); + + self.concussionendtime = 0; + self.scavenged = 0; + self.hasdonecombat = 0; + self.shielddamageblocked = 0; + self thread watchweaponusage(); + self thread watchgrenadeusage(); + self thread watchmissileusage(); + self thread watchweaponchange(); + self thread watchturretuse(); + self thread watchriotshielduse(); + self thread trackweapon(); + self.droppeddeathweapon = undefined; + self.tookweaponfrom = []; + self.pickedupweaponkills = []; + self thread updatestowedweapon(); + } } -watchturretuse() //checked matches cerberus output +watchturretuse() { - self endon( "death" ); - self endon( "disconnect" ); - while ( 1 ) - { - self waittill( "turretownerchange", turret ); - self thread watchfortowfire( turret ); - } + self endon( "death" ); + self endon( "disconnect" ); + + while ( true ) + { + self waittill( "turretownerchange", turret ); + + self thread watchfortowfire( turret ); + } } -watchfortowfire( turret ) //checked matches cerberus output +watchfortowfire( turret ) { - self endon( "death" ); - self endon( "disconnect" ); - self endon( "turretownerchange" ); - while ( 1 ) - { - self waittill( "turret_tow_fire" ); - self thread watchmissleunlink( turret ); - self waittill( "turret_tow_unlink" ); - } + self endon( "death" ); + self endon( "disconnect" ); + self endon( "turretownerchange" ); + + while ( true ) + { + self waittill( "turret_tow_fire" ); + + self thread watchmissleunlink( turret ); + + self waittill( "turret_tow_unlink" ); + } } -watchmissleunlink( turret ) //checked matches cerberus output +watchmissleunlink( turret ) { - self endon( "death" ); - self endon( "disconnect" ); - self endon( "turretownerchange" ); - self waittill( "turret_tow_unlink" ); - self relinktoturret( turret ); + self endon( "death" ); + self endon( "disconnect" ); + self endon( "turretownerchange" ); + + self waittill( "turret_tow_unlink" ); + + self relinktoturret( turret ); } -watchweaponchange() //checked changed to match cerberus output +watchweaponchange() { - self endon( "death" ); - self endon( "disconnect" ); - self.lastdroppableweapon = self getcurrentweapon(); - self.hitsthismag = []; - weapon = self getcurrentweapon(); - if ( isprimaryweapon( weapon ) && !isDefined( self.hitsthismag[ weapon ] ) ) - { - self.hitsthismag[ weapon ] = weaponclipsize( weapon ); - } - self.lastweaponchange = 0; - while ( 1 ) - { - previous_weapon = self getcurrentweapon(); - self waittill( "weapon_change", newweapon ); - if ( maydropweapon( newweapon ) ) - { - self.lastdroppableweapon = newweapon; - self.lastweaponchange = getTime(); - } - if ( newweapon != "none" ) - { - if ( !isprimaryweapon( newweapon ) || issidearm( newweapon ) && !isDefined( self.hitsthismag[ newweapon ] ) ) - { - self.hitsthismag[ newweapon ] = weaponclipsize( newweapon ); - } - } - if ( doesweaponreplacespawnweapon( self.spawnweapon, newweapon ) ) - { - self.spawnweapon = newweapon; - self.pers[ "spawnWeapon" ] = newweapon; - } - } + self endon( "death" ); + self endon( "disconnect" ); + self.lastdroppableweapon = self getcurrentweapon(); + self.hitsthismag = []; + weapon = self getcurrentweapon(); + + if ( isprimaryweapon( weapon ) && !isdefined( self.hitsthismag[weapon] ) ) + self.hitsthismag[weapon] = weaponclipsize( weapon ); + + self.lastweaponchange = 0; + + while ( true ) + { + previous_weapon = self getcurrentweapon(); + + self waittill( "weapon_change", newweapon ); + + if ( maydropweapon( newweapon ) ) + { + self.lastdroppableweapon = newweapon; + self.lastweaponchange = gettime(); + } + + if ( newweapon != "none" ) + { + if ( ( isprimaryweapon( newweapon ) || issidearm( newweapon ) ) && !isdefined( self.hitsthismag[newweapon] ) ) + self.hitsthismag[newweapon] = weaponclipsize( newweapon ); + } + + if ( doesweaponreplacespawnweapon( self.spawnweapon, newweapon ) ) + { + self.spawnweapon = newweapon; + self.pers["spawnWeapon"] = newweapon; + } + } } -watchriotshielduse() //checked matches cerberus output +watchriotshielduse() { - self endon( "death" ); - self endon( "disconnect" ); - self thread maps/mp/_riotshield::trackriotshield(); - for ( ;; ) - { - self waittill( "raise_riotshield" ); - self thread maps/mp/_riotshield::startriotshielddeploy(); - } + self endon( "death" ); + self endon( "disconnect" ); + self thread maps\mp\_riotshield::trackriotshield(); + + for (;;) + { + self waittill( "raise_riotshield" ); + + self thread maps\mp\_riotshield::startriotshielddeploy(); + } } -updatelastheldweapontimings( newtime ) //checked matches cerberus output +updatelastheldweapontimings( newtime ) { - if ( isDefined( self.currentweapon ) && isDefined( self.currentweaponstarttime ) ) - { - totaltime = int( ( newtime - self.currentweaponstarttime ) / 1000 ); - if ( totaltime > 0 ) - { - self addweaponstat( self.currentweapon, "timeUsed", totaltime ); - self.currentweaponstarttime = newtime; - } - } + if ( isdefined( self.currentweapon ) && isdefined( self.currentweaponstarttime ) ) + { + totaltime = int( ( newtime - self.currentweaponstarttime ) / 1000 ); + + if ( totaltime > 0 ) + { + self addweaponstat( self.currentweapon, "timeUsed", totaltime ); + self.currentweaponstarttime = newtime; + } + } } -updateweapontimings( newtime ) //checked changed to match beta dump +updateweapontimings( newtime ) { - if ( self is_bot() ) - { - return; - } - updatelastheldweapontimings( newtime ); - if ( !isDefined( self.staticweaponsstarttime ) ) - { - return; - } - totaltime = int( ( newtime - self.staticweaponsstarttime ) / 1000 ); - if ( totaltime < 0 ) - { - return; - } - self.staticweaponsstarttime = newtime; - if ( isDefined( self.weapon_array_grenade ) ) - { - for(i = 0; i < self.weapon_array_grenade.size; i++) - { - self addweaponstat( self.weapon_array_grenade[ i ], "timeUsed", totaltime ); - } - } - if ( isDefined( self.weapon_array_inventory ) ) - { - for(i = 0; i < self.weapon_array_inventory.size; i++) - { - self addweaponstat( self.weapon_array_inventory[ i ], "timeUsed", totaltime ); - } - } - if ( isDefined( self.killstreak ) ) - { - for ( i = 0; i < self.killstreak.size; i++ ) - { - killstreakweapon = level.menureferenceforkillstreak[ self.killstreak[ i ] ]; - if ( isDefined( killstreakweapon ) ) - { - self addweaponstat( killstreakweapon, "timeUsed", totaltime ); - } - } - } - if ( level.rankedmatch && level.perksenabled ) - { - perksindexarray = []; - specialtys = self.specialty; - if ( !isDefined( specialtys ) ) - { - return; - } - if ( !isDefined( self.class ) ) - { - return; - } - if ( isDefined( self.class_num ) ) - { - for ( numspecialties = 0; numspecialties < level.maxspecialties; numspecialties++ ) - { - perk = self getloadoutitem( self.class_num, "specialty" + ( numspecialties + 1 ) ); - if ( perk != 0 ) - { - perksindexarray[ perk ] = 1; - } - } - perkindexarraykeys = getarraykeys( perksindexarray ); - for ( i = 0; i < perkindexarraykeys.size; i++ ) - { - if ( perksindexarray[ perkindexarraykeys[ i ] ] == 1 ) - { - self adddstat( "itemStats", perkindexarraykeys[ i ], "stats", "timeUsed", "statValue", totaltime ); - } - } - } - } + if ( self is_bot() ) + return; + + updatelastheldweapontimings( newtime ); + + if ( !isdefined( self.staticweaponsstarttime ) ) + return; + + totaltime = int( ( newtime - self.staticweaponsstarttime ) / 1000 ); + + if ( totaltime < 0 ) + return; + + self.staticweaponsstarttime = newtime; + + if ( isdefined( self.weapon_array_grenade ) ) + { + for ( i = 0; i < self.weapon_array_grenade.size; i++ ) + self addweaponstat( self.weapon_array_grenade[i], "timeUsed", totaltime ); + } + + if ( isdefined( self.weapon_array_inventory ) ) + { + for ( i = 0; i < self.weapon_array_inventory.size; i++ ) + self addweaponstat( self.weapon_array_inventory[i], "timeUsed", totaltime ); + } + + if ( isdefined( self.killstreak ) ) + { + for ( i = 0; i < self.killstreak.size; i++ ) + { + killstreakweapon = level.menureferenceforkillstreak[self.killstreak[i]]; + + if ( isdefined( killstreakweapon ) ) + self addweaponstat( killstreakweapon, "timeUsed", totaltime ); + } + } + + if ( level.rankedmatch && level.perksenabled ) + { + perksindexarray = []; + specialtys = self.specialty; + + if ( !isdefined( specialtys ) ) + return; + + if ( !isdefined( self.class ) ) + return; + + if ( isdefined( self.class_num ) ) + { + for ( numspecialties = 0; numspecialties < level.maxspecialties; numspecialties++ ) + { + perk = self getloadoutitem( self.class_num, "specialty" + ( numspecialties + 1 ) ); + + if ( perk != 0 ) + perksindexarray[perk] = 1; + } + + perkindexarraykeys = getarraykeys( perksindexarray ); + + for ( i = 0; i < perkindexarraykeys.size; i++ ) + { + if ( perksindexarray[perkindexarraykeys[i]] == 1 ) + self adddstat( "itemStats", perkindexarraykeys[i], "stats", "timeUsed", "statValue", totaltime ); + } + } + } } -trackweapon() //checked changed to match beta dump +trackweapon() { - currentweapon = self getcurrentweapon(); - currenttime = getTime(); - spawnid = getplayerspawnid( self ); - while ( 1 ) - { - event = self waittill_any_return( "weapon_change", "death", "disconnect" ); - newtime = getTime(); - if ( event == "weapon_change" ) - { - self maps/mp/_bb::commitweapondata( spawnid, currentweapon, currenttime ); - newweapon = self getcurrentweapon(); - if ( newweapon != "none" && newweapon != currentweapon ) - { - updatelastheldweapontimings( newtime ); - self maps/mp/gametypes/_class::initweaponattachments( newweapon ); - currentweapon = newweapon; - currenttime = newtime; - } - } - else - { - if ( event != "disconnect" && isDefined( self ) ) - { - self maps/mp/_bb::commitweapondata( spawnid, currentweapon, currenttime ); - updateweapontimings( newtime ); - } - return; - } - } + currentweapon = self getcurrentweapon(); + currenttime = gettime(); + spawnid = getplayerspawnid( self ); + + while ( true ) + { + event = self waittill_any_return( "weapon_change", "death", "disconnect" ); + newtime = gettime(); + + if ( event == "weapon_change" ) + { + self maps\mp\_bb::commitweapondata( spawnid, currentweapon, currenttime ); + newweapon = self getcurrentweapon(); + + if ( newweapon != "none" && newweapon != currentweapon ) + { + updatelastheldweapontimings( newtime ); + self maps\mp\gametypes\_class::initweaponattachments( newweapon ); + currentweapon = newweapon; + currenttime = newtime; + } + } + else + { + if ( event != "disconnect" && isdefined( self ) ) + { + self maps\mp\_bb::commitweapondata( spawnid, currentweapon, currenttime ); + updateweapontimings( newtime ); + } + + return; + } + } } -maydropweapon( weapon ) //checked matches cerberus output +maydropweapon( weapon ) { - if ( level.disableweapondrop == 1 ) - { - return 0; - } - if ( weapon == "none" ) - { - return 0; - } - if ( ishackweapon( weapon ) ) - { - return 0; - } - invtype = weaponinventorytype( weapon ); - if ( invtype != "primary" ) - { - return 0; - } - if ( weapon == "none" ) - { - return 0; - } - return 1; + if ( level.disableweapondrop == 1 ) + return false; + + if ( weapon == "none" ) + return false; + + if ( ishackweapon( weapon ) ) + return false; + + invtype = weaponinventorytype( weapon ); + + if ( invtype != "primary" ) + return false; + + if ( weapon == "none" ) + return false; + + return true; } -dropweaponfordeath( attacker, sweapon, smeansofdeath ) //checked matches cerberus output dvars taken from beta dump +dropweaponfordeath( attacker, sweapon, smeansofdeath ) { - if ( level.disableweapondrop == 1 ) - { - return; - } - weapon = self.lastdroppableweapon; - if ( isDefined( self.droppeddeathweapon ) ) - { - return; - } - if ( !isDefined( weapon ) ) - { - /* + if ( level.disableweapondrop == 1 ) + return; + + weapon = self.lastdroppableweapon; + + if ( isdefined( self.droppeddeathweapon ) ) + return; + + if ( !isdefined( weapon ) ) + { /# - if ( getDvar( "scr_dropdebug" ) == "1" ) - { - println( "didn't drop weapon: not defined" ); + if ( getdvar( _hash_8F7FC88 ) == "1" ) + println( "didn't drop weapon: not defined" ); #/ - } - */ - return; - } - if ( weapon == "none" ) - { - /* + return; + } + + if ( weapon == "none" ) + { /# - if ( getDvar( "scr_dropdebug" ) == "1" ) - { - println( "didn't drop weapon: weapon == none" ); + if ( getdvar( _hash_8F7FC88 ) == "1" ) + println( "didn't drop weapon: weapon == none" ); #/ - } - */ - return; - } - if ( !self hasweapon( weapon ) ) - { - /* + return; + } + + if ( !self hasweapon( weapon ) ) + { /# - if ( getDvar( "scr_dropdebug" ) == "1" ) - { - println( "didn't drop weapon: don't have it anymore (" + weapon + ")" ); + if ( getdvar( _hash_8F7FC88 ) == "1" ) + println( "didn't drop weapon: don't have it anymore (" + weapon + ")" ); #/ - } - */ - return; - } - if ( !self anyammoforweaponmodes( weapon ) ) - { - /* + return; + } + + if ( !self anyammoforweaponmodes( weapon ) ) + { /# - if ( getDvar( "scr_dropdebug" ) == "1" ) - { - println( "didn't drop weapon: no ammo for weapon modes" ); + if ( getdvar( _hash_8F7FC88 ) == "1" ) + println( "didn't drop weapon: no ammo for weapon modes" ); #/ - } - */ - return; - } - if ( !shoulddroplimitedweapon( weapon, self ) ) - { - return; - } - if ( maps/mp/killstreaks/_killstreak_weapons::isheldkillstreakweapon( weapon ) ) - { - return; - } - clipammo = self getweaponammoclip( weapon ); - stockammo = self getweaponammostock( weapon ); - clip_and_stock_ammo = clipammo + stockammo; - if ( !clip_and_stock_ammo ) - { - /* + return; + } + + if ( !shoulddroplimitedweapon( weapon, self ) ) + return; + + if ( maps\mp\killstreaks\_killstreak_weapons::isheldkillstreakweapon( weapon ) ) + return; + + clipammo = self getweaponammoclip( weapon ); + stockammo = self getweaponammostock( weapon ); + clip_and_stock_ammo = clipammo + stockammo; + + if ( !clip_and_stock_ammo ) + { /# - if ( getDvar( "scr_dropdebug" ) == "1" ) - { - println( "didn't drop weapon: no ammo" ); + if ( getdvar( _hash_8F7FC88 ) == "1" ) + println( "didn't drop weapon: no ammo" ); #/ - } - */ - return; - } - stockmax = weaponmaxammo( weapon ); - if ( stockammo > stockmax ) - { - stockammo = stockmax; - } - item = self dropitem( weapon ); - if ( !isDefined( item ) ) - { - /* + return; + } + + stockmax = weaponmaxammo( weapon ); + + if ( stockammo > stockmax ) + stockammo = stockmax; + + item = self dropitem( weapon ); + + if ( !isdefined( item ) ) + { /# - iprintlnbold( "dropItem: was not able to drop weapon " + weapon ); + iprintlnbold( "dropItem: was not able to drop weapon " + weapon ); #/ - */ - return; - } - /* + return; + } + /# - if ( getDvar( "scr_dropdebug" ) == "1" ) - { - println( "dropped weapon: " + weapon ); + if ( getdvar( _hash_8F7FC88 ) == "1" ) + println( "dropped weapon: " + weapon ); #/ - } - */ - droplimitedweapon( weapon, self, item ); - self.droppeddeathweapon = 1; - item itemweaponsetammo( clipammo, stockammo ); - item.owner = self; - item.ownersattacker = attacker; - item.sweapon = sweapon; - item.smeansofdeath = smeansofdeath; - item thread watchpickup(); - item thread deletepickupafterawhile(); + droplimitedweapon( weapon, self, item ); + self.droppeddeathweapon = 1; + item itemweaponsetammo( clipammo, stockammo ); + item.owner = self; + item.ownersattacker = attacker; + item.sweapon = sweapon; + item.smeansofdeath = smeansofdeath; + item thread watchpickup(); + item thread deletepickupafterawhile(); } -dropweapontoground( weapon ) //checked changed to match cerberus output dvars taken from beta dump +dropweapontoground( weapon ) { - if ( !isDefined( weapon ) ) - { - /* + if ( !isdefined( weapon ) ) + { /# - if ( getDvar( "scr_dropdebug" ) == "1" ) - { - println( "didn't drop weapon: not defined" ); + if ( getdvar( _hash_8F7FC88 ) == "1" ) + println( "didn't drop weapon: not defined" ); #/ - } - */ - return; - } - if ( weapon == "none" ) - { - /* + return; + } + + if ( weapon == "none" ) + { /# - if ( getDvar( "scr_dropdebug" ) == "1" ) - { - println( "didn't drop weapon: weapon == none" ); + if ( getdvar( _hash_8F7FC88 ) == "1" ) + println( "didn't drop weapon: weapon == none" ); #/ - } - */ - return; - } - if ( !self hasweapon( weapon ) ) - { - /* + return; + } + + if ( !self hasweapon( weapon ) ) + { /# - if ( getDvar( "scr_dropdebug" ) == "1" ) - { - println( "didn't drop weapon: don't have it anymore (" + weapon + ")" ); + if ( getdvar( _hash_8F7FC88 ) == "1" ) + println( "didn't drop weapon: don't have it anymore (" + weapon + ")" ); #/ - } - */ - return; - } - if ( !self anyammoforweaponmodes( weapon ) ) - { - /* + return; + } + + if ( !self anyammoforweaponmodes( weapon ) ) + { /# - if ( getDvar( "scr_dropdebug" ) == "1" ) - { - println( "didn't drop weapon: no ammo for weapon modes" ); + if ( getdvar( _hash_8F7FC88 ) == "1" ) + println( "didn't drop weapon: no ammo for weapon modes" ); #/ - } - */ - switch( weapon ) - { - case "m202_flash_mp": - case "m220_tow_mp": - case "m32_mp": - case "minigun_mp": - case "mp40_blinged_mp": - self takeweapon( weapon ); - break; - default: - break; - } - if ( !shoulddroplimitedweapon( weapon, self ) ) - { - return; - } - clipammo = self getweaponammoclip( weapon ); - stockammo = self getweaponammostock( weapon ); - clip_and_stock_ammo = clipammo + stockammo; - if ( !clip_and_stock_ammo ) - { - /* + + switch ( weapon ) + { + case "mp40_blinged_mp": + case "minigun_mp": + case "m32_mp": + case "m220_tow_mp": + case "m202_flash_mp": + self takeweapon( weapon ); + break; + default: + break; + } + + return; + } + + if ( !shoulddroplimitedweapon( weapon, self ) ) + return; + + clipammo = self getweaponammoclip( weapon ); + stockammo = self getweaponammostock( weapon ); + clip_and_stock_ammo = clipammo + stockammo; + + if ( !clip_and_stock_ammo ) + { /# - if ( getDvar( "scr_dropdebug" ) == "1" ) - { - println( "didn't drop weapon: no ammo" ); + if ( getdvar( _hash_8F7FC88 ) == "1" ) + println( "didn't drop weapon: no ammo" ); #/ - } - */ - return; - } - stockmax = weaponmaxammo( weapon ); - if ( stockammo > stockmax ) - { - stockammo = stockmax; - } - item = self dropitem( weapon ); - /* + return; + } + + stockmax = weaponmaxammo( weapon ); + + if ( stockammo > stockmax ) + stockammo = stockmax; + + item = self dropitem( weapon ); /# - if ( getDvar( "scr_dropdebug" ) == "1" ) - { - println( "dropped weapon: " + weapon ); + if ( getdvar( _hash_8F7FC88 ) == "1" ) + println( "dropped weapon: " + weapon ); #/ - } - */ - droplimitedweapon( weapon, self, item ); - item itemweaponsetammo( clipammo, stockammo ); - item.owner = self; - item thread watchpickup(); - item thread deletepickupafterawhile(); - } + droplimitedweapon( weapon, self, item ); + item itemweaponsetammo( clipammo, stockammo ); + item.owner = self; + item thread watchpickup(); + item thread deletepickupafterawhile(); } -deletepickupafterawhile() //checked matches cerberus output +deletepickupafterawhile() { - self endon( "death" ); - wait 60; - if ( !isDefined( self ) ) - { - return; - } - self delete(); + self endon( "death" ); + wait 60; + + if ( !isdefined( self ) ) + return; + + self delete(); } -getitemweaponname() //checked matches cerberus output +getitemweaponname() { - classname = self.classname; - /* + classname = self.classname; /# - assert( getsubstr( classname, 0, 7 ) == "weapon_" ); + assert( getsubstr( classname, 0, 7 ) == "weapon_" ); #/ - */ - weapname = getsubstr( classname, 7 ); - return weapname; + weapname = getsubstr( classname, 7 ); + return weapname; } -watchpickup() //checked changed to match cerberus output dvar taken from beta dump +watchpickup() { - self endon( "death" ); - weapname = self getitemweaponname(); - while ( 1 ) - { - self waittill( "trigger", player, droppeditem ); - if ( isdefined( droppeditem ) ) - { - break; - } - } - /* + self endon( "death" ); + weapname = self getitemweaponname(); + + self waittill( "trigger", player, droppeditem ); + /# - if ( getDvar( "scr_dropdebug" ) == "1" ) - { - println( "picked up weapon: " + weapname + ", " + isDefined( self.ownersattacker ) ); -#/ - } -/# - assert( isDefined( player.tookweaponfrom ) ); + if ( getdvar( _hash_8F7FC88 ) == "1" ) + println( "picked up weapon: " + weapname + ", " + isdefined( self.ownersattacker ) ); #/ /# - assert( isDefined( player.pickedupweaponkills ) ); + assert( isdefined( player.tookweaponfrom ) ); #/ - */ - if ( isDefined( droppeditem ) ) - { - droppedweaponname = droppeditem getitemweaponname(); - if ( isDefined( player.tookweaponfrom[ droppedweaponname ] ) ) - { - droppeditem.owner = player.tookweaponfrom[ droppedweaponname ]; - droppeditem.ownersattacker = player; - player.tookweaponfrom[ droppedweaponname ] = undefined; - } - droppeditem thread watchpickup(); - } - if ( isDefined( self.ownersattacker ) && self.ownersattacker == player ) - { - player.tookweaponfrom[ weapname ] = spawnstruct(); - player.tookweaponfrom[ weapname ].previousowner = self.owner; - player.tookweaponfrom[ weapname ].sweapon = self.sweapon; - player.tookweaponfrom[ weapname ].smeansofdeath = self.smeansofdeath; - player.pickedupweaponkills[ weapname ] = 0; - } - else - { - player.tookweaponfrom[ weapname ] = undefined; - player.pickedupweaponkills[ weapname ] = undefined; - } -} - -itemremoveammofromaltmodes() //checked matches cerberus output -{ - origweapname = self getitemweaponname(); - curweapname = weaponaltweaponname( origweapname ); - altindex = 1; - while ( curweapname != "none" && curweapname != origweapname ) - { - self itemweaponsetammo( 0, 0, altindex ); - curweapname = weaponaltweaponname( curweapname ); - altindex++; - } -} - -dropoffhand() //checked partially changed to match cerberus output did not change while loop to for loop see github for more info -{ - grenadetypes = []; - index = 0; - while ( index < grenadetypes.size ) - { - if ( !self hasweapon( grenadetypes[ index ] ) ) - { - index++; - continue; - } - count = self getammocount( grenadetypes[ index ] ); - if ( !count ) - { - index++; - continue; - } - self dropitem( grenadetypes[ index ] ); - index++; - } -} - -watchweaponusage() //checked changed to match cerberus output -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon( "game_ended" ); - self.usedkillstreakweapon = []; - self.usedkillstreakweapon[ "minigun_mp" ] = 0; - self.usedkillstreakweapon[ "m32_mp" ] = 0; - self.usedkillstreakweapon[ "m202_flash_mp" ] = 0; - self.usedkillstreakweapon[ "m220_tow_mp" ] = 0; - self.usedkillstreakweapon[ "mp40_blinged_mp" ] = 0; - self.killstreaktype = []; - self.killstreaktype[ "minigun_mp" ] = "minigun_mp"; - self.killstreaktype[ "m32_mp" ] = "m32_mp"; - self.killstreaktype[ "m202_flash_mp" ] = "m202_flash_mp"; - self.killstreaktype[ "m220_tow_mp" ] = "m220_tow_mp"; - self.killstreaktype[ "mp40_blinged_mp" ] = "mp40_blinged_drop_mp"; - for ( ;; ) - { - self waittill( "weapon_fired", curweapon ); - self.lastfiretime = getTime(); - self.hasdonecombat = 1; - if ( maps/mp/gametypes/_weapons::isprimaryweapon( curweapon ) || maps/mp/gametypes/_weapons::issidearm( curweapon ) ) - { - if ( isDefined( self.hitsthismag[ curweapon ] ) ) - { - self thread updatemagshots( curweapon ); - } - } - switch ( weaponclass( curweapon ) ) - { - case "rifle": - if ( curweapon == "crossbow_mp" ) - { - level.globalcrossbowfired++; - } - if ( curweapon == "crossbow_explosive_mp" ) - { - level.globalcrossbowfired++; - self addweaponstat( curweapon, "shots", 1 ); - self thread begingrenadetracking(); - break; - } - case "mg": - case "pistol": - case "pistol spread": - case "smg": - case "spread": - self trackweaponfire( curweapon ); - level.globalshotsfired++; - break; - case "grenade": - case "rocketlauncher": - self addweaponstat( curweapon, "shots", 1 ); - break; - default: - break; - } - if ( maps/mp/killstreaks/_killstreak_weapons::isheldkillstreakweapon( curweapon ) ) - { - self.pers[ "held_killstreak_ammo_count" ][ curweapon ]--; - self.usedkillstreakweapon[ curweapon ] = 1; - } - } -} - -updatemagshots( weaponname ) //checked matches cerberus output -{ - self endon( "death" ); - self endon( "disconnect" ); - self endon( "updateMagShots_" + weaponname ); - self.hitsthismag[ weaponname ]--; - - wait 0.05; - self.hitsthismag[ weaponname ] = weaponclipsize( weaponname ); -} - -checkhitsthismag( weaponname ) //checked matches cerberus output -{ - self endon( "death" ); - self endon( "disconnect" ); - self notify( "updateMagShots_" + weaponname ); - waittillframeend; - if ( isDefined( self.hitsthismag[ weaponname ] ) && self.hitsthismag[ weaponname ] == 0 ) - { - if ( !sessionmodeiszombiesgame() ) - { - weaponclass = getweaponclass( weaponname ); - maps/mp/_challenges::fullclipnomisses( weaponclass, weaponname ); - } - self.hitsthismag[ weaponname ] = weaponclipsize( weaponname ); - } -} - -trackweaponfire( curweapon ) //checked matches cerberus output -{ - pixbeginevent( "trackWeaponFire" ); - self trackweaponfirenative( curweapon, 1, self.hits, 1 ); - self maps/mp/_bb::bbaddtostat( "shots", 1 ); - self maps/mp/_bb::bbaddtostat( "hits", self.hits ); - self.hits = 0; - pixendevent(); -} - -checkhit( sweapon ) //checked changed to match cerberus output -{ - switch ( weaponclass( sweapon ) ) - { - case "mg": - case "pistol": - case "rifle": - case "smg": - self.hits++; - break; - case "pistol spread": - case "spread": - self.hits = 1; - break; - default: - } - waittillframeend; - if ( isDefined( self ) && isDefined( self.hitsthismag ) && isDefined( self.hitsthismag[ sweapon ] ) ) - { - self thread checkhitsthismag( sweapon ); - } -} - -watchgrenadeusage() //checked matches cerberus output -{ - self endon( "death" ); - self endon( "disconnect" ); - self.throwinggrenade = 0; - self.gotpullbacknotify = 0; - self thread beginothergrenadetracking(); - self thread watchforthrowbacks(); - self thread watchforgrenadeduds(); - self thread watchforgrenadelauncherduds(); - for ( ;; ) - { - self waittill( "grenade_pullback", weaponname ); - self addweaponstat( weaponname, "shots", 1 ); - self.hasdonecombat = 1; - self.throwinggrenade = 1; - self.gotpullbacknotify = 1; - if ( weaponname == "satchel_charge_mp" ) - { - self thread beginsatcheltracking(); - } - if ( !maps/mp/killstreaks/_supplydrop::issupplydropweapon( weaponname ) && weaponname != "sensor_grenade_mp" ) - { - self setoffhandvisible( 1 ); - self thread watchoffhandend(); - } - self thread begingrenadetracking(); - } -} - -watchmissileusage() //checked matches cerberus output -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon( "game_ended" ); - for ( ;; ) - { - self waittill( "missile_fire", missile, weapon_name ); - self.hasdonecombat = 1; - /* /# - assert( isDefined( missile ) ); + assert( isdefined( player.pickedupweaponkills ) ); #/ - */ - level.missileentities[ level.missileentities.size ] = missile; - missile thread watchmissiledeath(); - } + + if ( isdefined( droppeditem ) ) + { + droppedweaponname = droppeditem getitemweaponname(); + + if ( isdefined( player.tookweaponfrom[droppedweaponname] ) ) + { + droppeditem.owner = player.tookweaponfrom[droppedweaponname]; + droppeditem.ownersattacker = player; + player.tookweaponfrom[droppedweaponname] = undefined; + } + + droppeditem thread watchpickup(); + } + + if ( isdefined( self.ownersattacker ) && self.ownersattacker == player ) + { + player.tookweaponfrom[weapname] = spawnstruct(); + player.tookweaponfrom[weapname].previousowner = self.owner; + player.tookweaponfrom[weapname].sweapon = self.sweapon; + player.tookweaponfrom[weapname].smeansofdeath = self.smeansofdeath; + player.pickedupweaponkills[weapname] = 0; + } + else + { + player.tookweaponfrom[weapname] = undefined; + player.pickedupweaponkills[weapname] = undefined; + } } -watchmissiledeath() //checked matches cerberus output +itemremoveammofromaltmodes() { - self waittill( "death" ); - arrayremovevalue( level.missileentities, self ); + origweapname = self getitemweaponname(); + curweapname = weaponaltweaponname( origweapname ); + + for ( altindex = 1; curweapname != "none" && curweapname != origweapname; altindex++ ) + { + self itemweaponsetammo( 0, 0, altindex ); + curweapname = weaponaltweaponname( curweapname ); + } } -dropweaponstoground( origin, radius ) //checked changed to match cerberus output +dropoffhand() { - weapons = getdroppedweapons(); - for ( i = 0; i < weapons.size; i++ ) - { - if ( distancesquared( origin, weapons[ i ].origin ) < ( radius * radius ) ) - { - trace = bullettrace( weapons[ i ].origin, weapons[ i ].origin + vectorScale( ( 0, 0, -1 ), 2000 ), 0, weapons[ i ] ); - weapons[ i ].origin = trace[ "position" ]; - } - } + grenadetypes = []; + + for ( index = 0; index < grenadetypes.size; index++ ) + { + if ( !self hasweapon( grenadetypes[index] ) ) + continue; + + count = self getammocount( grenadetypes[index] ); + + if ( !count ) + continue; + + self dropitem( grenadetypes[index] ); + } } -dropgrenadestoground( origin, radius ) //checked changed to match cerberus output +watchweaponusage() { - grenades = getentarray( "grenade", "classname" ); - for ( i = 0; i < grenades.size; i++ ) - { - if ( distancesquared( origin, grenades[ i ].origin ) < ( radius * radius ) ) - { - grenades[ i ] launch( vectorScale( ( 1, 1, 1 ), 5 ) ); - } - } + self endon( "death" ); + self endon( "disconnect" ); + level endon( "game_ended" ); + self.usedkillstreakweapon = []; + self.usedkillstreakweapon["minigun_mp"] = 0; + self.usedkillstreakweapon["m32_mp"] = 0; + self.usedkillstreakweapon["m202_flash_mp"] = 0; + self.usedkillstreakweapon["m220_tow_mp"] = 0; + self.usedkillstreakweapon["mp40_blinged_mp"] = 0; + self.killstreaktype = []; + self.killstreaktype["minigun_mp"] = "minigun_mp"; + self.killstreaktype["m32_mp"] = "m32_mp"; + self.killstreaktype["m202_flash_mp"] = "m202_flash_mp"; + self.killstreaktype["m220_tow_mp"] = "m220_tow_mp"; + self.killstreaktype["mp40_blinged_mp"] = "mp40_blinged_drop_mp"; + + for (;;) + { + self waittill( "weapon_fired", curweapon ); + + self.lastfiretime = gettime(); + self.hasdonecombat = 1; + + if ( maps\mp\gametypes\_weapons::isprimaryweapon( curweapon ) || maps\mp\gametypes\_weapons::issidearm( curweapon ) ) + { + if ( isdefined( self.hitsthismag[curweapon] ) ) + self thread updatemagshots( curweapon ); + } + + switch ( weaponclass( curweapon ) ) + { + case "rifle": + if ( curweapon == "crossbow_mp" ) + level.globalcrossbowfired++; + + if ( curweapon == "crossbow_explosive_mp" ) + { + level.globalcrossbowfired++; + self addweaponstat( curweapon, "shots", 1 ); + self thread begingrenadetracking(); + break; + } + case "spread": + case "smg": + case "pistol spread": + case "pistol": + case "mg": + self trackweaponfire( curweapon ); + level.globalshotsfired++; + break; + case "rocketlauncher": + case "grenade": + self addweaponstat( curweapon, "shots", 1 ); + break; + default: + break; + } + + if ( maps\mp\killstreaks\_killstreak_weapons::isheldkillstreakweapon( curweapon ) ) + { + self.pers["held_killstreak_ammo_count"][curweapon]--; + self.usedkillstreakweapon[curweapon] = 1; + } + } } -watchgrenadecancel() //checked matches cerberus output +updatemagshots( weaponname ) { - self endon( "death" ); - self endon( "disconnect" ); - self endon( "grenade_fire" ); - waittillframeend; - weapon = "none"; - while ( self isthrowinggrenade() && weapon == "none" ) - { - self waittill( "weapon_change", weapon ); - } - self.throwinggrenade = 0; - self.gotpullbacknotify = 0; - self notify( "grenade_throw_cancelled" ); + self endon( "death" ); + self endon( "disconnect" ); + self endon( "updateMagShots_" + weaponname ); + self.hitsthismag[weaponname]--; + wait 0.05; + self.hitsthismag[weaponname] = weaponclipsize( weaponname ); } -watchoffhandend() //checked changed to match cerberus output +checkhitsthismag( weaponname ) { - self notify( "watchOffhandEnd" ); - self endon( "watchOffhandEnd" ); - while ( self isusingoffhandequipment() ) - { - msg = self waittill_any_return( "death", "disconnect", "grenade_fire", "weapon_change" ); - if ( msg == "death" || msg == "disconnect" ) - { - break; - } - } - self setoffhandvisible( 0 ); + self endon( "death" ); + self endon( "disconnect" ); + self notify( "updateMagShots_" + weaponname ); + waittillframeend; + + if ( isdefined( self.hitsthismag[weaponname] ) && self.hitsthismag[weaponname] == 0 ) + { + if ( !sessionmodeiszombiesgame() ) + { + weaponclass = getweaponclass( weaponname ); + maps\mp\_challenges::fullclipnomisses( weaponclass, weaponname ); + } + + self.hitsthismag[weaponname] = weaponclipsize( weaponname ); + } } -isusingoffhandequipment() //checked matches cerberus output +trackweaponfire( curweapon ) { - if ( self isusingoffhand() ) - { - weapon = self getcurrentoffhand(); - if ( isweaponequipment( weapon ) ) - { - return 1; - } - } - return 0; + pixbeginevent( "trackWeaponFire" ); + self trackweaponfirenative( curweapon, 1, self.hits, 1 ); + self maps\mp\_bb::bbaddtostat( "shots", 1 ); + self maps\mp\_bb::bbaddtostat( "hits", self.hits ); + self.hits = 0; + pixendevent(); } -begingrenadetracking() //checked changed to match cerberus output +checkhit( sweapon ) { - self endon( "death" ); - self endon( "disconnect" ); - self endon( "grenade_throw_cancelled" ); - starttime = getTime(); - self thread watchgrenadecancel(); - self waittill( "grenade_fire", grenade, weaponname ); - /* + switch ( weaponclass( sweapon ) ) + { + case "smg": + case "rifle": + case "pistol": + case "mg": + self.hits++; + break; + case "spread": + case "pistol spread": + self.hits = 1; + break; + default: + break; + } + + waittillframeend; + + if ( isdefined( self ) && isdefined( self.hitsthismag ) && isdefined( self.hitsthismag[sweapon] ) ) + self thread checkhitsthismag( sweapon ); +} + +watchgrenadeusage() +{ + self endon( "death" ); + self endon( "disconnect" ); + self.throwinggrenade = 0; + self.gotpullbacknotify = 0; + self thread beginothergrenadetracking(); + self thread watchforthrowbacks(); + self thread watchforgrenadeduds(); + self thread watchforgrenadelauncherduds(); + + for (;;) + { + self waittill( "grenade_pullback", weaponname ); + + self addweaponstat( weaponname, "shots", 1 ); + self.hasdonecombat = 1; + self.throwinggrenade = 1; + self.gotpullbacknotify = 1; + + if ( weaponname == "satchel_charge_mp" ) + self thread beginsatcheltracking(); + + if ( !maps\mp\killstreaks\_supplydrop::issupplydropweapon( weaponname ) && weaponname != "sensor_grenade_mp" ) + { + self setoffhandvisible( 1 ); + self thread watchoffhandend(); + } + + self thread begingrenadetracking(); + } +} + +watchmissileusage() +{ + self endon( "death" ); + self endon( "disconnect" ); + level endon( "game_ended" ); + + for (;;) + { + self waittill( "missile_fire", missile, weapon_name ); + + self.hasdonecombat = 1; /# - assert( isDefined( grenade ) ); + assert( isdefined( missile ) ); #/ - */ - level.missileentities[ level.missileentities.size ] = grenade; - grenade thread watchmissiledeath(); - if ( grenade maps/mp/_utility::ishacked() ) - { - return; - } - bbprint( "mpequipmentuses", "gametime %d spawnid %d weaponname %s", getTime(), getplayerspawnid( self ), weaponname ); - if ( ( getTime() - starttime ) > 1000 ) - { - grenade.iscooked = 1; - } - switch( weaponname ) - { - case "frag_grenade_mp": - level.globalfraggrenadesfired++; - case "sticky_grenade_mp": - self addweaponstat( weaponname, "used", 1 ); - case "explosive_bolt_mp": - grenade.originalowner = self; - break; - case "satchel_charge_mp": - level.globalsatchelchargefired++; - break; - } - if ( weaponname == "sticky_grenade_mp" || weaponname == "frag_grenade_mp" ) - { - grenade setteam( self.pers[ "team" ] ); - grenade setowner( self ); - } - self.throwinggrenade = 0; + level.missileentities[level.missileentities.size] = missile; + missile thread watchmissiledeath(); + } } -beginothergrenadetracking() //checked partially changed to match cerberus output changed at own discretion +watchmissiledeath() { - self notify( "grenadeTrackingStart" ); - self endon( "grenadeTrackingStart" ); - self endon( "disconnect" ); - for ( ;; ) - { - self waittill( "grenade_fire", grenade, weaponname, parent ); - if ( grenade maps/mp/_utility::ishacked() ) - { - continue; - } - switch( weaponname ) - { - case "flash_grenade_mp": - break; - case "concussion_grenade_mp": - break; - case "willy_pete_mp": - grenade thread maps/mp/_smokegrenade::watchsmokegrenadedetonation( self ); - break; - case "tabun_gas_mp": - grenade thread maps/mp/_tabun::watchtabungrenadedetonation( self ); - break; - case "sticky_grenade_mp": - grenade thread checkstucktoplayer( 1, 1, weaponname ); - grenade thread checkstucktoshield(); - break; - case "c4_mp": - case "satchel_charge_mp": - grenade thread checkstucktoplayer( 1, 0, weaponname ); - break; - case "proximity_grenade_mp": - grenade thread checkstucktoshield(); - grenade thread maps/mp/_proximity_grenade::watchproximitygrenadehitplayer( self ); - break; - case "tactical_insertion_mp": - grenade thread maps/mp/_tacticalinsertion::watch( self ); - break; - case "scrambler_mp": - break; - case "explosive_bolt_mp": - grenade.ownerweaponatlaunch = self.currentweapon; - if ( self playerads() == 1 ) - { - grenade.owneradsatlaunch = 1; - } - else - { - grenade.owneradsatlaunch = 0; - } - grenade thread maps/mp/_explosive_bolt::watch_bolt_detonation( self ); - grenade thread checkstucktoplayer( 1, 0, weaponname ); - grenade thread checkstucktoshield(); - break; - case "hatchet_mp": - grenade.lastweaponbeforetoss = self getlastweapon(); - grenade thread checkhatchetbounce(); - grenade thread checkstucktoplayer( 0, 0, weaponname ); - self addweaponstat( weaponname, "used", 1 ); - break; - case "emp_grenade_mp": - grenade thread maps/mp/_empgrenade::watchempexplosion( self, weaponname ); - break; - } - } + self waittill( "death" ); + + arrayremovevalue( level.missileentities, self ); } -checkstucktoplayer( deleteonteamchange, awardscoreevent, weaponname ) //checked matches cerberus output +dropweaponstoground( origin, radius ) { - self endon( "death" ); - self waittill( "stuck_to_player", player ); - if ( isDefined( player ) ) - { - if ( deleteonteamchange ) - { - self thread stucktoplayerteamchange( player ); - } - if ( awardscoreevent && isDefined( self.originalowner ) ) - { - if ( self.originalowner isenemyplayer( player ) ) - { - maps/mp/_scoreevents::processscoreevent( "stick_explosive_kill", self.originalowner, player, weaponname ); - } - } - self.stucktoplayer = player; - } + weapons = getdroppedweapons(); + + for ( i = 0; i < weapons.size; i++ ) + { + if ( distancesquared( origin, weapons[i].origin ) < radius * radius ) + { + trace = bullettrace( weapons[i].origin, weapons[i].origin + vectorscale( ( 0, 0, -1 ), 2000.0 ), 0, weapons[i] ); + weapons[i].origin = trace["position"]; + } + } } -checkstucktoshield() //checked matches cerberus output +dropgrenadestoground( origin, radius ) { - self endon( "death" ); - self waittill( "stuck_to_shield", other, owner ); - other maps/mp/_riotshield::watchriotshieldstuckentitydeath( self, owner ); + grenades = getentarray( "grenade", "classname" ); + + for ( i = 0; i < grenades.size; i++ ) + { + if ( distancesquared( origin, grenades[i].origin ) < radius * radius ) + grenades[i] launch( vectorscale( ( 1, 1, 1 ), 5.0 ) ); + } } -checkhatchetbounce() //checked matches cerberus output +watchgrenadecancel() { - self endon( "stuck_to_player" ); - self endon( "death" ); - self waittill( "grenade_bounce" ); - self.bounced = 1; + self endon( "death" ); + self endon( "disconnect" ); + self endon( "grenade_fire" ); + waittillframeend; + weapon = "none"; + + while ( self isthrowinggrenade() && weapon == "none" ) + self waittill( "weapon_change", weapon ); + + self.throwinggrenade = 0; + self.gotpullbacknotify = 0; + self notify( "grenade_throw_cancelled" ); } -stucktoplayerteamchange( player ) //checked matches cerberus output +watchoffhandend() { - self endon( "death" ); - player endon( "disconnect" ); - originalteam = player.pers[ "team" ]; - while ( 1 ) - { - player waittill( "joined_team" ); - if ( player.pers[ "team" ] != originalteam ) - { - self detonate(); - return; - } - } + self notify( "watchOffhandEnd" ); + self endon( "watchOffhandEnd" ); + + while ( self isusingoffhandequipment() ) + { + msg = self waittill_any_return( "death", "disconnect", "grenade_fire", "weapon_change" ); + + if ( msg == "death" || msg == "disconnect" ) + break; + } + + self setoffhandvisible( 0 ); } -beginsatcheltracking() //checked matches cerberus output +isusingoffhandequipment() { - self endon( "death" ); - self endon( "disconnect" ); - self waittill_any( "grenade_fire", "weapon_change" ); - self.throwinggrenade = 0; + if ( self isusingoffhand() ) + { + weapon = self getcurrentoffhand(); + + if ( isweaponequipment( weapon ) ) + return true; + } + + return false; } -watchforthrowbacks() //checked changed to match cerberus output +begingrenadetracking() { - self endon( "death" ); - self endon( "disconnect" ); - for ( ;; ) - { - self waittill( "grenade_fire", grenade, weapname ); - if ( self.gotpullbacknotify ) - { - self.gotpullbacknotify = 0; - continue; - } - if ( !issubstr( weapname, "frag_" ) ) - { - continue; - } - grenade.threwback = 1; - grenade.originalowner = self; - } -} + self endon( "death" ); + self endon( "disconnect" ); + self endon( "grenade_throw_cancelled" ); + starttime = gettime(); + self thread watchgrenadecancel(); -waitanddeletedud( waittime ) //checked matches cerberus output -{ - self endon( "death" ); - wait waittime; - if ( isDefined( self ) ) - { - self delete(); - } -} + self waittill( "grenade_fire", grenade, weaponname ); -makeallboltsdud() //checked changed to match cerberus output -{ - grenades = getentarray( "grenade", "classname" ); - for ( i = 0; i < grenades.size; i++ ) - { - if ( grenades[ i ].model == "t5_weapon_crossbow_bolt" ) - { - grenades[ i ] makegrenadedud(); - if ( !isDefined( grenades[ i ].isdud ) ) - { - grenades[ i ] thread waitanddeletedud( level.missileduddeletedelay ); - } - grenades[ i ].isdud = 1; - } - } -} - -turngrenadeintoadud( weapname, isthrowngrenade, player ) //checked changed to match cerberus output -{ - if ( level.roundstartexplosivedelay >= ( maps/mp/gametypes/_globallogic_utils::gettimepassed() / 1000 ) ) - { - if ( isweapondisallowedatmatchstart( weapname ) || issubstr( weapname, "gl_" ) ) - { - timeleft = int( level.roundstartexplosivedelay - ( maps/mp/gametypes/_globallogic_utils::gettimepassed() / 1000 ) ); - if ( !timeleft ) - { - timeleft = 1; - } - if ( weapname == "explosive_bolt_mp" ) - { - self makeallboltsdud(); - player iprintlnbold( &"MP_LAUNCHER_UNAVAILABLE_FOR_N", " " + timeleft + " ", &"EXE_SECONDS" ); - } - else if ( isthrowngrenade ) - { - player iprintlnbold( &"MP_GRENADE_UNAVAILABLE_FOR_N", " " + timeleft + " ", &"EXE_SECONDS" ); - } - else - { - player iprintlnbold( &"MP_LAUNCHER_UNAVAILABLE_FOR_N", " " + timeleft + " ", &"EXE_SECONDS" ); - } - self makegrenadedud(); - } - } -} - -watchforgrenadeduds() //checked matches cerberus output -{ - self endon( "spawned_player" ); - self endon( "disconnect" ); - while ( 1 ) - { - self waittill( "grenade_fire", grenade, weapname ); - grenade turngrenadeintoadud( weapname, 1, self ); - } -} - -watchforgrenadelauncherduds() //checked matches cerberus output -{ - self endon( "spawned_player" ); - self endon( "disconnect" ); - while ( 1 ) - { - self waittill( "grenade_launcher_fire", grenade, weapname ); - grenade turngrenadeintoadud( weapname, 0, self ); - /* /# - assert( isDefined( grenade ) ); + assert( isdefined( grenade ) ); #/ - */ - level.missileentities[ level.missileentities.size ] = grenade; - grenade thread watchmissiledeath(); - } + level.missileentities[level.missileentities.size] = grenade; + grenade thread watchmissiledeath(); + + if ( grenade maps\mp\_utility::ishacked() ) + return; + + bbprint( "mpequipmentuses", "gametime %d spawnid %d weaponname %s", gettime(), getplayerspawnid( self ), weaponname ); + + if ( gettime() - starttime > 1000 ) + grenade.iscooked = 1; + + switch ( weaponname ) + { + case "frag_grenade_mp": + level.globalfraggrenadesfired++; + case "sticky_grenade_mp": + self addweaponstat( weaponname, "used", 1 ); + case "explosive_bolt_mp": + grenade.originalowner = self; + break; + case "satchel_charge_mp": + level.globalsatchelchargefired++; + break; + } + + if ( weaponname == "sticky_grenade_mp" || weaponname == "frag_grenade_mp" ) + { + grenade setteam( self.pers["team"] ); + grenade setowner( self ); + } + + self.throwinggrenade = 0; } -getdamageableents( pos, radius, dolos, startradius ) //checked partially changed to match cerberus output did not use continue in for loop and foreach see github for more info +beginothergrenadetracking() { - ents = []; - if ( !isDefined( dolos ) ) - { - dolos = 0; - } - if ( !isDefined( startradius ) ) - { - startradius = 0; - } - players = level.players; - for ( i = 0; i < players.size; i++ ) - { - if ( !isalive( players[ i ] ) || players[ i ].sessionstate != "playing" ) - { - } - else - { - playerpos = players[ i ].origin + vectorScale( ( 0, 0, 1 ), 32 ); - distsq = distancesquared( pos, playerpos ); - if ( distsq < ( radius * radius ) || !dolos && weapondamagetracepassed( pos, playerpos, startradius, undefined ) ) - { - newent = spawnstruct(); - newent.isplayer = 1; - newent.isadestructable = 0; - newent.isadestructible = 0; - newent.isactor = 0; - newent.entity = players[ i ]; - newent.damagecenter = playerpos; - ents[ ents.size ] = newent; - } - } - } - grenades = getentarray( "grenade", "classname" ); - for ( i = 0; i < grenades.size; i++ ) - { - entpos = grenades[ i ].origin; - distsq = distancesquared( pos, entpos ); - if ( distsq < ( radius * radius ) || !dolos && weapondamagetracepassed( pos, entpos, startradius, grenades[ i ] ) ) - { - newent = spawnstruct(); - newent.isplayer = 0; - newent.isadestructable = 0; - newent.isadestructible = 0; - newent.isactor = 0; - newent.entity = grenades[ i ]; - newent.damagecenter = entpos; - ents[ ents.size ] = newent; - } - } - destructibles = getentarray( "destructible", "targetname" ); - for ( i = 0; i < destructibles.size; i++ ) - { - entpos = destructibles[ i ].origin; - distsq = distancesquared( pos, entpos ); - if ( distsq < ( radius * radius ) || !dolos && weapondamagetracepassed( pos, entpos, startradius, destructibles[ i ] ) ) - { - newent = spawnstruct(); - newent.isplayer = 0; - newent.isadestructable = 0; - newent.isadestructible = 1; - newent.isactor = 0; - newent.entity = destructibles[ i ]; - newent.damagecenter = entpos; - ents[ ents.size ] = newent; - } - } - destructables = getentarray( "destructable", "targetname" ); - for ( i = 0; i < destructables.size; i++ ) - { - entpos = destructables[ i ].origin; - distsq = distancesquared( pos, entpos ); - if ( distsq < ( radius * radius ) || !dolos && weapondamagetracepassed( pos, entpos, startradius, destructables[ i ] ) ) - { - newent = spawnstruct(); - newent.isplayer = 0; - newent.isadestructable = 1; - newent.isadestructible = 0; - newent.isactor = 0; - newent.entity = destructables[ i ]; - newent.damagecenter = entpos; - ents[ ents.size ] = newent; - } - } - dogs = maps/mp/killstreaks/_dogs::dog_manager_get_dogs(); - foreach ( dog in dogs ) - { - if ( !isalive( dog ) ) - { - } - else - { - entpos = dog.origin; - distsq = distancesquared( pos, entpos ); - if ( distsq < ( radius * radius ) || !dolos && weapondamagetracepassed( pos, entpos, startradius, dog ) ) - { - newent = spawnstruct(); - newent.isplayer = 0; - newent.isadestructable = 0; - newent.isadestructible = 0; - newent.isactor = 1; - newent.entity = dog; - newent.damagecenter = entpos; - ents[ ents.size ] = newent; - } - } - } - return ents; + self notify( "grenadeTrackingStart" ); + self endon( "grenadeTrackingStart" ); + self endon( "disconnect" ); + + for (;;) + { + self waittill( "grenade_fire", grenade, weaponname, parent ); + + if ( grenade maps\mp\_utility::ishacked() ) + continue; + + switch ( weaponname ) + { + case "flash_grenade_mp": + continue; + case "concussion_grenade_mp": + continue; + case "willy_pete_mp": + grenade thread maps\mp\_smokegrenade::watchsmokegrenadedetonation( self ); + continue; + case "tabun_gas_mp": + grenade thread maps\mp\_tabun::watchtabungrenadedetonation( self ); + continue; + case "sticky_grenade_mp": + grenade thread checkstucktoplayer( 1, 1, weaponname ); + grenade thread checkstucktoshield(); + continue; + case "satchel_charge_mp": + case "c4_mp": + grenade thread checkstucktoplayer( 1, 0, weaponname ); + continue; + case "proximity_grenade_mp": + grenade thread checkstucktoshield(); + grenade thread maps\mp\_proximity_grenade::watchproximitygrenadehitplayer( self ); + continue; + case "tactical_insertion_mp": + grenade thread maps\mp\_tacticalinsertion::watch( self ); + continue; + case "scrambler_mp": + continue; + case "explosive_bolt_mp": + grenade.ownerweaponatlaunch = self.currentweapon; + grenade.owneradsatlaunch = self playerads() == 1 ? 1 : 0; + grenade thread maps\mp\_explosive_bolt::watch_bolt_detonation( self ); + grenade thread checkstucktoplayer( 1, 0, weaponname ); + grenade thread checkstucktoshield(); + continue; + case "hatchet_mp": + grenade.lastweaponbeforetoss = self getlastweapon(); + grenade thread checkhatchetbounce(); + grenade thread checkstucktoplayer( 0, 0, weaponname ); + self addweaponstat( weaponname, "used", 1 ); + continue; + case "emp_grenade_mp": + grenade thread maps\mp\_empgrenade::watchempexplosion( self, weaponname ); + continue; + } + } } -weapondamagetracepassed( from, to, startradius, ignore ) //checked matches cerberus output +checkstucktoplayer( deleteonteamchange, awardscoreevent, weaponname ) { - trace = weapondamagetrace( from, to, startradius, ignore ); - return trace[ "fraction" ] == 1; + self endon( "death" ); + + self waittill( "stuck_to_player", player ); + + if ( isdefined( player ) ) + { + if ( deleteonteamchange ) + self thread stucktoplayerteamchange( player ); + + if ( awardscoreevent && isdefined( self.originalowner ) ) + { + if ( self.originalowner isenemyplayer( player ) ) + maps\mp\_scoreevents::processscoreevent( "stick_explosive_kill", self.originalowner, player, weaponname ); + } + + self.stucktoplayer = player; + } } -weapondamagetrace( from, to, startradius, ignore ) //checked changed to match cerberus output +checkstucktoshield() { - midpos = undefined; - diff = to - from; - if ( lengthsquared( diff ) < ( startradius * startradius ) ) - { - midpos = to; - } - dir = vectornormalize( diff ); - midpos = from + ( dir[ 0 ] * startradius, dir[ 1 ] * startradius, dir[ 2 ] * startradius ); - trace = bullettrace( midpos, to, 0, ignore ); - if ( getDvarInt( "scr_damage_debug" ) != 0 ) - { - if ( trace[ "fraction" ] == 1 ) - { - thread debugline( midpos, to, ( 1, 1, 1 ) ); - } - else - { - thread debugline( midpos, trace[ "position" ], ( 1, 0.9, 0.8 ) ); - thread debugline( trace[ "position" ], to, ( 1, 0.4, 0.3 ) ); - } - } - return trace; + self endon( "death" ); + + self waittill( "stuck_to_shield", other, owner ); + + other maps\mp\_riotshield::watchriotshieldstuckentitydeath( self, owner ); } -damageent( einflictor, eattacker, idamage, smeansofdeath, sweapon, damagepos, damagedir ) //checked does not match cerberus output matches beta dump +checkhatchetbounce() { - if ( self.isplayer ) - { - self.damageorigin = damagepos; - self.entity thread [[ level.callbackplayerdamage ]]( einflictor, eattacker, idamage, 0, smeansofdeath, sweapon, damagepos, damagedir, "none", 0, 0 ); - } - else if ( self.isactor ) - { - self.damageorigin = damagepos; - self.entity thread [[ level.callbackactordamage ]]( einflictor, eattacker, idamage, 0, smeansofdeath, sweapon, damagepos, damagedir, "none", 0, 0 ); - } - else if ( self.isadestructible ) - { - self.damageorigin = damagepos; - self.entity dodamage( idamage, damagepos, eattacker, einflictor, 0, smeansofdeath, 0, sweapon ); - } - else - { - if ( self.isadestructable || sweapon == "claymore_mp" && sweapon == "airstrike_mp" ) - { - return; - } - self.entity damage_notify_wrapper( idamage, eattacker, ( 0, 0, 0 ), ( 0, 0, 0 ), "mod_explosive", "", "" ); - } + self endon( "stuck_to_player" ); + self endon( "death" ); + + self waittill( "grenade_bounce" ); + + self.bounced = 1; } -debugline( a, b, color ) //checked changed to match cerberus output +stucktoplayerteamchange( player ) { - /* + self endon( "death" ); + player endon( "disconnect" ); + originalteam = player.pers["team"]; + + while ( true ) + { + player waittill( "joined_team" ); + + if ( player.pers["team"] != originalteam ) + { + self detonate(); + return; + } + } +} + +beginsatcheltracking() +{ + self endon( "death" ); + self endon( "disconnect" ); + self waittill_any( "grenade_fire", "weapon_change" ); + self.throwinggrenade = 0; +} + +watchforthrowbacks() +{ + self endon( "death" ); + self endon( "disconnect" ); + + for (;;) + { + self waittill( "grenade_fire", grenade, weapname ); + + if ( self.gotpullbacknotify ) + { + self.gotpullbacknotify = 0; + continue; + } + + if ( !issubstr( weapname, "frag_" ) ) + continue; + + grenade.threwback = 1; + grenade.originalowner = self; + } +} + +waitanddeletedud( waittime ) +{ + self endon( "death" ); + wait( waittime ); + + if ( isdefined( self ) ) + self delete(); +} + +makeallboltsdud() +{ + grenades = getentarray( "grenade", "classname" ); + + for ( i = 0; i < grenades.size; i++ ) + { + if ( grenades[i].model == "t5_weapon_crossbow_bolt" ) + { + grenades[i] makegrenadedud(); + + if ( !isdefined( grenades[i].isdud ) ) + grenades[i] thread waitanddeletedud( level.missileduddeletedelay ); + + grenades[i].isdud = 1; + } + } +} + +turngrenadeintoadud( weapname, isthrowngrenade, player ) +{ + if ( level.roundstartexplosivedelay >= maps\mp\gametypes\_globallogic_utils::gettimepassed() / 1000 ) + { + if ( isweapondisallowedatmatchstart( weapname ) || issubstr( weapname, "gl_" ) ) + { + timeleft = int( level.roundstartexplosivedelay - maps\mp\gametypes\_globallogic_utils::gettimepassed() / 1000 ); + + if ( !timeleft ) + timeleft = 1; + + if ( weapname == "explosive_bolt_mp" ) + { + self makeallboltsdud(); + player iprintlnbold( &"MP_LAUNCHER_UNAVAILABLE_FOR_N", " " + timeleft + " ", &"EXE_SECONDS" ); + } + else + { + if ( isthrowngrenade ) + player iprintlnbold( &"MP_GRENADE_UNAVAILABLE_FOR_N", " " + timeleft + " ", &"EXE_SECONDS" ); + else + player iprintlnbold( &"MP_LAUNCHER_UNAVAILABLE_FOR_N", " " + timeleft + " ", &"EXE_SECONDS" ); + + self makegrenadedud(); + } + } + } +} + +watchforgrenadeduds() +{ + self endon( "spawned_player" ); + self endon( "disconnect" ); + + while ( true ) + { + self waittill( "grenade_fire", grenade, weapname ); + + grenade turngrenadeintoadud( weapname, 1, self ); + } +} + +watchforgrenadelauncherduds() +{ + self endon( "spawned_player" ); + self endon( "disconnect" ); + + while ( true ) + { + self waittill( "grenade_launcher_fire", grenade, weapname ); + + grenade turngrenadeintoadud( weapname, 0, self ); /# - for ( i = 0; i < 600; i++ ) - { - line( a, b, color ); - wait 0.05; + assert( isdefined( grenade ) ); #/ - } - */ + level.missileentities[level.missileentities.size] = grenade; + grenade thread watchmissiledeath(); + } } -onweapondamage( eattacker, einflictor, sweapon, meansofdeath, damage ) //checked matches cerberus output +getdamageableents( pos, radius, dolos, startradius ) { - self endon( "death" ); - self endon( "disconnect" ); - switch( sweapon ) - { - case "concussion_grenade_mp": - radius = 512; - if ( self == eattacker ) - { - radius *= 0.5; - } - scale = 1 - ( distance( self.origin, einflictor.origin ) / radius ); - if ( scale < 0 ) - { - scale = 0; - } - time = 2 + ( 4 * scale ); - wait 0.05; - if ( self hasperk( "specialty_stunprotection" ) ) - { - time *= 0.1; - } - self thread playconcussionsound( time ); - if ( self mayapplyscreeneffect() ) - { - self shellshock( "concussion_grenade_mp", time, 0 ); - } - self.concussionendtime = getTime() + ( time * 1000 ); - self.lastconcussedby = eattacker; - break; - case "proximity_grenade_mp": - self proximitygrenadedamageplayer( eattacker, einflictor ); - break; - default: - maps/mp/gametypes/_shellshock::shellshockondamage( meansofdeath, damage ); - break; - } + ents = []; + + if ( !isdefined( dolos ) ) + dolos = 0; + + if ( !isdefined( startradius ) ) + startradius = 0; + + players = level.players; + + for ( i = 0; i < players.size; i++ ) + { + if ( !isalive( players[i] ) || players[i].sessionstate != "playing" ) + continue; + + playerpos = players[i].origin + vectorscale( ( 0, 0, 1 ), 32.0 ); + distsq = distancesquared( pos, playerpos ); + + if ( distsq < radius * radius && ( !dolos || weapondamagetracepassed( pos, playerpos, startradius, undefined ) ) ) + { + newent = spawnstruct(); + newent.isplayer = 1; + newent.isadestructable = 0; + newent.isadestructible = 0; + newent.isactor = 0; + newent.entity = players[i]; + newent.damagecenter = playerpos; + ents[ents.size] = newent; + } + } + + grenades = getentarray( "grenade", "classname" ); + + for ( i = 0; i < grenades.size; i++ ) + { + entpos = grenades[i].origin; + distsq = distancesquared( pos, entpos ); + + if ( distsq < radius * radius && ( !dolos || weapondamagetracepassed( pos, entpos, startradius, grenades[i] ) ) ) + { + newent = spawnstruct(); + newent.isplayer = 0; + newent.isadestructable = 0; + newent.isadestructible = 0; + newent.isactor = 0; + newent.entity = grenades[i]; + newent.damagecenter = entpos; + ents[ents.size] = newent; + } + } + + destructibles = getentarray( "destructible", "targetname" ); + + for ( i = 0; i < destructibles.size; i++ ) + { + entpos = destructibles[i].origin; + distsq = distancesquared( pos, entpos ); + + if ( distsq < radius * radius && ( !dolos || weapondamagetracepassed( pos, entpos, startradius, destructibles[i] ) ) ) + { + newent = spawnstruct(); + newent.isplayer = 0; + newent.isadestructable = 0; + newent.isadestructible = 1; + newent.isactor = 0; + newent.entity = destructibles[i]; + newent.damagecenter = entpos; + ents[ents.size] = newent; + } + } + + destructables = getentarray( "destructable", "targetname" ); + + for ( i = 0; i < destructables.size; i++ ) + { + entpos = destructables[i].origin; + distsq = distancesquared( pos, entpos ); + + if ( distsq < radius * radius && ( !dolos || weapondamagetracepassed( pos, entpos, startradius, destructables[i] ) ) ) + { + newent = spawnstruct(); + newent.isplayer = 0; + newent.isadestructable = 1; + newent.isadestructible = 0; + newent.isactor = 0; + newent.entity = destructables[i]; + newent.damagecenter = entpos; + ents[ents.size] = newent; + } + } + + dogs = maps\mp\killstreaks\_dogs::dog_manager_get_dogs(); + + foreach ( dog in dogs ) + { + if ( !isalive( dog ) ) + continue; + + entpos = dog.origin; + distsq = distancesquared( pos, entpos ); + + if ( distsq < radius * radius && ( !dolos || weapondamagetracepassed( pos, entpos, startradius, dog ) ) ) + { + newent = spawnstruct(); + newent.isplayer = 0; + newent.isadestructable = 0; + newent.isadestructible = 0; + newent.isactor = 1; + newent.entity = dog; + newent.damagecenter = entpos; + ents[ents.size] = newent; + } + } + + return ents; } -playconcussionsound( duration ) //checked matches cerberus output +weapondamagetracepassed( from, to, startradius, ignore ) { - self endon( "death" ); - self endon( "disconnect" ); - concussionsound = spawn( "script_origin", ( 0, 0, 1 ) ); - concussionsound.origin = self.origin; - concussionsound linkto( self ); - concussionsound thread deleteentonownerdeath( self ); - concussionsound playsound( "" ); - concussionsound playloopsound( "" ); - if ( duration > 0.5 ) - { - wait ( duration - 0.5 ); - } - concussionsound playsound( "" ); - concussionsound stoploopsound( 0.5 ); - wait 0.5; - concussionsound notify( "delete" ); - concussionsound delete(); + trace = weapondamagetrace( from, to, startradius, ignore ); + return trace["fraction"] == 1; } -deleteentonownerdeath( owner ) //checked matches cerberus output +weapondamagetrace( from, to, startradius, ignore ) { - self endon( "delete" ); - owner waittill( "death" ); - self delete(); + midpos = undefined; + diff = to - from; + + if ( lengthsquared( diff ) < startradius * startradius ) + midpos = to; + + dir = vectornormalize( diff ); + midpos = from + ( dir[0] * startradius, dir[1] * startradius, dir[2] * startradius ); + trace = bullettrace( midpos, to, 0, ignore ); + + if ( getdvarint( _hash_A1C40B1 ) != 0 ) + { + if ( trace["fraction"] == 1 ) + thread debugline( midpos, to, ( 1, 1, 1 ) ); + else + { + thread debugline( midpos, trace["position"], ( 1, 0.9, 0.8 ) ); + thread debugline( trace["position"], to, ( 1, 0.4, 0.3 ) ); + } + } + + return trace; } -monitor_dog_special_grenades() //checked matches cerberus output +damageent( einflictor, eattacker, idamage, smeansofdeath, sweapon, damagepos, damagedir ) { - self endon( "death" ); - while ( 1 ) - { - self waittill( "damage", damage, attacker, direction_vec, point, type, modelname, tagname, partname, weaponname, idflags ); - if ( isflashorstunweapon( weaponname ) ) - { - damage_area = spawn( "trigger_radius", self.origin, 0, 128, 128 ); - attacker thread maps/mp/killstreaks/_dogs::flash_dogs( damage_area ); - wait 0.05; - damage_area delete(); - } - } + if ( self.isplayer ) + { + self.damageorigin = damagepos; + self.entity thread [[ level.callbackplayerdamage ]]( einflictor, eattacker, idamage, 0, smeansofdeath, sweapon, damagepos, damagedir, "none", 0, 0 ); + } + else if ( self.isactor ) + { + self.damageorigin = damagepos; + self.entity thread [[ level.callbackactordamage ]]( einflictor, eattacker, idamage, 0, smeansofdeath, sweapon, damagepos, damagedir, "none", 0, 0 ); + } + else if ( self.isadestructible ) + { + self.damageorigin = damagepos; + self.entity dodamage( idamage, damagepos, eattacker, einflictor, 0, smeansofdeath, 0, sweapon ); + } + else + { + if ( self.isadestructable && ( sweapon == "claymore_mp" || sweapon == "airstrike_mp" ) ) + return; + + self.entity damage_notify_wrapper( idamage, eattacker, ( 0, 0, 0 ), ( 0, 0, 0 ), "mod_explosive", "", "" ); + } } -isprimaryweapon( weaponname ) //checked matches cerberus output +debugline( a, b, color ) { - return isDefined( level.primary_weapon_array[ weaponname ] ); -} - -issidearm( weaponname ) //checked matches cerberus output -{ - return isDefined( level.side_arm_array[ weaponname ] ); -} - -isinventory( weaponname ) //checked matches cerberus output -{ - return isDefined( level.inventory_array[ weaponname ] ); -} - -isgrenade( weaponname ) //checked matches cerberus output -{ - return isDefined( level.grenade_array[ weaponname ] ); -} - -isexplosivebulletweapon( weaponname ) //checked changed to match cerberus output -{ - if ( weaponname == "chopper_minigun_mp" || weaponname == "cobra_20mm_mp" || weaponname == "littlebird_guard_minigun_mp" || weaponname == "cobra_20mm_comlink_mp" ) - { - return 1; - } - return 0; -} - -getweaponclass_array( current ) //checked changed to match cerberus output -{ - if ( isprimaryweapon( current ) ) - { - return level.primary_weapon_array; - } - else if ( issidearm( current ) ) - { - return level.side_arm_array; - } - else if ( isgrenade( current ) ) - { - return level.grenade_array; - } - else - { - return level.inventory_array; - } -} - -updatestowedweapon() //checked partially changed to match cerberus output did not use for loop see github for more info -{ - self endon( "spawned" ); - self endon( "killed_player" ); - self endon( "disconnect" ); - self.tag_stowed_back = undefined; - self.tag_stowed_hip = undefined; - team = self.pers[ "team" ]; - class = self.pers[ "class" ]; - while ( 1 ) - { - self waittill( "weapon_change", newweapon ); - if ( self ismantling() ) - { - continue; - } - currentstowed = self getstowedweapon(); - hasstowed = 0; - self.weapon_array_primary = []; - self.weapon_array_sidearm = []; - self.weapon_array_grenade = []; - self.weapon_array_inventory = []; - weaponslist = self getweaponslist(); - idx = 0; - while ( idx < weaponslist.size ) - { - switch( weaponslist[ idx ] ) - { - case "m32_mp": - case "minigun_mp": - idx++; - continue; - default: - break; - } - if ( !hasstowed || currentstowed == weaponslist[ idx ] ) - { - currentstowed = weaponslist[ idx ]; - hasstowed = 1; - } - if ( isprimaryweapon( weaponslist[ idx ] ) ) - { - self.weapon_array_primary[ self.weapon_array_primary.size ] = weaponslist[ idx ]; - idx++; - continue; - } - if ( issidearm( weaponslist[ idx ] ) ) - { - self.weapon_array_sidearm[ self.weapon_array_sidearm.size ] = weaponslist[ idx ]; - idx++; - continue; - } - if ( isgrenade( weaponslist[ idx ] ) ) - { - self.weapon_array_grenade[ self.weapon_array_grenade.size ] = weaponslist[ idx ]; - idx++; - continue; - } - if ( isinventory( weaponslist[ idx ] ) ) - { - self.weapon_array_inventory[ self.weapon_array_inventory.size ] = weaponslist[ idx ]; - idx++; - continue; - } - if ( isweaponprimary( weaponslist[ idx ] ) ) - { - self.weapon_array_primary[ self.weapon_array_primary.size ] = weaponslist[ idx ]; - } - idx++; - } - if ( newweapon != "none" || !hasstowed ) - { - detach_all_weapons(); - stow_on_back(); - stow_on_hip(); - } - } -} - -forcestowedweaponupdate() //checked matches cerberus output -{ - detach_all_weapons(); - stow_on_back(); - stow_on_hip(); -} - -detachcarryobjectmodel() //checked matches cerberus output -{ - if ( isDefined( self.carryobject ) && isDefined( self.carryobject maps/mp/gametypes/_gameobjects::getvisiblecarriermodel() ) ) - { - if ( isDefined( self.tag_stowed_back ) ) - { - self detach( self.tag_stowed_back, "tag_stowed_back" ); - self.tag_stowed_back = undefined; - } - } -} - -detach_all_weapons() //checked matches cerberus output -{ - if ( isDefined( self.tag_stowed_back ) ) - { - clear_weapon = 1; - if ( isDefined( self.carryobject ) ) - { - carriermodel = self.carryobject maps/mp/gametypes/_gameobjects::getvisiblecarriermodel(); - if ( isDefined( carriermodel ) && carriermodel == self.tag_stowed_back ) - { - self detach( self.tag_stowed_back, "tag_stowed_back" ); - clear_weapon = 0; - } - } - if ( clear_weapon ) - { - self clearstowedweapon(); - } - self.tag_stowed_back = undefined; - } - if ( isDefined( self.tag_stowed_hip ) ) - { - detach_model = getweaponmodel( self.tag_stowed_hip ); - self detach( detach_model, "tag_stowed_hip_rear" ); - self.tag_stowed_hip = undefined; - } -} - -non_stowed_weapon( weapon ) //checked matches cerberus output -{ - if ( self hasweapon( "knife_ballistic_mp" ) && weapon != "knife_ballistic_mp" ) - { - return 1; - } - if ( self hasweapon( "knife_held_mp" ) && weapon != "knife_held_mp" ) - { - return 1; - } - return 0; -} - -stow_on_back( current ) //checked partially changed to match cerberus output did not use for loop see github for more info -{ - current = self getcurrentweapon(); - currentalt = self getcurrentweaponaltweapon(); - self.tag_stowed_back = undefined; - weaponoptions = 0; - index_weapon = ""; - if ( isDefined( self.carryobject ) && isDefined( self.carryobject maps/mp/gametypes/_gameobjects::getvisiblecarriermodel() ) ) - { - self.tag_stowed_back = self.carryobject maps/mp/gametypes/_gameobjects::getvisiblecarriermodel(); - self attach( self.tag_stowed_back, "tag_stowed_back", 1 ); - return; - } - if ( non_stowed_weapon( current ) ) - { - return; - } - if ( current != "none" ) - { - idx = 0; - while ( idx < self.weapon_array_primary.size ) - { - temp_index_weapon = self.weapon_array_primary[ idx ]; - /* /# - assert( isDefined( temp_index_weapon ), "Primary weapon list corrupted." ); + for ( i = 0; i < 600; i++ ) + { + line( a, b, color ); + wait 0.05; + } #/ - */ - if ( temp_index_weapon == current ) - { - idx++; - continue; - } - if ( temp_index_weapon == currentalt ) - { - idx++; - continue; - } - index_weapon = temp_index_weapon; - /* +} + +onweapondamage( eattacker, einflictor, sweapon, meansofdeath, damage ) +{ + self endon( "death" ); + self endon( "disconnect" ); + + switch ( sweapon ) + { + case "concussion_grenade_mp": + radius = 512; + + if ( self == eattacker ) + radius *= 0.5; + + scale = 1 - distance( self.origin, einflictor.origin ) / radius; + + if ( scale < 0 ) + scale = 0; + + time = 2 + 4 * scale; + wait 0.05; + + if ( self hasperk( "specialty_stunprotection" ) ) + time *= 0.1; + + self thread playconcussionsound( time ); + + if ( self mayapplyscreeneffect() ) + self shellshock( "concussion_grenade_mp", time, 0 ); + + self.concussionendtime = gettime() + time * 1000; + self.lastconcussedby = eattacker; + break; + case "proximity_grenade_mp": + self proximitygrenadedamageplayer( eattacker, einflictor ); + break; + default: + maps\mp\gametypes\_shellshock::shellshockondamage( meansofdeath, damage ); + break; + } +} + +playconcussionsound( duration ) +{ + self endon( "death" ); + self endon( "disconnect" ); + concussionsound = spawn( "script_origin", ( 0, 0, 1 ) ); + concussionsound.origin = self.origin; + concussionsound linkto( self ); + concussionsound thread deleteentonownerdeath( self ); + concussionsound playsound( "" ); + concussionsound playloopsound( "" ); + + if ( duration > 0.5 ) + wait( duration - 0.5 ); + + concussionsound playsound( "" ); + concussionsound stoploopsound( 0.5 ); + wait 0.5; + concussionsound notify( "delete" ); + concussionsound delete(); +} + +deleteentonownerdeath( owner ) +{ + self endon( "delete" ); + + owner waittill( "death" ); + + self delete(); +} + +monitor_dog_special_grenades() +{ + self endon( "death" ); + + while ( true ) + { + self waittill( "damage", damage, attacker, direction_vec, point, type, modelname, tagname, partname, weaponname, idflags ); + + if ( isflashorstunweapon( weaponname ) ) + { + damage_area = spawn( "trigger_radius", self.origin, 0, 128, 128 ); + attacker thread maps\mp\killstreaks\_dogs::flash_dogs( damage_area ); + wait 0.05; + damage_area delete(); + } + } +} + +isprimaryweapon( weaponname ) +{ + return isdefined( level.primary_weapon_array[weaponname] ); +} + +issidearm( weaponname ) +{ + return isdefined( level.side_arm_array[weaponname] ); +} + +isinventory( weaponname ) +{ + return isdefined( level.inventory_array[weaponname] ); +} + +isgrenade( weaponname ) +{ + return isdefined( level.grenade_array[weaponname] ); +} + +isexplosivebulletweapon( weaponname ) +{ + if ( weaponname == "chopper_minigun_mp" || weaponname == "cobra_20mm_mp" || weaponname == "littlebird_guard_minigun_mp" || weaponname == "cobra_20mm_comlink_mp" ) + return true; + + return false; +} + +getweaponclass_array( current ) +{ + if ( isprimaryweapon( current ) ) + return level.primary_weapon_array; + else if ( issidearm( current ) ) + return level.side_arm_array; + else if ( isgrenade( current ) ) + return level.grenade_array; + else + return level.inventory_array; +} + +updatestowedweapon() +{ + self endon( "spawned" ); + self endon( "killed_player" ); + self endon( "disconnect" ); + self.tag_stowed_back = undefined; + self.tag_stowed_hip = undefined; + team = self.pers["team"]; + class = self.pers["class"]; + + while ( true ) + { + self waittill( "weapon_change", newweapon ); + + if ( self ismantling() ) + continue; + + currentstowed = self getstowedweapon(); + hasstowed = 0; + self.weapon_array_primary = []; + self.weapon_array_sidearm = []; + self.weapon_array_grenade = []; + self.weapon_array_inventory = []; + weaponslist = self getweaponslist(); + + for ( idx = 0; idx < weaponslist.size; idx++ ) + { + switch ( weaponslist[idx] ) + { + case "minigun_mp": + case "m32_mp": + continue; + default: + break; + } + + if ( !hasstowed || currentstowed == weaponslist[idx] ) + { + currentstowed = weaponslist[idx]; + hasstowed = 1; + } + + if ( isprimaryweapon( weaponslist[idx] ) ) + { + self.weapon_array_primary[self.weapon_array_primary.size] = weaponslist[idx]; + continue; + } + + if ( issidearm( weaponslist[idx] ) ) + { + self.weapon_array_sidearm[self.weapon_array_sidearm.size] = weaponslist[idx]; + continue; + } + + if ( isgrenade( weaponslist[idx] ) ) + { + self.weapon_array_grenade[self.weapon_array_grenade.size] = weaponslist[idx]; + continue; + } + + if ( isinventory( weaponslist[idx] ) ) + { + self.weapon_array_inventory[self.weapon_array_inventory.size] = weaponslist[idx]; + continue; + } + + if ( isweaponprimary( weaponslist[idx] ) ) + self.weapon_array_primary[self.weapon_array_primary.size] = weaponslist[idx]; + } + + if ( newweapon != "none" || !hasstowed ) + { + detach_all_weapons(); + stow_on_back(); + stow_on_hip(); + } + } +} + +forcestowedweaponupdate() +{ + detach_all_weapons(); + stow_on_back(); + stow_on_hip(); +} + +detachcarryobjectmodel() +{ + if ( isdefined( self.carryobject ) && isdefined( self.carryobject maps\mp\gametypes\_gameobjects::getvisiblecarriermodel() ) ) + { + if ( isdefined( self.tag_stowed_back ) ) + { + self detach( self.tag_stowed_back, "tag_stowed_back" ); + self.tag_stowed_back = undefined; + } + } +} + +detach_all_weapons() +{ + if ( isdefined( self.tag_stowed_back ) ) + { + clear_weapon = 1; + + if ( isdefined( self.carryobject ) ) + { + carriermodel = self.carryobject maps\mp\gametypes\_gameobjects::getvisiblecarriermodel(); + + if ( isdefined( carriermodel ) && carriermodel == self.tag_stowed_back ) + { + self detach( self.tag_stowed_back, "tag_stowed_back" ); + clear_weapon = 0; + } + } + + if ( clear_weapon ) + self clearstowedweapon(); + + self.tag_stowed_back = undefined; + } + + if ( isdefined( self.tag_stowed_hip ) ) + { + detach_model = getweaponmodel( self.tag_stowed_hip ); + self detach( detach_model, "tag_stowed_hip_rear" ); + self.tag_stowed_hip = undefined; + } +} + +non_stowed_weapon( weapon ) +{ + if ( self hasweapon( "knife_ballistic_mp" ) && weapon != "knife_ballistic_mp" ) + return true; + + if ( self hasweapon( "knife_held_mp" ) && weapon != "knife_held_mp" ) + return true; + + return false; +} + +stow_on_back( current ) +{ + current = self getcurrentweapon(); + currentalt = self getcurrentweaponaltweapon(); + self.tag_stowed_back = undefined; + weaponoptions = 0; + index_weapon = ""; + + if ( isdefined( self.carryobject ) && isdefined( self.carryobject maps\mp\gametypes\_gameobjects::getvisiblecarriermodel() ) ) + { + self.tag_stowed_back = self.carryobject maps\mp\gametypes\_gameobjects::getvisiblecarriermodel(); + self attach( self.tag_stowed_back, "tag_stowed_back", 1 ); + return; + } + else if ( non_stowed_weapon( current ) ) + return; + else if ( current != "none" ) + { + for ( idx = 0; idx < self.weapon_array_primary.size; idx++ ) + { + temp_index_weapon = self.weapon_array_primary[idx]; /# - assert( isDefined( self.curclass ), "Player missing current class" ); + assert( isdefined( temp_index_weapon ), "Primary weapon list corrupted." ); #/ - */ - if ( issubstr( index_weapon, self.pers[ "primaryWeapon" ] ) && issubstr( self.curclass, "CUSTOM" ) ) - { - self.tag_stowed_back = getweaponmodel( index_weapon ); - } - else - { - stowedmodelindex = getweaponstowedmodel( index_weapon ); - self.tag_stowed_back = getweaponmodel( index_weapon, stowedmodelindex ); - } - if ( issubstr( self.curclass, "CUSTOM" ) ) - { - weaponoptions = self calcweaponoptions( self.class_num, 0 ); - } - idx++; - } - } - if ( !isDefined( self.tag_stowed_back ) ) - { - return; - } - self setstowedweapon( index_weapon ); -} -stow_on_hip() //checked partially changed to match cerberus output did not use for loop see github for more info -{ - current = self getcurrentweapon(); - self.tag_stowed_hip = undefined; - idx = 0; - while ( idx < self.weapon_array_inventory.size ) - { - if ( self.weapon_array_inventory[ idx ] == current ) - { - idx++; - continue; - } - if ( !self getweaponammostock( self.weapon_array_inventory[ idx ] ) ) - { - idx++; - continue; - } - self.tag_stowed_hip = self.weapon_array_inventory[ idx ]; - idx++; - } - if ( !isDefined( self.tag_stowed_hip ) ) - { - return; - } - if ( self.tag_stowed_hip != "satchel_charge_mp" || self.tag_stowed_hip == "claymore_mp" && self.tag_stowed_hip == "bouncingbetty_mp" ) - { - self.tag_stowed_hip = undefined; - return; - } - weapon_model = getweaponmodel( self.tag_stowed_hip ); - self attach( weapon_model, "tag_stowed_hip_rear", 1 ); -} + if ( temp_index_weapon == current ) + continue; -stow_inventory( inventories, current ) //checked matches cerberus output -{ - if ( isDefined( self.inventory_tag ) ) - { - detach_model = getweaponmodel( self.inventory_tag ); - self detach( detach_model, "tag_stowed_hip_rear" ); - self.inventory_tag = undefined; - } - if ( !isDefined( inventories[ 0 ] ) || self getweaponammostock( inventories[ 0 ] ) == 0 ) - { - return; - } - if ( inventories[ 0 ] != current ) - { - self.inventory_tag = inventories[ 0 ]; - weapon_model = getweaponmodel( self.inventory_tag ); - self attach( weapon_model, "tag_stowed_hip_rear", 1 ); - } -} + if ( temp_index_weapon == currentalt ) + continue; -weapons_get_dvar_int( dvar, def ) //checked matches cerberus output -{ - return int( weapons_get_dvar( dvar, def ) ); -} - -weapons_get_dvar( dvar, def ) //checked matches cerberus output -{ - if ( getDvar( dvar ) != "" ) - { - return getDvarFloat( dvar ); - } - else - { - setdvar( dvar, def ); - return def; - } -} - -player_is_driver() //checked matches cerberus output -{ - if ( !isalive( self ) ) - { - return 0; - } - if ( self isremotecontrolling() ) - { - return 0; - } - vehicle = self getvehicleoccupied(); - if ( isDefined( vehicle ) ) - { - seat = vehicle getoccupantseat( self ); - if ( isDefined( seat ) && seat == 0 ) - { - return 1; - } - } - return 0; -} - -loadout_get_offhand_weapon( stat ) //checked matches cerberus output -{ - if ( isDefined( level.givecustomloadout ) ) - { - return "weapon_null_mp"; - } - /* + index_weapon = temp_index_weapon; /# - assert( isDefined( self.class_num ) ); + assert( isdefined( self.curclass ), "Player missing current class" ); #/ - */ - if ( isDefined( self.class_num ) ) - { - index = self maps/mp/gametypes/_class::getloadoutitemfromddlstats( self.class_num, stat ); - if ( isDefined( level.tbl_weaponids[ index ] ) && isDefined( level.tbl_weaponids[ index ][ "reference" ] ) ) - { - return level.tbl_weaponids[ index ][ "reference" ] + "_mp"; - } - } - return "weapon_null_mp"; + + if ( issubstr( index_weapon, self.pers["primaryWeapon"] ) && issubstr( self.curclass, "CUSTOM" ) ) + self.tag_stowed_back = getweaponmodel( index_weapon ); + else + { + stowedmodelindex = getweaponstowedmodel( index_weapon ); + self.tag_stowed_back = getweaponmodel( index_weapon, stowedmodelindex ); + } + + if ( issubstr( self.curclass, "CUSTOM" ) ) + weaponoptions = self calcweaponoptions( self.class_num, 0 ); + } + } + + if ( !isdefined( self.tag_stowed_back ) ) + return; + + self setstowedweapon( index_weapon ); } -loadout_get_offhand_count( stat ) //checked matches cerberus output +stow_on_hip() { - count = 0; - if ( isDefined( level.givecustomloadout ) ) - { - return 0; - } - /* + current = self getcurrentweapon(); + self.tag_stowed_hip = undefined; + + for ( idx = 0; idx < self.weapon_array_inventory.size; idx++ ) + { + if ( self.weapon_array_inventory[idx] == current ) + continue; + + if ( !self getweaponammostock( self.weapon_array_inventory[idx] ) ) + continue; + + self.tag_stowed_hip = self.weapon_array_inventory[idx]; + } + + if ( !isdefined( self.tag_stowed_hip ) ) + return; + + if ( self.tag_stowed_hip == "satchel_charge_mp" || self.tag_stowed_hip == "claymore_mp" || self.tag_stowed_hip == "bouncingbetty_mp" ) + { + self.tag_stowed_hip = undefined; + return; + } + + weapon_model = getweaponmodel( self.tag_stowed_hip ); + self attach( weapon_model, "tag_stowed_hip_rear", 1 ); +} + +stow_inventory( inventories, current ) +{ + if ( isdefined( self.inventory_tag ) ) + { + detach_model = getweaponmodel( self.inventory_tag ); + self detach( detach_model, "tag_stowed_hip_rear" ); + self.inventory_tag = undefined; + } + + if ( !isdefined( inventories[0] ) || self getweaponammostock( inventories[0] ) == 0 ) + return; + + if ( inventories[0] != current ) + { + self.inventory_tag = inventories[0]; + weapon_model = getweaponmodel( self.inventory_tag ); + self attach( weapon_model, "tag_stowed_hip_rear", 1 ); + } +} + +weapons_get_dvar_int( 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; + } +} + +player_is_driver() +{ + if ( !isalive( self ) ) + return false; + + if ( self isremotecontrolling() ) + return false; + + vehicle = self getvehicleoccupied(); + + if ( isdefined( vehicle ) ) + { + seat = vehicle getoccupantseat( self ); + + if ( isdefined( seat ) && seat == 0 ) + return true; + } + + return false; +} + +loadout_get_offhand_weapon( stat ) +{ + if ( isdefined( level.givecustomloadout ) ) + return "weapon_null_mp"; + /# - assert( isDefined( self.class_num ) ); + assert( isdefined( self.class_num ) ); #/ - */ - if ( isDefined( self.class_num ) ) - { - count = self maps/mp/gametypes/_class::getloadoutitemfromddlstats( self.class_num, stat ); - } - return count; + + if ( isdefined( self.class_num ) ) + { + index = self maps\mp\gametypes\_class::getloadoutitemfromddlstats( self.class_num, stat ); + + if ( isdefined( level.tbl_weaponids[index] ) && isdefined( level.tbl_weaponids[index]["reference"] ) ) + return level.tbl_weaponids[index]["reference"] + "_mp"; + } + + return "weapon_null_mp"; } -scavenger_think() //checked partially changed to match cerberus output did not use for loops see github for more info +loadout_get_offhand_count( stat ) { - self endon( "death" ); - self waittill( "scavenger", player ); - primary_weapons = player getweaponslistprimaries(); - offhand_weapons_and_alts = array_exclude( player getweaponslist( 1 ), primary_weapons ); - arrayremovevalue( offhand_weapons_and_alts, "knife_mp" ); - offhand_weapons_and_alts = array_reverse( offhand_weapons_and_alts ); - player playsound( "fly_equipment_pickup_npc" ); - player playlocalsound( "fly_equipment_pickup_plr" ); - player.scavenger_icon.alpha = 1; - player.scavenger_icon fadeovertime( 2,5 ); - player.scavenger_icon.alpha = 0; - loadout_primary = player loadout_get_offhand_weapon( "primarygrenade" ); - loadout_primary_count = player loadout_get_offhand_count( "primarygrenadecount" ); - loadout_secondary = player loadout_get_offhand_weapon( "specialgrenade" ); - loadout_secondary_count = player loadout_get_offhand_count( "specialgrenadeCount" ); - i = 0; - while ( i < offhand_weapons_and_alts.size ) - { - weapon = offhand_weapons_and_alts[ i ]; - if ( ishackweapon( weapon ) ) - { - i++; - continue; - } - switch ( weapon ) - { - case "satchel_charge_mp": - if ( player maps/mp/gametypes/_weaponobjects::anyobjectsinworld( weapon ) ) - { - break; - } - case "bouncingbetty_mp": - case "claymore_mp": - case "frag_grenade_mp": - case "hatchet_mp": - case "sticky_grenade_mp": - if ( isDefined( player.grenadetypeprimarycount ) && player.grenadetypeprimarycount < 1 ) - { - break; - } - case "concussion_grenade_mp": - case "emp_grenade_mp": - case "flash_grenade_mp": - case "nightingale_mp": - case "pda_hack_mp": - case "proximity_grenade_mp": - case "sensor_grenade_mp": - case "tabun_gas_mp": - case "trophy_system_mp": - case "willy_pete_mp": - if ( isDefined( player.grenadetypesecondarycount ) && player.grenadetypesecondarycount < 1 ) - { - break; - } - maxammo = weaponmaxammo( weapon ); - stock = player getweaponammostock( weapon ); - if ( isDefined( level.customloadoutscavenge ) ) - { - maxammo = self [[ level.customloadoutscavenge ]]( weapon ); - } - else if ( weapon == loadout_primary ) - { - maxammo = loadout_primary_count; - } - else if ( weapon == loadout_secondary ) - { - maxammo = loadout_secondary_count; - } - if ( stock < maxammo ) - { - ammo = stock + 1; - if ( ammo > maxammo ) - { - ammo = maxammo; - } - player setweaponammostock( weapon, ammo ); - player.scavenged = 1; - player thread maps/mp/_challenges::scavengedgrenade(); - } - break; - } - i++; - } - i = 0; - while ( i < primary_weapons.size ) - { - weapon = primary_weapons[ i ]; - if ( ishackweapon( weapon ) ) - { - i++; - continue; - } - stock = player getweaponammostock( weapon ); - start = player getfractionstartammo( weapon ); - clip = weaponclipsize( weapon ); - clip *= getdvarfloatdefault( "scavenger_clip_multiplier", 1 ); - clip = int( clip ); - maxammo = weaponmaxammo( weapon ); - if ( stock < ( maxammo - clip ) ) - { - ammo = stock + clip; - player setweaponammostock( weapon, ammo ); - player.scavenged = 1; - exit_early = 1; - i++; - continue; - } - player setweaponammostock( weapon, maxammo ); - player.scavenged = 1; - exit_early = 1; - i++; - } + count = 0; + + if ( isdefined( level.givecustomloadout ) ) + return 0; + +/# + assert( isdefined( self.class_num ) ); +#/ + + if ( isdefined( self.class_num ) ) + count = self maps\mp\gametypes\_class::getloadoutitemfromddlstats( self.class_num, stat ); + + return count; } -scavenger_hud_create() //checked matches cerberus output +scavenger_think() { - if ( level.wagermatch ) - { - return; - } - self.scavenger_icon = newclienthudelem( self ); - self.scavenger_icon.horzalign = "center"; - self.scavenger_icon.vertalign = "middle"; - self.scavenger_icon.alpha = 0; - width = 48; - height = 24; - if ( level.splitscreen ) - { - width = int( width * 0.5 ); - height = int( height * 0.5 ); - } - self.scavenger_icon.x = ( width * -1 ) / 2; - self.scavenger_icon.y = 16; - self.scavenger_icon setshader( "hud_scavenger_pickup", width, height ); + self endon( "death" ); + + self waittill( "scavenger", player ); + + primary_weapons = player getweaponslistprimaries(); + offhand_weapons_and_alts = array_exclude( player getweaponslist( 1 ), primary_weapons ); + arrayremovevalue( offhand_weapons_and_alts, "knife_mp" ); + offhand_weapons_and_alts = array_reverse( offhand_weapons_and_alts ); + player playsound( "fly_equipment_pickup_npc" ); + player playlocalsound( "fly_equipment_pickup_plr" ); + player.scavenger_icon.alpha = 1; + player.scavenger_icon fadeovertime( 2.5 ); + player.scavenger_icon.alpha = 0; + loadout_primary = player loadout_get_offhand_weapon( "primarygrenade" ); + loadout_primary_count = player loadout_get_offhand_count( "primarygrenadecount" ); + loadout_secondary = player loadout_get_offhand_weapon( "specialgrenade" ); + loadout_secondary_count = player loadout_get_offhand_count( "specialgrenadeCount" ); + + for ( i = 0; i < offhand_weapons_and_alts.size; i++ ) + { + weapon = offhand_weapons_and_alts[i]; + + if ( ishackweapon( weapon ) ) + continue; + + switch ( weapon ) + { + case "satchel_charge_mp": + if ( player maps\mp\gametypes\_weaponobjects::anyobjectsinworld( weapon ) ) + continue; + case "sticky_grenade_mp": + case "hatchet_mp": + case "frag_grenade_mp": + case "claymore_mp": + case "bouncingbetty_mp": + if ( isdefined( player.grenadetypeprimarycount ) && player.grenadetypeprimarycount < 1 ) + continue; + case "willy_pete_mp": + case "trophy_system_mp": + case "tabun_gas_mp": + case "sensor_grenade_mp": + case "proximity_grenade_mp": + case "pda_hack_mp": + case "nightingale_mp": + case "flash_grenade_mp": + case "emp_grenade_mp": + case "concussion_grenade_mp": + if ( isdefined( player.grenadetypesecondarycount ) && player.grenadetypesecondarycount < 1 ) + continue; + + maxammo = weaponmaxammo( weapon ); + stock = player getweaponammostock( weapon ); + + if ( isdefined( level.customloadoutscavenge ) ) + maxammo = self [[ level.customloadoutscavenge ]]( weapon ); + else if ( weapon == loadout_primary ) + maxammo = loadout_primary_count; + else if ( weapon == loadout_secondary ) + maxammo = loadout_secondary_count; + + if ( stock < maxammo ) + { + ammo = stock + 1; + + if ( ammo > maxammo ) + ammo = maxammo; + + player setweaponammostock( weapon, ammo ); + player.scavenged = 1; + player thread maps\mp\_challenges::scavengedgrenade(); + } + + continue; + } + } + + for ( i = 0; i < primary_weapons.size; i++ ) + { + weapon = primary_weapons[i]; + + if ( ishackweapon( weapon ) ) + continue; + + stock = player getweaponammostock( weapon ); + start = player getfractionstartammo( weapon ); + clip = weaponclipsize( weapon ); + clip *= getdvarfloatdefault( "scavenger_clip_multiplier", 1 ); + clip = int( clip ); + maxammo = weaponmaxammo( weapon ); + + if ( stock < maxammo - clip ) + { + ammo = stock + clip; + player setweaponammostock( weapon, ammo ); + player.scavenged = 1; + exit_early = 1; + continue; + } + + player setweaponammostock( weapon, maxammo ); + player.scavenged = 1; + exit_early = 1; + } } -dropscavengerfordeath( attacker ) //checked matches cerberus output +scavenger_hud_create() { - if ( sessionmodeiszombiesgame() ) - { - return; - } - if ( level.wagermatch ) - { - return; - } - if ( !isDefined( attacker ) ) - { - return; - } - if ( attacker == self ) - { - return; - } - if ( level.gametype == "hack" ) - { - item = self dropscavengeritem( "scavenger_item_hack_mp" ); - } - else if ( isplayer( attacker ) && attacker hasperk( "specialty_scavenger" ) ) - { - item = self dropscavengeritem( "scavenger_item_mp" ); - } - else - { - return; - } - item thread scavenger_think(); + if ( level.wagermatch ) + return; + + self.scavenger_icon = newclienthudelem( self ); + self.scavenger_icon.horzalign = "center"; + self.scavenger_icon.vertalign = "middle"; + self.scavenger_icon.alpha = 0; + width = 48; + height = 24; + + if ( level.splitscreen ) + { + width = int( width * 0.5 ); + height = int( height * 0.5 ); + } + + self.scavenger_icon.x = width * -1 / 2; + self.scavenger_icon.y = 16; + self.scavenger_icon setshader( "hud_scavenger_pickup", width, height ); } -addlimitedweapon( weapon_name, owner, num_drops ) //checked matches cerberus output +dropscavengerfordeath( attacker ) { - limited_info = spawnstruct(); - limited_info.weapon = weapon_name; - limited_info.drops = num_drops; - owner.limited_info = limited_info; + if ( sessionmodeiszombiesgame() ) + return; + + if ( level.wagermatch ) + return; + + if ( !isdefined( attacker ) ) + return; + + if ( attacker == self ) + return; + + if ( level.gametype == "hack" ) + item = self dropscavengeritem( "scavenger_item_hack_mp" ); + else if ( isplayer( attacker ) && attacker hasperk( "specialty_scavenger" ) ) + item = self dropscavengeritem( "scavenger_item_mp" ); + else + return; + + item thread scavenger_think(); } -shoulddroplimitedweapon( weapon_name, owner ) //checked matches cerberus output +addlimitedweapon( weapon_name, owner, num_drops ) { - limited_info = owner.limited_info; - if ( !isDefined( limited_info ) ) - { - return 1; - } - if ( limited_info.weapon != weapon_name ) - { - return 1; - } - if ( limited_info.drops <= 0 ) - { - return 0; - } - return 1; + limited_info = spawnstruct(); + limited_info.weapon = weapon_name; + limited_info.drops = num_drops; + owner.limited_info = limited_info; } -droplimitedweapon( weapon_name, owner, item ) //checked matches cerberus output +shoulddroplimitedweapon( weapon_name, owner ) { - limited_info = owner.limited_info; - if ( !isDefined( limited_info ) ) - { - return; - } - if ( limited_info.weapon != weapon_name ) - { - return; - } - limited_info.drops -= 1; - owner.limited_info = undefined; - item thread limitedpickup( limited_info ); + limited_info = owner.limited_info; + + if ( !isdefined( limited_info ) ) + return true; + + if ( limited_info.weapon != weapon_name ) + return true; + + if ( limited_info.drops <= 0 ) + return false; + + return true; } -limitedpickup( limited_info ) //checked matches cerberus output +droplimitedweapon( weapon_name, owner, item ) { - self endon( "death" ); - self waittill( "trigger", player, item ); - if ( !isDefined( item ) ) - { - return; - } - player.limited_info = limited_info; + limited_info = owner.limited_info; + + if ( !isdefined( limited_info ) ) + return; + + if ( limited_info.weapon != weapon_name ) + return; + + limited_info.drops -= 1; + owner.limited_info = undefined; + item thread limitedpickup( limited_info ); } +limitedpickup( limited_info ) +{ + self endon( "death" ); + self waittill( "trigger", player, item ); + if ( !isdefined( item ) ) + return; + player.limited_info = limited_info; +} diff --git a/Multiplayer Core/patch_mp/maps/mp/gametypes/conf.gsc b/Multiplayer Core/patch_mp/maps/mp/gametypes/conf.gsc index 5a7d4c2..d5b14b8 100644 --- a/Multiplayer Core/patch_mp/maps/mp/gametypes/conf.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/gametypes/conf.gsc @@ -1,498 +1,490 @@ -#include maps/mp/gametypes/_hostmigration; -#include maps/mp/_scoreevents; -#include maps/mp/gametypes/_globallogic_audio; -#include maps/mp/gametypes/_objpoints; -#include maps/mp/gametypes/_globallogic_score; -#include maps/mp/gametypes/_spawning; -#include maps/mp/gametypes/_spawnlogic; -#include maps/mp/gametypes/_callbacksetup; -#include maps/mp/gametypes/_globallogic; -#include common_scripts/utility; -#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() { - maps/mp/gametypes/_globallogic::init(); - maps/mp/gametypes/_callbacksetup::setupcallbacks(); - maps/mp/gametypes/_globallogic::setupcallbacks(); - registertimelimit( 0, 1440 ); - registerscorelimit( 0, 50000 ); - registerroundlimit( 0, 10 ); - registerroundswitch( 0, 9 ); - registerroundwinlimit( 0, 10 ); - registernumlives( 0, 100 ); - maps/mp/gametypes/_globallogic::registerfriendlyfiredelay( level.gametype, 15, 0, 1440 ); - level.scoreroundbased = 1; - level.teambased = 1; - level.onprecachegametype = ::onprecachegametype; - level.onstartgametype = ::onstartgametype; - level.onspawnplayer = ::onspawnplayer; - level.onspawnplayerunified = ::onspawnplayerunified; - level.onroundendgame = ::onroundendgame; - level.onplayerkilled = ::onplayerkilled; - level.onroundswitch = ::onroundswitch; - level.overrideteamscore = 1; - level.teamscoreperkill = getgametypesetting( "teamScorePerKill" ); - level.teamscoreperkillconfirmed = getgametypesetting( "teamScorePerKillConfirmed" ); - level.teamscoreperkilldenied = getgametypesetting( "teamScorePerKillDenied" ); - level.antiboostdistance = getgametypesetting( "antiBoostDistance" ); - game[ "dialog" ][ "gametype" ] = "kc_start"; - game[ "dialog" ][ "gametype_hardcore" ] = "kc_start"; - game[ "dialog" ][ "offense_obj" ] = "generic_boost"; - game[ "dialog" ][ "defense_obj" ] = "generic_boost"; - game[ "dialog" ][ "kc_deny" ] = "kc_deny"; - game[ "dialog" ][ "kc_start" ] = "kc_start"; - game[ "dialog" ][ "kc_denied" ] = "mpl_kc_killdeny"; - level.conf_fx[ "vanish" ] = loadfx( "maps/mp_maps/fx_mp_kill_confirmed_vanish" ); - if ( !sessionmodeissystemlink() && !sessionmodeisonlinegame() && issplitscreen() ) - { - setscoreboardcolumns( "score", "kills", "killsconfirmed", "killsdenied", "deaths" ); - } - else - { - setscoreboardcolumns( "score", "kills", "deaths", "killsconfirmed", "killsdenied" ); - } + maps\mp\gametypes\_globallogic::init(); + maps\mp\gametypes\_callbacksetup::setupcallbacks(); + maps\mp\gametypes\_globallogic::setupcallbacks(); + registertimelimit( 0, 1440 ); + registerscorelimit( 0, 50000 ); + registerroundlimit( 0, 10 ); + registerroundswitch( 0, 9 ); + registerroundwinlimit( 0, 10 ); + registernumlives( 0, 100 ); + maps\mp\gametypes\_globallogic::registerfriendlyfiredelay( level.gametype, 15, 0, 1440 ); + level.scoreroundbased = 1; + level.teambased = 1; + level.onprecachegametype = ::onprecachegametype; + level.onstartgametype = ::onstartgametype; + level.onspawnplayer = ::onspawnplayer; + level.onspawnplayerunified = ::onspawnplayerunified; + level.onroundendgame = ::onroundendgame; + level.onplayerkilled = ::onplayerkilled; + level.onroundswitch = ::onroundswitch; + level.overrideteamscore = 1; + level.teamscoreperkill = getgametypesetting( "teamScorePerKill" ); + level.teamscoreperkillconfirmed = getgametypesetting( "teamScorePerKillConfirmed" ); + level.teamscoreperkilldenied = getgametypesetting( "teamScorePerKillDenied" ); + level.antiboostdistance = getgametypesetting( "antiBoostDistance" ); + game["dialog"]["gametype"] = "kc_start"; + game["dialog"]["gametype_hardcore"] = "kc_start"; + game["dialog"]["offense_obj"] = "generic_boost"; + game["dialog"]["defense_obj"] = "generic_boost"; + game["dialog"]["kc_deny"] = "kc_deny"; + game["dialog"]["kc_start"] = "kc_start"; + game["dialog"]["kc_denied"] = "mpl_kc_killdeny"; + level.conf_fx["vanish"] = loadfx( "maps/mp_maps/fx_mp_kill_confirmed_vanish" ); + + if ( !sessionmodeissystemlink() && !sessionmodeisonlinegame() && issplitscreen() ) + setscoreboardcolumns( "score", "kills", "killsconfirmed", "killsdenied", "deaths" ); + else + setscoreboardcolumns( "score", "kills", "deaths", "killsconfirmed", "killsdenied" ); } -onprecachegametype() //checked matches cerberus output +onprecachegametype() { - precachemodel( "p6_dogtags" ); - precachemodel( "p6_dogtags_friend" ); - precacheshader( "waypoint_dogtags" ); - precachestring( &"MP_KILL_DENIED" ); + precachemodel( "p6_dogtags" ); + precachemodel( "p6_dogtags_friend" ); + precacheshader( "waypoint_dogtags" ); + precachestring( &"MP_KILL_DENIED" ); } -onstartgametype() //checked changed to match cerberus output +onstartgametype() { - setclientnamemode( "auto_change" ); - if ( !isDefined( game[ "switchedsides" ] ) ) - { - game[ "switchedsides" ] = 0; - } - if ( game[ "switchedsides" ] ) - { - oldattackers = game[ "attackers" ]; - olddefenders = game[ "defenders" ]; - game[ "attackers" ] = olddefenders; - game[ "defenders" ] = oldattackers; - } - allowed = []; - allowed[ 0 ] = level.gametype; - maps/mp/gametypes/_gameobjects::main( allowed ); - level.spawnmins = ( 0, 0, 1 ); - level.spawnmaxs = ( 0, 0, 1 ); - foreach ( team in level.teams ) - { - setobjectivetext( team, &"OBJECTIVES_CONF" ); - setobjectivehinttext( team, &"OBJECTIVES_CONF_HINT" ); - if ( level.splitscreen ) - { - setobjectivescoretext( team, &"OBJECTIVES_CONF" ); - } - else - { - setobjectivescoretext( team, &"OBJECTIVES_CONF_SCORE" ); - } - maps/mp/gametypes/_spawnlogic::placespawnpoints( maps/mp/gametypes/_spawning::gettdmstartspawnname( team ) ); - maps/mp/gametypes/_spawnlogic::addspawnpoints( team, "mp_tdm_spawn" ); - } - maps/mp/gametypes/_spawning::updateallspawnpoints(); - level.spawn_start = []; - foreach ( team in level.teams ) - { - level.spawn_start[ team ] = maps/mp/gametypes/_spawnlogic::getspawnpointarray( maps/mp/gametypes/_spawning::gettdmstartspawnname( team ) ); - } - 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.dogtags = []; - if ( !isoneround() ) - { - level.displayroundendtext = 1; - if ( isscoreroundbased() ) - { - maps/mp/gametypes/_globallogic_score::resetteamscores(); - } - } + setclientnamemode( "auto_change" ); + + if ( !isdefined( game["switchedsides"] ) ) + game["switchedsides"] = 0; + + if ( game["switchedsides"] ) + { + oldattackers = game["attackers"]; + olddefenders = game["defenders"]; + game["attackers"] = olddefenders; + game["defenders"] = oldattackers; + } + + allowed[0] = level.gametype; + maps\mp\gametypes\_gameobjects::main( allowed ); + level.spawnmins = ( 0, 0, 0 ); + level.spawnmaxs = ( 0, 0, 0 ); + + foreach ( team in level.teams ) + { + setobjectivetext( team, &"OBJECTIVES_CONF" ); + setobjectivehinttext( team, &"OBJECTIVES_CONF_HINT" ); + + if ( level.splitscreen ) + setobjectivescoretext( team, &"OBJECTIVES_CONF" ); + else + setobjectivescoretext( team, &"OBJECTIVES_CONF_SCORE" ); + + maps\mp\gametypes\_spawnlogic::placespawnpoints( maps\mp\gametypes\_spawning::gettdmstartspawnname( team ) ); + maps\mp\gametypes\_spawnlogic::addspawnpoints( team, "mp_tdm_spawn" ); + } + + maps\mp\gametypes\_spawning::updateallspawnpoints(); + level.spawn_start = []; + + foreach ( team in level.teams ) + level.spawn_start[team] = maps\mp\gametypes\_spawnlogic::getspawnpointarray( maps\mp\gametypes\_spawning::gettdmstartspawnname( team ) ); + + 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.dogtags = []; + + if ( !isoneround() ) + { + level.displayroundendtext = 1; + + if ( isscoreroundbased() ) + maps\mp\gametypes\_globallogic_score::resetteamscores(); + } } -onplayerkilled( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ) //checked matches cerberus output +onplayerkilled( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ) { - if ( !isplayer( attacker ) || attacker.team == self.team ) - { - return; - } - level thread spawndogtags( self, attacker ); - attacker maps/mp/gametypes/_globallogic_score::giveteamscoreforobjective( attacker.team, level.teamscoreperkill ); + if ( !isplayer( attacker ) || attacker.team == self.team ) + return; + + level thread spawndogtags( self, attacker ); + attacker maps\mp\gametypes\_globallogic_score::giveteamscoreforobjective( attacker.team, level.teamscoreperkill ); } -spawndogtags( victim, attacker ) //checked changed to match cerberus output +spawndogtags( victim, attacker ) { - if ( isDefined( level.dogtags[ victim.entnum ] ) ) - { - playfx( level.conf_fx[ "vanish" ], level.dogtags[ victim.entnum ].curorigin ); - level.dogtags[ victim.entnum ] notify( "reset" ); - } - else - { - visuals = []; - visuals[ 0 ] = spawn( "script_model", ( 0, 0, 0 ) ); - visuals[ 0 ] setmodel( "p6_dogtags" ); - visuals[ 1 ] = spawn( "script_model", ( 0, 0, 0 ) ); - visuals[ 1 ] setmodel( "p6_dogtags_friend" ); - trigger = spawn( "trigger_radius", ( 0, 0, 0 ), 0, 32, 32 ); - level.dogtags[ victim.entnum ] = maps/mp/gametypes/_gameobjects::createuseobject( "any", trigger, visuals, vectorScale( ( 0, 0, 1 ), 16 ) ); - foreach ( team in level.teams ) - { - objective_delete( level.dogtags[ victim.entnum ].objid[ team ] ); - maps/mp/gametypes/_gameobjects::releaseobjid( level.dogtags[ victim.entnum ].objid[ team ] ); - maps/mp/gametypes/_objpoints::deleteobjpoint( level.dogtags[ victim.entnum ].objpoints[ team ] ); - } - level.dogtags[ victim.entnum ] maps/mp/gametypes/_gameobjects::setusetime( 0 ); - level.dogtags[ victim.entnum ].onuse = ::onuse; - level.dogtags[ victim.entnum ].victim = victim; - level.dogtags[ victim.entnum ].victimteam = victim.team; - level.dogtags[ victim.entnum ].objid = maps/mp/gametypes/_gameobjects::getnextobjid(); - objective_add( level.dogtags[ victim.entnum ].objid, "invisible", ( 0, 0, 0 ) ); - objective_icon( level.dogtags[ victim.entnum ].objid, "waypoint_dogtags" ); - level thread clearonvictimdisconnect( victim ); - victim thread tagteamupdater( level.dogtags[ victim.entnum ] ); - } - pos = victim.origin + vectorScale( ( 0, 0, 1 ), 14 ); - level.dogtags[ victim.entnum ].curorigin = pos; - level.dogtags[ victim.entnum ].trigger.origin = pos; - level.dogtags[ victim.entnum ].visuals[ 0 ].origin = pos; - level.dogtags[ victim.entnum ].visuals[ 1 ].origin = pos; - level.dogtags[ victim.entnum ] maps/mp/gametypes/_gameobjects::allowuse( "any" ); - level.dogtags[ victim.entnum ].visuals[ 0 ] thread showtoteam( level.dogtags[ victim.entnum ], attacker.team ); - level.dogtags[ victim.entnum ].visuals[ 1 ] thread showtoenemyteams( level.dogtags[ victim.entnum ], attacker.team ); - level.dogtags[ victim.entnum ].attacker = attacker; - level.dogtags[ victim.entnum ].attackerteam = attacker.team; - level.dogtags[ victim.entnum ].unreachable = undefined; - level.dogtags[ victim.entnum ].tacinsert = 0; - objective_position( level.dogtags[ victim.entnum ].objid, pos ); - objective_state( level.dogtags[ victim.entnum ].objid, "active" ); - objective_setinvisibletoall( level.dogtags[ victim.entnum ].objid ); - objective_setvisibletoplayer( level.dogtags[ victim.entnum ].objid, attacker ); - level.dogtags[ victim.entnum ] thread bounce(); - level notify( "dogtag_spawned" ); + if ( isdefined( level.dogtags[victim.entnum] ) ) + { + playfx( level.conf_fx["vanish"], level.dogtags[victim.entnum].curorigin ); + level.dogtags[victim.entnum] notify( "reset" ); + } + else + { + visuals[0] = spawn( "script_model", ( 0, 0, 0 ) ); + visuals[0] setmodel( "p6_dogtags" ); + visuals[1] = spawn( "script_model", ( 0, 0, 0 ) ); + visuals[1] setmodel( "p6_dogtags_friend" ); + trigger = spawn( "trigger_radius", ( 0, 0, 0 ), 0, 32, 32 ); + level.dogtags[victim.entnum] = maps\mp\gametypes\_gameobjects::createuseobject( "any", trigger, visuals, vectorscale( ( 0, 0, 1 ), 16.0 ) ); + + foreach ( team in level.teams ) + { + objective_delete( level.dogtags[victim.entnum].objid[team] ); + maps\mp\gametypes\_gameobjects::releaseobjid( level.dogtags[victim.entnum].objid[team] ); + maps\mp\gametypes\_objpoints::deleteobjpoint( level.dogtags[victim.entnum].objpoints[team] ); + } + + level.dogtags[victim.entnum] maps\mp\gametypes\_gameobjects::setusetime( 0 ); + level.dogtags[victim.entnum].onuse = ::onuse; + level.dogtags[victim.entnum].victim = victim; + level.dogtags[victim.entnum].victimteam = victim.team; + level.dogtags[victim.entnum].objid = maps\mp\gametypes\_gameobjects::getnextobjid(); + objective_add( level.dogtags[victim.entnum].objid, "invisible", ( 0, 0, 0 ) ); + objective_icon( level.dogtags[victim.entnum].objid, "waypoint_dogtags" ); + level thread clearonvictimdisconnect( victim ); + victim thread tagteamupdater( level.dogtags[victim.entnum] ); + } + + pos = victim.origin + vectorscale( ( 0, 0, 1 ), 14.0 ); + level.dogtags[victim.entnum].curorigin = pos; + level.dogtags[victim.entnum].trigger.origin = pos; + level.dogtags[victim.entnum].visuals[0].origin = pos; + level.dogtags[victim.entnum].visuals[1].origin = pos; + level.dogtags[victim.entnum] maps\mp\gametypes\_gameobjects::allowuse( "any" ); + level.dogtags[victim.entnum].visuals[0] thread showtoteam( level.dogtags[victim.entnum], attacker.team ); + level.dogtags[victim.entnum].visuals[1] thread showtoenemyteams( level.dogtags[victim.entnum], attacker.team ); + level.dogtags[victim.entnum].attacker = attacker; + level.dogtags[victim.entnum].attackerteam = attacker.team; + level.dogtags[victim.entnum].unreachable = undefined; + level.dogtags[victim.entnum].tacinsert = 0; + objective_position( level.dogtags[victim.entnum].objid, pos ); + objective_state( level.dogtags[victim.entnum].objid, "active" ); + objective_setinvisibletoall( level.dogtags[victim.entnum].objid ); + objective_setvisibletoplayer( level.dogtags[victim.entnum].objid, attacker ); + level.dogtags[victim.entnum] thread bounce(); + level notify( "dogtag_spawned" ); } -showtoteam( gameobject, team ) //checked changed to match cerberus output +showtoteam( gameobject, team ) { - gameobject endon( "death" ); - gameobject endon( "reset" ); - self hide(); - foreach ( player in level.players ) - { - if ( player.team == team ) - { - self showtoplayer( player ); - } - } - for ( ;; ) - { - level waittill( "joined_team" ); - self hide(); - foreach ( player in level.players ) - { - if ( player.team == team ) - { - self showtoplayer( player ); - } - if ( gameobject.victimteam == player.team && player == gameobject.attacker ) - { - objective_state( gameobject.objid, "invisible" ); - } - } - } + gameobject endon( "death" ); + gameobject endon( "reset" ); + self hide(); + + foreach ( player in level.players ) + { + if ( player.team == team ) + self showtoplayer( player ); + } + + for (;;) + { + level waittill( "joined_team" ); + + self hide(); + + foreach ( player in level.players ) + { + if ( player.team == team ) + self showtoplayer( player ); + + if ( gameobject.victimteam == player.team && player == gameobject.attacker ) + objective_state( gameobject.objid, "invisible" ); + } + } } -showtoenemyteams( gameobject, friend_team ) //checked changed to match cerberus output +showtoenemyteams( gameobject, friend_team ) { - gameobject endon( "death" ); - gameobject endon( "reset" ); - self hide(); - foreach ( player in level.players ) - { - if ( player.team != friend_team ) - { - self showtoplayer( player ); - } - } - for ( ;; ) - { - level waittill( "joined_team" ); - self hide(); - foreach ( player in level.players ) - { - if ( player.team != friend_team ) - { - self showtoplayer( player ); - } - if ( gameobject.victimteam == player.team && player == gameobject.attacker ) - { - objective_state( gameobject.objid, "invisible" ); - } - } - } + gameobject endon( "death" ); + gameobject endon( "reset" ); + self hide(); + + foreach ( player in level.players ) + { + if ( player.team != friend_team ) + self showtoplayer( player ); + } + + for (;;) + { + level waittill( "joined_team" ); + + self hide(); + + foreach ( player in level.players ) + { + if ( player.team != friend_team ) + self showtoplayer( player ); + + if ( gameobject.victimteam == player.team && player == gameobject.attacker ) + objective_state( gameobject.objid, "invisible" ); + } + } } -onuse( player ) //checked matches cerberus output +onuse( player ) { - tacinsertboost = 0; - if ( player.team != self.attackerteam ) - { - self.trigger playsound( "mpl_killconfirm_tags_pickup" ); - player addplayerstat( "KILLSDENIED", 1 ); - player recordgameevent( "return" ); - if ( self.victim == player ) - { - if ( self.tacinsert == 0 ) - { - event = "retrieve_own_tags"; - splash = &"SPLASHES_TAGS_RETRIEVED"; - } - else - { - tacinsertboost = 1; - } - } - else - { - event = "kill_denied"; - splash = &"SPLASHES_KILL_DENIED"; - } - if ( isDefined( self.attacker ) && self.attacker.team == self.attackerteam ) - { - self.attacker luinotifyevent( &"player_callout", 2, &"MP_KILL_DENIED", player.entnum ); - self.attacker playlocalsound( game[ "dialog" ][ "kc_denied" ] ); - } - if ( !tacinsertboost ) - { - player maps/mp/gametypes/_globallogic_audio::leaderdialogonplayer( "kc_deny" ); - player maps/mp/gametypes/_globallogic_score::giveteamscoreforobjective( player.team, level.teamscoreperkilldenied ); - player.pers[ "killsdenied" ]++; - player.killsdenied = player.pers[ "killsdenied" ]; - } - } - else - { - self.trigger playsound( "mpl_killconfirm_tags_pickup" ); - event = "kill_confirmed"; - splash = &"SPLASHES_KILL_CONFIRMED"; - player addplayerstat( "KILLSCONFIRMED", 1 ); - player recordgameevent( "capture" ); - /* + tacinsertboost = 0; + + if ( player.team != self.attackerteam ) + { + self.trigger playsound( "mpl_killconfirm_tags_pickup" ); + player addplayerstat( "KILLSDENIED", 1 ); + player recordgameevent( "return" ); + + if ( self.victim == player ) + { + if ( self.tacinsert == 0 ) + { + event = "retrieve_own_tags"; + splash = &"SPLASHES_TAGS_RETRIEVED"; + } + else + tacinsertboost = 1; + } + else + { + event = "kill_denied"; + splash = &"SPLASHES_KILL_DENIED"; + } + + if ( isdefined( self.attacker ) && self.attacker.team == self.attackerteam ) + { + self.attacker luinotifyevent( &"player_callout", 2, &"MP_KILL_DENIED", player.entnum ); + self.attacker playlocalsound( game["dialog"]["kc_denied"] ); + } + + if ( !tacinsertboost ) + { + player maps\mp\gametypes\_globallogic_audio::leaderdialogonplayer( "kc_deny" ); + player maps\mp\gametypes\_globallogic_score::giveteamscoreforobjective( player.team, level.teamscoreperkilldenied ); + player.pers["killsdenied"]++; + player.killsdenied = player.pers["killsdenied"]; + } + } + else + { + self.trigger playsound( "mpl_killconfirm_tags_pickup" ); + event = "kill_confirmed"; + splash = &"SPLASHES_KILL_CONFIRMED"; + player addplayerstat( "KILLSCONFIRMED", 1 ); + player recordgameevent( "capture" ); /# - assert( isDefined( player.lastkillconfirmedtime ) ); - assert( isDefined( player.lastkillconfirmedcount ) ); + assert( isdefined( player.lastkillconfirmedtime ) ); + assert( isdefined( player.lastkillconfirmedcount ) ); #/ - */ - if ( self.attacker != player ) - { - self.attacker thread onpickup( "teammate_kill_confirmed", splash ); - } - player maps/mp/gametypes/_globallogic_audio::leaderdialogonplayer( "kc_start" ); - player.pers[ "killsconfirmed" ]++; - player.killsconfirmed = player.pers[ "killsconfirmed" ]; - player maps/mp/gametypes/_globallogic_score::giveteamscoreforobjective( player.team, level.teamscoreperkillconfirmed ); - } - if ( !tacinsertboost ) - { - player thread onpickup( event, splash ); - currenttime = getTime(); - if ( ( player.lastkillconfirmedtime + 1000 ) > currenttime ) - { - player.lastkillconfirmedcount++; - if ( player.lastkillconfirmedcount >= 3 ) - { - maps/mp/_scoreevents::processscoreevent( "kill_confirmed_multi", player ); - player.lastkillconfirmedcount = 0; - } - } - else - { - player.lastkillconfirmedcount = 1; - } - player.lastkillconfirmedtime = currenttime; - } - self resettags(); + + if ( self.attacker != player ) + self.attacker thread onpickup( "teammate_kill_confirmed", splash ); + + player maps\mp\gametypes\_globallogic_audio::leaderdialogonplayer( "kc_start" ); + player.pers["killsconfirmed"]++; + player.killsconfirmed = player.pers["killsconfirmed"]; + player maps\mp\gametypes\_globallogic_score::giveteamscoreforobjective( player.team, level.teamscoreperkillconfirmed ); + } + + if ( !tacinsertboost ) + { + player thread onpickup( event, splash ); + currenttime = gettime(); + + if ( player.lastkillconfirmedtime + 1000 > currenttime ) + { + player.lastkillconfirmedcount++; + + if ( player.lastkillconfirmedcount >= 3 ) + { + maps\mp\_scoreevents::processscoreevent( "kill_confirmed_multi", player ); + player.lastkillconfirmedcount = 0; + } + } + else + player.lastkillconfirmedcount = 1; + + player.lastkillconfirmedtime = currenttime; + } + + self resettags(); } -onpickup( event, splash ) //checked matches cerberus output +onpickup( event, splash ) { - level endon( "game_ended" ); - self endon( "disconnect" ); - while ( !isDefined( self.pers ) ) - { - wait 0.05; - } - maps/mp/_scoreevents::processscoreevent( event, self ); + level endon( "game_ended" ); + self endon( "disconnect" ); + + while ( !isdefined( self.pers ) ) + wait 0.05; + + maps\mp\_scoreevents::processscoreevent( event, self ); } -resettags() //checked matches cerberus output +resettags() { - self.attacker = undefined; - self.unreachable = undefined; - self notify( "reset" ); - self.visuals[ 0 ] hide(); - self.visuals[ 1 ] hide(); - self.curorigin = vectorScale( ( 0, 0, 1 ), 1000 ); - self.trigger.origin = vectorScale( ( 0, 0, 1 ), 1000 ); - self.visuals[ 0 ].origin = vectorScale( ( 0, 0, 1 ), 1000 ); - self.visuals[ 1 ].origin = vectorScale( ( 0, 0, 1 ), 1000 ); - self.tacinsert = 0; - self maps/mp/gametypes/_gameobjects::allowuse( "none" ); - objective_state( self.objid, "invisible" ); + self.attacker = undefined; + self.unreachable = undefined; + self notify( "reset" ); + self.visuals[0] hide(); + self.visuals[1] hide(); + self.curorigin = vectorscale( ( 0, 0, 1 ), 1000.0 ); + self.trigger.origin = vectorscale( ( 0, 0, 1 ), 1000.0 ); + self.visuals[0].origin = vectorscale( ( 0, 0, 1 ), 1000.0 ); + self.visuals[1].origin = vectorscale( ( 0, 0, 1 ), 1000.0 ); + self.tacinsert = 0; + self maps\mp\gametypes\_gameobjects::allowuse( "none" ); + objective_state( self.objid, "invisible" ); } -bounce() //checked matches cerberus output +bounce() { - level endon( "game_ended" ); - self endon( "reset" ); - bottompos = self.curorigin; - toppos = self.curorigin + vectorScale( ( 0, 0, 1 ), 12 ); - while ( 1 ) - { - self.visuals[ 0 ] moveto( toppos, 0.5, 0.15, 0.15 ); - self.visuals[ 0 ] rotateyaw( 180, 0.5 ); - self.visuals[ 1 ] moveto( toppos, 0.5, 0.15, 0.15 ); - self.visuals[ 1 ] rotateyaw( 180, 0.5 ); - wait 0.5; - self.visuals[ 0 ] moveto( bottompos, 0.5, 0.15, 0.15 ); - self.visuals[ 0 ] rotateyaw( 180, 0.5 ); - self.visuals[ 1 ] moveto( bottompos, 0.5, 0.15, 0.15 ); - self.visuals[ 1 ] rotateyaw( 180, 0.5 ); - wait 0.5; - } + level endon( "game_ended" ); + self endon( "reset" ); + bottompos = self.curorigin; + toppos = self.curorigin + vectorscale( ( 0, 0, 1 ), 12.0 ); + + while ( true ) + { + self.visuals[0] moveto( toppos, 0.5, 0.15, 0.15 ); + self.visuals[0] rotateyaw( 180, 0.5 ); + self.visuals[1] moveto( toppos, 0.5, 0.15, 0.15 ); + self.visuals[1] rotateyaw( 180, 0.5 ); + wait 0.5; + self.visuals[0] moveto( bottompos, 0.5, 0.15, 0.15 ); + self.visuals[0] rotateyaw( 180, 0.5 ); + self.visuals[1] moveto( bottompos, 0.5, 0.15, 0.15 ); + self.visuals[1] rotateyaw( 180, 0.5 ); + wait 0.5; + } } -timeout( victim ) //checked matches cerberus output +timeout( victim ) { - level endon( "game_ended" ); - victim endon( "disconnect" ); - self notify( "timeout" ); - self endon( "timeout" ); - level maps/mp/gametypes/_hostmigration::waitlongdurationwithhostmigrationpause( 30 ); - self.visuals[ 0 ] hide(); - self.visuals[ 1 ] hide(); - self.curorigin = vectorScale( ( 0, 0, 1 ), 1000 ); - self.trigger.origin = vectorScale( ( 0, 0, 1 ), 1000 ); - self.visuals[ 0 ].origin = vectorScale( ( 0, 0, 1 ), 1000 ); - self.visuals[ 1 ].origin = vectorScale( ( 0, 0, 1 ), 1000 ); - self.tacinsert = 0; - self maps/mp/gametypes/_gameobjects::allowuse( "none" ); + level endon( "game_ended" ); + victim endon( "disconnect" ); + self notify( "timeout" ); + self endon( "timeout" ); + level maps\mp\gametypes\_hostmigration::waitlongdurationwithhostmigrationpause( 30.0 ); + self.visuals[0] hide(); + self.visuals[1] hide(); + self.curorigin = vectorscale( ( 0, 0, 1 ), 1000.0 ); + self.trigger.origin = vectorscale( ( 0, 0, 1 ), 1000.0 ); + self.visuals[0].origin = vectorscale( ( 0, 0, 1 ), 1000.0 ); + self.visuals[1].origin = vectorscale( ( 0, 0, 1 ), 1000.0 ); + self.tacinsert = 0; + self maps\mp\gametypes\_gameobjects::allowuse( "none" ); } -tagteamupdater( tags ) //checked matches cerberus output +tagteamupdater( tags ) { - level endon( "game_ended" ); - self endon( "disconnect" ); - while ( 1 ) - { - self waittill( "joined_team" ); - tags.victimteam = self.team; - tags resettags(); - } + level endon( "game_ended" ); + self endon( "disconnect" ); + + while ( true ) + { + self waittill( "joined_team" ); + + tags.victimteam = self.team; + tags resettags(); + } } -clearonvictimdisconnect( victim ) //checked changed to match cerberus output +clearonvictimdisconnect( victim ) { - level endon( "game_ended" ); - guid = victim.entnum; - victim waittill( "disconnect" ); - if ( isDefined( level.dogtags[ guid ] ) ) - { - level.dogtags[ guid ] maps/mp/gametypes/_gameobjects::allowuse( "none" ); - playfx( level.conf_fx[ "vanish" ], level.dogtags[ guid ].curorigin ); - level.dogtags[ guid ] notify( "reset" ); - wait 0.05; - if ( isDefined( level.dogtags[ guid ] ) ) - { - objective_delete( level.dogtags[ guid ].objid ); - level.dogtags[ guid ].trigger delete(); - for ( i = 0; i < level.dogtags[guid].visuals.size; i++ ) - { - level.dogtags[ guid ].visuals[ i ] delete(); - } - level.dogtags[ guid ] notify( "deleted" ); - } - } + level endon( "game_ended" ); + guid = victim.entnum; + + victim waittill( "disconnect" ); + + if ( isdefined( level.dogtags[guid] ) ) + { + level.dogtags[guid] maps\mp\gametypes\_gameobjects::allowuse( "none" ); + playfx( level.conf_fx["vanish"], level.dogtags[guid].curorigin ); + level.dogtags[guid] notify( "reset" ); + wait 0.05; + + if ( isdefined( level.dogtags[guid] ) ) + { + objective_delete( level.dogtags[guid].objid ); + level.dogtags[guid].trigger delete(); + + for ( i = 0; i < level.dogtags[guid].visuals.size; i++ ) + level.dogtags[guid].visuals[i] delete(); + + level.dogtags[guid] notify( "deleted" ); + level.dogtags[guid] = undefined; + } + } } -onspawnplayerunified() //checked nmatches cerberus output +onspawnplayerunified() { - self.usingobj = undefined; - if ( level.usestartspawns && !level.ingraceperiod ) - { - level.usestartspawns = 0; - } - self.lastkillconfirmedtime = 0; - self.lastkillconfirmedcount = 0; - maps/mp/gametypes/_spawning::onspawnplayer_unified(); - if ( level.rankedmatch || level.leaguematch ) - { - if ( isDefined( self.tacticalinsertiontime ) && ( self.tacticalinsertiontime + 100 ) > getTime() ) - { - mindist = level.antiboostdistance; - mindistsqr = mindist * mindist; - distsqr = distancesquared( self.origin, level.dogtags[ self.entnum ].curorigin ); - if ( distsqr < mindistsqr ) - { - level.dogtags[ self.entnum ].tacinsert = 1; - } - } - } + self.usingobj = undefined; + + if ( level.usestartspawns && !level.ingraceperiod ) + level.usestartspawns = 0; + + self.lastkillconfirmedtime = 0; + self.lastkillconfirmedcount = 0; + maps\mp\gametypes\_spawning::onspawnplayer_unified(); + + if ( level.rankedmatch || level.leaguematch ) + { + if ( isdefined( self.tacticalinsertiontime ) && self.tacticalinsertiontime + 100 > gettime() ) + { + mindist = level.antiboostdistance; + mindistsqr = mindist * mindist; + distsqr = distancesquared( self.origin, level.dogtags[self.entnum].curorigin ); + + if ( distsqr < mindistsqr ) + level.dogtags[self.entnum].tacinsert = 1; + } + } } -onspawnplayer( predictedspawn ) //checked matches cerberus output +onspawnplayer( predictedspawn ) { - pixbeginevent( "TDM:onSpawnPlayer" ); - self.usingobj = undefined; - spawnteam = self.pers[ "team" ]; - if ( level.ingraceperiod ) - { - spawnpoints = maps/mp/gametypes/_spawnlogic::getspawnpointarray( maps/mp/gametypes/_spawning::gettdmstartspawnname( spawnteam ) ); - if ( !spawnpoints.size ) - { - spawnpoints = maps/mp/gametypes/_spawnlogic::getspawnpointarray( maps/mp/gametypes/_spawning::gettdmstartspawnname( spawnteam ) ); - } - if ( !spawnpoints.size ) - { - spawnpoints = maps/mp/gametypes/_spawnlogic::getteamspawnpoints( spawnteam ); - spawnpoint = maps/mp/gametypes/_spawnlogic::getspawnpoint_nearteam( spawnpoints ); - } - else - { - spawnpoint = maps/mp/gametypes/_spawnlogic::getspawnpoint_random( spawnpoints ); - } - } - else - { - spawnpoints = maps/mp/gametypes/_spawnlogic::getteamspawnpoints( spawnteam ); - spawnpoint = maps/mp/gametypes/_spawnlogic::getspawnpoint_nearteam( spawnpoints ); - } - if ( predictedspawn ) - { - self predictspawnpoint( spawnpoint.origin, spawnpoint.angles ); - } - else - { - self spawn( spawnpoint.origin, spawnpoint.angles, "tdm" ); - } - pixendevent(); + pixbeginevent( "TDM:onSpawnPlayer" ); + self.usingobj = undefined; + spawnteam = self.pers["team"]; + + if ( level.ingraceperiod ) + { + spawnpoints = maps\mp\gametypes\_spawnlogic::getspawnpointarray( maps\mp\gametypes\_spawning::gettdmstartspawnname( spawnteam ) ); + + if ( !spawnpoints.size ) + spawnpoints = maps\mp\gametypes\_spawnlogic::getspawnpointarray( maps\mp\gametypes\_spawning::gettdmstartspawnname( spawnteam ) ); + + if ( !spawnpoints.size ) + { + spawnpoints = maps\mp\gametypes\_spawnlogic::getteamspawnpoints( spawnteam ); + spawnpoint = maps\mp\gametypes\_spawnlogic::getspawnpoint_nearteam( spawnpoints ); + } + else + spawnpoint = maps\mp\gametypes\_spawnlogic::getspawnpoint_random( spawnpoints ); + } + else + { + spawnpoints = maps\mp\gametypes\_spawnlogic::getteamspawnpoints( spawnteam ); + spawnpoint = maps\mp\gametypes\_spawnlogic::getspawnpoint_nearteam( spawnpoints ); + } + + if ( predictedspawn ) + self predictspawnpoint( spawnpoint.origin, spawnpoint.angles ); + else + self spawn( spawnpoint.origin, spawnpoint.angles, "tdm" ); + + pixendevent(); } -onroundswitch() //checked matches cerberus output +onroundswitch() { - game[ "switchedsides" ] = !game[ "switchedsides" ]; + game["switchedsides"] = !game["switchedsides"]; } -onroundendgame( roundwinner ) //checked matches cerberus output +onroundendgame( roundwinner ) { - return maps/mp/gametypes/_globallogic::determineteamwinnerbygamestat( "roundswon" ); + return maps\mp\gametypes\_globallogic::determineteamwinnerbygamestat( "roundswon" ); } - diff --git a/Multiplayer Core/patch_mp/maps/mp/gametypes/ctf.gsc b/Multiplayer Core/patch_mp/maps/mp/gametypes/ctf.gsc index 01a3d60..c07d07d 100644 --- a/Multiplayer Core/patch_mp/maps/mp/gametypes/ctf.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/gametypes/ctf.gsc @@ -1,1245 +1,1168 @@ -#include maps/mp/gametypes/_rank; -#include maps/mp/gametypes/_globallogic_defaults; -#include maps/mp/_challenges; -#include maps/mp/_demo; -#include maps/mp/_scoreevents; -#include maps/mp/_popups; -#include maps/mp/gametypes/_globallogic_utils; -#include maps/mp/gametypes/_hud_message; -#include maps/mp/gametypes/_spawnlogic; -#include maps/mp/gametypes/_spawning; -#include maps/mp/gametypes/_gameobjects; -#include maps/mp/gametypes/_globallogic_score; -#include maps/mp/teams/_teams; -#include maps/mp/gametypes/_globallogic_audio; -#include maps/mp/gametypes/_callbacksetup; -#include maps/mp/gametypes/_globallogic; -#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 -main() //checked matches cerberus output +main() { - if ( getDvar( "mapname" ) == "mp_background" ) - { - return; - } - maps/mp/gametypes/_globallogic::init(); - maps/mp/gametypes/_callbacksetup::setupcallbacks(); - maps/mp/gametypes/_globallogic::setupcallbacks(); - registertimelimit( 0, 1440 ); - registerroundlimit( 0, 10 ); - registerroundwinlimit( 0, 10 ); - registerroundswitch( 0, 9 ); - registernumlives( 0, 100 ); - registerscorelimit( 0, 5000 ); - level.scoreroundbased = getgametypesetting( "roundscorecarry" ) == 0; - maps/mp/gametypes/_globallogic::registerfriendlyfiredelay( level.gametype, 15, 0, 1440 ); - if ( getDvar( "scr_ctf_spawnPointFacingAngle" ) == "" ) - { - setdvar( "scr_ctf_spawnPointFacingAngle", "0" ); - } - level.teambased = 1; - level.overrideteamscore = 1; - level.onstartgametype = ::onstartgametype; - level.onspawnplayer = ::onspawnplayer; - level.onspawnplayerunified = ::onspawnplayerunified; - level.onprecachegametype = ::onprecachegametype; - level.onplayerkilled = ::onplayerkilled; - level.onroundswitch = ::onroundswitch; - level.onendgame = ::onendgame; - level.onroundendgame = ::onroundendgame; - level.gamemodespawndvars = ::ctf_gamemodespawndvars; - level.getteamkillpenalty = ::ctf_getteamkillpenalty; - level.getteamkillscore = ::ctf_getteamkillscore; - level.setmatchscorehudelemforteam = ::setmatchscorehudelemforteam; - level.shouldplayovertimeround = ::shouldplayovertimeround; - if ( !isDefined( game[ "ctf_teamscore" ] ) ) - { - game[ "ctf_teamscore" ][ "allies" ] = 0; - game[ "ctf_teamscore" ][ "axis" ] = 0; - } - game[ "dialog" ][ "gametype" ] = "ctf_start"; - game[ "dialog" ][ "gametype_hardcore" ] = "hcctf_start"; - game[ "dialog" ][ "wetake_flag" ] = "ctf_wetake"; - game[ "dialog" ][ "theytake_flag" ] = "ctf_theytake"; - game[ "dialog" ][ "theydrop_flag" ] = "ctf_theydrop"; - game[ "dialog" ][ "wedrop_flag" ] = "ctf_wedrop"; - game[ "dialog" ][ "wereturn_flag" ] = "ctf_wereturn"; - game[ "dialog" ][ "theyreturn_flag" ] = "ctf_theyreturn"; - game[ "dialog" ][ "theycap_flag" ] = "ctf_theycap"; - game[ "dialog" ][ "wecap_flag" ] = "ctf_wecap"; - game[ "dialog" ][ "offense_obj" ] = "cap_start"; - game[ "dialog" ][ "defense_obj" ] = "cap_start"; - level.lastdialogtime = getTime(); - level thread ctf_icon_hide(); - if ( !sessionmodeissystemlink() && !sessionmodeisonlinegame() && issplitscreen() ) - { - setscoreboardcolumns( "score", "kills", "captures", "returns", "deaths" ); - } - else - { - setscoreboardcolumns( "score", "kills", "deaths", "captures", "returns" ); - } - maps/mp/gametypes/_globallogic_audio::registerdialoggroup( "ctf_flag", 0 ); - maps/mp/gametypes/_globallogic_audio::registerdialoggroup( "ctf_flag_enemy", 0 ); + if ( getdvar( "mapname" ) == "mp_background" ) + return; + + maps\mp\gametypes\_globallogic::init(); + maps\mp\gametypes\_callbacksetup::setupcallbacks(); + maps\mp\gametypes\_globallogic::setupcallbacks(); + registertimelimit( 0, 1440 ); + registerroundlimit( 0, 10 ); + registerroundwinlimit( 0, 10 ); + registerroundswitch( 0, 9 ); + registernumlives( 0, 100 ); + registerscorelimit( 0, 5000 ); + level.scoreroundbased = getgametypesetting( "roundscorecarry" ) == 0; + maps\mp\gametypes\_globallogic::registerfriendlyfiredelay( level.gametype, 15, 0, 1440 ); + + if ( getdvar( "scr_ctf_spawnPointFacingAngle" ) == "" ) + setdvar( "scr_ctf_spawnPointFacingAngle", "0" ); + + level.teambased = 1; + level.overrideteamscore = 1; + level.onstartgametype = ::onstartgametype; + level.onspawnplayer = ::onspawnplayer; + level.onspawnplayerunified = ::onspawnplayerunified; + level.onprecachegametype = ::onprecachegametype; + level.onplayerkilled = ::onplayerkilled; + level.onroundswitch = ::onroundswitch; + level.onendgame = ::onendgame; + level.onroundendgame = ::onroundendgame; + level.gamemodespawndvars = ::ctf_gamemodespawndvars; + level.getteamkillpenalty = ::ctf_getteamkillpenalty; + level.getteamkillscore = ::ctf_getteamkillscore; + level.setmatchscorehudelemforteam = ::setmatchscorehudelemforteam; + level.shouldplayovertimeround = ::shouldplayovertimeround; + + if ( !isdefined( game["ctf_teamscore"] ) ) + { + game["ctf_teamscore"]["allies"] = 0; + game["ctf_teamscore"]["axis"] = 0; + } + + game["dialog"]["gametype"] = "ctf_start"; + game["dialog"]["gametype_hardcore"] = "hcctf_start"; + game["dialog"]["wetake_flag"] = "ctf_wetake"; + game["dialog"]["theytake_flag"] = "ctf_theytake"; + game["dialog"]["theydrop_flag"] = "ctf_theydrop"; + game["dialog"]["wedrop_flag"] = "ctf_wedrop"; + game["dialog"]["wereturn_flag"] = "ctf_wereturn"; + game["dialog"]["theyreturn_flag"] = "ctf_theyreturn"; + game["dialog"]["theycap_flag"] = "ctf_theycap"; + game["dialog"]["wecap_flag"] = "ctf_wecap"; + game["dialog"]["offense_obj"] = "cap_start"; + game["dialog"]["defense_obj"] = "cap_start"; + level.lastdialogtime = gettime(); + level thread ctf_icon_hide(); + + if ( !sessionmodeissystemlink() && !sessionmodeisonlinegame() && issplitscreen() ) + setscoreboardcolumns( "score", "kills", "captures", "returns", "deaths" ); + else + setscoreboardcolumns( "score", "kills", "deaths", "captures", "returns" ); + + maps\mp\gametypes\_globallogic_audio::registerdialoggroup( "ctf_flag", 0 ); + maps\mp\gametypes\_globallogic_audio::registerdialoggroup( "ctf_flag_enemy", 0 ); } -onprecachegametype() //checked matches cerberus output +onprecachegametype() { - game[ "flag_dropped_sound" ] = "mp_war_objective_lost"; - game[ "flag_recovered_sound" ] = "mp_war_objective_taken"; - precachemodel( maps/mp/teams/_teams::getteamflagmodel( "allies" ) ); - precachemodel( maps/mp/teams/_teams::getteamflagmodel( "axis" ) ); - precachemodel( maps/mp/teams/_teams::getteamflagcarrymodel( "allies" ) ); - precachemodel( maps/mp/teams/_teams::getteamflagcarrymodel( "axis" ) ); - precacheshader( maps/mp/teams/_teams::getteamflagicon( "allies" ) ); - precacheshader( maps/mp/teams/_teams::getteamflagicon( "axis" ) ); - precachestring( &"MP_FLAG_TAKEN_BY" ); - precachestring( &"MP_ENEMY_FLAG_TAKEN" ); - precachestring( &"MP_FRIENDLY_FLAG_TAKEN" ); - precachestring( &"MP_FLAG_CAPTURED_BY" ); - precachestring( &"MP_ENEMY_FLAG_CAPTURED_BY" ); - precachestring( &"MP_FLAG_RETURNED_BY" ); - precachestring( &"MP_FLAG_RETURNED" ); - precachestring( &"MP_ENEMY_FLAG_RETURNED" ); - precachestring( &"MP_FRIENDLY_FLAG_RETURNED" ); - precachestring( &"MP_YOUR_FLAG_RETURNING_IN" ); - precachestring( &"MP_ENEMY_FLAG_RETURNING_IN" ); - precachestring( &"MP_FRIENDLY_FLAG_DROPPED_BY" ); - precachestring( &"MP_FRIENDLY_FLAG_DROPPED" ); - precachestring( &"MP_ENEMY_FLAG_DROPPED" ); - precachestring( &"MP_SUDDEN_DEATH" ); - precachestring( &"MP_CAP_LIMIT_REACHED" ); - precachestring( &"MP_CTF_CANT_CAPTURE_FLAG" ); - precachestring( &"MP_CTF_OVERTIME_WIN" ); - precachestring( &"MP_CTF_OVERTIME_ROUND_1" ); - precachestring( &"MP_CTF_OVERTIME_ROUND_2_WINNER" ); - precachestring( &"MP_CTF_OVERTIME_ROUND_2_LOSER" ); - precachestring( &"MP_CTF_OVERTIME_ROUND_2_TIE" ); - precachestring( &"MPUI_CTF_OVERTIME_FASTEST_CAP_TIME" ); - precachestring( &"MPUI_CTF_OVERTIME_DEFEAT_TIMELIMIT" ); - precachestring( &"MPUI_CTF_OVERTIME_DEFEAT_DID_NOT_DEFEND" ); - precachestring( &"allies_base" ); - precachestring( &"axis_base" ); - precachestring( &"allies_flag" ); - precachestring( &"axis_flag" ); - game[ "strings" ][ "score_limit_reached" ] = &"MP_CAP_LIMIT_REACHED"; + game["flag_dropped_sound"] = "mp_war_objective_lost"; + game["flag_recovered_sound"] = "mp_war_objective_taken"; + precachemodel( maps\mp\teams\_teams::getteamflagmodel( "allies" ) ); + precachemodel( maps\mp\teams\_teams::getteamflagmodel( "axis" ) ); + precachemodel( maps\mp\teams\_teams::getteamflagcarrymodel( "allies" ) ); + precachemodel( maps\mp\teams\_teams::getteamflagcarrymodel( "axis" ) ); + precacheshader( maps\mp\teams\_teams::getteamflagicon( "allies" ) ); + precacheshader( maps\mp\teams\_teams::getteamflagicon( "axis" ) ); + precachestring( &"MP_FLAG_TAKEN_BY" ); + precachestring( &"MP_ENEMY_FLAG_TAKEN" ); + precachestring( &"MP_FRIENDLY_FLAG_TAKEN" ); + precachestring( &"MP_FLAG_CAPTURED_BY" ); + precachestring( &"MP_ENEMY_FLAG_CAPTURED_BY" ); + precachestring( &"MP_FLAG_RETURNED_BY" ); + precachestring( &"MP_FLAG_RETURNED" ); + precachestring( &"MP_ENEMY_FLAG_RETURNED" ); + precachestring( &"MP_FRIENDLY_FLAG_RETURNED" ); + precachestring( &"MP_YOUR_FLAG_RETURNING_IN" ); + precachestring( &"MP_ENEMY_FLAG_RETURNING_IN" ); + precachestring( &"MP_FRIENDLY_FLAG_DROPPED_BY" ); + precachestring( &"MP_FRIENDLY_FLAG_DROPPED" ); + precachestring( &"MP_ENEMY_FLAG_DROPPED" ); + precachestring( &"MP_SUDDEN_DEATH" ); + precachestring( &"MP_CAP_LIMIT_REACHED" ); + precachestring( &"MP_CTF_CANT_CAPTURE_FLAG" ); + precachestring( &"MP_CTF_OVERTIME_WIN" ); + precachestring( &"MP_CTF_OVERTIME_ROUND_1" ); + precachestring( &"MP_CTF_OVERTIME_ROUND_2_WINNER" ); + precachestring( &"MP_CTF_OVERTIME_ROUND_2_LOSER" ); + precachestring( &"MP_CTF_OVERTIME_ROUND_2_TIE" ); + precachestring( &"MPUI_CTF_OVERTIME_FASTEST_CAP_TIME" ); + precachestring( &"MPUI_CTF_OVERTIME_DEFEAT_TIMELIMIT" ); + precachestring( &"MPUI_CTF_OVERTIME_DEFEAT_DID_NOT_DEFEND" ); + precachestring( &"allies_base" ); + precachestring( &"axis_base" ); + precachestring( &"allies_flag" ); + precachestring( &"axis_flag" ); + game["strings"]["score_limit_reached"] = &"MP_CAP_LIMIT_REACHED"; } -onstartgametype() //checked changed to match cerberus output +onstartgametype() { - if ( !isDefined( game[ "switchedsides" ] ) ) - { - game[ "switchedsides" ] = 0; - } - /* + if ( !isdefined( game["switchedsides"] ) ) + game["switchedsides"] = 0; + /# - setdebugsideswitch( game[ "switchedsides" ] ); + setdebugsideswitch( game["switchedsides"] ); #/ - */ - setclientnamemode( "auto_change" ); - maps/mp/gametypes/_globallogic_score::resetteamscores(); - setobjectivetext( "allies", &"OBJECTIVES_CTF" ); - setobjectivetext( "axis", &"OBJECTIVES_CTF" ); - if ( level.splitscreen ) - { - setobjectivescoretext( "allies", &"OBJECTIVES_CTF" ); - setobjectivescoretext( "axis", &"OBJECTIVES_CTF" ); - } - else - { - setobjectivescoretext( "allies", &"OBJECTIVES_CTF_SCORE" ); - setobjectivescoretext( "axis", &"OBJECTIVES_CTF_SCORE" ); - } - setobjectivehinttext( "allies", &"OBJECTIVES_CTF_HINT" ); - setobjectivehinttext( "axis", &"OBJECTIVES_CTF_HINT" ); - if ( isDefined( game[ "overtime_round" ] ) ) - { - [[ level._setteamscore ]]( "allies", 0 ); - [[ level._setteamscore ]]( "axis", 0 ); - registerscorelimit( 1, 1 ); - if ( isDefined( game[ "ctf_overtime_time_to_beat" ] ) ) - { - registertimelimit( game[ "ctf_overtime_time_to_beat" ] / 60000, game[ "ctf_overtime_time_to_beat" ] / 60000 ); - } - if ( game[ "overtime_round" ] == 1 ) - { - setobjectivehinttext( "allies", &"MP_CTF_OVERTIME_ROUND_1" ); - setobjectivehinttext( "axis", &"MP_CTF_OVERTIME_ROUND_1" ); - } - else if ( isDefined( game[ "ctf_overtime_first_winner" ] ) ) - { - setobjectivehinttext( game[ "ctf_overtime_first_winner" ], &"MP_CTF_OVERTIME_ROUND_2_WINNER" ); - setobjectivehinttext( getotherteam( game[ "ctf_overtime_first_winner" ] ), &"MP_CTF_OVERTIME_ROUND_2_LOSER" ); - } - else - { - setobjectivehinttext( "allies", &"MP_CTF_OVERTIME_ROUND_2_TIE" ); - setobjectivehinttext( "axis", &"MP_CTF_OVERTIME_ROUND_2_TIE" ); - } - } - allowed = []; - allowed[ 0 ] = "ctf"; - maps/mp/gametypes/_gameobjects::main( allowed ); - maps/mp/gametypes/_spawning::create_map_placed_influencers(); - level.spawnmins = ( 0, 0, -1 ); - level.spawnmaxs = ( 0, 0, -1 ); - maps/mp/gametypes/_spawnlogic::placespawnpoints( "mp_ctf_spawn_allies_start" ); - maps/mp/gametypes/_spawnlogic::placespawnpoints( "mp_ctf_spawn_axis_start" ); - maps/mp/gametypes/_spawnlogic::addspawnpoints( "allies", "mp_ctf_spawn_allies" ); - maps/mp/gametypes/_spawnlogic::addspawnpoints( "axis", "mp_ctf_spawn_axis" ); - 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.spawn_axis = maps/mp/gametypes/_spawnlogic::getspawnpointarray( "mp_ctf_spawn_axis" ); - level.spawn_allies = maps/mp/gametypes/_spawnlogic::getspawnpointarray( "mp_ctf_spawn_allies" ); - level.spawn_start = []; - foreach ( team in level.teams ) - { - level.spawn_start[ team ] = maps/mp/gametypes/_spawnlogic::getspawnpointarray( "mp_ctf_spawn_" + team + "_start" ); - } - thread updategametypedvars(); - thread ctf(); + setclientnamemode( "auto_change" ); + maps\mp\gametypes\_globallogic_score::resetteamscores(); + setobjectivetext( "allies", &"OBJECTIVES_CTF" ); + setobjectivetext( "axis", &"OBJECTIVES_CTF" ); + + if ( level.splitscreen ) + { + setobjectivescoretext( "allies", &"OBJECTIVES_CTF" ); + setobjectivescoretext( "axis", &"OBJECTIVES_CTF" ); + } + else + { + setobjectivescoretext( "allies", &"OBJECTIVES_CTF_SCORE" ); + setobjectivescoretext( "axis", &"OBJECTIVES_CTF_SCORE" ); + } + + setobjectivehinttext( "allies", &"OBJECTIVES_CTF_HINT" ); + setobjectivehinttext( "axis", &"OBJECTIVES_CTF_HINT" ); + + if ( isdefined( game["overtime_round"] ) ) + { + [[ level._setteamscore ]]( "allies", 0 ); + [[ level._setteamscore ]]( "axis", 0 ); + registerscorelimit( 1, 1 ); + + if ( isdefined( game["ctf_overtime_time_to_beat"] ) ) + registertimelimit( game["ctf_overtime_time_to_beat"] / 60000, game["ctf_overtime_time_to_beat"] / 60000 ); + + if ( game["overtime_round"] == 1 ) + { + setobjectivehinttext( "allies", &"MP_CTF_OVERTIME_ROUND_1" ); + setobjectivehinttext( "axis", &"MP_CTF_OVERTIME_ROUND_1" ); + } + else if ( isdefined( game["ctf_overtime_first_winner"] ) ) + { + setobjectivehinttext( game["ctf_overtime_first_winner"], &"MP_CTF_OVERTIME_ROUND_2_WINNER" ); + setobjectivehinttext( getotherteam( game["ctf_overtime_first_winner"] ), &"MP_CTF_OVERTIME_ROUND_2_LOSER" ); + } + else + { + setobjectivehinttext( "allies", &"MP_CTF_OVERTIME_ROUND_2_TIE" ); + setobjectivehinttext( "axis", &"MP_CTF_OVERTIME_ROUND_2_TIE" ); + } + } + + allowed[0] = "ctf"; + maps\mp\gametypes\_gameobjects::main( allowed ); + maps\mp\gametypes\_spawning::create_map_placed_influencers(); + level.spawnmins = ( 0, 0, 0 ); + level.spawnmaxs = ( 0, 0, 0 ); + maps\mp\gametypes\_spawnlogic::placespawnpoints( "mp_ctf_spawn_allies_start" ); + maps\mp\gametypes\_spawnlogic::placespawnpoints( "mp_ctf_spawn_axis_start" ); + maps\mp\gametypes\_spawnlogic::addspawnpoints( "allies", "mp_ctf_spawn_allies" ); + maps\mp\gametypes\_spawnlogic::addspawnpoints( "axis", "mp_ctf_spawn_axis" ); + 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.spawn_axis = maps\mp\gametypes\_spawnlogic::getspawnpointarray( "mp_ctf_spawn_axis" ); + level.spawn_allies = maps\mp\gametypes\_spawnlogic::getspawnpointarray( "mp_ctf_spawn_allies" ); + level.spawn_start = []; + + foreach ( team in level.teams ) + level.spawn_start[team] = maps\mp\gametypes\_spawnlogic::getspawnpointarray( "mp_ctf_spawn_" + team + "_start" ); + + thread updategametypedvars(); + thread ctf(); } -shouldplayovertimeround() //checked matches cerberus output +shouldplayovertimeround() { - if ( isDefined( game[ "overtime_round" ] ) ) - { - if ( game[ "overtime_round" ] == 1 || !level.gameended ) - { - return 1; - } - return 0; - } - if ( level.roundscorecarry ) - { - if ( game[ "teamScores" ][ "allies" ] == game[ "teamScores" ][ "axis" ] || hitroundlimit() && game[ "teamScores" ][ "allies" ] == ( level.scorelimit - 1 ) ) - { - return 1; - } - } - else - { - alliesroundswon = getroundswon( "allies" ); - axisroundswon = getroundswon( "axis" ); - if ( level.roundwinlimit > 0 && axisroundswon == ( level.roundwinlimit - 1 ) && alliesroundswon == ( level.roundwinlimit - 1 ) ) - { - return 1; - } - if ( hitroundlimit() && alliesroundswon == axisroundswon ) - { - return 1; - } - } - return 0; + if ( isdefined( game["overtime_round"] ) ) + { + if ( game["overtime_round"] == 1 || !level.gameended ) + return true; + + return false; + } + + if ( level.roundscorecarry ) + { + if ( game["teamScores"]["allies"] == game["teamScores"]["axis"] && ( hitroundlimit() || game["teamScores"]["allies"] == level.scorelimit - 1 ) ) + return true; + } + else + { + alliesroundswon = getroundswon( "allies" ); + axisroundswon = getroundswon( "axis" ); + + if ( level.roundwinlimit > 0 && axisroundswon == level.roundwinlimit - 1 && alliesroundswon == level.roundwinlimit - 1 ) + return true; + + if ( hitroundlimit() && alliesroundswon == axisroundswon ) + return true; + } + + return false; } -minutesandsecondsstring( milliseconds ) //checked matches cerberus output +minutesandsecondsstring( milliseconds ) { - minutes = floor( milliseconds / 60000 ); - milliseconds -= minutes * 60000; - seconds = floor( milliseconds / 1000 ); - if ( seconds < 10 ) - { - return ( minutes + ":0" ) + seconds; - } - else - { - return ( minutes + ":" ) + seconds; - } + minutes = floor( milliseconds / 60000 ); + milliseconds -= minutes * 60000; + seconds = floor( milliseconds / 1000 ); + + if ( seconds < 10 ) + return minutes + ":0" + seconds; + else + return minutes + ":" + seconds; } -setmatchscorehudelemforteam( team ) //checked changed to match cerberus output +setmatchscorehudelemforteam( team ) { - if ( !isDefined( game[ "overtime_round" ] ) ) - { - self maps/mp/gametypes/_hud_message::setmatchscorehudelemforteam( team ); - } - else if ( isDefined( game[ "ctf_overtime_second_winner" ] ) && game[ "ctf_overtime_second_winner" ] == team ) - { - self settext( minutesandsecondsstring( game[ "ctf_overtime_best_time" ] ) ); - } - else if ( isDefined( game[ "ctf_overtime_first_winner" ] ) && game[ "ctf_overtime_first_winner" ] == team ) - { - self settext( minutesandsecondsstring( game[ "ctf_overtime_time_to_beat" ] ) ); - return; - } - else - { - self settext( &"" ); - } + if ( !isdefined( game["overtime_round"] ) ) + self maps\mp\gametypes\_hud_message::setmatchscorehudelemforteam( team ); + else if ( isdefined( game["ctf_overtime_second_winner"] ) && game["ctf_overtime_second_winner"] == team ) + self settext( minutesandsecondsstring( game["ctf_overtime_best_time"] ) ); + else if ( isdefined( game["ctf_overtime_first_winner"] ) && game["ctf_overtime_first_winner"] == team ) + self settext( minutesandsecondsstring( game["ctf_overtime_time_to_beat"] ) ); + else + self settext( &"" ); } -onroundswitch() //checked matches cerberus output +onroundswitch() { - if ( !isDefined( game[ "switchedsides" ] ) ) - { - game[ "switchedsides" ] = 0; - } - level.halftimetype = "halftime"; - game[ "switchedsides" ] = !game[ "switchedsides" ]; + if ( !isdefined( game["switchedsides"] ) ) + game["switchedsides"] = 0; + + level.halftimetype = "halftime"; + game["switchedsides"] = !game["switchedsides"]; } -onendgame( winningteam ) //checked changed to match cerberus output +onendgame( winningteam ) { - if ( isDefined( game[ "overtime_round" ] ) ) - { - if ( game[ "overtime_round" ] == 1 ) - { - if ( isDefined( winningteam ) && winningteam != "tie" ) - { - game[ "ctf_overtime_first_winner" ] = winningteam; - game[ "ctf_overtime_time_to_beat" ] = maps/mp/gametypes/_globallogic_utils::gettimepassed(); - } - } - else - { - game[ "ctf_overtime_second_winner" ] = winningteam; - game[ "ctf_overtime_best_time" ] = maps/mp/gametypes/_globallogic_utils::gettimepassed(); - } - } + if ( isdefined( game["overtime_round"] ) ) + { + if ( game["overtime_round"] == 1 ) + { + if ( isdefined( winningteam ) && winningteam != "tie" ) + { + game["ctf_overtime_first_winner"] = winningteam; + game["ctf_overtime_time_to_beat"] = maps\mp\gametypes\_globallogic_utils::gettimepassed(); + } + } + else + { + game["ctf_overtime_second_winner"] = winningteam; + game["ctf_overtime_best_time"] = maps\mp\gametypes\_globallogic_utils::gettimepassed(); + } + } } -onroundendgame( winningteam ) //checked changed to match cerberus output +onroundendgame( winningteam ) { - if ( isDefined( game[ "overtime_round" ] ) ) - { - if ( isDefined( game[ "ctf_overtime_first_winner" ] ) ) - { - if ( !isDefined( winningteam ) || winningteam == "tie" ) - { - winningteam = game[ "ctf_overtime_first_winner" ]; - } - if ( game[ "ctf_overtime_first_winner" ] == winningteam ) - { - level.endvictoryreasontext = &"MPUI_CTF_OVERTIME_FASTEST_CAP_TIME"; - level.enddefeatreasontext = &"MPUI_CTF_OVERTIME_DEFEAT_TIMELIMIT"; - } - else - { - level.endvictoryreasontext = &"MPUI_CTF_OVERTIME_FASTEST_CAP_TIME"; - level.enddefeatreasontext = &"MPUI_CTF_OVERTIME_DEFEAT_DID_NOT_DEFEND"; - } - } - else if ( !isDefined( winningteam ) || winningteam == "tie" ) - { - return "tie"; - } - return winningteam; - } - if ( level.roundscorecarry == 0 ) - { - foreach ( team in level.teams ) - { - [[ level._setteamscore ]]( team, game[ "roundswon" ][ team ] ); - } - winner = maps/mp/gametypes/_globallogic::determineteamwinnerbygamestat( "roundswon" ); - } - else - { - winner = maps/mp/gametypes/_globallogic::determineteamwinnerbyteamscore(); - } - return winner; + if ( isdefined( game["overtime_round"] ) ) + { + if ( isdefined( game["ctf_overtime_first_winner"] ) ) + { + if ( !isdefined( winningteam ) || winningteam == "tie" ) + winningteam = game["ctf_overtime_first_winner"]; + + if ( game["ctf_overtime_first_winner"] == winningteam ) + { + level.endvictoryreasontext = &"MPUI_CTF_OVERTIME_FASTEST_CAP_TIME"; + level.enddefeatreasontext = &"MPUI_CTF_OVERTIME_DEFEAT_TIMELIMIT"; + } + else + { + level.endvictoryreasontext = &"MPUI_CTF_OVERTIME_FASTEST_CAP_TIME"; + level.enddefeatreasontext = &"MPUI_CTF_OVERTIME_DEFEAT_DID_NOT_DEFEND"; + } + } + else if ( !isdefined( winningteam ) || winningteam == "tie" ) + return "tie"; + + return winningteam; + } + + if ( level.roundscorecarry == 0 ) + { + foreach ( team in level.teams ) + [[ level._setteamscore ]]( team, game["roundswon"][team] ); + + winner = maps\mp\gametypes\_globallogic::determineteamwinnerbygamestat( "roundswon" ); + } + else + winner = maps\mp\gametypes\_globallogic::determineteamwinnerbyteamscore(); + + return winner; } -onspawnplayerunified() //checked matches cerberus output +onspawnplayerunified() { - self.isflagcarrier = 0; - self.flagcarried = undefined; - self clearclientflag( 0 ); - maps/mp/gametypes/_spawning::onspawnplayer_unified(); + self.isflagcarrier = 0; + self.flagcarried = undefined; + self clearclientflag( 0 ); + maps\mp\gametypes\_spawning::onspawnplayer_unified(); } -onspawnplayer( predictedspawn ) //checked matches cerberus output +onspawnplayer( predictedspawn ) { - self.isflagcarrier = 0; - self.flagcarried = undefined; - self clearclientflag( 0 ); - spawnteam = self.pers[ "team" ]; - if ( game[ "switchedsides" ] ) - { - spawnteam = getotherteam( spawnteam ); - } - if ( level.usestartspawns ) - { - spawnpoint = maps/mp/gametypes/_spawnlogic::getspawnpoint_random( level.spawn_start[ spawnteam ] ); - } - else if ( spawnteam == "axis" ) - { - spawnpoint = maps/mp/gametypes/_spawnlogic::getspawnpoint_nearteam( level.spawn_axis ); - } - else - { - spawnpoint = maps/mp/gametypes/_spawnlogic::getspawnpoint_nearteam( level.spawn_allies ); - } - /* + self.isflagcarrier = 0; + self.flagcarried = undefined; + self clearclientflag( 0 ); + spawnteam = self.pers["team"]; + + if ( game["switchedsides"] ) + spawnteam = getotherteam( spawnteam ); + + if ( level.usestartspawns ) + spawnpoint = maps\mp\gametypes\_spawnlogic::getspawnpoint_random( level.spawn_start[spawnteam] ); + else if ( spawnteam == "axis" ) + spawnpoint = maps\mp\gametypes\_spawnlogic::getspawnpoint_nearteam( level.spawn_axis ); + else + spawnpoint = maps\mp\gametypes\_spawnlogic::getspawnpoint_nearteam( level.spawn_allies ); + /# - assert( isDefined( spawnpoint ) ); + assert( isdefined( spawnpoint ) ); #/ - */ - if ( predictedspawn ) - { - self predictspawnpoint( spawnpoint.origin, spawnpoint.angles ); - } - else - { - self spawn( spawnpoint.origin, spawnpoint.angles, "ctf" ); - } + + if ( predictedspawn ) + self predictspawnpoint( spawnpoint.origin, spawnpoint.angles ); + else + self spawn( spawnpoint.origin, spawnpoint.angles, "ctf" ); } -updategametypedvars() //checked matches cerberus output +updategametypedvars() { - level.flagcapturetime = getgametypesetting( "captureTime" ); - level.flagtouchreturntime = getgametypesetting( "defuseTime" ); - level.idleflagreturntime = getgametypesetting( "idleFlagResetTime" ); - level.flagrespawntime = getgametypesetting( "flagRespawnTime" ); - level.enemycarriervisible = getgametypesetting( "enemyCarrierVisible" ); - level.roundlimit = getgametypesetting( "roundLimit" ); - level.roundscorecarry = getgametypesetting( "roundscorecarry" ); - level.teamkillpenaltymultiplier = getgametypesetting( "teamKillPenalty" ); - level.teamkillscoremultiplier = getgametypesetting( "teamKillScore" ); - if ( level.flagtouchreturntime >= 0 && level.flagtouchreturntime != 63 ) - { - level.touchreturn = 1; - } - else - { - level.touchreturn = 0; - } + level.flagcapturetime = getgametypesetting( "captureTime" ); + level.flagtouchreturntime = getgametypesetting( "defuseTime" ); + level.idleflagreturntime = getgametypesetting( "idleFlagResetTime" ); + level.flagrespawntime = getgametypesetting( "flagRespawnTime" ); + level.enemycarriervisible = getgametypesetting( "enemyCarrierVisible" ); + level.roundlimit = getgametypesetting( "roundLimit" ); + level.roundscorecarry = getgametypesetting( "roundscorecarry" ); + level.teamkillpenaltymultiplier = getgametypesetting( "teamKillPenalty" ); + level.teamkillscoremultiplier = getgametypesetting( "teamKillScore" ); + + if ( level.flagtouchreturntime >= 0 && level.flagtouchreturntime != 63 ) + level.touchreturn = 1; + else + level.touchreturn = 0; } -createflag( trigger ) //checked matches cerberus output +createflag( trigger ) { - visuals = []; - if ( isDefined( trigger.target ) ) - { - visuals[ 0 ] = getent( trigger.target, "targetname" ); - } - else - { - visuals[ 0 ] = spawn( "script_model", trigger.origin ); - visuals[ 0 ].angles = trigger.angles; - } - entityteam = trigger.script_team; - if ( game[ "switchedsides" ] ) - { - entityteam = getotherteam( entityteam ); - } - visuals[ 0 ] setmodel( maps/mp/teams/_teams::getteamflagmodel( entityteam ) ); - visuals[ 0 ] setteam( entityteam ); - flag = maps/mp/gametypes/_gameobjects::createcarryobject( entityteam, trigger, visuals, vectorScale( ( 0, 0, -1 ), 100 ), istring( entityteam + "_flag" ) ); - flag maps/mp/gametypes/_gameobjects::setteamusetime( "friendly", level.flagtouchreturntime ); - flag maps/mp/gametypes/_gameobjects::setteamusetime( "enemy", level.flagcapturetime ); - flag maps/mp/gametypes/_gameobjects::allowcarry( "enemy" ); - flag maps/mp/gametypes/_gameobjects::setvisibleteam( "any" ); - flag maps/mp/gametypes/_gameobjects::setvisiblecarriermodel( maps/mp/teams/_teams::getteamflagcarrymodel( entityteam ) ); - flag maps/mp/gametypes/_gameobjects::set2dicon( "friendly", level.icondefend2d ); - flag maps/mp/gametypes/_gameobjects::set3dicon( "friendly", level.icondefend3d ); - flag maps/mp/gametypes/_gameobjects::set2dicon( "enemy", level.iconcapture2d ); - flag maps/mp/gametypes/_gameobjects::set3dicon( "enemy", level.iconcapture3d ); - flag maps/mp/gametypes/_gameobjects::setcarryicon( maps/mp/teams/_teams::getteamflagicon( entityteam ) ); - if ( level.enemycarriervisible == 2 ) - { - flag.objidpingfriendly = 1; - } - flag.allowweapons = 1; - flag.onpickup = ::onpickup; - flag.onpickupfailed = ::onpickup; - flag.ondrop = ::ondrop; - flag.onreset = ::onreset; - if ( level.idleflagreturntime > 0 ) - { - flag.autoresettime = level.idleflagreturntime; - } - else - { - flag.autoresettime = undefined; - } - return flag; + if ( isdefined( trigger.target ) ) + visuals[0] = getent( trigger.target, "targetname" ); + else + { + visuals[0] = spawn( "script_model", trigger.origin ); + visuals[0].angles = trigger.angles; + } + + entityteam = trigger.script_team; + + if ( game["switchedsides"] ) + entityteam = getotherteam( entityteam ); + + visuals[0] setmodel( maps\mp\teams\_teams::getteamflagmodel( entityteam ) ); + visuals[0] setteam( entityteam ); + flag = maps\mp\gametypes\_gameobjects::createcarryobject( entityteam, trigger, visuals, vectorscale( ( 0, 0, 1 ), 100.0 ), istring( entityteam + "_flag" ) ); + flag maps\mp\gametypes\_gameobjects::setteamusetime( "friendly", level.flagtouchreturntime ); + flag maps\mp\gametypes\_gameobjects::setteamusetime( "enemy", level.flagcapturetime ); + flag maps\mp\gametypes\_gameobjects::allowcarry( "enemy" ); + flag maps\mp\gametypes\_gameobjects::setvisibleteam( "any" ); + flag maps\mp\gametypes\_gameobjects::setvisiblecarriermodel( maps\mp\teams\_teams::getteamflagcarrymodel( entityteam ) ); + flag maps\mp\gametypes\_gameobjects::set2dicon( "friendly", level.icondefend2d ); + flag maps\mp\gametypes\_gameobjects::set3dicon( "friendly", level.icondefend3d ); + flag maps\mp\gametypes\_gameobjects::set2dicon( "enemy", level.iconcapture2d ); + flag maps\mp\gametypes\_gameobjects::set3dicon( "enemy", level.iconcapture3d ); + flag maps\mp\gametypes\_gameobjects::setcarryicon( maps\mp\teams\_teams::getteamflagicon( entityteam ) ); + + if ( level.enemycarriervisible == 2 ) + flag.objidpingfriendly = 1; + + flag.allowweapons = 1; + flag.onpickup = ::onpickup; + flag.onpickupfailed = ::onpickup; + flag.ondrop = ::ondrop; + flag.onreset = ::onreset; + + if ( level.idleflagreturntime > 0 ) + flag.autoresettime = level.idleflagreturntime; + else + flag.autoresettime = undefined; + + return flag; } -createflagzone( trigger ) //checked changed to match cerberus output +createflagzone( trigger ) { - visuals = []; - entityteam = trigger.script_team; - if ( game[ "switchedsides" ] ) - { - entityteam = getotherteam( entityteam ); - } - flagzone = maps/mp/gametypes/_gameobjects::createuseobject( entityteam, trigger, visuals, ( 0, 0, 0 ), istring( entityteam + "_base" ) ); - flagzone maps/mp/gametypes/_gameobjects::allowuse( "friendly" ); - flagzone maps/mp/gametypes/_gameobjects::setusetime( 0 ); - flagzone maps/mp/gametypes/_gameobjects::setusetext( &"MP_CAPTURING_FLAG" ); - flagzone maps/mp/gametypes/_gameobjects::setvisibleteam( "friendly" ); - enemyteam = getotherteam( entityteam ); - flagzone maps/mp/gametypes/_gameobjects::setkeyobject( level.teamflags[ enemyteam ] ); - flagzone.onuse = ::oncapture; - flag = level.teamflags[ entityteam ]; - flag.flagbase = flagzone; - flagzone.flag = flag; - tracestart = trigger.origin + vectorScale( ( 0, 0, 1 ), 32 ); - traceend = trigger.origin + vectorScale( ( 0, 0, -1 ), 32 ); - trace = bullettrace( tracestart, traceend, 0, undefined ); - upangles = vectorToAngles( trace[ "normal" ] ); - flagzone.baseeffectforward = anglesToForward( upangles ); - flagzone.baseeffectright = anglesToRight( upangles ); - flagzone.baseeffectpos = trace[ "position" ]; - flagzone thread resetflagbaseeffect(); - flagzone createflagspawninfluencer( entityteam ); - return flagzone; + visuals = []; + entityteam = trigger.script_team; + + if ( game["switchedsides"] ) + entityteam = getotherteam( entityteam ); + + flagzone = maps\mp\gametypes\_gameobjects::createuseobject( entityteam, trigger, visuals, ( 0, 0, 0 ), istring( entityteam + "_base" ) ); + flagzone maps\mp\gametypes\_gameobjects::allowuse( "friendly" ); + flagzone maps\mp\gametypes\_gameobjects::setusetime( 0 ); + flagzone maps\mp\gametypes\_gameobjects::setusetext( &"MP_CAPTURING_FLAG" ); + flagzone maps\mp\gametypes\_gameobjects::setvisibleteam( "friendly" ); + enemyteam = getotherteam( entityteam ); + flagzone maps\mp\gametypes\_gameobjects::setkeyobject( level.teamflags[enemyteam] ); + flagzone.onuse = ::oncapture; + flag = level.teamflags[entityteam]; + flag.flagbase = flagzone; + flagzone.flag = flag; + tracestart = trigger.origin + vectorscale( ( 0, 0, 1 ), 32.0 ); + traceend = trigger.origin + vectorscale( ( 0, 0, -1 ), 32.0 ); + trace = bullettrace( tracestart, traceend, 0, undefined ); + upangles = vectortoangles( trace["normal"] ); + flagzone.baseeffectforward = anglestoforward( upangles ); + flagzone.baseeffectright = anglestoright( upangles ); + flagzone.baseeffectpos = trace["position"]; + flagzone thread resetflagbaseeffect(); + flagzone createflagspawninfluencer( entityteam ); + return flagzone; } -createflaghint( team, origin ) //checked matches cerberus output +createflaghint( team, origin ) { - radius = 128; - height = 64; - trigger = spawn( "trigger_radius", origin, 0, radius, height ); - trigger sethintstring( &"MP_CTF_CANT_CAPTURE_FLAG" ); - trigger setcursorhint( "HINT_NOICON" ); - trigger.original_origin = origin; - trigger turn_off(); - return trigger; + radius = 128; + height = 64; + trigger = spawn( "trigger_radius", origin, 0, radius, height ); + trigger sethintstring( &"MP_CTF_CANT_CAPTURE_FLAG" ); + trigger setcursorhint( "HINT_NOICON" ); + trigger.original_origin = origin; + trigger turn_off(); + return trigger; } -ctf() //checked changed to match cerberus output +ctf() { - level.flags = []; - level.teamflags = []; - level.flagzones = []; - level.teamflagzones = []; - level.iconcapture3d = "waypoint_grab_red"; - level.iconcapture2d = "waypoint_grab_red"; - level.icondefend3d = "waypoint_defend_flag"; - level.icondefend2d = "waypoint_defend_flag"; - level.icondropped3d = "waypoint_defend_flag"; - level.icondropped2d = "waypoint_defend_flag"; - level.iconreturn3d = "waypoint_return_flag"; - level.iconreturn2d = "waypoint_return_flag"; - level.iconbase3d = "waypoint_defend_flag"; - level.iconescort3d = "waypoint_escort"; - level.iconescort2d = "waypoint_escort"; - level.iconkill3d = "waypoint_kill"; - level.iconkill2d = "waypoint_kill"; - level.iconwaitforflag3d = "waypoint_waitfor_flag"; - precacheshader( level.iconcapture3d ); - precacheshader( level.iconcapture2d ); - precacheshader( level.icondefend3d ); - precacheshader( level.icondefend2d ); - precacheshader( level.icondropped3d ); - precacheshader( level.icondropped2d ); - precacheshader( level.iconbase3d ); - precacheshader( level.iconreturn3d ); - precacheshader( level.iconreturn2d ); - precacheshader( level.iconescort3d ); - precacheshader( level.iconescort2d ); - precacheshader( level.iconkill3d ); - precacheshader( level.iconkill2d ); - precacheshader( level.iconwaitforflag3d ); - level.flagbasefxid = []; - level.flagbasefxid[ "allies" ] = loadfx( "misc/fx_ui_flagbase_" + game[ "allies" ] ); - level.flagbasefxid[ "axis" ] = loadfx( "misc/fx_ui_flagbase_" + game[ "axis" ] ); - flag_triggers = getentarray( "ctf_flag_pickup_trig", "targetname" ); - if ( !isDefined( flag_triggers ) || flag_triggers.size != 2 ) - { - /* + level.flags = []; + level.teamflags = []; + level.flagzones = []; + level.teamflagzones = []; + level.iconcapture3d = "waypoint_grab_red"; + level.iconcapture2d = "waypoint_grab_red"; + level.icondefend3d = "waypoint_defend_flag"; + level.icondefend2d = "waypoint_defend_flag"; + level.icondropped3d = "waypoint_defend_flag"; + level.icondropped2d = "waypoint_defend_flag"; + level.iconreturn3d = "waypoint_return_flag"; + level.iconreturn2d = "waypoint_return_flag"; + level.iconbase3d = "waypoint_defend_flag"; + level.iconescort3d = "waypoint_escort"; + level.iconescort2d = "waypoint_escort"; + level.iconkill3d = "waypoint_kill"; + level.iconkill2d = "waypoint_kill"; + level.iconwaitforflag3d = "waypoint_waitfor_flag"; + precacheshader( level.iconcapture3d ); + precacheshader( level.iconcapture2d ); + precacheshader( level.icondefend3d ); + precacheshader( level.icondefend2d ); + precacheshader( level.icondropped3d ); + precacheshader( level.icondropped2d ); + precacheshader( level.iconbase3d ); + precacheshader( level.iconreturn3d ); + precacheshader( level.iconreturn2d ); + precacheshader( level.iconescort3d ); + precacheshader( level.iconescort2d ); + precacheshader( level.iconkill3d ); + precacheshader( level.iconkill2d ); + precacheshader( level.iconwaitforflag3d ); + level.flagbasefxid = []; + level.flagbasefxid["allies"] = loadfx( "misc/fx_ui_flagbase_" + game["allies"] ); + level.flagbasefxid["axis"] = loadfx( "misc/fx_ui_flagbase_" + game["axis"] ); + flag_triggers = getentarray( "ctf_flag_pickup_trig", "targetname" ); + + if ( !isdefined( flag_triggers ) || flag_triggers.size != 2 ) + { /# - maps/mp/_utility::error( "Not enough ctf_flag_pickup_trig triggers found in map. Need two." ); + maps\mp\_utility::error( "Not enough ctf_flag_pickup_trig triggers found in map. Need two." ); #/ - */ - return; - } - for ( index = 0; index < flag_triggers.size; index++ ) - { - trigger = flag_triggers[ index ]; - flag = createflag( trigger ); - team = flag maps/mp/gametypes/_gameobjects::getownerteam(); - level.flags[ level.flags.size ] = flag; - level.teamflags[ team ] = flag; - } - flag_zones = getentarray( "ctf_flag_zone_trig", "targetname" ); - if ( !isDefined( flag_zones ) || flag_zones.size != 2 ) - { - /* + return; + } + + for ( index = 0; index < flag_triggers.size; index++ ) + { + trigger = flag_triggers[index]; + flag = createflag( trigger ); + team = flag maps\mp\gametypes\_gameobjects::getownerteam(); + level.flags[level.flags.size] = flag; + level.teamflags[team] = flag; + } + + flag_zones = getentarray( "ctf_flag_zone_trig", "targetname" ); + + if ( !isdefined( flag_zones ) || flag_zones.size != 2 ) + { /# - maps/mp/_utility::error( "Not enough ctf_flag_zone_trig triggers found in map. Need two." ); + maps\mp\_utility::error( "Not enough ctf_flag_zone_trig triggers found in map. Need two." ); #/ - */ - return; - } - for ( index = 0; index < flag_zones.size; index++ ) - { - trigger = flag_zones[ index ]; - flagzone = createflagzone( trigger ); - team = flagzone maps/mp/gametypes/_gameobjects::getownerteam(); - level.flagzones[ level.flagzones.size ] = flagzone; - level.teamflagzones[ team ] = flagzone; - level.flaghints[ team ] = createflaghint( team, trigger.origin ); - facing_angle = getDvarInt( "scr_ctf_spawnPointFacingAngle" ); - setspawnpointsbaseweight( getotherteamsmask( team ), trigger.origin, facing_angle, level.spawnsystem.objective_facing_bonus ); - } - createreturnmessageelems(); + return; + } + + for ( index = 0; index < flag_zones.size; index++ ) + { + trigger = flag_zones[index]; + flagzone = createflagzone( trigger ); + team = flagzone maps\mp\gametypes\_gameobjects::getownerteam(); + level.flagzones[level.flagzones.size] = flagzone; + level.teamflagzones[team] = flagzone; + level.flaghints[team] = createflaghint( team, trigger.origin ); + facing_angle = getdvarint( "scr_ctf_spawnPointFacingAngle" ); + setspawnpointsbaseweight( getotherteamsmask( team ), trigger.origin, facing_angle, level.spawnsystem.objective_facing_bonus ); + } + + createreturnmessageelems(); } -ctf_icon_hide() //checked matches cerberus output +ctf_icon_hide() { - level waittill( "game_ended" ); - level.teamflags[ "allies" ] maps/mp/gametypes/_gameobjects::setvisibleteam( "none" ); - level.teamflags[ "axis" ] maps/mp/gametypes/_gameobjects::setvisibleteam( "none" ); + level waittill( "game_ended" ); + + level.teamflags["allies"] maps\mp\gametypes\_gameobjects::setvisibleteam( "none" ); + level.teamflags["axis"] maps\mp\gametypes\_gameobjects::setvisibleteam( "none" ); } -removeinfluencers() //checked matches cerberus output +removeinfluencers() { - if ( isDefined( self.spawn_influencer_enemy_carrier ) ) - { - removeinfluencer( self.spawn_influencer_enemy_carrier ); - self.spawn_influencer_enemy_carrier = undefined; - } - if ( isDefined( self.spawn_influencer_friendly_carrier ) ) - { - removeinfluencer( self.spawn_influencer_friendly_carrier ); - self.spawn_influencer_friendly_carrier = undefined; - } - if ( isDefined( self.spawn_influencer_dropped ) ) - { - removeinfluencer( self.spawn_influencer_dropped ); - self.spawn_influencer_dropped = undefined; - } + if ( isdefined( self.spawn_influencer_enemy_carrier ) ) + { + removeinfluencer( self.spawn_influencer_enemy_carrier ); + self.spawn_influencer_enemy_carrier = undefined; + } + + if ( isdefined( self.spawn_influencer_friendly_carrier ) ) + { + removeinfluencer( self.spawn_influencer_friendly_carrier ); + self.spawn_influencer_friendly_carrier = undefined; + } + + if ( isdefined( self.spawn_influencer_dropped ) ) + { + removeinfluencer( self.spawn_influencer_dropped ); + self.spawn_influencer_dropped = undefined; + } } -ondrop( player ) //checked matches cerberus output +ondrop( player ) { - if ( isDefined( player ) ) - { - player clearclientflag( 0 ); - } - team = self maps/mp/gametypes/_gameobjects::getownerteam(); - otherteam = getotherteam( team ); - bbprint( "mpobjective", "gametime %d objtype %s team %s", getTime(), "ctf_flagdropped", team ); - self.visuals[ 0 ] setclientflag( 6 ); - if ( level.touchreturn ) - { - self maps/mp/gametypes/_gameobjects::allowcarry( "any" ); - level.flaghints[ otherteam ] turn_off(); - } - if ( isDefined( player ) ) - { - printandsoundoneveryone( team, undefined, &"", undefined, "mp_war_objective_lost" ); - level thread maps/mp/_popups::displayteammessagetoteam( &"MP_FRIENDLY_FLAG_DROPPED", player, team ); - level thread maps/mp/_popups::displayteammessagetoteam( &"MP_ENEMY_FLAG_DROPPED", player, otherteam ); - } - else - { - printandsoundoneveryone( team, undefined, &"", undefined, "mp_war_objective_lost" ); - } - maps/mp/gametypes/_globallogic_audio::leaderdialog( "wedrop_flag", otherteam, "ctf_flag" ); - maps/mp/gametypes/_globallogic_audio::leaderdialog( "theydrop_flag", team, "ctf_flag_enemy" ); - if ( isDefined( player ) ) - { - player logstring( team + " flag dropped" ); - } - else - { - logstring( team + " flag dropped" ); - } - if ( isDefined( player ) ) - { - player playlocalsound( "mpl_flag_drop_plr" ); - } - maps/mp/gametypes/_globallogic_audio::play_2d_on_team( "mpl_flagdrop_sting_friend", otherteam ); - maps/mp/gametypes/_globallogic_audio::play_2d_on_team( "mpl_flagdrop_sting_enemy", team ); - if ( level.touchreturn ) - { - self maps/mp/gametypes/_gameobjects::set3dicon( "friendly", level.iconreturn3d ); - self maps/mp/gametypes/_gameobjects::set2dicon( "friendly", level.iconreturn2d ); - } - else - { - self maps/mp/gametypes/_gameobjects::set3dicon( "friendly", level.icondropped3d ); - self maps/mp/gametypes/_gameobjects::set2dicon( "friendly", level.icondropped2d ); - } - self maps/mp/gametypes/_gameobjects::setvisibleteam( "any" ); - self maps/mp/gametypes/_gameobjects::set3dicon( "enemy", level.iconcapture3d ); - self maps/mp/gametypes/_gameobjects::set2dicon( "enemy", level.iconcapture2d ); - thread maps/mp/_utility::playsoundonplayers( game[ "flag_dropped_sound" ], game[ "attackers" ] ); - self thread returnflagaftertimemsg( level.idleflagreturntime ); - if ( isDefined( player ) ) - { - self removeinfluencers(); - } - else - { - self.spawn_influencer_friendly_carrier = undefined; - self.spawn_influencer_enemy_carrier = undefined; - } - ss = level.spawnsystem; - player_team_mask = getteammask( otherteam ); - enemy_team_mask = getteammask( team ); - if ( isDefined( player ) ) - { - flag_origin = player.origin; - } - else - { - flag_origin = self.curorigin; - } - self.spawn_influencer_dropped = addsphereinfluencer( level.spawnsystem.einfluencer_type_game_mode, flag_origin, ss.ctf_dropped_influencer_radius, ss.ctf_dropped_influencer_score, player_team_mask | enemy_team_mask, "ctf_flag_dropped,r,s", maps/mp/gametypes/_spawning::get_score_curve_index( ss.ctf_dropped_influencer_score_curve ), level.idleflagreturntime, self.trigger ); + if ( isdefined( player ) ) + player clearclientflag( 0 ); + + team = self maps\mp\gametypes\_gameobjects::getownerteam(); + otherteam = getotherteam( team ); + bbprint( "mpobjective", "gametime %d objtype %s team %s", gettime(), "ctf_flagdropped", team ); + self.visuals[0] setclientflag( 6 ); + + if ( level.touchreturn ) + { + self maps\mp\gametypes\_gameobjects::allowcarry( "any" ); + level.flaghints[otherteam] turn_off(); + } + + if ( isdefined( player ) ) + { + printandsoundoneveryone( team, undefined, &"", undefined, "mp_war_objective_lost" ); + level thread maps\mp\_popups::displayteammessagetoteam( &"MP_FRIENDLY_FLAG_DROPPED", player, team ); + level thread maps\mp\_popups::displayteammessagetoteam( &"MP_ENEMY_FLAG_DROPPED", player, otherteam ); + } + else + printandsoundoneveryone( team, undefined, &"", undefined, "mp_war_objective_lost" ); + + maps\mp\gametypes\_globallogic_audio::leaderdialog( "wedrop_flag", otherteam, "ctf_flag" ); + maps\mp\gametypes\_globallogic_audio::leaderdialog( "theydrop_flag", team, "ctf_flag_enemy" ); + + if ( isdefined( player ) ) + player logstring( team + " flag dropped" ); + else + logstring( team + " flag dropped" ); + + if ( isdefined( player ) ) + player playlocalsound( "mpl_flag_drop_plr" ); + + maps\mp\gametypes\_globallogic_audio::play_2d_on_team( "mpl_flagdrop_sting_friend", otherteam ); + maps\mp\gametypes\_globallogic_audio::play_2d_on_team( "mpl_flagdrop_sting_enemy", team ); + + if ( level.touchreturn ) + { + self maps\mp\gametypes\_gameobjects::set3dicon( "friendly", level.iconreturn3d ); + self maps\mp\gametypes\_gameobjects::set2dicon( "friendly", level.iconreturn2d ); + } + else + { + self maps\mp\gametypes\_gameobjects::set3dicon( "friendly", level.icondropped3d ); + self maps\mp\gametypes\_gameobjects::set2dicon( "friendly", level.icondropped2d ); + } + + self maps\mp\gametypes\_gameobjects::setvisibleteam( "any" ); + self maps\mp\gametypes\_gameobjects::set3dicon( "enemy", level.iconcapture3d ); + self maps\mp\gametypes\_gameobjects::set2dicon( "enemy", level.iconcapture2d ); + thread maps\mp\_utility::playsoundonplayers( game["flag_dropped_sound"], game["attackers"] ); + self thread returnflagaftertimemsg( level.idleflagreturntime ); + + if ( isdefined( player ) ) + self removeinfluencers(); + else + { + self.spawn_influencer_friendly_carrier = undefined; + self.spawn_influencer_enemy_carrier = undefined; + } + + ss = level.spawnsystem; + player_team_mask = getteammask( otherteam ); + enemy_team_mask = getteammask( team ); + + if ( isdefined( player ) ) + flag_origin = player.origin; + else + flag_origin = self.curorigin; + + self.spawn_influencer_dropped = addsphereinfluencer( level.spawnsystem.einfluencer_type_game_mode, flag_origin, ss.ctf_dropped_influencer_radius, ss.ctf_dropped_influencer_score, player_team_mask | enemy_team_mask, "ctf_flag_dropped,r,s", maps\mp\gametypes\_spawning::get_score_curve_index( ss.ctf_dropped_influencer_score_curve ), level.idleflagreturntime, self.trigger ); } -onpickup( player ) //checked matches cerberus output +onpickup( player ) { - carrierkilledby = self.carrierkilledby; - self.carrierkilledby = undefined; - if ( isDefined( self.spawn_influencer_dropped ) ) - { - removeinfluencer( self.spawn_influencer_dropped ); - self.spawn_influencer_dropped = undefined; - } - player addplayerstatwithgametype( "PICKUPS", 1 ); - if ( level.touchreturn ) - { - self maps/mp/gametypes/_gameobjects::allowcarry( "enemy" ); - } - self removeinfluencers(); - team = self maps/mp/gametypes/_gameobjects::getownerteam(); - otherteam = getotherteam( team ); - self clearreturnflaghudelems(); - if ( isDefined( player ) && player.pers[ "team" ] == team ) - { - self notify( "picked_up" ); - printandsoundoneveryone( team, undefined, &"", undefined, "mp_obj_returned" ); - if ( isDefined( player.pers[ "returns" ] ) ) - { - player.pers[ "returns" ]++; - player.returns = player.pers[ "returns" ]; - } - if ( isDefined( carrierkilledby ) && carrierkilledby == player ) - { - maps/mp/_scoreevents::processscoreevent( "flag_carrier_kill_return_close", player ); - } - else - { - if ( distancesquared( self.trigger.baseorigin, player.origin ) > 90000 ) - { - maps/mp/_scoreevents::processscoreevent( "flag_return", player ); - } - } - maps/mp/_demo::bookmark( "event", getTime(), player ); - player addplayerstatwithgametype( "RETURNS", 1 ); - level thread maps/mp/_popups::displayteammessagetoteam( &"MP_FRIENDLY_FLAG_RETURNED", player, team ); - level thread maps/mp/_popups::displayteammessagetoteam( &"MP_ENEMY_FLAG_RETURNED", player, otherteam ); - self.visuals[ 0 ] clearclientflag( 6 ); - self maps/mp/gametypes/_gameobjects::setflags( 0 ); - bbprint( "mpobjective", "gametime %d objtype %s team %s", getTime(), "ctf_flagreturn", team ); - player recordgameevent( "return" ); - self returnflag(); - self maps/mp/gametypes/_gameobjects::returnhome(); - if ( isDefined( player ) ) - { - player logstring( team + " flag returned" ); - } - else - { - logstring( team + " flag returned" ); - } - return; - } - else - { - bbprint( "mpobjective", "gametime %d objtype %s team %s", getTime(), "ctf_flagpickup", team ); - player recordgameevent( "pickup" ); - maps/mp/_scoreevents::processscoreevent( "flag_grab", player ); - maps/mp/_demo::bookmark( "event", getTime(), player ); - printandsoundoneveryone( otherteam, undefined, &"", undefined, "mp_obj_taken", "mp_enemy_obj_taken" ); - level thread maps/mp/_popups::displayteammessagetoteam( &"MP_FRIENDLY_FLAG_TAKEN", player, team ); - level thread maps/mp/_popups::displayteammessagetoteam( &"MP_ENEMY_FLAG_TAKEN", player, otherteam ); - maps/mp/gametypes/_globallogic_audio::leaderdialog( "wetake_flag", otherteam, "ctf_flag" ); - maps/mp/gametypes/_globallogic_audio::leaderdialog( "theytake_flag", team, "ctf_flag_enemy" ); - player.isflagcarrier = 1; - player.flagcarried = self; - player playlocalsound( "mpl_flag_pickup_plr" ); - player setclientflag( 0 ); - self maps/mp/gametypes/_gameobjects::setflags( 1 ); - maps/mp/gametypes/_globallogic_audio::play_2d_on_team( "mpl_flagget_sting_friend", otherteam ); - maps/mp/gametypes/_globallogic_audio::play_2d_on_team( "mpl_flagget_sting_enemy", team ); - if ( level.enemycarriervisible ) - { - self maps/mp/gametypes/_gameobjects::setvisibleteam( "any" ); - } - else - { - self maps/mp/gametypes/_gameobjects::setvisibleteam( "enemy" ); - } - self maps/mp/gametypes/_gameobjects::set2dicon( "friendly", level.iconkill2d ); - self maps/mp/gametypes/_gameobjects::set3dicon( "friendly", level.iconkill3d ); - self maps/mp/gametypes/_gameobjects::set2dicon( "enemy", level.iconescort2d ); - self maps/mp/gametypes/_gameobjects::set3dicon( "enemy", level.iconescort3d ); - player thread claim_trigger( level.flaghints[ otherteam ] ); - update_hints(); - player logstring( team + " flag taken" ); - ss = level.spawnsystem; - player_team_mask = getteammask( otherteam ); - enemy_team_mask = getteammask( team ); - self.spawn_influencer_enemy_carrier = addsphereinfluencer( level.spawnsystem.einfluencer_type_game_mode, player.origin, ss.ctf_enemy_carrier_influencer_radius, ss.ctf_enemy_carrier_influencer_score, enemy_team_mask, "ctf_flag_enemy_carrier,r,s", maps/mp/gametypes/_spawning::get_score_curve_index( ss.ctf_enemy_carrier_influencer_score_curve ), 0, player ); - self.spawn_influencer_friendly_carrier = addsphereinfluencer( level.spawnsystem.einfluencer_type_game_mode, player.origin, ss.ctf_friendly_carrier_influencer_radius, ss.ctf_friendly_carrier_influencer_score, player_team_mask, "ctf_flag_friendly_carrier,r,s", maps/mp/gametypes/_spawning::get_score_curve_index( ss.ctf_friendly_carrier_influencer_score_curve ), 0, player ); - } + carrierkilledby = self.carrierkilledby; + self.carrierkilledby = undefined; + + if ( isdefined( self.spawn_influencer_dropped ) ) + { + removeinfluencer( self.spawn_influencer_dropped ); + self.spawn_influencer_dropped = undefined; + } + + player addplayerstatwithgametype( "PICKUPS", 1 ); + + if ( level.touchreturn ) + self maps\mp\gametypes\_gameobjects::allowcarry( "enemy" ); + + self removeinfluencers(); + team = self maps\mp\gametypes\_gameobjects::getownerteam(); + otherteam = getotherteam( team ); + self clearreturnflaghudelems(); + + if ( isdefined( player ) && player.pers["team"] == team ) + { + self notify( "picked_up" ); + printandsoundoneveryone( team, undefined, &"", undefined, "mp_obj_returned" ); + + if ( isdefined( player.pers["returns"] ) ) + { + player.pers["returns"]++; + player.returns = player.pers["returns"]; + } + + if ( isdefined( carrierkilledby ) && carrierkilledby == player ) + maps\mp\_scoreevents::processscoreevent( "flag_carrier_kill_return_close", player ); + else if ( distancesquared( self.trigger.baseorigin, player.origin ) > 90000 ) + maps\mp\_scoreevents::processscoreevent( "flag_return", player ); + + maps\mp\_demo::bookmark( "event", gettime(), player ); + player addplayerstatwithgametype( "RETURNS", 1 ); + level thread maps\mp\_popups::displayteammessagetoteam( &"MP_FRIENDLY_FLAG_RETURNED", player, team ); + level thread maps\mp\_popups::displayteammessagetoteam( &"MP_ENEMY_FLAG_RETURNED", player, otherteam ); + self.visuals[0] clearclientflag( 6 ); + self maps\mp\gametypes\_gameobjects::setflags( 0 ); + bbprint( "mpobjective", "gametime %d objtype %s team %s", gettime(), "ctf_flagreturn", team ); + player recordgameevent( "return" ); + self returnflag(); + self maps\mp\gametypes\_gameobjects::returnhome(); + + if ( isdefined( player ) ) + player logstring( team + " flag returned" ); + else + logstring( team + " flag returned" ); + + return; + } + else + { + bbprint( "mpobjective", "gametime %d objtype %s team %s", gettime(), "ctf_flagpickup", team ); + player recordgameevent( "pickup" ); + maps\mp\_scoreevents::processscoreevent( "flag_grab", player ); + maps\mp\_demo::bookmark( "event", gettime(), player ); + printandsoundoneveryone( otherteam, undefined, &"", undefined, "mp_obj_taken", "mp_enemy_obj_taken" ); + level thread maps\mp\_popups::displayteammessagetoteam( &"MP_FRIENDLY_FLAG_TAKEN", player, team ); + level thread maps\mp\_popups::displayteammessagetoteam( &"MP_ENEMY_FLAG_TAKEN", player, otherteam ); + maps\mp\gametypes\_globallogic_audio::leaderdialog( "wetake_flag", otherteam, "ctf_flag" ); + maps\mp\gametypes\_globallogic_audio::leaderdialog( "theytake_flag", team, "ctf_flag_enemy" ); + player.isflagcarrier = 1; + player.flagcarried = self; + player playlocalsound( "mpl_flag_pickup_plr" ); + player setclientflag( 0 ); + self maps\mp\gametypes\_gameobjects::setflags( 1 ); + maps\mp\gametypes\_globallogic_audio::play_2d_on_team( "mpl_flagget_sting_friend", otherteam ); + maps\mp\gametypes\_globallogic_audio::play_2d_on_team( "mpl_flagget_sting_enemy", team ); + + if ( level.enemycarriervisible ) + self maps\mp\gametypes\_gameobjects::setvisibleteam( "any" ); + else + self maps\mp\gametypes\_gameobjects::setvisibleteam( "enemy" ); + + self maps\mp\gametypes\_gameobjects::set2dicon( "friendly", level.iconkill2d ); + self maps\mp\gametypes\_gameobjects::set3dicon( "friendly", level.iconkill3d ); + self maps\mp\gametypes\_gameobjects::set2dicon( "enemy", level.iconescort2d ); + self maps\mp\gametypes\_gameobjects::set3dicon( "enemy", level.iconescort3d ); + player thread claim_trigger( level.flaghints[otherteam] ); + update_hints(); + player logstring( team + " flag taken" ); + ss = level.spawnsystem; + player_team_mask = getteammask( otherteam ); + enemy_team_mask = getteammask( team ); + self.spawn_influencer_enemy_carrier = addsphereinfluencer( level.spawnsystem.einfluencer_type_game_mode, player.origin, ss.ctf_enemy_carrier_influencer_radius, ss.ctf_enemy_carrier_influencer_score, enemy_team_mask, "ctf_flag_enemy_carrier,r,s", maps\mp\gametypes\_spawning::get_score_curve_index( ss.ctf_enemy_carrier_influencer_score_curve ), 0, player ); + self.spawn_influencer_friendly_carrier = addsphereinfluencer( level.spawnsystem.einfluencer_type_game_mode, player.origin, ss.ctf_friendly_carrier_influencer_radius, ss.ctf_friendly_carrier_influencer_score, player_team_mask, "ctf_flag_friendly_carrier,r,s", maps\mp\gametypes\_spawning::get_score_curve_index( ss.ctf_friendly_carrier_influencer_score_curve ), 0, player ); + } } -onpickupmusicstate( player ) //checked changed at own discretion +onpickupmusicstate( player ) { - self endon( "disconnect" ); - self endon( "death" ); - wait 6; - if (player.isFlagCarrier) - { - //imported from bo1 ctf.gsc - player thread maps\mp\gametypes\_globallogic_audio::set_music_on_player( "SUSPENSE", false, false); - } + self endon( "disconnect" ); + self endon( "death" ); + wait 6; + + if ( player.isflagcarrier ) + { + + } } -ishome() //checked matches cerberus output +ishome() { - if ( isDefined( self.carrier ) ) - { - return 0; - } - if ( self.curorigin != self.trigger.baseorigin ) - { - return 0; - } - return 1; + if ( isdefined( self.carrier ) ) + return false; + + if ( self.curorigin != self.trigger.baseorigin ) + return false; + + return true; } -returnflag() //checked matches cerberus output +returnflag() { - team = self maps/mp/gametypes/_gameobjects::getownerteam(); - otherteam = getotherteam( team ); - maps/mp/gametypes/_globallogic_audio::play_2d_on_team( "mpl_flagreturn_sting", team ); - maps/mp/gametypes/_globallogic_audio::play_2d_on_team( "mpl_flagreturn_sting", otherteam ); - level.teamflagzones[ otherteam ] maps/mp/gametypes/_gameobjects::allowuse( "friendly" ); - level.teamflagzones[ otherteam ] maps/mp/gametypes/_gameobjects::setvisibleteam( "friendly" ); - update_hints(); - if ( level.touchreturn ) - { - self maps/mp/gametypes/_gameobjects::allowcarry( "enemy" ); - } - self maps/mp/gametypes/_gameobjects::returnhome(); - self maps/mp/gametypes/_gameobjects::setvisibleteam( "any" ); - self maps/mp/gametypes/_gameobjects::set3dicon( "friendly", level.icondefend3d ); - self maps/mp/gametypes/_gameobjects::set2dicon( "friendly", level.icondefend2d ); - self maps/mp/gametypes/_gameobjects::set3dicon( "enemy", level.iconcapture3d ); - self maps/mp/gametypes/_gameobjects::set2dicon( "enemy", level.iconcapture2d ); - maps/mp/gametypes/_globallogic_audio::leaderdialog( "wereturn_flag", team, "ctf_flag_enemy" ); - maps/mp/gametypes/_globallogic_audio::leaderdialog( "theyreturn_flag", otherteam, "ctf_flag" ); + team = self maps\mp\gametypes\_gameobjects::getownerteam(); + otherteam = getotherteam( team ); + maps\mp\gametypes\_globallogic_audio::play_2d_on_team( "mpl_flagreturn_sting", team ); + maps\mp\gametypes\_globallogic_audio::play_2d_on_team( "mpl_flagreturn_sting", otherteam ); + level.teamflagzones[otherteam] maps\mp\gametypes\_gameobjects::allowuse( "friendly" ); + level.teamflagzones[otherteam] maps\mp\gametypes\_gameobjects::setvisibleteam( "friendly" ); + update_hints(); + + if ( level.touchreturn ) + self maps\mp\gametypes\_gameobjects::allowcarry( "enemy" ); + + self maps\mp\gametypes\_gameobjects::returnhome(); + self maps\mp\gametypes\_gameobjects::setvisibleteam( "any" ); + self maps\mp\gametypes\_gameobjects::set3dicon( "friendly", level.icondefend3d ); + self maps\mp\gametypes\_gameobjects::set2dicon( "friendly", level.icondefend2d ); + self maps\mp\gametypes\_gameobjects::set3dicon( "enemy", level.iconcapture3d ); + self maps\mp\gametypes\_gameobjects::set2dicon( "enemy", level.iconcapture2d ); + maps\mp\gametypes\_globallogic_audio::leaderdialog( "wereturn_flag", team, "ctf_flag_enemy" ); + maps\mp\gametypes\_globallogic_audio::leaderdialog( "theyreturn_flag", otherteam, "ctf_flag" ); } -oncapture( player ) //checked matches cerberus output +oncapture( player ) { - team = player.pers[ "team" ]; - enemyteam = getotherteam( team ); - time = getTime(); - playerteamsflag = level.teamflags[ team ]; - if ( playerteamsflag maps/mp/gametypes/_gameobjects::isobjectawayfromhome() ) - { - return; - } - printandsoundoneveryone( team, undefined, &"", undefined, "mp_obj_captured", "mp_enemy_obj_captured" ); - bbprint( "mpobjective", "gametime %d objtype %s team %s", time, "ctf_flagcapture", enemyteam ); - game[ "challenge" ][ team ][ "capturedFlag" ] = 1; - player maps/mp/_challenges::capturedobjective( time ); - if ( isDefined( player.pers[ "captures" ] ) ) - { - player.pers[ "captures" ]++; - player.captures = player.pers[ "captures" ]; - } - maps/mp/_demo::bookmark( "event", getTime(), player ); - player addplayerstatwithgametype( "CAPTURES", 1 ); - level thread maps/mp/_popups::displayteammessagetoteam( &"MP_ENEMY_FLAG_CAPTURED", player, team ); - level thread maps/mp/_popups::displayteammessagetoteam( &"MP_FRIENDLY_FLAG_CAPTURED", player, enemyteam ); - maps/mp/gametypes/_globallogic_audio::play_2d_on_team( "mpl_flagcapture_sting_enemy", enemyteam ); - maps/mp/gametypes/_globallogic_audio::play_2d_on_team( "mpl_flagcapture_sting_friend", team ); - player giveflagcapturexp( player ); - player logstring( enemyteam + " flag captured" ); - flag = player.carryobject; - flag.dontannouncereturn = 1; - flag maps/mp/gametypes/_gameobjects::returnhome(); - flag.dontannouncereturn = undefined; - otherteam = getotherteam( team ); - level.teamflags[ otherteam ] maps/mp/gametypes/_gameobjects::allowcarry( "enemy" ); - level.teamflags[ otherteam ] maps/mp/gametypes/_gameobjects::setvisibleteam( "any" ); - level.teamflags[ otherteam ] maps/mp/gametypes/_gameobjects::returnhome(); - level.teamflagzones[ otherteam ] maps/mp/gametypes/_gameobjects::allowuse( "friendly" ); - player.isflagcarrier = 0; - player.flagcarried = undefined; - player clearclientflag( 0 ); - maps/mp/gametypes/_globallogic_score::giveteamscoreforobjective( team, 1 ); - maps/mp/gametypes/_globallogic_audio::leaderdialog( "wecap_flag", team, "ctf_flag" ); - maps/mp/gametypes/_globallogic_audio::leaderdialog( "theycap_flag", enemyteam, "ctf_flag_enemy" ); - flag removeinfluencers(); + team = player.pers["team"]; + enemyteam = getotherteam( team ); + time = gettime(); + playerteamsflag = level.teamflags[team]; + + if ( playerteamsflag maps\mp\gametypes\_gameobjects::isobjectawayfromhome() ) + return; + + printandsoundoneveryone( team, undefined, &"", undefined, "mp_obj_captured", "mp_enemy_obj_captured" ); + bbprint( "mpobjective", "gametime %d objtype %s team %s", time, "ctf_flagcapture", enemyteam ); + game["challenge"][team]["capturedFlag"] = 1; + player maps\mp\_challenges::capturedobjective( time ); + + if ( isdefined( player.pers["captures"] ) ) + { + player.pers["captures"]++; + player.captures = player.pers["captures"]; + } + + maps\mp\_demo::bookmark( "event", gettime(), player ); + player addplayerstatwithgametype( "CAPTURES", 1 ); + level thread maps\mp\_popups::displayteammessagetoteam( &"MP_ENEMY_FLAG_CAPTURED", player, team ); + level thread maps\mp\_popups::displayteammessagetoteam( &"MP_FRIENDLY_FLAG_CAPTURED", player, enemyteam ); + maps\mp\gametypes\_globallogic_audio::play_2d_on_team( "mpl_flagcapture_sting_enemy", enemyteam ); + maps\mp\gametypes\_globallogic_audio::play_2d_on_team( "mpl_flagcapture_sting_friend", team ); + player giveflagcapturexp( player ); + player logstring( enemyteam + " flag captured" ); + flag = player.carryobject; + flag.dontannouncereturn = 1; + flag maps\mp\gametypes\_gameobjects::returnhome(); + flag.dontannouncereturn = undefined; + otherteam = getotherteam( team ); + level.teamflags[otherteam] maps\mp\gametypes\_gameobjects::allowcarry( "enemy" ); + level.teamflags[otherteam] maps\mp\gametypes\_gameobjects::setvisibleteam( "any" ); + level.teamflags[otherteam] maps\mp\gametypes\_gameobjects::returnhome(); + level.teamflagzones[otherteam] maps\mp\gametypes\_gameobjects::allowuse( "friendly" ); + player.isflagcarrier = 0; + player.flagcarried = undefined; + player clearclientflag( 0 ); + maps\mp\gametypes\_globallogic_score::giveteamscoreforobjective( team, 1 ); + maps\mp\gametypes\_globallogic_audio::leaderdialog( "wecap_flag", team, "ctf_flag" ); + maps\mp\gametypes\_globallogic_audio::leaderdialog( "theycap_flag", enemyteam, "ctf_flag_enemy" ); + flag removeinfluencers(); } -giveflagcapturexp( player ) //checked matches cerberus output +giveflagcapturexp( player ) { - maps/mp/_scoreevents::processscoreevent( "flag_capture", player ); - player recordgameevent( "capture" ); + maps\mp\_scoreevents::processscoreevent( "flag_capture", player ); + player recordgameevent( "capture" ); } -onreset() //checked matches cerberus output +onreset() { - update_hints(); - team = self maps/mp/gametypes/_gameobjects::getownerteam(); - self maps/mp/gametypes/_gameobjects::set3dicon( "friendly", level.icondefend3d ); - self maps/mp/gametypes/_gameobjects::set2dicon( "friendly", level.icondefend2d ); - self maps/mp/gametypes/_gameobjects::set3dicon( "enemy", level.iconcapture3d ); - self maps/mp/gametypes/_gameobjects::set2dicon( "enemy", level.iconcapture2d ); - if ( level.touchreturn ) - { - self maps/mp/gametypes/_gameobjects::allowcarry( "enemy" ); - } - level.teamflagzones[ team ] maps/mp/gametypes/_gameobjects::setvisibleteam( "friendly" ); - level.teamflagzones[ team ] maps/mp/gametypes/_gameobjects::allowuse( "friendly" ); - self.visuals[ 0 ] clearclientflag( 6 ); - self maps/mp/gametypes/_gameobjects::setflags( 0 ); - self clearreturnflaghudelems(); + update_hints(); + team = self maps\mp\gametypes\_gameobjects::getownerteam(); + self maps\mp\gametypes\_gameobjects::set3dicon( "friendly", level.icondefend3d ); + self maps\mp\gametypes\_gameobjects::set2dicon( "friendly", level.icondefend2d ); + self maps\mp\gametypes\_gameobjects::set3dicon( "enemy", level.iconcapture3d ); + self maps\mp\gametypes\_gameobjects::set2dicon( "enemy", level.iconcapture2d ); + + if ( level.touchreturn ) + self maps\mp\gametypes\_gameobjects::allowcarry( "enemy" ); + + level.teamflagzones[team] maps\mp\gametypes\_gameobjects::setvisibleteam( "friendly" ); + level.teamflagzones[team] maps\mp\gametypes\_gameobjects::allowuse( "friendly" ); + self.visuals[0] clearclientflag( 6 ); + self maps\mp\gametypes\_gameobjects::setflags( 0 ); + self clearreturnflaghudelems(); } -getotherflag( flag ) //checked matches cerberus output +getotherflag( flag ) { - if ( flag == level.flags[ 0 ] ) - { - return level.flags[ 1 ]; - } - return level.flags[ 0 ]; + if ( flag == level.flags[0] ) + return level.flags[1]; + + return level.flags[0]; } -onplayerkilled( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ) //checked changed to match cerberus output +onplayerkilled( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ) { - if ( isDefined( attacker ) && isplayer( attacker ) ) - { - for ( index = 0; index < level.flags.size; index++ ) - { - flagteam = "invalidTeam"; - inflagzone = 0; - defendedflag = 0; - offendedflag = 0; - flagcarrier = level.flags[ index ].carrier; - if ( isDefined( flagcarrier ) ) - { - flagorigin = level.flags[ index ].carrier.origin; - iscarried = 1; - if ( isplayer( attacker ) && attacker.pers[ "team" ] != self.pers[ "team" ] ) - { - if ( isDefined( level.flags[ index ].carrier.attackerdata ) ) - { - if ( level.flags[ index ].carrier != attacker ) - { - if ( isDefined( level.flags[ index ].carrier.attackerdata[ self.clientid ] ) ) - { - maps/mp/_scoreevents::processscoreevent( "rescue_flag_carrier", attacker, undefined, sweapon ); - } - } - } - } - } - else - { - flagorigin = level.flags[ index ].curorigin; - iscarried = 0; - } - dist = distance2d( self.origin, flagorigin ); - if ( dist < level.defaultoffenseradius ) - { - inflagzone = 1; - if ( level.flags[ index ].ownerteam == attacker.pers[ "team" ] ) - { - defendedflag = 1; - } - else - { - offendedflag = 1; - } - } - dist = distance2d( attacker.origin, flagorigin ); - if ( dist < level.defaultoffenseradius ) - { - inflagzone = 1; - if ( level.flags[ index ].ownerteam == attacker.pers[ "team" ] ) - { - defendedflag = 1; - } - else - { - offendedflag = 1; - } - } - if ( inflagzone && isplayer( attacker ) && attacker.pers[ "team" ] != self.pers[ "team" ] ) - { - if ( defendedflag ) - { - attacker addplayerstatwithgametype( "DEFENDS", 1 ); - if ( is_true( self.isflagcarrier ) ) - { - maps/mp/_scoreevents::processscoreevent( "kill_flag_carrier", attacker, undefined, sweapon ); - } - else - { - maps/mp/_scoreevents::processscoreevent( "killed_attacker", attacker, undefined, sweapon ); - } - self recordkillmodifier( "assaulting" ); - } - if ( offendedflag ) - { - attacker addplayerstatwithgametype( "OFFENDS", 1 ); - if ( iscarried == 1 ) - { - if ( isDefined( flagcarrier ) && attacker == flagcarrier ) - { - maps/mp/_scoreevents::processscoreevent( "killed_enemy_while_carrying_flag", attacker, undefined, sweapon ); - } - else - { - maps/mp/_scoreevents::processscoreevent( "defend_flag_carrier", attacker, undefined, sweapon ); - } - } - else - { - maps/mp/_scoreevents::processscoreevent( "killed_defender", attacker, undefined, sweapon ); - } - self recordkillmodifier( "defending" ); - } - } - } - } - else if ( !isDefined( self.isflagcarrier ) || !self.isflagcarrier ) - { - return; - } - if ( isDefined( attacker ) && isplayer( attacker ) && attacker.pers[ "team" ] != self.pers[ "team" ] ) - { - if ( isDefined( self.flagcarried ) ) - { - for ( index = 0; index < level.flags.size; index++ ) - { - currentflag = level.flags[ index ]; - if ( currentflag.ownerteam == self.team ) - { - if ( currentflag.curorigin == currentflag.trigger.baseorigin ) - { - dist = distance2d( self.origin, currentflag.curorigin ); - if ( dist < level.defaultoffenseradius ) - { - self.flagcarried.carrierkilledby = attacker; - break; - } - } - } - } - } - attacker recordgameevent( "kill_carrier" ); - self recordkillmodifier( "carrying" ); - } + if ( isdefined( attacker ) && isplayer( attacker ) ) + { + for ( index = 0; index < level.flags.size; index++ ) + { + flagteam = "invalidTeam"; + inflagzone = 0; + defendedflag = 0; + offendedflag = 0; + flagcarrier = level.flags[index].carrier; + + if ( isdefined( flagcarrier ) ) + { + flagorigin = level.flags[index].carrier.origin; + iscarried = 1; + + if ( isplayer( attacker ) && attacker.pers["team"] != self.pers["team"] ) + { + if ( isdefined( level.flags[index].carrier.attackerdata ) ) + { + if ( level.flags[index].carrier != attacker ) + { + if ( isdefined( level.flags[index].carrier.attackerdata[self.clientid] ) ) + maps\mp\_scoreevents::processscoreevent( "rescue_flag_carrier", attacker, undefined, sweapon ); + } + } + } + } + else + { + flagorigin = level.flags[index].curorigin; + iscarried = 0; + } + + dist = distance2d( self.origin, flagorigin ); + + if ( dist < level.defaultoffenseradius ) + { + inflagzone = 1; + + if ( level.flags[index].ownerteam == attacker.pers["team"] ) + defendedflag = 1; + else + offendedflag = 1; + } + + dist = distance2d( attacker.origin, flagorigin ); + + if ( dist < level.defaultoffenseradius ) + { + inflagzone = 1; + + if ( level.flags[index].ownerteam == attacker.pers["team"] ) + defendedflag = 1; + else + offendedflag = 1; + } + + if ( inflagzone && isplayer( attacker ) && attacker.pers["team"] != self.pers["team"] ) + { + if ( defendedflag ) + { + attacker addplayerstatwithgametype( "DEFENDS", 1 ); + + if ( isdefined( self.isflagcarrier ) && self.isflagcarrier ) + maps\mp\_scoreevents::processscoreevent( "kill_flag_carrier", attacker, undefined, sweapon ); + else + maps\mp\_scoreevents::processscoreevent( "killed_attacker", attacker, undefined, sweapon ); + + self recordkillmodifier( "assaulting" ); + } + + if ( offendedflag ) + { + attacker addplayerstatwithgametype( "OFFENDS", 1 ); + + if ( iscarried == 1 ) + { + if ( isdefined( flagcarrier ) && attacker == flagcarrier ) + maps\mp\_scoreevents::processscoreevent( "killed_enemy_while_carrying_flag", attacker, undefined, sweapon ); + else + maps\mp\_scoreevents::processscoreevent( "defend_flag_carrier", attacker, undefined, sweapon ); + } + else + maps\mp\_scoreevents::processscoreevent( "killed_defender", attacker, undefined, sweapon ); + + self recordkillmodifier( "defending" ); + } + } + } + } + + if ( !isdefined( self.isflagcarrier ) || !self.isflagcarrier ) + return; + + if ( isdefined( attacker ) && isplayer( attacker ) && attacker.pers["team"] != self.pers["team"] ) + { + if ( isdefined( self.flagcarried ) ) + { + for ( index = 0; index < level.flags.size; index++ ) + { + currentflag = level.flags[index]; + + if ( currentflag.ownerteam == self.team ) + { + if ( currentflag.curorigin == currentflag.trigger.baseorigin ) + { + dist = distance2d( self.origin, currentflag.curorigin ); + + if ( dist < level.defaultoffenseradius ) + { + self.flagcarried.carrierkilledby = attacker; + break; + } + } + } + } + } + + attacker recordgameevent( "kill_carrier" ); + self recordkillmodifier( "carrying" ); + } } -createreturnmessageelems() //checked matches cerberus output +createreturnmessageelems() { - level.returnmessageelems = []; - level.returnmessageelems[ "allies" ][ "axis" ] = createservertimer( "objective", 1.4, "allies" ); - level.returnmessageelems[ "allies" ][ "axis" ] setpoint( "TOPRIGHT", "TOPRIGHT", 0, 0 ); - level.returnmessageelems[ "allies" ][ "axis" ].label = &"MP_ENEMY_FLAG_RETURNING_IN"; - level.returnmessageelems[ "allies" ][ "axis" ].alpha = 0; - level.returnmessageelems[ "allies" ][ "axis" ].archived = 0; - level.returnmessageelems[ "allies" ][ "allies" ] = createservertimer( "objective", 1.4, "allies" ); - level.returnmessageelems[ "allies" ][ "allies" ] setpoint( "TOPRIGHT", "TOPRIGHT", 0, 20 ); - level.returnmessageelems[ "allies" ][ "allies" ].label = &"MP_YOUR_FLAG_RETURNING_IN"; - level.returnmessageelems[ "allies" ][ "allies" ].alpha = 0; - level.returnmessageelems[ "allies" ][ "allies" ].archived = 0; - level.returnmessageelems[ "axis" ][ "allies" ] = createservertimer( "objective", 1.4, "axis" ); - level.returnmessageelems[ "axis" ][ "allies" ] setpoint( "TOPRIGHT", "TOPRIGHT", 0, 0 ); - level.returnmessageelems[ "axis" ][ "allies" ].label = &"MP_ENEMY_FLAG_RETURNING_IN"; - level.returnmessageelems[ "axis" ][ "allies" ].alpha = 0; - level.returnmessageelems[ "axis" ][ "allies" ].archived = 0; - level.returnmessageelems[ "axis" ][ "axis" ] = createservertimer( "objective", 1.4, "axis" ); - level.returnmessageelems[ "axis" ][ "axis" ] setpoint( "TOPRIGHT", "TOPRIGHT", 0, 20 ); - level.returnmessageelems[ "axis" ][ "axis" ].label = &"MP_YOUR_FLAG_RETURNING_IN"; - level.returnmessageelems[ "axis" ][ "axis" ].alpha = 0; - level.returnmessageelems[ "axis" ][ "axis" ].archived = 0; + level.returnmessageelems = []; + level.returnmessageelems["allies"]["axis"] = createservertimer( "objective", 1.4, "allies" ); + level.returnmessageelems["allies"]["axis"] setpoint( "TOPRIGHT", "TOPRIGHT", 0, 0 ); + level.returnmessageelems["allies"]["axis"].label = &"MP_ENEMY_FLAG_RETURNING_IN"; + level.returnmessageelems["allies"]["axis"].alpha = 0; + level.returnmessageelems["allies"]["axis"].archived = 0; + level.returnmessageelems["allies"]["allies"] = createservertimer( "objective", 1.4, "allies" ); + level.returnmessageelems["allies"]["allies"] setpoint( "TOPRIGHT", "TOPRIGHT", 0, 20 ); + level.returnmessageelems["allies"]["allies"].label = &"MP_YOUR_FLAG_RETURNING_IN"; + level.returnmessageelems["allies"]["allies"].alpha = 0; + level.returnmessageelems["allies"]["allies"].archived = 0; + level.returnmessageelems["axis"]["allies"] = createservertimer( "objective", 1.4, "axis" ); + level.returnmessageelems["axis"]["allies"] setpoint( "TOPRIGHT", "TOPRIGHT", 0, 0 ); + level.returnmessageelems["axis"]["allies"].label = &"MP_ENEMY_FLAG_RETURNING_IN"; + level.returnmessageelems["axis"]["allies"].alpha = 0; + level.returnmessageelems["axis"]["allies"].archived = 0; + level.returnmessageelems["axis"]["axis"] = createservertimer( "objective", 1.4, "axis" ); + level.returnmessageelems["axis"]["axis"] setpoint( "TOPRIGHT", "TOPRIGHT", 0, 20 ); + level.returnmessageelems["axis"]["axis"].label = &"MP_YOUR_FLAG_RETURNING_IN"; + level.returnmessageelems["axis"]["axis"].alpha = 0; + level.returnmessageelems["axis"]["axis"].archived = 0; } -returnflagaftertimemsg( time ) //checked matches cerberus output +returnflagaftertimemsg( time ) { - if ( level.touchreturn || level.idleflagreturntime == 0 ) - { - return; - } - self notify( "returnFlagAfterTimeMsg" ); - self endon( "returnFlagAfterTimeMsg" ); - result = returnflaghudelems( time ); - self removeinfluencers(); - self clearreturnflaghudelems(); - if ( !isDefined( result ) ) - { - return; - } + if ( level.touchreturn || level.idleflagreturntime == 0 ) + return; + + self notify( "returnFlagAfterTimeMsg" ); + self endon( "returnFlagAfterTimeMsg" ); + result = returnflaghudelems( time ); + self removeinfluencers(); + self clearreturnflaghudelems(); + + if ( !isdefined( result ) ) + return; } -returnflaghudelems( time ) //checked matches cerberus output +returnflaghudelems( time ) { - self endon( "picked_up" ); - level endon( "game_ended" ); - ownerteam = self maps/mp/gametypes/_gameobjects::getownerteam(); - /* + self endon( "picked_up" ); + level endon( "game_ended" ); + ownerteam = self maps\mp\gametypes\_gameobjects::getownerteam(); /# - assert( !level.returnmessageelems[ "axis" ][ ownerteam ].alpha ); + assert( !level.returnmessageelems["axis"][ownerteam].alpha ); #/ - */ - level.returnmessageelems[ "axis" ][ ownerteam ].alpha = 1; - level.returnmessageelems[ "axis" ][ ownerteam ] settimer( time ); - /* + level.returnmessageelems["axis"][ownerteam].alpha = 1; + level.returnmessageelems["axis"][ownerteam] settimer( time ); /# - assert( !level.returnmessageelems[ "allies" ][ ownerteam ].alpha ); + assert( !level.returnmessageelems["allies"][ownerteam].alpha ); #/ - */ - level.returnmessageelems[ "allies" ][ ownerteam ].alpha = 1; - level.returnmessageelems[ "allies" ][ ownerteam ] settimer( time ); - if ( time <= 0 ) - { - return 0; - } - else - { - wait time; - } - return 1; + level.returnmessageelems["allies"][ownerteam].alpha = 1; + level.returnmessageelems["allies"][ownerteam] settimer( time ); + + if ( time <= 0 ) + return false; + else + wait( time ); + + return true; } -clearreturnflaghudelems() //checked matches cerberus output +clearreturnflaghudelems() { - ownerteam = self maps/mp/gametypes/_gameobjects::getownerteam(); - level.returnmessageelems[ "allies" ][ ownerteam ].alpha = 0; - level.returnmessageelems[ "axis" ][ ownerteam ].alpha = 0; + ownerteam = self maps\mp\gametypes\_gameobjects::getownerteam(); + level.returnmessageelems["allies"][ownerteam].alpha = 0; + level.returnmessageelems["axis"][ownerteam].alpha = 0; } -resetflagbaseeffect() //checked matches cerberus output +resetflagbaseeffect() { - wait 0.1; - if ( isDefined( self.baseeffect ) ) - { - self.baseeffect delete(); - } - team = self maps/mp/gametypes/_gameobjects::getownerteam(); - if ( team != "axis" && team != "allies" ) - { - return; - } - fxid = level.flagbasefxid[ team ]; - self.baseeffect = spawnfx( fxid, self.baseeffectpos, self.baseeffectforward, self.baseeffectright ); - triggerfx( self.baseeffect ); + wait 0.1; + + if ( isdefined( self.baseeffect ) ) + self.baseeffect delete(); + + team = self maps\mp\gametypes\_gameobjects::getownerteam(); + + if ( team != "axis" && team != "allies" ) + return; + + fxid = level.flagbasefxid[team]; + self.baseeffect = spawnfx( fxid, self.baseeffectpos, self.baseeffectforward, self.baseeffectright ); + triggerfx( self.baseeffect ); } -turn_on() //checked matches cerberus output +turn_on() { - if ( level.hardcoremode ) - { - return; - } - self.origin = self.original_origin; + if ( level.hardcoremode ) + return; + + self.origin = self.original_origin; } -turn_off() //checked matches cerberus output +turn_off() { - self.origin = ( self.original_origin[ 0 ], self.original_origin[ 1 ], self.original_origin[ 2 ] - 10000 ); + self.origin = ( self.original_origin[0], self.original_origin[1], self.original_origin[2] - 10000 ); } -update_hints() //checked matches cerberus output +update_hints() { - allied_flag = level.teamflags[ "allies" ]; - axis_flag = level.teamflags[ "axis" ]; - if ( !level.touchreturn ) - { - return; - } - if ( isDefined( allied_flag.carrier ) && axis_flag maps/mp/gametypes/_gameobjects::isobjectawayfromhome() ) - { - level.flaghints[ "axis" ] turn_on(); - } - else - { - level.flaghints[ "axis" ] turn_off(); - } - if ( isDefined( axis_flag.carrier ) && allied_flag maps/mp/gametypes/_gameobjects::isobjectawayfromhome() ) - { - level.flaghints[ "allies" ] turn_on(); - } - else - { - level.flaghints[ "allies" ] turn_off(); - } + allied_flag = level.teamflags["allies"]; + axis_flag = level.teamflags["axis"]; + + if ( !level.touchreturn ) + return; + + if ( isdefined( allied_flag.carrier ) && axis_flag maps\mp\gametypes\_gameobjects::isobjectawayfromhome() ) + level.flaghints["axis"] turn_on(); + else + level.flaghints["axis"] turn_off(); + + if ( isdefined( axis_flag.carrier ) && allied_flag maps\mp\gametypes\_gameobjects::isobjectawayfromhome() ) + level.flaghints["allies"] turn_on(); + else + level.flaghints["allies"] turn_off(); } -claim_trigger( trigger ) //checked matches cerberus output +claim_trigger( trigger ) { - self endon( "disconnect" ); - self clientclaimtrigger( trigger ); - self waittill( "drop_object" ); - self clientreleasetrigger( trigger ); + self endon( "disconnect" ); + self clientclaimtrigger( trigger ); + + self waittill( "drop_object" ); + + self clientreleasetrigger( trigger ); } -createflagspawninfluencer( entityteam ) //checked matches cerberus output +createflagspawninfluencer( entityteam ) { - ctf_friendly_base_influencer_score = level.spawnsystem.ctf_friendly_base_influencer_score; - ctf_friendly_base_influencer_score_curve = level.spawnsystem.ctf_friendly_base_influencer_score_curve; - ctf_friendly_base_influencer_radius = level.spawnsystem.ctf_friendly_base_influencer_radius; - ctf_enemy_base_influencer_score = level.spawnsystem.ctf_enemy_base_influencer_score; - ctf_enemy_base_influencer_score_curve = level.spawnsystem.ctf_enemy_base_influencer_score_curve; - ctf_enemy_base_influencer_radius = level.spawnsystem.ctf_enemy_base_influencer_radius; - otherteam = getotherteam( entityteam ); - team_mask = getteammask( entityteam ); - other_team_mask = getteammask( otherteam ); - self.spawn_influencer_friendly = addsphereinfluencer( level.spawnsystem.einfluencer_type_game_mode, self.trigger.origin, ctf_friendly_base_influencer_radius, ctf_friendly_base_influencer_score, team_mask, "ctf_friendly_base,r,s", maps/mp/gametypes/_spawning::get_score_curve_index( ctf_friendly_base_influencer_score_curve ) ); - self.spawn_influencer_enemy = addsphereinfluencer( level.spawnsystem.einfluencer_type_game_mode, self.trigger.origin, ctf_enemy_base_influencer_radius, ctf_enemy_base_influencer_score, other_team_mask, "ctf_enemy_base,r,s", maps/mp/gametypes/_spawning::get_score_curve_index( ctf_enemy_base_influencer_score_curve ) ); + ctf_friendly_base_influencer_score = level.spawnsystem.ctf_friendly_base_influencer_score; + ctf_friendly_base_influencer_score_curve = level.spawnsystem.ctf_friendly_base_influencer_score_curve; + ctf_friendly_base_influencer_radius = level.spawnsystem.ctf_friendly_base_influencer_radius; + ctf_enemy_base_influencer_score = level.spawnsystem.ctf_enemy_base_influencer_score; + ctf_enemy_base_influencer_score_curve = level.spawnsystem.ctf_enemy_base_influencer_score_curve; + ctf_enemy_base_influencer_radius = level.spawnsystem.ctf_enemy_base_influencer_radius; + otherteam = getotherteam( entityteam ); + team_mask = getteammask( entityteam ); + other_team_mask = getteammask( otherteam ); + self.spawn_influencer_friendly = addsphereinfluencer( level.spawnsystem.einfluencer_type_game_mode, self.trigger.origin, ctf_friendly_base_influencer_radius, ctf_friendly_base_influencer_score, team_mask, "ctf_friendly_base,r,s", maps\mp\gametypes\_spawning::get_score_curve_index( ctf_friendly_base_influencer_score_curve ) ); + self.spawn_influencer_enemy = addsphereinfluencer( level.spawnsystem.einfluencer_type_game_mode, self.trigger.origin, ctf_enemy_base_influencer_radius, ctf_enemy_base_influencer_score, other_team_mask, "ctf_enemy_base,r,s", maps\mp\gametypes\_spawning::get_score_curve_index( ctf_enemy_base_influencer_score_curve ) ); } -ctf_gamemodespawndvars( reset_dvars ) //checked matches cerberus output +ctf_gamemodespawndvars( reset_dvars ) { - ss = level.spawnsystem; - ss.ctf_friendly_base_influencer_score = set_dvar_float_if_unset( "scr_spawn_ctf_friendly_base_influencer_score", "0", reset_dvars ); - ss.ctf_friendly_base_influencer_score_curve = set_dvar_if_unset( "scr_spawn_ctf_friendly_base_influencer_score_curve", "constant", reset_dvars ); - ss.ctf_friendly_base_influencer_radius = set_dvar_float_if_unset( "scr_spawn_ctf_friendly_base_influencer_radius", "" + ( 15 * get_player_height() ), reset_dvars ); - ss.ctf_enemy_base_influencer_score = set_dvar_float_if_unset( "scr_spawn_ctf_enemy_base_influencer_score", "-500", reset_dvars ); - ss.ctf_enemy_base_influencer_score_curve = set_dvar_if_unset( "scr_spawn_ctf_enemy_base_influencer_score_curve", "constant", reset_dvars ); - ss.ctf_enemy_base_influencer_radius = set_dvar_float_if_unset( "scr_spawn_ctf_enemy_base_influencer_radius", "" + ( 15 * get_player_height() ), reset_dvars ); - ss.ctf_enemy_carrier_influencer_score = set_dvar_float_if_unset( "scr_spawn_ctf_enemy_carrier_influencer_score", "0", reset_dvars ); - ss.ctf_enemy_carrier_influencer_score_curve = set_dvar_if_unset( "scr_spawn_ctf_enemy_carrier_influencer_score_curve", "constant", reset_dvars ); - ss.ctf_enemy_carrier_influencer_radius = set_dvar_float_if_unset( "scr_spawn_ctf_enemy_carrier_influencer_radius", "" + ( 10 * get_player_height() ), reset_dvars ); - ss.ctf_friendly_carrier_influencer_score = set_dvar_float_if_unset( "scr_spawn_ctf_friendly_carrier_influencer_score", "0", reset_dvars ); - ss.ctf_friendly_carrier_influencer_score_curve = set_dvar_if_unset( "scr_spawn_ctf_friendly_carrier_influencer_score_curve", "constant", reset_dvars ); - ss.ctf_friendly_carrier_influencer_radius = set_dvar_float_if_unset( "scr_spawn_ctf_friendly_carrier_influencer_radius", "" + ( 8 * get_player_height() ), reset_dvars ); - ss.ctf_dropped_influencer_score = set_dvar_float_if_unset( "scr_spawn_ctf_dropped_influencer_score", "0", reset_dvars ); - ss.ctf_dropped_influencer_score_curve = set_dvar_if_unset( "scr_spawn_ctf_dropped_influencer_score_curve", "constant", reset_dvars ); - ss.ctf_dropped_influencer_radius = set_dvar_float_if_unset( "scr_spawn_ctf_dropped_influencer_radius", "" + ( 10 * get_player_height() ), reset_dvars ); + ss = level.spawnsystem; + ss.ctf_friendly_base_influencer_score = set_dvar_float_if_unset( "scr_spawn_ctf_friendly_base_influencer_score", "0", reset_dvars ); + ss.ctf_friendly_base_influencer_score_curve = set_dvar_if_unset( "scr_spawn_ctf_friendly_base_influencer_score_curve", "constant", reset_dvars ); + ss.ctf_friendly_base_influencer_radius = set_dvar_float_if_unset( "scr_spawn_ctf_friendly_base_influencer_radius", "" + 15.0 * get_player_height(), reset_dvars ); + ss.ctf_enemy_base_influencer_score = set_dvar_float_if_unset( "scr_spawn_ctf_enemy_base_influencer_score", "-500", reset_dvars ); + ss.ctf_enemy_base_influencer_score_curve = set_dvar_if_unset( "scr_spawn_ctf_enemy_base_influencer_score_curve", "constant", reset_dvars ); + ss.ctf_enemy_base_influencer_radius = set_dvar_float_if_unset( "scr_spawn_ctf_enemy_base_influencer_radius", "" + 15.0 * get_player_height(), reset_dvars ); + ss.ctf_enemy_carrier_influencer_score = set_dvar_float_if_unset( "scr_spawn_ctf_enemy_carrier_influencer_score", "0", reset_dvars ); + ss.ctf_enemy_carrier_influencer_score_curve = set_dvar_if_unset( "scr_spawn_ctf_enemy_carrier_influencer_score_curve", "constant", reset_dvars ); + ss.ctf_enemy_carrier_influencer_radius = set_dvar_float_if_unset( "scr_spawn_ctf_enemy_carrier_influencer_radius", "" + 10.0 * get_player_height(), reset_dvars ); + ss.ctf_friendly_carrier_influencer_score = set_dvar_float_if_unset( "scr_spawn_ctf_friendly_carrier_influencer_score", "0", reset_dvars ); + ss.ctf_friendly_carrier_influencer_score_curve = set_dvar_if_unset( "scr_spawn_ctf_friendly_carrier_influencer_score_curve", "constant", reset_dvars ); + ss.ctf_friendly_carrier_influencer_radius = set_dvar_float_if_unset( "scr_spawn_ctf_friendly_carrier_influencer_radius", "" + 8.0 * get_player_height(), reset_dvars ); + ss.ctf_dropped_influencer_score = set_dvar_float_if_unset( "scr_spawn_ctf_dropped_influencer_score", "0", reset_dvars ); + ss.ctf_dropped_influencer_score_curve = set_dvar_if_unset( "scr_spawn_ctf_dropped_influencer_score_curve", "constant", reset_dvars ); + ss.ctf_dropped_influencer_radius = set_dvar_float_if_unset( "scr_spawn_ctf_dropped_influencer_radius", "" + 10.0 * get_player_height(), reset_dvars ); } -ctf_getteamkillpenalty( einflictor, attacker, smeansofdeath, sweapon ) //checked matches cerberus output +ctf_getteamkillpenalty( einflictor, attacker, smeansofdeath, sweapon ) { - teamkill_penalty = maps/mp/gametypes/_globallogic_defaults::default_getteamkillpenalty( einflictor, attacker, smeansofdeath, sweapon ); - if ( is_true( self.isflagcarrier ) ) - { - teamkill_penalty *= level.teamkillpenaltymultiplier; - } - return teamkill_penalty; + teamkill_penalty = maps\mp\gametypes\_globallogic_defaults::default_getteamkillpenalty( einflictor, attacker, smeansofdeath, sweapon ); + + if ( isdefined( self.isflagcarrier ) && self.isflagcarrier ) + teamkill_penalty *= level.teamkillpenaltymultiplier; + + return teamkill_penalty; } -ctf_getteamkillscore( einflictor, attacker, smeansofdeath, sweapon ) //checked matches cerberus output +ctf_getteamkillscore( einflictor, attacker, smeansofdeath, sweapon ) { - teamkill_score = maps/mp/gametypes/_rank::getscoreinfovalue( "kill" ); - if ( is_true( self.isflagcarrier ) ) - { - teamkill_score *= level.teamkillscoremultiplier; - } - return int( teamkill_score ); + teamkill_score = maps\mp\gametypes\_rank::getscoreinfovalue( "kill" ); + + if ( isdefined( self.isflagcarrier ) && self.isflagcarrier ) + teamkill_score *= level.teamkillscoremultiplier; + + return int( teamkill_score ); } - - diff --git a/Multiplayer Core/patch_mp/maps/mp/gametypes/dem.gsc b/Multiplayer Core/patch_mp/maps/mp/gametypes/dem.gsc index bc4994a..8159bf3 100644 --- a/Multiplayer Core/patch_mp/maps/mp/gametypes/dem.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/gametypes/dem.gsc @@ -1,1283 +1,1235 @@ -#include maps/mp/gametypes/_hostmigration; -#include maps/mp/_challenges; -#include maps/mp/_popups; -#include maps/mp/_demo; -#include maps/mp/gametypes/_battlechatter_mp; -#include maps/mp/gametypes/_globallogic_utils; -#include maps/mp/gametypes/_globallogic_audio; -#include maps/mp/gametypes/_globallogic_score; -#include maps/mp/gametypes/_spectating; -#include maps/mp/_scoreevents; -#include maps/mp/_medals; -#include maps/mp/gametypes/_spawnlogic; -#include maps/mp/gametypes/_spawning; -#include maps/mp/gametypes/_gameobjects; -#include maps/mp/gametypes/_rank; -#include maps/mp/gametypes/_globallogic_defaults; -#include maps/mp/gametypes/_callbacksetup; -#include maps/mp/gametypes/_globallogic; -#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 - -main() //checked matches cerberus output +main() { - if ( getDvar( "mapname" ) == "mp_background" ) - { - return; - } - maps/mp/gametypes/_globallogic::init(); - maps/mp/gametypes/_callbacksetup::setupcallbacks(); - maps/mp/gametypes/_globallogic::setupcallbacks(); - registerroundswitch( 0, 9 ); - registertimelimit( 0, 1440 ); - registerscorelimit( 0, 500 ); - registerroundlimit( 0, 12 ); - registerroundwinlimit( 0, 10 ); - registernumlives( 0, 100 ); - maps/mp/gametypes/_globallogic::registerfriendlyfiredelay( level.gametype, 15, 0, 1440 ); - level.teambased = 1; - level.overrideteamscore = 1; - level.onprecachegametype = ::onprecachegametype; - level.onstartgametype = ::onstartgametype; - level.onspawnplayer = ::onspawnplayer; - level.onspawnplayerunified = ::onspawnplayerunified; - level.playerspawnedcb = ::dem_playerspawnedcb; - level.onplayerkilled = ::onplayerkilled; - level.ondeadevent = ::ondeadevent; - level.ononeleftevent = ::ononeleftevent; - level.ontimelimit = ::ontimelimit; - level.onroundswitch = ::onroundswitch; - level.getteamkillpenalty = ::dem_getteamkillpenalty; - level.getteamkillscore = ::dem_getteamkillscore; - level.gamemodespawndvars = ::gamemodespawndvars; - level.gettimelimit = ::gettimelimit; - level.shouldplayovertimeround = ::shouldplayovertimeround; - level.lastbombexplodetime = undefined; - level.lastbombexplodebyteam = undefined; - level.ddbombmodel = []; - level.endgameonscorelimit = 0; - game[ "dialog" ][ "gametype" ] = "demo_start"; - game[ "dialog" ][ "gametype_hardcore" ] = "hcdemo_start"; - game[ "dialog" ][ "offense_obj" ] = "destroy_start"; - game[ "dialog" ][ "defense_obj" ] = "defend_start"; - game[ "dialog" ][ "sudden_death" ] = "suddendeath"; - if ( !sessionmodeissystemlink() && !sessionmodeisonlinegame() && issplitscreen() ) - { - setscoreboardcolumns( "score", "kills", "plants", "defuses", "deaths" ); - } - else - { - setscoreboardcolumns( "score", "kills", "deaths", "plants", "defuses" ); - } + if ( getdvar( "mapname" ) == "mp_background" ) + return; + + maps\mp\gametypes\_globallogic::init(); + maps\mp\gametypes\_callbacksetup::setupcallbacks(); + maps\mp\gametypes\_globallogic::setupcallbacks(); + registerroundswitch( 0, 9 ); + registertimelimit( 0, 1440 ); + registerscorelimit( 0, 500 ); + registerroundlimit( 0, 12 ); + registerroundwinlimit( 0, 10 ); + registernumlives( 0, 100 ); + maps\mp\gametypes\_globallogic::registerfriendlyfiredelay( level.gametype, 15, 0, 1440 ); + level.teambased = 1; + level.overrideteamscore = 1; + level.onprecachegametype = ::onprecachegametype; + level.onstartgametype = ::onstartgametype; + level.onspawnplayer = ::onspawnplayer; + level.onspawnplayerunified = ::onspawnplayerunified; + level.playerspawnedcb = ::dem_playerspawnedcb; + level.onplayerkilled = ::onplayerkilled; + level.ondeadevent = ::ondeadevent; + level.ononeleftevent = ::ononeleftevent; + level.ontimelimit = ::ontimelimit; + level.onroundswitch = ::onroundswitch; + level.getteamkillpenalty = ::dem_getteamkillpenalty; + level.getteamkillscore = ::dem_getteamkillscore; + level.gamemodespawndvars = ::gamemodespawndvars; + level.gettimelimit = ::gettimelimit; + level.shouldplayovertimeround = ::shouldplayovertimeround; + level.lastbombexplodetime = undefined; + level.lastbombexplodebyteam = undefined; + level.ddbombmodel = []; + level.endgameonscorelimit = 0; + game["dialog"]["gametype"] = "demo_start"; + game["dialog"]["gametype_hardcore"] = "hcdemo_start"; + game["dialog"]["offense_obj"] = "destroy_start"; + game["dialog"]["defense_obj"] = "defend_start"; + game["dialog"]["sudden_death"] = "suddendeath"; + + if ( !sessionmodeissystemlink() && !sessionmodeisonlinegame() && issplitscreen() ) + setscoreboardcolumns( "score", "kills", "plants", "defuses", "deaths" ); + else + setscoreboardcolumns( "score", "kills", "deaths", "plants", "defuses" ); } -onprecachegametype() //checked matches cerberus output +onprecachegametype() { - game[ "bombmodelname" ] = "t5_weapon_briefcase_bomb_world"; - game[ "bombmodelnameobj" ] = "t5_weapon_briefcase_bomb_world"; - game[ "bomb_dropped_sound" ] = "mpl_flag_drop_plr"; - game[ "bomb_recovered_sound" ] = "mpl_flag_pickup_plr"; - precachemodel( game[ "bombmodelname" ] ); - precachemodel( game[ "bombmodelnameobj" ] ); - precacheshader( "waypoint_bomb" ); - precacheshader( "hud_suitcase_bomb" ); - precacheshader( "waypoint_target" ); - precacheshader( "waypoint_target_a" ); - precacheshader( "waypoint_target_b" ); - precacheshader( "waypoint_defend" ); - precacheshader( "waypoint_defend_a" ); - precacheshader( "waypoint_defend_b" ); - precacheshader( "waypoint_defuse" ); - precacheshader( "waypoint_defuse_a" ); - precacheshader( "waypoint_defuse_b" ); - precacheshader( "compass_waypoint_target" ); - precacheshader( "compass_waypoint_target_a" ); - precacheshader( "compass_waypoint_target_b" ); - precacheshader( "compass_waypoint_defend" ); - precacheshader( "compass_waypoint_defend_a" ); - precacheshader( "compass_waypoint_defend_b" ); - precacheshader( "compass_waypoint_defuse" ); - precacheshader( "compass_waypoint_defuse_a" ); - precacheshader( "compass_waypoint_defuse_b" ); - precachestring( &"MP_EXPLOSIVES_RECOVERED_BY" ); - precachestring( &"MP_EXPLOSIVES_DROPPED_BY" ); - precachestring( &"MP_EXPLOSIVES_PLANTED_BY" ); - precachestring( &"MP_EXPLOSIVES_DEFUSED_BY" ); - precachestring( &"PLATFORM_HOLD_TO_PLANT_EXPLOSIVES" ); - precachestring( &"PLATFORM_HOLD_TO_DEFUSE_EXPLOSIVES" ); - precachestring( &"MP_PLANTING_EXPLOSIVE" ); - precachestring( &"MP_DEFUSING_EXPLOSIVE" ); - precachestring( &"MP_TIME_EXTENDED" ); + game["bombmodelname"] = "t5_weapon_briefcase_bomb_world"; + game["bombmodelnameobj"] = "t5_weapon_briefcase_bomb_world"; + game["bomb_dropped_sound"] = "mpl_flag_drop_plr"; + game["bomb_recovered_sound"] = "mpl_flag_pickup_plr"; + precachemodel( game["bombmodelname"] ); + precachemodel( game["bombmodelnameobj"] ); + precacheshader( "waypoint_bomb" ); + precacheshader( "hud_suitcase_bomb" ); + precacheshader( "waypoint_target" ); + precacheshader( "waypoint_target_a" ); + precacheshader( "waypoint_target_b" ); + precacheshader( "waypoint_defend" ); + precacheshader( "waypoint_defend_a" ); + precacheshader( "waypoint_defend_b" ); + precacheshader( "waypoint_defuse" ); + precacheshader( "waypoint_defuse_a" ); + precacheshader( "waypoint_defuse_b" ); + precacheshader( "compass_waypoint_target" ); + precacheshader( "compass_waypoint_target_a" ); + precacheshader( "compass_waypoint_target_b" ); + precacheshader( "compass_waypoint_defend" ); + precacheshader( "compass_waypoint_defend_a" ); + precacheshader( "compass_waypoint_defend_b" ); + precacheshader( "compass_waypoint_defuse" ); + precacheshader( "compass_waypoint_defuse_a" ); + precacheshader( "compass_waypoint_defuse_b" ); + precachestring( &"MP_EXPLOSIVES_RECOVERED_BY" ); + precachestring( &"MP_EXPLOSIVES_DROPPED_BY" ); + precachestring( &"MP_EXPLOSIVES_PLANTED_BY" ); + precachestring( &"MP_EXPLOSIVES_DEFUSED_BY" ); + precachestring( &"PLATFORM_HOLD_TO_PLANT_EXPLOSIVES" ); + precachestring( &"PLATFORM_HOLD_TO_DEFUSE_EXPLOSIVES" ); + precachestring( &"MP_PLANTING_EXPLOSIVE" ); + precachestring( &"MP_DEFUSING_EXPLOSIVE" ); + precachestring( &"MP_TIME_EXTENDED" ); } -dem_getteamkillpenalty( einflictor, attacker, smeansofdeath, sweapon ) //checked changed to match cerberus output +dem_getteamkillpenalty( einflictor, attacker, smeansofdeath, sweapon ) { - teamkill_penalty = maps/mp/gametypes/_globallogic_defaults::default_getteamkillpenalty( einflictor, attacker, smeansofdeath, sweapon ); - if ( is_true( self.isdefusing ) || is_true( self.isplanting ) ) - { - teamkill_penalty *= level.teamkillpenaltymultiplier; - } - return teamkill_penalty; + teamkill_penalty = maps\mp\gametypes\_globallogic_defaults::default_getteamkillpenalty( einflictor, attacker, smeansofdeath, sweapon ); + + if ( isdefined( self.isdefusing ) && self.isdefusing || isdefined( self.isplanting ) && self.isplanting ) + teamkill_penalty *= level.teamkillpenaltymultiplier; + + return teamkill_penalty; } -dem_getteamkillscore( einflictor, attacker, smeansofdeath, sweapon ) //checked changed to match cerberus output +dem_getteamkillscore( einflictor, attacker, smeansofdeath, sweapon ) { - teamkill_score = maps/mp/gametypes/_rank::getscoreinfovalue( "team_kill" ); - if ( is_true( self.isdefusing ) || is_true( self.isplanting ) ) - { - teamkill_score *= level.teamkillscoremultiplier; - } - return int( teamkill_score ); + teamkill_score = maps\mp\gametypes\_rank::getscoreinfovalue( "team_kill" ); + + if ( isdefined( self.isdefusing ) && self.isdefusing || isdefined( self.isplanting ) && self.isplanting ) + teamkill_score *= level.teamkillscoremultiplier; + + return int( teamkill_score ); } -onroundswitch() //checked matches cerberus output +onroundswitch() { - if ( !isDefined( game[ "switchedsides" ] ) ) - { - game[ "switchedsides" ] = 0; - } - if ( game[ "teamScores" ][ "allies" ] == ( level.scorelimit - 1 ) && game[ "teamScores" ][ "axis" ] == ( level.scorelimit - 1 ) ) - { - aheadteam = getbetterteam(); - if ( aheadteam != game[ "defenders" ] ) - { - game[ "switchedsides" ] = !game[ "switchedsides" ]; - } - level.halftimetype = "overtime"; - } - else - { - level.halftimetype = "halftime"; - game[ "switchedsides" ] = !game[ "switchedsides" ]; - } + if ( !isdefined( game["switchedsides"] ) ) + game["switchedsides"] = 0; + + if ( game["teamScores"]["allies"] == level.scorelimit - 1 && game["teamScores"]["axis"] == level.scorelimit - 1 ) + { + aheadteam = getbetterteam(); + + if ( aheadteam != game["defenders"] ) + game["switchedsides"] = !game["switchedsides"]; + + level.halftimetype = "overtime"; + } + else + { + level.halftimetype = "halftime"; + game["switchedsides"] = !game["switchedsides"]; + } } -getbetterteam() //checked changed to match cerberus output +getbetterteam() { - kills[ "allies" ] = 0; - kills[ "axis" ] = 0; - deaths[ "allies" ] = 0; - deaths[ "axis" ] = 0; - for ( i = 0; i < level.players.size; i++ ) - { - player = level.players[ i ]; - team = player.pers[ "team" ]; - if ( isDefined( team ) || team == "allies" && team == "axis" ) - { - kills[ team ] += player.kills; - deaths[ team ] += player.deaths; - } - } - if ( kills[ "allies" ] > kills[ "axis" ] ) - { - return "allies"; - } - else if ( kills[ "axis" ] > kills[ "allies" ] ) - { - return "axis"; - } - if ( deaths[ "allies" ] < deaths[ "axis" ] ) - { - return "allies"; - } - else if ( deaths[ "axis" ] < deaths[ "allies" ] ) - { - return "axis"; - } - if ( randomint( 2 ) == 0 ) - { - return "allies"; - } - return "axis"; + kills["allies"] = 0; + kills["axis"] = 0; + deaths["allies"] = 0; + deaths["axis"] = 0; + + for ( i = 0; i < level.players.size; i++ ) + { + player = level.players[i]; + team = player.pers["team"]; + + if ( isdefined( team ) && ( team == "allies" || team == "axis" ) ) + { + kills[team] += player.kills; + deaths[team] += player.deaths; + } + } + + if ( kills["allies"] > kills["axis"] ) + return "allies"; + else if ( kills["axis"] > kills["allies"] ) + return "axis"; + + if ( deaths["allies"] < deaths["axis"] ) + return "allies"; + else if ( deaths["axis"] < deaths["allies"] ) + return "axis"; + + if ( randomint( 2 ) == 0 ) + return "allies"; + + return "axis"; } -gamemodespawndvars( reset_dvars ) //checked matches cerberus output +gamemodespawndvars( reset_dvars ) { - ss = level.spawnsystem; - ss.dem_enemy_base_influencer_score = set_dvar_float_if_unset( "scr_spawn_dem_enemy_base_influencer_score", "-500", reset_dvars ); - ss.dem_enemy_base_influencer_score_curve = set_dvar_if_unset( "scr_spawn_dem_enemy_base_influencer_score_curve", "constant", reset_dvars ); - ss.dem_enemy_base_influencer_radius = set_dvar_float_if_unset( "scr_spawn_dem_enemy_base_influencer_radius", "" + ( 15 * get_player_height() ), reset_dvars ); + ss = level.spawnsystem; + ss.dem_enemy_base_influencer_score = set_dvar_float_if_unset( "scr_spawn_dem_enemy_base_influencer_score", "-500", reset_dvars ); + ss.dem_enemy_base_influencer_score_curve = set_dvar_if_unset( "scr_spawn_dem_enemy_base_influencer_score_curve", "constant", reset_dvars ); + ss.dem_enemy_base_influencer_radius = set_dvar_float_if_unset( "scr_spawn_dem_enemy_base_influencer_radius", "" + 15.0 * get_player_height(), reset_dvars ); } -onstartgametype() //checked changed to match cerberus output +onstartgametype() { - setbombtimer( "A", 0 ); - setmatchflag( "bomb_timer_a", 0 ); - setbombtimer( "B", 0 ); - setmatchflag( "bomb_timer_b", 0 ); - level.usingextratime = 0; - level.spawnsystem.unifiedsideswitching = 0; - if ( !isDefined( game[ "switchedsides" ] ) ) - { - game[ "switchedsides" ] = 0; - } - if ( game[ "switchedsides" ] ) - { - oldattackers = game[ "attackers" ]; - olddefenders = game[ "defenders" ]; - game[ "attackers" ] = olddefenders; - game[ "defenders" ] = oldattackers; - } - setclientnamemode( "manual_change" ); - game[ "strings" ][ "target_destroyed" ] = &"MP_TARGET_DESTROYED"; - game[ "strings" ][ "bomb_defused" ] = &"MP_BOMB_DEFUSED"; - precachestring( game[ "strings" ][ "target_destroyed" ] ); - precachestring( game[ "strings" ][ "bomb_defused" ] ); - level._effect[ "bombexplosion" ] = loadfx( "maps/mp_maps/fx_mp_exp_bomb" ); - if ( isDefined( game[ "overtime_round" ] ) ) - { - setobjectivetext( game[ "attackers" ], &"OBJECTIVES_DEM_ATTACKER" ); - setobjectivetext( game[ "defenders" ], &"OBJECTIVES_DEM_ATTACKER" ); - if ( level.splitscreen ) - { - setobjectivescoretext( game[ "attackers" ], &"OBJECTIVES_DEM_ATTACKER" ); - setobjectivescoretext( game[ "defenders" ], &"OBJECTIVES_DEM_ATTACKER" ); - } - else - { - setobjectivescoretext( game[ "attackers" ], &"OBJECTIVES_DEM_ATTACKER_SCORE" ); - setobjectivescoretext( game[ "defenders" ], &"OBJECTIVES_DEM_ATTACKER_SCORE" ); - } - setobjectivehinttext( game[ "attackers" ], &"OBJECTIVES_DEM_ATTACKER_HINT" ); - setobjectivehinttext( game[ "defenders" ], &"OBJECTIVES_DEM_ATTACKER_HINT" ); - } - else - { - setobjectivetext( game[ "attackers" ], &"OBJECTIVES_DEM_ATTACKER" ); - setobjectivetext( game[ "defenders" ], &"OBJECTIVES_SD_DEFENDER" ); - if ( level.splitscreen ) - { - setobjectivescoretext( game[ "attackers" ], &"OBJECTIVES_DEM_ATTACKER" ); - setobjectivescoretext( game[ "defenders" ], &"OBJECTIVES_SD_DEFENDER" ); - } - else - { - setobjectivescoretext( game[ "attackers" ], &"OBJECTIVES_DEM_ATTACKER_SCORE" ); - setobjectivescoretext( game[ "defenders" ], &"OBJECTIVES_SD_DEFENDER_SCORE" ); - } - setobjectivehinttext( game[ "attackers" ], &"OBJECTIVES_DEM_ATTACKER_HINT" ); - setobjectivehinttext( game[ "defenders" ], &"OBJECTIVES_SD_DEFENDER_HINT" ); - } - level.dembombzonename = "bombzone_dem"; - bombzones = getentarray( level.dembombzonename, "targetname" ); - if ( bombzones.size == 0 ) - { - level.dembombzonename = "bombzone"; - } - allowed = []; - allowed[ 0 ] = "sd"; - allowed[ 1 ] = level.dembombzonename; - allowed[ 2 ] = "blocker"; - allowed[ 3 ] = "dem"; - maps/mp/gametypes/_gameobjects::main( allowed ); - maps/mp/gametypes/_spawning::create_map_placed_influencers(); - level.spawnmins = ( 0, 0, 0 ); - level.spawnmaxs = ( 0, 0, 0 ); - maps/mp/gametypes/_spawnlogic::dropspawnpoints( "mp_dem_spawn_attacker_a" ); - maps/mp/gametypes/_spawnlogic::dropspawnpoints( "mp_dem_spawn_attacker_b" ); - maps/mp/gametypes/_spawnlogic::dropspawnpoints( "mp_dem_spawn_defender_a" ); - maps/mp/gametypes/_spawnlogic::dropspawnpoints( "mp_dem_spawn_defender_b" ); - if ( !isDefined( game[ "overtime_round" ] ) ) - { - maps/mp/gametypes/_spawnlogic::placespawnpoints( "mp_dem_spawn_defender_start" ); - maps/mp/gametypes/_spawnlogic::placespawnpoints( "mp_dem_spawn_attacker_start" ); - } - else - { - maps/mp/gametypes/_spawnlogic::placespawnpoints( "mp_dem_spawn_attackerOT_start" ); - maps/mp/gametypes/_spawnlogic::placespawnpoints( "mp_dem_spawn_defenderOT_start" ); - } - maps/mp/gametypes/_spawnlogic::addspawnpoints( game[ "attackers" ], "mp_dem_spawn_attacker" ); - maps/mp/gametypes/_spawnlogic::addspawnpoints( game[ "defenders" ], "mp_dem_spawn_defender" ); - if ( !isDefined( game[ "overtime_round" ] ) ) - { - maps/mp/gametypes/_spawnlogic::addspawnpoints( game[ "defenders" ], "mp_dem_spawn_defender_a" ); - maps/mp/gametypes/_spawnlogic::addspawnpoints( game[ "defenders" ], "mp_dem_spawn_defender_b" ); - } - 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.spawn_start = []; - if ( isDefined( game[ "overtime_round" ] ) ) - { - level.spawn_start[ "axis" ] = maps/mp/gametypes/_spawnlogic::getspawnpointarray( "mp_dem_spawn_attackerOT_start" ); - level.spawn_start[ "allies" ] = maps/mp/gametypes/_spawnlogic::getspawnpointarray( "mp_dem_spawn_defenderOT_start" ); - } - else - { - level.spawn_start[ "axis" ] = maps/mp/gametypes/_spawnlogic::getspawnpointarray( "mp_dem_spawn_defender_start" ); - level.spawn_start[ "allies" ] = maps/mp/gametypes/_spawnlogic::getspawnpointarray( "mp_dem_spawn_attacker_start" ); - } - thread updategametypedvars(); - thread bombs(); + setbombtimer( "A", 0 ); + setmatchflag( "bomb_timer_a", 0 ); + setbombtimer( "B", 0 ); + setmatchflag( "bomb_timer_b", 0 ); + level.usingextratime = 0; + level.spawnsystem.unifiedsideswitching = 0; + + if ( !isdefined( game["switchedsides"] ) ) + game["switchedsides"] = 0; + + if ( game["switchedsides"] ) + { + oldattackers = game["attackers"]; + olddefenders = game["defenders"]; + game["attackers"] = olddefenders; + game["defenders"] = oldattackers; + } + + setclientnamemode( "manual_change" ); + game["strings"]["target_destroyed"] = &"MP_TARGET_DESTROYED"; + game["strings"]["bomb_defused"] = &"MP_BOMB_DEFUSED"; + precachestring( game["strings"]["target_destroyed"] ); + precachestring( game["strings"]["bomb_defused"] ); + level._effect["bombexplosion"] = loadfx( "maps/mp_maps/fx_mp_exp_bomb" ); + + if ( isdefined( game["overtime_round"] ) ) + { + setobjectivetext( game["attackers"], &"OBJECTIVES_DEM_ATTACKER" ); + setobjectivetext( game["defenders"], &"OBJECTIVES_DEM_ATTACKER" ); + + if ( level.splitscreen ) + { + setobjectivescoretext( game["attackers"], &"OBJECTIVES_DEM_ATTACKER" ); + setobjectivescoretext( game["defenders"], &"OBJECTIVES_DEM_ATTACKER" ); + } + else + { + setobjectivescoretext( game["attackers"], &"OBJECTIVES_DEM_ATTACKER_SCORE" ); + setobjectivescoretext( game["defenders"], &"OBJECTIVES_DEM_ATTACKER_SCORE" ); + } + + setobjectivehinttext( game["attackers"], &"OBJECTIVES_DEM_ATTACKER_HINT" ); + setobjectivehinttext( game["defenders"], &"OBJECTIVES_DEM_ATTACKER_HINT" ); + } + else + { + setobjectivetext( game["attackers"], &"OBJECTIVES_DEM_ATTACKER" ); + setobjectivetext( game["defenders"], &"OBJECTIVES_SD_DEFENDER" ); + + if ( level.splitscreen ) + { + setobjectivescoretext( game["attackers"], &"OBJECTIVES_DEM_ATTACKER" ); + setobjectivescoretext( game["defenders"], &"OBJECTIVES_SD_DEFENDER" ); + } + else + { + setobjectivescoretext( game["attackers"], &"OBJECTIVES_DEM_ATTACKER_SCORE" ); + setobjectivescoretext( game["defenders"], &"OBJECTIVES_SD_DEFENDER_SCORE" ); + } + + setobjectivehinttext( game["attackers"], &"OBJECTIVES_DEM_ATTACKER_HINT" ); + setobjectivehinttext( game["defenders"], &"OBJECTIVES_SD_DEFENDER_HINT" ); + } + + level.dembombzonename = "bombzone_dem"; + bombzones = getentarray( level.dembombzonename, "targetname" ); + + if ( bombzones.size == 0 ) + level.dembombzonename = "bombzone"; + + allowed[0] = "sd"; + allowed[1] = level.dembombzonename; + allowed[2] = "blocker"; + allowed[3] = "dem"; + maps\mp\gametypes\_gameobjects::main( allowed ); + maps\mp\gametypes\_spawning::create_map_placed_influencers(); + level.spawnmins = ( 0, 0, 0 ); + level.spawnmaxs = ( 0, 0, 0 ); + maps\mp\gametypes\_spawnlogic::dropspawnpoints( "mp_dem_spawn_attacker_a" ); + maps\mp\gametypes\_spawnlogic::dropspawnpoints( "mp_dem_spawn_attacker_b" ); + maps\mp\gametypes\_spawnlogic::dropspawnpoints( "mp_dem_spawn_defender_a" ); + maps\mp\gametypes\_spawnlogic::dropspawnpoints( "mp_dem_spawn_defender_b" ); + + if ( !isdefined( game["overtime_round"] ) ) + { + maps\mp\gametypes\_spawnlogic::placespawnpoints( "mp_dem_spawn_defender_start" ); + maps\mp\gametypes\_spawnlogic::placespawnpoints( "mp_dem_spawn_attacker_start" ); + } + else + { + maps\mp\gametypes\_spawnlogic::placespawnpoints( "mp_dem_spawn_attackerOT_start" ); + maps\mp\gametypes\_spawnlogic::placespawnpoints( "mp_dem_spawn_defenderOT_start" ); + } + + maps\mp\gametypes\_spawnlogic::addspawnpoints( game["attackers"], "mp_dem_spawn_attacker" ); + maps\mp\gametypes\_spawnlogic::addspawnpoints( game["defenders"], "mp_dem_spawn_defender" ); + + if ( !isdefined( game["overtime_round"] ) ) + { + maps\mp\gametypes\_spawnlogic::addspawnpoints( game["defenders"], "mp_dem_spawn_defender_a" ); + maps\mp\gametypes\_spawnlogic::addspawnpoints( game["defenders"], "mp_dem_spawn_defender_b" ); + } + + 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.spawn_start = []; + + if ( isdefined( game["overtime_round"] ) ) + { + level.spawn_start["axis"] = maps\mp\gametypes\_spawnlogic::getspawnpointarray( "mp_dem_spawn_attackerOT_start" ); + level.spawn_start["allies"] = maps\mp\gametypes\_spawnlogic::getspawnpointarray( "mp_dem_spawn_defenderOT_start" ); + } + else + { + level.spawn_start["axis"] = maps\mp\gametypes\_spawnlogic::getspawnpointarray( "mp_dem_spawn_defender_start" ); + level.spawn_start["allies"] = maps\mp\gametypes\_spawnlogic::getspawnpointarray( "mp_dem_spawn_attacker_start" ); + } + + thread updategametypedvars(); + thread bombs(); } -onspawnplayerunified() //checked matches cerberus output +onspawnplayerunified() { - self.isplanting = 0; - self.isdefusing = 0; - self.isbombcarrier = 0; - maps/mp/gametypes/_spawning::onspawnplayer_unified(); + self.isplanting = 0; + self.isdefusing = 0; + self.isbombcarrier = 0; + maps\mp\gametypes\_spawning::onspawnplayer_unified(); } -onspawnplayer( predictedspawn ) //checked matches cerberus output +onspawnplayer( predictedspawn ) { - if ( !predictedspawn ) - { - self.isplanting = 0; - self.isdefusing = 0; - self.isbombcarrier = 0; - if ( isDefined( self.carryicon ) ) - { - self.carryicon destroyelem(); - self.carryicon = undefined; - } - } - if ( !isDefined( game[ "overtime_round" ] ) ) - { - if ( self.pers[ "team" ] == game[ "attackers" ] ) - { - spawnpointname = "mp_dem_spawn_attacker_start"; - } - else - { - spawnpointname = "mp_dem_spawn_defender_start"; - } - } - else if ( isDefined( game[ "overtime_round" ] ) ) - { - if ( self.pers[ "team" ] == game[ "attackers" ] ) - { - spawnpointname = "mp_dem_spawn_attackerOT_start"; - } - else - { - spawnpointname = "mp_dem_spawn_defenderOT_start"; - } - } - spawnpoints = maps/mp/gametypes/_spawnlogic::getspawnpointarray( spawnpointname ); - /* + if ( !predictedspawn ) + { + self.isplanting = 0; + self.isdefusing = 0; + self.isbombcarrier = 0; + + if ( isdefined( self.carryicon ) ) + { + self.carryicon destroyelem(); + self.carryicon = undefined; + } + } + + if ( !isdefined( game["overtime_round"] ) ) + { + if ( self.pers["team"] == game["attackers"] ) + spawnpointname = "mp_dem_spawn_attacker_start"; + else + spawnpointname = "mp_dem_spawn_defender_start"; + } + else if ( isdefined( game["overtime_round"] ) ) + { + if ( self.pers["team"] == game["attackers"] ) + spawnpointname = "mp_dem_spawn_attackerOT_start"; + else + spawnpointname = "mp_dem_spawn_defenderOT_start"; + } + + spawnpoints = maps\mp\gametypes\_spawnlogic::getspawnpointarray( spawnpointname ); /# - assert( spawnpoints.size ); + assert( spawnpoints.size ); #/ - */ - spawnpoint = maps/mp/gametypes/_spawnlogic::getspawnpoint_random( spawnpoints ); - if ( predictedspawn ) - { - self predictspawnpoint( spawnpoint.origin, spawnpoint.angles ); - } - else - { - self spawn( spawnpoint.origin, spawnpoint.angles, "dem" ); - } + spawnpoint = maps\mp\gametypes\_spawnlogic::getspawnpoint_random( spawnpoints ); + + if ( predictedspawn ) + self predictspawnpoint( spawnpoint.origin, spawnpoint.angles ); + else + self spawn( spawnpoint.origin, spawnpoint.angles, "dem" ); } -dem_playerspawnedcb() //checked matches cerberus output +dem_playerspawnedcb() { - level notify( "spawned_player" ); + level notify( "spawned_player" ); } -onplayerkilled( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ) //checked changed to match cerberus output +onplayerkilled( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ) { - thread checkallowspectating(); - bombzone = undefined; - for ( index = 0; index < level.bombzones.size; index++ ) - { - if ( !isDefined( level.bombzones[ index ].bombexploded ) || !level.bombzones[ index ].bombexploded ) - { - dist = distance2d( self.origin, level.bombzones[ index ].curorigin ); - if ( dist < level.defaultoffenseradius ) - { - bombzone = level.bombzones[ index ]; - break; - } - dist = distance2d( attacker.origin, level.bombzones[ index ].curorigin ); - if ( dist < level.defaultoffenseradius ) - { - inbombzone = 1; - break; - } - } - } - if ( isDefined( bombzone ) && isplayer( attacker ) && attacker.pers[ "team" ] != self.pers[ "team" ] ) - { - if ( bombzone maps/mp/gametypes/_gameobjects::getownerteam() != attacker.team ) - { - if ( !isDefined( attacker.dem_offends ) ) - { - attacker.dem_offends = 0; - } - attacker.dem_offends++; - if ( level.playeroffensivemax >= attacker.dem_offends ) - { - attacker maps/mp/_medals::offenseglobalcount(); - attacker addplayerstatwithgametype( "OFFENDS", 1 ); - self recordkillmodifier( "defending" ); - maps/mp/_scoreevents::processscoreevent( "killed_defender", attacker, self, sweapon ); - } - else - { - /* + thread checkallowspectating(); + bombzone = undefined; + + for ( index = 0; index < level.bombzones.size; index++ ) + { + if ( !isdefined( level.bombzones[index].bombexploded ) || !level.bombzones[index].bombexploded ) + { + dist = distance2d( self.origin, level.bombzones[index].curorigin ); + + if ( dist < level.defaultoffenseradius ) + { + bombzone = level.bombzones[index]; + break; + } + + dist = distance2d( attacker.origin, level.bombzones[index].curorigin ); + + if ( dist < level.defaultoffenseradius ) + { + inbombzone = 1; + break; + } + } + } + + if ( isdefined( bombzone ) && isplayer( attacker ) && attacker.pers["team"] != self.pers["team"] ) + { + if ( bombzone maps\mp\gametypes\_gameobjects::getownerteam() != attacker.team ) + { + if ( !isdefined( attacker.dem_offends ) ) + attacker.dem_offends = 0; + + attacker.dem_offends++; + + if ( level.playeroffensivemax >= attacker.dem_offends ) + { + attacker maps\mp\_medals::offenseglobalcount(); + attacker addplayerstatwithgametype( "OFFENDS", 1 ); + self recordkillmodifier( "defending" ); + maps\mp\_scoreevents::processscoreevent( "killed_defender", attacker, self, sweapon ); + } + else + { /# - attacker iprintlnbold( "GAMETYPE DEBUG: NOT GIVING YOU OFFENSIVE CREDIT AS BOOSTING PREVENTION" ); + attacker iprintlnbold( "GAMETYPE DEBUG: NOT GIVING YOU OFFENSIVE CREDIT AS BOOSTING PREVENTION" ); #/ - */ - } - } - else - { - if ( !isDefined( attacker.dem_defends ) ) - { - attacker.dem_defends = 0; - } - attacker.dem_defends++; - if ( level.playerdefensivemax >= attacker.dem_defends ) - { - if ( isDefined( attacker.pers[ "defends" ] ) ) - { - attacker.pers[ "defends" ]++; - attacker.defends = attacker.pers[ "defends" ]; - } - attacker maps/mp/_medals::defenseglobalcount(); - attacker addplayerstatwithgametype( "DEFENDS", 1 ); - self recordkillmodifier( "assaulting" ); - maps/mp/_scoreevents::processscoreevent( "killed_attacker", attacker, self, sweapon ); - } - else - { - /* - /# - attacker iprintlnbold( "GAMETYPE DEBUG: NOT GIVING YOU DEFENSIVE CREDIT AS BOOSTING PREVENTION" ); - #/ - */ - } - } - } - if ( self.isplanting == 1 ) - { - self recordkillmodifier( "planting" ); - } - if ( self.isdefusing == 1 ) - { - self recordkillmodifier( "defusing" ); - } -} + } + } + else + { + if ( !isdefined( attacker.dem_defends ) ) + attacker.dem_defends = 0; -checkallowspectating() //checked changed to match cerberus output -{ - self endon( "disconnect" ); - wait 0.05; - update = 0; - livesleft = !level.numlives && !self.pers["lives"]; - if ( !level.alivecount[ game[ "attackers" ] ] && !livesleft ) - { - level.spectateoverride[ game[ "attackers" ] ].allowenemyspectate = 1; - update = 1; - } - if ( !level.alivecount[ game[ "defenders" ] ] && !livesleft ) - { - level.spectateoverride[ game[ "defenders" ] ].allowenemyspectate = 1; - update = 1; - } - if ( update ) - { - maps/mp/gametypes/_spectating::updatespectatesettings(); - } -} + attacker.dem_defends++; -dem_endgame( winningteam, endreasontext ) //checked matches cerberus output -{ - if ( isDefined( winningteam ) && winningteam != "tie" ) - { - maps/mp/gametypes/_globallogic_score::giveteamscoreforobjective( winningteam, 1 ); - } - thread maps/mp/gametypes/_globallogic::endgame( winningteam, endreasontext ); -} + if ( level.playerdefensivemax >= attacker.dem_defends ) + { + if ( isdefined( attacker.pers["defends"] ) ) + { + attacker.pers["defends"]++; + attacker.defends = attacker.pers["defends"]; + } -ondeadevent( team ) //checked changed to match cerberus output -{ - if ( level.bombexploded || level.bombdefused ) - { - return; - } - if ( team == "all" ) - { - if ( level.bombplanted ) - { - dem_endgame( game[ "attackers" ], game[ "strings" ][ game[ "defenders" ] + "_eliminated" ] ); - } - else - { - dem_endgame( game[ "defenders" ], game[ "strings" ][ game[ "attackers" ] + "_eliminated" ] ); - } - } - else if ( team == game[ "attackers" ] ) - { - if ( level.bombplanted ) - { - return; - } - dem_endgame( game[ "defenders" ], game[ "strings" ][ game[ "attackers" ] + "_eliminated" ] ); - } - else if ( team == game[ "defenders" ] ) - { - dem_endgame( game[ "attackers" ], game[ "strings" ][ game[ "defenders" ] + "_eliminated" ] ); - } -} - -ononeleftevent( team ) //checked matches cerberus output -{ - if ( level.bombexploded || level.bombdefused ) - { - return; - } - warnlastplayer( team ); -} - -ontimelimit() //checked changed to match cerberus output -{ - if ( isDefined( game[ "overtime_round" ] ) ) - { - dem_endgame( "tie", game[ "strings" ][ "time_limit_reached" ] ); - } - else if ( level.teambased ) - { - bombzonesleft = 0; - for ( index = 0; index < level.bombzones.size; index++ ) - { - if ( !isDefined( level.bombzones[ index ].bombexploded ) || !level.bombzones[ index ].bombexploded ) - { - bombzonesleft++; - } - } - if ( bombzonesleft == 0 ) - { - dem_endgame( game[ "attackers" ], game[ "strings" ][ "target_destroyed" ] ); - } - else - { - dem_endgame( game[ "defenders" ], game[ "strings" ][ "time_limit_reached" ] ); - } - } - else - { - dem_endgame( "tie", game[ "strings" ][ "time_limit_reached" ] ); - } -} - -warnlastplayer( team ) //checked changed to match cerberus output -{ - if ( !isDefined( level.warnedlastplayer ) ) - { - level.warnedlastplayer = []; - } - if ( isDefined( level.warnedlastplayer[ team ] ) ) - { - return; - } - level.warnedlastplayer[ team ] = 1; - players = level.players; - for ( i = 0; i < players.size; i++ ) - { - player = players[ i ]; - if ( isDefined( player.pers[ "team" ] ) && player.pers[ "team" ] == team && isDefined( player.pers[ "class" ] ) ) - { - if ( player.sessionstate == "playing" && !player.afk ) - { - break; - } - } - } - if ( i == players.size ) - { - return; - } - players[ i ] thread givelastattackerwarning(); -} - -givelastattackerwarning() //checked changed to match cerberus output -{ - self endon( "death" ); - self endon( "disconnect" ); - fullhealthtime = 0; - interval = 0.05; - while ( 1 ) - { - if ( self.health != self.maxhealth ) - { - fullhealthtime = 0; - } - else - { - fullhealthtime += interval; - } - wait interval; - if ( self.health == self.maxhealth && fullhealthtime >= 3 ) - { - break; - } - } - self maps/mp/gametypes/_globallogic_audio::leaderdialogonplayer( "sudden_death" ); -} - -updategametypedvars() //checked matches cerberus output -{ - level.planttime = getgametypesetting( "plantTime" ); - level.defusetime = getgametypesetting( "defuseTime" ); - level.bombtimer = getgametypesetting( "bombTimer" ); - level.extratime = getgametypesetting( "extraTime" ); - level.overtimetimelimit = getgametypesetting( "OvertimetimeLimit" ); - level.teamkillpenaltymultiplier = getgametypesetting( "teamKillPenalty" ); - level.teamkillscoremultiplier = getgametypesetting( "teamKillScore" ); - level.playereventslpm = getgametypesetting( "maxPlayerEventsPerMinute" ); - level.bombeventslpm = getgametypesetting( "maxObjectiveEventsPerMinute" ); - level.playeroffensivemax = getgametypesetting( "maxPlayerOffensive" ); - level.playerdefensivemax = getgametypesetting( "maxPlayerDefensive" ); -} - -resetbombzone() //checked matches cerberus output -{ - if ( isDefined( game[ "overtime_round" ] ) ) - { - self maps/mp/gametypes/_gameobjects::setownerteam( "neutral" ); - self maps/mp/gametypes/_gameobjects::allowuse( "any" ); - } - else - { - self maps/mp/gametypes/_gameobjects::allowuse( "enemy" ); - } - self maps/mp/gametypes/_gameobjects::setusetime( level.planttime ); - self maps/mp/gametypes/_gameobjects::setusetext( &"MP_PLANTING_EXPLOSIVE" ); - self maps/mp/gametypes/_gameobjects::setusehinttext( &"PLATFORM_HOLD_TO_PLANT_EXPLOSIVES" ); - self maps/mp/gametypes/_gameobjects::setkeyobject( level.ddbomb ); - self maps/mp/gametypes/_gameobjects::set2dicon( "friendly", "waypoint_defend" + self.label ); - self maps/mp/gametypes/_gameobjects::set3dicon( "friendly", "waypoint_defend" + self.label ); - self maps/mp/gametypes/_gameobjects::set2dicon( "enemy", "waypoint_target" + self.label ); - self maps/mp/gametypes/_gameobjects::set3dicon( "enemy", "waypoint_target" + self.label ); - self maps/mp/gametypes/_gameobjects::setvisibleteam( "any" ); - self.useweapon = "briefcase_bomb_mp"; -} - -setupfordefusing() //checked matches cerberus output -{ - self maps/mp/gametypes/_gameobjects::allowuse( "friendly" ); - self maps/mp/gametypes/_gameobjects::setusetime( level.defusetime ); - self maps/mp/gametypes/_gameobjects::setusetext( &"MP_DEFUSING_EXPLOSIVE" ); - self maps/mp/gametypes/_gameobjects::setusehinttext( &"PLATFORM_HOLD_TO_DEFUSE_EXPLOSIVES" ); - self maps/mp/gametypes/_gameobjects::setkeyobject( undefined ); - self maps/mp/gametypes/_gameobjects::set2dicon( "friendly", "compass_waypoint_defuse" + self.label ); - self maps/mp/gametypes/_gameobjects::set3dicon( "friendly", "waypoint_defuse" + self.label ); - self maps/mp/gametypes/_gameobjects::set2dicon( "enemy", "compass_waypoint_defend" + self.label ); - self maps/mp/gametypes/_gameobjects::set3dicon( "enemy", "waypoint_defend" + self.label ); - self maps/mp/gametypes/_gameobjects::setvisibleteam( "any" ); -} - -bombs() //checked changed to match cerberus output -{ - level.bombaplanted = 0; - level.bombbplanted = 0; - level.bombplanted = 0; - level.bombdefused = 0; - level.bombexploded = 0; - sdbomb = getent( "sd_bomb", "targetname" ); - if ( isDefined( sdbomb ) ) - { - sdbomb delete(); - } - precachemodel( "t5_weapon_briefcase_bomb_world" ); - level.bombzones = []; - bombzones = getentarray( level.dembombzonename, "targetname" ); - index = 0; - while ( index < bombzones.size ) - { - trigger = bombzones[ index ]; - scriptlabel = trigger.script_label; - visuals = getentarray( bombzones[ index ].target, "targetname" ); - clipbrushes = getentarray( "bombzone_clip" + scriptlabel, "targetname" ); - defusetrig = getent( visuals[ 0 ].target, "targetname" ); - bombsiteteamowner = game[ "defenders" ]; - bombsiteallowuse = "enemy"; - if ( isDefined( game[ "overtime_round" ] ) ) - { - if ( scriptlabel != "_overtime" ) - { - trigger delete(); - defusetrig delete(); - visuals[ 0 ] delete(); - foreach ( clip in clipbrushes ) - { - clip delete(); - } - index++; - continue; - } - bombsiteteamowner = "neutral"; - bombsiteallowuse = "any"; - scriptlabel = "_a"; - } - else if ( scriptlabel == "_overtime" ) - { - trigger delete(); - defusetrig delete(); - visuals[ 0 ] delete(); - foreach ( clip in clipbrushes ) - { - clip delete(); - } - index++; - continue; - } - name = istring( scriptlabel ); - precachestring( name ); - bombzone = maps/mp/gametypes/_gameobjects::createuseobject( bombsiteteamowner, trigger, visuals, ( 0, 0, 0 ), name ); - bombzone maps/mp/gametypes/_gameobjects::allowuse( bombsiteallowuse ); - bombzone maps/mp/gametypes/_gameobjects::setusetime( level.planttime ); - bombzone maps/mp/gametypes/_gameobjects::setusetext( &"MP_PLANTING_EXPLOSIVE" ); - bombzone maps/mp/gametypes/_gameobjects::setusehinttext( &"PLATFORM_HOLD_TO_PLANT_EXPLOSIVES" ); - bombzone maps/mp/gametypes/_gameobjects::setkeyobject( level.ddbomb ); - bombzone.label = scriptlabel; - bombzone.index = index; - bombzone maps/mp/gametypes/_gameobjects::set2dicon( "friendly", "compass_waypoint_defend" + scriptlabel ); - bombzone maps/mp/gametypes/_gameobjects::set3dicon( "friendly", "waypoint_defend" + scriptlabel ); - bombzone maps/mp/gametypes/_gameobjects::set2dicon( "enemy", "compass_waypoint_target" + scriptlabel ); - bombzone maps/mp/gametypes/_gameobjects::set3dicon( "enemy", "waypoint_target" + scriptlabel ); - bombzone maps/mp/gametypes/_gameobjects::setvisibleteam( "any" ); - bombzone.onbeginuse = ::onbeginuse; - bombzone.onenduse = ::onenduse; - bombzone.onuse = ::onuseobject; - bombzone.oncantuse = ::oncantuse; - bombzone.useweapon = "briefcase_bomb_mp"; - bombzone.visuals[ 0 ].killcament = spawn( "script_model", bombzone.visuals[ 0 ].origin + vectorScale( ( 0, 0, 1 ), 128 ) ); - for ( i = 0; i < visuals.size; i++ ) - { - if ( isDefined( visuals[ i ].script_exploder ) ) - { - bombzone.exploderindex = visuals[ i ].script_exploder; - break; - } - } - level.bombzones[ level.bombzones.size ] = bombzone; - bombzone.bombdefusetrig = defusetrig; - /* + attacker maps\mp\_medals::defenseglobalcount(); + attacker addplayerstatwithgametype( "DEFENDS", 1 ); + self recordkillmodifier( "assaulting" ); + maps\mp\_scoreevents::processscoreevent( "killed_attacker", attacker, self, sweapon ); + } + else + { /# - assert( isDefined( bombzone.bombdefusetrig ) ); + attacker iprintlnbold( "GAMETYPE DEBUG: NOT GIVING YOU DEFENSIVE CREDIT AS BOOSTING PREVENTION" ); #/ - */ - bombzone.bombdefusetrig.origin += vectorScale( ( 0, 0, -1 ), 10000 ); - bombzone.bombdefusetrig.label = scriptlabel; - dem_enemy_base_influencer_score = level.spawnsystem.dem_enemy_base_influencer_score; - dem_enemy_base_influencer_score_curve = level.spawnsystem.dem_enemy_base_influencer_score_curve; - dem_enemy_base_influencer_radius = level.spawnsystem.dem_enemy_base_influencer_radius; - team_mask = getteammask( game[ "attackers" ] ); - bombzone.spawninfluencer = addsphereinfluencer( level.spawnsystem.einfluencer_type_game_mode, trigger.origin, dem_enemy_base_influencer_radius, dem_enemy_base_influencer_score, team_mask, "dem_enemy_base,r,s", maps/mp/gametypes/_spawning::get_score_curve_index( dem_enemy_base_influencer_score_curve ) ); - index++; - } - for ( index = 0; index < level.bombzones.size; index++ ) - { - array = []; - for ( otherindex = 0; otherindex < level.bombzones.size; otherindex++ ) - { - if ( otherindex != index ) - { - array[ array.size ] = level.bombzones[ otherindex ]; - } - } - level.bombzones[ index ].otherbombzones = array; - } + } + } + } + + if ( self.isplanting == 1 ) + self recordkillmodifier( "planting" ); + + if ( self.isdefusing == 1 ) + self recordkillmodifier( "defusing" ); } -onbeginuse( player ) //checked partially changed to match cerberus output did not change while loop to for loop see github for more info +checkallowspectating() { - timeremaining = maps/mp/gametypes/_globallogic_utils::gettimeremaining(); - if ( timeremaining <= ( level.planttime * 1000 ) ) - { - maps/mp/gametypes/_globallogic_utils::pausetimer(); - level.haspausedtimer = 1; - } - if ( self maps/mp/gametypes/_gameobjects::isfriendlyteam( player.pers[ "team" ] ) ) - { - player playsound( "mpl_sd_bomb_defuse" ); - player.isdefusing = 1; - player thread maps/mp/gametypes/_battlechatter_mp::gametypespecificbattlechatter( "sd_enemyplant", player.pers[ "team" ] ); - bestdistance = 9000000; - closestbomb = undefined; - if ( isDefined( level.ddbombmodel ) ) - { - keys = getarraykeys( level.ddbombmodel ); - bomblabel = 0; - while ( bomblabel < keys.size ) - { - bomb = level.ddbombmodel[ keys[ bomblabel ] ]; - if ( !isDefined( bomb ) ) - { - bomblabel++; - continue; - } - dist = distancesquared( player.origin, bomb.origin ); - if ( dist < bestdistance ) - { - bestdistance = dist; - closestbomb = bomb; - } - bomblabel++; - } - /* + self endon( "disconnect" ); + wait 0.05; + update = 0; + livesleft = !( level.numlives && !self.pers["lives"] ); + + if ( !level.alivecount[game["attackers"]] && !livesleft ) + { + level.spectateoverride[game["attackers"]].allowenemyspectate = 1; + update = 1; + } + + if ( !level.alivecount[game["defenders"]] && !livesleft ) + { + level.spectateoverride[game["defenders"]].allowenemyspectate = 1; + update = 1; + } + + if ( update ) + maps\mp\gametypes\_spectating::updatespectatesettings(); +} + +dem_endgame( winningteam, endreasontext ) +{ + if ( isdefined( winningteam ) && winningteam != "tie" ) + maps\mp\gametypes\_globallogic_score::giveteamscoreforobjective( winningteam, 1 ); + + thread maps\mp\gametypes\_globallogic::endgame( winningteam, endreasontext ); +} + +ondeadevent( team ) +{ + if ( level.bombexploded || level.bombdefused ) + return; + + if ( team == "all" ) + { + if ( level.bombplanted ) + dem_endgame( game["attackers"], game["strings"][game["defenders"] + "_eliminated"] ); + else + dem_endgame( game["defenders"], game["strings"][game["attackers"] + "_eliminated"] ); + } + else if ( team == game["attackers"] ) + { + if ( level.bombplanted ) + return; + + dem_endgame( game["defenders"], game["strings"][game["attackers"] + "_eliminated"] ); + } + else if ( team == game["defenders"] ) + dem_endgame( game["attackers"], game["strings"][game["defenders"] + "_eliminated"] ); +} + +ononeleftevent( team ) +{ + if ( level.bombexploded || level.bombdefused ) + return; + + warnlastplayer( team ); +} + +ontimelimit() +{ + if ( isdefined( game["overtime_round"] ) ) + dem_endgame( "tie", game["strings"]["time_limit_reached"] ); + else if ( level.teambased ) + { + bombzonesleft = 0; + + for ( index = 0; index < level.bombzones.size; index++ ) + { + if ( !isdefined( level.bombzones[index].bombexploded ) || !level.bombzones[index].bombexploded ) + bombzonesleft++; + } + + if ( bombzonesleft == 0 ) + dem_endgame( game["attackers"], game["strings"]["target_destroyed"] ); + else + dem_endgame( game["defenders"], game["strings"]["time_limit_reached"] ); + } + else + dem_endgame( "tie", game["strings"]["time_limit_reached"] ); +} + +warnlastplayer( team ) +{ + if ( !isdefined( level.warnedlastplayer ) ) + level.warnedlastplayer = []; + + if ( isdefined( level.warnedlastplayer[team] ) ) + return; + + level.warnedlastplayer[team] = 1; + players = level.players; + + for ( i = 0; i < players.size; i++ ) + { + player = players[i]; + + if ( isdefined( player.pers["team"] ) && player.pers["team"] == team && isdefined( player.pers["class"] ) ) + { + if ( player.sessionstate == "playing" && !player.afk ) + break; + } + } + + if ( i == players.size ) + return; + + players[i] thread givelastattackerwarning(); +} + +givelastattackerwarning() +{ + self endon( "death" ); + self endon( "disconnect" ); + fullhealthtime = 0; + interval = 0.05; + + while ( true ) + { + if ( self.health != self.maxhealth ) + fullhealthtime = 0; + else + fullhealthtime += interval; + + wait( interval ); + + if ( self.health == self.maxhealth && fullhealthtime >= 3 ) + break; + } + + self maps\mp\gametypes\_globallogic_audio::leaderdialogonplayer( "sudden_death" ); +} + +updategametypedvars() +{ + level.planttime = getgametypesetting( "plantTime" ); + level.defusetime = getgametypesetting( "defuseTime" ); + level.bombtimer = getgametypesetting( "bombTimer" ); + level.extratime = getgametypesetting( "extraTime" ); + level.overtimetimelimit = getgametypesetting( "OvertimetimeLimit" ); + level.teamkillpenaltymultiplier = getgametypesetting( "teamKillPenalty" ); + level.teamkillscoremultiplier = getgametypesetting( "teamKillScore" ); + level.playereventslpm = getgametypesetting( "maxPlayerEventsPerMinute" ); + level.bombeventslpm = getgametypesetting( "maxObjectiveEventsPerMinute" ); + level.playeroffensivemax = getgametypesetting( "maxPlayerOffensive" ); + level.playerdefensivemax = getgametypesetting( "maxPlayerDefensive" ); +} + +resetbombzone() +{ + if ( isdefined( game["overtime_round"] ) ) + { + self maps\mp\gametypes\_gameobjects::setownerteam( "neutral" ); + self maps\mp\gametypes\_gameobjects::allowuse( "any" ); + } + else + self maps\mp\gametypes\_gameobjects::allowuse( "enemy" ); + + self maps\mp\gametypes\_gameobjects::setusetime( level.planttime ); + self maps\mp\gametypes\_gameobjects::setusetext( &"MP_PLANTING_EXPLOSIVE" ); + self maps\mp\gametypes\_gameobjects::setusehinttext( &"PLATFORM_HOLD_TO_PLANT_EXPLOSIVES" ); + self maps\mp\gametypes\_gameobjects::setkeyobject( level.ddbomb ); + self maps\mp\gametypes\_gameobjects::set2dicon( "friendly", "waypoint_defend" + self.label ); + self maps\mp\gametypes\_gameobjects::set3dicon( "friendly", "waypoint_defend" + self.label ); + self maps\mp\gametypes\_gameobjects::set2dicon( "enemy", "waypoint_target" + self.label ); + self maps\mp\gametypes\_gameobjects::set3dicon( "enemy", "waypoint_target" + self.label ); + self maps\mp\gametypes\_gameobjects::setvisibleteam( "any" ); + self.useweapon = "briefcase_bomb_mp"; +} + +setupfordefusing() +{ + self maps\mp\gametypes\_gameobjects::allowuse( "friendly" ); + self maps\mp\gametypes\_gameobjects::setusetime( level.defusetime ); + self maps\mp\gametypes\_gameobjects::setusetext( &"MP_DEFUSING_EXPLOSIVE" ); + self maps\mp\gametypes\_gameobjects::setusehinttext( &"PLATFORM_HOLD_TO_DEFUSE_EXPLOSIVES" ); + self maps\mp\gametypes\_gameobjects::setkeyobject( undefined ); + self maps\mp\gametypes\_gameobjects::set2dicon( "friendly", "compass_waypoint_defuse" + self.label ); + self maps\mp\gametypes\_gameobjects::set3dicon( "friendly", "waypoint_defuse" + self.label ); + self maps\mp\gametypes\_gameobjects::set2dicon( "enemy", "compass_waypoint_defend" + self.label ); + self maps\mp\gametypes\_gameobjects::set3dicon( "enemy", "waypoint_defend" + self.label ); + self maps\mp\gametypes\_gameobjects::setvisibleteam( "any" ); +} + +bombs() +{ + level.bombaplanted = 0; + level.bombbplanted = 0; + level.bombplanted = 0; + level.bombdefused = 0; + level.bombexploded = 0; + sdbomb = getent( "sd_bomb", "targetname" ); + + if ( isdefined( sdbomb ) ) + sdbomb delete(); + + precachemodel( "t5_weapon_briefcase_bomb_world" ); + level.bombzones = []; + bombzones = getentarray( level.dembombzonename, "targetname" ); + + for ( index = 0; index < bombzones.size; index++ ) + { + trigger = bombzones[index]; + scriptlabel = trigger.script_label; + visuals = getentarray( bombzones[index].target, "targetname" ); + clipbrushes = getentarray( "bombzone_clip" + scriptlabel, "targetname" ); + defusetrig = getent( visuals[0].target, "targetname" ); + bombsiteteamowner = game["defenders"]; + bombsiteallowuse = "enemy"; + + if ( isdefined( game["overtime_round"] ) ) + { + if ( scriptlabel != "_overtime" ) + { + trigger delete(); + defusetrig delete(); + visuals[0] delete(); + + foreach ( clip in clipbrushes ) + clip delete(); + + continue; + } + + bombsiteteamowner = "neutral"; + bombsiteallowuse = "any"; + scriptlabel = "_a"; + } + else if ( scriptlabel == "_overtime" ) + { + trigger delete(); + defusetrig delete(); + visuals[0] delete(); + + foreach ( clip in clipbrushes ) + clip delete(); + + continue; + } + + name = istring( scriptlabel ); + precachestring( name ); + bombzone = maps\mp\gametypes\_gameobjects::createuseobject( bombsiteteamowner, trigger, visuals, ( 0, 0, 0 ), name ); + bombzone maps\mp\gametypes\_gameobjects::allowuse( bombsiteallowuse ); + bombzone maps\mp\gametypes\_gameobjects::setusetime( level.planttime ); + bombzone maps\mp\gametypes\_gameobjects::setusetext( &"MP_PLANTING_EXPLOSIVE" ); + bombzone maps\mp\gametypes\_gameobjects::setusehinttext( &"PLATFORM_HOLD_TO_PLANT_EXPLOSIVES" ); + bombzone maps\mp\gametypes\_gameobjects::setkeyobject( level.ddbomb ); + bombzone.label = scriptlabel; + bombzone.index = index; + bombzone maps\mp\gametypes\_gameobjects::set2dicon( "friendly", "compass_waypoint_defend" + scriptlabel ); + bombzone maps\mp\gametypes\_gameobjects::set3dicon( "friendly", "waypoint_defend" + scriptlabel ); + bombzone maps\mp\gametypes\_gameobjects::set2dicon( "enemy", "compass_waypoint_target" + scriptlabel ); + bombzone maps\mp\gametypes\_gameobjects::set3dicon( "enemy", "waypoint_target" + scriptlabel ); + bombzone maps\mp\gametypes\_gameobjects::setvisibleteam( "any" ); + bombzone.onbeginuse = ::onbeginuse; + bombzone.onenduse = ::onenduse; + bombzone.onuse = ::onuseobject; + bombzone.oncantuse = ::oncantuse; + bombzone.useweapon = "briefcase_bomb_mp"; + bombzone.visuals[0].killcament = spawn( "script_model", bombzone.visuals[0].origin + vectorscale( ( 0, 0, 1 ), 128.0 ) ); + + for ( i = 0; i < visuals.size; i++ ) + { + if ( isdefined( visuals[i].script_exploder ) ) + { + bombzone.exploderindex = visuals[i].script_exploder; + break; + } + } + + level.bombzones[level.bombzones.size] = bombzone; + bombzone.bombdefusetrig = defusetrig; /# - assert( isDefined( closestbomb ) ); + assert( isdefined( bombzone.bombdefusetrig ) ); #/ - */ - player.defusing = closestbomb; - closestbomb hide(); - } - } - else - { - player.isplanting = 1; - player thread maps/mp/gametypes/_battlechatter_mp::gametypespecificbattlechatter( "sd_friendlyplant", player.pers[ "team" ] ); - } - player playsound( "fly_bomb_raise_plr" ); + bombzone.bombdefusetrig.origin += vectorscale( ( 0, 0, -1 ), 10000.0 ); + bombzone.bombdefusetrig.label = scriptlabel; + dem_enemy_base_influencer_score = level.spawnsystem.dem_enemy_base_influencer_score; + dem_enemy_base_influencer_score_curve = level.spawnsystem.dem_enemy_base_influencer_score_curve; + dem_enemy_base_influencer_radius = level.spawnsystem.dem_enemy_base_influencer_radius; + team_mask = getteammask( game["attackers"] ); + bombzone.spawninfluencer = addsphereinfluencer( level.spawnsystem.einfluencer_type_game_mode, trigger.origin, dem_enemy_base_influencer_radius, dem_enemy_base_influencer_score, team_mask, "dem_enemy_base,r,s", maps\mp\gametypes\_spawning::get_score_curve_index( dem_enemy_base_influencer_score_curve ) ); + } + + for ( index = 0; index < level.bombzones.size; index++ ) + { + array = []; + + for ( otherindex = 0; otherindex < level.bombzones.size; otherindex++ ) + { + if ( otherindex != index ) + array[array.size] = level.bombzones[otherindex]; + } + + level.bombzones[index].otherbombzones = array; + } } -onenduse( team, player, result ) //checked matches cerberus output +onbeginuse( player ) { - if ( !isDefined( player ) ) - { - return; - } - if ( !level.bombaplanted && !level.bombbplanted ) - { - maps/mp/gametypes/_globallogic_utils::resumetimer(); - level.haspausedtimer = 0; - } - player.isdefusing = 0; - player.isplanting = 0; - player notify( "event_ended" ); - if ( self maps/mp/gametypes/_gameobjects::isfriendlyteam( player.pers[ "team" ] ) ) - { - if ( isDefined( player.defusing ) && !result ) - { - player.defusing show(); - } - } -} + timeremaining = maps\mp\gametypes\_globallogic_utils::gettimeremaining(); -oncantuse( player ) //checked matches cerberus output -{ - player iprintlnbold( &"MP_CANT_PLANT_WITHOUT_BOMB" ); -} + if ( timeremaining <= level.planttime * 1000 ) + { + maps\mp\gametypes\_globallogic_utils::pausetimer(); + level.haspausedtimer = 1; + } + + if ( self maps\mp\gametypes\_gameobjects::isfriendlyteam( player.pers["team"] ) ) + { + player playsound( "mpl_sd_bomb_defuse" ); + player.isdefusing = 1; + player thread maps\mp\gametypes\_battlechatter_mp::gametypespecificbattlechatter( "sd_enemyplant", player.pers["team"] ); + bestdistance = 9000000; + closestbomb = undefined; + + if ( isdefined( level.ddbombmodel ) ) + { + keys = getarraykeys( level.ddbombmodel ); + + for ( bomblabel = 0; bomblabel < keys.size; bomblabel++ ) + { + bomb = level.ddbombmodel[keys[bomblabel]]; + + if ( !isdefined( bomb ) ) + continue; + + dist = distancesquared( player.origin, bomb.origin ); + + if ( dist < bestdistance ) + { + bestdistance = dist; + closestbomb = bomb; + } + } -onuseobject( player ) //checked matches cerberus output -{ - team = player.team; - enemyteam = getotherteam( team ); - self updateeventsperminute(); - player updateeventsperminute(); - if ( !self maps/mp/gametypes/_gameobjects::isfriendlyteam( team ) ) - { - self maps/mp/gametypes/_gameobjects::setflags( 1 ); - level thread bombplanted( self, player ); - player logstring( "bomb planted: " + self.label ); - bbprint( "mpobjective", "gametime %d objtype %s label %s team %s", getTime(), "dem_bombplant", self.label, team ); - player notify( "bomb_planted" ); - thread maps/mp/gametypes/_globallogic_audio::set_music_on_team( "DEM_WE_PLANT", team, 0, 0, 5 ); - thread maps/mp/gametypes/_globallogic_audio::set_music_on_team( "DEM_THEY_PLANT", enemyteam, 0, 0, 5 ); - if ( isDefined( player.pers[ "plants" ] ) ) - { - player.pers[ "plants" ]++; - player.plants = player.pers[ "plants" ]; - } - if ( !isscoreboosting( player, self ) ) - { - maps/mp/_demo::bookmark( "event", getTime(), player ); - player addplayerstatwithgametype( "PLANTS", 1 ); - maps/mp/_scoreevents::processscoreevent( "planted_bomb", player ); - player recordgameevent( "plant" ); - } - else - { - /* /# - player iprintlnbold( "GAMETYPE DEBUG: NOT GIVING YOU PLANT CREDIT AS BOOSTING PREVENTION" ); -#/ - */ - } - level thread maps/mp/_popups::displayteammessagetoall( &"MP_EXPLOSIVES_PLANTED_BY", player ); - maps/mp/gametypes/_globallogic_audio::leaderdialog( "bomb_planted" ); - } - else - { - self maps/mp/gametypes/_gameobjects::setflags( 0 ); - player notify( "bomb_defused" ); - player logstring( "bomb defused: " + self.label ); - self thread bombdefused(); - self resetbombzone(); - bbprint( "mpobjective", "gametime %d objtype %s label %s team %s", getTime(), "dem_bombdefused", self.label, team ); - if ( isDefined( player.pers[ "defuses" ] ) ) - { - player.pers[ "defuses" ]++; - player.defuses = player.pers[ "defuses" ]; - } - if ( !isscoreboosting( player, self ) ) - { - maps/mp/_demo::bookmark( "event", getTime(), player ); - player addplayerstatwithgametype( "DEFUSES", 1 ); - maps/mp/_scoreevents::processscoreevent( "defused_bomb", player ); - player recordgameevent( "defuse" ); - } - else - { - /* -/# - player iprintlnbold( "GAMETYPE DEBUG: NOT GIVING YOU DEFUSE CREDIT AS BOOSTING PREVENTION" ); + assert( isdefined( closestbomb ) ); #/ - */ - } - level thread maps/mp/_popups::displayteammessagetoall( &"MP_EXPLOSIVES_DEFUSED_BY", player ); - thread maps/mp/gametypes/_globallogic_audio::set_music_on_team( "DEM_WE_DEFUSE", team, 0, 0, 5 ); - thread maps/mp/gametypes/_globallogic_audio::set_music_on_team( "DEM_THEY_DEFUSE", enemyteam, 0, 0, 5 ); - maps/mp/gametypes/_globallogic_audio::leaderdialog( "bomb_defused" ); - } + player.defusing = closestbomb; + closestbomb hide(); + } + } + else + { + player.isplanting = 1; + player thread maps\mp\gametypes\_battlechatter_mp::gametypespecificbattlechatter( "sd_friendlyplant", player.pers["team"] ); + } + + player playsound( "fly_bomb_raise_plr" ); } -ondrop( player ) //checked matches cerberus output +onenduse( team, player, result ) { - if ( !level.bombplanted ) - { - if ( isDefined( player ) ) - { - player logstring( "bomb dropped" ); - } - else - { - logstring( "bomb dropped" ); - } - } - player notify( "event_ended" ); - self maps/mp/gametypes/_gameobjects::set3dicon( "friendly", "waypoint_bomb" ); - maps/mp/_utility::playsoundonplayers( game[ "bomb_dropped_sound" ], game[ "attackers" ] ); + if ( !isdefined( player ) ) + return; + + if ( !level.bombaplanted && !level.bombbplanted ) + { + maps\mp\gametypes\_globallogic_utils::resumetimer(); + level.haspausedtimer = 0; + } + + player.isdefusing = 0; + player.isplanting = 0; + player notify( "event_ended" ); + + if ( self maps\mp\gametypes\_gameobjects::isfriendlyteam( player.pers["team"] ) ) + { + if ( isdefined( player.defusing ) && !result ) + player.defusing show(); + } } -onpickup( player ) //checked matches cerberus output +oncantuse( player ) { - player.isbombcarrier = 1; - self maps/mp/gametypes/_gameobjects::set3dicon( "friendly", "waypoint_defend" ); - if ( !level.bombdefused ) - { - thread playsoundonplayers( "mus_sd_pickup" + "_" + level.teampostfix[ player.pers[ "team" ] ], player.pers[ "team" ] ); - maps/mp/gametypes/_globallogic_audio::leaderdialog( "bomb_taken", player.pers[ "team" ] ); - player logstring( "bomb taken" ); - } - maps/mp/_utility::playsoundonplayers( game[ "bomb_recovered_sound" ], game[ "attackers" ] ); + player iprintlnbold( &"MP_CANT_PLANT_WITHOUT_BOMB" ); } -onreset() //checked matches cerberus output +onuseobject( player ) { + team = player.team; + enemyteam = getotherteam( team ); + self updateeventsperminute(); + player updateeventsperminute(); + + if ( !self maps\mp\gametypes\_gameobjects::isfriendlyteam( team ) ) + { + self maps\mp\gametypes\_gameobjects::setflags( 1 ); + level thread bombplanted( self, player ); + player logstring( "bomb planted: " + self.label ); + bbprint( "mpobjective", "gametime %d objtype %s label %s team %s", gettime(), "dem_bombplant", self.label, team ); + player notify( "bomb_planted" ); + thread maps\mp\gametypes\_globallogic_audio::set_music_on_team( "DEM_WE_PLANT", team, 0, 0, 5 ); + thread maps\mp\gametypes\_globallogic_audio::set_music_on_team( "DEM_THEY_PLANT", enemyteam, 0, 0, 5 ); + + if ( isdefined( player.pers["plants"] ) ) + { + player.pers["plants"]++; + player.plants = player.pers["plants"]; + } + + if ( !isscoreboosting( player, self ) ) + { + maps\mp\_demo::bookmark( "event", gettime(), player ); + player addplayerstatwithgametype( "PLANTS", 1 ); + maps\mp\_scoreevents::processscoreevent( "planted_bomb", player ); + player recordgameevent( "plant" ); + } + else + { +/# + player iprintlnbold( "GAMETYPE DEBUG: NOT GIVING YOU PLANT CREDIT AS BOOSTING PREVENTION" ); +#/ + } + + level thread maps\mp\_popups::displayteammessagetoall( &"MP_EXPLOSIVES_PLANTED_BY", player ); + maps\mp\gametypes\_globallogic_audio::leaderdialog( "bomb_planted" ); + } + else + { + self maps\mp\gametypes\_gameobjects::setflags( 0 ); + player notify( "bomb_defused" ); + player logstring( "bomb defused: " + self.label ); + self thread bombdefused(); + self resetbombzone(); + bbprint( "mpobjective", "gametime %d objtype %s label %s team %s", gettime(), "dem_bombdefused", self.label, team ); + + if ( isdefined( player.pers["defuses"] ) ) + { + player.pers["defuses"]++; + player.defuses = player.pers["defuses"]; + } + + if ( !isscoreboosting( player, self ) ) + { + maps\mp\_demo::bookmark( "event", gettime(), player ); + player addplayerstatwithgametype( "DEFUSES", 1 ); + maps\mp\_scoreevents::processscoreevent( "defused_bomb", player ); + player recordgameevent( "defuse" ); + } + else + { +/# + player iprintlnbold( "GAMETYPE DEBUG: NOT GIVING YOU DEFUSE CREDIT AS BOOSTING PREVENTION" ); +#/ + } + + level thread maps\mp\_popups::displayteammessagetoall( &"MP_EXPLOSIVES_DEFUSED_BY", player ); + thread maps\mp\gametypes\_globallogic_audio::set_music_on_team( "DEM_WE_DEFUSE", team, 0, 0, 5 ); + thread maps\mp\gametypes\_globallogic_audio::set_music_on_team( "DEM_THEY_DEFUSE", enemyteam, 0, 0, 5 ); + maps\mp\gametypes\_globallogic_audio::leaderdialog( "bomb_defused" ); + } } -bombreset( label, reason ) //checked matches cerberus output +ondrop( player ) { - if ( label == "_a" ) - { - level.bombaplanted = 0; - setbombtimer( "A", 0 ); - } - else - { - level.bombbplanted = 0; - setbombtimer( "B", 0 ); - } - setmatchflag( "bomb_timer" + label, 0 ); - if ( !level.bombaplanted && !level.bombbplanted ) - { - maps/mp/gametypes/_globallogic_utils::resumetimer(); - } - self.visuals[ 0 ] maps/mp/gametypes/_globallogic_utils::stoptickingsound(); + if ( !level.bombplanted ) + { + if ( isdefined( player ) ) + player logstring( "bomb dropped" ); + else + logstring( "bomb dropped" ); + } + + player notify( "event_ended" ); + self maps\mp\gametypes\_gameobjects::set3dicon( "friendly", "waypoint_bomb" ); + maps\mp\_utility::playsoundonplayers( game["bomb_dropped_sound"], game["attackers"] ); } -dropbombmodel( player, site ) //checked matches cerberus output +onpickup( player ) { - trace = bullettrace( player.origin + vectorScale( ( 0, 0, 1 ), 20 ), player.origin - vectorScale( ( 0, 0, 1 ), 2000 ), 0, player ); - tempangle = randomfloat( 360 ); - forward = ( cos( tempangle ), sin( tempangle ), 0 ); - forward = vectornormalize( forward - vectorScale( trace[ "normal" ], vectordot( forward, trace[ "normal" ] ) ) ); - dropangles = vectorToAngles( forward ); - if ( isDefined( trace[ "surfacetype" ] ) && trace[ "surfacetype" ] == "water" ) - { - phystrace = playerphysicstrace( player.origin + vectorScale( ( 0, 0, 1 ), 20 ), player.origin - vectorScale( ( 0, 0, 1 ), 2000 ) ); - if ( isDefined( phystrace ) ) - { - trace[ "position" ] = phystrace; - } - } - level.ddbombmodel[ site ] = spawn( "script_model", trace[ "position" ] ); - level.ddbombmodel[ site ].angles = dropangles; - level.ddbombmodel[ site ] setmodel( "prop_suitcase_bomb" ); + player.isbombcarrier = 1; + self maps\mp\gametypes\_gameobjects::set3dicon( "friendly", "waypoint_defend" ); + + if ( !level.bombdefused ) + { + thread playsoundonplayers( "mus_sd_pickup" + "_" + level.teampostfix[player.pers["team"]], player.pers["team"] ); + maps\mp\gametypes\_globallogic_audio::leaderdialog( "bomb_taken", player.pers["team"] ); + player logstring( "bomb taken" ); + } + + maps\mp\_utility::playsoundonplayers( game["bomb_recovered_sound"], game["attackers"] ); +} + +onreset() +{ + +} + +bombreset( label, reason ) +{ + if ( label == "_a" ) + { + level.bombaplanted = 0; + setbombtimer( "A", 0 ); + } + else + { + level.bombbplanted = 0; + setbombtimer( "B", 0 ); + } + + setmatchflag( "bomb_timer" + label, 0 ); + + if ( !level.bombaplanted && !level.bombbplanted ) + maps\mp\gametypes\_globallogic_utils::resumetimer(); + + self.visuals[0] maps\mp\gametypes\_globallogic_utils::stoptickingsound(); +} + +dropbombmodel( player, site ) +{ + trace = bullettrace( player.origin + vectorscale( ( 0, 0, 1 ), 20.0 ), player.origin - vectorscale( ( 0, 0, 1 ), 2000.0 ), 0, player ); + tempangle = randomfloat( 360 ); + forward = ( cos( tempangle ), sin( tempangle ), 0 ); + forward = vectornormalize( forward - vectorscale( trace["normal"], vectordot( forward, trace["normal"] ) ) ); + dropangles = vectortoangles( forward ); + + if ( isdefined( trace["surfacetype"] ) && trace["surfacetype"] == "water" ) + { + phystrace = playerphysicstrace( player.origin + vectorscale( ( 0, 0, 1 ), 20.0 ), player.origin - vectorscale( ( 0, 0, 1 ), 2000.0 ) ); + + if ( isdefined( phystrace ) ) + trace["position"] = phystrace; + } + + level.ddbombmodel[site] = spawn( "script_model", trace["position"] ); + level.ddbombmodel[site].angles = dropangles; + level.ddbombmodel[site] setmodel( "prop_suitcase_bomb" ); } bombplanted( destroyedobj, player ) { - level endon( "game_ended" ); - destroyedobj endon( "bomb_defused" ); - team = player.team; - game[ "challenge" ][ team ][ "plantedBomb" ] = 1; - maps/mp/gametypes/_globallogic_utils::pausetimer(); - destroyedobj.bombplanted = 1; - destroyedobj.visuals[ 0 ] thread maps/mp/gametypes/_globallogic_utils::playtickingsound( "mpl_sab_ui_suitcasebomb_timer" ); - destroyedobj.tickingobject = destroyedobj.visuals[ 0 ]; - label = destroyedobj.label; - detonatetime = int( getTime() + ( level.bombtimer * 1000 ) ); - updatebombtimers( label, detonatetime ); - destroyedobj.detonatetime = detonatetime; - trace = bullettrace( player.origin + vectorScale( ( 0, 0, 1 ), 20 ), player.origin - vectorScale( ( 0, 0, 1 ), 2000 ), 0, player ); - tempangle = randomfloat( 360 ); - forward = ( cos( tempangle ), sin( tempangle ), 0 ); - forward = vectornormalize( forward - vectorScale( trace[ "normal" ], vectordot( forward, trace[ "normal" ] ) ) ); - dropangles = vectorToAngle( forward ); - self dropbombmodel( player, destroyedobj.label ); - destroyedobj maps/mp/gametypes/_gameobjects::allowuse( "none" ); - destroyedobj maps/mp/gametypes/_gameobjects::setvisibleteam( "none" ); - if ( isDefined( game[ "overtime_round" ] ) ) - { - destroyedobj maps/mp/gametypes/_gameobjects::setownerteam( getotherteam( player.team ) ); - } - destroyedobj setupfordefusing(); - player.isbombcarrier = 0; - game[ "challenge" ][ team ][ "plantedBomb" ] = 1; - destroyedobj waitlongdurationwithbombtimeupdate( label, level.bombtimer ); - destroyedobj bombreset( label, "bomb_exploded" ); - if ( level.gameended ) - { - return; - } - bbprint( "mpobjective", "gametime %d objtype %s label %s team %s", getTime(), "dem_bombexplode", label, team ); - destroyedobj.bombexploded = 1; - game[ "challenge" ][ team ][ "destroyedBombSite" ] = 1; - explosionorigin = destroyedobj.curorigin; - level.ddbombmodel[ destroyedobj.label ] delete(); - if ( isDefined( player ) ) - { - destroyedobj.visuals[ 0 ] radiusdamage( explosionorigin, 512, 200, 20, player, "MOD_EXPLOSIVE", "briefcase_bomb_mp" ); - player addplayerstatwithgametype( "DESTRUCTIONS", 1 ); - level thread maps/mp/_popups::displayteammessagetoall( &"MP_EXPLOSIVES_BLOWUP_BY", player ); - maps/mp/_scoreevents::processscoreevent( "bomb_detonated", player ); - player recordgameevent( "destroy" ); - } - else - { - destroyedobj.visuals[ 0 ] radiusdamage( explosionorigin, 512, 200, 20, undefined, "MOD_EXPLOSIVE", "briefcase_bomb_mp" ); - } - currenttime = getTime(); - if ( isDefined( level.lastbombexplodetime ) && level.lastbombexplodebyteam == player.team ) - { - if ( ( level.lastbombexplodetime + 10000 ) > currenttime ) - { - for ( i = 0; i < level.players.size; i++ ) - { - if ( level.players[ i ].team == player.team ) - { - level.players[ i ] maps/mp/_challenges::bothbombsdetonatewithintime(); - } - } - } - } - level.lastbombexplodetime = currenttime; - level.lastbombexplodebyteam = player.team; - rot = randomfloat( 360 ); - explosioneffect = spawnfx( level._effect[ "bombexplosion" ], explosionorigin + vectorScale( ( 0, 0, 1 ), 50 ), ( 0, 0, 1 ), ( cos( rot ), sin( rot ), 0 ) ); - triggerfx( explosioneffect ); - thread playsoundinspace( "mpl_sd_exp_suitcase_bomb_main", explosionorigin ); - if ( isDefined( destroyedobj.exploderindex ) ) - { - exploder( destroyedobj.exploderindex ); - } - bombzonesleft = 0; - for ( index = 0; index < level.bombzones.size; index++ ) - { - if ( !isDefined( level.bombzones[ index ].bombexploded ) || !level.bombzones[ index ].bombexploded ) - { - bombzonesleft++; - } - } - destroyedobj maps/mp/gametypes/_gameobjects::disableobject(); - if ( bombzonesleft == 0 ) - { - maps/mp/gametypes/_globallogic_utils::pausetimer(); - level.haspausedtimer = 1; - setgameendtime( 0 ); - wait 3; - dem_endgame( team, game[ "strings" ][ "target_destroyed" ] ); - } - else - { - enemyteam = getotherteam( team ); - thread maps/mp/gametypes/_globallogic_audio::set_music_on_team( "DEM_WE_SCORE", team, 0, 0, 5 ); - thread maps/mp/gametypes/_globallogic_audio::set_music_on_team( "DEM_THEY_SCORE", enemyteam, 0, 0, 5 ); - if ( [[ level.gettimelimit ]]() > 0 ) - { - level.usingextratime = 1; - } - removeinfluencer( destroyedobj.spawninfluencer ); - destroyedobj.spawninfluencer = undefined; - maps/mp/gametypes/_spawnlogic::clearspawnpoints(); - maps/mp/gametypes/_spawnlogic::addspawnpoints( game[ "attackers" ], "mp_dem_spawn_attacker" ); - maps/mp/gametypes/_spawnlogic::addspawnpoints( game[ "defenders" ], "mp_dem_spawn_defender" ); - if ( label == "_a" ) - { - maps/mp/gametypes/_spawnlogic::addspawnpoints( game[ "attackers" ], "mp_dem_spawn_attacker_a" ); - maps/mp/gametypes/_spawnlogic::addspawnpoints( game[ "defenders" ], "mp_dem_spawn_defender_b" ); - } - else - { - maps/mp/gametypes/_spawnlogic::addspawnpoints( game[ "attackers" ], "mp_dem_spawn_attacker_b" ); - maps/mp/gametypes/_spawnlogic::addspawnpoints( game[ "defenders" ], "mp_dem_spawn_defender_a" ); - } - maps/mp/gametypes/_spawning::updateallspawnpoints(); - } + level endon( "game_ended" ); + destroyedobj endon( "bomb_defused" ); + team = player.team; + game["challenge"][team]["plantedBomb"] = 1; + maps\mp\gametypes\_globallogic_utils::pausetimer(); + destroyedobj.bombplanted = 1; + destroyedobj.visuals[0] thread maps\mp\gametypes\_globallogic_utils::playtickingsound( "mpl_sab_ui_suitcasebomb_timer" ); + destroyedobj.tickingobject = destroyedobj.visuals[0]; + label = destroyedobj.label; + detonatetime = int( gettime() + level.bombtimer * 1000 ); + updatebombtimers( label, detonatetime ); + destroyedobj.detonatetime = detonatetime; + trace = bullettrace( player.origin + vectorscale( ( 0, 0, 1 ), 20.0 ), player.origin - vectorscale( ( 0, 0, 1 ), 2000.0 ), 0, player ); + tempangle = randomfloat( 360 ); + forward = ( cos( tempangle ), sin( tempangle ), 0 ); + forward = vectornormalize( forward - vectorscale( trace["normal"], vectordot( forward, trace["normal"] ) ) ); + dropangles = vectortoangles( forward ); + self dropbombmodel( player, destroyedobj.label ); + destroyedobj maps\mp\gametypes\_gameobjects::allowuse( "none" ); + destroyedobj maps\mp\gametypes\_gameobjects::setvisibleteam( "none" ); + + if ( isdefined( game["overtime_round"] ) ) + destroyedobj maps\mp\gametypes\_gameobjects::setownerteam( getotherteam( player.team ) ); + + destroyedobj setupfordefusing(); + player.isbombcarrier = 0; + game["challenge"][team]["plantedBomb"] = 1; + destroyedobj waitlongdurationwithbombtimeupdate( label, level.bombtimer ); + destroyedobj bombreset( label, "bomb_exploded" ); + + if ( level.gameended ) + return; + + bbprint( "mpobjective", "gametime %d objtype %s label %s team %s", gettime(), "dem_bombexplode", label, team ); + destroyedobj.bombexploded = 1; + game["challenge"][team]["destroyedBombSite"] = 1; + explosionorigin = destroyedobj.curorigin; + level.ddbombmodel[destroyedobj.label] delete(); + + if ( isdefined( player ) ) + { + destroyedobj.visuals[0] radiusdamage( explosionorigin, 512, 200, 20, player, "MOD_EXPLOSIVE", "briefcase_bomb_mp" ); + player addplayerstatwithgametype( "DESTRUCTIONS", 1 ); + level thread maps\mp\_popups::displayteammessagetoall( &"MP_EXPLOSIVES_BLOWUP_BY", player ); + maps\mp\_scoreevents::processscoreevent( "bomb_detonated", player ); + player recordgameevent( "destroy" ); + } + else + destroyedobj.visuals[0] radiusdamage( explosionorigin, 512, 200, 20, undefined, "MOD_EXPLOSIVE", "briefcase_bomb_mp" ); + + currenttime = gettime(); + + if ( isdefined( level.lastbombexplodetime ) && level.lastbombexplodebyteam == player.team ) + { + if ( level.lastbombexplodetime + 10000 > currenttime ) + { + for ( i = 0; i < level.players.size; i++ ) + { + if ( level.players[i].team == player.team ) + level.players[i] maps\mp\_challenges::bothbombsdetonatewithintime(); + } + } + } + + level.lastbombexplodetime = currenttime; + level.lastbombexplodebyteam = player.team; + rot = randomfloat( 360 ); + explosioneffect = spawnfx( level._effect["bombexplosion"], explosionorigin + vectorscale( ( 0, 0, 1 ), 50.0 ), ( 0, 0, 1 ), ( cos( rot ), sin( rot ), 0 ) ); + triggerfx( explosioneffect ); + thread playsoundinspace( "mpl_sd_exp_suitcase_bomb_main", explosionorigin ); + + if ( isdefined( destroyedobj.exploderindex ) ) + exploder( destroyedobj.exploderindex ); + + bombzonesleft = 0; + + for ( index = 0; index < level.bombzones.size; index++ ) + { + if ( !isdefined( level.bombzones[index].bombexploded ) || !level.bombzones[index].bombexploded ) + bombzonesleft++; + } + + destroyedobj maps\mp\gametypes\_gameobjects::disableobject(); + + if ( bombzonesleft == 0 ) + { + maps\mp\gametypes\_globallogic_utils::pausetimer(); + level.haspausedtimer = 1; + setgameendtime( 0 ); + wait 3; + dem_endgame( team, game["strings"]["target_destroyed"] ); + } + else + { + enemyteam = getotherteam( team ); + thread maps\mp\gametypes\_globallogic_audio::set_music_on_team( "DEM_WE_SCORE", team, 0, 0, 5 ); + thread maps\mp\gametypes\_globallogic_audio::set_music_on_team( "DEM_THEY_SCORE", enemyteam, 0, 0, 5 ); + + if ( [[ level.gettimelimit ]]() > 0 ) + level.usingextratime = 1; + + removeinfluencer( destroyedobj.spawninfluencer ); + destroyedobj.spawninfluencer = undefined; + maps\mp\gametypes\_spawnlogic::clearspawnpoints(); + maps\mp\gametypes\_spawnlogic::addspawnpoints( game["attackers"], "mp_dem_spawn_attacker" ); + maps\mp\gametypes\_spawnlogic::addspawnpoints( game["defenders"], "mp_dem_spawn_defender" ); + + if ( label == "_a" ) + { + maps\mp\gametypes\_spawnlogic::addspawnpoints( game["attackers"], "mp_dem_spawn_attacker_a" ); + maps\mp\gametypes\_spawnlogic::addspawnpoints( game["defenders"], "mp_dem_spawn_defender_b" ); + } + else + { + maps\mp\gametypes\_spawnlogic::addspawnpoints( game["attackers"], "mp_dem_spawn_attacker_b" ); + maps\mp\gametypes\_spawnlogic::addspawnpoints( game["defenders"], "mp_dem_spawn_defender_a" ); + } + + maps\mp\gametypes\_spawning::updateallspawnpoints(); + } } -gettimelimit() //checked matches cerberus output +gettimelimit() { - timelimit = maps/mp/gametypes/_globallogic_defaults::default_gettimelimit(); - if ( isDefined( game[ "overtime_round" ] ) ) - { - timelimit = level.overtimetimelimit; - } - if ( level.usingextratime ) - { - return timelimit + level.extratime; - } - return timelimit; + timelimit = maps\mp\gametypes\_globallogic_defaults::default_gettimelimit(); + + if ( isdefined( game["overtime_round"] ) ) + timelimit = level.overtimetimelimit; + + if ( level.usingextratime ) + return timelimit + level.extratime; + + return timelimit; } -shouldplayovertimeround() //checked matches cerberus output +shouldplayovertimeround() { - if ( isDefined( game[ "overtime_round" ] ) ) - { - return 0; - } - if ( game[ "teamScores" ][ "allies" ] == ( level.scorelimit - 1 ) && game[ "teamScores" ][ "axis" ] == ( level.scorelimit - 1 ) ) - { - return 1; - } - return 0; + if ( isdefined( game["overtime_round"] ) ) + return false; + + if ( game["teamScores"]["allies"] == level.scorelimit - 1 && game["teamScores"]["axis"] == level.scorelimit - 1 ) + return true; + + return false; } -waitlongdurationwithbombtimeupdate( whichbomb, duration ) //checked matches cerberus output +waitlongdurationwithbombtimeupdate( whichbomb, duration ) { - if ( duration == 0 ) - { - return; - } - /* + if ( duration == 0 ) + return; + /# - assert( duration > 0 ); + assert( duration > 0 ); #/ - */ - starttime = getTime(); - endtime = getTime() + ( duration * 1000 ); - while ( getTime() < endtime ) - { - maps/mp/gametypes/_hostmigration::waittillhostmigrationstarts( ( endtime - getTime() ) / 1000 ); - while ( isDefined( level.hostmigrationtimer ) ) - { - endtime += 250; - updatebombtimers( whichbomb, endtime ); - wait 0.25; - } - } - /* + starttime = gettime(); + endtime = gettime() + duration * 1000; + + while ( gettime() < endtime ) + { + maps\mp\gametypes\_hostmigration::waittillhostmigrationstarts( ( endtime - gettime() ) / 1000 ); + + while ( isdefined( level.hostmigrationtimer ) ) + { + endtime += 250; + updatebombtimers( whichbomb, endtime ); + wait 0.25; + } + } + /# - 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 ); #/ - } - */ - while ( isDefined( level.hostmigrationtimer ) ) - { - endtime += 250; - updatebombtimers( whichbomb, endtime ); - wait 0.25; - } - return getTime() - starttime; + + while ( isdefined( level.hostmigrationtimer ) ) + { + endtime += 250; + updatebombtimers( whichbomb, endtime ); + wait 0.25; + } + + return gettime() - starttime; } -updatebombtimers( whichbomb, detonatetime ) //checked matches cerberus output +updatebombtimers( whichbomb, detonatetime ) { - if ( whichbomb == "_a" ) - { - level.bombaplanted = 1; - setbombtimer( "A", int( detonatetime ) ); - } - else - { - level.bombbplanted = 1; - setbombtimer( "B", int( detonatetime ) ); - } - setmatchflag( "bomb_timer" + whichbomb, int( detonatetime ) ); + if ( whichbomb == "_a" ) + { + level.bombaplanted = 1; + setbombtimer( "A", int( detonatetime ) ); + } + else + { + level.bombbplanted = 1; + setbombtimer( "B", int( detonatetime ) ); + } + + setmatchflag( "bomb_timer" + whichbomb, int( detonatetime ) ); } -bombdefused() //checked matches cerberus output +bombdefused() { - self.tickingobject maps/mp/gametypes/_globallogic_utils::stoptickingsound(); - self maps/mp/gametypes/_gameobjects::allowuse( "none" ); - self maps/mp/gametypes/_gameobjects::setvisibleteam( "none" ); - self.bombdefused = 1; - self notify( "bomb_defused" ); - self.bombplanted = 0; - self bombreset( self.label, "bomb_defused" ); + self.tickingobject maps\mp\gametypes\_globallogic_utils::stoptickingsound(); + self maps\mp\gametypes\_gameobjects::allowuse( "none" ); + self maps\mp\gametypes\_gameobjects::setvisibleteam( "none" ); + self.bombdefused = 1; + self notify( "bomb_defused" ); + self.bombplanted = 0; + self bombreset( self.label, "bomb_defused" ); } -play_one_left_underscore( team, enemyteam ) //checked matches cerberus output +play_one_left_underscore( team, enemyteam ) { - wait 3; - if ( !isDefined( team ) || !isDefined( enemyteam ) ) - { - return; - } - thread maps/mp/gametypes/_globallogic_audio::set_music_on_team( "DEM_ONE_LEFT_UNDERSCORE", team, 0, 0 ); - thread maps/mp/gametypes/_globallogic_audio::set_music_on_team( "DEM_ONE_LEFT_UNDERSCORE", enemyteam, 0, 0 ); + wait 3; + + if ( !isdefined( team ) || !isdefined( enemyteam ) ) + return; + + thread maps\mp\gametypes\_globallogic_audio::set_music_on_team( "DEM_ONE_LEFT_UNDERSCORE", team, 0, 0 ); + thread maps\mp\gametypes\_globallogic_audio::set_music_on_team( "DEM_ONE_LEFT_UNDERSCORE", enemyteam, 0, 0 ); } -updateeventsperminute() //checked matches cerberus output +updateeventsperminute() { - if ( !isDefined( self.eventsperminute ) ) - { - self.numbombevents = 0; - self.eventsperminute = 0; - } - self.numbombevents++; - minutespassed = maps/mp/gametypes/_globallogic_utils::gettimepassed() / 60000; - if ( isplayer( self ) && isDefined( self.timeplayed[ "total" ] ) ) - { - minutespassed = self.timeplayed[ "total" ] / 60; - } - self.eventsperminute = self.numbombevents / minutespassed; - if ( self.eventsperminute > self.numbombevents ) - { - self.eventsperminute = self.numbombevents; - } + if ( !isdefined( self.eventsperminute ) ) + { + self.numbombevents = 0; + self.eventsperminute = 0; + } + + self.numbombevents++; + minutespassed = maps\mp\gametypes\_globallogic_utils::gettimepassed() / 60000; + + if ( isplayer( self ) && isdefined( self.timeplayed["total"] ) ) + minutespassed = self.timeplayed["total"] / 60; + + self.eventsperminute = self.numbombevents / minutespassed; + + if ( self.eventsperminute > self.numbombevents ) + self.eventsperminute = self.numbombevents; } -isscoreboosting( player, flag ) //checked matches cerberus output +isscoreboosting( player, flag ) { - if ( !level.rankedmatch ) - { - return 0; - } - if ( player.eventsperminute > level.playereventslpm ) - { - return 1; - } - if ( flag.eventsperminute > level.bombeventslpm ) - { - return 1; - } - return 0; + if ( !level.rankedmatch ) + return false; + + if ( player.eventsperminute > level.playereventslpm ) + return true; + + if ( flag.eventsperminute > level.bombeventslpm ) + return true; + + return false; } - - diff --git a/Multiplayer Core/patch_mp/maps/mp/gametypes/dm.gsc b/Multiplayer Core/patch_mp/maps/mp/gametypes/dm.gsc index 0af9e70..2a75db1 100644 --- a/Multiplayer Core/patch_mp/maps/mp/gametypes/dm.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/gametypes/dm.gsc @@ -1,136 +1,124 @@ -#include maps/mp/gametypes/_callbacksetup; -#include maps/mp/gametypes/_gameobjects; -#include maps/mp/gametypes/_globallogic; -#include maps/mp/gametypes/_globallogic_score; -#include maps/mp/gametypes/_globallogic_audio; -#include maps/mp/gametypes/_spawnlogic; -#include maps/mp/gametypes/_spawning; -#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() { - maps/mp/gametypes/_globallogic::init(); - maps/mp/gametypes/_callbacksetup::setupcallbacks(); - maps/mp/gametypes/_globallogic::setupcallbacks(); - maps/mp/_utility::registertimelimit( 0, 1440 ); - maps/mp/_utility::registerscorelimit( 0, 50000 ); - maps/mp/_utility::registerroundlimit( 0, 10 ); - maps/mp/_utility::registerroundwinlimit( 0, 10 ); - maps/mp/_utility::registernumlives( 0, 100 ); - maps/mp/gametypes/_globallogic::registerfriendlyfiredelay( level.gametype, 0, 0, 1440 ); - level.scoreroundbased = getgametypesetting( "roundscorecarry" ) == 0; - level.teamscoreperkill = getgametypesetting( "teamScorePerKill" ); - level.teamscoreperdeath = getgametypesetting( "teamScorePerDeath" ); - level.teamscoreperheadshot = getgametypesetting( "teamScorePerHeadshot" ); - level.onstartgametype = ::onstartgametype; - level.onspawnplayer = ::onspawnplayer; - level.onspawnplayerunified = ::onspawnplayerunified; - level.onplayerkilled = ::onplayerkilled; - game[ "dialog" ][ "gametype" ] = "ffa_start"; - game[ "dialog" ][ "gametype_hardcore" ] = "hcffa_start"; - game[ "dialog" ][ "offense_obj" ] = "generic_boost"; - game[ "dialog" ][ "defense_obj" ] = "generic_boost"; - setscoreboardcolumns( "pointstowin", "kills", "deaths", "headshots", "score" ); + maps\mp\gametypes\_globallogic::init(); + maps\mp\gametypes\_callbacksetup::setupcallbacks(); + maps\mp\gametypes\_globallogic::setupcallbacks(); + registertimelimit( 0, 1440 ); + registerscorelimit( 0, 50000 ); + registerroundlimit( 0, 10 ); + registerroundwinlimit( 0, 10 ); + registernumlives( 0, 100 ); + maps\mp\gametypes\_globallogic::registerfriendlyfiredelay( level.gametype, 0, 0, 1440 ); + level.scoreroundbased = getgametypesetting( "roundscorecarry" ) == 0; + level.teamscoreperkill = getgametypesetting( "teamScorePerKill" ); + level.teamscoreperdeath = getgametypesetting( "teamScorePerDeath" ); + level.teamscoreperheadshot = getgametypesetting( "teamScorePerHeadshot" ); + level.onstartgametype = ::onstartgametype; + level.onspawnplayer = ::onspawnplayer; + level.onspawnplayerunified = ::onspawnplayerunified; + level.onplayerkilled = ::onplayerkilled; + game["dialog"]["gametype"] = "ffa_start"; + game["dialog"]["gametype_hardcore"] = "hcffa_start"; + game["dialog"]["offense_obj"] = "generic_boost"; + game["dialog"]["defense_obj"] = "generic_boost"; + setscoreboardcolumns( "pointstowin", "kills", "deaths", "headshots", "score" ); } -onstartgametype() //checked matches cerberus output +onstartgametype() { - setclientnamemode( "auto_change" ); - setobjectivetext( "allies", &"OBJECTIVES_DM" ); - setobjectivetext( "axis", &"OBJECTIVES_DM" ); - if ( level.splitscreen ) - { - setobjectivescoretext( "allies", &"OBJECTIVES_DM" ); - setobjectivescoretext( "axis", &"OBJECTIVES_DM" ); - } - else - { - setobjectivescoretext( "allies", &"OBJECTIVES_DM_SCORE" ); - setobjectivescoretext( "axis", &"OBJECTIVES_DM_SCORE" ); - } - setobjectivehinttext( "allies", &"OBJECTIVES_DM_HINT" ); - setobjectivehinttext( "axis", &"OBJECTIVES_DM_HINT" ); - allowed = []; - allowed[ 0 ] = "dm"; - maps/mp/gametypes/_gameobjects::main( allowed ); - maps/mp/gametypes/_spawning::create_map_placed_influencers(); - level.spawnmins = ( 0, 0, 0 ); - level.spawnmaxs = ( 0, 0, 0 ); - maps/mp/gametypes/_spawnlogic::addspawnpoints( "allies", "mp_dm_spawn" ); - maps/mp/gametypes/_spawnlogic::addspawnpoints( "axis", "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.displayroundendtext = 0; - level thread onscoreclosemusic(); - if ( !isoneround() ) - { - level.displayroundendtext = 1; - } + setclientnamemode( "auto_change" ); + setobjectivetext( "allies", &"OBJECTIVES_DM" ); + setobjectivetext( "axis", &"OBJECTIVES_DM" ); + + if ( level.splitscreen ) + { + setobjectivescoretext( "allies", &"OBJECTIVES_DM" ); + setobjectivescoretext( "axis", &"OBJECTIVES_DM" ); + } + else + { + setobjectivescoretext( "allies", &"OBJECTIVES_DM_SCORE" ); + setobjectivescoretext( "axis", &"OBJECTIVES_DM_SCORE" ); + } + + setobjectivehinttext( "allies", &"OBJECTIVES_DM_HINT" ); + setobjectivehinttext( "axis", &"OBJECTIVES_DM_HINT" ); + allowed[0] = "dm"; + maps\mp\gametypes\_gameobjects::main( allowed ); + maps\mp\gametypes\_spawning::create_map_placed_influencers(); + level.spawnmins = ( 0, 0, 0 ); + level.spawnmaxs = ( 0, 0, 0 ); + maps\mp\gametypes\_spawnlogic::addspawnpoints( "allies", "mp_dm_spawn" ); + maps\mp\gametypes\_spawnlogic::addspawnpoints( "axis", "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.displayroundendtext = 0; + level thread onscoreclosemusic(); + + if ( !isoneround() ) + level.displayroundendtext = 1; } -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" ); } -onendgame( winningplayer ) //checked matches cerberus output +onendgame( winningplayer ) { - if ( isDefined( winningplayer ) && isplayer( winningplayer ) ) - { - [[ level._setplayerscore ]]( winningplayer, winningplayer [[ level._getplayerscore ]]() + 1 ); - } + if ( isdefined( winningplayer ) && isplayer( winningplayer ) ) + [[ level._setplayerscore ]]( winningplayer, winningplayer [[ level._getplayerscore ]]() + 1 ); } -onscoreclosemusic() //checked changed to match cerberus output +onscoreclosemusic() { - while ( !level.gameended ) - { - scorelimit = level.scorelimit; - scorethreshold = scorelimit * 0.9; - for ( i = 0; i < level.players.size; i++ ) - { - scorecheck = [[ level._getplayerscore ]]( level.players[ i ] ); - if ( scorecheck >= scorethreshold ) - { - thread maps/mp/gametypes/_globallogic_audio::set_music_on_team( "TIME_OUT", "both" ); - thread maps/mp/gametypes/_globallogic_audio::actionmusicset(); - return; - } - } - wait 0.5; - } + while ( !level.gameended ) + { + scorelimit = level.scorelimit; + scorethreshold = scorelimit * 0.9; + + for ( i = 0; i < level.players.size; i++ ) + { + scorecheck = [[ level._getplayerscore ]]( level.players[i] ); + + if ( scorecheck >= scorethreshold ) + { + thread maps\mp\gametypes\_globallogic_audio::set_music_on_team( "TIME_OUT", "both" ); + thread maps\mp\gametypes\_globallogic_audio::actionmusicset(); + return; + } + } + + wait 0.5; + } } -onplayerkilled( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ) //checked matches cerberus output +onplayerkilled( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ) { - if ( !isplayer( attacker ) || self == attacker ) - { - return; - } - attacker maps/mp/gametypes/_globallogic_score::givepointstowin( level.teamscoreperkill ); - self maps/mp/gametypes/_globallogic_score::givepointstowin( level.teamscoreperdeath * -1 ); - if ( smeansofdeath == "MOD_HEAD_SHOT" ) - { - attacker maps/mp/gametypes/_globallogic_score::givepointstowin( level.teamscoreperheadshot ); - } -} + if ( !isplayer( attacker ) || self == attacker ) + return; + attacker maps\mp\gametypes\_globallogic_score::givepointstowin( level.teamscoreperkill ); + self maps\mp\gametypes\_globallogic_score::givepointstowin( level.teamscoreperdeath * -1 ); + + if ( smeansofdeath == "MOD_HEAD_SHOT" ) + attacker maps\mp\gametypes\_globallogic_score::givepointstowin( level.teamscoreperheadshot ); +} diff --git a/Multiplayer Core/patch_mp/maps/mp/gametypes/dom.gsc b/Multiplayer Core/patch_mp/maps/mp/gametypes/dom.gsc index d19c187..a4e6d7c 100644 --- a/Multiplayer Core/patch_mp/maps/mp/gametypes/dom.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/gametypes/dom.gsc @@ -1,1463 +1,1416 @@ -#include maps/mp/gametypes/_hostmigration; -#include maps/mp/_popups; -#include maps/mp/_demo; -#include maps/mp/_scoreevents; -#include maps/mp/gametypes/_globallogic_utils; -#include maps/mp/teams/_teams; -#include maps/mp/_challenges; -#include maps/mp/gametypes/_globallogic_score; -#include maps/mp/gametypes/_spawnlogic; -#include maps/mp/gametypes/_spawning; -#include maps/mp/gametypes/_gameobjects; -#include maps/mp/gametypes/_globallogic_audio; -#include maps/mp/gametypes/_callbacksetup; -#include maps/mp/gametypes/_globallogic; -#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 -main() //checked matches cerberus output +main() { - if ( getDvar( "mapname" ) == "mp_background" ) - { - return; - } - maps/mp/gametypes/_globallogic::init(); - maps/mp/gametypes/_callbacksetup::setupcallbacks(); - maps/mp/gametypes/_globallogic::setupcallbacks(); - registertimelimit( 0, 1440 ); - registerscorelimit( 0, 1000 ); - registerroundlimit( 0, 10 ); - registerroundwinlimit( 0, 10 ); - registerroundswitch( 0, 9 ); - registernumlives( 0, 100 ); - maps/mp/gametypes/_globallogic::registerfriendlyfiredelay( level.gametype, 15, 0, 1440 ); - level.scoreroundbased = getgametypesetting( "roundscorecarry" ) == 0; - level.teambased = 1; - level.overrideteamscore = 1; - level.onstartgametype = ::onstartgametype; - level.onspawnplayer = ::onspawnplayer; - level.onspawnplayerunified = ::onspawnplayerunified; - level.onplayerkilled = ::onplayerkilled; - level.onroundswitch = ::onroundswitch; - level.onprecachegametype = ::onprecachegametype; - level.onendgame = ::onendgame; - level.gamemodespawndvars = ::dom_gamemodespawndvars; - level.onroundendgame = ::onroundendgame; - game[ "dialog" ][ "gametype" ] = "dom_start"; - game[ "dialog" ][ "gametype_hardcore" ] = "hcdom_start"; - game[ "dialog" ][ "offense_obj" ] = "cap_start"; - game[ "dialog" ][ "defense_obj" ] = "cap_start"; - level.lastdialogtime = 0; - if ( !sessionmodeissystemlink() && !sessionmodeisonlinegame() && issplitscreen() ) - { - setscoreboardcolumns( "score", "kills", "captures", "defends", "deaths" ); - } - else - { - setscoreboardcolumns( "score", "kills", "deaths", "captures", "defends" ); - } - maps/mp/gametypes/_globallogic_audio::registerdialoggroup( "gamemode_objective", 0 ); - maps/mp/gametypes/_globallogic_audio::registerdialoggroup( "gamemode_objective_a", 0 ); - maps/mp/gametypes/_globallogic_audio::registerdialoggroup( "gamemode_objective_b", 0 ); - maps/mp/gametypes/_globallogic_audio::registerdialoggroup( "gamemode_objective_c", 0 ); - maps/mp/gametypes/_globallogic_audio::registerdialoggroup( "gamemode_changing_a", 0 ); - maps/mp/gametypes/_globallogic_audio::registerdialoggroup( "gamemode_changing_b", 0 ); - maps/mp/gametypes/_globallogic_audio::registerdialoggroup( "gamemode_changing_c", 0 ); + if ( getdvar( "mapname" ) == "mp_background" ) + return; + + maps\mp\gametypes\_globallogic::init(); + maps\mp\gametypes\_callbacksetup::setupcallbacks(); + maps\mp\gametypes\_globallogic::setupcallbacks(); + registertimelimit( 0, 1440 ); + registerscorelimit( 0, 1000 ); + registerroundlimit( 0, 10 ); + registerroundwinlimit( 0, 10 ); + registerroundswitch( 0, 9 ); + registernumlives( 0, 100 ); + maps\mp\gametypes\_globallogic::registerfriendlyfiredelay( level.gametype, 15, 0, 1440 ); + level.scoreroundbased = getgametypesetting( "roundscorecarry" ) == 0; + level.teambased = 1; + level.overrideteamscore = 1; + level.onstartgametype = ::onstartgametype; + level.onspawnplayer = ::onspawnplayer; + level.onspawnplayerunified = ::onspawnplayerunified; + level.onplayerkilled = ::onplayerkilled; + level.onroundswitch = ::onroundswitch; + level.onprecachegametype = ::onprecachegametype; + level.onendgame = ::onendgame; + level.gamemodespawndvars = ::dom_gamemodespawndvars; + level.onroundendgame = ::onroundendgame; + game["dialog"]["gametype"] = "dom_start"; + game["dialog"]["gametype_hardcore"] = "hcdom_start"; + game["dialog"]["offense_obj"] = "cap_start"; + game["dialog"]["defense_obj"] = "cap_start"; + level.lastdialogtime = 0; + + if ( !sessionmodeissystemlink() && !sessionmodeisonlinegame() && issplitscreen() ) + setscoreboardcolumns( "score", "kills", "captures", "defends", "deaths" ); + else + setscoreboardcolumns( "score", "kills", "deaths", "captures", "defends" ); + + maps\mp\gametypes\_globallogic_audio::registerdialoggroup( "gamemode_objective", 0 ); + maps\mp\gametypes\_globallogic_audio::registerdialoggroup( "gamemode_objective_a", 0 ); + maps\mp\gametypes\_globallogic_audio::registerdialoggroup( "gamemode_objective_b", 0 ); + maps\mp\gametypes\_globallogic_audio::registerdialoggroup( "gamemode_objective_c", 0 ); + maps\mp\gametypes\_globallogic_audio::registerdialoggroup( "gamemode_changing_a", 0 ); + maps\mp\gametypes\_globallogic_audio::registerdialoggroup( "gamemode_changing_b", 0 ); + maps\mp\gametypes\_globallogic_audio::registerdialoggroup( "gamemode_changing_c", 0 ); } -onprecachegametype() //checked matches cerberus output +onprecachegametype() { + } -onstartgametype() //checked changed to match cerberus output +onstartgametype() { - setobjectivetext( "allies", &"OBJECTIVES_DOM" ); - setobjectivetext( "axis", &"OBJECTIVES_DOM" ); - if ( !isDefined( game[ "switchedsides" ] ) ) - { - game[ "switchedsides" ] = 0; - } - if ( game[ "switchedsides" ] ) - { - oldattackers = game[ "attackers" ]; - olddefenders = game[ "defenders" ]; - game[ "attackers" ] = olddefenders; - game[ "defenders" ] = oldattackers; - } - if ( level.splitscreen ) - { - setobjectivescoretext( "allies", &"OBJECTIVES_DOM" ); - setobjectivescoretext( "axis", &"OBJECTIVES_DOM" ); - } - else - { - setobjectivescoretext( "allies", &"OBJECTIVES_DOM_SCORE" ); - setobjectivescoretext( "axis", &"OBJECTIVES_DOM_SCORE" ); - } - setobjectivehinttext( "allies", &"OBJECTIVES_DOM_HINT" ); - setobjectivehinttext( "axis", &"OBJECTIVES_DOM_HINT" ); - level.flagbasefxid = []; - level.flagbasefxid[ "allies" ] = loadfx( "misc/fx_ui_flagbase_" + game[ "allies" ] ); - level.flagbasefxid[ "axis" ] = loadfx( "misc/fx_ui_flagbase_" + game[ "axis" ] ); - setclientnamemode( "auto_change" ); - allowed = []; - allowed[ 0 ] = "dom"; - maps/mp/gametypes/_gameobjects::main( allowed ); - maps/mp/gametypes/_spawning::create_map_placed_influencers(); - level.spawnmins = ( 1, 1, 1 ); - level.spawnmaxs = ( 1, 1, 1 ); - maps/mp/gametypes/_spawnlogic::placespawnpoints( "mp_dom_spawn_allies_start" ); - maps/mp/gametypes/_spawnlogic::placespawnpoints( "mp_dom_spawn_axis_start" ); - 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.spawn_all = maps/mp/gametypes/_spawnlogic::getspawnpointarray( "mp_dom_spawn" ); - level.spawn_start = []; - foreach ( team in level.teams ) - { - level.spawn_start[ team ] = maps/mp/gametypes/_spawnlogic::getspawnpointarray( "mp_dom_spawn_" + team + "_start" ); - } - flagspawns = maps/mp/gametypes/_spawnlogic::getspawnpointarray( "mp_dom_spawn_flag_a" ); - level.startpos[ "allies" ] = level.spawn_start[ "allies" ][ 0 ].origin; - level.startpos[ "axis" ] = level.spawn_start[ "axis" ][ 0 ].origin; - if ( !isoneround() && isscoreroundbased() ) - { - maps/mp/gametypes/_globallogic_score::resetteamscores(); - } - level.spawnsystem.unifiedsideswitching = 0; - level thread watchforbflagcap(); - updategametypedvars(); - thread domflags(); - thread updatedomscores(); - level change_dom_spawns(); + setobjectivetext( "allies", &"OBJECTIVES_DOM" ); + setobjectivetext( "axis", &"OBJECTIVES_DOM" ); + + if ( !isdefined( game["switchedsides"] ) ) + game["switchedsides"] = 0; + + if ( game["switchedsides"] ) + { + oldattackers = game["attackers"]; + olddefenders = game["defenders"]; + game["attackers"] = olddefenders; + game["defenders"] = oldattackers; + } + + if ( level.splitscreen ) + { + setobjectivescoretext( "allies", &"OBJECTIVES_DOM" ); + setobjectivescoretext( "axis", &"OBJECTIVES_DOM" ); + } + else + { + setobjectivescoretext( "allies", &"OBJECTIVES_DOM_SCORE" ); + setobjectivescoretext( "axis", &"OBJECTIVES_DOM_SCORE" ); + } + + setobjectivehinttext( "allies", &"OBJECTIVES_DOM_HINT" ); + setobjectivehinttext( "axis", &"OBJECTIVES_DOM_HINT" ); + level.flagbasefxid = []; + level.flagbasefxid["allies"] = loadfx( "misc/fx_ui_flagbase_" + game["allies"] ); + level.flagbasefxid["axis"] = loadfx( "misc/fx_ui_flagbase_" + game["axis"] ); + setclientnamemode( "auto_change" ); + allowed[0] = "dom"; + maps\mp\gametypes\_gameobjects::main( allowed ); + maps\mp\gametypes\_spawning::create_map_placed_influencers(); + level.spawnmins = ( 0, 0, 0 ); + level.spawnmaxs = ( 0, 0, 0 ); + maps\mp\gametypes\_spawnlogic::placespawnpoints( "mp_dom_spawn_allies_start" ); + maps\mp\gametypes\_spawnlogic::placespawnpoints( "mp_dom_spawn_axis_start" ); + 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.spawn_all = maps\mp\gametypes\_spawnlogic::getspawnpointarray( "mp_dom_spawn" ); + level.spawn_start = []; + + foreach ( team in level.teams ) + level.spawn_start[team] = maps\mp\gametypes\_spawnlogic::getspawnpointarray( "mp_dom_spawn_" + team + "_start" ); + + flagspawns = maps\mp\gametypes\_spawnlogic::getspawnpointarray( "mp_dom_spawn_flag_a" ); + level.startpos["allies"] = level.spawn_start["allies"][0].origin; + level.startpos["axis"] = level.spawn_start["axis"][0].origin; + + if ( !isoneround() && isscoreroundbased() ) + maps\mp\gametypes\_globallogic_score::resetteamscores(); + + level.spawnsystem.unifiedsideswitching = 0; + level thread watchforbflagcap(); + updategametypedvars(); + thread domflags(); + thread updatedomscores(); + level change_dom_spawns(); } -onspawnplayerunified() //checked matches cerberus output +onspawnplayerunified() { - maps/mp/gametypes/_spawning::onspawnplayer_unified(); + maps\mp\gametypes\_spawning::onspawnplayer_unified(); } -onspawnplayer( predictedspawn ) //checked partially changed to match cerberus output did change while loop to for loop see github for more info +onspawnplayer( predictedspawn ) { - spawnpoint = undefined; - spawnteam = self.pers[ "team" ]; - if ( game[ "switchedsides" ] ) - { - spawnteam = getotherteam( spawnteam ); - } - if ( !level.usestartspawns ) - { - flagsowned = 0; - enemyflagsowned = 0; - enemyteam = getotherteam( self.pers[ "team" ] ); - for ( i = 0; i < level.flags.size; i++ ) - { - team = level.flags[ i ] getflagteam(); - if ( team == self.pers[ "team" ] ) - { - flagsowned++; - } - else if ( team == enemyteam ) - { - enemyflagsowned++; - } - } - enemyteam = getotherteam( spawnteam ); - if ( flagsowned == level.flags.size ) - { - enemybestspawnflag = level.bestspawnflag[ enemyteam ]; - spawnpoint = maps/mp/gametypes/_spawnlogic::getspawnpoint_nearteam( level.spawn_all, getspawnsboundingflag( enemybestspawnflag ) ); - } - else if ( flagsowned > 0 ) - { - spawnpoint = maps/mp/gametypes/_spawnlogic::getspawnpoint_nearteam( level.spawn_all, getboundaryflagspawns( spawnteam ) ); - } - else - { - bestflag = undefined; - if ( ( enemyflagsowned > 0 ) && ( enemyflagsowned < level.flags.size ) ) - { - bestflag = getunownedflagneareststart( spawnteam ); - } - if ( !isDefined( bestflag ) ) - { - bestflag = level.bestspawnflag[ spawnteam ]; - } - level.bestspawnflag[ spawnteam ] = bestflag; - spawnpoint = maps/mp/gametypes/_spawnlogic::getspawnpoint_nearteam( level.spawn_all, bestflag.nearbyspawns ); - } - } - if ( !isDefined( spawnpoint ) ) - { - spawnpoint = maps/mp/gametypes/_spawnlogic::getspawnpoint_random( level.spawn_start[ spawnteam ] ); - } - /* + spawnpoint = undefined; + spawnteam = self.pers["team"]; + + if ( game["switchedsides"] ) + spawnteam = getotherteam( spawnteam ); + + if ( !level.usestartspawns ) + { + flagsowned = 0; + enemyflagsowned = 0; + enemyteam = getotherteam( self.pers["team"] ); + + for ( i = 0; i < level.flags.size; i++ ) + { + team = level.flags[i] getflagteam(); + + if ( team == self.pers["team"] ) + { + flagsowned++; + continue; + } + + if ( team == enemyteam ) + enemyflagsowned++; + } + + enemyteam = getotherteam( spawnteam ); + + if ( flagsowned == level.flags.size ) + { + enemybestspawnflag = level.bestspawnflag[enemyteam]; + spawnpoint = maps\mp\gametypes\_spawnlogic::getspawnpoint_nearteam( level.spawn_all, getspawnsboundingflag( enemybestspawnflag ) ); + } + else if ( flagsowned > 0 ) + spawnpoint = maps\mp\gametypes\_spawnlogic::getspawnpoint_nearteam( level.spawn_all, getboundaryflagspawns( spawnteam ) ); + else + { + bestflag = undefined; + + if ( enemyflagsowned > 0 && enemyflagsowned < level.flags.size ) + bestflag = getunownedflagneareststart( spawnteam ); + + if ( !isdefined( bestflag ) ) + bestflag = level.bestspawnflag[spawnteam]; + + level.bestspawnflag[spawnteam] = bestflag; + spawnpoint = maps\mp\gametypes\_spawnlogic::getspawnpoint_nearteam( level.spawn_all, bestflag.nearbyspawns ); + } + } + + if ( !isdefined( spawnpoint ) ) + spawnpoint = maps\mp\gametypes\_spawnlogic::getspawnpoint_random( level.spawn_start[spawnteam] ); + /# - assert( isDefined( spawnpoint ) ); + assert( isdefined( spawnpoint ) ); #/ - */ - if ( predictedspawn ) - { - self predictspawnpoint( spawnpoint.origin, spawnpoint.angles ); - } - else - { - self spawn( spawnpoint.origin, spawnpoint.angles, "dom" ); - } + + if ( predictedspawn ) + self predictspawnpoint( spawnpoint.origin, spawnpoint.angles ); + else + self spawn( spawnpoint.origin, spawnpoint.angles, "dom" ); } -onendgame( winningteam ) //checked changed to match cerberus output +onendgame( winningteam ) { - for ( i = 0; i < level.domflags.size; i++ ) - { - domflag = level.domflags[ i ]; - domflag maps/mp/gametypes/_gameobjects::allowuse( "none" ); - if ( isDefined( domflag.singleowner ) && domflag.singleowner == 1 ) - { - team = domflag maps/mp/gametypes/_gameobjects::getownerteam(); - label = domflag maps/mp/gametypes/_gameobjects::getlabel(); - maps/mp/_challenges::holdflagentirematch( team, label ); - } - } + for ( i = 0; i < level.domflags.size; i++ ) + { + domflag = level.domflags[i]; + domflag maps\mp\gametypes\_gameobjects::allowuse( "none" ); + + if ( isdefined( domflag.singleowner ) && domflag.singleowner == 1 ) + { + team = domflag maps\mp\gametypes\_gameobjects::getownerteam(); + label = domflag maps\mp\gametypes\_gameobjects::getlabel(); + maps\mp\_challenges::holdflagentirematch( team, label ); + } + } } -onroundendgame( roundwinner ) //checked changed to match cerberus output +onroundendgame( roundwinner ) { - if ( level.roundscorecarry == 0 ) - { - foreach ( team in level.teams ) - { - [[ level._setteamscore ]]( team, game[ "roundswon" ][ team ] ); - } - winner = maps/mp/gametypes/_globallogic::determineteamwinnerbygamestat( "roundswon" ); - } - else - { - winner = maps/mp/gametypes/_globallogic::determineteamwinnerbyteamscore(); - } - return winner; + if ( level.roundscorecarry == 0 ) + { + foreach ( team in level.teams ) + [[ level._setteamscore ]]( team, game["roundswon"][team] ); + + winner = maps\mp\gametypes\_globallogic::determineteamwinnerbygamestat( "roundswon" ); + } + else + winner = maps\mp\gametypes\_globallogic::determineteamwinnerbyteamscore(); + + return winner; } -updategametypedvars() //checked matches cerberus output +updategametypedvars() { - level.flagcapturetime = getgametypesetting( "captureTime" ); - level.playercapturelpm = getgametypesetting( "maxPlayerEventsPerMinute" ); - level.flagcapturelpm = getgametypesetting( "maxObjectiveEventsPerMinute" ); - level.playeroffensivemax = getgametypesetting( "maxPlayerOffensive" ); - level.playerdefensivemax = getgametypesetting( "maxPlayerDefensive" ); + level.flagcapturetime = getgametypesetting( "captureTime" ); + level.playercapturelpm = getgametypesetting( "maxPlayerEventsPerMinute" ); + level.flagcapturelpm = getgametypesetting( "maxObjectiveEventsPerMinute" ); + level.playeroffensivemax = getgametypesetting( "maxPlayerOffensive" ); + level.playerdefensivemax = getgametypesetting( "maxPlayerDefensive" ); } -domflags() //checked changed to match cerberus output +domflags() { - level.laststatus[ "allies" ] = 0; - level.laststatus[ "axis" ] = 0; - level.flagmodel[ "allies" ] = maps/mp/teams/_teams::getteamflagmodel( "allies" ); - level.flagmodel[ "axis" ] = maps/mp/teams/_teams::getteamflagmodel( "axis" ); - level.flagmodel[ "neutral" ] = maps/mp/teams/_teams::getteamflagmodel( "neutral" ); - precachemodel( level.flagmodel[ "allies" ] ); - precachemodel( level.flagmodel[ "axis" ] ); - precachemodel( level.flagmodel[ "neutral" ] ); - precachestring( &"MP_CAPTURING_FLAG" ); - precachestring( &"MP_LOSING_FLAG" ); - precachestring( &"MP_DOM_YOUR_FLAG_WAS_CAPTURED" ); - precachestring( &"MP_DOM_ENEMY_FLAG_CAPTURED" ); - precachestring( &"MP_DOM_NEUTRAL_FLAG_CAPTURED" ); - precachestring( &"MP_ENEMY_FLAG_CAPTURED_BY" ); - precachestring( &"MP_NEUTRAL_FLAG_CAPTURED_BY" ); - precachestring( &"MP_FRIENDLY_FLAG_CAPTURED_BY" ); - precachestring( &"MP_DOM_FLAG_A_CAPTURED_BY" ); - precachestring( &"MP_DOM_FLAG_B_CAPTURED_BY" ); - precachestring( &"MP_DOM_FLAG_C_CAPTURED_BY" ); - precachestring( &"MP_DOM_FLAG_D_CAPTURED_BY" ); - precachestring( &"MP_DOM_FLAG_E_CAPTURED_BY" ); - primaryflags = getentarray( "flag_primary", "targetname" ); - secondaryflags = getentarray( "flag_secondary", "targetname" ); - if ( ( primaryflags.size + secondaryflags.size ) < 2 ) - { - /* + level.laststatus["allies"] = 0; + level.laststatus["axis"] = 0; + level.flagmodel["allies"] = maps\mp\teams\_teams::getteamflagmodel( "allies" ); + level.flagmodel["axis"] = maps\mp\teams\_teams::getteamflagmodel( "axis" ); + level.flagmodel["neutral"] = maps\mp\teams\_teams::getteamflagmodel( "neutral" ); + precachemodel( level.flagmodel["allies"] ); + precachemodel( level.flagmodel["axis"] ); + precachemodel( level.flagmodel["neutral"] ); + precachestring( &"MP_CAPTURING_FLAG" ); + precachestring( &"MP_LOSING_FLAG" ); + precachestring( &"MP_DOM_YOUR_FLAG_WAS_CAPTURED" ); + precachestring( &"MP_DOM_ENEMY_FLAG_CAPTURED" ); + precachestring( &"MP_DOM_NEUTRAL_FLAG_CAPTURED" ); + precachestring( &"MP_ENEMY_FLAG_CAPTURED_BY" ); + precachestring( &"MP_NEUTRAL_FLAG_CAPTURED_BY" ); + precachestring( &"MP_FRIENDLY_FLAG_CAPTURED_BY" ); + precachestring( &"MP_DOM_FLAG_A_CAPTURED_BY" ); + precachestring( &"MP_DOM_FLAG_B_CAPTURED_BY" ); + precachestring( &"MP_DOM_FLAG_C_CAPTURED_BY" ); + precachestring( &"MP_DOM_FLAG_D_CAPTURED_BY" ); + precachestring( &"MP_DOM_FLAG_E_CAPTURED_BY" ); + primaryflags = getentarray( "flag_primary", "targetname" ); + secondaryflags = getentarray( "flag_secondary", "targetname" ); + + if ( primaryflags.size + secondaryflags.size < 2 ) + { /# - println( "^1Not enough domination flags found in level!" ); + println( "^1Not enough domination flags found in level!" ); #/ - */ - maps/mp/gametypes/_callbacksetup::abortlevel(); - return; - } - level.flags = []; - visuals = []; - for ( index = 0; index < primaryflags.size; index++ ) - { - level.flags[ level.flags.size ] = primaryflags[ index ]; - } - for ( index = 0; index < secondaryflags.size; index++ ) - { - level.flags[ level.flags.size ] = secondaryflags[ index ]; - } - level.domflags = []; - for ( index = 0; index < level.flags.size; index++ ) - { - trigger = level.flags[ index ]; - if ( isDefined( trigger.target ) ) - { - visuals[ 0 ] = getent( trigger.target, "targetname" ); - } - else - { - visuals[ 0 ] = spawn( "script_model", trigger.origin ); - visuals[ 0 ].angles = trigger.angles; - } - visuals[ 0 ] setmodel( level.flagmodel[ "neutral" ] ); - name = istring( trigger.script_label ); - precachestring( name ); - domflag = maps/mp/gametypes/_gameobjects::createuseobject( "neutral", trigger, visuals, ( 0, 0, 0 ), name ); - domflag maps/mp/gametypes/_gameobjects::allowuse( "enemy" ); - domflag maps/mp/gametypes/_gameobjects::setusetime( level.flagcapturetime ); - domflag maps/mp/gametypes/_gameobjects::setusetext( &"MP_CAPTURING_FLAG" ); - label = domflag maps/mp/gametypes/_gameobjects::getlabel(); - domflag.label = label; - domflag.flagindex = trigger.script_index; - domflag maps/mp/gametypes/_gameobjects::setvisibleteam( "any" ); - domflag.onuse = ::onuse; - domflag.onbeginuse = ::onbeginuse; - domflag.onuseupdate = ::onuseupdate; - domflag.onenduse = ::onenduse; - domflag.onupdateuserate = ::onupdateuserate; - tracestart = visuals[ 0 ].origin + vectorScale( ( 0, 0, 1 ), 32 ); - traceend = visuals[ 0 ].origin + vectorScale( ( 0, 0, -1 ), 32 ); - trace = bullettrace( tracestart, traceend, 0, undefined ); - upangles = vectorToAngles( trace[ "normal" ] ); - domflag.baseeffectforward = anglesToForward( upangles ); - domflag.baseeffectright = anglesToRight( upangles ); - domflag.baseeffectpos = trace[ "position" ]; - level.flags[ index ].useobj = domflag; - level.flags[ index ].adjflags = []; - level.flags[ index ].nearbyspawns = []; - domflag.levelflag = level.flags[ index ]; - level.domflags[ level.domflags.size ] = domflag; - } - level.bestspawnflag = []; - level.bestspawnflag[ "allies" ] = getunownedflagneareststart( "allies", undefined ); - level.bestspawnflag[ "axis" ] = getunownedflagneareststart( "axis", level.bestspawnflag[ "allies" ] ); - for ( index = 0; index < level.domflags.size; index++ ) - { - level.domflags[ index ] createflagspawninfluencers(); - } - flagsetup(); - /* + maps\mp\gametypes\_callbacksetup::abortlevel(); + return; + } + + level.flags = []; + + for ( index = 0; index < primaryflags.size; index++ ) + level.flags[level.flags.size] = primaryflags[index]; + + for ( index = 0; index < secondaryflags.size; index++ ) + level.flags[level.flags.size] = secondaryflags[index]; + + level.domflags = []; + + for ( index = 0; index < level.flags.size; index++ ) + { + trigger = level.flags[index]; + + if ( isdefined( trigger.target ) ) + visuals[0] = getent( trigger.target, "targetname" ); + else + { + visuals[0] = spawn( "script_model", trigger.origin ); + visuals[0].angles = trigger.angles; + } + + visuals[0] setmodel( level.flagmodel["neutral"] ); + name = istring( trigger.script_label ); + precachestring( name ); + domflag = maps\mp\gametypes\_gameobjects::createuseobject( "neutral", trigger, visuals, ( 0, 0, 0 ), name ); + domflag maps\mp\gametypes\_gameobjects::allowuse( "enemy" ); + domflag maps\mp\gametypes\_gameobjects::setusetime( level.flagcapturetime ); + domflag maps\mp\gametypes\_gameobjects::setusetext( &"MP_CAPTURING_FLAG" ); + label = domflag maps\mp\gametypes\_gameobjects::getlabel(); + domflag.label = label; + domflag.flagindex = trigger.script_index; + domflag maps\mp\gametypes\_gameobjects::setvisibleteam( "any" ); + domflag.onuse = ::onuse; + domflag.onbeginuse = ::onbeginuse; + domflag.onuseupdate = ::onuseupdate; + domflag.onenduse = ::onenduse; + domflag.onupdateuserate = ::onupdateuserate; + tracestart = visuals[0].origin + vectorscale( ( 0, 0, 1 ), 32.0 ); + traceend = visuals[0].origin + vectorscale( ( 0, 0, -1 ), 32.0 ); + trace = bullettrace( tracestart, traceend, 0, undefined ); + upangles = vectortoangles( trace["normal"] ); + domflag.baseeffectforward = anglestoforward( upangles ); + domflag.baseeffectright = anglestoright( upangles ); + domflag.baseeffectpos = trace["position"]; + level.flags[index].useobj = domflag; + level.flags[index].adjflags = []; + level.flags[index].nearbyspawns = []; + domflag.levelflag = level.flags[index]; + level.domflags[level.domflags.size] = domflag; + } + + level.bestspawnflag = []; + level.bestspawnflag["allies"] = getunownedflagneareststart( "allies", undefined ); + level.bestspawnflag["axis"] = getunownedflagneareststart( "axis", level.bestspawnflag["allies"] ); + + for ( index = 0; index < level.domflags.size; index++ ) + level.domflags[index] createflagspawninfluencers(); + + flagsetup(); /# - thread domdebug(); + thread domdebug(); #/ - */ } -getunownedflagneareststart( team, excludeflag ) //checked partially changed to match cerberus output did not change while loop to for loop see github for more info +getunownedflagneareststart( team, excludeflag ) { - best = undefined; - bestdistsq = undefined; - i = 0; - while ( i < level.flags.size ) - { - flag = level.flags[ i ]; - if ( flag getflagteam() != "neutral" ) - { - i++; - continue; - } - distsq = distancesquared( flag.origin, level.startpos[ team ] ); - if ( ( !isDefined( excludeflag ) || flag != excludeflag ) && ( !isDefined( best ) || ( distsq < bestdistsq ) ) ) - { - bestdistsq = distsq; - best = flag; - } - i++; - } - return best; + best = undefined; + bestdistsq = undefined; + + for ( i = 0; i < level.flags.size; i++ ) + { + flag = level.flags[i]; + + if ( flag getflagteam() != "neutral" ) + continue; + + distsq = distancesquared( flag.origin, level.startpos[team] ); + + if ( ( !isdefined( excludeflag ) || flag != excludeflag ) && ( !isdefined( best ) || distsq < bestdistsq ) ) + { + bestdistsq = distsq; + best = flag; + } + } + + return best; } -domdebug() //dev call did not check +domdebug() { - /* /# - while ( 1 ) - { - while ( getDvar( #"9F76D073" ) != "1" ) - { - wait 2; - } - while ( 1 ) - { - if ( getDvar( #"9F76D073" ) != "1" ) - { - break; - } - else - { - i = 0; - while ( i < level.flags.size ) - { - j = 0; - while ( j < level.flags[ i ].adjflags.size ) - { - line( level.flags[ i ].origin, level.flags[ i ].adjflags[ j ].origin, ( 1, 1, 1 ) ); - j++; - } - j = 0; - while ( j < level.flags[ i ].nearbyspawns.size ) - { - line( level.flags[ i ].origin, level.flags[ i ].nearbyspawns[ j ].origin, ( 0,2, 0,2, 0,6 ) ); - j++; - } - if ( level.flags[ i ] == level.bestspawnflag[ "allies" ] ) - { - print3d( level.flags[ i ].origin, "allies best spawn flag" ); - } - if ( level.flags[ i ] == level.bestspawnflag[ "axis" ] ) - { - print3d( level.flags[ i ].origin, "axis best spawn flag" ); - } - i++; - } - wait 0,05; - } - } + while ( true ) + { + if ( getdvar( _hash_9F76D073 ) != "1" ) + { + wait 2; + continue; + } + + while ( true ) + { + if ( getdvar( _hash_9F76D073 ) != "1" ) + break; + + for ( i = 0; i < level.flags.size; i++ ) + { + for ( j = 0; j < level.flags[i].adjflags.size; j++ ) + line( level.flags[i].origin, level.flags[i].adjflags[j].origin, ( 1, 1, 1 ) ); + + for ( j = 0; j < level.flags[i].nearbyspawns.size; j++ ) + line( level.flags[i].origin, level.flags[i].nearbyspawns[j].origin, ( 0.2, 0.2, 0.6 ) ); + + if ( level.flags[i] == level.bestspawnflag["allies"] ) + print3d( level.flags[i].origin, "allies best spawn flag" ); + + if ( level.flags[i] == level.bestspawnflag["axis"] ) + print3d( level.flags[i].origin, "axis best spawn flag" ); + } + + wait 0.05; + } + } #/ - } - */ } -onbeginuse( player ) //checked matches cerberus output +onbeginuse( player ) { - ownerteam = self maps/mp/gametypes/_gameobjects::getownerteam(); - self.didstatusnotify = 0; - if ( ownerteam == "allies" ) - { - otherteam = "axis"; - } - else - { - otherteam = "allies"; - } - if ( ownerteam == "neutral" ) - { - otherteam = getotherteam( player.pers[ "team" ] ); - statusdialog( "securing" + self.label, player.pers[ "team" ], "gamemode_changing" + self.label ); - return; - } + ownerteam = self maps\mp\gametypes\_gameobjects::getownerteam(); + self.didstatusnotify = 0; + + if ( ownerteam == "allies" ) + otherteam = "axis"; + else + otherteam = "allies"; + + if ( ownerteam == "neutral" ) + { + otherteam = getotherteam( player.pers["team"] ); + statusdialog( "securing" + self.label, player.pers["team"], "gamemode_changing" + self.label ); + return; + } } -onuseupdate( team, progress, change ) //checked matches cerberus output +onuseupdate( team, progress, change ) { - if ( progress > 0.05 && change && !self.didstatusnotify ) - { - ownerteam = self maps/mp/gametypes/_gameobjects::getownerteam(); - if ( ownerteam == "neutral" ) - { - otherteam = getotherteam( team ); - statusdialog( "securing" + self.label, team, "gamemode_changing" + self.label ); - } - else - { - statusdialog( "losing" + self.label, ownerteam, "gamemode_changing" + self.label ); - statusdialog( "securing" + self.label, team, "gamemode_changing" + self.label ); - } - self.didstatusnotify = 1; - } + if ( progress > 0.05 && change && !self.didstatusnotify ) + { + ownerteam = self maps\mp\gametypes\_gameobjects::getownerteam(); + + if ( ownerteam == "neutral" ) + { + otherteam = getotherteam( team ); + statusdialog( "securing" + self.label, team, "gamemode_changing" + self.label ); + } + else + { + statusdialog( "losing" + self.label, ownerteam, "gamemode_changing" + self.label ); + statusdialog( "securing" + self.label, team, "gamemode_changing" + self.label ); + } + + self.didstatusnotify = 1; + } } -flushalldialog() //checked matches cerberus output +flushalldialog() { - maps/mp/gametypes/_globallogic_audio::flushgroupdialog( "gamemode_objective_a" ); - maps/mp/gametypes/_globallogic_audio::flushgroupdialog( "gamemode_objective_b" ); - maps/mp/gametypes/_globallogic_audio::flushgroupdialog( "gamemode_objective_c" ); - maps/mp/gametypes/_globallogic_audio::flushgroupdialog( "gamemode_changing_a" ); - maps/mp/gametypes/_globallogic_audio::flushgroupdialog( "gamemode_changing_b" ); - maps/mp/gametypes/_globallogic_audio::flushgroupdialog( "gamemode_changing_c" ); + maps\mp\gametypes\_globallogic_audio::flushgroupdialog( "gamemode_objective_a" ); + maps\mp\gametypes\_globallogic_audio::flushgroupdialog( "gamemode_objective_b" ); + maps\mp\gametypes\_globallogic_audio::flushgroupdialog( "gamemode_objective_c" ); + maps\mp\gametypes\_globallogic_audio::flushgroupdialog( "gamemode_changing_a" ); + maps\mp\gametypes\_globallogic_audio::flushgroupdialog( "gamemode_changing_b" ); + maps\mp\gametypes\_globallogic_audio::flushgroupdialog( "gamemode_changing_c" ); } -statusdialog( dialog, team, group, flushgroup ) //checked matches cerberus output +statusdialog( dialog, team, group, flushgroup ) { - if ( isDefined( flushgroup ) ) - { - maps/mp/gametypes/_globallogic_audio::flushgroupdialog( flushgroup ); - } - maps/mp/gametypes/_globallogic_audio::leaderdialog( dialog, team, group ); + if ( isdefined( flushgroup ) ) + maps\mp\gametypes\_globallogic_audio::flushgroupdialog( flushgroup ); + + maps\mp\gametypes\_globallogic_audio::leaderdialog( dialog, team, group ); } -onenduse( team, player, success ) //checked matches cerberus output +onenduse( team, player, success ) { - if ( !success ) - { - maps/mp/gametypes/_globallogic_audio::flushgroupdialog( "gamemode_changing" + self.label ); - } + if ( !success ) + maps\mp\gametypes\_globallogic_audio::flushgroupdialog( "gamemode_changing" + self.label ); } -resetflagbaseeffect() //checked matches cerberus output +resetflagbaseeffect() { - if ( isDefined( self.baseeffect ) ) - { - self.baseeffect delete(); - } - team = self maps/mp/gametypes/_gameobjects::getownerteam(); - if ( team != "axis" && team != "allies" ) - { - return; - } - fxid = level.flagbasefxid[ team ]; - self.baseeffect = spawnfx( fxid, self.baseeffectpos, self.baseeffectforward, self.baseeffectright ); - triggerfx( self.baseeffect ); + if ( isdefined( self.baseeffect ) ) + self.baseeffect delete(); + + team = self maps\mp\gametypes\_gameobjects::getownerteam(); + + if ( team != "axis" && team != "allies" ) + return; + + fxid = level.flagbasefxid[team]; + self.baseeffect = spawnfx( fxid, self.baseeffectpos, self.baseeffectforward, self.baseeffectright ); + triggerfx( self.baseeffect ); } -onuse( player ) //checked changed to match cerberus output +onuse( player ) { - level notify( "flag_captured" ); - team = player.pers[ "team" ]; - oldteam = self maps/mp/gametypes/_gameobjects::getownerteam(); - label = self maps/mp/gametypes/_gameobjects::getlabel(); - player logstring( "flag captured: " + self.label ); - self maps/mp/gametypes/_gameobjects::setownerteam( team ); - self.visuals[ 0 ] setmodel( level.flagmodel[ team ] ); - setdvar( "scr_obj" + self maps/mp/gametypes/_gameobjects::getlabel(), team ); - self resetflagbaseeffect(); - level.usestartspawns = 0; - /* + level notify( "flag_captured" ); + team = player.pers["team"]; + oldteam = self maps\mp\gametypes\_gameobjects::getownerteam(); + label = self maps\mp\gametypes\_gameobjects::getlabel(); + player logstring( "flag captured: " + self.label ); + self maps\mp\gametypes\_gameobjects::setownerteam( team ); + self.visuals[0] setmodel( level.flagmodel[team] ); + setdvar( "scr_obj" + self maps\mp\gametypes\_gameobjects::getlabel(), team ); + self resetflagbaseeffect(); + level.usestartspawns = 0; /# - assert( team != "neutral" ); + assert( team != "neutral" ); #/ - */ - isbflag = 0; - string = &""; - switch( label ) - { - case "_a": - string = &"MP_DOM_FLAG_A_CAPTURED_BY"; - break; - case "_b": - string = &"MP_DOM_FLAG_B_CAPTURED_BY"; - isbflag = 1; - break; - case "_c": - string = &"MP_DOM_FLAG_C_CAPTURED_BY"; - break; - case "_d": - string = &"MP_DOM_FLAG_D_CAPTURED_BY"; - break; - case "_e": - string = &"MP_DOM_FLAG_E_CAPTURED_BY"; - break; - default: - break; - } - /* + isbflag = 0; + string = &""; + + switch ( label ) + { + case "_a": + string = &"MP_DOM_FLAG_A_CAPTURED_BY"; + break; + case "_b": + string = &"MP_DOM_FLAG_B_CAPTURED_BY"; + isbflag = 1; + break; + case "_c": + string = &"MP_DOM_FLAG_C_CAPTURED_BY"; + break; + case "_d": + string = &"MP_DOM_FLAG_D_CAPTURED_BY"; + break; + case "_e": + string = &"MP_DOM_FLAG_E_CAPTURED_BY"; + break; + default: + break; + } + /# - assert( string != &"" ); + assert( string != &"" ); #/ - */ - touchlist = []; - touchkeys = getarraykeys( self.touchlist[ team ] ); - for ( i = 0; i < touchkeys.size; i++ ) - { - touchlist[ touchkeys[ i ] ] = self.touchlist[ team ][ touchkeys[ i ] ]; - } - thread give_capture_credit( touchlist, string, oldteam, isbflag ); - bbprint( "mpobjective", "gametime %d objtype %s label %s team %s", getTime(), "dom_capture", label, team ); - if ( oldteam == "neutral" ) - { - self.singleowner = 1; - otherteam = getotherteam( team ); - thread printandsoundoneveryone( team, undefined, &"", undefined, "mp_war_objective_taken" ); - thread playsoundonplayers( "mus_dom_captured" + "_" + level.teampostfix[ team ] ); - if ( getteamflagcount( team ) == level.flags.size ) - { - statusdialog( "secure_all", team, "gamemode_objective" ); - statusdialog( "lost_all", otherteam, "gamemode_objective" ); - flushalldialog(); - } - else - { - statusdialog( "secured" + self.label, team, "gamemode_objective" + self.label, "gamemode_changing" + self.label ); - statusdialog( "enemy" + self.label, otherteam, "gamemode_objective" + self.label, "gamemode_changing" + self.label ); - maps/mp/gametypes/_globallogic_audio::play_2d_on_team( "mpl_flagcapture_sting_enemy", otherteam ); - maps/mp/gametypes/_globallogic_audio::play_2d_on_team( "mpl_flagcapture_sting_friend", team ); - } - } - else - { - self.singleowner = 0; - thread printandsoundoneveryone( team, oldteam, &"", &"", "mp_war_objective_taken", "mp_war_objective_lost", "" ); - if ( getteamflagcount( team ) == level.flags.size ) - { - statusdialog( "secure_all", team, "gamemode_objective" ); - statusdialog( "lost_all", oldteam, "gamemode_objective" ); - flushalldialog(); - } - else - { - statusdialog( "secured" + self.label, team, "gamemode_objective" + self.label, "gamemode_changing" + self.label ); - if ( randomint( 2 ) ) - { - statusdialog( "lost" + self.label, oldteam, "gamemode_objective" + self.label, "gamemode_changing" + self.label ); - } - else - { - statusdialog( "enemy" + self.label, oldteam, "gamemode_objective" + self.label, "gamemode_changing" + self.label ); - } - maps/mp/gametypes/_globallogic_audio::play_2d_on_team( "mpl_flagcapture_sting_enemy", oldteam ); - maps/mp/gametypes/_globallogic_audio::play_2d_on_team( "mpl_flagcapture_sting_friend", team ); - } - level.bestspawnflag[ oldteam ] = self.levelflag; - } - if ( dominated_challenge_check() ) - { - level thread totaldomination( team ); - } - self update_spawn_influencers( team ); - level change_dom_spawns(); + touchlist = []; + touchkeys = getarraykeys( self.touchlist[team] ); + + for ( i = 0; i < touchkeys.size; i++ ) + touchlist[touchkeys[i]] = self.touchlist[team][touchkeys[i]]; + + thread give_capture_credit( touchlist, string, oldteam, isbflag ); + bbprint( "mpobjective", "gametime %d objtype %s label %s team %s", gettime(), "dom_capture", label, team ); + + if ( oldteam == "neutral" ) + { + self.singleowner = 1; + otherteam = getotherteam( team ); + thread printandsoundoneveryone( team, undefined, &"", undefined, "mp_war_objective_taken" ); + thread playsoundonplayers( "mus_dom_captured" + "_" + level.teampostfix[team] ); + + if ( getteamflagcount( team ) == level.flags.size ) + { + statusdialog( "secure_all", team, "gamemode_objective" ); + statusdialog( "lost_all", otherteam, "gamemode_objective" ); + flushalldialog(); + } + else + { + statusdialog( "secured" + self.label, team, "gamemode_objective" + self.label, "gamemode_changing" + self.label ); + statusdialog( "enemy" + self.label, otherteam, "gamemode_objective" + self.label, "gamemode_changing" + self.label ); + maps\mp\gametypes\_globallogic_audio::play_2d_on_team( "mpl_flagcapture_sting_enemy", otherteam ); + maps\mp\gametypes\_globallogic_audio::play_2d_on_team( "mpl_flagcapture_sting_friend", team ); + } + } + else + { + self.singleowner = 0; + thread printandsoundoneveryone( team, oldteam, &"", &"", "mp_war_objective_taken", "mp_war_objective_lost", "" ); + + if ( getteamflagcount( team ) == level.flags.size ) + { + statusdialog( "secure_all", team, "gamemode_objective" ); + statusdialog( "lost_all", oldteam, "gamemode_objective" ); + flushalldialog(); + } + else + { + statusdialog( "secured" + self.label, team, "gamemode_objective" + self.label, "gamemode_changing" + self.label ); + + if ( randomint( 2 ) ) + statusdialog( "lost" + self.label, oldteam, "gamemode_objective" + self.label, "gamemode_changing" + self.label ); + else + statusdialog( "enemy" + self.label, oldteam, "gamemode_objective" + self.label, "gamemode_changing" + self.label ); + + maps\mp\gametypes\_globallogic_audio::play_2d_on_team( "mpl_flagcapture_sting_enemy", oldteam ); + maps\mp\gametypes\_globallogic_audio::play_2d_on_team( "mpl_flagcapture_sting_friend", team ); + } + + level.bestspawnflag[oldteam] = self.levelflag; + } + + if ( dominated_challenge_check() ) + level thread totaldomination( team ); + + self update_spawn_influencers( team ); + level change_dom_spawns(); } -totaldomination( team ) //checked matches cerberus output +totaldomination( team ) { - level endon( "flag_captured" ); - level endon( "game_ended" ); - wait 180; - maps/mp/_challenges::totaldomination( team ); + level endon( "flag_captured" ); + level endon( "game_ended" ); + wait 180; + maps\mp\_challenges::totaldomination( team ); } -watchforbflagcap() //checked matches cerberus output +watchforbflagcap() { - level endon( "game_ended" ); - level endon( "endWatchForBFlagCapAfterTime" ); - level thread endwatchforbflagcapaftertime( 60 ); - for ( ;; ) - { - level waittill( "b_flag_captured", player ); - player maps/mp/_challenges::capturedbfirstminute(); - } + level endon( "game_ended" ); + level endon( "endWatchForBFlagCapAfterTime" ); + level thread endwatchforbflagcapaftertime( 60 ); + + for (;;) + { + level waittill( "b_flag_captured", player ); + + player maps\mp\_challenges::capturedbfirstminute(); + } } -endwatchforbflagcapaftertime( time ) //checked matches cerberus output +endwatchforbflagcapaftertime( time ) { - level endon( "game_ended" ); - wait 60; - level notify( "endWatchForBFlagCapAfterTime" ); + level endon( "game_ended" ); + wait 60; + level notify( "endWatchForBFlagCapAfterTime" ); } -give_capture_credit( touchlist, string, lastownerteam, isbflag ) //checked changed to match cerberus output +give_capture_credit( touchlist, string, lastownerteam, isbflag ) { - time = getTime(); - wait 0.05; - maps/mp/gametypes/_globallogic_utils::waittillslowprocessallowed(); - self updatecapsperminute( lastownerteam ); - players = getarraykeys( touchlist ); - for ( i = 0; i < players.size; i++ ) - { - player_from_touchlist = touchlist[ players[ i ] ].player; - player_from_touchlist updatecapsperminute( lastownerteam ); - if ( !isscoreboosting( player_from_touchlist, self ) ) - { - player_from_touchlist maps/mp/_challenges::capturedobjective( time ); - if ( lastownerteam == "neutral" ) - { - if ( isbflag ) - { - maps/mp/_scoreevents::processscoreevent( "dom_point_neutral_b_secured", player_from_touchlist ); - } - else - { - maps/mp/_scoreevents::processscoreevent( "dom_point_neutral_secured", player_from_touchlist ); - } - } - else - { - maps/mp/_scoreevents::processscoreevent( "dom_point_secured", player_from_touchlist ); - } - player_from_touchlist recordgameevent( "capture" ); - if ( isbflag ) - { - level notify( "b_flag_captured" ); - } - if ( isDefined( player_from_touchlist.pers[ "captures" ] ) ) - { - player_from_touchlist.pers[ "captures" ]++; - player_from_touchlist.captures = player_from_touchlist.pers[ "captures" ]; - } - maps/mp/_demo::bookmark( "event", getTime(), player_from_touchlist ); - player_from_touchlist addplayerstatwithgametype( "CAPTURES", 1 ); - } - else - { - /* + time = gettime(); + wait 0.05; + maps\mp\gametypes\_globallogic_utils::waittillslowprocessallowed(); + self updatecapsperminute( lastownerteam ); + players = getarraykeys( touchlist ); + + for ( i = 0; i < players.size; i++ ) + { + player_from_touchlist = touchlist[players[i]].player; + player_from_touchlist updatecapsperminute( lastownerteam ); + + if ( !isscoreboosting( player_from_touchlist, self ) ) + { + player_from_touchlist maps\mp\_challenges::capturedobjective( time ); + + if ( lastownerteam == "neutral" ) + { + if ( isbflag ) + maps\mp\_scoreevents::processscoreevent( "dom_point_neutral_b_secured", player_from_touchlist ); + else + maps\mp\_scoreevents::processscoreevent( "dom_point_neutral_secured", player_from_touchlist ); + } + else + maps\mp\_scoreevents::processscoreevent( "dom_point_secured", player_from_touchlist ); + + player_from_touchlist recordgameevent( "capture" ); + + if ( isbflag ) + level notify( "b_flag_captured", player_from_touchlist ); + + if ( isdefined( player_from_touchlist.pers["captures"] ) ) + { + player_from_touchlist.pers["captures"]++; + player_from_touchlist.captures = player_from_touchlist.pers["captures"]; + } + + maps\mp\_demo::bookmark( "event", gettime(), player_from_touchlist ); + player_from_touchlist addplayerstatwithgametype( "CAPTURES", 1 ); + } + else + { /# - player_from_touchlist iprintlnbold( "GAMETYPE DEBUG: NOT GIVING YOU CAPTURE CREDIT AS BOOSTING PREVENTION" ); + player_from_touchlist iprintlnbold( "GAMETYPE DEBUG: NOT GIVING YOU CAPTURE CREDIT AS BOOSTING PREVENTION" ); #/ - */ - } - level thread maps/mp/_popups::displayteammessagetoall( string, player_from_touchlist ); - } + } + + level thread maps\mp\_popups::displayteammessagetoall( string, player_from_touchlist ); + } } -delayedleaderdialog( sound, team, label ) //checked matches cerberus output +delayedleaderdialog( sound, team, label ) { - wait 0.1; - maps/mp/gametypes/_globallogic_utils::waittillslowprocessallowed(); - if ( !isDefined( label ) ) - { - label = ""; - } - maps/mp/gametypes/_globallogic_audio::leaderdialog( sound, team, "gamemode_objective" + label ); + wait 0.1; + maps\mp\gametypes\_globallogic_utils::waittillslowprocessallowed(); + + if ( !isdefined( label ) ) + label = ""; + + maps\mp\gametypes\_globallogic_audio::leaderdialog( sound, team, "gamemode_objective" + label ); } -updatedomscores() //checked matches cerberus output +updatedomscores() { - while ( !level.gameended ) - { - numownedflags = 0; - scoring_teams = []; - numflags = getteamflagcount( "allies" ); - numownedflags += numflags; - if ( numflags ) - { - scoring_teams[ scoring_teams.size ] = "allies"; - maps/mp/gametypes/_globallogic_score::giveteamscoreforobjective_delaypostprocessing( "allies", numflags ); - } - numflags = getteamflagcount( "axis" ); - numownedflags += numflags; - if ( numflags ) - { - scoring_teams[ scoring_teams.size ] = "axis"; - maps/mp/gametypes/_globallogic_score::giveteamscoreforobjective_delaypostprocessing( "axis", numflags ); - } - if ( numownedflags ) - { - maps/mp/gametypes/_globallogic_score::postprocessteamscores( scoring_teams ); - } - onscoreclosemusic(); - timepassed = maps/mp/gametypes/_globallogic_utils::gettimepassed(); - if ( ( ( timepassed / 1000 ) > 120 ) && numownedflags < 2 || ( ( timepassed / 1000 ) > 300 ) && numownedflags < 3 && gamemodeismode( level.gamemode_public_match ) ) - { - thread maps/mp/gametypes/_globallogic::endgame( "tie", game[ "strings" ][ "time_limit_reached" ] ); - return; - } - wait 5; - maps/mp/gametypes/_hostmigration::waittillhostmigrationdone(); - } + while ( !level.gameended ) + { + numownedflags = 0; + scoring_teams = []; + numflags = getteamflagcount( "allies" ); + numownedflags += numflags; + + if ( numflags ) + { + scoring_teams[scoring_teams.size] = "allies"; + maps\mp\gametypes\_globallogic_score::giveteamscoreforobjective_delaypostprocessing( "allies", numflags ); + } + + numflags = getteamflagcount( "axis" ); + numownedflags += numflags; + + if ( numflags ) + { + scoring_teams[scoring_teams.size] = "axis"; + maps\mp\gametypes\_globallogic_score::giveteamscoreforobjective_delaypostprocessing( "axis", numflags ); + } + + if ( numownedflags ) + maps\mp\gametypes\_globallogic_score::postprocessteamscores( scoring_teams ); + + onscoreclosemusic(); + timepassed = maps\mp\gametypes\_globallogic_utils::gettimepassed(); + + if ( ( timepassed / 1000 > 120 && numownedflags < 2 || timepassed / 1000 > 300 && numownedflags < 3 ) && gamemodeismode( level.gamemode_public_match ) ) + { + thread maps\mp\gametypes\_globallogic::endgame( "tie", game["strings"]["time_limit_reached"] ); + return; + } + + wait 5.0; + maps\mp\gametypes\_hostmigration::waittillhostmigrationdone(); + } } -onscoreclosemusic() //checked matches cerberus output +onscoreclosemusic() { - axisscore = [[ level._getteamscore ]]( "axis" ); - alliedscore = [[ level._getteamscore ]]( "allies" ); - scorelimit = level.scorelimit; - scorethreshold = scorelimit * 0.1; - scoredif = abs( axisscore - alliedscore ); - scorethresholdstart = abs( scorelimit - scorethreshold ); - scorelimitcheck = scorelimit - 10; - if ( !isDefined( level.playingactionmusic ) ) - { - level.playingactionmusic = 0; - } - if ( alliedscore > axisscore ) - { - currentscore = alliedscore; - } - else - { - currentscore = axisscore; - } - /* + axisscore = [[ level._getteamscore ]]( "axis" ); + alliedscore = [[ level._getteamscore ]]( "allies" ); + scorelimit = level.scorelimit; + scorethreshold = scorelimit * 0.1; + scoredif = abs( axisscore - alliedscore ); + scorethresholdstart = abs( scorelimit - scorethreshold ); + scorelimitcheck = scorelimit - 10; + + if ( !isdefined( level.playingactionmusic ) ) + level.playingactionmusic = 0; + + if ( alliedscore > axisscore ) + currentscore = alliedscore; + else + currentscore = axisscore; + /# - if ( getDvarInt( "debug_music" ) > 0 ) - { - println( "Music System Domination - scoreDif " + scoredif ); - println( "Music System Domination - axisScore " + axisscore ); - println( "Music System Domination - alliedScore " + alliedscore ); - println( "Music System Domination - scoreLimit " + scorelimit ); - println( "Music System Domination - currentScore " + currentscore ); - println( "Music System Domination - scoreThreshold " + scorethreshold ); - println( "Music System Domination - scoreDif " + scoredif ); - println( "Music System Domination - scoreThresholdStart " + scorethresholdstart ); + if ( getdvarint( _hash_BC4784C ) > 0 ) + { + println( "Music System Domination - scoreDif " + scoredif ); + println( "Music System Domination - axisScore " + axisscore ); + println( "Music System Domination - alliedScore " + alliedscore ); + println( "Music System Domination - scoreLimit " + scorelimit ); + println( "Music System Domination - currentScore " + currentscore ); + println( "Music System Domination - scoreThreshold " + scorethreshold ); + println( "Music System Domination - scoreDif " + scoredif ); + println( "Music System Domination - scoreThresholdStart " + scorethresholdstart ); + } #/ - } - */ - if ( ( scoredif <= scorethreshold ) && ( scorethresholdstart <= currentscore ) && level.playingactionmusic != 1 ) - { - thread maps/mp/gametypes/_globallogic_audio::set_music_on_team( "TIME_OUT", "both" ); - thread maps/mp/gametypes/_globallogic_audio::actionmusicset(); - } - else - { - return; - } + + if ( scoredif <= scorethreshold && scorethresholdstart <= currentscore && level.playingactionmusic != 1 ) + { + thread maps\mp\gametypes\_globallogic_audio::set_music_on_team( "TIME_OUT", "both" ); + thread maps\mp\gametypes\_globallogic_audio::actionmusicset(); + } + else + return; } -onroundswitch() //checked matches cerberus output +onroundswitch() { - if ( !isDefined( game[ "switchedsides" ] ) ) - { - game[ "switchedsides" ] = 0; - } - game[ "switchedsides" ] = !game[ "switchedsides" ]; - if ( level.roundscorecarry == 0 ) - { - [[ level._setteamscore ]]( "allies", game[ "roundswon" ][ "allies" ] ); - [[ level._setteamscore ]]( "axis", game[ "roundswon" ][ "axis" ] ); - } + if ( !isdefined( game["switchedsides"] ) ) + game["switchedsides"] = 0; + + game["switchedsides"] = !game["switchedsides"]; + + if ( level.roundscorecarry == 0 ) + { + [[ level._setteamscore ]]( "allies", game["roundswon"]["allies"] ); + [[ level._setteamscore ]]( "axis", game["roundswon"]["axis"] ); + } } -onplayerkilled( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ) //checked changed to match cerberus output +onplayerkilled( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ) { - if ( isDefined( attacker ) && isplayer( attacker ) ) - { - scoreeventprocessed = 0; - if ( attacker.touchtriggers.size && attacker.pers[ "team" ] != self.pers[ "team" ] ) - { - triggerids = getarraykeys( attacker.touchtriggers ); - ownerteam = attacker.touchtriggers[ triggerids[ 0 ] ].useobj.ownerteam; - team = attacker.pers[ "team" ]; - if ( team != ownerteam ) - { - maps/mp/_scoreevents::processscoreevent( "kill_enemy_while_capping_dom", attacker, undefined, sweapon ); - scoreeventprocessed = 1; - } - } - for ( index = 0; index < level.flags.size; index++ ) - { - flagteam = "invalidTeam"; - inflagzone = 0; - defendedflag = 0; - offendedflag = 0; - flagorigin = level.flags[ index ].origin; - level.defaultoffenseradius = 300; - dist = distance2d( self.origin, flagorigin ); - if ( dist < level.defaultoffenseradius ) - { - inflagzone = 1; - if ( level.flags[ index ] getflagteam() == attacker.pers[ "team" ] || level.flags[ index ] getflagteam() == "neutral" ) - { - defendedflag = 1; - } - else - { - offendedflag = 1; - } - } - dist = distance2d( attacker.origin, flagorigin ); - if ( dist < level.defaultoffenseradius ) - { - inflagzone = 1; - if ( level.flags[ index ] getflagteam() == attacker.pers[ "team" ] || level.flags[ index ] getflagteam() == "neutral" ) - { - defendedflag = 1; - } - else - { - offendedflag = 1; - } - } - if ( inflagzone && isplayer( attacker ) && attacker.pers[ "team" ] != self.pers[ "team" ] ) - { - if ( offendedflag ) - { - if ( !isDefined( attacker.dom_defends ) ) - { - attacker.dom_defends = 0; - } - attacker.dom_defends++; - if ( level.playerdefensivemax >= attacker.dom_defends ) - { - attacker addplayerstatwithgametype( "OFFENDS", 1 ); - if ( !scoreeventprocessed ) - { - maps/mp/_scoreevents::processscoreevent( "killed_defender", attacker, undefined, sweapon ); - } - self recordkillmodifier( "defending" ); - break; - } - else - { - /* - /# - attacker iprintlnbold( "GAMETYPE DEBUG: NOT GIVING YOU DEFENSIVE CREDIT AS BOOSTING PREVENTION" ); - #/ - */ - } - } - if ( defendedflag ) - { - if ( !isDefined( attacker.dom_offends ) ) - { - attacker.dom_offends = 0; - } - attacker thread updateattackermultikills(); - attacker.dom_offends++; - if ( level.playeroffensivemax >= attacker.dom_offends ) - { - attacker.pers[ "defends" ]++; - attacker.defends = attacker.pers[ "defends" ]; - attacker addplayerstatwithgametype( "DEFENDS", 1 ); - attacker recordgameevent( "return" ); - attacker maps/mp/_challenges::killedzoneattacker( sweapon ); - if ( !scoreeventprocessed ) - { - maps/mp/_scoreevents::processscoreevent( "killed_attacker", attacker, undefined, sweapon ); - } - self recordkillmodifier( "assaulting" ); - break; - } - else - { - /* - /# - attacker iprintlnbold( "GAMETYPE DEBUG: NOT GIVING YOU OFFENSIVE CREDIT AS BOOSTING PREVENTION" ); - #/ - */ - } - } - } - } - if ( self.touchtriggers.size && attacker.pers[ "team" ] != self.pers[ "team" ] ) - { - triggerids = getarraykeys( self.touchtriggers ); - ownerteam = self.touchtriggers[ triggerids[ 0 ] ].useobj.ownerteam; - team = self.pers[ "team" ]; - if ( team != ownerteam ) - { - flag = self.touchtriggers[ triggerids[ 0 ] ].useobj; - if ( isDefined( flag.contested ) && flag.contested == 1 ) - { - attacker killwhilecontesting( flag ); - } - } - } - } -} + if ( isdefined( attacker ) && isplayer( attacker ) ) + { + scoreeventprocessed = 0; -killwhilecontesting( flag ) //checked matches cerberus output -{ - self notify( "killWhileContesting" ); - self endon( "killWhileContesting" ); - self endon( "disconnect" ); - killtime = getTime(); - playerteam = self.pers[ "team" ]; - if ( !isDefined( self.clearenemycount ) ) - { - self.clearenemycount = 0; - } - self.clearenemycount++; - flag waittill( "contest_over" ); - if ( playerteam != self.pers[ "team" ] || isDefined( self.spawntime ) && ( killtime < self.spawntime ) ) - { - self.clearenemycount = 0; - return; - } - if ( flag.ownerteam != playerteam && flag.ownerteam != "neutral" ) - { - self.clearenemycount = 0; - return; - } - if ( self.clearenemycount >= 2 && ( killtime + 200 ) > getTime() ) - { - maps/mp/_scoreevents::processscoreevent( "clear_2_attackers", self ); - } - self.clearenemycount = 0; -} + if ( attacker.touchtriggers.size && attacker.pers["team"] != self.pers["team"] ) + { + triggerids = getarraykeys( attacker.touchtriggers ); + ownerteam = attacker.touchtriggers[triggerids[0]].useobj.ownerteam; + team = attacker.pers["team"]; -updateattackermultikills() //checked matches cerberus output -{ - self endon( "disconnect" ); - level endon( "game_ended" ); - self notify( "updateDomRecentKills" ); - self endon( "updateDomRecentKills" ); - if ( !isDefined( self.recentdomattackerkillcount ) ) - { - self.recentdomattackerkillcount = 0; - } - self.recentdomattackerkillcount++; - wait 4; - if ( self.recentdomattackerkillcount > 1 ) - { - self maps/mp/_challenges::domattackermultikill( self.recentdomattackerkillcount ); - } - self.recentdomattackerkillcount = 0; -} + if ( team != ownerteam ) + { + maps\mp\_scoreevents::processscoreevent( "kill_enemy_while_capping_dom", attacker, undefined, sweapon ); + scoreeventprocessed = 1; + } + } -getteamflagcount( team ) //checked changed to match cerberus output -{ - score = 0; - for ( i = 0; i < level.flags.size; i++ ) - { - if ( level.domflags[ i ] maps/mp/gametypes/_gameobjects::getownerteam() == team ) - { - score++; - } - } - return score; -} + for ( index = 0; index < level.flags.size; index++ ) + { + flagteam = "invalidTeam"; + inflagzone = 0; + defendedflag = 0; + offendedflag = 0; + flagorigin = level.flags[index].origin; + level.defaultoffenseradius = 300; + dist = distance2d( self.origin, flagorigin ); -getflagteam() //checked matches cerberus output -{ - return self.useobj maps/mp/gametypes/_gameobjects::getownerteam(); -} + if ( dist < level.defaultoffenseradius ) + { + inflagzone = 1; -getboundaryflags() //checked changed to match cerberus output -{ - bflags = []; - for ( i = 0; i < level.flags.size; i++ ) - { - for ( j = 0; j < level.flags[i].adjflags.size; j++ ) - { - if ( level.flags[ i ].useobj maps/mp/gametypes/_gameobjects::getownerteam() != level.flags[ i ].adjflags[ j ].useobj maps/mp/gametypes/_gameobjects::getownerteam() ) - { - bflags[ bflags.size ] = level.flags[ i ]; - break; - } - } - } - return bflags; -} + if ( level.flags[index] getflagteam() == attacker.pers["team"] || level.flags[index] getflagteam() == "neutral" ) + defendedflag = 1; + else + offendedflag = 1; + } -getboundaryflagspawns( team ) //checked changed to match cerberus output -{ - spawns = []; - bflags = getboundaryflags(); - for ( i = 0; i < bflags.size; i++ ) - { - if ( isDefined( team ) && bflags[ i ] getflagteam() != team ) - { - break; - } - for ( j = 0; j < bflags[i].nearbyspawns.size; j++ ) - { - spawns[ spawns.size ] = bflags[ i ].nearbyspawns[ j ]; - } - } - return spawns; -} + dist = distance2d( attacker.origin, flagorigin ); -getspawnsboundingflag( avoidflag ) //checked changed to match cerberus output -{ - spawns = []; - for ( i = 0; i < level.flags.size; i++ ) - { - flag = level.flags[ i ]; - if ( flag == avoidflag ) - { - break; - } - isbounding = 0; - for ( j = 0; j < flag.adjflags.size; j++ ) - { - if ( flag.adjflags[ j ] == avoidflag ) - { - isbounding = 1; - break; - } - } - if ( !isbounding ) - { - break; - } - for ( j = 0; j < flag.nearbyspawns.size; j++ ) - { - spawns[ spawns.size ] = flag.nearbyspawns[ j ]; - } - } - return spawns; -} + if ( dist < level.defaultoffenseradius ) + { + inflagzone = 1; -getownedandboundingflagspawns( team ) //checked changed to match cerberus output -{ - spawns = []; - for ( i = 0; i < level.flags.size; i++ ) - { - if ( level.flags[ i ] getflagteam() == team ) - { - for ( s = 0; s < level.flags[i].nearbyspawns.size; s++ ) - { - spawns[ spawns.size ] = level.flags[ i ].nearbyspawns[ s ]; - } - } + if ( level.flags[index] getflagteam() == attacker.pers["team"] || level.flags[index] getflagteam() == "neutral" ) + defendedflag = 1; + else + offendedflag = 1; + } - for ( j = 0; j < level.flags[i].adjflags.size; j++ ) - { - if ( level.flags[ i ].adjflags[ j ] getflagteam() == team ) - { - for ( s = 0; s < level.flags[i].nearbyspawns.size; s++ ) - { - spawns[ spawns.size ] = level.flags[ i ].nearbyspawns[ s ]; - } - } - } - } - return spawns; -} + if ( inflagzone && isplayer( attacker ) && attacker.pers["team"] != self.pers["team"] ) + { + if ( offendedflag ) + { + if ( !isdefined( attacker.dom_defends ) ) + attacker.dom_defends = 0; -getownedflagspawns( team ) //checked changed to match cerberus output -{ - spawns = []; - for ( i = 0; i < level.flags.size; i++ ) - { - if ( level.flags[ i ] getflagteam() == team ) - { - for ( s = 0; s < level.flags[i].nearbyspawns.size; s++ ) - { - spawns[ spawns.size ] = level.flags[ i ].nearbyspawns[ s ]; - } - } - } - return spawns; -} + attacker.dom_defends++; -flagsetup() //checked partially changed to match cerberus output did not change while loops to for loops see github for more info -{ - maperrors = []; - descriptorsbylinkname = []; - descriptors = getentarray( "flag_descriptor", "targetname" ); - flags = level.flags; - i = 0; - while ( i < level.domflags.size ) - { - closestdist = undefined; - closestdesc = undefined; - for ( j = 0; j < descriptors.size; j++ ) - { - dist = distance( flags[ i ].origin, descriptors[ j ].origin ); - if ( !isDefined( closestdist ) || dist < closestdist ) - { - closestdist = dist; - closestdesc = descriptors[ j ]; - } - } - if ( !isDefined( closestdesc ) ) - { - maperrors[ maperrors.size ] = "there is no flag_descriptor in the map! see explanation in dom.gsc"; - break; - } - if ( isDefined( closestdesc.flag ) ) - { - maperrors[ maperrors.size ] = "flag_descriptor with script_linkname " + closestdesc.script_linkname + " is nearby more than one flag; is there a unique descriptor near each flag?"; - i++; - continue; - } - flags[ i ].descriptor = closestdesc; - closestdesc.flag = flags[ i ]; - descriptorsbylinkname[ closestdesc.script_linkname ] = closestdesc; - i++; - } - if ( maperrors.size == 0 ) - { - for ( i = 0; i < flags.size; i++ ) - { - if ( isDefined( flags[ i ].descriptor.script_linkto ) ) - { - adjdescs = strtok( flags[ i ].descriptor.script_linkto, " " ); - } - else - { - adjdescs = []; - } - j = 0; - while ( j < adjdescs.size ) - { - otherdesc = descriptorsbylinkname[ adjdescs[ j ] ]; - if ( !isDefined( otherdesc ) || otherdesc.targetname != "flag_descriptor" ) - { - maperrors[ maperrors.size ] = "flag_descriptor with script_linkname "" + flags[ i ].descriptor.script_linkname + "" linked to "" + adjdescs[ j ] + "" which does not exist as a script_linkname of any other entity with a targetname of flag_descriptor (or, if it does, that flag_descriptor has not been assigned to a flag)"; - j++; - continue; - } - adjflag = otherdesc.flag; - if ( adjflag == flags[ i ] ) - { - maperrors[ maperrors.size ] = "flag_descriptor with script_linkname "" + flags[ i ].descriptor.script_linkname + "" linked to itself"; - j++; - continue; - } - flags[ i ].adjflags[ flags[ i ].adjflags.size ] = adjflag; - j++; - } - } - } - spawnpoints = maps/mp/gametypes/_spawnlogic::getspawnpointarray( "mp_dom_spawn" ); - i = 0; - while ( i < spawnpoints.size ) - { - if ( isDefined( spawnpoints[ i ].script_linkto ) ) - { - desc = descriptorsbylinkname[ spawnpoints[ i ].script_linkto ]; - if ( !isDefined( desc ) || desc.targetname != "flag_descriptor" ) - { - maperrors[ maperrors.size ] = "Spawnpoint at " + spawnpoints[ i ].origin + " linked to " + spawnpoints[ i ].script_linkto + " which does not exist as a script_linkname of any entity with a targetname of flag_descriptor (or, if it does, that flag_descriptor has not been assigned to a flag)"; - i++; - continue; - } - nearestflag = desc.flag; - } - else - { - nearestflag = undefined; - nearestdist = undefined; - for ( j = 0; j < flags.size; j++ ) - { - dist = distancesquared( flags[ j ].origin, spawnpoints[ i ].origin ); - if ( !isDefined( nearestflag ) || ( dist < nearestdist ) ) - { - nearestflag = flags[ j ]; - nearestdist = dist; - } - } - nearestflag.nearbyspawns[ nearestflag.nearbyspawns.size ] = spawnpoints[ i ]; - } - i++; - } - if ( maperrors.size > 0 ) - { - /* + if ( level.playerdefensivemax >= attacker.dom_defends ) + { + attacker addplayerstatwithgametype( "OFFENDS", 1 ); + + if ( !scoreeventprocessed ) + maps\mp\_scoreevents::processscoreevent( "killed_defender", attacker, undefined, sweapon ); + + self recordkillmodifier( "defending" ); + break; + } + else + { /# - println( "^1------------ Map Errors ------------" ); - i = 0; - while ( i < maperrors.size ) - { - println( maperrors[ i ] ); - i++; - } - println( "^1------------------------------------" ); - maps/mp/_utility::error( "Map errors. See above" ); + attacker iprintlnbold( "GAMETYPE DEBUG: NOT GIVING YOU DEFENSIVE CREDIT AS BOOSTING PREVENTION" ); #/ - */ - maps/mp/gametypes/_callbacksetup::abortlevel(); - return; - } -} + } + } -createflagspawninfluencers() //checked changed to match cerberus output -{ - ss = level.spawnsystem; - for ( flag_index = 0; flag_index < level.flags.size; flag_index++ ) - { - if ( level.domflags[ flag_index ] == self ) - { - break; - } - } - abc = []; - abc[ 0 ] = "A"; - abc[ 1 ] = "B"; - abc[ 2 ] = "C"; - self.owned_flag_influencer = addsphereinfluencer( level.spawnsystem.einfluencer_type_game_mode, self.trigger.origin, ss.dom_owned_flag_influencer_radius[ flag_index ], ss.dom_owned_flag_influencer_score[ flag_index ], 0, "dom_owned_flag_" + abc[ flag_index ] + ",r,s", maps/mp/gametypes/_spawning::get_score_curve_index( ss.dom_owned_flag_influencer_score_curve ) ); - self.neutral_flag_influencer = addsphereinfluencer( level.spawnsystem.einfluencer_type_game_mode, self.trigger.origin, ss.dom_unowned_flag_influencer_radius, ss.dom_unowned_flag_influencer_score, 0, "dom_unowned_flag,r,s", maps/mp/gametypes/_spawning::get_score_curve_index( ss.dom_owned_flag_influencer_score_curve ) ); - self.enemy_flag_influencer = addsphereinfluencer( level.spawnsystem.einfluencer_type_game_mode, self.trigger.origin, ss.dom_enemy_flag_influencer_radius[ flag_index ], ss.dom_enemy_flag_influencer_score[ flag_index ], 0, "dom_enemy_flag_" + abc[ flag_index ] + ",r,s", maps/mp/gametypes/_spawning::get_score_curve_index( ss.dom_enemy_flag_influencer_score_curve ) ); - self update_spawn_influencers( "neutral" ); -} + if ( defendedflag ) + { + if ( !isdefined( attacker.dom_offends ) ) + attacker.dom_offends = 0; + + attacker thread updateattackermultikills(); + attacker.dom_offends++; + + if ( level.playeroffensivemax >= attacker.dom_offends ) + { + attacker.pers["defends"]++; + attacker.defends = attacker.pers["defends"]; + attacker addplayerstatwithgametype( "DEFENDS", 1 ); + attacker recordgameevent( "return" ); + attacker maps\mp\_challenges::killedzoneattacker( sweapon ); + + if ( !scoreeventprocessed ) + maps\mp\_scoreevents::processscoreevent( "killed_attacker", attacker, undefined, sweapon ); + + self recordkillmodifier( "assaulting" ); + break; + continue; + } -update_spawn_influencers( team ) //checked matches cerberus output -{ - /* /# - assert( isDefined( self.neutral_flag_influencer ) ); + attacker iprintlnbold( "GAMETYPE DEBUG: NOT GIVING YOU OFFENSIVE CREDIT AS BOOSTING PREVENTION" ); +#/ + } + } + } + + if ( self.touchtriggers.size && attacker.pers["team"] != self.pers["team"] ) + { + triggerids = getarraykeys( self.touchtriggers ); + ownerteam = self.touchtriggers[triggerids[0]].useobj.ownerteam; + team = self.pers["team"]; + + if ( team != ownerteam ) + { + flag = self.touchtriggers[triggerids[0]].useobj; + + if ( isdefined( flag.contested ) && flag.contested == 1 ) + attacker killwhilecontesting( flag ); + } + } + } +} + +killwhilecontesting( flag ) +{ + self notify( "killWhileContesting" ); + self endon( "killWhileContesting" ); + self endon( "disconnect" ); + killtime = gettime(); + playerteam = self.pers["team"]; + + if ( !isdefined( self.clearenemycount ) ) + self.clearenemycount = 0; + + self.clearenemycount++; + + flag waittill( "contest_over" ); + + if ( playerteam != self.pers["team"] || isdefined( self.spawntime ) && killtime < self.spawntime ) + { + self.clearenemycount = 0; + return; + } + + if ( flag.ownerteam != playerteam && flag.ownerteam != "neutral" ) + { + self.clearenemycount = 0; + return; + } + + if ( self.clearenemycount >= 2 && killtime + 200 > gettime() ) + maps\mp\_scoreevents::processscoreevent( "clear_2_attackers", self ); + + self.clearenemycount = 0; +} + +updateattackermultikills() +{ + self endon( "disconnect" ); + level endon( "game_ended" ); + self notify( "updateDomRecentKills" ); + self endon( "updateDomRecentKills" ); + + if ( !isdefined( self.recentdomattackerkillcount ) ) + self.recentdomattackerkillcount = 0; + + self.recentdomattackerkillcount++; + wait 4.0; + + if ( self.recentdomattackerkillcount > 1 ) + self maps\mp\_challenges::domattackermultikill( self.recentdomattackerkillcount ); + + self.recentdomattackerkillcount = 0; +} + +getteamflagcount( team ) +{ + score = 0; + + for ( i = 0; i < level.flags.size; i++ ) + { + if ( level.domflags[i] maps\mp\gametypes\_gameobjects::getownerteam() == team ) + score++; + } + + return score; +} + +getflagteam() +{ + return self.useobj maps\mp\gametypes\_gameobjects::getownerteam(); +} + +getboundaryflags() +{ + bflags = []; + + for ( i = 0; i < level.flags.size; i++ ) + { + for ( j = 0; j < level.flags[i].adjflags.size; j++ ) + { + if ( level.flags[i].useobj maps\mp\gametypes\_gameobjects::getownerteam() != level.flags[i].adjflags[j].useobj maps\mp\gametypes\_gameobjects::getownerteam() ) + { + bflags[bflags.size] = level.flags[i]; + break; + } + } + } + + return bflags; +} + +getboundaryflagspawns( team ) +{ + spawns = []; + bflags = getboundaryflags(); + + for ( i = 0; i < bflags.size; i++ ) + { + if ( isdefined( team ) && bflags[i] getflagteam() != team ) + continue; + + for ( j = 0; j < bflags[i].nearbyspawns.size; j++ ) + spawns[spawns.size] = bflags[i].nearbyspawns[j]; + } + + return spawns; +} + +getspawnsboundingflag( avoidflag ) +{ + spawns = []; + + for ( i = 0; i < level.flags.size; i++ ) + { + flag = level.flags[i]; + + if ( flag == avoidflag ) + continue; + + isbounding = 0; + + for ( j = 0; j < flag.adjflags.size; j++ ) + { + if ( flag.adjflags[j] == avoidflag ) + { + isbounding = 1; + break; + } + } + + if ( !isbounding ) + continue; + + for ( j = 0; j < flag.nearbyspawns.size; j++ ) + spawns[spawns.size] = flag.nearbyspawns[j]; + } + + return spawns; +} + +getownedandboundingflagspawns( team ) +{ + spawns = []; + + for ( i = 0; i < level.flags.size; i++ ) + { + if ( level.flags[i] getflagteam() == team ) + { + for ( s = 0; s < level.flags[i].nearbyspawns.size; s++ ) + spawns[spawns.size] = level.flags[i].nearbyspawns[s]; + + continue; + } + + for ( j = 0; j < level.flags[i].adjflags.size; j++ ) + { + if ( level.flags[i].adjflags[j] getflagteam() == team ) + { + for ( s = 0; s < level.flags[i].nearbyspawns.size; s++ ) + spawns[spawns.size] = level.flags[i].nearbyspawns[s]; + + break; + } + } + } + + return spawns; +} + +getownedflagspawns( team ) +{ + spawns = []; + + for ( i = 0; i < level.flags.size; i++ ) + { + if ( level.flags[i] getflagteam() == team ) + { + for ( s = 0; s < level.flags[i].nearbyspawns.size; s++ ) + spawns[spawns.size] = level.flags[i].nearbyspawns[s]; + } + } + + return spawns; +} + +flagsetup() +{ + maperrors = []; + descriptorsbylinkname = []; + descriptors = getentarray( "flag_descriptor", "targetname" ); + flags = level.flags; + + for ( i = 0; i < level.domflags.size; i++ ) + { + closestdist = undefined; + closestdesc = undefined; + + for ( j = 0; j < descriptors.size; j++ ) + { + dist = distance( flags[i].origin, descriptors[j].origin ); + + if ( !isdefined( closestdist ) || dist < closestdist ) + { + closestdist = dist; + closestdesc = descriptors[j]; + } + } + + if ( !isdefined( closestdesc ) ) + { + maperrors[maperrors.size] = "there is no flag_descriptor in the map! see explanation in dom.gsc"; + break; + } + + if ( isdefined( closestdesc.flag ) ) + { + maperrors[maperrors.size] = "flag_descriptor with script_linkname \"" + closestdesc.script_linkname + "\" is nearby more than one flag; is there a unique descriptor near each flag?"; + continue; + } + + flags[i].descriptor = closestdesc; + closestdesc.flag = flags[i]; + descriptorsbylinkname[closestdesc.script_linkname] = closestdesc; + } + + if ( maperrors.size == 0 ) + { + for ( i = 0; i < flags.size; i++ ) + { + if ( isdefined( flags[i].descriptor.script_linkto ) ) + adjdescs = strtok( flags[i].descriptor.script_linkto, " " ); + else + adjdescs = []; + + for ( j = 0; j < adjdescs.size; j++ ) + { + otherdesc = descriptorsbylinkname[adjdescs[j]]; + + if ( !isdefined( otherdesc ) || otherdesc.targetname != "flag_descriptor" ) + { + maperrors[maperrors.size] = "flag_descriptor with script_linkname \"" + flags[i].descriptor.script_linkname + "\" linked to \"" + adjdescs[j] + "\" which does not exist as a script_linkname of any other entity with a targetname of flag_descriptor (or, if it does, that flag_descriptor has not been assigned to a flag)"; + continue; + } + + adjflag = otherdesc.flag; + + if ( adjflag == flags[i] ) + { + maperrors[maperrors.size] = "flag_descriptor with script_linkname \"" + flags[i].descriptor.script_linkname + "\" linked to itself"; + continue; + } + + flags[i].adjflags[flags[i].adjflags.size] = adjflag; + } + } + } + + spawnpoints = maps\mp\gametypes\_spawnlogic::getspawnpointarray( "mp_dom_spawn" ); + + for ( i = 0; i < spawnpoints.size; i++ ) + { + if ( isdefined( spawnpoints[i].script_linkto ) ) + { + desc = descriptorsbylinkname[spawnpoints[i].script_linkto]; + + if ( !isdefined( desc ) || desc.targetname != "flag_descriptor" ) + { + maperrors[maperrors.size] = "Spawnpoint at " + spawnpoints[i].origin + "\" linked to \"" + spawnpoints[i].script_linkto + "\" which does not exist as a script_linkname of any entity with a targetname of flag_descriptor (or, if it does, that flag_descriptor has not been assigned to a flag)"; + continue; + } + + nearestflag = desc.flag; + } + else + { + nearestflag = undefined; + nearestdist = undefined; + + for ( j = 0; j < flags.size; j++ ) + { + dist = distancesquared( flags[j].origin, spawnpoints[i].origin ); + + if ( !isdefined( nearestflag ) || dist < nearestdist ) + { + nearestflag = flags[j]; + nearestdist = dist; + } + } + } + + nearestflag.nearbyspawns[nearestflag.nearbyspawns.size] = spawnpoints[i]; + } + + if ( maperrors.size > 0 ) + { +/# + println( "^1------------ Map Errors ------------" ); + + for ( i = 0; i < maperrors.size; i++ ) + println( maperrors[i] ); + + println( "^1------------------------------------" ); + maps\mp\_utility::error( "Map errors. See above" ); +#/ + maps\mp\gametypes\_callbacksetup::abortlevel(); + return; + } +} + +createflagspawninfluencers() +{ + ss = level.spawnsystem; + + for ( flag_index = 0; flag_index < level.flags.size; flag_index++ ) + { + if ( level.domflags[flag_index] == self ) + break; + } + + abc = []; + abc[0] = "A"; + abc[1] = "B"; + abc[2] = "C"; + self.owned_flag_influencer = addsphereinfluencer( level.spawnsystem.einfluencer_type_game_mode, self.trigger.origin, ss.dom_owned_flag_influencer_radius[flag_index], ss.dom_owned_flag_influencer_score[flag_index], 0, "dom_owned_flag_" + abc[flag_index] + ",r,s", maps\mp\gametypes\_spawning::get_score_curve_index( ss.dom_owned_flag_influencer_score_curve ) ); + self.neutral_flag_influencer = addsphereinfluencer( level.spawnsystem.einfluencer_type_game_mode, self.trigger.origin, ss.dom_unowned_flag_influencer_radius, ss.dom_unowned_flag_influencer_score, 0, "dom_unowned_flag,r,s", maps\mp\gametypes\_spawning::get_score_curve_index( ss.dom_owned_flag_influencer_score_curve ) ); + self.enemy_flag_influencer = addsphereinfluencer( level.spawnsystem.einfluencer_type_game_mode, self.trigger.origin, ss.dom_enemy_flag_influencer_radius[flag_index], ss.dom_enemy_flag_influencer_score[flag_index], 0, "dom_enemy_flag_" + abc[flag_index] + ",r,s", maps\mp\gametypes\_spawning::get_score_curve_index( ss.dom_enemy_flag_influencer_score_curve ) ); + self update_spawn_influencers( "neutral" ); +} + +update_spawn_influencers( team ) +{ +/# + assert( isdefined( self.neutral_flag_influencer ) ); #/ /# - assert( isDefined( self.owned_flag_influencer ) ); + assert( isdefined( self.owned_flag_influencer ) ); #/ /# - assert( isDefined( self.enemy_flag_influencer ) ); + assert( isdefined( self.enemy_flag_influencer ) ); #/ - */ - if ( team == "neutral" ) - { - enableinfluencer( self.neutral_flag_influencer, 1 ); - enableinfluencer( self.owned_flag_influencer, 0 ); - enableinfluencer( self.enemy_flag_influencer, 0 ); - } - else - { - enableinfluencer( self.neutral_flag_influencer, 0 ); - enableinfluencer( self.owned_flag_influencer, 1 ); - enableinfluencer( self.enemy_flag_influencer, 1 ); - setinfluencerteammask( self.owned_flag_influencer, getteammask( team ) ); - setinfluencerteammask( self.enemy_flag_influencer, getotherteamsmask( team ) ); - } + + if ( team == "neutral" ) + { + enableinfluencer( self.neutral_flag_influencer, 1 ); + enableinfluencer( self.owned_flag_influencer, 0 ); + enableinfluencer( self.enemy_flag_influencer, 0 ); + } + else + { + enableinfluencer( self.neutral_flag_influencer, 0 ); + enableinfluencer( self.owned_flag_influencer, 1 ); + enableinfluencer( self.enemy_flag_influencer, 1 ); + setinfluencerteammask( self.owned_flag_influencer, getteammask( team ) ); + setinfluencerteammask( self.enemy_flag_influencer, getotherteamsmask( team ) ); + } } -dom_gamemodespawndvars( reset_dvars ) //checked matches cerberus output +dom_gamemodespawndvars( reset_dvars ) { - ss = level.spawnsystem; - ss.dom_owned_flag_influencer_score = []; - ss.dom_owned_flag_influencer_radius = []; - ss.dom_owned_flag_influencer_score[ 0 ] = set_dvar_float_if_unset( "scr_spawn_dom_owned_flag_A_influencer_score", "10", reset_dvars ); - ss.dom_owned_flag_influencer_radius[ 0 ] = set_dvar_float_if_unset( "scr_spawn_dom_owned_flag_A_influencer_radius", "" + ( 15 * get_player_height() ), reset_dvars ); - ss.dom_owned_flag_influencer_score[ 1 ] = set_dvar_float_if_unset( "scr_spawn_dom_owned_flag_B_influencer_score", "10", reset_dvars ); - ss.dom_owned_flag_influencer_radius[ 1 ] = set_dvar_float_if_unset( "scr_spawn_dom_owned_flag_B_influencer_radius", "" + ( 15 * get_player_height() ), reset_dvars ); - ss.dom_owned_flag_influencer_score[ 2 ] = set_dvar_float_if_unset( "scr_spawn_dom_owned_flag_C_influencer_score", "10", reset_dvars ); - ss.dom_owned_flag_influencer_radius[ 2 ] = set_dvar_float_if_unset( "scr_spawn_dom_owned_flag_C_influencer_radius", "" + ( 15 * get_player_height() ), reset_dvars ); - ss.dom_owned_flag_influencer_score_curve = set_dvar_if_unset( "scr_spawn_dom_owned_flag_influencer_score_curve", "constant", reset_dvars ); - ss.dom_enemy_flag_influencer_score = []; - ss.dom_enemy_flag_influencer_radius = []; - ss.dom_enemy_flag_influencer_score[ 0 ] = set_dvar_float_if_unset( "scr_spawn_dom_enemy_flag_A_influencer_score", "-50", reset_dvars ); - ss.dom_enemy_flag_influencer_radius[ 0 ] = set_dvar_float_if_unset( "scr_spawn_dom_enemy_flag_A_influencer_radius", "" + ( 15 * get_player_height() ), reset_dvars ); - ss.dom_enemy_flag_influencer_score[ 1 ] = set_dvar_float_if_unset( "scr_spawn_dom_enemy_flag_B_influencer_score", "-50", reset_dvars ); - ss.dom_enemy_flag_influencer_radius[ 1 ] = set_dvar_float_if_unset( "scr_spawn_dom_enemy_flag_B_influencer_radius", "" + ( 15 * get_player_height() ), reset_dvars ); - ss.dom_enemy_flag_influencer_score[ 2 ] = set_dvar_float_if_unset( "scr_spawn_dom_enemy_flag_C_influencer_score", "-50", reset_dvars ); - ss.dom_enemy_flag_influencer_radius[ 2 ] = set_dvar_float_if_unset( "scr_spawn_dom_enemy_flag_C_influencer_radius", "" + ( 15 * get_player_height() ), reset_dvars ); - ss.dom_enemy_flag_influencer_score_curve = set_dvar_if_unset( "scr_spawn_dom_enemy_flag_influencer_score_curve", "constant", reset_dvars ); - ss.dom_unowned_flag_influencer_score = set_dvar_float_if_unset( "scr_spawn_dom_unowned_flag_influencer_score", "-500", reset_dvars ); - ss.dom_unowned_flag_influencer_score_curve = set_dvar_if_unset( "scr_spawn_dom_unowned_flag_influencer_score_curve", "constant", reset_dvars ); - ss.dom_unowned_flag_influencer_radius = set_dvar_float_if_unset( "scr_spawn_dom_unowned_flag_influencer_radius", "" + ( 15 * get_player_height() ), reset_dvars ); + ss = level.spawnsystem; + ss.dom_owned_flag_influencer_score = []; + ss.dom_owned_flag_influencer_radius = []; + ss.dom_owned_flag_influencer_score[0] = set_dvar_float_if_unset( "scr_spawn_dom_owned_flag_A_influencer_score", "10", reset_dvars ); + ss.dom_owned_flag_influencer_radius[0] = set_dvar_float_if_unset( "scr_spawn_dom_owned_flag_A_influencer_radius", "" + 15.0 * get_player_height(), reset_dvars ); + ss.dom_owned_flag_influencer_score[1] = set_dvar_float_if_unset( "scr_spawn_dom_owned_flag_B_influencer_score", "10", reset_dvars ); + ss.dom_owned_flag_influencer_radius[1] = set_dvar_float_if_unset( "scr_spawn_dom_owned_flag_B_influencer_radius", "" + 15.0 * get_player_height(), reset_dvars ); + ss.dom_owned_flag_influencer_score[2] = set_dvar_float_if_unset( "scr_spawn_dom_owned_flag_C_influencer_score", "10", reset_dvars ); + ss.dom_owned_flag_influencer_radius[2] = set_dvar_float_if_unset( "scr_spawn_dom_owned_flag_C_influencer_radius", "" + 15.0 * get_player_height(), reset_dvars ); + ss.dom_owned_flag_influencer_score_curve = set_dvar_if_unset( "scr_spawn_dom_owned_flag_influencer_score_curve", "constant", reset_dvars ); + ss.dom_enemy_flag_influencer_score = []; + ss.dom_enemy_flag_influencer_radius = []; + ss.dom_enemy_flag_influencer_score[0] = set_dvar_float_if_unset( "scr_spawn_dom_enemy_flag_A_influencer_score", "-50", reset_dvars ); + ss.dom_enemy_flag_influencer_radius[0] = set_dvar_float_if_unset( "scr_spawn_dom_enemy_flag_A_influencer_radius", "" + 15.0 * get_player_height(), reset_dvars ); + ss.dom_enemy_flag_influencer_score[1] = set_dvar_float_if_unset( "scr_spawn_dom_enemy_flag_B_influencer_score", "-50", reset_dvars ); + ss.dom_enemy_flag_influencer_radius[1] = set_dvar_float_if_unset( "scr_spawn_dom_enemy_flag_B_influencer_radius", "" + 15.0 * get_player_height(), reset_dvars ); + ss.dom_enemy_flag_influencer_score[2] = set_dvar_float_if_unset( "scr_spawn_dom_enemy_flag_C_influencer_score", "-50", reset_dvars ); + ss.dom_enemy_flag_influencer_radius[2] = set_dvar_float_if_unset( "scr_spawn_dom_enemy_flag_C_influencer_radius", "" + 15.0 * get_player_height(), reset_dvars ); + ss.dom_enemy_flag_influencer_score_curve = set_dvar_if_unset( "scr_spawn_dom_enemy_flag_influencer_score_curve", "constant", reset_dvars ); + ss.dom_unowned_flag_influencer_score = set_dvar_float_if_unset( "scr_spawn_dom_unowned_flag_influencer_score", "-500", reset_dvars ); + ss.dom_unowned_flag_influencer_score_curve = set_dvar_if_unset( "scr_spawn_dom_unowned_flag_influencer_score_curve", "constant", reset_dvars ); + ss.dom_unowned_flag_influencer_radius = set_dvar_float_if_unset( "scr_spawn_dom_unowned_flag_influencer_radius", "" + 15.0 * get_player_height(), reset_dvars ); } -addspawnpointsforflag( team, flag_team, flagspawnname ) //checked matches cerberus output +addspawnpointsforflag( team, flag_team, flagspawnname ) { - if ( game[ "switchedsides" ] ) - { - team = getotherteam( team ); - } - otherteam = getotherteam( team ); - if ( flag_team != otherteam ) - { - maps/mp/gametypes/_spawnlogic::addspawnpoints( team, flagspawnname ); - } + if ( game["switchedsides"] ) + team = getotherteam( team ); + + otherteam = getotherteam( team ); + + if ( flag_team != otherteam ) + maps\mp\gametypes\_spawnlogic::addspawnpoints( team, flagspawnname ); } -change_dom_spawns() //checked changed to match cerberus output +change_dom_spawns() { - maps/mp/gametypes/_spawnlogic::clearspawnpoints(); - maps/mp/gametypes/_spawnlogic::addspawnpoints( "allies", "mp_dom_spawn" ); - maps/mp/gametypes/_spawnlogic::addspawnpoints( "axis", "mp_dom_spawn" ); - flag_number = level.flags.size; - if ( dominated_check() ) - { - for ( i = 0; i < flag_number; i++ ) - { - label = level.flags[ i ].useobj maps/mp/gametypes/_gameobjects::getlabel(); - flagspawnname = "mp_dom_spawn_flag" + label; - maps/mp/gametypes/_spawnlogic::addspawnpoints( "allies", flagspawnname ); - maps/mp/gametypes/_spawnlogic::addspawnpoints( "axis", flagspawnname ); - } - } - else - { - for ( i = 0; i < flag_number; i++ ) - { - label = level.flags[ i ].useobj maps/mp/gametypes/_gameobjects::getlabel(); - flagspawnname = "mp_dom_spawn_flag" + label; - flag_team = level.flags[ i ] getflagteam(); - addspawnpointsforflag( "allies", flag_team, flagspawnname ); - addspawnpointsforflag( "axis", flag_team, flagspawnname ); - } - } - maps/mp/gametypes/_spawning::updateallspawnpoints(); + maps\mp\gametypes\_spawnlogic::clearspawnpoints(); + maps\mp\gametypes\_spawnlogic::addspawnpoints( "allies", "mp_dom_spawn" ); + maps\mp\gametypes\_spawnlogic::addspawnpoints( "axis", "mp_dom_spawn" ); + flag_number = level.flags.size; + + if ( dominated_check() ) + { + for ( i = 0; i < flag_number; i++ ) + { + label = level.flags[i].useobj maps\mp\gametypes\_gameobjects::getlabel(); + flagspawnname = "mp_dom_spawn_flag" + label; + maps\mp\gametypes\_spawnlogic::addspawnpoints( "allies", flagspawnname ); + maps\mp\gametypes\_spawnlogic::addspawnpoints( "axis", flagspawnname ); + } + } + else + { + for ( i = 0; i < flag_number; i++ ) + { + label = level.flags[i].useobj maps\mp\gametypes\_gameobjects::getlabel(); + flagspawnname = "mp_dom_spawn_flag" + label; + flag_team = level.flags[i] getflagteam(); + addspawnpointsforflag( "allies", flag_team, flagspawnname ); + addspawnpointsforflag( "axis", flag_team, flagspawnname ); + } + } + + maps\mp\gametypes\_spawning::updateallspawnpoints(); } -dominated_challenge_check() //checked changed to match cerberus output +dominated_challenge_check() { - num_flags = level.flags.size; - allied_flags = 0; - axis_flags = 0; - for ( i = 0; i < num_flags; i++ ) - { - flag_team = level.flags[ i ] getflagteam(); - if ( flag_team == "allies" ) - { - allied_flags++; - } - else if ( flag_team == "axis" ) - { - axis_flags++; - } - else - { - return 0; - } - if ( ( allied_flags > 0 ) && ( axis_flags > 0 ) ) - { - return 0; - } - } - return 1; + num_flags = level.flags.size; + allied_flags = 0; + axis_flags = 0; + + for ( i = 0; i < num_flags; i++ ) + { + flag_team = level.flags[i] getflagteam(); + + if ( flag_team == "allies" ) + allied_flags++; + else if ( flag_team == "axis" ) + axis_flags++; + else + return false; + + if ( allied_flags > 0 && axis_flags > 0 ) + return false; + } + + return true; } -dominated_check() //checked changed to match cerberus output +dominated_check() { - num_flags = level.flags.size; - allied_flags = 0; - axis_flags = 0; - for ( i = 0; i < num_flags; i++ ) - { - flag_team = level.flags[ i ] getflagteam(); - if ( flag_team == "allies" ) - { - allied_flags++; - } - else if ( flag_team == "axis" ) - { - axis_flags++; - } - if ( ( allied_flags > 0 ) && ( axis_flags > 0 ) ) - { - return 0; - } - } - return 1; + num_flags = level.flags.size; + allied_flags = 0; + axis_flags = 0; + + for ( i = 0; i < num_flags; i++ ) + { + flag_team = level.flags[i] getflagteam(); + + if ( flag_team == "allies" ) + allied_flags++; + else if ( flag_team == "axis" ) + axis_flags++; + + if ( allied_flags > 0 && axis_flags > 0 ) + return false; + } + + return true; } -updatecapsperminute( lastownerteam ) //checked matches cerberus output +updatecapsperminute( lastownerteam ) { - if ( !isDefined( self.capsperminute ) ) - { - self.numcaps = 0; - self.capsperminute = 0; - } - if ( lastownerteam == "neutral" ) - { - return; - } - self.numcaps++; - minutespassed = maps/mp/gametypes/_globallogic_utils::gettimepassed() / 60000; - if ( isplayer( self ) && isDefined( self.timeplayed[ "total" ] ) ) - { - minutespassed = self.timeplayed[ "total" ] / 60; - } - self.capsperminute = self.numcaps / minutespassed; - if ( self.capsperminute > self.numcaps ) - { - self.capsperminute = self.numcaps; - } + if ( !isdefined( self.capsperminute ) ) + { + self.numcaps = 0; + self.capsperminute = 0; + } + + if ( lastownerteam == "neutral" ) + return; + + self.numcaps++; + minutespassed = maps\mp\gametypes\_globallogic_utils::gettimepassed() / 60000; + + if ( isplayer( self ) && isdefined( self.timeplayed["total"] ) ) + minutespassed = self.timeplayed["total"] / 60; + + self.capsperminute = self.numcaps / minutespassed; + + if ( self.capsperminute > self.numcaps ) + self.capsperminute = self.numcaps; } -isscoreboosting( player, flag ) //checked matches cerberus output +isscoreboosting( player, flag ) { - if ( !level.rankedmatch ) - { - return 0; - } - if ( player.capsperminute > level.playercapturelpm ) - { - return 1; - } - if ( flag.capsperminute > level.flagcapturelpm ) - { - return 1; - } - return 0; + if ( !level.rankedmatch ) + return false; + + if ( player.capsperminute > level.playercapturelpm ) + return true; + + if ( flag.capsperminute > level.flagcapturelpm ) + return true; + + return false; } -onupdateuserate() //checked changed to match cerberus output +onupdateuserate() { - if ( !isDefined( self.contested ) ) - { - self.contested = 0; - } - numother = getnumtouchingexceptteam( self.ownerteam ); - numowners = self.numtouching[ self.claimteam ]; - previousstate = self.contested; - if ( numother > 0 && numowners > 0 ) - { - self.contested = 1; - } - else if ( previousstate == 1 ) - { - self notify( "contest_over" ); - } - self.contested = 0; -} + if ( !isdefined( self.contested ) ) + self.contested = 0; + numother = getnumtouchingexceptteam( self.ownerteam ); + numowners = self.numtouching[self.claimteam]; + previousstate = self.contested; + + if ( numother > 0 && numowners > 0 ) + self.contested = 1; + else + { + if ( previousstate == 1 ) + self notify( "contest_over" ); + + self.contested = 0; + } +} diff --git a/Multiplayer Core/patch_mp/maps/mp/gametypes/gun.gsc b/Multiplayer Core/patch_mp/maps/mp/gametypes/gun.gsc index 50a8344..e687421 100644 --- a/Multiplayer Core/patch_mp/maps/mp/gametypes/gun.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/gametypes/gun.gsc @@ -1,398 +1,383 @@ -#include maps/mp/gametypes/_persistence; -#include maps/mp/gametypes/_spawnlogic; -#include maps/mp/gametypes/_spawning; -#include maps/mp/gametypes/_rank; -#include maps/mp/gametypes/_globallogic_audio; -#include maps/mp/_scoreevents; -#include maps/mp/gametypes/_globallogic_score; -#include maps/mp/gametypes/_wager; -#include maps/mp/gametypes/_callbacksetup; -#include maps/mp/gametypes/_globallogic; -#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 -main() //checked matches cerberus output +main() { - maps/mp/gametypes/_globallogic::init(); - maps/mp/gametypes/_callbacksetup::setupcallbacks(); - maps/mp/gametypes/_globallogic::setupcallbacks(); - level.onstartgametype = ::onstartgametype; - level.onspawnplayer = ::onspawnplayer; - level.onspawnplayerunified = ::onspawnplayerunified; - level.onplayerkilled = ::onplayerkilled; - level.onwagerawards = ::onwagerawards; - level.onendgame = ::onendgame; - game[ "dialog" ][ "gametype" ] = "gg_start"; - game[ "dialog" ][ "wm_promoted" ] = "gg_promote"; - game[ "dialog" ][ "wm_humiliation" ] = "mpl_wager_humiliate"; - game[ "dialog" ][ "wm_humiliated" ] = "sns_hum"; - level.givecustomloadout = ::givecustomloadout; - precachestring( &"MPUI_PLAYER_KILLED" ); - precachestring( &"MP_GUN_NEXT_LEVEL" ); - precachestring( &"MP_GUN_PREV_LEVEL" ); - precachestring( &"MP_GUN_PREV_LEVEL_OTHER" ); - precachestring( &"MP_HUMILIATION" ); - precachestring( &"MP_HUMILIATED" ); - precacheitem( "minigun_wager_mp" ); - precacheitem( "m32_wager_mp" ); - level.setbacksperdemotion = getgametypesetting( "setbacks" ); - gunlist = getgametypesetting( "gunSelection" ); - if ( gunlist == 3 ) - { - gunlist = randomintrange( 0, 3 ); - } - switch( gunlist ) - { - case 0: - addguntoprogression( "beretta93r_mp+tacknife" ); - addguntoprogression( "kard_dw_mp" ); - addguntoprogression( "judge_mp+steadyaim" ); - addguntoprogression( "ksg_mp+fastads" ); - addguntoprogression( "srm1216_mp+extclip" ); - addguntoprogression( "insas_mp+grip" ); - addguntoprogression( "evoskorpion_mp+steadyaim" ); - addguntoprogression( "qcw05_mp+reflex" ); - addguntoprogression( "hk416_mp+mms" ); - addguntoprogression( "xm8_mp+holo" ); - addguntoprogression( "saritch_mp+acog" ); - addguntoprogression( "qbb95_mp+rangefinder" ); - addguntoprogression( "mk48_mp+dualoptic", "dualoptic_mk48_mp+dualoptic" ); - addguntoprogression( "svu_mp+ir" ); - addguntoprogression( "dsr50_mp+vzoom" ); - addguntoprogression( "ballista_mp+is" ); - addguntoprogression( "smaw_mp" ); - addguntoprogression( "usrpg_mp" ); - addguntoprogression( "crossbow_mp" ); - addguntoprogression( "knife_ballistic_mp" ); - break; - case 1: - addguntoprogression( "fiveseven_mp" ); - addguntoprogression( "fnp45_mp" ); - addguntoprogression( "kard_mp" ); - addguntoprogression( "beretta93r_mp" ); - addguntoprogression( "judge_mp" ); - addguntoprogression( "ksg_mp" ); - addguntoprogression( "870mcs_mp" ); - addguntoprogression( "saiga12_mp" ); - addguntoprogression( "srm1216_mp" ); - addguntoprogression( "mp7_mp" ); - addguntoprogression( "evoskorpion_mp" ); - addguntoprogression( "pdw57_mp" ); - addguntoprogression( "insas_mp" ); - addguntoprogression( "vector_mp" ); - addguntoprogression( "qcw05_mp" ); - addguntoprogression( "m32_wager_mp" ); - addguntoprogression( "smaw_mp" ); - addguntoprogression( "usrpg_mp" ); - addguntoprogression( "crossbow_mp" ); - addguntoprogression( "knife_ballistic_mp" ); - break; - case 2: - addguntoprogression( "hk416_mp" ); - addguntoprogression( "scar_mp" ); - addguntoprogression( "tar21_mp" ); - addguntoprogression( "an94_mp" ); - addguntoprogression( "type95_mp" ); - addguntoprogression( "xm8_mp" ); - addguntoprogression( "sig556_mp" ); - addguntoprogression( "sa58_mp" ); - addguntoprogression( "saritch_mp" ); - addguntoprogression( "hamr_mp" ); - addguntoprogression( "lsat_mp" ); - addguntoprogression( "qbb95_mp" ); - addguntoprogression( "mk48_mp" ); - addguntoprogression( "svu_mp" ); - addguntoprogression( "as50_mp" ); - addguntoprogression( "dsr50_mp" ); - addguntoprogression( "ballista_mp+is" ); - addguntoprogression( "usrpg_mp" ); - addguntoprogression( "crossbow_mp" ); - addguntoprogression( "knife_ballistic_mp" ); - break; - } - registertimelimit( 0, 1440 ); - registerroundlimit( 0, 10 ); - registerroundwinlimit( 0, 10 ); - registernumlives( 0, 100 ); - setscoreboardcolumns( "pointstowin", "kills", "deaths", "stabs", "humiliated" ); + maps\mp\gametypes\_globallogic::init(); + maps\mp\gametypes\_callbacksetup::setupcallbacks(); + maps\mp\gametypes\_globallogic::setupcallbacks(); + level.onstartgametype = ::onstartgametype; + level.onspawnplayer = ::onspawnplayer; + level.onspawnplayerunified = ::onspawnplayerunified; + level.onplayerkilled = ::onplayerkilled; + level.onwagerawards = ::onwagerawards; + level.onendgame = ::onendgame; + game["dialog"]["gametype"] = "gg_start"; + game["dialog"]["wm_promoted"] = "gg_promote"; + game["dialog"]["wm_humiliation"] = "mpl_wager_humiliate"; + game["dialog"]["wm_humiliated"] = "sns_hum"; + level.givecustomloadout = ::givecustomloadout; + precachestring( &"MPUI_PLAYER_KILLED" ); + precachestring( &"MP_GUN_NEXT_LEVEL" ); + precachestring( &"MP_GUN_PREV_LEVEL" ); + precachestring( &"MP_GUN_PREV_LEVEL_OTHER" ); + precachestring( &"MP_HUMILIATION" ); + precachestring( &"MP_HUMILIATED" ); + precacheitem( "minigun_wager_mp" ); + precacheitem( "m32_wager_mp" ); + level.setbacksperdemotion = getgametypesetting( "setbacks" ); + gunlist = getgametypesetting( "gunSelection" ); + + if ( gunlist == 3 ) + gunlist = randomintrange( 0, 3 ); + + switch ( gunlist ) + { + case 0: + addguntoprogression( "beretta93r_mp+tacknife" ); + addguntoprogression( "kard_dw_mp" ); + addguntoprogression( "judge_mp+steadyaim" ); + addguntoprogression( "ksg_mp+fastads" ); + addguntoprogression( "srm1216_mp+extclip" ); + addguntoprogression( "insas_mp+grip" ); + addguntoprogression( "evoskorpion_mp+steadyaim" ); + addguntoprogression( "qcw05_mp+reflex" ); + addguntoprogression( "hk416_mp+mms" ); + addguntoprogression( "xm8_mp+holo" ); + addguntoprogression( "saritch_mp+acog" ); + addguntoprogression( "qbb95_mp+rangefinder" ); + addguntoprogression( "mk48_mp+dualoptic", "dualoptic_mk48_mp+dualoptic" ); + addguntoprogression( "svu_mp+ir" ); + addguntoprogression( "dsr50_mp+vzoom" ); + addguntoprogression( "ballista_mp+is" ); + addguntoprogression( "smaw_mp" ); + addguntoprogression( "usrpg_mp" ); + addguntoprogression( "crossbow_mp" ); + addguntoprogression( "knife_ballistic_mp" ); + break; + case 1: + addguntoprogression( "fiveseven_mp" ); + addguntoprogression( "fnp45_mp" ); + addguntoprogression( "kard_mp" ); + addguntoprogression( "beretta93r_mp" ); + addguntoprogression( "judge_mp" ); + addguntoprogression( "ksg_mp" ); + addguntoprogression( "870mcs_mp" ); + addguntoprogression( "saiga12_mp" ); + addguntoprogression( "srm1216_mp" ); + addguntoprogression( "mp7_mp" ); + addguntoprogression( "evoskorpion_mp" ); + addguntoprogression( "pdw57_mp" ); + addguntoprogression( "insas_mp" ); + addguntoprogression( "vector_mp" ); + addguntoprogression( "qcw05_mp" ); + addguntoprogression( "m32_wager_mp" ); + addguntoprogression( "smaw_mp" ); + addguntoprogression( "usrpg_mp" ); + addguntoprogression( "crossbow_mp" ); + addguntoprogression( "knife_ballistic_mp" ); + break; + case 2: + addguntoprogression( "hk416_mp" ); + addguntoprogression( "scar_mp" ); + addguntoprogression( "tar21_mp" ); + addguntoprogression( "an94_mp" ); + addguntoprogression( "type95_mp" ); + addguntoprogression( "xm8_mp" ); + addguntoprogression( "sig556_mp" ); + addguntoprogression( "sa58_mp" ); + addguntoprogression( "saritch_mp" ); + addguntoprogression( "hamr_mp" ); + addguntoprogression( "lsat_mp" ); + addguntoprogression( "qbb95_mp" ); + addguntoprogression( "mk48_mp" ); + addguntoprogression( "svu_mp" ); + addguntoprogression( "as50_mp" ); + addguntoprogression( "dsr50_mp" ); + addguntoprogression( "ballista_mp+is" ); + addguntoprogression( "usrpg_mp" ); + addguntoprogression( "crossbow_mp" ); + addguntoprogression( "knife_ballistic_mp" ); + break; + } + + registertimelimit( 0, 1440 ); + registerroundlimit( 0, 10 ); + registerroundwinlimit( 0, 10 ); + registernumlives( 0, 100 ); + setscoreboardcolumns( "pointstowin", "kills", "deaths", "stabs", "humiliated" ); } -addguntoprogression( gunname, altname ) //checked matches cerberus output +addguntoprogression( gunname, altname ) { - if ( !isDefined( level.gunprogression ) ) - { - level.gunprogression = []; - } - newweapon = spawnstruct(); - newweapon.names = []; - newweapon.names[ newweapon.names.size ] = gunname; - if ( isDefined( altname ) ) - { - newweapon.names[ newweapon.names.size ] = altname; - } - level.gunprogression[ level.gunprogression.size ] = newweapon; + if ( !isdefined( level.gunprogression ) ) + level.gunprogression = []; + + newweapon = spawnstruct(); + newweapon.names = []; + newweapon.names[newweapon.names.size] = gunname; + + if ( isdefined( altname ) ) + newweapon.names[newweapon.names.size] = altname; + + level.gunprogression[level.gunprogression.size] = newweapon; } -givecustomloadout( takeallweapons, alreadyspawned ) //checked matches cerberus output +givecustomloadout( takeallweapons, alreadyspawned ) { - chooserandombody = 0; - if ( !isDefined( alreadyspawned ) || !alreadyspawned ) - { - chooserandombody = 1; - } - if ( !isDefined( self.gunprogress ) ) - { - self.gunprogress = 0; - } - currentweapon = level.gunprogression[ self.gunprogress ].names[ 0 ]; - self maps/mp/gametypes/_wager::setupblankrandomplayer( takeallweapons, chooserandombody, currentweapon ); - self disableweaponcycling(); - self giveweapon( currentweapon ); - self switchtoweapon( currentweapon ); - self giveweapon( "knife_mp" ); - if ( !isDefined( alreadyspawned ) || !alreadyspawned ) - { - self setspawnweapon( currentweapon ); - } - if ( !is_true( takeallweapons ) ) - { - self thread takeoldweapons( currentweapon ); - } - else - { - self enableweaponcycling(); - } - return currentweapon; + chooserandombody = 0; + + if ( !isdefined( alreadyspawned ) || !alreadyspawned ) + chooserandombody = 1; + + if ( !isdefined( self.gunprogress ) ) + self.gunprogress = 0; + + currentweapon = level.gunprogression[self.gunprogress].names[0]; + self maps\mp\gametypes\_wager::setupblankrandomplayer( takeallweapons, chooserandombody, currentweapon ); + self disableweaponcycling(); + self giveweapon( currentweapon ); + self switchtoweapon( currentweapon ); + self giveweapon( "knife_mp" ); + + if ( !isdefined( alreadyspawned ) || !alreadyspawned ) + self setspawnweapon( currentweapon ); + + if ( isdefined( takeallweapons ) && !takeallweapons ) + self thread takeoldweapons( currentweapon ); + else + self enableweaponcycling(); + + return currentweapon; } -takeoldweapons( currentweapon ) //checked changed at own discretion +takeoldweapons( currentweapon ) { - self endon( "disconnect" ); - self endon( "death" ); - for ( ;; ) - { - self waittill( "weapon_change", newweapon ); - if ( newweapon != "none" ) - { - break; - } - } - weaponslist = self getweaponslist(); - for ( i = 0; i < weaponslist.size; i++ ) - { - if ( weaponslist[ i ] != currentweapon && weaponslist[ i ] != "knife_mp" ) - { - self takeweapon( weaponslist[ i ] ); - } - } - self enableweaponcycling(); + self endon( "disconnect" ); + self endon( "death" ); + + for (;;) + { + self waittill( "weapon_change", newweapon ); + + if ( newweapon != "none" ) + break; + } + + weaponslist = self getweaponslist(); + + for ( i = 0; i < weaponslist.size; i++ ) + { + if ( weaponslist[i] != currentweapon && weaponslist[i] != "knife_mp" ) + self takeweapon( weaponslist[i] ); + } + + self enableweaponcycling(); } -promoteplayer( weaponused ) //checked changed to match cerberus output +promoteplayer( weaponused ) { - self endon( "disconnect" ); - self endon( "cancel_promotion" ); - level endon( "game_ended" ); - wait 0.05; - for ( i = 0; i < level.gunprogression[ self.gunprogress ].names.size; i++ ) - { - //treyarchs original implementation of this if statement was cancer so i changed it to be simpler - if ( weaponused == level.gunprogression[ self.gunprogress ].names[ i ] || weaponused == "explosive_bolt_mp" && issubstr( level.gunprogression[ self.gunprogress ].names[ i ], "crossbow" ) ) - { - if ( self.gunprogress < ( level.gunprogression.size - 1 ) ) - { - self.gunprogress++; - if ( isalive( self ) ) - { - self thread givecustomloadout( 0, 1 ); - } - self thread maps/mp/gametypes/_wager::queuewagerpopup( &"MPUI_PLAYER_KILLED", 0, &"MP_GUN_NEXT_LEVEL" ); - } - pointstowin = self.pers[ "pointstowin" ]; - if ( pointstowin < level.scorelimit ) - { - self maps/mp/gametypes/_globallogic_score::givepointstowin( level.gungamekillscore ); - maps/mp/_scoreevents::processscoreevent( "kill_gun", self ); - } - self.lastpromotiontime = getTime(); - return; - } - } + self endon( "disconnect" ); + self endon( "cancel_promotion" ); + level endon( "game_ended" ); + wait 0.05; + + for ( i = 0; i < level.gunprogression[self.gunprogress].names.size; i++ ) + { + if ( weaponused == level.gunprogression[self.gunprogress].names[i] || weaponused == "explosive_bolt_mp" && ( level.gunprogression[self.gunprogress].names[i] == "crossbow_mp" || level.gunprogression[self.gunprogress].names[i] == "crossbow_mp+reflex" || level.gunprogression[self.gunprogress].names[i] == "crossbow_mp+acog" ) ) + { + if ( self.gunprogress < level.gunprogression.size - 1 ) + { + self.gunprogress++; + + if ( isalive( self ) ) + self thread givecustomloadout( 0, 1 ); + + self thread maps\mp\gametypes\_wager::queuewagerpopup( &"MPUI_PLAYER_KILLED", 0, &"MP_GUN_NEXT_LEVEL" ); + } + + pointstowin = self.pers["pointstowin"]; + + if ( pointstowin < level.scorelimit ) + { + self maps\mp\gametypes\_globallogic_score::givepointstowin( level.gungamekillscore ); + maps\mp\_scoreevents::processscoreevent( "kill_gun", self ); + } + + self.lastpromotiontime = gettime(); + return; + } + } } -demoteplayer() //checked changed to match cerberus output +demoteplayer() { - self endon( "disconnect" ); - self notify( "cancel_promotion" ); - startinggunprogress = self.gunprogress; - for ( i = 0; i < level.setbacksperdemotion; i++ ) - { - if ( self.gunprogress <= 0 ) - { - break; - } - self maps/mp/gametypes/_globallogic_score::givepointstowin( level.gungamekillscore * -1 ); - self.gunprogress--; - } - if ( startinggunprogress != self.gunprogress && isalive( self ) ) - { - self thread givecustomloadout( 0, 1 ); - } - self.pers[ "humiliated" ]++; - self.humiliated = self.pers[ "humiliated" ]; - self thread maps/mp/gametypes/_wager::queuewagerpopup( &"MP_HUMILIATED", 0, &"MP_GUN_PREV_LEVEL", "wm_humiliated" ); - self playlocalsound( game[ "dialog" ][ "wm_humiliation" ] ); - self maps/mp/gametypes/_globallogic_audio::leaderdialogonplayer( "wm_humiliated" ); + self endon( "disconnect" ); + self notify( "cancel_promotion" ); + startinggunprogress = self.gunprogress; + + for ( i = 0; i < level.setbacksperdemotion; i++ ) + { + if ( self.gunprogress <= 0 ) + break; + + self maps\mp\gametypes\_globallogic_score::givepointstowin( level.gungamekillscore * -1 ); + self.gunprogress--; + } + + if ( startinggunprogress != self.gunprogress && isalive( self ) ) + self thread givecustomloadout( 0, 1 ); + + self.pers["humiliated"]++; + self.humiliated = self.pers["humiliated"]; + self thread maps\mp\gametypes\_wager::queuewagerpopup( &"MP_HUMILIATED", 0, &"MP_GUN_PREV_LEVEL", "wm_humiliated" ); + self playlocalsound( game["dialog"]["wm_humiliation"] ); + self maps\mp\gametypes\_globallogic_audio::leaderdialogonplayer( "wm_humiliated" ); } -onplayerkilled( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ) //checked changed to match cerberus output +onplayerkilled( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ) { - if ( smeansofdeath == "MOD_SUICIDE" || smeansofdeath == "MOD_TRIGGER_HURT" ) - { - self thread demoteplayer(); - return; - } - if ( isDefined( attacker ) && isplayer( attacker ) ) - { - if ( attacker == self ) - { - self thread demoteplayer(); - return; - } - if ( isDefined( attacker.lastpromotiontime ) && ( attacker.lastpromotiontime + 3000 ) > getTime() ) - { - maps/mp/_scoreevents::processscoreevent( "kill_in_3_seconds_gun", attacker, self, sweapon ); - } - if ( smeansofdeath == "MOD_MELEE" ) - { - if ( maps/mp/gametypes/_globallogic::istopscoringplayer( self ) ) - { - maps/mp/_scoreevents::processscoreevent( "knife_leader_gun", attacker, self, sweapon ); - } - else - { - maps/mp/_scoreevents::processscoreevent( "humiliation_gun", attacker, self, sweapon ); - } - attacker playlocalsound( game[ "dialog" ][ "wm_humiliation" ] ); - self thread demoteplayer(); - } - else - { - attacker thread promoteplayer( sweapon ); - } - } + if ( smeansofdeath == "MOD_SUICIDE" || smeansofdeath == "MOD_TRIGGER_HURT" ) + { + self thread demoteplayer(); + return; + } + + if ( isdefined( attacker ) && isplayer( attacker ) ) + { + if ( attacker == self ) + { + self thread demoteplayer(); + return; + } + + if ( isdefined( attacker.lastpromotiontime ) && attacker.lastpromotiontime + 3000 > gettime() ) + maps\mp\_scoreevents::processscoreevent( "kill_in_3_seconds_gun", attacker, self, sweapon ); + + if ( smeansofdeath == "MOD_MELEE" ) + { + if ( maps\mp\gametypes\_globallogic::istopscoringplayer( self ) ) + maps\mp\_scoreevents::processscoreevent( "knife_leader_gun", attacker, self, sweapon ); + else + maps\mp\_scoreevents::processscoreevent( "humiliation_gun", attacker, self, sweapon ); + + attacker playlocalsound( game["dialog"]["wm_humiliation"] ); + self thread demoteplayer(); + } + else + attacker thread promoteplayer( sweapon ); + } } -onstartgametype() //checked matches cerberus output +onstartgametype() { - level.gungamekillscore = maps/mp/gametypes/_rank::getscoreinfovalue( "kill_gun" ); - registerscorelimit( level.gunprogression.size * level.gungamekillscore, level.gunprogression.size * level.gungamekillscore ); - setdvar( "scr_xpscale", 0 ); - setdvar( "ui_weapon_tiers", level.gunprogression.size ); - makedvarserverinfo( "ui_weapon_tiers", level.gunprogression.size ); - setclientnamemode( "auto_change" ); - setobjectivetext( "allies", &"OBJECTIVES_GUN" ); - setobjectivetext( "axis", &"OBJECTIVES_GUN" ); - if ( level.splitscreen ) - { - setobjectivescoretext( "allies", &"OBJECTIVES_GUN" ); - setobjectivescoretext( "axis", &"OBJECTIVES_GUN" ); - } - else - { - setobjectivescoretext( "allies", &"OBJECTIVES_GUN_SCORE" ); - setobjectivescoretext( "axis", &"OBJECTIVES_GUN_SCORE" ); - } - setobjectivehinttext( "allies", &"OBJECTIVES_GUN_HINT" ); - setobjectivehinttext( "axis", &"OBJECTIVES_GUN_HINT" ); - allowed = []; - allowed[ 0 ] = "gun"; - maps/mp/gametypes/_gameobjects::main( allowed ); - maps/mp/gametypes/_spawning::create_map_placed_influencers(); - level.spawnmins = ( 0, 0, 0 ); - level.spawnmaxs = ( 0, 0, 0 ); - newspawns = getentarray( "mp_wager_spawn", "classname" ); - if ( newspawns.size > 0 ) - { - maps/mp/gametypes/_spawnlogic::addspawnpoints( "allies", "mp_wager_spawn" ); - maps/mp/gametypes/_spawnlogic::addspawnpoints( "axis", "mp_wager_spawn" ); - } - else - { - maps/mp/gametypes/_spawnlogic::addspawnpoints( "allies", "mp_dm_spawn" ); - maps/mp/gametypes/_spawnlogic::addspawnpoints( "axis", "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.displayroundendtext = 0; - level.quickmessagetoall = 1; + level.gungamekillscore = maps\mp\gametypes\_rank::getscoreinfovalue( "kill_gun" ); + registerscorelimit( level.gunprogression.size * level.gungamekillscore, level.gunprogression.size * level.gungamekillscore ); + setdvar( "scr_xpscale", 0 ); + setdvar( "ui_weapon_tiers", level.gunprogression.size ); + makedvarserverinfo( "ui_weapon_tiers", level.gunprogression.size ); + setclientnamemode( "auto_change" ); + setobjectivetext( "allies", &"OBJECTIVES_GUN" ); + setobjectivetext( "axis", &"OBJECTIVES_GUN" ); + + if ( level.splitscreen ) + { + setobjectivescoretext( "allies", &"OBJECTIVES_GUN" ); + setobjectivescoretext( "axis", &"OBJECTIVES_GUN" ); + } + else + { + setobjectivescoretext( "allies", &"OBJECTIVES_GUN_SCORE" ); + setobjectivescoretext( "axis", &"OBJECTIVES_GUN_SCORE" ); + } + + setobjectivehinttext( "allies", &"OBJECTIVES_GUN_HINT" ); + setobjectivehinttext( "axis", &"OBJECTIVES_GUN_HINT" ); + allowed[0] = "gun"; + maps\mp\gametypes\_gameobjects::main( allowed ); + maps\mp\gametypes\_spawning::create_map_placed_influencers(); + level.spawnmins = ( 0, 0, 0 ); + level.spawnmaxs = ( 0, 0, 0 ); + newspawns = getentarray( "mp_wager_spawn", "classname" ); + + if ( newspawns.size > 0 ) + { + maps\mp\gametypes\_spawnlogic::addspawnpoints( "allies", "mp_wager_spawn" ); + maps\mp\gametypes\_spawnlogic::addspawnpoints( "axis", "mp_wager_spawn" ); + } + else + { + maps\mp\gametypes\_spawnlogic::addspawnpoints( "allies", "mp_dm_spawn" ); + maps\mp\gametypes\_spawnlogic::addspawnpoints( "axis", "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.displayroundendtext = 0; + level.quickmessagetoall = 1; } -onspawnplayerunified() //checked matches cerberus output +onspawnplayerunified() { - maps/mp/gametypes/_spawning::onspawnplayer_unified(); - self thread infiniteammo(); + maps\mp\gametypes\_spawning::onspawnplayer_unified(); + self thread infiniteammo(); } -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, "gun" ); - self thread infiniteammo(); - } + 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, "gun" ); + self thread infiniteammo(); + } } -infiniteammo() //checked matches cerberus output +infiniteammo() { - self endon( "death" ); - self endon( "disconnect" ); - for ( ;; ) - { - wait 0.1; - weapon = self getcurrentweapon(); - self givemaxammo( weapon ); - } + self endon( "death" ); + self endon( "disconnect" ); + + for (;;) + { + wait 0.1; + weapon = self getcurrentweapon(); + self givemaxammo( weapon ); + } } -onwagerawards() //checked matches cerberus output +onwagerawards() { - stabs = self maps/mp/gametypes/_globallogic_score::getpersstat( "stabs" ); - if ( !isDefined( stabs ) ) - { - stabs = 0; - } - self maps/mp/gametypes/_persistence::setafteractionreportstat( "wagerAwards", stabs, 0 ); - headshots = self maps/mp/gametypes/_globallogic_score::getpersstat( "headshots" ); - if ( !isDefined( headshots ) ) - { - headshots = 0; - } - self maps/mp/gametypes/_persistence::setafteractionreportstat( "wagerAwards", headshots, 1 ); - bestkillstreak = self maps/mp/gametypes/_globallogic_score::getpersstat( "best_kill_streak" ); - if ( !isDefined( bestkillstreak ) ) - { - bestkillstreak = 0; - } - self maps/mp/gametypes/_persistence::setafteractionreportstat( "wagerAwards", bestkillstreak, 2 ); + stabs = self maps\mp\gametypes\_globallogic_score::getpersstat( "stabs" ); + + if ( !isdefined( stabs ) ) + stabs = 0; + + self maps\mp\gametypes\_persistence::setafteractionreportstat( "wagerAwards", stabs, 0 ); + headshots = self maps\mp\gametypes\_globallogic_score::getpersstat( "headshots" ); + + if ( !isdefined( headshots ) ) + headshots = 0; + + self maps\mp\gametypes\_persistence::setafteractionreportstat( "wagerAwards", headshots, 1 ); + bestkillstreak = self maps\mp\gametypes\_globallogic_score::getpersstat( "best_kill_streak" ); + + if ( !isdefined( bestkillstreak ) ) + bestkillstreak = 0; + + self maps\mp\gametypes\_persistence::setafteractionreportstat( "wagerAwards", bestkillstreak, 2 ); } -onendgame( winningplayer ) //checked matches cerberus output +onendgame( winningplayer ) { - if ( isDefined( winningplayer ) && isplayer( winningplayer ) ) - { - [[ level._setplayerscore ]]( winningplayer, [[ level._getplayerscore ]]( winningplayer ) + level.gungamekillscore ); - } + if ( isdefined( winningplayer ) && isplayer( winningplayer ) ) + [[ level._setplayerscore ]]( winningplayer, [[ level._getplayerscore ]]( winningplayer ) + level.gungamekillscore ); } - diff --git a/Multiplayer Core/patch_mp/maps/mp/gametypes/hq.gsc b/Multiplayer Core/patch_mp/maps/mp/gametypes/hq.gsc index 8cd3e20..eae2566 100644 --- a/Multiplayer Core/patch_mp/maps/mp/gametypes/hq.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/gametypes/hq.gsc @@ -1,1298 +1,1262 @@ -#include maps/mp/_medals; -#include maps/mp/killstreaks/_supplydrop; -#include maps/mp/gametypes/_weapons; -#include maps/mp/_demo; -#include maps/mp/_popups; -#include maps/mp/_scoreevents; -#include maps/mp/_challenges; -#include maps/mp/gametypes/_globallogic_utils; -#include maps/mp/gametypes/_battlechatter_mp; -#include maps/mp/killstreaks/_rcbomb; -#include maps/mp/gametypes/_globallogic_audio; -#include maps/mp/gametypes/_spawnlogic; -#include maps/mp/gametypes/_spawning; -#include maps/mp/gametypes/_globallogic_score; -#include maps/mp/gametypes/_gameobjects; -#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 changed to match cerberus output +main() { - if ( getDvar( "mapname" ) == "mp_background" ) - { - return; - } - maps/mp/gametypes/_globallogic::init(); - maps/mp/gametypes/_callbacksetup::setupcallbacks(); - maps/mp/gametypes/_globallogic::setupcallbacks(); - registertimelimit( 0, 1440 ); - registerscorelimit( 0, 1000 ); - registernumlives( 0, 100 ); - registerroundswitch( 0, 9 ); - registerroundwinlimit( 0, 10 ); - maps/mp/gametypes/_globallogic::registerfriendlyfiredelay( level.gametype, 15, 0, 1440 ); - level.teambased = 1; - level.doprematch = 1; - level.overrideteamscore = 1; - level.scoreroundbased = 1; - level.onstartgametype = ::onstartgametype; - level.onspawnplayer = ::onspawnplayer; - level.onspawnplayerunified = ::onspawnplayerunified; - level.playerspawnedcb = ::koth_playerspawnedcb; - level.onroundswitch = ::onroundswitch; - level.onplayerkilled = ::onplayerkilled; - level.onendgame = ::onendgame; - level.gamemodespawndvars = ::koth_gamemodespawndvars; - precachestring( &"MP_WAITING_FOR_HQ" ); - precachestring( &"MP_HQ_CAPTURED_BY" ); - level.hqautodestroytime = getgametypesetting( "autoDestroyTime" ); - level.hqspawntime = getgametypesetting( "objectiveSpawnTime" ); - level.kothmode = getgametypesetting( "kothMode" ); - level.capturetime = getgametypesetting( "captureTime" ); - level.destroytime = getgametypesetting( "destroyTime" ); - level.delayplayer = getgametypesetting( "delayPlayer" ); - level.randomhqspawn = getgametypesetting( "randomObjectiveLocations" ); - level.maxrespawndelay = getgametypesetting( "timeLimit" ) * 60; - level.iconoffset = vectorScale( ( 0, 0, 1 ), 32 ); - level.onrespawndelay = ::getrespawndelay; - game[ "dialog" ][ "gametype" ] = "hq_start"; - game[ "dialog" ][ "gametype_hardcore" ] = "hchq_start"; - game[ "dialog" ][ "offense_obj" ] = "cap_start"; - game[ "dialog" ][ "defense_obj" ] = "cap_start"; - level.lastdialogtime = 0; - level.radiospawnqueue = []; - if ( !sessionmodeissystemlink() && !sessionmodeisonlinegame() && issplitscreen() ) - { - setscoreboardcolumns( "score", "kills", "captures", "defends", "deaths" ); - } - else - { - setscoreboardcolumns( "score", "kills", "deaths", "captures", "defends" ); - } + if ( getdvar( "mapname" ) == "mp_background" ) + return; + + maps\mp\gametypes\_globallogic::init(); + maps\mp\gametypes\_callbacksetup::setupcallbacks(); + maps\mp\gametypes\_globallogic::setupcallbacks(); + registertimelimit( 0, 1440 ); + registerscorelimit( 0, 1000 ); + registernumlives( 0, 100 ); + registerroundswitch( 0, 9 ); + registerroundwinlimit( 0, 10 ); + maps\mp\gametypes\_globallogic::registerfriendlyfiredelay( level.gametype, 15, 0, 1440 ); + level.teambased = 1; + level.doprematch = 1; + level.overrideteamscore = 1; + level.scoreroundbased = 1; + level.onstartgametype = ::onstartgametype; + level.onspawnplayer = ::onspawnplayer; + level.onspawnplayerunified = ::onspawnplayerunified; + level.playerspawnedcb = ::koth_playerspawnedcb; + level.onroundswitch = ::onroundswitch; + level.onplayerkilled = ::onplayerkilled; + level.onendgame = ::onendgame; + level.gamemodespawndvars = ::koth_gamemodespawndvars; + precachestring( &"MP_WAITING_FOR_HQ" ); + precachestring( &"MP_HQ_CAPTURED_BY" ); + level.hqautodestroytime = getgametypesetting( "autoDestroyTime" ); + level.hqspawntime = getgametypesetting( "objectiveSpawnTime" ); + level.kothmode = getgametypesetting( "kothMode" ); + level.capturetime = getgametypesetting( "captureTime" ); + level.destroytime = getgametypesetting( "destroyTime" ); + level.delayplayer = getgametypesetting( "delayPlayer" ); + level.randomhqspawn = getgametypesetting( "randomObjectiveLocations" ); + level.maxrespawndelay = getgametypesetting( "timeLimit" ) * 60; + level.iconoffset = vectorscale( ( 0, 0, 1 ), 32.0 ); + level.onrespawndelay = ::getrespawndelay; + game["dialog"]["gametype"] = "hq_start"; + game["dialog"]["gametype_hardcore"] = "hchq_start"; + game["dialog"]["offense_obj"] = "cap_start"; + game["dialog"]["defense_obj"] = "cap_start"; + level.lastdialogtime = 0; + level.radiospawnqueue = []; + + if ( !sessionmodeissystemlink() && !sessionmodeisonlinegame() && issplitscreen() ) + setscoreboardcolumns( "score", "kills", "captures", "defends", "deaths" ); + else + setscoreboardcolumns( "score", "kills", "deaths", "captures", "defends" ); } -updateobjectivehintmessages( defenderteam, defendmessage, attackmessage ) //checked changed at own discretion +updateobjectivehintmessages( defenderteam, defendmessage, attackmessage ) { - foreach ( team in level.teams ) - { - if ( defenderteam == team ) - { - game[ "strings" ][ "objective_hint_" + team ] = defendmessage; - } - else - { - game[ "strings" ][ "objective_hint_" + team ] = attackmessage; - } - } + foreach ( team in level.teams ) + { + if ( defenderteam == team ) + { + game["strings"]["objective_hint_" + team] = defendmessage; + continue; + } + + game["strings"]["objective_hint_" + team] = attackmessage; + } } -updateobjectivehintmessage( message ) //checked changed to match cerberus output +updateobjectivehintmessage( message ) { - foreach ( team in level.teams ) - { - game[ "strings" ][ "objective_hint_" + team ] = message; - } + foreach ( team in level.teams ) + game["strings"]["objective_hint_" + team] = message; } -getrespawndelay() //checked matches cerberus output +getrespawndelay() { - self.lowermessageoverride = undefined; - if ( !isDefined( level.radio.gameobject ) ) - { - return undefined; - } - hqowningteam = level.radio.gameobject maps/mp/gametypes/_gameobjects::getownerteam(); - if ( self.pers[ "team" ] == hqowningteam ) - { - if ( !isDefined( level.hqdestroytime ) ) - { - timeremaining = level.maxrespawndelay; - } - else - { - timeremaining = ( level.hqdestroytime - getTime() ) / 1000; - } - if ( !level.playerobjectiveheldrespawndelay ) - { - return undefined; - } - if ( level.playerobjectiveheldrespawndelay >= level.hqautodestroytime ) - { - self.lowermessageoverride = &"MP_WAITING_FOR_HQ"; - } - if ( level.delayplayer ) - { - return min( level.spawndelay, timeremaining ); - } - else - { - return ceil( timeremaining ); - } - } + self.lowermessageoverride = undefined; + + if ( !isdefined( level.radio.gameobject ) ) + return undefined; + + hqowningteam = level.radio.gameobject maps\mp\gametypes\_gameobjects::getownerteam(); + + if ( self.pers["team"] == hqowningteam ) + { + if ( !isdefined( level.hqdestroytime ) ) + timeremaining = level.maxrespawndelay; + else + timeremaining = ( level.hqdestroytime - gettime() ) / 1000; + + if ( !level.playerobjectiveheldrespawndelay ) + return undefined; + + if ( level.playerobjectiveheldrespawndelay >= level.hqautodestroytime ) + self.lowermessageoverride = &"MP_WAITING_FOR_HQ"; + + if ( level.delayplayer ) + return min( level.spawndelay, timeremaining ); + else + return ceil( timeremaining ); + } } -onstartgametype() //checked changed to match cerberus output +onstartgametype() { - if ( !isDefined( game[ "switchedsides" ] ) ) - { - game[ "switchedsides" ] = 0; - } - if ( game[ "switchedsides" ] ) - { - oldattackers = game[ "attackers" ]; - olddefenders = game[ "defenders" ]; - game[ "attackers" ] = olddefenders; - game[ "defenders" ] = oldattackers; - } - maps/mp/gametypes/_globallogic_score::resetteamscores(); - foreach ( team in level.teams ) - { - setobjectivetext( team, &"OBJECTIVES_KOTH" ); - if ( level.splitscreen ) - { - setobjectivescoretext( team, &"OBJECTIVES_HQ" ); - } - else - { - setobjectivescoretext( team, &"OBJECTIVES_HQ_SCORE" ); - } - } - level.objectivehintpreparehq = &"MP_CONTROL_HQ"; - level.objectivehintcapturehq = &"MP_CAPTURE_HQ"; - level.objectivehintdestroyhq = &"MP_DESTROY_HQ"; - level.objectivehintdefendhq = &"MP_DEFEND_HQ"; - precachestring( level.objectivehintpreparehq ); - precachestring( level.objectivehintcapturehq ); - precachestring( level.objectivehintdestroyhq ); - precachestring( level.objectivehintdefendhq ); - if ( level.kothmode ) - { - level.objectivehintdestroyhq = level.objectivehintcapturehq; - } - if ( level.hqspawntime ) - { - updateobjectivehintmessage( level.objectivehintpreparehq ); - } - else - { - updateobjectivehintmessage( level.objectivehintcapturehq ); - } - setclientnamemode( "auto_change" ); - allowed = []; - allowed[ 0 ] = "hq"; - maps/mp/gametypes/_gameobjects::main( allowed ); - maps/mp/gametypes/_spawning::create_map_placed_influencers(); - level.spawnmins = ( 0, 0, 0 ); - level.spawnmaxs = ( 0, 0, 0 ); - foreach ( team in level.teams ) - { - maps/mp/gametypes/_spawnlogic::addspawnpoints( team, "mp_tdm_spawn" ); - maps/mp/gametypes/_spawnlogic::placespawnpoints( maps/mp/gametypes/_spawning::gettdmstartspawnname( team ) ); - } - maps/mp/gametypes/_spawning::updateallspawnpoints(); - level.spawn_start = []; - foreach ( team in level.teams ) - { - level.spawn_start[ team ] = maps/mp/gametypes/_spawnlogic::getspawnpointarray( maps/mp/gametypes/_spawning::gettdmstartspawnname( team ) ); - } - 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.spawn_all = maps/mp/gametypes/_spawnlogic::getspawnpointarray( "mp_tdm_spawn" ); - if ( !level.spawn_all.size ) - { - /* + if ( !isdefined( game["switchedsides"] ) ) + game["switchedsides"] = 0; + + if ( game["switchedsides"] ) + { + oldattackers = game["attackers"]; + olddefenders = game["defenders"]; + game["attackers"] = olddefenders; + game["defenders"] = oldattackers; + } + + maps\mp\gametypes\_globallogic_score::resetteamscores(); + + foreach ( team in level.teams ) + { + setobjectivetext( team, &"OBJECTIVES_KOTH" ); + + if ( level.splitscreen ) + { + setobjectivescoretext( team, &"OBJECTIVES_HQ" ); + continue; + } + + setobjectivescoretext( team, &"OBJECTIVES_HQ_SCORE" ); + } + + level.objectivehintpreparehq = &"MP_CONTROL_HQ"; + level.objectivehintcapturehq = &"MP_CAPTURE_HQ"; + level.objectivehintdestroyhq = &"MP_DESTROY_HQ"; + level.objectivehintdefendhq = &"MP_DEFEND_HQ"; + precachestring( level.objectivehintpreparehq ); + precachestring( level.objectivehintcapturehq ); + precachestring( level.objectivehintdestroyhq ); + precachestring( level.objectivehintdefendhq ); + + if ( level.kothmode ) + level.objectivehintdestroyhq = level.objectivehintcapturehq; + + if ( level.hqspawntime ) + updateobjectivehintmessage( level.objectivehintpreparehq ); + else + updateobjectivehintmessage( level.objectivehintcapturehq ); + + setclientnamemode( "auto_change" ); + allowed[0] = "hq"; + maps\mp\gametypes\_gameobjects::main( allowed ); + maps\mp\gametypes\_spawning::create_map_placed_influencers(); + level.spawnmins = ( 0, 0, 0 ); + level.spawnmaxs = ( 0, 0, 0 ); + + foreach ( team in level.teams ) + { + maps\mp\gametypes\_spawnlogic::addspawnpoints( team, "mp_tdm_spawn" ); + maps\mp\gametypes\_spawnlogic::placespawnpoints( maps\mp\gametypes\_spawning::gettdmstartspawnname( team ) ); + } + + maps\mp\gametypes\_spawning::updateallspawnpoints(); + level.spawn_start = []; + + foreach ( team in level.teams ) + level.spawn_start[team] = maps\mp\gametypes\_spawnlogic::getspawnpointarray( maps\mp\gametypes\_spawning::gettdmstartspawnname( team ) ); + + 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.spawn_all = maps\mp\gametypes\_spawnlogic::getspawnpointarray( "mp_tdm_spawn" ); + + if ( !level.spawn_all.size ) + { /# - println( "^1No mp_tdm_spawn spawnpoints in level!" ); + println( "^1No mp_tdm_spawn spawnpoints in level!" ); #/ - */ - maps/mp/gametypes/_callbacksetup::abortlevel(); - return; - } - thread setupradios(); - thread hqmainloop(); + maps\mp\gametypes\_callbacksetup::abortlevel(); + return; + } + + thread setupradios(); + thread hqmainloop(); } -spawn_first_radio( delay ) //checked matches cerberus output +spawn_first_radio( delay ) { - if ( level.randomhqspawn == 1 ) - { - level.radio = getnextradiofromqueue(); - } - else - { - level.radio = getfirstradio(); - } - logstring( "radio spawned: (" + level.radio.trigorigin[ 0 ] + "," + level.radio.trigorigin[ 1 ] + "," + level.radio.trigorigin[ 2 ] + ")" ); - level.radio enable_radio_spawn_influencer( 1 ); - return; + if ( level.randomhqspawn == 1 ) + level.radio = getnextradiofromqueue(); + else + level.radio = getfirstradio(); + + logstring( "radio spawned: (" + level.radio.trigorigin[0] + "," + level.radio.trigorigin[1] + "," + level.radio.trigorigin[2] + ")" ); + level.radio enable_radio_spawn_influencer( 1 ); + return; } -spawn_next_radio() //checked matches cerberus output +spawn_next_radio() { - if ( level.randomhqspawn != 0 ) - { - level.radio = getnextradiofromqueue(); - } - else - { - level.radio = getnextradio(); - } - logstring( "radio spawned: (" + level.radio.trigorigin[ 0 ] + "," + level.radio.trigorigin[ 1 ] + "," + level.radio.trigorigin[ 2 ] + ")" ); - level.radio enable_radio_spawn_influencer( 1 ); - return; + if ( level.randomhqspawn != 0 ) + level.radio = getnextradiofromqueue(); + else + level.radio = getnextradio(); + + logstring( "radio spawned: (" + level.radio.trigorigin[0] + "," + level.radio.trigorigin[1] + "," + level.radio.trigorigin[2] + ")" ); + level.radio enable_radio_spawn_influencer( 1 ); + return; } -hqmainloop() //checked changed to match cerberus output +hqmainloop() { - level endon( "game_ended" ); - level.hqrevealtime = -100000; - hqspawninginstr = &"MP_HQ_AVAILABLE_IN"; - if ( level.kothmode ) - { - hqdestroyedinfriendlystr = &"MP_HQ_DESPAWN_IN"; - hqdestroyedinenemystr = &"MP_HQ_DESPAWN_IN"; - } - else - { - hqdestroyedinfriendlystr = &"MP_HQ_REINFORCEMENTS_IN"; - hqdestroyedinenemystr = &"MP_HQ_DESPAWN_IN"; - } - precachestring( hqspawninginstr ); - precachestring( hqdestroyedinfriendlystr ); - precachestring( hqdestroyedinenemystr ); - precachestring( &"MP_CAPTURING_HQ" ); - precachestring( &"MP_DESTROYING_HQ" ); - spawn_first_radio(); - objective_name = istring( "objective" ); - precachestring( objective_name ); - while ( level.inprematchperiod ) - { - wait 0.05; - } - wait 5; - timerdisplay = []; - foreach ( team in level.teams ) - { - timerdisplay[ team ] = createservertimer( "objective", 1.4, team ); - timerdisplay[ team ] setgamemodeinfopoint(); - timerdisplay[ team ].label = hqspawninginstr; - timerdisplay[ team ].font = "small"; - timerdisplay[ team ].alpha = 0; - timerdisplay[ team ].archived = 0; - timerdisplay[ team ].hidewheninmenu = 1; - timerdisplay[ team ].hidewheninkillcam = 1; - timerdisplay[ team ].showplayerteamhudelemtospectator = 1; - thread hidetimerdisplayongameend( timerdisplay[ team ] ); - } - while ( 1 ) - { - iprintln( &"MP_HQ_REVEALED" ); - playsoundonplayers( "mp_suitcase_pickup" ); - maps/mp/gametypes/_globallogic_audio::leaderdialog( "hq_located" ); - level.radio.gameobject maps/mp/gametypes/_gameobjects::setmodelvisibility( 1 ); - level.hqrevealtime = getTime(); - maps/mp/killstreaks/_rcbomb::detonatealliftouchingsphere( level.radio.origin, 75 ); - if ( level.hqspawntime ) - { - level.radio.gameobject maps/mp/gametypes/_gameobjects::setvisibleteam( "any" ); - level.radio.gameobject maps/mp/gametypes/_gameobjects::setflags( 1 ); - updateobjectivehintmessage( level.objectivehintpreparehq ); - foreach ( team in level.teams ) - { - timerdisplay[ team ].label = hqspawninginstr; - timerdisplay[ team ] settimer( level.hqspawntime ); - timerdisplay[ team ].alpha = 1; - } - wait level.hqspawntime; - level.radio.gameobject maps/mp/gametypes/_gameobjects::setflags( 0 ); - maps/mp/gametypes/_globallogic_audio::leaderdialog( "hq_online" ); - } - foreach ( team in level.teams ) - { - timerdisplay[ team ].alpha = 0; - } - waittillframeend; - maps/mp/gametypes/_globallogic_audio::leaderdialog( "obj_capture" ); - updateobjectivehintmessage( level.objectivehintcapturehq ); - playsoundonplayers( "mpl_hq_cap_us" ); - level.radio.gameobject maps/mp/gametypes/_gameobjects::enableobject(); - level.radio.gameobject.onupdateuserate = ::onupdateuserate; - level.radio.gameobject maps/mp/gametypes/_gameobjects::allowuse( "any" ); - level.radio.gameobject maps/mp/gametypes/_gameobjects::setusetime( level.capturetime ); - level.radio.gameobject maps/mp/gametypes/_gameobjects::setusetext( &"MP_CAPTURING_HQ" ); - level.radio.gameobject maps/mp/gametypes/_gameobjects::setvisibleteam( "any" ); - level.radio.gameobject maps/mp/gametypes/_gameobjects::setmodelvisibility( 1 ); - level.radio.gameobject.onuse = ::onradiocapture; - level.radio.gameobject.onbeginuse = ::onbeginuse; - level.radio.gameobject.onenduse = ::onenduse; - level waittill( "hq_captured" ); - ownerteam = level.radio.gameobject maps/mp/gametypes/_gameobjects::getownerteam(); - if ( level.hqautodestroytime ) - { - thread destroyhqaftertime( level.hqautodestroytime, ownerteam ); - foreach ( team in level.teams ) - { - timerdisplay[ team ] settimer( level.hqautodestroytime ); - } - } - else - { - level.hqdestroyedbytimer = 0; - } - while ( 1 ) - { - ownerteam = level.radio.gameobject maps/mp/gametypes/_gameobjects::getownerteam(); - foreach ( team in level.teams ) - { - updateobjectivehintmessages( ownerteam, level.objectivehintdefendhq, level.objectivehintdestroyhq ); - } - level.radio.gameobject maps/mp/gametypes/_gameobjects::allowuse( "enemy" ); - if ( !level.kothmode ) - { - level.radio.gameobject maps/mp/gametypes/_gameobjects::setusetext( &"MP_DESTROYING_HQ" ); - } - level.radio.gameobject.onuse = ::onradiodestroy; - if ( level.hqautodestroytime ) - { - foreach ( team in level.teams ) - { - if ( team == ownerteam ) - { - timerdisplay[ team ].label = hqdestroyedinfriendlystr; - } - else - { - timerdisplay[ team ].label = hqdestroyedinenemystr; - } - timerdisplay[ team ].alpha = 1; - } - } - level thread dropallaroundhq(); - level waittill( "hq_destroyed", destroy_team ); - level.radio enable_radio_spawn_influencer( 0 ); - if ( !level.kothmode || level.hqdestroyedbytimer ) - { - break; - } - thread forcespawnteam( ownerteam ); - if ( isDefined( destroy_team ) ) - { - level.radio.gameobject maps/mp/gametypes/_gameobjects::setownerteam( destroy_team ); - } - } - level.radio.gameobject maps/mp/gametypes/_gameobjects::disableobject(); - level.radio.gameobject maps/mp/gametypes/_gameobjects::allowuse( "none" ); - level.radio.gameobject maps/mp/gametypes/_gameobjects::setownerteam( "neutral" ); - level.radio.gameobject maps/mp/gametypes/_gameobjects::setmodelvisibility( 0 ); - level notify( "hq_reset" ); - foreach ( team in level.teams ) - { - timerdisplay[ team ].alpha = 0; - } - spawn_next_radio(); - wait 0.05; - thread forcespawnteam( ownerteam ); - wait 3; - } + level endon( "game_ended" ); + level.hqrevealtime = -100000; + hqspawninginstr = &"MP_HQ_AVAILABLE_IN"; + + if ( level.kothmode ) + { + hqdestroyedinfriendlystr = &"MP_HQ_DESPAWN_IN"; + hqdestroyedinenemystr = &"MP_HQ_DESPAWN_IN"; + } + else + { + hqdestroyedinfriendlystr = &"MP_HQ_REINFORCEMENTS_IN"; + hqdestroyedinenemystr = &"MP_HQ_DESPAWN_IN"; + } + + precachestring( hqspawninginstr ); + precachestring( hqdestroyedinfriendlystr ); + precachestring( hqdestroyedinenemystr ); + precachestring( &"MP_CAPTURING_HQ" ); + precachestring( &"MP_DESTROYING_HQ" ); + spawn_first_radio(); + objective_name = istring( "objective" ); + precachestring( objective_name ); + + while ( level.inprematchperiod ) + wait 0.05; + + wait 5; + timerdisplay = []; + + foreach ( team in level.teams ) + { + timerdisplay[team] = createservertimer( "objective", 1.4, team ); + timerdisplay[team] setgamemodeinfopoint(); + timerdisplay[team].label = hqspawninginstr; + timerdisplay[team].font = "small"; + timerdisplay[team].alpha = 0; + timerdisplay[team].archived = 0; + timerdisplay[team].hidewheninmenu = 1; + timerdisplay[team].hidewheninkillcam = 1; + timerdisplay[team].showplayerteamhudelemtospectator = 1; + thread hidetimerdisplayongameend( timerdisplay[team] ); + } + + while ( true ) + { + iprintln( &"MP_HQ_REVEALED" ); + playsoundonplayers( "mp_suitcase_pickup" ); + maps\mp\gametypes\_globallogic_audio::leaderdialog( "hq_located" ); + level.radio.gameobject maps\mp\gametypes\_gameobjects::setmodelvisibility( 1 ); + level.hqrevealtime = gettime(); + maps\mp\killstreaks\_rcbomb::detonatealliftouchingsphere( level.radio.origin, 75 ); + + if ( level.hqspawntime ) + { + level.radio.gameobject maps\mp\gametypes\_gameobjects::setvisibleteam( "any" ); + level.radio.gameobject maps\mp\gametypes\_gameobjects::setflags( 1 ); + updateobjectivehintmessage( level.objectivehintpreparehq ); + + foreach ( team in level.teams ) + { + timerdisplay[team].label = hqspawninginstr; + timerdisplay[team] settimer( level.hqspawntime ); + timerdisplay[team].alpha = 1; + } + + wait( level.hqspawntime ); + level.radio.gameobject maps\mp\gametypes\_gameobjects::setflags( 0 ); + maps\mp\gametypes\_globallogic_audio::leaderdialog( "hq_online" ); + } + + foreach ( team in level.teams ) + timerdisplay[team].alpha = 0; + + waittillframeend; + maps\mp\gametypes\_globallogic_audio::leaderdialog( "obj_capture" ); + updateobjectivehintmessage( level.objectivehintcapturehq ); + playsoundonplayers( "mpl_hq_cap_us" ); + level.radio.gameobject maps\mp\gametypes\_gameobjects::enableobject(); + level.radio.gameobject.onupdateuserate = ::onupdateuserate; + level.radio.gameobject maps\mp\gametypes\_gameobjects::allowuse( "any" ); + level.radio.gameobject maps\mp\gametypes\_gameobjects::setusetime( level.capturetime ); + level.radio.gameobject maps\mp\gametypes\_gameobjects::setusetext( &"MP_CAPTURING_HQ" ); + level.radio.gameobject maps\mp\gametypes\_gameobjects::setvisibleteam( "any" ); + level.radio.gameobject maps\mp\gametypes\_gameobjects::setmodelvisibility( 1 ); + level.radio.gameobject.onuse = ::onradiocapture; + level.radio.gameobject.onbeginuse = ::onbeginuse; + level.radio.gameobject.onenduse = ::onenduse; + + level waittill( "hq_captured" ); + + ownerteam = level.radio.gameobject maps\mp\gametypes\_gameobjects::getownerteam(); + + if ( level.hqautodestroytime ) + { + thread destroyhqaftertime( level.hqautodestroytime, ownerteam ); + + foreach ( team in level.teams ) + timerdisplay[team] settimer( level.hqautodestroytime ); + } + else + level.hqdestroyedbytimer = 0; + + while ( true ) + { + ownerteam = level.radio.gameobject maps\mp\gametypes\_gameobjects::getownerteam(); + + foreach ( team in level.teams ) + updateobjectivehintmessages( ownerteam, level.objectivehintdefendhq, level.objectivehintdestroyhq ); + + level.radio.gameobject maps\mp\gametypes\_gameobjects::allowuse( "enemy" ); + + if ( !level.kothmode ) + level.radio.gameobject maps\mp\gametypes\_gameobjects::setusetext( &"MP_DESTROYING_HQ" ); + + level.radio.gameobject.onuse = ::onradiodestroy; + + if ( level.hqautodestroytime ) + { + foreach ( team in level.teams ) + { + if ( team == ownerteam ) + timerdisplay[team].label = hqdestroyedinfriendlystr; + else + timerdisplay[team].label = hqdestroyedinenemystr; + + timerdisplay[team].alpha = 1; + } + } + + level thread dropallaroundhq(); + + level waittill( "hq_destroyed", destroy_team ); + + level.radio enable_radio_spawn_influencer( 0 ); + + if ( !level.kothmode || level.hqdestroyedbytimer ) + break; + + thread forcespawnteam( ownerteam ); + + if ( isdefined( destroy_team ) ) + level.radio.gameobject maps\mp\gametypes\_gameobjects::setownerteam( destroy_team ); + } + + level.radio.gameobject maps\mp\gametypes\_gameobjects::disableobject(); + level.radio.gameobject maps\mp\gametypes\_gameobjects::allowuse( "none" ); + level.radio.gameobject maps\mp\gametypes\_gameobjects::setownerteam( "neutral" ); + level.radio.gameobject maps\mp\gametypes\_gameobjects::setmodelvisibility( 0 ); + level notify( "hq_reset" ); + + foreach ( team in level.teams ) + timerdisplay[team].alpha = 0; + + spawn_next_radio(); + wait 0.05; + thread forcespawnteam( ownerteam ); + wait 3.0; + } } -hidetimerdisplayongameend( timerdisplay ) //checked matches cerberus output +hidetimerdisplayongameend( timerdisplay ) { - level waittill( "game_ended" ); - timerdisplay.alpha = 0; + level waittill( "game_ended" ); + + timerdisplay.alpha = 0; } -forcespawnteam( team ) //checked partially changed to match cerberus output did not change while loop to for loop see github for more info +forcespawnteam( team ) { - players = level.players; - i = 0; - while ( i < players.size ) - { - player = players[ i ]; - if ( !isDefined( player ) ) - { - i++; - continue; - } - if ( player.pers[ "team" ] == team ) - { - player notify( "force_spawn" ); - wait 0.1; - } - i++; - } + players = level.players; + + for ( i = 0; i < players.size; i++ ) + { + player = players[i]; + + if ( !isdefined( player ) ) + continue; + + if ( player.pers["team"] == team ) + { + player notify( "force_spawn" ); + wait 0.1; + } + } } -onbeginuse( player ) //checked matches cerberus output +onbeginuse( player ) { - ownerteam = self maps/mp/gametypes/_gameobjects::getownerteam(); - if ( ownerteam == "neutral" ) - { - player thread maps/mp/gametypes/_battlechatter_mp::gametypespecificbattlechatter( "hq_protect", player.pers[ "team" ] ); - } - else - { - player thread maps/mp/gametypes/_battlechatter_mp::gametypespecificbattlechatter( "hq_attack", player.pers[ "team" ] ); - } + ownerteam = self maps\mp\gametypes\_gameobjects::getownerteam(); + + if ( ownerteam == "neutral" ) + player thread maps\mp\gametypes\_battlechatter_mp::gametypespecificbattlechatter( "hq_protect", player.pers["team"] ); + else + player thread maps\mp\gametypes\_battlechatter_mp::gametypespecificbattlechatter( "hq_attack", player.pers["team"] ); } -onenduse( team, player, success ) //checked matches cerberus output +onenduse( team, player, success ) { - player notify( "event_ended" ); + player notify( "event_ended" ); } -onradiocapture( player ) //checked partially changed to match cerberus output did not use continue in foreach see github for more info +onradiocapture( player ) { - capture_team = player.pers[ "team" ]; - player logstring( "radio captured" ); - string = &"MP_HQ_CAPTURED_BY"; - level.usestartspawns = 0; - thread give_capture_credit( self.touchlist[ capture_team ], string ); - oldteam = maps/mp/gametypes/_gameobjects::getownerteam(); - self maps/mp/gametypes/_gameobjects::setownerteam( capture_team ); - if ( !level.kothmode ) - { - self maps/mp/gametypes/_gameobjects::setusetime( level.destroytime ); - } - foreach ( team in level.teams ) - { - if ( team == capture_team ) - { - thread printonteamarg( &"MP_HQ_CAPTURED_BY", team, player ); - maps/mp/gametypes/_globallogic_audio::leaderdialog( "hq_secured", team ); - thread playsoundonplayers( "mp_war_objective_taken", team ); - } - else - { - thread printonteam( &"MP_HQ_CAPTURED_BY_ENEMY", team ); - maps/mp/gametypes/_globallogic_audio::leaderdialog( "hq_enemy_captured", team ); - thread playsoundonplayers( "mp_war_objective_lost", team ); - } - } - level thread awardhqpoints( capture_team ); - level notify( "hq_captured" ); - player notify( "event_ended" ); + capture_team = player.pers["team"]; + player logstring( "radio captured" ); + string = &"MP_HQ_CAPTURED_BY"; + level.usestartspawns = 0; + thread give_capture_credit( self.touchlist[capture_team], string ); + oldteam = maps\mp\gametypes\_gameobjects::getownerteam(); + self maps\mp\gametypes\_gameobjects::setownerteam( capture_team ); + + if ( !level.kothmode ) + self maps\mp\gametypes\_gameobjects::setusetime( level.destroytime ); + + foreach ( team in level.teams ) + { + if ( team == capture_team ) + { + thread printonteamarg( &"MP_HQ_CAPTURED_BY", team, player ); + maps\mp\gametypes\_globallogic_audio::leaderdialog( "hq_secured", team ); + thread playsoundonplayers( "mp_war_objective_taken", team ); + continue; + } + + thread printonteam( &"MP_HQ_CAPTURED_BY_ENEMY", team ); + maps\mp\gametypes\_globallogic_audio::leaderdialog( "hq_enemy_captured", team ); + thread playsoundonplayers( "mp_war_objective_lost", team ); + } + + level thread awardhqpoints( capture_team ); + level notify( "hq_captured" ); + player notify( "event_ended" ); } -give_capture_credit( touchlist, string ) //checked changed to match cerberus output +give_capture_credit( touchlist, string ) { - time = getTime(); - wait 0.05; - maps/mp/gametypes/_globallogic_utils::waittillslowprocessallowed(); - players = getarraykeys( touchlist ); - for ( i = 0; i < players.size; i++ ) - { - player_from_touchlist = touchlist[ players[ i ] ].player; - player_from_touchlist maps/mp/_challenges::capturedobjective( time ); - maps/mp/_scoreevents::processscoreevent( "hq_secure", player_from_touchlist ); - player_from_touchlist recordgameevent( "capture" ); - level thread maps/mp/_popups::displayteammessagetoall( string, player_from_touchlist ); - if ( isDefined( player_from_touchlist.pers[ "captures" ] ) ) - { - player_from_touchlist.pers[ "captures" ]++; - player_from_touchlist.captures = player_from_touchlist.pers[ "captures" ]; - } - maps/mp/_demo::bookmark( "event", getTime(), player_from_touchlist ); - player_from_touchlist addplayerstatwithgametype( "CAPTURES", 1 ); - } + time = gettime(); + wait 0.05; + maps\mp\gametypes\_globallogic_utils::waittillslowprocessallowed(); + players = getarraykeys( touchlist ); + + for ( i = 0; i < players.size; i++ ) + { + player_from_touchlist = touchlist[players[i]].player; + player_from_touchlist maps\mp\_challenges::capturedobjective( time ); + maps\mp\_scoreevents::processscoreevent( "hq_secure", player_from_touchlist ); + player_from_touchlist recordgameevent( "capture" ); + level thread maps\mp\_popups::displayteammessagetoall( string, player_from_touchlist ); + + if ( isdefined( player_from_touchlist.pers["captures"] ) ) + { + player_from_touchlist.pers["captures"]++; + player_from_touchlist.captures = player_from_touchlist.pers["captures"]; + } + + maps\mp\_demo::bookmark( "event", gettime(), player_from_touchlist ); + player_from_touchlist addplayerstatwithgametype( "CAPTURES", 1 ); + } } -dropalltoground( origin, radius, stickyobjectradius ) //checked changed to match cerberus output +dropalltoground( origin, radius, stickyobjectradius ) { - physicsexplosionsphere( origin, radius, radius, 0 ); - wait 0.05; - maps/mp/gametypes/_weapons::dropweaponstoground( origin, radius ); - maps/mp/killstreaks/_supplydrop::dropcratestoground( origin, radius ); - level notify( "drop_objects_to_ground", origin, stickyobjectradius ); + physicsexplosionsphere( origin, radius, radius, 0 ); + wait 0.05; + maps\mp\gametypes\_weapons::dropweaponstoground( origin, radius ); + maps\mp\killstreaks\_supplydrop::dropcratestoground( origin, radius ); + level notify( "drop_objects_to_ground", origin, stickyobjectradius ); } -dropallaroundhq( radio ) //checked matches cerberus output +dropallaroundhq( radio ) { - origin = level.radio.origin; - level waittill( "hq_reset" ); - dropalltoground( origin, 100, 50 ); + origin = level.radio.origin; + + level waittill( "hq_reset" ); + + dropalltoground( origin, 100, 50 ); } -onradiodestroy( firstplayer ) //checked partially changed to match cerberus output +onradiodestroy( firstplayer ) { - destroyed_team = firstplayer.pers[ "team" ]; - touchlist = self.touchlist[ destroyed_team ]; - touchlistkeys = getarraykeys( touchlist ); - foreach ( index in touchlistkeys ) - { - player = touchlist[ index ].player; - player logstring( "radio destroyed" ); - maps/mp/_scoreevents::processscoreevent( "hq_destroyed", player ); - player recordgameevent( "destroy" ); - player addplayerstatwithgametype( "DESTRUCTIONS", 1 ); - if ( isDefined( player.pers[ "destructions" ] ) ) - { - player.pers[ "destructions" ]++; - player.destructions = player.pers[ "destructions" ]; - } - } - destroyteammessage = &"MP_HQ_DESTROYED_BY"; - otherteammessage = &"MP_HQ_DESTROYED_BY_ENEMY"; - if ( level.kothmode ) - { - destroyteammessage = &"MP_HQ_CAPTURED_BY"; - otherteammessage = &"MP_HQ_CAPTURED_BY_ENEMY"; - } - level thread maps/mp/_popups::displayteammessagetoall( destroyteammessage, player ); - foreach ( team in level.teams ) - { - team = _a651[ _k651 ]; - if ( team == destroyed_team ) - { - thread printonteamarg( destroyteammessage, team, player ); - maps/mp/gametypes/_globallogic_audio::leaderdialog( "hq_secured", team ); - } - else - { - thread printonteam( otherteammessage, team ); - maps/mp/gametypes/_globallogic_audio::leaderdialog( "hq_enemy_destroyed", team ); - } - } - level notify( "hq_destroyed", destroyed_team ); - if ( level.kothmode ) - { - level thread awardhqpoints( destroyed_team ); - } - player notify( "event_ended" ); + destroyed_team = firstplayer.pers["team"]; + touchlist = self.touchlist[destroyed_team]; + touchlistkeys = getarraykeys( touchlist ); + + foreach ( index in touchlistkeys ) + { + player = touchlist[index].player; + player logstring( "radio destroyed" ); + maps\mp\_scoreevents::processscoreevent( "hq_destroyed", player ); + player recordgameevent( "destroy" ); + player addplayerstatwithgametype( "DESTRUCTIONS", 1 ); + + if ( isdefined( player.pers["destructions"] ) ) + { + player.pers["destructions"]++; + player.destructions = player.pers["destructions"]; + } + } + + destroyteammessage = &"MP_HQ_DESTROYED_BY"; + otherteammessage = &"MP_HQ_DESTROYED_BY_ENEMY"; + + if ( level.kothmode ) + { + destroyteammessage = &"MP_HQ_CAPTURED_BY"; + otherteammessage = &"MP_HQ_CAPTURED_BY_ENEMY"; + } + + level thread maps\mp\_popups::displayteammessagetoall( destroyteammessage, player ); + + foreach ( team in level.teams ) + { + if ( team == destroyed_team ) + { + thread printonteamarg( destroyteammessage, team, player ); + maps\mp\gametypes\_globallogic_audio::leaderdialog( "hq_secured", team ); + continue; + } + + thread printonteam( otherteammessage, team ); + maps\mp\gametypes\_globallogic_audio::leaderdialog( "hq_enemy_destroyed", team ); + } + + level notify( "hq_destroyed", destroyed_team ); + + if ( level.kothmode ) + level thread awardhqpoints( destroyed_team ); + + player notify( "event_ended" ); } -destroyhqaftertime( time, ownerteam ) //checked matches cerberus output +destroyhqaftertime( time, ownerteam ) { - level endon( "game_ended" ); - level endon( "hq_reset" ); - level.hqdestroytime = getTime() + ( time * 1000 ); - level.hqdestroyedbytimer = 0; - wait time; - maps/mp/gametypes/_globallogic_audio::leaderdialog( "hq_offline" ); - level.hqdestroyedbytimer = 1; - checkplayercount( ownerteam ); - level notify( "hq_destroyed" ); + level endon( "game_ended" ); + level endon( "hq_reset" ); + level.hqdestroytime = gettime() + time * 1000; + level.hqdestroyedbytimer = 0; + wait( time ); + maps\mp\gametypes\_globallogic_audio::leaderdialog( "hq_offline" ); + level.hqdestroyedbytimer = 1; + checkplayercount( ownerteam ); + level notify( "hq_destroyed" ); } -checkplayercount( ownerteam ) //checked partially changed to match cerberus output did not change while loop to for loop see github for more info +checkplayercount( ownerteam ) { - lastplayeralive = undefined; - players = level.players; - i = 0; - while ( i < players.size ) - { - if ( players[ i ].team != ownerteam ) - { - i++; - continue; - } - if ( isalive( players[ i ] ) ) - { - if ( isDefined( lastplayeralive ) ) - { - return; - } - lastplayeralive = players[ i ]; - } - i++; - } - if ( isDefined( lastplayeralive ) ) - { - maps/mp/_scoreevents::processscoreevent( "defend_hq_last_man_alive", lastplayeralive ); - } + lastplayeralive = undefined; + players = level.players; + + for ( i = 0; i < players.size; i++ ) + { + if ( players[i].team != ownerteam ) + continue; + + if ( isalive( players[i] ) ) + { + if ( isdefined( lastplayeralive ) ) + return; + + lastplayeralive = players[i]; + } + } + + if ( isdefined( lastplayeralive ) ) + maps\mp\_scoreevents::processscoreevent( "defend_hq_last_man_alive", lastplayeralive ); } -awardhqpoints( team ) //checked changed at own discretion +awardhqpoints( team ) { - level endon( "game_ended" ); - level endon( "hq_destroyed" ); - level notify( "awardHQPointsRunning" ); - level endon( "awardHQPointsRunning" ); - seconds = 5; - while ( !level.gameended ) - { - maps/mp/gametypes/_globallogic_score::giveteamscoreforobjective( team, seconds ); - for ( index = 0; index < level.players.size; index++ ) - { - player = level.players[ index ]; - } - wait seconds; - } + level endon( "game_ended" ); + level endon( "hq_destroyed" ); + level notify( "awardHQPointsRunning" ); + level endon( "awardHQPointsRunning" ); + seconds = 5; + + while ( !level.gameended ) + { + maps\mp\gametypes\_globallogic_score::giveteamscoreforobjective( team, seconds ); + + for ( index = 0; index < level.players.size; index++ ) + { + player = level.players[index]; + + if ( player.pers["team"] == team ) + { + + } + } + + wait( seconds ); + } } -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 ) { - spawnpoint = undefined; - if ( !level.usestartspawns ) - { - if ( isDefined( level.radio ) ) - { - if ( isDefined( level.radio.gameobject ) ) - { - radioowningteam = level.radio.gameobject maps/mp/gametypes/_gameobjects::getownerteam(); - if ( self.pers[ "team" ] == radioowningteam ) - { - spawnpoint = maps/mp/gametypes/_spawnlogic::getspawnpoint_nearteam( level.spawn_all, level.radio.gameobject.nearspawns ); - } - else if ( level.spawndelay >= level.radioautomovetime && getTime() > ( level.radiorevealtime + 10000 ) ) - { - spawnpoint = maps/mp/gametypes/_spawnlogic::getspawnpoint_nearteam( level.spawn_all ); - } - else - { - spawnpoint = maps/mp/gametypes/_spawnlogic::getspawnpoint_nearteam( level.spawn_all, level.radio.gameobject.outerspawns ); - } - } - } - } - if ( !isDefined( spawnpoint ) ) - { - spawnteam = self.pers[ "team" ]; - spawnpoint = maps/mp/gametypes/_spawnlogic::getspawnpoint_random( level.spawn_start[ spawnteam ] ); - } - /* + spawnpoint = undefined; + + if ( !level.usestartspawns ) + { + if ( isdefined( level.radio ) ) + { + if ( isdefined( level.radio.gameobject ) ) + { + radioowningteam = level.radio.gameobject maps\mp\gametypes\_gameobjects::getownerteam(); + + if ( self.pers["team"] == radioowningteam ) + spawnpoint = maps\mp\gametypes\_spawnlogic::getspawnpoint_nearteam( level.spawn_all, level.radio.gameobject.nearspawns ); + else if ( level.spawndelay >= level.radioautomovetime && gettime() > level.radiorevealtime + 10000 ) + spawnpoint = maps\mp\gametypes\_spawnlogic::getspawnpoint_nearteam( level.spawn_all ); + else + spawnpoint = maps\mp\gametypes\_spawnlogic::getspawnpoint_nearteam( level.spawn_all, level.radio.gameobject.outerspawns ); + } + } + } + + if ( !isdefined( spawnpoint ) ) + { + spawnteam = self.pers["team"]; + spawnpoint = maps\mp\gametypes\_spawnlogic::getspawnpoint_random( level.spawn_start[spawnteam] ); + } + /# - assert( isDefined( spawnpoint ) ); + assert( isdefined( spawnpoint ) ); #/ - */ - if ( predictedspawn ) - { - self predictspawnpoint( spawnpoint.origin, spawnpoint.angles ); - } - else - { - self spawn( spawnpoint.origin, spawnpoint.angles, "koth" ); - } + + if ( predictedspawn ) + self predictspawnpoint( spawnpoint.origin, spawnpoint.angles ); + else + self spawn( spawnpoint.origin, spawnpoint.angles, "koth" ); } -koth_playerspawnedcb() //checked matches cerberus output +koth_playerspawnedcb() { - self.lowermessageoverride = undefined; + self.lowermessageoverride = undefined; } -compareradioindexes( radio_a, radio_b ) //checked matches cerberus output +compareradioindexes( radio_a, radio_b ) { - script_index_a = radio_a.script_index; - script_index_b = radio_b.script_index; - if ( !isDefined( script_index_a ) && !isDefined( script_index_b ) ) - { - return 0; - } - if ( !isDefined( script_index_a ) && isDefined( script_index_b ) ) - { - /* + script_index_a = radio_a.script_index; + script_index_b = radio_b.script_index; + + if ( !isdefined( script_index_a ) && !isdefined( script_index_b ) ) + return false; + + if ( !isdefined( script_index_a ) && isdefined( script_index_b ) ) + { /# - println( "KOTH: Missing script_index on radio at " + radio_a.origin ); + println( "KOTH: Missing script_index on radio at " + radio_a.origin ); #/ - */ - return 1; - } - if ( isDefined( script_index_a ) && !isDefined( script_index_b ) ) - { - /* + return true; + } + + if ( isdefined( script_index_a ) && !isdefined( script_index_b ) ) + { /# - println( "KOTH: Missing script_index on radio at " + radio_b.origin ); + println( "KOTH: Missing script_index on radio at " + radio_b.origin ); #/ - */ - return 0; - } - if ( script_index_a > script_index_b ) - { - return 1; - } - return 0; + return false; + } + + if ( script_index_a > script_index_b ) + return true; + + return false; } -getradioarray() //checked changed to match cerberus output +getradioarray() { - radios = getentarray( "hq_hardpoint", "targetname" ); - if ( !isDefined( radios ) ) - { - return undefined; - } - swapped = 1; - n = radios.size; - while ( swapped ) - { - swapped = 0; - for ( i = 0; i < n - 1; i++ ) - { - if ( compareradioindexes( radios[ i ], radios[ i + 1 ] ) ) - { - temp = radios[ i ]; - radios[ i ] = radios[ i + 1 ]; - radios[ i + 1 ] = temp; - swapped = 1; - } - } - n--; - } - return radios; + radios = getentarray( "hq_hardpoint", "targetname" ); + + if ( !isdefined( radios ) ) + return undefined; + + swapped = 1; + + for ( n = radios.size; swapped; n-- ) + { + swapped = 0; + + for ( i = 0; i < n - 1; i++ ) + { + if ( compareradioindexes( radios[i], radios[i + 1] ) ) + { + temp = radios[i]; + radios[i] = radios[i + 1]; + radios[i + 1] = temp; + swapped = 1; + } + } + } + + return radios; } -setupradios() //checked partially changed to match cerberus output did not change while loop to for loop see github for more info +setupradios() { - maperrors = []; - radios = getradioarray(); - if ( radios.size < 2 ) - { - maperrors[ maperrors.size ] = "There are not at least 2 entities with targetname radio"; - } - trigs = getentarray( "radiotrigger", "targetname" ); - i = 0; - while ( i < radios.size ) - { - errored = 0; - radio = radios[ i ]; - radio.trig = undefined; - for ( j = 0; j < trigs.size; j++ ) - { - if ( radio istouching( trigs[ j ] ) ) - { - if ( isDefined( radio.trig ) ) - { - maperrors[ maperrors.size ] = "Radio at " + radio.origin + " is touching more than one radiotrigger trigger"; - errored = 1; - break; - } - radio.trig = trigs[ j ]; - break; - } - } - if ( !isDefined( radio.trig ) ) - { - if ( !errored ) - { - maperrors[ maperrors.size ] = "Radio at " + radio.origin + " is not inside any radiotrigger trigger"; - i++; - continue; - } - } - /* + maperrors = []; + radios = getradioarray(); + + if ( radios.size < 2 ) + maperrors[maperrors.size] = "There are not at least 2 entities with targetname \"radio\""; + + trigs = getentarray( "radiotrigger", "targetname" ); + + for ( i = 0; i < radios.size; i++ ) + { + errored = 0; + radio = radios[i]; + radio.trig = undefined; + + for ( j = 0; j < trigs.size; j++ ) + { + if ( radio istouching( trigs[j] ) ) + { + if ( isdefined( radio.trig ) ) + { + maperrors[maperrors.size] = "Radio at " + radio.origin + " is touching more than one \"radiotrigger\" trigger"; + errored = 1; + break; + } + + radio.trig = trigs[j]; + break; + } + } + + if ( !isdefined( radio.trig ) ) + { + if ( !errored ) + { + maperrors[maperrors.size] = "Radio at " + radio.origin + " is not inside any \"radiotrigger\" trigger"; + continue; + } + } + /# - assert( !errored ); + assert( !errored ); #/ - */ - radio.trigorigin = radio.trig.origin; - visuals = []; - visuals[ 0 ] = radio; - othervisuals = getentarray( radio.target, "targetname" ); - for ( j = 0; j < othervisuals.size; j++ ) - { - visuals[ visuals.size ] = othervisuals[ j ]; - } - objective_name = istring( "objective" ); - precachestring( objective_name ); - radio setupnodes(); - radio.gameobject = maps/mp/gametypes/_gameobjects::createuseobject( "neutral", radio.trig, visuals, radio.origin - radio.trigorigin, objective_name ); - radio.gameobject maps/mp/gametypes/_gameobjects::disableobject(); - radio.gameobject maps/mp/gametypes/_gameobjects::setmodelvisibility( 0 ); - radio.trig.useobj = radio.gameobject; - radio setupnearbyspawns(); - radio createradiospawninfluencer(); - i++; - } - if ( maperrors.size > 0 ) - { - /* + radio.trigorigin = radio.trig.origin; + visuals = []; + visuals[0] = radio; + othervisuals = getentarray( radio.target, "targetname" ); + + for ( j = 0; j < othervisuals.size; j++ ) + visuals[visuals.size] = othervisuals[j]; + + objective_name = istring( "objective" ); + precachestring( objective_name ); + radio setupnodes(); + radio.gameobject = maps\mp\gametypes\_gameobjects::createuseobject( "neutral", radio.trig, visuals, radio.origin - radio.trigorigin, objective_name ); + radio.gameobject maps\mp\gametypes\_gameobjects::disableobject(); + radio.gameobject maps\mp\gametypes\_gameobjects::setmodelvisibility( 0 ); + radio.trig.useobj = radio.gameobject; + radio setupnearbyspawns(); + radio createradiospawninfluencer(); + } + + if ( maperrors.size > 0 ) + { /# - println( "^1------------ Map Errors ------------" ); - i = 0; - while ( i < maperrors.size ) - { - println( maperrors[ i ] ); - i++; - } - println( "^1------------------------------------" ); - maps/mp/_utility::error( "Map errors. See above" ); + println( "^1------------ Map Errors ------------" ); + + for ( i = 0; i < maperrors.size; i++ ) + println( maperrors[i] ); + + println( "^1------------------------------------" ); + maps\mp\_utility::error( "Map errors. See above" ); #/ - maps/mp/gametypes/_callbacksetup::abortlevel(); - return; - */ - } - level.radios = radios; - level.prevradio = undefined; - level.prevradio2 = undefined; - return 1; + maps\mp\gametypes\_callbacksetup::abortlevel(); + return; + } + + level.radios = radios; + level.prevradio = undefined; + level.prevradio2 = undefined; + return 1; } -setupnearbyspawns() //checked changed to match cerberus output +setupnearbyspawns() { - spawns = level.spawn_all; - for ( i = 0; i < spawns.size; i++ ) - { - spawns[ i ].distsq = distancesquared( spawns[ i ].origin, self.origin ); - } - for ( i = 1; i < spawns.size; i++ ) - { - thespawn = spawns[ i ]; - for ( j = i - 1; j >= 0 && thespawn.distsq < spawns[ j ].distsq; j-- ) - { - spawns[ j + 1 ] = spawns[ j ]; + spawns = level.spawn_all; - } - spawns[ j + 1 ] = thespawn; - } - first = []; - second = []; - third = []; - outer = []; - thirdsize = spawns.size / 3; - for ( i = 0; i <= thirdsize; i++ ) - { - first[ first.size ] = spawns[ i ]; - } - for ( ; i < spawns.size; i++ ) - { - outer[ outer.size ] = spawns[ i ]; - if ( i <= ( thirdsize * 2 ) ) - { - second[ second.size ] = spawns[ i ]; - } - else - { - third[ third.size ] = spawns[ i ]; - } - } - self.gameobject.nearspawns = first; - self.gameobject.midspawns = second; - self.gameobject.farspawns = third; - self.gameobject.outerspawns = outer; + for ( i = 0; i < spawns.size; i++ ) + spawns[i].distsq = distancesquared( spawns[i].origin, self.origin ); + + for ( i = 1; i < spawns.size; i++ ) + { + thespawn = spawns[i]; + + for ( j = i - 1; j >= 0 && thespawn.distsq < spawns[j].distsq; j-- ) + spawns[j + 1] = spawns[j]; + + spawns[j + 1] = thespawn; + } + + first = []; + second = []; + third = []; + outer = []; + thirdsize = spawns.size / 3; + + for ( i = 0; i <= thirdsize; i++ ) + first[first.size] = spawns[i]; + + while ( i < spawns.size ) + { + outer[outer.size] = spawns[i]; + + if ( i <= thirdsize * 2 ) + second[second.size] = spawns[i]; + else + third[third.size] = spawns[i]; + + i++; + } + + self.gameobject.nearspawns = first; + self.gameobject.midspawns = second; + self.gameobject.farspawns = third; + self.gameobject.outerspawns = outer; } -setupnodes() //checked changed to match cerberus output +setupnodes() { - self.nodes = []; - temp = spawn( "script_model", ( 0, 0, 0 ) ); - maxs = self.trig getpointinbounds( 1, 1, 1 ); - self.node_radius = distance( self.trig.origin, maxs ); - nodes = getnodesinradius( self.trig.origin, self.node_radius, 0, self.node_radius ); - foreach ( node in nodes ) - { - temp.origin = node.origin; - if ( temp istouching( self.trig ) ) - { - self.nodes[ self.nodes.size ] = node; - } - } - /* + self.nodes = []; + temp = spawn( "script_model", ( 0, 0, 0 ) ); + maxs = self.trig getpointinbounds( 1, 1, 1 ); + self.node_radius = distance( self.trig.origin, maxs ); + nodes = getnodesinradius( self.trig.origin, self.node_radius, 0, self.node_radius ); + + foreach ( node in nodes ) + { + temp.origin = node.origin; + + if ( temp istouching( self.trig ) ) + self.nodes[self.nodes.size] = node; + } + /# - assert( self.nodes.size ); + assert( self.nodes.size ); #/ - */ - temp delete(); + temp delete(); } -getfirstradio() //checked matches cerberus output +getfirstradio() { - radio = level.radios[ 0 ]; - level.prevradio2 = level.prevradio; - level.prevradio = radio; - level.prevradioindex = 0; - shuffleradios(); - arrayremovevalue( level.radiospawnqueue, radio ); - return radio; + radio = level.radios[0]; + level.prevradio2 = level.prevradio; + level.prevradio = radio; + level.prevradioindex = 0; + shuffleradios(); + arrayremovevalue( level.radiospawnqueue, radio ); + return radio; } -getnextradio() //checked matches cerberus output +getnextradio() { - nextradioindex = ( level.prevradioindex + 1 ) % level.radios.size; - radio = level.radios[ nextradioindex ]; - level.prevradio2 = level.prevradio; - level.prevradio = radio; - level.prevradioindex = nextradioindex; - return radio; + nextradioindex = ( level.prevradioindex + 1 ) % level.radios.size; + radio = level.radios[nextradioindex]; + level.prevradio2 = level.prevradio; + level.prevradio = radio; + level.prevradioindex = nextradioindex; + return radio; } -pickrandomradiotospawn() //checked matches cerberus output +pickrandomradiotospawn() { - level.prevradioindex = randomint( level.radios.size ); - radio = level.radios[ level.prevradioindex ]; - level.prevradio2 = level.prevradio; - level.prevradio = radio; - return radio; + level.prevradioindex = randomint( level.radios.size ); + radio = level.radios[level.prevradioindex]; + level.prevradio2 = level.prevradio; + level.prevradio = radio; + return radio; } -shuffleradios() //checked partially changed to match cerberus output did not change while loop to for loop see github for more info +shuffleradios() { - level.radiospawnqueue = []; - spawnqueue = arraycopy( level.radios ); - for ( total_left = spawnqueue.size; total_left > 0; total_left-- ) - { - index = randomint( total_left ); - valid_radios = 0; - radio = 0; - while ( radio < level.radios.size ) - { - if ( !isDefined( spawnqueue[ radio ] ) ) - { - radio++; - continue; - } - if ( valid_radios == index ) - { - if ( level.radiospawnqueue.size == 0 && isDefined( level.radio ) && level.radio == spawnqueue[ radio ] ) - { - radio++; - continue; - } - level.radiospawnqueue[ level.radiospawnqueue.size ] = spawnqueue[ radio ]; - total_left--; - radio++; - break; - } - valid_radios++; - } - } + level.radiospawnqueue = []; + spawnqueue = arraycopy( level.radios ); + + for ( total_left = spawnqueue.size; total_left > 0; total_left-- ) + { + index = randomint( total_left ); + valid_radios = 0; + + for ( radio = 0; radio < level.radios.size; radio++ ) + { + if ( !isdefined( spawnqueue[radio] ) ) + continue; + + if ( valid_radios == index ) + { + if ( level.radiospawnqueue.size == 0 && isdefined( level.radio ) && level.radio == spawnqueue[radio] ) + continue; + + level.radiospawnqueue[level.radiospawnqueue.size] = spawnqueue[radio]; + spawnqueue[radio] = undefined; + break; + } + + valid_radios++; + } + } } -getnextradiofromqueue() //checked matches cerberus output +getnextradiofromqueue() { - if ( level.radiospawnqueue.size == 0 ) - { - shuffleradios(); - } - /* + if ( level.radiospawnqueue.size == 0 ) + shuffleradios(); + /# - assert( level.radiospawnqueue.size > 0 ); + assert( level.radiospawnqueue.size > 0 ); #/ - */ - next_radio = level.radiospawnqueue[ 0 ]; - arrayremoveindex( level.radiospawnqueue, 0 ); - return next_radio; + next_radio = level.radiospawnqueue[0]; + arrayremoveindex( level.radiospawnqueue, 0 ); + return next_radio; } -getcountofteamswithplayers( num ) //checked changed to match cerberus output +getcountofteamswithplayers( num ) { - has_players = 0; - foreach ( team in level.teams ) - { - if ( num[ team ] > 0 ) - { - has_players++; - } - } - return has_players; + has_players = 0; + + foreach ( team in level.teams ) + { + if ( num[team] > 0 ) + has_players++; + } + + return has_players; } -getpointcost( avgpos, origin ) //checked changed to match cerberus output +getpointcost( avgpos, origin ) { - avg_distance = 0; - total_error = 0; - distances = []; - foreach ( position in avgpos ) - { - distances[ team ] = distance( origin, avgpos[ team ] ); - avg_distance += distances[ team ]; - } - avg_distance /= distances.size; - foreach ( dist in distances ) - { - err = distances[ team ] - avg_distance; - total_error += err * err; - } - return total_error; + avg_distance = 0; + total_error = 0; + distances = []; + + foreach ( team, position in avgpos ) + { + distances[team] = distance( origin, avgpos[team] ); + avg_distance += distances[team]; + } + + avg_distance /= distances.size; + + foreach ( team, dist in distances ) + { + err = distances[team] - avg_distance; + total_error += err * err; + } + + return total_error; } -pickradiotospawn() //checked partially changed to match cerberus output did not change while loop to for loop see github for more info +pickradiotospawn() { - foreach ( team in level.teams ) - { - avgpos[ team ] = ( 0, 0, 0 ); - num[ team ] = 0; - } - for ( i = 0; i < level.players.size; i++ ) - { - player = level.players[ i ]; - if ( isalive( player ) ) - { - avgpos[ player.pers[ "team" ] ] += player.origin; - num[ player.pers[ "team" ] ]++; - } - } - if ( getcountofteamswithplayers( num ) <= 1 ) - { - radio = level.radios[ randomint( level.radios.size ) ]; - while ( isDefined( level.prevradio ) && radio == level.prevradio ) - { - radio = level.radios[ randomint( level.radios.size ) ]; - } - level.prevradio2 = level.prevradio; - level.prevradio = radio; - return radio; - } - foreach ( team in level.teams ) - { - if ( num[ team ] == 0 ) - { - avgpos[team] = undefined; - } - else - { - avgpos[ team ] /= num[ team ]; - } - } - bestradio = undefined; - lowestcost = undefined; - i = 0; - while ( i < level.radios.size ) - { - radio = level.radios[ i ]; - cost = getpointcost( avgpos, radio.origin ); - if ( isDefined( level.prevradio ) && radio == level.prevradio ) - { - i++; - continue; - } - if ( isDefined( level.prevradio2 ) && radio == level.prevradio2 ) - { - if ( level.radios.size > 2 ) - { - i++; - continue; - } - else - { - cost += 262144; - } - } - if ( !isDefined( lowestcost ) || cost < lowestcost ) - { - lowestcost = cost; - bestradio = radio; - } - i++; - } - /* + foreach ( team in level.teams ) + { + avgpos[team] = ( 0, 0, 0 ); + num[team] = 0; + } + + for ( i = 0; i < level.players.size; i++ ) + { + player = level.players[i]; + + if ( isalive( player ) ) + { + avgpos[player.pers["team"]] += player.origin; + num[player.pers["team"]]++; + } + } + + if ( getcountofteamswithplayers( num ) <= 1 ) + { + for ( radio = level.radios[randomint( level.radios.size )]; isdefined( level.prevradio ) && radio == level.prevradio; radio = level.radios[randomint( level.radios.size )] ) + { + + } + + level.prevradio2 = level.prevradio; + level.prevradio = radio; + return radio; + } + + foreach ( team in level.teams ) + { + if ( num[team] == 0 ) + { + avgpos[team] = undefined; + continue; + } + + avgpos[team] /= num[team]; + } + + bestradio = undefined; + lowestcost = undefined; + + for ( i = 0; i < level.radios.size; i++ ) + { + radio = level.radios[i]; + cost = getpointcost( avgpos, radio.origin ); + + if ( isdefined( level.prevradio ) && radio == level.prevradio ) + continue; + + if ( isdefined( level.prevradio2 ) && radio == level.prevradio2 ) + { + if ( level.radios.size > 2 ) + continue; + else + cost += 262144; + } + + if ( !isdefined( lowestcost ) || cost < lowestcost ) + { + lowestcost = cost; + bestradio = radio; + } + } + /# - assert( isDefined( bestradio ) ); + assert( isdefined( bestradio ) ); #/ - */ - level.prevradio2 = level.prevradio; - level.prevradio = bestradio; - return bestradio; + level.prevradio2 = level.prevradio; + level.prevradio = bestradio; + return bestradio; } -onroundswitch() //checked matches cerberus output +onroundswitch() { - game[ "switchedsides" ] = !game[ "switchedsides" ]; + game["switchedsides"] = !game["switchedsides"]; } -onplayerkilled( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ) //checked changed to match cerberus output +onplayerkilled( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ) { - if ( isplayer( attacker ) || ( !self.touchtriggers.size && !attacker.touchtriggers.size ) || attacker.pers[ "team" ] == self.pers[ "team" ] ) - { - return; - } - medalgiven = 0; - scoreeventprocessed = 0; - if ( attacker.touchtriggers.size ) - { - triggerids = getarraykeys( attacker.touchtriggers ); - ownerteam = attacker.touchtriggers[ triggerids[ 0 ] ].useobj.ownerteam; - team = attacker.pers[ "team" ]; - if ( team == ownerteam || ownerteam == "neutral" ) - { - if ( !medalgiven ) - { - if ( isDefined( attacker.pers[ "defends" ] ) ) - { - attacker.pers[ "defends" ]++; - attacker.defends = attacker.pers[ "defends" ]; - } - attacker maps/mp/_medals::defenseglobalcount(); - medalgiven = 1; - attacker addplayerstatwithgametype( "DEFENDS", 1 ); - attacker recordgameevent( "return" ); - } - attacker maps/mp/_challenges::killedzoneattacker( sweapon ); - if ( team != ownerteam ) - { - maps/mp/_scoreevents::processscoreevent( "kill_enemy_while_capping_hq", attacker, undefined, sweapon ); - } - else - { - maps/mp/_scoreevents::processscoreevent( "killed_attacker", attacker, undefined, sweapon ); - } - self recordkillmodifier( "assaulting" ); - scoreeventprocessed = 1; - } - else if ( !medalgiven ) - { - attacker maps/mp/_medals::offenseglobalcount(); - medalgiven = 1; - attacker addplayerstatwithgametype( "OFFENDS", 1 ); - } - maps/mp/_scoreevents::processscoreevent( "kill_enemy_while_capping_hq", attacker, undefined, sweapon ); - self recordkillmodifier( "defending" ); - scoreeventprocessed = 1; - } - if ( self.touchtriggers.size ) - { - triggerids = getarraykeys( self.touchtriggers ); - ownerteam = self.touchtriggers[ triggerids[ 0 ] ].useobj.ownerteam; - team = self.pers[ "team" ]; - if ( team == ownerteam ) - { - if ( !medalgiven ) - { - attacker maps/mp/_medals::offenseglobalcount(); - attacker addplayerstatwithgametype( "OFFENDS", 1 ); - medalgiven = 1; - } - if ( !scoreeventprocessed ) - { - maps/mp/_scoreevents::processscoreevent( "killed_defender", attacker, undefined, sweapon ); - self recordkillmodifier( "defending" ); - scoreeventprocessed = 1; - } - } - else if ( !medalgiven ) - { - if ( isDefined( attacker.pers[ "defends" ] ) ) - { - attacker.pers[ "defends" ]++; - attacker.defends = attacker.pers[ "defends" ]; - } - attacker maps/mp/_medals::defenseglobalcount(); - medalgiven = 1; - attacker addplayerstatwithgametype( "DEFENDS", 1 ); - attacker recordgameevent( "return" ); - } - if ( !scoreeventprocessed ) - { - attacker maps/mp/_challenges::killedzoneattacker( sweapon ); - maps/mp/_scoreevents::processscoreevent( "killed_attacker", attacker, undefined, sweapon ); - self recordkillmodifier( "assaulting" ); - scoreeventprocessed = 1; - } - if ( scoreeventprocessed == 1 ) - { - attacker killwhilecontesting( self.touchtriggers[ triggerids[ 0 ] ].useobj ); - } - } + if ( !isplayer( attacker ) || !self.touchtriggers.size && !attacker.touchtriggers.size || attacker.pers["team"] == self.pers["team"] ) + return; + + medalgiven = 0; + scoreeventprocessed = 0; + + if ( attacker.touchtriggers.size ) + { + triggerids = getarraykeys( attacker.touchtriggers ); + ownerteam = attacker.touchtriggers[triggerids[0]].useobj.ownerteam; + team = attacker.pers["team"]; + + if ( team == ownerteam || ownerteam == "neutral" ) + { + if ( !medalgiven ) + { + if ( isdefined( attacker.pers["defends"] ) ) + { + attacker.pers["defends"]++; + attacker.defends = attacker.pers["defends"]; + } + + attacker maps\mp\_medals::defenseglobalcount(); + medalgiven = 1; + attacker addplayerstatwithgametype( "DEFENDS", 1 ); + attacker recordgameevent( "return" ); + } + + attacker maps\mp\_challenges::killedzoneattacker( sweapon ); + + if ( team != ownerteam ) + maps\mp\_scoreevents::processscoreevent( "kill_enemy_while_capping_hq", attacker, undefined, sweapon ); + else + maps\mp\_scoreevents::processscoreevent( "killed_attacker", attacker, undefined, sweapon ); + + self recordkillmodifier( "assaulting" ); + scoreeventprocessed = 1; + } + else + { + if ( !medalgiven ) + { + attacker maps\mp\_medals::offenseglobalcount(); + medalgiven = 1; + attacker addplayerstatwithgametype( "OFFENDS", 1 ); + } + + maps\mp\_scoreevents::processscoreevent( "kill_enemy_while_capping_hq", attacker, undefined, sweapon ); + self recordkillmodifier( "defending" ); + scoreeventprocessed = 1; + } + } + + if ( self.touchtriggers.size ) + { + triggerids = getarraykeys( self.touchtriggers ); + ownerteam = self.touchtriggers[triggerids[0]].useobj.ownerteam; + team = self.pers["team"]; + + if ( team == ownerteam ) + { + if ( !medalgiven ) + { + attacker maps\mp\_medals::offenseglobalcount(); + attacker addplayerstatwithgametype( "OFFENDS", 1 ); + medalgiven = 1; + } + + if ( !scoreeventprocessed ) + { + maps\mp\_scoreevents::processscoreevent( "killed_defender", attacker, undefined, sweapon ); + self recordkillmodifier( "defending" ); + scoreeventprocessed = 1; + } + } + else + { + if ( !medalgiven ) + { + if ( isdefined( attacker.pers["defends"] ) ) + { + attacker.pers["defends"]++; + attacker.defends = attacker.pers["defends"]; + } + + attacker maps\mp\_medals::defenseglobalcount(); + medalgiven = 1; + attacker addplayerstatwithgametype( "DEFENDS", 1 ); + attacker recordgameevent( "return" ); + } + + if ( !scoreeventprocessed ) + { + attacker maps\mp\_challenges::killedzoneattacker( sweapon ); + maps\mp\_scoreevents::processscoreevent( "killed_attacker", attacker, undefined, sweapon ); + self recordkillmodifier( "assaulting" ); + scoreeventprocessed = 1; + } + } + + if ( scoreeventprocessed == 1 ) + attacker killwhilecontesting( self.touchtriggers[triggerids[0]].useobj ); + } } -killwhilecontesting( radio ) //checked matches cerberus output +killwhilecontesting( radio ) { - self notify( "killWhileContesting" ); - self endon( "killWhileContesting" ); - self endon( "disconnect" ); - killtime = getTime(); - playerteam = self.pers[ "team" ]; - if ( !isDefined( self.clearenemycount ) ) - { - self.clearenemycount = 0; - } - self.clearenemycount++; - radio waittill( "state_change" ); - if ( playerteam != self.pers[ "team" ] || isDefined( self.spawntime ) && ( killtime < self.spawntime ) ) - { - self.clearenemycount = 0; - return; - } - if ( radio.ownerteam != playerteam && radio.ownerteam != "neutral" ) - { - self.clearenemycount = 0; - return; - } - if ( self.clearenemycount >= 2 && ( killtime + 200 ) > getTime() ) - { - maps/mp/_scoreevents::processscoreevent( "clear_2_attackers", self ); - } - self.clearenemycount = 0; + self notify( "killWhileContesting" ); + self endon( "killWhileContesting" ); + self endon( "disconnect" ); + killtime = gettime(); + playerteam = self.pers["team"]; + + if ( !isdefined( self.clearenemycount ) ) + self.clearenemycount = 0; + + self.clearenemycount++; + + radio waittill( "state_change" ); + + if ( playerteam != self.pers["team"] || isdefined( self.spawntime ) && killtime < self.spawntime ) + { + self.clearenemycount = 0; + return; + } + + if ( radio.ownerteam != playerteam && radio.ownerteam != "neutral" ) + { + self.clearenemycount = 0; + return; + } + + if ( self.clearenemycount >= 2 && killtime + 200 > gettime() ) + maps\mp\_scoreevents::processscoreevent( "clear_2_attackers", self ); + + self.clearenemycount = 0; } -onendgame( winningteam ) //checked changed to match cerberus output +onendgame( winningteam ) { - for ( i = 0; i < level.radios.size; i++ ) - { - level.radios[ i ].gameobject maps/mp/gametypes/_gameobjects::allowuse( "none" ); - } + for ( i = 0; i < level.radios.size; i++ ) + level.radios[i].gameobject maps\mp\gametypes\_gameobjects::allowuse( "none" ); } -createradiospawninfluencer() //checked matches cerberus output +createradiospawninfluencer() { - hq_objective_influencer_score = level.spawnsystem.hq_objective_influencer_score; - hq_objective_influencer_score_curve = level.spawnsystem.hq_objective_influencer_score_curve; - hq_objective_influencer_radius = level.spawnsystem.hq_objective_influencer_radius; - hq_objective_influencer_inner_score = level.spawnsystem.hq_objective_influencer_inner_score; - hq_objective_influencer_inner_score_curve = level.spawnsystem.hq_objective_influencer_inner_score_curve; - hq_objective_influencer_inner_radius = level.spawnsystem.hq_objective_influencer_inner_radius; - self.spawn_influencer = addsphereinfluencer( level.spawnsystem.einfluencer_type_game_mode, self.gameobject.curorigin, hq_objective_influencer_radius, hq_objective_influencer_score, 0, "hq_objective,r,s", maps/mp/gametypes/_spawning::get_score_curve_index( hq_objective_influencer_score_curve ) ); - self.spawn_influencer_inner = addsphereinfluencer( level.spawnsystem.einfluencer_type_game_mode, self.gameobject.curorigin, hq_objective_influencer_inner_radius, hq_objective_influencer_inner_score, 0, "hq_objective_inner,r,s", maps/mp/gametypes/_spawning::get_score_curve_index( hq_objective_influencer_inner_score_curve ) ); - self enable_radio_spawn_influencer( 0 ); + hq_objective_influencer_score = level.spawnsystem.hq_objective_influencer_score; + hq_objective_influencer_score_curve = level.spawnsystem.hq_objective_influencer_score_curve; + hq_objective_influencer_radius = level.spawnsystem.hq_objective_influencer_radius; + hq_objective_influencer_inner_score = level.spawnsystem.hq_objective_influencer_inner_score; + hq_objective_influencer_inner_score_curve = level.spawnsystem.hq_objective_influencer_inner_score_curve; + hq_objective_influencer_inner_radius = level.spawnsystem.hq_objective_influencer_inner_radius; + self.spawn_influencer = addsphereinfluencer( level.spawnsystem.einfluencer_type_game_mode, self.gameobject.curorigin, hq_objective_influencer_radius, hq_objective_influencer_score, 0, "hq_objective,r,s", maps\mp\gametypes\_spawning::get_score_curve_index( hq_objective_influencer_score_curve ) ); + self.spawn_influencer_inner = addsphereinfluencer( level.spawnsystem.einfluencer_type_game_mode, self.gameobject.curorigin, hq_objective_influencer_inner_radius, hq_objective_influencer_inner_score, 0, "hq_objective_inner,r,s", maps\mp\gametypes\_spawning::get_score_curve_index( hq_objective_influencer_inner_score_curve ) ); + self enable_radio_spawn_influencer( 0 ); } -enable_radio_spawn_influencer( enabled ) //checked matches cerberus output +enable_radio_spawn_influencer( enabled ) { - if ( isDefined( self.spawn_influencer ) ) - { - enableinfluencer( self.spawn_influencer, enabled ); - enableinfluencer( self.spawn_influencer_inner, enabled ); - } + if ( isdefined( self.spawn_influencer ) ) + { + enableinfluencer( self.spawn_influencer, enabled ); + enableinfluencer( self.spawn_influencer_inner, enabled ); + } } -koth_gamemodespawndvars( reset_dvars ) //checked matches cerberus output +koth_gamemodespawndvars( reset_dvars ) { - ss = level.spawnsystem; - ss.hq_objective_influencer_score = set_dvar_float_if_unset( "scr_spawn_hq_objective_influencer_score", "200", reset_dvars ); - ss.hq_objective_influencer_score_curve = set_dvar_if_unset( "scr_spawn_hq_objective_influencer_score_curve", "linear", reset_dvars ); - ss.hq_objective_influencer_radius = 4000; - ss.hq_objective_influencer_inner_score = set_dvar_float_if_unset( "scr_spawn_hq_objective_influencer_inner_score", "-600", reset_dvars ); - ss.hq_objective_influencer_inner_score_curve = "constant"; - ss.hq_objective_influencer_inner_radius = set_dvar_float_if_unset( "scr_spawn_hq_objective_influencer_inner_radius", "2000", reset_dvars ); - ss.hq_initial_spawns_influencer_score = set_dvar_float_if_unset( "scr_spawn_hq_initial_spawns_influencer_score", "200", reset_dvars ); - ss.hq_initial_spawns_influencer_score_curve = set_dvar_if_unset( "scr_spawn_hq_initial_spawns_influencer_score_curve", "linear", reset_dvars ); - ss.hq_initial_spawns_influencer_radius = set_dvar_float_if_unset( "scr_spawn_hq_initial_spawns_influencer_radius", "" + ( 10 * get_player_height() ), reset_dvars ); + ss = level.spawnsystem; + ss.hq_objective_influencer_score = set_dvar_float_if_unset( "scr_spawn_hq_objective_influencer_score", "200", reset_dvars ); + ss.hq_objective_influencer_score_curve = set_dvar_if_unset( "scr_spawn_hq_objective_influencer_score_curve", "linear", reset_dvars ); + ss.hq_objective_influencer_radius = 4000; + ss.hq_objective_influencer_inner_score = set_dvar_float_if_unset( "scr_spawn_hq_objective_influencer_inner_score", "-600", reset_dvars ); + ss.hq_objective_influencer_inner_score_curve = "constant"; + ss.hq_objective_influencer_inner_radius = set_dvar_float_if_unset( "scr_spawn_hq_objective_influencer_inner_radius", "2000", reset_dvars ); + ss.hq_initial_spawns_influencer_score = set_dvar_float_if_unset( "scr_spawn_hq_initial_spawns_influencer_score", "200", reset_dvars ); + ss.hq_initial_spawns_influencer_score_curve = set_dvar_if_unset( "scr_spawn_hq_initial_spawns_influencer_score_curve", "linear", reset_dvars ); + ss.hq_initial_spawns_influencer_radius = set_dvar_float_if_unset( "scr_spawn_hq_initial_spawns_influencer_radius", "" + 10.0 * get_player_height(), reset_dvars ); } -onupdateuserate() //checked changed to match cerberus output +onupdateuserate() { - if ( !isDefined( self.currentcontendercount ) ) - { - self.currentcontendercount = 0; - } - numothers = getnumtouchingexceptteam( self.ownerteam ); - numowners = self.numtouching[ self.ownerteam ]; - previousstate = self.currentcontendercount; - if ( numothers == 0 && numowners == 0 ) - { - self.currentcontendercount = 0; - } - else if ( self.ownerteam == "neutral" ) - { - numotherclaim = getnumtouchingexceptteam( self.claimteam ); - if ( numotherclaim > 0 ) - { - self.currentcontendercount = 2; - } - else - { - self.currentcontendercount = 1; - } - } - else if ( numothers > 0 ) - { - self.currentcontendercount = 1; - } - else - { - self.currentcontendercount = 0; - } - if ( self.currentcontendercount != previousstate ) - { - self notify( "state_change" ); - } + if ( !isdefined( self.currentcontendercount ) ) + self.currentcontendercount = 0; + + numothers = getnumtouchingexceptteam( self.ownerteam ); + numowners = self.numtouching[self.ownerteam]; + previousstate = self.currentcontendercount; + + if ( numothers == 0 && numowners == 0 ) + self.currentcontendercount = 0; + else if ( self.ownerteam == "neutral" ) + { + numotherclaim = getnumtouchingexceptteam( self.claimteam ); + + if ( numotherclaim > 0 ) + self.currentcontendercount = 2; + else + self.currentcontendercount = 1; + } + else if ( numothers > 0 ) + self.currentcontendercount = 1; + else + self.currentcontendercount = 0; + + if ( self.currentcontendercount != previousstate ) + self notify( "state_change" ); } - - diff --git a/Multiplayer Core/patch_mp/maps/mp/gametypes/koth.gsc b/Multiplayer Core/patch_mp/maps/mp/gametypes/koth.gsc index 5fe737e..fe3b90c 100644 --- a/Multiplayer Core/patch_mp/maps/mp/gametypes/koth.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/gametypes/koth.gsc @@ -1,1453 +1,1417 @@ -#include maps/mp/_medals; -#include maps/mp/gametypes/_hostmigration; -#include maps/mp/_demo; -#include maps/mp/_popups; -#include maps/mp/_scoreevents; -#include maps/mp/gametypes/_globallogic_utils; -#include maps/mp/_challenges; -#include maps/mp/gametypes/_battlechatter_mp; -#include maps/mp/gametypes/_spawnlogic; -#include maps/mp/gametypes/_spawning; -#include maps/mp/gametypes/_globallogic_score; -#include maps/mp/gametypes/_gameobjects; -#include maps/mp/gametypes/_globallogic_audio; -#include maps/mp/gametypes/_callbacksetup; -#include maps/mp/gametypes/_globallogic; -#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 -main() //checked changed to match cerberus output +main() { - if ( getDvar( "mapname" ) == "mp_background" ) - { - return; - } - maps/mp/gametypes/_globallogic::init(); - maps/mp/gametypes/_callbacksetup::setupcallbacks(); - maps/mp/gametypes/_globallogic::setupcallbacks(); - registertimelimit( 0, 1440 ); - registerscorelimit( 0, 1000 ); - registernumlives( 0, 100 ); - registerroundswitch( 0, 9 ); - registerroundwinlimit( 0, 10 ); - maps/mp/gametypes/_globallogic::registerfriendlyfiredelay( level.gametype, 15, 0, 1440 ); - level.teambased = 1; - level.doprematch = 1; - level.overrideteamscore = 1; - level.scoreroundbased = 1; - level.kothstarttime = 0; - level.onstartgametype = ::onstartgametype; - level.onspawnplayer = ::onspawnplayer; - level.onspawnplayerunified = ::onspawnplayerunified; - level.playerspawnedcb = ::koth_playerspawnedcb; - level.onroundswitch = ::onroundswitch; - level.onplayerkilled = ::onplayerkilled; - level.onendgame = ::onendgame; - level.gamemodespawndvars = ::koth_gamemodespawndvars; - loadfx( "maps/mp_maps/fx_mp_koth_marker_neutral_1" ); - loadfx( "maps/mp_maps/fx_mp_koth_marker_neutral_wndw" ); - precachestring( &"MP_WAITING_FOR_HQ" ); - precachestring( &"MP_KOTH_CAPTURED_BY" ); - precachestring( &"MP_KOTH_CAPTURED_BY_ENEMY" ); - precachestring( &"MP_KOTH_MOVING_IN" ); - precachestring( &"MP_CAPTURING_OBJECTIVE" ); - precachestring( &"MP_KOTH_CONTESTED_BY_ENEMY" ); - precachestring( &"MP_KOTH_AVAILABLE_IN" ); - registerclientfield( "world", "hardpoint", 1, 5, "int" ); - level.zoneautomovetime = getgametypesetting( "autoDestroyTime" ); - level.zonespawntime = getgametypesetting( "objectiveSpawnTime" ); - level.kothmode = getgametypesetting( "kothMode" ); - level.capturetime = getgametypesetting( "captureTime" ); - level.destroytime = getgametypesetting( "destroyTime" ); - level.delayplayer = getgametypesetting( "delayPlayer" ); - level.randomzonespawn = getgametypesetting( "randomObjectiveLocations" ); - level.scoreperplayer = getgametypesetting( "scorePerPlayer" ); - level.iconoffset = vectorScale( ( 0, 0, 1 ), 32 ); - level.onrespawndelay = ::getrespawndelay; - game[ "dialog" ][ "gametype" ] = "koth_start"; - game[ "dialog" ][ "gametype_hardcore" ] = "koth_start"; - game[ "dialog" ][ "offense_obj" ] = "cap_start"; - game[ "dialog" ][ "defense_obj" ] = "cap_start"; - game[ "objective_gained_sound" ] = "mpl_flagcapture_sting_friend"; - game[ "objective_lost_sound" ] = "mpl_flagcapture_sting_enemy"; - game[ "objective_contested_sound" ] = "mpl_flagreturn_sting"; - level.lastdialogtime = 0; - level.zonespawnqueue = []; - if ( !sessionmodeissystemlink() && !sessionmodeisonlinegame() && issplitscreen() ) - { - setscoreboardcolumns( "score", "kills", "captures", "defends", "deaths" ); - } - else - { - setscoreboardcolumns( "score", "kills", "deaths", "captures", "defends" ); - } - maps/mp/gametypes/_globallogic_audio::registerdialoggroup( "gamemode_objective", 0 ); - /* + if ( getdvar( "mapname" ) == "mp_background" ) + return; + + maps\mp\gametypes\_globallogic::init(); + maps\mp\gametypes\_callbacksetup::setupcallbacks(); + maps\mp\gametypes\_globallogic::setupcallbacks(); + registertimelimit( 0, 1440 ); + registerscorelimit( 0, 1000 ); + registernumlives( 0, 100 ); + registerroundswitch( 0, 9 ); + registerroundwinlimit( 0, 10 ); + maps\mp\gametypes\_globallogic::registerfriendlyfiredelay( level.gametype, 15, 0, 1440 ); + level.teambased = 1; + level.doprematch = 1; + level.overrideteamscore = 1; + level.scoreroundbased = 1; + level.kothstarttime = 0; + level.onstartgametype = ::onstartgametype; + level.onspawnplayer = ::onspawnplayer; + level.onspawnplayerunified = ::onspawnplayerunified; + level.playerspawnedcb = ::koth_playerspawnedcb; + level.onroundswitch = ::onroundswitch; + level.onplayerkilled = ::onplayerkilled; + level.onendgame = ::onendgame; + level.gamemodespawndvars = ::koth_gamemodespawndvars; + loadfx( "maps/mp_maps/fx_mp_koth_marker_neutral_1" ); + loadfx( "maps/mp_maps/fx_mp_koth_marker_neutral_wndw" ); + precachestring( &"MP_WAITING_FOR_HQ" ); + precachestring( &"MP_KOTH_CAPTURED_BY" ); + precachestring( &"MP_KOTH_CAPTURED_BY_ENEMY" ); + precachestring( &"MP_KOTH_MOVING_IN" ); + precachestring( &"MP_CAPTURING_OBJECTIVE" ); + precachestring( &"MP_KOTH_CONTESTED_BY_ENEMY" ); + precachestring( &"MP_KOTH_AVAILABLE_IN" ); + registerclientfield( "world", "hardpoint", 1, 5, "int" ); + level.zoneautomovetime = getgametypesetting( "autoDestroyTime" ); + level.zonespawntime = getgametypesetting( "objectiveSpawnTime" ); + level.kothmode = getgametypesetting( "kothMode" ); + level.capturetime = getgametypesetting( "captureTime" ); + level.destroytime = getgametypesetting( "destroyTime" ); + level.delayplayer = getgametypesetting( "delayPlayer" ); + level.randomzonespawn = getgametypesetting( "randomObjectiveLocations" ); + level.scoreperplayer = getgametypesetting( "scorePerPlayer" ); + level.iconoffset = vectorscale( ( 0, 0, 1 ), 32.0 ); + level.onrespawndelay = ::getrespawndelay; + game["dialog"]["gametype"] = "koth_start"; + game["dialog"]["gametype_hardcore"] = "koth_start"; + game["dialog"]["offense_obj"] = "cap_start"; + game["dialog"]["defense_obj"] = "cap_start"; + game["objective_gained_sound"] = "mpl_flagcapture_sting_friend"; + game["objective_lost_sound"] = "mpl_flagcapture_sting_enemy"; + game["objective_contested_sound"] = "mpl_flagreturn_sting"; + level.lastdialogtime = 0; + level.zonespawnqueue = []; + + if ( !sessionmodeissystemlink() && !sessionmodeisonlinegame() && issplitscreen() ) + setscoreboardcolumns( "score", "kills", "captures", "defends", "deaths" ); + else + setscoreboardcolumns( "score", "kills", "deaths", "captures", "defends" ); + + maps\mp\gametypes\_globallogic_audio::registerdialoggroup( "gamemode_objective", 0 ); /# - trigs = getentarray( "radiotrigger", "targetname" ); - foreach ( trig in trigs ) - { - trig delete(); + trigs = getentarray( "radiotrigger", "targetname" ); + + foreach ( trig in trigs ) + trig delete(); #/ - } - */ } -updateobjectivehintmessages( defenderteam, defendmessage, attackmessage ) //checked partially changed to match cerberus output did not use continue in foreach see github for more info +updateobjectivehintmessages( defenderteam, defendmessage, attackmessage ) { - foreach ( team in level.teams ) - { - if ( defenderteam == team ) - { - game[ "strings" ][ "objective_hint_" + team ] = defendmessage; - } - else - { - game[ "strings" ][ "objective_hint_" + team ] = attackmessage; - } - } + foreach ( team in level.teams ) + { + if ( defenderteam == team ) + { + game["strings"]["objective_hint_" + team] = defendmessage; + continue; + } + + game["strings"]["objective_hint_" + team] = attackmessage; + } } -updateobjectivehintmessage( message ) //checked changed to match cerberus output +updateobjectivehintmessage( message ) { - foreach ( team in level.teams ) - { - game[ "strings" ][ "objective_hint_" + team ] = message; - } + foreach ( team in level.teams ) + game["strings"]["objective_hint_" + team] = message; } -getrespawndelay() //checked matches cerberus output +getrespawndelay() { - self.lowermessageoverride = undefined; - if ( !isDefined( level.zone.gameobject ) ) - { - return undefined; - } - zoneowningteam = level.zone.gameobject maps/mp/gametypes/_gameobjects::getownerteam(); - if ( self.pers[ "team" ] == zoneowningteam ) - { - if ( !isDefined( level.zonemovetime ) ) - { - return undefined; - } - timeremaining = ( level.zonemovetime - getTime() ) / 1000; - if ( !level.playerobjectiveheldrespawndelay ) - { - return undefined; - } - if ( level.playerobjectiveheldrespawndelay >= level.zoneautomovetime ) - { - self.lowermessageoverride = &"MP_WAITING_FOR_HQ"; - } - if ( level.delayplayer ) - { - return min( level.spawndelay, timeremaining ); - } - else - { - return ceil( timeremaining ); - } - } + self.lowermessageoverride = undefined; + + if ( !isdefined( level.zone.gameobject ) ) + return undefined; + + zoneowningteam = level.zone.gameobject maps\mp\gametypes\_gameobjects::getownerteam(); + + if ( self.pers["team"] == zoneowningteam ) + { + if ( !isdefined( level.zonemovetime ) ) + return undefined; + + timeremaining = ( level.zonemovetime - gettime() ) / 1000; + + if ( !level.playerobjectiveheldrespawndelay ) + return undefined; + + if ( level.playerobjectiveheldrespawndelay >= level.zoneautomovetime ) + self.lowermessageoverride = &"MP_WAITING_FOR_HQ"; + + if ( level.delayplayer ) + return min( level.spawndelay, timeremaining ); + else + return ceil( timeremaining ); + } } -onstartgametype() //checked partially changed to match cerberus output did not use continue in foreach see github for more info +onstartgametype() { - if ( !isDefined( game[ "switchedsides" ] ) ) - { - game[ "switchedsides" ] = 0; - } - if ( game[ "switchedsides" ] ) - { - oldattackers = game[ "attackers" ]; - olddefenders = game[ "defenders" ]; - game[ "attackers" ] = olddefenders; - game[ "defenders" ] = oldattackers; - } - maps/mp/gametypes/_globallogic_score::resetteamscores(); - foreach ( team in level.teams ) - { - setobjectivetext( team, &"OBJECTIVES_KOTH" ); - if ( level.splitscreen ) - { - setobjectivescoretext( team, &"OBJECTIVES_KOTH" ); - } - else - { - setobjectivescoretext( team, &"OBJECTIVES_KOTH_SCORE" ); - } - } - level.objectivehintpreparezone = &"MP_CONTROL_KOTH"; - level.objectivehintcapturezone = &"MP_CAPTURE_KOTH"; - level.objectivehintdefendhq = &"MP_DEFEND_KOTH"; - precachestring( level.objectivehintpreparezone ); - precachestring( level.objectivehintcapturezone ); - precachestring( level.objectivehintdefendhq ); - if ( level.zonespawntime ) - { - updateobjectivehintmessage( level.objectivehintpreparezone ); - } - else - { - updateobjectivehintmessage( level.objectivehintcapturezone ); - } - setclientnamemode( "auto_change" ); - allowed = []; - allowed[ 0 ] = "koth"; - maps/mp/gametypes/_gameobjects::main( allowed ); - maps/mp/gametypes/_spawning::create_map_placed_influencers(); - level.spawnmins = ( 0, 0, 0 ); - level.spawnmaxs = ( 0, 0, 0 ); - foreach ( team in level.teams ) - { - maps/mp/gametypes/_spawnlogic::addspawnpoints( team, "mp_tdm_spawn" ); - maps/mp/gametypes/_spawnlogic::addspawnpoints( team, "mp_multi_team_spawn" ); - maps/mp/gametypes/_spawnlogic::placespawnpoints( maps/mp/gametypes/_spawning::gettdmstartspawnname( team ) ); - } - maps/mp/gametypes/_spawning::updateallspawnpoints(); - level.spawn_start = []; - foreach ( team in level.teams ) - { - level.spawn_start[ team ] = maps/mp/gametypes/_spawnlogic::getspawnpointarray( maps/mp/gametypes/_spawning::gettdmstartspawnname( team ) ); - } - 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.spawn_all = maps/mp/gametypes/_spawnlogic::getspawnpointarray( "mp_tdm_spawn" ); - if ( !level.spawn_all.size ) - { - /* + if ( !isdefined( game["switchedsides"] ) ) + game["switchedsides"] = 0; + + if ( game["switchedsides"] ) + { + oldattackers = game["attackers"]; + olddefenders = game["defenders"]; + game["attackers"] = olddefenders; + game["defenders"] = oldattackers; + } + + maps\mp\gametypes\_globallogic_score::resetteamscores(); + + foreach ( team in level.teams ) + { + setobjectivetext( team, &"OBJECTIVES_KOTH" ); + + if ( level.splitscreen ) + { + setobjectivescoretext( team, &"OBJECTIVES_KOTH" ); + continue; + } + + setobjectivescoretext( team, &"OBJECTIVES_KOTH_SCORE" ); + } + + level.objectivehintpreparezone = &"MP_CONTROL_KOTH"; + level.objectivehintcapturezone = &"MP_CAPTURE_KOTH"; + level.objectivehintdefendhq = &"MP_DEFEND_KOTH"; + precachestring( level.objectivehintpreparezone ); + precachestring( level.objectivehintcapturezone ); + precachestring( level.objectivehintdefendhq ); + + if ( level.zonespawntime ) + updateobjectivehintmessage( level.objectivehintpreparezone ); + else + updateobjectivehintmessage( level.objectivehintcapturezone ); + + setclientnamemode( "auto_change" ); + allowed[0] = "koth"; + maps\mp\gametypes\_gameobjects::main( allowed ); + maps\mp\gametypes\_spawning::create_map_placed_influencers(); + level.spawnmins = ( 0, 0, 0 ); + level.spawnmaxs = ( 0, 0, 0 ); + + foreach ( team in level.teams ) + { + maps\mp\gametypes\_spawnlogic::addspawnpoints( team, "mp_tdm_spawn" ); + maps\mp\gametypes\_spawnlogic::addspawnpoints( team, "mp_multi_team_spawn" ); + maps\mp\gametypes\_spawnlogic::placespawnpoints( maps\mp\gametypes\_spawning::gettdmstartspawnname( team ) ); + } + + maps\mp\gametypes\_spawning::updateallspawnpoints(); + level.spawn_start = []; + + foreach ( team in level.teams ) + level.spawn_start[team] = maps\mp\gametypes\_spawnlogic::getspawnpointarray( maps\mp\gametypes\_spawning::gettdmstartspawnname( team ) ); + + 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.spawn_all = maps\mp\gametypes\_spawnlogic::getspawnpointarray( "mp_tdm_spawn" ); + + if ( !level.spawn_all.size ) + { /# - println( "^1No mp_tdm_spawn spawnpoints in level!" ); + println( "^1No mp_tdm_spawn spawnpoints in level!" ); #/ - */ - maps/mp/gametypes/_callbacksetup::abortlevel(); - return; - } - thread setupzones(); - updategametypedvars(); - thread kothmainloop(); + maps\mp\gametypes\_callbacksetup::abortlevel(); + return; + } + + thread setupzones(); + updategametypedvars(); + thread kothmainloop(); } -updategametypedvars() //checked matches cerberus output +updategametypedvars() { - level.playercapturelpm = getgametypesetting( "maxPlayerEventsPerMinute" ); + level.playercapturelpm = getgametypesetting( "maxPlayerEventsPerMinute" ); } -spawn_first_zone( delay ) //checked matches cerberus output +spawn_first_zone( delay ) { - if ( level.randomzonespawn == 1 ) - { - level.zone = getnextzonefromqueue(); - } - else - { - level.zone = getfirstzone(); - } - if ( isDefined( level.zone ) ) - { - logstring( "zone spawned: (" + level.zone.trigorigin[ 0 ] + "," + level.zone.trigorigin[ 1 ] + "," + level.zone.trigorigin[ 2 ] + ")" ); - level.zone enable_zone_spawn_influencer( 1 ); - } - level.zone.gameobject.trigger allowtacticalinsertion( 0 ); - return; + if ( level.randomzonespawn == 1 ) + level.zone = getnextzonefromqueue(); + else + level.zone = getfirstzone(); + + if ( isdefined( level.zone ) ) + { + logstring( "zone spawned: (" + level.zone.trigorigin[0] + "," + level.zone.trigorigin[1] + "," + level.zone.trigorigin[2] + ")" ); + level.zone enable_zone_spawn_influencer( 1 ); + } + + level.zone.gameobject.trigger allowtacticalinsertion( 0 ); + return; } -spawn_next_zone() //checked matches cerberus output +spawn_next_zone() { - level.zone.gameobject.trigger allowtacticalinsertion( 1 ); - if ( level.randomzonespawn != 0 ) - { - level.zone = getnextzonefromqueue(); - } - else - { - level.zone = getnextzone(); - } - if ( isDefined( level.zone ) ) - { - logstring( "zone spawned: (" + level.zone.trigorigin[ 0 ] + "," + level.zone.trigorigin[ 1 ] + "," + level.zone.trigorigin[ 2 ] + ")" ); - level.zone enable_zone_spawn_influencer( 1 ); - } - level.zone.gameobject.trigger allowtacticalinsertion( 0 ); - return; + level.zone.gameobject.trigger allowtacticalinsertion( 1 ); + + if ( level.randomzonespawn != 0 ) + level.zone = getnextzonefromqueue(); + else + level.zone = getnextzone(); + + if ( isdefined( level.zone ) ) + { + logstring( "zone spawned: (" + level.zone.trigorigin[0] + "," + level.zone.trigorigin[1] + "," + level.zone.trigorigin[2] + ")" ); + level.zone enable_zone_spawn_influencer( 1 ); + } + + level.zone.gameobject.trigger allowtacticalinsertion( 0 ); + return; } -getnumtouching() //checked changed to match cerberus output +getnumtouching() { - numtouching = 0; - foreach ( team in level.teams ) - { - numtouching += self.numtouching[ team ]; - } - return numtouching; + numtouching = 0; + + foreach ( team in level.teams ) + numtouching += self.numtouching[team]; + + return numtouching; } -togglezoneeffects( enabled ) //checked matches cerberus output +togglezoneeffects( enabled ) { - index = 0; - if ( enabled ) - { - index = self.script_index; - } - level setclientfield( "hardpoint", index ); + index = 0; + + if ( enabled ) + index = self.script_index; + + level setclientfield( "hardpoint", index ); } -kothcaptureloop() //checked changed to match cerberus output +kothcaptureloop() { - level endon( "game_ended" ); - level endon( "zone_moved" ); - level.kothstarttime = getTime(); - while ( 1 ) - { - level.zone.gameobject maps/mp/gametypes/_gameobjects::allowuse( "any" ); - level.zone.gameobject maps/mp/gametypes/_gameobjects::setusetime( level.capturetime ); - level.zone.gameobject maps/mp/gametypes/_gameobjects::setusetext( &"MP_CAPTURING_OBJECTIVE" ); - numtouching = level.zone.gameobject getnumtouching(); - level.zone.gameobject maps/mp/gametypes/_gameobjects::setvisibleteam( "any" ); - level.zone.gameobject maps/mp/gametypes/_gameobjects::setmodelvisibility( 1 ); - level.zone.gameobject maps/mp/gametypes/_gameobjects::mustmaintainclaim( 0 ); - level.zone.gameobject maps/mp/gametypes/_gameobjects::cancontestclaim( 1 ); - level.zone.gameobject.onuse = ::onzonecapture; - level.zone.gameobject.onbeginuse = ::onbeginuse; - level.zone.gameobject.onenduse = ::onenduse; - level.zone togglezoneeffects( 1 ); - msg = level waittill_any_return( "zone_captured", "zone_destroyed" ); - if ( msg == "zone_destroyed" ) - { - continue; - } - ownerteam = level.zone.gameobject maps/mp/gametypes/_gameobjects::getownerteam(); - foreach ( team in level.teams ) - { - updateobjectivehintmessages( ownerteam, level.objectivehintdefendhq, level.objectivehintcapturezone ); - } - level.zone.gameobject maps/mp/gametypes/_gameobjects::allowuse( "none" ); - level.zone.gameobject.onuse = undefined; - level.zone.gameobject.onunoccupied = ::onzoneunoccupied; - level.zone.gameobject.oncontested = ::onzonecontested; - level.zone.gameobject.onuncontested = ::onzoneuncontested; - level waittill( "zone_destroyed", destroy_team ); - if ( !level.kothmode || level.zonedestroyedbytimer ) - { - return; - } - thread forcespawnteam( ownerteam ); - if ( isDefined( destroy_team ) ) - { - level.zone.gameobject maps/mp/gametypes/_gameobjects::setownerteam( destroy_team ); - } - else - { - level.zone.gameobject maps/mp/gametypes/_gameobjects::setownerteam( "none" ); - } - } + level endon( "game_ended" ); + level endon( "zone_moved" ); + level.kothstarttime = gettime(); + + while ( true ) + { + level.zone.gameobject maps\mp\gametypes\_gameobjects::allowuse( "any" ); + level.zone.gameobject maps\mp\gametypes\_gameobjects::setusetime( level.capturetime ); + level.zone.gameobject maps\mp\gametypes\_gameobjects::setusetext( &"MP_CAPTURING_OBJECTIVE" ); + numtouching = level.zone.gameobject getnumtouching(); + level.zone.gameobject maps\mp\gametypes\_gameobjects::setvisibleteam( "any" ); + level.zone.gameobject maps\mp\gametypes\_gameobjects::setmodelvisibility( 1 ); + level.zone.gameobject maps\mp\gametypes\_gameobjects::mustmaintainclaim( 0 ); + level.zone.gameobject maps\mp\gametypes\_gameobjects::cancontestclaim( 1 ); + level.zone.gameobject.onuse = ::onzonecapture; + level.zone.gameobject.onbeginuse = ::onbeginuse; + level.zone.gameobject.onenduse = ::onenduse; + level.zone togglezoneeffects( 1 ); + msg = level waittill_any_return( "zone_captured", "zone_destroyed" ); + + if ( msg == "zone_destroyed" ) + continue; + + ownerteam = level.zone.gameobject maps\mp\gametypes\_gameobjects::getownerteam(); + + foreach ( team in level.teams ) + updateobjectivehintmessages( ownerteam, level.objectivehintdefendhq, level.objectivehintcapturezone ); + + level.zone.gameobject maps\mp\gametypes\_gameobjects::allowuse( "none" ); + level.zone.gameobject.onuse = undefined; + level.zone.gameobject.onunoccupied = ::onzoneunoccupied; + level.zone.gameobject.oncontested = ::onzonecontested; + level.zone.gameobject.onuncontested = ::onzoneuncontested; + + level waittill( "zone_destroyed", destroy_team ); + + if ( !level.kothmode || level.zonedestroyedbytimer ) + break; + + thread forcespawnteam( ownerteam ); + + if ( isdefined( destroy_team ) ) + level.zone.gameobject maps\mp\gametypes\_gameobjects::setownerteam( destroy_team ); + else + level.zone.gameobject maps\mp\gametypes\_gameobjects::setownerteam( "none" ); + } } -kothmainloop() //checked changed to match cerberus output +kothmainloop() { - level endon( "game_ended" ); - level.zonerevealtime = -100000; - zonespawninginstr = &"MP_KOTH_AVAILABLE_IN"; - if ( level.kothmode ) - { - zonedestroyedinfriendlystr = &"MP_HQ_DESPAWN_IN"; - zonedestroyedinenemystr = &"MP_KOTH_MOVING_IN"; - } - else - { - zonedestroyedinfriendlystr = &"MP_HQ_REINFORCEMENTS_IN"; - zonedestroyedinenemystr = &"MP_HQ_DESPAWN_IN"; - } - precachestring( zonespawninginstr ); - precachestring( zonedestroyedinfriendlystr ); - precachestring( zonedestroyedinenemystr ); - precachestring( &"MP_CAPTURING_HQ" ); - precachestring( &"MP_DESTROYING_HQ" ); - objective_name = istring( "objective" ); - precachestring( objective_name ); - spawn_first_zone(); - while ( level.inprematchperiod ) - { - wait 0.05; - } - wait 5; - timerdisplay = []; - foreach ( team in level.teams ) - { - timerdisplay[ team ] = createservertimer( "objective", 1.4, team ); - timerdisplay[ team ] setgamemodeinfopoint(); - timerdisplay[ team ].label = zonespawninginstr; - timerdisplay[ team ].font = "extrasmall"; - timerdisplay[ team ].alpha = 0; - timerdisplay[ team ].archived = 0; - timerdisplay[ team ].hidewheninmenu = 1; - timerdisplay[ team ].hidewheninkillcam = 1; - timerdisplay[ team ].showplayerteamhudelemtospectator = 1; - thread hidetimerdisplayongameend( timerdisplay[ team ] ); - } - while ( 1 ) - { - playsoundonplayers( "mp_suitcase_pickup" ); - maps/mp/gametypes/_globallogic_audio::flushgroupdialog( "gamemode_objective" ); - maps/mp/gametypes/_globallogic_audio::leaderdialog( "koth_located" ); - level.zone.gameobject maps/mp/gametypes/_gameobjects::setmodelvisibility( 1 ); - level.zonerevealtime = getTime(); - if ( level.zonespawntime ) - { - level.zone.gameobject maps/mp/gametypes/_gameobjects::setvisibleteam( "any" ); - level.zone.gameobject maps/mp/gametypes/_gameobjects::setflags( 1 ); - updateobjectivehintmessage( level.objectivehintpreparezone ); - foreach ( team in level.teams ) - { - timerdisplay[ team ].label = zonespawninginstr; - timerdisplay[ team ] settimer( level.zonespawntime ); - timerdisplay[ team ].alpha = 1; - } - wait level.zonespawntime; - level.zone.gameobject maps/mp/gametypes/_gameobjects::setflags( 0 ); - maps/mp/gametypes/_globallogic_audio::leaderdialog( "koth_online" ); - } - foreach ( team in level.teams ) - { - timerdisplay[ team ].alpha = 0; - } - waittillframeend; - maps/mp/gametypes/_globallogic_audio::leaderdialog( "obj_capture", undefined, "gamemode_objective" ); - updateobjectivehintmessage( level.objectivehintcapturezone ); - playsoundonplayers( "mpl_hq_cap_us" ); - level.zone.gameobject maps/mp/gametypes/_gameobjects::enableobject(); - level.zone.gameobject.capturecount = 0; - if ( level.zoneautomovetime ) - { - thread movezoneaftertime( level.zoneautomovetime ); - foreach ( team in level.teams ) - { - timerdisplay[ team ] settimer( level.zoneautomovetime ); - } - foreach ( team in level.teams ) - { - timerdisplay[ team ].label = zonedestroyedinenemystr; - timerdisplay[ team ].alpha = 1; - } - } - else - { - level.zonedestroyedbytimer = 0; - } - kothcaptureloop(); - ownerteam = level.zone.gameobject maps/mp/gametypes/_gameobjects::getownerteam(); - if ( level.zone.gameobject.capturecount == 1 ) - { - touchlist = []; - touchkeys = getarraykeys( level.zone.gameobject.touchlist[ ownerteam ] ); - for ( i = 0; i < touchkeys.size; i++ ) - { - touchlist[ touchkeys[ i ] ] = level.zone.gameobject.touchlist[ ownerteam ][ touchkeys[ i ] ]; - } - thread give_held_credit( touchlist ); - } - level.zone enable_zone_spawn_influencer( 0 ); - level.zone.gameobject.lastcaptureteam = undefined; - level.zone.gameobject maps/mp/gametypes/_gameobjects::disableobject(); - level.zone.gameobject maps/mp/gametypes/_gameobjects::allowuse( "none" ); - level.zone.gameobject maps/mp/gametypes/_gameobjects::setownerteam( "neutral" ); - level.zone.gameobject maps/mp/gametypes/_gameobjects::setmodelvisibility( 0 ); - level.zone.gameobject maps/mp/gametypes/_gameobjects::mustmaintainclaim( 0 ); - level.zone togglezoneeffects( 0 ); - level notify( "zone_reset" ); - foreach ( team in level.teams ) - { - timerdisplay[ team ].alpha = 0; - } - spawn_next_zone(); - wait 0.5; - thread forcespawnteam( ownerteam ); - wait 0.5; - } + level endon( "game_ended" ); + level.zonerevealtime = -100000; + zonespawninginstr = &"MP_KOTH_AVAILABLE_IN"; + + if ( level.kothmode ) + { + zonedestroyedinfriendlystr = &"MP_HQ_DESPAWN_IN"; + zonedestroyedinenemystr = &"MP_KOTH_MOVING_IN"; + } + else + { + zonedestroyedinfriendlystr = &"MP_HQ_REINFORCEMENTS_IN"; + zonedestroyedinenemystr = &"MP_HQ_DESPAWN_IN"; + } + + precachestring( zonespawninginstr ); + precachestring( zonedestroyedinfriendlystr ); + precachestring( zonedestroyedinenemystr ); + precachestring( &"MP_CAPTURING_HQ" ); + precachestring( &"MP_DESTROYING_HQ" ); + objective_name = istring( "objective" ); + precachestring( objective_name ); + spawn_first_zone(); + + while ( level.inprematchperiod ) + wait 0.05; + + wait 5; + timerdisplay = []; + + foreach ( team in level.teams ) + { + timerdisplay[team] = createservertimer( "objective", 1.4, team ); + timerdisplay[team] setgamemodeinfopoint(); + timerdisplay[team].label = zonespawninginstr; + timerdisplay[team].font = "extrasmall"; + timerdisplay[team].alpha = 0; + timerdisplay[team].archived = 0; + timerdisplay[team].hidewheninmenu = 1; + timerdisplay[team].hidewheninkillcam = 1; + timerdisplay[team].showplayerteamhudelemtospectator = 1; + thread hidetimerdisplayongameend( timerdisplay[team] ); + } + + while ( true ) + { + playsoundonplayers( "mp_suitcase_pickup" ); + maps\mp\gametypes\_globallogic_audio::flushgroupdialog( "gamemode_objective" ); + maps\mp\gametypes\_globallogic_audio::leaderdialog( "koth_located" ); + level.zone.gameobject maps\mp\gametypes\_gameobjects::setmodelvisibility( 1 ); + level.zonerevealtime = gettime(); + + if ( level.zonespawntime ) + { + level.zone.gameobject maps\mp\gametypes\_gameobjects::setvisibleteam( "any" ); + level.zone.gameobject maps\mp\gametypes\_gameobjects::setflags( 1 ); + updateobjectivehintmessage( level.objectivehintpreparezone ); + + foreach ( team in level.teams ) + { + timerdisplay[team].label = zonespawninginstr; + timerdisplay[team] settimer( level.zonespawntime ); + timerdisplay[team].alpha = 1; + } + + wait( level.zonespawntime ); + level.zone.gameobject maps\mp\gametypes\_gameobjects::setflags( 0 ); + maps\mp\gametypes\_globallogic_audio::leaderdialog( "koth_online" ); + } + + foreach ( team in level.teams ) + timerdisplay[team].alpha = 0; + + waittillframeend; + maps\mp\gametypes\_globallogic_audio::leaderdialog( "obj_capture", undefined, "gamemode_objective" ); + updateobjectivehintmessage( level.objectivehintcapturezone ); + playsoundonplayers( "mpl_hq_cap_us" ); + level.zone.gameobject maps\mp\gametypes\_gameobjects::enableobject(); + level.zone.gameobject.capturecount = 0; + + if ( level.zoneautomovetime ) + { + thread movezoneaftertime( level.zoneautomovetime ); + + foreach ( team in level.teams ) + timerdisplay[team] settimer( level.zoneautomovetime ); + + foreach ( team in level.teams ) + { + timerdisplay[team].label = zonedestroyedinenemystr; + timerdisplay[team].alpha = 1; + } + } + else + level.zonedestroyedbytimer = 0; + + kothcaptureloop(); + ownerteam = level.zone.gameobject maps\mp\gametypes\_gameobjects::getownerteam(); + + if ( level.zone.gameobject.capturecount == 1 ) + { + touchlist = []; + touchkeys = getarraykeys( level.zone.gameobject.touchlist[ownerteam] ); + + for ( i = 0; i < touchkeys.size; i++ ) + touchlist[touchkeys[i]] = level.zone.gameobject.touchlist[ownerteam][touchkeys[i]]; + + thread give_held_credit( touchlist ); + } + + level.zone enable_zone_spawn_influencer( 0 ); + level.zone.gameobject.lastcaptureteam = undefined; + level.zone.gameobject maps\mp\gametypes\_gameobjects::disableobject(); + level.zone.gameobject maps\mp\gametypes\_gameobjects::allowuse( "none" ); + level.zone.gameobject maps\mp\gametypes\_gameobjects::setownerteam( "neutral" ); + level.zone.gameobject maps\mp\gametypes\_gameobjects::setmodelvisibility( 0 ); + level.zone.gameobject maps\mp\gametypes\_gameobjects::mustmaintainclaim( 0 ); + level.zone togglezoneeffects( 0 ); + level notify( "zone_reset" ); + + foreach ( team in level.teams ) + timerdisplay[team].alpha = 0; + + spawn_next_zone(); + wait 0.5; + thread forcespawnteam( ownerteam ); + wait 0.5; + } } -hidetimerdisplayongameend( timerdisplay ) //checked matches cerberus output +hidetimerdisplayongameend( timerdisplay ) { - level waittill( "game_ended" ); - timerdisplay.alpha = 0; + level waittill( "game_ended" ); + + timerdisplay.alpha = 0; } -forcespawnteam( team ) //checked partially changed to match cerberus output did not change while loop to for loop see github for more info +forcespawnteam( team ) { - players = level.players; - i = 0; - while ( i < players.size ) - { - player = players[ i ]; - if ( !isDefined( player ) ) - { - i++; - continue; - } - if ( player.pers[ "team" ] == team ) - { - player notify( "force_spawn" ); - wait 0.1; - } - i++; - } + players = level.players; + + for ( i = 0; i < players.size; i++ ) + { + player = players[i]; + + if ( !isdefined( player ) ) + continue; + + if ( player.pers["team"] == team ) + { + player notify( "force_spawn" ); + wait 0.1; + } + } } -onbeginuse( player ) //checked matches cerberus output +onbeginuse( player ) { - ownerteam = self maps/mp/gametypes/_gameobjects::getownerteam(); - if ( ownerteam == "neutral" ) - { - player thread maps/mp/gametypes/_battlechatter_mp::gametypespecificbattlechatter( "hq_protect", player.pers[ "team" ] ); - } - else - { - player thread maps/mp/gametypes/_battlechatter_mp::gametypespecificbattlechatter( "hq_attack", player.pers[ "team" ] ); - } + ownerteam = self maps\mp\gametypes\_gameobjects::getownerteam(); + + if ( ownerteam == "neutral" ) + player thread maps\mp\gametypes\_battlechatter_mp::gametypespecificbattlechatter( "hq_protect", player.pers["team"] ); + else + player thread maps\mp\gametypes\_battlechatter_mp::gametypespecificbattlechatter( "hq_attack", player.pers["team"] ); } -onenduse( team, player, success ) //checked matches cerberus output +onenduse( team, player, success ) { - player notify( "event_ended" ); + player notify( "event_ended" ); } -onzonecapture( player ) //checked partially changed to match cerberus output did not use continue in foreach see github for more info +onzonecapture( player ) { - capture_team = player.pers[ "team" ]; - capturetime = getTime(); - player logstring( "zone captured" ); - string = &"MP_KOTH_CAPTURED_BY"; - level.zone.gameobject.iscontested = 0; - level.usestartspawns = 0; - if ( !isDefined( self.lastcaptureteam ) || self.lastcaptureteam != capture_team ) - { - touchlist = []; - touchkeys = getarraykeys( self.touchlist[ capture_team ] ); - for ( i = 0; i < touchkeys.size; i++ ) - { - touchlist[ touchkeys[ i ] ] = self.touchlist[ capture_team ][ touchkeys[ i ] ]; - } - thread give_capture_credit( touchlist, string, capturetime, capture_team, self.lastcaptureteam ); - } - level.kothcapteam = capture_team; - oldteam = maps/mp/gametypes/_gameobjects::getownerteam(); - self maps/mp/gametypes/_gameobjects::setownerteam( capture_team ); - if ( !level.kothmode ) - { - self maps/mp/gametypes/_gameobjects::setusetime( level.destroytime ); - } - foreach ( team in level.teams ) - { - if ( team == capture_team ) - { - if ( isDefined( self.lastcaptureteam ) && self.lastcaptureteam != team ) - { - maps/mp/gametypes/_globallogic_audio::leaderdialog( "koth_secured", team, "gamemode_objective" ); - for ( index = 0; index < level.players.size; index++ ) - { - player = level.players[ index ]; - if ( player.pers[ "team" ] == team ) - { - if ( ( player.lastkilltime + 500 ) > getTime() ) - { - player maps/mp/_challenges::killedlastcontester(); - } - } - } - } - thread playsoundonplayers( game[ "objective_gained_sound" ], team ); - } - else - { - if ( oldteam == team ) - { - maps/mp/gametypes/_globallogic_audio::leaderdialog( "koth_lost", team, "gamemode_objective" ); - } - else if ( oldteam == "neutral" ) - { - maps/mp/gametypes/_globallogic_audio::leaderdialog( "koth_captured", team, "gamemode_objective" ); - } - thread playsoundonplayers( game[ "objective_lost_sound" ], team ); - } - } - level thread awardcapturepoints( capture_team, self.lastcaptureteam ); - self.capturecount++; - self.lastcaptureteam = capture_team; - self maps/mp/gametypes/_gameobjects::mustmaintainclaim( 1 ); - level notify( "zone_captured" ); - level notify( "zone_captured" + capture_team ); - player notify( "event_ended" ); + capture_team = player.pers["team"]; + capturetime = gettime(); + player logstring( "zone captured" ); + string = &"MP_KOTH_CAPTURED_BY"; + level.zone.gameobject.iscontested = 0; + level.usestartspawns = 0; + + if ( !isdefined( self.lastcaptureteam ) || self.lastcaptureteam != capture_team ) + { + touchlist = []; + touchkeys = getarraykeys( self.touchlist[capture_team] ); + + for ( i = 0; i < touchkeys.size; i++ ) + touchlist[touchkeys[i]] = self.touchlist[capture_team][touchkeys[i]]; + + thread give_capture_credit( touchlist, string, capturetime, capture_team, self.lastcaptureteam ); + } + + level.kothcapteam = capture_team; + oldteam = maps\mp\gametypes\_gameobjects::getownerteam(); + self maps\mp\gametypes\_gameobjects::setownerteam( capture_team ); + + if ( !level.kothmode ) + self maps\mp\gametypes\_gameobjects::setusetime( level.destroytime ); + + foreach ( team in level.teams ) + { + if ( team == capture_team ) + { + if ( isdefined( self.lastcaptureteam ) && self.lastcaptureteam != team ) + { + maps\mp\gametypes\_globallogic_audio::leaderdialog( "koth_secured", team, "gamemode_objective" ); + + for ( index = 0; index < level.players.size; index++ ) + { + player = level.players[index]; + + if ( player.pers["team"] == team ) + { + if ( player.lastkilltime + 500 > gettime() ) + player maps\mp\_challenges::killedlastcontester(); + } + } + } + + thread playsoundonplayers( game["objective_gained_sound"], team ); + continue; + } + + if ( oldteam == team ) + maps\mp\gametypes\_globallogic_audio::leaderdialog( "koth_lost", team, "gamemode_objective" ); + else if ( oldteam == "neutral" ) + maps\mp\gametypes\_globallogic_audio::leaderdialog( "koth_captured", team, "gamemode_objective" ); + + thread playsoundonplayers( game["objective_lost_sound"], team ); + } + + level thread awardcapturepoints( capture_team, self.lastcaptureteam ); + self.capturecount++; + self.lastcaptureteam = capture_team; + self maps\mp\gametypes\_gameobjects::mustmaintainclaim( 1 ); + level notify( "zone_captured" ); + level notify( "zone_captured" + capture_team ); + player notify( "event_ended" ); } -give_capture_credit( touchlist, string, capturetime, capture_team, lastcaptureteam ) //checked partially changed to match cerberus output did not change while loop to for loop see github for more info +give_capture_credit( touchlist, string, capturetime, capture_team, lastcaptureteam ) { - wait 0.05; - maps/mp/gametypes/_globallogic_utils::waittillslowprocessallowed(); - players = getarraykeys( touchlist ); - i = 0; - while ( i < players.size ) - { - player = touchlist[ players[ i ] ].player; - player updatecapsperminute( lastcaptureteam ); - if ( !isscoreboosting( player ) ) - { - player maps/mp/_challenges::capturedobjective( capturetime ); - if ( ( level.kothstarttime + 3000 ) > capturetime && level.kothcapteam == capture_team ) - { - maps/mp/_scoreevents::processscoreevent( "quickly_secure_point", player ); - } - maps/mp/_scoreevents::processscoreevent( "koth_secure", player ); - player recordgameevent( "capture" ); - level thread maps/mp/_popups::displayteammessagetoall( string, player ); - if ( isDefined( player.pers[ "captures" ] ) ) - { - player.pers[ "captures" ]++; - player.captures = player.pers[ "captures" ]; - } - if ( ( level.kothstarttime + 500 ) > capturetime ) - { - player maps/mp/_challenges::immediatecapture(); - } - maps/mp/_demo::bookmark( "event", getTime(), player ); - player addplayerstatwithgametype( "CAPTURES", 1 ); - i++; - continue; - } - /* + wait 0.05; + maps\mp\gametypes\_globallogic_utils::waittillslowprocessallowed(); + players = getarraykeys( touchlist ); + + for ( i = 0; i < players.size; i++ ) + { + player = touchlist[players[i]].player; + player updatecapsperminute( lastcaptureteam ); + + if ( !isscoreboosting( player ) ) + { + player maps\mp\_challenges::capturedobjective( capturetime ); + + if ( level.kothstarttime + 3000 > capturetime && level.kothcapteam == capture_team ) + maps\mp\_scoreevents::processscoreevent( "quickly_secure_point", player ); + + maps\mp\_scoreevents::processscoreevent( "koth_secure", player ); + player recordgameevent( "capture" ); + level thread maps\mp\_popups::displayteammessagetoall( string, player ); + + if ( isdefined( player.pers["captures"] ) ) + { + player.pers["captures"]++; + player.captures = player.pers["captures"]; + } + + if ( level.kothstarttime + 500 > capturetime ) + player maps\mp\_challenges::immediatecapture(); + + maps\mp\_demo::bookmark( "event", gettime(), player ); + player addplayerstatwithgametype( "CAPTURES", 1 ); + continue; + } + /# - player iprintlnbold( "GAMETYPE DEBUG: NOT GIVING YOU CAPTURE CREDIT AS BOOSTING PREVENTION" ); + player iprintlnbold( "GAMETYPE DEBUG: NOT GIVING YOU CAPTURE CREDIT AS BOOSTING PREVENTION" ); #/ - */ - i++; - } + } } -give_held_credit( touchlist, team ) //checked changed to match cerberus output +give_held_credit( touchlist, team ) { - wait 0.05; - maps/mp/gametypes/_globallogic_utils::waittillslowprocessallowed(); - players = getarraykeys( touchlist ); - for ( i = 0; i < players.size; i++ ) - { - player = touchlist[ players[ i ] ].player; - } + wait 0.05; + maps\mp\gametypes\_globallogic_utils::waittillslowprocessallowed(); + players = getarraykeys( touchlist ); + + for ( i = 0; i < players.size; i++ ) + player = touchlist[players[i]].player; } -onzonedestroy( player ) //checked changed to match cerberus output +onzonedestroy( player ) { - destroyed_team = player.pers[ "team" ]; - player logstring( "zone destroyed" ); - maps/mp/_scoreevents::processscoreevent( "zone_destroyed", player ); - player recordgameevent( "destroy" ); - player addplayerstatwithgametype( "DESTRUCTIONS", 1 ); - if ( isDefined( player.pers[ "destructions" ] ) ) - { - player.pers[ "destructions" ]++; - player.destructions = player.pers[ "destructions" ]; - } - destroyteammessage = &"MP_HQ_DESTROYED_BY"; - otherteammessage = &"MP_HQ_DESTROYED_BY_ENEMY"; - if ( level.kothmode ) - { - destroyteammessage = &"MP_KOTH_CAPTURED_BY"; - otherteammessage = &"MP_KOTH_CAPTURED_BY_ENEMY"; - } - level thread maps/mp/_popups::displayteammessagetoall( destroyteammessage, player ); - foreach ( team in level.teams ) - { - if ( team == destroyed_team ) - { - maps/mp/gametypes/_globallogic_audio::leaderdialog( "koth_secured", team, "gamemode_objective" ); - } - else - { - maps/mp/gametypes/_globallogic_audio::leaderdialog( "koth_destroyed", team, "gamemode_objective" ); - } - } - level notify( "zone_destroyed", destroyed_team ); - if ( level.kothmode ) - { - level thread awardcapturepoints( destroyed_team ); - } - player notify( "event_ended" ); + destroyed_team = player.pers["team"]; + player logstring( "zone destroyed" ); + maps\mp\_scoreevents::processscoreevent( "zone_destroyed", player ); + player recordgameevent( "destroy" ); + player addplayerstatwithgametype( "DESTRUCTIONS", 1 ); + + if ( isdefined( player.pers["destructions"] ) ) + { + player.pers["destructions"]++; + player.destructions = player.pers["destructions"]; + } + + destroyteammessage = &"MP_HQ_DESTROYED_BY"; + otherteammessage = &"MP_HQ_DESTROYED_BY_ENEMY"; + + if ( level.kothmode ) + { + destroyteammessage = &"MP_KOTH_CAPTURED_BY"; + otherteammessage = &"MP_KOTH_CAPTURED_BY_ENEMY"; + } + + level thread maps\mp\_popups::displayteammessagetoall( destroyteammessage, player ); + + foreach ( team in level.teams ) + { + if ( team == destroyed_team ) + { + maps\mp\gametypes\_globallogic_audio::leaderdialog( "koth_secured", team, "gamemode_objective" ); + continue; + } + + maps\mp\gametypes\_globallogic_audio::leaderdialog( "koth_destroyed", team, "gamemode_objective" ); + } + + level notify( "zone_destroyed", destroyed_team ); + + if ( level.kothmode ) + level thread awardcapturepoints( destroyed_team ); + + player notify( "event_ended" ); } -onzoneunoccupied() //checked matches cerberus output +onzoneunoccupied() { - level notify( "zone_destroyed" ); - level.kothcapteam = "neutral"; - level.zone.gameobject.wasleftunoccupied = 1; - level.zone.gameobject.iscontested = 0; + level notify( "zone_destroyed" ); + level.kothcapteam = "neutral"; + level.zone.gameobject.wasleftunoccupied = 1; + level.zone.gameobject.iscontested = 0; } -onzonecontested() //checked changed to match cerberus output +onzonecontested() { - zoneowningteam = level.zone.gameobject maps/mp/gametypes/_gameobjects::getownerteam(); - level.zone.gameobject.wascontested = 1; - level.zone.gameobject.iscontested = 1; - foreach ( team in level.teams ) - { - if ( team == zoneowningteam ) - { - thread playsoundonplayers( game[ "objective_contested_sound" ], team ); - maps/mp/gametypes/_globallogic_audio::leaderdialog( "koth_contested", team, "gamemode_objective" ); - } - } + zoneowningteam = level.zone.gameobject maps\mp\gametypes\_gameobjects::getownerteam(); + level.zone.gameobject.wascontested = 1; + level.zone.gameobject.iscontested = 1; + + foreach ( team in level.teams ) + { + if ( team == zoneowningteam ) + { + thread playsoundonplayers( game["objective_contested_sound"], team ); + maps\mp\gametypes\_globallogic_audio::leaderdialog( "koth_contested", team, "gamemode_objective" ); + } + } } -onzoneuncontested( lastclaimteam ) //checked matches cerberus output +onzoneuncontested( lastclaimteam ) { - /* /# - assert( lastclaimteam == level.zone.gameobject maps/mp/gametypes/_gameobjects::getownerteam() ); + assert( lastclaimteam == level.zone.gameobject maps\mp\gametypes\_gameobjects::getownerteam() ); #/ - */ - level.zone.gameobject.iscontested = 0; - level.zone.gameobject maps/mp/gametypes/_gameobjects::setclaimteam( lastclaimteam ); + level.zone.gameobject.iscontested = 0; + level.zone.gameobject maps\mp\gametypes\_gameobjects::setclaimteam( lastclaimteam ); } -movezoneaftertime( time ) //checked matches cerberus output +movezoneaftertime( time ) { - level endon( "game_ended" ); - level endon( "zone_reset" ); - level.zonemovetime = getTime() + ( time * 1000 ); - level.zonedestroyedbytimer = 0; - wait time; - if ( !isDefined( level.zone.gameobject.wascontested ) || level.zone.gameobject.wascontested == 0 ) - { - if ( !isDefined( level.zone.gameobject.wasleftunoccupied ) || level.zone.gameobject.wasleftunoccupied == 0 ) - { - zoneowningteam = level.zone.gameobject maps/mp/gametypes/_gameobjects::getownerteam(); - maps/mp/_challenges::controlzoneentirely( zoneowningteam ); - } - } - level.zonedestroyedbytimer = 1; - level notify( "zone_moved" ); + level endon( "game_ended" ); + level endon( "zone_reset" ); + level.zonemovetime = gettime() + time * 1000; + level.zonedestroyedbytimer = 0; + wait( time ); + + if ( !isdefined( level.zone.gameobject.wascontested ) || level.zone.gameobject.wascontested == 0 ) + { + if ( !isdefined( level.zone.gameobject.wasleftunoccupied ) || level.zone.gameobject.wasleftunoccupied == 0 ) + { + zoneowningteam = level.zone.gameobject maps\mp\gametypes\_gameobjects::getownerteam(); + maps\mp\_challenges::controlzoneentirely( zoneowningteam ); + } + } + + level.zonedestroyedbytimer = 1; + level notify( "zone_moved" ); } -awardcapturepoints( team, lastcaptureteam ) //checked matches cerberus output +awardcapturepoints( team, lastcaptureteam ) { - level endon( "game_ended" ); - level endon( "zone_destroyed" ); - level endon( "zone_reset" ); - level endon( "zone_moved" ); - level notify( "awardCapturePointsRunning" ); - level endon( "awardCapturePointsRunning" ); - seconds = 1; - score = 1; - while ( !level.gameended ) - { - wait seconds; - maps/mp/gametypes/_hostmigration::waittillhostmigrationdone(); - if ( !level.zone.gameobject.iscontested ) - { - if ( level.scoreperplayer ) - { - score = level.zone.gameobject.numtouching[ team ]; - } - maps/mp/gametypes/_globallogic_score::giveteamscoreforobjective( team, score ); - } - } + level endon( "game_ended" ); + level endon( "zone_destroyed" ); + level endon( "zone_reset" ); + level endon( "zone_moved" ); + level notify( "awardCapturePointsRunning" ); + level endon( "awardCapturePointsRunning" ); + seconds = 1; + score = 1; + + while ( !level.gameended ) + { + wait( seconds ); + maps\mp\gametypes\_hostmigration::waittillhostmigrationdone(); + + if ( !level.zone.gameobject.iscontested ) + { + if ( level.scoreperplayer ) + score = level.zone.gameobject.numtouching[team]; + + maps\mp\gametypes\_globallogic_score::giveteamscoreforobjective( team, score ); + } + } } -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 ) { - spawnpoint = undefined; - if ( !level.usestartspawns ) - { - if ( isDefined( level.zone ) ) - { - if ( isDefined( level.zone.gameobject ) ) - { - zoneowningteam = level.zone.gameobject maps/mp/gametypes/_gameobjects::getownerteam(); - if ( self.pers[ "team" ] == zoneowningteam ) - { - spawnpoint = maps/mp/gametypes/_spawnlogic::getspawnpoint_nearteam( level.spawn_all, level.zone.gameobject.nearspawns ); - } - else if ( level.spawndelay >= level.zoneautomovetime && getTime() > ( level.zonerevealtime + 10000 ) ) - { - spawnpoint = maps/mp/gametypes/_spawnlogic::getspawnpoint_nearteam( level.spawn_all ); - } - else - { - spawnpoint = maps/mp/gametypes/_spawnlogic::getspawnpoint_nearteam( level.spawn_all, level.zone.gameobject.outerspawns ); - } - } - } - } - if ( !isDefined( spawnpoint ) ) - { - spawnteam = self.pers[ "team" ]; - spawnpoint = maps/mp/gametypes/_spawnlogic::getspawnpoint_random( level.spawn_start[ spawnteam ] ); - } - /* + spawnpoint = undefined; + + if ( !level.usestartspawns ) + { + if ( isdefined( level.zone ) ) + { + if ( isdefined( level.zone.gameobject ) ) + { + zoneowningteam = level.zone.gameobject maps\mp\gametypes\_gameobjects::getownerteam(); + + if ( self.pers["team"] == zoneowningteam ) + spawnpoint = maps\mp\gametypes\_spawnlogic::getspawnpoint_nearteam( level.spawn_all, level.zone.gameobject.nearspawns ); + else if ( level.spawndelay >= level.zoneautomovetime && gettime() > level.zonerevealtime + 10000 ) + spawnpoint = maps\mp\gametypes\_spawnlogic::getspawnpoint_nearteam( level.spawn_all ); + else + spawnpoint = maps\mp\gametypes\_spawnlogic::getspawnpoint_nearteam( level.spawn_all, level.zone.gameobject.outerspawns ); + } + } + } + + if ( !isdefined( spawnpoint ) ) + { + spawnteam = self.pers["team"]; + spawnpoint = maps\mp\gametypes\_spawnlogic::getspawnpoint_random( level.spawn_start[spawnteam] ); + } + /# - assert( isDefined( spawnpoint ) ); + assert( isdefined( spawnpoint ) ); #/ - */ - if ( predictedspawn ) - { - self predictspawnpoint( spawnpoint.origin, spawnpoint.angles ); - } - else - { - self spawn( spawnpoint.origin, spawnpoint.angles, "koth" ); - } + + if ( predictedspawn ) + self predictspawnpoint( spawnpoint.origin, spawnpoint.angles ); + else + self spawn( spawnpoint.origin, spawnpoint.angles, "koth" ); } -koth_playerspawnedcb() //checked matches cerberus output +koth_playerspawnedcb() { - self.lowermessageoverride = undefined; + self.lowermessageoverride = undefined; } -comparezoneindexes( zone_a, zone_b ) //checked matches cerberus output +comparezoneindexes( zone_a, zone_b ) { - script_index_a = zone_a.script_index; - script_index_b = zone_b.script_index; - if ( !isDefined( script_index_a ) && !isDefined( script_index_b ) ) - { - return 0; - } - if ( !isDefined( script_index_a ) && isDefined( script_index_b ) ) - { - /* + script_index_a = zone_a.script_index; + script_index_b = zone_b.script_index; + + if ( !isdefined( script_index_a ) && !isdefined( script_index_b ) ) + return false; + + if ( !isdefined( script_index_a ) && isdefined( script_index_b ) ) + { /# - println( "KOTH: Missing script_index on zone at " + zone_a.origin ); + println( "KOTH: Missing script_index on zone at " + zone_a.origin ); #/ - */ - return 1; - } - if ( isDefined( script_index_a ) && !isDefined( script_index_b ) ) - { - /* + return true; + } + + if ( isdefined( script_index_a ) && !isdefined( script_index_b ) ) + { /# - println( "KOTH: Missing script_index on zone at " + zone_b.origin ); + println( "KOTH: Missing script_index on zone at " + zone_b.origin ); #/ - */ - return 0; - } - if ( script_index_a > script_index_b ) - { - return 1; - } - return 0; + return false; + } + + if ( script_index_a > script_index_b ) + return true; + + return false; } -getzonearray() //checked changed to match cerberus output +getzonearray() { - zones = getentarray( "koth_zone_center", "targetname" ); - if ( !isDefined( zones ) ) - { - return undefined; - } - swapped = 1; - n = zones.size; - while ( swapped ) - { - swapped = 0; - for ( i = 0; i < n - 1; i++ ) - { - if ( comparezoneindexes( zones[ i ], zones[ i + 1 ] ) ) - { - temp = zones[ i ]; - zones[ i ] = zones[ i + 1 ]; - zones[ i + 1 ] = temp; - swapped = 1; - } - } - n--; + zones = getentarray( "koth_zone_center", "targetname" ); - } - return zones; + if ( !isdefined( zones ) ) + return undefined; + + swapped = 1; + + for ( n = zones.size; swapped; n-- ) + { + swapped = 0; + + for ( i = 0; i < n - 1; i++ ) + { + if ( comparezoneindexes( zones[i], zones[i + 1] ) ) + { + temp = zones[i]; + zones[i] = zones[i + 1]; + zones[i + 1] = temp; + swapped = 1; + } + } + } + + return zones; } -setupzones() //checked partially changed to match cerberus output did not change while loop to for loop see github for more info +setupzones() { - maperrors = []; - zones = getzonearray(); - trigs = getentarray( "koth_zone_trigger", "targetname" ); - i = 0; - while ( i < zones.size ) - { - errored = 0; - zone = zones[ i ]; - zone.trig = undefined; - for ( j = 0; j < trigs.size; j++ ) - { - if ( zone istouching( trigs[ j ] ) ) - { - if ( isDefined( zone.trig ) ) - { - maperrors[ maperrors.size ] = "Zone at " + zone.origin + " is touching more than one zonetrigger trigger"; - errored = 1; - break; - } - zone.trig = trigs[ j ]; - break; - } - } - if ( !isDefined( zone.trig ) ) - { - if ( !errored ) - { - maperrors[ maperrors.size ] = "Zone at " + zone.origin + " is not inside any zonetrigger trigger"; - i++; - continue; - } - } - /* + maperrors = []; + zones = getzonearray(); + trigs = getentarray( "koth_zone_trigger", "targetname" ); + + for ( i = 0; i < zones.size; i++ ) + { + errored = 0; + zone = zones[i]; + zone.trig = undefined; + + for ( j = 0; j < trigs.size; j++ ) + { + if ( zone istouching( trigs[j] ) ) + { + if ( isdefined( zone.trig ) ) + { + maperrors[maperrors.size] = "Zone at " + zone.origin + " is touching more than one \"zonetrigger\" trigger"; + errored = 1; + break; + } + + zone.trig = trigs[j]; + break; + } + } + + if ( !isdefined( zone.trig ) ) + { + if ( !errored ) + { + maperrors[maperrors.size] = "Zone at " + zone.origin + " is not inside any \"zonetrigger\" trigger"; + continue; + } + } + /# - assert( !errored ); + assert( !errored ); #/ - */ - zone.trigorigin = zone.trig.origin; - visuals = []; - visuals[ 0 ] = zone; - if ( isDefined( zone.target ) ) - { - othervisuals = getentarray( zone.target, "targetname" ); - for ( j = 0; j < othervisuals.size; j++ ) - { - visuals[ visuals.size ] = othervisuals[ j ]; - } - } - objective_name = istring( "objective" ); - precachestring( objective_name ); - zone.gameobject = maps/mp/gametypes/_gameobjects::createuseobject( "neutral", zone.trig, visuals, ( 0, 0, 0 ), objective_name ); - zone.gameobject maps/mp/gametypes/_gameobjects::disableobject(); - zone.gameobject maps/mp/gametypes/_gameobjects::setmodelvisibility( 0 ); - zone.trig.useobj = zone.gameobject; - zone setupnearbyspawns(); - zone createzonespawninfluencer(); - i++; - } - if ( maperrors.size > 0 ) - { - /* + zone.trigorigin = zone.trig.origin; + visuals = []; + visuals[0] = zone; + + if ( isdefined( zone.target ) ) + { + othervisuals = getentarray( zone.target, "targetname" ); + + for ( j = 0; j < othervisuals.size; j++ ) + visuals[visuals.size] = othervisuals[j]; + } + + objective_name = istring( "objective" ); + precachestring( objective_name ); + zone.gameobject = maps\mp\gametypes\_gameobjects::createuseobject( "neutral", zone.trig, visuals, ( 0, 0, 0 ), objective_name ); + zone.gameobject maps\mp\gametypes\_gameobjects::disableobject(); + zone.gameobject maps\mp\gametypes\_gameobjects::setmodelvisibility( 0 ); + zone.trig.useobj = zone.gameobject; + zone setupnearbyspawns(); + zone createzonespawninfluencer(); + } + + if ( maperrors.size > 0 ) + { /# - println( "^1------------ Map Errors ------------" ); - i = 0; - while ( i < maperrors.size ) - { - println( maperrors[ i ] ); - i++; - } - println( "^1------------------------------------" ); - maps/mp/_utility::error( "Map errors. See above" ); + println( "^1------------ Map Errors ------------" ); + + for ( i = 0; i < maperrors.size; i++ ) + println( maperrors[i] ); + + println( "^1------------------------------------" ); + maps\mp\_utility::error( "Map errors. See above" ); #/ - */ - maps/mp/gametypes/_callbacksetup::abortlevel(); - return; - } - level.zones = zones; - level.prevzone = undefined; - level.prevzone2 = undefined; - setupzoneexclusions(); - return 1; + maps\mp\gametypes\_callbacksetup::abortlevel(); + return; + } + + level.zones = zones; + level.prevzone = undefined; + level.prevzone2 = undefined; + setupzoneexclusions(); + return 1; } -setupzoneexclusions() //checked changed to match cerberus output +setupzoneexclusions() { - if ( !isDefined( level.levelkothdisable ) ) - { - return; - } - foreach ( nullzone in level.levelkothdisable ) - { - mindist = 1410065408; - foundzone = undefined; - foreach ( zone in level.zones ) - { - distance = distancesquared( nullzone.origin, zone.origin ); - if ( distance < mindist ) - { - foundzone = zone; - mindist = distance; - } - } - if ( isDefined( foundzone ) ) - { - if ( !isDefined( foundzone.gameobject.exclusions ) ) - { - foundzone.gameobject.exclusions = []; - } - foundzone.gameobject.exclusions[ foundzone.gameobject.exclusions.size ] = nullzone; - } - } + if ( !isdefined( level.levelkothdisable ) ) + return; + + foreach ( nullzone in level.levelkothdisable ) + { + mindist = 1410065408; + foundzone = undefined; + + foreach ( zone in level.zones ) + { + distance = distancesquared( nullzone.origin, zone.origin ); + + if ( distance < mindist ) + { + foundzone = zone; + mindist = distance; + } + } + + if ( isdefined( foundzone ) ) + { + if ( !isdefined( foundzone.gameobject.exclusions ) ) + foundzone.gameobject.exclusions = []; + + foundzone.gameobject.exclusions[foundzone.gameobject.exclusions.size] = nullzone; + } + } } -setupnearbyspawns() //checked changed to match cerberus output +setupnearbyspawns() { - spawns = level.spawn_all; - for ( i = 0; i < spawns.size; i++ ) - { - spawns[ i ].distsq = distancesquared( spawns[ i ].origin, self.origin ); - } - for ( i = 1; i < spawns.size; i++ ) - { - thespawn = spawns[ i ]; - for ( j = i - 1; j >= 0 && thespawn.distsq < spawns[j].distsq; j-- ) - { - spawns[ j + 1 ] = spawns[ j ]; - } - spawns[ j + 1 ] = thespawn; - } - first = []; - second = []; - third = []; - outer = []; - thirdsize = spawns.size / 3; - for ( i = 0; i <= thirdsize; i++ ) - { - first[ first.size ] = spawns[ i ]; - } - while ( i < spawns.size ) - { - outer[ outer.size ] = spawns[ i ]; - if ( i <= ( thirdsize * 2 ) ) - { - second[ second.size ] = spawns[ i ]; - i++; - } - else - { - third[ third.size ] = spawns[ i ]; - } - i++; - } - self.gameobject.nearspawns = first; - self.gameobject.midspawns = second; - self.gameobject.farspawns = third; - self.gameobject.outerspawns = outer; + spawns = level.spawn_all; + + for ( i = 0; i < spawns.size; i++ ) + spawns[i].distsq = distancesquared( spawns[i].origin, self.origin ); + + for ( i = 1; i < spawns.size; i++ ) + { + thespawn = spawns[i]; + + for ( j = i - 1; j >= 0 && thespawn.distsq < spawns[j].distsq; j-- ) + spawns[j + 1] = spawns[j]; + + spawns[j + 1] = thespawn; + } + + first = []; + second = []; + third = []; + outer = []; + thirdsize = spawns.size / 3; + + for ( i = 0; i <= thirdsize; i++ ) + first[first.size] = spawns[i]; + + while ( i < spawns.size ) + { + outer[outer.size] = spawns[i]; + + if ( i <= thirdsize * 2 ) + second[second.size] = spawns[i]; + else + third[third.size] = spawns[i]; + + i++; + } + + self.gameobject.nearspawns = first; + self.gameobject.midspawns = second; + self.gameobject.farspawns = third; + self.gameobject.outerspawns = outer; } -getfirstzone() //checked matches cerberus output +getfirstzone() { - zone = level.zones[ 0 ]; - level.prevzone2 = level.prevzone; - level.prevzone = zone; - level.prevzoneindex = 0; - shufflezones(); - arrayremovevalue( level.zonespawnqueue, zone ); - return zone; + zone = level.zones[0]; + level.prevzone2 = level.prevzone; + level.prevzone = zone; + level.prevzoneindex = 0; + shufflezones(); + arrayremovevalue( level.zonespawnqueue, zone ); + return zone; } -getnextzone() //checked matches cerberus output +getnextzone() { - nextzoneindex = ( level.prevzoneindex + 1 ) % level.zones.size; - zone = level.zones[ nextzoneindex ]; - level.prevzone2 = level.prevzone; - level.prevzone = zone; - level.prevzoneindex = nextzoneindex; - return zone; + nextzoneindex = ( level.prevzoneindex + 1 ) % level.zones.size; + zone = level.zones[nextzoneindex]; + level.prevzone2 = level.prevzone; + level.prevzone = zone; + level.prevzoneindex = nextzoneindex; + return zone; } -pickrandomzonetospawn() //checked matches cerberus output +pickrandomzonetospawn() { - level.prevzoneindex = randomint( level.zones.size ); - zone = level.zones[ level.prevzoneindex ]; - level.prevzone2 = level.prevzone; - level.prevzone = zone; - return zone; + level.prevzoneindex = randomint( level.zones.size ); + zone = level.zones[level.prevzoneindex]; + level.prevzone2 = level.prevzone; + level.prevzone = zone; + return zone; } -shufflezones() //checked partially changed to match cerberus output did not change while loop to for loop see github for more info +shufflezones() { - level.zonespawnqueue = []; - spawnqueue = arraycopy( level.zones ); - for ( total_left = spawnqueue.size; total_left > 0; total_left-- ) - { - index = randomint( total_left ); - valid_zones = 0; - zone = 0; - while ( zone < level.zones.size ) - { - if ( !isDefined( spawnqueue[ zone ] ) ) - { - zone++; - continue; - } - if ( valid_zones == index ) - { - if ( level.zonespawnqueue.size == 0 && isDefined( level.zone ) && level.zone == spawnqueue[ zone ] ) - { - zone++; - continue; - } - level.zonespawnqueue[ level.zonespawnqueue.size ] = spawnqueue[ zone ]; - spawnqueue[zone] = undefined; - break; - } - valid_zones++; - zone++; - } - } + level.zonespawnqueue = []; + spawnqueue = arraycopy( level.zones ); + + for ( total_left = spawnqueue.size; total_left > 0; total_left-- ) + { + index = randomint( total_left ); + valid_zones = 0; + + for ( zone = 0; zone < level.zones.size; zone++ ) + { + if ( !isdefined( spawnqueue[zone] ) ) + continue; + + if ( valid_zones == index ) + { + if ( level.zonespawnqueue.size == 0 && isdefined( level.zone ) && level.zone == spawnqueue[zone] ) + continue; + + level.zonespawnqueue[level.zonespawnqueue.size] = spawnqueue[zone]; + spawnqueue[zone] = undefined; + break; + } + + valid_zones++; + } + } } -getnextzonefromqueue() //checked matches cerberus output +getnextzonefromqueue() { - if ( level.zonespawnqueue.size == 0 ) - { - shufflezones(); - } - /* + if ( level.zonespawnqueue.size == 0 ) + shufflezones(); + /# - assert( level.zonespawnqueue.size > 0 ); + assert( level.zonespawnqueue.size > 0 ); #/ - */ - next_zone = level.zonespawnqueue[ 0 ]; - arrayremoveindex( level.zonespawnqueue, 0 ); - return next_zone; + next_zone = level.zonespawnqueue[0]; + arrayremoveindex( level.zonespawnqueue, 0 ); + return next_zone; } -getcountofteamswithplayers( num ) //checked changed to match cerberus output +getcountofteamswithplayers( num ) { - has_players = 0; - foreach ( team in level.teams ) - { - if ( num[ team ] > 0 ) - { - has_players++; - } - } - return has_players; + has_players = 0; + + foreach ( team in level.teams ) + { + if ( num[team] > 0 ) + has_players++; + } + + return has_players; } -getpointcost( avgpos, origin ) //checked changed to match cerberus output +getpointcost( avgpos, origin ) { - avg_distance = 0; - total_error = 0; - distances = []; - foreach ( position in avgpos ) - { - distances[ team ] = distance( origin, avgpos[ team ] ); - avg_distance += distances[ team ]; - } - avg_distance /= distances.size; - foreach ( dist in distances ) - { - err = distances[ team ] - avg_distance; - total_error += err * err; - } - return total_error; + avg_distance = 0; + total_error = 0; + distances = []; + + foreach ( team, position in avgpos ) + { + distances[team] = distance( origin, avgpos[team] ); + avg_distance += distances[team]; + } + + avg_distance /= distances.size; + + foreach ( team, dist in distances ) + { + err = distances[team] - avg_distance; + total_error += err * err; + } + + return total_error; } -pickzonetospawn() //checked partially changed to match cerberus output did not use continue in foreach see github for more info +pickzonetospawn() { - foreach ( team in level.teams ) - { - avgpos[ team ] = ( 0, 0, 0 ); - num[ team ] = 0; - } - for ( i = 0; i < level.players.size; i++ ) - { - player = level.players[ i ]; - if ( isalive( player ) ) - { - avgpos[ player.pers[ "team" ] ] += player.origin; - num[ player.pers[ "team" ] ]++; - } - } - if ( getcountofteamswithplayers( num ) <= 1 ) - { - zone = level.zones[ randomint( level.zones.size ) ]; - while ( isDefined( level.prevzone ) && zone == level.prevzone ) - { - zone = level.zones[ randomint( level.zones.size ) ]; - } - level.prevzone2 = level.prevzone; - level.prevzone = zone; - return zone; - } - foreach ( team in level.teams ) - { - if ( num[ team ] == 0 ) - { - avgpos[team] = undefined; - } - else - { - avgpos[ team ] /= num[ team ]; - } - } - bestzone = undefined; - lowestcost = undefined; - i = 0; - while ( i < level.zones.size ) - { - zone = level.zones[ i ]; - cost = getpointcost( avgpos, zone.origin ); - if ( isDefined( level.prevzone ) && zone == level.prevzone ) - { - i++; - continue; - } - if ( isDefined( level.prevzone2 ) && zone == level.prevzone2 ) - { - if ( level.zones.size > 2 ) - { - i++; - continue; - } - else - { - cost += 262144; - } - } - if ( !isDefined( lowestcost ) || cost < lowestcost ) - { - lowestcost = cost; - bestzone = zone; - } - i++; - } - /* + foreach ( team in level.teams ) + { + avgpos[team] = ( 0, 0, 0 ); + num[team] = 0; + } + + for ( i = 0; i < level.players.size; i++ ) + { + player = level.players[i]; + + if ( isalive( player ) ) + { + avgpos[player.pers["team"]] += player.origin; + num[player.pers["team"]]++; + } + } + + if ( getcountofteamswithplayers( num ) <= 1 ) + { + for ( zone = level.zones[randomint( level.zones.size )]; isdefined( level.prevzone ) && zone == level.prevzone; zone = level.zones[randomint( level.zones.size )] ) + { + + } + + level.prevzone2 = level.prevzone; + level.prevzone = zone; + return zone; + } + + foreach ( team in level.teams ) + { + if ( num[team] == 0 ) + { + avgpos[team] = undefined; + continue; + } + + avgpos[team] /= num[team]; + } + + bestzone = undefined; + lowestcost = undefined; + + for ( i = 0; i < level.zones.size; i++ ) + { + zone = level.zones[i]; + cost = getpointcost( avgpos, zone.origin ); + + if ( isdefined( level.prevzone ) && zone == level.prevzone ) + continue; + + if ( isdefined( level.prevzone2 ) && zone == level.prevzone2 ) + { + if ( level.zones.size > 2 ) + continue; + else + cost += 262144; + } + + if ( !isdefined( lowestcost ) || cost < lowestcost ) + { + lowestcost = cost; + bestzone = zone; + } + } + /# - assert( isDefined( bestzone ) ); + assert( isdefined( bestzone ) ); #/ - */ - level.prevzone2 = level.prevzone; - level.prevzone = bestzone; - return bestzone; + level.prevzone2 = level.prevzone; + level.prevzone = bestzone; + return bestzone; } -onroundswitch() //checked matches cerberus output +onroundswitch() { - game[ "switchedsides" ] = !game[ "switchedsides" ]; + game["switchedsides"] = !game["switchedsides"]; } -onplayerkilled( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ) //checked changed to match cerberus output +onplayerkilled( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ) { - if ( isplayer( attacker ) || level.capturetime && !self.touchtriggers.size && !attacker.touchtriggers.size || attacker.pers[ "team" ] == self.pers[ "team" ] ) - { - return; - } - medalgiven = 0; - scoreeventprocessed = 0; - ownerteam = undefined; - if ( level.capturetime == 0 ) - { - if ( !isDefined( level.zone ) ) - { - return; - } - ownerteam = level.zone.gameobject.ownerteam; - if ( !isDefined( ownerteam ) || ownerteam == "neutral" ) - { - return; - } - } - if ( self.touchtriggers.size || level.capturetime == 0 && self istouching( level.zone.trig ) ) - { - if ( level.capturetime > 0 ) - { - triggerids = getarraykeys( self.touchtriggers ); - ownerteam = self.touchtriggers[ triggerids[ 0 ] ].useobj.ownerteam; - } - if ( ownerteam != "neutral" ) - { - attacker.lastkilltime = getTime(); - team = self.pers[ "team" ]; - if ( team == ownerteam ) - { - if ( !medalgiven ) - { - attacker maps/mp/_medals::offenseglobalcount(); - attacker addplayerstatwithgametype( "OFFENDS", 1 ); - medalgiven = 1; - } - maps/mp/_scoreevents::processscoreevent( "hardpoint_kill", attacker, undefined, sweapon ); - self recordkillmodifier( "defending" ); - scoreeventprocessed = 1; - } - else - { - if ( !medalgiven ) - { - if ( isDefined( attacker.pers[ "defends" ] ) ) - { - attacker.pers[ "defends" ]++; - attacker.defends = attacker.pers[ "defends" ]; - } - attacker maps/mp/_medals::defenseglobalcount(); - medalgiven = 1; - attacker addplayerstatwithgametype( "DEFENDS", 1 ); - attacker recordgameevent( "return" ); - } - attacker maps/mp/_challenges::killedzoneattacker( sweapon ); - maps/mp/_scoreevents::processscoreevent( "hardpoint_kill", attacker, undefined, sweapon ); - self recordkillmodifier( "assaulting" ); - scoreeventprocessed = 1; - } - } - } - if ( attacker.touchtriggers.size || level.capturetime == 0 && attacker istouching( level.zone.trig ) ) - { - if ( level.capturetime > 0 ) - { - triggerids = getarraykeys( attacker.touchtriggers ); - ownerteam = attacker.touchtriggers[ triggerids[ 0 ] ].useobj.ownerteam; - } - if ( ownerteam != "neutral" ) - { - team = attacker.pers[ "team" ]; - if ( team == ownerteam ) - { - if ( !medalgiven ) - { - if ( isDefined( attacker.pers[ "defends" ] ) ) - { - attacker.pers[ "defends" ]++; - attacker.defends = attacker.pers[ "defends" ]; - } - attacker maps/mp/_medals::defenseglobalcount(); - medalgiven = 1; - attacker addplayerstatwithgametype( "DEFENDS", 1 ); - attacker recordgameevent( "return" ); - } - if ( scoreeventprocessed == 0 ) - { - attacker maps/mp/_challenges::killedzoneattacker( sweapon ); - maps/mp/_scoreevents::processscoreevent( "hardpoint_kill", attacker, undefined, sweapon ); - self recordkillmodifier( "assaulting" ); - } - } - else - { - if ( !medalgiven ) - { - attacker maps/mp/_medals::offenseglobalcount(); - medalgiven = 1; - attacker addplayerstatwithgametype( "OFFENDS", 1 ); - } - if ( scoreeventprocessed == 0 ) - { - maps/mp/_scoreevents::processscoreevent( "hardpoint_kill", attacker, undefined, sweapon ); - self recordkillmodifier( "defending" ); - } - } - } - } - if ( medalgiven == 1 ) - { - if ( level.zone.gameobject.iscontested == 1 ) - { - attacker thread killwhilecontesting(); - } - } + if ( !isplayer( attacker ) || level.capturetime && !self.touchtriggers.size && !attacker.touchtriggers.size || attacker.pers["team"] == self.pers["team"] ) + return; + + medalgiven = 0; + scoreeventprocessed = 0; + ownerteam = undefined; + + if ( level.capturetime == 0 ) + { + if ( !isdefined( level.zone ) ) + return; + + ownerteam = level.zone.gameobject.ownerteam; + + if ( !isdefined( ownerteam ) || ownerteam == "neutral" ) + return; + } + + if ( self.touchtriggers.size || level.capturetime == 0 && self istouching( level.zone.trig ) ) + { + if ( level.capturetime > 0 ) + { + triggerids = getarraykeys( self.touchtriggers ); + ownerteam = self.touchtriggers[triggerids[0]].useobj.ownerteam; + } + + if ( ownerteam != "neutral" ) + { + attacker.lastkilltime = gettime(); + team = self.pers["team"]; + + if ( team == ownerteam ) + { + if ( !medalgiven ) + { + attacker maps\mp\_medals::offenseglobalcount(); + attacker addplayerstatwithgametype( "OFFENDS", 1 ); + medalgiven = 1; + } + + maps\mp\_scoreevents::processscoreevent( "hardpoint_kill", attacker, undefined, sweapon ); + self recordkillmodifier( "defending" ); + scoreeventprocessed = 1; + } + else + { + if ( !medalgiven ) + { + if ( isdefined( attacker.pers["defends"] ) ) + { + attacker.pers["defends"]++; + attacker.defends = attacker.pers["defends"]; + } + + attacker maps\mp\_medals::defenseglobalcount(); + medalgiven = 1; + attacker addplayerstatwithgametype( "DEFENDS", 1 ); + attacker recordgameevent( "return" ); + } + + attacker maps\mp\_challenges::killedzoneattacker( sweapon ); + maps\mp\_scoreevents::processscoreevent( "hardpoint_kill", attacker, undefined, sweapon ); + self recordkillmodifier( "assaulting" ); + scoreeventprocessed = 1; + } + } + } + + if ( attacker.touchtriggers.size || level.capturetime == 0 && attacker istouching( level.zone.trig ) ) + { + if ( level.capturetime > 0 ) + { + triggerids = getarraykeys( attacker.touchtriggers ); + ownerteam = attacker.touchtriggers[triggerids[0]].useobj.ownerteam; + } + + if ( ownerteam != "neutral" ) + { + team = attacker.pers["team"]; + + if ( team == ownerteam ) + { + if ( !medalgiven ) + { + if ( isdefined( attacker.pers["defends"] ) ) + { + attacker.pers["defends"]++; + attacker.defends = attacker.pers["defends"]; + } + + attacker maps\mp\_medals::defenseglobalcount(); + medalgiven = 1; + attacker addplayerstatwithgametype( "DEFENDS", 1 ); + attacker recordgameevent( "return" ); + } + + if ( scoreeventprocessed == 0 ) + { + attacker maps\mp\_challenges::killedzoneattacker( sweapon ); + maps\mp\_scoreevents::processscoreevent( "hardpoint_kill", attacker, undefined, sweapon ); + self recordkillmodifier( "assaulting" ); + } + } + else + { + if ( !medalgiven ) + { + attacker maps\mp\_medals::offenseglobalcount(); + medalgiven = 1; + attacker addplayerstatwithgametype( "OFFENDS", 1 ); + } + + if ( scoreeventprocessed == 0 ) + { + maps\mp\_scoreevents::processscoreevent( "hardpoint_kill", attacker, undefined, sweapon ); + self recordkillmodifier( "defending" ); + } + } + } + } + + if ( medalgiven == 1 ) + { + if ( level.zone.gameobject.iscontested == 1 ) + attacker thread killwhilecontesting(); + } } -killwhilecontesting() //checked changed to match cerberus output +killwhilecontesting() { - self notify( "killWhileContesting" ); - self endon( "killWhileContesting" ); - self endon( "disconnect" ); - killtime = getTime(); - playerteam = self.pers[ "team" ]; - if ( !isDefined( self.clearenemycount ) ) - { - self.clearenemycount = 0; - } - self.clearenemycount++; - zonereturn = level waittill_any_return( "zone_captured" + playerteam, "zone_destroyed", "zone_captured", "death" ); - if ( zonereturn != "zone_destroyed" || zonereturn == "death" || playerteam != self.pers[ "team" ] ) - { - self.clearenemycount = 0; - return; - } - if ( self.clearenemycount >= 2 && ( killtime + 200 ) > getTime() ) - { - maps/mp/_scoreevents::processscoreevent( "clear_2_attackers", self ); - } - self.clearenemycount = 0; + self notify( "killWhileContesting" ); + self endon( "killWhileContesting" ); + self endon( "disconnect" ); + killtime = gettime(); + playerteam = self.pers["team"]; + + if ( !isdefined( self.clearenemycount ) ) + self.clearenemycount = 0; + + self.clearenemycount++; + zonereturn = level waittill_any_return( "zone_captured" + playerteam, "zone_destroyed", "zone_captured", "death" ); + + if ( zonereturn == "zone_destroyed" || zonereturn == "death" || playerteam != self.pers["team"] ) + { + self.clearenemycount = 0; + return; + } + + if ( self.clearenemycount >= 2 && killtime + 200 > gettime() ) + maps\mp\_scoreevents::processscoreevent( "clear_2_attackers", self ); + + self.clearenemycount = 0; } -onendgame( winningteam ) //checked changed to match cerberus output +onendgame( winningteam ) { - for ( i = 0; i < level.zones.size; i++ ) - { - level.zones[ i ].gameobject maps/mp/gametypes/_gameobjects::allowuse( "none" ); - } + for ( i = 0; i < level.zones.size; i++ ) + level.zones[i].gameobject maps\mp\gametypes\_gameobjects::allowuse( "none" ); } -createzonespawninfluencer() //checked matches cerberus output +createzonespawninfluencer() { - koth_objective_influencer_score = level.spawnsystem.koth_objective_influencer_score; - koth_objective_influencer_score_curve = level.spawnsystem.koth_objective_influencer_score_curve; - koth_objective_influencer_radius = level.spawnsystem.koth_objective_influencer_radius; - koth_objective_influencer_inner_score = level.spawnsystem.koth_objective_influencer_inner_score; - koth_objective_influencer_inner_score_curve = level.spawnsystem.koth_objective_influencer_inner_score_curve; - koth_objective_influencer_inner_radius = level.spawnsystem.koth_objective_influencer_inner_radius; - self.spawn_influencer = addsphereinfluencer( level.spawnsystem.einfluencer_type_game_mode, self.gameobject.curorigin, koth_objective_influencer_radius, koth_objective_influencer_score, 0, "koth_objective,r,s", maps/mp/gametypes/_spawning::get_score_curve_index( koth_objective_influencer_score_curve ) ); - self.spawn_influencer_inner = addsphereinfluencer( level.spawnsystem.einfluencer_type_game_mode, self.gameobject.curorigin, koth_objective_influencer_inner_radius, koth_objective_influencer_inner_score, 0, "koth_objective,r,s", maps/mp/gametypes/_spawning::get_score_curve_index( koth_objective_influencer_inner_score_curve ) ); - self enable_zone_spawn_influencer( 0 ); + koth_objective_influencer_score = level.spawnsystem.koth_objective_influencer_score; + koth_objective_influencer_score_curve = level.spawnsystem.koth_objective_influencer_score_curve; + koth_objective_influencer_radius = level.spawnsystem.koth_objective_influencer_radius; + koth_objective_influencer_inner_score = level.spawnsystem.koth_objective_influencer_inner_score; + koth_objective_influencer_inner_score_curve = level.spawnsystem.koth_objective_influencer_inner_score_curve; + koth_objective_influencer_inner_radius = level.spawnsystem.koth_objective_influencer_inner_radius; + self.spawn_influencer = addsphereinfluencer( level.spawnsystem.einfluencer_type_game_mode, self.gameobject.curorigin, koth_objective_influencer_radius, koth_objective_influencer_score, 0, "koth_objective,r,s", maps\mp\gametypes\_spawning::get_score_curve_index( koth_objective_influencer_score_curve ) ); + self.spawn_influencer_inner = addsphereinfluencer( level.spawnsystem.einfluencer_type_game_mode, self.gameobject.curorigin, koth_objective_influencer_inner_radius, koth_objective_influencer_inner_score, 0, "koth_objective,r,s", maps\mp\gametypes\_spawning::get_score_curve_index( koth_objective_influencer_inner_score_curve ) ); + self enable_zone_spawn_influencer( 0 ); } -enable_zone_spawn_influencer( enabled ) //checked matches cerberus output +enable_zone_spawn_influencer( enabled ) { - if ( isDefined( self.spawn_influencer ) ) - { - enableinfluencer( self.spawn_influencer, enabled ); - enableinfluencer( self.spawn_influencer_inner, enabled ); - } + if ( isdefined( self.spawn_influencer ) ) + { + enableinfluencer( self.spawn_influencer, enabled ); + enableinfluencer( self.spawn_influencer_inner, enabled ); + } } -koth_gamemodespawndvars( reset_dvars ) //checked matches cerberus output +koth_gamemodespawndvars( reset_dvars ) { - ss = level.spawnsystem; - ss.koth_objective_influencer_score = set_dvar_float_if_unset( "scr_spawn_koth_objective_influencer_score", "200", reset_dvars ); - ss.koth_objective_influencer_score_curve = set_dvar_if_unset( "scr_spawn_koth_objective_influencer_score_curve", "linear", reset_dvars ); - ss.koth_objective_influencer_radius = set_dvar_float_if_unset( "scr_spawn_koth_objective_influencer_radius", "" + 4000, reset_dvars ); - ss.koth_objective_influencer_inner_score = -800; - ss.koth_objective_influencer_inner_score_curve = "constant"; - ss.koth_objective_influencer_inner_radius = 1000; - ss.koth_initial_spawns_influencer_score = set_dvar_float_if_unset( "scr_spawn_koth_initial_spawns_influencer_score", "200", reset_dvars ); - ss.koth_initial_spawns_influencer_score_curve = set_dvar_if_unset( "scr_spawn_koth_initial_spawns_influencer_score_curve", "linear", reset_dvars ); - ss.koth_initial_spawns_influencer_radius = set_dvar_float_if_unset( "scr_spawn_koth_initial_spawns_influencer_radius", "" + ( 10 * get_player_height() ), reset_dvars ); + ss = level.spawnsystem; + ss.koth_objective_influencer_score = set_dvar_float_if_unset( "scr_spawn_koth_objective_influencer_score", "200", reset_dvars ); + ss.koth_objective_influencer_score_curve = set_dvar_if_unset( "scr_spawn_koth_objective_influencer_score_curve", "linear", reset_dvars ); + ss.koth_objective_influencer_radius = set_dvar_float_if_unset( "scr_spawn_koth_objective_influencer_radius", "" + 4000, reset_dvars ); + ss.koth_objective_influencer_inner_score = -800; + ss.koth_objective_influencer_inner_score_curve = "constant"; + ss.koth_objective_influencer_inner_radius = 1000; + ss.koth_initial_spawns_influencer_score = set_dvar_float_if_unset( "scr_spawn_koth_initial_spawns_influencer_score", "200", reset_dvars ); + ss.koth_initial_spawns_influencer_score_curve = set_dvar_if_unset( "scr_spawn_koth_initial_spawns_influencer_score_curve", "linear", reset_dvars ); + ss.koth_initial_spawns_influencer_radius = set_dvar_float_if_unset( "scr_spawn_koth_initial_spawns_influencer_radius", "" + 10.0 * get_player_height(), reset_dvars ); } -updatecapsperminute( lastownerteam ) //checked matches cerberus output +updatecapsperminute( lastownerteam ) { - if ( !isDefined( self.capsperminute ) ) - { - self.numcaps = 0; - self.capsperminute = 0; - } - if ( !isDefined( lastownerteam ) || lastownerteam == "neutral" ) - { - return; - } - self.numcaps++; - minutespassed = maps/mp/gametypes/_globallogic_utils::gettimepassed() / 60000; - if ( isplayer( self ) && isDefined( self.timeplayed[ "total" ] ) ) - { - minutespassed = self.timeplayed[ "total" ] / 60; - } - self.capsperminute = self.numcaps / minutespassed; - if ( self.capsperminute > self.numcaps ) - { - self.capsperminute = self.numcaps; - } + if ( !isdefined( self.capsperminute ) ) + { + self.numcaps = 0; + self.capsperminute = 0; + } + + if ( !isdefined( lastownerteam ) || lastownerteam == "neutral" ) + return; + + self.numcaps++; + minutespassed = maps\mp\gametypes\_globallogic_utils::gettimepassed() / 60000; + + if ( isplayer( self ) && isdefined( self.timeplayed["total"] ) ) + minutespassed = self.timeplayed["total"] / 60; + + self.capsperminute = self.numcaps / minutespassed; + + if ( self.capsperminute > self.numcaps ) + self.capsperminute = self.numcaps; } -isscoreboosting( player ) //checked matches cerberus output +isscoreboosting( player ) { - if ( !level.rankedmatch ) - { - return 0; - } - if ( player.capsperminute > level.playercapturelpm ) - { - return 1; - } - return 0; + if ( !level.rankedmatch ) + return false; + + if ( player.capsperminute > level.playercapturelpm ) + return true; + + return false; } - - diff --git a/Multiplayer Core/patch_mp/maps/mp/gametypes/oic.gsc b/Multiplayer Core/patch_mp/maps/mp/gametypes/oic.gsc index f92c65d..37fd273 100644 --- a/Multiplayer Core/patch_mp/maps/mp/gametypes/oic.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/gametypes/oic.gsc @@ -1,355 +1,331 @@ -#include maps/mp/gametypes/_persistence; -#include maps/mp/_scoreevents; -#include maps/mp/gametypes/_globallogic_score; -#include maps/mp/gametypes/_spawnlogic; -#include maps/mp/gametypes/_spawning; -#include maps/mp/gametypes/_gameobjects; -#include maps/mp/gametypes/_wager; -#include maps/mp/gametypes/_callbacksetup; -#include maps/mp/gametypes/_globallogic; -#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 - -main() //checked matches cerberus output +main() { - maps/mp/gametypes/_globallogic::init(); - maps/mp/gametypes/_callbacksetup::setupcallbacks(); - maps/mp/gametypes/_globallogic::setupcallbacks(); - level.pointsperweaponkill = getgametypesetting( "pointsPerWeaponKill" ); - level.pointspermeleekill = getgametypesetting( "pointsPerMeleeKill" ); - level.pointsforsurvivalbonus = getgametypesetting( "pointsForSurvivalBonus" ); - registertimelimit( 0, 1440 ); - registerscorelimit( 0, 50000 ); - registerroundlimit( 0, 10 ); - registerroundwinlimit( 0, 10 ); - registernumlives( 1, 100 ); - level.onstartgametype = ::onstartgametype; - level.onspawnplayer = ::onspawnplayer; - level.onspawnplayerunified = ::onspawnplayerunified; - level.givecustomloadout = ::givecustomloadout; - level.onplayerkilled = ::onplayerkilled; - level.onplayerdamage = ::onplayerdamage; - level.onwagerawards = ::onwagerawards; - game[ "dialog" ][ "gametype" ] = "oic_start"; - game[ "dialog" ][ "wm_2_lives" ] = "oic_2life"; - game[ "dialog" ][ "wm_final_life" ] = "oic_last"; - precachestring( &"MPUI_PLAYER_KILLED" ); - precachestring( &"MP_PLUS_ONE_BULLET" ); - precachestring( &"MP_OIC_SURVIVOR_BONUS" ); - precacheitem( "kard_wager_mp" ); - setscoreboardcolumns( "pointstowin", "kills", "deaths", "stabs", "survived" ); + maps\mp\gametypes\_globallogic::init(); + maps\mp\gametypes\_callbacksetup::setupcallbacks(); + maps\mp\gametypes\_globallogic::setupcallbacks(); + level.pointsperweaponkill = getgametypesetting( "pointsPerWeaponKill" ); + level.pointspermeleekill = getgametypesetting( "pointsPerMeleeKill" ); + level.pointsforsurvivalbonus = getgametypesetting( "pointsForSurvivalBonus" ); + registertimelimit( 0, 1440 ); + registerscorelimit( 0, 50000 ); + registerroundlimit( 0, 10 ); + registerroundwinlimit( 0, 10 ); + registernumlives( 1, 100 ); + level.onstartgametype = ::onstartgametype; + level.onspawnplayer = ::onspawnplayer; + level.onspawnplayerunified = ::onspawnplayerunified; + level.givecustomloadout = ::givecustomloadout; + level.onplayerkilled = ::onplayerkilled; + level.onplayerdamage = ::onplayerdamage; + level.onwagerawards = ::onwagerawards; + game["dialog"]["gametype"] = "oic_start"; + game["dialog"]["wm_2_lives"] = "oic_2life"; + game["dialog"]["wm_final_life"] = "oic_last"; + precachestring( &"MPUI_PLAYER_KILLED" ); + precachestring( &"MP_PLUS_ONE_BULLET" ); + precachestring( &"MP_OIC_SURVIVOR_BONUS" ); + precacheitem( "kard_wager_mp" ); + setscoreboardcolumns( "pointstowin", "kills", "deaths", "stabs", "survived" ); } -onplayerdamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime ) //checked changed to match cerberus output +onplayerdamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime ) { - if ( smeansofdeath == "MOD_PISTOL_BULLET" || smeansofdeath == "MOD_RIFLE_BULLET" || smeansofdeath == "MOD_HEAD_SHOT" ) - { - idamage = self.maxhealth + 1; - } - return idamage; + if ( smeansofdeath == "MOD_PISTOL_BULLET" || smeansofdeath == "MOD_RIFLE_BULLET" || smeansofdeath == "MOD_HEAD_SHOT" ) + idamage = self.maxhealth + 1; + + return idamage; } -givecustomloadout() //checked matches cerberus output +givecustomloadout() { - weapon = "kard_wager_mp"; - self maps/mp/gametypes/_wager::setupblankrandomplayer( 1, 1, weapon ); - self giveweapon( weapon ); - self giveweapon( "knife_mp" ); - self switchtoweapon( weapon ); - clipammo = 1; - if ( isDefined( self.pers[ "clip_ammo" ] ) ) - { - clipammo = self.pers[ "clip_ammo" ]; - self.pers["clip_ammo"] = undefined; - } - self setweaponammoclip( weapon, clipammo ); - stockammo = 0; - if ( isDefined( self.pers[ "stock_ammo" ] ) ) - { - stockammo = self.pers[ "stock_ammo" ]; - self.pers["stock_ammo"] = undefined; - } - self setweaponammostock( weapon, stockammo ); - self setspawnweapon( weapon ); - self setperk( "specialty_unlimitedsprint" ); - self setperk( "specialty_movefaster" ); - return weapon; + weapon = "kard_wager_mp"; + self maps\mp\gametypes\_wager::setupblankrandomplayer( 1, 1, weapon ); + self giveweapon( weapon ); + self giveweapon( "knife_mp" ); + self switchtoweapon( weapon ); + clipammo = 1; + + if ( isdefined( self.pers["clip_ammo"] ) ) + { + clipammo = self.pers["clip_ammo"]; + self.pers["clip_ammo"] = undefined; + } + + self setweaponammoclip( weapon, clipammo ); + stockammo = 0; + + if ( isdefined( self.pers["stock_ammo"] ) ) + { + stockammo = self.pers["stock_ammo"]; + self.pers["stock_ammo"] = undefined; + } + + self setweaponammostock( weapon, stockammo ); + self setspawnweapon( weapon ); + self setperk( "specialty_unlimitedsprint" ); + self setperk( "specialty_movefaster" ); + return weapon; } -onstartgametype() //checked matches cerberus output +onstartgametype() { - setclientnamemode( "auto_change" ); - setobjectivetext( "allies", &"OBJECTIVES_DM" ); - setobjectivetext( "axis", &"OBJECTIVES_DM" ); - if ( level.splitscreen ) - { - setobjectivescoretext( "allies", &"OBJECTIVES_DM" ); - setobjectivescoretext( "axis", &"OBJECTIVES_DM" ); - } - else - { - setobjectivescoretext( "allies", &"OBJECTIVES_DM_SCORE" ); - setobjectivescoretext( "axis", &"OBJECTIVES_DM_SCORE" ); - } - allowed = []; - allowed[ 0 ] = "oic"; - maps/mp/gametypes/_gameobjects::main( allowed ); - maps/mp/gametypes/_spawning::create_map_placed_influencers(); - level.spawnmins = ( 0, 0, 0 ); - level.spawnmaxs = ( 0, 0, 0 ); - newspawns = getentarray( "mp_wager_spawn", "classname" ); - if ( newspawns.size > 0 ) - { - maps/mp/gametypes/_spawnlogic::addspawnpoints( "allies", "mp_wager_spawn" ); - maps/mp/gametypes/_spawnlogic::addspawnpoints( "axis", "mp_wager_spawn" ); - } - else - { - maps/mp/gametypes/_spawnlogic::addspawnpoints( "allies", "mp_dm_spawn" ); - maps/mp/gametypes/_spawnlogic::addspawnpoints( "axis", "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.displayroundendtext = 0; - if ( level.roundlimit != 1 && level.numlives ) - { - level.overrideplayerscore = 1; - level.displayroundendtext = 1; - level.onendgame = ::onendgame; - } - level thread watchelimination(); - setobjectivehinttext( "allies", &"OBJECTIVES_OIC_HINT" ); - setobjectivehinttext( "axis", &"OBJECTIVES_OIC_HINT" ); + setclientnamemode( "auto_change" ); + setobjectivetext( "allies", &"OBJECTIVES_DM" ); + setobjectivetext( "axis", &"OBJECTIVES_DM" ); + + if ( level.splitscreen ) + { + setobjectivescoretext( "allies", &"OBJECTIVES_DM" ); + setobjectivescoretext( "axis", &"OBJECTIVES_DM" ); + } + else + { + setobjectivescoretext( "allies", &"OBJECTIVES_DM_SCORE" ); + setobjectivescoretext( "axis", &"OBJECTIVES_DM_SCORE" ); + } + + allowed[0] = "oic"; + maps\mp\gametypes\_gameobjects::main( allowed ); + maps\mp\gametypes\_spawning::create_map_placed_influencers(); + level.spawnmins = ( 0, 0, 0 ); + level.spawnmaxs = ( 0, 0, 0 ); + newspawns = getentarray( "mp_wager_spawn", "classname" ); + + if ( newspawns.size > 0 ) + { + maps\mp\gametypes\_spawnlogic::addspawnpoints( "allies", "mp_wager_spawn" ); + maps\mp\gametypes\_spawnlogic::addspawnpoints( "axis", "mp_wager_spawn" ); + } + else + { + maps\mp\gametypes\_spawnlogic::addspawnpoints( "allies", "mp_dm_spawn" ); + maps\mp\gametypes\_spawnlogic::addspawnpoints( "axis", "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.displayroundendtext = 0; + + if ( level.roundlimit != 1 && level.numlives ) + { + level.overrideplayerscore = 1; + level.displayroundendtext = 1; + level.onendgame = ::onendgame; + } + + level thread watchelimination(); + setobjectivehinttext( "allies", &"OBJECTIVES_OIC_HINT" ); + setobjectivehinttext( "axis", &"OBJECTIVES_OIC_HINT" ); } -onspawnplayerunified() //checked changed to match cerberus output +onspawnplayerunified() { - maps/mp/gametypes/_spawning::onspawnplayer_unified(); - livesleft = self.pers[ "lives" ]; - if ( livesleft == 2 ) - { - self maps/mp/gametypes/_wager::wagerannouncer( "wm_2_lives" ); - } - else if ( livesleft == 1 ) - { - self maps/mp/gametypes/_wager::wagerannouncer( "wm_final_life" ); - } + maps\mp\gametypes\_spawning::onspawnplayer_unified(); + livesleft = self.pers["lives"]; + + if ( livesleft == 2 ) + self maps\mp\gametypes\_wager::wagerannouncer( "wm_2_lives" ); + else if ( livesleft == 1 ) + self maps\mp\gametypes\_wager::wagerannouncer( "wm_final_life" ); } -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, "oic" ); - } + 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, "oic" ); } -onendgame( winningplayer ) //checked matches cerberus output +onendgame( winningplayer ) { - if ( isDefined( winningplayer ) && isplayer( winningplayer ) ) - { - [[ level._setplayerscore ]]( winningplayer, [[ level._getplayerscore ]]( winningplayer ) + 1 ); - } + if ( isdefined( winningplayer ) && isplayer( winningplayer ) ) + [[ level._setplayerscore ]]( winningplayer, [[ level._getplayerscore ]]( winningplayer ) + 1 ); } -onstartwagersidebets() //checked matches cerberus output +onstartwagersidebets() { - thread saveoffallplayersammo(); + thread saveoffallplayersammo(); } -saveoffallplayersammo() //checked partially changed to match cerberus output //did not change while loop to for loop see github for more info +saveoffallplayersammo() { - wait 1; - playerindex = 0; - while ( playerindex < level.players.size ) - { - player = level.players[ playerindex ]; - if ( !isDefined( player ) ) - { - playerindex++; - continue; - } - if ( player.pers[ "lives" ] == 0 ) - { - playerindex++; - continue; - } - currentweapon = player getcurrentweapon(); - player.pers[ "clip_ammo" ] = player getweaponammoclip( currentweapon ); - player.pers[ "stock_ammo" ] = player getweaponammostock( currentweapon ); - playerindex++; - } + wait 1.0; + + for ( playerindex = 0; playerindex < level.players.size; playerindex++ ) + { + player = level.players[playerindex]; + + if ( !isdefined( player ) ) + continue; + + if ( player.pers["lives"] == 0 ) + continue; + + currentweapon = player getcurrentweapon(); + player.pers["clip_ammo"] = player getweaponammoclip( currentweapon ); + player.pers["stock_ammo"] = player getweaponammostock( currentweapon ); + } } -isplayereliminated( player ) //checked changed at own discretion +isplayereliminated( player ) { - if ( is_true( player.pers[ "eliminated" ] ) ) - { - return 1; - } - return 0; + return isdefined( player.pers["eliminated"] ) && player.pers["eliminated"]; } -getplayersleft() //checked partially changed to match cerberus output did not change while loop to for loop see github for more info +getplayersleft() { - playersremaining = []; - playerindex = 0; - while ( playerindex < level.players.size ) - { - player = level.players[ playerindex ]; - if ( !isDefined( player ) ) - { - playerindex++; - continue; - } - if ( !isplayereliminated( player ) ) - { - playersremaining[ playersremaining.size ] = player; - } - playerindex++; - } - return playersremaining; + playersremaining = []; + + for ( playerindex = 0; playerindex < level.players.size; playerindex++ ) + { + player = level.players[playerindex]; + + if ( !isdefined( player ) ) + continue; + + if ( !isplayereliminated( player ) ) + playersremaining[playersremaining.size] = player; + } + + return playersremaining; } -onwagerfinalizeround() //checked changed to match cerberus output +onwagerfinalizeround() { - playersleft = getplayersleft(); - lastmanstanding = playersleft[ 0 ]; - sidebetpool = 0; - sidebetwinners = []; - players = level.players; - for ( playerindex = 0; playerindex < players.size; playerindex++ ) - { - if ( isDefined( players[ playerindex ].pers[ "sideBetMade" ] ) ) - { - sidebetpool += getDvarInt( "scr_wagerSideBet" ); - if ( players[ playerindex ].pers[ "sideBetMade" ] == lastmanstanding.name ) - { - sidebetwinners[ sidebetwinners.size ] = players[ playerindex ]; - } - } - } - if ( sidebetwinners.size == 0 ) - { - return; - } - sidebetpayout = int( sidebetpool / sidebetwinners.size ); - for ( index = 0; index < sidebetwinners.size; index++ ) - { - player = sidebetwinners[ index ]; - player.pers[ "wager_sideBetWinnings" ] += sidebetpayout; - } + playersleft = getplayersleft(); + lastmanstanding = playersleft[0]; + sidebetpool = 0; + sidebetwinners = []; + players = level.players; + + for ( playerindex = 0; playerindex < players.size; playerindex++ ) + { + if ( isdefined( players[playerindex].pers["sideBetMade"] ) ) + { + sidebetpool += getdvarint( "scr_wagerSideBet" ); + + if ( players[playerindex].pers["sideBetMade"] == lastmanstanding.name ) + sidebetwinners[sidebetwinners.size] = players[playerindex]; + } + } + + if ( sidebetwinners.size == 0 ) + return; + + sidebetpayout = int( sidebetpool / sidebetwinners.size ); + + for ( index = 0; index < sidebetwinners.size; index++ ) + { + player = sidebetwinners[index]; + player.pers["wager_sideBetWinnings"] += sidebetpayout; + } } -onplayerkilled( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ) //checked matches cerberus output +onplayerkilled( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ) { - if ( isDefined( attacker ) && isplayer( attacker ) && self != attacker ) - { - attackerammo = attacker getammocount( "kard_wager_mp" ); - victimammo = self getammocount( "kard_wager_mp" ); - attacker giveammo( 1 ); - attacker thread maps/mp/gametypes/_wager::queuewagerpopup( &"MPUI_PLAYER_KILLED", 0, &"MP_PLUS_ONE_BULLET" ); - attacker playlocalsound( "mpl_oic_bullet_pickup" ); - if ( smeansofdeath == "MOD_MELEE" ) - { - attacker maps/mp/gametypes/_globallogic_score::givepointstowin( level.pointspermeleekill ); - if ( attackerammo > 0 ) - { - maps/mp/_scoreevents::processscoreevent( "knife_with_ammo_oic", attacker, self, sweapon ); - } - if ( victimammo > attackerammo ) - { - maps/mp/_scoreevents::processscoreevent( "kill_enemy_with_more_ammo_oic", attacker, self, sweapon ); - } - } - else - { - attacker maps/mp/gametypes/_globallogic_score::givepointstowin( level.pointsperweaponkill ); - if ( victimammo > ( attackerammo + 1 ) ) - { - maps/mp/_scoreevents::processscoreevent( "kill_enemy_with_more_ammo_oic", attacker, self, sweapon ); - } - } - if ( self.pers[ "lives" ] == 0 ) - { - maps/mp/_scoreevents::processscoreevent( "eliminate_oic", attacker, self, sweapon ); - } - } + if ( isdefined( attacker ) && isplayer( attacker ) && self != attacker ) + { + attackerammo = attacker getammocount( "kard_wager_mp" ); + victimammo = self getammocount( "kard_wager_mp" ); + attacker giveammo( 1 ); + attacker thread maps\mp\gametypes\_wager::queuewagerpopup( &"MPUI_PLAYER_KILLED", 0, &"MP_PLUS_ONE_BULLET" ); + attacker playlocalsound( "mpl_oic_bullet_pickup" ); + + if ( smeansofdeath == "MOD_MELEE" ) + { + attacker maps\mp\gametypes\_globallogic_score::givepointstowin( level.pointspermeleekill ); + + if ( attackerammo > 0 ) + maps\mp\_scoreevents::processscoreevent( "knife_with_ammo_oic", attacker, self, sweapon ); + + if ( victimammo > attackerammo ) + maps\mp\_scoreevents::processscoreevent( "kill_enemy_with_more_ammo_oic", attacker, self, sweapon ); + } + else + { + attacker maps\mp\gametypes\_globallogic_score::givepointstowin( level.pointsperweaponkill ); + + if ( victimammo > attackerammo + 1 ) + maps\mp\_scoreevents::processscoreevent( "kill_enemy_with_more_ammo_oic", attacker, self, sweapon ); + } + + if ( self.pers["lives"] == 0 ) + maps\mp\_scoreevents::processscoreevent( "eliminate_oic", attacker, self, sweapon ); + } } -giveammo( amount ) //checked matches cerberus output +giveammo( amount ) { - currentweapon = self getcurrentweapon(); - clipammo = self getweaponammoclip( currentweapon ); - self setweaponammoclip( currentweapon, clipammo + amount ); + currentweapon = self getcurrentweapon(); + clipammo = self getweaponammoclip( currentweapon ); + self setweaponammoclip( currentweapon, clipammo + amount ); } -shouldreceivesurvivorbonus() //checked matches cerberus output +shouldreceivesurvivorbonus() { - if ( isalive( self ) ) - { - return 1; - } - if ( self.hasspawned && self.pers[ "lives" ] > 0 ) - { - return 1; - } - return 0; + if ( isalive( self ) ) + return true; + + if ( self.hasspawned && self.pers["lives"] > 0 ) + return true; + + return false; } -watchelimination() //checked changed to match cerberus output +watchelimination() { - level endon( "game_ended" ); - for ( ;; ) - { - level waittill( "player_eliminated" ); - players = level.players; - for ( i = 0; i < players.size; i++ ) - { - if ( isDefined( players[ i ] ) && players[ i ] shouldreceivesurvivorbonus() ) - { - players[ i ].pers[ "survived" ]++; - players[ i ].survived = players[ i ].pers[ "survived" ]; - players[ i ] thread maps/mp/gametypes/_wager::queuewagerpopup( &"MP_OIC_SURVIVOR_BONUS", 10 ); - score = maps/mp/gametypes/_globallogic_score::_getplayerscore( players[ i ] ); - maps/mp/_scoreevents::processscoreevent( "survivor", players[ i ] ); - players[ i ] maps/mp/gametypes/_globallogic_score::givepointstowin( level.pointsforsurvivalbonus ); - } - } - } + level endon( "game_ended" ); + + for (;;) + { + level waittill( "player_eliminated" ); + + players = level.players; + + for ( i = 0; i < players.size; i++ ) + { + if ( isdefined( players[i] ) && players[i] shouldreceivesurvivorbonus() ) + { + players[i].pers["survived"]++; + players[i].survived = players[i].pers["survived"]; + players[i] thread maps\mp\gametypes\_wager::queuewagerpopup( &"MP_OIC_SURVIVOR_BONUS", 10 ); + score = maps\mp\gametypes\_globallogic_score::_getplayerscore( players[i] ); + maps\mp\_scoreevents::processscoreevent( "survivor", players[i] ); + players[i] maps\mp\gametypes\_globallogic_score::givepointstowin( level.pointsforsurvivalbonus ); + } + } + } } -onwagerawards() //checked matches cerberus output +onwagerawards() { - stabs = self maps/mp/gametypes/_globallogic_score::getpersstat( "stabs" ); - if ( !isDefined( stabs ) ) - { - stabs = 0; - } - self maps/mp/gametypes/_persistence::setafteractionreportstat( "wagerAwards", stabs, 0 ); - longshots = self maps/mp/gametypes/_globallogic_score::getpersstat( "longshots" ); - if ( !isDefined( longshots ) ) - { - longshots = 0; - } - self maps/mp/gametypes/_persistence::setafteractionreportstat( "wagerAwards", longshots, 1 ); - bestkillstreak = self maps/mp/gametypes/_globallogic_score::getpersstat( "best_kill_streak" ); - if ( !isDefined( bestkillstreak ) ) - { - bestkillstreak = 0; - } - self maps/mp/gametypes/_persistence::setafteractionreportstat( "wagerAwards", bestkillstreak, 2 ); -} + stabs = self maps\mp\gametypes\_globallogic_score::getpersstat( "stabs" ); + if ( !isdefined( stabs ) ) + stabs = 0; + + self maps\mp\gametypes\_persistence::setafteractionreportstat( "wagerAwards", stabs, 0 ); + longshots = self maps\mp\gametypes\_globallogic_score::getpersstat( "longshots" ); + + if ( !isdefined( longshots ) ) + longshots = 0; + + self maps\mp\gametypes\_persistence::setafteractionreportstat( "wagerAwards", longshots, 1 ); + bestkillstreak = self maps\mp\gametypes\_globallogic_score::getpersstat( "best_kill_streak" ); + + if ( !isdefined( bestkillstreak ) ) + bestkillstreak = 0; + + self maps\mp\gametypes\_persistence::setafteractionreportstat( "wagerAwards", bestkillstreak, 2 ); +} diff --git a/Multiplayer Core/patch_mp/maps/mp/gametypes/oneflag.gsc b/Multiplayer Core/patch_mp/maps/mp/gametypes/oneflag.gsc index 87559be..dedcbdc 100644 --- a/Multiplayer Core/patch_mp/maps/mp/gametypes/oneflag.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/gametypes/oneflag.gsc @@ -1,1339 +1,1271 @@ -#include maps/mp/gametypes/_rank; -#include maps/mp/gametypes/_globallogic_defaults; -#include maps/mp/_challenges; -#include maps/mp/_demo; -#include maps/mp/_scoreevents; -#include maps/mp/gametypes/_weapons; -#include maps/mp/_popups; -#include maps/mp/gametypes/_globallogic_utils; -#include maps/mp/gametypes/_hud_message; -#include maps/mp/gametypes/_spawnlogic; -#include maps/mp/gametypes/_spawning; -#include maps/mp/gametypes/_gameobjects; -#include maps/mp/gametypes/_globallogic_score; -#include maps/mp/teams/_teams; -#include maps/mp/gametypes/_globallogic_audio; -#include maps/mp/gametypes/_callbacksetup; -#include maps/mp/gametypes/_globallogic; -#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 -main() //checked matches cerberus output +main() { - if ( getDvar( "mapname" ) == "mp_background" ) - { - return; - } - maps/mp/gametypes/_globallogic::init(); - maps/mp/gametypes/_callbacksetup::setupcallbacks(); - maps/mp/gametypes/_globallogic::setupcallbacks(); - registertimelimit( 0, 1440 ); - registerroundlimit( 0, 10 ); - registerroundwinlimit( 0, 10 ); - registerroundswitch( 0, 9 ); - registernumlives( 0, 100 ); - registerscorelimit( 0, 5000 ); - level.scoreroundbased = getgametypesetting( "roundscorecarry" ) == 0; - maps/mp/gametypes/_globallogic::registerfriendlyfiredelay( level.gametype, 15, 0, 1440 ); - if ( getDvar( "scr_ctf_spawnPointFacingAngle" ) == "" ) - { - setdvar( "scr_ctf_spawnPointFacingAngle", "0" ); - } - level.teambased = 1; - level.overrideteamscore = 1; - level.onstartgametype = ::onstartgametype; - level.onspawnplayer = ::onspawnplayer; - level.onspawnplayerunified = ::onspawnplayerunified; - level.onprecachegametype = ::onprecachegametype; - level.onplayerkilled = ::onplayerkilled; - level.onroundswitch = ::onroundswitch; - level.onendgame = ::onendgame; - level.onroundendgame = ::onroundendgame; - level.gamemodespawndvars = ::ctf_gamemodespawndvars; - level.getteamkillpenalty = ::ctf_getteamkillpenalty; - level.getteamkillscore = ::ctf_getteamkillscore; - level.setmatchscorehudelemforteam = ::setmatchscorehudelemforteam; - level.shouldplayovertimeround = ::shouldplayovertimeround; - if ( !isDefined( game[ "ctf_teamscore" ] ) ) - { - game[ "ctf_teamscore" ][ "allies" ] = 0; - game[ "ctf_teamscore" ][ "axis" ] = 0; - } - game[ "dialog" ][ "gametype" ] = "ctf_start"; - game[ "dialog" ][ "gametype_hardcore" ] = "hcctf_start"; - game[ "dialog" ][ "wetake_flag" ] = "ctf_wetake"; - game[ "dialog" ][ "theytake_flag" ] = "ctf_theytake"; - game[ "dialog" ][ "theydrop_flag" ] = "ctf_theydrop"; - game[ "dialog" ][ "wedrop_flag" ] = "ctf_wedrop"; - game[ "dialog" ][ "wereturn_flag" ] = "ctf_wereturn"; - game[ "dialog" ][ "theyreturn_flag" ] = "ctf_theyreturn"; - game[ "dialog" ][ "theycap_flag" ] = "ctf_theycap"; - game[ "dialog" ][ "wecap_flag" ] = "ctf_wecap"; - game[ "dialog" ][ "offense_obj" ] = "cap_start"; - game[ "dialog" ][ "defense_obj" ] = "cap_start"; - level.lastdialogtime = getTime(); - level thread ctf_icon_hide(); - if ( !sessionmodeissystemlink() && !sessionmodeisonlinegame() && issplitscreen() ) - { - setscoreboardcolumns( "score", "kills", "captures", "defends", "deaths" ); - } - else - { - setscoreboardcolumns( "score", "kills", "deaths", "captures", "defends" ); - } - maps/mp/gametypes/_globallogic_audio::registerdialoggroup( "ctf_flag", 0 ); - maps/mp/gametypes/_globallogic_audio::registerdialoggroup( "ctf_flag_enemy", 0 ); + if ( getdvar( "mapname" ) == "mp_background" ) + return; + + maps\mp\gametypes\_globallogic::init(); + maps\mp\gametypes\_callbacksetup::setupcallbacks(); + maps\mp\gametypes\_globallogic::setupcallbacks(); + registertimelimit( 0, 1440 ); + registerroundlimit( 0, 10 ); + registerroundwinlimit( 0, 10 ); + registerroundswitch( 0, 9 ); + registernumlives( 0, 100 ); + registerscorelimit( 0, 5000 ); + level.scoreroundbased = getgametypesetting( "roundscorecarry" ) == 0; + maps\mp\gametypes\_globallogic::registerfriendlyfiredelay( level.gametype, 15, 0, 1440 ); + + if ( getdvar( "scr_ctf_spawnPointFacingAngle" ) == "" ) + setdvar( "scr_ctf_spawnPointFacingAngle", "0" ); + + level.teambased = 1; + level.overrideteamscore = 1; + level.onstartgametype = ::onstartgametype; + level.onspawnplayer = ::onspawnplayer; + level.onspawnplayerunified = ::onspawnplayerunified; + level.onprecachegametype = ::onprecachegametype; + level.onplayerkilled = ::onplayerkilled; + level.onroundswitch = ::onroundswitch; + level.onendgame = ::onendgame; + level.onroundendgame = ::onroundendgame; + level.gamemodespawndvars = ::ctf_gamemodespawndvars; + level.getteamkillpenalty = ::ctf_getteamkillpenalty; + level.getteamkillscore = ::ctf_getteamkillscore; + level.setmatchscorehudelemforteam = ::setmatchscorehudelemforteam; + level.shouldplayovertimeround = ::shouldplayovertimeround; + + if ( !isdefined( game["ctf_teamscore"] ) ) + { + game["ctf_teamscore"]["allies"] = 0; + game["ctf_teamscore"]["axis"] = 0; + } + + game["dialog"]["gametype"] = "ctf_start"; + game["dialog"]["gametype_hardcore"] = "hcctf_start"; + game["dialog"]["wetake_flag"] = "ctf_wetake"; + game["dialog"]["theytake_flag"] = "ctf_theytake"; + game["dialog"]["theydrop_flag"] = "ctf_theydrop"; + game["dialog"]["wedrop_flag"] = "ctf_wedrop"; + game["dialog"]["wereturn_flag"] = "ctf_wereturn"; + game["dialog"]["theyreturn_flag"] = "ctf_theyreturn"; + game["dialog"]["theycap_flag"] = "ctf_theycap"; + game["dialog"]["wecap_flag"] = "ctf_wecap"; + game["dialog"]["offense_obj"] = "cap_start"; + game["dialog"]["defense_obj"] = "cap_start"; + level.lastdialogtime = gettime(); + level thread ctf_icon_hide(); + + if ( !sessionmodeissystemlink() && !sessionmodeisonlinegame() && issplitscreen() ) + setscoreboardcolumns( "score", "kills", "captures", "defends", "deaths" ); + else + setscoreboardcolumns( "score", "kills", "deaths", "captures", "defends" ); + + maps\mp\gametypes\_globallogic_audio::registerdialoggroup( "ctf_flag", 0 ); + maps\mp\gametypes\_globallogic_audio::registerdialoggroup( "ctf_flag_enemy", 0 ); } -onprecachegametype() //checked matches cerberus output +onprecachegametype() { - game[ "flag_dropped_sound" ] = "mp_war_objective_lost"; - game[ "flag_recovered_sound" ] = "mp_war_objective_taken"; - game[ "strings" ][ "flag_respawning_in" ] = &"MP_FLAG_RESPAWNING_IN"; - precachemodel( maps/mp/teams/_teams::getteamflagmodel( "allies" ) ); - precachemodel( maps/mp/teams/_teams::getteamflagmodel( "axis" ) ); - precachemodel( maps/mp/teams/_teams::getteamflagmodel( "neutral" ) ); - precachemodel( maps/mp/teams/_teams::getteamflagcarrymodel( "allies" ) ); - precachemodel( maps/mp/teams/_teams::getteamflagcarrymodel( "axis" ) ); - precacheshader( maps/mp/teams/_teams::getteamflagicon( "allies" ) ); - precacheshader( maps/mp/teams/_teams::getteamflagicon( "axis" ) ); - precachestring( &"MP_FLAG_TAKEN_BY" ); - precachestring( &"MP_ENEMY_FLAG_TAKEN" ); - precachestring( &"MP_FRIENDLY_FLAG_TAKEN" ); - precachestring( &"MP_FLAG_CAPTURED_BY" ); - precachestring( &"MP_ENEMY_FLAG_CAPTURED_BY" ); - precachestring( &"MP_FLAG_RETURNED_BY" ); - precachestring( &"MP_FLAG_RETURNED" ); - precachestring( &"MP_ENEMY_FLAG_RETURNED" ); - precachestring( &"MP_FRIENDLY_FLAG_RETURNED" ); - precachestring( &"MP_YOUR_FLAG_RETURNING_IN" ); - precachestring( &"MP_ENEMY_FLAG_RETURNING_IN" ); - precachestring( &"MP_FRIENDLY_FLAG_DROPPED_BY" ); - precachestring( &"MP_FRIENDLY_FLAG_DROPPED" ); - precachestring( &"MP_ENEMY_FLAG_DROPPED" ); - precachestring( &"MP_NEUTRAL_FLAG_DROPPED" ); - precachestring( &"MP_NEUTRAL_FLAG_TAKEN" ); - precachestring( &"MP_NEUTRAL_FLAG_CAPTURED" ); - precachestring( &"MP_SUDDEN_DEATH" ); - precachestring( &"MP_CAP_LIMIT_REACHED" ); - precachestring( &"MP_CTF_CANT_CAPTURE_FLAG" ); - precachestring( &"MP_CTF_OVERTIME_WIN" ); - precachestring( &"MP_ONE_FLAG_CTF_OVERTIME_ROUND_1" ); - precachestring( &"MP_ONE_FLAG_CTF_OVERTIME_ROUND_2_WINNER" ); - precachestring( &"MP_ONE_FLAG_CTF_OVERTIME_ROUND_2_LOSER" ); - precachestring( &"MP_ONE_FLAG_CTF_OVERTIME_ROUND_2_TIE" ); - precachestring( &"MPUI_CTF_OVERTIME_FASTEST_CAP_TIME" ); - precachestring( &"MP_ONE_FLAG_CTF_OVERTIME_DEFEAT_TIMELIMIT" ); - precachestring( &"MP_ONE_FLAG_CTF_OVERTIME_DEFEAT_DID_NOT_DEFEND" ); - precachestring( &"MENU_NEUTRAL" ); - precachestring( &"MENU_FLAG_RESPAWNING" ); - precachestring( &"allies_base" ); - precachestring( &"axis_base" ); - precachestring( &"allies_flag" ); - precachestring( &"axis_flag" ); - precachestring( &"neutral_flag" ); - precachestring( game[ "strings" ][ "flag_respawning_in" ] ); - game[ "strings" ][ "score_limit_reached" ] = &"MP_CAP_LIMIT_REACHED"; + game["flag_dropped_sound"] = "mp_war_objective_lost"; + game["flag_recovered_sound"] = "mp_war_objective_taken"; + game["strings"]["flag_respawning_in"] = &"MP_FLAG_RESPAWNING_IN"; + precachemodel( maps\mp\teams\_teams::getteamflagmodel( "allies" ) ); + precachemodel( maps\mp\teams\_teams::getteamflagmodel( "axis" ) ); + precachemodel( maps\mp\teams\_teams::getteamflagmodel( "neutral" ) ); + precachemodel( maps\mp\teams\_teams::getteamflagcarrymodel( "allies" ) ); + precachemodel( maps\mp\teams\_teams::getteamflagcarrymodel( "axis" ) ); + precacheshader( maps\mp\teams\_teams::getteamflagicon( "allies" ) ); + precacheshader( maps\mp\teams\_teams::getteamflagicon( "axis" ) ); + precachestring( &"MP_FLAG_TAKEN_BY" ); + precachestring( &"MP_ENEMY_FLAG_TAKEN" ); + precachestring( &"MP_FRIENDLY_FLAG_TAKEN" ); + precachestring( &"MP_FLAG_CAPTURED_BY" ); + precachestring( &"MP_ENEMY_FLAG_CAPTURED_BY" ); + precachestring( &"MP_FLAG_RETURNED_BY" ); + precachestring( &"MP_FLAG_RETURNED" ); + precachestring( &"MP_ENEMY_FLAG_RETURNED" ); + precachestring( &"MP_FRIENDLY_FLAG_RETURNED" ); + precachestring( &"MP_YOUR_FLAG_RETURNING_IN" ); + precachestring( &"MP_ENEMY_FLAG_RETURNING_IN" ); + precachestring( &"MP_FRIENDLY_FLAG_DROPPED_BY" ); + precachestring( &"MP_FRIENDLY_FLAG_DROPPED" ); + precachestring( &"MP_ENEMY_FLAG_DROPPED" ); + precachestring( &"MP_NEUTRAL_FLAG_DROPPED" ); + precachestring( &"MP_NEUTRAL_FLAG_TAKEN" ); + precachestring( &"MP_NEUTRAL_FLAG_CAPTURED" ); + precachestring( &"MP_SUDDEN_DEATH" ); + precachestring( &"MP_CAP_LIMIT_REACHED" ); + precachestring( &"MP_CTF_CANT_CAPTURE_FLAG" ); + precachestring( &"MP_CTF_OVERTIME_WIN" ); + precachestring( &"MP_ONE_FLAG_CTF_OVERTIME_ROUND_1" ); + precachestring( &"MP_ONE_FLAG_CTF_OVERTIME_ROUND_2_WINNER" ); + precachestring( &"MP_ONE_FLAG_CTF_OVERTIME_ROUND_2_LOSER" ); + precachestring( &"MP_ONE_FLAG_CTF_OVERTIME_ROUND_2_TIE" ); + precachestring( &"MPUI_CTF_OVERTIME_FASTEST_CAP_TIME" ); + precachestring( &"MP_ONE_FLAG_CTF_OVERTIME_DEFEAT_TIMELIMIT" ); + precachestring( &"MP_ONE_FLAG_CTF_OVERTIME_DEFEAT_DID_NOT_DEFEND" ); + precachestring( &"MENU_NEUTRAL" ); + precachestring( &"MENU_FLAG_RESPAWNING" ); + precachestring( &"allies_base" ); + precachestring( &"axis_base" ); + precachestring( &"allies_flag" ); + precachestring( &"axis_flag" ); + precachestring( &"neutral_flag" ); + precachestring( game["strings"]["flag_respawning_in"] ); + game["strings"]["score_limit_reached"] = &"MP_CAP_LIMIT_REACHED"; } -onstartgametype() //checked changed to match cerberus output +onstartgametype() { - if ( !isDefined( game[ "switchedsides" ] ) ) - { - game[ "switchedsides" ] = 0; - } - /* + if ( !isdefined( game["switchedsides"] ) ) + game["switchedsides"] = 0; + /# - setdebugsideswitch( game[ "switchedsides" ] ); -#/ - */ - setclientnamemode( "auto_change" ); - maps/mp/gametypes/_globallogic_score::resetteamscores(); - setobjectivetext( "allies", &"OBJECTIVES_ONEFLAG" ); - setobjectivetext( "axis", &"OBJECTIVES_ONEFLAG" ); - if ( level.splitscreen ) - { - setobjectivescoretext( "allies", &"OBJECTIVES_ONEFLAG" ); - setobjectivescoretext( "axis", &"OBJECTIVES_ONEFLAG" ); - } - else - { - setobjectivescoretext( "allies", &"OBJECTIVES_ONEFLAG_SCORE" ); - setobjectivescoretext( "axis", &"OBJECTIVES_ONEFLAG_SCORE" ); - } - setobjectivehinttext( "allies", &"OBJECTIVES_ONE_FLAG_HINT" ); - setobjectivehinttext( "axis", &"OBJECTIVES_ONE_FLAG_HINT" ); - if ( isDefined( game[ "overtime_round" ] ) ) - { - [[ level._setteamscore ]]( "allies", 0 ); - [[ level._setteamscore ]]( "axis", 0 ); - registerscorelimit( 1, 1 ); - if ( isDefined( game[ "ctf_overtime_time_to_beat" ] ) ) - { - registertimelimit( game[ "ctf_overtime_time_to_beat" ] / 60000, game[ "ctf_overtime_time_to_beat" ] / 60000 ); - } - if ( game[ "overtime_round" ] == 1 ) - { - setobjectivehinttext( "allies", &"MP_CTF_OVERTIME_ROUND_1" ); - setobjectivehinttext( "axis", &"MP_CTF_OVERTIME_ROUND_1" ); - } - else if ( isDefined( game[ "ctf_overtime_first_winner" ] ) ) - { - setobjectivehinttext( game[ "ctf_overtime_first_winner" ], &"MP_ONE_FLAG_CTF_OVERTIME_ROUND_2_WINNER" ); - setobjectivehinttext( getotherteam( game[ "ctf_overtime_first_winner" ] ), &"MP_ONE_FLAG_CTF_OVERTIME_ROUND_2_LOSER" ); - } - else - { - setobjectivehinttext( "allies", &"MP_ONE_FLAG_CTF_OVERTIME_ROUND_2_TIE" ); - setobjectivehinttext( "axis", &"MP_ONE_FLAG_CTF_OVERTIME_ROUND_2_TIE" ); - } - } - allowed = []; - allowed[ 0 ] = "ctf"; - allowed[ 1 ] = "dom"; - maps/mp/gametypes/_gameobjects::main( allowed ); - entities = getentarray(); - for ( entity_index = entities.size - 1; entity_index >= 0; entity_index-- ) - { - entity = entities[ entity_index ]; - if ( isDefined( entity.script_gameobjectname ) && entity.script_gameobjectname != "[all_modes]" ) - { - gameobjectnames = strtok( entity.script_gameobjectname, " " ); - for ( i = 0; i < gameobjectnames.size; i++ ) - { - if ( gameobjectnames[ i ] == "ctf" && gameobjectnames.size > 1 ) - { - entity delete(); - entity_index--; - break; - } - } - } - } - maps/mp/gametypes/_spawning::create_map_placed_influencers(); - level.spawnmins = ( 0, 0, 0 ); - level.spawnmaxs = ( 0, 0, 0 ); - maps/mp/gametypes/_spawnlogic::placespawnpoints( "mp_ctf_spawn_allies_start" ); - maps/mp/gametypes/_spawnlogic::placespawnpoints( "mp_ctf_spawn_axis_start" ); - maps/mp/gametypes/_spawnlogic::addspawnpoints( "allies", "mp_ctf_spawn_allies" ); - maps/mp/gametypes/_spawnlogic::addspawnpoints( "axis", "mp_ctf_spawn_axis" ); - 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.spawn_axis = maps/mp/gametypes/_spawnlogic::getspawnpointarray( "mp_ctf_spawn_axis" ); - level.spawn_allies = maps/mp/gametypes/_spawnlogic::getspawnpointarray( "mp_ctf_spawn_allies" ); - level.spawn_start = []; - foreach ( team in level.teams ) - { - level.spawn_start[ team ] = maps/mp/gametypes/_spawnlogic::getspawnpointarray( "mp_ctf_spawn_" + team + "_start" ); - } - level.oneflagtimer = createservertimer( "objective", 1.4 ); - level.oneflagtimer.x = 11; - level.oneflagtimer.y = 120; - level.oneflagtimer.horzalign = "user_left"; - level.oneflagtimer.vertalign = "user_top"; - level.oneflagtimer.alignx = "left"; - level.oneflagtimer.aligny = "top"; - level.oneflagtimer.label = game[ "strings" ][ "flag_respawning_in" ]; - level.oneflagtimer.font = "small"; - level.oneflagtimer.alpha = 0; - level.oneflagtimer.archived = 0; - level.oneflagtimer.hidewheninmenu = 1; - level.oneflagtimer.hidewheninkillcam = 1; - level.oneflagtimer.showplayerteamhudelemtospectator = 1; - thread hidetimerdisplayongameend( level.oneflagtimer ); - thread updategametypedvars(); - thread ctf(); -} - -hidetimerdisplayongameend( timerdisplay ) //checked matches cerberus output -{ - level waittill( "game_ended" ); - timerdisplay.alpha = 0; -} - -shouldplayovertimeround() //checked matches cerberus output -{ - if ( isDefined( game[ "overtime_round" ] ) ) - { - if ( game[ "overtime_round" ] == 1 || !level.gameended ) - { - return 1; - } - return 0; - } - if ( level.roundscorecarry ) - { - if ( game[ "teamScores" ][ "allies" ] == game[ "teamScores" ][ "axis" ] || hitroundlimit() && game[ "teamScores" ][ "allies" ] == ( level.scorelimit - 1 ) ) - { - return 1; - } - } - else - { - alliesroundswon = getroundswon( "allies" ); - axisroundswon = getroundswon( "axis" ); - if ( level.roundwinlimit > 0 && axisroundswon == ( level.roundwinlimit - 1 ) && alliesroundswon == ( level.roundwinlimit - 1 ) ) - { - return 1; - } - if ( hitroundlimit() && alliesroundswon == axisroundswon ) - { - return 1; - } - } - return 0; -} - -minutesandsecondsstring( milliseconds ) //checked matches cerberus output -{ - minutes = floor( milliseconds / 60000 ); - milliseconds -= minutes * 60000; - seconds = floor( milliseconds / 1000 ); - if ( seconds < 10 ) - { - return ( minutes + ":0" ) + seconds; - } - else - { - return ( minutes + ":" ) + seconds; - } -} - -setmatchscorehudelemforteam( team ) //checked changed to match cerberus output -{ - if ( !isDefined( game[ "overtime_round" ] ) ) - { - self maps/mp/gametypes/_hud_message::setmatchscorehudelemforteam( team ); - } - else if ( isDefined( game[ "ctf_overtime_second_winner" ] ) && game[ "ctf_overtime_second_winner" ] == team ) - { - self settext( minutesandsecondsstring( game[ "ctf_overtime_best_time" ] ) ); - } - else if ( isDefined( game[ "ctf_overtime_first_winner" ] ) && game[ "ctf_overtime_first_winner" ] == team ) - { - self settext( minutesandsecondsstring( game[ "ctf_overtime_time_to_beat" ] ) ); - return; - } - else - { - self settext( &"" ); - } -} - -onroundswitch() //checked matches cerberus output -{ - if ( !isDefined( game[ "switchedsides" ] ) ) - { - game[ "switchedsides" ] = 0; - } - level.halftimetype = "halftime"; - game[ "switchedsides" ] = !game[ "switchedsides" ]; -} - -onendgame( winningteam ) //checked matches cerberus output -{ - if ( isDefined( game[ "overtime_round" ] ) ) - { - if ( game[ "overtime_round" ] == 1 ) - { - if ( isDefined( winningteam ) && winningteam != "tie" ) - { - game[ "ctf_overtime_first_winner" ] = winningteam; - game[ "ctf_overtime_time_to_beat" ] = maps/mp/gametypes/_globallogic_utils::gettimepassed(); - } - return; - } - else - { - game[ "ctf_overtime_second_winner" ] = winningteam; - game[ "ctf_overtime_best_time" ] = maps/mp/gametypes/_globallogic_utils::gettimepassed(); - } - } -} - -onroundendgame( winningteam ) //checked changed to match cerberus output -{ - if ( isDefined( game[ "overtime_round" ] ) ) - { - if ( isDefined( game[ "ctf_overtime_first_winner" ] ) ) - { - if ( !isDefined( winningteam ) || winningteam == "tie" ) - { - winningteam = game[ "ctf_overtime_first_winner" ]; - } - if ( game[ "ctf_overtime_first_winner" ] == winningteam ) - { - level.endvictoryreasontext = &"MPUI_CTF_OVERTIME_FASTEST_CAP_TIME"; - level.enddefeatreasontext = &"MP_ONE_FLAG_CTF_OVERTIME_DEFEAT_TIMELIMIT"; - } - else - { - level.endvictoryreasontext = &"MPUI_CTF_OVERTIME_FASTEST_CAP_TIME"; - level.enddefeatreasontext = &"MP_ONE_FLAG_CTF_OVERTIME_DEFEAT_DID_NOT_DEFEND"; - } - } - else if ( !isDefined( winningteam ) || winningteam == "tie" ) - { - return "tie"; - } - return winningteam; - } - if ( level.roundscorecarry == 0 ) - { - foreach ( team in level.teams ) - { - [[ level._setteamscore ]]( team, game[ "roundswon" ][ team ] ); - } - winner = maps/mp/gametypes/_globallogic::determineteamwinnerbygamestat( "roundswon" ); - } - else - { - winner = maps/mp/gametypes/_globallogic::determineteamwinnerbyteamscore(); - } - return winner; -} - -onspawnplayerunified() //checked matches cerberus output -{ - self.isflagcarrier = 0; - self.flagcarried = undefined; - self clearclientflag( 0 ); - maps/mp/gametypes/_spawning::onspawnplayer_unified(); -} - -onspawnplayer( predictedspawn ) //checked matches cerberus output -{ - self.isflagcarrier = 0; - self.flagcarried = undefined; - self clearclientflag( 0 ); - spawnteam = self.pers[ "team" ]; - if ( game[ "switchedsides" ] ) - { - spawnteam = getotherteam( spawnteam ); - } - if ( level.usestartspawns ) - { - spawnpoint = maps/mp/gametypes/_spawnlogic::getspawnpoint_random( level.spawn_start[ spawnteam ] ); - } - else if ( spawnteam == "axis" ) - { - spawnpoint = maps/mp/gametypes/_spawnlogic::getspawnpoint_nearteam( level.spawn_axis ); - } - else - { - spawnpoint = maps/mp/gametypes/_spawnlogic::getspawnpoint_nearteam( level.spawn_allies ); - } - /* -/# - assert( isDefined( spawnpoint ) ); + setdebugsideswitch( game["switchedsides"] ); #/ - */ - if ( predictedspawn ) - { - self predictspawnpoint( spawnpoint.origin, spawnpoint.angles ); - } - else - { - self spawn( spawnpoint.origin, spawnpoint.angles, "ctf" ); - } + setclientnamemode( "auto_change" ); + maps\mp\gametypes\_globallogic_score::resetteamscores(); + setobjectivetext( "allies", &"OBJECTIVES_ONEFLAG" ); + setobjectivetext( "axis", &"OBJECTIVES_ONEFLAG" ); + + if ( level.splitscreen ) + { + setobjectivescoretext( "allies", &"OBJECTIVES_ONEFLAG" ); + setobjectivescoretext( "axis", &"OBJECTIVES_ONEFLAG" ); + } + else + { + setobjectivescoretext( "allies", &"OBJECTIVES_ONEFLAG_SCORE" ); + setobjectivescoretext( "axis", &"OBJECTIVES_ONEFLAG_SCORE" ); + } + + setobjectivehinttext( "allies", &"OBJECTIVES_ONE_FLAG_HINT" ); + setobjectivehinttext( "axis", &"OBJECTIVES_ONE_FLAG_HINT" ); + + if ( isdefined( game["overtime_round"] ) ) + { + [[ level._setteamscore ]]( "allies", 0 ); + [[ level._setteamscore ]]( "axis", 0 ); + registerscorelimit( 1, 1 ); + + if ( isdefined( game["ctf_overtime_time_to_beat"] ) ) + registertimelimit( game["ctf_overtime_time_to_beat"] / 60000, game["ctf_overtime_time_to_beat"] / 60000 ); + + if ( game["overtime_round"] == 1 ) + { + setobjectivehinttext( "allies", &"MP_CTF_OVERTIME_ROUND_1" ); + setobjectivehinttext( "axis", &"MP_CTF_OVERTIME_ROUND_1" ); + } + else if ( isdefined( game["ctf_overtime_first_winner"] ) ) + { + setobjectivehinttext( game["ctf_overtime_first_winner"], &"MP_ONE_FLAG_CTF_OVERTIME_ROUND_2_WINNER" ); + setobjectivehinttext( getotherteam( game["ctf_overtime_first_winner"] ), &"MP_ONE_FLAG_CTF_OVERTIME_ROUND_2_LOSER" ); + } + else + { + setobjectivehinttext( "allies", &"MP_ONE_FLAG_CTF_OVERTIME_ROUND_2_TIE" ); + setobjectivehinttext( "axis", &"MP_ONE_FLAG_CTF_OVERTIME_ROUND_2_TIE" ); + } + } + + allowed[0] = "ctf"; + allowed[1] = "dom"; + maps\mp\gametypes\_gameobjects::main( allowed ); + entities = getentarray(); + + for ( entity_index = entities.size - 1; entity_index >= 0; entity_index-- ) + { + entity = entities[entity_index]; + + if ( isdefined( entity.script_gameobjectname ) && entity.script_gameobjectname != "[all_modes]" ) + { + gameobjectnames = strtok( entity.script_gameobjectname, " " ); + + for ( i = 0; i < gameobjectnames.size; i++ ) + { + if ( gameobjectnames[i] == "ctf" && gameobjectnames.size > 1 ) + { + entity delete(); + break; + } + } + } + } + + maps\mp\gametypes\_spawning::create_map_placed_influencers(); + level.spawnmins = ( 0, 0, 0 ); + level.spawnmaxs = ( 0, 0, 0 ); + maps\mp\gametypes\_spawnlogic::placespawnpoints( "mp_ctf_spawn_allies_start" ); + maps\mp\gametypes\_spawnlogic::placespawnpoints( "mp_ctf_spawn_axis_start" ); + maps\mp\gametypes\_spawnlogic::addspawnpoints( "allies", "mp_ctf_spawn_allies" ); + maps\mp\gametypes\_spawnlogic::addspawnpoints( "axis", "mp_ctf_spawn_axis" ); + 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.spawn_axis = maps\mp\gametypes\_spawnlogic::getspawnpointarray( "mp_ctf_spawn_axis" ); + level.spawn_allies = maps\mp\gametypes\_spawnlogic::getspawnpointarray( "mp_ctf_spawn_allies" ); + level.spawn_start = []; + + foreach ( team in level.teams ) + level.spawn_start[team] = maps\mp\gametypes\_spawnlogic::getspawnpointarray( "mp_ctf_spawn_" + team + "_start" ); + + level.oneflagtimer = createservertimer( "objective", 1.4 ); + level.oneflagtimer.x = 11; + level.oneflagtimer.y = 120; + level.oneflagtimer.horzalign = "user_left"; + level.oneflagtimer.vertalign = "user_top"; + level.oneflagtimer.alignx = "left"; + level.oneflagtimer.aligny = "top"; + level.oneflagtimer.label = game["strings"]["flag_respawning_in"]; + level.oneflagtimer.font = "small"; + level.oneflagtimer.alpha = 0; + level.oneflagtimer.archived = 0; + level.oneflagtimer.hidewheninmenu = 1; + level.oneflagtimer.hidewheninkillcam = 1; + level.oneflagtimer.showplayerteamhudelemtospectator = 1; + thread hidetimerdisplayongameend( level.oneflagtimer ); + thread updategametypedvars(); + thread ctf(); } -updategametypedvars() //checked matches cerberus output +hidetimerdisplayongameend( timerdisplay ) { - level.flagcapturetime = getgametypesetting( "captureTime" ); - level.flagtouchreturntime = getgametypesetting( "defuseTime" ); - level.idleflagreturntime = getgametypesetting( "idleFlagResetTime" ); - level.flagrespawntime = getgametypesetting( "flagRespawnTime" ); - level.enemycarriervisible = getgametypesetting( "enemyCarrierVisible" ); - level.roundlimit = getgametypesetting( "roundLimit" ); - level.roundscorecarry = getgametypesetting( "roundscorecarry" ); - level.teamkillpenaltymultiplier = getgametypesetting( "teamKillPenalty" ); - level.teamkillscoremultiplier = getgametypesetting( "teamKillScore" ); - if ( level.flagtouchreturntime >= 0 && level.flagtouchreturntime != 63 ) - { - level.touchreturn = 1; - } - else - { - level.touchreturn = 0; - } + level waittill( "game_ended" ); + + timerdisplay.alpha = 0; } -createflag( trigger ) //checked matches cerberus output +shouldplayovertimeround() { - visuals = []; - if ( isDefined( trigger.target ) ) - { - visuals[ 0 ] = getent( trigger.target, "targetname" ); - } - else - { - visuals[ 0 ] = spawn( "script_model", trigger.origin ); - visuals[ 0 ].angles = trigger.angles; - } - entityteam = trigger.script_team; - if ( game[ "switchedsides" ] && isDefined( entityteam ) ) - { - entityteam = getotherteam( entityteam ); - } - if ( !isDefined( entityteam ) ) - { - entityteam = "neutral"; - trigger.radius = 25; - trigger.height = 100; - } - visuals[ 0 ] setmodel( maps/mp/teams/_teams::getteamflagmodel( entityteam ) ); - visuals[ 0 ] setteam( entityteam ); - flag = maps/mp/gametypes/_gameobjects::createcarryobject( entityteam, trigger, visuals, vectorScale( ( 0, 0, -1 ), 100 ), istring( entityteam + "_flag" ) ); - flag maps/mp/gametypes/_gameobjects::setteamusetime( "friendly", level.flagtouchreturntime ); - flag maps/mp/gametypes/_gameobjects::setteamusetime( "enemy", level.flagcapturetime ); - flag maps/mp/gametypes/_gameobjects::setteamusetime( "neutral", level.flagcapturetime ); - flag maps/mp/gametypes/_gameobjects::setvisibleteam( "any" ); - if ( entityteam != "neutral" ) - { - flag maps/mp/gametypes/_gameobjects::setvisiblecarriermodel( maps/mp/teams/_teams::getteamflagcarrymodel( entityteam ) ); - flag maps/mp/gametypes/_gameobjects::setcarryicon( maps/mp/teams/_teams::getteamflagicon( entityteam ) ); - flag.visuals[ 0 ] hide(); - } - else - { - flag maps/mp/gametypes/_gameobjects::setvisiblecarriermodel( maps/mp/teams/_teams::getteamflagcarrymodel( "allies" ) ); - flag maps/mp/gametypes/_gameobjects::setcarryicon( maps/mp/teams/_teams::getteamflagicon( "allies" ) ); - } - flag maps/mp/gametypes/_gameobjects::set2dicon( "friendly", level.icondefend2d ); - flag maps/mp/gametypes/_gameobjects::set3dicon( "friendly", level.icondefend3d ); - flag maps/mp/gametypes/_gameobjects::set2dicon( "enemy", level.iconcapture2d ); - flag maps/mp/gametypes/_gameobjects::set3dicon( "enemy", level.iconcapture3d ); - if ( level.enemycarriervisible == 2 ) - { - flag.objidpingfriendly = 1; - } - flag.allowweapons = 1; - flag.onpickup = ::onpickup; - flag.onpickupfailed = ::onpickup; - flag.ondrop = ::ondrop; - flag.onreset = ::onreset; - if ( level.idleflagreturntime > 0 ) - { - flag.autoresettime = level.idleflagreturntime; - } - else - { - flag.autoresettime = undefined; - } - if ( entityteam != "neutral" ) - { - flag thread watchforscore(); - } - return flag; + if ( isdefined( game["overtime_round"] ) ) + { + if ( game["overtime_round"] == 1 || !level.gameended ) + return true; + + return false; + } + + if ( level.roundscorecarry ) + { + if ( game["teamScores"]["allies"] == game["teamScores"]["axis"] && ( hitroundlimit() || game["teamScores"]["allies"] == level.scorelimit - 1 ) ) + return true; + } + else + { + alliesroundswon = getroundswon( "allies" ); + axisroundswon = getroundswon( "axis" ); + + if ( level.roundwinlimit > 0 && axisroundswon == level.roundwinlimit - 1 && alliesroundswon == level.roundwinlimit - 1 ) + return true; + + if ( hitroundlimit() && alliesroundswon == axisroundswon ) + return true; + } + + return false; } -createflagzone( trigger ) //checked changed to match cerberus output +minutesandsecondsstring( milliseconds ) { - visuals = []; - entityteam = trigger.script_team; - if ( game[ "switchedsides" ] ) - { - entityteam = getotherteam( entityteam ); - } - flagzone = maps/mp/gametypes/_gameobjects::createuseobject( entityteam, trigger, visuals, ( 0, 0, 0 ), istring( entityteam + "_base" ) ); - flagzone maps/mp/gametypes/_gameobjects::allowuse( "friendly" ); - flagzone maps/mp/gametypes/_gameobjects::setusetime( 0 ); - flagzone maps/mp/gametypes/_gameobjects::setusetext( &"MP_CAPTURING_FLAG" ); - flagzone maps/mp/gametypes/_gameobjects::setvisibleteam( "friendly" ); - enemyteam = getotherteam( entityteam ); - flagzone maps/mp/gametypes/_gameobjects::setkeyobject( level.teamflags[ enemyteam ] ); - flagzone.onuse = ::oncapture; - flag = level.teamflags[ entityteam ]; - flag.flagbase = flagzone; - flagzone.flag = flag; - tracestart = trigger.origin + vectorScale( ( 0, 0, 1 ), 32 ); - traceend = trigger.origin + vectorScale( ( 0, 0, -1 ), 32 ); - trace = bullettrace( tracestart, traceend, 0, undefined ); - upangles = vectorToAngle( trace[ "normal" ] ); - flagzone.baseeffectforward = anglesToForward( upangles ); - flagzone.baseeffectright = anglesToRight( upangles ); - flagzone.baseeffectpos = trace[ "position" ]; - flagzone thread resetflagbaseeffect(); - flagzone createflagspawninfluencer( entityteam ); - return flagzone; + minutes = floor( milliseconds / 60000 ); + milliseconds -= minutes * 60000; + seconds = floor( milliseconds / 1000 ); + + if ( seconds < 10 ) + return minutes + ":0" + seconds; + else + return minutes + ":" + seconds; } -createflaghint( team, origin ) //checked matches cerberus output +setmatchscorehudelemforteam( team ) { - radius = 128; - height = 64; - trigger = spawn( "trigger_radius", origin, 0, radius, height ); - trigger sethintstring( &"MP_CTF_CANT_CAPTURE_FLAG" ); - trigger setcursorhint( "HINT_NOICON" ); - trigger.original_origin = origin; - trigger turn_off(); - return trigger; + if ( !isdefined( game["overtime_round"] ) ) + self maps\mp\gametypes\_hud_message::setmatchscorehudelemforteam( team ); + else if ( isdefined( game["ctf_overtime_second_winner"] ) && game["ctf_overtime_second_winner"] == team ) + self settext( minutesandsecondsstring( game["ctf_overtime_best_time"] ) ); + else if ( isdefined( game["ctf_overtime_first_winner"] ) && game["ctf_overtime_first_winner"] == team ) + self settext( minutesandsecondsstring( game["ctf_overtime_time_to_beat"] ) ); + else + self settext( &"" ); } -ctf() //checked changed to match cerberus output +onroundswitch() { - level.flags = []; - level.teamflags = []; - level.flagzones = []; - level.teamflagzones = []; - level.iconcapture3d = "waypoint_grab_red"; - level.iconcapture2d = "waypoint_grab_red"; - level.icondefend3d = "waypoint_defend_flag"; - level.icondefend2d = "waypoint_defend_flag"; - level.icondropped3d = "waypoint_defend_flag"; - level.icondropped2d = "waypoint_defend_flag"; - level.iconreturn3d = "waypoint_return_flag"; - level.iconreturn2d = "waypoint_return_flag"; - level.iconbase3d = "waypoint_defend_flag"; - level.iconescort3d = "waypoint_escort"; - level.iconescort2d = "waypoint_escort"; - level.iconkill3d = "waypoint_kill"; - level.iconkill2d = "waypoint_kill"; - level.iconwaitforflag3d = "waypoint_waitfor_flag"; - precacheshader( level.iconcapture3d ); - precacheshader( level.iconcapture2d ); - precacheshader( level.icondefend3d ); - precacheshader( level.icondefend2d ); - precacheshader( level.icondropped3d ); - precacheshader( level.icondropped2d ); - precacheshader( level.iconbase3d ); - precacheshader( level.iconreturn3d ); - precacheshader( level.iconreturn2d ); - precacheshader( level.iconescort3d ); - precacheshader( level.iconescort2d ); - precacheshader( level.iconkill3d ); - precacheshader( level.iconkill2d ); - precacheshader( level.iconwaitforflag3d ); - level.flagbasefxid = []; - level.flagbasefxid[ "allies" ] = loadfx( "misc/fx_ui_oneflag_flagbase" ); - level.flagbasefxid[ "axis" ] = loadfx( "misc/fx_ui_oneflag_flagbase" ); - level.flag_zones = getentarray( "ctf_flag_zone_trig", "targetname" ); - flag_triggers = getentarray( "ctf_flag_pickup_trig", "targetname" ); - if ( !isDefined( flag_triggers ) || flag_triggers.size != 2 ) - { - /* + if ( !isdefined( game["switchedsides"] ) ) + game["switchedsides"] = 0; + + level.halftimetype = "halftime"; + game["switchedsides"] = !game["switchedsides"]; +} + +onendgame( winningteam ) +{ + if ( isdefined( game["overtime_round"] ) ) + { + if ( game["overtime_round"] == 1 ) + { + if ( isdefined( winningteam ) && winningteam != "tie" ) + { + game["ctf_overtime_first_winner"] = winningteam; + game["ctf_overtime_time_to_beat"] = maps\mp\gametypes\_globallogic_utils::gettimepassed(); + } + } + else + { + game["ctf_overtime_second_winner"] = winningteam; + game["ctf_overtime_best_time"] = maps\mp\gametypes\_globallogic_utils::gettimepassed(); + } + } +} + +onroundendgame( winningteam ) +{ + if ( isdefined( game["overtime_round"] ) ) + { + if ( isdefined( game["ctf_overtime_first_winner"] ) ) + { + if ( !isdefined( winningteam ) || winningteam == "tie" ) + winningteam = game["ctf_overtime_first_winner"]; + + if ( game["ctf_overtime_first_winner"] == winningteam ) + { + level.endvictoryreasontext = &"MPUI_CTF_OVERTIME_FASTEST_CAP_TIME"; + level.enddefeatreasontext = &"MP_ONE_FLAG_CTF_OVERTIME_DEFEAT_TIMELIMIT"; + } + else + { + level.endvictoryreasontext = &"MPUI_CTF_OVERTIME_FASTEST_CAP_TIME"; + level.enddefeatreasontext = &"MP_ONE_FLAG_CTF_OVERTIME_DEFEAT_DID_NOT_DEFEND"; + } + } + else if ( !isdefined( winningteam ) || winningteam == "tie" ) + return "tie"; + + return winningteam; + } + + if ( level.roundscorecarry == 0 ) + { + foreach ( team in level.teams ) + [[ level._setteamscore ]]( team, game["roundswon"][team] ); + + winner = maps\mp\gametypes\_globallogic::determineteamwinnerbygamestat( "roundswon" ); + } + else + winner = maps\mp\gametypes\_globallogic::determineteamwinnerbyteamscore(); + + return winner; +} + +onspawnplayerunified() +{ + self.isflagcarrier = 0; + self.flagcarried = undefined; + self clearclientflag( 0 ); + maps\mp\gametypes\_spawning::onspawnplayer_unified(); +} + +onspawnplayer( predictedspawn ) +{ + self.isflagcarrier = 0; + self.flagcarried = undefined; + self clearclientflag( 0 ); + spawnteam = self.pers["team"]; + + if ( game["switchedsides"] ) + spawnteam = getotherteam( spawnteam ); + + if ( level.usestartspawns ) + spawnpoint = maps\mp\gametypes\_spawnlogic::getspawnpoint_random( level.spawn_start[spawnteam] ); + else if ( spawnteam == "axis" ) + spawnpoint = maps\mp\gametypes\_spawnlogic::getspawnpoint_nearteam( level.spawn_axis ); + else + spawnpoint = maps\mp\gametypes\_spawnlogic::getspawnpoint_nearteam( level.spawn_allies ); + /# - maps/mp/_utility::error( "Not enough ctf_flag_pickup_trig triggers found in map. Need two." ); + assert( isdefined( spawnpoint ) ); #/ - */ - return; - } - for ( index = 0; index < flag_triggers.size; index++ ) - { - trigger = flag_triggers[ index ]; - flag = createflag( trigger ); - team = flag maps/mp/gametypes/_gameobjects::getownerteam(); - level.flags[ level.flags.size ] = flag; - level.teamflags[ team ] = flag; - } - primaryflags = getentarray( "flag_primary", "targetname" ); - secondaryflags = getentarray( "flag_secondary", "targetname" ); - domflags = []; - for ( index = 0; index < primaryflags.size; index++ ) - { - domflags[ domflags.size ] = primaryflags[ index ]; - } - for ( index = 0; index < secondaryflags.size; index++ ) - { - domflags[ domflags.size ] = secondaryflags[ index ]; - } - for ( index = 0; index < domflags.size; index++ ) - { - trigger = domflags[ index ]; - if ( trigger.script_label == "_b" ) - { - level.neutralflagorigin = trigger.origin; - neutraltrigger = spawn( "trigger_radius", level.neutralflagorigin, 0, 30, 100 ); - flag = createflag( neutraltrigger ); - level.neutralflag = flag; - flag maps/mp/gametypes/_gameobjects::allowcarry( "any" ); - } - } - flag_zones = getentarray( "ctf_flag_zone_trig", "targetname" ); - if ( !isDefined( flag_zones ) || flag_zones.size != 2 ) - { - /* + + if ( predictedspawn ) + self predictspawnpoint( spawnpoint.origin, spawnpoint.angles ); + else + self spawn( spawnpoint.origin, spawnpoint.angles, "ctf" ); +} + +updategametypedvars() +{ + level.flagcapturetime = getgametypesetting( "captureTime" ); + level.flagtouchreturntime = getgametypesetting( "defuseTime" ); + level.idleflagreturntime = getgametypesetting( "idleFlagResetTime" ); + level.flagrespawntime = getgametypesetting( "flagRespawnTime" ); + level.enemycarriervisible = getgametypesetting( "enemyCarrierVisible" ); + level.roundlimit = getgametypesetting( "roundLimit" ); + level.roundscorecarry = getgametypesetting( "roundscorecarry" ); + level.teamkillpenaltymultiplier = getgametypesetting( "teamKillPenalty" ); + level.teamkillscoremultiplier = getgametypesetting( "teamKillScore" ); + + if ( level.flagtouchreturntime >= 0 && level.flagtouchreturntime != 63 ) + level.touchreturn = 1; + else + level.touchreturn = 0; +} + +createflag( trigger ) +{ + if ( isdefined( trigger.target ) ) + visuals[0] = getent( trigger.target, "targetname" ); + else + { + visuals[0] = spawn( "script_model", trigger.origin ); + visuals[0].angles = trigger.angles; + } + + entityteam = trigger.script_team; + + if ( game["switchedsides"] && isdefined( entityteam ) ) + entityteam = getotherteam( entityteam ); + + if ( !isdefined( entityteam ) ) + { + entityteam = "neutral"; + trigger.radius = 25; + trigger.height = 100; + } + + visuals[0] setmodel( maps\mp\teams\_teams::getteamflagmodel( entityteam ) ); + visuals[0] setteam( entityteam ); + flag = maps\mp\gametypes\_gameobjects::createcarryobject( entityteam, trigger, visuals, vectorscale( ( 0, 0, 1 ), 100.0 ), istring( entityteam + "_flag" ) ); + flag maps\mp\gametypes\_gameobjects::setteamusetime( "friendly", level.flagtouchreturntime ); + flag maps\mp\gametypes\_gameobjects::setteamusetime( "enemy", level.flagcapturetime ); + flag maps\mp\gametypes\_gameobjects::setteamusetime( "neutral", level.flagcapturetime ); + flag maps\mp\gametypes\_gameobjects::setvisibleteam( "any" ); + + if ( entityteam != "neutral" ) + { + flag maps\mp\gametypes\_gameobjects::setvisiblecarriermodel( maps\mp\teams\_teams::getteamflagcarrymodel( entityteam ) ); + flag maps\mp\gametypes\_gameobjects::setcarryicon( maps\mp\teams\_teams::getteamflagicon( entityteam ) ); + flag.visuals[0] hide(); + } + else + { + flag maps\mp\gametypes\_gameobjects::setvisiblecarriermodel( maps\mp\teams\_teams::getteamflagcarrymodel( "allies" ) ); + flag maps\mp\gametypes\_gameobjects::setcarryicon( maps\mp\teams\_teams::getteamflagicon( "allies" ) ); + } + + flag maps\mp\gametypes\_gameobjects::set2dicon( "friendly", level.icondefend2d ); + flag maps\mp\gametypes\_gameobjects::set3dicon( "friendly", level.icondefend3d ); + flag maps\mp\gametypes\_gameobjects::set2dicon( "enemy", level.iconcapture2d ); + flag maps\mp\gametypes\_gameobjects::set3dicon( "enemy", level.iconcapture3d ); + + if ( level.enemycarriervisible == 2 ) + flag.objidpingfriendly = 1; + + flag.allowweapons = 1; + flag.onpickup = ::onpickup; + flag.onpickupfailed = ::onpickup; + flag.ondrop = ::ondrop; + flag.onreset = ::onreset; + + if ( level.idleflagreturntime > 0 ) + flag.autoresettime = level.idleflagreturntime; + else + flag.autoresettime = undefined; + + if ( entityteam != "neutral" ) + flag thread watchforscore(); + + return flag; +} + +createflagzone( trigger ) +{ + visuals = []; + entityteam = trigger.script_team; + + if ( game["switchedsides"] ) + entityteam = getotherteam( entityteam ); + + flagzone = maps\mp\gametypes\_gameobjects::createuseobject( entityteam, trigger, visuals, ( 0, 0, 0 ), istring( entityteam + "_base" ) ); + flagzone maps\mp\gametypes\_gameobjects::allowuse( "friendly" ); + flagzone maps\mp\gametypes\_gameobjects::setusetime( 0 ); + flagzone maps\mp\gametypes\_gameobjects::setusetext( &"MP_CAPTURING_FLAG" ); + flagzone maps\mp\gametypes\_gameobjects::setvisibleteam( "friendly" ); + enemyteam = getotherteam( entityteam ); + flagzone maps\mp\gametypes\_gameobjects::setkeyobject( level.teamflags[enemyteam] ); + flagzone.onuse = ::oncapture; + flag = level.teamflags[entityteam]; + flag.flagbase = flagzone; + flagzone.flag = flag; + tracestart = trigger.origin + vectorscale( ( 0, 0, 1 ), 32.0 ); + traceend = trigger.origin + vectorscale( ( 0, 0, -1 ), 32.0 ); + trace = bullettrace( tracestart, traceend, 0, undefined ); + upangles = vectortoangles( trace["normal"] ); + flagzone.baseeffectforward = anglestoforward( upangles ); + flagzone.baseeffectright = anglestoright( upangles ); + flagzone.baseeffectpos = trace["position"]; + flagzone thread resetflagbaseeffect(); + flagzone createflagspawninfluencer( entityteam ); + return flagzone; +} + +createflaghint( team, origin ) +{ + radius = 128; + height = 64; + trigger = spawn( "trigger_radius", origin, 0, radius, height ); + trigger sethintstring( &"MP_CTF_CANT_CAPTURE_FLAG" ); + trigger setcursorhint( "HINT_NOICON" ); + trigger.original_origin = origin; + trigger turn_off(); + return trigger; +} + +ctf() +{ + level.flags = []; + level.teamflags = []; + level.flagzones = []; + level.teamflagzones = []; + level.iconcapture3d = "waypoint_grab_red"; + level.iconcapture2d = "waypoint_grab_red"; + level.icondefend3d = "waypoint_defend_flag"; + level.icondefend2d = "waypoint_defend_flag"; + level.icondropped3d = "waypoint_defend_flag"; + level.icondropped2d = "waypoint_defend_flag"; + level.iconreturn3d = "waypoint_return_flag"; + level.iconreturn2d = "waypoint_return_flag"; + level.iconbase3d = "waypoint_defend_flag"; + level.iconescort3d = "waypoint_escort"; + level.iconescort2d = "waypoint_escort"; + level.iconkill3d = "waypoint_kill"; + level.iconkill2d = "waypoint_kill"; + level.iconwaitforflag3d = "waypoint_waitfor_flag"; + precacheshader( level.iconcapture3d ); + precacheshader( level.iconcapture2d ); + precacheshader( level.icondefend3d ); + precacheshader( level.icondefend2d ); + precacheshader( level.icondropped3d ); + precacheshader( level.icondropped2d ); + precacheshader( level.iconbase3d ); + precacheshader( level.iconreturn3d ); + precacheshader( level.iconreturn2d ); + precacheshader( level.iconescort3d ); + precacheshader( level.iconescort2d ); + precacheshader( level.iconkill3d ); + precacheshader( level.iconkill2d ); + precacheshader( level.iconwaitforflag3d ); + level.flagbasefxid = []; + level.flagbasefxid["allies"] = loadfx( "misc/fx_ui_oneflag_flagbase" ); + level.flagbasefxid["axis"] = loadfx( "misc/fx_ui_oneflag_flagbase" ); + level.flag_zones = getentarray( "ctf_flag_zone_trig", "targetname" ); + flag_triggers = getentarray( "ctf_flag_pickup_trig", "targetname" ); + + if ( !isdefined( flag_triggers ) || flag_triggers.size != 2 ) + { /# - maps/mp/_utility::error( "Not enough ctf_flag_zone_trig triggers found in map. Need two." ); + maps\mp\_utility::error( "Not enough ctf_flag_pickup_trig triggers found in map. Need two." ); #/ - */ - return; - } - for ( index = 0; index < flag_zones.size; index++ ) - { - trigger = flag_zones[ index ]; - flagzone = createflagzone( trigger ); - team = flagzone maps/mp/gametypes/_gameobjects::getownerteam(); - level.flagzones[ level.flagzones.size ] = flagzone; - level.teamflagzones[ team ] = flagzone; - level.flaghints[ team ] = createflaghint( team, trigger.origin ); - facing_angle = getDvarInt( "scr_ctf_spawnPointFacingAngle" ); - setspawnpointsbaseweight( getotherteamsmask( team ), trigger.origin, facing_angle, level.spawnsystem.objective_facing_bonus ); - } - createreturnmessageelems(); -} + return; + } -ctf_icon_hide() //checked matches cerberus output -{ - level waittill( "game_ended" ); - level.teamflags[ "allies" ] maps/mp/gametypes/_gameobjects::setvisibleteam( "none" ); - level.teamflags[ "axis" ] maps/mp/gametypes/_gameobjects::setvisibleteam( "none" ); -} + for ( index = 0; index < flag_triggers.size; index++ ) + { + trigger = flag_triggers[index]; + flag = createflag( trigger ); + team = flag maps\mp\gametypes\_gameobjects::getownerteam(); + level.flags[level.flags.size] = flag; + level.teamflags[team] = flag; + } -removeinfluencers() //checked matches cerberus output -{ - if ( isDefined( self.spawn_influencer_enemy_carrier ) ) - { - removeinfluencer( self.spawn_influencer_enemy_carrier ); - self.spawn_influencer_enemy_carrier = undefined; - } - if ( isDefined( self.spawn_influencer_friendly_carrier ) ) - { - removeinfluencer( self.spawn_influencer_friendly_carrier ); - self.spawn_influencer_friendly_carrier = undefined; - } - if ( isDefined( self.spawn_influencer_dropped ) ) - { - removeinfluencer( self.spawn_influencer_dropped ); - self.spawn_influencer_dropped = undefined; - } -} + primaryflags = getentarray( "flag_primary", "targetname" ); + secondaryflags = getentarray( "flag_secondary", "targetname" ); + domflags = []; -ondrop( player ) //checked changed to match cerberus output -{ - if ( isDefined( player ) ) - { - player clearclientflag( 0 ); - } - foreach ( goal in level.flagzones ) - { - goal maps/mp/gametypes/_gameobjects::setflags( 0 ); - } - otherteam = self maps/mp/gametypes/_gameobjects::getownerteam(); - team = getotherteam( otherteam ); - self.ownerteam = "neutral"; - bbprint( "mpobjective", "gametime %d objtype %s team %s", getTime(), "ctf_flagdropped", team ); - self.visuals[ 0 ] setclientflag( 6 ); - self.visuals[ 0 ] setmodel( maps/mp/teams/_teams::getteamflagmodel( "neutral" ) ); - if ( level.touchreturn ) - { - self maps/mp/gametypes/_gameobjects::allowcarry( "any" ); - level.flaghints[ otherteam ] turn_off(); - } - if ( isDefined( player ) ) - { - printandsoundoneveryone( team, undefined, &"", undefined, "mp_war_objective_lost" ); - level thread maps/mp/_popups::displayteammessagetoteam( &"MP_NEUTRAL_FLAG_DROPPED", player, team ); - level thread maps/mp/_popups::displayteammessagetoteam( &"MP_NEUTRAL_FLAG_DROPPED", player, otherteam ); - } - else - { - printandsoundoneveryone( team, undefined, &"", undefined, "mp_war_objective_lost" ); - } - maps/mp/gametypes/_globallogic_audio::leaderdialog( "wedrop_flag", otherteam, "ctf_flag" ); - maps/mp/gametypes/_globallogic_audio::leaderdialog( "theydrop_flag", team, "ctf_flag_enemy" ); - if ( isDefined( player ) ) - { - player logstring( team + " flag dropped" ); - } - else - { - logstring( team + " flag dropped" ); - } - if ( isDefined( player ) ) - { - player playlocalsound( "mpl_flag_drop_plr" ); - } - maps/mp/gametypes/_globallogic_audio::play_2d_on_team( "mpl_flagdrop_sting_friend", otherteam ); - maps/mp/gametypes/_globallogic_audio::play_2d_on_team( "mpl_flagdrop_sting_enemy", team ); - if ( level.touchreturn ) - { - self maps/mp/gametypes/_gameobjects::set3dicon( "friendly", level.iconreturn3d ); - self maps/mp/gametypes/_gameobjects::set2dicon( "friendly", level.iconreturn2d ); - } - else - { - self maps/mp/gametypes/_gameobjects::set3dicon( "friendly", level.icondropped3d ); - self maps/mp/gametypes/_gameobjects::set2dicon( "friendly", level.icondropped2d ); - } - self maps/mp/gametypes/_gameobjects::setvisibleteam( "any" ); - self maps/mp/gametypes/_gameobjects::set3dicon( "enemy", level.iconcapture3d ); - self maps/mp/gametypes/_gameobjects::set2dicon( "enemy", level.iconcapture2d ); - thread maps/mp/_utility::playsoundonplayers( game[ "flag_dropped_sound" ], game[ "attackers" ] ); - self thread returnflagaftertimemsg( level.idleflagreturntime ); - if ( isDefined( player ) ) - { - self removeinfluencers(); - } - else - { - self.spawn_influencer_friendly_carrier = undefined; - self.spawn_influencer_enemy_carrier = undefined; - } - ss = level.spawnsystem; - player_team_mask = getteammask( otherteam ); - enemy_team_mask = getteammask( team ); - if ( isDefined( player ) ) - { - flag_origin = player.origin; - } - else - { - flag_origin = self.curorigin; - } - self.spawn_influencer_dropped = addsphereinfluencer( level.spawnsystem.einfluencer_type_game_mode, flag_origin, ss.ctf_dropped_influencer_radius, ss.ctf_dropped_influencer_score, player_team_mask | enemy_team_mask, "ctf_flag_dropped,r,s", maps/mp/gametypes/_spawning::get_score_curve_index( ss.ctf_dropped_influencer_score_curve ), level.idleflagreturntime, self.trigger ); -} + for ( index = 0; index < primaryflags.size; index++ ) + domflags[domflags.size] = primaryflags[index]; -onpickup( player ) //checked changed to match cerberus output -{ - carrierkilledby = self.carrierkilledby; - self.carrierkilledby = undefined; - if ( isDefined( self.spawn_influencer_dropped ) ) - { - removeinfluencer( self.spawn_influencer_dropped ); - self.spawn_influencer_dropped = undefined; - } - player addplayerstatwithgametype( "PICKUPS", 1 ); - self.ownerteam = player.team; - foreach ( goal in level.flagzones ) - { - if ( goal.ownerteam != player.team ) - { - goal maps/mp/gametypes/_gameobjects::setflags( 1 ); - } - } - if ( level.touchreturn ) - { - self maps/mp/gametypes/_gameobjects::allowcarry( "enemy" ); - } - self removeinfluencers(); - team = self maps/mp/gametypes/_gameobjects::getownerteam(); - otherteam = getotherteam( team ); - player maps/mp/gametypes/_weapons::detach_all_weapons(); - self maps/mp/gametypes/_gameobjects::setvisiblecarriermodel( maps/mp/teams/_teams::getteamflagcarrymodel( player.pers[ "team" ] ) ); - self maps/mp/gametypes/_gameobjects::setcarryicon( maps/mp/teams/_teams::getteamflagicon( player.pers[ "team" ] ) ); - player maps/mp/gametypes/_weapons::forcestowedweaponupdate(); - bbprint( "mpobjective", "gametime %d objtype %s team %s", getTime(), "ctf_flagpickup", team ); - player recordgameevent( "pickup" ); - maps/mp/_scoreevents::processscoreevent( "flag_grab", player ); - maps/mp/_demo::bookmark( "event", getTime(), player ); - printandsoundoneveryone( otherteam, undefined, &"", undefined, "mp_obj_taken", "mp_enemy_obj_taken" ); - level thread maps/mp/_popups::displayteammessagetoteam( &"MP_NEUTRAL_FLAG_TAKEN", player, otherteam ); - level thread maps/mp/_popups::displayteammessagetoteam( &"MP_NEUTRAL_FLAG_TAKEN", player, team ); - maps/mp/gametypes/_globallogic_audio::leaderdialog( "wetake_flag", team, "ctf_flag" ); - maps/mp/gametypes/_globallogic_audio::leaderdialog( "theytake_flag", otherteam, "ctf_flag_enemy" ); - player.isflagcarrier = 1; - player.flagcarried = self; - player playlocalsound( "mpl_flag_pickup_plr" ); - player setclientflag( 0 ); - maps/mp/gametypes/_globallogic_audio::play_2d_on_team( "mpl_flagget_sting_friend", otherteam ); - maps/mp/gametypes/_globallogic_audio::play_2d_on_team( "mpl_flagget_sting_enemy", team ); - if ( level.enemycarriervisible ) - { - self maps/mp/gametypes/_gameobjects::setvisibleteam( "any" ); - } - else - { - self maps/mp/gametypes/_gameobjects::setvisibleteam( "enemy" ); - } - self maps/mp/gametypes/_gameobjects::set2dicon( "friendly", level.iconkill2d ); - self maps/mp/gametypes/_gameobjects::set3dicon( "friendly", level.iconkill3d ); - self maps/mp/gametypes/_gameobjects::set2dicon( "enemy", level.iconescort2d ); - self maps/mp/gametypes/_gameobjects::set3dicon( "enemy", level.iconescort3d ); - player thread claim_trigger( level.flaghints[ otherteam ] ); - update_hints(); - player logstring( team + " flag taken" ); - ss = level.spawnsystem; - player_team_mask = getteammask( otherteam ); - enemy_team_mask = getteammask( team ); - self.spawn_influencer_enemy_carrier = addsphereinfluencer( level.spawnsystem.einfluencer_type_game_mode, player.origin, ss.ctf_enemy_carrier_influencer_radius, ss.ctf_enemy_carrier_influencer_score, enemy_team_mask, "ctf_flag_enemy_carrier,r,s", maps/mp/gametypes/_spawning::get_score_curve_index( ss.ctf_enemy_carrier_influencer_score_curve ), 0, player ); - self.spawn_influencer_friendly_carrier = addsphereinfluencer( level.spawnsystem.einfluencer_type_game_mode, player.origin, ss.ctf_friendly_carrier_influencer_radius, ss.ctf_friendly_carrier_influencer_score, player_team_mask, "ctf_flag_friendly_carrier,r,s", maps/mp/gametypes/_spawning::get_score_curve_index( ss.ctf_friendly_carrier_influencer_score_curve ), 0, player ); -} + for ( index = 0; index < secondaryflags.size; index++ ) + domflags[domflags.size] = secondaryflags[index]; -watchforscore() //checked changed to match cerberus output -{ - level endon( "game_ended" ); - self endon( "death" ); - self endon( "disconnect" ); - while ( 1 ) - { - self.trigger waittill( "trigger", player ); - if ( self.ownerteam != player.team && isDefined( player.carryobject ) ) - { - flag = player.carryobject; - flag oncapture( player ); - flag.ownerteam = "neutral"; - flag maps/mp/gametypes/_gameobjects::allowcarry( "none" ); - flag maps/mp/gametypes/_gameobjects::setvisibleteam( "none" ); - flag maps/mp/gametypes/_gameobjects::returnhome(); - flag.visuals[ 0 ] hide(); - foreach ( baseflag in level.flags ) - { - baseflag.visuals[ 0 ] hide(); - } - foreach ( goal in level.flagzones ) - { - goal maps/mp/gametypes/_gameobjects::setflags( 0 ); - } - level.oneflagtimer.label = game[ "strings" ][ "flag_respawning_in" ]; - level.oneflagtimer settimer( level.flagrespawntime ); - wait 1; - level.oneflagtimer.alpha = 1; - wait ( level.flagrespawntime - 1 ); - level.oneflagtimer.alpha = 0; - flag maps/mp/gametypes/_gameobjects::allowcarry( "any" ); - flag maps/mp/gametypes/_gameobjects::setvisibleteam( "any" ); - flag.visuals[ 0 ] show(); - } - } -} + for ( index = 0; index < domflags.size; index++ ) + { + trigger = domflags[index]; -onpickupmusicstate( player ) //checked changed at own discretion -{ - self endon( "disconnect" ); - self endon( "death" ); - wait 6; - if ( player.isflagcarrier ) - { - //added from bo1 ctf.gsc - player thread maps\mp\gametypes\_globallogic_audio::set_music_on_player( "SUSPENSE", false, false); - } -} + if ( trigger.script_label == "_b" ) + { + level.neutralflagorigin = trigger.origin; + neutraltrigger = spawn( "trigger_radius", level.neutralflagorigin, 0, 30, 100 ); + flag = createflag( neutraltrigger ); + level.neutralflag = flag; + flag maps\mp\gametypes\_gameobjects::allowcarry( "any" ); + } + } -ishome() //checked matches cerberus output -{ - if ( isDefined( self.carrier ) ) - { - return 0; - } - if ( self.curorigin != self.trigger.baseorigin ) - { - return 0; - } - return 1; -} + flag_zones = getentarray( "ctf_flag_zone_trig", "targetname" ); -returnflag() //checked matches cerberus output -{ - team = self maps/mp/gametypes/_gameobjects::getownerteam(); - otherteam = getotherteam( team ); - maps/mp/gametypes/_globallogic_audio::play_2d_on_team( "mpl_flagreturn_sting", team ); - maps/mp/gametypes/_globallogic_audio::play_2d_on_team( "mpl_flagreturn_sting", otherteam ); - level.teamflagzones[ otherteam ] maps/mp/gametypes/_gameobjects::allowuse( "friendly" ); - level.teamflagzones[ otherteam ] maps/mp/gametypes/_gameobjects::setvisibleteam( "friendly" ); - update_hints(); - if ( level.touchreturn ) - { - self maps/mp/gametypes/_gameobjects::allowcarry( "enemy" ); - } - self maps/mp/gametypes/_gameobjects::returnhome(); - self maps/mp/gametypes/_gameobjects::setvisibleteam( "any" ); - self maps/mp/gametypes/_gameobjects::set3dicon( "friendly", level.icondefend3d ); - self maps/mp/gametypes/_gameobjects::set2dicon( "friendly", level.icondefend2d ); - self maps/mp/gametypes/_gameobjects::set3dicon( "enemy", level.iconcapture3d ); - self maps/mp/gametypes/_gameobjects::set2dicon( "enemy", level.iconcapture2d ); - maps/mp/gametypes/_globallogic_audio::leaderdialog( "wereturn_flag", team, "ctf_flag_enemy" ); - maps/mp/gametypes/_globallogic_audio::leaderdialog( "theyreturn_flag", otherteam, "ctf_flag" ); -} - -oncapture( player ) //checked matches cerberus output -{ - team = player.pers[ "team" ]; - enemyteam = getotherteam( team ); - time = getTime(); - playerteamsflag = level.teamflags[ team ]; - if ( playerteamsflag maps/mp/gametypes/_gameobjects::isobjectawayfromhome() ) - { - return; - } - printandsoundoneveryone( team, undefined, &"", undefined, "mp_obj_captured", "mp_enemy_obj_captured" ); - bbprint( "mpobjective", "gametime %d objtype %s team %s", time, "ctf_flagcapture", enemyteam ); - game[ "challenge" ][ team ][ "capturedFlag" ] = 1; - player maps/mp/_challenges::capturedobjective( time ); - if ( isDefined( player.pers[ "captures" ] ) ) - { - player.pers[ "captures" ]++; - player.captures = player.pers[ "captures" ]; - } - maps/mp/_demo::bookmark( "event", getTime(), player ); - player addplayerstatwithgametype( "CAPTURES", 1 ); - level thread maps/mp/_popups::displayteammessagetoteam( &"MP_NEUTRAL_FLAG_CAPTURED", player, team ); - level thread maps/mp/_popups::displayteammessagetoteam( &"MP_NEUTRAL_FLAG_CAPTURED", player, enemyteam ); - maps/mp/gametypes/_globallogic_audio::play_2d_on_team( "mpl_flagcapture_sting_enemy", enemyteam ); - maps/mp/gametypes/_globallogic_audio::play_2d_on_team( "mpl_flagcapture_sting_friend", team ); - player giveflagcapturexp( player ); - player logstring( enemyteam + " flag captured" ); - flag = player.carryobject; - flag.dontannouncereturn = 1; - flag maps/mp/gametypes/_gameobjects::returnhome(); - flag.dontannouncereturn = undefined; - otherteam = getotherteam( team ); - level.teamflags[ otherteam ] maps/mp/gametypes/_gameobjects::returnhome(); - level.teamflags[ team ] maps/mp/gametypes/_gameobjects::returnhome(); - player.isflagcarrier = 0; - player.flagcarried = undefined; - player clearclientflag( 0 ); - maps/mp/gametypes/_globallogic_score::giveteamscoreforobjective( team, 1 ); - maps/mp/gametypes/_globallogic_audio::leaderdialog( "wecap_flag", team, "ctf_flag" ); - maps/mp/gametypes/_globallogic_audio::leaderdialog( "theycap_flag", enemyteam, "ctf_flag_enemy" ); - flag removeinfluencers(); -} - -giveflagcapturexp( player ) //checked matches cerberus output -{ - maps/mp/_scoreevents::processscoreevent( "flag_capture", player ); - player recordgameevent( "capture" ); -} - -onreset() //checked matches cerberus output -{ - update_hints(); - team = self maps/mp/gametypes/_gameobjects::getownerteam(); - self maps/mp/gametypes/_gameobjects::set3dicon( "friendly", level.icondefend3d ); - self maps/mp/gametypes/_gameobjects::set2dicon( "friendly", level.icondefend2d ); - self maps/mp/gametypes/_gameobjects::set3dicon( "enemy", level.iconcapture3d ); - self maps/mp/gametypes/_gameobjects::set2dicon( "enemy", level.iconcapture2d ); - self.visuals[ 0 ] clearclientflag( 6 ); -} - -getotherflag( flag ) //checked matches cerberus output -{ - if ( flag == level.flags[ 0 ] ) - { - return level.flags[ 1 ]; - } - return level.flags[ 0 ]; -} - -onplayerkilled( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ) //checked changed to match cerberus output -{ - if ( isDefined( attacker ) && isplayer( attacker ) ) - { - flagteam = "invalidTeam"; - inflagzone = 0; - defendedflag = 0; - offendedflag = 0; - flagcarrier = level.neutralflag.carrier; - if ( isDefined( flagcarrier ) ) - { - flagorigin = level.neutralflag.carrier.origin; - iscarried = 1; - if ( isplayer( attacker ) && attacker.pers[ "team" ] != self.pers[ "team" ] ) - { - if ( isDefined( level.neutralflag.carrier.attackerdata ) ) - { - if ( level.neutralflag.carrier != attacker ) - { - if ( isDefined( level.neutralflag.carrier.attackerdata[ self.clientid ] ) ) - { - maps/mp/_scoreevents::processscoreevent( "rescue_flag_carrier", attacker, undefined, sweapon ); - } - } - } - } - } - else - { - flagorigin = level.neutralflag.curorigin; - iscarried = 0; - } - dist = distance2d( self.origin, flagorigin ); - if ( dist < level.defaultoffenseradius ) - { - inflagzone = 1; - if ( level.neutralflag.ownerteam == attacker.pers[ "team" ] ) - { - offendedflag = 1; - } - else - { - defendedflag = 1; - } - } - dist = distance2d( attacker.origin, flagorigin ); - if ( dist < level.defaultoffenseradius ) - { - inflagzone = 1; - if ( level.neutralflag.ownerteam == attacker.pers[ "team" ] ) - { - offendedflag = 1; - } - else - { - defendedflag = 1; - } - } - if ( inflagzone && isplayer( attacker ) && attacker.pers[ "team" ] != self.pers[ "team" ] ) - { - if ( defendedflag ) - { - attacker.pers[ "defends" ]++; - attacker.defends = attacker.pers[ "defends" ]; - attacker addplayerstatwithgametype( "DEFENDS", 1 ); - if ( is_true( self.isflagcarrier ) ) - { - maps/mp/_scoreevents::processscoreevent( "kill_flag_carrier", attacker, undefined, sweapon ); - } - else - { - maps/mp/_scoreevents::processscoreevent( "killed_attacker", attacker, undefined, sweapon ); - } - self recordkillmodifier( "assaulting" ); - } - if ( offendedflag ) - { - attacker addplayerstatwithgametype( "OFFENDS", 1 ); - if ( iscarried == 1 ) - { - if ( isDefined( flagcarrier ) && attacker == flagcarrier ) - { - maps/mp/_scoreevents::processscoreevent( "killed_enemy_while_carrying_flag", attacker, undefined, sweapon ); - } - else - { - maps/mp/_scoreevents::processscoreevent( "defend_flag_carrier", attacker, undefined, sweapon ); - } - } - else - { - maps/mp/_scoreevents::processscoreevent( "killed_defender", attacker, undefined, sweapon ); - } - self recordkillmodifier( "defending" ); - } - } - } - if ( !isDefined( self.isflagcarrier ) || !self.isflagcarrier ) - { - return; - } - if ( isDefined( attacker ) && isplayer( attacker ) && attacker.pers[ "team" ] != self.pers[ "team" ] ) - { - if ( isDefined( self.flagcarried ) ) - { - for ( index = 0; index < level.flags.size; index++ ) - { - currentflag = level.flags[ index ]; - if ( currentflag.ownerteam == self.team ) - { - if ( currentflag.curorigin == currentflag.trigger.baseorigin ) - { - dist = distance2d( self.origin, currentflag.curorigin ); - if ( dist < level.defaultoffenseradius ) - { - self.flagcarried.carrierkilledby = attacker; - break; - } - } - } - } - } - attacker recordgameevent( "kill_carrier" ); - self recordkillmodifier( "carrying" ); - } -} - -createreturnmessageelems() //checked matches cerberus output -{ - level.returnmessageelems = []; - level.returnmessageelems[ "allies" ][ "axis" ] = createservertimer( "objective", 1.4, "allies" ); - level.returnmessageelems[ "allies" ][ "axis" ] setpoint( "TOPRIGHT", "TOPRIGHT", 0, 0 ); - level.returnmessageelems[ "allies" ][ "axis" ].label = &"MP_ENEMY_FLAG_RETURNING_IN"; - level.returnmessageelems[ "allies" ][ "axis" ].alpha = 0; - level.returnmessageelems[ "allies" ][ "axis" ].archived = 0; - level.returnmessageelems[ "allies" ][ "allies" ] = createservertimer( "objective", 1.4, "allies" ); - level.returnmessageelems[ "allies" ][ "allies" ] setpoint( "TOPRIGHT", "TOPRIGHT", 0, 20 ); - level.returnmessageelems[ "allies" ][ "allies" ].label = &"MP_YOUR_FLAG_RETURNING_IN"; - level.returnmessageelems[ "allies" ][ "allies" ].alpha = 0; - level.returnmessageelems[ "allies" ][ "allies" ].archived = 0; - level.returnmessageelems[ "axis" ][ "allies" ] = createservertimer( "objective", 1.4, "axis" ); - level.returnmessageelems[ "axis" ][ "allies" ] setpoint( "TOPRIGHT", "TOPRIGHT", 0, 0 ); - level.returnmessageelems[ "axis" ][ "allies" ].label = &"MP_ENEMY_FLAG_RETURNING_IN"; - level.returnmessageelems[ "axis" ][ "allies" ].alpha = 0; - level.returnmessageelems[ "axis" ][ "allies" ].archived = 0; - level.returnmessageelems[ "axis" ][ "axis" ] = createservertimer( "objective", 1.4, "axis" ); - level.returnmessageelems[ "axis" ][ "axis" ] setpoint( "TOPRIGHT", "TOPRIGHT", 0, 20 ); - level.returnmessageelems[ "axis" ][ "axis" ].label = &"MP_YOUR_FLAG_RETURNING_IN"; - level.returnmessageelems[ "axis" ][ "axis" ].alpha = 0; - level.returnmessageelems[ "axis" ][ "axis" ].archived = 0; -} - -returnflagaftertimemsg( time ) //checked matches cerberus output -{ - if ( level.touchreturn || level.idleflagreturntime == 0 ) - { - return; - } - self notify( "returnFlagAfterTimeMsg" ); - self endon( "returnFlagAfterTimeMsg" ); - result = returnflaghudelems( time ); - self removeinfluencers(); - self clearreturnflaghudelems(); - if ( !isDefined( result ) ) - { - return; - } -} - -returnflaghudelems( time ) //checked matches cerberus output -{ - self endon( "picked_up" ); - level endon( "game_ended" ); - ownerteam = self maps/mp/gametypes/_gameobjects::getownerteam(); - /* + if ( !isdefined( flag_zones ) || flag_zones.size != 2 ) + { /# - assert( !level.returnmessageelems[ "axis" ][ ownerteam ].alpha ); + maps\mp\_utility::error( "Not enough ctf_flag_zone_trig triggers found in map. Need two." ); #/ - */ - level.returnmessageelems[ "axis" ][ ownerteam ].alpha = 1; - level.returnmessageelems[ "axis" ][ ownerteam ] settimer( time ); - /* + return; + } + + for ( index = 0; index < flag_zones.size; index++ ) + { + trigger = flag_zones[index]; + flagzone = createflagzone( trigger ); + team = flagzone maps\mp\gametypes\_gameobjects::getownerteam(); + level.flagzones[level.flagzones.size] = flagzone; + level.teamflagzones[team] = flagzone; + level.flaghints[team] = createflaghint( team, trigger.origin ); + facing_angle = getdvarint( "scr_ctf_spawnPointFacingAngle" ); + setspawnpointsbaseweight( getotherteamsmask( team ), trigger.origin, facing_angle, level.spawnsystem.objective_facing_bonus ); + } + + createreturnmessageelems(); +} + +ctf_icon_hide() +{ + level waittill( "game_ended" ); + + level.teamflags["allies"] maps\mp\gametypes\_gameobjects::setvisibleteam( "none" ); + level.teamflags["axis"] maps\mp\gametypes\_gameobjects::setvisibleteam( "none" ); +} + +removeinfluencers() +{ + if ( isdefined( self.spawn_influencer_enemy_carrier ) ) + { + removeinfluencer( self.spawn_influencer_enemy_carrier ); + self.spawn_influencer_enemy_carrier = undefined; + } + + if ( isdefined( self.spawn_influencer_friendly_carrier ) ) + { + removeinfluencer( self.spawn_influencer_friendly_carrier ); + self.spawn_influencer_friendly_carrier = undefined; + } + + if ( isdefined( self.spawn_influencer_dropped ) ) + { + removeinfluencer( self.spawn_influencer_dropped ); + self.spawn_influencer_dropped = undefined; + } +} + +ondrop( player ) +{ + if ( isdefined( player ) ) + player clearclientflag( 0 ); + + foreach ( goal in level.flagzones ) + goal maps\mp\gametypes\_gameobjects::setflags( 0 ); + + otherteam = self maps\mp\gametypes\_gameobjects::getownerteam(); + team = getotherteam( otherteam ); + self.ownerteam = "neutral"; + bbprint( "mpobjective", "gametime %d objtype %s team %s", gettime(), "ctf_flagdropped", team ); + self.visuals[0] setclientflag( 6 ); + self.visuals[0] setmodel( maps\mp\teams\_teams::getteamflagmodel( "neutral" ) ); + + if ( level.touchreturn ) + { + self maps\mp\gametypes\_gameobjects::allowcarry( "any" ); + level.flaghints[otherteam] turn_off(); + } + + if ( isdefined( player ) ) + { + printandsoundoneveryone( team, undefined, &"", undefined, "mp_war_objective_lost" ); + level thread maps\mp\_popups::displayteammessagetoteam( &"MP_NEUTRAL_FLAG_DROPPED", player, team ); + level thread maps\mp\_popups::displayteammessagetoteam( &"MP_NEUTRAL_FLAG_DROPPED", player, otherteam ); + } + else + printandsoundoneveryone( team, undefined, &"", undefined, "mp_war_objective_lost" ); + + maps\mp\gametypes\_globallogic_audio::leaderdialog( "wedrop_flag", otherteam, "ctf_flag" ); + maps\mp\gametypes\_globallogic_audio::leaderdialog( "theydrop_flag", team, "ctf_flag_enemy" ); + + if ( isdefined( player ) ) + player logstring( team + " flag dropped" ); + else + logstring( team + " flag dropped" ); + + if ( isdefined( player ) ) + player playlocalsound( "mpl_flag_drop_plr" ); + + maps\mp\gametypes\_globallogic_audio::play_2d_on_team( "mpl_flagdrop_sting_friend", otherteam ); + maps\mp\gametypes\_globallogic_audio::play_2d_on_team( "mpl_flagdrop_sting_enemy", team ); + + if ( level.touchreturn ) + { + self maps\mp\gametypes\_gameobjects::set3dicon( "friendly", level.iconreturn3d ); + self maps\mp\gametypes\_gameobjects::set2dicon( "friendly", level.iconreturn2d ); + } + else + { + self maps\mp\gametypes\_gameobjects::set3dicon( "friendly", level.icondropped3d ); + self maps\mp\gametypes\_gameobjects::set2dicon( "friendly", level.icondropped2d ); + } + + self maps\mp\gametypes\_gameobjects::setvisibleteam( "any" ); + self maps\mp\gametypes\_gameobjects::set3dicon( "enemy", level.iconcapture3d ); + self maps\mp\gametypes\_gameobjects::set2dicon( "enemy", level.iconcapture2d ); + thread maps\mp\_utility::playsoundonplayers( game["flag_dropped_sound"], game["attackers"] ); + self thread returnflagaftertimemsg( level.idleflagreturntime ); + + if ( isdefined( player ) ) + self removeinfluencers(); + else + { + self.spawn_influencer_friendly_carrier = undefined; + self.spawn_influencer_enemy_carrier = undefined; + } + + ss = level.spawnsystem; + player_team_mask = getteammask( otherteam ); + enemy_team_mask = getteammask( team ); + + if ( isdefined( player ) ) + flag_origin = player.origin; + else + flag_origin = self.curorigin; + + self.spawn_influencer_dropped = addsphereinfluencer( level.spawnsystem.einfluencer_type_game_mode, flag_origin, ss.ctf_dropped_influencer_radius, ss.ctf_dropped_influencer_score, player_team_mask | enemy_team_mask, "ctf_flag_dropped,r,s", maps\mp\gametypes\_spawning::get_score_curve_index( ss.ctf_dropped_influencer_score_curve ), level.idleflagreturntime, self.trigger ); +} + +onpickup( player ) +{ + carrierkilledby = self.carrierkilledby; + self.carrierkilledby = undefined; + + if ( isdefined( self.spawn_influencer_dropped ) ) + { + removeinfluencer( self.spawn_influencer_dropped ); + self.spawn_influencer_dropped = undefined; + } + + player addplayerstatwithgametype( "PICKUPS", 1 ); + self.ownerteam = player.team; + + foreach ( goal in level.flagzones ) + { + if ( goal.ownerteam != player.team ) + goal maps\mp\gametypes\_gameobjects::setflags( 1 ); + } + + if ( level.touchreturn ) + self maps\mp\gametypes\_gameobjects::allowcarry( "enemy" ); + + self removeinfluencers(); + team = self maps\mp\gametypes\_gameobjects::getownerteam(); + otherteam = getotherteam( team ); + player maps\mp\gametypes\_weapons::detach_all_weapons(); + self maps\mp\gametypes\_gameobjects::setvisiblecarriermodel( maps\mp\teams\_teams::getteamflagcarrymodel( player.pers["team"] ) ); + self maps\mp\gametypes\_gameobjects::setcarryicon( maps\mp\teams\_teams::getteamflagicon( player.pers["team"] ) ); + player maps\mp\gametypes\_weapons::forcestowedweaponupdate(); + bbprint( "mpobjective", "gametime %d objtype %s team %s", gettime(), "ctf_flagpickup", team ); + player recordgameevent( "pickup" ); + maps\mp\_scoreevents::processscoreevent( "flag_grab", player ); + maps\mp\_demo::bookmark( "event", gettime(), player ); + printandsoundoneveryone( otherteam, undefined, &"", undefined, "mp_obj_taken", "mp_enemy_obj_taken" ); + level thread maps\mp\_popups::displayteammessagetoteam( &"MP_NEUTRAL_FLAG_TAKEN", player, otherteam ); + level thread maps\mp\_popups::displayteammessagetoteam( &"MP_NEUTRAL_FLAG_TAKEN", player, team ); + maps\mp\gametypes\_globallogic_audio::leaderdialog( "wetake_flag", team, "ctf_flag" ); + maps\mp\gametypes\_globallogic_audio::leaderdialog( "theytake_flag", otherteam, "ctf_flag_enemy" ); + player.isflagcarrier = 1; + player.flagcarried = self; + player playlocalsound( "mpl_flag_pickup_plr" ); + player setclientflag( 0 ); + maps\mp\gametypes\_globallogic_audio::play_2d_on_team( "mpl_flagget_sting_friend", otherteam ); + maps\mp\gametypes\_globallogic_audio::play_2d_on_team( "mpl_flagget_sting_enemy", team ); + + if ( level.enemycarriervisible ) + self maps\mp\gametypes\_gameobjects::setvisibleteam( "any" ); + else + self maps\mp\gametypes\_gameobjects::setvisibleteam( "enemy" ); + + self maps\mp\gametypes\_gameobjects::set2dicon( "friendly", level.iconkill2d ); + self maps\mp\gametypes\_gameobjects::set3dicon( "friendly", level.iconkill3d ); + self maps\mp\gametypes\_gameobjects::set2dicon( "enemy", level.iconescort2d ); + self maps\mp\gametypes\_gameobjects::set3dicon( "enemy", level.iconescort3d ); + player thread claim_trigger( level.flaghints[otherteam] ); + update_hints(); + player logstring( team + " flag taken" ); + ss = level.spawnsystem; + player_team_mask = getteammask( otherteam ); + enemy_team_mask = getteammask( team ); + self.spawn_influencer_enemy_carrier = addsphereinfluencer( level.spawnsystem.einfluencer_type_game_mode, player.origin, ss.ctf_enemy_carrier_influencer_radius, ss.ctf_enemy_carrier_influencer_score, enemy_team_mask, "ctf_flag_enemy_carrier,r,s", maps\mp\gametypes\_spawning::get_score_curve_index( ss.ctf_enemy_carrier_influencer_score_curve ), 0, player ); + self.spawn_influencer_friendly_carrier = addsphereinfluencer( level.spawnsystem.einfluencer_type_game_mode, player.origin, ss.ctf_friendly_carrier_influencer_radius, ss.ctf_friendly_carrier_influencer_score, player_team_mask, "ctf_flag_friendly_carrier,r,s", maps\mp\gametypes\_spawning::get_score_curve_index( ss.ctf_friendly_carrier_influencer_score_curve ), 0, player ); +} + +watchforscore() +{ + level endon( "game_ended" ); + self endon( "death" ); + self endon( "disconnect" ); + + while ( true ) + { + self.trigger waittill( "trigger", player ); + + if ( self.ownerteam != player.team && isdefined( player.carryobject ) ) + { + flag = player.carryobject; + flag oncapture( player ); + flag.ownerteam = "neutral"; + flag maps\mp\gametypes\_gameobjects::allowcarry( "none" ); + flag maps\mp\gametypes\_gameobjects::setvisibleteam( "none" ); + flag maps\mp\gametypes\_gameobjects::returnhome(); + flag.visuals[0] hide(); + + foreach ( baseflag in level.flags ) + baseflag.visuals[0] hide(); + + foreach ( goal in level.flagzones ) + goal maps\mp\gametypes\_gameobjects::setflags( 0 ); + + level.oneflagtimer.label = game["strings"]["flag_respawning_in"]; + level.oneflagtimer settimer( level.flagrespawntime ); + wait 1; + level.oneflagtimer.alpha = 1; + wait( level.flagrespawntime - 1 ); + level.oneflagtimer.alpha = 0; + flag maps\mp\gametypes\_gameobjects::allowcarry( "any" ); + flag maps\mp\gametypes\_gameobjects::setvisibleteam( "any" ); + flag.visuals[0] show(); + } + } +} + +onpickupmusicstate( player ) +{ + self endon( "disconnect" ); + self endon( "death" ); + wait 6; + + if ( player.isflagcarrier ) + { + + } +} + +ishome() +{ + if ( isdefined( self.carrier ) ) + return false; + + if ( self.curorigin != self.trigger.baseorigin ) + return false; + + return true; +} + +returnflag() +{ + team = self maps\mp\gametypes\_gameobjects::getownerteam(); + otherteam = getotherteam( team ); + maps\mp\gametypes\_globallogic_audio::play_2d_on_team( "mpl_flagreturn_sting", team ); + maps\mp\gametypes\_globallogic_audio::play_2d_on_team( "mpl_flagreturn_sting", otherteam ); + level.teamflagzones[otherteam] maps\mp\gametypes\_gameobjects::allowuse( "friendly" ); + level.teamflagzones[otherteam] maps\mp\gametypes\_gameobjects::setvisibleteam( "friendly" ); + update_hints(); + + if ( level.touchreturn ) + self maps\mp\gametypes\_gameobjects::allowcarry( "enemy" ); + + self maps\mp\gametypes\_gameobjects::returnhome(); + self maps\mp\gametypes\_gameobjects::setvisibleteam( "any" ); + self maps\mp\gametypes\_gameobjects::set3dicon( "friendly", level.icondefend3d ); + self maps\mp\gametypes\_gameobjects::set2dicon( "friendly", level.icondefend2d ); + self maps\mp\gametypes\_gameobjects::set3dicon( "enemy", level.iconcapture3d ); + self maps\mp\gametypes\_gameobjects::set2dicon( "enemy", level.iconcapture2d ); + maps\mp\gametypes\_globallogic_audio::leaderdialog( "wereturn_flag", team, "ctf_flag_enemy" ); + maps\mp\gametypes\_globallogic_audio::leaderdialog( "theyreturn_flag", otherteam, "ctf_flag" ); +} + +oncapture( player ) +{ + team = player.pers["team"]; + enemyteam = getotherteam( team ); + time = gettime(); + playerteamsflag = level.teamflags[team]; + + if ( playerteamsflag maps\mp\gametypes\_gameobjects::isobjectawayfromhome() ) + return; + + printandsoundoneveryone( team, undefined, &"", undefined, "mp_obj_captured", "mp_enemy_obj_captured" ); + bbprint( "mpobjective", "gametime %d objtype %s team %s", time, "ctf_flagcapture", enemyteam ); + game["challenge"][team]["capturedFlag"] = 1; + player maps\mp\_challenges::capturedobjective( time ); + + if ( isdefined( player.pers["captures"] ) ) + { + player.pers["captures"]++; + player.captures = player.pers["captures"]; + } + + maps\mp\_demo::bookmark( "event", gettime(), player ); + player addplayerstatwithgametype( "CAPTURES", 1 ); + level thread maps\mp\_popups::displayteammessagetoteam( &"MP_NEUTRAL_FLAG_CAPTURED", player, team ); + level thread maps\mp\_popups::displayteammessagetoteam( &"MP_NEUTRAL_FLAG_CAPTURED", player, enemyteam ); + maps\mp\gametypes\_globallogic_audio::play_2d_on_team( "mpl_flagcapture_sting_enemy", enemyteam ); + maps\mp\gametypes\_globallogic_audio::play_2d_on_team( "mpl_flagcapture_sting_friend", team ); + player giveflagcapturexp( player ); + player logstring( enemyteam + " flag captured" ); + flag = player.carryobject; + flag.dontannouncereturn = 1; + flag maps\mp\gametypes\_gameobjects::returnhome(); + flag.dontannouncereturn = undefined; + otherteam = getotherteam( team ); + level.teamflags[otherteam] maps\mp\gametypes\_gameobjects::returnhome(); + level.teamflags[team] maps\mp\gametypes\_gameobjects::returnhome(); + player.isflagcarrier = 0; + player.flagcarried = undefined; + player clearclientflag( 0 ); + maps\mp\gametypes\_globallogic_score::giveteamscoreforobjective( team, 1 ); + maps\mp\gametypes\_globallogic_audio::leaderdialog( "wecap_flag", team, "ctf_flag" ); + maps\mp\gametypes\_globallogic_audio::leaderdialog( "theycap_flag", enemyteam, "ctf_flag_enemy" ); + flag removeinfluencers(); +} + +giveflagcapturexp( player ) +{ + maps\mp\_scoreevents::processscoreevent( "flag_capture", player ); + player recordgameevent( "capture" ); +} + +onreset() +{ + update_hints(); + team = self maps\mp\gametypes\_gameobjects::getownerteam(); + self maps\mp\gametypes\_gameobjects::set3dicon( "friendly", level.icondefend3d ); + self maps\mp\gametypes\_gameobjects::set2dicon( "friendly", level.icondefend2d ); + self maps\mp\gametypes\_gameobjects::set3dicon( "enemy", level.iconcapture3d ); + self maps\mp\gametypes\_gameobjects::set2dicon( "enemy", level.iconcapture2d ); + self.visuals[0] clearclientflag( 6 ); +} + +getotherflag( flag ) +{ + if ( flag == level.flags[0] ) + return level.flags[1]; + + return level.flags[0]; +} + +onplayerkilled( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ) +{ + if ( isdefined( attacker ) && isplayer( attacker ) ) + { + flagteam = "invalidTeam"; + inflagzone = 0; + defendedflag = 0; + offendedflag = 0; + flagcarrier = level.neutralflag.carrier; + + if ( isdefined( flagcarrier ) ) + { + flagorigin = level.neutralflag.carrier.origin; + iscarried = 1; + + if ( isplayer( attacker ) && attacker.pers["team"] != self.pers["team"] ) + { + if ( isdefined( level.neutralflag.carrier.attackerdata ) ) + { + if ( level.neutralflag.carrier != attacker ) + { + if ( isdefined( level.neutralflag.carrier.attackerdata[self.clientid] ) ) + maps\mp\_scoreevents::processscoreevent( "rescue_flag_carrier", attacker, undefined, sweapon ); + } + } + } + } + else + { + flagorigin = level.neutralflag.curorigin; + iscarried = 0; + } + + dist = distance2d( self.origin, flagorigin ); + + if ( dist < level.defaultoffenseradius ) + { + inflagzone = 1; + + if ( level.neutralflag.ownerteam == attacker.pers["team"] ) + offendedflag = 1; + else + defendedflag = 1; + } + + dist = distance2d( attacker.origin, flagorigin ); + + if ( dist < level.defaultoffenseradius ) + { + inflagzone = 1; + + if ( level.neutralflag.ownerteam == attacker.pers["team"] ) + offendedflag = 1; + else + defendedflag = 1; + } + + if ( inflagzone && isplayer( attacker ) && attacker.pers["team"] != self.pers["team"] ) + { + if ( defendedflag ) + { + attacker.pers["defends"]++; + attacker.defends = attacker.pers["defends"]; + attacker addplayerstatwithgametype( "DEFENDS", 1 ); + + if ( isdefined( self.isflagcarrier ) && self.isflagcarrier ) + maps\mp\_scoreevents::processscoreevent( "kill_flag_carrier", attacker, undefined, sweapon ); + else + maps\mp\_scoreevents::processscoreevent( "killed_attacker", attacker, undefined, sweapon ); + + self recordkillmodifier( "assaulting" ); + } + + if ( offendedflag ) + { + attacker addplayerstatwithgametype( "OFFENDS", 1 ); + + if ( iscarried == 1 ) + { + if ( isdefined( flagcarrier ) && attacker == flagcarrier ) + maps\mp\_scoreevents::processscoreevent( "killed_enemy_while_carrying_flag", attacker, undefined, sweapon ); + else + maps\mp\_scoreevents::processscoreevent( "defend_flag_carrier", attacker, undefined, sweapon ); + } + else + maps\mp\_scoreevents::processscoreevent( "killed_defender", attacker, undefined, sweapon ); + + self recordkillmodifier( "defending" ); + } + } + } + + if ( !isdefined( self.isflagcarrier ) || !self.isflagcarrier ) + return; + + if ( isdefined( attacker ) && isplayer( attacker ) && attacker.pers["team"] != self.pers["team"] ) + { + if ( isdefined( self.flagcarried ) ) + { + for ( index = 0; index < level.flags.size; index++ ) + { + currentflag = level.flags[index]; + + if ( currentflag.ownerteam == self.team ) + { + if ( currentflag.curorigin == currentflag.trigger.baseorigin ) + { + dist = distance2d( self.origin, currentflag.curorigin ); + + if ( dist < level.defaultoffenseradius ) + { + self.flagcarried.carrierkilledby = attacker; + break; + } + } + } + } + } + + attacker recordgameevent( "kill_carrier" ); + self recordkillmodifier( "carrying" ); + } +} + +createreturnmessageelems() +{ + level.returnmessageelems = []; + level.returnmessageelems["allies"]["axis"] = createservertimer( "objective", 1.4, "allies" ); + level.returnmessageelems["allies"]["axis"] setpoint( "TOPRIGHT", "TOPRIGHT", 0, 0 ); + level.returnmessageelems["allies"]["axis"].label = &"MP_ENEMY_FLAG_RETURNING_IN"; + level.returnmessageelems["allies"]["axis"].alpha = 0; + level.returnmessageelems["allies"]["axis"].archived = 0; + level.returnmessageelems["allies"]["allies"] = createservertimer( "objective", 1.4, "allies" ); + level.returnmessageelems["allies"]["allies"] setpoint( "TOPRIGHT", "TOPRIGHT", 0, 20 ); + level.returnmessageelems["allies"]["allies"].label = &"MP_YOUR_FLAG_RETURNING_IN"; + level.returnmessageelems["allies"]["allies"].alpha = 0; + level.returnmessageelems["allies"]["allies"].archived = 0; + level.returnmessageelems["axis"]["allies"] = createservertimer( "objective", 1.4, "axis" ); + level.returnmessageelems["axis"]["allies"] setpoint( "TOPRIGHT", "TOPRIGHT", 0, 0 ); + level.returnmessageelems["axis"]["allies"].label = &"MP_ENEMY_FLAG_RETURNING_IN"; + level.returnmessageelems["axis"]["allies"].alpha = 0; + level.returnmessageelems["axis"]["allies"].archived = 0; + level.returnmessageelems["axis"]["axis"] = createservertimer( "objective", 1.4, "axis" ); + level.returnmessageelems["axis"]["axis"] setpoint( "TOPRIGHT", "TOPRIGHT", 0, 20 ); + level.returnmessageelems["axis"]["axis"].label = &"MP_YOUR_FLAG_RETURNING_IN"; + level.returnmessageelems["axis"]["axis"].alpha = 0; + level.returnmessageelems["axis"]["axis"].archived = 0; +} + +returnflagaftertimemsg( time ) +{ + if ( level.touchreturn || level.idleflagreturntime == 0 ) + return; + + self notify( "returnFlagAfterTimeMsg" ); + self endon( "returnFlagAfterTimeMsg" ); + result = returnflaghudelems( time ); + self removeinfluencers(); + self clearreturnflaghudelems(); + + if ( !isdefined( result ) ) + return; +} + +returnflaghudelems( time ) +{ + self endon( "picked_up" ); + level endon( "game_ended" ); + ownerteam = self maps\mp\gametypes\_gameobjects::getownerteam(); /# - assert( !level.returnmessageelems[ "allies" ][ ownerteam ].alpha ); + assert( !level.returnmessageelems["axis"][ownerteam].alpha ); #/ - */ - level.returnmessageelems[ "allies" ][ ownerteam ].alpha = 1; - level.returnmessageelems[ "allies" ][ ownerteam ] settimer( time ); - if ( time <= 0 ) - { - return 0; - } - else - { - wait time; - } - return 1; + level.returnmessageelems["axis"][ownerteam].alpha = 1; + level.returnmessageelems["axis"][ownerteam] settimer( time ); +/# + assert( !level.returnmessageelems["allies"][ownerteam].alpha ); +#/ + level.returnmessageelems["allies"][ownerteam].alpha = 1; + level.returnmessageelems["allies"][ownerteam] settimer( time ); + + if ( time <= 0 ) + return false; + else + wait( time ); + + return true; } -clearreturnflaghudelems() //checked matches cerberus output +clearreturnflaghudelems() { - ownerteam = self maps/mp/gametypes/_gameobjects::getownerteam(); - level.returnmessageelems[ "allies" ][ ownerteam ].alpha = 0; - level.returnmessageelems[ "axis" ][ ownerteam ].alpha = 0; + ownerteam = self maps\mp\gametypes\_gameobjects::getownerteam(); + level.returnmessageelems["allies"][ownerteam].alpha = 0; + level.returnmessageelems["axis"][ownerteam].alpha = 0; } -resetflagbaseeffect() //checked matches cerberus output +resetflagbaseeffect() { - wait 0.1; - if ( isDefined( self.baseeffect ) ) - { - self.baseeffect delete(); - } - team = self maps/mp/gametypes/_gameobjects::getownerteam(); - if ( team != "axis" && team != "allies" ) - { - return; - } - fxid = level.flagbasefxid[ team ]; - self.baseeffect = spawnfx( fxid, self.baseeffectpos, self.baseeffectforward, self.baseeffectright ); - triggerfx( self.baseeffect ); + wait 0.1; + + if ( isdefined( self.baseeffect ) ) + self.baseeffect delete(); + + team = self maps\mp\gametypes\_gameobjects::getownerteam(); + + if ( team != "axis" && team != "allies" ) + return; + + fxid = level.flagbasefxid[team]; + self.baseeffect = spawnfx( fxid, self.baseeffectpos, self.baseeffectforward, self.baseeffectright ); + triggerfx( self.baseeffect ); } -turn_on() //checked matches cerberus output +turn_on() { - if ( level.hardcoremode ) - { - return; - } - self.origin = self.original_origin; + if ( level.hardcoremode ) + return; + + self.origin = self.original_origin; } -turn_off() //checked matches cerberus output +turn_off() { - self.origin = ( self.original_origin[ 0 ], self.original_origin[ 1 ], self.original_origin[ 2 ] - 10000 ); + self.origin = ( self.original_origin[0], self.original_origin[1], self.original_origin[2] - 10000 ); } -update_hints() //checked matches cerberus output +update_hints() { - allied_flag = level.teamflags[ "allies" ]; - axis_flag = level.teamflags[ "axis" ]; - if ( !level.touchreturn ) - { - return; - } - if ( isDefined( allied_flag.carrier ) && axis_flag maps/mp/gametypes/_gameobjects::isobjectawayfromhome() ) - { - level.flaghints[ "axis" ] turn_on(); - } - else - { - level.flaghints[ "axis" ] turn_off(); - } - if ( isDefined( axis_flag.carrier ) && allied_flag maps/mp/gametypes/_gameobjects::isobjectawayfromhome() ) - { - level.flaghints[ "allies" ] turn_on(); - } - else - { - level.flaghints[ "allies" ] turn_off(); - } + allied_flag = level.teamflags["allies"]; + axis_flag = level.teamflags["axis"]; + + if ( !level.touchreturn ) + return; + + if ( isdefined( allied_flag.carrier ) && axis_flag maps\mp\gametypes\_gameobjects::isobjectawayfromhome() ) + level.flaghints["axis"] turn_on(); + else + level.flaghints["axis"] turn_off(); + + if ( isdefined( axis_flag.carrier ) && allied_flag maps\mp\gametypes\_gameobjects::isobjectawayfromhome() ) + level.flaghints["allies"] turn_on(); + else + level.flaghints["allies"] turn_off(); } -claim_trigger( trigger ) //checked matches cerberus output +claim_trigger( trigger ) { - self endon( "disconnect" ); - self clientclaimtrigger( trigger ); - self waittill( "drop_object" ); - self clientreleasetrigger( trigger ); + self endon( "disconnect" ); + self clientclaimtrigger( trigger ); + + self waittill( "drop_object" ); + + self clientreleasetrigger( trigger ); } -createflagspawninfluencer( entityteam ) //checked matches cerberus output +createflagspawninfluencer( entityteam ) { - ctf_friendly_base_influencer_score = level.spawnsystem.ctf_friendly_base_influencer_score; - ctf_friendly_base_influencer_score_curve = level.spawnsystem.ctf_friendly_base_influencer_score_curve; - ctf_friendly_base_influencer_radius = level.spawnsystem.ctf_friendly_base_influencer_radius; - ctf_enemy_base_influencer_score = level.spawnsystem.ctf_enemy_base_influencer_score; - ctf_enemy_base_influencer_score_curve = level.spawnsystem.ctf_enemy_base_influencer_score_curve; - ctf_enemy_base_influencer_radius = level.spawnsystem.ctf_enemy_base_influencer_radius; - otherteam = getotherteam( entityteam ); - team_mask = getteammask( entityteam ); - other_team_mask = getteammask( otherteam ); - self.spawn_influencer_friendly = addsphereinfluencer( level.spawnsystem.einfluencer_type_game_mode, self.trigger.origin, ctf_friendly_base_influencer_radius, ctf_friendly_base_influencer_score, team_mask, "ctf_friendly_base,r,s", maps/mp/gametypes/_spawning::get_score_curve_index( ctf_friendly_base_influencer_score_curve ) ); - self.spawn_influencer_enemy = addsphereinfluencer( level.spawnsystem.einfluencer_type_game_mode, self.trigger.origin, ctf_enemy_base_influencer_radius, ctf_enemy_base_influencer_score, other_team_mask, "ctf_enemy_base,r,s", maps/mp/gametypes/_spawning::get_score_curve_index( ctf_enemy_base_influencer_score_curve ) ); + ctf_friendly_base_influencer_score = level.spawnsystem.ctf_friendly_base_influencer_score; + ctf_friendly_base_influencer_score_curve = level.spawnsystem.ctf_friendly_base_influencer_score_curve; + ctf_friendly_base_influencer_radius = level.spawnsystem.ctf_friendly_base_influencer_radius; + ctf_enemy_base_influencer_score = level.spawnsystem.ctf_enemy_base_influencer_score; + ctf_enemy_base_influencer_score_curve = level.spawnsystem.ctf_enemy_base_influencer_score_curve; + ctf_enemy_base_influencer_radius = level.spawnsystem.ctf_enemy_base_influencer_radius; + otherteam = getotherteam( entityteam ); + team_mask = getteammask( entityteam ); + other_team_mask = getteammask( otherteam ); + self.spawn_influencer_friendly = addsphereinfluencer( level.spawnsystem.einfluencer_type_game_mode, self.trigger.origin, ctf_friendly_base_influencer_radius, ctf_friendly_base_influencer_score, team_mask, "ctf_friendly_base,r,s", maps\mp\gametypes\_spawning::get_score_curve_index( ctf_friendly_base_influencer_score_curve ) ); + self.spawn_influencer_enemy = addsphereinfluencer( level.spawnsystem.einfluencer_type_game_mode, self.trigger.origin, ctf_enemy_base_influencer_radius, ctf_enemy_base_influencer_score, other_team_mask, "ctf_enemy_base,r,s", maps\mp\gametypes\_spawning::get_score_curve_index( ctf_enemy_base_influencer_score_curve ) ); } -ctf_gamemodespawndvars( reset_dvars ) //checked matches cerberus output +ctf_gamemodespawndvars( reset_dvars ) { - ss = level.spawnsystem; - ss.ctf_friendly_base_influencer_score = set_dvar_float_if_unset( "scr_spawn_ctf_friendly_base_influencer_score", "0", reset_dvars ); - ss.ctf_friendly_base_influencer_score_curve = set_dvar_if_unset( "scr_spawn_ctf_friendly_base_influencer_score_curve", "constant", reset_dvars ); - ss.ctf_friendly_base_influencer_radius = set_dvar_float_if_unset( "scr_spawn_ctf_friendly_base_influencer_radius", "" + ( 15 * get_player_height() ), reset_dvars ); - ss.ctf_enemy_base_influencer_score = set_dvar_float_if_unset( "scr_spawn_ctf_enemy_base_influencer_score", "-500", reset_dvars ); - ss.ctf_enemy_base_influencer_score_curve = set_dvar_if_unset( "scr_spawn_ctf_enemy_base_influencer_score_curve", "constant", reset_dvars ); - ss.ctf_enemy_base_influencer_radius = set_dvar_float_if_unset( "scr_spawn_ctf_enemy_base_influencer_radius", "" + ( 15 * get_player_height() ), reset_dvars ); - ss.ctf_enemy_carrier_influencer_score = set_dvar_float_if_unset( "scr_spawn_ctf_enemy_carrier_influencer_score", "0", reset_dvars ); - ss.ctf_enemy_carrier_influencer_score_curve = set_dvar_if_unset( "scr_spawn_ctf_enemy_carrier_influencer_score_curve", "constant", reset_dvars ); - ss.ctf_enemy_carrier_influencer_radius = set_dvar_float_if_unset( "scr_spawn_ctf_enemy_carrier_influencer_radius", "" + ( 10 * get_player_height() ), reset_dvars ); - ss.ctf_friendly_carrier_influencer_score = set_dvar_float_if_unset( "scr_spawn_ctf_friendly_carrier_influencer_score", "0", reset_dvars ); - ss.ctf_friendly_carrier_influencer_score_curve = set_dvar_if_unset( "scr_spawn_ctf_friendly_carrier_influencer_score_curve", "constant", reset_dvars ); - ss.ctf_friendly_carrier_influencer_radius = set_dvar_float_if_unset( "scr_spawn_ctf_friendly_carrier_influencer_radius", "" + ( 8 * get_player_height() ), reset_dvars ); - ss.ctf_dropped_influencer_score = set_dvar_float_if_unset( "scr_spawn_ctf_dropped_influencer_score", "0", reset_dvars ); - ss.ctf_dropped_influencer_score_curve = set_dvar_if_unset( "scr_spawn_ctf_dropped_influencer_score_curve", "constant", reset_dvars ); - ss.ctf_dropped_influencer_radius = set_dvar_float_if_unset( "scr_spawn_ctf_dropped_influencer_radius", "" + ( 10 * get_player_height() ), reset_dvars ); + ss = level.spawnsystem; + ss.ctf_friendly_base_influencer_score = set_dvar_float_if_unset( "scr_spawn_ctf_friendly_base_influencer_score", "0", reset_dvars ); + ss.ctf_friendly_base_influencer_score_curve = set_dvar_if_unset( "scr_spawn_ctf_friendly_base_influencer_score_curve", "constant", reset_dvars ); + ss.ctf_friendly_base_influencer_radius = set_dvar_float_if_unset( "scr_spawn_ctf_friendly_base_influencer_radius", "" + 15.0 * get_player_height(), reset_dvars ); + ss.ctf_enemy_base_influencer_score = set_dvar_float_if_unset( "scr_spawn_ctf_enemy_base_influencer_score", "-500", reset_dvars ); + ss.ctf_enemy_base_influencer_score_curve = set_dvar_if_unset( "scr_spawn_ctf_enemy_base_influencer_score_curve", "constant", reset_dvars ); + ss.ctf_enemy_base_influencer_radius = set_dvar_float_if_unset( "scr_spawn_ctf_enemy_base_influencer_radius", "" + 15.0 * get_player_height(), reset_dvars ); + ss.ctf_enemy_carrier_influencer_score = set_dvar_float_if_unset( "scr_spawn_ctf_enemy_carrier_influencer_score", "0", reset_dvars ); + ss.ctf_enemy_carrier_influencer_score_curve = set_dvar_if_unset( "scr_spawn_ctf_enemy_carrier_influencer_score_curve", "constant", reset_dvars ); + ss.ctf_enemy_carrier_influencer_radius = set_dvar_float_if_unset( "scr_spawn_ctf_enemy_carrier_influencer_radius", "" + 10.0 * get_player_height(), reset_dvars ); + ss.ctf_friendly_carrier_influencer_score = set_dvar_float_if_unset( "scr_spawn_ctf_friendly_carrier_influencer_score", "0", reset_dvars ); + ss.ctf_friendly_carrier_influencer_score_curve = set_dvar_if_unset( "scr_spawn_ctf_friendly_carrier_influencer_score_curve", "constant", reset_dvars ); + ss.ctf_friendly_carrier_influencer_radius = set_dvar_float_if_unset( "scr_spawn_ctf_friendly_carrier_influencer_radius", "" + 8.0 * get_player_height(), reset_dvars ); + ss.ctf_dropped_influencer_score = set_dvar_float_if_unset( "scr_spawn_ctf_dropped_influencer_score", "0", reset_dvars ); + ss.ctf_dropped_influencer_score_curve = set_dvar_if_unset( "scr_spawn_ctf_dropped_influencer_score_curve", "constant", reset_dvars ); + ss.ctf_dropped_influencer_radius = set_dvar_float_if_unset( "scr_spawn_ctf_dropped_influencer_radius", "" + 10.0 * get_player_height(), reset_dvars ); } -ctf_getteamkillpenalty( einflictor, attacker, smeansofdeath, sweapon ) //checked matches cerberus output +ctf_getteamkillpenalty( einflictor, attacker, smeansofdeath, sweapon ) { - teamkill_penalty = maps/mp/gametypes/_globallogic_defaults::default_getteamkillpenalty( einflictor, attacker, smeansofdeath, sweapon ); - if ( is_true( self.isflagcarrier ) ) - { - teamkill_penalty *= level.teamkillpenaltymultiplier; - } - return teamkill_penalty; + teamkill_penalty = maps\mp\gametypes\_globallogic_defaults::default_getteamkillpenalty( einflictor, attacker, smeansofdeath, sweapon ); + + if ( isdefined( self.isflagcarrier ) && self.isflagcarrier ) + teamkill_penalty *= level.teamkillpenaltymultiplier; + + return teamkill_penalty; } -ctf_getteamkillscore( einflictor, attacker, smeansofdeath, sweapon ) //checked matches cerberus output +ctf_getteamkillscore( einflictor, attacker, smeansofdeath, sweapon ) { - teamkill_score = maps/mp/gametypes/_rank::getscoreinfovalue( "kill" ); - if ( is_true( self.isflagcarrier ) ) - { - teamkill_score *= level.teamkillscoremultiplier; - } - return int( teamkill_score ); + teamkill_score = maps\mp\gametypes\_rank::getscoreinfovalue( "kill" ); + + if ( isdefined( self.isflagcarrier ) && self.isflagcarrier ) + teamkill_score *= level.teamkillscoremultiplier; + + return int( teamkill_score ); } - - diff --git a/Multiplayer Core/patch_mp/maps/mp/gametypes/sas.gsc b/Multiplayer Core/patch_mp/maps/mp/gametypes/sas.gsc index d7ea558..e6a36b4 100644 --- a/Multiplayer Core/patch_mp/maps/mp/gametypes/sas.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/gametypes/sas.gsc @@ -1,279 +1,268 @@ -#include maps/mp/gametypes/_persistence; -#include maps/mp/gametypes/_spawnlogic; -#include maps/mp/gametypes/_spawning; -#include maps/mp/gametypes/_globallogic_audio; -#include maps/mp/_scoreevents; -#include maps/mp/gametypes/_globallogic_score; -#include maps/mp/gametypes/_wager; -#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() { - maps/mp/gametypes/_globallogic::init(); - maps/mp/gametypes/_callbacksetup::setupcallbacks(); - maps/mp/gametypes/_globallogic::setupcallbacks(); - maps/mp/_utility::registertimelimit( 0, 1440 ); - maps/mp/_utility::registerscorelimit( 0, 5000 ); - maps/mp/_utility::registerroundlimit( 0, 10 ); - maps/mp/_utility::registerroundwinlimit( 0, 10 ); - maps/mp/_utility::registernumlives( 0, 100 ); - level.onstartgametype = ::onstartgametype; - level.onspawnplayer = ::onspawnplayer; - level.onspawnplayerunified = ::onspawnplayerunified; - level.onplayerdamage = ::onplayerdamage; - level.onplayerkilled = ::onplayerkilled; - level.onwagerawards = ::onwagerawards; - level.pointsperprimarykill = getgametypesetting( "pointsPerPrimaryKill" ); - level.pointspersecondarykill = getgametypesetting( "pointsPerSecondaryKill" ); - level.pointsperprimarygrenadekill = getgametypesetting( "pointsPerPrimaryGrenadeKill" ); - level.pointspermeleekill = getgametypesetting( "pointsPerMeleeKill" ); - level.setbacks = getgametypesetting( "setbacks" ); - switch( getgametypesetting( "gunSelection" ) ) - { - case 0: - level.setbackweapon = undefined; - break; - case 1: - level.setbackweapon = getreffromitemindex( getbaseweaponitemindex( "hatchet_mp" ) ) + "_mp"; - break; - case 2: - level.setbackweapon = getreffromitemindex( getbaseweaponitemindex( "crossbow_mp" ) ) + "_mp"; - break; - case 3: - level.setbackweapon = getreffromitemindex( getbaseweaponitemindex( "knife_ballistic_mp" ) ) + "_mp"; - break; - default: - /* + maps\mp\gametypes\_globallogic::init(); + maps\mp\gametypes\_callbacksetup::setupcallbacks(); + maps\mp\gametypes\_globallogic::setupcallbacks(); + registertimelimit( 0, 1440 ); + registerscorelimit( 0, 5000 ); + registerroundlimit( 0, 10 ); + registerroundwinlimit( 0, 10 ); + registernumlives( 0, 100 ); + level.onstartgametype = ::onstartgametype; + level.onspawnplayer = ::onspawnplayer; + level.onspawnplayerunified = ::onspawnplayerunified; + level.onplayerdamage = ::onplayerdamage; + level.onplayerkilled = ::onplayerkilled; + level.onwagerawards = ::onwagerawards; + level.pointsperprimarykill = getgametypesetting( "pointsPerPrimaryKill" ); + level.pointspersecondarykill = getgametypesetting( "pointsPerSecondaryKill" ); + level.pointsperprimarygrenadekill = getgametypesetting( "pointsPerPrimaryGrenadeKill" ); + level.pointspermeleekill = getgametypesetting( "pointsPerMeleeKill" ); + level.setbacks = getgametypesetting( "setbacks" ); + + switch ( getgametypesetting( "gunSelection" ) ) + { + case 0: + level.setbackweapon = undefined; + break; + case 1: + level.setbackweapon = getreffromitemindex( getbaseweaponitemindex( "hatchet_mp" ) ) + "_mp"; + break; + case 2: + level.setbackweapon = getreffromitemindex( getbaseweaponitemindex( "crossbow_mp" ) ) + "_mp"; + break; + case 3: + level.setbackweapon = getreffromitemindex( getbaseweaponitemindex( "knife_ballistic_mp" ) ) + "_mp"; + break; + default: /# - assert( 1, "Invalid setting for gunSelection" ); + assert( 1, "Invalid setting for gunSelection" ); #/ - */ - break; - } - game[ "dialog" ][ "gametype" ] = "sns_start"; - game[ "dialog" ][ "wm_humiliation" ] = "mpl_wager_bankrupt"; - game[ "dialog" ][ "wm_humiliated" ] = "sns_hum"; - level.givecustomloadout = ::givecustomloadout; - precachestring( &"MP_HUMILIATION" ); - precachestring( &"MP_HUMILIATED" ); - precachestring( &"MP_BANKRUPTED" ); - precachestring( &"MP_BANKRUPTED_OTHER" ); - precacheshader( "hud_acoustic_sensor" ); - precacheshader( "hud_us_stungrenade" ); - setscoreboardcolumns( "pointstowin", "kills", "deaths", "tomahawks", "humiliated" ); + break; + } + + game["dialog"]["gametype"] = "sns_start"; + game["dialog"]["wm_humiliation"] = "mpl_wager_bankrupt"; + game["dialog"]["wm_humiliated"] = "sns_hum"; + level.givecustomloadout = ::givecustomloadout; + precachestring( &"MP_HUMILIATION" ); + precachestring( &"MP_HUMILIATED" ); + precachestring( &"MP_BANKRUPTED" ); + precachestring( &"MP_BANKRUPTED_OTHER" ); + precacheshader( "hud_acoustic_sensor" ); + precacheshader( "hud_us_stungrenade" ); + setscoreboardcolumns( "pointstowin", "kills", "deaths", "tomahawks", "humiliated" ); } -givecustomloadout() //checked matches cerberus output +givecustomloadout() { - self notify( "sas_spectator_hud" ); - defaultweapon = "crossbow_mp"; - self maps/mp/gametypes/_wager::setupblankrandomplayer( 1, 1, defaultweapon ); - self giveweapon( defaultweapon ); - self setweaponammoclip( defaultweapon, 3 ); - self setweaponammostock( defaultweapon, 3 ); - secondaryweapon = "knife_ballistic_mp"; - self giveweapon( secondaryweapon ); - self setweaponammostock( secondaryweapon, 2 ); - offhandprimary = "hatchet_mp"; - self setoffhandprimaryclass( offhandprimary ); - self giveweapon( offhandprimary ); - self setweaponammoclip( offhandprimary, 1 ); - self setweaponammostock( offhandprimary, 1 ); - self giveweapon( "knife_mp" ); - self switchtoweapon( defaultweapon ); - self setspawnweapon( defaultweapon ); - self.killswithsecondary = 0; - self.killswithprimary = 0; - self.killswithbothawarded = 0; - return defaultweapon; + self notify( "sas_spectator_hud" ); + defaultweapon = "crossbow_mp"; + self maps\mp\gametypes\_wager::setupblankrandomplayer( 1, 1, defaultweapon ); + self giveweapon( defaultweapon ); + self setweaponammoclip( defaultweapon, 3 ); + self setweaponammostock( defaultweapon, 3 ); + secondaryweapon = "knife_ballistic_mp"; + self giveweapon( secondaryweapon ); + self setweaponammostock( secondaryweapon, 2 ); + offhandprimary = "hatchet_mp"; + self setoffhandprimaryclass( offhandprimary ); + self giveweapon( offhandprimary ); + self setweaponammoclip( offhandprimary, 1 ); + self setweaponammostock( offhandprimary, 1 ); + self giveweapon( "knife_mp" ); + self switchtoweapon( defaultweapon ); + self setspawnweapon( defaultweapon ); + self.killswithsecondary = 0; + self.killswithprimary = 0; + self.killswithbothawarded = 0; + return defaultweapon; } -onplayerdamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime ) //checked matches cerberus output +onplayerdamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime ) { - if ( sweapon == "crossbow_mp" && smeansofdeath == "MOD_IMPACT" ) - { - if ( isDefined( eattacker ) && isplayer( eattacker ) ) - { - if ( !isDefined( eattacker.pers[ "sticks" ] ) ) - { - eattacker.pers[ "sticks" ] = 1; - } - else - { - eattacker.pers[ "sticks" ]++; - } - eattacker.sticks = eattacker.pers[ "sticks" ]; - } - } - return idamage; + if ( sweapon == "crossbow_mp" && smeansofdeath == "MOD_IMPACT" ) + { + if ( isdefined( eattacker ) && isplayer( eattacker ) ) + { + if ( !isdefined( eattacker.pers["sticks"] ) ) + eattacker.pers["sticks"] = 1; + else + eattacker.pers["sticks"]++; + + eattacker.sticks = eattacker.pers["sticks"]; + } + } + + return idamage; } -onplayerkilled( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ) //checked changed to match cerberus output +onplayerkilled( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ) { - if ( isDefined( attacker ) && isplayer( attacker ) && attacker != self ) - { - baseweaponname = getreffromitemindex( getbaseweaponitemindex( sweapon ) ) + "_mp"; - if ( smeansofdeath == "MOD_MELEE" ) - { - attacker maps/mp/gametypes/_globallogic_score::givepointstowin( level.pointspermeleekill ); - } - else if ( baseweaponname == "crossbow_mp" ) - { - attacker.killswithprimary++; - if ( attacker.killswithbothawarded == 0 && attacker.killswithsecondary > 0 ) - { - attacker.killswithbothawarded = 1; - maps/mp/_scoreevents::processscoreevent( "kill_with_crossbow_and_ballistic_sas", attacker, self, sweapon ); - } - attacker maps/mp/gametypes/_globallogic_score::givepointstowin( level.pointsperprimarykill ); - } - else if ( baseweaponname == "hatchet_mp" ) - { - if ( maps/mp/gametypes/_globallogic::istopscoringplayer( self ) ) - { - maps/mp/_scoreevents::processscoreevent( "kill_leader_with_axe_sas", attacker, self, sweapon ); - } - else - { - maps/mp/_scoreevents::processscoreevent( "kill_with_axe_sas", attacker, self, sweapon ); - } - attacker maps/mp/gametypes/_globallogic_score::givepointstowin( level.pointsperprimarygrenadekill ); - } - else if ( baseweaponname == "knife_ballistic_mp" ) - { - attacker.killswithsecondary++; - if ( attacker.killswithbothawarded == 0 && attacker.killswithprimary > 0 ) - { - attacker.killswithbothawarded = 1; - maps/mp/_scoreevents::processscoreevent( "kill_with_crossbow_and_ballistic_sas", attacker, self, sweapon ); - } - } - attacker maps/mp/gametypes/_globallogic_score::givepointstowin( level.pointspersecondarykill ); - if ( isDefined( level.setbackweapon ) && baseweaponname == level.setbackweapon ) - { - self.pers[ "humiliated" ]++; - self.humiliated = self.pers[ "humiliated" ]; - if ( level.setbacks == 0 ) - { - self maps/mp/gametypes/_globallogic_score::setpointstowin( 0 ); - } - else - { - self maps/mp/gametypes/_globallogic_score::givepointstowin( level.setbacks * -1 ); - } - attacker playlocalsound( game[ "dialog" ][ "wm_humiliation" ] ); - self playlocalsound( game[ "dialog" ][ "wm_humiliation" ] ); - self maps/mp/gametypes/_globallogic_audio::leaderdialogonplayer( "wm_humiliated" ); - } - } - else - { - self.pers[ "humiliated" ]++; - self.humiliated = self.pers[ "humiliated" ]; - if ( level.setbacks == 0 ) - { - self maps/mp/gametypes/_globallogic_score::setpointstowin( 0 ); - } - else - { - self maps/mp/gametypes/_globallogic_score::givepointstowin( level.setbacks * -1 ); - } - self thread maps/mp/gametypes/_wager::queuewagerpopup( &"MP_HUMILIATED", 0, &"MP_BANKRUPTED", "wm_humiliated" ); - self playlocalsound( game[ "dialog" ][ "wm_humiliated" ] ); - } + if ( isdefined( attacker ) && isplayer( attacker ) && attacker != self ) + { + baseweaponname = getreffromitemindex( getbaseweaponitemindex( sweapon ) ) + "_mp"; + + if ( smeansofdeath == "MOD_MELEE" ) + attacker maps\mp\gametypes\_globallogic_score::givepointstowin( level.pointspermeleekill ); + else if ( baseweaponname == "crossbow_mp" ) + { + attacker.killswithprimary++; + + if ( attacker.killswithbothawarded == 0 && attacker.killswithsecondary > 0 ) + { + attacker.killswithbothawarded = 1; + maps\mp\_scoreevents::processscoreevent( "kill_with_crossbow_and_ballistic_sas", attacker, self, sweapon ); + } + + attacker maps\mp\gametypes\_globallogic_score::givepointstowin( level.pointsperprimarykill ); + } + else if ( baseweaponname == "hatchet_mp" ) + { + if ( maps\mp\gametypes\_globallogic::istopscoringplayer( self ) ) + maps\mp\_scoreevents::processscoreevent( "kill_leader_with_axe_sas", attacker, self, sweapon ); + else + maps\mp\_scoreevents::processscoreevent( "kill_with_axe_sas", attacker, self, sweapon ); + + attacker maps\mp\gametypes\_globallogic_score::givepointstowin( level.pointsperprimarygrenadekill ); + } + else + { + if ( baseweaponname == "knife_ballistic_mp" ) + { + attacker.killswithsecondary++; + + if ( attacker.killswithbothawarded == 0 && attacker.killswithprimary > 0 ) + { + attacker.killswithbothawarded = 1; + maps\mp\_scoreevents::processscoreevent( "kill_with_crossbow_and_ballistic_sas", attacker, self, sweapon ); + } + } + + attacker maps\mp\gametypes\_globallogic_score::givepointstowin( level.pointspersecondarykill ); + } + + if ( isdefined( level.setbackweapon ) && baseweaponname == level.setbackweapon ) + { + self.pers["humiliated"]++; + self.humiliated = self.pers["humiliated"]; + + if ( level.setbacks == 0 ) + self maps\mp\gametypes\_globallogic_score::setpointstowin( 0 ); + else + self maps\mp\gametypes\_globallogic_score::givepointstowin( level.setbacks * -1 ); + + attacker playlocalsound( game["dialog"]["wm_humiliation"] ); + self playlocalsound( game["dialog"]["wm_humiliation"] ); + self maps\mp\gametypes\_globallogic_audio::leaderdialogonplayer( "wm_humiliated" ); + } + } + else + { + self.pers["humiliated"]++; + self.humiliated = self.pers["humiliated"]; + + if ( level.setbacks == 0 ) + self maps\mp\gametypes\_globallogic_score::setpointstowin( 0 ); + else + self maps\mp\gametypes\_globallogic_score::givepointstowin( level.setbacks * -1 ); + + self thread maps\mp\gametypes\_wager::queuewagerpopup( &"MP_HUMILIATED", 0, &"MP_BANKRUPTED", "wm_humiliated" ); + self playlocalsound( game["dialog"]["wm_humiliated"] ); + } } -onstartgametype() //checked changed to match cerberus output +onstartgametype() { - setdvar( "scr_xpscale", 0 ); - setclientnamemode( "auto_change" ); - maps/mp/_utility::setobjectivetext( "allies", &"OBJECTIVES_SAS" ); - maps/mp/_utility::setobjectivetext( "axis", &"OBJECTIVES_SAS" ); - if ( level.splitscreen ) - { - maps/mp/_utility::setobjectivescoretext( "allies", &"OBJECTIVES_SAS" ); - maps/mp/_utility::setobjectivescoretext( "axis", &"OBJECTIVES_SAS" ); - } - else - { - maps/mp/_utility::setobjectivescoretext( "allies", &"OBJECTIVES_SAS_SCORE" ); - maps/mp/_utility::setobjectivescoretext( "axis", &"OBJECTIVES_SAS_SCORE" ); - } - maps/mp/_utility::setobjectivehinttext( "allies", &"OBJECTIVES_SAS_HINT" ); - maps/mp/_utility::setobjectivehinttext( "axis", &"OBJECTIVES_SAS_HINT" ); - allowed = []; - allowed[ 0 ] = "sas"; - maps/mp/gametypes/_gameobjects::main( allowed ); - maps/mp/gametypes/_spawning::create_map_placed_influencers(); - level.spawnmins = ( 0, 0, 0 ); - level.spawnmaxs = ( 0, 0, 0 ); - newspawns = getentarray( "mp_wager_spawn", "classname" ); - if ( newspawns.size > 0 ) - { - maps/mp/gametypes/_spawnlogic::addspawnpoints( "allies", "mp_wager_spawn" ); - maps/mp/gametypes/_spawnlogic::addspawnpoints( "axis", "mp_wager_spawn" ); - } - else - { - maps/mp/gametypes/_spawnlogic::addspawnpoints( "allies", "mp_dm_spawn" ); - maps/mp/gametypes/_spawnlogic::addspawnpoints( "axis", "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.displayroundendtext = 0; - if ( isDefined( game[ "roundsplayed" ] ) && game[ "roundsplayed" ] > 0 ) - { - game["dialog"]["gametype"] = undefined; - game["dialog"]["offense_obj"] = undefined; - game["dialog"]["defense_obj"] = undefined; - } + setdvar( "scr_xpscale", 0 ); + setclientnamemode( "auto_change" ); + setobjectivetext( "allies", &"OBJECTIVES_SAS" ); + setobjectivetext( "axis", &"OBJECTIVES_SAS" ); + + if ( level.splitscreen ) + { + setobjectivescoretext( "allies", &"OBJECTIVES_SAS" ); + setobjectivescoretext( "axis", &"OBJECTIVES_SAS" ); + } + else + { + setobjectivescoretext( "allies", &"OBJECTIVES_SAS_SCORE" ); + setobjectivescoretext( "axis", &"OBJECTIVES_SAS_SCORE" ); + } + + setobjectivehinttext( "allies", &"OBJECTIVES_SAS_HINT" ); + setobjectivehinttext( "axis", &"OBJECTIVES_SAS_HINT" ); + allowed[0] = "sas"; + maps\mp\gametypes\_gameobjects::main( allowed ); + maps\mp\gametypes\_spawning::create_map_placed_influencers(); + level.spawnmins = ( 0, 0, 0 ); + level.spawnmaxs = ( 0, 0, 0 ); + newspawns = getentarray( "mp_wager_spawn", "classname" ); + + if ( newspawns.size > 0 ) + { + maps\mp\gametypes\_spawnlogic::addspawnpoints( "allies", "mp_wager_spawn" ); + maps\mp\gametypes\_spawnlogic::addspawnpoints( "axis", "mp_wager_spawn" ); + } + else + { + maps\mp\gametypes\_spawnlogic::addspawnpoints( "allies", "mp_dm_spawn" ); + maps\mp\gametypes\_spawnlogic::addspawnpoints( "axis", "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.displayroundendtext = 0; + + if ( isdefined( game["roundsplayed"] ) && game["roundsplayed"] > 0 ) + { + game["dialog"]["gametype"] = undefined; + game["dialog"]["offense_obj"] = undefined; + game["dialog"]["defense_obj"] = undefined; + } } -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, "sas" ); - } + 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, "sas" ); } -onwagerawards() //checked matches cerberus output +onwagerawards() { - tomahawks = self maps/mp/gametypes/_globallogic_score::getpersstat( "tomahawks" ); - if ( !isDefined( tomahawks ) ) - { - tomahawks = 0; - } - self maps/mp/gametypes/_persistence::setafteractionreportstat( "wagerAwards", tomahawks, 0 ); - sticks = self maps/mp/gametypes/_globallogic_score::getpersstat( "sticks" ); - if ( !isDefined( sticks ) ) - { - sticks = 0; - } - self maps/mp/gametypes/_persistence::setafteractionreportstat( "wagerAwards", sticks, 1 ); - bestkillstreak = self maps/mp/gametypes/_globallogic_score::getpersstat( "best_kill_streak" ); - if ( !isDefined( bestkillstreak ) ) - { - bestkillstreak = 0; - } - self maps/mp/gametypes/_persistence::setafteractionreportstat( "wagerAwards", bestkillstreak, 2 ); -} + tomahawks = self maps\mp\gametypes\_globallogic_score::getpersstat( "tomahawks" ); + if ( !isdefined( tomahawks ) ) + tomahawks = 0; + + self maps\mp\gametypes\_persistence::setafteractionreportstat( "wagerAwards", tomahawks, 0 ); + sticks = self maps\mp\gametypes\_globallogic_score::getpersstat( "sticks" ); + + if ( !isdefined( sticks ) ) + sticks = 0; + + self maps\mp\gametypes\_persistence::setafteractionreportstat( "wagerAwards", sticks, 1 ); + bestkillstreak = self maps\mp\gametypes\_globallogic_score::getpersstat( "best_kill_streak" ); + + if ( !isdefined( bestkillstreak ) ) + bestkillstreak = 0; + + self maps\mp\gametypes\_persistence::setafteractionreportstat( "wagerAwards", bestkillstreak, 2 ); +} diff --git a/Multiplayer Core/patch_mp/maps/mp/gametypes/sd.gsc b/Multiplayer Core/patch_mp/maps/mp/gametypes/sd.gsc index de109f1..91ec477 100644 --- a/Multiplayer Core/patch_mp/maps/mp/gametypes/sd.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/gametypes/sd.gsc @@ -1,977 +1,903 @@ -//checked includes match cerberus output -#include maps/mp/gametypes/_hostmigration; -#include maps/mp/gametypes/_globallogic_utils; -#include maps/mp/_demo; -#include maps/mp/_popups; -#include maps/mp/gametypes/_battlechatter_mp; -#include maps/mp/gametypes/_globallogic_audio; -#include maps/mp/gametypes/_globallogic_score; -#include maps/mp/gametypes/_spectating; -#include maps/mp/_medals; -#include maps/mp/_scoreevents; -#include maps/mp/gametypes/_spawnlogic; -#include maps/mp/gametypes/_spawning; -#include maps/mp/gametypes/_gameobjects; -#include maps/mp/gametypes/_rank; -#include maps/mp/gametypes/_globallogic_defaults; -#include maps/mp/gametypes/_callbacksetup; -#include maps/mp/gametypes/_globallogic; -#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 -main() //checked matches cerberus output +main() { - if ( getDvar( "mapname" ) == "mp_background" ) - { - return; - } - maps/mp/gametypes/_globallogic::init(); - maps/mp/gametypes/_callbacksetup::setupcallbacks(); - maps/mp/gametypes/_globallogic::setupcallbacks(); - registerroundswitch( 0, 9 ); - registertimelimit( 0, 1440 ); - registerscorelimit( 0, 500 ); - registerroundlimit( 0, 12 ); - registerroundwinlimit( 0, 10 ); - registernumlives( 0, 100 ); - maps/mp/gametypes/_globallogic::registerfriendlyfiredelay( level.gametype, 15, 0, 1440 ); - level.teambased = 1; - level.overrideteamscore = 1; - level.onprecachegametype = ::onprecachegametype; - level.onstartgametype = ::onstartgametype; - level.onspawnplayer = ::onspawnplayer; - level.onspawnplayerunified = ::onspawnplayerunified; - level.playerspawnedcb = ::sd_playerspawnedcb; - level.onplayerkilled = ::onplayerkilled; - level.ondeadevent = ::ondeadevent; - level.ononeleftevent = ::ononeleftevent; - level.ontimelimit = ::ontimelimit; - level.onroundswitch = ::onroundswitch; - level.getteamkillpenalty = ::sd_getteamkillpenalty; - level.getteamkillscore = ::sd_getteamkillscore; - level.iskillboosting = ::sd_iskillboosting; - level.endgameonscorelimit = 0; - game[ "dialog" ][ "gametype" ] = "sd_start"; - game[ "dialog" ][ "gametype_hardcore" ] = "hcsd_start"; - game[ "dialog" ][ "offense_obj" ] = "destroy_start"; - game[ "dialog" ][ "defense_obj" ] = "defend_start"; - game[ "dialog" ][ "sudden_death" ] = "generic_boost"; - game[ "dialog" ][ "last_one" ] = "encourage_last"; - game[ "dialog" ][ "halftime" ] = "sd_halftime"; - if ( !sessionmodeissystemlink() && !sessionmodeisonlinegame() && issplitscreen() ) - { - setscoreboardcolumns( "score", "kills", "plants", "defuses", "deaths" ); - } - else - { - setscoreboardcolumns( "score", "kills", "deaths", "plants", "defuses" ); - } + if ( getdvar( "mapname" ) == "mp_background" ) + return; + + maps\mp\gametypes\_globallogic::init(); + maps\mp\gametypes\_callbacksetup::setupcallbacks(); + maps\mp\gametypes\_globallogic::setupcallbacks(); + registerroundswitch( 0, 9 ); + registertimelimit( 0, 1440 ); + registerscorelimit( 0, 500 ); + registerroundlimit( 0, 12 ); + registerroundwinlimit( 0, 10 ); + registernumlives( 0, 100 ); + maps\mp\gametypes\_globallogic::registerfriendlyfiredelay( level.gametype, 15, 0, 1440 ); + level.teambased = 1; + level.overrideteamscore = 1; + level.onprecachegametype = ::onprecachegametype; + level.onstartgametype = ::onstartgametype; + level.onspawnplayer = ::onspawnplayer; + level.onspawnplayerunified = ::onspawnplayerunified; + level.playerspawnedcb = ::sd_playerspawnedcb; + level.onplayerkilled = ::onplayerkilled; + level.ondeadevent = ::ondeadevent; + level.ononeleftevent = ::ononeleftevent; + level.ontimelimit = ::ontimelimit; + level.onroundswitch = ::onroundswitch; + level.getteamkillpenalty = ::sd_getteamkillpenalty; + level.getteamkillscore = ::sd_getteamkillscore; + level.iskillboosting = ::sd_iskillboosting; + level.endgameonscorelimit = 0; + game["dialog"]["gametype"] = "sd_start"; + game["dialog"]["gametype_hardcore"] = "hcsd_start"; + game["dialog"]["offense_obj"] = "destroy_start"; + game["dialog"]["defense_obj"] = "defend_start"; + game["dialog"]["sudden_death"] = "generic_boost"; + game["dialog"]["last_one"] = "encourage_last"; + game["dialog"]["halftime"] = "sd_halftime"; + + if ( !sessionmodeissystemlink() && !sessionmodeisonlinegame() && issplitscreen() ) + setscoreboardcolumns( "score", "kills", "plants", "defuses", "deaths" ); + else + setscoreboardcolumns( "score", "kills", "deaths", "plants", "defuses" ); } -onprecachegametype() //checked matches cerberus output +onprecachegametype() { - game[ "bomb_dropped_sound" ] = "mpl_flag_drop_plr"; - game[ "bomb_recovered_sound" ] = "mpl_flag_pickup_plr"; - precacheshader( "waypoint_bomb" ); - precacheshader( "hud_suitcase_bomb" ); - precacheshader( "waypoint_target" ); - precacheshader( "waypoint_target_a" ); - precacheshader( "waypoint_target_b" ); - precacheshader( "waypoint_defend" ); - precacheshader( "waypoint_defend_a" ); - precacheshader( "waypoint_defend_b" ); - precacheshader( "waypoint_defuse" ); - precacheshader( "waypoint_defuse_a" ); - precacheshader( "waypoint_defuse_b" ); - precacheshader( "compass_waypoint_target" ); - precacheshader( "compass_waypoint_target_a" ); - precacheshader( "compass_waypoint_target_b" ); - precacheshader( "compass_waypoint_defend" ); - precacheshader( "compass_waypoint_defend_a" ); - precacheshader( "compass_waypoint_defend_b" ); - precacheshader( "compass_waypoint_defuse" ); - precacheshader( "compass_waypoint_defuse_a" ); - precacheshader( "compass_waypoint_defuse_b" ); - precachestring( &"MP_EXPLOSIVES_BLOWUP_BY" ); - precachestring( &"MP_EXPLOSIVES_RECOVERED_BY" ); - precachestring( &"MP_EXPLOSIVES_DROPPED_BY" ); - precachestring( &"MP_EXPLOSIVES_PLANTED_BY" ); - precachestring( &"MP_EXPLOSIVES_DEFUSED_BY" ); - precachestring( &"PLATFORM_HOLD_TO_PLANT_EXPLOSIVES" ); - precachestring( &"PLATFORM_HOLD_TO_DEFUSE_EXPLOSIVES" ); - precachestring( &"MP_CANT_PLANT_WITHOUT_BOMB" ); - precachestring( &"MP_PLANTING_EXPLOSIVE" ); - precachestring( &"MP_DEFUSING_EXPLOSIVE" ); + game["bomb_dropped_sound"] = "mpl_flag_drop_plr"; + game["bomb_recovered_sound"] = "mpl_flag_pickup_plr"; + precacheshader( "waypoint_bomb" ); + precacheshader( "hud_suitcase_bomb" ); + precacheshader( "waypoint_target" ); + precacheshader( "waypoint_target_a" ); + precacheshader( "waypoint_target_b" ); + precacheshader( "waypoint_defend" ); + precacheshader( "waypoint_defend_a" ); + precacheshader( "waypoint_defend_b" ); + precacheshader( "waypoint_defuse" ); + precacheshader( "waypoint_defuse_a" ); + precacheshader( "waypoint_defuse_b" ); + precacheshader( "compass_waypoint_target" ); + precacheshader( "compass_waypoint_target_a" ); + precacheshader( "compass_waypoint_target_b" ); + precacheshader( "compass_waypoint_defend" ); + precacheshader( "compass_waypoint_defend_a" ); + precacheshader( "compass_waypoint_defend_b" ); + precacheshader( "compass_waypoint_defuse" ); + precacheshader( "compass_waypoint_defuse_a" ); + precacheshader( "compass_waypoint_defuse_b" ); + precachestring( &"MP_EXPLOSIVES_BLOWUP_BY" ); + precachestring( &"MP_EXPLOSIVES_RECOVERED_BY" ); + precachestring( &"MP_EXPLOSIVES_DROPPED_BY" ); + precachestring( &"MP_EXPLOSIVES_PLANTED_BY" ); + precachestring( &"MP_EXPLOSIVES_DEFUSED_BY" ); + precachestring( &"PLATFORM_HOLD_TO_PLANT_EXPLOSIVES" ); + precachestring( &"PLATFORM_HOLD_TO_DEFUSE_EXPLOSIVES" ); + precachestring( &"MP_CANT_PLANT_WITHOUT_BOMB" ); + precachestring( &"MP_PLANTING_EXPLOSIVE" ); + precachestring( &"MP_DEFUSING_EXPLOSIVE" ); } -sd_getteamkillpenalty( einflictor, attacker, smeansofdeath, sweapon ) //checked changed to match cerberus output +sd_getteamkillpenalty( einflictor, attacker, smeansofdeath, sweapon ) { - teamkill_penalty = maps/mp/gametypes/_globallogic_defaults::default_getteamkillpenalty( einflictor, attacker, smeansofdeath, sweapon ); - if ( is_true( self.isdefusing ) || is_true( self.isplanting ) ) - { - teamkill_penalty *= level.teamkillpenaltymultiplier; - } - return teamkill_penalty; + teamkill_penalty = maps\mp\gametypes\_globallogic_defaults::default_getteamkillpenalty( einflictor, attacker, smeansofdeath, sweapon ); + + if ( isdefined( self.isdefusing ) && self.isdefusing || isdefined( self.isplanting ) && self.isplanting ) + teamkill_penalty *= level.teamkillpenaltymultiplier; + + return teamkill_penalty; } -sd_getteamkillscore( einflictor, attacker, smeansofdeath, sweapon ) //checked changed to match cerberus output +sd_getteamkillscore( einflictor, attacker, smeansofdeath, sweapon ) { - teamkill_score = maps/mp/gametypes/_rank::getscoreinfovalue( "team_kill" ); - if ( is_true( self.isdefusing ) || is_true( self.isplanting ) ) - { - teamkill_score *= level.teamkillscoremultiplier; - } - return int( teamkill_score ); + teamkill_score = maps\mp\gametypes\_rank::getscoreinfovalue( "team_kill" ); + + if ( isdefined( self.isdefusing ) && self.isdefusing || isdefined( self.isplanting ) && self.isplanting ) + teamkill_score *= level.teamkillscoremultiplier; + + return int( teamkill_score ); } -onroundswitch() //checked matches cerberus output +onroundswitch() { - if ( !isDefined( game[ "switchedsides" ] ) ) - { - game[ "switchedsides" ] = 0; - } - if ( game[ "teamScores" ][ "allies" ] == ( level.scorelimit - 1 ) && game[ "teamScores" ][ "axis" ] == ( level.scorelimit - 1 ) ) - { - aheadteam = getbetterteam(); - if ( aheadteam != game[ "defenders" ] ) - { - game[ "switchedsides" ] = !game[ "switchedsides" ]; - } - level.halftimetype = "overtime"; - } - else - { - level.halftimetype = "halftime"; - game[ "switchedsides" ] = !game[ "switchedsides" ]; - } + if ( !isdefined( game["switchedsides"] ) ) + game["switchedsides"] = 0; + + if ( game["teamScores"]["allies"] == level.scorelimit - 1 && game["teamScores"]["axis"] == level.scorelimit - 1 ) + { + aheadteam = getbetterteam(); + + if ( aheadteam != game["defenders"] ) + game["switchedsides"] = !game["switchedsides"]; + + level.halftimetype = "overtime"; + } + else + { + level.halftimetype = "halftime"; + game["switchedsides"] = !game["switchedsides"]; + } } -getbetterteam() //checked changed to match cerberus output +getbetterteam() { - kills[ "allies" ] = 0; - kills[ "axis" ] = 0; - deaths[ "allies" ] = 0; - deaths[ "axis" ] = 0; - for ( i = 0; i < level.players.size; i++ ) - { - player = level.players[ i ]; - team = player.pers[ "team" ]; - if ( ( team == "allies" || team == "axis" ) && isDefined( team ) ) - { - kills[ team ] += player.kills; - deaths[ team ] += player.deaths; - } - } - if ( kills[ "allies" ] > kills[ "axis" ] ) - { - return "allies"; - } - else if ( kills[ "axis" ] > kills[ "allies" ] ) - { - return "axis"; - } - if ( deaths[ "allies" ] < deaths[ "axis" ] ) - { - return "allies"; - } - else if ( deaths[ "axis" ] < deaths[ "allies" ] ) - { - return "axis"; - } - if ( randomint( 2 ) == 0 ) - { - return "allies"; - } - return "axis"; + kills["allies"] = 0; + kills["axis"] = 0; + deaths["allies"] = 0; + deaths["axis"] = 0; + + for ( i = 0; i < level.players.size; i++ ) + { + player = level.players[i]; + team = player.pers["team"]; + + if ( isdefined( team ) && ( team == "allies" || team == "axis" ) ) + { + kills[team] += player.kills; + deaths[team] += player.deaths; + } + } + + if ( kills["allies"] > kills["axis"] ) + return "allies"; + else if ( kills["axis"] > kills["allies"] ) + return "axis"; + + if ( deaths["allies"] < deaths["axis"] ) + return "allies"; + else if ( deaths["axis"] < deaths["allies"] ) + return "axis"; + + if ( randomint( 2 ) == 0 ) + return "allies"; + + return "axis"; } -onstartgametype() //checked matches cerberus output +onstartgametype() { - setbombtimer( "A", 0 ); - setmatchflag( "bomb_timer_a", 0 ); - setbombtimer( "B", 0 ); - setmatchflag( "bomb_timer_b", 0 ); - if ( !isDefined( game[ "switchedsides" ] ) ) - { - game[ "switchedsides" ] = 0; - } - if ( game[ "switchedsides" ] ) - { - oldattackers = game[ "attackers" ]; - olddefenders = game[ "defenders" ]; - game[ "attackers" ] = olddefenders; - game[ "defenders" ] = oldattackers; - } - setclientnamemode( "manual_change" ); - game[ "strings" ][ "target_destroyed" ] = &"MP_TARGET_DESTROYED"; - game[ "strings" ][ "bomb_defused" ] = &"MP_BOMB_DEFUSED"; - precachestring( game[ "strings" ][ "target_destroyed" ] ); - precachestring( game[ "strings" ][ "bomb_defused" ] ); - level._effect[ "bombexplosion" ] = loadfx( "maps/mp_maps/fx_mp_exp_bomb" ); - setobjectivetext( game[ "attackers" ], &"OBJECTIVES_SD_ATTACKER" ); - setobjectivetext( game[ "defenders" ], &"OBJECTIVES_SD_DEFENDER" ); - if ( level.splitscreen ) - { - setobjectivescoretext( game[ "attackers" ], &"OBJECTIVES_SD_ATTACKER" ); - setobjectivescoretext( game[ "defenders" ], &"OBJECTIVES_SD_DEFENDER" ); - } - else - { - setobjectivescoretext( game[ "attackers" ], &"OBJECTIVES_SD_ATTACKER_SCORE" ); - setobjectivescoretext( game[ "defenders" ], &"OBJECTIVES_SD_DEFENDER_SCORE" ); - } - setobjectivehinttext( game[ "attackers" ], &"OBJECTIVES_SD_ATTACKER_HINT" ); - setobjectivehinttext( game[ "defenders" ], &"OBJECTIVES_SD_DEFENDER_HINT" ); - allowed = []; - allowed[ 0 ] = "sd"; - allowed[ 1 ] = "bombzone"; - allowed[ 2 ] = "blocker"; - maps/mp/gametypes/_gameobjects::main( allowed ); - maps/mp/gametypes/_spawning::create_map_placed_influencers(); - level.spawnmins = ( 0, 0, 0 ); - level.spawnmaxs = ( 0, 0, 0 ); - maps/mp/gametypes/_spawnlogic::placespawnpoints( "mp_sd_spawn_attacker" ); - maps/mp/gametypes/_spawnlogic::placespawnpoints( "mp_sd_spawn_defender" ); - 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.spawn_start = []; - level.spawn_start[ "axis" ] = maps/mp/gametypes/_spawnlogic::getspawnpointarray( "mp_sd_spawn_defender" ); - level.spawn_start[ "allies" ] = maps/mp/gametypes/_spawnlogic::getspawnpointarray( "mp_sd_spawn_attacker" ); - thread updategametypedvars(); - thread bombs(); + setbombtimer( "A", 0 ); + setmatchflag( "bomb_timer_a", 0 ); + setbombtimer( "B", 0 ); + setmatchflag( "bomb_timer_b", 0 ); + + if ( !isdefined( game["switchedsides"] ) ) + game["switchedsides"] = 0; + + if ( game["switchedsides"] ) + { + oldattackers = game["attackers"]; + olddefenders = game["defenders"]; + game["attackers"] = olddefenders; + game["defenders"] = oldattackers; + } + + setclientnamemode( "manual_change" ); + game["strings"]["target_destroyed"] = &"MP_TARGET_DESTROYED"; + game["strings"]["bomb_defused"] = &"MP_BOMB_DEFUSED"; + precachestring( game["strings"]["target_destroyed"] ); + precachestring( game["strings"]["bomb_defused"] ); + level._effect["bombexplosion"] = loadfx( "maps/mp_maps/fx_mp_exp_bomb" ); + setobjectivetext( game["attackers"], &"OBJECTIVES_SD_ATTACKER" ); + setobjectivetext( game["defenders"], &"OBJECTIVES_SD_DEFENDER" ); + + if ( level.splitscreen ) + { + setobjectivescoretext( game["attackers"], &"OBJECTIVES_SD_ATTACKER" ); + setobjectivescoretext( game["defenders"], &"OBJECTIVES_SD_DEFENDER" ); + } + else + { + setobjectivescoretext( game["attackers"], &"OBJECTIVES_SD_ATTACKER_SCORE" ); + setobjectivescoretext( game["defenders"], &"OBJECTIVES_SD_DEFENDER_SCORE" ); + } + + setobjectivehinttext( game["attackers"], &"OBJECTIVES_SD_ATTACKER_HINT" ); + setobjectivehinttext( game["defenders"], &"OBJECTIVES_SD_DEFENDER_HINT" ); + allowed[0] = "sd"; + allowed[1] = "bombzone"; + allowed[2] = "blocker"; + maps\mp\gametypes\_gameobjects::main( allowed ); + maps\mp\gametypes\_spawning::create_map_placed_influencers(); + level.spawnmins = ( 0, 0, 0 ); + level.spawnmaxs = ( 0, 0, 0 ); + maps\mp\gametypes\_spawnlogic::placespawnpoints( "mp_sd_spawn_attacker" ); + maps\mp\gametypes\_spawnlogic::placespawnpoints( "mp_sd_spawn_defender" ); + 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.spawn_start = []; + level.spawn_start["axis"] = maps\mp\gametypes\_spawnlogic::getspawnpointarray( "mp_sd_spawn_defender" ); + level.spawn_start["allies"] = maps\mp\gametypes\_spawnlogic::getspawnpointarray( "mp_sd_spawn_attacker" ); + thread updategametypedvars(); + thread bombs(); } -onspawnplayerunified() //checked matches cerberus output +onspawnplayerunified() { - self.isplanting = 0; - self.isdefusing = 0; - self.isbombcarrier = 0; - maps/mp/gametypes/_spawning::onspawnplayer_unified(); + self.isplanting = 0; + self.isdefusing = 0; + self.isbombcarrier = 0; + maps\mp\gametypes\_spawning::onspawnplayer_unified(); } -onspawnplayer( predictedspawn ) //checked matches cerberus output +onspawnplayer( predictedspawn ) { - if ( !predictedspawn ) - { - self.isplanting = 0; - self.isdefusing = 0; - self.isbombcarrier = 0; - } - if ( self.pers[ "team" ] == game[ "attackers" ] ) - { - spawnpointname = "mp_sd_spawn_attacker"; - } - else - { - spawnpointname = "mp_sd_spawn_defender"; - } - spawnpoints = maps/mp/gametypes/_spawnlogic::getspawnpointarray( spawnpointname ); - /* + if ( !predictedspawn ) + { + self.isplanting = 0; + self.isdefusing = 0; + self.isbombcarrier = 0; + } + + if ( self.pers["team"] == game["attackers"] ) + spawnpointname = "mp_sd_spawn_attacker"; + else + spawnpointname = "mp_sd_spawn_defender"; + + spawnpoints = maps\mp\gametypes\_spawnlogic::getspawnpointarray( spawnpointname ); /# - assert( spawnpoints.size ); + assert( spawnpoints.size ); #/ - */ - spawnpoint = maps/mp/gametypes/_spawnlogic::getspawnpoint_random( spawnpoints ); - if ( predictedspawn ) - { - self predictspawnpoint( spawnpoint.origin, spawnpoint.angles ); - } - else - { - self spawn( spawnpoint.origin, spawnpoint.angles, "sd" ); - } + spawnpoint = maps\mp\gametypes\_spawnlogic::getspawnpoint_random( spawnpoints ); + + if ( predictedspawn ) + self predictspawnpoint( spawnpoint.origin, spawnpoint.angles ); + else + self spawn( spawnpoint.origin, spawnpoint.angles, "sd" ); } -sd_playerspawnedcb() //checked matches cerberus output +sd_playerspawnedcb() { - level notify( "spawned_player" ); + level notify( "spawned_player" ); } -onplayerkilled( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ) //checked changed to match cerberus output +onplayerkilled( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ) { - thread checkallowspectating(); - if ( isplayer( attacker ) && attacker.pers[ "team" ] != self.pers[ "team" ] ) - { - maps/mp/_scoreevents::processscoreevent( "kill_sd", attacker, self, sweapon ); - } - inbombzone = 0; - for ( index = 0; index < level.bombzones.size; index++ ) - { - dist = distance2d( self.origin, level.bombzones[ index ].curorigin ); - if ( dist < level.defaultoffenseradius ) - { - inbombzone = 1; - } - } - if ( inbombzone && isplayer( attacker ) && attacker.pers[ "team" ] != self.pers[ "team" ] ) - { - if ( game[ "defenders" ] == self.pers[ "team" ] ) - { - attacker maps/mp/_medals::offenseglobalcount(); - attacker addplayerstatwithgametype( "OFFENDS", 1 ); - self recordkillmodifier( "defending" ); - maps/mp/_scoreevents::processscoreevent( "killed_defender", attacker, self, sweapon ); - } - else - { - if ( isDefined( attacker.pers[ "defends" ] ) ) - { - attacker.pers[ "defends" ]++; - attacker.defends = attacker.pers[ "defends" ]; - } - attacker maps/mp/_medals::defenseglobalcount(); - attacker addplayerstatwithgametype( "DEFENDS", 1 ); - self recordkillmodifier( "assaulting" ); - maps/mp/_scoreevents::processscoreevent( "killed_attacker", attacker, self, sweapon ); - } - } - if ( isplayer( attacker ) && attacker.pers[ "team" ] != self.pers[ "team" ] && isDefined( self.isbombcarrier ) && self.isbombcarrier == 1 ) - { - self recordkillmodifier( "carrying" ); - } - if ( self.isplanting == 1 ) - { - self recordkillmodifier( "planting" ); - } - if ( self.isdefusing == 1 ) - { - self recordkillmodifier( "defusing" ); - } + thread checkallowspectating(); + + if ( isplayer( attacker ) && attacker.pers["team"] != self.pers["team"] ) + maps\mp\_scoreevents::processscoreevent( "kill_sd", attacker, self, sweapon ); + + inbombzone = 0; + + for ( index = 0; index < level.bombzones.size; index++ ) + { + dist = distance2d( self.origin, level.bombzones[index].curorigin ); + + if ( dist < level.defaultoffenseradius ) + inbombzone = 1; + } + + if ( inbombzone && isplayer( attacker ) && attacker.pers["team"] != self.pers["team"] ) + { + if ( game["defenders"] == self.pers["team"] ) + { + attacker maps\mp\_medals::offenseglobalcount(); + attacker addplayerstatwithgametype( "OFFENDS", 1 ); + self recordkillmodifier( "defending" ); + maps\mp\_scoreevents::processscoreevent( "killed_defender", attacker, self, sweapon ); + } + else + { + if ( isdefined( attacker.pers["defends"] ) ) + { + attacker.pers["defends"]++; + attacker.defends = attacker.pers["defends"]; + } + + attacker maps\mp\_medals::defenseglobalcount(); + attacker addplayerstatwithgametype( "DEFENDS", 1 ); + self recordkillmodifier( "assaulting" ); + maps\mp\_scoreevents::processscoreevent( "killed_attacker", attacker, self, sweapon ); + } + } + + if ( isplayer( attacker ) && attacker.pers["team"] != self.pers["team"] && isdefined( self.isbombcarrier ) && self.isbombcarrier == 1 ) + self recordkillmodifier( "carrying" ); + + if ( self.isplanting == 1 ) + self recordkillmodifier( "planting" ); + + if ( self.isdefusing == 1 ) + self recordkillmodifier( "defusing" ); } -checkallowspectating() //checked matches cerberus output +checkallowspectating() { - self endon( "disconnect" ); - wait 0.05; - update = 0; - if ( !level.numliveslivesleft && !self.pers[ "lives" ] ) - { - livesleft = 0; - } - else - { - livesleft = 1; - } - if ( !level.alivecount[ game[ "attackers" ] ] && !livesleft ) - { - level.spectateoverride[ game[ "attackers" ] ].allowenemyspectate = 1; - update = 1; - } - if ( !level.alivecount[ game[ "defenders" ] ] && !livesleft ) - { - level.spectateoverride[ game[ "defenders" ] ].allowenemyspectate = 1; - update = 1; - } - if ( update ) - { - maps/mp/gametypes/_spectating::updatespectatesettings(); - } + self endon( "disconnect" ); + wait 0.05; + update = 0; + livesleft = !( level.numlives && !self.pers["lives"] ); + + if ( !level.alivecount[game["attackers"]] && !livesleft ) + { + level.spectateoverride[game["attackers"]].allowenemyspectate = 1; + update = 1; + } + + if ( !level.alivecount[game["defenders"]] && !livesleft ) + { + level.spectateoverride[game["defenders"]].allowenemyspectate = 1; + update = 1; + } + + if ( update ) + maps\mp\gametypes\_spectating::updatespectatesettings(); } -sd_endgame( winningteam, endreasontext ) //checked matches cerberus output +sd_endgame( winningteam, endreasontext ) { - if ( isDefined( winningteam ) ) - { - maps/mp/gametypes/_globallogic_score::giveteamscoreforobjective_delaypostprocessing( winningteam, 1 ); - } - thread maps/mp/gametypes/_globallogic::endgame( winningteam, endreasontext ); + if ( isdefined( winningteam ) ) + maps\mp\gametypes\_globallogic_score::giveteamscoreforobjective_delaypostprocessing( winningteam, 1 ); + + thread maps\mp\gametypes\_globallogic::endgame( winningteam, endreasontext ); } -sd_endgamewithkillcam( winningteam, endreasontext ) //checked matches cerberus output +sd_endgamewithkillcam( winningteam, endreasontext ) { - sd_endgame( winningteam, endreasontext ); + sd_endgame( winningteam, endreasontext ); } -ondeadevent( team ) //checked changed to match cerberus output +ondeadevent( team ) { - if ( level.bombexploded || level.bombdefused ) - { - return; - } - if ( team == "all" ) - { - if ( level.bombplanted ) - { - sd_endgamewithkillcam( game[ "attackers" ], game[ "strings" ][ game[ "defenders" ] + "_eliminated" ] ); - } - else - { - sd_endgamewithkillcam( game[ "defenders" ], game[ "strings" ][ game[ "attackers" ] + "_eliminated" ] ); - } - } - else if ( team == game[ "attackers" ] ) - { - if ( level.bombplanted ) - { - return; - } - sd_endgamewithkillcam( game[ "defenders" ], game[ "strings" ][ game[ "attackers" ] + "_eliminated" ] ); - } - else if ( team == game[ "defenders" ] ) - { - sd_endgamewithkillcam( game[ "attackers" ], game[ "strings" ][ game[ "defenders" ] + "_eliminated" ] ); - } + if ( level.bombexploded || level.bombdefused ) + return; + + if ( team == "all" ) + { + if ( level.bombplanted ) + sd_endgamewithkillcam( game["attackers"], game["strings"][game["defenders"] + "_eliminated"] ); + else + sd_endgamewithkillcam( game["defenders"], game["strings"][game["attackers"] + "_eliminated"] ); + } + else if ( team == game["attackers"] ) + { + if ( level.bombplanted ) + return; + + sd_endgamewithkillcam( game["defenders"], game["strings"][game["attackers"] + "_eliminated"] ); + } + else if ( team == game["defenders"] ) + sd_endgamewithkillcam( game["attackers"], game["strings"][game["defenders"] + "_eliminated"] ); } -ononeleftevent( team ) //checked matches cerberus output +ononeleftevent( team ) { - if ( level.bombexploded || level.bombdefused ) - { - return; - } - warnlastplayer( team ); + if ( level.bombexploded || level.bombdefused ) + return; + + warnlastplayer( team ); } -ontimelimit() //checked matches cerberus output +ontimelimit() { - if ( level.teambased ) - { - sd_endgame( game[ "defenders" ], game[ "strings" ][ "time_limit_reached" ] ); - } - else - { - sd_endgame( undefined, game[ "strings" ][ "time_limit_reached" ] ); - } + if ( level.teambased ) + sd_endgame( game["defenders"], game["strings"]["time_limit_reached"] ); + else + sd_endgame( undefined, game["strings"]["time_limit_reached"] ); } -warnlastplayer( team ) //checked changed to match cerberus output +warnlastplayer( team ) { - if ( !isDefined( level.warnedlastplayer ) ) - { - level.warnedlastplayer = []; - } - if ( isDefined( level.warnedlastplayer[ team ] ) ) - { - return; - } - level.warnedlastplayer[ team ] = 1; - players = level.players; - for ( i = 0; i < players.size; i++ ) - { - player = players[ i ]; - if ( isDefined( player.pers[ "team" ] ) && player.pers[ "team" ] == team && isDefined( player.pers[ "class" ] ) ) - { - if ( player.sessionstate == "playing" && !player.afk ) - { - break; - } - } - } - if ( i == players.size ) - { - return; - } - players[ i ] thread givelastattackerwarning( team ); + if ( !isdefined( level.warnedlastplayer ) ) + level.warnedlastplayer = []; + + if ( isdefined( level.warnedlastplayer[team] ) ) + return; + + level.warnedlastplayer[team] = 1; + players = level.players; + + for ( i = 0; i < players.size; i++ ) + { + player = players[i]; + + if ( isdefined( player.pers["team"] ) && player.pers["team"] == team && isdefined( player.pers["class"] ) ) + { + if ( player.sessionstate == "playing" && !player.afk ) + break; + } + } + + if ( i == players.size ) + return; + + players[i] thread givelastattackerwarning( team ); } -givelastattackerwarning( team ) //checked changed to match cerberus output +givelastattackerwarning( team ) { - self endon( "death" ); - self endon( "disconnect" ); - fullhealthtime = 0; - interval = 0.05; - self.lastmansd = 1; - enemyteam = game[ "defenders" ]; - if ( team == enemyteam ) - { - enemyteam = game[ "attackers" ]; - } - if ( level.alivecount[ enemyteam ] > 2 ) - { - self.lastmansddefeat3enemies = 1; - } - while ( 1 ) - { - if ( self.health != self.maxhealth ) - { - fullhealthtime = 0; - } - else - { - fullhealthtime += interval; - } - wait interval; - if ( self.health == self.maxhealth && fullhealthtime >= 3 ) - { - break; - } - } - self maps/mp/gametypes/_globallogic_audio::leaderdialogonplayer( "last_one" ); - self playlocalsound( "mus_last_stand" ); + self endon( "death" ); + self endon( "disconnect" ); + fullhealthtime = 0; + interval = 0.05; + self.lastmansd = 1; + enemyteam = game["defenders"]; + + if ( team == enemyteam ) + enemyteam = game["attackers"]; + + if ( level.alivecount[enemyteam] > 2 ) + self.lastmansddefeat3enemies = 1; + + while ( true ) + { + if ( self.health != self.maxhealth ) + fullhealthtime = 0; + else + fullhealthtime += interval; + + wait( interval ); + + if ( self.health == self.maxhealth && fullhealthtime >= 3 ) + break; + } + + self maps\mp\gametypes\_globallogic_audio::leaderdialogonplayer( "last_one" ); + self playlocalsound( "mus_last_stand" ); } -updategametypedvars() //checked changed to match cerberus output +updategametypedvars() { - level.planttime = getgametypesetting( "plantTime" ); - level.defusetime = getgametypesetting( "defuseTime" ); - level.bombtimer = getgametypesetting( "bombTimer" ); - level.multibomb = getgametypesetting( "multiBomb" ); - level.teamkillpenaltymultiplier = getgametypesetting( "teamKillPenalty" ); - level.teamkillscoremultiplier = getgametypesetting( "teamKillScore" ); - level.playerkillsmax = getgametypesetting( "playerKillsMax" ); - level.totalkillsmax = getgametypesetting( "totalKillsMax" ); + level.planttime = getgametypesetting( "plantTime" ); + level.defusetime = getgametypesetting( "defuseTime" ); + level.bombtimer = getgametypesetting( "bombTimer" ); + level.multibomb = getgametypesetting( "multiBomb" ); + level.teamkillpenaltymultiplier = getgametypesetting( "teamKillPenalty" ); + level.teamkillscoremultiplier = getgametypesetting( "teamKillScore" ); + level.playerkillsmax = getgametypesetting( "playerKillsMax" ); + level.totalkillsmax = getgametypesetting( "totalKillsMax" ); } -bombs() //checked changed to match cerberus output +bombs() { - level.bombplanted = 0; - level.bombdefused = 0; - level.bombexploded = 0; - trigger = getent( "sd_bomb_pickup_trig", "targetname" ); - if ( !isDefined( trigger ) ) - { - /* + level.bombplanted = 0; + level.bombdefused = 0; + level.bombexploded = 0; + trigger = getent( "sd_bomb_pickup_trig", "targetname" ); + + if ( !isdefined( trigger ) ) + { /# - maps/mp/_utility::error( "No sd_bomb_pickup_trig trigger found in map." ); + maps\mp\_utility::error( "No sd_bomb_pickup_trig trigger found in map." ); #/ - */ - return; - } - visuals = []; - visuals[ 0 ] = getent( "sd_bomb", "targetname" ); - if ( !isDefined( visuals[ 0 ] ) ) - { - /* + return; + } + + visuals[0] = getent( "sd_bomb", "targetname" ); + + if ( !isdefined( visuals[0] ) ) + { /# - maps/mp/_utility::error( "No sd_bomb script_model found in map." ); + maps\mp\_utility::error( "No sd_bomb script_model found in map." ); #/ - */ - return; - } - precachemodel( "prop_suitcase_bomb" ); - precachestring( &"bomb" ); - if ( !level.multibomb ) - { - level.sdbomb = maps/mp/gametypes/_gameobjects::createcarryobject( game[ "attackers" ], trigger, visuals, vectorScale( ( 0, 0, 1 ), 32 ), &"bomb" ); - level.sdbomb maps/mp/gametypes/_gameobjects::allowcarry( "friendly" ); - level.sdbomb maps/mp/gametypes/_gameobjects::set2dicon( "friendly", "compass_waypoint_bomb" ); - level.sdbomb maps/mp/gametypes/_gameobjects::set3dicon( "friendly", "waypoint_bomb" ); - level.sdbomb maps/mp/gametypes/_gameobjects::setvisibleteam( "friendly" ); - level.sdbomb maps/mp/gametypes/_gameobjects::setcarryicon( "hud_suitcase_bomb" ); - level.sdbomb.allowweapons = 1; - level.sdbomb.onpickup = ::onpickup; - level.sdbomb.ondrop = ::ondrop; - } - else - { - trigger delete(); - visuals[ 0 ] delete(); - } - level.bombzones = []; - bombzones = getentarray( "bombzone", "targetname" ); - for ( index = 0; index < bombzones.size; index++ ) - { - trigger = bombzones[ index ]; - visuals = getentarray( bombzones[ index ].target, "targetname" ); - name = istring( trigger.script_label ); - precachestring( name ); - precachestring( istring( "defuse" + trigger.script_label ) ); - bombzone = maps/mp/gametypes/_gameobjects::createuseobject( game[ "defenders" ], trigger, visuals, ( 0, 0, 1 ), name ); - bombzone maps/mp/gametypes/_gameobjects::allowuse( "enemy" ); - bombzone maps/mp/gametypes/_gameobjects::setusetime( level.planttime ); - bombzone maps/mp/gametypes/_gameobjects::setusetext( &"MP_PLANTING_EXPLOSIVE" ); - bombzone maps/mp/gametypes/_gameobjects::setusehinttext( &"PLATFORM_HOLD_TO_PLANT_EXPLOSIVES" ); - if ( !level.multibomb ) - { - bombzone maps/mp/gametypes/_gameobjects::setkeyobject( level.sdbomb ); - } - label = bombzone maps/mp/gametypes/_gameobjects::getlabel(); - bombzone.label = label; - bombzone maps/mp/gametypes/_gameobjects::set2dicon( "friendly", "compass_waypoint_defend" + label ); - bombzone maps/mp/gametypes/_gameobjects::set3dicon( "friendly", "waypoint_defend" + label ); - bombzone maps/mp/gametypes/_gameobjects::set2dicon( "enemy", "compass_waypoint_target" + label ); - bombzone maps/mp/gametypes/_gameobjects::set3dicon( "enemy", "waypoint_target" + label ); - bombzone maps/mp/gametypes/_gameobjects::setvisibleteam( "any" ); - bombzone.onbeginuse = ::onbeginuse; - bombzone.onenduse = ::onenduse; - bombzone.onuse = ::onuseplantobject; - bombzone.oncantuse = ::oncantuse; - bombzone.useweapon = "briefcase_bomb_mp"; - bombzone.visuals[ 0 ].killcament = spawn( "script_model", bombzone.visuals[ 0 ].origin + vectorScale( ( 0, 0, 1 ), 128 ) ); - if ( !level.multibomb ) - { - bombzone.trigger setinvisibletoall(); - } - for ( i = 0; i < visuals.size; i++ ) - { - if ( isDefined( visuals[ i ].script_exploder ) ) - { - bombzone.exploderindex = visuals[ i ].script_exploder; - break; - } - } - level.bombzones[ level.bombzones.size ] = bombzone; - bombzone.bombdefusetrig = getent( visuals[ 0 ].target, "targetname" ); - /* + return; + } + + precachemodel( "prop_suitcase_bomb" ); + precachestring( &"bomb" ); + + if ( !level.multibomb ) + { + level.sdbomb = maps\mp\gametypes\_gameobjects::createcarryobject( game["attackers"], trigger, visuals, vectorscale( ( 0, 0, 1 ), 32.0 ), &"bomb" ); + level.sdbomb maps\mp\gametypes\_gameobjects::allowcarry( "friendly" ); + level.sdbomb maps\mp\gametypes\_gameobjects::set2dicon( "friendly", "compass_waypoint_bomb" ); + level.sdbomb maps\mp\gametypes\_gameobjects::set3dicon( "friendly", "waypoint_bomb" ); + level.sdbomb maps\mp\gametypes\_gameobjects::setvisibleteam( "friendly" ); + level.sdbomb maps\mp\gametypes\_gameobjects::setcarryicon( "hud_suitcase_bomb" ); + level.sdbomb.allowweapons = 1; + level.sdbomb.onpickup = ::onpickup; + level.sdbomb.ondrop = ::ondrop; + } + else + { + trigger delete(); + visuals[0] delete(); + } + + level.bombzones = []; + bombzones = getentarray( "bombzone", "targetname" ); + + for ( index = 0; index < bombzones.size; index++ ) + { + trigger = bombzones[index]; + visuals = getentarray( bombzones[index].target, "targetname" ); + name = istring( trigger.script_label ); + precachestring( name ); + precachestring( istring( "defuse" + trigger.script_label ) ); + bombzone = maps\mp\gametypes\_gameobjects::createuseobject( game["defenders"], trigger, visuals, ( 0, 0, 0 ), name ); + bombzone maps\mp\gametypes\_gameobjects::allowuse( "enemy" ); + bombzone maps\mp\gametypes\_gameobjects::setusetime( level.planttime ); + bombzone maps\mp\gametypes\_gameobjects::setusetext( &"MP_PLANTING_EXPLOSIVE" ); + bombzone maps\mp\gametypes\_gameobjects::setusehinttext( &"PLATFORM_HOLD_TO_PLANT_EXPLOSIVES" ); + + if ( !level.multibomb ) + bombzone maps\mp\gametypes\_gameobjects::setkeyobject( level.sdbomb ); + + label = bombzone maps\mp\gametypes\_gameobjects::getlabel(); + bombzone.label = label; + bombzone maps\mp\gametypes\_gameobjects::set2dicon( "friendly", "compass_waypoint_defend" + label ); + bombzone maps\mp\gametypes\_gameobjects::set3dicon( "friendly", "waypoint_defend" + label ); + bombzone maps\mp\gametypes\_gameobjects::set2dicon( "enemy", "compass_waypoint_target" + label ); + bombzone maps\mp\gametypes\_gameobjects::set3dicon( "enemy", "waypoint_target" + label ); + bombzone maps\mp\gametypes\_gameobjects::setvisibleteam( "any" ); + bombzone.onbeginuse = ::onbeginuse; + bombzone.onenduse = ::onenduse; + bombzone.onuse = ::onuseplantobject; + bombzone.oncantuse = ::oncantuse; + bombzone.useweapon = "briefcase_bomb_mp"; + bombzone.visuals[0].killcament = spawn( "script_model", bombzone.visuals[0].origin + vectorscale( ( 0, 0, 1 ), 128.0 ) ); + + if ( !level.multibomb ) + bombzone.trigger setinvisibletoall(); + + for ( i = 0; i < visuals.size; i++ ) + { + if ( isdefined( visuals[i].script_exploder ) ) + { + bombzone.exploderindex = visuals[i].script_exploder; + break; + } + } + + level.bombzones[level.bombzones.size] = bombzone; + bombzone.bombdefusetrig = getent( visuals[0].target, "targetname" ); /# - assert( isDefined( bombzone.bombdefusetrig ) ); + assert( isdefined( bombzone.bombdefusetrig ) ); #/ - */ - bombzone.bombdefusetrig.origin += vectorScale( ( 0, 0, 1 ), 10000 ); - bombzone.bombdefusetrig.label = label; - } - for ( index = 0; index < level.bombzones.size; index++ ) - { - array = []; - for ( otherindex = 0; otherindex < level.bombzones.size; otherindex++ ) - { - if ( otherindex != index ) - { - array[ array.size ] = level.bombzones[ otherindex ]; - } - } - level.bombzones[ index ].otherbombzones = array; - } + bombzone.bombdefusetrig.origin += vectorscale( ( 0, 0, -1 ), 10000.0 ); + bombzone.bombdefusetrig.label = label; + } + + for ( index = 0; index < level.bombzones.size; index++ ) + { + array = []; + + for ( otherindex = 0; otherindex < level.bombzones.size; otherindex++ ) + { + if ( otherindex != index ) + array[array.size] = level.bombzones[otherindex]; + } + + level.bombzones[index].otherbombzones = array; + } } -onbeginuse( player ) //checked changed to match cerberus output +onbeginuse( player ) { - if ( self maps/mp/gametypes/_gameobjects::isfriendlyteam( player.pers[ "team" ] ) ) - { - player playsound( "mpl_sd_bomb_defuse" ); - player.isdefusing = 1; - player thread maps/mp/gametypes/_battlechatter_mp::gametypespecificbattlechatter( "sd_enemyplant", player.pers[ "team" ] ); - if ( isDefined( level.sdbombmodel ) ) - { - level.sdbombmodel hide(); - } - } - else - { - player.isplanting = 1; - player thread maps/mp/gametypes/_battlechatter_mp::gametypespecificbattlechatter( "sd_friendlyplant", player.pers[ "team" ] ); - if ( level.multibomb ) - { - for ( i = 0; i < self.otherbombzones.size; i++ ) - { - self.otherbombzones[ i ] maps/mp/gametypes/_gameobjects::disableobject(); - } - } - } - player playsound( "fly_bomb_raise_plr" ); + if ( self maps\mp\gametypes\_gameobjects::isfriendlyteam( player.pers["team"] ) ) + { + player playsound( "mpl_sd_bomb_defuse" ); + player.isdefusing = 1; + player thread maps\mp\gametypes\_battlechatter_mp::gametypespecificbattlechatter( "sd_enemyplant", player.pers["team"] ); + + if ( isdefined( level.sdbombmodel ) ) + level.sdbombmodel hide(); + } + else + { + player.isplanting = 1; + player thread maps\mp\gametypes\_battlechatter_mp::gametypespecificbattlechatter( "sd_friendlyplant", player.pers["team"] ); + + if ( level.multibomb ) + { + for ( i = 0; i < self.otherbombzones.size; i++ ) + self.otherbombzones[i] maps\mp\gametypes\_gameobjects::disableobject(); + } + } + + player playsound( "fly_bomb_raise_plr" ); } -onenduse( team, player, result ) //checked changed to match cerberus output +onenduse( team, player, result ) { - if ( !isDefined( player ) ) - { - return; - } - player.isdefusing = 0; - player.isplanting = 0; - player notify( "event_ended" ); - if ( self maps/mp/gametypes/_gameobjects::isfriendlyteam( player.pers[ "team" ] ) ) - { - if ( isDefined( level.sdbombmodel ) && !result ) - { - level.sdbombmodel show(); - } - } - else - { - if ( level.multibomb && !result ) - { - for ( i = 0; i < self.otherbombzones.size; i++ ) - { - self.otherbombzones[ i ] maps/mp/gametypes/_gameobjects::enableobject(); - } - } - } + if ( !isdefined( player ) ) + return; + + player.isdefusing = 0; + player.isplanting = 0; + player notify( "event_ended" ); + + if ( self maps\mp\gametypes\_gameobjects::isfriendlyteam( player.pers["team"] ) ) + { + if ( isdefined( level.sdbombmodel ) && !result ) + level.sdbombmodel show(); + } + else if ( level.multibomb && !result ) + { + for ( i = 0; i < self.otherbombzones.size; i++ ) + self.otherbombzones[i] maps\mp\gametypes\_gameobjects::enableobject(); + } } -oncantuse( player ) //checked matches cerberus output +oncantuse( player ) { - player iprintlnbold( &"MP_CANT_PLANT_WITHOUT_BOMB" ); + player iprintlnbold( &"MP_CANT_PLANT_WITHOUT_BOMB" ); } -onuseplantobject( player ) //checked partially changed to match cerberus output did not change while loop to for loop see github for more info +onuseplantobject( player ) { - if ( !self maps/mp/gametypes/_gameobjects::isfriendlyteam( player.pers[ "team" ] ) ) - { - self maps/mp/gametypes/_gameobjects::setflags( 1 ); - level thread bombplanted( self, player ); - player logstring( "bomb planted: " + self.label ); - index = 0; - while ( index < level.bombzones.size ) - { - if ( level.bombzones[ index ] == self ) - { - index++; - continue; - } - level.bombzones[ index ] maps/mp/gametypes/_gameobjects::disableobject(); - index++; - } - thread playsoundonplayers( "mus_sd_planted" + "_" + level.teampostfix[ player.pers[ "team" ] ] ); - player notify( "bomb_planted" ); - level thread maps/mp/_popups::displayteammessagetoall( &"MP_EXPLOSIVES_PLANTED_BY", player ); - if ( isDefined( player.pers[ "plants" ] ) ) - { - player.pers[ "plants" ]++; - player.plants = player.pers[ "plants" ]; - } - maps/mp/_demo::bookmark( "event", getTime(), player ); - player addplayerstatwithgametype( "PLANTS", 1 ); - maps/mp/gametypes/_globallogic_audio::leaderdialog( "bomb_planted" ); - maps/mp/_scoreevents::processscoreevent( "planted_bomb", player ); - player recordgameevent( "plant" ); - } + if ( !self maps\mp\gametypes\_gameobjects::isfriendlyteam( player.pers["team"] ) ) + { + self maps\mp\gametypes\_gameobjects::setflags( 1 ); + level thread bombplanted( self, player ); + player logstring( "bomb planted: " + self.label ); + + for ( index = 0; index < level.bombzones.size; index++ ) + { + if ( level.bombzones[index] == self ) + continue; + + level.bombzones[index] maps\mp\gametypes\_gameobjects::disableobject(); + } + + thread playsoundonplayers( "mus_sd_planted" + "_" + level.teampostfix[player.pers["team"]] ); + player notify( "bomb_planted" ); + level thread maps\mp\_popups::displayteammessagetoall( &"MP_EXPLOSIVES_PLANTED_BY", player ); + + if ( isdefined( player.pers["plants"] ) ) + { + player.pers["plants"]++; + player.plants = player.pers["plants"]; + } + + maps\mp\_demo::bookmark( "event", gettime(), player ); + player addplayerstatwithgametype( "PLANTS", 1 ); + maps\mp\gametypes\_globallogic_audio::leaderdialog( "bomb_planted" ); + maps\mp\_scoreevents::processscoreevent( "planted_bomb", player ); + player recordgameevent( "plant" ); + } } -onusedefuseobject( player ) //checked matches cerberus output +onusedefuseobject( player ) { - self maps/mp/gametypes/_gameobjects::setflags( 0 ); - player notify( "bomb_defused" ); - player logstring( "bomb defused: " + self.label ); - bbprint( "mpobjective", "gametime %d objtype %s label %s team %s", getTime(), "sd_bombdefuse", self.label, player.pers[ "team" ] ); - level thread bombdefused(); - self maps/mp/gametypes/_gameobjects::disableobject(); - level thread maps/mp/_popups::displayteammessagetoall( &"MP_EXPLOSIVES_DEFUSED_BY", player ); - if ( isDefined( player.pers[ "defuses" ] ) ) - { - player.pers[ "defuses" ]++; - player.defuses = player.pers[ "defuses" ]; - } - player addplayerstatwithgametype( "DEFUSES", 1 ); - maps/mp/_demo::bookmark( "event", getTime(), player ); - maps/mp/gametypes/_globallogic_audio::leaderdialog( "bomb_defused" ); - if ( isDefined( player.lastmansd ) && player.lastmansd == 1 ) - { - maps/mp/_scoreevents::processscoreevent( "defused_bomb_last_man_alive", player ); - } - else - { - maps/mp/_scoreevents::processscoreevent( "defused_bomb", player ); - } - player recordgameevent( "defuse" ); + self maps\mp\gametypes\_gameobjects::setflags( 0 ); + player notify( "bomb_defused" ); + player logstring( "bomb defused: " + self.label ); + bbprint( "mpobjective", "gametime %d objtype %s label %s team %s", gettime(), "sd_bombdefuse", self.label, player.pers["team"] ); + level thread bombdefused(); + self maps\mp\gametypes\_gameobjects::disableobject(); + level thread maps\mp\_popups::displayteammessagetoall( &"MP_EXPLOSIVES_DEFUSED_BY", player ); + + if ( isdefined( player.pers["defuses"] ) ) + { + player.pers["defuses"]++; + player.defuses = player.pers["defuses"]; + } + + player addplayerstatwithgametype( "DEFUSES", 1 ); + maps\mp\_demo::bookmark( "event", gettime(), player ); + maps\mp\gametypes\_globallogic_audio::leaderdialog( "bomb_defused" ); + + if ( isdefined( player.lastmansd ) && player.lastmansd == 1 ) + maps\mp\_scoreevents::processscoreevent( "defused_bomb_last_man_alive", player ); + else + maps\mp\_scoreevents::processscoreevent( "defused_bomb", player ); + + player recordgameevent( "defuse" ); } -ondrop( player ) //checked matches cerberus output +ondrop( player ) { - if ( !level.bombplanted ) - { - maps/mp/gametypes/_globallogic_audio::leaderdialog( "bomb_lost", game[ "attackers" ] ); - if ( isDefined( player ) ) - { - player logstring( "bomb dropped" ); - } - else - { - logstring( "bomb dropped" ); - } - } - player notify( "event_ended" ); - self maps/mp/gametypes/_gameobjects::set3dicon( "friendly", "waypoint_bomb" ); - maps/mp/_utility::playsoundonplayers( game[ "bomb_dropped_sound" ], game[ "attackers" ] ); + if ( !level.bombplanted ) + { + maps\mp\gametypes\_globallogic_audio::leaderdialog( "bomb_lost", game["attackers"] ); + + if ( isdefined( player ) ) + player logstring( "bomb dropped" ); + else + logstring( "bomb dropped" ); + } + + player notify( "event_ended" ); + self maps\mp\gametypes\_gameobjects::set3dicon( "friendly", "waypoint_bomb" ); + maps\mp\_utility::playsoundonplayers( game["bomb_dropped_sound"], game["attackers"] ); } -onpickup( player ) //checked changed to match cerberus output +onpickup( player ) { - player.isbombcarrier = 1; - player recordgameevent( "pickup" ); - self maps/mp/gametypes/_gameobjects::set3dicon( "friendly", "waypoint_defend" ); - if ( !level.bombdefused ) - { - if ( isDefined( player ) && isDefined( player.name ) ) - { - player addplayerstatwithgametype( "PICKUPS", 1 ); - } - team = self maps/mp/gametypes/_gameobjects::getownerteam(); - otherteam = getotherteam( team ); - maps/mp/gametypes/_globallogic_audio::leaderdialog( "bomb_acquired", game[ "attackers" ] ); - player logstring( "bomb taken" ); - } - maps/mp/_utility::playsoundonplayers( game[ "bomb_recovered_sound" ], game[ "attackers" ] ); - for ( i = 0; i < level.bombzones.size; i++ ) - { - level.bombzones[ i ].trigger setinvisibletoall(); - level.bombzones[ i ].trigger setvisibletoplayer( player ); - } + player.isbombcarrier = 1; + player recordgameevent( "pickup" ); + self maps\mp\gametypes\_gameobjects::set3dicon( "friendly", "waypoint_defend" ); + + if ( !level.bombdefused ) + { + if ( isdefined( player ) && isdefined( player.name ) ) + player addplayerstatwithgametype( "PICKUPS", 1 ); + + team = self maps\mp\gametypes\_gameobjects::getownerteam(); + otherteam = getotherteam( team ); + maps\mp\gametypes\_globallogic_audio::leaderdialog( "bomb_acquired", game["attackers"] ); + player logstring( "bomb taken" ); + } + + maps\mp\_utility::playsoundonplayers( game["bomb_recovered_sound"], game["attackers"] ); + + for ( i = 0; i < level.bombzones.size; i++ ) + { + level.bombzones[i].trigger setinvisibletoall(); + level.bombzones[i].trigger setvisibletoplayer( player ); + } } -onreset() //checked matches cerberus output +onreset() { + } -bombplantedmusicdelay() //checked matches cerberus output +bombplantedmusicdelay() { - level endon( "bomb_defused" ); - time = level.bombtimer - 30; - /* + level endon( "bomb_defused" ); + time = level.bombtimer - 30; /# - if ( getDvarInt( #"0BC4784C" ) > 0 ) - { - println( "Music System - waiting to set TIME_OUT: " + time ); + if ( getdvarint( _hash_BC4784C ) > 0 ) + println( "Music System - waiting to set TIME_OUT: " + time ); #/ - } - */ - if ( time > 1 ) - { - wait time; - thread maps/mp/gametypes/_globallogic_audio::set_music_on_team( "TIME_OUT", "both" ); - } + + if ( time > 1 ) + { + wait( time ); + thread maps\mp\gametypes\_globallogic_audio::set_music_on_team( "TIME_OUT", "both" ); + } } -bombplanted( destroyedobj, player ) //checked changed to match cerberus output may need to review order of operations +bombplanted( destroyedobj, player ) { - maps/mp/gametypes/_globallogic_utils::pausetimer(); - level.bombplanted = 1; - team = player.pers[ "team" ]; - destroyedobj.visuals[ 0 ] thread maps/mp/gametypes/_globallogic_utils::playtickingsound( "mpl_sab_ui_suitcasebomb_timer" ); - level thread bombplantedmusicdelay(); - level.tickingobject = destroyedobj.visuals[ 0 ]; - level.timelimitoverride = 1; - setgameendtime( int( getTime() + ( level.bombtimer * 1000 ) ) ); - label = destroyedobj maps/mp/gametypes/_gameobjects::getlabel(); - setmatchflag( "bomb_timer" + label, 1 ); - if ( label == "_a" ) - { - setbombtimer( "A", int( getTime() + ( level.bombtimer * 1000 ) ) ); - } - else - { - setbombtimer( "B", int( getTime() + ( level.bombtimer * 1000 ) ) ); - } - bbprint( "mpobjective", "gametime %d objtype %s label %s team %s", getTime(), "sd_bombplant", label, team ); - if ( !level.multibomb ) - { - level.sdbomb maps/mp/gametypes/_gameobjects::allowcarry( "none" ); - level.sdbomb maps/mp/gametypes/_gameobjects::setvisibleteam( "none" ); - level.sdbomb maps/mp/gametypes/_gameobjects::setdropped(); - level.sdbombmodel = level.sdbomb.visuals[ 0 ]; - } - else - { - for ( index = 0; index < level.players.size; index++ ) - { - if ( isDefined( level.players[ index ].carryicon ) ) - { - level.players[ index ].carryicon destroyelem(); - } - } - trace = bullettrace( player.origin + vectorScale( ( 0, 0, 1 ), 20 ), player.origin - vectorScale( ( 0, 0, 1 ), 2000 ), 0, player ); - tempangle = randomfloat( 360 ); - forward = ( cos( tempangle ), sin( tempangle ), 0 ); - forward = vectornormalize( forward - vectorScale( trace[ "normal" ], vectordot( forward, trace[ "normal" ] ) ) ); - dropangles = vectorToAngle( forward ); - level.sdbombmodel = spawn( "script_model", trace[ "position" ] ); - level.sdbombmodel.angles = dropangles; - level.sdbombmodel setmodel( "prop_suitcase_bomb" ); - } - destroyedobj maps/mp/gametypes/_gameobjects::allowuse( "none" ); - destroyedobj maps/mp/gametypes/_gameobjects::setvisibleteam( "none" ); - label = destroyedobj maps/mp/gametypes/_gameobjects::getlabel(); - trigger = destroyedobj.bombdefusetrig; - trigger.origin = level.sdbombmodel.origin; - visuals = []; - defuseobject = maps/mp/gametypes/_gameobjects::createuseobject( game[ "defenders" ], trigger, visuals, vectorScale( ( 0, 0, 1 ), 32 ), istring( "defuse" + label ) ); - defuseobject maps/mp/gametypes/_gameobjects::allowuse( "friendly" ); - defuseobject maps/mp/gametypes/_gameobjects::setusetime( level.defusetime ); - defuseobject maps/mp/gametypes/_gameobjects::setusetext( &"MP_DEFUSING_EXPLOSIVE" ); - defuseobject maps/mp/gametypes/_gameobjects::setusehinttext( &"PLATFORM_HOLD_TO_DEFUSE_EXPLOSIVES" ); - defuseobject maps/mp/gametypes/_gameobjects::setvisibleteam( "any" ); - defuseobject maps/mp/gametypes/_gameobjects::set2dicon( "friendly", "compass_waypoint_defuse" + label ); - defuseobject maps/mp/gametypes/_gameobjects::set2dicon( "enemy", "compass_waypoint_defend" + label ); - defuseobject maps/mp/gametypes/_gameobjects::set3dicon( "friendly", "waypoint_defuse" + label ); - defuseobject maps/mp/gametypes/_gameobjects::set3dicon( "enemy", "waypoint_defend" + label ); - defuseobject maps/mp/gametypes/_gameobjects::setflags( 1 ); - defuseobject.label = label; - defuseobject.onbeginuse = ::onbeginuse; - defuseobject.onenduse = ::onenduse; - defuseobject.onuse = ::onusedefuseobject; - defuseobject.useweapon = "briefcase_bomb_defuse_mp"; - player.isbombcarrier = 0; - bombtimerwait(); - setbombtimer( "A", 0 ); - setbombtimer( "B", 0 ); - setmatchflag( "bomb_timer_a", 0 ); - setmatchflag( "bomb_timer_b", 0 ); - destroyedobj.visuals[ 0 ] maps/mp/gametypes/_globallogic_utils::stoptickingsound(); - if ( level.gameended || level.bombdefused ) - { - return; - } - level.bombexploded = 1; - bbprint( "mpobjective", "gametime %d objtype %s label %s team %s", getTime(), "sd_bombexplode", label, team ); - explosionorigin = level.sdbombmodel.origin + vectorScale( ( 0, 0, 1 ), 12 ); - level.sdbombmodel hide(); - if ( isDefined( player ) ) - { - destroyedobj.visuals[ 0 ] radiusdamage( explosionorigin, 512, 200, 20, player, "MOD_EXPLOSIVE", "briefcase_bomb_mp" ); - level thread maps/mp/_popups::displayteammessagetoall( &"MP_EXPLOSIVES_BLOWUP_BY", player ); - maps/mp/_scoreevents::processscoreevent( "bomb_detonated", player ); - player addplayerstatwithgametype( "DESTRUCTIONS", 1 ); - player recordgameevent( "destroy" ); - } - else - { - destroyedobj.visuals[ 0 ] radiusdamage( explosionorigin, 512, 200, 20, undefined, "MOD_EXPLOSIVE", "briefcase_bomb_mp" ); - } - rot = randomfloat( 360 ); - explosioneffect = spawnfx( level._effect[ "bombexplosion" ], explosionorigin + vectorScale( ( 0, 0, 1 ), 50 ), ( 0, 0, 1 ), ( cos( rot ), sin( rot ), 0 ) ); - triggerfx( explosioneffect ); - thread playsoundinspace( "mpl_sd_exp_suitcase_bomb_main", explosionorigin ); - if ( isDefined( destroyedobj.exploderindex ) ) - { - exploder( destroyedobj.exploderindex ); - } - for ( index = 0; index < level.bombzones.size; index++ ) - { - level.bombzones[ index ] maps/mp/gametypes/_gameobjects::disableobject(); - } - defuseobject maps/mp/gametypes/_gameobjects::disableobject(); - setgameendtime( 0 ); - wait 3; - sd_endgame( game[ "attackers" ], game[ "strings" ][ "target_destroyed" ] ); + maps\mp\gametypes\_globallogic_utils::pausetimer(); + level.bombplanted = 1; + team = player.pers["team"]; + destroyedobj.visuals[0] thread maps\mp\gametypes\_globallogic_utils::playtickingsound( "mpl_sab_ui_suitcasebomb_timer" ); + level thread bombplantedmusicdelay(); + level.tickingobject = destroyedobj.visuals[0]; + level.timelimitoverride = 1; + setgameendtime( int( gettime() + level.bombtimer * 1000 ) ); + label = destroyedobj maps\mp\gametypes\_gameobjects::getlabel(); + setmatchflag( "bomb_timer" + label, 1 ); + + if ( label == "_a" ) + setbombtimer( "A", int( gettime() + level.bombtimer * 1000 ) ); + else + setbombtimer( "B", int( gettime() + level.bombtimer * 1000 ) ); + + bbprint( "mpobjective", "gametime %d objtype %s label %s team %s", gettime(), "sd_bombplant", label, team ); + + if ( !level.multibomb ) + { + level.sdbomb maps\mp\gametypes\_gameobjects::allowcarry( "none" ); + level.sdbomb maps\mp\gametypes\_gameobjects::setvisibleteam( "none" ); + level.sdbomb maps\mp\gametypes\_gameobjects::setdropped(); + level.sdbombmodel = level.sdbomb.visuals[0]; + } + else + { + for ( index = 0; index < level.players.size; index++ ) + { + if ( isdefined( level.players[index].carryicon ) ) + level.players[index].carryicon destroyelem(); + } + + trace = bullettrace( player.origin + vectorscale( ( 0, 0, 1 ), 20.0 ), player.origin - vectorscale( ( 0, 0, 1 ), 2000.0 ), 0, player ); + tempangle = randomfloat( 360 ); + forward = ( cos( tempangle ), sin( tempangle ), 0 ); + forward = vectornormalize( forward - vectorscale( trace["normal"], vectordot( forward, trace["normal"] ) ) ); + dropangles = vectortoangles( forward ); + level.sdbombmodel = spawn( "script_model", trace["position"] ); + level.sdbombmodel.angles = dropangles; + level.sdbombmodel setmodel( "prop_suitcase_bomb" ); + } + + destroyedobj maps\mp\gametypes\_gameobjects::allowuse( "none" ); + destroyedobj maps\mp\gametypes\_gameobjects::setvisibleteam( "none" ); + label = destroyedobj maps\mp\gametypes\_gameobjects::getlabel(); + trigger = destroyedobj.bombdefusetrig; + trigger.origin = level.sdbombmodel.origin; + visuals = []; + defuseobject = maps\mp\gametypes\_gameobjects::createuseobject( game["defenders"], trigger, visuals, vectorscale( ( 0, 0, 1 ), 32.0 ), istring( "defuse" + label ) ); + defuseobject maps\mp\gametypes\_gameobjects::allowuse( "friendly" ); + defuseobject maps\mp\gametypes\_gameobjects::setusetime( level.defusetime ); + defuseobject maps\mp\gametypes\_gameobjects::setusetext( &"MP_DEFUSING_EXPLOSIVE" ); + defuseobject maps\mp\gametypes\_gameobjects::setusehinttext( &"PLATFORM_HOLD_TO_DEFUSE_EXPLOSIVES" ); + defuseobject maps\mp\gametypes\_gameobjects::setvisibleteam( "any" ); + defuseobject maps\mp\gametypes\_gameobjects::set2dicon( "friendly", "compass_waypoint_defuse" + label ); + defuseobject maps\mp\gametypes\_gameobjects::set2dicon( "enemy", "compass_waypoint_defend" + label ); + defuseobject maps\mp\gametypes\_gameobjects::set3dicon( "friendly", "waypoint_defuse" + label ); + defuseobject maps\mp\gametypes\_gameobjects::set3dicon( "enemy", "waypoint_defend" + label ); + defuseobject maps\mp\gametypes\_gameobjects::setflags( 1 ); + defuseobject.label = label; + defuseobject.onbeginuse = ::onbeginuse; + defuseobject.onenduse = ::onenduse; + defuseobject.onuse = ::onusedefuseobject; + defuseobject.useweapon = "briefcase_bomb_defuse_mp"; + player.isbombcarrier = 0; + bombtimerwait(); + setbombtimer( "A", 0 ); + setbombtimer( "B", 0 ); + setmatchflag( "bomb_timer_a", 0 ); + setmatchflag( "bomb_timer_b", 0 ); + destroyedobj.visuals[0] maps\mp\gametypes\_globallogic_utils::stoptickingsound(); + + if ( level.gameended || level.bombdefused ) + return; + + level.bombexploded = 1; + bbprint( "mpobjective", "gametime %d objtype %s label %s team %s", gettime(), "sd_bombexplode", label, team ); + explosionorigin = level.sdbombmodel.origin + vectorscale( ( 0, 0, 1 ), 12.0 ); + level.sdbombmodel hide(); + + if ( isdefined( player ) ) + { + destroyedobj.visuals[0] radiusdamage( explosionorigin, 512, 200, 20, player, "MOD_EXPLOSIVE", "briefcase_bomb_mp" ); + level thread maps\mp\_popups::displayteammessagetoall( &"MP_EXPLOSIVES_BLOWUP_BY", player ); + maps\mp\_scoreevents::processscoreevent( "bomb_detonated", player ); + player addplayerstatwithgametype( "DESTRUCTIONS", 1 ); + player recordgameevent( "destroy" ); + } + else + destroyedobj.visuals[0] radiusdamage( explosionorigin, 512, 200, 20, undefined, "MOD_EXPLOSIVE", "briefcase_bomb_mp" ); + + rot = randomfloat( 360 ); + explosioneffect = spawnfx( level._effect["bombexplosion"], explosionorigin + vectorscale( ( 0, 0, 1 ), 50.0 ), ( 0, 0, 1 ), ( cos( rot ), sin( rot ), 0 ) ); + triggerfx( explosioneffect ); + thread playsoundinspace( "mpl_sd_exp_suitcase_bomb_main", explosionorigin ); + + if ( isdefined( destroyedobj.exploderindex ) ) + exploder( destroyedobj.exploderindex ); + + for ( index = 0; index < level.bombzones.size; index++ ) + level.bombzones[index] maps\mp\gametypes\_gameobjects::disableobject(); + + defuseobject maps\mp\gametypes\_gameobjects::disableobject(); + setgameendtime( 0 ); + wait 3; + sd_endgame( game["attackers"], game["strings"]["target_destroyed"] ); } -bombtimerwait() //checked matches cerberus output +bombtimerwait() { - level endon( "game_ended" ); - level endon( "bomb_defused" ); - maps/mp/gametypes/_hostmigration::waitlongdurationwithgameendtimeupdate( level.bombtimer ); + level endon( "game_ended" ); + level endon( "bomb_defused" ); + maps\mp\gametypes\_hostmigration::waitlongdurationwithgameendtimeupdate( level.bombtimer ); } -bombdefused() //checked matches cerberus output +bombdefused() { - level.tickingobject maps/mp/gametypes/_globallogic_utils::stoptickingsound(); - level.bombdefused = 1; - setbombtimer( "A", 0 ); - setbombtimer( "B", 0 ); - setmatchflag( "bomb_timer_a", 0 ); - setmatchflag( "bomb_timer_b", 0 ); - level notify( "bomb_defused" ); - thread maps/mp/gametypes/_globallogic_audio::set_music_on_team( "SILENT", "both" ); - wait 1.5; - setgameendtime( 0 ); - sd_endgame( game[ "defenders" ], game[ "strings" ][ "bomb_defused" ] ); + level.tickingobject maps\mp\gametypes\_globallogic_utils::stoptickingsound(); + level.bombdefused = 1; + setbombtimer( "A", 0 ); + setbombtimer( "B", 0 ); + setmatchflag( "bomb_timer_a", 0 ); + setmatchflag( "bomb_timer_b", 0 ); + level notify( "bomb_defused" ); + thread maps\mp\gametypes\_globallogic_audio::set_music_on_team( "SILENT", "both" ); + wait 1.5; + setgameendtime( 0 ); + sd_endgame( game["defenders"], game["strings"]["bomb_defused"] ); } -sd_iskillboosting() //checked matches cerberus output +sd_iskillboosting() { - roundsplayed = maps/mp/_utility::getroundsplayed(); - if ( level.playerkillsmax == 0 ) - { - return 0; - } - if ( game[ "totalKills" ] > ( level.totalkillsmax * ( roundsplayed + 1 ) ) ) - { - return 1; - } - if ( self.kills > ( level.playerkillsmax * ( roundsplayed + 1 ) ) ) - { - return 1; - } - if ( ( self.team == "allies" || self.team == "axis" ) && level.teambased ) - { - if ( game[ "totalKillsTeam" ][ self.team ] > ( level.playerkillsmax * ( roundsplayed + 1 ) ) ) - { - return 1; - } - } - return 0; -} + roundsplayed = maps\mp\_utility::getroundsplayed(); + if ( level.playerkillsmax == 0 ) + return false; + + if ( game["totalKills"] > level.totalkillsmax * ( roundsplayed + 1 ) ) + return true; + + if ( self.kills > level.playerkillsmax * ( roundsplayed + 1 ) ) + return true; + + if ( level.teambased && ( self.team == "allies" || self.team == "axis" ) ) + { + if ( game["totalKillsTeam"][self.team] > level.playerkillsmax * ( roundsplayed + 1 ) ) + return true; + } + + return false; +} diff --git a/Multiplayer Core/patch_mp/maps/mp/gametypes/shrp.gsc b/Multiplayer Core/patch_mp/maps/mp/gametypes/shrp.gsc index d1c97f1..69526c7 100644 --- a/Multiplayer Core/patch_mp/maps/mp/gametypes/shrp.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/gametypes/shrp.gsc @@ -1,680 +1,660 @@ -#include maps/mp/gametypes/_persistence; -#include maps/mp/gametypes/_globallogic_score; -#include maps/mp/_scoreevents; -#include maps/mp/gametypes/_hostmigration; -#include maps/mp/gametypes/_wager; -#include maps/mp/gametypes/_spawnlogic; -#include maps/mp/gametypes/_spawning; -#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 -main() //checked matches cerberus output may need to review order of operations +main() { - maps/mp/gametypes/_globallogic::init(); - maps/mp/gametypes/_callbacksetup::setupcallbacks(); - maps/mp/gametypes/_globallogic::setupcallbacks(); - level.pointsperweaponkill = getgametypesetting( "pointsPerWeaponKill" ); - level.pointspermeleekill = getgametypesetting( "pointsPerMeleeKill" ); - level.shrpweapontimer = getgametypesetting( "weaponTimer" ); - level.shrpweaponnumber = getgametypesetting( "weaponCount" ); - registertimelimit( ( level.shrpweaponnumber * level.shrpweapontimer ) / 60, ( level.shrpweaponnumber * level.shrpweapontimer ) / 60 ); - registerscorelimit( 0, 50000 ); - registerroundlimit( 0, 10 ); - registerroundwinlimit( 0, 10 ); - registernumlives( 0, 100 ); - level.onstartgametype = ::onstartgametype; - level.onspawnplayer = ::onspawnplayer; - level.onspawnplayerunified = ::onspawnplayerunified; - level.onplayerkilled = ::onplayerkilled; - level.onwagerawards = ::onwagerawards; - game[ "dialog" ][ "gametype" ] = "ss_start"; - level.givecustomloadout = ::givecustomloadout; - precachestring( &"MP_SHRP_WEAPONS_CYCLED" ); - precachestring( &"MP_SHRP_PENULTIMATE_RND" ); - precachestring( &"MP_SHRP_PENULTIMATE_MULTIPLIER" ); - precachestring( &"MP_SHRP_RND" ); - precachestring( &"MP_SHRP_FINAL_MULTIPLIER" ); - precachestring( &"MP_SHRP_COUNTDOWN" ); - precacheshader( "perk_times_two" ); - precacheitem( "minigun_wager_mp" ); - precacheitem( "m32_wager_mp" ); - game[ "dialog" ][ "wm_weapons_cycled" ] = "ssharp_cycle_01"; - game[ "dialog" ][ "wm_final_weapon" ] = "ssharp_fweapon"; - game[ "dialog" ][ "wm_bonus_rnd" ] = "ssharp_2multi_00"; - game[ "dialog" ][ "wm_shrp_rnd" ] = "ssharp_sround"; - game[ "dialog" ][ "wm_bonus0" ] = "boost_gen_05"; - game[ "dialog" ][ "wm_bonus1" ] = "boost_gen_05"; - game[ "dialog" ][ "wm_bonus2" ] = "boost_gen_05"; - game[ "dialog" ][ "wm_bonus3" ] = "boost_gen_05"; - game[ "dialog" ][ "wm_bonus4" ] = "boost_gen_05"; - game[ "dialog" ][ "wm_bonus5" ] = "boost_gen_05"; - setscoreboardcolumns( "pointstowin", "kills", "deaths", "stabs", "x2score" ); + maps\mp\gametypes\_globallogic::init(); + maps\mp\gametypes\_callbacksetup::setupcallbacks(); + maps\mp\gametypes\_globallogic::setupcallbacks(); + level.pointsperweaponkill = getgametypesetting( "pointsPerWeaponKill" ); + level.pointspermeleekill = getgametypesetting( "pointsPerMeleeKill" ); + level.shrpweapontimer = getgametypesetting( "weaponTimer" ); + level.shrpweaponnumber = getgametypesetting( "weaponCount" ); + registertimelimit( level.shrpweaponnumber * level.shrpweapontimer / 60, level.shrpweaponnumber * level.shrpweapontimer / 60 ); + registerscorelimit( 0, 50000 ); + registerroundlimit( 0, 10 ); + registerroundwinlimit( 0, 10 ); + registernumlives( 0, 100 ); + level.onstartgametype = ::onstartgametype; + level.onspawnplayer = ::onspawnplayer; + level.onspawnplayerunified = ::onspawnplayerunified; + level.onplayerkilled = ::onplayerkilled; + level.onwagerawards = ::onwagerawards; + game["dialog"]["gametype"] = "ss_start"; + level.givecustomloadout = ::givecustomloadout; + precachestring( &"MP_SHRP_WEAPONS_CYCLED" ); + precachestring( &"MP_SHRP_PENULTIMATE_RND" ); + precachestring( &"MP_SHRP_PENULTIMATE_MULTIPLIER" ); + precachestring( &"MP_SHRP_RND" ); + precachestring( &"MP_SHRP_FINAL_MULTIPLIER" ); + precachestring( &"MP_SHRP_COUNTDOWN" ); + precacheshader( "perk_times_two" ); + precacheitem( "minigun_wager_mp" ); + precacheitem( "m32_wager_mp" ); + game["dialog"]["wm_weapons_cycled"] = "ssharp_cycle_01"; + game["dialog"]["wm_final_weapon"] = "ssharp_fweapon"; + game["dialog"]["wm_bonus_rnd"] = "ssharp_2multi_00"; + game["dialog"]["wm_shrp_rnd"] = "ssharp_sround"; + game["dialog"]["wm_bonus0"] = "boost_gen_05"; + game["dialog"]["wm_bonus1"] = "boost_gen_05"; + game["dialog"]["wm_bonus2"] = "boost_gen_05"; + game["dialog"]["wm_bonus3"] = "boost_gen_05"; + game["dialog"]["wm_bonus4"] = "boost_gen_05"; + game["dialog"]["wm_bonus5"] = "boost_gen_05"; + setscoreboardcolumns( "pointstowin", "kills", "deaths", "stabs", "x2score" ); } -onstartgametype() //checked matches cerberus output +onstartgametype() { - setdvar( "scr_disable_weapondrop", 1 ); - setdvar( "scr_xpscale", 0 ); - setdvar( "ui_guncycle", 0 ); - makedvarserverinfo( "ui_guncycle", 0 ); - setclientnamemode( "auto_change" ); - setobjectivetext( "allies", &"OBJECTIVES_SHRP" ); - setobjectivetext( "axis", &"OBJECTIVES_SHRP" ); - attach_compatibility_init(); - if ( level.splitscreen ) - { - setobjectivescoretext( "allies", &"OBJECTIVES_SHRP" ); - setobjectivescoretext( "axis", &"OBJECTIVES_SHRP" ); - } - else - { - setobjectivescoretext( "allies", &"OBJECTIVES_SHRP_SCORE" ); - setobjectivescoretext( "axis", &"OBJECTIVES_SHRP_SCORE" ); - } - setobjectivehinttext( "allies", &"OBJECTIVES_SHRP_HINT" ); - setobjectivehinttext( "axis", &"OBJECTIVES_SHRP_HINT" ); - allowed = []; - allowed[ 0 ] = "shrp"; - maps/mp/gametypes/_gameobjects::main( allowed ); - maps/mp/gametypes/_spawning::create_map_placed_influencers(); - level.spawnmins = ( 0, 0, 0 ); - level.spawnmaxs = ( 0, 0, 0 ); - newspawns = getentarray( "mp_wager_spawn", "classname" ); - if ( newspawns.size > 0 ) - { - maps/mp/gametypes/_spawnlogic::addspawnpoints( "allies", "mp_wager_spawn" ); - maps/mp/gametypes/_spawnlogic::addspawnpoints( "axis", "mp_wager_spawn" ); - } - else - { - maps/mp/gametypes/_spawnlogic::addspawnpoints( "allies", "mp_dm_spawn" ); - maps/mp/gametypes/_spawnlogic::addspawnpoints( "axis", "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; - maps/mp/gametypes/_wager::addpowerup( "specialty_bulletflinch", "perk", &"PERKS_TOUGHNESS", "perk_warrior" ); - maps/mp/gametypes/_wager::addpowerup( "specialty_movefaster", "perk", &"PERKS_LIGHTWEIGHT", "perk_lightweight" ); - maps/mp/gametypes/_wager::addpowerup( "specialty_fallheight", "perk", &"PERKS_LIGHTWEIGHT", "perk_lightweight" ); - maps/mp/gametypes/_wager::addpowerup( "specialty_longersprint", "perk", &"PERKS_EXTREME_CONDITIONING", "perk_marathon" ); - maps/mp/gametypes/_wager::addpowerup( 2, "score_multiplier", &"PERKS_SCORE_MULTIPLIER", "perk_times_two" ); - level.guncycletimer = createservertimer( "extrasmall", 1.2 ); - level.guncycletimer.horzalign = "user_left"; - level.guncycletimer.vertalign = "user_top"; - level.guncycletimer.x = 10; - level.guncycletimer.y = 123; - level.guncycletimer.alignx = "left"; - level.guncycletimer.aligny = "top"; - level.guncycletimer.label = &"MP_SHRP_COUNTDOWN"; - level.guncycletimer.alpha = 0; - level.guncycletimer.hidewheninkillcam = 1; - level.displayroundendtext = 0; - level.quickmessagetoall = 1; - level thread chooserandomguns(); - level thread clearpowerupsongameend(); + setdvar( "scr_disable_weapondrop", 1 ); + setdvar( "scr_xpscale", 0 ); + setdvar( "ui_guncycle", 0 ); + makedvarserverinfo( "ui_guncycle", 0 ); + setclientnamemode( "auto_change" ); + setobjectivetext( "allies", &"OBJECTIVES_SHRP" ); + setobjectivetext( "axis", &"OBJECTIVES_SHRP" ); + attach_compatibility_init(); + + if ( level.splitscreen ) + { + setobjectivescoretext( "allies", &"OBJECTIVES_SHRP" ); + setobjectivescoretext( "axis", &"OBJECTIVES_SHRP" ); + } + else + { + setobjectivescoretext( "allies", &"OBJECTIVES_SHRP_SCORE" ); + setobjectivescoretext( "axis", &"OBJECTIVES_SHRP_SCORE" ); + } + + setobjectivehinttext( "allies", &"OBJECTIVES_SHRP_HINT" ); + setobjectivehinttext( "axis", &"OBJECTIVES_SHRP_HINT" ); + allowed[0] = "shrp"; + maps\mp\gametypes\_gameobjects::main( allowed ); + maps\mp\gametypes\_spawning::create_map_placed_influencers(); + level.spawnmins = ( 0, 0, 0 ); + level.spawnmaxs = ( 0, 0, 0 ); + newspawns = getentarray( "mp_wager_spawn", "classname" ); + + if ( newspawns.size > 0 ) + { + maps\mp\gametypes\_spawnlogic::addspawnpoints( "allies", "mp_wager_spawn" ); + maps\mp\gametypes\_spawnlogic::addspawnpoints( "axis", "mp_wager_spawn" ); + } + else + { + maps\mp\gametypes\_spawnlogic::addspawnpoints( "allies", "mp_dm_spawn" ); + maps\mp\gametypes\_spawnlogic::addspawnpoints( "axis", "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; + maps\mp\gametypes\_wager::addpowerup( "specialty_bulletflinch", "perk", &"PERKS_TOUGHNESS", "perk_warrior" ); + maps\mp\gametypes\_wager::addpowerup( "specialty_movefaster", "perk", &"PERKS_LIGHTWEIGHT", "perk_lightweight" ); + maps\mp\gametypes\_wager::addpowerup( "specialty_fallheight", "perk", &"PERKS_LIGHTWEIGHT", "perk_lightweight" ); + maps\mp\gametypes\_wager::addpowerup( "specialty_longersprint", "perk", &"PERKS_EXTREME_CONDITIONING", "perk_marathon" ); + maps\mp\gametypes\_wager::addpowerup( 2, "score_multiplier", &"PERKS_SCORE_MULTIPLIER", "perk_times_two" ); + level.guncycletimer = createservertimer( "extrasmall", 1.2 ); + level.guncycletimer.horzalign = "user_left"; + level.guncycletimer.vertalign = "user_top"; + level.guncycletimer.x = 10; + level.guncycletimer.y = 123; + level.guncycletimer.alignx = "left"; + level.guncycletimer.aligny = "top"; + level.guncycletimer.label = &"MP_SHRP_COUNTDOWN"; + level.guncycletimer.alpha = 0; + level.guncycletimer.hidewheninkillcam = 1; + level.displayroundendtext = 0; + level.quickmessagetoall = 1; + level thread chooserandomguns(); + level thread clearpowerupsongameend(); } -attach_compatibility_init() //checked changed to match cerberus output +attach_compatibility_init() { - level.attach_compatible = []; - set_attachtable_id(); - for ( i = 0; i < 33; i++ ) - { - itemrow = tablelookuprownum( level.attachtableid, 9, i ); - if ( itemrow > -1 ) - { - name = tablelookupcolumnforrow( level.attachtableid, itemrow, 4 ); - level.attach_compatible[ name ] = []; - compatible = tablelookupcolumnforrow( level.attachtableid, itemrow, 11 ); - level.attach_compatible[ name ] = strtok( compatible, " " ); - } - } + level.attach_compatible = []; + set_attachtable_id(); + + for ( i = 0; i < 33; i++ ) + { + itemrow = tablelookuprownum( level.attachtableid, 9, i ); + + if ( itemrow > -1 ) + { + name = tablelookupcolumnforrow( level.attachtableid, itemrow, 4 ); + level.attach_compatible[name] = []; + compatible = tablelookupcolumnforrow( level.attachtableid, itemrow, 11 ); + level.attach_compatible[name] = strtok( compatible, " " ); + } + } } -set_attachtable_id() //checked matches cerberus output +set_attachtable_id() { - if ( !isDefined( level.attachtableid ) ) - { - level.attachtableid = "mp/attachmentTable.csv"; - } + if ( !isdefined( level.attachtableid ) ) + level.attachtableid = "mp/attachmentTable.csv"; } -addguntoprogression( gunname, altname ) //checked matches cerberus output +addguntoprogression( gunname, altname ) { - if ( !isDefined( level.gunprogression ) ) - { - level.gunprogression = []; - } - newweapon = spawnstruct(); - newweapon.names = []; - newweapon.names[ newweapon.names.size ] = gunname; - if ( isDefined( altname ) ) - { - newweapon.names[ newweapon.names.size ] = altname; - } - level.gunprogression[ level.gunprogression.size ] = newweapon; + if ( !isdefined( level.gunprogression ) ) + level.gunprogression = []; + + newweapon = spawnstruct(); + newweapon.names = []; + newweapon.names[newweapon.names.size] = gunname; + + if ( isdefined( altname ) ) + newweapon.names[newweapon.names.size] = altname; + + level.gunprogression[level.gunprogression.size] = newweapon; } -getrandomgunfromprogression() //checked changed to match cerberus output +getrandomgunfromprogression() { - weaponidkeys = getarraykeys( level.tbl_weaponids ); - numweaponidkeys = weaponidkeys.size; - gunprogressionsize = 0; - if ( isDefined( level.gunprogression ) ) - { - size = level.gunprogression.size; - } - /* + weaponidkeys = getarraykeys( level.tbl_weaponids ); + numweaponidkeys = weaponidkeys.size; + gunprogressionsize = 0; + + if ( isdefined( level.gunprogression ) ) + size = level.gunprogression.size; + /# - debug_weapon = getDvar( #"1C6DE858" ); + debug_weapon = getdvar( _hash_1C6DE858 ); #/ - */ - allowproneblock = 1; - players = get_players(); - foreach ( player in players ) - { - if ( player getstance() == "prone" ) - { - allowproneblock = 0; - break; - } - } - while ( 1 ) - { - randomindex = randomint( numweaponidkeys + gunprogressionsize ); - baseweaponname = ""; - weaponname = ""; - if ( randomindex < numweaponidkeys ) - { - id = random( level.tbl_weaponids ); - if ( id[ "group" ] != "weapon_launcher" && id[ "group" ] != "weapon_sniper" && id[ "group" ] != "weapon_lmg" && id[ "group" ] != "weapon_assault" && id[ "group" ] != "weapon_smg" && id[ "group" ] != "weapon_pistol" && id[ "group" ] != "weapon_cqb" && id[ "group" ] != "weapon_special" ) - { - break; - } - if ( id[ "reference" ] == "weapon_null" ) - { - break; - } - baseweaponname = id[ "reference" ]; - attachmentlist = id[ "attachment" ]; - if ( baseweaponname == "m32" ) - { - baseweaponname = "m32_wager"; - } - if ( baseweaponname == "minigun" ) - { - baseweaponname = "minigun_wager"; - } - if ( baseweaponname == "riotshield" ) - { - break; - } - if ( baseweaponname == "peacekeeper" ) - { - break; - } - weaponname = addrandomattachmenttoweaponname( baseweaponname, attachmentlist ); - if ( !allowproneblock && weaponblocksprone( weaponname ) ) - { - break; - } - } - else - { - baseweaponname = level.gunprogression[ randomindex - numweaponidkeys ].names[ 0 ]; - weaponname = level.gunprogression[ randomindex - numweaponidkeys ].names[ 0 ]; - } - if ( !isDefined( level.usedbaseweapons ) ) - { - level.usedbaseweapons = []; - level.usedbaseweapons[ 0 ] = "fhj18"; - } - skipweapon = 0; - for ( i = 0; i < level.usedbaseweapons.size; i++ ) - { - if ( level.usedbaseweapons[ i ] == baseweaponname ) - { - skipweapon = 1; - break; - } - } - if ( skipweapon ) - { - continue; - } - level.usedbaseweapons[ level.usedbaseweapons.size ] = baseweaponname; - /* + allowproneblock = 1; + players = get_players(); + + foreach ( player in players ) + { + if ( player getstance() == "prone" ) + { + allowproneblock = 0; + break; + } + } + + while ( true ) + { + randomindex = randomint( numweaponidkeys + gunprogressionsize ); + baseweaponname = ""; + weaponname = ""; + + if ( randomindex < numweaponidkeys ) + { + id = random( level.tbl_weaponids ); + + if ( id["group"] != "weapon_launcher" && id["group"] != "weapon_sniper" && id["group"] != "weapon_lmg" && id["group"] != "weapon_assault" && id["group"] != "weapon_smg" && id["group"] != "weapon_pistol" && id["group"] != "weapon_cqb" && id["group"] != "weapon_special" ) + continue; + + if ( id["reference"] == "weapon_null" ) + continue; + + baseweaponname = id["reference"]; + attachmentlist = id["attachment"]; + + if ( baseweaponname == "m32" ) + baseweaponname = "m32_wager"; + + if ( baseweaponname == "minigun" ) + baseweaponname = "minigun_wager"; + + if ( baseweaponname == "riotshield" ) + continue; + + if ( getdvarint( "tu6_enableDLCWeapons" ) == 0 && baseweaponname == "peacekeeper" ) + continue; + + weaponname = addrandomattachmenttoweaponname( baseweaponname, attachmentlist ); + + if ( !allowproneblock && weaponblocksprone( weaponname ) ) + continue; + } + else + { + baseweaponname = level.gunprogression[randomindex - numweaponidkeys].names[0]; + weaponname = level.gunprogression[randomindex - numweaponidkeys].names[0]; + } + + if ( !isdefined( level.usedbaseweapons ) ) + { + level.usedbaseweapons = []; + level.usedbaseweapons[0] = "fhj18"; + } + + skipweapon = 0; + + for ( i = 0; i < level.usedbaseweapons.size; i++ ) + { + if ( level.usedbaseweapons[i] == baseweaponname ) + { + skipweapon = 1; + break; + } + } + + if ( skipweapon ) + continue; + + level.usedbaseweapons[level.usedbaseweapons.size] = baseweaponname; /# - if ( debug_weapon != "" ) - { - weaponname = debug_weapon; + if ( debug_weapon != "" ) + weaponname = debug_weapon; #/ - } - */ - return weaponname; - } + return weaponname; + } } -addrandomattachmenttoweaponname( baseweaponname, attachmentlist ) //checked changed to match cerberus output +addrandomattachmenttoweaponname( baseweaponname, attachmentlist ) { - if ( !isDefined( attachmentlist ) ) - { - return baseweaponname; - } - attachments = strtok( attachmentlist, " " ); - arrayremovevalue( attachments, "dw" ); - if ( attachments.size <= 0 ) - { - return baseweaponname + "_mp"; - } - attachments[ attachments.size ] = ""; - attachment = random( attachments ); - if ( attachment == "" ) - { - return baseweaponname + "_mp"; - } - if ( issubstr( attachment, "_" ) ) - { - attachment = strtok( attachment, "_" )[ 0 ]; - } - if ( isDefined( level.attach_compatible[ attachment ] ) && level.attach_compatible[ attachment ].size > 0 ) - { - attachment2 = level.attach_compatible[ attachment ][ randomint( level.attach_compatible[ attachment ].size ) ]; - contains = 0; - for ( i = 0; i < attachments.size; i++ ) - { - if ( isDefined( attachment2 ) && attachments[ i ] == attachment2 ) - { - contains = 1; - break; - } - } - if ( contains ) - { - if ( attachment < attachment2 ) - { - return ( baseweaponname + "_mp+" ) + attachment + "+" + attachment2; - } - return ( baseweaponname + "_mp+" ) + attachment2 + "+" + attachment; - } - } - return ( baseweaponname + "_mp+" ) + attachment; + if ( !isdefined( attachmentlist ) ) + return baseweaponname; + + attachments = strtok( attachmentlist, " " ); + arrayremovevalue( attachments, "dw" ); + + if ( attachments.size <= 0 ) + return baseweaponname + "_mp"; + + attachments[attachments.size] = ""; + attachment = random( attachments ); + + if ( attachment == "" ) + return baseweaponname + "_mp"; + + if ( issubstr( attachment, "_" ) ) + attachment = strtok( attachment, "_" )[0]; + + if ( isdefined( level.attach_compatible[attachment] ) && level.attach_compatible[attachment].size > 0 ) + { + attachment2 = level.attach_compatible[attachment][randomint( level.attach_compatible[attachment].size )]; + contains = 0; + + for ( i = 0; i < attachments.size; i++ ) + { + if ( isdefined( attachment2 ) && attachments[i] == attachment2 ) + { + contains = 1; + break; + } + } + + if ( contains ) + { + if ( attachment < attachment2 ) + return baseweaponname + "_mp+" + attachment + "+" + attachment2; + + return baseweaponname + "_mp+" + attachment2 + "+" + attachment; + } + } + + return baseweaponname + "_mp+" + attachment; } -waitlongdurationwithhostmigrationpause( nextguncycletime, duration ) //checked matches cerberus output may need to review order of operations +waitlongdurationwithhostmigrationpause( nextguncycletime, duration ) { - endtime = getTime() + ( duration * 1000 ); - totaltimepassed = 0; - while ( getTime() < endtime ) - { - maps/mp/gametypes/_hostmigration::waittillhostmigrationstarts( ( endtime - getTime() ) / 1000 ); - if ( isDefined( level.hostmigrationtimer ) ) - { - setdvar( "ui_guncycle", 0 ); - timepassed = maps/mp/gametypes/_hostmigration::waittillhostmigrationdone(); - totaltimepassed += timepassed; - endtime += timepassed; - /* + endtime = gettime() + duration * 1000; + totaltimepassed = 0; + + while ( gettime() < endtime ) + { + maps\mp\gametypes\_hostmigration::waittillhostmigrationstarts( ( endtime - gettime() ) / 1000 ); + + if ( isdefined( level.hostmigrationtimer ) ) + { + setdvar( "ui_guncycle", 0 ); + timepassed = maps\mp\gametypes\_hostmigration::waittillhostmigrationdone(); + totaltimepassed += timepassed; + endtime += timepassed; /# - println( "[SHRP] timePassed = " + timepassed ); - println( "[SHRP] totatTimePassed = " + totaltimepassed ); - println( "[SHRP] level.discardTime = " + level.discardtime ); + println( "[SHRP] timePassed = " + timepassed ); + println( "[SHRP] totatTimePassed = " + totaltimepassed ); + println( "[SHRP] level.discardTime = " + level.discardtime ); #/ - */ - setdvar( "ui_guncycle", nextguncycletime + totaltimepassed ); - } - } - maps/mp/gametypes/_hostmigration::waittillhostmigrationdone(); - return totaltimepassed; + setdvar( "ui_guncycle", nextguncycletime + totaltimepassed ); + } + } + + maps\mp\gametypes\_hostmigration::waittillhostmigrationdone(); + return totaltimepassed; } -guncyclewaiter( nextguncycletime, waittime ) //checked changed to match cerberus output may need to review order of operations +guncyclewaiter( nextguncycletime, waittime ) { - continuecycling = 1; - setdvar( "ui_guncycle", nextguncycletime ); - level.guncycletimer settimer( waittime ); - level.guncycletimer.alpha = 1; - timepassed = waitlongdurationwithhostmigrationpause( nextguncycletime, ( ( nextguncycletime - getTime() ) / 1000 ) - 6 ); - nextguncycletime += timepassed; - for ( i = 6; i > 1; i-- ) - { - for ( j = 0; j < level.players.size; j++ ) - { - level.players[ j ] playlocalsound( "uin_timer_wager_beep" ); - } - timepassed = waitlongdurationwithhostmigrationpause( nextguncycletime, ( nextguncycletime - getTime() ) / 1000 / i ); - nextguncycletime += timepassed; - } - for ( i = 0; i < level.players.size; i++ ) - { - level.players[ i ] playlocalsound( "uin_timer_wager_last_beep" ); - } - if ( ( nextguncycletime - getTime() ) > 0 ) - { - wait ( ( nextguncycletime - getTime() ) / 1000 ); - } - level.shrprandomweapon = getrandomgunfromprogression(); - for ( i = 0; i < level.players.size; i++ ) - { - level.players[ i ] notify( "remove_planted_weapons" ); - level.players[ i ] givecustomloadout( 0, 1 ); - } - return continuecycling; + continuecycling = 1; + setdvar( "ui_guncycle", nextguncycletime ); + level.guncycletimer settimer( waittime ); + level.guncycletimer.alpha = 1; + timepassed = waitlongdurationwithhostmigrationpause( nextguncycletime, ( nextguncycletime - gettime() ) / 1000 - 6 ); + nextguncycletime += timepassed; + + for ( i = 6; i > 1; i-- ) + { + for ( j = 0; j < level.players.size; j++ ) + level.players[j] playlocalsound( "uin_timer_wager_beep" ); + + timepassed = waitlongdurationwithhostmigrationpause( nextguncycletime, ( nextguncycletime - gettime() ) / 1000 / i ); + nextguncycletime += timepassed; + } + + for ( i = 0; i < level.players.size; i++ ) + level.players[i] playlocalsound( "uin_timer_wager_last_beep" ); + + if ( nextguncycletime - gettime() > 0 ) + wait( ( nextguncycletime - gettime() ) / 1000 ); + + level.shrprandomweapon = getrandomgunfromprogression(); + + for ( i = 0; i < level.players.size; i++ ) + { + level.players[i] notify( "remove_planted_weapons" ); + level.players[i] givecustomloadout( 0, 1 ); + } + + return continuecycling; } -chooserandomguns() //checked changed to match cerberus output may need to review order of operations +chooserandomguns() { - level endon( "game_ended" ); - level thread awardmostpointsmedalgameend(); - waittime = level.shrpweapontimer; - lightningwaittime = 15; - level.shrprandomweapon = getrandomgunfromprogression(); - if ( level.inprematchperiod ) - { - level waittill( "prematch_over" ); - } - guncycle = 1; - numguncycles = int( ( ( level.timelimit * 60 ) / waittime ) + 0.5 ); - while ( 1 ) - { - nextguncycletime = getTime() + ( waittime * 1000 ); - ispenultimateround = 0; - issharpshooterround = guncycle == ( numguncycles - 1 ); - for ( i = 0; i < level.players.size; i++ ) - { - level.players[ i ].currentguncyclepoints = 0; - } - level.currentguncyclemaxpoints = 0; - guncyclewaiter( nextguncycletime, waittime ); - for ( i = 0; i < level.players.size; i++ ) - { - player = level.players[ i ]; - if ( ( guncycle + 1 ) == numguncycles ) - { - player maps/mp/gametypes/_wager::wagerannouncer( "wm_final_weapon" ); - } - else - { - player maps/mp/gametypes/_wager::wagerannouncer( "wm_weapons_cycled" ); - } - player checkawardmostpointsthiscycle(); - } - if ( ispenultimateround ) - { - level.sharpshootermultiplier = 2; - for ( i = 0; i < level.players.size; i++ ) - { - level.players[ i ] thread maps/mp/gametypes/_wager::queuewagerpopup( &"MP_SHRP_PENULTIMATE_RND", 0, &"MP_SHRP_PENULTIMATE_MULTIPLIER", "wm_bonus_rnd" ); - } - } - else if ( issharpshooterround ) - { - lastmultiplier = level.sharpshootermultiplier; - if ( !isDefined( lastmultiplier ) ) - { - lastmultiplier = 1; - } - level.sharpshootermultiplier = 2; - setdvar( "ui_guncycle", 0 ); - level.guncycletimer.alpha = 0; - for ( i = 0; i < level.players.size; i++ ) - { - level.players[ i ] thread maps/mp/gametypes/_wager::queuewagerpopup( &"MP_SHRP_RND", 0, &"MP_SHRP_FINAL_MULTIPLIER", "wm_shrp_rnd" ); - } - break; - } - else - { - level.sharpshootermultiplier = 1; - } - guncycle++; - } + level endon( "game_ended" ); + level thread awardmostpointsmedalgameend(); + waittime = level.shrpweapontimer; + lightningwaittime = 15; + level.shrprandomweapon = getrandomgunfromprogression(); + + if ( level.inprematchperiod ) + level waittill( "prematch_over" ); + + guncycle = 1; + numguncycles = int( level.timelimit * 60 / waittime + 0.5 ); + + while ( true ) + { + nextguncycletime = gettime() + waittime * 1000; + ispenultimateround = 0; + issharpshooterround = guncycle == numguncycles - 1; + + for ( i = 0; i < level.players.size; i++ ) + level.players[i].currentguncyclepoints = 0; + + level.currentguncyclemaxpoints = 0; + guncyclewaiter( nextguncycletime, waittime ); + + for ( i = 0; i < level.players.size; i++ ) + { + player = level.players[i]; + + if ( guncycle + 1 == numguncycles ) + player maps\mp\gametypes\_wager::wagerannouncer( "wm_final_weapon" ); + else + player maps\mp\gametypes\_wager::wagerannouncer( "wm_weapons_cycled" ); + + player checkawardmostpointsthiscycle(); + } + + if ( ispenultimateround ) + { + level.sharpshootermultiplier = 2; + + for ( i = 0; i < level.players.size; i++ ) + level.players[i] thread maps\mp\gametypes\_wager::queuewagerpopup( &"MP_SHRP_PENULTIMATE_RND", 0, &"MP_SHRP_PENULTIMATE_MULTIPLIER", "wm_bonus_rnd" ); + } + else if ( issharpshooterround ) + { + lastmultiplier = level.sharpshootermultiplier; + + if ( !isdefined( lastmultiplier ) ) + lastmultiplier = 1; + + level.sharpshootermultiplier = 2; + setdvar( "ui_guncycle", 0 ); + level.guncycletimer.alpha = 0; + + for ( i = 0; i < level.players.size; i++ ) + level.players[i] thread maps\mp\gametypes\_wager::queuewagerpopup( &"MP_SHRP_RND", 0, &"MP_SHRP_FINAL_MULTIPLIER", "wm_shrp_rnd" ); + + break; + } + else + level.sharpshootermultiplier = 1; + + guncycle++; + } } -checkawardmostpointsthiscycle() //checked matches cerberus output +checkawardmostpointsthiscycle() { - if ( isDefined( self.currentguncyclepoints ) && self.currentguncyclepoints > 0 ) - { - if ( self.currentguncyclepoints == level.currentguncyclemaxpoints ) - { - maps/mp/_scoreevents::processscoreevent( "most_points_shrp", self ); - } - } + if ( isdefined( self.currentguncyclepoints ) && self.currentguncyclepoints > 0 ) + { + if ( self.currentguncyclepoints == level.currentguncyclemaxpoints ) + maps\mp\_scoreevents::processscoreevent( "most_points_shrp", self ); + } } -awardmostpointsmedalgameend() //checked changed to match cerberus output +awardmostpointsmedalgameend() { - level waittill( "game_end" ); - for ( i = 0; i < level.players.size; i++ ) - { - level.players[ i ] checkawardmostpointsthiscycle(); - } + level waittill( "game_end" ); + + for ( i = 0; i < level.players.size; i++ ) + level.players[i] checkawardmostpointsthiscycle(); } -givecustomloadout( takeallweapons, alreadyspawned ) //checked matches cerberus output +givecustomloadout( takeallweapons, alreadyspawned ) { - chooserandombody = 0; - if ( !isDefined( alreadyspawned ) || !alreadyspawned ) - { - chooserandombody = 1; - } - self maps/mp/gametypes/_wager::setupblankrandomplayer( takeallweapons, chooserandombody, level.shrprandomweapon ); - self disableweaponcycling(); - self giveweapon( level.shrprandomweapon ); - self switchtoweapon( level.shrprandomweapon ); - self giveweapon( "knife_mp" ); - if ( !isDefined( alreadyspawned ) || !alreadyspawned ) - { - self setspawnweapon( level.shrprandomweapon ); - } - if ( isDefined( takeallweapons ) && !takeallweapons ) - { - self thread takeoldweapons(); - } - else - { - self enableweaponcycling(); - } - return level.shrprandomweapon; + chooserandombody = 0; + + if ( !isdefined( alreadyspawned ) || !alreadyspawned ) + chooserandombody = 1; + + self maps\mp\gametypes\_wager::setupblankrandomplayer( takeallweapons, chooserandombody, level.shrprandomweapon ); + self disableweaponcycling(); + self giveweapon( level.shrprandomweapon ); + self switchtoweapon( level.shrprandomweapon ); + self giveweapon( "knife_mp" ); + + if ( !isdefined( alreadyspawned ) || !alreadyspawned ) + self setspawnweapon( level.shrprandomweapon ); + + if ( isdefined( takeallweapons ) && !takeallweapons ) + self thread takeoldweapons(); + else + self enableweaponcycling(); + + return level.shrprandomweapon; } -takeoldweapons() //checked changed at own discretion +takeoldweapons() { - self endon( "disconnect" ); - self endon( "death" ); - for ( ;; ) - { - self waittill( "weapon_change", newweapon ); - if ( newweapon != "none" ) - { - break; - } - } - weaponslist = self getweaponslist(); - for ( i = 0; i < weaponslist.size; i++ ) - { - if ( weaponslist[ i ] != level.shrprandomweapon && weaponslist[ i ] != "knife_mp" ) - { - self takeweapon( weaponslist[ i ] ); - } - } - self enableweaponcycling(); + self endon( "disconnect" ); + self endon( "death" ); + + for (;;) + { + self waittill( "weapon_change", newweapon ); + + if ( newweapon != "none" ) + break; + } + + weaponslist = self getweaponslist(); + + for ( i = 0; i < weaponslist.size; i++ ) + { + if ( weaponslist[i] != level.shrprandomweapon && weaponslist[i] != "knife_mp" ) + self takeweapon( weaponslist[i] ); + } + + self enableweaponcycling(); } -onplayerkilled( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ) //checked partially changed to match cerberus output did not changed while loop to for loop see githb for more info +onplayerkilled( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ) { - if ( isDefined( attacker ) && isplayer( attacker ) && attacker != self ) - { - if ( isDefined( level.sharpshootermultiplier ) && level.sharpshootermultiplier == 2 ) - { - if ( !isDefined( attacker.pers[ "x2kills" ] ) ) - { - attacker.pers[ "x2kills" ] = 1; - } - else - { - attacker.pers[ "x2kills" ]++; - } - attacker.x2kills = attacker.pers[ "x2kills" ]; - } - else if ( isDefined( level.sharpshootermultiplier ) && level.sharpshootermultiplier == 3 ) - { - if ( !isDefined( attacker.pers[ "x3kills" ] ) ) - { - attacker.pers[ "x3kills" ] = 1; - } - else - { - attacker.pers[ "x3kills" ]++; - } - attacker.x2kills = attacker.pers[ "x3kills" ]; - } - if ( isDefined( self.scoremultiplier ) && self.scoremultiplier >= 2 ) - { - maps/mp/_scoreevents::processscoreevent( "kill_x2_score_shrp", attacker, self, sweapon ); - } - currentbonus = attacker.currentbonus; - if ( !isDefined( currentbonus ) ) - { - currentbonus = 0; - } - if ( currentbonus < level.poweruplist.size ) - { - attacker maps/mp/gametypes/_wager::givepowerup( level.poweruplist[ currentbonus ] ); - attacker thread maps/mp/gametypes/_wager::wagerannouncer( "wm_bonus" + currentbonus ); - if ( level.poweruplist[ currentbonus ].type == "score_multiplier" && attacker.scoremultiplier == 2 ) - { - maps/mp/_scoreevents::processscoreevent( "x2_score_shrp", attacker, self, sweapon ); - } - currentbonus++; - attacker.currentbonus = currentbonus; - } - if ( currentbonus >= level.poweruplist.size ) - { - if ( isDefined( attacker.powerups ) && isDefined( attacker.powerups.size ) && attacker.powerups.size > 0 ) - { - attacker thread maps/mp/gametypes/_wager::pulsepowerupicon( attacker.powerups.size - 1 ); - } - } - scoremultiplier = 1; - if ( isDefined( attacker.scoremultiplier ) ) - { - scoremultiplier = attacker.scoremultiplier; - } - if ( isDefined( level.sharpshootermultiplier ) ) - { - scoremultiplier *= level.sharpshootermultiplier; - } - scoreincrease = attacker.pointstowin; - i = 1; - while ( i <= scoremultiplier ) - { - if ( smeansofdeath == "MOD_MELEE" && level.shrprandomweapon != "knife_mp" && level.shrprandomweapon != "riotshield_mp" ) - { - attacker maps/mp/gametypes/_globallogic_score::givepointstowin( level.pointspermeleekill ); - if ( i != 1 ) - { - maps/mp/_scoreevents::processscoreevent( "kill", attacker, self, sweapon ); - maps/mp/_scoreevents::processscoreevent( "wager_melee_kill", attacker, self, sweapon ); - } - i++; - continue; - } - attacker maps/mp/gametypes/_globallogic_score::givepointstowin( level.pointsperweaponkill ); - if ( !isDefined( attacker.currentguncyclepoints ) ) - { - attacker.currentguncyclepoints = 0; - } - attacker.currentguncyclepoints += level.pointsperweaponkill; - if ( level.currentguncyclemaxpoints < attacker.currentguncyclepoints ) - { - level.currentguncyclemaxpoints = attacker.currentguncyclepoints; - } - if ( i != 1 ) - { - maps/mp/_scoreevents::processscoreevent( "kill", attacker, self, sweapon ); - } - i++; - } - scoreincrease = attacker.pointstowin - scoreincrease; - if ( scoremultiplier > 1 || isDefined( level.sharpshootermultiplier ) && level.sharpshootermultiplier > 1 ) - { - attacker playlocalsound( "uin_alert_cash_register" ); - attacker.pers[ "x2score" ] += scoreincrease; - attacker.x2score = attacker.pers[ "x2score" ]; - } - } - self.currentbonus = 0; - self.scoremultiplier = 1; - self maps/mp/gametypes/_wager::clearpowerups(); + if ( isdefined( attacker ) && isplayer( attacker ) && attacker != self ) + { + if ( isdefined( level.sharpshootermultiplier ) && level.sharpshootermultiplier == 2 ) + { + if ( !isdefined( attacker.pers["x2kills"] ) ) + attacker.pers["x2kills"] = 1; + else + attacker.pers["x2kills"]++; + + attacker.x2kills = attacker.pers["x2kills"]; + } + else if ( isdefined( level.sharpshootermultiplier ) && level.sharpshootermultiplier == 3 ) + { + if ( !isdefined( attacker.pers["x3kills"] ) ) + attacker.pers["x3kills"] = 1; + else + attacker.pers["x3kills"]++; + + attacker.x2kills = attacker.pers["x3kills"]; + } + + if ( isdefined( self.scoremultiplier ) && self.scoremultiplier >= 2 ) + maps\mp\_scoreevents::processscoreevent( "kill_x2_score_shrp", attacker, self, sweapon ); + + currentbonus = attacker.currentbonus; + + if ( !isdefined( currentbonus ) ) + currentbonus = 0; + + if ( currentbonus < level.poweruplist.size ) + { + attacker maps\mp\gametypes\_wager::givepowerup( level.poweruplist[currentbonus] ); + attacker thread maps\mp\gametypes\_wager::wagerannouncer( "wm_bonus" + currentbonus ); + + if ( level.poweruplist[currentbonus].type == "score_multiplier" && attacker.scoremultiplier == 2 ) + maps\mp\_scoreevents::processscoreevent( "x2_score_shrp", attacker, self, sweapon ); + + currentbonus++; + attacker.currentbonus = currentbonus; + } + + if ( currentbonus >= level.poweruplist.size ) + { + if ( isdefined( attacker.powerups ) && isdefined( attacker.powerups.size ) && attacker.powerups.size > 0 ) + attacker thread maps\mp\gametypes\_wager::pulsepowerupicon( attacker.powerups.size - 1 ); + } + + scoremultiplier = 1; + + if ( isdefined( attacker.scoremultiplier ) ) + scoremultiplier = attacker.scoremultiplier; + + if ( isdefined( level.sharpshootermultiplier ) ) + scoremultiplier *= level.sharpshootermultiplier; + + scoreincrease = attacker.pointstowin; + + for ( i = 1; i <= scoremultiplier; i++ ) + { + if ( smeansofdeath == "MOD_MELEE" && level.shrprandomweapon != "knife_mp" && level.shrprandomweapon != "riotshield_mp" ) + { + attacker maps\mp\gametypes\_globallogic_score::givepointstowin( level.pointspermeleekill ); + + if ( i != 1 ) + { + maps\mp\_scoreevents::processscoreevent( "kill", attacker, self, sweapon ); + maps\mp\_scoreevents::processscoreevent( "wager_melee_kill", attacker, self, sweapon ); + } + + continue; + } + + attacker maps\mp\gametypes\_globallogic_score::givepointstowin( level.pointsperweaponkill ); + + if ( !isdefined( attacker.currentguncyclepoints ) ) + attacker.currentguncyclepoints = 0; + + attacker.currentguncyclepoints += level.pointsperweaponkill; + + if ( level.currentguncyclemaxpoints < attacker.currentguncyclepoints ) + level.currentguncyclemaxpoints = attacker.currentguncyclepoints; + + if ( i != 1 ) + maps\mp\_scoreevents::processscoreevent( "kill", attacker, self, sweapon ); + } + + scoreincrease = attacker.pointstowin - scoreincrease; + + if ( scoremultiplier > 1 || isdefined( level.sharpshootermultiplier ) && level.sharpshootermultiplier > 1 ) + { + attacker playlocalsound( "uin_alert_cash_register" ); + attacker.pers["x2score"] += scoreincrease; + attacker.x2score = attacker.pers["x2score"]; + } + } + + self.currentbonus = 0; + self.scoremultiplier = 1; + self maps\mp\gametypes\_wager::clearpowerups(); } -onspawnplayerunified() //checked matches cerberus output +onspawnplayerunified() { - maps/mp/gametypes/_spawning::onspawnplayer_unified(); - self thread infiniteammo(); + maps\mp\gametypes\_spawning::onspawnplayer_unified(); + self thread infiniteammo(); } -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, "shrp" ); - self thread infiniteammo(); - } + 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, "shrp" ); + self thread infiniteammo(); + } } -infiniteammo() //checked matches cerberus output +infiniteammo() { - self endon( "death" ); - self endon( "disconnect" ); - for ( ;; ) - { - wait 0.1; - weapon = self getcurrentweapon(); - self givemaxammo( weapon ); - } + self endon( "death" ); + self endon( "disconnect" ); + + for (;;) + { + wait 0.1; + weapon = self getcurrentweapon(); + self givemaxammo( weapon ); + } } -onwagerawards() //checked matches cerberus output +onwagerawards() { - x2kills = self maps/mp/gametypes/_globallogic_score::getpersstat( "x2kills" ); - if ( !isDefined( x2kills ) ) - { - x2kills = 0; - } - self maps/mp/gametypes/_persistence::setafteractionreportstat( "wagerAwards", x2kills, 0 ); - headshots = self maps/mp/gametypes/_globallogic_score::getpersstat( "headshots" ); - if ( !isDefined( headshots ) ) - { - headshots = 0; - } - self maps/mp/gametypes/_persistence::setafteractionreportstat( "wagerAwards", headshots, 1 ); - bestkillstreak = self maps/mp/gametypes/_globallogic_score::getpersstat( "best_kill_streak" ); - if ( !isDefined( bestkillstreak ) ) - { - bestkillstreak = 0; - } - self maps/mp/gametypes/_persistence::setafteractionreportstat( "wagerAwards", bestkillstreak, 2 ); + x2kills = self maps\mp\gametypes\_globallogic_score::getpersstat( "x2kills" ); + + if ( !isdefined( x2kills ) ) + x2kills = 0; + + self maps\mp\gametypes\_persistence::setafteractionreportstat( "wagerAwards", x2kills, 0 ); + headshots = self maps\mp\gametypes\_globallogic_score::getpersstat( "headshots" ); + + if ( !isdefined( headshots ) ) + headshots = 0; + + self maps\mp\gametypes\_persistence::setafteractionreportstat( "wagerAwards", headshots, 1 ); + bestkillstreak = self maps\mp\gametypes\_globallogic_score::getpersstat( "best_kill_streak" ); + + if ( !isdefined( bestkillstreak ) ) + bestkillstreak = 0; + + self maps\mp\gametypes\_persistence::setafteractionreportstat( "wagerAwards", bestkillstreak, 2 ); } -clearpowerupsongameend() //checked changed to match cerberus output +clearpowerupsongameend() { - level waittill( "game_ended" ); - for ( i = 0; i < level.players.size; i++ ) - { - player = level.players[ i ]; - player maps/mp/gametypes/_wager::clearpowerups(); - } -} + level waittill( "game_ended" ); + for ( i = 0; i < level.players.size; i++ ) + { + player = level.players[i]; + player maps\mp\gametypes\_wager::clearpowerups(); + } +} diff --git a/Multiplayer Core/patch_mp/maps/mp/gametypes/tdm.gsc b/Multiplayer Core/patch_mp/maps/mp/gametypes/tdm.gsc index c44c46c..611341c 100644 --- a/Multiplayer Core/patch_mp/maps/mp/gametypes/tdm.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/gametypes/tdm.gsc @@ -1,288 +1,259 @@ -#include maps/mp/gametypes/_globallogic_audio; -#include maps/mp/gametypes/_globallogic_score; -#include maps/mp/gametypes/_spawnlogic; -#include maps/mp/gametypes/_spawning; -#include maps/mp/gametypes/_gameobjects; -#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() { - if ( getDvar( "mapname" ) == "mp_background" ) - { - return; - } - maps/mp/gametypes/_globallogic::init(); - maps/mp/gametypes/_callbacksetup::setupcallbacks(); - maps/mp/gametypes/_globallogic::setupcallbacks(); - maps/mp/_utility::registerroundswitch( 0, 9 ); - maps/mp/_utility::registertimelimit( 0, 1440 ); - maps/mp/_utility::registerscorelimit( 0, 50000 ); - maps/mp/_utility::registerroundlimit( 0, 10 ); - maps/mp/_utility::registerroundwinlimit( 0, 10 ); - maps/mp/_utility::registernumlives( 0, 100 ); - maps/mp/gametypes/_globallogic::registerfriendlyfiredelay( level.gametype, 15, 0, 1440 ); - level.scoreroundbased = getgametypesetting( "roundscorecarry" ) == 0; - level.teamscoreperkill = getgametypesetting( "teamScorePerKill" ); - level.teamscoreperdeath = getgametypesetting( "teamScorePerDeath" ); - level.teamscoreperheadshot = getgametypesetting( "teamScorePerHeadshot" ); - level.teambased = 1; - level.overrideteamscore = 1; - level.onstartgametype = ::onstartgametype; - level.onspawnplayer = ::onspawnplayer; - level.onspawnplayerunified = ::onspawnplayerunified; - level.onroundendgame = ::onroundendgame; - level.onroundswitch = ::onroundswitch; - level.onplayerkilled = ::onplayerkilled; - game[ "dialog" ][ "gametype" ] = "tdm_start"; - game[ "dialog" ][ "gametype_hardcore" ] = "hctdm_start"; - game[ "dialog" ][ "offense_obj" ] = "generic_boost"; - game[ "dialog" ][ "defense_obj" ] = "generic_boost"; - setscoreboardcolumns( "score", "kills", "deaths", "kdratio", "assists" ); + if ( getdvar( "mapname" ) == "mp_background" ) + return; + + maps\mp\gametypes\_globallogic::init(); + maps\mp\gametypes\_callbacksetup::setupcallbacks(); + maps\mp\gametypes\_globallogic::setupcallbacks(); + registerroundswitch( 0, 9 ); + registertimelimit( 0, 1440 ); + registerscorelimit( 0, 50000 ); + registerroundlimit( 0, 10 ); + registerroundwinlimit( 0, 10 ); + registernumlives( 0, 100 ); + maps\mp\gametypes\_globallogic::registerfriendlyfiredelay( level.gametype, 15, 0, 1440 ); + level.scoreroundbased = getgametypesetting( "roundscorecarry" ) == 0; + level.teamscoreperkill = getgametypesetting( "teamScorePerKill" ); + level.teamscoreperdeath = getgametypesetting( "teamScorePerDeath" ); + level.teamscoreperheadshot = getgametypesetting( "teamScorePerHeadshot" ); + level.teambased = 1; + level.overrideteamscore = 1; + level.onstartgametype = ::onstartgametype; + level.onspawnplayer = ::onspawnplayer; + level.onspawnplayerunified = ::onspawnplayerunified; + level.onroundendgame = ::onroundendgame; + level.onroundswitch = ::onroundswitch; + level.onplayerkilled = ::onplayerkilled; + game["dialog"]["gametype"] = "tdm_start"; + game["dialog"]["gametype_hardcore"] = "hctdm_start"; + game["dialog"]["offense_obj"] = "generic_boost"; + game["dialog"]["defense_obj"] = "generic_boost"; + setscoreboardcolumns( "score", "kills", "deaths", "kdratio", "assists" ); } -onstartgametype() //checked changed to match cerberus output +onstartgametype() { - setclientnamemode( "auto_change" ); - if ( !isDefined( game[ "switchedsides" ] ) ) - { - game[ "switchedsides" ] = 0; - } - if ( game[ "switchedsides" ] ) - { - oldattackers = game[ "attackers" ]; - olddefenders = game[ "defenders" ]; - game[ "attackers" ] = olddefenders; - game[ "defenders" ] = oldattackers; - } - allowed = []; - allowed[ 0 ] = "tdm"; - level.displayroundendtext = 0; - maps/mp/gametypes/_gameobjects::main( allowed ); - maps/mp/gametypes/_spawning::create_map_placed_influencers(); - level.spawnmins = ( 0, 0, 0 ); - level.spawnmaxs = ( 0, 0, 0 ); - foreach ( team in level.teams ) - { - maps/mp/_utility::setobjectivetext( team, &"OBJECTIVES_TDM" ); - maps/mp/_utility::setobjectivehinttext( team, &"OBJECTIVES_TDM_HINT" ); - if ( level.splitscreen ) - { - maps/mp/_utility::setobjectivescoretext( team, &"OBJECTIVES_TDM" ); - } - else - { - maps/mp/_utility::setobjectivescoretext( team, &"OBJECTIVES_TDM_SCORE" ); - } - maps/mp/gametypes/_spawnlogic::addspawnpoints( team, "mp_tdm_spawn" ); - maps/mp/gametypes/_spawnlogic::placespawnpoints( maps/mp/gametypes/_spawning::gettdmstartspawnname( team ) ); - } - maps/mp/gametypes/_spawning::updateallspawnpoints(); - /* + setclientnamemode( "auto_change" ); + + if ( !isdefined( game["switchedsides"] ) ) + game["switchedsides"] = 0; + + if ( game["switchedsides"] ) + { + oldattackers = game["attackers"]; + olddefenders = game["defenders"]; + game["attackers"] = olddefenders; + game["defenders"] = oldattackers; + } + + allowed[0] = "tdm"; + level.displayroundendtext = 0; + maps\mp\gametypes\_gameobjects::main( allowed ); + maps\mp\gametypes\_spawning::create_map_placed_influencers(); + level.spawnmins = ( 0, 0, 0 ); + level.spawnmaxs = ( 0, 0, 0 ); + + foreach ( team in level.teams ) + { + setobjectivetext( team, &"OBJECTIVES_TDM" ); + setobjectivehinttext( team, &"OBJECTIVES_TDM_HINT" ); + + if ( level.splitscreen ) + setobjectivescoretext( team, &"OBJECTIVES_TDM" ); + else + setobjectivescoretext( team, &"OBJECTIVES_TDM_SCORE" ); + + maps\mp\gametypes\_spawnlogic::addspawnpoints( team, "mp_tdm_spawn" ); + maps\mp\gametypes\_spawnlogic::placespawnpoints( maps\mp\gametypes\_spawning::gettdmstartspawnname( team ) ); + } + + maps\mp\gametypes\_spawning::updateallspawnpoints(); /# - level.spawn_start = []; - _a161 = level.teams; - _k161 = getFirstArrayKey( _a161 ); - while ( isDefined( _k161 ) ) - { - team = _a161[ _k161 ]; - level.spawn_start[ team ] = maps/mp/gametypes/_spawnlogic::getspawnpointarray( maps/mp/gametypes/_spawning::gettdmstartspawnname( team ) ); - _k161 = getNextArrayKey( _a161, _k161 ); + level.spawn_start = []; + + foreach ( team in level.teams ) + level.spawn_start[team] = maps\mp\gametypes\_spawnlogic::getspawnpointarray( maps\mp\gametypes\_spawning::gettdmstartspawnname( team ) ); #/ - } - */ - 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 ); - if ( !maps/mp/_utility::isoneround() ) - { - level.displayroundendtext = 1; - if ( maps/mp/_utility::isscoreroundbased() ) - { - maps/mp/gametypes/_globallogic_score::resetteamscores(); - } - } + 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 ); + + if ( !isoneround() ) + { + level.displayroundendtext = 1; + + if ( isscoreroundbased() ) + maps\mp\gametypes\_globallogic_score::resetteamscores(); + } } -onspawnplayerunified( question ) //checked matches cerberus output +onspawnplayerunified( question ) { - self.usingobj = undefined; - if ( level.usestartspawns && !level.ingraceperiod && !level.playerqueuedrespawn ) - { - level.usestartspawns = 0; - } - spawnteam = self.pers[ "team" ]; - if ( game[ "switchedsides" ] ) - { - spawnteam = maps/mp/_utility::getotherteam( spawnteam ); - } - if ( isDefined( question ) ) - { - question = 1; - } - if ( isDefined( question ) ) - { - question = -1; - } - if ( isDefined( spawnteam ) ) - { - spawnteam = spawnteam; - } - if ( !isDefined( spawnteam ) ) - { - spawnteam = -1; - } - maps/mp/gametypes/_spawning::onspawnplayer_unified(); + self.usingobj = undefined; + + if ( level.usestartspawns && !level.ingraceperiod && !level.playerqueuedrespawn ) + level.usestartspawns = 0; + + spawnteam = self.pers["team"]; + + if ( game["switchedsides"] ) + spawnteam = getotherteam( spawnteam ); + + if ( isdefined( question ) ) + question = 1; + + if ( isdefined( question ) ) + question = -1; + + if ( isdefined( spawnteam ) ) + spawnteam = spawnteam; + + if ( !isdefined( spawnteam ) ) + spawnteam = -1; + + maps\mp\gametypes\_spawning::onspawnplayer_unified(); } -onspawnplayer( predictedspawn, question ) //minor edit to fix spawns +onspawnplayer( predictedspawn, question ) { - pixbeginevent( "TDM:onSpawnPlayer" ); - self.usingobj = undefined; - if ( isDefined( question ) ) - { - question = 1; - } - if ( isDefined( question ) ) - { - question = -1; - } - spawnteam = self.pers[ "team" ]; - if ( isDefined( spawnteam ) ) - { - spawnteam = spawnteam; - } - if ( !isDefined( spawnteam ) ) - { - spawnteam = -1; - } - if ( level.ingraceperiod ) - { - spawnpoints = maps/mp/gametypes/_spawnlogic::getspawnpointarray( maps/mp/gametypes/_spawning::gettdmstartspawnname( spawnteam ) ); - if ( !spawnpoints.size ) - { - spawnpoints = maps/mp/gametypes/_spawnlogic::getspawnpointarray( maps/mp/gametypes/_spawning::getteamstartspawnname( spawnteam, "mp_sab_spawn" ) ); - } - if ( !spawnpoints.size ) - { - if ( game[ "switchedsides" ] ) - { - spawnteam = maps/mp/_utility::getotherteam( spawnteam ); - } - spawnpoints = maps/mp/gametypes/_spawnlogic::getteamspawnpoints( spawnteam ); - spawnpoint = maps/mp/gametypes/_spawnlogic::getspawnpoint_nearteam( spawnpoints ); - } - else - { - spawnpoint = maps/mp/gametypes/_spawnlogic::getspawnpoint_random( spawnpoints ); - } - } - else - { - if ( game[ "switchedsides" ] ) - { - spawnteam = maps/mp/_utility::getotherteam( spawnteam ); - } - spawnpoints = maps/mp/gametypes/_spawnlogic::getteamspawnpoints( spawnteam ); - spawnpoint = maps/mp/gametypes/_spawnlogic::getspawnpoint_nearteam( spawnpoints ); - } - if ( predictedspawn ) - { - self predictspawnpoint( spawnpoint.origin, spawnpoint.angles ); - } - else - { - self spawn( spawnpoint.origin, spawnpoint.angles, "tdm" ); - } - pixendevent(); + pixbeginevent( "TDM:onSpawnPlayer" ); + self.usingobj = undefined; + + if ( isdefined( question ) ) + question = 1; + + if ( isdefined( question ) ) + question = -1; + + spawnteam = self.pers["team"]; + + if ( isdefined( spawnteam ) ) + spawnteam = spawnteam; + + if ( !isdefined( spawnteam ) ) + spawnteam = -1; + + if ( level.ingraceperiod ) + { + spawnpoints = maps\mp\gametypes\_spawnlogic::getspawnpointarray( maps\mp\gametypes\_spawning::gettdmstartspawnname( spawnteam ) ); + + if ( !spawnpoints.size ) + spawnpoints = maps\mp\gametypes\_spawnlogic::getspawnpointarray( maps\mp\gametypes\_spawning::getteamstartspawnname( spawnteam, "mp_sab_spawn" ) ); + + if ( !spawnpoints.size ) + { + if ( game["switchedsides"] ) + spawnteam = getotherteam( spawnteam ); + + spawnpoints = maps\mp\gametypes\_spawnlogic::getteamspawnpoints( spawnteam ); + spawnpoint = maps\mp\gametypes\_spawnlogic::getspawnpoint_nearteam( spawnpoints ); + } + else + spawnpoint = maps\mp\gametypes\_spawnlogic::getspawnpoint_random( spawnpoints ); + } + else + { + if ( game["switchedsides"] ) + spawnteam = getotherteam( spawnteam ); + + spawnpoints = maps\mp\gametypes\_spawnlogic::getteamspawnpoints( spawnteam ); + spawnpoint = maps\mp\gametypes\_spawnlogic::getspawnpoint_nearteam( spawnpoints ); + } + + if ( predictedspawn ) + self predictspawnpoint( spawnpoint.origin, spawnpoint.angles ); + else + self spawn( spawnpoint.origin, spawnpoint.angles, "tdm" ); + + pixendevent(); } -onendgame( winningteam ) //checked matches cerberus output +onendgame( winningteam ) { - if ( isDefined( winningteam ) && isDefined( level.teams[ winningteam ] ) ) - { - maps/mp/gametypes/_globallogic_score::giveteamscoreforobjective( winningteam, 1 ); - } + if ( isdefined( winningteam ) && isdefined( level.teams[winningteam] ) ) + maps\mp\gametypes\_globallogic_score::giveteamscoreforobjective( winningteam, 1 ); } -onroundswitch() //checked changed to match cerberus output +onroundswitch() { - game[ "switchedsides" ] = !game[ "switchedsides" ]; - if ( level.roundscorecarry == 0 ) - { - foreach ( team in level.teams ) - { - [[ level._setteamscore ]]( team, game[ "roundswon" ][ team ] ); - } - } + game["switchedsides"] = !game["switchedsides"]; + + if ( level.roundscorecarry == 0 ) + { + foreach ( team in level.teams ) + [[ level._setteamscore ]]( team, game["roundswon"][team] ); + } } -onroundendgame( roundwinner ) //checked changed to match cerberus output +onroundendgame( roundwinner ) { - if ( level.roundscorecarry == 0 ) - { - foreach ( team in level.teams ) - { - [[ level._setteamscore ]]( team, game[ "roundswon" ][ team ] ); - } - winner = maps/mp/gametypes/_globallogic::determineteamwinnerbygamestat( "roundswon" ); - } - else - { - winner = maps/mp/gametypes/_globallogic::determineteamwinnerbyteamscore(); - } - return winner; + if ( level.roundscorecarry == 0 ) + { + foreach ( team in level.teams ) + [[ level._setteamscore ]]( team, game["roundswon"][team] ); + + winner = maps\mp\gametypes\_globallogic::determineteamwinnerbygamestat( "roundswon" ); + } + else + winner = maps\mp\gametypes\_globallogic::determineteamwinnerbyteamscore(); + + return winner; } -onscoreclosemusic() //added parenthese to fix order of operations +onscoreclosemusic() { - teamscores = []; - while ( !level.gameended ) - { - scorelimit = level.scorelimit; - scorethreshold = scorelimit * 0.1; - scorethresholdstart = abs( scorelimit - scorethreshold ); - scorelimitcheck = scorelimit - 10; - topscore = 0; - runnerupscore = 0; - foreach ( team in level.teams ) - { - score = [[ level._getteamscore ]]( team ); - if ( score > topscore ) - { - runnerupscore = topscore; - topscore = score; - } - if ( score > runnerupscore ) - { - runnerupscore = score; - } - } - scoredif = topscore - runnerupscore; - if ( ( scoredif <= scorethreshold ) && ( scorethresholdstart <= topscore ) ) - { - thread maps/mp/gametypes/_globallogic_audio::set_music_on_team( "TIME_OUT", "both" ); - thread maps/mp/gametypes/_globallogic_audio::actionmusicset(); - return; - } - wait 1; - } + teamscores = []; + + while ( !level.gameended ) + { + scorelimit = level.scorelimit; + scorethreshold = scorelimit * 0.1; + scorethresholdstart = abs( scorelimit - scorethreshold ); + scorelimitcheck = scorelimit - 10; + topscore = 0; + runnerupscore = 0; + + foreach ( team in level.teams ) + { + score = [[ level._getteamscore ]]( team ); + + if ( score > topscore ) + { + runnerupscore = topscore; + topscore = score; + continue; + } + + if ( score > runnerupscore ) + runnerupscore = score; + } + + scoredif = topscore - runnerupscore; + + if ( scoredif <= scorethreshold && scorethresholdstart <= topscore ) + { + thread maps\mp\gametypes\_globallogic_audio::set_music_on_team( "TIME_OUT", "both" ); + thread maps\mp\gametypes\_globallogic_audio::actionmusicset(); + return; + } + + wait 1; + } } -onplayerkilled( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ) //checked matches cerberus output +onplayerkilled( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ) { - if ( isplayer( attacker ) == 0 || attacker.team == self.team ) - { - return; - } - attacker maps/mp/gametypes/_globallogic_score::giveteamscoreforobjective( attacker.team, level.teamscoreperkill ); - self maps/mp/gametypes/_globallogic_score::giveteamscoreforobjective( self.team, level.teamscoreperdeath * -1 ); - if ( smeansofdeath == "MOD_HEAD_SHOT" ) - { - attacker maps/mp/gametypes/_globallogic_score::giveteamscoreforobjective( attacker.team, level.teamscoreperheadshot ); - } -} + if ( isplayer( attacker ) == 0 || attacker.team == self.team ) + return; + attacker maps\mp\gametypes\_globallogic_score::giveteamscoreforobjective( attacker.team, level.teamscoreperkill ); + self maps\mp\gametypes\_globallogic_score::giveteamscoreforobjective( self.team, level.teamscoreperdeath * -1 ); + + if ( smeansofdeath == "MOD_HEAD_SHOT" ) + attacker maps\mp\gametypes\_globallogic_score::giveteamscoreforobjective( attacker.team, level.teamscoreperheadshot ); +} diff --git a/Multiplayer Core/patch_mp/maps/mp/killstreaks/_ai_tank.gsc b/Multiplayer Core/patch_mp/maps/mp/killstreaks/_ai_tank.gsc index f48eb29..8e1535c 100644 --- a/Multiplayer Core/patch_mp/maps/mp/killstreaks/_ai_tank.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/killstreaks/_ai_tank.gsc @@ -1,1449 +1,1420 @@ -#include maps/mp/gametypes/_dev; -#include maps/mp/gametypes/_hud; -#include maps/mp/killstreaks/_radar; -#include maps/mp/killstreaks/_dogs; -#include maps/mp/_scoreevents; -#include maps/mp/_challenges; -#include maps/mp/killstreaks/_remote_weapons; -#include maps/mp/gametypes/_spawning; -#include maps/mp/_entityheadicons; -#include maps/mp/killstreaks/_emp; -#include maps/mp/killstreaks/_killstreakrules; -#include maps/mp/gametypes/_spawnlogic; -#include maps/mp/killstreaks/_airsupport; -#include maps/mp/killstreaks/_supplydrop; -#include maps/mp/killstreaks/_killstreaks; -#include common_scripts/utility; -#include maps/mp/gametypes/_weapons; -#include maps/mp/_utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\_utility; +#include maps\mp\gametypes\_weapons; +#include common_scripts\utility; +#include maps\mp\killstreaks\_killstreaks; +#include maps\mp\killstreaks\_supplydrop; +#include maps\mp\killstreaks\_airsupport; +#include maps\mp\gametypes\_spawnlogic; +#include maps\mp\killstreaks\_killstreakrules; +#include maps\mp\killstreaks\_emp; +#include maps\mp\_entityheadicons; +#include maps\mp\gametypes\_spawning; +#include maps\mp\killstreaks\_remote_weapons; +#include maps\mp\_challenges; +#include maps\mp\_scoreevents; +#include maps\mp\killstreaks\_dogs; +#include maps\mp\killstreaks\_radar; +#include maps\mp\gametypes\_hud; +#include maps\mp\gametypes\_dev; -#using_animtree( "mp_vehicles" ); +#using_animtree("mp_vehicles"); init() { - precachevehicle( "ai_tank_drone_mp" ); - precachemodel( "veh_t6_drone_tank" ); - precachemodel( "veh_t6_drone_tank_alt" ); - precacheitem( "ai_tank_drone_rocket_mp" ); - precacheitem( "killstreak_ai_tank_mp" ); - precacheshader( "mech_check_line" ); - precacheshader( "mech_check_fill" ); - precacheshader( "mech_flame_bar" ); - precacheshader( "mech_flame_arrow_flipped" ); - loadfx( "vehicle/treadfx/fx_treadfx_talon_dirt" ); - loadfx( "vehicle/treadfx/fx_treadfx_talon_concrete" ); - loadfx( "light/fx_vlight_talon_eye_grn" ); - loadfx( "light/fx_vlight_talon_eye_red" ); - loadfx( "weapon/talon/fx_talon_emp_stun" ); - level.ai_tank_minigun_flash_3p = loadfx( "weapon/talon/fx_muz_talon_rocket_flash_1p" ); - registerkillstreak( "inventory_ai_tank_drop_mp", "inventory_ai_tank_drop_mp", "killstreak_ai_tank_drop", "ai_tank_drop_used", ::usekillstreakaitankdrop ); - registerkillstreakaltweapon( "inventory_ai_tank_drop_mp", "ai_tank_drone_gun_mp" ); - registerkillstreakaltweapon( "inventory_ai_tank_drop_mp", "ai_tank_drone_rocket_mp" ); - registerkillstreakremoteoverrideweapon( "inventory_ai_tank_drop_mp", "killstreak_ai_tank_mp" ); - registerkillstreakstrings( "inventory_ai_tank_drop_mp", &"KILLSTREAK_EARNED_AI_TANK_DROP", &"KILLSTREAK_AI_TANK_NOT_AVAILABLE", &"KILLSTREAK_AI_TANK_INBOUND" ); - registerkillstreakdialog( "inventory_ai_tank_drop_mp", "mpl_killstreak_ai_tank", "kls_aitank_used", "", "kls_aitank_enemy", "", "kls_aitank_ready" ); - registerkillstreakdevdvar( "inventory_ai_tank_drop_mp", "scr_giveaitankdrop" ); - registerkillstreak( "ai_tank_drop_mp", "ai_tank_drop_mp", "killstreak_ai_tank_drop", "ai_tank_drop_used", ::usekillstreakaitankdrop ); - registerkillstreakaltweapon( "ai_tank_drop_mp", "ai_tank_drone_gun_mp" ); - registerkillstreakaltweapon( "ai_tank_drop_mp", "ai_tank_drone_rocket_mp" ); - registerkillstreakremoteoverrideweapon( "ai_tank_drop_mp", "killstreak_ai_tank_mp" ); - registerkillstreakstrings( "ai_tank_drop_mp", &"KILLSTREAK_EARNED_AI_TANK_DROP", &"KILLSTREAK_AI_TANK_NOT_AVAILABLE", &"KILLSTREAK_AI_TANK_INBOUND" ); - registerkillstreakdialog( "ai_tank_drop_mp", "mpl_killstreak_ai_tank", "kls_aitank_used", "", "kls_aitank_enemy", "", "kls_aitank_ready" ); - level.ai_tank_fov = cos( 160 ); - level.ai_tank_turret_fire_rate = weaponfiretime( "ai_tank_drone_gun_mp" ); - level.ai_tank_valid_locations = []; - spawns = maps/mp/gametypes/_spawnlogic::getspawnpointarray( "mp_tdm_spawn" ); - level.ai_tank_damage_fx = loadfx( "weapon/talon/fx_talon_damage_state" ); - level.ai_tank_explode_fx = loadfx( "weapon/talon/fx_talon_exp" ); - level.ai_tank_crate_explode_fx = loadfx( "weapon/talon/fx_talon_drop_box" ); - _a73 = spawns; - _k73 = getFirstArrayKey( _a73 ); - while ( isDefined( _k73 ) ) - { - spawn = _a73[ _k73 ]; - level.ai_tank_valid_locations[ level.ai_tank_valid_locations.size ] = spawn.origin; - _k73 = getNextArrayKey( _a73, _k73 ); - } - anims = []; - anims[ anims.size ] = %o_drone_tank_missile1_fire; - anims[ anims.size ] = %o_drone_tank_missile2_fire; - anims[ anims.size ] = %o_drone_tank_missile3_fire; - anims[ anims.size ] = %o_drone_tank_missile_full_reload; - setdvar( "scr_ai_tank_no_timeout", 0 ); + precachevehicle( "ai_tank_drone_mp" ); + precachemodel( "veh_t6_drone_tank" ); + precachemodel( "veh_t6_drone_tank_alt" ); + precacheitem( "ai_tank_drone_rocket_mp" ); + precacheitem( "killstreak_ai_tank_mp" ); + precacheshader( "mech_check_line" ); + precacheshader( "mech_check_fill" ); + precacheshader( "mech_flame_bar" ); + precacheshader( "mech_flame_arrow_flipped" ); + loadfx( "vehicle/treadfx/fx_treadfx_talon_dirt" ); + loadfx( "vehicle/treadfx/fx_treadfx_talon_concrete" ); + loadfx( "light/fx_vlight_talon_eye_grn" ); + loadfx( "light/fx_vlight_talon_eye_red" ); + loadfx( "weapon/talon/fx_talon_emp_stun" ); + level.ai_tank_minigun_flash_3p = loadfx( "weapon/talon/fx_muz_talon_rocket_flash_1p" ); + registerkillstreak( "inventory_ai_tank_drop_mp", "inventory_ai_tank_drop_mp", "killstreak_ai_tank_drop", "ai_tank_drop_used", ::usekillstreakaitankdrop ); + registerkillstreakaltweapon( "inventory_ai_tank_drop_mp", "ai_tank_drone_gun_mp" ); + registerkillstreakaltweapon( "inventory_ai_tank_drop_mp", "ai_tank_drone_rocket_mp" ); + registerkillstreakremoteoverrideweapon( "inventory_ai_tank_drop_mp", "killstreak_ai_tank_mp" ); + registerkillstreakstrings( "inventory_ai_tank_drop_mp", &"KILLSTREAK_EARNED_AI_TANK_DROP", &"KILLSTREAK_AI_TANK_NOT_AVAILABLE", &"KILLSTREAK_AI_TANK_INBOUND" ); + registerkillstreakdialog( "inventory_ai_tank_drop_mp", "mpl_killstreak_ai_tank", "kls_aitank_used", "", "kls_aitank_enemy", "", "kls_aitank_ready" ); + registerkillstreakdevdvar( "inventory_ai_tank_drop_mp", "scr_giveaitankdrop" ); + registerkillstreak( "ai_tank_drop_mp", "ai_tank_drop_mp", "killstreak_ai_tank_drop", "ai_tank_drop_used", ::usekillstreakaitankdrop ); + registerkillstreakaltweapon( "ai_tank_drop_mp", "ai_tank_drone_gun_mp" ); + registerkillstreakaltweapon( "ai_tank_drop_mp", "ai_tank_drone_rocket_mp" ); + registerkillstreakremoteoverrideweapon( "ai_tank_drop_mp", "killstreak_ai_tank_mp" ); + registerkillstreakstrings( "ai_tank_drop_mp", &"KILLSTREAK_EARNED_AI_TANK_DROP", &"KILLSTREAK_AI_TANK_NOT_AVAILABLE", &"KILLSTREAK_AI_TANK_INBOUND" ); + registerkillstreakdialog( "ai_tank_drop_mp", "mpl_killstreak_ai_tank", "kls_aitank_used", "", "kls_aitank_enemy", "", "kls_aitank_ready" ); + level.ai_tank_fov = cos( 160 ); + level.ai_tank_turret_fire_rate = weaponfiretime( "ai_tank_drone_gun_mp" ); + level.ai_tank_valid_locations = []; + spawns = maps\mp\gametypes\_spawnlogic::getspawnpointarray( "mp_tdm_spawn" ); + level.ai_tank_damage_fx = loadfx( "weapon/talon/fx_talon_damage_state" ); + level.ai_tank_explode_fx = loadfx( "weapon/talon/fx_talon_exp" ); + level.ai_tank_crate_explode_fx = loadfx( "weapon/talon/fx_talon_drop_box" ); + + foreach ( spawn in spawns ) + level.ai_tank_valid_locations[level.ai_tank_valid_locations.size] = spawn.origin; + + anims = []; + anims[anims.size] = %o_drone_tank_missile1_fire; + anims[anims.size] = %o_drone_tank_missile2_fire; + anims[anims.size] = %o_drone_tank_missile3_fire; + anims[anims.size] = %o_drone_tank_missile_full_reload; + setdvar( "scr_ai_tank_no_timeout", 0 ); /# - level thread tank_devgui_think(); + level thread tank_devgui_think(); #/ } register() { - registerclientfield( "vehicle", "ai_tank_death", 1, 1, "int" ); - registerclientfield( "vehicle", "ai_tank_hack_spawned", 1, 1, "int" ); - registerclientfield( "vehicle", "ai_tank_hack_rebooting", 1, 1, "int" ); - registerclientfield( "vehicle", "ai_tank_missile_fire", 1, 3, "int" ); + registerclientfield( "vehicle", "ai_tank_death", 1, 1, "int" ); + registerclientfield( "vehicle", "ai_tank_hack_spawned", 1, 1, "int" ); + registerclientfield( "vehicle", "ai_tank_hack_rebooting", 1, 1, "int" ); + registerclientfield( "vehicle", "ai_tank_missile_fire", 1, 3, "int" ); } usekillstreakaitankdrop( hardpointtype ) { - team = self.team; - if ( !self maps/mp/killstreaks/_supplydrop::issupplydropgrenadeallowed( hardpointtype ) ) - { - return 0; - } - killstreak_id = self maps/mp/killstreaks/_killstreakrules::killstreakstart( hardpointtype, team, 0, 0 ); - if ( killstreak_id == -1 ) - { - return 0; - } - result = self maps/mp/killstreaks/_supplydrop::usesupplydropmarker( killstreak_id ); - self notify( "supply_drop_marker_done" ); - if ( !isDefined( result ) || !result ) - { - maps/mp/killstreaks/_killstreakrules::killstreakstop( hardpointtype, team, killstreak_id ); - return 0; - } - return result; + team = self.team; + + if ( !self maps\mp\killstreaks\_supplydrop::issupplydropgrenadeallowed( hardpointtype ) ) + return 0; + + killstreak_id = self maps\mp\killstreaks\_killstreakrules::killstreakstart( hardpointtype, team, 0, 0 ); + + if ( killstreak_id == -1 ) + return 0; + + result = self maps\mp\killstreaks\_supplydrop::usesupplydropmarker( killstreak_id ); + self notify( "supply_drop_marker_done" ); + + if ( !isdefined( result ) || !result ) + { + maps\mp\killstreaks\_killstreakrules::killstreakstop( hardpointtype, team, killstreak_id ); + return 0; + } + + return result; } crateland( crate, weaponname, owner, team ) { - if ( crate valid_location() && isDefined( owner ) || team != owner.team && owner maps/mp/killstreaks/_emp::isenemyempkillstreakactive() ) - { - maps/mp/killstreaks/_killstreakrules::killstreakstop( weaponname, team, crate.package_contents_id ); - wait 10; - crate delete(); - return; - } - origin = crate.origin; - cratebottom = bullettrace( origin, origin + vectorScale( ( 0, 0, 1 ), 50 ), 0, crate ); - if ( isDefined( cratebottom ) ) - { - origin = cratebottom[ "position" ] + ( 0, 0, 1 ); - } - playfx( level.ai_tank_crate_explode_fx, origin, ( 0, 0, 1 ), ( 0, 0, 1 ) ); - playsoundatposition( "veh_talon_crate_exp", crate.origin ); - level thread ai_tank_killstreak_start( owner, origin, crate.package_contents_id, weaponname ); - crate delete(); + if ( !crate valid_location() || !isdefined( owner ) || team != owner.team || owner maps\mp\killstreaks\_emp::isenemyempkillstreakactive() ) + { + maps\mp\killstreaks\_killstreakrules::killstreakstop( weaponname, team, crate.package_contents_id ); + wait 10; + crate delete(); + return; + } + + origin = crate.origin; + cratebottom = bullettrace( origin, origin + vectorscale( ( 0, 0, -1 ), 50.0 ), 0, crate ); + + if ( isdefined( cratebottom ) ) + origin = cratebottom["position"] + ( 0, 0, 1 ); + + playfx( level.ai_tank_crate_explode_fx, origin, ( 1, 0, 0 ), ( 0, 0, 1 ) ); + playsoundatposition( "veh_talon_crate_exp", crate.origin ); + level thread ai_tank_killstreak_start( owner, origin, crate.package_contents_id, weaponname ); + crate delete(); } valid_location() { - node = getnearestnode( self.origin ); - if ( !isDefined( node ) ) - { - return 0; - } - start = self getcentroid(); - end = node.origin + vectorScale( ( 0, 0, 1 ), 8 ); - trace = physicstrace( start, end, ( 0, 0, 1 ), ( 0, 0, 1 ), self, level.physicstracecontentsvehicleclip ); - if ( trace[ "fraction" ] < 1 ) - { - return 0; - } - origin = self.origin + vectorScale( ( 0, 0, 1 ), 32 ); - level.ai_tank_valid_locations = array_randomize( level.ai_tank_valid_locations ); - count = min( level.ai_tank_valid_locations.size, 5 ); - i = 0; - while ( i < count ) - { - if ( findpath( origin, level.ai_tank_valid_locations[ i ], self, 0, 1 ) ) - { - return 1; - } - i++; - } - return 0; + node = getnearestnode( self.origin ); + + if ( !isdefined( node ) ) + return false; + + start = self getcentroid(); + end = node.origin + vectorscale( ( 0, 0, 1 ), 8.0 ); + trace = physicstrace( start, end, ( 0, 0, 0 ), ( 0, 0, 0 ), self, level.physicstracecontentsvehicleclip ); + + if ( trace["fraction"] < 1 ) + return false; + + origin = self.origin + vectorscale( ( 0, 0, 1 ), 32.0 ); + level.ai_tank_valid_locations = array_randomize( level.ai_tank_valid_locations ); + count = min( level.ai_tank_valid_locations.size, 5 ); + + for ( i = 0; i < count; i++ ) + { + if ( findpath( origin, level.ai_tank_valid_locations[i], self, 0, 1 ) ) + return true; + } + + return false; } ai_tank_killstreak_start( owner, origin, killstreak_id, weaponname ) { - waittillframeend; - drone = spawnvehicle( "veh_t6_drone_tank", "talon", "ai_tank_drone_mp", origin, ( 0, 0, 1 ) ); - drone setenemymodel( "veh_t6_drone_tank_alt" ); - drone playloopsound( "veh_talon_idle_npc", 0,2 ); - drone setvehicleavoidance( 1 ); - drone setclientfield( "ai_tank_missile_fire", 4 ); - drone setowner( owner ); - drone.owner = owner; - drone.team = owner.team; - drone.aiteam = owner.team; - drone.killstreak_id = killstreak_id; - drone.type = "tank_drone"; - if ( level.teambased ) - { - drone setteam( owner.team ); - } - else - { - drone setteam( "free" ); - } - drone maps/mp/_entityheadicons::setentityheadicon( drone.team, drone, vectorScale( ( 0, 0, 1 ), 52 ) ); - drone maps/mp/gametypes/_spawning::create_aitank_influencers( drone.team ); - drone.controlled = 0; - drone makevehicleunusable(); - drone.numberrockets = 3; - drone.warningshots = 3; - drone setdrawinfrared( 1 ); - if ( !isDefined( drone.owner.numtankdrones ) ) - { - drone.owner.numtankdrones = 1; - } - else - { - drone.owner.numtankdrones++; - } - drone.ownernumber = drone.owner.numtankdrones; - target_set( drone, vectorScale( ( 0, 0, 1 ), 20 ) ); - target_setturretaquire( drone, 0 ); - drone thread tank_move_think(); - drone thread tank_aim_think(); - drone thread tank_combat_think(); - drone thread tank_death_think( weaponname ); - drone thread tank_damage_think(); - drone thread tank_abort_think(); - drone thread tank_team_kill(); - drone thread tank_ground_abort_think(); - drone thread tank_riotshield_think(); - drone thread tank_rocket_think(); - owner maps/mp/killstreaks/_remote_weapons::initremoteweapon( drone, "killstreak_ai_tank_mp" ); - drone thread deleteonkillbrush( drone.owner ); - level thread tank_game_end_think( drone ); + waittillframeend; + drone = spawnvehicle( "veh_t6_drone_tank", "talon", "ai_tank_drone_mp", origin, ( 0, 0, 0 ) ); + drone setenemymodel( "veh_t6_drone_tank_alt" ); + drone playloopsound( "veh_talon_idle_npc", 0.2 ); + drone setvehicleavoidance( 1 ); + drone setclientfield( "ai_tank_missile_fire", 4 ); + drone setowner( owner ); + drone.owner = owner; + drone.team = owner.team; + drone.aiteam = owner.team; + drone.killstreak_id = killstreak_id; + drone.type = "tank_drone"; + + if ( level.teambased ) + drone setteam( owner.team ); + else + drone setteam( "free" ); + + drone maps\mp\_entityheadicons::setentityheadicon( drone.team, drone, vectorscale( ( 0, 0, 1 ), 52.0 ) ); + drone maps\mp\gametypes\_spawning::create_aitank_influencers( drone.team ); + drone.controlled = 0; + drone makevehicleunusable(); + drone.numberrockets = 3; + drone.warningshots = 3; + drone setdrawinfrared( 1 ); + + if ( !isdefined( drone.owner.numtankdrones ) ) + drone.owner.numtankdrones = 1; + else + drone.owner.numtankdrones++; + + drone.ownernumber = drone.owner.numtankdrones; + target_set( drone, vectorscale( ( 0, 0, 1 ), 20.0 ) ); + target_setturretaquire( drone, 0 ); + drone thread tank_move_think(); + drone thread tank_aim_think(); + drone thread tank_combat_think(); + drone thread tank_death_think( weaponname ); + drone thread tank_damage_think(); + drone thread tank_abort_think(); + drone thread tank_team_kill(); + drone thread tank_ground_abort_think(); + drone thread tank_riotshield_think(); + drone thread tank_rocket_think(); + owner maps\mp\killstreaks\_remote_weapons::initremoteweapon( drone, "killstreak_ai_tank_mp" ); + drone thread deleteonkillbrush( drone.owner ); + level thread tank_game_end_think( drone ); /# + #/ } tank_team_kill() { - self endon( "death" ); - self.owner waittill( "teamKillKicked" ); - self notify( "death" ); + self endon( "death" ); + + self.owner waittill( "teamKillKicked" ); + + self notify( "death" ); } tank_abort_think() { - self endon( "death" ); - self.owner wait_endon( 120, "disconnect", "joined_team", "joined_spectators", "emp_jammed" ); - shouldtimeout = getDvar( "scr_ai_tank_no_timeout" ); - if ( shouldtimeout == "1" ) - { - return; - } - self notify( "death" ); + self endon( "death" ); + self.owner wait_endon( 120, "disconnect", "joined_team", "joined_spectators", "emp_jammed" ); + shouldtimeout = getdvar( "scr_ai_tank_no_timeout" ); + + if ( shouldtimeout == "1" ) + return; + + self notify( "death" ); } tank_game_end_think( drone ) { - drone endon( "death" ); - level waittill( "game_ended" ); - drone notify( "death" ); + drone endon( "death" ); + + level waittill( "game_ended" ); + + drone notify( "death" ); } stop_remote() { - if ( !isDefined( self ) ) - { - return; - } - self clearusingremote(); - self.killstreak_waitamount = undefined; - self destroy_remote_hud(); - self clientnotify( "nofutz" ); + if ( !isdefined( self ) ) + return; + + self clearusingremote(); + self.killstreak_waitamount = undefined; + self destroy_remote_hud(); + self clientnotify( "nofutz" ); } tank_damage_think() { - self endon( "death" ); - self.maxhealth = 999999; - self.health = self.maxhealth; - self.isstunned = 0; - low_health = 0; - damage_taken = 0; - for ( ;; ) - { - self waittill( "damage", damage, attacker, dir, point, mod, model, tag, part, weapon, flags ); - self.maxhealth = 999999; - self.health = self.maxhealth; + self endon( "death" ); + self.maxhealth = 999999; + self.health = self.maxhealth; + self.isstunned = 0; + low_health = 0; + damage_taken = 0; + + for (;;) + { + self waittill( "damage", damage, attacker, dir, point, mod, model, tag, part, weapon, flags ); + + self.maxhealth = 999999; + self.health = self.maxhealth; /# - self.damage_debug = ( damage + " (" ) + weapon + ")"; + self.damage_debug = damage + " (" + weapon + ")"; #/ - if ( weapon == "emp_grenade_mp" && mod == "MOD_GRENADE_SPLASH" ) - { - damage_taken += 400; - damage = 0; - if ( !self.isstunned ) - { - maps/mp/_challenges::stunnedtankwithempgrenade( attacker ); - self thread tank_stun( 4 ); - self.isstunned = 1; - } - } - if ( !self.isstunned ) - { - if ( weapon != "proximity_grenade_mp" && weapon == "proximity_grenade_aoe_mp" || mod == "MOD_GRENADE_SPLASH" && mod == "MOD_GAS" ) - { - self thread tank_stun( 1,5 ); - self.isstunned = 1; - } - } - if ( mod != "MOD_RIFLE_BULLET" && mod != "MOD_PISTOL_BULLET" || weapon == "hatchet_mp" && mod == "MOD_PROJECTILE_SPLASH" && isexplosivebulletweapon( weapon ) ) - { - if ( isplayer( attacker ) ) - { - if ( attacker hasperk( "specialty_armorpiercing" ) ) - { - damage += int( damage * level.cac_armorpiercing_data ); - } - } - if ( weaponclass( weapon ) == "spread" ) - { - damage *= 4,5; - } - damage *= 0,3; - } - if ( mod != "MOD_PROJECTILE" && mod != "MOD_GRENADE_SPLASH" && mod == "MOD_PROJECTILE_SPLASH" && damage != 0 && weapon != "emp_grenade_mp" && !isexplosivebulletweapon( weapon ) ) - { - damage *= 1,5; - } - if ( self.controlled ) - { - self.owner sendkillstreakdamageevent( int( damage ) ); - } - damage_taken += damage; - if ( damage_taken >= 800 ) - { - self notify( "death" ); - return; - } - if ( !low_health && damage_taken > 444,4445 ) - { - self thread tank_low_health_fx(); - low_health = 1; - } - if ( isDefined( attacker ) && isplayer( attacker ) && self tank_is_idle() && !self.isstunned ) - { - self.aim_entity.origin = attacker getcentroid(); - self.aim_entity.delay = 8; - self notify( "aim_updated" ); - } - } + if ( weapon == "emp_grenade_mp" && mod == "MOD_GRENADE_SPLASH" ) + { + damage_taken += 400.0; + damage = 0; + + if ( !self.isstunned ) + { + maps\mp\_challenges::stunnedtankwithempgrenade( attacker ); + self thread tank_stun( 4 ); + self.isstunned = 1; + } + } + + if ( !self.isstunned ) + { + if ( ( weapon == "proximity_grenade_mp" || weapon == "proximity_grenade_aoe_mp" ) && ( mod == "MOD_GRENADE_SPLASH" || mod == "MOD_GAS" ) ) + { + self thread tank_stun( 1.5 ); + self.isstunned = 1; + } + } + + if ( mod == "MOD_RIFLE_BULLET" || mod == "MOD_PISTOL_BULLET" || weapon == "hatchet_mp" || mod == "MOD_PROJECTILE_SPLASH" && isexplosivebulletweapon( weapon ) ) + { + if ( isplayer( attacker ) ) + { + if ( attacker hasperk( "specialty_armorpiercing" ) ) + damage += int( damage * level.cac_armorpiercing_data ); + } + + if ( weaponclass( weapon ) == "spread" ) + damage *= 4.5; + + damage *= 0.3; + } + + if ( ( mod == "MOD_PROJECTILE" || mod == "MOD_GRENADE_SPLASH" || mod == "MOD_PROJECTILE_SPLASH" ) && damage != 0 && weapon != "emp_grenade_mp" && !isexplosivebulletweapon( weapon ) ) + damage *= 1.5; + + if ( self.controlled ) + self.owner sendkillstreakdamageevent( int( damage ) ); + + damage_taken += damage; + + if ( damage_taken >= 800 ) + { + self notify( "death", attacker, mod, weapon ); + return; + } + + if ( !low_health && damage_taken > 444.444 ) + { + self thread tank_low_health_fx(); + low_health = 1; + } + + if ( isdefined( attacker ) && isplayer( attacker ) && self tank_is_idle() && !self.isstunned ) + { + self.aim_entity.origin = attacker getcentroid(); + self.aim_entity.delay = 8; + self notify( "aim_updated" ); + } + } } tank_low_health_fx() { - self endon( "death" ); - self.damage_fx = spawn( "script_model", self gettagorigin( "tag_origin" ) + vectorScale( ( 0, 0, 1 ), 14 ) ); - self.damage_fx setmodel( "tag_origin" ); - self.damage_fx linkto( self, "tag_turret", vectorScale( ( 0, 0, 1 ), 14 ), ( 0, 0, 1 ) ); - wait 0,1; - playfxontag( level.ai_tank_damage_fx, self.damage_fx, "tag_origin" ); + self endon( "death" ); + self.damage_fx = spawn( "script_model", self gettagorigin( "tag_origin" ) + vectorscale( ( 0, 0, -1 ), 14.0 ) ); + self.damage_fx setmodel( "tag_origin" ); + self.damage_fx linkto( self, "tag_turret", vectorscale( ( 0, 0, -1 ), 14.0 ), ( 0, 0, 0 ) ); + wait 0.1; + playfxontag( level.ai_tank_damage_fx, self.damage_fx, "tag_origin" ); } deleteonkillbrush( player ) { - player endon( "disconnect" ); - self endon( "death" ); - killbrushes = getentarray( "trigger_hurt", "classname" ); - while ( 1 ) - { - i = 0; - while ( i < killbrushes.size ) - { - if ( self istouching( killbrushes[ i ] ) ) - { - if ( isDefined( self ) ) - { - self notify( "death" ); - } - return; - } - i++; - } - wait 0,1; - } + player endon( "disconnect" ); + self endon( "death" ); + killbrushes = getentarray( "trigger_hurt", "classname" ); + + while ( true ) + { + for ( i = 0; i < killbrushes.size; i++ ) + { + if ( self istouching( killbrushes[i] ) ) + { + if ( isdefined( self ) ) + self notify( "death", self.owner ); + + return; + } + } + + wait 0.1; + } } tank_stun( duration ) { - self endon( "death" ); - self notify( "stunned" ); - self clearvehgoalpos(); - forward = anglesToForward( self.angles ); - forward = self.origin + ( forward * 128 ); - forward -= vectorScale( ( 0, 0, 1 ), 64 ); - self setturrettargetvec( forward ); - self disablegunnerfiring( 0, 1 ); - self laseroff(); - if ( self.controlled ) - { - self.owner freezecontrols( 1 ); - self.owner sendkillstreakdamageevent( 400 ); - } - if ( isDefined( self.owner.fullscreen_static ) ) - { - self.owner thread maps/mp/killstreaks/_remote_weapons::stunstaticfx( duration ); - } - self setclientflag( 3 ); - wait duration; - self clearclientflag( 3 ); - if ( self.controlled ) - { - self.owner freezecontrols( 0 ); - } - if ( self.controlled == 0 ) - { - self thread tank_move_think(); - self thread tank_aim_think(); - self thread tank_combat_think(); - } - self disablegunnerfiring( 0, 0 ); - self.isstunned = 0; + self endon( "death" ); + self notify( "stunned" ); + self clearvehgoalpos(); + forward = anglestoforward( self.angles ); + forward = self.origin + forward * 128; + forward -= vectorscale( ( 0, 0, 1 ), 64.0 ); + self setturrettargetvec( forward ); + self disablegunnerfiring( 0, 1 ); + self laseroff(); + + if ( self.controlled ) + { + self.owner freezecontrols( 1 ); + self.owner sendkillstreakdamageevent( 400 ); + } + + if ( isdefined( self.owner.fullscreen_static ) ) + self.owner thread maps\mp\killstreaks\_remote_weapons::stunstaticfx( duration ); + + self setclientflag( 3 ); + wait( duration ); + self clearclientflag( 3 ); + + if ( self.controlled ) + self.owner freezecontrols( 0 ); + + if ( self.controlled == 0 ) + { + self thread tank_move_think(); + self thread tank_aim_think(); + self thread tank_combat_think(); + } + + self disablegunnerfiring( 0, 0 ); + self.isstunned = 0; } emp_crazy_death() { - self setclientflag( 3 ); - wait 1; - self notify( "death" ); - time = 0; - randomangle = randomint( 360 ); - while ( time < 1,45 ) - { - self setturrettargetvec( self.origin + ( anglesToForward( ( randomintrange( 305, 315 ), int( randomangle + ( time * 180 ) ), 0 ) ) * 100 ) ); - if ( time > 0,2 ) - { - self fireweapon(); - if ( randomint( 100 ) > 85 ) - { - rocket = self firegunnerweapon( 0 ); - if ( isDefined( rocket ) ) - { - rocket.from_ai = 1; - } - } - } - time += 0,05; - wait 0,05; - } - self setclientfield( "ai_tank_death", 1 ); - playfx( level.ai_tank_explode_fx, self.origin, ( 0, 0, 1 ) ); - playsoundatposition( "wpn_agr_explode", self.origin ); - wait 0,05; - self hide(); + self setclientflag( 3 ); + wait 1; + self notify( "death" ); + time = 0; + randomangle = randomint( 360 ); + + while ( time < 1.45 ) + { + self setturrettargetvec( self.origin + anglestoforward( ( randomintrange( 305, 315 ), int( randomangle + time * 180 ), 0 ) ) * 100 ); + + if ( time > 0.2 ) + { + self fireweapon(); + + if ( randomint( 100 ) > 85 ) + { + rocket = self firegunnerweapon( 0 ); + + if ( isdefined( rocket ) ) + rocket.from_ai = 1; + } + } + + time += 0.05; + wait 0.05; + } + + self setclientfield( "ai_tank_death", 1 ); + playfx( level.ai_tank_explode_fx, self.origin, ( 0, 0, 1 ) ); + playsoundatposition( "wpn_agr_explode", self.origin ); + wait 0.05; + self hide(); } tank_death_think( hardpointname ) { - team = self.team; - self waittill( "death", attacker, type, weapon ); - self.dead = 1; - self laseroff(); - self clearvehgoalpos(); - if ( self.controlled == 1 && isDefined( self.owner ) ) - { - self.owner sendkillstreakdamageevent( 600 ); - self.owner destroy_remote_hud(); - } - if ( self.isstunned ) - { - stunned = 1; - self thread emp_crazy_death(); - wait 1,55; - } - else - { - self setclientfield( "ai_tank_death", 1 ); - stunned = 0; - playfx( level.ai_tank_explode_fx, self.origin, ( 0, 0, 1 ) ); - playsoundatposition( "wpn_agr_explode", self.origin ); - wait 0,05; - self hide(); - if ( isDefined( self.damage_fx ) ) - { - self.damage_fx delete(); - } - } - if ( isDefined( attacker ) && isplayer( attacker ) && isDefined( self.owner ) && attacker != self.owner ) - { - if ( self.owner isenemyplayer( attacker ) ) - { - maps/mp/_scoreevents::processscoreevent( "destroyed_aitank", attacker, self.owner, weapon ); - attacker addweaponstat( weapon, "destroyed_aitank", 1 ); - if ( isDefined( self.wascontrollednowdead ) && self.wascontrollednowdead ) - { - attacker addweaponstat( weapon, "destroyed_controlled_killstreak", 1 ); - } - } - } - wait 2; - maps/mp/killstreaks/_killstreakrules::killstreakstop( hardpointname, team, self.killstreak_id ); - self.aim_entity delete(); - self delete(); + team = self.team; + + self waittill( "death", attacker, type, weapon ); + + self.dead = 1; + self laseroff(); + self clearvehgoalpos(); + + if ( self.controlled == 1 && isdefined( self.owner ) ) + { + self.owner sendkillstreakdamageevent( 600 ); + self.owner destroy_remote_hud(); + } + + if ( self.isstunned ) + { + stunned = 1; + self thread emp_crazy_death(); + wait 1.55; + } + else + { + self setclientfield( "ai_tank_death", 1 ); + stunned = 0; + playfx( level.ai_tank_explode_fx, self.origin, ( 0, 0, 1 ) ); + playsoundatposition( "wpn_agr_explode", self.origin ); + wait 0.05; + self hide(); + + if ( isdefined( self.damage_fx ) ) + self.damage_fx delete(); + } + + if ( isdefined( attacker ) && isplayer( attacker ) && isdefined( self.owner ) && attacker != self.owner ) + { + if ( self.owner isenemyplayer( attacker ) ) + { + maps\mp\_scoreevents::processscoreevent( "destroyed_aitank", attacker, self.owner, weapon ); + attacker addweaponstat( weapon, "destroyed_aitank", 1 ); + + if ( isdefined( self.wascontrollednowdead ) && self.wascontrollednowdead ) + attacker addweaponstat( weapon, "destroyed_controlled_killstreak", 1 ); + } + else + { + + } + } + + wait 2; + maps\mp\killstreaks\_killstreakrules::killstreakstop( hardpointname, team, self.killstreak_id ); + self.aim_entity delete(); + self delete(); } tank_move_think() { - self endon( "death" ); - self endon( "stunned" ); - self endon( "remote_start" ); - level endon( "game_ended" ); + self endon( "death" ); + self endon( "stunned" ); + self endon( "remote_start" ); + level endon( "game_ended" ); /# - self endon( "debug_patrol" ); + self endon( "debug_patrol" ); #/ - do_wait = 1; - for ( ;; ) - { - if ( do_wait ) - { - wait randomfloatrange( 1, 4 ); - } - do_wait = 1; - if ( !tank_is_idle() ) - { - enemy = tank_get_target(); - if ( valid_target( enemy, self.team, self.owner ) ) - { - if ( distancesquared( self.origin, enemy.origin ) < 65536 ) - { - self clearvehgoalpos(); - wait 1; - } - else if ( findpath( self.origin, enemy.origin, self, 0 ) ) - { - self setvehgoalpos( enemy.origin, 1, 2 ); - self wait_endon( 3, "reached_end_node" ); - } - else - { - self clearvehgoalpos(); - wait 1; - } - if ( valid_target( enemy, self.team, self.owner ) ) - { - do_wait = 0; - } - continue; - } - } - else avg_position = tank_compute_enemy_position(); - if ( isDefined( avg_position ) ) - { - nodes = getnodesinradiussorted( avg_position, 256, 0 ); - } - else - { - nodes = getnodesinradiussorted( self.owner.origin, 1024, 256, 128 ); - } - if ( nodes.size > 0 ) - { - node = nodes[ 0 ]; - } - else - { - } - if ( self setvehgoalpos( node.origin, 1, 2 ) ) - { - event = self waittill_any_timeout( 45, "reached_end_node", "force_movement_wake" ); - if ( event != "reached_end_node" ) - { - do_wait = 0; - } - continue; - } - else self clearvehgoalpos(); - } + do_wait = 1; + + for (;;) + { + if ( do_wait ) + wait( randomfloatrange( 1, 4 ) ); + + do_wait = 1; + + if ( !tank_is_idle() ) + { + enemy = tank_get_target(); + + if ( valid_target( enemy, self.team, self.owner ) ) + { + if ( distancesquared( self.origin, enemy.origin ) < 65536 ) + { + self clearvehgoalpos(); + wait 1; + } + else if ( findpath( self.origin, enemy.origin, self, 0 ) ) + { + self setvehgoalpos( enemy.origin, 1, 2 ); + self wait_endon( 3, "reached_end_node" ); + } + else + { + self clearvehgoalpos(); + wait 1; + } + + if ( valid_target( enemy, self.team, self.owner ) ) + do_wait = 0; + + continue; + } + } + + avg_position = tank_compute_enemy_position(); + + if ( isdefined( avg_position ) ) + nodes = getnodesinradiussorted( avg_position, 256, 0 ); + else + nodes = getnodesinradiussorted( self.owner.origin, 1024, 256, 128 ); + + if ( nodes.size > 0 ) + node = nodes[0]; + else + continue; + + if ( self setvehgoalpos( node.origin, 1, 2 ) ) + { + event = self waittill_any_timeout( 45, "reached_end_node", "force_movement_wake" ); + + if ( event != "reached_end_node" ) + do_wait = 0; + + continue; + } + + self clearvehgoalpos(); + } } tank_riotshield_think() { - self endon( "death" ); - self endon( "remote_start" ); - for ( ;; ) - { - level waittill( "riotshield_planted", owner ); - if ( owner == self.owner || owner.team == self.team ) - { - if ( distancesquared( owner.riotshieldentity.origin, self.origin ) < 262144 ) - { - self clearvehgoalpos(); - } - self notify( "force_movement_wake" ); - } - } + self endon( "death" ); + self endon( "remote_start" ); + + for (;;) + { + level waittill( "riotshield_planted", owner ); + + if ( owner == self.owner || owner.team == self.team ) + { + if ( distancesquared( owner.riotshieldentity.origin, self.origin ) < 262144 ) + self clearvehgoalpos(); + + self notify( "force_movement_wake" ); + } + } } tank_ground_abort_think() { - self endon( "death" ); - ground_trace_fail = 0; - for ( ;; ) - { - wait 1; - nodes = getnodesinradius( self.origin, 256, 0, 128, "Path" ); - if ( nodes.size <= 0 ) - { - ground_trace_fail++; - } - else - { - ground_trace_fail = 0; - } - if ( ground_trace_fail >= 4 ) - { - self notify( "death" ); - } - } + self endon( "death" ); + ground_trace_fail = 0; + + for (;;) + { + wait 1; + nodes = getnodesinradius( self.origin, 256, 0, 128, "Path" ); + + if ( nodes.size <= 0 ) + ground_trace_fail++; + else + ground_trace_fail = 0; + + if ( ground_trace_fail >= 4 ) + self notify( "death" ); + } } tank_aim_think() { - self endon( "death" ); - self endon( "stunned" ); - self endon( "remote_start" ); - if ( !isDefined( self.aim_entity ) ) - { - self.aim_entity = spawn( "script_model", ( 0, 0, 1 ) ); - } - self.aim_entity.delay = 0; - self tank_idle(); - for ( ;; ) - { - self wait_endon( randomfloatrange( 1, 3 ), "aim_updated" ); - if ( self.aim_entity.delay > 0 ) - { - wait self.aim_entity.delay; - self.aim_entity.delay = 0; - continue; - } - else if ( !tank_is_idle() ) - { - continue; - } - else if ( self getspeed() <= 1 ) - { - enemies = tank_get_player_enemies( 0 ); - if ( enemies.size ) - { - enemy = enemies[ 0 ]; - node = getvisiblenode( self.origin, enemy.origin, self ); - if ( isDefined( node ) ) - { - self.aim_entity.origin = node.origin + vectorScale( ( 0, 0, 1 ), 16 ); - continue; - } - } - } - else - { - yaw = ( 0, self.angles[ 1 ] + randomintrange( -75, 75 ), 0 ); - forward = anglesToForward( yaw ); - origin = self.origin + ( forward * 1024 ); - self.aim_entity.origin = ( origin[ 0 ], origin[ 1 ], origin[ 2 ] + 20 ); - } - } + self endon( "death" ); + self endon( "stunned" ); + self endon( "remote_start" ); + + if ( !isdefined( self.aim_entity ) ) + self.aim_entity = spawn( "script_model", ( 0, 0, 0 ) ); + + self.aim_entity.delay = 0; + self tank_idle(); + + for (;;) + { + self wait_endon( randomfloatrange( 1, 3 ), "aim_updated" ); + + if ( self.aim_entity.delay > 0 ) + { + wait( self.aim_entity.delay ); + self.aim_entity.delay = 0; + continue; + } + + if ( !tank_is_idle() ) + continue; + + if ( self getspeed() <= 1 ) + { + enemies = tank_get_player_enemies( 0 ); + + if ( enemies.size ) + { + enemy = enemies[0]; + node = getvisiblenode( self.origin, enemy.origin, self ); + + if ( isdefined( node ) ) + { + self.aim_entity.origin = node.origin + vectorscale( ( 0, 0, 1 ), 16.0 ); + continue; + } + } + } + + yaw = ( 0, self.angles[1] + randomintrange( -75, 75 ), 0 ); + forward = anglestoforward( yaw ); + origin = self.origin + forward * 1024; + self.aim_entity.origin = ( origin[0], origin[1], origin[2] + 20 ); + } } tank_combat_think() { - self endon( "death" ); - self endon( "stunned" ); - self endon( "remote_start" ); - level endon( "game_ended" ); - for ( ;; ) - { - wait 0,5; - self laseroff(); - origin = self.origin + vectorScale( ( 0, 0, 1 ), 32 ); - forward = vectornormalize( self.target_entity.origin - self.origin ); - players = tank_get_player_enemies( 0 ); - self tank_target_evaluate( players, origin, forward ); - if ( level.gametype != "hack" ) - { - dogs = maps/mp/killstreaks/_dogs::dog_manager_get_dogs(); - self tank_target_evaluate( dogs, origin, forward ); - tanks = getentarray( "talon", "targetname" ); - self tank_target_evaluate( tanks, origin, forward ); - rcbombs = getentarray( "rcbomb", "targetname" ); - self tank_target_evaluate( rcbombs, origin, forward ); - turrets = getentarray( "auto_turret", "classname" ); - self tank_target_evaluate( turrets, origin, forward ); - shields = getentarray( "riotshield_mp", "targetname" ); - self tank_target_evaluate( shields, origin, forward ); - } - } + self endon( "death" ); + self endon( "stunned" ); + self endon( "remote_start" ); + level endon( "game_ended" ); + + for (;;) + { + wait 0.5; + self laseroff(); + origin = self.origin + vectorscale( ( 0, 0, 1 ), 32.0 ); + forward = vectornormalize( self.target_entity.origin - self.origin ); + players = tank_get_player_enemies( 0 ); + self tank_target_evaluate( players, origin, forward ); + + if ( level.gametype != "hack" ) + { + dogs = maps\mp\killstreaks\_dogs::dog_manager_get_dogs(); + self tank_target_evaluate( dogs, origin, forward ); + tanks = getentarray( "talon", "targetname" ); + self tank_target_evaluate( tanks, origin, forward ); + rcbombs = getentarray( "rcbomb", "targetname" ); + self tank_target_evaluate( rcbombs, origin, forward ); + turrets = getentarray( "auto_turret", "classname" ); + self tank_target_evaluate( turrets, origin, forward ); + shields = getentarray( "riotshield_mp", "targetname" ); + self tank_target_evaluate( shields, origin, forward ); + } + } } tank_target_evaluate( targets, origin, forward ) { - _a802 = targets; - _k802 = getFirstArrayKey( _a802 ); - while ( isDefined( _k802 ) ) - { - target = _a802[ _k802 ]; - if ( !valid_target( target, self.team, self.owner ) ) - { - } - else delta = target.origin - origin; - delta = vectornormalize( delta ); - dot = vectordot( forward, delta ); - if ( dot < level.ai_tank_fov ) - { - } - else if ( !bullettracepassed( origin, target getcentroid(), 0, target ) ) - { - } - else - { - self tank_engage( target ); - break; - } - _k802 = getNextArrayKey( _a802, _k802 ); - } - self tank_idle(); + foreach ( target in targets ) + { + if ( !valid_target( target, self.team, self.owner ) ) + continue; + + delta = target.origin - origin; + delta = vectornormalize( delta ); + dot = vectordot( forward, delta ); + + if ( dot < level.ai_tank_fov ) + continue; + + if ( !bullettracepassed( origin, target getcentroid(), 0, target ) ) + continue; + + self tank_engage( target ); + break; + } + + self tank_idle(); } tank_engage( enemy ) { - do_fire_delay = 1; - warning_shots = self.warningshots; - self laseron(); - for ( ;; ) - { - if ( !valid_target( enemy, self.team, self.owner ) ) - { - return; - } - if ( warning_shots <= 2 ) - { - fire_rocket = self tank_should_fire_rocket( enemy ); - } - self tank_set_target( enemy, fire_rocket ); - if ( fire_rocket ) - { - self clearvehgoalpos(); - } - event = self waittill_any_return( "turret_on_vistarget", "turret_no_vis" ); - if ( !valid_target( enemy, self.team, self.owner ) ) - { - return; - } - self.aim_entity.origin = enemy getcentroid(); - distsq = distancesquared( self.origin, enemy.origin ); - if ( distsq > 4096 && event == "turret_no_vis" ) - { - self tank_target_lost(); - if ( self tank_is_idle() ) - { - return; - } - continue; - } - else self notify( "force_movement_wake" ); - if ( event == "turret_no_vis" ) - { - warning_shots = self.warningshots; - } - if ( do_fire_delay ) - { - self playsound( "wpn_metalstorm_lock_on" ); - wait randomfloatrange( 0,4, 0,8 ); - do_fire_delay = 0; - if ( !valid_target( enemy, self.team, self.owner ) ) - { - return; - } - } - if ( fire_rocket ) - { - rocket = self firegunnerweapon( 0, self.owner ); - self notify( "missile_fire" ); - if ( isDefined( rocket ) ) - { - rocket.from_ai = 1; - rocket.killcament = self; - rocket wait_endon( randomfloatrange( 0,5, 1 ), "death" ); - continue; - } - } - else - { - self fireweapon(); - warning_shots--; + do_fire_delay = 1; + warning_shots = self.warningshots; + self laseron(); - wait level.ai_tank_turret_fire_rate; - while ( isDefined( enemy ) && !isalive( enemy ) ) - { - bullets = randomintrange( 8, 15 ); - i = 0; - while ( i < bullets ) - { - self fireweapon(); - wait level.ai_tank_turret_fire_rate; - i++; - } - } - } - } + for (;;) + { + if ( !valid_target( enemy, self.team, self.owner ) ) + return; + + fire_rocket = warning_shots <= 2 && self tank_should_fire_rocket( enemy ); + self tank_set_target( enemy, fire_rocket ); + + if ( fire_rocket ) + self clearvehgoalpos(); + + event = self waittill_any_return( "turret_on_vistarget", "turret_no_vis" ); + + if ( !valid_target( enemy, self.team, self.owner ) ) + return; + + self.aim_entity.origin = enemy getcentroid(); + distsq = distancesquared( self.origin, enemy.origin ); + + if ( distsq > 4096 && event == "turret_no_vis" ) + { + self tank_target_lost(); + + if ( self tank_is_idle() ) + return; + + continue; + } + else + self notify( "force_movement_wake" ); + + if ( event == "turret_no_vis" ) + warning_shots = self.warningshots; + + if ( do_fire_delay ) + { + self playsound( "wpn_metalstorm_lock_on" ); + wait( randomfloatrange( 0.4, 0.8 ) ); + do_fire_delay = 0; + + if ( !valid_target( enemy, self.team, self.owner ) ) + return; + } + + if ( fire_rocket ) + { + rocket = self firegunnerweapon( 0, self.owner ); + self notify( "missile_fire" ); + + if ( isdefined( rocket ) ) + { + rocket.from_ai = 1; + rocket.killcament = self; + rocket wait_endon( randomfloatrange( 0.5, 1 ), "death" ); + continue; + } + } + + self fireweapon(); + warning_shots--; + wait( level.ai_tank_turret_fire_rate ); + + if ( isdefined( enemy ) && !isalive( enemy ) ) + { + bullets = randomintrange( 8, 15 ); + + for ( i = 0; i < bullets; i++ ) + { + self fireweapon(); + wait( level.ai_tank_turret_fire_rate ); + } + } + } } tank_target_lost() { - self endon( "turret_on_vistarget" ); - wait 5; - self tank_idle(); + self endon( "turret_on_vistarget" ); + wait 5; + self tank_idle(); } tank_should_fire_rocket( enemy ) { - if ( self.numberrockets <= 0 ) - { - return 0; - } - if ( distancesquared( self.origin, enemy.origin ) < 147456 ) - { - return 0; - } - origin = self gettagorigin( "tag_flash_gunner1" ); - if ( !bullettracepassed( origin, enemy.origin + vectorScale( ( 0, 0, 1 ), 10 ), 0, enemy ) ) - { - return 0; - } - return 1; + if ( self.numberrockets <= 0 ) + return false; + + if ( distancesquared( self.origin, enemy.origin ) < 147456 ) + return false; + + origin = self gettagorigin( "tag_flash_gunner1" ); + + if ( !bullettracepassed( origin, enemy.origin + vectorscale( ( 0, 0, 1 ), 10.0 ), 0, enemy ) ) + return false; + + return true; } tank_rocket_think() { - self endon( "death" ); - self endon( "remote_start" ); - if ( self.numberrockets <= 0 ) - { - self disablegunnerfiring( 0, 1 ); - wait 2; - self setclientfield( "ai_tank_missile_fire", 4 ); - self.numberrockets = 3; - wait 0,4; - if ( !self.isstunned ) - { - self disablegunnerfiring( 0, 0 ); - } - } - while ( 1 ) - { - self waittill( "missile_fire" ); - self.numberrockets--; + self endon( "death" ); + self endon( "remote_start" ); - self setclientfield( "ai_tank_missile_fire", self.numberrockets ); - angles = self gettagangles( "tag_flash_gunner1" ); - dir = anglesToForward( angles ); - self launchvehicle( dir * -30, self.origin + vectorScale( ( 0, 0, 1 ), 50 ), 0 ); - earthquake( 0,4, 0,5, self.origin, 200 ); - if ( self.numberrockets <= 0 ) - { - self disablegunnerfiring( 0, 1 ); - wait 2; - self setclientfield( "ai_tank_missile_fire", 4 ); - self.numberrockets = 3; - wait 0,4; - if ( !self.isstunned ) - { - self disablegunnerfiring( 0, 0 ); - } - } - } + if ( self.numberrockets <= 0 ) + { + self disablegunnerfiring( 0, 1 ); + wait 2; + self setclientfield( "ai_tank_missile_fire", 4 ); + self.numberrockets = 3; + wait 0.4; + + if ( !self.isstunned ) + self disablegunnerfiring( 0, 0 ); + } + + while ( true ) + { + self waittill( "missile_fire" ); + + self.numberrockets--; + self setclientfield( "ai_tank_missile_fire", self.numberrockets ); + angles = self gettagangles( "tag_flash_gunner1" ); + dir = anglestoforward( angles ); + self launchvehicle( dir * -30, self.origin + vectorscale( ( 0, 0, 1 ), 50.0 ), 0 ); + earthquake( 0.4, 0.5, self.origin, 200 ); + + if ( self.numberrockets <= 0 ) + { + self disablegunnerfiring( 0, 1 ); + wait 2; + self setclientfield( "ai_tank_missile_fire", 4 ); + self.numberrockets = 3; + wait 0.4; + + if ( !self.isstunned ) + self disablegunnerfiring( 0, 0 ); + } + } } tank_set_target( entity, use_rocket ) { - if ( !isDefined( use_rocket ) ) - { - use_rocket = 0; - } - self.target_entity = entity; - if ( use_rocket ) - { - angles = self gettagangles( "tag_barrel" ); - right = anglesToRight( angles ); - offset = vectorScale( right, 8 ); - velocity = entity getvelocity(); - speed = length( velocity ); - forward = anglesToForward( entity.angles ); - origin = offset + vectorScale( forward, speed ); - self setturrettargetent( entity, origin ); - } - else - { - self setturrettargetent( entity ); - } + if ( !isdefined( use_rocket ) ) + use_rocket = 0; + + self.target_entity = entity; + + if ( use_rocket ) + { + angles = self gettagangles( "tag_barrel" ); + right = anglestoright( angles ); + offset = vectorscale( right, 8 ); + velocity = entity getvelocity(); + speed = length( velocity ); + forward = anglestoforward( entity.angles ); + origin = offset + vectorscale( forward, speed ); + self setturrettargetent( entity, origin ); + } + else + self setturrettargetent( entity ); } tank_get_target() { - return self.target_entity; + return self.target_entity; } tank_idle() { - tank_set_target( self.aim_entity ); + tank_set_target( self.aim_entity ); } tank_is_idle() { - return tank_get_target() == self.aim_entity; + return tank_get_target() == self.aim_entity; } tank_has_radar() { - if ( level.teambased ) - { - if ( !maps/mp/killstreaks/_radar::teamhasspyplane( self.team ) ) - { - return maps/mp/killstreaks/_radar::teamhassatellite( self.team ); - } - } - if ( isDefined( self.owner.hasspyplane ) && !self.owner.hasspyplane ) - { - if ( isDefined( self.owner.hassatellite ) ) - { - return self.owner.hassatellite; - } - } + if ( level.teambased ) + return maps\mp\killstreaks\_radar::teamhasspyplane( self.team ) || maps\mp\killstreaks\_radar::teamhassatellite( self.team ); + + return isdefined( self.owner.hasspyplane ) && self.owner.hasspyplane || isdefined( self.owner.hassatellite ) && self.owner.hassatellite; } tank_get_player_enemies( on_radar ) { - enemies = []; - if ( !isDefined( on_radar ) ) - { - on_radar = 0; - } - if ( on_radar ) - { - time = getTime(); - } - _a1077 = level.aliveplayers; - teamkey = getFirstArrayKey( _a1077 ); - while ( isDefined( teamkey ) ) - { - team = _a1077[ teamkey ]; - if ( level.teambased && teamkey == self.team ) - { - } - else - { - _a1084 = team; - _k1084 = getFirstArrayKey( _a1084 ); - while ( isDefined( _k1084 ) ) - { - player = _a1084[ _k1084 ]; - if ( !valid_target( player, self.team, self.owner ) ) - { - } - else if ( on_radar ) - { - if ( ( time - player.lastfiretime ) > 3000 && !tank_has_radar() ) - { - } - } - else - { - enemies[ enemies.size ] = player; - } - _k1084 = getNextArrayKey( _a1084, _k1084 ); - } - } - teamkey = getNextArrayKey( _a1077, teamkey ); - } - return enemies; + enemies = []; + + if ( !isdefined( on_radar ) ) + on_radar = 0; + + if ( on_radar ) + time = gettime(); + + foreach ( teamkey, team in level.aliveplayers ) + { + if ( level.teambased && teamkey == self.team ) + continue; + + foreach ( player in team ) + { + if ( !valid_target( player, self.team, self.owner ) ) + continue; + + if ( on_radar ) + { + if ( time - player.lastfiretime > 3000 && !tank_has_radar() ) + continue; + } + + enemies[enemies.size] = player; + } + } + + return enemies; } tank_compute_enemy_position() { - enemies = tank_get_player_enemies( 0 ); - position = undefined; - if ( enemies.size ) - { - x = 0; - y = 0; - z = 0; - _a1117 = enemies; - _k1117 = getFirstArrayKey( _a1117 ); - while ( isDefined( _k1117 ) ) - { - enemy = _a1117[ _k1117 ]; - x += enemy.origin[ 0 ]; - y += enemy.origin[ 1 ]; - z += enemy.origin[ 2 ]; - _k1117 = getNextArrayKey( _a1117, _k1117 ); - } - x /= enemies.size; - y /= enemies.size; - z /= enemies.size; - position = ( x, y, z ); - } - return position; + enemies = tank_get_player_enemies( 0 ); + position = undefined; + + if ( enemies.size ) + { + x = 0; + y = 0; + z = 0; + + foreach ( enemy in enemies ) + { + x += enemy.origin[0]; + y += enemy.origin[1]; + z += enemy.origin[2]; + } + + x /= enemies.size; + y /= enemies.size; + z /= enemies.size; + position = ( x, y, z ); + } + + return position; } valid_target( target, team, owner ) { - if ( !isDefined( target ) ) - { - return 0; - } - if ( !isalive( target ) ) - { - return 0; - } - if ( target == owner ) - { - return 0; - } - if ( isplayer( target ) ) - { - if ( target.sessionstate != "playing" ) - { - return 0; - } - if ( isDefined( target.lastspawntime ) && ( getTime() - target.lastspawntime ) < 3000 ) - { - return 0; - } + if ( !isdefined( target ) ) + return false; + + if ( !isalive( target ) ) + return false; + + if ( target == owner ) + return false; + + if ( isplayer( target ) ) + { + if ( target.sessionstate != "playing" ) + return false; + + if ( isdefined( target.lastspawntime ) && gettime() - target.lastspawntime < 3000 ) + return false; /# - if ( target isinmovemode( "ufo", "noclip" ) ) - { - return 0; + if ( target isinmovemode( "ufo", "noclip" ) ) + return false; #/ - } - } - if ( level.teambased ) - { - if ( isDefined( target.team ) && team == target.team ) - { - return 0; - } - if ( isDefined( target.aiteam ) && team == target.aiteam ) - { - return 0; - } - } - if ( isDefined( target.owner ) && target.owner == owner ) - { - return 0; - } - if ( isDefined( target.script_owner ) && target.script_owner == owner ) - { - return 0; - } - if ( isDefined( target.dead ) && target.dead ) - { - return 0; - } - if ( isDefined( target.targetname ) && target.targetname == "riotshield_mp" ) - { - if ( isDefined( target.damagetaken ) && target.damagetaken >= getDvarInt( "riotshield_deployed_health" ) ) - { - return 0; - } - } - return 1; + } + + if ( level.teambased ) + { + if ( isdefined( target.team ) && team == target.team ) + return false; + + if ( isdefined( target.aiteam ) && team == target.aiteam ) + return false; + } + + if ( isdefined( target.owner ) && target.owner == owner ) + return false; + + if ( isdefined( target.script_owner ) && target.script_owner == owner ) + return false; + + if ( isdefined( target.dead ) && target.dead ) + return false; + + if ( isdefined( target.targetname ) && target.targetname == "riotshield_mp" ) + { + if ( isdefined( target.damagetaken ) && target.damagetaken >= getdvarint( "riotshield_deployed_health" ) ) + return false; + } + + return true; } starttankremotecontrol( drone ) { - self.killstreak_waitamount = 120000; - drone makevehicleusable(); - drone clearvehgoalpos(); - drone clearturrettarget(); - drone laseroff(); - drone usevehicle( self, 0 ); - drone makevehicleunusable(); - drone setbrake( 0 ); - self create_weapon_hud(); - drone update_weapon_hud( self ); - self thread tank_fire_watch( drone ); - drone thread tank_rocket_watch( self ); + self.killstreak_waitamount = 120000; + drone makevehicleusable(); + drone clearvehgoalpos(); + drone clearturrettarget(); + drone laseroff(); + drone usevehicle( self, 0 ); + drone makevehicleunusable(); + drone setbrake( 0 ); + self create_weapon_hud(); + drone update_weapon_hud( self ); + self thread tank_fire_watch( drone ); + drone thread tank_rocket_watch( self ); } endtankremotecontrol( drone, isdead ) { - drone makevehicleunusable(); - if ( !isdead ) - { - drone thread tank_move_think(); - drone thread tank_riotshield_think(); - drone thread tank_aim_think(); - drone thread tank_combat_think(); - drone thread tank_rocket_think(); - } + drone makevehicleunusable(); + + if ( !isdead ) + { + drone thread tank_move_think(); + drone thread tank_riotshield_think(); + drone thread tank_aim_think(); + drone thread tank_combat_think(); + drone thread tank_rocket_think(); + } } end_remote_control_ai_tank( drone ) { - if ( !isDefined( drone.dead ) || !drone.dead ) - { - self thread maps/mp/gametypes/_hud::fadetoblackforxsec( 0, 0,25, 0,1, 0,25 ); - wait 0,3; - } - else - { - wait 0,75; - self thread maps/mp/gametypes/_hud::fadetoblackforxsec( 0, 0,25, 0,1, 0,25 ); - wait 0,3; - } - drone makevehicleusable(); - drone.controlled = 0; - drone notify( "remote_stop" ); - self unlink(); - drone makevehicleunusable(); - self stop_remote(); - drone showpart( "tag_pov_hide" ); - if ( isDefined( self.hud_prompt_control ) || !isDefined( drone.dead ) && !drone.dead ) - { - self.hud_prompt_control settext( "HOLD [{+activate}] TO CONTROL A.G.R." ); - self.hud_prompt_exit settext( "" ); - } - self switchtolastnonkillstreakweapon(); - wait 0,5; - self takeweapon( "killstreak_ai_tank_mp" ); - if ( !isDefined( drone.dead ) || !drone.dead ) - { - drone thread tank_move_think(); - drone thread tank_riotshield_think(); - drone thread tank_aim_think(); - drone thread tank_combat_think(); - } + if ( !isdefined( drone.dead ) || !drone.dead ) + { + self thread maps\mp\gametypes\_hud::fadetoblackforxsec( 0, 0.25, 0.1, 0.25 ); + wait 0.3; + } + else + { + wait 0.75; + self thread maps\mp\gametypes\_hud::fadetoblackforxsec( 0, 0.25, 0.1, 0.25 ); + wait 0.3; + } + + drone makevehicleusable(); + drone.controlled = 0; + drone notify( "remote_stop" ); + self unlink(); + drone makevehicleunusable(); + self stop_remote(); + drone showpart( "tag_pov_hide" ); + + if ( isdefined( self.hud_prompt_control ) && ( !isdefined( drone.dead ) || !drone.dead ) ) + { + self.hud_prompt_control settext( "HOLD [{+activate}] TO CONTROL A.G.R." ); + self.hud_prompt_exit settext( "" ); + } + + self switchtolastnonkillstreakweapon(); + wait 0.5; + self takeweapon( "killstreak_ai_tank_mp" ); + + if ( !isdefined( drone.dead ) || !drone.dead ) + { + drone thread tank_move_think(); + drone thread tank_riotshield_think(); + drone thread tank_aim_think(); + drone thread tank_combat_think(); + } } tank_fire_watch( drone ) { - self endon( "disconnect" ); - self endon( "stopped_using_remote" ); - drone endon( "death" ); - level endon( "game_ended" ); - while ( 1 ) - { - drone waittill( "turret_fire" ); - while ( drone.isstunned ) - { - continue; - } - drone fireweapon(); - earthquake( 0,2, 0,2, drone.origin, 200 ); - angles = drone gettagangles( "tag_barrel" ); - dir = anglesToForward( angles ); - drone launchvehicle( dir * -5, drone.origin + vectorScale( ( 0, 0, 1 ), 10 ), 0 ); - wait level.ai_tank_turret_fire_rate; - } + self endon( "disconnect" ); + self endon( "stopped_using_remote" ); + drone endon( "death" ); + level endon( "game_ended" ); + + while ( true ) + { + drone waittill( "turret_fire" ); + + if ( drone.isstunned ) + continue; + + drone fireweapon(); + earthquake( 0.2, 0.2, drone.origin, 200 ); + angles = drone gettagangles( "tag_barrel" ); + dir = anglestoforward( angles ); + drone launchvehicle( dir * -5, drone.origin + vectorscale( ( 0, 0, 1 ), 10.0 ), 0 ); + wait( level.ai_tank_turret_fire_rate ); + } } tank_rocket_watch( player ) { - self endon( "death" ); - player endon( "stopped_using_remote" ); - if ( self.numberrockets <= 0 ) - { - self disablegunnerfiring( 0, 1 ); - wait 2; - self setclientfield( "ai_tank_missile_fire", 4 ); - self.numberrockets = 3; - wait 0,4; - if ( !self.isstunned ) - { - self disablegunnerfiring( 0, 0 ); - } - self update_weapon_hud( player ); - } - if ( !self.isstunned ) - { - self disablegunnerfiring( 0, 0 ); - } - while ( 1 ) - { - player waittill( "missile_fire" ); - self.numberrockets--; + self endon( "death" ); + player endon( "stopped_using_remote" ); - self setclientfield( "ai_tank_missile_fire", self.numberrockets ); - angles = self gettagangles( "tag_flash_gunner1" ); - dir = anglesToForward( angles ); - if ( !self.controlled ) - { - self launchvehicle( dir * -30, self.origin + vectorScale( ( 0, 0, 1 ), 50 ), 0 ); - } - else - { - self launchvehicle( dir * -30, self.origin + vectorScale( ( 0, 0, 1 ), 50 ), 0 ); - player playrumbleonentity( "sniper_fire" ); - } - earthquake( 0,4, 0,5, self.origin, 200 ); - self update_weapon_hud( player ); - if ( self.numberrockets <= 0 ) - { - self disablegunnerfiring( 0, 1 ); - wait 2; - self setclientfield( "ai_tank_missile_fire", 4 ); - self.numberrockets = 3; - wait 0,4; - if ( !self.isstunned ) - { - self disablegunnerfiring( 0, 0 ); - } - self update_weapon_hud( player ); - } - } + if ( self.numberrockets <= 0 ) + { + self disablegunnerfiring( 0, 1 ); + wait 2; + self setclientfield( "ai_tank_missile_fire", 4 ); + self.numberrockets = 3; + wait 0.4; + + if ( !self.isstunned ) + self disablegunnerfiring( 0, 0 ); + + self update_weapon_hud( player ); + } + + if ( !self.isstunned ) + self disablegunnerfiring( 0, 0 ); + + while ( true ) + { + player waittill( "missile_fire" ); + + self.numberrockets--; + self setclientfield( "ai_tank_missile_fire", self.numberrockets ); + angles = self gettagangles( "tag_flash_gunner1" ); + dir = anglestoforward( angles ); + + if ( !self.controlled ) + self launchvehicle( dir * -30, self.origin + vectorscale( ( 0, 0, 1 ), 50.0 ), 0 ); + else + { + self launchvehicle( dir * -30, self.origin + vectorscale( ( 0, 0, 1 ), 50.0 ), 0 ); + player playrumbleonentity( "sniper_fire" ); + } + + earthquake( 0.4, 0.5, self.origin, 200 ); + self update_weapon_hud( player ); + + if ( self.numberrockets <= 0 ) + { + self disablegunnerfiring( 0, 1 ); + wait 2; + self setclientfield( "ai_tank_missile_fire", 4 ); + self.numberrockets = 3; + wait 0.4; + + if ( !self.isstunned ) + self disablegunnerfiring( 0, 0 ); + + self update_weapon_hud( player ); + } + } } create_weapon_hud() { - self.tank_rocket_1 = newclienthudelem( self ); - self.tank_rocket_1.alignx = "right"; - self.tank_rocket_1.aligny = "bottom"; - self.tank_rocket_1.horzalign = "user_center"; - self.tank_rocket_1.vertalign = "user_bottom"; - self.tank_rocket_1.font = "small"; - self.tank_rocket_1 setshader( "mech_check_fill", 32, 16 ); - self.tank_rocket_1.hidewheninmenu = 0; - self.tank_rocket_1.immunetodemogamehudsettings = 1; - self.tank_rocket_1.x = -250; - self.tank_rocket_1.y = -75; - self.tank_rocket_1.fontscale = 1,25; - self.tank_rocket_2 = newclienthudelem( self ); - self.tank_rocket_2.alignx = "right"; - self.tank_rocket_2.aligny = "bottom"; - self.tank_rocket_2.horzalign = "user_center"; - self.tank_rocket_2.vertalign = "user_bottom"; - self.tank_rocket_2.font = "small"; - self.tank_rocket_2 setshader( "mech_check_fill", 32, 16 ); - self.tank_rocket_2.hidewheninmenu = 0; - self.tank_rocket_2.immunetodemogamehudsettings = 1; - self.tank_rocket_2.x = -250; - self.tank_rocket_2.y = -65; - self.tank_rocket_2.fontscale = 1,25; - self.tank_rocket_3 = newclienthudelem( self ); - self.tank_rocket_3.alignx = "right"; - self.tank_rocket_3.aligny = "bottom"; - self.tank_rocket_3.horzalign = "user_center"; - self.tank_rocket_3.vertalign = "user_bottom"; - self.tank_rocket_3.font = "small"; - self.tank_rocket_3 setshader( "mech_check_fill", 32, 16 ); - self.tank_rocket_3.hidewheninmenu = 0; - self.tank_rocket_3.immunetodemogamehudsettings = 1; - self.tank_rocket_3.x = -250; - self.tank_rocket_3.y = -55; - self.tank_rocket_3.fontscale = 1,25; - self thread fade_out_weapon_hud(); + self.tank_rocket_1 = newclienthudelem( self ); + self.tank_rocket_1.alignx = "right"; + self.tank_rocket_1.aligny = "bottom"; + self.tank_rocket_1.horzalign = "user_center"; + self.tank_rocket_1.vertalign = "user_bottom"; + self.tank_rocket_1.font = "small"; + self.tank_rocket_1 setshader( "mech_check_fill", 32, 16 ); + self.tank_rocket_1.hidewheninmenu = 0; + self.tank_rocket_1.immunetodemogamehudsettings = 1; + self.tank_rocket_1.x = -250; + self.tank_rocket_1.y = -75; + self.tank_rocket_1.fontscale = 1.25; + self.tank_rocket_2 = newclienthudelem( self ); + self.tank_rocket_2.alignx = "right"; + self.tank_rocket_2.aligny = "bottom"; + self.tank_rocket_2.horzalign = "user_center"; + self.tank_rocket_2.vertalign = "user_bottom"; + self.tank_rocket_2.font = "small"; + self.tank_rocket_2 setshader( "mech_check_fill", 32, 16 ); + self.tank_rocket_2.hidewheninmenu = 0; + self.tank_rocket_2.immunetodemogamehudsettings = 1; + self.tank_rocket_2.x = -250; + self.tank_rocket_2.y = -65; + self.tank_rocket_2.fontscale = 1.25; + self.tank_rocket_3 = newclienthudelem( self ); + self.tank_rocket_3.alignx = "right"; + self.tank_rocket_3.aligny = "bottom"; + self.tank_rocket_3.horzalign = "user_center"; + self.tank_rocket_3.vertalign = "user_bottom"; + self.tank_rocket_3.font = "small"; + self.tank_rocket_3 setshader( "mech_check_fill", 32, 16 ); + self.tank_rocket_3.hidewheninmenu = 0; + self.tank_rocket_3.immunetodemogamehudsettings = 1; + self.tank_rocket_3.x = -250; + self.tank_rocket_3.y = -55; + self.tank_rocket_3.fontscale = 1.25; + self thread fade_out_weapon_hud(); } fade_out_weapon_hud() { - self endon( "death" ); - wait 8; - time = 0; - while ( time < 2 ) - { - if ( !isDefined( self.tank_rocket_hint ) ) - { - return; - } - self.tank_rocket_hint.alpha -= 0,025; - self.tank_mg_hint.alpha -= 0,025; - time += 0,05; - wait 0,05; - } - self.tank_rocket_hint.alpha = 0; - self.tank_mg_hint.alpha = 0; + self endon( "death" ); + wait 8; + time = 0; + + while ( time < 2 ) + { + if ( !isdefined( self.tank_rocket_hint ) ) + return; + + self.tank_rocket_hint.alpha -= 0.025; + self.tank_mg_hint.alpha -= 0.025; + time += 0.05; + wait 0.05; + } + + self.tank_rocket_hint.alpha = 0; + self.tank_mg_hint.alpha = 0; } update_weapon_hud( player ) { - if ( isDefined( player.tank_rocket_3 ) ) - { - player.tank_rocket_3 setshader( "mech_check_fill", 32, 16 ); - player.tank_rocket_2 setshader( "mech_check_fill", 32, 16 ); - player.tank_rocket_1 setshader( "mech_check_fill", 32, 16 ); - switch( self.numberrockets ) - { - case 0: - player.tank_rocket_3 setshader( "mech_check_line", 32, 16 ); - case 1: - player.tank_rocket_2 setshader( "mech_check_line", 32, 16 ); - case 2: - player.tank_rocket_1 setshader( "mech_check_line", 32, 16 ); - break; - return; - } - } - } - } + if ( isdefined( player.tank_rocket_3 ) ) + { + player.tank_rocket_3 setshader( "mech_check_fill", 32, 16 ); + player.tank_rocket_2 setshader( "mech_check_fill", 32, 16 ); + player.tank_rocket_1 setshader( "mech_check_fill", 32, 16 ); + + switch ( self.numberrockets ) + { + case "0": + player.tank_rocket_3 setshader( "mech_check_line", 32, 16 ); + case "1": + player.tank_rocket_2 setshader( "mech_check_line", 32, 16 ); + case "2": + player.tank_rocket_1 setshader( "mech_check_line", 32, 16 ); + break; + } + } } destroy_remote_hud() { - self useservervisionset( 0 ); - self setinfraredvision( 0 ); - if ( isDefined( self.fullscreen_static ) ) - { - self.fullscreen_static destroy(); - } - if ( isDefined( self.remote_hud_reticle ) ) - { - self.remote_hud_reticle destroy(); - } - if ( isDefined( self.remote_hud_bracket_right ) ) - { - self.remote_hud_bracket_right destroy(); - } - if ( isDefined( self.remote_hud_bracket_left ) ) - { - self.remote_hud_bracket_left destroy(); - } - if ( isDefined( self.remote_hud_arrow_right ) ) - { - self.remote_hud_arrow_right destroy(); - } - if ( isDefined( self.remote_hud_arrow_left ) ) - { - self.remote_hud_arrow_left destroy(); - } - if ( isDefined( self.tank_rocket_1 ) ) - { - self.tank_rocket_1 destroy(); - } - if ( isDefined( self.tank_rocket_2 ) ) - { - self.tank_rocket_2 destroy(); - } - if ( isDefined( self.tank_rocket_3 ) ) - { - self.tank_rocket_3 destroy(); - } - if ( isDefined( self.tank_rocket_hint ) ) - { - self.tank_rocket_hint destroy(); - } - if ( isDefined( self.tank_mg_bar ) ) - { - self.tank_mg_bar destroy(); - } - if ( isDefined( self.tank_mg_arrow ) ) - { - self.tank_mg_arrow destroy(); - } - if ( isDefined( self.tank_mg_hint ) ) - { - self.tank_mg_hint destroy(); - } + self useservervisionset( 0 ); + self setinfraredvision( 0 ); + + if ( isdefined( self.fullscreen_static ) ) + self.fullscreen_static destroy(); + + if ( isdefined( self.remote_hud_reticle ) ) + self.remote_hud_reticle destroy(); + + if ( isdefined( self.remote_hud_bracket_right ) ) + self.remote_hud_bracket_right destroy(); + + if ( isdefined( self.remote_hud_bracket_left ) ) + self.remote_hud_bracket_left destroy(); + + if ( isdefined( self.remote_hud_arrow_right ) ) + self.remote_hud_arrow_right destroy(); + + if ( isdefined( self.remote_hud_arrow_left ) ) + self.remote_hud_arrow_left destroy(); + + if ( isdefined( self.tank_rocket_1 ) ) + self.tank_rocket_1 destroy(); + + if ( isdefined( self.tank_rocket_2 ) ) + self.tank_rocket_2 destroy(); + + if ( isdefined( self.tank_rocket_3 ) ) + self.tank_rocket_3 destroy(); + + if ( isdefined( self.tank_rocket_hint ) ) + self.tank_rocket_hint destroy(); + + if ( isdefined( self.tank_mg_bar ) ) + self.tank_mg_bar destroy(); + + if ( isdefined( self.tank_mg_arrow ) ) + self.tank_mg_arrow destroy(); + + if ( isdefined( self.tank_mg_hint ) ) + self.tank_mg_hint destroy(); } tank_devgui_think() { /# - setdvar( "devgui_tank", "" ); - for ( ;; ) - { - wait 0,25; - level.ai_tank_turret_fire_rate = weaponfiretime( "ai_tank_drone_gun_mp" ); - if ( getDvar( "devgui_tank" ) == "routes" ) - { - devgui_debug_route(); - setdvar( "devgui_tank", "" ); - } + setdvar( "devgui_tank", "" ); + + for (;;) + { + wait 0.25; + level.ai_tank_turret_fire_rate = weaponfiretime( "ai_tank_drone_gun_mp" ); + + if ( getdvar( "devgui_tank" ) == "routes" ) + { + devgui_debug_route(); + setdvar( "devgui_tank", "" ); + } + } #/ - } } tank_debug_patrol( node1, node2 ) { /# - self endon( "death" ); - self endon( "debug_patrol" ); - for ( ;; ) - { - self setvehgoalpos( node1.origin, 1, 2 ); - self waittill( "reached_end_node" ); - wait 1; - self setvehgoalpos( node2.origin, 1, 2 ); - self waittill( "reached_end_node" ); - wait 1; + self endon( "death" ); + self endon( "debug_patrol" ); + + for (;;) + { + self setvehgoalpos( node1.origin, 1, 2 ); + + self waittill( "reached_end_node" ); + + wait 1; + self setvehgoalpos( node2.origin, 1, 2 ); + + self waittill( "reached_end_node" ); + + wait 1; + } #/ - } } devgui_debug_route() { /# - iprintln( "Choose nodes with 'A' or press 'B' to cancel" ); - nodes = maps/mp/gametypes/_dev::dev_get_node_pair(); - if ( !isDefined( nodes ) ) - { - iprintln( "Route Debug Cancelled" ); - return; - } - iprintln( "Sending talons to chosen nodes" ); - tanks = getentarray( "talon", "targetname" ); - _a1611 = tanks; - _k1611 = getFirstArrayKey( _a1611 ); - while ( isDefined( _k1611 ) ) - { - tank = _a1611[ _k1611 ]; - tank notify( "debug_patrol" ); - tank thread tank_debug_patrol( nodes[ 0 ], nodes[ 1 ] ); - _k1611 = getNextArrayKey( _a1611, _k1611 ); + iprintln( "Choose nodes with 'A' or press 'B' to cancel" ); + nodes = maps\mp\gametypes\_dev::dev_get_node_pair(); + + if ( !isdefined( nodes ) ) + { + iprintln( "Route Debug Cancelled" ); + return; + } + + iprintln( "Sending talons to chosen nodes" ); + tanks = getentarray( "talon", "targetname" ); + + foreach ( tank in tanks ) + { + tank notify( "debug_patrol" ); + tank thread tank_debug_patrol( nodes[0], nodes[1] ); + } #/ - } } tank_debug_hud_init() { /# - host = gethostplayer(); - while ( !isDefined( host ) ) - { - wait 0,25; - host = gethostplayer(); - } - x = 80; - y = 40; - level.ai_tank_bar = newclienthudelem( host ); - level.ai_tank_bar.x = x + 80; - level.ai_tank_bar.y = y + 2; - level.ai_tank_bar.alignx = "left"; - level.ai_tank_bar.aligny = "top"; - level.ai_tank_bar.horzalign = "fullscreen"; - level.ai_tank_bar.vertalign = "fullscreen"; - level.ai_tank_bar.alpha = 0; - level.ai_tank_bar.foreground = 0; - level.ai_tank_bar setshader( "black", 1, 8 ); - level.ai_tank_text = newclienthudelem( host ); - level.ai_tank_text.x = x + 80; - level.ai_tank_text.y = y; - level.ai_tank_text.alignx = "left"; - level.ai_tank_text.aligny = "top"; - level.ai_tank_text.horzalign = "fullscreen"; - level.ai_tank_text.vertalign = "fullscreen"; - level.ai_tank_text.alpha = 0; - level.ai_tank_text.fontscale = 1; - level.ai_tank_text.foreground = 1; + for ( host = gethostplayer(); !isdefined( host ); host = gethostplayer() ) + wait 0.25; + + x = 80; + y = 40; + level.ai_tank_bar = newclienthudelem( host ); + level.ai_tank_bar.x = x + 80; + level.ai_tank_bar.y = y + 2; + level.ai_tank_bar.alignx = "left"; + level.ai_tank_bar.aligny = "top"; + level.ai_tank_bar.horzalign = "fullscreen"; + level.ai_tank_bar.vertalign = "fullscreen"; + level.ai_tank_bar.alpha = 0; + level.ai_tank_bar.foreground = 0; + level.ai_tank_bar setshader( "black", 1, 8 ); + level.ai_tank_text = newclienthudelem( host ); + level.ai_tank_text.x = x + 80; + level.ai_tank_text.y = y; + level.ai_tank_text.alignx = "left"; + level.ai_tank_text.aligny = "top"; + level.ai_tank_text.horzalign = "fullscreen"; + level.ai_tank_text.vertalign = "fullscreen"; + level.ai_tank_text.alpha = 0; + level.ai_tank_text.fontscale = 1; + level.ai_tank_text.foreground = 1; #/ } tank_debug_health() { /# - self.damage_debug = ""; - level.ai_tank_bar.alpha = 1; - level.ai_tank_text.alpha = 1; - for ( ;; ) - { - wait 0,05; - if ( !isDefined( self ) || !isalive( self ) ) - { - level.ai_tank_bar.alpha = 0; - level.ai_tank_text.alpha = 0; - return; - } - width = ( self.health / self.maxhealth ) * 300; - width = int( max( width, 1 ) ); - level.ai_tank_bar setshader( "black", width, 8 ); - str = ( self.health + " Last Damage: " ) + self.damage_debug; - level.ai_tank_text settext( str ); + self.damage_debug = ""; + level.ai_tank_bar.alpha = 1; + level.ai_tank_text.alpha = 1; + + for (;;) + { + wait 0.05; + + if ( !isdefined( self ) || !isalive( self ) ) + { + level.ai_tank_bar.alpha = 0; + level.ai_tank_text.alpha = 0; + return; + } + + width = self.health / self.maxhealth * 300; + width = int( max( width, 1 ) ); + level.ai_tank_bar setshader( "black", width, 8 ); + str = self.health + " Last Damage: " + self.damage_debug; + level.ai_tank_text settext( str ); + } #/ - } } diff --git a/Multiplayer Core/patch_mp/maps/mp/killstreaks/_airsupport.gsc b/Multiplayer Core/patch_mp/maps/mp/killstreaks/_airsupport.gsc index e2f0abd..35d3cfc 100644 --- a/Multiplayer Core/patch_mp/maps/mp/killstreaks/_airsupport.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/killstreaks/_airsupport.gsc @@ -1,948 +1,887 @@ -#include maps/mp/gametypes/_weapons; -#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\_weapons; initairsupport() { - if ( !isDefined( level.airsupportheightscale ) ) - { - level.airsupportheightscale = 1; - } - level.airsupportheightscale = getdvarintdefault( "scr_airsupportHeightScale", level.airsupportheightscale ); - level.noflyzones = []; - level.noflyzones = getentarray( "no_fly_zone", "targetname" ); - airsupport_heights = getstructarray( "air_support_height", "targetname" ); + if ( !isdefined( level.airsupportheightscale ) ) + level.airsupportheightscale = 1; + + level.airsupportheightscale = getdvarintdefault( "scr_airsupportHeightScale", level.airsupportheightscale ); + level.noflyzones = []; + level.noflyzones = getentarray( "no_fly_zone", "targetname" ); + airsupport_heights = getstructarray( "air_support_height", "targetname" ); /# - if ( airsupport_heights.size > 1 ) - { - error( "Found more then one 'air_support_height' structs in the map" ); + if ( airsupport_heights.size > 1 ) + error( "Found more then one 'air_support_height' structs in the map" ); #/ - } - airsupport_heights = getentarray( "air_support_height", "targetname" ); + airsupport_heights = getentarray( "air_support_height", "targetname" ); /# - if ( airsupport_heights.size > 0 ) - { - error( "Found an entity in the map with an 'air_support_height' targetname. There should be only structs." ); + if ( airsupport_heights.size > 0 ) + error( "Found an entity in the map with an 'air_support_height' targetname. There should be only structs." ); #/ - } - heli_height_meshes = getentarray( "heli_height_lock", "classname" ); + heli_height_meshes = getentarray( "heli_height_lock", "classname" ); /# - if ( heli_height_meshes.size > 1 ) - { - error( "Found more then one 'heli_height_lock' classname in the map" ); + if ( heli_height_meshes.size > 1 ) + error( "Found more then one 'heli_height_lock' classname in the map" ); #/ - } } finishhardpointlocationusage( location, usedcallback ) { - self notify( "used" ); - wait 0,05; - return self [[ usedcallback ]]( location ); + self notify( "used" ); + wait 0.05; + return self [[ usedcallback ]]( location ); } finishdualhardpointlocationusage( locationstart, locationend, usedcallback ) { - self notify( "used" ); - wait 0,05; - return self [[ usedcallback ]]( locationstart, locationend ); + self notify( "used" ); + wait 0.05; + return self [[ usedcallback ]]( locationstart, locationend ); } endselectionongameend() { - self endon( "death" ); - self endon( "disconnect" ); - self endon( "cancel_location" ); - self endon( "used" ); - self endon( "host_migration_begin" ); - level waittill( "game_ended" ); - self notify( "game_ended" ); + self endon( "death" ); + self endon( "disconnect" ); + self endon( "cancel_location" ); + self endon( "used" ); + self endon( "host_migration_begin" ); + + level waittill( "game_ended" ); + + self notify( "game_ended" ); } endselectiononhostmigration() { - self endon( "death" ); - self endon( "disconnect" ); - self endon( "cancel_location" ); - self endon( "used" ); - self endon( "game_ended" ); - level waittill( "host_migration_begin" ); - self notify( "cancel_location" ); + self endon( "death" ); + self endon( "disconnect" ); + self endon( "cancel_location" ); + self endon( "used" ); + self endon( "game_ended" ); + + level waittill( "host_migration_begin" ); + + self notify( "cancel_location" ); } endselectionthink() { /# - assert( isplayer( self ) ); + assert( isplayer( self ) ); #/ /# - assert( isalive( self ) ); + assert( isalive( self ) ); #/ /# - assert( isDefined( self.selectinglocation ) ); + assert( isdefined( self.selectinglocation ) ); #/ /# - assert( self.selectinglocation == 1 ); + assert( self.selectinglocation == 1 ); #/ - self thread endselectionongameend(); - self thread endselectiononhostmigration(); - event = self waittill_any_return( "death", "disconnect", "cancel_location", "game_ended", "used", "weapon_change", "emp_jammed" ); - if ( event != "disconnect" ) - { - self endlocationselection(); - self.selectinglocation = undefined; - } - if ( event != "used" ) - { - self notify( "confirm_location" ); - } + self thread endselectionongameend(); + self thread endselectiononhostmigration(); + event = self waittill_any_return( "death", "disconnect", "cancel_location", "game_ended", "used", "weapon_change", "emp_jammed" ); + + if ( event != "disconnect" ) + { + self endlocationselection(); + self.selectinglocation = undefined; + } + + if ( event != "used" ) + self notify( "confirm_location", undefined, undefined ); } stoploopsoundaftertime( time ) { - self endon( "death" ); - wait time; - self stoploopsound( 2 ); + self endon( "death" ); + wait( time ); + self stoploopsound( 2 ); } calculatefalltime( flyheight ) { - gravity = getDvarInt( "bg_gravity" ); - time = sqrt( ( 2 * flyheight ) / gravity ); - return time; + gravity = getdvarint( "bg_gravity" ); + time = sqrt( 2 * flyheight / gravity ); + return time; } calculatereleasetime( flytime, flyheight, flyspeed, bombspeedscale ) { - falltime = calculatefalltime( flyheight ); - bomb_x = flyspeed * bombspeedscale * falltime; - release_time = bomb_x / flyspeed; - return ( flytime * 0,5 ) - release_time; + falltime = calculatefalltime( flyheight ); + bomb_x = flyspeed * bombspeedscale * falltime; + release_time = bomb_x / flyspeed; + return flytime * 0.5 - release_time; } getminimumflyheight() { - airsupport_height = getstruct( "air_support_height", "targetname" ); - if ( isDefined( airsupport_height ) ) - { - planeflyheight = airsupport_height.origin[ 2 ]; - } - else - { + airsupport_height = getstruct( "air_support_height", "targetname" ); + + if ( isdefined( airsupport_height ) ) + planeflyheight = airsupport_height.origin[2]; + else + { /# - println( "WARNING: Missing air_support_height entity in the map. Using default height." ); + println( "WARNING: Missing air_support_height entity in the map. Using default height." ); #/ - planeflyheight = 850; - if ( isDefined( level.airsupportheightscale ) ) - { - level.airsupportheightscale = getdvarintdefault( "scr_airsupportHeightScale", level.airsupportheightscale ); - planeflyheight *= getdvarintdefault( "scr_airsupportHeightScale", level.airsupportheightscale ); - } - if ( isDefined( level.forceairsupportmapheight ) ) - { - planeflyheight += level.forceairsupportmapheight; - } - } - return planeflyheight; + planeflyheight = 850; + + if ( isdefined( level.airsupportheightscale ) ) + { + level.airsupportheightscale = getdvarintdefault( "scr_airsupportHeightScale", level.airsupportheightscale ); + planeflyheight *= getdvarintdefault( "scr_airsupportHeightScale", level.airsupportheightscale ); + } + + if ( isdefined( level.forceairsupportmapheight ) ) + planeflyheight += level.forceairsupportmapheight; + } + + return planeflyheight; } callstrike( flightplan ) { - level.bomberdamagedents = []; - level.bomberdamagedentscount = 0; - level.bomberdamagedentsindex = 0; + level.bomberdamagedents = []; + level.bomberdamagedentscount = 0; + level.bomberdamagedentsindex = 0; /# - assert( flightplan.distance != 0, "callStrike can not be passed a zero fly distance" ); + assert( flightplan.distance != 0, "callStrike can not be passed a zero fly distance" ); #/ - planehalfdistance = flightplan.distance / 2; - path = getstrikepath( flightplan.target, flightplan.height, planehalfdistance ); - startpoint = path[ "start" ]; - endpoint = path[ "end" ]; - flightplan.height = path[ "height" ]; - direction = path[ "direction" ]; - d = length( startpoint - endpoint ); - flytime = d / flightplan.speed; - bombtime = calculatereleasetime( flytime, flightplan.height, flightplan.speed, flightplan.bombspeedscale ); - if ( bombtime < 0 ) - { - bombtime = 0; - } + planehalfdistance = flightplan.distance / 2; + path = getstrikepath( flightplan.target, flightplan.height, planehalfdistance ); + startpoint = path["start"]; + endpoint = path["end"]; + flightplan.height = path["height"]; + direction = path["direction"]; + d = length( startpoint - endpoint ); + flytime = d / flightplan.speed; + bombtime = calculatereleasetime( flytime, flightplan.height, flightplan.speed, flightplan.bombspeedscale ); + + if ( bombtime < 0 ) + bombtime = 0; /# - assert( flytime > bombtime ); + assert( flytime > bombtime ); #/ - flightplan.owner endon( "disconnect" ); - requireddeathcount = flightplan.owner.deathcount; - side = vectorcross( anglesToForward( direction ), ( 1, 1, 1 ) ); - plane_seperation = 25; - side_offset = vectorScale( side, plane_seperation ); - level thread planestrike( flightplan.owner, requireddeathcount, startpoint, endpoint, bombtime, flytime, flightplan.speed, flightplan.bombspeedscale, direction, flightplan.planespawncallback ); - wait flightplan.planespacing; - level thread planestrike( flightplan.owner, requireddeathcount, startpoint + side_offset, endpoint + side_offset, bombtime, flytime, flightplan.speed, flightplan.bombspeedscale, direction, flightplan.planespawncallback ); - wait flightplan.planespacing; - side_offset = vectorScale( side, -1 * plane_seperation ); - level thread planestrike( flightplan.owner, requireddeathcount, startpoint + side_offset, endpoint + side_offset, bombtime, flytime, flightplan.speed, flightplan.bombspeedscale, direction, flightplan.planespawncallback ); + flightplan.owner endon( "disconnect" ); + requireddeathcount = flightplan.owner.deathcount; + side = vectorcross( anglestoforward( direction ), ( 0, 0, 1 ) ); + plane_seperation = 25; + side_offset = vectorscale( side, plane_seperation ); + level thread planestrike( flightplan.owner, requireddeathcount, startpoint, endpoint, bombtime, flytime, flightplan.speed, flightplan.bombspeedscale, direction, flightplan.planespawncallback ); + wait( flightplan.planespacing ); + level thread planestrike( flightplan.owner, requireddeathcount, startpoint + side_offset, endpoint + side_offset, bombtime, flytime, flightplan.speed, flightplan.bombspeedscale, direction, flightplan.planespawncallback ); + wait( flightplan.planespacing ); + side_offset = vectorscale( side, -1 * plane_seperation ); + level thread planestrike( flightplan.owner, requireddeathcount, startpoint + side_offset, endpoint + side_offset, bombtime, flytime, flightplan.speed, flightplan.bombspeedscale, direction, flightplan.planespawncallback ); } planestrike( owner, requireddeathcount, pathstart, pathend, bombtime, flytime, flyspeed, bombspeedscale, direction, planespawnedfunction ) { - if ( !isDefined( owner ) ) - { - return; - } - plane = spawnplane( owner, "script_model", pathstart ); - plane.angles = direction; - plane moveto( pathend, flytime, 0, 0 ); - thread debug_plane_line( flytime, flyspeed, pathstart, pathend ); - if ( isDefined( planespawnedfunction ) ) - { - plane [[ planespawnedfunction ]]( owner, requireddeathcount, pathstart, pathend, bombtime, bombspeedscale, flytime, flyspeed ); - } - wait flytime; - plane notify( "delete" ); - plane delete(); + if ( !isdefined( owner ) ) + return; + + plane = spawnplane( owner, "script_model", pathstart ); + plane.angles = direction; + plane moveto( pathend, flytime, 0, 0 ); + thread debug_plane_line( flytime, flyspeed, pathstart, pathend ); + + if ( isdefined( planespawnedfunction ) ) + plane [[ planespawnedfunction ]]( owner, requireddeathcount, pathstart, pathend, bombtime, bombspeedscale, flytime, flyspeed ); + + wait( flytime ); + plane notify( "delete" ); + plane delete(); } determinegroundpoint( player, position ) { - ground = ( position[ 0 ], position[ 1 ], player.origin[ 2 ] ); - trace = bullettrace( ground + vectorScale( ( 1, 1, 1 ), 10000 ), ground, 0, undefined ); - return trace[ "position" ]; + ground = ( position[0], position[1], player.origin[2] ); + trace = bullettrace( ground + vectorscale( ( 0, 0, 1 ), 10000.0 ), ground, 0, undefined ); + return trace["position"]; } determinetargetpoint( player, position ) { - point = determinegroundpoint( player, position ); - return clamptarget( point ); + point = determinegroundpoint( player, position ); + return clamptarget( point ); } getmintargetheight() { - return level.spawnmins[ 2 ] - 500; + return level.spawnmins[2] - 500; } getmaxtargetheight() { - return level.spawnmaxs[ 2 ] + 500; + return level.spawnmaxs[2] + 500; } clamptarget( target ) { - min = getmintargetheight(); - max = getmaxtargetheight(); - if ( target[ 2 ] < min ) - { - target[ 2 ] = min; - } - if ( target[ 2 ] > max ) - { - target[ 2 ] = max; - } - return target; + min = getmintargetheight(); + max = getmaxtargetheight(); + + if ( target[2] < min ) + target[2] = min; + + if ( target[2] > max ) + target[2] = max; + + return target; } _insidecylinder( point, base, radius, height ) { - if ( isDefined( height ) ) - { - if ( point[ 2 ] > ( base[ 2 ] + height ) ) - { - return 0; - } - } - dist = distance2d( point, base ); - if ( dist < radius ) - { - return 1; - } - return 0; + if ( isdefined( height ) ) + { + if ( point[2] > base[2] + height ) + return false; + } + + dist = distance2d( point, base ); + + if ( dist < radius ) + return true; + + return false; } _insidenoflyzonebyindex( point, index, disregardheight ) { - height = level.noflyzones[ index ].height; - if ( isDefined( disregardheight ) ) - { - height = undefined; - } - return _insidecylinder( point, level.noflyzones[ index ].origin, level.noflyzones[ index ].radius, height ); + height = level.noflyzones[index].height; + + if ( isdefined( disregardheight ) ) + height = undefined; + + return _insidecylinder( point, level.noflyzones[index].origin, level.noflyzones[index].radius, height ); } getnoflyzoneheight( point ) { - height = point[ 2 ]; - origin = undefined; - i = 0; - while ( i < level.noflyzones.size ) - { - if ( _insidenoflyzonebyindex( point, i ) ) - { - if ( height < level.noflyzones[ i ].height ) - { - height = level.noflyzones[ i ].height; - origin = level.noflyzones[ i ].origin; - } - } - i++; - } - if ( !isDefined( origin ) ) - { - return point[ 2 ]; - } - return origin[ 2 ] + height; + height = point[2]; + origin = undefined; + + for ( i = 0; i < level.noflyzones.size; i++ ) + { + if ( _insidenoflyzonebyindex( point, i ) ) + { + if ( height < level.noflyzones[i].height ) + { + height = level.noflyzones[i].height; + origin = level.noflyzones[i].origin; + } + } + } + + if ( !isdefined( origin ) ) + return point[2]; + + return origin[2] + height; } insidenoflyzones( point, disregardheight ) { - noflyzones = []; - i = 0; - while ( i < level.noflyzones.size ) - { - if ( _insidenoflyzonebyindex( point, i, disregardheight ) ) - { - noflyzones[ noflyzones.size ] = i; - } - i++; - } - return noflyzones; + noflyzones = []; + + for ( i = 0; i < level.noflyzones.size; i++ ) + { + if ( _insidenoflyzonebyindex( point, i, disregardheight ) ) + noflyzones[noflyzones.size] = i; + } + + return noflyzones; } crossesnoflyzone( start, end ) { - i = 0; - while ( i < level.noflyzones.size ) - { - point = closestpointonline( level.noflyzones[ i ].origin + ( 0, 0, 0,5 * level.noflyzones[ i ].height ), start, end ); - dist = distance2d( point, level.noflyzones[ i ].origin ); - if ( point[ 2 ] > ( level.noflyzones[ i ].origin[ 2 ] + level.noflyzones[ i ].height ) ) - { - i++; - continue; - } - else - { - if ( dist < level.noflyzones[ i ].radius ) - { - return i; - } - } - i++; - } - return undefined; + for ( i = 0; i < level.noflyzones.size; i++ ) + { + point = closestpointonline( level.noflyzones[i].origin + ( 0, 0, 0.5 * level.noflyzones[i].height ), start, end ); + dist = distance2d( point, level.noflyzones[i].origin ); + + if ( point[2] > level.noflyzones[i].origin[2] + level.noflyzones[i].height ) + continue; + + if ( dist < level.noflyzones[i].radius ) + return i; + } + + return undefined; } crossesnoflyzones( start, end ) { - zones = []; - i = 0; - while ( i < level.noflyzones.size ) - { - point = closestpointonline( level.noflyzones[ i ].origin, start, end ); - dist = distance2d( point, level.noflyzones[ i ].origin ); - if ( point[ 2 ] > ( level.noflyzones[ i ].origin[ 2 ] + level.noflyzones[ i ].height ) ) - { - i++; - continue; - } - else - { - if ( dist < level.noflyzones[ i ].radius ) - { - zones[ zones.size ] = i; - } - } - i++; - } - return zones; + zones = []; + + for ( i = 0; i < level.noflyzones.size; i++ ) + { + point = closestpointonline( level.noflyzones[i].origin, start, end ); + dist = distance2d( point, level.noflyzones[i].origin ); + + if ( point[2] > level.noflyzones[i].origin[2] + level.noflyzones[i].height ) + continue; + + if ( dist < level.noflyzones[i].radius ) + zones[zones.size] = i; + } + + return zones; } getnoflyzoneheightcrossed( start, end, minheight ) { - height = minheight; - i = 0; - while ( i < level.noflyzones.size ) - { - point = closestpointonline( level.noflyzones[ i ].origin, start, end ); - dist = distance2d( point, level.noflyzones[ i ].origin ); - if ( dist < level.noflyzones[ i ].radius ) - { - if ( height < level.noflyzones[ i ].height ) - { - height = level.noflyzones[ i ].height; - } - } - i++; - } - return height; + height = minheight; + + for ( i = 0; i < level.noflyzones.size; i++ ) + { + point = closestpointonline( level.noflyzones[i].origin, start, end ); + dist = distance2d( point, level.noflyzones[i].origin ); + + if ( dist < level.noflyzones[i].radius ) + { + if ( height < level.noflyzones[i].height ) + height = level.noflyzones[i].height; + } + } + + return height; } _shouldignorenoflyzone( noflyzone, noflyzones ) { - if ( !isDefined( noflyzone ) ) - { - return 1; - } - i = 0; - while ( i < noflyzones.size ) - { - if ( isDefined( noflyzones[ i ] ) && noflyzones[ i ] == noflyzone ) - { - return 1; - } - i++; - } - return 0; + if ( !isdefined( noflyzone ) ) + return true; + + for ( i = 0; i < noflyzones.size; i++ ) + { + if ( isdefined( noflyzones[i] ) && noflyzones[i] == noflyzone ) + return true; + } + + return false; } _shouldignorestartgoalnoflyzone( noflyzone, startnoflyzones, goalnoflyzones ) { - if ( !isDefined( noflyzone ) ) - { - return 1; - } - if ( _shouldignorenoflyzone( noflyzone, startnoflyzones ) ) - { - return 1; - } - if ( _shouldignorenoflyzone( noflyzone, goalnoflyzones ) ) - { - return 1; - } - return 0; + if ( !isdefined( noflyzone ) ) + return true; + + if ( _shouldignorenoflyzone( noflyzone, startnoflyzones ) ) + return true; + + if ( _shouldignorenoflyzone( noflyzone, goalnoflyzones ) ) + return true; + + return false; } gethelipath( start, goal ) { - startnoflyzones = insidenoflyzones( start, 1 ); - thread debug_line( start, goal, ( 1, 1, 1 ) ); - goalnoflyzones = insidenoflyzones( goal ); - if ( goalnoflyzones.size ) - { - goal = ( goal[ 0 ], goal[ 1 ], getnoflyzoneheight( goal ) ); - } - goal_points = calculatepath( start, goal, startnoflyzones, goalnoflyzones ); - if ( !isDefined( goal_points ) ) - { - return undefined; - } + startnoflyzones = insidenoflyzones( start, 1 ); + thread debug_line( start, goal, ( 1, 1, 1 ) ); + goalnoflyzones = insidenoflyzones( goal ); + + if ( goalnoflyzones.size ) + goal = ( goal[0], goal[1], getnoflyzoneheight( goal ) ); + + goal_points = calculatepath( start, goal, startnoflyzones, goalnoflyzones ); + + if ( !isdefined( goal_points ) ) + return undefined; /# - assert( goal_points.size >= 1 ); + assert( goal_points.size >= 1 ); #/ - return goal_points; + return goal_points; } followpath( path, donenotify, stopatgoal ) { - i = 0; - while ( i < ( path.size - 1 ) ) - { - self setvehgoalpos( path[ i ], 0 ); - thread debug_line( self.origin, path[ i ], ( 1, 1, 1 ) ); - self waittill( "goal" ); - i++; - } - self setvehgoalpos( path[ path.size - 1 ], stopatgoal ); - thread debug_line( self.origin, path[ i ], ( 1, 1, 1 ) ); - self waittill( "goal" ); - if ( isDefined( donenotify ) ) - { - self notify( donenotify ); - } + for ( i = 0; i < path.size - 1; i++ ) + { + self setvehgoalpos( path[i], 0 ); + thread debug_line( self.origin, path[i], ( 1, 1, 0 ) ); + + self waittill( "goal" ); + } + + self setvehgoalpos( path[path.size - 1], stopatgoal ); + thread debug_line( self.origin, path[i], ( 1, 1, 0 ) ); + + self waittill( "goal" ); + + if ( isdefined( donenotify ) ) + self notify( donenotify ); } setgoalposition( goal, donenotify, stopatgoal ) { - if ( !isDefined( stopatgoal ) ) - { - stopatgoal = 1; - } - start = self.origin; - goal_points = gethelipath( start, goal ); - if ( !isDefined( goal_points ) ) - { - goal_points = []; - goal_points[ 0 ] = goal; - } - followpath( goal_points, donenotify, stopatgoal ); + if ( !isdefined( stopatgoal ) ) + stopatgoal = 1; + + start = self.origin; + goal_points = gethelipath( start, goal ); + + if ( !isdefined( goal_points ) ) + { + goal_points = []; + goal_points[0] = goal; + } + + followpath( goal_points, donenotify, stopatgoal ); } clearpath( start, end, startnoflyzone, goalnoflyzone ) { - noflyzones = crossesnoflyzones( start, end ); - i = 0; - while ( i < noflyzones.size ) - { - if ( !_shouldignorestartgoalnoflyzone( noflyzones[ i ], startnoflyzone, goalnoflyzone ) ) - { - return 0; - } - i++; - } - return 1; + noflyzones = crossesnoflyzones( start, end ); + + for ( i = 0; i < noflyzones.size; i++ ) + { + if ( !_shouldignorestartgoalnoflyzone( noflyzones[i], startnoflyzone, goalnoflyzone ) ) + return false; + } + + return true; } append_array( dst, src ) { - i = 0; - while ( i < src.size ) - { - dst[ dst.size ] = src[ i ]; - i++; - } + for ( i = 0; i < src.size; i++ ) + dst[dst.size] = src[i]; } calculatepath_r( start, end, points, startnoflyzones, goalnoflyzones, depth ) { - depth--; + depth--; - if ( depth <= 0 ) - { - points[ points.size ] = end; - return points; - } - noflyzones = crossesnoflyzones( start, end ); - i = 0; - while ( i < noflyzones.size ) - { - noflyzone = noflyzones[ i ]; - if ( !_shouldignorestartgoalnoflyzone( noflyzone, startnoflyzones, goalnoflyzones ) ) - { - return undefined; - } - i++; - } - points[ points.size ] = end; - return points; + if ( depth <= 0 ) + { + points[points.size] = end; + return points; + } + + noflyzones = crossesnoflyzones( start, end ); + + for ( i = 0; i < noflyzones.size; i++ ) + { + noflyzone = noflyzones[i]; + + if ( !_shouldignorestartgoalnoflyzone( noflyzone, startnoflyzones, goalnoflyzones ) ) + return undefined; + } + + points[points.size] = end; + return points; } calculatepath( start, end, startnoflyzones, goalnoflyzones ) { - points = []; - points = calculatepath_r( start, end, points, startnoflyzones, goalnoflyzones, 3 ); - if ( !isDefined( points ) ) - { - return undefined; - } + points = []; + points = calculatepath_r( start, end, points, startnoflyzones, goalnoflyzones, 3 ); + + if ( !isdefined( points ) ) + return undefined; /# - assert( points.size >= 1 ); + assert( points.size >= 1 ); #/ - debug_sphere( points[ points.size - 1 ], 10, ( 1, 1, 1 ), 1, 1000 ); - point = start; - i = 0; - while ( i < points.size ) - { - thread debug_line( point, points[ i ], ( 1, 1, 1 ) ); - debug_sphere( points[ i ], 10, ( 1, 1, 1 ), 1, 1000 ); - point = points[ i ]; - i++; - } - return points; + debug_sphere( points[points.size - 1], 10, ( 1, 0, 0 ), 1, 1000 ); + point = start; + + for ( i = 0; i < points.size; i++ ) + { + thread debug_line( point, points[i], ( 0, 1, 0 ) ); + debug_sphere( points[i], 10, ( 0, 0, 1 ), 1, 1000 ); + point = points[i]; + } + + return points; } _getstrikepathstartandend( goal, yaw, halfdistance ) { - direction = ( 0, yaw, 0 ); - startpoint = goal + vectorScale( anglesToForward( direction ), -1 * halfdistance ); - endpoint = goal + vectorScale( anglesToForward( direction ), halfdistance ); - noflyzone = crossesnoflyzone( startpoint, endpoint ); - path = []; - if ( isDefined( noflyzone ) ) - { - path[ "noFlyZone" ] = noflyzone; - startpoint = ( startpoint[ 0 ], startpoint[ 1 ], level.noflyzones[ noflyzone ].origin[ 2 ] + level.noflyzones[ noflyzone ].height ); - endpoint = ( endpoint[ 0 ], endpoint[ 1 ], startpoint[ 2 ] ); - } - else - { - } - path[ "start" ] = startpoint; - path[ "end" ] = endpoint; - path[ "direction" ] = direction; - return path; + direction = ( 0, yaw, 0 ); + startpoint = goal + vectorscale( anglestoforward( direction ), -1 * halfdistance ); + endpoint = goal + vectorscale( anglestoforward( direction ), halfdistance ); + noflyzone = crossesnoflyzone( startpoint, endpoint ); + path = []; + + if ( isdefined( noflyzone ) ) + { + path["noFlyZone"] = noflyzone; + startpoint = ( startpoint[0], startpoint[1], level.noflyzones[noflyzone].origin[2] + level.noflyzones[noflyzone].height ); + endpoint = ( endpoint[0], endpoint[1], startpoint[2] ); + } + else + path["noFlyZone"] = undefined; + + path["start"] = startpoint; + path["end"] = endpoint; + path["direction"] = direction; + return path; } getstrikepath( target, height, halfdistance, yaw ) { - noflyzoneheight = getnoflyzoneheight( target ); - worldheight = target[ 2 ] + height; - if ( noflyzoneheight > worldheight ) - { - worldheight = noflyzoneheight; - } - goal = ( target[ 0 ], target[ 1 ], worldheight ); - path = []; - if ( !isDefined( yaw ) || yaw != "random" ) - { - i = 0; - while ( i < 3 ) - { - path = _getstrikepathstartandend( goal, randomint( 360 ), halfdistance ); - if ( !isDefined( path[ "noFlyZone" ] ) ) - { - break; - } - else - { - i++; - } - } - } - else path = _getstrikepathstartandend( goal, yaw, halfdistance ); - path[ "height" ] = worldheight - target[ 2 ]; - return path; + noflyzoneheight = getnoflyzoneheight( target ); + worldheight = target[2] + height; + + if ( noflyzoneheight > worldheight ) + worldheight = noflyzoneheight; + + goal = ( target[0], target[1], worldheight ); + path = []; + + if ( !isdefined( yaw ) || yaw != "random" ) + { + for ( i = 0; i < 3; i++ ) + { + path = _getstrikepathstartandend( goal, randomint( 360 ), halfdistance ); + + if ( !isdefined( path["noFlyZone"] ) ) + break; + } + } + else + path = _getstrikepathstartandend( goal, yaw, halfdistance ); + + path["height"] = worldheight - target[2]; + return path; } doglassdamage( pos, radius, max, min, mod ) { - wait randomfloatrange( 0,05, 0,15 ); - glassradiusdamage( pos, radius, max, min, mod ); + wait( randomfloatrange( 0.05, 0.15 ) ); + glassradiusdamage( pos, radius, max, min, mod ); } entlosradiusdamage( ent, pos, radius, max, min, owner, einflictor ) { - dist = distance( pos, ent.damagecenter ); - if ( ent.isplayer || ent.isactor ) - { - assumed_ceiling_height = 800; - eye_position = ent.entity geteye(); - head_height = eye_position[ 2 ]; - debug_display_time = 4000; - trace = maps/mp/gametypes/_weapons::weapondamagetrace( ent.entity.origin, ent.entity.origin + ( 0, 0, assumed_ceiling_height ), 0, undefined ); - indoors = trace[ "fraction" ] != 1; - if ( indoors ) - { - test_point = trace[ "position" ]; - debug_star( test_point, ( 1, 1, 1 ), debug_display_time ); - trace = maps/mp/gametypes/_weapons::weapondamagetrace( ( test_point[ 0 ], test_point[ 1 ], head_height ), ( pos[ 0 ], pos[ 1 ], head_height ), 0, undefined ); - indoors = trace[ "fraction" ] != 1; - if ( indoors ) - { - debug_star( ( pos[ 0 ], pos[ 1 ], head_height ), ( 1, 1, 1 ), debug_display_time ); - dist *= 4; - if ( dist > radius ) - { - return 0; - } - } - else - { - debug_star( ( pos[ 0 ], pos[ 1 ], head_height ), ( 1, 1, 1 ), debug_display_time ); - trace = maps/mp/gametypes/_weapons::weapondamagetrace( ( pos[ 0 ], pos[ 1 ], head_height ), pos, 0, undefined ); - indoors = trace[ "fraction" ] != 1; - if ( indoors ) - { - debug_star( pos, ( 1, 1, 1 ), debug_display_time ); - dist *= 4; - if ( dist > radius ) - { - return 0; - } - } - else - { - debug_star( pos, ( 1, 1, 1 ), debug_display_time ); - } - } - } - else - { - debug_star( ent.entity.origin + ( 0, 0, assumed_ceiling_height ), ( 1, 1, 1 ), debug_display_time ); - } - } - ent.damage = int( max + ( ( ( min - max ) * dist ) / radius ) ); - ent.pos = pos; - ent.damageowner = owner; - ent.einflictor = einflictor; - return 1; + dist = distance( pos, ent.damagecenter ); + + if ( ent.isplayer || ent.isactor ) + { + assumed_ceiling_height = 800; + eye_position = ent.entity geteye(); + head_height = eye_position[2]; + debug_display_time = 4000; + trace = maps\mp\gametypes\_weapons::weapondamagetrace( ent.entity.origin, ent.entity.origin + ( 0, 0, assumed_ceiling_height ), 0, undefined ); + indoors = trace["fraction"] != 1; + + if ( indoors ) + { + test_point = trace["position"]; + debug_star( test_point, ( 0, 1, 0 ), debug_display_time ); + trace = maps\mp\gametypes\_weapons::weapondamagetrace( ( test_point[0], test_point[1], head_height ), ( pos[0], pos[1], head_height ), 0, undefined ); + indoors = trace["fraction"] != 1; + + if ( indoors ) + { + debug_star( ( pos[0], pos[1], head_height ), ( 0, 1, 0 ), debug_display_time ); + dist *= 4; + + if ( dist > radius ) + return false; + } + else + { + debug_star( ( pos[0], pos[1], head_height ), ( 1, 0, 0 ), debug_display_time ); + trace = maps\mp\gametypes\_weapons::weapondamagetrace( ( pos[0], pos[1], head_height ), pos, 0, undefined ); + indoors = trace["fraction"] != 1; + + if ( indoors ) + { + debug_star( pos, ( 0, 1, 0 ), debug_display_time ); + dist *= 4; + + if ( dist > radius ) + return false; + } + else + debug_star( pos, ( 1, 0, 0 ), debug_display_time ); + } + } + else + debug_star( ent.entity.origin + ( 0, 0, assumed_ceiling_height ), ( 1, 0, 0 ), debug_display_time ); + } + + ent.damage = int( max + ( min - max ) * dist / radius ); + ent.pos = pos; + ent.damageowner = owner; + ent.einflictor = einflictor; + return true; } debug_no_fly_zones() { /# - i = 0; - while ( i < level.noflyzones.size ) - { - debug_cylinder( level.noflyzones[ i ].origin, level.noflyzones[ i ].radius, level.noflyzones[ i ].height, ( 1, 1, 1 ), undefined, 5000 ); - i++; + for ( i = 0; i < level.noflyzones.size; i++ ) + debug_cylinder( level.noflyzones[i].origin, level.noflyzones[i].radius, level.noflyzones[i].height, ( 1, 1, 1 ), undefined, 5000 ); #/ - } } debug_plane_line( flytime, flyspeed, pathstart, pathend ) { - thread debug_line( pathstart, pathend, ( 1, 1, 1 ) ); - delta = vectornormalize( pathend - pathstart ); - i = 0; - while ( i < flytime ) - { - thread debug_star( pathstart + vectorScale( delta, i * flyspeed ), ( 1, 1, 1 ) ); - i++; - } + thread debug_line( pathstart, pathend, ( 1, 1, 1 ) ); + delta = vectornormalize( pathend - pathstart ); + + for ( i = 0; i < flytime; i++ ) + thread debug_star( pathstart + vectorscale( delta, i * flyspeed ), ( 1, 0, 0 ) ); } debug_draw_bomb_explosion( prevpos ) { - self notify( "draw_explosion" ); - wait 0,05; - self endon( "draw_explosion" ); - self waittill( "projectile_impact", weapon, position ); - thread debug_line( prevpos, position, ( 0,5, 1, 0 ) ); - thread debug_star( position, ( 1, 1, 1 ) ); + self notify( "draw_explosion" ); + wait 0.05; + self endon( "draw_explosion" ); + + self waittill( "projectile_impact", weapon, position ); + + thread debug_line( prevpos, position, ( 0.5, 1, 0 ) ); + thread debug_star( position, ( 1, 0, 0 ) ); } debug_draw_bomb_path( projectile, color, time ) { /# - self endon( "death" ); - level.airsupport_debug = getdvarintdefault( "scr_airsupport_debug", 0 ); - if ( !isDefined( color ) ) - { - color = ( 0,5, 1, 0 ); - } - while ( isDefined( level.airsupport_debug ) && level.airsupport_debug == 1 ) - { - prevpos = self.origin; - while ( isDefined( self.origin ) ) - { - thread debug_line( prevpos, self.origin, color, time ); - prevpos = self.origin; - if ( isDefined( projectile ) && projectile ) - { - thread debug_draw_bomb_explosion( prevpos ); - } - wait 0,2; + self endon( "death" ); + level.airsupport_debug = getdvarintdefault( "scr_airsupport_debug", 0 ); + + if ( !isdefined( color ) ) + color = ( 0.5, 1, 0 ); + + if ( isdefined( level.airsupport_debug ) && level.airsupport_debug == 1.0 ) + { + prevpos = self.origin; + + while ( isdefined( self.origin ) ) + { + thread debug_line( prevpos, self.origin, color, time ); + prevpos = self.origin; + + if ( isdefined( projectile ) && projectile ) + thread debug_draw_bomb_explosion( prevpos ); + + wait 0.2; + } + } #/ - } - } } debug_print3d_simple( message, ent, offset, frames ) { /# - level.airsupport_debug = getdvarintdefault( "scr_airsupport_debug", 0 ); - if ( isDefined( level.airsupport_debug ) && level.airsupport_debug == 1 ) - { - if ( isDefined( frames ) ) - { - thread draw_text( message, vectorScale( ( 1, 1, 1 ), 0,8 ), ent, offset, frames ); - return; - } - else - { - thread draw_text( message, vectorScale( ( 1, 1, 1 ), 0,8 ), ent, offset, 0 ); + level.airsupport_debug = getdvarintdefault( "scr_airsupport_debug", 0 ); + + if ( isdefined( level.airsupport_debug ) && level.airsupport_debug == 1.0 ) + { + if ( isdefined( frames ) ) + thread draw_text( message, vectorscale( ( 1, 1, 1 ), 0.8 ), ent, offset, frames ); + else + thread draw_text( message, vectorscale( ( 1, 1, 1 ), 0.8 ), ent, offset, 0 ); + } #/ - } - } } draw_text( msg, color, ent, offset, frames ) { /# - if ( frames == 0 ) - { - while ( isDefined( ent ) && isDefined( ent.origin ) ) - { - print3d( ent.origin + offset, msg, color, 0,5, 4 ); - wait 0,05; - } - } - else i = 0; - while ( i < frames ) - { - if ( !isDefined( ent ) ) - { - return; - } - else - { - print3d( ent.origin + offset, msg, color, 0,5, 4 ); - wait 0,05; - i++; + if ( frames == 0 ) + { + while ( isdefined( ent ) && isdefined( ent.origin ) ) + { + print3d( ent.origin + offset, msg, color, 0.5, 4 ); + wait 0.05; + } + } + else + { + for ( i = 0; i < frames; i++ ) + { + if ( !isdefined( ent ) ) + break; + + print3d( ent.origin + offset, msg, color, 0.5, 4 ); + wait 0.05; + } + } #/ - } - } } debug_print3d( message, color, ent, origin_offset, frames ) { /# - level.airsupport_debug = getdvarintdefault( "scr_airsupport_debug", 0 ); - if ( isDefined( level.airsupport_debug ) && level.airsupport_debug == 1 ) - { - self thread draw_text( message, color, ent, origin_offset, frames ); + level.airsupport_debug = getdvarintdefault( "scr_airsupport_debug", 0 ); + + if ( isdefined( level.airsupport_debug ) && level.airsupport_debug == 1.0 ) + self thread draw_text( message, color, ent, origin_offset, frames ); #/ - } } debug_line( from, to, color, time, depthtest ) { /# - level.airsupport_debug = getdvarintdefault( "scr_airsupport_debug", 0 ); - if ( isDefined( level.airsupport_debug ) && level.airsupport_debug == 1 ) - { - if ( !isDefined( time ) ) - { - time = 1000; - } - if ( !isDefined( depthtest ) ) - { - depthtest = 1; - } - line( from, to, color, 1, depthtest, time ); + level.airsupport_debug = getdvarintdefault( "scr_airsupport_debug", 0 ); + + if ( isdefined( level.airsupport_debug ) && level.airsupport_debug == 1.0 ) + { + if ( !isdefined( time ) ) + time = 1000; + + if ( !isdefined( depthtest ) ) + depthtest = 1; + + line( from, to, color, 1, depthtest, time ); + } #/ - } } debug_star( origin, color, time ) { /# - level.airsupport_debug = getdvarintdefault( "scr_airsupport_debug", 0 ); - if ( isDefined( level.airsupport_debug ) && level.airsupport_debug == 1 ) - { - if ( !isDefined( time ) ) - { - time = 1000; - } - if ( !isDefined( color ) ) - { - color = ( 1, 1, 1 ); - } - debugstar( origin, time, color ); + level.airsupport_debug = getdvarintdefault( "scr_airsupport_debug", 0 ); + + if ( isdefined( level.airsupport_debug ) && level.airsupport_debug == 1.0 ) + { + if ( !isdefined( time ) ) + time = 1000; + + if ( !isdefined( color ) ) + color = ( 1, 1, 1 ); + + debugstar( origin, time, color ); + } #/ - } } debug_circle( origin, radius, color, time ) { /# - level.airsupport_debug = getdvarintdefault( "scr_airsupport_debug", 0 ); - if ( isDefined( level.airsupport_debug ) && level.airsupport_debug == 1 ) - { - if ( !isDefined( time ) ) - { - time = 1000; - } - if ( !isDefined( color ) ) - { - color = ( 1, 1, 1 ); - } - circle( origin, radius, color, 1, 1, time ); + level.airsupport_debug = getdvarintdefault( "scr_airsupport_debug", 0 ); + + if ( isdefined( level.airsupport_debug ) && level.airsupport_debug == 1 ) + { + if ( !isdefined( time ) ) + time = 1000; + + if ( !isdefined( color ) ) + color = ( 1, 1, 1 ); + + circle( origin, radius, color, 1, 1, time ); + } #/ - } } debug_sphere( origin, radius, color, alpha, time ) { /# - level.airsupport_debug = getdvarintdefault( "scr_airsupport_debug", 0 ); - if ( isDefined( level.airsupport_debug ) && level.airsupport_debug == 1 ) - { - if ( !isDefined( time ) ) - { - time = 1000; - } - if ( !isDefined( color ) ) - { - color = ( 1, 1, 1 ); - } - sides = int( 10 * ( 1 + int( radius / 100 ) ) ); - sphere( origin, radius, color, alpha, 1, sides, time ); + level.airsupport_debug = getdvarintdefault( "scr_airsupport_debug", 0 ); + + if ( isdefined( level.airsupport_debug ) && level.airsupport_debug == 1 ) + { + if ( !isdefined( time ) ) + time = 1000; + + if ( !isdefined( color ) ) + color = ( 1, 1, 1 ); + + sides = int( 10 * ( 1 + int( radius / 100 ) ) ); + sphere( origin, radius, color, alpha, 1, sides, time ); + } #/ - } } debug_cylinder( origin, radius, height, color, mustrenderheight, time ) { /# - level.airsupport_debug = getdvarintdefault( "scr_airsupport_debug", 0 ); - subdivision = 600; - if ( isDefined( level.airsupport_debug ) && level.airsupport_debug == 1 ) - { - if ( !isDefined( time ) ) - { - time = 1000; - } - if ( !isDefined( color ) ) - { - color = ( 1, 1, 1 ); - } - count = height / subdivision; - i = 0; - while ( i < count ) - { - point = origin + ( 0, 0, i * subdivision ); - circle( point, radius, color, 1, 1, time ); - i++; - } - if ( isDefined( mustrenderheight ) ) - { - point = origin + ( 0, 0, mustrenderheight ); - circle( point, radius, color, 1, 1, time ); + level.airsupport_debug = getdvarintdefault( "scr_airsupport_debug", 0 ); + subdivision = 600; + + if ( isdefined( level.airsupport_debug ) && level.airsupport_debug == 1 ) + { + if ( !isdefined( time ) ) + time = 1000; + + if ( !isdefined( color ) ) + color = ( 1, 1, 1 ); + + count = height / subdivision; + + for ( i = 0; i < count; i++ ) + { + point = origin + ( 0, 0, i * subdivision ); + circle( point, radius, color, 1, 1, time ); + } + + if ( isdefined( mustrenderheight ) ) + { + point = origin + ( 0, 0, mustrenderheight ); + circle( point, radius, color, 1, 1, time ); + } + } #/ - } - } } getpointonline( startpoint, endpoint, ratio ) { - nextpoint = ( startpoint[ 0 ] + ( ( endpoint[ 0 ] - startpoint[ 0 ] ) * ratio ), startpoint[ 1 ] + ( ( endpoint[ 1 ] - startpoint[ 1 ] ) * ratio ), startpoint[ 2 ] + ( ( endpoint[ 2 ] - startpoint[ 2 ] ) * ratio ) ); - return nextpoint; + nextpoint = ( startpoint[0] + ( endpoint[0] - startpoint[0] ) * ratio, startpoint[1] + ( endpoint[1] - startpoint[1] ) * ratio, startpoint[2] + ( endpoint[2] - startpoint[2] ) * ratio ); + return nextpoint; } cantargetplayerwithspecialty() { - if ( self hasperk( "specialty_nottargetedbyairsupport" ) || isDefined( self.specialty_nottargetedbyairsupport ) && self.specialty_nottargetedbyairsupport ) - { - if ( !isDefined( self.nottargettedai_underminspeedtimer ) || self.nottargettedai_underminspeedtimer < getDvarInt( "perk_nottargetedbyai_graceperiod" ) ) - { - return 0; - } - } - return 1; + if ( self hasperk( "specialty_nottargetedbyairsupport" ) || isdefined( self.specialty_nottargetedbyairsupport ) && self.specialty_nottargetedbyairsupport ) + { + if ( !isdefined( self.nottargettedai_underminspeedtimer ) || self.nottargettedai_underminspeedtimer < getdvarint( "perk_nottargetedbyai_graceperiod" ) ) + return false; + } + + return true; } monitorspeed( spawnprotectiontime ) { - self endon( "death" ); - self endon( "disconnect" ); - if ( self hasperk( "specialty_nottargetedbyairsupport" ) == 0 ) - { - return; - } - getDvar( #"B46C7AAF" ); - graceperiod = getDvarInt( "perk_nottargetedbyai_graceperiod" ); - minspeed = getDvarInt( "perk_nottargetedbyai_min_speed" ); - minspeedsq = minspeed * minspeed; - waitperiod = 0,25; - waitperiodmilliseconds = waitperiod * 1000; - if ( minspeedsq == 0 ) - { - return; - } - self.nottargettedai_underminspeedtimer = 0; - if ( isDefined( spawnprotectiontime ) ) - { - wait spawnprotectiontime; - } - while ( 1 ) - { - velocity = self getvelocity(); - speedsq = lengthsquared( velocity ); - if ( speedsq < minspeedsq ) - { - self.nottargettedai_underminspeedtimer += waitperiodmilliseconds; - } - else - { - self.nottargettedai_underminspeedtimer = 0; - } - wait waitperiod; - } + self endon( "death" ); + self endon( "disconnect" ); + + if ( self hasperk( "specialty_nottargetedbyairsupport" ) == 0 ) + return; + + getdvar( _hash_B46C7AAF ); + graceperiod = getdvarint( "perk_nottargetedbyai_graceperiod" ); + minspeed = getdvarint( "perk_nottargetedbyai_min_speed" ); + minspeedsq = minspeed * minspeed; + waitperiod = 0.25; + waitperiodmilliseconds = waitperiod * 1000; + + if ( minspeedsq == 0 ) + return; + + self.nottargettedai_underminspeedtimer = 0; + + if ( isdefined( spawnprotectiontime ) ) + wait( spawnprotectiontime ); + + while ( true ) + { + velocity = self getvelocity(); + speedsq = lengthsquared( velocity ); + + if ( speedsq < minspeedsq ) + self.nottargettedai_underminspeedtimer += waitperiodmilliseconds; + else + self.nottargettedai_underminspeedtimer = 0; + + wait( waitperiod ); + } } clearmonitoredspeed() { - if ( isDefined( self.nottargettedai_underminspeedtimer ) ) - { - self.nottargettedai_underminspeedtimer = 0; - } + if ( isdefined( self.nottargettedai_underminspeedtimer ) ) + self.nottargettedai_underminspeedtimer = 0; } diff --git a/Multiplayer Core/patch_mp/maps/mp/killstreaks/_dogs.gsc b/Multiplayer Core/patch_mp/maps/mp/killstreaks/_dogs.gsc index 7278b2f..37723e3 100644 --- a/Multiplayer Core/patch_mp/maps/mp/killstreaks/_dogs.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/killstreaks/_dogs.gsc @@ -1,1017 +1,953 @@ -#include maps/mp/gametypes/_dev; -#include maps/mp/killstreaks/_supplydrop; -#include maps/mp/_scoreevents; -#include maps/mp/gametypes/_weapons; -#include maps/mp/gametypes/_spawning; -#include maps/mp/gametypes/_battlechatter_mp; -#include maps/mp/killstreaks/_killstreakrules; -#include maps/mp/killstreaks/_killstreaks; -#include maps/mp/gametypes/_tweakables; -#include maps/mp/gametypes/_spawnlogic; -#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\_spawnlogic; +#include maps\mp\gametypes\_tweakables; +#include maps\mp\killstreaks\_killstreaks; +#include maps\mp\killstreaks\_killstreakrules; +#include maps\mp\gametypes\_battlechatter_mp; +#include maps\mp\gametypes\_spawning; +#include maps\mp\gametypes\_weapons; +#include maps\mp\_scoreevents; +#include maps\mp\killstreaks\_supplydrop; +#include maps\mp\gametypes\_dev; init() { - precachemodel( "german_shepherd_vest" ); - precachemodel( "german_shepherd_vest_black" ); - level.dog_targets = []; - level.dog_targets[ level.dog_targets.size ] = "trigger_radius"; - level.dog_targets[ level.dog_targets.size ] = "trigger_multiple"; - level.dog_targets[ level.dog_targets.size ] = "trigger_use_touch"; - level.dog_spawns = []; - init_spawns(); + precachemodel( "german_shepherd_vest" ); + precachemodel( "german_shepherd_vest_black" ); + level.dog_targets = []; + level.dog_targets[level.dog_targets.size] = "trigger_radius"; + level.dog_targets[level.dog_targets.size] = "trigger_multiple"; + level.dog_targets[level.dog_targets.size] = "trigger_use_touch"; + level.dog_spawns = []; + init_spawns(); /# - level thread devgui_dog_think(); + level thread devgui_dog_think(); #/ } init_spawns() { - spawns = getnodearray( "spawn", "script_noteworthy" ); - if ( !isDefined( spawns ) || !spawns.size ) - { + spawns = getnodearray( "spawn", "script_noteworthy" ); + + if ( !isdefined( spawns ) || !spawns.size ) + { /# - println( "No dog spawn nodes found in map" ); + println( "No dog spawn nodes found in map" ); #/ - return; - } - dog_spawner = getent( "dog_spawner", "targetname" ); - if ( !isDefined( dog_spawner ) ) - { + return; + } + + dog_spawner = getent( "dog_spawner", "targetname" ); + + if ( !isdefined( dog_spawner ) ) + { /# - println( "No dog_spawner entity found in map" ); + println( "No dog_spawner entity found in map" ); #/ - return; - } - valid = maps/mp/gametypes/_spawnlogic::getspawnpointarray( "mp_tdm_spawn" ); - dog = dog_spawner spawnactor(); - _a63 = spawns; - _k63 = getFirstArrayKey( _a63 ); - while ( isDefined( _k63 ) ) - { - spawn = _a63[ _k63 ]; - valid = arraysort( valid, spawn.origin, 0 ); - i = 0; - while ( i < 5 ) - { - if ( findpath( spawn.origin, valid[ i ].origin, dog, 1, 0 ) ) - { - level.dog_spawns[ level.dog_spawns.size ] = spawn; - break; - } - else - { - i++; - } - } - _k63 = getNextArrayKey( _a63, _k63 ); - } + return; + } + + valid = maps\mp\gametypes\_spawnlogic::getspawnpointarray( "mp_tdm_spawn" ); + dog = dog_spawner spawnactor(); + + foreach ( spawn in spawns ) + { + valid = arraysort( valid, spawn.origin, 0 ); + + for ( i = 0; i < 5; i++ ) + { + if ( findpath( spawn.origin, valid[i].origin, dog, 1, 0 ) ) + { + level.dog_spawns[level.dog_spawns.size] = spawn; + break; + } + } + } /# - if ( !level.dog_spawns.size ) - { - println( "No dog spawns connect to MP spawn nodes" ); + if ( !level.dog_spawns.size ) + println( "No dog spawns connect to MP spawn nodes" ); #/ - } - dog delete(); + dog delete(); } initkillstreak() { - if ( maps/mp/gametypes/_tweakables::gettweakablevalue( "killstreak", "allowdogs" ) ) - { - maps/mp/killstreaks/_killstreaks::registerkillstreak( "dogs_mp", "dogs_mp", "killstreak_dogs", "dogs_used", ::usekillstreakdogs, 1 ); - maps/mp/killstreaks/_killstreaks::registerkillstreakstrings( "dogs_mp", &"KILLSTREAK_EARNED_DOGS", &"KILLSTREAK_DOGS_NOT_AVAILABLE", &"KILLSTREAK_DOGS_INBOUND" ); - maps/mp/killstreaks/_killstreaks::registerkillstreakdialog( "dogs_mp", "mpl_killstreak_dogs", "kls_dogs_used", "", "kls_dogs_enemy", "", "kls_dogs_ready" ); - maps/mp/killstreaks/_killstreaks::registerkillstreakdevdvar( "dogs_mp", "scr_givedogs" ); - maps/mp/killstreaks/_killstreaks::setkillstreakteamkillpenaltyscale( "dogs_mp", 0 ); - maps/mp/killstreaks/_killstreaks::registerkillstreakaltweapon( "dogs_mp", "dog_bite_mp" ); - } + if ( maps\mp\gametypes\_tweakables::gettweakablevalue( "killstreak", "allowdogs" ) ) + { + maps\mp\killstreaks\_killstreaks::registerkillstreak( "dogs_mp", "dogs_mp", "killstreak_dogs", "dogs_used", ::usekillstreakdogs, 1 ); + maps\mp\killstreaks\_killstreaks::registerkillstreakstrings( "dogs_mp", &"KILLSTREAK_EARNED_DOGS", &"KILLSTREAK_DOGS_NOT_AVAILABLE", &"KILLSTREAK_DOGS_INBOUND" ); + maps\mp\killstreaks\_killstreaks::registerkillstreakdialog( "dogs_mp", "mpl_killstreak_dogs", "kls_dogs_used", "", "kls_dogs_enemy", "", "kls_dogs_ready" ); + maps\mp\killstreaks\_killstreaks::registerkillstreakdevdvar( "dogs_mp", "scr_givedogs" ); + maps\mp\killstreaks\_killstreaks::setkillstreakteamkillpenaltyscale( "dogs_mp", 0.0 ); + maps\mp\killstreaks\_killstreaks::registerkillstreakaltweapon( "dogs_mp", "dog_bite_mp" ); + } } usekillstreakdogs( hardpointtype ) { - if ( !dog_killstreak_init() ) - { - return 0; - } - if ( !self maps/mp/killstreaks/_killstreakrules::iskillstreakallowed( hardpointtype, self.team ) ) - { - return 0; - } - killstreak_id = self maps/mp/killstreaks/_killstreakrules::killstreakstart( "dogs_mp", self.team ); - self thread ownerhadactivedogs(); - if ( killstreak_id == -1 ) - { - return 0; - } - while ( level.teambased ) - { - _a119 = level.teams; - _k119 = getFirstArrayKey( _a119 ); - while ( isDefined( _k119 ) ) - { - team = _a119[ _k119 ]; - if ( team == self.team ) - { - } - else - { - thread maps/mp/gametypes/_battlechatter_mp::onkillstreakused( "dogs", team ); - } - _k119 = getNextArrayKey( _a119, _k119 ); - } - } - self maps/mp/killstreaks/_killstreaks::playkillstreakstartdialog( "dogs_mp", self.team, 1 ); - level.globalkillstreakscalled++; - self addweaponstat( "dogs_mp", "used", 1 ); - ownerdeathcount = self.deathcount; - level thread dog_manager_spawn_dogs( self, ownerdeathcount, killstreak_id ); - level notify( "called_in_the_dogs" ); - return 1; + if ( !dog_killstreak_init() ) + return false; + + if ( !self maps\mp\killstreaks\_killstreakrules::iskillstreakallowed( hardpointtype, self.team ) ) + return false; + + killstreak_id = self maps\mp\killstreaks\_killstreakrules::killstreakstart( "dogs_mp", self.team ); + self thread ownerhadactivedogs(); + + if ( killstreak_id == -1 ) + return false; + + if ( level.teambased ) + { + foreach ( team in level.teams ) + { + if ( team == self.team ) + continue; + + thread maps\mp\gametypes\_battlechatter_mp::onkillstreakused( "dogs", team ); + } + } + + self maps\mp\killstreaks\_killstreaks::playkillstreakstartdialog( "dogs_mp", self.team, 1 ); + level.globalkillstreakscalled++; + self addweaponstat( "dogs_mp", "used", 1 ); + ownerdeathcount = self.deathcount; + level thread dog_manager_spawn_dogs( self, ownerdeathcount, killstreak_id ); + level notify( "called_in_the_dogs" ); + return true; } ownerhadactivedogs() { - self endon( "disconnect" ); - self.dogsactive = 1; - self.dogsactivekillstreak = 0; - self waittill_any( "death", "game_over", "dogs_complete" ); - self.dogsactivekillstreak = 0; - self.dogsactive = undefined; + self endon( "disconnect" ); + self.dogsactive = 1; + self.dogsactivekillstreak = 0; + self waittill_any( "death", "game_over", "dogs_complete" ); + self.dogsactivekillstreak = 0; + self.dogsactive = undefined; } dog_killstreak_init() { - dog_spawner = getent( "dog_spawner", "targetname" ); - if ( !isDefined( dog_spawner ) ) - { + dog_spawner = getent( "dog_spawner", "targetname" ); + + if ( !isdefined( dog_spawner ) ) + { /# - println( "No dog spawners found in map" ); + println( "No dog spawners found in map" ); #/ - return 0; - } - spawns = getnodearray( "spawn", "script_noteworthy" ); - if ( level.dog_spawns.size <= 0 ) - { + return false; + } + + spawns = getnodearray( "spawn", "script_noteworthy" ); + + if ( level.dog_spawns.size <= 0 ) + { /# - println( "No dog spawn nodes found in map" ); + println( "No dog spawn nodes found in map" ); #/ - return 0; - } - exits = getnodearray( "exit", "script_noteworthy" ); - if ( exits.size <= 0 ) - { + return false; + } + + exits = getnodearray( "exit", "script_noteworthy" ); + + if ( exits.size <= 0 ) + { /# - println( "No dog exit nodes found in map" ); + println( "No dog exit nodes found in map" ); #/ - return 0; - } - return 1; + return false; + } + + return true; } dog_set_model() { - self setmodel( "german_shepherd_vest" ); - self setenemymodel( "german_shepherd_vest_black" ); + self setmodel( "german_shepherd_vest" ); + self setenemymodel( "german_shepherd_vest_black" ); } init_dog() { /# - assert( isai( self ) ); + assert( isai( self ) ); #/ - self.targetname = "attack_dog"; - self.animtree = "dog.atr"; - self.type = "dog"; - self.accuracy = 0,2; - self.health = 100; - self.maxhealth = 100; - self.aiweapon = "dog_bite_mp"; - self.secondaryweapon = ""; - self.sidearm = ""; - self.grenadeammo = 0; - self.goalradius = 128; - self.nododgemove = 1; - self.ignoresuppression = 1; - self.suppressionthreshold = 1; - self.disablearrivals = 0; - self.pathenemyfightdist = 512; - self.soundmod = "dog"; - self thread dog_health_regen(); - self thread selfdefensechallenge(); + self.targetname = "attack_dog"; + self.animtree = "dog.atr"; + self.type = "dog"; + self.accuracy = 0.2; + self.health = 100; + self.maxhealth = 100; + self.aiweapon = "dog_bite_mp"; + self.secondaryweapon = ""; + self.sidearm = ""; + self.grenadeammo = 0; + self.goalradius = 128; + self.nododgemove = 1; + self.ignoresuppression = 1; + self.suppressionthreshold = 1; + self.disablearrivals = 0; + self.pathenemyfightdist = 512; + self.soundmod = "dog"; + self thread dog_health_regen(); + self thread selfdefensechallenge(); } get_spawn_node( owner, team ) { /# - assert( level.dog_spawns.size > 0 ); + assert( level.dog_spawns.size > 0 ); #/ - return random( level.dog_spawns ); + return random( level.dog_spawns ); } get_score_for_spawn( origin, team ) { - players = get_players(); - score = 0; - _a224 = players; - _k224 = getFirstArrayKey( _a224 ); - while ( isDefined( _k224 ) ) - { - player = _a224[ _k224 ]; - if ( !isDefined( player ) ) - { - } - else if ( !isalive( player ) ) - { - } - else if ( player.sessionstate != "playing" ) - { - } - else if ( distancesquared( player.origin, origin ) > 4194304 ) - { - } - else if ( player.team == team ) - { - score++; - } - else - { - score--; + players = get_players(); + score = 0; - } - _k224 = getNextArrayKey( _a224, _k224 ); - } - return score; + foreach ( player in players ) + { + if ( !isdefined( player ) ) + continue; + + if ( !isalive( player ) ) + continue; + + if ( player.sessionstate != "playing" ) + continue; + + if ( distancesquared( player.origin, origin ) > 4194304 ) + continue; + + if ( player.team == team ) + { + score++; + continue; + } + + score--; + } + + return score; } dog_set_owner( owner, team, requireddeathcount ) { - self setentityowner( owner ); - self.aiteam = team; - self.requireddeathcount = requireddeathcount; + self setentityowner( owner ); + self.aiteam = team; + self.requireddeathcount = requireddeathcount; } dog_create_spawn_influencer() { - self maps/mp/gametypes/_spawning::create_dog_influencers(); + self maps\mp\gametypes\_spawning::create_dog_influencers(); } dog_manager_spawn_dog( owner, team, spawn_node, requireddeathcount ) { - dog_spawner = getent( "dog_spawner", "targetname" ); - dog = dog_spawner spawnactor(); - dog forceteleport( spawn_node.origin, spawn_node.angles ); - dog init_dog(); - dog dog_set_owner( owner, team, requireddeathcount ); - dog dog_set_model(); - dog dog_create_spawn_influencer(); - dog thread dog_owner_kills(); - dog thread dog_notify_level_on_death(); - dog thread dog_patrol(); - dog thread maps/mp/gametypes/_weapons::monitor_dog_special_grenades(); - return dog; + dog_spawner = getent( "dog_spawner", "targetname" ); + dog = dog_spawner spawnactor(); + dog forceteleport( spawn_node.origin, spawn_node.angles ); + dog init_dog(); + dog dog_set_owner( owner, team, requireddeathcount ); + dog dog_set_model(); + dog dog_create_spawn_influencer(); + dog thread dog_owner_kills(); + dog thread dog_notify_level_on_death(); + dog thread dog_patrol(); + dog thread maps\mp\gametypes\_weapons::monitor_dog_special_grenades(); + return dog; } dog_manager_spawn_dogs( owner, deathcount, killstreak_id ) { - requireddeathcount = deathcount; - team = owner.team; - level.dog_abort = 0; - owner thread dog_manager_abort(); - level thread dog_manager_game_ended(); - count = 0; - while ( count < 10 ) - { - if ( level.dog_abort ) - { - break; - } - else - { - dogs = dog_manager_get_dogs(); - while ( dogs.size < 5 && count < 10 && !level.dog_abort ) - { - node = get_spawn_node( owner, team ); - level dog_manager_spawn_dog( owner, team, node, requireddeathcount ); - count++; - wait randomfloatrange( 2, 5 ); - dogs = dog_manager_get_dogs(); - } - level waittill( "dog_died" ); - } - } - for ( ;; ) - { - dogs = dog_manager_get_dogs(); - if ( dogs.size <= 0 ) - { - maps/mp/killstreaks/_killstreakrules::killstreakstop( "dogs_mp", team, killstreak_id ); - if ( isDefined( owner ) ) - { - owner notify( "dogs_complete" ); - } - return; - } - level waittill( "dog_died" ); - } + requireddeathcount = deathcount; + team = owner.team; + level.dog_abort = 0; + owner thread dog_manager_abort(); + level thread dog_manager_game_ended(); + count = 0; + + while ( count < 10 ) + { + if ( level.dog_abort ) + break; + + for ( dogs = dog_manager_get_dogs(); dogs.size < 5 && count < 10 && !level.dog_abort; dogs = dog_manager_get_dogs() ) + { + node = get_spawn_node( owner, team ); + level dog_manager_spawn_dog( owner, team, node, requireddeathcount ); + count++; + wait( randomfloatrange( 2, 5 ) ); + } + + level waittill( "dog_died" ); + } + + for (;;) + { + dogs = dog_manager_get_dogs(); + + if ( dogs.size <= 0 ) + { + maps\mp\killstreaks\_killstreakrules::killstreakstop( "dogs_mp", team, killstreak_id ); + + if ( isdefined( owner ) ) + owner notify( "dogs_complete" ); + + return; + } + + level waittill( "dog_died" ); + } } dog_abort() { - level.dog_abort = 1; - dogs = dog_manager_get_dogs(); - _a347 = dogs; - _k347 = getFirstArrayKey( _a347 ); - while ( isDefined( _k347 ) ) - { - dog = _a347[ _k347 ]; - dog notify( "abort" ); - _k347 = getNextArrayKey( _a347, _k347 ); - } - level notify( "dog_abort" ); + level.dog_abort = 1; + dogs = dog_manager_get_dogs(); + + foreach ( dog in dogs ) + dog notify( "abort" ); + + level notify( "dog_abort" ); } dog_manager_abort() { - level endon( "dog_abort" ); - self wait_endon( 45, "disconnect", "joined_team", "joined_spectators" ); - dog_abort(); + level endon( "dog_abort" ); + self wait_endon( 45, "disconnect", "joined_team", "joined_spectators" ); + dog_abort(); } dog_manager_game_ended() { - level endon( "dog_abort" ); - level waittill( "game_ended" ); - dog_abort(); + level endon( "dog_abort" ); + + level waittill( "game_ended" ); + + dog_abort(); } dog_notify_level_on_death() { - self waittill( "death" ); - level notify( "dog_died" ); + self waittill( "death" ); + + level notify( "dog_died" ); } dog_leave() { - self clearentitytarget(); - self.ignoreall = 1; - self.goalradius = 30; - self setgoalnode( self dog_get_exit_node() ); - self wait_endon( 20, "goal", "bad_path" ); - self delete(); + self clearentitytarget(); + self.ignoreall = 1; + self.goalradius = 30; + self setgoalnode( self dog_get_exit_node() ); + self wait_endon( 20, "goal", "bad_path" ); + self delete(); } dog_patrol() { - self endon( "death" ); + self endon( "death" ); /# - self endon( "debug_patrol" ); + self endon( "debug_patrol" ); #/ - for ( ;; ) - { - if ( level.dog_abort ) - { - self dog_leave(); - return; - } - if ( isDefined( self.enemy ) ) - { - wait randomintrange( 3, 5 ); - continue; - } - else - { - nodes = []; - objectives = dog_patrol_near_objective(); - i = 0; - while ( i < objectives.size ) - { - objective = random( objectives ); - nodes = getnodesinradius( objective.origin, 256, 64, 512, "Path", 16 ); - if ( nodes.size ) - { - break; - } - else - { - i++; - } - } - if ( !nodes.size ) - { - player = self dog_patrol_near_enemy(); - if ( isDefined( player ) ) - { - nodes = getnodesinradius( player.origin, 1024, 0, 128, "Path", 8 ); - } - } - if ( !nodes.size && isDefined( self.script_owner ) ) - { - if ( isalive( self.script_owner ) && self.script_owner.sessionstate == "playing" ) - { - nodes = getnodesinradius( self.script_owner.origin, 512, 256, 512, "Path", 16 ); - } - } - if ( !nodes.size ) - { - nodes = getnodesinradius( self.origin, 1024, 512, 512, "Path" ); - } - while ( nodes.size ) - { - nodes = array_randomize( nodes ); - _a452 = nodes; - _k452 = getFirstArrayKey( _a452 ); - while ( isDefined( _k452 ) ) - { - node = _a452[ _k452 ]; - if ( isDefined( node.script_noteworthy ) ) - { - } - else if ( isDefined( node.dog_claimed ) && isalive( node.dog_claimed ) ) - { - } - else - { - self setgoalnode( node ); - node.dog_claimed = self; - nodes = []; - event = self waittill_any_return( "goal", "bad_path", "enemy", "abort" ); - if ( event == "goal" ) - { - wait_endon( randomintrange( 3, 5 ), "damage", "enemy", "abort" ); - } - node.dog_claimed = undefined; - break; - } - _k452 = getNextArrayKey( _a452, _k452 ); - } - } - wait 0,5; - } - } + for (;;) + { + if ( level.dog_abort ) + { + self dog_leave(); + return; + } + + if ( isdefined( self.enemy ) ) + { + wait( randomintrange( 3, 5 ) ); + continue; + } + + nodes = []; + objectives = dog_patrol_near_objective(); + + for ( i = 0; i < objectives.size; i++ ) + { + objective = random( objectives ); + nodes = getnodesinradius( objective.origin, 256, 64, 512, "Path", 16 ); + + if ( nodes.size ) + break; + } + + if ( !nodes.size ) + { + player = self dog_patrol_near_enemy(); + + if ( isdefined( player ) ) + nodes = getnodesinradius( player.origin, 1024, 0, 128, "Path", 8 ); + } + + if ( !nodes.size && isdefined( self.script_owner ) ) + { + if ( isalive( self.script_owner ) && self.script_owner.sessionstate == "playing" ) + nodes = getnodesinradius( self.script_owner.origin, 512, 256, 512, "Path", 16 ); + } + + if ( !nodes.size ) + nodes = getnodesinradius( self.origin, 1024, 512, 512, "Path" ); + + if ( nodes.size ) + { + nodes = array_randomize( nodes ); + + foreach ( node in nodes ) + { + if ( isdefined( node.script_noteworthy ) ) + continue; + + if ( isdefined( node.dog_claimed ) && isalive( node.dog_claimed ) ) + continue; + + self setgoalnode( node ); + node.dog_claimed = self; + nodes = []; + event = self waittill_any_return( "goal", "bad_path", "enemy", "abort" ); + + if ( event == "goal" ) + wait_endon( randomintrange( 3, 5 ), "damage", "enemy", "abort" ); + + node.dog_claimed = undefined; + break; + } + } + + wait 0.5; + } } dog_patrol_near_objective() { - if ( !isDefined( level.dog_objectives ) ) - { - level.dog_objectives = []; - level.dog_objective_next_update = 0; - } - if ( level.gametype == "tdm" || level.gametype == "dm" ) - { - return level.dog_objectives; - } - if ( getTime() >= level.dog_objective_next_update ) - { - level.dog_objectives = []; - _a501 = level.dog_targets; - _k501 = getFirstArrayKey( _a501 ); - while ( isDefined( _k501 ) ) - { - target = _a501[ _k501 ]; - ents = getentarray( target, "classname" ); - _a505 = ents; - _k505 = getFirstArrayKey( _a505 ); - while ( isDefined( _k505 ) ) - { - ent = _a505[ _k505 ]; - if ( level.gametype == "koth" ) - { - if ( isDefined( ent.targetname ) && ent.targetname == "radiotrigger" ) - { - level.dog_objectives[ level.dog_objectives.size ] = ent; - } - } - else if ( level.gametype == "sd" ) - { - if ( isDefined( ent.targetname ) && ent.targetname == "bombzone" ) - { - level.dog_objectives[ level.dog_objectives.size ] = ent; - } - } - else if ( !isDefined( ent.script_gameobjectname ) ) - { - } - else if ( !issubstr( ent.script_gameobjectname, level.gametype ) ) - { - } - else - { - level.dog_objectives[ level.dog_objectives.size ] = ent; - } - _k505 = getNextArrayKey( _a505, _k505 ); - } - _k501 = getNextArrayKey( _a501, _k501 ); - } - level.dog_objective_next_update = getTime() + randomintrange( 5000, 10000 ); - } - return level.dog_objectives; + if ( !isdefined( level.dog_objectives ) ) + { + level.dog_objectives = []; + level.dog_objective_next_update = 0; + } + + if ( level.gametype == "tdm" || level.gametype == "dm" ) + return level.dog_objectives; + + if ( gettime() >= level.dog_objective_next_update ) + { + level.dog_objectives = []; + + foreach ( target in level.dog_targets ) + { + ents = getentarray( target, "classname" ); + + foreach ( ent in ents ) + { + if ( level.gametype == "koth" ) + { + if ( isdefined( ent.targetname ) && ent.targetname == "radiotrigger" ) + level.dog_objectives[level.dog_objectives.size] = ent; + + continue; + } + + if ( level.gametype == "sd" ) + { + if ( isdefined( ent.targetname ) && ent.targetname == "bombzone" ) + level.dog_objectives[level.dog_objectives.size] = ent; + + continue; + } + + if ( !isdefined( ent.script_gameobjectname ) ) + continue; + + if ( !issubstr( ent.script_gameobjectname, level.gametype ) ) + continue; + + level.dog_objectives[level.dog_objectives.size] = ent; + } + } + + level.dog_objective_next_update = gettime() + randomintrange( 5000, 10000 ); + } + + return level.dog_objectives; } dog_patrol_near_enemy() { - players = get_players(); - closest = undefined; - distsq = 99999999; - _a554 = players; - _k554 = getFirstArrayKey( _a554 ); - while ( isDefined( _k554 ) ) - { - player = _a554[ _k554 ]; - if ( !isDefined( player ) ) - { - } - else if ( !isalive( player ) ) - { - } - else if ( player.sessionstate != "playing" ) - { - } - else if ( isDefined( self.script_owner ) && player == self.script_owner ) - { - } - else - { - if ( level.teambased ) - { - if ( player.team == self.aiteam ) - { - break; - } - } - else if ( ( getTime() - player.lastfiretime ) > 3000 ) - { - break; - } - else if ( !isDefined( closest ) ) - { - closest = player; - distsq = distancesquared( self.origin, player.origin ); - break; - } - else - { - d = distancesquared( self.origin, player.origin ); - if ( d < distsq ) - { - closest = player; - distsq = d; - } - } - } - _k554 = getNextArrayKey( _a554, _k554 ); - } - return closest; + players = get_players(); + closest = undefined; + distsq = 99999999; + + foreach ( player in players ) + { + if ( !isdefined( player ) ) + continue; + + if ( !isalive( player ) ) + continue; + + if ( player.sessionstate != "playing" ) + continue; + + if ( isdefined( self.script_owner ) && player == self.script_owner ) + continue; + + if ( level.teambased ) + { + if ( player.team == self.aiteam ) + continue; + } + + if ( gettime() - player.lastfiretime > 3000 ) + continue; + + if ( !isdefined( closest ) ) + { + closest = player; + distsq = distancesquared( self.origin, player.origin ); + continue; + } + + d = distancesquared( self.origin, player.origin ); + + if ( d < distsq ) + { + closest = player; + distsq = d; + } + } + + return closest; } dog_manager_get_dogs() { - dogs = getentarray( "attack_dog", "targetname" ); - return dogs; + dogs = getentarray( "attack_dog", "targetname" ); + return dogs; } dog_owner_kills() { - if ( !isDefined( self.script_owner ) ) - { - return; - } - self endon( "clear_owner" ); - self endon( "death" ); - self.script_owner endon( "disconnect" ); - while ( 1 ) - { - self waittill( "killed", player ); - self.script_owner notify( "dog_handler" ); - } + if ( !isdefined( self.script_owner ) ) + return; + + self endon( "clear_owner" ); + self endon( "death" ); + self.script_owner endon( "disconnect" ); + + while ( true ) + { + self waittill( "killed", player ); + + self.script_owner notify( "dog_handler" ); + } } dog_health_regen() { - self endon( "death" ); - interval = 0,5; - regen_interval = int( ( self.health / 5 ) * interval ); - regen_start = 2; - for ( ;; ) - { - self waittill( "damage", damage, attacker, direction, point, type, tagname, modelname, partname, weaponname, idflags ); - self trackattackerdamage( attacker, weaponname ); - self thread dog_health_regen_think( regen_start, interval, regen_interval ); - } + self endon( "death" ); + interval = 0.5; + regen_interval = int( self.health / 5 * interval ); + regen_start = 2; + + for (;;) + { + self waittill( "damage", damage, attacker, direction, point, type, tagname, modelname, partname, weaponname, idflags ); + + self trackattackerdamage( attacker, weaponname ); + self thread dog_health_regen_think( regen_start, interval, regen_interval ); + } } trackattackerdamage( attacker, weapon ) { - if ( isDefined( attacker ) || !isplayer( attacker ) && !isDefined( self.script_owner ) ) - { - return; - } - if ( level.teambased || attacker.team == self.script_owner.team && attacker == self ) - { - return; - } - if ( !isDefined( self.attackerdata ) || !isDefined( self.attackers ) ) - { - self.attackerdata = []; - self.attackers = []; - } - if ( !isDefined( self.attackerdata[ attacker.clientid ] ) ) - { - self.attackerclientid[ attacker.clientid ] = spawnstruct(); - self.attackers[ self.attackers.size ] = attacker; - } + if ( !isdefined( attacker ) || !isplayer( attacker ) || !isdefined( self.script_owner ) ) + return; + + if ( level.teambased && attacker.team == self.script_owner.team || attacker == self ) + return; + + if ( !isdefined( self.attackerdata ) || !isdefined( self.attackers ) ) + { + self.attackerdata = []; + self.attackers = []; + } + + if ( !isdefined( self.attackerdata[attacker.clientid] ) ) + { + self.attackerclientid[attacker.clientid] = spawnstruct(); + self.attackers[self.attackers.size] = attacker; + } } resetattackerdamage() { - self.attackerdata = []; - self.attackers = []; + self.attackerdata = []; + self.attackers = []; } dog_health_regen_think( delay, interval, regen_interval ) { - self endon( "death" ); - self endon( "damage" ); - wait delay; - step = 0; - while ( step <= 5 ) - { - if ( self.health >= 100 ) - { - break; - } - else - { - self.health += regen_interval; - wait interval; - step += interval; - } - } - self resetattackerdamage(); - self.health = 100; + self endon( "death" ); + self endon( "damage" ); + wait( delay ); + + for ( step = 0; step <= 5; step += interval ) + { + if ( self.health >= 100 ) + break; + + self.health += regen_interval; + wait( interval ); + } + + self resetattackerdamage(); + self.health = 100; } selfdefensechallenge() { - self waittill( "death", attacker ); - if ( isDefined( attacker ) && isplayer( attacker ) ) - { - if ( isDefined( self.script_owner ) && self.script_owner == attacker ) - { - return; - } - if ( level.teambased && isDefined( self.script_owner ) && self.script_owner.team == attacker.team ) - { - return; - } - while ( isDefined( self.attackers ) ) - { - _a712 = self.attackers; - _k712 = getFirstArrayKey( _a712 ); - while ( isDefined( _k712 ) ) - { - player = _a712[ _k712 ]; - if ( player != attacker ) - { - maps/mp/_scoreevents::processscoreevent( "killed_dog_assist", player ); - } - _k712 = getNextArrayKey( _a712, _k712 ); - } - } - attacker notify( "selfdefense_dog" ); - } + self waittill( "death", attacker ); + + if ( isdefined( attacker ) && isplayer( attacker ) ) + { + if ( isdefined( self.script_owner ) && self.script_owner == attacker ) + return; + + if ( level.teambased && isdefined( self.script_owner ) && self.script_owner.team == attacker.team ) + return; + + if ( isdefined( self.attackers ) ) + { + foreach ( player in self.attackers ) + { + if ( player != attacker ) + maps\mp\_scoreevents::processscoreevent( "killed_dog_assist", player ); + } + } + + attacker notify( "selfdefense_dog" ); + } } dog_get_exit_node() { - exits = getnodearray( "exit", "script_noteworthy" ); - return getclosest( self.origin, exits ); + exits = getnodearray( "exit", "script_noteworthy" ); + return getclosest( self.origin, exits ); } flash_dogs( area ) { - self endon( "disconnect" ); - dogs = dog_manager_get_dogs(); - _a737 = dogs; - _k737 = getFirstArrayKey( _a737 ); - while ( isDefined( _k737 ) ) - { - dog = _a737[ _k737 ]; - if ( !isalive( dog ) ) - { - } - else - { - if ( dog istouching( area ) ) - { - do_flash = 1; - if ( isplayer( self ) ) - { - if ( level.teambased && dog.aiteam == self.team ) - { - do_flash = 0; - break; - } - else - { - if ( !level.teambased && isDefined( dog.script_owner ) && self == dog.script_owner ) - { - do_flash = 0; - } - } - } - if ( isDefined( dog.lastflashed ) && ( dog.lastflashed + 1500 ) > getTime() ) - { - do_flash = 0; - } - if ( do_flash ) - { - dog setflashbanged( 1, 500 ); - dog.lastflashed = getTime(); - } - } - } - _k737 = getNextArrayKey( _a737, _k737 ); - } + self endon( "disconnect" ); + dogs = dog_manager_get_dogs(); + + foreach ( dog in dogs ) + { + if ( !isalive( dog ) ) + continue; + + if ( dog istouching( area ) ) + { + do_flash = 1; + + if ( isplayer( self ) ) + { + if ( level.teambased && dog.aiteam == self.team ) + do_flash = 0; + else if ( !level.teambased && isdefined( dog.script_owner ) && self == dog.script_owner ) + do_flash = 0; + } + + if ( isdefined( dog.lastflashed ) && dog.lastflashed + 1500 > gettime() ) + do_flash = 0; + + if ( do_flash ) + { + dog setflashbanged( 1, 500 ); + dog.lastflashed = gettime(); + } + } + } } devgui_dog_think() { /# - setdvar( "devgui_dog", "" ); - debug_patrol = 0; - for ( ;; ) - { - cmd = getDvar( "devgui_dog" ); - switch( cmd ) - { - case "spawn_friendly": - player = gethostplayer(); - devgui_dog_spawn( player.team ); - break; - case "spawn_enemy": - player = gethostplayer(); - _a792 = level.teams; - _k792 = getFirstArrayKey( _a792 ); - while ( isDefined( _k792 ) ) - { - team = _a792[ _k792 ]; - if ( team == player.team ) - { - } - else - { - devgui_dog_spawn( team ); - } - _k792 = getNextArrayKey( _a792, _k792 ); - } - case "delete_dogs": - level dog_abort(); - break; - case "dog_camera": - devgui_dog_camera(); - break; - case "spawn_crate": - devgui_crate_spawn(); - break; - case "delete_crates": - devgui_crate_delete(); - break; - case "show_spawns": - devgui_spawn_show(); - break; - case "show_exits": - devgui_exit_show(); - break; - case "debug_route": - devgui_debug_route(); - break; - } - if ( cmd != "" ) - { - setdvar( "devgui_dog", "" ); - } - wait 0,5; + setdvar( "devgui_dog", "" ); + debug_patrol = 0; + + for (;;) + { + cmd = getdvar( "devgui_dog" ); + + switch ( cmd ) + { + case "spawn_friendly": + player = gethostplayer(); + devgui_dog_spawn( player.team ); + break; + case "spawn_enemy": + player = gethostplayer(); + + foreach ( team in level.teams ) + { + if ( team == player.team ) + continue; + + devgui_dog_spawn( team ); + } + + break; + case "delete_dogs": + level dog_abort(); + break; + case "dog_camera": + devgui_dog_camera(); + break; + case "spawn_crate": + devgui_crate_spawn(); + break; + case "delete_crates": + devgui_crate_delete(); + break; + case "show_spawns": + devgui_spawn_show(); + break; + case "show_exits": + devgui_exit_show(); + break; + case "debug_route": + devgui_debug_route(); + break; + } + + if ( cmd != "" ) + setdvar( "devgui_dog", "" ); + + wait 0.5; + } #/ - } - } } devgui_dog_spawn( team ) { /# - player = gethostplayer(); - dog_spawner = getent( "dog_spawner", "targetname" ); - level.dog_abort = 0; - if ( !isDefined( dog_spawner ) ) - { - iprintln( "No dog spawners found in map" ); - return; - } - direction = player getplayerangles(); - direction_vec = anglesToForward( direction ); - eye = player geteye(); - scale = 8000; - direction_vec = ( direction_vec[ 0 ] * scale, direction_vec[ 1 ] * scale, direction_vec[ 2 ] * scale ); - trace = bullettrace( eye, eye + direction_vec, 0, undefined ); - nodes = getnodesinradius( trace[ "position" ], 256, 0, 128, "Path", 8 ); - if ( !nodes.size ) - { - iprintln( "No nodes found near crosshair position" ); - return; - } - iprintln( "Spawning dog at your crosshair position" ); - node = getclosest( trace[ "position" ], nodes ); - dog = dog_manager_spawn_dog( player, player.team, node, 5 ); - if ( team != player.team ) - { - dog.aiteam = team; - dog clearentityowner(); - dog notify( "clear_owner" ); + player = gethostplayer(); + dog_spawner = getent( "dog_spawner", "targetname" ); + level.dog_abort = 0; + + if ( !isdefined( dog_spawner ) ) + { + iprintln( "No dog spawners found in map" ); + return; + } + + direction = player getplayerangles(); + direction_vec = anglestoforward( direction ); + eye = player geteye(); + scale = 8000; + direction_vec = ( direction_vec[0] * scale, direction_vec[1] * scale, direction_vec[2] * scale ); + trace = bullettrace( eye, eye + direction_vec, 0, undefined ); + nodes = getnodesinradius( trace["position"], 256, 0, 128, "Path", 8 ); + + if ( !nodes.size ) + { + iprintln( "No nodes found near crosshair position" ); + return; + } + + iprintln( "Spawning dog at your crosshair position" ); + node = getclosest( trace["position"], nodes ); + dog = dog_manager_spawn_dog( player, player.team, node, 5 ); + + if ( team != player.team ) + { + dog.aiteam = team; + dog clearentityowner(); + dog notify( "clear_owner" ); + } #/ - } } devgui_dog_camera() { /# - player = gethostplayer(); - if ( !isDefined( level.devgui_dog_camera ) ) - { - level.devgui_dog_camera = 0; - } - dog = undefined; - dogs = dog_manager_get_dogs(); - if ( dogs.size <= 0 ) - { - level.devgui_dog_camera = undefined; - player cameraactivate( 0 ); - return; - } - i = 0; - while ( i < dogs.size ) - { - dog = dogs[ i ]; - if ( !isDefined( dog ) || !isalive( dog ) ) - { - dog = undefined; - i++; - continue; - } - else - { - if ( !isDefined( dog.cam ) ) - { - forward = anglesToForward( dog.angles ); - dog.cam = spawn( "script_model", ( dog.origin + vectorScale( ( 1, 0, 0 ), 50 ) ) + ( forward * -100 ) ); - dog.cam setmodel( "tag_origin" ); - dog.cam linkto( dog ); - } - if ( dog getentitynumber() <= level.devgui_dog_camera ) - { - dog = undefined; - i++; - continue; - } - else - { - } - } - i++; - } - if ( isDefined( dog ) ) - { - level.devgui_dog_camera = dog getentitynumber(); - player camerasetposition( dog.cam ); - player camerasetlookat( dog ); - player cameraactivate( 1 ); - } - else level.devgui_dog_camera = undefined; - player cameraactivate( 0 ); + player = gethostplayer(); + + if ( !isdefined( level.devgui_dog_camera ) ) + level.devgui_dog_camera = 0; + + dog = undefined; + dogs = dog_manager_get_dogs(); + + if ( dogs.size <= 0 ) + { + level.devgui_dog_camera = undefined; + player cameraactivate( 0 ); + return; + } + + for ( i = 0; i < dogs.size; i++ ) + { + dog = dogs[i]; + + if ( !isdefined( dog ) || !isalive( dog ) ) + { + dog = undefined; + continue; + } + + if ( !isdefined( dog.cam ) ) + { + forward = anglestoforward( dog.angles ); + dog.cam = spawn( "script_model", dog.origin + vectorscale( ( 0, 0, 1 ), 50.0 ) + forward * -100 ); + dog.cam setmodel( "tag_origin" ); + dog.cam linkto( dog ); + } + + if ( dog getentitynumber() <= level.devgui_dog_camera ) + { + dog = undefined; + continue; + } + + break; + } + + if ( isdefined( dog ) ) + { + level.devgui_dog_camera = dog getentitynumber(); + player camerasetposition( dog.cam ); + player camerasetlookat( dog ); + player cameraactivate( 1 ); + } + else + { + level.devgui_dog_camera = undefined; + player cameraactivate( 0 ); + } #/ } devgui_crate_spawn() { /# - player = gethostplayer(); - direction = player getplayerangles(); - direction_vec = anglesToForward( direction ); - eye = player geteye(); - scale = 8000; - direction_vec = ( direction_vec[ 0 ] * scale, direction_vec[ 1 ] * scale, direction_vec[ 2 ] * scale ); - trace = bullettrace( eye, eye + direction_vec, 0, undefined ); - killcament = spawn( "script_model", player.origin ); - level thread maps/mp/killstreaks/_supplydrop::dropcrate( trace[ "position" ] + vectorScale( ( 1, 0, 0 ), 25 ), direction, "supplydrop_mp", player, player.team, killcament ); + player = gethostplayer(); + direction = player getplayerangles(); + direction_vec = anglestoforward( direction ); + eye = player geteye(); + scale = 8000; + direction_vec = ( direction_vec[0] * scale, direction_vec[1] * scale, direction_vec[2] * scale ); + trace = bullettrace( eye, eye + direction_vec, 0, undefined ); + killcament = spawn( "script_model", player.origin ); + level thread maps\mp\killstreaks\_supplydrop::dropcrate( trace["position"] + vectorscale( ( 0, 0, 1 ), 25.0 ), direction, "supplydrop_mp", player, player.team, killcament ); #/ } devgui_crate_delete() { /# - if ( !isDefined( level.devgui_crates ) ) - { - return; - } - i = 0; - while ( i < level.devgui_crates.size ) - { - level.devgui_crates[ i ] delete(); - i++; - } - level.devgui_crates = []; + if ( !isdefined( level.devgui_crates ) ) + return; + + for ( i = 0; i < level.devgui_crates.size; i++ ) + level.devgui_crates[i] delete(); + + level.devgui_crates = []; #/ } devgui_spawn_show() { /# - if ( !isDefined( level.dog_spawn_show ) ) - { - level.dog_spawn_show = 1; - } - else - { - level.dog_spawn_show = !level.dog_spawn_show; - } - if ( !level.dog_spawn_show ) - { - level notify( "hide_dog_spawns" ); - return; - } - spawns = level.dog_spawns; - color = ( 1, 0, 0 ); - i = 0; - while ( i < spawns.size ) - { - maps/mp/gametypes/_dev::showonespawnpoint( spawns[ i ], color, "hide_dog_spawns", 32, "dog_spawn" ); - i++; + if ( !isdefined( level.dog_spawn_show ) ) + level.dog_spawn_show = 1; + else + level.dog_spawn_show = !level.dog_spawn_show; + + if ( !level.dog_spawn_show ) + { + level notify( "hide_dog_spawns" ); + return; + } + + spawns = level.dog_spawns; + color = ( 0, 1, 0 ); + + for ( i = 0; i < spawns.size; i++ ) + maps\mp\gametypes\_dev::showonespawnpoint( spawns[i], color, "hide_dog_spawns", 32, "dog_spawn" ); #/ - } } devgui_exit_show() { /# - if ( !isDefined( level.dog_exit_show ) ) - { - level.dog_exit_show = 1; - } - else - { - level.dog_exit_show = !level.dog_exit_show; - } - if ( !level.dog_exit_show ) - { - level notify( "hide_dog_exits" ); - return; - } - exits = getnodearray( "exit", "script_noteworthy" ); - color = ( 1, 0, 0 ); - i = 0; - while ( i < exits.size ) - { - maps/mp/gametypes/_dev::showonespawnpoint( exits[ i ], color, "hide_dog_exits", 32, "dog_exit" ); - i++; + if ( !isdefined( level.dog_exit_show ) ) + level.dog_exit_show = 1; + else + level.dog_exit_show = !level.dog_exit_show; + + if ( !level.dog_exit_show ) + { + level notify( "hide_dog_exits" ); + return; + } + + exits = getnodearray( "exit", "script_noteworthy" ); + color = ( 1, 0, 0 ); + + for ( i = 0; i < exits.size; i++ ) + maps\mp\gametypes\_dev::showonespawnpoint( exits[i], color, "hide_dog_exits", 32, "dog_exit" ); #/ - } } dog_debug_patrol( node1, node2 ) { /# - self endon( "death" ); - self endon( "debug_patrol" ); - for ( ;; ) - { - self setgoalnode( node1 ); - self waittill_any( "goal", "bad_path" ); - wait 1; - self setgoalnode( node2 ); - self waittill_any( "goal", "bad_path" ); - wait 1; + self endon( "death" ); + self endon( "debug_patrol" ); + + for (;;) + { + self setgoalnode( node1 ); + self waittill_any( "goal", "bad_path" ); + wait 1; + self setgoalnode( node2 ); + self waittill_any( "goal", "bad_path" ); + wait 1; + } #/ - } } devgui_debug_route() { /# - iprintln( "Choose nodes with 'A' or press 'B' to cancel" ); - nodes = maps/mp/gametypes/_dev::dev_get_node_pair(); - if ( !isDefined( nodes ) ) - { - iprintln( "Route Debug Cancelled" ); - return; - } - iprintln( "Sending dog to chosen nodes" ); - dogs = dog_manager_get_dogs(); - if ( isDefined( dogs[ 0 ] ) ) - { - dogs[ 0 ] notify( "debug_patrol" ); - dogs[ 0 ] thread dog_debug_patrol( nodes[ 0 ], nodes[ 1 ] ); + iprintln( "Choose nodes with 'A' or press 'B' to cancel" ); + nodes = maps\mp\gametypes\_dev::dev_get_node_pair(); + + if ( !isdefined( nodes ) ) + { + iprintln( "Route Debug Cancelled" ); + return; + } + + iprintln( "Sending dog to chosen nodes" ); + dogs = dog_manager_get_dogs(); + + if ( isdefined( dogs[0] ) ) + { + dogs[0] notify( "debug_patrol" ); + dogs[0] thread dog_debug_patrol( nodes[0], nodes[1] ); + } #/ - } } diff --git a/Multiplayer Core/patch_mp/maps/mp/killstreaks/_emp.gsc b/Multiplayer Core/patch_mp/maps/mp/killstreaks/_emp.gsc index 5f259f9..a9d85cf 100644 --- a/Multiplayer Core/patch_mp/maps/mp/killstreaks/_emp.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/killstreaks/_emp.gsc @@ -1,590 +1,474 @@ -#include maps/mp/killstreaks/_emp; -#include maps/mp/_tacticalinsertion; -#include maps/mp/gametypes/_weaponobjects; -#include maps/mp/gametypes/_hostmigration; -#include maps/mp/killstreaks/_killstreakrules; -#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\_killstreakrules; +#include maps\mp\gametypes\_hostmigration; +#include maps\mp\gametypes\_weaponobjects; +#include maps\mp\_tacticalinsertion; +#include maps\mp\killstreaks\_emp; init() { - level._effect[ "emp_flash" ] = loadfx( "weapon/emp/fx_emp_explosion" ); - _a9 = level.teams; - _k9 = getFirstArrayKey( _a9 ); - while ( isDefined( _k9 ) ) - { - team = _a9[ _k9 ]; - level.teamemping[ team ] = 0; - _k9 = getNextArrayKey( _a9, _k9 ); - } - level.empplayer = undefined; - level.emptimeout = 40; - level.empowners = []; - if ( level.teambased ) - { - level thread emp_teamtracker(); - } - else - { - level thread emp_playertracker(); - } - level thread onplayerconnect(); - registerkillstreak( "emp_mp", "emp_mp", "killstreak_emp", "emp_used", ::emp_use ); - registerkillstreakstrings( "emp_mp", &"KILLSTREAK_EARNED_EMP", &"KILLSTREAK_EMP_NOT_AVAILABLE", &"KILLSTREAK_EMP_INBOUND" ); - registerkillstreakdialog( "emp_mp", "mpl_killstreak_emp_activate", "kls_emp_used", "", "kls_emp_enemy", "", "kls_emp_ready" ); - registerkillstreakdevdvar( "emp_mp", "scr_giveemp" ); - maps/mp/killstreaks/_killstreaks::createkillstreaktimer( "emp_mp" ); + level._effect["emp_flash"] = loadfx( "weapon/emp/fx_emp_explosion" ); + + foreach ( team in level.teams ) + level.teamemping[team] = 0; + + level.empplayer = undefined; + level.emptimeout = 40.0; + level.empowners = []; + + if ( level.teambased ) + level thread emp_teamtracker(); + else + level thread emp_playertracker(); + + level thread onplayerconnect(); + registerkillstreak( "emp_mp", "emp_mp", "killstreak_emp", "emp_used", ::emp_use ); + registerkillstreakstrings( "emp_mp", &"KILLSTREAK_EARNED_EMP", &"KILLSTREAK_EMP_NOT_AVAILABLE", &"KILLSTREAK_EMP_INBOUND" ); + registerkillstreakdialog( "emp_mp", "mpl_killstreak_emp_activate", "kls_emp_used", "", "kls_emp_enemy", "", "kls_emp_ready" ); + registerkillstreakdevdvar( "emp_mp", "scr_giveemp" ); + maps\mp\killstreaks\_killstreaks::createkillstreaktimer( "emp_mp" ); /# - set_dvar_float_if_unset( "scr_emp_timeout", 40 ); - set_dvar_int_if_unset( "scr_emp_damage_debug", 0 ); + set_dvar_float_if_unset( "scr_emp_timeout", 40.0 ); + set_dvar_int_if_unset( "scr_emp_damage_debug", 0 ); #/ } onplayerconnect() { - for ( ;; ) - { - level waittill( "connected", player ); - player thread onplayerspawned(); - } + for (;;) + { + level waittill( "connected", player ); + + player thread onplayerspawned(); + } } onplayerspawned() { - self endon( "disconnect" ); - for ( ;; ) - { - self waittill( "spawned_player" ); - if ( level.teambased || emp_isteamemped( self.team ) && !level.teambased && isDefined( level.empplayer ) && level.empplayer != self ) - { - self setempjammed( 1 ); - } - } + self endon( "disconnect" ); + + for (;;) + { + self waittill( "spawned_player" ); + + if ( level.teambased && emp_isteamemped( self.team ) || !level.teambased && isdefined( level.empplayer ) && level.empplayer != self ) + self setempjammed( 1 ); + } } emp_isteamemped( check_team ) { - _a64 = level.teams; - _k64 = getFirstArrayKey( _a64 ); - while ( isDefined( _k64 ) ) - { - team = _a64[ _k64 ]; - if ( team == check_team ) - { - } - else - { - if ( level.teamemping[ team ] ) - { - return 1; - } - } - _k64 = getNextArrayKey( _a64, _k64 ); - } - return 0; + foreach ( team in level.teams ) + { + if ( team == check_team ) + continue; + + if ( level.teamemping[team] ) + return true; + } + + return false; } emp_use( lifeid ) { /# - assert( isDefined( self ) ); + assert( isdefined( self ) ); #/ - killstreak_id = self maps/mp/killstreaks/_killstreakrules::killstreakstart( "emp_mp", self.team, 0, 1 ); - if ( killstreak_id == -1 ) - { - return 0; - } - myteam = self.pers[ "team" ]; - if ( level.teambased ) - { - self thread emp_jamotherteams( myteam, killstreak_id ); - } - else - { - self thread emp_jamplayers( self, killstreak_id ); - } - self.emptime = getTime(); - self notify( "used_emp" ); - self playlocalsound( "mpl_killstreak_emp_activate" ); - self maps/mp/killstreaks/_killstreaks::playkillstreakstartdialog( "emp_mp", self.pers[ "team" ] ); - level.globalkillstreakscalled++; - self addweaponstat( "emp_mp", "used", 1 ); - return 1; + killstreak_id = self maps\mp\killstreaks\_killstreakrules::killstreakstart( "emp_mp", self.team, 0, 1 ); + + if ( killstreak_id == -1 ) + return false; + + myteam = self.pers["team"]; + + if ( level.teambased ) + self thread emp_jamotherteams( myteam, killstreak_id ); + else + self thread emp_jamplayers( self, killstreak_id ); + + self.emptime = gettime(); + self notify( "used_emp" ); + self playlocalsound( "mpl_killstreak_emp_activate" ); + self maps\mp\killstreaks\_killstreaks::playkillstreakstartdialog( "emp_mp", self.pers["team"] ); + level.globalkillstreakscalled++; + self addweaponstat( "emp_mp", "used", 1 ); + return true; } emp_jamotherteams( teamname, killstreak_id ) { - level endon( "game_ended" ); - overlays = []; + level endon( "game_ended" ); + overlays = []; /# - assert( isDefined( level.teams[ teamname ] ) ); + assert( isdefined( level.teams[teamname] ) ); #/ - level notify( "EMP_JamOtherTeams" + teamname ); - level endon( "EMP_JamOtherTeams" + teamname ); - level.empowners[ teamname ] = self; - _a121 = level.players; - _k121 = getFirstArrayKey( _a121 ); - while ( isDefined( _k121 ) ) - { - player = _a121[ _k121 ]; - if ( player.team == teamname ) - { - } - else - { - player playlocalsound( "mpl_killstreak_emp_blast_front" ); - } - _k121 = getNextArrayKey( _a121, _k121 ); - } - visionsetnaked( "flash_grenade", 1,5 ); - thread empeffects(); - wait 0,1; - visionsetnaked( "flash_grenade", 0 ); - if ( isDefined( level.nukedetonated ) ) - { - visionsetnaked( level.nukevisionset, 5 ); - } - else - { - visionsetnaked( getDvar( "mapname" ), 5 ); - } - level.teamemping[ teamname ] = 1; - level notify( "emp_update" ); - level destroyotherteamsactivevehicles( self, teamname ); - level destroyotherteamsequipment( self, teamname ); + level notify( "EMP_JamOtherTeams" + teamname ); + level endon( "EMP_JamOtherTeams" + teamname ); + level.empowners[teamname] = self; + + foreach ( player in level.players ) + { + if ( player.team == teamname ) + continue; + + player playlocalsound( "mpl_killstreak_emp_blast_front" ); + } + + visionsetnaked( "flash_grenade", 1.5 ); + thread empeffects(); + wait 0.1; + visionsetnaked( "flash_grenade", 0 ); + + if ( isdefined( level.nukedetonated ) ) + visionsetnaked( level.nukevisionset, 5.0 ); + else + visionsetnaked( getdvar( "mapname" ), 5.0 ); + + level.teamemping[teamname] = 1; + level notify( "emp_update" ); + level destroyotherteamsactivevehicles( self, teamname ); + level destroyotherteamsequipment( self, teamname ); /# - level.emptimeout = getDvarFloat( #"35E553D4" ); + level.emptimeout = getdvarfloat( "scr_emp_timeout" ); #/ - maps/mp/gametypes/_hostmigration::waitlongdurationwithhostmigrationpauseemp( level.emptimeout ); - level.teamemping[ teamname ] = 0; - maps/mp/killstreaks/_killstreakrules::killstreakstop( "emp_mp", teamname, killstreak_id ); - level notify( "emp_update" ); - level notify( "emp_end" + teamname ); + maps\mp\gametypes\_hostmigration::waitlongdurationwithhostmigrationpauseemp( level.emptimeout ); + level.teamemping[teamname] = 0; + maps\mp\killstreaks\_killstreakrules::killstreakstop( "emp_mp", teamname, killstreak_id ); + level.empowners[teamname] = undefined; + level notify( "emp_update" ); + level notify( "emp_end" + teamname ); } emp_jamplayers( owner, killstreak_id ) { - level notify( "EMP_JamPlayers" ); - level endon( "EMP_JamPlayers" ); - overlays = []; + level notify( "EMP_JamPlayers" ); + level endon( "EMP_JamPlayers" ); + overlays = []; /# - assert( isDefined( owner ) ); + assert( isdefined( owner ) ); #/ - _a180 = level.players; - _k180 = getFirstArrayKey( _a180 ); - while ( isDefined( _k180 ) ) - { - player = _a180[ _k180 ]; - if ( player == owner ) - { - } - else - { - player playlocalsound( "mpl_killstreak_emp_blast_front" ); - } - _k180 = getNextArrayKey( _a180, _k180 ); - } - visionsetnaked( "flash_grenade", 1,5 ); - thread empeffects(); - wait 0,1; - visionsetnaked( "flash_grenade", 0 ); - if ( isDefined( level.nukedetonated ) ) - { - visionsetnaked( level.nukevisionset, 5 ); - } - else - { - visionsetnaked( getDvar( "mapname" ), 5 ); - } - level notify( "emp_update" ); - level.empplayer = owner; - level.empplayer thread empplayerffadisconnect(); - level destroyactivevehicles( owner ); - level destroyequipment( owner ); - level notify( "emp_update" ); + foreach ( player in level.players ) + { + if ( player == owner ) + continue; + + player playlocalsound( "mpl_killstreak_emp_blast_front" ); + } + + visionsetnaked( "flash_grenade", 1.5 ); + thread empeffects(); + wait 0.1; + visionsetnaked( "flash_grenade", 0 ); + + if ( isdefined( level.nukedetonated ) ) + visionsetnaked( level.nukevisionset, 5.0 ); + else + visionsetnaked( getdvar( "mapname" ), 5.0 ); + + level notify( "emp_update" ); + level.empplayer = owner; + level.empplayer thread empplayerffadisconnect(); + level destroyactivevehicles( owner ); + level destroyequipment( owner ); + level notify( "emp_update" ); /# - level.emptimeout = getDvarFloat( #"35E553D4" ); + level.emptimeout = getdvarfloat( "scr_emp_timeout" ); #/ - maps/mp/gametypes/_hostmigration::waitlongdurationwithhostmigrationpause( level.emptimeout ); - maps/mp/killstreaks/_killstreakrules::killstreakstop( "emp_mp", level.empplayer.team, killstreak_id ); - level.empplayer = undefined; - level notify( "emp_update" ); - level notify( "emp_ended" ); + maps\mp\gametypes\_hostmigration::waitlongdurationwithhostmigrationpause( level.emptimeout ); + maps\mp\killstreaks\_killstreakrules::killstreakstop( "emp_mp", level.empplayer.team, killstreak_id ); + level.empplayer = undefined; + level notify( "emp_update" ); + level notify( "emp_ended" ); } empplayerffadisconnect() { - level endon( "EMP_JamPlayers" ); - level endon( "emp_ended" ); - self waittill( "disconnect" ); - level notify( "emp_update" ); + level endon( "EMP_JamPlayers" ); + level endon( "emp_ended" ); + + self waittill( "disconnect" ); + + level notify( "emp_update" ); } empeffects() { - _a241 = level.players; - _k241 = getFirstArrayKey( _a241 ); - while ( isDefined( _k241 ) ) - { - player = _a241[ _k241 ]; - playerforward = anglesToForward( player.angles ); - playerforward = ( playerforward[ 0 ], playerforward[ 1 ], 0 ); - playerforward = vectornormalize( playerforward ); - empdistance = 20000; - empent = spawn( "script_model", ( player.origin + vectorScale( ( 0, 0, 1 ), 8000 ) ) + ( playerforward * empdistance ) ); - empent setmodel( "tag_origin" ); - empent.angles += vectorScale( ( 0, 0, 1 ), 270 ); - empent thread empeffect( player ); - _k241 = getNextArrayKey( _a241, _k241 ); - } + foreach ( player in level.players ) + { + playerforward = anglestoforward( player.angles ); + playerforward = ( playerforward[0], playerforward[1], 0 ); + playerforward = vectornormalize( playerforward ); + empdistance = 20000; + empent = spawn( "script_model", player.origin + vectorscale( ( 0, 0, 1 ), 8000.0 ) + playerforward * empdistance ); + empent setmodel( "tag_origin" ); + empent.angles += vectorscale( ( 1, 0, 0 ), 270.0 ); + empent thread empeffect( player ); + } } empeffect( player ) { - player endon( "disconnect" ); - self setinvisibletoall(); - self setvisibletoplayer( player ); - wait 0,5; - playfxontag( level._effect[ "emp_flash" ], self, "tag_origin" ); - self playsound( "wpn_emp_bomb" ); - self deleteaftertime( 11 ); + player endon( "disconnect" ); + self setinvisibletoall(); + self setvisibletoplayer( player ); + wait 0.5; + playfxontag( level._effect["emp_flash"], self, "tag_origin" ); + self playsound( "wpn_emp_bomb" ); + self deleteaftertime( 11 ); } emp_teamtracker() { - level endon( "game_ended" ); - for ( ;; ) - { - level waittill_either( "joined_team", "emp_update" ); - _a279 = level.players; - _k279 = getFirstArrayKey( _a279 ); - while ( isDefined( _k279 ) ) - { - player = _a279[ _k279 ]; - if ( player.team == "spectator" ) - { - } - else - { - emped = emp_isteamemped( player.team ); - player setempjammed( emped ); - if ( emped ) - { - player notify( "emp_jammed" ); - } - } - _k279 = getNextArrayKey( _a279, _k279 ); - } - } + level endon( "game_ended" ); + + for (;;) + { + level waittill_either( "joined_team", "emp_update" ); + + foreach ( player in level.players ) + { + if ( player.team == "spectator" ) + continue; + + emped = emp_isteamemped( player.team ); + player setempjammed( emped ); + + if ( emped ) + player notify( "emp_jammed" ); + } + } } emp_playertracker() { - level endon( "game_ended" ); - for ( ;; ) - { - level waittill_either( "joined_team", "emp_update" ); - _a306 = level.players; - _k306 = getFirstArrayKey( _a306 ); - while ( isDefined( _k306 ) ) - { - player = _a306[ _k306 ]; - if ( player.team == "spectator" ) - { - } - else if ( isDefined( level.empplayer ) && level.empplayer != player ) - { - player setempjammed( 1 ); - player notify( "emp_jammed" ); - } - else - { - player setempjammed( 0 ); - } - _k306 = getNextArrayKey( _a306, _k306 ); - } - } + level endon( "game_ended" ); + + for (;;) + { + level waittill_either( "joined_team", "emp_update" ); + + foreach ( player in level.players ) + { + if ( player.team == "spectator" ) + continue; + + if ( isdefined( level.empplayer ) && level.empplayer != player ) + { + player setempjammed( 1 ); + player notify( "emp_jammed" ); + continue; + } + + player setempjammed( 0 ); + } + } } destroyotherteamsequipment( attacker, teamemping ) { - _a328 = level.teams; - _k328 = getFirstArrayKey( _a328 ); - while ( isDefined( _k328 ) ) - { - team = _a328[ _k328 ]; - if ( team == teamemping ) - { - } - else - { - destroyequipment( attacker, team ); - destroytacticalinsertions( attacker, team ); - } - _k328 = getNextArrayKey( _a328, _k328 ); - } + foreach ( team in level.teams ) + { + if ( team == teamemping ) + continue; + + destroyequipment( attacker, team ); + destroytacticalinsertions( attacker, team ); + } } destroyequipment( attacker, teamemped ) { - i = 0; - while ( i < level.missileentities.size ) - { - item = level.missileentities[ i ]; - if ( !isDefined( item.name ) ) - { - i++; - continue; - } - else if ( !isDefined( item.owner ) ) - { - i++; - continue; - } - else if ( isDefined( teamemped ) && item.owner.team != teamemped ) - { - i++; - continue; - } - else if ( item.owner == attacker ) - { - i++; - continue; - } - else if ( !isweaponequipment( item.name ) && item.name != "proximity_grenade_mp" ) - { - i++; - continue; - } - else - { - watcher = item.owner getwatcherforweapon( item.name ); - if ( !isDefined( watcher ) ) - { - i++; - continue; - } - else - { - watcher thread maps/mp/gametypes/_weaponobjects::waitanddetonate( item, 0, attacker, "emp_mp" ); - } - } - i++; - } + for ( i = 0; i < level.missileentities.size; i++ ) + { + item = level.missileentities[i]; + + if ( !isdefined( item.name ) ) + continue; + + if ( !isdefined( item.owner ) ) + continue; + + if ( isdefined( teamemped ) && item.owner.team != teamemped ) + continue; + else if ( item.owner == attacker ) + continue; + + if ( !isweaponequipment( item.name ) && item.name != "proximity_grenade_mp" ) + continue; + + watcher = item.owner getwatcherforweapon( item.name ); + + if ( !isdefined( watcher ) ) + continue; + + watcher thread maps\mp\gametypes\_weaponobjects::waitanddetonate( item, 0.0, attacker, "emp_mp" ); + } } destroytacticalinsertions( attacker, victimteam ) { - i = 0; - while ( i < level.players.size ) - { - player = level.players[ i ]; - if ( !isDefined( player.tacticalinsertion ) ) - { - i++; - continue; - } - else if ( level.teambased && player.team != victimteam ) - { - i++; - continue; - } - else - { - if ( attacker == player ) - { - i++; - continue; - } - else - { - player.tacticalinsertion thread maps/mp/_tacticalinsertion::fizzle(); - } - } - i++; - } + for ( i = 0; i < level.players.size; i++ ) + { + player = level.players[i]; + + if ( !isdefined( player.tacticalinsertion ) ) + continue; + + if ( level.teambased && player.team != victimteam ) + continue; + + if ( attacker == player ) + continue; + + player.tacticalinsertion thread maps\mp\_tacticalinsertion::fizzle(); + } } getwatcherforweapon( weapname ) { - if ( !isDefined( self ) ) - { - return undefined; - } - if ( !isplayer( self ) ) - { - return undefined; - } - i = 0; - while ( i < self.weaponobjectwatcherarray.size ) - { - if ( self.weaponobjectwatcherarray[ i ].weapon != weapname ) - { - i++; - continue; - } - else - { - return self.weaponobjectwatcherarray[ i ]; - } - i++; - } - return undefined; + if ( !isdefined( self ) ) + return undefined; + + if ( !isplayer( self ) ) + return undefined; + + for ( i = 0; i < self.weaponobjectwatcherarray.size; i++ ) + { + if ( self.weaponobjectwatcherarray[i].weapon != weapname ) + continue; + + return self.weaponobjectwatcherarray[i]; + } + + return undefined; } destroyotherteamsactivevehicles( attacker, teamemping ) { - _a431 = level.teams; - _k431 = getFirstArrayKey( _a431 ); - while ( isDefined( _k431 ) ) - { - team = _a431[ _k431 ]; - if ( team == teamemping ) - { - } - else - { - destroyactivevehicles( attacker, team ); - } - _k431 = getNextArrayKey( _a431, _k431 ); - } + foreach ( team in level.teams ) + { + if ( team == teamemping ) + continue; + + destroyactivevehicles( attacker, team ); + } } destroyactivevehicles( attacker, teamemped ) { - turrets = getentarray( "auto_turret", "classname" ); - destroyentities( turrets, attacker, teamemped ); - targets = target_getarray(); - destroyentities( targets, attacker, teamemped ); - rcbombs = getentarray( "rcbomb", "targetname" ); - destroyentities( rcbombs, attacker, teamemped ); - remotemissiles = getentarray( "remote_missile", "targetname" ); - destroyentities( remotemissiles, attacker, teamemped ); - remotedrone = getentarray( "remote_drone", "targetname" ); - destroyentities( remotedrone, attacker, teamemped ); - planemortars = getentarray( "plane_mortar", "targetname" ); - _a458 = planemortars; - _k458 = getFirstArrayKey( _a458 ); - while ( isDefined( _k458 ) ) - { - planemortar = _a458[ _k458 ]; - if ( isDefined( teamemped ) && isDefined( planemortar.team ) ) - { - if ( planemortar.team != teamemped ) - { - } - else } - else if ( planemortar.owner == attacker ) - { - } - else - { - planemortar notify( "emp_deployed" ); - } - _k458 = getNextArrayKey( _a458, _k458 ); - } - satellites = getentarray( "satellite", "targetname" ); - _a477 = satellites; - _k477 = getFirstArrayKey( _a477 ); - while ( isDefined( _k477 ) ) - { - satellite = _a477[ _k477 ]; - if ( isDefined( teamemped ) && isDefined( satellite.team ) ) - { - if ( satellite.team != teamemped ) - { - } - else } - else if ( satellite.owner == attacker ) - { - } - else - { - satellite notify( "emp_deployed" ); - } - _k477 = getNextArrayKey( _a477, _k477 ); - } - if ( isDefined( level.missile_swarm_owner ) ) - { - if ( level.missile_swarm_owner isenemyplayer( attacker ) ) - { - level.missile_swarm_owner notify( "emp_destroyed_missile_swarm" ); - } - } + turrets = getentarray( "auto_turret", "classname" ); + destroyentities( turrets, attacker, teamemped ); + targets = target_getarray(); + destroyentities( targets, attacker, teamemped ); + rcbombs = getentarray( "rcbomb", "targetname" ); + destroyentities( rcbombs, attacker, teamemped ); + remotemissiles = getentarray( "remote_missile", "targetname" ); + destroyentities( remotemissiles, attacker, teamemped ); + remotedrone = getentarray( "remote_drone", "targetname" ); + destroyentities( remotedrone, attacker, teamemped ); + planemortars = getentarray( "plane_mortar", "targetname" ); + + foreach ( planemortar in planemortars ) + { + if ( isdefined( teamemped ) && isdefined( planemortar.team ) ) + { + if ( planemortar.team != teamemped ) + continue; + } + else if ( planemortar.owner == attacker ) + continue; + + planemortar notify( "emp_deployed", attacker ); + } + + satellites = getentarray( "satellite", "targetname" ); + + foreach ( satellite in satellites ) + { + if ( isdefined( teamemped ) && isdefined( satellite.team ) ) + { + if ( satellite.team != teamemped ) + continue; + } + else if ( satellite.owner == attacker ) + continue; + + satellite notify( "emp_deployed", attacker ); + } + + if ( isdefined( level.missile_swarm_owner ) ) + { + if ( level.missile_swarm_owner isenemyplayer( attacker ) ) + level.missile_swarm_owner notify( "emp_destroyed_missile_swarm", attacker ); + } } destroyentities( entities, attacker, team ) { - meansofdeath = "MOD_EXPLOSIVE"; - weapon = "killstreak_emp_mp"; - damage = 5000; - direction_vec = ( 0, 0, 1 ); - point = ( 0, 0, 1 ); - modelname = ""; - tagname = ""; - partname = ""; - _a515 = entities; - _k515 = getFirstArrayKey( _a515 ); - while ( isDefined( _k515 ) ) - { - entity = _a515[ _k515 ]; - if ( isDefined( team ) && isDefined( entity.team ) ) - { - if ( entity.team != team ) - { - } - else } - else if ( entity.owner == attacker ) - { - } - else - { - entity notify( "damage" ); - } - _k515 = getNextArrayKey( _a515, _k515 ); - } + meansofdeath = "MOD_EXPLOSIVE"; + weapon = "killstreak_emp_mp"; + damage = 5000; + direction_vec = ( 0, 0, 0 ); + point = ( 0, 0, 0 ); + modelname = ""; + tagname = ""; + partname = ""; + + foreach ( entity in entities ) + { + if ( isdefined( team ) && isdefined( entity.team ) ) + { + if ( entity.team != team ) + continue; + } + else if ( entity.owner == attacker ) + continue; + + entity notify( "damage", damage, attacker, direction_vec, point, meansofdeath, tagname, modelname, partname, weapon ); + } } drawempdamageorigin( pos, ang, radius ) { /# - while ( getDvarInt( #"D04570F2" ) ) - { - line( pos, pos + ( anglesToForward( ang ) * radius ), ( 0, 0, 1 ) ); - line( pos, pos + ( anglesToRight( ang ) * radius ), ( 0, 0, 1 ) ); - line( pos, pos + ( anglesToUp( ang ) * radius ), ( 0, 0, 1 ) ); - line( pos, pos - ( anglesToForward( ang ) * radius ), ( 0, 0, 1 ) ); - line( pos, pos - ( anglesToRight( ang ) * radius ), ( 0, 0, 1 ) ); - line( pos, pos - ( anglesToUp( ang ) * radius ), ( 0, 0, 1 ) ); - wait 0,05; + while ( getdvarint( "scr_emp_damage_debug" ) ) + { + line( pos, pos + anglestoforward( ang ) * radius, ( 1, 0, 0 ) ); + line( pos, pos + anglestoright( ang ) * radius, ( 0, 1, 0 ) ); + line( pos, pos + anglestoup( ang ) * radius, ( 0, 0, 1 ) ); + line( pos, pos - anglestoforward( ang ) * radius, ( 1, 0, 0 ) ); + line( pos, pos - anglestoright( ang ) * radius, ( 0, 1, 0 ) ); + line( pos, pos - anglestoup( ang ) * radius, ( 0, 0, 1 ) ); + wait 0.05; + } #/ - } } isenemyempkillstreakactive() { - if ( level.teambased || maps/mp/killstreaks/_emp::emp_isteamemped( self.team ) && !level.teambased && isDefined( level.empplayer ) && level.empplayer != self ) - { - return 1; - } - return 0; + if ( level.teambased && maps\mp\killstreaks\_emp::emp_isteamemped( self.team ) || !level.teambased && isdefined( level.empplayer ) && level.empplayer != self ) + return true; + + return false; } isempweapon( weaponname ) { - if ( isDefined( weaponname ) && weaponname != "emp_mp" || weaponname == "emp_grenade_mp" && weaponname == "emp_grenade_zm" ) - { - return 1; - } - return 0; + if ( isdefined( weaponname ) && ( weaponname == "emp_mp" || weaponname == "emp_grenade_mp" || weaponname == "emp_grenade_zm" ) ) + return true; + + return false; } isempkillstreakweapon( weaponname ) { - if ( isDefined( weaponname ) && weaponname == "emp_mp" ) - { - return 1; - } - return 0; + if ( isdefined( weaponname ) && weaponname == "emp_mp" ) + return true; + + return false; } diff --git a/Multiplayer Core/patch_mp/maps/mp/killstreaks/_helicopter.gsc b/Multiplayer Core/patch_mp/maps/mp/killstreaks/_helicopter.gsc index 1d0798a..d24c89c 100644 --- a/Multiplayer Core/patch_mp/maps/mp/killstreaks/_helicopter.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/killstreaks/_helicopter.gsc @@ -1,2746 +1,2577 @@ -#include maps/mp/gametypes/_hostmigration; -#include maps/mp/_scoreevents; -#include maps/mp/_challenges; -#include maps/mp/gametypes/_damagefeedback; -#include maps/mp/gametypes/_globallogic_player; -#include maps/mp/gametypes/_weaponobjects; -#include maps/mp/killstreaks/_dogs; -#include maps/mp/gametypes/_spawning; -#include maps/mp/_heatseekingmissile; -#include maps/mp/gametypes/_tweakables; -#include maps/mp/killstreaks/_killstreaks; -#include maps/mp/killstreaks/_killstreakrules; -#include maps/mp/_treadfx; -#include maps/mp/killstreaks/_airsupport; -#include common_scripts/utility; -#include maps/mp/gametypes/_hud_util; -#include maps/mp/_utility; - -#using_animtree( "mp_vehicles" ); +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\_utility; +#include maps\mp\gametypes\_hud_util; +#include common_scripts\utility; +#include maps\mp\killstreaks\_airsupport; +#include maps\mp\_treadfx; +#include maps\mp\killstreaks\_killstreakrules; +#include maps\mp\killstreaks\_killstreaks; +#include maps\mp\gametypes\_tweakables; +#include maps\mp\_heatseekingmissile; +#include maps\mp\gametypes\_spawning; +#include maps\mp\killstreaks\_dogs; +#include maps\mp\gametypes\_weaponobjects; +#include maps\mp\gametypes\_globallogic_player; +#include maps\mp\gametypes\_damagefeedback; +#include maps\mp\_challenges; +#include maps\mp\_scoreevents; +#include maps\mp\gametypes\_hostmigration; precachehelicopter( model, type ) { - if ( !isDefined( type ) ) - { - type = "blackhawk"; - } - precachemodel( model ); - level.vehicle_deathmodel[ model ] = model; - precacheitem( "cobra_20mm_mp" ); - precacheitem( "cobra_20mm_comlink_mp" ); - precachestring( &"MP_DESTROYED_HELICOPTER" ); - precachestring( &"KILLSTREAK_DESTROYED_HELICOPTER_GUNNER" ); - level.cobra_missile_models = []; - level.cobra_missile_models[ "cobra_Hellfire" ] = "projectile_hellfire_missile"; - precachemodel( level.cobra_missile_models[ "cobra_Hellfire" ] ); - level.heli_sound[ "hit" ] = "evt_helicopter_hit"; - level.heli_sound[ "hitsecondary" ] = "evt_helicopter_hit"; - level.heli_sound[ "damaged" ] = "null"; - level.heli_sound[ "spinloop" ] = "evt_helicopter_spin_loop"; - level.heli_sound[ "spinstart" ] = "evt_helicopter_spin_start"; - level.heli_sound[ "crash" ] = "evt_helicopter_midair_exp"; - level.heli_sound[ "missilefire" ] = "wpn_hellfire_fire_npc"; - maps/mp/_treadfx::preloadtreadfx( "helicopter_player_mp" ); - maps/mp/_treadfx::preloadtreadfx( "heli_ai_mp" ); - maps/mp/_treadfx::preloadtreadfx( "heli_player_gunner_mp" ); - maps/mp/_treadfx::preloadtreadfx( "heli_guard_mp" ); - maps/mp/_treadfx::preloadtreadfx( "heli_supplydrop_mp" ); + if ( !isdefined( type ) ) + type = "blackhawk"; + + precachemodel( model ); + level.vehicle_deathmodel[model] = model; + precacheitem( "cobra_20mm_mp" ); + precacheitem( "cobra_20mm_comlink_mp" ); + precachestring( &"MP_DESTROYED_HELICOPTER" ); + precachestring( &"KILLSTREAK_DESTROYED_HELICOPTER_GUNNER" ); + level.cobra_missile_models = []; + level.cobra_missile_models["cobra_Hellfire"] = "projectile_hellfire_missile"; + precachemodel( level.cobra_missile_models["cobra_Hellfire"] ); + level.heli_sound["hit"] = "evt_helicopter_hit"; + level.heli_sound["hitsecondary"] = "evt_helicopter_hit"; + level.heli_sound["damaged"] = "null"; + level.heli_sound["spinloop"] = "evt_helicopter_spin_loop"; + level.heli_sound["spinstart"] = "evt_helicopter_spin_start"; + level.heli_sound["crash"] = "evt_helicopter_midair_exp"; + level.heli_sound["missilefire"] = "wpn_hellfire_fire_npc"; + maps\mp\_treadfx::preloadtreadfx( "helicopter_player_mp" ); + maps\mp\_treadfx::preloadtreadfx( "heli_ai_mp" ); + maps\mp\_treadfx::preloadtreadfx( "heli_player_gunner_mp" ); + maps\mp\_treadfx::preloadtreadfx( "heli_guard_mp" ); + maps\mp\_treadfx::preloadtreadfx( "heli_supplydrop_mp" ); } usekillstreakhelicopter( hardpointtype ) { - if ( self maps/mp/killstreaks/_killstreakrules::iskillstreakallowed( hardpointtype, self.team ) == 0 ) - { - return 0; - } - if ( !isDefined( level.heli_paths ) || !level.heli_paths.size ) - { - iprintlnbold( "Need to add helicopter paths to the level" ); - return 0; - } - if ( hardpointtype == "helicopter_comlink_mp" ) - { - result = self selecthelicopterlocation( hardpointtype ); - if ( !isDefined( result ) || result == 0 ) - { - return 0; - } - } - destination = 0; - missilesenabled = 0; - if ( hardpointtype == "helicopter_x2_mp" ) - { - missilesenabled = 1; - } + if ( self maps\mp\killstreaks\_killstreakrules::iskillstreakallowed( hardpointtype, self.team ) == 0 ) + return false; + + if ( !isdefined( level.heli_paths ) || !level.heli_paths.size ) + { + iprintlnbold( "Need to add helicopter paths to the level" ); + return false; + } + + if ( hardpointtype == "helicopter_comlink_mp" ) + { + result = self selecthelicopterlocation( hardpointtype ); + + if ( !isdefined( result ) || result == 0 ) + return false; + } + + destination = 0; + missilesenabled = 0; + + if ( hardpointtype == "helicopter_x2_mp" ) + missilesenabled = 1; /# - assert( level.heli_paths.size > 0, "No non-primary helicopter paths found in map" ); + assert( level.heli_paths.size > 0, "No non-primary helicopter paths found in map" ); #/ - random_path = randomint( level.heli_paths[ destination ].size ); - startnode = level.heli_paths[ destination ][ random_path ]; - protectlocation = undefined; - armored = 0; - if ( hardpointtype == "helicopter_comlink_mp" ) - { - protectlocation = ( level.helilocation[ 0 ], level.helilocation[ 1 ], int( maps/mp/killstreaks/_airsupport::getminimumflyheight() ) ); - armored = 0; - startnode = getvalidprotectlocationstart( random_path, protectlocation, destination ); - } - killstreak_id = self maps/mp/killstreaks/_killstreakrules::killstreakstart( hardpointtype, self.team ); - if ( killstreak_id == -1 ) - { - return 0; - } - self thread announcehelicopterinbound( hardpointtype ); - thread heli_think( self, startnode, self.team, missilesenabled, protectlocation, hardpointtype, armored, killstreak_id ); - return 1; + random_path = randomint( level.heli_paths[destination].size ); + startnode = level.heli_paths[destination][random_path]; + protectlocation = undefined; + armored = 0; + + if ( hardpointtype == "helicopter_comlink_mp" ) + { + protectlocation = ( level.helilocation[0], level.helilocation[1], int( maps\mp\killstreaks\_airsupport::getminimumflyheight() ) ); + armored = 0; + startnode = getvalidprotectlocationstart( random_path, protectlocation, destination ); + } + + killstreak_id = self maps\mp\killstreaks\_killstreakrules::killstreakstart( hardpointtype, self.team ); + + if ( killstreak_id == -1 ) + return false; + + self thread announcehelicopterinbound( hardpointtype ); + thread heli_think( self, startnode, self.team, missilesenabled, protectlocation, hardpointtype, armored, killstreak_id ); + return true; } announcehelicopterinbound( hardpointtype ) { - team = self.team; - self maps/mp/killstreaks/_killstreaks::playkillstreakstartdialog( hardpointtype, team, 1 ); - level.globalkillstreakscalled++; - self addweaponstat( hardpointtype, "used", 1 ); + team = self.team; + self maps\mp\killstreaks\_killstreaks::playkillstreakstartdialog( hardpointtype, team, 1 ); + level.globalkillstreakscalled++; + self addweaponstat( hardpointtype, "used", 1 ); } heli_path_graph() { - path_start = getentarray( "heli_start", "targetname" ); - path_dest = getentarray( "heli_dest", "targetname" ); - loop_start = getentarray( "heli_loop_start", "targetname" ); - gunner_loop_start = getentarray( "heli_gunner_loop_start", "targetname" ); - leave_nodes = getentarray( "heli_leave", "targetname" ); - crash_start = getentarray( "heli_crash_start", "targetname" ); + path_start = getentarray( "heli_start", "targetname" ); + path_dest = getentarray( "heli_dest", "targetname" ); + loop_start = getentarray( "heli_loop_start", "targetname" ); + gunner_loop_start = getentarray( "heli_gunner_loop_start", "targetname" ); + leave_nodes = getentarray( "heli_leave", "targetname" ); + crash_start = getentarray( "heli_crash_start", "targetname" ); /# - if ( isDefined( path_start ) ) - { - assert( isDefined( path_dest ), "Missing path_start or path_dest" ); - } + assert( isdefined( path_start ) && isdefined( path_dest ), "Missing path_start or path_dest" ); #/ - i = 0; - while ( i < path_dest.size ) - { - startnode_array = []; - isprimarydest = 0; - destnode_pointer = path_dest[ i ]; - destnode = getent( destnode_pointer.target, "targetname" ); - j = 0; - while ( j < path_start.size ) - { - todest = 0; - currentnode = path_start[ j ]; - while ( isDefined( currentnode.target ) ) - { - nextnode = getent( currentnode.target, "targetname" ); - if ( nextnode.origin == destnode.origin ) - { - todest = 1; - break; - } - else - { - debug_print3d_simple( "+", currentnode, vectorScale( ( 1, 1, 1 ), 10 ) ); - if ( isDefined( nextnode.target ) ) - { - debug_line( nextnode.origin, getent( nextnode.target, "targetname" ).origin, ( 0,25, 0,5, 0,25 ), 5 ); - } - if ( isDefined( currentnode.script_delay ) ) - { - debug_print3d_simple( "Wait: " + currentnode.script_delay, currentnode, vectorScale( ( 1, 1, 1 ), 10 ) ); - } - currentnode = nextnode; - } - } - if ( todest ) - { - startnode_array[ startnode_array.size ] = getent( path_start[ j ].target, "targetname" ); - if ( isDefined( path_start[ j ].script_noteworthy ) && path_start[ j ].script_noteworthy == "primary" ) - { - isprimarydest = 1; - } - } - j++; - } + for ( i = 0; i < path_dest.size; i++ ) + { + startnode_array = []; + isprimarydest = 0; + destnode_pointer = path_dest[i]; + destnode = getent( destnode_pointer.target, "targetname" ); + + for ( j = 0; j < path_start.size; j++ ) + { + todest = 0; + + for ( currentnode = path_start[j]; isdefined( currentnode.target ); currentnode = nextnode ) + { + nextnode = getent( currentnode.target, "targetname" ); + + if ( nextnode.origin == destnode.origin ) + { + todest = 1; + break; + } + + debug_print3d_simple( "+", currentnode, vectorscale( ( 0, 0, -1 ), 10.0 ) ); + + if ( isdefined( nextnode.target ) ) + debug_line( nextnode.origin, getent( nextnode.target, "targetname" ).origin, ( 0.25, 0.5, 0.25 ), 5 ); + + if ( isdefined( currentnode.script_delay ) ) + debug_print3d_simple( "Wait: " + currentnode.script_delay, currentnode, vectorscale( ( 0, 0, 1 ), 10.0 ) ); + } + + if ( todest ) + { + startnode_array[startnode_array.size] = getent( path_start[j].target, "targetname" ); + + if ( isdefined( path_start[j].script_noteworthy ) && path_start[j].script_noteworthy == "primary" ) + isprimarydest = 1; + } + } /# - if ( isDefined( startnode_array ) ) - { - assert( startnode_array.size > 0, "No path(s) to destination" ); - } + assert( isdefined( startnode_array ) && startnode_array.size > 0, "No path(s) to destination" ); #/ - if ( isprimarydest ) - { - level.heli_primary_path = startnode_array; - i++; - continue; - } - else - { - level.heli_paths[ level.heli_paths.size ] = startnode_array; - } - i++; - } - i = 0; - while ( i < loop_start.size ) - { - startnode = getent( loop_start[ i ].target, "targetname" ); - level.heli_loop_paths[ level.heli_loop_paths.size ] = startnode; - i++; - } + if ( isprimarydest ) + { + level.heli_primary_path = startnode_array; + continue; + } + + level.heli_paths[level.heli_paths.size] = startnode_array; + } + + for ( i = 0; i < loop_start.size; i++ ) + { + startnode = getent( loop_start[i].target, "targetname" ); + level.heli_loop_paths[level.heli_loop_paths.size] = startnode; + } /# - assert( isDefined( level.heli_loop_paths[ 0 ] ), "No helicopter loop paths found in map" ); + assert( isdefined( level.heli_loop_paths[0] ), "No helicopter loop paths found in map" ); #/ - i = 0; - while ( i < gunner_loop_start.size ) - { - startnode = getent( gunner_loop_start[ i ].target, "targetname" ); - startnode.isgunnerpath = 1; - level.heli_loop_paths[ level.heli_loop_paths.size ] = startnode; - i++; - } - i = 0; - while ( i < leave_nodes.size ) - { - level.heli_leavenodes[ level.heli_leavenodes.size ] = leave_nodes[ i ]; - i++; - } + for ( i = 0; i < gunner_loop_start.size; i++ ) + { + startnode = getent( gunner_loop_start[i].target, "targetname" ); + startnode.isgunnerpath = 1; + level.heli_loop_paths[level.heli_loop_paths.size] = startnode; + } + + for ( i = 0; i < leave_nodes.size; i++ ) + level.heli_leavenodes[level.heli_leavenodes.size] = leave_nodes[i]; /# - assert( isDefined( level.heli_leavenodes[ 0 ] ), "No helicopter leave nodes found in map" ); + assert( isdefined( level.heli_leavenodes[0] ), "No helicopter leave nodes found in map" ); #/ - i = 0; - while ( i < crash_start.size ) - { - crash_start_node = getent( crash_start[ i ].target, "targetname" ); - level.heli_crash_paths[ level.heli_crash_paths.size ] = crash_start_node; - i++; - } + for ( i = 0; i < crash_start.size; i++ ) + { + crash_start_node = getent( crash_start[i].target, "targetname" ); + level.heli_crash_paths[level.heli_crash_paths.size] = crash_start_node; + } /# - assert( isDefined( level.heli_crash_paths[ 0 ] ), "No helicopter crash paths found in map" ); + assert( isdefined( level.heli_crash_paths[0] ), "No helicopter crash paths found in map" ); #/ } +#using_animtree("mp_vehicles"); + init() { - path_start = getentarray( "heli_start", "targetname" ); - loop_start = getentarray( "heli_loop_start", "targetname" ); - thread heli_update_global_dvars(); - level.chaff_offset[ "attack" ] = ( -130, 0, -140 ); - level.choppercomlinkfriendly = "veh_t6_air_attack_heli_mp_light"; - level.choppercomlinkenemy = "veh_t6_air_attack_heli_mp_dark"; - level.chopperregular = "veh_t6_air_attack_heli_mp_dark"; - precachehelicopter( level.chopperregular ); - precachehelicopter( level.choppercomlinkfriendly ); - precachehelicopter( level.choppercomlinkenemy ); - precachevehicle( "heli_ai_mp" ); - registerclientfield( "helicopter", "heli_comlink_bootup_anim", 1, 1, "int" ); - level.heli_paths = []; - level.heli_loop_paths = []; - level.heli_leavenodes = []; - level.heli_crash_paths = []; - level.chopper_fx[ "explode" ][ "death" ] = loadfx( "vehicle/vexplosion/fx_vexplode_helicopter_exp_mp" ); - level.chopper_fx[ "explode" ][ "guard" ] = loadfx( "vehicle/vexplosion/fx_vexplode_heli_sm_exp_mp" ); - level.chopper_fx[ "explode" ][ "gunner" ] = loadfx( "vehicle/vexplosion/fx_vexplode_vtol_mp" ); - level.chopper_fx[ "explode" ][ "large" ] = loadfx( "vehicle/vexplosion/fx_vexplode_heli_killstreak_exp_sm" ); - level.chopper_fx[ "damage" ][ "light_smoke" ] = loadfx( "trail/fx_trail_heli_killstreak_engine_smoke_33" ); - level.chopper_fx[ "damage" ][ "heavy_smoke" ] = loadfx( "trail/fx_trail_heli_killstreak_engine_smoke_66" ); - level.chopper_fx[ "smoke" ][ "trail" ] = loadfx( "trail/fx_trail_heli_killstreak_tail_smoke" ); - level.chopper_fx[ "fire" ][ "trail" ][ "large" ] = loadfx( "trail/fx_trail_heli_killstreak_engine_smoke" ); - level._effect[ "heli_comlink_light" ][ "friendly" ] = loadfx( "light/fx_vlight_mp_attack_heli_grn" ); - level._effect[ "heli_comlink_light" ][ "enemy" ] = loadfx( "light/fx_vlight_mp_attack_heli_red" ); - level.helicomlinkbootupanim = %veh_anim_future_heli_gearup_bay_open; - if ( !path_start.size && !loop_start.size ) - { - return; - } - heli_path_graph(); - precachelocationselector( "compass_objpoint_helicopter" ); - if ( maps/mp/gametypes/_tweakables::gettweakablevalue( "killstreak", "allowhelicopter_comlink" ) ) - { - maps/mp/killstreaks/_killstreaks::registerkillstreak( "helicopter_comlink_mp", "helicopter_comlink_mp", "killstreak_helicopter_comlink", "helicopter_used", ::usekillstreakhelicopter, 1 ); - maps/mp/killstreaks/_killstreaks::registerkillstreakstrings( "helicopter_comlink_mp", &"KILLSTREAK_EARNED_HELICOPTER_COMLINK", &"KILLSTREAK_HELICOPTER_COMLINK_NOT_AVAILABLE", &"KILLSTREAK_HELICOPTER_COMLINK_INBOUND" ); - maps/mp/killstreaks/_killstreaks::registerkillstreakdialog( "helicopter_comlink_mp", "mpl_killstreak_heli", "kls_cobra_used", "", "kls_cobra_enemy", "", "kls_cobra_ready" ); - maps/mp/killstreaks/_killstreaks::registerkillstreakdevdvar( "helicopter_comlink_mp", "scr_givehelicopter_comlink" ); - maps/mp/killstreaks/_killstreaks::registerkillstreakaltweapon( "helicopter_comlink_mp", "cobra_20mm_comlink_mp" ); - maps/mp/killstreaks/_killstreaks::setkillstreakteamkillpenaltyscale( "helicopter_comlink_mp", 0 ); - } + path_start = getentarray( "heli_start", "targetname" ); + loop_start = getentarray( "heli_loop_start", "targetname" ); + thread heli_update_global_dvars(); + level.chaff_offset["attack"] = ( -130, 0, -140 ); + level.choppercomlinkfriendly = "veh_t6_air_attack_heli_mp_light"; + level.choppercomlinkenemy = "veh_t6_air_attack_heli_mp_dark"; + level.chopperregular = "veh_t6_air_attack_heli_mp_dark"; + precachehelicopter( level.chopperregular ); + precachehelicopter( level.choppercomlinkfriendly ); + precachehelicopter( level.choppercomlinkenemy ); + precachevehicle( "heli_ai_mp" ); + registerclientfield( "helicopter", "heli_comlink_bootup_anim", 1, 1, "int" ); + level.heli_paths = []; + level.heli_loop_paths = []; + level.heli_leavenodes = []; + level.heli_crash_paths = []; + level.chopper_fx["explode"]["death"] = loadfx( "vehicle/vexplosion/fx_vexplode_helicopter_exp_mp" ); + level.chopper_fx["explode"]["guard"] = loadfx( "vehicle/vexplosion/fx_vexplode_heli_sm_exp_mp" ); + level.chopper_fx["explode"]["gunner"] = loadfx( "vehicle/vexplosion/fx_vexplode_vtol_mp" ); + level.chopper_fx["explode"]["large"] = loadfx( "vehicle/vexplosion/fx_vexplode_heli_killstreak_exp_sm" ); + level.chopper_fx["damage"]["light_smoke"] = loadfx( "trail/fx_trail_heli_killstreak_engine_smoke_33" ); + level.chopper_fx["damage"]["heavy_smoke"] = loadfx( "trail/fx_trail_heli_killstreak_engine_smoke_66" ); + level.chopper_fx["smoke"]["trail"] = loadfx( "trail/fx_trail_heli_killstreak_tail_smoke" ); + level.chopper_fx["fire"]["trail"]["large"] = loadfx( "trail/fx_trail_heli_killstreak_engine_smoke" ); + level._effect["heli_comlink_light"]["friendly"] = loadfx( "light/fx_vlight_mp_attack_heli_grn" ); + level._effect["heli_comlink_light"]["enemy"] = loadfx( "light/fx_vlight_mp_attack_heli_red" ); + level.helicomlinkbootupanim = %veh_anim_future_heli_gearup_bay_open; + + if ( !path_start.size && !loop_start.size ) + return; + + heli_path_graph(); + precachelocationselector( "compass_objpoint_helicopter" ); + + if ( maps\mp\gametypes\_tweakables::gettweakablevalue( "killstreak", "allowhelicopter_comlink" ) ) + { + maps\mp\killstreaks\_killstreaks::registerkillstreak( "helicopter_comlink_mp", "helicopter_comlink_mp", "killstreak_helicopter_comlink", "helicopter_used", ::usekillstreakhelicopter, 1 ); + maps\mp\killstreaks\_killstreaks::registerkillstreakstrings( "helicopter_comlink_mp", &"KILLSTREAK_EARNED_HELICOPTER_COMLINK", &"KILLSTREAK_HELICOPTER_COMLINK_NOT_AVAILABLE", &"KILLSTREAK_HELICOPTER_COMLINK_INBOUND" ); + maps\mp\killstreaks\_killstreaks::registerkillstreakdialog( "helicopter_comlink_mp", "mpl_killstreak_heli", "kls_cobra_used", "", "kls_cobra_enemy", "", "kls_cobra_ready" ); + maps\mp\killstreaks\_killstreaks::registerkillstreakdevdvar( "helicopter_comlink_mp", "scr_givehelicopter_comlink" ); + maps\mp\killstreaks\_killstreaks::registerkillstreakaltweapon( "helicopter_comlink_mp", "cobra_20mm_comlink_mp" ); + maps\mp\killstreaks\_killstreaks::setkillstreakteamkillpenaltyscale( "helicopter_comlink_mp", 0.0 ); + } } heli_update_global_dvars() { - for ( ;; ) - { - level.heli_loopmax = heli_get_dvar_int( "scr_heli_loopmax", "2" ); - level.heli_missile_rof = heli_get_dvar_int( "scr_heli_missile_rof", "2" ); - level.heli_armor = heli_get_dvar_int( "scr_heli_armor", "500" ); - level.heli_maxhealth = heli_get_dvar_int( "scr_heli_maxhealth", "1000" ); - level.heli_amored_maxhealth = heli_get_dvar_int( "scr_heli_armored_maxhealth", "1500" ); - level.heli_missile_max = heli_get_dvar_int( "scr_heli_missile_max", "20" ); - level.heli_dest_wait = heli_get_dvar_int( "scr_heli_dest_wait", "8" ); - level.heli_debug = heli_get_dvar_int( "scr_heli_debug", "0" ); - level.heli_debug_crash = heli_get_dvar_int( "scr_heli_debug_crash", "0" ); - level.heli_targeting_delay = heli_get_dvar( "scr_heli_targeting_delay", "0.6" ); - level.heli_turretreloadtime = heli_get_dvar( "scr_heli_turretReloadTime", "1.5" ); - level.heli_turretclipsize = heli_get_dvar_int( "scr_heli_turretClipSize", "20" ); - level.heli_visual_range = heli_get_dvar_int( "scr_heli_visual_range", "3500" ); - level.heli_missile_range = heli_get_dvar_int( "scr_heli_missile_range", "100000" ); - level.heli_health_degrade = heli_get_dvar_int( "scr_heli_health_degrade", "0" ); - level.heli_turret_angle_tan = heli_get_dvar_int( "scr_heli_turret_angle_tan", "1" ); - level.heli_turret_target_cone = heli_get_dvar( "scr_heli_turret_target_cone", "0.6" ); - level.heli_target_spawnprotection = heli_get_dvar_int( "scr_heli_target_spawnprotection", "5" ); - level.heli_missile_regen_time = heli_get_dvar( "scr_heli_missile_regen_time", "10" ); - level.heli_turret_spinup_delay = heli_get_dvar( "scr_heli_turret_spinup_delay", "0.7" ); - level.heli_target_recognition = heli_get_dvar( "scr_heli_target_recognition", "0.5" ); - level.heli_missile_friendlycare = heli_get_dvar_int( "scr_heli_missile_friendlycare", "512" ); - level.heli_missile_target_cone = heli_get_dvar( "scr_heli_missile_target_cone", "0.6" ); - level.heli_valid_target_cone = heli_get_dvar( "scr_heli_missile_valid_target_cone", "0.7" ); - level.heli_armor_bulletdamage = heli_get_dvar( "scr_heli_armor_bulletdamage", "0.5" ); - level.heli_attract_strength = heli_get_dvar( "scr_heli_attract_strength", "1000" ); - level.heli_attract_range = heli_get_dvar( "scr_heli_attract_range", "20000" ); - level.helicopterturretmaxangle = heli_get_dvar_int( "scr_helicopterTurretMaxAngle", "35" ); - level.heli_protect_time = heli_get_dvar( "scr_heli_protect_time", "60" ); - level.heli_protect_pos_time = heli_get_dvar( "scr_heli_protect_pos_time", "12" ); - level.heli_protect_radius = heli_get_dvar_int( "scr_heli_protect_radius", "2000" ); - level.heli_missile_reload_time = heli_get_dvar( "scr_heli_missile_reload_time", "5.0" ); - level.heli_warning_distance = heli_get_dvar_int( "scr_heli_warning_distance", "500" ); - wait 1; - } + for (;;) + { + level.heli_loopmax = heli_get_dvar_int( "scr_heli_loopmax", "2" ); + level.heli_missile_rof = heli_get_dvar_int( "scr_heli_missile_rof", "2" ); + level.heli_armor = heli_get_dvar_int( "scr_heli_armor", "500" ); + level.heli_maxhealth = heli_get_dvar_int( "scr_heli_maxhealth", "1000" ); + level.heli_amored_maxhealth = heli_get_dvar_int( "scr_heli_armored_maxhealth", "1500" ); + level.heli_missile_max = heli_get_dvar_int( "scr_heli_missile_max", "20" ); + level.heli_dest_wait = heli_get_dvar_int( "scr_heli_dest_wait", "8" ); + level.heli_debug = heli_get_dvar_int( "scr_heli_debug", "0" ); + level.heli_debug_crash = heli_get_dvar_int( "scr_heli_debug_crash", "0" ); + level.heli_targeting_delay = heli_get_dvar( "scr_heli_targeting_delay", "0.6" ); + level.heli_turretreloadtime = heli_get_dvar( "scr_heli_turretReloadTime", "1.5" ); + level.heli_turretclipsize = heli_get_dvar_int( "scr_heli_turretClipSize", "20" ); + level.heli_visual_range = heli_get_dvar_int( "scr_heli_visual_range", "3500" ); + level.heli_missile_range = heli_get_dvar_int( "scr_heli_missile_range", "100000" ); + level.heli_health_degrade = heli_get_dvar_int( "scr_heli_health_degrade", "0" ); + level.heli_turret_angle_tan = heli_get_dvar_int( "scr_heli_turret_angle_tan", "1" ); + level.heli_turret_target_cone = heli_get_dvar( "scr_heli_turret_target_cone", "0.6" ); + level.heli_target_spawnprotection = heli_get_dvar_int( "scr_heli_target_spawnprotection", "5" ); + level.heli_missile_regen_time = heli_get_dvar( "scr_heli_missile_regen_time", "10" ); + level.heli_turret_spinup_delay = heli_get_dvar( "scr_heli_turret_spinup_delay", "0.7" ); + level.heli_target_recognition = heli_get_dvar( "scr_heli_target_recognition", "0.5" ); + level.heli_missile_friendlycare = heli_get_dvar_int( "scr_heli_missile_friendlycare", "512" ); + level.heli_missile_target_cone = heli_get_dvar( "scr_heli_missile_target_cone", "0.6" ); + level.heli_valid_target_cone = heli_get_dvar( "scr_heli_missile_valid_target_cone", "0.7" ); + level.heli_armor_bulletdamage = heli_get_dvar( "scr_heli_armor_bulletdamage", "0.5" ); + level.heli_attract_strength = heli_get_dvar( "scr_heli_attract_strength", "1000" ); + level.heli_attract_range = heli_get_dvar( "scr_heli_attract_range", "20000" ); + level.helicopterturretmaxangle = heli_get_dvar_int( "scr_helicopterTurretMaxAngle", "35" ); + level.heli_protect_time = heli_get_dvar( "scr_heli_protect_time", "60" ); + level.heli_protect_pos_time = heli_get_dvar( "scr_heli_protect_pos_time", "12" ); + level.heli_protect_radius = heli_get_dvar_int( "scr_heli_protect_radius", "2000" ); + level.heli_missile_reload_time = heli_get_dvar( "scr_heli_missile_reload_time", "5.0" ); + level.heli_warning_distance = heli_get_dvar_int( "scr_heli_warning_distance", "500" ); + wait 1; + } } heli_get_dvar_int( dvar, def ) { - return int( heli_get_dvar( dvar, def ) ); + return int( heli_get_dvar( dvar, def ) ); } heli_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; + } } spawn_helicopter( owner, origin, angles, model, targetname, target_offset, hardpointtype, killstreak_id ) { - chopper = spawnhelicopter( owner, origin, angles, model, targetname ); - chopper.attackers = []; - chopper.attackerdata = []; - chopper.attackerdamage = []; - chopper.flareattackerdamage = []; - chopper.destroyfunc = ::destroyhelicopter; - chopper.hardpointtype = hardpointtype; - chopper.killstreak_id = killstreak_id; - chopper.pilotistalking = 0; - chopper setdrawinfrared( 1 ); - if ( !isDefined( target_offset ) ) - { - target_offset = ( 1, 1, 1 ); - } - target_set( chopper, target_offset ); - chopper.pilotvoicenumber = self.bcvoicenumber - 1; - if ( chopper.pilotvoicenumber < 0 ) - { - chopper.pilotvoicenumber = 3; - } - owner.pilottalking = 0; - if ( hardpointtype == "helicopter_player_gunner_mp" ) - { - chopper thread playpilotdialog( "a10_used", 2,5 ); - } - else - { - chopper thread playpilotdialog( "attackheli_approach", 2,5 ); - } - chopper.soundmod = "heli"; - return chopper; + chopper = spawnhelicopter( owner, origin, angles, model, targetname ); + chopper.attackers = []; + chopper.attackerdata = []; + chopper.attackerdamage = []; + chopper.flareattackerdamage = []; + chopper.destroyfunc = ::destroyhelicopter; + chopper.hardpointtype = hardpointtype; + chopper.killstreak_id = killstreak_id; + chopper.pilotistalking = 0; + chopper setdrawinfrared( 1 ); + + if ( !isdefined( target_offset ) ) + target_offset = ( 0, 0, 0 ); + + target_set( chopper, target_offset ); + chopper.pilotvoicenumber = self.bcvoicenumber - 1; + + if ( chopper.pilotvoicenumber < 0 ) + chopper.pilotvoicenumber = 3; + + owner.pilottalking = 0; + + if ( hardpointtype == "helicopter_player_gunner_mp" ) + chopper thread playpilotdialog( "a10_used", 2.5 ); + else + chopper thread playpilotdialog( "attackheli_approach", 2.5 ); + + chopper.soundmod = "heli"; + return chopper; } explodeoncontact( hardpointtype ) { - self endon( "death" ); - wait 10; - for ( ;; ) - { - self waittill( "touch" ); - self thread heli_explode(); - } + self endon( "death" ); + wait 10; + + for (;;) + { + self waittill( "touch" ); + + self thread heli_explode(); + } } getvalidprotectlocationstart( random_path, protectlocation, destination ) { - startnode = level.heli_paths[ destination ][ random_path ]; - path_index = ( random_path + 1 ) % level.heli_paths[ destination ].size; - innofly = crossesnoflyzone( protectlocation + ( 1, 1, 1 ), protectlocation ); - if ( isDefined( innofly ) ) - { - protectlocation = ( protectlocation[ 0 ], protectlocation[ 1 ], level.noflyzones[ innofly ].origin[ 2 ] + level.noflyzones[ innofly ].height ); - } - noflyzone = crossesnoflyzone( startnode.origin, protectlocation ); - while ( isDefined( noflyzone ) && path_index != random_path ) - { - startnode = level.heli_paths[ destination ][ path_index ]; - noflyzone = crossesnoflyzone( startnode.origin, protectlocation ); - if ( isDefined( noflyzone ) ) - { - path_index = ( path_index + 1 ) % level.heli_paths[ destination ].size; - } - } - return level.heli_paths[ destination ][ path_index ]; + startnode = level.heli_paths[destination][random_path]; + path_index = ( random_path + 1 ) % level.heli_paths[destination].size; + innofly = crossesnoflyzone( protectlocation + ( 0, 0, 1 ), protectlocation ); + + if ( isdefined( innofly ) ) + protectlocation = ( protectlocation[0], protectlocation[1], level.noflyzones[innofly].origin[2] + level.noflyzones[innofly].height ); + + noflyzone = crossesnoflyzone( startnode.origin, protectlocation ); + + while ( isdefined( noflyzone ) && path_index != random_path ) + { + startnode = level.heli_paths[destination][path_index]; + noflyzone = crossesnoflyzone( startnode.origin, protectlocation ); + + if ( isdefined( noflyzone ) ) + path_index = ( path_index + 1 ) % level.heli_paths[destination].size; + } + + return level.heli_paths[destination][path_index]; } getvalidrandomleavenode( start ) { - random_leave_node = randomint( level.heli_leavenodes.size ); - leavenode = level.heli_leavenodes[ random_leave_node ]; - path_index = ( random_leave_node + 1 ) % level.heli_leavenodes.size; - noflyzone = crossesnoflyzone( leavenode.origin, start ); - while ( isDefined( noflyzone ) && path_index != random_leave_node ) - { - leavenode = level.heli_leavenodes[ path_index ]; - noflyzone = crossesnoflyzone( leavenode.origin, start ); - path_index = ( path_index + 1 ) % level.heli_leavenodes.size; - } - return level.heli_leavenodes[ path_index ]; + random_leave_node = randomint( level.heli_leavenodes.size ); + leavenode = level.heli_leavenodes[random_leave_node]; + path_index = ( random_leave_node + 1 ) % level.heli_leavenodes.size; + noflyzone = crossesnoflyzone( leavenode.origin, start ); + + while ( isdefined( noflyzone ) && path_index != random_leave_node ) + { + leavenode = level.heli_leavenodes[path_index]; + noflyzone = crossesnoflyzone( leavenode.origin, start ); + path_index = ( path_index + 1 ) % level.heli_leavenodes.size; + } + + return level.heli_leavenodes[path_index]; } getvalidrandomcrashnode( start ) { - random_leave_node = randomint( level.heli_crash_paths.size ); - leavenode = level.heli_crash_paths[ random_leave_node ]; - path_index = ( random_leave_node + 1 ) % level.heli_crash_paths.size; - noflyzone = crossesnoflyzone( leavenode.origin, start ); - while ( isDefined( noflyzone ) && path_index != random_leave_node ) - { - leavenode = level.heli_crash_paths[ path_index ]; - noflyzone = crossesnoflyzone( leavenode.origin, start ); - path_index = ( path_index + 1 ) % level.heli_crash_paths.size; - } - return level.heli_crash_paths[ path_index ]; + random_leave_node = randomint( level.heli_crash_paths.size ); + leavenode = level.heli_crash_paths[random_leave_node]; + path_index = ( random_leave_node + 1 ) % level.heli_crash_paths.size; + noflyzone = crossesnoflyzone( leavenode.origin, start ); + + while ( isdefined( noflyzone ) && path_index != random_leave_node ) + { + leavenode = level.heli_crash_paths[path_index]; + noflyzone = crossesnoflyzone( leavenode.origin, start ); + path_index = ( path_index + 1 ) % level.heli_crash_paths.size; + } + + return level.heli_crash_paths[path_index]; } heli_think( owner, startnode, heli_team, missilesenabled, protectlocation, hardpointtype, armored, killstreak_id ) { - heliorigin = startnode.origin; - heliangles = startnode.angles; - if ( hardpointtype == "helicopter_comlink_mp" ) - { - choppermodelfriendly = level.choppercomlinkfriendly; - choppermodelenemy = level.choppercomlinkenemy; - } - else - { - choppermodelfriendly = level.chopperregular; - choppermodelenemy = level.chopperregular; - } - chopper = spawn_helicopter( owner, heliorigin, heliangles, "heli_ai_mp", choppermodelfriendly, vectorScale( ( 1, 1, 1 ), 100 ), hardpointtype, killstreak_id ); - chopper setenemymodel( choppermodelenemy ); - chopper thread watchforearlyleave( hardpointtype ); - target_setturretaquire( chopper, 0 ); - chopper thread samturretwatcher(); - if ( hardpointtype == "helicopter_comlink_mp" ) - { - chopper.defaultweapon = "cobra_20mm_comlink_mp"; - } - else - { - chopper.defaultweapon = "cobra_20mm_mp"; - } - chopper.requireddeathcount = owner.deathcount; - chopper.chaff_offset = level.chaff_offset[ "attack" ]; - minigun_snd_ent = spawn( "script_origin", chopper gettagorigin( "tag_flash" ) ); - minigun_snd_ent linkto( chopper, "tag_flash", ( 1, 1, 1 ), ( 1, 1, 1 ) ); - chopper.minigun_snd_ent = minigun_snd_ent; - minigun_snd_ent thread autostopsound(); - chopper.team = heli_team; - chopper setteam( heli_team ); - chopper.owner = owner; - chopper setowner( owner ); - chopper thread heli_existance(); - level.chopper = chopper; - chopper.reached_dest = 0; - if ( armored ) - { - chopper.maxhealth = level.heli_amored_maxhealth; - } - else - { - chopper.maxhealth = level.heli_maxhealth; - } - chopper.rocketdamageoneshot = level.heli_maxhealth + 1; - chopper.rocketdamagetwoshot = ( level.heli_maxhealth / 2 ) + 1; - if ( hardpointtype == "helicopter_comlink_mp" || hardpointtype == "helicopter_guard_mp" ) - { - chopper.numflares = 1; - } - else - { - chopper.numflares = 2; - } - chopper.flareoffset = vectorScale( ( 1, 1, 1 ), 256 ); - chopper.waittime = level.heli_dest_wait; - chopper.loopcount = 0; - chopper.evasive = 0; - chopper.health_bulletdamageble = level.heli_armor; - chopper.health_evasive = level.heli_armor; - chopper.health_low = chopper.maxhealth * 0,8; - chopper.targeting_delay = level.heli_targeting_delay; - chopper.primarytarget = undefined; - chopper.secondarytarget = undefined; - chopper.attacker = undefined; - chopper.missile_ammo = level.heli_missile_max; - chopper.currentstate = "ok"; - chopper.lastrocketfiretime = -1; - if ( isDefined( protectlocation ) ) - { - chopper thread heli_protect( startnode, protectlocation, hardpointtype, heli_team ); - chopper setclientfield( "heli_comlink_bootup_anim", 1 ); - } - else - { - chopper thread heli_fly( startnode, 2, hardpointtype ); - } - chopper thread heli_damage_monitor( hardpointtype ); - chopper thread heli_kill_monitor( hardpointtype ); - chopper thread heli_health( hardpointtype, owner ); - chopper thread attack_targets( missilesenabled, hardpointtype ); - chopper thread heli_targeting( missilesenabled, hardpointtype ); - chopper thread heli_missile_regen(); - chopper thread maps/mp/_heatseekingmissile::missiletarget_proximitydetonateincomingmissile( "crashing", "death" ); - chopper thread create_flare_ent( vectorScale( ( 1, 1, 1 ), 100 ) ); - chopper maps/mp/gametypes/_spawning::create_helicopter_influencers( heli_team ); + heliorigin = startnode.origin; + heliangles = startnode.angles; + + if ( hardpointtype == "helicopter_comlink_mp" ) + { + choppermodelfriendly = level.choppercomlinkfriendly; + choppermodelenemy = level.choppercomlinkenemy; + } + else + { + choppermodelfriendly = level.chopperregular; + choppermodelenemy = level.chopperregular; + } + + chopper = spawn_helicopter( owner, heliorigin, heliangles, "heli_ai_mp", choppermodelfriendly, vectorscale( ( 0, 0, -1 ), 100.0 ), hardpointtype, killstreak_id ); + chopper setenemymodel( choppermodelenemy ); + chopper thread watchforearlyleave( hardpointtype ); + target_setturretaquire( chopper, 0 ); + chopper thread samturretwatcher(); + + if ( hardpointtype == "helicopter_comlink_mp" ) + chopper.defaultweapon = "cobra_20mm_comlink_mp"; + else + chopper.defaultweapon = "cobra_20mm_mp"; + + chopper.requireddeathcount = owner.deathcount; + chopper.chaff_offset = level.chaff_offset["attack"]; + minigun_snd_ent = spawn( "script_origin", chopper gettagorigin( "tag_flash" ) ); + minigun_snd_ent linkto( chopper, "tag_flash", ( 0, 0, 0 ), ( 0, 0, 0 ) ); + chopper.minigun_snd_ent = minigun_snd_ent; + minigun_snd_ent thread autostopsound(); + chopper.team = heli_team; + chopper setteam( heli_team ); + chopper.owner = owner; + chopper setowner( owner ); + chopper thread heli_existance(); + level.chopper = chopper; + chopper.reached_dest = 0; + + if ( armored ) + chopper.maxhealth = level.heli_amored_maxhealth; + else + chopper.maxhealth = level.heli_maxhealth; + + chopper.rocketdamageoneshot = level.heli_maxhealth + 1; + chopper.rocketdamagetwoshot = level.heli_maxhealth / 2 + 1; + + if ( hardpointtype == "helicopter_comlink_mp" || hardpointtype == "helicopter_guard_mp" ) + chopper.numflares = 1; + else + chopper.numflares = 2; + + chopper.flareoffset = vectorscale( ( 0, 0, -1 ), 256.0 ); + chopper.waittime = level.heli_dest_wait; + chopper.loopcount = 0; + chopper.evasive = 0; + chopper.health_bulletdamageble = level.heli_armor; + chopper.health_evasive = level.heli_armor; + chopper.health_low = chopper.maxhealth * 0.8; + chopper.targeting_delay = level.heli_targeting_delay; + chopper.primarytarget = undefined; + chopper.secondarytarget = undefined; + chopper.attacker = undefined; + chopper.missile_ammo = level.heli_missile_max; + chopper.currentstate = "ok"; + chopper.lastrocketfiretime = -1; + + if ( isdefined( protectlocation ) ) + { + chopper thread heli_protect( startnode, protectlocation, hardpointtype, heli_team ); + chopper setclientfield( "heli_comlink_bootup_anim", 1 ); + } + else + chopper thread heli_fly( startnode, 2.0, hardpointtype ); + + chopper thread heli_damage_monitor( hardpointtype ); + chopper thread heli_kill_monitor( hardpointtype ); + chopper thread heli_health( hardpointtype, owner ); + chopper thread attack_targets( missilesenabled, hardpointtype ); + chopper thread heli_targeting( missilesenabled, hardpointtype ); + chopper thread heli_missile_regen(); + chopper thread maps\mp\_heatseekingmissile::missiletarget_proximitydetonateincomingmissile( "crashing", "death" ); + chopper thread create_flare_ent( vectorscale( ( 0, 0, -1 ), 100.0 ) ); + chopper maps\mp\gametypes\_spawning::create_helicopter_influencers( heli_team ); } autostopsound() { - self endon( "death" ); - level waittill( "game_ended" ); - self stoploopsound(); + self endon( "death" ); + + level waittill( "game_ended" ); + + self stoploopsound(); } heli_existance() { - self waittill( "leaving" ); - self maps/mp/gametypes/_spawning::remove_helicopter_influencers(); + self waittill( "leaving" ); + + self maps\mp\gametypes\_spawning::remove_helicopter_influencers(); } create_flare_ent( offset ) { - self.flare_ent = spawn( "script_model", self gettagorigin( "tag_origin" ) ); - self.flare_ent setmodel( "tag_origin" ); - self.flare_ent linkto( self, "tag_origin", offset ); + self.flare_ent = spawn( "script_model", self gettagorigin( "tag_origin" ) ); + self.flare_ent setmodel( "tag_origin" ); + self.flare_ent linkto( self, "tag_origin", offset ); } heli_missile_regen() { - self endon( "death" ); - self endon( "crashing" ); - self endon( "leaving" ); - for ( ;; ) - { - debug_print3d( "Missile Ammo: " + self.missile_ammo, ( 0,5, 0,5, 1 ), self, vectorScale( ( 1, 1, 1 ), 100 ), 0 ); - if ( self.missile_ammo >= level.heli_missile_max ) - { - self waittill( "missile fired" ); - } - else if ( self.currentstate == "heavy smoke" ) - { - wait ( level.heli_missile_regen_time / 4 ); - } - else if ( self.currentstate == "light smoke" ) - { - wait ( level.heli_missile_regen_time / 2 ); - } - else - { - wait level.heli_missile_regen_time; - } - if ( self.missile_ammo < level.heli_missile_max ) - { - self.missile_ammo++; - } - } + self endon( "death" ); + self endon( "crashing" ); + self endon( "leaving" ); + + for (;;) + { + debug_print3d( "Missile Ammo: " + self.missile_ammo, ( 0.5, 0.5, 1 ), self, vectorscale( ( 0, 0, -1 ), 100.0 ), 0 ); + + if ( self.missile_ammo >= level.heli_missile_max ) + self waittill( "missile fired" ); + else if ( self.currentstate == "heavy smoke" ) + wait( level.heli_missile_regen_time / 4 ); + else if ( self.currentstate == "light smoke" ) + wait( level.heli_missile_regen_time / 2 ); + else + wait( level.heli_missile_regen_time ); + + if ( self.missile_ammo < level.heli_missile_max ) + self.missile_ammo++; + } } heli_targeting( missilesenabled, hardpointtype ) { - self endon( "death" ); - self endon( "crashing" ); - self endon( "leaving" ); - for ( ;; ) - { - targets = []; - targetsmissile = []; - players = level.players; - i = 0; - while ( i < players.size ) - { - player = players[ i ]; - if ( self cantargetplayer_turret( player, hardpointtype ) ) - { - if ( isDefined( player ) ) - { - targets[ targets.size ] = player; - } - } - if ( missilesenabled && self cantargetplayer_missile( player, hardpointtype ) ) - { - if ( isDefined( player ) ) - { - targetsmissile[ targetsmissile.size ] = player; - } - i++; - continue; - } - else - { - } - i++; - } - dogs = maps/mp/killstreaks/_dogs::dog_manager_get_dogs(); - _a656 = dogs; - _k656 = getFirstArrayKey( _a656 ); - while ( isDefined( _k656 ) ) - { - dog = _a656[ _k656 ]; - if ( self cantargetdog_turret( dog ) ) - { - targets[ targets.size ] = dog; - } - if ( missilesenabled && self cantargetdog_missile( dog ) ) - { - targetsmissile[ targetsmissile.size ] = dog; - } - _k656 = getNextArrayKey( _a656, _k656 ); - } - tanks = getentarray( "talon", "targetname" ); - _a670 = tanks; - _k670 = getFirstArrayKey( _a670 ); - while ( isDefined( _k670 ) ) - { - tank = _a670[ _k670 ]; - if ( self cantargettank_turret( tank ) ) - { - targets[ targets.size ] = tank; - } - _k670 = getNextArrayKey( _a670, _k670 ); - } - if ( targets.size == 0 && targetsmissile.size == 0 ) - { - self.primarytarget = undefined; - self.secondarytarget = undefined; - debug_print_target(); - self setgoalyaw( randomint( 360 ) ); - wait self.targeting_delay; - continue; - } - else if ( targets.size == 1 ) - { - if ( isDefined( targets[ 0 ].type ) || targets[ 0 ].type == "dog" && targets[ 0 ].type == "tank_drone" ) - { - update_dog_threat( targets[ 0 ] ); - } - else - { - update_player_threat( targets[ 0 ] ); - } - self.primarytarget = targets[ 0 ]; - self notify( "primary acquired" ); - self.secondarytarget = undefined; - debug_print_target(); - } - else - { - if ( targets.size > 1 ) - { - assignprimarytargets( targets ); - } - } - if ( targetsmissile.size == 1 ) - { - if ( isDefined( targetsmissile[ 0 ].type ) || targetsmissile[ 0 ].type != "dog" && targets[ 0 ].type == "tank_drone" ) - { - self update_missile_player_threat( targetsmissile[ 0 ] ); - } - else - { - if ( targetsmissile[ 0 ].type == "dog" ) - { - self update_missile_dog_threat( targetsmissile[ 0 ] ); - } - } - self.secondarytarget = targetsmissile[ 0 ]; - self notify( "secondary acquired" ); - debug_print_target(); - } - else - { - if ( targetsmissile.size > 1 ) - { - assignsecondarytargets( targetsmissile ); - } - } - wait self.targeting_delay; - debug_print_target(); - } + self endon( "death" ); + self endon( "crashing" ); + self endon( "leaving" ); + + for (;;) + { + targets = []; + targetsmissile = []; + players = level.players; + + for ( i = 0; i < players.size; i++ ) + { + player = players[i]; + + if ( self cantargetplayer_turret( player, hardpointtype ) ) + { + if ( isdefined( player ) ) + targets[targets.size] = player; + } + + if ( missilesenabled && self cantargetplayer_missile( player, hardpointtype ) ) + { + if ( isdefined( player ) ) + targetsmissile[targetsmissile.size] = player; + + continue; + } + + continue; + } + + dogs = maps\mp\killstreaks\_dogs::dog_manager_get_dogs(); + + foreach ( dog in dogs ) + { + if ( self cantargetdog_turret( dog ) ) + targets[targets.size] = dog; + + if ( missilesenabled && self cantargetdog_missile( dog ) ) + targetsmissile[targetsmissile.size] = dog; + } + + tanks = getentarray( "talon", "targetname" ); + + foreach ( tank in tanks ) + { + if ( self cantargettank_turret( tank ) ) + targets[targets.size] = tank; + } + + if ( targets.size == 0 && targetsmissile.size == 0 ) + { + self.primarytarget = undefined; + self.secondarytarget = undefined; + debug_print_target(); + self setgoalyaw( randomint( 360 ) ); + wait( self.targeting_delay ); + continue; + } + + if ( targets.size == 1 ) + { + if ( isdefined( targets[0].type ) && ( targets[0].type == "dog" || targets[0].type == "tank_drone" ) ) + update_dog_threat( targets[0] ); + else + update_player_threat( targets[0] ); + + self.primarytarget = targets[0]; + self notify( "primary acquired" ); + self.secondarytarget = undefined; + debug_print_target(); + } + else if ( targets.size > 1 ) + assignprimarytargets( targets ); + + if ( targetsmissile.size == 1 ) + { + if ( !isdefined( targetsmissile[0].type ) || targetsmissile[0].type != "dog" || targets[0].type == "tank_drone" ) + self update_missile_player_threat( targetsmissile[0] ); + else if ( targetsmissile[0].type == "dog" ) + self update_missile_dog_threat( targetsmissile[0] ); + + self.secondarytarget = targetsmissile[0]; + self notify( "secondary acquired" ); + debug_print_target(); + } + else if ( targetsmissile.size > 1 ) + assignsecondarytargets( targetsmissile ); + + wait( self.targeting_delay ); + debug_print_target(); + } } cantargetplayer_turret( player, hardpointtype ) { - cantarget = 1; - if ( !isalive( player ) || player.sessionstate != "playing" ) - { - return 0; - } - if ( player == self.owner ) - { - self check_owner( hardpointtype ); - return 0; - } - if ( player cantargetplayerwithspecialty() == 0 ) - { - return 0; - } - if ( distance( player.origin, self.origin ) > level.heli_visual_range ) - { - return 0; - } - if ( !isDefined( player.team ) ) - { - return 0; - } - if ( level.teambased && player.team == self.team ) - { - return 0; - } - if ( player.team == "spectator" ) - { - return 0; - } - if ( isDefined( player.spawntime ) && ( ( getTime() - player.spawntime ) / 1000 ) <= level.heli_target_spawnprotection ) - { - return 0; - } - heli_centroid = self.origin + vectorScale( ( 1, 1, 1 ), 160 ); - heli_forward_norm = anglesToForward( self.angles ); - heli_turret_point = heli_centroid + ( 144 * heli_forward_norm ); - visible_amount = player sightconetrace( heli_turret_point, self ); - if ( visible_amount < level.heli_target_recognition ) - { - return 0; - } - return cantarget; + cantarget = 1; + + if ( !isalive( player ) || player.sessionstate != "playing" ) + return 0; + + if ( player == self.owner ) + { + self check_owner( hardpointtype ); + return 0; + } + + if ( player cantargetplayerwithspecialty() == 0 ) + return 0; + + if ( distance( player.origin, self.origin ) > level.heli_visual_range ) + return 0; + + if ( !isdefined( player.team ) ) + return 0; + + if ( level.teambased && player.team == self.team ) + return 0; + + if ( player.team == "spectator" ) + return 0; + + if ( isdefined( player.spawntime ) && ( gettime() - player.spawntime ) / 1000 <= level.heli_target_spawnprotection ) + return 0; + + heli_centroid = self.origin + vectorscale( ( 0, 0, -1 ), 160.0 ); + heli_forward_norm = anglestoforward( self.angles ); + heli_turret_point = heli_centroid + 144 * heli_forward_norm; + visible_amount = player sightconetrace( heli_turret_point, self ); + + if ( visible_amount < level.heli_target_recognition ) + return 0; + + return cantarget; } getverticaltan( startorigin, endorigin ) { - vector = endorigin - startorigin; - opposite = startorigin[ 2 ] - endorigin[ 2 ]; - if ( opposite < 0 ) - { - opposite *= 1; - } - adjacent = distance2d( startorigin, endorigin ); - if ( adjacent < 0 ) - { - adjacent *= 1; - } - if ( adjacent < 0,01 ) - { - adjacent = 0,01; - } - tangent = opposite / adjacent; - return tangent; + vector = endorigin - startorigin; + opposite = startorigin[2] - endorigin[2]; + + if ( opposite < 0 ) + opposite *= 1; + + adjacent = distance2d( startorigin, endorigin ); + + if ( adjacent < 0 ) + adjacent *= 1; + + if ( adjacent < 0.01 ) + adjacent = 0.01; + + tangent = opposite / adjacent; + return tangent; } cantargetplayer_missile( player, hardpointtype ) { - cantarget = 1; - if ( !isalive( player ) || player.sessionstate != "playing" ) - { - return 0; - } - if ( player == self.owner ) - { - self check_owner( hardpointtype ); - return 0; - } - if ( player cantargetplayerwithspecialty() == 0 ) - { - return 0; - } - if ( distance( player.origin, self.origin ) > level.heli_missile_range ) - { - return 0; - } - if ( !isDefined( player.team ) ) - { - return 0; - } - if ( level.teambased && player.team == self.team ) - { - return 0; - } - if ( player.team == "spectator" ) - { - return 0; - } - if ( isDefined( player.spawntime ) && ( ( getTime() - player.spawntime ) / 1000 ) <= level.heli_target_spawnprotection ) - { - return 0; - } - if ( self target_cone_check( player, level.heli_missile_target_cone ) == 0 ) - { - return 0; - } - heli_centroid = self.origin + vectorScale( ( 1, 1, 1 ), 160 ); - heli_forward_norm = anglesToForward( self.angles ); - heli_turret_point = heli_centroid + ( 144 * heli_forward_norm ); - if ( !isDefined( player.lasthit ) ) - { - player.lasthit = 0; - } - player.lasthit = self heliturretsighttrace( heli_turret_point, player, player.lasthit ); - if ( player.lasthit != 0 ) - { - return 0; - } - return cantarget; + cantarget = 1; + + if ( !isalive( player ) || player.sessionstate != "playing" ) + return 0; + + if ( player == self.owner ) + { + self check_owner( hardpointtype ); + return 0; + } + + if ( player cantargetplayerwithspecialty() == 0 ) + return 0; + + if ( distance( player.origin, self.origin ) > level.heli_missile_range ) + return 0; + + if ( !isdefined( player.team ) ) + return 0; + + if ( level.teambased && player.team == self.team ) + return 0; + + if ( player.team == "spectator" ) + return 0; + + if ( isdefined( player.spawntime ) && ( gettime() - player.spawntime ) / 1000 <= level.heli_target_spawnprotection ) + return 0; + + if ( self target_cone_check( player, level.heli_missile_target_cone ) == 0 ) + return 0; + + heli_centroid = self.origin + vectorscale( ( 0, 0, -1 ), 160.0 ); + heli_forward_norm = anglestoforward( self.angles ); + heli_turret_point = heli_centroid + 144 * heli_forward_norm; + + if ( !isdefined( player.lasthit ) ) + player.lasthit = 0; + + player.lasthit = self heliturretsighttrace( heli_turret_point, player, player.lasthit ); + + if ( player.lasthit != 0 ) + return 0; + + return cantarget; } cantargetdog_turret( dog ) { - cantarget = 1; - if ( !isDefined( dog ) ) - { - return 0; - } - if ( distance( dog.origin, self.origin ) > level.heli_visual_range ) - { - return 0; - } - if ( !isDefined( dog.aiteam ) ) - { - return 0; - } - if ( level.teambased && dog.aiteam == self.team ) - { - return 0; - } - if ( isDefined( dog.script_owner ) && self.owner == dog.script_owner ) - { - return 0; - } - heli_centroid = self.origin + vectorScale( ( 1, 1, 1 ), 160 ); - heli_forward_norm = anglesToForward( self.angles ); - heli_turret_point = heli_centroid + ( 144 * heli_forward_norm ); - if ( !isDefined( dog.lasthit ) ) - { - dog.lasthit = 0; - } - dog.lasthit = self heliturretdogtrace( heli_turret_point, dog, dog.lasthit ); - if ( dog.lasthit != 0 ) - { - return 0; - } - return cantarget; + cantarget = 1; + + if ( !isdefined( dog ) ) + return 0; + + if ( distance( dog.origin, self.origin ) > level.heli_visual_range ) + return 0; + + if ( !isdefined( dog.aiteam ) ) + return 0; + + if ( level.teambased && dog.aiteam == self.team ) + return 0; + + if ( isdefined( dog.script_owner ) && self.owner == dog.script_owner ) + return 0; + + heli_centroid = self.origin + vectorscale( ( 0, 0, -1 ), 160.0 ); + heli_forward_norm = anglestoforward( self.angles ); + heli_turret_point = heli_centroid + 144 * heli_forward_norm; + + if ( !isdefined( dog.lasthit ) ) + dog.lasthit = 0; + + dog.lasthit = self heliturretdogtrace( heli_turret_point, dog, dog.lasthit ); + + if ( dog.lasthit != 0 ) + return 0; + + return cantarget; } cantargetdog_missile( dog ) { - cantarget = 1; - if ( !isDefined( dog ) ) - { - return 0; - } - if ( distance( dog.origin, self.origin ) > level.heli_missile_range ) - { - return 0; - } - if ( !isDefined( dog.aiteam ) ) - { - return 0; - } - if ( level.teambased && dog.aiteam == self.team ) - { - return 0; - } - if ( isDefined( dog.script_owner ) && self.owner == dog.script_owner ) - { - return 0; - } - heli_centroid = self.origin + vectorScale( ( 1, 1, 1 ), 160 ); - heli_forward_norm = anglesToForward( self.angles ); - heli_turret_point = heli_centroid + ( 144 * heli_forward_norm ); - if ( !isDefined( dog.lasthit ) ) - { - dog.lasthit = 0; - } - dog.lasthit = self heliturretdogtrace( heli_turret_point, dog, dog.lasthit ); - if ( dog.lasthit != 0 ) - { - return 0; - } - return cantarget; + cantarget = 1; + + if ( !isdefined( dog ) ) + return 0; + + if ( distance( dog.origin, self.origin ) > level.heli_missile_range ) + return 0; + + if ( !isdefined( dog.aiteam ) ) + return 0; + + if ( level.teambased && dog.aiteam == self.team ) + return 0; + + if ( isdefined( dog.script_owner ) && self.owner == dog.script_owner ) + return 0; + + heli_centroid = self.origin + vectorscale( ( 0, 0, -1 ), 160.0 ); + heli_forward_norm = anglestoforward( self.angles ); + heli_turret_point = heli_centroid + 144 * heli_forward_norm; + + if ( !isdefined( dog.lasthit ) ) + dog.lasthit = 0; + + dog.lasthit = self heliturretdogtrace( heli_turret_point, dog, dog.lasthit ); + + if ( dog.lasthit != 0 ) + return 0; + + return cantarget; } cantargettank_turret( tank ) { - cantarget = 1; - if ( !isDefined( tank ) ) - { - return 0; - } - if ( distance( tank.origin, self.origin ) > level.heli_visual_range ) - { - return 0; - } - if ( !isDefined( tank.aiteam ) ) - { - return 0; - } - if ( level.teambased && tank.aiteam == self.team ) - { - return 0; - } - if ( isDefined( tank.owner ) && self.owner == tank.owner ) - { - return 0; - } - return cantarget; + cantarget = 1; + + if ( !isdefined( tank ) ) + return 0; + + if ( distance( tank.origin, self.origin ) > level.heli_visual_range ) + return 0; + + if ( !isdefined( tank.aiteam ) ) + return 0; + + if ( level.teambased && tank.aiteam == self.team ) + return 0; + + if ( isdefined( tank.owner ) && self.owner == tank.owner ) + return 0; + + return cantarget; } assignprimarytargets( targets ) { - idx = 0; - while ( idx < targets.size ) - { - if ( isDefined( targets[ idx ].type ) && targets[ idx ].type == "dog" ) - { - update_dog_threat( targets[ idx ] ); - idx++; - continue; - } - else - { - update_player_threat( targets[ idx ] ); - } - idx++; - } + for ( idx = 0; idx < targets.size; idx++ ) + { + if ( isdefined( targets[idx].type ) && targets[idx].type == "dog" ) + { + update_dog_threat( targets[idx] ); + continue; + } + + update_player_threat( targets[idx] ); + } /# - assert( targets.size >= 2, "Not enough targets to assign primary and secondary" ); + assert( targets.size >= 2, "Not enough targets to assign primary and secondary" ); #/ - highest = 0; - second_highest = 0; - primarytarget = undefined; - idx = 0; - while ( idx < targets.size ) - { + highest = 0; + second_highest = 0; + primarytarget = undefined; + + for ( idx = 0; idx < targets.size; idx++ ) + { /# - assert( isDefined( targets[ idx ].threatlevel ), "Target player does not have threat level" ); + assert( isdefined( targets[idx].threatlevel ), "Target player does not have threat level" ); #/ - if ( targets[ idx ].threatlevel >= highest ) - { - highest = targets[ idx ].threatlevel; - primarytarget = targets[ idx ]; - } - idx++; - } + if ( targets[idx].threatlevel >= highest ) + { + highest = targets[idx].threatlevel; + primarytarget = targets[idx]; + } + } /# - assert( isDefined( primarytarget ), "Targets exist, but none was assigned as primary" ); + assert( isdefined( primarytarget ), "Targets exist, but none was assigned as primary" ); #/ - self.primarytarget = primarytarget; - self notify( "primary acquired" ); + self.primarytarget = primarytarget; + self notify( "primary acquired" ); } assignsecondarytargets( targets ) { - idx = 0; - while ( idx < targets.size ) - { - if ( !isDefined( targets[ idx ].type ) || targets[ idx ].type != "dog" ) - { - self update_missile_player_threat( targets[ idx ] ); - idx++; - continue; - } - else - { - if ( targets[ idx ].type == "dog" || targets[ 0 ].type == "tank_drone" ) - { - update_missile_dog_threat( targets[ idx ] ); - } - } - idx++; - } + for ( idx = 0; idx < targets.size; idx++ ) + { + if ( !isdefined( targets[idx].type ) || targets[idx].type != "dog" ) + { + self update_missile_player_threat( targets[idx] ); + continue; + } + + if ( targets[idx].type == "dog" || targets[0].type == "tank_drone" ) + update_missile_dog_threat( targets[idx] ); + } /# - assert( targets.size >= 2, "Not enough targets to assign primary and secondary" ); + assert( targets.size >= 2, "Not enough targets to assign primary and secondary" ); #/ - highest = 0; - second_highest = 0; - primarytarget = undefined; - secondarytarget = undefined; - idx = 0; - while ( idx < targets.size ) - { + highest = 0; + second_highest = 0; + primarytarget = undefined; + secondarytarget = undefined; + + for ( idx = 0; idx < targets.size; idx++ ) + { /# - assert( isDefined( targets[ idx ].missilethreatlevel ), "Target player does not have threat level" ); + assert( isdefined( targets[idx].missilethreatlevel ), "Target player does not have threat level" ); #/ - if ( targets[ idx ].missilethreatlevel >= highest ) - { - highest = targets[ idx ].missilethreatlevel; - secondarytarget = targets[ idx ]; - } - idx++; - } + if ( targets[idx].missilethreatlevel >= highest ) + { + highest = targets[idx].missilethreatlevel; + secondarytarget = targets[idx]; + } + } /# - assert( isDefined( secondarytarget ), "1+ targets exist, but none was assigned as secondary" ); + assert( isdefined( secondarytarget ), "1+ targets exist, but none was assigned as secondary" ); #/ - self.secondarytarget = secondarytarget; - self notify( "secondary acquired" ); + self.secondarytarget = secondarytarget; + self notify( "secondary acquired" ); } update_player_threat( player ) { - player.threatlevel = 0; - dist = distance( player.origin, self.origin ); - player.threatlevel += ( ( level.heli_visual_range - dist ) / level.heli_visual_range ) * 100; - if ( isDefined( self.attacker ) && player == self.attacker ) - { - player.threatlevel += 100; - } - if ( isDefined( player.carryobject ) ) - { - player.threatlevel += 200; - } - if ( isDefined( player.score ) ) - { - player.threatlevel += player.score * 4; - } - if ( isDefined( player.antithreat ) ) - { - player.threatlevel -= player.antithreat; - } - if ( player.threatlevel <= 0 ) - { - player.threatlevel = 1; - } + player.threatlevel = 0; + dist = distance( player.origin, self.origin ); + player.threatlevel += ( level.heli_visual_range - dist ) / level.heli_visual_range * 100; + + if ( isdefined( self.attacker ) && player == self.attacker ) + player.threatlevel += 100; + + if ( isdefined( player.carryobject ) ) + player.threatlevel += 200; + + if ( isdefined( player.score ) ) + player.threatlevel += player.score * 4; + + if ( isdefined( player.antithreat ) ) + player.threatlevel -= player.antithreat; + + if ( player.threatlevel <= 0 ) + player.threatlevel = 1; } update_missile_player_threat( player ) { - player.missilethreatlevel = 0; - dist = distance( player.origin, self.origin ); - player.missilethreatlevel += ( ( level.heli_missile_range - dist ) / level.heli_missile_range ) * 100; - if ( self missile_valid_target_check( player ) == 0 ) - { - player.missilethreatlevel = 1; - return; - } - if ( isDefined( self.attacker ) && player == self.attacker ) - { - player.missilethreatlevel += 100; - } - player.missilethreatlevel += player.score * 4; - if ( isDefined( player.antithreat ) ) - { - player.missilethreatlevel -= player.antithreat; - } - if ( player.missilethreatlevel <= 0 ) - { - player.missilethreatlevel = 1; - } + player.missilethreatlevel = 0; + dist = distance( player.origin, self.origin ); + player.missilethreatlevel += ( level.heli_missile_range - dist ) / level.heli_missile_range * 100; + + if ( self missile_valid_target_check( player ) == 0 ) + { + player.missilethreatlevel = 1; + return; + } + + if ( isdefined( self.attacker ) && player == self.attacker ) + player.missilethreatlevel += 100; + + player.missilethreatlevel += player.score * 4; + + if ( isdefined( player.antithreat ) ) + player.missilethreatlevel -= player.antithreat; + + if ( player.missilethreatlevel <= 0 ) + player.missilethreatlevel = 1; } update_dog_threat( dog ) { - dog.threatlevel = 0; - dist = distance( dog.origin, self.origin ); - dog.threatlevel += ( ( level.heli_visual_range - dist ) / level.heli_visual_range ) * 100; + dog.threatlevel = 0; + dist = distance( dog.origin, self.origin ); + dog.threatlevel += ( level.heli_visual_range - dist ) / level.heli_visual_range * 100; } update_missile_dog_threat( dog ) { - dog.missilethreatlevel = 1; + dog.missilethreatlevel = 1; } heli_reset() { - self cleartargetyaw(); - self cleargoalyaw(); - self setspeed( 60, 25 ); - self setyawspeed( 75, 45, 45 ); - self setmaxpitchroll( 30, 30 ); - self setneargoalnotifydist( 256 ); - self setturningability( 0,9 ); + self cleartargetyaw(); + self cleargoalyaw(); + self setspeed( 60, 25 ); + self setyawspeed( 75, 45, 45 ); + self setmaxpitchroll( 30, 30 ); + self setneargoalnotifydist( 256 ); + self setturningability( 0.9 ); } heli_wait( waittime ) { - self endon( "death" ); - self endon( "crashing" ); - self endon( "evasive" ); - self thread heli_hover(); - wait waittime; - heli_reset(); - self notify( "stop hover" ); + self endon( "death" ); + self endon( "crashing" ); + self endon( "evasive" ); + self thread heli_hover(); + wait( waittime ); + heli_reset(); + self notify( "stop hover" ); } heli_hover() { - self endon( "death" ); - self endon( "stop hover" ); - self endon( "evasive" ); - self endon( "leaving" ); - self endon( "crashing" ); - randint = randomint( 360 ); - self setgoalyaw( self.angles[ 1 ] + randint ); + self endon( "death" ); + self endon( "stop hover" ); + self endon( "evasive" ); + self endon( "leaving" ); + self endon( "crashing" ); + randint = randomint( 360 ); + self setgoalyaw( self.angles[1] + randint ); } heli_kill_monitor( hardpointtype ) { - self endon( "death" ); - self endon( "crashing" ); - self endon( "leaving" ); - self.damagetaken = 0; - self.bda = 0; - last_kill_vo = 0; - kill_vo_spacing = 4000; - for ( ;; ) - { - self waittill( "killed", victim ); + self endon( "death" ); + self endon( "crashing" ); + self endon( "leaving" ); + self.damagetaken = 0; + self.bda = 0; + last_kill_vo = 0; + kill_vo_spacing = 4000; + + for (;;) + { + self waittill( "killed", victim ); /# - println( "got killed notify" ); + println( "got killed notify" ); #/ - if ( !isDefined( self.owner ) ) - { - continue; - } - else if ( self.owner == victim ) - { - continue; - } - else if ( level.teambased && self.owner.team == victim.team ) - { - continue; - } - else - { - if ( ( last_kill_vo + kill_vo_spacing ) < getTime() ) - { - self.pilotistalking = 1; - wait 1,5; - if ( hardpointtype == "helicopter_player_gunner_mp" ) - { - type = "kls"; - self thread playpilotdialog( "kls_hit", 1 ); - } - else - { - type = "klsheli"; - self thread playpilotdialog( "klsheli_hit", 1 ); - } - wait 4; - if ( self.bda == 0 ) - { - bdadialog = type + "_killn"; - } - if ( self.bda == 1 ) - { - bdadialog = type + "_kill1"; - } - if ( self.bda == 2 ) - { - bdadialog = type + "_kill2"; - } - if ( self.bda == 3 ) - { - bdadialog = type + "_kill3"; - } - else - { - if ( self.bda > 3 ) - { - bdadialog = type + "_killm"; - } - } - self thread playpilotdialog( bdadialog ); - self.bda = 0; - last_kill_vo = getTime(); - wait 1,5; - self.pilotistalking = 0; - } - } - } + if ( !isdefined( self.owner ) ) + continue; + + if ( self.owner == victim ) + continue; + + if ( level.teambased && self.owner.team == victim.team ) + continue; + + if ( last_kill_vo + kill_vo_spacing < gettime() ) + { + self.pilotistalking = 1; + wait 1.5; + + if ( hardpointtype == "helicopter_player_gunner_mp" ) + { + type = "kls"; + self thread playpilotdialog( "kls_hit", 1.0 ); + } + else + { + type = "klsheli"; + self thread playpilotdialog( "klsheli_hit", 1.0 ); + } + + wait 4.0; + + if ( self.bda == 0 ) + bdadialog = type + "_killn"; + + if ( self.bda == 1 ) + bdadialog = type + "_kill1"; + + if ( self.bda == 2 ) + bdadialog = type + "_kill2"; + + if ( self.bda == 3 ) + bdadialog = type + "_kill3"; + else if ( self.bda > 3 ) + bdadialog = type + "_killm"; + + self thread playpilotdialog( bdadialog ); + self.bda = 0; + last_kill_vo = gettime(); + wait 1.5; + self.pilotistalking = 0; + } + } } heli_damage_monitor( hardpointtype ) { - self endon( "death" ); - self endon( "crashing" ); - self.damagetaken = 0; - last_hit_vo = 0; - hit_vo_spacing = 6000; - if ( !isDefined( self.attackerdata ) ) - { - self.attackers = []; - self.attackerdata = []; - self.attackerdamage = []; - self.flareattackerdamage = []; - } - for ( ;; ) - { - self waittill( "damage", damage, attacker, direction, point, type, modelname, tagname, partname, weapon ); - if ( !isDefined( attacker ) || !isplayer( attacker ) ) - { - continue; - } - else - { - heli_friendlyfire = maps/mp/gametypes/_weaponobjects::friendlyfirecheck( self.owner, attacker ); - if ( !heli_friendlyfire ) - { - break; - } - else if ( !level.hardcoremode ) - { - if ( isDefined( self.owner ) && attacker == self.owner ) - { - break; - } - else - { - if ( level.teambased ) - { - if ( isDefined( attacker.team ) ) - { - isvalidattacker = attacker.team != self.team; - } - } - else - { - isvalidattacker = 1; - } - if ( !isvalidattacker ) - { - break; - } - } - else if ( isplayer( attacker ) ) - { - if ( maps/mp/gametypes/_globallogic_player::dodamagefeedback( weapon, attacker ) ) - { - attacker maps/mp/gametypes/_damagefeedback::updatedamagefeedback(); - } - if ( type == "MOD_RIFLE_BULLET" || type == "MOD_PISTOL_BULLET" ) - { - if ( attacker hasperk( "specialty_armorpiercing" ) ) - { - damage += int( damage * level.cac_armorpiercing_data ); - } - damage *= level.heli_armor_bulletdamage; - } - self trackassists( attacker, damage, 0 ); - } - self.attacker = attacker; - if ( type == "MOD_PROJECTILE" ) - { - switch( weapon ) - { - case "tow_turret_mp": - if ( isDefined( self.rocketdamagetwoshot ) ) - { - self.damagetaken += self.rocketdamagetwoshot; - } - else if ( isDefined( self.rocketdamageoneshot ) ) - { - self.damagetaken += self.rocketdamageoneshot; - } - else - { - self.damagetaken += damage; - } - break; - case "xm25_mp": - self.damagetaken += damage; - break; - default: - if ( isDefined( self.rocketdamageoneshot ) ) - { - self.damagetaken += self.rocketdamageoneshot; - } - else self.damagetaken += damage; - break; - } - } - else - { - self.damagetaken += damage; - } - playercontrolled = 0; - if ( self.damagetaken > self.maxhealth && !isDefined( self.xpgiven ) || !isDefined( self.owner ) && attacker != self.owner ) - { - self.xpgiven = 1; - switch( hardpointtype ) - { - case "helicopter_gunner_mp": - playercontrolled = 1; - event = "destroyed_helicopter_gunner"; - break; - case "helicopter_player_gunner_mp": - playercontrolled = 1; - event = "destroyed_helicopter_gunner"; - break; - case "helicopter_guard_mp": - event = "destroyed_helicopter_guard"; - break; - case "helicopter_comlink_mp": - event = "destroyed_helicopter_comlink"; - break; - case "supply_drop_mp": - event = "destroyed_helicopter_supply_drop"; - break; - } - if ( isDefined( event ) ) - { - if ( self.owner isenemyplayer( attacker ) ) - { - maps/mp/_challenges::destroyedhelicopter( attacker, weapon, type, playercontrolled ); - maps/mp/_challenges::destroyedaircraft( attacker, weapon ); - maps/mp/_scoreevents::processscoreevent( event, attacker, self.owner, weapon ); - attacker maps/mp/_challenges::addflyswatterstat( weapon, self ); - if ( playercontrolled == 1 ) - { - attacker destroyedplayercontrolledaircraft(); - } - if ( hardpointtype == "helicopter_player_gunner_mp" ) - { - attacker addweaponstat( weapon, "destroyed_controlled_killstreak", 1 ); - } - break; - } - } - weaponstatname = "destroyed"; - switch( weapon ) - { - case "auto_tow_mp": - case "tow_turret_drop_mp": - case "tow_turret_mp": - weaponstatname = "kills"; - break; - } - attacker addweaponstat( weapon, weaponstatname, 1 ); - killstreakreference = undefined; - switch( hardpointtype ) - { - case "helicopter_gunner_mp": - killstreakreference = "killstreak_helicopter_gunner"; - break; - case "helicopter_player_gunner_mp": - killstreakreference = "killstreak_helicopter_player_gunner"; - break; - case "helicopter_player_firstperson_mp": - killstreakreference = "killstreak_helicopter_player_firstperson"; - break; - case "helicopter_comlink_mp": - case "helicopter_mp": - case "helicopter_x2_mp": - killstreakreference = "killstreak_helicopter_comlink"; - break; - case "supply_drop_mp": - killstreakreference = "killstreak_supply_drop"; - break; - case "helicopter_guard_mp": - killstreakreference = "killstreak_helicopter_guard"; - } - if ( isDefined( killstreakreference ) ) - { - level.globalkillstreaksdestroyed++; - attacker addweaponstat( hardpointtype, "destroyed", 1 ); - } - notifystring = &"KILLSTREAK_DESTROYED_HELICOPTER"; - if ( hardpointtype == "helicopter_player_gunner_mp" ) - { - notifystring = &"KILLSTREAK_DESTROYED_HELICOPTER_GUNNER"; - self.owner sendkillstreakdamageevent( 600 ); - } - i = 0; - while ( i < level.players.size ) - { - level.players[ i ] luinotifyevent( &"player_callout", 2, notifystring, attacker.entnum ); - i++; - } - if ( isDefined( self.attackers ) ) - { - j = 0; - while ( j < self.attackers.size ) - { - player = self.attackers[ j ]; - if ( !isDefined( player ) ) - { - j++; - continue; - } - else if ( player == attacker ) - { - j++; - continue; - } - else flare_done = self.flareattackerdamage[ player.clientid ]; - if ( isDefined( flare_done ) && flare_done == 1 ) - { - maps/mp/_scoreevents::processscoreevent( "aircraft_flare_assist", player ); - j++; - continue; - } - else - { - damage_done = self.attackerdamage[ player.clientid ]; - player thread processcopterassist( self, damage_done ); - } - j++; - } - self.attackers = []; - } - attacker notify( "destroyed_helicopter" ); - target_remove( self ); - break; - } - else - { - if ( isDefined( self.owner ) && isplayer( self.owner ) ) - { - if ( ( last_hit_vo + hit_vo_spacing ) < getTime() ) - { - if ( type == "MOD_PROJECTILE" || randomintrange( 0, 3 ) == 0 ) - { - self.owner playlocalsound( level.heli_vo[ self.team ][ "hit" ] ); - last_hit_vo = getTime(); - } - } - } - } - } - } - } + self endon( "death" ); + self endon( "crashing" ); + self.damagetaken = 0; + last_hit_vo = 0; + hit_vo_spacing = 6000; + + if ( !isdefined( self.attackerdata ) ) + { + self.attackers = []; + self.attackerdata = []; + self.attackerdamage = []; + self.flareattackerdamage = []; + } + + for (;;) + { + self waittill( "damage", damage, attacker, direction, point, type, modelname, tagname, partname, weapon ); + + if ( !isdefined( attacker ) || !isplayer( attacker ) ) + continue; + + heli_friendlyfire = maps\mp\gametypes\_weaponobjects::friendlyfirecheck( self.owner, attacker ); + + if ( !heli_friendlyfire ) + continue; + + if ( !level.hardcoremode ) + { + if ( isdefined( self.owner ) && attacker == self.owner ) + continue; + + if ( level.teambased ) + isvalidattacker = isdefined( attacker.team ) && attacker.team != self.team; + else + isvalidattacker = 1; + + if ( !isvalidattacker ) + continue; + } + + if ( isplayer( attacker ) ) + { + if ( maps\mp\gametypes\_globallogic_player::dodamagefeedback( weapon, attacker ) ) + attacker maps\mp\gametypes\_damagefeedback::updatedamagefeedback(); + + if ( type == "MOD_RIFLE_BULLET" || type == "MOD_PISTOL_BULLET" ) + { + if ( attacker hasperk( "specialty_armorpiercing" ) ) + damage += int( damage * level.cac_armorpiercing_data ); + + damage *= level.heli_armor_bulletdamage; + } + + self trackassists( attacker, damage, 0 ); + } + + self.attacker = attacker; + + if ( type == "MOD_PROJECTILE" ) + { + switch ( weapon ) + { + case "tow_turret_mp": + if ( isdefined( self.rocketdamagetwoshot ) ) + self.damagetaken += self.rocketdamagetwoshot; + else if ( isdefined( self.rocketdamageoneshot ) ) + self.damagetaken += self.rocketdamageoneshot; + else + self.damagetaken += damage; + + break; + case "xm25_mp": + self.damagetaken += damage; + break; + default: + if ( isdefined( self.rocketdamageoneshot ) ) + self.damagetaken += self.rocketdamageoneshot; + else + self.damagetaken += damage; + + break; + } + } + else + self.damagetaken += damage; + + playercontrolled = 0; + + if ( self.damagetaken > self.maxhealth && !isdefined( self.xpgiven ) && ( !isdefined( self.owner ) || attacker != self.owner ) ) + { + self.xpgiven = 1; + + switch ( hardpointtype ) + { + case "helicopter_gunner_mp": + playercontrolled = 1; + event = "destroyed_helicopter_gunner"; + break; + case "helicopter_player_gunner_mp": + playercontrolled = 1; + event = "destroyed_helicopter_gunner"; + break; + case "helicopter_guard_mp": + event = "destroyed_helicopter_guard"; + break; + case "helicopter_comlink_mp": + event = "destroyed_helicopter_comlink"; + break; + case "supply_drop_mp": + event = "destroyed_helicopter_supply_drop"; + break; + } + + if ( isdefined( event ) ) + { + if ( self.owner isenemyplayer( attacker ) ) + { + maps\mp\_challenges::destroyedhelicopter( attacker, weapon, type, playercontrolled ); + maps\mp\_challenges::destroyedaircraft( attacker, weapon ); + maps\mp\_scoreevents::processscoreevent( event, attacker, self.owner, weapon ); + attacker maps\mp\_challenges::addflyswatterstat( weapon, self ); + + if ( playercontrolled == 1 ) + attacker destroyedplayercontrolledaircraft(); + + if ( hardpointtype == "helicopter_player_gunner_mp" ) + attacker addweaponstat( weapon, "destroyed_controlled_killstreak", 1 ); + } + else + { + + } + } + + weaponstatname = "destroyed"; + + switch ( weapon ) + { + case "tow_turret_mp": + case "tow_turret_drop_mp": + case "auto_tow_mp": + weaponstatname = "kills"; + break; + } + + attacker addweaponstat( weapon, weaponstatname, 1 ); + killstreakreference = undefined; + + switch ( hardpointtype ) + { + case "helicopter_gunner_mp": + killstreakreference = "killstreak_helicopter_gunner"; + break; + case "helicopter_player_gunner_mp": + killstreakreference = "killstreak_helicopter_player_gunner"; + break; + case "helicopter_player_firstperson_mp": + killstreakreference = "killstreak_helicopter_player_firstperson"; + break; + case "helicopter_x2_mp": + case "helicopter_mp": + case "helicopter_comlink_mp": + killstreakreference = "killstreak_helicopter_comlink"; + break; + case "supply_drop_mp": + killstreakreference = "killstreak_supply_drop"; + break; + case "helicopter_guard_mp": + killstreakreference = "killstreak_helicopter_guard"; + } + + if ( isdefined( killstreakreference ) ) + { + level.globalkillstreaksdestroyed++; + attacker addweaponstat( hardpointtype, "destroyed", 1 ); + } + + notifystring = &"KILLSTREAK_DESTROYED_HELICOPTER"; + + if ( hardpointtype == "helicopter_player_gunner_mp" ) + { + notifystring = &"KILLSTREAK_DESTROYED_HELICOPTER_GUNNER"; + self.owner sendkillstreakdamageevent( 600 ); + } + + for ( i = 0; i < level.players.size; i++ ) + level.players[i] luinotifyevent( &"player_callout", 2, notifystring, attacker.entnum ); + + if ( isdefined( self.attackers ) ) + { + for ( j = 0; j < self.attackers.size; j++ ) + { + player = self.attackers[j]; + + if ( !isdefined( player ) ) + continue; + + if ( player == attacker ) + continue; + + flare_done = self.flareattackerdamage[player.clientid]; + + if ( isdefined( flare_done ) && flare_done == 1 ) + { + maps\mp\_scoreevents::processscoreevent( "aircraft_flare_assist", player ); + continue; + } + + damage_done = self.attackerdamage[player.clientid]; + player thread processcopterassist( self, damage_done ); + } + + self.attackers = []; + } + + attacker notify( "destroyed_helicopter" ); + target_remove( self ); + continue; + } + + if ( isdefined( self.owner ) && isplayer( self.owner ) ) + { + if ( last_hit_vo + hit_vo_spacing < gettime() ) + { + if ( type == "MOD_PROJECTILE" || randomintrange( 0, 3 ) == 0 ) + { + self.owner playlocalsound( level.heli_vo[self.team]["hit"] ); + last_hit_vo = gettime(); + } + } + } + } } trackassists( attacker, damage, isflare ) { - if ( !isDefined( self.attackerdata[ attacker.clientid ] ) ) - { - self.attackerdamage[ attacker.clientid ] = damage; - self.attackers[ self.attackers.size ] = attacker; - self.attackerdata[ attacker.clientid ] = 0; - } - else - { - self.attackerdamage[ attacker.clientid ] += damage; - } - if ( isDefined( isflare ) && isflare == 1 ) - { - self.flareattackerdamage[ attacker.clientid ] = 1; - } - else - { - self.flareattackerdamage[ attacker.clientid ] = 0; - } + if ( !isdefined( self.attackerdata[attacker.clientid] ) ) + { + self.attackerdamage[attacker.clientid] = damage; + self.attackers[self.attackers.size] = attacker; + self.attackerdata[attacker.clientid] = 0; + } + else + self.attackerdamage[attacker.clientid] += damage; + + if ( isdefined( isflare ) && isflare == 1 ) + self.flareattackerdamage[attacker.clientid] = 1; + else + self.flareattackerdamage[attacker.clientid] = 0; } heli_health( hardpointtype, player, playernotify ) { - self endon( "death" ); - self endon( "crashing" ); - self.currentstate = "ok"; - self.laststate = "ok"; - self setdamagestage( 3 ); - damagestate = 3; - for ( ;; ) - { - self waittill( "damage", damage, attacker, direction, point, type, modelname, tagname, partname, weapon ); - wait 0,05; - if ( self.damagetaken > self.maxhealth ) - { - damagestate = 0; - self setdamagestage( damagestate ); - self thread heli_crash( hardpointtype, player, playernotify ); - } - else if ( self.damagetaken >= ( self.maxhealth * 0,66 ) && damagestate >= 2 ) - { - if ( isDefined( self.vehicletype ) && self.vehicletype == "heli_player_gunner_mp" ) - { - playfxontag( level.chopper_fx[ "damage" ][ "heavy_smoke" ], self, "tag_origin" ); - } - else - { - playfxontag( level.chopper_fx[ "damage" ][ "heavy_smoke" ], self, "tag_main_rotor" ); - } - damagestate = 1; - self.currentstate = "heavy smoke"; - self.evasive = 1; - self notify( "damage state" ); - } - else - { - if ( self.damagetaken >= ( self.maxhealth * 0,33 ) && damagestate == 3 ) - { - if ( isDefined( self.vehicletype ) && self.vehicletype == "heli_player_gunner_mp" ) - { - playfxontag( level.chopper_fx[ "damage" ][ "light_smoke" ], self, "tag_origin" ); - } - else - { - playfxontag( level.chopper_fx[ "damage" ][ "light_smoke" ], self, "tag_main_rotor" ); - } - damagestate = 2; - self.currentstate = "light smoke"; - self notify( "damage state" ); - } - } - if ( self.damagetaken <= level.heli_armor ) - { - debug_print3d_simple( "Armor: " + ( level.heli_armor - self.damagetaken ), self, vectorScale( ( 1, 1, 1 ), 100 ), 20 ); - continue; - } - else - { - debug_print3d_simple( "Health: " + ( self.maxhealth - self.damagetaken ), self, vectorScale( ( 1, 1, 1 ), 100 ), 20 ); - } - } + self endon( "death" ); + self endon( "crashing" ); + self.currentstate = "ok"; + self.laststate = "ok"; + self setdamagestage( 3 ); + damagestate = 3; + + for (;;) + { + self waittill( "damage", damage, attacker, direction, point, type, modelname, tagname, partname, weapon ); + + wait 0.05; + + if ( self.damagetaken > self.maxhealth ) + { + damagestate = 0; + self setdamagestage( damagestate ); + self thread heli_crash( hardpointtype, player, playernotify ); + } + else if ( self.damagetaken >= self.maxhealth * 0.66 && damagestate >= 2 ) + { + if ( isdefined( self.vehicletype ) && self.vehicletype == "heli_player_gunner_mp" ) + playfxontag( level.chopper_fx["damage"]["heavy_smoke"], self, "tag_origin" ); + else + playfxontag( level.chopper_fx["damage"]["heavy_smoke"], self, "tag_main_rotor" ); + + damagestate = 1; + self.currentstate = "heavy smoke"; + self.evasive = 1; + self notify( "damage state" ); + } + else if ( self.damagetaken >= self.maxhealth * 0.33 && damagestate == 3 ) + { + if ( isdefined( self.vehicletype ) && self.vehicletype == "heli_player_gunner_mp" ) + playfxontag( level.chopper_fx["damage"]["light_smoke"], self, "tag_origin" ); + else + playfxontag( level.chopper_fx["damage"]["light_smoke"], self, "tag_main_rotor" ); + + damagestate = 2; + self.currentstate = "light smoke"; + self notify( "damage state" ); + } + + if ( self.damagetaken <= level.heli_armor ) + { + debug_print3d_simple( "Armor: " + level.heli_armor - self.damagetaken, self, vectorscale( ( 0, 0, 1 ), 100.0 ), 20 ); + continue; + } + + debug_print3d_simple( "Health: " + self.maxhealth - self.damagetaken, self, vectorscale( ( 0, 0, 1 ), 100.0 ), 20 ); + } } heli_evasive( hardpointtype ) { - self notify( "evasive" ); - self.evasive = 1; - loop_startnode = level.heli_loop_paths[ 0 ]; - gunnerpathfound = 1; - while ( hardpointtype == "helicopter_gunner_mp" ) - { - gunnerpathfound = 0; - i = 0; - while ( i < level.heli_loop_paths.size ) - { - if ( isDefined( level.heli_loop_paths[ i ].isgunnerpath ) && level.heli_loop_paths[ i ].isgunnerpath ) - { - loop_startnode = level.heli_loop_paths[ i ]; - gunnerpathfound = 1; - break; - } - else - { - i++; - } - } - } + self notify( "evasive" ); + self.evasive = 1; + loop_startnode = level.heli_loop_paths[0]; + gunnerpathfound = 1; + + if ( hardpointtype == "helicopter_gunner_mp" ) + { + gunnerpathfound = 0; + + for ( i = 0; i < level.heli_loop_paths.size; i++ ) + { + if ( isdefined( level.heli_loop_paths[i].isgunnerpath ) && level.heli_loop_paths[i].isgunnerpath ) + { + loop_startnode = level.heli_loop_paths[i]; + gunnerpathfound = 1; + break; + } + } + } /# - assert( gunnerpathfound, "No chopper gunner loop paths found in map" ); + assert( gunnerpathfound, "No chopper gunner loop paths found in map" ); #/ - startwait = 2; - if ( isDefined( self.donotstop ) && self.donotstop ) - { - startwait = 0; - } - self thread heli_fly( loop_startnode, startwait, hardpointtype ); + startwait = 2; + + if ( isdefined( self.donotstop ) && self.donotstop ) + startwait = 0; + + self thread heli_fly( loop_startnode, startwait, hardpointtype ); } notify_player( player, playernotify, delay ) { - if ( !isDefined( player ) ) - { - return; - } - if ( !isDefined( playernotify ) ) - { - return; - } - player endon( "disconnect" ); - player endon( playernotify ); - wait delay; - player notify( playernotify ); + if ( !isdefined( player ) ) + return; + + if ( !isdefined( playernotify ) ) + return; + + player endon( "disconnect" ); + player endon( playernotify ); + wait( delay ); + player notify( playernotify ); } play_going_down_vo( delay ) { - self.owner endon( "disconnect" ); - self endon( "death" ); - wait delay; - self playpilotdialog( "attackheli_down" ); + self.owner endon( "disconnect" ); + self endon( "death" ); + wait( delay ); + self playpilotdialog( "attackheli_down" ); } heli_crash( hardpointtype, player, playernotify ) { - self endon( "death" ); - self notify( "crashing" ); - self maps/mp/gametypes/_spawning::remove_helicopter_influencers(); - self stoploopsound( 0 ); - if ( isDefined( self.minigun_snd_ent ) ) - { - self.minigun_snd_ent stoploopsound(); - } - if ( isDefined( self.alarm_snd_ent ) ) - { - self.alarm_snd_ent stoploopsound(); - } - crashtypes = []; - crashtypes[ 0 ] = "crashOnPath"; - crashtypes[ 1 ] = "spinOut"; - crashtype = crashtypes[ randomint( 2 ) ]; - if ( isDefined( self.crashtype ) ) - { - crashtype = self.crashtype; - } + self endon( "death" ); + self notify( "crashing" ); + self maps\mp\gametypes\_spawning::remove_helicopter_influencers(); + self stoploopsound( 0 ); + + if ( isdefined( self.minigun_snd_ent ) ) + self.minigun_snd_ent stoploopsound(); + + if ( isdefined( self.alarm_snd_ent ) ) + self.alarm_snd_ent stoploopsound(); + + crashtypes = []; + crashtypes[0] = "crashOnPath"; + crashtypes[1] = "spinOut"; + crashtype = crashtypes[randomint( 2 )]; + + if ( isdefined( self.crashtype ) ) + crashtype = self.crashtype; /# - if ( level.heli_debug_crash ) - { - switch( level.heli_debug_crash ) - { - case 1: - crashtype = "explode"; - break; - case 2: - crashtype = "crashOnPath"; - break; - case 3: - crashtype = "spinOut"; - break; - default: - } + if ( level.heli_debug_crash ) + { + switch ( level.heli_debug_crash ) + { + case "1": + crashtype = "explode"; + break; + case "2": + crashtype = "crashOnPath"; + break; + case "3": + crashtype = "spinOut"; + break; + } + + asm_endswitch( 4 case 1 loc_5F74 case 2 loc_5F7E case 3 loc_5F88 default loc_5F92 ); + } #/ - } - switch( crashtype ) - { - case "explode": - thread notify_player( player, playernotify, 0 ); - self thread heli_explode(); - break; - case "crashOnPath": - if ( isDefined( player ) ) - { - self thread play_going_down_vo( 0,5 ); - } - thread notify_player( player, playernotify, 4 ); - self clear_client_flags(); - self thread crashonnearestcrashpath( hardpointtype ); - break; - case "spinOut": - if ( isDefined( player ) ) - { - self thread play_going_down_vo( 0,5 ); - } - thread notify_player( player, playernotify, 4 ); - self clear_client_flags(); - heli_reset(); - heli_speed = 30 + randomint( 50 ); - heli_accel = 10 + randomint( 25 ); - leavenode = getvalidrandomcrashnode( self.origin ); - self setspeed( heli_speed, heli_accel ); - self setvehgoalpos( leavenode.origin, 0 ); - rateofspin = 45 + randomint( 90 ); - thread heli_secondary_explosions(); - self thread heli_spin( rateofspin ); - self waittill_any_timeout( randomintrange( 4, 6 ), "near_goal" ); - if ( isDefined( player ) && isDefined( playernotify ) ) - { - player notify( playernotify ); - } - self thread heli_explode(); - break; - } - self thread explodeoncontact( hardpointtype ); - time = randomintrange( 4, 6 ); - self thread waitthenexplode( time ); - } + switch ( crashtype ) + { + case "explode": + thread notify_player( player, playernotify, 0 ); + self thread heli_explode(); + break; + case "crashOnPath": + if ( isdefined( player ) ) + self thread play_going_down_vo( 0.5 ); + + thread notify_player( player, playernotify, 4 ); + self clear_client_flags(); + self thread crashonnearestcrashpath( hardpointtype ); + break; + case "spinOut": + if ( isdefined( player ) ) + self thread play_going_down_vo( 0.5 ); + + thread notify_player( player, playernotify, 4 ); + self clear_client_flags(); + heli_reset(); + heli_speed = 30 + randomint( 50 ); + heli_accel = 10 + randomint( 25 ); + leavenode = getvalidrandomcrashnode( self.origin ); + self setspeed( heli_speed, heli_accel ); + self setvehgoalpos( leavenode.origin, 0 ); + rateofspin = 45 + randomint( 90 ); + thread heli_secondary_explosions(); + self thread heli_spin( rateofspin ); + self waittill_any_timeout( randomintrange( 4, 6 ), "near_goal" ); + + if ( isdefined( player ) && isdefined( playernotify ) ) + player notify( playernotify ); + + self thread heli_explode(); + break; + } + + self thread explodeoncontact( hardpointtype ); + time = randomintrange( 4, 6 ); + self thread waitthenexplode( time ); } damagedrotorfx() { - self endon( "death" ); - self setrotorspeed( 0,6 ); + self endon( "death" ); + self setrotorspeed( 0.6 ); } waitthenexplode( time ) { - self endon( "death" ); - wait time; - self thread heli_explode(); + self endon( "death" ); + wait( time ); + self thread heli_explode(); } crashonnearestcrashpath( hardpointtype ) { - crashpathdistance = -1; - crashpath = level.heli_crash_paths[ 0 ]; - i = 0; - while ( i < level.heli_crash_paths.size ) - { - currentdistance = distance( self.origin, level.heli_crash_paths[ i ].origin ); - if ( crashpathdistance == -1 || crashpathdistance > currentdistance ) - { - crashpathdistance = currentdistance; - crashpath = level.heli_crash_paths[ i ]; - } - i++; - } - heli_speed = 30 + randomint( 50 ); - heli_accel = 10 + randomint( 25 ); - self setspeed( heli_speed, heli_accel ); - thread heli_secondary_explosions(); - self thread heli_fly( crashpath, 0, hardpointtype ); - rateofspin = 45 + randomint( 90 ); - self thread heli_spin( rateofspin ); - self waittill( "path start" ); - self waittill( "destination reached" ); - self thread heli_explode(); + crashpathdistance = -1; + crashpath = level.heli_crash_paths[0]; + + for ( i = 0; i < level.heli_crash_paths.size; i++ ) + { + currentdistance = distance( self.origin, level.heli_crash_paths[i].origin ); + + if ( crashpathdistance == -1 || crashpathdistance > currentdistance ) + { + crashpathdistance = currentdistance; + crashpath = level.heli_crash_paths[i]; + } + } + + heli_speed = 30 + randomint( 50 ); + heli_accel = 10 + randomint( 25 ); + self setspeed( heli_speed, heli_accel ); + thread heli_secondary_explosions(); + self thread heli_fly( crashpath, 0, hardpointtype ); + rateofspin = 45 + randomint( 90 ); + self thread heli_spin( rateofspin ); + + self waittill( "path start" ); + + self waittill( "destination reached" ); + + self thread heli_explode(); } heli_secondary_explosions() { - self endon( "death" ); - playfxontag( level.chopper_fx[ "explode" ][ "large" ], self, "tag_engine_left" ); - self playsound( level.heli_sound[ "hit" ] ); - if ( isDefined( self.vehicletype ) && self.vehicletype == "heli_player_gunner_mp" ) - { - self thread trail_fx( level.chopper_fx[ "smoke" ][ "trail" ], "tag_engine_right", "stop tail smoke" ); - } - else - { - self thread trail_fx( level.chopper_fx[ "smoke" ][ "trail" ], "tail_rotor_jnt", "stop tail smoke" ); - } - self setdamagestage( 0 ); - self thread trail_fx( level.chopper_fx[ "fire" ][ "trail" ][ "large" ], "tag_engine_left", "stop body fire" ); - wait 3; - if ( !isDefined( self ) ) - { - return; - } - playfxontag( level.chopper_fx[ "explode" ][ "large" ], self, "tag_engine_left" ); - self playsound( level.heli_sound[ "hitsecondary" ] ); + self endon( "death" ); + playfxontag( level.chopper_fx["explode"]["large"], self, "tag_engine_left" ); + self playsound( level.heli_sound["hit"] ); + + if ( isdefined( self.vehicletype ) && self.vehicletype == "heli_player_gunner_mp" ) + self thread trail_fx( level.chopper_fx["smoke"]["trail"], "tag_engine_right", "stop tail smoke" ); + else + self thread trail_fx( level.chopper_fx["smoke"]["trail"], "tail_rotor_jnt", "stop tail smoke" ); + + self setdamagestage( 0 ); + self thread trail_fx( level.chopper_fx["fire"]["trail"]["large"], "tag_engine_left", "stop body fire" ); + wait 3.0; + + if ( !isdefined( self ) ) + return; + + playfxontag( level.chopper_fx["explode"]["large"], self, "tag_engine_left" ); + self playsound( level.heli_sound["hitsecondary"] ); } heli_spin( speed ) { - self endon( "death" ); - self thread spinsoundshortly(); - self setyawspeed( speed, speed / 3, speed / 3 ); - while ( isDefined( self ) ) - { - self settargetyaw( self.angles[ 1 ] + ( speed * 0,9 ) ); - wait 1; - } + self endon( "death" ); + self thread spinsoundshortly(); + self setyawspeed( speed, speed / 3, speed / 3 ); + + while ( isdefined( self ) ) + { + self settargetyaw( self.angles[1] + speed * 0.9 ); + wait 1; + } } spinsoundshortly() { - self endon( "death" ); - wait 0,25; - self stoploopsound(); - wait 0,05; - self playloopsound( level.heli_sound[ "spinloop" ] ); - wait 0,05; - self playsound( level.heli_sound[ "spinstart" ] ); + self endon( "death" ); + wait 0.25; + self stoploopsound(); + wait 0.05; + self playloopsound( level.heli_sound["spinloop"] ); + wait 0.05; + self playsound( level.heli_sound["spinstart"] ); } trail_fx( trail_fx, trail_tag, stop_notify ) { - playfxontag( trail_fx, self, trail_tag ); + playfxontag( trail_fx, self, trail_tag ); } destroyhelicopter() { - team = self.team; - self maps/mp/gametypes/_spawning::remove_helicopter_influencers(); - if ( isDefined( self.interior_model ) ) - { - self.interior_model delete(); - self.interior_model = undefined; - } - if ( isDefined( self.minigun_snd_ent ) ) - { - self.minigun_snd_ent stoploopsound(); - self.minigun_snd_ent delete(); - self.minigun_snd_ent = undefined; - } - if ( isDefined( self.alarm_snd_ent ) ) - { - self.alarm_snd_ent delete(); - self.alarm_snd_ent = undefined; - } - if ( isDefined( self.flare_ent ) ) - { - self.flare_ent delete(); - self.flare_ent = undefined; - } - self delete(); - maps/mp/killstreaks/_killstreakrules::killstreakstop( self.hardpointtype, team, self.killstreak_id ); + team = self.team; + self maps\mp\gametypes\_spawning::remove_helicopter_influencers(); + + if ( isdefined( self.interior_model ) ) + { + self.interior_model delete(); + self.interior_model = undefined; + } + + if ( isdefined( self.minigun_snd_ent ) ) + { + self.minigun_snd_ent stoploopsound(); + self.minigun_snd_ent delete(); + self.minigun_snd_ent = undefined; + } + + if ( isdefined( self.alarm_snd_ent ) ) + { + self.alarm_snd_ent delete(); + self.alarm_snd_ent = undefined; + } + + if ( isdefined( self.flare_ent ) ) + { + self.flare_ent delete(); + self.flare_ent = undefined; + } + + self delete(); + maps\mp\killstreaks\_killstreakrules::killstreakstop( self.hardpointtype, team, self.killstreak_id ); } heli_explode() { - self death_notify_wrapper(); - forward = ( self.origin + vectorScale( ( 1, 1, 1 ), 100 ) ) - self.origin; - if ( isDefined( self.helitype ) && self.helitype == "littlebird" ) - { - playfx( level.chopper_fx[ "explode" ][ "guard" ], self.origin, forward ); - } - else - { - if ( isDefined( self.vehicletype ) && self.vehicletype == "heli_player_gunner_mp" ) - { - playfx( level.chopper_fx[ "explode" ][ "gunner" ], self.origin, forward ); - } - else - { - playfx( level.chopper_fx[ "explode" ][ "death" ], self.origin, forward ); - } - } - self playsound( level.heli_sound[ "crash" ] ); - wait 0,1; + self death_notify_wrapper(); + forward = self.origin + vectorscale( ( 0, 0, 1 ), 100.0 ) - self.origin; + + if ( isdefined( self.helitype ) && self.helitype == "littlebird" ) + playfx( level.chopper_fx["explode"]["guard"], self.origin, forward ); + else if ( isdefined( self.vehicletype ) && self.vehicletype == "heli_player_gunner_mp" ) + playfx( level.chopper_fx["explode"]["gunner"], self.origin, forward ); + else + playfx( level.chopper_fx["explode"]["death"], self.origin, forward ); + + self playsound( level.heli_sound["crash"] ); + wait 0.1; /# - assert( isDefined( self.destroyfunc ) ); + assert( isdefined( self.destroyfunc ) ); #/ - self [[ self.destroyfunc ]](); + self [[ self.destroyfunc ]](); } clear_client_flags() { + } heli_leave( hardpointtype ) { - self notify( "desintation reached" ); - self notify( "leaving" ); - if ( hardpointtype == "helicopter_player_gunner_mp" ) - { - self thread playpilotdialog( "a10_leave", 2,5 ); - } - else - { - self thread playpilotdialog( "attackheli_leave", 2,5 ); - } - self clear_client_flags(); - leavenode = getvalidrandomleavenode( self.origin ); - heli_reset(); - self clearlookatent(); - exitangles = vectorToAngle( leavenode.origin - self.origin ); - self setgoalyaw( exitangles[ 1 ] ); - wait 1,5; - if ( !isDefined( self ) ) - { - return; - } - self setspeed( 180, 65 ); - self setvehgoalpos( self.origin + ( ( leavenode.origin - self.origin ) / 2 ) + vectorScale( ( 1, 1, 1 ), 1000 ) ); - self waittill( "near_goal" ); - self setvehgoalpos( leavenode.origin, 1 ); - self waittillmatch( "goal" ); - return; - self stoploopsound( 1 ); - self death_notify_wrapper(); - if ( isDefined( self.alarm_snd_ent ) ) - { - self.alarm_snd_ent stoploopsound(); - self.alarm_snd_ent delete(); - self.alarm_snd_ent = undefined; - } - if ( target_istarget( self ) ) - { - target_remove( self ); - } + self notify( "desintation reached" ); + self notify( "leaving" ); + + if ( hardpointtype == "helicopter_player_gunner_mp" ) + self thread playpilotdialog( "a10_leave", 2.5 ); + else + self thread playpilotdialog( "attackheli_leave", 2.5 ); + + self clear_client_flags(); + leavenode = getvalidrandomleavenode( self.origin ); + heli_reset(); + self clearlookatent(); + exitangles = vectortoangles( leavenode.origin - self.origin ); + self setgoalyaw( exitangles[1] ); + wait 1.5; + + if ( !isdefined( self ) ) + return; + + self setspeed( 180, 65 ); + self setvehgoalpos( self.origin + ( leavenode.origin - self.origin ) / 2 + vectorscale( ( 0, 0, 1 ), 1000.0 ) ); + + self waittill( "near_goal" ); + + self setvehgoalpos( leavenode.origin, 1 ); + + self waittillmatch( "goal" ); + + self stoploopsound( 1 ); + self death_notify_wrapper(); + + if ( isdefined( self.alarm_snd_ent ) ) + { + self.alarm_snd_ent stoploopsound(); + self.alarm_snd_ent delete(); + self.alarm_snd_ent = undefined; + } + + if ( target_istarget( self ) ) + target_remove( self ); /# - assert( isDefined( self.destroyfunc ) ); + assert( isdefined( self.destroyfunc ) ); #/ - self [[ self.destroyfunc ]](); + self [[ self.destroyfunc ]](); } heli_fly( currentnode, startwait, hardpointtype ) { - self endon( "death" ); - self endon( "leaving" ); - self notify( "flying" ); - self endon( "flying" ); - self endon( "abandoned" ); - self.reached_dest = 0; - heli_reset(); - pos = self.origin; - wait startwait; - while ( isDefined( currentnode.target ) ) - { - nextnode = getent( currentnode.target, "targetname" ); + self endon( "death" ); + self endon( "leaving" ); + self notify( "flying" ); + self endon( "flying" ); + self endon( "abandoned" ); + self.reached_dest = 0; + heli_reset(); + pos = self.origin; + wait( startwait ); + + while ( isdefined( currentnode.target ) ) + { + nextnode = getent( currentnode.target, "targetname" ); /# - assert( isDefined( nextnode ), "Next node in path is undefined, but has targetname" ); + assert( isdefined( nextnode ), "Next node in path is undefined, but has targetname" ); #/ - pos = nextnode.origin + vectorScale( ( 1, 1, 1 ), 30 ); - if ( isDefined( currentnode.script_airspeed ) && isDefined( currentnode.script_accel ) ) - { - heli_speed = currentnode.script_airspeed; - heli_accel = currentnode.script_accel; - } - else - { - heli_speed = 30 + randomint( 20 ); - heli_accel = 10 + randomint( 5 ); - } - if ( isDefined( self.pathspeedscale ) ) - { - heli_speed *= self.pathspeedscale; - heli_accel *= self.pathspeedscale; - } - if ( !isDefined( nextnode.target ) ) - { - stop = 1; - } - else - { - stop = 0; - } - debug_line( currentnode.origin, nextnode.origin, ( 1, 0,5, 0,5 ), 200 ); - if ( self.currentstate == "heavy smoke" || self.currentstate == "light smoke" ) - { - self setspeed( heli_speed, heli_accel ); - self setvehgoalpos( pos, stop ); - self waittill( "near_goal" ); - self notify( "path start" ); - } - else - { - if ( isDefined( nextnode.script_delay ) && !isDefined( self.donotstop ) ) - { - stop = 1; - } - self setspeed( heli_speed, heli_accel ); - self setvehgoalpos( pos, stop ); - if ( !isDefined( nextnode.script_delay ) || isDefined( self.donotstop ) ) - { - self waittill( "near_goal" ); - self notify( "path start" ); - break; - } - else - { - self setgoalyaw( nextnode.angles[ 1 ] ); - self waittillmatch( "goal" ); - return; - heli_wait( nextnode.script_delay ); - } - } - index = 0; - while ( index < level.heli_loop_paths.size ) - { - if ( level.heli_loop_paths[ index ].origin == nextnode.origin ) - { - self.loopcount++; - } - index++; - } - if ( self.loopcount >= level.heli_loopmax ) - { - self thread heli_leave( hardpointtype ); - return; - } - currentnode = nextnode; - } - self setgoalyaw( currentnode.angles[ 1 ] ); - self.reached_dest = 1; - self notify( "destination reached" ); - if ( isDefined( self.waittime ) && self.waittime > 0 ) - { - heli_wait( self.waittime ); - } - if ( isDefined( self ) ) - { - self thread heli_evasive( hardpointtype ); - } + pos = nextnode.origin + vectorscale( ( 0, 0, 1 ), 30.0 ); + + if ( isdefined( currentnode.script_airspeed ) && isdefined( currentnode.script_accel ) ) + { + heli_speed = currentnode.script_airspeed; + heli_accel = currentnode.script_accel; + } + else + { + heli_speed = 30 + randomint( 20 ); + heli_accel = 10 + randomint( 5 ); + } + + if ( isdefined( self.pathspeedscale ) ) + { + heli_speed *= self.pathspeedscale; + heli_accel *= self.pathspeedscale; + } + + if ( !isdefined( nextnode.target ) ) + stop = 1; + else + stop = 0; + + debug_line( currentnode.origin, nextnode.origin, ( 1, 0.5, 0.5 ), 200 ); + + if ( self.currentstate == "heavy smoke" || self.currentstate == "light smoke" ) + { + self setspeed( heli_speed, heli_accel ); + self setvehgoalpos( pos, stop ); + + self waittill( "near_goal" ); + + self notify( "path start" ); + } + else + { + if ( isdefined( nextnode.script_delay ) && !isdefined( self.donotstop ) ) + stop = 1; + + self setspeed( heli_speed, heli_accel ); + self setvehgoalpos( pos, stop ); + + if ( !isdefined( nextnode.script_delay ) || isdefined( self.donotstop ) ) + { + self waittill( "near_goal" ); + + self notify( "path start" ); + } + else + { + self setgoalyaw( nextnode.angles[1] ); + + self waittillmatch( "goal" ); + + heli_wait( nextnode.script_delay ); + } + } + + for ( index = 0; index < level.heli_loop_paths.size; index++ ) + { + if ( level.heli_loop_paths[index].origin == nextnode.origin ) + self.loopcount++; + } + + if ( self.loopcount >= level.heli_loopmax ) + { + self thread heli_leave( hardpointtype ); + return; + } + + currentnode = nextnode; + } + + self setgoalyaw( currentnode.angles[1] ); + self.reached_dest = 1; + self notify( "destination reached" ); + + if ( isdefined( self.waittime ) && self.waittime > 0 ) + heli_wait( self.waittime ); + + if ( isdefined( self ) ) + self thread heli_evasive( hardpointtype ); } heli_random_point_in_radius( protectdest, nodeheight ) { - min_distance = int( level.heli_protect_radius * 0,2 ); - direction = randomintrange( 0, 360 ); - distance = randomintrange( min_distance, level.heli_protect_radius ); - x = cos( direction ); - y = sin( direction ); - x *= distance; - y *= distance; - return ( protectdest[ 0 ] + x, protectdest[ 1 ] + y, nodeheight ); + min_distance = int( level.heli_protect_radius * 0.2 ); + direction = randomintrange( 0, 360 ); + distance = randomintrange( min_distance, level.heli_protect_radius ); + x = cos( direction ); + y = sin( direction ); + x *= distance; + y *= distance; + return ( protectdest[0] + x, protectdest[1] + y, nodeheight ); } heli_get_protect_spot( protectdest, nodeheight ) { - protect_spot = heli_random_point_in_radius( protectdest, nodeheight ); - tries = 10; - noflyzone = crossesnoflyzone( protectdest, protect_spot ); - while ( tries != 0 && isDefined( noflyzone ) ) - { - protect_spot = heli_random_point_in_radius( protectdest, nodeheight ); - tries--; + protect_spot = heli_random_point_in_radius( protectdest, nodeheight ); + tries = 10; - noflyzone = crossesnoflyzone( protectdest, protect_spot ); - } - noflyzoneheight = getnoflyzoneheightcrossed( protectdest, protect_spot, nodeheight ); - return ( protect_spot[ 0 ], protect_spot[ 1 ], noflyzoneheight ); + for ( noflyzone = crossesnoflyzone( protectdest, protect_spot ); tries != 0 && isdefined( noflyzone ); noflyzone = crossesnoflyzone( protectdest, protect_spot ) ) + { + protect_spot = heli_random_point_in_radius( protectdest, nodeheight ); + tries--; + } + + noflyzoneheight = getnoflyzoneheightcrossed( protectdest, protect_spot, nodeheight ); + return ( protect_spot[0], protect_spot[1], noflyzoneheight ); } wait_or_waittill( time, msg1, msg2 ) { - self endon( msg1 ); - self endon( msg2 ); - wait time; - return 1; + self endon( msg1 ); + self endon( msg2 ); + wait( time ); + return 1; } set_heli_speed_normal() { - self setmaxpitchroll( 30, 30 ); - heli_speed = 30 + randomint( 20 ); - heli_accel = 10 + randomint( 5 ); - self setspeed( heli_speed, heli_accel ); - self setyawspeed( 75, 45, 45 ); + self setmaxpitchroll( 30, 30 ); + heli_speed = 30 + randomint( 20 ); + heli_accel = 10 + randomint( 5 ); + self setspeed( heli_speed, heli_accel ); + self setyawspeed( 75, 45, 45 ); } set_heli_speed_evasive() { - self setmaxpitchroll( 30, 90 ); - heli_speed = 50 + randomint( 20 ); - heli_accel = 30 + randomint( 5 ); - self setspeed( heli_speed, heli_accel ); - self setyawspeed( 100, 75, 75 ); + self setmaxpitchroll( 30, 90 ); + heli_speed = 50 + randomint( 20 ); + heli_accel = 30 + randomint( 5 ); + self setspeed( heli_speed, heli_accel ); + self setyawspeed( 100, 75, 75 ); } set_heli_speed_hover() { - self setmaxpitchroll( 0, 90 ); - self setspeed( 20, 10 ); - self setyawspeed( 55, 25, 25 ); + self setmaxpitchroll( 0, 90 ); + self setspeed( 20, 10 ); + self setyawspeed( 55, 25, 25 ); } is_targeted() { - if ( isDefined( self.locking_on ) && self.locking_on ) - { - return 1; - } - if ( isDefined( self.locked_on ) && self.locked_on ) - { - return 1; - } - return 0; + if ( isdefined( self.locking_on ) && self.locking_on ) + return true; + + if ( isdefined( self.locked_on ) && self.locked_on ) + return true; + + return false; } heli_mobilespawn( protectdest ) { - self endon( "death" ); - self notify( "flying" ); - self endon( "flying" ); - self endon( "abandoned" ); - iprintlnbold( "PROTECT ORIGIN: (" + protectdest[ 0 ] + "," + protectdest[ 1 ] + "," + protectdest[ 2 ] + ")\n" ); - heli_reset(); - self sethoverparams( 50, 100, 50 ); - wait 2; - set_heli_speed_normal(); - self setvehgoalpos( protectdest, 1 ); - self waittill( "near_goal" ); - set_heli_speed_hover(); + self endon( "death" ); + self notify( "flying" ); + self endon( "flying" ); + self endon( "abandoned" ); + iprintlnbold( "PROTECT ORIGIN: (" + protectdest[0] + "," + protectdest[1] + "," + protectdest[2] + ")\n" ); + heli_reset(); + self sethoverparams( 50, 100, 50 ); + wait 2; + set_heli_speed_normal(); + self setvehgoalpos( protectdest, 1 ); + + self waittill( "near_goal" ); + + set_heli_speed_hover(); } heli_protect( startnode, protectdest, hardpointtype, heli_team ) { - self endon( "death" ); - self notify( "flying" ); - self endon( "flying" ); - self endon( "abandoned" ); - self.reached_dest = 0; - heli_reset(); - self sethoverparams( 50, 100, 50 ); - wait 2; - currentdest = protectdest; - nodeheight = protectdest[ 2 ]; - nextnode = startnode; - heightoffset = 0; - if ( heli_team == "axis" ) - { - heightoffset = 800; - } - protectdest = ( protectdest[ 0 ], protectdest[ 1 ], nodeheight ); - noflyzoneheight = getnoflyzoneheight( protectdest ); - protectdest = ( protectdest[ 0 ], protectdest[ 1 ], noflyzoneheight + heightoffset ); - currentdest = protectdest; - starttime = getTime(); - endtime = starttime + ( level.heli_protect_time * 1000 ); - self setspeed( 150, 80 ); - self setvehgoalpos( self.origin + ( ( currentdest - self.origin ) / 3 ) + vectorScale( ( 1, 1, 1 ), 1000 ) ); - self waittill( "near_goal" ); - heli_speed = 30 + randomint( 20 ); - heli_accel = 10 + randomint( 5 ); - self thread updatetargetyaw(); - mapenter = 1; - while ( getTime() < endtime ) - { - stop = 1; - if ( !mapenter ) - { - self updatespeed(); - } - else - { - mapenter = 0; - } - self setvehgoalpos( currentdest, stop ); - self thread updatespeedonlock(); - self waittill_any( "near_goal", "locking on" ); - maps/mp/gametypes/_hostmigration::waittillhostmigrationdone(); - self notify( "path start" ); - if ( !self is_targeted() ) - { - waittillframeend; - time = level.heli_protect_pos_time; - if ( self.evasive == 1 ) - { - time = 2; - } - set_heli_speed_hover(); - wait_or_waittill( time, "locking on", "damage state" ); - } - prevdest = currentdest; - currentdest = heli_get_protect_spot( protectdest, nodeheight ); - noflyzoneheight = getnoflyzoneheight( currentdest ); - currentdest = ( currentdest[ 0 ], currentdest[ 1 ], noflyzoneheight + heightoffset ); - noflyzones = crossesnoflyzones( prevdest, currentdest ); - if ( isDefined( noflyzones ) && noflyzones.size > 0 ) - { - currentdest = prevdest; - } - } - self thread heli_leave( hardpointtype ); + self endon( "death" ); + self notify( "flying" ); + self endon( "flying" ); + self endon( "abandoned" ); + self.reached_dest = 0; + heli_reset(); + self sethoverparams( 50, 100, 50 ); + wait 2; + currentdest = protectdest; + nodeheight = protectdest[2]; + nextnode = startnode; + heightoffset = 0; + + if ( heli_team == "axis" ) + heightoffset = 800; + + protectdest = ( protectdest[0], protectdest[1], nodeheight ); + noflyzoneheight = getnoflyzoneheight( protectdest ); + protectdest = ( protectdest[0], protectdest[1], noflyzoneheight + heightoffset ); + currentdest = protectdest; + starttime = gettime(); + endtime = starttime + level.heli_protect_time * 1000; + self setspeed( 150, 80 ); + self setvehgoalpos( self.origin + ( currentdest - self.origin ) / 3 + vectorscale( ( 0, 0, 1 ), 1000.0 ) ); + + self waittill( "near_goal" ); + + heli_speed = 30 + randomint( 20 ); + heli_accel = 10 + randomint( 5 ); + self thread updatetargetyaw(); + mapenter = 1; + + while ( gettime() < endtime ) + { + stop = 1; + + if ( !mapenter ) + self updatespeed(); + else + mapenter = 0; + + self setvehgoalpos( currentdest, stop ); + self thread updatespeedonlock(); + self waittill_any( "near_goal", "locking on" ); + maps\mp\gametypes\_hostmigration::waittillhostmigrationdone(); + self notify( "path start" ); + + if ( !self is_targeted() ) + { + waittillframeend; + time = level.heli_protect_pos_time; + + if ( self.evasive == 1 ) + time = 2.0; + + set_heli_speed_hover(); + wait_or_waittill( time, "locking on", "damage state" ); + } + + prevdest = currentdest; + currentdest = heli_get_protect_spot( protectdest, nodeheight ); + noflyzoneheight = getnoflyzoneheight( currentdest ); + currentdest = ( currentdest[0], currentdest[1], noflyzoneheight + heightoffset ); + noflyzones = crossesnoflyzones( prevdest, currentdest ); + + if ( isdefined( noflyzones ) && noflyzones.size > 0 ) + currentdest = prevdest; + } + + self thread heli_leave( hardpointtype ); } updatespeedonlock() { - self endon( "death" ); - self endon( "crashing" ); - self endon( "leaving" ); - self waittill_any( "near_goal", "locking on" ); - self updatespeed(); + self endon( "death" ); + self endon( "crashing" ); + self endon( "leaving" ); + self waittill_any( "near_goal", "locking on" ); + self updatespeed(); } updatespeed() { - if ( self is_targeted() || isDefined( self.evasive ) && self.evasive ) - { - set_heli_speed_evasive(); - } - else - { - set_heli_speed_normal(); - } + if ( self is_targeted() || isdefined( self.evasive ) && self.evasive ) + set_heli_speed_evasive(); + else + set_heli_speed_normal(); } updatetargetyaw() { - self notify( "endTargetYawUpdate" ); - self endon( "death" ); - self endon( "crashing" ); - self endon( "leaving" ); - self endon( "endTargetYawUpdate" ); - for ( ;; ) - { - if ( isDefined( self.primarytarget ) ) - { - yaw = get2dyaw( self.origin, self.primarytarget.origin ); - self settargetyaw( yaw ); - } - wait 1; - } + self notify( "endTargetYawUpdate" ); + self endon( "death" ); + self endon( "crashing" ); + self endon( "leaving" ); + self endon( "endTargetYawUpdate" ); + + for (;;) + { + if ( isdefined( self.primarytarget ) ) + { + yaw = get2dyaw( self.origin, self.primarytarget.origin ); + self settargetyaw( yaw ); + } + + wait 1; + } } fire_missile( smissiletype, ishots, etarget ) { - if ( !isDefined( ishots ) ) - { - ishots = 1; - } + if ( !isdefined( ishots ) ) + ishots = 1; /# - assert( self.health > 0 ); + assert( self.health > 0 ); #/ - weaponname = undefined; - weaponshoottime = undefined; - tags = []; - switch( smissiletype ) - { - case "ffar": - weaponname = "hind_FFAR_mp"; - tags[ 0 ] = "tag_store_r_2"; - break; - default: + weaponname = undefined; + weaponshoottime = undefined; + tags = []; + + switch ( smissiletype ) + { + case "ffar": + weaponname = "hind_FFAR_mp"; + tags[0] = "tag_store_r_2"; + break; + default: /# - assertmsg( "Invalid missile type specified. Must be ffar" ); + assertmsg( "Invalid missile type specified. Must be ffar" ); #/ - break; - } + break; + } /# - assert( isDefined( weaponname ) ); + assert( isdefined( weaponname ) ); #/ /# - assert( tags.size > 0 ); + assert( tags.size > 0 ); #/ - weaponshoottime = weaponfiretime( weaponname ); + weaponshoottime = weaponfiretime( weaponname ); /# - assert( isDefined( weaponshoottime ) ); + assert( isdefined( weaponshoottime ) ); #/ - self setvehweapon( weaponname ); - nextmissiletag = -1; - i = 0; - while ( i < ishots ) - { - nextmissiletag++; - if ( nextmissiletag >= tags.size ) - { - nextmissiletag = 0; - } - if ( isDefined( etarget ) ) - { - emissile = self fireweapon( tags[ nextmissiletag ], etarget ); - } - else - { - emissile = self fireweapon( tags[ nextmissiletag ] ); - } - emissile.killcament = self; - self.lastrocketfiretime = getTime(); - if ( i < ( ishots - 1 ) ) - { - wait weaponshoottime; - } - i++; - } + self setvehweapon( weaponname ); + nextmissiletag = -1; + + for ( i = 0; i < ishots; i++ ) + { + nextmissiletag++; + + if ( nextmissiletag >= tags.size ) + nextmissiletag = 0; + + if ( isdefined( etarget ) ) + emissile = self fireweapon( tags[nextmissiletag], etarget ); + else + emissile = self fireweapon( tags[nextmissiletag] ); + + emissile.killcament = self; + self.lastrocketfiretime = gettime(); + + if ( i < ishots - 1 ) + wait( weaponshoottime ); + } } check_owner( hardpointtype ) { - if ( isDefined( self.owner ) || !isDefined( self.owner.team ) && self.owner.team != self.team ) - { - self notify( "abandoned" ); - self thread heli_leave( hardpointtype ); - } + if ( !isdefined( self.owner ) || !isdefined( self.owner.team ) || self.owner.team != self.team ) + { + self notify( "abandoned" ); + self thread heli_leave( hardpointtype ); + } } attack_targets( missilesenabled, hardpointtype ) { - self thread attack_primary( hardpointtype ); - if ( missilesenabled ) - { - self thread attack_secondary( hardpointtype ); - } + self thread attack_primary( hardpointtype ); + + if ( missilesenabled ) + self thread attack_secondary( hardpointtype ); } attack_secondary( hardpointtype ) { - self endon( "death" ); - self endon( "crashing" ); - self endon( "leaving" ); - for ( ;; ) - { - if ( isDefined( self.secondarytarget ) ) - { - self.secondarytarget.antithreat = undefined; - self.missiletarget = self.secondarytarget; - antithreat = 0; - while ( isDefined( self.missiletarget ) && isalive( self.missiletarget ) ) - { - if ( self target_cone_check( self.missiletarget, level.heli_missile_target_cone ) ) - { - self thread missile_support( self.missiletarget, level.heli_missile_rof, 1, undefined ); - } - else - { - } - antithreat += 100; - self.missiletarget.antithreat = antithreat; - wait level.heli_missile_rof; - if ( !isDefined( self.secondarytarget ) || isDefined( self.secondarytarget ) && self.missiletarget != self.secondarytarget ) - { - break; - } - else } - if ( isDefined( self.missiletarget ) ) - { - self.missiletarget.antithreat = undefined; - } - } - self waittill( "secondary acquired" ); - self check_owner( hardpointtype ); - } + self endon( "death" ); + self endon( "crashing" ); + self endon( "leaving" ); + + for (;;) + { + if ( isdefined( self.secondarytarget ) ) + { + self.secondarytarget.antithreat = undefined; + self.missiletarget = self.secondarytarget; + antithreat = 0; + + while ( isdefined( self.missiletarget ) && isalive( self.missiletarget ) ) + { + if ( self target_cone_check( self.missiletarget, level.heli_missile_target_cone ) ) + self thread missile_support( self.missiletarget, level.heli_missile_rof, 1, undefined ); + else + break; + + antithreat += 100; + self.missiletarget.antithreat = antithreat; + wait( level.heli_missile_rof ); + + if ( !isdefined( self.secondarytarget ) || isdefined( self.secondarytarget ) && self.missiletarget != self.secondarytarget ) + break; + } + + if ( isdefined( self.missiletarget ) ) + self.missiletarget.antithreat = undefined; + } + + self waittill( "secondary acquired" ); + + self check_owner( hardpointtype ); + } } turret_target_check( turrettarget, attackangle ) { - targetyaw = get2dyaw( self.origin, turrettarget.origin ); - chopperyaw = self.angles[ 1 ]; - if ( targetyaw < 0 ) - { - targetyaw *= -1; - } - targetyaw = int( targetyaw ) % 360; - if ( chopperyaw < 0 ) - { - chopperyaw *= -1; - } - chopperyaw = int( chopperyaw ) % 360; - if ( chopperyaw > targetyaw ) - { - difference = chopperyaw - targetyaw; - } - else - { - difference = targetyaw - chopperyaw; - } - return difference <= attackangle; + targetyaw = get2dyaw( self.origin, turrettarget.origin ); + chopperyaw = self.angles[1]; + + if ( targetyaw < 0 ) + targetyaw *= -1; + + targetyaw = int( targetyaw ) % 360; + + if ( chopperyaw < 0 ) + chopperyaw *= -1; + + chopperyaw = int( chopperyaw ) % 360; + + if ( chopperyaw > targetyaw ) + difference = chopperyaw - targetyaw; + else + difference = targetyaw - chopperyaw; + + return difference <= attackangle; } target_cone_check( target, conecosine ) { - heli2target_normal = vectornormalize( target.origin - self.origin ); - heli2forward = anglesToForward( self.angles ); - heli2forward_normal = vectornormalize( heli2forward ); - heli_dot_target = vectordot( heli2target_normal, heli2forward_normal ); - if ( heli_dot_target >= conecosine ) - { - debug_print3d_simple( "Cone sight: " + heli_dot_target, self, vectorScale( ( 1, 1, 1 ), 40 ), 40 ); - return 1; - } - return 0; + heli2target_normal = vectornormalize( target.origin - self.origin ); + heli2forward = anglestoforward( self.angles ); + heli2forward_normal = vectornormalize( heli2forward ); + heli_dot_target = vectordot( heli2target_normal, heli2forward_normal ); + + if ( heli_dot_target >= conecosine ) + { + debug_print3d_simple( "Cone sight: " + heli_dot_target, self, vectorscale( ( 0, 0, -1 ), 40.0 ), 40 ); + return true; + } + + return false; } missile_valid_target_check( missiletarget ) { - heli2target_normal = vectornormalize( missiletarget.origin - self.origin ); - heli2forward = anglesToForward( self.angles ); - heli2forward_normal = vectornormalize( heli2forward ); - heli_dot_target = vectordot( heli2target_normal, heli2forward_normal ); - if ( heli_dot_target >= level.heli_valid_target_cone ) - { - return 1; - } - return 0; + heli2target_normal = vectornormalize( missiletarget.origin - self.origin ); + heli2forward = anglestoforward( self.angles ); + heli2forward_normal = vectornormalize( heli2forward ); + heli_dot_target = vectordot( heli2target_normal, heli2forward_normal ); + + if ( heli_dot_target >= level.heli_valid_target_cone ) + return true; + + return false; } missile_support( target_player, rof, instantfire, endon_notify ) { - self endon( "death" ); - self endon( "crashing" ); - self endon( "leaving" ); - if ( isDefined( endon_notify ) ) - { - self endon( endon_notify ); - } - self.turret_giveup = 0; - if ( !instantfire ) - { - wait rof; - self.turret_giveup = 1; - self notify( "give up" ); - } - if ( isDefined( target_player ) ) - { - if ( level.teambased ) - { - i = 0; - while ( i < level.players.size ) - { - player = level.players[ i ]; - if ( isDefined( player.team ) && player.team == self.team && distance( player.origin, target_player.origin ) <= level.heli_missile_friendlycare ) - { - debug_print3d_simple( "Missile omitted due to nearby friendly", self, vectorScale( ( 1, 1, 1 ), 80 ), 40 ); - self notify( "missile ready" ); - return; - } - i++; - } - } - else player = self.owner; - if ( isDefined( player ) && isDefined( player.team ) && player.team == self.team && distance( player.origin, target_player.origin ) <= level.heli_missile_friendlycare ) - { - debug_print3d_simple( "Missile omitted due to nearby friendly", self, vectorScale( ( 1, 1, 1 ), 80 ), 40 ); - self notify( "missile ready" ); - return; - } - } - if ( self.missile_ammo > 0 && isDefined( target_player ) ) - { - self fire_missile( "ffar", 1, target_player ); - self.missile_ammo--; + self endon( "death" ); + self endon( "crashing" ); + self endon( "leaving" ); - self notify( "missile fired" ); - } - else - { - return; - } - if ( instantfire ) - { - wait rof; - self notify( "missile ready" ); - } + if ( isdefined( endon_notify ) ) + self endon( endon_notify ); + + self.turret_giveup = 0; + + if ( !instantfire ) + { + wait( rof ); + self.turret_giveup = 1; + self notify( "give up" ); + } + + if ( isdefined( target_player ) ) + { + if ( level.teambased ) + { + for ( i = 0; i < level.players.size; i++ ) + { + player = level.players[i]; + + if ( isdefined( player.team ) && player.team == self.team && distance( player.origin, target_player.origin ) <= level.heli_missile_friendlycare ) + { + debug_print3d_simple( "Missile omitted due to nearby friendly", self, vectorscale( ( 0, 0, -1 ), 80.0 ), 40 ); + self notify( "missile ready" ); + return; + } + } + } + else + { + player = self.owner; + + if ( isdefined( player ) && isdefined( player.team ) && player.team == self.team && distance( player.origin, target_player.origin ) <= level.heli_missile_friendlycare ) + { + debug_print3d_simple( "Missile omitted due to nearby friendly", self, vectorscale( ( 0, 0, -1 ), 80.0 ), 40 ); + self notify( "missile ready" ); + return; + } + } + } + + if ( self.missile_ammo > 0 && isdefined( target_player ) ) + { + self fire_missile( "ffar", 1, target_player ); + self.missile_ammo--; + self notify( "missile fired" ); + } + else + return; + + if ( instantfire ) + { + wait( rof ); + self notify( "missile ready" ); + } } attack_primary( hardpointtype ) { - self endon( "death" ); - self endon( "crashing" ); - self endon( "leaving" ); - level endon( "game_ended" ); - for ( ;; ) - { - if ( isDefined( self.primarytarget ) ) - { - self.primarytarget.antithreat = undefined; - self.turrettarget = self.primarytarget; - antithreat = 0; - last_pos = undefined; - while ( isDefined( self.turrettarget ) && isalive( self.turrettarget ) ) - { - if ( hardpointtype == "helicopter_comlink_mp" ) - { - self setlookatent( self.turrettarget ); - } - helicopterturretmaxangle = heli_get_dvar_int( "scr_helicopterTurretMaxAngle", level.helicopterturretmaxangle ); - while ( isDefined( self.turrettarget ) && isalive( self.turrettarget ) && self turret_target_check( self.turrettarget, helicopterturretmaxangle ) == 0 ) - { - wait 0,1; - } - if ( !isDefined( self.turrettarget ) || !isalive( self.turrettarget ) ) - { - break; - } - else - { - self setturrettargetent( self.turrettarget, vectorScale( ( 1, 1, 1 ), 50 ) ); - self waittill( "turret_on_target" ); - maps/mp/gametypes/_hostmigration::waittillhostmigrationdone(); - self notify( "turret_on_target" ); - if ( !self.pilotistalking ) - { - self thread playpilotdialog( "attackheli_target" ); - } - self thread turret_target_flag( self.turrettarget ); - wait level.heli_turret_spinup_delay; - weaponshoottime = weaponfiretime( self.defaultweapon ); - self setvehweapon( self.defaultweapon ); - i = 0; - while ( i < level.heli_turretclipsize ) - { - if ( isDefined( self.turrettarget ) && isDefined( self.primarytarget ) ) - { - if ( self.primarytarget != self.turrettarget ) - { - self setturrettargetent( self.primarytarget, vectorScale( ( 1, 1, 1 ), 40 ) ); - } - } - else - { - if ( isDefined( self.targetlost ) && self.targetlost && isDefined( self.turret_last_pos ) ) - { - self setturrettargetvec( self.turret_last_pos ); - break; - } - else - { - self clearturrettarget(); - } - } - if ( getTime() != self.lastrocketfiretime ) - { - self setvehweapon( self.defaultweapon ); - minigun = self fireweapon( "tag_flash" ); - } - if ( i < ( level.heli_turretclipsize - 1 ) ) - { - wait weaponshoottime; - } - i++; - } - self notify( "turret reloading" ); - wait level.heli_turretreloadtime; - if ( isDefined( self.turrettarget ) && isalive( self.turrettarget ) ) - { - antithreat += 100; - self.turrettarget.antithreat = antithreat; - } - if ( !isDefined( self.primarytarget ) || isDefined( self.turrettarget ) && isDefined( self.primarytarget ) && self.primarytarget != self.turrettarget ) - { - break; - } - else - { - } - } - } - if ( isDefined( self.turrettarget ) ) - { - self.turrettarget.antithreat = undefined; - } - } - self waittill( "primary acquired" ); - self check_owner( hardpointtype ); - } + self endon( "death" ); + self endon( "crashing" ); + self endon( "leaving" ); + level endon( "game_ended" ); + + for (;;) + { + if ( isdefined( self.primarytarget ) ) + { + self.primarytarget.antithreat = undefined; + self.turrettarget = self.primarytarget; + antithreat = 0; + last_pos = undefined; + + while ( isdefined( self.turrettarget ) && isalive( self.turrettarget ) ) + { + if ( hardpointtype == "helicopter_comlink_mp" ) + self setlookatent( self.turrettarget ); + + helicopterturretmaxangle = heli_get_dvar_int( "scr_helicopterTurretMaxAngle", level.helicopterturretmaxangle ); + + while ( isdefined( self.turrettarget ) && isalive( self.turrettarget ) && self turret_target_check( self.turrettarget, helicopterturretmaxangle ) == 0 ) + wait 0.1; + + if ( !isdefined( self.turrettarget ) || !isalive( self.turrettarget ) ) + break; + + self setturrettargetent( self.turrettarget, vectorscale( ( 0, 0, 1 ), 50.0 ) ); + + self waittill( "turret_on_target" ); + + maps\mp\gametypes\_hostmigration::waittillhostmigrationdone(); + self notify( "turret_on_target" ); + + if ( !self.pilotistalking ) + self thread playpilotdialog( "attackheli_target" ); + + self thread turret_target_flag( self.turrettarget ); + wait( level.heli_turret_spinup_delay ); + weaponshoottime = weaponfiretime( self.defaultweapon ); + self setvehweapon( self.defaultweapon ); + + for ( i = 0; i < level.heli_turretclipsize; i++ ) + { + if ( isdefined( self.turrettarget ) && isdefined( self.primarytarget ) ) + { + if ( self.primarytarget != self.turrettarget ) + self setturrettargetent( self.primarytarget, vectorscale( ( 0, 0, 1 ), 40.0 ) ); + } + else if ( isdefined( self.targetlost ) && self.targetlost && isdefined( self.turret_last_pos ) ) + self setturrettargetvec( self.turret_last_pos ); + else + self clearturrettarget(); + + if ( gettime() != self.lastrocketfiretime ) + { + self setvehweapon( self.defaultweapon ); + minigun = self fireweapon( "tag_flash" ); + } + + if ( i < level.heli_turretclipsize - 1 ) + wait( weaponshoottime ); + } + + self notify( "turret reloading" ); + wait( level.heli_turretreloadtime ); + + if ( isdefined( self.turrettarget ) && isalive( self.turrettarget ) ) + { + antithreat += 100; + self.turrettarget.antithreat = antithreat; + } + + if ( !isdefined( self.primarytarget ) || isdefined( self.turrettarget ) && isdefined( self.primarytarget ) && self.primarytarget != self.turrettarget ) + break; + } + + if ( isdefined( self.turrettarget ) ) + self.turrettarget.antithreat = undefined; + } + + self waittill( "primary acquired" ); + + self check_owner( hardpointtype ); + } } turret_target_flag( turrettarget ) { - self notify( "flag check is running" ); - self endon( "flag check is running" ); - self endon( "death" ); - self endon( "crashing" ); - self endon( "leaving" ); - self endon( "turret reloading" ); - turrettarget endon( "death" ); - turrettarget endon( "disconnect" ); - self.targetlost = 0; - self.turret_last_pos = undefined; - while ( isDefined( turrettarget ) ) - { - heli_centroid = self.origin + vectorScale( ( 1, 1, 1 ), 160 ); - heli_forward_norm = anglesToForward( self.angles ); - heli_turret_point = heli_centroid + ( 144 * heli_forward_norm ); - sight_rec = turrettarget sightconetrace( heli_turret_point, self ); - if ( sight_rec < level.heli_target_recognition ) - { - break; - } - else - { - wait 0,05; - } - } - if ( isDefined( turrettarget ) && isDefined( turrettarget.origin ) ) - { + self notify( "flag check is running" ); + self endon( "flag check is running" ); + self endon( "death" ); + self endon( "crashing" ); + self endon( "leaving" ); + self endon( "turret reloading" ); + turrettarget endon( "death" ); + turrettarget endon( "disconnect" ); + self.targetlost = 0; + self.turret_last_pos = undefined; + + while ( isdefined( turrettarget ) ) + { + heli_centroid = self.origin + vectorscale( ( 0, 0, -1 ), 160.0 ); + heli_forward_norm = anglestoforward( self.angles ); + heli_turret_point = heli_centroid + 144 * heli_forward_norm; + sight_rec = turrettarget sightconetrace( heli_turret_point, self ); + + if ( sight_rec < level.heli_target_recognition ) + break; + + wait 0.05; + } + + if ( isdefined( turrettarget ) && isdefined( turrettarget.origin ) ) + { /# - assert( isDefined( turrettarget.origin ), "turrettarget.origin is undefined after isdefined check" ); + assert( isdefined( turrettarget.origin ), "turrettarget.origin is undefined after isdefined check" ); #/ - self.turret_last_pos = turrettarget.origin + vectorScale( ( 1, 1, 1 ), 40 ); + self.turret_last_pos = turrettarget.origin + vectorscale( ( 0, 0, 1 ), 40.0 ); /# - assert( isDefined( self.turret_last_pos ), "self.turret_last_pos is undefined after setting it #1" ); + assert( isdefined( self.turret_last_pos ), "self.turret_last_pos is undefined after setting it #1" ); #/ - self setturrettargetvec( self.turret_last_pos ); + self setturrettargetvec( self.turret_last_pos ); /# - assert( isDefined( self.turret_last_pos ), "self.turret_last_pos is undefined after setting it #2" ); + assert( isdefined( self.turret_last_pos ), "self.turret_last_pos is undefined after setting it #2" ); #/ - debug_print3d_simple( "Turret target lost at: " + self.turret_last_pos, self, vectorScale( ( 1, 1, 1 ), 70 ), 60 ); - self.targetlost = 1; - } - else - { - self.targetlost = undefined; - self.turret_last_pos = undefined; - } + debug_print3d_simple( "Turret target lost at: " + self.turret_last_pos, self, vectorscale( ( 0, 0, -1 ), 70.0 ), 60 ); + self.targetlost = 1; + } + else + { + self.targetlost = undefined; + self.turret_last_pos = undefined; + } } debug_print_target() { - if ( isDefined( level.heli_debug ) && level.heli_debug == 1 ) - { - if ( isDefined( self.primarytarget ) && isDefined( self.primarytarget.threatlevel ) ) - { - if ( isDefined( self.primarytarget.type ) && self.primarytarget.type == "dog" ) - { - name = "dog"; - } - else - { - name = self.primarytarget.name; - } - primary_msg = "Primary: " + name + " : " + self.primarytarget.threatlevel; - } - else - { - primary_msg = "Primary: "; - } - if ( isDefined( self.secondarytarget ) && isDefined( self.secondarytarget.threatlevel ) ) - { - if ( isDefined( self.secondarytarget.type ) && self.secondarytarget.type == "dog" ) - { - name = "dog"; - } - else - { - name = self.secondarytarget.name; - } - secondary_msg = "Secondary: " + name + " : " + self.secondarytarget.threatlevel; - } - else - { - secondary_msg = "Secondary: "; - } - frames = int( self.targeting_delay * 20 ) + 1; - thread draw_text( primary_msg, ( 1, 0,6, 0,6 ), self, vectorScale( ( 1, 1, 1 ), 40 ), frames ); - thread draw_text( secondary_msg, ( 1, 0,6, 0,6 ), self, ( 1, 1, 1 ), frames ); - } + if ( isdefined( level.heli_debug ) && level.heli_debug == 1.0 ) + { + if ( isdefined( self.primarytarget ) && isdefined( self.primarytarget.threatlevel ) ) + { + if ( isdefined( self.primarytarget.type ) && self.primarytarget.type == "dog" ) + name = "dog"; + else + name = self.primarytarget.name; + + primary_msg = "Primary: " + name + " : " + self.primarytarget.threatlevel; + } + else + primary_msg = "Primary: "; + + if ( isdefined( self.secondarytarget ) && isdefined( self.secondarytarget.threatlevel ) ) + { + if ( isdefined( self.secondarytarget.type ) && self.secondarytarget.type == "dog" ) + name = "dog"; + else + name = self.secondarytarget.name; + + secondary_msg = "Secondary: " + name + " : " + self.secondarytarget.threatlevel; + } + else + secondary_msg = "Secondary: "; + + frames = int( self.targeting_delay * 20 ) + 1; + thread draw_text( primary_msg, ( 1, 0.6, 0.6 ), self, vectorscale( ( 0, 0, 1 ), 40.0 ), frames ); + thread draw_text( secondary_msg, ( 1, 0.6, 0.6 ), self, ( 0, 0, 0 ), frames ); + } } improved_sightconetrace( helicopter ) { - heli_centroid = helicopter.origin + vectorScale( ( 1, 1, 1 ), 160 ); - heli_forward_norm = anglesToForward( helicopter.angles ); - heli_turret_point = heli_centroid + ( 144 * heli_forward_norm ); - debug_line( heli_turret_point, self.origin, ( 1, 1, 1 ), 5 ); - start = heli_turret_point; - yes = 0; - point = []; - i = 0; - while ( i < 5 ) - { - if ( !isDefined( self ) ) - { - break; - } - else - { - half_height = self.origin + vectorScale( ( 1, 1, 1 ), 36 ); - tovec = start - half_height; - tovec_angles = vectorToAngle( tovec ); - forward_norm = anglesToForward( tovec_angles ); - side_norm = anglesToRight( tovec_angles ); - point[ point.size ] = self.origin + vectorScale( ( 1, 1, 1 ), 36 ); - point[ point.size ] = self.origin + ( side_norm * vectorScale( ( 1, 1, 1 ), 15 ) ) + vectorScale( ( 1, 1, 1 ), 10 ); - point[ point.size ] = self.origin + ( side_norm * vectorScale( ( 1, 1, 1 ), 15 ) ) + vectorScale( ( 1, 1, 1 ), 10 ); - point[ point.size ] = point[ 2 ] + vectorScale( ( 1, 1, 1 ), 64 ); - point[ point.size ] = point[ 1 ] + vectorScale( ( 1, 1, 1 ), 64 ); - debug_line( point[ 1 ], point[ 2 ], ( 1, 1, 1 ), 1 ); - debug_line( point[ 2 ], point[ 3 ], ( 1, 1, 1 ), 1 ); - debug_line( point[ 3 ], point[ 4 ], ( 1, 1, 1 ), 1 ); - debug_line( point[ 4 ], point[ 1 ], ( 1, 1, 1 ), 1 ); - if ( bullettracepassed( start, point[ i ], 1, self ) ) - { - debug_line( start, point[ i ], ( randomint( 10 ) / 10, randomint( 10 ) / 10, randomint( 10 ) / 10 ), 1 ); - yes++; - } - waittillframeend; - i++; - } - } - return yes / 5; + heli_centroid = helicopter.origin + vectorscale( ( 0, 0, -1 ), 160.0 ); + heli_forward_norm = anglestoforward( helicopter.angles ); + heli_turret_point = heli_centroid + 144 * heli_forward_norm; + debug_line( heli_turret_point, self.origin, ( 1, 1, 1 ), 5 ); + start = heli_turret_point; + yes = 0; + point = []; + + for ( i = 0; i < 5; i++ ) + { + if ( !isdefined( self ) ) + break; + + half_height = self.origin + vectorscale( ( 0, 0, 1 ), 36.0 ); + tovec = start - half_height; + tovec_angles = vectortoangles( tovec ); + forward_norm = anglestoforward( tovec_angles ); + side_norm = anglestoright( tovec_angles ); + point[point.size] = self.origin + vectorscale( ( 0, 0, 1 ), 36.0 ); + point[point.size] = self.origin + side_norm * vectorscale( ( 1, 1, 0 ), 15.0 ) + vectorscale( ( 0, 0, 1 ), 10.0 ); + point[point.size] = self.origin + side_norm * vectorscale( ( -1, -1, 0 ), 15.0 ) + vectorscale( ( 0, 0, 1 ), 10.0 ); + point[point.size] = point[2] + vectorscale( ( 0, 0, 1 ), 64.0 ); + point[point.size] = point[1] + vectorscale( ( 0, 0, 1 ), 64.0 ); + debug_line( point[1], point[2], ( 1, 1, 1 ), 1 ); + debug_line( point[2], point[3], ( 1, 1, 1 ), 1 ); + debug_line( point[3], point[4], ( 1, 1, 1 ), 1 ); + debug_line( point[4], point[1], ( 1, 1, 1 ), 1 ); + + if ( bullettracepassed( start, point[i], 1, self ) ) + { + debug_line( start, point[i], ( randomint( 10 ) / 10, randomint( 10 ) / 10, randomint( 10 ) / 10 ), 1 ); + yes++; + } + + waittillframeend; + } + + return yes / 5; } waittill_confirm_location() { - self endon( "emp_jammed" ); - self endon( "emp_grenaded" ); - self waittill( "confirm_location", location ); - return location; + self endon( "emp_jammed" ); + self endon( "emp_grenaded" ); + + self waittill( "confirm_location", location ); + + return location; } selecthelicopterlocation( hardpointtype ) { - self beginlocationcomlinkselection( "compass_objpoint_helicopter", 1500 ); - self.selectinglocation = 1; - self thread endselectionthink(); - location = self waittill_confirm_location(); - if ( !isDefined( location ) ) - { - return 0; - } - if ( self maps/mp/killstreaks/_killstreakrules::iskillstreakallowed( hardpointtype, self.team ) == 0 ) - { - return 0; - } - level.helilocation = location; - return finishhardpointlocationusage( location, ::nullcallback ); + self beginlocationcomlinkselection( "compass_objpoint_helicopter", 1500 ); + self.selectinglocation = 1; + self thread endselectionthink(); + location = self waittill_confirm_location(); + + if ( !isdefined( location ) ) + return 0; + + if ( self maps\mp\killstreaks\_killstreakrules::iskillstreakallowed( hardpointtype, self.team ) == 0 ) + return 0; + + level.helilocation = location; + return finishhardpointlocationusage( location, ::nullcallback ); } nullcallback( arg1, arg2 ) { - return 1; + return 1; } processcopterassist( destroyedcopter, damagedone ) { - self endon( "disconnect" ); - destroyedcopter endon( "disconnect" ); - wait 0,05; - if ( !isDefined( level.teams[ self.team ] ) ) - { - return; - } - if ( self.team == destroyedcopter.team ) - { - return; - } - assist_level = "aircraft_destruction_assist"; - assist_level_value = int( ceil( ( damagedone / destroyedcopter.maxhealth ) * 4 ) ); - if ( assist_level_value > 0 ) - { - if ( assist_level_value > 3 ) - { - assist_level_value = 3; - } - assist_level = ( assist_level + "_" ) + ( assist_level_value * 25 ); - } - maps/mp/_scoreevents::processscoreevent( assist_level, self ); + self endon( "disconnect" ); + destroyedcopter endon( "disconnect" ); + wait 0.05; + + if ( !isdefined( level.teams[self.team] ) ) + return; + + if ( self.team == destroyedcopter.team ) + return; + + assist_level = "aircraft_destruction_assist"; + assist_level_value = int( ceil( damagedone / destroyedcopter.maxhealth * 4 ) ); + + if ( assist_level_value > 0 ) + { + if ( assist_level_value > 3 ) + assist_level_value = 3; + + assist_level = assist_level + "_" + assist_level_value * 25; + } + + maps\mp\_scoreevents::processscoreevent( assist_level, self ); } samturretwatcher() { - self endon( "death" ); - self endon( "crashing" ); - self endon( "leaving" ); - level endon( "game_ended" ); - self waittill_any( "turret_on_target", "path start", "near_goal" ); - target_setturretaquire( self, 1 ); + self endon( "death" ); + self endon( "crashing" ); + self endon( "leaving" ); + level endon( "game_ended" ); + self waittill_any( "turret_on_target", "path start", "near_goal" ); + target_setturretaquire( self, 1 ); } playpilotdialog( dialog, time, voice, shouldwait ) { - self endon( "death" ); - level endon( "remote_end" ); - if ( isDefined( time ) ) - { - wait time; - } - if ( !isDefined( self.pilotvoicenumber ) ) - { - self.pilotvoicenumber = 0; - } - if ( isDefined( voice ) ) - { - voicenumber = voice; - } - else - { - voicenumber = self.pilotvoicenumber; - } - soundalias = level.teamprefix[ self.team ] + voicenumber + "_" + dialog; - if ( isDefined( self.owner ) ) - { - self.owner playpilottalking( shouldwait, soundalias ); - } + self endon( "death" ); + level endon( "remote_end" ); + + if ( isdefined( time ) ) + wait( time ); + + if ( !isdefined( self.pilotvoicenumber ) ) + self.pilotvoicenumber = 0; + + if ( isdefined( voice ) ) + voicenumber = voice; + else + voicenumber = self.pilotvoicenumber; + + soundalias = level.teamprefix[self.team] + voicenumber + "_" + dialog; + + if ( isdefined( self.owner ) ) + self.owner playpilottalking( shouldwait, soundalias ); } playpilottalking( shouldwait, soundalias ) { - self endon( "disconnect" ); - self endon( "joined_team" ); - self endon( "joined_spectators" ); - trycounter = 0; - while ( isDefined( self.pilottalking ) && self.pilottalking && trycounter < 10 ) - { - if ( isDefined( shouldwait ) && !shouldwait ) - { - return; - } - wait 1; - trycounter++; - } - self.pilottalking = 1; - self playlocalsound( soundalias ); - wait 3; - self.pilottalking = 0; + self endon( "disconnect" ); + self endon( "joined_team" ); + self endon( "joined_spectators" ); + + for ( trycounter = 0; isdefined( self.pilottalking ) && self.pilottalking && trycounter < 10; trycounter++ ) + { + if ( isdefined( shouldwait ) && !shouldwait ) + return; + + wait 1; + } + + self.pilottalking = 1; + self playlocalsound( soundalias ); + wait 3; + self.pilottalking = 0; } watchforearlyleave( hardpointtype ) { - self endon( "heli_timeup" ); - self waittill_any( "joined_team", "disconnect" ); - self.heli thread heli_leave( hardpointtype ); - self notify( "heli_timeup" ); + self endon( "heli_timeup" ); + self waittill_any( "joined_team", "disconnect" ); + self.heli thread heli_leave( hardpointtype ); + self notify( "heli_timeup" ); } diff --git a/Multiplayer Core/patch_mp/maps/mp/killstreaks/_helicopter_guard.gsc b/Multiplayer Core/patch_mp/maps/mp/killstreaks/_helicopter_guard.gsc index 1f5c915..a15e662 100644 --- a/Multiplayer Core/patch_mp/maps/mp/killstreaks/_helicopter_guard.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/killstreaks/_helicopter_guard.gsc @@ -1,796 +1,770 @@ -#include maps/mp/gametypes/_hostmigration; -#include maps/mp/_heatseekingmissile; -#include maps/mp/gametypes/_spawning; -#include maps/mp/killstreaks/_helicopter; -#include maps/mp/killstreaks/_killstreakrules; -#include maps/mp/killstreaks/_airsupport; -#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\_airsupport; +#include maps\mp\killstreaks\_killstreakrules; +#include maps\mp\killstreaks\_helicopter; +#include maps\mp\gametypes\_spawning; +#include maps\mp\_heatseekingmissile; +#include maps\mp\gametypes\_hostmigration; init() { - precachestring( &"MP_CIVILIAN_AIR_TRAFFIC" ); - precachestring( &"MP_AIR_SPACE_TOO_CROWDED" ); - precachevehicle( "heli_guard_mp" ); - precachemodel( "veh_t6_drone_overwatch_light" ); - precachemodel( "veh_t6_drone_overwatch_dark" ); - precacheturret( "littlebird_guard_minigun_mp" ); - precachemodel( "veh_iw_littlebird_minigun_left" ); - precachemodel( "veh_iw_littlebird_minigun_right" ); - registerkillstreak( "helicopter_guard_mp", "helicopter_guard_mp", "killstreak_helicopter_guard", "helicopter_used", ::tryuseheliguardsupport, 1 ); - registerkillstreakaltweapon( "helicopter_guard_mp", "littlebird_guard_minigun_mp" ); - registerkillstreakstrings( "helicopter_guard_mp", &"KILLSTREAK_EARNED_HELICOPTER_GUARD", &"KILLSTREAK_HELICOPTER_GUARD_NOT_AVAILABLE", &"KILLSTREAK_HELICOPTER_GUARD_INBOUND" ); - registerkillstreakdialog( "helicopter_guard_mp", "mpl_killstreak_lbguard_strt", "kls_littlebird_used", "", "kls_littlebird_enemy", "", "kls_littlebird_ready" ); - registerkillstreakdevdvar( "helicopter_guard_mp", "scr_givehelicopterguard" ); - setkillstreakteamkillpenaltyscale( "helicopter_guard_mp", 0 ); - shouldtimeout = setdvar( "scr_heli_guard_no_timeout", 0 ); - debuglittlebird = setdvar( "scr_heli_guard_debug", 0 ); - level._effect[ "heli_guard_light" ][ "friendly" ] = loadfx( "light/fx_vlight_mp_escort_eye_grn" ); - level._effect[ "heli_guard_light" ][ "enemy" ] = loadfx( "light/fx_vlight_mp_escort_eye_red" ); + precachestring( &"MP_CIVILIAN_AIR_TRAFFIC" ); + precachestring( &"MP_AIR_SPACE_TOO_CROWDED" ); + precachevehicle( "heli_guard_mp" ); + precachemodel( "veh_t6_drone_overwatch_light" ); + precachemodel( "veh_t6_drone_overwatch_dark" ); + precacheturret( "littlebird_guard_minigun_mp" ); + precachemodel( "veh_iw_littlebird_minigun_left" ); + precachemodel( "veh_iw_littlebird_minigun_right" ); + registerkillstreak( "helicopter_guard_mp", "helicopter_guard_mp", "killstreak_helicopter_guard", "helicopter_used", ::tryuseheliguardsupport, 1 ); + registerkillstreakaltweapon( "helicopter_guard_mp", "littlebird_guard_minigun_mp" ); + registerkillstreakstrings( "helicopter_guard_mp", &"KILLSTREAK_EARNED_HELICOPTER_GUARD", &"KILLSTREAK_HELICOPTER_GUARD_NOT_AVAILABLE", &"KILLSTREAK_HELICOPTER_GUARD_INBOUND" ); + registerkillstreakdialog( "helicopter_guard_mp", "mpl_killstreak_lbguard_strt", "kls_littlebird_used", "", "kls_littlebird_enemy", "", "kls_littlebird_ready" ); + registerkillstreakdevdvar( "helicopter_guard_mp", "scr_givehelicopterguard" ); + setkillstreakteamkillpenaltyscale( "helicopter_guard_mp", 0.0 ); + shouldtimeout = setdvar( "scr_heli_guard_no_timeout", 0 ); + debuglittlebird = setdvar( "scr_heli_guard_debug", 0 ); + level._effect["heli_guard_light"]["friendly"] = loadfx( "light/fx_vlight_mp_escort_eye_grn" ); + level._effect["heli_guard_light"]["enemy"] = loadfx( "light/fx_vlight_mp_escort_eye_red" ); /# - set_dvar_float_if_unset( "scr_lbguard_timeout", 60 ); + set_dvar_float_if_unset( "scr_lbguard_timeout", 60.0 ); #/ - level.heliguardflyovernfz = 0; - if ( level.script == "mp_hydro" ) - { - level.heliguardflyovernfz = 1; - } + level.heliguardflyovernfz = 0; + + if ( level.script == "mp_hydro" ) + level.heliguardflyovernfz = 1; } register() { - registerclientfield( "helicopter", "vehicle_is_firing", 1, 1, "int" ); + registerclientfield( "helicopter", "vehicle_is_firing", 1, 1, "int" ); } tryuseheliguardsupport( lifeid ) { - if ( isDefined( level.civilianjetflyby ) ) - { - self iprintlnbold( &"MP_CIVILIAN_AIR_TRAFFIC" ); - return 0; - } - if ( self isremotecontrolling() ) - { - return 0; - } - if ( !isDefined( level.heli_paths ) || level.heli_paths.size <= 0 ) - { - self iprintlnbold( &"MP_UNAVAILABLE_IN_LEVEL" ); - return 0; - } - killstreak_id = self maps/mp/killstreaks/_killstreakrules::killstreakstart( "helicopter_guard_mp", self.team, 0, 1 ); - if ( killstreak_id == -1 ) - { - return 0; - } - heliguard = createheliguardsupport( lifeid, killstreak_id ); - if ( !isDefined( heliguard ) ) - { - return 0; - } - self thread startheliguardsupport( heliguard, lifeid ); - return 1; + if ( isdefined( level.civilianjetflyby ) ) + { + self iprintlnbold( &"MP_CIVILIAN_AIR_TRAFFIC" ); + return false; + } + + if ( self isremotecontrolling() ) + return false; + + if ( !isdefined( level.heli_paths ) || level.heli_paths.size <= 0 ) + { + self iprintlnbold( &"MP_UNAVAILABLE_IN_LEVEL" ); + return false; + } + + killstreak_id = self maps\mp\killstreaks\_killstreakrules::killstreakstart( "helicopter_guard_mp", self.team, 0, 1 ); + + if ( killstreak_id == -1 ) + return false; + + heliguard = createheliguardsupport( lifeid, killstreak_id ); + + if ( !isdefined( heliguard ) ) + return false; + + self thread startheliguardsupport( heliguard, lifeid ); + return true; } createheliguardsupport( lifeid, killstreak_id ) { - hardpointtype = "helicopter_guard_mp"; - closeststartnode = heliguardsupport_getcloseststartnode( self.origin ); - if ( isDefined( closeststartnode.angles ) ) - { - startang = closeststartnode.angles; - } - else - { - startang = ( 0, 0, 1 ); - } - closestnode = heliguardsupport_getclosestnode( self.origin ); - flyheight = max( self.origin[ 2 ] + 1600, getnoflyzoneheight( self.origin ) ); - forward = anglesToForward( self.angles ); - targetpos = ( ( self.origin * ( 0, 0, 1 ) ) + ( ( 0, 0, 1 ) * flyheight ) ) + ( forward * -100 ); - startpos = closeststartnode.origin; - heliguard = spawnhelicopter( self, startpos, startang, "heli_guard_mp", "veh_t6_drone_overwatch_light" ); - if ( !isDefined( heliguard ) ) - { - return; - } - target_set( heliguard, vectorScale( ( 0, 0, 1 ), 50 ) ); - heliguard setenemymodel( "veh_t6_drone_overwatch_dark" ); - heliguard.speed = 150; - heliguard.followspeed = 40; - heliguard setcandamage( 1 ); - heliguard.owner = self; - heliguard.team = self.team; - heliguard setmaxpitchroll( 45, 45 ); - heliguard setspeed( heliguard.speed, 100, 40 ); - heliguard setyawspeed( 120, 60 ); - heliguard setneargoalnotifydist( 512 ); - heliguard thread heliguardsupport_attacktargets(); - heliguard.killcount = 0; - heliguard.streakname = "littlebird_support"; - heliguard.helitype = "littlebird"; - heliguard.targettingradius = 2000; - heliguard.targetpos = targetpos; - heliguard.currentnode = closestnode; - heliguard.attract_strength = 10000; - heliguard.attract_range = 150; - heliguard.attractor = missile_createattractorent( heliguard, heliguard.attract_strength, heliguard.attract_range ); - heliguard.health = 999999; - heliguard.maxhealth = level.heli_maxhealth; - heliguard.rocketdamageoneshot = heliguard.maxhealth + 1; - heliguard.crashtype = "explode"; - heliguard.destroyfunc = ::lbexplode; - heliguard.targeting_delay = level.heli_targeting_delay; - heliguard.hasdodged = 0; - heliguard setdrawinfrared( 1 ); - self thread maps/mp/killstreaks/_helicopter::announcehelicopterinbound( hardpointtype ); - heliguard thread maps/mp/killstreaks/_helicopter::heli_targeting( 0, hardpointtype ); - heliguard thread maps/mp/killstreaks/_helicopter::heli_damage_monitor( hardpointtype ); - heliguard thread maps/mp/killstreaks/_helicopter::heli_kill_monitor( hardpointtype ); - heliguard thread maps/mp/killstreaks/_helicopter::heli_health( hardpointtype, self, undefined ); - heliguard maps/mp/gametypes/_spawning::create_helicopter_influencers( heliguard.team ); - heliguard thread heliguardsupport_watchtimeout(); - heliguard thread heliguardsupport_watchownerloss(); - heliguard thread heliguardsupport_watchownerdamage(); - heliguard thread heliguardsupport_watchroundend(); - heliguard.numflares = 1; - heliguard.flareoffset = ( 0, 0, 1 ); - heliguard thread maps/mp/_heatseekingmissile::missiletarget_proximitydetonateincomingmissile( "explode", "death" ); - heliguard thread create_flare_ent( vectorScale( ( 0, 0, 1 ), 50 ) ); - heliguard.killstreak_id = killstreak_id; - level.littlebirdguard = heliguard; - return heliguard; + hardpointtype = "helicopter_guard_mp"; + closeststartnode = heliguardsupport_getcloseststartnode( self.origin ); + + if ( isdefined( closeststartnode.angles ) ) + startang = closeststartnode.angles; + else + startang = ( 0, 0, 0 ); + + closestnode = heliguardsupport_getclosestnode( self.origin ); + flyheight = max( self.origin[2] + 1600, getnoflyzoneheight( self.origin ) ); + forward = anglestoforward( self.angles ); + targetpos = self.origin * ( 1, 1, 0 ) + ( 0, 0, 1 ) * flyheight + forward * -100; + startpos = closeststartnode.origin; + heliguard = spawnhelicopter( self, startpos, startang, "heli_guard_mp", "veh_t6_drone_overwatch_light" ); + + if ( !isdefined( heliguard ) ) + return; + + target_set( heliguard, vectorscale( ( 0, 0, -1 ), 50.0 ) ); + heliguard setenemymodel( "veh_t6_drone_overwatch_dark" ); + heliguard.speed = 150; + heliguard.followspeed = 40; + heliguard setcandamage( 1 ); + heliguard.owner = self; + heliguard.team = self.team; + heliguard setmaxpitchroll( 45, 45 ); + heliguard setspeed( heliguard.speed, 100, 40 ); + heliguard setyawspeed( 120, 60 ); + heliguard setneargoalnotifydist( 512 ); + heliguard thread heliguardsupport_attacktargets(); + heliguard.killcount = 0; + heliguard.streakname = "littlebird_support"; + heliguard.helitype = "littlebird"; + heliguard.targettingradius = 2000; + heliguard.targetpos = targetpos; + heliguard.currentnode = closestnode; + heliguard.attract_strength = 10000; + heliguard.attract_range = 150; + heliguard.attractor = missile_createattractorent( heliguard, heliguard.attract_strength, heliguard.attract_range ); + heliguard.health = 999999; + heliguard.maxhealth = level.heli_maxhealth; + heliguard.rocketdamageoneshot = heliguard.maxhealth + 1; + heliguard.crashtype = "explode"; + heliguard.destroyfunc = ::lbexplode; + heliguard.targeting_delay = level.heli_targeting_delay; + heliguard.hasdodged = 0; + heliguard setdrawinfrared( 1 ); + self thread maps\mp\killstreaks\_helicopter::announcehelicopterinbound( hardpointtype ); + heliguard thread maps\mp\killstreaks\_helicopter::heli_targeting( 0, hardpointtype ); + heliguard thread maps\mp\killstreaks\_helicopter::heli_damage_monitor( hardpointtype ); + heliguard thread maps\mp\killstreaks\_helicopter::heli_kill_monitor( hardpointtype ); + heliguard thread maps\mp\killstreaks\_helicopter::heli_health( hardpointtype, self, undefined ); + heliguard maps\mp\gametypes\_spawning::create_helicopter_influencers( heliguard.team ); + heliguard thread heliguardsupport_watchtimeout(); + heliguard thread heliguardsupport_watchownerloss(); + heliguard thread heliguardsupport_watchownerdamage(); + heliguard thread heliguardsupport_watchroundend(); + heliguard.numflares = 1; + heliguard.flareoffset = ( 0, 0, 0 ); + heliguard thread maps\mp\_heatseekingmissile::missiletarget_proximitydetonateincomingmissile( "explode", "death" ); + heliguard thread create_flare_ent( vectorscale( ( 0, 0, -1 ), 50.0 ) ); + heliguard.killstreak_id = killstreak_id; + level.littlebirdguard = heliguard; + return heliguard; } getmeshheight( littlebird, owner ) { - if ( !owner isinsideheightlock() ) - { - return maps/mp/killstreaks/_airsupport::getminimumflyheight(); - } - maxmeshheight = littlebird getheliheightlockheight( owner.origin ); - return max( maxmeshheight, owner.origin[ 2 ] ); + if ( !owner isinsideheightlock() ) + return maps\mp\killstreaks\_airsupport::getminimumflyheight(); + + maxmeshheight = littlebird getheliheightlockheight( owner.origin ); + return max( maxmeshheight, owner.origin[2] ); } startheliguardsupport( littlebird, lifeid ) { - level endon( "game_ended" ); - littlebird endon( "death" ); - littlebird setlookatent( self ); - maxmeshheight = getmeshheight( littlebird, self ); - height = getnoflyzoneheight( ( self.origin[ 0 ], self.origin[ 1 ], maxmeshheight ) ); - playermeshorigin = ( self.origin[ 0 ], self.origin[ 1 ], height ); - vectostart = vectornormalize( littlebird.origin - littlebird.targetpos ); - dist = 1500; - target = littlebird.targetpos + ( vectostart * dist ); - collide = crossesnoflyzone( target, playermeshorigin ); - while ( isDefined( collide ) && dist > 0 ) - { - dist -= 500; - target = littlebird.targetpos + ( vectostart * dist ); - collide = crossesnoflyzone( target, playermeshorigin ); - } - littlebird setvehgoalpos( target, 1 ); - target_setturretaquire( littlebird, 0 ); - littlebird waittill( "near_goal" ); - target_setturretaquire( littlebird, 1 ); - littlebird setvehgoalpos( playermeshorigin, 1 ); - littlebird waittill( "near_goal" ); - littlebird setspeed( littlebird.speed, 80, 30 ); - littlebird waittill( "goal" ); + level endon( "game_ended" ); + littlebird endon( "death" ); + littlebird setlookatent( self ); + maxmeshheight = getmeshheight( littlebird, self ); + height = getnoflyzoneheight( ( self.origin[0], self.origin[1], maxmeshheight ) ); + playermeshorigin = ( self.origin[0], self.origin[1], height ); + vectostart = vectornormalize( littlebird.origin - littlebird.targetpos ); + dist = 1500; + target = littlebird.targetpos + vectostart * dist; + + for ( collide = crossesnoflyzone( target, playermeshorigin ); isdefined( collide ) && dist > 0; collide = crossesnoflyzone( target, playermeshorigin ) ) + { + dist -= 500; + target = littlebird.targetpos + vectostart * dist; + } + + littlebird setvehgoalpos( target, 1 ); + target_setturretaquire( littlebird, 0 ); + + littlebird waittill( "near_goal" ); + + target_setturretaquire( littlebird, 1 ); + littlebird setvehgoalpos( playermeshorigin, 1 ); + + littlebird waittill( "near_goal" ); + + littlebird setspeed( littlebird.speed, 80, 30 ); + + littlebird waittill( "goal" ); /# - if ( getDvar( "scr_heli_guard_debug" ) == "1" ) - { - debug_no_fly_zones(); + if ( getdvar( "scr_heli_guard_debug" ) == "1" ) + debug_no_fly_zones(); #/ - } - littlebird thread heliguardsupport_followplayer(); + littlebird thread heliguardsupport_followplayer(); } heliguardsupport_followplayer() { - level endon( "game_ended" ); - self endon( "death" ); - self endon( "leaving" ); - if ( !isDefined( self.owner ) ) - { - self thread heliguardsupport_leave(); - return; - } - self.owner endon( "disconnect" ); - self.owner endon( "joined_team" ); - self.owner endon( "joined_spectators" ); - self setspeed( self.followspeed, 20, 20 ); - while ( 1 ) - { - if ( isDefined( self.owner ) && isalive( self.owner ) ) - { - heliguardsupport_movetoplayer(); - } - wait 3; - } + level endon( "game_ended" ); + self endon( "death" ); + self endon( "leaving" ); + + if ( !isdefined( self.owner ) ) + { + self thread heliguardsupport_leave(); + return; + } + + self.owner endon( "disconnect" ); + self.owner endon( "joined_team" ); + self.owner endon( "joined_spectators" ); + self setspeed( self.followspeed, 20, 20 ); + + while ( true ) + { + if ( isdefined( self.owner ) && isalive( self.owner ) ) + heliguardsupport_movetoplayer(); + + wait 3; + } } heliguardsupport_movetoplayer() { - level endon( "game_ended" ); - self endon( "death" ); - self endon( "leaving" ); - self.owner endon( "death" ); - self.owner endon( "disconnect" ); - self.owner endon( "joined_team" ); - self.owner endon( "joined_spectators" ); - self notify( "heliGuardSupport_moveToPlayer" ); - self endon( "heliGuardSupport_moveToPlayer" ); - maxmeshheight = getmeshheight( self, self.owner ); - hovergoal = ( self.owner.origin[ 0 ], self.owner.origin[ 1 ], maxmeshheight ); + level endon( "game_ended" ); + self endon( "death" ); + self endon( "leaving" ); + self.owner endon( "death" ); + self.owner endon( "disconnect" ); + self.owner endon( "joined_team" ); + self.owner endon( "joined_spectators" ); + self notify( "heliGuardSupport_moveToPlayer" ); + self endon( "heliGuardSupport_moveToPlayer" ); + maxmeshheight = getmeshheight( self, self.owner ); + hovergoal = ( self.owner.origin[0], self.owner.origin[1], maxmeshheight ); /# - littlebird_debug_line( self.origin, hovergoal, ( 0, 0, 1 ) ); + littlebird_debug_line( self.origin, hovergoal, ( 1, 0, 0 ) ); #/ - zoneindex = crossesnoflyzone( self.origin, hovergoal ); - if ( isDefined( zoneindex ) && level.heliguardflyovernfz ) - { - self.intransit = 1; - noflyzoneheight = getnoflyzoneheightcrossed( hovergoal, self.origin, maxmeshheight ); - self setvehgoalpos( ( hovergoal[ 0 ], hovergoal[ 1 ], noflyzoneheight ), 1 ); - self waittill( "goal" ); - return; - } - if ( isDefined( zoneindex ) ) - { + zoneindex = crossesnoflyzone( self.origin, hovergoal ); + + if ( isdefined( zoneindex ) && level.heliguardflyovernfz ) + { + self.intransit = 1; + noflyzoneheight = getnoflyzoneheightcrossed( hovergoal, self.origin, maxmeshheight ); + self setvehgoalpos( ( hovergoal[0], hovergoal[1], noflyzoneheight ), 1 ); + + self waittill( "goal" ); + + return; + } + + if ( isdefined( zoneindex ) ) + { /# - littlebird_debug_text( "NO FLY ZONE between heli and hoverGoal" ); + littlebird_debug_text( "NO FLY ZONE between heli and hoverGoal" ); #/ - dist = distance2d( self.owner.origin, level.noflyzones[ zoneindex ].origin ); - zoneorgtoplayer2d = self.owner.origin - level.noflyzones[ zoneindex ].origin; - zoneorgtoplayer2d *= ( 0, 0, 1 ); - zoneorgtochopper2d = self.origin - level.noflyzones[ zoneindex ].origin; - zoneorgtochopper2d *= ( 0, 0, 1 ); - zoneorgatmeshheight = ( level.noflyzones[ zoneindex ].origin[ 0 ], level.noflyzones[ zoneindex ].origin[ 1 ], maxmeshheight ); - zoneorgtoadjpos = vectorScale( vectornormalize( zoneorgtoplayer2d ), level.noflyzones[ zoneindex ].radius + 150 ); - adjacentgoalpos = zoneorgtoadjpos + level.noflyzones[ zoneindex ].origin; - adjacentgoalpos = ( adjacentgoalpos[ 0 ], adjacentgoalpos[ 1 ], maxmeshheight ); - zoneorgtoperpendicular = ( zoneorgtoadjpos[ 1 ], zoneorgtoadjpos[ 0 ] * -1, 0 ); - zoneorgtooppositeperpendicular = ( zoneorgtoadjpos[ 1 ] * -1, zoneorgtoadjpos[ 0 ], 0 ); - perpendiculargoalpos = zoneorgtoperpendicular + zoneorgatmeshheight; - oppositeperpendiculargoalpos = zoneorgtooppositeperpendicular + zoneorgatmeshheight; + dist = distance2d( self.owner.origin, level.noflyzones[zoneindex].origin ); + zoneorgtoplayer2d = self.owner.origin - level.noflyzones[zoneindex].origin; + zoneorgtoplayer2d *= ( 1, 1, 0 ); + zoneorgtochopper2d = self.origin - level.noflyzones[zoneindex].origin; + zoneorgtochopper2d *= ( 1, 1, 0 ); + zoneorgatmeshheight = ( level.noflyzones[zoneindex].origin[0], level.noflyzones[zoneindex].origin[1], maxmeshheight ); + zoneorgtoadjpos = vectorscale( vectornormalize( zoneorgtoplayer2d ), level.noflyzones[zoneindex].radius + 150.0 ); + adjacentgoalpos = zoneorgtoadjpos + level.noflyzones[zoneindex].origin; + adjacentgoalpos = ( adjacentgoalpos[0], adjacentgoalpos[1], maxmeshheight ); + zoneorgtoperpendicular = ( zoneorgtoadjpos[1], zoneorgtoadjpos[0] * -1, 0 ); + zoneorgtooppositeperpendicular = ( zoneorgtoadjpos[1] * -1, zoneorgtoadjpos[0], 0 ); + perpendiculargoalpos = zoneorgtoperpendicular + zoneorgatmeshheight; + oppositeperpendiculargoalpos = zoneorgtooppositeperpendicular + zoneorgatmeshheight; /# - littlebird_debug_line( self.origin, perpendiculargoalpos, ( 0, 0, 1 ) ); - littlebird_debug_line( self.origin, oppositeperpendiculargoalpos, ( 0,2, 0,6, 1 ) ); + littlebird_debug_line( self.origin, perpendiculargoalpos, ( 0, 0, 1 ) ); + littlebird_debug_line( self.origin, oppositeperpendiculargoalpos, ( 0.2, 0.6, 1 ) ); #/ - if ( dist < level.noflyzones[ zoneindex ].radius ) - { + if ( dist < level.noflyzones[zoneindex].radius ) + { /# - littlebird_debug_text( "Owner is in a no fly zone, find perimeter hover goal" ); - littlebird_debug_line( self.origin, adjacentgoalpos, ( 0, 0, 1 ) ); + littlebird_debug_text( "Owner is in a no fly zone, find perimeter hover goal" ); + littlebird_debug_line( self.origin, adjacentgoalpos, ( 0, 1, 0 ) ); #/ - zoneindex = undefined; - zoneindex = crossesnoflyzone( self.origin, adjacentgoalpos ); - if ( isDefined( zoneindex ) ) - { + zoneindex = undefined; + zoneindex = crossesnoflyzone( self.origin, adjacentgoalpos ); + + if ( isdefined( zoneindex ) ) + { /# - littlebird_debug_text( "adjacentGoalPos is through no fly zone, move to perpendicular edge of cyl" ); + littlebird_debug_text( "adjacentGoalPos is through no fly zone, move to perpendicular edge of cyl" ); #/ - hovergoal = perpendiculargoalpos; - } - else - { + hovergoal = perpendiculargoalpos; + } + else + { /# - littlebird_debug_text( "adjacentGoalPos is NOT through fly zone, move to edge closest to player" ); + littlebird_debug_text( "adjacentGoalPos is NOT through fly zone, move to edge closest to player" ); #/ - hovergoal = adjacentgoalpos; - } - } - else - { + hovergoal = adjacentgoalpos; + } + } + else + { /# - littlebird_debug_text( "Owner outside no fly zone, navigate around perimeter" ); - littlebird_debug_line( self.origin, perpendiculargoalpos, ( 0, 0, 1 ) ); + littlebird_debug_text( "Owner outside no fly zone, navigate around perimeter" ); + littlebird_debug_line( self.origin, perpendiculargoalpos, ( 0, 0, 1 ) ); #/ - hovergoal = perpendiculargoalpos; - } - } - zoneindex = undefined; - zoneindex = crossesnoflyzone( self.origin, hovergoal ); - if ( isDefined( zoneindex ) ) - { + hovergoal = perpendiculargoalpos; + } + } + + zoneindex = undefined; + zoneindex = crossesnoflyzone( self.origin, hovergoal ); + + if ( isdefined( zoneindex ) ) + { /# - littlebird_debug_text( "Try opposite perimeter goal" ); + littlebird_debug_text( "Try opposite perimeter goal" ); #/ - hovergoal = oppositeperpendiculargoalpos; - } - self.intransit = 1; - self setvehgoalpos( ( hovergoal[ 0 ], hovergoal[ 1 ], maxmeshheight ), 1 ); - self waittill( "goal" ); + hovergoal = oppositeperpendiculargoalpos; + } + + self.intransit = 1; + self setvehgoalpos( ( hovergoal[0], hovergoal[1], maxmeshheight ), 1 ); + + self waittill( "goal" ); } heliguardsupport_movetoplayervertical( maxmeshheight ) { - height = getnoflyzoneheightcrossed( self.origin, self.owner.origin, maxmeshheight ); - upperheight = max( self.origin[ 2 ], height ); - acquireupperheight = ( self.origin[ 0 ], self.origin[ 1 ], upperheight ); - hoveroverplayer = ( self.owner.origin[ 0 ], self.owner.origin[ 1 ], upperheight ); - hovercorrectheight = ( self.owner.origin[ 0 ], self.owner.origin[ 1 ], height ); - self.intransit = 1; - self setvehgoalpos( acquireupperheight, 1 ); - self waittill( "goal" ); - self setvehgoalpos( hoveroverplayer, 1 ); - self waittill( "goal" ); - self setvehgoalpos( hovercorrectheight, 1 ); - self waittill( "goal" ); - self.intransit = 0; + height = getnoflyzoneheightcrossed( self.origin, self.owner.origin, maxmeshheight ); + upperheight = max( self.origin[2], height ); + acquireupperheight = ( self.origin[0], self.origin[1], upperheight ); + hoveroverplayer = ( self.owner.origin[0], self.owner.origin[1], upperheight ); + hovercorrectheight = ( self.owner.origin[0], self.owner.origin[1], height ); + self.intransit = 1; + self setvehgoalpos( acquireupperheight, 1 ); + + self waittill( "goal" ); + + self setvehgoalpos( hoveroverplayer, 1 ); + + self waittill( "goal" ); + + self setvehgoalpos( hovercorrectheight, 1 ); + + self waittill( "goal" ); + + self.intransit = 0; } heliguardsupport_watchtimeout() { - level endon( "game_ended" ); - self endon( "death" ); - self.owner endon( "disconnect" ); - self.owner endon( "joined_team" ); - self.owner endon( "joined_spectators" ); - timeout = 60; + level endon( "game_ended" ); + self endon( "death" ); + self.owner endon( "disconnect" ); + self.owner endon( "joined_team" ); + self.owner endon( "joined_spectators" ); + timeout = 60.0; /# - timeout = getDvarFloat( #"E449EBB3" ); + timeout = getdvarfloat( "scr_lbguard_timeout" ); #/ - maps/mp/gametypes/_hostmigration::waitlongdurationwithhostmigrationpause( timeout ); - shouldtimeout = getDvar( "scr_heli_guard_no_timeout" ); - if ( shouldtimeout == "1" ) - { - return; - } - self thread heliguardsupport_leave(); + maps\mp\gametypes\_hostmigration::waitlongdurationwithhostmigrationpause( timeout ); + shouldtimeout = getdvar( "scr_heli_guard_no_timeout" ); + + if ( shouldtimeout == "1" ) + return; + + self thread heliguardsupport_leave(); } heliguardsupport_watchownerloss() { - level endon( "game_ended" ); - self endon( "death" ); - self endon( "leaving" ); - self.owner waittill_any( "disconnect", "joined_team", "joined_spectators" ); - self thread heliguardsupport_leave(); + level endon( "game_ended" ); + self endon( "death" ); + self endon( "leaving" ); + self.owner waittill_any( "disconnect", "joined_team", "joined_spectators" ); + self thread heliguardsupport_leave(); } heliguardsupport_watchownerdamage() { - level endon( "game_ended" ); - self endon( "death" ); - self endon( "leaving" ); - self.owner endon( "disconnect" ); - self.owner endon( "joined_team" ); - self.owner endon( "joined_spectators" ); - while ( 1 ) - { - self.owner waittill( "damage", damage, attacker, direction_vec, point, meansofdeath, modelname, tagname, partname, weapon, idflags ); - if ( isplayer( attacker ) ) - { - if ( attacker != self.owner && distance2d( attacker.origin, self.origin ) <= self.targettingradius && attacker cantargetplayerwithspecialty() ) - { - self setlookatent( attacker ); - self setgunnertargetent( attacker, vectorScale( ( 0, 0, 1 ), 50 ), 0 ); - self setturrettargetent( attacker, vectorScale( ( 0, 0, 1 ), 50 ) ); - } - } - } + level endon( "game_ended" ); + self endon( "death" ); + self endon( "leaving" ); + self.owner endon( "disconnect" ); + self.owner endon( "joined_team" ); + self.owner endon( "joined_spectators" ); + + while ( true ) + { + self.owner waittill( "damage", damage, attacker, direction_vec, point, meansofdeath, modelname, tagname, partname, weapon, idflags ); + + if ( isplayer( attacker ) ) + { + if ( attacker != self.owner && distance2d( attacker.origin, self.origin ) <= self.targettingradius && attacker cantargetplayerwithspecialty() ) + { + self setlookatent( attacker ); + self setgunnertargetent( attacker, vectorscale( ( 0, 0, 1 ), 50.0 ), 0 ); + self setturrettargetent( attacker, vectorscale( ( 0, 0, 1 ), 50.0 ) ); + } + } + } } heliguardsupport_watchroundend() { - level endon( "game_ended" ); - self endon( "death" ); - self endon( "leaving" ); - self.owner endon( "disconnect" ); - self.owner endon( "joined_team" ); - self.owner endon( "joined_spectators" ); - level waittill( "round_end_finished" ); - self thread heliguardsupport_leave(); + level endon( "game_ended" ); + self endon( "death" ); + self endon( "leaving" ); + self.owner endon( "disconnect" ); + self.owner endon( "joined_team" ); + self.owner endon( "joined_spectators" ); + + level waittill( "round_end_finished" ); + + self thread heliguardsupport_leave(); } heliguardsupport_leave() { - self endon( "death" ); - self notify( "leaving" ); - level.littlebirdguard = undefined; - self cleargunnertarget( 0 ); - self clearturrettarget(); - self clearlookatent(); - flyheight = getnoflyzoneheight( self.origin ); - targetpos = self.origin + ( anglesToForward( self.angles ) * 1500 ) + ( 0, 0, flyheight ); - collide = crossesnoflyzone( self.origin, targetpos ); - tries = 5; - while ( isDefined( collide ) && tries > 0 ) - { - yaw = randomint( 360 ); - targetpos = self.origin + ( anglesToForward( ( self.angles[ 0 ], yaw, self.angles[ 2 ] ) ) * 1500 ) + ( 0, 0, flyheight ); - collide = crossesnoflyzone( self.origin, targetpos ); - tries--; + self endon( "death" ); + self notify( "leaving" ); + level.littlebirdguard = undefined; + self cleargunnertarget( 0 ); + self clearturrettarget(); + self clearlookatent(); + flyheight = getnoflyzoneheight( self.origin ); + targetpos = self.origin + anglestoforward( self.angles ) * 1500 + ( 0, 0, flyheight ); + collide = crossesnoflyzone( self.origin, targetpos ); - } - if ( tries == 0 ) - { - targetpos = self.origin + ( 0, 0, flyheight ); - } - self setspeed( self.speed, 80 ); - self setmaxpitchroll( 45, 180 ); - self setvehgoalpos( targetpos ); - self waittill( "goal" ); - targetpos += anglesToForward( ( 0, self.angles[ 1 ], self.angles[ 2 ] ) ) * 14000; - self setvehgoalpos( targetpos ); - self waittill( "goal" ); - self notify( "gone" ); - self removelittlebird(); + for ( tries = 5; isdefined( collide ) && tries > 0; tries-- ) + { + yaw = randomint( 360 ); + targetpos = self.origin + anglestoforward( ( self.angles[0], yaw, self.angles[2] ) ) * 1500 + ( 0, 0, flyheight ); + collide = crossesnoflyzone( self.origin, targetpos ); + } + + if ( tries == 0 ) + targetpos = self.origin + ( 0, 0, flyheight ); + + self setspeed( self.speed, 80 ); + self setmaxpitchroll( 45, 180 ); + self setvehgoalpos( targetpos ); + + self waittill( "goal" ); + + targetpos += anglestoforward( ( 0, self.angles[1], self.angles[2] ) ) * 14000; + self setvehgoalpos( targetpos ); + + self waittill( "goal" ); + + self notify( "gone" ); + self removelittlebird(); } helidestroyed() { - level.littlebirdguard = undefined; - if ( !isDefined( self ) ) - { - return; - } - self setspeed( 25, 5 ); - self thread lbspin( randomintrange( 180, 220 ) ); - wait randomfloatrange( 0,5, 1,5 ); - lbexplode(); + level.littlebirdguard = undefined; + + if ( !isdefined( self ) ) + return; + + self setspeed( 25, 5 ); + self thread lbspin( randomintrange( 180, 220 ) ); + wait( randomfloatrange( 0.5, 1.5 ) ); + lbexplode(); } lbexplode() { - self notify( "explode" ); - self removelittlebird(); + self notify( "explode" ); + self removelittlebird(); } lbspin( speed ) { - self endon( "explode" ); - playfxontag( level.chopper_fx[ "explode" ][ "large" ], self, "tail_rotor_jnt" ); - self thread trail_fx( level.chopper_fx[ "smoke" ][ "trail" ], "tail_rotor_jnt", "stop tail smoke" ); - self setyawspeed( speed, speed, speed ); - while ( isDefined( self ) ) - { - self settargetyaw( self.angles[ 1 ] + ( speed * 0,9 ) ); - wait 1; - } + self endon( "explode" ); + playfxontag( level.chopper_fx["explode"]["large"], self, "tail_rotor_jnt" ); + self thread trail_fx( level.chopper_fx["smoke"]["trail"], "tail_rotor_jnt", "stop tail smoke" ); + self setyawspeed( speed, speed, speed ); + + while ( isdefined( self ) ) + { + self settargetyaw( self.angles[1] + speed * 0.9 ); + wait 1; + } } trail_fx( trail_fx, trail_tag, stop_notify ) { - self notify( stop_notify ); - self endon( stop_notify ); - self endon( "death" ); - for ( ;; ) - { - playfxontag( trail_fx, self, trail_tag ); - wait 0,05; - } + self notify( stop_notify ); + self endon( stop_notify ); + self endon( "death" ); + + for (;;) + { + playfxontag( trail_fx, self, trail_tag ); + wait 0.05; + } } removelittlebird() { - level.lbstrike = 0; - maps/mp/killstreaks/_killstreakrules::killstreakstop( "helicopter_guard_mp", self.team, self.killstreak_id ); - if ( isDefined( self.marker ) ) - { - self.marker delete(); - } - self delete(); + level.lbstrike = 0; + maps\mp\killstreaks\_killstreakrules::killstreakstop( "helicopter_guard_mp", self.team, self.killstreak_id ); + + if ( isdefined( self.marker ) ) + self.marker delete(); + + self delete(); } heliguardsupport_watchsamproximity( player, missileteam, missiletarget, missilegroup ) { - level endon( "game_ended" ); - missiletarget endon( "death" ); - i = 0; - while ( i < missilegroup.size ) - { - if ( isDefined( missilegroup[ i ] ) && !missiletarget.hasdodged ) - { - missiletarget.hasdodged = 1; - newtarget = spawn( "script_origin", missiletarget.origin ); - newtarget.angles = missiletarget.angles; - newtarget movegravity( anglesToRight( missilegroup[ i ].angles ) * -1000, 0,05 ); - j = 0; - while ( j < missilegroup.size ) - { - if ( isDefined( missilegroup[ j ] ) ) - { - missilegroup[ j ] settargetentity( newtarget ); - } - j++; - } - dodgepoint = missiletarget.origin + ( anglesToRight( missilegroup[ i ].angles ) * 200 ); - missiletarget setspeed( missiletarget.speed, 100, 40 ); - missiletarget setvehgoalpos( dodgepoint, 1 ); - wait 2; - missiletarget setspeed( missiletarget.followspeed, 20, 20 ); - return; - } - else - { - i++; - } - } + level endon( "game_ended" ); + missiletarget endon( "death" ); + + for ( i = 0; i < missilegroup.size; i++ ) + { + if ( isdefined( missilegroup[i] ) && !missiletarget.hasdodged ) + { + missiletarget.hasdodged = 1; + newtarget = spawn( "script_origin", missiletarget.origin ); + newtarget.angles = missiletarget.angles; + newtarget movegravity( anglestoright( missilegroup[i].angles ) * -1000, 0.05 ); + + for ( j = 0; j < missilegroup.size; j++ ) + { + if ( isdefined( missilegroup[j] ) ) + missilegroup[j] settargetentity( newtarget ); + } + + dodgepoint = missiletarget.origin + anglestoright( missilegroup[i].angles ) * 200; + missiletarget setspeed( missiletarget.speed, 100, 40 ); + missiletarget setvehgoalpos( dodgepoint, 1 ); + wait 2.0; + missiletarget setspeed( missiletarget.followspeed, 20, 20 ); + break; + } + } } heliguardsupport_getcloseststartnode( pos ) { - closestnode = undefined; - closestdistance = 999999; - _a645 = level.heli_paths; - _k645 = getFirstArrayKey( _a645 ); - while ( isDefined( _k645 ) ) - { - path = _a645[ _k645 ]; - _a647 = path; - _k647 = getFirstArrayKey( _a647 ); - while ( isDefined( _k647 ) ) - { - loc = _a647[ _k647 ]; - nodedistance = distance( loc.origin, pos ); - if ( nodedistance < closestdistance ) - { - closestnode = loc; - closestdistance = nodedistance; - } - _k647 = getNextArrayKey( _a647, _k647 ); - } - _k645 = getNextArrayKey( _a645, _k645 ); - } - return closestnode; + closestnode = undefined; + closestdistance = 999999; + + foreach ( path in level.heli_paths ) + { + foreach ( loc in path ) + { + nodedistance = distance( loc.origin, pos ); + + if ( nodedistance < closestdistance ) + { + closestnode = loc; + closestdistance = nodedistance; + } + } + } + + return closestnode; } heliguardsupport_getclosestnode( pos ) { - closestnode = undefined; - closestdistance = 999999; - _a667 = level.heli_loop_paths; - _k667 = getFirstArrayKey( _a667 ); - while ( isDefined( _k667 ) ) - { - loc = _a667[ _k667 ]; - nodedistance = distance( loc.origin, pos ); - if ( nodedistance < closestdistance ) - { - closestnode = loc; - closestdistance = nodedistance; - } - _k667 = getNextArrayKey( _a667, _k667 ); - } - return closestnode; + closestnode = undefined; + closestdistance = 999999; + + foreach ( loc in level.heli_loop_paths ) + { + nodedistance = distance( loc.origin, pos ); + + if ( nodedistance < closestdistance ) + { + closestnode = loc; + closestdistance = nodedistance; + } + } + + return closestnode; } littlebird_debug_text( string ) { /# - if ( getDvar( "scr_heli_guard_debug" ) == "1" ) - { - iprintln( string ); + if ( getdvar( "scr_heli_guard_debug" ) == "1" ) + iprintln( string ); #/ - } } littlebird_debug_line( start, end, color ) { /# - if ( getDvar( "scr_heli_guard_debug" ) == "1" ) - { - line( start, end, color, 1, 1, 300 ); + if ( getdvar( "scr_heli_guard_debug" ) == "1" ) + line( start, end, color, 1, 1, 300 ); #/ - } } heli_path_debug() { /# - _a703 = level.heli_paths; - _k703 = getFirstArrayKey( _a703 ); - while ( isDefined( _k703 ) ) - { - path = _a703[ _k703 ]; - _a705 = path; - _k705 = getFirstArrayKey( _a705 ); - while ( isDefined( _k705 ) ) - { - loc = _a705[ _k705 ]; - prev = loc; - target = loc.target; - while ( isDefined( target ) ) - { - target = getent( target, "targetname" ); - line( prev.origin, target.origin, ( 0, 0, 1 ), 1, 0, 50000 ); - debugstar( prev.origin, 50000, ( 0, 0, 1 ) ); - prev = target; - target = prev.target; - } - _k705 = getNextArrayKey( _a705, _k705 ); - } - _k703 = getNextArrayKey( _a703, _k703 ); - } - _a722 = level.heli_loop_paths; - _k722 = getFirstArrayKey( _a722 ); - while ( isDefined( _k722 ) ) - { - loc = _a722[ _k722 ]; - prev = loc; - target = loc.target; - first = loc; - while ( isDefined( target ) ) - { - target = getent( target, "targetname" ); - line( prev.origin, target.origin, ( 0, 0, 1 ), 1, 0, 50000 ); - debugstar( prev.origin, 50000, ( 0, 0, 1 ) ); - prev = target; - target = prev.target; - if ( prev == first ) - { - break; - } - else - { - } - } - _k722 = getNextArrayKey( _a722, _k722 ); + foreach ( path in level.heli_paths ) + { + foreach ( loc in path ) + { + prev = loc; + + for ( target = loc.target; isdefined( target ); target = prev.target ) + { + target = getent( target, "targetname" ); + line( prev.origin, target.origin, ( 1, 0, 0 ), 1, 0, 50000 ); + debugstar( prev.origin, 50000, ( 0, 1, 0 ) ); + prev = target; + } + } + } + + foreach ( loc in level.heli_loop_paths ) + { + prev = loc; + target = loc.target; + first = loc; + + while ( isdefined( target ) ) + { + target = getent( target, "targetname" ); + line( prev.origin, target.origin, ( 0, 1, 0 ), 1, 0, 50000 ); + debugstar( prev.origin, 50000, ( 1, 0, 0 ) ); + prev = target; + target = prev.target; + + if ( prev == first ) + break; + } + } #/ - } } heliguardsupport_getclosestlinkednode( pos ) { - closestnode = undefined; - totaldistance = distance2d( self.currentnode.origin, pos ); - closestdistance = totaldistance; - target = self.currentnode.target; - while ( isDefined( target ) ) - { - nextnode = getent( target, "targetname" ); - if ( nextnode == self.currentnode ) - { - break; - } - else - { - nodedistance = distance2d( nextnode.origin, pos ); - if ( nodedistance < totaldistance && nodedistance < closestdistance ) - { - closestnode = nextnode; - closestdistance = nodedistance; - } - target = nextnode.target; - } - } - return closestnode; + closestnode = undefined; + totaldistance = distance2d( self.currentnode.origin, pos ); + closestdistance = totaldistance; + + for ( target = self.currentnode.target; isdefined( target ); target = nextnode.target ) + { + nextnode = getent( target, "targetname" ); + + if ( nextnode == self.currentnode ) + break; + + nodedistance = distance2d( nextnode.origin, pos ); + + if ( nodedistance < totaldistance && nodedistance < closestdistance ) + { + closestnode = nextnode; + closestdistance = nodedistance; + } + } + + return closestnode; } heliguardsupport_arraycontains( array, compare ) { - if ( array.size <= 0 ) - { - return 0; - } - _a783 = array; - _k783 = getFirstArrayKey( _a783 ); - while ( isDefined( _k783 ) ) - { - member = _a783[ _k783 ]; - if ( member == compare ) - { - return 1; - } - _k783 = getNextArrayKey( _a783, _k783 ); - } - return 0; + if ( array.size <= 0 ) + return false; + + foreach ( member in array ) + { + if ( member == compare ) + return true; + } + + return false; } heliguardsupport_getlinkedstructs() { - array = []; - return array; + array = []; + return array; } heliguardsupport_setairstartnodes() { - level.air_start_nodes = getstructarray( "chopper_boss_path_start", "targetname" ); - _a817 = level.air_start_nodes; - _k817 = getFirstArrayKey( _a817 ); - while ( isDefined( _k817 ) ) - { - loc = _a817[ _k817 ]; - loc.neighbors = loc heliguardsupport_getlinkedstructs(); - _k817 = getNextArrayKey( _a817, _k817 ); - } + level.air_start_nodes = getstructarray( "chopper_boss_path_start", "targetname" ); + + foreach ( loc in level.air_start_nodes ) + loc.neighbors = loc heliguardsupport_getlinkedstructs(); } heliguardsupport_setairnodemesh() { - level.air_node_mesh = getstructarray( "so_chopper_boss_path_struct", "script_noteworthy" ); - _a828 = level.air_node_mesh; - _k828 = getFirstArrayKey( _a828 ); - while ( isDefined( _k828 ) ) - { - loc = _a828[ _k828 ]; - loc.neighbors = loc heliguardsupport_getlinkedstructs(); - _a835 = level.air_node_mesh; - _k835 = getFirstArrayKey( _a835 ); - while ( isDefined( _k835 ) ) - { - other_loc = _a835[ _k835 ]; - if ( loc == other_loc ) - { - } - else - { - if ( !heliguardsupport_arraycontains( loc.neighbors, other_loc ) && heliguardsupport_arraycontains( other_loc heliguardsupport_getlinkedstructs(), loc ) ) - { - loc.neighbors[ loc.neighbors.size ] = other_loc; - } - } - _k835 = getNextArrayKey( _a835, _k835 ); - } - _k828 = getNextArrayKey( _a828, _k828 ); - } + level.air_node_mesh = getstructarray( "so_chopper_boss_path_struct", "script_noteworthy" ); + + foreach ( loc in level.air_node_mesh ) + { + loc.neighbors = loc heliguardsupport_getlinkedstructs(); + + foreach ( other_loc in level.air_node_mesh ) + { + if ( loc == other_loc ) + continue; + + if ( !heliguardsupport_arraycontains( loc.neighbors, other_loc ) && heliguardsupport_arraycontains( other_loc heliguardsupport_getlinkedstructs(), loc ) ) + loc.neighbors[loc.neighbors.size] = other_loc; + } + } } heliguardsupport_attacktargets() { - self endon( "death" ); - level endon( "game_ended" ); - self endon( "leaving" ); - for ( ;; ) - { - self heliguardsupport_firestart(); - } + self endon( "death" ); + level endon( "game_ended" ); + self endon( "leaving" ); + + for (;;) + self heliguardsupport_firestart(); } heliguardsupport_firestart() { - self endon( "death" ); - self endon( "leaving" ); - self endon( "stop_shooting" ); - level endon( "game_ended" ); - for ( ;; ) - { - numshots = randomintrange( 10, 21 ); - if ( !isDefined( self.primarytarget ) ) - { - self waittill( "primary acquired" ); - } - while ( isDefined( self.primarytarget ) ) - { - targetent = self.primarytarget; - self thread heliguardsupport_firestop( targetent ); - self setlookatent( targetent ); - self setgunnertargetent( targetent, vectorScale( ( 0, 0, 1 ), 50 ), 0 ); - self setturrettargetent( targetent, vectorScale( ( 0, 0, 1 ), 50 ) ); - self waittill( "turret_on_target" ); - wait 0,2; - self setclientfield( "vehicle_is_firing", 1 ); - i = 0; - while ( i < numshots ) - { - self firegunnerweapon( 0, self ); - self fireweapon(); - wait 0,15; - i++; - } - } - self setclientfield( "vehicle_is_firing", 0 ); - self clearturrettarget(); - self cleargunnertarget( 0 ); - wait randomfloatrange( 1, 2 ); - } + self endon( "death" ); + self endon( "leaving" ); + self endon( "stop_shooting" ); + level endon( "game_ended" ); + + for (;;) + { + numshots = randomintrange( 10, 21 ); + + if ( !isdefined( self.primarytarget ) ) + self waittill( "primary acquired" ); + + if ( isdefined( self.primarytarget ) ) + { + targetent = self.primarytarget; + self thread heliguardsupport_firestop( targetent ); + self setlookatent( targetent ); + self setgunnertargetent( targetent, vectorscale( ( 0, 0, 1 ), 50.0 ), 0 ); + self setturrettargetent( targetent, vectorscale( ( 0, 0, 1 ), 50.0 ) ); + + self waittill( "turret_on_target" ); + + wait 0.2; + self setclientfield( "vehicle_is_firing", 1 ); + + for ( i = 0; i < numshots; i++ ) + { + self firegunnerweapon( 0, self ); + self fireweapon(); + wait 0.15; + } + } + + self setclientfield( "vehicle_is_firing", 0 ); + self clearturrettarget(); + self cleargunnertarget( 0 ); + wait( randomfloatrange( 1.0, 2.0 ) ); + } } heliguardsupport_firestop( targetent ) { - self endon( "death" ); - self endon( "leaving" ); - self notify( "heli_guard_target_death_watcher" ); - self endon( "heli_guard_target_death_watcher" ); - targetent waittill_any( "death", "disconnect" ); - self setclientfield( "vehicle_is_firing", 0 ); - self notify( "stop_shooting" ); - self.primarytarget = undefined; - self setlookatent( self.owner ); - self cleargunnertarget( 0 ); - self clearturrettarget(); + self endon( "death" ); + self endon( "leaving" ); + self notify( "heli_guard_target_death_watcher" ); + self endon( "heli_guard_target_death_watcher" ); + targetent waittill_any( "death", "disconnect" ); + self setclientfield( "vehicle_is_firing", 0 ); + self notify( "stop_shooting" ); + self.primarytarget = undefined; + self setlookatent( self.owner ); + self cleargunnertarget( 0 ); + self clearturrettarget(); } diff --git a/Multiplayer Core/patch_mp/maps/mp/killstreaks/_helicopter_gunner.gsc b/Multiplayer Core/patch_mp/maps/mp/killstreaks/_helicopter_gunner.gsc index 50476bd..98cc29e 100644 --- a/Multiplayer Core/patch_mp/maps/mp/killstreaks/_helicopter_gunner.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/killstreaks/_helicopter_gunner.gsc @@ -1,1580 +1,1567 @@ -#include maps/mp/gametypes/_weaponobjects; -#include maps/mp/gametypes/_spawning; -#include maps/mp/_heatseekingmissile; -#include maps/mp/_treadfx; -#include maps/mp/_popups; -#include maps/mp/killstreaks/_helicopter; -#include maps/mp/killstreaks/_killstreakrules; -#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\_killstreakrules; +#include maps\mp\killstreaks\_helicopter; +#include maps\mp\_popups; +#include maps\mp\_treadfx; +#include maps\mp\_heatseekingmissile; +#include maps\mp\gametypes\_spawning; +#include maps\mp\gametypes\_weaponobjects; -#using_animtree( "mp_vehicles" ); +#using_animtree("mp_vehicles"); init() { - registerkillstreak( "helicopter_player_gunner_mp", "helicopter_player_gunner_mp", "killstreak_helicopter_player_gunner", "helicopter_used", ::heli_gunner_killstreak, 1 ); - registerkillstreakstrings( "helicopter_player_gunner_mp", &"KILLSTREAK_EARNED_HELICOPTER_GUNNER", &"KILLSTREAK_HELICOPTER_GUNNER_NOT_AVAILABLE", &"KILLSTREAK_HELICOPTER_GUNNER_INBOUND" ); - registerkillstreakdialog( "helicopter_player_gunner_mp", "mpl_killstreak_osprey_strt", "kls_playerheli_used", "", "kls_playerheli_enemy", "", "kls_playerheli_ready" ); - registerkillstreakdevdvar( "helicopter_player_gunner_mp", "scr_givehelicopter_player_gunner" ); - registerkillstreakaltweapon( "helicopter_player_gunner_mp", "cobra_minigun_mp" ); - registerkillstreakaltweapon( "helicopter_player_gunner_mp", "heli_gunner_rockets_mp" ); - registerkillstreakaltweapon( "helicopter_player_gunner_mp", "chopper_minigun_mp" ); - setkillstreakteamkillpenaltyscale( "helicopter_player_gunner_mp", level.teamkillreducedpenalty ); - overrideentitycameraindemo( "helicopter_player_gunner_mp", 1 ); - loadfx( "vehicle/treadfx/fx_heli_dust_default" ); - loadfx( "vehicle/treadfx/fx_heli_dust_concrete" ); - loadfx( "vehicle/treadfx/fx_heli_water_spray" ); - loadfx( "vehicle/exhaust/fx_exhaust_huey_engine" ); - level._effect[ "heli_gunner" ][ "vtol_fx" ] = loadfx( "vehicle/exhaust/fx_exhaust_vtol_mp" ); - level._effect[ "heli_gunner" ][ "vtol_fx_rt" ] = loadfx( "vehicle/exhaust/fx_exhaust_vtol_rt_mp" ); - precacheitem( "chopper_minigun_mp" ); - precacheitem( "heli_gunner_rockets_mp" ); - level.chopper_defs[ "player_gunner" ] = "heli_player_gunner_mp"; - level.chopper_models[ "player_gunner" ][ "friendly" ] = "veh_t6_air_v78_vtol_killstreak"; - level.chopper_models[ "player_gunner" ][ "enemy" ] = "veh_t6_air_v78_vtol_killstreak_alt"; - _a36 = level.teams; - _k36 = getFirstArrayKey( _a36 ); - while ( isDefined( _k36 ) ) - { - team = _a36[ _k36 ]; - level.chopper_death_models[ "player_gunner" ][ team ] = "t5_veh_helo_hind_dead"; - level.chopper_sounds[ "player_gunner" ][ team ] = "mpl_kls_hind_helicopter"; - _k36 = getNextArrayKey( _a36, _k36 ); - } - level.chopper_death_models[ "player_gunner" ][ "allies" ] = "t5_veh_helo_hind_dead"; - level.chopper_death_models[ "player_gunner" ][ "axis" ] = "t5_veh_helo_hind_dead"; - level.chopper_sounds[ "player_gunner" ][ "allies" ] = "mpl_kls_cobra_helicopter"; - level.chopper_sounds[ "player_gunner" ][ "axis" ] = "mpl_kls_hind_helicopter"; - level.chaff_offset[ "player_gunner" ] = ( -185, 0, -85 ); - precachemodel( level.chopper_models[ "player_gunner" ][ "friendly" ] ); - precachemodel( level.chopper_models[ "player_gunner" ][ "enemy" ] ); - precachevehicle( level.chopper_defs[ "player_gunner" ] ); - level.chopper_infrared_vision = "remote_mortar_infrared"; - level.chopper_enhanced_vision = "remote_mortar_enhanced"; - level._effect[ "heli_gunner_light" ][ "friendly" ] = loadfx( "light/fx_vlight_mp_vtol_grn" ); - level._effect[ "heli_gunner_light" ][ "enemy" ] = loadfx( "light/fx_vlight_mp_vtol_red" ); - level.heligunnervtolupanim = %veh_anim_v78_vtol_engine_left; - level.heligunnervtoldownanim = %veh_anim_v78_vtol_engine_right; - level.heli_angle_offset = 90; - level.heli_forced_wait = 0; + registerkillstreak( "helicopter_player_gunner_mp", "helicopter_player_gunner_mp", "killstreak_helicopter_player_gunner", "helicopter_used", ::heli_gunner_killstreak, 1 ); + registerkillstreakstrings( "helicopter_player_gunner_mp", &"KILLSTREAK_EARNED_HELICOPTER_GUNNER", &"KILLSTREAK_HELICOPTER_GUNNER_NOT_AVAILABLE", &"KILLSTREAK_HELICOPTER_GUNNER_INBOUND" ); + registerkillstreakdialog( "helicopter_player_gunner_mp", "mpl_killstreak_osprey_strt", "kls_playerheli_used", "", "kls_playerheli_enemy", "", "kls_playerheli_ready" ); + registerkillstreakdevdvar( "helicopter_player_gunner_mp", "scr_givehelicopter_player_gunner" ); + registerkillstreakaltweapon( "helicopter_player_gunner_mp", "cobra_minigun_mp" ); + registerkillstreakaltweapon( "helicopter_player_gunner_mp", "heli_gunner_rockets_mp" ); + registerkillstreakaltweapon( "helicopter_player_gunner_mp", "chopper_minigun_mp" ); + setkillstreakteamkillpenaltyscale( "helicopter_player_gunner_mp", level.teamkillreducedpenalty ); + overrideentitycameraindemo( "helicopter_player_gunner_mp", 1 ); + loadfx( "vehicle/treadfx/fx_heli_dust_default" ); + loadfx( "vehicle/treadfx/fx_heli_dust_concrete" ); + loadfx( "vehicle/treadfx/fx_heli_water_spray" ); + loadfx( "vehicle/exhaust/fx_exhaust_huey_engine" ); + level._effect["heli_gunner"]["vtol_fx"] = loadfx( "vehicle/exhaust/fx_exhaust_vtol_mp" ); + level._effect["heli_gunner"]["vtol_fx_rt"] = loadfx( "vehicle/exhaust/fx_exhaust_vtol_rt_mp" ); + precacheitem( "chopper_minigun_mp" ); + precacheitem( "heli_gunner_rockets_mp" ); + level.chopper_defs["player_gunner"] = "heli_player_gunner_mp"; + level.chopper_models["player_gunner"]["friendly"] = "veh_t6_air_v78_vtol_killstreak"; + level.chopper_models["player_gunner"]["enemy"] = "veh_t6_air_v78_vtol_killstreak_alt"; + + foreach ( team in level.teams ) + { + level.chopper_death_models["player_gunner"][team] = "t5_veh_helo_hind_dead"; + level.chopper_sounds["player_gunner"][team] = "mpl_kls_hind_helicopter"; + } + + level.chopper_death_models["player_gunner"]["allies"] = "t5_veh_helo_hind_dead"; + level.chopper_death_models["player_gunner"]["axis"] = "t5_veh_helo_hind_dead"; + level.chopper_sounds["player_gunner"]["allies"] = "mpl_kls_cobra_helicopter"; + level.chopper_sounds["player_gunner"]["axis"] = "mpl_kls_hind_helicopter"; + level.chaff_offset["player_gunner"] = ( -185, 0, -85 ); + precachemodel( level.chopper_models["player_gunner"]["friendly"] ); + precachemodel( level.chopper_models["player_gunner"]["enemy"] ); + precachevehicle( level.chopper_defs["player_gunner"] ); + level.chopper_infrared_vision = "remote_mortar_infrared"; + level.chopper_enhanced_vision = "remote_mortar_enhanced"; + level._effect["heli_gunner_light"]["friendly"] = loadfx( "light/fx_vlight_mp_vtol_grn" ); + level._effect["heli_gunner_light"]["enemy"] = loadfx( "light/fx_vlight_mp_vtol_red" ); + level.heligunnervtolupanim = %veh_anim_v78_vtol_engine_left; + level.heligunnervtoldownanim = %veh_anim_v78_vtol_engine_right; + level.heli_angle_offset = 90; + level.heli_forced_wait = 0; } heli_gunner_killstreak( hardpointtype ) { /# - assert( hardpointtype == "helicopter_player_gunner_mp" ); + assert( hardpointtype == "helicopter_player_gunner_mp" ); #/ - if ( !isDefined( level.heli_paths ) || !level.heli_paths.size ) - { + if ( !isdefined( level.heli_paths ) || !level.heli_paths.size ) + { /# - println( "No helicopter paths found in map" ); + println( "No helicopter paths found in map" ); #/ - return 0; - } - if ( !isDefined( level.heli_primary_path ) || !level.heli_primary_path.size ) - { + return 0; + } + + if ( !isdefined( level.heli_primary_path ) || !level.heli_primary_path.size ) + { /# - println( "No primary helicopter path found in map" ); + println( "No primary helicopter path found in map" ); #/ - return 0; - } - if ( !self maps/mp/killstreaks/_killstreakrules::iskillstreakallowed( hardpointtype, self.team ) ) - { - return 0; - } - if ( is_true( self.isplanting ) ) - { - return 0; - } - if ( is_true( self.isdefusing ) ) - { - return 0; - } - if ( !self isonground() || self isusingremote() ) - { - self iprintlnbold( &"KILLSTREAK_CHOPPER_GUNNER_NOT_USABLE" ); - return 0; - } - result = self heli_gunner_spawn( hardpointtype ); - if ( level.gameended ) - { - return 1; - } - if ( !isDefined( result ) ) - { - return 0; - } - return result; + return 0; + } + + if ( !self maps\mp\killstreaks\_killstreakrules::iskillstreakallowed( hardpointtype, self.team ) ) + return 0; + + if ( is_true( self.isplanting ) ) + return 0; + + if ( is_true( self.isdefusing ) ) + return 0; + + if ( !self isonground() || self isusingremote() ) + { + self iprintlnbold( &"KILLSTREAK_CHOPPER_GUNNER_NOT_USABLE" ); + return 0; + } + + result = self heli_gunner_spawn( hardpointtype ); + + if ( level.gameended ) + return 1; + + if ( !isdefined( result ) ) + return 0; + + return result; } heli_gunner_spawn( hardpointtype ) { - self endon( "disconnect" ); - level endon( "game_ended" ); - self setusingremote( hardpointtype ); - result = self maps/mp/killstreaks/_killstreaks::initridekillstreak( "qrdrone" ); - if ( result != "success" ) - { - if ( result != "disconnect" ) - { - self clearusingremote(); - } - return 0; - } - if ( !self starthelicopter( "player_gunner", 0, hardpointtype, level.heli_primary_path[ 0 ] ) ) - { - self clearusingremote(); - return 0; - } - if ( isDefined( self.carryicon ) ) - { - self.prevcarryiconalpha = self.carryicon.alpha; - self.carryicon.alpha = 0; - } - self thread maps/mp/killstreaks/_helicopter::announcehelicopterinbound( hardpointtype ); - self.heli maps/mp/killstreaks/_helicopter::heli_reset(); - self.heli usevehicle( self, 0 ); - self setplayerangles( self.heli gettagangles( "tag_player" ) ); - self.heli.zoffset = vectorScale( ( 1, 0, 0 ), 120 ); - self.heli.playermovedrecently = 0; - self.heli.soundmod = "default_loud"; - attack_nodes = getentarray( "heli_attack_area", "targetname" ); - if ( attack_nodes.size ) - { - self.heli thread heli_fly_well( level.heli_primary_path[ 0 ], attack_nodes ); - self thread change_location( attack_nodes ); - } - else - { - self.heli thread maps/mp/killstreaks/_helicopter::heli_fly( level.heli_primary_path[ 0 ], 0, hardpointtype ); - } - self.pilotvoicenumber = self.bcvoicenumber + 1; - if ( self.pilotvoicenumber > 3 ) - { - self.pilotvoicenumber = 0; - } - wait 1; - if ( !isDefined( self.heli ) ) - { - return 0; - } - self.heli thread fireheliweapon( self ); - self.heli thread hind_watch_rocket_fire( self ); - self.heli thread look_with_player( self ); - self.heli thread play_lockon_sounds( self ); - target_setturretaquire( self.heli, 1 ); - self.heli.lockondelay = 0; - self.heli waittill_any( "death", "leaving", "abandoned" ); - if ( isDefined( self.heli ) && isDefined( self.heli.targetent ) ) - { - self.heli.targetent delete(); - } - return 1; + self endon( "disconnect" ); + level endon( "game_ended" ); + self setusingremote( hardpointtype ); + result = self maps\mp\killstreaks\_killstreaks::initridekillstreak( "qrdrone" ); + + if ( result != "success" ) + { + if ( result != "disconnect" ) + self clearusingremote(); + + return false; + } + + if ( !self starthelicopter( "player_gunner", 0, hardpointtype, level.heli_primary_path[0] ) ) + { + self clearusingremote(); + return false; + } + + if ( isdefined( self.carryicon ) ) + { + self.prevcarryiconalpha = self.carryicon.alpha; + self.carryicon.alpha = 0.0; + } + + self thread maps\mp\killstreaks\_helicopter::announcehelicopterinbound( hardpointtype ); + self.heli maps\mp\killstreaks\_helicopter::heli_reset(); + self.heli usevehicle( self, 0 ); + self setplayerangles( self.heli gettagangles( "tag_player" ) ); + self.heli.zoffset = vectorscale( ( 0, 0, 1 ), 120.0 ); + self.heli.playermovedrecently = 0; + self.heli.soundmod = "default_loud"; + attack_nodes = getentarray( "heli_attack_area", "targetname" ); + + if ( attack_nodes.size ) + { + self.heli thread heli_fly_well( level.heli_primary_path[0], attack_nodes ); + self thread change_location( attack_nodes ); + } + else + self.heli thread maps\mp\killstreaks\_helicopter::heli_fly( level.heli_primary_path[0], 0.0, hardpointtype ); + + self.pilotvoicenumber = self.bcvoicenumber + 1; + + if ( self.pilotvoicenumber > 3 ) + self.pilotvoicenumber = 0; + + wait 1.0; + + if ( !isdefined( self.heli ) ) + return false; + + self.heli thread fireheliweapon( self ); + self.heli thread hind_watch_rocket_fire( self ); + self.heli thread look_with_player( self ); + self.heli thread play_lockon_sounds( self ); + target_setturretaquire( self.heli, 1 ); + self.heli.lockondelay = 0; + self.heli waittill_any( "death", "leaving", "abandoned" ); + + if ( isdefined( self.heli ) && isdefined( self.heli.targetent ) ) + self.heli.targetent delete(); + + return true; } play_lockon_sounds( player ) { - player endon( "disconnect" ); - self endon( "death" ); - self endon( "exit_vehicle" ); - self endon( "heli_timeup" ); - self endon( "crashing" ); - self endon( "leaving" ); - self.locksounds = spawn( "script_model", self.origin ); - wait 0,1; - self.locksounds linkto( self, "tag_player" ); - while ( 1 ) - { - self waittill( "locking on" ); - while ( 1 ) - { - if ( enemy_locking() ) - { - self.locksounds playsoundtoplayer( "uin_alert_lockon", player ); - wait 0,125; - } - if ( enemy_locked() ) - { - self.locksounds playsoundtoplayer( "uin_alert_lockon", player ); - wait 0,125; - } - if ( !enemy_locking() && !enemy_locked() ) - { - self.locksounds stopsounds(); - break; - } - else - { - } - } - } + player endon( "disconnect" ); + self endon( "death" ); + self endon( "exit_vehicle" ); + self endon( "heli_timeup" ); + self endon( "crashing" ); + self endon( "leaving" ); + self.locksounds = spawn( "script_model", self.origin ); + wait 0.1; + self.locksounds linkto( self, "tag_player" ); + + while ( true ) + { + self waittill( "locking on" ); + + while ( true ) + { + if ( enemy_locking() ) + { + self.locksounds playsoundtoplayer( "uin_alert_lockon", player ); + wait 0.125; + } + + if ( enemy_locked() ) + { + self.locksounds playsoundtoplayer( "uin_alert_lockon", player ); + wait 0.125; + } + + if ( !enemy_locking() && !enemy_locked() ) + { + self.locksounds stopsounds(); + break; + } + } + } } enemy_locking() { - if ( isDefined( self.locking_on ) && self.locking_on ) - { - return 1; - } - return 0; + if ( isdefined( self.locking_on ) && self.locking_on ) + return true; + + return false; } enemy_locked() { - if ( isDefined( self.locked_on ) && self.locked_on ) - { - return 1; - } - return 0; + if ( isdefined( self.locked_on ) && self.locked_on ) + return true; + + return false; } look_with_player( player ) { - player endon( "disconnect" ); - self endon( "death" ); - self endon( "exit_vehicle" ); - self endon( "heli_timeup" ); - self endon( "crashing" ); - self endon( "leaving" ); - while ( 1 ) - { - self setgoalyaw( player getplayerangles()[ 1 ] ); - wait 0,05; - } + player endon( "disconnect" ); + self endon( "death" ); + self endon( "exit_vehicle" ); + self endon( "heli_timeup" ); + self endon( "crashing" ); + self endon( "leaving" ); + + while ( true ) + { + self setgoalyaw( player getplayerangles()[1] ); + wait 0.05; + } } change_location( destnodes ) { - self.heli endon( "death" ); - self.heli endon( "crashing" ); - self.heli endon( "leaving" ); - self.moves = 0; - self.heli waittill( "near_goal" ); - self.heli waittill( "goal" ); - for ( ;; ) - { - while ( self secondaryoffhandbuttonpressed() ) - { - self.moves++; - self thread player_moved_recently_think(); - currentnode = self get_best_area_attack_node( destnodes, 1 ); - self playsoundtoplayer( "mpl_cgunner_nav", self ); - self.heli traveltonode( currentnode ); - if ( isDefined( currentnode.script_airspeed ) && isDefined( currentnode.script_accel ) ) - { - heli_speed = currentnode.script_airspeed; - heli_accel = currentnode.script_accel; - } - else - { - heli_speed = 80 + randomint( 20 ); - heli_accel = 40 + randomint( 10 ); - } - self.heli setspeed( heli_speed, heli_accel ); - self.heli setvehgoalpos( currentnode.origin + self.heli.zoffset, 1 ); - self.heli setgoalyaw( currentnode.angles[ 1 ] + level.heli_angle_offset ); - self.heli waittill( "goal" ); - while ( self secondaryoffhandbuttonpressed() ) - { - wait 0,05; - } - } - wait 0,05; - } + self.heli endon( "death" ); + self.heli endon( "crashing" ); + self.heli endon( "leaving" ); + self.moves = 0; + + self.heli waittill( "near_goal" ); + + self.heli waittill( "goal" ); + + for (;;) + { + if ( self secondaryoffhandbuttonpressed() ) + { + self.moves++; + self thread player_moved_recently_think(); + currentnode = self get_best_area_attack_node( destnodes, 1 ); + self playsoundtoplayer( "mpl_cgunner_nav", self ); + self.heli traveltonode( currentnode ); + + if ( isdefined( currentnode.script_airspeed ) && isdefined( currentnode.script_accel ) ) + { + heli_speed = currentnode.script_airspeed; + heli_accel = currentnode.script_accel; + } + else + { + heli_speed = 80 + randomint( 20 ); + heli_accel = 40 + randomint( 10 ); + } + + self.heli setspeed( heli_speed, heli_accel ); + self.heli setvehgoalpos( currentnode.origin + self.heli.zoffset, 1 ); + self.heli setgoalyaw( currentnode.angles[1] + level.heli_angle_offset ); + + self.heli waittill( "goal" ); + + while ( self secondaryoffhandbuttonpressed() ) + wait 0.05; + } + + wait 0.05; + } } player_moved_recently_think() { - self endon( "death" ); - self endon( "crashing" ); - self endon( "leaving" ); - mymove = self.moves; - self.heli.playermovedrecently = 1; - wait 15; - if ( mymove == self.moves && isDefined( self.heli ) ) - { - self.heli.playermovedrecently = 0; - } + self endon( "death" ); + self endon( "crashing" ); + self endon( "leaving" ); + mymove = self.moves; + self.heli.playermovedrecently = 1; + wait 15; + + if ( mymove == self.moves && isdefined( self.heli ) ) + self.heli.playermovedrecently = 0; } heli_fly_well( startnode, destnodes ) { - self notify( "flying" ); - self endon( "flying" ); - self endon( "death" ); - self endon( "crashing" ); - self endon( "leaving" ); - nextnode = getent( startnode.target, "targetname" ); + self notify( "flying" ); + self endon( "flying" ); + self endon( "death" ); + self endon( "crashing" ); + self endon( "leaving" ); + nextnode = getent( startnode.target, "targetname" ); /# - assert( isDefined( nextnode ), "Next node in path is undefined, but has targetname" ); + assert( isdefined( nextnode ), "Next node in path is undefined, but has targetname" ); #/ - self setspeed( 150, 80 ); - self setvehgoalpos( nextnode.origin + self.zoffset, 1 ); - self waittill( "near_goal" ); - for ( ;; ) - { - if ( !self.playermovedrecently ) - { - currentnode = self get_best_area_attack_node( destnodes, 0 ); - traveltonode( currentnode ); - if ( isDefined( currentnode.script_airspeed ) && isDefined( currentnode.script_accel ) ) - { - heli_speed = currentnode.script_airspeed; - heli_accel = currentnode.script_accel; - } - else - { - heli_speed = 80 + randomint( 20 ); - heli_accel = 40 + randomint( 10 ); - } - self setspeed( heli_speed, heli_accel ); - self setvehgoalpos( currentnode.origin + self.zoffset, 1 ); - self setgoalyaw( currentnode.angles[ 1 ] + level.heli_angle_offset ); - } - if ( level.heli_forced_wait != 0 ) - { - self waittill( "near_goal" ); - wait level.heli_forced_wait; - continue; - } - else if ( !isDefined( currentnode.script_delay ) ) - { - self waittill( "near_goal" ); - wait ( 10 + randomint( 5 ) ); - continue; - } - else - { - self waittillmatch( "goal" ); - return; - wait currentnode.script_delay; - } - } + self setspeed( 150, 80 ); + self setvehgoalpos( nextnode.origin + self.zoffset, 1 ); + + self waittill( "near_goal" ); + + for (;;) + { + if ( !self.playermovedrecently ) + { + currentnode = self get_best_area_attack_node( destnodes, 0 ); + traveltonode( currentnode ); + + if ( isdefined( currentnode.script_airspeed ) && isdefined( currentnode.script_accel ) ) + { + heli_speed = currentnode.script_airspeed; + heli_accel = currentnode.script_accel; + } + else + { + heli_speed = 80 + randomint( 20 ); + heli_accel = 40 + randomint( 10 ); + } + + self setspeed( heli_speed, heli_accel ); + self setvehgoalpos( currentnode.origin + self.zoffset, 1 ); + self setgoalyaw( currentnode.angles[1] + level.heli_angle_offset ); + } + + if ( level.heli_forced_wait != 0 ) + { + self waittill( "near_goal" ); + + wait( level.heli_forced_wait ); + continue; + } + + if ( !isdefined( currentnode.script_delay ) ) + { + self waittill( "near_goal" ); + + wait( 10 + randomint( 5 ) ); + continue; + } + + self waittillmatch( "goal" ); + + wait( currentnode.script_delay ); + } } get_best_area_attack_node( destnodes, forcemove ) { - return updateareanodes( destnodes, forcemove ); + return updateareanodes( destnodes, forcemove ); } updateareanodes( areanodes, forcemove ) { - validenemies = []; - _a416 = areanodes; - _k416 = getFirstArrayKey( _a416 ); - while ( isDefined( _k416 ) ) - { - node = _a416[ _k416 ]; - node.validplayers = []; - node.nodescore = 0; - _k416 = getNextArrayKey( _a416, _k416 ); - } - _a422 = level.players; - _k422 = getFirstArrayKey( _a422 ); - while ( isDefined( _k422 ) ) - { - player = _a422[ _k422 ]; - if ( !isalive( player ) ) - { - } - else if ( player.team == self.team ) - { - } - else - { - _a430 = areanodes; - _k430 = getFirstArrayKey( _a430 ); - while ( isDefined( _k430 ) ) - { - node = _a430[ _k430 ]; - if ( distancesquared( player.origin, node.origin ) > 1048576 ) - { - } - else - { - node.validplayers[ node.validplayers.size ] = player; - } - _k430 = getNextArrayKey( _a430, _k430 ); - } - } - _k422 = getNextArrayKey( _a422, _k422 ); - } - bestnode = areanodes[ 0 ]; - _a440 = areanodes; - _k440 = getFirstArrayKey( _a440 ); - while ( isDefined( _k440 ) ) - { - node = _a440[ _k440 ]; - helinode = getent( node.target, "targetname" ); - _a443 = node.validplayers; - _k443 = getFirstArrayKey( _a443 ); - while ( isDefined( _k443 ) ) - { - player = _a443[ _k443 ]; - node.nodescore += 1; - if ( bullettracepassed( player.origin + vectorScale( ( 1, 0, 0 ), 32 ), helinode.origin, 0, player ) ) - { - node.nodescore += 3; - } - _k443 = getNextArrayKey( _a443, _k443 ); - } - if ( forcemove && distance( self.heli.origin, helinode.origin ) < 200 ) - { - node.nodescore = -1; - } - if ( node.nodescore > bestnode.nodescore ) - { - bestnode = node; - } - _k440 = getNextArrayKey( _a440, _k440 ); - } - return getent( bestnode.target, "targetname" ); + validenemies = []; + + foreach ( node in areanodes ) + { + node.validplayers = []; + node.nodescore = 0; + } + + foreach ( player in level.players ) + { + if ( !isalive( player ) ) + continue; + + if ( player.team == self.team ) + continue; + + foreach ( node in areanodes ) + { + if ( distancesquared( player.origin, node.origin ) > 1048576 ) + continue; + + node.validplayers[node.validplayers.size] = player; + } + } + + bestnode = areanodes[0]; + + foreach ( node in areanodes ) + { + helinode = getent( node.target, "targetname" ); + + foreach ( player in node.validplayers ) + { + node.nodescore += 1; + + if ( bullettracepassed( player.origin + vectorscale( ( 0, 0, 1 ), 32.0 ), helinode.origin, 0, player ) ) + node.nodescore += 3; + } + + if ( forcemove && distance( self.heli.origin, helinode.origin ) < 200 ) + node.nodescore = -1; + + if ( node.nodescore > bestnode.nodescore ) + bestnode = node; + } + + return getent( bestnode.target, "targetname" ); } traveltonode( goalnode ) { - originoffets = getoriginoffsets( goalnode ); - if ( originoffets[ "start" ] != self.origin ) - { - if ( isDefined( goalnode.script_airspeed ) && isDefined( goalnode.script_accel ) ) - { - heli_speed = goalnode.script_airspeed; - heli_accel = goalnode.script_accel; - } - else - { - heli_speed = 30 + randomint( 20 ); - heli_accel = 15 + randomint( 15 ); - } - self setspeed( heli_speed, heli_accel ); - self setvehgoalpos( originoffets[ "start" ] + vectorScale( ( 1, 0, 0 ), 30 ), 0 ); - self setgoalyaw( goalnode.angles[ 1 ] + level.heli_angle_offset ); - self waittill( "goal" ); - } - if ( originoffets[ "end" ] != goalnode.origin ) - { - if ( isDefined( goalnode.script_airspeed ) && isDefined( goalnode.script_accel ) ) - { - heli_speed = goalnode.script_airspeed; - heli_accel = goalnode.script_accel; - } - else - { - heli_speed = 30 + randomint( 20 ); - heli_accel = 15 + randomint( 15 ); - } - self setspeed( heli_speed, heli_accel ); - self setvehgoalpos( originoffets[ "end" ] + vectorScale( ( 1, 0, 0 ), 30 ), 0 ); - self setgoalyaw( goalnode.angles[ 1 ] + level.heli_angle_offset ); - self waittill( "goal" ); - } + originoffets = getoriginoffsets( goalnode ); + + if ( originoffets["start"] != self.origin ) + { + if ( isdefined( goalnode.script_airspeed ) && isdefined( goalnode.script_accel ) ) + { + heli_speed = goalnode.script_airspeed; + heli_accel = goalnode.script_accel; + } + else + { + heli_speed = 30 + randomint( 20 ); + heli_accel = 15 + randomint( 15 ); + } + + self setspeed( heli_speed, heli_accel ); + self setvehgoalpos( originoffets["start"] + vectorscale( ( 0, 0, 1 ), 30.0 ), 0 ); + self setgoalyaw( goalnode.angles[1] + level.heli_angle_offset ); + + self waittill( "goal" ); + } + + if ( originoffets["end"] != goalnode.origin ) + { + if ( isdefined( goalnode.script_airspeed ) && isdefined( goalnode.script_accel ) ) + { + heli_speed = goalnode.script_airspeed; + heli_accel = goalnode.script_accel; + } + else + { + heli_speed = 30 + randomint( 20 ); + heli_accel = 15 + randomint( 15 ); + } + + self setspeed( heli_speed, heli_accel ); + self setvehgoalpos( originoffets["end"] + vectorscale( ( 0, 0, 1 ), 30.0 ), 0 ); + self setgoalyaw( goalnode.angles[1] + level.heli_angle_offset ); + + self waittill( "goal" ); + } } getoriginoffsets( goalnode ) { - startorigin = self.origin; - endorigin = goalnode.origin; - numtraces = 0; - maxtraces = 40; - traceoffset = vectorScale( ( 1, 0, 0 ), 196 ); - traceorigin = bullettrace( startorigin + traceoffset, endorigin + traceoffset, 0, self ); - while ( distancesquared( traceorigin[ "position" ], endorigin + traceoffset ) > 10 && numtraces < maxtraces ) - { + startorigin = self.origin; + endorigin = goalnode.origin; + numtraces = 0; + maxtraces = 40; + traceoffset = vectorscale( ( 0, 0, -1 ), 196.0 ); + + for ( traceorigin = bullettrace( startorigin + traceoffset, endorigin + traceoffset, 0, self ); distancesquared( traceorigin["position"], endorigin + traceoffset ) > 10 && numtraces < maxtraces; traceorigin = bullettrace( startorigin + traceoffset, endorigin + traceoffset, 0, self ) ) + { /# - println( "trace failed: " + distancesquared( traceorigin[ "position" ], endorigin + traceoffset ) ); + println( "trace failed: " + distancesquared( traceorigin["position"], endorigin + traceoffset ) ); #/ - if ( startorigin[ 2 ] < endorigin[ 2 ] ) - { - startorigin += vectorScale( ( 1, 0, 0 ), 128 ); - } - else if ( startorigin[ 2 ] > endorigin[ 2 ] ) - { - endorigin += vectorScale( ( 1, 0, 0 ), 128 ); - } - else - { - startorigin += vectorScale( ( 1, 0, 0 ), 128 ); - endorigin += vectorScale( ( 1, 0, 0 ), 128 ); - } + if ( startorigin[2] < endorigin[2] ) + startorigin += vectorscale( ( 0, 0, 1 ), 128.0 ); + else if ( startorigin[2] > endorigin[2] ) + endorigin += vectorscale( ( 0, 0, 1 ), 128.0 ); + else + { + startorigin += vectorscale( ( 0, 0, 1 ), 128.0 ); + endorigin += vectorscale( ( 0, 0, 1 ), 128.0 ); + } /# + #/ - numtraces++; - traceorigin = bullettrace( startorigin + traceoffset, endorigin + traceoffset, 0, self ); - } - offsets = []; - offsets[ "start" ] = startorigin; - offsets[ "end" ] = endorigin; - return offsets; + numtraces++; + } + + offsets = []; + offsets["start"] = startorigin; + offsets["end"] = endorigin; + return offsets; } starthelicopter( type, player_driven, hardpointtype, startnode ) { - self endon( "disconnect" ); - self endon( "game_ended" ); - team = self.team; - killstreak_id = self maps/mp/killstreaks/_killstreakrules::killstreakstart( hardpointtype, team, undefined, 0 ); - if ( killstreak_id == -1 ) - { - return 0; - } - self.enteringvehicle = 1; - self freeze_player_controls( 1 ); - if ( team != self.team ) - { - self maps/mp/killstreaks/_killstreakrules::killstreakstop( hardpointtype, team, killstreak_id ); - return 0; - } - if ( !isDefined( self.heli ) ) - { - heli = spawnplayerhelicopter( self, type, startnode.origin, startnode.angles, hardpointtype ); - if ( !isDefined( heli ) ) - { - self freeze_player_controls( 0 ); - maps/mp/killstreaks/_killstreakrules::killstreakstop( hardpointtype, team, killstreak_id ); - self.enteringvehicle = 0; - return 0; - } - self.heli = heli; - self.heli.killstreak_id = killstreak_id; - } - if ( !isalive( self ) ) - { - if ( isDefined( self.heli ) ) - { - self deleteplayerheli(); - } - else - { - self maps/mp/killstreaks/_killstreakrules::killstreakstop( hardpointtype, team, killstreak_id ); - } - debug_print_heli( ">>>>>>>startHelicopter: player dead while starting" ); - self notify( "heli_timeup" ); - self freeze_player_controls( 0 ); - self.enteringvehicle = 0; - return 0; - } - if ( level.gameended ) - { - maps/mp/killstreaks/_killstreakrules::killstreakstop( hardpointtype, team, killstreak_id ); - self.enteringvehicle = 0; - return 0; - } - self thread inithelicopter( player_driven, hardpointtype ); - self freeze_player_controls( 0 ); - self.enteringvehicle = 0; - self stopshellshock(); - if ( isDefined( level.killstreaks[ hardpointtype ] ) && isDefined( level.killstreaks[ hardpointtype ].inboundtext ) ) - { - level thread maps/mp/_popups::displaykillstreakteammessagetoall( hardpointtype, self ); - } - self thread visionswitch( 0 ); - return 1; + self endon( "disconnect" ); + self endon( "game_ended" ); + team = self.team; + killstreak_id = self maps\mp\killstreaks\_killstreakrules::killstreakstart( hardpointtype, team, undefined, 0 ); + + if ( killstreak_id == -1 ) + return false; + + self.enteringvehicle = 1; + self freeze_player_controls( 1 ); + + if ( team != self.team ) + { + self maps\mp\killstreaks\_killstreakrules::killstreakstop( hardpointtype, team, killstreak_id ); + return false; + } + + if ( !isdefined( self.heli ) ) + { + heli = spawnplayerhelicopter( self, type, startnode.origin, startnode.angles, hardpointtype ); + + if ( !isdefined( heli ) ) + { + self freeze_player_controls( 0 ); + maps\mp\killstreaks\_killstreakrules::killstreakstop( hardpointtype, team, killstreak_id ); + self.enteringvehicle = 0; + return false; + } + + self.heli = heli; + self.heli.killstreak_id = killstreak_id; + } + + if ( !isalive( self ) ) + { + if ( isdefined( self.heli ) ) + self deleteplayerheli(); + else + self maps\mp\killstreaks\_killstreakrules::killstreakstop( hardpointtype, team, killstreak_id ); + + debug_print_heli( ">>>>>>>startHelicopter: player dead while starting" ); + self notify( "heli_timeup" ); + self freeze_player_controls( 0 ); + self.enteringvehicle = 0; + return false; + } + + if ( level.gameended ) + { + maps\mp\killstreaks\_killstreakrules::killstreakstop( hardpointtype, team, killstreak_id ); + self.enteringvehicle = 0; + return false; + } + + self thread inithelicopter( player_driven, hardpointtype ); + self freeze_player_controls( 0 ); + self.enteringvehicle = 0; + self stopshellshock(); + + if ( isdefined( level.killstreaks[hardpointtype] ) && isdefined( level.killstreaks[hardpointtype].inboundtext ) ) + level thread maps\mp\_popups::displaykillstreakteammessagetoall( hardpointtype, self ); + + self thread visionswitch( 0.0 ); + return true; } fireheliweapon( player ) { - while ( 1 ) - { - self waittill( "turret_fire" ); - self fireweapon( "tag_flash" ); - earthquake( 0,05, 0,05, self.origin, 1000 ); - } + while ( true ) + { + self waittill( "turret_fire" ); + + self fireweapon( "tag_flash" ); + earthquake( 0.05, 0.05, self.origin, 1000 ); + } } spawnplayerhelicopter( owner, type, origin, angles, hardpointtype ) { - debug_print_heli( ">>>>>>>spawnHelicopter " + type ); - heli = maps/mp/killstreaks/_helicopter::spawn_helicopter( self, origin, angles, level.chopper_defs[ type ], level.chopper_models[ type ][ "friendly" ], vectorScale( ( 1, 0, 0 ), 100 ), hardpointtype ); - if ( !isDefined( heli ) ) - { - return undefined; - } - target_setturretaquire( heli, 0 ); - heli.lockondelay = 1; - heli setenemymodel( level.chopper_models[ type ][ "enemy" ] ); - heli.chaff_offset = level.chaff_offset[ type ]; - heli.death_model = level.chopper_death_models[ type ][ owner.team ]; - heli playloopsound( level.chopper_sounds[ type ][ owner.team ] ); - heli.defaultweapon = "cobra_20mm_mp"; - heli.owner = owner; - heli.team = owner.team; - heli setowner( owner ); - heli setteam( owner.team ); - heli.destroyfunc = ::destroyplayerhelicopter; - snd_ent = spawn( "script_origin", heli gettagorigin( "snd_cockpit" ) ); - snd_ent linkto( heli, "snd_cockpit", ( 1, 0, 0 ), ( 1, 0, 0 ) ); - heli.snd_ent = snd_ent; - if ( isDefined( level.chopper_interior_models ) && isDefined( level.chopper_interior_models[ type ] ) && isDefined( level.chopper_interior_models[ type ][ owner.team ] ) ) - { - heli.interior_model = spawn( "script_model", heli.origin ); - heli.interior_model setmodel( level.chopper_interior_models[ type ][ owner.team ] ); - heli.interior_model linkto( heli, "tag_origin", ( 1, 0, 0 ), ( 1, 0, 0 ) ); - } - heli.killcament = owner; - heli makevehicleunusable(); - maps/mp/_treadfx::loadtreadfx( heli ); - return heli; + debug_print_heli( ">>>>>>>spawnHelicopter " + type ); + heli = maps\mp\killstreaks\_helicopter::spawn_helicopter( self, origin, angles, level.chopper_defs[type], level.chopper_models[type]["friendly"], vectorscale( ( 0, 0, -1 ), 100.0 ), hardpointtype ); + + if ( !isdefined( heli ) ) + return undefined; + + target_setturretaquire( heli, 0 ); + heli.lockondelay = 1; + heli setenemymodel( level.chopper_models[type]["enemy"] ); + heli.chaff_offset = level.chaff_offset[type]; + heli.death_model = level.chopper_death_models[type][owner.team]; + heli playloopsound( level.chopper_sounds[type][owner.team] ); + heli.defaultweapon = "cobra_20mm_mp"; + heli.owner = owner; + heli.team = owner.team; + heli setowner( owner ); + heli setteam( owner.team ); + heli.destroyfunc = ::destroyplayerhelicopter; + snd_ent = spawn( "script_origin", heli gettagorigin( "snd_cockpit" ) ); + snd_ent linkto( heli, "snd_cockpit", ( 0, 0, 0 ), ( 0, 0, 0 ) ); + heli.snd_ent = snd_ent; + + if ( isdefined( level.chopper_interior_models ) && isdefined( level.chopper_interior_models[type] ) && isdefined( level.chopper_interior_models[type][owner.team] ) ) + { + heli.interior_model = spawn( "script_model", heli.origin ); + heli.interior_model setmodel( level.chopper_interior_models[type][owner.team] ); + heli.interior_model linkto( heli, "tag_origin", ( 0, 0, 0 ), ( 0, 0, 0 ) ); + } + + heli.killcament = owner; + heli makevehicleunusable(); + maps\mp\_treadfx::loadtreadfx( heli ); + return heli; } deleteplayerheli() { - self notify( "heli_timeup" ); - debug_print_heli( ">>>>>>>Unlink and delete (deletePlayerHeli)" ); - if ( isDefined( self.viewlockedentity ) ) - { - self unlink(); - } - self.heli maps/mp/killstreaks/_helicopter::destroyhelicopter(); - self.heli = undefined; + self notify( "heli_timeup" ); + debug_print_heli( ">>>>>>>Unlink and delete (deletePlayerHeli)" ); + + if ( isdefined( self.viewlockedentity ) ) + self unlink(); + + self.heli maps\mp\killstreaks\_helicopter::destroyhelicopter(); + self.heli = undefined; } destroyplayerhelicopter() { - if ( isDefined( self.owner ) && isDefined( self.owner.heli ) ) - { - self.owner deleteplayerheli(); - } - else - { - self maps/mp/killstreaks/_helicopter::destroyhelicopter(); - } + if ( isdefined( self.owner ) && isdefined( self.owner.heli ) ) + self.owner deleteplayerheli(); + else + self maps\mp\killstreaks\_helicopter::destroyhelicopter(); } debug_print_heli( msg ) { /# - if ( getDvar( "scr_debugheli" ) == "" ) - { - setdvar( "scr_debugheli", "0" ); - } - if ( getDvarInt( "scr_debugheli" ) == 1 ) - { - println( msg ); + if ( getdvar( "scr_debugheli" ) == "" ) + setdvar( "scr_debugheli", "0" ); + + if ( getdvarint( "scr_debugheli" ) == 1 ) + println( msg ); #/ - } } inithelicopter( isdriver, hardpointtype ) { - self.heli.reached_dest = 0; - switch( hardpointtype ) - { - case "helicopter_gunner_mp": - self.heli.maxhealth = level.heli_amored_maxhealth; - break; - case "helicopter_player_firstperson_mp": - self.heli.maxhealth = level.heli_amored_maxhealth; - break; - case "helicopter_player_gunner_mp": - self.heli.maxhealth = level.heli_amored_maxhealth; - break; - default: - self.heli.maxhealth = level.heli_amored_maxhealth; - break; - } - self.heli.rocketdamageoneshot = self.heli.maxhealth + 1; - self.heli.rocketdamagetwoshot = ( self.heli.maxhealth / 2 ) + 1; - self.heli.numflares = 2; - self.heli.nflareoffset = vectorScale( ( 1, 0, 0 ), 256 ); - self.heli.waittime = 0; - self.heli.loopcount = 0; - self.heli.evasive = 0; - self.heli.health_bulletdamageble = level.heli_armor; - self.heli.health_evasive = level.heli_armor; - self.heli.health_low = self.heli.maxhealth * 0,8; - self.heli.targeting_delay = level.heli_targeting_delay; - self.heli.primarytarget = undefined; - self.heli.secondarytarget = undefined; - self.heli.attacker = undefined; - self.heli.missile_ammo = level.heli_missile_max; - self.heli.currentstate = "ok"; - self.heli.lastrocketfiretime = -1; - self.heli.maxlifetime = 55000; - self.heli.donotstop = 1; - self.heli.targetent = spawn( "script_model", ( 1, 0, 0 ) ); - self.heli.targetent setmodel( "tag_origin" ); - self.heli.health = 99999999; - self.heli setturningability( 1 ); - self.heli.starttime = getTime(); - self.heli.startingteam = self.team; - self.heli.startinggametype = level.gametype; - if ( isdriver ) - { - self.heli thread hind_setup_rocket_attack( hardpointtype, self ); - self.heli thread hind_watch_rocket_fire( self ); - self.heli.current_weapon = "mini_gun"; - self.heli.numberrockets = 2; - self.heli.numberminigun = 999; - self.heli setjitterparams( vectorScale( ( 1, 0, 0 ), 3 ), 0,5, 1,5 ); - } - else - { - self.heli.numberrockets = 4; - self.heli.rocketregentime = 3; - self.heli.rocketreloadtime = 6; - self.heli.rocketrefiretime = 0,15; - } - self create_hud( isdriver ); - self thread watchforearlyleave( hardpointtype ); - self thread waitfortimeout( hardpointtype ); - self thread exitheliwaiter(); - self thread gameendheliwaiter( hardpointtype ); - self thread heli_owner_exit( hardpointtype ); - self thread heli_owner_teamkillkicked( hardpointtype ); - self.heli thread maps/mp/killstreaks/_helicopter::heli_damage_monitor( hardpointtype ); - self.heli thread maps/mp/killstreaks/_helicopter::heli_kill_monitor( hardpointtype ); - self.heli thread maps/mp/_heatseekingmissile::missiletarget_lockonmonitor( self, "crashing", "death" ); - self.heli thread maps/mp/_heatseekingmissile::missiletarget_proximitydetonateincomingmissile( "crashing", "death" ); - self.heli thread create_flare_ent( vectorScale( ( 1, 0, 0 ), 100 ) ); - self.heli maps/mp/gametypes/_spawning::create_helicopter_influencers( self.team ); - self.heli thread heli_player_damage_monitor( self ); - self.heli thread heli_health_player( self, hardpointtype ); - self.heli thread debugtags(); + self.heli.reached_dest = 0; + + switch ( hardpointtype ) + { + case "helicopter_gunner_mp": + self.heli.maxhealth = level.heli_amored_maxhealth; + break; + case "helicopter_player_firstperson_mp": + self.heli.maxhealth = level.heli_amored_maxhealth; + break; + case "helicopter_player_gunner_mp": + self.heli.maxhealth = level.heli_amored_maxhealth; + break; + default: + self.heli.maxhealth = level.heli_amored_maxhealth; + break; + } + + self.heli.rocketdamageoneshot = self.heli.maxhealth + 1; + self.heli.rocketdamagetwoshot = self.heli.maxhealth / 2 + 1; + self.heli.numflares = 2; + self.heli.nflareoffset = vectorscale( ( 0, 0, -1 ), 256.0 ); + self.heli.waittime = 0; + self.heli.loopcount = 0; + self.heli.evasive = 0; + self.heli.health_bulletdamageble = level.heli_armor; + self.heli.health_evasive = level.heli_armor; + self.heli.health_low = self.heli.maxhealth * 0.8; + self.heli.targeting_delay = level.heli_targeting_delay; + self.heli.primarytarget = undefined; + self.heli.secondarytarget = undefined; + self.heli.attacker = undefined; + self.heli.missile_ammo = level.heli_missile_max; + self.heli.currentstate = "ok"; + self.heli.lastrocketfiretime = -1; + self.heli.maxlifetime = 55000; + self.heli.donotstop = 1; + self.heli.targetent = spawn( "script_model", ( 0, 0, 0 ) ); + self.heli.targetent setmodel( "tag_origin" ); + self.heli.health = 99999999; + self.heli setturningability( 1 ); + self.heli.starttime = gettime(); + self.heli.startingteam = self.team; + self.heli.startinggametype = level.gametype; + + if ( isdriver ) + { + self.heli thread hind_setup_rocket_attack( hardpointtype, self ); + self.heli thread hind_watch_rocket_fire( self ); + self.heli.current_weapon = "mini_gun"; + self.heli.numberrockets = 2; + self.heli.numberminigun = 999; + self.heli setjitterparams( vectorscale( ( 1, 1, 1 ), 3.0 ), 0.5, 1.5 ); + } + else + { + self.heli.numberrockets = 4; + self.heli.rocketregentime = 3; + self.heli.rocketreloadtime = 6; + self.heli.rocketrefiretime = 0.15; + } + + self create_hud( isdriver ); + self thread watchforearlyleave( hardpointtype ); + self thread waitfortimeout( hardpointtype ); + self thread exitheliwaiter(); + self thread gameendheliwaiter( hardpointtype ); + self thread heli_owner_exit( hardpointtype ); + self thread heli_owner_teamkillkicked( hardpointtype ); + self.heli thread maps\mp\killstreaks\_helicopter::heli_damage_monitor( hardpointtype ); + self.heli thread maps\mp\killstreaks\_helicopter::heli_kill_monitor( hardpointtype ); + self.heli thread maps\mp\_heatseekingmissile::missiletarget_lockonmonitor( self, "crashing", "death" ); + self.heli thread maps\mp\_heatseekingmissile::missiletarget_proximitydetonateincomingmissile( "crashing", "death" ); + self.heli thread create_flare_ent( vectorscale( ( 0, 0, -1 ), 100.0 ) ); + self.heli maps\mp\gametypes\_spawning::create_helicopter_influencers( self.team ); + self.heli thread heli_player_damage_monitor( self ); + self.heli thread heli_health_player( self, hardpointtype ); + self.heli thread debugtags(); } player_heli_reset() { - self cleartargetyaw(); - self cleargoalyaw(); - self setspeed( 45, 25 ); - self setyawspeed( 75, 45, 45 ); - self setmaxpitchroll( 30, 40 ); - self setneargoalnotifydist( 256 ); - self setturningability( 0,3 ); + self cleartargetyaw(); + self cleargoalyaw(); + self setspeed( 45, 25 ); + self setyawspeed( 75, 45, 45 ); + self setmaxpitchroll( 30, 40 ); + self setneargoalnotifydist( 256 ); + self setturningability( 0.3 ); } visionswitch( delay ) { - self endon( "disconnect" ); - self.heli endon( "crashing" ); - self.heli endon( "leaving" ); - self.heli endon( "death" ); - wait delay; - inverted = 0; - self setinfraredvision( 0 ); - self useservervisionset( 1 ); - self setvisionsetforplayer( level.chopper_enhanced_vision, 1 ); - self setclientflag( 3 ); - self clientnotify( "cgfutz" ); - for ( ;; ) - { - while ( self changeseatbuttonpressed() ) - { - if ( !inverted ) - { - self setinfraredvision( 1 ); - self setvisionsetforplayer( level.chopper_infrared_vision, 0,5 ); - self playsoundtoplayer( "mpl_cgunner_flir_on", self ); - } - else - { - self setinfraredvision( 0 ); - self setvisionsetforplayer( level.chopper_enhanced_vision, 0,5 ); - self playsoundtoplayer( "mpl_cgunner_flir_off", self ); - } - inverted = !inverted; - while ( self changeseatbuttonpressed() ) - { - wait 0,05; - } - } - wait 0,05; - } + self endon( "disconnect" ); + self.heli endon( "crashing" ); + self.heli endon( "leaving" ); + self.heli endon( "death" ); + wait( delay ); + inverted = 0; + self setinfraredvision( 0 ); + self useservervisionset( 1 ); + self setvisionsetforplayer( level.chopper_enhanced_vision, 1.0 ); + self setclientflag( 3 ); + self clientnotify( "cgfutz" ); + + for (;;) + { + if ( self changeseatbuttonpressed() ) + { + if ( !inverted ) + { + self setinfraredvision( 1 ); + self setvisionsetforplayer( level.chopper_infrared_vision, 0.5 ); + self playsoundtoplayer( "mpl_cgunner_flir_on", self ); + } + else + { + self setinfraredvision( 0 ); + self setvisionsetforplayer( level.chopper_enhanced_vision, 0.5 ); + self playsoundtoplayer( "mpl_cgunner_flir_off", self ); + } + + inverted = !inverted; + + while ( self changeseatbuttonpressed() ) + wait 0.05; + } + + wait 0.05; + } } hind_setup_rocket_attack( hardpointtype, player ) { - wait 1; - self endon( "death" ); - self endon( "heli_timeup" ); - self notify( "stop_turret_shoot" ); - self endon( "stop_turret_shoot" ); - index = 0; - while ( isDefined( self ) && self.health > 0 ) - { - self waittill( "turret_fire" ); - if ( self.current_weapon == "rockets" ) - { - self.current_weapon = "mini_gun"; - self fireweapon(); - self.numberminigun -= 1; - if ( isDefined( player.ammo_hud ) ) - { - player.ammo_hud setvalue( self.numberminigun ); - } - wait 0,3; - } - } + wait 1; + self endon( "death" ); + self endon( "heli_timeup" ); + self notify( "stop_turret_shoot" ); + self endon( "stop_turret_shoot" ); + index = 0; + + while ( isdefined( self ) && self.health > 0 ) + { + self waittill( "turret_fire" ); + + if ( self.current_weapon == "rockets" ) + { + self.current_weapon = "mini_gun"; + self fireweapon(); + self.numberminigun -= 1; + + if ( isdefined( player.ammo_hud ) ) + player.ammo_hud setvalue( self.numberminigun ); + + wait 0.3; + } + } } rocket_ammo_think( player ) { - player endon( "disconnect" ); - self endon( "death" ); - self endon( "exit_vehicle" ); - self endon( "heli_timeup" ); - while ( 1 ) - { - while ( self.numberrockets == 4 ) - { - wait 0,05; - } - wait self.rocketregentime; - self.numberrockets++; - } + player endon( "disconnect" ); + self endon( "death" ); + self endon( "exit_vehicle" ); + self endon( "heli_timeup" ); + + while ( true ) + { + while ( self.numberrockets == 4 ) + wait 0.05; + + wait( self.rocketregentime ); + self.numberrockets++; + } } hind_watch_rocket_fire( player ) { - player endon( "disconnect" ); - self endon( "death" ); - self endon( "exit_vehicle" ); - self endon( "heli_timeup" ); - self endon( "crashing" ); - self endon( "leaving" ); - self thread watchforoverheat( player ); - while ( isDefined( self ) && self.health > 0 && isDefined( self.targetent ) ) - { - player waittill( "missile_fire", missile ); - missile.killcament = player; - origin = player geteye(); - forward = anglesToForward( player getplayerangles() ); - endpoint = origin + ( forward * 15000 ); - trace = bullettrace( origin, endpoint, 0, self ); - missile missile_settarget( self.targetent, trace[ "position" ] ); - } - self notify( "endWatchForOverheat" ); + player endon( "disconnect" ); + self endon( "death" ); + self endon( "exit_vehicle" ); + self endon( "heli_timeup" ); + self endon( "crashing" ); + self endon( "leaving" ); + self thread watchforoverheat( player ); + + while ( isdefined( self ) && self.health > 0 && isdefined( self.targetent ) ) + { + player waittill( "missile_fire", missile ); + + missile.killcament = player; + origin = player geteye(); + forward = anglestoforward( player getplayerangles() ); + endpoint = origin + forward * 15000; + trace = bullettrace( origin, endpoint, 0, self ); + missile missile_settarget( self.targetent, trace["position"] ); + } + + self notify( "endWatchForOverheat" ); } watchforoverheat( player ) { - player endon( "disconnect" ); - self endon( "death" ); - self endon( "exit_vehicle" ); - self endon( "heli_timeup" ); - self endon( "crashing" ); - self endon( "leaving" ); - self endon( "endWatchForOverheat" ); - while ( 1 ) - { - self waittill( "gunner_turret_overheat" ); - self thread reload_rocket_audio( player ); - self waittill( "gunner_turret_stop_overheat" ); - } + player endon( "disconnect" ); + self endon( "death" ); + self endon( "exit_vehicle" ); + self endon( "heli_timeup" ); + self endon( "crashing" ); + self endon( "leaving" ); + self endon( "endWatchForOverheat" ); + + while ( true ) + { + self waittill( "gunner_turret_overheat" ); + + self thread reload_rocket_audio( player ); + + self waittill( "gunner_turret_stop_overheat" ); + } } reload_rocket_audio( player ) { - player endon( "disconnect" ); - self endon( "death" ); - self endon( "exit_vehicle" ); - self endon( "heli_timeup" ); - self endon( "crashing" ); - self endon( "leaving" ); - self endon( "endWatchForOverheat" ); - self endon( "gunner_turret_stop_overheat" ); - i = 0; - while ( i < 5 ) - { - wait 1; - player playlocalsound( "wpn_gunner_rocket_fire_reload_plr" ); - i++; - } + player endon( "disconnect" ); + self endon( "death" ); + self endon( "exit_vehicle" ); + self endon( "heli_timeup" ); + self endon( "crashing" ); + self endon( "leaving" ); + self endon( "endWatchForOverheat" ); + self endon( "gunner_turret_stop_overheat" ); + + for ( i = 0; i < 5; i++ ) + { + wait 1; + player playlocalsound( "wpn_gunner_rocket_fire_reload_plr" ); + } } hind_out_of_rockets( player ) { - player endon( "disconnect" ); - self endon( "death" ); - self endon( "exit_vehicle" ); - self endon( "heli_timeup" ); - if ( isDefined( player.alt_title ) ) - { - player.alt_title.alpha = 0; - } - if ( isDefined( player.alt_ammo_hud ) ) - { - player.alt_ammo_hud.alpha = 0; - } - wait max( 0, level.heli_missile_reload_time - 0,5 ); - self.snd_ent playsound( level.chopper_sounds[ "missile_reload" ] ); - wait 0,5; - if ( isDefined( player.alt_title ) ) - { - player.alt_title.alpha = 1; - } - if ( isDefined( player.alt_ammo_hud ) ) - { - player.alt_ammo_hud.alpha = 1; - } - self.numberrockets = 2; - if ( isDefined( player.alt_ammo_hud ) ) - { - player.alt_ammo_hud setvalue( 2 ); - } + player endon( "disconnect" ); + self endon( "death" ); + self endon( "exit_vehicle" ); + self endon( "heli_timeup" ); + + if ( isdefined( player.alt_title ) ) + player.alt_title.alpha = 0.0; + + if ( isdefined( player.alt_ammo_hud ) ) + player.alt_ammo_hud.alpha = 0.0; + + wait( max( 0, level.heli_missile_reload_time - 0.5 ) ); + self.snd_ent playsound( level.chopper_sounds["missile_reload"] ); + wait 0.5; + + if ( isdefined( player.alt_title ) ) + player.alt_title.alpha = 1.0; + + if ( isdefined( player.alt_ammo_hud ) ) + player.alt_ammo_hud.alpha = 1.0; + + self.numberrockets = 2; + + if ( isdefined( player.alt_ammo_hud ) ) + player.alt_ammo_hud setvalue( 2 ); } fire_rocket( tagname, player ) { - start_origin = self gettagorigin( tagname ); - trace_angles = self gettagangles( "tag_flash" ); - forward = anglesToForward( trace_angles ); - trace_origin = self gettagorigin( "tag_flash" ); - trace_direction = self gettagangles( "tag_barrel" ); - trace_direction = anglesToForward( trace_direction ) * 5000; - trace = bullettrace( trace_origin, trace_origin + trace_direction, 0, self ); - end_origin = trace[ "position" ]; - magicbullet( "heli_gunner_rockets_mp", start_origin, end_origin, self ); - player playlocalsound( "wpn_gunner_rocket_fire_plr" ); - self playsound( "wpn_rpg_fire_npc" ); - player playrumbleonentity( "damage_heavy" ); - earthquake( 0,35, 0,5, start_origin, 1000, self ); + start_origin = self gettagorigin( tagname ); + trace_angles = self gettagangles( "tag_flash" ); + forward = anglestoforward( trace_angles ); + trace_origin = self gettagorigin( "tag_flash" ); + trace_direction = self gettagangles( "tag_barrel" ); + trace_direction = anglestoforward( trace_direction ) * 5000; + trace = bullettrace( trace_origin, trace_origin + trace_direction, 0, self ); + end_origin = trace["position"]; + magicbullet( "heli_gunner_rockets_mp", start_origin, end_origin, self ); + player playlocalsound( "wpn_gunner_rocket_fire_plr" ); + self playsound( "wpn_rpg_fire_npc" ); + player playrumbleonentity( "damage_heavy" ); + earthquake( 0.35, 0.5, start_origin, 1000, self ); } create_gunner_hud() { - self.minigun_hud = newclienthudelem( self ); - self.minigun_hud.alignx = "left"; - self.minigun_hud.aligny = "bottom"; - self.minigun_hud.horzalign = "user_left"; - self.minigun_hud.vertalign = "user_bottom"; - self.minigun_hud.font = "small"; - self.minigun_hud settext( &"MP_HELI_FIRE_MINIGUN" ); - self.minigun_hud.hidewheninmenu = 1; - self.minigun_hud.hidewhenindemo = 1; - self.minigun_hud.x = 30; - self.minigun_hud.y = -70; - self.minigun_hud.fontscale = 1,25; - self.zoom_hud = newclienthudelem( self ); - self.zoom_hud.alignx = "left"; - self.zoom_hud.aligny = "bottom"; - self.zoom_hud.horzalign = "user_left"; - self.zoom_hud.vertalign = "user_bottom"; - self.zoom_hud.font = "small"; - self.zoom_hud settext( &"KILLSTREAK_INCREASE_ZOOM" ); - self.zoom_hud.hidewheninmenu = 1; - self.zoom_hud.hidewhenindemo = 1; - self.zoom_hud.x = 30; - self.zoom_hud.y = -55; - self.zoom_hud.fontscale = 1,25; - self.missile_hud = newclienthudelem( self ); - self.missile_hud.alignx = "left"; - self.missile_hud.aligny = "bottom"; - self.missile_hud.horzalign = "user_left"; - self.missile_hud.vertalign = "user_bottom"; - self.missile_hud.font = "small"; - self.missile_hud settext( &"MP_HELI_FIRE_MISSILES" ); - self.missile_hud.hidewheninmenu = 1; - self.missile_hud.hidewhenindemo = 1; - self.missile_hud.x = 30; - self.missile_hud.y = -40; - self.missile_hud.fontscale = 1,25; - self.move_hud = newclienthudelem( self ); - self.move_hud.alignx = "left"; - self.move_hud.aligny = "bottom"; - self.move_hud.horzalign = "user_left"; - self.move_hud.vertalign = "user_bottom"; - self.move_hud.font = "small"; - self.move_hud settext( &"MP_HELI_NEW_LOCATION" ); - self.move_hud.hidewheninmenu = 1; - self.move_hud.hidewhenindemo = 1; - self.move_hud.x = 30; - self.move_hud.y = -25; - self.move_hud.fontscale = 1,25; - self.hud_prompt_exit = newclienthudelem( self ); - self.hud_prompt_exit.alignx = "left"; - self.hud_prompt_exit.aligny = "bottom"; - self.hud_prompt_exit.horzalign = "user_left"; - self.hud_prompt_exit.vertalign = "user_bottom"; - self.hud_prompt_exit.font = "small"; - self.hud_prompt_exit.fontscale = 1,25; - self.hud_prompt_exit.hidewheninmenu = 1; - self.hud_prompt_exit.hidewhenindemo = 1; - self.hud_prompt_exit.archived = 0; - self.hud_prompt_exit.x = 30; - self.hud_prompt_exit.y = -10; - self.hud_prompt_exit settext( level.remoteexithint ); - self thread fade_out_hint_hud(); + self.minigun_hud = newclienthudelem( self ); + self.minigun_hud.alignx = "left"; + self.minigun_hud.aligny = "bottom"; + self.minigun_hud.horzalign = "user_left"; + self.minigun_hud.vertalign = "user_bottom"; + self.minigun_hud.font = "small"; + self.minigun_hud settext( &"MP_HELI_FIRE_MINIGUN" ); + self.minigun_hud.hidewheninmenu = 1; + self.minigun_hud.hidewhenindemo = 1; + self.minigun_hud.x = 30; + self.minigun_hud.y = -70; + self.minigun_hud.fontscale = 1.25; + self.zoom_hud = newclienthudelem( self ); + self.zoom_hud.alignx = "left"; + self.zoom_hud.aligny = "bottom"; + self.zoom_hud.horzalign = "user_left"; + self.zoom_hud.vertalign = "user_bottom"; + self.zoom_hud.font = "small"; + self.zoom_hud settext( &"KILLSTREAK_INCREASE_ZOOM" ); + self.zoom_hud.hidewheninmenu = 1; + self.zoom_hud.hidewhenindemo = 1; + self.zoom_hud.x = 30; + self.zoom_hud.y = -55; + self.zoom_hud.fontscale = 1.25; + self.missile_hud = newclienthudelem( self ); + self.missile_hud.alignx = "left"; + self.missile_hud.aligny = "bottom"; + self.missile_hud.horzalign = "user_left"; + self.missile_hud.vertalign = "user_bottom"; + self.missile_hud.font = "small"; + self.missile_hud settext( &"MP_HELI_FIRE_MISSILES" ); + self.missile_hud.hidewheninmenu = 1; + self.missile_hud.hidewhenindemo = 1; + self.missile_hud.x = 30; + self.missile_hud.y = -40; + self.missile_hud.fontscale = 1.25; + self.move_hud = newclienthudelem( self ); + self.move_hud.alignx = "left"; + self.move_hud.aligny = "bottom"; + self.move_hud.horzalign = "user_left"; + self.move_hud.vertalign = "user_bottom"; + self.move_hud.font = "small"; + self.move_hud settext( &"MP_HELI_NEW_LOCATION" ); + self.move_hud.hidewheninmenu = 1; + self.move_hud.hidewhenindemo = 1; + self.move_hud.x = 30; + self.move_hud.y = -25; + self.move_hud.fontscale = 1.25; + self.hud_prompt_exit = newclienthudelem( self ); + self.hud_prompt_exit.alignx = "left"; + self.hud_prompt_exit.aligny = "bottom"; + self.hud_prompt_exit.horzalign = "user_left"; + self.hud_prompt_exit.vertalign = "user_bottom"; + self.hud_prompt_exit.font = "small"; + self.hud_prompt_exit.fontscale = 1.25; + self.hud_prompt_exit.hidewheninmenu = 1; + self.hud_prompt_exit.hidewhenindemo = 1; + self.hud_prompt_exit.archived = 0; + self.hud_prompt_exit.x = 30; + self.hud_prompt_exit.y = -10; + self.hud_prompt_exit settext( level.remoteexithint ); + self thread fade_out_hint_hud(); } fade_out_hint_hud() { - wait 8; - time = 0; - while ( time < 2 ) - { - if ( !isDefined( self.minigun_hud ) ) - { - return; - } - self.minigun_hud.alpha -= 0,025; - self.zoom_hud.alpha -= 0,025; - time += 0,05; - wait 0,05; - } - if ( !isDefined( self.minigun_hud ) ) - { - return; - } - self.minigun_hud.alpha = 0; - self.zoom_hud.alpha = 0; + wait 8; + time = 0; + + while ( time < 2 ) + { + if ( !isdefined( self.minigun_hud ) ) + return; + + self.minigun_hud.alpha -= 0.025; + self.zoom_hud.alpha -= 0.025; + time += 0.05; + wait 0.05; + } + + if ( !isdefined( self.minigun_hud ) ) + return; + + self.minigun_hud.alpha = 0; + self.zoom_hud.alpha = 0; } create_hud( isdriver ) { - debug_print_heli( ">>>>>>>create_hud" ); - if ( isdriver ) - { - hud_minigun_create(); - hud_rocket_create(); - self.leaving_play_area = newclienthudelem( self ); - self.leaving_play_area.fontscale = 1,25; - self.leaving_play_area.x = 0; - self.leaving_play_area.y = 50; - self.leaving_play_area.alignx = "center"; - self.leaving_play_area.aligny = "top"; - self.leaving_play_area.horzalign = "user_center"; - self.leaving_play_area.vertalign = "user_top"; - self.leaving_play_area.hidewhendead = 0; - self.leaving_play_area.hidewheninmenu = 1; - self.leaving_play_area.archived = 0; - self.leaving_play_area.alpha = 0; - self.leaving_play_area settext( &"MP_HELI_LEAVING_BATTLEFIELD" ); - } + debug_print_heli( ">>>>>>>create_hud" ); + + if ( isdriver ) + { + hud_minigun_create(); + hud_rocket_create(); + self.leaving_play_area = newclienthudelem( self ); + self.leaving_play_area.fontscale = 1.25; + self.leaving_play_area.x = 0; + self.leaving_play_area.y = 50; + self.leaving_play_area.alignx = "center"; + self.leaving_play_area.aligny = "top"; + self.leaving_play_area.horzalign = "user_center"; + self.leaving_play_area.vertalign = "user_top"; + self.leaving_play_area.hidewhendead = 0; + self.leaving_play_area.hidewheninmenu = 1; + self.leaving_play_area.archived = 0; + self.leaving_play_area.alpha = 0.0; + self.leaving_play_area settext( &"MP_HELI_LEAVING_BATTLEFIELD" ); + } } remove_hud() { - debug_print_heli( ">>>>>>>remove_hud" ); - if ( isDefined( self.ammo_hud ) ) - { - self.ammo_hud destroy(); - } - if ( isDefined( self.title ) ) - { - self.title destroy(); - } - if ( isDefined( self.alt_ammo_hud ) ) - { - self.alt_ammo_hud destroy(); - } - if ( isDefined( self.alt_title ) ) - { - self.alt_title destroy(); - } - if ( isDefined( self.leaving_play_area ) ) - { - self.leaving_play_area destroy(); - } - if ( isDefined( self.minigun_hud ) ) - { - self.minigun_hud destroy(); - } - if ( isDefined( self.missile_hud ) ) - { - self.missile_hud destroy(); - } - if ( isDefined( self.zoom_hud ) ) - { - self.zoom_hud destroy(); - } - if ( isDefined( self.move_hud ) ) - { - self.move_hud destroy(); - } - if ( isDefined( self.hud_prompt_exit ) ) - { - self.hud_prompt_exit destroy(); - } - self.ammo_hud = undefined; - self.alt_ammo_hud = undefined; - self.alt_title = undefined; - self.leaving_play_area = undefined; - self clearclientflag( 3 ); - self clientnotify( "nofutz" ); - self notify( "hind weapons disabled" ); + debug_print_heli( ">>>>>>>remove_hud" ); + + if ( isdefined( self.ammo_hud ) ) + self.ammo_hud destroy(); + + if ( isdefined( self.title ) ) + self.title destroy(); + + if ( isdefined( self.alt_ammo_hud ) ) + self.alt_ammo_hud destroy(); + + if ( isdefined( self.alt_title ) ) + self.alt_title destroy(); + + if ( isdefined( self.leaving_play_area ) ) + self.leaving_play_area destroy(); + + if ( isdefined( self.minigun_hud ) ) + self.minigun_hud destroy(); + + if ( isdefined( self.missile_hud ) ) + self.missile_hud destroy(); + + if ( isdefined( self.zoom_hud ) ) + self.zoom_hud destroy(); + + if ( isdefined( self.move_hud ) ) + self.move_hud destroy(); + + if ( isdefined( self.hud_prompt_exit ) ) + self.hud_prompt_exit destroy(); + + self.ammo_hud = undefined; + self.alt_ammo_hud = undefined; + self.alt_title = undefined; + self.leaving_play_area = undefined; + self clearclientflag( 3 ); + self clientnotify( "nofutz" ); + self notify( "hind weapons disabled" ); } gameendheliwaiter( hardpointtype ) { - self endon( "disconnect" ); - self endon( "heli_timeup" ); - level waittill( "game_ended" ); - debug_print_heli( ">>>>>>>gameEndHeliWaiter" ); - self thread player_heli_leave( hardpointtype ); + self endon( "disconnect" ); + self endon( "heli_timeup" ); + + level waittill( "game_ended" ); + + debug_print_heli( ">>>>>>>gameEndHeliWaiter" ); + self thread player_heli_leave( hardpointtype ); } heli_owner_teamkillkicked( hardpointtype ) { - self endon( "disconnect" ); - self endon( "heli_timeup" ); - self waittill( "teamKillKicked" ); - self thread player_heli_leave( hardpointtype ); + self endon( "disconnect" ); + self endon( "heli_timeup" ); + + self waittill( "teamKillKicked" ); + + self thread player_heli_leave( hardpointtype ); } heli_owner_exit( hardpointtype ) { - self endon( "disconnect" ); - self endon( "heli_timeup" ); - wait 1; - while ( 1 ) - { - timeused = 0; - while ( self usebuttonpressed() ) - { - timeused += 0,05; - if ( timeused > 0,25 ) - { - self thread player_heli_leave( hardpointtype ); - return; - } - wait 0,05; - } - wait 0,05; - } + self endon( "disconnect" ); + self endon( "heli_timeup" ); + wait 1; + + while ( true ) + { + timeused = 0; + + while ( self usebuttonpressed() ) + { + timeused += 0.05; + + if ( timeused > 0.25 ) + { + self thread player_heli_leave( hardpointtype ); + return; + } + + wait 0.05; + } + + wait 0.05; + } } exitheliwaiter() { - self endon( "disconnect" ); - self waittill( "heli_timeup" ); - debug_print_heli( ">>>>>>>exitHeliWaiter" ); - self remove_hud(); - if ( isDefined( self.heli ) ) - { - debug_print_heli( ">>>>>>>Unlink and delete (exitHeliWaiter)" ); - if ( isDefined( self.viewlockedentity ) ) - { - self unlink(); - if ( isDefined( level.gameended ) && level.gameended ) - { - self freezecontrolswrapper( 1 ); - } - } - self.heli = undefined; - } - self setinfraredvision( 0 ); - self useservervisionset( 0 ); - self.killstreak_waitamount = undefined; - if ( isDefined( self.carryicon ) ) - { - self.carryicon.alpha = self.prevcarryiconalpha; - } - if ( isDefined( self ) ) - { - self clearusingremote(); - } + self endon( "disconnect" ); + + self waittill( "heli_timeup" ); + + debug_print_heli( ">>>>>>>exitHeliWaiter" ); + self remove_hud(); + + if ( isdefined( self.heli ) ) + { + debug_print_heli( ">>>>>>>Unlink and delete (exitHeliWaiter)" ); + + if ( isdefined( self.viewlockedentity ) ) + { + self unlink(); + + if ( isdefined( level.gameended ) && level.gameended ) + self freezecontrolswrapper( 1 ); + } + + self.heli = undefined; + } + + self setinfraredvision( 0 ); + self useservervisionset( 0 ); + self.killstreak_waitamount = undefined; + + if ( isdefined( self.carryicon ) ) + self.carryicon.alpha = self.prevcarryiconalpha; + + if ( isdefined( self ) ) + self clearusingremote(); } heli_player_damage_monitor( player ) { - player endon( "disconnect" ); - self endon( "death" ); - self endon( "crashing" ); - self endon( "leaving" ); - for ( ;; ) - { - self waittill( "damage", damage, attacker, direction, point, type ); - if ( !isDefined( attacker ) || !isplayer( attacker ) ) - { - continue; - } - else - { - heli_friendlyfire = maps/mp/gametypes/_weaponobjects::friendlyfirecheck( self.owner, attacker ); - if ( !heli_friendlyfire ) - { - break; - } - else if ( !level.hardcoremode ) - { - if ( isDefined( self.owner ) && attacker == self.owner ) - { - break; - } - else - { - if ( level.teambased ) - { - if ( isDefined( attacker.team ) ) - { - isvalidattacker = attacker.team != self.team; - } - } - else - { - isvalidattacker = 1; - } - if ( !isvalidattacker ) - { - break; - } - } - else - { - if ( type == "MOD_PISTOL_BULLET" || type == "MOD_RIFLE_BULLET" ) - { - earthquake( 0,1, 0,5, point, 1000, player ); - } - if ( type == "MOD_PROJECTILE" ) - { - earthquake( 0,7, 1,5, point, 1000, player ); - } - player sendkillstreakdamageevent( int( damage ) ); - } - } - } - } + player endon( "disconnect" ); + self endon( "death" ); + self endon( "crashing" ); + self endon( "leaving" ); + + for (;;) + { + self waittill( "damage", damage, attacker, direction, point, type ); + + if ( !isdefined( attacker ) || !isplayer( attacker ) ) + continue; + + heli_friendlyfire = maps\mp\gametypes\_weaponobjects::friendlyfirecheck( self.owner, attacker ); + + if ( !heli_friendlyfire ) + continue; + + if ( !level.hardcoremode ) + { + if ( isdefined( self.owner ) && attacker == self.owner ) + continue; + + if ( level.teambased ) + isvalidattacker = isdefined( attacker.team ) && attacker.team != self.team; + else + isvalidattacker = 1; + + if ( !isvalidattacker ) + continue; + } + + if ( type == "MOD_PISTOL_BULLET" || type == "MOD_RIFLE_BULLET" ) + earthquake( 0.1, 0.5, point, 1000, player ); + + if ( type == "MOD_PROJECTILE" ) + earthquake( 0.7, 1.5, point, 1000, player ); + + player sendkillstreakdamageevent( int( damage ) ); + } } heli_health_player( player, hardpointtype ) { - if ( !isalive( player ) ) - { - if ( isDefined( self.heli ) ) - { - self deleteplayerheli(); - } - debug_print_heli( ">>>>>>>send notify [dead before starting]" ); - player notify( "heli_timeup" ); - } - self thread maps/mp/killstreaks/_helicopter::heli_health( hardpointtype, player, "heli_timeup" ); + if ( !isalive( player ) ) + { + if ( isdefined( self.heli ) ) + self deleteplayerheli(); + + debug_print_heli( ">>>>>>>send notify [dead before starting]" ); + player notify( "heli_timeup" ); + } + + self thread maps\mp\killstreaks\_helicopter::heli_health( hardpointtype, player, "heli_timeup" ); } debugtag( tagname ) { /# - start_origin = self gettagorigin( tagname ); - if ( isDefined( start_origin ) ) - { - sphere( start_origin, 5, ( 1, 0, 0 ), 1, 1, 10, 1 ); + start_origin = self gettagorigin( tagname ); + + if ( isdefined( start_origin ) ) + sphere( start_origin, 5, ( 1, 0, 0 ), 1, 1, 10, 1 ); #/ - } } debugtags() { - self endon( "death" ); - while ( 1 ) - { - wait 0,05; - tagname = getDvar( #"CEED6282" ); - if ( !isDefined( tagname ) || tagname == "" ) - { - continue; - } - self debugtag( tagname ); - } + self endon( "death" ); + + while ( true ) + { + wait 0.05; + tagname = getdvar( _hash_CEED6282 ); + + if ( !isdefined( tagname ) || tagname == "" ) + continue; + + self debugtag( tagname ); + } } hud_minigun_create() { - if ( !isDefined( self.minigun_hud ) ) - { - self.minigun_hud = []; - } - self.minigun_hud[ "gun" ] = newclienthudelem( self ); - self.minigun_hud[ "gun" ].alignx = "right"; - self.minigun_hud[ "gun" ].aligny = "bottom"; - self.minigun_hud[ "gun" ].horzalign = "user_right"; - self.minigun_hud[ "gun" ].vertalign = "user_bottom"; - self.minigun_hud[ "gun" ].alpha = 0,55; - self.minigun_hud[ "gun" ] fadeovertime( 0,05 ); - self.minigun_hud[ "gun" ].y = 0; - self.minigun_hud[ "gun" ].x = 23; - self.minigun_hud[ "gun" ] setshader( "hud_hind_cannon01", 64, 64 ); - self.minigun_hud[ "gun" ].hidewheninmenu = 1; - self.minigun_hud[ "button" ] = newclienthudelem( self ); - self.minigun_hud[ "button" ].alignx = "right"; - self.minigun_hud[ "button" ].aligny = "bottom"; - self.minigun_hud[ "button" ].horzalign = "user_right"; - self.minigun_hud[ "button" ].vertalign = "user_bottom"; - self.minigun_hud[ "button" ].font = "small"; - self.minigun_hud[ "button" ] settext( "[{+attack}]" ); - self.minigun_hud[ "button" ].hidewheninmenu = 1; - if ( level.ps3 ) - { - self.minigun_hud[ "button" ].x = -30; - self.minigun_hud[ "button" ].y = -4; - self.minigun_hud[ "button" ].fontscale = 1,25; - } - else - { - self.minigun_hud[ "button" ].x = -28; - self.minigun_hud[ "button" ].y = -6; - self.minigun_hud[ "button" ].fontscale = 1; - } - self thread hud_minigun_destroy(); + if ( !isdefined( self.minigun_hud ) ) + self.minigun_hud = []; + + self.minigun_hud["gun"] = newclienthudelem( self ); + self.minigun_hud["gun"].alignx = "right"; + self.minigun_hud["gun"].aligny = "bottom"; + self.minigun_hud["gun"].horzalign = "user_right"; + self.minigun_hud["gun"].vertalign = "user_bottom"; + self.minigun_hud["gun"].alpha = 0.55; + self.minigun_hud["gun"] fadeovertime( 0.05 ); + self.minigun_hud["gun"].y = 0; + self.minigun_hud["gun"].x = 23; + self.minigun_hud["gun"] setshader( "hud_hind_cannon01", 64, 64 ); + self.minigun_hud["gun"].hidewheninmenu = 1; + self.minigun_hud["button"] = newclienthudelem( self ); + self.minigun_hud["button"].alignx = "right"; + self.minigun_hud["button"].aligny = "bottom"; + self.minigun_hud["button"].horzalign = "user_right"; + self.minigun_hud["button"].vertalign = "user_bottom"; + self.minigun_hud["button"].font = "small"; + self.minigun_hud["button"] settext( "[{+attack}]" ); + self.minigun_hud["button"].hidewheninmenu = 1; + + if ( level.ps3 ) + { + self.minigun_hud["button"].x = -30; + self.minigun_hud["button"].y = -4; + self.minigun_hud["button"].fontscale = 1.25; + } + else + { + self.minigun_hud["button"].x = -28; + self.minigun_hud["button"].y = -6; + self.minigun_hud["button"].fontscale = 1.0; + } + + self thread hud_minigun_destroy(); } hud_minigun_destroy() { - self waittill( "hind weapons disabled" ); - self.minigun_hud[ "gun" ] destroy(); - self.minigun_hud[ "button" ] destroy(); + self waittill( "hind weapons disabled" ); + + self.minigun_hud["gun"] destroy(); + self.minigun_hud["button"] destroy(); } hud_minigun_think() { - self endon( "hind weapons disabled" ); - self endon( "disconnect" ); - player = get_players()[ 0 ]; - while ( 1 ) - { - while ( !player attackbuttonpressed() ) - { - wait 0,05; - } - swap_counter = 1; - self.minigun_hud[ "gun" ] fadeovertime( 0,05 ); - self.minigun_hud[ "gun" ].alpha = 0,65; - while ( player attackbuttonpressed() ) - { - wait 0,05; - player playloopsound( "wpn_hind_minigun_fire_plr_loop" ); - self.minigun_hud[ "gun" ] setshader( "hud_hind_cannon0" + swap_counter, 64, 64 ); - if ( swap_counter == 5 ) - { - swap_counter = 1; - continue; - } - else - { - swap_counter++; - } - } - self.minigun_hud[ "gun" ] setshader( "hud_hind_cannon01", 64, 64 ); - self.minigun_hud[ "gun" ] fadeovertime( 0,05 ); - self.minigun_hud[ "gun" ].alpha = 0,55; - player stoploopsound( 0,048 ); - } + self endon( "hind weapons disabled" ); + self endon( "disconnect" ); + player = get_players()[0]; + + while ( true ) + { + while ( !player attackbuttonpressed() ) + wait 0.05; + + swap_counter = 1; + self.minigun_hud["gun"] fadeovertime( 0.05 ); + self.minigun_hud["gun"].alpha = 0.65; + + while ( player attackbuttonpressed() ) + { + wait 0.05; + player playloopsound( "wpn_hind_minigun_fire_plr_loop" ); + self.minigun_hud["gun"] setshader( "hud_hind_cannon0" + swap_counter, 64, 64 ); + + if ( swap_counter == 5 ) + swap_counter = 1; + else + swap_counter++; + } + + self.minigun_hud["gun"] setshader( "hud_hind_cannon01", 64, 64 ); + self.minigun_hud["gun"] fadeovertime( 0.05 ); + self.minigun_hud["gun"].alpha = 0.55; + player stoploopsound( 0.048 ); + } } hud_rocket_create() { - if ( !isDefined( self.rocket_hud ) ) - { - self.rocket_hud = []; - } - self.rocket_hud[ "border" ] = newclienthudelem( self ); - self.rocket_hud[ "border" ].alignx = "left"; - self.rocket_hud[ "border" ].aligny = "bottom"; - self.rocket_hud[ "border" ].horzalign = "user_left"; - self.rocket_hud[ "border" ].vertalign = "user_bottom"; - self.rocket_hud[ "border" ].y = -6; - self.rocket_hud[ "border" ].x = 2; - self.rocket_hud[ "border" ].alpha = 0,55; - self.rocket_hud[ "border" ] fadeovertime( 0,05 ); - self.rocket_hud[ "border" ] setshader( "hud_hind_rocket_border_small", 20, 5 ); - self.rocket_hud[ "border" ].hidewheninmenu = 1; - self.rocket_hud[ "loading_border" ] = newclienthudelem( self ); - self.rocket_hud[ "loading_border" ].alignx = "left"; - self.rocket_hud[ "loading_border" ].aligny = "bottom"; - self.rocket_hud[ "loading_border" ].horzalign = "user_left"; - self.rocket_hud[ "loading_border" ].vertalign = "user_bottom"; - self.rocket_hud[ "loading_border" ].y = -2; - self.rocket_hud[ "loading_border" ].x = 2; - self.rocket_hud[ "loading_border" ].alpha = 0,55; - self.rocket_hud[ "loading_border" ] fadeovertime( 0,05 ); - self.rocket_hud[ "loading_border" ] setshader( "hud_hind_rocket_loading", 20, 5 ); - self.rocket_hud[ "loading_border" ].hidewheninmenu = 1; - self.rocket_hud[ "loading_bar" ] = newclienthudelem( self ); - self.rocket_hud[ "loading_bar" ].alignx = "left"; - self.rocket_hud[ "loading_bar" ].aligny = "bottom"; - self.rocket_hud[ "loading_bar" ].horzalign = "user_left"; - self.rocket_hud[ "loading_bar" ].vertalign = "user_bottom"; - self.rocket_hud[ "loading_bar" ].y = -2; - self.rocket_hud[ "loading_bar" ].x = 2; - self.rocket_hud[ "loading_bar" ].alpha = 0,55; - self.rocket_hud[ "loading_bar" ] fadeovertime( 0,05 ); - self.rocket_hud[ "loading_bar" ].width = 20; - self.rocket_hud[ "loading_bar" ].height = 5; - self.rocket_hud[ "loading_bar" ].shader = "hud_hind_rocket_loading_fill"; - self.rocket_hud[ "loading_bar" ] setshader( "hud_hind_rocket_loading_fill", 20, 5 ); - self.rocket_hud[ "loading_bar" ].hidewheninmenu = 1; - self.rocket_hud[ "loading_bar_bg" ] = spawnstruct(); - self.rocket_hud[ "loading_bar_bg" ].elemtype = "bar"; - self.rocket_hud[ "loading_bar_bg" ].bar = self.rocket_hud[ "loading_bar" ]; - self.rocket_hud[ "loading_bar_bg" ].width = 20; - self.rocket_hud[ "loading_bar_bg" ].height = 5; - self.rocket_hud[ "ammo1" ] = newclienthudelem( self ); - self.rocket_hud[ "ammo1" ].alignx = "left"; - self.rocket_hud[ "ammo1" ].aligny = "bottom"; - self.rocket_hud[ "ammo1" ].horzalign = "user_left"; - self.rocket_hud[ "ammo1" ].vertalign = "user_bottom"; - self.rocket_hud[ "ammo1" ].alpha = 0,55; - self.rocket_hud[ "ammo1" ] fadeovertime( 0,05 ); - self.rocket_hud[ "ammo1" ].y = -10; - self.rocket_hud[ "ammo1" ].x = -7; - self.rocket_hud[ "ammo1" ] setshader( "hud_hind_rocket", 48, 48 ); - self.rocket_hud[ "ammo1" ].hidewheninmenu = 1; - self.rocket_hud[ "ammo2" ] = newclienthudelem( self ); - self.rocket_hud[ "ammo2" ].alignx = "left"; - self.rocket_hud[ "ammo2" ].aligny = "bottom"; - self.rocket_hud[ "ammo2" ].horzalign = "user_left"; - self.rocket_hud[ "ammo2" ].vertalign = "user_bottom"; - self.rocket_hud[ "ammo2" ].alpha = 0,55; - self.rocket_hud[ "ammo2" ] fadeovertime( 0,05 ); - self.rocket_hud[ "ammo2" ].y = -10; - self.rocket_hud[ "ammo2" ].x = -18; - self.rocket_hud[ "ammo2" ] setshader( "hud_hind_rocket", 48, 48 ); - self.rocket_hud[ "ammo2" ].hidewheninmenu = 1; - self.rocket_hud[ "button" ] = newclienthudelem( self ); - self.rocket_hud[ "button" ].alignx = "left"; - self.rocket_hud[ "button" ].aligny = "bottom"; - self.rocket_hud[ "button" ].horzalign = "user_left"; - self.rocket_hud[ "button" ].vertalign = "user_bottom"; - self.rocket_hud[ "button" ].font = "small"; - self.rocket_hud[ "button" ] settext( "[{+speed_throw}]" ); - self.rocket_hud[ "button" ].hidewheninmenu = 1; - if ( level.ps3 ) - { - self.rocket_hud[ "button" ].x = 25; - self.rocket_hud[ "button" ].y = -4; - self.rocket_hud[ "button" ].fontscale = 1,25; - } - else - { - self.rocket_hud[ "button" ].x = 23; - self.rocket_hud[ "button" ].y = -6; - self.rocket_hud[ "button" ].fontscale = 1; - } - self thread hud_rocket_think(); - self thread hud_rocket_destroy(); + if ( !isdefined( self.rocket_hud ) ) + self.rocket_hud = []; + + self.rocket_hud["border"] = newclienthudelem( self ); + self.rocket_hud["border"].alignx = "left"; + self.rocket_hud["border"].aligny = "bottom"; + self.rocket_hud["border"].horzalign = "user_left"; + self.rocket_hud["border"].vertalign = "user_bottom"; + self.rocket_hud["border"].y = -6; + self.rocket_hud["border"].x = 2; + self.rocket_hud["border"].alpha = 0.55; + self.rocket_hud["border"] fadeovertime( 0.05 ); + self.rocket_hud["border"] setshader( "hud_hind_rocket_border_small", 20, 5 ); + self.rocket_hud["border"].hidewheninmenu = 1; + self.rocket_hud["loading_border"] = newclienthudelem( self ); + self.rocket_hud["loading_border"].alignx = "left"; + self.rocket_hud["loading_border"].aligny = "bottom"; + self.rocket_hud["loading_border"].horzalign = "user_left"; + self.rocket_hud["loading_border"].vertalign = "user_bottom"; + self.rocket_hud["loading_border"].y = -2; + self.rocket_hud["loading_border"].x = 2; + self.rocket_hud["loading_border"].alpha = 0.55; + self.rocket_hud["loading_border"] fadeovertime( 0.05 ); + self.rocket_hud["loading_border"] setshader( "hud_hind_rocket_loading", 20, 5 ); + self.rocket_hud["loading_border"].hidewheninmenu = 1; + self.rocket_hud["loading_bar"] = newclienthudelem( self ); + self.rocket_hud["loading_bar"].alignx = "left"; + self.rocket_hud["loading_bar"].aligny = "bottom"; + self.rocket_hud["loading_bar"].horzalign = "user_left"; + self.rocket_hud["loading_bar"].vertalign = "user_bottom"; + self.rocket_hud["loading_bar"].y = -2; + self.rocket_hud["loading_bar"].x = 2; + self.rocket_hud["loading_bar"].alpha = 0.55; + self.rocket_hud["loading_bar"] fadeovertime( 0.05 ); + self.rocket_hud["loading_bar"].width = 20; + self.rocket_hud["loading_bar"].height = 5; + self.rocket_hud["loading_bar"].shader = "hud_hind_rocket_loading_fill"; + self.rocket_hud["loading_bar"] setshader( "hud_hind_rocket_loading_fill", 20, 5 ); + self.rocket_hud["loading_bar"].hidewheninmenu = 1; + self.rocket_hud["loading_bar_bg"] = spawnstruct(); + self.rocket_hud["loading_bar_bg"].elemtype = "bar"; + self.rocket_hud["loading_bar_bg"].bar = self.rocket_hud["loading_bar"]; + self.rocket_hud["loading_bar_bg"].width = 20; + self.rocket_hud["loading_bar_bg"].height = 5; + self.rocket_hud["ammo1"] = newclienthudelem( self ); + self.rocket_hud["ammo1"].alignx = "left"; + self.rocket_hud["ammo1"].aligny = "bottom"; + self.rocket_hud["ammo1"].horzalign = "user_left"; + self.rocket_hud["ammo1"].vertalign = "user_bottom"; + self.rocket_hud["ammo1"].alpha = 0.55; + self.rocket_hud["ammo1"] fadeovertime( 0.05 ); + self.rocket_hud["ammo1"].y = -10; + self.rocket_hud["ammo1"].x = -7; + self.rocket_hud["ammo1"] setshader( "hud_hind_rocket", 48, 48 ); + self.rocket_hud["ammo1"].hidewheninmenu = 1; + self.rocket_hud["ammo2"] = newclienthudelem( self ); + self.rocket_hud["ammo2"].alignx = "left"; + self.rocket_hud["ammo2"].aligny = "bottom"; + self.rocket_hud["ammo2"].horzalign = "user_left"; + self.rocket_hud["ammo2"].vertalign = "user_bottom"; + self.rocket_hud["ammo2"].alpha = 0.55; + self.rocket_hud["ammo2"] fadeovertime( 0.05 ); + self.rocket_hud["ammo2"].y = -10; + self.rocket_hud["ammo2"].x = -18; + self.rocket_hud["ammo2"] setshader( "hud_hind_rocket", 48, 48 ); + self.rocket_hud["ammo2"].hidewheninmenu = 1; + self.rocket_hud["button"] = newclienthudelem( self ); + self.rocket_hud["button"].alignx = "left"; + self.rocket_hud["button"].aligny = "bottom"; + self.rocket_hud["button"].horzalign = "user_left"; + self.rocket_hud["button"].vertalign = "user_bottom"; + self.rocket_hud["button"].font = "small"; + self.rocket_hud["button"] settext( "[{+speed_throw}]" ); + self.rocket_hud["button"].hidewheninmenu = 1; + + if ( level.ps3 ) + { + self.rocket_hud["button"].x = 25; + self.rocket_hud["button"].y = -4; + self.rocket_hud["button"].fontscale = 1.25; + } + else + { + self.rocket_hud["button"].x = 23; + self.rocket_hud["button"].y = -6; + self.rocket_hud["button"].fontscale = 1; + } + + self thread hud_rocket_think(); + self thread hud_rocket_destroy(); } hud_rocket_destroy() { - self waittill( "hind weapons disabled" ); - self.rocket_hud[ "border" ] destroy(); - self.rocket_hud[ "loading_border" ] destroy(); - self.rocket_hud[ "loading_bar" ] destroy(); - self.rocket_hud[ "ammo1" ] destroy(); - self.rocket_hud[ "button" ] destroy(); - self.rocket_hud[ "ammo2" ] destroy(); + self waittill( "hind weapons disabled" ); + + self.rocket_hud["border"] destroy(); + self.rocket_hud["loading_border"] destroy(); + self.rocket_hud["loading_bar"] destroy(); + self.rocket_hud["ammo1"] destroy(); + self.rocket_hud["button"] destroy(); + self.rocket_hud["ammo2"] destroy(); } hud_rocket_think() { - self endon( "hind weapons disabled" ); - self endon( "disconnect" ); - last_rocket_count = self.heli.numberrockets; - while ( 1 ) - { - i = 1; - while ( i < 3 ) - { - if ( ( i - 1 ) < self.heli.numberrockets ) - { - self.rocket_hud[ "ammo" + i ] setshader( "hud_hind_rocket", 48, 48 ); - self.rocket_hud[ "ammo" + i ].alpha = 0,55; - self.rocket_hud[ "ammo" + i ] fadeovertime( 0,05 ); - i++; - continue; - } - else - { - self.rocket_hud[ "ammo" + i ] setshader( "hud_hind_rocket", 48, 48 ); - self.rocket_hud[ "ammo" + i ].alpha = 0; - self.rocket_hud[ "ammo" + i ] fadeovertime( 0,05 ); - } - i++; - } - if ( last_rocket_count != self.heli.numberrockets ) - { - if ( self.heli.numberrockets == 0 ) - { - rateofchange = level.heli_missile_reload_time; - } - last_rocket_count = self.heli.numberrockets; - self.rocket_hud[ "loading_bar_bg" ] updateammobarscale( self.heli.numberrockets * 0,5 ); - if ( self.heli.numberrockets == 0 ) - { - rateofchange = level.heli_missile_reload_time; - self.rocket_hud[ "loading_bar_bg" ] updateammobarscale( 1, rateofchange ); - } - } - wait 0,05; - } + self endon( "hind weapons disabled" ); + self endon( "disconnect" ); + last_rocket_count = self.heli.numberrockets; + + while ( true ) + { + for ( i = 1; i < 3; i++ ) + { + if ( i - 1 < self.heli.numberrockets ) + { + self.rocket_hud["ammo" + i] setshader( "hud_hind_rocket", 48, 48 ); + self.rocket_hud["ammo" + i].alpha = 0.55; + self.rocket_hud["ammo" + i] fadeovertime( 0.05 ); + continue; + } + + self.rocket_hud["ammo" + i] setshader( "hud_hind_rocket", 48, 48 ); + self.rocket_hud["ammo" + i].alpha = 0; + self.rocket_hud["ammo" + i] fadeovertime( 0.05 ); + } + + if ( last_rocket_count != self.heli.numberrockets ) + { + if ( self.heli.numberrockets == 0 ) + rateofchange = level.heli_missile_reload_time; + + last_rocket_count = self.heli.numberrockets; + self.rocket_hud["loading_bar_bg"] updateammobarscale( self.heli.numberrockets * 0.5 ); + + if ( self.heli.numberrockets == 0 ) + { + rateofchange = level.heli_missile_reload_time; + self.rocket_hud["loading_bar_bg"] updateammobarscale( 1, rateofchange ); + } + } + + wait 0.05; + } } updateammobarscale( barfrac, rateofchange ) { - barwidth = int( ( self.width * barfrac ) + 0,5 ); - if ( !barwidth ) - { - barwidth = 1; - } - if ( isDefined( rateofchange ) && barwidth <= self.width ) - { - self.bar scaleovertime( rateofchange, barwidth, self.height ); - } - else - { - self.bar setshader( self.bar.shader, barwidth, self.height ); - } + barwidth = int( self.width * barfrac + 0.5 ); + + if ( !barwidth ) + barwidth = 1; + + if ( isdefined( rateofchange ) && barwidth <= self.width ) + self.bar scaleovertime( rateofchange, barwidth, self.height ); + else + self.bar setshader( self.bar.shader, barwidth, self.height ); } player_heli_leave( hardpointtype ) { - self endon( "heli_timeup" ); - self.heli thread maps/mp/killstreaks/_helicopter::heli_leave( hardpointtype ); - wait 0,1; - debug_print_heli( ">>>>>>>player_heli_leave" ); - self notify( "heli_timeup" ); + self endon( "heli_timeup" ); + self.heli thread maps\mp\killstreaks\_helicopter::heli_leave( hardpointtype ); + wait 0.1; + debug_print_heli( ">>>>>>>player_heli_leave" ); + self notify( "heli_timeup" ); } waitfortimeout( hardpointtype ) { - self endon( "disconnect" ); - self endon( "heli_timeup" ); - self.heli endon( "death" ); - self.killstreak_waitamount = self.heli.maxlifetime; - while ( 1 ) - { - timeleft = self.heli.maxlifetime - getTime() - self.heli.starttime; - if ( timeleft <= 0 ) - { - player_heli_leave( hardpointtype ); - debug_print_heli( ">>>>>>>send notify [exit_vehicle***heli_timeup] TIMEUP!!!!!!!!!!!!!!" ); - } - wait 0,1; - } + self endon( "disconnect" ); + self endon( "heli_timeup" ); + self.heli endon( "death" ); + self.killstreak_waitamount = self.heli.maxlifetime; + + while ( true ) + { + timeleft = self.heli.maxlifetime - ( gettime() - self.heli.starttime ); + + if ( timeleft <= 0 ) + { + player_heli_leave( hardpointtype ); + debug_print_heli( ">>>>>>>send notify [exit_vehicle***heli_timeup] TIMEUP!!!!!!!!!!!!!!" ); + } + + wait 0.1; + } } debugcheckforexit( hardpointtype ) { /# - self endon( "disconnect" ); - self endon( "heli_timeup" ); - if ( isDefined( self.pers[ "isBot" ] ) && self.pers[ "isBot" ] ) - { - return; - } - while ( 1 ) - { - if ( self usebuttonpressed() ) - { - player_heli_leave( hardpointtype ); - debug_print_heli( ">>>>>>>send notify [exit_vehicle***heli_timeup]" ); - return; - } - wait 0,1; + self endon( "disconnect" ); + self endon( "heli_timeup" ); + + if ( isdefined( self.pers["isBot"] ) && self.pers["isBot"] ) + return; + + while ( true ) + { + if ( self usebuttonpressed() ) + { + player_heli_leave( hardpointtype ); + debug_print_heli( ">>>>>>>send notify [exit_vehicle***heli_timeup]" ); + return; + } + + wait 0.1; + } #/ - } } playpilotdialog( dialog, time ) { - if ( isDefined( time ) ) - { - wait time; - } - if ( !isDefined( self.pilotvoicenumber ) ) - { - self.pilotvoicenumber = 0; - } - soundalias = level.teamprefix[ self.team ] + self.pilotvoicenumber + "_" + dialog; - self playlocalsound( soundalias ); + if ( isdefined( time ) ) + wait( time ); + + if ( !isdefined( self.pilotvoicenumber ) ) + self.pilotvoicenumber = 0; + + soundalias = level.teamprefix[self.team] + self.pilotvoicenumber + "_" + dialog; + self playlocalsound( soundalias ); } diff --git a/Multiplayer Core/patch_mp/maps/mp/killstreaks/_killstreak_weapons.gsc b/Multiplayer Core/patch_mp/maps/mp/killstreaks/_killstreak_weapons.gsc index 007b702..c164418 100644 --- a/Multiplayer Core/patch_mp/maps/mp/killstreaks/_killstreak_weapons.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/killstreaks/_killstreak_weapons.gsc @@ -1,633 +1,586 @@ -#include maps/mp/gametypes/_class; -#include maps/mp/_popups; -#include maps/mp/gametypes/_weapons; -#include maps/mp/killstreaks/_killstreakrules; -#include maps/mp/killstreaks/_supplydrop; -#include maps/mp/gametypes/_globallogic_utils; -#include maps/mp/killstreaks/_killstreaks; -#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\killstreaks\_killstreaks; +#include maps\mp\gametypes\_globallogic_utils; +#include maps\mp\killstreaks\_supplydrop; +#include maps\mp\killstreaks\_killstreakrules; +#include maps\mp\gametypes\_weapons; +#include maps\mp\_popups; +#include maps\mp\gametypes\_class; init() { - precacheshader( "hud_ks_minigun" ); - precacheshader( "hud_ks_m32" ); - maps/mp/killstreaks/_killstreaks::registerkillstreak( "inventory_minigun_mp", "inventory_minigun_mp", "killstreak_minigun", "minigun_used", ::usecarriedkillstreakweapon, 0, 1, "MINIGUN_USED" ); - maps/mp/killstreaks/_killstreaks::registerkillstreakstrings( "inventory_minigun_mp", &"KILLSTREAK_EARNED_MINIGUN", &"KILLSTREAK_MINIGUN_NOT_AVAILABLE", &"KILLSTREAK_MINIGUN_INBOUND" ); - maps/mp/killstreaks/_killstreaks::registerkillstreakdialog( "inventory_minigun_mp", "mpl_killstreak_minigun", "kls_death_used", "", "kls_death_enemy", "", "kls_death_ready" ); - maps/mp/killstreaks/_killstreaks::registerkillstreakdevdvar( "inventory_minigun_mp", "scr_giveminigun_drop" ); - maps/mp/killstreaks/_killstreaks::registerkillstreak( "minigun_mp", "minigun_mp", "killstreak_minigun", "minigun_used", ::usecarriedkillstreakweapon, 0, 1, "MINIGUN_USED" ); - maps/mp/killstreaks/_killstreaks::registerkillstreakstrings( "minigun_mp", &"KILLSTREAK_EARNED_MINIGUN", &"KILLSTREAK_MINIGUN_NOT_AVAILABLE", &"KILLSTREAK_MINIGUN_INBOUND" ); - maps/mp/killstreaks/_killstreaks::registerkillstreakdialog( "minigun_mp", "mpl_killstreak_minigun", "kls_death_used", "", "kls_death_enemy", "", "kls_death_ready" ); - maps/mp/killstreaks/_killstreaks::registerkillstreak( "inventory_m32_mp", "inventory_m32_mp", "killstreak_m32", "m32_used", ::usecarriedkillstreakweapon, 0, 1, "M32_USED" ); - maps/mp/killstreaks/_killstreaks::registerkillstreakstrings( "inventory_m32_mp", &"KILLSTREAK_EARNED_M32", &"KILLSTREAK_M32_NOT_AVAILABLE", &"KILLSTREAK_M32_INBOUND" ); - maps/mp/killstreaks/_killstreaks::registerkillstreakdialog( "inventory_m32_mp", "mpl_killstreak_m32", "kls_mgl_used", "", "kls_mgl_enemy", "", "kls_mgl_ready" ); - maps/mp/killstreaks/_killstreaks::registerkillstreakdevdvar( "inventory_m32_mp", "scr_givem32_drop" ); - maps/mp/killstreaks/_killstreaks::overrideentitycameraindemo( "inventory_m32_mp", 1 ); - maps/mp/killstreaks/_killstreaks::registerkillstreak( "m32_mp", "m32_mp", "killstreak_m32", "m32_used", ::usecarriedkillstreakweapon, 0, 1, "M32_USED" ); - maps/mp/killstreaks/_killstreaks::registerkillstreakstrings( "m32_mp", &"KILLSTREAK_EARNED_M32", &"KILLSTREAK_M32_NOT_AVAILABLE", &"KILLSTREAK_M32_INBOUND" ); - maps/mp/killstreaks/_killstreaks::registerkillstreakdialog( "m32_mp", "mpl_killstreak_m32", "kls_mgl_used", "", "kls_mgl_enemy", "", "kls_mgl_ready" ); - maps/mp/killstreaks/_killstreaks::overrideentitycameraindemo( "m32_mp", 1 ); - level.killstreakicons[ "killstreak_minigun" ] = "hud_ks_minigun"; - level.killstreakicons[ "killstreak_m32" ] = "hud_ks_m32"; - level.killstreakicons[ "killstreak_m202_flash_mp" ] = "hud_ks_m202"; - level.killstreakicons[ "killstreak_m220_tow_drop_mp" ] = "hud_ks_tv_guided_marker"; - level.killstreakicons[ "killstreak_m220_tow_mp" ] = "hud_ks_tv_guided_missile"; - level thread onplayerconnect(); - setdvar( "scr_HeldKillstreak_Penalty", 0 ); + precacheshader( "hud_ks_minigun" ); + precacheshader( "hud_ks_m32" ); + maps\mp\killstreaks\_killstreaks::registerkillstreak( "inventory_minigun_mp", "inventory_minigun_mp", "killstreak_minigun", "minigun_used", ::usecarriedkillstreakweapon, 0, 1, "MINIGUN_USED" ); + maps\mp\killstreaks\_killstreaks::registerkillstreakstrings( "inventory_minigun_mp", &"KILLSTREAK_EARNED_MINIGUN", &"KILLSTREAK_MINIGUN_NOT_AVAILABLE", &"KILLSTREAK_MINIGUN_INBOUND" ); + maps\mp\killstreaks\_killstreaks::registerkillstreakdialog( "inventory_minigun_mp", "mpl_killstreak_minigun", "kls_death_used", "", "kls_death_enemy", "", "kls_death_ready" ); + maps\mp\killstreaks\_killstreaks::registerkillstreakdevdvar( "inventory_minigun_mp", "scr_giveminigun_drop" ); + maps\mp\killstreaks\_killstreaks::registerkillstreak( "minigun_mp", "minigun_mp", "killstreak_minigun", "minigun_used", ::usecarriedkillstreakweapon, 0, 1, "MINIGUN_USED" ); + maps\mp\killstreaks\_killstreaks::registerkillstreakstrings( "minigun_mp", &"KILLSTREAK_EARNED_MINIGUN", &"KILLSTREAK_MINIGUN_NOT_AVAILABLE", &"KILLSTREAK_MINIGUN_INBOUND" ); + maps\mp\killstreaks\_killstreaks::registerkillstreakdialog( "minigun_mp", "mpl_killstreak_minigun", "kls_death_used", "", "kls_death_enemy", "", "kls_death_ready" ); + maps\mp\killstreaks\_killstreaks::registerkillstreak( "inventory_m32_mp", "inventory_m32_mp", "killstreak_m32", "m32_used", ::usecarriedkillstreakweapon, 0, 1, "M32_USED" ); + maps\mp\killstreaks\_killstreaks::registerkillstreakstrings( "inventory_m32_mp", &"KILLSTREAK_EARNED_M32", &"KILLSTREAK_M32_NOT_AVAILABLE", &"KILLSTREAK_M32_INBOUND" ); + maps\mp\killstreaks\_killstreaks::registerkillstreakdialog( "inventory_m32_mp", "mpl_killstreak_m32", "kls_mgl_used", "", "kls_mgl_enemy", "", "kls_mgl_ready" ); + maps\mp\killstreaks\_killstreaks::registerkillstreakdevdvar( "inventory_m32_mp", "scr_givem32_drop" ); + maps\mp\killstreaks\_killstreaks::overrideentitycameraindemo( "inventory_m32_mp", 1 ); + maps\mp\killstreaks\_killstreaks::registerkillstreak( "m32_mp", "m32_mp", "killstreak_m32", "m32_used", ::usecarriedkillstreakweapon, 0, 1, "M32_USED" ); + maps\mp\killstreaks\_killstreaks::registerkillstreakstrings( "m32_mp", &"KILLSTREAK_EARNED_M32", &"KILLSTREAK_M32_NOT_AVAILABLE", &"KILLSTREAK_M32_INBOUND" ); + maps\mp\killstreaks\_killstreaks::registerkillstreakdialog( "m32_mp", "mpl_killstreak_m32", "kls_mgl_used", "", "kls_mgl_enemy", "", "kls_mgl_ready" ); + maps\mp\killstreaks\_killstreaks::overrideentitycameraindemo( "m32_mp", 1 ); + level.killstreakicons["killstreak_minigun"] = "hud_ks_minigun"; + level.killstreakicons["killstreak_m32"] = "hud_ks_m32"; + level.killstreakicons["killstreak_m202_flash_mp"] = "hud_ks_m202"; + level.killstreakicons["killstreak_m220_tow_drop_mp"] = "hud_ks_tv_guided_marker"; + level.killstreakicons["killstreak_m220_tow_mp"] = "hud_ks_tv_guided_missile"; + level thread onplayerconnect(); + setdvar( "scr_HeldKillstreak_Penalty", 0 ); } onplayerconnect() { - for ( ;; ) - { - level waittill( "connecting", player ); - player thread onplayerspawned(); - } + for (;;) + { + level waittill( "connecting", player ); + + player thread onplayerspawned(); + } } onplayerspawned() { - self endon( "disconnect" ); - for ( ;; ) - { - self waittill( "spawned_player" ); - self.firedkillstreakweapon = 0; - self.usingkillstreakheldweapon = undefined; - if ( !isfirstround() && !isoneround() ) - { - if ( level.roundstartkillstreakdelay > ( maps/mp/gametypes/_globallogic_utils::gettimepassed() / 1000 ) ) - { - self thread watchkillstreakweapondelay(); - } - } - } + self endon( "disconnect" ); + + for (;;) + { + self waittill( "spawned_player" ); + + self.firedkillstreakweapon = 0; + self.usingkillstreakheldweapon = undefined; + + if ( !isfirstround() && !isoneround() ) + { + if ( level.roundstartkillstreakdelay > maps\mp\gametypes\_globallogic_utils::gettimepassed() / 1000 ) + self thread watchkillstreakweapondelay(); + } + } } watchkillstreakweapondelay() { - self endon( "disconnect" ); - self endon( "death" ); - while ( 1 ) - { - currentweapon = self getcurrentweapon(); - self waittill( "weapon_change", newweapon ); - if ( level.roundstartkillstreakdelay < ( maps/mp/gametypes/_globallogic_utils::gettimepassed() / 1000 ) ) - { - return; - } - while ( !maps/mp/killstreaks/_killstreaks::iskillstreakweapon( newweapon ) ) - { - wait 0,5; - } - if ( maps/mp/killstreaks/_killstreaks::isdelayablekillstreak( newweapon ) && isheldkillstreakweapon( newweapon ) ) - { - timeleft = int( level.roundstartkillstreakdelay - ( maps/mp/gametypes/_globallogic_utils::gettimepassed() / 1000 ) ); - if ( !timeleft ) - { - timeleft = 1; - } - self iprintlnbold( &"MP_UNAVAILABLE_FOR_N", " " + timeleft + " ", &"EXE_SECONDS" ); - self switchtoweapon( currentweapon ); - wait 0,5; - } - } + self endon( "disconnect" ); + self endon( "death" ); + + while ( true ) + { + currentweapon = self getcurrentweapon(); + + self waittill( "weapon_change", newweapon ); + + if ( level.roundstartkillstreakdelay < maps\mp\gametypes\_globallogic_utils::gettimepassed() / 1000 ) + return; + + if ( !maps\mp\killstreaks\_killstreaks::iskillstreakweapon( newweapon ) ) + { + wait 0.5; + continue; + } + + if ( maps\mp\killstreaks\_killstreaks::isdelayablekillstreak( newweapon ) && isheldkillstreakweapon( newweapon ) ) + { + timeleft = int( level.roundstartkillstreakdelay - maps\mp\gametypes\_globallogic_utils::gettimepassed() / 1000 ); + + if ( !timeleft ) + timeleft = 1; + + self iprintlnbold( &"MP_UNAVAILABLE_FOR_N", " " + timeleft + " ", &"EXE_SECONDS" ); + self switchtoweapon( currentweapon ); + wait 0.5; + } + } } usekillstreakweapondrop( hardpointtype ) { - if ( self maps/mp/killstreaks/_supplydrop::issupplydropgrenadeallowed( hardpointtype ) == 0 ) - { - return 0; - } - result = self maps/mp/killstreaks/_supplydrop::usesupplydropmarker(); - self notify( "supply_drop_marker_done" ); - if ( !isDefined( result ) || !result ) - { - return 0; - } - return result; + if ( self maps\mp\killstreaks\_supplydrop::issupplydropgrenadeallowed( hardpointtype ) == 0 ) + return 0; + + result = self maps\mp\killstreaks\_supplydrop::usesupplydropmarker(); + self notify( "supply_drop_marker_done" ); + + if ( !isdefined( result ) || !result ) + return 0; + + return result; } usecarriedkillstreakweapon( hardpointtype ) { - if ( self maps/mp/killstreaks/_killstreakrules::iskillstreakallowed( hardpointtype, self.team ) == 0 ) - { - self switchtoweapon( self.lastdroppableweapon ); - return 0; - } - if ( !isDefined( hardpointtype ) ) - { - return 0; - } - currentweapon = self getcurrentweapon(); - if ( hardpointtype == "none" ) - { - return 0; - } - level maps/mp/gametypes/_weapons::addlimitedweapon( hardpointtype, self, 3 ); - if ( issubstr( hardpointtype, "inventory" ) ) - { - isfrominventory = 1; - } - else - { - isfrominventory = 0; - } - currentammo = self getammocount( hardpointtype ); - if ( hardpointtype != "minigun_mp" && hardpointtype == "inventory_minigun_mp" && isDefined( self.minigunstart ) || self.minigunstart == 0 && hardpointtype != "m32_mp" && hardpointtype == "inventory_m32_mp" || !isDefined( self.m32start ) && self.m32start == 0 ) - { - if ( hardpointtype == "minigun_mp" || hardpointtype == "inventory_minigun_mp" ) - { - self.minigunstart = 1; - } - else - { - self.m32start = 1; - } - self maps/mp/killstreaks/_killstreaks::playkillstreakstartdialog( hardpointtype, self.team, 1 ); - level.globalkillstreakscalled++; - self addweaponstat( hardpointtype, "used", 1 ); - level thread maps/mp/_popups::displayteammessagetoall( level.killstreaks[ hardpointtype ].inboundtext, self ); - if ( weaponclipsize( hardpointtype ) > currentammo ) - { - } - else - { - } - self.pers[ "held_killstreak_clip_count" ][ hardpointtype ] = weaponclipsize( hardpointtype ); - if ( isfrominventory == 0 ) - { - if ( self.pers[ "killstreak_quantity" ][ hardpointtype ] > 0 ) - { - ammopool = weaponmaxammo( hardpointtype ); - } - else - { - ammopool = self.pers[ "held_killstreak_ammo_count" ][ hardpointtype ]; - } - self setweaponammoclip( hardpointtype, self.pers[ "held_killstreak_clip_count" ][ hardpointtype ] ); - self setweaponammostock( hardpointtype, ammopool - self.pers[ "held_killstreak_clip_count" ][ hardpointtype ] ); - } - } - if ( hardpointtype == "minigun_mp" || hardpointtype == "inventory_minigun_mp" ) - { - if ( !isDefined( self.minigunactive ) || !self.minigunactive ) - { - killstreak_id = self maps/mp/killstreaks/_killstreakrules::killstreakstart( hardpointtype, self.team, 0, 0 ); - if ( hardpointtype == "inventory_minigun_mp" ) - { - killstreak_id = self.pers[ "killstreak_unique_id" ][ self.pers[ "killstreak_unique_id" ].size - 1 ]; - } - self.minigunid = killstreak_id; - self.minigunactive = 1; - } - else - { - killstreak_id = self.minigunid; - } - } - else - { - if ( !isDefined( self.m32active ) || !self.m32active ) - { - killstreak_id = self maps/mp/killstreaks/_killstreakrules::killstreakstart( hardpointtype, self.team, 0, 0 ); - if ( hardpointtype == "inventory_m32_mp" ) - { - killstreak_id = self.pers[ "killstreak_unique_id" ][ self.pers[ "killstreak_unique_id" ].size - 1 ]; - } - self.m32id = killstreak_id; - self.m32active = 1; - } - else - { - killstreak_id = self.m32id; - } - } + if ( self maps\mp\killstreaks\_killstreakrules::iskillstreakallowed( hardpointtype, self.team ) == 0 ) + { + self switchtoweapon( self.lastdroppableweapon ); + return false; + } + + if ( !isdefined( hardpointtype ) ) + return false; + + currentweapon = self getcurrentweapon(); + + if ( hardpointtype == "none" ) + return false; + + level maps\mp\gametypes\_weapons::addlimitedweapon( hardpointtype, self, 3 ); + + if ( issubstr( hardpointtype, "inventory" ) ) + isfrominventory = 1; + else + isfrominventory = 0; + + currentammo = self getammocount( hardpointtype ); + + if ( ( hardpointtype == "minigun_mp" || hardpointtype == "inventory_minigun_mp" ) && ( !isdefined( self.minigunstart ) || self.minigunstart == 0 ) || ( hardpointtype == "m32_mp" || hardpointtype == "inventory_m32_mp" ) && ( !isdefined( self.m32start ) || self.m32start == 0 ) ) + { + if ( hardpointtype == "minigun_mp" || hardpointtype == "inventory_minigun_mp" ) + self.minigunstart = 1; + else + self.m32start = 1; + + self maps\mp\killstreaks\_killstreaks::playkillstreakstartdialog( hardpointtype, self.team, 1 ); + level.globalkillstreakscalled++; + self addweaponstat( hardpointtype, "used", 1 ); + level thread maps\mp\_popups::displayteammessagetoall( level.killstreaks[hardpointtype].inboundtext, self ); + self.pers["held_killstreak_clip_count"][hardpointtype] = weaponclipsize( hardpointtype ) > currentammo ? currentammo : weaponclipsize( hardpointtype ); + + if ( isfrominventory == 0 ) + { + if ( self.pers["killstreak_quantity"][hardpointtype] > 0 ) + ammopool = weaponmaxammo( hardpointtype ); + else + ammopool = self.pers["held_killstreak_ammo_count"][hardpointtype]; + + self setweaponammoclip( hardpointtype, self.pers["held_killstreak_clip_count"][hardpointtype] ); + self setweaponammostock( hardpointtype, ammopool - self.pers["held_killstreak_clip_count"][hardpointtype] ); + } + } + + if ( hardpointtype == "minigun_mp" || hardpointtype == "inventory_minigun_mp" ) + { + if ( !isdefined( self.minigunactive ) || !self.minigunactive ) + { + killstreak_id = self maps\mp\killstreaks\_killstreakrules::killstreakstart( hardpointtype, self.team, 0, 0 ); + + if ( hardpointtype == "inventory_minigun_mp" ) + killstreak_id = self.pers["killstreak_unique_id"][self.pers["killstreak_unique_id"].size - 1]; + + self.minigunid = killstreak_id; + self.minigunactive = 1; + } + else + killstreak_id = self.minigunid; + } + else if ( !isdefined( self.m32active ) || !self.m32active ) + { + killstreak_id = self maps\mp\killstreaks\_killstreakrules::killstreakstart( hardpointtype, self.team, 0, 0 ); + + if ( hardpointtype == "inventory_m32_mp" ) + killstreak_id = self.pers["killstreak_unique_id"][self.pers["killstreak_unique_id"].size - 1]; + + self.m32id = killstreak_id; + self.m32active = 1; + } + else + killstreak_id = self.m32id; /# - assert( killstreak_id != -1 ); + assert( killstreak_id != -1 ); #/ - self.firedkillstreakweapon = 0; - self setblockweaponpickup( hardpointtype, 1 ); - if ( isfrominventory ) - { - self setweaponammoclip( hardpointtype, self.pers[ "held_killstreak_clip_count" ][ hardpointtype ] ); - self setweaponammostock( hardpointtype, self.pers[ "killstreak_ammo_count" ][ self.pers[ "killstreak_ammo_count" ].size - 1 ] - self.pers[ "held_killstreak_clip_count" ][ hardpointtype ] ); - } - notifystring = "killstreakWeapon_" + hardpointtype; - self notify( notifystring ); - self thread watchkillstreakweaponswitch( hardpointtype, killstreak_id, isfrominventory ); - self thread watchkillstreakweapondeath( hardpointtype, killstreak_id, isfrominventory ); - self thread watchkillstreakroundchange( isfrominventory, killstreak_id ); - self thread watchplayerdeath( hardpointtype ); - if ( isfrominventory ) - { - self thread watchkillstreakremoval( hardpointtype, killstreak_id ); - } - self.usingkillstreakheldweapon = 1; - return 0; + self.firedkillstreakweapon = 0; + self setblockweaponpickup( hardpointtype, 1 ); + + if ( isfrominventory ) + { + self setweaponammoclip( hardpointtype, self.pers["held_killstreak_clip_count"][hardpointtype] ); + self setweaponammostock( hardpointtype, self.pers["killstreak_ammo_count"][self.pers["killstreak_ammo_count"].size - 1] - self.pers["held_killstreak_clip_count"][hardpointtype] ); + } + + notifystring = "killstreakWeapon_" + hardpointtype; + self notify( notifystring ); + self thread watchkillstreakweaponswitch( hardpointtype, killstreak_id, isfrominventory ); + self thread watchkillstreakweapondeath( hardpointtype, killstreak_id, isfrominventory ); + self thread watchkillstreakroundchange( isfrominventory, killstreak_id ); + self thread watchplayerdeath( hardpointtype ); + + if ( isfrominventory ) + self thread watchkillstreakremoval( hardpointtype, killstreak_id ); + + self.usingkillstreakheldweapon = 1; + return false; } usekillstreakweaponfromcrate( hardpointtype ) { - if ( !isDefined( hardpointtype ) ) - { - return 0; - } - if ( hardpointtype == "none" ) - { - return 0; - } - self.firedkillstreakweapon = 0; - self setblockweaponpickup( hardpointtype, 1 ); - killstreak_id = self maps/mp/killstreaks/_killstreakrules::killstreakstart( hardpointtype, self.team, 0, 0 ); + if ( !isdefined( hardpointtype ) ) + return false; + + if ( hardpointtype == "none" ) + return false; + + self.firedkillstreakweapon = 0; + self setblockweaponpickup( hardpointtype, 1 ); + killstreak_id = self maps\mp\killstreaks\_killstreakrules::killstreakstart( hardpointtype, self.team, 0, 0 ); /# - assert( killstreak_id != -1 ); + assert( killstreak_id != -1 ); #/ - if ( issubstr( hardpointtype, "inventory" ) ) - { - isfrominventory = 1; - } - else - { - isfrominventory = 0; - } - self thread watchkillstreakweaponswitch( hardpointtype, killstreak_id, isfrominventory ); - self thread watchkillstreakweapondeath( hardpointtype, killstreak_id, isfrominventory ); - if ( isfrominventory ) - { - self thread watchkillstreakremoval( hardpointtype, killstreak_id ); - } - self.usingkillstreakheldweapon = 1; - return 1; + if ( issubstr( hardpointtype, "inventory" ) ) + isfrominventory = 1; + else + isfrominventory = 0; + + self thread watchkillstreakweaponswitch( hardpointtype, killstreak_id, isfrominventory ); + self thread watchkillstreakweapondeath( hardpointtype, killstreak_id, isfrominventory ); + + if ( isfrominventory ) + self thread watchkillstreakremoval( hardpointtype, killstreak_id ); + + self.usingkillstreakheldweapon = 1; + return true; } watchkillstreakweaponswitch( killstreakweapon, killstreak_id, isfrominventory ) { - self endon( "disconnect" ); - self endon( "death" ); - while ( 1 ) - { - currentweapon = self getcurrentweapon(); - self waittill( "weapon_change", newweapon ); - while ( level.infinalkillcam ) - { - continue; - } - while ( newweapon == "none" ) - { - continue; - } - currentammo = self getammocount( killstreakweapon ); - currentammoinclip = self getweaponammoclip( killstreakweapon ); - if ( isfrominventory && currentammo > 0 ) - { - killstreakindex = self maps/mp/killstreaks/_killstreaks::getkillstreakindexbyid( killstreak_id ); - if ( isDefined( killstreakindex ) ) - { - self.pers[ "killstreak_ammo_count" ][ killstreakindex ] = currentammo; - self.pers[ "held_killstreak_clip_count" ][ killstreakweapon ] = currentammoinclip; - } - } - if ( maps/mp/killstreaks/_killstreaks::iskillstreakweapon( newweapon ) && !isheldkillstreakweapon( newweapon ) ) - { - continue; - } - while ( isgameplayweapon( newweapon ) ) - { - continue; - } - if ( isheldkillstreakweapon( newweapon ) && newweapon == self.lastnonkillstreakweapon ) - { - continue; - } - killstreakid = maps/mp/killstreaks/_killstreaks::gettopkillstreakuniqueid(); - self.pers[ "held_killstreak_ammo_count" ][ killstreakweapon ] = currentammo; - self.pers[ "held_killstreak_clip_count" ][ killstreakweapon ] = currentammoinclip; - if ( killstreak_id != -1 ) - { - self notify( "killstreak_weapon_switch" ); - } - self.firedkillstreakweapon = 0; - self.usingkillstreakheldweapon = undefined; - waittillframeend; - if ( currentammo != 0 || self.pers[ "killstreak_quantity" ][ killstreakweapon ] > 0 && isfrominventory && isDefined( killstreakid ) && killstreakid != killstreak_id ) - { - maps/mp/killstreaks/_killstreakrules::killstreakstop( killstreakweapon, self.team, killstreak_id ); - if ( killstreakweapon == "minigun_mp" || killstreakweapon == "inventory_minigun_mp" ) - { - self.minigunstart = 0; - self.minigunactive = 0; - } - else - { - self.m32start = 0; - self.m32active = 0; - } - if ( self.pers[ "killstreak_quantity" ][ killstreakweapon ] > 0 ) - { - self.pers[ "held_killstreak_ammo_count" ][ killstreakweapon ] = weaponmaxammo( killstreakweapon ); - self maps/mp/gametypes/_class::setweaponammooverall( killstreakweapon, self.pers[ "held_killstreak_ammo_count" ][ killstreakweapon ] ); - self.pers[ "killstreak_quantity" ][ killstreakweapon ]--; + self endon( "disconnect" ); + self endon( "death" ); - } - } - if ( isfrominventory && currentammo == 0 ) - { - self takeweapon( killstreakweapon ); - self maps/mp/killstreaks/_killstreaks::removeusedkillstreak( killstreakweapon, killstreak_id ); - self maps/mp/killstreaks/_killstreaks::activatenextkillstreak(); - } - return; - } + while ( true ) + { + currentweapon = self getcurrentweapon(); + + self waittill( "weapon_change", newweapon ); + + if ( level.infinalkillcam ) + continue; + + if ( newweapon == "none" ) + continue; + + currentammo = self getammocount( killstreakweapon ); + currentammoinclip = self getweaponammoclip( killstreakweapon ); + + if ( isfrominventory && currentammo > 0 ) + { + killstreakindex = self maps\mp\killstreaks\_killstreaks::getkillstreakindexbyid( killstreak_id ); + + if ( isdefined( killstreakindex ) ) + { + self.pers["killstreak_ammo_count"][killstreakindex] = currentammo; + self.pers["held_killstreak_clip_count"][killstreakweapon] = currentammoinclip; + } + } + + if ( maps\mp\killstreaks\_killstreaks::iskillstreakweapon( newweapon ) && !isheldkillstreakweapon( newweapon ) ) + continue; + + if ( isgameplayweapon( newweapon ) ) + continue; + + if ( isheldkillstreakweapon( newweapon ) && newweapon == self.lastnonkillstreakweapon ) + continue; + + killstreakid = maps\mp\killstreaks\_killstreaks::gettopkillstreakuniqueid(); + self.pers["held_killstreak_ammo_count"][killstreakweapon] = currentammo; + self.pers["held_killstreak_clip_count"][killstreakweapon] = currentammoinclip; + + if ( killstreak_id != -1 ) + self notify( "killstreak_weapon_switch" ); + + self.firedkillstreakweapon = 0; + self.usingkillstreakheldweapon = undefined; + waittillframeend; + + if ( currentammo == 0 || self.pers["killstreak_quantity"][killstreakweapon] > 0 || isfrominventory && isdefined( killstreakid ) && killstreakid != killstreak_id ) + { + maps\mp\killstreaks\_killstreakrules::killstreakstop( killstreakweapon, self.team, killstreak_id ); + + if ( killstreakweapon == "minigun_mp" || killstreakweapon == "inventory_minigun_mp" ) + { + self.minigunstart = 0; + self.minigunactive = 0; + } + else + { + self.m32start = 0; + self.m32active = 0; + } + + if ( self.pers["killstreak_quantity"][killstreakweapon] > 0 ) + { + self.pers["held_killstreak_ammo_count"][killstreakweapon] = weaponmaxammo( killstreakweapon ); + self maps\mp\gametypes\_class::setweaponammooverall( killstreakweapon, self.pers["held_killstreak_ammo_count"][killstreakweapon] ); + self.pers["killstreak_quantity"][killstreakweapon]--; + } + } + + if ( isfrominventory && currentammo == 0 ) + { + self takeweapon( killstreakweapon ); + self maps\mp\killstreaks\_killstreaks::removeusedkillstreak( killstreakweapon, killstreak_id ); + self maps\mp\killstreaks\_killstreaks::activatenextkillstreak(); + } + + break; + } } watchkillstreakweapondeath( hardpointtype, killstreak_id, isfrominventory ) { - self endon( "disconnect" ); - self endon( "killstreak_weapon_switch" ); - if ( killstreak_id == -1 ) - { - return; - } - oldteam = self.team; - self waittill( "death" ); - penalty = getdvarfloatdefault( "scr_HeldKillstreak_Penalty", 0,5 ); - maxammo = weaponmaxammo( hardpointtype ); - currentammo = self getammocount( hardpointtype ); - currentammoinclip = self getweaponammoclip( hardpointtype ); - if ( self.pers[ "killstreak_quantity" ].size == 0 ) - { - currentammo = 0; - currentammoinclip = 0; - } - maxclipsize = weaponclipsize( hardpointtype ); - newammo = int( currentammo - ( maxammo * penalty ) ); - killstreakid = maps/mp/killstreaks/_killstreaks::gettopkillstreakuniqueid(); - if ( self.lastnonkillstreakweapon == hardpointtype ) - { - if ( newammo < 0 ) - { - self.pers[ "held_killstreak_ammo_count" ][ hardpointtype ] = 0; - self.pers[ "held_killstreak_clip_count" ][ hardpointtype ] = 0; - } - else - { - self.pers[ "held_killstreak_ammo_count" ][ hardpointtype ] = newammo; - if ( maxclipsize <= newammo ) - { - } - else - { - } - self.pers[ "held_killstreak_clip_count" ][ hardpointtype ] = newammo; - } - } - self.usingkillstreakheldweapon = 0; - if ( newammo <= 0 || self.pers[ "killstreak_quantity" ][ hardpointtype ] > 0 && isfrominventory && isDefined( killstreakid ) && killstreakid != killstreak_id ) - { - maps/mp/killstreaks/_killstreakrules::killstreakstop( hardpointtype, oldteam, killstreak_id ); - if ( hardpointtype == "minigun_mp" || hardpointtype == "inventory_minigun_mp" ) - { - self.minigunstart = 0; - self.minigunactive = 0; - } - else - { - self.m32start = 0; - self.m32active = 0; - } - if ( isDefined( self.pers[ "killstreak_quantity" ][ hardpointtype ] ) && self.pers[ "killstreak_quantity" ][ hardpointtype ] > 0 ) - { - self.pers[ "held_killstreak_ammo_count" ][ hardpointtype ] = maxammo; - self.pers[ "held_killstreak_clip_count" ][ hardpointtype ] = maxclipsize; - self setweaponammoclip( hardpointtype, self.pers[ "held_killstreak_clip_count" ][ hardpointtype ] ); - self setweaponammostock( hardpointtype, self.pers[ "held_killstreak_ammo_count" ][ hardpointtype ] - self.pers[ "held_killstreak_clip_count" ][ hardpointtype ] ); - self.pers[ "killstreak_quantity" ][ hardpointtype ]--; + self endon( "disconnect" ); + self endon( "killstreak_weapon_switch" ); - } - } - if ( isfrominventory && newammo <= 0 ) - { - self takeweapon( hardpointtype ); - self maps/mp/killstreaks/_killstreaks::removeusedkillstreak( hardpointtype, killstreak_id ); - self maps/mp/killstreaks/_killstreaks::activatenextkillstreak(); - } - else - { - if ( isfrominventory ) - { - killstreakindex = self maps/mp/killstreaks/_killstreaks::getkillstreakindexbyid( killstreak_id ); - if ( isDefined( killstreakindex ) ) - { - self.pers[ "killstreak_ammo_count" ][ killstreakindex ] = self.pers[ "held_killstreak_ammo_count" ][ hardpointtype ]; - } - } - } - return; + if ( killstreak_id == -1 ) + return; + + oldteam = self.team; + + self waittill( "death" ); + + penalty = getdvarfloatdefault( "scr_HeldKillstreak_Penalty", 0.5 ); + maxammo = weaponmaxammo( hardpointtype ); + currentammo = self getammocount( hardpointtype ); + currentammoinclip = self getweaponammoclip( hardpointtype ); + + if ( self.pers["killstreak_quantity"].size == 0 ) + { + currentammo = 0; + currentammoinclip = 0; + } + + maxclipsize = weaponclipsize( hardpointtype ); + newammo = int( currentammo - maxammo * penalty ); + killstreakid = maps\mp\killstreaks\_killstreaks::gettopkillstreakuniqueid(); + + if ( self.lastnonkillstreakweapon == hardpointtype ) + { + if ( newammo < 0 ) + { + self.pers["held_killstreak_ammo_count"][hardpointtype] = 0; + self.pers["held_killstreak_clip_count"][hardpointtype] = 0; + } + else + { + self.pers["held_killstreak_ammo_count"][hardpointtype] = newammo; + self.pers["held_killstreak_clip_count"][hardpointtype] = maxclipsize <= newammo ? maxclipsize : newammo; + } + } + + self.usingkillstreakheldweapon = 0; + + if ( newammo <= 0 || self.pers["killstreak_quantity"][hardpointtype] > 0 || isfrominventory && isdefined( killstreakid ) && killstreakid != killstreak_id ) + { + maps\mp\killstreaks\_killstreakrules::killstreakstop( hardpointtype, oldteam, killstreak_id ); + + if ( hardpointtype == "minigun_mp" || hardpointtype == "inventory_minigun_mp" ) + { + self.minigunstart = 0; + self.minigunactive = 0; + } + else + { + self.m32start = 0; + self.m32active = 0; + } + + if ( isdefined( self.pers["killstreak_quantity"][hardpointtype] ) && self.pers["killstreak_quantity"][hardpointtype] > 0 ) + { + self.pers["held_killstreak_ammo_count"][hardpointtype] = maxammo; + self.pers["held_killstreak_clip_count"][hardpointtype] = maxclipsize; + self setweaponammoclip( hardpointtype, self.pers["held_killstreak_clip_count"][hardpointtype] ); + self setweaponammostock( hardpointtype, self.pers["held_killstreak_ammo_count"][hardpointtype] - self.pers["held_killstreak_clip_count"][hardpointtype] ); + self.pers["killstreak_quantity"][hardpointtype]--; + } + } + + if ( isfrominventory && newammo <= 0 ) + { + self takeweapon( hardpointtype ); + self maps\mp\killstreaks\_killstreaks::removeusedkillstreak( hardpointtype, killstreak_id ); + self maps\mp\killstreaks\_killstreaks::activatenextkillstreak(); + } + else if ( isfrominventory ) + { + killstreakindex = self maps\mp\killstreaks\_killstreaks::getkillstreakindexbyid( killstreak_id ); + + if ( isdefined( killstreakindex ) ) + self.pers["killstreak_ammo_count"][killstreakindex] = self.pers["held_killstreak_ammo_count"][hardpointtype]; + } } watchplayerdeath( killstreakweapon ) { - self endon( "disconnect" ); - endonweaponstring = "killstreakWeapon_" + killstreakweapon; - self endon( endonweaponstring ); - self waittill( "death" ); - currentammo = self getammocount( killstreakweapon ); - if ( weaponclipsize( killstreakweapon ) <= currentammo ) - { - } - else - { - } - self.pers[ "held_killstreak_clip_count" ][ killstreakweapon ] = currentammo; + self endon( "disconnect" ); + endonweaponstring = "killstreakWeapon_" + killstreakweapon; + self endon( endonweaponstring ); + + self waittill( "death" ); + + currentammo = self getammocount( killstreakweapon ); + self.pers["held_killstreak_clip_count"][killstreakweapon] = weaponclipsize( killstreakweapon ) <= currentammo ? weaponclipsize( killstreakweapon ) : currentammo; } watchkillstreakremoval( killstreakweapon, killstreak_id ) { - self endon( "disconnect" ); - self endon( "death" ); - self endon( "killstreak_weapon_switch" ); - self waittill( "oldest_killstreak_removed", removedkillstreakweapon, removed_id ); - if ( killstreakweapon == removedkillstreakweapon && killstreak_id == removed_id ) - { - if ( removedkillstreakweapon == "inventory_minigun_mp" ) - { - self.minigunstart = 0; - self.minigunactive = 0; - return; - } - else - { - self.m32start = 0; - self.m32active = 0; - } - } + self endon( "disconnect" ); + self endon( "death" ); + self endon( "killstreak_weapon_switch" ); + + self waittill( "oldest_killstreak_removed", removedkillstreakweapon, removed_id ); + + if ( killstreakweapon == removedkillstreakweapon && killstreak_id == removed_id ) + { + if ( removedkillstreakweapon == "inventory_minigun_mp" ) + { + self.minigunstart = 0; + self.minigunactive = 0; + } + else + { + self.m32start = 0; + self.m32active = 0; + } + } } watchkillstreakroundchange( isfrominventory, killstreak_id ) { - self endon( "disconnect" ); - self endon( "death" ); - self endon( "killstreak_weapon_switch" ); - self waittill( "round_ended" ); - currentweapon = self getcurrentweapon(); - if ( !isheldkillstreakweapon( currentweapon ) ) - { - return; - } - currentammo = self getammocount( currentweapon ); - maxclipsize = weaponclipsize( currentweapon ); - if ( isfrominventory && currentammo > 0 ) - { - killstreakindex = self maps/mp/killstreaks/_killstreaks::getkillstreakindexbyid( killstreak_id ); - if ( isDefined( killstreakindex ) ) - { - self.pers[ "killstreak_ammo_count" ][ killstreakindex ] = currentammo; - if ( maxclipsize <= currentammo ) - { - } - else - { - } - self.pers[ "held_killstreak_clip_count" ][ currentweapon ] = currentammo; - } - } - else - { - self.pers[ "held_killstreak_ammo_count" ][ currentweapon ] = currentammo; - if ( maxclipsize <= currentammo ) - { - } - else - { - } - self.pers[ "held_killstreak_clip_count" ][ currentweapon ] = currentammo; - } + self endon( "disconnect" ); + self endon( "death" ); + self endon( "killstreak_weapon_switch" ); + + self waittill( "round_ended" ); + + currentweapon = self getcurrentweapon(); + + if ( !isheldkillstreakweapon( currentweapon ) ) + return; + + currentammo = self getammocount( currentweapon ); + maxclipsize = weaponclipsize( currentweapon ); + + if ( isfrominventory && currentammo > 0 ) + { + killstreakindex = self maps\mp\killstreaks\_killstreaks::getkillstreakindexbyid( killstreak_id ); + + if ( isdefined( killstreakindex ) ) + { + self.pers["killstreak_ammo_count"][killstreakindex] = currentammo; + self.pers["held_killstreak_clip_count"][currentweapon] = maxclipsize <= currentammo ? maxclipsize : currentammo; + } + } + else + { + self.pers["held_killstreak_ammo_count"][currentweapon] = currentammo; + self.pers["held_killstreak_clip_count"][currentweapon] = maxclipsize <= currentammo ? maxclipsize : currentammo; + } } checkifswitchableweapon( currentweapon, newweapon, killstreakweapon, currentkillstreakid ) { - switchableweapon = 1; - topkillstreak = maps/mp/killstreaks/_killstreaks::gettopkillstreak(); - killstreakid = maps/mp/killstreaks/_killstreaks::gettopkillstreakuniqueid(); - if ( !isDefined( killstreakid ) ) - { - killstreakid = -1; - } - if ( self hasweapon( killstreakweapon ) && !self getammocount( killstreakweapon ) ) - { - switchableweapon = 1; - } - else - { - if ( self.firedkillstreakweapon && newweapon == killstreakweapon && isheldkillstreakweapon( currentweapon ) ) - { - switchableweapon = 1; - } - else - { - if ( isweaponequipment( newweapon ) ) - { - switchableweapon = 1; - } - else if ( isDefined( level.grenade_array[ newweapon ] ) ) - { - switchableweapon = 0; - } - else if ( isheldkillstreakweapon( newweapon ) && isheldkillstreakweapon( currentweapon ) || !isDefined( currentkillstreakid ) && currentkillstreakid != killstreakid ) - { - switchableweapon = 1; - } - else - { - if ( maps/mp/killstreaks/_killstreaks::iskillstreakweapon( newweapon ) ) - { - switchableweapon = 0; - } - else if ( isgameplayweapon( newweapon ) ) - { - switchableweapon = 0; - } - else if ( self.firedkillstreakweapon ) - { - switchableweapon = 1; - } - else if ( self.lastnonkillstreakweapon == killstreakweapon ) - { - switchableweapon = 0; - } - else - { - if ( isDefined( topkillstreak ) && topkillstreak == killstreakweapon && currentkillstreakid == killstreakid ) - { - switchableweapon = 0; - } - } - } - } - } - return switchableweapon; + switchableweapon = 1; + topkillstreak = maps\mp\killstreaks\_killstreaks::gettopkillstreak(); + killstreakid = maps\mp\killstreaks\_killstreaks::gettopkillstreakuniqueid(); + + if ( !isdefined( killstreakid ) ) + killstreakid = -1; + + if ( self hasweapon( killstreakweapon ) && !self getammocount( killstreakweapon ) ) + switchableweapon = 1; + else if ( self.firedkillstreakweapon && newweapon == killstreakweapon && isheldkillstreakweapon( currentweapon ) ) + switchableweapon = 1; + else if ( isweaponequipment( newweapon ) ) + switchableweapon = 1; + else if ( isdefined( level.grenade_array[newweapon] ) ) + switchableweapon = 0; + else if ( isheldkillstreakweapon( newweapon ) && isheldkillstreakweapon( currentweapon ) && ( !isdefined( currentkillstreakid ) || currentkillstreakid != killstreakid ) ) + switchableweapon = 1; + else if ( maps\mp\killstreaks\_killstreaks::iskillstreakweapon( newweapon ) ) + switchableweapon = 0; + else if ( isgameplayweapon( newweapon ) ) + switchableweapon = 0; + else if ( self.firedkillstreakweapon ) + switchableweapon = 1; + else if ( self.lastnonkillstreakweapon == killstreakweapon ) + switchableweapon = 0; + else if ( isdefined( topkillstreak ) && topkillstreak == killstreakweapon && currentkillstreakid == killstreakid ) + switchableweapon = 0; + + return switchableweapon; } watchkillstreakweaponusage() { - self endon( "disconnect" ); - self endon( "death" ); - while ( 1 ) - { - self waittill( "weapon_fired", killstreakweapon ); - while ( !isheldkillstreakweapon( killstreakweapon ) ) - { - wait 0,1; - } - while ( self.firedkillstreakweapon ) - { - continue; - } - maps/mp/killstreaks/_killstreaks::removeusedkillstreak( killstreakweapon ); - self.firedkillstreakweapon = 1; - self setactionslot( 4, "" ); - waittillframeend; - maps/mp/killstreaks/_killstreaks::activatenextkillstreak(); - } + self endon( "disconnect" ); + self endon( "death" ); + + while ( true ) + { + self waittill( "weapon_fired", killstreakweapon ); + + if ( !isheldkillstreakweapon( killstreakweapon ) ) + { + wait 0.1; + continue; + } + + if ( self.firedkillstreakweapon ) + continue; + + maps\mp\killstreaks\_killstreaks::removeusedkillstreak( killstreakweapon ); + self.firedkillstreakweapon = 1; + self setactionslot( 4, "" ); + waittillframeend; + maps\mp\killstreaks\_killstreaks::activatenextkillstreak(); + } } isheldkillstreakweapon( killstreaktype ) { - switch( killstreaktype ) - { - case "inventory_m32_mp": - case "inventory_minigun_mp": - case "m32_mp": - case "minigun_mp": - return 1; - } - return 0; + switch ( killstreaktype ) + { + case "minigun_mp": + case "m32_mp": + case "inventory_minigun_mp": + case "inventory_m32_mp": + return true; + } + + return false; } isheldinventorykillstreakweapon( killstreaktype ) { - switch( killstreaktype ) - { - case "inventory_m32_mp": - case "inventory_minigun_mp": - return 1; - } - return 0; + switch ( killstreaktype ) + { + case "inventory_minigun_mp": + case "inventory_m32_mp": + return true; + } + + return false; } isgameplayweapon( weapon ) { - switch( weapon ) - { - case "briefcase_bomb_defuse_mp": - case "briefcase_bomb_mp": - case "syrette_mp": - return 1; - default: - return 0; - } - return 0; + switch ( weapon ) + { + case "syrette_mp": + case "briefcase_bomb_mp": + case "briefcase_bomb_defuse_mp": + return true; + default: + return false; + } + + return false; } diff --git a/Multiplayer Core/patch_mp/maps/mp/killstreaks/_killstreakrules.gsc b/Multiplayer Core/patch_mp/maps/mp/killstreaks/_killstreakrules.gsc index 10bc8ae..efdc98a 100644 --- a/Multiplayer Core/patch_mp/maps/mp/killstreaks/_killstreakrules.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/killstreaks/_killstreakrules.gsc @@ -1,415 +1,382 @@ -#include maps/mp/killstreaks/_emp; -#include maps/mp/_popups; -#include common_scripts/utility; -#include maps/mp/gametypes/_hud_util; -#include maps/mp/_utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\_utility; +#include maps\mp\gametypes\_hud_util; +#include common_scripts\utility; +#include maps\mp\_popups; +#include maps\mp\killstreaks\_emp; init() { - level.killstreakrules = []; - level.killstreaktype = []; - level.killstreaks_triggered = []; - level.killstreak_counter = 0; - createrule( "vehicle", 7, 7 ); - createrule( "firesupport", 1, 1 ); - createrule( "airsupport", 1, 1 ); - createrule( "playercontrolledchopper", 1, 1 ); - createrule( "chopperInTheAir", 1, 1 ); - createrule( "chopper", 2, 1 ); - createrule( "qrdrone", 3, 2 ); - createrule( "dogs", 1, 1 ); - createrule( "turret", 8, 4 ); - createrule( "weapon", 12, 6 ); - createrule( "satellite", 20, 10 ); - createrule( "supplydrop", 4, 4 ); - createrule( "rcxd", 3, 2 ); - createrule( "targetableent", 32, 32 ); - createrule( "missileswarm", 1, 1 ); - createrule( "radar", 20, 10 ); - createrule( "counteruav", 20, 10 ); - createrule( "emp", 2, 1 ); - createrule( "ai_tank", 4, 2 ); - createrule( "straferun", 1, 1 ); - createrule( "planemortar", 1, 1 ); - createrule( "remotemortar", 1, 1 ); - createrule( "missiledrone", 3, 3 ); - addkillstreaktorule( "helicopter_mp", "vehicle", 1, 1 ); - addkillstreaktorule( "helicopter_mp", "chopper", 1, 1 ); - addkillstreaktorule( "helicopter_mp", "playercontrolledchopper", 0, 1 ); - addkillstreaktorule( "helicopter_mp", "chopperInTheAir", 1, 0 ); - addkillstreaktorule( "helicopter_mp", "targetableent", 1, 1 ); - addkillstreaktorule( "helicopter_x2_mp", "vehicle", 1, 1 ); - addkillstreaktorule( "helicopter_x2_mp", "chopper", 1, 1 ); - addkillstreaktorule( "helicopter_x2_mp", "playercontrolledchopper", 0, 1 ); - addkillstreaktorule( "helicopter_x2_mp", "chopperInTheAir", 1, 0 ); - addkillstreaktorule( "helicopter_x2_mp", "targetableent", 1, 1 ); - addkillstreaktorule( "helicopter_comlink_mp", "vehicle", 1, 1 ); - addkillstreaktorule( "helicopter_comlink_mp", "chopper", 1, 1 ); - addkillstreaktorule( "helicopter_comlink_mp", "playercontrolledchopper", 0, 1 ); - addkillstreaktorule( "helicopter_comlink_mp", "chopperInTheAir", 1, 0 ); - addkillstreaktorule( "helicopter_comlink_mp", "targetableent", 1, 1 ); - addkillstreaktorule( "helicopter_player_firstperson_mp", "vehicle", 1, 1 ); - addkillstreaktorule( "helicopter_player_firstperson_mp", "playercontrolledchopper", 1, 1 ); - addkillstreaktorule( "helicopter_player_firstperson_mp", "chopperInTheAir", 1, 1 ); - addkillstreaktorule( "helicopter_player_firstperson_mp", "targetableent", 1, 1 ); - addkillstreaktorule( "helicopter_guard_mp", "airsupport", 1, 1 ); - addkillstreaktorule( "helicopter_gunner_mp", "vehicle", 1, 1 ); - addkillstreaktorule( "helicopter_gunner_mp", "playercontrolledchopper", 1, 1 ); - addkillstreaktorule( "helicopter_gunner_mp", "chopperInTheAir", 1, 1 ); - addkillstreaktorule( "helicopter_gunner_mp", "targetableent", 1, 1 ); - addkillstreaktorule( "helicopter_player_gunner_mp", "vehicle", 1, 1 ); - addkillstreaktorule( "helicopter_player_gunner_mp", "playercontrolledchopper", 1, 1 ); - addkillstreaktorule( "helicopter_player_gunner_mp", "chopperInTheAir", 1, 1 ); - addkillstreaktorule( "helicopter_player_gunner_mp", "targetableent", 1, 1 ); - addkillstreaktorule( "rcbomb_mp", "rcxd", 1, 1 ); - addkillstreaktorule( "supply_drop_mp", "vehicle", 1, 1 ); - addkillstreaktorule( "supply_drop_mp", "supplydrop", 1, 1 ); - addkillstreaktorule( "supply_drop_mp", "targetableent", 1, 1 ); - addkillstreaktorule( "supply_station_mp", "vehicle", 1, 1 ); - addkillstreaktorule( "inventory_supply_drop_mp", "vehicle", 1, 1 ); - addkillstreaktorule( "inventory_supply_drop_mp", "supplydrop", 1, 1 ); - addkillstreaktorule( "inventory_supply_drop_mp", "targetableent", 1, 1 ); - addkillstreaktorule( "supply_station_mp", "supplydrop", 1, 1 ); - addkillstreaktorule( "supply_station_mp", "targetableent", 1, 1 ); - addkillstreaktorule( "tow_turret_drop_mp", "vehicle", 1, 1 ); - addkillstreaktorule( "turret_drop_mp", "vehicle", 1, 1 ); - addkillstreaktorule( "m220_tow_drop_mp", "vehicle", 1, 1 ); - addkillstreaktorule( "tow_turret_drop_mp", "supplydrop", 1, 1 ); - addkillstreaktorule( "turret_drop_mp", "supplydrop", 1, 1 ); - addkillstreaktorule( "m220_tow_drop_mp", "supplydrop", 1, 1 ); - addkillstreaktorule( "m220_tow_killstreak_mp", "weapon", 1, 1 ); - addkillstreaktorule( "autoturret_mp", "turret", 1, 1 ); - addkillstreaktorule( "auto_tow_mp", "turret", 1, 1 ); - addkillstreaktorule( "microwaveturret_mp", "turret", 1, 1 ); - addkillstreaktorule( "minigun_mp", "weapon", 1, 1 ); - addkillstreaktorule( "minigun_drop_mp", "weapon", 1, 1 ); - addkillstreaktorule( "inventory_minigun_mp", "weapon", 1, 1 ); - addkillstreaktorule( "m32_mp", "weapon", 1, 1 ); - addkillstreaktorule( "m32_drop_mp", "weapon", 1, 1 ); - addkillstreaktorule( "inventory_m32_mp", "weapon", 1, 1 ); - addkillstreaktorule( "m202_flash_mp", "weapon", 1, 1 ); - addkillstreaktorule( "m220_tow_mp", "weapon", 1, 1 ); - addkillstreaktorule( "mp40_drop_mp", "weapon", 1, 1 ); - addkillstreaktorule( "dogs_mp", "dogs", 1, 1 ); - addkillstreaktorule( "dogs_lvl2_mp", "dogs", 1, 1 ); - addkillstreaktorule( "dogs_lvl3_mp", "dogs", 1, 1 ); - addkillstreaktorule( "artillery_mp", "firesupport", 1, 1 ); - addkillstreaktorule( "mortar_mp", "firesupport", 1, 1 ); - addkillstreaktorule( "napalm_mp", "vehicle", 1, 1 ); - addkillstreaktorule( "napalm_mp", "airsupport", 1, 1 ); - addkillstreaktorule( "airstrike_mp", "vehicle", 1, 1 ); - addkillstreaktorule( "airstrike_mp", "airsupport", 1, 1 ); - addkillstreaktorule( "radardirection_mp", "satellite", 1, 1 ); - addkillstreaktorule( "radar_mp", "radar", 1, 1 ); - addkillstreaktorule( "radar_mp", "targetableent", 1, 1 ); - addkillstreaktorule( "counteruav_mp", "counteruav", 1, 1 ); - addkillstreaktorule( "counteruav_mp", "targetableent", 1, 1 ); - addkillstreaktorule( "emp_mp", "emp", 1, 1 ); - addkillstreaktorule( "remote_mortar_mp", "targetableent", 1, 1 ); - addkillstreaktorule( "remote_mortar_mp", "remotemortar", 1, 1 ); - addkillstreaktorule( "remote_missile_mp", "targetableent", 1, 1 ); - addkillstreaktorule( "qrdrone_mp", "vehicle", 1, 1 ); - addkillstreaktorule( "qrdrone_mp", "qrdrone", 1, 1 ); - addkillstreaktorule( "missile_swarm_mp", "missileswarm", 1, 1 ); - addkillstreaktorule( "missile_drone_mp", "missiledrone", 1, 1 ); - addkillstreaktorule( "inventory_missile_drone_mp", "missiledrone", 1, 1 ); - addkillstreaktorule( "straferun_mp", "straferun", 1, 1 ); - addkillstreaktorule( "ai_tank_drop_mp", "ai_tank", 1, 1 ); - addkillstreaktorule( "inventory_ai_tank_drop_mp", "ai_tank", 1, 1 ); - addkillstreaktorule( "planemortar_mp", "planemortar", 1, 1 ); + level.killstreakrules = []; + level.killstreaktype = []; + level.killstreaks_triggered = []; + level.killstreak_counter = 0; + createrule( "vehicle", 7, 7 ); + createrule( "firesupport", 1, 1 ); + createrule( "airsupport", 1, 1 ); + createrule( "playercontrolledchopper", 1, 1 ); + createrule( "chopperInTheAir", 1, 1 ); + createrule( "chopper", 2, 1 ); + createrule( "qrdrone", 3, 2 ); + createrule( "dogs", 1, 1 ); + createrule( "turret", 8, 4 ); + createrule( "weapon", 12, 6 ); + createrule( "satellite", 20, 10 ); + createrule( "supplydrop", 4, 4 ); + createrule( "rcxd", 3, 2 ); + createrule( "targetableent", 32, 32 ); + createrule( "missileswarm", 1, 1 ); + createrule( "radar", 20, 10 ); + createrule( "counteruav", 20, 10 ); + createrule( "emp", 2, 1 ); + createrule( "ai_tank", 4, 2 ); + createrule( "straferun", 1, 1 ); + createrule( "planemortar", 1, 1 ); + createrule( "remotemortar", 1, 1 ); + createrule( "missiledrone", 3, 3 ); + addkillstreaktorule( "helicopter_mp", "vehicle", 1, 1 ); + addkillstreaktorule( "helicopter_mp", "chopper", 1, 1 ); + addkillstreaktorule( "helicopter_mp", "playercontrolledchopper", 0, 1 ); + addkillstreaktorule( "helicopter_mp", "chopperInTheAir", 1, 0 ); + addkillstreaktorule( "helicopter_mp", "targetableent", 1, 1 ); + addkillstreaktorule( "helicopter_x2_mp", "vehicle", 1, 1 ); + addkillstreaktorule( "helicopter_x2_mp", "chopper", 1, 1 ); + addkillstreaktorule( "helicopter_x2_mp", "playercontrolledchopper", 0, 1 ); + addkillstreaktorule( "helicopter_x2_mp", "chopperInTheAir", 1, 0 ); + addkillstreaktorule( "helicopter_x2_mp", "targetableent", 1, 1 ); + addkillstreaktorule( "helicopter_comlink_mp", "vehicle", 1, 1 ); + addkillstreaktorule( "helicopter_comlink_mp", "chopper", 1, 1 ); + addkillstreaktorule( "helicopter_comlink_mp", "playercontrolledchopper", 0, 1 ); + addkillstreaktorule( "helicopter_comlink_mp", "chopperInTheAir", 1, 0 ); + addkillstreaktorule( "helicopter_comlink_mp", "targetableent", 1, 1 ); + addkillstreaktorule( "helicopter_player_firstperson_mp", "vehicle", 1, 1 ); + addkillstreaktorule( "helicopter_player_firstperson_mp", "playercontrolledchopper", 1, 1 ); + addkillstreaktorule( "helicopter_player_firstperson_mp", "chopperInTheAir", 1, 1 ); + addkillstreaktorule( "helicopter_player_firstperson_mp", "targetableent", 1, 1 ); + addkillstreaktorule( "helicopter_guard_mp", "airsupport", 1, 1 ); + addkillstreaktorule( "helicopter_gunner_mp", "vehicle", 1, 1 ); + addkillstreaktorule( "helicopter_gunner_mp", "playercontrolledchopper", 1, 1 ); + addkillstreaktorule( "helicopter_gunner_mp", "chopperInTheAir", 1, 1 ); + addkillstreaktorule( "helicopter_gunner_mp", "targetableent", 1, 1 ); + addkillstreaktorule( "helicopter_player_gunner_mp", "vehicle", 1, 1 ); + addkillstreaktorule( "helicopter_player_gunner_mp", "playercontrolledchopper", 1, 1 ); + addkillstreaktorule( "helicopter_player_gunner_mp", "chopperInTheAir", 1, 1 ); + addkillstreaktorule( "helicopter_player_gunner_mp", "targetableent", 1, 1 ); + addkillstreaktorule( "rcbomb_mp", "rcxd", 1, 1 ); + addkillstreaktorule( "supply_drop_mp", "vehicle", 1, 1 ); + addkillstreaktorule( "supply_drop_mp", "supplydrop", 1, 1 ); + addkillstreaktorule( "supply_drop_mp", "targetableent", 1, 1 ); + addkillstreaktorule( "supply_station_mp", "vehicle", 1, 1 ); + addkillstreaktorule( "inventory_supply_drop_mp", "vehicle", 1, 1 ); + addkillstreaktorule( "inventory_supply_drop_mp", "supplydrop", 1, 1 ); + addkillstreaktorule( "inventory_supply_drop_mp", "targetableent", 1, 1 ); + addkillstreaktorule( "supply_station_mp", "supplydrop", 1, 1 ); + addkillstreaktorule( "supply_station_mp", "targetableent", 1, 1 ); + addkillstreaktorule( "tow_turret_drop_mp", "vehicle", 1, 1 ); + addkillstreaktorule( "turret_drop_mp", "vehicle", 1, 1 ); + addkillstreaktorule( "m220_tow_drop_mp", "vehicle", 1, 1 ); + addkillstreaktorule( "tow_turret_drop_mp", "supplydrop", 1, 1 ); + addkillstreaktorule( "turret_drop_mp", "supplydrop", 1, 1 ); + addkillstreaktorule( "m220_tow_drop_mp", "supplydrop", 1, 1 ); + addkillstreaktorule( "m220_tow_killstreak_mp", "weapon", 1, 1 ); + addkillstreaktorule( "autoturret_mp", "turret", 1, 1 ); + addkillstreaktorule( "auto_tow_mp", "turret", 1, 1 ); + addkillstreaktorule( "microwaveturret_mp", "turret", 1, 1 ); + addkillstreaktorule( "minigun_mp", "weapon", 1, 1 ); + addkillstreaktorule( "minigun_drop_mp", "weapon", 1, 1 ); + addkillstreaktorule( "inventory_minigun_mp", "weapon", 1, 1 ); + addkillstreaktorule( "m32_mp", "weapon", 1, 1 ); + addkillstreaktorule( "m32_drop_mp", "weapon", 1, 1 ); + addkillstreaktorule( "inventory_m32_mp", "weapon", 1, 1 ); + addkillstreaktorule( "m202_flash_mp", "weapon", 1, 1 ); + addkillstreaktorule( "m220_tow_mp", "weapon", 1, 1 ); + addkillstreaktorule( "mp40_drop_mp", "weapon", 1, 1 ); + addkillstreaktorule( "dogs_mp", "dogs", 1, 1 ); + addkillstreaktorule( "dogs_lvl2_mp", "dogs", 1, 1 ); + addkillstreaktorule( "dogs_lvl3_mp", "dogs", 1, 1 ); + addkillstreaktorule( "artillery_mp", "firesupport", 1, 1 ); + addkillstreaktorule( "mortar_mp", "firesupport", 1, 1 ); + addkillstreaktorule( "napalm_mp", "vehicle", 1, 1 ); + addkillstreaktorule( "napalm_mp", "airsupport", 1, 1 ); + addkillstreaktorule( "airstrike_mp", "vehicle", 1, 1 ); + addkillstreaktorule( "airstrike_mp", "airsupport", 1, 1 ); + addkillstreaktorule( "radardirection_mp", "satellite", 1, 1 ); + addkillstreaktorule( "radar_mp", "radar", 1, 1 ); + addkillstreaktorule( "radar_mp", "targetableent", 1, 1 ); + addkillstreaktorule( "counteruav_mp", "counteruav", 1, 1 ); + addkillstreaktorule( "counteruav_mp", "targetableent", 1, 1 ); + addkillstreaktorule( "emp_mp", "emp", 1, 1 ); + addkillstreaktorule( "remote_mortar_mp", "targetableent", 1, 1 ); + addkillstreaktorule( "remote_mortar_mp", "remotemortar", 1, 1 ); + addkillstreaktorule( "remote_missile_mp", "targetableent", 1, 1 ); + addkillstreaktorule( "qrdrone_mp", "vehicle", 1, 1 ); + addkillstreaktorule( "qrdrone_mp", "qrdrone", 1, 1 ); + addkillstreaktorule( "missile_swarm_mp", "missileswarm", 1, 1 ); + addkillstreaktorule( "missile_drone_mp", "missiledrone", 1, 1 ); + addkillstreaktorule( "inventory_missile_drone_mp", "missiledrone", 1, 1 ); + addkillstreaktorule( "straferun_mp", "straferun", 1, 1 ); + addkillstreaktorule( "ai_tank_drop_mp", "ai_tank", 1, 1 ); + addkillstreaktorule( "inventory_ai_tank_drop_mp", "ai_tank", 1, 1 ); + addkillstreaktorule( "planemortar_mp", "planemortar", 1, 1 ); } createrule( rule, maxallowable, maxallowableperteam ) { - if ( !level.teambased ) - { - if ( maxallowable > maxallowableperteam ) - { - maxallowable = maxallowableperteam; - } - } - level.killstreakrules[ rule ] = spawnstruct(); - level.killstreakrules[ rule ].cur = 0; - level.killstreakrules[ rule ].curteam = []; - level.killstreakrules[ rule ].max = maxallowable; - level.killstreakrules[ rule ].maxperteam = maxallowableperteam; + if ( !level.teambased ) + { + if ( maxallowable > maxallowableperteam ) + maxallowable = maxallowableperteam; + } + + level.killstreakrules[rule] = spawnstruct(); + level.killstreakrules[rule].cur = 0; + level.killstreakrules[rule].curteam = []; + level.killstreakrules[rule].max = maxallowable; + level.killstreakrules[rule].maxperteam = maxallowableperteam; } addkillstreaktorule( hardpointtype, rule, counttowards, checkagainst ) { - if ( !isDefined( level.killstreaktype[ hardpointtype ] ) ) - { - level.killstreaktype[ hardpointtype ] = []; - } - keys = getarraykeys( level.killstreaktype[ hardpointtype ] ); + if ( !isdefined( level.killstreaktype[hardpointtype] ) ) + level.killstreaktype[hardpointtype] = []; + + keys = getarraykeys( level.killstreaktype[hardpointtype] ); /# - assert( isDefined( level.killstreakrules[ rule ] ) ); + assert( isdefined( level.killstreakrules[rule] ) ); #/ - if ( !isDefined( level.killstreaktype[ hardpointtype ][ rule ] ) ) - { - level.killstreaktype[ hardpointtype ][ rule ] = spawnstruct(); - } - level.killstreaktype[ hardpointtype ][ rule ].counts = counttowards; - level.killstreaktype[ hardpointtype ][ rule ].checks = checkagainst; + if ( !isdefined( level.killstreaktype[hardpointtype][rule] ) ) + level.killstreaktype[hardpointtype][rule] = spawnstruct(); + + level.killstreaktype[hardpointtype][rule].counts = counttowards; + level.killstreaktype[hardpointtype][rule].checks = checkagainst; } killstreakstart( hardpointtype, team, hacked, displayteammessage ) { /# - assert( isDefined( team ), "team needs to be defined" ); + assert( isdefined( team ), "team needs to be defined" ); #/ - if ( self iskillstreakallowed( hardpointtype, team ) == 0 ) - { - return -1; - } + if ( self iskillstreakallowed( hardpointtype, team ) == 0 ) + return -1; /# - assert( isDefined( hardpointtype ) ); + assert( isdefined( hardpointtype ) ); #/ - if ( !isDefined( hacked ) ) - { - hacked = 0; - } - if ( !isDefined( displayteammessage ) ) - { - displayteammessage = 1; - } - if ( displayteammessage == 1 ) - { - if ( isDefined( level.killstreaks[ hardpointtype ] ) && isDefined( level.killstreaks[ hardpointtype ].inboundtext ) && !hacked ) - { - level thread maps/mp/_popups::displaykillstreakteammessagetoall( hardpointtype, self ); - } - } - keys = getarraykeys( level.killstreaktype[ hardpointtype ] ); - _a187 = keys; - _k187 = getFirstArrayKey( _a187 ); - while ( isDefined( _k187 ) ) - { - key = _a187[ _k187 ]; - if ( !level.killstreaktype[ hardpointtype ][ key ].counts ) - { - } - else - { + if ( !isdefined( hacked ) ) + hacked = 0; + + if ( !isdefined( displayteammessage ) ) + displayteammessage = 1; + + if ( displayteammessage == 1 ) + { + if ( isdefined( level.killstreaks[hardpointtype] ) && isdefined( level.killstreaks[hardpointtype].inboundtext ) && !hacked ) + level thread maps\mp\_popups::displaykillstreakteammessagetoall( hardpointtype, self ); + } + + keys = getarraykeys( level.killstreaktype[hardpointtype] ); + + foreach ( key in keys ) + { + if ( !level.killstreaktype[hardpointtype][key].counts ) + continue; /# - assert( isDefined( level.killstreakrules[ key ] ) ); + assert( isdefined( level.killstreakrules[key] ) ); #/ - level.killstreakrules[ key ].cur++; - if ( level.teambased ) - { - if ( !isDefined( level.killstreakrules[ key ].curteam[ team ] ) ) - { - level.killstreakrules[ key ].curteam[ team ] = 0; - } - level.killstreakrules[ key ].curteam[ team ]++; - } - } - _k187 = getNextArrayKey( _a187, _k187 ); - } - level notify( "killstreak_started" ); - killstreak_id = level.killstreak_counter; - level.killstreak_counter++; - killstreak_data = []; - killstreak_data[ "caller" ] = self getxuid(); - killstreak_data[ "spawnid" ] = getplayerspawnid( self ); - killstreak_data[ "starttime" ] = getTime(); - killstreak_data[ "type" ] = hardpointtype; - killstreak_data[ "endtime" ] = 0; - level.killstreaks_triggered[ killstreak_id ] = killstreak_data; + level.killstreakrules[key].cur++; + + if ( level.teambased ) + { + if ( !isdefined( level.killstreakrules[key].curteam[team] ) ) + level.killstreakrules[key].curteam[team] = 0; + + level.killstreakrules[key].curteam[team]++; + } + } + + level notify( "killstreak_started", hardpointtype, team, self ); + killstreak_id = level.killstreak_counter; + level.killstreak_counter++; + killstreak_data = []; + killstreak_data["caller"] = self getxuid(); + killstreak_data["spawnid"] = getplayerspawnid( self ); + killstreak_data["starttime"] = gettime(); + killstreak_data["type"] = hardpointtype; + killstreak_data["endtime"] = 0; + level.killstreaks_triggered[killstreak_id] = killstreak_data; /# - killstreak_debug_text( "Started killstreak: " + hardpointtype + " for team: " + team + " id: " + killstreak_id ); + killstreak_debug_text( "Started killstreak: " + hardpointtype + " for team: " + team + " id: " + killstreak_id ); #/ - return killstreak_id; + return killstreak_id; } killstreakstop( hardpointtype, team, id ) { /# - assert( isDefined( team ), "team needs to be defined" ); + assert( isdefined( team ), "team needs to be defined" ); #/ /# - assert( isDefined( hardpointtype ) ); + assert( isdefined( hardpointtype ) ); #/ /# - killstreak_debug_text( "Stopped killstreak: " + hardpointtype + " for team: " + team + " id: " + id ); + killstreak_debug_text( "Stopped killstreak: " + hardpointtype + " for team: " + team + " id: " + id ); #/ - keys = getarraykeys( level.killstreaktype[ hardpointtype ] ); - _a238 = keys; - _k238 = getFirstArrayKey( _a238 ); - while ( isDefined( _k238 ) ) - { - key = _a238[ _k238 ]; - if ( !level.killstreaktype[ hardpointtype ][ key ].counts ) - { - } - else - { -/# - assert( isDefined( level.killstreakrules[ key ] ) ); -#/ - level.killstreakrules[ key ].cur--; + keys = getarraykeys( level.killstreaktype[hardpointtype] ); + foreach ( key in keys ) + { + if ( !level.killstreaktype[hardpointtype][key].counts ) + continue; /# - assert( level.killstreakrules[ key ].cur >= 0 ); + assert( isdefined( level.killstreakrules[key] ) ); #/ - if ( level.teambased ) - { + level.killstreakrules[key].cur--; /# - assert( isDefined( team ) ); + assert( level.killstreakrules[key].cur >= 0 ); +#/ + if ( level.teambased ) + { +/# + assert( isdefined( team ) ); #/ /# - assert( isDefined( level.killstreakrules[ key ].curteam[ team ] ) ); + assert( isdefined( level.killstreakrules[key].curteam[team] ) ); #/ - level.killstreakrules[ key ].curteam[ team ]--; + level.killstreakrules[key].curteam[team]--; +/# + assert( level.killstreakrules[key].curteam[team] >= 0 ); +#/ + } + } -/# - assert( level.killstreakrules[ key ].curteam[ team ] >= 0 ); -#/ - } - } - _k238 = getNextArrayKey( _a238, _k238 ); - } - if ( !isDefined( id ) || id == -1 ) - { - killstreak_debug_text( "WARNING! Invalid killstreak id detected for " + hardpointtype ); - bbprint( "mpkillstreakuses", "starttime %d endtime %d name %s team %s", 0, getTime(), hardpointtype, team ); - return; - } - level.killstreaks_triggered[ id ][ "endtime" ] = getTime(); - bbprint( "mpkillstreakuses", "starttime %d endtime %d spawnid %d name %s team %s", level.killstreaks_triggered[ id ][ "starttime" ], level.killstreaks_triggered[ id ][ "endtime" ], level.killstreaks_triggered[ id ][ "spawnid" ], hardpointtype, team ); - if ( isDefined( level.killstreaks[ hardpointtype ].menuname ) ) - { - recordstreakindex = level.killstreakindices[ level.killstreaks[ hardpointtype ].menuname ]; - if ( isDefined( recordstreakindex ) ) - { - if ( isDefined( self.owner ) ) - { - self.owner recordkillstreakendevent( recordstreakindex ); - return; - } - else - { - if ( isplayer( self ) ) - { - self recordkillstreakendevent( recordstreakindex ); - } - } - } - } + if ( !isdefined( id ) || id == -1 ) + { + killstreak_debug_text( "WARNING! Invalid killstreak id detected for " + hardpointtype ); + bbprint( "mpkillstreakuses", "starttime %d endtime %d name %s team %s", 0, gettime(), hardpointtype, team ); + return; + } + + level.killstreaks_triggered[id]["endtime"] = gettime(); + bbprint( "mpkillstreakuses", "starttime %d endtime %d spawnid %d name %s team %s", level.killstreaks_triggered[id]["starttime"], level.killstreaks_triggered[id]["endtime"], level.killstreaks_triggered[id]["spawnid"], hardpointtype, team ); + level.killstreaks_triggered[id] = undefined; + + if ( isdefined( level.killstreaks[hardpointtype].menuname ) ) + { + recordstreakindex = level.killstreakindices[level.killstreaks[hardpointtype].menuname]; + + if ( isdefined( recordstreakindex ) ) + { + if ( isdefined( self.owner ) ) + self.owner recordkillstreakendevent( recordstreakindex ); + else if ( isplayer( self ) ) + self recordkillstreakendevent( recordstreakindex ); + } + } } iskillstreakallowed( hardpointtype, team ) { /# - assert( isDefined( team ), "team needs to be defined" ); + assert( isdefined( team ), "team needs to be defined" ); #/ /# - assert( isDefined( hardpointtype ) ); + assert( isdefined( hardpointtype ) ); #/ - isallowed = 1; - keys = getarraykeys( level.killstreaktype[ hardpointtype ] ); - _a308 = keys; - _k308 = getFirstArrayKey( _a308 ); - while ( isDefined( _k308 ) ) - { - key = _a308[ _k308 ]; - if ( !level.killstreaktype[ hardpointtype ][ key ].checks ) - { - } - else - { - if ( level.killstreakrules[ key ].max != 0 ) - { - if ( level.killstreakrules[ key ].cur >= level.killstreakrules[ key ].max ) - { + isallowed = 1; + keys = getarraykeys( level.killstreaktype[hardpointtype] ); + + foreach ( key in keys ) + { + if ( !level.killstreaktype[hardpointtype][key].checks ) + continue; + + if ( level.killstreakrules[key].max != 0 ) + { + if ( level.killstreakrules[key].cur >= level.killstreakrules[key].max ) + { /# - killstreak_debug_text( "Exceeded " + key + " overall" ); + killstreak_debug_text( "Exceeded " + key + " overall" ); #/ - isallowed = 0; - break; - } - } - else if ( level.teambased && level.killstreakrules[ key ].maxperteam != 0 ) - { - if ( !isDefined( level.killstreakrules[ key ].curteam[ team ] ) ) - { - level.killstreakrules[ key ].curteam[ team ] = 0; - } - if ( level.killstreakrules[ key ].curteam[ team ] >= level.killstreakrules[ key ].maxperteam ) - { - isallowed = 0; + isallowed = 0; + break; + } + } + + if ( level.teambased && level.killstreakrules[key].maxperteam != 0 ) + { + if ( !isdefined( level.killstreakrules[key].curteam[team] ) ) + level.killstreakrules[key].curteam[team] = 0; + + if ( level.killstreakrules[key].curteam[team] >= level.killstreakrules[key].maxperteam ) + { + isallowed = 0; /# - killstreak_debug_text( "Exceeded " + key + " team" ); + killstreak_debug_text( "Exceeded " + key + " team" ); #/ - break; - } - } - } - else - { - _k308 = getNextArrayKey( _a308, _k308 ); - } - } - if ( isDefined( self.laststand ) && self.laststand ) - { + break; + } + } + } + + if ( isdefined( self.laststand ) && self.laststand ) + { /# - killstreak_debug_text( "In LastStand" ); + killstreak_debug_text( "In LastStand" ); #/ - isallowed = 0; - } - if ( self isempjammed() ) - { + isallowed = 0; + } + + if ( self isempjammed() ) + { /# - killstreak_debug_text( "EMP active" ); + killstreak_debug_text( "EMP active" ); #/ - isallowed = 0; - if ( self maps/mp/killstreaks/_emp::isenemyempkillstreakactive() ) - { - if ( isDefined( level.empendtime ) ) - { - secondsleft = int( ( level.empendtime - getTime() ) / 1000 ); - if ( secondsleft > 0 ) - { - self iprintlnbold( &"KILLSTREAK_NOT_AVAILABLE_EMP_ACTIVE", secondsleft ); - return 0; - } - } - } - } - if ( isallowed == 0 ) - { - if ( isDefined( level.killstreaks[ hardpointtype ] ) && isDefined( level.killstreaks[ hardpointtype ].notavailabletext ) ) - { - self iprintlnbold( level.killstreaks[ hardpointtype ].notavailabletext ); - if ( hardpointtype != "helicopter_comlink_mp" && hardpointtype != "helicopter_guard_mp" && hardpointtype != "helicopter_player_gunner_mp" && hardpointtype != "remote_mortar_mp" && hardpointtype != "inventory_supply_drop_mp" || hardpointtype == "supply_drop_mp" && hardpointtype == "straferun_mp" ) - { - pilotvoicenumber = randomintrange( 0, 3 ); - soundalias = level.teamprefix[ self.team ] + pilotvoicenumber + "_" + "kls_full"; - self playlocalsound( soundalias ); - } - } - } - return isallowed; + isallowed = 0; + + if ( self maps\mp\killstreaks\_emp::isenemyempkillstreakactive() ) + { + if ( isdefined( level.empendtime ) ) + { + secondsleft = int( ( level.empendtime - gettime() ) / 1000 ); + + if ( secondsleft > 0 ) + { + self iprintlnbold( &"KILLSTREAK_NOT_AVAILABLE_EMP_ACTIVE", secondsleft ); + return 0; + } + } + } + } + + if ( isallowed == 0 ) + { + if ( isdefined( level.killstreaks[hardpointtype] ) && isdefined( level.killstreaks[hardpointtype].notavailabletext ) ) + { + self iprintlnbold( level.killstreaks[hardpointtype].notavailabletext ); + + if ( hardpointtype == "helicopter_comlink_mp" || hardpointtype == "helicopter_guard_mp" || hardpointtype == "helicopter_player_gunner_mp" || hardpointtype == "remote_mortar_mp" || hardpointtype == "inventory_supply_drop_mp" || hardpointtype == "supply_drop_mp" || hardpointtype == "straferun_mp" ) + { + pilotvoicenumber = randomintrange( 0, 3 ); + soundalias = level.teamprefix[self.team] + pilotvoicenumber + "_" + "kls_full"; + self playlocalsound( soundalias ); + } + } + } + + return isallowed; } killstreak_debug_text( text ) { /# - level.killstreak_rule_debug = getdvarintdefault( "scr_killstreak_rule_debug", 0 ); - if ( isDefined( level.killstreak_rule_debug ) ) - { - if ( level.killstreak_rule_debug == 1 ) - { - iprintln( "KSR: " + text + "\n" ); - return; - } - else - { - if ( level.killstreak_rule_debug == 2 ) - { - iprintlnbold( "KSR: " + text ); + level.killstreak_rule_debug = getdvarintdefault( "scr_killstreak_rule_debug", 0 ); + + if ( isdefined( level.killstreak_rule_debug ) ) + { + if ( level.killstreak_rule_debug == 1.0 ) + iprintln( "KSR: " + text + "\n" ); + else if ( level.killstreak_rule_debug == 2.0 ) + iprintlnbold( "KSR: " + text ); + } #/ - } - } - } } diff --git a/Multiplayer Core/patch_mp/maps/mp/killstreaks/_killstreaks.gsc b/Multiplayer Core/patch_mp/maps/mp/killstreaks/_killstreaks.gsc index f607877..8a38440 100644 --- a/Multiplayer Core/patch_mp/maps/mp/killstreaks/_killstreaks.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/killstreaks/_killstreaks.gsc @@ -1,2049 +1,1881 @@ -#include maps/mp/gametypes/_hud; -#include maps/mp/gametypes/_hostmigration; -#include maps/mp/gametypes/_globallogic_audio; -#include maps/mp/gametypes/_globallogic_utils; -#include maps/mp/gametypes/_weapons; -#include maps/mp/gametypes/_globallogic_score; -#include maps/mp/gametypes/_class; -#include maps/mp/killstreaks/_killstreaks; -#include maps/mp/gametypes/_hud_message; -#include maps/mp/killstreaks/_dogs; -#include maps/mp/killstreaks/_airsupport; -#include common_scripts/utility; -#include maps/mp/gametypes/_hud_util; -#include maps/mp/_utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\_utility; +#include maps\mp\gametypes\_hud_util; +#include common_scripts\utility; +#include maps\mp\killstreaks\_supplydrop; +#include maps\mp\killstreaks\_ai_tank; +#include maps\mp\killstreaks\_airsupport; +#include maps\mp\killstreaks\_dogs; +#include maps\mp\killstreaks\_radar; +#include maps\mp\killstreaks\_emp; +#include maps\mp\killstreaks\_helicopter; +#include maps\mp\killstreaks\_helicopter_guard; +#include maps\mp\killstreaks\_helicopter_gunner; +#include maps\mp\killstreaks\_killstreakrules; +#include maps\mp\killstreaks\_killstreak_weapons; +#include maps\mp\killstreaks\_missile_drone; +#include maps\mp\killstreaks\_missile_swarm; +#include maps\mp\killstreaks\_planemortar; +#include maps\mp\killstreaks\_rcbomb; +#include maps\mp\killstreaks\_remote_weapons; +#include maps\mp\killstreaks\_remotemissile; +#include maps\mp\killstreaks\_remotemortar; +#include maps\mp\killstreaks\_qrdrone; +#include maps\mp\killstreaks\_spyplane; +#include maps\mp\killstreaks\_straferun; +#include maps\mp\killstreaks\_turret_killstreak; +#include maps\mp\gametypes\_hud_message; +#include maps\mp\killstreaks\_killstreaks; +#include maps\mp\gametypes\_class; +#include maps\mp\gametypes\_globallogic_score; +#include maps\mp\gametypes\_weapons; +#include maps\mp\gametypes\_globallogic_utils; +#include maps\mp\gametypes\_globallogic_audio; +#include maps\mp\gametypes\_hostmigration; +#include maps\mp\gametypes\_hud; init() { - precachestring( &"MP_KILLSTREAK_N" ); - if ( getDvar( "scr_allow_killstreak_building" ) == "" ) - { - setdvar( "scr_allow_killstreak_building", "0" ); - } - level.killstreaks = []; - level.killstreakweapons = []; - level.menureferenceforkillstreak = []; - level.numkillstreakreservedobjectives = 0; - level.killstreakcounter = 0; - if ( !isDefined( level.roundstartkillstreakdelay ) ) - { - level.roundstartkillstreakdelay = 0; - } - level.killstreak_timers = []; - _a31 = level.teams; - _k31 = getFirstArrayKey( _a31 ); - while ( isDefined( _k31 ) ) - { - team = _a31[ _k31 ]; - level.killstreak_timers[ team ] = []; - _k31 = getNextArrayKey( _a31, _k31 ); - } - level.iskillstreakweapon = ::iskillstreakweapon; - maps/mp/killstreaks/_supplydrop::init(); - maps/mp/killstreaks/_ai_tank::init(); - maps/mp/killstreaks/_airsupport::initairsupport(); - maps/mp/killstreaks/_dogs::initkillstreak(); - maps/mp/killstreaks/_radar::init(); - maps/mp/killstreaks/_emp::init(); - maps/mp/killstreaks/_helicopter::init(); - maps/mp/killstreaks/_helicopter_guard::init(); - maps/mp/killstreaks/_helicopter_gunner::init(); - maps/mp/killstreaks/_killstreakrules::init(); - maps/mp/killstreaks/_killstreak_weapons::init(); - maps/mp/killstreaks/_missile_drone::init(); - maps/mp/killstreaks/_missile_swarm::init(); - maps/mp/killstreaks/_planemortar::init(); - maps/mp/killstreaks/_rcbomb::init(); - maps/mp/killstreaks/_remote_weapons::init(); - maps/mp/killstreaks/_remotemissile::init(); - maps/mp/killstreaks/_remotemortar::init(); - maps/mp/killstreaks/_qrdrone::init(); - maps/mp/killstreaks/_spyplane::init(); - maps/mp/killstreaks/_straferun::init(); - maps/mp/killstreaks/_turret_killstreak::init(); - level thread onplayerconnect(); + precachestring( &"MP_KILLSTREAK_N" ); + + if ( getdvar( "scr_allow_killstreak_building" ) == "" ) + setdvar( "scr_allow_killstreak_building", "0" ); + + level.killstreaks = []; + level.killstreakweapons = []; + level.menureferenceforkillstreak = []; + level.numkillstreakreservedobjectives = 0; + level.killstreakcounter = 0; + + if ( !isdefined( level.roundstartkillstreakdelay ) ) + level.roundstartkillstreakdelay = 0; + + level.killstreak_timers = []; + + foreach ( team in level.teams ) + level.killstreak_timers[team] = []; + + level.iskillstreakweapon = ::iskillstreakweapon; + maps\mp\killstreaks\_supplydrop::init(); + maps\mp\killstreaks\_ai_tank::init(); + maps\mp\killstreaks\_airsupport::initairsupport(); + maps\mp\killstreaks\_dogs::initkillstreak(); + maps\mp\killstreaks\_radar::init(); + maps\mp\killstreaks\_emp::init(); + maps\mp\killstreaks\_helicopter::init(); + maps\mp\killstreaks\_helicopter_guard::init(); + maps\mp\killstreaks\_helicopter_gunner::init(); + maps\mp\killstreaks\_killstreakrules::init(); + maps\mp\killstreaks\_killstreak_weapons::init(); + maps\mp\killstreaks\_missile_drone::init(); + maps\mp\killstreaks\_missile_swarm::init(); + maps\mp\killstreaks\_planemortar::init(); + maps\mp\killstreaks\_rcbomb::init(); + maps\mp\killstreaks\_remote_weapons::init(); + maps\mp\killstreaks\_remotemissile::init(); + maps\mp\killstreaks\_remotemortar::init(); + maps\mp\killstreaks\_qrdrone::init(); + maps\mp\killstreaks\_spyplane::init(); + maps\mp\killstreaks\_straferun::init(); + maps\mp\killstreaks\_turret_killstreak::init(); + level thread onplayerconnect(); /# - level thread killstreak_debug_think(); + level thread killstreak_debug_think(); #/ } registerkillstreak( killstreaktype, killstreakweapon, killstreakmenuname, killstreakusagekey, killstreakusefunction, killstreakdelaystreak, weaponholdallowed, killstreakstatsname ) { /# - assert( isDefined( killstreaktype ), "Can not register a killstreak without a valid type name." ); + assert( isdefined( killstreaktype ), "Can not register a killstreak without a valid type name." ); #/ /# - assert( !isDefined( level.killstreaks[ killstreaktype ] ), "Killstreak " + killstreaktype + " already registered" ); + assert( !isdefined( level.killstreaks[killstreaktype] ), "Killstreak " + killstreaktype + " already registered" ); #/ /# - assert( isDefined( killstreakusefunction ), "No use function defined for killstreak " + killstreaktype ); + assert( isdefined( killstreakusefunction ), "No use function defined for killstreak " + killstreaktype ); #/ - level.killstreaks[ killstreaktype ] = spawnstruct(); - level.killstreaks[ killstreaktype ].killstreaklevel = int( tablelookup( "mp/statstable.csv", 4, killstreakmenuname, 5 ) ); - level.killstreaks[ killstreaktype ].momentumcost = int( tablelookup( "mp/statstable.csv", 4, killstreakmenuname, 16 ) ); - level.killstreaks[ killstreaktype ].iconmaterial = tablelookup( "mp/statstable.csv", 4, killstreakmenuname, 6 ); - level.killstreaks[ killstreaktype ].quantity = int( tablelookup( "mp/statstable.csv", 4, killstreakmenuname, 5 ) ); - level.killstreaks[ killstreaktype ].usagekey = killstreakusagekey; - level.killstreaks[ killstreaktype ].usefunction = killstreakusefunction; - level.killstreaks[ killstreaktype ].menuname = killstreakmenuname; - level.killstreaks[ killstreaktype ].delaystreak = killstreakdelaystreak; - level.killstreaks[ killstreaktype ].allowassists = 0; - level.killstreaks[ killstreaktype ].overrideentitycameraindemo = 0; - level.killstreaks[ killstreaktype ].teamkillpenaltyscale = 1; - if ( isDefined( killstreakweapon ) ) - { + level.killstreaks[killstreaktype] = spawnstruct(); + level.killstreaks[killstreaktype].killstreaklevel = int( tablelookup( "mp/statstable.csv", 4, killstreakmenuname, 5 ) ); + level.killstreaks[killstreaktype].momentumcost = int( tablelookup( "mp/statstable.csv", 4, killstreakmenuname, 16 ) ); + level.killstreaks[killstreaktype].iconmaterial = tablelookup( "mp/statstable.csv", 4, killstreakmenuname, 6 ); + level.killstreaks[killstreaktype].quantity = int( tablelookup( "mp/statstable.csv", 4, killstreakmenuname, 5 ) ); + level.killstreaks[killstreaktype].usagekey = killstreakusagekey; + level.killstreaks[killstreaktype].usefunction = killstreakusefunction; + level.killstreaks[killstreaktype].menuname = killstreakmenuname; + level.killstreaks[killstreaktype].delaystreak = killstreakdelaystreak; + level.killstreaks[killstreaktype].allowassists = 0; + level.killstreaks[killstreaktype].overrideentitycameraindemo = 0; + level.killstreaks[killstreaktype].teamkillpenaltyscale = 1.0; + + if ( isdefined( killstreakweapon ) ) + { /# - assert( !isDefined( level.killstreakweapons[ killstreakweapon ] ), "Can not have a weapon associated with multiple killstreaks." ); + assert( !isdefined( level.killstreakweapons[killstreakweapon] ), "Can not have a weapon associated with multiple killstreaks." ); #/ - precacheitem( killstreakweapon ); - level.killstreaks[ killstreaktype ].weapon = killstreakweapon; - level.killstreakweapons[ killstreakweapon ] = killstreaktype; - } - if ( !isDefined( weaponholdallowed ) ) - { - weaponholdallowed = 0; - } - if ( isDefined( killstreakstatsname ) ) - { - level.killstreaks[ killstreaktype ].killstreakstatsname = killstreakstatsname; - } - level.killstreaks[ killstreaktype ].weaponholdallowed = weaponholdallowed; - level.menureferenceforkillstreak[ killstreakmenuname ] = killstreaktype; + precacheitem( killstreakweapon ); + level.killstreaks[killstreaktype].weapon = killstreakweapon; + level.killstreakweapons[killstreakweapon] = killstreaktype; + } + + if ( !isdefined( weaponholdallowed ) ) + weaponholdallowed = 0; + + if ( isdefined( killstreakstatsname ) ) + level.killstreaks[killstreaktype].killstreakstatsname = killstreakstatsname; + + level.killstreaks[killstreaktype].weaponholdallowed = weaponholdallowed; + level.menureferenceforkillstreak[killstreakmenuname] = killstreaktype; } registerkillstreakstrings( killstreaktype, receivedtext, notusabletext, inboundtext, inboundnearplayertext ) { /# - assert( isDefined( killstreaktype ), "Can not register a killstreak without a valid type name." ); + assert( isdefined( killstreaktype ), "Can not register a killstreak without a valid type name." ); #/ /# - assert( isDefined( level.killstreaks[ killstreaktype ] ), "Killstreak needs to be registered before calling registerKillstreakStrings." ); + assert( isdefined( level.killstreaks[killstreaktype] ), "Killstreak needs to be registered before calling registerKillstreakStrings." ); #/ - level.killstreaks[ killstreaktype ].receivedtext = receivedtext; - level.killstreaks[ killstreaktype ].notavailabletext = notusabletext; - level.killstreaks[ killstreaktype ].inboundtext = inboundtext; - level.killstreaks[ killstreaktype ].inboundnearplayertext = inboundnearplayertext; - if ( isDefined( level.killstreaks[ killstreaktype ].receivedtext ) ) - { - precachestring( level.killstreaks[ killstreaktype ].receivedtext ); - } - if ( isDefined( level.killstreaks[ killstreaktype ].notavailabletext ) ) - { - precachestring( level.killstreaks[ killstreaktype ].notavailabletext ); - } - if ( isDefined( level.killstreaks[ killstreaktype ].inboundtext ) ) - { - precachestring( level.killstreaks[ killstreaktype ].inboundtext ); - } - if ( isDefined( level.killstreaks[ killstreaktype ].inboundnearplayertext ) ) - { - precachestring( level.killstreaks[ killstreaktype ].inboundnearplayertext ); - } + level.killstreaks[killstreaktype].receivedtext = receivedtext; + level.killstreaks[killstreaktype].notavailabletext = notusabletext; + level.killstreaks[killstreaktype].inboundtext = inboundtext; + level.killstreaks[killstreaktype].inboundnearplayertext = inboundnearplayertext; + + if ( isdefined( level.killstreaks[killstreaktype].receivedtext ) ) + precachestring( level.killstreaks[killstreaktype].receivedtext ); + + if ( isdefined( level.killstreaks[killstreaktype].notavailabletext ) ) + precachestring( level.killstreaks[killstreaktype].notavailabletext ); + + if ( isdefined( level.killstreaks[killstreaktype].inboundtext ) ) + precachestring( level.killstreaks[killstreaktype].inboundtext ); + + if ( isdefined( level.killstreaks[killstreaktype].inboundnearplayertext ) ) + precachestring( level.killstreaks[killstreaktype].inboundnearplayertext ); } registerkillstreakdialog( killstreaktype, receiveddialog, friendlystartdialog, friendlyenddialog, enemystartdialog, enemyenddialog, dialog ) { /# - assert( isDefined( killstreaktype ), "Can not register a killstreak without a valid type name." ); + assert( isdefined( killstreaktype ), "Can not register a killstreak without a valid type name." ); #/ /# - assert( isDefined( level.killstreaks[ killstreaktype ] ), "Killstreak needs to be registered before calling registerKillstreakDialog." ); + assert( isdefined( level.killstreaks[killstreaktype] ), "Killstreak needs to be registered before calling registerKillstreakDialog." ); #/ - precachestring( istring( receiveddialog ) ); - level.killstreaks[ killstreaktype ].informdialog = receiveddialog; - game[ "dialog" ][ killstreaktype + "_start" ] = friendlystartdialog; - game[ "dialog" ][ killstreaktype + "_end" ] = friendlyenddialog; - game[ "dialog" ][ killstreaktype + "_enemy_start" ] = enemystartdialog; - game[ "dialog" ][ killstreaktype + "_enemy_end" ] = enemyenddialog; - game[ "dialog" ][ killstreaktype ] = dialog; + precachestring( istring( receiveddialog ) ); + level.killstreaks[killstreaktype].informdialog = receiveddialog; + game["dialog"][killstreaktype + "_start"] = friendlystartdialog; + game["dialog"][killstreaktype + "_end"] = friendlyenddialog; + game["dialog"][killstreaktype + "_enemy_start"] = enemystartdialog; + game["dialog"][killstreaktype + "_enemy_end"] = enemyenddialog; + game["dialog"][killstreaktype] = dialog; } registerkillstreakaltweapon( killstreaktype, weapon ) { /# - assert( isDefined( killstreaktype ), "Can not register a killstreak without a valid type name." ); + assert( isdefined( killstreaktype ), "Can not register a killstreak without a valid type name." ); #/ /# - assert( isDefined( level.killstreaks[ killstreaktype ] ), "Killstreak needs to be registered before calling registerKillstreakAltWeapon." ); + assert( isdefined( level.killstreaks[killstreaktype] ), "Killstreak needs to be registered before calling registerKillstreakAltWeapon." ); #/ - if ( level.killstreaks[ killstreaktype ].weapon == weapon ) - { - return; - } - if ( !isDefined( level.killstreaks[ killstreaktype ].altweapons ) ) - { - level.killstreaks[ killstreaktype ].altweapons = []; - } - if ( !isDefined( level.killstreakweapons[ weapon ] ) ) - { - level.killstreakweapons[ weapon ] = killstreaktype; - } - level.killstreaks[ killstreaktype ].altweapons[ level.killstreaks[ killstreaktype ].altweapons.size ] = weapon; + if ( level.killstreaks[killstreaktype].weapon == weapon ) + return; + + if ( !isdefined( level.killstreaks[killstreaktype].altweapons ) ) + level.killstreaks[killstreaktype].altweapons = []; + + if ( !isdefined( level.killstreakweapons[weapon] ) ) + level.killstreakweapons[weapon] = killstreaktype; + + level.killstreaks[killstreaktype].altweapons[level.killstreaks[killstreaktype].altweapons.size] = weapon; } registerkillstreakremoteoverrideweapon( killstreaktype, weapon ) { /# - assert( isDefined( killstreaktype ), "Can not register a killstreak without a valid type name." ); + assert( isdefined( killstreaktype ), "Can not register a killstreak without a valid type name." ); #/ /# - assert( isDefined( level.killstreaks[ killstreaktype ] ), "Killstreak needs to be registered before calling registerKillstreakAltWeapon." ); + assert( isdefined( level.killstreaks[killstreaktype] ), "Killstreak needs to be registered before calling registerKillstreakAltWeapon." ); #/ - if ( level.killstreaks[ killstreaktype ].weapon == weapon ) - { - return; - } - if ( !isDefined( level.killstreaks[ killstreaktype ].remoteoverrideweapons ) ) - { - level.killstreaks[ killstreaktype ].remoteoverrideweapons = []; - } - if ( !isDefined( level.killstreakweapons[ weapon ] ) ) - { - level.killstreakweapons[ weapon ] = killstreaktype; - } - level.killstreaks[ killstreaktype ].remoteoverrideweapons[ level.killstreaks[ killstreaktype ].remoteoverrideweapons.size ] = weapon; + if ( level.killstreaks[killstreaktype].weapon == weapon ) + return; + + if ( !isdefined( level.killstreaks[killstreaktype].remoteoverrideweapons ) ) + level.killstreaks[killstreaktype].remoteoverrideweapons = []; + + if ( !isdefined( level.killstreakweapons[weapon] ) ) + level.killstreakweapons[weapon] = killstreaktype; + + level.killstreaks[killstreaktype].remoteoverrideweapons[level.killstreaks[killstreaktype].remoteoverrideweapons.size] = weapon; } iskillstreakremoteoverrideweapon( killstreaktype, weapon ) { - while ( isDefined( level.killstreaks[ killstreaktype ].remoteoverrideweapons ) ) - { - i = 0; - while ( i < level.killstreaks[ killstreaktype ].remoteoverrideweapons.size ) - { - if ( level.killstreaks[ killstreaktype ].remoteoverrideweapons[ i ] == weapon ) - { - return 1; - } - i++; - } - } - return 0; + if ( isdefined( level.killstreaks[killstreaktype].remoteoverrideweapons ) ) + { + for ( i = 0; i < level.killstreaks[killstreaktype].remoteoverrideweapons.size; i++ ) + { + if ( level.killstreaks[killstreaktype].remoteoverrideweapons[i] == weapon ) + return true; + } + } + + return false; } registerkillstreakdevdvar( killstreaktype, dvar ) { /# - assert( isDefined( killstreaktype ), "Can not register a killstreak without a valid type name." ); + assert( isdefined( killstreaktype ), "Can not register a killstreak without a valid type name." ); #/ /# - assert( isDefined( level.killstreaks[ killstreaktype ] ), "Killstreak needs to be registered before calling registerKillstreakDevDvar." ); + assert( isdefined( level.killstreaks[killstreaktype] ), "Killstreak needs to be registered before calling registerKillstreakDevDvar." ); #/ - level.killstreaks[ killstreaktype ].devdvar = dvar; + level.killstreaks[killstreaktype].devdvar = dvar; } allowkillstreakassists( killstreaktype, allow ) { - level.killstreaks[ killstreaktype ].allowassists = allow; + level.killstreaks[killstreaktype].allowassists = allow; } setkillstreakteamkillpenaltyscale( killstreaktype, scale ) { - level.killstreaks[ killstreaktype ].teamkillpenaltyscale = scale; + level.killstreaks[killstreaktype].teamkillpenaltyscale = scale; } overrideentitycameraindemo( killstreaktype, value ) { - level.killstreaks[ killstreaktype ].overrideentitycameraindemo = value; + level.killstreaks[killstreaktype].overrideentitycameraindemo = value; } iskillstreakavailable( killstreak ) { - if ( isDefined( level.menureferenceforkillstreak[ killstreak ] ) ) - { - return 1; - } - else - { - return 0; - } + if ( isdefined( level.menureferenceforkillstreak[killstreak] ) ) + return true; + else + return false; } getkillstreakbymenuname( killstreak ) { - return level.menureferenceforkillstreak[ killstreak ]; + return level.menureferenceforkillstreak[killstreak]; } getkillstreakmenuname( killstreaktype ) { /# - assert( isDefined( level.killstreaks[ killstreaktype ] ) ); + assert( isdefined( level.killstreaks[killstreaktype] ) ); #/ - return level.killstreaks[ killstreaktype ].menuname; + return level.killstreaks[killstreaktype].menuname; } drawline( start, end, timeslice, color ) { /# - drawtime = int( timeslice * 20 ); - time = 0; - while ( time < drawtime ) - { - line( start, end, ( 1, 0, 0 ), 0, 1 ); - wait 0,05; - time++; + drawtime = int( timeslice * 20 ); + + for ( time = 0; time < drawtime; time++ ) + { + line( start, end, ( 1, 0, 0 ), 0, 1 ); + wait 0.05; + } #/ - } } getkillstreaklevel( index, killstreak ) { - killstreaklevel = level.killstreaks[ getkillstreakbymenuname( killstreak ) ].killstreaklevel; - if ( getDvarInt( #"826EB3B9" ) == 2 ) - { - if ( isDefined( self.killstreak[ index ] ) && killstreak == self.killstreak[ index ] ) - { - killsrequired = getDvarInt( 2404036340 + index + 1 + "_kills" ); - if ( killsrequired ) - { - killstreaklevel = getDvarInt( 2404036340 + index + 1 + "_kills" ); - } - } - } - return killstreaklevel; + killstreaklevel = level.killstreaks[getkillstreakbymenuname( killstreak )].killstreaklevel; + + if ( getdvarint( _hash_826EB3B9 ) == 2 ) + { + if ( isdefined( self.killstreak[index] ) && killstreak == self.killstreak[index] ) + { + killsrequired = getdvarint( _hash_8F4AAEF4 + index + 1 + "_kills" ); + + if ( killsrequired ) + killstreaklevel = getdvarint( _hash_8F4AAEF4 + index + 1 + "_kills" ); + } + } + + return killstreaklevel; } givekillstreakifstreakcountmatches( index, killstreak, streakcount ) { - pixbeginevent( "giveKillstreakIfStreakCountMatches" ); + pixbeginevent( "giveKillstreakIfStreakCountMatches" ); /# - if ( !isDefined( killstreak ) ) - { - println( "Killstreak Undefined.\n" ); - } - if ( isDefined( killstreak ) ) - { - println( "Killstreak listed as." + killstreak + "\n" ); - } - if ( !iskillstreakavailable( killstreak ) ) - { - println( "Killstreak Not Available.\n" ); + if ( !isdefined( killstreak ) ) + println( "Killstreak Undefined.\n" ); + + if ( isdefined( killstreak ) ) + println( "Killstreak listed as." + killstreak + "\n" ); + + if ( !iskillstreakavailable( killstreak ) ) + println( "Killstreak Not Available.\n" ); #/ - } - if ( self.pers[ "killstreaksEarnedThisKillstreak" ] > index && isroundbased() ) - { - hasalreadyearnedkillstreak = 1; - } - else - { - hasalreadyearnedkillstreak = 0; - } - if ( isDefined( killstreak ) && iskillstreakavailable( killstreak ) && !hasalreadyearnedkillstreak ) - { - killstreaklevel = getkillstreaklevel( index, killstreak ); - if ( self hasperk( "specialty_killstreak" ) ) - { - reduction = getDvarInt( "perk_killstreakReduction" ); - killstreaklevel -= reduction; - if ( killstreaklevel <= 0 ) - { - killstreaklevel = 1; - } - } - if ( killstreaklevel == streakcount ) - { - self givekillstreak( getkillstreakbymenuname( killstreak ), streakcount ); - self.pers[ "killstreaksEarnedThisKillstreak" ] = index + 1; - pixendevent(); - return 1; - } - } - pixendevent(); - return 0; + if ( self.pers["killstreaksEarnedThisKillstreak"] > index && isroundbased() ) + hasalreadyearnedkillstreak = 1; + else + hasalreadyearnedkillstreak = 0; + + if ( isdefined( killstreak ) && iskillstreakavailable( killstreak ) && !hasalreadyearnedkillstreak ) + { + killstreaklevel = getkillstreaklevel( index, killstreak ); + + if ( self hasperk( "specialty_killstreak" ) ) + { + reduction = getdvarint( "perk_killstreakReduction" ); + killstreaklevel -= reduction; + + if ( killstreaklevel <= 0 ) + killstreaklevel = 1; + } + + if ( killstreaklevel == streakcount ) + { + self givekillstreak( getkillstreakbymenuname( killstreak ), streakcount ); + self.pers["killstreaksEarnedThisKillstreak"] = index + 1; + pixendevent(); + return true; + } + } + + pixendevent(); + return false; } givekillstreakforstreak() { - if ( !iskillstreaksenabled() ) - { - return; - } - if ( !isDefined( self.pers[ "totalKillstreakCount" ] ) ) - { - self.pers[ "totalKillstreakCount" ] = 0; - } - given = 0; - i = 0; - while ( i < self.killstreak.size ) - { - given |= givekillstreakifstreakcountmatches( i, self.killstreak[ i ], self.pers[ "cur_kill_streak" ] ); - i++; - } + if ( !iskillstreaksenabled() ) + return; + + if ( !isdefined( self.pers["totalKillstreakCount"] ) ) + self.pers["totalKillstreakCount"] = 0; + + given = 0; + + for ( i = 0; i < self.killstreak.size; i++ ) + given |= givekillstreakifstreakcountmatches( i, self.killstreak[i], self.pers["cur_kill_streak"] ); } isonakillstreak() { - onkillstreak = 0; - if ( !isDefined( self.pers[ "kill_streak_before_death" ] ) ) - { - self.pers[ "kill_streak_before_death" ] = 0; - } - streakplusone = self.pers[ "kill_streak_before_death" ] + 1; - if ( self.pers[ "kill_streak_before_death" ] >= 5 ) - { - onkillstreak = 1; - } - return onkillstreak; + onkillstreak = 0; + + if ( !isdefined( self.pers["kill_streak_before_death"] ) ) + self.pers["kill_streak_before_death"] = 0; + + streakplusone = self.pers["kill_streak_before_death"] + 1; + + if ( self.pers["kill_streak_before_death"] >= 5 ) + onkillstreak = 1; + + return onkillstreak; } doesstreakcountmatch( killstreak, streakcount ) { - if ( isDefined( killstreak ) && iskillstreakavailable( killstreak ) ) - { - killstreaklevel = level.killstreaks[ getkillstreakbymenuname( killstreak ) ].killstreaklevel; - if ( killstreaklevel == streakcount ) - { - return 1; - } - } - return 0; + if ( isdefined( killstreak ) && iskillstreakavailable( killstreak ) ) + { + killstreaklevel = level.killstreaks[getkillstreakbymenuname( killstreak )].killstreaklevel; + + if ( killstreaklevel == streakcount ) + return true; + } + + return false; } streaknotify( streakval ) { - self endon( "disconnect" ); - self waittill( "playerKilledChallengesProcessed" ); - wait 0,05; - notifydata = spawnstruct(); - notifydata.titlelabel = &"MP_KILLSTREAK_N"; - notifydata.titletext = streakval; - notifydata.iconheight = 32; - self maps/mp/gametypes/_hud_message::notifymessage( notifydata ); + self endon( "disconnect" ); + + self waittill( "playerKilledChallengesProcessed" ); + + wait 0.05; + notifydata = spawnstruct(); + notifydata.titlelabel = &"MP_KILLSTREAK_N"; + notifydata.titletext = streakval; + notifydata.iconheight = 32; + self maps\mp\gametypes\_hud_message::notifymessage( notifydata ); } givekillstreak( killstreaktype, streak, suppressnotification, noxp ) { - pixbeginevent( "giveKillstreak" ); - self endon( "disconnect" ); - level endon( "game_ended" ); - had_to_delay = 0; - killstreakgiven = 0; - if ( isDefined( noxp ) ) - { - if ( self givekillstreakinternal( killstreaktype, undefined, noxp ) ) - { - killstreakgiven = 1; - self addkillstreaktoqueue( level.killstreaks[ killstreaktype ].menuname, streak, killstreaktype, noxp ); - } - } - else - { - if ( self givekillstreakinternal( killstreaktype, noxp ) ) - { - killstreakgiven = 1; - self addkillstreaktoqueue( level.killstreaks[ killstreaktype ].menuname, streak, killstreaktype, noxp ); - } - } - pixendevent(); + pixbeginevent( "giveKillstreak" ); + self endon( "disconnect" ); + level endon( "game_ended" ); + had_to_delay = 0; + killstreakgiven = 0; + + if ( isdefined( noxp ) ) + { + if ( self givekillstreakinternal( killstreaktype, undefined, noxp ) ) + { + killstreakgiven = 1; + self addkillstreaktoqueue( level.killstreaks[killstreaktype].menuname, streak, killstreaktype, noxp ); + } + } + else if ( self givekillstreakinternal( killstreaktype, noxp ) ) + { + killstreakgiven = 1; + self addkillstreaktoqueue( level.killstreaks[killstreaktype].menuname, streak, killstreaktype, noxp ); + } + + pixendevent(); } removeoldestkillstreak() { - if ( isDefined( self.pers[ "killstreaks" ][ 0 ] ) ) - { - currentweapon = self getcurrentweapon(); - if ( currentweapon == self.pers[ "killstreaks" ][ 0 ] ) - { - primaries = self getweaponslistprimaries(); - if ( primaries.size > 0 ) - { - self switchtoweapon( primaries[ 0 ] ); - } - } - self notify( "oldest_killstreak_removed" ); - self maps/mp/killstreaks/_killstreaks::removeusedkillstreak( self.pers[ "killstreaks" ][ 0 ], self.pers[ "killstreak_unique_id" ][ 0 ] ); - } + if ( isdefined( self.pers["killstreaks"][0] ) ) + { + currentweapon = self getcurrentweapon(); + + if ( currentweapon == self.pers["killstreaks"][0] ) + { + primaries = self getweaponslistprimaries(); + + if ( primaries.size > 0 ) + self switchtoweapon( primaries[0] ); + } + + self notify( "oldest_killstreak_removed", self.pers["killstreaks"][0], self.pers["killstreak_unique_id"][0] ); + self maps\mp\killstreaks\_killstreaks::removeusedkillstreak( self.pers["killstreaks"][0], self.pers["killstreak_unique_id"][0] ); + } } givekillstreakinternal( killstreaktype, do_not_update_death_count, noxp ) { - if ( level.gameended ) - { - return 0; - } - if ( !iskillstreaksenabled() ) - { - return 0; - } - if ( !isDefined( level.killstreaks[ killstreaktype ] ) ) - { - return 0; - } - if ( !isDefined( self.pers[ "killstreaks" ] ) ) - { - self.pers[ "killstreaks" ] = []; - } - if ( !isDefined( self.pers[ "killstreak_has_been_used" ] ) ) - { - self.pers[ "killstreak_has_been_used" ] = []; - } - if ( !isDefined( self.pers[ "killstreak_unique_id" ] ) ) - { - self.pers[ "killstreak_unique_id" ] = []; - } - self.pers[ "killstreaks" ][ self.pers[ "killstreaks" ].size ] = killstreaktype; - self.pers[ "killstreak_unique_id" ][ self.pers[ "killstreak_unique_id" ].size ] = level.killstreakcounter; - level.killstreakcounter++; - if ( self.pers[ "killstreaks" ].size > level.maxinventoryscorestreaks ) - { - self removeoldestkillstreak(); - } - if ( isDefined( noxp ) ) - { - self.pers[ "killstreak_has_been_used" ][ self.pers[ "killstreak_has_been_used" ].size ] = noxp; - } - else - { - self.pers[ "killstreak_has_been_used" ][ self.pers[ "killstreak_has_been_used" ].size ] = 0; - } - weapon = getkillstreakweapon( killstreaktype ); - ammocount = givekillstreakweapon( weapon, 1 ); - self.pers[ "killstreak_ammo_count" ][ self.pers[ "killstreak_ammo_count" ].size ] = ammocount; - return 1; + if ( level.gameended ) + return false; + + if ( !iskillstreaksenabled() ) + return false; + + if ( !isdefined( level.killstreaks[killstreaktype] ) ) + return false; + + if ( !isdefined( self.pers["killstreaks"] ) ) + self.pers["killstreaks"] = []; + + if ( !isdefined( self.pers["killstreak_has_been_used"] ) ) + self.pers["killstreak_has_been_used"] = []; + + if ( !isdefined( self.pers["killstreak_unique_id"] ) ) + self.pers["killstreak_unique_id"] = []; + + self.pers["killstreaks"][self.pers["killstreaks"].size] = killstreaktype; + self.pers["killstreak_unique_id"][self.pers["killstreak_unique_id"].size] = level.killstreakcounter; + level.killstreakcounter++; + + if ( self.pers["killstreaks"].size > level.maxinventoryscorestreaks ) + self removeoldestkillstreak(); + + if ( isdefined( noxp ) ) + self.pers["killstreak_has_been_used"][self.pers["killstreak_has_been_used"].size] = noxp; + else + self.pers["killstreak_has_been_used"][self.pers["killstreak_has_been_used"].size] = 0; + + weapon = getkillstreakweapon( killstreaktype ); + ammocount = givekillstreakweapon( weapon, 1 ); + self.pers["killstreak_ammo_count"][self.pers["killstreak_ammo_count"].size] = ammocount; + return true; } addkillstreaktoqueue( menuname, streakcount, hardpointtype, nonotify ) { - killstreaktablenumber = level.killstreakindices[ menuname ]; - if ( !isDefined( killstreaktablenumber ) ) - { - return; - } - if ( isDefined( nonotify ) && nonotify ) - { - return; - } - informdialog = getkillstreakinformdialog( hardpointtype ); - self playkillstreakreadydialog( hardpointtype ); - self luinotifyevent( &"killstreak_received", 2, killstreaktablenumber, istring( informdialog ) ); - self luinotifyeventtospectators( &"killstreak_received", 2, killstreaktablenumber, istring( informdialog ) ); + killstreaktablenumber = level.killstreakindices[menuname]; + + if ( !isdefined( killstreaktablenumber ) ) + return; + + if ( isdefined( nonotify ) && nonotify ) + return; + + informdialog = getkillstreakinformdialog( hardpointtype ); + self playkillstreakreadydialog( hardpointtype ); + self luinotifyevent( &"killstreak_received", 2, killstreaktablenumber, istring( informdialog ) ); + self luinotifyeventtospectators( &"killstreak_received", 2, killstreaktablenumber, istring( informdialog ) ); } haskillstreakequipped() { - currentweapon = self getcurrentweapon(); - keys = getarraykeys( level.killstreaks ); - i = 0; - while ( i < keys.size ) - { - if ( level.killstreaks[ keys[ i ] ].weapon == currentweapon ) - { - return 1; - } - i++; - } - return 0; + currentweapon = self getcurrentweapon(); + keys = getarraykeys( level.killstreaks ); + + for ( i = 0; i < keys.size; i++ ) + { + if ( level.killstreaks[keys[i]].weapon == currentweapon ) + return true; + } + + return false; } getkillstreakfromweapon( weapon ) { - keys = getarraykeys( level.killstreaks ); - i = 0; - while ( i < keys.size ) - { - if ( level.killstreaks[ keys[ i ] ].weapon == weapon ) - { - return keys[ i ]; - } - while ( isDefined( level.killstreaks[ keys[ i ] ].altweapons ) ) - { - _a558 = level.killstreaks[ keys[ i ] ].altweapons; - _k558 = getFirstArrayKey( _a558 ); - while ( isDefined( _k558 ) ) - { - altweapon = _a558[ _k558 ]; - if ( altweapon == weapon ) - { - return keys[ i ]; - } - _k558 = getNextArrayKey( _a558, _k558 ); - } - } - i++; - } - return undefined; + keys = getarraykeys( level.killstreaks ); + + for ( i = 0; i < keys.size; i++ ) + { + if ( level.killstreaks[keys[i]].weapon == weapon ) + return keys[i]; + + if ( isdefined( level.killstreaks[keys[i]].altweapons ) ) + { + foreach ( altweapon in level.killstreaks[keys[i]].altweapons ) + { + if ( altweapon == weapon ) + return keys[i]; + } + } + } + + return undefined; } givekillstreakweapon( weapon, isinventory, usestoredammo ) { - currentweapon = self getcurrentweapon(); - while ( !isDefined( level.usingmomentum ) || !level.usingmomentum ) - { - weaponslist = self getweaponslist(); - idx = 0; - while ( idx < weaponslist.size ) - { - carriedweapon = weaponslist[ idx ]; - if ( currentweapon == carriedweapon ) - { - idx++; - continue; - } - else if ( currentweapon == "none" ) - { - idx++; - continue; - } - else switch( carriedweapon ) - { - case "m32_mp": - case "minigun_mp": - idx++; - continue; - } - if ( iskillstreakweapon( carriedweapon ) ) - { - self takeweapon( carriedweapon ); - } - idx++; - } - } - if ( currentweapon != weapon && self hasweapon( weapon ) == 0 ) - { - self takeweapon( weapon ); - self giveweapon( weapon ); - } - if ( isDefined( level.usingmomentum ) && level.usingmomentum ) - { - self setinventoryweapon( weapon ); - if ( maps/mp/killstreaks/_killstreak_weapons::isheldkillstreakweapon( weapon ) ) - { - if ( !isDefined( self.pers[ "held_killstreak_ammo_count" ][ weapon ] ) ) - { - self.pers[ "held_killstreak_ammo_count" ][ weapon ] = 0; - } - if ( !isDefined( self.pers[ "held_killstreak_clip_count" ][ weapon ] ) ) - { - self.pers[ "held_killstreak_clip_count" ][ weapon ] = weaponclipsize( weapon ); - } - if ( !isDefined( self.pers[ "killstreak_quantity" ][ weapon ] ) ) - { - self.pers[ "killstreak_quantity" ][ weapon ] = 0; - } - if ( currentweapon == weapon && !maps/mp/killstreaks/_killstreak_weapons::isheldinventorykillstreakweapon( weapon ) ) - { - return weaponmaxammo( weapon ); - } - else - { - if ( isDefined( usestoredammo ) && usestoredammo && self.pers[ "killstreak_ammo_count" ][ self.pers[ "killstreak_ammo_count" ].size - 1 ] > 0 ) - { - switch( weapon ) - { - case "inventory_minigun_mp": - if ( isDefined( self.minigunactive ) && self.minigunactive ) - { - return self.pers[ "held_killstreak_ammo_count" ][ weapon ]; - } - case "inventory_m32_mp": - if ( isDefined( self.m32active ) && self.m32active ) - { - return self.pers[ "held_killstreak_ammo_count" ][ weapon ]; - } - default: - } - self.pers[ "held_killstreak_ammo_count" ][ weapon ] = self.pers[ "killstreak_ammo_count" ][ self.pers[ "killstreak_ammo_count" ].size - 1 ]; - self maps/mp/gametypes/_class::setweaponammooverall( weapon, self.pers[ "killstreak_ammo_count" ][ self.pers[ "killstreak_ammo_count" ].size - 1 ] ); - } - else self.pers[ "held_killstreak_ammo_count" ][ weapon ] = weaponmaxammo( weapon ); - self.pers[ "held_killstreak_clip_count" ][ weapon ] = weaponclipsize( weapon ); - self maps/mp/gametypes/_class::setweaponammooverall( weapon, self.pers[ "held_killstreak_ammo_count" ][ weapon ] ); - } - return self.pers[ "held_killstreak_ammo_count" ][ weapon ]; - } - else - { - if ( weapon != "inventory_ai_tank_drop_mp" && weapon != "inventory_supplydrop_mp" && weapon != "inventory_minigun_drop_mp" || weapon == "inventory_m32_drop_mp" && weapon == "inventory_missile_drone_mp" ) - { - delta = 1; - } - else - { - delta = 0; - } - return changekillstreakquantity( weapon, delta ); - } - } - else - { - self setactionslot( 4, "weapon", weapon ); - return 1; - } - } - } - } - } + currentweapon = self getcurrentweapon(); + + if ( !isdefined( level.usingmomentum ) || !level.usingmomentum ) + { + weaponslist = self getweaponslist(); + + for ( idx = 0; idx < weaponslist.size; idx++ ) + { + carriedweapon = weaponslist[idx]; + + if ( currentweapon == carriedweapon ) + continue; + + if ( currentweapon == "none" ) + continue; + + switch ( carriedweapon ) + { + case "minigun_mp": + case "m32_mp": + continue; + } + + if ( iskillstreakweapon( carriedweapon ) ) + self takeweapon( carriedweapon ); + } + } + + if ( currentweapon != weapon && self hasweapon( weapon ) == 0 ) + { + self takeweapon( weapon ); + self giveweapon( weapon ); + } + + if ( isdefined( level.usingmomentum ) && level.usingmomentum ) + { + self setinventoryweapon( weapon ); + + if ( maps\mp\killstreaks\_killstreak_weapons::isheldkillstreakweapon( weapon ) ) + { + if ( !isdefined( self.pers["held_killstreak_ammo_count"][weapon] ) ) + self.pers["held_killstreak_ammo_count"][weapon] = 0; + + if ( !isdefined( self.pers["held_killstreak_clip_count"][weapon] ) ) + self.pers["held_killstreak_clip_count"][weapon] = weaponclipsize( weapon ); + + if ( !isdefined( self.pers["killstreak_quantity"][weapon] ) ) + self.pers["killstreak_quantity"][weapon] = 0; + + if ( currentweapon == weapon && !maps\mp\killstreaks\_killstreak_weapons::isheldinventorykillstreakweapon( weapon ) ) + return weaponmaxammo( weapon ); + else if ( isdefined( usestoredammo ) && usestoredammo && self.pers["killstreak_ammo_count"][self.pers["killstreak_ammo_count"].size - 1] > 0 ) + { + switch ( weapon ) + { + case "inventory_minigun_mp": + if ( isdefined( self.minigunactive ) && self.minigunactive ) + return self.pers["held_killstreak_ammo_count"][weapon]; + + break; + case "inventory_m32_mp": + if ( isdefined( self.m32active ) && self.m32active ) + return self.pers["held_killstreak_ammo_count"][weapon]; + + break; + default: + break; + } + + self.pers["held_killstreak_ammo_count"][weapon] = self.pers["killstreak_ammo_count"][self.pers["killstreak_ammo_count"].size - 1]; + self maps\mp\gametypes\_class::setweaponammooverall( weapon, self.pers["killstreak_ammo_count"][self.pers["killstreak_ammo_count"].size - 1] ); + } + else + { + self.pers["held_killstreak_ammo_count"][weapon] = weaponmaxammo( weapon ); + self.pers["held_killstreak_clip_count"][weapon] = weaponclipsize( weapon ); + self maps\mp\gametypes\_class::setweaponammooverall( weapon, self.pers["held_killstreak_ammo_count"][weapon] ); + } + + return self.pers["held_killstreak_ammo_count"][weapon]; + } + else + { + if ( weapon == "inventory_ai_tank_drop_mp" || weapon == "inventory_supplydrop_mp" || weapon == "inventory_minigun_drop_mp" || weapon == "inventory_m32_drop_mp" || weapon == "inventory_missile_drone_mp" ) + delta = 1; + else + delta = 0; + + return changekillstreakquantity( weapon, delta ); + } + } + else + { + self setactionslot( 4, "weapon", weapon ); + return 1; + } } activatenextkillstreak( do_not_update_death_count ) { - if ( level.gameended ) - { - return 0; - } - if ( isDefined( level.usingmomentum ) && level.usingmomentum ) - { - self setinventoryweapon( "" ); - } - else - { - self setactionslot( 4, "" ); - } - if ( !isDefined( self.pers[ "killstreaks" ] ) || self.pers[ "killstreaks" ].size == 0 ) - { - return 0; - } - killstreaktype = self.pers[ "killstreaks" ][ self.pers[ "killstreaks" ].size - 1 ]; - if ( !isDefined( level.killstreaks[ killstreaktype ] ) ) - { - return 0; - } - weapon = level.killstreaks[ killstreaktype ].weapon; - wait 0,05; - ammocount = givekillstreakweapon( weapon, 0, 1 ); - if ( maps/mp/killstreaks/_killstreak_weapons::isheldkillstreakweapon( weapon ) ) - { - self setweaponammoclip( weapon, self.pers[ "held_killstreak_clip_count" ][ weapon ] ); - self setweaponammostock( weapon, ammocount - self.pers[ "held_killstreak_clip_count" ][ weapon ] ); - } - if ( !isDefined( do_not_update_death_count ) || do_not_update_death_count != 0 ) - { - self.pers[ "killstreakItemDeathCount" + killstreaktype ] = self.deathcount; - } - return 1; + if ( level.gameended ) + return false; + + if ( isdefined( level.usingmomentum ) && level.usingmomentum ) + self setinventoryweapon( "" ); + else + self setactionslot( 4, "" ); + + if ( !isdefined( self.pers["killstreaks"] ) || self.pers["killstreaks"].size == 0 ) + return false; + + killstreaktype = self.pers["killstreaks"][self.pers["killstreaks"].size - 1]; + + if ( !isdefined( level.killstreaks[killstreaktype] ) ) + return false; + + weapon = level.killstreaks[killstreaktype].weapon; + wait 0.05; + ammocount = givekillstreakweapon( weapon, 0, 1 ); + + if ( maps\mp\killstreaks\_killstreak_weapons::isheldkillstreakweapon( weapon ) ) + { + self setweaponammoclip( weapon, self.pers["held_killstreak_clip_count"][weapon] ); + self setweaponammostock( weapon, ammocount - self.pers["held_killstreak_clip_count"][weapon] ); + } + + if ( !isdefined( do_not_update_death_count ) || do_not_update_death_count != 0 ) + self.pers["killstreakItemDeathCount" + killstreaktype] = self.deathcount; + + return true; } takekillstreak( killstreaktype ) { - if ( level.gameended ) - { - return; - } - if ( !iskillstreaksenabled() ) - { - return 0; - } - if ( isDefined( self.selectinglocation ) ) - { - return 0; - } - if ( !isDefined( level.killstreaks[ killstreaktype ] ) ) - { - return 0; - } - self takeweapon( killstreaktype ); - self setactionslot( 4, "" ); - self.pers[ "killstreakItemDeathCount" + killstreaktype ] = 0; - return 1; + if ( level.gameended ) + return; + + if ( !iskillstreaksenabled() ) + return 0; + + if ( isdefined( self.selectinglocation ) ) + return 0; + + if ( !isdefined( level.killstreaks[killstreaktype] ) ) + return 0; + + self takeweapon( killstreaktype ); + self setactionslot( 4, "" ); + self.pers["killstreakItemDeathCount" + killstreaktype] = 0; + return 1; } giveownedkillstreak() { - if ( isDefined( self.pers[ "killstreaks" ] ) && self.pers[ "killstreaks" ].size > 0 ) - { - self activatenextkillstreak( 0 ); - } + if ( isdefined( self.pers["killstreaks"] ) && self.pers["killstreaks"].size > 0 ) + self activatenextkillstreak( 0 ); } switchtolastnonkillstreakweapon() { - if ( isDefined( self.laststand ) && self.laststand && isDefined( self.laststandpistol ) && self hasweapon( self.laststandpistol ) ) - { - self switchtoweapon( self.laststandpistol ); - } - else - { - if ( self hasweapon( self.lastnonkillstreakweapon ) ) - { - self switchtoweapon( self.lastnonkillstreakweapon ); - } - else if ( self hasweapon( self.lastdroppableweapon ) ) - { - self switchtoweapon( self.lastdroppableweapon ); - } - else - { - return 0; - } - } - return 1; + if ( isdefined( self.laststand ) && self.laststand && isdefined( self.laststandpistol ) && self hasweapon( self.laststandpistol ) ) + self switchtoweapon( self.laststandpistol ); + else if ( self hasweapon( self.lastnonkillstreakweapon ) ) + self switchtoweapon( self.lastnonkillstreakweapon ); + else if ( self hasweapon( self.lastdroppableweapon ) ) + self switchtoweapon( self.lastdroppableweapon ); + else + return false; + + return true; } changeweaponafterkillstreak( killstreak, takeweapon ) { - self endon( "disconnect" ); - self endon( "death" ); - killstreak_weapon = getkillstreakweapon( killstreak ); - currentweapon = self getcurrentweapon(); - result = self switchtolastnonkillstreakweapon(); + self endon( "disconnect" ); + self endon( "death" ); + killstreak_weapon = getkillstreakweapon( killstreak ); + currentweapon = self getcurrentweapon(); + result = self switchtolastnonkillstreakweapon(); } changekillstreakquantity( killstreakweapon, delta ) { - quantity = self.pers[ "killstreak_quantity" ][ killstreakweapon ]; - if ( !isDefined( quantity ) ) - { - quantity = 0; - } - previousquantity = quantity; - if ( delta < 0 ) - { + quantity = self.pers["killstreak_quantity"][killstreakweapon]; + + if ( !isdefined( quantity ) ) + quantity = 0; + + previousquantity = quantity; + + if ( delta < 0 ) + { /# - assert( quantity > 0 ); + assert( quantity > 0 ); #/ - } - quantity += delta; - if ( quantity > level.scorestreaksmaxstacking ) - { - quantity = level.scorestreaksmaxstacking; - } - if ( self hasweapon( killstreakweapon ) == 0 ) - { - self takeweapon( killstreakweapon ); - self giveweapon( killstreakweapon ); - self seteverhadweaponall( 1 ); - } - self.pers[ "killstreak_quantity" ][ killstreakweapon ] = quantity; - self setweaponammoclip( killstreakweapon, quantity ); - return quantity; + } + + quantity += delta; + + if ( quantity > level.scorestreaksmaxstacking ) + quantity = level.scorestreaksmaxstacking; + + if ( self hasweapon( killstreakweapon ) == 0 ) + { + self takeweapon( killstreakweapon ); + self giveweapon( killstreakweapon ); + self seteverhadweaponall( 1 ); + } + + self.pers["killstreak_quantity"][killstreakweapon] = quantity; + self setweaponammoclip( killstreakweapon, quantity ); + return quantity; } haskillstreakinclass( killstreakmenuname ) { - _a819 = self.killstreak; - _k819 = getFirstArrayKey( _a819 ); - while ( isDefined( _k819 ) ) - { - equippedkillstreak = _a819[ _k819 ]; - if ( equippedkillstreak == killstreakmenuname ) - { - return 1; - } - _k819 = getNextArrayKey( _a819, _k819 ); - } - return 0; + foreach ( equippedkillstreak in self.killstreak ) + { + if ( equippedkillstreak == killstreakmenuname ) + return true; + } + + return false; } removekillstreakwhendone( killstreak, haskillstreakbeenused, isfrominventory ) { - self endon( "disconnect" ); - self waittill( "killstreak_done", successful, killstreaktype ); - if ( successful ) - { - logstring( "killstreak: " + getkillstreakmenuname( killstreak ) ); - killstreak_weapon = getkillstreakweapon( killstreak ); - recordstreakindex = undefined; - if ( isDefined( level.killstreaks[ killstreak ].menuname ) ) - { - recordstreakindex = level.killstreakindices[ level.killstreaks[ killstreak ].menuname ]; - if ( isDefined( recordstreakindex ) ) - { - self recordkillstreakevent( recordstreakindex ); - } - } - if ( isDefined( level.usingscorestreaks ) && level.usingscorestreaks ) - { - if ( isDefined( isfrominventory ) && isfrominventory ) - { - removeusedkillstreak( killstreak ); - if ( self getinventoryweapon() == killstreak_weapon ) - { - self setinventoryweapon( "" ); - } - } - else - { - self changekillstreakquantity( killstreak_weapon, -1 ); - } - } - else - { - if ( isDefined( level.usingmomentum ) && level.usingmomentum ) - { - if ( isDefined( isfrominventory ) && isfrominventory && self getinventoryweapon() == killstreak_weapon ) - { - removeusedkillstreak( killstreak ); - self setinventoryweapon( "" ); - } - else - { - maps/mp/gametypes/_globallogic_score::_setplayermomentum( self, self.momentum - level.killstreaks[ killstreaktype ].momentumcost ); - } - } - else - { - removeusedkillstreak( killstreak ); - } - } - if ( !isDefined( level.usingmomentum ) || !level.usingmomentum ) - { - self setactionslot( 4, "" ); - } - success = 1; - } - waittillframeend; - currentweapon = self getcurrentweapon(); - if ( maps/mp/killstreaks/_killstreak_weapons::isheldkillstreakweapon( killstreaktype ) && currentweapon == killstreaktype ) - { - return; - } - if ( successful || !self haskillstreakinclass( getkillstreakmenuname( killstreak ) ) && isDefined( isfrominventory ) && isfrominventory ) - { - changeweaponafterkillstreak( killstreak, 1 ); - } - else - { - killstreakforcurrentweapon = getkillstreakfromweapon( currentweapon ); - if ( maps/mp/killstreaks/_killstreak_weapons::isgameplayweapon( currentweapon ) ) - { - if ( is_true( self.isplanting ) || is_true( self.isdefusing ) ) - { - return; - } - } - if ( !successful || !isDefined( killstreakforcurrentweapon ) && killstreakforcurrentweapon == killstreak ) - { - changeweaponafterkillstreak( killstreak, 0 ); - } - } - if ( isDefined( level.usingmomentum ) || !level.usingmomentum && isDefined( isfrominventory ) && isfrominventory ) - { - if ( successful ) - { - activatenextkillstreak(); - } - } + self endon( "disconnect" ); + + self waittill( "killstreak_done", successful, killstreaktype ); + + if ( successful ) + { + logstring( "killstreak: " + getkillstreakmenuname( killstreak ) ); + killstreak_weapon = getkillstreakweapon( killstreak ); + recordstreakindex = undefined; + + if ( isdefined( level.killstreaks[killstreak].menuname ) ) + { + recordstreakindex = level.killstreakindices[level.killstreaks[killstreak].menuname]; + + if ( isdefined( recordstreakindex ) ) + self recordkillstreakevent( recordstreakindex ); + } + + if ( isdefined( level.usingscorestreaks ) && level.usingscorestreaks ) + { + if ( isdefined( isfrominventory ) && isfrominventory ) + { + removeusedkillstreak( killstreak ); + + if ( self getinventoryweapon() == killstreak_weapon ) + self setinventoryweapon( "" ); + } + else + self changekillstreakquantity( killstreak_weapon, -1 ); + } + else if ( isdefined( level.usingmomentum ) && level.usingmomentum ) + { + if ( isdefined( isfrominventory ) && isfrominventory && self getinventoryweapon() == killstreak_weapon ) + { + removeusedkillstreak( killstreak ); + self setinventoryweapon( "" ); + } + else + maps\mp\gametypes\_globallogic_score::_setplayermomentum( self, self.momentum - level.killstreaks[killstreaktype].momentumcost ); + } + else + removeusedkillstreak( killstreak ); + + if ( !isdefined( level.usingmomentum ) || !level.usingmomentum ) + self setactionslot( 4, "" ); + + success = 1; + } + + waittillframeend; + currentweapon = self getcurrentweapon(); + + if ( maps\mp\killstreaks\_killstreak_weapons::isheldkillstreakweapon( killstreaktype ) && currentweapon == killstreaktype ) + return; + + if ( successful && ( !self haskillstreakinclass( getkillstreakmenuname( killstreak ) ) || isdefined( isfrominventory ) && isfrominventory ) ) + changeweaponafterkillstreak( killstreak, 1 ); + else + { + killstreakforcurrentweapon = getkillstreakfromweapon( currentweapon ); + + if ( maps\mp\killstreaks\_killstreak_weapons::isgameplayweapon( currentweapon ) ) + { + if ( is_true( self.isplanting ) || is_true( self.isdefusing ) ) + return; + } + + if ( successful || !isdefined( killstreakforcurrentweapon ) || killstreakforcurrentweapon == killstreak ) + changeweaponafterkillstreak( killstreak, 0 ); + } + + if ( !isdefined( level.usingmomentum ) || !level.usingmomentum || isdefined( isfrominventory ) && isfrominventory ) + { + if ( successful ) + activatenextkillstreak(); + } } usekillstreak( killstreak, isfrominventory ) { - haskillstreakbeenused = getiftopkillstreakhasbeenused(); - if ( isDefined( self.selectinglocation ) ) - { - return; - } - self thread removekillstreakwhendone( killstreak, haskillstreakbeenused, isfrominventory ); - self thread triggerkillstreak( killstreak, isfrominventory ); + haskillstreakbeenused = getiftopkillstreakhasbeenused(); + + if ( isdefined( self.selectinglocation ) ) + return; + + self thread removekillstreakwhendone( killstreak, haskillstreakbeenused, isfrominventory ); + self thread triggerkillstreak( killstreak, isfrominventory ); } removeusedkillstreak( killstreak, killstreakid ) { - killstreakindex = undefined; - i = self.pers[ "killstreaks" ].size - 1; - while ( i >= 0 ) - { - if ( self.pers[ "killstreaks" ][ i ] == killstreak ) - { - if ( isDefined( killstreakid ) && self.pers[ "killstreak_unique_id" ][ i ] != killstreakid ) - { - i--; - continue; - } - else - { - killstreakindex = i; - break; - } - } - else - { - i--; + killstreakindex = undefined; - } - } - if ( !isDefined( killstreakindex ) ) - { - return; - } - if ( !self haskillstreakinclass( getkillstreakmenuname( killstreak ) ) ) - { - self thread takeweaponafteruse( killstreak ); - } - arraysize = self.pers[ "killstreaks" ].size; - i = killstreakindex; - while ( i < ( arraysize - 1 ) ) - { - self.pers[ "killstreaks" ][ i ] = self.pers[ "killstreaks" ][ i + 1 ]; - self.pers[ "killstreak_has_been_used" ][ i ] = self.pers[ "killstreak_has_been_used" ][ i + 1 ]; - self.pers[ "killstreak_unique_id" ][ i ] = self.pers[ "killstreak_unique_id" ][ i + 1 ]; - self.pers[ "killstreak_ammo_count" ][ i ] = self.pers[ "killstreak_ammo_count" ][ i + 1 ]; - i++; - } + for ( i = self.pers["killstreaks"].size - 1; i >= 0; i-- ) + { + if ( self.pers["killstreaks"][i] == killstreak ) + { + if ( isdefined( killstreakid ) && self.pers["killstreak_unique_id"][i] != killstreakid ) + continue; + + killstreakindex = i; + break; + } + } + + if ( !isdefined( killstreakindex ) ) + return; + + if ( !self haskillstreakinclass( getkillstreakmenuname( killstreak ) ) ) + self thread takeweaponafteruse( killstreak ); + + arraysize = self.pers["killstreaks"].size; + + for ( i = killstreakindex; i < arraysize - 1; i++ ) + { + self.pers["killstreaks"][i] = self.pers["killstreaks"][i + 1]; + self.pers["killstreak_has_been_used"][i] = self.pers["killstreak_has_been_used"][i + 1]; + self.pers["killstreak_unique_id"][i] = self.pers["killstreak_unique_id"][i + 1]; + self.pers["killstreak_ammo_count"][i] = self.pers["killstreak_ammo_count"][i + 1]; + } + + self.pers["killstreaks"][arraysize - 1] = undefined; + self.pers["killstreak_has_been_used"][arraysize - 1] = undefined; + self.pers["killstreak_unique_id"][arraysize - 1] = undefined; + self.pers["killstreak_ammo_count"][arraysize - 1] = undefined; } takeweaponafteruse( killstreak ) { - self endon( "disconnect" ); - self endon( "death" ); - self endon( "joined_team" ); - self endon( "joined_spectators" ); - self waittill( "weapon_change" ); - inventoryweapon = self getinventoryweapon(); - if ( inventoryweapon != killstreak ) - { - self takeweapon( killstreak ); - } + self endon( "disconnect" ); + self endon( "death" ); + self endon( "joined_team" ); + self endon( "joined_spectators" ); + + self waittill( "weapon_change" ); + + inventoryweapon = self getinventoryweapon(); + + if ( inventoryweapon != killstreak ) + self takeweapon( killstreak ); } gettopkillstreak() { - if ( self.pers[ "killstreaks" ].size == 0 ) - { - return undefined; - } - return self.pers[ "killstreaks" ][ self.pers[ "killstreaks" ].size - 1 ]; + if ( self.pers["killstreaks"].size == 0 ) + return undefined; + + return self.pers["killstreaks"][self.pers["killstreaks"].size - 1]; } getiftopkillstreakhasbeenused() { - if ( !isDefined( level.usingmomentum ) || !level.usingmomentum ) - { - if ( self.pers[ "killstreak_has_been_used" ].size == 0 ) - { - return undefined; - } - return self.pers[ "killstreak_has_been_used" ][ self.pers[ "killstreak_has_been_used" ].size - 1 ]; - } + if ( !isdefined( level.usingmomentum ) || !level.usingmomentum ) + { + if ( self.pers["killstreak_has_been_used"].size == 0 ) + return undefined; + + return self.pers["killstreak_has_been_used"][self.pers["killstreak_has_been_used"].size - 1]; + } } gettopkillstreakuniqueid() { - if ( self.pers[ "killstreak_unique_id" ].size == 0 ) - { - return undefined; - } - return self.pers[ "killstreak_unique_id" ][ self.pers[ "killstreak_unique_id" ].size - 1 ]; + if ( self.pers["killstreak_unique_id"].size == 0 ) + return undefined; + + return self.pers["killstreak_unique_id"][self.pers["killstreak_unique_id"].size - 1]; } getkillstreakindexbyid( killstreakid ) { - index = self.pers[ "killstreak_unique_id" ].size - 1; - while ( index >= 0 ) - { - if ( self.pers[ "killstreak_unique_id" ][ index ] == killstreakid ) - { - return index; - } - index--; + for ( index = self.pers["killstreak_unique_id"].size - 1; index >= 0; index-- ) + { + if ( self.pers["killstreak_unique_id"][index] == killstreakid ) + return index; + } - } - return undefined; + return undefined; } getkillstreakweapon( killstreak ) { - if ( !isDefined( killstreak ) ) - { - return "none"; - } + if ( !isdefined( killstreak ) ) + return "none"; /# - assert( isDefined( level.killstreaks[ killstreak ] ) ); + assert( isdefined( level.killstreaks[killstreak] ) ); #/ - return level.killstreaks[ killstreak ].weapon; + return level.killstreaks[killstreak].weapon; } getkillstreakmomentumcost( killstreak ) { - if ( !isDefined( level.usingmomentum ) || !level.usingmomentum ) - { - return 0; - } - if ( !isDefined( killstreak ) ) - { - return 0; - } + if ( !isdefined( level.usingmomentum ) || !level.usingmomentum ) + return 0; + + if ( !isdefined( killstreak ) ) + return 0; /# - assert( isDefined( level.killstreaks[ killstreak ] ) ); + assert( isdefined( level.killstreaks[killstreak] ) ); #/ - return level.killstreaks[ killstreak ].momentumcost; + return level.killstreaks[killstreak].momentumcost; } getkillstreakforweapon( weapon ) { - return level.killstreakweapons[ weapon ]; + return level.killstreakweapons[weapon]; } iskillstreakweapon( weapon ) { - if ( isweaponassociatedwithkillstreak( weapon ) ) - { - return 1; - } - switch( weapon ) - { - case "briefcase_bomb_defuse_mp": - case "briefcase_bomb_mp": - case "none": - case "scavenger_item_mp": - case "vcs_controller_mp": - return 0; - } - if ( isweaponspecificuse( weapon ) ) - { - return 1; - } - return 0; + if ( isweaponassociatedwithkillstreak( weapon ) ) + return true; + + switch ( weapon ) + { + case "vcs_controller_mp": + case "scavenger_item_mp": + case "none": + case "briefcase_bomb_mp": + case "briefcase_bomb_defuse_mp": + return false; + } + + if ( isweaponspecificuse( weapon ) ) + return true; + + return false; } iskillstreakweaponassistallowed( weapon ) { - killstreak = getkillstreakforweapon( weapon ); - if ( !isDefined( killstreak ) ) - { - return 0; - } - if ( level.killstreaks[ killstreak ].allowassists ) - { - return 1; - } - return 0; + killstreak = getkillstreakforweapon( weapon ); + + if ( !isdefined( killstreak ) ) + return false; + + if ( level.killstreaks[killstreak].allowassists ) + return true; + + return false; } getkillstreakteamkillpenaltyscale( weapon ) { - killstreak = getkillstreakforweapon( weapon ); - if ( !isDefined( killstreak ) ) - { - return 1; - } - return level.killstreaks[ killstreak ].teamkillpenaltyscale; + killstreak = getkillstreakforweapon( weapon ); + + if ( !isdefined( killstreak ) ) + return 1.0; + + return level.killstreaks[killstreak].teamkillpenaltyscale; } shouldoverrideentitycameraindemo( player, weapon ) { - killstreak = getkillstreakforweapon( weapon ); - if ( !isDefined( killstreak ) ) - { - return 0; - } - if ( level.killstreaks[ killstreak ].overrideentitycameraindemo ) - { - return 1; - } - if ( isDefined( player.remoteweapon ) && isDefined( player.remoteweapon.controlled ) && player.remoteweapon.controlled ) - { - return 1; - } - return 0; + killstreak = getkillstreakforweapon( weapon ); + + if ( !isdefined( killstreak ) ) + return false; + + if ( level.killstreaks[killstreak].overrideentitycameraindemo ) + return true; + + if ( isdefined( player.remoteweapon ) && isdefined( player.remoteweapon.controlled ) && player.remoteweapon.controlled ) + return true; + + return false; } trackweaponusage() { - self endon( "death" ); - self endon( "disconnect" ); - self.lastnonkillstreakweapon = self getcurrentweapon(); - lastvalidpimary = self getcurrentweapon(); - if ( self.lastnonkillstreakweapon == "none" ) - { - weapons = self getweaponslistprimaries(); - if ( weapons.size > 0 ) - { - self.lastnonkillstreakweapon = weapons[ 0 ]; - } - else - { - self.lastnonkillstreakweapon = "knife_mp"; - } - } + self endon( "death" ); + self endon( "disconnect" ); + self.lastnonkillstreakweapon = self getcurrentweapon(); + lastvalidpimary = self getcurrentweapon(); + + if ( self.lastnonkillstreakweapon == "none" ) + { + weapons = self getweaponslistprimaries(); + + if ( weapons.size > 0 ) + self.lastnonkillstreakweapon = weapons[0]; + else + self.lastnonkillstreakweapon = "knife_mp"; + } /# - assert( self.lastnonkillstreakweapon != "none" ); + assert( self.lastnonkillstreakweapon != "none" ); #/ - for ( ;; ) - { - currentweapon = self getcurrentweapon(); - self waittill( "weapon_change", weapon ); - if ( maps/mp/gametypes/_weapons::isprimaryweapon( weapon ) ) - { - lastvalidpimary = weapon; - } - if ( weapon == self.lastnonkillstreakweapon ) - { - continue; - } - else switch( weapon ) - { - case "knife_mp": - case "none": - continue; - } - if ( maps/mp/killstreaks/_killstreak_weapons::isgameplayweapon( weapon ) ) - { - continue; - } - else name = getkillstreakforweapon( weapon ); - if ( isDefined( name ) && !maps/mp/killstreaks/_killstreak_weapons::isheldkillstreakweapon( weapon ) ) - { - killstreak = level.killstreaks[ name ]; - continue; - } - else - { - if ( currentweapon != "none" && isweaponequipment( currentweapon ) && maps/mp/killstreaks/_killstreak_weapons::isheldkillstreakweapon( self.lastnonkillstreakweapon ) ) - { - self.lastnonkillstreakweapon = lastvalidpimary; - break; - } - else - { - if ( isweaponequipment( weapon ) ) - { - break; - } - else - { - self.lastnonkillstreakweapon = weapon; - } - } - } - } - } + for (;;) + { + currentweapon = self getcurrentweapon(); + + self waittill( "weapon_change", weapon ); + + if ( maps\mp\gametypes\_weapons::isprimaryweapon( weapon ) ) + lastvalidpimary = weapon; + + if ( weapon == self.lastnonkillstreakweapon ) + continue; + + switch ( weapon ) + { + case "none": + case "knife_mp": + continue; + } + + if ( maps\mp\killstreaks\_killstreak_weapons::isgameplayweapon( weapon ) ) + continue; + + name = getkillstreakforweapon( weapon ); + + if ( isdefined( name ) && !maps\mp\killstreaks\_killstreak_weapons::isheldkillstreakweapon( weapon ) ) + { + killstreak = level.killstreaks[name]; + continue; + } + + if ( currentweapon != "none" && isweaponequipment( currentweapon ) && maps\mp\killstreaks\_killstreak_weapons::isheldkillstreakweapon( self.lastnonkillstreakweapon ) ) + { + self.lastnonkillstreakweapon = lastvalidpimary; + continue; + } + + if ( isweaponequipment( weapon ) ) + continue; + + self.lastnonkillstreakweapon = weapon; + } } killstreakwaiter() { - self endon( "death" ); - self endon( "disconnect" ); - level endon( "game_ended" ); - self thread trackweaponusage(); - self giveownedkillstreak(); - for ( ;; ) - { - self waittill( "weapon_change", weapon ); - if ( !iskillstreakweapon( weapon ) ) - { - continue; - } - else killstreak = getkillstreakforweapon( weapon ); - if ( !isDefined( level.usingmomentum ) || !level.usingmomentum ) - { - killstreak = gettopkillstreak(); - if ( weapon != getkillstreakweapon( killstreak ) ) - { - continue; - } - } - else if ( iskillstreakremoteoverrideweapon( killstreak, weapon ) ) - { - continue; - } - else if ( !self inventorybuttonpressed() ) - { - inventorybuttonpressed = isDefined( self.pers[ "isBot" ] ); - } - waittillframeend; - if ( isDefined( self.usingkillstreakheldweapon ) && self.usingkillstreakheldweapon && maps/mp/killstreaks/_killstreak_weapons::isheldkillstreakweapon( killstreak ) ) - { - continue; - } - else - { - isfrominventory = undefined; - if ( isDefined( level.usingscorestreaks ) && level.usingscorestreaks ) - { - if ( weapon == self getinventoryweapon() && inventorybuttonpressed ) - { - isfrominventory = 1; - } - else - { - if ( self getammocount( weapon ) <= 0 && weapon != "killstreak_ai_tank_mp" ) - { - self switchtolastnonkillstreakweapon(); - break; - } - } - else - { - } - else if ( isDefined( level.usingmomentum ) && level.usingmomentum ) - { - if ( weapon == self getinventoryweapon() && inventorybuttonpressed ) - { - isfrominventory = 1; - break; - } - else - { - if ( self.momentum < level.killstreaks[ killstreak ].momentumcost ) - { - self switchtolastnonkillstreakweapon(); - break; - } - } - } - else - { - thread usekillstreak( killstreak, isfrominventory ); - if ( isDefined( self.selectinglocation ) && getDvarInt( #"027EB3EF" ) == 0 ) - { - event = self waittill_any_return( "cancel_location", "game_ended", "used", "weapon_change" ); - if ( event == "cancel_location" || event == "weapon_change" ) - { - wait 1; - } - } - } - } - } - } + self endon( "death" ); + self endon( "disconnect" ); + level endon( "game_ended" ); + self thread trackweaponusage(); + self giveownedkillstreak(); + + for (;;) + { + self waittill( "weapon_change", weapon ); + + if ( !iskillstreakweapon( weapon ) ) + continue; + + killstreak = getkillstreakforweapon( weapon ); + + if ( !isdefined( level.usingmomentum ) || !level.usingmomentum ) + { + killstreak = gettopkillstreak(); + + if ( weapon != getkillstreakweapon( killstreak ) ) + continue; + } + + if ( iskillstreakremoteoverrideweapon( killstreak, weapon ) ) + continue; + + inventorybuttonpressed = self inventorybuttonpressed() || isdefined( self.pers["isBot"] ); + waittillframeend; + + if ( isdefined( self.usingkillstreakheldweapon ) && self.usingkillstreakheldweapon && maps\mp\killstreaks\_killstreak_weapons::isheldkillstreakweapon( killstreak ) ) + continue; + + isfrominventory = undefined; + inventoryweapon = self getinventoryweapon(); + + if ( isdefined( level.usingscorestreaks ) && level.usingscorestreaks ) + { + if ( weapon == inventoryweapon && inventorybuttonpressed ) + isfrominventory = 1; + else if ( weapon == inventoryweapon && ( weapon == "inventory_missile_drone_mp" || weapon == "inventory_ai_tank_drop_mp" ) ) + { + self switchtolastnonkillstreakweapon(); + continue; + } + else if ( self getammocount( weapon ) <= 0 && weapon != "killstreak_ai_tank_mp" ) + { + self switchtolastnonkillstreakweapon(); + continue; + } + } + else if ( isdefined( level.usingmomentum ) && level.usingmomentum ) + { + if ( weapon == self getinventoryweapon() && inventorybuttonpressed ) + isfrominventory = 1; + else if ( self.momentum < level.killstreaks[killstreak].momentumcost ) + { + self switchtolastnonkillstreakweapon(); + continue; + } + } + + thread usekillstreak( killstreak, isfrominventory ); + + if ( isdefined( self.selectinglocation ) && getdvarint( "tu7_mapbased_killstreaks_fix" ) == 0 ) + { + event = self waittill_any_return( "cancel_location", "game_ended", "used", "weapon_change" ); + + if ( event == "cancel_location" || event == "weapon_change" ) + wait 1; + } + } } shoulddelaykillstreak( killstreaktype ) { - if ( !isDefined( level.starttime ) ) - { - return 0; - } - if ( level.roundstartkillstreakdelay < ( ( getTime() - level.starttime - level.discardtime ) / 1000 ) ) - { - return 0; - } - if ( !isdelayablekillstreak( killstreaktype ) ) - { - return 0; - } - if ( maps/mp/killstreaks/_killstreak_weapons::isheldkillstreakweapon( killstreaktype ) ) - { - return 0; - } - if ( isfirstround() || isoneround() ) - { - return 0; - } - return 1; + if ( !isdefined( level.starttime ) ) + return false; + + if ( level.roundstartkillstreakdelay < ( gettime() - level.starttime - level.discardtime ) / 1000 ) + return false; + + if ( !isdelayablekillstreak( killstreaktype ) ) + return false; + + if ( maps\mp\killstreaks\_killstreak_weapons::isheldkillstreakweapon( killstreaktype ) ) + return false; + + if ( isfirstround() || isoneround() ) + return false; + + return true; } isdelayablekillstreak( killstreaktype ) { - if ( isDefined( level.killstreaks[ killstreaktype ] ) && isDefined( level.killstreaks[ killstreaktype ].delaystreak ) && level.killstreaks[ killstreaktype ].delaystreak ) - { - return 1; - } - return 0; + if ( isdefined( level.killstreaks[killstreaktype] ) && isdefined( level.killstreaks[killstreaktype].delaystreak ) && level.killstreaks[killstreaktype].delaystreak ) + return true; + + return false; } getxpamountforkillstreak( killstreaktype ) { - xpamount = 0; - switch( level.killstreaks[ killstreaktype ].killstreaklevel ) - { - case 1: - case 2: - case 3: - case 4: - xpamount = 100; - break; - case 5: - xpamount = 150; - break; - case 6: - case 7: - xpamount = 200; - break; - case 8: - xpamount = 250; - break; - case 9: - xpamount = 300; - break; - case 10: - case 11: - xpamount = 350; - break; - case 12: - case 13: - case 14: - case 15: - xpamount = 500; - break; - } - return xpamount; + xpamount = 0; + + switch ( level.killstreaks[killstreaktype].killstreaklevel ) + { + case "4": + case "3": + case "2": + case "1": + xpamount = 100; + break; + case "5": + xpamount = 150; + break; + case "7": + case "6": + xpamount = 200; + break; + case "8": + xpamount = 250; + break; + case "9": + xpamount = 300; + break; + case "11": + case "10": + xpamount = 350; + break; + case "15": + case "14": + case "13": + case "12": + xpamount = 500; + break; + } + + return xpamount; } triggerkillstreak( killstreaktype, isfrominventory ) { /# - assert( isDefined( level.killstreaks[ killstreaktype ].usefunction ), "No use function defined for killstreak " + killstreaktype ); + assert( isdefined( level.killstreaks[killstreaktype].usefunction ), "No use function defined for killstreak " + killstreaktype ); #/ - self.usingkillstreakfrominventory = isfrominventory; - if ( level.infinalkillcam ) - { - return 0; - } - if ( shoulddelaykillstreak( killstreaktype ) ) - { - timeleft = int( level.roundstartkillstreakdelay - ( maps/mp/gametypes/_globallogic_utils::gettimepassed() / 1000 ) ); - if ( !timeleft ) - { - timeleft = 1; - } - self iprintlnbold( &"MP_UNAVAILABLE_FOR_N", " " + timeleft + " ", &"EXE_SECONDS" ); - } - else - { - if ( [[ level.killstreaks[ killstreaktype ].usefunction ]]( killstreaktype ) ) - { - if ( isDefined( self ) ) - { - if ( !isDefined( self.pers[ level.killstreaks[ killstreaktype ].usagekey ] ) ) - { - self.pers[ level.killstreaks[ killstreaktype ].usagekey ] = 0; - } - self.pers[ level.killstreaks[ killstreaktype ].usagekey ]++; - self notify( "killstreak_used" ); - self notify( "killstreak_done" ); - } - self.usingkillstreakfrominventory = undefined; - return 1; - } - } - self.usingkillstreakfrominventory = undefined; - if ( isDefined( self ) ) - { - self notify( "killstreak_done" ); - } - return 0; + self.usingkillstreakfrominventory = isfrominventory; + + if ( level.infinalkillcam ) + return false; + + if ( shoulddelaykillstreak( killstreaktype ) ) + { + timeleft = int( level.roundstartkillstreakdelay - maps\mp\gametypes\_globallogic_utils::gettimepassed() / 1000 ); + + if ( !timeleft ) + timeleft = 1; + + self iprintlnbold( &"MP_UNAVAILABLE_FOR_N", " " + timeleft + " ", &"EXE_SECONDS" ); + } + else if ( [[ level.killstreaks[killstreaktype].usefunction ]]( killstreaktype ) ) + { + if ( isdefined( self ) ) + { + if ( !isdefined( self.pers[level.killstreaks[killstreaktype].usagekey] ) ) + self.pers[level.killstreaks[killstreaktype].usagekey] = 0; + + self.pers[level.killstreaks[killstreaktype].usagekey]++; + self notify( "killstreak_used", killstreaktype ); + self notify( "killstreak_done", 1, killstreaktype ); + } + + self.usingkillstreakfrominventory = undefined; + return true; + } + + self.usingkillstreakfrominventory = undefined; + + if ( isdefined( self ) ) + self notify( "killstreak_done", 0, killstreaktype ); + + return false; } addtokillstreakcount( weapon ) { - if ( !isDefined( self.pers[ "totalKillstreakCount" ] ) ) - { - self.pers[ "totalKillstreakCount" ] = 0; - } - self.pers[ "totalKillstreakCount" ]++; + if ( !isdefined( self.pers["totalKillstreakCount"] ) ) + self.pers["totalKillstreakCount"] = 0; + + self.pers["totalKillstreakCount"]++; } isweaponassociatedwithkillstreak( weapon ) { - return isDefined( level.killstreakweapons[ weapon ] ); + return isdefined( level.killstreakweapons[weapon] ); } getfirstvalidkillstreakaltweapon( killstreaktype ) { /# - assert( isDefined( level.killstreaks[ killstreaktype ] ), "Killstreak not registered." ); + assert( isdefined( level.killstreaks[killstreaktype] ), "Killstreak not registered." ); #/ - while ( isDefined( level.killstreaks[ killstreaktype ].altweapons ) ) - { - i = 0; - while ( i < level.killstreaks[ killstreaktype ].altweapons.size ) - { - if ( isDefined( level.killstreaks[ killstreaktype ].altweapons[ i ] ) ) - { - return level.killstreaks[ killstreaktype ].altweapons[ i ]; - } - i++; - } - } - return "none"; + if ( isdefined( level.killstreaks[killstreaktype].altweapons ) ) + { + for ( i = 0; i < level.killstreaks[killstreaktype].altweapons.size; i++ ) + { + if ( isdefined( level.killstreaks[killstreaktype].altweapons[i] ) ) + return level.killstreaks[killstreaktype].altweapons[i]; + } + } + + return "none"; } shouldgivekillstreak( weapon ) { - killstreakbuilding = getDvarInt( "scr_allow_killstreak_building" ); - if ( killstreakbuilding == 0 ) - { - if ( isweaponassociatedwithkillstreak( weapon ) ) - { - return 0; - } - } - return 1; + killstreakbuilding = getdvarint( "scr_allow_killstreak_building" ); + + if ( killstreakbuilding == 0 ) + { + if ( isweaponassociatedwithkillstreak( weapon ) ) + return false; + } + + return true; } pointisindangerarea( point, targetpos, radius ) { - return distance2d( point, targetpos ) <= ( radius * 1,25 ); + return distance2d( point, targetpos ) <= radius * 1.25; } printkillstreakstarttext( killstreaktype, owner, team, targetpos, dangerradius ) { - if ( !isDefined( level.killstreaks[ killstreaktype ] ) ) - { - return; - } - if ( level.teambased ) - { - players = level.players; - while ( !level.hardcoremode && isDefined( level.killstreaks[ killstreaktype ].inboundnearplayertext ) ) - { - i = 0; - while ( i < players.size ) - { - if ( isalive( players[ i ] ) && isDefined( players[ i ].pers[ "team" ] ) && players[ i ].pers[ "team" ] == team ) - { - if ( pointisindangerarea( players[ i ].origin, targetpos, dangerradius ) ) - { - players[ i ] iprintlnbold( level.killstreaks[ killstreaktype ].inboundnearplayertext ); - } - } - i++; - } - } - while ( isDefined( level.killstreaks[ killstreaktype ] ) ) - { - i = 0; - while ( i < level.players.size ) - { - player = level.players[ i ]; - playerteam = player.pers[ "team" ]; - if ( isDefined( playerteam ) ) - { - if ( playerteam == team ) - { - player iprintln( level.killstreaks[ killstreaktype ].inboundtext, owner ); - } - } - i++; - } - } - } - else if ( !level.hardcoremode && isDefined( level.killstreaks[ killstreaktype ].inboundnearplayertext ) ) - { - if ( pointisindangerarea( owner.origin, targetpos, dangerradius ) ) - { - owner iprintlnbold( level.killstreaks[ killstreaktype ].inboundnearplayertext ); - } - } + if ( !isdefined( level.killstreaks[killstreaktype] ) ) + return; + + if ( level.teambased ) + { + players = level.players; + + if ( !level.hardcoremode && isdefined( level.killstreaks[killstreaktype].inboundnearplayertext ) ) + { + for ( i = 0; i < players.size; i++ ) + { + if ( isalive( players[i] ) && isdefined( players[i].pers["team"] ) && players[i].pers["team"] == team ) + { + if ( pointisindangerarea( players[i].origin, targetpos, dangerradius ) ) + players[i] iprintlnbold( level.killstreaks[killstreaktype].inboundnearplayertext ); + } + } + } + + if ( isdefined( level.killstreaks[killstreaktype] ) ) + { + for ( i = 0; i < level.players.size; i++ ) + { + player = level.players[i]; + playerteam = player.pers["team"]; + + if ( isdefined( playerteam ) ) + { + if ( playerteam == team ) + player iprintln( level.killstreaks[killstreaktype].inboundtext, owner ); + } + } + } + } + else if ( !level.hardcoremode && isdefined( level.killstreaks[killstreaktype].inboundnearplayertext ) ) + { + if ( pointisindangerarea( owner.origin, targetpos, dangerradius ) ) + owner iprintlnbold( level.killstreaks[killstreaktype].inboundnearplayertext ); + } } playkillstreakstartdialog( killstreaktype, team, playnonteambasedenemysounds ) { - if ( !isDefined( level.killstreaks[ killstreaktype ] ) ) - { - return; - } - if ( killstreaktype == "radar_mp" && level.teambased ) - { - if ( ( getTime() - level.radartimers[ team ] ) > 30000 ) - { - maps/mp/gametypes/_globallogic_audio::leaderdialog( killstreaktype + "_start", team ); - maps/mp/gametypes/_globallogic_audio::leaderdialogforotherteams( killstreaktype + "_enemy_start", team ); - level.radartimers[ team ] = getTime(); - } - else - { - self maps/mp/gametypes/_globallogic_audio::leaderdialogonplayer( killstreaktype + "_start" ); - } - return; - } - if ( level.teambased ) - { - maps/mp/gametypes/_globallogic_audio::leaderdialog( killstreaktype + "_start", team ); - maps/mp/gametypes/_globallogic_audio::leaderdialogforotherteams( killstreaktype + "_enemy_start", team ); - } - else - { - self maps/mp/gametypes/_globallogic_audio::leaderdialogonplayer( killstreaktype + "_start" ); - selfarray = []; - selfarray[ 0 ] = self; - maps/mp/gametypes/_globallogic_audio::leaderdialog( killstreaktype + "_enemy_start", undefined, undefined, selfarray ); - } + if ( !isdefined( level.killstreaks[killstreaktype] ) ) + return; + + if ( killstreaktype == "radar_mp" && level.teambased ) + { + if ( gettime() - level.radartimers[team] > 30000 ) + { + maps\mp\gametypes\_globallogic_audio::leaderdialog( killstreaktype + "_start", team ); + maps\mp\gametypes\_globallogic_audio::leaderdialogforotherteams( killstreaktype + "_enemy_start", team ); + level.radartimers[team] = gettime(); + } + else + self maps\mp\gametypes\_globallogic_audio::leaderdialogonplayer( killstreaktype + "_start" ); + + return; + } + + if ( level.teambased ) + { + maps\mp\gametypes\_globallogic_audio::leaderdialog( killstreaktype + "_start", team ); + maps\mp\gametypes\_globallogic_audio::leaderdialogforotherteams( killstreaktype + "_enemy_start", team ); + } + else + { + self maps\mp\gametypes\_globallogic_audio::leaderdialogonplayer( killstreaktype + "_start" ); + selfarray = []; + selfarray[0] = self; + maps\mp\gametypes\_globallogic_audio::leaderdialog( killstreaktype + "_enemy_start", undefined, undefined, selfarray ); + } } playkillstreakreadydialog( killstreaktype ) { - if ( !isDefined( level.gameended ) || !level.gameended ) - { - self maps/mp/gametypes/_globallogic_audio::leaderdialogonplayer( killstreaktype ); - } + if ( !isdefined( level.gameended ) || !level.gameended ) + self maps\mp\gametypes\_globallogic_audio::leaderdialogonplayer( killstreaktype ); } getkillstreakinformdialog( killstreaktype ) { /# - assert( isDefined( level.killstreaks[ killstreaktype ].informdialog ) ); + assert( isdefined( level.killstreaks[killstreaktype].informdialog ) ); #/ - if ( isDefined( level.killstreaks[ killstreaktype ].informdialog ) ) - { - return level.killstreaks[ killstreaktype ].informdialog; - } - return ""; + if ( isdefined( level.killstreaks[killstreaktype].informdialog ) ) + return level.killstreaks[killstreaktype].informdialog; + + return ""; } playkillstreakenddialog( killstreaktype, team ) { - if ( !isDefined( level.killstreaks[ killstreaktype ] ) ) - { - return; - } - if ( level.teambased ) - { - maps/mp/gametypes/_globallogic_audio::leaderdialog( killstreaktype + "_end", team ); - maps/mp/gametypes/_globallogic_audio::leaderdialogforotherteams( killstreaktype + "_enemy_end", team ); - } - else - { - self maps/mp/gametypes/_globallogic_audio::leaderdialogonplayer( killstreaktype + "_end" ); - } + if ( !isdefined( level.killstreaks[killstreaktype] ) ) + return; + + if ( level.teambased ) + { + maps\mp\gametypes\_globallogic_audio::leaderdialog( killstreaktype + "_end", team ); + maps\mp\gametypes\_globallogic_audio::leaderdialogforotherteams( killstreaktype + "_enemy_end", team ); + } + else + self maps\mp\gametypes\_globallogic_audio::leaderdialogonplayer( killstreaktype + "_end" ); } getkillstreakusagebykillstreak( killstreaktype ) { /# - assert( isDefined( level.killstreaks[ killstreaktype ] ), "Killstreak needs to be registered before calling getKillstreakUsage." ); + assert( isdefined( level.killstreaks[killstreaktype] ), "Killstreak needs to be registered before calling getKillstreakUsage." ); #/ - return getkillstreakusage( level.killstreaks[ killstreaktype ].usagekey ); + return getkillstreakusage( level.killstreaks[killstreaktype].usagekey ); } getkillstreakusage( usagekey ) { - if ( !isDefined( self.pers[ usagekey ] ) ) - { - return 0; - } - return self.pers[ usagekey ]; + if ( !isdefined( self.pers[usagekey] ) ) + return 0; + + return self.pers[usagekey]; } onplayerconnect() { - for ( ;; ) - { - level waittill( "connecting", player ); - player thread onplayerspawned(); - player thread onjoinedteam(); - } + for (;;) + { + level waittill( "connecting", player ); + + player thread onplayerspawned(); + player thread onjoinedteam(); + } } onplayerspawned() { - self endon( "disconnect" ); - for ( ;; ) - { - self waittill( "spawned_player" ); - pixbeginevent( "_killstreaks.gsc/onPlayerSpawned" ); - giveownedkillstreak(); - if ( !isDefined( self.pers[ "killstreaks" ] ) ) - { - self.pers[ "killstreaks" ] = []; - } - if ( !isDefined( self.pers[ "killstreak_has_been_used" ] ) ) - { - self.pers[ "killstreak_has_been_used" ] = []; - } - if ( !isDefined( self.pers[ "killstreak_unique_id" ] ) ) - { - self.pers[ "killstreak_unique_id" ] = []; - } - if ( !isDefined( self.pers[ "killstreak_ammo_count" ] ) ) - { - self.pers[ "killstreak_ammo_count" ] = []; - } - size = self.pers[ "killstreaks" ].size; - if ( size > 0 ) - { - playkillstreakreadydialog( self.pers[ "killstreaks" ][ size - 1 ] ); - } - pixendevent(); - } + self endon( "disconnect" ); + + for (;;) + { + self waittill( "spawned_player" ); + + pixbeginevent( "_killstreaks.gsc/onPlayerSpawned" ); + giveownedkillstreak(); + + if ( !isdefined( self.pers["killstreaks"] ) ) + self.pers["killstreaks"] = []; + + if ( !isdefined( self.pers["killstreak_has_been_used"] ) ) + self.pers["killstreak_has_been_used"] = []; + + if ( !isdefined( self.pers["killstreak_unique_id"] ) ) + self.pers["killstreak_unique_id"] = []; + + if ( !isdefined( self.pers["killstreak_ammo_count"] ) ) + self.pers["killstreak_ammo_count"] = []; + + size = self.pers["killstreaks"].size; + + if ( size > 0 ) + playkillstreakreadydialog( self.pers["killstreaks"][size - 1] ); + + pixendevent(); + } } onjoinedteam() { - self endon( "disconnect" ); - for ( ;; ) - { - self waittill( "joined_team" ); - self setinventoryweapon( "" ); - self.pers[ "cur_kill_streak" ] = 0; - self.pers[ "cur_total_kill_streak" ] = 0; - self setplayercurrentstreak( 0 ); - self.pers[ "totalKillstreakCount" ] = 0; - self.pers[ "killstreaks" ] = []; - self.pers[ "killstreak_has_been_used" ] = []; - self.pers[ "killstreak_unique_id" ] = []; - self.pers[ "killstreak_ammo_count" ] = []; - if ( isDefined( level.usingscorestreaks ) && level.usingscorestreaks ) - { - self.pers[ "killstreak_quantity" ] = []; - self.pers[ "held_killstreak_ammo_count" ] = []; - self.pers[ "held_killstreak_clip_count" ] = []; - } - } + self endon( "disconnect" ); + + for (;;) + { + self waittill( "joined_team" ); + + self setinventoryweapon( "" ); + self.pers["cur_kill_streak"] = 0; + self.pers["cur_total_kill_streak"] = 0; + self setplayercurrentstreak( 0 ); + self.pers["totalKillstreakCount"] = 0; + self.pers["killstreaks"] = []; + self.pers["killstreak_has_been_used"] = []; + self.pers["killstreak_unique_id"] = []; + self.pers["killstreak_ammo_count"] = []; + + if ( isdefined( level.usingscorestreaks ) && level.usingscorestreaks ) + { + self.pers["killstreak_quantity"] = []; + self.pers["held_killstreak_ammo_count"] = []; + self.pers["held_killstreak_clip_count"] = []; + } + } } createkillstreaktimerforteam( killstreaktype, xposition, team ) { /# - assert( isDefined( level.killstreak_timers[ team ] ) ); + assert( isdefined( level.killstreak_timers[team] ) ); #/ - killstreaktimer = spawnstruct(); - killstreaktimer.team = team; - killstreaktimer.icon = createservericon( level.killstreaks[ killstreaktype ].iconmaterial, 36, 36, team ); - killstreaktimer.icon.horzalign = "user_left"; - killstreaktimer.icon.vertalign = "user_top"; - killstreaktimer.icon.x = xposition + 15; - killstreaktimer.icon.y = 100; - killstreaktimer.icon.alpha = 0; - killstreaktimer.killstreaktype = killstreaktype; - level.killstreak_timers[ team ][ level.killstreak_timers[ team ].size ] = killstreaktimer; + killstreaktimer = spawnstruct(); + killstreaktimer.team = team; + killstreaktimer.icon = createservericon( level.killstreaks[killstreaktype].iconmaterial, 36, 36, team ); + killstreaktimer.icon.horzalign = "user_left"; + killstreaktimer.icon.vertalign = "user_top"; + killstreaktimer.icon.x = xposition + 15; + killstreaktimer.icon.y = 100; + killstreaktimer.icon.alpha = 0; + killstreaktimer.killstreaktype = killstreaktype; + level.killstreak_timers[team][level.killstreak_timers[team].size] = killstreaktimer; } createkillstreaktimer( killstreaktype ) { - if ( killstreaktype == "radar_mp" ) - { - xposition = 0; - } - else if ( killstreaktype == "counteruav_mp" ) - { - xposition = 20; - } - else if ( killstreaktype == "missile_swarm_mp" ) - { - xposition = 40; - } - else if ( killstreaktype == "emp_mp" ) - { - xposition = 60; - } - else if ( killstreaktype == "radardirection_mp" ) - { - xposition = 80; - } - else - { - xposition = 0; - } - _a1692 = level.teams; - _k1692 = getFirstArrayKey( _a1692 ); - while ( isDefined( _k1692 ) ) - { - team = _a1692[ _k1692 ]; - createkillstreaktimerforteam( killstreaktype, xposition, team ); - _k1692 = getNextArrayKey( _a1692, _k1692 ); - } + if ( killstreaktype == "radar_mp" ) + xposition = 0; + else if ( killstreaktype == "counteruav_mp" ) + xposition = 20; + else if ( killstreaktype == "missile_swarm_mp" ) + xposition = 40; + else if ( killstreaktype == "emp_mp" ) + xposition = 60; + else if ( killstreaktype == "radardirection_mp" ) + xposition = 80; + else + xposition = 0; + + foreach ( team in level.teams ) + createkillstreaktimerforteam( killstreaktype, xposition, team ); } destroykillstreaktimers() { - level notify( "endKillstreakTimers" ); - if ( isDefined( level.killstreak_timers ) ) - { - _a1705 = level.teams; - _k1705 = getFirstArrayKey( _a1705 ); - while ( isDefined( _k1705 ) ) - { - team = _a1705[ _k1705 ]; - _a1707 = level.killstreak_timers[ team ]; - _k1707 = getFirstArrayKey( _a1707 ); - while ( isDefined( _k1707 ) ) - { - killstreaktimer = _a1707[ _k1707 ]; - killstreaktimer.icon destroyelem(); - _k1707 = getNextArrayKey( _a1707, _k1707 ); - } - _k1705 = getNextArrayKey( _a1705, _k1705 ); - } - level.killstreak_timers = undefined; - } + level notify( "endKillstreakTimers" ); + + if ( isdefined( level.killstreak_timers ) ) + { + foreach ( team in level.teams ) + { + foreach ( killstreaktimer in level.killstreak_timers[team] ) + killstreaktimer.icon destroyelem(); + } + + level.killstreak_timers = undefined; + } } getkillstreaktimerforkillstreak( team, killstreaktype, duration ) { - endtime = getTime() + ( duration * 1000 ); - numkillstreaktimers = level.killstreak_timers[ team ].size; - killstreakslot = undefined; - targetindex = 0; - i = 0; - while ( i < numkillstreaktimers ) - { - killstreaktimer = level.killstreak_timers[ team ][ i ]; - if ( isDefined( killstreaktimer.killstreaktype ) && killstreaktimer.killstreaktype == killstreaktype ) - { - killstreakslot = i; - break; - } - else if ( !isDefined( killstreaktimer.killstreaktype ) && !isDefined( killstreakslot ) ) - { - killstreakslot = i; - } - i++; - } - if ( isDefined( killstreakslot ) ) - { - killstreaktimer = level.killstreak_timers[ team ][ killstreakslot ]; - killstreaktimer.endtime = endtime; - killstreaktimer.icon.alpha = 1; - return killstreaktimer; - } + endtime = gettime() + duration * 1000; + numkillstreaktimers = level.killstreak_timers[team].size; + killstreakslot = undefined; + targetindex = 0; + + for ( i = 0; i < numkillstreaktimers; i++ ) + { + killstreaktimer = level.killstreak_timers[team][i]; + + if ( isdefined( killstreaktimer.killstreaktype ) && killstreaktimer.killstreaktype == killstreaktype ) + { + killstreakslot = i; + break; + continue; + } + + if ( !isdefined( killstreaktimer.killstreaktype ) && !isdefined( killstreakslot ) ) + killstreakslot = i; + } + + if ( isdefined( killstreakslot ) ) + { + killstreaktimer = level.killstreak_timers[team][killstreakslot]; + killstreaktimer.endtime = endtime; + killstreaktimer.icon.alpha = 1; + return killstreaktimer; + } } freekillstreaktimer( killstreaktimer ) { - killstreaktimer.icon.alpha = 0,2; - killstreaktimer.endtime = undefined; + killstreaktimer.icon.alpha = 0.2; + killstreaktimer.endtime = undefined; } killstreaktimer( killstreaktype, team, duration ) { - level endon( "endKillstreakTimers" ); - if ( level.gameended ) - { - return; - } - killstreaktimer = getkillstreaktimerforkillstreak( team, killstreaktype, duration ); - if ( !isDefined( killstreaktimer ) ) - { - return; - } - eventname = ( team + "_" ) + killstreaktype; - level notify( eventname ); - level endon( eventname ); - blinkingduration = 5; - while ( duration > 0 ) - { - wait ( duration - blinkingduration ); - while ( blinkingduration > 0 ) - { - killstreaktimer.icon fadeovertime( 0,5 ); - killstreaktimer.icon.alpha = 1; - wait 0,5; - killstreaktimer.icon fadeovertime( 0,5 ); - killstreaktimer.icon.alpha = 0; - wait 0,5; - blinkingduration -= 1; - } - } - freekillstreaktimer( killstreaktimer ); + level endon( "endKillstreakTimers" ); + + if ( level.gameended ) + return; + + killstreaktimer = getkillstreaktimerforkillstreak( team, killstreaktype, duration ); + + if ( !isdefined( killstreaktimer ) ) + return; + + eventname = team + "_" + killstreaktype; + level notify( eventname ); + level endon( eventname ); + blinkingduration = 5; + + if ( duration > 0 ) + { + wait( duration - blinkingduration ); + + while ( blinkingduration > 0 ) + { + killstreaktimer.icon fadeovertime( 0.5 ); + killstreaktimer.icon.alpha = 1; + wait 0.5; + killstreaktimer.icon fadeovertime( 0.5 ); + killstreaktimer.icon.alpha = 0; + wait 0.5; + blinkingduration -= 1; + } + } + + freekillstreaktimer( killstreaktimer ); } setkillstreaktimer( killstreaktype, team, duration ) { - thread killstreaktimer( killstreaktype, team, duration ); + thread killstreaktimer( killstreaktype, team, duration ); } initridekillstreak( streak ) { - self disableusability(); - result = self initridekillstreak_internal( streak ); - if ( isDefined( self ) ) - { - self enableusability(); - } - return result; + self disableusability(); + result = self initridekillstreak_internal( streak ); + + if ( isdefined( self ) ) + self enableusability(); + + return result; } watchforemoveremoteweapon() { - self endon( "endWatchFoRemoveRemoteWeapon" ); - for ( ;; ) - { - self waittill( "remove_remote_weapon" ); - self maps/mp/killstreaks/_killstreaks::switchtolastnonkillstreakweapon(); - self enableusability(); - } + self endon( "endWatchFoRemoveRemoteWeapon" ); + + for (;;) + { + self waittill( "remove_remote_weapon" ); + + self maps\mp\killstreaks\_killstreaks::switchtolastnonkillstreakweapon(); + self enableusability(); + } } initridekillstreak_internal( streak ) { - if ( isDefined( streak ) && streak != "qrdrone" && streak != "killstreak_remote_turret_mp" || streak == "killstreak_ai_tank_mp" && streak == "qrdrone_mp" ) - { - laptopwait = "timeout"; - } - else - { - laptopwait = self waittill_any_timeout( 0,6, "disconnect", "death", "weapon_switch_started" ); - } - maps/mp/gametypes/_hostmigration::waittillhostmigrationdone(); - if ( laptopwait == "weapon_switch_started" ) - { - return "fail"; - } - if ( !isalive( self ) ) - { - return "fail"; - } - if ( laptopwait == "disconnect" || laptopwait == "death" ) - { - if ( laptopwait == "disconnect" ) - { - return "disconnect"; - } - if ( self.team == "spectator" ) - { - return "fail"; - } - return "success"; - } - if ( self isempjammed() ) - { - return "fail"; - } - if ( self isinteractingwithobject() ) - { - return "fail"; - } - self thread maps/mp/gametypes/_hud::fadetoblackforxsec( 0, 0,2, 0,4, 0,25 ); - self thread watchforemoveremoteweapon(); - blackoutwait = self waittill_any_timeout( 0,6, "disconnect", "death" ); - self notify( "endWatchFoRemoveRemoteWeapon" ); - maps/mp/gametypes/_hostmigration::waittillhostmigrationdone(); - if ( blackoutwait != "disconnect" ) - { - self thread clearrideintro( 1 ); - if ( self.team == "spectator" ) - { - return "fail"; - } - } - if ( self isonladder() ) - { - return "fail"; - } - if ( !isalive( self ) ) - { - return "fail"; - } - if ( self isempjammed() ) - { - return "fail"; - } - if ( self isinteractingwithobject() ) - { - return "fail"; - } - if ( blackoutwait == "disconnect" ) - { - return "disconnect"; - } - else - { - return "success"; - } + if ( isdefined( streak ) && ( streak == "qrdrone" || streak == "killstreak_remote_turret_mp" || streak == "killstreak_ai_tank_mp" || streak == "qrdrone_mp" ) ) + laptopwait = "timeout"; + else + laptopwait = self waittill_any_timeout( 0.6, "disconnect", "death", "weapon_switch_started" ); + + maps\mp\gametypes\_hostmigration::waittillhostmigrationdone(); + + if ( laptopwait == "weapon_switch_started" ) + return "fail"; + + if ( !isalive( self ) ) + return "fail"; + + if ( laptopwait == "disconnect" || laptopwait == "death" ) + { + if ( laptopwait == "disconnect" ) + return "disconnect"; + + if ( self.team == "spectator" ) + return "fail"; + + return "success"; + } + + if ( self isempjammed() ) + return "fail"; + + if ( self isinteractingwithobject() ) + return "fail"; + + self thread maps\mp\gametypes\_hud::fadetoblackforxsec( 0, 0.2, 0.4, 0.25 ); + self thread watchforemoveremoteweapon(); + blackoutwait = self waittill_any_timeout( 0.6, "disconnect", "death" ); + self notify( "endWatchFoRemoveRemoteWeapon" ); + maps\mp\gametypes\_hostmigration::waittillhostmigrationdone(); + + if ( blackoutwait != "disconnect" ) + { + self thread clearrideintro( 1.0 ); + + if ( self.team == "spectator" ) + return "fail"; + } + + if ( self isonladder() ) + return "fail"; + + if ( !isalive( self ) ) + return "fail"; + + if ( self isempjammed() ) + return "fail"; + + if ( self isinteractingwithobject() ) + return "fail"; + + if ( blackoutwait == "disconnect" ) + return "disconnect"; + else + return "success"; } clearrideintro( delay ) { - self endon( "disconnect" ); - if ( isDefined( delay ) ) - { - wait delay; - } - self thread maps/mp/gametypes/_hud::fadetoblackforxsec( 0, 0, 0, 0 ); + self endon( "disconnect" ); + + if ( isdefined( delay ) ) + wait( delay ); + + self thread maps\mp\gametypes\_hud::fadetoblackforxsec( 0, 0, 0, 0 ); } killstreak_debug_think() { /# - setdvar( "debug_killstreak", "" ); - for ( ;; ) - { - cmd = getDvar( "debug_killstreak" ); - switch( cmd ) - { - case "data_dump": - killstreak_data_dump(); - break; - } - if ( cmd != "" ) - { - setdvar( "debug_killstreak", "" ); - } - wait 0,5; + setdvar( "debug_killstreak", "" ); + + for (;;) + { + cmd = getdvar( "debug_killstreak" ); + + switch ( cmd ) + { + case "data_dump": + killstreak_data_dump(); + break; + } + + if ( cmd != "" ) + setdvar( "debug_killstreak", "" ); + + wait 0.5; + } #/ - } } killstreak_data_dump() { /# - iprintln( "Killstreak Data Sent to Console" ); - println( "##### Killstreak Data #####" ); - println( "killstreak,killstreaklevel,weapon,altweapon1,altweapon2,altweapon3,altweapon4,type1,type2,type3,type4" ); - keys = getarraykeys( level.killstreaks ); - i = 0; - while ( i < keys.size ) - { - data = level.killstreaks[ keys[ i ] ]; - type_data = level.killstreaktype[ keys[ i ] ]; - print( keys[ i ] + "," ); - print( data.killstreaklevel + "," ); - print( data.weapon + "," ); - alt = 0; - while ( isDefined( data.altweapons ) ) - { - assert( data.altweapons.size <= 4 ); - alt = 0; - while ( alt < data.altweapons.size ) - { - print( data.altweapons[ alt ] + "," ); - alt++; - } - } - while ( alt < 4 ) - { - print( "," ); - alt++; - } - type = 0; - while ( isDefined( type_data ) ) - { - assert( type_data.size < 4 ); - type_keys = getarraykeys( type_data ); - while ( type < type_keys.size ) - { - if ( type_data[ type_keys[ type ] ] == 1 ) - { - print( type_keys[ type ] + "," ); - } - type++; - } - } - while ( type < 4 ) - { - print( "," ); - type++; - } - println( "" ); - i++; - } - println( "##### End Killstreak Data #####" ); + iprintln( "Killstreak Data Sent to Console" ); + println( "##### Killstreak Data #####" ); + println( "killstreak,killstreaklevel,weapon,altweapon1,altweapon2,altweapon3,altweapon4,type1,type2,type3,type4" ); + keys = getarraykeys( level.killstreaks ); + + for ( i = 0; i < keys.size; i++ ) + { + data = level.killstreaks[keys[i]]; + type_data = level.killstreaktype[keys[i]]; + print( keys[i] + "," ); + print( data.killstreaklevel + "," ); + print( data.weapon + "," ); + alt = 0; + + if ( isdefined( data.altweapons ) ) + { +/# + assert( data.altweapons.size <= 4 ); +#/ + for ( alt = 0; alt < data.altweapons.size; alt++ ) + print( data.altweapons[alt] + "," ); + } + + while ( alt < 4 ) + { + print( "," ); + alt++; + } + + type = 0; + + if ( isdefined( type_data ) ) + { +/# + assert( type_data.size < 4 ); +#/ + type_keys = getarraykeys( type_data ); + + while ( type < type_keys.size ) + { + if ( type_data[type_keys[type]] == 1 ) + print( type_keys[type] + "," ); + + type++; + } + } + + while ( type < 4 ) + { + print( "," ); + type++; + } + + println( "" ); + } + + println( "##### End Killstreak Data #####" ); #/ } isinteractingwithobject() { - if ( self iscarryingturret() ) - { - return 1; - } - if ( is_true( self.isplanting ) ) - { - return 1; - } - if ( is_true( self.isdefusing ) ) - { - return 1; - } - return 0; + if ( self iscarryingturret() ) + return true; + + if ( is_true( self.isplanting ) ) + return true; + + if ( is_true( self.isdefusing ) ) + return true; + + return false; } clearusingremote() { - if ( !isDefined( self ) ) - { - return; - } - if ( isDefined( self.carryicon ) ) - { - self.carryicon.alpha = 1; - } - self.usingremote = undefined; - self enableoffhandweapons(); - curweapon = self getcurrentweapon(); - if ( isalive( self ) ) - { - if ( curweapon == "none" || maps/mp/killstreaks/_killstreaks::iskillstreakweapon( curweapon ) ) - { - last_weapon = self getlastweapon(); - if ( isDefined( last_weapon ) ) - { - self switchtoweapon( last_weapon ); - } - } - } - self freezecontrolswrapper( 0 ); - self notify( "stopped_using_remote" ); + if ( !isdefined( self ) ) + return; + + if ( isdefined( self.carryicon ) ) + self.carryicon.alpha = 1; + + self.usingremote = undefined; + self enableoffhandweapons(); + curweapon = self getcurrentweapon(); + + if ( isalive( self ) ) + { + if ( curweapon == "none" || maps\mp\killstreaks\_killstreaks::iskillstreakweapon( curweapon ) ) + { + last_weapon = self getlastweapon(); + + if ( isdefined( last_weapon ) ) + self switchtoweapon( last_weapon ); + } + } + + self freezecontrolswrapper( 0 ); + self notify( "stopped_using_remote" ); } diff --git a/Multiplayer Core/patch_mp/maps/mp/killstreaks/_missile_drone.gsc b/Multiplayer Core/patch_mp/maps/mp/killstreaks/_missile_drone.gsc index c955031..3474b46 100644 --- a/Multiplayer Core/patch_mp/maps/mp/killstreaks/_missile_drone.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/killstreaks/_missile_drone.gsc @@ -1,694 +1,657 @@ -#include maps/mp/_challenges; -#include maps/mp/_scoreevents; -#include maps/mp/killstreaks/_dogs; -#include maps/mp/killstreaks/_missile_swarm; -#include maps/mp/_popups; -#include maps/mp/killstreaks/_killstreakrules; -#include maps/mp/killstreaks/_airsupport; -#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\_airsupport; +#include maps\mp\killstreaks\_killstreakrules; +#include maps\mp\_popups; +#include maps\mp\killstreaks\_missile_swarm; +#include maps\mp\killstreaks\_dogs; +#include maps\mp\_scoreevents; +#include maps\mp\_challenges; -#using_animtree( "mp_missile_drone" ); +#using_animtree("mp_missile_drone"); init() { - registerclientfield( "toplayer", "missile_drone_active", 1, 2, "int" ); - registerclientfield( "missile", "missile_drone_projectile_active", 1, 1, "int" ); - registerclientfield( "missile", "missile_drone_projectile_animate", 1, 1, "int" ); - level.missile_drone_flyheight = 2400; - level.missile_drone_anim = %o_drone_hunter_launch; - precacheitem( "missile_drone_projectile_mp" ); - loadfx( "weapon/missile/fx_missile_drone_light_red" ); - registerkillstreak( "inventory_missile_drone_mp", "inventory_missile_drone_mp", "killstreak_missile_drone", "missile_drone_used", ::missile_drone_killstreak, 1 ); - registerkillstreakstrings( "inventory_missile_drone_mp", &"KILLSTREAK_EARNED_MISSILE_DRONE", &"KILLSTREAK_MISSILE_DRONE_NOT_AVAILABLE", &"KILLSTREAK_MISSILE_DRONE_INBOUND" ); - registerkillstreakdialog( "inventory_missile_drone_mp", "mpl_killstreak_missile_drone", "kls_hkdrone_used", "", "kls_hkdrone_enemy", "", "kls_hkdrone_ready" ); - registerkillstreakdevdvar( "inventory_missile_drone_mp", "scr_givemissiledrone" ); - registerkillstreak( "missile_drone_mp", "missile_drone_mp", "killstreak_missile_drone", "missile_drone_used", ::missile_drone_killstreak, 1 ); - registerkillstreakaltweapon( "missile_drone_mp", "missile_drone_projectile_mp" ); - registerkillstreakaltweapon( "inventory_missile_drone_mp", "missile_drone_projectile_mp" ); - registerkillstreakstrings( "missile_drone_mp", &"KILLSTREAK_EARNED_MISSILE_DRONE", &"KILLSTREAK_MISSILE_DRONE_NOT_AVAILABLE", &"KILLSTREAK_MISSILE_DRONE_INBOUND" ); - registerkillstreakdialog( "missile_drone_mp", "mpl_killstreak_missile_drone", "kls_hkdrone_used", "", "kls_hkdrone_enemy", "", "kls_hkdrone_ready" ); - setkillstreakteamkillpenaltyscale( "missile_drone_mp", 0 ); + registerclientfield( "toplayer", "missile_drone_active", 1, 2, "int" ); + registerclientfield( "missile", "missile_drone_projectile_active", 1, 1, "int" ); + registerclientfield( "missile", "missile_drone_projectile_animate", 1, 1, "int" ); + level.missile_drone_flyheight = 2400; + level.missile_drone_anim = %o_drone_hunter_launch; + precacheitem( "missile_drone_projectile_mp" ); + loadfx( "weapon/missile/fx_missile_drone_light_red" ); + registerkillstreak( "inventory_missile_drone_mp", "inventory_missile_drone_mp", "killstreak_missile_drone", "missile_drone_used", ::missile_drone_killstreak, 1 ); + registerkillstreakstrings( "inventory_missile_drone_mp", &"KILLSTREAK_EARNED_MISSILE_DRONE", &"KILLSTREAK_MISSILE_DRONE_NOT_AVAILABLE", &"KILLSTREAK_MISSILE_DRONE_INBOUND" ); + registerkillstreakdialog( "inventory_missile_drone_mp", "mpl_killstreak_missile_drone", "kls_hkdrone_used", "", "kls_hkdrone_enemy", "", "kls_hkdrone_ready" ); + registerkillstreakdevdvar( "inventory_missile_drone_mp", "scr_givemissiledrone" ); + registerkillstreak( "missile_drone_mp", "missile_drone_mp", "killstreak_missile_drone", "missile_drone_used", ::missile_drone_killstreak, 1 ); + registerkillstreakaltweapon( "missile_drone_mp", "missile_drone_projectile_mp" ); + registerkillstreakaltweapon( "inventory_missile_drone_mp", "missile_drone_projectile_mp" ); + registerkillstreakstrings( "missile_drone_mp", &"KILLSTREAK_EARNED_MISSILE_DRONE", &"KILLSTREAK_MISSILE_DRONE_NOT_AVAILABLE", &"KILLSTREAK_MISSILE_DRONE_INBOUND" ); + registerkillstreakdialog( "missile_drone_mp", "mpl_killstreak_missile_drone", "kls_hkdrone_used", "", "kls_hkdrone_enemy", "", "kls_hkdrone_ready" ); + setkillstreakteamkillpenaltyscale( "missile_drone_mp", 0.0 ); } missile_drone_killstreak( weaponname ) { /# - if ( weaponname != "missile_drone_mp" ) - { - assert( weaponname == "inventory_missile_drone_mp" ); - } + assert( weaponname == "missile_drone_mp" || weaponname == "inventory_missile_drone_mp" ); #/ - level.missile_drone_origin = level.mapcenter + ( 0, 0, level.missile_drone_flyheight ); - hardpointtype = "missile_drone_mp"; - result = usemissiledrone( hardpointtype ); - if ( !isDefined( result ) || !result ) - { - return 0; - } - return result; + level.missile_drone_origin = level.mapcenter + ( 0, 0, level.missile_drone_flyheight ); + hardpointtype = "missile_drone_mp"; + result = usemissiledrone( hardpointtype ); + + if ( !isdefined( result ) || !result ) + return 0; + + return result; } usemissiledrone( hardpointtype ) { - if ( self maps/mp/killstreaks/_killstreakrules::iskillstreakallowed( hardpointtype, self.team ) == 0 ) - { - return 0; - } - self thread missiledronewatcher( hardpointtype ); - missileweapon = self getcurrentweapon(); - missileweapon = undefined; - currentweapon = self getcurrentweapon(); - if ( ismissiledroneweapon( currentweapon ) ) - { - missileweapon = currentweapon; - } + if ( self maps\mp\killstreaks\_killstreakrules::iskillstreakallowed( hardpointtype, self.team ) == 0 ) + return false; + + self thread missiledronewatcher( hardpointtype ); + missileweapon = self getcurrentweapon(); + missileweapon = undefined; + currentweapon = self getcurrentweapon(); + + if ( ismissiledroneweapon( currentweapon ) ) + missileweapon = currentweapon; /# - assert( isDefined( missileweapon ) ); + assert( isdefined( missileweapon ) ); #/ - notifystring = self waittill_any_return( "weapon_change", "grenade_fire", "death" ); - if ( notifystring == "weapon_change" || notifystring == "death" ) - { - return 0; - } - notifystring = self waittill_any_return( "weapon_change", "death" ); - if ( notifystring == "death" ) - { - return 1; - } - if ( !isDefined( missileweapon ) ) - { - return 0; - } - self takeweapon( missileweapon ); - if ( self hasweapon( missileweapon ) || self getammocount( missileweapon ) ) - { - return 0; - } - return 1; + notifystring = self waittill_any_return( "weapon_change", "grenade_fire", "death" ); + + if ( notifystring == "weapon_change" || notifystring == "death" ) + return false; + + notifystring = self waittill_any_return( "weapon_change", "death" ); + + if ( notifystring == "death" ) + return true; + + if ( !isdefined( missileweapon ) ) + return false; + + self takeweapon( missileweapon ); + + if ( self hasweapon( missileweapon ) || self getammocount( missileweapon ) ) + return false; + + return true; } ismissiledroneweapon( weapon ) { - if ( weapon == "missile_drone_mp" || weapon == "inventory_missile_drone_mp" ) - { - return 1; - } - return 0; + if ( weapon == "missile_drone_mp" || weapon == "inventory_missile_drone_mp" ) + return true; + + return false; } missiledronewatcher( hardpointtype ) { - self notify( "missileDroneWatcher" ); - self endon( "missileDroneWatcher" ); - self endon( "spawned_player" ); - self endon( "disconnect" ); - self endon( "weapon_change" ); - self endon( "death" ); - team = self.team; - killstreak_id = maps/mp/killstreaks/_killstreakrules::killstreakstart( hardpointtype, team, 0, 0 ); - if ( killstreak_id == -1 ) - { - self maps/mp/killstreaks/_killstreaks::switchtolastnonkillstreakweapon(); - return; - } - self thread checkforemp(); - self thread checkweaponchange( hardpointtype, team, killstreak_id ); - self thread watchownerdeath( hardpointtype, team, killstreak_id ); - self thread updatetargetting(); - self waittill( "grenade_fire", grenade, weapname ); - origin = grenade.origin; - self notify( "missile_drone_active" ); - level thread maps/mp/_popups::displaykillstreakteammessagetoall( hardpointtype, self ); - self maps/mp/killstreaks/_killstreaks::playkillstreakstartdialog( hardpointtype, self.team, 1 ); - level.globalkillstreakscalled++; - self addweaponstat( "missile_drone_mp", "used", 1 ); - self setclientfieldtoplayer( "missile_drone_active", 0 ); - grenade thread waitthendelete( 0,05 ); - grenade.origin += vectorScale( ( 0, 0, 1 ), 1000 ); - self thread domissiledrone( origin, weapname, killstreak_id, hardpointtype, team ); - self maps/mp/killstreaks/_killstreaks::switchtolastnonkillstreakweapon(); + self notify( "missileDroneWatcher" ); + self endon( "missileDroneWatcher" ); + self endon( "spawned_player" ); + self endon( "disconnect" ); + self endon( "weapon_change" ); + self endon( "death" ); + team = self.team; + killstreak_id = maps\mp\killstreaks\_killstreakrules::killstreakstart( hardpointtype, team, 0, 0 ); + + if ( killstreak_id == -1 ) + { + self maps\mp\killstreaks\_killstreaks::switchtolastnonkillstreakweapon(); + return; + } + + self thread checkforemp(); + self thread checkweaponchange( hardpointtype, team, killstreak_id ); + self thread watchownerdeath( hardpointtype, team, killstreak_id ); + self thread updatetargetting(); + + self waittill( "grenade_fire", grenade, weapname ); + + origin = grenade.origin; + self notify( "missile_drone_active" ); + level thread maps\mp\_popups::displaykillstreakteammessagetoall( hardpointtype, self ); + self maps\mp\killstreaks\_killstreaks::playkillstreakstartdialog( hardpointtype, self.team, 1 ); + level.globalkillstreakscalled++; + self addweaponstat( "missile_drone_mp", "used", 1 ); + self setclientfieldtoplayer( "missile_drone_active", 0 ); + grenade thread waitthendelete( 0.05 ); + grenade.origin += vectorscale( ( 0, 0, 1 ), 1000.0 ); + self thread domissiledrone( origin, weapname, killstreak_id, hardpointtype, team ); + self maps\mp\killstreaks\_killstreaks::switchtolastnonkillstreakweapon(); } domissiledrone( origin, weapname, killstreak_id, hardpointtype, team ) { - direction = self getplayerangles(); - forward = anglesToForward( direction ); - target = origin + vectorScale( forward, 10000 ); - debug_line( origin, target, ( 0,9, 0,1, 0,1 ) ); - projectile = maps/mp/killstreaks/_missile_swarm::projectile_spawn_utility( self, target, origin, "missile_drone_projectile_mp", "drone_missile", 0 ); - projectile missile_dronesetvisible( 1 ); - projectile.originaltarget = target; - projectile thread maps/mp/killstreaks/_missile_swarm::projectile_abort_think(); - projectile thread drone_target_search( hardpointtype ); - projectile thread projectile_death_think(); - projectile thread watchdamage(); - projectile.targetname = "remote_drone"; - projectile playsound( "wpn_hunter_ignite" ); - projectile thread killstreak_stop_think( killstreak_id, hardpointtype, team ); - projectile setclientfield( "missile_drone_projectile_animate", 1 ); + direction = self getplayerangles(); + forward = anglestoforward( direction ); + target = origin + vectorscale( forward, 10000 ); + debug_line( origin, target, ( 0.9, 0.1, 0.1 ) ); + projectile = maps\mp\killstreaks\_missile_swarm::projectile_spawn_utility( self, target, origin, "missile_drone_projectile_mp", "drone_missile", 0 ); + projectile missile_dronesetvisible( 1 ); + projectile.originaltarget = target; + projectile thread maps\mp\killstreaks\_missile_swarm::projectile_abort_think(); + projectile thread drone_target_search( hardpointtype ); + projectile thread projectile_death_think(); + projectile thread watchdamage(); + projectile.targetname = "remote_drone"; + projectile playsound( "wpn_hunter_ignite" ); + projectile thread killstreak_stop_think( killstreak_id, hardpointtype, team ); + projectile setclientfield( "missile_drone_projectile_animate", 1 ); } waitthendelete( waittime ) { - self endon( "delete" ); - self endon( "death" ); - wait waittime; - self delete(); + self endon( "delete" ); + self endon( "death" ); + wait( waittime ); + self delete(); } projectile_death_think() { - self waittill( "death" ); - self.goal delete(); + self waittill( "death" ); + + self.goal delete(); } drone_target_acquired( hardpointtype, target ) { - self endon( "death" ); - self notify( "drone_target_acquired" ); - self setclientfield( "missile_drone_projectile_active", 1 ); - self set_drone_target( hardpointtype, target ); + self endon( "death" ); + self notify( "drone_target_acquired" ); + self setclientfield( "missile_drone_projectile_active", 1 ); + self set_drone_target( hardpointtype, target ); } drone_target_search( hardpointtype ) { - self endon( "death" ); - if ( isDefined( self.dronetarget ) ) - { - self drone_target_acquired( hardpointtype, self.dronetarget ); - self missile_settarget( self.goal ); - } - self setclientfield( "missile_drone_projectile_active", 0 ); - searchdotprodminimums = []; - searchdotprodminimums[ 0 ] = 0,9; - searchdotprodminimums[ 1 ] = 0,7071; - searchdotprodminimums[ 2 ] = 0,5; - searchdotprodminimums[ 3 ] = 0; - wait 0,1; - searchcounter = 0; - for ( ;; ) - { - if ( !isDefined( self ) ) - { - self notify( "death" ); - } - target = self projectile_find_target( self.owner, searchdotprodminimums[ searchcounter ] ); - if ( searchcounter < ( searchdotprodminimums.size - 1 ) ) - { - searchcounter++; - } - else if ( level.missile_drone_origin[ 2 ] != self.goal.origin[ 2 ] ) - { - currentangles = self.angles; - direction = vectornormalize( anglesToForward( self.angles ) ); - direction = vecscale( direction, 1024 ); - self.goal.origin = ( self.origin[ 0 ] + direction[ 0 ], self.origin[ 1 ] + direction[ 1 ], level.missile_drone_origin[ 2 ] ); + self endon( "death" ); + + if ( isdefined( self.dronetarget ) ) + { + self drone_target_acquired( hardpointtype, self.dronetarget ); + self missile_settarget( self.goal ); + } + + self setclientfield( "missile_drone_projectile_active", 0 ); + searchdotprodminimums = []; + searchdotprodminimums[0] = 0.9; + searchdotprodminimums[1] = 0.7071; + searchdotprodminimums[2] = 0.5; + searchdotprodminimums[3] = 0; + wait 0.1; + searchcounter = 0; + + for (;;) + { + if ( !isdefined( self ) ) + self notify( "death" ); + + target = self projectile_find_target( self.owner, searchdotprodminimums[searchcounter] ); + + if ( searchcounter < searchdotprodminimums.size - 1 ) + searchcounter++; + else if ( level.missile_drone_origin[2] != self.goal.origin[2] ) + { + currentangles = self.angles; + direction = vectornormalize( anglestoforward( self.angles ) ); + direction = vecscale( direction, 1024 ); + self.goal.origin = ( self.origin[0] + direction[0], self.origin[1] + direction[1], level.missile_drone_origin[2] ); /# - debug_line( self.origin, self.goal.origin, ( 0, 0, 1 ), 5000 ); + debug_line( self.origin, self.goal.origin, ( 1, 1, 0 ), 5000 ); #/ - } - else - { - currentangles = self.angles; - direction = vectornormalize( anglesToForward( self.angles ) ); - direction = vecscale( direction, 1024 ); - self.goal.origin = ( level.missile_drone_origin[ 0 ] + direction[ 0 ], level.missile_drone_origin[ 1 ] + direction[ 1 ], level.missile_drone_origin[ 2 ] ); + } + else + { + currentangles = self.angles; + direction = vectornormalize( anglestoforward( self.angles ) ); + direction = vecscale( direction, 1024 ); + self.goal.origin = ( level.missile_drone_origin[0] + direction[0], level.missile_drone_origin[1] + direction[1], level.missile_drone_origin[2] ); /# - debug_line( self.origin, self.goal.origin, ( 0, 1, 1 ), 5000 ); + debug_line( self.origin, self.goal.origin, ( 0, 1, 1 ), 5000 ); #/ - } - if ( isDefined( target ) ) - { - self set_drone_target( hardpointtype, target ); - self missile_settarget( self.goal ); - } - wait 0,25; - } + } + + if ( isdefined( target ) ) + { + self set_drone_target( hardpointtype, target ); + self missile_settarget( self.goal ); + } + + wait 0.25; + } } vecscale( vec, scalar ) { - return ( vec[ 0 ] * scalar, vec[ 1 ] * scalar, vec[ 2 ] * scalar ); + return ( vec[0] * scalar, vec[1] * scalar, vec[2] * scalar ); } set_drone_target( hardpointtype, target ) { - self endon( "target_lost" ); - self thread check_target_lost( target ); - self.swarm_target = target[ "entity" ]; - target[ "entity" ].swarm = self; - debug_line( self.origin, target[ "entity" ].origin, ( 0, 0, 1 ), 5000 ); - self missile_settarget( target[ "entity" ], target[ "offset" ] ); - self playsound( "veh_harpy_drone_swarm_incomming" ); - if ( !isDefined( target[ "entity" ].swarmsound ) || target[ "entity" ].swarmsound == 0 ) - { - self thread target_sounds( target[ "entity" ] ); - } - target[ "entity" ] notify( "stinger_fired_at_me" ); - self setclientfield( "missile_drone_projectile_active", 1 ); - target[ "entity" ] waittill_any( "death", "disconnect", "joined_team" ); - self setclientfield( "missile_drone_projectile_active", 0 ); - self missile_settarget( self.goal ); + self endon( "target_lost" ); + self thread check_target_lost( target ); + self.swarm_target = target["entity"]; + target["entity"].swarm = self; + debug_line( self.origin, target["entity"].origin, ( 0, 0, 0 ), 5000 ); + self missile_settarget( target["entity"], target["offset"] ); + self playsound( "veh_harpy_drone_swarm_incomming" ); + + if ( !isdefined( target["entity"].swarmsound ) || target["entity"].swarmsound == 0 ) + self thread target_sounds( target["entity"] ); + + target["entity"] notify( "stinger_fired_at_me", self, hardpointtype, self.owner ); + self setclientfield( "missile_drone_projectile_active", 1 ); + target["entity"] waittill_any( "death", "disconnect", "joined_team" ); + self setclientfield( "missile_drone_projectile_active", 0 ); + self missile_settarget( self.goal ); } check_target_lost( target ) { - self endon( "death" ); - target[ "entity" ] endon( "death" ); - target[ "entity" ] endon( "disconnect" ); - target[ "entity" ] endon( "joined_team" ); - failurelimit = 3; - failurecount = 0; - for ( ;; ) - { + self endon( "death" ); + target["entity"] endon( "death" ); + target["entity"] endon( "disconnect" ); + target["entity"] endon( "joined_team" ); + failurelimit = 3; + failurecount = 0; + + for (;;) + { /# - debug_star( target[ "entity" ].origin, ( 0, 0, 1 ), 1000 ); - debug_star( self.origin, ( 0, 0, 1 ), 1000 ); + debug_star( target["entity"].origin, ( 0, 1, 0 ), 1000 ); + debug_star( self.origin, ( 0, 1, 0 ), 1000 ); #/ - if ( bullettracepassed( self.origin, target[ "entity" ].origin + target[ "offset" ], 0, target[ "entity" ] ) ) - { + if ( bullettracepassed( self.origin, target["entity"].origin + target["offset"], 0, target["entity"] ) ) + { /# - debug_line( self.origin, target[ "entity" ].origin, ( 0, 0, 1 ), 1000 ); + debug_line( self.origin, target["entity"].origin, ( 0, 1, 0 ), 1000 ); #/ - failurecount = 0; - } - else - { - failurecount++; - if ( failurecount >= failurelimit ) - { - self notify( "target_lost" ); - return; - } - } - wait 0,25; - } + failurecount = 0; + } + else + { + failurecount++; + + if ( failurecount >= failurelimit ) + { + self notify( "target_lost" ); + return; + } + } + + wait 0.25; + } } projectile_find_target( owner, mincos ) { - ks = self projectile_find_target_killstreak( owner, mincos ); - player = self projectile_find_target_player( owner, mincos ); - if ( isDefined( ks ) && !isDefined( player ) ) - { - return ks; - } - else - { - if ( !isDefined( ks ) && isDefined( player ) ) - { - return player; - } - else - { - if ( isDefined( ks ) && isDefined( player ) ) - { - if ( player[ "dotprod" ] < ks[ "dotprod" ] ) - { - return ks; - } - return player; - } - } - } - return undefined; + ks = self projectile_find_target_killstreak( owner, mincos ); + player = self projectile_find_target_player( owner, mincos ); + + if ( isdefined( ks ) && !isdefined( player ) ) + return ks; + else if ( !isdefined( ks ) && isdefined( player ) ) + return player; + else if ( isdefined( ks ) && isdefined( player ) ) + { + if ( player["dotprod"] < ks["dotprod"] ) + return ks; + + return player; + } + + return undefined; } projectile_find_target_killstreak( owner, mincos ) { - ks = []; - ks[ "offset" ] = vectorScale( ( 0, 0, 1 ), 10 ); - targets = target_getarray(); - rcbombs = getentarray( "rcbomb", "targetname" ); - dogs = maps/mp/killstreaks/_dogs::dog_manager_get_dogs(); - targets = arraycombine( targets, rcbombs, 1, 0 ); - targets = arraycombine( targets, dogs, 1, 0 ); - if ( targets.size <= 0 ) - { - return undefined; - } - targets = get_array_sorted_dot_prod( targets, mincos ); - _a389 = targets; - _k389 = getFirstArrayKey( _a389 ); - while ( isDefined( _k389 ) ) - { - target = _a389[ _k389 ]; - if ( isDefined( target.owner ) && target.owner == owner ) - { - } - else - { - if ( isDefined( target.script_owner ) && target.script_owner == owner ) - { - break; - } - else - { - if ( level.teambased && isDefined( target.team ) ) - { - if ( target.team == self.team ) - { - break; - } - } - else if ( level.teambased && isDefined( target.aiteam ) ) - { - if ( target.aiteam == self.team ) - { - break; - } - } - else if ( isDefined( target.vehicletype ) && target.vehicletype == "heli_supplydrop_mp" ) - { - break; - } - else - { - if ( bullettracepassed( self.origin, target.origin, 0, target ) ) - { - ks[ "entity" ] = target; - if ( isDefined( target.sorteddotprod ) ) - { - ks[ "dotprod" ] = target.sorteddotprod; - } - else - { - ks[ "dotprod" ] = -1; - } - return ks; - } - } - } - } - _k389 = getNextArrayKey( _a389, _k389 ); - } - return undefined; + ks = []; + ks["offset"] = vectorscale( ( 0, 0, -1 ), 10.0 ); + targets = target_getarray(); + rcbombs = getentarray( "rcbomb", "targetname" ); + dogs = maps\mp\killstreaks\_dogs::dog_manager_get_dogs(); + targets = arraycombine( targets, rcbombs, 1, 0 ); + targets = arraycombine( targets, dogs, 1, 0 ); + + if ( targets.size <= 0 ) + return undefined; + + targets = get_array_sorted_dot_prod( targets, mincos ); + + foreach ( target in targets ) + { + if ( isdefined( target.owner ) && target.owner == owner ) + continue; + + if ( isdefined( target.script_owner ) && target.script_owner == owner ) + continue; + + if ( level.teambased && isdefined( target.team ) ) + { + if ( target.team == self.team ) + continue; + } + + if ( level.teambased && isdefined( target.aiteam ) ) + { + if ( target.aiteam == self.team ) + continue; + } + + if ( isdefined( target.vehicletype ) && target.vehicletype == "heli_supplydrop_mp" ) + continue; + + if ( bullettracepassed( self.origin, target.origin, 0, target ) ) + { + ks["entity"] = target; + + if ( isdefined( target.sorteddotprod ) ) + ks["dotprod"] = target.sorteddotprod; + else + ks["dotprod"] = -1; + + return ks; + } + } + + return undefined; } projectile_find_target_player( owner, mincos ) { - target = []; - players = self get_array_sorted_dot_prod( get_players(), mincos ); - if ( isplayer( self ) ) - { - startoffset = self getplayerviewheight(); - startorigin = ( self.origin[ 0 ], self.origin[ 1 ], self.origin[ 2 ] + startoffset ); - startangles = self getplayerangles(); + target = []; + players = self get_array_sorted_dot_prod( get_players(), mincos ); + + if ( isplayer( self ) ) + { + startoffset = self getplayerviewheight(); + startorigin = ( self.origin[0], self.origin[1], self.origin[2] + startoffset ); + startangles = self getplayerangles(); /# - debug_star( startorigin, ( 0, 0, 1 ), 1000 ); + debug_star( startorigin, ( 0, 0, 1 ), 1000 ); #/ - } - else - { - startorigin = self.origin; - startangles = self.angles; - } - bestplayerrating = -1; - _a470 = players; - _k470 = getFirstArrayKey( _a470 ); - while ( isDefined( _k470 ) ) - { - player = _a470[ _k470 ]; - if ( !player_valid_target( player, owner.team, owner ) ) - { - } - else - { - currentplayeroffset = undefined; - currentplayerdotprod = undefined; - currentplayerrating = 0; + } + else + { + startorigin = self.origin; + startangles = self.angles; + } + + bestplayerrating = -1; + + foreach ( player in players ) + { + if ( !player_valid_target( player, owner.team, owner ) ) + continue; + + currentplayeroffset = undefined; + currentplayerdotprod = undefined; + currentplayerrating = 0; /# - debug_star( player.origin, ( 0, 0, 1 ), 1000 ); + debug_star( player.origin, ( 1, 1, 1 ), 1000 ); #/ - if ( bullettracepassed( startorigin, player.origin, 0, player ) ) - { + if ( bullettracepassed( startorigin, player.origin, 0, player ) ) + { /# - debug_line( startorigin, player.origin, ( 0, 0, 1 ), 1000 ); + debug_line( startorigin, player.origin, ( 1, 1, 1 ), 1000 ); #/ - if ( !isDefined( currentplayeroffset ) ) - { - currentplayeroffset = ( 0, 0, 1 ); - } - currentplayerrating += 4; - } - verticaloffset = player getplayerviewheight(); - playerheadoffset = ( 0, 0, verticaloffset ); + if ( !isdefined( currentplayeroffset ) ) + currentplayeroffset = ( 0, 0, 0 ); + + currentplayerrating += 4; + } + + verticaloffset = player getplayerviewheight(); + playerheadoffset = ( 0, 0, verticaloffset ); /# - debug_star( player.origin + playerheadoffset, ( 0, 0, 1 ), 1000 ); + debug_star( player.origin + playerheadoffset, ( 1, 0, 0 ), 1000 ); #/ - if ( bullettracepassed( startorigin, player.origin + playerheadoffset, 0, player ) ) - { + if ( bullettracepassed( startorigin, player.origin + playerheadoffset, 0, player ) ) + { /# - debug_line( startorigin, player.origin + playerheadoffset, ( 0, 0, 1 ), 1000 ); + debug_line( startorigin, player.origin + playerheadoffset, ( 1, 0, 0 ), 1000 ); #/ - if ( !isDefined( currentplayeroffset ) ) - { - currentplayeroffset = playerheadoffset; - } - currentplayerrating += 3; - } - end = player.origin + playerheadoffset + vectorScale( ( 0, 0, 1 ), 96 ); + if ( !isdefined( currentplayeroffset ) ) + currentplayeroffset = playerheadoffset; + + currentplayerrating += 3; + } + + end = player.origin + playerheadoffset + vectorscale( ( 0, 0, 1 ), 96.0 ); /# - debug_star( end, ( 0, 0, 1 ), 1000 ); + debug_star( end, ( 1, 1, 0 ), 1000 ); #/ - if ( bullettracepassed( player.origin + playerheadoffset, end, 0, player ) ) - { + if ( bullettracepassed( player.origin + playerheadoffset, end, 0, player ) ) + { /# - debug_line( player.origin + playerheadoffset, end, ( 0, 0, 1 ), 1000 ); + debug_line( player.origin + playerheadoffset, end, ( 1, 1, 0 ), 1000 ); #/ - if ( !isDefined( currentplayeroffset ) ) - { - currentplayeroffset = vectorScale( ( 0, 0, 1 ), 30 ); - } - currentplayerrating += 2; - } - if ( currentplayerrating > bestplayerrating ) - { - bestplayerrating = currentplayerrating; - target[ "entity" ] = player; - target[ "offset" ] = currentplayeroffset; - if ( isDefined( player.sorteddotprod ) ) - { - target[ "dotprod" ] = player.sorteddotprod; - } - else - { - target[ "dotprod" ] = -1; - } - if ( bestplayerrating >= 9 ) - { - return target; - } - } - } - _k470 = getNextArrayKey( _a470, _k470 ); - } - if ( bestplayerrating >= 3 ) - { - return target; - } - return undefined; + if ( !isdefined( currentplayeroffset ) ) + currentplayeroffset = vectorscale( ( 0, 0, 1 ), 30.0 ); + + currentplayerrating += 2; + } + + if ( currentplayerrating > bestplayerrating ) + { + bestplayerrating = currentplayerrating; + target["entity"] = player; + target["offset"] = currentplayeroffset; + + if ( isdefined( player.sorteddotprod ) ) + target["dotprod"] = player.sorteddotprod; + else + target["dotprod"] = -1; + + if ( bestplayerrating >= 9 ) + return target; + } + } + + if ( bestplayerrating >= 3 ) + return target; + + return undefined; } killstreak_stop_think( killstreak_id, hardpointtype, team ) { - self waittill( "death" ); - maps/mp/killstreaks/_killstreakrules::killstreakstop( hardpointtype, team, killstreak_id ); + self waittill( "death" ); + + maps\mp\killstreaks\_killstreakrules::killstreakstop( hardpointtype, team, killstreak_id ); } checkweaponchange( hardpointtype, team, killstreak_id ) { - self endon( "spawned_player" ); - self endon( "death" ); - self endon( "disconnect" ); - self endon( "grenade_fire" ); - self waittill( "weapon_change" ); - self setclientfieldtoplayer( "missile_drone_active", 0 ); - maps/mp/killstreaks/_killstreakrules::killstreakstop( hardpointtype, team, killstreak_id ); + self endon( "spawned_player" ); + self endon( "death" ); + self endon( "disconnect" ); + self endon( "grenade_fire" ); + + self waittill( "weapon_change" ); + + self setclientfieldtoplayer( "missile_drone_active", 0 ); + maps\mp\killstreaks\_killstreakrules::killstreakstop( hardpointtype, team, killstreak_id ); } watchownerdeath( hardpointtype, team, killstreak_id ) { - self endon( "spawned_player" ); - self endon( "disconnect" ); - self endon( "weapon_change" ); - self endon( "missile_drone_active" ); - self waittill( "death" ); - maps/mp/killstreaks/_killstreakrules::killstreakstop( hardpointtype, team, killstreak_id ); + self endon( "spawned_player" ); + self endon( "disconnect" ); + self endon( "weapon_change" ); + self endon( "missile_drone_active" ); + + self waittill( "death" ); + + maps\mp\killstreaks\_killstreakrules::killstreakstop( hardpointtype, team, killstreak_id ); } checkforemp() { - self endon( "spawned_player" ); - self endon( "disconnect" ); - self endon( "weapon_change" ); - self endon( "death" ); - self endon( "grenade_fire" ); - self waittill( "emp_jammed" ); - self setclientfieldtoplayer( "missile_drone_active", 0 ); - self maps/mp/killstreaks/_killstreaks::switchtolastnonkillstreakweapon(); + self endon( "spawned_player" ); + self endon( "disconnect" ); + self endon( "weapon_change" ); + self endon( "death" ); + self endon( "grenade_fire" ); + + self waittill( "emp_jammed" ); + + self setclientfieldtoplayer( "missile_drone_active", 0 ); + self maps\mp\killstreaks\_killstreaks::switchtolastnonkillstreakweapon(); } watchdamage() { - self endon( "death" ); - self setcandamage( 1 ); - self.maxhealth = 100000; - self.health = self.maxhealth; - for ( ;; ) - { - self waittill( "damage", damage, attacker, direction, point, type, tagname, modelname, partname, weaponname ); - if ( !isDefined( attacker ) || !isplayer( attacker ) ) - { - continue; - } - else - { - if ( isplayer( attacker ) && level.teambased && isDefined( attacker.team ) && self.team == attacker.team && level.friendlyfire == 0 ) - { - break; - } - else - { - if ( self.owner isenemyplayer( attacker ) ) - { - maps/mp/_scoreevents::processscoreevent( "destroyed_missile_drone", attacker, self.owner, weaponname ); - attacker maps/mp/_challenges::addflyswatterstat( weaponname, self ); - break; - } - self detonate(); - } - } - } + self endon( "death" ); + self setcandamage( 1 ); + self.maxhealth = 100000; + self.health = self.maxhealth; + + for (;;) + { + self waittill( "damage", damage, attacker, direction, point, type, tagname, modelname, partname, weaponname ); + + if ( !isdefined( attacker ) || !isplayer( attacker ) ) + continue; + + if ( isplayer( attacker ) && level.teambased && isdefined( attacker.team ) && self.team == attacker.team && level.friendlyfire == 0 ) + continue; + + if ( self.owner isenemyplayer( attacker ) ) + { + maps\mp\_scoreevents::processscoreevent( "destroyed_missile_drone", attacker, self.owner, weaponname ); + attacker maps\mp\_challenges::addflyswatterstat( weaponname, self ); + } + else + { + + } + + self detonate(); + } } get_array_sorted_dot_prod( array, mincos ) { - if ( isplayer( self ) ) - { - org = self.origin; - angles = self getplayerangles(); + if ( isplayer( self ) ) + { + org = self.origin; + angles = self getplayerangles(); /# - assert( isDefined( angles ) ); + assert( isdefined( angles ) ); #/ - } - else - { - org = self.origin; + } + else + { + org = self.origin; /# - assert( isDefined( self.angles ) ); + assert( isdefined( self.angles ) ); #/ - angles = self.angles; - } - forwardvec = vectornormalize( anglesToForward( angles ) ); - dotprod = []; - index = []; - i = 0; - while ( i < array.size ) - { + angles = self.angles; + } + + forwardvec = vectornormalize( anglestoforward( angles ) ); + dotprod = []; + index = []; + + for ( i = 0; i < array.size; i++ ) + { /# - assert( isDefined( forwardvec ) ); + assert( isdefined( forwardvec ) ); #/ /# - assert( isDefined( array[ i ] ) ); + assert( isdefined( array[i] ) ); #/ /# - assert( isDefined( array[ i ].origin ) ); + assert( isdefined( array[i].origin ) ); #/ /# - assert( isDefined( org ) ); + assert( isdefined( org ) ); #/ - cosa = vectordot( forwardvec, vectornormalize( array[ i ].origin - org ) ); + cosa = vectordot( forwardvec, vectornormalize( array[i].origin - org ) ); /# - assert( isDefined( cosa ) ); + assert( isdefined( cosa ) ); #/ - if ( isDefined( mincos ) && cosa < mincos ) - { - i++; - continue; - } - else - { - array[ i ].sorteddotprod = cosa; - dotprod[ dotprod.size ] = cosa; - index[ index.size ] = i; - } - i++; - } - for ( ;; ) - { - change = 0; - i = 0; - while ( i < ( dotprod.size - 1 ) ) - { - if ( dotprod[ i ] >= dotprod[ i + 1 ] ) - { - i++; - continue; - } - else - { - change = 1; - temp = dotprod[ i ]; - dotprod[ i ] = dotprod[ i + 1 ]; - dotprod[ i + 1 ] = temp; - temp = index[ i ]; - index[ i ] = index[ i + 1 ]; - index[ i + 1 ] = temp; - } - i++; - } - if ( !change ) - { - break; - } - else - { - } - } - newarray = []; - i = 0; - while ( i < dotprod.size ) - { - newarray[ i ] = array[ index[ i ] ]; - i++; - } - return newarray; + if ( isdefined( mincos ) && cosa < mincos ) + continue; + + array[i].sorteddotprod = cosa; + dotprod[dotprod.size] = cosa; + index[index.size] = i; + } + + for (;;) + { + change = 0; + + for ( i = 0; i < dotprod.size - 1; i++ ) + { + if ( dotprod[i] >= dotprod[i + 1] ) + continue; + + change = 1; + temp = dotprod[i]; + dotprod[i] = dotprod[i + 1]; + dotprod[i + 1] = temp; + temp = index[i]; + index[i] = index[i + 1]; + index[i + 1] = temp; + } + + if ( !change ) + break; + } + + newarray = []; + + for ( i = 0; i < dotprod.size; i++ ) + newarray[i] = array[index[i]]; + + return newarray; } updatetargetting() { - self endon( "spawned_player" ); - self endon( "disconnect" ); - self endon( "weapon_change" ); - self endon( "death" ); - self endon( "grenade_fire" ); - mincos = getdvarfloatdefault( "scr_missile_drone_min_cos", 0,9 ); - updatewait = getdvarfloatdefault( "scr_missile_drone_update_wait", 0,5 ); - for ( ;; ) - { - self.dronetarget = self projectile_find_target( self, mincos ); - if ( isDefined( self.dronetarget ) ) - { - self thread clearinvaliddronetarget(); - self setclientfieldtoplayer( "missile_drone_active", 2 ); - } - else - { - self setclientfieldtoplayer( "missile_drone_active", 1 ); - } - wait updatewait; - } + self endon( "spawned_player" ); + self endon( "disconnect" ); + self endon( "weapon_change" ); + self endon( "death" ); + self endon( "grenade_fire" ); + mincos = getdvarfloatdefault( "scr_missile_drone_min_cos", 0.9 ); + updatewait = getdvarfloatdefault( "scr_missile_drone_update_wait", 0.5 ); + + for (;;) + { + self.dronetarget = self projectile_find_target( self, mincos ); + + if ( isdefined( self.dronetarget ) ) + { + self thread clearinvaliddronetarget(); + self setclientfieldtoplayer( "missile_drone_active", 2 ); + } + else + self setclientfieldtoplayer( "missile_drone_active", 1 ); + + wait( updatewait ); + } } clearinvaliddronetarget() { - self endon( "death" ); - self notify( "clearInvalidDroneTarget" ); - self endon( "clearInvalidDroneTarget" ); - self endon( "drone_target_acquired" ); - self.dronetarget[ "entity" ] waittill_any( "death", "disconnect", "joined_team" ); - self.dronetarget = undefined; + self endon( "death" ); + self notify( "clearInvalidDroneTarget" ); + self endon( "clearInvalidDroneTarget" ); + self endon( "drone_target_acquired" ); + self.dronetarget["entity"] waittill_any( "death", "disconnect", "joined_team" ); + self.dronetarget = undefined; } diff --git a/Multiplayer Core/patch_mp/maps/mp/killstreaks/_missile_swarm.gsc b/Multiplayer Core/patch_mp/maps/mp/killstreaks/_missile_swarm.gsc index c3e45c9..4f84c7a 100644 --- a/Multiplayer Core/patch_mp/maps/mp/killstreaks/_missile_swarm.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/killstreaks/_missile_swarm.gsc @@ -1,760 +1,696 @@ -#include maps/mp/killstreaks/_dogs; -#include maps/mp/_challenges; -#include maps/mp/_scoreevents; -#include maps/mp/killstreaks/_killstreakrules; -#include maps/mp/killstreaks/_airsupport; -#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\_airsupport; +#include maps\mp\killstreaks\_killstreakrules; +#include maps\mp\_scoreevents; +#include maps\mp\_challenges; +#include maps\mp\killstreaks\_dogs; init() { - level.missile_swarm_max = 6; - level.missile_swarm_flyheight = 3000; - level.missile_swarm_flydist = 5000; - set_dvar_float_if_unset( "scr_missile_swarm_lifetime", 40 ); - precacheitem( "missile_swarm_projectile_mp" ); - level.swarm_fx[ "swarm" ] = loadfx( "weapon/harpy_swarm/fx_hrpy_swrm_os_circle_neg_x" ); - level.swarm_fx[ "swarm_tail" ] = loadfx( "weapon/harpy_swarm/fx_hrpy_swrm_exhaust_trail_close" ); - level.missiledronesoundstart = "mpl_hk_scan"; - registerkillstreak( "missile_swarm_mp", "missile_swarm_mp", "killstreak_missile_swarm", "missile_swarm_used", ::swarm_killstreak, 1 ); - registerkillstreakaltweapon( "missile_swarm_mp", "missile_swarm_projectile_mp" ); - registerkillstreakstrings( "missile_swarm_mp", &"KILLSTREAK_EARNED_MISSILE_SWARM", &"KILLSTREAK_MISSILE_SWARM_NOT_AVAILABLE", &"KILLSTREAK_MISSILE_SWARM_INBOUND" ); - registerkillstreakdialog( "missile_swarm_mp", "mpl_killstreak_missile_swarm", "kls_swarm_used", "", "kls_swarm_enemy", "", "kls_swarm_ready" ); - registerkillstreakdevdvar( "missile_swarm_mp", "scr_givemissileswarm" ); - setkillstreakteamkillpenaltyscale( "missile_swarm_mp", 0 ); - maps/mp/killstreaks/_killstreaks::createkillstreaktimer( "missile_swarm_mp" ); - registerclientfield( "world", "missile_swarm", 1, 2, "int" ); + level.missile_swarm_max = 6; + level.missile_swarm_flyheight = 3000; + level.missile_swarm_flydist = 5000; + set_dvar_float_if_unset( "scr_missile_swarm_lifetime", 40.0 ); + precacheitem( "missile_swarm_projectile_mp" ); + level.swarm_fx["swarm"] = loadfx( "weapon/harpy_swarm/fx_hrpy_swrm_os_circle_neg_x" ); + level.swarm_fx["swarm_tail"] = loadfx( "weapon/harpy_swarm/fx_hrpy_swrm_exhaust_trail_close" ); + level.missiledronesoundstart = "mpl_hk_scan"; + registerkillstreak( "missile_swarm_mp", "missile_swarm_mp", "killstreak_missile_swarm", "missile_swarm_used", ::swarm_killstreak, 1 ); + registerkillstreakaltweapon( "missile_swarm_mp", "missile_swarm_projectile_mp" ); + registerkillstreakstrings( "missile_swarm_mp", &"KILLSTREAK_EARNED_MISSILE_SWARM", &"KILLSTREAK_MISSILE_SWARM_NOT_AVAILABLE", &"KILLSTREAK_MISSILE_SWARM_INBOUND" ); + registerkillstreakdialog( "missile_swarm_mp", "mpl_killstreak_missile_swarm", "kls_swarm_used", "", "kls_swarm_enemy", "", "kls_swarm_ready" ); + registerkillstreakdevdvar( "missile_swarm_mp", "scr_givemissileswarm" ); + setkillstreakteamkillpenaltyscale( "missile_swarm_mp", 0.0 ); + maps\mp\killstreaks\_killstreaks::createkillstreaktimer( "missile_swarm_mp" ); + registerclientfield( "world", "missile_swarm", 1, 2, "int" ); /# - set_dvar_int_if_unset( "scr_missile_swarm_cam", 0 ); + set_dvar_int_if_unset( "scr_missile_swarm_cam", 0 ); #/ } swarm_killstreak( hardpointtype ) { /# - assert( hardpointtype == "missile_swarm_mp" ); + assert( hardpointtype == "missile_swarm_mp" ); #/ - level.missile_swarm_origin = level.mapcenter + ( 0, 0, level.missile_swarm_flyheight ); - if ( level.script == "mp_drone" ) - { - level.missile_swarm_origin += ( -5000, 0, 2000 ); - } - if ( level.script == "mp_la" ) - { - level.missile_swarm_origin += vectorScale( ( 0, 0, 1 ), 2000 ); - } - if ( level.script == "mp_turbine" ) - { - level.missile_swarm_origin += vectorScale( ( 0, 0, 1 ), 1500 ); - } - if ( level.script == "mp_downhill" ) - { - level.missile_swarm_origin += ( 4000, 0, 1000 ); - } - if ( level.script == "mp_hydro" ) - { - level.missile_swarm_origin += vectorScale( ( 0, 0, 1 ), 5000 ); - } - if ( level.script == "mp_magma" ) - { - level.missile_swarm_origin += ( 0, -6000, 3000 ); - } - if ( level.script == "mp_uplink" ) - { - level.missile_swarm_origin += ( -6000, 0, 2000 ); - } - if ( level.script == "mp_bridge" ) - { - level.missile_swarm_origin += vectorScale( ( 0, 0, 1 ), 2000 ); - } - if ( level.script == "mp_paintball" ) - { - level.missile_swarm_origin += vectorScale( ( 0, 0, 1 ), 1000 ); - } - if ( level.script == "mp_dig" ) - { - level.missile_swarm_origin += ( -2000, -2000, 1000 ); - } - killstreak_id = self maps/mp/killstreaks/_killstreakrules::killstreakstart( "missile_swarm_mp", self.team, 0, 1 ); - if ( killstreak_id == -1 ) - { - return 0; - } - level thread swarm_killstreak_start( self, killstreak_id ); - return 1; + level.missile_swarm_origin = level.mapcenter + ( 0, 0, level.missile_swarm_flyheight ); + + if ( level.script == "mp_drone" ) + level.missile_swarm_origin += ( -5000, 0, 2000 ); + + if ( level.script == "mp_la" ) + level.missile_swarm_origin += vectorscale( ( 0, 0, 1 ), 2000.0 ); + + if ( level.script == "mp_turbine" ) + level.missile_swarm_origin += vectorscale( ( 0, 0, 1 ), 1500.0 ); + + if ( level.script == "mp_downhill" ) + level.missile_swarm_origin += ( 4000, 0, 1000 ); + + if ( level.script == "mp_hydro" ) + level.missile_swarm_origin += vectorscale( ( 0, 0, 1 ), 5000.0 ); + + if ( level.script == "mp_magma" ) + level.missile_swarm_origin += ( 0, -6000, 3000 ); + + if ( level.script == "mp_uplink" ) + level.missile_swarm_origin += ( -6000, 0, 2000 ); + + if ( level.script == "mp_bridge" ) + level.missile_swarm_origin += vectorscale( ( 0, 0, 1 ), 2000.0 ); + + if ( level.script == "mp_paintball" ) + level.missile_swarm_origin += vectorscale( ( 0, 0, 1 ), 1000.0 ); + + if ( level.script == "mp_dig" ) + level.missile_swarm_origin += ( -2000, -2000, 1000 ); + + killstreak_id = self maps\mp\killstreaks\_killstreakrules::killstreakstart( "missile_swarm_mp", self.team, 0, 1 ); + + if ( killstreak_id == -1 ) + return false; + + level thread swarm_killstreak_start( self, killstreak_id ); + return true; } swarm_killstreak_start( owner, killstreak_id ) { - level endon( "swarm_end" ); - missiles = getentarray( "swarm_missile", "targetname" ); - _a102 = missiles; - _k102 = getFirstArrayKey( _a102 ); - while ( isDefined( _k102 ) ) - { - missile = _a102[ _k102 ]; - if ( isDefined( missile ) ) - { - missile detonate(); - wait 0,1; - } - _k102 = getNextArrayKey( _a102, _k102 ); - } - while ( isDefined( level.missile_swarm_fx ) ) - { - i = 0; - while ( i < level.missile_swarm_fx.size ) - { - if ( isDefined( level.missile_swarm_fx[ i ] ) ) - { - level.missile_swarm_fx[ i ] delete(); - } - i++; - } - } - level.missile_swarm_fx = undefined; - level.missile_swarm_team = owner.team; - level.missile_swarm_owner = owner; - owner maps/mp/killstreaks/_killstreaks::playkillstreakstartdialog( "missile_swarm_mp", owner.pers[ "team" ] ); - level create_player_targeting_array( owner, owner.team ); - level.globalkillstreakscalled++; - owner addweaponstat( "missile_swarm_mp", "used", 1 ); - level thread swarm_killstreak_abort( owner, killstreak_id ); - level thread swarm_killstreak_watch_for_emp( owner, killstreak_id ); - level thread swarm_killstreak_fx(); - wait 2; - level thread swarm_think( owner, killstreak_id ); + level endon( "swarm_end" ); + missiles = getentarray( "swarm_missile", "targetname" ); + + foreach ( missile in missiles ) + { + if ( isdefined( missile ) ) + { + missile detonate(); + wait 0.1; + } + } + + if ( isdefined( level.missile_swarm_fx ) ) + { + for ( i = 0; i < level.missile_swarm_fx.size; i++ ) + { + if ( isdefined( level.missile_swarm_fx[i] ) ) + level.missile_swarm_fx[i] delete(); + } + } + + level.missile_swarm_fx = undefined; + level.missile_swarm_team = owner.team; + level.missile_swarm_owner = owner; + owner maps\mp\killstreaks\_killstreaks::playkillstreakstartdialog( "missile_swarm_mp", owner.pers["team"] ); + level create_player_targeting_array( owner, owner.team ); + level.globalkillstreakscalled++; + owner addweaponstat( "missile_swarm_mp", "used", 1 ); + level thread swarm_killstreak_abort( owner, killstreak_id ); + level thread swarm_killstreak_watch_for_emp( owner, killstreak_id ); + level thread swarm_killstreak_fx(); + wait 2; + level thread swarm_think( owner, killstreak_id ); } swarm_killstreak_end( owner, detonate, killstreak_id ) { - level notify( "swarm_end" ); - if ( isDefined( detonate ) && detonate ) - { - level setclientfield( "missile_swarm", 2 ); - } - else - { - level setclientfield( "missile_swarm", 0 ); - } - missiles = getentarray( "swarm_missile", "targetname" ); - if ( is_true( detonate ) ) - { - i = 0; - while ( i < level.missile_swarm_fx.size ) - { - if ( isDefined( level.missile_swarm_fx[ i ] ) ) - { - level.missile_swarm_fx[ i ] delete(); - } - i++; - } - _a160 = missiles; - _k160 = getFirstArrayKey( _a160 ); - while ( isDefined( _k160 ) ) - { - missile = _a160[ _k160 ]; - if ( isDefined( missile ) ) - { - missile detonate(); - wait 0,1; - } - _k160 = getNextArrayKey( _a160, _k160 ); - } - } - else _a171 = missiles; - _k171 = getFirstArrayKey( _a171 ); - while ( isDefined( _k171 ) ) - { - missile = _a171[ _k171 ]; - if ( isDefined( missile ) ) - { - yaw = randomintrange( 0, 360 ); - angles = ( 0, yaw, 0 ); - forward = anglesToForward( angles ); - if ( isDefined( missile.goal ) ) - { - missile.goal.origin = missile.origin + ( forward * level.missile_swarm_flydist * 1000 ); - } - } - _k171 = getNextArrayKey( _a171, _k171 ); - } - wait 1; - level.missile_swarm_sound stoploopsound( 2 ); - wait 2; - level.missile_swarm_sound delete(); - recordstreakindex = level.killstreakindices[ level.killstreaks[ "missile_swarm_mp" ].menuname ]; - if ( isDefined( recordstreakindex ) ) - { - owner recordkillstreakendevent( recordstreakindex ); - } - maps/mp/killstreaks/_killstreakrules::killstreakstop( "missile_swarm_mp", level.missile_swarm_team, killstreak_id ); - level.missile_swarm_owner = undefined; - wait 4; - missiles = getentarray( "swarm_missile", "targetname" ); - _a205 = missiles; - _k205 = getFirstArrayKey( _a205 ); - while ( isDefined( _k205 ) ) - { - missile = _a205[ _k205 ]; - if ( isDefined( missile ) ) - { - missile delete(); - wait 0,1; - } - _k205 = getNextArrayKey( _a205, _k205 ); - } - wait 6; - i = 0; - while ( i < level.missile_swarm_fx.size ) - { - if ( isDefined( level.missile_swarm_fx[ i ] ) ) - { - level.missile_swarm_fx[ i ] delete(); - } - i++; - } + level notify( "swarm_end" ); + + if ( isdefined( detonate ) && detonate ) + level setclientfield( "missile_swarm", 2 ); + else + level setclientfield( "missile_swarm", 0 ); + + missiles = getentarray( "swarm_missile", "targetname" ); + + if ( is_true( detonate ) ) + { + for ( i = 0; i < level.missile_swarm_fx.size; i++ ) + { + if ( isdefined( level.missile_swarm_fx[i] ) ) + level.missile_swarm_fx[i] delete(); + } + + foreach ( missile in missiles ) + { + if ( isdefined( missile ) ) + { + missile detonate(); + wait 0.1; + } + } + } + else + { + foreach ( missile in missiles ) + { + if ( isdefined( missile ) ) + { + yaw = randomintrange( 0, 360 ); + angles = ( 0, yaw, 0 ); + forward = anglestoforward( angles ); + + if ( isdefined( missile.goal ) ) + missile.goal.origin = missile.origin + forward * level.missile_swarm_flydist * 1000; + } + } + } + + wait 1; + level.missile_swarm_sound stoploopsound( 2 ); + wait 2; + level.missile_swarm_sound delete(); + recordstreakindex = level.killstreakindices[level.killstreaks["missile_swarm_mp"].menuname]; + + if ( isdefined( recordstreakindex ) ) + owner recordkillstreakendevent( recordstreakindex ); + + maps\mp\killstreaks\_killstreakrules::killstreakstop( "missile_swarm_mp", level.missile_swarm_team, killstreak_id ); + level.missile_swarm_owner = undefined; + wait 4; + missiles = getentarray( "swarm_missile", "targetname" ); + + foreach ( missile in missiles ) + { + if ( isdefined( missile ) ) + { + missile delete(); + wait 0.1; + } + } + + wait 6; + + for ( i = 0; i < level.missile_swarm_fx.size; i++ ) + { + if ( isdefined( level.missile_swarm_fx[i] ) ) + level.missile_swarm_fx[i] delete(); + } } swarm_killstreak_abort( owner, killstreak_id ) { - level endon( "swarm_end" ); - owner waittill_any( "disconnect", "joined_team", "joined_spectators", "emp_jammed" ); - level thread swarm_killstreak_end( owner, 1, killstreak_id ); + level endon( "swarm_end" ); + owner waittill_any( "disconnect", "joined_team", "joined_spectators", "emp_jammed" ); + level thread swarm_killstreak_end( owner, 1, killstreak_id ); } swarm_killstreak_watch_for_emp( owner, killstreak_id ) { - level endon( "swarm_end" ); - owner waittill( "emp_destroyed_missile_swarm", attacker ); - maps/mp/_scoreevents::processscoreevent( "destroyed_missile_swarm", attacker, owner, "emp_mp" ); - attacker maps/mp/_challenges::addflyswatterstat( "emp_mp" ); - level thread swarm_killstreak_end( owner, 1, killstreak_id ); + level endon( "swarm_end" ); + + owner waittill( "emp_destroyed_missile_swarm", attacker ); + + maps\mp\_scoreevents::processscoreevent( "destroyed_missile_swarm", attacker, owner, "emp_mp" ); + attacker maps\mp\_challenges::addflyswatterstat( "emp_mp" ); + level thread swarm_killstreak_end( owner, 1, killstreak_id ); } swarm_killstreak_fx() { - level endon( "swarm_end" ); - level.missile_swarm_fx = []; - yaw = randomint( 360 ); - level.missile_swarm_fx[ 0 ] = spawn( "script_model", level.missile_swarm_origin ); - level.missile_swarm_fx[ 0 ] setmodel( "tag_origin" ); - level.missile_swarm_fx[ 0 ].angles = ( -90, yaw, 0 ); - level.missile_swarm_fx[ 1 ] = spawn( "script_model", level.missile_swarm_origin ); - level.missile_swarm_fx[ 1 ] setmodel( "tag_origin" ); - level.missile_swarm_fx[ 1 ].angles = ( -90, yaw, 0 ); - level.missile_swarm_fx[ 2 ] = spawn( "script_model", level.missile_swarm_origin ); - level.missile_swarm_fx[ 2 ] setmodel( "tag_origin" ); - level.missile_swarm_fx[ 2 ].angles = ( -90, yaw, 0 ); - level.missile_swarm_fx[ 3 ] = spawn( "script_model", level.missile_swarm_origin ); - level.missile_swarm_fx[ 3 ] setmodel( "tag_origin" ); - level.missile_swarm_fx[ 3 ].angles = ( -90, yaw, 0 ); - level.missile_swarm_fx[ 4 ] = spawn( "script_model", level.missile_swarm_origin ); - level.missile_swarm_fx[ 4 ] setmodel( "tag_origin" ); - level.missile_swarm_fx[ 4 ].angles = ( -90, yaw, 0 ); - level.missile_swarm_fx[ 5 ] = spawn( "script_model", level.missile_swarm_origin ); - level.missile_swarm_fx[ 5 ] setmodel( "tag_origin" ); - level.missile_swarm_fx[ 5 ].angles = ( -90, yaw, 0 ); - level.missile_swarm_fx[ 6 ] = spawn( "script_model", level.missile_swarm_origin ); - level.missile_swarm_fx[ 6 ] setmodel( "tag_origin" ); - level.missile_swarm_fx[ 6 ].angles = ( -90, yaw, 0 ); - level.missile_swarm_sound = spawn( "script_model", level.missile_swarm_origin ); - level.missile_swarm_sound setmodel( "tag_origin" ); - level.missile_swarm_sound.angles = ( 0, 0, 1 ); - wait 0,1; - playfxontag( level.swarm_fx[ "swarm" ], level.missile_swarm_fx[ 0 ], "tag_origin" ); - wait 2; - level.missile_swarm_sound playloopsound( "veh_harpy_drone_swarm_lp", 3 ); - level setclientfield( "missile_swarm", 1 ); - current = 1; - while ( 1 ) - { - if ( !isDefined( level.missile_swarm_fx[ current ] ) ) - { - level.missile_swarm_fx[ current ] = spawn( "script_model", level.missile_swarm_origin ); - level.missile_swarm_fx[ current ] setmodel( "tag_origin" ); - } - yaw = randomint( 360 ); - if ( isDefined( level.missile_swarm_fx[ current ] ) ) - { - level.missile_swarm_fx[ current ].angles = ( -90, yaw, 0 ); - } - wait 0,1; - if ( isDefined( level.missile_swarm_fx[ current ] ) ) - { - playfxontag( level.swarm_fx[ "swarm" ], level.missile_swarm_fx[ current ], "tag_origin" ); - } - current = ( current + 1 ) % 7; - wait 1,9; - } + level endon( "swarm_end" ); + level.missile_swarm_fx = []; + yaw = randomint( 360 ); + level.missile_swarm_fx[0] = spawn( "script_model", level.missile_swarm_origin ); + level.missile_swarm_fx[0] setmodel( "tag_origin" ); + level.missile_swarm_fx[0].angles = ( -90, yaw, 0 ); + level.missile_swarm_fx[1] = spawn( "script_model", level.missile_swarm_origin ); + level.missile_swarm_fx[1] setmodel( "tag_origin" ); + level.missile_swarm_fx[1].angles = ( -90, yaw, 0 ); + level.missile_swarm_fx[2] = spawn( "script_model", level.missile_swarm_origin ); + level.missile_swarm_fx[2] setmodel( "tag_origin" ); + level.missile_swarm_fx[2].angles = ( -90, yaw, 0 ); + level.missile_swarm_fx[3] = spawn( "script_model", level.missile_swarm_origin ); + level.missile_swarm_fx[3] setmodel( "tag_origin" ); + level.missile_swarm_fx[3].angles = ( -90, yaw, 0 ); + level.missile_swarm_fx[4] = spawn( "script_model", level.missile_swarm_origin ); + level.missile_swarm_fx[4] setmodel( "tag_origin" ); + level.missile_swarm_fx[4].angles = ( -90, yaw, 0 ); + level.missile_swarm_fx[5] = spawn( "script_model", level.missile_swarm_origin ); + level.missile_swarm_fx[5] setmodel( "tag_origin" ); + level.missile_swarm_fx[5].angles = ( -90, yaw, 0 ); + level.missile_swarm_fx[6] = spawn( "script_model", level.missile_swarm_origin ); + level.missile_swarm_fx[6] setmodel( "tag_origin" ); + level.missile_swarm_fx[6].angles = ( -90, yaw, 0 ); + level.missile_swarm_sound = spawn( "script_model", level.missile_swarm_origin ); + level.missile_swarm_sound setmodel( "tag_origin" ); + level.missile_swarm_sound.angles = ( 0, 0, 0 ); + wait 0.1; + playfxontag( level.swarm_fx["swarm"], level.missile_swarm_fx[0], "tag_origin" ); + wait 2; + level.missile_swarm_sound playloopsound( "veh_harpy_drone_swarm_lp", 3 ); + level setclientfield( "missile_swarm", 1 ); + current = 1; + + while ( true ) + { + if ( !isdefined( level.missile_swarm_fx[current] ) ) + { + level.missile_swarm_fx[current] = spawn( "script_model", level.missile_swarm_origin ); + level.missile_swarm_fx[current] setmodel( "tag_origin" ); + } + + yaw = randomint( 360 ); + + if ( isdefined( level.missile_swarm_fx[current] ) ) + level.missile_swarm_fx[current].angles = ( -90, yaw, 0 ); + + wait 0.1; + + if ( isdefined( level.missile_swarm_fx[current] ) ) + playfxontag( level.swarm_fx["swarm"], level.missile_swarm_fx[current], "tag_origin" ); + + current = ( current + 1 ) % 7; + wait 1.9; + } } swarm_think( owner, killstreak_id ) { - level endon( "swarm_end" ); - lifetime = getDvarFloat( #"4FEEA279" ); - end_time = getTime() + ( lifetime * 1000 ); - level.missile_swarm_count = 0; - while ( getTime() < end_time ) - { + level endon( "swarm_end" ); + lifetime = getdvarfloat( "scr_missile_swarm_lifetime" ); + end_time = gettime() + lifetime * 1000; + level.missile_swarm_count = 0; + + while ( gettime() < end_time ) + { /# - assert( level.missile_swarm_count >= 0 ); + assert( level.missile_swarm_count >= 0 ); #/ - while ( level.missile_swarm_count >= level.missile_swarm_max ) - { - wait 0,5; - } - count = 1; - level.missile_swarm_count += count; - i = 0; - while ( i < count ) - { - self thread projectile_spawn( owner ); - i++; - } - wait ( ( level.missile_swarm_count / level.missile_swarm_max ) + 0,4 ); - } - level thread swarm_killstreak_end( owner, undefined, killstreak_id ); + if ( level.missile_swarm_count >= level.missile_swarm_max ) + { + wait 0.5; + continue; + } + + count = 1; + level.missile_swarm_count += count; + + for ( i = 0; i < count; i++ ) + self thread projectile_spawn( owner ); + + wait( level.missile_swarm_count / level.missile_swarm_max + 0.4 ); + } + + level thread swarm_killstreak_end( owner, undefined, killstreak_id ); } projectile_cam( player ) { /# - player.swarm_cam = 1; - wait 0,05; - forward = anglesToForward( self.angles ); - cam = spawn( "script_model", ( self.origin + vectorScale( ( 0, 0, 1 ), 300 ) ) + ( forward * -200 ) ); - cam setmodel( "tag_origin" ); - cam linkto( self ); - player camerasetposition( cam ); - player camerasetlookat( self ); - player cameraactivate( 1 ); - self waittill( "death" ); - wait 1; - player cameraactivate( 0 ); - cam delete(); - player.swarm_cam = 0; + player.swarm_cam = 1; + wait 0.05; + forward = anglestoforward( self.angles ); + cam = spawn( "script_model", self.origin + vectorscale( ( 0, 0, 1 ), 300.0 ) + forward * -200 ); + cam setmodel( "tag_origin" ); + cam linkto( self ); + player camerasetposition( cam ); + player camerasetlookat( self ); + player cameraactivate( 1 ); + + self waittill( "death" ); + + wait 1; + player cameraactivate( 0 ); + cam delete(); + player.swarm_cam = 0; #/ } projectile_goal_move() { - self endon( "death" ); - for ( ;; ) - { - wait 0,25; - while ( distancesquared( self.origin, self.goal.origin ) < 65536 ) - { - if ( distancesquared( self.origin, level.missile_swarm_origin ) > ( level.missile_swarm_flydist * level.missile_swarm_flydist ) ) - { - self.goal.origin = level.missile_swarm_origin; - break; - } - else - { - enemy = projectile_find_random_player( self.owner, self.team ); - if ( isDefined( enemy ) ) - { - self.goal.origin = enemy.origin + ( 0, 0, self.origin[ 2 ] ); - } - else - { - pitch = randomintrange( -45, 45 ); - yaw = randomintrange( 0, 360 ); - angles = ( 0, yaw, 0 ); - forward = anglesToForward( angles ); - self.goal.origin = self.origin + ( forward * level.missile_swarm_flydist ); - } - nfz = crossesnoflyzone( self.origin, self.goal.origin ); - tries = 20; - while ( isDefined( nfz ) && tries > 0 ) - { - tries--; + self endon( "death" ); - pitch = randomintrange( -45, 45 ); - yaw = randomintrange( 0, 360 ); - angles = ( 0, yaw, 0 ); - forward = anglesToForward( angles ); - self.goal.origin = self.origin + ( forward * level.missile_swarm_flydist ); - nfz = crossesnoflyzone( self.origin, self.goal.origin ); - } - } - } - } + for (;;) + { + wait 0.25; + + if ( distancesquared( self.origin, self.goal.origin ) < 65536 ) + { + if ( distancesquared( self.origin, level.missile_swarm_origin ) > level.missile_swarm_flydist * level.missile_swarm_flydist ) + { + self.goal.origin = level.missile_swarm_origin; + continue; + } + + enemy = projectile_find_random_player( self.owner, self.team ); + + if ( isdefined( enemy ) ) + self.goal.origin = enemy.origin + ( 0, 0, self.origin[2] ); + else + { + pitch = randomintrange( -45, 45 ); + yaw = randomintrange( 0, 360 ); + angles = ( 0, yaw, 0 ); + forward = anglestoforward( angles ); + self.goal.origin = self.origin + forward * level.missile_swarm_flydist; + } + + nfz = crossesnoflyzone( self.origin, self.goal.origin ); + tries = 20; + + while ( isdefined( nfz ) && tries > 0 ) + { + tries--; + pitch = randomintrange( -45, 45 ); + yaw = randomintrange( 0, 360 ); + angles = ( 0, yaw, 0 ); + forward = anglestoforward( angles ); + self.goal.origin = self.origin + forward * level.missile_swarm_flydist; + nfz = crossesnoflyzone( self.origin, self.goal.origin ); + } + } + } } projectile_target_search( acceptskyexposure, acquiretime, allowplayeroffset ) { - self endon( "death" ); - wait acquiretime; - for ( ;; ) - { - wait randomfloatrange( 0,5, 1 ); - target = self projectile_find_target( acceptskyexposure ); - if ( isDefined( target ) ) - { - self.swarm_target = target[ "entity" ]; - target[ "entity" ].swarm = self; - if ( allowplayeroffset ) - { - self missile_settarget( target[ "entity" ], target[ "offset" ] ); - self missile_dronesetvisible( 1 ); - } - else - { - self missile_settarget( target[ "entity" ] ); - self missile_dronesetvisible( 1 ); - } - self playsound( "veh_harpy_drone_swarm_incomming" ); - if ( !isDefined( target[ "entity" ].swarmsound ) || target[ "entity" ].swarmsound == 0 ) - { - self thread target_sounds( target[ "entity" ] ); - } - target[ "entity" ] waittill_any( "death", "disconnect", "joined_team" ); - self missile_settarget( self.goal ); - self missile_dronesetvisible( 0 ); - break; - } - } + self endon( "death" ); + wait( acquiretime ); + + for (;;) + { + wait( randomfloatrange( 0.5, 1.0 ) ); + target = self projectile_find_target( acceptskyexposure ); + + if ( isdefined( target ) ) + { + self.swarm_target = target["entity"]; + target["entity"].swarm = self; + + if ( allowplayeroffset ) + { + self missile_settarget( target["entity"], target["offset"] ); + self missile_dronesetvisible( 1 ); + } + else + { + self missile_settarget( target["entity"] ); + self missile_dronesetvisible( 1 ); + } + + self playsound( "veh_harpy_drone_swarm_incomming" ); + + if ( !isdefined( target["entity"].swarmsound ) || target["entity"].swarmsound == 0 ) + self thread target_sounds( target["entity"] ); + + target["entity"] waittill_any( "death", "disconnect", "joined_team" ); + self missile_settarget( self.goal ); + self missile_dronesetvisible( 0 ); + continue; + } + } } target_sounds( targetent ) { - targetent endon( "death" ); - targetent endon( "disconnect" ); - targetent endon( "joined_team" ); - self endon( "death" ); - dist = 3000; - if ( isDefined( self.warningsounddist ) ) - { - dist = self.warningsounddist; - } - while ( distancesquared( self.origin, targetent.origin ) > ( dist * dist ) ) - { - wait 0,05; - } - if ( isDefined( targetent.swarmsound ) && targetent.swarmsound == 1 ) - { - return; - } - targetent.swarmsound = 1; - self thread reset_sound_blocker( targetent ); - self thread target_stop_sounds( targetent ); - if ( isplayer( targetent ) ) - { - targetent playlocalsound( level.missiledronesoundstart ); - } - self playsound( level.missiledronesoundstart ); + targetent endon( "death" ); + targetent endon( "disconnect" ); + targetent endon( "joined_team" ); + self endon( "death" ); + dist = 3000; + + if ( isdefined( self.warningsounddist ) ) + dist = self.warningsounddist; + + while ( distancesquared( self.origin, targetent.origin ) > dist * dist ) + wait 0.05; + + if ( isdefined( targetent.swarmsound ) && targetent.swarmsound == 1 ) + return; + + targetent.swarmsound = 1; + self thread reset_sound_blocker( targetent ); + self thread target_stop_sounds( targetent ); + + if ( isplayer( targetent ) ) + targetent playlocalsound( level.missiledronesoundstart ); + + self playsound( level.missiledronesoundstart ); } target_stop_sounds( targetent ) { - targetent waittill_any( "disconnect", "death", "joined_team" ); - if ( isDefined( targetent ) && isplayer( targetent ) ) - { - targetent stoplocalsound( level.missiledronesoundstart ); - } + targetent waittill_any( "disconnect", "death", "joined_team" ); + + if ( isdefined( targetent ) && isplayer( targetent ) ) + targetent stoplocalsound( level.missiledronesoundstart ); } reset_sound_blocker( target ) { - wait 2; - if ( isDefined( target ) ) - { - target.swarmsound = 0; - } + wait 2; + + if ( isdefined( target ) ) + target.swarmsound = 0; } projectile_spawn( owner ) { - level endon( "swarm_end" ); - upvector = ( 0, 0, randomintrange( level.missile_swarm_flyheight - 1500, level.missile_swarm_flyheight - 1000 ) ); - yaw = randomintrange( 0, 360 ); - angles = ( 0, yaw, 0 ); - forward = anglesToForward( angles ); - origin = ( level.mapcenter + upvector ) + ( forward * level.missile_swarm_flydist * -1 ); - target = ( level.mapcenter + upvector ) + ( forward * level.missile_swarm_flydist ); - enemy = projectile_find_random_player( owner, owner.team ); - if ( isDefined( enemy ) ) - { - target = enemy.origin + upvector; - } - projectile = projectile_spawn_utility( owner, target, origin, "missile_swarm_projectile_mp", "swarm_missile", 1 ); - projectile thread projectile_abort_think(); - projectile thread projectile_target_search( cointoss(), 1, 1 ); - projectile thread projectile_death_think(); - projectile thread projectile_goal_move(); - wait 0,1; - if ( isDefined( projectile ) ) - { - projectile setclientfield( "missile_drone_projectile_animate", 1 ); - } + level endon( "swarm_end" ); + upvector = ( 0, 0, randomintrange( level.missile_swarm_flyheight - 1500, level.missile_swarm_flyheight - 1000 ) ); + yaw = randomintrange( 0, 360 ); + angles = ( 0, yaw, 0 ); + forward = anglestoforward( angles ); + origin = level.mapcenter + upvector + forward * level.missile_swarm_flydist * -1; + target = level.mapcenter + upvector + forward * level.missile_swarm_flydist; + enemy = projectile_find_random_player( owner, owner.team ); + + if ( isdefined( enemy ) ) + target = enemy.origin + upvector; + + projectile = projectile_spawn_utility( owner, target, origin, "missile_swarm_projectile_mp", "swarm_missile", 1 ); + projectile thread projectile_abort_think(); + projectile thread projectile_target_search( cointoss(), 1.0, 1 ); + projectile thread projectile_death_think(); + projectile thread projectile_goal_move(); + wait 0.1; + + if ( isdefined( projectile ) ) + projectile setclientfield( "missile_drone_projectile_animate", 1 ); } projectile_spawn_utility( owner, target, origin, weapon, targetname, movegoal ) { - goal = spawn( "script_model", target ); - goal setmodel( "tag_origin" ); - p = magicbullet( weapon, origin, target, owner, goal ); - p.owner = owner; - p.team = owner.team; - p.goal = goal; - p.targetname = "swarm_missile"; + goal = spawn( "script_model", target ); + goal setmodel( "tag_origin" ); + p = magicbullet( weapon, origin, target, owner, goal ); + p.owner = owner; + p.team = owner.team; + p.goal = goal; + p.targetname = "swarm_missile"; /# - if ( !is_true( owner.swarm_cam ) && getDvarInt( #"492656A6" ) == 1 ) - { - p thread projectile_cam( owner ); + if ( !is_true( owner.swarm_cam ) && getdvarint( _hash_492656A6 ) == 1 ) + p thread projectile_cam( owner ); #/ - } - return p; + return p; } projectile_death_think() { - self waittill( "death" ); - level.missile_swarm_count--; + self waittill( "death" ); - self.goal delete(); + level.missile_swarm_count--; + self.goal delete(); } projectile_abort_think() { - self endon( "death" ); - self.owner waittill_any( "disconnect", "joined_team" ); - self detonate(); + self endon( "death" ); + self.owner waittill_any( "disconnect", "joined_team" ); + self detonate(); } projectile_find_target( acceptskyexposure ) { - ks = projectile_find_target_killstreak( acceptskyexposure ); - player = projectile_find_target_player( acceptskyexposure ); - if ( isDefined( ks ) && !isDefined( player ) ) - { - return ks; - } - else - { - if ( !isDefined( ks ) && isDefined( player ) ) - { - return player; - } - else - { - if ( isDefined( ks ) && isDefined( player ) ) - { - if ( cointoss() ) - { - return ks; - } - return player; - } - } - } - return undefined; + ks = projectile_find_target_killstreak( acceptskyexposure ); + player = projectile_find_target_player( acceptskyexposure ); + + if ( isdefined( ks ) && !isdefined( player ) ) + return ks; + else if ( !isdefined( ks ) && isdefined( player ) ) + return player; + else if ( isdefined( ks ) && isdefined( player ) ) + { + if ( cointoss() ) + return ks; + + return player; + } + + return undefined; } projectile_find_target_killstreak( acceptskyexposure ) { - ks = []; - ks[ "offset" ] = vectorScale( ( 0, 0, 1 ), 10 ); - targets = target_getarray(); - rcbombs = getentarray( "rcbomb", "targetname" ); - satellites = getentarray( "satellite", "targetname" ); - dogs = maps/mp/killstreaks/_dogs::dog_manager_get_dogs(); - targets = arraycombine( targets, rcbombs, 1, 0 ); - targets = arraycombine( targets, satellites, 1, 0 ); - targets = arraycombine( targets, dogs, 1, 0 ); - if ( targets.size <= 0 ) - { - return undefined; - } - targets = arraysort( targets, self.origin ); - _a634 = targets; - _k634 = getFirstArrayKey( _a634 ); - while ( isDefined( _k634 ) ) - { - target = _a634[ _k634 ]; - if ( isDefined( target.owner ) && target.owner == self.owner ) - { - } - else - { - if ( isDefined( target.script_owner ) && target.script_owner == self.owner ) - { - break; - } - else - { - if ( level.teambased && isDefined( target.team ) ) - { - if ( target.team == self.team ) - { - break; - } - } - else if ( level.teambased && isDefined( target.aiteam ) ) - { - if ( target.aiteam == self.team ) - { - break; - } - } - else - { - if ( bullettracepassed( self.origin, target.origin, 0, target ) ) - { - ks[ "entity" ] = target; - return ks; - } - if ( acceptskyexposure && cointoss() ) - { - end = target.origin + vectorScale( ( 0, 0, 1 ), 2048 ); - if ( bullettracepassed( target.origin, end, 0, target ) ) - { - ks[ "entity" ] = target; - return ks; - } - } - } - } - } - _k634 = getNextArrayKey( _a634, _k634 ); - } - return undefined; + ks = []; + ks["offset"] = vectorscale( ( 0, 0, -1 ), 10.0 ); + targets = target_getarray(); + rcbombs = getentarray( "rcbomb", "targetname" ); + satellites = getentarray( "satellite", "targetname" ); + dogs = maps\mp\killstreaks\_dogs::dog_manager_get_dogs(); + targets = arraycombine( targets, rcbombs, 1, 0 ); + targets = arraycombine( targets, satellites, 1, 0 ); + targets = arraycombine( targets, dogs, 1, 0 ); + + if ( targets.size <= 0 ) + return undefined; + + targets = arraysort( targets, self.origin ); + + foreach ( target in targets ) + { + if ( isdefined( target.owner ) && target.owner == self.owner ) + continue; + + if ( isdefined( target.script_owner ) && target.script_owner == self.owner ) + continue; + + if ( level.teambased && isdefined( target.team ) ) + { + if ( target.team == self.team ) + continue; + } + + if ( level.teambased && isdefined( target.aiteam ) ) + { + if ( target.aiteam == self.team ) + continue; + } + + if ( bullettracepassed( self.origin, target.origin, 0, target ) ) + { + ks["entity"] = target; + return ks; + } + + if ( acceptskyexposure && cointoss() ) + { + end = target.origin + vectorscale( ( 0, 0, 1 ), 2048.0 ); + + if ( bullettracepassed( target.origin, end, 0, target ) ) + { + ks["entity"] = target; + return ks; + } + } + } + + return undefined; } projectile_find_target_player( acceptexposedtosky ) { - target = []; - players = get_players(); - players = arraysort( players, self.origin ); - _a692 = players; - _k692 = getFirstArrayKey( _a692 ); - while ( isDefined( _k692 ) ) - { - player = _a692[ _k692 ]; - if ( !player_valid_target( player, self.team, self.owner ) ) - { - } - else - { - if ( bullettracepassed( self.origin, player.origin, 0, player ) ) - { - target[ "entity" ] = player; - target[ "offset" ] = ( 0, 0, 1 ); - return target; - } - if ( bullettracepassed( self.origin, player geteye(), 0, player ) ) - { - target[ "entity" ] = player; - target[ "offset" ] = vectorScale( ( 0, 0, 1 ), 50 ); - return target; - } - if ( acceptexposedtosky && cointoss() ) - { - end = player.origin + vectorScale( ( 0, 0, 1 ), 2048 ); - if ( bullettracepassed( player.origin, end, 0, player ) ) - { - target[ "entity" ] = player; - target[ "offset" ] = vectorScale( ( 0, 0, 1 ), 30 ); - return target; - } - } - } - _k692 = getNextArrayKey( _a692, _k692 ); - } - return undefined; + target = []; + players = get_players(); + players = arraysort( players, self.origin ); + + foreach ( player in players ) + { + if ( !player_valid_target( player, self.team, self.owner ) ) + continue; + + if ( bullettracepassed( self.origin, player.origin, 0, player ) ) + { + target["entity"] = player; + target["offset"] = ( 0, 0, 0 ); + return target; + } + + if ( bullettracepassed( self.origin, player geteye(), 0, player ) ) + { + target["entity"] = player; + target["offset"] = vectorscale( ( 0, 0, 1 ), 50.0 ); + return target; + } + + if ( acceptexposedtosky && cointoss() ) + { + end = player.origin + vectorscale( ( 0, 0, 1 ), 2048.0 ); + + if ( bullettracepassed( player.origin, end, 0, player ) ) + { + target["entity"] = player; + target["offset"] = vectorscale( ( 0, 0, 1 ), 30.0 ); + return target; + } + } + } + + return undefined; } create_player_targeting_array( owner, team ) { - level.playertargetedtimes = []; - players = get_players(); - _a739 = players; - _k739 = getFirstArrayKey( _a739 ); - while ( isDefined( _k739 ) ) - { - player = _a739[ _k739 ]; - if ( !player_valid_target( player, team, owner ) ) - { - } - else - { - level.playertargetedtimes[ player.clientid ] = 0; - } - _k739 = getNextArrayKey( _a739, _k739 ); - } + level.playertargetedtimes = []; + players = get_players(); + + foreach ( player in players ) + { + if ( !player_valid_target( player, team, owner ) ) + continue; + + level.playertargetedtimes[player.clientid] = 0; + } } projectile_find_random_player( owner, team ) { - players = get_players(); - lowest = 10000; - _a757 = players; - _k757 = getFirstArrayKey( _a757 ); - while ( isDefined( _k757 ) ) - { - player = _a757[ _k757 ]; - if ( !player_valid_target( player, team, owner ) ) - { - } - else - { - if ( !isDefined( level.playertargetedtimes[ player.clientid ] ) ) - { - level.playertargetedtimes[ player.clientid ] = 0; - } - if ( level.playertargetedtimes[ player.clientid ] < lowest || level.playertargetedtimes[ player.clientid ] == lowest && randomint( 100 ) > 50 ) - { - target = player; - lowest = level.playertargetedtimes[ player.clientid ]; - } - } - _k757 = getNextArrayKey( _a757, _k757 ); - } - if ( isDefined( target ) ) - { - level.playertargetedtimes[ target.clientid ] += 1; - return target; - } - return undefined; + players = get_players(); + lowest = 10000; + + foreach ( player in players ) + { + if ( !player_valid_target( player, team, owner ) ) + continue; + + if ( !isdefined( level.playertargetedtimes[player.clientid] ) ) + level.playertargetedtimes[player.clientid] = 0; + + if ( level.playertargetedtimes[player.clientid] < lowest || level.playertargetedtimes[player.clientid] == lowest && randomint( 100 ) > 50 ) + { + target = player; + lowest = level.playertargetedtimes[player.clientid]; + } + } + + if ( isdefined( target ) ) + { + level.playertargetedtimes[target.clientid] += 1; + return target; + } + + return undefined; } player_valid_target( player, team, owner ) { - if ( player.sessionstate != "playing" ) - { - return 0; - } - if ( !isalive( player ) ) - { - return 0; - } - if ( player == owner ) - { - return 0; - } - if ( level.teambased ) - { - if ( team == player.team ) - { - return 0; - } - } - if ( player cantargetplayerwithspecialty() == 0 ) - { - return 0; - } - if ( isDefined( player.lastspawntime ) && ( getTime() - player.lastspawntime ) < 3000 ) - { - return 0; - } + if ( player.sessionstate != "playing" ) + return false; + + if ( !isalive( player ) ) + return false; + + if ( player == owner ) + return false; + + if ( level.teambased ) + { + if ( team == player.team ) + return false; + } + + if ( player cantargetplayerwithspecialty() == 0 ) + return false; + + if ( isdefined( player.lastspawntime ) && gettime() - player.lastspawntime < 3000 ) + return false; /# - if ( player isinmovemode( "ufo", "noclip" ) ) - { - return 0; + if ( player isinmovemode( "ufo", "noclip" ) ) + return false; #/ - } - return 1; + return true; } diff --git a/Multiplayer Core/patch_mp/maps/mp/killstreaks/_planemortar.gsc b/Multiplayer Core/patch_mp/maps/mp/killstreaks/_planemortar.gsc index e3b61b1..f8342c1 100644 --- a/Multiplayer Core/patch_mp/maps/mp/killstreaks/_planemortar.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/killstreaks/_planemortar.gsc @@ -1,367 +1,350 @@ -#include maps/mp/_challenges; -#include maps/mp/_scoreevents; -#include maps/mp/gametypes/_spawning; -#include maps/mp/killstreaks/_killstreakrules; -#include maps/mp/killstreaks/_killstreaks; -#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\_killstreaks; +#include maps\mp\killstreaks\_killstreakrules; +#include maps\mp\gametypes\_spawning; +#include maps\mp\_scoreevents; +#include maps\mp\_challenges; init() { - precachemodel( "veh_t6_air_fa38_killstreak" ); - precachemodel( "veh_t6_air_fa38_killstreak_alt" ); - precachelocationselector( "map_mortar_selector" ); - level.planemortarexhaustfx = loadfx( "vehicle/exhaust/fx_exhaust_f35_afterburner" ); - registerclientfield( "scriptmover", "planemortar_contrail", 1, 1, "int" ); - maps/mp/killstreaks/_killstreaks::registerkillstreak( "planemortar_mp", "planemortar_mp", "killstreak_planemortar", "planemortar_used", ::usekillstreakplanemortar, 1 ); - maps/mp/killstreaks/_killstreaks::registerkillstreakstrings( "planemortar_mp", &"MP_EARNED_PLANEMORTAR", &"KILLSTREAK_PLANEMORTAR_NOT_AVAILABLE", &"MP_WAR_PLANEMORTAR_INBOUND", &"MP_WAR_PLANEMORTAR_INBOUND_NEAR_YOUR_POSITION" ); - maps/mp/killstreaks/_killstreaks::registerkillstreakdialog( "planemortar_mp", "mpl_killstreak_planemortar", "kls_planemortar_used", "", "kls_planemortar_enemy", "", "kls_planemortar_ready" ); - maps/mp/killstreaks/_killstreaks::registerkillstreakdevdvar( "planemortar_mp", "scr_giveplanemortar" ); - maps/mp/killstreaks/_killstreaks::setkillstreakteamkillpenaltyscale( "planemortar_mp", level.teamkillreducedpenalty ); + precachemodel( "veh_t6_air_fa38_killstreak" ); + precachemodel( "veh_t6_air_fa38_killstreak_alt" ); + precachelocationselector( "map_mortar_selector" ); + level.planemortarexhaustfx = loadfx( "vehicle/exhaust/fx_exhaust_f35_afterburner" ); + registerclientfield( "scriptmover", "planemortar_contrail", 1, 1, "int" ); + maps\mp\killstreaks\_killstreaks::registerkillstreak( "planemortar_mp", "planemortar_mp", "killstreak_planemortar", "planemortar_used", ::usekillstreakplanemortar, 1 ); + maps\mp\killstreaks\_killstreaks::registerkillstreakstrings( "planemortar_mp", &"MP_EARNED_PLANEMORTAR", &"KILLSTREAK_PLANEMORTAR_NOT_AVAILABLE", &"MP_WAR_PLANEMORTAR_INBOUND", &"MP_WAR_PLANEMORTAR_INBOUND_NEAR_YOUR_POSITION" ); + maps\mp\killstreaks\_killstreaks::registerkillstreakdialog( "planemortar_mp", "mpl_killstreak_planemortar", "kls_planemortar_used", "", "kls_planemortar_enemy", "", "kls_planemortar_ready" ); + maps\mp\killstreaks\_killstreaks::registerkillstreakdevdvar( "planemortar_mp", "scr_giveplanemortar" ); + maps\mp\killstreaks\_killstreaks::setkillstreakteamkillpenaltyscale( "planemortar_mp", level.teamkillreducedpenalty ); } usekillstreakplanemortar( hardpointtype ) { - if ( self maps/mp/killstreaks/_killstreakrules::iskillstreakallowed( hardpointtype, self.team ) == 0 ) - { - return 0; - } - self thread playpilotdialog( "a10_used", 1,5 ); - result = self selectplanemortarlocation( hardpointtype ); - if ( !isDefined( result ) || !result ) - { - return 0; - } - return 1; + if ( self maps\mp\killstreaks\_killstreakrules::iskillstreakallowed( hardpointtype, self.team ) == 0 ) + return false; + + self thread playpilotdialog( "a10_used", 1.5 ); + result = self selectplanemortarlocation( hardpointtype ); + + if ( !isdefined( result ) || !result ) + return false; + + return true; } waittill_confirm_location() { - self endon( "emp_jammed" ); - self endon( "emp_grenaded" ); - self waittill( "confirm_location", location ); - return location; + self endon( "emp_jammed" ); + self endon( "emp_grenaded" ); + + self waittill( "confirm_location", location ); + + return location; } selectplanemortarlocation( hardpointtype ) { - self beginlocationmortarselection( "map_mortar_selector", 800 ); - self.selectinglocation = 1; - self thread endselectionthink(); - locations = []; - if ( !isDefined( self.pers[ "mortarRadarUsed" ] ) || !self.pers[ "mortarRadarUsed" ] ) - { - self thread singleradarsweep(); - } - i = 0; - while ( i < 3 ) - { - location = self waittill_confirm_location(); - if ( !isDefined( self ) ) - { - return 0; - } - if ( !isDefined( location ) ) - { - self.pers[ "mortarRadarUsed" ] = 1; - self notify( "cancel_selection" ); - return 0; - } - locations[ i ] = location; - i++; - } - if ( self maps/mp/killstreaks/_killstreakrules::iskillstreakallowed( hardpointtype, self.team ) == 0 ) - { - self.pers[ "mortarRadarUsed" ] = 1; - self notify( "cancel_selection" ); - return 0; - } - self.pers[ "mortarRadarUsed" ] = 0; - return self finishhardpointlocationusage( locations, ::useplanemortar ); + self beginlocationmortarselection( "map_mortar_selector", 800 ); + self.selectinglocation = 1; + self thread endselectionthink(); + locations = []; + + if ( !isdefined( self.pers["mortarRadarUsed"] ) || !self.pers["mortarRadarUsed"] ) + self thread singleradarsweep(); + + for ( i = 0; i < 3; i++ ) + { + location = self waittill_confirm_location(); + + if ( !isdefined( self ) ) + return 0; + + if ( !isdefined( location ) ) + { + self.pers["mortarRadarUsed"] = 1; + self notify( "cancel_selection" ); + return 0; + } + + locations[i] = location; + } + + if ( self maps\mp\killstreaks\_killstreakrules::iskillstreakallowed( hardpointtype, self.team ) == 0 ) + { + self.pers["mortarRadarUsed"] = 1; + self notify( "cancel_selection" ); + return 0; + } + + self.pers["mortarRadarUsed"] = 0; + return self finishhardpointlocationusage( locations, ::useplanemortar ); } playpilotdialog( dialog, waittime ) { - if ( isDefined( waittime ) ) - { - wait waittime; - } - self.pilotvoicenumber = self.bcvoicenumber + 1; - soundalias = level.teamprefix[ self.team ] + self.pilotvoicenumber + "_" + dialog; - while ( isDefined( self ) ) - { - while ( self.pilotisspeaking ) - { - while ( self.pilotisspeaking ) - { - wait 0,2; - } - } - } - if ( isDefined( self ) ) - { - self playlocalsound( soundalias ); - self.pilotisspeaking = 1; - self thread waitplaybacktime( soundalias ); - self waittill_any( soundalias, "death", "disconnect" ); - if ( isDefined( self ) ) - { - self.pilotisspeaking = 0; - } - } + if ( isdefined( waittime ) ) + wait( waittime ); + + self.pilotvoicenumber = self.bcvoicenumber + 1; + soundalias = level.teamprefix[self.team] + self.pilotvoicenumber + "_" + dialog; + + if ( isdefined( self ) ) + { + if ( self.pilotisspeaking ) + { + while ( self.pilotisspeaking ) + wait 0.2; + } + } + + if ( isdefined( self ) ) + { + self playlocalsound( soundalias ); + self.pilotisspeaking = 1; + self thread waitplaybacktime( soundalias ); + self waittill_any( soundalias, "death", "disconnect" ); + + if ( isdefined( self ) ) + self.pilotisspeaking = 0; + } } waitplaybacktime( soundalias ) { - self endon( "death" ); - self endon( "disconnect" ); - playbacktime = soundgetplaybacktime( soundalias ); - if ( playbacktime >= 0 ) - { - waittime = playbacktime * 0,001; - wait waittime; - } - else - { - wait 1; - } - self notify( soundalias ); + self endon( "death" ); + self endon( "disconnect" ); + playbacktime = soundgetplaybacktime( soundalias ); + + if ( playbacktime >= 0 ) + { + waittime = playbacktime * 0.001; + wait( waittime ); + } + else + wait 1.0; + + self notify( soundalias ); } singleradarsweep() { - self endon( "disconnect" ); - self endon( "cancel_selection" ); - wait 0,5; - self playlocalsound( "mpl_killstreak_satellite" ); - if ( level.teambased ) - { - has_satellite = level.activesatellites[ self.team ] > 0; - } - else - { - has_satellite = level.activesatellites[ self.entnum ] > 0; - } - if ( self.hasspyplane == 0 && !has_satellite && !level.forceradar ) - { - self thread doradarsweep(); - } + self endon( "disconnect" ); + self endon( "cancel_selection" ); + wait 0.5; + self playlocalsound( "mpl_killstreak_satellite" ); + + if ( level.teambased ) + has_satellite = level.activesatellites[self.team] > 0; + else + has_satellite = level.activesatellites[self.entnum] > 0; + + if ( self.hasspyplane == 0 && !has_satellite && !level.forceradar ) + self thread doradarsweep(); } doradarsweep() { - self setclientuivisibilityflag( "g_compassShowEnemies", 1 ); - wait 0,2; - self setclientuivisibilityflag( "g_compassShowEnemies", 0 ); + self setclientuivisibilityflag( "g_compassShowEnemies", 1 ); + wait 0.2; + self setclientuivisibilityflag( "g_compassShowEnemies", 0 ); } useplanemortar( positions ) { - team = self.team; - killstreak_id = self maps/mp/killstreaks/_killstreakrules::killstreakstart( "planemortar_mp", team, 0, 1 ); - if ( killstreak_id == -1 ) - { - return 0; - } - self maps/mp/killstreaks/_killstreaks::playkillstreakstartdialog( "planemortar_mp", team, 1 ); - level.globalkillstreakscalled++; - self addweaponstat( "planemortar_mp", "used", 1 ); - self thread planemortar_watchforendnotify( team, killstreak_id ); - self thread doplanemortar( positions, team, killstreak_id ); - return 1; + team = self.team; + killstreak_id = self maps\mp\killstreaks\_killstreakrules::killstreakstart( "planemortar_mp", team, 0, 1 ); + + if ( killstreak_id == -1 ) + return false; + + self maps\mp\killstreaks\_killstreaks::playkillstreakstartdialog( "planemortar_mp", team, 1 ); + level.globalkillstreakscalled++; + self addweaponstat( "planemortar_mp", "used", 1 ); + self thread planemortar_watchforendnotify( team, killstreak_id ); + self thread doplanemortar( positions, team, killstreak_id ); + return true; } doplanemortar( positions, team, killstreak_id ) { - self endon( "emp_jammed" ); - self endon( "disconnect" ); - yaw = randomintrange( 0, 360 ); - odd = 0; - wait 1,25; - _a221 = positions; - _k221 = getFirstArrayKey( _a221 ); - while ( isDefined( _k221 ) ) - { - position = _a221[ _k221 ]; - maps/mp/gametypes/_spawning::create_artillery_influencers( position, -1 ); - self thread dobombrun( position, yaw, team ); - if ( odd == 0 ) - { - yaw = ( yaw + 35 ) % 360; - } - else - { - yaw = ( yaw + 290 ) % 360; - } - odd = ( odd + 1 ) % 2; - wait 0,8; - _k221 = getNextArrayKey( _a221, _k221 ); - } - self notify( "planemortarcomplete" ); - wait 1; - self thread plane_mortar_bda_dialog(); + self endon( "emp_jammed" ); + self endon( "disconnect" ); + yaw = randomintrange( 0, 360 ); + odd = 0; + wait 1.25; + + foreach ( position in positions ) + { + maps\mp\gametypes\_spawning::create_artillery_influencers( position, -1 ); + self thread dobombrun( position, yaw, team ); + + if ( odd == 0 ) + yaw = ( yaw + 35 ) % 360; + else + yaw = ( yaw + 290 ) % 360; + + odd = ( odd + 1 ) % 2; + wait 0.8; + } + + self notify( "planemortarcomplete" ); + wait 1; + self thread plane_mortar_bda_dialog(); } plane_mortar_bda_dialog() { - if ( !isDefined( self.planemortarbda ) ) - { - self.planemortarbda = 0; - } - if ( self.planemortarbda == 0 ) - { - bdadialog = "kls_killn"; - } - if ( self.planemortarbda == 1 ) - { - bdadialog = "kls_kill1"; - } - if ( self.planemortarbda == 2 ) - { - bdadialog = "kls_kill2"; - } - if ( self.planemortarbda == 3 ) - { - bdadialog = "kls_kill3"; - } - if ( self.planemortarbda > 3 ) - { - bdadialog = "kls_killm"; - } - if ( isDefined( bdadialog ) ) - { - self thread playpilotdialog( bdadialog ); - } - self.planemortarbda = 0; + if ( !isdefined( self.planemortarbda ) ) + self.planemortarbda = 0; + + if ( self.planemortarbda == 0 ) + bdadialog = "kls_killn"; + + if ( self.planemortarbda == 1 ) + bdadialog = "kls_kill1"; + + if ( self.planemortarbda == 2 ) + bdadialog = "kls_kill2"; + + if ( self.planemortarbda == 3 ) + bdadialog = "kls_kill3"; + + if ( self.planemortarbda > 3 ) + bdadialog = "kls_killm"; + + if ( isdefined( bdadialog ) ) + self thread playpilotdialog( bdadialog ); + + self.planemortarbda = 0; } planemortar_watchforendnotify( team, killstreak_id ) { - self waittill_any( "disconnect", "joined_team", "joined_spectators", "planemortarcomplete", "emp_jammed" ); - planemortar_killstreakstop( team, killstreak_id ); + self waittill_any( "disconnect", "joined_team", "joined_spectators", "planemortarcomplete", "emp_jammed" ); + planemortar_killstreakstop( team, killstreak_id ); } planemortar_killstreakstop( team, killstreak_id ) { - maps/mp/killstreaks/_killstreakrules::killstreakstop( "planemortar_mp", team, killstreak_id ); + maps\mp\killstreaks\_killstreakrules::killstreakstop( "planemortar_mp", team, killstreak_id ); } dobombrun( position, yaw, team ) { - self endon( "emp_jammed" ); - player = self; - angles = ( 0, yaw, 0 ); - direction = anglesToForward( angles ); - height = maps/mp/killstreaks/_airsupport::getminimumflyheight() + 2000; - position = ( position[ 0 ], position[ 1 ], height ); - startpoint = position + vectorScale( direction, -12000 ); - endpoint = position + vectorScale( direction, 18000 ); - height = getnoflyzoneheightcrossed( startpoint, endpoint, height ); - startpoint = ( startpoint[ 0 ], startpoint[ 1 ], height ); - position = ( position[ 0 ], position[ 1 ], height ); - endpoint = ( endpoint[ 0 ], endpoint[ 1 ], height ); - plane = spawnplane( self, "script_model", startpoint ); - plane.team = team; - plane.targetname = "plane_mortar"; - plane.owner = self; - plane endon( "delete" ); - plane endon( "death" ); - plane thread planewatchforemp( self ); - plane.angles = angles; - plane setmodel( "veh_t6_air_fa38_killstreak" ); - plane setenemymodel( "veh_t6_air_fa38_killstreak_alt" ); - plane setclientfield( "planemortar_contrail", 1 ); - plane playsound( "mpl_lightning_flyover_boom" ); - plane setdrawinfrared( 1 ); - plane.killcament = spawn( "script_model", plane.origin + vectorScale( ( 0, 0, -1 ), 700 ) + vectorScale( direction, -1500 ) ); - plane.killcament deleteaftertime( 2 * 3 ); - plane.killcament.angles = ( 15, yaw, 0 ); - plane.killcament.starttime = getTime(); - plane.killcament linkto( plane ); - start = ( position[ 0 ], position[ 1 ], plane.origin[ 2 ] ); - impact = bullettrace( start, start + vectorScale( ( 0, 0, -1 ), 100000 ), 1, plane ); - plane moveto( endpoint, ( 2 * 5 ) / 4, 0, 0 ); - plane.killcament thread followbomb( plane, position, direction, impact, player ); - wait ( 2 / 2 ); - if ( isDefined( self ) ) - { - self thread dropbomb( plane, position ); - } - wait ( ( 2 * 3 ) / 4 ); - plane plane_cleanupondeath(); + self endon( "emp_jammed" ); + player = self; + angles = ( 0, yaw, 0 ); + direction = anglestoforward( angles ); + height = maps\mp\killstreaks\_airsupport::getminimumflyheight() + 2000; + position = ( position[0], position[1], height ); + startpoint = position + vectorscale( direction, -12000 ); + endpoint = position + vectorscale( direction, 18000.0 ); + height = getnoflyzoneheightcrossed( startpoint, endpoint, height ); + startpoint = ( startpoint[0], startpoint[1], height ); + position = ( position[0], position[1], height ); + endpoint = ( endpoint[0], endpoint[1], height ); + plane = spawnplane( self, "script_model", startpoint ); + plane.team = team; + plane.targetname = "plane_mortar"; + plane.owner = self; + plane endon( "delete" ); + plane endon( "death" ); + plane thread planewatchforemp( self ); + plane.angles = angles; + plane setmodel( "veh_t6_air_fa38_killstreak" ); + plane setenemymodel( "veh_t6_air_fa38_killstreak_alt" ); + plane setclientfield( "planemortar_contrail", 1 ); + plane playsound( "mpl_lightning_flyover_boom" ); + plane setdrawinfrared( 1 ); + plane.killcament = spawn( "script_model", plane.origin + vectorscale( ( 0, 0, 1 ), 700.0 ) + vectorscale( direction, -1500 ) ); + plane.killcament deleteaftertime( 2.0 * 3 ); + plane.killcament.angles = ( 15, yaw, 0 ); + plane.killcament.starttime = gettime(); + plane.killcament linkto( plane ); + start = ( position[0], position[1], plane.origin[2] ); + impact = bullettrace( start, start + vectorscale( ( 0, 0, -1 ), 100000.0 ), 1, plane ); + plane moveto( endpoint, 2.0 * 5 / 4, 0, 0 ); + plane.killcament thread followbomb( plane, position, direction, impact, player ); + wait( 2.0 / 2 ); + + if ( isdefined( self ) ) + self thread dropbomb( plane, position ); + + wait( 2.0 * 3 / 4 ); + plane plane_cleanupondeath(); } followbomb( plane, position, direction, impact, player ) { - player endon( "emp_jammed" ); - wait ( ( 2 * 5 ) / 12 ); - plane.killcament unlink(); - plane.killcament moveto( impact[ "position" ] + vectorScale( ( 0, 0, -1 ), 1000 ) + vectorScale( direction, -600 ), 0,8, 0, 0,2 ); + player endon( "emp_jammed" ); + wait( 2.0 * 5 / 12 ); + plane.killcament unlink(); + plane.killcament moveto( impact["position"] + vectorscale( ( 0, 0, 1 ), 1000.0 ) + vectorscale( direction, -600 ), 0.8, 0, 0.2 ); } lookatexplosion( bomb ) { - while ( isDefined( self ) && isDefined( bomb ) ) - { - angles = vectorToAngle( vectornormalize( bomb.origin - self.origin ) ); - self.angles = ( max( angles[ 0 ], 15 ), angles[ 1 ], angles[ 2 ] ); - wait 0,05; - } + while ( isdefined( self ) && isdefined( bomb ) ) + { + angles = vectortoangles( vectornormalize( bomb.origin - self.origin ) ); + self.angles = ( max( angles[0], 15 ), angles[1], angles[2] ); + wait 0.05; + } } planewatchforemp( owner ) { - self endon( "delete" ); - self endon( "death" ); - self waittill( "emp_deployed", attacker ); - thread planeawardscoreevent( attacker, self ); - self plane_cleanupondeath(); + self endon( "delete" ); + self endon( "death" ); + + self waittill( "emp_deployed", attacker ); + + thread planeawardscoreevent( attacker, self ); + self plane_cleanupondeath(); } planeawardscoreevent( attacker, victim ) { - attacker endon( "disconnect" ); - attacker notify( "planeAwardScoreEvent_singleton" ); - attacker endon( "planeAwardScoreEvent_singleton" ); - waittillframeend; - maps/mp/_scoreevents::processscoreevent( "destroyed_plane_mortar", attacker, victim, "emp_mp" ); - attacker maps/mp/_challenges::addflyswatterstat( "emp_mp" ); + attacker endon( "disconnect" ); + attacker notify( "planeAwardScoreEvent_singleton" ); + attacker endon( "planeAwardScoreEvent_singleton" ); + waittillframeend; + maps\mp\_scoreevents::processscoreevent( "destroyed_plane_mortar", attacker, victim, "emp_mp" ); + attacker maps\mp\_challenges::addflyswatterstat( "emp_mp" ); } plane_cleanupondeath() { - self delete(); + self delete(); } dropbomb( plane, bombposition ) { - if ( !isDefined( plane.owner ) ) - { - return; - } - targets = getplayers(); - _a407 = targets; - _k407 = getFirstArrayKey( _a407 ); - while ( isDefined( _k407 ) ) - { - target = _a407[ _k407 ]; - if ( plane.owner isenemyplayer( target ) && distance2dsquared( target.origin, bombposition ) < 250000 ) - { - if ( bullettracepassed( ( target.origin[ 0 ], target.origin[ 1 ], plane.origin[ 2 ] ), target.origin, 0, plane ) ) - { - bombposition = target.origin; - break; - } - } - else - { - _k407 = getNextArrayKey( _a407, _k407 ); - } - } - bombposition = ( bombposition[ 0 ], bombposition[ 1 ], plane.origin[ 2 ] ); - bomb = self launchbomb( "planemortar_mp", bombposition, vectorScale( ( 0, 0, -1 ), 5000 ) ); - bomb playsound( "mpl_lightning_bomb_incoming" ); - bomb.killcament = plane.killcament; - plane.killcament thread lookatexplosion( bomb ); + if ( !isdefined( plane.owner ) ) + return; + + targets = getplayers(); + + foreach ( target in targets ) + { + if ( plane.owner isenemyplayer( target ) && distance2dsquared( target.origin, bombposition ) < 250000 ) + { + if ( bullettracepassed( ( target.origin[0], target.origin[1], plane.origin[2] ), target.origin, 0, plane ) ) + { + bombposition = target.origin; + break; + } + } + } + + bombposition = ( bombposition[0], bombposition[1], plane.origin[2] ); + bomb = self launchbomb( "planemortar_mp", bombposition, vectorscale( ( 0, 0, -1 ), 5000.0 ) ); + bomb playsound( "mpl_lightning_bomb_incoming" ); + bomb.killcament = plane.killcament; + plane.killcament thread lookatexplosion( bomb ); } diff --git a/Multiplayer Core/patch_mp/maps/mp/killstreaks/_qrdrone.gsc b/Multiplayer Core/patch_mp/maps/mp/killstreaks/_qrdrone.gsc index fd6ae41..66e0598 100644 --- a/Multiplayer Core/patch_mp/maps/mp/killstreaks/_qrdrone.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/killstreaks/_qrdrone.gsc @@ -1,1432 +1,1426 @@ -#include maps/mp/killstreaks/_ai_tank; -#include maps/mp/gametypes/_shellshock; -#include maps/mp/gametypes/_hud; -#include maps/mp/gametypes/_hostmigration; -#include maps/mp/_scoreevents; -#include maps/mp/_challenges; -#include maps/mp/_popups; -#include maps/mp/killstreaks/_remote_weapons; -#include maps/mp/gametypes/_spawning; -#include maps/mp/_heatseekingmissile; -#include maps/mp/killstreaks/_killstreakrules; -#include maps/mp/killstreaks/_airsupport; -#include maps/mp/killstreaks/_killstreaks; -#include maps/mp/_treadfx; -#include common_scripts/utility; -#include maps/mp/gametypes/_hud_util; -#include maps/mp/_utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\_utility; +#include maps\mp\gametypes\_hud_util; +#include common_scripts\utility; +#include maps\mp\_treadfx; +#include maps\mp\killstreaks\_killstreaks; +#include maps\mp\killstreaks\_airsupport; +#include maps\mp\killstreaks\_killstreakrules; +#include maps\mp\gametypes\_weaponobjects; +#include maps\mp\_heatseekingmissile; +#include maps\mp\gametypes\_spawning; +#include maps\mp\killstreaks\_remote_weapons; +#include maps\mp\_popups; +#include maps\mp\_challenges; +#include maps\mp\_scoreevents; +#include maps\mp\gametypes\_hostmigration; +#include maps\mp\gametypes\_hud; +#include maps\mp\gametypes\_shellshock; +#include maps\mp\killstreaks\_ai_tank; init() { - precachemodel( "veh_t6_drone_quad_rotor_mp" ); - precachemodel( "veh_t6_drone_quad_rotor_mp_alt" ); - precachemodel( "veh_t6_drone_quad_rotor_mp" ); - level.qrdrone_vehicle = "qrdrone_mp"; - precachevehicle( level.qrdrone_vehicle ); - precacheitem( "killstreak_qrdrone_mp" ); - precacheshader( "veh_hud_target" ); - precacheshader( "veh_hud_target_marked" ); - precacheshader( "veh_hud_target_unmarked" ); - precacheshader( "compassping_sentry_enemy" ); - precacheshader( "compassping_enemy_uav" ); - precacheshader( "hud_fofbox_hostile_vehicle" ); - precacheshader( "mp_hud_signal_strong" ); - precacheshader( "mp_hud_signal_failure" ); - precacherumble( "damage_light" ); - precachestring( &"MP_REMOTE_UAV_PLACE" ); - precachestring( &"MP_REMOTE_UAV_CANNOT_PLACE" ); - precachestring( &"SPLASHES_DESTROYED_REMOTE_UAV" ); - precachestring( &"SPLASHES_MARKED_BY_REMOTE_UAV" ); - precachestring( &"SPLASHES_REMOTE_UAV_MARKED" ); - precachestring( &"SPLASHES_TURRET_MARKED_BY_REMOTE_UAV" ); - precachestring( &"SPLASHES_REMOTE_UAV_ASSIST" ); - loadfx( "weapon/qr_drone/fx_qr_light_green_3p" ); - loadfx( "weapon/qr_drone/fx_qr_light_red_3p" ); - loadfx( "weapon/qr_drone/fx_qr_light_green_1p" ); - loadfx( "vehicle/treadfx/fx_heli_quadrotor_dust" ); - level.ai_tank_stun_fx = loadfx( "weapon/talon/fx_talon_emp_stun" ); - level.qrdrone_minigun_flash = loadfx( "weapon/muzzleflashes/fx_muz_mg_flash_3p" ); - level.qrdrone_fx[ "explode" ] = loadfx( "weapon/qr_drone/fx_exp_qr_drone" ); - level._effect[ "quadrotor_nudge" ] = loadfx( "weapon/qr_drone/fx_qr_drone_impact_sparks" ); - level._effect[ "quadrotor_damage" ] = loadfx( "weapon/qr_drone/fx_qr_drone_damage_state" ); - level.qrdrone_dialog[ "launch" ][ 0 ] = "ac130_plt_yeahcleared"; - level.qrdrone_dialog[ "launch" ][ 1 ] = "ac130_plt_rollinin"; - level.qrdrone_dialog[ "launch" ][ 2 ] = "ac130_plt_scanrange"; - level.qrdrone_dialog[ "out_of_range" ][ 0 ] = "ac130_plt_cleanup"; - level.qrdrone_dialog[ "out_of_range" ][ 1 ] = "ac130_plt_targetreset"; - level.qrdrone_dialog[ "track" ][ 0 ] = "ac130_fco_moreenemy"; - level.qrdrone_dialog[ "track" ][ 1 ] = "ac130_fco_getthatguy"; - level.qrdrone_dialog[ "track" ][ 2 ] = "ac130_fco_guymovin"; - level.qrdrone_dialog[ "track" ][ 3 ] = "ac130_fco_getperson"; - level.qrdrone_dialog[ "track" ][ 4 ] = "ac130_fco_guyrunnin"; - level.qrdrone_dialog[ "track" ][ 5 ] = "ac130_fco_gotarunner"; - level.qrdrone_dialog[ "track" ][ 6 ] = "ac130_fco_backonthose"; - level.qrdrone_dialog[ "track" ][ 7 ] = "ac130_fco_gonnagethim"; - level.qrdrone_dialog[ "track" ][ 8 ] = "ac130_fco_personnelthere"; - level.qrdrone_dialog[ "track" ][ 9 ] = "ac130_fco_rightthere"; - level.qrdrone_dialog[ "track" ][ 10 ] = "ac130_fco_tracking"; - level.qrdrone_dialog[ "tag" ][ 0 ] = "ac130_fco_nice"; - level.qrdrone_dialog[ "tag" ][ 1 ] = "ac130_fco_yougothim"; - level.qrdrone_dialog[ "tag" ][ 2 ] = "ac130_fco_yougothim2"; - level.qrdrone_dialog[ "tag" ][ 3 ] = "ac130_fco_okyougothim"; - level.qrdrone_dialog[ "assist" ][ 0 ] = "ac130_fco_goodkill"; - level.qrdrone_dialog[ "assist" ][ 1 ] = "ac130_fco_thatsahit"; - level.qrdrone_dialog[ "assist" ][ 2 ] = "ac130_fco_directhit"; - level.qrdrone_dialog[ "assist" ][ 3 ] = "ac130_fco_rightontarget"; - level.qrdrone_lastdialogtime = 0; - level.qrdrone_nodeployzones = getentarray( "no_vehicles", "targetname" ); - level._effect[ "qrdrone_prop" ] = loadfx( "weapon/qr_drone/fx_qr_wash_3p" ); - maps/mp/_treadfx::preloadtreadfx( level.qrdrone_vehicle ); + precachemodel( "veh_t6_drone_quad_rotor_mp" ); + precachemodel( "veh_t6_drone_quad_rotor_mp_alt" ); + precachemodel( "veh_t6_drone_quad_rotor_mp" ); + level.qrdrone_vehicle = "qrdrone_mp"; + precachevehicle( level.qrdrone_vehicle ); + precacheitem( "killstreak_qrdrone_mp" ); + precacheshader( "veh_hud_target" ); + precacheshader( "veh_hud_target_marked" ); + precacheshader( "veh_hud_target_unmarked" ); + precacheshader( "compassping_sentry_enemy" ); + precacheshader( "compassping_enemy_uav" ); + precacheshader( "hud_fofbox_hostile_vehicle" ); + precacheshader( "mp_hud_signal_strong" ); + precacheshader( "mp_hud_signal_failure" ); + precacherumble( "damage_light" ); + precachestring( &"MP_REMOTE_UAV_PLACE" ); + precachestring( &"MP_REMOTE_UAV_CANNOT_PLACE" ); + precachestring( &"SPLASHES_DESTROYED_REMOTE_UAV" ); + precachestring( &"SPLASHES_MARKED_BY_REMOTE_UAV" ); + precachestring( &"SPLASHES_REMOTE_UAV_MARKED" ); + precachestring( &"SPLASHES_TURRET_MARKED_BY_REMOTE_UAV" ); + precachestring( &"SPLASHES_REMOTE_UAV_ASSIST" ); + loadfx( "weapon/qr_drone/fx_qr_light_green_3p" ); + loadfx( "weapon/qr_drone/fx_qr_light_red_3p" ); + loadfx( "weapon/qr_drone/fx_qr_light_green_1p" ); + loadfx( "vehicle/treadfx/fx_heli_quadrotor_dust" ); + level.ai_tank_stun_fx = loadfx( "weapon/talon/fx_talon_emp_stun" ); + level.qrdrone_minigun_flash = loadfx( "weapon/muzzleflashes/fx_muz_mg_flash_3p" ); + level.qrdrone_fx["explode"] = loadfx( "weapon/qr_drone/fx_exp_qr_drone" ); + level._effect["quadrotor_nudge"] = loadfx( "weapon/qr_drone/fx_qr_drone_impact_sparks" ); + level._effect["quadrotor_damage"] = loadfx( "weapon/qr_drone/fx_qr_drone_damage_state" ); + level.qrdrone_dialog["launch"][0] = "ac130_plt_yeahcleared"; + level.qrdrone_dialog["launch"][1] = "ac130_plt_rollinin"; + level.qrdrone_dialog["launch"][2] = "ac130_plt_scanrange"; + level.qrdrone_dialog["out_of_range"][0] = "ac130_plt_cleanup"; + level.qrdrone_dialog["out_of_range"][1] = "ac130_plt_targetreset"; + level.qrdrone_dialog["track"][0] = "ac130_fco_moreenemy"; + level.qrdrone_dialog["track"][1] = "ac130_fco_getthatguy"; + level.qrdrone_dialog["track"][2] = "ac130_fco_guymovin"; + level.qrdrone_dialog["track"][3] = "ac130_fco_getperson"; + level.qrdrone_dialog["track"][4] = "ac130_fco_guyrunnin"; + level.qrdrone_dialog["track"][5] = "ac130_fco_gotarunner"; + level.qrdrone_dialog["track"][6] = "ac130_fco_backonthose"; + level.qrdrone_dialog["track"][7] = "ac130_fco_gonnagethim"; + level.qrdrone_dialog["track"][8] = "ac130_fco_personnelthere"; + level.qrdrone_dialog["track"][9] = "ac130_fco_rightthere"; + level.qrdrone_dialog["track"][10] = "ac130_fco_tracking"; + level.qrdrone_dialog["tag"][0] = "ac130_fco_nice"; + level.qrdrone_dialog["tag"][1] = "ac130_fco_yougothim"; + level.qrdrone_dialog["tag"][2] = "ac130_fco_yougothim2"; + level.qrdrone_dialog["tag"][3] = "ac130_fco_okyougothim"; + level.qrdrone_dialog["assist"][0] = "ac130_fco_goodkill"; + level.qrdrone_dialog["assist"][1] = "ac130_fco_thatsahit"; + level.qrdrone_dialog["assist"][2] = "ac130_fco_directhit"; + level.qrdrone_dialog["assist"][3] = "ac130_fco_rightontarget"; + level.qrdrone_lastdialogtime = 0; + level.qrdrone_nodeployzones = getentarray( "no_vehicles", "targetname" ); + level._effect["qrdrone_prop"] = loadfx( "weapon/qr_drone/fx_qr_wash_3p" ); + maps\mp\_treadfx::preloadtreadfx( level.qrdrone_vehicle ); /# - set_dvar_if_unset( "scr_QRDroneFlyTime", 60 ); + set_dvar_if_unset( "scr_QRDroneFlyTime", 60 ); #/ - shouldtimeout = setdvar( "scr_qrdrone_no_timeout", 0 ); - maps/mp/killstreaks/_killstreaks::registerkillstreak( "qrdrone_mp", "killstreak_qrdrone_mp", "killstreak_qrdrone", "qrdrone_used", ::tryuseqrdrone ); - maps/mp/killstreaks/_killstreaks::registerkillstreakaltweapon( "qrdrone_mp", "qrdrone_turret_mp" ); - maps/mp/killstreaks/_killstreaks::registerkillstreakstrings( "qrdrone_mp", &"KILLSTREAK_EARNED_QRDRONE", &"KILLSTREAK_QRDRONE_NOT_AVAILABLE", &"KILLSTREAK_QRDRONE_INBOUND" ); - maps/mp/killstreaks/_killstreaks::registerkillstreakdialog( "qrdrone_mp", "mpl_killstreak_qrdrone", "kls_recondrone_used", "", "kls_recondrone_enemy", "", "kls_recondrone_ready" ); - maps/mp/killstreaks/_killstreaks::registerkillstreakdevdvar( "qrdrone_mp", "scr_giveqrdrone" ); - maps/mp/killstreaks/_killstreaks::overrideentitycameraindemo( "qrdrone_mp", 1 ); - registerclientfield( "helicopter", "qrdrone_state", 1, 3, "int" ); + shouldtimeout = setdvar( "scr_qrdrone_no_timeout", 0 ); + maps\mp\killstreaks\_killstreaks::registerkillstreak( "qrdrone_mp", "killstreak_qrdrone_mp", "killstreak_qrdrone", "qrdrone_used", ::tryuseqrdrone ); + maps\mp\killstreaks\_killstreaks::registerkillstreakaltweapon( "qrdrone_mp", "qrdrone_turret_mp" ); + maps\mp\killstreaks\_killstreaks::registerkillstreakstrings( "qrdrone_mp", &"KILLSTREAK_EARNED_QRDRONE", &"KILLSTREAK_QRDRONE_NOT_AVAILABLE", &"KILLSTREAK_QRDRONE_INBOUND" ); + maps\mp\killstreaks\_killstreaks::registerkillstreakdialog( "qrdrone_mp", "mpl_killstreak_qrdrone", "kls_recondrone_used", "", "kls_recondrone_enemy", "", "kls_recondrone_ready" ); + maps\mp\killstreaks\_killstreaks::registerkillstreakdevdvar( "qrdrone_mp", "scr_giveqrdrone" ); + maps\mp\killstreaks\_killstreaks::overrideentitycameraindemo( "qrdrone_mp", 1 ); + registerclientfield( "helicopter", "qrdrone_state", 1, 3, "int" ); } tryuseqrdrone( lifeid ) { - if ( self isusingremote() || isDefined( level.nukeincoming ) ) - { - return 0; - } - if ( !self isonground() ) - { - self iprintlnbold( &"KILLSTREAK_QRDRONE_NOT_PLACEABLE" ); - return 0; - } - streakname = "TODO"; - result = self givecarryqrdrone( lifeid, streakname ); - self.iscarrying = 0; - return result; + if ( self isusingremote() || isdefined( level.nukeincoming ) ) + return 0; + + if ( !self isonground() ) + { + self iprintlnbold( &"KILLSTREAK_QRDRONE_NOT_PLACEABLE" ); + return 0; + } + + streakname = "TODO"; + result = self givecarryqrdrone( lifeid, streakname ); + self.iscarrying = 0; + return result; } givecarryqrdrone( lifeid, streakname ) { - carryqrdrone = createcarryqrdrone( streakname, self ); - self setcarryingqrdrone( carryqrdrone ); - if ( isalive( self ) && isDefined( carryqrdrone ) ) - { - origin = carryqrdrone.origin; - angles = self.angles; - carryqrdrone.soundent delete(); - carryqrdrone delete(); - result = self startqrdrone( lifeid, streakname, origin, angles ); - } - else - { - result = 0; - } - return result; + carryqrdrone = createcarryqrdrone( streakname, self ); + self setcarryingqrdrone( carryqrdrone ); + + if ( isalive( self ) && isdefined( carryqrdrone ) ) + { + origin = carryqrdrone.origin; + angles = self.angles; + carryqrdrone.soundent delete(); + carryqrdrone delete(); + result = self startqrdrone( lifeid, streakname, origin, angles ); + } + else + result = 0; + + return result; } createcarryqrdrone( streakname, owner ) { - pos = ( owner.origin + ( anglesToForward( owner.angles ) * 4 ) ) + ( anglesToUp( owner.angles ) * 50 ); - carryqrdrone = spawnturret( "misc_turret", pos, "auto_gun_turret_mp" ); - carryqrdrone.turrettype = "sentry"; - carryqrdrone setturrettype( carryqrdrone.turrettype ); - carryqrdrone.origin = pos; - carryqrdrone.angles = owner.angles; - carryqrdrone.canbeplaced = 1; - carryqrdrone makeunusable(); - carryqrdrone.owner = owner; - carryqrdrone setowner( carryqrdrone.owner ); - carryqrdrone.scale = 3; - carryqrdrone.inheliproximity = 0; - carryqrdrone thread carryqrdrone_handleexistence(); - carryqrdrone.rangetrigger = getent( "qrdrone_range", "targetname" ); - if ( !isDefined( carryqrdrone.rangetrigger ) ) - { - carryqrdrone.maxheight = int( maps/mp/killstreaks/_airsupport::getminimumflyheight() ); - carryqrdrone.maxdistance = 3600; - } - carryqrdrone.minheight = level.mapcenter[ 2 ] - 800; - carryqrdrone.soundent = spawn( "script_origin", carryqrdrone.origin ); - carryqrdrone.soundent.angles = carryqrdrone.angles; - carryqrdrone.soundent.origin = carryqrdrone.origin; - carryqrdrone.soundent linkto( carryqrdrone ); - carryqrdrone.soundent playloopsound( "recondrone_idle_high" ); - return carryqrdrone; + pos = owner.origin + anglestoforward( owner.angles ) * 4 + anglestoup( owner.angles ) * 50; + carryqrdrone = spawnturret( "misc_turret", pos, "auto_gun_turret_mp" ); + carryqrdrone.turrettype = "sentry"; + carryqrdrone setturrettype( carryqrdrone.turrettype ); + carryqrdrone.origin = pos; + carryqrdrone.angles = owner.angles; + carryqrdrone.canbeplaced = 1; + carryqrdrone makeunusable(); + carryqrdrone.owner = owner; + carryqrdrone setowner( carryqrdrone.owner ); + carryqrdrone.scale = 3; + carryqrdrone.inheliproximity = 0; + carryqrdrone thread carryqrdrone_handleexistence(); + carryqrdrone.rangetrigger = getent( "qrdrone_range", "targetname" ); + + if ( !isdefined( carryqrdrone.rangetrigger ) ) + { + carryqrdrone.maxheight = int( maps\mp\killstreaks\_airsupport::getminimumflyheight() ); + carryqrdrone.maxdistance = 3600; + } + + carryqrdrone.minheight = level.mapcenter[2] - 800; + carryqrdrone.soundent = spawn( "script_origin", carryqrdrone.origin ); + carryqrdrone.soundent.angles = carryqrdrone.angles; + carryqrdrone.soundent.origin = carryqrdrone.origin; + carryqrdrone.soundent linkto( carryqrdrone ); + carryqrdrone.soundent playloopsound( "recondrone_idle_high" ); + return carryqrdrone; } watchforattack() { - self endon( "death" ); - self endon( "disconnect" ); - self endon( "place_carryQRDrone" ); - self endon( "cancel_carryQRDrone" ); - for ( ;; ) - { - wait 0,05; - if ( self attackbuttonpressed() ) - { - self notify( "place_carryQRDrone" ); - } - } + self endon( "death" ); + self endon( "disconnect" ); + self endon( "place_carryQRDrone" ); + self endon( "cancel_carryQRDrone" ); + + for (;;) + { + wait 0.05; + + if ( self attackbuttonpressed() ) + self notify( "place_carryQRDrone" ); + } } setcarryingqrdrone( carryqrdrone ) { - self endon( "death" ); - self endon( "disconnect" ); - carryqrdrone thread carryqrdrone_setcarried( self ); - if ( !carryqrdrone.canbeplaced ) - { - if ( self.team != "spectator" ) - { - self iprintlnbold( &"KILLSTREAK_QRDRONE_NOT_PLACEABLE" ); - } - if ( isDefined( carryqrdrone.soundent ) ) - { - carryqrdrone.soundent delete(); - } - carryqrdrone delete(); - return; - } - self.iscarrying = 0; - carryqrdrone.carriedby = undefined; - carryqrdrone playsound( "sentry_gun_plant" ); - carryqrdrone notify( "placed" ); + self endon( "death" ); + self endon( "disconnect" ); + carryqrdrone thread carryqrdrone_setcarried( self ); + + if ( !carryqrdrone.canbeplaced ) + { + if ( self.team != "spectator" ) + self iprintlnbold( &"KILLSTREAK_QRDRONE_NOT_PLACEABLE" ); + + if ( isdefined( carryqrdrone.soundent ) ) + carryqrdrone.soundent delete(); + + carryqrdrone delete(); + return; + } + + self.iscarrying = 0; + carryqrdrone.carriedby = undefined; + carryqrdrone playsound( "sentry_gun_plant" ); + carryqrdrone notify( "placed" ); } carryqrdrone_setcarried( carrier ) { - self setcandamage( 0 ); - self setcontents( 0 ); - self.carriedby = carrier; - carrier.iscarrying = 1; - carrier thread updatecarryqrdroneplacement( self ); - self notify( "carried" ); + self setcandamage( 0 ); + self setcontents( 0 ); + self.carriedby = carrier; + carrier.iscarrying = 1; + carrier thread updatecarryqrdroneplacement( self ); + self notify( "carried" ); } isinremotenodeploy() { - while ( isDefined( level.qrdrone_nodeployzones ) && level.qrdrone_nodeployzones.size ) - { - _a269 = level.qrdrone_nodeployzones; - _k269 = getFirstArrayKey( _a269 ); - while ( isDefined( _k269 ) ) - { - zone = _a269[ _k269 ]; - if ( self istouching( zone ) ) - { - return 1; - } - _k269 = getNextArrayKey( _a269, _k269 ); - } - } - return 0; + if ( isdefined( level.qrdrone_nodeployzones ) && level.qrdrone_nodeployzones.size ) + { + foreach ( zone in level.qrdrone_nodeployzones ) + { + if ( self istouching( zone ) ) + return true; + } + } + + return false; } updatecarryqrdroneplacement( carryqrdrone ) { - self endon( "death" ); - self endon( "disconnect" ); - level endon( "game_ended" ); - carryqrdrone endon( "placed" ); - carryqrdrone endon( "death" ); - carryqrdrone.canbeplaced = 1; - lastcanplacecarryqrdrone = -1; - for ( ;; ) - { - heightoffset = 18; - switch( self getstance() ) - { - case "stand": - heightoffset = 40; - break; - case "crouch": - heightoffset = 25; - break; - case "prone": - heightoffset = 10; - break; - } - placement = self canplayerplacevehicle( 22, 22, 50, heightoffset, 0, 0 ); - carryqrdrone.origin = placement[ "origin" ] + ( anglesToUp( self.angles ) * 27 ); - carryqrdrone.angles = placement[ "angles" ]; - if ( self isonground() && placement[ "result" ] && carryqrdrone qrdrone_in_range() ) - { - carryqrdrone.canbeplaced = !carryqrdrone isinremotenodeploy(); - } - if ( carryqrdrone.canbeplaced != lastcanplacecarryqrdrone ) - { - if ( carryqrdrone.canbeplaced ) - { - if ( self attackbuttonpressed() ) - { - self notify( "place_carryQRDrone" ); - } - break; - } - } - lastcanplacecarryqrdrone = carryqrdrone.canbeplaced; - wait 0,05; - } + self endon( "death" ); + self endon( "disconnect" ); + level endon( "game_ended" ); + carryqrdrone endon( "placed" ); + carryqrdrone endon( "death" ); + carryqrdrone.canbeplaced = 1; + lastcanplacecarryqrdrone = -1; + + for (;;) + { + heightoffset = 18; + + switch ( self getstance() ) + { + case "stand": + heightoffset = 40; + break; + case "crouch": + heightoffset = 25; + break; + case "prone": + heightoffset = 10; + break; + } + + placement = self canplayerplacevehicle( 22, 22, 50, heightoffset, 0, 0 ); + carryqrdrone.origin = placement["origin"] + anglestoup( self.angles ) * 27; + carryqrdrone.angles = placement["angles"]; + carryqrdrone.canbeplaced = self isonground() && placement["result"] && carryqrdrone qrdrone_in_range() && !carryqrdrone isinremotenodeploy(); + + if ( carryqrdrone.canbeplaced != lastcanplacecarryqrdrone ) + { + if ( carryqrdrone.canbeplaced ) + { + if ( self attackbuttonpressed() ) + self notify( "place_carryQRDrone" ); + } + else + { + + } + } + + lastcanplacecarryqrdrone = carryqrdrone.canbeplaced; + wait 0.05; + } } carryqrdrone_handleexistence() { - level endon( "game_ended" ); - self endon( "death" ); - self.owner endon( "place_carryQRDrone" ); - self.owner endon( "cancel_carryQRDrone" ); - self.owner waittill_any( "death", "disconnect", "joined_team", "joined_spectators" ); - if ( isDefined( self ) ) - { - self delete(); - } + level endon( "game_ended" ); + self endon( "death" ); + self.owner endon( "place_carryQRDrone" ); + self.owner endon( "cancel_carryQRDrone" ); + self.owner waittill_any( "death", "disconnect", "joined_team", "joined_spectators" ); + + if ( isdefined( self ) ) + self delete(); } removeremoteweapon() { - level endon( "game_ended" ); - self endon( "disconnect" ); - wait 0,7; + level endon( "game_ended" ); + self endon( "disconnect" ); + wait 0.7; } startqrdrone( lifeid, streakname, origin, angles ) { - self lockplayerforqrdronelaunch(); - self setusingremote( streakname ); - self freezecontrolswrapper( 1 ); - result = self maps/mp/killstreaks/_killstreaks::initridekillstreak( "qrdrone" ); - if ( result != "success" || level.gameended ) - { - if ( result != "disconnect" ) - { - self freezecontrolswrapper( 0 ); - self maps/mp/killstreaks/_killstreakrules::iskillstreakallowed( "qrdrone_mp", self.team ); - self notify( "qrdrone_unlock" ); - self clearusingremote(); - } - return 0; - } - team = self.team; - killstreak_id = self maps/mp/killstreaks/_killstreakrules::killstreakstart( "qrdrone_mp", team, 0, 1 ); - if ( killstreak_id == -1 ) - { - self notify( "qrdrone_unlock" ); - self freezecontrolswrapper( 0 ); - self clearusingremote(); - return 0; - } - self notify( "qrdrone_unlock" ); - qrdrone = createqrdrone( lifeid, self, streakname, origin, angles, killstreak_id ); - self freezecontrolswrapper( 0 ); - if ( isDefined( qrdrone ) ) - { - self thread qrdrone_ride( lifeid, qrdrone, streakname ); - qrdrone waittill( "end_remote" ); - maps/mp/killstreaks/_killstreakrules::killstreakstop( "qrdrone_mp", team, killstreak_id ); - return 1; - } - else - { - self iprintlnbold( &"MP_TOO_MANY_VEHICLES" ); - self clearusingremote(); - maps/mp/killstreaks/_killstreakrules::killstreakstop( "qrdrone_mp", team, killstreak_id ); - return 0; - } + self lockplayerforqrdronelaunch(); + self setusingremote( streakname ); + self freezecontrolswrapper( 1 ); + result = self maps\mp\killstreaks\_killstreaks::initridekillstreak( "qrdrone" ); + + if ( result != "success" || level.gameended ) + { + if ( result != "disconnect" ) + { + self freezecontrolswrapper( 0 ); + self maps\mp\killstreaks\_killstreakrules::iskillstreakallowed( "qrdrone_mp", self.team ); + self notify( "qrdrone_unlock" ); + self clearusingremote(); + } + + return false; + } + + team = self.team; + killstreak_id = self maps\mp\killstreaks\_killstreakrules::killstreakstart( "qrdrone_mp", team, 0, 1 ); + + if ( killstreak_id == -1 ) + { + self notify( "qrdrone_unlock" ); + self freezecontrolswrapper( 0 ); + self clearusingremote(); + return false; + } + + self notify( "qrdrone_unlock" ); + qrdrone = createqrdrone( lifeid, self, streakname, origin, angles, killstreak_id ); + self freezecontrolswrapper( 0 ); + + if ( isdefined( qrdrone ) ) + { + self thread qrdrone_ride( lifeid, qrdrone, streakname ); + + qrdrone waittill( "end_remote" ); + + maps\mp\killstreaks\_killstreakrules::killstreakstop( "qrdrone_mp", team, killstreak_id ); + return true; + } + else + { + self iprintlnbold( &"MP_TOO_MANY_VEHICLES" ); + self clearusingremote(); + maps\mp\killstreaks\_killstreakrules::killstreakstop( "qrdrone_mp", team, killstreak_id ); + return false; + } } lockplayerforqrdronelaunch() { - lockspot = spawn( "script_origin", self.origin ); - lockspot hide(); - self playerlinkto( lockspot ); - self thread clearplayerlockfromqrdronelaunch( lockspot ); + lockspot = spawn( "script_origin", self.origin ); + lockspot hide(); + self playerlinkto( lockspot ); + self thread clearplayerlockfromqrdronelaunch( lockspot ); } clearplayerlockfromqrdronelaunch( lockspot ) { - level endon( "game_ended" ); - msg = self waittill_any_return( "disconnect", "death", "qrdrone_unlock" ); - lockspot delete(); + level endon( "game_ended" ); + msg = self waittill_any_return( "disconnect", "death", "qrdrone_unlock" ); + lockspot delete(); } createqrdrone( lifeid, owner, streakname, origin, angles, killstreak_id ) { - qrdrone = spawnhelicopter( owner, origin, angles, level.qrdrone_vehicle, "veh_t6_drone_quad_rotor_mp" ); - if ( !isDefined( qrdrone ) ) - { - return undefined; - } - qrdrone.lifeid = lifeid; - qrdrone.team = owner.team; - qrdrone.pers[ "team" ] = owner.team; - qrdrone.owner = owner; - qrdrone.health = 999999; - qrdrone.maxhealth = 250; - qrdrone.damagetaken = 0; - qrdrone.destroyed = 0; - qrdrone setcandamage( 1 ); - qrdrone enableaimassist(); - qrdrone.smoking = 0; - qrdrone.inheliproximity = 0; - qrdrone.helitype = "qrdrone"; - qrdrone.markedplayers = []; - qrdrone.isstunned = 0; - qrdrone setenemymodel( "veh_t6_drone_quad_rotor_mp_alt" ); - qrdrone setdrawinfrared( 1 ); - qrdrone.killcament = qrdrone.owner; - owner maps/mp/gametypes/_weaponobjects::addweaponobjecttowatcher( "qrdrone", qrdrone ); - qrdrone thread qrdrone_explode_on_notify( killstreak_id ); - qrdrone thread qrdrone_explode_on_game_end(); - qrdrone thread qrdrone_leave_on_timeout(); - qrdrone thread qrdrone_watch_distance(); - qrdrone thread qrdrone_watch_for_exit(); - qrdrone thread deleteonkillbrush( owner ); - target_set( qrdrone, ( 0, 0, 1 ) ); - target_setturretaquire( qrdrone, 0 ); - qrdrone.numflares = 0; - qrdrone.flareoffset = vectorScale( ( 0, 0, 1 ), 100 ); - qrdrone thread maps/mp/_heatseekingmissile::missiletarget_lockonmonitor( self, "end_remote" ); - qrdrone thread maps/mp/_heatseekingmissile::missiletarget_proximitydetonateincomingmissile( "crashing" ); - qrdrone.emp_fx = spawn( "script_model", self.origin ); - qrdrone.emp_fx setmodel( "tag_origin" ); - qrdrone.emp_fx linkto( self, "tag_origin", vectorScale( ( 0, 0, 1 ), 20 ) + ( anglesToForward( self.angles ) * 6 ) ); - qrdrone maps/mp/gametypes/_spawning::create_qrdrone_influencers( qrdrone.team ); - return qrdrone; + qrdrone = spawnhelicopter( owner, origin, angles, level.qrdrone_vehicle, "veh_t6_drone_quad_rotor_mp" ); + + if ( !isdefined( qrdrone ) ) + return undefined; + + qrdrone.lifeid = lifeid; + qrdrone.team = owner.team; + qrdrone.pers["team"] = owner.team; + qrdrone.owner = owner; + qrdrone.health = 999999; + qrdrone.maxhealth = 250; + qrdrone.damagetaken = 0; + qrdrone.destroyed = 0; + qrdrone setcandamage( 1 ); + qrdrone enableaimassist(); + qrdrone.smoking = 0; + qrdrone.inheliproximity = 0; + qrdrone.helitype = "qrdrone"; + qrdrone.markedplayers = []; + qrdrone.isstunned = 0; + qrdrone setenemymodel( "veh_t6_drone_quad_rotor_mp_alt" ); + qrdrone setdrawinfrared( 1 ); + qrdrone.killcament = qrdrone.owner; + owner maps\mp\gametypes\_weaponobjects::addweaponobjecttowatcher( "qrdrone", qrdrone ); + qrdrone thread qrdrone_explode_on_notify( killstreak_id ); + qrdrone thread qrdrone_explode_on_game_end(); + qrdrone thread qrdrone_leave_on_timeout(); + qrdrone thread qrdrone_watch_distance(); + qrdrone thread qrdrone_watch_for_exit(); + qrdrone thread deleteonkillbrush( owner ); + target_set( qrdrone, ( 0, 0, 0 ) ); + target_setturretaquire( qrdrone, 0 ); + qrdrone.numflares = 0; + qrdrone.flareoffset = vectorscale( ( 0, 0, -1 ), 100.0 ); + qrdrone thread maps\mp\_heatseekingmissile::missiletarget_lockonmonitor( self, "end_remote" ); + qrdrone thread maps\mp\_heatseekingmissile::missiletarget_proximitydetonateincomingmissile( "crashing" ); + qrdrone.emp_fx = spawn( "script_model", self.origin ); + qrdrone.emp_fx setmodel( "tag_origin" ); + qrdrone.emp_fx linkto( self, "tag_origin", vectorscale( ( 0, 0, -1 ), 20.0 ) + anglestoforward( self.angles ) * 6 ); + qrdrone maps\mp\gametypes\_spawning::create_qrdrone_influencers( qrdrone.team ); + return qrdrone; } qrdrone_ride( lifeid, qrdrone, streakname ) { - self.killstreak_waitamount = qrdrone.flytime * 1000; - qrdrone.playerlinked = 1; - self.restoreangles = self.angles; - qrdrone usevehicle( self, 0 ); - self clientnotify( "qrfutz" ); - self maps/mp/killstreaks/_killstreaks::playkillstreakstartdialog( "qrdrone_mp", self.pers[ "team" ] ); - level.globalkillstreakscalled++; - self addweaponstat( "killstreak_qrdrone_mp", "used", 1 ); - self.qrdrone_ridelifeid = lifeid; - self.qrdrone = qrdrone; - self thread qrdrone_delaylaunchdialog( qrdrone ); - self thread qrdrone_fireguns( qrdrone ); - qrdrone thread play_lockon_sounds( self ); - if ( isDefined( level.qrdrone_vision ) ) - { - self setvisionsetwaiter(); - } + self.killstreak_waitamount = qrdrone.flytime * 1000; + qrdrone.playerlinked = 1; + self.restoreangles = self.angles; + qrdrone usevehicle( self, 0 ); + self clientnotify( "qrfutz" ); + self maps\mp\killstreaks\_killstreaks::playkillstreakstartdialog( "qrdrone_mp", self.pers["team"] ); + level.globalkillstreakscalled++; + self addweaponstat( "killstreak_qrdrone_mp", "used", 1 ); + self.qrdrone_ridelifeid = lifeid; + self.qrdrone = qrdrone; + self thread qrdrone_delaylaunchdialog( qrdrone ); + self thread qrdrone_fireguns( qrdrone ); + qrdrone thread play_lockon_sounds( self ); + + if ( isdefined( level.qrdrone_vision ) ) + self setvisionsetwaiter(); } qrdrone_delaylaunchdialog( qrdrone ) { - level endon( "game_ended" ); - self endon( "disconnect" ); - qrdrone endon( "death" ); - qrdrone endon( "end_remote" ); - qrdrone endon( "end_launch_dialog" ); - wait 3; - self qrdrone_dialog( "launch" ); + level endon( "game_ended" ); + self endon( "disconnect" ); + qrdrone endon( "death" ); + qrdrone endon( "end_remote" ); + qrdrone endon( "end_launch_dialog" ); + wait 3; + self qrdrone_dialog( "launch" ); } qrdrone_unlink( qrdrone ) { - if ( isDefined( qrdrone ) ) - { - qrdrone.playerlinked = 0; - self destroyhud(); - if ( isDefined( self.viewlockedentity ) ) - { - self unlink(); - if ( isDefined( level.gameended ) && level.gameended ) - { - self freezecontrolswrapper( 1 ); - } - } - } + if ( isdefined( qrdrone ) ) + { + qrdrone.playerlinked = 0; + self destroyhud(); + + if ( isdefined( self.viewlockedentity ) ) + { + self unlink(); + + if ( isdefined( level.gameended ) && level.gameended ) + self freezecontrolswrapper( 1 ); + } + } } qrdrone_endride( qrdrone ) { - if ( isDefined( qrdrone ) ) - { - qrdrone notify( "end_remote" ); - self clearusingremote(); - if ( level.gameended == 0 ) - { - self.killstreak_waitamount = undefined; - } - self setplayerangles( self.restoreangles ); - if ( isalive( self ) ) - { - self switchtoweapon( self getlastweapon() ); - } - self thread qrdrone_freezebuffer(); - } - self.qrdrone = undefined; + if ( isdefined( qrdrone ) ) + { + qrdrone notify( "end_remote" ); + self clearusingremote(); + + if ( level.gameended == 0 ) + self.killstreak_waitamount = undefined; + + self setplayerangles( self.restoreangles ); + + if ( isalive( self ) ) + self switchtoweapon( self getlastweapon() ); + + self thread qrdrone_freezebuffer(); + } + + self.qrdrone = undefined; } play_lockon_sounds( player ) { - player endon( "disconnect" ); - self endon( "death" ); - self endon( "blowup" ); - self endon( "crashing" ); - level endon( "game_ended" ); - self endon( "end_remote" ); - self.locksounds = spawn( "script_model", self.origin ); - wait 0,1; - self.locksounds linkto( self, "tag_player" ); - while ( 1 ) - { - self waittill( "locking on" ); - while ( 1 ) - { - if ( enemy_locking() ) - { - self.locksounds playsoundtoplayer( "uin_alert_lockon", player ); - wait 0,125; - } - if ( enemy_locked() ) - { - self.locksounds playsoundtoplayer( "uin_alert_lockon", player ); - wait 0,125; - } - if ( !enemy_locking() && !enemy_locked() ) - { - self.locksounds stopsounds(); - break; - } - else - { - } - } - } + player endon( "disconnect" ); + self endon( "death" ); + self endon( "blowup" ); + self endon( "crashing" ); + level endon( "game_ended" ); + self endon( "end_remote" ); + self.locksounds = spawn( "script_model", self.origin ); + wait 0.1; + self.locksounds linkto( self, "tag_player" ); + + while ( true ) + { + self waittill( "locking on" ); + + while ( true ) + { + if ( enemy_locking() ) + { + self.locksounds playsoundtoplayer( "uin_alert_lockon", player ); + wait 0.125; + } + + if ( enemy_locked() ) + { + self.locksounds playsoundtoplayer( "uin_alert_lockon", player ); + wait 0.125; + } + + if ( !enemy_locking() && !enemy_locked() ) + { + self.locksounds stopsounds(); + break; + } + } + } } enemy_locking() { - if ( isDefined( self.locking_on ) && self.locking_on ) - { - return 1; - } - return 0; + if ( isdefined( self.locking_on ) && self.locking_on ) + return true; + + return false; } enemy_locked() { - if ( isDefined( self.locked_on ) && self.locked_on ) - { - return 1; - } - return 0; + if ( isdefined( self.locked_on ) && self.locked_on ) + return true; + + return false; } qrdrone_freezebuffer() { - self endon( "disconnect" ); - self endon( "death" ); - level endon( "game_ended" ); - self freezecontrolswrapper( 1 ); - wait 0,5; - self freezecontrolswrapper( 0 ); + self endon( "disconnect" ); + self endon( "death" ); + level endon( "game_ended" ); + self freezecontrolswrapper( 1 ); + wait 0.5; + self freezecontrolswrapper( 0 ); } qrdrone_playerexit( qrdrone ) { - level endon( "game_ended" ); - self endon( "disconnect" ); - qrdrone endon( "death" ); - qrdrone endon( "end_remote" ); - wait 2; - while ( 1 ) - { - timeused = 0; - while ( self usebuttonpressed() ) - { - timeused += 0,05; - if ( timeused > 0,75 ) - { - qrdrone thread qrdrone_leave(); - return; - } - wait 0,05; - } - wait 0,05; - } + level endon( "game_ended" ); + self endon( "disconnect" ); + qrdrone endon( "death" ); + qrdrone endon( "end_remote" ); + wait 2; + + while ( true ) + { + timeused = 0; + + while ( self usebuttonpressed() ) + { + timeused += 0.05; + + if ( timeused > 0.75 ) + { + qrdrone thread qrdrone_leave(); + return; + } + + wait 0.05; + } + + wait 0.05; + } } touchedkillbrush() { - if ( isDefined( self ) ) - { - self setclientfield( "qrdrone_state", 3 ); - watcher = self.owner maps/mp/gametypes/_weaponobjects::getweaponobjectwatcher( "qrdrone" ); - watcher thread waitanddetonate( self, 0 ); - } + if ( isdefined( self ) ) + { + self setclientfield( "qrdrone_state", 3 ); + watcher = self.owner maps\mp\gametypes\_weaponobjects::getweaponobjectwatcher( "qrdrone" ); + watcher thread waitanddetonate( self, 0.0 ); + } } deleteonkillbrush( player ) { - player endon( "disconnect" ); - self endon( "death" ); - killbrushes = []; - hurt = getentarray( "trigger_hurt", "classname" ); - _a683 = hurt; - _k683 = getFirstArrayKey( _a683 ); - while ( isDefined( _k683 ) ) - { - trig = _a683[ _k683 ]; - if ( trig.origin[ 2 ] <= player.origin[ 2 ] || !isDefined( trig.script_parameters ) && trig.script_parameters != "qrdrone_safe" ) - { - killbrushes[ killbrushes.size ] = trig; - } - _k683 = getNextArrayKey( _a683, _k683 ); - } - crate_triggers = getentarray( "crate_kill_trigger", "targetname" ); - while ( 1 ) - { - i = 0; - while ( i < killbrushes.size ) - { - if ( self istouching( killbrushes[ i ] ) ) - { - self touchedkillbrush(); - return; - } - i++; - } - _a704 = crate_triggers; - _k704 = getFirstArrayKey( _a704 ); - while ( isDefined( _k704 ) ) - { - trigger = _a704[ _k704 ]; - if ( trigger.active && self istouching( trigger ) ) - { - self touchedkillbrush(); - return; - } - _k704 = getNextArrayKey( _a704, _k704 ); - } - while ( isDefined( level.levelkillbrushes ) ) - { - _a715 = level.levelkillbrushes; - _k715 = getFirstArrayKey( _a715 ); - while ( isDefined( _k715 ) ) - { - trigger = _a715[ _k715 ]; - if ( self istouching( trigger ) ) - { - self touchedkillbrush(); - return; - } - _k715 = getNextArrayKey( _a715, _k715 ); - } - } - if ( level.script == "mp_castaway" ) - { - origin = self.origin - vectorScale( ( 0, 0, 1 ), 12 ); - water = getwaterheight( origin ); - if ( ( water - origin[ 2 ] ) > 0 ) - { - self touchedkillbrush(); - return; - } - } - wait 0,1; - } + player endon( "disconnect" ); + self endon( "death" ); + killbrushes = []; + hurt = getentarray( "trigger_hurt", "classname" ); + + foreach ( trig in hurt ) + { + if ( trig.origin[2] <= player.origin[2] && ( !isdefined( trig.script_parameters ) || trig.script_parameters != "qrdrone_safe" ) ) + killbrushes[killbrushes.size] = trig; + } + + crate_triggers = getentarray( "crate_kill_trigger", "targetname" ); + + while ( true ) + { + for ( i = 0; i < killbrushes.size; i++ ) + { + if ( self istouching( killbrushes[i] ) ) + { + self touchedkillbrush(); + return; + } + } + + foreach ( trigger in crate_triggers ) + { + if ( trigger.active && self istouching( trigger ) ) + { + self touchedkillbrush(); + return; + } + } + + if ( isdefined( level.levelkillbrushes ) ) + { + foreach ( trigger in level.levelkillbrushes ) + { + if ( self istouching( trigger ) ) + { + self touchedkillbrush(); + return; + } + } + } + + if ( level.script == "mp_castaway" ) + { + origin = self.origin - vectorscale( ( 0, 0, 1 ), 12.0 ); + water = getwaterheight( origin ); + + if ( water - origin[2] > 0 ) + { + self touchedkillbrush(); + return; + } + } + + wait 0.1; + } } qrdrone_force_destroy() { - self setclientfield( "qrdrone_state", 3 ); - watcher = self.owner maps/mp/gametypes/_weaponobjects::getweaponobjectwatcher( "qrdrone" ); - watcher thread waitanddetonate( self, 0 ); + self setclientfield( "qrdrone_state", 3 ); + watcher = self.owner maps\mp\gametypes\_weaponobjects::getweaponobjectwatcher( "qrdrone" ); + watcher thread waitanddetonate( self, 0.0 ); } qrdrone_get_damage_effect( health_pct ) { - if ( health_pct > 0,5 ) - { - return level._effect[ "quadrotor_damage" ]; - } - return undefined; + if ( health_pct > 0.5 ) + return level._effect["quadrotor_damage"]; + + return undefined; } qrdrone_play_single_fx_on_tag( effect, tag ) { - if ( isDefined( self.damage_fx_ent ) ) - { - if ( self.damage_fx_ent.effect == effect ) - { - return; - } - self.damage_fx_ent delete(); - } - playfxontag( effect, self, "tag_origin" ); + if ( isdefined( self.damage_fx_ent ) ) + { + if ( self.damage_fx_ent.effect == effect ) + return; + + self.damage_fx_ent delete(); + } + + playfxontag( effect, self, "tag_origin" ); } qrdrone_update_damage_fx( health_percent ) { - effect = qrdrone_get_damage_effect( health_percent ); - if ( isDefined( effect ) ) - { - qrdrone_play_single_fx_on_tag( effect, "tag_origin" ); - } - else - { - if ( isDefined( self.damage_fx_ent ) ) - { - self.damage_fx_ent delete(); - } - } + effect = qrdrone_get_damage_effect( health_percent ); + + if ( isdefined( effect ) ) + qrdrone_play_single_fx_on_tag( effect, "tag_origin" ); + else if ( isdefined( self.damage_fx_ent ) ) + self.damage_fx_ent delete(); } qrdrone_damagewatcher() { - self endon( "death" ); - self.maxhealth = 999999; - self.health = self.maxhealth; - self.maxhealth = 225; - low_health = 0; - damage_taken = 0; - for ( ;; ) - { - self waittill( "damage", damage, attacker, dir, point, mod, model, tag, part, weapon, flags ); - if ( !isDefined( attacker ) || !isplayer( attacker ) ) - { - continue; - } - else - { - self.owner playrumbleonentity( "damage_heavy" ); + self endon( "death" ); + self.maxhealth = 999999; + self.health = self.maxhealth; + self.maxhealth = 225; + low_health = 0; + damage_taken = 0; + + for (;;) + { + self waittill( "damage", damage, attacker, dir, point, mod, model, tag, part, weapon, flags ); + + if ( !isdefined( attacker ) || !isplayer( attacker ) ) + continue; + + self.owner playrumbleonentity( "damage_heavy" ); /# - self.damage_debug = ( damage + " (" ) + weapon + ")"; + self.damage_debug = damage + " (" + weapon + ")"; #/ - if ( mod == "MOD_RIFLE_BULLET" || mod == "MOD_PISTOL_BULLET" ) - { - if ( isplayer( attacker ) ) - { - if ( attacker hasperk( "specialty_armorpiercing" ) ) - { - damage += int( damage * level.cac_armorpiercing_data ); - } - } - if ( weaponclass( weapon ) == "spread" ) - { - damage *= 2; - } - } - if ( weapon == "emp_grenade_mp" && mod == "MOD_GRENADE_SPLASH" ) - { - damage_taken += 225; - damage = 0; - } - if ( !self.isstunned ) - { - if ( weapon != "proximity_grenade_mp" && weapon == "proximity_grenade_aoe_mp" || mod == "MOD_GRENADE_SPLASH" && mod == "MOD_GAS" ) - { - self.isstunned = 1; - self qrdrone_stun( 2 ); - } - } - self.attacker = attacker; - self.owner sendkillstreakdamageevent( int( damage ) ); - damage_taken += damage; - if ( damage_taken >= 225 ) - { - self.owner sendkillstreakdamageevent( 200 ); - self qrdrone_death( attacker, weapon, dir, mod ); - return; - break; - } - else - { - qrdrone_update_damage_fx( float( damage_taken ) / 225 ); - } - } - } + if ( mod == "MOD_RIFLE_BULLET" || mod == "MOD_PISTOL_BULLET" ) + { + if ( isplayer( attacker ) ) + { + if ( attacker hasperk( "specialty_armorpiercing" ) ) + damage += int( damage * level.cac_armorpiercing_data ); + } + + if ( weaponclass( weapon ) == "spread" ) + damage *= 2; + } + + if ( weapon == "emp_grenade_mp" && mod == "MOD_GRENADE_SPLASH" ) + { + damage_taken += 225; + damage = 0; + } + + if ( !self.isstunned ) + { + if ( ( weapon == "proximity_grenade_mp" || weapon == "proximity_grenade_aoe_mp" ) && ( mod == "MOD_GRENADE_SPLASH" || mod == "MOD_GAS" ) ) + { + self.isstunned = 1; + self qrdrone_stun( 2 ); + } + } + + self.attacker = attacker; + self.owner sendkillstreakdamageevent( int( damage ) ); + damage_taken += damage; + + if ( damage_taken >= 225 ) + { + self.owner sendkillstreakdamageevent( 200 ); + self qrdrone_death( attacker, weapon, dir, mod ); + return; + continue; + } + + qrdrone_update_damage_fx( float( damage_taken ) / 225 ); + } } qrdrone_stun( duration ) { - self endon( "death" ); - self notify( "stunned" ); - self.owner freezecontrolswrapper( 1 ); - if ( isDefined( self.owner.fullscreen_static ) ) - { - self.owner thread maps/mp/killstreaks/_remote_weapons::stunstaticfx( duration ); - } - wait duration; - self.owner freezecontrolswrapper( 0 ); - self.isstunned = 0; + self endon( "death" ); + self notify( "stunned" ); + self.owner freezecontrolswrapper( 1 ); + + if ( isdefined( self.owner.fullscreen_static ) ) + self.owner thread maps\mp\killstreaks\_remote_weapons::stunstaticfx( duration ); + + wait( duration ); + self.owner freezecontrolswrapper( 0 ); + self.isstunned = 0; } qrdrone_death( attacker, weapon, dir, damagetype ) { - if ( isDefined( self.damage_fx_ent ) ) - { - self.damage_fx_ent delete(); - } - if ( isDefined( attacker ) && isplayer( attacker ) && attacker != self.owner ) - { - level thread maps/mp/_popups::displayteammessagetoall( &"SCORE_DESTROYED_QRDRONE", attacker ); - if ( self.owner isenemyplayer( attacker ) ) - { - attacker maps/mp/_challenges::destroyedqrdrone( damagetype, weapon ); - maps/mp/_scoreevents::processscoreevent( "destroyed_qrdrone", attacker, self.owner, weapon ); - attacker addweaponstat( weapon, "destroyed_qrdrone", 1 ); - attacker maps/mp/_challenges::addflyswatterstat( weapon, self ); - attacker addweaponstat( weapon, "destroyed_controlled_killstreak", 1 ); - } - } - self thread qrdrone_crash_movement( attacker, dir ); - if ( weapon == "emp_grenade_mp" ) - { - playfxontag( level.ai_tank_stun_fx, self.emp_fx, "tag_origin" ); - } - self waittill( "crash_done" ); - if ( isDefined( self.emp_fx ) ) - { - self.emp_fx delete(); - } - self setclientfield( "qrdrone_state", 3 ); - watcher = self.owner maps/mp/gametypes/_weaponobjects::getweaponobjectwatcher( "qrdrone" ); - watcher thread waitanddetonate( self, 0, attacker, weapon ); + if ( isdefined( self.damage_fx_ent ) ) + self.damage_fx_ent delete(); + + if ( isdefined( attacker ) && isplayer( attacker ) && attacker != self.owner ) + { + level thread maps\mp\_popups::displayteammessagetoall( &"SCORE_DESTROYED_QRDRONE", attacker ); + + if ( self.owner isenemyplayer( attacker ) ) + { + attacker maps\mp\_challenges::destroyedqrdrone( damagetype, weapon ); + maps\mp\_scoreevents::processscoreevent( "destroyed_qrdrone", attacker, self.owner, weapon ); + attacker addweaponstat( weapon, "destroyed_qrdrone", 1 ); + attacker maps\mp\_challenges::addflyswatterstat( weapon, self ); + attacker addweaponstat( weapon, "destroyed_controlled_killstreak", 1 ); + } + else + { + + } + } + + self thread qrdrone_crash_movement( attacker, dir ); + + if ( weapon == "emp_grenade_mp" ) + playfxontag( level.ai_tank_stun_fx, self.emp_fx, "tag_origin" ); + + self waittill( "crash_done" ); + + if ( isdefined( self.emp_fx ) ) + self.emp_fx delete(); + + self setclientfield( "qrdrone_state", 3 ); + watcher = self.owner maps\mp\gametypes\_weaponobjects::getweaponobjectwatcher( "qrdrone" ); + watcher thread waitanddetonate( self, 0.0, attacker, weapon ); } death_fx() { - playfxontag( self.deathfx, self, self.deathfxtag ); - self playsound( "veh_qrdrone_sparks" ); + playfxontag( self.deathfx, self, self.deathfxtag ); + self playsound( "veh_qrdrone_sparks" ); } qrdrone_crash_movement( attacker, hitdir ) { - self endon( "crash_done" ); - self endon( "death" ); - self notify( "crashing" ); - self takeplayercontrol(); - self setmaxpitchroll( 90, 180 ); - self setphysacceleration( vectorScale( ( 0, 0, 1 ), 800 ) ); - side_dir = vectorcross( hitdir, ( 0, 0, 1 ) ); - side_dir_mag = randomfloatrange( -100, 100 ); - side_dir_mag += sign( side_dir_mag ) * 80; - side_dir *= side_dir_mag; - velocity = self getvelocity(); - self setvehvelocity( velocity + vectorScale( ( 0, 0, 1 ), 100 ) + vectornormalize( side_dir ) ); - ang_vel = self getangularvelocity(); - ang_vel = ( ang_vel[ 0 ] * 0,3, ang_vel[ 1 ], ang_vel[ 2 ] * 0,3 ); - yaw_vel = randomfloatrange( 0, 210 ) * sign( ang_vel[ 1 ] ); - yaw_vel += sign( yaw_vel ) * 180; - ang_vel += ( randomfloatrange( -100, 100 ), yaw_vel, randomfloatrange( -200, 200 ) ); - self setangularvelocity( ang_vel ); - self.crash_accel = randomfloatrange( 75, 110 ); - self thread qrdrone_crash_accel(); - self thread qrdrone_collision(); - self playsound( "veh_qrdrone_dmg_hit" ); - self thread qrdrone_dmg_snd(); - wait 0,1; - if ( randomint( 100 ) < 40 ) - { - self thread qrdrone_fire_for_time( randomfloatrange( 0,7, 2 ) ); - } - wait 2; - self notify( "crash_done" ); + self endon( "crash_done" ); + self endon( "death" ); + self notify( "crashing" ); + self takeplayercontrol(); + self setmaxpitchroll( 90, 180 ); + self setphysacceleration( vectorscale( ( 0, 0, -1 ), 800.0 ) ); + side_dir = vectorcross( hitdir, ( 0, 0, 1 ) ); + side_dir_mag = randomfloatrange( -100, 100 ); + side_dir_mag += sign( side_dir_mag ) * 80; + side_dir *= side_dir_mag; + velocity = self getvelocity(); + self setvehvelocity( velocity + vectorscale( ( 0, 0, 1 ), 100.0 ) + vectornormalize( side_dir ) ); + ang_vel = self getangularvelocity(); + ang_vel = ( ang_vel[0] * 0.3, ang_vel[1], ang_vel[2] * 0.3 ); + yaw_vel = randomfloatrange( 0, 210 ) * sign( ang_vel[1] ); + yaw_vel += sign( yaw_vel ) * 180; + ang_vel += ( randomfloatrange( -100, 100 ), yaw_vel, randomfloatrange( -200, 200 ) ); + self setangularvelocity( ang_vel ); + self.crash_accel = randomfloatrange( 75, 110 ); + self thread qrdrone_crash_accel(); + self thread qrdrone_collision(); + self playsound( "veh_qrdrone_dmg_hit" ); + self thread qrdrone_dmg_snd(); + wait 0.1; + + if ( randomint( 100 ) < 40 ) + self thread qrdrone_fire_for_time( randomfloatrange( 0.7, 2.0 ) ); + + wait 2; + self notify( "crash_done" ); } qrdrone_dmg_snd() { - dmg_ent = spawn( "script_origin", self.origin ); - dmg_ent linkto( self ); - dmg_ent playloopsound( "veh_qrdrone_dmg_loop" ); - self waittill_any( "crash_done", "death" ); - dmg_ent stoploopsound( 0,2 ); - wait 2; - dmg_ent delete(); + dmg_ent = spawn( "script_origin", self.origin ); + dmg_ent linkto( self ); + dmg_ent playloopsound( "veh_qrdrone_dmg_loop" ); + self waittill_any( "crash_done", "death" ); + dmg_ent stoploopsound( 0.2 ); + wait 2; + dmg_ent delete(); } qrdrone_fire_for_time( totalfiretime ) { - self endon( "crash_done" ); - self endon( "change_state" ); - self endon( "death" ); - weaponname = self seatgetweapon( 0 ); - firetime = weaponfiretime( weaponname ); - time = 0; - firecount = 1; - while ( time < totalfiretime ) - { - self fireweapon( undefined, undefined, firecount % 2 ); - firecount++; - wait firetime; - time += firetime; - } + self endon( "crash_done" ); + self endon( "change_state" ); + self endon( "death" ); + weaponname = self seatgetweapon( 0 ); + firetime = weaponfiretime( weaponname ); + time = 0; + firecount = 1; + + while ( time < totalfiretime ) + { + self fireweapon( undefined, undefined, firecount % 2 ); + firecount++; + wait( firetime ); + time += firetime; + } } qrdrone_crash_accel() { - self endon( "crash_done" ); - self endon( "death" ); - count = 0; - while ( 1 ) - { - velocity = self getvelocity(); - self setvehvelocity( velocity + ( anglesToUp( self.angles ) * self.crash_accel ) ); - self.crash_accel *= 0,98; - wait 0,1; - count++; - if ( ( count % 8 ) == 0 ) - { - if ( randomint( 100 ) > 40 ) - { - if ( velocity[ 2 ] > 150 ) - { - self.crash_accel *= 0,75; - break; - } - else if ( velocity[ 2 ] < 40 && count < 60 ) - { - if ( abs( self.angles[ 0 ] ) > 30 || abs( self.angles[ 2 ] ) > 30 ) - { - self.crash_accel = randomfloatrange( 160, 200 ); - break; - } - else - { - self.crash_accel = randomfloatrange( 85, 120 ); - } - } - } - } - } + self endon( "crash_done" ); + self endon( "death" ); + count = 0; + + while ( true ) + { + velocity = self getvelocity(); + self setvehvelocity( velocity + anglestoup( self.angles ) * self.crash_accel ); + self.crash_accel *= 0.98; + wait 0.1; + count++; + + if ( count % 8 == 0 ) + { + if ( randomint( 100 ) > 40 ) + { + if ( velocity[2] > 150.0 ) + self.crash_accel *= 0.75; + else if ( velocity[2] < 40.0 && count < 60 ) + { + if ( abs( self.angles[0] ) > 30 || abs( self.angles[2] ) > 30 ) + self.crash_accel = randomfloatrange( 160, 200 ); + else + self.crash_accel = randomfloatrange( 85, 120 ); + } + } + } + } } qrdrone_collision() { - self endon( "crash_done" ); - self endon( "death" ); - while ( 1 ) - { - self waittill( "veh_collision", velocity, normal ); - ang_vel = self getangularvelocity() * 0,5; - self setangularvelocity( ang_vel ); - velocity = self getvelocity(); - if ( normal[ 2 ] < 0,7 ) - { - self setvehvelocity( velocity + ( normal * 70 ) ); - self playsound( "veh_qrdrone_wall" ); - playfx( level._effect[ "quadrotor_nudge" ], self.origin ); - continue; - } - else - { - self playsound( "veh_qrdrone_explo" ); - self notify( "crash_done" ); - } - } + self endon( "crash_done" ); + self endon( "death" ); + + while ( true ) + { + self waittill( "veh_collision", velocity, normal ); + + ang_vel = self getangularvelocity() * 0.5; + self setangularvelocity( ang_vel ); + velocity = self getvelocity(); + + if ( normal[2] < 0.7 ) + { + self setvehvelocity( velocity + normal * 70 ); + self playsound( "veh_qrdrone_wall" ); + playfx( level._effect["quadrotor_nudge"], self.origin ); + } + else + { + self playsound( "veh_qrdrone_explo" ); + self notify( "crash_done" ); + } + } } qrdrone_watch_distance() { - self endon( "death" ); - self.owner inithud(); - qrdrone_height = getstruct( "qrdrone_height", "targetname" ); - if ( isDefined( qrdrone_height ) ) - { - self.maxheight = qrdrone_height.origin[ 2 ]; - } - else - { - self.maxheight = int( maps/mp/killstreaks/_airsupport::getminimumflyheight() ); - } - self.maxdistance = 12800; - self.minheight = level.mapcenter[ 2 ] - 800; - self.centerref = spawn( "script_model", level.mapcenter ); - inrangepos = self.origin; - self.rangecountdownactive = 0; - while ( 1 ) - { - if ( !self qrdrone_in_range() ) - { - staticalpha = 0; - while ( !self qrdrone_in_range() ) - { - if ( !self.rangecountdownactive ) - { - self.rangecountdownactive = 1; - self thread qrdrone_rangecountdown(); - } - if ( isDefined( self.heliinproximity ) ) - { - dist = distance( self.origin, self.heliinproximity.origin ); - staticalpha = 1 - ( ( dist - 150 ) / 150 ); - } - else - { - dist = distance( self.origin, inrangepos ); - staticalpha = min( 0,7, dist / 200 ); - } - self.owner set_static_alpha( staticalpha, self ); - wait 0,05; - } - self notify( "in_range" ); - self.rangecountdownactive = 0; - self thread qrdrone_staticfade( staticalpha ); - } - inrangepos = self.origin; - wait 0,05; - } + self endon( "death" ); + self.owner inithud(); + qrdrone_height = getstruct( "qrdrone_height", "targetname" ); + + if ( isdefined( qrdrone_height ) ) + self.maxheight = qrdrone_height.origin[2]; + else + self.maxheight = int( maps\mp\killstreaks\_airsupport::getminimumflyheight() ); + + self.maxdistance = 12800; + self.minheight = level.mapcenter[2] - 800; + self.centerref = spawn( "script_model", level.mapcenter ); + inrangepos = self.origin; + self.rangecountdownactive = 0; + + while ( true ) + { + if ( !self qrdrone_in_range() ) + { + staticalpha = 0; + + while ( !self qrdrone_in_range() ) + { + if ( !self.rangecountdownactive ) + { + self.rangecountdownactive = 1; + self thread qrdrone_rangecountdown(); + } + + if ( isdefined( self.heliinproximity ) ) + { + dist = distance( self.origin, self.heliinproximity.origin ); + staticalpha = 1 - ( dist - 150 ) / 150; + } + else + { + dist = distance( self.origin, inrangepos ); + staticalpha = min( 0.7, dist / 200 ); + } + + self.owner set_static_alpha( staticalpha, self ); + wait 0.05; + } + + self notify( "in_range" ); + self.rangecountdownactive = 0; + self thread qrdrone_staticfade( staticalpha ); + } + + inrangepos = self.origin; + wait 0.05; + } } qrdrone_in_range() { - if ( self.origin[ 2 ] < self.maxheight && self.origin[ 2 ] > self.minheight && !self.inheliproximity ) - { - if ( self ismissileinsideheightlock() ) - { - return 1; - } - } - return 0; + if ( self.origin[2] < self.maxheight && self.origin[2] > self.minheight && !self.inheliproximity ) + { + if ( self ismissileinsideheightlock() ) + return true; + } + + return false; } qrdrone_staticfade( staticalpha ) { - self endon( "death" ); - while ( self qrdrone_in_range() ) - { - staticalpha -= 0,05; - if ( staticalpha < 0 ) - { - self.owner set_static_alpha( staticalpha, self ); - return; - } - else - { - self.owner set_static_alpha( staticalpha, self ); - wait 0,05; - } - } + self endon( "death" ); + + while ( self qrdrone_in_range() ) + { + staticalpha -= 0.05; + + if ( staticalpha < 0 ) + { + self.owner set_static_alpha( staticalpha, self ); + break; + } + + self.owner set_static_alpha( staticalpha, self ); + wait 0.05; + } } qrdrone_rangecountdown() { - self endon( "death" ); - self endon( "in_range" ); - if ( isDefined( self.heliinproximity ) ) - { - countdown = 6,1; - } - else - { - countdown = 6,1; - } - maps/mp/gametypes/_hostmigration::waitlongdurationwithhostmigrationpause( countdown ); - self setclientfield( "qrdrone_state", 3 ); - self.owner notify( "stop_signal_failure" ); - watcher = self.owner maps/mp/gametypes/_weaponobjects::getweaponobjectwatcher( "qrdrone" ); - watcher thread maps/mp/gametypes/_weaponobjects::waitanddetonate( self, 0 ); + self endon( "death" ); + self endon( "in_range" ); + + if ( isdefined( self.heliinproximity ) ) + countdown = 6.1; + else + countdown = 6.1; + + maps\mp\gametypes\_hostmigration::waitlongdurationwithhostmigrationpause( countdown ); + self setclientfield( "qrdrone_state", 3 ); + self.owner notify( "stop_signal_failure" ); + watcher = self.owner maps\mp\gametypes\_weaponobjects::getweaponobjectwatcher( "qrdrone" ); + watcher thread maps\mp\gametypes\_weaponobjects::waitanddetonate( self, 0 ); } qrdrone_explode_on_notify( killstreak_id ) { - self endon( "death" ); - self endon( "end_ride" ); - self.owner waittill_any( "disconnect", "joined_team", "joined_spectators" ); - if ( isDefined( self.owner ) ) - { - self.owner clearusingremote(); - self.owner destroyhud(); - self.owner.killstreak_waitamount = 0; - self.owner qrdrone_endride( self ); - } - else - { - maps/mp/killstreaks/_killstreakrules::killstreakstop( "qrdrone_mp", self.team, killstreak_id ); - } - self setclientfield( "qrdrone_state", 3 ); - watcher = self.owner maps/mp/gametypes/_weaponobjects::getweaponobjectwatcher( "qrdrone" ); - watcher thread maps/mp/gametypes/_weaponobjects::waitanddetonate( self, 0 ); + self endon( "death" ); + self endon( "end_ride" ); + self.owner waittill_any( "disconnect", "joined_team", "joined_spectators" ); + + if ( isdefined( self.owner ) ) + { + self.owner clearusingremote(); + self.owner destroyhud(); + self.owner.killstreak_waitamount = 0; + self.owner qrdrone_endride( self ); + } + else + maps\mp\killstreaks\_killstreakrules::killstreakstop( "qrdrone_mp", self.team, killstreak_id ); + + self setclientfield( "qrdrone_state", 3 ); + watcher = self.owner maps\mp\gametypes\_weaponobjects::getweaponobjectwatcher( "qrdrone" ); + watcher thread maps\mp\gametypes\_weaponobjects::waitanddetonate( self, 0 ); } qrdrone_explode_on_game_end() { - self endon( "death" ); - level waittill( "game_ended" ); - self setclientfield( "qrdrone_state", 3 ); - watcher = self.owner maps/mp/gametypes/_weaponobjects::getweaponobjectwatcher( "qrdrone" ); - watcher maps/mp/gametypes/_weaponobjects::waitanddetonate( self, 0 ); - self.owner qrdrone_endride( self ); + self endon( "death" ); + + level waittill( "game_ended" ); + + self setclientfield( "qrdrone_state", 3 ); + watcher = self.owner maps\mp\gametypes\_weaponobjects::getweaponobjectwatcher( "qrdrone" ); + watcher maps\mp\gametypes\_weaponobjects::waitanddetonate( self, 0 ); + self.owner qrdrone_endride( self ); } qrdrone_leave_on_timeout() { - self endon( "death" ); - if ( !level.vehiclestimed ) - { - return; - } - self.flytime = 60; - waittime = self.flytime - 10; + self endon( "death" ); + + if ( !level.vehiclestimed ) + return; + + self.flytime = 60.0; + waittime = self.flytime - 10; /# - set_dvar_int_if_unset( "scr_QRDroneFlyTime", self.flytime ); - self.flytime = getDvarInt( #"DA835401" ); - waittime = self.flytime - 10; - if ( waittime < 0 ) - { - wait self.flytime; - self setclientfield( "qrdrone_state", 3 ); - watcher = self.owner maps/mp/gametypes/_weaponobjects::getweaponobjectwatcher( "qrdrone" ); - watcher thread maps/mp/gametypes/_weaponobjects::waitanddetonate( self, 0 ); - return; + set_dvar_int_if_unset( "scr_QRDroneFlyTime", self.flytime ); + self.flytime = getdvarint( "scr_QRDroneFlyTime" ); + waittime = self.flytime - 10; + + if ( waittime < 0 ) + { + wait( self.flytime ); + self setclientfield( "qrdrone_state", 3 ); + watcher = self.owner maps\mp\gametypes\_weaponobjects::getweaponobjectwatcher( "qrdrone" ); + watcher thread maps\mp\gametypes\_weaponobjects::waitanddetonate( self, 0 ); + return; + } #/ - } - maps/mp/gametypes/_hostmigration::waitlongdurationwithhostmigrationpause( waittime ); - shouldtimeout = getDvar( "scr_qrdrone_no_timeout" ); - if ( shouldtimeout == "1" ) - { - return; - } - self setclientfield( "qrdrone_state", 1 ); - maps/mp/gametypes/_hostmigration::waitlongdurationwithhostmigrationpause( 6 ); - self setclientfield( "qrdrone_state", 2 ); - maps/mp/gametypes/_hostmigration::waitlongdurationwithhostmigrationpause( 4 ); - self setclientfield( "qrdrone_state", 3 ); - watcher = self.owner maps/mp/gametypes/_weaponobjects::getweaponobjectwatcher( "qrdrone" ); - watcher thread maps/mp/gametypes/_weaponobjects::waitanddetonate( self, 0 ); + maps\mp\gametypes\_hostmigration::waitlongdurationwithhostmigrationpause( waittime ); + shouldtimeout = getdvar( "scr_qrdrone_no_timeout" ); + + if ( shouldtimeout == "1" ) + return; + + self setclientfield( "qrdrone_state", 1 ); + maps\mp\gametypes\_hostmigration::waitlongdurationwithhostmigrationpause( 6 ); + self setclientfield( "qrdrone_state", 2 ); + maps\mp\gametypes\_hostmigration::waitlongdurationwithhostmigrationpause( 4 ); + self setclientfield( "qrdrone_state", 3 ); + watcher = self.owner maps\mp\gametypes\_weaponobjects::getweaponobjectwatcher( "qrdrone" ); + watcher thread maps\mp\gametypes\_weaponobjects::waitanddetonate( self, 0 ); } qrdrone_leave() { - level endon( "game_ended" ); - self endon( "death" ); - self notify( "leaving" ); - self.owner qrdrone_unlink( self ); - self.owner qrdrone_endride( self ); - self notify( "death" ); + level endon( "game_ended" ); + self endon( "death" ); + self notify( "leaving" ); + self.owner qrdrone_unlink( self ); + self.owner qrdrone_endride( self ); + self notify( "death" ); } qrdrone_exit_button_pressed() { - return self usebuttonpressed(); + return self usebuttonpressed(); } qrdrone_watch_for_exit() { - level endon( "game_ended" ); - self endon( "death" ); - self.owner endon( "disconnect" ); - wait 1; - while ( 1 ) - { - timeused = 0; - while ( self.owner qrdrone_exit_button_pressed() ) - { - timeused += 0,05; - if ( timeused > 0,25 ) - { - self setclientfield( "qrdrone_state", 3 ); - watcher = self.owner maps/mp/gametypes/_weaponobjects::getweaponobjectwatcher( "qrdrone" ); - watcher thread waitanddetonate( self, 0, self.owner ); - return; - } - wait 0,05; - } - wait 0,05; - } + level endon( "game_ended" ); + self endon( "death" ); + self.owner endon( "disconnect" ); + wait 1; + + while ( true ) + { + timeused = 0; + + while ( self.owner qrdrone_exit_button_pressed() ) + { + timeused += 0.05; + + if ( timeused > 0.25 ) + { + self setclientfield( "qrdrone_state", 3 ); + watcher = self.owner maps\mp\gametypes\_weaponobjects::getweaponobjectwatcher( "qrdrone" ); + watcher thread waitanddetonate( self, 0.0, self.owner ); + return; + } + + wait 0.05; + } + + wait 0.05; + } } qrdrone_cleanup() { - if ( level.gameended ) - { - return; - } - if ( isDefined( self.owner ) ) - { - if ( self.playerlinked == 1 ) - { - self.owner qrdrone_unlink( self ); - } - self.owner qrdrone_endride( self ); - } - if ( isDefined( self.scrambler ) ) - { - self.scrambler delete(); - } - if ( isDefined( self ) && isDefined( self.centerref ) ) - { - self.centerref delete(); - } - target_setturretaquire( self, 0 ); - if ( isDefined( self.damage_fx_ent ) ) - { - self.damage_fx_ent delete(); - } - if ( isDefined( self.emp_fx ) ) - { - self.emp_fx delete(); - } - self delete(); + if ( level.gameended ) + return; + + if ( isdefined( self.owner ) ) + { + if ( self.playerlinked == 1 ) + self.owner qrdrone_unlink( self ); + + self.owner qrdrone_endride( self ); + } + + if ( isdefined( self.scrambler ) ) + self.scrambler delete(); + + if ( isdefined( self ) && isdefined( self.centerref ) ) + self.centerref delete(); + + target_setturretaquire( self, 0 ); + + if ( isdefined( self.damage_fx_ent ) ) + self.damage_fx_ent delete(); + + if ( isdefined( self.emp_fx ) ) + self.emp_fx delete(); + + self delete(); } qrdrone_light_fx() { - playfxontag( level.chopper_fx[ "light" ][ "belly" ], self, "tag_light_nose" ); - wait 0,05; - playfxontag( level.chopper_fx[ "light" ][ "tail" ], self, "tag_light_tail1" ); + playfxontag( level.chopper_fx["light"]["belly"], self, "tag_light_nose" ); + wait 0.05; + playfxontag( level.chopper_fx["light"]["tail"], self, "tag_light_tail1" ); } qrdrone_dialog( dialoggroup ) { - if ( dialoggroup == "tag" ) - { - waittime = 1000; - } - else - { - waittime = 5000; - } - if ( ( getTime() - level.qrdrone_lastdialogtime ) < waittime ) - { - return; - } - level.qrdrone_lastdialogtime = getTime(); - randomindex = randomint( level.qrdrone_dialog[ dialoggroup ].size ); - soundalias = level.qrdrone_dialog[ dialoggroup ][ randomindex ]; - self playlocalsound( soundalias ); + if ( dialoggroup == "tag" ) + waittime = 1000; + else + waittime = 5000; + + if ( gettime() - level.qrdrone_lastdialogtime < waittime ) + return; + + level.qrdrone_lastdialogtime = gettime(); + randomindex = randomint( level.qrdrone_dialog[dialoggroup].size ); + soundalias = level.qrdrone_dialog[dialoggroup][randomindex]; + self playlocalsound( soundalias ); } qrdrone_watchheliproximity() { - level endon( "game_ended" ); - self endon( "death" ); - self endon( "end_remote" ); - while ( 1 ) - { - inheliproximity = 0; - if ( !self.inheliproximity && inheliproximity ) - { - self.inheliproximity = 1; - } - else - { - if ( self.inheliproximity && !inheliproximity ) - { - self.inheliproximity = 0; - self.heliinproximity = undefined; - } - } - wait 0,05; - } + level endon( "game_ended" ); + self endon( "death" ); + self endon( "end_remote" ); + + while ( true ) + { + inheliproximity = 0; + + if ( !self.inheliproximity && inheliproximity ) + self.inheliproximity = 1; + else if ( self.inheliproximity && !inheliproximity ) + { + self.inheliproximity = 0; + self.heliinproximity = undefined; + } + + wait 0.05; + } } qrdrone_detonatewaiter() { - self.owner endon( "disconnect" ); - self endon( "death" ); - while ( self.owner attackbuttonpressed() ) - { - wait 0,05; - } - watcher = self.owner maps/mp/gametypes/_weaponobjects::getweaponobjectwatcher( "qrdrone" ); - while ( !self.owner attackbuttonpressed() ) - { - wait 0,05; - } - self setclientfield( "qrdrone_state", 3 ); - watcher thread maps/mp/gametypes/_weaponobjects::waitanddetonate( self, 0 ); - self.owner thread maps/mp/gametypes/_hud::fadetoblackforxsec( getDvarFloat( #"CDE26736" ), getDvarFloat( #"AFCAD5CD" ), getDvarFloat( #"88490433" ), getDvarFloat( #"A925AA4E" ) ); + self.owner endon( "disconnect" ); + self endon( "death" ); + + while ( self.owner attackbuttonpressed() ) + wait 0.05; + + watcher = self.owner maps\mp\gametypes\_weaponobjects::getweaponobjectwatcher( "qrdrone" ); + + while ( !self.owner attackbuttonpressed() ) + wait 0.05; + + self setclientfield( "qrdrone_state", 3 ); + watcher thread maps\mp\gametypes\_weaponobjects::waitanddetonate( self, 0 ); + self.owner thread maps\mp\gametypes\_hud::fadetoblackforxsec( getdvarfloat( _hash_CDE26736 ), getdvarfloat( _hash_AFCAD5CD ), getdvarfloat( _hash_88490433 ), getdvarfloat( _hash_A925AA4E ) ); } qrdrone_fireguns( qrdrone ) { - self endon( "disconnect" ); - qrdrone endon( "death" ); - qrdrone endon( "blowup" ); - qrdrone endon( "crashing" ); - level endon( "game_ended" ); - qrdrone endon( "end_remote" ); - wait 1; - while ( 1 ) - { - if ( self attackbuttonpressed() ) - { - qrdrone fireweapon( "tag_flash" ); - firetime = weaponfiretime( "qrdrone_turret_mp" ); - wait firetime; - continue; - } - else - { - wait 0,05; - } - } + self endon( "disconnect" ); + qrdrone endon( "death" ); + qrdrone endon( "blowup" ); + qrdrone endon( "crashing" ); + level endon( "game_ended" ); + qrdrone endon( "end_remote" ); + wait 1; + + while ( true ) + { + if ( self attackbuttonpressed() ) + { + qrdrone fireweapon( "tag_flash" ); + firetime = weaponfiretime( "qrdrone_turret_mp" ); + wait( firetime ); + } + else + wait 0.05; + } } qrdrone_blowup( attacker, weaponname ) { - self.owner endon( "disconnect" ); - self endon( "death" ); - self notify( "blowup" ); - explosionorigin = self.origin; - explosionangles = self.angles; - if ( !isDefined( attacker ) ) - { - attacker = self.owner; - } - origin = self.origin + vectorScale( ( 0, 0, 1 ), 10 ); - radius = 256; - min_damage = 10; - max_damage = 35; - if ( isDefined( attacker ) ) - { - self radiusdamage( origin, radius, max_damage, min_damage, attacker, "MOD_EXPLOSIVE", "qrdrone_turret_mp" ); - } - physicsexplosionsphere( origin, radius, radius, 1, max_damage, min_damage ); - maps/mp/gametypes/_shellshock::rcbomb_earthquake( origin ); - playsoundatposition( "veh_qrdrone_explo", self.origin ); - playfx( level.qrdrone_fx[ "explode" ], explosionorigin, ( 0, 0, 1 ) ); - self hide(); - if ( isDefined( self.owner ) ) - { - self.owner clientnotify( "qrdrone_blowup" ); - if ( attacker != self.owner ) - { - if ( isDefined( weaponname ) ) - { - weaponstatname = "destroyed"; - switch( weaponname ) - { - case "auto_tow_mp": - case "tow_turret_drop_mp": - case "tow_turret_mp": - weaponstatname = "kills"; - break; - } - attacker addweaponstat( weaponname, weaponstatname, 1 ); - level.globalkillstreaksdestroyed++; - attacker addweaponstat( "qrdrone_turret_mp", "destroyed", 1 ); - } - } - self.owner maps/mp/killstreaks/_ai_tank::destroy_remote_hud(); - self.owner freezecontrolswrapper( 1 ); - self.owner sendkillstreakdamageevent( 600 ); - wait 0,75; - self.owner thread maps/mp/gametypes/_hud::fadetoblackforxsec( 0, 0,25, 0,1, 0,25 ); - wait 0,25; - self.owner qrdrone_unlink( self ); - self.owner freezecontrolswrapper( 0 ); - if ( isDefined( self.neverdelete ) && self.neverdelete ) - { - return; - } - } - qrdrone_cleanup(); + self.owner endon( "disconnect" ); + self endon( "death" ); + self notify( "blowup" ); + explosionorigin = self.origin; + explosionangles = self.angles; + + if ( !isdefined( attacker ) ) + attacker = self.owner; + + origin = self.origin + vectorscale( ( 0, 0, 1 ), 10.0 ); + radius = 256; + min_damage = 10; + max_damage = 35; + + if ( isdefined( attacker ) ) + self radiusdamage( origin, radius, max_damage, min_damage, attacker, "MOD_EXPLOSIVE", "qrdrone_turret_mp" ); + + physicsexplosionsphere( origin, radius, radius, 1, max_damage, min_damage ); + maps\mp\gametypes\_shellshock::rcbomb_earthquake( origin ); + playsoundatposition( "veh_qrdrone_explo", self.origin ); + playfx( level.qrdrone_fx["explode"], explosionorigin, ( 0, 0, 1 ) ); + self hide(); + + if ( isdefined( self.owner ) ) + { + self.owner clientnotify( "qrdrone_blowup" ); + + if ( attacker != self.owner ) + { + if ( isdefined( weaponname ) ) + { + weaponstatname = "destroyed"; + + switch ( weaponname ) + { + case "tow_turret_mp": + case "tow_turret_drop_mp": + case "auto_tow_mp": + weaponstatname = "kills"; + break; + } + + attacker addweaponstat( weaponname, weaponstatname, 1 ); + level.globalkillstreaksdestroyed++; + attacker addweaponstat( "qrdrone_turret_mp", "destroyed", 1 ); + } + } + + self.owner maps\mp\killstreaks\_ai_tank::destroy_remote_hud(); + self.owner freezecontrolswrapper( 1 ); + self.owner sendkillstreakdamageevent( 600 ); + wait 0.75; + self.owner thread maps\mp\gametypes\_hud::fadetoblackforxsec( 0, 0.25, 0.1, 0.25 ); + wait 0.25; + self.owner qrdrone_unlink( self ); + self.owner freezecontrolswrapper( 0 ); + + if ( isdefined( self.neverdelete ) && self.neverdelete ) + return; + } + + qrdrone_cleanup(); } setvisionsetwaiter() { - self endon( "disconnect" ); - self useservervisionset( 1 ); - self setvisionsetforplayer( level.qrdrone_vision, 1 ); - self.qrdrone waittill( "end_remote" ); - self useservervisionset( 0 ); + self endon( "disconnect" ); + self useservervisionset( 1 ); + self setvisionsetforplayer( level.qrdrone_vision, 1 ); + + self.qrdrone waittill( "end_remote" ); + + self useservervisionset( 0 ); } inithud() { - self.leaving_play_area = newclienthudelem( self ); - self.leaving_play_area.fontscale = 1,25; - self.leaving_play_area.x = 24; - self.leaving_play_area.y = -44; - self.leaving_play_area.alignx = "right"; - self.leaving_play_area.aligny = "bottom"; - self.leaving_play_area.horzalign = "user_right"; - self.leaving_play_area.vertalign = "user_bottom"; - self.leaving_play_area.hidewhendead = 0; - self.leaving_play_area.hidewheninmenu = 0; - self.leaving_play_area.immunetodemogamehudsettings = 1; - self.leaving_play_area.archived = 0; - self.leaving_play_area.alpha = 0,7; - self.leaving_play_area setshader( "mp_hud_signal_strong", 160, 80 ); + self.leaving_play_area = newclienthudelem( self ); + self.leaving_play_area.fontscale = 1.25; + self.leaving_play_area.x = 24; + self.leaving_play_area.y = -44; + self.leaving_play_area.alignx = "right"; + self.leaving_play_area.aligny = "bottom"; + self.leaving_play_area.horzalign = "user_right"; + self.leaving_play_area.vertalign = "user_bottom"; + self.leaving_play_area.hidewhendead = 0; + self.leaving_play_area.hidewheninmenu = 0; + self.leaving_play_area.immunetodemogamehudsettings = 1; + self.leaving_play_area.archived = 0; + self.leaving_play_area.alpha = 0.7; + self.leaving_play_area setshader( "mp_hud_signal_strong", 160, 80 ); } destroyhud() { - if ( isDefined( self ) ) - { - self notify( "stop_signal_failure" ); - self.flashingsignalfailure = 0; - if ( isDefined( self.leaving_play_area ) ) - { - self.leaving_play_area destroy(); - } - if ( isDefined( self.fullscreen_static ) ) - { - self.fullscreen_static destroy(); - } - self maps/mp/killstreaks/_ai_tank::destroy_remote_hud(); - self clientnotify( "nofutz" ); - } + if ( isdefined( self ) ) + { + self notify( "stop_signal_failure" ); + self.flashingsignalfailure = 0; + + if ( isdefined( self.leaving_play_area ) ) + self.leaving_play_area destroy(); + + if ( isdefined( self.fullscreen_static ) ) + self.fullscreen_static destroy(); + + self maps\mp\killstreaks\_ai_tank::destroy_remote_hud(); + self clientnotify( "nofutz" ); + } } set_static_alpha( alpha, drone ) { - if ( isDefined( self.fullscreen_static ) ) - { - self.fullscreen_static.alpha = alpha; - } - if ( isDefined( self.leaving_play_area ) ) - { - if ( alpha > 0 ) - { - if ( !isDefined( self.flashingsignalfailure ) || !self.flashingsignalfailure ) - { - self thread flash_signal_failure( drone ); - self.flashingsignalfailure = 1; - } - return; - } - else - { - self notify( "stop_signal_failure" ); - self.leaving_play_area setshader( "mp_hud_signal_strong", 160, 80 ); - self.leaving_play_area.alpha = 0,7; - self.flashingsignalfailure = 0; - } - } + if ( isdefined( self.fullscreen_static ) ) + self.fullscreen_static.alpha = alpha; + + if ( isdefined( self.leaving_play_area ) ) + { + if ( alpha > 0 ) + { + if ( !isdefined( self.flashingsignalfailure ) || !self.flashingsignalfailure ) + { + self thread flash_signal_failure( drone ); + self.flashingsignalfailure = 1; + } + } + else + { + self notify( "stop_signal_failure" ); + self.leaving_play_area setshader( "mp_hud_signal_strong", 160, 80 ); + self.leaving_play_area.alpha = 0.7; + self.flashingsignalfailure = 0; + } + } } flash_signal_failure( drone ) { - self endon( "stop_signal_failure" ); - self.leaving_play_area setshader( "mp_hud_signal_failure", 160, 80 ); - i = 0; - for ( ;; ) - { - self.leaving_play_area.alpha = 1; - drone playsoundtoplayer( "uin_alert_lockon", self ); - if ( i < 6 ) - { - wait 0,4; - } - else - { - wait 0,2; - } - self.leaving_play_area.alpha = 0; - if ( i < 5 ) - { - wait 0,2; - i++; - continue; - } - else - { - wait 0,1; - } - i++; - } + self endon( "stop_signal_failure" ); + self.leaving_play_area setshader( "mp_hud_signal_failure", 160, 80 ); + i = 0; + + for (;;) + { + self.leaving_play_area.alpha = 1; + drone playsoundtoplayer( "uin_alert_lockon", self ); + + if ( i < 6 ) + wait 0.4; + else + wait 0.2; + + self.leaving_play_area.alpha = 0; + + if ( i < 5 ) + wait 0.2; + else + wait 0.1; + + i++; + } } diff --git a/Multiplayer Core/patch_mp/maps/mp/killstreaks/_radar.gsc b/Multiplayer Core/patch_mp/maps/mp/killstreaks/_radar.gsc index c2d6cf4..332ab4c 100644 --- a/Multiplayer Core/patch_mp/maps/mp/killstreaks/_radar.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/killstreaks/_radar.gsc @@ -1,292 +1,273 @@ -#include maps/mp/_popups; -#include maps/mp/killstreaks/_spyplane; -#include maps/mp/killstreaks/_killstreakrules; -#include maps/mp/killstreaks/_killstreaks; -#include maps/mp/gametypes/_tweakables; -#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\_tweakables; +#include maps\mp\killstreaks\_killstreaks; +#include maps\mp\killstreaks\_killstreakrules; +#include maps\mp\killstreaks\_spyplane; +#include maps\mp\_popups; init() { - setmatchflag( "radar_allies", 0 ); - setmatchflag( "radar_axis", 0 ); - level.spyplane = []; - level.counterspyplane = []; - level.satellite = []; - level.spyplanetype = []; - level.satellitetype = []; - level.radartimers = []; - _a14 = level.teams; - _k14 = getFirstArrayKey( _a14 ); - while ( isDefined( _k14 ) ) - { - team = _a14[ _k14 ]; - level.radartimers[ team ] = getTime(); - _k14 = getNextArrayKey( _a14, _k14 ); - } - level.spyplaneviewtime = 25; - level.counteruavviewtime = 30; - level.radarlongviewtime = 45; - if ( maps/mp/gametypes/_tweakables::gettweakablevalue( "killstreak", "allowradar" ) ) - { - maps/mp/killstreaks/_killstreaks::registerkillstreak( "radar_mp", "radar_mp", "killstreak_spyplane", "uav_used", ::usekillstreakradar ); - maps/mp/killstreaks/_killstreaks::registerkillstreakstrings( "radar_mp", &"KILLSTREAK_EARNED_RADAR", &"KILLSTREAK_RADAR_NOT_AVAILABLE", &"KILLSTREAK_RADAR_INBOUND" ); - maps/mp/killstreaks/_killstreaks::registerkillstreakdialog( "radar_mp", "mpl_killstreak_radar", "kls_u2_used", "", "kls_u2_enemy", "", "kls_u2_ready" ); - maps/mp/killstreaks/_killstreaks::registerkillstreakdevdvar( "radar_mp", "scr_giveradar" ); - maps/mp/killstreaks/_killstreaks::createkillstreaktimer( "radar_mp" ); - } - if ( maps/mp/gametypes/_tweakables::gettweakablevalue( "killstreak", "allowcounteruav" ) ) - { - maps/mp/killstreaks/_killstreaks::registerkillstreak( "counteruav_mp", "counteruav_mp", "killstreak_counteruav", "counteruav_used", ::usekillstreakcounteruav ); - maps/mp/killstreaks/_killstreaks::registerkillstreakstrings( "counteruav_mp", &"KILLSTREAK_EARNED_COUNTERUAV", &"KILLSTREAK_COUNTERUAV_NOT_AVAILABLE", &"KILLSTREAK_COUNTERUAV_INBOUND" ); - maps/mp/killstreaks/_killstreaks::registerkillstreakdialog( "counteruav_mp", "mpl_killstreak_radar", "kls_cu2_used", "", "kls_cu2_enemy", "", "kls_cu2_ready" ); - maps/mp/killstreaks/_killstreaks::registerkillstreakdevdvar( "counteruav_mp", "scr_givecounteruav" ); - maps/mp/killstreaks/_killstreaks::createkillstreaktimer( "counteruav_mp" ); - } - if ( maps/mp/gametypes/_tweakables::gettweakablevalue( "killstreak", "allowradardirection" ) ) - { - maps/mp/killstreaks/_killstreaks::registerkillstreak( "radardirection_mp", "radardirection_mp", "killstreak_spyplane_direction", "uav_used", ::usekillstreaksatellite ); - maps/mp/killstreaks/_killstreaks::registerkillstreakstrings( "radardirection_mp", &"KILLSTREAK_EARNED_SATELLITE", &"KILLSTREAK_SATELLITE_NOT_AVAILABLE", &"KILLSTREAK_SATELLITE_INBOUND" ); - maps/mp/killstreaks/_killstreaks::registerkillstreakdialog( "radardirection_mp", "mpl_killstreak_satellite", "kls_sat_used", "", "kls_sat_enemy", "", "kls_sat_ready" ); - maps/mp/killstreaks/_killstreaks::registerkillstreakdevdvar( "radardirection_mp", "scr_giveradardirection" ); - maps/mp/killstreaks/_killstreaks::createkillstreaktimer( "radardirection_mp" ); - } + setmatchflag( "radar_allies", 0 ); + setmatchflag( "radar_axis", 0 ); + level.spyplane = []; + level.counterspyplane = []; + level.satellite = []; + level.spyplanetype = []; + level.satellitetype = []; + level.radartimers = []; + + foreach ( team in level.teams ) + level.radartimers[team] = gettime(); + + level.spyplaneviewtime = 25; + level.counteruavviewtime = 30; + level.radarlongviewtime = 45; + + if ( maps\mp\gametypes\_tweakables::gettweakablevalue( "killstreak", "allowradar" ) ) + { + maps\mp\killstreaks\_killstreaks::registerkillstreak( "radar_mp", "radar_mp", "killstreak_spyplane", "uav_used", ::usekillstreakradar ); + maps\mp\killstreaks\_killstreaks::registerkillstreakstrings( "radar_mp", &"KILLSTREAK_EARNED_RADAR", &"KILLSTREAK_RADAR_NOT_AVAILABLE", &"KILLSTREAK_RADAR_INBOUND" ); + maps\mp\killstreaks\_killstreaks::registerkillstreakdialog( "radar_mp", "mpl_killstreak_radar", "kls_u2_used", "", "kls_u2_enemy", "", "kls_u2_ready" ); + maps\mp\killstreaks\_killstreaks::registerkillstreakdevdvar( "radar_mp", "scr_giveradar" ); + maps\mp\killstreaks\_killstreaks::createkillstreaktimer( "radar_mp" ); + } + + if ( maps\mp\gametypes\_tweakables::gettweakablevalue( "killstreak", "allowcounteruav" ) ) + { + maps\mp\killstreaks\_killstreaks::registerkillstreak( "counteruav_mp", "counteruav_mp", "killstreak_counteruav", "counteruav_used", ::usekillstreakcounteruav ); + maps\mp\killstreaks\_killstreaks::registerkillstreakstrings( "counteruav_mp", &"KILLSTREAK_EARNED_COUNTERUAV", &"KILLSTREAK_COUNTERUAV_NOT_AVAILABLE", &"KILLSTREAK_COUNTERUAV_INBOUND" ); + maps\mp\killstreaks\_killstreaks::registerkillstreakdialog( "counteruav_mp", "mpl_killstreak_radar", "kls_cu2_used", "", "kls_cu2_enemy", "", "kls_cu2_ready" ); + maps\mp\killstreaks\_killstreaks::registerkillstreakdevdvar( "counteruav_mp", "scr_givecounteruav" ); + maps\mp\killstreaks\_killstreaks::createkillstreaktimer( "counteruav_mp" ); + } + + if ( maps\mp\gametypes\_tweakables::gettweakablevalue( "killstreak", "allowradardirection" ) ) + { + maps\mp\killstreaks\_killstreaks::registerkillstreak( "radardirection_mp", "radardirection_mp", "killstreak_spyplane_direction", "uav_used", ::usekillstreaksatellite ); + maps\mp\killstreaks\_killstreaks::registerkillstreakstrings( "radardirection_mp", &"KILLSTREAK_EARNED_SATELLITE", &"KILLSTREAK_SATELLITE_NOT_AVAILABLE", &"KILLSTREAK_SATELLITE_INBOUND" ); + maps\mp\killstreaks\_killstreaks::registerkillstreakdialog( "radardirection_mp", "mpl_killstreak_satellite", "kls_sat_used", "", "kls_sat_enemy", "", "kls_sat_ready" ); + maps\mp\killstreaks\_killstreaks::registerkillstreakdevdvar( "radardirection_mp", "scr_giveradardirection" ); + maps\mp\killstreaks\_killstreaks::createkillstreaktimer( "radardirection_mp" ); + } } usekillstreakradar( hardpointtype ) { - if ( self maps/mp/killstreaks/_killstreakrules::iskillstreakallowed( hardpointtype, self.team ) == 0 ) - { - return 0; - } - killstreak_id = self maps/mp/killstreaks/_killstreakrules::killstreakstart( hardpointtype, self.team ); - if ( killstreak_id == -1 ) - { - return 0; - } - return self maps/mp/killstreaks/_spyplane::callspyplane( hardpointtype, 0, killstreak_id ); + if ( self maps\mp\killstreaks\_killstreakrules::iskillstreakallowed( hardpointtype, self.team ) == 0 ) + return 0; + + killstreak_id = self maps\mp\killstreaks\_killstreakrules::killstreakstart( hardpointtype, self.team ); + + if ( killstreak_id == -1 ) + return 0; + + return self maps\mp\killstreaks\_spyplane::callspyplane( hardpointtype, 0, killstreak_id ); } usekillstreakcounteruav( hardpointtype ) { - if ( self maps/mp/killstreaks/_killstreakrules::iskillstreakallowed( hardpointtype, self.team ) == 0 ) - { - return 0; - } - killstreak_id = self maps/mp/killstreaks/_killstreakrules::killstreakstart( hardpointtype, self.team ); - if ( killstreak_id == -1 ) - { - return 0; - } - return self maps/mp/killstreaks/_spyplane::callcounteruav( hardpointtype, 0, killstreak_id ); + if ( self maps\mp\killstreaks\_killstreakrules::iskillstreakallowed( hardpointtype, self.team ) == 0 ) + return 0; + + killstreak_id = self maps\mp\killstreaks\_killstreakrules::killstreakstart( hardpointtype, self.team ); + + if ( killstreak_id == -1 ) + return 0; + + return self maps\mp\killstreaks\_spyplane::callcounteruav( hardpointtype, 0, killstreak_id ); } usekillstreaksatellite( hardpointtype ) { - if ( self maps/mp/killstreaks/_killstreakrules::iskillstreakallowed( hardpointtype, self.team ) == 0 ) - { - return 0; - } - killstreak_id = self maps/mp/killstreaks/_killstreakrules::killstreakstart( hardpointtype, self.team ); - if ( killstreak_id == -1 ) - { - return 0; - } - return self maps/mp/killstreaks/_spyplane::callsatellite( hardpointtype, 0, killstreak_id ); + if ( self maps\mp\killstreaks\_killstreakrules::iskillstreakallowed( hardpointtype, self.team ) == 0 ) + return 0; + + killstreak_id = self maps\mp\killstreaks\_killstreakrules::killstreakstart( hardpointtype, self.team ); + + if ( killstreak_id == -1 ) + return 0; + + return self maps\mp\killstreaks\_spyplane::callsatellite( hardpointtype, 0, killstreak_id ); } teamhasspyplane( team ) { - return getteamspyplane( team ) > 0; + return getteamspyplane( team ) > 0; } teamhassatellite( team ) { - return getteamsatellite( team ) > 0; + return getteamsatellite( team ) > 0; } useradaritem( hardpointtype, team, displaymessage ) { - team = self.team; + team = self.team; /# - assert( isDefined( level.players ) ); + assert( isdefined( level.players ) ); #/ - self maps/mp/killstreaks/_killstreaks::playkillstreakstartdialog( hardpointtype, team ); - if ( level.teambased ) - { - if ( !isDefined( level.spyplane[ team ] ) ) - { - level.spyplanetype[ team ] = 0; - } - currenttypespyplane = level.spyplanetype[ team ]; - if ( !isDefined( level.satellitetype[ team ] ) ) - { - level.satellitetype[ team ] = 0; - } - currenttypesatellite = level.satellitetype[ team ]; - } - else - { - if ( !isDefined( self.pers[ "spyplaneType" ] ) ) - { - self.pers[ "spyplaneType" ] = 0; - } - currenttypespyplane = self.pers[ "spyplaneType" ]; - if ( !isDefined( self.pers[ "satelliteType" ] ) ) - { - self.pers[ "satelliteType" ] = 0; - } - currenttypesatellite = self.pers[ "satelliteType" ]; - } - radarviewtype = 0; - normal = 1; - fastsweep = 2; - notifystring = ""; - issatellite = 0; - isradar = 0; - iscounteruav = 0; - viewtime = level.spyplaneviewtime; - switch( hardpointtype ) - { - case "radar_mp": - notifystring = "spyplane"; - isradar = 1; - viewtime = level.spyplaneviewtime; - level.globalkillstreakscalled++; - self addweaponstat( hardpointtype, "used", 1 ); - break; - case "radardirection_mp": - notifystring = "satellite"; - issatellite = 1; - viewtime = level.radarlongviewtime; - level notify( "satelliteInbound" ); - level.globalkillstreakscalled++; - self addweaponstat( hardpointtype, "used", 1 ); - break; - case "counteruav_mp": - notifystring = "counteruav"; - iscounteruav = 1; - viewtime = level.counteruavviewtime; - level.globalkillstreakscalled++; - self addweaponstat( hardpointtype, "used", 1 ); - break; - } - if ( displaymessage ) - { - if ( isDefined( level.killstreaks[ hardpointtype ] ) && isDefined( level.killstreaks[ hardpointtype ].inboundtext ) ) - { - level thread maps/mp/_popups::displaykillstreakteammessagetoall( hardpointtype, self ); - } - } - return viewtime; + self maps\mp\killstreaks\_killstreaks::playkillstreakstartdialog( hardpointtype, team ); + + if ( level.teambased ) + { + if ( !isdefined( level.spyplane[team] ) ) + level.spyplanetype[team] = 0; + + currenttypespyplane = level.spyplanetype[team]; + + if ( !isdefined( level.satellitetype[team] ) ) + level.satellitetype[team] = 0; + + currenttypesatellite = level.satellitetype[team]; + } + else + { + if ( !isdefined( self.pers["spyplaneType"] ) ) + self.pers["spyplaneType"] = 0; + + currenttypespyplane = self.pers["spyplaneType"]; + + if ( !isdefined( self.pers["satelliteType"] ) ) + self.pers["satelliteType"] = 0; + + currenttypesatellite = self.pers["satelliteType"]; + } + + radarviewtype = 0; + normal = 1; + fastsweep = 2; + notifystring = ""; + issatellite = 0; + isradar = 0; + iscounteruav = 0; + viewtime = level.spyplaneviewtime; + + switch ( hardpointtype ) + { + case "radar_mp": + notifystring = "spyplane"; + isradar = 1; + viewtime = level.spyplaneviewtime; + level.globalkillstreakscalled++; + self addweaponstat( hardpointtype, "used", 1 ); + break; + case "radardirection_mp": + notifystring = "satellite"; + issatellite = 1; + viewtime = level.radarlongviewtime; + level notify( "satelliteInbound", team, self ); + level.globalkillstreakscalled++; + self addweaponstat( hardpointtype, "used", 1 ); + break; + case "counteruav_mp": + notifystring = "counteruav"; + iscounteruav = 1; + viewtime = level.counteruavviewtime; + level.globalkillstreakscalled++; + self addweaponstat( hardpointtype, "used", 1 ); + break; + } + + if ( displaymessage ) + { + if ( isdefined( level.killstreaks[hardpointtype] ) && isdefined( level.killstreaks[hardpointtype].inboundtext ) ) + level thread maps\mp\_popups::displaykillstreakteammessagetoall( hardpointtype, self ); + } + + return viewtime; } resetspyplanetypeonend( type ) { - self waittill( type + "_timer_kill" ); - self.pers[ "spyplane" ] = 0; + self waittill( type + "_timer_kill" ); + + self.pers["spyplane"] = 0; } resetsatellitetypeonend( type ) { - self waittill( type + "_timer_kill" ); - self.pers[ "satellite" ] = 0; + self waittill( type + "_timer_kill" ); + + self.pers["satellite"] = 0; } setteamspyplanewrapper( team, value ) { - setteamspyplane( team, value ); - if ( team == "allies" ) - { - setmatchflag( "radar_allies", value ); - } - else - { - if ( team == "axis" ) - { - setmatchflag( "radar_axis", value ); - } - } - while ( level.multiteam == 1 ) - { - _a205 = level.players; - _k205 = getFirstArrayKey( _a205 ); - while ( isDefined( _k205 ) ) - { - player = _a205[ _k205 ]; - if ( player.team == team ) - { - player setclientuivisibilityflag( "radar_client", value ); - } - _k205 = getNextArrayKey( _a205, _k205 ); - } - } - level notify( "radar_status_change" ); + setteamspyplane( team, value ); + + if ( team == "allies" ) + setmatchflag( "radar_allies", value ); + else if ( team == "axis" ) + setmatchflag( "radar_axis", value ); + + if ( level.multiteam == 1 ) + { + foreach ( player in level.players ) + { + if ( player.team == team ) + player setclientuivisibilityflag( "radar_client", value ); + } + } + + level notify( "radar_status_change", team ); } setteamsatellitewrapper( team, value ) { - setteamsatellite( team, value ); - if ( team == "allies" ) - { - setmatchflag( "radar_allies", value ); - } - else - { - if ( team == "axis" ) - { - setmatchflag( "radar_axis", value ); - } - } - while ( level.multiteam == 1 ) - { - _a228 = level.players; - _k228 = getFirstArrayKey( _a228 ); - while ( isDefined( _k228 ) ) - { - player = _a228[ _k228 ]; - if ( player.team == team ) - { - player setclientuivisibilityflag( "radar_client", value ); - } - _k228 = getNextArrayKey( _a228, _k228 ); - } - } - level notify( "radar_status_change" ); + setteamsatellite( team, value ); + + if ( team == "allies" ) + setmatchflag( "radar_allies", value ); + else if ( team == "axis" ) + setmatchflag( "radar_axis", value ); + + if ( level.multiteam == 1 ) + { + foreach ( player in level.players ) + { + if ( player.team == team ) + player setclientuivisibilityflag( "radar_client", value ); + } + } + + level notify( "radar_status_change", team ); } enemyobituarytext( type, numseconds ) { - switch( type ) - { - case "radarupdate_mp": - self iprintln( &"MP_WAR_RADAR_ACQUIRED_UPDATE_ENEMY", numseconds ); - break; - case "radardirection_mp": - self iprintln( &"MP_WAR_RADAR_ACQUIRED_DIRECTION_ENEMY", numseconds ); - break; - case "counteruav_mp": - self iprintln( &"MP_WAR_RADAR_COUNTER_UAV_ACQUIRED_ENEMY", numseconds ); - break; - default: - self iprintln( &"MP_WAR_RADAR_ACQUIRED_ENEMY", numseconds ); - } + switch ( type ) + { + case "radarupdate_mp": + self iprintln( &"MP_WAR_RADAR_ACQUIRED_UPDATE_ENEMY", numseconds ); + break; + case "radardirection_mp": + self iprintln( &"MP_WAR_RADAR_ACQUIRED_DIRECTION_ENEMY", numseconds ); + break; + case "counteruav_mp": + self iprintln( &"MP_WAR_RADAR_COUNTER_UAV_ACQUIRED_ENEMY", numseconds ); + break; + default: + self iprintln( &"MP_WAR_RADAR_ACQUIRED_ENEMY", numseconds ); + } } friendlyobituarytext( type, callingplayer, numseconds ) { - switch( type ) - { - case "radarupdate_mp": - self iprintln( &"MP_WAR_RADAR_UPDATE_ACQUIRED", callingplayer, numseconds ); - break; - case "radardirection_mp": - self iprintln( &"MP_WAR_RADAR_DIRECTION_ACQUIRED", callingplayer, numseconds ); - break; - case "counteruav_mp": - self iprintln( &"MP_WAR_RADAR_COUNTER_UAV_ACQUIRED", numseconds ); - break; - default: - self iprintln( &"MP_WAR_RADAR_ACQUIRED", callingplayer, numseconds ); - } + switch ( type ) + { + case "radarupdate_mp": + self iprintln( &"MP_WAR_RADAR_UPDATE_ACQUIRED", callingplayer, numseconds ); + break; + case "radardirection_mp": + self iprintln( &"MP_WAR_RADAR_DIRECTION_ACQUIRED", callingplayer, numseconds ); + break; + case "counteruav_mp": + self iprintln( &"MP_WAR_RADAR_COUNTER_UAV_ACQUIRED", numseconds ); + break; + default: + self iprintln( &"MP_WAR_RADAR_ACQUIRED", callingplayer, numseconds ); + } } diff --git a/Multiplayer Core/patch_mp/maps/mp/killstreaks/_rcbomb.gsc b/Multiplayer Core/patch_mp/maps/mp/killstreaks/_rcbomb.gsc index 57dcfa4..57a6661 100644 --- a/Multiplayer Core/patch_mp/maps/mp/killstreaks/_rcbomb.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/killstreaks/_rcbomb.gsc @@ -1,792 +1,788 @@ -#include maps/mp/_challenges; -#include maps/mp/gametypes/_shellshock; -#include maps/mp/killstreaks/_emp; -#include maps/mp/gametypes/_hostmigration; -#include maps/mp/gametypes/_hud; -#include maps/mp/_popups; -#include maps/mp/gametypes/_weaponobjects; -#include maps/mp/gametypes/_globallogic_utils; -#include maps/mp/_flashgrenades; -#include maps/mp/_scoreevents; -#include maps/mp/gametypes/_spawning; -#include maps/mp/killstreaks/_killstreakrules; -#include maps/mp/killstreaks/_killstreaks; -#include maps/mp/gametypes/_tweakables; -#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\_treadfx; +#include maps\mp\gametypes\_tweakables; +#include maps\mp\killstreaks\_killstreaks; +#include maps\mp\killstreaks\_killstreakrules; +#include maps\mp\gametypes\_spawning; +#include maps\mp\_scoreevents; +#include maps\mp\_flashgrenades; +#include maps\mp\gametypes\_globallogic_utils; +#include maps\mp\gametypes\_weaponobjects; +#include maps\mp\_popups; +#include maps\mp\gametypes\_hud; +#include maps\mp\gametypes\_hostmigration; +#include maps\mp\killstreaks\_emp; +#include maps\mp\gametypes\_shellshock; +#include maps\mp\_challenges; init() { - precachemodel( "veh_t6_drone_rcxd" ); - precachemodel( "veh_t6_drone_rcxd_alt" ); - precachevehicle( "rc_car_medium_mp" ); - precacherumble( "rcbomb_engine_stutter" ); - precacherumble( "rcbomb_slide" ); - loadtreadfx( "dust" ); - loadtreadfx( "concrete" ); - loadfx( "weapon/grenade/fx_spark_disabled_rc_car" ); - loadfx( "vehicle/light/fx_rcbomb_blinky_light" ); - loadfx( "vehicle/light/fx_rcbomb_solid_light" ); - loadfx( "vehicle/light/fx_rcbomb_light_green_os" ); - loadfx( "vehicle/light/fx_rcbomb_light_red_os" ); - maps/mp/_treadfx::preloadtreadfx( "rc_car_medium_mp" ); - level._effect[ "rcbombexplosion" ] = loadfx( "maps/mp_maps/fx_mp_exp_rc_bomb" ); - car_size = getDvar( "scr_rcbomb_car_size" ); - if ( car_size == "" ) - { - setdvar( "scr_rcbomb_car_size", "1" ); - } - setdvar( "scr_rcbomb_notimeout", 0 ); - if ( maps/mp/gametypes/_tweakables::gettweakablevalue( "killstreak", "allowrcbomb" ) ) - { - maps/mp/killstreaks/_killstreaks::registerkillstreak( "rcbomb_mp", "rcbomb_mp", "killstreak_rcbomb", "rcbomb_used", ::usekillstreakrcbomb ); - maps/mp/killstreaks/_killstreaks::registerkillstreakstrings( "rcbomb_mp", &"KILLSTREAK_EARNED_RCBOMB", &"KILLSTREAK_RCBOMB_NOT_AVAILABLE", &"KILLSTREAK_RCBOMB_INBOUND" ); - maps/mp/killstreaks/_killstreaks::registerkillstreakdialog( "rcbomb_mp", "mpl_killstreak_rcbomb", "kls_rcbomb_used", "", "kls_rcbomb_enemy", "", "kls_rcbomb_ready" ); - maps/mp/killstreaks/_killstreaks::registerkillstreakdevdvar( "rcbomb_mp", "scr_givercbomb" ); - maps/mp/killstreaks/_killstreaks::allowkillstreakassists( "rcbomb_mp", 1 ); - } + precachemodel( "veh_t6_drone_rcxd" ); + precachemodel( "veh_t6_drone_rcxd_alt" ); + precachevehicle( "rc_car_medium_mp" ); + precacherumble( "rcbomb_engine_stutter" ); + precacherumble( "rcbomb_slide" ); + loadtreadfx( "dust" ); + loadtreadfx( "concrete" ); + loadfx( "weapon/grenade/fx_spark_disabled_rc_car" ); + loadfx( "vehicle/light/fx_rcbomb_blinky_light" ); + loadfx( "vehicle/light/fx_rcbomb_solid_light" ); + loadfx( "vehicle/light/fx_rcbomb_light_green_os" ); + loadfx( "vehicle/light/fx_rcbomb_light_red_os" ); + maps\mp\_treadfx::preloadtreadfx( "rc_car_medium_mp" ); + level._effect["rcbombexplosion"] = loadfx( "maps/mp_maps/fx_mp_exp_rc_bomb" ); + car_size = getdvar( "scr_rcbomb_car_size" ); + + if ( car_size == "" ) + setdvar( "scr_rcbomb_car_size", "1" ); + + setdvar( "scr_rcbomb_notimeout", 0 ); + + if ( maps\mp\gametypes\_tweakables::gettweakablevalue( "killstreak", "allowrcbomb" ) ) + { + maps\mp\killstreaks\_killstreaks::registerkillstreak( "rcbomb_mp", "rcbomb_mp", "killstreak_rcbomb", "rcbomb_used", ::usekillstreakrcbomb ); + maps\mp\killstreaks\_killstreaks::registerkillstreakstrings( "rcbomb_mp", &"KILLSTREAK_EARNED_RCBOMB", &"KILLSTREAK_RCBOMB_NOT_AVAILABLE", &"KILLSTREAK_RCBOMB_INBOUND" ); + maps\mp\killstreaks\_killstreaks::registerkillstreakdialog( "rcbomb_mp", "mpl_killstreak_rcbomb", "kls_rcbomb_used", "", "kls_rcbomb_enemy", "", "kls_rcbomb_ready" ); + maps\mp\killstreaks\_killstreaks::registerkillstreakdevdvar( "rcbomb_mp", "scr_givercbomb" ); + maps\mp\killstreaks\_killstreaks::allowkillstreakassists( "rcbomb_mp", 1 ); + } } register() { - registerclientfield( "vehicle", "rcbomb_death", 1, 1, "int" ); - registerclientfield( "vehicle", "rcbomb_countdown", 1, 2, "int" ); + registerclientfield( "vehicle", "rcbomb_death", 1, 1, "int" ); + registerclientfield( "vehicle", "rcbomb_countdown", 1, 2, "int" ); } loadtreadfx( type ) { - loadfx( "vehicle/treadfx/fx_treadfx_rcbomb_" + type ); - loadfx( "vehicle/treadfx/fx_treadfx_rcbomb_" + type + "_drift" ); - loadfx( "vehicle/treadfx/fx_treadfx_rcbomb_" + type + "_peel" ); - loadfx( "vehicle/treadfx/fx_treadfx_rcbomb_" + type + "_first_person" ); - loadfx( "vehicle/treadfx/fx_treadfx_rcbomb_" + type + "_reverse" ); - loadfx( "vehicle/treadfx/fx_treadfx_rcbomb_" + type + "_trail" ); - loadfx( "vehicle/treadfx/fx_treadfx_rcbomb_" + type + "_slow" ); + loadfx( "vehicle/treadfx/fx_treadfx_rcbomb_" + type ); + loadfx( "vehicle/treadfx/fx_treadfx_rcbomb_" + type + "_drift" ); + loadfx( "vehicle/treadfx/fx_treadfx_rcbomb_" + type + "_peel" ); + loadfx( "vehicle/treadfx/fx_treadfx_rcbomb_" + type + "_first_person" ); + loadfx( "vehicle/treadfx/fx_treadfx_rcbomb_" + type + "_reverse" ); + loadfx( "vehicle/treadfx/fx_treadfx_rcbomb_" + type + "_trail" ); + loadfx( "vehicle/treadfx/fx_treadfx_rcbomb_" + type + "_slow" ); } usekillstreakrcbomb( hardpointtype ) { - if ( self maps/mp/killstreaks/_killstreakrules::iskillstreakallowed( hardpointtype, self.team ) == 0 ) - { - return 0; - } - if ( !self isonground() || self isusingremote() ) - { - self iprintlnbold( &"KILLSTREAK_RCBOMB_NOT_PLACEABLE" ); - return 0; - } - placement = self.rcbombplacement; - if ( !isDefined( placement ) ) - { - placement = getrcbombplacement(); - } - if ( !isDefined( placement ) ) - { - self iprintlnbold( &"KILLSTREAK_RCBOMB_NOT_PLACEABLE" ); - return 0; - } - if ( maps/mp/killstreaks/_killstreaks::isinteractingwithobject() ) - { - self iprintlnbold( &"KILLSTREAK_RCBOMB_NOT_PLACEABLE" ); - return 0; - } - self setusingremote( "rcbomb" ); - self freezecontrolswrapper( 1 ); - result = self maps/mp/killstreaks/_killstreaks::initridekillstreak( "rcbomb" ); - if ( result != "success" ) - { - if ( result != "disconnect" ) - { - self clearusingremote(); - } - return 0; - } - if ( level.gameended ) - { - return 0; - } - ret = self usercbomb( placement ); - if ( !isDefined( ret ) && level.gameended ) - { - ret = 1; - } - else - { - if ( !isDefined( ret ) ) - { - ret = 0; - } - } - if ( isDefined( self ) ) - { - self clearusingremote(); - } - return ret; + if ( self maps\mp\killstreaks\_killstreakrules::iskillstreakallowed( hardpointtype, self.team ) == 0 ) + return 0; + + if ( !self isonground() || self isusingremote() ) + { + self iprintlnbold( &"KILLSTREAK_RCBOMB_NOT_PLACEABLE" ); + return 0; + } + + placement = self.rcbombplacement; + + if ( !isdefined( placement ) ) + placement = getrcbombplacement(); + + if ( !isdefined( placement ) ) + { + self iprintlnbold( &"KILLSTREAK_RCBOMB_NOT_PLACEABLE" ); + return 0; + } + + if ( maps\mp\killstreaks\_killstreaks::isinteractingwithobject() ) + { + self iprintlnbold( &"KILLSTREAK_RCBOMB_NOT_PLACEABLE" ); + return 0; + } + + self setusingremote( "rcbomb" ); + self freezecontrolswrapper( 1 ); + result = self maps\mp\killstreaks\_killstreaks::initridekillstreak( "rcbomb" ); + + if ( result != "success" ) + { + if ( result != "disconnect" ) + self clearusingremote(); + + return 0; + } + + if ( level.gameended ) + return 0; + + ret = self usercbomb( placement ); + + if ( !isdefined( ret ) && level.gameended ) + ret = 1; + else if ( !isdefined( ret ) ) + ret = 0; + + if ( isdefined( self ) ) + self clearusingremote(); + + return ret; } spawnrcbomb( placement, team ) { - car_size = getDvar( "scr_rcbomb_car_size" ); - model = "veh_t6_drone_rcxd"; - enemymodel = "veh_t6_drone_rcxd_alt"; - death_model = "veh_t6_drone_rcxd"; - car = "rc_car_medium_mp"; - vehicle = spawnvehicle( model, "rcbomb", car, placement.origin, placement.angles ); - vehicle makevehicleunusable(); - vehicle.death_model = death_model; - vehicle.allowfriendlyfiredamageoverride = ::rccarallowfriendlyfiredamage; - vehicle setenemymodel( enemymodel ); - vehicle enableaimassist(); - vehicle setowner( self ); - vehicle setvehicleteam( team ); - vehicle.team = team; - vehicle setdrawinfrared( 1 ); - maps/mp/_treadfx::loadtreadfx( vehicle ); - vehicle maps/mp/gametypes/_spawning::create_rcbomb_influencers( team ); - return vehicle; + car_size = getdvar( "scr_rcbomb_car_size" ); + model = "veh_t6_drone_rcxd"; + enemymodel = "veh_t6_drone_rcxd_alt"; + death_model = "veh_t6_drone_rcxd"; + car = "rc_car_medium_mp"; + vehicle = spawnvehicle( model, "rcbomb", car, placement.origin, placement.angles ); + vehicle makevehicleunusable(); + vehicle.death_model = death_model; + vehicle.allowfriendlyfiredamageoverride = ::rccarallowfriendlyfiredamage; + vehicle setenemymodel( enemymodel ); + vehicle enableaimassist(); + vehicle setowner( self ); + vehicle setvehicleteam( team ); + vehicle.team = team; + vehicle setdrawinfrared( 1 ); + maps\mp\_treadfx::loadtreadfx( vehicle ); + vehicle maps\mp\gametypes\_spawning::create_rcbomb_influencers( team ); + return vehicle; } getrcbombplacement() { - return calculatespawnorigin( self.origin, self.angles ); + return calculatespawnorigin( self.origin, self.angles ); } giveplayercontrolofrcbomb() { - self endon( "disconnect" ); - level endon( "game_ended" ); - self thread maps/mp/killstreaks/_killstreaks::playkillstreakstartdialog( "rcbomb_mp", self.team ); - level.globalkillstreakscalled++; - self addweaponstat( "rcbomb_mp", "used", 1 ); - xpamount = maps/mp/killstreaks/_killstreaks::getxpamountforkillstreak( "rcbomb_mp" ); - if ( maps/mp/_scoreevents::shouldaddrankxp( self ) ) - { - self addrankxpvalue( "killstreakCalledIn", xpamount ); - } - self freeze_player_controls( 0 ); - self.rcbomb usevehicle( self, 0 ); - self thread playerdisconnectwaiter( self.rcbomb ); - self thread cardetonatewaiter( self.rcbomb ); - self thread exitcarwaiter( self.rcbomb ); - self thread gameendwatcher( self.rcbomb ); - self thread changeteamwaiter( self.rcbomb ); - self.rcbomb thread maps/mp/_flashgrenades::monitorrcbombflash(); - self thread cartimer( self.rcbomb ); - self waittill( "rcbomb_done" ); + self endon( "disconnect" ); + level endon( "game_ended" ); + self thread maps\mp\killstreaks\_killstreaks::playkillstreakstartdialog( "rcbomb_mp", self.team ); + level.globalkillstreakscalled++; + self addweaponstat( "rcbomb_mp", "used", 1 ); + xpamount = maps\mp\killstreaks\_killstreaks::getxpamountforkillstreak( "rcbomb_mp" ); + + if ( maps\mp\_scoreevents::shouldaddrankxp( self ) ) + self addrankxpvalue( "killstreakCalledIn", xpamount ); + + self freeze_player_controls( 0 ); + self.rcbomb usevehicle( self, 0 ); + self thread playerdisconnectwaiter( self.rcbomb ); + self thread cardetonatewaiter( self.rcbomb ); + self thread exitcarwaiter( self.rcbomb ); + self thread gameendwatcher( self.rcbomb ); + self thread changeteamwaiter( self.rcbomb ); + self.rcbomb thread maps\mp\_flashgrenades::monitorrcbombflash(); + self thread cartimer( self.rcbomb ); + + self waittill( "rcbomb_done" ); } usercbomb( placement ) { - self endon( "disconnect" ); - level endon( "game_ended" ); - hardpointtype = "rcbomb_mp"; - maps/mp/gametypes/_globallogic_utils::waittillslowprocessallowed(); - if ( isDefined( self ) && isalive( self ) || self isremotecontrolling() && self maps/mp/killstreaks/_killstreaks::isinteractingwithobject() ) - { - self iprintlnbold( &"KILLSTREAK_RCBOMB_NOT_PLACEABLE" ); - return 0; - } - if ( !isDefined( self.rcbomb ) ) - { - self.rcbomb = self spawnrcbomb( placement, self.team ); - self.rcbomb thread carcleanupwaiter( self.rcbomb ); - self.rcbomb thread trigger_hurt_monitor(); - self.rcbomb.team = self.team; - if ( !isDefined( self.rcbomb ) ) - { - return 0; - } - self maps/mp/gametypes/_weaponobjects::addweaponobjecttowatcher( "rcbomb", self.rcbomb ); - } - killstreak_id = self maps/mp/killstreaks/_killstreakrules::killstreakstart( hardpointtype, self.team, undefined, 0 ); - if ( killstreak_id == -1 ) - { - if ( isDefined( self.rcbomb ) ) - { - self.rcbomb delete(); - } - return 0; - } - self.rcbomb.killstreak_id = killstreak_id; - self.enteringvehicle = 1; - self thread updatekillstreakondisconnect(); - self thread updatekillstreakondeletion( self.team ); - self freeze_player_controls( 1 ); - if ( isDefined( self ) || !isalive( self ) && !isDefined( self.rcbomb ) ) - { - if ( isDefined( self ) ) - { - self.enteringvehicle = 0; - self notify( "weapon_object_destroyed" ); - } - return 0; - } - self thread giveplayercontrolofrcbomb(); - self.rcbomb thread watchforscramblers(); - self.killstreak_waitamount = 30000; - self.enteringvehicle = 0; - self stopshellshock(); - if ( isDefined( level.killstreaks[ hardpointtype ] ) && isDefined( level.killstreaks[ hardpointtype ].inboundtext ) ) - { - level thread maps/mp/_popups::displaykillstreakteammessagetoall( hardpointtype, self ); - } - if ( isDefined( level.rcbomb_vision ) ) - { - self thread setvisionsetwaiter(); - } - self updaterulesonend(); - return 1; + self endon( "disconnect" ); + level endon( "game_ended" ); + hardpointtype = "rcbomb_mp"; + maps\mp\gametypes\_globallogic_utils::waittillslowprocessallowed(); + + if ( !isdefined( self ) || !isalive( self ) || self isremotecontrolling() || self maps\mp\killstreaks\_killstreaks::isinteractingwithobject() ) + { + self iprintlnbold( &"KILLSTREAK_RCBOMB_NOT_PLACEABLE" ); + return false; + } + + if ( !isdefined( self.rcbomb ) ) + { + self.rcbomb = self spawnrcbomb( placement, self.team ); + self.rcbomb thread carcleanupwaiter( self.rcbomb ); + self.rcbomb thread trigger_hurt_monitor(); + self.rcbomb.team = self.team; + + if ( !isdefined( self.rcbomb ) ) + return false; + + self maps\mp\gametypes\_weaponobjects::addweaponobjecttowatcher( "rcbomb", self.rcbomb ); + } + + killstreak_id = self maps\mp\killstreaks\_killstreakrules::killstreakstart( hardpointtype, self.team, undefined, 0 ); + + if ( killstreak_id == -1 ) + { + if ( isdefined( self.rcbomb ) ) + self.rcbomb delete(); + + return false; + } + + self.rcbomb.killstreak_id = killstreak_id; + self.enteringvehicle = 1; + self thread updatekillstreakondisconnect(); + self thread updatekillstreakondeletion( self.team ); + self freeze_player_controls( 1 ); + + if ( !isdefined( self ) || !isalive( self ) || !isdefined( self.rcbomb ) ) + { + if ( isdefined( self ) ) + { + self.enteringvehicle = 0; + self notify( "weapon_object_destroyed" ); + } + + return false; + } + + self thread giveplayercontrolofrcbomb(); + self.rcbomb thread watchforscramblers(); + self.killstreak_waitamount = 30000; + self.enteringvehicle = 0; + self stopshellshock(); + + if ( isdefined( level.killstreaks[hardpointtype] ) && isdefined( level.killstreaks[hardpointtype].inboundtext ) ) + level thread maps\mp\_popups::displaykillstreakteammessagetoall( hardpointtype, self ); + + if ( isdefined( level.rcbomb_vision ) ) + self thread setvisionsetwaiter(); + + self updaterulesonend(); + return true; } watchforscramblers() { - self endon( "death" ); - while ( 1 ) - { - scrambled = self getclientflag( 9 ); - shouldscramble = 0; - players = level.players; - i = 0; - while ( i < players.size ) - { - if ( !isDefined( players[ i ] ) || !isDefined( players[ i ].scrambler ) ) - { - i++; - continue; - } - else - { - player = players[ i ]; - scrambler = player.scrambler; - if ( level.teambased && self.team == player.team ) - { - i++; - continue; - } - else - { - if ( !level.teambased && self.owner == player ) - { - i++; - continue; - } - else - { - if ( distancesquared( scrambler.origin, self.origin ) < level.scramblerinnerradiussq ) - { - shouldscramble = 1; - break; - } - } - } - } - else - { - i++; - } - } - if ( shouldscramble == 1 && scrambled == 0 ) - { - self setclientflag( 9 ); - } - else - { - if ( shouldscramble == 0 && scrambled == 1 ) - { - self clearclientflag( 9 ); - } - } - wait_delay = randomfloatrange( 0,25, 0,5 ); - wait wait_delay; - } + self endon( "death" ); + + while ( true ) + { + scrambled = self getclientflag( 9 ); + shouldscramble = 0; + players = level.players; + + for ( i = 0; i < players.size; i++ ) + { + if ( !isdefined( players[i] ) || !isdefined( players[i].scrambler ) ) + continue; + + player = players[i]; + scrambler = player.scrambler; + + if ( level.teambased && self.team == player.team ) + continue; + + if ( !level.teambased && self.owner == player ) + continue; + + if ( distancesquared( scrambler.origin, self.origin ) < level.scramblerinnerradiussq ) + { + shouldscramble = 1; + break; + } + } + + if ( shouldscramble == 1 && scrambled == 0 ) + self setclientflag( 9 ); + else if ( shouldscramble == 0 && scrambled == 1 ) + self clearclientflag( 9 ); + + wait_delay = randomfloatrange( 0.25, 0.5 ); + wait( wait_delay ); + } } updaterulesonend() { - team = self.rcbomb.team; - killstreak_id = self.rcbomb.killstreak_id; - self endon( "disconnect" ); - self waittill( "rcbomb_done" ); - maps/mp/killstreaks/_killstreakrules::killstreakstop( "rcbomb_mp", team, killstreak_id ); + team = self.rcbomb.team; + killstreak_id = self.rcbomb.killstreak_id; + self endon( "disconnect" ); + + self waittill( "rcbomb_done" ); + + maps\mp\killstreaks\_killstreakrules::killstreakstop( "rcbomb_mp", team, killstreak_id ); } updatekillstreakondisconnect() { - team = self.rcbomb.team; - killstreak_id = self.rcbomb.killstreak_id; - self endon( "rcbomb_done" ); - self waittill( "disconnect" ); - maps/mp/killstreaks/_killstreakrules::killstreakstop( "rcbomb_mp", team, killstreak_id ); + team = self.rcbomb.team; + killstreak_id = self.rcbomb.killstreak_id; + self endon( "rcbomb_done" ); + + self waittill( "disconnect" ); + + maps\mp\killstreaks\_killstreakrules::killstreakstop( "rcbomb_mp", team, killstreak_id ); } updatekillstreakondeletion( team ) { - killstreak_id = self.rcbomb.killstreak_id; - self endon( "disconnect" ); - self endon( "rcbomb_done" ); - self waittill( "weapon_object_destroyed" ); - maps/mp/killstreaks/_killstreakrules::killstreakstop( "rcbomb_mp", team, killstreak_id ); - if ( isDefined( self.rcbomb ) ) - { - self.rcbomb delete(); - } + killstreak_id = self.rcbomb.killstreak_id; + self endon( "disconnect" ); + self endon( "rcbomb_done" ); + + self waittill( "weapon_object_destroyed" ); + + maps\mp\killstreaks\_killstreakrules::killstreakstop( "rcbomb_mp", team, killstreak_id ); + + if ( isdefined( self.rcbomb ) ) + self.rcbomb delete(); } cardetonatewaiter( vehicle ) { - self endon( "disconnect" ); - vehicle endon( "death" ); - watcher = maps/mp/gametypes/_weaponobjects::getweaponobjectwatcher( "rcbomb" ); - while ( !self attackbuttonpressed() ) - { - wait 0,05; - } - watcher thread maps/mp/gametypes/_weaponobjects::waitanddetonate( vehicle, 0 ); - self thread maps/mp/gametypes/_hud::fadetoblackforxsec( getDvarFloat( #"CDE26736" ), getDvarFloat( #"AFCAD5CD" ), getDvarFloat( #"88490433" ), getDvarFloat( #"A925AA4E" ) ); + self endon( "disconnect" ); + vehicle endon( "death" ); + watcher = maps\mp\gametypes\_weaponobjects::getweaponobjectwatcher( "rcbomb" ); + + while ( !self attackbuttonpressed() ) + wait 0.05; + + watcher thread maps\mp\gametypes\_weaponobjects::waitanddetonate( vehicle, 0 ); + self thread maps\mp\gametypes\_hud::fadetoblackforxsec( getdvarfloat( _hash_CDE26736 ), getdvarfloat( _hash_AFCAD5CD ), getdvarfloat( _hash_88490433 ), getdvarfloat( _hash_A925AA4E ) ); } jumpwaiter( vehicle ) { - self endon( "disconnect" ); - vehicle endon( "death" ); - self.jump_hud = newclienthudelem( self ); - self.jump_hud.alignx = "left"; - self.jump_hud.aligny = "bottom"; - self.jump_hud.horzalign = "user_left"; - self.jump_hud.vertalign = "user_bottom"; - self.jump_hud.font = "small"; - self.jump_hud.hidewheninmenu = 1; - self.jump_hud.x = 5; - self.jump_hud.y = -60; - self.jump_hud.fontscale = 1,25; - while ( 1 ) - { - self.jump_hud settext( "[{+gostand}]" + "Jump" ); - if ( self jumpbuttonpressed() ) - { - vehicle launchvehicle( ( 0, 0, 1 ) * -10, vehicle.origin, 0 ); - self.jump_hud settext( "" ); - wait 5; - } - wait 0,05; - } + self endon( "disconnect" ); + vehicle endon( "death" ); + self.jump_hud = newclienthudelem( self ); + self.jump_hud.alignx = "left"; + self.jump_hud.aligny = "bottom"; + self.jump_hud.horzalign = "user_left"; + self.jump_hud.vertalign = "user_bottom"; + self.jump_hud.font = "small"; + self.jump_hud.hidewheninmenu = 1; + self.jump_hud.x = 5; + self.jump_hud.y = -60; + self.jump_hud.fontscale = 1.25; + + while ( true ) + { + self.jump_hud settext( "[{+gostand}]" + "Jump" ); + + if ( self jumpbuttonpressed() ) + { + vehicle launchvehicle( ( 0, 0, -1 ) * -10, vehicle.origin, 0 ); + self.jump_hud settext( "" ); + wait 5; + } + + wait 0.05; + } } playerdisconnectwaiter( vehicle ) { - vehicle endon( "death" ); - self endon( "rcbomb_done" ); - self waittill( "disconnect" ); - vehicle delete(); + vehicle endon( "death" ); + self endon( "rcbomb_done" ); + + self waittill( "disconnect" ); + + vehicle delete(); } gameendwatcher( vehicle ) { - vehicle endon( "death" ); - self endon( "rcbomb_done" ); - level waittill( "game_ended" ); - watcher = maps/mp/gametypes/_weaponobjects::getweaponobjectwatcher( "rcbomb" ); - watcher thread maps/mp/gametypes/_weaponobjects::waitanddetonate( vehicle, 0 ); - self thread maps/mp/gametypes/_hud::fadetoblackforxsec( getDvarFloat( #"CDE26736" ), getDvarFloat( #"AFCAD5CD" ), getDvarFloat( #"88490433" ), getDvarFloat( #"A925AA4E" ) ); + vehicle endon( "death" ); + self endon( "rcbomb_done" ); + + level waittill( "game_ended" ); + + watcher = maps\mp\gametypes\_weaponobjects::getweaponobjectwatcher( "rcbomb" ); + watcher thread maps\mp\gametypes\_weaponobjects::waitanddetonate( vehicle, 0 ); + self thread maps\mp\gametypes\_hud::fadetoblackforxsec( getdvarfloat( _hash_CDE26736 ), getdvarfloat( _hash_AFCAD5CD ), getdvarfloat( _hash_88490433 ), getdvarfloat( _hash_A925AA4E ) ); } exitcarwaiter( vehicle ) { - self endon( "disconnect" ); - self waittill( "unlink" ); - self notify( "rcbomb_done" ); + self endon( "disconnect" ); + + self waittill( "unlink" ); + + self notify( "rcbomb_done" ); } changeteamwaiter( vehicle ) { - self endon( "disconnect" ); - self endon( "rcbomb_done" ); - vehicle endon( "death" ); - self waittill_either( "joined_team", "joined_spectators" ); - vehicle.owner unlink(); - self.killstreak_waitamount = undefined; - vehicle delete(); + self endon( "disconnect" ); + self endon( "rcbomb_done" ); + vehicle endon( "death" ); + self waittill_either( "joined_team", "joined_spectators" ); + vehicle.owner unlink(); + self.killstreak_waitamount = undefined; + vehicle delete(); } cardeathwaiter( vehicle ) { - self endon( "disconnect" ); - self endon( "rcbomb_done" ); - self waittill( "death" ); - maps/mp/killstreaks/_killstreaks::removeusedkillstreak( "rcbomb_mp" ); - self notify( "rcbomb_done" ); + self endon( "disconnect" ); + self endon( "rcbomb_done" ); + + self waittill( "death" ); + + maps\mp\killstreaks\_killstreaks::removeusedkillstreak( "rcbomb_mp" ); + self notify( "rcbomb_done" ); } carcleanupwaiter( vehicle ) { - self endon( "disconnect" ); - self waittill( "death" ); - self.rcbomb = undefined; + self endon( "disconnect" ); + + self waittill( "death" ); + + self.rcbomb = undefined; } setvisionsetwaiter() { - self endon( "disconnect" ); - self useservervisionset( 1 ); - self setvisionsetforplayer( level.rcbomb_vision, 1 ); - self waittill( "rcbomb_done" ); - self useservervisionset( 0 ); + self endon( "disconnect" ); + self useservervisionset( 1 ); + self setvisionsetforplayer( level.rcbomb_vision, 1 ); + + self waittill( "rcbomb_done" ); + + self useservervisionset( 0 ); } cartimer( vehicle ) { - self endon( "disconnect" ); - vehicle endon( "death" ); - if ( !level.vehiclestimed ) - { - return; - } + self endon( "disconnect" ); + vehicle endon( "death" ); + + if ( !level.vehiclestimed ) + return; /# - if ( getDvarInt( "scr_rcbomb_notimeout" ) != 0 ) - { - return; + if ( getdvarint( "scr_rcbomb_notimeout" ) != 0 ) + return; #/ - } - maps/mp/gametypes/_hostmigration::waitlongdurationwithhostmigrationpause( 20 ); - vehicle setclientfield( "rcbomb_countdown", 1 ); - maps/mp/gametypes/_hostmigration::waitlongdurationwithhostmigrationpause( 6 ); - vehicle setclientfield( "rcbomb_countdown", 2 ); - maps/mp/gametypes/_hostmigration::waitlongdurationwithhostmigrationpause( 4 ); - watcher = maps/mp/gametypes/_weaponobjects::getweaponobjectwatcher( "rcbomb" ); - watcher thread maps/mp/gametypes/_weaponobjects::waitanddetonate( vehicle, 0 ); + maps\mp\gametypes\_hostmigration::waitlongdurationwithhostmigrationpause( 20 ); + vehicle setclientfield( "rcbomb_countdown", 1 ); + maps\mp\gametypes\_hostmigration::waitlongdurationwithhostmigrationpause( 6 ); + vehicle setclientfield( "rcbomb_countdown", 2 ); + maps\mp\gametypes\_hostmigration::waitlongdurationwithhostmigrationpause( 4 ); + watcher = maps\mp\gametypes\_weaponobjects::getweaponobjectwatcher( "rcbomb" ); + watcher thread maps\mp\gametypes\_weaponobjects::waitanddetonate( vehicle, 0 ); } detonateiftouchingsphere( origin, radius ) { - if ( distancesquared( self.origin, origin ) < ( radius * radius ) ) - { - self rcbomb_force_explode(); - } + if ( distancesquared( self.origin, origin ) < radius * radius ) + self rcbomb_force_explode(); } detonatealliftouchingsphere( origin, radius ) { - rcbombs = getentarray( "rcbomb", "targetname" ); - index = 0; - while ( index < rcbombs.size ) - { - rcbombs[ index ] detonateiftouchingsphere( origin, radius ); - index++; - } + rcbombs = getentarray( "rcbomb", "targetname" ); + + for ( index = 0; index < rcbombs.size; index++ ) + rcbombs[index] detonateiftouchingsphere( origin, radius ); } blowup( attacker, weaponname ) { - self.owner endon( "disconnect" ); - self endon( "death" ); - explosionorigin = self.origin; - explosionangles = self.angles; - if ( !isDefined( attacker ) ) - { - attacker = self.owner; - } - from_emp = maps/mp/killstreaks/_emp::isempweapon( weaponname ); - origin = self.origin + vectorScale( ( 0, 0, 1 ), 10 ); - radius = 256; - min_damage = 25; - max_damage = 350; - if ( !from_emp ) - { - self radiusdamage( origin, radius, max_damage, min_damage, attacker, "MOD_EXPLOSIVE", "rcbomb_mp" ); - physicsexplosionsphere( origin, radius, radius, 1, max_damage, min_damage ); - maps/mp/gametypes/_shellshock::rcbomb_earthquake( origin ); - playsoundatposition( "mpl_rc_exp", self.origin ); - playfx( level._effect[ "rcbombexplosion" ], explosionorigin, ( 0, 0, 1 ) ); - } - self setmodel( self.death_model ); - self hide(); - self setclientfield( "rcbomb_death", 1 ); - if ( attacker != self.owner && isplayer( attacker ) ) - { - attacker maps/mp/_challenges::destroyrcbomb( weaponname ); - if ( self.owner isenemyplayer( attacker ) ) - { - maps/mp/_scoreevents::processscoreevent( "destroyed_rcbomb", attacker, self.owner, weaponname ); - if ( isDefined( weaponname ) ) - { - weaponstatname = "destroyed"; - attacker addweaponstat( weaponname, weaponstatname, 1 ); - level.globalkillstreaksdestroyed++; - attacker addweaponstat( "rcbomb_mp", "destroyed", 1 ); - attacker addweaponstat( weaponname, "destroyed_controlled_killstreak", 1 ); - } - } - } - wait 1; - if ( isDefined( self.neverdelete ) && self.neverdelete ) - { - return; - } - if ( isDefined( self.owner.jump_hud ) ) - { - self.owner.jump_hud destroy(); - } - self.owner unlink(); - if ( isDefined( level.gameended ) && level.gameended ) - { - self.owner freezecontrolswrapper( 1 ); - } - self.owner.killstreak_waitamount = undefined; - self delete(); + self.owner endon( "disconnect" ); + self endon( "death" ); + explosionorigin = self.origin; + explosionangles = self.angles; + + if ( !isdefined( attacker ) ) + attacker = self.owner; + + from_emp = maps\mp\killstreaks\_emp::isempweapon( weaponname ); + origin = self.origin + vectorscale( ( 0, 0, 1 ), 10.0 ); + radius = 256; + min_damage = 25; + max_damage = 350; + + if ( !from_emp ) + { + self radiusdamage( origin, radius, max_damage, min_damage, attacker, "MOD_EXPLOSIVE", "rcbomb_mp" ); + physicsexplosionsphere( origin, radius, radius, 1, max_damage, min_damage ); + maps\mp\gametypes\_shellshock::rcbomb_earthquake( origin ); + playsoundatposition( "mpl_rc_exp", self.origin ); + playfx( level._effect["rcbombexplosion"], explosionorigin, ( 0, 0, 1 ) ); + } + + self setmodel( self.death_model ); + self hide(); + self setclientfield( "rcbomb_death", 1 ); + + if ( attacker != self.owner && isplayer( attacker ) ) + { + attacker maps\mp\_challenges::destroyrcbomb( weaponname ); + + if ( self.owner isenemyplayer( attacker ) ) + { + maps\mp\_scoreevents::processscoreevent( "destroyed_rcbomb", attacker, self.owner, weaponname ); + + if ( isdefined( weaponname ) ) + { + weaponstatname = "destroyed"; + attacker addweaponstat( weaponname, weaponstatname, 1 ); + level.globalkillstreaksdestroyed++; + attacker addweaponstat( "rcbomb_mp", "destroyed", 1 ); + attacker addweaponstat( weaponname, "destroyed_controlled_killstreak", 1 ); + } + } + else + { + + } + } + + wait 1; + + if ( isdefined( self.neverdelete ) && self.neverdelete ) + return; + + if ( isdefined( self.owner.jump_hud ) ) + self.owner.jump_hud destroy(); + + self.owner unlink(); + + if ( isdefined( level.gameended ) && level.gameended ) + self.owner freezecontrolswrapper( 1 ); + + self.owner.killstreak_waitamount = undefined; + self delete(); } rccarallowfriendlyfiredamage( einflictor, eattacker, smeansofdeath, sweapon ) { - if ( isDefined( eattacker ) && eattacker == self.owner ) - { - return 1; - } - if ( isDefined( einflictor ) && einflictor islinkedto( self ) ) - { - return 1; - } - return 0; + if ( isdefined( eattacker ) && eattacker == self.owner ) + return true; + + if ( isdefined( einflictor ) && einflictor islinkedto( self ) ) + return true; + + return false; } getplacementstartheight() { - startheight = 50; - switch( self getstance() ) - { - case "crouch": - startheight = 30; - break; - case "prone": - startheight = 15; - break; - } - return startheight; + startheight = 50; + + switch ( self getstance() ) + { + case "crouch": + startheight = 30; + break; + case "prone": + startheight = 15; + break; + } + + return startheight; } calculatespawnorigin( origin, angles ) { - distance_from_player = 70; - startheight = getplacementstartheight(); - mins = vectorScale( ( 0, 0, 1 ), 5 ); - maxs = ( 5, 5, 10 ); - startpoints = []; - startangles = []; - wheelcounts = []; - testcheck = []; - largestcount = 0; - largestcountindex = 0; - testangles = []; - testangles[ 0 ] = ( 0, 0, 1 ); - testangles[ 1 ] = vectorScale( ( 0, 0, 1 ), 20 ); - testangles[ 2 ] = vectorScale( ( 0, 0, 1 ), 20 ); - testangles[ 3 ] = vectorScale( ( 0, 0, 1 ), 45 ); - testangles[ 4 ] = vectorScale( ( 0, 0, 1 ), 45 ); - heightoffset = 5; - i = 0; - while ( i < testangles.size ) - { - testcheck[ i ] = 0; - startangles[ i ] = ( 0, angles[ 1 ], 0 ); - startpoint = origin + vectorScale( anglesToForward( startangles[ i ] + testangles[ i ] ), distance_from_player ); - endpoint = startpoint - vectorScale( ( 0, 0, 1 ), 100 ); - startpoint += ( 0, 0, startheight ); - mask = level.physicstracemaskphysics | level.physicstracemaskvehicle; - trace = physicstrace( startpoint, endpoint, mins, maxs, self, mask ); - if ( isDefined( trace[ "entity" ] ) && isplayer( trace[ "entity" ] ) ) - { - wheelcounts[ i ] = 0; - i++; - continue; - } - else - { - startpoints[ i ] = trace[ "position" ] + ( 0, 0, heightoffset ); - wheelcounts[ i ] = testwheellocations( startpoints[ i ], startangles[ i ], heightoffset ); - if ( positionwouldtelefrag( startpoints[ i ] ) ) - { - i++; - continue; - } - else - { - if ( largestcount < wheelcounts[ i ] ) - { - largestcount = wheelcounts[ i ]; - largestcountindex = i; - } - if ( wheelcounts[ i ] >= 3 ) - { - testcheck[ i ] = 1; - if ( testspawnorigin( startpoints[ i ], startangles[ i ] ) ) - { - placement = spawnstruct(); - placement.origin = startpoints[ i ]; - placement.angles = startangles[ i ]; - return placement; - } - } - } - } - i++; - } - i = 0; - while ( i < testangles.size ) - { - if ( !testcheck[ i ] ) - { - if ( wheelcounts[ i ] >= 2 ) - { - if ( testspawnorigin( startpoints[ i ], startangles[ i ] ) ) - { - placement = spawnstruct(); - placement.origin = startpoints[ i ]; - placement.angles = startangles[ i ]; - return placement; - } - } - } - i++; - } - return undefined; + distance_from_player = 70; + startheight = getplacementstartheight(); + mins = vectorscale( ( -1, -1, 0 ), 5.0 ); + maxs = ( 5, 5, 10 ); + startpoints = []; + startangles = []; + wheelcounts = []; + testcheck = []; + largestcount = 0; + largestcountindex = 0; + testangles = []; + testangles[0] = ( 0, 0, 0 ); + testangles[1] = vectorscale( ( 0, 1, 0 ), 20.0 ); + testangles[2] = vectorscale( ( 0, -1, 0 ), 20.0 ); + testangles[3] = vectorscale( ( 0, 1, 0 ), 45.0 ); + testangles[4] = vectorscale( ( 0, -1, 0 ), 45.0 ); + heightoffset = 5; + + for ( i = 0; i < testangles.size; i++ ) + { + testcheck[i] = 0; + startangles[i] = ( 0, angles[1], 0 ); + startpoint = origin + vectorscale( anglestoforward( startangles[i] + testangles[i] ), distance_from_player ); + endpoint = startpoint - vectorscale( ( 0, 0, 1 ), 100.0 ); + startpoint += ( 0, 0, startheight ); + mask = level.physicstracemaskphysics | level.physicstracemaskvehicle; + trace = physicstrace( startpoint, endpoint, mins, maxs, self, mask ); + + if ( isdefined( trace["entity"] ) && isplayer( trace["entity"] ) ) + { + wheelcounts[i] = 0; + continue; + } + + startpoints[i] = trace["position"] + ( 0, 0, heightoffset ); + wheelcounts[i] = testwheellocations( startpoints[i], startangles[i], heightoffset ); + + if ( positionwouldtelefrag( startpoints[i] ) ) + continue; + + if ( largestcount < wheelcounts[i] ) + { + largestcount = wheelcounts[i]; + largestcountindex = i; + } + + if ( wheelcounts[i] >= 3 ) + { + testcheck[i] = 1; + + if ( testspawnorigin( startpoints[i], startangles[i] ) ) + { + placement = spawnstruct(); + placement.origin = startpoints[i]; + placement.angles = startangles[i]; + return placement; + } + } + } + + for ( i = 0; i < testangles.size; i++ ) + { + if ( !testcheck[i] ) + { + if ( wheelcounts[i] >= 2 ) + { + if ( testspawnorigin( startpoints[i], startangles[i] ) ) + { + placement = spawnstruct(); + placement.origin = startpoints[i]; + placement.angles = startangles[i]; + return placement; + } + } + } + } + + return undefined; } testwheellocations( origin, angles, heightoffset ) { - forward = 13; - side = 10; - wheels = []; - wheels[ 0 ] = ( forward, side, 0 ); - wheels[ 1 ] = ( forward, -1 * side, 0 ); - wheels[ 2 ] = ( -1 * forward, -1 * side, 0 ); - wheels[ 3 ] = ( -1 * forward, side, 0 ); - height = 5; - touchcount = 0; - yawangles = ( 0, angles[ 1 ], 0 ); - i = 0; - while ( i < 4 ) - { - wheel = rotatepoint( wheels[ i ], yawangles ); - startpoint = origin + wheel; - endpoint = startpoint + ( 0, 0, ( -1 * height ) - heightoffset ); - startpoint += ( 0, 0, height - heightoffset ); - trace = bullettrace( startpoint, endpoint, 0, self ); - if ( trace[ "fraction" ] < 1 ) - { - touchcount++; - rcbomb_debug_line( startpoint, endpoint, ( 0, 0, 1 ) ); - i++; - continue; - } - else - { - rcbomb_debug_line( startpoint, endpoint, ( 0, 0, 1 ) ); - } - i++; - } - return touchcount; + forward = 13; + side = 10; + wheels = []; + wheels[0] = ( forward, side, 0 ); + wheels[1] = ( forward, -1 * side, 0 ); + wheels[2] = ( -1 * forward, -1 * side, 0 ); + wheels[3] = ( -1 * forward, side, 0 ); + height = 5; + touchcount = 0; + yawangles = ( 0, angles[1], 0 ); + + for ( i = 0; i < 4; i++ ) + { + wheel = rotatepoint( wheels[i], yawangles ); + startpoint = origin + wheel; + endpoint = startpoint + ( 0, 0, -1 * height - heightoffset ); + startpoint += ( 0, 0, height - heightoffset ); + trace = bullettrace( startpoint, endpoint, 0, self ); + + if ( trace["fraction"] < 1 ) + { + touchcount++; + rcbomb_debug_line( startpoint, endpoint, ( 1, 0, 0 ) ); + continue; + } + + rcbomb_debug_line( startpoint, endpoint, ( 0, 0, 1 ) ); + } + + return touchcount; } testspawnorigin( origin, angles ) { - liftedorigin = origin + vectorScale( ( 0, 0, 1 ), 5 ); - size = 12; - height = 15; - mins = ( -1 * size, -1 * size, 0 ); - maxs = ( size, size, height ); - absmins = liftedorigin + mins; - absmaxs = liftedorigin + maxs; - if ( boundswouldtelefrag( absmins, absmaxs ) ) - { - rcbomb_debug_box( liftedorigin, mins, maxs, ( 0, 0, 1 ) ); - return 0; - } - else - { - rcbomb_debug_box( liftedorigin, mins, maxs, ( 0, 0, 1 ) ); - } - startheight = getplacementstartheight(); - mask = level.physicstracemaskphysics | level.physicstracemaskvehicle | level.physicstracemaskwater; - trace = physicstrace( liftedorigin, origin + ( 0, 0, 1 ), mins, maxs, self, mask ); - if ( trace[ "fraction" ] < 1 ) - { - rcbomb_debug_box( trace[ "position" ], mins, maxs, ( 0, 0, 1 ) ); - return 0; - } - else - { - rcbomb_debug_box( origin + ( 0, 0, 1 ), mins, maxs, ( 0, 0, 1 ) ); - } - size = 2,5; - height = size * 2; - mins = ( -1 * size, -1 * size, 0 ); - maxs = ( size, size, height ); - sweeptrace = physicstrace( self.origin + ( 0, 0, startheight ), liftedorigin, mins, maxs, self, mask ); - if ( sweeptrace[ "fraction" ] < 1 ) - { - rcbomb_debug_box( sweeptrace[ "position" ], mins, maxs, ( 0, 0, 1 ) ); - return 0; - } - return 1; + liftedorigin = origin + vectorscale( ( 0, 0, 1 ), 5.0 ); + size = 12; + height = 15; + mins = ( -1 * size, -1 * size, 0 ); + maxs = ( size, size, height ); + absmins = liftedorigin + mins; + absmaxs = liftedorigin + maxs; + + if ( boundswouldtelefrag( absmins, absmaxs ) ) + { + rcbomb_debug_box( liftedorigin, mins, maxs, ( 1, 0, 0 ) ); + return false; + } + else + rcbomb_debug_box( liftedorigin, mins, maxs, ( 0, 0, 1 ) ); + + startheight = getplacementstartheight(); + mask = level.physicstracemaskphysics | level.physicstracemaskvehicle | level.physicstracemaskwater; + trace = physicstrace( liftedorigin, origin + ( 0, 0, 1 ), mins, maxs, self, mask ); + + if ( trace["fraction"] < 1 ) + { + rcbomb_debug_box( trace["position"], mins, maxs, ( 1, 0, 0 ) ); + return false; + } + else + rcbomb_debug_box( origin + ( 0, 0, 1 ), mins, maxs, ( 0, 1, 0 ) ); + + size = 2.5; + height = size * 2; + mins = ( -1 * size, -1 * size, 0 ); + maxs = ( size, size, height ); + sweeptrace = physicstrace( self.origin + ( 0, 0, startheight ), liftedorigin, mins, maxs, self, mask ); + + if ( sweeptrace["fraction"] < 1 ) + { + rcbomb_debug_box( sweeptrace["position"], mins, maxs, ( 1, 0, 0 ) ); + return false; + } + + return true; } trigger_hurt_monitor() { - self endon( "death" ); - for ( ;; ) - { - self waittill( "touch", ent ); - if ( ent.classname == "trigger_hurt" ) - { - if ( level.script == "mp_castaway" ) - { - if ( ent.spawnflags & 16 ) - { - if ( self depthinwater() < 23 ) - { - break; - } - } - } - else - { - self rcbomb_force_explode(); - return; - } - } - } + self endon( "death" ); + + for (;;) + { + self waittill( "touch", ent ); + + if ( ent.classname == "trigger_hurt" ) + { + if ( level.script == "mp_castaway" ) + { + if ( ent.spawnflags & 16 ) + { + if ( self depthinwater() < 23 ) + continue; + } + } + + self rcbomb_force_explode(); + return; + } + } } rcbomb_force_explode() { - self endon( "death" ); + self endon( "death" ); /# - assert( self.targetname == "rcbomb" ); + assert( self.targetname == "rcbomb" ); #/ - while ( !isDefined( self getseatoccupant( 0 ) ) ) - { - wait 0,1; - } - self dodamage( 10, self.origin + vectorScale( ( 0, 0, 1 ), 10 ), self.owner, self.owner, "none", "MOD_EXPLOSIVE" ); + while ( !isdefined( self getseatoccupant( 0 ) ) ) + wait 0.1; + + self dodamage( 10, self.origin + vectorscale( ( 0, 0, 1 ), 10.0 ), self.owner, self.owner, "none", "MOD_EXPLOSIVE" ); } rcbomb_debug_box( origin, mins, maxs, color ) { /# - debug_rcbomb = getDvar( #"8EAE5CA0" ); - if ( debug_rcbomb == "1" ) - { - box( origin, mins, maxs, 0, color, 1, 1, 300 ); + debug_rcbomb = getdvar( _hash_8EAE5CA0 ); + + if ( debug_rcbomb == "1" ) + box( origin, mins, maxs, 0, color, 1, 1, 300 ); #/ - } } rcbomb_debug_line( start, end, color ) { /# - debug_rcbomb = getDvar( #"8EAE5CA0" ); - if ( debug_rcbomb == "1" ) - { - line( start, end, color, 1, 1, 300 ); + debug_rcbomb = getdvar( _hash_8EAE5CA0 ); + + if ( debug_rcbomb == "1" ) + line( start, end, color, 1, 1, 300 ); #/ - } } diff --git a/Multiplayer Core/patch_mp/maps/mp/killstreaks/_remote_weapons.gsc b/Multiplayer Core/patch_mp/maps/mp/killstreaks/_remote_weapons.gsc index c681776..72e8ced 100644 --- a/Multiplayer Core/patch_mp/maps/mp/killstreaks/_remote_weapons.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/killstreaks/_remote_weapons.gsc @@ -1,496 +1,480 @@ -#include maps/mp/gametypes/_hud; -#include maps/mp/killstreaks/_killstreaks; -#include maps/mp/killstreaks/_ai_tank; -#include maps/mp/killstreaks/_turret_killstreak; -#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 +#include maps\mp\_utility; +#include common_scripts\utility; +#include maps\mp\gametypes\_hud_util; +#include maps\mp\killstreaks\_turret_killstreak; +#include maps\mp\killstreaks\_ai_tank; +#include maps\mp\killstreaks\_killstreaks; +#include maps\mp\gametypes\_hud; init() { - level.remoteweapons = []; - level.remoteweapons[ "killstreak_remote_turret_mp" ] = spawnstruct(); - level.remoteweapons[ "killstreak_remote_turret_mp" ].hintstring = &"MP_REMOTE_USE_TURRET"; - level.remoteweapons[ "killstreak_remote_turret_mp" ].usecallback = maps/mp/killstreaks/_turret_killstreak::startturretremotecontrol; - level.remoteweapons[ "killstreak_remote_turret_mp" ].endusecallback = maps/mp/killstreaks/_turret_killstreak::endremoteturret; - level.remoteweapons[ "killstreak_ai_tank_mp" ] = spawnstruct(); - level.remoteweapons[ "killstreak_ai_tank_mp" ].hintstring = &"MP_REMOTE_USE_TANK"; - level.remoteweapons[ "killstreak_ai_tank_mp" ].usecallback = maps/mp/killstreaks/_ai_tank::starttankremotecontrol; - level.remoteweapons[ "killstreak_ai_tank_mp" ].endusecallback = maps/mp/killstreaks/_ai_tank::endtankremotecontrol; - level.remoteexithint = &"MP_REMOTE_EXIT"; - level thread onplayerconnect(); + level.remoteweapons = []; + level.remoteweapons["killstreak_remote_turret_mp"] = spawnstruct(); + level.remoteweapons["killstreak_remote_turret_mp"].hintstring = &"MP_REMOTE_USE_TURRET"; + level.remoteweapons["killstreak_remote_turret_mp"].usecallback = maps\mp\killstreaks\_turret_killstreak::startturretremotecontrol; + level.remoteweapons["killstreak_remote_turret_mp"].endusecallback = maps\mp\killstreaks\_turret_killstreak::endremoteturret; + level.remoteweapons["killstreak_ai_tank_mp"] = spawnstruct(); + level.remoteweapons["killstreak_ai_tank_mp"].hintstring = &"MP_REMOTE_USE_TANK"; + level.remoteweapons["killstreak_ai_tank_mp"].usecallback = maps\mp\killstreaks\_ai_tank::starttankremotecontrol; + level.remoteweapons["killstreak_ai_tank_mp"].endusecallback = maps\mp\killstreaks\_ai_tank::endtankremotecontrol; + level.remoteexithint = &"MP_REMOTE_EXIT"; + level thread onplayerconnect(); } onplayerconnect() { - for ( ;; ) - { - level waittill( "connected", player ); - player thread onplayerspawned(); - } + for (;;) + { + level waittill( "connected", player ); + + player thread onplayerspawned(); + } } onplayerspawned() { - self endon( "disconnect" ); - for ( ;; ) - { - self waittill( "spawned_player" ); - if ( isDefined( self.remotecontroltrigger ) ) - { - self.remotecontroltrigger.origin = self.origin; - self.remotecontroltrigger linkto( self ); - } - } + self endon( "disconnect" ); + + for (;;) + { + self waittill( "spawned_player" ); + + if ( isdefined( self.remotecontroltrigger ) ) + { + self.remotecontroltrigger.origin = self.origin; + self.remotecontroltrigger linkto( self ); + } + } } initremoteweapon( weapon, weaponname ) { - weapon.inittime = getTime(); - weapon.remotename = weaponname; - weapon thread watchfindremoteweapon( self ); - if ( isDefined( self.remoteweapon ) ) - { - if ( !isusingremote() ) - { - self notify( "remove_remote_weapon" ); - } - } - else - { - self thread setactiveremotecontrolledweapon( weapon ); - } + weapon.inittime = gettime(); + weapon.remotename = weaponname; + weapon thread watchfindremoteweapon( self ); + + if ( isdefined( self.remoteweapon ) ) + { + if ( !isusingremote() ) + self notify( "remove_remote_weapon", 1 ); + } + else + self thread setactiveremotecontrolledweapon( weapon ); } setactiveremotecontrolledweapon( weapon ) { /# - assert( !isDefined( self.remoteweapon ), "Trying to activate remote weapon without cleaning up the current one" ); + assert( !isdefined( self.remoteweapon ), "Trying to activate remote weapon without cleaning up the current one" ); #/ - if ( isDefined( self.remoteweapon ) ) - { - return; - } - while ( !isalive( self ) ) - { - wait 0,05; - } - self notify( "set_active_remote_weapon" ); - self.remoteweapon = weapon; - self thread watchremoveremotecontrolledweapon( weapon.remotename ); - self thread watchremotecontrolledweapondeath(); - self thread watchremoteweaponpings(); - self createremoteweapontrigger( weapon.remotename ); + if ( isdefined( self.remoteweapon ) ) + return; + + while ( !isalive( self ) ) + wait 0.05; + + self notify( "set_active_remote_weapon" ); + self.remoteweapon = weapon; + self thread watchremoveremotecontrolledweapon( weapon.remotename ); + self thread watchremotecontrolledweapondeath(); + self thread watchremoteweaponpings(); + self createremoteweapontrigger( weapon.remotename ); } watchfindremoteweapon( player ) { - self endon( "removed_on_death" ); - self endon( "death" ); - while ( 1 ) - { - player waittill( "find_remote_weapon" ); - player notify( "remote_weapon_ping" ); - } + self endon( "removed_on_death" ); + self endon( "death" ); + + while ( true ) + { + player waittill( "find_remote_weapon" ); + + player notify( "remote_weapon_ping", self ); + } } watchremoteweaponpings() { - self endon( "disconnect" ); - self endon( "joined_team" ); - self endon( "joined_spectators" ); - self endon( "set_active_remote_weapon" ); - self.remoteweaponqueue = []; - self thread collectweaponpings(); - while ( 1 ) - { - self waittill( "remote_weapon_ping", weapon ); - if ( isDefined( weapon ) ) - { - self.remoteweaponqueue[ self.remoteweaponqueue.size ] = weapon; - } - } + self endon( "disconnect" ); + self endon( "joined_team" ); + self endon( "joined_spectators" ); + self endon( "set_active_remote_weapon" ); + self.remoteweaponqueue = []; + self thread collectweaponpings(); + + while ( true ) + { + self waittill( "remote_weapon_ping", weapon ); + + if ( isdefined( weapon ) ) + self.remoteweaponqueue[self.remoteweaponqueue.size] = weapon; + } } collectweaponpings() { - self endon( "disconnect" ); - self endon( "joined_team" ); - self endon( "joined_spectators" ); - self waittill( "remote_weapon_ping" ); - wait 0,1; - while ( !isalive( self ) ) - { - wait 0,05; - } - if ( isDefined( self ) ) - { + self endon( "disconnect" ); + self endon( "joined_team" ); + self endon( "joined_spectators" ); + + self waittill( "remote_weapon_ping" ); + + wait 0.1; + + while ( !isalive( self ) ) + wait 0.05; + + if ( isdefined( self ) ) + { /# - assert( isDefined( self.remoteweaponqueue ) ); + assert( isdefined( self.remoteweaponqueue ) ); #/ - best_weapon = undefined; - _a186 = self.remoteweaponqueue; - _k186 = getFirstArrayKey( _a186 ); - while ( isDefined( _k186 ) ) - { - weapon = _a186[ _k186 ]; - if ( isDefined( weapon ) && isalive( weapon ) ) - { - if ( !isDefined( best_weapon ) || best_weapon.inittime < weapon.inittime ) - { - best_weapon = weapon; - } - } - _k186 = getNextArrayKey( _a186, _k186 ); - } - if ( isDefined( best_weapon ) ) - { - self thread setactiveremotecontrolledweapon( best_weapon ); - } - } + best_weapon = undefined; + + foreach ( weapon in self.remoteweaponqueue ) + { + if ( isdefined( weapon ) && isalive( weapon ) ) + { + if ( !isdefined( best_weapon ) || best_weapon.inittime < weapon.inittime ) + best_weapon = weapon; + } + } + + if ( isdefined( best_weapon ) ) + self thread setactiveremotecontrolledweapon( best_weapon ); + } } watchremotecontrolledweapondeath() { - self endon( "remove_remote_weapon" ); + self endon( "remove_remote_weapon" ); /# - assert( isDefined( self.remoteweapon ) ); + assert( isdefined( self.remoteweapon ) ); #/ - self.remoteweapon waittill( "death" ); - if ( isDefined( self ) ) - { - self notify( "remove_remote_weapon" ); - } + self.remoteweapon waittill( "death" ); + + if ( isdefined( self ) ) + self notify( "remove_remote_weapon", 1 ); } watchremoveremotecontrolledweapon( weaponname ) { - self endon( "disconnect" ); - self waittill( "remove_remote_weapon", trytoreplace ); - self removeremotecontrolledweapon( weaponname ); - while ( isDefined( self.remoteweapon ) ) - { - wait 0,05; - } - if ( trytoreplace == 1 ) - { - self notify( "find_remote_weapon" ); - } + self endon( "disconnect" ); + + self waittill( "remove_remote_weapon", trytoreplace ); + + self removeremotecontrolledweapon( weaponname ); + + while ( isdefined( self.remoteweapon ) ) + wait 0.05; + + if ( trytoreplace == 1 ) + self notify( "find_remote_weapon" ); } removeremotecontrolledweapon( weaponname ) { - if ( self isusingremote() ) - { - remoteweaponname = self getremotename(); - if ( remoteweaponname == weaponname ) - { - self baseendremotecontrolweaponuse( weaponname, 1 ); - } - } - self destroyremotecontrolactionprompthud(); - self.remoteweapon = undefined; - self.remotecontroltrigger delete(); + if ( self isusingremote() ) + { + remoteweaponname = self getremotename(); + + if ( remoteweaponname == weaponname ) + self baseendremotecontrolweaponuse( weaponname, 1 ); + } + + self destroyremotecontrolactionprompthud(); + self.remoteweapon = undefined; + self.remotecontroltrigger delete(); } createremoteweapontrigger( weaponname ) { - trigger = spawn( "trigger_radius_use", self.origin, 32, 32 ); - trigger enablelinkto(); - trigger linkto( self ); - trigger sethintlowpriority( 1 ); - trigger setcursorhint( "HINT_NOICON" ); - trigger sethintstring( level.remoteweapons[ weaponname ].hintstring ); - if ( level.teambased ) - { - trigger setteamfortrigger( self.team ); - trigger.triggerteam = self.team; - } - self clientclaimtrigger( trigger ); - trigger.claimedby = self; - self.remotecontroltrigger = trigger; - self thread watchremotetriggeruse( weaponname ); - self thread removeremotetriggerondisconnect( trigger ); + trigger = spawn( "trigger_radius_use", self.origin, 32, 32 ); + trigger enablelinkto(); + trigger linkto( self ); + trigger sethintlowpriority( 1 ); + trigger setcursorhint( "HINT_NOICON" ); + trigger sethintstring( level.remoteweapons[weaponname].hintstring ); + + if ( level.teambased ) + { + trigger setteamfortrigger( self.team ); + trigger.triggerteam = self.team; + } + + self clientclaimtrigger( trigger ); + trigger.claimedby = self; + self.remotecontroltrigger = trigger; + self thread watchremotetriggeruse( weaponname ); + self thread removeremotetriggerondisconnect( trigger ); } removeremotetriggerondisconnect( trigger ) { - self endon( "remove_remote_weapon" ); - trigger endon( "death" ); - self waittill( "disconnect" ); - trigger delete(); + self endon( "remove_remote_weapon" ); + trigger endon( "death" ); + + self waittill( "disconnect" ); + + trigger delete(); } watchremotetriggeruse( weaponname ) { - self endon( "remove_remote_weapon" ); - self endon( "disconnect" ); - if ( self is_bot() ) - { - return; - } - while ( 1 ) - { - self.remotecontroltrigger waittill( "trigger", player ); - while ( self isusingoffhand() ) - { - continue; - } - while ( isDefined( self.remoteweapon ) && isDefined( self.remoteweapon.hackertrigger ) && isDefined( self.remoteweapon.hackertrigger.progressbar ) ) - { - if ( weaponname == "killstreak_remote_turret_mp" ) - { - self iprintlnbold( &"KILLSTREAK_AUTO_TURRET_NOT_AVAILABLE" ); - } - } - if ( self usebuttonpressed() && !self.throwinggrenade && !self meleebuttonpressed() && !self isusingremote() ) - { - self useremotecontrolweapon( weaponname ); - } - } + self endon( "remove_remote_weapon" ); + self endon( "disconnect" ); + + if ( self is_bot() ) + return; + + while ( true ) + { + self.remotecontroltrigger waittill( "trigger", player ); + + if ( self isusingoffhand() ) + continue; + + if ( isdefined( self.remoteweapon ) && isdefined( self.remoteweapon.hackertrigger ) && isdefined( self.remoteweapon.hackertrigger.progressbar ) ) + { + if ( weaponname == "killstreak_remote_turret_mp" ) + self iprintlnbold( &"KILLSTREAK_AUTO_TURRET_NOT_AVAILABLE" ); + + continue; + } + + if ( self usebuttonpressed() && !self.throwinggrenade && !self meleebuttonpressed() && !self isusingremote() ) + self useremotecontrolweapon( weaponname ); + } } useremotecontrolweapon( weaponname, allowexit ) { - self disableoffhandweapons(); - self giveweapon( weaponname ); - self switchtoweapon( weaponname ); - if ( !isDefined( allowexit ) ) - { - allowexit = 1; - } - self thread maps/mp/killstreaks/_killstreaks::watchforemoveremoteweapon(); - self waittill( "weapon_change", newweapon ); - self notify( "endWatchFoRemoveRemoteWeapon" ); - self setusingremote( weaponname ); - if ( !self isonground() ) - { - self clearusingremote(); - return; - } - result = self maps/mp/killstreaks/_killstreaks::initridekillstreak( weaponname ); - if ( allowexit && result != "success" ) - { - if ( result != "disconnect" ) - { - self clearusingremote(); - } - } - else - { - if ( allowexit && !self isonground() ) - { - self clearusingremote(); - return; - return; - } - else - { - self.remoteweapon.controlled = 1; - self.remoteweapon.killcament = self; - self.remoteweapon notify( "remote_start" ); - if ( !isDefined( allowexit ) || allowexit ) - { - self thread watchremotecontroldeactivate( weaponname ); - } - self thread [[ level.remoteweapons[ weaponname ].usecallback ]]( self.remoteweapon ); - } - } + self disableoffhandweapons(); + self giveweapon( weaponname ); + self switchtoweapon( weaponname ); + + if ( !isdefined( allowexit ) ) + allowexit = 1; + + self thread maps\mp\killstreaks\_killstreaks::watchforemoveremoteweapon(); + + self waittill( "weapon_change", newweapon ); + + self notify( "endWatchFoRemoveRemoteWeapon" ); + self setusingremote( weaponname ); + + if ( !self isonground() ) + { + self clearusingremote(); + return; + } + + result = self maps\mp\killstreaks\_killstreaks::initridekillstreak( weaponname ); + + if ( allowexit && result != "success" ) + { + if ( result != "disconnect" ) + self clearusingremote(); + } + else if ( allowexit && !self isonground() ) + { + self clearusingremote(); + return; + } + else + { + self.remoteweapon.controlled = 1; + self.remoteweapon.killcament = self; + self.remoteweapon notify( "remote_start" ); + + if ( !isdefined( allowexit ) || allowexit ) + self thread watchremotecontroldeactivate( weaponname ); + + self thread [[ level.remoteweapons[weaponname].usecallback ]]( self.remoteweapon ); + } } createremotecontrolactionprompthud() { - if ( !isDefined( self.hud_prompt_exit ) ) - { - self.hud_prompt_exit = newclienthudelem( self ); - } - self.hud_prompt_exit.alignx = "left"; - self.hud_prompt_exit.aligny = "bottom"; - self.hud_prompt_exit.horzalign = "user_left"; - self.hud_prompt_exit.vertalign = "user_bottom"; - self.hud_prompt_exit.font = "small"; - self.hud_prompt_exit.fontscale = 1,25; - self.hud_prompt_exit.hidewheninmenu = 1; - self.hud_prompt_exit.archived = 0; - self.hud_prompt_exit.x = 25; - self.hud_prompt_exit.y = -10; - self.hud_prompt_exit settext( level.remoteexithint ); + if ( !isdefined( self.hud_prompt_exit ) ) + self.hud_prompt_exit = newclienthudelem( self ); + + self.hud_prompt_exit.alignx = "left"; + self.hud_prompt_exit.aligny = "bottom"; + self.hud_prompt_exit.horzalign = "user_left"; + self.hud_prompt_exit.vertalign = "user_bottom"; + self.hud_prompt_exit.font = "small"; + self.hud_prompt_exit.fontscale = 1.25; + self.hud_prompt_exit.hidewheninmenu = 1; + self.hud_prompt_exit.archived = 0; + self.hud_prompt_exit.x = 25; + self.hud_prompt_exit.y = -10; + self.hud_prompt_exit settext( level.remoteexithint ); } destroyremotecontrolactionprompthud() { - if ( isDefined( self ) && isDefined( self.hud_prompt_exit ) ) - { - self.hud_prompt_exit destroy(); - } + if ( isdefined( self ) && isdefined( self.hud_prompt_exit ) ) + self.hud_prompt_exit destroy(); } watchremotecontroldeactivate( weaponname ) { - self endon( "remove_remote_weapon" ); - self endon( "disconnect" ); - self.remoteweapon endon( "remote_start" ); - wait 1; - while ( 1 ) - { - timeused = 0; - while ( self usebuttonpressed() ) - { - timeused += 0,05; - if ( timeused > 0,25 ) - { - self thread baseendremotecontrolweaponuse( weaponname, 0 ); - return; - } - wait 0,05; - } - wait 0,05; - } + self endon( "remove_remote_weapon" ); + self endon( "disconnect" ); + self.remoteweapon endon( "remote_start" ); + wait 1; + + while ( true ) + { + timeused = 0; + + while ( self usebuttonpressed() ) + { + timeused += 0.05; + + if ( timeused > 0.25 ) + { + self thread baseendremotecontrolweaponuse( weaponname, 0 ); + return; + } + + wait 0.05; + } + + wait 0.05; + } } endremotecontrolweaponuse( weaponname ) { - if ( isDefined( self.hud_prompt_exit ) ) - { - self.hud_prompt_exit settext( "" ); - } - self [[ level.remoteweapons[ weaponname ].endusecallback ]]( self.remoteweapon ); + if ( isdefined( self.hud_prompt_exit ) ) + self.hud_prompt_exit settext( "" ); + + self [[ level.remoteweapons[weaponname].endusecallback ]]( self.remoteweapon ); } fadeouttoblack( isdead ) { - self endon( "disconnect" ); - self endon( "early_death" ); - if ( isdead ) - { - self sendkillstreakdamageevent( 600 ); - wait 0,75; - self thread maps/mp/gametypes/_hud::fadetoblackforxsec( 0, 0,25, 0,1, 0,25 ); - } - else - { - self thread maps/mp/gametypes/_hud::fadetoblackforxsec( 0, 0,2, 0, 0,3 ); - } + self endon( "disconnect" ); + self endon( "early_death" ); + + if ( isdead ) + { + self sendkillstreakdamageevent( 600 ); + wait 0.75; + self thread maps\mp\gametypes\_hud::fadetoblackforxsec( 0, 0.25, 0.1, 0.25 ); + } + else + self thread maps\mp\gametypes\_hud::fadetoblackforxsec( 0, 0.2, 0, 0.3 ); } baseendremotecontrolweaponuse( weaponname, isdead ) { - if ( isDefined( self ) ) - { - if ( isdead && isDefined( self.remoteweapon ) && !isDefined( self.remoteweapon.skipfutz ) ) - { - self thread fadeouttoblack( 1 ); - wait 1; - } - else - { - self thread fadeouttoblack( 0 ); - } - self clearusingremote(); - self takeweapon( weaponname ); - } - if ( isDefined( self.remoteweapon ) ) - { - if ( isdead ) - { - self.remoteweapon.wascontrollednowdead = self.remoteweapon.controlled; - } - self.remoteweapon.controlled = 0; - self [[ level.remoteweapons[ weaponname ].endusecallback ]]( self.remoteweapon, isdead ); - self.remoteweapon.killcament = self.remoteweapon; - self unlink(); - self.killstreak_waitamount = undefined; - self destroyremotehud(); - self clientnotify( "nofutz" ); - if ( isDefined( level.gameended ) && level.gameended ) - { - self freezecontrolswrapper( 1 ); - } - } - if ( isDefined( self.hud_prompt_exit ) ) - { - self.hud_prompt_exit settext( "" ); - } - self notify( "remove_remote_weapon" ); + if ( isdefined( self ) ) + { + if ( isdead && isdefined( self.remoteweapon ) && !isdefined( self.remoteweapon.skipfutz ) ) + { + self thread fadeouttoblack( 1 ); + wait 1; + } + else + self thread fadeouttoblack( 0 ); + + self clearusingremote(); + self takeweapon( weaponname ); + } + + if ( isdefined( self.remoteweapon ) ) + { + if ( isdead ) + self.remoteweapon.wascontrollednowdead = self.remoteweapon.controlled; + + self.remoteweapon.controlled = 0; + self [[ level.remoteweapons[weaponname].endusecallback ]]( self.remoteweapon, isdead ); + self.remoteweapon.killcament = self.remoteweapon; + self unlink(); + self.killstreak_waitamount = undefined; + self destroyremotehud(); + self clientnotify( "nofutz" ); + + if ( isdefined( level.gameended ) && level.gameended ) + self freezecontrolswrapper( 1 ); + } + + if ( isdefined( self.hud_prompt_exit ) ) + self.hud_prompt_exit settext( "" ); + + self notify( "remove_remote_weapon", 1 ); } destroyremotehud() { - self useservervisionset( 0 ); - self setinfraredvision( 0 ); - if ( isDefined( self.fullscreen_static ) ) - { - self.fullscreen_static destroy(); - } - if ( isDefined( self.remote_hud_reticle ) ) - { - self.remote_hud_reticle destroy(); - } - if ( isDefined( self.remote_hud_bracket_right ) ) - { - self.remote_hud_bracket_right destroy(); - } - if ( isDefined( self.remote_hud_bracket_left ) ) - { - self.remote_hud_bracket_left destroy(); - } - if ( isDefined( self.remote_hud_arrow_right ) ) - { - self.remote_hud_arrow_right destroy(); - } - if ( isDefined( self.remote_hud_arrow_left ) ) - { - self.remote_hud_arrow_left destroy(); - } - if ( isDefined( self.tank_rocket_1 ) ) - { - self.tank_rocket_1 destroy(); - } - if ( isDefined( self.tank_rocket_2 ) ) - { - self.tank_rocket_2 destroy(); - } - if ( isDefined( self.tank_rocket_3 ) ) - { - self.tank_rocket_3 destroy(); - } - if ( isDefined( self.tank_rocket_hint ) ) - { - self.tank_rocket_hint destroy(); - } - if ( isDefined( self.tank_mg_bar ) ) - { - self.tank_mg_bar destroy(); - } - if ( isDefined( self.tank_mg_arrow ) ) - { - self.tank_mg_arrow destroy(); - } - if ( isDefined( self.tank_mg_hint ) ) - { - self.tank_mg_hint destroy(); - } - if ( isDefined( self.tank_fullscreen_effect ) ) - { - self.tank_fullscreen_effect destroy(); - } - if ( isDefined( self.hud_prompt_exit ) ) - { - self.hud_prompt_exit destroy(); - } + self useservervisionset( 0 ); + self setinfraredvision( 0 ); + + if ( isdefined( self.fullscreen_static ) ) + self.fullscreen_static destroy(); + + if ( isdefined( self.remote_hud_reticle ) ) + self.remote_hud_reticle destroy(); + + if ( isdefined( self.remote_hud_bracket_right ) ) + self.remote_hud_bracket_right destroy(); + + if ( isdefined( self.remote_hud_bracket_left ) ) + self.remote_hud_bracket_left destroy(); + + if ( isdefined( self.remote_hud_arrow_right ) ) + self.remote_hud_arrow_right destroy(); + + if ( isdefined( self.remote_hud_arrow_left ) ) + self.remote_hud_arrow_left destroy(); + + if ( isdefined( self.tank_rocket_1 ) ) + self.tank_rocket_1 destroy(); + + if ( isdefined( self.tank_rocket_2 ) ) + self.tank_rocket_2 destroy(); + + if ( isdefined( self.tank_rocket_3 ) ) + self.tank_rocket_3 destroy(); + + if ( isdefined( self.tank_rocket_hint ) ) + self.tank_rocket_hint destroy(); + + if ( isdefined( self.tank_mg_bar ) ) + self.tank_mg_bar destroy(); + + if ( isdefined( self.tank_mg_arrow ) ) + self.tank_mg_arrow destroy(); + + if ( isdefined( self.tank_mg_hint ) ) + self.tank_mg_hint destroy(); + + if ( isdefined( self.tank_fullscreen_effect ) ) + self.tank_fullscreen_effect destroy(); + + if ( isdefined( self.hud_prompt_exit ) ) + self.hud_prompt_exit destroy(); } stunstaticfx( duration ) { - self endon( "remove_remote_weapon" ); - self.fullscreen_static.alpha = 0,65; - wait ( duration - 0,5 ); - time = duration - 0,5; - while ( time < duration ) - { - wait 0,05; - time += 0,05; - self.fullscreen_static.alpha -= 0,05; - } - self.fullscreen_static.alpha = 0,15; + self endon( "remove_remote_weapon" ); + self.fullscreen_static.alpha = 0.65; + wait( duration - 0.5 ); + time = duration - 0.5; + + while ( time < duration ) + { + wait 0.05; + time += 0.05; + self.fullscreen_static.alpha -= 0.05; + } + + self.fullscreen_static.alpha = 0.15; } diff --git a/Multiplayer Core/patch_mp/maps/mp/killstreaks/_remotemissile.gsc b/Multiplayer Core/patch_mp/maps/mp/killstreaks/_remotemissile.gsc index 83c2bbf..9b8158a 100644 --- a/Multiplayer Core/patch_mp/maps/mp/killstreaks/_remotemissile.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/killstreaks/_remotemissile.gsc @@ -1,1068 +1,1031 @@ -#include maps/mp/_scoreevents; -#include maps/mp/gametypes/_hud; -#include maps/mp/killstreaks/_killstreakrules; -#include maps/mp/killstreaks/_airsupport; -#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\_airsupport; +#include maps\mp\killstreaks\_killstreakrules; +#include maps\mp\gametypes\_spawning; +#include maps\mp\gametypes\_hud; +#include maps\mp\_scoreevents; init() { - precacheitem( "remote_missile_missile_mp" ); - precacheitem( "remote_missile_bomblet_mp" ); - precacheshader( "mp_hud_cluster_status" ); - precacheshader( "mp_hud_armed" ); - precacheshader( "mp_hud_deployed" ); - precacheshader( "reticle_side_round_big_top" ); - precacheshader( "reticle_side_round_big_right" ); - precacheshader( "reticle_side_round_big_left" ); - precacheshader( "reticle_side_round_big_bottom" ); - precacheshader( "hud_remote_missile_target" ); - level.rockets = []; - registerkillstreak( "remote_missile_mp", "remote_missile_mp", "killstreak_remote_missile", "remote_missle_used", ::tryusepredatormissile, 1 ); - registerkillstreakaltweapon( "remote_missile_mp", "remote_missile_missile_mp" ); - registerkillstreakaltweapon( "remote_missile_mp", "remote_missile_bomblet_mp" ); - registerkillstreakstrings( "remote_missile_mp", &"KILLSTREAK_EARNED_REMOTE_MISSILE", &"KILLSTREAK_REMOTE_MISSILE_NOT_AVAILABLE", &"KILLSTREAK_REMOTE_MISSILE_INBOUND" ); - registerkillstreakdialog( "remote_missile_mp", "mpl_killstreak_cruisemissile", "kls_predator_used", "", "", "", "kls_predator_ready" ); - registerkillstreakdevdvar( "remote_missile_mp", "scr_givemissileremote" ); - setkillstreakteamkillpenaltyscale( "remote_missile_mp", level.teamkillreducedpenalty ); - overrideentitycameraindemo( "remote_missile_mp", 1 ); - registerclientfield( "missile", "remote_missile_bomblet_fired", 1, 1, "int" ); - registerclientfield( "missile", "remote_missile_fired", 1, 2, "int" ); - level.missilesforsighttraces = []; - level.missileremotedeployfx = loadfx( "weapon/predator/fx_predator_cluster_trigger" ); - level.missileremotelaunchvert = 18000; - level.missileremotelaunchhorz = 7000; - level.missileremotelaunchtargetdist = 1500; + precacheitem( "remote_missile_missile_mp" ); + precacheitem( "remote_missile_bomblet_mp" ); + precacheshader( "mp_hud_cluster_status" ); + precacheshader( "mp_hud_armed" ); + precacheshader( "mp_hud_deployed" ); + precacheshader( "reticle_side_round_big_top" ); + precacheshader( "reticle_side_round_big_right" ); + precacheshader( "reticle_side_round_big_left" ); + precacheshader( "reticle_side_round_big_bottom" ); + precacheshader( "hud_remote_missile_target" ); + level.rockets = []; + registerkillstreak( "remote_missile_mp", "remote_missile_mp", "killstreak_remote_missile", "remote_missle_used", ::tryusepredatormissile, 1 ); + registerkillstreakaltweapon( "remote_missile_mp", "remote_missile_missile_mp" ); + registerkillstreakaltweapon( "remote_missile_mp", "remote_missile_bomblet_mp" ); + registerkillstreakstrings( "remote_missile_mp", &"KILLSTREAK_EARNED_REMOTE_MISSILE", &"KILLSTREAK_REMOTE_MISSILE_NOT_AVAILABLE", &"KILLSTREAK_REMOTE_MISSILE_INBOUND" ); + registerkillstreakdialog( "remote_missile_mp", "mpl_killstreak_cruisemissile", "kls_predator_used", "", "", "", "kls_predator_ready" ); + registerkillstreakdevdvar( "remote_missile_mp", "scr_givemissileremote" ); + setkillstreakteamkillpenaltyscale( "remote_missile_mp", level.teamkillreducedpenalty ); + overrideentitycameraindemo( "remote_missile_mp", 1 ); + registerclientfield( "missile", "remote_missile_bomblet_fired", 1, 1, "int" ); + registerclientfield( "missile", "remote_missile_fired", 1, 2, "int" ); + level.missilesforsighttraces = []; + level.missileremotedeployfx = loadfx( "weapon/predator/fx_predator_cluster_trigger" ); + level.missileremotelaunchvert = 18000; + level.missileremotelaunchhorz = 7000; + level.missileremotelaunchtargetdist = 1500; } remote_missile_game_end_think( missile, team, killstreak_id, snd_first, snd_third ) { - missile endon( "deleted" ); - self endon( "joined_team" ); - self endon( "joined_spectators" ); - self endon( "disconnect" ); - self endon( "Remotemissle_killstreak_done" ); - level waittill( "game_ended" ); - missile_end_sounds( missile, snd_first, snd_third ); - self player_missile_end( missile, 1, 1 ); - maps/mp/killstreaks/_killstreakrules::killstreakstop( "remote_missile_mp", team, killstreak_id ); - if ( isDefined( missile ) ) - { - missile delete(); - } - self notify( "Remotemissle_killstreak_done" ); + missile endon( "deleted" ); + self endon( "joined_team" ); + self endon( "joined_spectators" ); + self endon( "disconnect" ); + self endon( "Remotemissle_killstreak_done" ); + + level waittill( "game_ended" ); + + missile_end_sounds( missile, snd_first, snd_third ); + self player_missile_end( missile, 1, 1 ); + maps\mp\killstreaks\_killstreakrules::killstreakstop( "remote_missile_mp", team, killstreak_id ); + + if ( isdefined( missile ) ) + missile delete(); + + self notify( "Remotemissle_killstreak_done" ); } tryusepredatormissile( lifeid ) { - if ( !self isonground() || self isusingremote() ) - { - self iprintlnbold( &"KILLSTREAK_REMOTE_MISSILE_NOT_USABLE" ); - return 0; - } - team = self.team; - killstreak_id = self maps/mp/killstreaks/_killstreakrules::killstreakstart( "remote_missile_mp", team, 0, 1 ); - if ( killstreak_id == -1 ) - { - return 0; - } - returnvar = _fire( lifeid, self, team, killstreak_id ); - return returnvar; + if ( !self isonground() || self isusingremote() ) + { + self iprintlnbold( &"KILLSTREAK_REMOTE_MISSILE_NOT_USABLE" ); + return 0; + } + + team = self.team; + killstreak_id = self maps\mp\killstreaks\_killstreakrules::killstreakstart( "remote_missile_mp", team, 0, 1 ); + + if ( killstreak_id == -1 ) + return 0; + + returnvar = _fire( lifeid, self, team, killstreak_id ); + return returnvar; } getbestspawnpoint( remotemissilespawnpoints ) { - validenemies = []; - _a102 = remotemissilespawnpoints; - _k102 = getFirstArrayKey( _a102 ); - while ( isDefined( _k102 ) ) - { - spawnpoint = _a102[ _k102 ]; - spawnpoint.validplayers = []; - spawnpoint.spawnscore = 0; - _k102 = getNextArrayKey( _a102, _k102 ); - } - _a108 = level.players; - _k108 = getFirstArrayKey( _a108 ); - while ( isDefined( _k108 ) ) - { - player = _a108[ _k108 ]; - if ( !isalive( player ) ) - { - } - else if ( player.team == self.team ) - { - } - else if ( player.team == "spectator" ) - { - } - else - { - bestdistance = 999999999; - bestspawnpoint = undefined; - _a122 = remotemissilespawnpoints; - _k122 = getFirstArrayKey( _a122 ); - while ( isDefined( _k122 ) ) - { - spawnpoint = _a122[ _k122 ]; - spawnpoint.validplayers[ spawnpoint.validplayers.size ] = player; - potentialbestdistance = distance2dsquared( spawnpoint.targetent.origin, player.origin ); - if ( potentialbestdistance <= bestdistance ) - { - bestdistance = potentialbestdistance; - bestspawnpoint = spawnpoint; - } - _k122 = getNextArrayKey( _a122, _k122 ); - } - bestspawnpoint.spawnscore += 2; - } - _k108 = getNextArrayKey( _a108, _k108 ); - } - bestspawn = remotemissilespawnpoints[ 0 ]; - _a140 = remotemissilespawnpoints; - _k140 = getFirstArrayKey( _a140 ); - while ( isDefined( _k140 ) ) - { - spawnpoint = _a140[ _k140 ]; - _a142 = spawnpoint.validplayers; - _k142 = getFirstArrayKey( _a142 ); - while ( isDefined( _k142 ) ) - { - player = _a142[ _k142 ]; - spawnpoint.spawnscore += 1; - if ( bullettracepassed( player.origin + vectorScale( ( 0, 0, 1 ), 32 ), spawnpoint.origin, 0, player ) ) - { - spawnpoint.spawnscore += 3; - } - if ( spawnpoint.spawnscore > bestspawn.spawnscore ) - { - bestspawn = spawnpoint; - } - else - { - if ( spawnpoint.spawnscore == bestspawn.spawnscore ) - { - if ( cointoss() ) - { - bestspawn = spawnpoint; - } - } - } - _k142 = getNextArrayKey( _a142, _k142 ); - } - _k140 = getNextArrayKey( _a140, _k140 ); - } - return bestspawn; + validenemies = []; + + foreach ( spawnpoint in remotemissilespawnpoints ) + { + spawnpoint.validplayers = []; + spawnpoint.spawnscore = 0; + } + + foreach ( player in level.players ) + { + if ( !isalive( player ) ) + continue; + + if ( player.team == self.team ) + continue; + + if ( player.team == "spectator" ) + continue; + + bestdistance = 999999999; + bestspawnpoint = undefined; + + foreach ( spawnpoint in remotemissilespawnpoints ) + { + spawnpoint.validplayers[spawnpoint.validplayers.size] = player; + potentialbestdistance = distance2dsquared( spawnpoint.targetent.origin, player.origin ); + + if ( potentialbestdistance <= bestdistance ) + { + bestdistance = potentialbestdistance; + bestspawnpoint = spawnpoint; + } + } + + bestspawnpoint.spawnscore += 2; + } + + bestspawn = remotemissilespawnpoints[0]; + + foreach ( spawnpoint in remotemissilespawnpoints ) + { + foreach ( player in spawnpoint.validplayers ) + { + spawnpoint.spawnscore += 1; + + if ( bullettracepassed( player.origin + vectorscale( ( 0, 0, 1 ), 32.0 ), spawnpoint.origin, 0, player ) ) + spawnpoint.spawnscore += 3; + + if ( spawnpoint.spawnscore > bestspawn.spawnscore ) + { + bestspawn = spawnpoint; + continue; + } + + if ( spawnpoint.spawnscore == bestspawn.spawnscore ) + { + if ( cointoss() ) + bestspawn = spawnpoint; + } + } + } + + return bestspawn; } drawline( start, end, timeslice, color ) { /# - drawtime = int( timeslice * 20 ); - time = 0; - while ( time < drawtime ) - { - line( start, end, color, 0, 1 ); - wait 0,05; - time++; + drawtime = int( timeslice * 20 ); + + for ( time = 0; time < drawtime; time++ ) + { + line( start, end, color, 0, 1 ); + wait 0.05; + } #/ - } } _fire( lifeid, player, team, killstreak_id ) { - remotemissilespawnarray = getentarray( "remoteMissileSpawn", "targetname" ); - _a180 = remotemissilespawnarray; - _k180 = getFirstArrayKey( _a180 ); - while ( isDefined( _k180 ) ) - { - spawn = _a180[ _k180 ]; - if ( isDefined( spawn.target ) ) - { - spawn.targetent = getent( spawn.target, "targetname" ); - } - _k180 = getNextArrayKey( _a180, _k180 ); - } - if ( remotemissilespawnarray.size > 0 ) - { - remotemissilespawn = player getbestspawnpoint( remotemissilespawnarray ); - } - else - { - remotemissilespawn = undefined; - } - if ( isDefined( remotemissilespawn ) ) - { - startpos = remotemissilespawn.origin; - targetpos = remotemissilespawn.targetent.origin; - vector = vectornormalize( startpos - targetpos ); - startpos = ( vector * level.missileremotelaunchvert ) + targetpos; - } - else - { - upvector = ( 0, 0, level.missileremotelaunchvert ); - backdist = level.missileremotelaunchhorz; - targetdist = level.missileremotelaunchtargetdist; - forward = anglesToForward( player.angles ); - startpos = ( player.origin + upvector ) + ( forward * backdist * -1 ); - targetpos = player.origin + ( forward * targetdist ); - } - player.killstreak_waitamount = 10; - self setusingremote( "remote_missile_mp" ); - self freezecontrolswrapper( 1 ); - player disableweaponcycling(); - result = self maps/mp/killstreaks/_killstreaks::initridekillstreak( "qrdrone" ); - if ( result != "success" ) - { - if ( result != "disconnect" ) - { - player freezecontrolswrapper( 0 ); - player clearusingremote(); - player enableweaponcycling(); - player.killstreak_waitamount = undefined; - maps/mp/killstreaks/_killstreakrules::killstreakstop( "remote_missile_mp", team, killstreak_id ); - } - return 0; - } - rocket = magicbullet( "remote_missile_missile_mp", startpos, targetpos, player ); - forceanglevector = vectornormalize( targetpos - startpos ); - rocket.angles = vectorToAngle( forceanglevector ); - rocket.targetname = "remote_missile"; - rocket.team = team; - rocket setteam( team ); - rocket thread handledamage(); - player linktomissile( rocket, 1 ); - rocket.owner = player; - rocket.killcament = player; - player thread cleanupwaiter( rocket, player.team, killstreak_id, rocket.snd_first, rocket.snd_third ); - if ( isDefined( level.remote_missile_vision ) ) - { - self useservervisionset( 1 ); - self setvisionsetforplayer( level.remote_missile_vision, 1 ); - } - self setclientflag( 2 ); - self maps/mp/killstreaks/_killstreaks::playkillstreakstartdialog( "remote_missile_mp", self.pers[ "team" ] ); - level.globalkillstreakscalled++; - self addweaponstat( "remote_missile_mp", "used", 1 ); - rocket thread setup_rockect_map_icon(); - rocket missile_sound_play( player ); - rocket thread missile_timeout_watch(); - rocket thread missile_sound_impact( player, 4000 ); - player thread missile_sound_boost( rocket ); - player thread missile_deploy_watch( rocket ); - player thread watchownerteamkillkicked( rocket ); - player thread remote_missile_game_end_think( rocket, player.team, killstreak_id, rocket.snd_first, rocket.snd_third ); - player thread watch_missile_death( rocket, player.team, killstreak_id, rocket.snd_first, rocket.snd_third ); - rocket maps/mp/gametypes/_spawning::create_tvmissile_influencers( team ); - player freezecontrolswrapper( 0 ); - player clearusingremote(); - player enableweaponcycling(); - player waittill( "Remotemissle_killstreak_done" ); - return 1; + remotemissilespawnarray = getentarray( "remoteMissileSpawn", "targetname" ); + + foreach ( spawn in remotemissilespawnarray ) + { + if ( isdefined( spawn.target ) ) + spawn.targetent = getent( spawn.target, "targetname" ); + } + + if ( remotemissilespawnarray.size > 0 ) + remotemissilespawn = player getbestspawnpoint( remotemissilespawnarray ); + else + remotemissilespawn = undefined; + + if ( isdefined( remotemissilespawn ) ) + { + startpos = remotemissilespawn.origin; + targetpos = remotemissilespawn.targetent.origin; + vector = vectornormalize( startpos - targetpos ); + startpos = vector * level.missileremotelaunchvert + targetpos; + } + else + { + upvector = ( 0, 0, level.missileremotelaunchvert ); + backdist = level.missileremotelaunchhorz; + targetdist = level.missileremotelaunchtargetdist; + forward = anglestoforward( player.angles ); + startpos = player.origin + upvector + forward * backdist * -1; + targetpos = player.origin + forward * targetdist; + } + + player.killstreak_waitamount = 10; + self setusingremote( "remote_missile_mp" ); + self freezecontrolswrapper( 1 ); + player disableweaponcycling(); + result = self maps\mp\killstreaks\_killstreaks::initridekillstreak( "qrdrone" ); + + if ( result != "success" ) + { + if ( result != "disconnect" ) + { + player freezecontrolswrapper( 0 ); + player clearusingremote(); + player enableweaponcycling(); + player.killstreak_waitamount = undefined; + maps\mp\killstreaks\_killstreakrules::killstreakstop( "remote_missile_mp", team, killstreak_id ); + } + + return false; + } + + rocket = magicbullet( "remote_missile_missile_mp", startpos, targetpos, player ); + forceanglevector = vectornormalize( targetpos - startpos ); + rocket.angles = vectortoangles( forceanglevector ); + rocket.targetname = "remote_missile"; + rocket.team = team; + rocket setteam( team ); + rocket thread handledamage(); + player linktomissile( rocket, 1 ); + rocket.owner = player; + rocket.killcament = player; + player thread cleanupwaiter( rocket, player.team, killstreak_id, rocket.snd_first, rocket.snd_third ); + + if ( isdefined( level.remote_missile_vision ) ) + { + self useservervisionset( 1 ); + self setvisionsetforplayer( level.remote_missile_vision, 1 ); + } + + self setclientflag( 2 ); + self maps\mp\killstreaks\_killstreaks::playkillstreakstartdialog( "remote_missile_mp", self.pers["team"] ); + level.globalkillstreakscalled++; + self addweaponstat( "remote_missile_mp", "used", 1 ); + rocket thread setup_rockect_map_icon(); + rocket missile_sound_play( player ); + rocket thread missile_timeout_watch(); + rocket thread missile_sound_impact( player, 4000 ); + player thread missile_sound_boost( rocket ); + player thread missile_deploy_watch( rocket ); + player thread watchownerteamkillkicked( rocket ); + player thread remote_missile_game_end_think( rocket, player.team, killstreak_id, rocket.snd_first, rocket.snd_third ); + player thread watch_missile_death( rocket, player.team, killstreak_id, rocket.snd_first, rocket.snd_third ); + rocket maps\mp\gametypes\_spawning::create_tvmissile_influencers( team ); + player freezecontrolswrapper( 0 ); + player clearusingremote(); + player enableweaponcycling(); + + player waittill( "Remotemissle_killstreak_done" ); + + return true; } setup_rockect_map_icon() { - wait 0,1; - self setclientfield( "remote_missile_fired", 1 ); + wait 0.1; + self setclientfield( "remote_missile_fired", 1 ); } watchownerteamkillkicked( rocket ) { - rocket endon( "death" ); - rocket endon( "deleted" ); - self waittill( "teamKillKicked" ); - rocket remove_tvmissile_influencers(); - rocket detonate(); + rocket endon( "death" ); + rocket endon( "deleted" ); + + self waittill( "teamKillKicked" ); + + rocket remove_tvmissile_influencers(); + rocket detonate(); } watch_missile_death( rocket, team, killstreak_id, snd_first, snd_third ) { - level endon( "game_ended" ); - rocket endon( "deleted" ); - self endon( "joined_team" ); - self endon( "joined_spectators" ); - self endon( "disconnect" ); - rocket waittill( "death" ); - missile_end_sounds( rocket, snd_first, snd_third ); - self player_missile_end( rocket, 1, 1 ); - maps/mp/killstreaks/_killstreakrules::killstreakstop( "remote_missile_mp", team, killstreak_id ); - self notify( "Remotemissle_killstreak_done" ); + level endon( "game_ended" ); + rocket endon( "deleted" ); + self endon( "joined_team" ); + self endon( "joined_spectators" ); + self endon( "disconnect" ); + + rocket waittill( "death" ); + + missile_end_sounds( rocket, snd_first, snd_third ); + self player_missile_end( rocket, 1, 1 ); + maps\mp\killstreaks\_killstreakrules::killstreakstop( "remote_missile_mp", team, killstreak_id ); + self notify( "Remotemissle_killstreak_done" ); } player_missile_end( rocket, performplayerkillstreakend, unlink ) { - if ( isDefined( self ) ) - { - self thread destroy_missile_hud(); - if ( isDefined( performplayerkillstreakend ) && performplayerkillstreakend ) - { - self playrumbleonentity( "grenade_rumble" ); - if ( level.gameended == 0 ) - { - self sendkillstreakdamageevent( 600 ); - self thread maps/mp/gametypes/_hud::fadetoblackforxsec( 0, 0,25, 0,1, 0,25 ); - wait 0,25; - } - if ( isDefined( rocket ) ) - { - rocket hide(); - } - } - self clearclientflag( 2 ); - self useservervisionset( 0 ); - if ( unlink ) - { - self unlinkfrommissile(); - } - self notify( "remotemissile_done" ); - self freezecontrolswrapper( 0 ); - self clearusingremote(); - self enableweaponcycling(); - if ( isDefined( self ) ) - { - self.killstreak_waitamount = undefined; - } - } + if ( isdefined( self ) ) + { + self thread destroy_missile_hud(); + + if ( isdefined( performplayerkillstreakend ) && performplayerkillstreakend ) + { + self playrumbleonentity( "grenade_rumble" ); + + if ( level.gameended == 0 ) + { + self sendkillstreakdamageevent( 600 ); + self thread maps\mp\gametypes\_hud::fadetoblackforxsec( 0, 0.25, 0.1, 0.25 ); + wait 0.25; + } + + if ( isdefined( rocket ) ) + rocket hide(); + } + + self clearclientflag( 2 ); + self useservervisionset( 0 ); + + if ( unlink ) + self unlinkfrommissile(); + + self notify( "remotemissile_done" ); + self freezecontrolswrapper( 0 ); + self clearusingremote(); + self enableweaponcycling(); + + if ( isdefined( self ) ) + self.killstreak_waitamount = undefined; + } } missile_end_sounds( rocket, snd_first, snd_third ) { - if ( isDefined( rocket ) ) - { - rocket maps/mp/gametypes/_spawning::remove_tvmissile_influencers(); - rocket missile_sound_stop(); - } - else - { - if ( isDefined( snd_first ) ) - { - snd_first delete(); - } - if ( isDefined( snd_third ) ) - { - snd_third delete(); - } - } + if ( isdefined( rocket ) ) + { + rocket maps\mp\gametypes\_spawning::remove_tvmissile_influencers(); + rocket missile_sound_stop(); + } + else + { + if ( isdefined( snd_first ) ) + snd_first delete(); + + if ( isdefined( snd_third ) ) + snd_third delete(); + } } missile_timeout_watch() { - self endon( "death" ); - wait 9,95; - if ( isDefined( self ) ) - { - self maps/mp/gametypes/_spawning::remove_tvmissile_influencers(); - self missile_sound_stop(); - } + self endon( "death" ); + wait 9.95; + + if ( isdefined( self ) ) + { + self maps\mp\gametypes\_spawning::remove_tvmissile_influencers(); + self missile_sound_stop(); + } } cleanupwaiter( rocket, team, killstreak_id, snd_first, snd_third ) { - rocket endon( "death" ); - rocket endon( "deleted" ); - self waittill_any( "joined_team", "joined_spectators", "disconnect" ); - missile_end_sounds( rocket, snd_first, snd_third ); - self player_missile_end( rocket, 0, 0 ); - maps/mp/killstreaks/_killstreakrules::killstreakstop( "remote_missile_mp", team, killstreak_id ); - if ( isDefined( rocket ) ) - { - rocket delete(); - } - self notify( "Remotemissle_killstreak_done" ); + rocket endon( "death" ); + rocket endon( "deleted" ); + self waittill_any( "joined_team", "joined_spectators", "disconnect" ); + missile_end_sounds( rocket, snd_first, snd_third ); + self player_missile_end( rocket, 0, 0 ); + maps\mp\killstreaks\_killstreakrules::killstreakstop( "remote_missile_mp", team, killstreak_id ); + + if ( isdefined( rocket ) ) + rocket delete(); + + self notify( "Remotemissle_killstreak_done" ); } _fire_noplayer( lifeid, player ) { /# - upvector = ( 0, 0, level.missileremotelaunchvert ); - backdist = level.missileremotelaunchhorz; - targetdist = level.missileremotelaunchtargetdist; - forward = anglesToForward( player.angles ); - startpos = ( player.origin + upvector ) + ( forward * backdist * -1 ); - targetpos = player.origin + ( forward * targetdist ); - rocket = magicbullet( "remotemissile_projectile_mp", startpos, targetpos, player ); - if ( !isDefined( rocket ) ) - { - return; - } - rocket thread handledamage(); - rocket.lifeid = lifeid; - rocket.type = "remote"; - rocket thread rocket_cleanupondeath(); - wait 2; + upvector = ( 0, 0, level.missileremotelaunchvert ); + backdist = level.missileremotelaunchhorz; + targetdist = level.missileremotelaunchtargetdist; + forward = anglestoforward( player.angles ); + startpos = player.origin + upvector + forward * backdist * -1; + targetpos = player.origin + forward * targetdist; + rocket = magicbullet( "remotemissile_projectile_mp", startpos, targetpos, player ); + + if ( !isdefined( rocket ) ) + return; + + rocket thread handledamage(); + rocket.lifeid = lifeid; + rocket.type = "remote"; + rocket thread rocket_cleanupondeath(); + wait 2.0; #/ } handledamage() { - self endon( "death" ); - self endon( "deleted" ); - self setcandamage( 1 ); - self.health = 99999; - for ( ;; ) - { - self waittill( "damage", damage, attacker, direction_vec, point, meansofdeath, tagname, modelname, partname, weapon ); - if ( isDefined( attacker ) && isDefined( self.owner ) ) - { - if ( self.owner isenemyplayer( attacker ) ) - { - maps/mp/_scoreevents::processscoreevent( "destroyed_remote_missile", attacker, self.owner, weapon ); - attacker addweaponstat( weapon, "destroyed_controlled_killstreak", 1 ); - break; - } - self.owner sendkillstreakdamageevent( int( damage ) ); - } - self remove_tvmissile_influencers(); - self detonate(); - } + self endon( "death" ); + self endon( "deleted" ); + self setcandamage( 1 ); + self.health = 99999; + + for (;;) + { + self waittill( "damage", damage, attacker, direction_vec, point, meansofdeath, tagname, modelname, partname, weapon ); + + if ( isdefined( attacker ) && isdefined( self.owner ) ) + { + if ( self.owner isenemyplayer( attacker ) ) + { + maps\mp\_scoreevents::processscoreevent( "destroyed_remote_missile", attacker, self.owner, weapon ); + attacker addweaponstat( weapon, "destroyed_controlled_killstreak", 1 ); + } + else + { + + } + + self.owner sendkillstreakdamageevent( int( damage ) ); + } + + self remove_tvmissile_influencers(); + self detonate(); + } } staticeffect( duration ) { - self endon( "disconnect" ); - staticbg = newclienthudelem( self ); - staticbg.horzalign = "fullscreen"; - staticbg.vertalign = "fullscreen"; - staticbg setshader( "white", 640, 480 ); - staticbg.archive = 1; - staticbg.sort = 10; - staticbg.immunetodemogamehudsettings = 1; - static = newclienthudelem( self ); - static.horzalign = "fullscreen"; - static.vertalign = "fullscreen"; - static.archive = 1; - static.sort = 20; - static.immunetodemogamehudsettings = 1; - self setclientflag( 4 ); - wait duration; - self clearclientflag( 4 ); - static destroy(); - staticbg destroy(); + self endon( "disconnect" ); + staticbg = newclienthudelem( self ); + staticbg.horzalign = "fullscreen"; + staticbg.vertalign = "fullscreen"; + staticbg setshader( "white", 640, 480 ); + staticbg.archive = 1; + staticbg.sort = 10; + staticbg.immunetodemogamehudsettings = 1; + static = newclienthudelem( self ); + static.horzalign = "fullscreen"; + static.vertalign = "fullscreen"; + static.archive = 1; + static.sort = 20; + static.immunetodemogamehudsettings = 1; + self setclientflag( 4 ); + wait( duration ); + self clearclientflag( 4 ); + static destroy(); + staticbg destroy(); } rocket_cleanupondeath() { - entitynumber = self getentitynumber(); - level.rockets[ entitynumber ] = self; - self waittill( "death" ); + entitynumber = self getentitynumber(); + level.rockets[entitynumber] = self; + + self waittill( "death" ); + + level.rockets[entitynumber] = undefined; } missile_sound_play( player ) { - snd_first_person = spawn( "script_model", self.origin ); - snd_first_person setmodel( "tag_origin" ); - snd_first_person linkto( self ); - snd_first_person setinvisibletoall(); - snd_first_person setvisibletoplayer( player ); - snd_first_person playloopsound( "wpn_remote_missile_loop_plr", 0,5 ); - self.snd_first = snd_first_person; - snd_third_person = spawn( "script_model", self.origin ); - snd_third_person setmodel( "tag_origin" ); - snd_third_person linkto( self ); - snd_third_person setvisibletoall(); - snd_third_person setinvisibletoplayer( player ); - snd_third_person playloopsound( "wpn_remote_missile_loop_npc", 0,2 ); - self.snd_third = snd_third_person; + snd_first_person = spawn( "script_model", self.origin ); + snd_first_person setmodel( "tag_origin" ); + snd_first_person linkto( self ); + snd_first_person setinvisibletoall(); + snd_first_person setvisibletoplayer( player ); + snd_first_person playloopsound( "wpn_remote_missile_loop_plr", 0.5 ); + self.snd_first = snd_first_person; + snd_third_person = spawn( "script_model", self.origin ); + snd_third_person setmodel( "tag_origin" ); + snd_third_person linkto( self ); + snd_third_person setvisibletoall(); + snd_third_person setinvisibletoplayer( player ); + snd_third_person playloopsound( "wpn_remote_missile_loop_npc", 0.2 ); + self.snd_third = snd_third_person; } missile_sound_boost( rocket ) { - self endon( "remotemissile_done" ); - self endon( "joined_team" ); - self endon( "joined_spectators" ); - self endon( "disconnect" ); - self waittill( "missile_boost" ); - rocket.snd_first playloopsound( "wpn_remote_missile_boost_plr" ); - rocket.snd_first playsound( "wpn_remote_missile_fire_boost" ); - self playrumbleonentity( "sniper_fire" ); - if ( ( rocket.origin[ 2 ] - self.origin[ 2 ] ) > 4000 ) - { - rocket notify( "stop_impact_sound" ); - rocket thread missile_sound_impact( self, 6000 ); - } + self endon( "remotemissile_done" ); + self endon( "joined_team" ); + self endon( "joined_spectators" ); + self endon( "disconnect" ); + + self waittill( "missile_boost" ); + + rocket.snd_first playloopsound( "wpn_remote_missile_boost_plr" ); + rocket.snd_first playsound( "wpn_remote_missile_fire_boost" ); + self playrumbleonentity( "sniper_fire" ); + + if ( rocket.origin[2] - self.origin[2] > 4000 ) + { + rocket notify( "stop_impact_sound" ); + rocket thread missile_sound_impact( self, 6000 ); + } } missile_sound_impact( player, distance ) { - self endon( "death" ); - self endon( "stop_impact_sound" ); - player endon( "disconnect" ); - player endon( "remotemissile_done" ); - player endon( "joined_team" ); - player endon( "joined_spectators" ); - for ( ;; ) - { - if ( ( self.origin[ 2 ] - player.origin[ 2 ] ) < distance ) - { - self playsound( "wpn_remote_missile_inc" ); - return; - } - wait 0,05; - } + self endon( "death" ); + self endon( "stop_impact_sound" ); + player endon( "disconnect" ); + player endon( "remotemissile_done" ); + player endon( "joined_team" ); + player endon( "joined_spectators" ); + + for (;;) + { + if ( self.origin[2] - player.origin[2] < distance ) + { + self playsound( "wpn_remote_missile_inc" ); + return; + } + + wait 0.05; + } } missile_sound_deploy_bomblets() { - self.snd_first playloopsound( "wpn_remote_missile_loop_plr", 0,5 ); + self.snd_first playloopsound( "wpn_remote_missile_loop_plr", 0.5 ); } missile_sound_stop() { - self.snd_first delete(); - self.snd_third delete(); + self.snd_first delete(); + self.snd_third delete(); } getvalidtargets( rocket, trace ) { - pixbeginevent( "remotemissile_getVTs_header" ); - targets = []; - forward = anglesToForward( rocket.angles ); - rocketz = rocket.origin[ 2 ]; - mapcenterz = level.mapcenter[ 2 ]; - diff = mapcenterz - rocketz; - ratio = diff / forward[ 2 ]; - aimtarget = rocket.origin + ( forward * ratio ); - rocket.aimtarget = aimtarget; - pixendevent(); - pixbeginevent( "remotemissile_getVTs_enemies" ); - enemies = self getenemies( 1 ); - _a606 = enemies; - _k606 = getFirstArrayKey( _a606 ); - while ( isDefined( _k606 ) ) - { - player = _a606[ _k606 ]; - if ( distance2dsquared( player.origin, aimtarget ) < 360000 && !player hasperk( "specialty_nokillstreakreticle" ) ) - { - if ( trace ) - { - if ( bullettracepassed( player.origin + vectorScale( ( 0, 0, 1 ), 60 ), player.origin + vectorScale( ( 0, 0, 1 ), 180 ), 0, player ) ) - { - targets[ targets.size ] = player; - } - break; - } - else - { - targets[ targets.size ] = player; - } - } - _k606 = getNextArrayKey( _a606, _k606 ); - } - dogs = getentarray( "attack_dog", "targetname" ); - _a626 = dogs; - _k626 = getFirstArrayKey( _a626 ); - while ( isDefined( _k626 ) ) - { - dog = _a626[ _k626 ]; - if ( dog.aiteam != self.team && distance2dsquared( dog.origin, aimtarget ) < 360000 ) - { - if ( trace ) - { - if ( bullettracepassed( dog.origin + vectorScale( ( 0, 0, 1 ), 60 ), dog.origin + vectorScale( ( 0, 0, 1 ), 180 ), 0, dog ) ) - { - targets[ targets.size ] = dog; - } - break; - } - else - { - targets[ targets.size ] = dog; - } - } - _k626 = getNextArrayKey( _a626, _k626 ); - } - tanks = getentarray( "talon", "targetname" ); - _a646 = tanks; - _k646 = getFirstArrayKey( _a646 ); - while ( isDefined( _k646 ) ) - { - tank = _a646[ _k646 ]; - if ( tank.aiteam != self.team && distance2dsquared( tank.origin, aimtarget ) < 360000 ) - { - if ( trace ) - { - if ( bullettracepassed( tank.origin + vectorScale( ( 0, 0, 1 ), 60 ), tank.origin + vectorScale( ( 0, 0, 1 ), 180 ), 0, tank ) ) - { - targets[ targets.size ] = tank; - } - break; - } - else - { - targets[ targets.size ] = tank; - } - } - _k646 = getNextArrayKey( _a646, _k646 ); - } - turrets = getentarray( "auto_turret", "classname" ); - _a665 = turrets; - _k665 = getFirstArrayKey( _a665 ); - while ( isDefined( _k665 ) ) - { - turret = _a665[ _k665 ]; - if ( turret.team != self.team && distance2dsquared( turret.origin, aimtarget ) < 360000 ) - { - if ( trace ) - { - if ( bullettracepassed( turret.origin + vectorScale( ( 0, 0, 1 ), 60 ), turret.origin + vectorScale( ( 0, 0, 1 ), 180 ), 0, turret ) ) - { - targets[ targets.size ] = turret; - } - break; - } - else - { - targets[ targets.size ] = turret; - } - } - _k665 = getNextArrayKey( _a665, _k665 ); - } - pixendevent(); - return targets; + pixbeginevent( "remotemissile_getVTs_header" ); + targets = []; + forward = anglestoforward( rocket.angles ); + rocketz = rocket.origin[2]; + mapcenterz = level.mapcenter[2]; + diff = mapcenterz - rocketz; + ratio = diff / forward[2]; + aimtarget = rocket.origin + forward * ratio; + rocket.aimtarget = aimtarget; + pixendevent(); + pixbeginevent( "remotemissile_getVTs_enemies" ); + enemies = self getenemies( 1 ); + + foreach ( player in enemies ) + { + if ( distance2dsquared( player.origin, aimtarget ) < 360000 && !player hasperk( "specialty_nokillstreakreticle" ) ) + { + if ( trace ) + { + if ( bullettracepassed( player.origin + vectorscale( ( 0, 0, 1 ), 60.0 ), player.origin + vectorscale( ( 0, 0, 1 ), 180.0 ), 0, player ) ) + targets[targets.size] = player; + + continue; + } + + targets[targets.size] = player; + } + } + + dogs = getentarray( "attack_dog", "targetname" ); + + foreach ( dog in dogs ) + { + if ( dog.aiteam != self.team && distance2dsquared( dog.origin, aimtarget ) < 360000 ) + { + if ( trace ) + { + if ( bullettracepassed( dog.origin + vectorscale( ( 0, 0, 1 ), 60.0 ), dog.origin + vectorscale( ( 0, 0, 1 ), 180.0 ), 0, dog ) ) + targets[targets.size] = dog; + + continue; + } + + targets[targets.size] = dog; + } + } + + tanks = getentarray( "talon", "targetname" ); + + foreach ( tank in tanks ) + { + if ( tank.aiteam != self.team && distance2dsquared( tank.origin, aimtarget ) < 360000 ) + { + if ( trace ) + { + if ( bullettracepassed( tank.origin + vectorscale( ( 0, 0, 1 ), 60.0 ), tank.origin + vectorscale( ( 0, 0, 1 ), 180.0 ), 0, tank ) ) + targets[targets.size] = tank; + + continue; + } + + targets[targets.size] = tank; + } + } + + turrets = getentarray( "auto_turret", "classname" ); + + foreach ( turret in turrets ) + { + if ( turret.team != self.team && distance2dsquared( turret.origin, aimtarget ) < 360000 ) + { + if ( trace ) + { + if ( bullettracepassed( turret.origin + vectorscale( ( 0, 0, 1 ), 60.0 ), turret.origin + vectorscale( ( 0, 0, 1 ), 180.0 ), 0, turret ) ) + targets[targets.size] = turret; + + continue; + } + + targets[targets.size] = turret; + } + } + + pixendevent(); + return targets; } create_missile_hud( rocket ) { - self.deploy_hud_armed = newclienthudelem( self ); - self.deploy_hud_armed.alignx = "center"; - self.deploy_hud_armed.aligny = "middle"; - self.deploy_hud_armed.horzalign = "user_center"; - self.deploy_hud_armed.vertalign = "user_center"; - self.deploy_hud_armed setshader( "mp_hud_armed", 110, 55 ); - self.deploy_hud_armed.hidewheninmenu = 1; - self.deploy_hud_armed.immunetodemogamehudsettings = 1; - self.deploy_hud_armed.x = -25; - self.deploy_hud_armed.y = 161; - self.deploy_hud_deployed = newclienthudelem( self ); - self.deploy_hud_deployed.alignx = "center"; - self.deploy_hud_deployed.aligny = "middle"; - self.deploy_hud_deployed.horzalign = "user_center"; - self.deploy_hud_deployed.vertalign = "user_center"; - self.deploy_hud_deployed setshader( "mp_hud_deployed", 110, 55 ); - self.deploy_hud_deployed.hidewheninmenu = 1; - self.deploy_hud_deployed.immunetodemogamehudsettings = 1; - self.deploy_hud_deployed.alpha = 0,35; - self.deploy_hud_deployed.x = 25; - self.deploy_hud_deployed.y = 161; - self.missile_reticle_top = newclienthudelem( self ); - self.missile_reticle_top.alignx = "center"; - self.missile_reticle_top.aligny = "middle"; - self.missile_reticle_top.horzalign = "user_center"; - self.missile_reticle_top.vertalign = "user_center"; - self.missile_reticle_top.font = "small"; - self.missile_reticle_top setshader( "reticle_side_round_big_top", 140, 64 ); - self.missile_reticle_top.hidewheninmenu = 0; - self.missile_reticle_top.immunetodemogamehudsettings = 1; - self.missile_reticle_top.x = 0; - self.missile_reticle_top.y = 0; - self.missile_reticle_bottom = newclienthudelem( self ); - self.missile_reticle_bottom.alignx = "center"; - self.missile_reticle_bottom.aligny = "middle"; - self.missile_reticle_bottom.horzalign = "user_center"; - self.missile_reticle_bottom.vertalign = "user_center"; - self.missile_reticle_bottom.font = "small"; - self.missile_reticle_bottom setshader( "reticle_side_round_big_bottom", 140, 64 ); - self.missile_reticle_bottom.hidewheninmenu = 0; - self.missile_reticle_bottom.immunetodemogamehudsettings = 1; - self.missile_reticle_bottom.x = 0; - self.missile_reticle_bottom.y = 0; - self.missile_reticle_right = newclienthudelem( self ); - self.missile_reticle_right.alignx = "center"; - self.missile_reticle_right.aligny = "middle"; - self.missile_reticle_right.horzalign = "user_center"; - self.missile_reticle_right.vertalign = "user_center"; - self.missile_reticle_right.font = "small"; - self.missile_reticle_right setshader( "reticle_side_round_big_right", 64, 140 ); - self.missile_reticle_right.hidewheninmenu = 0; - self.missile_reticle_right.immunetodemogamehudsettings = 1; - self.missile_reticle_right.x = 0; - self.missile_reticle_right.y = 0; - self.missile_reticle_left = newclienthudelem( self ); - self.missile_reticle_left.alignx = "center"; - self.missile_reticle_left.aligny = "middle"; - self.missile_reticle_left.horzalign = "user_center"; - self.missile_reticle_left.vertalign = "user_center"; - self.missile_reticle_left.font = "small"; - self.missile_reticle_left setshader( "reticle_side_round_big_left", 64, 140 ); - self.missile_reticle_left.hidewheninmenu = 0; - self.missile_reticle_left.immunetodemogamehudsettings = 1; - self.missile_reticle_left.x = 0; - self.missile_reticle_left.y = 0; - self.missile_target_icons = []; - _a764 = level.players; - _k764 = getFirstArrayKey( _a764 ); - while ( isDefined( _k764 ) ) - { - player = _a764[ _k764 ]; - if ( player == self ) - { - } - else if ( level.teambased && player.team == self.team ) - { - } - else - { - index = player.clientid; - self.missile_target_icons[ index ] = newclienthudelem( self ); - self.missile_target_icons[ index ].x = 0; - self.missile_target_icons[ index ].y = 0; - self.missile_target_icons[ index ].z = 0; - self.missile_target_icons[ index ].alpha = 0; - self.missile_target_icons[ index ].archived = 1; - self.missile_target_icons[ index ] setshader( "hud_remote_missile_target", 450, 450 ); - self.missile_target_icons[ index ] setwaypoint( 0 ); - self.missile_target_icons[ index ].hidewheninmenu = 1; - self.missile_target_icons[ index ].immunetodemogamehudsettings = 1; - } - _k764 = getNextArrayKey( _a764, _k764 ); - } - i = 0; - while ( i < 3 ) - { - self.missile_target_other[ i ] = newclienthudelem( self ); - self.missile_target_other[ i ].x = 0; - self.missile_target_other[ i ].y = 0; - self.missile_target_other[ i ].z = 0; - self.missile_target_other[ i ].alpha = 0; - self.missile_target_other[ i ].archived = 1; - self.missile_target_other[ i ] setshader( "hud_remote_missile_target", 450, 450 ); - self.missile_target_other[ i ] setwaypoint( 0 ); - self.missile_target_other[ i ].hidewheninmenu = 1; - self.missile_target_other[ i ].immunetodemogamehudsettings = 1; - i++; - } - rocket.iconindexother = 0; - self thread targeting_hud_think( rocket ); - self thread reticle_hud_think( rocket ); - self thread flash_cluster_armed( rocket ); + self.deploy_hud_armed = newclienthudelem( self ); + self.deploy_hud_armed.alignx = "center"; + self.deploy_hud_armed.aligny = "middle"; + self.deploy_hud_armed.horzalign = "user_center"; + self.deploy_hud_armed.vertalign = "user_center"; + self.deploy_hud_armed setshader( "mp_hud_armed", 110, 55 ); + self.deploy_hud_armed.hidewheninmenu = 1; + self.deploy_hud_armed.immunetodemogamehudsettings = 1; + self.deploy_hud_armed.x = -25; + self.deploy_hud_armed.y = 161; + self.deploy_hud_deployed = newclienthudelem( self ); + self.deploy_hud_deployed.alignx = "center"; + self.deploy_hud_deployed.aligny = "middle"; + self.deploy_hud_deployed.horzalign = "user_center"; + self.deploy_hud_deployed.vertalign = "user_center"; + self.deploy_hud_deployed setshader( "mp_hud_deployed", 110, 55 ); + self.deploy_hud_deployed.hidewheninmenu = 1; + self.deploy_hud_deployed.immunetodemogamehudsettings = 1; + self.deploy_hud_deployed.alpha = 0.35; + self.deploy_hud_deployed.x = 25; + self.deploy_hud_deployed.y = 161; + self.missile_reticle_top = newclienthudelem( self ); + self.missile_reticle_top.alignx = "center"; + self.missile_reticle_top.aligny = "middle"; + self.missile_reticle_top.horzalign = "user_center"; + self.missile_reticle_top.vertalign = "user_center"; + self.missile_reticle_top.font = "small"; + self.missile_reticle_top setshader( "reticle_side_round_big_top", 140, 64 ); + self.missile_reticle_top.hidewheninmenu = 0; + self.missile_reticle_top.immunetodemogamehudsettings = 1; + self.missile_reticle_top.x = 0; + self.missile_reticle_top.y = 0; + self.missile_reticle_bottom = newclienthudelem( self ); + self.missile_reticle_bottom.alignx = "center"; + self.missile_reticle_bottom.aligny = "middle"; + self.missile_reticle_bottom.horzalign = "user_center"; + self.missile_reticle_bottom.vertalign = "user_center"; + self.missile_reticle_bottom.font = "small"; + self.missile_reticle_bottom setshader( "reticle_side_round_big_bottom", 140, 64 ); + self.missile_reticle_bottom.hidewheninmenu = 0; + self.missile_reticle_bottom.immunetodemogamehudsettings = 1; + self.missile_reticle_bottom.x = 0; + self.missile_reticle_bottom.y = 0; + self.missile_reticle_right = newclienthudelem( self ); + self.missile_reticle_right.alignx = "center"; + self.missile_reticle_right.aligny = "middle"; + self.missile_reticle_right.horzalign = "user_center"; + self.missile_reticle_right.vertalign = "user_center"; + self.missile_reticle_right.font = "small"; + self.missile_reticle_right setshader( "reticle_side_round_big_right", 64, 140 ); + self.missile_reticle_right.hidewheninmenu = 0; + self.missile_reticle_right.immunetodemogamehudsettings = 1; + self.missile_reticle_right.x = 0; + self.missile_reticle_right.y = 0; + self.missile_reticle_left = newclienthudelem( self ); + self.missile_reticle_left.alignx = "center"; + self.missile_reticle_left.aligny = "middle"; + self.missile_reticle_left.horzalign = "user_center"; + self.missile_reticle_left.vertalign = "user_center"; + self.missile_reticle_left.font = "small"; + self.missile_reticle_left setshader( "reticle_side_round_big_left", 64, 140 ); + self.missile_reticle_left.hidewheninmenu = 0; + self.missile_reticle_left.immunetodemogamehudsettings = 1; + self.missile_reticle_left.x = 0; + self.missile_reticle_left.y = 0; + self.missile_target_icons = []; + + foreach ( player in level.players ) + { + if ( player == self ) + continue; + + if ( level.teambased && player.team == self.team ) + continue; + + index = player.clientid; + self.missile_target_icons[index] = newclienthudelem( self ); + self.missile_target_icons[index].x = 0; + self.missile_target_icons[index].y = 0; + self.missile_target_icons[index].z = 0; + self.missile_target_icons[index].alpha = 0; + self.missile_target_icons[index].archived = 1; + self.missile_target_icons[index] setshader( "hud_remote_missile_target", 450, 450 ); + self.missile_target_icons[index] setwaypoint( 0 ); + self.missile_target_icons[index].hidewheninmenu = 1; + self.missile_target_icons[index].immunetodemogamehudsettings = 1; + } + + for ( i = 0; i < 3; i++ ) + { + self.missile_target_other[i] = newclienthudelem( self ); + self.missile_target_other[i].x = 0; + self.missile_target_other[i].y = 0; + self.missile_target_other[i].z = 0; + self.missile_target_other[i].alpha = 0; + self.missile_target_other[i].archived = 1; + self.missile_target_other[i] setshader( "hud_remote_missile_target", 450, 450 ); + self.missile_target_other[i] setwaypoint( 0 ); + self.missile_target_other[i].hidewheninmenu = 1; + self.missile_target_other[i].immunetodemogamehudsettings = 1; + } + + rocket.iconindexother = 0; + self thread targeting_hud_think( rocket ); + self thread reticle_hud_think( rocket ); + self thread flash_cluster_armed( rocket ); } destroy_missile_hud() { - if ( isDefined( self.deploy_hud_armed ) ) - { - self.deploy_hud_armed destroy(); - } - if ( isDefined( self.deploy_hud_deployed ) ) - { - self.deploy_hud_deployed destroy(); - } - if ( isDefined( self.missile_reticle ) ) - { - self.missile_reticle destroy(); - } - if ( isDefined( self.missile_reticle_top ) ) - { - self.missile_reticle_top destroy(); - } - if ( isDefined( self.missile_reticle_bottom ) ) - { - self.missile_reticle_bottom destroy(); - } - if ( isDefined( self.missile_reticle_right ) ) - { - self.missile_reticle_right destroy(); - } - if ( isDefined( self.missile_reticle_left ) ) - { - self.missile_reticle_left destroy(); - } - while ( isDefined( self.missile_target_icons ) ) - { - _a838 = level.players; - _k838 = getFirstArrayKey( _a838 ); - while ( isDefined( _k838 ) ) - { - player = _a838[ _k838 ]; - if ( player == self ) - { - } - else if ( level.teambased && player.team == self.team ) - { - } - else - { - index = player.clientid; - if ( isDefined( self.missile_target_icons[ index ] ) ) - { - self.missile_target_icons[ index ] destroy(); - } - } - _k838 = getNextArrayKey( _a838, _k838 ); - } - } - while ( isDefined( self.missile_target_other ) ) - { - i = 0; - while ( i < 3 ) - { - if ( isDefined( self.missile_target_other[ i ] ) ) - { - self.missile_target_other[ i ] destroy(); - } - i++; - } - } + if ( isdefined( self.deploy_hud_armed ) ) + self.deploy_hud_armed destroy(); + + if ( isdefined( self.deploy_hud_deployed ) ) + self.deploy_hud_deployed destroy(); + + if ( isdefined( self.missile_reticle ) ) + self.missile_reticle destroy(); + + if ( isdefined( self.missile_reticle_top ) ) + self.missile_reticle_top destroy(); + + if ( isdefined( self.missile_reticle_bottom ) ) + self.missile_reticle_bottom destroy(); + + if ( isdefined( self.missile_reticle_right ) ) + self.missile_reticle_right destroy(); + + if ( isdefined( self.missile_reticle_left ) ) + self.missile_reticle_left destroy(); + + if ( isdefined( self.missile_target_icons ) ) + { + foreach ( player in level.players ) + { + if ( player == self ) + continue; + + if ( level.teambased && player.team == self.team ) + continue; + + index = player.clientid; + + if ( isdefined( self.missile_target_icons[index] ) ) + self.missile_target_icons[index] destroy(); + } + } + + if ( isdefined( self.missile_target_other ) ) + { + for ( i = 0; i < 3; i++ ) + { + if ( isdefined( self.missile_target_other[i] ) ) + self.missile_target_other[i] destroy(); + } + } } flash_cluster_armed( rocket ) { - self endon( "disconnect" ); - self endon( "remotemissile_done" ); - level endon( "game_ended" ); - rocket endon( "death" ); - self endon( "bomblets_deployed" ); - for ( ;; ) - { - self.deploy_hud_armed.alpha = 1; - wait 0,35; - self.deploy_hud_armed.alpha = 0; - wait 0,15; - } + self endon( "disconnect" ); + self endon( "remotemissile_done" ); + level endon( "game_ended" ); + rocket endon( "death" ); + self endon( "bomblets_deployed" ); + + for (;;) + { + self.deploy_hud_armed.alpha = 1; + wait 0.35; + self.deploy_hud_armed.alpha = 0; + wait 0.15; + } } flash_cluster_deployed( rocket ) { - self endon( "disconnect" ); - self endon( "remotemissile_done" ); - level endon( "game_ended" ); - rocket endon( "death" ); - self.deploy_hud_armed.alpha = 0,35; - for ( ;; ) - { - self.deploy_hud_deployed.alpha = 1; - wait 0,35; - self.deploy_hud_deployed.alpha = 0; - wait 0,15; - } + self endon( "disconnect" ); + self endon( "remotemissile_done" ); + level endon( "game_ended" ); + rocket endon( "death" ); + self.deploy_hud_armed.alpha = 0.35; + + for (;;) + { + self.deploy_hud_deployed.alpha = 1; + wait 0.35; + self.deploy_hud_deployed.alpha = 0; + wait 0.15; + } } targeting_hud_think( rocket ) { - self endon( "disconnect" ); - self endon( "remotemissile_done" ); - rocket endon( "death" ); - level endon( "game_ended" ); - targets = self getvalidtargets( rocket, 1 ); - framessincetargetscan = 0; - while ( 1 ) - { - _a910 = self.missile_target_icons; - _k910 = getFirstArrayKey( _a910 ); - while ( isDefined( _k910 ) ) - { - icon = _a910[ _k910 ]; - icon.alpha = 0; - _k910 = getNextArrayKey( _a910, _k910 ); - } - framessincetargetscan++; - if ( framessincetargetscan > 5 ) - { - targets = self getvalidtargets( rocket, 1 ); - framessincetargetscan = 0; - } - while ( targets.size > 0 ) - { - _a925 = targets; - _k925 = getFirstArrayKey( _a925 ); - while ( isDefined( _k925 ) ) - { - target = _a925[ _k925 ]; - if ( isDefined( target ) == 0 ) - { - } - else if ( isplayer( target ) ) - { - if ( isalive( target ) ) - { - index = target.clientid; + self endon( "disconnect" ); + self endon( "remotemissile_done" ); + rocket endon( "death" ); + level endon( "game_ended" ); + targets = self getvalidtargets( rocket, 1 ); + framessincetargetscan = 0; + + while ( true ) + { + foreach ( icon in self.missile_target_icons ) + icon.alpha = 0; + + framessincetargetscan++; + + if ( framessincetargetscan > 5 ) + { + targets = self getvalidtargets( rocket, 1 ); + framessincetargetscan = 0; + } + + if ( targets.size > 0 ) + { + foreach ( target in targets ) + { + if ( isdefined( target ) == 0 ) + continue; + + if ( isplayer( target ) ) + { + if ( isalive( target ) ) + { + index = target.clientid; /# - assert( isDefined( index ) ); + assert( isdefined( index ) ); #/ - self.missile_target_icons[ index ].x = target.origin[ 0 ]; - self.missile_target_icons[ index ].y = target.origin[ 1 ]; - self.missile_target_icons[ index ].z = target.origin[ 2 ] + 47; - self.missile_target_icons[ index ].alpha = 1; - } - } - else - { - if ( !isDefined( target.missileiconindex ) ) - { - target.missileiconindex = rocket.iconindexother; - rocket.iconindexother = ( rocket.iconindexother + 1 ) % 3; - } - index = target.missileiconindex; - self.missile_target_other[ index ].x = target.origin[ 0 ]; - self.missile_target_other[ index ].y = target.origin[ 1 ]; - self.missile_target_other[ index ].z = target.origin[ 2 ]; - self.missile_target_other[ index ].alpha = 1; - } - _k925 = getNextArrayKey( _a925, _k925 ); - } - } - wait 0,1; - } + self.missile_target_icons[index].x = target.origin[0]; + self.missile_target_icons[index].y = target.origin[1]; + self.missile_target_icons[index].z = target.origin[2] + 47; + self.missile_target_icons[index].alpha = 1; + } + + continue; + } + + if ( !isdefined( target.missileiconindex ) ) + { + target.missileiconindex = rocket.iconindexother; + rocket.iconindexother = ( rocket.iconindexother + 1 ) % 3; + } + + index = target.missileiconindex; + self.missile_target_other[index].x = target.origin[0]; + self.missile_target_other[index].y = target.origin[1]; + self.missile_target_other[index].z = target.origin[2]; + self.missile_target_other[index].alpha = 1; + } + } + + wait 0.1; + } } reticle_hud_think( rocket ) { - self endon( "disconnect" ); - self endon( "remotemissile_done" ); - rocket endon( "death" ); - level endon( "game_ended" ); - first = 1; - while ( 1 ) - { - reticlesize = int( min( max( 0, ( 1000 * atan( 600 / max( 0,1, rocket.origin[ 2 ] - self.origin[ 2 ] ) ) ) / 9 ), 1500 ) ); - if ( !first ) - { - self.missile_reticle_top moveovertime( 0,1 ); - self.missile_reticle_bottom moveovertime( 0,1 ); - self.missile_reticle_right moveovertime( 0,1 ); - self.missile_reticle_left moveovertime( 0,1 ); - } - else - { - first = 0; - } - self.missile_reticle_top.y = ( reticlesize * -1 ) / 2,4; - self.missile_reticle_bottom.y = reticlesize / 2,4; - self.missile_reticle_right.x = reticlesize / 2,4; - self.missile_reticle_left.x = ( reticlesize * -1 ) / 2,4; - wait 0,1; - } + self endon( "disconnect" ); + self endon( "remotemissile_done" ); + rocket endon( "death" ); + level endon( "game_ended" ); + first = 1; + + while ( true ) + { + reticlesize = int( min( max( 0, 1000 * atan( 600 / max( 0.1, rocket.origin[2] - self.origin[2] ) ) / 9 ), 1500 ) ); + + if ( !first ) + { + self.missile_reticle_top moveovertime( 0.1 ); + self.missile_reticle_bottom moveovertime( 0.1 ); + self.missile_reticle_right moveovertime( 0.1 ); + self.missile_reticle_left moveovertime( 0.1 ); + } + else + first = 0; + + self.missile_reticle_top.y = reticlesize * -1 / 2.4; + self.missile_reticle_bottom.y = reticlesize / 2.4; + self.missile_reticle_right.x = reticlesize / 2.4; + self.missile_reticle_left.x = reticlesize * -1 / 2.4; + wait 0.1; + } } missile_deploy_watch( rocket ) { - self endon( "disconnect" ); - self endon( "remotemissile_done" ); - rocket endon( "death" ); - level endon( "game_ended" ); - wait 0,25; - self thread create_missile_hud( rocket ); - waitframes = 2; - explosionradius = 0; - while ( 1 ) - { - if ( self attackbuttonpressed() ) - { - targets = self getvalidtargets( rocket, 0 ); - while ( targets.size > 0 ) - { - _a1017 = targets; - _k1017 = getFirstArrayKey( _a1017 ); - while ( isDefined( _k1017 ) ) - { - target = _a1017[ _k1017 ]; - self thread fire_bomblet( rocket, explosionradius, target, waitframes ); - waitframes++; - _k1017 = getNextArrayKey( _a1017, _k1017 ); - } - } - bomblet = magicbullet( "remote_missile_bomblet_mp", rocket.origin, rocket.origin + ( anglesToForward( rocket.angles ) * 1000 ), self ); - bomblet.team = self.team; - bomblet setteam( self.team ); - if ( ( rocket.origin[ 2 ] - self.origin[ 2 ] ) > 4000 ) - { - bomblet thread missile_sound_impact( self, 8000 ); - rocket notify( "stop_impact_sound" ); - } - bomblet thread setup_bomblet_map_icon(); - rocket setclientfield( "remote_missile_fired", 2 ); - bomblet.killcament = self; - i = targets.size; - while ( i <= 8 ) - { - self thread fire_random_bomblet( rocket, explosionradius, i % 6, waitframes ); - waitframes++; - i++; - } - playfx( level.missileremotedeployfx, rocket.origin, anglesToForward( rocket.angles ) ); - self playlocalsound( "mpl_rc_exp" ); - self playrumbleonentity( "sniper_fire" ); - earthquake( 0,2, 0,2, rocket.origin, 200 ); - rocket hide(); - rocket setmissilecoasting( 1 ); - self thread maps/mp/gametypes/_hud::fadetoblackforxsec( 0, 0,15, 0, 0, "white" ); - rocket missile_sound_deploy_bomblets(); - self thread bomblet_camera_waiter( rocket ); - self thread flash_cluster_deployed( rocket ); - self notify( "bomblets_deployed" ); - return; - continue; - } - else - { - wait 0,05; - } - } + self endon( "disconnect" ); + self endon( "remotemissile_done" ); + rocket endon( "death" ); + level endon( "game_ended" ); + wait 0.25; + self thread create_missile_hud( rocket ); + waitframes = 2; + explosionradius = 0; + + while ( true ) + { + if ( self attackbuttonpressed() ) + { + targets = self getvalidtargets( rocket, 0 ); + + if ( targets.size > 0 ) + { + foreach ( target in targets ) + { + self thread fire_bomblet( rocket, explosionradius, target, waitframes ); + waitframes++; + } + } + + bomblet = magicbullet( "remote_missile_bomblet_mp", rocket.origin, rocket.origin + anglestoforward( rocket.angles ) * 1000, self ); + bomblet.team = self.team; + bomblet setteam( self.team ); + + if ( rocket.origin[2] - self.origin[2] > 4000 ) + { + bomblet thread missile_sound_impact( self, 8000 ); + rocket notify( "stop_impact_sound" ); + } + + bomblet thread setup_bomblet_map_icon(); + rocket setclientfield( "remote_missile_fired", 2 ); + bomblet.killcament = self; + + for ( i = targets.size; i <= 8; i++ ) + { + self thread fire_random_bomblet( rocket, explosionradius, i % 6, waitframes ); + waitframes++; + } + + playfx( level.missileremotedeployfx, rocket.origin, anglestoforward( rocket.angles ) ); + self playlocalsound( "mpl_rc_exp" ); + self playrumbleonentity( "sniper_fire" ); + earthquake( 0.2, 0.2, rocket.origin, 200 ); + rocket hide(); + rocket setmissilecoasting( 1 ); + self thread maps\mp\gametypes\_hud::fadetoblackforxsec( 0, 0.15, 0, 0, "white" ); + rocket missile_sound_deploy_bomblets(); + self thread bomblet_camera_waiter( rocket ); + self thread flash_cluster_deployed( rocket ); + self notify( "bomblets_deployed" ); + return; + } + else + wait 0.05; + } } bomblet_camera_waiter( rocket ) { - self endon( "disconnect" ); - self endon( "remotemissile_done" ); - rocket endon( "death" ); - level endon( "game_ended" ); - delay = getdvarfloatdefault( "scr_rmbomblet_camera_delaytime", 1 ); - self waittill( "bomblet_exploded" ); - wait delay; - rocket notify( "death" ); - self notify( "remotemissile_done" ); + self endon( "disconnect" ); + self endon( "remotemissile_done" ); + rocket endon( "death" ); + level endon( "game_ended" ); + delay = getdvarfloatdefault( "scr_rmbomblet_camera_delaytime", 1.0 ); + + self waittill( "bomblet_exploded" ); + + wait( delay ); + rocket notify( "death" ); + self notify( "remotemissile_done" ); } fire_bomblet( rocket, explosionradius, target, waitframes ) { - origin = rocket.origin; - targetorigin = target.origin + vectorScale( ( 0, 0, 1 ), 50 ); - wait ( waitframes * 0,05 ); - if ( isDefined( rocket ) ) - { - origin = rocket.origin; - } - bomblet = magicbullet( "remote_missile_bomblet_mp", origin, targetorigin, self, target, vectorScale( ( 0, 0, 1 ), 30 ) ); - bomblet.team = self.team; - bomblet setteam( self.team ); - bomblet.killcament = self; - bomblet thread setup_bomblet_map_icon(); - bomblet thread bomblet_explostion_waiter( self ); + origin = rocket.origin; + targetorigin = target.origin + vectorscale( ( 0, 0, 1 ), 50.0 ); + wait( waitframes * 0.05 ); + + if ( isdefined( rocket ) ) + origin = rocket.origin; + + bomblet = magicbullet( "remote_missile_bomblet_mp", origin, targetorigin, self, target, vectorscale( ( 0, 0, 1 ), 30.0 ) ); + bomblet.team = self.team; + bomblet setteam( self.team ); + bomblet.killcament = self; + bomblet thread setup_bomblet_map_icon(); + bomblet thread bomblet_explostion_waiter( self ); } setup_bomblet_map_icon() { - wait 0,1; - self setclientfield( "remote_missile_bomblet_fired", 1 ); + wait 0.1; + self setclientfield( "remote_missile_bomblet_fired", 1 ); } fire_random_bomblet( rocket, explosionradius, quadrant, waitframes ) { - origin = rocket.origin; - angles = rocket.angles; - owner = rocket.owner; - aimtarget = rocket.aimtarget; - wait ( waitframes * 0,05 ); - angle = randomintrange( 10 + ( 60 * quadrant ), 50 + ( 60 * quadrant ) ); - radius = randomintrange( 200, 700 ); - x = min( radius, 550 ) * cos( angle ); - y = min( radius, 550 ) * sin( angle ); - bomblet = magicbullet( "remote_missile_bomblet_mp", origin, aimtarget + ( x, y, 0 ), self ); - bomblet.team = self.team; - bomblet setteam( self.team ); - bomblet thread setup_bomblet_map_icon(); - bomblet.killcament = self; - bomblet thread bomblet_explostion_waiter( self ); + origin = rocket.origin; + angles = rocket.angles; + owner = rocket.owner; + aimtarget = rocket.aimtarget; + wait( waitframes * 0.05 ); + angle = randomintrange( 10 + 60 * quadrant, 50 + 60 * quadrant ); + radius = randomintrange( 200, 700 ); + x = min( radius, 550 ) * cos( angle ); + y = min( radius, 550 ) * sin( angle ); + bomblet = magicbullet( "remote_missile_bomblet_mp", origin, aimtarget + ( x, y, 0 ), self ); + bomblet.team = self.team; + bomblet setteam( self.team ); + bomblet thread setup_bomblet_map_icon(); + bomblet.killcament = self; + bomblet thread bomblet_explostion_waiter( self ); } bomblet_explostion_waiter( player ) { - player endon( "disconnect" ); - player endon( "remotemissile_done" ); - player endon( "death" ); - level endon( "game_ended" ); - self waittill( "death" ); - player notify( "bomblet_exploded" ); + player endon( "disconnect" ); + player endon( "remotemissile_done" ); + player endon( "death" ); + level endon( "game_ended" ); + + self waittill( "death" ); + + player notify( "bomblet_exploded" ); } diff --git a/Multiplayer Core/patch_mp/maps/mp/killstreaks/_remotemortar.gsc b/Multiplayer Core/patch_mp/maps/mp/killstreaks/_remotemortar.gsc index a172e3d..587da6e 100644 --- a/Multiplayer Core/patch_mp/maps/mp/killstreaks/_remotemortar.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/killstreaks/_remotemortar.gsc @@ -1,815 +1,814 @@ -#include maps/mp/killstreaks/_spyplane; -#include maps/mp/_popups; -#include maps/mp/_challenges; -#include maps/mp/_scoreevents; -#include maps/mp/gametypes/_weapon_utils; -#include maps/mp/gametypes/_damagefeedback; -#include maps/mp/gametypes/_weaponobjects; -#include maps/mp/gametypes/_hostmigration; -#include maps/mp/gametypes/_spawning; -#include maps/mp/gametypes/_hud; -#include maps/mp/gametypes/_gameobjects; -#include maps/mp/_heatseekingmissile; -#include maps/mp/killstreaks/_killstreakrules; -#include maps/mp/gametypes/_spawnlogic; -#include maps/mp/killstreaks/_helicopter; -#include maps/mp/killstreaks/_airsupport; -#include maps/mp/killstreaks/_killstreaks; -#include common_scripts/utility; -#include maps/mp/gametypes/_hud_util; -#include maps/mp/_utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\_utility; +#include maps\mp\gametypes\_hud_util; +#include common_scripts\utility; +#include maps\mp\killstreaks\_killstreaks; +#include maps\mp\killstreaks\_airsupport; +#include maps\mp\killstreaks\_helicopter; +#include maps\mp\gametypes\_spawnlogic; +#include maps\mp\killstreaks\_killstreakrules; +#include maps\mp\_heatseekingmissile; +#include maps\mp\gametypes\_gameobjects; +#include maps\mp\gametypes\_hud; +#include maps\mp\gametypes\_spawning; +#include maps\mp\gametypes\_hostmigration; +#include maps\mp\gametypes\_weaponobjects; +#include maps\mp\gametypes\_damagefeedback; +#include maps\mp\gametypes\_weapon_utils; +#include maps\mp\_scoreevents; +#include maps\mp\_challenges; +#include maps\mp\_popups; +#include maps\mp\killstreaks\_spyplane; init() { - precachemodel( "veh_t6_drone_pegasus_mp" ); - precacheshader( "compass_lodestar" ); - precacheitem( "remote_mortar_missile_mp" ); - precachestring( &"remotemortar" ); - level.remote_mortar_fx[ "laserTarget" ] = loadfx( "weapon/remote_mortar/fx_rmt_mortar_laser_loop" ); - level.remote_mortar_fx[ "missileExplode" ] = loadfx( "weapon/remote_mortar/fx_rmt_mortar_explosion" ); - registerkillstreak( "remote_mortar_mp", "remote_mortar_mp", "killstreak_remote_mortar", "remote_mortar_used", ::remote_mortar_killstreak, 1 ); - registerkillstreakaltweapon( "remote_mortar_mp", "remote_mortar_missile_mp" ); - registerkillstreakstrings( "remote_mortar_mp", &"KILLSTREAK_EARNED_REMOTE_MORTAR", &"KILLSTREAK_REMOTE_MORTAR_NOT_AVAILABLE", &"KILLSTREAK_REMOTE_MORTAR_INBOUND" ); - registerkillstreakdialog( "remote_mortar_mp", "mpl_killstreak_planemortar", "kls_reaper_used", "", "kls_reaper_enemy", "", "kls_reaper_ready" ); - registerkillstreakdevdvar( "remote_mortar_mp", "scr_givemortarremote" ); - setkillstreakteamkillpenaltyscale( "remote_mortar_mp", level.teamkillreducedpenalty ); - overrideentitycameraindemo( "remote_mortar_mp", 1 ); - set_dvar_float_if_unset( "scr_remote_mortar_lifetime", 45 ); - level.remore_mortar_infrared_vision = "remote_mortar_infrared"; - level.remore_mortar_enhanced_vision = "remote_mortar_enhanced"; - minimaporigins = getentarray( "minimap_corner", "targetname" ); - if ( minimaporigins.size ) - { - uavorigin = maps/mp/gametypes/_spawnlogic::findboxcenter( minimaporigins[ 0 ].origin, minimaporigins[ 1 ].origin ); - } - else - { - uavorigin = ( 0, 0, 1 ); - } - if ( level.script == "mp_la" ) - { - uavorigin += vectorScale( ( 0, 0, 1 ), 1200 ); - } - if ( level.script == "mp_hydro" ) - { - uavorigin += vectorScale( ( 0, 0, 1 ), 2000 ); - } - if ( level.script == "mp_concert" ) - { - uavorigin += vectorScale( ( 0, 0, 1 ), 750 ); - } - if ( level.script == "mp_vertigo" ) - { - uavorigin += vectorScale( ( 0, 0, 1 ), 500 ); - } - level.remotemortarrig = spawn( "script_model", uavorigin ); - level.remotemortarrig setmodel( "tag_origin" ); - level.remotemortarrig.angles = vectorScale( ( 0, 0, 1 ), 115 ); - level.remotemortarrig hide(); - level.remotemortarrig thread rotaterig( 1 ); - level.remote_zoffset = 8000; - level.remote_radiusoffset = 9000; - remote_mortar_height = getstruct( "remote_mortar_height", "targetname" ); - if ( isDefined( remote_mortar_height ) ) - { - level.remote_radiusoffset = ( remote_mortar_height.origin[ 2 ] / level.remote_zoffset ) * level.remote_radiusoffset; - level.remote_zoffset = remote_mortar_height.origin[ 2 ]; - } + precachemodel( "veh_t6_drone_pegasus_mp" ); + precacheshader( "compass_lodestar" ); + precacheitem( "remote_mortar_missile_mp" ); + precachestring( &"remotemortar" ); + level.remote_mortar_fx["laserTarget"] = loadfx( "weapon/remote_mortar/fx_rmt_mortar_laser_loop" ); + level.remote_mortar_fx["missileExplode"] = loadfx( "weapon/remote_mortar/fx_rmt_mortar_explosion" ); + registerkillstreak( "remote_mortar_mp", "remote_mortar_mp", "killstreak_remote_mortar", "remote_mortar_used", ::remote_mortar_killstreak, 1 ); + registerkillstreakaltweapon( "remote_mortar_mp", "remote_mortar_missile_mp" ); + registerkillstreakstrings( "remote_mortar_mp", &"KILLSTREAK_EARNED_REMOTE_MORTAR", &"KILLSTREAK_REMOTE_MORTAR_NOT_AVAILABLE", &"KILLSTREAK_REMOTE_MORTAR_INBOUND" ); + registerkillstreakdialog( "remote_mortar_mp", "mpl_killstreak_planemortar", "kls_reaper_used", "", "kls_reaper_enemy", "", "kls_reaper_ready" ); + registerkillstreakdevdvar( "remote_mortar_mp", "scr_givemortarremote" ); + setkillstreakteamkillpenaltyscale( "remote_mortar_mp", level.teamkillreducedpenalty ); + overrideentitycameraindemo( "remote_mortar_mp", 1 ); + set_dvar_float_if_unset( "scr_remote_mortar_lifetime", 45.0 ); + level.remore_mortar_infrared_vision = "remote_mortar_infrared"; + level.remore_mortar_enhanced_vision = "remote_mortar_enhanced"; + minimaporigins = getentarray( "minimap_corner", "targetname" ); + + if ( minimaporigins.size ) + uavorigin = maps\mp\gametypes\_spawnlogic::findboxcenter( minimaporigins[0].origin, minimaporigins[1].origin ); + else + uavorigin = ( 0, 0, 0 ); + + if ( level.script == "mp_la" ) + uavorigin += vectorscale( ( 1, 0, 0 ), 1200.0 ); + + if ( level.script == "mp_hydro" ) + uavorigin += vectorscale( ( 0, 1, 0 ), 2000.0 ); + + if ( level.script == "mp_concert" ) + uavorigin += vectorscale( ( 0, -1, 0 ), 750.0 ); + + if ( level.script == "mp_vertigo" ) + uavorigin += vectorscale( ( -1, 0, 0 ), 500.0 ); + + level.remotemortarrig = spawn( "script_model", uavorigin ); + level.remotemortarrig setmodel( "tag_origin" ); + level.remotemortarrig.angles = vectorscale( ( 0, 1, 0 ), 115.0 ); + level.remotemortarrig hide(); + level.remotemortarrig thread rotaterig( 1 ); + level.remote_zoffset = 8000; + level.remote_radiusoffset = 9000; + remote_mortar_height = getstruct( "remote_mortar_height", "targetname" ); + + if ( isdefined( remote_mortar_height ) ) + { + level.remote_radiusoffset = remote_mortar_height.origin[2] / level.remote_zoffset * level.remote_radiusoffset; + level.remote_zoffset = remote_mortar_height.origin[2]; + } } remote_mortar_killstreak( hardpointtype ) { /# - assert( hardpointtype == "remote_mortar_mp" ); + assert( hardpointtype == "remote_mortar_mp" ); #/ - if ( self maps/mp/killstreaks/_killstreakrules::iskillstreakallowed( hardpointtype, self.team ) == 0 ) - { - return 0; - } - if ( !self isonground() || self isusingremote() ) - { - self iprintlnbold( &"KILLSTREAK_REMOTE_MORTAR_NOT_USABLE" ); - return 0; - } - self setusingremote( hardpointtype ); - self freezecontrolswrapper( 1 ); - self disableweaponcycling(); - result = self maps/mp/killstreaks/_killstreaks::initridekillstreak( "qrdrone" ); - if ( result != "success" ) - { - if ( result != "disconnect" ) - { - self notify( "remote_mortar_unlock" ); - self clearusingremote(); - self enableweaponcycling(); - } - return 0; - } - killstreak_id = self maps/mp/killstreaks/_killstreakrules::killstreakstart( hardpointtype, self.team, 0, 1 ); - if ( killstreak_id == -1 ) - { - self clearusingremote(); - self enableweaponcycling(); - self notify( "remote_mortar_unlock" ); - return 0; - } - self.killstreak_waitamount = getDvarFloat( #"F9AB897A" ) * 1000; - remote = self remote_mortar_spawn(); - remote setdrawinfrared( 1 ); - remote thread remote_killstreak_abort(); - remote thread remote_killstreak_game_end(); - remote thread remote_owner_exit(); - remote thread remote_owner_teamkillkicked(); - remote thread remote_damage_think(); - remote thread play_lockon_sounds( self ); - remote thread maps/mp/_heatseekingmissile::missiletarget_lockonmonitor( self, "remote_end" ); - remote thread maps/mp/_heatseekingmissile::missiletarget_proximitydetonateincomingmissile( "crashing" ); - remote.killstreak_id = killstreak_id; - remote thread play_remote_fx(); - remote playloopsound( "mpl_ks_reaper_exterior_loop", 1 ); - self.pilottalking = 0; - remote.copilotvoicenumber = self.bcvoicenumber; - remote.pilotvoicenumber = self.bcvoicenumber + 1; - if ( remote.pilotvoicenumber > 3 ) - { - remote.pilotvoicenumber = 0; - } - self clientnotify( "krms" ); - self player_linkto_remote( remote ); - self freezecontrolswrapper( 0 ); - self thread player_aim_think( remote ); - self thread player_fire_think( remote ); - self maps/mp/killstreaks/_killstreaks::playkillstreakstartdialog( "remote_mortar_mp", self.pers[ "team" ] ); - remote thread remote_killstreak_copilot( remote.copilotvoicenumber ); - level.globalkillstreakscalled++; - self addweaponstat( "remote_mortar_mp", "used", 1 ); - self thread visionswitch(); - level waittill( "remote_unlinked" ); - if ( isDefined( remote ) ) - { - remote stoploopsound( 4 ); - } - if ( !isDefined( self ) ) - { - return 1; - } - self clientnotify( "krme" ); - self clearclientflag( 1 ); - self clientnotify( "nofutz" ); - self clearusingremote(); - return 1; + if ( self maps\mp\killstreaks\_killstreakrules::iskillstreakallowed( hardpointtype, self.team ) == 0 ) + return false; + + if ( !self isonground() || self isusingremote() ) + { + self iprintlnbold( &"KILLSTREAK_REMOTE_MORTAR_NOT_USABLE" ); + return false; + } + + self setusingremote( hardpointtype ); + self freezecontrolswrapper( 1 ); + self disableweaponcycling(); + result = self maps\mp\killstreaks\_killstreaks::initridekillstreak( "qrdrone" ); + + if ( result != "success" ) + { + if ( result != "disconnect" ) + { + self notify( "remote_mortar_unlock" ); + self clearusingremote(); + self enableweaponcycling(); + } + + return false; + } + + killstreak_id = self maps\mp\killstreaks\_killstreakrules::killstreakstart( hardpointtype, self.team, 0, 1 ); + + if ( killstreak_id == -1 ) + { + self clearusingremote(); + self enableweaponcycling(); + self notify( "remote_mortar_unlock" ); + return false; + } + + self.killstreak_waitamount = getdvarfloat( "scr_remote_mortar_lifetime" ) * 1000; + remote = self remote_mortar_spawn(); + remote setdrawinfrared( 1 ); + remote thread remote_killstreak_abort(); + remote thread remote_killstreak_game_end(); + remote thread remote_owner_exit(); + remote thread remote_owner_teamkillkicked(); + remote thread remote_damage_think(); + remote thread play_lockon_sounds( self ); + remote thread maps\mp\_heatseekingmissile::missiletarget_lockonmonitor( self, "remote_end" ); + remote thread maps\mp\_heatseekingmissile::missiletarget_proximitydetonateincomingmissile( "crashing" ); + remote.killstreak_id = killstreak_id; + remote thread play_remote_fx(); + remote playloopsound( "mpl_ks_reaper_exterior_loop", 1 ); + self.pilottalking = 0; + remote.copilotvoicenumber = self.bcvoicenumber; + remote.pilotvoicenumber = self.bcvoicenumber + 1; + + if ( remote.pilotvoicenumber > 3 ) + remote.pilotvoicenumber = 0; + + self clientnotify( "krms" ); + self player_linkto_remote( remote ); + self freezecontrolswrapper( 0 ); + self thread player_aim_think( remote ); + self thread player_fire_think( remote ); + self maps\mp\killstreaks\_killstreaks::playkillstreakstartdialog( "remote_mortar_mp", self.pers["team"] ); + remote thread remote_killstreak_copilot( remote.copilotvoicenumber ); + level.globalkillstreakscalled++; + self addweaponstat( "remote_mortar_mp", "used", 1 ); + self thread visionswitch(); + + level waittill( "remote_unlinked" ); + + if ( isdefined( remote ) ) + remote stoploopsound( 4 ); + + if ( !isdefined( self ) ) + return true; + + self clientnotify( "krme" ); + self clearclientflag( 1 ); + self clientnotify( "nofutz" ); + self clearusingremote(); + return true; } remote_killstreak_copilot( voice ) { - level endon( "remote_end" ); - wait 2,5; - while ( 1 ) - { - self thread playpilotdialog( "reaper_used", 0, voice ); - wait randomfloatrange( 4,5, 15 ); - } + level endon( "remote_end" ); + wait 2.5; + + while ( true ) + { + self thread playpilotdialog( "reaper_used", 0, voice ); + wait( randomfloatrange( 4.5, 15 ) ); + } } remote_killstreak_abort() { - level endon( "remote_end" ); + level endon( "remote_end" ); /# - assert( isDefined( self.owner ) ); + assert( isdefined( self.owner ) ); #/ /# - assert( isplayer( self.owner ) ); + assert( isplayer( self.owner ) ); #/ - self.owner waittill_any( "disconnect", "joined_team", "joined_spectators" ); - self thread remote_killstreak_end( 0, 1 ); + self.owner waittill_any( "disconnect", "joined_team", "joined_spectators" ); + self thread remote_killstreak_end( 0, 1 ); } remote_owner_teamkillkicked( hardpointtype ) { - level endon( "remote_end" ); - self.owner waittill( "teamKillKicked" ); - self thread remote_killstreak_end(); + level endon( "remote_end" ); + + self.owner waittill( "teamKillKicked" ); + + self thread remote_killstreak_end(); } remote_owner_exit() { - level endon( "remote_end" ); - wait 1; - while ( 1 ) - { - timeused = 0; - while ( self.owner usebuttonpressed() ) - { - timeused += 0,05; - if ( timeused > 0,25 ) - { - self thread remote_killstreak_end(); - return; - } - wait 0,05; - } - wait 0,05; - } + level endon( "remote_end" ); + wait 1; + + while ( true ) + { + timeused = 0; + + while ( self.owner usebuttonpressed() ) + { + timeused += 0.05; + + if ( timeused > 0.25 ) + { + self thread remote_killstreak_end(); + return; + } + + wait 0.05; + } + + wait 0.05; + } } remote_killstreak_game_end() { - level endon( "remote_end" ); + level endon( "remote_end" ); /# - assert( isDefined( self.owner ) ); + assert( isdefined( self.owner ) ); #/ /# - assert( isplayer( self.owner ) ); + assert( isplayer( self.owner ) ); #/ - level waittill( "game_ended" ); - self thread remote_killstreak_end(); + level waittill( "game_ended" ); + + self thread remote_killstreak_end(); } remote_mortar_spawn() { - self setclientflag( 1 ); - self clientnotify( "reapfutz" ); - remote = spawnplane( self, "script_model", level.remotemortarrig gettagorigin( "tag_origin" ) ); + self setclientflag( 1 ); + self clientnotify( "reapfutz" ); + remote = spawnplane( self, "script_model", level.remotemortarrig gettagorigin( "tag_origin" ) ); /# - assert( isDefined( remote ) ); + assert( isdefined( remote ) ); #/ - remote setmodel( "veh_t6_drone_pegasus_mp" ); - remote.targetname = "remote_mortar"; - remote setowner( self ); - remote setteam( self.team ); - remote.team = self.team; - remote.owner = self; - remote.numflares = 2; - remote.flareoffset = vectorScale( ( 0, 0, 1 ), 256 ); - remote.attackers = []; - remote.attackerdata = []; - remote.attackerdamage = []; - remote.flareattackerdamage = []; - remote.pilotvoicenumber = self.bcvoicenumber + 1; - if ( remote.pilotvoicenumber > 3 ) - { - remote.pilotvoicenumber = 0; - } - angle = randomint( 360 ); - xoffset = cos( angle ) * level.remote_radiusoffset; - yoffset = sin( angle ) * level.remote_radiusoffset; - anglevector = vectornormalize( ( xoffset, yoffset, level.remote_zoffset ) ); - anglevector *= 6100; - remote linkto( level.remotemortarrig, "tag_origin", anglevector, ( 0, angle - 90, 0 ) ); - remoteobjidfriendly = maps/mp/gametypes/_gameobjects::getnextobjid(); - objective_add( remoteobjidfriendly, "invisible", remote.origin, &"remotemortar", self ); - objective_state( remoteobjidfriendly, "active" ); - objective_onentity( remoteobjidfriendly, remote ); - objective_team( remoteobjidfriendly, self.team ); - self.remoteobjidfriendly = remoteobjidfriendly; - remote.fx = spawn( "script_model", ( 0, 0, 1 ) ); - remote.fx setmodel( "tag_origin" ); - remote.fx setinvisibletoplayer( remote.owner, 1 ); - remote remote_mortar_visibility(); - target_setturretaquire( remote, 1 ); - return remote; + remote setmodel( "veh_t6_drone_pegasus_mp" ); + remote.targetname = "remote_mortar"; + remote setowner( self ); + remote setteam( self.team ); + remote.team = self.team; + remote.owner = self; + remote.numflares = 2; + remote.flareoffset = vectorscale( ( 0, 0, -1 ), 256.0 ); + remote.attackers = []; + remote.attackerdata = []; + remote.attackerdamage = []; + remote.flareattackerdamage = []; + remote.pilotvoicenumber = self.bcvoicenumber + 1; + + if ( remote.pilotvoicenumber > 3 ) + remote.pilotvoicenumber = 0; + + angle = randomint( 360 ); + xoffset = cos( angle ) * level.remote_radiusoffset; + yoffset = sin( angle ) * level.remote_radiusoffset; + anglevector = vectornormalize( ( xoffset, yoffset, level.remote_zoffset ) ); + anglevector *= 6100; + remote linkto( level.remotemortarrig, "tag_origin", anglevector, ( 0, angle - 90, 0 ) ); + remoteobjidfriendly = maps\mp\gametypes\_gameobjects::getnextobjid(); + objective_add( remoteobjidfriendly, "invisible", remote.origin, &"remotemortar", self ); + objective_state( remoteobjidfriendly, "active" ); + objective_onentity( remoteobjidfriendly, remote ); + objective_team( remoteobjidfriendly, self.team ); + self.remoteobjidfriendly = remoteobjidfriendly; + remote.fx = spawn( "script_model", ( 0, 0, 0 ) ); + remote.fx setmodel( "tag_origin" ); + remote.fx setinvisibletoplayer( remote.owner, 1 ); + remote remote_mortar_visibility(); + target_setturretaquire( remote, 1 ); + return remote; } rotaterig( clockwise ) { - turn = 360; - if ( clockwise ) - { - turn = -360; - } - for ( ;; ) - { - if ( !clockwise ) - { - self rotateyaw( turn, 30 ); - wait 30; - continue; - } - else - { - self rotateyaw( turn, 45 ); - wait 45; - } - } + turn = 360; + + if ( clockwise ) + turn = -360; + + for (;;) + { + if ( !clockwise ) + { + self rotateyaw( turn, 30 ); + wait 30; + continue; + } + + self rotateyaw( turn, 45 ); + wait 45; + } } remote_mortar_visibility() { - players = get_players(); - _a315 = players; - _k315 = getFirstArrayKey( _a315 ); - while ( isDefined( _k315 ) ) - { - player = _a315[ _k315 ]; - if ( player == self.owner ) - { - self setinvisibletoplayer( player ); - } - else - { - self setvisibletoplayer( player ); - } - _k315 = getNextArrayKey( _a315, _k315 ); - } + players = get_players(); + + foreach ( player in players ) + { + if ( player == self.owner ) + { + self setinvisibletoplayer( player ); + continue; + } + + self setvisibletoplayer( player ); + } } play_lockon_sounds( player ) { - player endon( "disconnect" ); - self endon( "death" ); - self endon( "remote_end" ); - self.locksounds = spawn( "script_model", self.origin ); - wait 0,1; - self.locksounds linkto( self, "tag_player" ); - while ( 1 ) - { - self waittill( "locking on" ); - while ( 1 ) - { - if ( enemy_locking() ) - { - self playsoundtoplayer( "uin_alert_lockon", player ); - wait 0,125; - } - if ( enemy_locked() ) - { - self playsoundtoplayer( "uin_alert_lockon", player ); - wait 0,125; - } - if ( !enemy_locking() && !enemy_locked() ) - { - break; - } - else - { - } - } - } + player endon( "disconnect" ); + self endon( "death" ); + self endon( "remote_end" ); + self.locksounds = spawn( "script_model", self.origin ); + wait 0.1; + self.locksounds linkto( self, "tag_player" ); + + while ( true ) + { + self waittill( "locking on" ); + + while ( true ) + { + if ( enemy_locking() ) + { + self playsoundtoplayer( "uin_alert_lockon", player ); + wait 0.125; + } + + if ( enemy_locked() ) + { + self playsoundtoplayer( "uin_alert_lockon", player ); + wait 0.125; + } + + if ( !enemy_locking() && !enemy_locked() ) + break; + } + } } enemy_locking() { - if ( isDefined( self.locking_on ) && self.locking_on ) - { - return 1; - } - return 0; + if ( isdefined( self.locking_on ) && self.locking_on ) + return true; + + return false; } enemy_locked() { - if ( isDefined( self.locked_on ) && self.locked_on ) - { - return 1; - } - return 0; + if ( isdefined( self.locked_on ) && self.locked_on ) + return true; + + return false; } create_remote_mortar_hud( remote ) { - self.missile_hud = newclienthudelem( self ); - self.missile_hud.alignx = "left"; - self.missile_hud.aligny = "bottom"; - self.missile_hud.horzalign = "user_left"; - self.missile_hud.vertalign = "user_bottom"; - self.missile_hud.font = "small"; - self.missile_hud settext( "[{+attack}]" + "Fire Missile" ); - self.missile_hud.hidewheninmenu = 1; - self.missile_hud.hidewhenindemo = 1; - self.missile_hud.x = 5; - self.missile_hud.y = -40; - self.missile_hud.fontscale = 1,25; - self.zoom_hud = newclienthudelem( self ); - self.zoom_hud.alignx = "left"; - self.zoom_hud.aligny = "bottom"; - self.zoom_hud.horzalign = "user_left"; - self.zoom_hud.vertalign = "user_bottom"; - self.zoom_hud.font = "small"; - self.zoom_hud settext( &"KILLSTREAK_INCREASE_ZOOM" ); - self.zoom_hud.hidewheninmenu = 1; - self.zoom_hud.hidewhenindemo = 1; - self.zoom_hud.x = 5; - self.zoom_hud.y = -25; - self.zoom_hud.fontscale = 1,25; - self.hud_prompt_exit = newclienthudelem( self ); - self.hud_prompt_exit.alignx = "left"; - self.hud_prompt_exit.aligny = "bottom"; - self.hud_prompt_exit.horzalign = "user_left"; - self.hud_prompt_exit.vertalign = "user_bottom"; - self.hud_prompt_exit.font = "small"; - self.hud_prompt_exit.fontscale = 1,25; - self.hud_prompt_exit.hidewheninmenu = 1; - self.hud_prompt_exit.hidewhenindemo = 1; - self.hud_prompt_exit.archived = 0; - self.hud_prompt_exit.x = 5; - self.hud_prompt_exit.y = -10; - self.hud_prompt_exit settext( level.remoteexithint ); - self thread fade_out_hint_hud( remote ); + self.missile_hud = newclienthudelem( self ); + self.missile_hud.alignx = "left"; + self.missile_hud.aligny = "bottom"; + self.missile_hud.horzalign = "user_left"; + self.missile_hud.vertalign = "user_bottom"; + self.missile_hud.font = "small"; + self.missile_hud settext( "[{+attack}]" + "Fire Missile" ); + self.missile_hud.hidewheninmenu = 1; + self.missile_hud.hidewhenindemo = 1; + self.missile_hud.x = 5; + self.missile_hud.y = -40; + self.missile_hud.fontscale = 1.25; + self.zoom_hud = newclienthudelem( self ); + self.zoom_hud.alignx = "left"; + self.zoom_hud.aligny = "bottom"; + self.zoom_hud.horzalign = "user_left"; + self.zoom_hud.vertalign = "user_bottom"; + self.zoom_hud.font = "small"; + self.zoom_hud settext( &"KILLSTREAK_INCREASE_ZOOM" ); + self.zoom_hud.hidewheninmenu = 1; + self.zoom_hud.hidewhenindemo = 1; + self.zoom_hud.x = 5; + self.zoom_hud.y = -25; + self.zoom_hud.fontscale = 1.25; + self.hud_prompt_exit = newclienthudelem( self ); + self.hud_prompt_exit.alignx = "left"; + self.hud_prompt_exit.aligny = "bottom"; + self.hud_prompt_exit.horzalign = "user_left"; + self.hud_prompt_exit.vertalign = "user_bottom"; + self.hud_prompt_exit.font = "small"; + self.hud_prompt_exit.fontscale = 1.25; + self.hud_prompt_exit.hidewheninmenu = 1; + self.hud_prompt_exit.hidewhenindemo = 1; + self.hud_prompt_exit.archived = 0; + self.hud_prompt_exit.x = 5; + self.hud_prompt_exit.y = -10; + self.hud_prompt_exit settext( level.remoteexithint ); + self thread fade_out_hint_hud( remote ); } fade_out_hint_hud( remote ) { - self endon( "disconnect" ); - remote endon( "death" ); - wait 8; - time = 0; - while ( time < 2 ) - { - if ( !isDefined( self.missile_hud ) ) - { - return; - } - self.missile_hud.alpha -= 0,025; - self.zoom_hud.alpha -= 0,025; - time += 0,05; - wait 0,05; - } - self.missile_hud.alpha = 0; - self.zoom_hud.alpha = 0; + self endon( "disconnect" ); + remote endon( "death" ); + wait 8; + time = 0; + + while ( time < 2 ) + { + if ( !isdefined( self.missile_hud ) ) + return; + + self.missile_hud.alpha -= 0.025; + self.zoom_hud.alpha -= 0.025; + time += 0.05; + wait 0.05; + } + + self.missile_hud.alpha = 0; + self.zoom_hud.alpha = 0; } remove_hud() { - if ( isDefined( self.missile_hud ) ) - { - self.missile_hud destroy(); - } - if ( isDefined( self.zoom_hud ) ) - { - self.zoom_hud destroy(); - } - if ( isDefined( self.hud_prompt_exit ) ) - { - self.hud_prompt_exit destroy(); - } + if ( isdefined( self.missile_hud ) ) + self.missile_hud destroy(); + + if ( isdefined( self.zoom_hud ) ) + self.zoom_hud destroy(); + + if ( isdefined( self.hud_prompt_exit ) ) + self.hud_prompt_exit destroy(); } remote_killstreak_end( explode, disconnected ) { - level notify( "remote_end" ); - if ( !isDefined( explode ) ) - { - explode = 0; - } - if ( !isDefined( disconnected ) ) - { - disconnected = 0; - } - if ( isDefined( self.owner ) ) - { - if ( disconnected == 0 ) - { - if ( explode ) - { - self.owner sendkillstreakdamageevent( 600 ); - self.owner thread maps/mp/gametypes/_hud::fadetoblackforxsec( 0,5, 0,5, 0,1, 0,25 ); - wait 1; - } - else - { - self.owner sendkillstreakdamageevent( 600 ); - self.owner thread maps/mp/gametypes/_hud::fadetoblackforxsec( 0, 0,25, 0,1, 0,25 ); - wait 0,25; - } - } - self.owner unlink(); - self.owner.killstreak_waitamount = undefined; - self.owner enableweaponcycling(); - self.owner remove_hud(); - if ( isDefined( level.gameended ) && level.gameended ) - { - self.owner freezecontrolswrapper( 1 ); - } - } - self maps/mp/gametypes/_spawning::remove_tvmissile_influencers(); - objective_delete( self.owner.remoteobjidfriendly ); - releaseobjid( self.owner.remoteobjidfriendly ); - target_setturretaquire( self, 0 ); - level notify( "remote_unlinked" ); - maps/mp/killstreaks/_killstreakrules::killstreakstop( "remote_mortar_mp", self.team, self.killstreak_id ); - if ( isDefined( self.owner ) ) - { - self.owner setinfraredvision( 0 ); - self.owner useservervisionset( 0 ); - } - if ( isDefined( self.fx ) ) - { - self.fx delete(); - } - if ( explode ) - { - self remote_explode(); - } - else - { - self remote_leave(); - } + level notify( "remote_end" ); + + if ( !isdefined( explode ) ) + explode = 0; + + if ( !isdefined( disconnected ) ) + disconnected = 0; + + if ( isdefined( self.owner ) ) + { + if ( disconnected == 0 ) + { + if ( explode ) + { + self.owner sendkillstreakdamageevent( 600 ); + self.owner thread maps\mp\gametypes\_hud::fadetoblackforxsec( 0.5, 0.5, 0.1, 0.25 ); + wait 1; + } + else + { + self.owner sendkillstreakdamageevent( 600 ); + self.owner thread maps\mp\gametypes\_hud::fadetoblackforxsec( 0, 0.25, 0.1, 0.25 ); + wait 0.25; + } + } + + self.owner unlink(); + self.owner.killstreak_waitamount = undefined; + self.owner enableweaponcycling(); + self.owner remove_hud(); + + if ( isdefined( level.gameended ) && level.gameended ) + self.owner freezecontrolswrapper( 1 ); + } + + self maps\mp\gametypes\_spawning::remove_tvmissile_influencers(); + objective_delete( self.owner.remoteobjidfriendly ); + releaseobjid( self.owner.remoteobjidfriendly ); + target_setturretaquire( self, 0 ); + level notify( "remote_unlinked" ); + maps\mp\killstreaks\_killstreakrules::killstreakstop( "remote_mortar_mp", self.team, self.killstreak_id ); + + if ( isdefined( self.owner ) ) + { + self.owner setinfraredvision( 0 ); + self.owner useservervisionset( 0 ); + } + + if ( isdefined( self.fx ) ) + self.fx delete(); + + if ( explode ) + self remote_explode(); + else + self remote_leave(); } player_linkto_remote( remote ) { - leftarc = 40; - rightarc = 40; - uparc = 25; - downarc = 65; - if ( isDefined( level.remotemotarviewleft ) ) - { - leftarc = level.remotemotarviewleft; - } - if ( isDefined( level.remotemotarviewright ) ) - { - rightarc = level.remotemotarviewright; - } - if ( isDefined( level.remotemotarviewup ) ) - { - uparc = level.remotemotarviewup; - } - if ( isDefined( level.remotemotarviewdown ) ) - { - downarc = level.remotemotarviewdown; - } + leftarc = 40; + rightarc = 40; + uparc = 25; + downarc = 65; + + if ( isdefined( level.remotemotarviewleft ) ) + leftarc = level.remotemotarviewleft; + + if ( isdefined( level.remotemotarviewright ) ) + rightarc = level.remotemotarviewright; + + if ( isdefined( level.remotemotarviewup ) ) + uparc = level.remotemotarviewup; + + if ( isdefined( level.remotemotarviewdown ) ) + downarc = level.remotemotarviewdown; /# - leftarc = getdvarintdefault( "scr_remotemortar_right", leftarc ); - rightarc = getdvarintdefault( "scr_remotemortar_left", rightarc ); - uparc = getdvarintdefault( "scr_remotemortar_up", uparc ); - downarc = getdvarintdefault( "scr_remotemortar_down", downarc ); + leftarc = getdvarintdefault( "scr_remotemortar_right", leftarc ); + rightarc = getdvarintdefault( "scr_remotemortar_left", rightarc ); + uparc = getdvarintdefault( "scr_remotemortar_up", uparc ); + downarc = getdvarintdefault( "scr_remotemortar_down", downarc ); #/ - self playerlinkweaponviewtodelta( remote, "tag_player", 1, leftarc, rightarc, uparc, downarc ); - self player_center_view(); + self playerlinkweaponviewtodelta( remote, "tag_player", 1.0, leftarc, rightarc, uparc, downarc ); + self player_center_view(); } player_center_view( org ) { - wait 0,05; - lookvec = vectorToAngle( level.uavrig.origin - self geteye() ); - self setplayerangles( lookvec ); + wait 0.05; + lookvec = vectortoangles( level.uavrig.origin - self geteye() ); + self setplayerangles( lookvec ); } player_aim_think( remote ) { - level endon( "remote_end" ); - wait 0,25; - playfxontag( level.remote_mortar_fx[ "laserTarget" ], remote.fx, "tag_origin" ); - remote.fx playloopsound( "mpl_ks_reaper_laser" ); - while ( 1 ) - { - origin = self geteye(); - forward = anglesToForward( self getplayerangles() ); - endpoint = origin + ( forward * 15000 ); - trace = bullettrace( origin, endpoint, 0, remote ); - remote.fx.origin = trace[ "position" ]; - remote.fx.angles = vectorToAngle( trace[ "normal" ] ); - if ( isDefined( self.pegasus_influencer ) ) - { - removeinfluencer( self.pegasus_influencer ); - self.pegasus_influencer = undefined; - } - if ( isDefined( self.active_pegasus ) ) - { - self.pegasus_influencer = maps/mp/gametypes/_spawning::create_pegasus_influencer( trace[ "position" ], self.team ); - } - wait 0,05; - } + level endon( "remote_end" ); + wait 0.25; + playfxontag( level.remote_mortar_fx["laserTarget"], remote.fx, "tag_origin" ); + remote.fx playloopsound( "mpl_ks_reaper_laser" ); + + while ( true ) + { + origin = self geteye(); + forward = anglestoforward( self getplayerangles() ); + endpoint = origin + forward * 15000; + trace = bullettrace( origin, endpoint, 0, remote ); + remote.fx.origin = trace["position"]; + remote.fx.angles = vectortoangles( trace["normal"] ); + + if ( isdefined( self.pegasus_influencer ) ) + { + removeinfluencer( self.pegasus_influencer ); + self.pegasus_influencer = undefined; + } + + if ( isdefined( self.active_pegasus ) ) + self.pegasus_influencer = maps\mp\gametypes\_spawning::create_pegasus_influencer( trace["position"], self.team ); + + wait 0.05; + } } player_fire_think( remote ) { - level endon( "remote_end" ); - end_time = getTime() + self.killstreak_waitamount; - shot = 0; - while ( getTime() < end_time ) - { - self.active_pegasus = undefined; - while ( !self attackbuttonpressed() ) - { - wait 0,05; - } - self playlocalsound( "mpl_ks_reaper_fire" ); - self playrumbleonentity( "sniper_fire" ); - if ( ( shot % 3 ) == 1 ) - { - if ( isDefined( remote.owner ) && isDefined( remote.owner.pilottalking ) && remote.owner.pilottalking ) - { - shot = 0; - } - remote thread playpilotdialog( "reaper_fire", 0,25, undefined, 0 ); - } - shot = ( shot + 1 ) % 3; - origin = self geteye(); - earthquake( 0,3, 0,5, origin, 256 ); - angles = self getplayerangles(); - forward = anglesToForward( angles ); - right = anglesToRight( angles ); - up = anglesToUp( angles ); - offset = ( ( origin + ( forward * 100 ) ) + ( right * -40 ) ) + ( up * -100 ); - missile = magicbullet( "remote_mortar_missile_mp", offset, ( origin + ( forward * 1000 ) ) + ( up * -100 ), self, remote.fx ); - self.active_pegasus = missile; - missile thread remote_missile_life( remote ); - missile waittill( "death" ); - self playlocalsound( "mpl_ks_reaper_explosion" ); - } - if ( isDefined( self.pegasus_influencer ) ) - { - removeinfluencer( self.pegasus_influencer ); - self.pegasus_influencer = undefined; - } - remote thread remote_killstreak_end(); + level endon( "remote_end" ); + end_time = gettime() + self.killstreak_waitamount; + shot = 0; + + while ( gettime() < end_time ) + { + self.active_pegasus = undefined; + + if ( !self attackbuttonpressed() ) + { + wait 0.05; + continue; + } + + self playlocalsound( "mpl_ks_reaper_fire" ); + self playrumbleonentity( "sniper_fire" ); + + if ( shot % 3 == 1 ) + { + if ( isdefined( remote.owner ) && isdefined( remote.owner.pilottalking ) && remote.owner.pilottalking ) + shot = 0; + + remote thread playpilotdialog( "reaper_fire", 0.25, undefined, 0 ); + } + + shot = ( shot + 1 ) % 3; + origin = self geteye(); + earthquake( 0.3, 0.5, origin, 256 ); + angles = self getplayerangles(); + forward = anglestoforward( angles ); + right = anglestoright( angles ); + up = anglestoup( angles ); + offset = origin + forward * 100 + right * -40 + up * -100; + missile = magicbullet( "remote_mortar_missile_mp", offset, origin + forward * 1000 + up * -100, self, remote.fx ); + self.active_pegasus = missile; + missile thread remote_missile_life( remote ); + + missile waittill( "death" ); + + self playlocalsound( "mpl_ks_reaper_explosion" ); + } + + if ( isdefined( self.pegasus_influencer ) ) + { + removeinfluencer( self.pegasus_influencer ); + self.pegasus_influencer = undefined; + } + + remote thread remote_killstreak_end(); } remote_missile_life( remote ) { - self endon( "death" ); - maps/mp/gametypes/_hostmigration::waitlongdurationwithhostmigrationpause( 6 ); - playfx( level.remote_mortar_fx[ "missileExplode" ], self.origin ); - self delete(); + self endon( "death" ); + maps\mp\gametypes\_hostmigration::waitlongdurationwithhostmigrationpause( 6 ); + playfx( level.remote_mortar_fx["missileExplode"], self.origin ); + self delete(); } remote_damage_think() { - level endon( "remote_end" ); - self.health = 999999; - maxhealth = level.heli_amored_maxhealth; - damagetaken = 0; - self.lowhealth = 0; - self setcandamage( 1 ); - target_set( self, vectorScale( ( 0, 0, 1 ), 30 ) ); - while ( 1 ) - { - self waittill( "damage", damage, attacker, direction_vec, point, meansofdeath, tagname, modelname, partname, weapon ); - self.health = 999999; - heli_friendlyfire = maps/mp/gametypes/_weaponobjects::friendlyfirecheck( self.owner, attacker ); - while ( !heli_friendlyfire ) - { - continue; - } - if ( isplayer( attacker ) ) - { - attacker maps/mp/gametypes/_damagefeedback::updatedamagefeedback( meansofdeath ); - if ( attacker hasperk( "specialty_armorpiercing" ) ) - { - if ( meansofdeath == "MOD_RIFLE_BULLET" || meansofdeath == "MOD_PISTOL_BULLET" ) - { - damage += int( damage * level.cac_armorpiercing_data ); - } - } - } - if ( meansofdeath == "MOD_RIFLE_BULLET" || meansofdeath == "MOD_PISTOL_BULLET" ) - { - damage *= level.heli_armor_bulletdamage; - } - if ( isDefined( weapon ) ) - { - if ( maps/mp/gametypes/_weapon_utils::islauncherweapon( weapon ) || weapon == "remote_missile_missile_mp" ) - { - damage = maxhealth + 1; - } - } - while ( damage <= 0 ) - { - continue; - } - self.owner playlocalsound( "reaper_damaged" ); - self.owner sendkillstreakdamageevent( int( damage ) ); - damagetaken += damage; - if ( damagetaken >= maxhealth ) - { - if ( self.owner isenemyplayer( attacker ) ) - { - maps/mp/_scoreevents::processscoreevent( "destroyed_remote_mortar", attacker, self.owner, weapon ); - attacker maps/mp/_challenges::addflyswatterstat( weapon, self ); - attacker addweaponstat( weapon, "destroyed_controlled_killstreak", 1 ); - attacker destroyedplayercontrolledaircraft(); - break; - } - level thread maps/mp/_popups::displayteammessagetoall( &"KILLSTREAK_DESTROYED_REMOTE_MORTAR", attacker ); - self thread remote_killstreak_end( 1 ); - return; - continue; - } - else - { - if ( !self.lowhealth && damagetaken >= ( maxhealth / 2 ) ) - { - playfxontag( level.fx_u2_damage_trail, self, "tag_origin" ); - self.lowhealth = 1; - } - } - } + level endon( "remote_end" ); + self.health = 999999; + maxhealth = level.heli_amored_maxhealth; + damagetaken = 0; + self.lowhealth = 0; + self setcandamage( 1 ); + target_set( self, vectorscale( ( 0, 0, 1 ), 30.0 ) ); + + while ( true ) + { + self waittill( "damage", damage, attacker, direction_vec, point, meansofdeath, tagname, modelname, partname, weapon ); + + self.health = 999999; + heli_friendlyfire = maps\mp\gametypes\_weaponobjects::friendlyfirecheck( self.owner, attacker ); + + if ( !heli_friendlyfire ) + continue; + + if ( isplayer( attacker ) ) + { + attacker maps\mp\gametypes\_damagefeedback::updatedamagefeedback( meansofdeath ); + + if ( attacker hasperk( "specialty_armorpiercing" ) ) + { + if ( meansofdeath == "MOD_RIFLE_BULLET" || meansofdeath == "MOD_PISTOL_BULLET" ) + damage += int( damage * level.cac_armorpiercing_data ); + } + } + + if ( meansofdeath == "MOD_RIFLE_BULLET" || meansofdeath == "MOD_PISTOL_BULLET" ) + damage *= level.heli_armor_bulletdamage; + + if ( isdefined( weapon ) ) + { + if ( maps\mp\gametypes\_weapon_utils::islauncherweapon( weapon ) || weapon == "remote_missile_missile_mp" ) + damage = maxhealth + 1; + } + + if ( damage <= 0 ) + continue; + + self.owner playlocalsound( "reaper_damaged" ); + self.owner sendkillstreakdamageevent( int( damage ) ); + damagetaken += damage; + + if ( damagetaken >= maxhealth ) + { + if ( self.owner isenemyplayer( attacker ) ) + { + maps\mp\_scoreevents::processscoreevent( "destroyed_remote_mortar", attacker, self.owner, weapon ); + attacker maps\mp\_challenges::addflyswatterstat( weapon, self ); + attacker addweaponstat( weapon, "destroyed_controlled_killstreak", 1 ); + attacker destroyedplayercontrolledaircraft(); + } + else + { + + } + + level thread maps\mp\_popups::displayteammessagetoall( &"KILLSTREAK_DESTROYED_REMOTE_MORTAR", attacker ); + self thread remote_killstreak_end( 1 ); + return; + } + else if ( !self.lowhealth && damagetaken >= maxhealth / 2 ) + { + playfxontag( level.fx_u2_damage_trail, self, "tag_origin" ); + self.lowhealth = 1; + } + } } remote_leave() { - level endon( "game_ended" ); - self endon( "death" ); - self unlink(); - tries = 10; - yaw = 0; - while ( tries > 0 ) - { - exitvector = anglesToForward( self.angles + ( 0, yaw, 0 ) ) * 20000; - exitpoint = ( self.origin[ 0 ] + exitvector[ 0 ], self.origin[ 1 ] + exitvector[ 1 ], self.origin[ 2 ] - 2500 ); - exitpoint = self.origin + exitvector; - nfz = crossesnoflyzone( self.origin, exitpoint ); - if ( isDefined( nfz ) ) - { - if ( ( tries % 2 ) == 1 && tries != 1 ) - { - yaw *= -1; - tries--; - continue; - } - else - { - if ( tries != 1 ) - { - yaw += 10; - yaw *= -1; - } - } - tries--; + level endon( "game_ended" ); + self endon( "death" ); + self unlink(); + tries = 10; + yaw = 0; - continue; - } - else - { - tries = 0; - } - } - self thread maps/mp/killstreaks/_spyplane::flattenyaw( self.angles[ 1 ] + yaw ); - self moveto( exitpoint, 8, 4 ); - if ( self.lowhealth ) - { - playfxontag( level.chopper_fx[ "damage" ][ "heavy_smoke" ], self, "tag_origin" ); - } - self thread play_afterburner_fx(); - maps/mp/gametypes/_hostmigration::waitlongdurationwithhostmigrationpause( 8 ); - self delete(); + while ( tries > 0 ) + { + exitvector = anglestoforward( self.angles + ( 0, yaw, 0 ) ) * 20000; + exitpoint = ( self.origin[0] + exitvector[0], self.origin[1] + exitvector[1], self.origin[2] - 2500 ); + exitpoint = self.origin + exitvector; + nfz = crossesnoflyzone( self.origin, exitpoint ); + + if ( isdefined( nfz ) ) + { + if ( tries % 2 == 1 && tries != 1 ) + yaw *= -1; + else if ( tries != 1 ) + { + yaw += 10; + yaw *= -1; + } + + tries--; + } + else + tries = 0; + } + + self thread maps\mp\killstreaks\_spyplane::flattenyaw( self.angles[1] + yaw ); + self moveto( exitpoint, 8, 4 ); + + if ( self.lowhealth ) + playfxontag( level.chopper_fx["damage"]["heavy_smoke"], self, "tag_origin" ); + + self thread play_afterburner_fx(); + maps\mp\gametypes\_hostmigration::waitlongdurationwithhostmigrationpause( 8 ); + self delete(); } play_remote_fx() { - self.exhaustfx = spawn( "script_model", self.origin ); - self.exhaustfx setmodel( "tag_origin" ); - self.exhaustfx linkto( self, "tag_turret", vectorScale( ( 0, 0, 1 ), 25 ) ); - wait 0,1; - playfxontag( level.fx_cuav_burner, self.exhaustfx, "tag_origin" ); + self.exhaustfx = spawn( "script_model", self.origin ); + self.exhaustfx setmodel( "tag_origin" ); + self.exhaustfx linkto( self, "tag_turret", vectorscale( ( 0, 0, 1 ), 25.0 ) ); + wait 0.1; + playfxontag( level.fx_cuav_burner, self.exhaustfx, "tag_origin" ); } play_afterburner_fx() { - if ( !isDefined( self.exhaustfx ) ) - { - self.exhaustfx = spawn( "script_model", self.origin ); - self.exhaustfx setmodel( "tag_origin" ); - self.exhaustfx linkto( self, "tag_turret", vectorScale( ( 0, 0, 1 ), 25 ) ); - } - self endon( "death" ); - wait 0,1; - playfxontag( level.fx_cuav_afterburner, self.exhaustfx, "tag_origin" ); + if ( !isdefined( self.exhaustfx ) ) + { + self.exhaustfx = spawn( "script_model", self.origin ); + self.exhaustfx setmodel( "tag_origin" ); + self.exhaustfx linkto( self, "tag_turret", vectorscale( ( 0, 0, 1 ), 25.0 ) ); + } + + self endon( "death" ); + wait 0.1; + playfxontag( level.fx_cuav_afterburner, self.exhaustfx, "tag_origin" ); } remote_explode() { - self notify( "death" ); - self hide(); - forward = anglesToForward( self.angles ) * 200; - playfx( level.fx_u2_explode, self.origin, forward ); - self playsound( "evt_helicopter_midair_exp" ); - wait 0,2; - self notify( "delete" ); - self delete(); + self notify( "death" ); + self hide(); + forward = anglestoforward( self.angles ) * 200; + playfx( level.fx_u2_explode, self.origin, forward ); + self playsound( "evt_helicopter_midair_exp" ); + wait 0.2; + self notify( "delete" ); + self delete(); } visionswitch() { - self endon( "disconnect" ); - level endon( "remote_end" ); - inverted = 1; - self setinfraredvision( 1 ); - self useservervisionset( 1 ); - self setvisionsetforplayer( level.remore_mortar_infrared_vision, 1 ); - for ( ;; ) - { - while ( self changeseatbuttonpressed() ) - { - if ( !inverted ) - { - self setinfraredvision( 1 ); - self setvisionsetforplayer( level.remore_mortar_infrared_vision, 0,5 ); - self playlocalsound( "mpl_ks_reaper_view_select" ); - } - else - { - self setinfraredvision( 0 ); - self setvisionsetforplayer( level.remore_mortar_enhanced_vision, 0,5 ); - self playlocalsound( "mpl_ks_reaper_view_select" ); - } - inverted = !inverted; - while ( self changeseatbuttonpressed() ) - { - wait 0,05; - } - } - wait 0,05; - } + self endon( "disconnect" ); + level endon( "remote_end" ); + inverted = 1; + self setinfraredvision( 1 ); + self useservervisionset( 1 ); + self setvisionsetforplayer( level.remore_mortar_infrared_vision, 1 ); + + for (;;) + { + if ( self changeseatbuttonpressed() ) + { + if ( !inverted ) + { + self setinfraredvision( 1 ); + self setvisionsetforplayer( level.remore_mortar_infrared_vision, 0.5 ); + self playlocalsound( "mpl_ks_reaper_view_select" ); + } + else + { + self setinfraredvision( 0 ); + self setvisionsetforplayer( level.remore_mortar_enhanced_vision, 0.5 ); + self playlocalsound( "mpl_ks_reaper_view_select" ); + } + + inverted = !inverted; + + while ( self changeseatbuttonpressed() ) + wait 0.05; + } + + wait 0.05; + } } diff --git a/Multiplayer Core/patch_mp/maps/mp/killstreaks/_spyplane.gsc b/Multiplayer Core/patch_mp/maps/mp/killstreaks/_spyplane.gsc index 20661db..3af4df1 100644 --- a/Multiplayer Core/patch_mp/maps/mp/killstreaks/_spyplane.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/killstreaks/_spyplane.gsc @@ -1,1146 +1,1090 @@ -#include maps/mp/_scoreevents; -#include maps/mp/gametypes/_globallogic_audio; -#include maps/mp/_popups; -#include maps/mp/gametypes/_damagefeedback; -#include maps/mp/gametypes/_globallogic_player; -#include maps/mp/gametypes/_weaponobjects; -#include maps/mp/_heatseekingmissile; -#include maps/mp/killstreaks/_killstreakrules; -#include maps/mp/_challenges; -#include maps/mp/gametypes/_hostmigration; -#include maps/mp/killstreaks/_radar; -#include maps/mp/gametypes/_spawnlogic; -#include maps/mp/gametypes/_battlechatter_mp; -#include maps/mp/killstreaks/_airsupport; -#include common_scripts/utility; -#include maps/mp/gametypes/_hud_util; -#include maps/mp/_utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\_utility; +#include maps\mp\gametypes\_hud_util; +#include common_scripts\utility; +#include maps\mp\killstreaks\_airsupport; +#include maps\mp\gametypes\_battlechatter_mp; +#include maps\mp\gametypes\_spawnlogic; +#include maps\mp\killstreaks\_radar; +#include maps\mp\gametypes\_hostmigration; +#include maps\mp\_challenges; +#include maps\mp\killstreaks\_killstreakrules; +#include maps\mp\_heatseekingmissile; +#include maps\mp\gametypes\_weaponobjects; +#include maps\mp\gametypes\_globallogic_player; +#include maps\mp\gametypes\_damagefeedback; +#include maps\mp\_popups; +#include maps\mp\gametypes\_globallogic_audio; +#include maps\mp\_scoreevents; init() { - level.spyplanemodel = "veh_t6_drone_uav"; - level.counteruavmodel = "veh_t6_drone_cuav"; - level.u2_maxhealth = 700; - level.spyplane = []; - level.spyplaneentrancetime = 5; - level.spyplaneexittime = 10; - level.counteruavweapon = "counteruav_mp"; - level.counteruavlength = 25; - precachemodel( level.spyplanemodel ); - precachemodel( level.counteruavmodel ); - level.counteruavplaneentrancetime = 5; - level.counteruavplaneexittime = 10; - level.counteruavlight = loadfx( "vehicle/light/fx_cuav_lights_red" ); - level.uavlight = loadfx( "vehicle/light/fx_u2_lights_red" ); - level.fx_spyplane_afterburner = loadfx( "vehicle/exhaust/fx_exhaust_u2_spyplane_afterburner" ); - level.fx_spyplane_burner = loadfx( "vehicle/exhaust/fx_exhaust_u2_spyplane_burner" ); - level.fx_cuav_afterburner = loadfx( "vehicle/exhaust/fx_exhaust_cuav_afterburner" ); - level.fx_cuav_burner = loadfx( "vehicle/exhaust/fx_exhaust_cuav_burner" ); - level.satelliteheight = 10000; - level.satelliteflydistance = 10000; - level.fx_u2_damage_trail = loadfx( "trail/fx_trail_u2_plane_damage_mp" ); - level.fx_u2_explode = loadfx( "vehicle/vexplosion/fx_vexplode_u2_exp_mp" ); - minimaporigins = getentarray( "minimap_corner", "targetname" ); - if ( minimaporigins.size ) - { - uavorigin = maps/mp/gametypes/_spawnlogic::findboxcenter( minimaporigins[ 0 ].origin, minimaporigins[ 1 ].origin ); - } - else - { - uavorigin = ( 0, 0, 1 ); - } - if ( level.script == "mp_hydro" ) - { - uavorigin += vectorScale( ( 0, 0, 1 ), 1200 ); - } - if ( level.teambased ) - { - _a54 = level.teams; - _k54 = getFirstArrayKey( _a54 ); - while ( isDefined( _k54 ) ) - { - team = _a54[ _k54 ]; - level.activeuavs[ team ] = 0; - level.activecounteruavs[ team ] = 0; - level.activesatellites[ team ] = 0; - _k54 = getNextArrayKey( _a54, _k54 ); - } - } - else level.activeuavs = []; - level.activecounteruavs = []; - level.activesatellites = []; - level.uavrig = spawn( "script_model", uavorigin + vectorScale( ( 0, 0, 1 ), 1100 ) ); - level.uavrig setmodel( "tag_origin" ); - level.uavrig.angles = vectorScale( ( 0, 0, 1 ), 115 ); - level.uavrig hide(); - level.uavrig thread rotateuavrig( 1 ); - level.uavrig thread swayuavrig(); - level.counteruavrig = spawn( "script_model", uavorigin + vectorScale( ( 0, 0, 1 ), 1500 ) ); - level.counteruavrig setmodel( "tag_origin" ); - level.counteruavrig.angles = vectorScale( ( 0, 0, 1 ), 115 ); - level.counteruavrig hide(); - level.counteruavrig thread rotateuavrig( 0 ); - level.counteruavrig thread swayuavrig(); - level thread uavtracker(); - level thread onplayerconnect(); + level.spyplanemodel = "veh_t6_drone_uav"; + level.counteruavmodel = "veh_t6_drone_cuav"; + level.u2_maxhealth = 700; + level.spyplane = []; + level.spyplaneentrancetime = 5; + level.spyplaneexittime = 10; + level.counteruavweapon = "counteruav_mp"; + level.counteruavlength = 25.0; + precachemodel( level.spyplanemodel ); + precachemodel( level.counteruavmodel ); + level.counteruavplaneentrancetime = 5; + level.counteruavplaneexittime = 10; + level.counteruavlight = loadfx( "vehicle/light/fx_cuav_lights_red" ); + level.uavlight = loadfx( "vehicle/light/fx_u2_lights_red" ); + level.fx_spyplane_afterburner = loadfx( "vehicle/exhaust/fx_exhaust_u2_spyplane_afterburner" ); + level.fx_spyplane_burner = loadfx( "vehicle/exhaust/fx_exhaust_u2_spyplane_burner" ); + level.fx_cuav_afterburner = loadfx( "vehicle/exhaust/fx_exhaust_cuav_afterburner" ); + level.fx_cuav_burner = loadfx( "vehicle/exhaust/fx_exhaust_cuav_burner" ); + level.satelliteheight = 10000; + level.satelliteflydistance = 10000; + level.fx_u2_damage_trail = loadfx( "trail/fx_trail_u2_plane_damage_mp" ); + level.fx_u2_explode = loadfx( "vehicle/vexplosion/fx_vexplode_u2_exp_mp" ); + minimaporigins = getentarray( "minimap_corner", "targetname" ); + + if ( minimaporigins.size ) + uavorigin = maps\mp\gametypes\_spawnlogic::findboxcenter( minimaporigins[0].origin, minimaporigins[1].origin ); + else + uavorigin = ( 0, 0, 0 ); + + if ( level.script == "mp_hydro" ) + uavorigin += vectorscale( ( 0, 1, 0 ), 1200.0 ); + + if ( level.teambased ) + { + foreach ( team in level.teams ) + { + level.activeuavs[team] = 0; + level.activecounteruavs[team] = 0; + level.activesatellites[team] = 0; + } + } + else + { + level.activeuavs = []; + level.activecounteruavs = []; + level.activesatellites = []; + } + + level.uavrig = spawn( "script_model", uavorigin + vectorscale( ( 0, 0, 1 ), 1100.0 ) ); + level.uavrig setmodel( "tag_origin" ); + level.uavrig.angles = vectorscale( ( 0, 1, 0 ), 115.0 ); + level.uavrig hide(); + level.uavrig thread rotateuavrig( 1 ); + level.uavrig thread swayuavrig(); + level.counteruavrig = spawn( "script_model", uavorigin + vectorscale( ( 0, 0, 1 ), 1500.0 ) ); + level.counteruavrig setmodel( "tag_origin" ); + level.counteruavrig.angles = vectorscale( ( 0, 1, 0 ), 115.0 ); + level.counteruavrig hide(); + level.counteruavrig thread rotateuavrig( 0 ); + level.counteruavrig thread swayuavrig(); + level thread uavtracker(); + level thread onplayerconnect(); } onplayerconnect() { - for ( ;; ) - { - level waittill( "connected", player ); - player.entnum = player getentitynumber(); - level.activeuavs[ player.entnum ] = 0; - level.activecounteruavs[ player.entnum ] = 0; - level.activesatellites[ player.entnum ] = 0; - if ( level.teambased == 0 || level.multiteam == 1 ) - { - player thread watchffaandmultiteamspawn(); - } - } + for (;;) + { + level waittill( "connected", player ); + + player.entnum = player getentitynumber(); + level.activeuavs[player.entnum] = 0; + level.activecounteruavs[player.entnum] = 0; + level.activesatellites[player.entnum] = 0; + + if ( level.teambased == 0 || level.multiteam == 1 ) + player thread watchffaandmultiteamspawn(); + } } watchffaandmultiteamspawn() { - self endon( "disconnect" ); - for ( ;; ) - { - self waittill( "spawned_player" ); - level notify( "uav_update" ); - } + self endon( "disconnect" ); + + for (;;) + { + self waittill( "spawned_player" ); + + level notify( "uav_update" ); + } } rotateuavrig( clockwise ) { - turn = 360; - if ( clockwise ) - { - turn = -360; - } - for ( ;; ) - { - if ( !clockwise ) - { - self rotateyaw( turn, 40 ); - wait 40; - continue; - } - else - { - self rotateyaw( turn, 60 ); - wait 60; - } - } + turn = 360; + + if ( clockwise ) + turn = -360; + + for (;;) + { + if ( !clockwise ) + { + self rotateyaw( turn, 40 ); + wait 40; + continue; + } + + self rotateyaw( turn, 60 ); + wait 60; + } } swayuavrig() { - centerorigin = self.origin; - for ( ;; ) - { - z = randomintrange( -200, -100 ); - time = randomintrange( 3, 6 ); - self moveto( centerorigin + ( 0, 0, z ), time, 1, 1 ); - wait time; - z = randomintrange( 100, 200 ); - time = randomintrange( 3, 6 ); - self moveto( centerorigin + ( 0, 0, z ), time, 1, 1 ); - wait time; - } + centerorigin = self.origin; + + for (;;) + { + z = randomintrange( -200, -100 ); + time = randomintrange( 3, 6 ); + self moveto( centerorigin + ( 0, 0, z ), time, 1, 1 ); + wait( time ); + z = randomintrange( 100, 200 ); + time = randomintrange( 3, 6 ); + self moveto( centerorigin + ( 0, 0, z ), time, 1, 1 ); + wait( time ); + } } callcounteruav( type, displaymessage, killstreak_id ) { - timeinair = self maps/mp/killstreaks/_radar::useradaritem( type, self.team, displaymessage ); - iscounter = 1; - counteruavplane = generateplane( self, timeinair, iscounter ); - if ( !isDefined( counteruavplane ) ) - { - return 0; - } - counteruavplane thread counteruav_watchfor_gamerules_destruction( self ); - counteruavplane setclientflag( 11 ); - counteruavplane addactivecounteruav(); - self.counteruavtime = getTime(); - counteruavplane thread playcounterspyplanefx(); - counteruavplane thread counteruavplane_death_waiter(); - counteruavplane thread counteruavplane_timeout( timeinair, self ); - counteruavplane thread plane_damage_monitor( 0 ); - counteruavplane thread plane_health(); - counteruavplane.killstreak_id = killstreak_id; - counteruavplane.iscounter = 1; - counteruavplane playloopsound( "veh_uav_engine_loop", 1 ); - return 1; + timeinair = self maps\mp\killstreaks\_radar::useradaritem( type, self.team, displaymessage ); + iscounter = 1; + counteruavplane = generateplane( self, timeinair, iscounter ); + + if ( !isdefined( counteruavplane ) ) + return false; + + counteruavplane thread counteruav_watchfor_gamerules_destruction( self ); + counteruavplane setclientflag( 11 ); + counteruavplane addactivecounteruav(); + self.counteruavtime = gettime(); + counteruavplane thread playcounterspyplanefx(); + counteruavplane thread counteruavplane_death_waiter(); + counteruavplane thread counteruavplane_timeout( timeinair, self ); + counteruavplane thread plane_damage_monitor( 0 ); + counteruavplane thread plane_health(); + counteruavplane.killstreak_id = killstreak_id; + counteruavplane.iscounter = 1; + counteruavplane playloopsound( "veh_uav_engine_loop", 1 ); + return true; } callspyplane( type, displaymessage, killstreak_id ) { - timeinair = self maps/mp/killstreaks/_radar::useradaritem( type, self.team, displaymessage ); - iscounter = 0; - spyplane = generateplane( self, timeinair, iscounter ); - if ( !isDefined( spyplane ) ) - { - return 0; - } - spyplane thread spyplane_watchfor_gamerules_destruction( self ); - spyplane addactiveuav(); - self.uavtime = getTime(); - spyplane.leaving = 0; - spyplane thread playspyplanefx(); - spyplane thread spyplane_timeout( timeinair, self ); - spyplane thread spyplane_death_waiter(); - spyplane thread plane_damage_monitor( 1 ); - spyplane thread plane_health(); - spyplane.killstreak_id = killstreak_id; - spyplane.iscounter = 0; - spyplane playloopsound( "veh_uav_engine_loop", 1 ); - return 1; + timeinair = self maps\mp\killstreaks\_radar::useradaritem( type, self.team, displaymessage ); + iscounter = 0; + spyplane = generateplane( self, timeinair, iscounter ); + + if ( !isdefined( spyplane ) ) + return false; + + spyplane thread spyplane_watchfor_gamerules_destruction( self ); + spyplane addactiveuav(); + self.uavtime = gettime(); + spyplane.leaving = 0; + spyplane thread playspyplanefx(); + spyplane thread spyplane_timeout( timeinair, self ); + spyplane thread spyplane_death_waiter(); + spyplane thread plane_damage_monitor( 1 ); + spyplane thread plane_health(); + spyplane.killstreak_id = killstreak_id; + spyplane.iscounter = 0; + spyplane playloopsound( "veh_uav_engine_loop", 1 ); + return true; } callsatellite( type, displaymessage, killstreak_id ) { - timeinair = self maps/mp/killstreaks/_radar::useradaritem( type, self.team, displaymessage ); - satellite = spawn( "script_model", level.mapcenter + ( 0 - level.satelliteflydistance, 0, level.satelliteheight ) ); - satellite setmodel( "tag_origin" ); - satellite moveto( level.mapcenter + ( level.satelliteflydistance, 0, level.satelliteheight ), timeinair ); - satellite.owner = self; - satellite.team = self.team; - satellite setteam( self.team ); - satellite setowner( self ); - satellite.targetname = "satellite"; - satellite addactivesatellite(); - self.satellitetime = getTime(); - satellite thread satellite_timeout( timeinair, self ); - satellite thread satellite_watchfor_gamerules_destruction( self ); - satellite.iscounter = 0; - if ( level.teambased ) - { - satellite thread updatevisibility(); - } - satellite.killstreak_id = killstreak_id; - return 1; + timeinair = self maps\mp\killstreaks\_radar::useradaritem( type, self.team, displaymessage ); + satellite = spawn( "script_model", level.mapcenter + ( 0 - level.satelliteflydistance, 0, level.satelliteheight ) ); + satellite setmodel( "tag_origin" ); + satellite moveto( level.mapcenter + ( level.satelliteflydistance, 0, level.satelliteheight ), timeinair ); + satellite.owner = self; + satellite.team = self.team; + satellite setteam( self.team ); + satellite setowner( self ); + satellite.targetname = "satellite"; + satellite addactivesatellite(); + self.satellitetime = gettime(); + satellite thread satellite_timeout( timeinair, self ); + satellite thread satellite_watchfor_gamerules_destruction( self ); + satellite.iscounter = 0; + + if ( level.teambased ) + satellite thread updatevisibility(); + + satellite.killstreak_id = killstreak_id; + return 1; } spyplane_watchfor_gamerules_destruction( player ) { - self endon( "death" ); - self endon( "crashing" ); - self endon( "delete" ); - player waittill_any( "joined_team", "disconnect", "joined_spectators" ); - self spyplane_death(); + self endon( "death" ); + self endon( "crashing" ); + self endon( "delete" ); + player waittill_any( "joined_team", "disconnect", "joined_spectators" ); + self spyplane_death(); } counteruav_watchfor_gamerules_destruction( player ) { - self endon( "death" ); - self endon( "crashing" ); - self endon( "delete" ); - player waittill_any( "joined_team", "disconnect", "joined_spectators" ); - maps/mp/gametypes/_hostmigration::waittillhostmigrationdone(); - self counteruavplane_death(); + self endon( "death" ); + self endon( "crashing" ); + self endon( "delete" ); + player waittill_any( "joined_team", "disconnect", "joined_spectators" ); + maps\mp\gametypes\_hostmigration::waittillhostmigrationdone(); + self counteruavplane_death(); } satellite_watchfor_gamerules_destruction( player ) { - self endon( "death" ); - self endon( "delete" ); - player waittill_any( "joined_team", "disconnect", "joined_spectators" ); - maps/mp/gametypes/_hostmigration::waittillhostmigrationdone(); - self removeactivesatellite(); - self delete(); + self endon( "death" ); + self endon( "delete" ); + player waittill_any( "joined_team", "disconnect", "joined_spectators" ); + maps\mp\gametypes\_hostmigration::waittillhostmigrationdone(); + self removeactivesatellite(); + self delete(); } addactivecounteruav() { - if ( level.teambased ) - { - self.owner.activecounteruavs++; - level.activecounteruavs[ self.team ]++; - _a284 = level.teams; - _k284 = getFirstArrayKey( _a284 ); - while ( isDefined( _k284 ) ) - { - team = _a284[ _k284 ]; - if ( team == self.team ) - { - } - else - { - if ( level.activesatellites[ team ] > 0 ) - { - self.owner maps/mp/_challenges::blockedsatellite(); - } - } - _k284 = getNextArrayKey( _a284, _k284 ); - } - } - else /# - assert( isDefined( self.owner.entnum ) ); + if ( level.teambased ) + { + self.owner.activecounteruavs++; + level.activecounteruavs[self.team]++; + + foreach ( team in level.teams ) + { + if ( team == self.team ) + continue; + + if ( level.activesatellites[team] > 0 ) + self.owner maps\mp\_challenges::blockedsatellite(); + } + } + else + { +/# + assert( isdefined( self.owner.entnum ) ); #/ - if ( !isDefined( self.owner.entnum ) ) - { - self.owner.entnum = self.owner getentitynumber(); - } - level.activecounteruavs[ self.owner.entnum ]++; - keys = getarraykeys( level.activecounteruavs ); - i = 0; - while ( i < keys.size ) - { - if ( keys[ i ] == self.owner.entnum ) - { - i++; - continue; - } - else - { - if ( level.activecounteruavs[ keys[ i ] ] ) - { - self.owner maps/mp/_challenges::blockedsatellite(); - break; - } - } - else - { - i++; - } - } - level notify( "uav_update" ); + if ( !isdefined( self.owner.entnum ) ) + self.owner.entnum = self.owner getentitynumber(); + + level.activecounteruavs[self.owner.entnum]++; + keys = getarraykeys( level.activecounteruavs ); + + for ( i = 0; i < keys.size; i++ ) + { + if ( keys[i] == self.owner.entnum ) + continue; + + if ( level.activecounteruavs[keys[i]] ) + { + self.owner maps\mp\_challenges::blockedsatellite(); + break; + } + } + } + + level notify( "uav_update" ); } addactiveuav() { - if ( level.teambased ) - { - self.owner.activeuavs++; - level.activeuavs[ self.team ]++; - } - else - { + if ( level.teambased ) + { + self.owner.activeuavs++; + level.activeuavs[self.team]++; + } + else + { /# - assert( isDefined( self.owner.entnum ) ); + assert( isdefined( self.owner.entnum ) ); #/ - if ( !isDefined( self.owner.entnum ) ) - { - self.owner.entnum = self.owner getentitynumber(); - } - level.activeuavs[ self.owner.entnum ]++; - } - level notify( "uav_update" ); + if ( !isdefined( self.owner.entnum ) ) + self.owner.entnum = self.owner getentitynumber(); + + level.activeuavs[self.owner.entnum]++; + } + + level notify( "uav_update" ); } addactivesatellite() { - if ( level.teambased ) - { - self.owner.activesatellites++; - level.activesatellites[ self.team ]++; - } - else - { + if ( level.teambased ) + { + self.owner.activesatellites++; + level.activesatellites[self.team]++; + } + else + { /# - assert( isDefined( self.owner.entnum ) ); + assert( isdefined( self.owner.entnum ) ); #/ - if ( !isDefined( self.owner.entnum ) ) - { - self.owner.entnum = self.owner getentitynumber(); - } - level.activesatellites[ self.owner.entnum ]++; - } - level notify( "uav_update" ); + if ( !isdefined( self.owner.entnum ) ) + self.owner.entnum = self.owner getentitynumber(); + + level.activesatellites[self.owner.entnum]++; + } + + level notify( "uav_update" ); } removeactiveuav() { - if ( level.teambased ) - { - if ( isDefined( self.owner ) && self.owner.spawntime < self.birthtime ) - { - self.owner.activeuavs--; + if ( level.teambased ) + { + if ( isdefined( self.owner ) && self.owner.spawntime < self.birthtime ) + { + self.owner.activeuavs--; +/# + assert( self.owner.activeuavs >= 0 ); +#/ + if ( self.owner.activeuavs < 0 ) + self.owner.activeuavs = 0; + } + level.activeuavs[self.team]--; /# - assert( self.owner.activeuavs >= 0 ); + assert( level.activeuavs[self.team] >= 0 ); #/ - if ( self.owner.activeuavs < 0 ) - { - self.owner.activeuavs = 0; - } - } - level.activeuavs[ self.team ]--; + if ( level.activeuavs[self.team] < 0 ) + level.activeuavs[self.team] = 0; + } + else if ( isdefined( self.owner ) ) + { +/# + assert( isdefined( self.owner.entnum ) ); +#/ + if ( !isdefined( self.owner.entnum ) ) + self.owner.entnum = self.owner getentitynumber(); + level.activeuavs[self.owner.entnum]--; /# - assert( level.activeuavs[ self.team ] >= 0 ); + assert( level.activeuavs[self.owner.entnum] >= 0 ); #/ - if ( level.activeuavs[ self.team ] < 0 ) - { - level.activeuavs[ self.team ] = 0; - } - } - else - { - if ( isDefined( self.owner ) ) - { -/# - assert( isDefined( self.owner.entnum ) ); -#/ - if ( !isDefined( self.owner.entnum ) ) - { - self.owner.entnum = self.owner getentitynumber(); - } - level.activeuavs[ self.owner.entnum ]--; + if ( level.activeuavs[self.owner.entnum] < 0 ) + level.activeuavs[self.owner.entnum] = 0; + } -/# - assert( level.activeuavs[ self.owner.entnum ] >= 0 ); -#/ - if ( level.activeuavs[ self.owner.entnum ] < 0 ) - { - level.activeuavs[ self.owner.entnum ] = 0; - } - } - } - maps/mp/killstreaks/_killstreakrules::killstreakstop( "radar_mp", self.team, self.killstreak_id ); - level notify( "uav_update" ); + maps\mp\killstreaks\_killstreakrules::killstreakstop( "radar_mp", self.team, self.killstreak_id ); + level notify( "uav_update" ); } removeactivecounteruav() { - if ( level.teambased ) - { - if ( isDefined( self.owner ) && self.owner.spawntime < self.birthtime ) - { - self.owner.activecounteruavs--; + if ( level.teambased ) + { + if ( isdefined( self.owner ) && self.owner.spawntime < self.birthtime ) + { + self.owner.activecounteruavs--; +/# + assert( self.owner.activecounteruavs >= 0 ); +#/ + if ( self.owner.activecounteruavs < 0 ) + self.owner.activecounteruavs = 0; + } + level.activecounteruavs[self.team]--; /# - assert( self.owner.activecounteruavs >= 0 ); + assert( level.activecounteruavs[self.team] >= 0 ); #/ - if ( self.owner.activecounteruavs < 0 ) - { - self.owner.activecounteruavs = 0; - } - } - level.activecounteruavs[ self.team ]--; + if ( level.activecounteruavs[self.team] < 0 ) + level.activecounteruavs[self.team] = 0; + } + else if ( isdefined( self.owner ) ) + { +/# + assert( isdefined( self.owner.entnum ) ); +#/ + if ( !isdefined( self.owner.entnum ) ) + self.owner.entnum = self.owner getentitynumber(); + level.activecounteruavs[self.owner.entnum]--; /# - assert( level.activecounteruavs[ self.team ] >= 0 ); + assert( level.activecounteruavs[self.owner.entnum] >= 0 ); #/ - if ( level.activecounteruavs[ self.team ] < 0 ) - { - level.activecounteruavs[ self.team ] = 0; - } - } - else - { - if ( isDefined( self.owner ) ) - { -/# - assert( isDefined( self.owner.entnum ) ); -#/ - if ( !isDefined( self.owner.entnum ) ) - { - self.owner.entnum = self.owner getentitynumber(); - } - level.activecounteruavs[ self.owner.entnum ]--; + if ( level.activecounteruavs[self.owner.entnum] < 0 ) + level.activecounteruavs[self.owner.entnum] = 0; + } -/# - assert( level.activecounteruavs[ self.owner.entnum ] >= 0 ); -#/ - if ( level.activecounteruavs[ self.owner.entnum ] < 0 ) - { - level.activecounteruavs[ self.owner.entnum ] = 0; - } - } - } - maps/mp/killstreaks/_killstreakrules::killstreakstop( "counteruav_mp", self.team, self.killstreak_id ); - level notify( "uav_update" ); + maps\mp\killstreaks\_killstreakrules::killstreakstop( "counteruav_mp", self.team, self.killstreak_id ); + level notify( "uav_update" ); } removeactivesatellite() { - if ( level.teambased ) - { - if ( self.owner.spawntime < self.birthtime && isDefined( self.owner ) ) - { - self.owner.activesatellites--; + if ( level.teambased ) + { + if ( self.owner.spawntime < self.birthtime && isdefined( self.owner ) ) + { + self.owner.activesatellites--; +/# + assert( self.owner.activesatellites >= 0 ); +#/ + if ( self.owner.activesatellites < 0 ) + self.owner.activesatellites = 0; + } + level.activesatellites[self.team]--; /# - assert( self.owner.activesatellites >= 0 ); + assert( level.activesatellites[self.team] >= 0 ); #/ - if ( self.owner.activesatellites < 0 ) - { - self.owner.activesatellites = 0; - } - } - level.activesatellites[ self.team ]--; + if ( level.activesatellites[self.team] < 0 ) + level.activesatellites[self.team] = 0; + } + else if ( isdefined( self.owner ) ) + { +/# + assert( isdefined( self.owner.entnum ) ); +#/ + if ( !isdefined( self.owner.entnum ) ) + self.owner.entnum = self.owner getentitynumber(); + level.activesatellites[self.owner.entnum]--; /# - assert( level.activesatellites[ self.team ] >= 0 ); + assert( level.activesatellites[self.owner.entnum] >= 0 ); #/ - if ( level.activesatellites[ self.team ] < 0 ) - { - level.activesatellites[ self.team ] = 0; - } - } - else - { - if ( isDefined( self.owner ) ) - { -/# - assert( isDefined( self.owner.entnum ) ); -#/ - if ( !isDefined( self.owner.entnum ) ) - { - self.owner.entnum = self.owner getentitynumber(); - } - level.activesatellites[ self.owner.entnum ]--; + if ( level.activesatellites[self.owner.entnum] < 0 ) + level.activesatellites[self.owner.entnum] = 0; + } -/# - assert( level.activesatellites[ self.owner.entnum ] >= 0 ); -#/ - if ( level.activesatellites[ self.owner.entnum ] < 0 ) - { - level.activesatellites[ self.owner.entnum ] = 0; - } - } - } - maps/mp/killstreaks/_killstreakrules::killstreakstop( "radardirection_mp", self.team, self.killstreak_id ); - level notify( "uav_update" ); + maps\mp\killstreaks\_killstreakrules::killstreakstop( "radardirection_mp", self.team, self.killstreak_id ); + level notify( "uav_update" ); } playspyplanefx() { - wait 0,1; - playfxontag( level.fx_spyplane_burner, self, "tag_origin" ); + wait 0.1; + playfxontag( level.fx_spyplane_burner, self, "tag_origin" ); } playspyplaneafterburnerfx() { - self endon( "death" ); - wait 0,1; - playfxontag( level.fx_spyplane_afterburner, self, "tag_origin" ); + self endon( "death" ); + wait 0.1; + playfxontag( level.fx_spyplane_afterburner, self, "tag_origin" ); } playcounterspyplanefx() { - wait 0,1; - if ( isDefined( self ) ) - { - playfxontag( level.fx_cuav_burner, self, "tag_origin" ); - } + wait 0.1; + + if ( isdefined( self ) ) + playfxontag( level.fx_cuav_burner, self, "tag_origin" ); } playcounterspyplaneafterburnerfx() { - self endon( "death" ); - wait 0,1; - playfxontag( level.fx_cuav_afterburner, self, "tag_origin" ); + self endon( "death" ); + wait 0.1; + playfxontag( level.fx_cuav_afterburner, self, "tag_origin" ); } playuavpilotdialog( dialog, owner, delaytime ) { - if ( isDefined( delaytime ) ) - { - wait delaytime; - } - self.pilotvoicenumber = owner.bcvoicenumber + 1; - soundalias = level.teamprefix[ owner.team ] + self.pilotvoicenumber + "_" + dialog; - while ( isDefined( owner.pilotisspeaking ) ) - { - while ( owner.pilotisspeaking ) - { - while ( owner.pilotisspeaking ) - { - wait 0,2; - } - } - } - if ( isDefined( owner ) ) - { - owner playlocalsound( soundalias ); - owner.pilotisspeaking = 1; - owner thread waitplaybacktime( soundalias ); - owner waittill_any( soundalias, "death", "disconnect" ); - owner.pilotisspeaking = 0; - } + if ( isdefined( delaytime ) ) + wait( delaytime ); + + self.pilotvoicenumber = owner.bcvoicenumber + 1; + soundalias = level.teamprefix[owner.team] + self.pilotvoicenumber + "_" + dialog; + + if ( isdefined( owner.pilotisspeaking ) ) + { + if ( owner.pilotisspeaking ) + { + while ( owner.pilotisspeaking ) + wait 0.2; + } + } + + if ( isdefined( owner ) ) + { + owner playlocalsound( soundalias ); + owner.pilotisspeaking = 1; + owner thread waitplaybacktime( soundalias ); + owner waittill_any( soundalias, "death", "disconnect" ); + owner.pilotisspeaking = 0; + } } generateplane( owner, timeinair, iscounter ) { - uavrig = level.uavrig; - attach_angle = -90; - if ( iscounter ) - { - uavrig = level.counteruavrig; - attach_angle = 90; - } - plane = spawn( "script_model", uavrig gettagorigin( "tag_origin" ) ); - if ( iscounter ) - { - plane setmodel( level.counteruavmodel ); - plane.targetname = "counteruav"; - } - else - { - plane setmodel( level.spyplanemodel ); - plane.targetname = "uav"; - } - plane setteam( owner.team ); - plane setowner( owner ); - target_set( plane ); - plane thread play_light_fx( iscounter ); - plane.owner = owner; - plane.team = owner.team; - plane thread updatevisibility(); - plane thread maps/mp/_heatseekingmissile::missiletarget_proximitydetonateincomingmissile( "crashing" ); - level.plane[ self.team ] = plane; - plane.health_low = level.u2_maxhealth * 0,4; - plane.maxhealth = level.u2_maxhealth; - plane.health = 99999; - plane.rocketdamageoneshot = level.u2_maxhealth + 1; - plane.rocketdamagetwoshot = ( level.u2_maxhealth / 2 ) + 1; - plane setdrawinfrared( 1 ); - zoffset = randomintrange( 4000, 5000 ); - angle = randomint( 360 ); - if ( iscounter ) - { - radiusoffset = randomint( 1000 ) + 3000; - } - else - { - radiusoffset = randomint( 1000 ) + 4000; - } - xoffset = cos( angle ) * radiusoffset; - yoffset = sin( angle ) * radiusoffset; - anglevector = vectornormalize( ( xoffset, yoffset, zoffset ) ); - anglevector *= randomintrange( 4000, 5000 ); - if ( iscounter ) - { - plane linkto( uavrig, "tag_origin", anglevector, ( 0, angle + attach_angle, -10 ) ); - } - else - { - plane linkto( uavrig, "tag_origin", anglevector, ( 0, angle + attach_angle, 0 ) ); - } - return plane; + uavrig = level.uavrig; + attach_angle = -90; + + if ( iscounter ) + { + uavrig = level.counteruavrig; + attach_angle = 90; + } + + plane = spawn( "script_model", uavrig gettagorigin( "tag_origin" ) ); + + if ( iscounter ) + { + plane setmodel( level.counteruavmodel ); + plane.targetname = "counteruav"; + } + else + { + plane setmodel( level.spyplanemodel ); + plane.targetname = "uav"; + } + + plane setteam( owner.team ); + plane setowner( owner ); + target_set( plane ); + plane thread play_light_fx( iscounter ); + plane.owner = owner; + plane.team = owner.team; + plane thread updatevisibility(); + plane thread maps\mp\_heatseekingmissile::missiletarget_proximitydetonateincomingmissile( "crashing" ); + level.plane[self.team] = plane; + plane.health_low = level.u2_maxhealth * 0.4; + plane.maxhealth = level.u2_maxhealth; + plane.health = 99999; + plane.rocketdamageoneshot = level.u2_maxhealth + 1; + plane.rocketdamagetwoshot = level.u2_maxhealth / 2 + 1; + plane setdrawinfrared( 1 ); + zoffset = randomintrange( 4000, 5000 ); + angle = randomint( 360 ); + + if ( iscounter ) + radiusoffset = randomint( 1000 ) + 3000; + else + radiusoffset = randomint( 1000 ) + 4000; + + xoffset = cos( angle ) * radiusoffset; + yoffset = sin( angle ) * radiusoffset; + anglevector = vectornormalize( ( xoffset, yoffset, zoffset ) ); + anglevector *= randomintrange( 4000, 5000 ); + + if ( iscounter ) + plane linkto( uavrig, "tag_origin", anglevector, ( 0, angle + attach_angle, -10 ) ); + else + plane linkto( uavrig, "tag_origin", anglevector, ( 0, angle + attach_angle, 0 ) ); + + return plane; } play_light_fx( iscounter ) { - self endon( "death" ); - wait 0,1; - if ( iscounter ) - { - playfxontag( level.counteruavlight, self, "tag_origin" ); - } - else - { - playfxontag( level.uavlight, self, "tag_origin" ); - } + self endon( "death" ); + wait 0.1; + + if ( iscounter ) + playfxontag( level.counteruavlight, self, "tag_origin" ); + else + playfxontag( level.uavlight, self, "tag_origin" ); } updatevisibility() { - self endon( "death" ); - for ( ;; ) - { - if ( level.teambased ) - { - self setvisibletoallexceptteam( self.team ); - } - else - { - self setvisibletoall(); - self setinvisibletoplayer( self.owner ); - } - level waittill( "joined_team" ); - } + self endon( "death" ); + + for (;;) + { + if ( level.teambased ) + self setvisibletoallexceptteam( self.team ); + else + { + self setvisibletoall(); + self setinvisibletoplayer( self.owner ); + } + + level waittill( "joined_team" ); + } } debugline( frompoint, topoint, color, durationframes ) { /# - i = 0; - while ( i < ( durationframes * 20 ) ) - { - line( frompoint, topoint, color ); - wait 0,05; - i++; + for ( i = 0; i < durationframes * 20; i++ ) + { + line( frompoint, topoint, color ); + wait 0.05; + } #/ - } } plane_damage_monitor( isspyplane ) { - self endon( "death" ); - self endon( "crashing" ); - self endon( "delete" ); - self setcandamage( 1 ); - self.damagetaken = 0; - for ( ;; ) - { - self waittill( "damage", damage, attacker, direction, point, type, tagname, modelname, partname, weapon ); - if ( !isDefined( attacker ) || !isplayer( attacker ) ) - { - continue; - } - else - { - friendlyfire = maps/mp/gametypes/_weaponobjects::friendlyfirecheck( self.owner, attacker ); - if ( !friendlyfire ) - { - break; - } - else if ( isDefined( self.owner ) && attacker == self.owner ) - { - break; - } - else - { - isvalidattacker = 1; - if ( level.teambased ) - { - if ( isDefined( attacker.team ) ) - { - isvalidattacker = attacker.team != self.team; - } - } - if ( !isvalidattacker ) - { - break; - } - else - { - if ( maps/mp/gametypes/_globallogic_player::dodamagefeedback( weapon, attacker ) ) - { - attacker thread maps/mp/gametypes/_damagefeedback::updatedamagefeedback( type ); - } - self.attacker = attacker; - switch( type ) - { - case "MOD_PISTOL_BULLET": - case "MOD_RIFLE_BULLET": - if ( attacker hasperk( "specialty_armorpiercing" ) ) - { - self.damagetaken += int( damage * level.cac_armorpiercing_data ); - } - else - { - self.damagetaken += damage; - } - break; - case "MOD_PROJECTILE": - self.damagetaken += self.rocketdamageoneshot; - break; - default: - self.damagetaken += damage; - break; - } - self.health += damage; - if ( self.damagetaken > self.maxhealth ) - { - killstreakreference = "radar_mp"; - if ( !isspyplane ) - { - killstreakreference = "counteruav_mp"; - } - attacker notify( "destroyed_spyplane" ); - weaponstatname = "destroyed"; - switch( weapon ) - { - case "auto_tow_mp": - case "tow_turret_drop_mp": - case "tow_turret_mp": - weaponstatname = "kills"; - break; - } - attacker addweaponstat( weapon, weaponstatname, 1 ); - level.globalkillstreaksdestroyed++; - attacker addweaponstat( killstreakreference, "destroyed", 1 ); - maps/mp/_challenges::destroyedaircraft( attacker, weapon ); - if ( isspyplane ) - { - level thread maps/mp/_popups::displayteammessagetoall( &"KILLSTREAK_DESTROYED_UAV", attacker ); - if ( isDefined( self.owner ) ) - { - self.owner maps/mp/gametypes/_globallogic_audio::leaderdialogonplayer( "uav_destroyed", "item_destroyed" ); - } - if ( !isDefined( self.owner ) || self.owner isenemyplayer( attacker ) ) - { - thread maps/mp/_scoreevents::processscoreevent( "destroyed_uav", attacker, self.owner, weapon ); - attacker maps/mp/_challenges::addflyswatterstat( weapon, self ); - break; - } - spyplane_death(); - } - else - { - level thread maps/mp/_popups::displayteammessagetoall( &"KILLSTREAK_DESTROYED_COUNTERUAV", attacker ); - if ( isDefined( self.owner ) ) - { - self.owner maps/mp/gametypes/_globallogic_audio::leaderdialogonplayer( "cuav_destroyed", "item_destroyed" ); - } - if ( !isDefined( self.owner ) || self.owner isenemyplayer( attacker ) ) - { - thread maps/mp/_scoreevents::processscoreevent( "destroyed_counter_uav", attacker, self.owner, weapon ); - attacker maps/mp/_challenges::addflyswatterstat( weapon, self ); - break; - } - counteruavplane_death(); - } - return; - } - } - } - } - } + self endon( "death" ); + self endon( "crashing" ); + self endon( "delete" ); + self setcandamage( 1 ); + self.damagetaken = 0; + + for (;;) + { + self waittill( "damage", damage, attacker, direction, point, type, tagname, modelname, partname, weapon ); + + if ( !isdefined( attacker ) || !isplayer( attacker ) ) + continue; + + friendlyfire = maps\mp\gametypes\_weaponobjects::friendlyfirecheck( self.owner, attacker ); + + if ( !friendlyfire ) + continue; + + if ( isdefined( self.owner ) && attacker == self.owner ) + continue; + + isvalidattacker = 1; + + if ( level.teambased ) + isvalidattacker = isdefined( attacker.team ) && attacker.team != self.team; + + if ( !isvalidattacker ) + continue; + + if ( maps\mp\gametypes\_globallogic_player::dodamagefeedback( weapon, attacker ) ) + attacker thread maps\mp\gametypes\_damagefeedback::updatedamagefeedback( type ); + + self.attacker = attacker; + + switch ( type ) + { + case "MOD_RIFLE_BULLET": + case "MOD_PISTOL_BULLET": + if ( attacker hasperk( "specialty_armorpiercing" ) ) + self.damagetaken += int( damage * level.cac_armorpiercing_data ); + else + self.damagetaken += damage; + + break; + case "MOD_PROJECTILE": + self.damagetaken += self.rocketdamageoneshot; + break; + default: + self.damagetaken += damage; + break; + } + + self.health += damage; + + if ( self.damagetaken > self.maxhealth ) + { + killstreakreference = "radar_mp"; + + if ( !isspyplane ) + killstreakreference = "counteruav_mp"; + + attacker notify( "destroyed_spyplane" ); + weaponstatname = "destroyed"; + + switch ( weapon ) + { + case "tow_turret_mp": + case "tow_turret_drop_mp": + case "auto_tow_mp": + weaponstatname = "kills"; + break; + } + + attacker addweaponstat( weapon, weaponstatname, 1 ); + level.globalkillstreaksdestroyed++; + attacker addweaponstat( killstreakreference, "destroyed", 1 ); + maps\mp\_challenges::destroyedaircraft( attacker, weapon ); + + if ( isspyplane ) + { + level thread maps\mp\_popups::displayteammessagetoall( &"KILLSTREAK_DESTROYED_UAV", attacker ); + + if ( isdefined( self.owner ) ) + self.owner maps\mp\gametypes\_globallogic_audio::leaderdialogonplayer( "uav_destroyed", "item_destroyed" ); + + if ( !isdefined( self.owner ) || self.owner isenemyplayer( attacker ) ) + { + thread maps\mp\_scoreevents::processscoreevent( "destroyed_uav", attacker, self.owner, weapon ); + attacker maps\mp\_challenges::addflyswatterstat( weapon, self ); + } + else + { + + } + + spyplane_death(); + } + else + { + level thread maps\mp\_popups::displayteammessagetoall( &"KILLSTREAK_DESTROYED_COUNTERUAV", attacker ); + + if ( isdefined( self.owner ) ) + self.owner maps\mp\gametypes\_globallogic_audio::leaderdialogonplayer( "cuav_destroyed", "item_destroyed" ); + + if ( !isdefined( self.owner ) || self.owner isenemyplayer( attacker ) ) + { + thread maps\mp\_scoreevents::processscoreevent( "destroyed_counter_uav", attacker, self.owner, weapon ); + attacker maps\mp\_challenges::addflyswatterstat( weapon, self ); + } + else + { + + } + + counteruavplane_death(); + } + + return; + } + } } plane_health() { - self endon( "death" ); - self endon( "crashing" ); - self.currentstate = "ok"; - self.laststate = "ok"; - while ( self.currentstate != "leaving" ) - { - if ( self.damagetaken >= self.health_low ) - { - self.currentstate = "damaged"; - } - if ( self.currentstate == "damaged" && self.laststate != "damaged" ) - { - self.laststate = self.currentstate; - self thread playdamagefx(); - } + self endon( "death" ); + self endon( "crashing" ); + self.currentstate = "ok"; + self.laststate = "ok"; + + while ( self.currentstate != "leaving" ) + { + if ( self.damagetaken >= self.health_low ) + self.currentstate = "damaged"; + + if ( self.currentstate == "damaged" && self.laststate != "damaged" ) + { + self.laststate = self.currentstate; + self thread playdamagefx(); + } /# - debug_print3d_simple( "Health: " + ( self.maxhealth - self.damagetaken ), self, vectorScale( ( 0, 0, 1 ), 100 ), 20 ); + debug_print3d_simple( "Health: " + self.maxhealth - self.damagetaken, self, vectorscale( ( 0, 0, 1 ), 100.0 ), 20 ); #/ - wait 1; - } + wait 1; + } } playdamagefx() { - self endon( "death" ); - self endon( "crashing" ); - playfxontag( level.fx_u2_damage_trail, self, "tag_body" ); + self endon( "death" ); + self endon( "crashing" ); + playfxontag( level.fx_u2_damage_trail, self, "tag_body" ); } u2_crash() { - self notify( "crashing" ); - playfxontag( level.fx_u2_explode, self, "tag_origin" ); - wait 0,1; - self setmodel( "tag_origin" ); - wait 0,2; - self notify( "delete" ); - self delete(); + self notify( "crashing" ); + playfxontag( level.fx_u2_explode, self, "tag_origin" ); + wait 0.1; + self setmodel( "tag_origin" ); + wait 0.2; + self notify( "delete" ); + self delete(); } counteruavplane_death_waiter() { - self endon( "delete" ); - self endon( "leaving" ); - self waittill( "death" ); - counteruavplane_death(); + self endon( "delete" ); + self endon( "leaving" ); + + self waittill( "death" ); + + counteruavplane_death(); } spyplane_death_waiter() { - self endon( "delete" ); - self endon( "leaving" ); - self waittill( "death" ); - spyplane_death(); + self endon( "delete" ); + self endon( "leaving" ); + + self waittill( "death" ); + + spyplane_death(); } counteruavplane_death() { - self clearclientflag( 11 ); - self playsound( "evt_helicopter_midair_exp" ); - self removeactivecounteruav(); - target_remove( self ); - self thread u2_crash(); + self clearclientflag( 11 ); + self playsound( "evt_helicopter_midair_exp" ); + self removeactivecounteruav(); + target_remove( self ); + self thread u2_crash(); } spyplane_death() { - self playsound( "evt_helicopter_midair_exp" ); - if ( !self.leaving ) - { - self removeactiveuav(); - } - target_remove( self ); - self thread u2_crash(); + self playsound( "evt_helicopter_midair_exp" ); + + if ( !self.leaving ) + self removeactiveuav(); + + target_remove( self ); + self thread u2_crash(); } counteruavplane_timeout( timeinair, owner ) { - self endon( "death" ); - self endon( "delete" ); - maps/mp/gametypes/_hostmigration::waittillhostmigrationdone(); - timeremaining = timeinair * 1000; - self waittilltimeoutmigrationaware( timeremaining, owner ); - self clearclientflag( 11 ); - self plane_leave(); - wait level.counteruavplaneexittime; - self removeactivecounteruav(); - target_remove( self ); - self delete(); + self endon( "death" ); + self endon( "delete" ); + maps\mp\gametypes\_hostmigration::waittillhostmigrationdone(); + timeremaining = timeinair * 1000; + self waittilltimeoutmigrationaware( timeremaining, owner ); + self clearclientflag( 11 ); + self plane_leave(); + wait( level.counteruavplaneexittime ); + self removeactivecounteruav(); + target_remove( self ); + self delete(); } satellite_timeout( timeinair, owner ) { - self endon( "death" ); - self endon( "delete" ); - maps/mp/gametypes/_hostmigration::waittillhostmigrationdone(); - timeremaining = timeinair * 1000; - self waittilltimeoutmigrationaware( timeremaining, owner ); - self removeactivesatellite(); - self delete(); + self endon( "death" ); + self endon( "delete" ); + maps\mp\gametypes\_hostmigration::waittillhostmigrationdone(); + timeremaining = timeinair * 1000; + self waittilltimeoutmigrationaware( timeremaining, owner ); + self removeactivesatellite(); + self delete(); } watchforemp() { - self endon( "death" ); - self endon( "delete" ); - self waittill( "emp_deployed", attacker ); - weapon = "emp_mp"; - maps/mp/_challenges::destroyedaircraft( attacker, weapon ); - thread maps/mp/_scoreevents::processscoreevent( "destroyed_satellite", attacker, self.owner, weapon ); - attacker maps/mp/_challenges::addflyswatterstat( weapon, self ); - self removeactivesatellite(); - self delete(); + self endon( "death" ); + self endon( "delete" ); + + self waittill( "emp_deployed", attacker ); + + weapon = "emp_mp"; + maps\mp\_challenges::destroyedaircraft( attacker, weapon ); + thread maps\mp\_scoreevents::processscoreevent( "destroyed_satellite", attacker, self.owner, weapon ); + attacker maps\mp\_challenges::addflyswatterstat( weapon, self ); + self removeactivesatellite(); + self delete(); } spyplane_timeout( timeinair, owner ) { - self endon( "death" ); - self endon( "delete" ); - self endon( "crashing" ); - maps/mp/gametypes/_hostmigration::waittillhostmigrationdone(); - timeremaining = timeinair * 1000; - self waittilltimeoutmigrationaware( timeremaining, owner ); - self plane_leave(); - self.leaving = 1; - self removeactiveuav(); - wait level.spyplaneexittime; - target_remove( self ); - self delete(); + self endon( "death" ); + self endon( "delete" ); + self endon( "crashing" ); + maps\mp\gametypes\_hostmigration::waittillhostmigrationdone(); + timeremaining = timeinair * 1000; + self waittilltimeoutmigrationaware( timeremaining, owner ); + self plane_leave(); + self.leaving = 1; + self removeactiveuav(); + wait( level.spyplaneexittime ); + target_remove( self ); + self delete(); } waittilltimeoutmigrationaware( timeremaining, owner ) { - owner endon( "disconnect" ); - for ( ;; ) - { - self.endtime = getTime() + timeremaining; - event = level waittill_any_timeout( timeremaining / 1000, "game_ended", "host_migration_begin" ); - if ( event != "host_migration_begin" ) - { - return; - } - else timeremaining = self.endtime - getTime(); - if ( timeremaining <= 0 ) - { - return; - } - else - { - maps/mp/gametypes/_hostmigration::waittillhostmigrationdone(); - } - } + owner endon( "disconnect" ); + + for (;;) + { + self.endtime = gettime() + timeremaining; + event = level waittill_any_timeout( timeremaining / 1000, "game_ended", "host_migration_begin" ); + + if ( event != "host_migration_begin" ) + break; + + timeremaining = self.endtime - gettime(); + + if ( timeremaining <= 0 ) + break; + + maps\mp\gametypes\_hostmigration::waittillhostmigrationdone(); + } } planestoploop( time ) { - self endon( "death" ); - wait time; - self stoploopsound(); + self endon( "death" ); + wait( time ); + self stoploopsound(); } plane_leave() { - self unlink(); - if ( isDefined( self.iscounter ) && self.iscounter ) - { - self thread playcounterspyplaneafterburnerfx(); - self playsound( "veh_kls_uav_afterburner" ); - self thread play_light_fx( 1 ); - self thread planestoploop( 1 ); - } - else - { - self thread playspyplaneafterburnerfx(); - self playsound( "veh_kls_spy_afterburner" ); - self thread play_light_fx( 0 ); - self thread planestoploop( 1 ); - } - self.currentstate = "leaving"; - if ( self.laststate == "damaged" ) - { - playfxontag( level.fx_u2_damage_trail, self, "tag_body" ); - } - mult = getdvarintdefault( "scr_spymult", 20000 ); - tries = 10; - yaw = 0; - while ( tries > 0 ) - { - exitvector = anglesToForward( self.angles + ( 0, yaw, 0 ) ) * 20000; - if ( isDefined( self.iscounter ) && self.iscounter ) - { - self thread playcounterspyplanefx(); - exitvector *= 1; - } - exitpoint = ( self.origin[ 0 ] + exitvector[ 0 ], self.origin[ 1 ] + exitvector[ 1 ], self.origin[ 2 ] - 2500 ); - exitpoint = self.origin + exitvector; - nfz = crossesnoflyzone( self.origin, exitpoint ); - if ( isDefined( nfz ) ) - { - if ( tries != 1 ) - { - if ( ( tries % 2 ) == 1 ) - { - yaw *= -1; - tries--; - continue; - } - else - { - yaw += 10; - yaw *= -1; - } - } - tries--; + self unlink(); - continue; - } - else - { - tries = 0; - } - } - self thread flattenyaw( self.angles[ 1 ] + yaw ); - if ( self.angles[ 2 ] != 0 ) - { - self thread flattenroll(); - } - self moveto( exitpoint, level.spyplaneexittime, 0, 0 ); - self notify( "leaving" ); + if ( isdefined( self.iscounter ) && self.iscounter ) + { + self thread playcounterspyplaneafterburnerfx(); + self playsound( "veh_kls_uav_afterburner" ); + self thread play_light_fx( 1 ); + self thread planestoploop( 1 ); + } + else + { + self thread playspyplaneafterburnerfx(); + self playsound( "veh_kls_spy_afterburner" ); + self thread play_light_fx( 0 ); + self thread planestoploop( 1 ); + } + + self.currentstate = "leaving"; + + if ( self.laststate == "damaged" ) + playfxontag( level.fx_u2_damage_trail, self, "tag_body" ); + + mult = getdvarintdefault( "scr_spymult", 20000 ); + tries = 10; + yaw = 0; + + while ( tries > 0 ) + { + exitvector = anglestoforward( self.angles + ( 0, yaw, 0 ) ) * 20000; + + if ( isdefined( self.iscounter ) && self.iscounter ) + { + self thread playcounterspyplanefx(); + exitvector *= 1.0; + } + + exitpoint = ( self.origin[0] + exitvector[0], self.origin[1] + exitvector[1], self.origin[2] - 2500 ); + exitpoint = self.origin + exitvector; + nfz = crossesnoflyzone( self.origin, exitpoint ); + + if ( isdefined( nfz ) ) + { + if ( tries != 1 ) + { + if ( tries % 2 == 1 ) + yaw *= -1; + else + { + yaw += 10; + yaw *= -1; + } + } + + tries--; + } + else + tries = 0; + } + + self thread flattenyaw( self.angles[1] + yaw ); + + if ( self.angles[2] != 0 ) + self thread flattenroll(); + + self moveto( exitpoint, level.spyplaneexittime, 0, 0 ); + self notify( "leaving" ); } flattenroll() { - self endon( "death" ); - while ( self.angles[ 2 ] < 0 ) - { - self.angles = ( self.angles[ 0 ], self.angles[ 1 ], self.angles[ 2 ] + 2,5 ); - wait 0,05; - } + self endon( "death" ); + + while ( self.angles[2] < 0 ) + { + self.angles = ( self.angles[0], self.angles[1], self.angles[2] + 2.5 ); + wait 0.05; + } } flattenyaw( goal ) { - self endon( "death" ); - increment = 3; - if ( self.angles[ 1 ] > goal ) - { - increment *= -1; - } - while ( abs( self.angles[ 1 ] - goal ) > 3 ) - { - self.angles = ( self.angles[ 0 ], self.angles[ 1 ] + increment, self.angles[ 2 ] ); - wait 0,05; - } + self endon( "death" ); + increment = 3; + + if ( self.angles[1] > goal ) + increment *= -1; + + while ( abs( self.angles[1] - goal ) > 3 ) + { + self.angles = ( self.angles[0], self.angles[1] + increment, self.angles[2] ); + wait 0.05; + } } uavtracker() { - level endon( "game_ended" ); - for ( ;; ) - { - level waittill( "uav_update" ); - if ( level.teambased ) - { - _a1102 = level.teams; - _k1102 = getFirstArrayKey( _a1102 ); - while ( isDefined( _k1102 ) ) - { - team = _a1102[ _k1102 ]; - updateteamuavstatus( team ); - _k1102 = getNextArrayKey( _a1102, _k1102 ); - } - } - else updateplayersuavstatus(); - } + level endon( "game_ended" ); + + for (;;) + { + level waittill( "uav_update" ); + + if ( level.teambased ) + { + foreach ( team in level.teams ) + updateteamuavstatus( team ); + + continue; + } + + updateplayersuavstatus(); + } } updateteamuavstatus( team ) { - activeuavs = level.activeuavs[ team ]; - activesatellites = level.activesatellites[ team ]; - radarmode = 1; - if ( activesatellites > 0 ) - { - maps/mp/killstreaks/_radar::setteamspyplanewrapper( team, 0 ); - maps/mp/killstreaks/_radar::setteamsatellitewrapper( team, 1 ); - return; - } - maps/mp/killstreaks/_radar::setteamsatellitewrapper( team, 0 ); - if ( !activeuavs ) - { - maps/mp/killstreaks/_radar::setteamspyplanewrapper( team, 0 ); - return; - } - if ( activeuavs > 1 ) - { - radarmode = 2; - } - maps/mp/killstreaks/_radar::setteamspyplanewrapper( team, radarmode ); + activeuavs = level.activeuavs[team]; + activesatellites = level.activesatellites[team]; + radarmode = 1; + + if ( activesatellites > 0 ) + { + maps\mp\killstreaks\_radar::setteamspyplanewrapper( team, 0 ); + maps\mp\killstreaks\_radar::setteamsatellitewrapper( team, 1 ); + return; + } + + maps\mp\killstreaks\_radar::setteamsatellitewrapper( team, 0 ); + + if ( !activeuavs ) + { + maps\mp\killstreaks\_radar::setteamspyplanewrapper( team, 0 ); + return; + } + + if ( activeuavs > 1 ) + radarmode = 2; + + maps\mp\killstreaks\_radar::setteamspyplanewrapper( team, radarmode ); } updateplayersuavstatus() { - i = 0; - while ( i < level.players.size ) - { - player = level.players[ i ]; + for ( i = 0; i < level.players.size; i++ ) + { + player = level.players[i]; /# - assert( isDefined( player.entnum ) ); + assert( isdefined( player.entnum ) ); #/ - if ( !isDefined( player.entnum ) ) - { - player.entnum = player getentitynumber(); - } - activeuavs = level.activeuavs[ player.entnum ]; - activesatellites = level.activesatellites[ player.entnum ]; - if ( activesatellites > 0 ) - { - player.hassatellite = 1; - player.hasspyplane = 0; - player setclientuivisibilityflag( "radar_client", 1 ); - i++; - continue; - } - else player.hassatellite = 0; - if ( activeuavs == 0 && isDefined( player.pers[ "hasRadar" ] ) && !player.pers[ "hasRadar" ] ) - { - player.hasspyplane = 0; - player setclientuivisibilityflag( "radar_client", 0 ); - i++; - continue; - } - else - { - if ( activeuavs > 1 ) - { - spyplaneupdatespeed = 2; - } - else - { - spyplaneupdatespeed = 1; - } - player setclientuivisibilityflag( "radar_client", 1 ); - player.hasspyplane = spyplaneupdatespeed; - } - i++; - } + if ( !isdefined( player.entnum ) ) + player.entnum = player getentitynumber(); + + activeuavs = level.activeuavs[player.entnum]; + activesatellites = level.activesatellites[player.entnum]; + + if ( activesatellites > 0 ) + { + player.hassatellite = 1; + player.hasspyplane = 0; + player setclientuivisibilityflag( "radar_client", 1 ); + continue; + } + + player.hassatellite = 0; + + if ( activeuavs == 0 && !( isdefined( player.pers["hasRadar"] ) && player.pers["hasRadar"] ) ) + { + player.hasspyplane = 0; + player setclientuivisibilityflag( "radar_client", 0 ); + continue; + } + + if ( activeuavs > 1 ) + spyplaneupdatespeed = 2; + else + spyplaneupdatespeed = 1; + + player setclientuivisibilityflag( "radar_client", 1 ); + player.hasspyplane = spyplaneupdatespeed; + } } diff --git a/Multiplayer Core/patch_mp/maps/mp/killstreaks/_straferun.gsc b/Multiplayer Core/patch_mp/maps/mp/killstreaks/_straferun.gsc index 9bbda45..4f4ff78 100644 --- a/Multiplayer Core/patch_mp/maps/mp/killstreaks/_straferun.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/killstreaks/_straferun.gsc @@ -1,1018 +1,962 @@ -#include maps/mp/killstreaks/_dogs; -#include maps/mp/_challenges; -#include maps/mp/_scoreevents; -#include maps/mp/_heatseekingmissile; -#include maps/mp/_vehicles; -#include maps/mp/killstreaks/_killstreakrules; -#include maps/mp/killstreaks/_killstreaks; -#include maps/mp/gametypes/_battlechatter_mp; -#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\gametypes\_battlechatter_mp; +#include maps\mp\killstreaks\_killstreaks; +#include maps\mp\killstreaks\_killstreakrules; +#include maps\mp\_vehicles; +#include maps\mp\_heatseekingmissile; +#include maps\mp\_scoreevents; +#include maps\mp\_challenges; +#include maps\mp\killstreaks\_dogs; init() { - level.straferunnumrockets = 7; - level.straferunrocketdelay = 0,35; - level.straferungunlookahead = 4000; - level.straferungunoffset = -800; - level.straferungunradius = 500; - level.straferunexitunits = 20000; - level.straferunmaxstrafes = 4; - level.straferunflaredelay = 2; - level.straferunshellshockduration = 2,5; - level.straferunshellshockradius = 512; - level.straferunkillsbeforeexit = 10; - level.straferunnumkillcams = 5; - level.straferunmodel = "veh_t6_air_a10f"; - level.straferunmodelenemy = "veh_t6_air_a10f_alt"; - level.straferunvehicle = "vehicle_straferun_mp"; - level.straferungunweapon = "straferun_gun_mp"; - level.straferungunsound = "wpn_a10_shot_loop_npc"; - level.straferunrocketweapon = "straferun_rockets_mp"; - level.straferunrockettags = []; - level.straferunrockettags[ 0 ] = "tag_rocket_left"; - level.straferunrockettags[ 1 ] = "tag_rocket_right"; - level.straferuncontrailfx = loadfx( "vehicle/exhaust/fx_exhaust_a10_contrail" ); - level.straferunchafffx = loadfx( "weapon/straferun/fx_straferun_chaf" ); - level.straferunexplodefx = loadfx( "vehicle/vexplosion/fx_vexplode_vtol_mp" ); - level.straferunexplodesound = "evt_helicopter_midair_exp"; - level.straferunshellshock = "straferun"; - precachemodel( level.straferunmodel ); - precachemodel( level.straferunmodelenemy ); - precachevehicle( level.straferunvehicle ); - precacheitem( level.straferungunweapon ); - precacheitem( level.straferunrocketweapon ); - precacheshellshock( level.straferunshellshock ); - maps/mp/killstreaks/_killstreaks::registerkillstreak( "straferun_mp", "straferun_mp", "killstreak_straferun", "straferun_used", ::usekillstreakstraferun, 1 ); - maps/mp/killstreaks/_killstreaks::registerkillstreakstrings( "straferun_mp", &"MP_EARNED_STRAFERUN", &"KILLSTREAK_STRAFERUN_NOT_AVAILABLE", &"MP_WAR_STRAFERUN_INBOUND", &"MP_WAR_STRAFERUN_INBOUND_NEAR_YOUR_POSITION" ); - maps/mp/killstreaks/_killstreaks::registerkillstreakdialog( "straferun_mp", "mpl_killstreak_straferun", "kls_straferun_used", "", "kls_straferun_enemy", "", "kls_straferun_ready" ); - maps/mp/killstreaks/_killstreaks::registerkillstreakdevdvar( "straferun_mp", "scr_givestraferun" ); - maps/mp/killstreaks/_killstreaks::registerkillstreakaltweapon( "straferun_mp", level.straferungunweapon ); - maps/mp/killstreaks/_killstreaks::registerkillstreakaltweapon( "straferun_mp", level.straferunrocketweapon ); - maps/mp/killstreaks/_killstreaks::setkillstreakteamkillpenaltyscale( "straferun_mp", 0 ); - createkillcams( level.straferunnumkillcams, level.straferunnumrockets ); + level.straferunnumrockets = 7; + level.straferunrocketdelay = 0.35; + level.straferungunlookahead = 4000; + level.straferungunoffset = -800; + level.straferungunradius = 500; + level.straferunexitunits = 20000; + level.straferunmaxstrafes = 4; + level.straferunflaredelay = 2; + level.straferunshellshockduration = 2.5; + level.straferunshellshockradius = 512; + level.straferunkillsbeforeexit = 10; + level.straferunnumkillcams = 5; + level.straferunmodel = "veh_t6_air_a10f"; + level.straferunmodelenemy = "veh_t6_air_a10f_alt"; + level.straferunvehicle = "vehicle_straferun_mp"; + level.straferungunweapon = "straferun_gun_mp"; + level.straferungunsound = "wpn_a10_shot_loop_npc"; + level.straferunrocketweapon = "straferun_rockets_mp"; + level.straferunrockettags = []; + level.straferunrockettags[0] = "tag_rocket_left"; + level.straferunrockettags[1] = "tag_rocket_right"; + level.straferuncontrailfx = loadfx( "vehicle/exhaust/fx_exhaust_a10_contrail" ); + level.straferunchafffx = loadfx( "weapon/straferun/fx_straferun_chaf" ); + level.straferunexplodefx = loadfx( "vehicle/vexplosion/fx_vexplode_vtol_mp" ); + level.straferunexplodesound = "evt_helicopter_midair_exp"; + level.straferunshellshock = "straferun"; + precachemodel( level.straferunmodel ); + precachemodel( level.straferunmodelenemy ); + precachevehicle( level.straferunvehicle ); + precacheitem( level.straferungunweapon ); + precacheitem( level.straferunrocketweapon ); + precacheshellshock( level.straferunshellshock ); + maps\mp\killstreaks\_killstreaks::registerkillstreak( "straferun_mp", "straferun_mp", "killstreak_straferun", "straferun_used", ::usekillstreakstraferun, 1 ); + maps\mp\killstreaks\_killstreaks::registerkillstreakstrings( "straferun_mp", &"MP_EARNED_STRAFERUN", &"KILLSTREAK_STRAFERUN_NOT_AVAILABLE", &"MP_WAR_STRAFERUN_INBOUND", &"MP_WAR_STRAFERUN_INBOUND_NEAR_YOUR_POSITION" ); + maps\mp\killstreaks\_killstreaks::registerkillstreakdialog( "straferun_mp", "mpl_killstreak_straferun", "kls_straferun_used", "", "kls_straferun_enemy", "", "kls_straferun_ready" ); + maps\mp\killstreaks\_killstreaks::registerkillstreakdevdvar( "straferun_mp", "scr_givestraferun" ); + maps\mp\killstreaks\_killstreaks::registerkillstreakaltweapon( "straferun_mp", level.straferungunweapon ); + maps\mp\killstreaks\_killstreaks::registerkillstreakaltweapon( "straferun_mp", level.straferunrocketweapon ); + maps\mp\killstreaks\_killstreaks::setkillstreakteamkillpenaltyscale( "straferun_mp", 0.0 ); + createkillcams( level.straferunnumkillcams, level.straferunnumrockets ); } playpilotdialog( dialog ) { - soundalias = level.teamprefix[ self.team ] + self.pilotvoicenumber + "_" + dialog; - while ( isDefined( self.owner ) ) - { - while ( self.owner.pilotisspeaking ) - { - while ( self.owner.pilotisspeaking ) - { - wait 0,2; - } - } - } - if ( isDefined( self.owner ) ) - { - self.owner playlocalsound( soundalias ); - self.owner.pilotisspeaking = 1; - self.owner thread waitplaybacktime( soundalias ); - self.owner waittill_any( soundalias, "death", "disconnect" ); - if ( isDefined( self.owner ) ) - { - self.owner.pilotisspeaking = 0; - } - } + soundalias = level.teamprefix[self.team] + self.pilotvoicenumber + "_" + dialog; + + if ( isdefined( self.owner ) ) + { + if ( self.owner.pilotisspeaking ) + { + while ( self.owner.pilotisspeaking ) + wait 0.2; + } + } + + if ( isdefined( self.owner ) ) + { + self.owner playlocalsound( soundalias ); + self.owner.pilotisspeaking = 1; + self.owner thread waitplaybacktime( soundalias ); + self.owner waittill_any( soundalias, "death", "disconnect" ); + + if ( isdefined( self.owner ) ) + self.owner.pilotisspeaking = 0; + } } usekillstreakstraferun( hardpointtype ) { - startnode = getvehiclenode( "warthog_start", "targetname" ); - if ( !isDefined( startnode ) ) - { + startnode = getvehiclenode( "warthog_start", "targetname" ); + + if ( !isdefined( startnode ) ) + { /# - println( "ERROR: Strafe run vehicle spline not found!" ); + println( "ERROR: Strafe run vehicle spline not found!" ); #/ - return 0; - } - killstreak_id = self maps/mp/killstreaks/_killstreakrules::killstreakstart( "straferun_mp", self.team, 0, 1 ); - if ( killstreak_id == -1 ) - { - return 0; - } - plane = spawnvehicle( level.straferunmodel, "straferun", level.straferunvehicle, startnode.origin, ( 0, 0, 0 ) ); - plane.attackers = []; - plane.attackerdata = []; - plane.attackerdamage = []; - plane.flareattackerdamage = []; - plane setvehicleteam( self.team ); - plane setenemymodel( level.straferunmodelenemy ); - plane.team = self.team; - plane makevehicleunusable(); - plane thread cleanupondeath(); - plane.health = 999999; - plane.maxhealth = 999999; - plane setowner( self ); - plane.owner = self; - plane.numstrafes = 0; - plane.killstreak_id = killstreak_id; - plane.numflares = 2; - plane.fx_flare = loadfx( "weapon/straferun/fx_straferun_chaf" ); - plane.soundmod = "straferun"; - plane setdrawinfrared( 1 ); - self.straferunkills = 0; - self.straferunbda = 0; - self.pilotisspeaking = 0; - plane.pilotvoicenumber = self.bcvoicenumber + 1; - if ( plane.pilotvoicenumber > 3 ) - { - plane.pilotvoicenumber = 0; - } - self maps/mp/killstreaks/_killstreaks::playkillstreakstartdialog( "straferun_mp", self.pers[ "team" ] ); - level.globalkillstreakscalled++; - self addweaponstat( "straferun_mp", "used", 1 ); - plane thread pilotdialogwait( "a10_used", 2,5 ); - target_set( plane, ( 0, 0, 0 ) ); - target_setturretaquire( plane, 0 ); - plane thread playcontrail(); - plane.gunsoundentity = spawn( "script_model", plane gettagorigin( "tag_flash" ) ); - plane.gunsoundentity linkto( plane, "tag_flash", ( 0, 0, 0 ), ( 0, 0, 0 ) ); - plane resetkillcams(); - plane thread watchforotherkillstreaks(); - plane thread watchforkills(); - plane thread watchdamage(); - plane thread dostraferuns(); - plane thread maps/mp/_vehicles::follow_path( startnode ); - plane thread maps/mp/_heatseekingmissile::missiletarget_proximitydetonateincomingmissile( "death" ); - plane thread watchforownerexit( self ); - return 1; + return false; + } + + killstreak_id = self maps\mp\killstreaks\_killstreakrules::killstreakstart( "straferun_mp", self.team, 0, 1 ); + + if ( killstreak_id == -1 ) + return false; + + plane = spawnvehicle( level.straferunmodel, "straferun", level.straferunvehicle, startnode.origin, ( 0, 0, 0 ) ); + plane.attackers = []; + plane.attackerdata = []; + plane.attackerdamage = []; + plane.flareattackerdamage = []; + plane setvehicleteam( self.team ); + plane setenemymodel( level.straferunmodelenemy ); + plane.team = self.team; + plane makevehicleunusable(); + plane thread cleanupondeath(); + plane.health = 999999; + plane.maxhealth = 999999; + plane setowner( self ); + plane.owner = self; + plane.numstrafes = 0; + plane.killstreak_id = killstreak_id; + plane.numflares = 2; + plane.fx_flare = loadfx( "weapon/straferun/fx_straferun_chaf" ); + plane.soundmod = "straferun"; + plane setdrawinfrared( 1 ); + self.straferunkills = 0; + self.straferunbda = 0; + self.pilotisspeaking = 0; + plane.pilotvoicenumber = self.bcvoicenumber + 1; + + if ( plane.pilotvoicenumber > 3 ) + plane.pilotvoicenumber = 0; + + self maps\mp\killstreaks\_killstreaks::playkillstreakstartdialog( "straferun_mp", self.pers["team"] ); + level.globalkillstreakscalled++; + self addweaponstat( "straferun_mp", "used", 1 ); + plane thread pilotdialogwait( "a10_used", 2.5 ); + target_set( plane, ( 0, 0, 0 ) ); + target_setturretaquire( plane, 0 ); + plane thread playcontrail(); + plane.gunsoundentity = spawn( "script_model", plane gettagorigin( "tag_flash" ) ); + plane.gunsoundentity linkto( plane, "tag_flash", ( 0, 0, 0 ), ( 0, 0, 0 ) ); + plane resetkillcams(); + plane thread watchforotherkillstreaks(); + plane thread watchforkills(); + plane thread watchdamage(); + plane thread dostraferuns(); + plane thread maps\mp\_vehicles::follow_path( startnode ); + plane thread maps\mp\_heatseekingmissile::missiletarget_proximitydetonateincomingmissile( "death" ); + plane thread watchforownerexit( self ); + return true; } playcontrail() { - self endon( "death" ); - wait 0,1; - playfxontag( level.straferuncontrailfx, self, "tag_origin" ); - self playloopsound( "veh_a10_engine_loop", 1 ); + self endon( "death" ); + wait 0.1; + playfxontag( level.straferuncontrailfx, self, "tag_origin" ); + self playloopsound( "veh_a10_engine_loop", 1 ); } cleanupondeath() { - self waittill( "death" ); - maps/mp/killstreaks/_killstreakrules::killstreakstop( "straferun_mp", self.team, self.killstreak_id ); - if ( isDefined( self.gunsoundentity ) ) - { - self.gunsoundentity stoploopsound(); - self.gunsoundentity delete(); - self.gunsoundentity = undefined; - } + self waittill( "death" ); + + maps\mp\killstreaks\_killstreakrules::killstreakstop( "straferun_mp", self.team, self.killstreak_id ); + + if ( isdefined( self.gunsoundentity ) ) + { + self.gunsoundentity stoploopsound(); + self.gunsoundentity delete(); + self.gunsoundentity = undefined; + } } watchdamage() { - self endon( "death" ); - self.maxhealth = 999999; - self.health = self.maxhealth; - self.maxhealth = 1000; - low_health = 0; - damage_taken = 0; - for ( ;; ) - { - self waittill( "damage", damage, attacker, dir, point, mod, model, tag, part, weapon, flags ); - if ( !isDefined( attacker ) || !isplayer( attacker ) ) - { - continue; - } - else - { + self endon( "death" ); + self.maxhealth = 999999; + self.health = self.maxhealth; + self.maxhealth = 1000; + low_health = 0; + damage_taken = 0; + + for (;;) + { + self waittill( "damage", damage, attacker, dir, point, mod, model, tag, part, weapon, flags ); + + if ( !isdefined( attacker ) || !isplayer( attacker ) ) + continue; /# - self.damage_debug = ( damage + " (" ) + weapon + ")"; + self.damage_debug = damage + " (" + weapon + ")"; #/ - if ( mod != "MOD_PROJECTILE" || mod == "MOD_PROJECTILE_SPLASH" && mod == "MOD_EXPLOSIVE" ) - { - damage += 1000; - } - self.attacker = attacker; - damage_taken += damage; - if ( damage_taken >= 1000 ) - { - self thread explode(); - if ( self.owner isenemyplayer( attacker ) ) - { - maps/mp/_scoreevents::processscoreevent( "destroyed_strafe_run", attacker, self.owner, weapon ); - attacker maps/mp/_challenges::addflyswatterstat( weapon, self ); - break; - } - return; - } - } - } + if ( mod == "MOD_PROJECTILE" || mod == "MOD_PROJECTILE_SPLASH" || mod == "MOD_EXPLOSIVE" ) + damage += 1000; + + self.attacker = attacker; + damage_taken += damage; + + if ( damage_taken >= 1000 ) + { + self thread explode(); + + if ( self.owner isenemyplayer( attacker ) ) + { + maps\mp\_scoreevents::processscoreevent( "destroyed_strafe_run", attacker, self.owner, weapon ); + attacker maps\mp\_challenges::addflyswatterstat( weapon, self ); + } + else + { + + } + + return; + } + } } watchforotherkillstreaks() { - self endon( "death" ); - for ( ;; ) - { - level waittill( "killstreak_started", hardpointtype, teamname, attacker ); - if ( !isDefined( self.owner ) ) - { - self thread explode(); - return; - } - if ( hardpointtype == "emp_mp" ) - { - if ( self.owner isenemyplayer( attacker ) ) - { - self thread explode(); - maps/mp/_scoreevents::processscoreevent( "destroyed_strafe_run", attacker, self.owner, hardpointtype ); - attacker maps/mp/_challenges::addflyswatterstat( hardpointtype, self ); - return; - } - continue; - } - else - { - if ( hardpointtype == "missile_swarm_mp" ) - { - if ( self.owner isenemyplayer( attacker ) ) - { - self.leavenexttime = 1; - } - } - } - } + self endon( "death" ); + + for (;;) + { + level waittill( "killstreak_started", hardpointtype, teamname, attacker ); + + if ( !isdefined( self.owner ) ) + { + self thread explode(); + return; + } + + if ( hardpointtype == "emp_mp" ) + { + if ( self.owner isenemyplayer( attacker ) ) + { + self thread explode(); + maps\mp\_scoreevents::processscoreevent( "destroyed_strafe_run", attacker, self.owner, hardpointtype ); + attacker maps\mp\_challenges::addflyswatterstat( hardpointtype, self ); + return; + } + + continue; + } + + if ( hardpointtype == "missile_swarm_mp" ) + { + if ( self.owner isenemyplayer( attacker ) ) + self.leavenexttime = 1; + } + } } watchforkills() { - self endon( "death" ); - for ( ;; ) - { - self waittill( "killed", player ); - if ( isplayer( player ) ) - { - break; - } - } + self endon( "death" ); + + for (;;) + { + self waittill( "killed", player ); + + if ( isplayer( player ) ) + continue; + } } watchforownerexit( owner ) { - self endon( "death" ); - owner waittill_any( "disconnect", "joined_team", "joined_spectator" ); - self.leavenexttime = 1; + self endon( "death" ); + owner waittill_any( "disconnect", "joined_team", "joined_spectator" ); + self.leavenexttime = 1; } addstraferunkill() { - if ( !isDefined( self.straferunkills ) ) - { - self.straferunkills = 0; - } - self.straferunkills++; + if ( !isdefined( self.straferunkills ) ) + self.straferunkills = 0; + + self.straferunkills++; } dostraferuns() { - self endon( "death" ); - for ( ;; ) - { - self waittill( "noteworthy", noteworthy, noteworthynode ); - if ( noteworthy == "strafe_start" ) - { - self.straferungunlookahead = level.straferungunlookahead; - self.straferungunradius = level.straferungunradius; - self.straferungunoffset = level.straferungunoffset; + self endon( "death" ); + + for (;;) + { + self waittill( "noteworthy", noteworthy, noteworthynode ); + + if ( noteworthy == "strafe_start" ) + { + self.straferungunlookahead = level.straferungunlookahead; + self.straferungunradius = level.straferungunradius; + self.straferungunoffset = level.straferungunoffset; /# - self.straferungunlookahead = getdvarintdefault( 3757700558, level.straferungunlookahead ); - self.straferungunradius = getdvarintdefault( 1960308846, level.straferungunradius ); - self.straferungunoffset = getdvarintdefault( 1848914509, level.straferungunoffset ); + self.straferungunlookahead = getdvarintdefault( _hash_DFF9F5CE, level.straferungunlookahead ); + self.straferungunradius = getdvarintdefault( _hash_74D7F06E, level.straferungunradius ); + self.straferungunoffset = getdvarintdefault( _hash_6E34324D, level.straferungunoffset ); #/ - if ( isDefined( noteworthynode ) ) - { - if ( isDefined( noteworthynode.script_parameters ) ) - { - self.straferungunlookahead = float( noteworthynode.script_parameters ); - } - if ( isDefined( noteworthynode.script_radius ) ) - { - self.straferungunradius = float( noteworthynode.script_radius ); - } - if ( isDefined( noteworthynode.script_float ) ) - { - self.straferungunoffset = float( noteworthynode.script_float ); - } - } - if ( isDefined( self.owner ) ) - { - self thread startstrafe(); - } - continue; - } - else if ( noteworthy == "strafe_stop" ) - { - self stopstrafe(); - continue; - } - else if ( noteworthy == "strafe_leave" ) - { - if ( self shouldleavemap() ) - { - self thread leavemap(); - self thread pilotdialogwait( "a10_leave", 5 ); - break; - } - else - { - self thread pilotdialogwait( "a10_strafe", 3 ); - } - } - } + if ( isdefined( noteworthynode ) ) + { + if ( isdefined( noteworthynode.script_parameters ) ) + self.straferungunlookahead = float( noteworthynode.script_parameters ); + + if ( isdefined( noteworthynode.script_radius ) ) + self.straferungunradius = float( noteworthynode.script_radius ); + + if ( isdefined( noteworthynode.script_float ) ) + self.straferungunoffset = float( noteworthynode.script_float ); + } + + if ( isdefined( self.owner ) ) + self thread startstrafe(); + + continue; + } + + if ( noteworthy == "strafe_stop" ) + { + self stopstrafe(); + continue; + } + + if ( noteworthy == "strafe_leave" ) + { + if ( self shouldleavemap() ) + { + self thread leavemap(); + self thread pilotdialogwait( "a10_leave", 5 ); + continue; + } + + self thread pilotdialogwait( "a10_strafe", 3 ); + } + } } fireflares() { - self endon( "death" ); - self endon( "strafe_start" ); - wait 0,1; - for ( ;; ) - { - chaff_fx = spawn( "script_model", self.origin ); - chaff_fx.angles = vectorScale( ( 0, 0, 0 ), 180 ); - chaff_fx setmodel( "tag_origin" ); - chaff_fx linkto( self, "tag_origin", ( 0, 0, 0 ), ( 0, 0, 0 ) ); - wait 0,1; - playfxontag( level.straferunchafffx, chaff_fx, "tag_origin" ); - chaff_fx playsound( "wpn_a10_drop_chaff" ); - chaff_fx thread deleteaftertimethread( level.straferunflaredelay ); - wait level.straferunflaredelay; - } + self endon( "death" ); + self endon( "strafe_start" ); + wait 0.1; + + for (;;) + { + chaff_fx = spawn( "script_model", self.origin ); + chaff_fx.angles = vectorscale( ( 0, 1, 0 ), 180.0 ); + chaff_fx setmodel( "tag_origin" ); + chaff_fx linkto( self, "tag_origin", ( 0, 0, 0 ), ( 0, 0, 0 ) ); + wait 0.1; + playfxontag( level.straferunchafffx, chaff_fx, "tag_origin" ); + chaff_fx playsound( "wpn_a10_drop_chaff" ); + chaff_fx thread deleteaftertimethread( level.straferunflaredelay ); + wait( level.straferunflaredelay ); + } } startstrafe() { - self endon( "death" ); - self endon( "strafe_stop" ); - if ( isDefined( self.strafing ) ) - { - iprintlnbold( "TRYING TO STRAFE WHEN ALREADY STRAFING!\n" ); - return; - } - self.strafing = 1; - self thread pilotdialogwait( "kls_hit", 3,5 ); - if ( self.numstrafes == 0 ) - { - self firststrafe(); - } - self thread firerockets(); - self thread startstrafekillcams(); - count = 0; - weaponshoottime = weaponfiretime( level.straferungunweapon ); - for ( ;; ) - { - gunorigin = self gettagorigin( "tag_flash" ); - gunorigin += ( 0, 0, self.straferungunoffset ); - forward = anglesToForward( self.angles ); - forwardnoz = vectornormalize( ( forward[ 0 ], forward[ 1 ], 0 ) ); - right = vectorcross( forwardnoz, ( 0, 0, 0 ) ); - perfectattackstartvector = gunorigin + vectorScale( forwardnoz, self.straferungunlookahead ); - attackstartvector = perfectattackstartvector + vectorScale( right, randomfloatrange( 0 - self.straferungunradius, self.straferungunradius ) ); - trace = bullettrace( attackstartvector, ( attackstartvector[ 0 ], attackstartvector[ 1 ], -500 ), 0, self, 0, 1 ); - self setturrettargetvec( trace[ "position" ] ); - self fireweapon( "tag_flash" ); - self.gunsoundentity playloopsound( level.straferungunsound ); - self shellshockplayers( trace[ "position" ] ); + self endon( "death" ); + self endon( "strafe_stop" ); + + if ( isdefined( self.strafing ) ) + { + iprintlnbold( "TRYING TO STRAFE WHEN ALREADY STRAFING!\n" ); + return; + } + + self.strafing = 1; + self thread pilotdialogwait( "kls_hit", 3.5 ); + + if ( self.numstrafes == 0 ) + self firststrafe(); + + self thread firerockets(); + self thread startstrafekillcams(); + count = 0; + weaponshoottime = weaponfiretime( level.straferungunweapon ); + + for (;;) + { + gunorigin = self gettagorigin( "tag_flash" ); + gunorigin += ( 0, 0, self.straferungunoffset ); + forward = anglestoforward( self.angles ); + forwardnoz = vectornormalize( ( forward[0], forward[1], 0 ) ); + right = vectorcross( forwardnoz, ( 0, 0, 1 ) ); + perfectattackstartvector = gunorigin + vectorscale( forwardnoz, self.straferungunlookahead ); + attackstartvector = perfectattackstartvector + vectorscale( right, randomfloatrange( 0 - self.straferungunradius, self.straferungunradius ) ); + trace = bullettrace( attackstartvector, ( attackstartvector[0], attackstartvector[1], -500 ), 0, self, 0, 1 ); + self setturrettargetvec( trace["position"] ); + self fireweapon( "tag_flash" ); + self.gunsoundentity playloopsound( level.straferungunsound ); + self shellshockplayers( trace["position"] ); /# - if ( getdvarintdefault( 3044406805, 0 ) ) - { - time = 300; - debug_line( attackstartvector, trace[ "position" ] - vectorScale( ( 0, 0, 0 ), 20 ), ( 0, 0, 0 ), time, 0 ); - if ( ( count % 30 ) == 0 ) - { - trace = bullettrace( perfectattackstartvector, ( perfectattackstartvector[ 0 ], perfectattackstartvector[ 1 ], -100000 ), 0, self, 0, 1 ); - debug_line( trace[ "position" ] + vectorScale( ( 0, 0, 0 ), 20 ), trace[ "position" ] - vectorScale( ( 0, 0, 0 ), 20 ), ( 0, 0, 0 ), time, 0 ); + if ( getdvarintdefault( _hash_B575F615, 0 ) ) + { + time = 300; + debug_line( attackstartvector, trace["position"] - vectorscale( ( 0, 0, 1 ), 20.0 ), ( 1, 0, 0 ), time, 0 ); + + if ( count % 30 == 0 ) + { + trace = bullettrace( perfectattackstartvector, ( perfectattackstartvector[0], perfectattackstartvector[1], -100000 ), 0, self, 0, 1 ); + debug_line( trace["position"] + vectorscale( ( 0, 0, 1 ), 20.0 ), trace["position"] - vectorscale( ( 0, 0, 1 ), 20.0 ), ( 0, 0, 1 ), time, 0 ); + } + } #/ - } - } - count++; - wait weaponshoottime; - } + count++; + wait( weaponshoottime ); + } } firststrafe() { + } firerockets() { - self notify( "firing_rockets" ); - self endon( "death" ); - self endon( "strafe_stop" ); - self endon( "firing_rockets" ); - self.owner endon( "disconnect" ); - forward = anglesToForward( self.angles ); - self.firedrockettargets = []; - rocketindex = 0; - while ( rocketindex < level.straferunnumrockets ) - { - rockettag = level.straferunrockettags[ rocketindex % level.straferunrockettags.size ]; - targets = getvalidtargets(); - rocketorigin = self gettagorigin( rockettag ); - targetorigin = rocketorigin + ( forward * 10000 ); - if ( targets.size > 0 ) - { - selectedtarget = undefined; - _a494 = targets; - _k494 = getFirstArrayKey( _a494 ); - while ( isDefined( _k494 ) ) - { - target = _a494[ _k494 ]; - alreadyattacked = 0; - _a497 = self.firedrockettargets; - _k497 = getFirstArrayKey( _a497 ); - while ( isDefined( _k497 ) ) - { - oldtarget = _a497[ _k497 ]; - if ( oldtarget == target ) - { - alreadyattacked = 1; - break; - } - else - { - _k497 = getNextArrayKey( _a497, _k497 ); - } - } - if ( !alreadyattacked ) - { - selectedtarget = target; - break; - } - else - { - _k494 = getNextArrayKey( _a494, _k494 ); - } - } - if ( isDefined( selectedtarget ) ) - { - self.firedrockettargets[ self.firedrockettargets.size ] = selectedtarget; - targetorigin = deadrecontargetorigin( rocketorigin, selectedtarget ); - } - } - rocketorigin = self gettagorigin( rockettag ); - rocket = magicbullet( level.straferunrocketweapon, rocketorigin, rocketorigin + forward, self.owner ); - if ( isDefined( selectedtarget ) ) - { - rocket missile_settarget( selectedtarget, ( 0, 0, 0 ) ); - } - rocket.soundmod = "straferun"; - rocket attachkillcamtorocket( level.straferunkillcams.rockets[ rocketindex ], selectedtarget, targetorigin ); + self notify( "firing_rockets" ); + self endon( "death" ); + self endon( "strafe_stop" ); + self endon( "firing_rockets" ); + self.owner endon( "disconnect" ); + forward = anglestoforward( self.angles ); + self.firedrockettargets = []; + + for ( rocketindex = 0; rocketindex < level.straferunnumrockets; rocketindex++ ) + { + rockettag = level.straferunrockettags[rocketindex % level.straferunrockettags.size]; + targets = getvalidtargets(); + rocketorigin = self gettagorigin( rockettag ); + targetorigin = rocketorigin + forward * 10000; + + if ( targets.size > 0 ) + { + selectedtarget = undefined; + + foreach ( target in targets ) + { + alreadyattacked = 0; + + foreach ( oldtarget in self.firedrockettargets ) + { + if ( oldtarget == target ) + { + alreadyattacked = 1; + break; + } + } + + if ( !alreadyattacked ) + { + selectedtarget = target; + break; + } + } + + if ( isdefined( selectedtarget ) ) + { + self.firedrockettargets[self.firedrockettargets.size] = selectedtarget; + targetorigin = deadrecontargetorigin( rocketorigin, selectedtarget ); + } + } + + rocketorigin = self gettagorigin( rockettag ); + rocket = magicbullet( level.straferunrocketweapon, rocketorigin, rocketorigin + forward, self.owner ); + + if ( isdefined( selectedtarget ) ) + rocket missile_settarget( selectedtarget, ( 0, 0, 0 ) ); + + rocket.soundmod = "straferun"; + rocket attachkillcamtorocket( level.straferunkillcams.rockets[rocketindex], selectedtarget, targetorigin ); /# - if ( getdvarintdefault( 2442250922, 0 ) ) - { - rocket thread debug_draw_bomb_path( undefined, vectorScale( ( 0, 0, 0 ), 0,5 ), 400 ); + if ( getdvarintdefault( _hash_9191CAAA, 0 ) ) + rocket thread debug_draw_bomb_path( undefined, vectorscale( ( 0, 1, 0 ), 0.5 ), 400 ); #/ - } - wait level.straferunrocketdelay; - rocketindex++; - } + wait( level.straferunrocketdelay ); + } } stopstrafe() { - self notify( "strafe_stop" ); - self.strafing = undefined; - self thread resetkillcams( 3 ); - self clearturrettarget(); - owner = self.owner; - if ( owner.straferunbda == 0 ) - { - bdadialog = "kls_killn"; - } - if ( owner.straferunbda == 1 ) - { - bdadialog = "kls_kill1"; - } - if ( owner.straferunbda == 2 ) - { - bdadialog = "kls_kill2"; - } - if ( owner.straferunbda == 3 ) - { - bdadialog = "kls_kill3"; - } - if ( owner.straferunbda > 3 ) - { - bdadialog = "kls_killm"; - } - if ( isDefined( bdadialog ) ) - { - self thread pilotdialogwait( bdadialog, 3,5 ); - } - owner.straferunbda = 0; - self.gunsoundentity stoploopsound(); - self.gunsoundentity playsound( "wpn_a10_shot_decay_npc" ); - self.numstrafes++; + self notify( "strafe_stop" ); + self.strafing = undefined; + self thread resetkillcams( 3 ); + self clearturrettarget(); + owner = self.owner; + + if ( owner.straferunbda == 0 ) + bdadialog = "kls_killn"; + + if ( owner.straferunbda == 1 ) + bdadialog = "kls_kill1"; + + if ( owner.straferunbda == 2 ) + bdadialog = "kls_kill2"; + + if ( owner.straferunbda == 3 ) + bdadialog = "kls_kill3"; + + if ( owner.straferunbda > 3 ) + bdadialog = "kls_killm"; + + if ( isdefined( bdadialog ) ) + self thread pilotdialogwait( bdadialog, 3.5 ); + + owner.straferunbda = 0; + self.gunsoundentity stoploopsound(); + self.gunsoundentity playsound( "wpn_a10_shot_decay_npc" ); + self.numstrafes++; } pilotdialogwait( dialog, time ) { - self endon( "death" ); - if ( isDefined( time ) ) - { - wait time; - } - playpilotdialog( dialog ); + self endon( "death" ); + + if ( isdefined( time ) ) + wait( time ); + + playpilotdialog( dialog ); } shouldleavemap() { - if ( isDefined( self.leavenexttime ) && self.leavenexttime ) - { - return 1; - } - if ( self.numstrafes >= level.straferunmaxstrafes ) - { - return 1; - } - if ( self.owner.straferunkills >= level.straferunkillsbeforeexit ) - { - return 1; - } - return 0; + if ( isdefined( self.leavenexttime ) && self.leavenexttime ) + return true; + + if ( self.numstrafes >= level.straferunmaxstrafes ) + return true; + + if ( self.owner.straferunkills >= level.straferunkillsbeforeexit ) + return true; + + return false; } leavemap() { - self unlinkkillcams(); - exitorigin = self.origin + vectorScale( anglesToForward( self.angles ), level.straferunexitunits ); - self setyawspeed( 5, 999, 999 ); - self setvehgoalpos( exitorigin, 1 ); - wait 5; - if ( isDefined( self ) ) - { - self delete(); - } + self unlinkkillcams(); + exitorigin = self.origin + vectorscale( anglestoforward( self.angles ), level.straferunexitunits ); + self setyawspeed( 5, 999, 999 ); + self setvehgoalpos( exitorigin, 1 ); + wait 5; + + if ( isdefined( self ) ) + self delete(); } explode() { - self endon( "delete" ); - forward = ( self.origin + vectorScale( ( 0, 0, 0 ), 100 ) ) - self.origin; - playfx( level.straferunexplodefx, self.origin, forward ); - self playsound( level.straferunexplodesound ); - wait 0,1; - if ( isDefined( self ) ) - { - self delete(); - } + self endon( "delete" ); + forward = self.origin + vectorscale( ( 0, 0, 1 ), 100.0 ) - self.origin; + playfx( level.straferunexplodefx, self.origin, forward ); + self playsound( level.straferunexplodesound ); + wait 0.1; + + if ( isdefined( self ) ) + self delete(); } cantargetentity( entity ) { - heli_centroid = self.origin + vectorScale( ( 0, 0, 0 ), 160 ); - heli_forward_norm = anglesToForward( self.angles ); - heli_turret_point = heli_centroid + ( 144 * heli_forward_norm ); - visible_amount = entity sightconetrace( heli_turret_point, self ); - if ( visible_amount < level.heli_target_recognition ) - { - return 0; - } - return 1; + heli_centroid = self.origin + vectorscale( ( 0, 0, -1 ), 160.0 ); + heli_forward_norm = anglestoforward( self.angles ); + heli_turret_point = heli_centroid + 144 * heli_forward_norm; + visible_amount = entity sightconetrace( heli_turret_point, self ); + + if ( visible_amount < level.heli_target_recognition ) + return false; + + return true; } cantargetplayer( player ) { - if ( !isalive( player ) || player.sessionstate != "playing" ) - { - return 0; - } - if ( player == self.owner ) - { - return 0; - } - if ( player cantargetplayerwithspecialty() == 0 ) - { - return 0; - } - if ( !isDefined( player.team ) ) - { - return 0; - } - if ( level.teambased && player.team == self.team ) - { - return 0; - } - if ( player.team == "spectator" ) - { - return 0; - } - if ( isDefined( player.spawntime ) && ( ( getTime() - player.spawntime ) / 1000 ) <= level.heli_target_spawnprotection ) - { - return 0; - } - if ( !targetinfrontofplane( player ) ) - { - return 0; - } - if ( player isinmovemode( "noclip" ) ) - { - return 0; - } - return cantargetentity( player ); + if ( !isalive( player ) || player.sessionstate != "playing" ) + return 0; + + if ( player == self.owner ) + return 0; + + if ( player cantargetplayerwithspecialty() == 0 ) + return 0; + + if ( !isdefined( player.team ) ) + return 0; + + if ( level.teambased && player.team == self.team ) + return 0; + + if ( player.team == "spectator" ) + return 0; + + if ( isdefined( player.spawntime ) && ( gettime() - player.spawntime ) / 1000 <= level.heli_target_spawnprotection ) + return 0; + + if ( !targetinfrontofplane( player ) ) + return 0; + + if ( player isinmovemode( "noclip" ) ) + return 0; + + return cantargetentity( player ); } cantargetactor( actor ) { - if ( !isDefined( actor ) ) - { - return 0; - } - if ( level.teambased && actor.aiteam == self.team ) - { - return 0; - } - if ( isDefined( actor.script_owner ) && self.owner == actor.script_owner ) - { - return 0; - } - if ( !targetinfrontofplane( actor ) ) - { - return 0; - } - return cantargetentity( actor ); + if ( !isdefined( actor ) ) + return 0; + + if ( level.teambased && actor.aiteam == self.team ) + return 0; + + if ( isdefined( actor.script_owner ) && self.owner == actor.script_owner ) + return 0; + + if ( !targetinfrontofplane( actor ) ) + return 0; + + return cantargetentity( actor ); } targetinfrontofplane( target ) { - forward_dir = anglesToForward( self.angles ); - target_delta = vectornormalize( target.origin - self.origin ); - dot = vectordot( forward_dir, target_delta ); - if ( dot < 0,5 ) - { - return 1; - } - return 1; + forward_dir = anglestoforward( self.angles ); + target_delta = vectornormalize( target.origin - self.origin ); + dot = vectordot( forward_dir, target_delta ); + + if ( dot < 0.5 ) + return true; + + return true; } getvalidtargets() { - targets = []; - _a770 = level.players; - _k770 = getFirstArrayKey( _a770 ); - while ( isDefined( _k770 ) ) - { - player = _a770[ _k770 ]; - if ( self cantargetplayer( player ) ) - { - if ( isDefined( player ) ) - { - targets[ targets.size ] = player; - } - } - _k770 = getNextArrayKey( _a770, _k770 ); - } - dogs = maps/mp/killstreaks/_dogs::dog_manager_get_dogs(); - _a782 = dogs; - _k782 = getFirstArrayKey( _a782 ); - while ( isDefined( _k782 ) ) - { - dog = _a782[ _k782 ]; - if ( self cantargetactor( dog ) ) - { - targets[ targets.size ] = dog; - } - _k782 = getNextArrayKey( _a782, _k782 ); - } - tanks = getentarray( "talon", "targetname" ); - _a792 = tanks; - _k792 = getFirstArrayKey( _a792 ); - while ( isDefined( _k792 ) ) - { - tank = _a792[ _k792 ]; - if ( self cantargetactor( tank ) ) - { - targets[ targets.size ] = tank; - } - _k792 = getNextArrayKey( _a792, _k792 ); - } - return targets; + targets = []; + + foreach ( player in level.players ) + { + if ( self cantargetplayer( player ) ) + { + if ( isdefined( player ) ) + targets[targets.size] = player; + } + } + + dogs = maps\mp\killstreaks\_dogs::dog_manager_get_dogs(); + + foreach ( dog in dogs ) + { + if ( self cantargetactor( dog ) ) + targets[targets.size] = dog; + } + + tanks = getentarray( "talon", "targetname" ); + + foreach ( tank in tanks ) + { + if ( self cantargetactor( tank ) ) + targets[targets.size] = tank; + } + + return targets; } deadrecontargetorigin( rocket_start, target ) { - target_velocity = target getvelocity(); - missile_speed = 7000; - target_delta = target.origin - rocket_start; - target_dist = length( target_delta ); - time_to_target = target_dist / missile_speed; - return target.origin + ( target_velocity * time_to_target ); + target_velocity = target getvelocity(); + missile_speed = 7000; + target_delta = target.origin - rocket_start; + target_dist = length( target_delta ); + time_to_target = target_dist / missile_speed; + return target.origin + target_velocity * time_to_target; } shellshockplayers( origin ) { - _a821 = level.players; - _k821 = getFirstArrayKey( _a821 ); - while ( isDefined( _k821 ) ) - { - player = _a821[ _k821 ]; - if ( !isalive( player ) ) - { - } - else if ( player == self.owner ) - { - } - else if ( !isDefined( player.team ) ) - { - } - else if ( level.teambased && player.team == self.team ) - { - } - else - { - if ( distancesquared( player.origin, origin ) <= ( level.straferunshellshockradius * level.straferunshellshockradius ) ) - { - player thread straferunshellshock(); - } - } - _k821 = getNextArrayKey( _a821, _k821 ); - } + foreach ( player in level.players ) + { + if ( !isalive( player ) ) + continue; + + if ( player == self.owner ) + continue; + + if ( !isdefined( player.team ) ) + continue; + + if ( level.teambased && player.team == self.team ) + continue; + + if ( distancesquared( player.origin, origin ) <= level.straferunshellshockradius * level.straferunshellshockradius ) + player thread straferunshellshock(); + } } straferunshellshock() { - self endon( "disconnect" ); - if ( isDefined( self.beingstraferunshellshocked ) && self.beingstraferunshellshocked ) - { - return; - } - self.beingstraferunshellshocked = 1; - self shellshock( level.straferunshellshock, level.straferunshellshockduration ); - wait ( level.straferunshellshockduration + 1 ); - self.beingstraferunshellshocked = 0; + self endon( "disconnect" ); + + if ( isdefined( self.beingstraferunshellshocked ) && self.beingstraferunshellshocked ) + return; + + self.beingstraferunshellshocked = 1; + self shellshock( level.straferunshellshock, level.straferunshellshockduration ); + wait( level.straferunshellshockduration + 1 ); + self.beingstraferunshellshocked = 0; } createkillcams( numkillcams, numrockets ) { - while ( !isDefined( level.straferunkillcams ) ) - { - level.straferunkillcams = spawnstruct(); - level.straferunkillcams.rockets = []; - i = 0; - while ( i < numrockets ) - { - level.straferunkillcams.rockets[ level.straferunkillcams.rockets.size ] = createkillcament(); - i++; - } - level.straferunkillcams.strafes = []; - i = 0; - while ( i < numkillcams ) - { - level.straferunkillcams.strafes[ level.straferunkillcams.strafes.size ] = createkillcament(); + if ( !isdefined( level.straferunkillcams ) ) + { + level.straferunkillcams = spawnstruct(); + level.straferunkillcams.rockets = []; + + for ( i = 0; i < numrockets; i++ ) + level.straferunkillcams.rockets[level.straferunkillcams.rockets.size] = createkillcament(); + + level.straferunkillcams.strafes = []; + + for ( i = 0; i < numkillcams; i++ ) + { + level.straferunkillcams.strafes[level.straferunkillcams.strafes.size] = createkillcament(); /# - if ( getdvarintdefault( 2442250922, 0 ) ) - { - level.straferunkillcams.strafes[ i ] thread debug_draw_bomb_path( undefined, vectorScale( ( 0, 0, 0 ), 0,5 ), 200 ); + if ( getdvarintdefault( _hash_9191CAAA, 0 ) ) + level.straferunkillcams.strafes[i] thread debug_draw_bomb_path( undefined, vectorscale( ( 0, 0, 1 ), 0.5 ), 200 ); #/ - } - i++; - } - } + } + } } resetkillcams( time ) { - self endon( "death" ); - if ( isDefined( time ) ) - { - wait time; - } - i = 0; - while ( i < level.straferunkillcams.rockets.size ) - { - level.straferunkillcams.rockets[ i ] resetrocketkillcament( self, i ); - i++; - } - i = 0; - while ( i < level.straferunkillcams.strafes.size ) - { - level.straferunkillcams.strafes[ i ] resetkillcament( self ); - i++; - } + self endon( "death" ); + + if ( isdefined( time ) ) + wait( time ); + + for ( i = 0; i < level.straferunkillcams.rockets.size; i++ ) + level.straferunkillcams.rockets[i] resetrocketkillcament( self, i ); + + for ( i = 0; i < level.straferunkillcams.strafes.size; i++ ) + level.straferunkillcams.strafes[i] resetkillcament( self ); } unlinkkillcams() { - i = 0; - while ( i < level.straferunkillcams.rockets.size ) - { - level.straferunkillcams.rockets[ i ] unlink(); - i++; - } - i = 0; - while ( i < level.straferunkillcams.strafes.size ) - { - level.straferunkillcams.strafes[ i ] unlink(); - i++; - } + for ( i = 0; i < level.straferunkillcams.rockets.size; i++ ) + level.straferunkillcams.rockets[i] unlink(); + + for ( i = 0; i < level.straferunkillcams.strafes.size; i++ ) + level.straferunkillcams.strafes[i] unlink(); } createkillcament() { - killcament = spawn( "script_model", ( 0, 0, 0 ) ); - killcament setfovforkillcam( 25 ); - return killcament; + killcament = spawn( "script_model", ( 0, 0, 0 ) ); + killcament setfovforkillcam( 25 ); + return killcament; } resetkillcament( parent ) { - self notify( "reset" ); - parent endon( "death" ); - offset_x = getdvarintdefault( 862326232, -3000 ); - offset_y = getdvarintdefault( 862326233, 0 ); - offset_z = getdvarintdefault( 862326234, 740 ); - self linkto( parent, "tag_origin", ( offset_x, offset_y, offset_z ), vectorScale( ( 0, 0, 0 ), 10 ) ); - self thread unlinkwhenparentdies( parent ); + self notify( "reset" ); + parent endon( "death" ); + offset_x = getdvarintdefault( _hash_33660DD8, -3000 ); + offset_y = getdvarintdefault( _hash_33660DD9, 0 ); + offset_z = getdvarintdefault( _hash_33660DDA, 740 ); + self linkto( parent, "tag_origin", ( offset_x, offset_y, offset_z ), vectorscale( ( 1, 0, 0 ), 10.0 ) ); + self thread unlinkwhenparentdies( parent ); } resetrocketkillcament( parent, rocketindex ) { - self notify( "reset" ); - parent endon( "death" ); - offset_x = getdvarintdefault( 862326232, -3000 ); - offset_y = getdvarintdefault( 862326233, 0 ); - offset_z = getdvarintdefault( 862326234, 740 ); - rockettag = level.straferunrockettags[ rocketindex % level.straferunrockettags.size ]; - self linkto( parent, rockettag, ( offset_x, offset_y, offset_z ), vectorScale( ( 0, 0, 0 ), 10 ) ); - self thread unlinkwhenparentdies( parent ); + self notify( "reset" ); + parent endon( "death" ); + offset_x = getdvarintdefault( _hash_33660DD8, -3000 ); + offset_y = getdvarintdefault( _hash_33660DD9, 0 ); + offset_z = getdvarintdefault( _hash_33660DDA, 740 ); + rockettag = level.straferunrockettags[rocketindex % level.straferunrockettags.size]; + self linkto( parent, rockettag, ( offset_x, offset_y, offset_z ), vectorscale( ( 1, 0, 0 ), 10.0 ) ); + self thread unlinkwhenparentdies( parent ); } deletewhenparentdies( parent ) { - parent waittill( "death" ); - self delete(); + parent waittill( "death" ); + + self delete(); } unlinkwhenparentdies( parent ) { - self endon( "reset" ); - self endon( "unlink" ); - parent waittill( "death" ); - self unlink(); + self endon( "reset" ); + self endon( "unlink" ); + + parent waittill( "death" ); + + self unlink(); } attachkillcamtorocket( killcament, selectedtarget, targetorigin ) { - offset_x = getdvarintdefault( 562767152, -400 ); - offset_y = getdvarintdefault( 562767153, 0 ); - offset_z = getdvarintdefault( 562767154, 110 ); - self.killcament = killcament; - forward = vectorScale( anglesToForward( self.angles ), offset_x ); - right = vectorScale( anglesToRight( self.angles ), offset_y ); - up = vectorScale( anglesToUp( self.angles ), offset_z ); - killcament unlink(); - killcament.angles = ( 0, 0, 0 ); - killcament.origin = self.origin; - killcament linkto( self, "", ( offset_x, offset_y, offset_z ), vectorScale( ( 0, 0, 0 ), 9 ) ); - killcament thread unlinkwhenclose( selectedtarget, targetorigin, self ); + offset_x = getdvarintdefault( _hash_218B2530, -400 ); + offset_y = getdvarintdefault( _hash_218B2531, 0 ); + offset_z = getdvarintdefault( _hash_218B2532, 110 ); + self.killcament = killcament; + forward = vectorscale( anglestoforward( self.angles ), offset_x ); + right = vectorscale( anglestoright( self.angles ), offset_y ); + up = vectorscale( anglestoup( self.angles ), offset_z ); + killcament unlink(); + killcament.angles = ( 0, 0, 0 ); + killcament.origin = self.origin; + killcament linkto( self, "", ( offset_x, offset_y, offset_z ), vectorscale( ( 1, 0, 0 ), 9.0 ) ); + killcament thread unlinkwhenclose( selectedtarget, targetorigin, self ); } unlinkwhenclose( selectedtarget, targetorigin, plane ) { - plane endon( "death" ); - self notify( "unlink_when_close" ); - self endon( "unlink_when_close" ); - distsqr = 1000000; - while ( 1 ) - { - if ( isDefined( selectedtarget ) ) - { - if ( distancesquared( self.origin, selectedtarget.origin ) < distsqr ) - { - self unlink(); - self.angles = ( 0, 0, 0 ); - return; - } - } - else - { - if ( distancesquared( self.origin, targetorigin ) < distsqr ) - { - self unlink(); - self.angles = ( 0, 0, 0 ); - return; - } - } - wait 0,1; - } + plane endon( "death" ); + self notify( "unlink_when_close" ); + self endon( "unlink_when_close" ); + distsqr = 1000000; + + while ( true ) + { + if ( isdefined( selectedtarget ) ) + { + if ( distancesquared( self.origin, selectedtarget.origin ) < distsqr ) + { + self unlink(); + self.angles = ( 0, 0, 0 ); + return; + } + } + else if ( distancesquared( self.origin, targetorigin ) < distsqr ) + { + self unlink(); + self.angles = ( 0, 0, 0 ); + return; + } + + wait 0.1; + } } getlookaheadorigin( previous_origin, next_origin, lookahead ) { - delta = next_origin - previous_origin; - forwardnoz = vectornormalize( ( delta[ 0 ], delta[ 1 ], 0 ) ); - origin = next_origin + vectorScale( forwardnoz, lookahead ); - return origin; + delta = next_origin - previous_origin; + forwardnoz = vectornormalize( ( delta[0], delta[1], 0 ) ); + origin = next_origin + vectorscale( forwardnoz, lookahead ); + return origin; } strafekillcam( parent, node, distance ) { - parent endon( "death" ); - self endon( "reset" ); - wait 0,05; - self notify( "unlink" ); - self unlink(); - self.angles = ( 0, 0, 0 ); - accel_time = 0,2; - speed = 20000; - start_height_offset = -800; - stop_height = level.mapcenter[ 2 ] - 500; - start_origin_struct = getoriginalongstrafepath( node, self.origin, distance ); - start_origin = start_origin_struct.origin; - node = start_origin_struct.node; - previous_origin = self.origin; - start_origin = getlookaheadorigin( previous_origin, start_origin, parent.straferungunlookahead + 1000 ); - trace = bullettrace( ( start_origin[ 0 ], start_origin[ 1 ], start_origin[ 2 ] + start_height_offset ), ( start_origin[ 0 ], start_origin[ 1 ], stop_height ), 0, parent, 0, 1 ); - pathheight = trace[ "position" ][ 2 ]; - self killcammoveto( trace[ "position" ], speed, accel_time, pathheight ); - speed = 500; - while ( isDefined( node ) ) - { - previous_origin = node.origin; - node = getvehiclenode( node.target, "targetname" ); - start_origin = getlookaheadorigin( previous_origin, node.origin, parent.straferungunlookahead + 1000 ); - trace = bullettrace( ( start_origin[ 0 ], start_origin[ 1 ], start_origin[ 2 ] + start_height_offset ), ( start_origin[ 0 ], start_origin[ 1 ], stop_height ), 0, parent, 0, 1 ); - self killcammoveto( trace[ "position" ], speed, 0, pathheight ); - } + parent endon( "death" ); + self endon( "reset" ); + wait 0.05; + self notify( "unlink" ); + self unlink(); + self.angles = ( 0, 0, 0 ); + accel_time = 0.2; + speed = 20000; + start_height_offset = -800; + stop_height = level.mapcenter[2] - 500; + start_origin_struct = getoriginalongstrafepath( node, self.origin, distance ); + start_origin = start_origin_struct.origin; + node = start_origin_struct.node; + previous_origin = self.origin; + start_origin = getlookaheadorigin( previous_origin, start_origin, parent.straferungunlookahead + 1000 ); + trace = bullettrace( ( start_origin[0], start_origin[1], start_origin[2] + start_height_offset ), ( start_origin[0], start_origin[1], stop_height ), 0, parent, 0, 1 ); + pathheight = trace["position"][2]; + self killcammoveto( trace["position"], speed, accel_time, pathheight ); + speed = 500; + + while ( isdefined( node ) ) + { + previous_origin = node.origin; + node = getvehiclenode( node.target, "targetname" ); + start_origin = getlookaheadorigin( previous_origin, node.origin, parent.straferungunlookahead + 1000 ); + trace = bullettrace( ( start_origin[0], start_origin[1], start_origin[2] + start_height_offset ), ( start_origin[0], start_origin[1], stop_height ), 0, parent, 0, 1 ); + self killcammoveto( trace["position"], speed, 0, pathheight ); + } } killcammoveto( goal, speed, accel, pathheight ) { - self endon( "reset" ); - height_offset = randomintrange( 350, 450 ); - origin = ( goal[ 0 ], goal[ 1 ], goal[ 2 ] + height_offset ); - dist = distance( origin, self.origin ); - time = dist / speed; - if ( accel > time ) - { - accel = time; - } - self moveto( origin, time, accel, 0 ); - self waittill( "movedone" ); + self endon( "reset" ); + height_offset = randomintrange( 350, 450 ); + origin = ( goal[0], goal[1], goal[2] + height_offset ); + dist = distance( origin, self.origin ); + time = dist / speed; + + if ( accel > time ) + accel = time; + + self moveto( origin, time, accel, 0 ); + + self waittill( "movedone" ); } startstrafekillcams() { - node = getvehiclenode( self.currentnode.target, "targetname" ); - strafe_dist = getstrafedistance( node ); - strafe_increment = strafe_dist / ( level.straferunkillcams.strafes.size + 1 ); - current_dist = 10; - i = 0; - while ( i < level.straferunkillcams.strafes.size ) - { - level.straferunkillcams.strafes[ i ] thread strafekillcam( self, node, current_dist ); - current_dist += strafe_increment; - i++; - } + node = getvehiclenode( self.currentnode.target, "targetname" ); + strafe_dist = getstrafedistance( node ); + strafe_increment = strafe_dist / ( level.straferunkillcams.strafes.size + 1 ); + current_dist = 10; + + for ( i = 0; i < level.straferunkillcams.strafes.size; i++ ) + { + level.straferunkillcams.strafes[i] thread strafekillcam( self, node, current_dist ); + current_dist += strafe_increment; + } } getstrafedistance( node ) { - previous_node = node; - next_node = getvehiclenode( previous_node.target, "targetname" ); - dist = 0; - while ( isDefined( previous_node.script_noteworthy ) && previous_node.script_noteworthy != "strafe_stop" && next_node != node ) - { - dist += distance( ( previous_node.origin[ 0 ], previous_node.origin[ 1 ], 0 ), ( next_node.origin[ 0 ], next_node.origin[ 1 ], 0 ) ); - previous_node = next_node; - next_node = getvehiclenode( previous_node.target, "targetname" ); - } - return dist; + previous_node = node; + next_node = getvehiclenode( previous_node.target, "targetname" ); + dist = 0; + + while ( ( !isdefined( previous_node.script_noteworthy ) || previous_node.script_noteworthy != "strafe_stop" ) && next_node != node ) + { + dist += distance( ( previous_node.origin[0], previous_node.origin[1], 0 ), ( next_node.origin[0], next_node.origin[1], 0 ) ); + previous_node = next_node; + next_node = getvehiclenode( previous_node.target, "targetname" ); + } + + return dist; } getoriginalongstrafepath( node, start_origin, distance_along ) { - origin_node = spawnstruct(); - seg_dist = distance( ( start_origin[ 0 ], start_origin[ 1 ], 0 ), ( node.origin[ 0 ], node.origin[ 1 ], 0 ) ); - dist = 0; - if ( ( dist + seg_dist ) > distance_along ) - { - forwardvec = vectornormalize( ( node.origin[ 0 ], node.origin[ 1 ], 0 ) - ( start_origin[ 0 ], start_origin[ 1 ], 0 ) ); - origin_node.origin = start_origin + ( forwardvec * ( distance_along - dist ) ); - origin_node.node = node; - return origin_node; - } - dist = seg_dist; - previous_node = node; - next_node = getvehiclenode( previous_node.target, "targetname" ); - while ( isDefined( previous_node.script_noteworthy ) && previous_node.script_noteworthy != "strafe_stop" && next_node != node ) - { - seg_dist = distance( ( previous_node.origin[ 0 ], previous_node.origin[ 1 ], 0 ), ( next_node.origin[ 0 ], next_node.origin[ 1 ], 0 ) ); - if ( ( dist + seg_dist ) > distance_along ) - { - forwardvec = vectornormalize( next_node.origin - previous_node.origin ); - origin_node.origin = previous_node.origin + ( forwardvec * ( distance_along - dist ) ); - origin_node.node = previous_node; - return origin_node; - } - dist += seg_dist; - previous_node = next_node; - next_node = getvehiclenode( previous_node.target, "targetname" ); - } + origin_node = spawnstruct(); + seg_dist = distance( ( start_origin[0], start_origin[1], 0 ), ( node.origin[0], node.origin[1], 0 ) ); + dist = 0; + + if ( dist + seg_dist > distance_along ) + { + forwardvec = vectornormalize( ( node.origin[0], node.origin[1], 0 ) - ( start_origin[0], start_origin[1], 0 ) ); + origin_node.origin = start_origin + forwardvec * ( distance_along - dist ); + origin_node.node = node; + return origin_node; + } + + dist = seg_dist; + previous_node = node; + + for ( next_node = getvehiclenode( previous_node.target, "targetname" ); ( !isdefined( previous_node.script_noteworthy ) || previous_node.script_noteworthy != "strafe_stop" ) && next_node != node; next_node = getvehiclenode( previous_node.target, "targetname" ) ) + { + seg_dist = distance( ( previous_node.origin[0], previous_node.origin[1], 0 ), ( next_node.origin[0], next_node.origin[1], 0 ) ); + + if ( dist + seg_dist > distance_along ) + { + forwardvec = vectornormalize( next_node.origin - previous_node.origin ); + origin_node.origin = previous_node.origin + forwardvec * ( distance_along - dist ); + origin_node.node = previous_node; + return origin_node; + } + + dist += seg_dist; + previous_node = next_node; + } } diff --git a/Multiplayer Core/patch_mp/maps/mp/killstreaks/_supplycrate.gsc b/Multiplayer Core/patch_mp/maps/mp/killstreaks/_supplycrate.gsc index a570160..47f3a61 100644 --- a/Multiplayer Core/patch_mp/maps/mp/killstreaks/_supplycrate.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/killstreaks/_supplycrate.gsc @@ -1,2 +1,5 @@ -#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; + diff --git a/Multiplayer Core/patch_mp/maps/mp/killstreaks/_supplydrop.gsc b/Multiplayer Core/patch_mp/maps/mp/killstreaks/_supplydrop.gsc index c316677..e0cadfc 100644 --- a/Multiplayer Core/patch_mp/maps/mp/killstreaks/_supplydrop.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/killstreaks/_supplydrop.gsc @@ -1,2574 +1,2492 @@ -//checked includes match cerberus output -#include maps/mp/killstreaks/_helicopter; -#include maps/mp/gametypes/_hostmigration; -#include maps/mp/_tacticalinsertion; -#include maps/mp/gametypes/_weaponobjects; -#include maps/mp/_scoreevents; -#include maps/mp/_challenges; -#include maps/mp/_hacker_tool; -#include maps/mp/killstreaks/_emp; -#include maps/mp/killstreaks/_supplydrop; -#include maps/mp/_entityheadicons; -#include maps/mp/gametypes/_gameobjects; -#include maps/mp/killstreaks/_killstreakrules; -#include maps/mp/killstreaks/_killstreak_weapons; -#include maps/mp/gametypes/_weapons; -#include maps/mp/_popups; -#include maps/mp/gametypes/_callbacksetup; -#include maps/mp/killstreaks/_ai_tank; -#include maps/mp/killstreaks/_killstreaks; -#include maps/mp/killstreaks/_airsupport; -#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\killstreaks\_airsupport; +#include maps\mp\killstreaks\_killstreaks; +#include maps\mp\killstreaks\_ai_tank; +#include maps\mp\gametypes\_callbacksetup; +#include maps\mp\_popups; +#include maps\mp\gametypes\_weapons; +#include maps\mp\killstreaks\_killstreak_weapons; +#include maps\mp\killstreaks\_killstreakrules; +#include maps\mp\gametypes\_gameobjects; +#include maps\mp\_entityheadicons; +#include maps\mp\killstreaks\_supplydrop; +#include maps\mp\killstreaks\_emp; +#include maps\mp\_hacker_tool; +#include maps\mp\_challenges; +#include maps\mp\_scoreevents; +#include maps\mp\gametypes\_weaponobjects; +#include maps\mp\_tacticalinsertion; +#include maps\mp\gametypes\_hostmigration; +#include maps\mp\killstreaks\_helicopter; -#using_animtree( "mp_vehicles" ); //remove when compiling will cause issues otherwise because the compiler doesn't support it +#using_animtree("mp_vehicles"); - -init() //checked changed to match cerberus output +init() { - level.cratemodelfriendly = "t6_wpn_supply_drop_ally"; - level.cratemodelenemy = "t6_wpn_supply_drop_axis"; - level.cratemodelhacker = "t6_wpn_supply_drop_detect"; - level.cratemodeltank = "t6_wpn_drop_box"; - level.cratemodelboobytrapped = "t6_wpn_supply_drop_trap"; - level.supplydrophelicopterfriendly = "veh_t6_drone_supply"; - level.supplydrophelicopterenemy = "veh_t6_drone_supply_alt"; - level.suppydrophelicoptervehicleinfo = "heli_supplydrop_mp"; - level.crateownerusetime = 500; - level.cratenonownerusetime = getgametypesetting( "crateCaptureTime" ) * 1000; - level.crate_headicon_offset = vectorScale( ( 0, 0, 1 ), 15 ); - level.supplydropdisarmcrate = &"KILLSTREAK_SUPPLY_DROP_DISARM_HINT"; - level.disarmingcrate = &"KILLSTREAK_SUPPLY_DROP_DISARMING_CRATE"; - level.supplydropcarepackageidleanim = %o_drone_supply_care_idle; - level.supplydropcarepackagedropanim = %o_drone_supply_care_drop; - level.supplydropaitankidleanim = %o_drone_supply_agr_idle; - level.supplydropaitankdropanim = %o_drone_supply_agr_drop; - precachemodel( level.cratemodelfriendly ); - precachemodel( level.cratemodelenemy ); - precachemodel( level.cratemodelhacker ); - precachemodel( level.cratemodeltank ); - precachemodel( level.cratemodelboobytrapped ); - precachemodel( level.supplydrophelicopterfriendly ); - precachemodel( level.supplydrophelicopterenemy ); - precachevehicle( level.suppydrophelicoptervehicleinfo ); - precacheshader( "compass_supply_drop_black" ); - precacheshader( "compass_supply_drop_green" ); - precacheshader( "compass_supply_drop_red" ); - precacheshader( "waypoint_recon_artillery_strike" ); - precacheshader( "hud_ks_minigun" ); - precacheshader( "hud_ks_minigun_drop" ); - precacheshader( "hud_ks_m32" ); - precacheshader( "hud_ks_m32_drop" ); - precacheshader( "hud_ks_m202" ); - precacheshader( "hud_ks_m202_drop" ); - precacheshader( "hud_ammo_refill" ); - precacheshader( "hud_ammo_refill_drop" ); - precacheshader( "hud_ks_ai_tank_drop" ); - precachestring( &"KILLSTREAK_CAPTURING_CRATE" ); - precachestring( &"KILLSTREAK_SUPPLY_DROP_DISARM_HINT" ); - precachestring( &"KILLSTREAK_SUPPLY_DROP_DISARMING_CRATE" ); - precacheshader( "headicon_dead" ); - registerclientfield( "helicopter", "supplydrop_care_package_state", 1, 1, "int" ); - registerclientfield( "helicopter", "supplydrop_ai_tank_state", 1, 1, "int" ); - level._supply_drop_smoke_fx = loadfx( "env/smoke/fx_smoke_supply_drop_blue_mp" ); - level._supply_drop_explosion_fx = loadfx( "explosions/fx_grenadeexp_default" ); - maps/mp/killstreaks/_killstreaks::registerkillstreak( "inventory_supply_drop_mp", "inventory_supplydrop_mp", "killstreak_supply_drop", "supply_drop_used", ::usekillstreaksupplydrop, undefined, 1 ); - maps/mp/killstreaks/_killstreaks::registerkillstreakstrings( "inventory_supply_drop_mp", &"KILLSTREAK_EARNED_SUPPLY_DROP", &"KILLSTREAK_AIRSPACE_FULL", &"KILLSTREAK_SUPPLY_DROP_INBOUND" ); - maps/mp/killstreaks/_killstreaks::registerkillstreakdialog( "inventory_supply_drop_mp", "mpl_killstreak_supply", "kls_supply_used", "", "kls_supply_enemy", "", "kls_supply_ready" ); - maps/mp/killstreaks/_killstreaks::registerkillstreakaltweapon( "inventory_supply_drop_mp", "mp40_blinged_mp" ); - maps/mp/killstreaks/_killstreaks::allowkillstreakassists( "inventory_supply_drop_mp", 1 ); - maps/mp/killstreaks/_killstreaks::registerkillstreakdevdvar( "inventory_supply_drop_mp", "scr_givesupplydrop" ); - maps/mp/killstreaks/_killstreaks::registerkillstreak( "supply_drop_mp", "supplydrop_mp", "killstreak_supply_drop", "supply_drop_used", ::usekillstreaksupplydrop, undefined, 1 ); - maps/mp/killstreaks/_killstreaks::registerkillstreakstrings( "supply_drop_mp", &"KILLSTREAK_EARNED_SUPPLY_DROP", &"KILLSTREAK_AIRSPACE_FULL", &"KILLSTREAK_SUPPLY_DROP_INBOUND" ); - maps/mp/killstreaks/_killstreaks::registerkillstreakdialog( "supply_drop_mp", "mpl_killstreak_supply", "kls_supply_used", "", "kls_supply_enemy", "", "kls_supply_ready" ); - maps/mp/killstreaks/_killstreaks::registerkillstreakaltweapon( "supply_drop_mp", "mp40_blinged_mp" ); - maps/mp/killstreaks/_killstreaks::allowkillstreakassists( "supply_drop_mp", 1 ); - level.cratetypes = []; - level.categorytypeweight = []; - registercratetype( "ai_tank_drop_mp", "killstreak", "ai_tank_mp", 1, &"KILLSTREAK_AI_TANK_CRATE", undefined, undefined, undefined, maps/mp/killstreaks/_ai_tank::crateland ); - registercratetype( "inventory_ai_tank_drop_mp", "killstreak", "ai_tank_mp", 1, &"KILLSTREAK_AI_TANK_CRATE", undefined, undefined, undefined, maps/mp/killstreaks/_ai_tank::crateland ); - registercratetype( "minigun_drop_mp", "killstreak", "minigun_mp", 1, &"KILLSTREAK_MINIGUN_CRATE", &"PLATFORM_MINIGUN_GAMBLER", "share_package_death_machine", ::givecrateweapon ); - registercratetype( "inventory_minigun_drop_mp", "killstreak", "minigun_mp", 1, &"KILLSTREAK_MINIGUN_CRATE", &"PLATFORM_MINIGUN_GAMBLER", "share_package_death_machine", ::givecrateweapon ); - registercratetype( "m32_drop_mp", "killstreak", "m32_mp", 1, &"KILLSTREAK_M32_CRATE", &"PLATFORM_M32_GAMBLER", "share_package_multiple_grenade_launcher", ::givecrateweapon ); - registercratetype( "inventory_m32_drop_mp", "killstreak", "m32_mp", 1, &"KILLSTREAK_M32_CRATE", &"PLATFORM_M32_GAMBLER", "share_package_multiple_grenade_launcher", ::givecrateweapon ); - registercratetype( "supplydrop_mp", "killstreak", "radar_mp", 100, &"KILLSTREAK_RADAR_CRATE", &"PLATFORM_RADAR_GAMBLER", "share_package_uav", ::givecratekillstreak ); - registercratetype( "supplydrop_mp", "killstreak", "rcbomb_mp", 100, &"KILLSTREAK_RCBOMB_CRATE", &"PLATFORM_RCBOMB_GAMBLER", "share_package_rcbomb", ::givecratekillstreak ); - registercratetype( "supplydrop_mp", "killstreak", "inventory_missile_drone_mp", 100, &"KILLSTREAK_MISSILE_DRONE_CRATE", &"PLATFORM_MISSILE_DRONE_GAMBLER", "share_package_missile_drone", ::givecratekillstreak ); - registercratetype( "supplydrop_mp", "killstreak", "counteruav_mp", 100, &"KILLSTREAK_COUNTERU2_CRATE", &"PLATFORM_COUNTERU2_GAMBLER", "share_package_counter_uav", ::givecratekillstreak ); - registercratetype( "supplydrop_mp", "killstreak", "remote_missile_mp", 85, &"KILLSTREAK_REMOTE_MISSILE_CRATE", &"PLATFORM_REMOTE_MISSILE_GAMBLER", "share_package_remote_missile", ::givecratekillstreak ); - registercratetype( "supplydrop_mp", "killstreak", "planemortar_mp", 80, &"KILLSTREAK_PLANE_MORTAR_CRATE", &"PLATFORM_PLANE_MORTAR_GAMBLER", "share_package_plane_mortar", ::givecratekillstreak ); - registercratetype( "supplydrop_mp", "killstreak", "autoturret_mp", 80, &"KILLSTREAK_AUTO_TURRET_CRATE", &"PLATFORM_AUTO_TURRET_GAMBLER", "share_package_sentry_gun", ::givecratekillstreak ); - registercratetype( "supplydrop_mp", "killstreak", "microwaveturret_mp", 120, &"KILLSTREAK_MICROWAVE_TURRET_CRATE", &"PLATFORM_MICROWAVE_TURRET_GAMBLER", "share_package_microwave_turret", ::givecratekillstreak ); - registercratetype( "supplydrop_mp", "killstreak", "inventory_minigun_mp", 60, &"KILLSTREAK_MINIGUN_CRATE", &"PLATFORM_MINIGUN_GAMBLER", "share_package_death_machine", ::givecratekillstreak ); - registercratetype( "supplydrop_mp", "killstreak", "inventory_m32_mp", 60, &"KILLSTREAK_M32_CRATE", &"PLATFORM_M32_GAMBLER", "share_package_multiple_grenade_launcher", ::givecratekillstreak ); - registercratetype( "supplydrop_mp", "killstreak", "helicopter_guard_mp", 20, &"KILLSTREAK_HELICOPTER_GUARD_CRATE", &"PLATFORM_HELICOPTER_GUARD_GAMBLER", "share_package_helicopter_guard", ::givecratekillstreak ); - registercratetype( "supplydrop_mp", "killstreak", "radardirection_mp", 20, &"KILLSTREAK_SATELLITE_CRATE", &"PLATFORM_SATELLITE_GAMBLER", "share_package_satellite", ::givecratekillstreak ); - registercratetype( "supplydrop_mp", "killstreak", "qrdrone_mp", 20, &"KILLSTREAK_QRDRONE_CRATE", &"PLATFORM_QRDRONE_GAMBLER", "share_package_qrdrone", ::givecratekillstreak ); - registercratetype( "supplydrop_mp", "killstreak", "inventory_ai_tank_drop_mp", 20, &"KILLSTREAK_AI_TANK_CRATE", &"PLATFORM_AI_TANK_GAMBLER", "share_package_aitank", ::givecratekillstreak ); - registercratetype( "supplydrop_mp", "killstreak", "helicopter_comlink_mp", 20, &"KILLSTREAK_HELICOPTER_CRATE", &"PLATFORM_HELICOPTER_GAMBLER", "share_package_helicopter_comlink", ::givecratekillstreak ); - registercratetype( "supplydrop_mp", "killstreak", "emp_mp", 5, &"KILLSTREAK_EMP_CRATE", &"PLATFORM_EMP_GAMBLER", "share_package_emp", ::givecratekillstreak ); - registercratetype( "supplydrop_mp", "killstreak", "remote_mortar_mp", 2, &"KILLSTREAK_REMOTE_MORTAR_CRATE", &"PLATFORM_REMOTE_MORTAR_GAMBLER", "share_package_remote_mortar", ::givecratekillstreak ); - registercratetype( "supplydrop_mp", "killstreak", "helicopter_player_gunner_mp", 2, &"KILLSTREAK_HELICOPTER_GUNNER_CRATE", &"PLATFORM_HELICOPTER_GUNNER_GAMBLER", "share_package_helicopter_gunner", ::givecratekillstreak ); - registercratetype( "supplydrop_mp", "killstreak", "dogs_mp", 2, &"KILLSTREAK_DOGS_CRATE", &"PLATFORM_DOGS_GAMBLER", "share_package_dogs", ::givecratekillstreak ); - registercratetype( "supplydrop_mp", "killstreak", "straferun_mp", 2, &"KILLSTREAK_STRAFERUN_CRATE", &"PLATFORM_STRAFERUN_GAMBLER", "share_package_strafe_run", ::givecratekillstreak ); - registercratetype( "supplydrop_mp", "killstreak", "missile_swarm_mp", 2, &"KILLSTREAK_MISSILE_SWARM_CRATE", &"PLATFORM_MISSILE_SWARM_GAMBLER", "share_package_missile_swarm", ::givecratekillstreak ); - registercratetype( "inventory_supplydrop_mp", "killstreak", "radar_mp", 100, &"KILLSTREAK_RADAR_CRATE", &"PLATFORM_RADAR_GAMBLER", "share_package_uav", ::givecratekillstreak ); - registercratetype( "inventory_supplydrop_mp", "killstreak", "counteruav_mp", 100, &"KILLSTREAK_COUNTERU2_CRATE", &"PLATFORM_COUNTERU2_GAMBLER", "share_package_counter_uav", ::givecratekillstreak ); - registercratetype( "inventory_supplydrop_mp", "killstreak", "rcbomb_mp", 100, &"KILLSTREAK_RCBOMB_CRATE", &"PLATFORM_RCBOMB_GAMBLER", "share_package_rcbomb", ::givecratekillstreak ); - registercratetype( "inventory_supplydrop_mp", "killstreak", "inventory_missile_drone_mp", 100, &"KILLSTREAK_MISSILE_DRONE_CRATE", &"PLATFORM_MISSILE_DRONE_GAMBLER", "share_package_missile_drone", ::givecratekillstreak ); - registercratetype( "inventory_supplydrop_mp", "killstreak", "qrdrone_mp", 20, &"KILLSTREAK_QRDRONE_CRATE", &"PLATFORM_QRDRONE_GAMBLER", "share_package_qrdrone", ::givecratekillstreak ); - registercratetype( "inventory_supplydrop_mp", "killstreak", "remote_missile_mp", 85, &"KILLSTREAK_REMOTE_MISSILE_CRATE", &"PLATFORM_REMOTE_MISSILE_GAMBLER", "share_package_remote_missile", ::givecratekillstreak ); - registercratetype( "inventory_supplydrop_mp", "killstreak", "planemortar_mp", 80, &"KILLSTREAK_PLANE_MORTAR_CRATE", &"PLATFORM_PLANE_MORTAR_GAMBLER", "share_package_plane_mortar", ::givecratekillstreak ); - registercratetype( "inventory_supplydrop_mp", "killstreak", "autoturret_mp", 80, &"KILLSTREAK_AUTO_TURRET_CRATE", &"PLATFORM_AUTO_TURRET_GAMBLER", "share_package_sentry_gun", ::givecratekillstreak ); - registercratetype( "inventory_supplydrop_mp", "killstreak", "microwaveturret_mp", 120, &"KILLSTREAK_MICROWAVE_TURRET_CRATE", &"PLATFORM_MICROWAVE_TURRET_GAMBLER", "share_package_microwave_turret", ::givecratekillstreak ); - registercratetype( "inventory_supplydrop_mp", "killstreak", "inventory_minigun_mp", 60, &"KILLSTREAK_MINIGUN_CRATE", &"PLATFORM_MINIGUN_GAMBLER", "share_package_death_machine", ::givecratekillstreak ); - registercratetype( "inventory_supplydrop_mp", "killstreak", "inventory_m32_mp", 60, &"KILLSTREAK_M32_CRATE", &"PLATFORM_M32_GAMBLER", "share_package_multiple_grenade_launcher", ::givecratekillstreak ); - registercratetype( "inventory_supplydrop_mp", "killstreak", "remote_mortar_mp", 2, &"KILLSTREAK_REMOTE_MORTAR_CRATE", &"PLATFORM_REMOTE_MORTAR_GAMBLER", "share_package_remote_mortar", ::givecratekillstreak ); - registercratetype( "inventory_supplydrop_mp", "killstreak", "helicopter_guard_mp", 20, &"KILLSTREAK_HELICOPTER_GUARD_CRATE", &"PLATFORM_HELICOPTER_GUARD_GAMBLER", "share_package_helicopter_guard", ::givecratekillstreak ); - registercratetype( "inventory_supplydrop_mp", "killstreak", "radardirection_mp", 20, &"KILLSTREAK_SATELLITE_CRATE", &"PLATFORM_SATELLITE_GAMBLER", "share_package_satellite", ::givecratekillstreak ); - registercratetype( "inventory_supplydrop_mp", "killstreak", "inventory_ai_tank_drop_mp", 20, &"KILLSTREAK_AI_TANK_CRATE", &"PLATFORM_AI_TANK_GAMBLER", "share_package_aitank", ::givecratekillstreak ); - registercratetype( "inventory_supplydrop_mp", "killstreak", "helicopter_comlink_mp", 20, &"KILLSTREAK_HELICOPTER_CRATE", &"PLATFORM_HELICOPTER_GAMBLER", "share_package_helicopter_comlink", ::givecratekillstreak ); - registercratetype( "inventory_supplydrop_mp", "killstreak", "emp_mp", 5, &"KILLSTREAK_EMP_CRATE", &"PLATFORM_EMP_GAMBLER", "share_package_emp", ::givecratekillstreak ); - registercratetype( "inventory_supplydrop_mp", "killstreak", "helicopter_player_gunner_mp", 2, &"KILLSTREAK_HELICOPTER_GUNNER_CRATE", &"PLATFORM_HELICOPTER_GUNNER_GAMBLER", "share_package_helicopter_gunner", ::givecratekillstreak ); - registercratetype( "inventory_supplydrop_mp", "killstreak", "dogs_mp", 2, &"KILLSTREAK_DOGS_CRATE", &"PLATFORM_DOGS_GAMBLER", "share_package_dogs", ::givecratekillstreak ); - registercratetype( "inventory_supplydrop_mp", "killstreak", "straferun_mp", 2, &"KILLSTREAK_STRAFERUN_CRATE", &"PLATFORM_STRAFERUN_GAMBLER", "share_package_strafe_run", ::givecratekillstreak ); - registercratetype( "inventory_supplydrop_mp", "killstreak", "missile_swarm_mp", 2, &"KILLSTREAK_MISSILE_SWARM_CRATE", &"PLATFORM_MISSILE_SWARM_GAMBLER", "share_package_missile_swarm", ::givecratekillstreak ); - registercratetype( "gambler_mp", "killstreak", "radar_mp", 80, &"KILLSTREAK_RADAR_CRATE", undefined, "share_package_uav", ::givecratekillstreak ); - registercratetype( "gambler_mp", "killstreak", "counteruav_mp", 80, &"KILLSTREAK_COUNTERU2_CRATE", undefined, "share_package_counter_uav", ::givecratekillstreak ); - registercratetype( "gambler_mp", "killstreak", "rcbomb_mp", 80, &"KILLSTREAK_RCBOMB_CRATE", undefined, "share_package_rcbomb", ::givecratekillstreak ); - registercratetype( "gambler_mp", "killstreak", "inventory_missile_drone_mp", 90, &"KILLSTREAK_MISSILE_DRONE_CRATE", undefined, "share_package_missile_drone", ::givecratekillstreak ); - registercratetype( "gambler_mp", "killstreak", "qrdrone_mp", 30, &"KILLSTREAK_QRDRONE_CRATE", undefined, "share_package_qrdrone", ::givecratekillstreak ); - registercratetype( "gambler_mp", "killstreak", "microwaveturret_mp", 100, &"KILLSTREAK_MICROWAVE_TURRET_CRATE", undefined, "share_package_microwave_turret", ::givecratekillstreak ); - registercratetype( "gambler_mp", "killstreak", "remote_missile_mp", 90, &"KILLSTREAK_REMOTE_MISSILE_CRATE", undefined, "share_package_remote_missile", ::givecratekillstreak ); - registercratetype( "gambler_mp", "killstreak", "planemortar_mp", 90, &"KILLSTREAK_PLANE_MORTAR_CRATE", undefined, "share_package_plane_mortar", ::givecratekillstreak ); - registercratetype( "gambler_mp", "killstreak", "autoturret_mp", 90, &"KILLSTREAK_AUTO_TURRET_CRATE", undefined, "share_package_sentry_gun", ::givecratekillstreak ); - registercratetype( "gambler_mp", "killstreak", "inventory_minigun_mp", 60, &"KILLSTREAK_MINIGUN_CRATE", undefined, "share_package_death_machine", ::givecratekillstreak ); - registercratetype( "gambler_mp", "killstreak", "inventory_m32_mp", 60, &"KILLSTREAK_M32_CRATE", undefined, "share_package_multiple_grenade_launcher", ::givecratekillstreak ); - registercratetype( "gambler_mp", "killstreak", "remote_mortar_mp", 2, &"KILLSTREAK_REMOTE_MORTAR_CRATE", undefined, "share_package_remote_mortar", ::givecratekillstreak ); - registercratetype( "gambler_mp", "killstreak", "helicopter_guard_mp", 30, &"KILLSTREAK_HELICOPTER_GUARD_CRATE", undefined, "share_package_helicopter_guard", ::givecratekillstreak ); - registercratetype( "gambler_mp", "killstreak", "radardirection_mp", 30, &"KILLSTREAK_SATELLITE_CRATE", undefined, "share_package_satellite", ::givecratekillstreak ); - registercratetype( "gambler_mp", "killstreak", "inventory_ai_tank_drop_mp", 30, &"KILLSTREAK_AI_TANK_CRATE", undefined, "share_package_aitank", ::givecratekillstreak ); - registercratetype( "gambler_mp", "killstreak", "helicopter_comlink_mp", 30, &"KILLSTREAK_HELICOPTER_CRATE", undefined, "share_package_helicopter_comlink", ::givecratekillstreak ); - registercratetype( "gambler_mp", "killstreak", "straferun_mp", 2, &"KILLSTREAK_STRAFERUN_CRATE", undefined, "share_package_strafe_run", ::givecratekillstreak ); - registercratetype( "gambler_mp", "killstreak", "emp_mp", 10, &"KILLSTREAK_EMP_CRATE", undefined, "share_package_emp", ::givecratekillstreak ); - registercratetype( "gambler_mp", "killstreak", "helicopter_player_gunner_mp", 2, &"KILLSTREAK_HELICOPTER_GUNNER_CRATE", undefined, "share_package_helicopter_gunner", ::givecratekillstreak ); - registercratetype( "gambler_mp", "killstreak", "dogs_mp", 2, &"KILLSTREAK_DOGS_CRATE", undefined, "share_package_dogs", ::givecratekillstreak ); - registercratetype( "gambler_mp", "killstreak", "missile_swarm_mp", 2, &"KILLSTREAK_MISSILE_SWARM_CRATE", undefined, "share_package_missile_swarm", ::givecratekillstreak ); - level.cratecategoryweights = []; - level.cratecategorytypeweights = []; - foreach ( category in level.cratetypes ) - { - finalizecratecategory( categorykey ); - } - /* + level.cratemodelfriendly = "t6_wpn_supply_drop_ally"; + level.cratemodelenemy = "t6_wpn_supply_drop_axis"; + level.cratemodelhacker = "t6_wpn_supply_drop_detect"; + level.cratemodeltank = "t6_wpn_drop_box"; + level.cratemodelboobytrapped = "t6_wpn_supply_drop_trap"; + level.supplydrophelicopterfriendly = "veh_t6_drone_supply"; + level.supplydrophelicopterenemy = "veh_t6_drone_supply_alt"; + level.suppydrophelicoptervehicleinfo = "heli_supplydrop_mp"; + level.crateownerusetime = 500; + level.cratenonownerusetime = getgametypesetting( "crateCaptureTime" ) * 1000; + level.crate_headicon_offset = vectorscale( ( 0, 0, 1 ), 15.0 ); + level.supplydropdisarmcrate = &"KILLSTREAK_SUPPLY_DROP_DISARM_HINT"; + level.disarmingcrate = &"KILLSTREAK_SUPPLY_DROP_DISARMING_CRATE"; + level.supplydropcarepackageidleanim = %o_drone_supply_care_idle; + level.supplydropcarepackagedropanim = %o_drone_supply_care_drop; + level.supplydropaitankidleanim = %o_drone_supply_agr_idle; + level.supplydropaitankdropanim = %o_drone_supply_agr_drop; + precachemodel( level.cratemodelfriendly ); + precachemodel( level.cratemodelenemy ); + precachemodel( level.cratemodelhacker ); + precachemodel( level.cratemodeltank ); + precachemodel( level.cratemodelboobytrapped ); + precachemodel( level.supplydrophelicopterfriendly ); + precachemodel( level.supplydrophelicopterenemy ); + precachevehicle( level.suppydrophelicoptervehicleinfo ); + precacheshader( "compass_supply_drop_black" ); + precacheshader( "compass_supply_drop_green" ); + precacheshader( "compass_supply_drop_red" ); + precacheshader( "waypoint_recon_artillery_strike" ); + precacheshader( "hud_ks_minigun" ); + precacheshader( "hud_ks_minigun_drop" ); + precacheshader( "hud_ks_m32" ); + precacheshader( "hud_ks_m32_drop" ); + precacheshader( "hud_ks_m202" ); + precacheshader( "hud_ks_m202_drop" ); + precacheshader( "hud_ammo_refill" ); + precacheshader( "hud_ammo_refill_drop" ); + precacheshader( "hud_ks_ai_tank_drop" ); + precachestring( &"KILLSTREAK_CAPTURING_CRATE" ); + precachestring( &"KILLSTREAK_SUPPLY_DROP_DISARM_HINT" ); + precachestring( &"KILLSTREAK_SUPPLY_DROP_DISARMING_CRATE" ); + precacheshader( "headicon_dead" ); + registerclientfield( "helicopter", "supplydrop_care_package_state", 1, 1, "int" ); + registerclientfield( "helicopter", "supplydrop_ai_tank_state", 1, 1, "int" ); + level._supply_drop_smoke_fx = loadfx( "env/smoke/fx_smoke_supply_drop_blue_mp" ); + level._supply_drop_explosion_fx = loadfx( "explosions/fx_grenadeexp_default" ); + maps\mp\killstreaks\_killstreaks::registerkillstreak( "inventory_supply_drop_mp", "inventory_supplydrop_mp", "killstreak_supply_drop", "supply_drop_used", ::usekillstreaksupplydrop, undefined, 1 ); + maps\mp\killstreaks\_killstreaks::registerkillstreakstrings( "inventory_supply_drop_mp", &"KILLSTREAK_EARNED_SUPPLY_DROP", &"KILLSTREAK_AIRSPACE_FULL", &"KILLSTREAK_SUPPLY_DROP_INBOUND" ); + maps\mp\killstreaks\_killstreaks::registerkillstreakdialog( "inventory_supply_drop_mp", "mpl_killstreak_supply", "kls_supply_used", "", "kls_supply_enemy", "", "kls_supply_ready" ); + maps\mp\killstreaks\_killstreaks::registerkillstreakaltweapon( "inventory_supply_drop_mp", "mp40_blinged_mp" ); + maps\mp\killstreaks\_killstreaks::allowkillstreakassists( "inventory_supply_drop_mp", 1 ); + maps\mp\killstreaks\_killstreaks::registerkillstreakdevdvar( "inventory_supply_drop_mp", "scr_givesupplydrop" ); + maps\mp\killstreaks\_killstreaks::registerkillstreak( "supply_drop_mp", "supplydrop_mp", "killstreak_supply_drop", "supply_drop_used", ::usekillstreaksupplydrop, undefined, 1 ); + maps\mp\killstreaks\_killstreaks::registerkillstreakstrings( "supply_drop_mp", &"KILLSTREAK_EARNED_SUPPLY_DROP", &"KILLSTREAK_AIRSPACE_FULL", &"KILLSTREAK_SUPPLY_DROP_INBOUND" ); + maps\mp\killstreaks\_killstreaks::registerkillstreakdialog( "supply_drop_mp", "mpl_killstreak_supply", "kls_supply_used", "", "kls_supply_enemy", "", "kls_supply_ready" ); + maps\mp\killstreaks\_killstreaks::registerkillstreakaltweapon( "supply_drop_mp", "mp40_blinged_mp" ); + maps\mp\killstreaks\_killstreaks::allowkillstreakassists( "supply_drop_mp", 1 ); + level.cratetypes = []; + level.categorytypeweight = []; + registercratetype( "ai_tank_drop_mp", "killstreak", "ai_tank_mp", 1, &"KILLSTREAK_AI_TANK_CRATE", undefined, undefined, undefined, maps\mp\killstreaks\_ai_tank::crateland ); + registercratetype( "inventory_ai_tank_drop_mp", "killstreak", "ai_tank_mp", 1, &"KILLSTREAK_AI_TANK_CRATE", undefined, undefined, undefined, maps\mp\killstreaks\_ai_tank::crateland ); + registercratetype( "minigun_drop_mp", "killstreak", "minigun_mp", 1, &"KILLSTREAK_MINIGUN_CRATE", &"PLATFORM_MINIGUN_GAMBLER", "share_package_death_machine", ::givecrateweapon ); + registercratetype( "inventory_minigun_drop_mp", "killstreak", "minigun_mp", 1, &"KILLSTREAK_MINIGUN_CRATE", &"PLATFORM_MINIGUN_GAMBLER", "share_package_death_machine", ::givecrateweapon ); + registercratetype( "m32_drop_mp", "killstreak", "m32_mp", 1, &"KILLSTREAK_M32_CRATE", &"PLATFORM_M32_GAMBLER", "share_package_multiple_grenade_launcher", ::givecrateweapon ); + registercratetype( "inventory_m32_drop_mp", "killstreak", "m32_mp", 1, &"KILLSTREAK_M32_CRATE", &"PLATFORM_M32_GAMBLER", "share_package_multiple_grenade_launcher", ::givecrateweapon ); + registercratetype( "supplydrop_mp", "killstreak", "radar_mp", 100, &"KILLSTREAK_RADAR_CRATE", &"PLATFORM_RADAR_GAMBLER", "share_package_uav", ::givecratekillstreak ); + registercratetype( "supplydrop_mp", "killstreak", "rcbomb_mp", 100, &"KILLSTREAK_RCBOMB_CRATE", &"PLATFORM_RCBOMB_GAMBLER", "share_package_rcbomb", ::givecratekillstreak ); + registercratetype( "supplydrop_mp", "killstreak", "inventory_missile_drone_mp", 100, &"KILLSTREAK_MISSILE_DRONE_CRATE", &"PLATFORM_MISSILE_DRONE_GAMBLER", "share_package_missile_drone", ::givecratekillstreak ); + registercratetype( "supplydrop_mp", "killstreak", "counteruav_mp", 100, &"KILLSTREAK_COUNTERU2_CRATE", &"PLATFORM_COUNTERU2_GAMBLER", "share_package_counter_uav", ::givecratekillstreak ); + registercratetype( "supplydrop_mp", "killstreak", "remote_missile_mp", 85, &"KILLSTREAK_REMOTE_MISSILE_CRATE", &"PLATFORM_REMOTE_MISSILE_GAMBLER", "share_package_remote_missile", ::givecratekillstreak ); + registercratetype( "supplydrop_mp", "killstreak", "planemortar_mp", 80, &"KILLSTREAK_PLANE_MORTAR_CRATE", &"PLATFORM_PLANE_MORTAR_GAMBLER", "share_package_plane_mortar", ::givecratekillstreak ); + registercratetype( "supplydrop_mp", "killstreak", "autoturret_mp", 80, &"KILLSTREAK_AUTO_TURRET_CRATE", &"PLATFORM_AUTO_TURRET_GAMBLER", "share_package_sentry_gun", ::givecratekillstreak ); + registercratetype( "supplydrop_mp", "killstreak", "microwaveturret_mp", 120, &"KILLSTREAK_MICROWAVE_TURRET_CRATE", &"PLATFORM_MICROWAVE_TURRET_GAMBLER", "share_package_microwave_turret", ::givecratekillstreak ); + registercratetype( "supplydrop_mp", "killstreak", "inventory_minigun_mp", 60, &"KILLSTREAK_MINIGUN_CRATE", &"PLATFORM_MINIGUN_GAMBLER", "share_package_death_machine", ::givecratekillstreak ); + registercratetype( "supplydrop_mp", "killstreak", "inventory_m32_mp", 60, &"KILLSTREAK_M32_CRATE", &"PLATFORM_M32_GAMBLER", "share_package_multiple_grenade_launcher", ::givecratekillstreak ); + registercratetype( "supplydrop_mp", "killstreak", "helicopter_guard_mp", 20, &"KILLSTREAK_HELICOPTER_GUARD_CRATE", &"PLATFORM_HELICOPTER_GUARD_GAMBLER", "share_package_helicopter_guard", ::givecratekillstreak ); + registercratetype( "supplydrop_mp", "killstreak", "radardirection_mp", 20, &"KILLSTREAK_SATELLITE_CRATE", &"PLATFORM_SATELLITE_GAMBLER", "share_package_satellite", ::givecratekillstreak ); + registercratetype( "supplydrop_mp", "killstreak", "qrdrone_mp", 20, &"KILLSTREAK_QRDRONE_CRATE", &"PLATFORM_QRDRONE_GAMBLER", "share_package_qrdrone", ::givecratekillstreak ); + registercratetype( "supplydrop_mp", "killstreak", "inventory_ai_tank_drop_mp", 20, &"KILLSTREAK_AI_TANK_CRATE", &"PLATFORM_AI_TANK_GAMBLER", "share_package_aitank", ::givecratekillstreak ); + registercratetype( "supplydrop_mp", "killstreak", "helicopter_comlink_mp", 20, &"KILLSTREAK_HELICOPTER_CRATE", &"PLATFORM_HELICOPTER_GAMBLER", "share_package_helicopter_comlink", ::givecratekillstreak ); + registercratetype( "supplydrop_mp", "killstreak", "emp_mp", 5, &"KILLSTREAK_EMP_CRATE", &"PLATFORM_EMP_GAMBLER", "share_package_emp", ::givecratekillstreak ); + registercratetype( "supplydrop_mp", "killstreak", "remote_mortar_mp", 2, &"KILLSTREAK_REMOTE_MORTAR_CRATE", &"PLATFORM_REMOTE_MORTAR_GAMBLER", "share_package_remote_mortar", ::givecratekillstreak ); + registercratetype( "supplydrop_mp", "killstreak", "helicopter_player_gunner_mp", 2, &"KILLSTREAK_HELICOPTER_GUNNER_CRATE", &"PLATFORM_HELICOPTER_GUNNER_GAMBLER", "share_package_helicopter_gunner", ::givecratekillstreak ); + registercratetype( "supplydrop_mp", "killstreak", "dogs_mp", 2, &"KILLSTREAK_DOGS_CRATE", &"PLATFORM_DOGS_GAMBLER", "share_package_dogs", ::givecratekillstreak ); + registercratetype( "supplydrop_mp", "killstreak", "straferun_mp", 2, &"KILLSTREAK_STRAFERUN_CRATE", &"PLATFORM_STRAFERUN_GAMBLER", "share_package_strafe_run", ::givecratekillstreak ); + registercratetype( "supplydrop_mp", "killstreak", "missile_swarm_mp", 2, &"KILLSTREAK_MISSILE_SWARM_CRATE", &"PLATFORM_MISSILE_SWARM_GAMBLER", "share_package_missile_swarm", ::givecratekillstreak ); + registercratetype( "inventory_supplydrop_mp", "killstreak", "radar_mp", 100, &"KILLSTREAK_RADAR_CRATE", &"PLATFORM_RADAR_GAMBLER", "share_package_uav", ::givecratekillstreak ); + registercratetype( "inventory_supplydrop_mp", "killstreak", "counteruav_mp", 100, &"KILLSTREAK_COUNTERU2_CRATE", &"PLATFORM_COUNTERU2_GAMBLER", "share_package_counter_uav", ::givecratekillstreak ); + registercratetype( "inventory_supplydrop_mp", "killstreak", "rcbomb_mp", 100, &"KILLSTREAK_RCBOMB_CRATE", &"PLATFORM_RCBOMB_GAMBLER", "share_package_rcbomb", ::givecratekillstreak ); + registercratetype( "inventory_supplydrop_mp", "killstreak", "inventory_missile_drone_mp", 100, &"KILLSTREAK_MISSILE_DRONE_CRATE", &"PLATFORM_MISSILE_DRONE_GAMBLER", "share_package_missile_drone", ::givecratekillstreak ); + registercratetype( "inventory_supplydrop_mp", "killstreak", "qrdrone_mp", 20, &"KILLSTREAK_QRDRONE_CRATE", &"PLATFORM_QRDRONE_GAMBLER", "share_package_qrdrone", ::givecratekillstreak ); + registercratetype( "inventory_supplydrop_mp", "killstreak", "remote_missile_mp", 85, &"KILLSTREAK_REMOTE_MISSILE_CRATE", &"PLATFORM_REMOTE_MISSILE_GAMBLER", "share_package_remote_missile", ::givecratekillstreak ); + registercratetype( "inventory_supplydrop_mp", "killstreak", "planemortar_mp", 80, &"KILLSTREAK_PLANE_MORTAR_CRATE", &"PLATFORM_PLANE_MORTAR_GAMBLER", "share_package_plane_mortar", ::givecratekillstreak ); + registercratetype( "inventory_supplydrop_mp", "killstreak", "autoturret_mp", 80, &"KILLSTREAK_AUTO_TURRET_CRATE", &"PLATFORM_AUTO_TURRET_GAMBLER", "share_package_sentry_gun", ::givecratekillstreak ); + registercratetype( "inventory_supplydrop_mp", "killstreak", "microwaveturret_mp", 120, &"KILLSTREAK_MICROWAVE_TURRET_CRATE", &"PLATFORM_MICROWAVE_TURRET_GAMBLER", "share_package_microwave_turret", ::givecratekillstreak ); + registercratetype( "inventory_supplydrop_mp", "killstreak", "inventory_minigun_mp", 60, &"KILLSTREAK_MINIGUN_CRATE", &"PLATFORM_MINIGUN_GAMBLER", "share_package_death_machine", ::givecratekillstreak ); + registercratetype( "inventory_supplydrop_mp", "killstreak", "inventory_m32_mp", 60, &"KILLSTREAK_M32_CRATE", &"PLATFORM_M32_GAMBLER", "share_package_multiple_grenade_launcher", ::givecratekillstreak ); + registercratetype( "inventory_supplydrop_mp", "killstreak", "remote_mortar_mp", 2, &"KILLSTREAK_REMOTE_MORTAR_CRATE", &"PLATFORM_REMOTE_MORTAR_GAMBLER", "share_package_remote_mortar", ::givecratekillstreak ); + registercratetype( "inventory_supplydrop_mp", "killstreak", "helicopter_guard_mp", 20, &"KILLSTREAK_HELICOPTER_GUARD_CRATE", &"PLATFORM_HELICOPTER_GUARD_GAMBLER", "share_package_helicopter_guard", ::givecratekillstreak ); + registercratetype( "inventory_supplydrop_mp", "killstreak", "radardirection_mp", 20, &"KILLSTREAK_SATELLITE_CRATE", &"PLATFORM_SATELLITE_GAMBLER", "share_package_satellite", ::givecratekillstreak ); + registercratetype( "inventory_supplydrop_mp", "killstreak", "inventory_ai_tank_drop_mp", 20, &"KILLSTREAK_AI_TANK_CRATE", &"PLATFORM_AI_TANK_GAMBLER", "share_package_aitank", ::givecratekillstreak ); + registercratetype( "inventory_supplydrop_mp", "killstreak", "helicopter_comlink_mp", 20, &"KILLSTREAK_HELICOPTER_CRATE", &"PLATFORM_HELICOPTER_GAMBLER", "share_package_helicopter_comlink", ::givecratekillstreak ); + registercratetype( "inventory_supplydrop_mp", "killstreak", "emp_mp", 5, &"KILLSTREAK_EMP_CRATE", &"PLATFORM_EMP_GAMBLER", "share_package_emp", ::givecratekillstreak ); + registercratetype( "inventory_supplydrop_mp", "killstreak", "helicopter_player_gunner_mp", 2, &"KILLSTREAK_HELICOPTER_GUNNER_CRATE", &"PLATFORM_HELICOPTER_GUNNER_GAMBLER", "share_package_helicopter_gunner", ::givecratekillstreak ); + registercratetype( "inventory_supplydrop_mp", "killstreak", "dogs_mp", 2, &"KILLSTREAK_DOGS_CRATE", &"PLATFORM_DOGS_GAMBLER", "share_package_dogs", ::givecratekillstreak ); + registercratetype( "inventory_supplydrop_mp", "killstreak", "straferun_mp", 2, &"KILLSTREAK_STRAFERUN_CRATE", &"PLATFORM_STRAFERUN_GAMBLER", "share_package_strafe_run", ::givecratekillstreak ); + registercratetype( "inventory_supplydrop_mp", "killstreak", "missile_swarm_mp", 2, &"KILLSTREAK_MISSILE_SWARM_CRATE", &"PLATFORM_MISSILE_SWARM_GAMBLER", "share_package_missile_swarm", ::givecratekillstreak ); + registercratetype( "gambler_mp", "killstreak", "radar_mp", 80, &"KILLSTREAK_RADAR_CRATE", undefined, "share_package_uav", ::givecratekillstreak ); + registercratetype( "gambler_mp", "killstreak", "counteruav_mp", 80, &"KILLSTREAK_COUNTERU2_CRATE", undefined, "share_package_counter_uav", ::givecratekillstreak ); + registercratetype( "gambler_mp", "killstreak", "rcbomb_mp", 80, &"KILLSTREAK_RCBOMB_CRATE", undefined, "share_package_rcbomb", ::givecratekillstreak ); + registercratetype( "gambler_mp", "killstreak", "inventory_missile_drone_mp", 90, &"KILLSTREAK_MISSILE_DRONE_CRATE", undefined, "share_package_missile_drone", ::givecratekillstreak ); + registercratetype( "gambler_mp", "killstreak", "qrdrone_mp", 30, &"KILLSTREAK_QRDRONE_CRATE", undefined, "share_package_qrdrone", ::givecratekillstreak ); + registercratetype( "gambler_mp", "killstreak", "microwaveturret_mp", 100, &"KILLSTREAK_MICROWAVE_TURRET_CRATE", undefined, "share_package_microwave_turret", ::givecratekillstreak ); + registercratetype( "gambler_mp", "killstreak", "remote_missile_mp", 90, &"KILLSTREAK_REMOTE_MISSILE_CRATE", undefined, "share_package_remote_missile", ::givecratekillstreak ); + registercratetype( "gambler_mp", "killstreak", "planemortar_mp", 90, &"KILLSTREAK_PLANE_MORTAR_CRATE", undefined, "share_package_plane_mortar", ::givecratekillstreak ); + registercratetype( "gambler_mp", "killstreak", "autoturret_mp", 90, &"KILLSTREAK_AUTO_TURRET_CRATE", undefined, "share_package_sentry_gun", ::givecratekillstreak ); + registercratetype( "gambler_mp", "killstreak", "inventory_minigun_mp", 60, &"KILLSTREAK_MINIGUN_CRATE", undefined, "share_package_death_machine", ::givecratekillstreak ); + registercratetype( "gambler_mp", "killstreak", "inventory_m32_mp", 60, &"KILLSTREAK_M32_CRATE", undefined, "share_package_multiple_grenade_launcher", ::givecratekillstreak ); + registercratetype( "gambler_mp", "killstreak", "remote_mortar_mp", 2, &"KILLSTREAK_REMOTE_MORTAR_CRATE", undefined, "share_package_remote_mortar", ::givecratekillstreak ); + registercratetype( "gambler_mp", "killstreak", "helicopter_guard_mp", 30, &"KILLSTREAK_HELICOPTER_GUARD_CRATE", undefined, "share_package_helicopter_guard", ::givecratekillstreak ); + registercratetype( "gambler_mp", "killstreak", "radardirection_mp", 30, &"KILLSTREAK_SATELLITE_CRATE", undefined, "share_package_satellite", ::givecratekillstreak ); + registercratetype( "gambler_mp", "killstreak", "inventory_ai_tank_drop_mp", 30, &"KILLSTREAK_AI_TANK_CRATE", undefined, "share_package_aitank", ::givecratekillstreak ); + registercratetype( "gambler_mp", "killstreak", "helicopter_comlink_mp", 30, &"KILLSTREAK_HELICOPTER_CRATE", undefined, "share_package_helicopter_comlink", ::givecratekillstreak ); + registercratetype( "gambler_mp", "killstreak", "straferun_mp", 2, &"KILLSTREAK_STRAFERUN_CRATE", undefined, "share_package_strafe_run", ::givecratekillstreak ); + registercratetype( "gambler_mp", "killstreak", "emp_mp", 10, &"KILLSTREAK_EMP_CRATE", undefined, "share_package_emp", ::givecratekillstreak ); + registercratetype( "gambler_mp", "killstreak", "helicopter_player_gunner_mp", 2, &"KILLSTREAK_HELICOPTER_GUNNER_CRATE", undefined, "share_package_helicopter_gunner", ::givecratekillstreak ); + registercratetype( "gambler_mp", "killstreak", "dogs_mp", 2, &"KILLSTREAK_DOGS_CRATE", undefined, "share_package_dogs", ::givecratekillstreak ); + registercratetype( "gambler_mp", "killstreak", "missile_swarm_mp", 2, &"KILLSTREAK_MISSILE_SWARM_CRATE", undefined, "share_package_missile_swarm", ::givecratekillstreak ); + level.cratecategoryweights = []; + level.cratecategorytypeweights = []; + + foreach ( categorykey, category in level.cratetypes ) + finalizecratecategory( categorykey ); /# - level thread supply_drop_dev_gui(); - getdvarintdefault( "scr_crate_notimeout", 0 ); + level thread supply_drop_dev_gui(); + getdvarintdefault( "scr_crate_notimeout", 0 ); #/ - */ } -finalizecratecategory( category ) //checked changed to match cerberus output +finalizecratecategory( category ) { - level.cratecategoryweights[ category ] = 0; - cratetypekeys = getarraykeys( level.cratetypes[ category ] ); - for ( cratetype = 0; cratetype < cratetypekeys.size; cratetype++ ) - { - typekey = cratetypekeys[ cratetype ]; - level.cratetypes[ category ][ typekey ].previousweight = level.cratecategoryweights[ category ]; - level.cratecategoryweights[ category ] += level.cratetypes[ category ][ typekey ].weight; - level.cratetypes[ category ][ typekey ].weight = level.cratecategoryweights[ category ]; - } + level.cratecategoryweights[category] = 0; + cratetypekeys = getarraykeys( level.cratetypes[category] ); + + for ( cratetype = 0; cratetype < cratetypekeys.size; cratetype++ ) + { + typekey = cratetypekeys[cratetype]; + level.cratetypes[category][typekey].previousweight = level.cratecategoryweights[category]; + level.cratecategoryweights[category] += level.cratetypes[category][typekey].weight; + level.cratetypes[category][typekey].weight = level.cratecategoryweights[category]; + } } -advancedfinalizecratecategory( category ) //checked changed to match cerberus output +advancedfinalizecratecategory( category ) { - level.cratecategorytypeweights[ category ] = 0; - cratetypekeys = getarraykeys( level.categorytypeweight[ category ] ); - for ( cratetype = 0; cratetype < cratetypekeys.size; cratetype++ ) - { - typekey = cratetypekeys[ cratetype ]; - level.cratecategorytypeweights[ category ] += level.categorytypeweight[ category ][ typekey ].weight; - level.categorytypeweight[ category ][ typekey ].weight = level.cratecategorytypeweights[ category ]; - } - finalizecratecategory( category ); + level.cratecategorytypeweights[category] = 0; + cratetypekeys = getarraykeys( level.categorytypeweight[category] ); + + for ( cratetype = 0; cratetype < cratetypekeys.size; cratetype++ ) + { + typekey = cratetypekeys[cratetype]; + level.cratecategorytypeweights[category] += level.categorytypeweight[category][typekey].weight; + level.categorytypeweight[category][typekey].weight = level.cratecategorytypeweights[category]; + } + + finalizecratecategory( category ); } -setcategorytypeweight( category, type, weight ) //checked changed to match cerberus output +setcategorytypeweight( category, type, weight ) { - if ( !isDefined( level.categorytypeweight[ category ] ) ) - { - level.categorytypeweight[ category ] = []; - } - level.categorytypeweight[ category ][ type ] = spawnstruct(); - level.categorytypeweight[ category ][ type ].weight = weight; - count = 0; - totalweight = 0; - startindex = undefined; - finalindex = undefined; - cratenamekeys = getarraykeys( level.cratetypes[ category ] ); - for ( cratename = 0; cratename < cratenamekeys.size; cratename++ ) - { - namekey = cratenamekeys[ cratename ]; - if ( level.cratetypes[ category ][ namekey ].type == type ) - { - count++; - totalweight += level.cratetypes[ category ][ namekey ].weight; - if ( !isDefined( startindex ) ) - { - startindex = cratename; - } - if ( isDefined( finalindex ) && ( finalindex + 1 ) != cratename ) - { - /* + if ( !isdefined( level.categorytypeweight[category] ) ) + level.categorytypeweight[category] = []; + + level.categorytypeweight[category][type] = spawnstruct(); + level.categorytypeweight[category][type].weight = weight; + count = 0; + totalweight = 0; + startindex = undefined; + finalindex = undefined; + cratenamekeys = getarraykeys( level.cratetypes[category] ); + + for ( cratename = 0; cratename < cratenamekeys.size; cratename++ ) + { + namekey = cratenamekeys[cratename]; + + if ( level.cratetypes[category][namekey].type == type ) + { + count++; + totalweight += level.cratetypes[category][namekey].weight; + + if ( !isdefined( startindex ) ) + startindex = cratename; + + if ( isdefined( finalindex ) && finalindex + 1 != cratename ) + { /# - maps/mp/_utility::error( "Crate type declaration must be contiguous" ); + maps\mp\_utility::error( "Crate type declaration must be contiguous" ); #/ - */ - maps/mp/gametypes/_callbacksetup::abortlevel(); - return; - } - finalindex = cratename; - } - } - level.categorytypeweight[ category ][ type ].totalcrateweight = totalweight; - level.categorytypeweight[ category ][ type ].cratecount = count; - level.categorytypeweight[ category ][ type ].startindex = startindex; - level.categorytypeweight[ category ][ type ].finalindex = finalindex; + maps\mp\gametypes\_callbacksetup::abortlevel(); + return; + } + + finalindex = cratename; + } + } + + level.categorytypeweight[category][type].totalcrateweight = totalweight; + level.categorytypeweight[category][type].cratecount = count; + level.categorytypeweight[category][type].startindex = startindex; + level.categorytypeweight[category][type].finalindex = finalindex; } -registercratetype( category, type, name, weight, hint, hint_gambler, sharestat, givefunction, landfunctionoverride ) //checked matches cerberus output +registercratetype( category, type, name, weight, hint, hint_gambler, sharestat, givefunction, landfunctionoverride ) { - if ( !isDefined( level.cratetypes[ category ] ) ) - { - level.cratetypes[ category ] = []; - } - cratetype = spawnstruct(); - cratetype.type = type; - cratetype.name = name; - cratetype.weight = weight; - cratetype.hint = hint; - cratetype.hint_gambler = hint_gambler; - cratetype.sharestat = sharestat; - cratetype.givefunction = givefunction; - if ( isDefined( landfunctionoverride ) ) - { - cratetype.landfunctionoverride = landfunctionoverride; - } - level.cratetypes[ category ][ name ] = cratetype; - game[ "strings" ][ name + "_hint" ] = hint; + if ( !isdefined( level.cratetypes[category] ) ) + level.cratetypes[category] = []; + + cratetype = spawnstruct(); + cratetype.type = type; + cratetype.name = name; + cratetype.weight = weight; + cratetype.hint = hint; + cratetype.hint_gambler = hint_gambler; + cratetype.sharestat = sharestat; + cratetype.givefunction = givefunction; + + if ( isdefined( landfunctionoverride ) ) + cratetype.landfunctionoverride = landfunctionoverride; + + level.cratetypes[category][name] = cratetype; + game["strings"][name + "_hint"] = hint; } -getrandomcratetype( category, gambler_crate_name ) //checked partially changed to match cerberus output see compiler_limitations.md No. 2 +getrandomcratetype( category, gambler_crate_name ) { - /* /# - assert( isDefined( level.cratetypes ) ); + assert( isdefined( level.cratetypes ) ); #/ /# - assert( isDefined( level.cratetypes[ category ] ) ); + assert( isdefined( level.cratetypes[category] ) ); #/ /# - assert( isDefined( level.cratecategoryweights[ category ] ) ); + assert( isdefined( level.cratecategoryweights[category] ) ); #/ - */ - typekey = undefined; - cratetypestart = 0; - randomweightend = randomintrange( 1, level.cratecategoryweights[ category ] + 1 ); - find_another = 0; - cratenamekeys = getarraykeys( level.cratetypes[ category ] ); - if ( isDefined( level.categorytypeweight[ category ] ) ) - { - randomweightend = randomint( level.cratecategorytypeweights[ category ] ) + 1; - cratetypekeys = getarraykeys( level.categorytypeweight[ category ] ); - for ( cratetype = 0; cratetype < cratetypekeys.size; cratetype++ ) - { - typekey = cratetypekeys[ cratetype ]; - if ( level.categorytypeweight[ category ][ typekey ].weight < randomweightend ) - { - cratetype++; - } - else - { - cratetypestart = level.categorytypeweight[ category ][ typekey ].startindex; - randomweightend = randomint( level.categorytypeweight[ category ][ typekey ].totalcrateweight ) + 1; - randomweightend += level.cratetypes[ category ][ cratenamekeys[ cratetypestart ] ].previousweight; - break; - } - } - } - cratetype = cratetypestart; - while ( cratetype < cratenamekeys.size ) - { - typekey = cratenamekeys[ cratetype ]; - if ( level.cratetypes[ category ][ typekey ].weight < randomweightend ) - { - cratetype++; - continue; - } - if ( isDefined( gambler_crate_name ) && level.cratetypes[ category ][ typekey ].name == gambler_crate_name ) - { - find_another = 1; - } - if ( find_another ) - { - if ( cratetype < ( cratenamekeys.size - 1 ) ) - { - cratetype++; - } - else if ( cratetype > 0 ) - { - cratetype--; + typekey = undefined; + cratetypestart = 0; + randomweightend = randomintrange( 1, level.cratecategoryweights[category] + 1 ); + find_another = 0; + cratenamekeys = getarraykeys( level.cratetypes[category] ); - } - typekey = cratenamekeys[ cratetype ]; - } - break; - } + if ( isdefined( level.categorytypeweight[category] ) ) + { + randomweightend = randomint( level.cratecategorytypeweights[category] ) + 1; + cratetypekeys = getarraykeys( level.categorytypeweight[category] ); + + for ( cratetype = 0; cratetype < cratetypekeys.size; cratetype++ ) + { + typekey = cratetypekeys[cratetype]; + + if ( level.categorytypeweight[category][typekey].weight < randomweightend ) + continue; + + cratetypestart = level.categorytypeweight[category][typekey].startindex; + randomweightend = randomint( level.categorytypeweight[category][typekey].totalcrateweight ) + 1; + randomweightend += level.cratetypes[category][cratenamekeys[cratetypestart]].previousweight; + break; + } + } + + for ( cratetype = cratetypestart; cratetype < cratenamekeys.size; cratetype++ ) + { + typekey = cratenamekeys[cratetype]; + + if ( level.cratetypes[category][typekey].weight < randomweightend ) + continue; + + if ( isdefined( gambler_crate_name ) && level.cratetypes[category][typekey].name == gambler_crate_name ) + find_another = 1; + + if ( find_another ) + { + if ( cratetype < cratenamekeys.size - 1 ) + cratetype++; + else if ( cratetype > 0 ) + cratetype--; + + typekey = cratenamekeys[cratetype]; + } + + break; + } /# - if ( isDefined( level.dev_gui_supply_drop ) && level.dev_gui_supply_drop != "random" ) - { - typekey = level.dev_gui_supply_drop; - } + if ( isdefined( level.dev_gui_supply_drop ) && level.dev_gui_supply_drop != "random" ) + typekey = level.dev_gui_supply_drop; #/ - return level.cratetypes[ category ][ typekey ]; + return level.cratetypes[category][typekey]; } -validate_crate_type( killstreak_name, weapon_name, crate_type_name ) //checked partially changed to match cerberus output see compiler_limitations.md No. 2 +validate_crate_type( killstreak_name, weapon_name, crate_type_name ) { - players = get_players(); - for ( i = 0; i < players.size; i++ ) - { - if ( isalive( players[ i ] ) ) - { - for ( j = 0; j < players[i].pers["killstreaks"].size; j++ ) - { - if ( players[ i ].pers[ "killstreaks" ][ j ] == killstreak_name ) - { - return 1; - } - } - primary_weapons = players[ i ] getweaponslistprimaries(); - for ( j = 0; j < primary_weapons.size; j++ ) - { - if ( primary_weapons[ j ] == weapon_name ) - { - return 1; - } - } - ents = getentarray( "weapon_" + weapon_name, "classname" ); - if ( isDefined( ents ) && ents.size > 0 ) - { - return 1; - } - crate_ents = getentarray( "care_package", "script_noteworthy" ); - for ( j = 0; j < crate_ents.size; j++ ) - { - if ( !isDefined( crate_ents[ j ].cratetype ) ) - { - } - else - { - if ( isDefined( crate_ents[ j ].cratetype.name ) ) - { - if ( crate_ents[ j ].cratetype.name == crate_type_name ) - { - return 1; - } - } - } - } - } - } - return 0; + players = get_players(); + + for ( i = 0; i < players.size; i++ ) + { + if ( isalive( players[i] ) ) + { + for ( j = 0; j < players[i].pers["killstreaks"].size; j++ ) + { + if ( players[i].pers["killstreaks"][j] == killstreak_name ) + return true; + } + + primary_weapons = players[i] getweaponslistprimaries(); + + for ( j = 0; j < primary_weapons.size; j++ ) + { + if ( primary_weapons[j] == weapon_name ) + return true; + } + + ents = getentarray( "weapon_" + weapon_name, "classname" ); + + if ( isdefined( ents ) && ents.size > 0 ) + return true; + + crate_ents = getentarray( "care_package", "script_noteworthy" ); + + for ( j = 0; j < crate_ents.size; j++ ) + { + if ( !isdefined( crate_ents[j].cratetype ) ) + continue; + + if ( isdefined( crate_ents[j].cratetype.name ) ) + { + if ( crate_ents[j].cratetype.name == crate_type_name ) + return true; + } + } + } + } + + return false; } -givecrateitem( crate ) //checked matches cerberus output +givecrateitem( crate ) { - if ( !isalive( self ) ) - { - return; - } - return [[ crate.cratetype.givefunction ]]( crate.cratetype.name ); + if ( !isalive( self ) ) + return; + + return [[ crate.cratetype.givefunction ]]( crate.cratetype.name ); } -givecratekillstreakwaiter( event, removecrate, extraendon ) //checked matches cerberus output +givecratekillstreakwaiter( event, removecrate, extraendon ) { - self endon( "give_crate_killstreak_done" ); - if ( isDefined( extraendon ) ) - { - self endon( extraendon ); - } - self waittill( event ); - self notify( "give_crate_killstreak_done" ); + self endon( "give_crate_killstreak_done" ); + + if ( isdefined( extraendon ) ) + self endon( extraendon ); + + self waittill( event ); + + self notify( "give_crate_killstreak_done", removecrate ); } -givecratekillstreak( killstreak ) //checked matches cerberus output +givecratekillstreak( killstreak ) { - self maps/mp/killstreaks/_killstreaks::givekillstreak( killstreak ); + self maps\mp\killstreaks\_killstreaks::givekillstreak( killstreak ); } -givespecializedcrateweapon( weapon ) //checked matches cerberus output +givespecializedcrateweapon( weapon ) { - switch( weapon ) - { - case "minigun_mp": - level thread maps/mp/_popups::displayteammessagetoall( &"KILLSTREAK_MINIGUN_INBOUND", self ); - level maps/mp/gametypes/_weapons::addlimitedweapon( weapon, self, 3 ); - break; - case "m32_mp": - level thread maps/mp/_popups::displayteammessagetoall( &"KILLSTREAK_M32_INBOUND", self ); - level maps/mp/gametypes/_weapons::addlimitedweapon( weapon, self, 3 ); - break; - case "m202_flash_mp": - level thread maps/mp/_popups::displayteammessagetoall( &"KILLSTREAK_M202_FLASH_INBOUND", self ); - level maps/mp/gametypes/_weapons::addlimitedweapon( weapon, self, 3 ); - break; - case "m220_tow_mp": - level thread maps/mp/_popups::displayteammessagetoall( &"KILLSTREAK_M220_TOW_INBOUND", self ); - level maps/mp/gametypes/_weapons::addlimitedweapon( weapon, self, 3 ); - break; - case "mp40_blinged_mp": - level thread maps/mp/_popups::displayteammessagetoall( &"KILLSTREAK_MP40_INBOUND", self ); - level maps/mp/gametypes/_weapons::addlimitedweapon( weapon, self, 3 ); - break; - default: - break; - } + switch ( weapon ) + { + case "minigun_mp": + level thread maps\mp\_popups::displayteammessagetoall( &"KILLSTREAK_MINIGUN_INBOUND", self ); + level maps\mp\gametypes\_weapons::addlimitedweapon( weapon, self, 3 ); + break; + case "m32_mp": + level thread maps\mp\_popups::displayteammessagetoall( &"KILLSTREAK_M32_INBOUND", self ); + level maps\mp\gametypes\_weapons::addlimitedweapon( weapon, self, 3 ); + break; + case "m202_flash_mp": + level thread maps\mp\_popups::displayteammessagetoall( &"KILLSTREAK_M202_FLASH_INBOUND", self ); + level maps\mp\gametypes\_weapons::addlimitedweapon( weapon, self, 3 ); + break; + case "m220_tow_mp": + level thread maps\mp\_popups::displayteammessagetoall( &"KILLSTREAK_M220_TOW_INBOUND", self ); + level maps\mp\gametypes\_weapons::addlimitedweapon( weapon, self, 3 ); + break; + case "mp40_blinged_mp": + level thread maps\mp\_popups::displayteammessagetoall( &"KILLSTREAK_MP40_INBOUND", self ); + level maps\mp\gametypes\_weapons::addlimitedweapon( weapon, self, 3 ); + break; + default: + break; + } } -givecrateweapon( weapon ) //checked changed to match cerberus output +givecrateweapon( weapon ) { - currentweapon = self getcurrentweapon(); - if ( currentweapon == weapon || self hasweapon( weapon ) ) - { - self givemaxammo( weapon ); - return 1; - } - if ( !issupplydropweapon( currentweapon ) || isDefined( level.grenade_array[ currentweapon ] ) || isDefined( level.inventory_array[ currentweapon ] ) ) - { - self takeweapon( self.lastdroppableweapon ); - self giveweapon( weapon ); - self switchtoweapon( weapon ); - return 1; - } - self addweaponstat( weapon, "used", 1 ); - givespecializedcrateweapon( weapon ); - self giveweapon( weapon ); - self switchtoweapon( weapon ); - self waittill( "weapon_change", newweapon ); - self maps/mp/killstreaks/_killstreak_weapons::usekillstreakweaponfromcrate( weapon ); - return 1; + currentweapon = self getcurrentweapon(); + + if ( currentweapon == weapon || self hasweapon( weapon ) ) + { + self givemaxammo( weapon ); + return true; + } + + if ( issupplydropweapon( currentweapon ) || isdefined( level.grenade_array[currentweapon] ) || isdefined( level.inventory_array[currentweapon] ) ) + { + self takeweapon( self.lastdroppableweapon ); + self giveweapon( weapon ); + self switchtoweapon( weapon ); + return true; + } + + self addweaponstat( weapon, "used", 1 ); + givespecializedcrateweapon( weapon ); + self giveweapon( weapon ); + self switchtoweapon( weapon ); + + self waittill( "weapon_change", newweapon ); + + self maps\mp\killstreaks\_killstreak_weapons::usekillstreakweaponfromcrate( weapon ); + return true; } -givecrateammo( ammo ) //checked partially changed to match cerberus output changed at own discretion see compiler_limitations.md No. 2 +givecrateammo( ammo ) { - weaponslist = self getweaponslist(); - idx = 0; - while ( idx < weaponslist.size ) - { - weapon = weaponslist[ idx ]; - if ( maps/mp/killstreaks/_killstreaks::iskillstreakweapon( weapon ) ) - { - continue; - } - switch( weapon ) - { - case "inventory_supplydrop_mp": - case "m202_flash_mp": - case "m220_tow_mp": - case "m32_mp": - case "minigun_mp": - case "mp40_blinged_mp": - case "supplydrop_mp": - break; - idx++; - continue; - case "bouncingbetty_mp": - case "claymore_mp": - case "frag_grenade_mp": - case "hatchet_mp": - case "satchel_charge_mp": - case "sticky_grenade_mp": - stock = self getweaponammostock( weapon ); - maxammo = self.grenadetypeprimarycount; - if ( !isDefined( maxammo ) ) - { - maxammo = 0; - } - if ( stock < maxammo ) - { - self setweaponammostock( weapon, maxammo ); - } - break; - case "concussion_grenade_mp": - case "emp_grenade_mp": - case "flash_grenade_mp": - case "nightingale_mp": - case "proximity_grenade_mp": - case "tabun_gas_mp": - case "willy_pete_mp": - stock = self getweaponammostock( weapon ); - maxammo = self.tacticalgrenadecount; - if ( !isDefined( maxammo ) ) - { - maxammo = 0; - } - if ( stock < maxammo ) - { - self setweaponammostock( weapon, maxammo ); - } - break; - default: - self givemaxammo( weapon ); - break; - } - idx++; - } + weaponslist = self getweaponslist(); + + for ( idx = 0; idx < weaponslist.size; idx++ ) + { + weapon = weaponslist[idx]; + + if ( maps\mp\killstreaks\_killstreaks::iskillstreakweapon( weapon ) ) + continue; + + switch ( weapon ) + { + case "supplydrop_mp": + case "mp40_blinged_mp": + case "minigun_mp": + case "m32_mp": + case "m220_tow_mp": + case "m202_flash_mp": + case "inventory_supplydrop_mp": + continue; + case "sticky_grenade_mp": + case "satchel_charge_mp": + case "hatchet_mp": + case "frag_grenade_mp": + case "claymore_mp": + case "bouncingbetty_mp": + stock = self getweaponammostock( weapon ); + maxammo = self.grenadetypeprimarycount; + + if ( !isdefined( maxammo ) ) + maxammo = 0; + + if ( stock < maxammo ) + self setweaponammostock( weapon, maxammo ); + + continue; + case "willy_pete_mp": + case "tabun_gas_mp": + case "proximity_grenade_mp": + case "nightingale_mp": + case "flash_grenade_mp": + case "emp_grenade_mp": + case "concussion_grenade_mp": + stock = self getweaponammostock( weapon ); + maxammo = self.tacticalgrenadecount; + + if ( !isdefined( maxammo ) ) + maxammo = 0; + + if ( stock < maxammo ) + self setweaponammostock( weapon, maxammo ); + + continue; + default: + self givemaxammo( weapon ); + continue; + } + } } -waitforgrenadefire() //checked matches cerberus output +waitforgrenadefire() { - self endon( "weapon_change" ); - self waittill( "grenade_fire" ); - return "grenade_fire"; + self endon( "weapon_change" ); + + self waittill( "grenade_fire" ); + + return "grenade_fire"; } -usesupplydropmarker( package_contents_id ) //checked matches cerberus output +usesupplydropmarker( package_contents_id ) { - self endon( "disconnect" ); - self endon( "spawned_player" ); - self thread supplydropwatcher( package_contents_id ); - self.supplygrenadedeathdrop = 0; - supplydropweapon = undefined; - currentweapon = self getcurrentweapon(); - prevweapon = currentweapon; - if ( issupplydropweapon( currentweapon ) ) - { - supplydropweapon = currentweapon; - } - notifystring = self waitforgrenadefire(); - if ( !isDefined( notifystring ) || notifystring != "grenade_fire" ) - { - return 0; - } - if ( !isDefined( supplydropweapon ) ) - { - return 0; - } - if ( isDefined( self ) ) - { - notifystring = self waittill_any_return( "weapon_change", "death" ); - self takeweapon( supplydropweapon ); - if ( self hasweapon( supplydropweapon ) || self getammocount( supplydropweapon ) ) - { - return 0; - } - } - return 1; + self endon( "disconnect" ); + self endon( "spawned_player" ); + self thread supplydropwatcher( package_contents_id ); + self.supplygrenadedeathdrop = 0; + supplydropweapon = undefined; + currentweapon = self getcurrentweapon(); + prevweapon = currentweapon; + + if ( issupplydropweapon( currentweapon ) ) + supplydropweapon = currentweapon; + + notifystring = self waitforgrenadefire(); + + if ( !isdefined( notifystring ) || notifystring != "grenade_fire" ) + return false; + + if ( !isdefined( supplydropweapon ) ) + return false; + + if ( isdefined( self ) ) + { + notifystring = self waittill_any_return( "weapon_change", "death" ); + self takeweapon( supplydropweapon ); + + if ( self hasweapon( supplydropweapon ) || self getammocount( supplydropweapon ) ) + return false; + } + + return true; } -issupplydropgrenadeallowed( hardpointtype, killstreakweapon ) //checked matches cerberus output +issupplydropgrenadeallowed( hardpointtype, killstreakweapon ) { - if ( !isDefined( killstreakweapon ) ) - { - killstreakweapon = hardpointtype; - } - if ( self maps/mp/killstreaks/_killstreakrules::iskillstreakallowed( hardpointtype, self.team ) == 0 ) - { - self switchtoweapon( self getlastweapon() ); - return 0; - } - return 1; + if ( !isdefined( killstreakweapon ) ) + killstreakweapon = hardpointtype; + + if ( self maps\mp\killstreaks\_killstreakrules::iskillstreakallowed( hardpointtype, self.team ) == 0 ) + { + self switchtoweapon( self getlastweapon() ); + return false; + } + + return true; } -usekillstreaksupplydrop( hardpointtype ) //checked matches cerberus output +usekillstreaksupplydrop( hardpointtype ) { - if ( self issupplydropgrenadeallowed( hardpointtype, "supplydrop_mp" ) == 0 ) - { - return 0; - } - result = self usesupplydropmarker(); - self notify( "supply_drop_marker_done" ); - if ( !isDefined( result ) || !result ) - { - return 0; - } - return result; + if ( self issupplydropgrenadeallowed( hardpointtype, "supplydrop_mp" ) == 0 ) + return 0; + + result = self usesupplydropmarker(); + self notify( "supply_drop_marker_done" ); + + if ( !isdefined( result ) || !result ) + return 0; + + return result; } -use_killstreak_death_machine( hardpointtype ) //checked changed to match cerberus output +use_killstreak_death_machine( hardpointtype ) { - if ( self maps/mp/killstreaks/_killstreakrules::iskillstreakallowed( hardpointtype, self.team ) == 0 ) - { - return 0; - } - weapon = "minigun_mp"; - currentweapon = self getcurrentweapon(); - if ( !issupplydropweapon( currentweapon ) || isDefined( level.grenade_array[ currentweapon ] ) || isDefined( level.inventory_array[ currentweapon ] ) ) - { - self takeweapon( self.lastdroppableweapon ); - self giveweapon( weapon ); - self switchtoweapon( weapon ); - self setblockweaponpickup( weapon, 1 ); - return 1; - } - level thread maps/mp/_popups::displayteammessagetoall( &"KILLSTREAK_MINIGUN_INBOUND", self ); - level maps/mp/gametypes/_weapons::addlimitedweapon( weapon, self, 3 ); - self takeweapon( currentweapon ); - self giveweapon( weapon ); - self switchtoweapon( weapon ); - self setblockweaponpickup( weapon, 1 ); - return 1; + if ( self maps\mp\killstreaks\_killstreakrules::iskillstreakallowed( hardpointtype, self.team ) == 0 ) + return false; + + weapon = "minigun_mp"; + currentweapon = self getcurrentweapon(); + + if ( issupplydropweapon( currentweapon ) || isdefined( level.grenade_array[currentweapon] ) || isdefined( level.inventory_array[currentweapon] ) ) + { + self takeweapon( self.lastdroppableweapon ); + self giveweapon( weapon ); + self switchtoweapon( weapon ); + self setblockweaponpickup( weapon, 1 ); + return true; + } + + level thread maps\mp\_popups::displayteammessagetoall( &"KILLSTREAK_MINIGUN_INBOUND", self ); + level maps\mp\gametypes\_weapons::addlimitedweapon( weapon, self, 3 ); + self takeweapon( currentweapon ); + self giveweapon( weapon ); + self switchtoweapon( weapon ); + self setblockweaponpickup( weapon, 1 ); + return true; } -use_killstreak_grim_reaper( hardpointtype ) //checked changed to match cerberus output +use_killstreak_grim_reaper( hardpointtype ) { - if ( self maps/mp/killstreaks/_killstreakrules::iskillstreakallowed( hardpointtype, self.team ) == 0 ) - { - return 0; - } - weapon = "m202_flash_mp"; - currentweapon = self getcurrentweapon(); - if ( !issupplydropweapon( currentweapon ) || isDefined( level.grenade_array[ currentweapon ] ) || isDefined( level.inventory_array[ currentweapon ] ) ) - { - self takeweapon( self.lastdroppableweapon ); - self giveweapon( weapon ); - self switchtoweapon( weapon ); - self setblockweaponpickup( weapon, 1 ); - return 1; - } - level thread maps/mp/_popups::displayteammessagetoall( &"KILLSTREAK_M202_FLASH_INBOUND", self ); - level maps/mp/gametypes/_weapons::addlimitedweapon( weapon, self, 3 ); - self takeweapon( currentweapon ); - self giveweapon( weapon ); - self switchtoweapon( weapon ); - self setblockweaponpickup( weapon, 1 ); - return 1; + if ( self maps\mp\killstreaks\_killstreakrules::iskillstreakallowed( hardpointtype, self.team ) == 0 ) + return false; + + weapon = "m202_flash_mp"; + currentweapon = self getcurrentweapon(); + + if ( issupplydropweapon( currentweapon ) || isdefined( level.grenade_array[currentweapon] ) || isdefined( level.inventory_array[currentweapon] ) ) + { + self takeweapon( self.lastdroppableweapon ); + self giveweapon( weapon ); + self switchtoweapon( weapon ); + self setblockweaponpickup( weapon, 1 ); + return true; + } + + level thread maps\mp\_popups::displayteammessagetoall( &"KILLSTREAK_M202_FLASH_INBOUND", self ); + level maps\mp\gametypes\_weapons::addlimitedweapon( weapon, self, 3 ); + self takeweapon( currentweapon ); + self giveweapon( weapon ); + self switchtoweapon( weapon ); + self setblockweaponpickup( weapon, 1 ); + return true; } -use_killstreak_tv_guided_missile( hardpointtype ) //checked changed to match cerberus output +use_killstreak_tv_guided_missile( hardpointtype ) { - if ( maps/mp/killstreaks/_killstreakrules::iskillstreakallowed( hardpointtype, self.team ) == 0 ) - { - self iprintlnbold( level.killstreaks[ hardpointtype ].notavailabletext ); - return 0; - } - weapon = "m220_tow_mp"; - currentweapon = self getcurrentweapon(); - if ( !issupplydropweapon( currentweapon ) || isDefined( level.grenade_array[ currentweapon ] ) || isDefined( level.inventory_array[ currentweapon ] ) ) - { - self takeweapon( self.lastdroppableweapon ); - self giveweapon( weapon ); - self switchtoweapon( weapon ); - self setblockweaponpickup( weapon, 1 ); - return 1; - } - level thread maps/mp/_popups::displayteammessagetoall( &"KILLSTREAK_M220_TOW_INBOUND", self ); - level maps/mp/gametypes/_weapons::addlimitedweapon( weapon, self, 3 ); - self takeweapon( currentweapon ); - self giveweapon( weapon ); - self switchtoweapon( weapon ); - self setblockweaponpickup( weapon, 1 ); - return 1; + if ( maps\mp\killstreaks\_killstreakrules::iskillstreakallowed( hardpointtype, self.team ) == 0 ) + { + self iprintlnbold( level.killstreaks[hardpointtype].notavailabletext ); + return false; + } + + weapon = "m220_tow_mp"; + currentweapon = self getcurrentweapon(); + + if ( issupplydropweapon( currentweapon ) || isdefined( level.grenade_array[currentweapon] ) || isdefined( level.inventory_array[currentweapon] ) ) + { + self takeweapon( self.lastdroppableweapon ); + self giveweapon( weapon ); + self switchtoweapon( weapon ); + self setblockweaponpickup( weapon, 1 ); + return true; + } + + level thread maps\mp\_popups::displayteammessagetoall( &"KILLSTREAK_M220_TOW_INBOUND", self ); + level maps\mp\gametypes\_weapons::addlimitedweapon( weapon, self, 3 ); + self takeweapon( currentweapon ); + self giveweapon( weapon ); + self switchtoweapon( weapon ); + self setblockweaponpickup( weapon, 1 ); + return true; } -use_killstreak_mp40( hardpointtype ) //checked changed to match cerberus output +use_killstreak_mp40( hardpointtype ) { - if ( maps/mp/killstreaks/_killstreakrules::iskillstreakallowed( hardpointtype, self.team ) == 0 ) - { - self iprintlnbold( level.killstreaks[ hardpointtype ].notavailabletext ); - return 0; - } - weapon = "mp40_blinged_mp"; - currentweapon = self getcurrentweapon(); - if ( !issupplydropweapon( currentweapon ) || isDefined( level.grenade_array[ currentweapon ] ) || isDefined( level.inventory_array[ currentweapon ] ) ) - { - self takeweapon( self.lastdroppableweapon ); - self giveweapon( weapon ); - self switchtoweapon( weapon ); - self setblockweaponpickup( weapon, 1 ); - return 1; - } - level thread maps/mp/_popups::displayteammessagetoall( &"KILLSTREAK_MP40_INBOUND", self ); - level maps/mp/gametypes/_weapons::addlimitedweapon( weapon, self, 3 ); - self takeweapon( currentweapon ); - self giveweapon( weapon ); - self switchtoweapon( weapon ); - self setblockweaponpickup( weapon, 1 ); - return 1; + if ( maps\mp\killstreaks\_killstreakrules::iskillstreakallowed( hardpointtype, self.team ) == 0 ) + { + self iprintlnbold( level.killstreaks[hardpointtype].notavailabletext ); + return false; + } + + weapon = "mp40_blinged_mp"; + currentweapon = self getcurrentweapon(); + + if ( issupplydropweapon( currentweapon ) || isdefined( level.grenade_array[currentweapon] ) || isdefined( level.inventory_array[currentweapon] ) ) + { + self takeweapon( self.lastdroppableweapon ); + self giveweapon( weapon ); + self switchtoweapon( weapon ); + self setblockweaponpickup( weapon, 1 ); + return true; + } + + level thread maps\mp\_popups::displayteammessagetoall( &"KILLSTREAK_MP40_INBOUND", self ); + level maps\mp\gametypes\_weapons::addlimitedweapon( weapon, self, 3 ); + self takeweapon( currentweapon ); + self giveweapon( weapon ); + self switchtoweapon( weapon ); + self setblockweaponpickup( weapon, 1 ); + return true; } -cleanupwatcherondeath( team, killstreak_id ) //checked matches cerberus output +cleanupwatcherondeath( team, killstreak_id ) { - self endon( "disconnect" ); - self endon( "supplyDropWatcher" ); - self endon( "grenade_fire" ); - self endon( "spawned_player" ); - self endon( "weapon_change" ); - self waittill( "death" ); - maps/mp/killstreaks/_killstreakrules::killstreakstop( "supply_drop_mp", team, killstreak_id ); + self endon( "disconnect" ); + self endon( "supplyDropWatcher" ); + self endon( "grenade_fire" ); + self endon( "spawned_player" ); + self endon( "weapon_change" ); + + self waittill( "death" ); + + maps\mp\killstreaks\_killstreakrules::killstreakstop( "supply_drop_mp", team, killstreak_id ); } -supplydropwatcher( package_contents_id ) //checked matches cerberus output +supplydropwatcher( package_contents_id ) { - self notify( "supplyDropWatcher" ); - self endon( "supplyDropWatcher" ); - self endon( "spawned_player" ); - self endon( "disconnect" ); - self endon( "weapon_change" ); - team = self.team; - killstreak_id = maps/mp/killstreaks/_killstreakrules::killstreakstart( "supply_drop_mp", team, 0, 0 ); - if ( killstreak_id == -1 ) - { - return; - } - self thread checkforemp(); - self thread checkweaponchange( team, killstreak_id ); - self thread cleanupwatcherondeath( team, killstreak_id ); - self waittill( "grenade_fire", weapon, weapname ); - if ( isDefined( self ) && issupplydropweapon( weapname ) ) - { - self thread dosupplydrop( weapon, weapname, self, killstreak_id, package_contents_id ); - weapon thread do_supply_drop_detonation( weapname, self ); - weapon thread supplydropgrenadetimeout( team, killstreak_id, weapname ); - self maps/mp/killstreaks/_killstreaks::switchtolastnonkillstreakweapon(); - } - else - { - maps/mp/killstreaks/_killstreakrules::killstreakstop( "supply_drop_mp", team, killstreak_id ); - } + self notify( "supplyDropWatcher" ); + self endon( "supplyDropWatcher" ); + self endon( "spawned_player" ); + self endon( "disconnect" ); + self endon( "weapon_change" ); + team = self.team; + killstreak_id = maps\mp\killstreaks\_killstreakrules::killstreakstart( "supply_drop_mp", team, 0, 0 ); + + if ( killstreak_id == -1 ) + return; + + self thread checkforemp(); + self thread checkweaponchange( team, killstreak_id ); + self thread cleanupwatcherondeath( team, killstreak_id ); + + self waittill( "grenade_fire", weapon, weapname ); + + if ( isdefined( self ) && issupplydropweapon( weapname ) ) + { + self thread dosupplydrop( weapon, weapname, self, killstreak_id, package_contents_id ); + weapon thread do_supply_drop_detonation( weapname, self ); + weapon thread supplydropgrenadetimeout( team, killstreak_id, weapname ); + self maps\mp\killstreaks\_killstreaks::switchtolastnonkillstreakweapon(); + } + else + maps\mp\killstreaks\_killstreakrules::killstreakstop( "supply_drop_mp", team, killstreak_id ); } -checkforemp() //checked matches cerberus output +checkforemp() { - self endon( "supplyDropWatcher" ); - self endon( "spawned_player" ); - self endon( "disconnect" ); - self endon( "weapon_change" ); - self endon( "death" ); - self endon( "grenade_fire" ); - self waittill( "emp_jammed" ); - self maps/mp/killstreaks/_killstreaks::switchtolastnonkillstreakweapon(); + self endon( "supplyDropWatcher" ); + self endon( "spawned_player" ); + self endon( "disconnect" ); + self endon( "weapon_change" ); + self endon( "death" ); + self endon( "grenade_fire" ); + + self waittill( "emp_jammed" ); + + self maps\mp\killstreaks\_killstreaks::switchtolastnonkillstreakweapon(); } -supplydropgrenadetimeout( team, killstreak_id, weapname ) //checked changed to match cerberus output +supplydropgrenadetimeout( team, killstreak_id, weapname ) { - self endon( "death" ); - self endon( "stationary" ); - grenade_lifetime = 10; - wait grenade_lifetime; - if ( !isDefined( self ) ) - { - return; - } - self notify( "grenade_timeout" ); - maps/mp/killstreaks/_killstreakrules::killstreakstop( "supply_drop_mp", team, killstreak_id ); - if ( weapname == "ai_tank_drop_mp" ) - { - maps/mp/killstreaks/_killstreakrules::killstreakstop( "ai_tank_drop_mp", team, killstreak_id ); - } - else if ( weapname == "inventory_ai_tank_drop_mp" ) - { - maps/mp/killstreaks/_killstreakrules::killstreakstop( "inventory_ai_tank_drop_mp", team, killstreak_id ); - } - self delete(); + self endon( "death" ); + self endon( "stationary" ); + grenade_lifetime = 10; + wait( grenade_lifetime ); + + if ( !isdefined( self ) ) + return; + + self notify( "grenade_timeout" ); + maps\mp\killstreaks\_killstreakrules::killstreakstop( "supply_drop_mp", team, killstreak_id ); + + if ( weapname == "ai_tank_drop_mp" ) + maps\mp\killstreaks\_killstreakrules::killstreakstop( "ai_tank_drop_mp", team, killstreak_id ); + else if ( weapname == "inventory_ai_tank_drop_mp" ) + maps\mp\killstreaks\_killstreakrules::killstreakstop( "inventory_ai_tank_drop_mp", team, killstreak_id ); + + self delete(); } -checkweaponchange( team, killstreak_id ) //checked matches cerberus output +checkweaponchange( team, killstreak_id ) { - self endon( "supplyDropWatcher" ); - self endon( "spawned_player" ); - self endon( "disconnect" ); - self endon( "grenade_fire" ); - self endon( "death" ); - self waittill( "weapon_change" ); - maps/mp/killstreaks/_killstreakrules::killstreakstop( "supply_drop_mp", team, killstreak_id ); + self endon( "supplyDropWatcher" ); + self endon( "spawned_player" ); + self endon( "disconnect" ); + self endon( "grenade_fire" ); + self endon( "death" ); + + self waittill( "weapon_change" ); + + maps\mp\killstreaks\_killstreakrules::killstreakstop( "supply_drop_mp", team, killstreak_id ); } -supplydropgrenadepullwatcher( killstreak_id ) //checked matches cerberus output +supplydropgrenadepullwatcher( killstreak_id ) { - self endon( "disconnect" ); - self endon( "weapon_change" ); - self waittill( "grenade_pullback", weapon ); - self _disableusability(); - self thread watchforgrenadeputdown(); - self waittill( "death" ); - killstreak = "supply_drop_mp"; - self.supplygrenadedeathdrop = 1; - if ( issupplydropweapon( weapon ) ) - { - killstreak = maps/mp/killstreaks/_killstreaks::getkillstreakforweapon( weapon ); - } - if ( !isDefined( self.usingkillstreakfrominventory ) || self.usingkillstreakfrominventory == 0 ) - { - self changekillstreakquantity( weapon, -1 ); - } - else - { - maps/mp/killstreaks/_killstreaks::removeusedkillstreak( killstreak, killstreak_id ); - } + self endon( "disconnect" ); + self endon( "weapon_change" ); + + self waittill( "grenade_pullback", weapon ); + + self _disableusability(); + self thread watchforgrenadeputdown(); + + self waittill( "death" ); + + killstreak = "supply_drop_mp"; + self.supplygrenadedeathdrop = 1; + + if ( issupplydropweapon( weapon ) ) + killstreak = maps\mp\killstreaks\_killstreaks::getkillstreakforweapon( weapon ); + + if ( !isdefined( self.usingkillstreakfrominventory ) || self.usingkillstreakfrominventory == 0 ) + self changekillstreakquantity( weapon, -1 ); + else + maps\mp\killstreaks\_killstreaks::removeusedkillstreak( killstreak, killstreak_id ); } -watchforgrenadeputdown() //checked matches cerberus output +watchforgrenadeputdown() { - self notify( "watchForGrenadePutDown" ); - self endon( "watchForGrenadePutDown" ); - self endon( "death" ); - self endon( "disconnect" ); - self waittill_any( "grenade_fire", "weapon_change" ); - self _enableusability(); + self notify( "watchForGrenadePutDown" ); + self endon( "watchForGrenadePutDown" ); + self endon( "death" ); + self endon( "disconnect" ); + self waittill_any( "grenade_fire", "weapon_change" ); + self _enableusability(); } -abortsupplydropmarkerwaiter( waittillstring ) //checked matches cerberus output +abortsupplydropmarkerwaiter( waittillstring ) { - self endon( "supply_drop_marker_done" ); - self waittill( waittillstring ); - self notify( "supply_drop_marker_done" ); + self endon( "supply_drop_marker_done" ); + + self waittill( waittillstring ); + + self notify( "supply_drop_marker_done" ); } -playerchangeweaponwaiter() //checked matches cerberus output +playerchangeweaponwaiter() { - self endon( "supply_drop_marker_done" ); - self endon( "disconnect" ); - self endon( "spawned_player" ); - currentweapon = self getcurrentweapon(); - while ( issupplydropweapon( currentweapon ) ) - { - self waittill( "weapon_change", currentweapon ); - } - waittillframeend; - self notify( "supply_drop_marker_done" ); + self endon( "supply_drop_marker_done" ); + self endon( "disconnect" ); + self endon( "spawned_player" ); + currentweapon = self getcurrentweapon(); + + while ( issupplydropweapon( currentweapon ) ) + self waittill( "weapon_change", currentweapon ); + + waittillframeend; + self notify( "supply_drop_marker_done" ); } -issupplydropweapon( weapon ) //checked converted to switch for my sanity +issupplydropweapon( weapon ) { - switch ( weapon ) - { - case "supplystation_mp": - case "supplydrop_mp": - case "inventory_supplydrop_mp": - case "turret_drop_mp": - case "ai_tank_drop_mp": - case "inventory_ai_tank_drop_mp": - case "minigun_drop_mp": - case "inventory_minigun_drop_mp": - case "m32_drop_mp": - case "inventory_m32_drop_mp": - case "tow_turret_drop_mp": - case "m220_tow_drop_mp": - return 1; - default: - return 0; - } + if ( weapon == "supplystation_mp" || weapon == "supplydrop_mp" || weapon == "inventory_supplydrop_mp" || weapon == "turret_drop_mp" || weapon == "ai_tank_drop_mp" || weapon == "inventory_ai_tank_drop_mp" || weapon == "minigun_drop_mp" || weapon == "inventory_minigun_drop_mp" || weapon == "m32_drop_mp" || weapon == "inventory_m32_drop_mp" || weapon == "tow_turret_drop_mp" || weapon == "m220_tow_drop_mp" ) + return true; + + return false; } -geticonforcrate() //checked matches cerberus output +geticonforcrate() { - icon = undefined; - switch( self.cratetype.type ) - { - case "killstreak": - if ( self.cratetype.name == "inventory_ai_tank_drop_mp" ) - { - icon = "hud_ks_ai_tank"; - } - else - { - killstreak = maps/mp/killstreaks/_killstreaks::getkillstreakmenuname( self.cratetype.name ); - icon = level.killstreakicons[ killstreak ]; - } - break; - case "weapon": - switch( self.cratetype.name ) - { - case "minigun_mp": - icon = "hud_ks_minigun"; - break; - case "m32_mp": - icon = "hud_ks_m32"; - break; - case "m202_flash_mp": - icon = "hud_ks_m202"; - break; - case "m220_tow_mp": - icon = "hud_ks_tv_guided_missile"; - break; - case "mp40_drop_mp": - icon = "hud_mp40"; - break; - default: - icon = "waypoint_recon_artillery_strike"; - break; - } - break; - case "ammo": - icon = "hud_ammo_refill"; - break; - default: - return undefined; - } - return icon + "_drop"; // may not be right but seems logical :/ + icon = undefined; + + switch ( self.cratetype.type ) + { + case "killstreak": + if ( self.cratetype.name == "inventory_ai_tank_drop_mp" ) + icon = "hud_ks_ai_tank"; + else + { + killstreak = maps\mp\killstreaks\_killstreaks::getkillstreakmenuname( self.cratetype.name ); + icon = level.killstreakicons[killstreak]; + } + + asm_jump( loc_5A1C ); + case "weapon": + switch ( self.cratetype.name ) + { + case "minigun_mp": + icon = "hud_ks_minigun"; + break; + case "m32_mp": + icon = "hud_ks_m32"; + break; + case "m202_flash_mp": + icon = "hud_ks_m202"; + break; + case "m220_tow_mp": + icon = "hud_ks_tv_guided_missile"; + break; + case "mp40_drop_mp": + icon = "hud_mp40"; + break; + default: + icon = "waypoint_recon_artillery_strike"; + break; + } + + break; + case "ammo": + icon = "hud_ammo_refill"; + break; + default: + return undefined; + break; + } + + return icon + "_drop"; } -crateactivate( hacker ) //checked partially changed to match cerberus output see compiler_limitations.md No. 2 +crateactivate( hacker ) { - self makeusable(); - self setcursorhint( "HINT_NOICON" ); - self sethintstring( self.cratetype.hint ); - if ( isDefined( self.cratetype.hint_gambler ) ) - { - self sethintstringforperk( "specialty_showenemyequipment", self.cratetype.hint_gambler ); - } - crateobjid = maps/mp/gametypes/_gameobjects::getnextobjid(); - objective_add( crateobjid, "invisible", self.origin ); - objective_icon( crateobjid, "compass_supply_drop_green" ); - objective_state( crateobjid, "active" ); - self.friendlyobjid = crateobjid; - self.enemyobjid = []; - icon = self geticonforcrate(); - if ( isDefined( hacker ) ) - { - self thread attachreconmodel( level.cratemodelhacker, hacker ); - } - if ( level.teambased ) - { - objective_team( crateobjid, self.team ); - foreach ( team in level.teams ) - { - if ( self.team == team ) - { - } - else - { - crateobjid = maps/mp/gametypes/_gameobjects::getnextobjid(); - objective_add( crateobjid, "invisible", self.origin ); - if ( isDefined( self.hacker ) ) - { - objective_icon( crateobjid, "compass_supply_drop_black" ); - } - else - { - objective_icon( crateobjid, "compass_supply_drop_red" ); - } - objective_team( crateobjid, team ); - objective_state( crateobjid, "active" ); - self.enemyobjid[ self.enemyobjid.size ] = crateobjid; - } - } - } - else if ( !self.visibletoall ) - { - objective_setinvisibletoall( crateobjid ); - enemycrateobjid = maps/mp/gametypes/_gameobjects::getnextobjid(); - objective_add( enemycrateobjid, "invisible", self.origin ); - objective_icon( enemycrateobjid, "compass_supply_drop_red" ); - objective_state( enemycrateobjid, "active" ); - if ( isplayer( self.owner ) ) - { - objective_setinvisibletoplayer( enemycrateobjid, self.owner ); - } - self.enemyobjid[ self.enemyobjid.size ] = enemycrateobjid; - } - if ( isplayer( self.owner ) ) - { - objective_setvisibletoplayer( crateobjid, self.owner ); - } - if ( isDefined( self.hacker ) ) - { - objective_setinvisibletoplayer( crateobjid, self.hacker ); - crateobjid = maps/mp/gametypes/_gameobjects::getnextobjid(); - objective_add( crateobjid, "invisible", self.origin ); - objective_icon( crateobjid, "compass_supply_drop_black" ); - objective_state( crateobjid, "active" ); - objective_setinvisibletoall( crateobjid ); - objective_setvisibletoplayer( crateobjid, self.hacker ); - self.hackerobjid = crateobjid; - } - if ( !self.visibletoall && isDefined( icon ) ) - { - self thread maps/mp/_entityheadicons::setentityheadicon( self.team, self, level.crate_headicon_offset, icon, 1 ); - } - if ( isDefined( self.owner ) && isplayer( self.owner ) && self.owner is_bot() ) - { - self.owner notify( "bot_crate_landed" ); - } - if ( isDefined( self.owner ) ) - { - self.owner notify( "crate_landed" ); - } + self makeusable(); + self setcursorhint( "HINT_NOICON" ); + self sethintstring( self.cratetype.hint ); + + if ( isdefined( self.cratetype.hint_gambler ) ) + self sethintstringforperk( "specialty_showenemyequipment", self.cratetype.hint_gambler ); + + crateobjid = maps\mp\gametypes\_gameobjects::getnextobjid(); + objective_add( crateobjid, "invisible", self.origin ); + objective_icon( crateobjid, "compass_supply_drop_green" ); + objective_state( crateobjid, "active" ); + self.friendlyobjid = crateobjid; + self.enemyobjid = []; + icon = self geticonforcrate(); + + if ( isdefined( hacker ) ) + self thread attachreconmodel( level.cratemodelhacker, hacker ); + + if ( level.teambased ) + { + objective_team( crateobjid, self.team ); + + foreach ( team in level.teams ) + { + if ( self.team == team ) + continue; + + crateobjid = maps\mp\gametypes\_gameobjects::getnextobjid(); + objective_add( crateobjid, "invisible", self.origin ); + + if ( isdefined( self.hacker ) ) + objective_icon( crateobjid, "compass_supply_drop_black" ); + else + objective_icon( crateobjid, "compass_supply_drop_red" ); + + objective_team( crateobjid, team ); + objective_state( crateobjid, "active" ); + self.enemyobjid[self.enemyobjid.size] = crateobjid; + } + } + else + { + if ( !self.visibletoall ) + { + objective_setinvisibletoall( crateobjid ); + enemycrateobjid = maps\mp\gametypes\_gameobjects::getnextobjid(); + objective_add( enemycrateobjid, "invisible", self.origin ); + objective_icon( enemycrateobjid, "compass_supply_drop_red" ); + objective_state( enemycrateobjid, "active" ); + + if ( isplayer( self.owner ) ) + objective_setinvisibletoplayer( enemycrateobjid, self.owner ); + + self.enemyobjid[self.enemyobjid.size] = enemycrateobjid; + } + + if ( isplayer( self.owner ) ) + objective_setvisibletoplayer( crateobjid, self.owner ); + + if ( isdefined( self.hacker ) ) + { + objective_setinvisibletoplayer( crateobjid, self.hacker ); + crateobjid = maps\mp\gametypes\_gameobjects::getnextobjid(); + objective_add( crateobjid, "invisible", self.origin ); + objective_icon( crateobjid, "compass_supply_drop_black" ); + objective_state( crateobjid, "active" ); + objective_setinvisibletoall( crateobjid ); + objective_setvisibletoplayer( crateobjid, self.hacker ); + self.hackerobjid = crateobjid; + } + } + + if ( !self.visibletoall && isdefined( icon ) ) + self thread maps\mp\_entityheadicons::setentityheadicon( self.team, self, level.crate_headicon_offset, icon, 1 ); + + if ( isdefined( self.owner ) && isplayer( self.owner ) && self.owner is_bot() ) + self.owner notify( "bot_crate_landed", self ); + + if ( isdefined( self.owner ) ) + self.owner notify( "crate_landed", self ); } -cratedeactivate() //checked changed to match cerberus output +cratedeactivate() { - self makeunusable(); - if ( isDefined( self.friendlyobjid ) ) - { - objective_delete( self.friendlyobjid ); - maps/mp/gametypes/_gameobjects::releaseobjid( self.friendlyobjid ); - self.friendlyobjid = undefined; - } - if ( isDefined( self.enemyobjid ) ) - { - foreach ( objid in self.enemyobjid ) - { - objective_delete( objid ); - maps/mp/gametypes/_gameobjects::releaseobjid( objid ); - } - self.enemyobjid = []; - } - if ( isDefined( self.hackerobjid ) ) - { - objective_delete( self.hackerobjid ); - maps/mp/gametypes/_gameobjects::releaseobjid( self.hackerobjid ); - self.hackerobjid = undefined; - } + self makeunusable(); + + if ( isdefined( self.friendlyobjid ) ) + { + objective_delete( self.friendlyobjid ); + maps\mp\gametypes\_gameobjects::releaseobjid( self.friendlyobjid ); + self.friendlyobjid = undefined; + } + + if ( isdefined( self.enemyobjid ) ) + { + foreach ( objid in self.enemyobjid ) + { + objective_delete( objid ); + maps\mp\gametypes\_gameobjects::releaseobjid( objid ); + } + + self.enemyobjid = []; + } + + if ( isdefined( self.hackerobjid ) ) + { + objective_delete( self.hackerobjid ); + maps\mp\gametypes\_gameobjects::releaseobjid( self.hackerobjid ); + self.hackerobjid = undefined; + } } -ownerteamchangewatcher() //checked matches cerberus output +ownerteamchangewatcher() { - self endon( "death" ); - if ( !level.teambased || !isDefined( self.owner ) ) - { - return; - } - self.owner waittill( "joined_team" ); - self.owner = undefined; + self endon( "death" ); + + if ( !level.teambased || !isdefined( self.owner ) ) + return; + + self.owner waittill( "joined_team" ); + + self.owner = undefined; } -dropalltoground( origin, radius, stickyobjectradius ) //checked matches cerberus output +dropalltoground( origin, radius, stickyobjectradius ) { - physicsexplosionsphere( origin, radius, radius, 0 ); - wait 0.05; - maps/mp/gametypes/_weapons::dropweaponstoground( origin, radius ); - maps/mp/killstreaks/_supplydrop::dropcratestoground( origin, radius ); - level notify( "drop_objects_to_ground" ); + physicsexplosionsphere( origin, radius, radius, 0 ); + wait 0.05; + maps\mp\gametypes\_weapons::dropweaponstoground( origin, radius ); + maps\mp\killstreaks\_supplydrop::dropcratestoground( origin, radius ); + level notify( "drop_objects_to_ground", origin, stickyobjectradius ); } -dropeverythingtouchingcrate( origin ) //checked matches cerberus output +dropeverythingtouchingcrate( origin ) { - dropalltoground( origin, 70, 70 ); + dropalltoground( origin, 70, 70 ); } -dropalltogroundaftercratedelete( crate, crate_origin ) //checked matches cerberus output +dropalltogroundaftercratedelete( crate, crate_origin ) { - crate waittill( "death" ); - wait 0.1; - crate dropeverythingtouchingcrate( crate_origin ); + crate waittill( "death" ); + + wait 0.1; + crate dropeverythingtouchingcrate( crate_origin ); } -dropcratestoground( origin, radius ) //checked changed to match cerberus output +dropcratestoground( origin, radius ) { - crate_ents = getentarray( "care_package", "script_noteworthy" ); - radius_sq = radius * radius; - for ( i = 0; i < crate_ents.size; i++ ) - { - if ( distancesquared( origin, crate_ents[ i ].origin ) < radius_sq ) - { - crate_ents[ i ] thread dropcratetoground(); - } - } + crate_ents = getentarray( "care_package", "script_noteworthy" ); + radius_sq = radius * radius; + + for ( i = 0; i < crate_ents.size; i++ ) + { + if ( distancesquared( origin, crate_ents[i].origin ) < radius_sq ) + crate_ents[i] thread dropcratetoground(); + } } dropcratetoground() { - self endon( "death" ); - if ( isDefined( self.droppingtoground ) ) - { - return; - } - self.droppingtoground = 1; - dropeverythingtouchingcrate( self.origin ); - self cratedeactivate(); - self thread cratedroptogroundkill(); - self crateredophysics(); - self crateactivate(); - self.droppingtoground = undefined; + self endon( "death" ); + + if ( isdefined( self.droppingtoground ) ) + return; + + self.droppingtoground = 1; + dropeverythingtouchingcrate( self.origin ); + self cratedeactivate(); + self thread cratedroptogroundkill(); + self crateredophysics(); + self crateactivate(); + self.droppingtoground = undefined; } -cratespawn( category, owner, team, drop_origin, drop_angle ) //checked matches cerberus output +cratespawn( category, owner, team, drop_origin, drop_angle ) { - crate = spawn( "script_model", drop_origin, 1 ); - crate.angles = drop_angle; - crate.team = team; - crate.visibletoall = 0; - crate setteam( team ); - if ( isplayer( owner ) ) - { - crate setowner( owner ); - } - crate.script_noteworthy = "care_package"; - if ( !level.teambased || isDefined( owner ) && owner.team == team ) - { - crate.owner = owner; - } - crate thread ownerteamchangewatcher(); - if ( category == "ai_tank_drop_mp" || category == "inventory_ai_tank_drop_mp" ) - { - crate setmodel( level.cratemodeltank ); - crate setenemymodel( level.cratemodeltank ); - } - else - { - crate setmodel( level.cratemodelfriendly ); - crate setenemymodel( level.cratemodelenemy ); - } - switch( category ) - { - case "turret_drop_mp": - crate.cratetype = level.cratetypes[ category ][ "autoturret_mp" ]; - break; - case "tow_turret_drop_mp": - crate.cratetype = level.cratetypes[ category ][ "auto_tow_mp" ]; - break; - case "m220_tow_drop_mp": - crate.cratetype = level.cratetypes[ category ][ "m220_tow_mp" ]; - break; - case "ai_tank_drop_mp": - case "inventory_ai_tank_drop_mp": - crate.cratetype = level.cratetypes[ category ][ "ai_tank_mp" ]; - break; - case "inventory_minigun_drop_mp": - case "minigun_drop_mp": - crate.cratetype = level.cratetypes[ category ][ "minigun_mp" ]; - break; - case "inventory_m32_drop_mp": - case "m32_drop_mp": - crate.cratetype = level.cratetypes[ category ][ "m32_mp" ]; - break; - default: - crate.cratetype = getrandomcratetype( category ); - break; - } - return crate; + crate = spawn( "script_model", drop_origin, 1 ); + crate.angles = drop_angle; + crate.team = team; + crate.visibletoall = 0; + crate setteam( team ); + + if ( isplayer( owner ) ) + crate setowner( owner ); + + crate.script_noteworthy = "care_package"; + + if ( !level.teambased || isdefined( owner ) && owner.team == team ) + crate.owner = owner; + + crate thread ownerteamchangewatcher(); + + if ( category == "ai_tank_drop_mp" || category == "inventory_ai_tank_drop_mp" ) + { + crate setmodel( level.cratemodeltank ); + crate setenemymodel( level.cratemodeltank ); + } + else + { + crate setmodel( level.cratemodelfriendly ); + crate setenemymodel( level.cratemodelenemy ); + } + + switch ( category ) + { + case "turret_drop_mp": + crate.cratetype = level.cratetypes[category]["autoturret_mp"]; + break; + case "tow_turret_drop_mp": + crate.cratetype = level.cratetypes[category]["auto_tow_mp"]; + break; + case "m220_tow_drop_mp": + crate.cratetype = level.cratetypes[category]["m220_tow_mp"]; + break; + case "inventory_ai_tank_drop_mp": + case "ai_tank_drop_mp": + crate.cratetype = level.cratetypes[category]["ai_tank_mp"]; + break; + case "minigun_drop_mp": + case "inventory_minigun_drop_mp": + crate.cratetype = level.cratetypes[category]["minigun_mp"]; + break; + case "m32_drop_mp": + case "inventory_m32_drop_mp": + crate.cratetype = level.cratetypes[category]["m32_mp"]; + break; + default: + crate.cratetype = getrandomcratetype( category ); + break; + } + + return crate; } -cratedelete( drop_all_to_ground ) //checked changed to match cerberus output +cratedelete( drop_all_to_ground ) { - if ( !isDefined( drop_all_to_ground ) ) - { - drop_all_to_ground = 1; - } - if ( isDefined( self.friendlyobjid ) ) - { - objective_delete( self.friendlyobjid ); - maps/mp/gametypes/_gameobjects::releaseobjid( self.friendlyobjid ); - self.friendlyobjid = undefined; - } - if ( isDefined( self.enemyobjid ) ) - { - foreach ( objid in self.enemyobjid ) - { - objective_delete( objid ); - maps/mp/gametypes/_gameobjects::releaseobjid( objid ); - } - self.enemyobjid = undefined; - } - if ( isDefined( self.hackerobjid ) ) - { - objective_delete( self.hackerobjid ); - maps/mp/gametypes/_gameobjects::releaseobjid( self.hackerobjid ); - self.hackerobjid = undefined; - } - if ( drop_all_to_ground ) - { - level thread dropalltogroundaftercratedelete( self, self.origin ); - } - if ( isDefined( self.killcament ) ) - { - self.killcament thread deleteaftertime( 5 ); - } - self delete(); + if ( !isdefined( drop_all_to_ground ) ) + drop_all_to_ground = 1; + + if ( isdefined( self.friendlyobjid ) ) + { + objective_delete( self.friendlyobjid ); + maps\mp\gametypes\_gameobjects::releaseobjid( self.friendlyobjid ); + self.friendlyobjid = undefined; + } + + if ( isdefined( self.enemyobjid ) ) + { + foreach ( objid in self.enemyobjid ) + { + objective_delete( objid ); + maps\mp\gametypes\_gameobjects::releaseobjid( objid ); + } + + self.enemyobjid = undefined; + } + + if ( isdefined( self.hackerobjid ) ) + { + objective_delete( self.hackerobjid ); + maps\mp\gametypes\_gameobjects::releaseobjid( self.hackerobjid ); + self.hackerobjid = undefined; + } + + if ( drop_all_to_ground ) + level thread dropalltogroundaftercratedelete( self, self.origin ); + + if ( isdefined( self.killcament ) ) + self.killcament thread deleteaftertime( 5 ); + + self delete(); } -timeoutcratewaiter() //checked matches cerberus output +timeoutcratewaiter() { - self endon( "death" ); - self endon( "stationary" ); - wait 20; - self cratedelete(); + self endon( "death" ); + self endon( "stationary" ); + wait 20; + self cratedelete(); } -cratephysics() //checked matches cerberus output +cratephysics() { - forcepointvariance = 200; - vertvelocitymin = -100; - vertvelocitymax = 100; - forcepointx = randomfloatrange( 0 - forcepointvariance, forcepointvariance ); - forcepointy = randomfloatrange( 0 - forcepointvariance, forcepointvariance ); - forcepoint = ( forcepointx, forcepointy, 0 ); - forcepoint += self.origin; - initialvelocityz = randomfloatrange( vertvelocitymin, vertvelocitymax ); - initialvelocity = ( 0, 0, initialvelocityz ); - self physicslaunch( forcepoint, initialvelocity ); - self thread timeoutcratewaiter(); - self thread update_crate_velocity(); - self thread play_impact_sound(); - self waittill( "stationary" ); + forcepointvariance = 200.0; + vertvelocitymin = -100.0; + vertvelocitymax = 100.0; + forcepointx = randomfloatrange( 0 - forcepointvariance, forcepointvariance ); + forcepointy = randomfloatrange( 0 - forcepointvariance, forcepointvariance ); + forcepoint = ( forcepointx, forcepointy, 0 ); + forcepoint += self.origin; + initialvelocityz = randomfloatrange( vertvelocitymin, vertvelocitymax ); + initialvelocity = ( 0, 0, initialvelocityz ); + self physicslaunch( forcepoint, initialvelocity ); + self thread timeoutcratewaiter(); + self thread update_crate_velocity(); + self thread play_impact_sound(); + + self waittill( "stationary" ); } -play_impact_sound() //checked matches cerberus output +play_impact_sound() { - self endon( "entityshutdown" ); - self endon( "stationary" ); - self endon( "death" ); - wait 0.5; - while ( abs( self.velocity[ 2 ] ) > 5 ) - { - wait 0.1; - } - self playsound( "phy_impact_supply" ); + self endon( "entityshutdown" ); + self endon( "stationary" ); + self endon( "death" ); + wait 0.5; + + while ( abs( self.velocity[2] ) > 5 ) + wait 0.1; + + self playsound( "phy_impact_supply" ); } -update_crate_velocity() //checked changed to match cerberus output +update_crate_velocity() { - self endon( "entityshutdown" ); - self endon( "stationary" ); - self.velocity = ( 0, 0, 0 ); - self.old_origin = self.origin; - while ( isDefined( self ) ) - { - self.velocity = self.origin - self.old_origin; - self.old_origin = self.origin; - wait 0.05; - } + self endon( "entityshutdown" ); + self endon( "stationary" ); + self.velocity = ( 0, 0, 0 ); + self.old_origin = self.origin; + + while ( isdefined( self ) ) + { + self.velocity = self.origin - self.old_origin; + self.old_origin = self.origin; + wait 0.05; + } } -crateredophysics() //checked changed to match cerberus output +crateredophysics() { - forcepoint = self.origin; - initialvelocity = ( 0, 0, 0 ); - self physicslaunch( forcepoint, initialvelocity ); - self thread timeoutcratewaiter(); - self waittill( "stationary" ); + forcepoint = self.origin; + initialvelocity = ( 0, 0, 0 ); + self physicslaunch( forcepoint, initialvelocity ); + self thread timeoutcratewaiter(); + + self waittill( "stationary" ); } -do_supply_drop_detonation( weapname, owner ) //checked matches cerberus output +do_supply_drop_detonation( weapname, owner ) { - self notify( "supplyDropWatcher" ); - self endon( "supplyDropWatcher" ); - self endon( "spawned_player" ); - self endon( "disconnect" ); - self endon( "death" ); - self endon( "grenade_timeout" ); - self waittillnotmoving(); - self.angles = ( 0, self.angles[ 1 ], 90 ); - fuse_time = getweaponfusetime( weapname ) / 1000; - wait fuse_time; - if ( !isDefined( owner ) || owner maps/mp/killstreaks/_emp::isenemyempkillstreakactive() == 0 ) - { - thread playsmokesound( self.origin, 6, level.sound_smoke_start, level.sound_smoke_stop, level.sound_smoke_loop ); - playfxontag( level._supply_drop_smoke_fx, self, "tag_fx" ); - proj_explosion_sound = getweaponprojexplosionsound( weapname ); - play_sound_in_space( proj_explosion_sound, self.origin ); - } - wait 3; - self delete(); + self notify( "supplyDropWatcher" ); + self endon( "supplyDropWatcher" ); + self endon( "spawned_player" ); + self endon( "disconnect" ); + self endon( "death" ); + self endon( "grenade_timeout" ); + self waittillnotmoving(); + self.angles = ( 0, self.angles[1], 90 ); + fuse_time = getweaponfusetime( weapname ) / 1000; + wait( fuse_time ); + + if ( !isdefined( owner ) || owner maps\mp\killstreaks\_emp::isenemyempkillstreakactive() == 0 ) + { + thread playsmokesound( self.origin, 6, level.sound_smoke_start, level.sound_smoke_stop, level.sound_smoke_loop ); + playfxontag( level._supply_drop_smoke_fx, self, "tag_fx" ); + proj_explosion_sound = getweaponprojexplosionsound( weapname ); + play_sound_in_space( proj_explosion_sound, self.origin ); + } + + wait 3; + self delete(); } -dosupplydrop( weapon, weaponname, owner, killstreak_id, package_contents_id ) //checked matches cerberus output +dosupplydrop( weapon, weaponname, owner, killstreak_id, package_contents_id ) { - weapon endon( "explode" ); - weapon endon( "grenade_timeout" ); - self endon( "disconnect" ); - team = owner.team; - weapon thread watchexplode( weaponname, owner, killstreak_id, package_contents_id ); - weapon waittillnotmoving(); - weapon notify( "stoppedMoving" ); - self thread helidelivercrate( weapon.origin, weaponname, owner, team, killstreak_id, package_contents_id ); + weapon endon( "explode" ); + weapon endon( "grenade_timeout" ); + self endon( "disconnect" ); + team = owner.team; + weapon thread watchexplode( weaponname, owner, killstreak_id, package_contents_id ); + weapon waittillnotmoving(); + weapon notify( "stoppedMoving" ); + self thread helidelivercrate( weapon.origin, weaponname, owner, team, killstreak_id, package_contents_id ); } -watchexplode( weaponname, owner, killstreak_id, package_contents_id ) //checked matches cerberus output +watchexplode( weaponname, owner, killstreak_id, package_contents_id ) { - self endon( "stoppedMoving" ); - team = owner.team; - self waittill( "explode", position ); - owner thread helidelivercrate( position, weaponname, owner, team, killstreak_id, package_contents_id ); + self endon( "stoppedMoving" ); + team = owner.team; + + self waittill( "explode", position ); + + owner thread helidelivercrate( position, weaponname, owner, team, killstreak_id, package_contents_id ); } -cratetimeoutthreader() //checked matches cerberus output +cratetimeoutthreader() { - /* /# - if ( getdvarintdefault( "scr_crate_notimeout", 0 ) ) - { - return; + if ( getdvarintdefault( "scr_crate_notimeout", 0 ) ) + return; #/ - } - */ - self thread cratetimeout( 90 ); + self thread cratetimeout( 90 ); } -dropcrate( origin, angle, category, owner, team, killcament, killstreak_id, package_contents_id, crate ) //checked matches cerberus output +dropcrate( origin, angle, category, owner, team, killcament, killstreak_id, package_contents_id, crate ) { - angle = ( angle[ 0 ] * 0.5, angle[ 1 ] * 0.5, angle[ 2 ] * 0.5 ); - if ( isDefined( crate ) ) - { - origin = crate.origin; - angle = crate.angles; - crate delete(); - } - crate = cratespawn( category, owner, team, origin, angle ); - killcament unlink(); - killcament linkto( crate ); - crate.killcament = killcament; - crate.killstreak_id = killstreak_id; - crate.package_contents_id = package_contents_id; - killcament thread deleteaftertime( 15 ); - killcament thread unlinkonrotation( crate ); - crate endon( "death" ); - crate thread cratekill(); - crate cratephysics(); - crate cratetimeoutthreader(); - crate thread maps/mp/_hacker_tool::registerwithhackertool( level.carepackagehackertoolradius, level.carepackagehackertooltimems ); - if ( isDefined( crate.cratetype.landfunctionoverride ) ) - { - [[ crate.cratetype.landfunctionoverride ]]( crate, category, owner, team ); - } - else - { - crate crateactivate(); - crate thread crateusethink(); - crate thread crateusethinkowner(); - if ( isDefined( crate.cratetype.hint_gambler ) ) - { - crate thread crategamblerthink(); - } - default_land_function( crate, category, owner, team ); - } + angle = ( angle[0] * 0.5, angle[1] * 0.5, angle[2] * 0.5 ); + + if ( isdefined( crate ) ) + { + origin = crate.origin; + angle = crate.angles; + crate delete(); + } + + crate = cratespawn( category, owner, team, origin, angle ); + killcament unlink(); + killcament linkto( crate ); + crate.killcament = killcament; + crate.killstreak_id = killstreak_id; + crate.package_contents_id = package_contents_id; + killcament thread deleteaftertime( 15 ); + killcament thread unlinkonrotation( crate ); + crate endon( "death" ); + crate thread cratekill(); + crate cratephysics(); + crate cratetimeoutthreader(); + crate thread maps\mp\_hacker_tool::registerwithhackertool( level.carepackagehackertoolradius, level.carepackagehackertooltimems ); + + if ( isdefined( crate.cratetype.landfunctionoverride ) ) + [[ crate.cratetype.landfunctionoverride ]]( crate, category, owner, team ); + else + { + crate crateactivate(); + crate thread crateusethink(); + crate thread crateusethinkowner(); + + if ( isdefined( crate.cratetype.hint_gambler ) ) + crate thread crategamblerthink(); + + default_land_function( crate, category, owner, team ); + } } -unlinkonrotation( crate ) //checked matches cerberus output +unlinkonrotation( crate ) { - self endon( "delete" ); - crate endon( "entityshutdown" ); - crate endon( "stationary" ); - waitbeforerotationcheck = getdvarfloatdefault( "scr_supplydrop_killcam_rot_wait", 0.5 ); - wait waitbeforerotationcheck; - mincos = getdvarintdefault( "scr_supplydrop_killcam_max_rot", 0.999 ); - cosine = 1; - currentdirection = vectornormalize( anglesToForward( crate.angles ) ); - while ( cosine > mincos ) - { - olddirection = currentdirection; - wait 0.05; - currentdirection = vectornormalize( anglesToForward( crate.angles ) ); - cosine = vectordot( olddirection, currentdirection ); - } - self unlink(); + self endon( "delete" ); + crate endon( "entityshutdown" ); + crate endon( "stationary" ); + waitbeforerotationcheck = getdvarfloatdefault( "scr_supplydrop_killcam_rot_wait", 0.5 ); + wait( waitbeforerotationcheck ); + mincos = getdvarintdefault( "scr_supplydrop_killcam_max_rot", 0.999 ); + cosine = 1; + currentdirection = vectornormalize( anglestoforward( crate.angles ) ); + + while ( cosine > mincos ) + { + olddirection = currentdirection; + wait 0.05; + currentdirection = vectornormalize( anglestoforward( crate.angles ) ); + cosine = vectordot( olddirection, currentdirection ); + } + + self unlink(); } -default_land_function( crate, weaponname, owner, team ) //checked partially changed to match cerberus output see compiler_limitations.md No. 5 +default_land_function( crate, weaponname, owner, team ) { - while ( 1 ) - { - crate waittill( "captured", player, remote_hack ); - player maps/mp/_challenges::capturedcrate(); - deletecrate = player givecrateitem( crate ); - if ( isDefined( deletecrate ) && !deletecrate ) - { - continue; - } - if ( player hasperk( "specialty_showenemyequipment" ) || remote_hack == 1 && owner != player ) - { - if ( level.teambased && team != player.team || !level.teambased ) - { - spawn_explosive_crate( crate.origin, crate.angles, weaponname, owner, team, player ); - crate cratedelete( 0 ); - } - } - else - { - crate cratedelete(); - } - return; - } + while ( true ) + { + crate waittill( "captured", player, remote_hack ); + + player maps\mp\_challenges::capturedcrate(); + deletecrate = player givecrateitem( crate ); + + if ( isdefined( deletecrate ) && !deletecrate ) + continue; + + if ( ( player hasperk( "specialty_showenemyequipment" ) || remote_hack == 1 ) && owner != player && ( level.teambased && team != player.team || !level.teambased ) ) + { + spawn_explosive_crate( crate.origin, crate.angles, weaponname, owner, team, player ); + crate cratedelete( 0 ); + } + else + crate cratedelete(); + + return; + } } -spawn_explosive_crate( origin, angle, weaponname, owner, team, hacker ) //checked matches cerberus output +spawn_explosive_crate( origin, angle, weaponname, owner, team, hacker ) { - crate = cratespawn( weaponname, owner, team, origin, angle ); - crate setowner( owner ); - crate setteam( team ); - if ( level.teambased ) - { - crate setenemymodel( level.cratemodelboobytrapped ); - crate makeusable( team ); - } - else - { - crate setenemymodel( level.cratemodelenemy ); - } - crate.hacker = hacker; - crate.visibletoall = 0; - crate crateactivate( hacker ); - crate sethintstringforperk( "specialty_showenemyequipment", level.supplydropdisarmcrate ); - crate thread crateusethink(); - crate thread crateusethinkowner(); - crate thread watch_explosive_crate(); - crate cratetimeoutthreader(); + crate = cratespawn( weaponname, owner, team, origin, angle ); + crate setowner( owner ); + crate setteam( team ); + + if ( level.teambased ) + { + crate setenemymodel( level.cratemodelboobytrapped ); + crate makeusable( team ); + } + else + crate setenemymodel( level.cratemodelenemy ); + + crate.hacker = hacker; + crate.visibletoall = 0; + crate crateactivate( hacker ); + crate sethintstringforperk( "specialty_showenemyequipment", level.supplydropdisarmcrate ); + crate thread crateusethink(); + crate thread crateusethinkowner(); + crate thread watch_explosive_crate(); + crate cratetimeoutthreader(); } -watch_explosive_crate() //checked matches cerberus output +watch_explosive_crate() { - killcament = spawn( "script_model", self.origin + vectorScale( ( 0, 0, 1 ), 60 ) ); - self.killcament = killcament; - self waittill( "captured", player, remote_hack ); - if ( !player hasperk( "specialty_showenemyequipment" ) && !remote_hack ) - { - self thread maps/mp/_entityheadicons::setentityheadicon( player.team, player, level.crate_headicon_offset, "headicon_dead", 1 ); - self loop_sound( "wpn_semtex_alert", 0.15 ); - if ( !isDefined( self.hacker ) ) - { - self.hacker = self; - } - self radiusdamage( self.origin, 256, 300, 75, self.hacker, "MOD_EXPLOSIVE", "supplydrop_mp" ); - playfx( level._supply_drop_explosion_fx, self.origin ); - playsoundatposition( "wpn_grenade_explode", self.origin ); - } - else - { - playsoundatposition( "mpl_turret_alert", self.origin ); - maps/mp/_scoreevents::processscoreevent( "disarm_hacked_care_package", player ); - player maps/mp/_challenges::disarmedhackedcarepackage(); - } - wait 0.1; - self cratedelete(); - killcament thread deleteaftertime( 5 ); + killcament = spawn( "script_model", self.origin + vectorscale( ( 0, 0, 1 ), 60.0 ) ); + self.killcament = killcament; + + self waittill( "captured", player, remote_hack ); + + if ( !player hasperk( "specialty_showenemyequipment" ) && !remote_hack ) + { + self thread maps\mp\_entityheadicons::setentityheadicon( player.team, player, level.crate_headicon_offset, "headicon_dead", 1 ); + self loop_sound( "wpn_semtex_alert", 0.15 ); + + if ( !isdefined( self.hacker ) ) + self.hacker = self; + + self radiusdamage( self.origin, 256, 300, 75, self.hacker, "MOD_EXPLOSIVE", "supplydrop_mp" ); + playfx( level._supply_drop_explosion_fx, self.origin ); + playsoundatposition( "wpn_grenade_explode", self.origin ); + } + else + { + playsoundatposition( "mpl_turret_alert", self.origin ); + maps\mp\_scoreevents::processscoreevent( "disarm_hacked_care_package", player ); + player maps\mp\_challenges::disarmedhackedcarepackage(); + } + + wait 0.1; + self cratedelete(); + killcament thread deleteaftertime( 5 ); } -loop_sound( alias, interval ) //checked changed to match cerberus output +loop_sound( alias, interval ) { - self endon( "death" ); - while ( 1 ) - { - playsoundatposition( alias, self.origin ); - wait interval; - interval /= 1.2; - if ( interval < 0.08 ) - { - return; - } - } + self endon( "death" ); + + while ( true ) + { + playsoundatposition( alias, self.origin ); + wait( interval ); + interval /= 1.2; + + if ( interval < 0.08 ) + break; + } } -cratekill() //checked matches cerberus output +cratekill() { - self endon( "death" ); - stationarythreshold = 2; - killthreshold = 15; - maxframestillstationary = 20; - numframesstationary = 0; - while ( 1 ) - { - vel = 0; - if ( isDefined( self.velocity ) ) - { - vel = abs( self.velocity[ 2 ] ); - } - if ( vel > killthreshold ) - { - self is_touching_crate(); - } - if ( vel < stationarythreshold ) - { - numframesstationary++; - } - else - { - numframesstationary = 0; - } - if ( numframesstationary >= maxframestillstationary ) - { - return; - } - else - { - wait 0.01; - } - } + self endon( "death" ); + stationarythreshold = 2; + killthreshold = 15; + maxframestillstationary = 20; + numframesstationary = 0; + + while ( true ) + { + vel = 0; + + if ( isdefined( self.velocity ) ) + vel = abs( self.velocity[2] ); + + if ( vel > killthreshold ) + self is_touching_crate(); + + if ( vel < stationarythreshold ) + numframesstationary++; + else + numframesstationary = 0; + + if ( numframesstationary >= maxframestillstationary ) + break; + + wait 0.01; + } } -cratedroptogroundkill() //checked partially changed to match cerberus output see compiler_limitations.md No. 2 +cratedroptogroundkill() { - self endon( "death" ); - self endon( "stationary" ); - for ( ;; ) - { - players = get_players(); - dotrace = 0; - i = 0; - while ( i < players.size ) - { - if ( players[ i ].sessionstate != "playing" ) - { - i++; - continue; - } - else if ( players[ i ].team == "spectator" ) - { - i++; - continue; - } - self is_equipment_touching_crate( players[ i ] ); - if ( !isalive( players[ i ] ) ) - { - i++; - continue; - } - flattenedselforigin = ( self.origin[ 0 ], self.origin[ 1 ], 0 ); - flattenedplayerorigin = ( players[ i ].origin[ 0 ], players[ i ].origin[ 1 ], 0 ); - if ( distancesquared( flattenedselforigin, flattenedplayerorigin ) > 4096 ) - { - i++; - continue; - } - else - { - dotrace = 1; - break; - } - i++; - } - if ( dotrace ) - { - start = self.origin; - cratedroptogroundtrace( start ); - start = self getpointinbounds( 1, 0, 0 ); - cratedroptogroundtrace( start ); - start = self getpointinbounds( -1, 0, 0 ); - cratedroptogroundtrace( start ); - start = self getpointinbounds( 0, -1, 0 ); - cratedroptogroundtrace( start ); - start = self getpointinbounds( 0, 1, 0 ); - cratedroptogroundtrace( start ); - start = self getpointinbounds( 1, 1, 0 ); - cratedroptogroundtrace( start ); - start = self getpointinbounds( -1, 1, 0 ); - cratedroptogroundtrace( start ); - start = self getpointinbounds( 1, -1, 0 ); - cratedroptogroundtrace( start ); - start = self getpointinbounds( -1, -1, 0 ); - cratedroptogroundtrace( start ); - wait 0.2; - continue; - } - wait 0.5; - } + self endon( "death" ); + self endon( "stationary" ); + + for (;;) + { + players = get_players(); + dotrace = 0; + + for ( i = 0; i < players.size; i++ ) + { + if ( players[i].sessionstate != "playing" ) + continue; + + if ( players[i].team == "spectator" ) + continue; + + self is_equipment_touching_crate( players[i] ); + + if ( !isalive( players[i] ) ) + continue; + + flattenedselforigin = ( self.origin[0], self.origin[1], 0 ); + flattenedplayerorigin = ( players[i].origin[0], players[i].origin[1], 0 ); + + if ( distancesquared( flattenedselforigin, flattenedplayerorigin ) > 4096 ) + continue; + + dotrace = 1; + break; + } + + if ( dotrace ) + { + start = self.origin; + cratedroptogroundtrace( start ); + start = self getpointinbounds( 1.0, 0.0, 0.0 ); + cratedroptogroundtrace( start ); + start = self getpointinbounds( -1.0, 0.0, 0.0 ); + cratedroptogroundtrace( start ); + start = self getpointinbounds( 0.0, -1.0, 0.0 ); + cratedroptogroundtrace( start ); + start = self getpointinbounds( 0.0, 1.0, 0.0 ); + cratedroptogroundtrace( start ); + start = self getpointinbounds( 1.0, 1.0, 0.0 ); + cratedroptogroundtrace( start ); + start = self getpointinbounds( -1.0, 1.0, 0.0 ); + cratedroptogroundtrace( start ); + start = self getpointinbounds( 1.0, -1.0, 0.0 ); + cratedroptogroundtrace( start ); + start = self getpointinbounds( -1.0, -1.0, 0.0 ); + cratedroptogroundtrace( start ); + wait 0.2; + continue; + } + + wait 0.5; + } } -cratedroptogroundtrace( start ) //checked changed to match cerberus output +cratedroptogroundtrace( start ) { - end = start + vectorScale( ( 0, 0, -1 ), 8000 ); - trace = bullettrace( start, end, 1, self, 1, 1 ); - if ( isDefined( trace[ "entity" ] ) && isplayer( trace[ "entity" ] ) && isalive( trace[ "entity" ] ) ) - { - player = trace[ "entity" ]; - if ( player.sessionstate != "playing" ) - { - return; - } - if ( player.team == "spectator" ) - { - return; - } - if ( distancesquared( start, trace[ "position" ] ) < 144 || self istouching( player ) ) - { - player dodamage( player.health + 1, player.origin, self.owner, self, "none", "MOD_HIT_BY_OBJECT", 0, "supplydrop_mp" ); - player playsound( "mpl_supply_crush" ); - player playsound( "phy_impact_supply" ); - } - } + end = start + vectorscale( ( 0, 0, -1 ), 8000.0 ); + trace = bullettrace( start, end, 1, self, 1, 1 ); + + if ( isdefined( trace["entity"] ) && isplayer( trace["entity"] ) && isalive( trace["entity"] ) ) + { + player = trace["entity"]; + + if ( player.sessionstate != "playing" ) + return; + + if ( player.team == "spectator" ) + return; + + if ( distancesquared( start, trace["position"] ) < 144 || self istouching( player ) ) + { + player dodamage( player.health + 1, player.origin, self.owner, self, "none", "MOD_HIT_BY_OBJECT", 0, "supplydrop_mp" ); + player playsound( "mpl_supply_crush" ); + player playsound( "phy_impact_supply" ); + } + } } -is_touching_crate() //checked changed to match cerberus output removed empty if statements which probably contained comments +is_touching_crate() { - extraboundary = vectorScale( ( 1, 1, 1 ), 10 ); - players = get_players(); - for ( i = 0; i < players.size; i++ ) - { - if ( isDefined( players[ i ] ) && isalive( players[ i ] ) && self istouching( players[ i ], extraboundary ) ) - { - attacker = self; - players[ i ] dodamage( players[ i ].health + 1, players[ i ].origin, attacker, self, "none", "MOD_HIT_BY_OBJECT", 0, "supplydrop_mp" ); - players[ i ] playsound( "mpl_supply_crush" ); - players[ i ] playsound( "phy_impact_supply" ); - } - self is_equipment_touching_crate( players[ i ] ); - } + extraboundary = vectorscale( ( 1, 1, 1 ), 10.0 ); + players = get_players(); + + for ( i = 0; i < players.size; i++ ) + { + if ( isdefined( players[i] ) && isalive( players[i] ) && self istouching( players[i], extraboundary ) ) + { + attacker = isdefined( self.owner ) ? self.owner : self; + players[i] dodamage( players[i].health + 1, players[i].origin, attacker, self, "none", "MOD_HIT_BY_OBJECT", 0, "supplydrop_mp" ); + players[i] playsound( "mpl_supply_crush" ); + players[i] playsound( "phy_impact_supply" ); + } + + self is_equipment_touching_crate( players[i] ); + } } -is_equipment_touching_crate( player ) //checked partially changed to match cerberus output see compiler_limitations.md No. 2 +is_equipment_touching_crate( player ) { - extraboundary = vectorScale( ( 0, 0, 1 ), 10 ); - if ( isDefined( player ) && isDefined( player.weaponobjectwatcherarray ) ) - { - for ( watcher = 0; watcher < player.weaponobjectwatcherarray.size; watcher++ ) - { - objectwatcher = player.weaponobjectwatcherarray[ watcher ]; - objectarray = objectwatcher.objectarray; - if ( isDefined( objectarray ) ) - { - for ( weaponobject = 0; weaponobject < objectarray.size; weaponobject++ ) - { - if ( isDefined( objectarray[ weaponobject ] ) && self istouching( objectarray[ weaponobject ], extraboundary ) ) - { - if ( isDefined( objectwatcher.detonate ) ) - { - objectwatcher thread maps/mp/gametypes/_weaponobjects::waitanddetonate( objectarray[ weaponobject ], 0 ); - } - else - { - maps/mp/gametypes/_weaponobjects::deleteweaponobject( objectwatcher, objectarray[ weaponobject ] ); - } - } - } - } - } - } - extraboundary = vectorScale( ( 1, 1, 1 ), 15 ); - if ( isDefined( player ) && isDefined( player.tacticalinsertion ) && self istouching( player.tacticalinsertion, extraboundary ) ) - { - player.tacticalinsertion thread maps/mp/_tacticalinsertion::fizzle(); - } + extraboundary = vectorscale( ( 1, 1, 1 ), 10.0 ); + + if ( isdefined( player ) && isdefined( player.weaponobjectwatcherarray ) ) + { + for ( watcher = 0; watcher < player.weaponobjectwatcherarray.size; watcher++ ) + { + objectwatcher = player.weaponobjectwatcherarray[watcher]; + objectarray = objectwatcher.objectarray; + + if ( isdefined( objectarray ) ) + { + for ( weaponobject = 0; weaponobject < objectarray.size; weaponobject++ ) + { + if ( isdefined( objectarray[weaponobject] ) && self istouching( objectarray[weaponobject], extraboundary ) ) + { + if ( isdefined( objectwatcher.detonate ) ) + { + objectwatcher thread maps\mp\gametypes\_weaponobjects::waitanddetonate( objectarray[weaponobject], 0 ); + continue; + } + + maps\mp\gametypes\_weaponobjects::deleteweaponobject( objectwatcher, objectarray[weaponobject] ); + } + } + } + } + } + + extraboundary = vectorscale( ( 1, 1, 1 ), 15.0 ); + + if ( isdefined( player ) && isdefined( player.tacticalinsertion ) && self istouching( player.tacticalinsertion, extraboundary ) ) + player.tacticalinsertion thread maps\mp\_tacticalinsertion::fizzle(); } -cratetimeout( time ) //checked matches cerberus output +cratetimeout( time ) { - self endon( "death" ); - wait time; - self cratedelete(); + self endon( "death" ); + wait( time ); + self cratedelete(); } -spawnuseent() //checked matches cerberus output +spawnuseent() { - useent = spawn( "script_origin", self.origin ); - useent.curprogress = 0; - useent.inuse = 0; - useent.userate = 0; - useent.usetime = 0; - useent.owner = self; - useent thread useentownerdeathwaiter( self ); - return useent; + useent = spawn( "script_origin", self.origin ); + useent.curprogress = 0; + useent.inuse = 0; + useent.userate = 0; + useent.usetime = 0; + useent.owner = self; + useent thread useentownerdeathwaiter( self ); + return useent; } -useentownerdeathwaiter( owner ) //checked matches cerberus output +useentownerdeathwaiter( owner ) { - self endon( "death" ); - owner waittill( "death" ); - self delete(); + self endon( "death" ); + + owner waittill( "death" ); + + self delete(); } -crateusethink() //checked changed to match cerberus output +crateusethink() { - while ( isDefined( self ) ) - { - self waittill( "trigger", player ); - if ( !isalive( player ) ) - { - continue; - } - if ( !player isonground() ) - { - continue; - } - if ( isDefined( self.owner ) && self.owner == player ) - { - continue; - } - useent = self spawnuseent(); - result = 0; - if ( isDefined( self.hacker ) ) - { - useent.hacker = self.hacker; - } - self.useent = useent; - result = useent useholdthink( player, level.cratenonownerusetime ); - if ( isDefined( useent ) ) - { - useent delete(); - } - if ( result ) - { - givecratecapturemedal( self, player ); - self notify( "captured", player, 0 ); - } - } + while ( isdefined( self ) ) + { + self waittill( "trigger", player ); + + if ( !isalive( player ) ) + continue; + + if ( !player isonground() ) + continue; + + if ( isdefined( self.owner ) && self.owner == player ) + continue; + + useent = self spawnuseent(); + result = 0; + + if ( isdefined( self.hacker ) ) + useent.hacker = self.hacker; + + self.useent = useent; + result = useent useholdthink( player, level.cratenonownerusetime ); + + if ( isdefined( useent ) ) + useent delete(); + + if ( result ) + { + givecratecapturemedal( self, player ); + self notify( "captured", player, 0 ); + } + } } -givecratecapturemedal( crate, capturer ) //checked changed to match cerberus output +givecratecapturemedal( crate, capturer ) { - if ( isDefined( crate.owner ) && isplayer( crate.owner ) ) - { - if ( level.teambased ) - { - if ( capturer.team != crate.owner.team ) - { - crate.owner playlocalsound( "mpl_crate_enemy_steals" ); - if ( !isDefined( crate.hacker ) ) - { - maps/mp/_scoreevents::processscoreevent( "capture_enemy_crate", capturer ); - } - } - else if ( isDefined( crate.owner ) && capturer != crate.owner ) - { - crate.owner playlocalsound( "mpl_crate_friendly_steals" ); - if ( !isDefined( crate.hacker ) ) - { - level.globalsharepackages++; - maps/mp/_scoreevents::processscoreevent( crate.cratetype.sharestat, crate.owner ); - } - } - } - else if ( capturer != crate.owner ) - { - crate.owner playlocalsound( "mpl_crate_enemy_steals" ); - if ( !isDefined( crate.hacker ) ) - { - maps/mp/_scoreevents::processscoreevent( "capture_enemy_crate", capturer ); - } - } - } + if ( isdefined( crate.owner ) && isplayer( crate.owner ) ) + { + if ( level.teambased ) + { + if ( capturer.team != crate.owner.team ) + { + crate.owner playlocalsound( "mpl_crate_enemy_steals" ); + + if ( !isdefined( crate.hacker ) ) + maps\mp\_scoreevents::processscoreevent( "capture_enemy_crate", capturer ); + } + else if ( isdefined( crate.owner ) && capturer != crate.owner ) + { + crate.owner playlocalsound( "mpl_crate_friendly_steals" ); + + if ( !isdefined( crate.hacker ) ) + { + level.globalsharepackages++; + maps\mp\_scoreevents::processscoreevent( crate.cratetype.sharestat, crate.owner ); + } + } + } + else if ( capturer != crate.owner ) + { + crate.owner playlocalsound( "mpl_crate_enemy_steals" ); + + if ( !isdefined( crate.hacker ) ) + maps\mp\_scoreevents::processscoreevent( "capture_enemy_crate", capturer ); + } + } } -crateusethinkowner() //checked changed to match cerberus output +crateusethinkowner() { - self endon( "joined_team" ); - while ( isDefined( self ) ) - { - self waittill( "trigger", player ); - if ( !isalive( player ) ) - { - continue; - } - if ( !player isonground() ) - { - continue; - } - if ( !isDefined( self.owner ) ) - { - continue; - } - if ( self.owner != player ) - { - continue; - } - result = self useholdthink( player, level.crateownerusetime ); - if ( result ) - { - self notify( "captured", player, 0 ); - } - } + self endon( "joined_team" ); + + while ( isdefined( self ) ) + { + self waittill( "trigger", player ); + + if ( !isalive( player ) ) + continue; + + if ( !player isonground() ) + continue; + + if ( !isdefined( self.owner ) ) + continue; + + if ( self.owner != player ) + continue; + + result = self useholdthink( player, level.crateownerusetime ); + + if ( result ) + self notify( "captured", player, 0 ); + } } -useholdthink( player, usetime ) //checked matches cerberus output +useholdthink( player, usetime ) { - player notify( "use_hold" ); - player freeze_player_controls( 1 ); - player _disableweapon(); - self.curprogress = 0; - self.inuse = 1; - self.userate = 0; - self.usetime = usetime; - player thread personalusebar( self ); - result = useholdthinkloop( player ); - if ( isDefined( player ) ) - { - player notify( "done_using" ); - } - if ( isDefined( player ) ) - { - if ( isalive( player ) ) - { - player _enableweapon(); - player freeze_player_controls( 0 ); - } - } - if ( isDefined( self ) ) - { - self.inuse = 0; - } - if ( isDefined( result ) && result ) - { - return 1; - } - return 0; + player notify( "use_hold" ); + player freeze_player_controls( 1 ); + player _disableweapon(); + self.curprogress = 0; + self.inuse = 1; + self.userate = 0; + self.usetime = usetime; + player thread personalusebar( self ); + result = useholdthinkloop( player ); + + if ( isdefined( player ) ) + player notify( "done_using" ); + + if ( isdefined( player ) ) + { + if ( isalive( player ) ) + { + player _enableweapon(); + player freeze_player_controls( 0 ); + } + } + + if ( isdefined( self ) ) + self.inuse = 0; + + if ( isdefined( result ) && result ) + return true; + + return false; } -continueholdthinkloop( player ) //checked matches cerberus output +continueholdthinkloop( player ) { - if ( !isDefined( self ) ) - { - return 0; - } - if ( self.curprogress >= self.usetime ) - { - return 0; - } - if ( !isalive( player ) ) - { - return 0; - } - if ( player.throwinggrenade ) - { - return 0; - } - if ( !player usebuttonpressed() ) - { - return 0; - } - if ( player meleebuttonpressed() ) - { - return 0; - } - if ( player isinvehicle() ) - { - return 0; - } - if ( player isweaponviewonlylinked() ) - { - return 0; - } - if ( player isremotecontrolling() ) - { - return 0; - } - return 1; + if ( !isdefined( self ) ) + return false; + + if ( self.curprogress >= self.usetime ) + return false; + + if ( !isalive( player ) ) + return false; + + if ( player.throwinggrenade ) + return false; + + if ( !player usebuttonpressed() ) + return false; + + if ( player meleebuttonpressed() ) + return false; + + if ( player isinvehicle() ) + return false; + + if ( player isweaponviewonlylinked() ) + return false; + + if ( player isremotecontrolling() ) + return false; + + return true; } -useholdthinkloop( player ) //checked matches cerberus output +useholdthinkloop( player ) { - level endon( "game_ended" ); - self endon( "disabled" ); - self.owner endon( "crate_use_interrupt" ); - timedout = 0; - while ( self continueholdthinkloop( player ) ) - { - timedout += 0.05; - self.curprogress += 50 * self.userate; - self.userate = 1; - if ( self.curprogress >= self.usetime ) - { - self.inuse = 0; - wait 0.05; - return isalive( player ); - } - wait 0.05; - maps/mp/gametypes/_hostmigration::waittillhostmigrationdone(); - } - return 0; + level endon( "game_ended" ); + self endon( "disabled" ); + self.owner endon( "crate_use_interrupt" ); + timedout = 0; + + while ( self continueholdthinkloop( player ) ) + { + timedout += 0.05; + self.curprogress += 50 * self.userate; + self.userate = 1; + + if ( self.curprogress >= self.usetime ) + { + self.inuse = 0; + wait 0.05; + return isalive( player ); + } + + wait 0.05; + maps\mp\gametypes\_hostmigration::waittillhostmigrationdone(); + } + + return 0; } -crategamblerthink() //checked changed to match cerberus output +crategamblerthink() { - self endon( "death" ); - for ( ;; ) - { - self waittill( "trigger_use_doubletap", player ); - if ( !player hasperk( "specialty_showenemyequipment" ) ) - { - continue; - } - if ( isDefined( self.useent ) && self.useent.inuse ) - { - if ( isDefined( self.owner ) && self.owner != player ) - { - continue; - } - } - player playlocalsound( "uin_gamble_perk" ); - self.cratetype = getrandomcratetype( "gambler_mp", self.cratetype.name ); - self cratereactivate(); - self sethintstringforperk( "specialty_showenemyequipment", self.cratetype.hint ); - self notify( "crate_use_interrupt" ); - level notify( "use_interrupt" ); - return; - } + self endon( "death" ); + + for (;;) + { + self waittill( "trigger_use_doubletap", player ); + + if ( !player hasperk( "specialty_showenemyequipment" ) ) + continue; + + if ( isdefined( self.useent ) && self.useent.inuse ) + { + if ( isdefined( self.owner ) && self.owner != player ) + continue; + } + + player playlocalsound( "uin_gamble_perk" ); + self.cratetype = getrandomcratetype( "gambler_mp", self.cratetype.name ); + self cratereactivate(); + self sethintstringforperk( "specialty_showenemyequipment", self.cratetype.hint ); + self notify( "crate_use_interrupt" ); + level notify( "use_interrupt", self ); + return; + } } -cratereactivate() //checked matches cerberus output +cratereactivate() { - self sethintstring( self.cratetype.hint ); - icon = self geticonforcrate(); - self thread maps/mp/_entityheadicons::setentityheadicon( self.team, self, level.crate_headicon_offset, icon, 1 ); + self sethintstring( self.cratetype.hint ); + icon = self geticonforcrate(); + self thread maps\mp\_entityheadicons::setentityheadicon( self.team, self, level.crate_headicon_offset, icon, 1 ); } -personalusebar( object ) //checked partially changed to match cerberus output see compiler_limitations.md No. 5 +personalusebar( object ) { - self endon( "disconnect" ); - if ( isDefined( self.usebar ) ) - { - return; - } - self.usebar = createsecondaryprogressbar(); - self.usebartext = createsecondaryprogressbartext(); - if ( self hasperk( "specialty_showenemyequipment" ) && object.owner != self && !isDefined( object.hacker ) ) - { - if ( level.teambased && object.owner.team != self.team || !level.teambased ) - { - self.usebartext settext( &"KILLSTREAK_HACKING_CRATE" ); - self playlocalsound( "evt_hacker_hacking" ); - } - else - { - self.usebartext settext( &"KILLSTREAK_CAPTURING_CRATE" ); - } - } - else if ( self hasperk( "specialty_showenemyequipment" ) && isDefined( object.hacker ) ) - { - if ( object.owner == self || level.teambased && object.owner.team == self.team ) - { - self.usebartext settext( level.disarmingcrate ); - self playlocalsound( "evt_hacker_hacking" ); - } - else - { - self.usebartext settext( &"KILLSTREAK_CAPTURING_CRATE" ); - } - } - else - { - self.usebartext settext( &"KILLSTREAK_CAPTURING_CRATE" ); - } - lastrate = -1; - while ( isalive( self ) && isDefined( object ) && object.inuse && !level.gameended ) - { - if ( lastrate != object.userate ) - { - if ( object.curprogress > object.usetime ) - { - object.curprogress = object.usetime; - } - self.usebar updatebar( object.curprogress / object.usetime, ( 1000 / object.usetime ) * object.userate ); - if ( !object.userate ) - { - self.usebar hideelem(); - self.usebartext hideelem(); - } - else - { - self.usebar showelem(); - self.usebartext showelem(); - } - } - lastrate = object.userate; - wait 0.05; - } - self.usebar destroyelem(); - self.usebartext destroyelem(); + self endon( "disconnect" ); + + if ( isdefined( self.usebar ) ) + return; + + self.usebar = createsecondaryprogressbar(); + self.usebartext = createsecondaryprogressbartext(); + + if ( self hasperk( "specialty_showenemyequipment" ) && object.owner != self && !isdefined( object.hacker ) && ( level.teambased && object.owner.team != self.team || !level.teambased ) ) + { + self.usebartext settext( &"KILLSTREAK_HACKING_CRATE" ); + self playlocalsound( "evt_hacker_hacking" ); + } + else if ( self hasperk( "specialty_showenemyequipment" ) && isdefined( object.hacker ) && ( object.owner == self || level.teambased && object.owner.team == self.team ) ) + { + self.usebartext settext( level.disarmingcrate ); + self playlocalsound( "evt_hacker_hacking" ); + } + else + self.usebartext settext( &"KILLSTREAK_CAPTURING_CRATE" ); + + lastrate = -1; + + while ( isalive( self ) && isdefined( object ) && object.inuse && !level.gameended ) + { + if ( lastrate != object.userate ) + { + if ( object.curprogress > object.usetime ) + object.curprogress = object.usetime; + + self.usebar updatebar( object.curprogress / object.usetime, 1000 / object.usetime * object.userate ); + + if ( !object.userate ) + { + self.usebar hideelem(); + self.usebartext hideelem(); + } + else + { + self.usebar showelem(); + self.usebartext showelem(); + } + } + + lastrate = object.userate; + wait 0.05; + } + + self.usebar destroyelem(); + self.usebartext destroyelem(); } -spawn_helicopter( owner, team, origin, angles, model, targetname, killstreak_id ) //checked changed to match cerberus output +spawn_helicopter( owner, team, origin, angles, model, targetname, killstreak_id ) { - chopper = spawnhelicopter( owner, origin, angles, model, targetname ); - if ( !isDefined( chopper ) ) - { - if ( isplayer( owner ) ) - { - maps/mp/killstreaks/_killstreakrules::killstreakstop( "supply_drop_mp", team, killstreak_id ); - } - return undefined; - } - chopper.owner = owner; - chopper.maxhealth = 1500; - chopper.health = 999999; - chopper.rocketdamageoneshot = chopper.maxhealth + 1; - chopper.damagetaken = 0; - chopper thread maps/mp/killstreaks/_helicopter::heli_damage_monitor( "supply_drop_mp" ); - chopper.spawntime = getTime(); - supplydropspeed = getdvarintdefault( "scr_supplydropSpeedStarting", 125 ); - supplydropaccel = getdvarintdefault( "scr_supplydropAccelStarting", 100 ); - chopper setspeed( supplydropspeed, supplydropaccel ); - maxpitch = getdvarintdefault( "scr_supplydropMaxPitch", 25 ); - maxroll = getdvarintdefault( "scr_supplydropMaxRoll", 45 ); - chopper setmaxpitchroll( 0, maxroll ); - chopper.team = team; - chopper setdrawinfrared( 1 ); - target_set( chopper, vectorScale( ( 0, 0, -1 ), 25 ) ); - if ( isplayer( owner ) ) - { - chopper thread refcountdecchopper( team, killstreak_id ); - } - chopper thread helidestroyed(); - return chopper; + chopper = spawnhelicopter( owner, origin, angles, model, targetname ); + + if ( !isdefined( chopper ) ) + { + if ( isplayer( owner ) ) + maps\mp\killstreaks\_killstreakrules::killstreakstop( "supply_drop_mp", team, killstreak_id ); + + return undefined; + } + + chopper.owner = owner; + chopper.maxhealth = 1500; + chopper.health = 999999; + chopper.rocketdamageoneshot = chopper.maxhealth + 1; + chopper.damagetaken = 0; + chopper thread maps\mp\killstreaks\_helicopter::heli_damage_monitor( "supply_drop_mp" ); + chopper.spawntime = gettime(); + supplydropspeed = getdvarintdefault( "scr_supplydropSpeedStarting", 125 ); + supplydropaccel = getdvarintdefault( "scr_supplydropAccelStarting", 100 ); + chopper setspeed( supplydropspeed, supplydropaccel ); + maxpitch = getdvarintdefault( "scr_supplydropMaxPitch", 25 ); + maxroll = getdvarintdefault( "scr_supplydropMaxRoll", 45 ); + chopper setmaxpitchroll( 0, maxroll ); + chopper.team = team; + chopper setdrawinfrared( 1 ); + target_set( chopper, vectorscale( ( 0, 0, -1 ), 25.0 ) ); + + if ( isplayer( owner ) ) + chopper thread refcountdecchopper( team, killstreak_id ); + + chopper thread helidestroyed(); + return chopper; } -getdropheight( origin ) //checked matches cerberus output +getdropheight( origin ) { - return getminimumflyheight(); + return getminimumflyheight(); } -getdropdirection() //checked matches cerberus output +getdropdirection() { - return ( 0, randomint( 360 ), 0 ); + return ( 0, randomint( 360 ), 0 ); } -getnextdropdirection( drop_direction, degrees ) //checked matches cerberus output +getnextdropdirection( drop_direction, degrees ) { - drop_direction = ( 0, drop_direction[ 1 ] + degrees, 0 ); - if ( drop_direction[ 1 ] >= 360 ) - { - drop_direction = ( 0, drop_direction[ 1 ] - 360, 0 ); - } - return drop_direction; + drop_direction = ( 0, drop_direction[1] + degrees, 0 ); + + if ( drop_direction[1] >= 360 ) + drop_direction = ( 0, drop_direction[1] - 360, 0 ); + + return drop_direction; } -gethelistart( drop_origin, drop_direction ) //checked matches cerberus output +gethelistart( drop_origin, drop_direction ) { - dist = -1 * getdvarintdefault( "scr_supplydropIncomingDistance", 10000 ); - pathrandomness = 100; - direction = drop_direction + ( 0, randomintrange( -2, 3 ), 0 ); - start_origin = drop_origin + ( anglesToForward( direction ) * dist ); - start_origin += ( ( randomfloat( 2 ) - 1 ) * pathrandomness, ( randomfloat( 2 ) - 1 ) * pathrandomness, 0 ); - /* + dist = -1 * getdvarintdefault( "scr_supplydropIncomingDistance", 10000 ); + pathrandomness = 100; + direction = drop_direction + ( 0, randomintrange( -2, 3 ), 0 ); + start_origin = drop_origin + anglestoforward( direction ) * dist; + start_origin += ( ( randomfloat( 2 ) - 1 ) * pathrandomness, ( randomfloat( 2 ) - 1 ) * pathrandomness, 0 ); /# - if ( getdvarintdefault( "scr_noflyzones_debug", 0 ) ) - { - if ( level.noflyzones.size ) - { - index = randomintrange( 0, level.noflyzones.size ); - delta = drop_origin - level.noflyzones[ index ].origin; - delta = ( delta[ 0 ] + randomint( 10 ), delta[ 1 ] + randomint( 10 ), 0 ); - delta = vectornormalize( delta ); - start_origin = drop_origin + ( delta * dist ); + if ( getdvarintdefault( "scr_noflyzones_debug", 0 ) ) + { + if ( level.noflyzones.size ) + { + index = randomintrange( 0, level.noflyzones.size ); + delta = drop_origin - level.noflyzones[index].origin; + delta = ( delta[0] + randomint( 10 ), delta[1] + randomint( 10 ), 0 ); + delta = vectornormalize( delta ); + start_origin = drop_origin + delta * dist; + } + } #/ - } - } - */ - return start_origin; + return start_origin; } -getheliend( drop_origin, drop_direction ) //checked matches cerberus output +getheliend( drop_origin, drop_direction ) { - pathrandomness = 150; - dist = -1 * getdvarintdefault( "scr_supplydropOutgoingDistance", 15000 ); - if ( randomintrange( 0, 2 ) == 0 ) - { - turn = randomintrange( 60, 121 ); - } - else - { - turn = -1 * randomintrange( 60, 121 ); - } - direction = drop_direction + ( 0, turn, 0 ); - end_origin = drop_origin + ( anglesToForward( direction ) * dist ); - end_origin += ( ( randomfloat( 2 ) - 1 ) * pathrandomness, ( randomfloat( 2 ) - 1 ) * pathrandomness, 0 ); - return end_origin; + pathrandomness = 150; + dist = -1 * getdvarintdefault( "scr_supplydropOutgoingDistance", 15000 ); + + if ( randomintrange( 0, 2 ) == 0 ) + turn = randomintrange( 60, 121 ); + else + turn = -1 * randomintrange( 60, 121 ); + + direction = drop_direction + ( 0, turn, 0 ); + end_origin = drop_origin + anglestoforward( direction ) * dist; + end_origin += ( ( randomfloat( 2 ) - 1 ) * pathrandomness, ( randomfloat( 2 ) - 1 ) * pathrandomness, 0 ); + return end_origin; } -addoffsetontopoint( point, direction, offset ) //checked matches cerberus output +addoffsetontopoint( point, direction, offset ) { - angles = vectorToAngles( ( direction[ 0 ], direction[ 1 ], 0 ) ); - offset_world = rotatepoint( offset, angles ); - return point + offset_world; + angles = vectortoangles( ( direction[0], direction[1], 0 ) ); + offset_world = rotatepoint( offset, angles ); + return point + offset_world; } -supplydrophelistartpath( goal, goal_offset ) //checked matches cerberus output +supplydrophelistartpath( goal, goal_offset ) { - total_tries = 12; - tries = 0; - goalpath = spawnstruct(); - drop_direction = getdropdirection(); - while ( tries < total_tries ) - { - goalpath.start = gethelistart( goal, drop_direction ); - goalpath.path = gethelipath( goalpath.start, goal ); - startnoflyzones = insidenoflyzones( goalpath.start, 0 ); - if ( isDefined( goalpath.path ) && startnoflyzones.size == 0 ) - { - if ( goalpath.path.size > 1 ) - { - direction = goalpath.path[ goalpath.path.size - 1 ] - goalpath.path[ goalpath.path.size - 2 ]; - } - else - { - direction = goalpath.path[ goalpath.path.size - 1 ] - goalpath.start; - } - goalpath.path[ goalpath.path.size - 1 ] = addoffsetontopoint( goalpath.path[ goalpath.path.size - 1 ], direction, goal_offset ); - /* + total_tries = 12; + tries = 0; + goalpath = spawnstruct(); + drop_direction = getdropdirection(); + + while ( tries < total_tries ) + { + goalpath.start = gethelistart( goal, drop_direction ); + goalpath.path = gethelipath( goalpath.start, goal ); + startnoflyzones = insidenoflyzones( goalpath.start, 0 ); + + if ( isdefined( goalpath.path ) && startnoflyzones.size == 0 ) + { + if ( goalpath.path.size > 1 ) + direction = goalpath.path[goalpath.path.size - 1] - goalpath.path[goalpath.path.size - 2]; + else + direction = goalpath.path[goalpath.path.size - 1] - goalpath.start; + + goalpath.path[goalpath.path.size - 1] = addoffsetontopoint( goalpath.path[goalpath.path.size - 1], direction, goal_offset ); /# - sphere( goalpath.path[ goalpath.path.size - 1 ], 10, ( 0, 0, 1 ), 1, 1, 10, 1000 ); + sphere( goalpath.path[goalpath.path.size - 1], 10, ( 0, 0, 1 ), 1, 1, 10, 1000 ); #/ - */ - return goalpath; - } - drop_direction = getnextdropdirection( drop_direction, 30 ); - tries++; - } - drop_direction = getdropdirection(); - goalpath.start = gethelistart( goal, drop_direction ); - direction = goal - goalpath.start; - goalpath.path = []; - goalpath.path[ 0 ] = addoffsetontopoint( goal, direction, goal_offset ); - return goalpath; + return goalpath; + } + + drop_direction = getnextdropdirection( drop_direction, 30 ); + tries++; + } + + drop_direction = getdropdirection(); + goalpath.start = gethelistart( goal, drop_direction ); + direction = goal - goalpath.start; + goalpath.path = []; + goalpath.path[0] = addoffsetontopoint( goal, direction, goal_offset ); + return goalpath; } -supplydropheliendpath( origin, drop_direction ) //checked changed to match cerberus output +supplydropheliendpath( origin, drop_direction ) { - total_tries = 5; - tries = 0; - goalpath = spawnstruct(); - while ( tries < total_tries ) - { - goal = getheliend( origin, drop_direction ); - goalpath.path = gethelipath( origin, goal ); - if ( isDefined( goalpath.path ) ) - { - return goalpath; - } - tries++; - } - leave_nodes = getentarray( "heli_leave", "targetname" ); - foreach ( node in leave_nodes ) - { - goalpath.path = gethelipath( origin, node.origin ); - if ( isDefined( goalpath.path ) ) - { - return goalpath; - } - } - goalpath.path = []; - goalpath.path[ 0 ] = getheliend( origin, drop_direction ); - return goalpath; + total_tries = 5; + tries = 0; + goalpath = spawnstruct(); + + while ( tries < total_tries ) + { + goal = getheliend( origin, drop_direction ); + goalpath.path = gethelipath( origin, goal ); + + if ( isdefined( goalpath.path ) ) + return goalpath; + + tries++; + } + + leave_nodes = getentarray( "heli_leave", "targetname" ); + + foreach ( node in leave_nodes ) + { + goalpath.path = gethelipath( origin, node.origin ); + + if ( isdefined( goalpath.path ) ) + return goalpath; + } + + goalpath.path = []; + goalpath.path[0] = getheliend( origin, drop_direction ); + return goalpath; } -inccratekillstreakusagestat( weaponname ) //checked changed to match cerberus output +inccratekillstreakusagestat( weaponname ) { - if ( !isDefined( weaponname ) ) - { - return; - } - if ( weaponname == "turret_drop_mp" ) - { - self maps/mp/killstreaks/_killstreaks::playkillstreakstartdialog( "turret_drop_mp", self.pers[ "team" ] ); - } - else if ( weaponname == "tow_turret_drop_mp" ) - { - self maps/mp/killstreaks/_killstreaks::playkillstreakstartdialog( "tow_turret_drop_mp", self.pers[ "team" ] ); - } - else if ( weaponname == "supplydrop_mp" || weaponname == "inventory_supplydrop_mp" ) - { - self maps/mp/killstreaks/_killstreaks::playkillstreakstartdialog( "supply_drop_mp", self.pers[ "team" ] ); - level thread maps/mp/_popups::displaykillstreakteammessagetoall( "supply_drop_mp", self ); - self maps/mp/_challenges::calledincarepackage(); - level.globalkillstreakscalled++; - self addweaponstat( "supplydrop_mp", "used", 1 ); - } - else if ( weaponname == "ai_tank_drop_mp" || weaponname == "inventory_ai_tank_drop_mp" ) - { - self maps/mp/killstreaks/_killstreaks::playkillstreakstartdialog( "ai_tank_drop_mp", self.pers[ "team" ] ); - level thread maps/mp/_popups::displaykillstreakteammessagetoall( "ai_tank_drop_mp", self ); - level.globalkillstreakscalled++; - self addweaponstat( "ai_tank_drop_mp", "used", 1 ); - return; - } - else if ( weaponname == "inventory_minigun_drop_mp" || weaponname == "minigun_drop_mp" ) - { - self maps/mp/killstreaks/_killstreaks::playkillstreakstartdialog( "minigun_mp", self.pers[ "team" ] ); - return; - } - else if ( weaponname == "m32_drop_mp" || weaponname == "inventory_m32_drop_mp" ) - { - self maps/mp/killstreaks/_killstreaks::playkillstreakstartdialog( "m32_mp", self.pers[ "team" ] ); - } + if ( !isdefined( weaponname ) ) + return; + + if ( weaponname == "turret_drop_mp" ) + self maps\mp\killstreaks\_killstreaks::playkillstreakstartdialog( "turret_drop_mp", self.pers["team"] ); + else if ( weaponname == "tow_turret_drop_mp" ) + self maps\mp\killstreaks\_killstreaks::playkillstreakstartdialog( "tow_turret_drop_mp", self.pers["team"] ); + else if ( weaponname == "supplydrop_mp" || weaponname == "inventory_supplydrop_mp" ) + { + self maps\mp\killstreaks\_killstreaks::playkillstreakstartdialog( "supply_drop_mp", self.pers["team"] ); + level thread maps\mp\_popups::displaykillstreakteammessagetoall( "supply_drop_mp", self ); + self maps\mp\_challenges::calledincarepackage(); + level.globalkillstreakscalled++; + self addweaponstat( "supplydrop_mp", "used", 1 ); + } + else if ( weaponname == "ai_tank_drop_mp" || weaponname == "inventory_ai_tank_drop_mp" ) + { + self maps\mp\killstreaks\_killstreaks::playkillstreakstartdialog( "ai_tank_drop_mp", self.pers["team"] ); + level thread maps\mp\_popups::displaykillstreakteammessagetoall( "ai_tank_drop_mp", self ); + level.globalkillstreakscalled++; + self addweaponstat( "ai_tank_drop_mp", "used", 1 ); + } + else if ( weaponname == "inventory_minigun_drop_mp" || weaponname == "minigun_drop_mp" ) + self maps\mp\killstreaks\_killstreaks::playkillstreakstartdialog( "minigun_mp", self.pers["team"] ); + else if ( weaponname == "m32_drop_mp" || weaponname == "inventory_m32_drop_mp" ) + self maps\mp\killstreaks\_killstreaks::playkillstreakstartdialog( "m32_mp", self.pers["team"] ); } -helidelivercrate( origin, weaponname, owner, team, killstreak_id, package_contents_id, exact ) //checked matches cerberus output +helidelivercrate( origin, weaponname, owner, team, killstreak_id, package_contents_id, exact ) { - if ( owner maps/mp/killstreaks/_emp::isenemyempkillstreakactive() && owner hasperk( "specialty_immuneemp" ) == 0 ) - { - maps/mp/killstreaks/_killstreakrules::killstreakstop( "supply_drop_mp", team, killstreak_id ); - return; - } - inccratekillstreakusagestat( weaponname ); - rear_hatch_offset_local = getdvarintdefault( "scr_supplydropOffset", 0 ); - drop_origin = origin; - drop_height = getdropheight( drop_origin ); - heli_drop_goal = ( drop_origin[ 0 ], drop_origin[ 1 ], drop_height ); - /* + if ( owner maps\mp\killstreaks\_emp::isenemyempkillstreakactive() && owner hasperk( "specialty_immuneemp" ) == 0 ) + { + maps\mp\killstreaks\_killstreakrules::killstreakstop( "supply_drop_mp", team, killstreak_id ); + return; + } + + inccratekillstreakusagestat( weaponname ); + rear_hatch_offset_local = getdvarintdefault( "scr_supplydropOffset", 0 ); + drop_origin = origin; + drop_height = getdropheight( drop_origin ); + heli_drop_goal = ( drop_origin[0], drop_origin[1], drop_height ); /# - sphere( heli_drop_goal, 10, ( 0, 0, 1 ), 1, 1, 10, 1000 ); + sphere( heli_drop_goal, 10, ( 0, 1, 0 ), 1, 1, 10, 1000 ); #/ - */ - goalpath = supplydrophelistartpath( heli_drop_goal, ( rear_hatch_offset_local, 0, 0 ) ); - drop_direction = vectorToAngles( ( heli_drop_goal[ 0 ], heli_drop_goal[ 1 ], 0 ) - ( goalpath.start[ 0 ], goalpath.start[ 1 ], 0 ) ); - chopper = spawn_helicopter( owner, team, goalpath.start, drop_direction, level.suppydrophelicoptervehicleinfo, level.supplydrophelicopterfriendly, killstreak_id ); - chopper setenemymodel( level.supplydrophelicopterenemy ); - chopper setteam( team ); - chopper.numflares = 0; - if ( isplayer( owner ) ) - { - chopper setowner( owner ); - } - killcament = spawn( "script_model", chopper.origin + vectorScale( ( 0, 0, 1 ), 800 ) ); - killcament.angles = ( 100, chopper.angles[ 1 ], chopper.angles[ 2 ] ); - killcament.starttime = getTime(); - killcament linkto( chopper ); - if ( isplayer( owner ) ) - { - target_setturretaquire( self, 0 ); - chopper thread samturretwatcher( drop_origin ); - } - if ( !isDefined( chopper ) ) - { - return; - } - chopper thread helidropcrate( weaponname, owner, rear_hatch_offset_local, killcament, killstreak_id, package_contents_id ); - chopper endon( "death" ); - chopper thread followpath( goalpath.path, "drop_goal", 1 ); - chopper thread speedregulator( heli_drop_goal ); - chopper waittill( "drop_goal" ); - /* + goalpath = supplydrophelistartpath( heli_drop_goal, ( rear_hatch_offset_local, 0, 0 ) ); + drop_direction = vectortoangles( ( heli_drop_goal[0], heli_drop_goal[1], 0 ) - ( goalpath.start[0], goalpath.start[1], 0 ) ); + chopper = spawn_helicopter( owner, team, goalpath.start, drop_direction, level.suppydrophelicoptervehicleinfo, level.supplydrophelicopterfriendly, killstreak_id ); + chopper setenemymodel( level.supplydrophelicopterenemy ); + chopper setteam( team ); + chopper.numflares = 0; + + if ( isplayer( owner ) ) + chopper setowner( owner ); + + killcament = spawn( "script_model", chopper.origin + vectorscale( ( 0, 0, 1 ), 800.0 ) ); + killcament.angles = ( 100, chopper.angles[1], chopper.angles[2] ); + killcament.starttime = gettime(); + killcament linkto( chopper ); + + if ( isplayer( owner ) ) + { + target_setturretaquire( self, 0 ); + chopper thread samturretwatcher( drop_origin ); + } + + if ( !isdefined( chopper ) ) + return; + + chopper thread helidropcrate( weaponname, owner, rear_hatch_offset_local, killcament, killstreak_id, package_contents_id ); + chopper endon( "death" ); + chopper thread followpath( goalpath.path, "drop_goal", 1 ); + chopper thread speedregulator( heli_drop_goal ); + + chopper waittill( "drop_goal" ); /# - println( "Chopper Incoming Time: " + ( getTime() - chopper.spawntime ) ); + println( "Chopper Incoming Time: " + gettime() - chopper.spawntime ); #/ - */ - wait 1.2; - chopper notify( "drop_crate" ); - chopper.droptime = getTime(); - chopper playsound( "veh_supply_drop" ); - wait 0.7; - supplydropspeed = getdvarintdefault( "scr_supplydropSpeedLeaving", 150 ); - supplydropaccel = getdvarintdefault( "scr_supplydropAccelLeaving", 40 ); - chopper setspeed( supplydropspeed, supplydropaccel ); - goalpath = supplydropheliendpath( chopper.origin, ( 0, chopper.angles[ 1 ], 0 ) ); - chopper followpath( goalpath.path, undefined, 0 ); - /* + wait 1.2; + chopper notify( "drop_crate", chopper.origin, chopper.angles ); + chopper.droptime = gettime(); + chopper playsound( "veh_supply_drop" ); + wait 0.7; + supplydropspeed = getdvarintdefault( "scr_supplydropSpeedLeaving", 150 ); + supplydropaccel = getdvarintdefault( "scr_supplydropAccelLeaving", 40 ); + chopper setspeed( supplydropspeed, supplydropaccel ); + goalpath = supplydropheliendpath( chopper.origin, ( 0, chopper.angles[1], 0 ) ); + chopper followpath( goalpath.path, undefined, 0 ); /# - println( "Chopper Outgoing Time: " + ( getTime() - chopper.droptime ) ); + println( "Chopper Outgoing Time: " + gettime() - chopper.droptime ); #/ - */ - chopper notify( "leaving" ); - chopper delete(); -} -samturretwatcher( destination ) //checked changed to match cerberus output -{ - self endon( "leaving" ); - self endon( "helicopter_gone" ); - self endon( "death" ); - sam_turret_aquire_dist = 1500; - while ( 1 ) - { - if ( distance( destination, self.origin ) < sam_turret_aquire_dist ) - { - break; - } - if ( ( self.origin[ 0 ] > level.spawnmins[ 0 ] ) && ( self.origin[ 0 ] < level.spawnmaxs[ 0 ] ) && ( self.origin[ 1 ] > level.spawnmins[ 1 ] ) && ( self.origin[ 1 ] < level.spawnmaxs[ 1 ] ) ) - { - break; - } - wait 0.1; - } - target_setturretaquire( self, 1 ); + chopper notify( "leaving" ); + chopper delete(); } -speedregulator( goal ) //checked matches cerberus output +samturretwatcher( destination ) { - self endon( "drop_goal" ); - self endon( "death" ); - wait 3; - supplydropspeed = getdvarintdefault( "scr_supplydropSpeed", 75 ); - supplydropaccel = getdvarintdefault( "scr_supplydropAccel", 40 ); - self setyawspeed( 100, 60, 60 ); - self setspeed( supplydropspeed, supplydropaccel ); - wait 1; - maxpitch = getdvarintdefault( "scr_supplydropMaxPitch", 25 ); - maxroll = getdvarintdefault( "scr_supplydropMaxRoll", 35 ); - self setmaxpitchroll( maxpitch, maxroll ); + self endon( "leaving" ); + self endon( "helicopter_gone" ); + self endon( "death" ); + sam_turret_aquire_dist = 1500; + + while ( true ) + { + if ( distance( destination, self.origin ) < sam_turret_aquire_dist ) + break; + + if ( self.origin[0] > level.spawnmins[0] && self.origin[0] < level.spawnmaxs[0] && self.origin[1] > level.spawnmins[1] && self.origin[1] < level.spawnmaxs[1] ) + break; + + wait 0.1; + } + + target_setturretaquire( self, 1 ); } -helidropcrate( category, owner, offset, killcament, killstreak_id, package_contents_id ) //checked changed to match cerberus output +speedregulator( goal ) { - owner endon( "disconnect" ); - crate = cratespawn( category, owner, self.team, self.origin, self.angles ); - if ( category == "inventory_supplydrop_mp" || category == "supplydrop_mp" ) - { - crate linkto( self, "tag_care_package", ( 0, 0, 0 ) ); - self setclientfield( "supplydrop_care_package_state", 1 ); - } - else if ( category == "inventory_ai_tank_drop_mp" || category == "ai_tank_drop_mp" ) - { - crate linkto( self, "tag_drop_box", ( 0, 0, 0 ) ); - self setclientfield( "supplydrop_ai_tank_state", 1 ); - } - team = self.team; - self waittill( "drop_crate", origin, angles ); - if ( isDefined( self ) ) - { - if ( category == "inventory_supplydrop_mp" || category == "supplydrop_mp" ) - { - self setclientfield( "supplydrop_care_package_state", 0 ); - } - else - { - if ( category == "inventory_ai_tank_drop_mp" || category == "ai_tank_drop_mp" ) - { - self setclientfield( "supplydrop_ai_tank_state", 0 ); - } - } - } - rear_hatch_offset_height = getdvarintdefault( "scr_supplydropOffsetHeight", 200 ); - rear_hatch_offset_world = rotatepoint( ( offset, 0, 0 ), angles ); - drop_origin = origin - ( 0, 0, rear_hatch_offset_height ) - rear_hatch_offset_world; - thread dropcrate( drop_origin, angles, category, owner, team, killcament, killstreak_id, package_contents_id, crate ); + self endon( "drop_goal" ); + self endon( "death" ); + wait 3; + supplydropspeed = getdvarintdefault( "scr_supplydropSpeed", 75 ); + supplydropaccel = getdvarintdefault( "scr_supplydropAccel", 40 ); + self setyawspeed( 100, 60, 60 ); + self setspeed( supplydropspeed, supplydropaccel ); + wait 1; + maxpitch = getdvarintdefault( "scr_supplydropMaxPitch", 25 ); + maxroll = getdvarintdefault( "scr_supplydropMaxRoll", 35 ); + self setmaxpitchroll( maxpitch, maxroll ); } -helidestroyed() //checked changed to match cerberus output +helidropcrate( category, owner, offset, killcament, killstreak_id, package_contents_id ) { - self endon( "leaving" ); - self endon( "helicopter_gone" ); - self endon( "death" ); - while ( 1 ) - { - if ( self.damagetaken > self.maxhealth ) - { - break; - } - wait 0.05; - } - if ( !isDefined( self ) ) - { - return; - } - self setspeed( 25, 5 ); - self thread lbspin( randomintrange( 180, 220 ) ); - wait randomfloatrange( 0.5, 1.5 ); - self notify( "drop_crate" ); - lbexplode(); + owner endon( "disconnect" ); + crate = cratespawn( category, owner, self.team, self.origin, self.angles ); + + if ( category == "inventory_supplydrop_mp" || category == "supplydrop_mp" ) + { + crate linkto( self, "tag_care_package", ( 0, 0, 0 ) ); + self setclientfield( "supplydrop_care_package_state", 1 ); + } + else if ( category == "inventory_ai_tank_drop_mp" || category == "ai_tank_drop_mp" ) + { + crate linkto( self, "tag_drop_box", ( 0, 0, 0 ) ); + self setclientfield( "supplydrop_ai_tank_state", 1 ); + } + + team = self.team; + + self waittill( "drop_crate", origin, angles ); + + if ( isdefined( self ) ) + { + if ( category == "inventory_supplydrop_mp" || category == "supplydrop_mp" ) + self setclientfield( "supplydrop_care_package_state", 0 ); + else if ( category == "inventory_ai_tank_drop_mp" || category == "ai_tank_drop_mp" ) + self setclientfield( "supplydrop_ai_tank_state", 0 ); + } + + rear_hatch_offset_height = getdvarintdefault( "scr_supplydropOffsetHeight", 200 ); + rear_hatch_offset_world = rotatepoint( ( offset, 0, 0 ), angles ); + drop_origin = origin - ( 0, 0, rear_hatch_offset_height ) - rear_hatch_offset_world; + thread dropcrate( drop_origin, angles, category, owner, team, killcament, killstreak_id, package_contents_id, crate ); } -lbexplode() //checked matches cerberus output +helidestroyed() { - forward = ( self.origin + ( 0, 0, 1 ) ) - self.origin; - playfx( level.chopper_fx[ "explode" ][ "death" ], self.origin, forward ); - self playsound( level.heli_sound[ "crash" ] ); - self notify( "explode" ); - self delete(); + self endon( "leaving" ); + self endon( "helicopter_gone" ); + self endon( "death" ); + + while ( true ) + { + if ( self.damagetaken > self.maxhealth ) + break; + + wait 0.05; + } + + if ( !isdefined( self ) ) + return; + + self setspeed( 25, 5 ); + self thread lbspin( randomintrange( 180, 220 ) ); + wait( randomfloatrange( 0.5, 1.5 ) ); + self notify( "drop_crate", self.origin, self.angles ); + lbexplode(); } -lbspin( speed ) //checked matches cerberus output +lbexplode() { - self endon( "explode" ); - playfxontag( level.chopper_fx[ "explode" ][ "large" ], self, "tail_rotor_jnt" ); - playfxontag( level.chopper_fx[ "fire" ][ "trail" ][ "large" ], self, "tail_rotor_jnt" ); - self setyawspeed( speed, speed, speed ); - while ( isDefined( self ) ) - { - self settargetyaw( self.angles[ 1 ] + ( speed * 0.9 ) ); - wait 1; - } + forward = self.origin + ( 0, 0, 1 ) - self.origin; + playfx( level.chopper_fx["explode"]["death"], self.origin, forward ); + self playsound( level.heli_sound["crash"] ); + self notify( "explode" ); + self delete(); } -refcountdecchopper( team, killstreak_id ) //checked matches cerberus output +lbspin( speed ) { - self waittill( "death" ); - maps/mp/killstreaks/_killstreakrules::killstreakstop( "supply_drop_mp", team, killstreak_id ); + self endon( "explode" ); + playfxontag( level.chopper_fx["explode"]["large"], self, "tail_rotor_jnt" ); + playfxontag( level.chopper_fx["fire"]["trail"]["large"], self, "tail_rotor_jnt" ); + self setyawspeed( speed, speed, speed ); + + while ( isdefined( self ) ) + { + self settargetyaw( self.angles[1] + speed * 0.9 ); + wait 1; + } } -attachreconmodel( modelname, owner ) //checked matches cerberus output +refcountdecchopper( team, killstreak_id ) { - 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 watchreconmodelfordeath( self ); - reconmodel thread resetreconmodelonevent( "joined_team", owner ); - reconmodel thread resetreconmodelonevent( "player_spawned", owner ); + self waittill( "death" ); + + maps\mp\killstreaks\_killstreakrules::killstreakstop( "supply_drop_mp", team, killstreak_id ); } -resetreconmodelvisibility( owner ) //checked partially changed to match cerberus output see compiler_limitations.md No. 2 +attachreconmodel( modelname, 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_detectexplosive" ) && !level.players[ i ] hasperk( "specialty_showenemyequipment" ) ) - { - i++; - continue; - } - if ( level.players[ i ].team == "spectator" ) - { - i++; - 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 ] ); - } - i++; - } + 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 watchreconmodelfordeath( self ); + reconmodel thread resetreconmodelonevent( "joined_team", owner ); + reconmodel thread resetreconmodelonevent( "player_spawned", owner ); } -watchreconmodelfordeath( parentent ) //checked matches cerberus output +resetreconmodelvisibility( owner ) { - self endon( "death" ); - parentent waittill_any( "death", "captured" ); - self delete(); + 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_detectexplosive" ) && !level.players[i] hasperk( "specialty_showenemyequipment" ) ) + continue; + + 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 ) //checked matches cerberus output +watchreconmodelfordeath( parentent ) { - self endon( "death" ); - for ( ;; ) - { - level waittill( eventname, newowner ); - if ( isDefined( newowner ) ) - { - owner = newowner; - } - self resetreconmodelvisibility( owner ); - } + self endon( "death" ); + parentent waittill_any( "death", "captured" ); + self delete(); } -supply_drop_dev_gui() //dev call commented out +resetreconmodelonevent( eventname, owner ) +{ + self endon( "death" ); + + for (;;) + { + level waittill( eventname, newowner ); + + if ( isdefined( newowner ) ) + owner = newowner; + + self resetreconmodelvisibility( owner ); + } +} + +supply_drop_dev_gui() { - /* /# - setdvar( "scr_supply_drop_gui", "" ); - while ( 1 ) - { - wait 0,5; - devgui_string = getDvar( "scr_supply_drop_gui" ); - switch( devgui_string ) - { - case "ammo": - level.dev_gui_supply_drop = "ammo"; - break; - continue; - case "spyplane": - level.dev_gui_supply_drop = "radar_mp"; - break; - continue; - case "counter_u2": - level.dev_gui_supply_drop = "counteruav_mp"; - break; - continue; - case "airstrike": - level.dev_gui_supply_drop = "airstrike_mp"; - break; - continue; - case "artillery": - level.dev_gui_supply_drop = "artillery_mp"; - break; - continue; - case "autoturret": - level.dev_gui_supply_drop = "autoturret_mp"; - break; - continue; - case "microwave_turret": - level.dev_gui_supply_drop = "microwaveturret_mp"; - break; - continue; - case "tow_turret": - level.dev_gui_supply_drop = "auto_tow_mp"; - break; - continue; - case "dogs": - level.dev_gui_supply_drop = "dogs_mp"; - break; - continue; - case "rc_bomb": - level.dev_gui_supply_drop = "rcbomb_mp"; - break; - continue; - case "plane_mortar": - level.dev_gui_supply_drop = "planemortar_mp"; - break; - continue; - case "heli": - level.dev_gui_supply_drop = "helicopter_comlink_mp"; - break; - continue; - case "heli_gunner": - level.dev_gui_supply_drop = "helicopter_player_gunner_mp"; - break; - continue; - case "straferun": - level.dev_gui_supply_drop = "straferun_mp"; - break; - continue; - case "missile_swarm": - level.dev_gui_supply_drop = "missile_swarm_mp"; - break; - continue; - case "missile_drone": - level.dev_gui_supply_drop = "inventory_missile_drone_mp"; - break; - continue; - case "satellite": - level.dev_gui_supply_drop = "radardirection_mp"; - break; - continue; - case "remote_missile": - level.dev_gui_supply_drop = "remote_missile_mp"; - break; - continue; - case "helicopter_guard": - level.dev_gui_supply_drop = "helicopter_guard_mp"; - break; - continue; - case "emp": - level.dev_gui_supply_drop = "emp_mp"; - break; - continue; - case "remote_mortar": - level.dev_gui_supply_drop = "remote_mortar_mp"; - break; - continue; - case "qrdrone": - level.dev_gui_supply_drop = "qrdrone_mp"; - break; - continue; - case "ai_tank": - level.dev_gui_supply_drop = "inventory_ai_tank_drop_mp"; - break; - continue; - case "minigun": - level.dev_gui_supply_drop = "inventory_minigun_mp"; - break; - continue; - case "m32": - level.dev_gui_supply_drop = "inventory_m32_mp"; - break; - continue; - case "random": - level.dev_gui_supply_drop = "random"; - break; - continue; - default: - } + setdvar( "scr_supply_drop_gui", "" ); + + while ( true ) + { + wait 0.5; + devgui_string = getdvar( "scr_supply_drop_gui" ); + + switch ( devgui_string ) + { + case "ammo": + level.dev_gui_supply_drop = "ammo"; + break; + case "spyplane": + level.dev_gui_supply_drop = "radar_mp"; + break; + case "counter_u2": + level.dev_gui_supply_drop = "counteruav_mp"; + break; + case "airstrike": + level.dev_gui_supply_drop = "airstrike_mp"; + break; + case "artillery": + level.dev_gui_supply_drop = "artillery_mp"; + break; + case "autoturret": + level.dev_gui_supply_drop = "autoturret_mp"; + break; + case "microwave_turret": + level.dev_gui_supply_drop = "microwaveturret_mp"; + break; + case "tow_turret": + level.dev_gui_supply_drop = "auto_tow_mp"; + break; + case "dogs": + level.dev_gui_supply_drop = "dogs_mp"; + break; + case "rc_bomb": + level.dev_gui_supply_drop = "rcbomb_mp"; + break; + case "plane_mortar": + level.dev_gui_supply_drop = "planemortar_mp"; + break; + case "heli": + level.dev_gui_supply_drop = "helicopter_comlink_mp"; + break; + case "heli_gunner": + level.dev_gui_supply_drop = "helicopter_player_gunner_mp"; + break; + case "straferun": + level.dev_gui_supply_drop = "straferun_mp"; + break; + case "missile_swarm": + level.dev_gui_supply_drop = "missile_swarm_mp"; + break; + case "missile_drone": + level.dev_gui_supply_drop = "inventory_missile_drone_mp"; + break; + case "satellite": + level.dev_gui_supply_drop = "radardirection_mp"; + break; + case "remote_missile": + level.dev_gui_supply_drop = "remote_missile_mp"; + break; + case "helicopter_guard": + level.dev_gui_supply_drop = "helicopter_guard_mp"; + break; + case "emp": + level.dev_gui_supply_drop = "emp_mp"; + break; + case "remote_mortar": + level.dev_gui_supply_drop = "remote_mortar_mp"; + break; + case "qrdrone": + level.dev_gui_supply_drop = "qrdrone_mp"; + break; + case "ai_tank": + level.dev_gui_supply_drop = "inventory_ai_tank_drop_mp"; + break; + case "minigun": + level.dev_gui_supply_drop = "inventory_minigun_mp"; + break; + case "m32": + level.dev_gui_supply_drop = "inventory_m32_mp"; + break; + case "random": + level.dev_gui_supply_drop = "random"; + break; + default: + break; + } + } #/ - } - } - */ } diff --git a/Multiplayer Core/patch_mp/maps/mp/killstreaks/_turret_killstreak.gsc b/Multiplayer Core/patch_mp/maps/mp/killstreaks/_turret_killstreak.gsc index 5cdce64..f4949d4 100644 --- a/Multiplayer Core/patch_mp/maps/mp/killstreaks/_turret_killstreak.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/killstreaks/_turret_killstreak.gsc @@ -1,2573 +1,2442 @@ -#include maps/mp/animscripts/dog_flashed; -#include maps/mp/_scrambler; -#include maps/mp/killstreaks/_remote_weapons; -#include maps/mp/gametypes/_weaponobjects; -#include maps/mp/gametypes/_globallogic_audio; -#include maps/mp/_challenges; -#include maps/mp/_scoreevents; -#include maps/mp/gametypes/_damagefeedback; -#include maps/mp/gametypes/_globallogic_player; -#include maps/mp/gametypes/_spawning; -#include maps/mp/_hacker_tool; -#include maps/mp/_entityheadicons; -#include maps/mp/killstreaks/_killstreakrules; -#include maps/mp/killstreaks/_supplydrop; -#include maps/mp/killstreaks/_killstreaks; -#include maps/mp/gametypes/_tweakables; -#include maps/mp/_mgturret; -#include maps/mp/gametypes/_weapons; -#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 +#include maps\mp\_utility; +#include common_scripts\utility; +#include maps\mp\gametypes\_hud_util; +#include maps\mp\gametypes\_weapons; +#include maps\mp\_mgturret; +#include maps\mp\gametypes\_tweakables; +#include maps\mp\killstreaks\_killstreaks; +#include maps\mp\killstreaks\_supplydrop; +#include maps\mp\killstreaks\_killstreakrules; +#include maps\mp\_entityheadicons; +#include maps\mp\_hacker_tool; +#include maps\mp\gametypes\_spawning; +#include maps\mp\gametypes\_globallogic_player; +#include maps\mp\gametypes\_damagefeedback; +#include maps\mp\_scoreevents; +#include maps\mp\_challenges; +#include maps\mp\gametypes\_globallogic_audio; +#include maps\mp\gametypes\_weaponobjects; +#include maps\mp\killstreaks\_remote_weapons; +#include maps\mp\_scrambler; +#include maps\mp\animscripts\dog_flashed; +#include maps\mp\killstreaks\_ai_tank; -#using_animtree( "mp_microwaveturret" ); +#using_animtree("mp_microwaveturret"); init() { - precacheturret( "auto_gun_turret_mp" ); - precacheturret( "microwave_turret_mp" ); - precachemodel( "t6_wpn_turret_sentry_gun" ); - precachemodel( "t6_wpn_turret_sentry_gun_yellow" ); - precachemodel( "t6_wpn_turret_sentry_gun_red" ); - precachemodel( "t6_wpn_turret_ads_world" ); - precachemodel( "t6_wpn_turret_ads_carry" ); - precachemodel( "t6_wpn_turret_ads_carry_animate" ); - precachemodel( "t6_wpn_turret_ads_carry_animate_red" ); - precachemodel( "t6_wpn_turret_ads_carry_red" ); - precachemodel( "tag_microwavefx" ); - precacheshellshock( "mp_radiation_high" ); - precacheshellshock( "mp_radiation_med" ); - precacheshellshock( "mp_radiation_low" ); - precacheitem( "killstreak_remote_turret_mp" ); - thread maps/mp/_mgturret::init_turret_difficulty_settings(); - level.auto_turret_timeout = 240; - level.microwave_radius = 750; - level.microwave_turret_cone_dot = cos( 45 ); - level.microwave_turret_angle = 90; - level.microwave_turret_damage = 10; - level.microwave_fx_size = 150; - flag_init( "end_target_confirm" ); - level.auto_turret_settings = []; - level.microwaveopenanim = %o_hpm_open; - level.microwavecloseanim = %o_hpm_close; - level.microwavedestroyedanim = %o_hpm_destroyed; - level.auto_turret_settings[ "sentry" ] = spawnstruct(); - level.auto_turret_settings[ "sentry" ].hintstring = &"KILLSTREAK_SENTRY_TURRET_PICKUP"; - level.auto_turret_settings[ "sentry" ].hackerhintstring = &"KILLSTREAK_TURRET_HACKING"; - level.auto_turret_settings[ "sentry" ].disablehintstring = &"KILLSTREAK_TURRET_SENTRY_DISABLE"; - level.auto_turret_settings[ "sentry" ].hinticon = "hud_ks_auto_turret"; - level.auto_turret_settings[ "sentry" ].modelbase = "t6_wpn_turret_sentry_gun"; - level.auto_turret_settings[ "sentry" ].modelgoodplacement = "t6_wpn_turret_sentry_gun_yellow"; - level.auto_turret_settings[ "sentry" ].modelbadplacement = "t6_wpn_turret_sentry_gun_red"; - level.auto_turret_settings[ "sentry" ].stunfx = loadfx( "weapon/sentry_gun/fx_sentry_gun_emp_stun" ); - level.auto_turret_settings[ "sentry" ].stunfxtag = "tag_origin"; - level.auto_turret_settings[ "sentry" ].damagefx = loadfx( "weapon/sentry_gun/fx_sentry_gun_damage_state" ); - level.auto_turret_settings[ "sentry" ].disablefx = loadfx( "weapon/sentry_gun/fx_sentry_gun_death_state" ); - level.auto_turret_settings[ "sentry" ].explodefx = loadfx( "weapon/sentry_gun/fx_sentry_gun_exp" ); - level.auto_turret_settings[ "sentry" ].stunfxfrequencymin = 0,1; - level.auto_turret_settings[ "sentry" ].stunfxfrequencymax = 0,75; - level.auto_turret_settings[ "sentry" ].turretinitdelay = 1,6; - level.auto_turret_settings[ "sentry" ].hackertoolradius = level.sentryhackertoolradius; - level.auto_turret_settings[ "sentry" ].hackertooltimems = level.sentryhackertooltimems; - level.auto_turret_settings[ "tow" ] = spawnstruct(); - level.auto_turret_settings[ "tow" ].hintstring = &"KILLSTREAK_TOW_TURRET_PICKUP"; - level.auto_turret_settings[ "tow" ].hackerhintstring = &"KILLSTREAK_TURRET_HACKING"; - level.auto_turret_settings[ "tow" ].hinticon = "hud_ks_sam_turret"; - level.auto_turret_settings[ "tow" ].modelbase = "t6_wpn_turret_sam"; - level.auto_turret_settings[ "tow" ].modelgoodplacement = "t6_wpn_turret_sam_yellow"; - level.auto_turret_settings[ "tow" ].modelbadplacement = "t6_wpn_turret_sam_red"; - level.auto_turret_settings[ "tow" ].stunfx = loadfx( "weapon/grenade/fx_spark_disabled_weapon_lg" ); - level.auto_turret_settings[ "tow" ].stunfxtag = "TAG_aim"; - level.auto_turret_settings[ "tow" ].stunfxfrequencymin = 0,1; - level.auto_turret_settings[ "tow" ].stunfxfrequencymax = 0,75; - level.auto_turret_settings[ "tow" ].turretinitdelay = 3; - level.auto_turret_settings[ "tow" ].turretfiredelay = 5; - level.auto_turret_settings[ "microwave" ] = spawnstruct(); - level.auto_turret_settings[ "microwave" ].hintstring = &"KILLSTREAK_MICROWAVE_TURRET_PICKUP"; - level.auto_turret_settings[ "microwave" ].hackerhintstring = &"KILLSTREAK_TURRET_MICROWAVE_HACKING"; - level.auto_turret_settings[ "microwave" ].disablehintstring = &"KILLSTREAK_TURRET_MICROWAVE_DISABLE"; - level.auto_turret_settings[ "microwave" ].hinticon = "hud_ks_microwave_turret"; - level.auto_turret_settings[ "microwave" ].modelbase = "t6_wpn_turret_ads_world"; - level.auto_turret_settings[ "microwave" ].modelgoodplacement = "t6_wpn_turret_ads_carry"; - level.auto_turret_settings[ "microwave" ].modelgoodplacementanimate = "t6_wpn_turret_ads_carry_animate"; - level.auto_turret_settings[ "microwave" ].modelbadplacementanimate = "t6_wpn_turret_ads_carry_animate_red"; - level.auto_turret_settings[ "microwave" ].modelbadplacement = "t6_wpn_turret_ads_carry_red"; - level.auto_turret_settings[ "microwave" ].stunfx = loadfx( "weapon/silent_gaurdian/fx_sg_emp_stun" ); - level.auto_turret_settings[ "microwave" ].loopsoundfx = "wpn_sguard_beam"; - level.auto_turret_settings[ "microwave" ].stunfxtag = "tag_origin"; - level.auto_turret_settings[ "microwave" ].damagefx = loadfx( "weapon/silent_gaurdian/fx_sg_damage_state" ); - level.auto_turret_settings[ "microwave" ].disablefx = loadfx( "weapon/silent_gaurdian/fx_sg_death_state" ); - level.auto_turret_settings[ "microwave" ].explodefx = loadfx( "weapon/silent_gaurdian/fx_sg_exp" ); - level.auto_turret_settings[ "microwave" ].stunfxfrequencymin = 0,1; - level.auto_turret_settings[ "microwave" ].stunfxfrequencymax = 0,75; - level.auto_turret_settings[ "microwave" ].turretinitdelay = 1; - level.auto_turret_settings[ "microwave" ].timeout = 240; - level.auto_turret_settings[ "microwave" ].fxchecktime = 5; - level.auto_turret_settings[ "microwave" ].hackertoolradius = level.microwavehackertoolradius; - level.auto_turret_settings[ "microwave" ].hackertooltimems = level.microwavehackertooltimems; - level.auto_turret_settings[ "microwave" ].microwave_radius_1 = int( level.microwave_radius / 8 ); - level.auto_turret_settings[ "microwave" ].microwave_radius_2 = int( level.microwave_radius / 2 ); - level.auto_turret_settings[ "microwave" ].microwave_radius_3 = int( ( level.microwave_radius * 3 ) / 4 ); - level.auto_turret_settings[ "microwave" ].microwave_radius_4 = int( level.microwave_radius ); - level.auto_turret_settings[ "microwave" ].fx = loadfx( "weapon/silent_gaurdian/fx_sg_distortion_cone_ash" ); - level._turret_explode_fx = loadfx( "explosions/fx_exp_equipment_lg" ); - minefields = getentarray( "minefield", "targetname" ); - hurt_triggers = getentarray( "trigger_hurt", "classname" ); - level.fatal_triggers = arraycombine( minefields, hurt_triggers, 1, 0 ); - level.noturretplacementtriggers = getentarray( "no_turret_placement", "targetname" ); - level notify( "no_turret_trigger_created" ); - if ( maps/mp/gametypes/_tweakables::gettweakablevalue( "killstreak", "allowauto_turret" ) ) - { - maps/mp/killstreaks/_killstreaks::registerkillstreak( "autoturret_mp", "autoturret_mp", "killstreak_auto_turret", "auto_turret_used", ::usesentryturretkillstreak ); - maps/mp/killstreaks/_killstreaks::registerkillstreakaltweapon( "autoturret_mp", "auto_gun_turret_mp" ); - maps/mp/killstreaks/_killstreaks::registerkillstreakremoteoverrideweapon( "autoturret_mp", "killstreak_remote_turret_mp" ); - maps/mp/killstreaks/_killstreaks::registerkillstreakstrings( "autoturret_mp", &"KILLSTREAK_EARNED_AUTO_TURRET", &"KILLSTREAK_AUTO_TURRET_NOT_AVAILABLE" ); - maps/mp/killstreaks/_killstreaks::registerkillstreakdialog( "autoturret_mp", "mpl_killstreak_auto_turret", "kls_turret_used", "", "kls_turret_enemy", "", "kls_turret_ready" ); - maps/mp/killstreaks/_killstreaks::registerkillstreakdevdvar( "autoturret_mp", "scr_giveautoturret" ); - maps/mp/killstreaks/_killstreaks::registerkillstreak( "turret_drop_mp", "turret_drop_mp", "killstreak_auto_turret_drop", "auto_turret_used", ::usekillstreakturretdrop, undefined, 1 ); - maps/mp/killstreaks/_killstreaks::registerkillstreakremoteoverrideweapon( "turret_drop_mp", "killstreak_remote_turret_mp" ); - maps/mp/killstreaks/_killstreaks::registerkillstreakstrings( "turret_drop_mp", &"KILLSTREAK_EARNED_AUTO_TURRET", &"KILLSTREAK_AIRSPACE_FULL" ); - maps/mp/killstreaks/_killstreaks::registerkillstreakdialog( "turret_drop_mp", "mpl_killstreak_turret", "kls_turret_used", "", "kls_turret_enemy", "", "kls_turret_ready" ); - maps/mp/killstreaks/_killstreaks::registerkillstreakdevdvar( "turret_drop_mp", "scr_giveautoturretdrop" ); - maps/mp/killstreaks/_supplydrop::registercratetype( "turret_drop_mp", "killstreak", "autoturret_mp", 1, &"KILLSTREAK_AUTO_TURRET_CRATE", undefined, "MEDAL_SHARE_PACKAGE_AUTO_TURRET", maps/mp/killstreaks/_supplydrop::givecratekillstreak ); - level.killstreakicons[ "autoturret_mp" ] = "hud_ks_auto_turret"; - maps/mp/killstreaks/_killstreaks::registerkillstreak( "microwaveturret_mp", "microwaveturret_mp", "killstreak_microwave_turret", "microwave_turret_used", ::usemicrowaveturretkillstreak ); - maps/mp/killstreaks/_killstreaks::registerkillstreakaltweapon( "microwaveturret_mp", "microwave_turret_mp" ); - maps/mp/killstreaks/_killstreaks::registerkillstreakaltweapon( "microwaveturret_mp", "microwave_turret_damage_mp" ); - maps/mp/killstreaks/_killstreaks::registerkillstreakstrings( "microwaveturret_mp", &"KILLSTREAK_EARNED_MICROWAVE_TURRET", &"KILLSTREAK_MICROWAVE_TURRET_NOT_AVAILABLE" ); - maps/mp/killstreaks/_killstreaks::registerkillstreakdialog( "microwaveturret_mp", "mpl_killstreak_auto_turret", "kls_microwave_used", "", "kls_microwave_enemy", "", "kls_microwave_ready" ); - maps/mp/killstreaks/_killstreaks::registerkillstreakdevdvar( "microwaveturret_mp", "scr_givemicrowaveturret" ); - maps/mp/killstreaks/_killstreaks::setkillstreakteamkillpenaltyscale( "microwaveturret_mp", level.teamkillreducedpenalty ); - maps/mp/killstreaks/_killstreaks::registerkillstreak( "microwaveturret_drop_mp", "microwaveturret_drop_mp", "killstreak_microwave_turret_drop", "microwave_turret_used", ::usekillstreakturretdrop, undefined, 1 ); - maps/mp/killstreaks/_killstreaks::registerkillstreakstrings( "microwaveturret_drop_mp", &"KILLSTREAK_EARNED_MICROWAVE_TURRET", &"KILLSTREAK_AIRSPACE_FULL" ); - maps/mp/killstreaks/_killstreaks::registerkillstreakdialog( "microwaveturret_drop_mp", "mpl_killstreak_turret", "kls_microwave_used", "", "kls_microwave_enemy", "", "kls_microwave_ready" ); - maps/mp/killstreaks/_killstreaks::registerkillstreakdevdvar( "microwaveturret_drop_mp", "scr_givemicrowaveturretdrop" ); - maps/mp/killstreaks/_supplydrop::registercratetype( "microwaveturret_drop_mp", "killstreak", "microwaveturret_mp", 1, &"KILLSTREAK_MICROWAVE_TURRET_CRATE", undefined, "MEDAL_SHARE_PACKAGE_MICROWAVE_TURRET", maps/mp/killstreaks/_supplydrop::givecratekillstreak ); - level.killstreakicons[ "microwaveturret_mp" ] = "hud_ks_microwave_turret"; - } - level.turrets_headicon_offset = []; - level.turrets_headicon_offset[ "default" ] = vectorScale( ( 0, 0, 0 ), 70 ); - level.turrets_headicon_offset[ "sentry" ] = vectorScale( ( 0, 0, 0 ), 70 ); - level.turrets_headicon_offset[ "tow" ] = vectorScale( ( 0, 0, 0 ), 65 ); - level.turrets_headicon_offset[ "microwave" ] = vectorScale( ( 0, 0, 0 ), 80 ); - level.turrets_hacker_trigger_width = 72; - level.turrets_hacker_trigger_height = 96; - setdvar( "scr_turret_no_timeout", 0 ); - setdvar( "turret_sentryTargetTime", 1500 ); - setdvar( "turret_TargetLeadBias", 1,5 ); - registerclientfield( "turret", "turret_microwave_sounds", 1000, 1, "int" ); + precacheturret( "auto_gun_turret_mp" ); + precacheturret( "microwave_turret_mp" ); + precachemodel( "t6_wpn_turret_sentry_gun" ); + precachemodel( "t6_wpn_turret_sentry_gun_yellow" ); + precachemodel( "t6_wpn_turret_sentry_gun_red" ); + precachemodel( "t6_wpn_turret_ads_world" ); + precachemodel( "t6_wpn_turret_ads_carry" ); + precachemodel( "t6_wpn_turret_ads_carry_animate" ); + precachemodel( "t6_wpn_turret_ads_carry_animate_red" ); + precachemodel( "t6_wpn_turret_ads_carry_red" ); + precachemodel( "tag_microwavefx" ); + precacheshellshock( "mp_radiation_high" ); + precacheshellshock( "mp_radiation_med" ); + precacheshellshock( "mp_radiation_low" ); + precacheitem( "killstreak_remote_turret_mp" ); + thread maps\mp\_mgturret::init_turret_difficulty_settings(); + level.auto_turret_timeout = 240.0; + level.microwave_radius = 750; + level.microwave_turret_cone_dot = cos( 45 ); + level.microwave_turret_angle = 90; + level.microwave_turret_damage = 10; + level.microwave_fx_size = 150; + flag_init( "end_target_confirm" ); + level.auto_turret_settings = []; + level.microwaveopenanim = %o_hpm_open; + level.microwavecloseanim = %o_hpm_close; + level.microwavedestroyedanim = %o_hpm_destroyed; + level.auto_turret_settings["sentry"] = spawnstruct(); + level.auto_turret_settings["sentry"].hintstring = &"KILLSTREAK_SENTRY_TURRET_PICKUP"; + level.auto_turret_settings["sentry"].hackerhintstring = &"KILLSTREAK_TURRET_HACKING"; + level.auto_turret_settings["sentry"].disablehintstring = &"KILLSTREAK_TURRET_SENTRY_DISABLE"; + level.auto_turret_settings["sentry"].hinticon = "hud_ks_auto_turret"; + level.auto_turret_settings["sentry"].modelbase = "t6_wpn_turret_sentry_gun"; + level.auto_turret_settings["sentry"].modelgoodplacement = "t6_wpn_turret_sentry_gun_yellow"; + level.auto_turret_settings["sentry"].modelbadplacement = "t6_wpn_turret_sentry_gun_red"; + level.auto_turret_settings["sentry"].stunfx = loadfx( "weapon/sentry_gun/fx_sentry_gun_emp_stun" ); + level.auto_turret_settings["sentry"].stunfxtag = "tag_origin"; + level.auto_turret_settings["sentry"].damagefx = loadfx( "weapon/sentry_gun/fx_sentry_gun_damage_state" ); + level.auto_turret_settings["sentry"].disablefx = loadfx( "weapon/sentry_gun/fx_sentry_gun_death_state" ); + level.auto_turret_settings["sentry"].explodefx = loadfx( "weapon/sentry_gun/fx_sentry_gun_exp" ); + level.auto_turret_settings["sentry"].stunfxfrequencymin = 0.1; + level.auto_turret_settings["sentry"].stunfxfrequencymax = 0.75; + level.auto_turret_settings["sentry"].turretinitdelay = 1.6; + level.auto_turret_settings["sentry"].hackertoolradius = level.sentryhackertoolradius; + level.auto_turret_settings["sentry"].hackertooltimems = level.sentryhackertooltimems; + level.auto_turret_settings["tow"] = spawnstruct(); + level.auto_turret_settings["tow"].hintstring = &"KILLSTREAK_TOW_TURRET_PICKUP"; + level.auto_turret_settings["tow"].hackerhintstring = &"KILLSTREAK_TURRET_HACKING"; + level.auto_turret_settings["tow"].hinticon = "hud_ks_sam_turret"; + level.auto_turret_settings["tow"].modelbase = "t6_wpn_turret_sam"; + level.auto_turret_settings["tow"].modelgoodplacement = "t6_wpn_turret_sam_yellow"; + level.auto_turret_settings["tow"].modelbadplacement = "t6_wpn_turret_sam_red"; + level.auto_turret_settings["tow"].stunfx = loadfx( "weapon/grenade/fx_spark_disabled_weapon_lg" ); + level.auto_turret_settings["tow"].stunfxtag = "TAG_aim"; + level.auto_turret_settings["tow"].stunfxfrequencymin = 0.1; + level.auto_turret_settings["tow"].stunfxfrequencymax = 0.75; + level.auto_turret_settings["tow"].turretinitdelay = 3.0; + level.auto_turret_settings["tow"].turretfiredelay = 5.0; + level.auto_turret_settings["microwave"] = spawnstruct(); + level.auto_turret_settings["microwave"].hintstring = &"KILLSTREAK_MICROWAVE_TURRET_PICKUP"; + level.auto_turret_settings["microwave"].hackerhintstring = &"KILLSTREAK_TURRET_MICROWAVE_HACKING"; + level.auto_turret_settings["microwave"].disablehintstring = &"KILLSTREAK_TURRET_MICROWAVE_DISABLE"; + level.auto_turret_settings["microwave"].hinticon = "hud_ks_microwave_turret"; + level.auto_turret_settings["microwave"].modelbase = "t6_wpn_turret_ads_world"; + level.auto_turret_settings["microwave"].modelgoodplacement = "t6_wpn_turret_ads_carry"; + level.auto_turret_settings["microwave"].modelgoodplacementanimate = "t6_wpn_turret_ads_carry_animate"; + level.auto_turret_settings["microwave"].modelbadplacementanimate = "t6_wpn_turret_ads_carry_animate_red"; + level.auto_turret_settings["microwave"].modelbadplacement = "t6_wpn_turret_ads_carry_red"; + level.auto_turret_settings["microwave"].stunfx = loadfx( "weapon/silent_gaurdian/fx_sg_emp_stun" ); + level.auto_turret_settings["microwave"].loopsoundfx = "wpn_sguard_beam"; + level.auto_turret_settings["microwave"].stunfxtag = "tag_origin"; + level.auto_turret_settings["microwave"].damagefx = loadfx( "weapon/silent_gaurdian/fx_sg_damage_state" ); + level.auto_turret_settings["microwave"].disablefx = loadfx( "weapon/silent_gaurdian/fx_sg_death_state" ); + level.auto_turret_settings["microwave"].explodefx = loadfx( "weapon/silent_gaurdian/fx_sg_exp" ); + level.auto_turret_settings["microwave"].stunfxfrequencymin = 0.1; + level.auto_turret_settings["microwave"].stunfxfrequencymax = 0.75; + level.auto_turret_settings["microwave"].turretinitdelay = 1.0; + level.auto_turret_settings["microwave"].timeout = 240.0; + level.auto_turret_settings["microwave"].fxchecktime = 5.0; + level.auto_turret_settings["microwave"].hackertoolradius = level.microwavehackertoolradius; + level.auto_turret_settings["microwave"].hackertooltimems = level.microwavehackertooltimems; + level.auto_turret_settings["microwave"].microwave_radius_1 = int( level.microwave_radius / 8 ); + level.auto_turret_settings["microwave"].microwave_radius_2 = int( level.microwave_radius / 2 ); + level.auto_turret_settings["microwave"].microwave_radius_3 = int( level.microwave_radius * 3 / 4 ); + level.auto_turret_settings["microwave"].microwave_radius_4 = int( level.microwave_radius ); + level.auto_turret_settings["microwave"].fx = loadfx( "weapon/silent_gaurdian/fx_sg_distortion_cone_ash" ); + level._turret_explode_fx = loadfx( "explosions/fx_exp_equipment_lg" ); + minefields = getentarray( "minefield", "targetname" ); + hurt_triggers = getentarray( "trigger_hurt", "classname" ); + level.fatal_triggers = arraycombine( minefields, hurt_triggers, 1, 0 ); + level.noturretplacementtriggers = getentarray( "no_turret_placement", "targetname" ); + level notify( "no_turret_trigger_created" ); + + if ( maps\mp\gametypes\_tweakables::gettweakablevalue( "killstreak", "allowauto_turret" ) ) + { + maps\mp\killstreaks\_killstreaks::registerkillstreak( "autoturret_mp", "autoturret_mp", "killstreak_auto_turret", "auto_turret_used", ::usesentryturretkillstreak ); + maps\mp\killstreaks\_killstreaks::registerkillstreakaltweapon( "autoturret_mp", "auto_gun_turret_mp" ); + maps\mp\killstreaks\_killstreaks::registerkillstreakremoteoverrideweapon( "autoturret_mp", "killstreak_remote_turret_mp" ); + maps\mp\killstreaks\_killstreaks::registerkillstreakstrings( "autoturret_mp", &"KILLSTREAK_EARNED_AUTO_TURRET", &"KILLSTREAK_AUTO_TURRET_NOT_AVAILABLE" ); + maps\mp\killstreaks\_killstreaks::registerkillstreakdialog( "autoturret_mp", "mpl_killstreak_auto_turret", "kls_turret_used", "", "kls_turret_enemy", "", "kls_turret_ready" ); + maps\mp\killstreaks\_killstreaks::registerkillstreakdevdvar( "autoturret_mp", "scr_giveautoturret" ); + maps\mp\killstreaks\_killstreaks::registerkillstreak( "turret_drop_mp", "turret_drop_mp", "killstreak_auto_turret_drop", "auto_turret_used", ::usekillstreakturretdrop, undefined, 1 ); + maps\mp\killstreaks\_killstreaks::registerkillstreakremoteoverrideweapon( "turret_drop_mp", "killstreak_remote_turret_mp" ); + maps\mp\killstreaks\_killstreaks::registerkillstreakstrings( "turret_drop_mp", &"KILLSTREAK_EARNED_AUTO_TURRET", &"KILLSTREAK_AIRSPACE_FULL" ); + maps\mp\killstreaks\_killstreaks::registerkillstreakdialog( "turret_drop_mp", "mpl_killstreak_turret", "kls_turret_used", "", "kls_turret_enemy", "", "kls_turret_ready" ); + maps\mp\killstreaks\_killstreaks::registerkillstreakdevdvar( "turret_drop_mp", "scr_giveautoturretdrop" ); + maps\mp\killstreaks\_supplydrop::registercratetype( "turret_drop_mp", "killstreak", "autoturret_mp", 1, &"KILLSTREAK_AUTO_TURRET_CRATE", undefined, "MEDAL_SHARE_PACKAGE_AUTO_TURRET", maps\mp\killstreaks\_supplydrop::givecratekillstreak ); + level.killstreakicons["autoturret_mp"] = "hud_ks_auto_turret"; + maps\mp\killstreaks\_killstreaks::registerkillstreak( "microwaveturret_mp", "microwaveturret_mp", "killstreak_microwave_turret", "microwave_turret_used", ::usemicrowaveturretkillstreak ); + maps\mp\killstreaks\_killstreaks::registerkillstreakaltweapon( "microwaveturret_mp", "microwave_turret_mp" ); + maps\mp\killstreaks\_killstreaks::registerkillstreakaltweapon( "microwaveturret_mp", "microwave_turret_damage_mp" ); + maps\mp\killstreaks\_killstreaks::registerkillstreakstrings( "microwaveturret_mp", &"KILLSTREAK_EARNED_MICROWAVE_TURRET", &"KILLSTREAK_MICROWAVE_TURRET_NOT_AVAILABLE" ); + maps\mp\killstreaks\_killstreaks::registerkillstreakdialog( "microwaveturret_mp", "mpl_killstreak_auto_turret", "kls_microwave_used", "", "kls_microwave_enemy", "", "kls_microwave_ready" ); + maps\mp\killstreaks\_killstreaks::registerkillstreakdevdvar( "microwaveturret_mp", "scr_givemicrowaveturret" ); + maps\mp\killstreaks\_killstreaks::setkillstreakteamkillpenaltyscale( "microwaveturret_mp", level.teamkillreducedpenalty ); + maps\mp\killstreaks\_killstreaks::registerkillstreak( "microwaveturret_drop_mp", "microwaveturret_drop_mp", "killstreak_microwave_turret_drop", "microwave_turret_used", ::usekillstreakturretdrop, undefined, 1 ); + maps\mp\killstreaks\_killstreaks::registerkillstreakstrings( "microwaveturret_drop_mp", &"KILLSTREAK_EARNED_MICROWAVE_TURRET", &"KILLSTREAK_AIRSPACE_FULL" ); + maps\mp\killstreaks\_killstreaks::registerkillstreakdialog( "microwaveturret_drop_mp", "mpl_killstreak_turret", "kls_microwave_used", "", "kls_microwave_enemy", "", "kls_microwave_ready" ); + maps\mp\killstreaks\_killstreaks::registerkillstreakdevdvar( "microwaveturret_drop_mp", "scr_givemicrowaveturretdrop" ); + maps\mp\killstreaks\_supplydrop::registercratetype( "microwaveturret_drop_mp", "killstreak", "microwaveturret_mp", 1, &"KILLSTREAK_MICROWAVE_TURRET_CRATE", undefined, "MEDAL_SHARE_PACKAGE_MICROWAVE_TURRET", maps\mp\killstreaks\_supplydrop::givecratekillstreak ); + level.killstreakicons["microwaveturret_mp"] = "hud_ks_microwave_turret"; + } + + level.turrets_headicon_offset = []; + level.turrets_headicon_offset["default"] = vectorscale( ( 0, 0, 1 ), 70.0 ); + level.turrets_headicon_offset["sentry"] = vectorscale( ( 0, 0, 1 ), 70.0 ); + level.turrets_headicon_offset["tow"] = vectorscale( ( 0, 0, 1 ), 65.0 ); + level.turrets_headicon_offset["microwave"] = vectorscale( ( 0, 0, 1 ), 80.0 ); + level.turrets_hacker_trigger_width = 72; + level.turrets_hacker_trigger_height = 96; + setdvar( "scr_turret_no_timeout", 0 ); + setdvar( "turret_sentryTargetTime", 1500 ); + setdvar( "turret_TargetLeadBias", 1.5 ); + registerclientfield( "turret", "turret_microwave_sounds", 1000, 1, "int" ); } usekillstreakturretdrop( hardpointtype ) { - if ( self maps/mp/killstreaks/_supplydrop::issupplydropgrenadeallowed( hardpointtype ) == 0 ) - { - return 0; - } - result = self maps/mp/killstreaks/_supplydrop::usesupplydropmarker(); - self notify( "supply_drop_marker_done" ); - if ( !isDefined( result ) || !result ) - { - return 0; - } - return result; + if ( self maps\mp\killstreaks\_supplydrop::issupplydropgrenadeallowed( hardpointtype ) == 0 ) + return 0; + + result = self maps\mp\killstreaks\_supplydrop::usesupplydropmarker(); + self notify( "supply_drop_marker_done" ); + + if ( !isdefined( result ) || !result ) + return 0; + + return result; } usesentryturretkillstreak( hardpointtype ) { - if ( self maps/mp/killstreaks/_killstreaks::isinteractingwithobject() ) - { - return 0; - } - if ( self maps/mp/killstreaks/_killstreakrules::iskillstreakallowed( hardpointtype, self.team ) == 0 ) - { - return 0; - } - killstreak_id = self maps/mp/killstreaks/_killstreakrules::killstreakstart( hardpointtype, self.team ); - if ( killstreak_id == -1 ) - { - return 0; - } - turret = self usesentryturret( hardpointtype ); - turret.killstreak_id = killstreak_id; - event = turret waittill_any_return( "turret_placed", "destroy_turret", "death", "turret_emped" ); - if ( event == "turret_placed" ) - { - level.globalkillstreakscalled++; - self addweaponstat( hardpointtype, "used", 1 ); - return 1; - } - if ( event == "death" ) - { - returnturrettoinventory( turret ); - return 0; - } - if ( event == "turret_emped" ) - { - level.globalkillstreakscalled++; - self addweaponstat( hardpointtype, "used", 1 ); - turret notify( "destroy_turret" ); - return 1; - } - return 0; + if ( self maps\mp\killstreaks\_killstreaks::isinteractingwithobject() ) + return false; + + if ( self maps\mp\killstreaks\_killstreakrules::iskillstreakallowed( hardpointtype, self.team ) == 0 ) + return false; + + killstreak_id = self maps\mp\killstreaks\_killstreakrules::killstreakstart( hardpointtype, self.team ); + + if ( killstreak_id == -1 ) + return false; + + turret = self usesentryturret( hardpointtype ); + turret.killstreak_id = killstreak_id; + event = turret waittill_any_return( "turret_placed", "destroy_turret", "death", "turret_emped" ); + + if ( event == "turret_placed" ) + { + level.globalkillstreakscalled++; + self addweaponstat( hardpointtype, "used", 1 ); + return true; + } + + if ( event == "death" ) + { + returnturrettoinventory( turret ); + return false; + } + + if ( event == "turret_emped" ) + { + level.globalkillstreakscalled++; + self addweaponstat( hardpointtype, "used", 1 ); + turret notify( "destroy_turret", 0 ); + return true; + } + + return false; } usetowturretkillstreak( hardpointtype ) { - if ( self maps/mp/killstreaks/_killstreakrules::iskillstreakallowed( hardpointtype, self.team ) == 0 ) - { - return 0; - } - killstreak_id = self maps/mp/killstreaks/_killstreakrules::killstreakstart( hardpointtype, self.team ); - if ( killstreak_id == -1 ) - { - return 0; - } - turret = self usetowturret( hardpointtype ); - turret.killstreak_id = killstreak_id; - event = turret waittill_any_return( "turret_placed", "destroy_turret", "death", "turret_emped" ); - if ( event == "turret_placed" ) - { - return 1; - } - if ( event == "death" ) - { - returnturrettoinventory( turret ); - return 0; - } - if ( event == "turret_emped" ) - { - turret notify( "destroy_turret" ); - return 1; - } - return 0; + if ( self maps\mp\killstreaks\_killstreakrules::iskillstreakallowed( hardpointtype, self.team ) == 0 ) + return false; + + killstreak_id = self maps\mp\killstreaks\_killstreakrules::killstreakstart( hardpointtype, self.team ); + + if ( killstreak_id == -1 ) + return false; + + turret = self usetowturret( hardpointtype ); + turret.killstreak_id = killstreak_id; + event = turret waittill_any_return( "turret_placed", "destroy_turret", "death", "turret_emped" ); + + if ( event == "turret_placed" ) + return true; + + if ( event == "death" ) + { + returnturrettoinventory( turret ); + return false; + } + + if ( event == "turret_emped" ) + { + turret notify( "destroy_turret", 0 ); + return true; + } + + return false; } usemicrowaveturretkillstreak( hardpointtype ) { - if ( self maps/mp/killstreaks/_killstreakrules::iskillstreakallowed( hardpointtype, self.team ) == 0 ) - { - return 0; - } - if ( self maps/mp/killstreaks/_killstreaks::isinteractingwithobject() ) - { - return 0; - } - killstreak_id = self maps/mp/killstreaks/_killstreakrules::killstreakstart( hardpointtype, self.team ); - if ( killstreak_id == -1 ) - { - return 0; - } - turret = self usemicrowaveturret( hardpointtype ); - turret.killstreak_id = killstreak_id; - event = turret waittill_any_return( "turret_placed", "destroy_turret", "death", "turret_emped" ); - if ( event == "turret_placed" ) - { - level.globalkillstreakscalled++; - self addweaponstat( hardpointtype, "used", 1 ); - return 1; - } - if ( event == "death" ) - { - returnturrettoinventory( turret ); - return 0; - } - if ( event == "turret_emped" ) - { - level.globalkillstreakscalled++; - self addweaponstat( hardpointtype, "used", 1 ); - turret notify( "destroy_turret" ); - return 1; - } - return 0; + if ( self maps\mp\killstreaks\_killstreakrules::iskillstreakallowed( hardpointtype, self.team ) == 0 ) + return false; + + if ( self maps\mp\killstreaks\_killstreaks::isinteractingwithobject() ) + return false; + + killstreak_id = self maps\mp\killstreaks\_killstreakrules::killstreakstart( hardpointtype, self.team ); + + if ( killstreak_id == -1 ) + return false; + + turret = self usemicrowaveturret( hardpointtype ); + turret.killstreak_id = killstreak_id; + event = turret waittill_any_return( "turret_placed", "destroy_turret", "death", "turret_emped" ); + + if ( event == "turret_placed" ) + { + level.globalkillstreakscalled++; + self addweaponstat( hardpointtype, "used", 1 ); + return true; + } + + if ( event == "death" ) + { + returnturrettoinventory( turret ); + return false; + } + + if ( event == "turret_emped" ) + { + level.globalkillstreakscalled++; + self addweaponstat( hardpointtype, "used", 1 ); + turret notify( "destroy_turret", 0 ); + return true; + } + + return false; } usesentryturret( hardpointtype ) { - self maps/mp/killstreaks/_killstreaks::switchtolastnonkillstreakweapon(); - if ( isDefined( level.usingmomentum ) && !level.usingmomentum && !self maps/mp/killstreaks/_killstreaks::getiftopkillstreakhasbeenused() ) - { - level.globalkillstreakscalled++; - self addweaponstat( hardpointtype, "used", 1 ); - } - turret = spawnturret( "auto_turret", self.origin, "auto_gun_turret_mp" ); - turret.turrettype = "sentry"; - turret setturrettype( turret.turrettype ); - turret setmodel( level.auto_turret_settings[ turret.turrettype ].modelgoodplacement ); - turret.angles = self.angles; - turret.hardpointweapon = hardpointtype; - turret.hasbeenplanted = 0; - turret.waitfortargettobeginlifespan = 0; - self.turret_active = 0; - self.curr_time = -1; - turret.stunnedbytacticalgrenade = 0; - turret.stuntime = 0; - turret setturretowner( self ); - turret setturretminimapvisible( 1 ); - turret.isfrominventory = self.usingkillstreakfrominventory; - turret setdrawinfrared( 1 ); - target_set( turret, vectorScale( ( 0, 0, 0 ), 40 ) ); - turret.controlled = 0; - if ( !isDefined( self.numturrets ) ) - { - self.numturrets = 1; - } - else - { - self.numturrets++; - } - turret.ownernumber = self.numturrets; - if ( level.teambased ) - { - turret setturretteam( self.team ); - turret.team = self.team; - } - else - { - turret setturretteam( "free" ); - turret.team = "free"; - } - setupturrethealth( turret ); - turret.carried = 1; - turret.curr_time = 0; - turret.stunduration = 5; - turret.remotecontrolled = 0; - turret thread watchturretlifespan(); - self thread watchownerdisconnect( turret ); - self thread watchownerteamkillkicked( turret ); - turret thread destroyturret(); - turret thread turret_target_aquired_watch( self ); - turret thread turret_target_lost_watch( self ); - self thread startcarryturret( turret ); - return turret; + self maps\mp\killstreaks\_killstreaks::switchtolastnonkillstreakweapon(); + + if ( ( !isdefined( level.usingmomentum ) || !level.usingmomentum ) && !self maps\mp\killstreaks\_killstreaks::getiftopkillstreakhasbeenused() ) + { + level.globalkillstreakscalled++; + self addweaponstat( hardpointtype, "used", 1 ); + } + + turret = spawnturret( "auto_turret", self.origin, "auto_gun_turret_mp" ); + turret.turrettype = "sentry"; + turret setturrettype( turret.turrettype ); + turret setmodel( level.auto_turret_settings[turret.turrettype].modelgoodplacement ); + turret.angles = self.angles; + turret.hardpointweapon = hardpointtype; + turret.hasbeenplanted = 0; + turret.waitfortargettobeginlifespan = 0; + self.turret_active = 0; + self.curr_time = -1; + turret.stunnedbytacticalgrenade = 0; + turret.stuntime = 0.0; + turret setturretowner( self ); + turret setturretminimapvisible( 1 ); + turret.isfrominventory = self.usingkillstreakfrominventory; + turret setdrawinfrared( 1 ); + target_set( turret, vectorscale( ( 0, 0, 1 ), 40.0 ) ); + turret.controlled = 0; + + if ( !isdefined( self.numturrets ) ) + self.numturrets = 1; + else + self.numturrets++; + + turret.ownernumber = self.numturrets; + + if ( level.teambased ) + { + turret setturretteam( self.team ); + turret.team = self.team; + } + else + { + turret setturretteam( "free" ); + turret.team = "free"; + } + + setupturrethealth( turret ); + turret.carried = 1; + turret.curr_time = 0; + turret.stunduration = 5.0; + turret.remotecontrolled = 0; + turret thread watchturretlifespan(); + self thread watchownerdisconnect( turret ); + self thread watchownerteamkillkicked( turret ); + turret thread destroyturret(); + turret thread turret_target_aquired_watch( self ); + turret thread turret_target_lost_watch( self ); + self thread startcarryturret( turret ); + return turret; } usetowturret( hardpointtype ) { - self maps/mp/killstreaks/_killstreaks::switchtolastnonkillstreakweapon(); - if ( isDefined( level.usingmomentum ) && !level.usingmomentum && !self maps/mp/killstreaks/_killstreaks::getiftopkillstreakhasbeenused() ) - { - level.globalkillstreakscalled++; - self addweaponstat( hardpointtype, "used", 1 ); - } - turret = spawnturret( "auto_turret", self.origin, "tow_turret_mp" ); - turret.turrettype = "tow"; - turret setturrettype( turret.turrettype ); - turret setmodel( level.auto_turret_settings[ turret.turrettype ].modelgoodplacement ); - turret.angles = self.angles; - turret.hardpointweapon = hardpointtype; - turret.hasbeenplanted = 0; - turret.waitfortargettobeginlifespan = 0; - turret.firetime = level.auto_turret_settings[ "tow" ].turretfiredelay; - self.turret_active = 0; - turret.stunnedbytacticalgrenade = 0; - turret.stuntime = 0; - turret setturretowner( self ); - turret setturretminimapvisible( 1 ); - turret.isfrominventory = self.usingkillstreakfrominventory; - if ( level.teambased ) - { - turret setturretteam( self.team ); - turret.team = self.team; - } - else - { - turret setturretteam( "free" ); - turret.team = "free"; - } - setupturrethealth( turret ); - turret.carried = 1; - turret.curr_time = 0; - turret.stunduration = 5; - turret setscanningpitch( -35 ); - turret thread watchturretlifespan(); - self thread watchownerdisconnect( turret ); - self thread watchownerteamkillkicked( turret ); - turret thread destroyturret(); - self thread startcarryturret( turret ); - return turret; + self maps\mp\killstreaks\_killstreaks::switchtolastnonkillstreakweapon(); + + if ( ( !isdefined( level.usingmomentum ) || !level.usingmomentum ) && !self maps\mp\killstreaks\_killstreaks::getiftopkillstreakhasbeenused() ) + { + level.globalkillstreakscalled++; + self addweaponstat( hardpointtype, "used", 1 ); + } + + turret = spawnturret( "auto_turret", self.origin, "tow_turret_mp" ); + turret.turrettype = "tow"; + turret setturrettype( turret.turrettype ); + turret setmodel( level.auto_turret_settings[turret.turrettype].modelgoodplacement ); + turret.angles = self.angles; + turret.hardpointweapon = hardpointtype; + turret.hasbeenplanted = 0; + turret.waitfortargettobeginlifespan = 0; + turret.firetime = level.auto_turret_settings["tow"].turretfiredelay; + self.turret_active = 0; + turret.stunnedbytacticalgrenade = 0; + turret.stuntime = 0.0; + turret setturretowner( self ); + turret setturretminimapvisible( 1 ); + turret.isfrominventory = self.usingkillstreakfrominventory; + + if ( level.teambased ) + { + turret setturretteam( self.team ); + turret.team = self.team; + } + else + { + turret setturretteam( "free" ); + turret.team = "free"; + } + + setupturrethealth( turret ); + turret.carried = 1; + turret.curr_time = 0; + turret.stunduration = 5.0; + turret setscanningpitch( -35.0 ); + turret thread watchturretlifespan(); + self thread watchownerdisconnect( turret ); + self thread watchownerteamkillkicked( turret ); + turret thread destroyturret(); + self thread startcarryturret( turret ); + return turret; } usemicrowaveturret( hardpointtype ) { - self maps/mp/killstreaks/_killstreaks::switchtolastnonkillstreakweapon(); - if ( isDefined( level.usingmomentum ) && !level.usingmomentum && !self maps/mp/killstreaks/_killstreaks::getiftopkillstreakhasbeenused() ) - { - level.globalkillstreakscalled++; - self addweaponstat( hardpointtype, "used", 1 ); - } - turret = spawnturret( "auto_turret", self.origin, "microwave_turret_mp" ); - turret.turrettype = "microwave"; - turret setturrettype( turret.turrettype ); - turret setmodel( level.auto_turret_settings[ turret.turrettype ].modelgoodplacement ); - turret.angles = self.angles; - turret.hardpointweapon = hardpointtype; - turret.hasbeenplanted = 0; - turret.waitfortargettobeginlifespan = 0; - self.turret_active = 0; - self.curr_time = -1; - turret.stunnedbytacticalgrenade = 0; - turret.stuntime = 0; - turret setturretowner( self ); - turret setturretminimapvisible( 1 ); - turret.isfrominventory = self.usingkillstreakfrominventory; - turret setdrawinfrared( 1 ); - turret.controlled = 0; - turret.soundmod = "hpm"; - target_set( turret, vectorScale( ( 0, 0, 0 ), 30 ) ); - if ( level.teambased ) - { - turret setturretteam( self.team ); - turret.team = self.team; - } - else - { - turret setturretteam( "free" ); - turret.team = "free"; - } - setupturrethealth( turret ); - turret.carried = 1; - turret.curr_time = 0; - turret.stunduration = 5; - turret thread watchturretlifespan(); - self thread watchownerdisconnect( turret ); - turret thread destroyturret(); - self thread startcarryturret( turret ); - return turret; + self maps\mp\killstreaks\_killstreaks::switchtolastnonkillstreakweapon(); + + if ( ( !isdefined( level.usingmomentum ) || !level.usingmomentum ) && !self maps\mp\killstreaks\_killstreaks::getiftopkillstreakhasbeenused() ) + { + level.globalkillstreakscalled++; + self addweaponstat( hardpointtype, "used", 1 ); + } + + turret = spawnturret( "auto_turret", self.origin, "microwave_turret_mp" ); + turret.turrettype = "microwave"; + turret setturrettype( turret.turrettype ); + turret setmodel( level.auto_turret_settings[turret.turrettype].modelgoodplacement ); + turret.angles = self.angles; + turret.hardpointweapon = hardpointtype; + turret.hasbeenplanted = 0; + turret.waitfortargettobeginlifespan = 0; + self.turret_active = 0; + self.curr_time = -1; + turret.stunnedbytacticalgrenade = 0; + turret.stuntime = 0.0; + turret setturretowner( self ); + turret setturretminimapvisible( 1 ); + turret.isfrominventory = self.usingkillstreakfrominventory; + turret setdrawinfrared( 1 ); + turret.controlled = 0; + turret.soundmod = "hpm"; + target_set( turret, vectorscale( ( 0, 0, 1 ), 30.0 ) ); + + if ( level.teambased ) + { + turret setturretteam( self.team ); + turret.team = self.team; + } + else + { + turret setturretteam( "free" ); + turret.team = "free"; + } + + setupturrethealth( turret ); + turret.carried = 1; + turret.curr_time = 0; + turret.stunduration = 5.0; + turret thread watchturretlifespan(); + self thread watchownerdisconnect( turret ); + turret thread destroyturret(); + self thread startcarryturret( turret ); + return turret; } watchroundandgameend( turret ) { - self endon( "disconnect" ); - turret notify( "watchRoundAndGameEnd" ); - turret endon( "watchRoundAndGameEnd" ); - turret endon( "destroy_turret" ); - turret endon( "hacked" ); - turret endon( "death" ); - level waittill( "game_ended" ); - self stopcarryturret( turret ); - turret notify( "destroy_turret" ); + self endon( "disconnect" ); + turret notify( "watchRoundAndGameEnd" ); + turret endon( "watchRoundAndGameEnd" ); + turret endon( "destroy_turret" ); + turret endon( "hacked" ); + turret endon( "death" ); + + level waittill( "game_ended" ); + + self stopcarryturret( turret ); + turret notify( "destroy_turret", 0 ); } giveturretback( turret ) { - if ( isDefined( level.usingmomentum ) || !level.usingmomentum && isDefined( turret.isfrominventory ) && turret.isfrominventory ) - { - maps/mp/killstreaks/_killstreaks::givekillstreak( turret.hardpointweapon, undefined, undefined, 1 ); - } + if ( !isdefined( level.usingmomentum ) || !level.usingmomentum || isdefined( turret.isfrominventory ) && turret.isfrominventory ) + maps\mp\killstreaks\_killstreaks::givekillstreak( turret.hardpointweapon, undefined, undefined, 1 ); } watchownerdeath( turret ) { - self endon( "disconnect" ); - turret endon( "turret_placed" ); - turret endon( "destroy_turret" ); - turret endon( "hacked" ); - self waittill( "death" ); - if ( !turret.hasbeenplanted ) - { - self returnturrettoinventory( turret ); - } - else if ( turret.canbeplaced && turret.carried ) - { - if ( level.teambased && self.team != turret.team ) - { - self stopcarryturret( turret ); - turret notify( "destroy_turret" ); - } - else - { - placement = self canplayerplaceturret( turret ); - if ( placement[ "result" ] ) - { - turret.origin = placement[ "origin" ]; - turret.angles = placement[ "angles" ]; - self placeturret( turret ); - } - else - { - if ( isDefined( turret ) ) - { - self stopcarryturret( turret ); - turret notify( "destroy_turret" ); - } - } - } - } - else - { - if ( isDefined( turret ) ) - { - self stopcarryturret( turret ); - turret notify( "destroy_turret" ); - } - } + self endon( "disconnect" ); + turret endon( "turret_placed" ); + turret endon( "destroy_turret" ); + turret endon( "hacked" ); + + self waittill( "death" ); + + if ( !turret.hasbeenplanted ) + self returnturrettoinventory( turret ); + else if ( turret.canbeplaced && turret.carried ) + { + if ( level.teambased && self.team != turret.team ) + { + self stopcarryturret( turret ); + turret notify( "destroy_turret", 0 ); + } + else + { + placement = self canplayerplaceturret( turret ); + + if ( placement["result"] ) + { + turret.origin = placement["origin"]; + turret.angles = placement["angles"]; + self placeturret( turret ); + } + else if ( isdefined( turret ) ) + { + self stopcarryturret( turret ); + turret notify( "destroy_turret", 0 ); + } + } + } + else if ( isdefined( turret ) ) + { + self stopcarryturret( turret ); + turret notify( "destroy_turret", 0 ); + } } returnturrettoinventory( turret ) { - if ( level.teambased && self.team != turret.team ) - { - if ( isDefined( turret ) ) - { - self stopcarryturret( turret ); - turret notify( "destroy_turret" ); - } - } - else - { - if ( isDefined( turret ) ) - { - turret setturretcarried( 0 ); - self stopcarryturret( turret ); - turret notify( "destroy_turret" ); - } - self _enableweapon(); - } + if ( level.teambased && self.team != turret.team ) + { + if ( isdefined( turret ) ) + { + self stopcarryturret( turret ); + turret notify( "destroy_turret", 0 ); + } + } + else + { + if ( isdefined( turret ) ) + { + turret setturretcarried( 0 ); + self stopcarryturret( turret ); + turret notify( "destroy_turret", 0 ); + } + + self _enableweapon(); + } } watchowneremp( turret ) { - self endon( "disconnect" ); - self endon( "death" ); - turret endon( "turret_placed" ); - turret endon( "destroy_turret" ); - turret endon( "hacked" ); - while ( 1 ) - { - self waittill( "emp_jammed" ); - if ( !turret.hasbeenplanted ) - { - turret setturretcarried( 0 ); - self stopcarryturret( turret ); - self _enableweapon(); - self takeweapon( turret.hardpointweapon ); - turret notify( "turret_emped" ); - continue; - } - else if ( turret.canbeplaced && turret.carried ) - { - self placeturret( turret ); - continue; - } - else - { - if ( isDefined( turret ) ) - { - self stopcarryturret( turret ); - turret notify( "turret_emped" ); - } - } - } + self endon( "disconnect" ); + self endon( "death" ); + turret endon( "turret_placed" ); + turret endon( "destroy_turret" ); + turret endon( "hacked" ); + + while ( true ) + { + self waittill( "emp_jammed" ); + + if ( !turret.hasbeenplanted ) + { + turret setturretcarried( 0 ); + self stopcarryturret( turret ); + self _enableweapon(); + self takeweapon( turret.hardpointweapon ); + turret notify( "turret_emped" ); + } + else if ( turret.canbeplaced && turret.carried ) + self placeturret( turret ); + else if ( isdefined( turret ) ) + { + self stopcarryturret( turret ); + turret notify( "turret_emped", 0 ); + } + } } watchownerteamkillkicked( turret ) { - turret endon( "turret_deactivated" ); - turret endon( "hacked" ); - turret endon( "destroy_turret" ); - self waittill( "teamKillKicked" ); - if ( isDefined( turret ) ) - { - turret notify( "destroy_turret" ); - } + turret endon( "turret_deactivated" ); + turret endon( "hacked" ); + turret endon( "destroy_turret" ); + + self waittill( "teamKillKicked" ); + + if ( isdefined( turret ) ) + turret notify( "destroy_turret", 0 ); } watchownerdisconnect( turret ) { - turret endon( "turret_deactivated" ); - turret endon( "hacked" ); - self waittill_any( "disconnect", "joined_team" ); - if ( isDefined( turret ) ) - { - turret notify( "destroy_turret" ); - } + turret endon( "turret_deactivated" ); + turret endon( "hacked" ); + self waittill_any( "disconnect", "joined_team" ); + + if ( isdefined( turret ) ) + turret notify( "destroy_turret", 1 ); } startcarryturret( turret ) { - turret maketurretunusable(); - turret setturretcarried( 1 ); - self _disableweapon(); - turret stoploopsound(); - turret setmode( "auto_ai" ); - if ( turret.turrettype == "sentry" ) - { - turret notify( "stop_burst_fire_unmanned" ); - } - else if ( turret.turrettype == "tow" ) - { - turret notify( "target_lost" ); - } - else - { - if ( turret.turrettype == "microwave" ) - { - turret notify( "stop_microwave" ); - } - } - turret.carried = 1; - if ( turret.hasbeenplanted ) - { - level notify( "drop_objects_to_ground" ); - } - self carryturret( turret, vectorScale( ( 0, 0, 0 ), 40 ), ( 0, 0, 0 ) ); - self thread watchownerdeath( turret ); - self thread watchowneremp( turret ); - self thread watchroundandgameend( turret ); - turret maps/mp/_entityheadicons::destroyentityheadicons(); - turret setturretowner( self ); - turret setdefaultdroppitch( -90 ); - if ( !turret.hasbeenplanted ) - { - self thread watchreturnturrettoinventory( turret ); - } - self thread updateturretplacement( turret ); - self thread watchturretplacement( turret ); - if ( turret.turrettype == "microwave" ) - { - turret clearclientflag( 2 ); - turret setclientflag( 3 ); - self playsoundtoplayer( "mpl_turret_micro_startup", self ); - } - turret notify( "turret_carried" ); - turret notify( "turret_target_lost" ); + turret maketurretunusable(); + turret setturretcarried( 1 ); + self _disableweapon(); + turret stoploopsound(); + turret setmode( "auto_ai" ); + + if ( turret.turrettype == "sentry" ) + turret notify( "stop_burst_fire_unmanned" ); + else if ( turret.turrettype == "tow" ) + turret notify( "target_lost" ); + else if ( turret.turrettype == "microwave" ) + turret notify( "stop_microwave" ); + + turret.carried = 1; + + if ( turret.hasbeenplanted ) + level notify( "drop_objects_to_ground", turret.origin, 80 ); + + self carryturret( turret, vectorscale( ( 1, 0, 0 ), 40.0 ), ( 0, 0, 0 ) ); + self thread watchownerdeath( turret ); + self thread watchowneremp( turret ); + self thread watchroundandgameend( turret ); + turret maps\mp\_entityheadicons::destroyentityheadicons(); + turret setturretowner( self ); + turret setdefaultdroppitch( -90.0 ); + + if ( !turret.hasbeenplanted ) + self thread watchreturnturrettoinventory( turret ); + + self thread updateturretplacement( turret ); + self thread watchturretplacement( turret ); + + if ( turret.turrettype == "microwave" ) + { + turret clearclientflag( 2 ); + turret setclientflag( 3 ); + self playsoundtoplayer( "mpl_turret_micro_startup", self ); + } + + turret notify( "turret_carried" ); + turret notify( "turret_target_lost" ); } watchreturnturrettoinventory( turret ) { - self endon( "death" ); - self endon( "entering_last_stand" ); - self endon( "disconnect" ); - turret endon( "turret_placed" ); - turret endon( "turret_deactivated" ); - wait 0,05; - while ( 1 ) - { - if ( self actionslotfourbuttonpressed() ) - { - returnturrettoinventory( turret ); - return; - } - wait 0,05; - } + self endon( "death" ); + self endon( "entering_last_stand" ); + self endon( "disconnect" ); + turret endon( "turret_placed" ); + turret endon( "turret_deactivated" ); + wait 0.05; + + while ( true ) + { + if ( self actionslotfourbuttonpressed() ) + { + returnturrettoinventory( turret ); + return; + } + + wait 0.05; + } } updateturretplacement( turret ) { - self endon( "death" ); - self endon( "entering_last_stand" ); - self endon( "disconnect" ); - turret endon( "turret_placed" ); - turret endon( "turret_deactivated" ); - lastplacedturret = -1; - turret.canbeplaced = 0; - firstmodel = 1; - while ( 1 ) - { - placement = self canplayerplaceturret( turret ); - turret.origin = placement[ "origin" ]; - turret.angles = placement[ "angles" ]; - good_spot_check = placement[ "result" ] & !turret turretinhurttrigger() & !turret turretinnoturretplacementtrigger(); - turret.canbeplaced = good_spot_check; - if ( turret.canbeplaced != lastplacedturret && turret.turrettype == "microwave" && firstmodel != 1 ) - { - if ( good_spot_check ) - { - turret setmodel( level.auto_turret_settings[ turret.turrettype ].modelgoodplacement ); - } - else - { - turret setmodel( level.auto_turret_settings[ turret.turrettype ].modelbadplacement ); - } - lastplacedturret = turret.canbeplaced; - } - if ( turret.turrettype == "microwave" && firstmodel == 1 ) - { - if ( turret.canbeplaced ) - { - turret setmodel( level.auto_turret_settings[ turret.turrettype ].modelgoodplacementanimate ); - } - else - { - turret setmodel( level.auto_turret_settings[ turret.turrettype ].modelbadplacementanimate ); - } - firstmodel = 0; - lastplacedturret = turret.canbeplaced; - } - wait 0,05; - } + self endon( "death" ); + self endon( "entering_last_stand" ); + self endon( "disconnect" ); + turret endon( "turret_placed" ); + turret endon( "turret_deactivated" ); + lastplacedturret = -1; + turret.canbeplaced = 0; + firstmodel = 1; + + while ( true ) + { + placement = self canplayerplaceturret( turret ); + turret.origin = placement["origin"]; + turret.angles = placement["angles"]; + good_spot_check = placement["result"] & !turret turretinhurttrigger() & !turret turretinnoturretplacementtrigger(); + turret.canbeplaced = good_spot_check; + + if ( turret.canbeplaced != lastplacedturret && !( turret.turrettype == "microwave" && firstmodel == 1 ) ) + { + if ( good_spot_check ) + turret setmodel( level.auto_turret_settings[turret.turrettype].modelgoodplacement ); + else + turret setmodel( level.auto_turret_settings[turret.turrettype].modelbadplacement ); + + lastplacedturret = turret.canbeplaced; + } + + if ( turret.turrettype == "microwave" && firstmodel == 1 ) + { + if ( turret.canbeplaced ) + turret setmodel( level.auto_turret_settings[turret.turrettype].modelgoodplacementanimate ); + else + turret setmodel( level.auto_turret_settings[turret.turrettype].modelbadplacementanimate ); + + firstmodel = 0; + lastplacedturret = turret.canbeplaced; + } + + wait 0.05; + } } turretinhurttrigger() { - i = 0; - while ( i < level.fatal_triggers.size ) - { - if ( self istouching( level.fatal_triggers[ i ] ) ) - { - return 1; - } - i++; - } - return 0; + for ( i = 0; i < level.fatal_triggers.size; i++ ) + { + if ( self istouching( level.fatal_triggers[i] ) ) + return true; + } + + return false; } turretinnoturretplacementtrigger() { - i = 0; - while ( i < level.noturretplacementtriggers.size ) - { - if ( self istouching( level.noturretplacementtriggers[ i ] ) ) - { - return 1; - } - i++; - } - return 0; + for ( i = 0; i < level.noturretplacementtriggers.size; i++ ) + { + if ( self istouching( level.noturretplacementtriggers[i] ) ) + return true; + } + + return false; } watchturretplacement( turret ) { - self endon( "disconnect" ); - self endon( "death" ); - self endon( "entering_last_stand" ); - turret endon( "turret_placed" ); - turret endon( "turret_deactivated" ); - while ( self attackbuttonpressed() ) - { - wait 0,05; - } - while ( 1 ) - { - if ( self attackbuttonpressed() && turret.canbeplaced ) - { - placement = self canplayerplaceturret( turret ); - if ( placement[ "result" ] ) - { - turret.origin = placement[ "origin" ]; - turret.angles = placement[ "angles" ]; - self placeturret( turret ); - } - } - wait 0,05; - } + self endon( "disconnect" ); + self endon( "death" ); + self endon( "entering_last_stand" ); + turret endon( "turret_placed" ); + turret endon( "turret_deactivated" ); + + while ( self attackbuttonpressed() ) + wait 0.05; + + while ( true ) + { + if ( self attackbuttonpressed() && turret.canbeplaced ) + { + placement = self canplayerplaceturret( turret ); + + if ( placement["result"] ) + { + turret.origin = placement["origin"]; + turret.angles = placement["angles"]; + self placeturret( turret ); + } + } + + wait 0.05; + } } placeturret( turret ) { - if ( !turret.carried || !turret.canbeplaced ) - { - return; - } - turret setturretcarried( 0 ); - self stopcarryturret( turret, turret.origin, turret.angles ); - turret spawnturretpickuptrigger( self ); - turret maps/mp/_hacker_tool::registerwithhackertool( level.auto_turret_settings[ turret.turrettype ].hackertoolradius, level.auto_turret_settings[ turret.turrettype ].hackertooltimems ); - self thread initturret( turret ); - self _enableweapon(); - turret.carried = 0; - turret.hasbeenplanted = 1; - if ( turret.stunnedbytacticalgrenade ) - { - turret thread stunturrettacticalgrenade( turret.stunduration ); - } - if ( isDefined( level.auto_turret_settings[ turret.turrettype ].loopsoundfx ) ) - { - turret playloopsound( level.auto_turret_settings[ turret.turrettype ].loopsoundfx ); - } - self playrumbleonentity( "damage_heavy" ); - turret notify( "turret_placed" ); + if ( !turret.carried || !turret.canbeplaced ) + return; + + turret setturretcarried( 0 ); + self stopcarryturret( turret, turret.origin, turret.angles ); + turret spawnturretpickuptrigger( self ); + turret maps\mp\_hacker_tool::registerwithhackertool( level.auto_turret_settings[turret.turrettype].hackertoolradius, level.auto_turret_settings[turret.turrettype].hackertooltimems ); + self thread initturret( turret ); + self _enableweapon(); + turret.carried = 0; + turret.hasbeenplanted = 1; + + if ( turret.stunnedbytacticalgrenade ) + turret thread stunturrettacticalgrenade( turret.stunduration ); + + if ( isdefined( level.auto_turret_settings[turret.turrettype].loopsoundfx ) ) + turret playloopsound( level.auto_turret_settings[turret.turrettype].loopsoundfx ); + + self playrumbleonentity( "damage_heavy" ); + turret notify( "turret_placed" ); } initturret( turret ) { - maps/mp/_mgturret::turret_set_difficulty( turret, "fu" ); - turret setmodel( level.auto_turret_settings[ turret.turrettype ].modelbase ); - if ( turret.turrettype == "microwave" ) - { - turret clearclientflag( 3 ); - turret setclientflag( 2 ); - } - turret setforcenocull(); - turret playsound( "mpl_turret_startup" ); - if ( level.teambased ) - { - offset = level.turrets_headicon_offset[ "default" ]; - if ( isDefined( level.turrets_headicon_offset[ turret.turrettype ] ) ) - { - offset = level.turrets_headicon_offset[ turret.turrettype ]; - } - turret maps/mp/_entityheadicons::setentityheadicon( self.pers[ "team" ], self, offset ); - } - turret maketurretunusable(); - turret setmode( "auto_nonai" ); - turret setturretowner( self ); - turret.owner = self; - turret setdefaultdroppitch( 45 ); - turret.dangerous_nodes = []; - if ( turret.turrettype == "sentry" ) - { - turret thread turret_sentry_think( self ); - } - else if ( turret.turrettype == "tow" ) - { - turret thread turret_tow_think( self ); - } - else - { - if ( turret.turrettype == "microwave" ) - { - turret thread turret_microwave_think( self ); - } - } - turret.turret_active = 1; - turret.spawninfluencerid = maps/mp/gametypes/_spawning::create_auto_turret_influencer( turret.origin, turret.team, turret.angles ); - turret.spawninfluencercloseid = maps/mp/gametypes/_spawning::create_auto_turret_influencer_close( turret.origin, turret.team, turret.angles ); - turret thread watchdamage(); - turret thread checkforstundamage(); - wait 1; - flag_set( "end_target_confirm" ); + maps\mp\_mgturret::turret_set_difficulty( turret, "fu" ); + turret setmodel( level.auto_turret_settings[turret.turrettype].modelbase ); + + if ( turret.turrettype == "microwave" ) + { + turret clearclientflag( 3 ); + turret setclientflag( 2 ); + } + + turret setforcenocull(); + turret playsound( "mpl_turret_startup" ); + + if ( level.teambased ) + { + offset = level.turrets_headicon_offset["default"]; + + if ( isdefined( level.turrets_headicon_offset[turret.turrettype] ) ) + offset = level.turrets_headicon_offset[turret.turrettype]; + + turret maps\mp\_entityheadicons::setentityheadicon( self.pers["team"], self, offset ); + } + + turret maketurretunusable(); + turret setmode( "auto_nonai" ); + turret setturretowner( self ); + turret.owner = self; + turret setdefaultdroppitch( 45.0 ); + turret.dangerous_nodes = []; + + if ( turret.turrettype == "sentry" ) + turret thread turret_sentry_think( self ); + else if ( turret.turrettype == "tow" ) + turret thread turret_tow_think( self ); + else if ( turret.turrettype == "microwave" ) + turret thread turret_microwave_think( self ); + + turret.turret_active = 1; + turret.spawninfluencerid = maps\mp\gametypes\_spawning::create_auto_turret_influencer( turret.origin, turret.team, turret.angles ); + turret.spawninfluencercloseid = maps\mp\gametypes\_spawning::create_auto_turret_influencer_close( turret.origin, turret.team, turret.angles ); + turret thread watchdamage(); + turret thread checkforstundamage(); + wait 1.0; + flag_set( "end_target_confirm" ); } setupturrethealth( turret ) { - turret.health = 100000; - turret.maxhealth = 650; - turret.bulletdamagereduction = 0,6; - turret.explosivedamagereduction = 2; + turret.health = 100000; + turret.maxhealth = 650; + turret.bulletdamagereduction = 0.6; + turret.explosivedamagereduction = 2.0; } watchdamage() { - self endon( "turret_deactivated" ); - medalgiven = 0; - if ( !isDefined( self.damagetaken ) ) - { - self.damagetaken = 0; - } - low_health = 0; - if ( self.damagetaken > ( self.maxhealth / 1,8 ) ) - { - playfxontag( level.auto_turret_settings[ self.turrettype ].damagefx, self, level.auto_turret_settings[ self.turrettype ].stunfxtag ); - low_health = 1; - } - for ( ;; ) - { - self waittill( "damage", damage, attacker, direction, point, type, tagname, modelname, partname, weaponname ); - if ( type == "MOD_CRUSH" ) - { - self.skipfutz = 1; - self notify( "destroy_turret" ); - return; - } - if ( !isDefined( attacker ) ) - { - continue; - } - else allowperks = 1; - if ( !isplayer( attacker ) ) - { - if ( isDefined( attacker.owner ) && isplayer( attacker.owner ) ) - { - attacker = attacker.owner; - allowperks = 0; - } - } - if ( isplayer( attacker ) && level.teambased && isDefined( attacker.team ) && self.team == attacker.team && level.friendlyfire == 0 ) - { - continue; - } - else - { - if ( !level.teambased && !level.hardcoremode ) - { - if ( self.owner == attacker ) - { - break; - } - } - else if ( self.turrettype == "microwave" && partname == "tag_shield" ) - { - self.health += damage; - break; - } - else damagetakenbefore = self.damagetaken; - if ( type != "MOD_PISTOL_BULLET" || type == "MOD_RIFLE_BULLET" && type == "MOD_PROJECTILE_SPLASH" && isexplosivebulletweapon( weaponname ) ) - { - if ( allowperks && attacker hasperk( "specialty_armorpiercing" ) ) - { - damage += int( damage * level.cac_armorpiercing_data ); - } - if ( weaponclass( weaponname ) == "spread" ) - { - damage *= 5; - } - self.damagetaken += self.bulletdamagereduction * damage; - } - else - { - if ( weaponname != "remote_missile_missile_mp" || weaponname == "remote_mortar_mp" && weaponname == "missile_drone_projectile_mp" ) - { - self.damagetaken += damage * 10; - break; - } - else - { - if ( type == "MOD_PROJECTILE" || weaponname == "smaw_mp" && weaponname == "fhj18_mp" ) - { - self.damagetaken += 200 * self.explosivedamagereduction; - break; - } - else - { - if ( type != "MOD_PROJECTILE" && type != "MOD_GRENADE_SPLASH" && type == "MOD_PROJECTILE_SPLASH" && damage != 0 && weaponname != "emp_grenade_mp" && !isexplosivebulletweapon( weaponname ) ) - { - self.damagetaken += self.explosivedamagereduction * damage; - break; - } - else - { - if ( type == "MOD_MELEE" ) - { - if ( isplayer( attacker ) ) - { - attacker playlocalsound( "fly_riotshield_impact_knife" ); - } - break; - } - else if ( isDefined( weaponname ) && weaponname == "emp_grenade_mp" && type == "MOD_GRENADE_SPLASH" ) - { - self.damagetaken += self.maxhealth; - break; - } - else - { - self.damagetaken += damage; - } - } - } - } - } - damagedealt = self.damagetaken - damagetakenbefore; - if ( damagedealt > 0 && isDefined( self.controlled ) && self.controlled ) - { - self.owner sendkillstreakdamageevent( int( damagedealt ) ); - } - if ( isDefined( weaponname ) && type == "MOD_GRENADE_SPLASH" ) - { - switch( weaponname ) - { - case "emp_grenade_mp": - if ( !self.stunnedbytacticalgrenade ) - { - self thread stunturrettacticalgrenade( self.stunduration ); - } - if ( level.teambased && self.owner.team != attacker.team ) - { - if ( maps/mp/gametypes/_globallogic_player::dodamagefeedback( weaponname, attacker ) ) - { - attacker maps/mp/gametypes/_damagefeedback::updatedamagefeedback( type ); - } - } - else - { - if ( !level.teambased && self.owner != attacker ) - { - if ( maps/mp/gametypes/_globallogic_player::dodamagefeedback( weaponname, attacker ) ) - { - attacker maps/mp/gametypes/_damagefeedback::updatedamagefeedback( type ); - } - } - } - break; - default: - if ( maps/mp/gametypes/_globallogic_player::dodamagefeedback( weaponname, attacker ) ) - { - attacker maps/mp/gametypes/_damagefeedback::updatedamagefeedback( type ); - } - break; - } - } - else - { - if ( isDefined( weaponname ) ) - { - if ( maps/mp/gametypes/_globallogic_player::dodamagefeedback( weaponname, attacker ) ) - { - attacker maps/mp/gametypes/_damagefeedback::updatedamagefeedback( type ); - } - } - } - if ( self.damagetaken >= self.maxhealth ) - { - if ( self isenemyplayer( attacker ) && self.owner != attacker ) - { - if ( self.turrettype == "sentry" ) - { - maps/mp/_scoreevents::processscoreevent( "destroyed_sentry_gun", attacker, self, weaponname ); - } - else - { - if ( self.turrettype == "microwave" ) - { - maps/mp/_scoreevents::processscoreevent( "destroyed_microwave_turret", attacker, self, weaponname ); - } - } - attacker maps/mp/_challenges::destroyedturret( weaponname ); - if ( isDefined( self.hardpointweapon ) ) - { - level.globalkillstreaksdestroyed++; - attacker addweaponstat( self.hardpointweapon, "destroyed", 1 ); - } - if ( isDefined( self.controlled ) && self.controlled ) - { - attacker addweaponstat( weaponname, "destroyed_controlled_killstreak", 1 ); - } - } - owner = self.owner; - if ( self.turrettype == "sentry" ) - { - owner maps/mp/gametypes/_globallogic_audio::leaderdialogonplayer( "sentry_destroyed", "item_destroyed" ); - } - else - { - if ( self.turrettype == "microwave" ) - { - owner maps/mp/gametypes/_globallogic_audio::leaderdialogonplayer( "microwave_destroyed", "item_destroyed" ); - } - } - owner stopcarryturret( self ); - self.damagetaken = self.health; - self.dead = 1; - self notify( "destroy_turret" ); - } - if ( !low_health && self.damagetaken > ( self.maxhealth / 1,8 ) ) - { - playfxontag( level.auto_turret_settings[ self.turrettype ].damagefx, self, level.auto_turret_settings[ self.turrettype ].stunfxtag ); - low_health = 1; - } - } - } + self endon( "turret_deactivated" ); + medalgiven = 0; + + if ( !isdefined( self.damagetaken ) ) + self.damagetaken = 0; + + low_health = 0; + + if ( self.damagetaken > self.maxhealth / 1.8 ) + { + playfxontag( level.auto_turret_settings[self.turrettype].damagefx, self, level.auto_turret_settings[self.turrettype].stunfxtag ); + low_health = 1; + } + + for (;;) + { + self waittill( "damage", damage, attacker, direction, point, type, tagname, modelname, partname, weaponname ); + + if ( type == "MOD_CRUSH" ) + { + self.skipfutz = 1; + self notify( "destroy_turret", 0 ); + return; + } + + if ( !isdefined( attacker ) ) + continue; + + allowperks = 1; + + if ( !isplayer( attacker ) ) + { + if ( isdefined( attacker.owner ) && isplayer( attacker.owner ) ) + { + attacker = attacker.owner; + allowperks = 0; + } + } + + if ( isplayer( attacker ) && level.teambased && isdefined( attacker.team ) && self.team == attacker.team && level.friendlyfire == 0 ) + continue; + + if ( !level.teambased && !level.hardcoremode ) + { + if ( self.owner == attacker ) + continue; + } + + if ( self.turrettype == "microwave" && partname == "tag_shield" ) + { + self.health += damage; + continue; + } + else + { + damagetakenbefore = self.damagetaken; + + if ( type == "MOD_PISTOL_BULLET" || type == "MOD_RIFLE_BULLET" || type == "MOD_PROJECTILE_SPLASH" && isexplosivebulletweapon( weaponname ) ) + { + if ( allowperks && attacker hasperk( "specialty_armorpiercing" ) ) + damage += int( damage * level.cac_armorpiercing_data ); + + if ( weaponclass( weaponname ) == "spread" ) + damage *= 5; + + self.damagetaken += self.bulletdamagereduction * damage; + } + else if ( weaponname == "remote_missile_missile_mp" || weaponname == "remote_mortar_mp" || weaponname == "missile_drone_projectile_mp" ) + self.damagetaken += damage * 10; + else if ( type == "MOD_PROJECTILE" && ( weaponname == "smaw_mp" || weaponname == "fhj18_mp" ) ) + self.damagetaken += 200 * self.explosivedamagereduction; + else if ( ( type == "MOD_PROJECTILE" || type == "MOD_GRENADE_SPLASH" || type == "MOD_PROJECTILE_SPLASH" ) && damage != 0 && weaponname != "emp_grenade_mp" && !isexplosivebulletweapon( weaponname ) ) + self.damagetaken += self.explosivedamagereduction * damage; + else if ( type == "MOD_MELEE" ) + { + if ( isplayer( attacker ) ) + attacker playlocalsound( "fly_riotshield_impact_knife" ); + + continue; + } + else if ( isdefined( weaponname ) && weaponname == "emp_grenade_mp" && type == "MOD_GRENADE_SPLASH" ) + self.damagetaken += self.maxhealth; + else + self.damagetaken += damage; + + damagedealt = self.damagetaken - damagetakenbefore; + + if ( damagedealt > 0 && isdefined( self.controlled ) && self.controlled ) + self.owner sendkillstreakdamageevent( int( damagedealt ) ); + } + + if ( isdefined( weaponname ) && type == "MOD_GRENADE_SPLASH" ) + { + switch ( weaponname ) + { + case "emp_grenade_mp": + if ( !self.stunnedbytacticalgrenade ) + self thread stunturrettacticalgrenade( self.stunduration ); + + if ( level.teambased && self.owner.team != attacker.team ) + { + if ( maps\mp\gametypes\_globallogic_player::dodamagefeedback( weaponname, attacker ) ) + attacker maps\mp\gametypes\_damagefeedback::updatedamagefeedback( type ); + } + else if ( !level.teambased && self.owner != attacker ) + { + if ( maps\mp\gametypes\_globallogic_player::dodamagefeedback( weaponname, attacker ) ) + attacker maps\mp\gametypes\_damagefeedback::updatedamagefeedback( type ); + } + + break; + default: + if ( maps\mp\gametypes\_globallogic_player::dodamagefeedback( weaponname, attacker ) ) + attacker maps\mp\gametypes\_damagefeedback::updatedamagefeedback( type ); + + break; + } + } + else if ( isdefined( weaponname ) ) + { + if ( maps\mp\gametypes\_globallogic_player::dodamagefeedback( weaponname, attacker ) ) + attacker maps\mp\gametypes\_damagefeedback::updatedamagefeedback( type ); + } + + if ( self.damagetaken >= self.maxhealth ) + { + if ( self isenemyplayer( attacker ) && self.owner != attacker ) + { + if ( self.turrettype == "sentry" ) + maps\mp\_scoreevents::processscoreevent( "destroyed_sentry_gun", attacker, self, weaponname ); + else if ( self.turrettype == "microwave" ) + maps\mp\_scoreevents::processscoreevent( "destroyed_microwave_turret", attacker, self, weaponname ); + + attacker maps\mp\_challenges::destroyedturret( weaponname ); + + if ( isdefined( self.hardpointweapon ) ) + { + level.globalkillstreaksdestroyed++; + attacker addweaponstat( self.hardpointweapon, "destroyed", 1 ); + } + + if ( isdefined( self.controlled ) && self.controlled ) + attacker addweaponstat( weaponname, "destroyed_controlled_killstreak", 1 ); + } + + owner = self.owner; + + if ( self.turrettype == "sentry" ) + owner maps\mp\gametypes\_globallogic_audio::leaderdialogonplayer( "sentry_destroyed", "item_destroyed" ); + else if ( self.turrettype == "microwave" ) + owner maps\mp\gametypes\_globallogic_audio::leaderdialogonplayer( "microwave_destroyed", "item_destroyed" ); + + owner stopcarryturret( self ); + self.damagetaken = self.health; + self.dead = 1; + self notify( "destroy_turret", 1 ); + } + + if ( !low_health && self.damagetaken > self.maxhealth / 1.8 ) + { + playfxontag( level.auto_turret_settings[self.turrettype].damagefx, self, level.auto_turret_settings[self.turrettype].stunfxtag ); + low_health = 1; + } + } } watchturretlifespan( turret ) { - self endon( "turret_deactivated" ); - self endon( "death" ); - while ( 1 ) - { - timeout = level.auto_turret_timeout; - if ( isDefined( turret ) && isDefined( level.auto_turret_settings[ turret.turrettype ].timeout ) ) - { - timeout = level.auto_turret_settings[ turret.turrettype ].timeout; - } - if ( self.curr_time > timeout ) - { - break; - } - else - { - while ( self.waitfortargettobeginlifespan ) - { - wait 0,1; - } - if ( ( self.curr_time + 2 ) > level.auto_turret_timeout ) - { - self deleteturretusetrigger(); - } - if ( !self.carried ) - { - self.curr_time += 1; - } - wait 1; - } - } - shouldtimeout = getDvar( "scr_turret_no_timeout" ); - if ( shouldtimeout == "1" ) - { - return; - } - self notify( "destroy_turret" ); + self endon( "turret_deactivated" ); + self endon( "death" ); + + while ( true ) + { + timeout = level.auto_turret_timeout; + + if ( isdefined( turret ) && isdefined( level.auto_turret_settings[turret.turrettype].timeout ) ) + timeout = level.auto_turret_settings[turret.turrettype].timeout; + + if ( self.curr_time > timeout ) + break; + + if ( self.waitfortargettobeginlifespan ) + { + wait 0.1; + continue; + } + + if ( self.curr_time + 2.0 > level.auto_turret_timeout ) + self deleteturretusetrigger(); + + if ( !self.carried ) + self.curr_time += 1.0; + + wait 1.0; + } + + shouldtimeout = getdvar( "scr_turret_no_timeout" ); + + if ( shouldtimeout == "1" ) + return; + + self notify( "destroy_turret", 1 ); } checkforstundamage() { - self endon( "turret_deactivated" ); - while ( 1 ) - { - self waittill( "damage_caused_by", weapon ); - if ( isstunweapon( weapon ) && !self.stunnedbytacticalgrenade ) - { - self thread stunturrettacticalgrenade( self.stunduration ); - } - } + self endon( "turret_deactivated" ); + + while ( true ) + { + self waittill( "damage_caused_by", weapon ); + + if ( isstunweapon( weapon ) && !self.stunnedbytacticalgrenade ) + self thread stunturrettacticalgrenade( self.stunduration ); + } } stunturrettacticalgrenade( duration ) { - self endon( "turret_deactivated" ); - self setmode( "auto_ai" ); - self notify( "stop_burst_fire_unmanned" ); - if ( self maps/mp/gametypes/_weaponobjects::isstunned() ) - { - return; - } - self.stunnedbytacticalgrenade = 1; - self thread stunturretfx( duration, 0, 1 ); - if ( self.turrettype == "microwave" ) - { - self clearclientflag( 2 ); - self setclientflag( 3 ); - self notify( "microwave_end_fx" ); - } - if ( isDefined( self.controlled ) && self.controlled ) - { - self.owner freezecontrols( 1 ); - } - if ( isDefined( self.owner.fullscreen_static ) ) - { - self.owner thread maps/mp/killstreaks/_remote_weapons::stunstaticfx( duration ); - } - while ( self.stunnedbytacticalgrenade ) - { - while ( 1 ) - { - if ( self.stuntime >= duration ) - { - break; - } - else - { - if ( self.carried ) - { - return; - } - self.stuntime += 0,1; - wait 0,1; - } - } - } - self.stunnedbytacticalgrenade = 0; - self.stuntime = 0; - if ( isDefined( self.controlled ) && self.controlled ) - { - self.owner freezecontrols( 0 ); - } - if ( !self.carried ) - { - self setmode( "auto_nonai" ); - } - if ( self.turrettype != "tow" && !self.carried && !self.controlled ) - { - self thread maps/mp/_mgturret::burst_fire_unmanned(); - } - if ( self.turrettype == "microwave" && !self.carried ) - { - self clearclientflag( 3 ); - self setclientflag( 2 ); - wait 0,5; - self thread microwave_fx(); - } - self notify( "turret_stun_ended" ); + self endon( "turret_deactivated" ); + self setmode( "auto_ai" ); + self notify( "stop_burst_fire_unmanned" ); + + if ( self maps\mp\gametypes\_weaponobjects::isstunned() ) + return; + + self.stunnedbytacticalgrenade = 1; + self thread stunturretfx( duration, 0, 1 ); + + if ( self.turrettype == "microwave" ) + { + self clearclientflag( 2 ); + self setclientflag( 3 ); + self notify( "microwave_end_fx" ); + } + + if ( isdefined( self.controlled ) && self.controlled ) + self.owner freezecontrols( 1 ); + + if ( isdefined( self.owner.fullscreen_static ) ) + self.owner thread maps\mp\killstreaks\_remote_weapons::stunstaticfx( duration ); + + if ( self.stunnedbytacticalgrenade ) + { + while ( true ) + { + if ( self.stuntime >= duration ) + break; + + if ( self.carried ) + return; + + self.stuntime += 0.1; + wait 0.1; + } + } + + self.stunnedbytacticalgrenade = 0; + self.stuntime = 0.0; + + if ( isdefined( self.controlled ) && self.controlled ) + self.owner freezecontrols( 0 ); + + if ( !self.carried ) + self setmode( "auto_nonai" ); + + if ( self.turrettype != "tow" && !self.carried && !self.controlled ) + self thread maps\mp\_mgturret::burst_fire_unmanned(); + + if ( self.turrettype == "microwave" && !self.carried ) + { + self clearclientflag( 3 ); + self setclientflag( 2 ); + wait 0.5; + self thread microwave_fx(); + } + + self notify( "turret_stun_ended" ); } stunturret( duration, isdead, isemp ) { - self endon( "turret_deactivated" ); - self setmode( "auto_ai" ); - self notify( "stop_burst_fire_unmanned" ); - self thread stunturretfx( duration, isdead, isemp ); - if ( isDefined( self.controlled ) && self.controlled && isDefined( self.owner ) ) - { - self.owner freezecontrols( 1 ); - } - if ( self.turrettype == "microwave" ) - { - self clearclientflag( 2 ); - self setclientflag( 4 ); - } - if ( isDefined( duration ) ) - { - wait duration; - } - else - { - return; - } - if ( isDefined( self.controlled ) && self.controlled && isDefined( self.owner ) ) - { - self.owner freezecontrols( 0 ); - } - if ( !self.carried ) - { - self setmode( "auto_nonai" ); - } - if ( self.turrettype != "tow" && !self.carried && !self.controlled ) - { - self thread maps/mp/_mgturret::burst_fire_unmanned(); - } - self notify( "turret_stun_ended" ); - level notify( "turret_stun_ended" ); + self endon( "turret_deactivated" ); + self setmode( "auto_ai" ); + self notify( "stop_burst_fire_unmanned" ); + self thread stunturretfx( duration, isdead, isemp ); + + if ( isdefined( self.controlled ) && self.controlled && isdefined( self.owner ) ) + self.owner freezecontrols( 1 ); + + if ( self.turrettype == "microwave" ) + { + self clearclientflag( 2 ); + self setclientflag( 4 ); + } + + if ( isdefined( duration ) ) + wait( duration ); + else + return; + + if ( isdefined( self.controlled ) && self.controlled && isdefined( self.owner ) ) + self.owner freezecontrols( 0 ); + + if ( !self.carried ) + self setmode( "auto_nonai" ); + + if ( self.turrettype != "tow" && !self.carried && !self.controlled ) + self thread maps\mp\_mgturret::burst_fire_unmanned(); + + self notify( "turret_stun_ended" ); + level notify( "turret_stun_ended", self ); } stunfxthink( fx ) { - fx endon( "death" ); - self stoploopsound(); - self waittill_any( "death", "turret_stun_ended", "turret_deactivated", "hacked", "turret_carried" ); - if ( isDefined( self ) ) - { - if ( isDefined( level.auto_turret_settings[ self.turrettype ].loopsoundfx ) ) - { - self playloopsound( level.auto_turret_settings[ self.turrettype ].loopsoundfx ); - } - } - fx delete(); + fx endon( "death" ); + self stoploopsound(); + self waittill_any( "death", "turret_stun_ended", "turret_deactivated", "hacked", "turret_carried" ); + + if ( isdefined( self ) ) + { + if ( isdefined( level.auto_turret_settings[self.turrettype].loopsoundfx ) ) + self playloopsound( level.auto_turret_settings[self.turrettype].loopsoundfx ); + } + + fx delete(); } stunturretfx( duration, isdead, isemp ) { - self endon( "turret_deactivated" ); - self endon( "death" ); - self endon( "turret_stun_ended" ); - origin = self gettagorigin( level.auto_turret_settings[ self.turrettype ].stunfxtag ); - self.stun_fx = spawn( "script_model", origin ); - self.stun_fx setmodel( "tag_origin" ); - self thread stunfxthink( self.stun_fx ); - wait 0,1; - self.stun_fx playsound( "dst_disable_spark" ); - time = 0; - while ( time < duration ) - { - if ( ( int( time * 10 ) % 20 ) == 0 ) - { - if ( isDefined( isdead ) && isdead ) - { - playfxontag( level.auto_turret_settings[ self.turrettype ].disablefx, self.stun_fx, "tag_origin" ); - } - if ( isDefined( isemp ) && isemp ) - { - playfxontag( level.auto_turret_settings[ self.turrettype ].stunfx, self.stun_fx, "tag_origin" ); - } - } - wait 0,25; - time += 0,25; - } + self endon( "turret_deactivated" ); + self endon( "death" ); + self endon( "turret_stun_ended" ); + origin = self gettagorigin( level.auto_turret_settings[self.turrettype].stunfxtag ); + self.stun_fx = spawn( "script_model", origin ); + self.stun_fx setmodel( "tag_origin" ); + self thread stunfxthink( self.stun_fx ); + wait 0.1; + self.stun_fx playsound( "dst_disable_spark" ); + + for ( time = 0; time < duration; time += 0.25 ) + { + if ( int( time * 10 ) % 20 == 0 ) + { + if ( isdefined( isdead ) && isdead ) + playfxontag( level.auto_turret_settings[self.turrettype].disablefx, self.stun_fx, "tag_origin" ); + + if ( isdefined( isemp ) && isemp ) + playfxontag( level.auto_turret_settings[self.turrettype].stunfx, self.stun_fx, "tag_origin" ); + } + + wait 0.25; + } } isstunweapon( weapon ) { - switch( weapon ) - { - case "emp_grenade_mp": - return 1; - default: - return 0; - } + switch ( weapon ) + { + case "emp_grenade_mp": + return true; + default: + return false; + } } scramblerstun( stun ) { - if ( stun ) - { - self thread stunturret( 0, 1 ); - } - else - { - self setmode( "auto_nonai" ); - if ( self.turrettype != "tow" && !self.controlled ) - { - self thread maps/mp/_mgturret::burst_fire_unmanned(); - } - self notify( "turret_stun_ended" ); - level notify( "turret_stun_ended" ); - } + if ( stun ) + self thread stunturret( 0, 1 ); + else + { + self setmode( "auto_nonai" ); + + if ( self.turrettype != "tow" && !self.controlled ) + self thread maps\mp\_mgturret::burst_fire_unmanned(); + + self notify( "turret_stun_ended" ); + level notify( "turret_stun_ended", self ); + } } watchscramble() { - self endon( "death" ); - self endon( "turret_deactivated" ); - self endon( "turret_carried" ); - if ( self maps/mp/_scrambler::checkscramblerstun() ) - { - self thread scramblerstun( 1 ); - } - for ( ;; ) - { - level waittill_any( "scrambler_spawn", "scrambler_death", "hacked", "turret_stun_ended" ); - wait 0,05; - if ( self maps/mp/_scrambler::checkscramblerstun() ) - { - self thread scramblerstun( 1 ); - continue; - } - else - { - self scramblerstun( 0 ); - } - } + self endon( "death" ); + self endon( "turret_deactivated" ); + self endon( "turret_carried" ); + + if ( self maps\mp\_scrambler::checkscramblerstun() ) + self thread scramblerstun( 1 ); + + for (;;) + { + level waittill_any( "scrambler_spawn", "scrambler_death", "hacked", "turret_stun_ended" ); + wait 0.05; + + if ( self maps\mp\_scrambler::checkscramblerstun() ) + { + self thread scramblerstun( 1 ); + continue; + } + + self scramblerstun( 0 ); + } } destroyturret() { - self waittill( "destroy_turret", playdeathanim ); - self remove_turret_dangerous_nodes(); - if ( self.turrettype == "sentry" ) - { - maps/mp/killstreaks/_killstreakrules::killstreakstop( "autoturret_mp", self.team, self.killstreak_id ); - if ( isDefined( self.owner ) && isDefined( self.owner.remoteweapon ) ) - { - if ( self == self.owner.remoteweapon ) - { - self notify( "removed_on_death" ); - self.owner notify( "remove_remote_weapon" ); - } - } - else - { - if ( isDefined( self.owner ) && !isDefined( self.owner.remoteweapon ) ) - { - self.owner notify( "find_remote_weapon" ); - } - } - } - else if ( self.turrettype == "tow" ) - { - maps/mp/killstreaks/_killstreakrules::killstreakstop( "auto_tow_mp", self.team, self.killstreak_id ); - } - else - { - if ( self.turrettype == "microwave" ) - { - self notify( "microwave_end_fx" ); - maps/mp/killstreaks/_killstreakrules::killstreakstop( "microwaveturret_mp", self.team, self.killstreak_id ); - } - } - if ( isDefined( self.controlled ) && self.controlled == 1 && isDefined( self.owner ) ) - { - self.owner sendkillstreakdamageevent( 600 ); - self.owner destroy_remote_hud(); - } - self.turret_active = 0; - self.curr_time = -1; - self setmode( "auto_ai" ); - self notify( "stop_burst_fire_unmanned" ); - self notify( "turret_deactivated" ); - self deleteturretusetrigger(); - if ( isDefined( playdeathanim ) && playdeathanim && !self.carried ) - { - self playsound( "dst_equipment_destroy" ); - self stunturret( self.stunduration, 1, self.stunnedbytacticalgrenade ); - } - level notify( "drop_objects_to_ground" ); - if ( isDefined( self.spawninfluencerid ) ) - { - removeinfluencer( self.spawninfluencerid ); - self.spawninfluencerid = undefined; - } - if ( isDefined( self.spawninfluencercloseid ) ) - { - removeinfluencer( self.spawninfluencercloseid ); - self.spawninfluencercloseid = undefined; - } - self setturretminimapvisible( 0 ); - self laseroff(); - wait 0,1; - if ( isDefined( self ) ) - { - if ( self.hasbeenplanted ) - { - playfx( level.auto_turret_settings[ self.turrettype ].explodefx, self.origin, self.angles ); - self playsound( "mpl_turret_exp" ); - } - if ( self.carried && isDefined( self.owner ) ) - { - self.owner stopcarryturret( self ); - self.owner _enableweapon(); - } - self delete(); - } + self waittill( "destroy_turret", playdeathanim ); + + self remove_turret_dangerous_nodes(); + + if ( self.turrettype == "sentry" ) + { + maps\mp\killstreaks\_killstreakrules::killstreakstop( "autoturret_mp", self.team, self.killstreak_id ); + + if ( isdefined( self.owner ) && isdefined( self.owner.remoteweapon ) ) + { + if ( self == self.owner.remoteweapon ) + { + self notify( "removed_on_death" ); + self.owner notify( "remove_remote_weapon", 1 ); + } + } + else if ( isdefined( self.owner ) && !isdefined( self.owner.remoteweapon ) ) + self.owner notify( "find_remote_weapon" ); + } + else if ( self.turrettype == "tow" ) + maps\mp\killstreaks\_killstreakrules::killstreakstop( "auto_tow_mp", self.team, self.killstreak_id ); + else if ( self.turrettype == "microwave" ) + { + self notify( "microwave_end_fx" ); + maps\mp\killstreaks\_killstreakrules::killstreakstop( "microwaveturret_mp", self.team, self.killstreak_id ); + } + + if ( isdefined( self.controlled ) && self.controlled == 1 && isdefined( self.owner ) ) + { + self.owner sendkillstreakdamageevent( 600 ); + self.owner destroy_remote_hud(); + } + + self.turret_active = 0; + self.curr_time = -1; + self setmode( "auto_ai" ); + self notify( "stop_burst_fire_unmanned" ); + self notify( "turret_deactivated" ); + self deleteturretusetrigger(); + + if ( isdefined( playdeathanim ) && playdeathanim && !self.carried ) + { + self playsound( "dst_equipment_destroy" ); + self stunturret( self.stunduration, 1, self.stunnedbytacticalgrenade ); + } + + level notify( "drop_objects_to_ground", self.origin, 80 ); + + if ( isdefined( self.spawninfluencerid ) ) + { + removeinfluencer( self.spawninfluencerid ); + self.spawninfluencerid = undefined; + } + + if ( isdefined( self.spawninfluencercloseid ) ) + { + removeinfluencer( self.spawninfluencercloseid ); + self.spawninfluencercloseid = undefined; + } + + self setturretminimapvisible( 0 ); + self laseroff(); + wait 0.1; + + if ( isdefined( self ) ) + { + if ( self.hasbeenplanted ) + { + playfx( level.auto_turret_settings[self.turrettype].explodefx, self.origin, self.angles ); + self playsound( "mpl_turret_exp" ); + } + + if ( self.carried && isdefined( self.owner ) ) + { + self.owner stopcarryturret( self ); + self.owner _enableweapon(); + } + + self delete(); + } } deleteturretusetrigger() { - self remove_turret_dangerous_nodes(); - if ( isDefined( self.pickuptrigger ) ) - { - self.pickuptrigger delete(); - } - if ( isDefined( self.hackertrigger ) ) - { - if ( isDefined( self.hackertrigger.progressbar ) ) - { - self.hackertrigger.progressbar destroyelem(); - self.hackertrigger.progresstext destroyelem(); - } - self.hackertrigger delete(); - } - if ( isDefined( self.disabletrigger ) ) - { - if ( isDefined( self.disabletrigger.progressbar ) ) - { - self.disabletrigger.progressbar destroyelem(); - self.disabletrigger.progresstext destroyelem(); - } - self.disabletrigger delete(); - } + self remove_turret_dangerous_nodes(); + + if ( isdefined( self.pickuptrigger ) ) + self.pickuptrigger delete(); + + if ( isdefined( self.hackertrigger ) ) + { + if ( isdefined( self.hackertrigger.progressbar ) ) + { + self.hackertrigger.progressbar destroyelem(); + self.hackertrigger.progresstext destroyelem(); + } + + self.hackertrigger delete(); + } + + if ( isdefined( self.disabletrigger ) ) + { + if ( isdefined( self.disabletrigger.progressbar ) ) + { + self.disabletrigger.progressbar destroyelem(); + self.disabletrigger.progresstext destroyelem(); + } + + self.disabletrigger delete(); + } } spawnturretpickuptrigger( player ) { - pos = self.origin + vectorScale( ( 0, 0, 0 ), 15 ); - self.pickuptrigger = spawn( "trigger_radius_use", pos ); - self.pickuptrigger setcursorhint( "HINT_NOICON", self ); - if ( isDefined( level.auto_turret_settings[ self.turrettype ].hintstring ) ) - { - self.pickuptrigger sethintstring( level.auto_turret_settings[ self.turrettype ].hintstring ); - } - else - { - self.pickuptrigger sethintstring( &"MP_GENERIC_PICKUP" ); - } - if ( level.teambased ) - { - self.pickuptrigger setteamfortrigger( player.team ); - } - player clientclaimtrigger( self.pickuptrigger ); - self thread watchturretuse( self.pickuptrigger ); + pos = self.origin + vectorscale( ( 0, 0, 1 ), 15.0 ); + self.pickuptrigger = spawn( "trigger_radius_use", pos ); + self.pickuptrigger setcursorhint( "HINT_NOICON", self ); + + if ( isdefined( level.auto_turret_settings[self.turrettype].hintstring ) ) + self.pickuptrigger sethintstring( level.auto_turret_settings[self.turrettype].hintstring ); + else + self.pickuptrigger sethintstring( &"MP_GENERIC_PICKUP" ); + + if ( level.teambased ) + self.pickuptrigger setteamfortrigger( player.team ); + + player clientclaimtrigger( self.pickuptrigger ); + self thread watchturretuse( self.pickuptrigger ); } watchturretuse( trigger ) { - self endon( "delete" ); - self endon( "turret_deactivated" ); - self endon( "turret_carried" ); - while ( 1 ) - { - trigger waittill( "trigger", player ); - while ( !isalive( player ) ) - { - continue; - } - while ( player isusingoffhand() ) - { - continue; - } - while ( !player isonground() ) - { - continue; - } - if ( isDefined( trigger.triggerteam ) && player.team != trigger.triggerteam ) - { - continue; - } - if ( isDefined( trigger.claimedby ) && player != trigger.claimedby ) - { - continue; - } - if ( player usebuttonpressed() && !player.throwinggrenade && !player meleebuttonpressed() && !player attackbuttonpressed() && !player maps/mp/killstreaks/_killstreaks::isinteractingwithobject() && !player isremotecontrolling() ) - { - if ( isDefined( self.spawninfluencerid ) ) - { - removeinfluencer( self.spawninfluencerid ); - self.spawninfluencerid = undefined; - } - if ( isDefined( self.spawninfluencercloseid ) ) - { - removeinfluencer( self.spawninfluencercloseid ); - self.spawninfluencercloseid = undefined; - } - player playrumbleonentity( "damage_heavy" ); - self playsound( "mpl_turret_down" ); - self deleteturretusetrigger(); - if ( self.turrettype == "microwave" ) - { - self notify( "microwave_end_fx" ); - } - if ( isDefined( player.remoteweapon ) && player.remoteweapon == self ) - { - player notify( "remove_remote_weapon" ); - } - player thread startcarryturret( self ); - self deleteturretusetrigger(); - } - } + self endon( "delete" ); + self endon( "turret_deactivated" ); + self endon( "turret_carried" ); + + while ( true ) + { + trigger waittill( "trigger", player ); + + if ( !isalive( player ) ) + continue; + + if ( player isusingoffhand() ) + continue; + + if ( !player isonground() ) + continue; + + if ( isdefined( trigger.triggerteam ) && player.team != trigger.triggerteam ) + continue; + + if ( isdefined( trigger.claimedby ) && player != trigger.claimedby ) + continue; + + if ( player usebuttonpressed() && !player.throwinggrenade && !player meleebuttonpressed() && !player attackbuttonpressed() && !player maps\mp\killstreaks\_killstreaks::isinteractingwithobject() && !player isremotecontrolling() ) + { + if ( isdefined( self.spawninfluencerid ) ) + { + removeinfluencer( self.spawninfluencerid ); + self.spawninfluencerid = undefined; + } + + if ( isdefined( self.spawninfluencercloseid ) ) + { + removeinfluencer( self.spawninfluencercloseid ); + self.spawninfluencercloseid = undefined; + } + + player playrumbleonentity( "damage_heavy" ); + self playsound( "mpl_turret_down" ); + self deleteturretusetrigger(); + + if ( self.turrettype == "microwave" ) + self notify( "microwave_end_fx" ); + + if ( isdefined( player.remoteweapon ) && player.remoteweapon == self ) + player notify( "remove_remote_weapon", 0 ); + + player thread startcarryturret( self ); + self deleteturretusetrigger(); + } + } } turret_target_aquired_watch( player ) { - level endon( "game_ended" ); - self endon( "death" ); - self endon( "destroy_turret" ); - player endon( "disconnect" ); - for ( ;; ) - { - self waittill( "turret_target_aquired" ); - if ( !self.remotecontrolled ) - { - self laseron(); - } - } + level endon( "game_ended" ); + self endon( "death" ); + self endon( "destroy_turret" ); + player endon( "disconnect" ); + + for (;;) + { + self waittill( "turret_target_aquired" ); + + if ( !self.remotecontrolled ) + self laseron(); + } } turret_target_lost_watch( player ) { - level endon( "game_ended" ); - self endon( "death" ); - self endon( "destroy_turret" ); - player endon( "disconnect" ); - for ( ;; ) - { - self waittill( "turret_target_lost" ); - if ( !self.remotecontrolled ) - { - self laseroff(); - } - } + level endon( "game_ended" ); + self endon( "death" ); + self endon( "destroy_turret" ); + player endon( "disconnect" ); + + for (;;) + { + self waittill( "turret_target_lost" ); + + if ( !self.remotecontrolled ) + self laseroff(); + } } turret_sentry_think( player ) { - self endon( "destroy_turret" ); - self.pickuptrigger endon( "trigger" ); - player maps/mp/killstreaks/_remote_weapons::initremoteweapon( self, "killstreak_remote_turret_mp" ); - wait level.auto_turret_settings[ self.turrettype ].turretinitdelay; - self thread maps/mp/_mgturret::burst_fire_unmanned(); + self endon( "destroy_turret" ); + self.pickuptrigger endon( "trigger" ); + player maps\mp\killstreaks\_remote_weapons::initremoteweapon( self, "killstreak_remote_turret_mp" ); + wait( level.auto_turret_settings[self.turrettype].turretinitdelay ); + self thread maps\mp\_mgturret::burst_fire_unmanned(); } turret_tow_think( player ) { - self endon( "turret_deactivated" ); - self endon( "death" ); - player endon( "disconnect" ); - level endon( "game_ended" ); - turretstate = "started"; - self thread missile_fired_notify(); - wait level.auto_turret_settings[ self.turrettype ].turretinitdelay; - while ( 1 ) - { - if ( self isfiringturret() && turretstate != "firing" ) - { - turretstate = "firing"; - self playsound( "mpl_turret_alert" ); - self thread do_tow_shoot( player ); - } - else - { - self notify( "target_lost" ); - turretstate = "scanning"; - } - self waittill( "turretstatechange" ); - self notify( "target_lost" ); - } + self endon( "turret_deactivated" ); + self endon( "death" ); + player endon( "disconnect" ); + level endon( "game_ended" ); + turretstate = "started"; + self thread missile_fired_notify(); + wait( level.auto_turret_settings[self.turrettype].turretinitdelay ); + + while ( true ) + { + if ( self isfiringturret() && turretstate != "firing" ) + { + turretstate = "firing"; + self playsound( "mpl_turret_alert" ); + self thread do_tow_shoot( player ); + } + else + { + self notify( "target_lost" ); + turretstate = "scanning"; + } + + self waittill( "turretstatechange" ); + + self notify( "target_lost" ); + } } deletetriggeronparentdeath( trigger ) { - self waittill( "death" ); - if ( isDefined( trigger ) ) - { - trigger delete(); - } + self waittill( "death" ); + + if ( isdefined( trigger ) ) + trigger delete(); } doesmicrowaveturretaffectentity( entity ) { - if ( !isalive( entity ) ) - { - return 0; - } - if ( !isplayer( entity ) && !isai( entity ) ) - { - return 0; - } - if ( isDefined( self.carried ) && self.carried ) - { - return 0; - } - if ( self maps/mp/gametypes/_weaponobjects::isstunned() ) - { - return 0; - } - if ( isDefined( self.owner ) && entity == self.owner ) - { - return 0; - } - if ( !maps/mp/gametypes/_weaponobjects::friendlyfirecheck( self.owner, entity, 0 ) ) - { - return 0; - } - if ( distancesquared( entity.origin, self.origin ) > ( level.microwave_radius * level.microwave_radius ) ) - { - return 0; - } - entdirection = vectornormalize( entity.origin - self.origin ); - forward = anglesToForward( self.angles ); - dot = vectordot( entdirection, forward ); - if ( dot < level.microwave_turret_cone_dot ) - { - return 0; - } - pitchdifference = int( abs( vectorToAngle( entdirection )[ 0 ] - self.angles[ 0 ] ) ) % 360; - if ( pitchdifference > 15 && pitchdifference < 345 ) - { - return 0; - } - if ( entity damageconetrace( self.origin + vectorScale( ( 0, 0, 0 ), 40 ), self ) <= 0 ) - { - return 0; - } - return 1; + if ( !isalive( entity ) ) + return false; + + if ( !isplayer( entity ) && !isai( entity ) ) + return false; + + if ( isdefined( self.carried ) && self.carried ) + return false; + + if ( self maps\mp\gametypes\_weaponobjects::isstunned() ) + return false; + + if ( isdefined( self.owner ) && entity == self.owner ) + return false; + + if ( !maps\mp\gametypes\_weaponobjects::friendlyfirecheck( self.owner, entity, 0 ) ) + return false; + + if ( distancesquared( entity.origin, self.origin ) > level.microwave_radius * level.microwave_radius ) + return false; + + entdirection = vectornormalize( entity.origin - self.origin ); + forward = anglestoforward( self.angles ); + dot = vectordot( entdirection, forward ); + + if ( dot < level.microwave_turret_cone_dot ) + return false; + + pitchdifference = int( abs( vectortoangles( entdirection )[0] - self.angles[0] ) ) % 360; + + if ( pitchdifference > 15 && pitchdifference < 345 ) + return false; + + if ( entity damageconetrace( self.origin + vectorscale( ( 0, 0, 1 ), 40.0 ), self ) <= 0 ) + return false; + + return true; } microwaveentity( entity ) { - entity endon( "disconnect" ); - entity.beingmicrowaved = 1; - entity.beingmicrowavedby = self.owner; - entity.microwaveeffect = 0; - for ( ;; ) - { - if ( !isDefined( self ) || !self doesmicrowaveturretaffectentity( entity ) ) - { - if ( !isDefined( entity ) ) - { - return; - } - entity.beingmicrowaved = 0; - entity.beingmicrowavedby = undefined; - if ( isDefined( entity.microwavepoisoning ) && entity.microwavepoisoning ) - { - entity.microwavepoisoning = 0; - } - return; - } - damage = level.microwave_turret_damage; - if ( level.hardcoremode ) - { - damage /= 2; - } - if ( !isai( entity ) && entity mayapplyscreeneffect() ) - { - if ( !isDefined( entity.microwavepoisoning ) || !entity.microwavepoisoning ) - { - entity.microwavepoisoning = 1; - entity.microwaveeffect = 0; - } - } - entity dodamage( damage, self.origin, self.owner, self, 0, "MOD_TRIGGER_HURT", 0, "microwave_turret_mp" ); - entity.microwaveeffect++; - if ( isplayer( entity ) && !entity isremotecontrolling() ) - { - if ( ( entity.microwaveeffect % 2 ) == 1 ) - { - if ( distancesquared( entity.origin, self.origin ) > ( ( ( level.microwave_radius * 2 ) / 3 ) * ( ( level.microwave_radius * 2 ) / 3 ) ) ) - { - entity shellshock( "mp_radiation_low", 1,5 ); - entity viewkick( 25, self.origin ); - break; - } - else if ( distancesquared( entity.origin, self.origin ) > ( ( ( level.microwave_radius * 1 ) / 3 ) * ( ( level.microwave_radius * 1 ) / 3 ) ) ) - { - entity shellshock( "mp_radiation_med", 1,5 ); - entity viewkick( 50, self.origin ); - break; - } - else - { - entity shellshock( "mp_radiation_high", 1,5 ); - entity viewkick( 75, self.origin ); - } - } - if ( ( entity.microwaveeffect % 3 ) == 2 ) - { - maps/mp/_scoreevents::processscoreevent( "hpm_suppress", self.owner, entity ); - } - } - wait 0,5; - } + entity endon( "disconnect" ); + entity.beingmicrowaved = 1; + entity.beingmicrowavedby = self.owner; + entity.microwaveeffect = 0; + + for (;;) + { + if ( !isdefined( self ) || !self doesmicrowaveturretaffectentity( entity ) ) + { + if ( !isdefined( entity ) ) + return; + + entity.beingmicrowaved = 0; + entity.beingmicrowavedby = undefined; + + if ( isdefined( entity.microwavepoisoning ) && entity.microwavepoisoning ) + entity.microwavepoisoning = 0; + + return; + } + + damage = level.microwave_turret_damage; + + if ( level.hardcoremode ) + damage /= 2; + + if ( !isai( entity ) && entity mayapplyscreeneffect() ) + { + if ( !isdefined( entity.microwavepoisoning ) || !entity.microwavepoisoning ) + { + entity.microwavepoisoning = 1; + entity.microwaveeffect = 0; + } + } + + entity dodamage( damage, self.origin, self.owner, self, 0, "MOD_TRIGGER_HURT", 0, "microwave_turret_mp" ); + entity.microwaveeffect++; + + if ( isplayer( entity ) && !entity isremotecontrolling() ) + { + if ( entity.microwaveeffect % 2 == 1 ) + { + if ( distancesquared( entity.origin, self.origin ) > level.microwave_radius * 2 / 3 * level.microwave_radius * 2 / 3 ) + { + entity shellshock( "mp_radiation_low", 1.5 ); + entity viewkick( 25, self.origin ); + } + else if ( distancesquared( entity.origin, self.origin ) > level.microwave_radius * 1 / 3 * level.microwave_radius * 1 / 3 ) + { + entity shellshock( "mp_radiation_med", 1.5 ); + entity viewkick( 50, self.origin ); + } + else + { + entity shellshock( "mp_radiation_high", 1.5 ); + entity viewkick( 75, self.origin ); + } + } + + if ( entity.microwaveeffect % 3 == 2 ) + maps\mp\_scoreevents::processscoreevent( "hpm_suppress", self.owner, entity ); + } + + wait 0.5; + } } turret_microwave_think( player ) { - self endon( "death" ); - level endon( "game_ended" ); - self endon( "stop_microwave" ); - self endon( "destroy_turret" ); - wait level.auto_turret_settings[ self.turrettype ].turretinitdelay; - trigger = spawn( "trigger_radius", self.origin + ( 0, 0, level.microwave_radius * -1 ), level.aitriggerspawnflags | level.vehicletriggerspawnflags, level.microwave_radius, level.microwave_radius * 2 ); - trigger enablelinkto(); - trigger linkto( self ); - self thread deletetriggeronparentdeath( trigger ); - self thread microwave_fx(); - self thread turret_microwave_watchfordogs( trigger, player ); - for ( ;; ) - { - trigger waittill( "trigger", ent ); - if ( !isDefined( ent.beingmicrowaved ) || !ent.beingmicrowaved ) - { - self thread microwaveentity( ent ); - } - } + self endon( "death" ); + level endon( "game_ended" ); + self endon( "stop_microwave" ); + self endon( "destroy_turret" ); + wait( level.auto_turret_settings[self.turrettype].turretinitdelay ); + trigger = spawn( "trigger_radius", self.origin + ( 0, 0, level.microwave_radius * -1 ), level.aitriggerspawnflags | level.vehicletriggerspawnflags, level.microwave_radius, level.microwave_radius * 2 ); + trigger enablelinkto(); + trigger linkto( self ); + self thread deletetriggeronparentdeath( trigger ); + self thread microwave_fx(); + self thread turret_microwave_watchfordogs( trigger, player ); + + for (;;) + { + trigger waittill( "trigger", ent ); + + if ( !isdefined( ent.beingmicrowaved ) || !ent.beingmicrowaved ) + self thread microwaveentity( ent ); + } } turret_microwave_watchfordogs( trigger, player ) { - self endon( "death" ); - level endon( "game_ended" ); - self endon( "stop_microwave" ); - self endon( "destroy_turret" ); - damage = level.microwave_turret_damage; - for ( ;; ) - { - dogs = getentarray( "attack_dog", "targetname" ); - _a1893 = dogs; - _k1893 = getFirstArrayKey( _a1893 ); - while ( isDefined( _k1893 ) ) - { - dog = _a1893[ _k1893 ]; - if ( dog.aiteam == player.team ) - { - } - else if ( dog istouching( trigger ) == 0 ) - { - } - else if ( self doesmicrowaveturretaffectdog( dog ) == 0 ) - { - } - else - { - dog.flashduration = 1000; - dog thread maps/mp/animscripts/dog_flashed::main(); - dog dodamage( damage, self.origin, self.owner, self, 0, "MOD_TRIGGER_HURT", 0, "microwave_turret_mp" ); - } - _k1893 = getNextArrayKey( _a1893, _k1893 ); - } - wait 0,5; - } + self endon( "death" ); + level endon( "game_ended" ); + self endon( "stop_microwave" ); + self endon( "destroy_turret" ); + damage = level.microwave_turret_damage; + + for (;;) + { + dogs = getentarray( "attack_dog", "targetname" ); + + foreach ( dog in dogs ) + { + if ( dog.aiteam == player.team ) + continue; + + if ( dog istouching( trigger ) == 0 ) + continue; + + if ( self doesmicrowaveturretaffectdog( dog ) == 0 ) + continue; + + dog.flashduration = 1000; + dog thread maps\mp\animscripts\dog_flashed::main(); + dog dodamage( damage, self.origin, self.owner, self, 0, "MOD_TRIGGER_HURT", 0, "microwave_turret_mp" ); + } + + wait 0.5; + } } doesmicrowaveturretaffectdog( entity ) { - if ( !isalive( entity ) ) - { - return 0; - } - if ( !isplayer( entity ) && !isai( entity ) ) - { - return 0; - } - if ( isDefined( self.carried ) && self.carried ) - { - return 0; - } - if ( self maps/mp/gametypes/_weaponobjects::isstunned() ) - { - return 0; - } - if ( isDefined( self.owner ) && entity == self.owner ) - { - return 0; - } - if ( distancesquared( entity.origin, self.origin ) > ( level.microwave_radius * level.microwave_radius ) ) - { - return 0; - } - entdirection = vectornormalize( entity.origin - self.origin ); - forward = anglesToForward( self.angles ); - dot = vectordot( entdirection, forward ); - if ( dot < level.microwave_turret_cone_dot ) - { - return 0; - } - pitchdifference = int( abs( vectorToAngle( entdirection )[ 0 ] - self.angles[ 0 ] ) ) % 360; - if ( pitchdifference > 15 && pitchdifference < 345 ) - { - return 0; - } - if ( entity damageconetrace( self.origin + vectorScale( ( 0, 0, 0 ), 40 ), self ) <= 0 ) - { - return 0; - } - return 1; + if ( !isalive( entity ) ) + return false; + + if ( !isplayer( entity ) && !isai( entity ) ) + return false; + + if ( isdefined( self.carried ) && self.carried ) + return false; + + if ( self maps\mp\gametypes\_weaponobjects::isstunned() ) + return false; + + if ( isdefined( self.owner ) && entity == self.owner ) + return false; + + if ( distancesquared( entity.origin, self.origin ) > level.microwave_radius * level.microwave_radius ) + return false; + + entdirection = vectornormalize( entity.origin - self.origin ); + forward = anglestoforward( self.angles ); + dot = vectordot( entdirection, forward ); + + if ( dot < level.microwave_turret_cone_dot ) + return false; + + pitchdifference = int( abs( vectortoangles( entdirection )[0] - self.angles[0] ) ) % 360; + + if ( pitchdifference > 15 && pitchdifference < 345 ) + return false; + + if ( entity damageconetrace( self.origin + vectorscale( ( 0, 0, 1 ), 40.0 ), self ) <= 0 ) + return false; + + return true; } microwave_fx() { - self endon( "death" ); - self endon( "microwave_end_fx" ); - self thread waittillendfx(); - waitamount = level.auto_turret_settings[ "microwave" ].fxchecktime; - for ( ;; ) - { - update_microwave_fx(); - wait waitamount; - } + self endon( "death" ); + self endon( "microwave_end_fx" ); + self thread waittillendfx(); + waitamount = level.auto_turret_settings["microwave"].fxchecktime; + + for (;;) + { + update_microwave_fx(); + wait( waitamount ); + } } waittillendfx() { - self endon( "death" ); - self waittill( "microwave_end_fx" ); - self setclientfield( "turret_microwave_sounds", 0 ); + self endon( "death" ); + + self waittill( "microwave_end_fx" ); + + self setclientfield( "turret_microwave_sounds", 0 ); } update_microwave_fx() { - angles = self gettagangles( "tag_flash" ); - origin = self gettagorigin( "tag_flash" ); - forward = anglesToForward( angles ); - forward = vectorScale( forward, level.microwave_radius ); - forwardright = anglesToForward( angles - ( 0, level.microwave_turret_angle / 3, 0 ) ); - forwardright = vectorScale( forwardright, level.microwave_radius ); - forwardleft = anglesToForward( angles + ( 0, level.microwave_turret_angle / 3, 0 ) ); - forwardleft = vectorScale( forwardleft, level.microwave_radius ); - trace = bullettrace( origin, origin + forward, 0, self ); - traceright = bullettrace( origin, origin + forwardright, 0, self ); - traceleft = bullettrace( origin, origin + forwardleft, 0, self ); - fxhash = self microwave_fx_hash( trace, origin ); - fxhashright = self microwave_fx_hash( traceright, origin ); - fxhashleft = self microwave_fx_hash( traceleft, origin ); - if ( isDefined( self.microwavefxhash ) && self.microwavefxhash == fxhash && isDefined( self.microwavefxhashright ) && self.microwavefxhashright == fxhashright && isDefined( self.microwavefxhashleft ) && self.microwavefxhashleft == fxhashleft ) - { - return; - } - if ( isDefined( self.microwavefxent ) ) - { - self.microwavefxent deleteaftertime( 0,1 ); - } - self.microwavefxent = spawn( "script_model", origin ); - self.microwavefxent setmodel( "tag_microwavefx" ); - self.microwavefxent.angles = angles; - self thread deleteonendfx(); - self.microwavefxhash = fxhash; - self.microwavefxhashright = fxhashright; - self.microwavefxhashleft = fxhashleft; - wait 0,1; - self.microwavefxent microwave_play_fx( trace, traceright, traceleft, origin ); - self setclientfield( "turret_microwave_sounds", 1 ); + angles = self gettagangles( "tag_flash" ); + origin = self gettagorigin( "tag_flash" ); + forward = anglestoforward( angles ); + forward = vectorscale( forward, level.microwave_radius ); + forwardright = anglestoforward( angles - ( 0, level.microwave_turret_angle / 3, 0 ) ); + forwardright = vectorscale( forwardright, level.microwave_radius ); + forwardleft = anglestoforward( angles + ( 0, level.microwave_turret_angle / 3, 0 ) ); + forwardleft = vectorscale( forwardleft, level.microwave_radius ); + trace = bullettrace( origin, origin + forward, 0, self ); + traceright = bullettrace( origin, origin + forwardright, 0, self ); + traceleft = bullettrace( origin, origin + forwardleft, 0, self ); + fxhash = self microwave_fx_hash( trace, origin ); + fxhashright = self microwave_fx_hash( traceright, origin ); + fxhashleft = self microwave_fx_hash( traceleft, origin ); + + if ( isdefined( self.microwavefxhash ) && self.microwavefxhash == fxhash && isdefined( self.microwavefxhashright ) && self.microwavefxhashright == fxhashright && isdefined( self.microwavefxhashleft ) && self.microwavefxhashleft == fxhashleft ) + return; + + if ( isdefined( self.microwavefxent ) ) + self.microwavefxent deleteaftertime( 0.1 ); + + self.microwavefxent = spawn( "script_model", origin ); + self.microwavefxent setmodel( "tag_microwavefx" ); + self.microwavefxent.angles = angles; + self thread deleteonendfx(); + self.microwavefxhash = fxhash; + self.microwavefxhashright = fxhashright; + self.microwavefxhashleft = fxhashleft; + wait 0.1; + self.microwavefxent microwave_play_fx( trace, traceright, traceleft, origin ); + self setclientfield( "turret_microwave_sounds", 1 ); } deleteonendfx() { - self.microwavefxent endon( "death" ); - self waittill( "microwave_end_fx" ); - self.microwavefxhash = undefined; - self.microwavefxhashright = undefined; - self.microwavefxhashleft = undefined; - if ( isDefined( self.microwavefxent ) ) - { - self.microwavefxent delete(); - } + self.microwavefxent endon( "death" ); + + self waittill( "microwave_end_fx" ); + + self.microwavefxhash = undefined; + self.microwavefxhashright = undefined; + self.microwavefxhashleft = undefined; + + if ( isdefined( self.microwavefxent ) ) + self.microwavefxent delete(); } microwave_fx_hash( trace, origin ) { - hash = 0; - counter = 1; - i = 0; - while ( i < 5 ) - { - distsq = ( i * level.microwave_fx_size ) * ( i * level.microwave_fx_size ); - if ( distancesquared( origin, trace[ "position" ] ) >= distsq ) - { - hash += counter; - } - counter *= 2; - i++; - } - return hash; + hash = 0; + counter = 1; + + for ( i = 0; i < 5; i++ ) + { + distsq = i * level.microwave_fx_size * ( i * level.microwave_fx_size ); + + if ( distancesquared( origin, trace["position"] ) >= distsq ) + hash += counter; + + counter *= 2; + } + + return hash; } microwave_play_fx( trace, traceright, traceleft, origin ) { - rows = 5; - i = 0; - while ( i < rows ) - { - distsq = ( i * level.microwave_fx_size ) * ( i * level.microwave_fx_size ); - if ( distancesquared( origin, trace[ "position" ] ) >= distsq ) - { - switch( i ) - { - case 0: - playfxontag( level.auto_turret_settings[ "microwave" ].fx, self, "tag_fx11" ); - wait 0,05; - break; - break; - case 1: - case 2: - playfxontag( level.auto_turret_settings[ "microwave" ].fx, self, "tag_fx32" ); - wait 0,05; - break; - break; - case 3: - playfxontag( level.auto_turret_settings[ "microwave" ].fx, self, "tag_fx42" ); - wait 0,05; - playfxontag( level.auto_turret_settings[ "microwave" ].fx, self, "tag_fx43" ); - wait 0,05; - break; - break; - case 4: - playfxontag( level.auto_turret_settings[ "microwave" ].fx, self, "tag_fx53" ); - wait 0,05; - break; - break; - } - } - if ( distancesquared( origin, traceleft[ "position" ] ) >= distsq ) - { - switch( i ) - { - case 0: - break; - break; - case 1: - playfxontag( level.auto_turret_settings[ "microwave" ].fx, self, "tag_fx22" ); - wait 0,05; - break; - break; - case 2: - playfxontag( level.auto_turret_settings[ "microwave" ].fx, self, "tag_fx33" ); - wait 0,05; - break; - break; - case 3: - playfxontag( level.auto_turret_settings[ "microwave" ].fx, self, "tag_fx44" ); - wait 0,05; - break; - break; - case 4: - playfxontag( level.auto_turret_settings[ "microwave" ].fx, self, "tag_fx54" ); - wait 0,05; - playfxontag( level.auto_turret_settings[ "microwave" ].fx, self, "tag_fx55" ); - wait 0,05; - break; - break; - } - } - if ( distancesquared( origin, traceright[ "position" ] ) >= distsq ) - { - switch( i ) - { - case 0: - break; - i++; - continue; - case 1: - playfxontag( level.auto_turret_settings[ "microwave" ].fx, self, "tag_fx21" ); - wait 0,05; - break; - i++; - continue; - case 2: - playfxontag( level.auto_turret_settings[ "microwave" ].fx, self, "tag_fx31" ); - wait 0,05; - break; - i++; - continue; - case 3: - playfxontag( level.auto_turret_settings[ "microwave" ].fx, self, "tag_fx41" ); - wait 0,05; - break; - i++; - continue; - case 4: - playfxontag( level.auto_turret_settings[ "microwave" ].fx, self, "tag_fx51" ); - wait 0,05; - playfxontag( level.auto_turret_settings[ "microwave" ].fx, self, "tag_fx52" ); - wait 0,05; - break; - i++; - continue; - } - } - i++; - } - } + rows = 5; + + for ( i = 0; i < rows; i++ ) + { + distsq = i * level.microwave_fx_size * ( i * level.microwave_fx_size ); + + if ( distancesquared( origin, trace["position"] ) >= distsq ) + { + switch ( i ) + { + case "0": + playfxontag( level.auto_turret_settings["microwave"].fx, self, "tag_fx11" ); + wait 0.05; + break; + case "1": + break; + case "2": + playfxontag( level.auto_turret_settings["microwave"].fx, self, "tag_fx32" ); + wait 0.05; + break; + case "3": + playfxontag( level.auto_turret_settings["microwave"].fx, self, "tag_fx42" ); + wait 0.05; + playfxontag( level.auto_turret_settings["microwave"].fx, self, "tag_fx43" ); + wait 0.05; + break; + case "4": + playfxontag( level.auto_turret_settings["microwave"].fx, self, "tag_fx53" ); + wait 0.05; + break; + } + } + + if ( distancesquared( origin, traceleft["position"] ) >= distsq ) + { + switch ( i ) + { + case "0": + break; + case "1": + playfxontag( level.auto_turret_settings["microwave"].fx, self, "tag_fx22" ); + wait 0.05; + break; + case "2": + playfxontag( level.auto_turret_settings["microwave"].fx, self, "tag_fx33" ); + wait 0.05; + break; + case "3": + playfxontag( level.auto_turret_settings["microwave"].fx, self, "tag_fx44" ); + wait 0.05; + break; + case "4": + playfxontag( level.auto_turret_settings["microwave"].fx, self, "tag_fx54" ); + wait 0.05; + playfxontag( level.auto_turret_settings["microwave"].fx, self, "tag_fx55" ); + wait 0.05; + break; + } + } + + if ( distancesquared( origin, traceright["position"] ) >= distsq ) + { + switch ( i ) + { + case "0": + continue; + case "1": + playfxontag( level.auto_turret_settings["microwave"].fx, self, "tag_fx21" ); + wait 0.05; + continue; + case "2": + playfxontag( level.auto_turret_settings["microwave"].fx, self, "tag_fx31" ); + wait 0.05; + continue; + case "3": + playfxontag( level.auto_turret_settings["microwave"].fx, self, "tag_fx41" ); + wait 0.05; + continue; + case "4": + playfxontag( level.auto_turret_settings["microwave"].fx, self, "tag_fx51" ); + wait 0.05; + playfxontag( level.auto_turret_settings["microwave"].fx, self, "tag_fx52" ); + wait 0.05; + continue; + } + } + } } do_tow_shoot( player ) { - self endon( "turret_deactivated" ); - self endon( "death" ); - player endon( "disconnect" ); - self endon( "target_lost" ); - level endon( "game_ended" ); - while ( 1 ) - { - while ( self.firetime < level.auto_turret_settings[ "tow" ].turretfiredelay ) - { - wait 0,1; - self.firetime += 0,1; - } - self playsound( "wpn_sam_launcher_rocket_npc" ); - self shootturret(); - self.firetime = 0; - } + self endon( "turret_deactivated" ); + self endon( "death" ); + player endon( "disconnect" ); + self endon( "target_lost" ); + level endon( "game_ended" ); + + while ( true ) + { + if ( self.firetime < level.auto_turret_settings["tow"].turretfiredelay ) + { + wait 0.1; + self.firetime += 0.1; + continue; + } + + self playsound( "wpn_sam_launcher_rocket_npc" ); + self shootturret(); + self.firetime = 0.0; + } } missile_fired_notify() { - self endon( "turret_deactivated" ); - self endon( "death" ); - level endon( "game_ended" ); - if ( isDefined( self.owner ) ) - { - self.owner endon( "disconnect" ); - } - while ( 1 ) - { - self waittill( "missile_fire", missile, weap, target ); - if ( isDefined( target ) ) - { - target notify( "stinger_fired_at_me" ); - } - level notify( "missile_fired" ); - } + self endon( "turret_deactivated" ); + self endon( "death" ); + level endon( "game_ended" ); + + if ( isdefined( self.owner ) ) + self.owner endon( "disconnect" ); + + while ( true ) + { + self waittill( "missile_fire", missile, weap, target ); + + if ( isdefined( target ) ) + target notify( "stinger_fired_at_me", missile, weap, self.owner ); + + level notify( "missile_fired", self, missile, target, 1 ); + } } spawnturrethackertrigger( player ) { - triggerorigin = self.origin + vectorScale( ( 0, 0, 0 ), 10 ); - self.hackertrigger = spawn( "trigger_radius_use", triggerorigin, level.weaponobjects_hacker_trigger_width, level.weaponobjects_hacker_trigger_height ); + triggerorigin = self.origin + vectorscale( ( 0, 0, 1 ), 10.0 ); + self.hackertrigger = spawn( "trigger_radius_use", triggerorigin, level.weaponobjects_hacker_trigger_width, level.weaponobjects_hacker_trigger_height ); /# + #/ - self.hackertrigger setcursorhint( "HINT_NOICON", self ); - self.hackertrigger setignoreentfortrigger( self ); - self.hackertrigger sethintstring( level.auto_turret_settings[ self.turrettype ].hackerhintstring ); - self.hackertrigger setperkfortrigger( "specialty_disarmexplosive" ); - self.hackertrigger thread maps/mp/gametypes/_weaponobjects::hackertriggersetvisibility( player ); - self thread hackerthink( self.hackertrigger, player ); + self.hackertrigger setcursorhint( "HINT_NOICON", self ); + self.hackertrigger setignoreentfortrigger( self ); + self.hackertrigger sethintstring( level.auto_turret_settings[self.turrettype].hackerhintstring ); + self.hackertrigger setperkfortrigger( "specialty_disarmexplosive" ); + self.hackertrigger thread maps\mp\gametypes\_weaponobjects::hackertriggersetvisibility( player ); + self thread hackerthink( self.hackertrigger, player ); } hackerthink( trigger, owner ) { - self endon( "death" ); - for ( ;; ) - { - trigger waittill( "trigger", player, instant ); - if ( !isDefined( instant ) && !trigger maps/mp/gametypes/_weaponobjects::hackerresult( player, owner ) ) - { - continue; - } - else - { - if ( self.turrettype == "sentry" ) - { - maps/mp/killstreaks/_killstreakrules::killstreakstop( "autoturret_mp", self.team, self.killstreak_id ); - killstreak_id = player maps/mp/killstreaks/_killstreakrules::killstreakstart( "autoturret_mp", player.team, 1 ); - self.killstreak_id = killstreak_id; - } - else if ( self.turrettype == "tow" ) - { - maps/mp/killstreaks/_killstreakrules::killstreakstop( "auto_tow_mp", self.team, self.killstreak_id ); - killstreak_id = player maps/mp/killstreaks/_killstreakrules::killstreakstart( "auto_tow_mp", player.team, 1 ); - self.killstreak_id = killstreak_id; - } - else - { - if ( self.turrettype == "microwave" ) - { - maps/mp/killstreaks/_killstreakrules::killstreakstop( "microwaveturret_mp", self.team, self.killstreak_id ); - killstreak_id = player maps/mp/killstreaks/_killstreakrules::killstreakstart( "microwaveturret_mp", player.team, 1 ); - self.killstreak_id = killstreak_id; - } - } - maps/mp/_scoreevents::processscoreevent( "hacked", player, self ); - if ( self.turrettype == "sentry" ) - { - owner maps/mp/gametypes/_globallogic_audio::leaderdialogonplayer( "sentry_hacked", "item_destroyed" ); - } - if ( self.turrettype == "microwave" ) - { - owner maps/mp/gametypes/_globallogic_audio::leaderdialogonplayer( "microwave_hacked", "item_destroyed" ); - } - if ( level.teambased ) - { - self setturretteam( player.team ); - self.team = player.team; - } - else - { - self setturretteam( "free" ); - self.team = "free"; - } - if ( isDefined( self.owner ) && isDefined( self.owner.remoteweapon ) ) - { - if ( self.owner.remoteweapon == self ) - { - self.owner notify( "remove_remote_weapon" ); - } - } - self.hacked = 1; - self setturretowner( player ); - self.owner = player; - self notify( "hacked" ); - level notify( "hacked" ); - self deleteturretusetrigger(); - wait 0,1; - self thread stunturrettacticalgrenade( 1,5 ); - wait 1,5; - if ( isDefined( player ) && player.sessionstate == "playing" ) - { - player thread watchownerdisconnect( self ); - player thread watchownerteamkillkicked( self ); - } - offset = level.turrets_headicon_offset[ "default" ]; - if ( isDefined( level.turrets_headicon_offset[ self.turrettype ] ) ) - { - offset = level.turrets_headicon_offset[ self.turrettype ]; - } - self maps/mp/_entityheadicons::setentityheadicon( player.pers[ "team" ], player, offset ); - self spawnturrethackertrigger( player ); - if ( self.turrettype == "sentry" ) - { - player maps/mp/killstreaks/_remote_weapons::initremoteweapon( self, "killstreak_remote_turret_mp" ); - } - return; - } - } + self endon( "death" ); + + for (;;) + { + trigger waittill( "trigger", player, instant ); + + if ( !isdefined( instant ) && !trigger maps\mp\gametypes\_weaponobjects::hackerresult( player, owner ) ) + continue; + + if ( self.turrettype == "sentry" ) + { + maps\mp\killstreaks\_killstreakrules::killstreakstop( "autoturret_mp", self.team, self.killstreak_id ); + killstreak_id = player maps\mp\killstreaks\_killstreakrules::killstreakstart( "autoturret_mp", player.team, 1 ); + self.killstreak_id = killstreak_id; + } + else if ( self.turrettype == "tow" ) + { + maps\mp\killstreaks\_killstreakrules::killstreakstop( "auto_tow_mp", self.team, self.killstreak_id ); + killstreak_id = player maps\mp\killstreaks\_killstreakrules::killstreakstart( "auto_tow_mp", player.team, 1 ); + self.killstreak_id = killstreak_id; + } + else if ( self.turrettype == "microwave" ) + { + maps\mp\killstreaks\_killstreakrules::killstreakstop( "microwaveturret_mp", self.team, self.killstreak_id ); + killstreak_id = player maps\mp\killstreaks\_killstreakrules::killstreakstart( "microwaveturret_mp", player.team, 1 ); + self.killstreak_id = killstreak_id; + } + + maps\mp\_scoreevents::processscoreevent( "hacked", player, self ); + + if ( self.turrettype == "sentry" ) + owner maps\mp\gametypes\_globallogic_audio::leaderdialogonplayer( "sentry_hacked", "item_destroyed" ); + + if ( self.turrettype == "microwave" ) + owner maps\mp\gametypes\_globallogic_audio::leaderdialogonplayer( "microwave_hacked", "item_destroyed" ); + + if ( level.teambased ) + { + self setturretteam( player.team ); + self.team = player.team; + } + else + { + self setturretteam( "free" ); + self.team = "free"; + } + + if ( isdefined( self.owner ) && isdefined( self.owner.remoteweapon ) ) + { + if ( self.owner.remoteweapon == self ) + self.owner notify( "remove_remote_weapon", 1 ); + } + + self.hacked = 1; + self setturretowner( player ); + self.owner = player; + self notify( "hacked", player ); + level notify( "hacked", self ); + self deleteturretusetrigger(); + wait 0.1; + self thread stunturrettacticalgrenade( 1.5 ); + wait 1.5; + + if ( isdefined( player ) && player.sessionstate == "playing" ) + { + player thread watchownerdisconnect( self ); + player thread watchownerteamkillkicked( self ); + } + + offset = level.turrets_headicon_offset["default"]; + + if ( isdefined( level.turrets_headicon_offset[self.turrettype] ) ) + offset = level.turrets_headicon_offset[self.turrettype]; + + self maps\mp\_entityheadicons::setentityheadicon( player.pers["team"], player, offset ); + self spawnturrethackertrigger( player ); + + if ( self.turrettype == "sentry" ) + player maps\mp\killstreaks\_remote_weapons::initremoteweapon( self, "killstreak_remote_turret_mp" ); + + return; + } } spawnturretdisabletrigger( player ) { - triggerorigin = self.origin + vectorScale( ( 0, 0, 0 ), 10 ); - self.disabletrigger = spawn( "trigger_radius_use", triggerorigin, level.weaponobjects_hacker_trigger_width, level.weaponobjects_hacker_trigger_height ); - self.disabletrigger setcursorhint( "HINT_NOICON", self ); - self.disabletrigger setignoreentfortrigger( self ); - self.disabletrigger sethintstring( level.auto_turret_settings[ self.turrettype ].disablehintstring ); - self.disabletrigger thread maps/mp/gametypes/_weaponobjects::hackertriggersetvisibility( player ); - self thread disabletriggerthink( self.disabletrigger, player ); + triggerorigin = self.origin + vectorscale( ( 0, 0, 1 ), 10.0 ); + self.disabletrigger = spawn( "trigger_radius_use", triggerorigin, level.weaponobjects_hacker_trigger_width, level.weaponobjects_hacker_trigger_height ); + self.disabletrigger setcursorhint( "HINT_NOICON", self ); + self.disabletrigger setignoreentfortrigger( self ); + self.disabletrigger sethintstring( level.auto_turret_settings[self.turrettype].disablehintstring ); + self.disabletrigger thread maps\mp\gametypes\_weaponobjects::hackertriggersetvisibility( player ); + self thread disabletriggerthink( self.disabletrigger, player ); } disabletriggerthink( trigger, owner ) { - self endon( "death" ); - for ( ;; ) - { - trigger waittill( "trigger", attacker ); - if ( !trigger disableresult( attacker, owner ) ) - { - continue; - } - else - { - if ( self isenemyplayer( attacker ) ) - { - if ( self.turrettype == "sentry" ) - { - maps/mp/_scoreevents::processscoreevent( "destroyed_sentry_gun", attacker, self, "knife_mp" ); - } - else - { - if ( self.turrettype == "microwave" ) - { - maps/mp/_scoreevents::processscoreevent( "destroyed_microwave_turret", attacker, self, "knife_mp" ); - } - } - if ( isDefined( self.hardpointweapon ) ) - { - level.globalkillstreaksdestroyed++; - attacker addweaponstat( self.hardpointweapon, "destroyed", 1 ); - } - } - if ( isDefined( self.owner ) && isplayer( self.owner ) ) - { - owner = self.owner; - if ( self.turrettype == "sentry" ) - { - owner maps/mp/gametypes/_globallogic_audio::leaderdialogonplayer( "sentry_destroyed", "item_destroyed" ); - } - } - self notify( "destroy_turret" ); - } - } + self endon( "death" ); + + for (;;) + { + trigger waittill( "trigger", attacker ); + + if ( !trigger disableresult( attacker, owner ) ) + continue; + + if ( self isenemyplayer( attacker ) ) + { + if ( self.turrettype == "sentry" ) + maps\mp\_scoreevents::processscoreevent( "destroyed_sentry_gun", attacker, self, "knife_mp" ); + else if ( self.turrettype == "microwave" ) + maps\mp\_scoreevents::processscoreevent( "destroyed_microwave_turret", attacker, self, "knife_mp" ); + + if ( isdefined( self.hardpointweapon ) ) + { + level.globalkillstreaksdestroyed++; + attacker addweaponstat( self.hardpointweapon, "destroyed", 1 ); + } + } + + if ( isdefined( self.owner ) && isplayer( self.owner ) ) + { + owner = self.owner; + + if ( self.turrettype == "sentry" ) + owner maps\mp\gametypes\_globallogic_audio::leaderdialogonplayer( "sentry_destroyed", "item_destroyed" ); + } + + self notify( "destroy_turret", 1 ); + } } disableresult( player, owner ) { - success = 1; - time = getTime(); - hacktime = getDvarFloat( "perk_disarmExplosiveTime" ); - if ( !candisable( player, owner, 1 ) ) - { - return 0; - } - self thread hackerunfreezeplayer( player ); - while ( ( time + ( hacktime * 1000 ) ) > getTime() ) - { - if ( !candisable( player, owner, 0 ) ) - { - success = 0; - break; - } - else if ( !player usebuttonpressed() ) - { - success = 0; - break; - } - else if ( !isDefined( self ) ) - { - success = 0; - break; - } - else - { - player freeze_player_controls( 1 ); - player disableweapons(); - if ( !isDefined( self.progressbar ) ) - { - self.progressbar = player createprimaryprogressbar(); - self.progressbar.lastuserate = -1; - self.progressbar showelem(); - self.progressbar updatebar( 0,01, 1 / hacktime ); - self.progresstext = player createprimaryprogressbartext(); - self.progresstext settext( &"MP_DISABLING" ); - self.progresstext showelem(); - player playlocalsound( "evt_hacker_hacking" ); - } - wait 0,05; - } - } - if ( isDefined( player ) ) - { - player freeze_player_controls( 0 ); - player enableweapons(); - } - if ( isDefined( self.progressbar ) ) - { - self.progressbar destroyelem(); - self.progresstext destroyelem(); - } - if ( isDefined( self ) ) - { - self notify( "hack_done" ); - } - return success; + success = 1; + time = gettime(); + hacktime = getdvarfloat( "perk_disarmExplosiveTime" ); + + if ( !candisable( player, owner, 1 ) ) + return 0; + + self thread hackerunfreezeplayer( player ); + + while ( time + hacktime * 1000 > gettime() ) + { + if ( !candisable( player, owner, 0 ) ) + { + success = 0; + break; + } + + if ( !player usebuttonpressed() ) + { + success = 0; + break; + } + + if ( !isdefined( self ) ) + { + success = 0; + break; + } + + player freeze_player_controls( 1 ); + player disableweapons(); + + if ( !isdefined( self.progressbar ) ) + { + self.progressbar = player createprimaryprogressbar(); + self.progressbar.lastuserate = -1; + self.progressbar showelem(); + self.progressbar updatebar( 0.01, 1 / hacktime ); + self.progresstext = player createprimaryprogressbartext(); + self.progresstext settext( &"MP_DISABLING" ); + self.progresstext showelem(); + player playlocalsound( "evt_hacker_hacking" ); + } + + wait 0.05; + } + + if ( isdefined( player ) ) + { + player freeze_player_controls( 0 ); + player enableweapons(); + } + + if ( isdefined( self.progressbar ) ) + { + self.progressbar destroyelem(); + self.progresstext destroyelem(); + } + + if ( isdefined( self ) ) + self notify( "hack_done" ); + + return success; } candisable( player, owner, weapon_check ) { - if ( !isDefined( player ) ) - { - return 0; - } - if ( !isplayer( player ) ) - { - return 0; - } - if ( !isalive( player ) ) - { - return 0; - } - if ( !isDefined( owner ) ) - { - return 0; - } - if ( owner == player ) - { - return 0; - } - if ( level.teambased && player.team == owner.team ) - { - return 0; - } - if ( isDefined( player.isdefusing ) && player.isdefusing ) - { - return 0; - } - if ( isDefined( player.isplanting ) && player.isplanting ) - { - return 0; - } - if ( isDefined( player.proxbar ) && !player.proxbar.hidden ) - { - return 0; - } - if ( isDefined( player.revivingteammate ) && player.revivingteammate == 1 ) - { - return 0; - } - if ( !player isonground() ) - { - return 0; - } - if ( player isinvehicle() ) - { - return 0; - } - if ( player isweaponviewonlylinked() ) - { - return 0; - } - if ( player hasperk( "specialty_disarmexplosive" ) ) - { - return 0; - } - if ( isDefined( player.laststand ) && player.laststand ) - { - return 0; - } - if ( weapon_check ) - { - if ( player isthrowinggrenade() ) - { - return 0; - } - if ( player isswitchingweapons() ) - { - return 0; - } - if ( player ismeleeing() ) - { - return 0; - } - weapon = player getcurrentweapon(); - if ( !isDefined( weapon ) ) - { - return 0; - } - if ( weapon == "none" ) - { - return 0; - } - if ( isweaponequipment( weapon ) && player isfiring() ) - { - return 0; - } - if ( isweaponspecificuse( weapon ) ) - { - return 0; - } - } - return 1; + if ( !isdefined( player ) ) + return false; + + if ( !isplayer( player ) ) + return false; + + if ( !isalive( player ) ) + return false; + + if ( !isdefined( owner ) ) + return false; + + if ( owner == player ) + return false; + + if ( level.teambased && player.team == owner.team ) + return false; + + if ( isdefined( player.isdefusing ) && player.isdefusing ) + return false; + + if ( isdefined( player.isplanting ) && player.isplanting ) + return false; + + if ( isdefined( player.proxbar ) && !player.proxbar.hidden ) + return false; + + if ( isdefined( player.revivingteammate ) && player.revivingteammate == 1 ) + return false; + + if ( !player isonground() ) + return false; + + if ( player isinvehicle() ) + return false; + + if ( player isweaponviewonlylinked() ) + return false; + + if ( player hasperk( "specialty_disarmexplosive" ) ) + return false; + + if ( isdefined( player.laststand ) && player.laststand ) + return false; + + if ( weapon_check ) + { + if ( player isthrowinggrenade() ) + return false; + + if ( player isswitchingweapons() ) + return false; + + if ( player ismeleeing() ) + return false; + + weapon = player getcurrentweapon(); + + if ( !isdefined( weapon ) ) + return false; + + if ( weapon == "none" ) + return false; + + if ( isweaponequipment( weapon ) && player isfiring() ) + return false; + + if ( isweaponspecificuse( weapon ) ) + return false; + } + + return true; } turretscanstartwaiter() { - self endon( "turret_deactivated" ); - self endon( "death" ); - self endon( "turret_carried" ); - level endon( "game_ended" ); - turret_scan_start_sound_ent = spawn( "script_origin", self.origin ); - turret_scan_start_sound_ent linkto( self, "tag_origin", ( 0, 0, 0 ), ( 0, 0, 0 ) ); - self thread turretscanstopwaiter( turret_scan_start_sound_ent ); - self thread turretscanstopwaitercleanup( turret_scan_start_sound_ent ); - while ( 1 ) - { - self waittill( "turret_scan_start" ); - wait 0,5; - } + self endon( "turret_deactivated" ); + self endon( "death" ); + self endon( "turret_carried" ); + level endon( "game_ended" ); + turret_scan_start_sound_ent = spawn( "script_origin", self.origin ); + turret_scan_start_sound_ent linkto( self, "tag_origin", ( 0, 0, 0 ), ( 0, 0, 0 ) ); + self thread turretscanstopwaiter( turret_scan_start_sound_ent ); + self thread turretscanstopwaitercleanup( turret_scan_start_sound_ent ); + + while ( true ) + { + self waittill( "turret_scan_start" ); + + wait 0.5; + } } turretscanstopwaiter( ent ) { - self endon( "turret_sound_cleanup" ); - level endon( "game_ended" ); - while ( 1 ) - { - self waittill( "turret_scan_stop" ); - wait 0,5; - } + self endon( "turret_sound_cleanup" ); + level endon( "game_ended" ); + + while ( true ) + { + self waittill( "turret_scan_stop" ); + + wait 0.5; + } } turretscanstopwaitercleanup( ent ) { - level endon( "game_ended" ); - self waittill_any( "death", "disconnect", "turret_deactivated" ); - self notify( "turret_sound_cleanup" ); - wait 0,1; + level endon( "game_ended" ); + self waittill_any( "death", "disconnect", "turret_deactivated" ); + self notify( "turret_sound_cleanup" ); + wait 0.1; /# - println( "snd scan delete" ); + println( "snd scan delete" ); #/ - if ( isDefined( ent ) ) - { - ent delete(); - } + if ( isdefined( ent ) ) + ent delete(); } turretscanstopnotify() { + } startturretremotecontrol( turret ) { - self.killstreak_waitamount = level.auto_turret_timeout * 1000; - turret maketurretusable(); - arc_limits = turret getturretarclimits(); - self playerlinkweaponviewtodelta( turret, "tag_player", 0, arc_limits[ "arc_max_yaw" ], arc_limits[ "arc_min_yaw" ] * -1, arc_limits[ "arc_min_pitch" ] * -1, arc_limits[ "arc_max_pitch" ] ); - self playerlinkedsetusebaseangleforviewclamp( 1 ); - self remotecontrolturret( turret ); - turret laseron(); - turret.remotecontrolled = 1; - turret setmode( "manual" ); - self thread watchremotesentryfire( turret ); + self.killstreak_waitamount = level.auto_turret_timeout * 1000; + turret maketurretusable(); + arc_limits = turret getturretarclimits(); + self playerlinkweaponviewtodelta( turret, "tag_player", 0, arc_limits["arc_max_yaw"], arc_limits["arc_min_yaw"] * -1, arc_limits["arc_min_pitch"] * -1, arc_limits["arc_max_pitch"] ); + self playerlinkedsetusebaseangleforviewclamp( 1 ); + self remotecontrolturret( turret ); + turret laseron(); + turret.remotecontrolled = 1; + turret setmode( "manual" ); + self thread watchremotesentryfire( turret ); } watchremotesentryfire( turret ) { - self endon( "stopped_using_remote" ); - turret endon( "death" ); - self endon( "disconnect" ); - level endon( "game_ended" ); - while ( 1 ) - { - if ( self attackbuttonpressed() && turret.stunnedbytacticalgrenade == 0 ) - { - firetime = weaponfiretime( "auto_gun_turret_mp" ); - earthquake( 0,15, 0,2, turret.origin, 200 ); - wait firetime; - continue; - } - else - { - wait 0,05; - } - } + self endon( "stopped_using_remote" ); + turret endon( "death" ); + self endon( "disconnect" ); + level endon( "game_ended" ); + + while ( true ) + { + if ( self attackbuttonpressed() && turret.stunnedbytacticalgrenade == 0 ) + { + firetime = weaponfiretime( "auto_gun_turret_mp" ); + earthquake( 0.15, 0.2, turret.origin, 200 ); + wait( firetime ); + } + else + wait 0.05; + } } endremoteturret( turret, isdead ) { - if ( isDefined( self ) && isDefined( turret ) && turret.remotecontrolled ) - { - self remotecontrolturretoff( turret ); - self remove_turret_hint_hud(); - } - turret maketurretunusable(); - turret laseroff(); - turret.remotecontrolled = 0; - turret setmode( "auto_nonai" ); - if ( !isdead ) - { - turret thread maps/mp/_mgturret::burst_fire_unmanned(); - } + if ( isdefined( self ) && isdefined( turret ) && turret.remotecontrolled ) + { + self remotecontrolturretoff( turret ); + self remove_turret_hint_hud(); + } + + turret maketurretunusable(); + turret laseroff(); + turret.remotecontrolled = 0; + turret setmode( "auto_nonai" ); + + if ( !isdead ) + turret thread maps\mp\_mgturret::burst_fire_unmanned(); } stop_remote() { - if ( !isDefined( self ) ) - { - return; - } - self clearusingremote(); - self.killstreak_waitamount = undefined; - self maps/mp/killstreaks/_ai_tank::destroy_remote_hud(); - self remove_turret_hint_hud(); + if ( !isdefined( self ) ) + return; + + self clearusingremote(); + self.killstreak_waitamount = undefined; + self maps\mp\killstreaks\_ai_tank::destroy_remote_hud(); + self remove_turret_hint_hud(); } create_remote_turret_hud( remote ) { - self.fire_turret_hud = newclienthudelem( self ); - self.fire_turret_hud.alignx = "left"; - self.fire_turret_hud.aligny = "bottom"; - self.fire_turret_hud.horzalign = "user_left"; - self.fire_turret_hud.vertalign = "user_bottom"; - self.fire_turret_hud.font = "small"; - self.fire_turret_hud settext( &"MP_FIRE_SENTRY_GUN" ); - self.fire_turret_hud.hidewheninmenu = 1; - self.fire_turret_hud.hidewhenindemo = 1; - self.fire_turret_hud.archived = 0; - self.fire_turret_hud.x = 25; - self.fire_turret_hud.y = -25; - self.fire_turret_hud.fontscale = 1,25; - self.zoom_turret_hud = newclienthudelem( self ); - self.zoom_turret_hud.alignx = "left"; - self.zoom_turret_hud.aligny = "bottom"; - self.zoom_turret_hud.horzalign = "user_left"; - self.zoom_turret_hud.vertalign = "user_bottom"; - self.zoom_turret_hud.font = "small"; - self.zoom_turret_hud settext( &"KILLSTREAK_INCREASE_ZOOM" ); - self.zoom_turret_hud.hidewheninmenu = 1; - self.zoom_turret_hud.hidewhenindemo = 1; - self.zoom_turret_hud.archived = 0; - self.zoom_turret_hud.x = 25; - self.zoom_turret_hud.y = -40; - self.zoom_turret_hud.fontscale = 1,25; - self thread fade_out_hint_hud(); + self.fire_turret_hud = newclienthudelem( self ); + self.fire_turret_hud.alignx = "left"; + self.fire_turret_hud.aligny = "bottom"; + self.fire_turret_hud.horzalign = "user_left"; + self.fire_turret_hud.vertalign = "user_bottom"; + self.fire_turret_hud.font = "small"; + self.fire_turret_hud settext( &"MP_FIRE_SENTRY_GUN" ); + self.fire_turret_hud.hidewheninmenu = 1; + self.fire_turret_hud.hidewhenindemo = 1; + self.fire_turret_hud.archived = 0; + self.fire_turret_hud.x = 25; + self.fire_turret_hud.y = -25; + self.fire_turret_hud.fontscale = 1.25; + self.zoom_turret_hud = newclienthudelem( self ); + self.zoom_turret_hud.alignx = "left"; + self.zoom_turret_hud.aligny = "bottom"; + self.zoom_turret_hud.horzalign = "user_left"; + self.zoom_turret_hud.vertalign = "user_bottom"; + self.zoom_turret_hud.font = "small"; + self.zoom_turret_hud settext( &"KILLSTREAK_INCREASE_ZOOM" ); + self.zoom_turret_hud.hidewheninmenu = 1; + self.zoom_turret_hud.hidewhenindemo = 1; + self.zoom_turret_hud.archived = 0; + self.zoom_turret_hud.x = 25; + self.zoom_turret_hud.y = -40; + self.zoom_turret_hud.fontscale = 1.25; + self thread fade_out_hint_hud(); } fade_out_hint_hud() { - wait 8; - time = 0; - while ( time < 2 ) - { - if ( !isDefined( self.fire_turret_hud ) ) - { - return; - } - self.fire_turret_hud.alpha -= 0,025; - self.zoom_turret_hud.alpha -= 0,025; - time += 0,05; - wait 0,05; - } - self.fire_turret_hud.alpha = 0; - self.zoom_turret_hud.alpha = 0; + wait 8; + time = 0; + + while ( time < 2 ) + { + if ( !isdefined( self.fire_turret_hud ) ) + return; + + self.fire_turret_hud.alpha -= 0.025; + self.zoom_turret_hud.alpha -= 0.025; + time += 0.05; + wait 0.05; + } + + self.fire_turret_hud.alpha = 0; + self.zoom_turret_hud.alpha = 0; } remove_turret_hint_hud() { - if ( isDefined( self.fire_turret_hud ) ) - { - self.fire_turret_hud destroy(); - } - if ( isDefined( self.zoom_turret_hud ) ) - { - self.zoom_turret_hud destroy(); - } + if ( isdefined( self.fire_turret_hud ) ) + self.fire_turret_hud destroy(); + + if ( isdefined( self.zoom_turret_hud ) ) + self.zoom_turret_hud destroy(); } remove_turret_dangerous_nodes() { - while ( isDefined( self.dangerous_nodes ) ) - { - _a2744 = self.dangerous_nodes; - _k2744 = getFirstArrayKey( _a2744 ); - while ( isDefined( _k2744 ) ) - { - node = _a2744[ _k2744 ]; - _a2746 = level.teams; - _k2746 = getFirstArrayKey( _a2746 ); - while ( isDefined( _k2746 ) ) - { - team = _a2746[ _k2746 ]; - node setdangerous( team, 0 ); - _k2746 = getNextArrayKey( _a2746, _k2746 ); - } - _k2744 = getNextArrayKey( _a2744, _k2744 ); - } - } - self.dangerous_nodes = []; + if ( isdefined( self.dangerous_nodes ) ) + { + foreach ( node in self.dangerous_nodes ) + { + foreach ( team in level.teams ) + node setdangerous( team, 0 ); + } + } + + self.dangerous_nodes = []; } addnoturrettrigger( position, radius, height ) { - level waittill( "no_turret_trigger_created" ); - trigger = spawn( "trigger_radius", position, 0, radius, height ); - level.noturretplacementtriggers[ level.noturretplacementtriggers.size ] = trigger; + level waittill( "no_turret_trigger_created" ); + + trigger = spawn( "trigger_radius", position, 0, radius, height ); + level.noturretplacementtriggers[level.noturretplacementtriggers.size] = trigger; } turret_debug_box( origin, mins, maxs, color ) { /# - debug_turret = getDvar( #"94A738D1" ); - if ( debug_turret == "1" ) - { - box( origin, mins, maxs, 0, color, 1, 1, 300 ); + debug_turret = getdvar( _hash_94A738D1 ); + + if ( debug_turret == "1" ) + box( origin, mins, maxs, 0, color, 1, 1, 300 ); #/ - } } turret_debug_line( start, end, color ) { /# - debug_turret = getDvar( #"94A738D1" ); - if ( debug_turret == "1" ) - { - line( start, end, color, 1, 1, 300 ); + debug_turret = getdvar( _hash_94A738D1 ); + + if ( debug_turret == "1" ) + line( start, end, color, 1, 1, 300 ); #/ - } } diff --git a/Multiplayer Core/patch_mp/maps/mp/mp_bridge.gsc b/Multiplayer Core/patch_mp/maps/mp/mp_bridge.gsc index e4c2d98..a9c8be9 100644 --- a/Multiplayer Core/patch_mp/maps/mp/mp_bridge.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/mp_bridge.gsc @@ -1,199 +1,198 @@ -//checked includes changed to match cerberus output -#include maps/mp/gametypes/_deathicons; -#include maps/mp/gametypes/_spawning; -#include maps/mp/_compass; -#include maps/mp/mp_bridge_amb; -#include maps/mp/_load; -#include maps/mp/mp_bridge_fx; -#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\mp_bridge_fx; +#include maps\mp\_load; +#include maps\mp\mp_bridge_amb; +#include maps\mp\_compass; +#include maps\mp\gametypes\_spawning; +#include maps\mp\gametypes\_deathicons; -main() //checked changed to match cerberus output +main() { - level.levelspawndvars = ::levelspawndvars; - maps/mp/mp_bridge_fx::main(); - precachemodel( "collision_physics_128x128x10" ); - precachemodel( "collision_missile_128x128x10" ); - precachemodel( "collision_physics_64x64x10" ); - precachemodel( "collision_missile_32x32x128" ); - precachemodel( "collision_clip_32x32x10" ); - precachemodel( "p6_bri_construction_tarp" ); - maps/mp/_load::main(); - maps/mp/mp_bridge_amb::main(); - maps/mp/_compass::setupminimap( "compass_map_mp_bridge" ); - setdvar( "compassmaxrange", "2100" ); - game[ "strings" ][ "war_callsign_a" ] = &"MPUI_CALLSIGN_MAPNAME_A"; - game[ "strings" ][ "war_callsign_b" ] = &"MPUI_CALLSIGN_MAPNAME_B"; - game[ "strings" ][ "war_callsign_c" ] = &"MPUI_CALLSIGN_MAPNAME_C"; - game[ "strings" ][ "war_callsign_d" ] = &"MPUI_CALLSIGN_MAPNAME_D"; - game[ "strings" ][ "war_callsign_e" ] = &"MPUI_CALLSIGN_MAPNAME_E"; - game[ "strings_menu" ][ "war_callsign_a" ] = "@MPUI_CALLSIGN_MAPNAME_A"; - game[ "strings_menu" ][ "war_callsign_b" ] = "@MPUI_CALLSIGN_MAPNAME_B"; - game[ "strings_menu" ][ "war_callsign_c" ] = "@MPUI_CALLSIGN_MAPNAME_C"; - game[ "strings_menu" ][ "war_callsign_d" ] = "@MPUI_CALLSIGN_MAPNAME_D"; - game[ "strings_menu" ][ "war_callsign_e" ] = "@MPUI_CALLSIGN_MAPNAME_E"; - spawncollision( "collision_physics_128x128x10", "collider", ( -1190, -876, -76 ), ( 342, 2.63, -90 ) ); - barricade1 = spawn( "script_model", ( 850.5, -812.5, 0 ) ); - barricade1.angles = vectorScale( ( 0, 0, 1 ), 90 ); - barricade1 setmodel( "p6_bri_construction_tarp" ); - spawncollision( "collision_missile_128x128x10", "collider", ( -2182, -185.5, -142 ), vectorScale( ( 0, 0, 1 ), 90 ) ); - spawncollision( "collision_missile_128x128x10", "collider", ( -2310, -185.5, -142 ), vectorScale( ( 0, 0, 1 ), 90 ) ); - spawncollision( "collision_missile_128x128x10", "collider", ( -2438, -185.5, -142 ), vectorScale( ( 0, 0, 1 ), 90 ) ); - spawncollision( "collision_missile_128x128x10", "collider", ( -2182, -57.5, -142 ), vectorScale( ( 0, 0, 1 ), 90 ) ); - spawncollision( "collision_missile_128x128x10", "collider", ( -2310, -57.5, -142 ), vectorScale( ( 0, 0, 1 ), 90 ) ); - spawncollision( "collision_missile_128x128x10", "collider", ( -2438, -57.5, -142 ), vectorScale( ( 0, 0, 1 ), 90 ) ); - spawncollision( "collision_missile_128x128x10", "collider", ( -2366.5, 91, -142 ), vectorScale( ( 0, 0, 1 ), 90 ) ); - spawncollision( "collision_missile_128x128x10", "collider", ( -1401.5, 759.5, -158.5 ), vectorScale( ( 0, 0, -1 ), 92.40023 ) ); - spawncollision( "collision_missile_128x128x10", "collider", ( -1309, 726.5, -158.5 ), ( 2.4, 359.9, -91.70473 ) ); - spawncollision( "collision_missile_128x128x10", "collider", ( -1401.5, 634, -154.5 ), vectorScale( ( 0, 0, -1 ), 92.40023 ) ); - spawncollision( "collision_missile_128x128x10", "collider", ( -1373.5, 634, -154.5 ), vectorScale( ( 0, 0, -1 ), 92.40023 ) ); - spawncollision( "collision_missile_128x128x10", "collider", ( -1401.5, 559.5, -154.5 ), vectorScale( ( 0, 0, -1 ), 92.40023 ) ); - spawncollision( "collision_missile_128x128x10", "collider", ( -1422, 375.5, -141.5 ), vectorScale( ( 0, 0, -1 ), 92.40023 ) ); - spawncollision( "collision_missile_128x128x10", "collider", ( -1322.5, 438, -146 ), vectorScale( ( 0, 0, -1 ), 92.40023 ) ); - spawncollision( "collision_missile_128x128x10", "collider", ( -1304.5, 438, -146 ), vectorScale( ( 0, 0, -1 ), 92.40023 ) ); - spawncollision( "collision_missile_128x128x10", "collider", ( -1322.5, 378.5, -144 ), vectorScale( ( 0, 0, -1 ), 92.40023 ) ); - spawncollision( "collision_missile_128x128x10", "collider", ( -1230, 396, -144 ), vectorScale( ( 0, 0, -1 ), 92.40023 ) ); - spawncollision( "collision_missile_128x128x10", "collider", ( -1357, 248, -139 ), vectorScale( ( 0, 0, -1 ), 92.40023 ) ); - spawncollision( "collision_missile_128x128x10", "collider", ( -1230, 285, -139 ), vectorScale( ( 0, 0, -1 ), 92.40023 ) ); - spawncollision( "collision_missile_128x128x10", "collider", ( -1230, 248, -139 ), vectorScale( ( 0, 0, -1 ), 92.40023 ) ); - spawncollision( "collision_missile_128x128x10", "collider", ( 1370, -697, -134 ), vectorScale( ( 0, 0, 1 ), 90 ) ); - spawncollision( "collision_physics_64x64x10", "collider", ( 2432, -44, 30.5 ), ( 0, 270, -90 ) ); - spawncollision( "collision_physics_64x64x10", "collider", ( 2113.5, -44, 30.5 ), ( 0, 270, -90 ) ); - spawncollision( "collision_missile_32x32x128", "collider", ( -2292, -174, -7.5 ), vectorScale( ( 0, 1, 0 ), 270 ) ); - spawncollision( "collision_missile_128x128x10", "collider", ( -2219.5, -184.5, 37 ), vectorScale( ( 1, 0, 0 ), 2.9 ) ); - spawncollision( "collision_missile_128x128x10", "collider", ( -2197.5, -184.5, 33 ), vectorScale( ( 1, 0, 0 ), 23.9 ) ); - spawncollision( "collision_clip_32x32x10", "collider", ( 1923.5, 553.5, 43.5 ), ( 1.265, 43.3, -90 ) ); - maps/mp/gametypes/_spawning::level_use_unified_spawning( 1 ); - registerclientfield( "scriptmover", "police_car_lights", 1, 1, "int" ); - level thread destructible_lights(); - setdvar( "r_lightGridEnableTweaks", 1 ); - setdvar( "r_lightGridIntensity", 2 ); - setdvar( "r_lightGridContrast", 0 ); - level.ragdoll_override = ::ragdoll_override; - level.overrideplayerdeathwatchtimer = ::leveloverridetime; - level.useintermissionpointsonwavespawn = ::useintermissionpointsonwavespawn; - level thread pathing_fix(); + level.levelspawndvars = ::levelspawndvars; + maps\mp\mp_bridge_fx::main(); + precachemodel( "collision_physics_128x128x10" ); + precachemodel( "collision_missile_128x128x10" ); + precachemodel( "collision_physics_64x64x10" ); + precachemodel( "collision_missile_32x32x128" ); + precachemodel( "collision_clip_32x32x10" ); + precachemodel( "p6_bri_construction_tarp" ); + maps\mp\_load::main(); + maps\mp\mp_bridge_amb::main(); + maps\mp\_compass::setupminimap( "compass_map_mp_bridge" ); + setdvar( "compassmaxrange", "2100" ); + game["strings"]["war_callsign_a"] = &"MPUI_CALLSIGN_MAPNAME_A"; + game["strings"]["war_callsign_b"] = &"MPUI_CALLSIGN_MAPNAME_B"; + game["strings"]["war_callsign_c"] = &"MPUI_CALLSIGN_MAPNAME_C"; + game["strings"]["war_callsign_d"] = &"MPUI_CALLSIGN_MAPNAME_D"; + game["strings"]["war_callsign_e"] = &"MPUI_CALLSIGN_MAPNAME_E"; + game["strings_menu"]["war_callsign_a"] = "@MPUI_CALLSIGN_MAPNAME_A"; + game["strings_menu"]["war_callsign_b"] = "@MPUI_CALLSIGN_MAPNAME_B"; + game["strings_menu"]["war_callsign_c"] = "@MPUI_CALLSIGN_MAPNAME_C"; + game["strings_menu"]["war_callsign_d"] = "@MPUI_CALLSIGN_MAPNAME_D"; + game["strings_menu"]["war_callsign_e"] = "@MPUI_CALLSIGN_MAPNAME_E"; + spawncollision( "collision_physics_128x128x10", "collider", ( -1190, -876, -76 ), ( 342, 2.63, -90 ) ); + barricade1 = spawn( "script_model", ( 850.5, -812.5, 0 ) ); + barricade1.angles = vectorscale( ( 0, 1, 0 ), 90.0 ); + barricade1 setmodel( "p6_bri_construction_tarp" ); + spawncollision( "collision_missile_128x128x10", "collider", ( -2182, -185.5, -142 ), vectorscale( ( 0, 0, 1 ), 90.0 ) ); + spawncollision( "collision_missile_128x128x10", "collider", ( -2310, -185.5, -142 ), vectorscale( ( 0, 0, 1 ), 90.0 ) ); + spawncollision( "collision_missile_128x128x10", "collider", ( -2438, -185.5, -142 ), vectorscale( ( 0, 0, 1 ), 90.0 ) ); + spawncollision( "collision_missile_128x128x10", "collider", ( -2182, -57.5, -142 ), vectorscale( ( 0, 0, 1 ), 90.0 ) ); + spawncollision( "collision_missile_128x128x10", "collider", ( -2310, -57.5, -142 ), vectorscale( ( 0, 0, 1 ), 90.0 ) ); + spawncollision( "collision_missile_128x128x10", "collider", ( -2438, -57.5, -142 ), vectorscale( ( 0, 0, 1 ), 90.0 ) ); + spawncollision( "collision_missile_128x128x10", "collider", ( -2366.5, 91, -142 ), vectorscale( ( 0, 0, 1 ), 90.0 ) ); + spawncollision( "collision_missile_128x128x10", "collider", ( -1401.5, 759.5, -158.5 ), vectorscale( ( 0, 0, -1 ), 92.4002 ) ); + spawncollision( "collision_missile_128x128x10", "collider", ( -1309, 726.5, -158.5 ), ( 2.4, 359.9, -91.7047 ) ); + spawncollision( "collision_missile_128x128x10", "collider", ( -1401.5, 634, -154.5 ), vectorscale( ( 0, 0, -1 ), 92.4002 ) ); + spawncollision( "collision_missile_128x128x10", "collider", ( -1373.5, 634, -154.5 ), vectorscale( ( 0, 0, -1 ), 92.4002 ) ); + spawncollision( "collision_missile_128x128x10", "collider", ( -1401.5, 559.5, -154.5 ), vectorscale( ( 0, 0, -1 ), 92.4002 ) ); + spawncollision( "collision_missile_128x128x10", "collider", ( -1422, 375.5, -141.5 ), vectorscale( ( 0, 0, -1 ), 92.4002 ) ); + spawncollision( "collision_missile_128x128x10", "collider", ( -1322.5, 438, -146 ), vectorscale( ( 0, 0, -1 ), 92.4002 ) ); + spawncollision( "collision_missile_128x128x10", "collider", ( -1304.5, 438, -146 ), vectorscale( ( 0, 0, -1 ), 92.4002 ) ); + spawncollision( "collision_missile_128x128x10", "collider", ( -1322.5, 378.5, -144 ), vectorscale( ( 0, 0, -1 ), 92.4002 ) ); + spawncollision( "collision_missile_128x128x10", "collider", ( -1230, 396, -144 ), vectorscale( ( 0, 0, -1 ), 92.4002 ) ); + spawncollision( "collision_missile_128x128x10", "collider", ( -1357, 248, -139 ), vectorscale( ( 0, 0, -1 ), 92.4002 ) ); + spawncollision( "collision_missile_128x128x10", "collider", ( -1230, 285, -139 ), vectorscale( ( 0, 0, -1 ), 92.4002 ) ); + spawncollision( "collision_missile_128x128x10", "collider", ( -1230, 248, -139 ), vectorscale( ( 0, 0, -1 ), 92.4002 ) ); + spawncollision( "collision_missile_128x128x10", "collider", ( 1370, -697, -134 ), vectorscale( ( 0, 0, 1 ), 90.0 ) ); + spawncollision( "collision_physics_64x64x10", "collider", ( 2432, -44, 30.5 ), ( 0, 270, -90 ) ); + spawncollision( "collision_physics_64x64x10", "collider", ( 2113.5, -44, 30.5 ), ( 0, 270, -90 ) ); + spawncollision( "collision_missile_32x32x128", "collider", ( -2292, -174, -7.5 ), vectorscale( ( 0, 1, 0 ), 270.0 ) ); + spawncollision( "collision_missile_128x128x10", "collider", ( -2219.5, -184.5, 37 ), vectorscale( ( 1, 0, 0 ), 2.9 ) ); + spawncollision( "collision_missile_128x128x10", "collider", ( -2197.5, -184.5, 33 ), vectorscale( ( 1, 0, 0 ), 23.9 ) ); + spawncollision( "collision_clip_32x32x10", "collider", ( 1923.5, 553.5, 43.5 ), ( 1.265, 43.3, -90 ) ); + maps\mp\gametypes\_spawning::level_use_unified_spawning( 1 ); + registerclientfield( "scriptmover", "police_car_lights", 1, 1, "int" ); + level thread destructible_lights(); + setdvar( "r_lightGridEnableTweaks", 1 ); + setdvar( "r_lightGridIntensity", 2.0 ); + setdvar( "r_lightGridContrast", 0.0 ); + level.ragdoll_override = ::ragdoll_override; + level.overrideplayerdeathwatchtimer = ::leveloverridetime; + level.useintermissionpointsonwavespawn = ::useintermissionpointsonwavespawn; + level thread pathing_fix(); } -levelspawndvars( reset_dvars ) //checked matches cerberus output +levelspawndvars( reset_dvars ) { - ss = level.spawnsystem; - ss.enemy_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_radius", "2400", reset_dvars ); - ss.hq_objective_influencer_inner_radius = set_dvar_float_if_unset( "scr_spawn_hq_objective_influencer_inner_radius", "1000", reset_dvars ); + ss = level.spawnsystem; + ss.enemy_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_radius", "2400", reset_dvars ); + ss.hq_objective_influencer_inner_radius = set_dvar_float_if_unset( "scr_spawn_hq_objective_influencer_inner_radius", "1000", reset_dvars ); } -destructible_lights() //checked changed to match cerberus output +destructible_lights() { - wait 0.05; - destructibles = getentarray( "destructible", "targetname" ); - foreach ( destructible in destructibles ) - { - if ( destructible.destructibledef == "veh_t6_dlc_police_car_destructible" ) - { - destructible thread destructible_think( "police_car_lights" ); - destructible setclientfield( "police_car_lights", 1 ); - } - } + wait 0.05; + destructibles = getentarray( "destructible", "targetname" ); + + foreach ( destructible in destructibles ) + { + if ( destructible.destructibledef == "veh_t6_dlc_police_car_destructible" ) + { + destructible thread destructible_think( "police_car_lights" ); + destructible setclientfield( "police_car_lights", 1 ); + } + } } -destructible_think( clientfield ) //checked matches cerberus output +destructible_think( clientfield ) { - self waittill_any( "death", "destructible_base_piece_death" ); - self setclientfield( clientfield, 0 ); + self waittill_any( "death", "destructible_base_piece_death" ); + self setclientfield( clientfield, 0 ); } -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" ) - { - deathanim = body getcorpseanim(); - startfrac = deathanimduration / 1000; - if ( animhasnotetrack( deathanim, "start_ragdoll" ) ) - { - times = getnotetracktimes( deathanim, "start_ragdoll" ); - if ( isDefined( times ) ) - { - startfrac = times[ 0 ]; - } - } - self.body = body; - if ( !isDefined( self.switching_teams ) ) - { - thread maps/mp/gametypes/_deathicons::adddeathicon( body, self, self.team, 5 ); - } - self thread water_spash(); - return 1; - } - return 0; + if ( smeansofdeath == "MOD_FALLING" ) + { + deathanim = body getcorpseanim(); + startfrac = deathanimduration / 1000; + + if ( animhasnotetrack( deathanim, "start_ragdoll" ) ) + { + times = getnotetracktimes( deathanim, "start_ragdoll" ); + + if ( isdefined( times ) ) + startfrac = times[0]; + } + + self.body = body; + + if ( !isdefined( self.switching_teams ) ) + thread maps\mp\gametypes\_deathicons::adddeathicon( body, self, self.team, 5.0 ); + + self thread water_spash(); + return true; + } + + return false; } -water_spash() //checked matches cerberus output +water_spash() { - self endon( "disconnect" ); - self endon( "spawned_player" ); - self endon( "joined_team" ); - self endon( "joined_spectators" ); - trace = groundtrace( self.origin, self.origin - vectorScale( ( 0, 0, 1 ), 2048 ), 0, self.body ); - if ( trace[ "surfacetype" ] == "water" ) - { - while ( self.origin[ 2 ] > ( trace[ "position" ][ 2 ] + 5 ) ) - { - wait 0.05; - } - bone = self gettagorigin( "j_spinelower" ); - origin = ( bone[ 0 ], bone[ 1 ], trace[ "position" ][ 2 ] + 2.5 ); - self playsound( "mpl_splash_death" ); - playfx( level._effect[ "water_splash" ], origin ); - } + self endon( "disconnect" ); + self endon( "spawned_player" ); + self endon( "joined_team" ); + self endon( "joined_spectators" ); + trace = groundtrace( self.origin, self.origin - vectorscale( ( 0, 0, 1 ), 2048.0 ), 0, self.body ); + + if ( trace["surfacetype"] == "water" ) + { + while ( self.origin[2] > trace["position"][2] + 5 ) + wait 0.05; + + bone = self gettagorigin( "j_spinelower" ); + origin = ( bone[0], bone[1], trace["position"][2] + 2.5 ); + self playsound( "mpl_splash_death" ); + playfx( level._effect["water_splash"], origin ); + } } -leveloverridetime( defaulttime ) //checked matches cerberus output +leveloverridetime( defaulttime ) { - if ( self isinwater() ) - { - return 1; - } - return defaulttime; + if ( self isinwater() ) + return 1; + + return defaulttime; } -useintermissionpointsonwavespawn() //checked matches cerberus output +useintermissionpointsonwavespawn() { - return self isinwater(); + return self isinwater(); } -isinwater() //checked partially changed to match cerberus output see info.md +isinwater() { - triggers = getentarray( "trigger_hurt", "classname" ); - foreach ( trigger in triggers ) - { - if ( trigger.origin[ 2 ] > level.mapcenter[ 2 ] ) - { - } - else - { - if ( self istouching( trigger ) ) - { - return 1; - } - } - } - return 0; + triggers = getentarray( "trigger_hurt", "classname" ); + + foreach ( trigger in triggers ) + { + if ( trigger.origin[2] > level.mapcenter[2] ) + continue; + + if ( self istouching( trigger ) ) + return true; + } + + return false; } -pathing_fix() //checked matches cerberus output +pathing_fix() { - wait 1; - nodes = getallnodes(); - disconnect_node( nodes[ 96 ] ); - disconnect_node( nodes[ 600 ] ); + wait 1; + nodes = getallnodes(); + disconnect_node( nodes[96] ); + disconnect_node( nodes[600] ); } -disconnect_node( node ) //checked matches cerberus output +disconnect_node( node ) { - ent = spawn( "script_model", node.origin, 1 ); - ent setmodel( level.deployedshieldmodel ); - ent hide(); - ent disconnectpaths(); - ent.origin -= vectorScale( ( 0, 0, 1 ), 64 ); + ent = spawn( "script_model", node.origin, 1 ); + ent setmodel( level.deployedshieldmodel ); + ent hide(); + ent disconnectpaths(); + ent.origin -= vectorscale( ( 0, 0, 1 ), 64.0 ); } - diff --git a/Multiplayer Core/patch_mp/maps/mp/mp_carrier.gsc b/Multiplayer Core/patch_mp/maps/mp/mp_carrier.gsc index a0e0f01..09581cf 100644 --- a/Multiplayer Core/patch_mp/maps/mp/mp_carrier.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/mp_carrier.gsc @@ -1,150 +1,148 @@ -#include maps/mp/_compass; -#include maps/mp/mp_carrier_amb; -#include maps/mp/_load; -#include maps/mp/mp_carrier_fx; -#include maps/mp/_utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\_utility; +#include maps\mp\mp_carrier_fx; +#include maps\mp\_load; +#include maps\mp\mp_carrier_amb; +#include maps\mp\_compass; -main() //checked changed to match cerberus output +main() { - level.levelspawndvars = ::levelspawndvars; - level.overrideplayerdeathwatchtimer = ::leveloverridetime; - level.useintermissionpointsonwavespawn = ::useintermissionpointsonwavespawn; - maps/mp/mp_carrier_fx::main(); - precachemodel( "collision_physics_wall_512x512x10" ); - precachemodel( "collision_clip_cylinder_32x128" ); - precachemodel( "collision_physics_cylinder_32x128" ); - precachemodel( "collision_clip_wall_32x32x10" ); - precachemodel( "collision_physics_wall_32x32x10" ); - precachemodel( "collision_physics_64x64x128" ); - precachemodel( "collision_physics_32x32x128" ); - precachemodel( "collision_physics_wall_128x128x10" ); - precachemodel( "collision_clip_wall_64x64x10" ); - precachemodel( "collision_physics_32x32x32" ); - precachemodel( "collision_physics_cylinder_32x128" ); - precachemodel( "ac_prs_fps_road_chunk_lrg_a04" ); - precachemodel( "collision_clip_32x32x32" ); - maps/mp/_load::main(); - maps/mp/mp_carrier_amb::main(); - maps/mp/_compass::setupminimap( "compass_map_mp_carrier" ); - game[ "strings" ][ "war_callsign_a" ] = &"MPUI_CALLSIGN_MAPNAME_A"; - game[ "strings" ][ "war_callsign_b" ] = &"MPUI_CALLSIGN_MAPNAME_B"; - game[ "strings" ][ "war_callsign_c" ] = &"MPUI_CALLSIGN_MAPNAME_C"; - game[ "strings" ][ "war_callsign_d" ] = &"MPUI_CALLSIGN_MAPNAME_D"; - game[ "strings" ][ "war_callsign_e" ] = &"MPUI_CALLSIGN_MAPNAME_E"; - game[ "strings_menu" ][ "war_callsign_a" ] = "@MPUI_CALLSIGN_MAPNAME_A"; - game[ "strings_menu" ][ "war_callsign_b" ] = "@MPUI_CALLSIGN_MAPNAME_B"; - game[ "strings_menu" ][ "war_callsign_c" ] = "@MPUI_CALLSIGN_MAPNAME_C"; - game[ "strings_menu" ][ "war_callsign_d" ] = "@MPUI_CALLSIGN_MAPNAME_D"; - game[ "strings_menu" ][ "war_callsign_e" ] = "@MPUI_CALLSIGN_MAPNAME_E"; - spawncollision( "collision_physics_wall_512x512x10", "collider", ( -3733, -1301.22, -204.5 ), vectorScale( ( 0, 0, 1 ), 75.2 ) ); - spawncollision( "collision_physics_wall_512x512x10", "collider", ( -3509, -1301.22, -204.56 ), vectorScale( ( 0, 0, 1 ), 75.2 ) ); - spawncollision( "collision_physics_wall_512x512x10", "collider", ( -3733, -808.22, -334.56 ), vectorScale( ( 0, 0, 1 ), 75.2 ) ); - spawncollision( "collision_physics_wall_512x512x10", "collider", ( -3509, -808.22, -334.56 ), vectorScale( ( 0, 0, 1 ), 75.2 ) ); - spawncollision( "collision_clip_cylinder_32x128", "collider", ( -4821, 951, 82 ), vectorScale( ( 0, 1, 0 ), 344 ) ); - spawncollision( "collision_clip_wall_32x32x10", "collider", ( -4820.39, 930.19, 123 ), vectorScale( ( 0, 1, 0 ), 245 ) ); - spawncollision( "collision_clip_wall_32x32x10", "collider", ( -4820.39, 930.19, 91 ), vectorScale( ( 0, 1, 0 ), 245 ) ); - spawncollision( "collision_clip_wall_32x32x10", "collider", ( -4820.39, 930.19, 59 ), vectorScale( ( 0, 1, 0 ), 245 ) ); - spawncollision( "collision_physics_cylinder_32x128", "collider", ( -4821, 951, 82 ), vectorScale( ( 0, 1, 0 ), 344 ) ); - spawncollision( "collision_physics_wall_32x32x10", "collider", ( -4820.39, 930.19, 123 ), vectorScale( ( 0, 1, 0 ), 245 ) ); - spawncollision( "collision_physics_wall_32x32x10", "collider", ( -4820.39, 930.19, 91 ), vectorScale( ( 0, 1, 0 ), 245 ) ); - spawncollision( "collision_physics_wall_32x32x10", "collider", ( -4820.39, 930.19, 59 ), vectorScale( ( 0, 1, 0 ), 245 ) ); - spawncollision( "collision_physics_cylinder_32x128", "collider", ( -5448, 912, 268 ), vectorScale( ( 0, 1, 0 ), 13 ) ); - spawncollision( "collision_physics_64x64x128", "collider", ( -2434, 806, 66 ), ( 270, 25, 0 ) ); - spawncollision( "collision_physics_32x32x128", "collider", ( -5003, -963, -100 ), vectorScale( ( 1, 1, 0 ), 270 ) ); - spawncollision( "collision_physics_32x32x128", "collider", ( -5003, -1091, -100 ), vectorScale( ( 1, 1, 0 ), 270 ) ); - spawncollision( "collision_physics_32x32x128", "collider", ( -5003, -1219, -88 ), vectorScale( ( 1, 1, 0 ), 270 ) ); - spawncollision( "collision_physics_wall_128x128x10", "collider", ( -5013, -1128, -32 ), ( 270, 270, 180 ) ); - spawncollision( "collision_physics_wall_128x128x10", "collider", ( -3257.5, -1184.5, -45 ), ( 270, 270, 180 ) ); - spawncollision( "collision_physics_wall_128x128x10", "collider", ( -3257.5, -1128, -45 ), ( 270, 270, 180 ) ); - spawncollision( "collision_clip_wall_64x64x10", "collider", ( -4696.5, 662.5, 163.5 ), vectorScale( ( 0, 1, 0 ), 283.2 ) ); - spawncollision( "collision_clip_wall_64x64x10", "collider", ( -5017, -1083.5, 40 ), ( 1, 270, 180 ) ); - spawncollision( "collision_clip_wall_64x64x10", "collider", ( -6316, -1554.5, -30 ), vectorScale( ( 0, 1, 0 ), 49.9 ) ); - spawncollision( "collision_physics_32x32x32", "collider", ( -5852.5, -886, 159.5 ), vectorScale( ( 0, 1, 0 ), 2.59995 ) ); - spawncollision( "collision_physics_32x32x32", "collider", ( -5875.5, -887, 159.5 ), vectorScale( ( 0, 1, 0 ), 2.59995 ) ); - spawncollision( "collision_physics_cylinder_32x128", "collider", ( -5331.5, 727, 247.5 ), vectorScale( ( 0, 0, -1 ), 90 ) ); - spawncollision( "collision_clip_wall_64x64x10", "collider", ( -5838, -913.5, 85 ), vectorScale( ( 0, 0, -1 ), 19.8001 ) ); - greenbarrel1 = spawn( "script_model", ( -5979.48, -347.391, 53.8051 ) ); - greenbarrel1.angles = ( 0, 0, 1 ); - greenbarrel1 setmodel( "ac_prs_fps_road_chunk_lrg_a04" ); - greenbarrel2 = spawn( "script_model", ( -5960.64, -349.489, 59.663 ) ); - greenbarrel2.angles = ( 5.97936, 96.3096, 13.1076 ); - greenbarrel2 setmodel( "ac_prs_fps_road_chunk_lrg_a04" ); - spawncollision( "collision_clip_32x32x32", "collider", ( -5987.5, -347.5, 47 ), vectorScale( ( 0, 1, 0 ), 64.8 ) ); - spawncollision( "collision_clip_32x32x32", "collider", ( -5957.2, -356.902, 47.25 ), vectorScale( ( 0, 1, 0 ), 102.9 ) ); - level thread water_trigger_init(); + level.levelspawndvars = ::levelspawndvars; + level.overrideplayerdeathwatchtimer = ::leveloverridetime; + level.useintermissionpointsonwavespawn = ::useintermissionpointsonwavespawn; + maps\mp\mp_carrier_fx::main(); + precachemodel( "collision_physics_wall_512x512x10" ); + precachemodel( "collision_clip_cylinder_32x128" ); + precachemodel( "collision_physics_cylinder_32x128" ); + precachemodel( "collision_clip_wall_32x32x10" ); + precachemodel( "collision_physics_wall_32x32x10" ); + precachemodel( "collision_physics_64x64x128" ); + precachemodel( "collision_physics_32x32x128" ); + precachemodel( "collision_physics_wall_128x128x10" ); + precachemodel( "collision_clip_wall_64x64x10" ); + precachemodel( "collision_physics_32x32x32" ); + precachemodel( "collision_physics_cylinder_32x128" ); + precachemodel( "ac_prs_fps_road_chunk_lrg_a04" ); + precachemodel( "collision_clip_32x32x32" ); + maps\mp\_load::main(); + maps\mp\mp_carrier_amb::main(); + maps\mp\_compass::setupminimap( "compass_map_mp_carrier" ); + game["strings"]["war_callsign_a"] = &"MPUI_CALLSIGN_MAPNAME_A"; + game["strings"]["war_callsign_b"] = &"MPUI_CALLSIGN_MAPNAME_B"; + game["strings"]["war_callsign_c"] = &"MPUI_CALLSIGN_MAPNAME_C"; + game["strings"]["war_callsign_d"] = &"MPUI_CALLSIGN_MAPNAME_D"; + game["strings"]["war_callsign_e"] = &"MPUI_CALLSIGN_MAPNAME_E"; + game["strings_menu"]["war_callsign_a"] = "@MPUI_CALLSIGN_MAPNAME_A"; + game["strings_menu"]["war_callsign_b"] = "@MPUI_CALLSIGN_MAPNAME_B"; + game["strings_menu"]["war_callsign_c"] = "@MPUI_CALLSIGN_MAPNAME_C"; + game["strings_menu"]["war_callsign_d"] = "@MPUI_CALLSIGN_MAPNAME_D"; + game["strings_menu"]["war_callsign_e"] = "@MPUI_CALLSIGN_MAPNAME_E"; + spawncollision( "collision_physics_wall_512x512x10", "collider", ( -3733, -1301.22, -204.5 ), vectorscale( ( 0, 0, 1 ), 75.2 ) ); + spawncollision( "collision_physics_wall_512x512x10", "collider", ( -3509, -1301.22, -204.56 ), vectorscale( ( 0, 0, 1 ), 75.2 ) ); + spawncollision( "collision_physics_wall_512x512x10", "collider", ( -3733, -808.22, -334.56 ), vectorscale( ( 0, 0, 1 ), 75.2 ) ); + spawncollision( "collision_physics_wall_512x512x10", "collider", ( -3509, -808.22, -334.56 ), vectorscale( ( 0, 0, 1 ), 75.2 ) ); + spawncollision( "collision_clip_cylinder_32x128", "collider", ( -4821, 951, 82 ), vectorscale( ( 0, 1, 0 ), 344.0 ) ); + spawncollision( "collision_clip_wall_32x32x10", "collider", ( -4820.39, 930.19, 123 ), vectorscale( ( 0, 1, 0 ), 245.0 ) ); + spawncollision( "collision_clip_wall_32x32x10", "collider", ( -4820.39, 930.19, 91 ), vectorscale( ( 0, 1, 0 ), 245.0 ) ); + spawncollision( "collision_clip_wall_32x32x10", "collider", ( -4820.39, 930.19, 59 ), vectorscale( ( 0, 1, 0 ), 245.0 ) ); + spawncollision( "collision_physics_cylinder_32x128", "collider", ( -4821, 951, 82 ), vectorscale( ( 0, 1, 0 ), 344.0 ) ); + spawncollision( "collision_physics_wall_32x32x10", "collider", ( -4820.39, 930.19, 123 ), vectorscale( ( 0, 1, 0 ), 245.0 ) ); + spawncollision( "collision_physics_wall_32x32x10", "collider", ( -4820.39, 930.19, 91 ), vectorscale( ( 0, 1, 0 ), 245.0 ) ); + spawncollision( "collision_physics_wall_32x32x10", "collider", ( -4820.39, 930.19, 59 ), vectorscale( ( 0, 1, 0 ), 245.0 ) ); + spawncollision( "collision_physics_cylinder_32x128", "collider", ( -5448, 912, 268 ), vectorscale( ( 0, 1, 0 ), 13.0 ) ); + spawncollision( "collision_physics_64x64x128", "collider", ( -2434, 806, 66 ), ( 270, 25, 0 ) ); + spawncollision( "collision_physics_32x32x128", "collider", ( -5003, -963, -100 ), vectorscale( ( 1, 1, 0 ), 270.0 ) ); + spawncollision( "collision_physics_32x32x128", "collider", ( -5003, -1091, -100 ), vectorscale( ( 1, 1, 0 ), 270.0 ) ); + spawncollision( "collision_physics_32x32x128", "collider", ( -5003, -1219, -88 ), vectorscale( ( 1, 1, 0 ), 270.0 ) ); + spawncollision( "collision_physics_wall_128x128x10", "collider", ( -5013, -1128, -32 ), ( 270, 270, 180 ) ); + spawncollision( "collision_physics_wall_128x128x10", "collider", ( -3257.5, -1184.5, -45 ), ( 270, 270, 180 ) ); + spawncollision( "collision_physics_wall_128x128x10", "collider", ( -3257.5, -1128, -45 ), ( 270, 270, 180 ) ); + spawncollision( "collision_clip_wall_64x64x10", "collider", ( -4696.5, 662.5, 163.5 ), vectorscale( ( 0, 1, 0 ), 283.2 ) ); + spawncollision( "collision_clip_wall_64x64x10", "collider", ( -5017, -1083.5, 40 ), ( 1, 270, 180 ) ); + spawncollision( "collision_clip_wall_64x64x10", "collider", ( -6316, -1554.5, -30 ), vectorscale( ( 0, 1, 0 ), 49.9 ) ); + spawncollision( "collision_physics_32x32x32", "collider", ( -5852.5, -886, 159.5 ), vectorscale( ( 0, 1, 0 ), 2.59995 ) ); + spawncollision( "collision_physics_32x32x32", "collider", ( -5875.5, -887, 159.5 ), vectorscale( ( 0, 1, 0 ), 2.59995 ) ); + spawncollision( "collision_physics_cylinder_32x128", "collider", ( -5331.5, 727, 247.5 ), vectorscale( ( 0, 0, -1 ), 90.0 ) ); + spawncollision( "collision_clip_wall_64x64x10", "collider", ( -5838, -913.5, 85 ), vectorscale( ( 0, 0, -1 ), 19.8001 ) ); + greenbarrel1 = spawn( "script_model", ( -5979.48, -347.391, 53.8051 ) ); + greenbarrel1.angles = ( 0, 0, 0 ); + greenbarrel1 setmodel( "ac_prs_fps_road_chunk_lrg_a04" ); + greenbarrel2 = spawn( "script_model", ( -5960.64, -349.489, 59.663 ) ); + greenbarrel2.angles = ( 5.97936, 96.3096, 13.1076 ); + greenbarrel2 setmodel( "ac_prs_fps_road_chunk_lrg_a04" ); + spawncollision( "collision_clip_32x32x32", "collider", ( -5987.5, -347.5, 47 ), vectorscale( ( 0, 1, 0 ), 64.8 ) ); + spawncollision( "collision_clip_32x32x32", "collider", ( -5957.2, -356.902, 47.25 ), vectorscale( ( 0, 1, 0 ), 102.9 ) ); + level thread water_trigger_init(); } -levelspawndvars( reset_dvars ) //checked matches cerberus output +levelspawndvars( reset_dvars ) { - ss = level.spawnsystem; - ss.enemy_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_radius", "2600", reset_dvars ); + ss = level.spawnsystem; + ss.enemy_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_radius", "2600", reset_dvars ); } -water_trigger_init() //checked partially changed to match cerberus output see info.md +water_trigger_init() { - wait 3; - triggers = getentarray( "trigger_hurt", "classname" ); - foreach ( trigger in triggers ) - { - if ( trigger.origin[ 2 ] > level.mapcenter[ 2 ] ) - { - } - else - { - trigger thread water_trigger_think(); - } - } + wait 3; + triggers = getentarray( "trigger_hurt", "classname" ); + + foreach ( trigger in triggers ) + { + if ( trigger.origin[2] > level.mapcenter[2] ) + continue; + + trigger thread water_trigger_think(); + } } -water_trigger_think() //checked matches cerberus output +water_trigger_think() { - for ( ;; ) - { - self waittill( "trigger", entity ); - if ( isplayer( entity ) ) - { - trace = worldtrace( entity.origin + vectorScale( ( 0, 0, 1 ), 30 ), entity.origin - vectorScale( ( 0, 0, 1 ), 256 ) ); - if ( trace[ "surfacetype" ] == "none" ) - { - entity playsound( "mpl_splash_death" ); - playfx( level._effect[ "water_splash" ], entity.origin + vectorScale( ( 0, 0, 1 ), 40 ) ); - } - } - } + for (;;) + { + self waittill( "trigger", entity ); + + if ( isplayer( entity ) ) + { + trace = worldtrace( entity.origin + vectorscale( ( 0, 0, 1 ), 30.0 ), entity.origin - vectorscale( ( 0, 0, 1 ), 256.0 ) ); + + if ( trace["surfacetype"] == "none" ) + { + entity playsound( "mpl_splash_death" ); + playfx( level._effect["water_splash"], entity.origin + vectorscale( ( 0, 0, 1 ), 40.0 ) ); + } + } + } } -leveloverridetime( defaulttime ) //checked matches cerberus output +leveloverridetime( defaulttime ) { - if ( self isinwater() ) - { - return 0.4; - } - return defaulttime; + if ( self isinwater() ) + return 0.4; + + return defaulttime; } -useintermissionpointsonwavespawn() //checked matches cerberus output +useintermissionpointsonwavespawn() { - return self isinwater(); + return self isinwater(); } -isinwater() //checked partially changed to match cerberus output +isinwater() { - triggers = getentarray( "trigger_hurt", "classname" ); - foreach ( trigger in triggers ) - { - if ( trigger.origin[ 2 ] > level.mapcenter[ 2 ] ) - { - } - else - { - if ( self.origin[ 2 ] < trigger.origin[ 2 ] ) - { - trace = worldtrace( self.origin + vectorScale( ( 0, 0, 1 ), 30 ), self.origin - vectorScale( ( 0, 0, 1 ), 256 ) ); - return trace[ "surfacetype" ] == "none"; - } - } - } - return 0; + triggers = getentarray( "trigger_hurt", "classname" ); + + foreach ( trigger in triggers ) + { + if ( trigger.origin[2] > level.mapcenter[2] ) + continue; + + if ( self.origin[2] < trigger.origin[2] ) + { + trace = worldtrace( self.origin + vectorscale( ( 0, 0, 1 ), 30.0 ), self.origin - vectorscale( ( 0, 0, 1 ), 256.0 ) ); + return trace["surfacetype"] == "none"; + } + } + + return 0; } - - diff --git a/Multiplayer Core/patch_mp/maps/mp/mp_castaway.gsc b/Multiplayer Core/patch_mp/maps/mp/mp_castaway.gsc index 672e042..31185f1 100644 --- a/Multiplayer Core/patch_mp/maps/mp/mp_castaway.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/mp_castaway.gsc @@ -1,62 +1,62 @@ -//checked includes changed to match cerberus output -#include maps/mp/_compass; -#include maps/mp/mp_castaway_amb; -#include maps/mp/_load; -#include maps/mp/mp_castaway_fx; -#include maps/mp/_utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\_utility; +#include maps\mp\mp_castaway_fx; +#include maps\mp\_load; +#include maps\mp\mp_castaway_amb; +#include maps\mp\_compass; -main() //checked changed to match cerberus output +main() { - level.levelspawndvars = ::levelspawndvars; - maps/mp/mp_castaway_fx::main(); - precachemodel( "collision_physics_64x64x10" ); - precachemodel( "collision_clip_64x64x10" ); - precachemodel( "collision_physics_128x128x10" ); - precachemodel( "p6_cas_rock_medium_02_trimmed" ); - maps/mp/_load::main(); - maps/mp/mp_castaway_amb::main(); - maps/mp/_compass::setupminimap( "compass_map_mp_castaway" ); - setdvar( "compassmaxrange", "2100" ); - setdvar( "bg_dog_swim_enabled", 1 ); - game[ "strings" ][ "war_callsign_a" ] = &"MPUI_CALLSIGN_MAPNAME_A"; - game[ "strings" ][ "war_callsign_b" ] = &"MPUI_CALLSIGN_MAPNAME_B"; - game[ "strings" ][ "war_callsign_c" ] = &"MPUI_CALLSIGN_MAPNAME_C"; - game[ "strings" ][ "war_callsign_d" ] = &"MPUI_CALLSIGN_MAPNAME_D"; - game[ "strings" ][ "war_callsign_e" ] = &"MPUI_CALLSIGN_MAPNAME_E"; - game[ "strings_menu" ][ "war_callsign_a" ] = "@MPUI_CALLSIGN_MAPNAME_A"; - game[ "strings_menu" ][ "war_callsign_b" ] = "@MPUI_CALLSIGN_MAPNAME_B"; - game[ "strings_menu" ][ "war_callsign_c" ] = "@MPUI_CALLSIGN_MAPNAME_C"; - game[ "strings_menu" ][ "war_callsign_d" ] = "@MPUI_CALLSIGN_MAPNAME_D"; - game[ "strings_menu" ][ "war_callsign_e" ] = "@MPUI_CALLSIGN_MAPNAME_E"; - spawncollision( "collision_physics_64x64x10", "collider", ( -1181, 1602, 242 ), ( 9.8, 270, 106 ) ); - spawncollision( "collision_physics_64x64x10", "collider", ( -1181, 1635, 242 ), ( 9.81, 270, 106 ) ); - spawncollision( "collision_physics_64x64x10", "collider", ( -1174, 1602, 197 ), ( 360, 270, 90 ) ); - spawncollision( "collision_physics_64x64x10", "collider", ( -1174, 1635, 197 ), ( 360, 270, 90 ) ); - spawncollision( "collision_physics_64x64x10", "collider", ( -329, 656, 123 ), ( 359.424, 286.385, 127.196 ) ); - spawncollision( "collision_physics_64x64x10", "collider", ( -342, 699, 124 ), ( 354.888, 295.033, 125.723 ) ); - spawncollision( "collision_physics_64x64x10", "collider", ( -707, 2358, 145 ), vectorScale( ( 1, 0, 0 ), 90 ) ); - spawncollision( "collision_clip_64x64x10", "collider", ( 407.5, 518, 103 ), vectorScale( ( 1, 0, 0 ), 270 ) ); - spawncollision( "collision_clip_64x64x10", "collider", ( 381, 552, 103 ), ( 270, 65.4, 6.57 ) ); - spawncollision( "collision_clip_64x64x10", "collider", ( 343, 559, 103 ), ( 270, 112.8, 0 ) ); - spawncollision( "collision_clip_64x64x10", "collider", ( 370.5, 526, 128.5 ), vectorScale( ( 0, 1, 0 ), 66.2 ) ); - spawncollision( "collision_clip_64x64x10", "collider", ( 357, 525, 129.5 ), vectorScale( ( 0, 1, 0 ), 23 ) ); - rock1 = spawn( "script_model", ( 373.607, 484.974, 42.6 ) ); - rock1.angles = ( 350.899, 243.975, 4.02471 ); - rock1 setmodel( "p6_cas_rock_medium_02_trimmed" ); - spawncollision( "collision_physics_64x64x10", "collider", ( 479.5, 270, 75 ), ( 346.453, 344.758, 4.31137 ) ); - spawncollision( "collision_physics_64x64x10", "collider", ( 477.5, 270, 76 ), ( 349.833, 342.352, 15.9726 ) ); - spawncollision( "collision_physics_128x128x10", "collider", ( 1503, 186, 121 ), ( 16.2357, 331.376, -70.4431 ) ); - spawncollision( "collision_physics_128x128x10", "collider", ( 1571, 147, 97 ), ( 16.2357, 331.376, -70.4431 ) ); - spawncollision( "collision_clip_64x64x10", "collider", ( 1411, 118.5, 161.5 ), ( 4.9243, 334.331, 80.0809 ) ); - level.levelkothdisable = []; - level.levelkothdisable[ level.levelkothdisable.size ] = spawn( "trigger_radius", ( 281.5, 443.5, 161 ), 0, 50, 50 ); + level.levelspawndvars = ::levelspawndvars; + maps\mp\mp_castaway_fx::main(); + precachemodel( "collision_physics_64x64x10" ); + precachemodel( "collision_clip_64x64x10" ); + precachemodel( "collision_physics_128x128x10" ); + precachemodel( "p6_cas_rock_medium_02_trimmed" ); + maps\mp\_load::main(); + maps\mp\mp_castaway_amb::main(); + maps\mp\_compass::setupminimap( "compass_map_mp_castaway" ); + setdvar( "compassmaxrange", "2100" ); + setdvar( "bg_dog_swim_enabled", 1 ); + game["strings"]["war_callsign_a"] = &"MPUI_CALLSIGN_MAPNAME_A"; + game["strings"]["war_callsign_b"] = &"MPUI_CALLSIGN_MAPNAME_B"; + game["strings"]["war_callsign_c"] = &"MPUI_CALLSIGN_MAPNAME_C"; + game["strings"]["war_callsign_d"] = &"MPUI_CALLSIGN_MAPNAME_D"; + game["strings"]["war_callsign_e"] = &"MPUI_CALLSIGN_MAPNAME_E"; + game["strings_menu"]["war_callsign_a"] = "@MPUI_CALLSIGN_MAPNAME_A"; + game["strings_menu"]["war_callsign_b"] = "@MPUI_CALLSIGN_MAPNAME_B"; + game["strings_menu"]["war_callsign_c"] = "@MPUI_CALLSIGN_MAPNAME_C"; + game["strings_menu"]["war_callsign_d"] = "@MPUI_CALLSIGN_MAPNAME_D"; + game["strings_menu"]["war_callsign_e"] = "@MPUI_CALLSIGN_MAPNAME_E"; + spawncollision( "collision_physics_64x64x10", "collider", ( -1181, 1602, 242 ), ( 9.8, 270, 106 ) ); + spawncollision( "collision_physics_64x64x10", "collider", ( -1181, 1635, 242 ), ( 9.81, 270, 106 ) ); + spawncollision( "collision_physics_64x64x10", "collider", ( -1174, 1602, 197 ), ( 360, 270, 90 ) ); + spawncollision( "collision_physics_64x64x10", "collider", ( -1174, 1635, 197 ), ( 360, 270, 90 ) ); + spawncollision( "collision_physics_64x64x10", "collider", ( -329, 656, 123 ), ( 359.424, 286.385, 127.196 ) ); + spawncollision( "collision_physics_64x64x10", "collider", ( -342, 699, 124 ), ( 354.888, 295.033, 125.723 ) ); + spawncollision( "collision_physics_64x64x10", "collider", ( -707, 2358, 145 ), vectorscale( ( 1, 0, 0 ), 90.0 ) ); + spawncollision( "collision_clip_64x64x10", "collider", ( 407.5, 518, 103 ), vectorscale( ( 1, 0, 0 ), 270.0 ) ); + spawncollision( "collision_clip_64x64x10", "collider", ( 381, 552, 103 ), ( 270, 65.4, 6.57 ) ); + spawncollision( "collision_clip_64x64x10", "collider", ( 343, 559, 103 ), ( 270, 112.8, 0 ) ); + spawncollision( "collision_clip_64x64x10", "collider", ( 370.5, 526, 128.5 ), vectorscale( ( 0, 1, 0 ), 66.2 ) ); + spawncollision( "collision_clip_64x64x10", "collider", ( 357, 525, 129.5 ), vectorscale( ( 0, 1, 0 ), 23.0 ) ); + rock1 = spawn( "script_model", ( 373.607, 484.974, 42.6 ) ); + rock1.angles = ( 350.899, 243.975, 4.02471 ); + rock1 setmodel( "p6_cas_rock_medium_02_trimmed" ); + spawncollision( "collision_physics_64x64x10", "collider", ( 479.5, 270, 75 ), ( 346.453, 344.758, 4.31137 ) ); + spawncollision( "collision_physics_64x64x10", "collider", ( 477.5, 270, 76 ), ( 349.833, 342.352, 15.9726 ) ); + spawncollision( "collision_physics_128x128x10", "collider", ( 1503, 186, 121 ), ( 16.2357, 331.376, -70.4431 ) ); + spawncollision( "collision_physics_128x128x10", "collider", ( 1571, 147, 97 ), ( 16.2357, 331.376, -70.4431 ) ); + spawncollision( "collision_clip_64x64x10", "collider", ( 1411, 118.5, 161.5 ), ( 4.9243, 334.331, 80.0809 ) ); + level.levelkothdisable = []; + level.levelkothdisable[level.levelkothdisable.size] = spawn( "trigger_radius", ( 281.5, 443.5, 161 ), 0, 50, 50 ); } -levelspawndvars( reset_dvars ) //checked matches cerberus output +levelspawndvars( reset_dvars ) { - ss = level.spawnsystem; - ss.enemy_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_radius", "2200", reset_dvars ); - ss.hq_objective_influencer_inner_radius = set_dvar_float_if_unset( "scr_spawn_hq_objective_influencer_inner_radius", "1000", reset_dvars ); - ss.hq_objective_influencer_radius = 3000; + ss = level.spawnsystem; + ss.enemy_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_radius", "2200", reset_dvars ); + ss.hq_objective_influencer_inner_radius = set_dvar_float_if_unset( "scr_spawn_hq_objective_influencer_inner_radius", "1000", reset_dvars ); + ss.hq_objective_influencer_radius = 3000; } - diff --git a/Multiplayer Core/patch_mp/maps/mp/mp_concert.gsc b/Multiplayer Core/patch_mp/maps/mp/mp_concert.gsc index edef141..e81312d 100644 --- a/Multiplayer Core/patch_mp/maps/mp/mp_concert.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/mp_concert.gsc @@ -1,129 +1,123 @@ -//checked includes changed to match cerberus output -#include maps/mp/gametypes/_spawning; -#include maps/mp/_compass; -#include maps/mp/mp_concert_amb; -#include maps/mp/_load; -#include maps/mp/mp_concert_fx; -#include maps/mp/_utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\_utility; +#include maps\mp\mp_concert_fx; +#include maps\mp\_load; +#include maps\mp\mp_concert_amb; +#include maps\mp\_compass; +#include maps\mp\gametypes\_spawning; -main() //checked matches cerberus output +main() { - level.levelspawndvars = ::levelspawndvars; - level.overrideplayerdeathwatchtimer = ::leveloverridetime; - level.useintermissionpointsonwavespawn = ::useintermissionpointsonwavespawn; - maps/mp/mp_concert_fx::main(); - maps/mp/_load::main(); - maps/mp/mp_concert_amb::main(); - maps/mp/_compass::setupminimap( "compass_map_mp_concert" ); - setdvar( "compassmaxrange", "2100" ); - game[ "strings" ][ "war_callsign_a" ] = &"MPUI_CALLSIGN_MAPNAME_A"; - game[ "strings" ][ "war_callsign_b" ] = &"MPUI_CALLSIGN_MAPNAME_B"; - game[ "strings" ][ "war_callsign_c" ] = &"MPUI_CALLSIGN_MAPNAME_C"; - game[ "strings" ][ "war_callsign_d" ] = &"MPUI_CALLSIGN_MAPNAME_D"; - game[ "strings" ][ "war_callsign_e" ] = &"MPUI_CALLSIGN_MAPNAME_E"; - game[ "strings_menu" ][ "war_callsign_a" ] = "@MPUI_CALLSIGN_MAPNAME_A"; - game[ "strings_menu" ][ "war_callsign_b" ] = "@MPUI_CALLSIGN_MAPNAME_B"; - game[ "strings_menu" ][ "war_callsign_c" ] = "@MPUI_CALLSIGN_MAPNAME_C"; - game[ "strings_menu" ][ "war_callsign_d" ] = "@MPUI_CALLSIGN_MAPNAME_D"; - game[ "strings_menu" ][ "war_callsign_e" ] = "@MPUI_CALLSIGN_MAPNAME_E"; - maps/mp/gametypes/_spawning::level_use_unified_spawning( 1 ); - level.remotemotarviewup = 18; - level thread water_trigger_init(); + level.levelspawndvars = ::levelspawndvars; + level.overrideplayerdeathwatchtimer = ::leveloverridetime; + level.useintermissionpointsonwavespawn = ::useintermissionpointsonwavespawn; + maps\mp\mp_concert_fx::main(); + maps\mp\_load::main(); + maps\mp\mp_concert_amb::main(); + maps\mp\_compass::setupminimap( "compass_map_mp_concert" ); + setdvar( "compassmaxrange", "2100" ); + game["strings"]["war_callsign_a"] = &"MPUI_CALLSIGN_MAPNAME_A"; + game["strings"]["war_callsign_b"] = &"MPUI_CALLSIGN_MAPNAME_B"; + game["strings"]["war_callsign_c"] = &"MPUI_CALLSIGN_MAPNAME_C"; + game["strings"]["war_callsign_d"] = &"MPUI_CALLSIGN_MAPNAME_D"; + game["strings"]["war_callsign_e"] = &"MPUI_CALLSIGN_MAPNAME_E"; + game["strings_menu"]["war_callsign_a"] = "@MPUI_CALLSIGN_MAPNAME_A"; + game["strings_menu"]["war_callsign_b"] = "@MPUI_CALLSIGN_MAPNAME_B"; + game["strings_menu"]["war_callsign_c"] = "@MPUI_CALLSIGN_MAPNAME_C"; + game["strings_menu"]["war_callsign_d"] = "@MPUI_CALLSIGN_MAPNAME_D"; + game["strings_menu"]["war_callsign_e"] = "@MPUI_CALLSIGN_MAPNAME_E"; + maps\mp\gametypes\_spawning::level_use_unified_spawning( 1 ); + level.remotemotarviewup = 18; + level thread water_trigger_init(); } -levelspawndvars( reset_dvars ) //checked matches cerberus output +levelspawndvars( reset_dvars ) { - ss = level.spawnsystem; - ss.enemy_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_radius", "2300", reset_dvars ); + ss = level.spawnsystem; + ss.enemy_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_radius", "2300", reset_dvars ); } -water_trigger_init() //checked partially changed to match cerberus output see info.md +water_trigger_init() { - wait 3; - triggers = getentarray( "trigger_hurt", "classname" ); - foreach ( trigger in triggers ) - { - if ( trigger.origin[ 2 ] > level.mapcenter[ 2 ] ) - { - } - else - { - trigger thread water_trigger_think(); - } - } - triggers = getentarray( "water_killbrush", "targetname" ); - foreach ( trigger in triggers ) - { - trigger thread player_splash_think(); - } + wait 3; + triggers = getentarray( "trigger_hurt", "classname" ); + + foreach ( trigger in triggers ) + { + if ( trigger.origin[2] > level.mapcenter[2] ) + continue; + + trigger thread water_trigger_think(); + } + + triggers = getentarray( "water_killbrush", "targetname" ); + + foreach ( trigger in triggers ) + trigger thread player_splash_think(); } -player_splash_think() //checked matches cerberus output +player_splash_think() { - for ( ;; ) - { - self waittill( "trigger", entity ); - if ( isplayer( entity ) && isalive( entity ) ) - { - self thread trigger_thread( entity, ::player_water_fx ); - } - } + for (;;) + { + self waittill( "trigger", entity ); + + if ( isplayer( entity ) && isalive( entity ) ) + self thread trigger_thread( entity, ::player_water_fx ); + } } -player_water_fx( player, endon_condition ) //checked matches cerberus output +player_water_fx( player, endon_condition ) { - maxs = self.origin + self getmaxs(); - if ( maxs[ 2 ] > 60 ) - { - maxs += vectorScale( ( 0, 0, 1 ), 10 ); - } - origin = ( player.origin[ 0 ], player.origin[ 1 ], maxs[ 2 ] ); - playfx( level._effect[ "water_splash_sm" ], origin ); + maxs = self.origin + self getmaxs(); + + if ( maxs[2] > 60 ) + maxs += vectorscale( ( 0, 0, 1 ), 10.0 ); + + origin = ( player.origin[0], player.origin[1], maxs[2] ); + playfx( level._effect["water_splash_sm"], origin ); } -water_trigger_think() //checked matches cerberus output +water_trigger_think() { - for ( ;; ) - { - self waittill( "trigger", entity ); - if ( isplayer( entity ) ) - { - entity playsound( "mpl_splash_death" ); - playfx( level._effect[ "water_splash" ], entity.origin + vectorScale( ( 0, 0, 1 ), 40 ) ); - } - } + for (;;) + { + self waittill( "trigger", entity ); + + if ( isplayer( entity ) ) + { + entity playsound( "mpl_splash_death" ); + playfx( level._effect["water_splash"], entity.origin + vectorscale( ( 0, 0, 1 ), 40.0 ) ); + } + } } -leveloverridetime( defaulttime ) //checked matches cerberus output +leveloverridetime( defaulttime ) { - if ( self isinwater() ) - { - return 0.4; - } - return defaulttime; + if ( self isinwater() ) + return 0.4; + + return defaulttime; } -useintermissionpointsonwavespawn() //checked matches cerberus output +useintermissionpointsonwavespawn() { - return self isinwater(); + return self isinwater(); } -isinwater() //checked partially changed to match cerberus output see info.md +isinwater() { - triggers = getentarray( "trigger_hurt", "classname" ); - foreach ( trigger in triggers ) - { - if ( trigger.origin[ 2 ] > level.mapcenter[ 2 ] ) - { - } - else - { - if ( self istouching( trigger ) ) - { - return 1; - } - } - } - return 0; -} + triggers = getentarray( "trigger_hurt", "classname" ); + foreach ( trigger in triggers ) + { + if ( trigger.origin[2] > level.mapcenter[2] ) + continue; + + if ( self istouching( trigger ) ) + return true; + } + + return false; +} diff --git a/Multiplayer Core/patch_mp/maps/mp/mp_dig.gsc b/Multiplayer Core/patch_mp/maps/mp/mp_dig.gsc index c73ffeb..b397e23 100644 --- a/Multiplayer Core/patch_mp/maps/mp/mp_dig.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/mp_dig.gsc @@ -1,58 +1,57 @@ -//checked includes changed to match cerberus output -#include maps/mp/gametypes/_spawning; -#include maps/mp/_compass; -#include maps/mp/mp_dig_amb; -#include maps/mp/_load; -#include maps/mp/mp_dig_fx; -#include maps/mp/_utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\_utility; +#include maps\mp\mp_dig_fx; +#include maps\mp\_load; +#include maps\mp\mp_dig_amb; +#include maps\mp\_compass; +#include maps\mp\gametypes\_spawning; - -main() //checked matches cerberus output +main() { - level.levelspawndvars = ::levelspawndvars; - maps/mp/mp_dig_fx::main(); - precachemodel( "collision_clip_wall_32x32x10" ); - precachemodel( "p6_dig_brick_03" ); - maps/mp/_load::main(); - maps/mp/mp_dig_amb::main(); - maps/mp/_compass::setupminimap( "compass_map_mp_dig" ); - setdvar( "compassmaxrange", "2100" ); - game[ "strings" ][ "war_callsign_a" ] = &"MPUI_CALLSIGN_MAPNAME_A"; - game[ "strings" ][ "war_callsign_b" ] = &"MPUI_CALLSIGN_MAPNAME_B"; - game[ "strings" ][ "war_callsign_c" ] = &"MPUI_CALLSIGN_MAPNAME_C"; - game[ "strings" ][ "war_callsign_d" ] = &"MPUI_CALLSIGN_MAPNAME_D"; - game[ "strings" ][ "war_callsign_e" ] = &"MPUI_CALLSIGN_MAPNAME_E"; - game[ "strings_menu" ][ "war_callsign_a" ] = "@MPUI_CALLSIGN_MAPNAME_A"; - game[ "strings_menu" ][ "war_callsign_b" ] = "@MPUI_CALLSIGN_MAPNAME_B"; - game[ "strings_menu" ][ "war_callsign_c" ] = "@MPUI_CALLSIGN_MAPNAME_C"; - game[ "strings_menu" ][ "war_callsign_d" ] = "@MPUI_CALLSIGN_MAPNAME_D"; - game[ "strings_menu" ][ "war_callsign_e" ] = "@MPUI_CALLSIGN_MAPNAME_E"; - brick1 = spawn( "script_model", ( -5.6285, 604.473, 39.05 ) ); - brick1.angles = ( 359.199, 90.0129, -0.822672 ); - brick2 = spawn( "script_model", ( -12.63, 604.47, 39.05 ) ); - brick2.angles = ( 359.199, 90.0129, -0.822672 ); - brick3 = spawn( "script_model", ( -5.63, 614.97, 39.05 ) ); - brick3.angles = ( 359.199, 90.0129, -0.822672 ); - brick4 = spawn( "script_model", ( -12.63, 614.97, 39.05 ) ); - brick4.angles = ( 359.199, 90.0129, -0.822672 ); - brick5 = spawn( "script_model", ( -5.63, 629.47, 39.55 ) ); - brick5.angles = ( 359.199, 90.0129, -0.822672 ); - brick6 = spawn( "script_model", ( -12.63, 629.47, 39.55 ) ); - brick6.angles = ( 359.199, 90.0129, -0.822672 ); - brick1 setmodel( "p6_dig_brick_03" ); - brick2 setmodel( "p6_dig_brick_03" ); - brick3 setmodel( "p6_dig_brick_03" ); - brick4 setmodel( "p6_dig_brick_03" ); - brick5 setmodel( "p6_dig_brick_03" ); - brick6 setmodel( "p6_dig_brick_03" ); - spawncollision( "collision_clip_wall_32x32x10", "collider", ( -1404, -1126, 46.5 ), vectorScale( ( 0, 1, 0 ), 90 ) ); - maps/mp/gametypes/_spawning::level_use_unified_spawning( 1 ); + level.levelspawndvars = ::levelspawndvars; + maps\mp\mp_dig_fx::main(); + precachemodel( "collision_clip_wall_32x32x10" ); + precachemodel( "p6_dig_brick_03" ); + maps\mp\_load::main(); + maps\mp\mp_dig_amb::main(); + maps\mp\_compass::setupminimap( "compass_map_mp_dig" ); + setdvar( "compassmaxrange", "2100" ); + game["strings"]["war_callsign_a"] = &"MPUI_CALLSIGN_MAPNAME_A"; + game["strings"]["war_callsign_b"] = &"MPUI_CALLSIGN_MAPNAME_B"; + game["strings"]["war_callsign_c"] = &"MPUI_CALLSIGN_MAPNAME_C"; + game["strings"]["war_callsign_d"] = &"MPUI_CALLSIGN_MAPNAME_D"; + game["strings"]["war_callsign_e"] = &"MPUI_CALLSIGN_MAPNAME_E"; + game["strings_menu"]["war_callsign_a"] = "@MPUI_CALLSIGN_MAPNAME_A"; + game["strings_menu"]["war_callsign_b"] = "@MPUI_CALLSIGN_MAPNAME_B"; + game["strings_menu"]["war_callsign_c"] = "@MPUI_CALLSIGN_MAPNAME_C"; + game["strings_menu"]["war_callsign_d"] = "@MPUI_CALLSIGN_MAPNAME_D"; + game["strings_menu"]["war_callsign_e"] = "@MPUI_CALLSIGN_MAPNAME_E"; + brick1 = spawn( "script_model", ( -5.6285, 604.473, 39.05 ) ); + brick1.angles = ( 359.199, 90.0129, -0.822672 ); + brick2 = spawn( "script_model", ( -12.63, 604.47, 39.05 ) ); + brick2.angles = ( 359.199, 90.0129, -0.822672 ); + brick3 = spawn( "script_model", ( -5.63, 614.97, 39.05 ) ); + brick3.angles = ( 359.199, 90.0129, -0.822672 ); + brick4 = spawn( "script_model", ( -12.63, 614.97, 39.05 ) ); + brick4.angles = ( 359.199, 90.0129, -0.822672 ); + brick5 = spawn( "script_model", ( -5.63, 629.47, 39.55 ) ); + brick5.angles = ( 359.199, 90.0129, -0.822672 ); + brick6 = spawn( "script_model", ( -12.63, 629.47, 39.55 ) ); + brick6.angles = ( 359.199, 90.0129, -0.822672 ); + brick1 setmodel( "p6_dig_brick_03" ); + brick2 setmodel( "p6_dig_brick_03" ); + brick3 setmodel( "p6_dig_brick_03" ); + brick4 setmodel( "p6_dig_brick_03" ); + brick5 setmodel( "p6_dig_brick_03" ); + brick6 setmodel( "p6_dig_brick_03" ); + spawncollision( "collision_clip_wall_32x32x10", "collider", ( -1404, -1126, 46.5 ), vectorscale( ( 0, 1, 0 ), 90.0 ) ); + maps\mp\gametypes\_spawning::level_use_unified_spawning( 1 ); } -levelspawndvars( reset_dvars ) //checked matches cerberus output +levelspawndvars( reset_dvars ) { - ss = level.spawnsystem; - ss.enemy_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_radius", "2300", reset_dvars ); - ss.hq_objective_influencer_inner_radius = set_dvar_float_if_unset( "scr_spawn_hq_objective_influencer_inner_radius", "1000", reset_dvars ); + ss = level.spawnsystem; + ss.enemy_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_radius", "2300", reset_dvars ); + ss.hq_objective_influencer_inner_radius = set_dvar_float_if_unset( "scr_spawn_hq_objective_influencer_inner_radius", "1000", reset_dvars ); } - diff --git a/Multiplayer Core/patch_mp/maps/mp/mp_dockside.gsc b/Multiplayer Core/patch_mp/maps/mp/mp_dockside.gsc index 96b079e..2702db4 100644 --- a/Multiplayer Core/patch_mp/maps/mp/mp_dockside.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/mp_dockside.gsc @@ -1,185 +1,177 @@ -//checked includes changed to match cerberus output -#include maps/mp/mp_dockside_crane; -#include maps/mp/_compass; -#include maps/mp/mp_dockside_amb; -#include maps/mp/_load; -#include maps/mp/mp_dockside_fx; -#include maps/mp/_utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\_utility; +#include maps\mp\mp_dockside_fx; +#include maps\mp\_load; +#include maps\mp\mp_dockside_amb; +#include maps\mp\_compass; +#include maps\mp\mp_dockside_crane; -main() //checked changed to match cerberus output +main() { - level.levelspawndvars = ::levelspawndvars; - maps/mp/mp_dockside_fx::main(); - precachemodel( "collision_clip_64x64x64" ); - precachemodel( "collision_clip_32x32x32" ); - precachemodel( "collision_missile_128x128x10" ); - precachemodel( "collision_missile_32x32x128" ); - maps/mp/_load::main(); - maps/mp/mp_dockside_amb::main(); - maps/mp/_compass::setupminimap( "compass_map_mp_dockside" ); - level.overrideplayerdeathwatchtimer = ::leveloverridetime; - level.useintermissionpointsonwavespawn = ::useintermissionpointsonwavespawn; - game[ "strings" ][ "war_callsign_a" ] = &"MPUI_CALLSIGN_MAPNAME_A"; - game[ "strings" ][ "war_callsign_b" ] = &"MPUI_CALLSIGN_MAPNAME_B"; - game[ "strings" ][ "war_callsign_c" ] = &"MPUI_CALLSIGN_MAPNAME_C"; - game[ "strings" ][ "war_callsign_d" ] = &"MPUI_CALLSIGN_MAPNAME_D"; - game[ "strings" ][ "war_callsign_e" ] = &"MPUI_CALLSIGN_MAPNAME_E"; - game[ "strings_menu" ][ "war_callsign_a" ] = "@MPUI_CALLSIGN_MAPNAME_A"; - game[ "strings_menu" ][ "war_callsign_b" ] = "@MPUI_CALLSIGN_MAPNAME_B"; - game[ "strings_menu" ][ "war_callsign_c" ] = "@MPUI_CALLSIGN_MAPNAME_C"; - game[ "strings_menu" ][ "war_callsign_d" ] = "@MPUI_CALLSIGN_MAPNAME_D"; - game[ "strings_menu" ][ "war_callsign_e" ] = "@MPUI_CALLSIGN_MAPNAME_E"; - spawncollision( "collision_clip_64x64x64", "collider", ( 1095, 1489, -111 ), ( 0, 0, 0 ) ); - spawncollision( "collision_clip_32x32x32", "collider", ( 1079, 1441, -97 ), ( 0, 0, 0 ) ); - spawncollision( "collision_clip_wall_128x128x10", "collider", ( -1791, 2954, -23 ), vectorScale( ( 0, 1, 0 ), 270 ) ); - setdvar( "sm_sunsamplesizenear", 0.39 ); - setdvar( "sm_sunshadowsmall", 1 ); - if ( getgametypesetting( "allowMapScripting" ) ) - { - level maps/mp/mp_dockside_crane::init(); - } - crate_triggers = getentarray( "crate_kill_trigger", "targetname" ); - for ( i = 0; i < crate_triggers.size; i++ ) - { - crate_triggers[ i ] delete(); - } - setheliheightpatchenabled( "war_mode_heli_height_lock", 0 ); - level thread water_trigger_init(); - rts_remove(); - /* + level.levelspawndvars = ::levelspawndvars; + maps\mp\mp_dockside_fx::main(); + precachemodel( "collision_clip_64x64x64" ); + precachemodel( "collision_clip_32x32x32" ); + precachemodel( "collision_missile_128x128x10" ); + precachemodel( "collision_missile_32x32x128" ); + maps\mp\_load::main(); + maps\mp\mp_dockside_amb::main(); + maps\mp\_compass::setupminimap( "compass_map_mp_dockside" ); + level.overrideplayerdeathwatchtimer = ::leveloverridetime; + level.useintermissionpointsonwavespawn = ::useintermissionpointsonwavespawn; + game["strings"]["war_callsign_a"] = &"MPUI_CALLSIGN_MAPNAME_A"; + game["strings"]["war_callsign_b"] = &"MPUI_CALLSIGN_MAPNAME_B"; + game["strings"]["war_callsign_c"] = &"MPUI_CALLSIGN_MAPNAME_C"; + game["strings"]["war_callsign_d"] = &"MPUI_CALLSIGN_MAPNAME_D"; + game["strings"]["war_callsign_e"] = &"MPUI_CALLSIGN_MAPNAME_E"; + game["strings_menu"]["war_callsign_a"] = "@MPUI_CALLSIGN_MAPNAME_A"; + game["strings_menu"]["war_callsign_b"] = "@MPUI_CALLSIGN_MAPNAME_B"; + game["strings_menu"]["war_callsign_c"] = "@MPUI_CALLSIGN_MAPNAME_C"; + game["strings_menu"]["war_callsign_d"] = "@MPUI_CALLSIGN_MAPNAME_D"; + game["strings_menu"]["war_callsign_e"] = "@MPUI_CALLSIGN_MAPNAME_E"; + spawncollision( "collision_clip_64x64x64", "collider", ( 1095, 1489, -111 ), ( 0, 0, 0 ) ); + spawncollision( "collision_clip_32x32x32", "collider", ( 1079, 1441, -97 ), ( 0, 0, 0 ) ); + spawncollision( "collision_clip_wall_128x128x10", "collider", ( -1791, 2954, -23 ), vectorscale( ( 0, 1, 0 ), 270.0 ) ); + setdvar( "sm_sunsamplesizenear", 0.39 ); + setdvar( "sm_sunshadowsmall", 1 ); + + if ( getgametypesetting( "allowMapScripting" ) ) + level maps\mp\mp_dockside_crane::init(); + else + { + crate_triggers = getentarray( "crate_kill_trigger", "targetname" ); + + for ( i = 0; i < crate_triggers.size; i++ ) + crate_triggers[i] delete(); + } + + setheliheightpatchenabled( "war_mode_heli_height_lock", 0 ); + level thread water_trigger_init(); + rts_remove(); /# - level thread devgui_dockside(); - execdevgui( "devgui_mp_dockside" ); + level thread devgui_dockside(); + execdevgui( "devgui_mp_dockside" ); #/ - */ } -levelspawndvars( reset_dvars ) //checked matches cerberus output +levelspawndvars( reset_dvars ) { - ss = level.spawnsystem; - ss.enemy_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_radius", "2700", reset_dvars ); + ss = level.spawnsystem; + ss.enemy_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_radius", "2700", reset_dvars ); } -water_trigger_init() //checked partially changed to match cerberus output see info.md +water_trigger_init() { - wait 3; - triggers = getentarray( "trigger_hurt", "classname" ); - foreach ( trigger in triggers ) - { - if ( trigger.origin[ 2 ] > level.mapcenter[ 2 ] ) - { - } - else - { - trigger thread water_trigger_think(); - } - } + wait 3; + triggers = getentarray( "trigger_hurt", "classname" ); + + foreach ( trigger in triggers ) + { + if ( trigger.origin[2] > level.mapcenter[2] ) + continue; + + trigger thread water_trigger_think(); + } } -water_trigger_think() //checked matches cerberus output +water_trigger_think() { - for ( ;; ) - { - self waittill( "trigger", entity ); - if ( isplayer( entity ) ) - { - entity playsound( "mpl_splash_death" ); - playfx( level._effect[ "water_splash" ], entity.origin + vectorScale( ( 0, 0, 1 ), 40 ) ); - } - } + for (;;) + { + self waittill( "trigger", entity ); + + if ( isplayer( entity ) ) + { + entity playsound( "mpl_splash_death" ); + playfx( level._effect["water_splash"], entity.origin + vectorscale( ( 0, 0, 1 ), 40.0 ) ); + } + } } -leveloverridetime( defaulttime ) //checked matches cerberus output +leveloverridetime( defaulttime ) { - if ( self isinwater() ) - { - return 0.4; - } - return defaulttime; + if ( self isinwater() ) + return 0.4; + + return defaulttime; } -useintermissionpointsonwavespawn() //checked matches cerberus output +useintermissionpointsonwavespawn() { - return self isinwater(); + return self isinwater(); } -isinwater() //checked partially changed to match cerberus output see info.md +isinwater() { - triggers = getentarray( "trigger_hurt", "classname" ); - foreach ( trigger in triggers ) - { - if ( trigger.origin[ 2 ] > level.mapcenter[ 2 ] ) - { - } - else - { - if ( self istouching( trigger ) ) - { - return 1; - } - } - } - return 0; + triggers = getentarray( "trigger_hurt", "classname" ); + + foreach ( trigger in triggers ) + { + if ( trigger.origin[2] > level.mapcenter[2] ) + continue; + + if ( self istouching( trigger ) ) + return true; + } + + return false; } -rts_remove() //checked changed to match cerberus output +rts_remove() { - removes = getentarray( "rts_only", "targetname" ); - foreach ( remove in removes ) - { - if ( isDefined( remove ) ) - { - remove delete(); - } - } + removes = getentarray( "rts_only", "targetname" ); + + foreach ( remove in removes ) + { + if ( isdefined( remove ) ) + remove delete(); + } } -devgui_dockside() //checked changed to match cerberus output +devgui_dockside() { - /* /# - setdvar( "devgui_notify", "" ); - for ( ;; ) - { - wait 0.5; - devgui_string = getDvar( "devgui_notify" ); - switch( devgui_string ) - { - case "": - break; - case "crane_print_dvars": - crane_print_dvars(); - break; - default: - break; - } - if ( getDvar( "devgui_notify" ) != "" ) - { - setdvar( "devgui_notify", "" ); - } + setdvar( "devgui_notify", "" ); + + for (;;) + { + wait 0.5; + devgui_string = getdvar( "devgui_notify" ); + + switch ( devgui_string ) + { + case "": + break; + case "crane_print_dvars": + crane_print_dvars(); + break; + default: + break; + } + + if ( getdvar( "devgui_notify" ) != "" ) + setdvar( "devgui_notify", "" ); + } #/ - } - */ } -crane_print_dvars() //checked changed to match cerberus output +crane_print_dvars() { - /* /# - dvars = []; - dvars[ dvars.size ] = "scr_crane_claw_move_time"; - dvars[ dvars.size ] = "scr_crane_crate_lower_time"; - dvars[ dvars.size ] = "scr_crane_crate_raise_time"; - dvars[ dvars.size ] = "scr_crane_arm_y_move_time"; - dvars[ dvars.size ] = "scr_crane_arm_z_move_time"; - dvars[ dvars.size ] = "scr_crane_claw_drop_speed"; - dvars[ dvars.size ] = "scr_crane_claw_drop_time_min"; - foreach ( dvar in dvars ) - { - print( dvar + ": " ); - println( getDvar( dvar ) ); -#/ - } - */ -} + dvars = []; + dvars[dvars.size] = "scr_crane_claw_move_time"; + dvars[dvars.size] = "scr_crane_crate_lower_time"; + dvars[dvars.size] = "scr_crane_crate_raise_time"; + dvars[dvars.size] = "scr_crane_arm_y_move_time"; + dvars[dvars.size] = "scr_crane_arm_z_move_time"; + dvars[dvars.size] = "scr_crane_claw_drop_speed"; + dvars[dvars.size] = "scr_crane_claw_drop_time_min"; + foreach ( dvar in dvars ) + { + print( dvar + ": " ); + println( getdvar( dvar ) ); + } +#/ +} diff --git a/Multiplayer Core/patch_mp/maps/mp/mp_dockside_crane.gsc b/Multiplayer Core/patch_mp/maps/mp/mp_dockside_crane.gsc index 04581ae..25125e4 100644 --- a/Multiplayer Core/patch_mp/maps/mp/mp_dockside_crane.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/mp_dockside_crane.gsc @@ -1,712 +1,732 @@ -//checked includes match cerberus output -#include maps/mp/killstreaks/_supplydrop; -#include maps/mp/gametypes/_gameobjects; -#include maps/mp/gametypes/ctf; -#include maps/mp/gametypes/_weaponobjects; -#include maps/mp/killstreaks/_rcbomb; -#include maps/mp/_tacticalinsertion; -#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\_tacticalinsertion; +#include maps\mp\killstreaks\_rcbomb; +#include maps\mp\gametypes\_weaponobjects; +#include maps\mp\gametypes\ctf; +#include maps\mp\gametypes\_gameobjects; +#include maps\mp\killstreaks\_supplydrop; -init() //checked partially changed to match cerberus output see info.md +init() { - precachemodel( "p6_dockside_container_lrg_white" ); - crane_dvar_init(); - level.crate_models = []; - level.crate_models[ 0 ] = "p6_dockside_container_lrg_red"; - level.crate_models[ 1 ] = "p6_dockside_container_lrg_blue"; - level.crate_models[ 2 ] = "p6_dockside_container_lrg_white"; - level.crate_models[ 3 ] = "p6_dockside_container_lrg_orange"; - claw = getent( "claw_base", "targetname" ); - claw.z_upper = claw.origin[ 2 ]; - claw thread sound_wires_move(); - arms_y = getentarray( "claw_arm_y", "targetname" ); - arms_z = getentarray( "claw_arm_z", "targetname" ); - claw.arms = arraycombine( arms_y, arms_z, 1, 0 ); - foreach ( arm_z in arms_z ) - { - arm_y = getclosest( arm_z.origin, arms_y ); - arm_z.parent = arm_y; - } - foreach ( arm_y in arms_y ) - { - arm_y.parent = claw; - } - claw claw_link_arms( "claw_arm_y" ); - claw claw_link_arms( "claw_arm_z" ); - crates = getentarray( "crate", "targetname" ); - array_thread( crates, ::sound_pit_move ); - crate_data = []; - for ( i = 0; i < crates.size; i++ ) - { - crates[ i ] disconnectpaths(); - data = spawnstruct(); - data.origin = crates[ i ].origin; - data.angles = crates[ i ].angles; - crate_data[ i ] = data; - } - rail = getent( "crane_rail", "targetname" ); - rail thread sound_ring_move(); - rail.roller = getent( "crane_roller", "targetname" ); - rail.roller.wheel = getent( "crane_wheel", "targetname" ); - claw.wires = getentarray( "crane_wire", "targetname" ); - claw.z_wire_max = rail.roller.wheel.origin[ 2 ] - 50; - foreach ( wire in claw.wires ) - { - wire linkto( claw ); - if ( wire.origin[ 2 ] > claw.z_wire_max ) - { - wire ghost(); - } - } - placements = getentarray( "crate_placement", "targetname" ); - foreach ( placement in placements ) - { - placement.angles += vectorScale( ( 0, 1, 0 ), 90 ); - crates[ crates.size ] = spawn( "script_model", placement.origin ); - } - triggers = getentarray( "crate_kill_trigger", "targetname" ); - foreach ( crate in crates ) - { - crate.kill_trigger = getclosest( crate.origin, triggers ); - crate.kill_trigger.origin = crate.origin - vectorScale( ( 0, 0, 1 ), 5 ); - crate.kill_trigger enablelinkto(); - crate.kill_trigger linkto( crate ); - if ( crate.model != "" ) - { - crate.kill_trigger.active = 1; - } - else - { - crate.kill_trigger.active = 0; - } - } - trigger = getclosest( claw.origin, triggers ); - trigger enablelinkto(); - trigger linkto( claw ); - trigger.active = 1; - placements = array_randomize( placements ); - level thread crane_think( claw, rail, crates, crate_data, placements ); + precachemodel( "p6_dockside_container_lrg_white" ); + crane_dvar_init(); + level.crate_models = []; + level.crate_models[0] = "p6_dockside_container_lrg_red"; + level.crate_models[1] = "p6_dockside_container_lrg_blue"; + level.crate_models[2] = "p6_dockside_container_lrg_white"; + level.crate_models[3] = "p6_dockside_container_lrg_orange"; + claw = getent( "claw_base", "targetname" ); + claw.z_upper = claw.origin[2]; + claw thread sound_wires_move(); + arms_y = getentarray( "claw_arm_y", "targetname" ); + arms_z = getentarray( "claw_arm_z", "targetname" ); + claw.arms = arraycombine( arms_y, arms_z, 1, 0 ); + + foreach ( arm_z in arms_z ) + { + arm_y = getclosest( arm_z.origin, arms_y ); + arm_z.parent = arm_y; + } + + foreach ( arm_y in arms_y ) + arm_y.parent = claw; + + claw claw_link_arms( "claw_arm_y" ); + claw claw_link_arms( "claw_arm_z" ); + crates = getentarray( "crate", "targetname" ); + array_thread( crates, ::sound_pit_move ); + crate_data = []; + + for ( i = 0; i < crates.size; i++ ) + { + crates[i] disconnectpaths(); + data = spawnstruct(); + data.origin = crates[i].origin; + data.angles = crates[i].angles; + crate_data[i] = data; + } + + rail = getent( "crane_rail", "targetname" ); + rail thread sound_ring_move(); + rail.roller = getent( "crane_roller", "targetname" ); + rail.roller.wheel = getent( "crane_wheel", "targetname" ); + claw.wires = getentarray( "crane_wire", "targetname" ); + claw.z_wire_max = rail.roller.wheel.origin[2] - 50; + + foreach ( wire in claw.wires ) + { + wire linkto( claw ); + + if ( wire.origin[2] > claw.z_wire_max ) + wire ghost(); + } + + placements = getentarray( "crate_placement", "targetname" ); + + foreach ( placement in placements ) + { + placement.angles += vectorscale( ( 0, 1, 0 ), 90.0 ); + crates[crates.size] = spawn( "script_model", placement.origin ); + } + + triggers = getentarray( "crate_kill_trigger", "targetname" ); + + foreach ( crate in crates ) + { + crate.kill_trigger = getclosest( crate.origin, triggers ); + crate.kill_trigger.origin = crate.origin - vectorscale( ( 0, 0, 1 ), 5.0 ); + crate.kill_trigger enablelinkto(); + crate.kill_trigger linkto( crate ); + + if ( crate.model != "" ) + { + crate.kill_trigger.active = 1; + continue; + } + + crate.kill_trigger.active = 0; + } + + trigger = getclosest( claw.origin, triggers ); + trigger enablelinkto(); + trigger linkto( claw ); + trigger.active = 1; + placements = array_randomize( placements ); + level thread crane_think( claw, rail, crates, crate_data, placements ); } -crane_dvar_init() //checked matches cerberus output +crane_dvar_init() { - set_dvar_float_if_unset( "scr_crane_claw_move_time", "5" ); - set_dvar_float_if_unset( "scr_crane_crate_lower_time", "5" ); - set_dvar_float_if_unset( "scr_crane_crate_raise_time", "5" ); - set_dvar_float_if_unset( "scr_crane_arm_y_move_time", "3" ); - set_dvar_float_if_unset( "scr_crane_arm_z_move_time", "3" ); - set_dvar_float_if_unset( "scr_crane_claw_drop_speed", "25" ); - set_dvar_float_if_unset( "scr_crane_claw_drop_time_min", "5" ); + set_dvar_float_if_unset( "scr_crane_claw_move_time", "5" ); + set_dvar_float_if_unset( "scr_crane_crate_lower_time", "5" ); + set_dvar_float_if_unset( "scr_crane_crate_raise_time", "5" ); + set_dvar_float_if_unset( "scr_crane_arm_y_move_time", "3" ); + set_dvar_float_if_unset( "scr_crane_arm_z_move_time", "3" ); + set_dvar_float_if_unset( "scr_crane_claw_drop_speed", "25" ); + set_dvar_float_if_unset( "scr_crane_claw_drop_time_min", "5" ); } -wire_render() //checked partially changed to match cerberus output see info.md +wire_render() { - self endon( "movedone" ); - for ( ;; ) - { - wait 0.05; - foreach ( wire in self.wires ) - { - if ( wire.origin[ 2 ] > self.z_wire_max ) - { - wire ghost(); - } - else - { - wire show(); - } - } - } + self endon( "movedone" ); + + for (;;) + { + wait 0.05; + + foreach ( wire in self.wires ) + { + if ( wire.origin[2] > self.z_wire_max ) + { + wire ghost(); + continue; + } + + wire show(); + } + } } -crane_think( claw, rail, crates, crate_data, placements ) //checked changed to match beta dump +crane_think( claw, rail, crates, crate_data, placements ) { - wait 1; - claw arms_open(); - for ( ;; ) - { - for ( i = 0; i < crates.size - placements.size; i++ ) - { - crate = getclosest( crate_data[ i ].origin, crates ); - rail crane_move( claw, crate_data[ i ], -318 ); - level notify( "wires_move" ); - claw claw_crate_grab( crate, 318 ); - lower = 1; - target = ( i + 1 ) % ( crates.size - placements.size ); - target_crate = getclosest( crate_data[ target ].origin, crates ); - if ( cointoss() ) - { - for ( placement_index = 0; placement_index < placements.size; placement_index++ ) - { - placement = placements[ placement_index ]; - if ( !isDefined( placement.crate ) ) - { - lower = 0; - break; - } - } - } - if ( !lower ) - { - z_dist = crate.origin[ 2 ] - placement.origin[ 2 ] - 33; - rail crane_move( claw, placement, z_dist * -1 ); - level notify( "wires_move" ); - placement.crate = crate; - } - else - { - rail crane_move( claw, crate_data[ target ], -181 ); - level notify( "wires_move" ); - } - claw claw_crate_move( crate ); - if ( lower ) - { - crate crate_lower( target_crate, crate_data[ target ] ); - } - crate = target_crate; - target = ( i + 2 ) % ( crates.size - placements.size ); - target_crate = getclosest( crate_data[ target ].origin, crates ); - if ( !lower ) - { - crate = crates[ 3 + placement_index ]; - crate.origin = target_crate.origin - vectorScale( ( 0, 0, 1 ), 137 ); - crate.angles = target_crate.angles; - wait 0.25; - claw waittill( "movedone" ); - } - crate crate_raise( target_crate, crate_data[ target ] ); - rail crane_move( claw, crate_data[ target ], -181 ); - level notify( "wires_move" ); - claw claw_crate_grab( target_crate, 181 ); - crate = target_crate; - target = ( i + 3 ) % ( crates.size - placements.size ); - rail crane_move( claw, crate_data[ target ], -318 ); - level notify( "wires_move" ); - claw claw_crate_drop( crate, crate_data[ target ] ); - } - } + wait 1; + claw arms_open(); + + for (;;) + { + for ( i = 0; i < crates.size - placements.size; i++ ) + { + crate = getclosest( crate_data[i].origin, crates ); + rail crane_move( claw, crate_data[i], -318 ); + level notify( "wires_move" ); + claw claw_crate_grab( crate, 318 ); + lower = 1; + target = ( i + 1 ) % ( crates.size - placements.size ); + target_crate = getclosest( crate_data[target].origin, crates ); + + if ( cointoss() ) + { + for ( placement_index = 0; placement_index < placements.size; placement_index++ ) + { + placement = placements[placement_index]; + + if ( !isdefined( placement.crate ) ) + { + lower = 0; + break; + } + } + } + + if ( !lower ) + { + z_dist = crate.origin[2] - placement.origin[2] - 33; + rail crane_move( claw, placement, z_dist * -1 ); + level notify( "wires_move" ); + placement.crate = crate; + } + else + { + rail crane_move( claw, crate_data[target], -181 ); + level notify( "wires_move" ); + } + + claw claw_crate_move( crate ); + + if ( lower ) + crate crate_lower( target_crate, crate_data[target] ); + + crate = target_crate; + target = ( i + 2 ) % ( crates.size - placements.size ); + target_crate = getclosest( crate_data[target].origin, crates ); + + if ( !lower ) + { + crate = crates[3 + placement_index]; + crate.origin = target_crate.origin - vectorscale( ( 0, 0, 1 ), 137.0 ); + crate.angles = target_crate.angles; + wait 0.25; + + claw waittill( "movedone" ); + } + + crate crate_raise( target_crate, crate_data[target] ); + rail crane_move( claw, crate_data[target], -181 ); + level notify( "wires_move" ); + claw claw_crate_grab( target_crate, 181 ); + crate = target_crate; + target = ( i + 3 ) % ( crates.size - placements.size ); + rail crane_move( claw, crate_data[target], -318 ); + level notify( "wires_move" ); + claw claw_crate_drop( crate, crate_data[target] ); + } + } } -crane_move( claw, desired, z_dist ) //checked changed to match cerberus output dvars taken from beta dump +crane_move( claw, desired, z_dist ) { - self.roller linkto( self ); - self.roller.wheel linkto( self.roller ); - claw linkto( self.roller.wheel ); - goal = ( desired.origin[ 0 ], desired.origin[ 1 ], self.origin[ 2 ] ); - dir = vectornormalize( goal - self.origin ); - angles = vectorToAngle( dir ); - angles = ( self.angles[ 0 ], angles[ 1 ] + 90, self.angles[ 2 ] ); - yawdiff = absangleclamp360( self.angles[ 1 ] - angles[ 1 ] ); - time = yawdiff / 25; - self rotateto( angles, time, time * 0.35, time * 0.45 ); - self thread physics_move(); - level notify( "wires_stop" ); - level notify( "ring_move" ); - self waittill( "rotatedone" ); - self.roller unlink(); - goal = ( desired.origin[ 0 ], desired.origin[ 1 ], self.roller.origin[ 2 ] ); - diff = distance2d( goal, self.roller.origin ); - speed = getDvarFloat( "scr_crane_claw_drop_speed" ); - time = diff / speed; - if ( time < getDvarFloat( "scr_crane_claw_drop_time_min" ) ) - { - time = getDvarFloat( "scr_crane_claw_drop_time_min" ); - } - self.roller moveto( goal, time, time * 0.25, time * 0.25 ); - self.roller thread physics_move(); - goal = ( desired.origin[ 0 ], desired.origin[ 1 ], self.roller.wheel.origin[ 2 ] ); - self.roller.wheel unlink(); - self.roller.wheel moveto( goal, time, time * 0.25, time * 0.25 ); - self.roller.wheel rotateto( desired.angles + vectorScale( ( 0, 1, 0 ), 90 ), time, time * 0.25, time * 0.25 ); - claw.z_initial = claw.origin[ 2 ]; - claw unlink(); - claw rotateto( desired.angles, time, time * 0.25, time * 0.25 ); - claw.goal = ( goal[ 0 ], goal[ 1 ], claw.origin[ 2 ] + z_dist ); - claw.time = time; - claw moveto( claw.goal, time, time * 0.25, time * 0.25 ); - level notify( "ring_stop" ); + self.roller linkto( self ); + self.roller.wheel linkto( self.roller ); + claw linkto( self.roller.wheel ); + goal = ( desired.origin[0], desired.origin[1], self.origin[2] ); + dir = vectornormalize( goal - self.origin ); + angles = vectortoangles( dir ); + angles = ( self.angles[0], angles[1] + 90, self.angles[2] ); + yawdiff = absangleclamp360( self.angles[1] - angles[1] ); + time = yawdiff / 25; + self rotateto( angles, time, time * 0.35, time * 0.45 ); + self thread physics_move(); + level notify( "wires_stop" ); + level notify( "ring_move" ); + + self waittill( "rotatedone" ); + + self.roller unlink(); + goal = ( desired.origin[0], desired.origin[1], self.roller.origin[2] ); + diff = distance2d( goal, self.roller.origin ); + speed = getdvarfloat( "scr_crane_claw_drop_speed" ); + time = diff / speed; + + if ( time < getdvarfloat( "scr_crane_claw_drop_time_min" ) ) + time = getdvarfloat( "scr_crane_claw_drop_time_min" ); + + self.roller moveto( goal, time, time * 0.25, time * 0.25 ); + self.roller thread physics_move(); + goal = ( desired.origin[0], desired.origin[1], self.roller.wheel.origin[2] ); + self.roller.wheel unlink(); + self.roller.wheel moveto( goal, time, time * 0.25, time * 0.25 ); + self.roller.wheel rotateto( desired.angles + vectorscale( ( 0, 1, 0 ), 90.0 ), time, time * 0.25, time * 0.25 ); + claw.z_initial = claw.origin[2]; + claw unlink(); + claw rotateto( desired.angles, time, time * 0.25, time * 0.25 ); + claw.goal = ( goal[0], goal[1], claw.origin[2] + z_dist ); + claw.time = time; + claw moveto( claw.goal, time, time * 0.25, time * 0.25 ); + level notify( "ring_stop" ); } -physics_move() //checked changed to match cerberus output +physics_move() { - self endon( "rotatedone" ); - self endon( "movedone" ); - for ( ;; ) - { - wait 0.05; - crates = getentarray( "care_package", "script_noteworthy" ); - foreach ( crate in crates ) - { - if ( crate istouching( self ) ) - { - crate physicslaunch( crate.origin, ( 0, 0, 0 ) ); - } - } - } + self endon( "rotatedone" ); + self endon( "movedone" ); + + for (;;) + { + wait 0.05; + crates = getentarray( "care_package", "script_noteworthy" ); + + foreach ( crate in crates ) + { + if ( crate istouching( self ) ) + crate physicslaunch( crate.origin, ( 0, 0, 0 ) ); + } + } } -claw_crate_grab( crate, z_dist ) //checked matches cerberus output dvars taken from beta dump +claw_crate_grab( crate, z_dist ) { - self thread wire_render(); - self waittill( "movedone" ); - level notify( "wires_stop" ); - self playsound( "amb_crane_arms_b" ); - self claw_z_arms( -33 ); - self playsound( "amb_crane_arms" ); - self arms_close( crate ); - crate movez( 33, getDvarFloat( "scr_crane_arm_z_move_time" ) ); - self claw_z_arms( 33 ); - crate linkto( self ); - self movez( z_dist, getDvarFloat( "scr_crane_claw_move_time" ) ); - self thread wire_render(); - level notify( "wires_move" ); - self waittill( "movedone" ); - self playsound( "amb_crane_arms" ); + self thread wire_render(); + + self waittill( "movedone" ); + + level notify( "wires_stop" ); + self playsound( "amb_crane_arms_b" ); + self claw_z_arms( -33 ); + self playsound( "amb_crane_arms" ); + self arms_close( crate ); + crate movez( 33, getdvarfloat( "scr_crane_arm_z_move_time" ) ); + self claw_z_arms( 33 ); + crate linkto( self ); + self movez( z_dist, getdvarfloat( "scr_crane_claw_move_time" ) ); + self thread wire_render(); + level notify( "wires_move" ); + + self waittill( "movedone" ); + + self playsound( "amb_crane_arms" ); } -sound_wires_move() //checked matches cerberus output +sound_wires_move() { - while ( 1 ) - { - level waittill( "wires_move" ); - self playsound( "amb_crane_wire_start" ); - self playloopsound( "amb_crane_wire_lp" ); - level waittill( "wires_stop" ); - self playsound( "amb_crane_wire_end" ); - wait 0.1; - self stoploopsound( 0.2 ); - } + while ( true ) + { + level waittill( "wires_move" ); + + self playsound( "amb_crane_wire_start" ); + self playloopsound( "amb_crane_wire_lp" ); + + level waittill( "wires_stop" ); + + self playsound( "amb_crane_wire_end" ); + wait 0.1; + self stoploopsound( 0.2 ); + } } -sound_ring_move() //checked matches cerberus output +sound_ring_move() { - while ( 1 ) - { - level waittill( "ring_move" ); - self playsound( "amb_crane_ring_start" ); - self playloopsound( "amb_crane_ring_lp" ); - level waittill( "ring_stop" ); - self playsound( "amb_crane_ring_end" ); - wait 0.1; - self stoploopsound( 0.2 ); - } + while ( true ) + { + level waittill( "ring_move" ); + + self playsound( "amb_crane_ring_start" ); + self playloopsound( "amb_crane_ring_lp" ); + + level waittill( "ring_stop" ); + + self playsound( "amb_crane_ring_end" ); + wait 0.1; + self stoploopsound( 0.2 ); + } } -sound_pit_move() //checked matches cerberus output +sound_pit_move() { - while ( 1 ) - { - level waittill( "pit_move" ); - self playsound( "amb_crane_pit_start" ); - self playloopsound( "amb_crane_pit_lp" ); - level waittill( "pit_stop" ); - self playsound( "amb_crane_pit_end" ); - self stoploopsound( 0.2 ); - wait 0.2; - } + while ( true ) + { + level waittill( "pit_move" ); + + self playsound( "amb_crane_pit_start" ); + self playloopsound( "amb_crane_pit_lp" ); + + level waittill( "pit_stop" ); + + self playsound( "amb_crane_pit_end" ); + self stoploopsound( 0.2 ); + wait 0.2; + } } -claw_crate_move( crate, claw ) //checked matches cerberus output dvars taken from beta dump +claw_crate_move( crate, claw ) { - self thread wire_render(); - self waittill( "movedone" ); - crate unlink(); - self playsound( "amb_crane_arms_b" ); - level notify( "wires_stop" ); - crate movez( -33, getDvarFloat( "scr_crane_arm_z_move_time" ) ); - self claw_z_arms( -33 ); - self playsound( "amb_crane_arms_b" ); - playfxontag( level._effect[ "crane_dust" ], crate, "tag_origin" ); - crate playsound( "amb_crate_drop" ); - self arms_open(); - level notify( "wires_move" ); - self claw_z_arms( 33 ); - z_dist = self.z_initial - self.origin[ 2 ]; - self movez( z_dist, getDvarFloat( "scr_crane_claw_move_time" ) ); - self thread wire_render(); + self thread wire_render(); + + self waittill( "movedone" ); + + crate unlink(); + self playsound( "amb_crane_arms_b" ); + level notify( "wires_stop" ); + crate movez( -33, getdvarfloat( "scr_crane_arm_z_move_time" ) ); + self claw_z_arms( -33 ); + self playsound( "amb_crane_arms_b" ); + playfxontag( level._effect["crane_dust"], crate, "tag_origin" ); + crate playsound( "amb_crate_drop" ); + self arms_open(); + level notify( "wires_move" ); + self claw_z_arms( 33 ); + z_dist = self.z_initial - self.origin[2]; + self movez( z_dist, getdvarfloat( "scr_crane_claw_move_time" ) ); + self thread wire_render(); } -claw_crate_drop( target, data ) //checked matches cerberus output dvars taken from beta dump +claw_crate_drop( target, data ) { - target thread crate_drop_think( self ); - self thread wire_render(); - self waittill( "claw_movedone" ); - target unlink(); - level notify( "wires_stop" ); - self playsound( "amb_crane_arms_b" ); - target movez( -33, getDvarFloat( "scr_crane_arm_z_move_time" ) ); - self claw_z_arms( -33 ); - playfxontag( level._effect[ "crane_dust" ], target, "tag_origin" ); - self playsound( "amb_crate_drop" ); - target notify( "claw_done" ); - self playsound( "amb_crane_arms" ); - self arms_open(); - level notify( "wires_move" ); - target.origin = data.origin; - self claw_z_arms( 33 ); - self playsound( "amb_crane_arms" ); - self movez( 318, getDvarFloat( "scr_crane_claw_move_time" ) ); - self thread wire_render(); - self waittill( "movedone" ); + target thread crate_drop_think( self ); + self thread wire_render(); + + self waittill( "claw_movedone" ); + + target unlink(); + level notify( "wires_stop" ); + self playsound( "amb_crane_arms_b" ); + target movez( -33, getdvarfloat( "scr_crane_arm_z_move_time" ) ); + self claw_z_arms( -33 ); + playfxontag( level._effect["crane_dust"], target, "tag_origin" ); + self playsound( "amb_crate_drop" ); + target notify( "claw_done" ); + self playsound( "amb_crane_arms" ); + self arms_open(); + level notify( "wires_move" ); + target.origin = data.origin; + self claw_z_arms( 33 ); + self playsound( "amb_crane_arms" ); + self movez( 318, getdvarfloat( "scr_crane_claw_move_time" ) ); + self thread wire_render(); + + self waittill( "movedone" ); } -crate_lower( lower, data ) //checked matches cerberus output +crate_lower( lower, data ) { - z_dist = abs( self.origin[ 2 ] - lower.origin[ 2 ] ); - self movez( z_dist * -1, getDvarFloat( "scr_crane_crate_lower_time" ) ); - lower movez( z_dist * -1, getDvarFloat( "scr_crane_crate_lower_time" ) ); - level notify( "pit_move" ); - lower waittill( "movedone" ); - level notify( "pit_stop" ); - lower ghost(); - self.origin = data.origin; - wait 0.25; + z_dist = abs( self.origin[2] - lower.origin[2] ); + self movez( z_dist * -1, getdvarfloat( "scr_crane_crate_lower_time" ) ); + lower movez( z_dist * -1, getdvarfloat( "scr_crane_crate_lower_time" ) ); + level notify( "pit_move" ); + + lower waittill( "movedone" ); + + level notify( "pit_stop" ); + lower ghost(); + self.origin = data.origin; + wait 0.25; } -crate_raise( upper, data ) //checked matches cerberus output dvars taken from beta dump +crate_raise( upper, data ) { - self crate_set_random_model( upper ); - self.kill_trigger.active = 1; - self.origin = ( data.origin[ 0 ], data.origin[ 1 ], self.origin[ 2 ] ); - self.angles = data.angles; - wait 0.2; - self show(); - z_dist = abs( upper.origin[ 2 ] - self.origin[ 2 ] ); - self movez( z_dist, getDvarFloat( "scr_crane_crate_raise_time" ) ); - upper movez( z_dist, getDvarFloat( "scr_crane_crate_raise_time" ) ); - level notify( "wires_stop" ); - level notify( "pit_move" ); - upper thread raise_think(); + self crate_set_random_model( upper ); + self.kill_trigger.active = 1; + self.origin = ( data.origin[0], data.origin[1], self.origin[2] ); + self.angles = data.angles; + wait 0.2; + self show(); + z_dist = abs( upper.origin[2] - self.origin[2] ); + self movez( z_dist, getdvarfloat( "scr_crane_crate_raise_time" ) ); + upper movez( z_dist, getdvarfloat( "scr_crane_crate_raise_time" ) ); + level notify( "wires_stop" ); + level notify( "pit_move" ); + upper thread raise_think(); } -raise_think() //checked matches cerberus output +raise_think() { - self waittill( "movedone" ); - level notify( "pit_stop" ); + self waittill( "movedone" ); + + level notify( "pit_stop" ); } -crate_set_random_model( other ) //checked partially changed to match cerberus output see info.md +crate_set_random_model( other ) { - models = array_randomize( level.crate_models ); - foreach ( model in models ) - { - if ( model == other.model ) - { - } - else - { - self setmodel( model ); - return; - } - } + models = array_randomize( level.crate_models ); + + foreach ( model in models ) + { + if ( model == other.model ) + continue; + + self setmodel( model ); + return; + } } -arms_open() //checked matches cerberus output +arms_open() { - self claw_move_arms( -15 ); - self playsound( "amb_crane_arms" ); + self claw_move_arms( -15 ); + self playsound( "amb_crane_arms" ); } -arms_close( crate ) //checked matches cerberus output +arms_close( crate ) { - self claw_move_arms( 15, crate ); - self playsound( "amb_crane_arms" ); + self claw_move_arms( 15, crate ); + self playsound( "amb_crane_arms" ); } -claw_link_arms( name ) //checked changed to match cerberus output +claw_link_arms( name ) { - foreach ( arm in self.arms ) - { - if ( arm.targetname == name ) - { - arm linkto( arm.parent ); - } - } + foreach ( arm in self.arms ) + { + if ( arm.targetname == name ) + arm linkto( arm.parent ); + } } -claw_unlink_arms( name ) //checked changed to match cerberus output +claw_unlink_arms( name ) { - foreach ( arm in self.arms ) - { - if ( arm.targetname == name ) - { - arm unlink(); - } - } + foreach ( arm in self.arms ) + { + if ( arm.targetname == name ) + arm unlink(); + } } -claw_move_arms( dist, crate ) //checked changed to match cerberus output dvars taken from beta dump +claw_move_arms( dist, crate ) { - claw_unlink_arms( "claw_arm_y" ); - arms = []; - foreach ( arm in self.arms ) - { - forward = anglesToForward( arm.angles ); - arm.goal = arm.origin + vectorScale( forward, dist ); - if ( arm.targetname == "claw_arm_y" ) - { - arms[ arms.size ] = arm; - arm moveto( arm.goal, getDvarFloat( "scr_crane_arm_y_move_time" ) ); - } - } - if ( dist > 0 ) - { - wait( getDvarFloat( "scr_crane_arm_y_move_time" ) / 2 ); - foreach ( arm in self.arms ) - { - if ( arm.targetname == "claw_arm_y" ) - { - arm moveto( arm.goal, 0.1 ); - self playsound( "amb_crane_arms_b" ); - } - } - wait 0.05; - playfxontag( level._effect[ "crane_spark" ], crate, "tag_origin" ); - self playsound( "amb_arms_latch" ); - } - /* + claw_unlink_arms( "claw_arm_y" ); + arms = []; + + foreach ( arm in self.arms ) + { + forward = anglestoforward( arm.angles ); + arm.goal = arm.origin + vectorscale( forward, dist ); + + if ( arm.targetname == "claw_arm_y" ) + { + arms[arms.size] = arm; + arm moveto( arm.goal, getdvarfloat( "scr_crane_arm_y_move_time" ) ); + } + } + + if ( dist > 0 ) + { + wait( getdvarfloat( "scr_crane_arm_y_move_time" ) / 2 ); + + foreach ( arm in self.arms ) + { + if ( arm.targetname == "claw_arm_y" ) + { + arm moveto( arm.goal, 0.1 ); + self playsound( "amb_crane_arms_b" ); + } + } + + wait 0.05; + playfxontag( level._effect["crane_spark"], crate, "tag_origin" ); + self playsound( "amb_arms_latch" ); + } /# - assert( arms.size == 4 ); + assert( arms.size == 4 ); #/ - */ - waittill_multiple_ents( arms[ 0 ], "movedone", arms[ 1 ], "movedone", arms[ 2 ], "movedone", arms[ 3 ], "movedone" ); - foreach ( arm in self.arms ) - { - arm.origin = arm.goal; - } - self claw_link_arms( "claw_arm_y" ); + waittill_multiple_ents( arms[0], "movedone", arms[1], "movedone", arms[2], "movedone", arms[3], "movedone" ); + + foreach ( arm in self.arms ) + arm.origin = arm.goal; + + self claw_link_arms( "claw_arm_y" ); } -claw_z_arms( z ) //checked changed to match cerberus output dvars taken from beta dump +claw_z_arms( z ) { - claw_unlink_arms( "claw_arm_z" ); - arms = []; - foreach ( arm in self.arms ) - { - if ( arm.targetname == "claw_arm_z" ) - { - arms[ arms.size ] = arm; - arm movez( z, getDvarFloat( "scr_crane_arm_z_move_time" ) ); - } - } - /* + claw_unlink_arms( "claw_arm_z" ); + arms = []; + + foreach ( arm in self.arms ) + { + if ( arm.targetname == "claw_arm_z" ) + { + arms[arms.size] = arm; + arm movez( z, getdvarfloat( "scr_crane_arm_z_move_time" ) ); + } + } /# - assert( arms.size == 4 ); + assert( arms.size == 4 ); #/ - */ - waittill_multiple_ents( arms[ 0 ], "movedone", arms[ 1 ], "movedone", arms[ 2 ], "movedone", arms[ 3 ], "movedone" ); - self claw_link_arms( "claw_arm_z" ); + waittill_multiple_ents( arms[0], "movedone", arms[1], "movedone", arms[2], "movedone", arms[3], "movedone" ); + self claw_link_arms( "claw_arm_z" ); } -crate_drop_think( claw ) //checked changed at own discretion see info.md +crate_drop_think( claw ) { - self endon( "claw_done" ); - self.disablefinalkillcam = 1; - claw thread claw_drop_think(); - corpse_delay = 0; - for ( ;; ) - { - wait 0.2; - entities = getdamageableentarray( self.origin, 200 ); - i = 0; - while ( i < entities.size ) - { - if ( !entities[ i ] istouching( self.kill_trigger ) ) - { - i++; - continue; - } - if ( isDefined( entities[ i ].model ) && entities[ i ].model == "t6_wpn_tac_insert_world" ) - { - entities[ i ] maps/mp/_tacticalinsertion::destroy_tactical_insertion(); - i++; - continue; - } - if ( !isalive( entities[ i ] ) ) - { - i++; - continue; - } - if ( isDefined( entities[ i ].targetname ) ) - { - if ( entities[ i ].targetname == "talon" ) - { - entities[ i ] notify( "death" ); - i++; - continue; - } - if ( entities[ i ].targetname == "rcbomb" ) - { - entities[ i ] maps/mp/killstreaks/_rcbomb::rcbomb_force_explode(); - i++; - continue; - } - if ( entities[ i ].targetname == "riotshield_mp" ) - { - entities[ i ] dodamage( 1, self.origin + ( 0, 0, 1 ), self, self, 0, "MOD_CRUSH" ); - i++; - continue; - } - } - if ( isDefined( entities[ i ].helitype ) && entities[ i ].helitype == "qrdrone" ) - { - watcher = entities[ i ].owner maps/mp/gametypes/_weaponobjects::getweaponobjectwatcher( "qrdrone" ); - watcher thread maps/mp/gametypes/_weaponobjects::waitanddetonate( entities[ i ], 0, undefined ); - i++; - continue; - } - if ( entities[ i ].classname == "grenade" ) - { - if ( !isDefined( entities[ i ].name ) ) - { - i++; - continue; - } - if ( !isDefined( entities[ i ].owner ) ) - { - i++; - continue; - } - if ( entities[ i ].name == "proximity_grenade_mp" ) - { - watcher = entities[ i ].owner getwatcherforweapon( entities[ i ].name ); - watcher thread maps/mp/gametypes/_weaponobjects::waitanddetonate( entities[ i ], 0, undefined, "script_mover_mp" ); - i++; - continue; - } - if ( !isweaponequipment( entities[ i ].name ) ) - { - i++; - continue; - } - watcher = entities[ i ].owner getwatcherforweapon( entities[ i ].name ); - if ( !isDefined( watcher ) ) - { - i++; - continue; - } - watcher thread maps/mp/gametypes/_weaponobjects::waitanddetonate( entities[ i ], 0, undefined, "script_mover_mp" ); - i++; - continue; - } - if ( entities[ i ].classname == "auto_turret" ) - { - if ( !isDefined( entities[ i ].damagedtodeath ) || !entities[ i ].damagedtodeath ) - { - entities[ i ] domaxdamage( self.origin + ( 0, 0, 1 ), self, self, 0, "MOD_CRUSH" ); - } - i++; - continue; - } - entities[ i ] dodamage( entities[ i ].health * 2, self.origin + ( 0, 0, 1 ), self, self, 0, "MOD_CRUSH" ); - if ( isplayer( entities[ i ] ) ) - { - claw thread claw_drop_pause(); - corpse_delay = getTime() + 3000; - } - i++; - } - self destroy_supply_crates(); - if ( getTime() > corpse_delay ) - { - self destroy_corpses(); - } - if ( level.gametype == "ctf" ) - { - foreach ( flag in level.flags ) - { - if ( flag.visuals[ 0 ] istouching( self.kill_trigger ) ) - { - flag maps/mp/gametypes/ctf::returnflag(); - } - } - } - else if ( level.gametype == "sd" && !level.multibomb ) - { - if ( level.sdbomb.visuals[ 0 ] istouching( self.kill_trigger ) ) - { - level.sdbomb maps/mp/gametypes/_gameobjects::returnhome(); - } - } - } + self endon( "claw_done" ); + self.disablefinalkillcam = 1; + claw thread claw_drop_think(); + corpse_delay = 0; + + for (;;) + { + wait 0.2; + entities = getdamageableentarray( self.origin, 200 ); + + foreach ( entity in entities ) + { + if ( !entity istouching( self.kill_trigger ) ) + continue; + + if ( isdefined( entity.model ) && entity.model == "t6_wpn_tac_insert_world" ) + { + entity maps\mp\_tacticalinsertion::destroy_tactical_insertion(); + continue; + } + + if ( !isalive( entity ) ) + continue; + + if ( isdefined( entity.targetname ) ) + { + if ( entity.targetname == "talon" ) + { + entity notify( "death" ); + continue; + } + else if ( entity.targetname == "rcbomb" ) + { + entity maps\mp\killstreaks\_rcbomb::rcbomb_force_explode(); + continue; + } + else if ( entity.targetname == "riotshield_mp" ) + { + entity dodamage( 1, self.origin + ( 0, 0, 1 ), self, self, 0, "MOD_CRUSH" ); + continue; + } + } + + if ( isdefined( entity.helitype ) && entity.helitype == "qrdrone" ) + { + watcher = entity.owner maps\mp\gametypes\_weaponobjects::getweaponobjectwatcher( "qrdrone" ); + watcher thread maps\mp\gametypes\_weaponobjects::waitanddetonate( entity, 0.0, undefined ); + continue; + } + + if ( entity.classname == "grenade" ) + { + if ( !isdefined( entity.name ) ) + continue; + + if ( !isdefined( entity.owner ) ) + continue; + + if ( entity.name == "proximity_grenade_mp" ) + { + watcher = entity.owner getwatcherforweapon( entity.name ); + watcher thread maps\mp\gametypes\_weaponobjects::waitanddetonate( entity, 0.0, undefined, "script_mover_mp" ); + continue; + } + + if ( !isweaponequipment( entity.name ) ) + continue; + + watcher = entity.owner getwatcherforweapon( entity.name ); + + if ( !isdefined( watcher ) ) + continue; + + watcher thread maps\mp\gametypes\_weaponobjects::waitanddetonate( entity, 0.0, undefined, "script_mover_mp" ); + continue; + } + + if ( entity.classname == "auto_turret" ) + { + if ( !isdefined( entity.damagedtodeath ) || !entity.damagedtodeath ) + entity domaxdamage( self.origin + ( 0, 0, 1 ), self, self, 0, "MOD_CRUSH" ); + + continue; + } + + entity dodamage( entity.health * 2, self.origin + ( 0, 0, 1 ), self, self, 0, "MOD_CRUSH" ); + + if ( isplayer( entity ) ) + { + claw thread claw_drop_pause(); + corpse_delay = gettime() + 3000; + } + } + + self destroy_supply_crates(); + + if ( gettime() > corpse_delay ) + self destroy_corpses(); + + if ( level.gametype == "ctf" ) + { + foreach ( flag in level.flags ) + { + if ( flag.visuals[0] istouching( self.kill_trigger ) ) + flag maps\mp\gametypes\ctf::returnflag(); + } + + continue; + } + + if ( level.gametype == "sd" && !level.multibomb ) + { + if ( level.sdbomb.visuals[0] istouching( self.kill_trigger ) ) + level.sdbomb maps\mp\gametypes\_gameobjects::returnhome(); + } + } } -claw_drop_think() //checked matches cerberus output +claw_drop_think() { - self endon( "claw_pause" ); - self waittill( "movedone" ); - self notify( "claw_movedone" ); + self endon( "claw_pause" ); + + self waittill( "movedone" ); + + self notify( "claw_movedone" ); } -claw_drop_pause() //checked matches cerberus output +claw_drop_pause() { - self notify( "claw_pause" ); - self endon( "claw_pause" ); - z_diff = abs( self.goal[ 2 ] - self.origin[ 2 ] ); - frac = z_diff / 318; - time = self.time * frac; - if ( time <= 0 ) - { - return; - } - self moveto( self.origin, 0.01 ); - wait 3; - self thread claw_drop_think(); - self moveto( self.goal, time ); + self notify( "claw_pause" ); + self endon( "claw_pause" ); + z_diff = abs( self.goal[2] - self.origin[2] ); + frac = z_diff / 318; + time = self.time * frac; + + if ( time <= 0 ) + return; + + self moveto( self.origin, 0.01 ); + wait 3; + self thread claw_drop_think(); + self moveto( self.goal, time ); } -destroy_supply_crates() //checked changed to match cerberus output +destroy_supply_crates() { - crates = getentarray( "care_package", "script_noteworthy" ); - foreach ( crate in crates ) - { - if ( distancesquared( crate.origin, self.origin ) < 40000 ) - { - if ( crate istouching( self ) ) - { - playfx( level._supply_drop_explosion_fx, crate.origin ); - playsoundatposition( "wpn_grenade_explode", crate.origin ); - wait 0.1; - crate maps/mp/killstreaks/_supplydrop::cratedelete(); - } - } - } + crates = getentarray( "care_package", "script_noteworthy" ); + + foreach ( crate in crates ) + { + if ( distancesquared( crate.origin, self.origin ) < 40000 ) + { + if ( crate istouching( self ) ) + { + playfx( level._supply_drop_explosion_fx, crate.origin ); + playsoundatposition( "wpn_grenade_explode", crate.origin ); + wait 0.1; + crate maps\mp\killstreaks\_supplydrop::cratedelete(); + } + } + } } -destroy_corpses() //checked changed to match cerberus output +destroy_corpses() { - corpses = getcorpsearray(); - for ( i = 0; i < corpses.size; i++ ) - { - if ( distancesquared( corpses[ i ].origin, self.origin ) < 40000 ) - { - corpses[ i ] delete(); - } - } + corpses = getcorpsearray(); + + for ( i = 0; i < corpses.size; i++ ) + { + if ( distancesquared( corpses[i].origin, self.origin ) < 40000 ) + corpses[i] delete(); + } } -getwatcherforweapon( weapname ) //checked partially changed to match cerberus output see info.md +getwatcherforweapon( weapname ) { - if ( !isDefined( self ) ) - { - return undefined; - } - if ( !isplayer( self ) ) - { - return undefined; - } - i = 0; - while ( i < self.weaponobjectwatcherarray.size ) - { - if ( self.weaponobjectwatcherarray[ i ].weapon != weapname ) - { - i++; - continue; - } - return self.weaponobjectwatcherarray[ i ]; - i++; - } - return undefined; -} + if ( !isdefined( self ) ) + return undefined; + if ( !isplayer( self ) ) + return undefined; + + for ( i = 0; i < self.weaponobjectwatcherarray.size; i++ ) + { + if ( self.weaponobjectwatcherarray[i].weapon != weapname ) + continue; + + return self.weaponobjectwatcherarray[i]; + } + + return undefined; +} diff --git a/Multiplayer Core/patch_mp/maps/mp/mp_downhill.gsc b/Multiplayer Core/patch_mp/maps/mp/mp_downhill.gsc index 4f67c6a..d3433d9 100644 --- a/Multiplayer Core/patch_mp/maps/mp/mp_downhill.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/mp_downhill.gsc @@ -1,58 +1,58 @@ -//checked includes changed to match cerberus output -#include maps/mp/mp_downhill_cablecar; -#include maps/mp/gametypes/_spawning; -#include maps/mp/_compass; -#include maps/mp/mp_downhill_amb; -#include maps/mp/_load; -#include maps/mp/mp_downhill_fx; -#include maps/mp/_utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\_utility; +#include maps\mp\mp_downhill_fx; +#include maps\mp\_load; +#include maps\mp\mp_downhill_amb; +#include maps\mp\_compass; +#include maps\mp\gametypes\_spawning; +#include maps\mp\mp_downhill_cablecar; -main() //checked matches cerberus output +main() { - level.levelspawndvars = ::levelspawndvars; - maps/mp/mp_downhill_fx::main(); - precachemodel( "collision_physics_64x64x64" ); - precachemodel( "collision_clip_32x32x32" ); - precachemodel( "collision_clip_64x64x64" ); - precachemodel( "collision_physics_cylinder_32x128" ); - precachemodel( "collision_missile_32x32x128" ); - precachemodel( "collision_clip_64x64x64" ); - maps/mp/_load::main(); - maps/mp/mp_downhill_amb::main(); - maps/mp/_compass::setupminimap( "compass_map_mp_downhill" ); - setdvar( "compassmaxrange", "2100" ); - game[ "strings" ][ "war_callsign_a" ] = &"MPUI_CALLSIGN_MAPNAME_A"; - game[ "strings" ][ "war_callsign_b" ] = &"MPUI_CALLSIGN_MAPNAME_B"; - game[ "strings" ][ "war_callsign_c" ] = &"MPUI_CALLSIGN_MAPNAME_C"; - game[ "strings" ][ "war_callsign_d" ] = &"MPUI_CALLSIGN_MAPNAME_D"; - game[ "strings" ][ "war_callsign_e" ] = &"MPUI_CALLSIGN_MAPNAME_E"; - game[ "strings_menu" ][ "war_callsign_a" ] = "@MPUI_CALLSIGN_MAPNAME_A"; - game[ "strings_menu" ][ "war_callsign_b" ] = "@MPUI_CALLSIGN_MAPNAME_B"; - game[ "strings_menu" ][ "war_callsign_c" ] = "@MPUI_CALLSIGN_MAPNAME_C"; - game[ "strings_menu" ][ "war_callsign_d" ] = "@MPUI_CALLSIGN_MAPNAME_D"; - game[ "strings_menu" ][ "war_callsign_e" ] = "@MPUI_CALLSIGN_MAPNAME_E"; - spawncollision( "collision_physics_64x64x64", "collider", ( 969.01, -2355.43, 1014.87 ), ( 2.23119, 12.5057, -9.9556 ) ); - spawncollision( "collision_physics_64x64x64", "collider", ( 954.068, -2352.16, 1001.08 ), ( 3.17067, 17.931, -9.69974 ) ); - spawncollision( "collision_physics_64x64x64", "collider", ( 942.933, -2359.71, 1031.9 ), ( 3.17067, 17.931, -9.69974 ) ); - spawncollision( "collision_physics_cylinder_32x128", "collider", ( 368, -1378, 1015 ), vectorScale( ( 0, 1, 0 ), 24.9 ) ); - spawncollision( "collision_clip_64x64x64", "collider", ( 1268.5, -2518, 1062 ), vectorScale( ( 0, 1, 0 ), 349 ) ); - spawncollision( "collision_clip_64x64x64", "collider", ( 1122.5, 583.5, 959.5 ), vectorScale( ( 0, 1, 0 ), 41.2 ) ); - spawncollision( "collision_clip_32x32x32", "collider", ( 1895, -1428.5, 948 ), ( 0, 0, 0 ) ); - spawncollision( "collision_missile_32x32x128", "collider", ( 2431.5, -174, 1209.5 ), ( 0, 318.4, 90 ) ); - spawncollision( "collision_clip_64x64x64", "collider", ( 318, 1509, 1105 ), ( 0, 34.4, 90 ) ); - precachemodel( "fxanim_mp_downhill_cable_car_mod" ); - maps/mp/gametypes/_spawning::level_use_unified_spawning( 1 ); - level.cablecarlightsfx = loadfx( "maps/mp_maps/fx_mp_downhill_cablecar_lights" ); - level thread maps/mp/mp_downhill_cablecar::main(); - level.remotemotarviewleft = 40; - level.remotemotarviewright = 40; - level.remotemotarviewup = 15; - level.remotemotarviewdown = 65; + level.levelspawndvars = ::levelspawndvars; + maps\mp\mp_downhill_fx::main(); + precachemodel( "collision_physics_64x64x64" ); + precachemodel( "collision_clip_32x32x32" ); + precachemodel( "collision_clip_64x64x64" ); + precachemodel( "collision_physics_cylinder_32x128" ); + precachemodel( "collision_missile_32x32x128" ); + precachemodel( "collision_clip_64x64x64" ); + maps\mp\_load::main(); + maps\mp\mp_downhill_amb::main(); + maps\mp\_compass::setupminimap( "compass_map_mp_downhill" ); + setdvar( "compassmaxrange", "2100" ); + game["strings"]["war_callsign_a"] = &"MPUI_CALLSIGN_MAPNAME_A"; + game["strings"]["war_callsign_b"] = &"MPUI_CALLSIGN_MAPNAME_B"; + game["strings"]["war_callsign_c"] = &"MPUI_CALLSIGN_MAPNAME_C"; + game["strings"]["war_callsign_d"] = &"MPUI_CALLSIGN_MAPNAME_D"; + game["strings"]["war_callsign_e"] = &"MPUI_CALLSIGN_MAPNAME_E"; + game["strings_menu"]["war_callsign_a"] = "@MPUI_CALLSIGN_MAPNAME_A"; + game["strings_menu"]["war_callsign_b"] = "@MPUI_CALLSIGN_MAPNAME_B"; + game["strings_menu"]["war_callsign_c"] = "@MPUI_CALLSIGN_MAPNAME_C"; + game["strings_menu"]["war_callsign_d"] = "@MPUI_CALLSIGN_MAPNAME_D"; + game["strings_menu"]["war_callsign_e"] = "@MPUI_CALLSIGN_MAPNAME_E"; + spawncollision( "collision_physics_64x64x64", "collider", ( 969.01, -2355.43, 1014.87 ), ( 2.23119, 12.5057, -9.9556 ) ); + spawncollision( "collision_physics_64x64x64", "collider", ( 954.068, -2352.16, 1001.08 ), ( 3.17067, 17.931, -9.69974 ) ); + spawncollision( "collision_physics_64x64x64", "collider", ( 942.933, -2359.71, 1031.9 ), ( 3.17067, 17.931, -9.69974 ) ); + spawncollision( "collision_physics_cylinder_32x128", "collider", ( 368, -1378, 1015 ), vectorscale( ( 0, 1, 0 ), 24.9 ) ); + spawncollision( "collision_clip_64x64x64", "collider", ( 1268.5, -2518, 1062 ), vectorscale( ( 0, 1, 0 ), 349.0 ) ); + spawncollision( "collision_clip_64x64x64", "collider", ( 1122.5, 583.5, 959.5 ), vectorscale( ( 0, 1, 0 ), 41.2 ) ); + spawncollision( "collision_clip_32x32x32", "collider", ( 1895, -1428.5, 948 ), ( 0, 0, 0 ) ); + spawncollision( "collision_missile_32x32x128", "collider", ( 2431.5, -174, 1209.5 ), ( 0, 318.4, 90 ) ); + spawncollision( "collision_clip_64x64x64", "collider", ( 318, 1509, 1105 ), ( 0, 34.4, 90 ) ); + precachemodel( "fxanim_mp_downhill_cable_car_mod" ); + maps\mp\gametypes\_spawning::level_use_unified_spawning( 1 ); + level.cablecarlightsfx = loadfx( "maps/mp_maps/fx_mp_downhill_cablecar_lights" ); + level thread maps\mp\mp_downhill_cablecar::main(); + level.remotemotarviewleft = 40; + level.remotemotarviewright = 40; + level.remotemotarviewup = 15; + level.remotemotarviewdown = 65; } -levelspawndvars( reset_dvars ) //checked matches cerberus output +levelspawndvars( reset_dvars ) { - ss = level.spawnsystem; - ss.enemy_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_radius", "2600", reset_dvars ); + ss = level.spawnsystem; + ss.enemy_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_radius", "2600", reset_dvars ); } - diff --git a/Multiplayer Core/patch_mp/maps/mp/mp_downhill_cablecar.gsc b/Multiplayer Core/patch_mp/maps/mp/mp_downhill_cablecar.gsc index 6cb42b6..3d8b168 100644 --- a/Multiplayer Core/patch_mp/maps/mp/mp_downhill_cablecar.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/mp_downhill_cablecar.gsc @@ -1,795 +1,729 @@ -#include maps/mp/killstreaks/_supplydrop; -#include maps/mp/gametypes/_gameobjects; -#include maps/mp/gametypes/ctf; -#include maps/mp/gametypes/_weaponobjects; -#include maps/mp/killstreaks/_rcbomb; -#include maps/mp/_tacticalinsertion; -#include maps/mp/gametypes/_hostmigration; -#include maps/mp/_events; -#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\_events; +#include maps\mp\gametypes\_hostmigration; +#include maps\mp\_tacticalinsertion; +#include maps\mp\killstreaks\_rcbomb; +#include maps\mp\gametypes\_weaponobjects; +#include maps\mp\gametypes\ctf; +#include maps\mp\gametypes\_gameobjects; +#include maps\mp\killstreaks\_supplydrop; main() { - level.cablecartrack = []; - level.trackdistancestops = []; - level.distancetofirstrotate = 0; - precacheitem( "gondola_mp" ); - level.gondolasounds = []; - level.gondolasounds[ "tower_start" ] = "veh_cable_car_roller_cross"; - level.gondolasounds[ "rollers_start" ] = "veh_cable_car_start"; - level.gondolasounds[ "slow_down" ] = "veh_cable_car_stop"; - level.gondolaloopsounds = []; - level.gondolaloopsounds[ "start" ] = "veh_cable_car_move_loop"; - level.gondolaloopsounds[ "rollers_start" ] = "veh_cable_car_move_loop"; - level.gondolaloopsounds[ "rollers_end" ] = ""; - tracklength = createcablecarpath(); + level.cablecartrack = []; + level.trackdistancestops = []; + level.distancetofirstrotate = 0; + precacheitem( "gondola_mp" ); + level.gondolasounds = []; + level.gondolasounds["tower_start"] = "veh_cable_car_roller_cross"; + level.gondolasounds["rollers_start"] = "veh_cable_car_start"; + level.gondolasounds["slow_down"] = "veh_cable_car_stop"; + level.gondolaloopsounds = []; + level.gondolaloopsounds["start"] = "veh_cable_car_move_loop"; + level.gondolaloopsounds["rollers_start"] = "veh_cable_car_move_loop"; + level.gondolaloopsounds["rollers_end"] = ""; + tracklength = createcablecarpath(); /# - assert( level.trackdistancestops.size == 2 ); + assert( level.trackdistancestops.size == 2 ); #/ - if ( level.trackdistancestops.size == 2 ) - { - velocity = getdvarfloatdefault( "scr_cable_car_velocity", 100 ); - bottomoftracklength = level.trackdistancestops[ 1 ] - level.trackdistancestops[ 0 ]; - topoftracklength = tracklength - bottomoftracklength; + if ( level.trackdistancestops.size == 2 ) + { + velocity = getdvarfloatdefault( "scr_cable_car_velocity", 100 ); + bottomoftracklength = level.trackdistancestops[1] - level.trackdistancestops[0]; + topoftracklength = tracklength - bottomoftracklength; /# - assert( topoftracklength < bottomoftracklength ); + assert( topoftracklength < bottomoftracklength ); #/ - extratrackrequired = bottomoftracklength - topoftracklength; - extratimerequired = extratrackrequired / velocity; - level.cablecartrack[ level.cablecartrack.size - 1 ].movetime = extratimerequired; - level.cablecartrack[ level.cablecartrack.size - 1 ].rotate = 1; - tracklength = bottomoftracklength * 2; - } - else - { - return; - } - cablecars = getentarray( "cablecar", "targetname" ); - cablecarkilltrigger = getentarray( "cable_car_kill_trigger", "targetname" ); + extratrackrequired = bottomoftracklength - topoftracklength; + extratimerequired = extratrackrequired / velocity; + level.cablecartrack[level.cablecartrack.size - 1].movetime = extratimerequired; + level.cablecartrack[level.cablecartrack.size - 1].rotate = 1; + tracklength = bottomoftracklength * 2; + } + else + return; + + cablecars = getentarray( "cablecar", "targetname" ); + cablecarkilltrigger = getentarray( "cable_car_kill_trigger", "targetname" ); /# - assert( isDefined( cablecars ) ); + assert( isdefined( cablecars ) ); #/ /# - assert( isDefined( cablecarkilltrigger ) ); + assert( isdefined( cablecarkilltrigger ) ); #/ - level.cablecardefaultangle = cablecars[ 0 ].angles; - distancebetweencars = tracklength / cablecars.size; - if ( getgametypesetting( "allowMapScripting" ) ) - { - currentdistanceforcar = 0; - } - else - { - currentdistanceforcar = distancebetweencars * 0,8; - } - i = 0; - while ( i < cablecars.size ) - { - cablecar = cablecars[ i ]; - cablecar thread waitthenplayfx( 0,1, level.cablecarlightsfx, "tag_origin" ); - cablecar.killtrigger = getclosest( cablecar.origin, cablecarkilltrigger ); + level.cablecardefaultangle = cablecars[0].angles; + distancebetweencars = tracklength / cablecars.size; + + if ( getgametypesetting( "allowMapScripting" ) ) + currentdistanceforcar = 0; + else + currentdistanceforcar = distancebetweencars * 0.8; + + for ( i = 0; i < cablecars.size; i++ ) + { + cablecar = cablecars[i]; + cablecar thread waitthenplayfx( 0.1, level.cablecarlightsfx, "tag_origin" ); + cablecar.killtrigger = getclosest( cablecar.origin, cablecarkilltrigger ); /# - assert( isDefined( cablecar.killtrigger ) ); + assert( isdefined( cablecar.killtrigger ) ); #/ - cablecar.killtrigger enablelinkto(); - cablecar.killtrigger linkto( cablecar ); - cablecar setpointontrack( currentdistanceforcar, tracklength ); - currentdistanceforcar += distancebetweencars; + cablecar.killtrigger enablelinkto(); + cablecar.killtrigger linkto( cablecar ); + cablecar setpointontrack( currentdistanceforcar, tracklength ); + currentdistanceforcar += distancebetweencars; /# - debug_star( cablecar.origin, 120000, ( 0, 0, 1 ) ); + debug_star( cablecar.origin, 120000, ( 1, 0, 1 ) ); #/ - grip = spawn( "script_model", cablecar.origin ); - if ( cablecar.nextnodeindex >= ( level.cablecartrack.size - 1 ) ) - { - grip.angles = vectorToAngle( level.cablecartrack[ cablecar.nextnodeindex - 1 ].origin - level.cablecartrack[ cablecar.nextnodeindex ].origin ); - } - else - { - if ( is_true( level.cablecartrack[ cablecar.nextnodeindex ].pause ) ) - { - carnode = level.cablecartrack[ cablecar.nextnodeindex + 2 ]; - } - else - { - carnode = level.cablecartrack[ cablecar.nextnodeindex ]; - } - grip.angles = vectorToAngle( carnode.origin - cablecar.origin ); - } - grip.origin -= ( 0, cos( grip.angles[ 1 ] ) * -12, 8 ); - grip setmodel( "dh_cable_car_top_piece" ); - cablecar.grip = grip; - if ( getgametypesetting( "allowMapScripting" ) ) - { - level thread cablecarrun( cablecar ); - i++; - continue; - } - else - { - cablecar.origin += ( 0, cos( cablecar.angles[ 1 ] ) * -15, -66,6 ); - cablecar disconnectpaths(); - } - i++; - } + grip = spawn( "script_model", cablecar.origin ); + + if ( cablecar.nextnodeindex >= level.cablecartrack.size - 1 ) + grip.angles = vectortoangles( level.cablecartrack[cablecar.nextnodeindex - 1].origin - level.cablecartrack[cablecar.nextnodeindex].origin ); + else + { + if ( is_true( level.cablecartrack[cablecar.nextnodeindex].pause ) ) + carnode = level.cablecartrack[cablecar.nextnodeindex + 2]; + else + carnode = level.cablecartrack[cablecar.nextnodeindex]; + + grip.angles = vectortoangles( carnode.origin - cablecar.origin ); + } + + grip.origin -= ( 0, cos( grip.angles[1] ) * -12, 8 ); + grip setmodel( "dh_cable_car_top_piece" ); + cablecar.grip = grip; + + if ( getgametypesetting( "allowMapScripting" ) ) + { + level thread cablecarrun( cablecar ); + continue; + } + + cablecar.origin += ( 0, cos( cablecar.angles[1] ) * -15, -66.6 ); + cablecar disconnectpaths(); + } } waitthenplayfx( time, fxnum, tag ) { - self endon( "death" ); - wait time; - for ( ;; ) - { - playfxontag( fxnum, self, tag ); - level waittill( "host_migration_end" ); - } + self endon( "death" ); + wait( time ); + + for (;;) + { + playfxontag( fxnum, self, tag ); + + level waittill( "host_migration_end" ); + } } setpointontrack( distancealongtrack, tracklength ) { - pointontrack = level.cablecartrack[ 0 ].origin; - while ( distancealongtrack > tracklength ) - { - distancealongtrack = tracklength * -1; - } - remainingdistance = distancealongtrack; - i = 0; - while ( i < level.cablecartrack.size ) - { - cablecartracknode = level.cablecartrack[ i ]; - currentnodeisstop = is_true( cablecartracknode.pause ); - if ( currentnodeisstop ) - { - velocity = getdvarfloatdefault( "scr_cable_car_velocity", 100 ); - remainingdistance -= 3 * velocity; - if ( remainingdistance <= 0 ) - { - pointontrack = cablecartracknode.origin; - self.nextnodeindex = i; - self.needtopauseatstart = remainingdistance / velocity; - break; - } - } - else nextnodeisstop = 0; - if ( level.cablecartrack.size > ( i + 1 ) ) - { - nextnodeisstop = is_true( level.cablecartrack[ i + 1 ].pause ); - } - currentnodeisstop = 0; - if ( is_true( cablecartracknode.pause ) ) - { - currentnodeisstop = 1; - } - distance = cablecartracknode.stepdistance; - if ( nextnodeisstop || currentnodeisstop ) - { - distance *= 2; - } - if ( !isDefined( distance ) ) - { - pointontrack = cablecartracknode.origin; - self.nextnodeindex = i; - break; - } - else if ( remainingdistance < distance ) - { - if ( distance > 0 ) - { - ratio = remainingdistance / distance; - pointontrack = getpointonline( cablecartracknode.origin, level.cablecartrack[ i + 1 ].origin, ratio ); - } - self.nextnodeindex = i; - break; - } - else - { - remainingdistance -= distance; - i++; - } - } - self.angles = level.cablecardefaultangle; - if ( distancealongtrack < level.distancetofirstrotate ) - { - self.angles += vectorScale( ( 0, 0, 1 ), 180 ); - } - self.origin = pointontrack; + pointontrack = level.cablecartrack[0].origin; + + while ( distancealongtrack > tracklength ) + distancealongtrack = tracklength * -1; + + remainingdistance = distancealongtrack; + + for ( i = 0; i < level.cablecartrack.size; i++ ) + { + cablecartracknode = level.cablecartrack[i]; + currentnodeisstop = is_true( cablecartracknode.pause ); + + if ( currentnodeisstop ) + { + velocity = getdvarfloatdefault( "scr_cable_car_velocity", 100 ); + remainingdistance -= 3 * velocity; + + if ( remainingdistance <= 0 ) + { + pointontrack = cablecartracknode.origin; + self.nextnodeindex = i; + self.needtopauseatstart = remainingdistance / velocity; + break; + } + } + + nextnodeisstop = 0; + + if ( level.cablecartrack.size > i + 1 ) + nextnodeisstop = is_true( level.cablecartrack[i + 1].pause ); + + currentnodeisstop = 0; + + if ( is_true( cablecartracknode.pause ) ) + currentnodeisstop = 1; + + distance = cablecartracknode.stepdistance; + + if ( nextnodeisstop || currentnodeisstop ) + distance *= 2; + + if ( !isdefined( distance ) ) + { + pointontrack = cablecartracknode.origin; + self.nextnodeindex = i; + break; + } + + if ( remainingdistance < distance ) + { + if ( distance > 0 ) + { + ratio = remainingdistance / distance; + pointontrack = getpointonline( cablecartracknode.origin, level.cablecartrack[i + 1].origin, ratio ); + } + + self.nextnodeindex = i; + break; + } + + remainingdistance -= distance; + } + + self.angles = level.cablecardefaultangle; + + if ( distancealongtrack < level.distancetofirstrotate ) + self.angles += vectorscale( ( 0, 1, 0 ), 180.0 ); + + self.origin = pointontrack; } createcablecarpath( cablecar ) { - currentnode = getent( "cable_down_start", "targetname" ); - startorigin = currentnode.origin; - velocity = getdvarfloatdefault( "scr_cable_car_velocity", 100 ); - tracklength = 0; - previousnode = undefined; - movetime = -1; - while ( isDefined( currentnode ) ) - { - cablecarnodestruct = spawnstruct(); - cablecarnodestruct.origin = currentnode.origin; - level.cablecartrack[ level.cablecartrack.size ] = cablecarnodestruct; - if ( isDefined( currentnode.target ) ) - { - nextnode = getent( currentnode.target, "targetname" ); - } - if ( !isDefined( nextnode ) ) - { - break; - } - else - { - stepdistance = distance( currentnode.origin, nextnode.origin ); - cablecarnodestruct.stepdistance = stepdistance; - movetime = stepdistance / velocity; + currentnode = getent( "cable_down_start", "targetname" ); + startorigin = currentnode.origin; + velocity = getdvarfloatdefault( "scr_cable_car_velocity", 100 ); + tracklength = 0; + previousnode = undefined; + movetime = -1; + + while ( isdefined( currentnode ) ) + { + cablecarnodestruct = spawnstruct(); + cablecarnodestruct.origin = currentnode.origin; + level.cablecartrack[level.cablecartrack.size] = cablecarnodestruct; + + if ( isdefined( currentnode.target ) ) + nextnode = getent( currentnode.target, "targetname" ); + + if ( !isdefined( nextnode ) ) + break; + + stepdistance = distance( currentnode.origin, nextnode.origin ); + cablecarnodestruct.stepdistance = stepdistance; + movetime = stepdistance / velocity; /# - assert( movetime > 0 ); + assert( movetime > 0 ); #/ - pauseratio = 1; - if ( isDefined( nextnode.script_noteworthy ) && nextnode.script_noteworthy == "stop" ) - { - pauseratio *= 2; - } - if ( isDefined( currentnode.script_noteworthy ) ) - { - if ( currentnode.script_noteworthy == "stop" ) - { - cablecarnodestruct.pause = 1; - tracklength += velocity * 3; - level.trackdistancestops[ level.trackdistancestops.size ] = tracklength; - pauseratio *= 2; - break; - } - else if ( currentnode.script_noteworthy == "rotate" ) - { - cablecarnodestruct.rotate = 1; - break; - } - else if ( currentnode.script_noteworthy == "forceorigin" ) - { - cablecarnodestruct.forceorigin = 1; - break; - } - else - { - if ( isDefined( level.gondolasounds[ currentnode.script_noteworthy ] ) ) - { - cablecarnodestruct.playsound = level.gondolasounds[ currentnode.script_noteworthy ]; - } - if ( isDefined( level.gondolaloopsounds[ currentnode.script_noteworthy ] ) ) - { - cablecarnodestruct.playloopsound = level.gondolaloopsounds[ currentnode.script_noteworthy ]; - } - } - } - tracklength += stepdistance * pauseratio; - if ( is_true( cablecarnodestruct.rotate ) ) - { - level.distancetofirstrotate = tracklength; - } - cablecarnodestruct.movetime = movetime; - previousnode = currentnode; - currentnode = nextnode; - nextnode = undefined; - } - } - return tracklength; + pauseratio = 1; + + if ( isdefined( nextnode.script_noteworthy ) && nextnode.script_noteworthy == "stop" ) + pauseratio *= 2; + + if ( isdefined( currentnode.script_noteworthy ) ) + { + if ( currentnode.script_noteworthy == "stop" ) + { + cablecarnodestruct.pause = 1; + tracklength += velocity * 3; + level.trackdistancestops[level.trackdistancestops.size] = tracklength; + pauseratio *= 2; + } + else if ( currentnode.script_noteworthy == "rotate" ) + cablecarnodestruct.rotate = 1; + else if ( currentnode.script_noteworthy == "forceorigin" ) + cablecarnodestruct.forceorigin = 1; + else + { + if ( isdefined( level.gondolasounds[currentnode.script_noteworthy] ) ) + cablecarnodestruct.playsound = level.gondolasounds[currentnode.script_noteworthy]; + + if ( isdefined( level.gondolaloopsounds[currentnode.script_noteworthy] ) ) + cablecarnodestruct.playloopsound = level.gondolaloopsounds[currentnode.script_noteworthy]; + } + } + + tracklength += stepdistance * pauseratio; + + if ( is_true( cablecarnodestruct.rotate ) ) + level.distancetofirstrotate = tracklength; + + cablecarnodestruct.movetime = movetime; + previousnode = currentnode; + currentnode = nextnode; + nextnode = undefined; + } + + return tracklength; } watchpronetouch() { - for ( ;; ) - { - self waittill( "touch", entity ); - if ( isplayer( entity ) ) - { - if ( entity.origin[ 2 ] < 940 ) - { - if ( entity getstance() == "prone" ) - { - entity dodamage( entity.health * 2, self.origin + ( 0, 0, 1 ), self, self, 0, "MOD_HIT_BY_OBJECT", 0, "gondola_mp" ); - } - } - } - } + for (;;) + { + self waittill( "touch", entity ); + + if ( isplayer( entity ) ) + { + if ( entity.origin[2] < 940 ) + { + if ( entity getstance() == "prone" ) + entity dodamage( entity.health * 2, self.origin + ( 0, 0, 1 ), self, self, 0, "MOD_HIT_BY_OBJECT", 0, "gondola_mp" ); + } + } + } } cablecarrun( cablecar ) { - nextnodeindex = cablecar.nextnodeindex; - cablecar thread watchpronetouch(); - cablecar thread cablecar_move_think( cablecar.killtrigger, 1 ); - cablecar thread cablecar_ai_watch(); - cablecar.ismoving = 1; - grip = cablecar.grip; - firstmove = 1; - cablecar.hidden = 0; - grip.forceangles = 0; - if ( isDefined( cablecar.needtopauseatstart ) ) - { - if ( cablecar.needtopauseatstart > 0 ) - { - wait cablecar.needtopauseatstart; - } - } - for ( ;; ) - { - i = nextnodeindex; - while ( i < level.cablecartrack.size ) - { - nextnode = level.cablecartrack[ i + 1 ]; - if ( !isDefined( nextnode ) ) - { - nextnode = level.cablecartrack[ 0 ]; - } - currentnode = level.cablecartrack[ i ]; - acceltime = 0; - deceltime = 0; - currentmovetime = currentnode.movetime; - if ( isDefined( nextnode.pause ) || isDefined( currentnode ) && isDefined( currentnode.pause ) ) - { - currentmovetime *= 2; - if ( isDefined( nextnode.pause ) ) - { - deceltime = currentmovetime - 0,1; - } - if ( isDefined( currentnode ) && isDefined( currentnode.pause ) ) - { - acceltime = currentmovetime - 0,1; - } - } + nextnodeindex = cablecar.nextnodeindex; + cablecar thread watchpronetouch(); + cablecar thread cablecar_move_think( cablecar.killtrigger, 1 ); + cablecar thread cablecar_ai_watch(); + cablecar.ismoving = 1; + grip = cablecar.grip; + firstmove = 1; + cablecar.hidden = 0; + grip.forceangles = 0; + + if ( isdefined( cablecar.needtopauseatstart ) ) + { + if ( cablecar.needtopauseatstart > 0 ) + wait( cablecar.needtopauseatstart ); + } + + for (;;) + { + for ( i = nextnodeindex; i < level.cablecartrack.size; i++ ) + { + nextnode = level.cablecartrack[i + 1]; + + if ( !isdefined( nextnode ) ) + nextnode = level.cablecartrack[0]; + + currentnode = level.cablecartrack[i]; + acceltime = 0; + deceltime = 0; + currentmovetime = currentnode.movetime; + + if ( isdefined( nextnode.pause ) || isdefined( currentnode ) && isdefined( currentnode.pause ) ) + { + currentmovetime *= 2; + + if ( isdefined( nextnode.pause ) ) + deceltime = currentmovetime - 0.1; + + if ( isdefined( currentnode ) && isdefined( currentnode.pause ) ) + acceltime = currentmovetime - 0.1; + } /# - debug_star( nextnode.origin, ( 0, 0, 1 ), 1000 ); + debug_star( nextnode.origin, ( 1, 1, 1 ), 1000 ); #/ - if ( isDefined( currentnode ) ) - { - if ( isDefined( currentnode.playsound ) ) - { - cablecar playsound( currentnode.playsound ); - } - if ( isDefined( currentnode.playloopsound ) ) - { - cablecar stoploopsound(); - cablecar playsound( "veh_cable_car_leave" ); - if ( currentnode.playloopsound != "" ) - { - cablecar playloopsound( currentnode.playloopsound ); - } - } - } - if ( isDefined( currentnode.rotate ) ) - { - cablecar hide(); - grip hide(); - cablecar.hidden = 1; - cablecar.origin += vectorScale( ( 0, 0, 1 ), 1000 ); - if ( cablecar.angles[ 1 ] > 360 ) - { - cablecar.angles -= vectorScale( ( 0, 0, 1 ), 180 ); - break; - } - else - { - cablecar.angles += vectorScale( ( 0, 0, 1 ), 180 ); - } - } - if ( isDefined( currentnode ) && isDefined( nextnode ) ) - { - angles = vectorToAngle( currentnode.origin - nextnode.origin ); - grip.nextangles = angles; - if ( grip.forceangles == 1 ) - { - grip.forceangles = 0; - grip.angles = grip.nextangles; - break; - } - else - { - grip rotateto( grip.nextangles, 0,9 ); - } - } - if ( firstmove == 1 ) - { - firstmovedistance = distance( cablecar.origin, nextnode.origin ); - velocity = getdvarfloatdefault( "scr_cable_car_velocity", 100 ); - timetomove = firstmovedistance / velocity; - if ( timetomove > 0 ) - { - cablecar moveto( nextnode.origin + ( 0, cos( cablecar.angles[ 1 ] ) * -15, -66,6 ), timetomove ); - grip moveto( nextnode.origin - ( 0, cos( cablecar.angles[ 1 ] ) * -12, 8 ), timetomove ); - wait timetomove; - } - } - else - { - heightoffset = -66,6; - if ( is_true( cablecar.hidden ) ) - { - heightoffset += -1000; - } - if ( deceltime > 0 ) - { - cablecar thread prettyslowdown( currentmovetime - deceltime ); - } - grip thread hostmigrationawaremoveto( nextnode.origin - ( 0, cos( cablecar.angles[ 1 ] ) * -12, 8 ), currentmovetime, acceltime, deceltime, currentmovetime - 0,05 ); - cablecar hostmigrationawaremoveto( nextnode.origin + ( 0, cos( cablecar.angles[ 1 ] ) * -15, heightoffset ), currentmovetime, acceltime, deceltime, currentmovetime - 0,05 ); - } - if ( cablecar.hidden == 1 ) - { - cablecar.hidden = 0; - if ( is_true( cablecar.hidden ) ) - { - cablecar.origin -= vectorScale( ( 0, 0, 1 ), 1000 ); - } - cablecar show(); - grip show(); - grip.forceangles = 1; - } - firstmove = 0; - if ( isDefined( nextnode.pause ) ) - { - cablecar.ismoving = 0; - grip thread hostmigrationawaremoveto( nextnode.origin - ( 0, cos( cablecar.angles[ 1 ] ) * -12, 8 ), 300, 0, 0, 3 ); - cablecar hostmigrationawaremoveto( nextnode.origin + ( 0, cos( cablecar.angles[ 1 ] ) * -15, -66,6 ), 300, 0, 0, 3 ); - cablecar notify( "started_moving" ); - cablecar thread prettyspeedup(); - cablecar.ismoving = 1; - } - if ( isDefined( nextnode.forceorigin ) ) - { - cablecar.origin = nextnode.origin + ( 0, cos( cablecar.angles[ 1 ] ) * -15, -66,6 ); - grip.origin = nextnode.origin - ( 0, cos( cablecar.angles[ 1 ] ) * -12, 8 ); - } - i++; - } - nextnodeindex = 0; - } + if ( isdefined( currentnode ) ) + { + if ( isdefined( currentnode.playsound ) ) + cablecar playsound( currentnode.playsound ); + + if ( isdefined( currentnode.playloopsound ) ) + { + cablecar stoploopsound(); + cablecar playsound( "veh_cable_car_leave" ); + + if ( currentnode.playloopsound != "" ) + cablecar playloopsound( currentnode.playloopsound ); + } + } + + if ( isdefined( currentnode.rotate ) ) + { + cablecar hide(); + grip hide(); + cablecar.hidden = 1; + cablecar.origin += vectorscale( ( 0, 0, -1 ), 1000.0 ); + + if ( cablecar.angles[1] > 360 ) + cablecar.angles -= vectorscale( ( 0, 1, 0 ), 180.0 ); + else + cablecar.angles += vectorscale( ( 0, 1, 0 ), 180.0 ); + } + + if ( isdefined( currentnode ) && isdefined( nextnode ) ) + { + angles = vectortoangles( currentnode.origin - nextnode.origin ); + grip.nextangles = angles; + + if ( grip.forceangles == 1 ) + { + grip.forceangles = 0; + grip.angles = grip.nextangles; + } + else + grip rotateto( grip.nextangles, 0.9 ); + } + + if ( firstmove == 1 ) + { + firstmovedistance = distance( cablecar.origin, nextnode.origin ); + velocity = getdvarfloatdefault( "scr_cable_car_velocity", 100 ); + timetomove = firstmovedistance / velocity; + + if ( timetomove > 0 ) + { + cablecar moveto( nextnode.origin + ( 0, cos( cablecar.angles[1] ) * -15, -66.6 ), timetomove ); + grip moveto( nextnode.origin - ( 0, cos( cablecar.angles[1] ) * -12, 8 ), timetomove ); + wait( timetomove ); + } + } + else + { + heightoffset = -66.6; + + if ( is_true( cablecar.hidden ) ) + heightoffset += -1000; + + if ( deceltime > 0 ) + cablecar thread prettyslowdown( currentmovetime - deceltime ); + + grip thread hostmigrationawaremoveto( nextnode.origin - ( 0, cos( cablecar.angles[1] ) * -12, 8 ), currentmovetime, acceltime, deceltime, currentmovetime - 0.05 ); + cablecar hostmigrationawaremoveto( nextnode.origin + ( 0, cos( cablecar.angles[1] ) * -15, heightoffset ), currentmovetime, acceltime, deceltime, currentmovetime - 0.05 ); + } + + if ( cablecar.hidden == 1 ) + { + cablecar.hidden = 0; + + if ( is_true( cablecar.hidden ) ) + cablecar.origin -= vectorscale( ( 0, 0, -1 ), 1000.0 ); + + cablecar show(); + grip show(); + grip.forceangles = 1; + } + + firstmove = 0; + + if ( isdefined( nextnode.pause ) ) + { + cablecar.ismoving = 0; + grip thread hostmigrationawaremoveto( nextnode.origin - ( 0, cos( cablecar.angles[1] ) * -12, 8 ), 300, 0, 0, 3 ); + cablecar hostmigrationawaremoveto( nextnode.origin + ( 0, cos( cablecar.angles[1] ) * -15, -66.6 ), 300, 0, 0, 3 ); + cablecar notify( "started_moving" ); + cablecar thread prettyspeedup(); + cablecar.ismoving = 1; + } + + if ( isdefined( nextnode.forceorigin ) ) + { + cablecar.origin = nextnode.origin + ( 0, cos( cablecar.angles[1] ) * -15, -66.6 ); + grip.origin = nextnode.origin - ( 0, cos( cablecar.angles[1] ) * -12, 8 ); + } + } + + nextnodeindex = 0; + } } hostmigrationawaremoveto( origin, movetime, acceltime, deceltime, waittime ) { - starttime = getTime(); - self moveto( origin, movetime, acceltime, deceltime ); - waitcompleted = self waitendonmigration( waittime ); - if ( !isDefined( waitcompleted ) ) - { - endtime = getTime(); - maps/mp/gametypes/_hostmigration::waittillhostmigrationdone(); - mstimedifference = ( starttime + ( waittime * 1000 ) ) - endtime; - if ( mstimedifference > 500 ) - { - wait ( mstimedifference / 1000 ); - } - } + starttime = gettime(); + self moveto( origin, movetime, acceltime, deceltime ); + waitcompleted = self waitendonmigration( waittime ); + + if ( !isdefined( waitcompleted ) ) + { + endtime = gettime(); + maps\mp\gametypes\_hostmigration::waittillhostmigrationdone(); + mstimedifference = starttime + waittime * 1000 - endtime; + + if ( mstimedifference > 500 ) + wait( mstimedifference / 1000 ); + } } waitendonmigration( time ) { - level endon( "host_migration_begin" ); - wait time; - return 1; + level endon( "host_migration_begin" ); + wait( time ); + return 1; } prettyslowdown( waittime ) { - if ( waittime > 0 ) - { - wait waittime; - } - self stoploopsound(); - self playsound( level.gondolasounds[ "slow_down" ] ); - originalangle = self.angles; - swingtime = getdvarfloatdefault( "scr_cable_swing_time", 1,5 ); - swingbacktime = getdvarfloatdefault( "scr_cable_swing_back_time", 1,5 ); - swingangle = getdvarfloatdefault( "scr_cable_swing_angle", 2 ); - self rotateto( ( originalangle[ 0 ] + swingangle, originalangle[ 1 ], originalangle[ 2 ] ), swingtime, swingtime / 2, swingtime / 2 ); - self waittill( "rotatedone" ); - self rotateto( ( originalangle[ 0 ], originalangle[ 1 ], originalangle[ 2 ] ), swingbacktime, swingbacktime / 2, swingbacktime / 2 ); - self waittill( "rotatedone" ); + if ( waittime > 0 ) + wait( waittime ); + + self stoploopsound(); + self playsound( level.gondolasounds["slow_down"] ); + originalangle = self.angles; + swingtime = getdvarfloatdefault( "scr_cable_swing_time", 1.5 ); + swingbacktime = getdvarfloatdefault( "scr_cable_swing_back_time", 1.5 ); + swingangle = getdvarfloatdefault( "scr_cable_swing_angle", 2.0 ); + self rotateto( ( originalangle[0] + swingangle, originalangle[1], originalangle[2] ), swingtime, swingtime / 2, swingtime / 2 ); + + self waittill( "rotatedone" ); + + self rotateto( ( originalangle[0], originalangle[1], originalangle[2] ), swingbacktime, swingbacktime / 2, swingbacktime / 2 ); + + self waittill( "rotatedone" ); } prettyspeedup() { - self stoploopsound(); - self playsound( level.gondolasounds[ "rollers_start" ] ); - self playloopsound( level.gondolaloopsounds[ "start" ] ); - originalangle = self.angles; - swingtime = getdvarfloatdefault( "scr_cable_swing_time_up", 1 ); - swingbacktime = getdvarfloatdefault( "scr_cable_swing_back_time_up", 1,5 ); - swingangle = getdvarfloatdefault( "scr_cable_swing_angle_up", 2 ); - self rotateto( ( originalangle[ 0 ] - swingangle, originalangle[ 1 ], originalangle[ 2 ] ), swingtime, swingtime / 2, swingtime / 2 ); - self waittill( "rotatedone" ); - self rotateto( ( originalangle[ 0 ], originalangle[ 1 ], originalangle[ 2 ] ), swingbacktime, swingbacktime / 2, swingbacktime / 2 ); - self waittill( "rotatedone" ); + self stoploopsound(); + self playsound( level.gondolasounds["rollers_start"] ); + self playloopsound( level.gondolaloopsounds["start"] ); + originalangle = self.angles; + swingtime = getdvarfloatdefault( "scr_cable_swing_time_up", 1.0 ); + swingbacktime = getdvarfloatdefault( "scr_cable_swing_back_time_up", 1.5 ); + swingangle = getdvarfloatdefault( "scr_cable_swing_angle_up", 2.0 ); + self rotateto( ( originalangle[0] - swingangle, originalangle[1], originalangle[2] ), swingtime, swingtime / 2, swingtime / 2 ); + + self waittill( "rotatedone" ); + + self rotateto( ( originalangle[0], originalangle[1], originalangle[2] ), swingbacktime, swingbacktime / 2, swingbacktime / 2 ); + + self waittill( "rotatedone" ); } cablecar_ai_watch() { - self endon( "death" ); - self endon( "delete" ); - for ( ;; ) - { - wait 1; - while ( isDefined( self.nodes ) ) - { - i = 0; - while ( i < self.nodes.size ) - { - node = self.nodes[ i ]; - _a574 = level.teams; - _k574 = getFirstArrayKey( _a574 ); - while ( isDefined( _k574 ) ) - { - team = _a574[ _k574 ]; - node setdangerous( team, 0 ); - _k574 = getNextArrayKey( _a574, _k574 ); - } - i++; - } - } - dir = vectornormalize( anglesToForward( self.angles ) ); - dangerorigin = self.origin - ( dir * 196 ); - nodes = getnodesinradius( dangerorigin, 256, 0, 196 ); - i = 0; - while ( i < nodes.size ) - { - node = nodes[ i ]; - _a587 = level.teams; - _k587 = getFirstArrayKey( _a587 ); - while ( isDefined( _k587 ) ) - { - team = _a587[ _k587 ]; - node setdangerous( team, 1 ); - _k587 = getNextArrayKey( _a587, _k587 ); - } - i++; - } - if ( nodes.size > 0 ) - { - self.nodes = nodes; - continue; - } - else - { - self.nodes = undefined; - } - } + self endon( "death" ); + self endon( "delete" ); + + for (;;) + { + wait 1; + + if ( isdefined( self.nodes ) ) + { + for ( i = 0; i < self.nodes.size; i++ ) + { + node = self.nodes[i]; + + foreach ( team in level.teams ) + node setdangerous( team, 0 ); + } + } + + dir = vectornormalize( anglestoforward( self.angles ) ); + dangerorigin = self.origin - dir * 196; + nodes = getnodesinradius( dangerorigin, 256, 0, 196 ); + + for ( i = 0; i < nodes.size; i++ ) + { + node = nodes[i]; + + foreach ( team in level.teams ) + node setdangerous( team, 1 ); + } + + if ( nodes.size > 0 ) + { + self.nodes = nodes; + continue; + } + + self.nodes = undefined; + } } cablecar_move_think( kill_trigger, checkmoving ) { - self endon( "death" ); - self endon( "delete" ); - self.disablefinalkillcam = 1; - destroycorpses = 0; - for ( ;; ) - { - wait 0,05; - pixbeginevent( "cablecar_move_think" ); - if ( checkmoving ) - { - if ( self.ismoving == 0 ) - { - self waittill( "started_moving" ); - } - } - entities = getdamageableentarray( self.origin, 200 ); - _a626 = entities; - _k626 = getFirstArrayKey( _a626 ); - while ( isDefined( _k626 ) ) - { - entity = _a626[ _k626 ]; - if ( isDefined( entity.targetname ) && entity.targetname == "cablecar" ) - { - } - else - { - if ( !entity istouching( kill_trigger ) ) - { - break; - } - else if ( isDefined( entity.model ) && entity.model == "t6_wpn_tac_insert_world" ) - { - entity maps/mp/_tacticalinsertion::destroy_tactical_insertion(); - break; - } - else - { - if ( !isalive( entity ) ) - { - break; - } - else if ( isDefined( entity.targetname ) ) - { - if ( entity.targetname == "talon" ) - { - entity notify( "death" ); - break; - } - else if ( entity.targetname == "rcbomb" ) - { - entity maps/mp/killstreaks/_rcbomb::rcbomb_force_explode(); - break; - } - else if ( entity.targetname == "riotshield_mp" ) - { - entity dodamage( 1, self.origin + ( 0, 0, 1 ), self, self, 0, "MOD_CRUSH" ); - break; - } - } - else if ( isDefined( entity.helitype ) && entity.helitype == "qrdrone" ) - { - watcher = entity.owner maps/mp/gametypes/_weaponobjects::getweaponobjectwatcher( "qrdrone" ); - watcher thread maps/mp/gametypes/_weaponobjects::waitanddetonate( entity, 0, undefined ); - break; - } - else - { - if ( entity.classname == "grenade" ) - { - if ( !isDefined( entity.name ) ) - { - break; - } - else if ( !isDefined( entity.owner ) ) - { - break; - } - else if ( entity.name == "satchel_charge_mp" ) - { - break; - } - else if ( entity.name == "proximity_grenade_mp" ) - { - watcher = entity.owner getwatcherforweapon( entity.name ); - watcher thread maps/mp/gametypes/_weaponobjects::waitanddetonate( entity, 0, undefined, "script_mover_mp" ); - break; - } - else if ( !isweaponequipment( entity.name ) ) - { - break; - } - else watcher = entity.owner getwatcherforweapon( entity.name ); - if ( !isDefined( watcher ) ) - { - break; - } - else watcher thread maps/mp/gametypes/_weaponobjects::waitanddetonate( entity, 0, undefined, "script_mover_mp" ); - break; - } - else if ( entity.classname == "remote_drone" ) - { - break; - } - else if ( entity.classname == "auto_turret" ) - { - if ( isDefined( entity.carried ) && entity.carried == 1 ) - { - break; - } - else - { - if ( !isDefined( entity.damagedtodeath ) || !entity.damagedtodeath ) - { - entity domaxdamage( self.origin + ( 0, 0, 1 ), self, self, 0, "MOD_CRUSH" ); - } - break; - } - else - { - if ( isplayer( entity ) ) - { - if ( entity getstance() == "prone" ) - { - if ( entity isonground() == 0 ) - { - destroycorpses = 1; - } - } - entity dodamage( entity.health * 2, self.origin + ( 0, 0, 1 ), self, self, 0, "MOD_HIT_BY_OBJECT", 0, "gondola_mp" ); - break; - } - else - { - entity dodamage( entity.health * 2, self.origin + ( 0, 0, 1 ), self, self, 0, "MOD_CRUSH" ); - } - } - } - } - } - } - _k626 = getNextArrayKey( _a626, _k626 ); - } - if ( destroycorpses == 1 ) - { - destroycorpses = 0; - self destroy_corpses(); - } - self destroy_supply_crates(); - if ( level.gametype == "ctf" ) - { - _a759 = level.flags; - _k759 = getFirstArrayKey( _a759 ); - while ( isDefined( _k759 ) ) - { - flag = _a759[ _k759 ]; - if ( flag.curorigin != flag.trigger.baseorigin && flag.visuals[ 0 ] istouching( kill_trigger ) ) - { - flag maps/mp/gametypes/ctf::returnflag(); - } - _k759 = getNextArrayKey( _a759, _k759 ); - } - } - else if ( level.gametype == "sd" && !level.multibomb ) - { - if ( level.sdbomb.visuals[ 0 ] istouching( kill_trigger ) ) - { - level.sdbomb maps/mp/gametypes/_gameobjects::returnhome(); - } - } - pixendevent(); - } + self endon( "death" ); + self endon( "delete" ); + self.disablefinalkillcam = 1; + destroycorpses = 0; + + for (;;) + { + wait 0.05; + pixbeginevent( "cablecar_move_think" ); + + if ( checkmoving ) + { + if ( self.ismoving == 0 ) + self waittill( "started_moving" ); + } + + entities = getdamageableentarray( self.origin, 200 ); + + foreach ( entity in entities ) + { + if ( isdefined( entity.targetname ) && entity.targetname == "cablecar" ) + continue; + + if ( !entity istouching( kill_trigger ) ) + continue; + + if ( isdefined( entity.model ) && entity.model == "t6_wpn_tac_insert_world" ) + { + entity maps\mp\_tacticalinsertion::destroy_tactical_insertion(); + continue; + } + + if ( !isalive( entity ) ) + continue; + + if ( isdefined( entity.targetname ) ) + { + if ( entity.targetname == "talon" ) + { + entity notify( "death" ); + continue; + } + else if ( entity.targetname == "rcbomb" ) + { + entity maps\mp\killstreaks\_rcbomb::rcbomb_force_explode(); + continue; + } + else if ( entity.targetname == "riotshield_mp" ) + { + entity dodamage( 1, self.origin + ( 0, 0, 1 ), self, self, 0, "MOD_CRUSH" ); + continue; + } + } + + if ( isdefined( entity.helitype ) && entity.helitype == "qrdrone" ) + { + watcher = entity.owner maps\mp\gametypes\_weaponobjects::getweaponobjectwatcher( "qrdrone" ); + watcher thread maps\mp\gametypes\_weaponobjects::waitanddetonate( entity, 0.0, undefined ); + continue; + } + + if ( entity.classname == "grenade" ) + { + if ( !isdefined( entity.name ) ) + continue; + + if ( !isdefined( entity.owner ) ) + continue; + + if ( entity.name == "satchel_charge_mp" ) + continue; + + if ( entity.name == "proximity_grenade_mp" ) + { + watcher = entity.owner getwatcherforweapon( entity.name ); + watcher thread maps\mp\gametypes\_weaponobjects::waitanddetonate( entity, 0.0, undefined, "script_mover_mp" ); + continue; + } + + if ( !isweaponequipment( entity.name ) ) + continue; + + watcher = entity.owner getwatcherforweapon( entity.name ); + + if ( !isdefined( watcher ) ) + continue; + + watcher thread maps\mp\gametypes\_weaponobjects::waitanddetonate( entity, 0.0, undefined, "script_mover_mp" ); + continue; + } + else if ( entity.classname == "remote_drone" ) + continue; + + if ( entity.classname == "auto_turret" ) + { + if ( isdefined( entity.carried ) && entity.carried == 1 ) + continue; + + if ( !isdefined( entity.damagedtodeath ) || !entity.damagedtodeath ) + entity domaxdamage( self.origin + ( 0, 0, 1 ), self, self, 0, "MOD_CRUSH" ); + + continue; + } + + if ( isplayer( entity ) ) + { + if ( entity getstance() == "prone" ) + { + if ( entity isonground() == 0 ) + destroycorpses = 1; + } + + entity dodamage( entity.health * 2, self.origin + ( 0, 0, 1 ), self, self, 0, "MOD_HIT_BY_OBJECT", 0, "gondola_mp" ); + continue; + } + + entity dodamage( entity.health * 2, self.origin + ( 0, 0, 1 ), self, self, 0, "MOD_CRUSH" ); + } + + if ( destroycorpses == 1 ) + { + destroycorpses = 0; + self destroy_corpses(); + } + + self destroy_supply_crates(); + + if ( level.gametype == "ctf" ) + { + foreach ( flag in level.flags ) + { + if ( flag.curorigin != flag.trigger.baseorigin && flag.visuals[0] istouching( kill_trigger ) ) + flag maps\mp\gametypes\ctf::returnflag(); + } + } + else if ( level.gametype == "sd" && !level.multibomb ) + { + if ( level.sdbomb.visuals[0] istouching( kill_trigger ) ) + level.sdbomb maps\mp\gametypes\_gameobjects::returnhome(); + } + + pixendevent(); + } } getwatcherforweapon( weapname ) { - if ( !isDefined( self ) ) - { - return undefined; - } - if ( !isplayer( self ) ) - { - return undefined; - } - i = 0; - while ( i < self.weaponobjectwatcherarray.size ) - { - if ( self.weaponobjectwatcherarray[ i ].weapon != weapname ) - { - i++; - continue; - } - else - { - return self.weaponobjectwatcherarray[ i ]; - } - i++; - } - return undefined; + if ( !isdefined( self ) ) + return undefined; + + if ( !isplayer( self ) ) + return undefined; + + for ( i = 0; i < self.weaponobjectwatcherarray.size; i++ ) + { + if ( self.weaponobjectwatcherarray[i].weapon != weapname ) + continue; + + return self.weaponobjectwatcherarray[i]; + } + + return undefined; } destroy_supply_crates() { - crates = getentarray( "care_package", "script_noteworthy" ); - _a811 = crates; - _k811 = getFirstArrayKey( _a811 ); - while ( isDefined( _k811 ) ) - { - crate = _a811[ _k811 ]; - if ( distancesquared( crate.origin, self.origin ) < 40000 ) - { - if ( crate istouching( self ) ) - { - playfx( level._supply_drop_explosion_fx, crate.origin ); - playsoundatposition( "wpn_grenade_explode", crate.origin ); - wait 0,1; - crate maps/mp/killstreaks/_supplydrop::cratedelete(); - } - } - _k811 = getNextArrayKey( _a811, _k811 ); - } + crates = getentarray( "care_package", "script_noteworthy" ); + + foreach ( crate in crates ) + { + if ( distancesquared( crate.origin, self.origin ) < 40000 ) + { + if ( crate istouching( self ) ) + { + playfx( level._supply_drop_explosion_fx, crate.origin ); + playsoundatposition( "wpn_grenade_explode", crate.origin ); + wait 0.1; + crate maps\mp\killstreaks\_supplydrop::cratedelete(); + } + } + } } destroy_corpses() { - corpses = getcorpsearray(); - i = 0; - while ( i < corpses.size ) - { - if ( distancesquared( corpses[ i ].origin, self.origin ) < 40000 ) - { - corpses[ i ] delete(); - } - i++; - } + corpses = getcorpsearray(); + + for ( i = 0; i < corpses.size; i++ ) + { + if ( distancesquared( corpses[i].origin, self.origin ) < 40000 ) + corpses[i] delete(); + } } diff --git a/Multiplayer Core/patch_mp/maps/mp/mp_drone.gsc b/Multiplayer Core/patch_mp/maps/mp/mp_drone.gsc index edb9000..9b7c96c 100644 --- a/Multiplayer Core/patch_mp/maps/mp/mp_drone.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/mp_drone.gsc @@ -1,102 +1,102 @@ -//checked includes changed to match cerberus output -#include maps/mp/mp_drone_doors; -#include maps/mp/mp_drone_amb; -#include maps/mp/_load; -#include maps/mp/_compass; -#include maps/mp/mp_drone_fx; -#include maps/mp/_utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\_utility; +#include maps\mp\mp_drone_fx; +#include maps\mp\_compass; +#include maps\mp\_load; +#include maps\mp\mp_drone_amb; +#include maps\mp\mp_drone_doors; -main() //checked changed to match cerberus output +main() { - precachemodel( "fxanim_gp_robot_arm_welder_server_side_mod" ); - level.levelspawndvars = ::levelspawndvars; - welders = []; - welders[ welders.size ] = ( -1339.51, 76.04, 136.11 ); - welders[ welders.size ] = ( -1339.51, -171.9, 136.11 ); - welders[ welders.size ] = ( -1339.51, 559.04, 136.12 ); - welders[ welders.size ] = ( -1339.51, 312.01, 136.12 ); - maps/mp/mp_drone_fx::main(); - precachemodel( "collision_physics_wall_512x512x10" ); - precachemodel( "collision_physics_wall_256x256x10" ); - precachemodel( "collision_physics_256x256x10" ); - precachemodel( "collision_clip_32x32x10" ); - precachemodel( "collision_clip_128x128x10" ); - precachemodel( "collision_physics_128x128x128" ); - precachemodel( "collision_physics_32x32x128" ); - maps/mp/_compass::setupminimap( "compass_map_mp_drone" ); - maps/mp/_load::main(); - maps/mp/mp_drone_amb::main(); - game[ "strings" ][ "war_callsign_a" ] = &"MPUI_CALLSIGN_MAPNAME_A"; - game[ "strings" ][ "war_callsign_b" ] = &"MPUI_CALLSIGN_MAPNAME_B"; - game[ "strings" ][ "war_callsign_c" ] = &"MPUI_CALLSIGN_MAPNAME_C"; - game[ "strings" ][ "war_callsign_d" ] = &"MPUI_CALLSIGN_MAPNAME_D"; - game[ "strings" ][ "war_callsign_e" ] = &"MPUI_CALLSIGN_MAPNAME_E"; - game[ "strings_menu" ][ "war_callsign_a" ] = "@MPUI_CALLSIGN_MAPNAME_A"; - game[ "strings_menu" ][ "war_callsign_b" ] = "@MPUI_CALLSIGN_MAPNAME_B"; - game[ "strings_menu" ][ "war_callsign_c" ] = "@MPUI_CALLSIGN_MAPNAME_C"; - game[ "strings_menu" ][ "war_callsign_d" ] = "@MPUI_CALLSIGN_MAPNAME_D"; - game[ "strings_menu" ][ "war_callsign_e" ] = "@MPUI_CALLSIGN_MAPNAME_E"; - spawncollision( "collision_physics_wall_512x512x10", "collider", ( -3252, -2085, -44 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_wall_512x512x10", "collider", ( -3763, -2085, -44 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_wall_256x256x10", "collider", ( -4146, -2085, 88 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_wall_512x512x10", "collider", ( -2054, -2098, -56 ), ( 0, 0, 0 ) ); - spawncollision( "collision_clip_32x32x10", "collider", ( -1351, -1076, 202 ), ( 5.82444, 91.4567, 105.986 ) ); - spawncollision( "collision_clip_128x128x10", "collider", ( 33.5, -1386.25, 211.5 ), vectorScale( ( 0, 0, -1 ), 90 ) ); - spawncollision( "collision_physics_wall_256x256x10", "collider", ( -923.5, 2180, 366.5 ), vectorScale( ( 0, 1, 0 ), 270 ) ); - spawncollision( "collision_physics_wall_256x256x10", "collider", ( -1050.5, 2303, 366.5 ), vectorScale( ( 0, 1, 0 ), 180 ) ); - spawncollision( "collision_physics_wall_256x256x10", "collider", ( -1306.5, 2303, 366.5 ), vectorScale( ( 0, 1, 0 ), 180 ) ); - spawncollision( "collision_physics_256x256x10", "collider", ( -1046.5, 2180, 489.5 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_256x256x10", "collider", ( -1302.5, 2180, 489.5 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_128x128x128", "collider", ( -1024, 2288, 352 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_32x32x128", "collider", ( -1197.5, 2589, 429.5 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_32x32x128", "collider", ( -1197.5, 2589, 565 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_32x32x128", "collider", ( -1217.5, 2602, 429.5 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_32x32x128", "collider", ( -1217.5, 2602, 565 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_128x128x128", "collider", ( 335, 3507.5, 453 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_128x128x128", "collider", ( 496.5, 3280, 478.5 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_128x128x128", "collider", ( 440, 3272, 432 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_128x128x128", "collider", ( 1109, 347.5, 305.5 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_wall_512x512x10", "collider", ( -1505, 1898, 754.5 ), ( 360, 180, 90.0003 ) ); - spawncollision( "collision_physics_wall_512x512x10", "collider", ( -1505, 2406, 754.5 ), ( 360, 180, 90.0003 ) ); - spawncollision( "collision_physics_wall_512x512x10", "collider", ( -1253.5, 1898, 503.5 ), ( 1, 270, 5.96 ) ); - spawncollision( "collision_physics_wall_512x512x10", "collider", ( -1253.5, 2406, 503.5 ), ( 1, 270, 5.96 ) ); - spawncollision( "collision_physics_wall_512x512x10", "collider", ( -1264.64, 2921.02, 754.5 ), ( 1, 133.4, 90 ) ); - spawncollision( "collision_physics_wall_512x512x10", "collider", ( -1091.83, 2738.29, 503.5 ), ( 1, 223.4, 5.96 ) ); - spawncollision( "collision_physics_wall_512x512x10", "collider", ( -1091.83, 3083.21, 503 ), ( 360, 136.6, -180 ) ); - spawncollision( "collision_physics_wall_512x512x10", "collider", ( -1504.82, 1671.75, 503 ), ( 1, 174.2, -180 ) ); - if ( getgametypesetting( "allowMapScripting" ) ) - { - level maps/mp/mp_drone_doors::init(); - } - level.remotemotarviewleft = 35; - level.remotemotarviewright = 35; - level.remotemotarviewup = 18; - setheliheightpatchenabled( "war_mode_heli_height_lock", 0 ); - geo_changes(); - foreach ( welder in welders ) - { - collision = spawn( "script_model", welder ); - collision setmodel( "fxanim_gp_robot_arm_welder_server_side_mod" ); - } + precachemodel( "fxanim_gp_robot_arm_welder_server_side_mod" ); + level.levelspawndvars = ::levelspawndvars; + welders = []; + welders[welders.size] = ( -1339.51, 76.04, 136.11 ); + welders[welders.size] = ( -1339.51, -171.9, 136.11 ); + welders[welders.size] = ( -1339.51, 559.04, 136.12 ); + welders[welders.size] = ( -1339.51, 312.01, 136.12 ); + maps\mp\mp_drone_fx::main(); + precachemodel( "collision_physics_wall_512x512x10" ); + precachemodel( "collision_physics_wall_256x256x10" ); + precachemodel( "collision_physics_256x256x10" ); + precachemodel( "collision_clip_32x32x10" ); + precachemodel( "collision_clip_128x128x10" ); + precachemodel( "collision_physics_128x128x128" ); + precachemodel( "collision_physics_32x32x128" ); + maps\mp\_compass::setupminimap( "compass_map_mp_drone" ); + maps\mp\_load::main(); + maps\mp\mp_drone_amb::main(); + game["strings"]["war_callsign_a"] = &"MPUI_CALLSIGN_MAPNAME_A"; + game["strings"]["war_callsign_b"] = &"MPUI_CALLSIGN_MAPNAME_B"; + game["strings"]["war_callsign_c"] = &"MPUI_CALLSIGN_MAPNAME_C"; + game["strings"]["war_callsign_d"] = &"MPUI_CALLSIGN_MAPNAME_D"; + game["strings"]["war_callsign_e"] = &"MPUI_CALLSIGN_MAPNAME_E"; + game["strings_menu"]["war_callsign_a"] = "@MPUI_CALLSIGN_MAPNAME_A"; + game["strings_menu"]["war_callsign_b"] = "@MPUI_CALLSIGN_MAPNAME_B"; + game["strings_menu"]["war_callsign_c"] = "@MPUI_CALLSIGN_MAPNAME_C"; + game["strings_menu"]["war_callsign_d"] = "@MPUI_CALLSIGN_MAPNAME_D"; + game["strings_menu"]["war_callsign_e"] = "@MPUI_CALLSIGN_MAPNAME_E"; + spawncollision( "collision_physics_wall_512x512x10", "collider", ( -3252, -2085, -44 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_wall_512x512x10", "collider", ( -3763, -2085, -44 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_wall_256x256x10", "collider", ( -4146, -2085, 88 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_wall_512x512x10", "collider", ( -2054, -2098, -56 ), ( 0, 0, 0 ) ); + spawncollision( "collision_clip_32x32x10", "collider", ( -1351, -1076, 202 ), ( 5.82444, 91.4567, 105.986 ) ); + spawncollision( "collision_clip_128x128x10", "collider", ( 33.5, -1386.25, 211.5 ), vectorscale( ( 0, 0, -1 ), 90.0 ) ); + spawncollision( "collision_physics_wall_256x256x10", "collider", ( -923.5, 2180, 366.5 ), vectorscale( ( 0, 1, 0 ), 270.0 ) ); + spawncollision( "collision_physics_wall_256x256x10", "collider", ( -1050.5, 2303, 366.5 ), vectorscale( ( 0, 1, 0 ), 180.0 ) ); + spawncollision( "collision_physics_wall_256x256x10", "collider", ( -1306.5, 2303, 366.5 ), vectorscale( ( 0, 1, 0 ), 180.0 ) ); + spawncollision( "collision_physics_256x256x10", "collider", ( -1046.5, 2180, 489.5 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_256x256x10", "collider", ( -1302.5, 2180, 489.5 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_128x128x128", "collider", ( -1024, 2288, 352 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_32x32x128", "collider", ( -1197.5, 2589, 429.5 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_32x32x128", "collider", ( -1197.5, 2589, 565 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_32x32x128", "collider", ( -1217.5, 2602, 429.5 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_32x32x128", "collider", ( -1217.5, 2602, 565 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_128x128x128", "collider", ( 335, 3507.5, 453 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_128x128x128", "collider", ( 496.5, 3280, 478.5 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_128x128x128", "collider", ( 440, 3272, 432 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_128x128x128", "collider", ( 1109, 347.5, 305.5 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_wall_512x512x10", "collider", ( -1505, 1898, 754.5 ), ( 360, 180, 90.0003 ) ); + spawncollision( "collision_physics_wall_512x512x10", "collider", ( -1505, 2406, 754.5 ), ( 360, 180, 90.0003 ) ); + spawncollision( "collision_physics_wall_512x512x10", "collider", ( -1253.5, 1898, 503.5 ), ( 1.0, 270, 5.96 ) ); + spawncollision( "collision_physics_wall_512x512x10", "collider", ( -1253.5, 2406, 503.5 ), ( 1.0, 270, 5.96 ) ); + spawncollision( "collision_physics_wall_512x512x10", "collider", ( -1264.64, 2921.02, 754.5 ), ( 1.0, 133.4, 90 ) ); + spawncollision( "collision_physics_wall_512x512x10", "collider", ( -1091.83, 2738.29, 503.5 ), ( 1.0, 223.4, 5.96 ) ); + spawncollision( "collision_physics_wall_512x512x10", "collider", ( -1091.83, 3083.21, 503 ), ( 360, 136.6, -180 ) ); + spawncollision( "collision_physics_wall_512x512x10", "collider", ( -1504.82, 1671.75, 503 ), ( 1.0, 174.2, -180 ) ); + + if ( getgametypesetting( "allowMapScripting" ) ) + level maps\mp\mp_drone_doors::init(); + + level.remotemotarviewleft = 35; + level.remotemotarviewright = 35; + level.remotemotarviewup = 18; + setheliheightpatchenabled( "war_mode_heli_height_lock", 0 ); + geo_changes(); + + foreach ( welder in welders ) + { + collision = spawn( "script_model", welder ); + collision setmodel( "fxanim_gp_robot_arm_welder_server_side_mod" ); + } } -levelspawndvars( reset_dvars ) //checked matches cerberus output +levelspawndvars( reset_dvars ) { - ss = level.spawnsystem; - ss.enemy_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_radius", "2600", reset_dvars ); + ss = level.spawnsystem; + ss.enemy_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_radius", "2600", reset_dvars ); } -geo_changes() //checked changed to match cerberus output +geo_changes() { - rts_floor = getent( "overwatch_floor", "targetname" ); - if ( isDefined( rts_floor ) ) - { - rts_floor delete(); - } - removes = getentarray( "rts_only", "targetname" ); - foreach ( removal in removes ) - { - removal delete(); - } -} + rts_floor = getent( "overwatch_floor", "targetname" ); + if ( isdefined( rts_floor ) ) + rts_floor delete(); + + removes = getentarray( "rts_only", "targetname" ); + + foreach ( removal in removes ) + removal delete(); +} diff --git a/Multiplayer Core/patch_mp/maps/mp/mp_express.gsc b/Multiplayer Core/patch_mp/maps/mp/mp_express.gsc index 6a61642..f576f0d 100644 --- a/Multiplayer Core/patch_mp/maps/mp/mp_express.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/mp_express.gsc @@ -1,80 +1,75 @@ -//checked includes match cerberus output -#include maps/mp/mp_express_train; -#include maps/mp/mp_express_amb; -#include maps/mp/_compass; -#include maps/mp/_load; -#include maps/mp/mp_express_fx; -#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\mp_express_fx; +#include maps\mp\_load; +#include maps\mp\_compass; +#include maps\mp\mp_express_amb; +#include maps\mp\mp_express_train; -main() //checked does not match cerberus output or beta dump did not change +main() { - level.levelspawndvars = ::levelspawndvars; - maps/mp/mp_express_fx::main(); - precachemodel( "collision_physics_cylinder_32x128" ); - maps/mp/_load::main(); - maps/mp/_compass::setupminimap( "compass_map_mp_express" ); - maps/mp/mp_express_amb::main(); - game[ "strings" ][ "war_callsign_a" ] = &"MPUI_CALLSIGN_MAPNAME_A"; - game[ "strings" ][ "war_callsign_b" ] = &"MPUI_CALLSIGN_MAPNAME_B"; - game[ "strings" ][ "war_callsign_c" ] = &"MPUI_CALLSIGN_MAPNAME_C"; - game[ "strings" ][ "war_callsign_d" ] = &"MPUI_CALLSIGN_MAPNAME_D"; - game[ "strings" ][ "war_callsign_e" ] = &"MPUI_CALLSIGN_MAPNAME_E"; - game[ "strings_menu" ][ "war_callsign_a" ] = "@MPUI_CALLSIGN_MAPNAME_A"; - game[ "strings_menu" ][ "war_callsign_b" ] = "@MPUI_CALLSIGN_MAPNAME_B"; - game[ "strings_menu" ][ "war_callsign_c" ] = "@MPUI_CALLSIGN_MAPNAME_C"; - game[ "strings_menu" ][ "war_callsign_d" ] = "@MPUI_CALLSIGN_MAPNAME_D"; - game[ "strings_menu" ][ "war_callsign_e" ] = "@MPUI_CALLSIGN_MAPNAME_E"; - spawncollision( "collision_physics_cylinder_32x128", "collider", ( 200.735, 759.059, 136 ), ( 0, 248.6, 90 ) ); - spawncollision( "collision_physics_cylinder_32x128", "collider", ( 229.73, 748.06, 151 ), ( 0, 248.6, 90 ) ); - spawncollision( "collision_physics_cylinder_32x128", "collider", ( 379.816, 1141.39, 136 ), ( 0, 244.8, 90 ) ); - spawncollision( "collision_physics_cylinder_32x128", "collider", ( 408.023, 1128.5, 151 ), ( 0, 244.8, 90 ) ); - registerclientfield( "vehicle", "train_moving", 1, 1, "int" ); - registerclientfield( "scriptmover", "train_moving", 1, 1, "int" ); - if ( getgametypesetting( "allowMapScripting" ) ) - { - level thread maps/mp/mp_express_train::init(); - } - /* + level.levelspawndvars = ::levelspawndvars; + maps\mp\mp_express_fx::main(); + precachemodel( "collision_physics_cylinder_32x128" ); + maps\mp\_load::main(); + maps\mp\_compass::setupminimap( "compass_map_mp_express" ); + maps\mp\mp_express_amb::main(); + game["strings"]["war_callsign_a"] = &"MPUI_CALLSIGN_MAPNAME_A"; + game["strings"]["war_callsign_b"] = &"MPUI_CALLSIGN_MAPNAME_B"; + game["strings"]["war_callsign_c"] = &"MPUI_CALLSIGN_MAPNAME_C"; + game["strings"]["war_callsign_d"] = &"MPUI_CALLSIGN_MAPNAME_D"; + game["strings"]["war_callsign_e"] = &"MPUI_CALLSIGN_MAPNAME_E"; + game["strings_menu"]["war_callsign_a"] = "@MPUI_CALLSIGN_MAPNAME_A"; + game["strings_menu"]["war_callsign_b"] = "@MPUI_CALLSIGN_MAPNAME_B"; + game["strings_menu"]["war_callsign_c"] = "@MPUI_CALLSIGN_MAPNAME_C"; + game["strings_menu"]["war_callsign_d"] = "@MPUI_CALLSIGN_MAPNAME_D"; + game["strings_menu"]["war_callsign_e"] = "@MPUI_CALLSIGN_MAPNAME_E"; + spawncollision( "collision_physics_cylinder_32x128", "collider", ( 200.735, 759.059, 136 ), ( 0, 248.6, 90 ) ); + spawncollision( "collision_physics_cylinder_32x128", "collider", ( 229.73, 748.06, 151 ), ( 0, 248.6, 90 ) ); + spawncollision( "collision_physics_cylinder_32x128", "collider", ( 379.816, 1141.39, 136 ), ( 0, 244.8, 90 ) ); + spawncollision( "collision_physics_cylinder_32x128", "collider", ( 408.023, 1128.5, 151 ), ( 0, 244.8, 90 ) ); + registerclientfield( "vehicle", "train_moving", 1, 1, "int" ); + registerclientfield( "scriptmover", "train_moving", 1, 1, "int" ); + + if ( getgametypesetting( "allowMapScripting" ) ) + level thread maps\mp\mp_express_train::init(); /# - level thread devgui_express(); - execdevgui( "devgui_mp_express" ); + level thread devgui_express(); + execdevgui( "devgui_mp_express" ); #/ - */ } -levelspawndvars( reset_dvars ) //checked matches cerberus output +levelspawndvars( reset_dvars ) { - ss = level.spawnsystem; - ss.enemy_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_radius", "1900", reset_dvars ); + ss = level.spawnsystem; + ss.enemy_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_radius", "1900", reset_dvars ); } -devgui_express() //checked changed to match cerberus output +devgui_express() { - /* /# - setdvar( "devgui_notify", "" ); - for ( ;; ) - { - wait 0.5; - devgui_string = getDvar( "devgui_notify" ); - switch( devgui_string ) - { - case "": - break; - case "train_start": - level notify( "train_start" ); - break; - default: - break; - } - if ( getDvar( "devgui_notify" ) != "" ) - { - setdvar( "devgui_notify", "" ); - } -#/ - } - } - */ -} + setdvar( "devgui_notify", "" ); + for (;;) + { + wait 0.5; + devgui_string = getdvar( "devgui_notify" ); + + switch ( devgui_string ) + { + case "": + break; + case "train_start": + level notify( "train_start" ); + break; + default: + break; + } + + if ( getdvar( "devgui_notify" ) != "" ) + setdvar( "devgui_notify", "" ); + } +#/ +} diff --git a/Multiplayer Core/patch_mp/maps/mp/mp_express_train.gsc b/Multiplayer Core/patch_mp/maps/mp/mp_express_train.gsc index 9dc7e17..3e4eb15 100644 --- a/Multiplayer Core/patch_mp/maps/mp/mp_express_train.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/mp_express_train.gsc @@ -1,677 +1,585 @@ -#include maps/mp/killstreaks/_supplydrop; -#include maps/mp/gametypes/_gameobjects; -#include maps/mp/gametypes/ctf; -#include maps/mp/gametypes/_weaponobjects; -#include maps/mp/killstreaks/_rcbomb; -#include maps/mp/_tacticalinsertion; -#include maps/mp/_events; -#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\_events; +#include maps\mp\_tacticalinsertion; +#include maps\mp\killstreaks\_rcbomb; +#include maps\mp\gametypes\_weaponobjects; +#include maps\mp\gametypes\ctf; +#include maps\mp\gametypes\_gameobjects; +#include maps\mp\killstreaks\_supplydrop; init() { - precachevehicle( "express_train_engine_mp" ); - precachemodel( "p6_bullet_train_car_phys" ); - precachemodel( "p6_bullet_train_engine_rev" ); - precacheshader( "compass_train_carriage" ); - precachestring( &"traincar" ); - precachestring( &"trainengine" ); - gates = getentarray( "train_gate_rail", "targetname" ); - brushes = getentarray( "train_gate_rail_brush", "targetname" ); - triggers = getentarray( "train_gate_kill_trigger", "targetname" ); - traintriggers = getentarray( "train_kill_trigger", "targetname" ); - _a22 = brushes; - _k22 = getFirstArrayKey( _a22 ); - while ( isDefined( _k22 ) ) - { - brush = _a22[ _k22 ]; - brush disconnectpaths(); - _k22 = getNextArrayKey( _a22, _k22 ); - } - waittime = 0,05; - _a28 = gates; - _k28 = getFirstArrayKey( _a28 ); - while ( isDefined( _k28 ) ) - { - gate = _a28[ _k28 ]; - gate.waittime = waittime; - waittime += 0,05; - gate.og_origin = gate.origin; - brush = getclosest( gate.origin, brushes ); - brush linkto( gate ); - gate.kill_trigger = getclosest( gate.origin, triggers ); - if ( isDefined( gate.kill_trigger ) ) - { - gate.kill_trigger enablelinkto(); - gate.kill_trigger linkto( gate ); - } - _k28 = getNextArrayKey( _a28, _k28 ); - } - start = getvehiclenode( "train_start", "targetname" ); - endgates = getentarray( "train_gate_rail_end", "targetname" ); - entrygate = getclosest( start.origin, endgates ); - i = 0; - while ( i < endgates.size ) - { - if ( endgates[ i ] == entrygate ) - { - i++; - continue; - } - else - { - exitgate = endgates[ i ]; - break; - } - i++; - } - cars = []; - cars[ 0 ] = spawnvehicle( "p6_bullet_train_engine_phys", "train", "express_train_engine_mp", start.origin, ( 0, 0, 1 ) ); - cars[ 0 ] ghost(); - cars[ 0 ] setcheapflag( 1 ); - cars[ 0 ].ismagicbullet = 1; - killcam = spawn( "script_model", cars[ 0 ].origin + vectorScale( ( 0, 0, 1 ), 25 ) ); - killcam.angles = cars[ 0 ].angles + vectorScale( ( 0, 0, 1 ), 10 ); - killcam linkto( cars[ 0 ] ); - _a69 = traintriggers; - _k69 = getFirstArrayKey( _a69 ); - while ( isDefined( _k69 ) ) - { - traintrigger = _a69[ _k69 ]; - cars[ 0 ].trainkilltrigger = traintrigger; - traintrigger.origin = start.origin; - traintrigger enablelinkto(); - traintrigger linkto( cars[ 0 ] ); - _k69 = getNextArrayKey( _a69, _k69 ); - } - i = 1; - while ( i < 20 ) - { - cars[ i ] = spawn( "script_model", start.origin ); - cars[ i ] setmodel( "p6_bullet_train_car_phys" ); - cars[ i ] ghost(); - cars[ i ] setcheapflag( 1 ); - i++; - } - cars[ 20 ] = spawn( "script_model", start.origin ); - cars[ 20 ] setmodel( "p6_bullet_train_engine_rev" ); - cars[ 20 ] ghost(); - cars[ 20 ] setcheapflag( 1 ); - waittillframeend; - if ( level.timelimit ) - { - seconds = level.timelimit * 60; - add_timed_event( int( seconds * 0,25 ), "train_start" ); - add_timed_event( int( seconds * 0,75 ), "train_start" ); - } - else - { - if ( level.scorelimit ) - { - add_score_event( int( level.scorelimit * 0,25 ), "train_start" ); - add_score_event( int( level.scorelimit * 0,75 ), "train_start" ); - } - } - level thread train_think( gates, entrygate, exitgate, cars, start, killcam ); + precachevehicle( "express_train_engine_mp" ); + precachemodel( "p6_bullet_train_car_phys" ); + precachemodel( "p6_bullet_train_engine_rev" ); + precacheshader( "compass_train_carriage" ); + precachestring( &"traincar" ); + precachestring( &"trainengine" ); + gates = getentarray( "train_gate_rail", "targetname" ); + brushes = getentarray( "train_gate_rail_brush", "targetname" ); + triggers = getentarray( "train_gate_kill_trigger", "targetname" ); + traintriggers = getentarray( "train_kill_trigger", "targetname" ); + + foreach ( brush in brushes ) + brush disconnectpaths(); + + waittime = 0.05; + + foreach ( gate in gates ) + { + gate.waittime = waittime; + waittime += 0.05; + gate.og_origin = gate.origin; + brush = getclosest( gate.origin, brushes ); + brush linkto( gate ); + gate.kill_trigger = getclosest( gate.origin, triggers ); + + if ( isdefined( gate.kill_trigger ) ) + { + gate.kill_trigger enablelinkto(); + gate.kill_trigger linkto( gate ); + } + } + + start = getvehiclenode( "train_start", "targetname" ); + endgates = getentarray( "train_gate_rail_end", "targetname" ); + entrygate = getclosest( start.origin, endgates ); + + for ( i = 0; i < endgates.size; i++ ) + { + if ( endgates[i] == entrygate ) + continue; + + exitgate = endgates[i]; + break; + } + + cars = []; + cars[0] = spawnvehicle( "p6_bullet_train_engine_phys", "train", "express_train_engine_mp", start.origin, ( 0, 0, 0 ) ); + cars[0] ghost(); + cars[0] setcheapflag( 1 ); + cars[0].ismagicbullet = 1; + killcam = spawn( "script_model", cars[0].origin + vectorscale( ( 0, 0, 1 ), 25.0 ) ); + killcam.angles = cars[0].angles + vectorscale( ( 0, -1, 0 ), 10.0 ); + killcam linkto( cars[0] ); + + foreach ( traintrigger in traintriggers ) + { + cars[0].trainkilltrigger = traintrigger; + traintrigger.origin = start.origin; + traintrigger enablelinkto(); + traintrigger linkto( cars[0] ); + } + + for ( i = 1; i < 20; i++ ) + { + cars[i] = spawn( "script_model", start.origin ); + cars[i] setmodel( "p6_bullet_train_car_phys" ); + cars[i] ghost(); + cars[i] setcheapflag( 1 ); + } + + cars[20] = spawn( "script_model", start.origin ); + cars[20] setmodel( "p6_bullet_train_engine_rev" ); + cars[20] ghost(); + cars[20] setcheapflag( 1 ); + waittillframeend; + + if ( level.timelimit ) + { + seconds = level.timelimit * 60; + add_timed_event( int( seconds * 0.25 ), "train_start" ); + add_timed_event( int( seconds * 0.75 ), "train_start" ); + } + else if ( level.scorelimit ) + { + add_score_event( int( level.scorelimit * 0.25 ), "train_start" ); + add_score_event( int( level.scorelimit * 0.75 ), "train_start" ); + } + + level thread train_think( gates, entrygate, exitgate, cars, start, killcam ); } showaftertime( time ) { - wait time; - self show(); + wait( time ); + self show(); } train_think( gates, entrygate, exitgate, cars, start, killcam ) { - level endon( "game_ended" ); - for ( ;; ) - { - level waittill( "train_start" ); - entrygate gate_move( -172 ); - traintiming = getdvarfloatdefault( "scr_express_trainTiming", 4 ); - exitgate thread waitthenmove( traintiming, -172 ); - array_func( gates, ::gate_move, -172 ); - _a127 = gates; - _k127 = getFirstArrayKey( _a127 ); - while ( isDefined( _k127 ) ) - { - gate = _a127[ _k127 ]; - gate playloopsound( "amb_train_incomming_beep" ); - gate playsound( "amb_gate_move" ); - _k127 = getNextArrayKey( _a127, _k127 ); - } - gatedownwait = getdvarintdefault( "scr_express_gateDownWait", 2 ); - wait gatedownwait; - _a135 = gates; - _k135 = getFirstArrayKey( _a135 ); - while ( isDefined( _k135 ) ) - { - gate = _a135[ _k135 ]; - gate stoploopsound( 2 ); - _k135 = getNextArrayKey( _a135, _k135 ); - } - wait 2; - cars[ 0 ] attachpath( start ); - cars[ 0 ].killcament = undefined; - if ( isDefined( cars[ 0 ].trainkilltrigger ) ) - { - cars[ 0 ] thread train_move_think( cars[ 0 ].trainkilltrigger ); - } - cars[ 0 ] startpath(); - cars[ 0 ] showaftertime( 0,2 ); - cars[ 0 ] thread record_positions(); - cars[ 0 ] thread watch_end(); - cars[ 0 ] playloopsound( "amb_train_lp" ); - cars[ 0 ] setclientfield( "train_moving", 1 ); - cars[ 0 ] thread watch_player_touch(); - killcam.starttime = getTime(); - cars[ 0 ].killcament = killcam; - next = "_b"; - i = 1; - while ( i < cars.size ) - { - if ( i == 1 ) - { - wait 0,4; - } - else - { - wait 0,35; - } - if ( i >= 3 && ( i % 3 ) == 0 ) - { - cars[ i ] playloopsound( "amb_train_lp" + next ); - switch( next ) - { - case "_b": - next = "_c"; - break; - break; - case "_c": - next = "_d"; - break; - break; - case "_d": - next = ""; - break; - break; - default: - next = "_b"; - break; - break; - } - } - cars[ i ] thread watch_player_touch(); - if ( i == ( cars.size - 1 ) ) - { - cars[ i ] thread car_move(); - i++; - continue; - } - else - { - cars[ i ] thread car_move(); - } - i++; - } - traintiming = getdvarfloatdefault( "scr_express_trainTiming2", 2 ); - entrygate thread waitthenmove( traintiming ); - gateupwait = getdvarfloatdefault( "scr_express_gateUpWait", 6,5 ); - wait gateupwait; - exitgate gate_move(); - array_func( gates, ::gate_move ); - _a217 = gates; - _k217 = getFirstArrayKey( _a217 ); - while ( isDefined( _k217 ) ) - { - gate = _a217[ _k217 ]; - gate playsound( "amb_gate_move" ); - _k217 = getNextArrayKey( _a217, _k217 ); - } - wait 6; - } + level endon( "game_ended" ); + + for (;;) + { + level waittill( "train_start" ); + + entrygate gate_move( -172 ); + traintiming = getdvarfloatdefault( "scr_express_trainTiming", 4.0 ); + exitgate thread waitthenmove( traintiming, -172 ); + array_func( gates, ::gate_move, -172 ); + + foreach ( gate in gates ) + { + gate playloopsound( "amb_train_incomming_beep" ); + gate playsound( "amb_gate_move" ); + } + + gatedownwait = getdvarintdefault( "scr_express_gateDownWait", 2 ); + wait( gatedownwait ); + + foreach ( gate in gates ) + gate stoploopsound( 2 ); + + wait 2; + cars[0] attachpath( start ); + cars[0].killcament = undefined; + + if ( isdefined( cars[0].trainkilltrigger ) ) + cars[0] thread train_move_think( cars[0].trainkilltrigger ); + + cars[0] startpath(); + cars[0] showaftertime( 0.2 ); + cars[0] thread record_positions(); + cars[0] thread watch_end(); + cars[0] playloopsound( "amb_train_lp" ); + cars[0] setclientfield( "train_moving", 1 ); + cars[0] thread watch_player_touch(); + killcam.starttime = gettime(); + cars[0].killcament = killcam; + next = "_b"; + + for ( i = 1; i < cars.size; i++ ) + { + if ( i == 1 ) + wait 0.4; + else + wait 0.35; + + if ( i >= 3 && i % 3 == 0 ) + { + cars[i] playloopsound( "amb_train_lp" + next ); + + switch ( next ) + { + case "_b": + next = "_c"; + break; + case "_c": + next = "_d"; + break; + case "_d": + next = ""; + break; + default: + next = "_b"; + break; + } + } + + cars[i] thread watch_player_touch(); + + if ( i == cars.size - 1 ) + { + cars[i] thread car_move(); + continue; + } + + cars[i] thread car_move(); + } + + traintiming = getdvarfloatdefault( "scr_express_trainTiming2", 2.0 ); + entrygate thread waitthenmove( traintiming ); + gateupwait = getdvarfloatdefault( "scr_express_gateUpWait", 6.5 ); + wait( gateupwait ); + exitgate gate_move(); + array_func( gates, ::gate_move ); + + foreach ( gate in gates ) + gate playsound( "amb_gate_move" ); + + wait 6; + } } waitthenmove( time, distance ) { - wait time; - self gate_move( distance ); + wait( time ); + self gate_move( distance ); } record_positions() { - self endon( "reached_end_node" ); - if ( isDefined( level.train_positions ) ) - { - return; - } - level.train_positions = []; - level.train_angles = []; - for ( ;; ) - { - level.train_positions[ level.train_positions.size ] = self.origin; - level.train_angles[ level.train_angles.size ] = self.angles; - wait 0,05; - } + self endon( "reached_end_node" ); + + if ( isdefined( level.train_positions ) ) + return; + + level.train_positions = []; + level.train_angles = []; + + for (;;) + { + level.train_positions[level.train_positions.size] = self.origin; + level.train_angles[level.train_angles.size] = self.angles; + wait 0.05; + } } watch_player_touch() { - self endon( "end_of_track" ); - self endon( "delete" ); - self endon( "death" ); - self.disablefinalkillcam = 1; - for ( ;; ) - { - self waittill( "touch", entity ); - if ( isplayer( entity ) ) - { - entity dodamage( entity.health * 2, self.origin + ( 0, 0, 1 ), self, self, 0, "MOD_CRUSH" ); - } - } + self endon( "end_of_track" ); + self endon( "delete" ); + self endon( "death" ); + self.disablefinalkillcam = 1; + + for (;;) + { + self waittill( "touch", entity ); + + if ( isplayer( entity ) ) + entity dodamage( entity.health * 2, self.origin + ( 0, 0, 1 ), self, self, 0, "MOD_CRUSH" ); + } } watch_end() { - self waittill( "reached_end_node" ); - self ghost(); - self setclientfield( "train_moving", 0 ); - self stoploopsound( 0,2 ); - self playsound( "amb_train_end" ); + self waittill( "reached_end_node" ); + + self ghost(); + self setclientfield( "train_moving", 0 ); + self stoploopsound( 0.2 ); + self playsound( "amb_train_end" ); } car_move() { - self setclientfield( "train_moving", 1 ); - i = 0; - while ( i < level.train_positions.size ) - { - self.origin = level.train_positions[ i ]; - self.angles = level.train_angles[ i ]; - wait 0,05; - if ( i == 4 ) - { - self show(); - } - i++; - } - self notify( "end_of_track" ); - self ghost(); - self setclientfield( "train_moving", 0 ); - self stoploopsound( 0,2 ); - self playsound( "amb_train_end" ); + self setclientfield( "train_moving", 1 ); + + for ( i = 0; i < level.train_positions.size; i++ ) + { + self.origin = level.train_positions[i]; + self.angles = level.train_angles[i]; + wait 0.05; + + if ( i == 4 ) + self show(); + } + + self notify( "end_of_track" ); + self ghost(); + self setclientfield( "train_moving", 0 ); + self stoploopsound( 0.2 ); + self playsound( "amb_train_end" ); } gate_rotate( yaw ) { - self rotateyaw( yaw, 5 ); + self rotateyaw( yaw, 5 ); } gate_move( z_dist ) { - if ( isDefined( self.kill_trigger ) ) - { - self thread gate_move_think( isDefined( z_dist ) ); - } - if ( !isDefined( z_dist ) ) - { - self moveto( self.og_origin, 5 ); - } - else - { - self.og_origin = self.origin; - self movez( z_dist, 5 ); - } + if ( isdefined( self.kill_trigger ) ) + self thread gate_move_think( isdefined( z_dist ) ); + + if ( !isdefined( z_dist ) ) + self moveto( self.og_origin, 5 ); + else + { + self.og_origin = self.origin; + self movez( z_dist, 5 ); + } } train_move_think( kill_trigger ) { - self endon( "movedone" ); - self endon( "reached_end_node" ); - for ( ;; ) - { - wait 0,05; - pixbeginevent( "train_move_think" ); - entities = getdamageableentarray( self.origin, 200 ); - _a341 = entities; - _k341 = getFirstArrayKey( _a341 ); - while ( isDefined( _k341 ) ) - { - entity = _a341[ _k341 ]; - if ( isDefined( entity.targetname ) && entity.targetname == "train" ) - { - } - else - { - if ( isplayer( entity ) ) - { - break; - } - else if ( !entity istouching( kill_trigger ) ) - { - break; - } - else if ( isDefined( entity.model ) && entity.model == "t6_wpn_tac_insert_world" ) - { - entity maps/mp/_tacticalinsertion::destroy_tactical_insertion(); - break; - } - else - { - if ( !isalive( entity ) ) - { - break; - } - else if ( isDefined( entity.targetname ) ) - { - if ( entity.targetname == "talon" ) - { - entity notify( "death" ); - break; - } - else if ( entity.targetname == "rcbomb" ) - { - entity maps/mp/killstreaks/_rcbomb::rcbomb_force_explode(); - break; - } - else if ( entity.targetname == "riotshield_mp" ) - { - entity dodamage( 1, self.origin + ( 0, 0, 1 ), self, self, 0, "MOD_CRUSH" ); - break; - } - } - else if ( isDefined( entity.helitype ) && entity.helitype == "qrdrone" ) - { - watcher = entity.owner maps/mp/gametypes/_weaponobjects::getweaponobjectwatcher( "qrdrone" ); - watcher thread maps/mp/gametypes/_weaponobjects::waitanddetonate( entity, 0, undefined ); - break; - } - else - { - if ( entity.classname == "grenade" ) - { - if ( !isDefined( entity.name ) ) - { - break; - } - else if ( !isDefined( entity.owner ) ) - { - break; - } - else if ( entity.name == "proximity_grenade_mp" ) - { - watcher = entity.owner getwatcherforweapon( entity.name ); - watcher thread maps/mp/gametypes/_weaponobjects::waitanddetonate( entity, 0, undefined, "script_mover_mp" ); - break; - } - else if ( !isweaponequipment( entity.name ) ) - { - break; - } - else watcher = entity.owner getwatcherforweapon( entity.name ); - if ( !isDefined( watcher ) ) - { - break; - } - else watcher thread maps/mp/gametypes/_weaponobjects::waitanddetonate( entity, 0, undefined, "script_mover_mp" ); - break; - } - else if ( entity.classname == "auto_turret" ) - { - if ( isDefined( entity.carried ) && entity.carried == 1 ) - { - break; - } - else - { - if ( !isDefined( entity.damagedtodeath ) || !entity.damagedtodeath ) - { - entity domaxdamage( self.origin + ( 0, 0, 1 ), self, self, 0, "MOD_CRUSH" ); - } - break; - } - else - { - entity dodamage( entity.health * 2, self.origin + ( 0, 0, 1 ), self, self, 0, "MOD_CRUSH" ); - } - } - } - } - } - _k341 = getNextArrayKey( _a341, _k341 ); - } - self destroy_supply_crates(); - if ( level.gametype == "ctf" ) - { - _a452 = level.flags; - _k452 = getFirstArrayKey( _a452 ); - while ( isDefined( _k452 ) ) - { - flag = _a452[ _k452 ]; - if ( flag.curorigin != flag.trigger.baseorigin && flag.visuals[ 0 ] istouching( kill_trigger ) ) - { - flag maps/mp/gametypes/ctf::returnflag(); - } - _k452 = getNextArrayKey( _a452, _k452 ); - } - } - else if ( level.gametype == "sd" && !level.multibomb ) - { - if ( level.sdbomb.visuals[ 0 ] istouching( kill_trigger ) ) - { - level.sdbomb maps/mp/gametypes/_gameobjects::returnhome(); - } - } - pixendevent(); - } + self endon( "movedone" ); + self endon( "reached_end_node" ); + + for (;;) + { + wait 0.05; + pixbeginevent( "train_move_think" ); + entities = getdamageableentarray( self.origin, 200 ); + + foreach ( entity in entities ) + { + if ( isdefined( entity.targetname ) && entity.targetname == "train" ) + continue; + + if ( isplayer( entity ) ) + continue; + + if ( !entity istouching( kill_trigger ) ) + continue; + + if ( isdefined( entity.model ) && entity.model == "t6_wpn_tac_insert_world" ) + { + entity maps\mp\_tacticalinsertion::destroy_tactical_insertion(); + continue; + } + + if ( !isalive( entity ) ) + continue; + + if ( isdefined( entity.targetname ) ) + { + if ( entity.targetname == "talon" ) + { + entity notify( "death" ); + continue; + } + else if ( entity.targetname == "rcbomb" ) + { + entity maps\mp\killstreaks\_rcbomb::rcbomb_force_explode(); + continue; + } + else if ( entity.targetname == "riotshield_mp" ) + { + entity dodamage( 1, self.origin + ( 0, 0, 1 ), self, self, 0, "MOD_CRUSH" ); + continue; + } + } + + if ( isdefined( entity.helitype ) && entity.helitype == "qrdrone" ) + { + watcher = entity.owner maps\mp\gametypes\_weaponobjects::getweaponobjectwatcher( "qrdrone" ); + watcher thread maps\mp\gametypes\_weaponobjects::waitanddetonate( entity, 0.0, undefined ); + continue; + } + + if ( entity.classname == "grenade" ) + { + if ( !isdefined( entity.name ) ) + continue; + + if ( !isdefined( entity.owner ) ) + continue; + + if ( entity.name == "proximity_grenade_mp" ) + { + watcher = entity.owner getwatcherforweapon( entity.name ); + watcher thread maps\mp\gametypes\_weaponobjects::waitanddetonate( entity, 0.0, undefined, "script_mover_mp" ); + continue; + } + + if ( !isweaponequipment( entity.name ) ) + continue; + + watcher = entity.owner getwatcherforweapon( entity.name ); + + if ( !isdefined( watcher ) ) + continue; + + watcher thread maps\mp\gametypes\_weaponobjects::waitanddetonate( entity, 0.0, undefined, "script_mover_mp" ); + continue; + } + + if ( entity.classname == "auto_turret" ) + { + if ( isdefined( entity.carried ) && entity.carried == 1 ) + continue; + + if ( !isdefined( entity.damagedtodeath ) || !entity.damagedtodeath ) + entity domaxdamage( self.origin + ( 0, 0, 1 ), self, self, 0, "MOD_CRUSH" ); + + continue; + } + + entity dodamage( entity.health * 2, self.origin + ( 0, 0, 1 ), self, self, 0, "MOD_CRUSH" ); + } + + self destroy_supply_crates(); + + if ( level.gametype == "ctf" ) + { + foreach ( flag in level.flags ) + { + if ( flag.curorigin != flag.trigger.baseorigin && flag.visuals[0] istouching( kill_trigger ) ) + flag maps\mp\gametypes\ctf::returnflag(); + } + } + else if ( level.gametype == "sd" && !level.multibomb ) + { + if ( level.sdbomb.visuals[0] istouching( kill_trigger ) ) + level.sdbomb maps\mp\gametypes\_gameobjects::returnhome(); + } + + pixendevent(); + } } gate_move_think( ignoreplayers ) { - self endon( "movedone" ); - self.disablefinalkillcam = 1; - corpse_delay = 0; - if ( isDefined( self.waittime ) ) - { - wait self.waittime; - } - for ( ;; ) - { - wait 0,4; - pixbeginevent( "gate_move_think" ); - entities = getdamageableentarray( self.origin, 100 ); - _a492 = entities; - _k492 = getFirstArrayKey( _a492 ); - while ( isDefined( _k492 ) ) - { - entity = _a492[ _k492 ]; - if ( ignoreplayers == 1 && isplayer( entity ) ) - { - } - else - { - if ( !entity istouching( self.kill_trigger ) ) - { - break; - } - else if ( isDefined( entity.model ) && entity.model == "t6_wpn_tac_insert_world" ) - { - entity maps/mp/_tacticalinsertion::destroy_tactical_insertion(); - break; - } - else - { - if ( !isalive( entity ) ) - { - break; - } - else if ( isDefined( entity.targetname ) ) - { - if ( entity.targetname == "talon" ) - { - entity notify( "death" ); - break; - } - else if ( entity.targetname == "rcbomb" ) - { - entity maps/mp/killstreaks/_rcbomb::rcbomb_force_explode(); - break; - } - else if ( entity.targetname == "riotshield_mp" ) - { - entity dodamage( 1, self.origin + ( 0, 0, 1 ), self, self, 0, "MOD_CRUSH" ); - break; - } - } - else if ( isDefined( entity.helitype ) && entity.helitype == "qrdrone" ) - { - watcher = entity.owner maps/mp/gametypes/_weaponobjects::getweaponobjectwatcher( "qrdrone" ); - watcher thread maps/mp/gametypes/_weaponobjects::waitanddetonate( entity, 0, undefined ); - break; - } - else - { - if ( entity.classname == "grenade" ) - { - if ( !isDefined( entity.name ) ) - { - break; - } - else if ( !isDefined( entity.owner ) ) - { - break; - } - else if ( entity.name == "proximity_grenade_mp" ) - { - watcher = entity.owner getwatcherforweapon( entity.name ); - watcher thread maps/mp/gametypes/_weaponobjects::waitanddetonate( entity, 0, undefined, "script_mover_mp" ); - break; - } - else if ( !isweaponequipment( entity.name ) ) - { - break; - } - else watcher = entity.owner getwatcherforweapon( entity.name ); - if ( !isDefined( watcher ) ) - { - break; - } - else watcher thread maps/mp/gametypes/_weaponobjects::waitanddetonate( entity, 0, undefined, "script_mover_mp" ); - break; - } - else if ( entity.classname == "auto_turret" ) - { - if ( isDefined( entity.carried ) && entity.carried == 1 ) - { - break; - } - else - { - if ( !isDefined( entity.damagedtodeath ) || !entity.damagedtodeath ) - { - entity domaxdamage( self.origin + ( 0, 0, 1 ), self, self, 0, "MOD_CRUSH" ); - } - break; - } - else - { - entity dodamage( entity.health * 2, self.origin + ( 0, 0, 1 ), self, self, 0, "MOD_CRUSH" ); - } - } - } - } - } - _k492 = getNextArrayKey( _a492, _k492 ); - } - self destroy_supply_crates(); - if ( getTime() > corpse_delay ) - { - self destroy_corpses(); - } - if ( level.gametype == "ctf" ) - { - _a601 = level.flags; - _k601 = getFirstArrayKey( _a601 ); - while ( isDefined( _k601 ) ) - { - flag = _a601[ _k601 ]; - if ( flag.visuals[ 0 ] istouching( self.kill_trigger ) ) - { - flag maps/mp/gametypes/ctf::returnflag(); - } - _k601 = getNextArrayKey( _a601, _k601 ); - } - } - else if ( level.gametype == "sd" && !level.multibomb ) - { - if ( level.sdbomb.visuals[ 0 ] istouching( self.kill_trigger ) ) - { - level.sdbomb maps/mp/gametypes/_gameobjects::returnhome(); - } - } - pixendevent(); - } + self endon( "movedone" ); + self.disablefinalkillcam = 1; + corpse_delay = 0; + + if ( isdefined( self.waittime ) ) + wait( self.waittime ); + + for (;;) + { + wait 0.4; + pixbeginevent( "gate_move_think" ); + entities = getdamageableentarray( self.origin, 100 ); + + foreach ( entity in entities ) + { + if ( ignoreplayers == 1 && isplayer( entity ) ) + continue; + + if ( !entity istouching( self.kill_trigger ) ) + continue; + + if ( isdefined( entity.model ) && entity.model == "t6_wpn_tac_insert_world" ) + { + entity maps\mp\_tacticalinsertion::destroy_tactical_insertion(); + continue; + } + + if ( !isalive( entity ) ) + continue; + + if ( isdefined( entity.targetname ) ) + { + if ( entity.targetname == "talon" ) + { + entity notify( "death" ); + continue; + } + else if ( entity.targetname == "rcbomb" ) + { + entity maps\mp\killstreaks\_rcbomb::rcbomb_force_explode(); + continue; + } + else if ( entity.targetname == "riotshield_mp" ) + { + entity dodamage( 1, self.origin + ( 0, 0, 1 ), self, self, 0, "MOD_CRUSH" ); + continue; + } + } + + if ( isdefined( entity.helitype ) && entity.helitype == "qrdrone" ) + { + watcher = entity.owner maps\mp\gametypes\_weaponobjects::getweaponobjectwatcher( "qrdrone" ); + watcher thread maps\mp\gametypes\_weaponobjects::waitanddetonate( entity, 0.0, undefined ); + continue; + } + + if ( entity.classname == "grenade" ) + { + if ( !isdefined( entity.name ) ) + continue; + + if ( !isdefined( entity.owner ) ) + continue; + + if ( entity.name == "proximity_grenade_mp" ) + { + watcher = entity.owner getwatcherforweapon( entity.name ); + watcher thread maps\mp\gametypes\_weaponobjects::waitanddetonate( entity, 0.0, undefined, "script_mover_mp" ); + continue; + } + + if ( !isweaponequipment( entity.name ) ) + continue; + + watcher = entity.owner getwatcherforweapon( entity.name ); + + if ( !isdefined( watcher ) ) + continue; + + watcher thread maps\mp\gametypes\_weaponobjects::waitanddetonate( entity, 0.0, undefined, "script_mover_mp" ); + continue; + } + + if ( entity.classname == "auto_turret" ) + { + if ( isdefined( entity.carried ) && entity.carried == 1 ) + continue; + + if ( !isdefined( entity.damagedtodeath ) || !entity.damagedtodeath ) + entity domaxdamage( self.origin + ( 0, 0, 1 ), self, self, 0, "MOD_CRUSH" ); + + continue; + } + + entity dodamage( entity.health * 2, self.origin + ( 0, 0, 1 ), self, self, 0, "MOD_CRUSH" ); + } + + self destroy_supply_crates(); + + if ( gettime() > corpse_delay ) + self destroy_corpses(); + + if ( level.gametype == "ctf" ) + { + foreach ( flag in level.flags ) + { + if ( flag.visuals[0] istouching( self.kill_trigger ) ) + flag maps\mp\gametypes\ctf::returnflag(); + } + } + else if ( level.gametype == "sd" && !level.multibomb ) + { + if ( level.sdbomb.visuals[0] istouching( self.kill_trigger ) ) + level.sdbomb maps\mp\gametypes\_gameobjects::returnhome(); + } + + pixendevent(); + } } getwatcherforweapon( weapname ) { - if ( !isDefined( self ) ) - { - return undefined; - } - if ( !isplayer( self ) ) - { - return undefined; - } - i = 0; - while ( i < self.weaponobjectwatcherarray.size ) - { - if ( self.weaponobjectwatcherarray[ i ].weapon != weapname ) - { - i++; - continue; - } - else - { - return self.weaponobjectwatcherarray[ i ]; - } - i++; - } - return undefined; + if ( !isdefined( self ) ) + return undefined; + + if ( !isplayer( self ) ) + return undefined; + + for ( i = 0; i < self.weaponobjectwatcherarray.size; i++ ) + { + if ( self.weaponobjectwatcherarray[i].weapon != weapname ) + continue; + + return self.weaponobjectwatcherarray[i]; + } + + return undefined; } destroy_supply_crates() { - crates = getentarray( "care_package", "script_noteworthy" ); - _a651 = crates; - _k651 = getFirstArrayKey( _a651 ); - while ( isDefined( _k651 ) ) - { - crate = _a651[ _k651 ]; - if ( distancesquared( crate.origin, self.origin ) < 10000 ) - { - if ( crate istouching( self ) ) - { - playfx( level._supply_drop_explosion_fx, crate.origin ); - playsoundatposition( "wpn_grenade_explode", crate.origin ); - wait 0,1; - crate maps/mp/killstreaks/_supplydrop::cratedelete(); - } - } - _k651 = getNextArrayKey( _a651, _k651 ); - } + crates = getentarray( "care_package", "script_noteworthy" ); + + foreach ( crate in crates ) + { + if ( distancesquared( crate.origin, self.origin ) < 10000 ) + { + if ( crate istouching( self ) ) + { + playfx( level._supply_drop_explosion_fx, crate.origin ); + playsoundatposition( "wpn_grenade_explode", crate.origin ); + wait 0.1; + crate maps\mp\killstreaks\_supplydrop::cratedelete(); + } + } + } } destroy_corpses() { - corpses = getcorpsearray(); - i = 0; - while ( i < corpses.size ) - { - if ( distancesquared( corpses[ i ].origin, self.origin ) < 10000 ) - { - corpses[ i ] delete(); - } - i++; - } + corpses = getcorpsearray(); + + for ( i = 0; i < corpses.size; i++ ) + { + if ( distancesquared( corpses[i].origin, self.origin ) < 10000 ) + corpses[i] delete(); + } } diff --git a/Multiplayer Core/patch_mp/maps/mp/mp_frostbite.gsc b/Multiplayer Core/patch_mp/maps/mp/mp_frostbite.gsc index cc69920..d7461ae 100644 --- a/Multiplayer Core/patch_mp/maps/mp/mp_frostbite.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/mp_frostbite.gsc @@ -1,173 +1,177 @@ -//checked includes changed to match cerberus output -#include maps/mp/_compass; -#include maps/mp/mp_frostbite_amb; -#include maps/mp/_load; -#include maps/mp/mp_frostbite_fx; -#include maps/mp/_utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\_utility; +#include maps\mp\mp_frostbite_fx; +#include maps\mp\_load; +#include maps\mp\mp_frostbite_amb; +#include maps\mp\_compass; -main() //checked changed to match cerberus output +main() { - level.levelspawndvars = ::levelspawndvars; - level thread spawnkilltrigger(); - maps/mp/mp_frostbite_fx::main(); - precachemodel( "dh_facilities_sign_08" ); - precachemodel( "p6_fro_concrete_planter" ); - precachemodel( "p6_fro_bookstore_window_trm" ); - precachemodel( "collision_clip_256x256x10" ); - precachemodel( "collision_clip_64x64x10" ); - precachemodel( "collision_physics_256x256x10" ); - precachemodel( "collision_clip_32x32x32" ); - precachemodel( "collision_clip_128x128x10" ); - precachemodel( "collision_clip_wall_32x32x10" ); - precachemodel( "collision_clip_wall_64x64x10" ); - precachemodel( "collision_mp_frost_kitchen_weap" ); - maps/mp/_load::main(); - maps/mp/mp_frostbite_amb::main(); - maps/mp/_compass::setupminimap( "compass_map_mp_frostbite" ); - prop1 = spawn( "script_model", ( -972, 559, 182 ) ); - prop1.angles = vectorScale( ( 0, 1, 0 ), 90 ); - prop2 = spawn( "script_model", ( -973, 521, 182 ) ); - prop2.angles = vectorScale( ( 0, 1, 0 ), 90 ); - prop3 = spawn( "script_model", ( -972, 485, 182 ) ); - prop3.angles = vectorScale( ( 0, 1, 0 ), 90 ); - prop4 = spawn( "script_model", ( -966, 558, 182 ) ); - prop4.angles = vectorScale( ( 0, 1, 0 ), 270 ); - prop5 = spawn( "script_model", ( -965, 522, 182 ) ); - prop5.angles = vectorScale( ( 0, 1, 0 ), 270 ); - prop6 = spawn( "script_model", ( -966, 484, 182 ) ); - prop6.angles = vectorScale( ( 0, 1, 0 ), 270 ); - prop1 setmodel( "dh_facilities_sign_08" ); - prop2 setmodel( "dh_facilities_sign_08" ); - prop3 setmodel( "dh_facilities_sign_08" ); - prop4 setmodel( "dh_facilities_sign_08" ); - prop5 setmodel( "dh_facilities_sign_08" ); - prop6 setmodel( "dh_facilities_sign_08" ); - planter1 = spawn( "script_model", ( -1609, -827.405, 131.751 ) ); - planter1.angles = ( 359.846, 90.58, 89.9993 ); - planter2 = spawn( "script_model", ( -1609, -827.41, 81.75 ) ); - planter2.angles = ( 359.846, 90.58, 89.9993 ); - planter1 setmodel( "p6_fro_concrete_planter" ); - planter2 setmodel( "p6_fro_concrete_planter" ); - brick1 = spawn( "script_model", ( 1129, 703, 95.75 ) ); - brick1.angles = ( 90, 180, -90 ); - brick2 = spawn( "script_model", ( 1127.75, 712, 95.75 ) ); - brick2.angles = ( 90, 180, -90 ); - brick3 = spawn( "script_model", ( 1129, 703, 47.75 ) ); - brick3.angles = ( 90, 180, -90 ); - brick4 = spawn( "script_model", ( 1127.75, 712, 47.75 ) ); - brick4.angles = ( 90, 180, -90 ); - brick5 = spawn( "script_model", ( 1129, 694, 95.75 ) ); - brick5.angles = ( 90, 180, -90 ); - brick6 = spawn( "script_model", ( 1129, 694, 47.75 ) ); - brick6.angles = ( 90, 180, -90 ); - brick7 = spawn( "script_model", ( 1129, 685, 95.75 ) ); - brick7.angles = ( 90, 180, -90 ); - brick8 = spawn( "script_model", ( 1129, 685, 47.75 ) ); - brick8.angles = ( 90, 180, -90 ); - brick1 setmodel( "p6_fro_bookstore_window_trm" ); - brick2 setmodel( "p6_fro_bookstore_window_trm" ); - brick3 setmodel( "p6_fro_bookstore_window_trm" ); - brick4 setmodel( "p6_fro_bookstore_window_trm" ); - brick5 setmodel( "p6_fro_bookstore_window_trm" ); - brick6 setmodel( "p6_fro_bookstore_window_trm" ); - brick7 setmodel( "p6_fro_bookstore_window_trm" ); - brick8 setmodel( "p6_fro_bookstore_window_trm" ); - spawncollision( "collision_clip_256x256x10", "collider", ( 145, -1295.5, 115.5 ), vectorScale( ( 0, 0, -1 ), 88.9 ) ); - spawncollision( "collision_clip_256x256x10", "collider", ( 28, -1295.5, 115.5 ), vectorScale( ( 0, 0, -1 ), 88.9 ) ); - spawncollision( "collision_clip_256x256x10", "collider", ( 252.5, -1251.5, 114 ), ( 0, 45.1, -88.9 ) ); - spawncollision( "collision_clip_64x64x10", "collider", ( 448, 1577, -10.5 ), vectorScale( ( 1, 0, 0 ), 277 ) ); - spawncollision( "collision_physics_256x256x10", "collider", ( 1199, 89, 67.5 ), vectorScale( ( 0, 0, -1 ), 90 ) ); - spawncollision( "collision_clip_32x32x32", "collider", ( 84.5, 361.75, 66.5 ), ( 359.904, 8.05247, 11.9159 ) ); - spawncollision( "collision_clip_32x32x32", "collider", ( 80, 390, 69.5 ), vectorScale( ( 0, 1, 0 ), 9.19998 ) ); - spawncollision( "collision_clip_32x32x32", "collider", ( 75.5, 418, 66.75 ), ( 1.00357, 9.19998, -11 ) ); - spawncollision( "collision_clip_128x128x10", "collider", ( 244.75, -860, -45 ), vectorScale( ( 0, 1, 0 ), 27 ) ); - spawncollision( "collision_clip_wall_32x32x10", "collider", ( 958.5, 716.5, 130 ), vectorScale( ( 0, 0, 1 ), 5.6 ) ); - spawncollision( "collision_clip_wall_64x64x10", "collider", ( -1126, -909, 44.5 ), vectorScale( ( 0, 1, 0 ), 105.6 ) ); - spawncollision( "collision_clip_wall_64x64x10", "collider", ( -1130, -789.5, 44.5 ), vectorScale( ( 0, 1, 0 ), 83.9 ) ); - spawncollision( "collision_clip_wall_64x64x10", "collider", ( -1130, -789.5, 107 ), vectorScale( ( 0, 1, 0 ), 83.9 ) ); - spawncollision( "collision_clip_wall_64x64x10", "collider", ( -1126, -909, 106 ), vectorScale( ( 0, 1, 0 ), 105.6 ) ); - spawncollision( "collision_clip_wall_64x64x10", "collider", ( -1130, -789.5, 164.5 ), vectorScale( ( 0, 1, 0 ), 83.9 ) ); - spawncollision( "collision_mp_frost_kitchen_weap", "collider", ( 1994, -281.5, 16 ), ( 0, 1, 0 ) ); - setdvar( "compassmaxrange", "2100" ); - visionsetnaked( "mp_frostbite", 1 ); - game[ "strings" ][ "war_callsign_a" ] = &"MPUI_CALLSIGN_MAPNAME_A"; - game[ "strings" ][ "war_callsign_b" ] = &"MPUI_CALLSIGN_MAPNAME_B"; - game[ "strings" ][ "war_callsign_c" ] = &"MPUI_CALLSIGN_MAPNAME_C"; - game[ "strings" ][ "war_callsign_d" ] = &"MPUI_CALLSIGN_MAPNAME_D"; - game[ "strings" ][ "war_callsign_e" ] = &"MPUI_CALLSIGN_MAPNAME_E"; - game[ "strings_menu" ][ "war_callsign_a" ] = "@MPUI_CALLSIGN_MAPNAME_A"; - game[ "strings_menu" ][ "war_callsign_b" ] = "@MPUI_CALLSIGN_MAPNAME_B"; - game[ "strings_menu" ][ "war_callsign_c" ] = "@MPUI_CALLSIGN_MAPNAME_C"; - game[ "strings_menu" ][ "war_callsign_d" ] = "@MPUI_CALLSIGN_MAPNAME_D"; - game[ "strings_menu" ][ "war_callsign_e" ] = "@MPUI_CALLSIGN_MAPNAME_E"; - level.onplayerkilledextraunthreadedcbs[ level.onplayerkilledextraunthreadedcbs.size ] = ::on_player_killed; - level.overrideplayerdeathwatchtimer = ::leveloverridetime; - level glass_node_fix(); + level.levelspawndvars = ::levelspawndvars; + level thread spawnkilltrigger(); + maps\mp\mp_frostbite_fx::main(); + precachemodel( "dh_facilities_sign_08" ); + precachemodel( "p6_fro_concrete_planter" ); + precachemodel( "p6_fro_bookstore_window_trm" ); + precachemodel( "collision_clip_256x256x10" ); + precachemodel( "collision_clip_64x64x10" ); + precachemodel( "collision_physics_256x256x10" ); + precachemodel( "collision_clip_32x32x32" ); + precachemodel( "collision_clip_128x128x10" ); + precachemodel( "collision_clip_wall_32x32x10" ); + precachemodel( "collision_clip_wall_64x64x10" ); + precachemodel( "collision_mp_frost_kitchen_weap" ); + maps\mp\_load::main(); + maps\mp\mp_frostbite_amb::main(); + maps\mp\_compass::setupminimap( "compass_map_mp_frostbite" ); + prop1 = spawn( "script_model", ( -972, 559, 182 ) ); + prop1.angles = vectorscale( ( 0, 1, 0 ), 90.0 ); + prop2 = spawn( "script_model", ( -973, 521, 182 ) ); + prop2.angles = vectorscale( ( 0, 1, 0 ), 90.0 ); + prop3 = spawn( "script_model", ( -972, 485, 182 ) ); + prop3.angles = vectorscale( ( 0, 1, 0 ), 90.0 ); + prop4 = spawn( "script_model", ( -966, 558, 182 ) ); + prop4.angles = vectorscale( ( 0, 1, 0 ), 270.0 ); + prop5 = spawn( "script_model", ( -965, 522, 182 ) ); + prop5.angles = vectorscale( ( 0, 1, 0 ), 270.0 ); + prop6 = spawn( "script_model", ( -966, 484, 182 ) ); + prop6.angles = vectorscale( ( 0, 1, 0 ), 270.0 ); + prop1 setmodel( "dh_facilities_sign_08" ); + prop2 setmodel( "dh_facilities_sign_08" ); + prop3 setmodel( "dh_facilities_sign_08" ); + prop4 setmodel( "dh_facilities_sign_08" ); + prop5 setmodel( "dh_facilities_sign_08" ); + prop6 setmodel( "dh_facilities_sign_08" ); + planter1 = spawn( "script_model", ( -1609, -827.405, 131.751 ) ); + planter1.angles = ( 359.846, 90.58, 89.9993 ); + planter2 = spawn( "script_model", ( -1609, -827.41, 81.75 ) ); + planter2.angles = ( 359.846, 90.58, 89.9993 ); + planter1 setmodel( "p6_fro_concrete_planter" ); + planter2 setmodel( "p6_fro_concrete_planter" ); + brick1 = spawn( "script_model", ( 1129, 703, 95.75 ) ); + brick1.angles = ( 90, 180, -90 ); + brick2 = spawn( "script_model", ( 1127.75, 712, 95.75 ) ); + brick2.angles = ( 90, 180, -90 ); + brick3 = spawn( "script_model", ( 1129, 703, 47.75 ) ); + brick3.angles = ( 90, 180, -90 ); + brick4 = spawn( "script_model", ( 1127.75, 712, 47.75 ) ); + brick4.angles = ( 90, 180, -90 ); + brick5 = spawn( "script_model", ( 1129, 694, 95.75 ) ); + brick5.angles = ( 90, 180, -90 ); + brick6 = spawn( "script_model", ( 1129, 694, 47.75 ) ); + brick6.angles = ( 90, 180, -90 ); + brick7 = spawn( "script_model", ( 1129, 685, 95.75 ) ); + brick7.angles = ( 90, 180, -90 ); + brick8 = spawn( "script_model", ( 1129, 685, 47.75 ) ); + brick8.angles = ( 90, 180, -90 ); + brick1 setmodel( "p6_fro_bookstore_window_trm" ); + brick2 setmodel( "p6_fro_bookstore_window_trm" ); + brick3 setmodel( "p6_fro_bookstore_window_trm" ); + brick4 setmodel( "p6_fro_bookstore_window_trm" ); + brick5 setmodel( "p6_fro_bookstore_window_trm" ); + brick6 setmodel( "p6_fro_bookstore_window_trm" ); + brick7 setmodel( "p6_fro_bookstore_window_trm" ); + brick8 setmodel( "p6_fro_bookstore_window_trm" ); + spawncollision( "collision_clip_256x256x10", "collider", ( 145, -1295.5, 115.5 ), vectorscale( ( 0, 0, -1 ), 88.9 ) ); + spawncollision( "collision_clip_256x256x10", "collider", ( 28, -1295.5, 115.5 ), vectorscale( ( 0, 0, -1 ), 88.9 ) ); + spawncollision( "collision_clip_256x256x10", "collider", ( 252.5, -1251.5, 114 ), ( 0, 45.1, -88.9 ) ); + spawncollision( "collision_clip_64x64x10", "collider", ( 448, 1577, -10.5 ), vectorscale( ( 1, 0, 0 ), 277.0 ) ); + spawncollision( "collision_physics_256x256x10", "collider", ( 1199, 89, 67.5 ), vectorscale( ( 0, 0, -1 ), 90.0 ) ); + spawncollision( "collision_clip_32x32x32", "collider", ( 84.5, 361.75, 66.5 ), ( 359.904, 8.05247, 11.9159 ) ); + spawncollision( "collision_clip_32x32x32", "collider", ( 80, 390, 69.5 ), vectorscale( ( 0, 1, 0 ), 9.19998 ) ); + spawncollision( "collision_clip_32x32x32", "collider", ( 75.5, 418, 66.75 ), ( 1.00357, 9.19998, -11 ) ); + spawncollision( "collision_clip_128x128x10", "collider", ( 244.75, -860, -45 ), vectorscale( ( 0, 1, 0 ), 27.0 ) ); + spawncollision( "collision_clip_wall_32x32x10", "collider", ( 958.5, 716.5, 130 ), vectorscale( ( 0, 0, 1 ), 5.6 ) ); + spawncollision( "collision_clip_wall_64x64x10", "collider", ( -1126, -909, 44.5 ), vectorscale( ( 0, 1, 0 ), 105.6 ) ); + spawncollision( "collision_clip_wall_64x64x10", "collider", ( -1130, -789.5, 44.5 ), vectorscale( ( 0, 1, 0 ), 83.9 ) ); + spawncollision( "collision_clip_wall_64x64x10", "collider", ( -1130, -789.5, 107 ), vectorscale( ( 0, 1, 0 ), 83.9 ) ); + spawncollision( "collision_clip_wall_64x64x10", "collider", ( -1126, -909, 106 ), vectorscale( ( 0, 1, 0 ), 105.6 ) ); + spawncollision( "collision_clip_wall_64x64x10", "collider", ( -1130, -789.5, 164.5 ), vectorscale( ( 0, 1, 0 ), 83.9 ) ); + spawncollision( "collision_mp_frost_kitchen_weap", "collider", ( 1994, -281.5, 16 ), ( 0, 0, 0 ) ); + setdvar( "compassmaxrange", "2100" ); + visionsetnaked( "mp_frostbite", 1 ); + game["strings"]["war_callsign_a"] = &"MPUI_CALLSIGN_MAPNAME_A"; + game["strings"]["war_callsign_b"] = &"MPUI_CALLSIGN_MAPNAME_B"; + game["strings"]["war_callsign_c"] = &"MPUI_CALLSIGN_MAPNAME_C"; + game["strings"]["war_callsign_d"] = &"MPUI_CALLSIGN_MAPNAME_D"; + game["strings"]["war_callsign_e"] = &"MPUI_CALLSIGN_MAPNAME_E"; + game["strings_menu"]["war_callsign_a"] = "@MPUI_CALLSIGN_MAPNAME_A"; + game["strings_menu"]["war_callsign_b"] = "@MPUI_CALLSIGN_MAPNAME_B"; + game["strings_menu"]["war_callsign_c"] = "@MPUI_CALLSIGN_MAPNAME_C"; + game["strings_menu"]["war_callsign_d"] = "@MPUI_CALLSIGN_MAPNAME_D"; + game["strings_menu"]["war_callsign_e"] = "@MPUI_CALLSIGN_MAPNAME_E"; + level.onplayerkilledextraunthreadedcbs[level.onplayerkilledextraunthreadedcbs.size] = ::on_player_killed; + level.overrideplayerdeathwatchtimer = ::leveloverridetime; + level glass_node_fix(); } -levelspawndvars( reset_dvars ) //checked matches cerberus output +levelspawndvars( reset_dvars ) { - ss = level.spawnsystem; - ss.enemy_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_radius", "2250", reset_dvars ); - ss.hq_objective_influencer_inner_radius = set_dvar_float_if_unset( "scr_spawn_hq_objective_influencer_inner_radius", "1000", reset_dvars ); + ss = level.spawnsystem; + ss.enemy_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_radius", "2250", reset_dvars ); + ss.hq_objective_influencer_inner_radius = set_dvar_float_if_unset( "scr_spawn_hq_objective_influencer_inner_radius", "1000", reset_dvars ); } -on_player_killed( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ) //checked matches cerberus output +on_player_killed( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ) { - if ( isDefined( smeansofdeath ) && smeansofdeath == "MOD_TRIGGER_HURT" ) - { - depth = self depthinwater(); - if ( depth > 0 ) - { - origin = self.origin + ( 0, 0, depth + 5 ); - self playsound( "mpl_splash_death" ); - playfx( level._effect[ "water_splash" ], origin ); - } - } + if ( isdefined( smeansofdeath ) && smeansofdeath == "MOD_TRIGGER_HURT" ) + { + depth = self depthinwater(); + + if ( depth > 0 ) + { + origin = self.origin + ( 0, 0, depth + 5 ); + self playsound( "mpl_splash_death" ); + playfx( level._effect["water_splash"], origin ); + } + } } -leveloverridetime( defaulttime ) //checked matches cerberus output +leveloverridetime( defaulttime ) { - if ( self.body depthinwater() > 0 ) - { - return 0.4; - } - return defaulttime; + if ( self.body depthinwater() > 0 ) + return 0.4; + + return defaulttime; } -glass_node_fix() //checked matches cerberus output +glass_node_fix() { - nodes = getallnodes(); - level thread glass_node_think( nodes[ 459 ] ); - level thread glass_node_think( nodes[ 454 ] ); + nodes = getallnodes(); + level thread glass_node_think( nodes[459] ); + level thread glass_node_think( nodes[454] ); } -glass_node_think( node ) //checked matches cerberus output +glass_node_think( node ) { - wait 0.25; - ent = spawn( "script_model", node.origin, 1 ); - ent setmodel( level.deployedshieldmodel ); - ent hide(); - ent disconnectpaths(); - ent.origin -= vectorScale( ( 0, 0, 1 ), 64 ); - for ( ;; ) - { - level waittill( "glass_smash", origin ); - if ( distancesquared( origin, node.origin ) < 65536 ) - { - ent delete(); - return; - } - } + wait 0.25; + ent = spawn( "script_model", node.origin, 1 ); + ent setmodel( level.deployedshieldmodel ); + ent hide(); + ent disconnectpaths(); + ent.origin -= vectorscale( ( 0, 0, 1 ), 64.0 ); + + for (;;) + { + level waittill( "glass_smash", origin ); + + if ( distancesquared( origin, node.origin ) < 65536 ) + { + ent delete(); + return; + } + } } -spawnkilltrigger() //checked matches cerberus output +spawnkilltrigger() { - trigger = spawn( "trigger_radius", ( 536, -1304, -104 ), 0, 256, 128 ); - while ( 1 ) - { - trigger waittill( "trigger", player ); - player dodamage( player.health * 2, trigger.origin, trigger, trigger, "none", "MOD_SUICIDE", 0, "lava_mp" ); - } -} + trigger = spawn( "trigger_radius", ( 536, -1304, -104 ), 0, 256, 128 ); + while ( true ) + { + trigger waittill( "trigger", player ); + + player dodamage( player.health * 2, trigger.origin, trigger, trigger, "none", "MOD_SUICIDE", 0, "lava_mp" ); + } +} diff --git a/Multiplayer Core/patch_mp/maps/mp/mp_hijacked.gsc b/Multiplayer Core/patch_mp/maps/mp/mp_hijacked.gsc index 18a6149..9fcdeeb 100644 --- a/Multiplayer Core/patch_mp/maps/mp/mp_hijacked.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/mp_hijacked.gsc @@ -1,213 +1,217 @@ -//checked includes changed to match cerberus output -#include maps/mp/_compass; -#include maps/mp/mp_hijacked_amb; -#include maps/mp/_load; -#include maps/mp/mp_hijacked_fx; -#include maps/mp/_utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\_utility; +#include maps\mp\mp_hijacked_fx; +#include maps\mp\_load; +#include maps\mp\mp_hijacked_amb; +#include maps\mp\_compass; -main() //checked changed to match cerberus output +main() { - level.levelspawndvars = ::levelspawndvars; - level.overrideplayerdeathwatchtimer = ::leveloverridetime; - level.useintermissionpointsonwavespawn = ::useintermissionpointsonwavespawn; - maps/mp/mp_hijacked_fx::main(); - precachemodel( "collision_physics_64x64x10" ); - precachemodel( "collision_physics_wall_64x64x10" ); - precachemodel( "collision_physics_cylinder_32x128" ); - precachemodel( "collision_clip_64x64x10" ); - maps/mp/_load::main(); - maps/mp/mp_hijacked_amb::main(); - if ( level.gametype == "dm" ) - { - spawn( "mp_dm_spawn", ( 82, 262, -135.5 ), 0, 187, 0 ); - spawn( "mp_dm_spawn", ( 783.5, 90, 58 ), 0, 198, 0 ); - spawn( "mp_dm_spawn", ( 1103.5, -187.5, 192 ), 0, 165, 0 ); - spawn( "mp_dm_spawn", ( -3012, -178, -136 ), 0, 335, 0 ); - spawn( "mp_dm_spawn", ( -3016, 176, -136 ), 0, 28, 0 ); - spawn( "mp_dm_spawn", ( -1022.5, -109.5, -136 ), 0, 5, 0 ); - spawn( "mp_dm_spawn", ( -874, 661, -14 ), 0, 5, 0 ); - spawn( "mp_dm_spawn", ( -1048, -333, 201 ), 0, 69, 0 ); - spawn( "mp_dm_spawn", ( -1462.5, 169.5, -8 ), 0, 48, 0 ); - } - if ( level.gametype == "tdm" ) - { - spawn( "mp_tdm_spawn", ( 82, 262, -135.5 ), 0, 187, 0 ); - spawn( "mp_tdm_spawn", ( 783.5, 90, 58 ), 0, 198, 0 ); - spawn( "mp_tdm_spawn", ( 1103.5, -187.5, 192 ), 0, 165, 0 ); - spawn( "mp_tdm_spawn", ( -3012, -178, -136 ), 0, 335, 0 ); - spawn( "mp_tdm_spawn", ( -3016, 176, -136 ), 0, 28, 0 ); - spawn( "mp_tdm_spawn", ( -1022.5, -109.5, -136 ), 0, 5, 0 ); - spawn( "mp_tdm_spawn", ( -874, 661, -14 ), 0, 5, 0 ); - spawn( "mp_tdm_spawn", ( -1048, -333, 201 ), 0, 69, 0 ); - spawn( "mp_tdm_spawn", ( -1462.5, 169.5, -8 ), 0, 48, 0 ); - } - if ( level.gametype == "conf" ) - { - spawn( "mp_tdm_spawn", ( 82, 262, -135.5 ), 0, 187, 0 ); - spawn( "mp_tdm_spawn", ( 783.5, 90, 58 ), 0, 198, 0 ); - spawn( "mp_tdm_spawn", ( 1103.5, -187.5, 192 ), 0, 165, 0 ); - spawn( "mp_tdm_spawn", ( -3012, -178, -136 ), 0, 335, 0 ); - spawn( "mp_tdm_spawn", ( -3016, 176, -136 ), 0, 28, 0 ); - spawn( "mp_tdm_spawn", ( -1022.5, -109.5, -136 ), 0, 5, 0 ); - spawn( "mp_tdm_spawn", ( -874, 661, -14 ), 0, 5, 0 ); - spawn( "mp_tdm_spawn", ( -1048, -333, 201 ), 0, 69, 0 ); - spawn( "mp_tdm_spawn", ( -1462.5, 169.5, -8 ), 0, 48, 0 ); - } - if ( level.gametype == "ctf" ) - { - spawn( "mp_ctf_spawn_axis", ( 82, 262, -135.5 ), 0, 187, 0 ); - spawn( "mp_ctf_spawn_axis", ( 249, 682, 48 ), 0, 183, 0 ); - spawn( "mp_ctf_spawn_axis", ( 1103.5, -187.5, 192 ), 0, 165, 0 ); - spawn( "mp_ctf_spawn_allies", ( -1022.5, -109.5, -136 ), 0, 5, 0 ); - spawn( "mp_ctf_spawn_allies", ( -874, 661, -14 ), 0, 5, 0 ); - spawn( "mp_ctf_spawn_allies", ( -1462.5, 169.5, -8 ), 0, 48, 0 ); - } - if ( level.gametype == "dom" ) - { - spawn( "mp_dom_spawn", ( 82, 262, -135.5 ), 0, 187, 0 ); - spawn( "mp_dom_spawn", ( 249, 682, 48 ), 0, 183, 0 ); - spawn( "mp_dom_spawn", ( 1103.5, -187.5, 192 ), 0, 165, 0 ); - spawn( "mp_dom_spawn", ( -1022.5, -109.5, -136 ), 0, 5, 0 ); - spawn( "mp_dom_spawn", ( -874, 661, -14 ), 0, 5, 0 ); - spawn( "mp_dom_spawn", ( -1462.5, 169.5, -8 ), 0, 48, 0 ); - spawn( "mp_dom_spawn", ( -1048, -333, 201 ), 0, 69, 0 ); - } - if ( level.gametype == "dem" ) - { - spawn( "mp_dem_spawn_attacker", ( 1103.5, -187.5, 192 ), 0, 165, 0 ); - spawn( "mp_dem_spawn_attacker", ( 783.5, 90, 58 ), 0, 198, 0 ); - } - maps/mp/_compass::setupminimap( "compass_map_mp_hijacked" ); - spawncollision( "collision_physics_64x64x10", "collider", ( 1660, 40, 59 ), vectorScale( ( 0, 0, -1 ), 90 ) ); - spawncollision( "collision_physics_64x64x10", "collider", ( 1633, 40, 48 ), vectorScale( ( 0, 0, -1 ), 90 ) ); - spawncollision( "collision_physics_64x64x10", "collider", ( 1660, -42, 59 ), vectorScale( ( 0, 0, -1 ), 90 ) ); - spawncollision( "collision_physics_64x64x10", "collider", ( 1632, -42, 48 ), vectorScale( ( 0, 0, -1 ), 90 ) ); - spawncollision( "collision_physics_64x64x10", "collider", ( 904, 18, 53 ), ( 0, 270, -90 ) ); - spawncollision( "collision_physics_64x64x10", "collider", ( 904, 91, 90 ), ( 0, 270, -90 ) ); - spawncollision( "collision_physics_cylinder_32x128", "collider", ( -1055, 10, 216 ), vectorScale( ( 0, 0, -1 ), 90 ) ); - spawncollision( "collision_clip_64x64x10", "collider", ( -1912.65, -245, -76.3463 ), vectorScale( ( 1, 0, 0 ), 282 ) ); - spawncollision( "collision_physics_wall_64x64x10", "collider", ( -1064, 412, 254 ), vectorScale( ( 1, 0, 0 ), 342.8 ) ); - spawncollision( "collision_physics_wall_64x64x10", "collider", ( -1112, 416.5, 284 ), vectorScale( ( 1, 0, 0 ), 316.3 ) ); - level.levelkothdisable = []; - level.levelkothdisable[ level.levelkothdisable.size ] = spawn( "trigger_radius", ( 402, 181.5, 35 ), 0, 70, 128 ); - level.levelkothdisable[ level.levelkothdisable.size ] = spawn( "trigger_radius", ( -96, 320, 34 ), 0, 150, 80 ); - level thread water_trigger_init(); - if ( level.gametype == "koth" ) - { - trigs = getentarray( "koth_zone_trigger", "targetname" ); - foreach ( trigger in trigs ) - { - if ( trigger.origin == ( -239, 86, -83 ) ) - { - trigger delete(); - break; - } - } - trigger = spawn( "trigger_box", ( -204, 92, -128 ), 1, 2088, 504, 160 ); - trigger.targetname = "koth_zone_trigger"; - } + level.levelspawndvars = ::levelspawndvars; + level.overrideplayerdeathwatchtimer = ::leveloverridetime; + level.useintermissionpointsonwavespawn = ::useintermissionpointsonwavespawn; + maps\mp\mp_hijacked_fx::main(); + precachemodel( "collision_physics_64x64x10" ); + precachemodel( "collision_physics_wall_64x64x10" ); + precachemodel( "collision_physics_cylinder_32x128" ); + precachemodel( "collision_clip_64x64x10" ); + maps\mp\_load::main(); + maps\mp\mp_hijacked_amb::main(); + + if ( level.gametype == "dm" ) + { + spawn( "mp_dm_spawn", ( 82, 262, -135.5 ), 0, 187, 0 ); + spawn( "mp_dm_spawn", ( 783.5, 90, 58 ), 0, 198, 0 ); + spawn( "mp_dm_spawn", ( 1103.5, -187.5, 192 ), 0, 165, 0 ); + spawn( "mp_dm_spawn", ( -3012, -178, -136 ), 0, 335, 0 ); + spawn( "mp_dm_spawn", ( -3016, 176, -136 ), 0, 28, 0 ); + spawn( "mp_dm_spawn", ( -1022.5, -109.5, -136 ), 0, 5, 0 ); + spawn( "mp_dm_spawn", ( -874, 661, -14 ), 0, 5, 0 ); + spawn( "mp_dm_spawn", ( -1048, -333, 201 ), 0, 69, 0 ); + spawn( "mp_dm_spawn", ( -1462.5, 169.5, -8 ), 0, 48, 0 ); + } + + if ( level.gametype == "tdm" ) + { + spawn( "mp_tdm_spawn", ( 82, 262, -135.5 ), 0, 187, 0 ); + spawn( "mp_tdm_spawn", ( 783.5, 90, 58 ), 0, 198, 0 ); + spawn( "mp_tdm_spawn", ( 1103.5, -187.5, 192 ), 0, 165, 0 ); + spawn( "mp_tdm_spawn", ( -3012, -178, -136 ), 0, 335, 0 ); + spawn( "mp_tdm_spawn", ( -3016, 176, -136 ), 0, 28, 0 ); + spawn( "mp_tdm_spawn", ( -1022.5, -109.5, -136 ), 0, 5, 0 ); + spawn( "mp_tdm_spawn", ( -874, 661, -14 ), 0, 5, 0 ); + spawn( "mp_tdm_spawn", ( -1048, -333, 201 ), 0, 69, 0 ); + spawn( "mp_tdm_spawn", ( -1462.5, 169.5, -8 ), 0, 48, 0 ); + } + + if ( level.gametype == "conf" ) + { + spawn( "mp_tdm_spawn", ( 82, 262, -135.5 ), 0, 187, 0 ); + spawn( "mp_tdm_spawn", ( 783.5, 90, 58 ), 0, 198, 0 ); + spawn( "mp_tdm_spawn", ( 1103.5, -187.5, 192 ), 0, 165, 0 ); + spawn( "mp_tdm_spawn", ( -3012, -178, -136 ), 0, 335, 0 ); + spawn( "mp_tdm_spawn", ( -3016, 176, -136 ), 0, 28, 0 ); + spawn( "mp_tdm_spawn", ( -1022.5, -109.5, -136 ), 0, 5, 0 ); + spawn( "mp_tdm_spawn", ( -874, 661, -14 ), 0, 5, 0 ); + spawn( "mp_tdm_spawn", ( -1048, -333, 201 ), 0, 69, 0 ); + spawn( "mp_tdm_spawn", ( -1462.5, 169.5, -8 ), 0, 48, 0 ); + } + + if ( level.gametype == "ctf" ) + { + spawn( "mp_ctf_spawn_axis", ( 82, 262, -135.5 ), 0, 187, 0 ); + spawn( "mp_ctf_spawn_axis", ( 249, 682, 48 ), 0, 183, 0 ); + spawn( "mp_ctf_spawn_axis", ( 1103.5, -187.5, 192 ), 0, 165, 0 ); + spawn( "mp_ctf_spawn_allies", ( -1022.5, -109.5, -136 ), 0, 5, 0 ); + spawn( "mp_ctf_spawn_allies", ( -874, 661, -14 ), 0, 5, 0 ); + spawn( "mp_ctf_spawn_allies", ( -1462.5, 169.5, -8 ), 0, 48, 0 ); + } + + if ( level.gametype == "dom" ) + { + spawn( "mp_dom_spawn", ( 82, 262, -135.5 ), 0, 187, 0 ); + spawn( "mp_dom_spawn", ( 249, 682, 48 ), 0, 183, 0 ); + spawn( "mp_dom_spawn", ( 1103.5, -187.5, 192 ), 0, 165, 0 ); + spawn( "mp_dom_spawn", ( -1022.5, -109.5, -136 ), 0, 5, 0 ); + spawn( "mp_dom_spawn", ( -874, 661, -14 ), 0, 5, 0 ); + spawn( "mp_dom_spawn", ( -1462.5, 169.5, -8 ), 0, 48, 0 ); + spawn( "mp_dom_spawn", ( -1048, -333, 201 ), 0, 69, 0 ); + } + + if ( level.gametype == "dem" ) + { + spawn( "mp_dem_spawn_attacker", ( 1103.5, -187.5, 192 ), 0, 165, 0 ); + spawn( "mp_dem_spawn_attacker", ( 783.5, 90, 58 ), 0, 198, 0 ); + } + + maps\mp\_compass::setupminimap( "compass_map_mp_hijacked" ); + spawncollision( "collision_physics_64x64x10", "collider", ( 1660, 40, 59 ), vectorscale( ( 0, 0, -1 ), 90.0 ) ); + spawncollision( "collision_physics_64x64x10", "collider", ( 1633, 40, 48 ), vectorscale( ( 0, 0, -1 ), 90.0 ) ); + spawncollision( "collision_physics_64x64x10", "collider", ( 1660, -42, 59 ), vectorscale( ( 0, 0, -1 ), 90.0 ) ); + spawncollision( "collision_physics_64x64x10", "collider", ( 1632, -42, 48 ), vectorscale( ( 0, 0, -1 ), 90.0 ) ); + spawncollision( "collision_physics_64x64x10", "collider", ( 904, 18, 53 ), ( 0, 270, -90 ) ); + spawncollision( "collision_physics_64x64x10", "collider", ( 904, 91, 90 ), ( 0, 270, -90 ) ); + spawncollision( "collision_physics_cylinder_32x128", "collider", ( -1055, 10, 216 ), vectorscale( ( 0, 0, -1 ), 90.0 ) ); + spawncollision( "collision_clip_64x64x10", "collider", ( -1912.65, -245, -76.3463 ), vectorscale( ( 1, 0, 0 ), 282.0 ) ); + spawncollision( "collision_physics_wall_64x64x10", "collider", ( -1064, 412, 254 ), vectorscale( ( 1, 0, 0 ), 342.8 ) ); + spawncollision( "collision_physics_wall_64x64x10", "collider", ( -1112, 416.5, 284 ), vectorscale( ( 1, 0, 0 ), 316.3 ) ); + level.levelkothdisable = []; + level.levelkothdisable[level.levelkothdisable.size] = spawn( "trigger_radius", ( 402, 181.5, 35 ), 0, 70, 128 ); + level.levelkothdisable[level.levelkothdisable.size] = spawn( "trigger_radius", ( -96, 320, 34 ), 0, 150, 80 ); + level thread water_trigger_init(); + + if ( level.gametype == "koth" ) + { + trigs = getentarray( "koth_zone_trigger", "targetname" ); + + foreach ( trigger in trigs ) + { + if ( trigger.origin == ( -239, 86, -83 ) ) + { + trigger delete(); + break; + } + } + + trigger = spawn( "trigger_box", ( -204, 92, -128 ), 1, 2088, 504, 160 ); + trigger.targetname = "koth_zone_trigger"; + } } -levelspawndvars( reset_dvars ) //checked matches cerberus output +levelspawndvars( reset_dvars ) { - ss = level.spawnsystem; - ss.enemy_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_radius", "1600", reset_dvars ); - ss.dead_friend_influencer_radius = set_dvar_float_if_unset( "scr_spawn_dead_friend_influencer_radius", "1400", reset_dvars ); - ss.dead_friend_influencer_timeout_seconds = set_dvar_float_if_unset( "scr_spawn_dead_friend_influencer_timeout_seconds", "8", reset_dvars ); - ss.dead_friend_influencer_count = set_dvar_float_if_unset( "scr_spawn_dead_friend_influencer_count", "10", reset_dvars ); - ss.enemy_spawned_influencer_timeout_seconds = set_dvar_float_if_unset( "scr_spawn_enemy_spawned_influencer_timeout_seconds", "12", reset_dvars ); - ss.dom_unowned_flag_influencer_radius = set_dvar_float_if_unset( "scr_spawn_dom_unowned_flag_influencer_radius", "1200", reset_dvars ); - ss.dom_unowned_flag_influencer_score = set_dvar_float_if_unset( "scr_spawn_dom_unowned_flag_influencer_score", "-25", reset_dvars ); - ss.dom_enemy_flag_influencer_radius[ 0 ] = set_dvar_float_if_unset( "scr_spawn_dom_enemy_flag_A_influencer_radius", "1200", reset_dvars ); + ss = level.spawnsystem; + ss.enemy_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_radius", "1600", reset_dvars ); + ss.dead_friend_influencer_radius = set_dvar_float_if_unset( "scr_spawn_dead_friend_influencer_radius", "1400", reset_dvars ); + ss.dead_friend_influencer_timeout_seconds = set_dvar_float_if_unset( "scr_spawn_dead_friend_influencer_timeout_seconds", "8", reset_dvars ); + ss.dead_friend_influencer_count = set_dvar_float_if_unset( "scr_spawn_dead_friend_influencer_count", "10", reset_dvars ); + ss.enemy_spawned_influencer_timeout_seconds = set_dvar_float_if_unset( "scr_spawn_enemy_spawned_influencer_timeout_seconds", "12", reset_dvars ); + ss.dom_unowned_flag_influencer_radius = set_dvar_float_if_unset( "scr_spawn_dom_unowned_flag_influencer_radius", "1200", reset_dvars ); + ss.dom_unowned_flag_influencer_score = set_dvar_float_if_unset( "scr_spawn_dom_unowned_flag_influencer_score", "-25", reset_dvars ); + ss.dom_enemy_flag_influencer_radius[0] = set_dvar_float_if_unset( "scr_spawn_dom_enemy_flag_A_influencer_radius", "1200", reset_dvars ); } -water_trigger_init() //checked partially changed to match cerberus see info.md +water_trigger_init() { - wait 3; - triggers = getentarray( "trigger_hurt", "classname" ); - foreach ( trigger in triggers ) - { - if ( trigger.origin[ 2 ] > level.mapcenter[ 2 ] ) - { - } - else - { - trigger thread water_trigger_think(); - } - } - triggers = getentarray( "water_killbrush", "targetname" ); - foreach ( trigger in triggers ) - { - trigger thread player_splash_think(); - } + wait 3; + triggers = getentarray( "trigger_hurt", "classname" ); + + foreach ( trigger in triggers ) + { + if ( trigger.origin[2] > level.mapcenter[2] ) + continue; + + trigger thread water_trigger_think(); + } + + triggers = getentarray( "water_killbrush", "targetname" ); + + foreach ( trigger in triggers ) + trigger thread player_splash_think(); } -player_splash_think() //checked matches cerberus output +player_splash_think() { - for ( ;; ) - { - self waittill( "trigger", entity ); - if ( isplayer( entity ) && isalive( entity ) ) - { - self thread trigger_thread( entity, ::player_water_fx ); - } - } + for (;;) + { + self waittill( "trigger", entity ); + + if ( isplayer( entity ) && isalive( entity ) ) + self thread trigger_thread( entity, ::player_water_fx ); + } } -player_water_fx( player, endon_condition ) //checked matches cerberus output +player_water_fx( player, endon_condition ) { - maxs = self.origin + self getmaxs(); - if ( maxs[ 2 ] > 60 ) - { - maxs += vectorScale( ( 0, 0, 1 ), 10 ); - } - origin = ( player.origin[ 0 ], player.origin[ 1 ], maxs[ 2 ] ); - playfx( level._effect[ "water_splash_sm" ], origin ); + maxs = self.origin + self getmaxs(); + + if ( maxs[2] > 60 ) + maxs += vectorscale( ( 0, 0, 1 ), 10.0 ); + + origin = ( player.origin[0], player.origin[1], maxs[2] ); + playfx( level._effect["water_splash_sm"], origin ); } -water_trigger_think() //checked matches cerberus output +water_trigger_think() { - for ( ;; ) - { - self waittill( "trigger", entity ); - if ( isplayer( entity ) ) - { - entity playsound( "mpl_splash_death" ); - playfx( level._effect[ "water_splash" ], entity.origin + vectorScale( ( 0, 0, 1 ), 40 ) ); - } - } + for (;;) + { + self waittill( "trigger", entity ); + + if ( isplayer( entity ) ) + { + entity playsound( "mpl_splash_death" ); + playfx( level._effect["water_splash"], entity.origin + vectorscale( ( 0, 0, 1 ), 40.0 ) ); + } + } } -leveloverridetime( defaulttime ) //checked matches cerberus output +leveloverridetime( defaulttime ) { - if ( self isinwater() ) - { - return 0.4; - } - return defaulttime; + if ( self isinwater() ) + return 0.4; + + return defaulttime; } -useintermissionpointsonwavespawn() //checked matches cerberus output +useintermissionpointsonwavespawn() { - return self isinwater(); + return self isinwater(); } -isinwater() //checked partially changed to match cerberus output see info.md +isinwater() { - triggers = getentarray( "trigger_hurt", "classname" ); - foreach ( trigger in triggers ) - { - if ( trigger.origin[ 2 ] > level.mapcenter[ 2 ] ) - { - } - else - { - if ( self istouching( trigger ) ) - { - return 1; - } - } - } - return 0; -} + triggers = getentarray( "trigger_hurt", "classname" ); + foreach ( trigger in triggers ) + { + if ( trigger.origin[2] > level.mapcenter[2] ) + continue; + + if ( self istouching( trigger ) ) + return true; + } + + return false; +} diff --git a/Multiplayer Core/patch_mp/maps/mp/mp_hydro.gsc b/Multiplayer Core/patch_mp/maps/mp/mp_hydro.gsc index 18af3d3..c63ec86 100644 --- a/Multiplayer Core/patch_mp/maps/mp/mp_hydro.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/mp_hydro.gsc @@ -1,473 +1,450 @@ -//checked includes changed to match cerberus output -#include maps/mp/gametypes/_weaponobjects; -#include maps/mp/killstreaks/_rcbomb; -#include maps/mp/_tacticalinsertion; -#include maps/mp/killstreaks/_airsupport; -#include maps/mp/_compass; -#include maps/mp/mp_hydro_amb; -#include maps/mp/_load; -#include maps/mp/mp_hydro_fx; -#include maps/mp/_events; -#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\_events; +#include maps\mp\mp_hydro_fx; +#include maps\mp\_load; +#include maps\mp\mp_hydro_amb; +#include maps\mp\_compass; +#include maps\mp\killstreaks\_airsupport; +#include maps\mp\_tacticalinsertion; +#include maps\mp\killstreaks\_rcbomb; +#include maps\mp\gametypes\_weaponobjects; -main() //checked changed to match cerberus output +main() { - level.levelspawndvars = ::levelspawndvars; - precacheitem( "hydro_water_mp" ); - maps/mp/mp_hydro_fx::main(); - precachemodel( "collision_physics_256x256x10" ); - precachemodel( "collision_missile_128x128x10" ); - precachemodel( "collision_physics_64x64x64" ); - maps/mp/_load::main(); - maps/mp/mp_hydro_amb::main(); - maps/mp/_compass::setupminimap( "compass_map_mp_hydro" ); - maps/mp/mp_hydro_amb::main(); - /* + level.levelspawndvars = ::levelspawndvars; + precacheitem( "hydro_water_mp" ); + maps\mp\mp_hydro_fx::main(); + precachemodel( "collision_physics_256x256x10" ); + precachemodel( "collision_missile_128x128x10" ); + precachemodel( "collision_physics_64x64x64" ); + maps\mp\_load::main(); + maps\mp\mp_hydro_amb::main(); + maps\mp\_compass::setupminimap( "compass_map_mp_hydro" ); + maps\mp\mp_hydro_amb::main(); /# - execdevgui( "devgui_mp_hydro" ); + execdevgui( "devgui_mp_hydro" ); #/ - */ - registerclientfield( "world", "pre_wave", 1, 1, "int" ); - registerclientfield( "world", "big_wave", 1, 1, "int" ); - setdvar( "compassmaxrange", "2300" ); - game[ "strings" ][ "war_callsign_a" ] = &"MPUI_CALLSIGN_MAPNAME_A"; - game[ "strings" ][ "war_callsign_b" ] = &"MPUI_CALLSIGN_MAPNAME_B"; - game[ "strings" ][ "war_callsign_c" ] = &"MPUI_CALLSIGN_MAPNAME_C"; - game[ "strings" ][ "war_callsign_d" ] = &"MPUI_CALLSIGN_MAPNAME_D"; - game[ "strings" ][ "war_callsign_e" ] = &"MPUI_CALLSIGN_MAPNAME_E"; - game[ "strings_menu" ][ "war_callsign_a" ] = "@MPUI_CALLSIGN_MAPNAME_A"; - game[ "strings_menu" ][ "war_callsign_b" ] = "@MPUI_CALLSIGN_MAPNAME_B"; - game[ "strings_menu" ][ "war_callsign_c" ] = "@MPUI_CALLSIGN_MAPNAME_C"; - game[ "strings_menu" ][ "war_callsign_d" ] = "@MPUI_CALLSIGN_MAPNAME_D"; - game[ "strings_menu" ][ "war_callsign_e" ] = "@MPUI_CALLSIGN_MAPNAME_E"; - spawncollision( "collision_physics_256x256x10", "collider", ( 3695, 340, 84 ), ( 0, 44.8, -90 ) ); - spawncollision( "collision_physics_256x256x10", "collider", ( 3449, 82, 84 ), ( 0, 44.8, -90 ) ); - spawncollision( "collision_physics_64x64x64", "collider", ( 577.5, -1835, 309.5 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_64x64x64", "collider", ( 577.5, -1786.5, 339.5 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_64x64x64", "collider", ( -641.5, -1834.5, 309.5 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_64x64x64", "collider", ( -641.5, -1786, 339.5 ), ( 0, 0, 0 ) ); - spawncollision( "collision_missile_128x128x10", "collider", ( -521.5, -2106, 325 ), vectorScale( ( 0, 0, 1 ), 90 ) ); - spawncollision( "collision_missile_128x128x10", "collider", ( -521.5, -2041, 325 ), vectorScale( ( 0, 0, 1 ), 90 ) ); - spawncollision( "collision_missile_128x128x10", "collider", ( 471.5, -2106, 325 ), vectorScale( ( 0, 0, 1 ), 90 ) ); - spawncollision( "collision_missile_128x128x10", "collider", ( 471.5, -2041, 325 ), vectorScale( ( 0, 0, 1 ), 90 ) ); - spawncollision( "collision_missile_128x128x10", "collider", ( 1432, -1912, 376.5 ), vectorScale( ( 0, 0, 1 ), 90 ) ); - spawncollision( "collision_missile_128x128x10", "collider", ( 1516.5, -1912, 376.5 ), vectorScale( ( 0, 0, 1 ), 90 ) ); - spawncollision( "collision_missile_128x128x10", "collider", ( -1490, -1916.5, 376.5 ), vectorScale( ( 0, 0, 1 ), 90 ) ); - spawncollision( "collision_missile_128x128x10", "collider", ( -1574.5, -1916.5, 376.5 ), vectorScale( ( 0, 0, 1 ), 90 ) ); - level.waterrushfx = loadfx( "maps/mp_maps/fx_mp_hydro_dam_water_wall" ); - level.waterambientfxmiddlefront = loadfx( "maps/mp_maps/fx_mp_hydro_flood_splash_middle_front" ); - level.waterambientfxmiddleback = loadfx( "maps/mp_maps/fx_mp_hydro_flood_splash_middle_back" ); - level.waterambientfxleftfront = loadfx( "maps/mp_maps/fx_mp_hydro_flood_splash_right" ); - level.waterambientfxleftmiddle = loadfx( "maps/mp_maps/fx_mp_hydro_flood_splash_left_mid" ); - level.waterambientfxleftback = loadfx( "maps/mp_maps/fx_mp_hydro_flood_splash_left_back" ); - level.waterambientfxrightfront = loadfx( "maps/mp_maps/fx_mp_hydro_flood_splash_left" ); - level.waterambientfxrightmiddle = loadfx( "maps/mp_maps/fx_mp_hydro_flood_splash_right_mid" ); - level.waterambientfxrightback = loadfx( "maps/mp_maps/fx_mp_hydro_flood_splash_right_back" ); - level.waterambientfxboxfront = loadfx( "maps/mp_maps/fx_mp_hydro_flood_splash_box" ); - level.waterambientfxboxback = loadfx( "maps/mp_maps/fx_mp_hydro_flood_splash_box_back" ); - setdvar( "tu6_player_shallowWaterHeight", "10.5" ); - visionsetnaked( "mp_hydro", 1 ); - level thread removeobjectsondemovertime(); - set_dvar_if_unset( "scr_hydro_water_rush", 1 ); - if ( getgametypesetting( "allowMapScripting" ) ) - { - level.overrideplayerdeathwatchtimer = ::leveloverridetime; - initwatertriggers(); - } + registerclientfield( "world", "pre_wave", 1, 1, "int" ); + registerclientfield( "world", "big_wave", 1, 1, "int" ); + setdvar( "compassmaxrange", "2300" ); + game["strings"]["war_callsign_a"] = &"MPUI_CALLSIGN_MAPNAME_A"; + game["strings"]["war_callsign_b"] = &"MPUI_CALLSIGN_MAPNAME_B"; + game["strings"]["war_callsign_c"] = &"MPUI_CALLSIGN_MAPNAME_C"; + game["strings"]["war_callsign_d"] = &"MPUI_CALLSIGN_MAPNAME_D"; + game["strings"]["war_callsign_e"] = &"MPUI_CALLSIGN_MAPNAME_E"; + game["strings_menu"]["war_callsign_a"] = "@MPUI_CALLSIGN_MAPNAME_A"; + game["strings_menu"]["war_callsign_b"] = "@MPUI_CALLSIGN_MAPNAME_B"; + game["strings_menu"]["war_callsign_c"] = "@MPUI_CALLSIGN_MAPNAME_C"; + game["strings_menu"]["war_callsign_d"] = "@MPUI_CALLSIGN_MAPNAME_D"; + game["strings_menu"]["war_callsign_e"] = "@MPUI_CALLSIGN_MAPNAME_E"; + spawncollision( "collision_physics_256x256x10", "collider", ( 3695, 340, 84 ), ( 0, 44.8, -90 ) ); + spawncollision( "collision_physics_256x256x10", "collider", ( 3449, 82, 84 ), ( 0, 44.8, -90 ) ); + spawncollision( "collision_physics_64x64x64", "collider", ( 577.5, -1835, 309.5 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_64x64x64", "collider", ( 577.5, -1786.5, 339.5 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_64x64x64", "collider", ( -641.5, -1834.5, 309.5 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_64x64x64", "collider", ( -641.5, -1786, 339.5 ), ( 0, 0, 0 ) ); + spawncollision( "collision_missile_128x128x10", "collider", ( -521.5, -2106, 325 ), vectorscale( ( 0, 0, 1 ), 90.0 ) ); + spawncollision( "collision_missile_128x128x10", "collider", ( -521.5, -2041, 325 ), vectorscale( ( 0, 0, 1 ), 90.0 ) ); + spawncollision( "collision_missile_128x128x10", "collider", ( 471.5, -2106, 325 ), vectorscale( ( 0, 0, 1 ), 90.0 ) ); + spawncollision( "collision_missile_128x128x10", "collider", ( 471.5, -2041, 325 ), vectorscale( ( 0, 0, 1 ), 90.0 ) ); + spawncollision( "collision_missile_128x128x10", "collider", ( 1432, -1912, 376.5 ), vectorscale( ( 0, 0, 1 ), 90.0 ) ); + spawncollision( "collision_missile_128x128x10", "collider", ( 1516.5, -1912, 376.5 ), vectorscale( ( 0, 0, 1 ), 90.0 ) ); + spawncollision( "collision_missile_128x128x10", "collider", ( -1490, -1916.5, 376.5 ), vectorscale( ( 0, 0, 1 ), 90.0 ) ); + spawncollision( "collision_missile_128x128x10", "collider", ( -1574.5, -1916.5, 376.5 ), vectorscale( ( 0, 0, 1 ), 90.0 ) ); + level.waterrushfx = loadfx( "maps/mp_maps/fx_mp_hydro_dam_water_wall" ); + level.waterambientfxmiddlefront = loadfx( "maps/mp_maps/fx_mp_hydro_flood_splash_middle_front" ); + level.waterambientfxmiddleback = loadfx( "maps/mp_maps/fx_mp_hydro_flood_splash_middle_back" ); + level.waterambientfxleftfront = loadfx( "maps/mp_maps/fx_mp_hydro_flood_splash_right" ); + level.waterambientfxleftmiddle = loadfx( "maps/mp_maps/fx_mp_hydro_flood_splash_left_mid" ); + level.waterambientfxleftback = loadfx( "maps/mp_maps/fx_mp_hydro_flood_splash_left_back" ); + level.waterambientfxrightfront = loadfx( "maps/mp_maps/fx_mp_hydro_flood_splash_left" ); + level.waterambientfxrightmiddle = loadfx( "maps/mp_maps/fx_mp_hydro_flood_splash_right_mid" ); + level.waterambientfxrightback = loadfx( "maps/mp_maps/fx_mp_hydro_flood_splash_right_back" ); + level.waterambientfxboxfront = loadfx( "maps/mp_maps/fx_mp_hydro_flood_splash_box" ); + level.waterambientfxboxback = loadfx( "maps/mp_maps/fx_mp_hydro_flood_splash_box_back" ); + setdvar( "tu6_player_shallowWaterHeight", "10.5" ); + visionsetnaked( "mp_hydro", 1 ); + level thread removeobjectsondemovertime(); + set_dvar_if_unset( "scr_hydro_water_rush", 1 ); + + if ( getgametypesetting( "allowMapScripting" ) ) + { + level.overrideplayerdeathwatchtimer = ::leveloverridetime; + initwatertriggers(); + } } -levelspawndvars( reset_dvars ) //checked matches cerberus output +levelspawndvars( reset_dvars ) { - ss = level.spawnsystem; - ss.enemy_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_radius", "2400", reset_dvars ); + ss = level.spawnsystem; + ss.enemy_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_radius", "2400", reset_dvars ); } -leveloverridetime( defaulttime ) //checked matches cerberus output +leveloverridetime( defaulttime ) { - if ( isDefined( self.lastattacker ) && isDefined( self.lastattacker.targetname ) && self.lastattacker.targetname == "water_kill_trigger" ) - { - return 0.4; - } - return defaulttime; + if ( isdefined( self.lastattacker ) && isdefined( self.lastattacker.targetname ) && self.lastattacker.targetname == "water_kill_trigger" ) + return 0.4; + + return defaulttime; } -initwatertriggers() //checked changed to match cerberus output +initwatertriggers() { - water_kill_triggers = getentarray( "water_kill_trigger", "targetname" ); - water_mover = spawn( "script_model", ( 0, 0, 0 ) ); - water_mover setmodel( "tag_origin" ); - water_ambient_mover = spawn( "script_model", ( 0, 0, 0 ) ); - water_ambient_mover setmodel( "tag_origin" ); - water_ambient_front_pillar = spawn( "script_model", ( -31, -888, 202 ) ); - water_ambient_front_pillar setmodel( "tag_origin" ); - water_ambient_front_pillar.angles = vectorScale( ( 0, 1, 0 ), 90 ); - water_ambient_front_pillar linkto( water_ambient_mover ); - water_ambient_back_pillar = spawn( "script_model", ( -32, -1535, 202 ) ); - water_ambient_back_pillar setmodel( "tag_origin" ); - water_ambient_back_pillar.angles = vectorScale( ( 0, 1, 0 ), 90 ); - water_ambient_back_pillar linkto( water_ambient_mover ); - water_ambient_front_block = spawn( "script_model", ( -32, -331, 193 ) ); - water_ambient_front_block setmodel( "tag_origin" ); - water_ambient_front_block.angles = vectorScale( ( 0, 1, 0 ), 90 ); - water_ambient_front_block linkto( water_ambient_mover ); - water_ambient_back_block = spawn( "script_model", ( -32, -1800, 199 ) ); - water_ambient_back_block setmodel( "tag_origin" ); - water_ambient_back_block.angles = vectorScale( ( 0, 1, 0 ), 90 ); - water_ambient_back_block linkto( water_ambient_mover ); - water_ambient_back_right = spawn( "script_model", ( -467, -1975, 190 ) ); - water_ambient_back_right setmodel( "tag_origin" ); - water_ambient_back_right.angles = vectorScale( ( 0, 1, 0 ), 90 ); - water_ambient_back_right linkto( water_ambient_mover ); - water_ambient_back_left = spawn( "script_model", ( 404, -1975, 190 ) ); - water_ambient_back_left setmodel( "tag_origin" ); - water_ambient_back_left.angles = vectorScale( ( 0, 1, 0 ), 90 ); - water_ambient_back_left linkto( water_ambient_mover ); - water_ambient_middle_right = spawn( "script_model", ( -274, -1680, 185 ) ); - water_ambient_middle_right setmodel( "tag_origin" ); - water_ambient_middle_right.angles = vectorScale( ( 0, 1, 0 ), 90 ); - water_ambient_middle_right linkto( water_ambient_mover ); - water_ambient_middle_left = spawn( "script_model", ( 215, -1680, 185 ) ); - water_ambient_middle_left setmodel( "tag_origin" ); - water_ambient_middle_left.angles = vectorScale( ( 0, 1, 0 ), 90 ); - water_ambient_middle_left linkto( water_ambient_mover ); - water_ambient_front_right = spawn( "script_model", ( -333, -302, 185 ) ); - water_ambient_front_right setmodel( "tag_origin" ); - water_ambient_front_right.angles = vectorScale( ( 0, 1, 0 ), 90 ); - water_ambient_front_right linkto( water_ambient_mover ); - water_ambient_front_left = spawn( "script_model", ( 265, -302, 185 ) ); - water_ambient_front_left setmodel( "tag_origin" ); - water_ambient_front_left.angles = vectorScale( ( 0, 1, 0 ), 90 ); - water_ambient_front_left linkto( water_ambient_mover ); - water_pa_1 = spawn( "script_model", ( 1667, -1364, 684 ) ); - water_pa_1 setmodel( "tag_origin" ); - water_pa_2 = spawn( "script_model", ( -1806, -1375, 783 ) ); - water_pa_2 setmodel( "tag_origin" ); - water_pa_3 = spawn( "script_model", ( -100, -1375, 783 ) ); - water_pa_3 setmodel( "tag_origin" ); - wait 0.1; - water_kill_triggers = []; - water_kill_triggers[ 0 ] enablelinkto(); - water_kill_triggers[ 0 ] linkto( water_mover ); - water_kill_triggers[ 1 ] enablelinkto(); - water_kill_triggers[ 1 ] linkto( water_mover ); - playfxontag( level.waterambientfxmiddlefront, water_ambient_front_pillar, "tag_origin" ); - playfxontag( level.waterambientfxmiddleback, water_ambient_back_pillar, "tag_origin" ); - playfxontag( level.waterambientfxboxfront, water_ambient_front_block, "tag_origin" ); - playfxontag( level.waterambientfxboxback, water_ambient_back_block, "tag_origin" ); - playfxontag( level.waterambientfxrightback, water_ambient_back_right, "tag_origin" ); - playfxontag( level.waterambientfxleftback, water_ambient_back_left, "tag_origin" ); - playfxontag( level.waterambientfxrightmiddle, water_ambient_middle_right, "tag_origin" ); - playfxontag( level.waterambientfxleftmiddle, water_ambient_middle_left, "tag_origin" ); - playfxontag( level.waterambientfxrightfront, water_ambient_front_right, "tag_origin" ); - playfxontag( level.waterambientfxleftfront, water_ambient_front_left, "tag_origin" ); - setdvar( "R_WaterWaveBase", 0 ); - if ( level.timelimit ) - { - seconds = level.timelimit * 60; - add_timed_event( int( seconds * 0.25 ), "hydro_water_rush" ); - add_timed_event( int( seconds * 0.75 ), "hydro_water_rush" ); - } - else if ( level.scorelimit ) - { - add_score_event( int( level.scorelimit * 0.25 ), "hydro_water_rush" ); - add_score_event( int( level.scorelimit * 0.75 ), "hydro_water_rush" ); - } - trigger = spawn( "trigger_radius", ( -28, -2208, -830 ), 0, 450, 40 ); - water_kill_triggers[ water_kill_triggers.size ] = trigger; - self thread watchwatertrigger( water_mover, water_kill_triggers, water_pa_1, water_pa_2, water_pa_3, water_ambient_back_pillar, water_ambient_front_block, water_ambient_mover ); - wait 5; - setdvar( "R_WaterWaveBase", 0 ); + water_kill_triggers = getentarray( "water_kill_trigger", "targetname" ); + water_mover = spawn( "script_model", ( 0, 0, 0 ) ); + water_mover setmodel( "tag_origin" ); + water_ambient_mover = spawn( "script_model", ( 0, 0, 0 ) ); + water_ambient_mover setmodel( "tag_origin" ); + water_ambient_front_pillar = spawn( "script_model", ( -31, -888, 202 ) ); + water_ambient_front_pillar setmodel( "tag_origin" ); + water_ambient_front_pillar.angles = vectorscale( ( 0, 1, 0 ), 90.0 ); + water_ambient_front_pillar linkto( water_ambient_mover ); + water_ambient_back_pillar = spawn( "script_model", ( -32, -1535, 202 ) ); + water_ambient_back_pillar setmodel( "tag_origin" ); + water_ambient_back_pillar.angles = vectorscale( ( 0, 1, 0 ), 90.0 ); + water_ambient_back_pillar linkto( water_ambient_mover ); + water_ambient_front_block = spawn( "script_model", ( -32, -331, 193 ) ); + water_ambient_front_block setmodel( "tag_origin" ); + water_ambient_front_block.angles = vectorscale( ( 0, 1, 0 ), 90.0 ); + water_ambient_front_block linkto( water_ambient_mover ); + water_ambient_back_block = spawn( "script_model", ( -32, -1800, 199 ) ); + water_ambient_back_block setmodel( "tag_origin" ); + water_ambient_back_block.angles = vectorscale( ( 0, 1, 0 ), 90.0 ); + water_ambient_back_block linkto( water_ambient_mover ); + water_ambient_back_right = spawn( "script_model", ( -467, -1975, 190 ) ); + water_ambient_back_right setmodel( "tag_origin" ); + water_ambient_back_right.angles = vectorscale( ( 0, 1, 0 ), 90.0 ); + water_ambient_back_right linkto( water_ambient_mover ); + water_ambient_back_left = spawn( "script_model", ( 404, -1975, 190 ) ); + water_ambient_back_left setmodel( "tag_origin" ); + water_ambient_back_left.angles = vectorscale( ( 0, 1, 0 ), 90.0 ); + water_ambient_back_left linkto( water_ambient_mover ); + water_ambient_middle_right = spawn( "script_model", ( -274, -1680, 185 ) ); + water_ambient_middle_right setmodel( "tag_origin" ); + water_ambient_middle_right.angles = vectorscale( ( 0, 1, 0 ), 90.0 ); + water_ambient_middle_right linkto( water_ambient_mover ); + water_ambient_middle_left = spawn( "script_model", ( 215, -1680, 185 ) ); + water_ambient_middle_left setmodel( "tag_origin" ); + water_ambient_middle_left.angles = vectorscale( ( 0, 1, 0 ), 90.0 ); + water_ambient_middle_left linkto( water_ambient_mover ); + water_ambient_front_right = spawn( "script_model", ( -333, -302, 185 ) ); + water_ambient_front_right setmodel( "tag_origin" ); + water_ambient_front_right.angles = vectorscale( ( 0, 1, 0 ), 90.0 ); + water_ambient_front_right linkto( water_ambient_mover ); + water_ambient_front_left = spawn( "script_model", ( 265, -302, 185 ) ); + water_ambient_front_left setmodel( "tag_origin" ); + water_ambient_front_left.angles = vectorscale( ( 0, 1, 0 ), 90.0 ); + water_ambient_front_left linkto( water_ambient_mover ); + water_pa_1 = spawn( "script_model", ( 1667, -1364, 684 ) ); + water_pa_1 setmodel( "tag_origin" ); + water_pa_2 = spawn( "script_model", ( -1806, -1375, 783 ) ); + water_pa_2 setmodel( "tag_origin" ); + water_pa_3 = spawn( "script_model", ( -100, -1375, 783 ) ); + water_pa_3 setmodel( "tag_origin" ); + wait 0.1; + water_kill_triggers[0] enablelinkto(); + water_kill_triggers[0] linkto( water_mover ); + water_kill_triggers[1] enablelinkto(); + water_kill_triggers[1] linkto( water_mover ); + playfxontag( level.waterambientfxmiddlefront, water_ambient_front_pillar, "tag_origin" ); + playfxontag( level.waterambientfxmiddleback, water_ambient_back_pillar, "tag_origin" ); + playfxontag( level.waterambientfxboxfront, water_ambient_front_block, "tag_origin" ); + playfxontag( level.waterambientfxboxback, water_ambient_back_block, "tag_origin" ); + playfxontag( level.waterambientfxrightback, water_ambient_back_right, "tag_origin" ); + playfxontag( level.waterambientfxleftback, water_ambient_back_left, "tag_origin" ); + playfxontag( level.waterambientfxrightmiddle, water_ambient_middle_right, "tag_origin" ); + playfxontag( level.waterambientfxleftmiddle, water_ambient_middle_left, "tag_origin" ); + playfxontag( level.waterambientfxrightfront, water_ambient_front_right, "tag_origin" ); + playfxontag( level.waterambientfxleftfront, water_ambient_front_left, "tag_origin" ); + setdvar( "R_WaterWaveBase", 0 ); + + if ( level.timelimit ) + { + seconds = level.timelimit * 60; + add_timed_event( int( seconds * 0.25 ), "hydro_water_rush" ); + add_timed_event( int( seconds * 0.75 ), "hydro_water_rush" ); + } + else if ( level.scorelimit ) + { + add_score_event( int( level.scorelimit * 0.25 ), "hydro_water_rush" ); + add_score_event( int( level.scorelimit * 0.75 ), "hydro_water_rush" ); + } + + trigger = spawn( "trigger_radius", ( -28, -2208, -830 ), 0, 450, 40 ); + water_kill_triggers[water_kill_triggers.size] = trigger; + self thread watchwatertrigger( water_mover, water_kill_triggers, water_pa_1, water_pa_2, water_pa_3, water_ambient_back_pillar, water_ambient_front_block, water_ambient_mover ); + wait 5; + setdvar( "R_WaterWaveBase", 0 ); } -watchwatertrigger( water_mover, water_kill_triggers, water_pa_1, water_pa_2, water_pa_3, water_ambient_back, water_ambient_box, water_ambient_mover ) //checked changed to match cerberus output +watchwatertrigger( water_mover, water_kill_triggers, water_pa_1, water_pa_2, water_pa_3, water_ambient_back, water_ambient_box, water_ambient_mover ) { - thread watchdevnotify(); - for ( ;; ) - { - level waittill_any( "hydro_water_rush", "dev_water_rush" ); - setclientfield( "pre_wave", 1 ); - level thread waterkilltriggerthink( water_kill_triggers ); - water_ambient_back playloopsound( "amb_train_incomming_beep" ); - water_ambient_box playloopsound( "amb_train_incoming_beep" ); - water_pa_1 playsound( "evt_pa_atten" ); - water_pa_2 playsound( "evt_pa_atten" ); - water_pa_3 playsound( "evt_pa_atten" ); - wait 2; - water_pa_1 playsound( "evt_pa_online" ); - water_pa_2 playsound( "evt_pa_online" ); - water_pa_3 playsound( "evt_pa_online" ); - water_fx1 = spawn( "script_model", water_kill_triggers[ 0 ].origin + vectorScale( ( 0, 1, 0 ), 1000 ) ); - water_fx1 setmodel( "tag_origin" ); - water_fx1.angles = vectorScale( ( 0, 1, 0 ), 90 ); - water_fx2 = spawn( "script_model", water_kill_triggers[ 1 ].origin + vectorScale( ( 0, 1, 0 ), 1000 ) ); - water_fx2 setmodel( "tag_origin" ); - water_fx2.angles = vectorScale( ( 0, 1, 0 ), 90 ); - exploder( 1005 ); - wait 3; - water_pa_1 playsound( "evt_pa_online" ); - water_pa_2 playsound( "evt_pa_online" ); - water_pa_3 playsound( "evt_pa_online" ); - wait 1; - playfxontag( level.waterrushfx, water_fx1, "tag_origin" ); - playfxontag( level.waterrushfx, water_fx2, "tag_origin" ); - water_fx1 playloopsound( "evt_water_wave" ); - water_fx2 playloopsound( "evt_water_wave" ); - water_mover.origin = ( 0, 0, 0 ); - setclientfield( "big_wave", 1 ); - water_mover moveto( vectorScale( ( 0, 1, 0 ), 2100 ), 2.5 ); - water_ambient_mover moveto( vectorScale( ( 0, 0, 1 ), 20 ), 2.5 ); - water_kill_triggers[ 2 ].origin += vectorScale( ( 0, 0, 1 ), 1000 ); - /* + thread watchdevnotify(); + + for (;;) + { + level waittill_any( "hydro_water_rush", "dev_water_rush" ); + setclientfield( "pre_wave", 1 ); + level thread waterkilltriggerthink( water_kill_triggers ); + water_ambient_back playloopsound( "amb_train_incomming_beep" ); + water_ambient_box playloopsound( "amb_train_incoming_beep" ); + water_pa_1 playsound( "evt_pa_atten" ); + water_pa_2 playsound( "evt_pa_atten" ); + water_pa_3 playsound( "evt_pa_atten" ); + wait 2; + water_pa_1 playsound( "evt_pa_online" ); + water_pa_2 playsound( "evt_pa_online" ); + water_pa_3 playsound( "evt_pa_online" ); + water_fx1 = spawn( "script_model", water_kill_triggers[0].origin + vectorscale( ( 0, 1, 0 ), 1000.0 ) ); + water_fx1 setmodel( "tag_origin" ); + water_fx1.angles = vectorscale( ( 0, 1, 0 ), 90.0 ); + water_fx2 = spawn( "script_model", water_kill_triggers[1].origin + vectorscale( ( 0, 1, 0 ), 1000.0 ) ); + water_fx2 setmodel( "tag_origin" ); + water_fx2.angles = vectorscale( ( 0, 1, 0 ), 90.0 ); + exploder( 1005 ); + wait 3; + water_pa_1 playsound( "evt_pa_online" ); + water_pa_2 playsound( "evt_pa_online" ); + water_pa_3 playsound( "evt_pa_online" ); + wait 1; + playfxontag( level.waterrushfx, water_fx1, "tag_origin" ); + playfxontag( level.waterrushfx, water_fx2, "tag_origin" ); + water_fx1 playloopsound( "evt_water_wave" ); + water_fx2 playloopsound( "evt_water_wave" ); + water_mover.origin = ( 0, 0, 0 ); + setclientfield( "big_wave", 1 ); + water_mover moveto( vectorscale( ( 0, 1, 0 ), 2100.0 ), 2.5 ); + water_ambient_mover moveto( vectorscale( ( 0, 0, 1 ), 20.0 ), 2.5 ); + water_kill_triggers[2].origin += vectorscale( ( 0, 0, 1 ), 1000.0 ); /# - maps/mp/killstreaks/_airsupport::debug_cylinder( water_kill_triggers[ 2 ].origin, 450, 40, ( 1, 0,1, 0,1 ), 1, 2500 ); + maps\mp\killstreaks\_airsupport::debug_cylinder( water_kill_triggers[2].origin, 450, 40, ( 1, 0.1, 0.1 ), 1, 2500 ); #/ - */ - level thread waterfxloopstarter( water_fx1, water_fx2, 5 ); - thread play_exploder(); - waterlevel = -24; - wait 2; - water_pa_1 playsound( "evt_pa_warn" ); - water_pa_2 playsound( "evt_pa_warn" ); - water_pa_3 playsound( "evt_pa_warn" ); - wait 3; - water_pa_1 playsound( "evt_pa_offline" ); - water_pa_2 playsound( "evt_pa_offline" ); - water_pa_3 playsound( "evt_pa_offline" ); - wait 1; - water_kill_triggers[ 2 ].origin -= vectorScale( ( 0, 0, 1 ), 1000 ); - /* + level thread waterfxloopstarter( water_fx1, water_fx2, 5 ); + thread play_exploder(); + waterlevel = -24; + wait 2; + water_pa_1 playsound( "evt_pa_warn" ); + water_pa_2 playsound( "evt_pa_warn" ); + water_pa_3 playsound( "evt_pa_warn" ); + wait 3; + water_pa_1 playsound( "evt_pa_offline" ); + water_pa_2 playsound( "evt_pa_offline" ); + water_pa_3 playsound( "evt_pa_offline" ); + wait 1; + water_kill_triggers[2].origin -= vectorscale( ( 0, 0, 1 ), 1000.0 ); /# - maps/mp/killstreaks/_airsupport::debug_cylinder( water_kill_triggers[ 2 ].origin, 450, 40, ( 1, 0,1, 0,1 ), 0, 2500 ); + maps\mp\killstreaks\_airsupport::debug_cylinder( water_kill_triggers[2].origin, 450, 40, ( 1, 0.1, 0.1 ), 0, 2500 ); #/ - */ - water_mover moveto( vectorScale( ( 0, 1, 0 ), 4100 ), 2.5 ); - water_ambient_mover moveto( ( 0, 0, 0 ), 2.5 ); - water_fx1 stoploopsound( 2 ); - water_fx2 stoploopsound( 2 ); - setclientfield( "pre_wave", 0 ); - wait 1.5; - water_pa_1 playsound( "evt_pa_access" ); - water_pa_2 playsound( "evt_pa_access" ); - water_pa_3 playsound( "evt_pa_access" ); - wait 1; - water_ambient_box stoploopsound( 1 ); - water_ambient_back stoploopsound( 1 ); - stop_exploder( 1005 ); - setdvar( "R_WaterWaveAmplitude", "0 0 0 0" ); - water_mover.origin = vectorScale( ( 0, 0, -1 ), 500 ); - wait 2; - water_fx1 delete(); - water_fx2 delete(); - water_mover.origin = ( 0, 0, 0 ); - setclientfield( "big_wave", 0 ); - wait 5; - level notify( "water_stop" ); - } + water_mover moveto( vectorscale( ( 0, 1, 0 ), 4100.0 ), 2.5 ); + water_ambient_mover moveto( ( 0, 0, 0 ), 2.5 ); + water_fx1 stoploopsound( 2 ); + water_fx2 stoploopsound( 2 ); + setclientfield( "pre_wave", 0 ); + wait 1.5; + water_pa_1 playsound( "evt_pa_access" ); + water_pa_2 playsound( "evt_pa_access" ); + water_pa_3 playsound( "evt_pa_access" ); + wait 1; + water_ambient_box stoploopsound( 1 ); + water_ambient_back stoploopsound( 1 ); + stop_exploder( 1005 ); + setdvar( "R_WaterWaveAmplitude", "0 0 0 0" ); + water_mover.origin = vectorscale( ( 0, 0, -1 ), 500.0 ); + wait 2; + water_fx1 delete(); + water_fx2 delete(); + water_mover.origin = ( 0, 0, 0 ); + setclientfield( "big_wave", 0 ); + wait 5; + level notify( "water_stop" ); + } } -play_exploder() //checked matches cerberus output +play_exploder() { - wait 0.2; - exploder( 1002 ); - wait 0.5; - exploder( 1001 ); + wait 0.2; + exploder( 1002 ); + wait 0.5; + exploder( 1001 ); } -watchdevnotify() //checked matches cerberus output dvar names not found +watchdevnotify() { - startvalue = getDvar( #"1CC516F5" ); - for ( ;; ) - { - should_water_rush = getDvar( #"1CC516F5" ); - if ( should_water_rush != startvalue ) - { - level notify( "dev_water_rush" ); - startvalue = should_water_rush; - } - wait 0.2; - } + startvalue = getdvar( "scr_hydro_water_rush" ); + + for (;;) + { + should_water_rush = getdvar( "scr_hydro_water_rush" ); + + if ( should_water_rush != startvalue ) + { + level notify( "dev_water_rush" ); + startvalue = should_water_rush; + } + + wait 0.2; + } } -waterfxloopstarter( fx1, fx2, looptime ) //checked matches cerberus output +waterfxloopstarter( fx1, fx2, looptime ) { - level thread waterfxloop( fx1, fx2 ); + level thread waterfxloop( fx1, fx2 ); } -waterfxloop( fx1, fx2 ) //checked changed to match cerberus output +waterfxloop( fx1, fx2 ) { - start1 = fx1.origin; - start2 = fx2.origin; - fx1 moveto( fx1.origin + vectorScale( ( 0, 1, 0 ), 2200 ), 2.67 ); - fx2 moveto( fx2.origin + vectorScale( ( 0, 1, 0 ), 2200 ), 2.67 ); - wait 2.67; - fx1 moveto( fx1.origin + ( 0, 600, -1000 ), 2.5 ); - fx2 moveto( fx2.origin + ( 0, 600, -1000 ), 2.5 ); - wait 3; - fx1.origin = start1; - fx2.origin = start2; + start1 = fx1.origin; + start2 = fx2.origin; + fx1 moveto( fx1.origin + vectorscale( ( 0, 1, 0 ), 2200.0 ), 2.67 ); + fx2 moveto( fx2.origin + vectorscale( ( 0, 1, 0 ), 2200.0 ), 2.67 ); + wait 2.67; + fx1 moveto( fx1.origin + ( 0, 600, -1000 ), 2.5 ); + fx2 moveto( fx2.origin + ( 0, 600, -1000 ), 2.5 ); + wait 3; + fx1.origin = start1; + fx2.origin = start2; } -waterkilltriggerthink( triggers ) //checked partially changed to match cerberus output see info.md +waterkilltriggerthink( triggers ) { - level endon( "water_stop" ); - for ( ;; ) - { - wait 0.1; - entities = getdamageableentarray( triggers[ 0 ].origin, 2000 ); - i = 0; - while ( i < entities.size ) - { - triggertouched = 0; - if ( !entities[ i ] istouching( triggers[ 0 ] ) ) - { - triggertouched = 1; - if ( !entities[ i ] istouching( triggers[ 1 ] ) ) - { - if ( !entities[ i ] istouching( triggers[ 2 ] ) ) - { - i++; - continue; - } - } - } - if ( isDefined( entities[ i ].model ) && entities[ i ].model == "t6_wpn_tac_insert_world" ) - { - entities[ i ] maps/mp/_tacticalinsertion::destroy_tactical_insertion(); - i++; - continue; - } - if ( !isalive( entities[ i ] ) ) - { - i++; - continue; - } - if ( isDefined( entities[ i ].targetname ) ) - { - if ( entities[ i ].targetname == "talon" ) - { - entities[ i ] notify( "death" ); - i++; - continue; - } - if ( entities[ i ].targetname == "rcbomb" ) - { - entities[ i ] maps/mp/killstreaks/_rcbomb::rcbomb_force_explode(); - i++; - continue; - } - if ( entities[ i ].targetname == "riotshield_mp" ) - { - entities[ i ] dodamage( 1, triggers[ triggertouched ].origin + ( 0, 0, 1 ), triggers[ triggertouched ], triggers[ triggertouched ], 0, "MOD_CRUSH" ); - i++; - continue; - } - } - if ( isDefined( entities[ i ].helitype ) && entities[ i ].helitype == "qrdrone" ) - { - watcher = entity.owner maps/mp/gametypes/_weaponobjects::getweaponobjectwatcher( "qrdrone" ); - watcher thread maps/mp/gametypes/_weaponobjects::waitanddetonate( entities[ i ], 0, undefined ); - i++; - continue; - } - if ( entities[ i ].classname == "grenade" ) - { - if ( !isDefined( entities[ i ].name ) ) - { - i++; - continue; - } - if ( !isDefined( entities[ i ].owner ) ) - { - i++; - continue; - } - if ( entities[ i ].name == "proximity_grenade_mp" ) - { - watcher = entity.owner getwatcherforweapon( entities[ i ].name ); - watcher thread maps/mp/gametypes/_weaponobjects::waitanddetonate( entities[ i ], 0, undefined, "script_mover_mp" ); - i++; - continue; - } - if ( !isweaponequipment( entities[ i ].name ) ) - { - i++; - continue; - } - watcher = entities[ i ].owner getwatcherforweapon( entities[ i ].name ); - if ( !isDefined( watcher ) ) - { - i++; - continue; - } - watcher thread maps/mp/gametypes/_weaponobjects::waitanddetonate( entities[ i ], 0, undefined, "script_mover_mp" ); - i++; - continue; - } - if ( entities[ i ].classname == "auto_turret" ) - { - if ( !isDefined( entities[ i ].damagedtodeath ) || !entities[ i ].damagedtodeath ) - { - entities[ i ] domaxdamage( triggers[ triggertouched ].origin + ( 0, 0, 1 ), triggers[ triggertouched ], triggers[ triggertouched ], 0, "MOD_CRUSH" ); - } - i++; - continue; - } - if ( isplayer( entities[ i ] ) ) - { - entity dodamage( entities[ i ].health * 2, triggers[ triggertouched ].origin + ( 0, 0, 1 ), triggers[ triggertouched ], triggers[ triggertouched ], 0, "MOD_HIT_BY_OBJECT", 0, "hydro_water_mp" ); - } - else - { - entities[ i ] dodamage( entity.health * 2, triggers[ triggertouched ].origin + ( 0, 0, 1 ), triggers[ triggertouched ], triggers[ triggertouched ], 0, "MOD_CRUSH" ); - } - if ( isplayer( entities[ i ] ) ) - { - entities[ i ] playlocalsound( "mpl_splash_death" ); - } - i++; - } - } + level endon( "water_stop" ); + + for (;;) + { + wait 0.1; + entities = getdamageableentarray( triggers[0].origin, 2000 ); + + foreach ( entity in entities ) + { + triggertouched = 0; + + if ( !entity istouching( triggers[0] ) ) + { + triggertouched = 1; + + if ( !entity istouching( triggers[1] ) ) + { + if ( !entity istouching( triggers[2] ) ) + continue; + } + } + + if ( isdefined( entity.model ) && entity.model == "t6_wpn_tac_insert_world" ) + { + entity maps\mp\_tacticalinsertion::destroy_tactical_insertion(); + continue; + } + + if ( !isalive( entity ) ) + continue; + + if ( isdefined( entity.targetname ) ) + { + if ( entity.targetname == "talon" ) + { + entity notify( "death" ); + continue; + } + else if ( entity.targetname == "rcbomb" ) + { + entity maps\mp\killstreaks\_rcbomb::rcbomb_force_explode(); + continue; + } + else if ( entity.targetname == "riotshield_mp" ) + { + entity dodamage( 1, triggers[triggertouched].origin + ( 0, 0, 1 ), triggers[triggertouched], triggers[triggertouched], 0, "MOD_CRUSH" ); + continue; + } + } + + if ( isdefined( entity.helitype ) && entity.helitype == "qrdrone" ) + { + watcher = entity.owner maps\mp\gametypes\_weaponobjects::getweaponobjectwatcher( "qrdrone" ); + watcher thread maps\mp\gametypes\_weaponobjects::waitanddetonate( entity, 0.0, undefined ); + continue; + } + + if ( entity.classname == "grenade" ) + { + if ( !isdefined( entity.name ) ) + continue; + + if ( !isdefined( entity.owner ) ) + continue; + + if ( entity.name == "proximity_grenade_mp" ) + { + watcher = entity.owner getwatcherforweapon( entity.name ); + watcher thread maps\mp\gametypes\_weaponobjects::waitanddetonate( entity, 0.0, undefined, "script_mover_mp" ); + continue; + } + + if ( !isweaponequipment( entity.name ) ) + continue; + + watcher = entity.owner getwatcherforweapon( entity.name ); + + if ( !isdefined( watcher ) ) + continue; + + watcher thread maps\mp\gametypes\_weaponobjects::waitanddetonate( entity, 0.0, undefined, "script_mover_mp" ); + continue; + } + + if ( entity.classname == "auto_turret" ) + { + if ( !isdefined( entity.damagedtodeath ) || !entity.damagedtodeath ) + entity domaxdamage( triggers[triggertouched].origin + ( 0, 0, 1 ), triggers[triggertouched], triggers[triggertouched], 0, "MOD_CRUSH" ); + + continue; + } + + if ( isplayer( entity ) ) + entity dodamage( entity.health * 2, triggers[triggertouched].origin + ( 0, 0, 1 ), triggers[triggertouched], triggers[triggertouched], 0, "MOD_HIT_BY_OBJECT", 0, "hydro_water_mp" ); + else + entity dodamage( entity.health * 2, triggers[triggertouched].origin + ( 0, 0, 1 ), triggers[triggertouched], triggers[triggertouched], 0, "MOD_CRUSH" ); + + if ( isplayer( entity ) ) + entity playlocalsound( "mpl_splash_death" ); + } + } } -getwatcherforweapon( weapname ) //checked partially changed to match cerberus output +getwatcherforweapon( weapname ) { - if ( !isDefined( self ) ) - { - return undefined; - } - if ( !isplayer( self ) ) - { - return undefined; - } - for ( i = 0; i < self.weaponobjectwatcherarray.size; i++ ) - { - if ( self.weaponobjectwatcherarray[ i ].weapon != weapname ) - { - } - else - { - return self.weaponobjectwatcherarray[ i ]; - } - } - return undefined; + if ( !isdefined( self ) ) + return undefined; + + if ( !isplayer( self ) ) + return undefined; + + for ( i = 0; i < self.weaponobjectwatcherarray.size; i++ ) + { + if ( self.weaponobjectwatcherarray[i].weapon != weapname ) + continue; + + return self.weaponobjectwatcherarray[i]; + } + + return undefined; } -removeobjectsondemovertime() //checked changed to match cerberus output +removeobjectsondemovertime() { - if ( level.gametype == "dem" ) - { - if ( isDefined( game[ "overtime_round" ] ) ) - { - objects = getentarray( "delete_dem_overtime", "script_noteworthy" ); - if ( isDefined( objects ) ) - { - for ( i = 0; i < objects.size; i++ ) - { - objects[ i ] delete(); - } - } - } - } -} + if ( level.gametype == "dem" ) + { + if ( isdefined( game["overtime_round"] ) ) + { + objects = getentarray( "delete_dem_overtime", "script_noteworthy" ); + if ( isdefined( objects ) ) + { + for ( i = 0; i < objects.size; i++ ) + objects[i] delete(); + } + } + } +} diff --git a/Multiplayer Core/patch_mp/maps/mp/mp_la.gsc b/Multiplayer Core/patch_mp/maps/mp/mp_la.gsc index de49522..ce2c929 100644 --- a/Multiplayer Core/patch_mp/maps/mp/mp_la.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/mp_la.gsc @@ -1,122 +1,120 @@ -//checked includes changed to match cerberus output -#include maps/mp/killstreaks/_turret_killstreak; -#include maps/mp/mp_la_amb; -#include maps/mp/_load; -#include maps/mp/_compass; -#include maps/mp/mp_la_fx; -#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\mp_la_fx; +#include maps\mp\_compass; +#include maps\mp\_load; +#include maps\mp\mp_la_amb; +#include maps\mp\killstreaks\_turret_killstreak; -main() //checked changed to match cerberus output +main() { - level.levelspawndvars = ::levelspawndvars; - maps/mp/mp_la_fx::main(); - precachemodel( "collision_clip_wall_64x64x10" ); - precachemodel( "collision_physics_wall_64x64x10" ); - precachemodel( "collision_physics_wall_32x32x10" ); - precachemodel( "collision_physics_256x256x256" ); - precachemodel( "collision_physics_64x64x10" ); - precachemodel( "collision_physics_128x128x10" ); - precachemodel( "collision_clip_64x64x10" ); - precachemodel( "collision_physics_cylinder_32x128" ); - precachemodel( "collision_clip_wall_256x256x10" ); - precachemodel( "collision_physics_128x128x128" ); - precachemodel( "collision_clip_128x128x10" ); - precachemodel( "collision_physics_wall_256x256x10" ); - precachemodel( "collision_physics_wall_128x128x10" ); - precachemodel( "p6_building_granite_tan_brokenb" ); - if ( gamemodeismode( level.gamemode_wager_match ) ) - { - maps/mp/_compass::setupminimap( "compass_map_mp_la_wager" ); - } - else - { - maps/mp/_compass::setupminimap( "compass_map_mp_la" ); - } - maps/mp/_load::main(); - maps/mp/mp_la_amb::main(); - game[ "strings" ][ "war_callsign_a" ] = &"MPUI_CALLSIGN_MAPNAME_A"; - game[ "strings" ][ "war_callsign_b" ] = &"MPUI_CALLSIGN_MAPNAME_B"; - game[ "strings" ][ "war_callsign_c" ] = &"MPUI_CALLSIGN_MAPNAME_C"; - game[ "strings" ][ "war_callsign_d" ] = &"MPUI_CALLSIGN_MAPNAME_D"; - game[ "strings" ][ "war_callsign_e" ] = &"MPUI_CALLSIGN_MAPNAME_E"; - game[ "strings_menu" ][ "war_callsign_a" ] = "@MPUI_CALLSIGN_MAPNAME_A"; - game[ "strings_menu" ][ "war_callsign_b" ] = "@MPUI_CALLSIGN_MAPNAME_B"; - game[ "strings_menu" ][ "war_callsign_c" ] = "@MPUI_CALLSIGN_MAPNAME_C"; - game[ "strings_menu" ][ "war_callsign_d" ] = "@MPUI_CALLSIGN_MAPNAME_D"; - game[ "strings_menu" ][ "war_callsign_e" ] = "@MPUI_CALLSIGN_MAPNAME_E"; - spawncollision( "collision_clip_wall_64x64x10", "collider", ( -698, 2945, 28 ), vectorScale( ( 0, 1, 0 ), 270 ) ); - spawncollision( "collision_clip_wall_64x64x10", "collider", ( -698, 2984, 28 ), vectorScale( ( 0, 1, 0 ), 270 ) ); - spawncollision( "collision_physics_wall_32x32x10", "collider", ( -1606, 3027, 154 ), vectorScale( ( 0, 1, 0 ), 270 ) ); - spawncollision( "collision_physics_wall_32x32x10", "collider", ( -1614, 3010, 204 ), vectorScale( ( 0, 1, 0 ), 270 ) ); - spawncollision( "collision_physics_wall_64x64x10", "collider", ( -1610, 1860, 203 ), ( 26, 271, 17 ) ); - spawncollision( "collision_physics_wall_256x256x10", "collider", ( -849, 3145.5, -94.5 ), vectorScale( ( 0, 1, 0 ), 276.1 ) ); - spawncollision( "collision_physics_wall_256x256x10", "collider", ( -835, 3013.5, -119 ), vectorScale( ( 0, 1, 0 ), 276.1 ) ); - spawncollision( "collision_physics_128x128x10", "collider", ( -795.5, 3208.5, 3.5 ), vectorScale( ( 0, 1, 0 ), 5.99995 ) ); - spawncollision( "collision_physics_128x128x10", "collider", ( -783, 3080.5, 3.5 ), vectorScale( ( 0, 1, 0 ), 7.2 ) ); - spawncollision( "collision_physics_128x128x10", "collider", ( -767.5, 2953.5, 15 ), vectorScale( ( 0, 1, 0 ), 7.2 ) ); - spawncollision( "collision_physics_wall_128x128x10", "collider", ( -763, 2894.5, -35 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_128x128x10", "collider", ( -2275.5, 5248, -227.5 ), ( 0, 23.4, -90 ) ); - spawncollision( "collision_physics_128x128x10", "collider", ( -2464.5, 5162, -227 ), ( 0, 33.9, -90 ) ); - spawncollision( "collision_physics_64x64x10", "collider", ( -2363.5, 5219, -192.5 ), ( 0, 11.8, -90 ) ); - spawncollision( "collision_physics_cylinder_32x128", "collider", ( -1151.5, 1199.5, -31 ), vectorScale( ( 0, 1, 0 ), 23.4 ) ); - spawncollision( "collision_clip_wall_256x256x10", "collider", ( -621.5, 2114, -176.5 ), ( 0, 270, -180 ) ); - spawncollision( "collision_physics_128x128x128", "collider", ( 807.5, 855, -217.5 ), vectorScale( ( 0, 1, 0 ), 345.9 ) ); - spawncollision( "collision_physics_128x128x128", "collider", ( 886, 835.5, -206 ), vectorScale( ( 0, 1, 0 ), 345.9 ) ); - spawncollision( "collision_physics_128x128x128", "collider", ( 958.277, 946.957, -191.5 ), vectorScale( ( 0, 1, 0 ), 359.9 ) ); - spawncollision( "collision_physics_128x128x128", "collider", ( 1039.22, 946.543, -173 ), vectorScale( ( 0, 1, 0 ), 359.9 ) ); - spawncollision( "collision_physics_128x128x128", "collider", ( 853.93, 1147.29, -191.5 ), vectorScale( ( 0, 1, 0 ), 47.4 ) ); - spawncollision( "collision_physics_128x128x128", "collider", ( 914.57, 1214.71, -173 ), vectorScale( ( 0, 1, 0 ), 47.4 ) ); - spawncollision( "collision_clip_64x64x10", "collider", ( -1354, 2215.5, -206 ), vectorScale( ( 0, 0, -1 ), 12.2001 ) ); - spawncollision( "collision_physics_wall_64x64x10", "collider", ( -257.5, 958, -154.5 ), ( 7.66668, 317.653, 2.55286 ) ); - spawncollision( "collision_clip_128x128x10", "collider", ( -684, 1465, 36.5 ), ( 0, 5, 90 ) ); - spawncollision( "collision_physics_wall_128x128x10", "collider", ( -2067, 1390, -102 ), vectorScale( ( 0, 1, 0 ), 270 ) ); - concrete1 = spawn( "script_model", ( -2040.54, 636.504, -215.717 ) ); - concrete1.angles = ( 0.0251585, 359.348, 178.338 ); - concrete1 setmodel( "p6_building_granite_tan_brokenb" ); - level.levelkothdisable = []; - level.levelkothdisable[ level.levelkothdisable.size ] = spawn( "trigger_radius", ( -1337, 2016, 8.5 ), 0, 40, 50 ); - level thread maps/mp/killstreaks/_turret_killstreak::addnoturrettrigger( ( -2295, 3843.5, -193 ), 80, 64 ); - level thread maps/mp/killstreaks/_turret_killstreak::addnoturrettrigger( ( -2341, 3917.5, -193 ), 80, 64 ); - level thread maps/mp/killstreaks/_turret_killstreak::addnoturrettrigger( ( -2397.75, 4003.5, -193 ), 80, 64 ); - registerclientfield( "scriptmover", "police_car_lights", 1, 1, "int" ); - registerclientfield( "scriptmover", "ambulance_lights", 1, 1, "int" ); - level thread destructible_lights(); - level.remotemotarviewleft = 45; - level.remotemotarviewright = 45; + level.levelspawndvars = ::levelspawndvars; + maps\mp\mp_la_fx::main(); + precachemodel( "collision_clip_wall_64x64x10" ); + precachemodel( "collision_physics_wall_64x64x10" ); + precachemodel( "collision_physics_wall_32x32x10" ); + precachemodel( "collision_physics_256x256x256" ); + precachemodel( "collision_physics_64x64x10" ); + precachemodel( "collision_physics_128x128x10" ); + precachemodel( "collision_clip_64x64x10" ); + precachemodel( "collision_physics_cylinder_32x128" ); + precachemodel( "collision_clip_wall_256x256x10" ); + precachemodel( "collision_physics_128x128x128" ); + precachemodel( "collision_clip_128x128x10" ); + precachemodel( "collision_physics_wall_256x256x10" ); + precachemodel( "collision_physics_wall_128x128x10" ); + precachemodel( "p6_building_granite_tan_brokenb" ); + + if ( gamemodeismode( level.gamemode_wager_match ) ) + maps\mp\_compass::setupminimap( "compass_map_mp_la_wager" ); + else + maps\mp\_compass::setupminimap( "compass_map_mp_la" ); + + maps\mp\_load::main(); + maps\mp\mp_la_amb::main(); + game["strings"]["war_callsign_a"] = &"MPUI_CALLSIGN_MAPNAME_A"; + game["strings"]["war_callsign_b"] = &"MPUI_CALLSIGN_MAPNAME_B"; + game["strings"]["war_callsign_c"] = &"MPUI_CALLSIGN_MAPNAME_C"; + game["strings"]["war_callsign_d"] = &"MPUI_CALLSIGN_MAPNAME_D"; + game["strings"]["war_callsign_e"] = &"MPUI_CALLSIGN_MAPNAME_E"; + game["strings_menu"]["war_callsign_a"] = "@MPUI_CALLSIGN_MAPNAME_A"; + game["strings_menu"]["war_callsign_b"] = "@MPUI_CALLSIGN_MAPNAME_B"; + game["strings_menu"]["war_callsign_c"] = "@MPUI_CALLSIGN_MAPNAME_C"; + game["strings_menu"]["war_callsign_d"] = "@MPUI_CALLSIGN_MAPNAME_D"; + game["strings_menu"]["war_callsign_e"] = "@MPUI_CALLSIGN_MAPNAME_E"; + spawncollision( "collision_clip_wall_64x64x10", "collider", ( -698, 2945, 28 ), vectorscale( ( 0, 1, 0 ), 270.0 ) ); + spawncollision( "collision_clip_wall_64x64x10", "collider", ( -698, 2984, 28 ), vectorscale( ( 0, 1, 0 ), 270.0 ) ); + spawncollision( "collision_physics_wall_32x32x10", "collider", ( -1606, 3027, 154 ), vectorscale( ( 0, 1, 0 ), 270.0 ) ); + spawncollision( "collision_physics_wall_32x32x10", "collider", ( -1614, 3010, 204 ), vectorscale( ( 0, 1, 0 ), 270.0 ) ); + spawncollision( "collision_physics_wall_64x64x10", "collider", ( -1610, 1860, 203 ), ( 26, 271, 17 ) ); + spawncollision( "collision_physics_wall_256x256x10", "collider", ( -849, 3145.5, -94.5 ), vectorscale( ( 0, 1, 0 ), 276.1 ) ); + spawncollision( "collision_physics_wall_256x256x10", "collider", ( -835, 3013.5, -119 ), vectorscale( ( 0, 1, 0 ), 276.1 ) ); + spawncollision( "collision_physics_128x128x10", "collider", ( -795.5, 3208.5, 3.5 ), vectorscale( ( 0, 1, 0 ), 5.99995 ) ); + spawncollision( "collision_physics_128x128x10", "collider", ( -783, 3080.5, 3.5 ), vectorscale( ( 0, 1, 0 ), 7.2 ) ); + spawncollision( "collision_physics_128x128x10", "collider", ( -767.5, 2953.5, 15 ), vectorscale( ( 0, 1, 0 ), 7.2 ) ); + spawncollision( "collision_physics_wall_128x128x10", "collider", ( -763, 2894.5, -35 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_128x128x10", "collider", ( -2275.5, 5248, -227.5 ), ( 0, 23.4, -90 ) ); + spawncollision( "collision_physics_128x128x10", "collider", ( -2464.5, 5162, -227 ), ( 0, 33.9, -90 ) ); + spawncollision( "collision_physics_64x64x10", "collider", ( -2363.5, 5219, -192.5 ), ( 0, 11.8, -90 ) ); + spawncollision( "collision_physics_cylinder_32x128", "collider", ( -1151.5, 1199.5, -31 ), vectorscale( ( 0, 1, 0 ), 23.4 ) ); + spawncollision( "collision_clip_wall_256x256x10", "collider", ( -621.5, 2114, -176.5 ), ( 0, 270, -180 ) ); + spawncollision( "collision_physics_128x128x128", "collider", ( 807.5, 855, -217.5 ), vectorscale( ( 0, 1, 0 ), 345.9 ) ); + spawncollision( "collision_physics_128x128x128", "collider", ( 886, 835.5, -206 ), vectorscale( ( 0, 1, 0 ), 345.9 ) ); + spawncollision( "collision_physics_128x128x128", "collider", ( 958.277, 946.957, -191.5 ), vectorscale( ( 0, 1, 0 ), 359.9 ) ); + spawncollision( "collision_physics_128x128x128", "collider", ( 1039.22, 946.543, -173 ), vectorscale( ( 0, 1, 0 ), 359.9 ) ); + spawncollision( "collision_physics_128x128x128", "collider", ( 853.93, 1147.29, -191.5 ), vectorscale( ( 0, 1, 0 ), 47.4 ) ); + spawncollision( "collision_physics_128x128x128", "collider", ( 914.57, 1214.71, -173 ), vectorscale( ( 0, 1, 0 ), 47.4 ) ); + spawncollision( "collision_clip_64x64x10", "collider", ( -1354, 2215.5, -206 ), vectorscale( ( 0, 0, -1 ), 12.2001 ) ); + spawncollision( "collision_physics_wall_64x64x10", "collider", ( -257.5, 958, -154.5 ), ( 7.66668, 317.653, 2.55286 ) ); + spawncollision( "collision_clip_128x128x10", "collider", ( -684, 1465, 36.5 ), ( 0, 5, 90 ) ); + spawncollision( "collision_physics_wall_128x128x10", "collider", ( -2067, 1390, -102 ), vectorscale( ( 0, 1, 0 ), 270.0 ) ); + concrete1 = spawn( "script_model", ( -2040.54, 636.504, -215.717 ) ); + concrete1.angles = ( 0.0251585, 359.348, 178.338 ); + concrete1 setmodel( "p6_building_granite_tan_brokenb" ); + level.levelkothdisable = []; + level.levelkothdisable[level.levelkothdisable.size] = spawn( "trigger_radius", ( -1337, 2016, 8.5 ), 0, 40, 50 ); + level thread maps\mp\killstreaks\_turret_killstreak::addnoturrettrigger( ( -2295, 3843.5, -193 ), 80, 64 ); + level thread maps\mp\killstreaks\_turret_killstreak::addnoturrettrigger( ( -2341, 3917.5, -193 ), 80, 64 ); + level thread maps\mp\killstreaks\_turret_killstreak::addnoturrettrigger( ( -2397.75, 4003.5, -193 ), 80, 64 ); + registerclientfield( "scriptmover", "police_car_lights", 1, 1, "int" ); + registerclientfield( "scriptmover", "ambulance_lights", 1, 1, "int" ); + level thread destructible_lights(); + level.remotemotarviewleft = 45; + level.remotemotarviewright = 45; } -levelspawndvars( reset_dvars ) //checked matches cerberus output +levelspawndvars( reset_dvars ) { - ss = level.spawnsystem; - ss.enemy_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_radius", "2600", reset_dvars ); + ss = level.spawnsystem; + ss.enemy_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_radius", "2600", reset_dvars ); } -destructible_lights() //checked partially changed to match cerberus output see info.md +destructible_lights() { - wait 0.05; - destructibles = getentarray( "destructible", "targetname" ); - foreach ( destructible in destructibles ) - { - if ( destructible.destructibledef == "veh_t6_police_car_destructible_mp" ) - { - destructible thread destructible_think( "police_car_lights" ); - destructible setclientfield( "police_car_lights", 1 ); - } - else - { - if ( destructible.destructibledef == "veh_iw_civ_ambulance_destructible" ) - { - destructible thread destructible_think( "ambulance_lights" ); - destructible setclientfield( "ambulance_lights", 1 ); - } - } - } + wait 0.05; + destructibles = getentarray( "destructible", "targetname" ); + + foreach ( destructible in destructibles ) + { + if ( destructible.destructibledef == "veh_t6_police_car_destructible_mp" ) + { + destructible thread destructible_think( "police_car_lights" ); + destructible setclientfield( "police_car_lights", 1 ); + continue; + } + + if ( destructible.destructibledef == "veh_iw_civ_ambulance_destructible" ) + { + destructible thread destructible_think( "ambulance_lights" ); + destructible setclientfield( "ambulance_lights", 1 ); + } + } } -destructible_think( clientfield ) //checked matches cerberus output +destructible_think( clientfield ) { - self waittill_any( "death", "destructible_base_piece_death" ); - self setclientfield( clientfield, 0 ); + self waittill_any( "death", "destructible_base_piece_death" ); + self setclientfield( clientfield, 0 ); } - diff --git a/Multiplayer Core/patch_mp/maps/mp/mp_magma.gsc b/Multiplayer Core/patch_mp/maps/mp/mp_magma.gsc index c5a92c3..0a51477 100644 --- a/Multiplayer Core/patch_mp/maps/mp/mp_magma.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/mp_magma.gsc @@ -1,283 +1,262 @@ -#include maps/mp/gametypes/_weaponobjects; -#include maps/mp/gametypes/_spawning; -#include maps/mp/_compass; -#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\mp_magma_fx; +#include maps\mp\_load; +#include maps\mp\mp_magma_amb; +#include maps\mp\_compass; +#include maps\mp\gametypes\_spawning; +#include maps\mp\gametypes\_weaponobjects; main() { - level.levelspawndvars = ::levelspawndvars; - level.overrideplayerdeathwatchtimer = ::leveloverridetime; - level thread spawnkilltrigger(); - maps/mp/mp_magma_fx::main(); - precachemodel( "collision_clip_64x64x10" ); - precachemodel( "collision_physics_64x64x10" ); - precachemodel( "collision_physics_256x256x10" ); - precachemodel( "collision_physics_128x128x10" ); - precachemodel( "collision_physics_64x64x10" ); - precachemodel( "p6_mag_k_rail_barrier" ); - precachemodel( "p6_mag_rocks_medium_02" ); - maps/mp/_load::main(); - maps/mp/mp_magma_amb::main(); - maps/mp/_compass::setupminimap( "compass_map_mp_magma" ); - setdvar( "compassmaxrange", "2100" ); - game[ "strings" ][ "war_callsign_a" ] = &"MPUI_CALLSIGN_MAPNAME_A"; - game[ "strings" ][ "war_callsign_b" ] = &"MPUI_CALLSIGN_MAPNAME_B"; - game[ "strings" ][ "war_callsign_c" ] = &"MPUI_CALLSIGN_MAPNAME_C"; - game[ "strings" ][ "war_callsign_d" ] = &"MPUI_CALLSIGN_MAPNAME_D"; - game[ "strings" ][ "war_callsign_e" ] = &"MPUI_CALLSIGN_MAPNAME_E"; - game[ "strings_menu" ][ "war_callsign_a" ] = "@MPUI_CALLSIGN_MAPNAME_A"; - game[ "strings_menu" ][ "war_callsign_b" ] = "@MPUI_CALLSIGN_MAPNAME_B"; - game[ "strings_menu" ][ "war_callsign_c" ] = "@MPUI_CALLSIGN_MAPNAME_C"; - game[ "strings_menu" ][ "war_callsign_d" ] = "@MPUI_CALLSIGN_MAPNAME_D"; - game[ "strings_menu" ][ "war_callsign_e" ] = "@MPUI_CALLSIGN_MAPNAME_E"; - barrier1 = spawn( "script_model", ( 235,49, 907,91, -395,97 ) ); - barrier1.angles = ( 2,96968, 263,594, -1,33952 ); - barrier2 = spawn( "script_model", ( 245,37, 837,028, -401,885 ) ); - barrier2.angles = ( 6,5989, 268,994, -0,115603 ); - barrier1 setmodel( "p6_mag_k_rail_barrier" ); - barrier2 setmodel( "p6_mag_k_rail_barrier" ); - rock1 = spawn( "script_model", ( 271,92, 893,99, -494 ) ); - rock1.angles = vectorScale( ( 1, 0, 0 ), 132 ); - rock2 = spawn( "script_model", ( 393,42, 895,49, -494 ) ); - rock2.angles = vectorScale( ( 1, 0, 0 ), 132 ); - rock3 = spawn( "script_model", ( 477,92, 882,49, -509 ) ); - rock3.angles = vectorScale( ( 1, 0, 0 ), 132 ); - rock1 setmodel( "p6_mag_rocks_medium_02" ); - rock2 setmodel( "p6_mag_rocks_medium_02" ); - rock3 setmodel( "p6_mag_rocks_medium_02" ); - spawncollision( "collision_clip_64x64x10", "collider", ( 234, 907, -391,5 ), ( 356,785, 83,5728, -83,5116 ) ); - spawncollision( "collision_clip_64x64x10", "collider", ( 243,5, 835,5, -399 ), ( 353,903, 88,8464, -83,1852 ) ); - spawncollision( "collision_clip_64x64x10", "collider", ( 254, 902,5, -395 ), ( 0,42985, 353,514, 3,77564 ) ); - spawncollision( "collision_clip_64x64x10", "collider", ( 264, 835,5, -401,5 ), ( 0,0466956, 359,602, 6,69984 ) ); - spawncollision( "collision_clip_64x64x10", "collider", ( 247,5, 831,5, -363 ), ( 353,903, 88,8464, -83,1852 ) ); - spawncollision( "collision_clip_64x64x10", "collider", ( 237,5, 904,5, -357,5 ), ( 356,785, 83,5728, -83,5116 ) ); - spawncollision( "collision_physics_64x64x10", "collider", ( 234, 907, -391,5 ), ( 356,785, 83,5728, -83,5116 ) ); - spawncollision( "collision_physics_64x64x10", "collider", ( 243,5, 835,5, -399 ), ( 353,903, 88,8464, -83,1852 ) ); - spawncollision( "collision_physics_256x256x10", "collider", ( -459, 357,5, -578,5 ), ( 270, 183,902, 86,0983 ) ); - spawncollision( "collision_physics_128x128x10", "collider", ( -267, 233,5, -514 ), vectorScale( ( 1, 0, 0 ), 270 ) ); - spawncollision( "collision_physics_128x128x10", "collider", ( -669,5, 216, -514 ), vectorScale( ( 1, 0, 0 ), 270 ) ); - spawncollision( "collision_physics_64x64x10", "collider", ( -748, 95, -483,5 ), ( 270, 270,2, 1,43 ) ); - level.levelkillbrushes = []; - maps/mp/gametypes/_spawning::level_use_unified_spawning( 1 ); - level.remotemotarviewup = 20; - registerclientfield( "scriptmover", "police_car_lights", 1, 1, "int" ); - precacheitem( "lava_mp" ); - level thread destructible_lights(); - level.overrideweaponfunc = ::overrideweaponfunc; - level.deleteonkillbrushoverride = ::deleteonkillbrushoverride; - level thread lava_trigger_init(); - level.onplayerkilledextraunthreadedcbs[ level.onplayerkilledextraunthreadedcbs.size ] = ::checkcorpseinlava; + level.levelspawndvars = ::levelspawndvars; + level.overrideplayerdeathwatchtimer = ::leveloverridetime; + level thread spawnkilltrigger(); + maps\mp\mp_magma_fx::main(); + precachemodel( "collision_clip_64x64x10" ); + precachemodel( "collision_physics_64x64x10" ); + precachemodel( "collision_physics_256x256x10" ); + precachemodel( "collision_physics_128x128x10" ); + precachemodel( "collision_physics_64x64x10" ); + precachemodel( "p6_mag_k_rail_barrier" ); + precachemodel( "p6_mag_rocks_medium_02" ); + maps\mp\_load::main(); + maps\mp\mp_magma_amb::main(); + maps\mp\_compass::setupminimap( "compass_map_mp_magma" ); + setdvar( "compassmaxrange", "2100" ); + game["strings"]["war_callsign_a"] = &"MPUI_CALLSIGN_MAPNAME_A"; + game["strings"]["war_callsign_b"] = &"MPUI_CALLSIGN_MAPNAME_B"; + game["strings"]["war_callsign_c"] = &"MPUI_CALLSIGN_MAPNAME_C"; + game["strings"]["war_callsign_d"] = &"MPUI_CALLSIGN_MAPNAME_D"; + game["strings"]["war_callsign_e"] = &"MPUI_CALLSIGN_MAPNAME_E"; + game["strings_menu"]["war_callsign_a"] = "@MPUI_CALLSIGN_MAPNAME_A"; + game["strings_menu"]["war_callsign_b"] = "@MPUI_CALLSIGN_MAPNAME_B"; + game["strings_menu"]["war_callsign_c"] = "@MPUI_CALLSIGN_MAPNAME_C"; + game["strings_menu"]["war_callsign_d"] = "@MPUI_CALLSIGN_MAPNAME_D"; + game["strings_menu"]["war_callsign_e"] = "@MPUI_CALLSIGN_MAPNAME_E"; + barrier1 = spawn( "script_model", ( 235.49, 907.91, -395.97 ) ); + barrier1.angles = ( 2.96968, 263.594, -1.33952 ); + barrier2 = spawn( "script_model", ( 245.37, 837.028, -401.885 ) ); + barrier2.angles = ( 6.5989, 268.994, -0.115603 ); + barrier1 setmodel( "p6_mag_k_rail_barrier" ); + barrier2 setmodel( "p6_mag_k_rail_barrier" ); + rock1 = spawn( "script_model", ( 271.92, 893.99, -494 ) ); + rock1.angles = vectorscale( ( 0, 1, 0 ), 132.0 ); + rock2 = spawn( "script_model", ( 393.42, 895.49, -494 ) ); + rock2.angles = vectorscale( ( 0, 1, 0 ), 132.0 ); + rock3 = spawn( "script_model", ( 477.92, 882.49, -509 ) ); + rock3.angles = vectorscale( ( 0, 1, 0 ), 132.0 ); + rock1 setmodel( "p6_mag_rocks_medium_02" ); + rock2 setmodel( "p6_mag_rocks_medium_02" ); + rock3 setmodel( "p6_mag_rocks_medium_02" ); + spawncollision( "collision_clip_64x64x10", "collider", ( 234, 907, -391.5 ), ( 356.785, 83.5728, -83.5116 ) ); + spawncollision( "collision_clip_64x64x10", "collider", ( 243.5, 835.5, -399 ), ( 353.903, 88.8464, -83.1852 ) ); + spawncollision( "collision_clip_64x64x10", "collider", ( 254, 902.5, -395 ), ( 0.42985, 353.514, 3.77564 ) ); + spawncollision( "collision_clip_64x64x10", "collider", ( 264, 835.5, -401.5 ), ( 0.0466956, 359.602, 6.69984 ) ); + spawncollision( "collision_clip_64x64x10", "collider", ( 247.5, 831.5, -363 ), ( 353.903, 88.8464, -83.1852 ) ); + spawncollision( "collision_clip_64x64x10", "collider", ( 237.5, 904.5, -357.5 ), ( 356.785, 83.5728, -83.5116 ) ); + spawncollision( "collision_physics_64x64x10", "collider", ( 234, 907, -391.5 ), ( 356.785, 83.5728, -83.5116 ) ); + spawncollision( "collision_physics_64x64x10", "collider", ( 243.5, 835.5, -399 ), ( 353.903, 88.8464, -83.1852 ) ); + spawncollision( "collision_physics_256x256x10", "collider", ( -459, 357.5, -578.5 ), ( 270, 183.902, 86.0983 ) ); + spawncollision( "collision_physics_128x128x10", "collider", ( -267, 233.5, -514 ), vectorscale( ( 1, 0, 0 ), 270.0 ) ); + spawncollision( "collision_physics_128x128x10", "collider", ( -669.5, 216, -514 ), vectorscale( ( 1, 0, 0 ), 270.0 ) ); + spawncollision( "collision_physics_64x64x10", "collider", ( -748, 95, -483.5 ), ( 270, 270.2, 1.43 ) ); + level.levelkillbrushes = []; + maps\mp\gametypes\_spawning::level_use_unified_spawning( 1 ); + level.remotemotarviewup = 20; + registerclientfield( "scriptmover", "police_car_lights", 1, 1, "int" ); + precacheitem( "lava_mp" ); + level thread destructible_lights(); + level.overrideweaponfunc = ::overrideweaponfunc; + level.deleteonkillbrushoverride = ::deleteonkillbrushoverride; + level thread lava_trigger_init(); + level.onplayerkilledextraunthreadedcbs[level.onplayerkilledextraunthreadedcbs.size] = ::checkcorpseinlava; } lava_trigger_init() { - wait 3; - killbrushes = getentarray( "trigger_hurt", "classname" ); - i = 0; - while ( i < killbrushes.size ) - { - if ( isDefined( killbrushes[ i ].script_noteworthy ) && killbrushes[ i ].script_noteworthy == "lava" ) - { - level.levelkillbrushes[ level.levelkillbrushes.size ] = killbrushes[ i ]; - } - i++; - } + wait 3; + killbrushes = getentarray( "trigger_hurt", "classname" ); + + for ( i = 0; i < killbrushes.size; i++ ) + { + if ( isdefined( killbrushes[i].script_noteworthy ) && killbrushes[i].script_noteworthy == "lava" ) + level.levelkillbrushes[level.levelkillbrushes.size] = killbrushes[i]; + } } levelspawndvars( reset_dvars ) { - ss = level.spawnsystem; - ss.enemy_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_radius", "2600", reset_dvars ); + ss = level.spawnsystem; + ss.enemy_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_radius", "2600", reset_dvars ); } overrideweaponfunc( sweapon, script_noteworthy ) { - if ( isDefined( script_noteworthy ) && script_noteworthy == "lava" ) - { - sweapon = "lava_mp"; - } - return sweapon; + if ( isdefined( script_noteworthy ) && script_noteworthy == "lava" ) + sweapon = "lava_mp"; + + return sweapon; } destructible_lights() { - wait 0,05; - destructibles = getentarray( "destructible", "targetname" ); - _a150 = destructibles; - _k150 = getFirstArrayKey( _a150 ); - while ( isDefined( _k150 ) ) - { - destructible = _a150[ _k150 ]; - if ( destructible.destructibledef == "veh_t6_dlc_police_car_jp_destructible" ) - { - destructible thread destructible_think( "police_car_lights" ); - destructible setclientfield( "police_car_lights", 1 ); - } - _k150 = getNextArrayKey( _a150, _k150 ); - } + wait 0.05; + destructibles = getentarray( "destructible", "targetname" ); + + foreach ( destructible in destructibles ) + { + if ( destructible.destructibledef == "veh_t6_dlc_police_car_jp_destructible" ) + { + destructible thread destructible_think( "police_car_lights" ); + destructible setclientfield( "police_car_lights", 1 ); + } + } } destructible_think( clientfield ) { - self waittill_any( "death", "destructible_base_piece_death" ); - self setclientfield( clientfield, 0 ); + self waittill_any( "death", "destructible_base_piece_death" ); + self setclientfield( clientfield, 0 ); } checkcorpseinlava( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ) { - if ( !isDefined( einflictor ) || !isDefined( einflictor.script_noteworthy ) ) - { - return; - } - if ( einflictor.script_noteworthy != "lava" ) - { - return; - } - if ( !isDefined( self.body ) ) - { - return; - } - playfxontag( level._effect[ "fx_fire_torso" ], self.body, "J_Spine4" ); - playfxontag( level._effect[ "fx_fire_arm_left" ], self.body, "J_Elbow_LE" ); - playfxontag( level._effect[ "fx_fire_arm_right" ], self.body, "J_Elbow_RI" ); - playfxontag( level._effect[ "fx_fire_leg_left" ], self.body, "J_Hip_LE" ); - playfxontag( level._effect[ "fx_fire_leg_right" ], self.body, "J_Hip_RI" ); + if ( !isdefined( einflictor ) || !isdefined( einflictor.script_noteworthy ) ) + return; + + if ( einflictor.script_noteworthy != "lava" ) + return; + + if ( !isdefined( self.body ) ) + return; + + playfxontag( level._effect["fx_fire_torso"], self.body, "J_Spine4" ); + playfxontag( level._effect["fx_fire_arm_left"], self.body, "J_Elbow_LE" ); + playfxontag( level._effect["fx_fire_arm_right"], self.body, "J_Elbow_RI" ); + playfxontag( level._effect["fx_fire_leg_left"], self.body, "J_Hip_LE" ); + playfxontag( level._effect["fx_fire_leg_right"], self.body, "J_Hip_RI" ); } leveloverridetime( defaulttime ) { - if ( self isinlava() ) - { - return getdvarfloatdefault( "scr_lavaPlayerDeathWatchTime", 0,5 ); - } - return defaulttime; + if ( self isinlava() ) + return getdvarfloatdefault( "scr_lavaPlayerDeathWatchTime", 0.5 ); + + return defaulttime; } isinlava() { - if ( !isDefined( self.lastattacker ) || !isDefined( self.lastattacker.script_noteworthy ) ) - { - return 0; - } - if ( self.lastattacker.script_noteworthy != "lava" ) - { - return 0; - } - return 1; + if ( !isdefined( self.lastattacker ) || !isdefined( self.lastattacker.script_noteworthy ) ) + return false; + + if ( self.lastattacker.script_noteworthy != "lava" ) + return false; + + return true; } testkillbrushonstationary( lavaarray, killbrusharray, player, watcher ) { - player endon( "disconnect" ); - self endon( "death" ); - self waittill( "stationary" ); - wait 0,1; - i = 0; - while ( i < lavaarray.size ) - { - if ( self istouching( lavaarray[ i ] ) ) - { - playfx( level._effect[ "fx_fire_torso" ], self.origin ); - watcher maps/mp/gametypes/_weaponobjects::waitanddetonate( self, 0, undefined, "lava_mp" ); - return; - } - i++; - } - i = 0; - while ( i < killbrusharray.size ) - { - if ( self istouching( killbrusharray[ i ] ) ) - { - if ( self.origin[ 2 ] > player.origin[ 2 ] ) - { - return; - } - else - { - if ( isDefined( self ) ) - { - self delete(); - } - return; - } - i++; - } - } + player endon( "disconnect" ); + self endon( "death" ); + + self waittill( "stationary" ); + + wait 0.1; + + for ( i = 0; i < lavaarray.size; i++ ) + { + if ( self istouching( lavaarray[i] ) ) + { + playfx( level._effect["fx_fire_torso"], self.origin ); + watcher maps\mp\gametypes\_weaponobjects::waitanddetonate( self, 0.0, undefined, "lava_mp" ); + return; + } + } + + for ( i = 0; i < killbrusharray.size; i++ ) + { + if ( self istouching( killbrusharray[i] ) ) + { + if ( self.origin[2] > player.origin[2] ) + break; + + if ( isdefined( self ) ) + self delete(); + + return; + } + } } deleteonkillbrushoverride( player, watcher ) { - player endon( "disconnect" ); - self endon( "death" ); - self endon( "stationary" ); - trigger_hurtarray = getentarray( "trigger_hurt", "classname" ); - lavaarray = []; - killbrusharray = []; - i = 0; - while ( i < trigger_hurtarray.size ) - { - if ( isDefined( trigger_hurtarray[ i ].script_noteworthy ) && trigger_hurtarray[ i ].script_noteworthy == "lava" ) - { - lavaarray[ lavaarray.size ] = trigger_hurtarray[ i ]; - i++; - continue; - } - else - { - killbrusharray[ killbrusharray.size ] = trigger_hurtarray[ i ]; - } - i++; - } - if ( lavaarray.size < 1 ) - { - return; - } - self thread testkillbrushonstationary( lavaarray, killbrusharray, player, watcher ); - while ( 1 ) - { - i = 0; - while ( i < lavaarray.size ) - { - if ( self istouching( lavaarray[ i ] ) ) - { - wait 0,05; - playfx( level._effect[ "fx_fire_torso" ], self.origin ); - watcher maps/mp/gametypes/_weaponobjects::waitanddetonate( self, 0, undefined, "lava_mp" ); - return; - } - i++; - } - i = 0; - while ( i < killbrusharray.size ) - { - if ( self istouching( killbrusharray[ i ] ) ) - { - if ( self.origin[ 2 ] > player.origin[ 2 ] ) - { - break; - } - else - { - if ( isDefined( self ) ) - { - self delete(); - } - return; - } - i++; - } - } - wait 0,1; - } + player endon( "disconnect" ); + self endon( "death" ); + self endon( "stationary" ); + trigger_hurtarray = getentarray( "trigger_hurt", "classname" ); + lavaarray = []; + killbrusharray = []; + + for ( i = 0; i < trigger_hurtarray.size; i++ ) + { + if ( isdefined( trigger_hurtarray[i].script_noteworthy ) && trigger_hurtarray[i].script_noteworthy == "lava" ) + { + lavaarray[lavaarray.size] = trigger_hurtarray[i]; + continue; + } + + killbrusharray[killbrusharray.size] = trigger_hurtarray[i]; + } + + if ( lavaarray.size < 1 ) + return; + + self thread testkillbrushonstationary( lavaarray, killbrusharray, player, watcher ); + + while ( true ) + { + for ( i = 0; i < lavaarray.size; i++ ) + { + if ( self istouching( lavaarray[i] ) ) + { + wait 0.05; + playfx( level._effect["fx_fire_torso"], self.origin ); + watcher maps\mp\gametypes\_weaponobjects::waitanddetonate( self, 0.0, undefined, "lava_mp" ); + return; + } + } + + for ( i = 0; i < killbrusharray.size; i++ ) + { + if ( self istouching( killbrusharray[i] ) ) + { + if ( self.origin[2] > player.origin[2] ) + break; + + if ( isdefined( self ) ) + self delete(); + + return; + } + } + + wait 0.1; + } } spawnkilltrigger() { - trigger = spawn( "trigger_radius", ( 2132, -1692, -708 ), 0, 250, 100 ); - while ( 1 ) - { - trigger waittill( "trigger", player ); - player dodamage( player.health * 2, trigger.origin, trigger, trigger, "none", "MOD_SUICIDE", 0, "lava_mp" ); - } + trigger = spawn( "trigger_radius", ( 2132, -1692, -708 ), 0, 250, 100 ); + + while ( true ) + { + trigger waittill( "trigger", player ); + + player dodamage( player.health * 2, trigger.origin, trigger, trigger, "none", "MOD_SUICIDE", 0, "lava_mp" ); + } } diff --git a/Multiplayer Core/patch_mp/maps/mp/mp_meltdown.gsc b/Multiplayer Core/patch_mp/maps/mp/mp_meltdown.gsc index 6f3a3ec..8e6a446 100644 --- a/Multiplayer Core/patch_mp/maps/mp/mp_meltdown.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/mp_meltdown.gsc @@ -1,45 +1,44 @@ -//checked includes changed to match cerberus output -#include maps/mp/_compass; -#include maps/mp/mp_meltdown_amb; -#include maps/mp/_load; -#include maps/mp/mp_meltdown_fx; -#include maps/mp/_utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\_utility; +#include maps\mp\mp_meltdown_fx; +#include maps\mp\_load; +#include maps\mp\mp_meltdown_amb; +#include maps\mp\_compass; -main() //checked changed to match cerberus output +main() { - level.levelspawndvars = ::levelspawndvars; - maps/mp/mp_meltdown_fx::main(); - precachemodel( "collision_physics_128x128x128" ); - precachemodel( "collision_physics_wall_256x256x10" ); - precachemodel( "collision_clip_wall_32x32x10" ); - precachemodel( "collision_clip_wall_64x64x10" ); - precachemodel( "collision_clip_64x64x10" ); - precachemodel( "collision_clip_wall_128x128x10" ); - precachemodel( "collision_physics_wall_64x64x10" ); - precachemodel( "collision_clip_32x32x32" ); - maps/mp/_load::main(); - maps/mp/mp_meltdown_amb::main(); - spawncollision( "collision_physics_128x128x128", "collider", ( 224, 4558.5, -117.5 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_wall_256x256x10", "collider", ( 216.5, 4526.5, -86 ), vectorScale( ( 0, 1, 0 ), 270 ) ); - spawncollision( "collision_clip_wall_32x32x10", "collider", ( 486, 3219.5, -53 ), vectorScale( ( 0, 1, 0 ), 288.2 ) ); - spawncollision( "collision_clip_wall_64x64x10", "collider", ( 505.5, 3197, -56.5 ), vectorScale( ( 0, 1, 0 ), 133,1 ) ); - spawncollision( "collision_clip_wall_64x64x10", "collider", ( 545, 3181.5, -72.5 ), vectorScale( ( 0, 1, 0 ), 180,4 ) ); - spawncollision( "collision_clip_wall_64x64x10", "collider", ( 582, 3194, -56.5 ), vectorScale( ( 0, 1, 0 ), 223.1 ) ); - spawncollision( "collision_clip_wall_32x32x10", "collider", ( 602.5, 3221.5, -54 ), vectorScale( ( 0, 1, 0 ), 254,2 ) ); - spawncollision( "collision_clip_64x64x10", "collider", ( 348.5, 615, 24 ), vectorScale( ( 0, 0, 1 ), 90 ) ); - spawncollision( "collision_clip_wall_64x64x10", "collider", ( 1005.5, 1466, 173 ), vectorScale( ( 0, 1, 0 ), 270 ) ); - spawncollision( "collision_clip_wall_128x128x10", "collider", ( 808, -1434.5, -120 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_wall_64x64x10", "collider", ( 1266, 1873.5, 86 ), vectorScale( ( 0, 1, 0 ), 35 ) ); - spawncollision( "collision_physics_wall_64x64x10", "collider", ( 1266, 1873.5, 126 ), vectorScale( ( 0, 1, 0 ), 35 ) ); - spawncollision( "collision_physics_32x32x32", "collider", ( 1183, 1927, 73 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_32x32x32", "collider", ( 555.5, 2976, -47.5 ), ( 0, 0, 0 ) ); - maps/mp/_compass::setupminimap( "compass_map_mp_meltdown" ); + level.levelspawndvars = ::levelspawndvars; + maps\mp\mp_meltdown_fx::main(); + precachemodel( "collision_physics_128x128x128" ); + precachemodel( "collision_physics_wall_256x256x10" ); + precachemodel( "collision_clip_wall_32x32x10" ); + precachemodel( "collision_clip_wall_64x64x10" ); + precachemodel( "collision_clip_64x64x10" ); + precachemodel( "collision_clip_wall_128x128x10" ); + precachemodel( "collision_physics_wall_64x64x10" ); + precachemodel( "collision_clip_32x32x32" ); + maps\mp\_load::main(); + maps\mp\mp_meltdown_amb::main(); + spawncollision( "collision_physics_128x128x128", "collider", ( 224, 4558.5, -117.5 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_wall_256x256x10", "collider", ( 216.5, 4526.5, -86 ), vectorscale( ( 0, 1, 0 ), 270.0 ) ); + spawncollision( "collision_clip_wall_32x32x10", "collider", ( 486, 3219.5, -53 ), vectorscale( ( 0, 1, 0 ), 288.2 ) ); + spawncollision( "collision_clip_wall_64x64x10", "collider", ( 505.5, 3197, -56.5 ), vectorscale( ( 0, 1, 0 ), 133.1 ) ); + spawncollision( "collision_clip_wall_64x64x10", "collider", ( 545, 3181.5, -72.5 ), vectorscale( ( 0, 1, 0 ), 180.4 ) ); + spawncollision( "collision_clip_wall_64x64x10", "collider", ( 582, 3194, -56.5 ), vectorscale( ( 0, 1, 0 ), 223.1 ) ); + spawncollision( "collision_clip_wall_32x32x10", "collider", ( 602.5, 3221.5, -54 ), vectorscale( ( 0, 1, 0 ), 254.2 ) ); + spawncollision( "collision_clip_64x64x10", "collider", ( 348.5, 615, 24 ), vectorscale( ( 0, 0, 1 ), 90.0 ) ); + spawncollision( "collision_clip_wall_64x64x10", "collider", ( 1005.5, 1466, 173 ), vectorscale( ( 0, 1, 0 ), 270.0 ) ); + spawncollision( "collision_clip_wall_128x128x10", "collider", ( 808, -1434.5, -120 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_wall_64x64x10", "collider", ( 1266, 1873.5, 86 ), vectorscale( ( 0, 1, 0 ), 35.0 ) ); + spawncollision( "collision_physics_wall_64x64x10", "collider", ( 1266, 1873.5, 126 ), vectorscale( ( 0, 1, 0 ), 35.0 ) ); + spawncollision( "collision_physics_32x32x32", "collider", ( 1183, 1927, 73 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_32x32x32", "collider", ( 555.5, 2976, -47.5 ), ( 0, 0, 0 ) ); + maps\mp\_compass::setupminimap( "compass_map_mp_meltdown" ); } -levelspawndvars( reset_dvars ) //checked matches cerberus output +levelspawndvars( reset_dvars ) { - ss = level.spawnsystem; - ss.enemy_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_radius", "2100", reset_dvars ); + ss = level.spawnsystem; + ss.enemy_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_radius", "2100", reset_dvars ); } - - diff --git a/Multiplayer Core/patch_mp/maps/mp/mp_mirage.gsc b/Multiplayer Core/patch_mp/maps/mp/mp_mirage.gsc index ef483a7..d584603 100644 --- a/Multiplayer Core/patch_mp/maps/mp/mp_mirage.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/mp_mirage.gsc @@ -1,44 +1,44 @@ -//checked includes changed to match cerberus output -#include maps/mp/gametypes/_spawning; -#include maps/mp/_compass; -#include maps/mp/mp_mirage_amb; -#include maps/mp/_load; -#include maps/mp/mp_mirage_fx; -#include maps/mp/_utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\_utility; +#include maps\mp\mp_mirage_fx; +#include maps\mp\_load; +#include maps\mp\mp_mirage_amb; +#include maps\mp\_compass; +#include maps\mp\gametypes\_spawning; -main() //checked matches cerberus output +main() { - level.levelspawndvars = ::levelspawndvars; - maps/mp/mp_mirage_fx::main(); - precachemodel( "collision_physics_256x256x10" ); - precachemodel( "collision_physics_cylinder_32x128" ); - precachemodel( "collision_clip_128x128x10" ); - precachemodel( "collision_clip_256x256x10" ); - maps/mp/_load::main(); - maps/mp/mp_mirage_amb::main(); - maps/mp/_compass::setupminimap( "compass_map_mp_mirage" ); - setdvar( "compassmaxrange", "2400" ); - visionsetnaked( "mp_mirage", 1 ); - game[ "strings" ][ "war_callsign_a" ] = &"MPUI_CALLSIGN_MAPNAME_A"; - game[ "strings" ][ "war_callsign_b" ] = &"MPUI_CALLSIGN_MAPNAME_B"; - game[ "strings" ][ "war_callsign_c" ] = &"MPUI_CALLSIGN_MAPNAME_C"; - game[ "strings" ][ "war_callsign_d" ] = &"MPUI_CALLSIGN_MAPNAME_D"; - game[ "strings" ][ "war_callsign_e" ] = &"MPUI_CALLSIGN_MAPNAME_E"; - game[ "strings_menu" ][ "war_callsign_a" ] = "@MPUI_CALLSIGN_MAPNAME_A"; - game[ "strings_menu" ][ "war_callsign_b" ] = "@MPUI_CALLSIGN_MAPNAME_B"; - game[ "strings_menu" ][ "war_callsign_c" ] = "@MPUI_CALLSIGN_MAPNAME_C"; - game[ "strings_menu" ][ "war_callsign_d" ] = "@MPUI_CALLSIGN_MAPNAME_D"; - game[ "strings_menu" ][ "war_callsign_e" ] = "@MPUI_CALLSIGN_MAPNAME_E"; - spawncollision( "collision_physics_256x256x10", "collider", ( 58.5, 3360, 53.5 ), vectorScale( ( 0, 1, 0 ), 352.9 ) ); - spawncollision( "collision_physics_cylinder_32x128", "collider", ( 3029, 1571.5, 129.5 ), vectorScale( ( 0, 0, -1 ), 8.3 ) ); - spawncollision( "collision_physics_cylinder_32x128", "collider", ( -1341, 517.5, -35.5 ), ( 354.7, 0, -0.6 ) ); - spawncollision( "collision_clip_256x256x10", "collider", ( 1744, 482, 16 ), ( 270, 183.902, 86.0983 ) ); - maps/mp/gametypes/_spawning::level_use_unified_spawning( 1 ); + level.levelspawndvars = ::levelspawndvars; + maps\mp\mp_mirage_fx::main(); + precachemodel( "collision_physics_256x256x10" ); + precachemodel( "collision_physics_cylinder_32x128" ); + precachemodel( "collision_clip_128x128x10" ); + precachemodel( "collision_clip_256x256x10" ); + maps\mp\_load::main(); + maps\mp\mp_mirage_amb::main(); + maps\mp\_compass::setupminimap( "compass_map_mp_mirage" ); + setdvar( "compassmaxrange", "2400" ); + visionsetnaked( "mp_mirage", 1 ); + game["strings"]["war_callsign_a"] = &"MPUI_CALLSIGN_MAPNAME_A"; + game["strings"]["war_callsign_b"] = &"MPUI_CALLSIGN_MAPNAME_B"; + game["strings"]["war_callsign_c"] = &"MPUI_CALLSIGN_MAPNAME_C"; + game["strings"]["war_callsign_d"] = &"MPUI_CALLSIGN_MAPNAME_D"; + game["strings"]["war_callsign_e"] = &"MPUI_CALLSIGN_MAPNAME_E"; + game["strings_menu"]["war_callsign_a"] = "@MPUI_CALLSIGN_MAPNAME_A"; + game["strings_menu"]["war_callsign_b"] = "@MPUI_CALLSIGN_MAPNAME_B"; + game["strings_menu"]["war_callsign_c"] = "@MPUI_CALLSIGN_MAPNAME_C"; + game["strings_menu"]["war_callsign_d"] = "@MPUI_CALLSIGN_MAPNAME_D"; + game["strings_menu"]["war_callsign_e"] = "@MPUI_CALLSIGN_MAPNAME_E"; + spawncollision( "collision_physics_256x256x10", "collider", ( 58.5, 3360, 53.5 ), vectorscale( ( 0, 1, 0 ), 352.9 ) ); + spawncollision( "collision_physics_cylinder_32x128", "collider", ( 3029, 1571.5, 129.5 ), vectorscale( ( 0, 0, -1 ), 8.3 ) ); + spawncollision( "collision_physics_cylinder_32x128", "collider", ( -1341, 517.5, -35.5 ), ( 354.7, 0, -0.6 ) ); + spawncollision( "collision_clip_256x256x10", "collider", ( 1744, 482, 16 ), ( 270, 183.902, 86.0983 ) ); + maps\mp\gametypes\_spawning::level_use_unified_spawning( 1 ); } -levelspawndvars( reset_dvars ) //checked matches cerberus output +levelspawndvars( reset_dvars ) { - ss = level.spawnsystem; - ss.enemy_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_radius", "2500", reset_dvars ); + ss = level.spawnsystem; + ss.enemy_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_radius", "2500", reset_dvars ); } - diff --git a/Multiplayer Core/patch_mp/maps/mp/mp_nightclub.gsc b/Multiplayer Core/patch_mp/maps/mp/mp_nightclub.gsc index e379751..c0d4bde 100644 --- a/Multiplayer Core/patch_mp/maps/mp/mp_nightclub.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/mp_nightclub.gsc @@ -1,106 +1,106 @@ -//checked includes changed to match cerberus output -#include maps/mp/_compass; -#include maps/mp/mp_nightclub_amb; -#include maps/mp/_load; -#include maps/mp/mp_nightclub_fx; -#include maps/mp/_utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\_utility; +#include maps\mp\mp_nightclub_fx; +#include maps\mp\_load; +#include maps\mp\mp_nightclub_amb; +#include maps\mp\_compass; -main() //checked changed to match cerberus output +main() { - level.levelspawndvars = ::levelspawndvars; - maps/mp/mp_nightclub_fx::main(); - precachemodel( "collision_clip_128x128x128" ); - precachemodel( "collision_physics_wall_32x32x10" ); - precachemodel( "collision_missile_256x256x10" ); - precachemodel( "collision_clip_cylinder_32x128" ); - precachemodel( "collision_clip_wall_64x64x10" ); - precachemodel( "collision_clip_128x128x10" ); - precachemodel( "collision_clip_64x64x10" ); - precachemodel( "collision_clip_wall_128x128x10" ); - precachemodel( "collision_missile_32x32x128" ); - precachemodel( "collision_missile_128x128x10" ); - precachemodel( "collision_tvs_anchor_desk01" ); - precachemodel( "collision_physics_wall_64x64x10" ); - precachemodel( "collision_physics_32x32x32" ); - maps/mp/_load::main(); - maps/mp/mp_nightclub_amb::main(); - maps/mp/_compass::setupminimap( "compass_map_mp_nightclub" ); - game[ "strings" ][ "war_callsign_a" ] = &"MPUI_CALLSIGN_MAPNAME_A"; - game[ "strings" ][ "war_callsign_b" ] = &"MPUI_CALLSIGN_MAPNAME_B"; - game[ "strings" ][ "war_callsign_c" ] = &"MPUI_CALLSIGN_MAPNAME_C"; - game[ "strings" ][ "war_callsign_d" ] = &"MPUI_CALLSIGN_MAPNAME_D"; - game[ "strings" ][ "war_callsign_e" ] = &"MPUI_CALLSIGN_MAPNAME_E"; - game[ "strings_menu" ][ "war_callsign_a" ] = "@MPUI_CALLSIGN_MAPNAME_A"; - game[ "strings_menu" ][ "war_callsign_b" ] = "@MPUI_CALLSIGN_MAPNAME_B"; - game[ "strings_menu" ][ "war_callsign_c" ] = "@MPUI_CALLSIGN_MAPNAME_C"; - game[ "strings_menu" ][ "war_callsign_d" ] = "@MPUI_CALLSIGN_MAPNAME_D"; - game[ "strings_menu" ][ "war_callsign_e" ] = "@MPUI_CALLSIGN_MAPNAME_E"; - spawncollision( "collision_clip_128x128x128", "collider", ( -17402.5, 2804, -109 ), vectorScale( ( 0, 1, 0 ), 315 ) ); - spawncollision( "collision_clip_128x128x128", "collider", ( -17350.5, 2856, -109 ), vectorScale( ( 0, 1, 0 ), 315 ) ); - spawncollision( "collision_clip_cylinder_32x128", "collider", ( -18769, 733, -218 ), ( 0, 0, 0 ) ); - spawncollision( "collision_clip_cylinder_32x128", "collider", ( -18772, 664, -218 ), ( 0, 0, 0 ) ); - spawncollision( "collision_clip_cylinder_32x128", "collider", ( -18772, 605, -218 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_wall_32x32x10", "collider", ( -16759, 3939, -100 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_wall_32x32x10", "collider", ( -16742, 3939, -100 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_wall_32x32x10", "collider", ( -19469, 355, -86 ), vectorScale( ( 0, 1, 0 ), 90 ) ); - spawncollision( "collision_physics_wall_32x32x10", "collider", ( -19469, 338, -86 ), vectorScale( ( 0, 1, 0 ), 90 ) ); - spawncollision( "collision_clip_wall_64x64x10", "collider", ( -18273.5, 1092.5, -2.5 ), vectorScale( ( 0, 1, 0 ), 86.7 ) ); - spawncollision( "collision_clip_wall_64x64x10", "collider", ( -16166.5, 1802, -127 ), ( 16, 44.3, 0 ) ); - spawncollision( "collision_missile_32x32x128", "collider", ( -18016.9, 1674.34, -179 ), ( 270, 225.8, 4.34 ) ); - spawncollision( "collision_missile_32x32x128", "collider", ( -18025.9, 1683.34, -179 ), ( 270, 225.8, 4.34 ) ); - spawncollision( "collision_missile_32x32x128", "collider", ( -17810.9, 1883.34, -77 ), ( 270, 225.8, 4.34 ) ); - spawncollision( "collision_missile_32x32x128", "collider", ( -17819.9, 1892.34, -77 ), ( 270, 225.8, 4.34 ) ); - spawncollision( "collision_missile_128x128x10", "collider", ( -17872, 1839, -87 ), ( 359.801, 315.726, 110.7287 ) ); - spawncollision( "collision_missile_128x128x10", "collider", ( -17860, 1827, -87 ), ( 359.801, 315.726, 110.7287 ) ); - spawncollision( "collision_missile_128x128x10", "collider", ( -17946, 1764, -129 ), ( 359.801, 315.726, 110.7287 ) ); - spawncollision( "collision_missile_128x128x10", "collider", ( -17970, 1737, -146 ), ( 359.801, 315.726, 110.7287 ) ); - spawncollision( "collision_missile_128x128x10", "collider", ( -17936, 1754, -129 ), ( 359.801, 315.726, 110.7287 ) ); - spawncollision( "collision_missile_128x128x10", "collider", ( -17961, 1728, -146 ), ( 359.801, 315.726, 110.7287 ) ); - spawncollision( "collision_missile_32x32x128", "collider", ( -17370.1, 2304.66, -77 ), ( 270, 45.8, 4.33999 ) ); - spawncollision( "collision_missile_32x32x128", "collider", ( -17379.1, 2313.66, -77 ), ( 270, 45.8, 4.33999 ) ); - spawncollision( "collision_missile_32x32x128", "collider", ( -17164.1, 2513.66, -179 ), ( 270, 45.8, 4.33999 ) ); - spawncollision( "collision_missile_32x32x128", "collider", ( -17173.1, 2522.66, -179 ), ( 270, 45.8, 4.33999 ) ); - spawncollision( "collision_missile_128x128x10", "collider", ( -17229, 2469, -146 ), ( 359.801, 135.726, 110.7287 ) ); - spawncollision( "collision_missile_128x128x10", "collider", ( -17220, 2460, -146 ), ( 359.801, 135.726, 110.7287 ) ); - spawncollision( "collision_missile_128x128x10", "collider", ( -17254, 2443, -129 ), ( 359.801, 135.726, 110.7287 ) ); - spawncollision( "collision_missile_128x128x10", "collider", ( -17244, 2433, -129 ), ( 359.801, 135.726, 110.7287 ) ); - spawncollision( "collision_missile_128x128x10", "collider", ( -17330, 2370, -87 ), ( 359.801, 135.726, 110.7287 ) ); - spawncollision( "collision_missile_128x128x10", "collider", ( -17318, 2358, -87 ), ( 359.801, 135.726, 110.7287 ) ); - spawncollision( "collision_tvs_anchor_desk01", "collider", ( -15441, 3711, -192 ), vectorScale( ( 0, 1, 0 ), 270 ) ); - spawncollision( "collision_missile_128x128x10", "collider", ( -16938.5, 2314, -226.5 ), vectorScale( ( 0, 1, 0 ), 33.5 ) ); - spawncollision( "collision_missile_128x128x10", "collider", ( -17504.5, 1852.5, -93 ), ( 0, 44.9, 90 ) ); - spawncollision( "collision_missile_128x128x10", "collider", ( -17413, 1942, -93 ), ( 0, 44.9, 90 ) ); - spawncollision( "collision_clip_256x256x10", "collider", ( -16309.5, 3077, -64.5 ), ( 0, 0, 0 ) ); - spawncollision( "collision_missile_32x32x128", "collider", ( -17336.4, 1959.55, -25.25 ), ( 0, 42.2, 90 ) ); - spawncollision( "collision_missile_32x32x128", "collider", ( -17315.1, 1935.7, -25.25 ), ( 0, 42.2, 90 ) ); - spawncollision( "collision_missile_32x32x128", "collider", ( -17311.6, 1931.95, -25.25 ), ( 0, 42.2, 90 ) ); - spawncollision( "collision_missile_32x32x128", "collider", ( -17462.9, 1832.79, -25.25 ), ( 0, 49.8, 90 ) ); - spawncollision( "collision_missile_32x32x128", "collider", ( -17438.6, 1811.97, -25.25 ), ( 0, 49.8, 90 ) ); - spawncollision( "collision_missile_32x32x128", "collider", ( -17434.6, 1808.72, -25.25 ), ( 0, 49.8, 90 ) ); - spawncollision( "collision_physics_wall_64x64x10", "collider", ( -18712.5, 525, -122.5 ), vectorScale( ( 0, 1, 0 ), 20.9 ) ); - spawncollision( "collision_physics_wall_64x64x10", "collider", ( -18712.5, 525, -159.5 ), vectorScale( ( 0, 1, 0 ), 20.9 ) ); - spawncollision( "collision_physics_wall_64x64x10", "collider", ( -18927.5, 1099, -122.5 ), vectorScale( ( 0, 1, 0 ), 65.6 ) ); - spawncollision( "collision_physics_wall_64x64x10", "collider", ( -18927.5, 1099, -159.5 ), vectorScale( ( 0, 1, 0 ), 65.6 ) ); - spawncollision( "collision_missile_32x32x128", "collider", ( -17335, 1962, -30.5 ), ( 0, 44.6, 90 ) ); - spawncollision( "collision_missile_32x32x128", "collider", ( -17463.5, 1833, -30.5 ), ( 0, 48.7, 90 ) ); - spawncollision( "collision_physics_32x32x32", "collider", ( -17251.5, 2908.5, 31 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_32x32x32", "collider", ( -17250.5, 2981, 31 ), ( 0, 0, 0 ) ); - destructibles = getentarray( "destructible", "targetname" ); - foreach ( destructible in destructibles ) - { - destructible thread car_sound_think(); - } + level.levelspawndvars = ::levelspawndvars; + maps\mp\mp_nightclub_fx::main(); + precachemodel( "collision_clip_128x128x128" ); + precachemodel( "collision_physics_wall_32x32x10" ); + precachemodel( "collision_missile_256x256x10" ); + precachemodel( "collision_clip_cylinder_32x128" ); + precachemodel( "collision_clip_wall_64x64x10" ); + precachemodel( "collision_clip_128x128x10" ); + precachemodel( "collision_clip_64x64x10" ); + precachemodel( "collision_clip_wall_128x128x10" ); + precachemodel( "collision_missile_32x32x128" ); + precachemodel( "collision_missile_128x128x10" ); + precachemodel( "collision_tvs_anchor_desk01" ); + precachemodel( "collision_physics_wall_64x64x10" ); + precachemodel( "collision_physics_32x32x32" ); + maps\mp\_load::main(); + maps\mp\mp_nightclub_amb::main(); + maps\mp\_compass::setupminimap( "compass_map_mp_nightclub" ); + game["strings"]["war_callsign_a"] = &"MPUI_CALLSIGN_MAPNAME_A"; + game["strings"]["war_callsign_b"] = &"MPUI_CALLSIGN_MAPNAME_B"; + game["strings"]["war_callsign_c"] = &"MPUI_CALLSIGN_MAPNAME_C"; + game["strings"]["war_callsign_d"] = &"MPUI_CALLSIGN_MAPNAME_D"; + game["strings"]["war_callsign_e"] = &"MPUI_CALLSIGN_MAPNAME_E"; + game["strings_menu"]["war_callsign_a"] = "@MPUI_CALLSIGN_MAPNAME_A"; + game["strings_menu"]["war_callsign_b"] = "@MPUI_CALLSIGN_MAPNAME_B"; + game["strings_menu"]["war_callsign_c"] = "@MPUI_CALLSIGN_MAPNAME_C"; + game["strings_menu"]["war_callsign_d"] = "@MPUI_CALLSIGN_MAPNAME_D"; + game["strings_menu"]["war_callsign_e"] = "@MPUI_CALLSIGN_MAPNAME_E"; + spawncollision( "collision_clip_128x128x128", "collider", ( -17402.5, 2804, -109 ), vectorscale( ( 0, 1, 0 ), 315.0 ) ); + spawncollision( "collision_clip_128x128x128", "collider", ( -17350.5, 2856, -109 ), vectorscale( ( 0, 1, 0 ), 315.0 ) ); + spawncollision( "collision_clip_cylinder_32x128", "collider", ( -18769, 733, -218 ), ( 0, 0, 0 ) ); + spawncollision( "collision_clip_cylinder_32x128", "collider", ( -18772, 664, -218 ), ( 0, 0, 0 ) ); + spawncollision( "collision_clip_cylinder_32x128", "collider", ( -18772, 605, -218 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_wall_32x32x10", "collider", ( -16759, 3939, -100 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_wall_32x32x10", "collider", ( -16742, 3939, -100 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_wall_32x32x10", "collider", ( -19469, 355, -86 ), vectorscale( ( 0, 1, 0 ), 90.0 ) ); + spawncollision( "collision_physics_wall_32x32x10", "collider", ( -19469, 338, -86 ), vectorscale( ( 0, 1, 0 ), 90.0 ) ); + spawncollision( "collision_clip_wall_64x64x10", "collider", ( -18273.5, 1092.5, -2.5 ), vectorscale( ( 0, 1, 0 ), 86.7 ) ); + spawncollision( "collision_clip_wall_64x64x10", "collider", ( -16166.5, 1802, -127 ), ( 16, 44.3, 0 ) ); + spawncollision( "collision_missile_32x32x128", "collider", ( -18016.9, 1674.34, -179 ), ( 270, 225.8, 4.34 ) ); + spawncollision( "collision_missile_32x32x128", "collider", ( -18025.9, 1683.34, -179 ), ( 270, 225.8, 4.34 ) ); + spawncollision( "collision_missile_32x32x128", "collider", ( -17810.9, 1883.34, -77 ), ( 270, 225.8, 4.34 ) ); + spawncollision( "collision_missile_32x32x128", "collider", ( -17819.9, 1892.34, -77 ), ( 270, 225.8, 4.34 ) ); + spawncollision( "collision_missile_128x128x10", "collider", ( -17872, 1839, -87 ), ( 359.801, 315.726, 110.729 ) ); + spawncollision( "collision_missile_128x128x10", "collider", ( -17860, 1827, -87 ), ( 359.801, 315.726, 110.729 ) ); + spawncollision( "collision_missile_128x128x10", "collider", ( -17946, 1764, -129 ), ( 359.801, 315.726, 110.729 ) ); + spawncollision( "collision_missile_128x128x10", "collider", ( -17970, 1737, -146 ), ( 359.801, 315.726, 110.729 ) ); + spawncollision( "collision_missile_128x128x10", "collider", ( -17936, 1754, -129 ), ( 359.801, 315.726, 110.729 ) ); + spawncollision( "collision_missile_128x128x10", "collider", ( -17961, 1728, -146 ), ( 359.801, 315.726, 110.729 ) ); + spawncollision( "collision_missile_32x32x128", "collider", ( -17370.1, 2304.66, -77 ), ( 270, 45.8, 4.33999 ) ); + spawncollision( "collision_missile_32x32x128", "collider", ( -17379.1, 2313.66, -77 ), ( 270, 45.8, 4.33999 ) ); + spawncollision( "collision_missile_32x32x128", "collider", ( -17164.1, 2513.66, -179 ), ( 270, 45.8, 4.33999 ) ); + spawncollision( "collision_missile_32x32x128", "collider", ( -17173.1, 2522.66, -179 ), ( 270, 45.8, 4.33999 ) ); + spawncollision( "collision_missile_128x128x10", "collider", ( -17229, 2469, -146 ), ( 359.801, 135.726, 110.729 ) ); + spawncollision( "collision_missile_128x128x10", "collider", ( -17220, 2460, -146 ), ( 359.801, 135.726, 110.729 ) ); + spawncollision( "collision_missile_128x128x10", "collider", ( -17254, 2443, -129 ), ( 359.801, 135.726, 110.729 ) ); + spawncollision( "collision_missile_128x128x10", "collider", ( -17244, 2433, -129 ), ( 359.801, 135.726, 110.729 ) ); + spawncollision( "collision_missile_128x128x10", "collider", ( -17330, 2370, -87 ), ( 359.801, 135.726, 110.729 ) ); + spawncollision( "collision_missile_128x128x10", "collider", ( -17318, 2358, -87 ), ( 359.801, 135.726, 110.729 ) ); + spawncollision( "collision_tvs_anchor_desk01", "collider", ( -15441, 3711, -192 ), vectorscale( ( 0, 1, 0 ), 270.0 ) ); + spawncollision( "collision_missile_128x128x10", "collider", ( -16938.5, 2314, -226.5 ), vectorscale( ( 0, 1, 0 ), 33.5 ) ); + spawncollision( "collision_missile_128x128x10", "collider", ( -17504.5, 1852.5, -93 ), ( 0, 44.9, 90 ) ); + spawncollision( "collision_missile_128x128x10", "collider", ( -17413, 1942, -93 ), ( 0, 44.9, 90 ) ); + spawncollision( "collision_clip_256x256x10", "collider", ( -16309.5, 3077, -64.5 ), ( 0, 0, 0 ) ); + spawncollision( "collision_missile_32x32x128", "collider", ( -17336.4, 1959.55, -25.25 ), ( 0, 42.2, 90 ) ); + spawncollision( "collision_missile_32x32x128", "collider", ( -17315.1, 1935.7, -25.25 ), ( 0, 42.2, 90 ) ); + spawncollision( "collision_missile_32x32x128", "collider", ( -17311.6, 1931.95, -25.25 ), ( 0, 42.2, 90 ) ); + spawncollision( "collision_missile_32x32x128", "collider", ( -17462.9, 1832.79, -25.25 ), ( 0, 49.8, 90 ) ); + spawncollision( "collision_missile_32x32x128", "collider", ( -17438.6, 1811.97, -25.25 ), ( 0, 49.8, 90 ) ); + spawncollision( "collision_missile_32x32x128", "collider", ( -17434.6, 1808.72, -25.25 ), ( 0, 49.8, 90 ) ); + spawncollision( "collision_physics_wall_64x64x10", "collider", ( -18712.5, 525, -122.5 ), vectorscale( ( 0, 1, 0 ), 20.9 ) ); + spawncollision( "collision_physics_wall_64x64x10", "collider", ( -18712.5, 525, -159.5 ), vectorscale( ( 0, 1, 0 ), 20.9 ) ); + spawncollision( "collision_physics_wall_64x64x10", "collider", ( -18927.5, 1099, -122.5 ), vectorscale( ( 0, 1, 0 ), 65.6 ) ); + spawncollision( "collision_physics_wall_64x64x10", "collider", ( -18927.5, 1099, -159.5 ), vectorscale( ( 0, 1, 0 ), 65.6 ) ); + spawncollision( "collision_missile_32x32x128", "collider", ( -17335, 1962, -30.5 ), ( 0, 44.6, 90 ) ); + spawncollision( "collision_missile_32x32x128", "collider", ( -17463.5, 1833, -30.5 ), ( 0, 48.7, 90 ) ); + spawncollision( "collision_physics_32x32x32", "collider", ( -17251.5, 2908.5, 31 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_32x32x32", "collider", ( -17250.5, 2981, 31 ), ( 0, 0, 0 ) ); + destructibles = getentarray( "destructible", "targetname" ); + + foreach ( destructible in destructibles ) + destructible thread car_sound_think(); } -levelspawndvars( reset_dvars ) //checked matches cerberus output +levelspawndvars( reset_dvars ) { - ss = level.spawnsystem; - ss.enemy_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_radius", "2200", reset_dvars ); + ss = level.spawnsystem; + ss.enemy_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_radius", "2200", reset_dvars ); } -car_sound_think() //checked matches cerberus output +car_sound_think() { - self waittill( "car_dead" ); - self playsound( "exp_barrel" ); -} + self waittill( "car_dead" ); + self playsound( "exp_barrel" ); +} diff --git a/Multiplayer Core/patch_mp/maps/mp/mp_nuketown_2020.gsc b/Multiplayer Core/patch_mp/maps/mp/mp_nuketown_2020.gsc index 790df3d..27cef13 100644 --- a/Multiplayer Core/patch_mp/maps/mp/mp_nuketown_2020.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/mp_nuketown_2020.gsc @@ -1,474 +1,485 @@ -//checked includes changed to match cerberus output -#include maps/mp/killstreaks/_killstreaks; -#include maps/mp/gametypes/_globallogic_defaults; -#include maps/mp/_compass; -#include maps/mp/mp_nuketown_2020_amb; -#include maps/mp/_load; -#include maps/mp/mp_nuketown_2020_fx; -#include maps/mp/_events; -#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\_events; +#include maps\mp\mp_nuketown_2020_fx; +#include maps\mp\_load; +#include maps\mp\mp_nuketown_2020_amb; +#include maps\mp\_compass; +#include maps\mp\gametypes\_globallogic_defaults; +#include maps\mp\killstreaks\_killstreaks; -//current version of the compiler doesn't compile this correctly causing the server to crash on load -//#using_animtree( "fxanim_props" ); +#using_animtree("fxanim_props"); -main() //checked matches cerberus output +main() { - level.levelspawndvars = ::levelspawndvars; - maps/mp/mp_nuketown_2020_fx::main(); - precachemodel( "collision_physics_32x32x128" ); - precachemodel( "collision_physics_32x32x32" ); - precachemodel( "collision_physics_wall_32x32x10" ); - precachemodel( "collision_clip_32x32x32" ); - precachemodel( "collision_vehicle_128x128x128" ); - precachemodel( "collision_missile_128x128x10" ); - precachemodel( "nt_2020_doorframe_black" ); - precachemodel( "collision_vehicle_32x32x10" ); - precachemodel( "collision_physics_256x256x10" ); - precachemodel( "collision_physics_cylinder_32x128" ); - precachemodel( "collision_missile_32x32x128" ); - precachemodel( "collision_physics_32x32x10" ); - precachemodel( "collision_clip_wall_64x64x10" ); - precachemodel( "collision_physics_wall_64x64x10" ); - precachemodel( "collision_physics_128x128x10" ); - maps/mp/_load::main(); - maps/mp/mp_nuketown_2020_amb::main(); - maps/mp/_compass::setupminimap( "compass_map_mp_nuketown_2020" ); - spawncollision( "collision_physics_32x32x128", "collider", ( 1216, 167.5, 235 ), ( 0, 3.69986, -90 ) ); - spawncollision( "collision_physics_32x32x128", "collider", ( 1213, 227, 235 ), ( 0, 10.9, -90 ) ); - spawncollision( "collision_physics_32x32x128", "collider", ( 1196, 315.5, 235 ), ( 0, 15.2, -90 ) ); - spawncollision( "collision_physics_32x32x128", "collider", ( 1151.5, 427, 235 ), ( 0, 27.8, -90 ) ); - spawncollision( "collision_physics_32x32x32", "collider", ( 1109, 488, 235 ), ( 0, 46.2, -90 ) ); - spawncollision( "collision_physics_256x256x10", "collider", ( 1067, 291, 240 ), vectorScale( ( 0, 1, 0 ), 14.3 ) ); - prop1 = spawn( "script_model", ( 678.485, 583.124, -91.75 ) ); - prop1.angles = ( 270, 198.902, 86.0983 ); - prop2 = spawn( "script_model", ( 705.49, 482.12, -91.75 ) ); - prop2.angles = ( 270, 198.902, 86.0983 ); - prop3 = spawn( "script_model", ( 732.49, 381.37, -91.75 ) ); - prop3.angles = ( 270, 198.902, 86.0983 ); - prop1 setmodel( "nt_2020_doorframe_black" ); - prop2 setmodel( "nt_2020_doorframe_black" ); - prop3 setmodel( "nt_2020_doorframe_black" ); - busprop1 = spawn( "script_model", ( -121.962, 53.5963, -24.241 ) ); - busprop1.angles = ( 274.162, 199.342, 86.5184 ); - busprop1 setmodel( "nt_2020_doorframe_black" ); - spawncollision( "collision_clip_32x32x32", "collider", ( 817.5, 415, 77 ), vectorScale( ( 0, 1, 0 ), 15.2 ) ); - spawncollision( "collision_clip_32x32x32", "collider", ( 859, 430, 77.5 ), vectorScale( ( 0, 1, 0 ), 15.2 ) ); - spawncollision( "collision_clip_32x32x32", "collider", ( 894, 439.5, 77.5 ), vectorScale( ( 0, 1, 0 ), 15.2 ) ); - spawncollision( "collision_clip_32x32x32", "collider", ( 926.5, 448.5, 77.5 ), vectorScale( ( 0, 1, 0 ), 15.2 ) ); - spawncollision( "collision_clip_32x32x32", "collider", ( 1257.5, 489, -68 ), vectorScale( ( 0, 1, 0 ), 15.2 ) ); - spawncollision( "collision_clip_32x32x32", "collider", ( 1288.5, 497.5, -68 ), vectorScale( ( 0, 1, 0 ), 15.2 ) ); - spawncollision( "collision_missile_128x128x10", "collider", ( 570.655, 214.604, -10.5 ), vectorScale( ( 0, 1, 0 ), 284.5 ) ); - spawncollision( "collision_missile_128x128x10", "collider", ( 558.345, 260.896, -10.5 ), vectorScale( ( 0, 1, 0 ), 284.5 ) ); - spawncollision( "collision_physics_wall_32x32x10", "collider", ( -1422, 40.5, 4.5 ), vectorScale( ( 0, 1, 0 ), 72.2 ) ); - spawncollision( "collision_physics_cylinder_32x128", "collider", ( 883.75, 826.5, 195.75 ), ( 0, 263.2, -90 ) ); - spawncollision( "collision_physics_cylinder_32x128", "collider", ( 770, 824.75, 195.75 ), ( 0, 276.4, -90 ) ); - spawncollision( "collision_physics_cylinder_32x128", "collider", ( 661.25, 801, 195.75 ), ( 0, 287.4, -90 ) ); - spawncollision( "collision_physics_cylinder_32x128", "collider", ( 560.75, 751.75, 195.75 ), ( 0, 302, -90 ) ); - spawncollision( "collision_physics_32x32x10", "collider", ( 1325, 532, 14 ), vectorScale( ( 0, 1, 0 ), 14.9 ) ); - spawncollision( "collision_physics_32x32x10", "collider", ( 1369, 542.5, 14 ), vectorScale( ( 0, 1, 0 ), 14.9 ) ); - spawncollision( "collision_physics_wall_32x32x10", "collider", ( -1936, 699.5, -49 ), ( 359.339, 356.866, -11.7826 ) ); - spawncollision( "collision_physics_wall_32x32x10", "collider", ( -1936, 703.5, -28.5 ), ( 359.339, 356.866, -11.7826 ) ); - spawncollision( "collision_clip_wall_64x64x10", "collider", ( 1013.5, 76.5, 42 ), vectorScale( ( 0, 1, 0 ), 15 ) ); - spawncollision( "collision_clip_wall_64x64x10", "collider", ( -458.5, 589, 63 ), ( 1.3179, 341.742, 3.9882 ) ); - spawncollision( "collision_physics_32x32x10", "collider", ( 653, 344.5, 147 ), vectorScale( ( 0, 1, 0 ), 14.7 ) ); - spawncollision( "collision_physics_32x32x10", "collider", ( 653, 344.5, 98 ), vectorScale( ( 0, 1, 0 ), 14.7 ) ); - spawncollision( "collision_physics_wall_64x64x10", "collider", ( -611.5, 535, 90.5 ), ( 359.952, 250.338, 9.04601 ) ); - spawncollision( "collision_physics_128x128x10", "collider", ( 1168.13, 200.5, 222.485 ), ( 352.436, 6.33769, -2.04434 ) ); - spawncollision( "collision_physics_128x128x10", "collider", ( 1147.43, 295.5, 219.708 ), ( 352.293, 18.1248, -1.3497 ) ); - spawncollision( "collision_physics_128x128x10", "collider", ( 1113.81, 391.5, 218.7 ), ( 352.832, 23.1409, -0.786543 ) ); - level.onspawnintermission = ::nuked_intermission; - level.endgamefunction = ::nuked_end_game; - setdvar( "compassmaxrange", "2100" ); - precacheitem( "vcs_controller_mp" ); - precachemenu( "vcs" ); - precachemodel( "nt_sign_population" ); - precachemodel( "nt_sign_population_vcs" ); - precachestring( &"MPUI_USE_VCS_HINT" ); - level.const_fx_exploder_nuke = 1001; - level.headless_mannequin_count = 0; - level.destructible_callbacks[ "headless" ] = ::mannequin_headless; - level thread nuked_population_sign_think(); - level.disableoutrovisionset = 1; - destructible_car_anims = []; - destructible_car_anims[ "car1" ] = %fxanim_mp_nuked2025_car01_anim; - destructible_car_anims[ "car2" ] = %fxanim_mp_nuked2025_car02_anim; - destructible_car_anims[ "displayGlass" ] = %fxanim_mp_nuked2025_display_glass_anim; - level thread nuked_mannequin_init(); - level thread nuked_powerlevel_think(); - level thread nuked_bomb_drop_think(); + level.levelspawndvars = ::levelspawndvars; + maps\mp\mp_nuketown_2020_fx::main(); + precachemodel( "collision_physics_32x32x128" ); + precachemodel( "collision_physics_32x32x32" ); + precachemodel( "collision_physics_wall_32x32x10" ); + precachemodel( "collision_clip_32x32x32" ); + precachemodel( "collision_vehicle_128x128x128" ); + precachemodel( "collision_missile_128x128x10" ); + precachemodel( "nt_2020_doorframe_black" ); + precachemodel( "collision_vehicle_32x32x10" ); + precachemodel( "collision_physics_256x256x10" ); + precachemodel( "collision_physics_cylinder_32x128" ); + precachemodel( "collision_missile_32x32x128" ); + precachemodel( "collision_physics_32x32x10" ); + precachemodel( "collision_clip_wall_64x64x10" ); + precachemodel( "collision_physics_wall_64x64x10" ); + precachemodel( "collision_physics_128x128x10" ); + maps\mp\_load::main(); + maps\mp\mp_nuketown_2020_amb::main(); + maps\mp\_compass::setupminimap( "compass_map_mp_nuketown_2020" ); + spawncollision( "collision_physics_32x32x128", "collider", ( 1216, 167.5, 235 ), ( 0, 3.69986, -90 ) ); + spawncollision( "collision_physics_32x32x128", "collider", ( 1213, 227, 235 ), ( 0, 10.9, -90 ) ); + spawncollision( "collision_physics_32x32x128", "collider", ( 1196, 315.5, 235 ), ( 0, 15.2, -90 ) ); + spawncollision( "collision_physics_32x32x128", "collider", ( 1151.5, 427, 235 ), ( 0, 27.8, -90 ) ); + spawncollision( "collision_physics_32x32x32", "collider", ( 1109, 488, 235 ), ( 0, 46.2, -90 ) ); + spawncollision( "collision_physics_256x256x10", "collider", ( 1067, 291, 240 ), vectorscale( ( 0, 1, 0 ), 14.3 ) ); + prop1 = spawn( "script_model", ( 678.485, 583.124, -91.75 ) ); + prop1.angles = ( 270, 198.902, 86.0983 ); + prop2 = spawn( "script_model", ( 705.49, 482.12, -91.75 ) ); + prop2.angles = ( 270, 198.902, 86.0983 ); + prop3 = spawn( "script_model", ( 732.49, 381.37, -91.75 ) ); + prop3.angles = ( 270, 198.902, 86.0983 ); + prop1 setmodel( "nt_2020_doorframe_black" ); + prop2 setmodel( "nt_2020_doorframe_black" ); + prop3 setmodel( "nt_2020_doorframe_black" ); + busprop1 = spawn( "script_model", ( -121.962, 53.5963, -24.241 ) ); + busprop1.angles = ( 274.162, 199.342, 86.5184 ); + busprop1 setmodel( "nt_2020_doorframe_black" ); + spawncollision( "collision_clip_32x32x32", "collider", ( 817.5, 415, 77 ), vectorscale( ( 0, 1, 0 ), 15.2 ) ); + spawncollision( "collision_clip_32x32x32", "collider", ( 859, 430, 77.5 ), vectorscale( ( 0, 1, 0 ), 15.2 ) ); + spawncollision( "collision_clip_32x32x32", "collider", ( 894, 439.5, 77.5 ), vectorscale( ( 0, 1, 0 ), 15.2 ) ); + spawncollision( "collision_clip_32x32x32", "collider", ( 926.5, 448.5, 77.5 ), vectorscale( ( 0, 1, 0 ), 15.2 ) ); + spawncollision( "collision_clip_32x32x32", "collider", ( 1257.5, 489, -68 ), vectorscale( ( 0, 1, 0 ), 15.2 ) ); + spawncollision( "collision_clip_32x32x32", "collider", ( 1288.5, 497.5, -68 ), vectorscale( ( 0, 1, 0 ), 15.2 ) ); + spawncollision( "collision_missile_128x128x10", "collider", ( 570.655, 214.604, -10.5 ), vectorscale( ( 0, 1, 0 ), 284.5 ) ); + spawncollision( "collision_missile_128x128x10", "collider", ( 558.345, 260.896, -10.5 ), vectorscale( ( 0, 1, 0 ), 284.5 ) ); + spawncollision( "collision_physics_wall_32x32x10", "collider", ( -1422, 40.5, 4.5 ), vectorscale( ( 0, 1, 0 ), 72.2 ) ); + spawncollision( "collision_physics_cylinder_32x128", "collider", ( 883.75, 826.5, 195.75 ), ( 0, 263.2, -90 ) ); + spawncollision( "collision_physics_cylinder_32x128", "collider", ( 770, 824.75, 195.75 ), ( 0, 276.4, -90 ) ); + spawncollision( "collision_physics_cylinder_32x128", "collider", ( 661.25, 801, 195.75 ), ( 0, 287.4, -90 ) ); + spawncollision( "collision_physics_cylinder_32x128", "collider", ( 560.75, 751.75, 195.75 ), ( 0, 302, -90 ) ); + spawncollision( "collision_physics_32x32x10", "collider", ( 1325, 532, 14 ), vectorscale( ( 0, 1, 0 ), 14.9 ) ); + spawncollision( "collision_physics_32x32x10", "collider", ( 1369, 542.5, 14 ), vectorscale( ( 0, 1, 0 ), 14.9 ) ); + spawncollision( "collision_physics_wall_32x32x10", "collider", ( -1936, 699.5, -49 ), ( 359.339, 356.866, -11.7826 ) ); + spawncollision( "collision_physics_wall_32x32x10", "collider", ( -1936, 703.5, -28.5 ), ( 359.339, 356.866, -11.7826 ) ); + spawncollision( "collision_clip_wall_64x64x10", "collider", ( 1013.5, 76.5, 42 ), vectorscale( ( 0, 1, 0 ), 15.0 ) ); + spawncollision( "collision_clip_wall_64x64x10", "collider", ( -458.5, 589, 63 ), ( 1.3179, 341.742, 3.9882 ) ); + spawncollision( "collision_physics_32x32x10", "collider", ( 653, 344.5, 147 ), vectorscale( ( 0, 1, 0 ), 14.7 ) ); + spawncollision( "collision_physics_32x32x10", "collider", ( 653, 344.5, 98 ), vectorscale( ( 0, 1, 0 ), 14.7 ) ); + spawncollision( "collision_physics_wall_64x64x10", "collider", ( -611.5, 535, 90.5 ), ( 359.952, 250.338, 9.04601 ) ); + spawncollision( "collision_physics_128x128x10", "collider", ( 1168.13, 200.5, 222.485 ), ( 352.436, 6.33769, -2.04434 ) ); + spawncollision( "collision_physics_128x128x10", "collider", ( 1147.43, 295.5, 219.708 ), ( 352.293, 18.1248, -1.3497 ) ); + spawncollision( "collision_physics_128x128x10", "collider", ( 1113.81, 391.5, 218.7 ), ( 352.832, 23.1409, -0.786543 ) ); + level.onspawnintermission = ::nuked_intermission; + level.endgamefunction = ::nuked_end_game; + setdvar( "compassmaxrange", "2100" ); + precacheitem( "vcs_controller_mp" ); + precachemenu( "vcs" ); + precachemodel( "nt_sign_population" ); + precachemodel( "nt_sign_population_vcs" ); + precachestring( &"MPUI_USE_VCS_HINT" ); + level.const_fx_exploder_nuke = 1001; + level.headless_mannequin_count = 0; + level.destructible_callbacks["headless"] = ::mannequin_headless; + level thread nuked_population_sign_think(); + level.disableoutrovisionset = 1; + destructible_car_anims = []; + destructible_car_anims["car1"] = %fxanim_mp_nuked2025_car01_anim; + destructible_car_anims["car2"] = %fxanim_mp_nuked2025_car02_anim; + destructible_car_anims["displayGlass"] = %fxanim_mp_nuked2025_display_glass_anim; + level thread nuked_mannequin_init(); + level thread nuked_powerlevel_think(); + level thread nuked_bomb_drop_think(); } -levelspawndvars( reset_dvars ) //checked matches cerberus output +levelspawndvars( reset_dvars ) { - ss = level.spawnsystem; - ss.enemy_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_radius", "1600", reset_dvars ); - ss.dead_friend_influencer_radius = set_dvar_float_if_unset( "scr_spawn_dead_friend_influencer_radius", "1300", reset_dvars ); - ss.dead_friend_influencer_timeout_seconds = set_dvar_float_if_unset( "scr_spawn_dead_friend_influencer_timeout_seconds", "8", reset_dvars ); - ss.dead_friend_influencer_count = set_dvar_float_if_unset( "scr_spawn_dead_friend_influencer_count", "7", reset_dvars ); + ss = level.spawnsystem; + ss.enemy_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_radius", "1600", reset_dvars ); + ss.dead_friend_influencer_radius = set_dvar_float_if_unset( "scr_spawn_dead_friend_influencer_radius", "1300", reset_dvars ); + ss.dead_friend_influencer_timeout_seconds = set_dvar_float_if_unset( "scr_spawn_dead_friend_influencer_timeout_seconds", "8", reset_dvars ); + ss.dead_friend_influencer_count = set_dvar_float_if_unset( "scr_spawn_dead_friend_influencer_count", "7", reset_dvars ); } -move_spawn_point( targetname, start_point, new_point ) //checked changed to match cerberus output +move_spawn_point( targetname, start_point, new_point ) { - spawn_points = getentarray( targetname, "classname" ); - for ( i = 0; i < spawn_points.size; i++ ) - { - if ( distancesquared( spawn_points[ i ].origin, start_point ) < 1 ) - { - spawn_points[ i ].origin = new_point; - return; - } - } + spawn_points = getentarray( targetname, "classname" ); + + for ( i = 0; i < spawn_points.size; i++ ) + { + if ( distancesquared( spawn_points[i].origin, start_point ) < 1 ) + { + spawn_points[i].origin = new_point; + return; + } + } } -nuked_mannequin_init() //checked partially changed to match cerberus output see info.md +nuked_mannequin_init() { - destructibles = getentarray( "destructible", "targetname" ); - mannequins = nuked_mannequin_filter( destructibles ); - level.mannequin_count = mannequins.size; - if ( mannequins.size <= 0 ) - { - return; - } - camerastart = getstruct( "endgame_camera_start", "targetname" ); - level.endgamemannequin = getclosest( camerastart.origin, mannequins ); - remove_count = mannequins.size - 25; - remove_count = clamp( remove_count, 0, remove_count ); - mannequins = array_randomize( mannequins ); - i = 0; - while ( i < remove_count ) - { - /* + destructibles = getentarray( "destructible", "targetname" ); + mannequins = nuked_mannequin_filter( destructibles ); + level.mannequin_count = mannequins.size; + + if ( mannequins.size <= 0 ) + return; + + camerastart = getstruct( "endgame_camera_start", "targetname" ); + level.endgamemannequin = getclosest( camerastart.origin, mannequins ); + remove_count = mannequins.size - 25; + remove_count = clamp( remove_count, 0, remove_count ); + mannequins = array_randomize( mannequins ); + + for ( i = 0; i < remove_count; i++ ) + { /# - assert( isDefined( mannequins[ i ].target ) ); + assert( isdefined( mannequins[i].target ) ); #/ - */ - if ( level.endgamemannequin == mannequins[ i ] ) - { - i++; - continue; - } - collision = getent( mannequins[ i ].target, "targetname" ); - /* + if ( level.endgamemannequin == mannequins[i] ) + continue; + + collision = getent( mannequins[i].target, "targetname" ); /# - assert( isDefined( collision ) ); + assert( isdefined( collision ) ); #/ - */ - collision delete(); - mannequins[ i ] delete(); - level.mannequin_count--; - i++; - } - level waittill( "prematch_over" ); - level.mannequin_time = getTime(); + collision delete(); + mannequins[i] delete(); + level.mannequin_count--; + } + + level waittill( "prematch_over" ); + + level.mannequin_time = gettime(); } -nuked_mannequin_filter( destructibles ) //checked changed to match cerberus output +nuked_mannequin_filter( destructibles ) { - mannequins = []; - for ( i = 0; i < destructibles.size; i++ ) - { - destructible = destructibles[ i ]; - if ( issubstr( destructible.destructibledef, "male" ) ) - { - mannequins[ mannequins.size ] = destructible; - } - } - return mannequins; + mannequins = []; + + for ( i = 0; i < destructibles.size; i++ ) + { + destructible = destructibles[i]; + + if ( issubstr( destructible.destructibledef, "male" ) ) + mannequins[mannequins.size] = destructible; + } + + return mannequins; } -mannequin_headless( notifytype, attacker ) //checked matches cerberus output +mannequin_headless( notifytype, attacker ) { - if ( getTime() < ( level.mannequin_time + ( getdvarintdefault( "vcs_timelimit", 120 ) * 1000 ) ) ) - { - level.headless_mannequin_count++; - if ( level.headless_mannequin_count == level.mannequin_count ) - { - level thread do_vcs(); - } - } + if ( gettime() < level.mannequin_time + getdvarintdefault( "vcs_timelimit", 120 ) * 1000 ) + { + level.headless_mannequin_count++; + + if ( level.headless_mannequin_count == level.mannequin_count ) + level thread do_vcs(); + } } -nuked_intermission() //checked matches cerberus output +nuked_intermission() { - maps/mp/gametypes/_globallogic_defaults::default_onspawnintermission(); + maps\mp\gametypes\_globallogic_defaults::default_onspawnintermission(); } -nuked_end_game() //checked matches cerberus output +nuked_end_game() { - if ( waslastround() ) - { - level notify( "nuke_detonation" ); - level thread nuke_detonation(); - } + if ( waslastround() ) + { + level notify( "nuke_detonation" ); + level thread nuke_detonation(); + } } -nuke_detonation() //checked changed to match cerberus output +nuke_detonation() { - level notify( "bomb_drop_pre" ); - clientnotify( "bomb_drop_pre" ); - bomb_loc = getent( "bomb_loc", "targetname" ); - bomb_loc playsound( "amb_end_nuke_2d" ); - destructibles = getentarray( "destructible", "targetname" ); - for ( i = 0; i < destructibles.size; i++ ) - { - if ( getsubstr( destructibles[ i ].destructibledef, 0, 4 ) == "veh_" ) - { - destructibles[ i ] hide(); - } - } - displaysign = getent( "nuke_display_glass_server", "targetname" ); - /* + level notify( "bomb_drop_pre" ); + clientnotify( "bomb_drop_pre" ); + bomb_loc = getent( "bomb_loc", "targetname" ); + bomb_loc playsound( "amb_end_nuke_2d" ); + destructibles = getentarray( "destructible", "targetname" ); + + for ( i = 0; i < destructibles.size; i++ ) + { + if ( getsubstr( destructibles[i].destructibledef, 0, 4 ) == "veh_" ) + destructibles[i] hide(); + } + + displaysign = getent( "nuke_display_glass_server", "targetname" ); /# - assert( isDefined( displaysign ) ); + assert( isdefined( displaysign ) ); #/ - */ - displaysign hide(); - bombwaitpretime = getdvarfloatdefault( "scr_nuke_car_pre", 0.5 ); - wait bombwaitpretime; - exploder( level.const_fx_exploder_nuke ); - bomb_loc = getent( "bomb_loc", "targetname" ); - bomb_loc playsound( "amb_end_nuke" ); - level notify( "bomb_drop" ); - clientnotify( "bomb_drop" ); - bombwaittime = getdvarfloatdefault( "scr_nuke_car_flip", 3.25 ); - wait bombwaittime; - clientnotify( "nuke_car_flip" ); - location = level.endgamemannequin.origin + ( 0, -20, 50 ); - radiusdamage( location, 128, 128, 128 ); - physicsexplosionsphere( location, 128, 128, 1 ); - mannequinwaittime = getdvarfloatdefault( "scr_nuke_mannequin_flip", 0,25 ); - wait mannequinwaittime; - level.endgamemannequin rotateto( level.endgamemannequin.angles + vectorScale( ( 0, 0, 1 ), 90 ), 0.7 ); - level.endgamemannequin moveto( level.endgamemannequin.origin + vectorScale( ( 0, 1, 0 ), 90 ), 1 ); + displaysign hide(); + bombwaitpretime = getdvarfloatdefault( "scr_nuke_car_pre", 0.5 ); + wait( bombwaitpretime ); + exploder( level.const_fx_exploder_nuke ); + bomb_loc = getent( "bomb_loc", "targetname" ); + bomb_loc playsound( "amb_end_nuke" ); + level notify( "bomb_drop" ); + clientnotify( "bomb_drop" ); + bombwaittime = getdvarfloatdefault( "scr_nuke_car_flip", 3.25 ); + wait( bombwaittime ); + clientnotify( "nuke_car_flip" ); + location = level.endgamemannequin.origin + ( 0, -20, 50 ); + radiusdamage( location, 128, 128, 128 ); + physicsexplosionsphere( location, 128, 128, 1 ); + mannequinwaittime = getdvarfloatdefault( "scr_nuke_mannequin_flip", 0.25 ); + wait( mannequinwaittime ); + level.endgamemannequin rotateto( level.endgamemannequin.angles + vectorscale( ( 0, 0, 1 ), 90.0 ), 0.7 ); + level.endgamemannequin moveto( level.endgamemannequin.origin + vectorscale( ( 0, 1, 0 ), 90.0 ), 1 ); } -nuked_bomb_drop_think() //checked changed to match cerberus output +nuked_bomb_drop_think() { - camerastart = getstruct( "endgame_camera_start", "targetname" ); - cameraend = getstruct( camerastart.target, "targetname" ); - bomb_loc = getent( "bomb_loc", "targetname" ); - cam_move_time = set_dvar_float_if_unset( "scr_cam_move_time", "4.0" ); - bomb_explode_delay = set_dvar_float_if_unset( "scr_bomb_explode_delay", "2.75" ); - env_destroy_delay = set_dvar_float_if_unset( "scr_env_destroy_delay", "0.5" ); - for ( ;; ) - { - camera = spawn( "script_model", camerastart.origin ); - camera.angles = camerastart.angles; - camera setmodel( "tag_origin" ); - level waittill( "bomb_drop_pre" ); - level notify( "fxanim_dome_explode_start" ); - for ( i = 0; i < get_players().size; i++ ) - { - player = get_players()[ i ]; - player camerasetposition( camera ); - player camerasetlookat(); - player cameraactivate( 1 ); - player setdepthoffield( 0, 128, 7000, 10000, 6, 1,8 ); - } - camera moveto( cameraend.origin, cam_move_time, 0, 0 ); - camera rotateto( cameraend.angles, cam_move_time, 0, 0 ); - bombwaittime = getdvarfloatdefault( "mp_nuketown_2020_bombwait", 3 ); - wait bombwaittime; - wait env_destroy_delay; - cameraforward = anglesToForward( cameraend.angles ); - physicsexplosionsphere( bomb_loc.origin, 128, 128, 1 ); - radiusdamage( bomb_loc.origin, 128, 128, 128 ); - } + camerastart = getstruct( "endgame_camera_start", "targetname" ); + cameraend = getstruct( camerastart.target, "targetname" ); + bomb_loc = getent( "bomb_loc", "targetname" ); + cam_move_time = set_dvar_float_if_unset( "scr_cam_move_time", "4.0" ); + bomb_explode_delay = set_dvar_float_if_unset( "scr_bomb_explode_delay", "2.75" ); + env_destroy_delay = set_dvar_float_if_unset( "scr_env_destroy_delay", "0.5" ); + + for (;;) + { + camera = spawn( "script_model", camerastart.origin ); + camera.angles = camerastart.angles; + camera setmodel( "tag_origin" ); + + level waittill( "bomb_drop_pre" ); + + level notify( "fxanim_dome_explode_start" ); + + for ( i = 0; i < get_players().size; i++ ) + { + player = get_players()[i]; + player camerasetposition( camera ); + player camerasetlookat(); + player cameraactivate( 1 ); + player setdepthoffield( 0, 128, 7000, 10000, 6, 1.8 ); + } + + camera moveto( cameraend.origin, cam_move_time, 0, 0 ); + camera rotateto( cameraend.angles, cam_move_time, 0, 0 ); + bombwaittime = getdvarfloatdefault( "mp_nuketown_2020_bombwait", 3.0 ); + wait( bombwaittime ); + wait( env_destroy_delay ); + cameraforward = anglestoforward( cameraend.angles ); + physicsexplosionsphere( bomb_loc.origin, 128, 128, 1 ); + radiusdamage( bomb_loc.origin, 128, 128, 128 ); + } } -nuked_population_sign_think() //checked changed to match beta dump +nuked_population_sign_think() { - tens_model = getent( "counter_tens", "targetname" ); - ones_model = getent( "counter_ones", "targetname" ); - step = 36; - ones = 0; - tens = 0; - tens_model rotateroll( step, 0.05 ); - ones_model rotateroll( step, 0.05 ); - for ( ;; ) - { - wait 1; - for ( ;; ) - { - num_players = get_players().size; - dial = ones + ( tens * 10 ); - if ( num_players < dial ) - { - ones--; + tens_model = getent( "counter_tens", "targetname" ); + ones_model = getent( "counter_ones", "targetname" ); + step = 36; + ones = 0; + tens = 0; + tens_model rotateroll( step, 0.05 ); + ones_model rotateroll( step, 0.05 ); - time = set_dvar_float_if_unset( "scr_dial_rotate_time", "0.5" ); - if ( ones < 0 ) - { - ones = 9; - tens_model rotateroll( 0 - step, time ); - tens--; + for (;;) + { + wait 1; - } - ones_model rotateroll( 0 - step, time ); - ones_model waittill( "rotatedone" ); - continue; - } - if ( num_players > dial ) - { - ones++; - time = set_dvar_float_if_unset( "scr_dial_rotate_time", "0.5" ); - if ( ones > 9 ) - { - ones = 0; - tens_model rotateroll( step, time ); - tens++; - } - ones_model rotateroll( step, time ); - ones_model waittill( "rotatedone" ); - continue; - } - else - { - break; - } - } - } + for (;;) + { + num_players = get_players().size; + dial = ones + tens * 10; + + if ( num_players < dial ) + { + ones--; + time = set_dvar_float_if_unset( "scr_dial_rotate_time", "0.5" ); + + if ( ones < 0 ) + { + ones = 9; + tens_model rotateroll( 0 - step, time ); + tens--; + } + + ones_model rotateroll( 0 - step, time ); + + ones_model waittill( "rotatedone" ); + + continue; + } + + if ( num_players > dial ) + { + ones++; + time = set_dvar_float_if_unset( "scr_dial_rotate_time", "0.5" ); + + if ( ones > 9 ) + { + ones = 0; + tens_model rotateroll( step, time ); + tens++; + } + + ones_model rotateroll( step, time ); + + ones_model waittill( "rotatedone" ); + + continue; + } + + break; + } + } } -do_vcs() //checked matches cerberus output +do_vcs() { - if ( getdvarintdefault( "disable_vcs", 0 ) ) - { - return; - } - if ( !getgametypesetting( "allowMapScripting" ) ) - { - return; - } - if ( !level.onlinegame || !sessionmodeisprivate() ) - { - return; - } - if ( level.wiiu ) - { - return; - } - targettag = getent( "player_tv_position", "targetname" ); - level.vcs_trigger = spawn( "trigger_radius_use", targettag.origin, 0, 64, 64 ); - level.vcs_trigger setcursorhint( "HINT_NOICON" ); - level.vcs_trigger sethintstring( &"MPUI_USE_VCS_HINT" ); - level.vcs_trigger triggerignoreteam(); - screen = getent( "nuketown_tv", "targetname" ); - screen setmodel( "nt_sign_population_vcs" ); - while ( 1 ) - { - level.vcs_trigger waittill( "trigger", player ); - if ( player isusingremote() || !isalive( player ) ) - { - continue; - } - prevweapon = player getcurrentweapon(); - if ( prevweapon == "none" || maps/mp/killstreaks/_killstreaks::iskillstreakweapon( prevweapon ) ) - { - continue; - } - level.vcs_trigger setinvisibletoall(); - player giveweapon( "vcs_controller_mp" ); - player switchtoweapon( "vcs_controller_mp" ); - player setstance( "stand" ); - placementtag = spawn( "script_model", player.origin ); - placementtag.angles = player.angles; - player playerlinktoabsolute( placementtag ); - placementtag moveto( targettag.origin, 0.5, 0.05, 0.05 ); - placementtag rotateto( targettag.angles, 0.5, 0.05, 0.05 ); - player enableinvulnerability(); - player openmenu( "vcs" ); - player wait_till_done_playing_vcs(); - if ( !level.gameended ) - { - if ( isDefined( player ) ) - { - player disableinvulnerability(); - player unlink(); - player takeweapon( "vcs_controller_mp" ); - player switchtoweapon( prevweapon ); - } - level.vcs_trigger setvisibletoall(); - } - } + if ( getdvarintdefault( "disable_vcs", 0 ) ) + return; + + if ( !getgametypesetting( "allowMapScripting" ) ) + return; + + if ( !level.onlinegame || !sessionmodeisprivate() ) + return; + + if ( level.wiiu ) + return; + + targettag = getent( "player_tv_position", "targetname" ); + level.vcs_trigger = spawn( "trigger_radius_use", targettag.origin, 0, 64, 64 ); + level.vcs_trigger setcursorhint( "HINT_NOICON" ); + level.vcs_trigger sethintstring( &"MPUI_USE_VCS_HINT" ); + level.vcs_trigger triggerignoreteam(); + screen = getent( "nuketown_tv", "targetname" ); + screen setmodel( "nt_sign_population_vcs" ); + + while ( true ) + { + level.vcs_trigger waittill( "trigger", player ); + + if ( player isusingremote() || !isalive( player ) ) + continue; + + prevweapon = player getcurrentweapon(); + + if ( prevweapon == "none" || maps\mp\killstreaks\_killstreaks::iskillstreakweapon( prevweapon ) ) + continue; + + level.vcs_trigger setinvisibletoall(); + player giveweapon( "vcs_controller_mp" ); + player switchtoweapon( "vcs_controller_mp" ); + player setstance( "stand" ); + placementtag = spawn( "script_model", player.origin ); + placementtag.angles = player.angles; + player playerlinktoabsolute( placementtag ); + placementtag moveto( targettag.origin, 0.5, 0.05, 0.05 ); + placementtag rotateto( targettag.angles, 0.5, 0.05, 0.05 ); + player enableinvulnerability(); + player openmenu( "vcs" ); + player wait_till_done_playing_vcs(); + + if ( !level.gameended ) + { + if ( isdefined( player ) ) + { + player disableinvulnerability(); + player unlink(); + player takeweapon( "vcs_controller_mp" ); + player switchtoweapon( prevweapon ); + } + + level.vcs_trigger setvisibletoall(); + } + } } -wait_till_done_playing_vcs() //checked matches cerberus output +wait_till_done_playing_vcs() { - self endon( "disconnect" ); - while ( 1 ) - { - self waittill( "menuresponse", menu, response ); - return; - } + self endon( "disconnect" ); + + while ( true ) + { + self waittill( "menuresponse", menu, response ); + + return; + } } -nuked_powerlevel_think() //checked matches cerberus output +nuked_powerlevel_think() { - pin_model = getent( "nuketown_sign_needle", "targetname" ); - pin_model thread pin_think(); + pin_model = getent( "nuketown_sign_needle", "targetname" ); + pin_model thread pin_think(); } -pin_think() //checked changed to match cerberus output +pin_think() { - self endon( "death" ); - self endon( "entityshutdown" ); - self endon( "delete" ); - startangle = 128; - normalangle = 65 + randomfloatrange( -30, 15 ); - yellowangle = -35 + randomfloatrange( -5, 5 ); - redangle = -95 + randomfloatrange( -10, 10 ); - endangle = -138; - self.angles = ( startangle, self.angles[ 1 ], self.angles[ 2 ] ); - waittillframeend; - if ( islastround() || isoneround() ) - { - if ( level.timelimit ) - { - add_timed_event( 10, "near_end_game" ); - self pin_move( yellowangle, level.timelimit * 60 ); - } - else if ( level.scorelimit ) - { - add_score_event( int( level.scorelimit * 0,9 ), "near_end_game" ); - self pin_move( normalangle, 300 ); - } - notifystr = level waittill_any_return( "near_end_game", "game_ended" ); - if ( notifystr == "near_end_game" ) - { - self pin_check_rotation( 0, 3 ); - self pin_move( redangle, 10 ); - level waittill( "game_ended" ); - } - self pin_check_rotation( 0, 2 ); - self pin_move( redangle, 2 ); - } - else if ( level.timelimit ) - { - self pin_move( normalangle, level.timelimit * 60 ); - } - else - { - self pin_move( normalangle, 300 ); - } - level waittill( "nuke_detonation" ); - self pin_check_rotation( 0, 0.05 ); - self pin_move( endangle, 0,1 ); + self endon( "death" ); + self endon( "entityshutdown" ); + self endon( "delete" ); + startangle = 128; + normalangle = 65 + randomfloatrange( -30, 15 ); + yellowangle = -35 + randomfloatrange( -5, 5 ); + redangle = -95 + randomfloatrange( -10, 10 ); + endangle = -138; + self.angles = ( startangle, self.angles[1], self.angles[2] ); + waittillframeend; + + if ( islastround() || isoneround() ) + { + if ( level.timelimit ) + { + add_timed_event( 10, "near_end_game" ); + self pin_move( yellowangle, level.timelimit * 60 ); + } + else if ( level.scorelimit ) + { + add_score_event( int( level.scorelimit * 0.9 ), "near_end_game" ); + self pin_move( normalangle, 300 ); + } + + notifystr = level waittill_any_return( "near_end_game", "game_ended" ); + + if ( notifystr == "near_end_game" ) + { + self pin_check_rotation( 0, 3 ); + self pin_move( redangle, 10 ); + + level waittill( "game_ended" ); + } + + self pin_check_rotation( 0, 2 ); + self pin_move( redangle, 2 ); + } + else if ( level.timelimit ) + self pin_move( normalangle, level.timelimit * 60 ); + else + self pin_move( normalangle, 300 ); + + level waittill( "nuke_detonation" ); + + self pin_check_rotation( 0, 0.05 ); + self pin_move( endangle, 0.1 ); } -pin_move( angle, time ) //checked matches cerberus output +pin_move( angle, time ) { - angles = ( angle, self.angles[ 1 ], self.angles[ 2 ] ); - self rotateto( angles, time ); + angles = ( angle, self.angles[1], self.angles[2] ); + self rotateto( angles, time ); } -pin_check_rotation( angle, time ) //checked matches cerberus output +pin_check_rotation( angle, time ) { - if ( self.angles[ 0 ] > angle ) - { - self pin_move( angle, time ); - self waittill( "rotatedone" ); - } -} + if ( self.angles[0] > angle ) + { + self pin_move( angle, time ); + self waittill( "rotatedone" ); + } +} diff --git a/Multiplayer Core/patch_mp/maps/mp/mp_overflow.gsc b/Multiplayer Core/patch_mp/maps/mp/mp_overflow.gsc index 6de9288..8b5cb76 100644 --- a/Multiplayer Core/patch_mp/maps/mp/mp_overflow.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/mp_overflow.gsc @@ -1,167 +1,161 @@ -//checked includes changed to match cerberus output -#include maps/mp/_compass; -#include maps/mp/mp_overflow_amb; -#include maps/mp/_load; -#include maps/mp/mp_overflow_fx; -#include maps/mp/_utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\_utility; +#include maps\mp\mp_overflow_fx; +#include maps\mp\_load; +#include maps\mp\mp_overflow_amb; +#include maps\mp\_compass; - -main() //checked changed to match cerberus output +main() { - level.levelspawndvars = ::levelspawndvars; - maps/mp/mp_overflow_fx::main(); - precachemodel( "collision_physics_128x128x10" ); - precachemodel( "collision_physics_256x256x10" ); - precachemodel( "collision_physics_512x512x10" ); - precachemodel( "collision_physics_128x128x128" ); - precachemodel( "collision_physics_64x64x64" ); - precachemodel( "collision_physics_32x32x32" ); - precachemodel( "collision_physics_cylinder_32x128" ); - precachemodel( "collision_physics_wall_64x64x10" ); - precachemodel( "collision_clip_wall_128x128x10" ); - precachemodel( "intro_construction_scaffold_woodplanks_03" ); - precachemodel( "intro_construction_scaffold_woodplanks_05" ); - precachemodel( "afr_corrugated_metal4x4_holes" ); - precachemodel( "p_rus_rollup_door_40" ); - precachemodel( "p_rus_rollup_door_136" ); - precachemodel( "com_wallchunk_boardmedium01" ); - maps/mp/_load::main(); - maps/mp/mp_overflow_amb::main(); - maps/mp/_compass::setupminimap( "compass_map_mp_overflow" ); - level.overrideplayerdeathwatchtimer = ::leveloverridetime; - level.useintermissionpointsonwavespawn = ::useintermissionpointsonwavespawn; - game[ "strings" ][ "war_callsign_a" ] = &"MPUI_CALLSIGN_MAPNAME_A"; - game[ "strings" ][ "war_callsign_b" ] = &"MPUI_CALLSIGN_MAPNAME_B"; - game[ "strings" ][ "war_callsign_c" ] = &"MPUI_CALLSIGN_MAPNAME_C"; - game[ "strings" ][ "war_callsign_d" ] = &"MPUI_CALLSIGN_MAPNAME_D"; - game[ "strings" ][ "war_callsign_e" ] = &"MPUI_CALLSIGN_MAPNAME_E"; - game[ "strings_menu" ][ "war_callsign_a" ] = "@MPUI_CALLSIGN_MAPNAME_A"; - game[ "strings_menu" ][ "war_callsign_b" ] = "@MPUI_CALLSIGN_MAPNAME_B"; - game[ "strings_menu" ][ "war_callsign_c" ] = "@MPUI_CALLSIGN_MAPNAME_C"; - game[ "strings_menu" ][ "war_callsign_d" ] = "@MPUI_CALLSIGN_MAPNAME_D"; - game[ "strings_menu" ][ "war_callsign_e" ] = "@MPUI_CALLSIGN_MAPNAME_E"; - spawncollision( "collision_physics_128x128x10", "collider", ( -1248, -32, 285 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_128x128x10", "collider", ( -1248, 96, 285 ), ( 0, 0, 0 ) ); - plank1 = spawn( "script_model", ( -1229.09, 9.85, 289.2 ) ); - plank1.angles = ( 271, 331.6, 180 ); - plank2 = spawn( "script_model", ( -1244.92, 36.81, 288.2 ) ); - plank2.angles = ( 270, 138.6, -104 ); - plank3 = spawn( "script_model", ( -1249.94, 93.83, 288.2 ) ); - plank3.angles = ( 270, 138.6, -128 ); - plank1 setmodel( "intro_construction_scaffold_woodplanks_03" ); - plank2 setmodel( "intro_construction_scaffold_woodplanks_05" ); - plank3 setmodel( "intro_construction_scaffold_woodplanks_05" ); - spawncollision( "collision_physics_128x128x10", "collider", ( -1252, -199, 283 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_128x128x10", "collider", ( -1252, 376, 283 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_128x128x128", "collider", ( -158, -592, 675 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_128x128x10", "collider", ( -2838, -1502, 49 ), ( 1.98509, 344.156, -96.0042 ) ); - spawncollision( "collision_physics_128x128x10", "collider", ( -2917, -1480, 52 ), ( 1.98509, 344.156, -96.0042 ) ); - spawncollision( "collision_physics_cylinder_32x128", "collider", ( 431, -1160, 124 ), vectorScale( ( 0, 0, 1 ), 51 ) ); - spawncollision( "collision_physics_cylinder_32x128", "collider", ( 431, -1287, 124 ), ( 0, 180, 51 ) ); - spawncollision( "collision_physics_cylinder_32x128", "collider", ( -1603, 1133, 135 ), ( 0, 180, 51 ) ); - spawncollision( "collision_physics_cylinder_32x128", "collider", ( -1603, 1260, 135 ), vectorScale( ( 0, 0, 1 ), 51 ) ); - spawncollision( "collision_physics_32x32x32", "collider", ( -1602, 1115, 161 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_32x32x32", "collider", ( -1602, 1276, 161 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_64x64x64", "collider", ( -119, -752, 436 ), ( 0, 0, 0 ) ); - metalpiece = spawn( "script_model", ( -121, -757, 467 ) ); - metalpiece.angles = vectorScale( ( 0, 0, -1 ), 90 ); - metalpiece setmodel( "afr_corrugated_metal4x4_holes" ); - metalpiece2 = spawn( "script_model", ( -144, -856, 408 ) ); - metalpiece2 setmodel( "p_rus_rollup_door_136" ); - metalpiece3 = spawn( "script_model", ( -144, -997, 408 ) ); - metalpiece3 setmodel( "p_rus_rollup_door_136" ); - metalpiece4 = spawn( "script_model", ( -144, -1077, 408 ) ); - metalpiece4 setmodel( "p_rus_rollup_door_40" ); - board1 = spawn( "script_model", ( -119, -783, 408 ) ); - board1.angles = vectorScale( ( 0, 1, 0 ), 270 ); - board1 setmodel( "com_wallchunk_boardmedium01" ); - board2 = spawn( "script_model", ( -89, -749, 408 ) ); - board2 setmodel( "com_wallchunk_boardmedium01" ); - spawncollision( "collision_physics_64x64x64", "collider", ( -699, -1267, -19 ), ( 0, 0, 1 ) ); - spawncollision( "collision_physics_32x32x32", "collider", ( -683, -1219, -19 ), ( 0, 0, 1 ) ); - spawncollision( "collision_physics_32x32x32", "collider", ( -683, -1162, -24 ), ( 0, 0, 1 ) ); - spawncollision( "collision_physics_wall_512x512x10", "collider", ( -1746, 1555, -213 ), vectorScale( ( 0, 1, 0 ), 270 ) ); - spawncollision( "collision_physics_wall_256x256x10", "collider", ( -1658, 1899, -93 ), vectorScale( ( 0, 1, 0 ), 225.6 ) ); - spawncollision( "collision_physics_wall_256x256x10", "collider", ( -1570, 1989, -93 ), vectorScale( ( 0, 1, 0 ), 225.6 ) ); - spawncollision( "collision_physics_32x32x32", "collider", ( 1375, -737, 81.5 ), vectorScale( ( 0, 1, 0 ), 327.3 ) ); - level.levelkillbrushes = []; - level.levelkillbrushes[ level.levelkillbrushes.size ] = spawn( "trigger_radius", ( -2817, 2226.5, -271 ), 0, 1722, 128 ); - level.levelkillbrushes[ level.levelkillbrushes.size ] = spawn( "trigger_radius", ( -3620, 270.5, -266.5 ), 0, 1176, 128 ); - level.levelkillbrushes[ level.levelkillbrushes.size ] = spawn( "trigger_radius", ( -3335, -1775.5, -266.5 ), 0, 1293, 128 ); - level.levelkillbrushes[ level.levelkillbrushes.size ] = spawn( "trigger_radius", ( -2351, -3384.5, -255.5 ), 0, 1293, 128 ); - spawncollision( "collision_physics_128x128x10", "collider", ( -1171.5, 512, 67 ), vectorScale( ( 0, 0, -1 ), 22.1 ) ); - spawncollision( "collision_physics_wall_64x64x10", "collider", ( 918, -728, 312 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_wall_64x64x10", "collider", ( 1962, -1303, 10.5 ), vectorScale( ( 0, 1, 0 ), 45.2 ) ); - setheliheightpatchenabled( "war_mode_heli_height_lock", 0 ); - level thread water_trigger_init(); - level.remotemotarviewup = 13; + level.levelspawndvars = ::levelspawndvars; + maps\mp\mp_overflow_fx::main(); + precachemodel( "collision_physics_128x128x10" ); + precachemodel( "collision_physics_256x256x10" ); + precachemodel( "collision_physics_512x512x10" ); + precachemodel( "collision_physics_128x128x128" ); + precachemodel( "collision_physics_64x64x64" ); + precachemodel( "collision_physics_32x32x32" ); + precachemodel( "collision_physics_cylinder_32x128" ); + precachemodel( "collision_physics_wall_64x64x10" ); + precachemodel( "collision_clip_wall_128x128x10" ); + precachemodel( "intro_construction_scaffold_woodplanks_03" ); + precachemodel( "intro_construction_scaffold_woodplanks_05" ); + precachemodel( "afr_corrugated_metal4x4_holes" ); + precachemodel( "p_rus_rollup_door_40" ); + precachemodel( "p_rus_rollup_door_136" ); + precachemodel( "com_wallchunk_boardmedium01" ); + maps\mp\_load::main(); + maps\mp\mp_overflow_amb::main(); + maps\mp\_compass::setupminimap( "compass_map_mp_overflow" ); + level.overrideplayerdeathwatchtimer = ::leveloverridetime; + level.useintermissionpointsonwavespawn = ::useintermissionpointsonwavespawn; + game["strings"]["war_callsign_a"] = &"MPUI_CALLSIGN_MAPNAME_A"; + game["strings"]["war_callsign_b"] = &"MPUI_CALLSIGN_MAPNAME_B"; + game["strings"]["war_callsign_c"] = &"MPUI_CALLSIGN_MAPNAME_C"; + game["strings"]["war_callsign_d"] = &"MPUI_CALLSIGN_MAPNAME_D"; + game["strings"]["war_callsign_e"] = &"MPUI_CALLSIGN_MAPNAME_E"; + game["strings_menu"]["war_callsign_a"] = "@MPUI_CALLSIGN_MAPNAME_A"; + game["strings_menu"]["war_callsign_b"] = "@MPUI_CALLSIGN_MAPNAME_B"; + game["strings_menu"]["war_callsign_c"] = "@MPUI_CALLSIGN_MAPNAME_C"; + game["strings_menu"]["war_callsign_d"] = "@MPUI_CALLSIGN_MAPNAME_D"; + game["strings_menu"]["war_callsign_e"] = "@MPUI_CALLSIGN_MAPNAME_E"; + spawncollision( "collision_physics_128x128x10", "collider", ( -1248, -32, 285 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_128x128x10", "collider", ( -1248, 96, 285 ), ( 0, 0, 0 ) ); + plank1 = spawn( "script_model", ( -1229.09, 9.85, 289.2 ) ); + plank1.angles = ( 271, 331.6, 180 ); + plank2 = spawn( "script_model", ( -1244.92, 36.81, 288.2 ) ); + plank2.angles = ( 270, 138.6, -104 ); + plank3 = spawn( "script_model", ( -1249.94, 93.83, 288.2 ) ); + plank3.angles = ( 270, 138.6, -128 ); + plank1 setmodel( "intro_construction_scaffold_woodplanks_03" ); + plank2 setmodel( "intro_construction_scaffold_woodplanks_05" ); + plank3 setmodel( "intro_construction_scaffold_woodplanks_05" ); + spawncollision( "collision_physics_128x128x10", "collider", ( -1252, -199, 283 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_128x128x10", "collider", ( -1252, 376, 283 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_128x128x128", "collider", ( -158, -592, 675 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_128x128x10", "collider", ( -2838, -1502, 49 ), ( 1.98509, 344.156, -96.0042 ) ); + spawncollision( "collision_physics_128x128x10", "collider", ( -2917, -1480, 52 ), ( 1.98509, 344.156, -96.0042 ) ); + spawncollision( "collision_physics_cylinder_32x128", "collider", ( 431, -1160, 124 ), vectorscale( ( 0, 0, 1 ), 51.0 ) ); + spawncollision( "collision_physics_cylinder_32x128", "collider", ( 431, -1287, 124 ), ( 0, 180, 51 ) ); + spawncollision( "collision_physics_cylinder_32x128", "collider", ( -1603, 1133, 135 ), ( 0, 180, 51 ) ); + spawncollision( "collision_physics_cylinder_32x128", "collider", ( -1603, 1260, 135 ), vectorscale( ( 0, 0, 1 ), 51.0 ) ); + spawncollision( "collision_physics_32x32x32", "collider", ( -1602, 1115, 161 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_32x32x32", "collider", ( -1602, 1276, 161 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_64x64x64", "collider", ( -119, -752, 436 ), ( 0, 0, 0 ) ); + metalpiece = spawn( "script_model", ( -121, -757, 467 ) ); + metalpiece.angles = vectorscale( ( 0, 0, -1 ), 90.0 ); + metalpiece setmodel( "afr_corrugated_metal4x4_holes" ); + metalpiece2 = spawn( "script_model", ( -144, -856, 408 ) ); + metalpiece2 setmodel( "p_rus_rollup_door_136" ); + metalpiece3 = spawn( "script_model", ( -144, -997, 408 ) ); + metalpiece3 setmodel( "p_rus_rollup_door_136" ); + metalpiece4 = spawn( "script_model", ( -144, -1077, 408 ) ); + metalpiece4 setmodel( "p_rus_rollup_door_40" ); + board1 = spawn( "script_model", ( -119, -783, 408 ) ); + board1.angles = vectorscale( ( 0, 1, 0 ), 270.0 ); + board1 setmodel( "com_wallchunk_boardmedium01" ); + board2 = spawn( "script_model", ( -89, -749, 408 ) ); + board2 setmodel( "com_wallchunk_boardmedium01" ); + spawncollision( "collision_physics_64x64x64", "collider", ( -699, -1267, -19 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_32x32x32", "collider", ( -683, -1219, -19 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_32x32x32", "collider", ( -683, -1162, -24 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_wall_512x512x10", "collider", ( -1746, 1555, -213 ), vectorscale( ( 0, 1, 0 ), 270.0 ) ); + spawncollision( "collision_physics_wall_256x256x10", "collider", ( -1658, 1899, -93 ), vectorscale( ( 0, 1, 0 ), 225.6 ) ); + spawncollision( "collision_physics_wall_256x256x10", "collider", ( -1570, 1989, -93 ), vectorscale( ( 0, 1, 0 ), 225.6 ) ); + spawncollision( "collision_physics_32x32x32", "collider", ( 1375, -737, 81.5 ), vectorscale( ( 0, 1, 0 ), 327.3 ) ); + level.levelkillbrushes = []; + level.levelkillbrushes[level.levelkillbrushes.size] = spawn( "trigger_radius", ( -2817, 2226.5, -271 ), 0, 1722, 128 ); + level.levelkillbrushes[level.levelkillbrushes.size] = spawn( "trigger_radius", ( -3620, 270.5, -266.5 ), 0, 1176, 128 ); + level.levelkillbrushes[level.levelkillbrushes.size] = spawn( "trigger_radius", ( -3335, -1775.5, -266.5 ), 0, 1293, 128 ); + level.levelkillbrushes[level.levelkillbrushes.size] = spawn( "trigger_radius", ( -2351, -3384.5, -255.5 ), 0, 1293, 128 ); + spawncollision( "collision_physics_128x128x10", "collider", ( -1171.5, 512, 67 ), vectorscale( ( 0, 0, -1 ), 22.1 ) ); + spawncollision( "collision_physics_wall_64x64x10", "collider", ( 918, -728, 312 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_wall_64x64x10", "collider", ( 1962, -1303, 10.5 ), vectorscale( ( 0, 1, 0 ), 45.2 ) ); + setheliheightpatchenabled( "war_mode_heli_height_lock", 0 ); + level thread water_trigger_init(); + level.remotemotarviewup = 13; } -levelspawndvars( reset_dvars ) //checked matches cerberus output +levelspawndvars( reset_dvars ) { - ss = level.spawnsystem; - ss.enemy_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_radius", "2300", reset_dvars ); + ss = level.spawnsystem; + ss.enemy_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_radius", "2300", reset_dvars ); } -water_trigger_init() //checked partially changed to match cerberus output see info.md +water_trigger_init() { - wait 3; - triggers = getentarray( "trigger_hurt", "classname" ); - foreach ( trigger in triggers ) - { - if ( trigger.origin[ 2 ] > level.mapcenter[ 2 ] ) - { - } - else - { - trigger thread water_trigger_think(); - } - } + wait 3; + triggers = getentarray( "trigger_hurt", "classname" ); + + foreach ( trigger in triggers ) + { + if ( trigger.origin[2] > level.mapcenter[2] ) + continue; + + trigger thread water_trigger_think(); + } } -water_trigger_think() //checked matches cerberus output +water_trigger_think() { - for ( ;; ) - { - self waittill( "trigger", entity ); - if ( isplayer( entity ) ) - { - entity playsound( "mpl_splash_death" ); - playfx( level._effect[ "water_splash" ], entity.origin + vectorScale( ( 0, 0, 1 ), 10 ) ); - } - } + for (;;) + { + self waittill( "trigger", entity ); + + if ( isplayer( entity ) ) + { + entity playsound( "mpl_splash_death" ); + playfx( level._effect["water_splash"], entity.origin + vectorscale( ( 0, 0, 1 ), 10.0 ) ); + } + } } -leveloverridetime( defaulttime ) //checked matches cerberus output +leveloverridetime( defaulttime ) { - if ( self isinwater() ) - { - return 0.4; - } - return defaulttime; + if ( self isinwater() ) + return 0.4; + + return defaulttime; } -useintermissionpointsonwavespawn() //checked matches cerberus output +useintermissionpointsonwavespawn() { - return self isinwater(); + return self isinwater(); } -isinwater() //checked partially changed to match cerberus output see info.md +isinwater() { - triggers = getentarray( "trigger_hurt", "classname" ); - foreach ( trigger in triggers ) - { - if ( trigger.origin[ 2 ] > level.mapcenter[ 2 ] ) - { - } - else - { - if ( self istouching( trigger ) ) - { - return 1; - } - } - } - return 0; -} + triggers = getentarray( "trigger_hurt", "classname" ); + foreach ( trigger in triggers ) + { + if ( trigger.origin[2] > level.mapcenter[2] ) + continue; + + if ( self istouching( trigger ) ) + return true; + } + + return false; +} diff --git a/Multiplayer Core/patch_mp/maps/mp/mp_paintball.gsc b/Multiplayer Core/patch_mp/maps/mp/mp_paintball.gsc index 783c24b..ccf8b37 100644 --- a/Multiplayer Core/patch_mp/maps/mp/mp_paintball.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/mp_paintball.gsc @@ -1,119 +1,123 @@ -//checked includes changed to match cerberus output -#include maps/mp/gametypes/_spawning; -#include maps/mp/_compass; -#include maps/mp/mp_paintball_amb; -#include maps/mp/_load; -#include maps/mp/mp_paintball_fx; -#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\mp_paintball_fx; +#include maps\mp\_load; +#include maps\mp\mp_paintball_amb; +#include maps\mp\_compass; +#include maps\mp\gametypes\_spawning; -main() //checked changed to match cerberus output +main() { - level.levelspawndvars = ::levelspawndvars; - maps/mp/mp_paintball_fx::main(); - precachemodel( "collision_physics_cylinder_32x128" ); - precachemodel( "collision_physics_64x64x10" ); - precachemodel( "collision_physics_32x32x10" ); - precachemodel( "collision_physics_wall_64x64x10" ); - precachemodel( "p6_pai_fence_pole" ); - maps/mp/_load::main(); - maps/mp/mp_paintball_amb::main(); - maps/mp/_compass::setupminimap( "compass_map_mp_paintball" ); - setdvar( "compassmaxrange", "2100" ); - game[ "strings" ][ "war_callsign_a" ] = &"MPUI_CALLSIGN_MAPNAME_A"; - game[ "strings" ][ "war_callsign_b" ] = &"MPUI_CALLSIGN_MAPNAME_B"; - game[ "strings" ][ "war_callsign_c" ] = &"MPUI_CALLSIGN_MAPNAME_C"; - game[ "strings" ][ "war_callsign_d" ] = &"MPUI_CALLSIGN_MAPNAME_D"; - game[ "strings" ][ "war_callsign_e" ] = &"MPUI_CALLSIGN_MAPNAME_E"; - game[ "strings_menu" ][ "war_callsign_a" ] = "@MPUI_CALLSIGN_MAPNAME_A"; - game[ "strings_menu" ][ "war_callsign_b" ] = "@MPUI_CALLSIGN_MAPNAME_B"; - game[ "strings_menu" ][ "war_callsign_c" ] = "@MPUI_CALLSIGN_MAPNAME_C"; - game[ "strings_menu" ][ "war_callsign_d" ] = "@MPUI_CALLSIGN_MAPNAME_D"; - game[ "strings_menu" ][ "war_callsign_e" ] = "@MPUI_CALLSIGN_MAPNAME_E"; - spawncollision( "collision_physics_cylinder_32x128", "collider", ( 1071.5, -1998.5, 373.5 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_cylinder_32x128", "collider", ( 1071.5, -1998.5, 262 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_cylinder_32x128", "collider", ( 1071.5, -1998.5, 150 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_cylinder_32x128", "collider", ( 1071.5, -1998.5, 37.5 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_cylinder_32x128", "collider", ( -1446.5, 524.5, 401.5 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_cylinder_32x128", "collider", ( -1446.5, 524.5, 290 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_cylinder_32x128", "collider", ( -1446.5, 524.5, 178 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_cylinder_32x128", "collider", ( -1446.5, 524.5, 65.5 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_cylinder_32x128", "collider", ( -1303.5, 1611.5, 394.5 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_cylinder_32x128", "collider", ( -1303.5, 1611.5, 283 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_cylinder_32x128", "collider", ( -1303.5, 1611.5, 171 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_cylinder_32x128", "collider", ( -1303.5, 1611.5, 58.5 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_64x64x10", "collider", ( -104.5, -1176.5, 9 ), ( 9.93, 310, 79.786 ) ); - spawncollision( "collision_physics_32x32x10", "collider", ( -105, -1166.5, 38 ), ( 317.842, 319.39, 76.1599 ) ); - spawncollision( "collision_physics_32x32x10", "collider", ( -96.5, -1173, 38.5 ), ( 310.109, 322.353, 74.0248 ) ); - spawncollision( "collision_physics_32x32x10", "collider", ( -93, -1180.5, 38.5 ), ( 310.109, 322.353, 74.0248 ) ); - spawncollision( "collision_physics_wall_64x64x10", "collider", ( -596.198, -1402, -8.43064 ), ( 359.555, 85.8235, -6.08371 ) ); - spawncollision( "collision_physics_wall_64x64x10", "collider", ( -596.198, -1370.5, -8.43064 ), ( 359.555, 85.8235, -6.08371 ) ); - spawncollision( "collision_physics_wall_64x64x10", "collider", ( -597.845, -1391, 6.9816 ), ( 359.555, 85.8235, -6.08371 ) ); - spawncollision( "collision_physics_wall_64x64x10", "collider", ( -597.845, -1370.5, 6.9816 ), ( 359.555, 85.8235, -6.08371 ) ); - spawncollision( "collision_physics_wall_64x64x10", "collider", ( -598.802, -1383, 15.9306 ), ( 359.555, 85.8235, -6.08371 ) ); - spawncollision( "collision_physics_wall_64x64x10", "collider", ( -598.8, -1383.04, 13.911 ), ( 310.532, 83.5658, -1.21727 ) ); - pole1 = spawn( "script_model", ( 385, 572.5, -39 ) ); - pole1.angles = vectorScale( ( 0, 0, 1 ), 282.6 ); - pole1 setmodel( "p6_pai_fence_pole" ); - maps/mp/gametypes/_spawning::level_use_unified_spawning( 1 ); - registerclientfield( "scriptmover", "police_car_lights", 1, 1, "int" ); - level thread destructible_lights(); - level.remotemotarviewleft = 35; - level.remotemotarviewright = 35; - level.remotemotarviewup = 18; - level thread glass_node_think(); + level.levelspawndvars = ::levelspawndvars; + maps\mp\mp_paintball_fx::main(); + precachemodel( "collision_physics_cylinder_32x128" ); + precachemodel( "collision_physics_64x64x10" ); + precachemodel( "collision_physics_32x32x10" ); + precachemodel( "collision_physics_wall_64x64x10" ); + precachemodel( "p6_pai_fence_pole" ); + maps\mp\_load::main(); + maps\mp\mp_paintball_amb::main(); + maps\mp\_compass::setupminimap( "compass_map_mp_paintball" ); + setdvar( "compassmaxrange", "2100" ); + game["strings"]["war_callsign_a"] = &"MPUI_CALLSIGN_MAPNAME_A"; + game["strings"]["war_callsign_b"] = &"MPUI_CALLSIGN_MAPNAME_B"; + game["strings"]["war_callsign_c"] = &"MPUI_CALLSIGN_MAPNAME_C"; + game["strings"]["war_callsign_d"] = &"MPUI_CALLSIGN_MAPNAME_D"; + game["strings"]["war_callsign_e"] = &"MPUI_CALLSIGN_MAPNAME_E"; + game["strings_menu"]["war_callsign_a"] = "@MPUI_CALLSIGN_MAPNAME_A"; + game["strings_menu"]["war_callsign_b"] = "@MPUI_CALLSIGN_MAPNAME_B"; + game["strings_menu"]["war_callsign_c"] = "@MPUI_CALLSIGN_MAPNAME_C"; + game["strings_menu"]["war_callsign_d"] = "@MPUI_CALLSIGN_MAPNAME_D"; + game["strings_menu"]["war_callsign_e"] = "@MPUI_CALLSIGN_MAPNAME_E"; + spawncollision( "collision_physics_cylinder_32x128", "collider", ( 1071.5, -1998.5, 373.5 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_cylinder_32x128", "collider", ( 1071.5, -1998.5, 262 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_cylinder_32x128", "collider", ( 1071.5, -1998.5, 150 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_cylinder_32x128", "collider", ( 1071.5, -1998.5, 37.5 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_cylinder_32x128", "collider", ( -1446.5, 524.5, 401.5 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_cylinder_32x128", "collider", ( -1446.5, 524.5, 290 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_cylinder_32x128", "collider", ( -1446.5, 524.5, 178 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_cylinder_32x128", "collider", ( -1446.5, 524.5, 65.5 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_cylinder_32x128", "collider", ( -1303.5, 1611.5, 394.5 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_cylinder_32x128", "collider", ( -1303.5, 1611.5, 283 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_cylinder_32x128", "collider", ( -1303.5, 1611.5, 171 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_cylinder_32x128", "collider", ( -1303.5, 1611.5, 58.5 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_64x64x10", "collider", ( -104.5, -1176.5, 9 ), ( 9.93, 310, 79.786 ) ); + spawncollision( "collision_physics_32x32x10", "collider", ( -105, -1166.5, 38 ), ( 317.842, 319.39, 76.1599 ) ); + spawncollision( "collision_physics_32x32x10", "collider", ( -96.5, -1173, 38.5 ), ( 310.109, 322.353, 74.0248 ) ); + spawncollision( "collision_physics_32x32x10", "collider", ( -93, -1180.5, 38.5 ), ( 310.109, 322.353, 74.0248 ) ); + spawncollision( "collision_physics_wall_64x64x10", "collider", ( -596.198, -1402, -8.43064 ), ( 359.555, 85.8235, -6.08371 ) ); + spawncollision( "collision_physics_wall_64x64x10", "collider", ( -596.198, -1370.5, -8.43064 ), ( 359.555, 85.8235, -6.08371 ) ); + spawncollision( "collision_physics_wall_64x64x10", "collider", ( -597.845, -1391, 6.9816 ), ( 359.555, 85.8235, -6.08371 ) ); + spawncollision( "collision_physics_wall_64x64x10", "collider", ( -597.845, -1370.5, 6.9816 ), ( 359.555, 85.8235, -6.08371 ) ); + spawncollision( "collision_physics_wall_64x64x10", "collider", ( -598.802, -1383, 15.9306 ), ( 359.555, 85.8235, -6.08371 ) ); + spawncollision( "collision_physics_wall_64x64x10", "collider", ( -598.8, -1383.04, 13.911 ), ( 310.532, 83.5658, -1.21727 ) ); + pole1 = spawn( "script_model", ( 385, 572.5, -39 ) ); + pole1.angles = vectorscale( ( 0, 1, 0 ), 282.6 ); + pole1 setmodel( "p6_pai_fence_pole" ); + maps\mp\gametypes\_spawning::level_use_unified_spawning( 1 ); + registerclientfield( "scriptmover", "police_car_lights", 1, 1, "int" ); + level thread destructible_lights(); + level.remotemotarviewleft = 35; + level.remotemotarviewright = 35; + level.remotemotarviewup = 18; + level thread glass_node_think(); } -levelspawndvars( reset_dvars ) //checked matches cerberus output +levelspawndvars( reset_dvars ) { - ss = level.spawnsystem; - ss.enemy_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_radius", "2200", reset_dvars ); - ss.hq_objective_influencer_inner_radius = set_dvar_float_if_unset( "scr_spawn_hq_objective_influencer_inner_radius", "1200", reset_dvars ); + ss = level.spawnsystem; + ss.enemy_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_radius", "2200", reset_dvars ); + ss.hq_objective_influencer_inner_radius = set_dvar_float_if_unset( "scr_spawn_hq_objective_influencer_inner_radius", "1200", reset_dvars ); } -destructible_lights() //checked changed to match cerberus output +destructible_lights() { - wait 0.05; - destructibles = getentarray( "destructible", "targetname" ); - foreach ( destructible in destructibles ) - { - if ( destructible.destructibledef == "veh_t6_police_car_destructible_mp" ) - { - destructible thread destructible_think( "police_car_lights" ); - destructible setclientfield( "police_car_lights", 1 ); - } - } + wait 0.05; + destructibles = getentarray( "destructible", "targetname" ); + + foreach ( destructible in destructibles ) + { + if ( destructible.destructibledef == "veh_t6_police_car_destructible_mp" ) + { + destructible thread destructible_think( "police_car_lights" ); + destructible setclientfield( "police_car_lights", 1 ); + } + } } -destructible_think( clientfield ) //checked matches cerberus output +destructible_think( clientfield ) { - self waittill_any( "death", "destructible_base_piece_death" ); - self setclientfield( clientfield, 0 ); + self waittill_any( "death", "destructible_base_piece_death" ); + self setclientfield( clientfield, 0 ); } -glass_node_think() //checked changed to match cerberus output +glass_node_think() { - wait 1; - glass_origin = ( -980.028, -959.375, 60.1195 ); - node_origin = ( -981.75, -934.5, 16 ); - node = getnearestnode( node_origin ); - if ( isDefined( node ) && node.type == "Begin" ) - { - ent = spawn( "script_model", node.origin, 1 ); - ent setmodel( level.deployedshieldmodel ); - ent hide(); - ent disconnectpaths(); - ent.origin -= vectorScale( ( 0, 0, 1 ), 64 ); - for ( ;; ) - { - level waittill( "glass_smash", origin ); - if ( distancesquared( origin, glass_origin ) < 16384 ) - { - ent.origin += vectorScale( ( 0, 0, 1 ), 64 ); - ent delete(); - return; - } - } - } -} + wait 1; + glass_origin = ( -980.028, -959.375, 60.1195 ); + node_origin = ( -981.75, -934.5, 16.0 ); + node = getnearestnode( node_origin ); + if ( isdefined( node ) && node.type == "Begin" ) + { + ent = spawn( "script_model", node.origin, 1 ); + ent setmodel( level.deployedshieldmodel ); + ent hide(); + ent disconnectpaths(); + ent.origin -= vectorscale( ( 0, 0, 1 ), 64.0 ); + + for (;;) + { + level waittill( "glass_smash", origin ); + + if ( distancesquared( origin, glass_origin ) < 16384 ) + { + ent.origin += vectorscale( ( 0, 0, 1 ), 64.0 ); + ent delete(); + return; + } + } + } +} diff --git a/Multiplayer Core/patch_mp/maps/mp/mp_pod.gsc b/Multiplayer Core/patch_mp/maps/mp/mp_pod.gsc index 4ac9226..51e91ae 100644 --- a/Multiplayer Core/patch_mp/maps/mp/mp_pod.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/mp_pod.gsc @@ -1,78 +1,76 @@ -//checked includes changed to match cerberus output -#include maps/mp/gametypes/_spawning; -#include maps/mp/_compass; -#include maps/mp/mp_pod_amb; -#include maps/mp/_load; -#include maps/mp/mp_pod_fx; -#include maps/mp/_utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\_utility; +#include maps\mp\mp_pod_fx; +#include maps\mp\_load; +#include maps\mp\mp_pod_amb; +#include maps\mp\_compass; +#include maps\mp\gametypes\_spawning; -main() //checked changed to match cerberus output +main() { - level.levelspawndvars = ::levelspawndvars; - maps/mp/mp_pod_fx::main(); - precachemodel( "p_rus_door_white_frame_double" ); - precachemodel( "p6_pak_old_plywood" ); - precachemodel( "collision_clip_wall_32x32x10" ); - precachemodel( "collision_physics_wall_32x32x10" ); - precachemodel( "collision_physics_wall_128x128x10" ); - precachemodel( "collision_physics_wall_256x256x10" ); - precachemodel( "collision_physics_256x256x10" ); - precachemodel( "collision_missile_128x128x10" ); - precachemodel( "collision_clip_wall_64x64x10" ); - precachemodel( "collision_physics_256x256x256" ); - maps/mp/_load::main(); - maps/mp/mp_pod_amb::main(); - maps/mp/_compass::setupminimap( "compass_map_mp_pod" ); - prop1 = spawn( "script_model", ( 517.264, -627.226, 323 ) ); - prop1.angles = vectorScale( ( 0, 1, 0 ), 116,6 ); - prop1 setmodel( "p_rus_door_white_frame_double" ); - prop2 = spawn( "script_model", ( 62.1517, -1647.78, 481.602 ) ); - prop2.angles = vectorScale( ( 0, 1, 0 ), 35,2 ); - prop2 setmodel( "p6_pak_old_plywood" ); - prop3 = spawn( "script_model", ( 25.9997, -1673.49, 479.903 ) ); - prop3.angles = vectorScale( ( 0, 1, 0 ), 35.2 ); - prop3 setmodel( "p6_pak_old_plywood" ); - spawncollision( "collision_clip_wall_32x32x10", "collider", ( -1725, 2300, 514 ), ( 0, 0, 0 ) ); - spawncollision( "collision_clip_wall_32x32x10", "collider", ( -473, -2482, 412 ), vectorScale( ( 0, 0, 1 ), 14 ) ); - spawncollision( "collision_physics_wall_32x32x10", "collider", ( -473, -2482, 412 ), vectorScale( ( 0, 0, 1 ), 14 ) ); - spawncollision( "collision_physics_wall_128x128x10", "collider", ( -87, -1470.5, 751.5 ), vectorScale( ( 0, 1, 0 ), 34.2 ) ); - spawncollision( "collision_physics_256x256x10", "collider", ( 1287.5, -2468, 315 ), vectorScale( ( 0, 0, 1 ), 18,1 ) ); - spawncollision( "collision_physics_256x256x10", "collider", ( 1047.5, -2468, 315 ), vectorScale( ( 0, 0, 1 ), 18,1 ) ); - spawncollision( "collision_physics_256x256x10", "collider", ( 1047.5, -2627.5, 165.5 ), vectorScale( ( 0, 0, 1 ), 64.1 ) ); - spawncollision( "collision_missile_128x128x10", "collider", ( -911.5, -653, 496 ), ( 273, 45.0999, 90 ) ); - spawncollision( "collision_clip_wall_64x64x10", "collider", ( 1356, 50, 358 ), ( 5.64745, 114.9, 6 ) ); - spawncollision( "collision_clip_wall_64x64x10", "collider", ( 1364, 32, 349 ), ( 1.3883, 292.6, -4 ) ); - spawncollision( "collision_clip_wall_64x64x10", "collider", ( 1423, -127, 349 ), ( 1.3883, 285.8, -4 ) ); - spawncollision( "collision_physics_256x256x256", "collider", ( 1218, -2232, 244 ), vectorScale( ( 0, 1, 0 ), 30 ) ); - setdvar( "compassmaxrange", "2100" ); - game[ "strings" ][ "war_callsign_a" ] = &"MPUI_CALLSIGN_MAPNAME_A"; - game[ "strings" ][ "war_callsign_b" ] = &"MPUI_CALLSIGN_MAPNAME_B"; - game[ "strings" ][ "war_callsign_c" ] = &"MPUI_CALLSIGN_MAPNAME_C"; - game[ "strings" ][ "war_callsign_d" ] = &"MPUI_CALLSIGN_MAPNAME_D"; - game[ "strings" ][ "war_callsign_e" ] = &"MPUI_CALLSIGN_MAPNAME_E"; - game[ "strings_menu" ][ "war_callsign_a" ] = "@MPUI_CALLSIGN_MAPNAME_A"; - game[ "strings_menu" ][ "war_callsign_b" ] = "@MPUI_CALLSIGN_MAPNAME_B"; - game[ "strings_menu" ][ "war_callsign_c" ] = "@MPUI_CALLSIGN_MAPNAME_C"; - game[ "strings_menu" ][ "war_callsign_d" ] = "@MPUI_CALLSIGN_MAPNAME_D"; - game[ "strings_menu" ][ "war_callsign_e" ] = "@MPUI_CALLSIGN_MAPNAME_E"; - maps/mp/gametypes/_spawning::level_use_unified_spawning( 1 ); - level thread killstreak_init(); + level.levelspawndvars = ::levelspawndvars; + maps\mp\mp_pod_fx::main(); + precachemodel( "p_rus_door_white_frame_double" ); + precachemodel( "p6_pak_old_plywood" ); + precachemodel( "collision_clip_wall_32x32x10" ); + precachemodel( "collision_physics_wall_32x32x10" ); + precachemodel( "collision_physics_wall_128x128x10" ); + precachemodel( "collision_physics_wall_256x256x10" ); + precachemodel( "collision_physics_256x256x10" ); + precachemodel( "collision_missile_128x128x10" ); + precachemodel( "collision_clip_wall_64x64x10" ); + precachemodel( "collision_physics_256x256x256" ); + maps\mp\_load::main(); + maps\mp\mp_pod_amb::main(); + maps\mp\_compass::setupminimap( "compass_map_mp_pod" ); + prop1 = spawn( "script_model", ( 517.264, -627.226, 323 ) ); + prop1.angles = vectorscale( ( 0, 1, 0 ), 116.6 ); + prop1 setmodel( "p_rus_door_white_frame_double" ); + prop2 = spawn( "script_model", ( 62.1517, -1647.78, 481.602 ) ); + prop2.angles = vectorscale( ( 0, 1, 0 ), 35.2 ); + prop2 setmodel( "p6_pak_old_plywood" ); + prop3 = spawn( "script_model", ( 25.9997, -1673.49, 479.903 ) ); + prop3.angles = vectorscale( ( 0, 1, 0 ), 35.2 ); + prop3 setmodel( "p6_pak_old_plywood" ); + spawncollision( "collision_clip_wall_32x32x10", "collider", ( -1725, 2300, 514 ), ( 0, 0, 0 ) ); + spawncollision( "collision_clip_wall_32x32x10", "collider", ( -473, -2482, 412 ), vectorscale( ( 0, 0, 1 ), 14.0 ) ); + spawncollision( "collision_physics_wall_32x32x10", "collider", ( -473, -2482, 412 ), vectorscale( ( 0, 0, 1 ), 14.0 ) ); + spawncollision( "collision_physics_wall_128x128x10", "collider", ( -87, -1470.5, 751.5 ), vectorscale( ( 0, 1, 0 ), 34.2 ) ); + spawncollision( "collision_physics_256x256x10", "collider", ( 1287.5, -2468, 315 ), vectorscale( ( 0, 0, 1 ), 18.1 ) ); + spawncollision( "collision_physics_256x256x10", "collider", ( 1047.5, -2468, 315 ), vectorscale( ( 0, 0, 1 ), 18.1 ) ); + spawncollision( "collision_physics_256x256x10", "collider", ( 1047.5, -2627.5, 165.5 ), vectorscale( ( 0, 0, 1 ), 64.1 ) ); + spawncollision( "collision_missile_128x128x10", "collider", ( -911.5, -653, 496 ), ( 273, 45.0999, 90 ) ); + spawncollision( "collision_clip_wall_64x64x10", "collider", ( 1356, 50, 358 ), ( 5.64745, 114.9, 6 ) ); + spawncollision( "collision_clip_wall_64x64x10", "collider", ( 1364, 32, 349 ), ( 1.3883, 292.6, -4 ) ); + spawncollision( "collision_clip_wall_64x64x10", "collider", ( 1423, -127, 349 ), ( 1.3883, 285.8, -4 ) ); + spawncollision( "collision_physics_256x256x256", "collider", ( 1218, -2232, 244 ), vectorscale( ( 0, 1, 0 ), 30.0 ) ); + setdvar( "compassmaxrange", "2100" ); + game["strings"]["war_callsign_a"] = &"MPUI_CALLSIGN_MAPNAME_A"; + game["strings"]["war_callsign_b"] = &"MPUI_CALLSIGN_MAPNAME_B"; + game["strings"]["war_callsign_c"] = &"MPUI_CALLSIGN_MAPNAME_C"; + game["strings"]["war_callsign_d"] = &"MPUI_CALLSIGN_MAPNAME_D"; + game["strings"]["war_callsign_e"] = &"MPUI_CALLSIGN_MAPNAME_E"; + game["strings_menu"]["war_callsign_a"] = "@MPUI_CALLSIGN_MAPNAME_A"; + game["strings_menu"]["war_callsign_b"] = "@MPUI_CALLSIGN_MAPNAME_B"; + game["strings_menu"]["war_callsign_c"] = "@MPUI_CALLSIGN_MAPNAME_C"; + game["strings_menu"]["war_callsign_d"] = "@MPUI_CALLSIGN_MAPNAME_D"; + game["strings_menu"]["war_callsign_e"] = "@MPUI_CALLSIGN_MAPNAME_E"; + maps\mp\gametypes\_spawning::level_use_unified_spawning( 1 ); + level thread killstreak_init(); } -levelspawndvars( reset_dvars ) //checked matches cerberus output +levelspawndvars( reset_dvars ) { - ss = level.spawnsystem; - ss.enemy_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_radius", "2400", reset_dvars ); - ss.hq_objective_influencer_inner_radius = set_dvar_float_if_unset( "scr_spawn_hq_objective_influencer_inner_radius", "1000", reset_dvars ); + ss = level.spawnsystem; + ss.enemy_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_radius", "2400", reset_dvars ); + ss.hq_objective_influencer_inner_radius = set_dvar_float_if_unset( "scr_spawn_hq_objective_influencer_inner_radius", "1000", reset_dvars ); } -killstreak_init() //checked matches cerberus output +killstreak_init() { - while ( !isDefined( level.missile_swarm_flyheight ) ) - { - wait 1; - } - level.missile_swarm_flyheight = 6000; + while ( !isdefined( level.missile_swarm_flyheight ) ) + wait 1; + + level.missile_swarm_flyheight = 6000; } - - diff --git a/Multiplayer Core/patch_mp/maps/mp/mp_raid.gsc b/Multiplayer Core/patch_mp/maps/mp/mp_raid.gsc index 7a60f84..f5aebf6 100644 --- a/Multiplayer Core/patch_mp/maps/mp/mp_raid.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/mp_raid.gsc @@ -1,92 +1,90 @@ -//checked includes changed to match cerberus output -#include maps/mp/_compass; -#include maps/mp/mp_raid_amb; -#include maps/mp/_load; -#include maps/mp/mp_raid_fx; -#include maps/mp/_utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\_utility; +#include maps\mp\mp_raid_fx; +#include maps\mp\_load; +#include maps\mp\mp_raid_amb; +#include maps\mp\_compass; -main() //checked changed to match cerberus output +main() { - level.levelspawndvars = ::levelspawndvars; - maps/mp/mp_raid_fx::main(); - precachemodel( "collision_physics_64x64x64" ); - precachemodel( "collision_physics_128x128x128" ); - precachemodel( "collision_clip_wall_64x64x10" ); - precachemodel( "collision_nosight_wall_64x64x10" ); - precachemodel( "collision_missile_32x32x128" ); - precachemodel( "collision_physics_32x32x32" ); - precachemodel( "collision_clip_wall_256x256x10" ); - maps/mp/_load::main(); - maps/mp/mp_raid_amb::main(); - maps/mp/_compass::setupminimap( "compass_map_mp_raid" ); - spawncollision( "collision_physics_64x64x64", "collider", ( 2664, 3832, 24 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_64x64x64", "collider", ( 4127, 3741, 130 ), vectorScale( ( 0, 1, 0 ), 25.4 ) ); - spawncollision( "collision_physics_128x128x128", "collider", ( 3136, 3590.89, 283.276 ), vectorScale( ( 0, 0, -1 ), 33.6 ) ); - spawncollision( "collision_physics_128x128x128", "collider", ( 2841, 3590.89, 283.28 ), vectorScale( ( 0, 0, -1 ), 33.6 ) ); - spawncollision( "collision_physics_128x128x128", "collider", ( 2841, 3696.89, 212.28 ), vectorScale( ( 0, 0, -1 ), 33.6 ) ); - spawncollision( "collision_physics_128x128x128", "collider", ( 2841, 3804.89, 140.28 ), vectorScale( ( 0, 0, -1 ), 33.6 ) ); - spawncollision( "collision_nosight_wall_64x64x10", "collider", ( 3591, 3274, 187.5 ), ( 0, 16.4, 90 ) ); - spawncollision( "collision_nosight_wall_64x64x10", "collider", ( 3600.5, 3242, 187.5 ), ( 0, 16.4, 90 ) ); - spawncollision( "collision_nosight_wall_64x64x10", "collider", ( 3645, 3318, 187.5 ), ( 0, 16.4, 90 ) ); - spawncollision( "collision_nosight_wall_64x64x10", "collider", ( 3656, 3263, 187.5 ), ( 0, 26.3, 90 ) ); - spawncollision( "collision_nosight_wall_64x64x10", "collider", ( 3702.5, 3348.5, 187.5 ), ( 0, 16.4, 90 ) ); - spawncollision( "collision_nosight_wall_64x64x10", "collider", ( 3705.5, 3292, 187.5 ), ( 0, 39.1, 90 ) ); - spawncollision( "collision_nosight_wall_64x64x10", "collider", ( 3716.5, 3389.5, 187.5 ), ( 0, 56.6, 90 ) ); - spawncollision( "collision_nosight_wall_64x64x10", "collider", ( 3750.5, 3333, 187.5 ), ( 0, 46.7, 90 ) ); - spawncollision( "collision_nosight_wall_64x64x10", "collider", ( 3748.5, 3434.5, 187.5 ), ( 0, 78.5, 90 ) ); - spawncollision( "collision_nosight_wall_64x64x10", "collider", ( 3782.5, 3376, 187.5 ), ( 0, 58.9, 90 ) ); - spawncollision( "collision_nosight_wall_64x64x10", "collider", ( 3809, 3428.5, 187.5 ), ( 0, 69.1, 90 ) ); - spawncollision( "collision_nosight_wall_64x64x10", "collider", ( 3762.5, 3497, 187.5 ), ( 0, 78.3, 90 ) ); - spawncollision( "collision_nosight_wall_64x64x10", "collider", ( 3825.5, 3484.5, 187.5 ), ( 0, 78.7, 90 ) ); - spawncollision( "collision_nosight_wall_64x64x10", "collider", ( 3766.5, 3542, 187.5 ), ( 0, 88.6, 90 ) ); - spawncollision( "collision_nosight_wall_64x64x10", "collider", ( 3830, 3540.5, 187.5 ), ( 0, 88.6, 90 ) ); - spawncollision( "collision_physics_128x128x10", "collider", ( 3562, 3271.5, 186.5 ), vectorScale( ( 0, 1, 0 ), 11.2 ) ); - spawncollision( "collision_missile_32x32x128", "collider", ( 3259.5, 2294.5, 230 ), ( 0, 22.8, 90 ) ); - spawncollision( "collision_physics_32x32x32", "collider", ( 1583.5, 2900, 137.5 ), ( 0, 0, 0 ) ); - spawncollision( "collision_nosight_wall_64x64x10", "collider", ( 2751, 4130.5, 214.5 ), vectorScale( ( 0, 1, 0 ), 270 ) ); - spawncollision( "collision_nosight_wall_64x64x10", "collider", ( 2751, 4099, 214.5 ), vectorScale( ( 0, 1, 0 ), 270 ) ); - spawncollision( "collision_clip_wall_64x64x10", "collider", ( 3819, 3475, 113 ), vectorScale( ( 0, -1, 0 ), 15 ) ); - spawncollision( "collision_clip_wall_64x64x10", "collider", ( 3819, 3598, 113 ), vectorScale( ( 0, 1, 0 ), 15 ) ); - spawncollision( "collision_clip_wall_64x64x10", "collider", ( 3570, 3834, 113 ), vectorScale( ( 0, 1, 0 ), 260 ) ); - spawncollision( "collision_clip_wall_256x256x10", "collider", ( 3352, 4688, 136 ), ( 0, 0, 0 ) ); - level thread water_trigger_init(); + level.levelspawndvars = ::levelspawndvars; + maps\mp\mp_raid_fx::main(); + precachemodel( "collision_physics_64x64x64" ); + precachemodel( "collision_physics_128x128x128" ); + precachemodel( "collision_clip_wall_64x64x10" ); + precachemodel( "collision_nosight_wall_64x64x10" ); + precachemodel( "collision_missile_32x32x128" ); + precachemodel( "collision_physics_32x32x32" ); + precachemodel( "collision_clip_wall_256x256x10" ); + maps\mp\_load::main(); + maps\mp\mp_raid_amb::main(); + maps\mp\_compass::setupminimap( "compass_map_mp_raid" ); + spawncollision( "collision_physics_64x64x64", "collider", ( 2664, 3832, 24 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_64x64x64", "collider", ( 4127, 3741, 130 ), vectorscale( ( 0, 1, 0 ), 25.4 ) ); + spawncollision( "collision_physics_128x128x128", "collider", ( 3136, 3590.89, 283.276 ), vectorscale( ( 0, 0, -1 ), 33.6 ) ); + spawncollision( "collision_physics_128x128x128", "collider", ( 2841, 3590.89, 283.28 ), vectorscale( ( 0, 0, -1 ), 33.6 ) ); + spawncollision( "collision_physics_128x128x128", "collider", ( 2841, 3696.89, 212.28 ), vectorscale( ( 0, 0, -1 ), 33.6 ) ); + spawncollision( "collision_physics_128x128x128", "collider", ( 2841, 3804.89, 140.28 ), vectorscale( ( 0, 0, -1 ), 33.6 ) ); + spawncollision( "collision_nosight_wall_64x64x10", "collider", ( 3591, 3274, 187.5 ), ( 0, 16.4, 90 ) ); + spawncollision( "collision_nosight_wall_64x64x10", "collider", ( 3600.5, 3242, 187.5 ), ( 0, 16.4, 90 ) ); + spawncollision( "collision_nosight_wall_64x64x10", "collider", ( 3645, 3318, 187.5 ), ( 0, 16.4, 90 ) ); + spawncollision( "collision_nosight_wall_64x64x10", "collider", ( 3656, 3263, 187.5 ), ( 0, 26.3, 90 ) ); + spawncollision( "collision_nosight_wall_64x64x10", "collider", ( 3702.5, 3348.5, 187.5 ), ( 0, 16.4, 90 ) ); + spawncollision( "collision_nosight_wall_64x64x10", "collider", ( 3705.5, 3292, 187.5 ), ( 0, 39.1, 90 ) ); + spawncollision( "collision_nosight_wall_64x64x10", "collider", ( 3716.5, 3389.5, 187.5 ), ( 0, 56.6, 90 ) ); + spawncollision( "collision_nosight_wall_64x64x10", "collider", ( 3750.5, 3333, 187.5 ), ( 0, 46.7, 90 ) ); + spawncollision( "collision_nosight_wall_64x64x10", "collider", ( 3748.5, 3434.5, 187.5 ), ( 0, 78.5, 90 ) ); + spawncollision( "collision_nosight_wall_64x64x10", "collider", ( 3782.5, 3376, 187.5 ), ( 0, 58.9, 90 ) ); + spawncollision( "collision_nosight_wall_64x64x10", "collider", ( 3809, 3428.5, 187.5 ), ( 0, 69.1, 90 ) ); + spawncollision( "collision_nosight_wall_64x64x10", "collider", ( 3762.5, 3497, 187.5 ), ( 0, 78.3, 90 ) ); + spawncollision( "collision_nosight_wall_64x64x10", "collider", ( 3825.5, 3484.5, 187.5 ), ( 0, 78.7, 90 ) ); + spawncollision( "collision_nosight_wall_64x64x10", "collider", ( 3766.5, 3542, 187.5 ), ( 0, 88.6, 90 ) ); + spawncollision( "collision_nosight_wall_64x64x10", "collider", ( 3830, 3540.5, 187.5 ), ( 0, 88.6, 90 ) ); + spawncollision( "collision_physics_128x128x10", "collider", ( 3562, 3271.5, 186.5 ), vectorscale( ( 0, 1, 0 ), 11.2 ) ); + spawncollision( "collision_missile_32x32x128", "collider", ( 3259.5, 2294.5, 230 ), ( 0, 22.8, 90 ) ); + spawncollision( "collision_physics_32x32x32", "collider", ( 1583.5, 2900, 137.5 ), ( 0, 0, 0 ) ); + spawncollision( "collision_nosight_wall_64x64x10", "collider", ( 2751, 4130.5, 214.5 ), vectorscale( ( 0, 1, 0 ), 270.0 ) ); + spawncollision( "collision_nosight_wall_64x64x10", "collider", ( 2751, 4099, 214.5 ), vectorscale( ( 0, 1, 0 ), 270.0 ) ); + spawncollision( "collision_clip_wall_64x64x10", "collider", ( 3819, 3475, 113 ), vectorscale( ( 0, -1, 0 ), 15.0 ) ); + spawncollision( "collision_clip_wall_64x64x10", "collider", ( 3819, 3598, 113 ), vectorscale( ( 0, 1, 0 ), 15.0 ) ); + spawncollision( "collision_clip_wall_64x64x10", "collider", ( 3570, 3834, 113 ), vectorscale( ( 0, 1, 0 ), 260.0 ) ); + spawncollision( "collision_clip_wall_256x256x10", "collider", ( 3352, 4688, 136 ), ( 0, 0, 0 ) ); + level thread water_trigger_init(); } -levelspawndvars( reset_dvars ) //checked matches cerberus output +levelspawndvars( reset_dvars ) { - ss = level.spawnsystem; - ss.enemy_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_radius", "1870", reset_dvars ); + ss = level.spawnsystem; + ss.enemy_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_radius", "1870", reset_dvars ); } -water_trigger_init() //checked changed to match cerberus output +water_trigger_init() { - triggers = getentarray( "water_killbrush", "targetname" ); - foreach ( trigger in triggers ) - { - trigger thread player_splash_think(); - } + triggers = getentarray( "water_killbrush", "targetname" ); + + foreach ( trigger in triggers ) + trigger thread player_splash_think(); } -player_splash_think() //checked matches cerberus output +player_splash_think() { - for ( ;; ) - { - self waittill( "trigger", entity ); - if ( isplayer( entity ) && isalive( entity ) ) - { - self thread trigger_thread( entity, ::player_water_fx ); - } - } + for (;;) + { + self waittill( "trigger", entity ); + + if ( isplayer( entity ) && isalive( entity ) ) + self thread trigger_thread( entity, ::player_water_fx ); + } } -player_water_fx( player, endon_condition ) //checked matches cerberus output +player_water_fx( player, endon_condition ) { - maxs = self.origin + self getmaxs(); - if ( maxs[ 2 ] < 0 ) - { - maxs += vectorScale( ( 0, 0, 1 ), 5 ); - } - origin = ( player.origin[ 0 ], player.origin[ 1 ], maxs[ 2 ] ); - playfx( level._effect[ "water_splash_sm" ], origin ); -} + maxs = self.origin + self getmaxs(); + if ( maxs[2] < 0 ) + maxs += vectorscale( ( 0, 0, 1 ), 5.0 ); + + origin = ( player.origin[0], player.origin[1], maxs[2] ); + playfx( level._effect["water_splash_sm"], origin ); +} diff --git a/Multiplayer Core/patch_mp/maps/mp/mp_skate.gsc b/Multiplayer Core/patch_mp/maps/mp/mp_skate.gsc index 1bc9dee..b1f70ae 100644 --- a/Multiplayer Core/patch_mp/maps/mp/mp_skate.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/mp_skate.gsc @@ -1,57 +1,58 @@ -//checked includes changed to match cerberus output -#include maps/mp/gametypes/_spawning; -#include maps/mp/_compass; -#include maps/mp/mp_skate_amb; -#include maps/mp/_load; -#include maps/mp/mp_skate_fx; -#include maps/mp/_utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\_utility; +#include maps\mp\mp_skate_fx; +#include maps\mp\_load; +#include maps\mp\mp_skate_amb; +#include maps\mp\_compass; +#include maps\mp\gametypes\_spawning; -main() //checked did not match cerberus output did not change +main() { - level.levelspawndvars = ::levelspawndvars; - maps/mp/mp_skate_fx::main(); - maps/mp/_load::main(); - maps/mp/mp_skate_amb::main(); - precachemodel( "collision_physics_cylinder_32x128" ); - precachemodel( "collision_clip_wall_128x128x10" ); - precachemodel( "collision_physics_clip_64x64x10" ); - precachemodel( "collision_clip_64x64x10" ); - precachemodel( "paris_construction_scaffold_piece_01" ); - maps/mp/_compass::setupminimap( "compass_map_mp_skate" ); - visionsetnaked( "mp_skate", 1 ); - setdvar( "compassmaxrange", "2100" ); - game[ "strings" ][ "war_callsign_a" ] = &"MPUI_CALLSIGN_MAPNAME_A"; - game[ "strings" ][ "war_callsign_b" ] = &"MPUI_CALLSIGN_MAPNAME_B"; - game[ "strings" ][ "war_callsign_c" ] = &"MPUI_CALLSIGN_MAPNAME_C"; - game[ "strings" ][ "war_callsign_d" ] = &"MPUI_CALLSIGN_MAPNAME_D"; - game[ "strings" ][ "war_callsign_e" ] = &"MPUI_CALLSIGN_MAPNAME_E"; - game[ "strings_menu" ][ "war_callsign_a" ] = "@MPUI_CALLSIGN_MAPNAME_A"; - game[ "strings_menu" ][ "war_callsign_b" ] = "@MPUI_CALLSIGN_MAPNAME_B"; - game[ "strings_menu" ][ "war_callsign_c" ] = "@MPUI_CALLSIGN_MAPNAME_C"; - game[ "strings_menu" ][ "war_callsign_d" ] = "@MPUI_CALLSIGN_MAPNAME_D"; - game[ "strings_menu" ][ "war_callsign_e" ] = "@MPUI_CALLSIGN_MAPNAME_E"; - spawncollision( "collision_physics_cylinder_32x128", "collider", ( -1045, -418.5, 292 ), vectorScale( ( 0, 1, 0 ), 359.8 ) ); - spawncollision( "collision_physics_cylinder_32x128", "collider", ( -720, -628, 292 ), vectorScale( ( 0, 1, 0 ), 355.6 ) ); - spawncollision( "collision_clip_wall_128x128x10", "collider", ( -2250.5, -837.5, 422.5 ), ( 0, 1, 0 ) ); - spawncollision( "collision_clip_wall_128x128x10", "collider", ( -2333, -837.5, 422.5 ), ( 0, 1, 0 ) ); - spawncollision( "collision_physics_64x64x10", "collider", ( -663.5, -1975.5, 314 ), ( 0, 1, 0 ) ); - spawncollision( "collision_clip_wall_128x128x10", "collider", ( 791.5, 683.5, 234 ), vectorScale( ( 0, 1, 0 ), 270 ) ); - spawncollision( "collision_clip_64x64x10", "collider", ( 716, 238.5, 240 ), ( 90, 270, 90 ) ); - spawncollision( "collision_clip_64x64x10", "collider", ( 716, 198, 240 ), ( 90, 270, 90 ) ); - spawncollision( "collision_clip_64x64x10", "collider", ( 684.5, 223, 200,5 ), ( 1.048, 270, 42 ) ); - spawncollision( "collision_clip_64x64x10", "collider", ( 684.5, 182.5, 200,5 ), ( 1,048, 270, 42 ) ); - pipe1 = spawn( "script_model", ( -1368, -1541, 257 ) ); - pipe1.angles = vectorScale( ( 0, 1, 0 ), 90 ); - pipe1 setmodel( "paris_construction_scaffold_piece_01" ); - maps/mp/gametypes/_spawning::level_use_unified_spawning( 1 ); - level.remotemotarviewleft = 40; - level.remotemotarviewright = 40; - level.remotemotarviewup = 20; - level.remotemotarviewdown = 65; + level.levelspawndvars = ::levelspawndvars; + maps\mp\mp_skate_fx::main(); + maps\mp\_load::main(); + maps\mp\mp_skate_amb::main(); + precachemodel( "collision_physics_cylinder_32x128" ); + precachemodel( "collision_clip_wall_128x128x10" ); + precachemodel( "collision_physics_clip_64x64x10" ); + precachemodel( "collision_clip_64x64x10" ); + precachemodel( "paris_construction_scaffold_piece_01" ); + maps\mp\_compass::setupminimap( "compass_map_mp_skate" ); + visionsetnaked( "mp_skate", 1 ); + setdvar( "compassmaxrange", "2100" ); + game["strings"]["war_callsign_a"] = &"MPUI_CALLSIGN_MAPNAME_A"; + game["strings"]["war_callsign_b"] = &"MPUI_CALLSIGN_MAPNAME_B"; + game["strings"]["war_callsign_c"] = &"MPUI_CALLSIGN_MAPNAME_C"; + game["strings"]["war_callsign_d"] = &"MPUI_CALLSIGN_MAPNAME_D"; + game["strings"]["war_callsign_e"] = &"MPUI_CALLSIGN_MAPNAME_E"; + game["strings_menu"]["war_callsign_a"] = "@MPUI_CALLSIGN_MAPNAME_A"; + game["strings_menu"]["war_callsign_b"] = "@MPUI_CALLSIGN_MAPNAME_B"; + game["strings_menu"]["war_callsign_c"] = "@MPUI_CALLSIGN_MAPNAME_C"; + game["strings_menu"]["war_callsign_d"] = "@MPUI_CALLSIGN_MAPNAME_D"; + game["strings_menu"]["war_callsign_e"] = "@MPUI_CALLSIGN_MAPNAME_E"; + spawncollision( "collision_physics_cylinder_32x128", "collider", ( -1045, -418.5, 292 ), vectorscale( ( 0, 1, 0 ), 359.8 ) ); + spawncollision( "collision_physics_cylinder_32x128", "collider", ( -720, -628, 292 ), vectorscale( ( 0, 1, 0 ), 355.6 ) ); + spawncollision( "collision_clip_wall_128x128x10", "collider", ( -2250.5, -837.5, 422.5 ), ( 0, 0, 0 ) ); + spawncollision( "collision_clip_wall_128x128x10", "collider", ( -2333, -837.5, 422.5 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_64x64x10", "collider", ( -663.5, -1975.5, 314 ), ( 0, 0, 0 ) ); + spawncollision( "collision_clip_wall_128x128x10", "collider", ( 791.5, 683.5, 234 ), vectorscale( ( 0, 1, 0 ), 270.0 ) ); + spawncollision( "collision_clip_64x64x10", "collider", ( 716, 238.5, 240 ), ( 90, 270, 90 ) ); + spawncollision( "collision_clip_64x64x10", "collider", ( 716, 198, 240 ), ( 90, 270, 90 ) ); + spawncollision( "collision_clip_64x64x10", "collider", ( 684.5, 223, 200.5 ), ( 1.048, 270, 42 ) ); + spawncollision( "collision_clip_64x64x10", "collider", ( 684.5, 182.5, 200.5 ), ( 1.048, 270, 42 ) ); + pipe1 = spawn( "script_model", ( -1368, -1541, 257 ) ); + pipe1.angles = vectorscale( ( 0, 1, 0 ), 90.0 ); + pipe1 setmodel( "paris_construction_scaffold_piece_01" ); + maps\mp\gametypes\_spawning::level_use_unified_spawning( 1 ); + level.remotemotarviewleft = 40; + level.remotemotarviewright = 40; + level.remotemotarviewup = 20; + level.remotemotarviewdown = 65; } -levelspawndvars( reset_dvars ) //checked did not match cerberus output did not change +levelspawndvars( reset_dvars ) { - ss = level.spawnsystem; - ss.enemy_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_radius", "2475", reset_dvars ); + ss = level.spawnsystem; + ss.enemy_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_radius", "2475", reset_dvars ); } diff --git a/Multiplayer Core/patch_mp/maps/mp/mp_slums.gsc b/Multiplayer Core/patch_mp/maps/mp/mp_slums.gsc index 7ba428b..ac29bb3 100644 --- a/Multiplayer Core/patch_mp/maps/mp/mp_slums.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/mp_slums.gsc @@ -1,203 +1,203 @@ -//checked includes changed to match cerberus output -#include maps/mp/mp_slums_amb; -#include maps/mp/_compass; -#include maps/mp/_load; -#include maps/mp/mp_slums_fx; -#include maps/mp/_utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\_utility; +#include maps\mp\mp_slums_fx; +#include maps\mp\_load; +#include maps\mp\_compass; +#include maps\mp\mp_slums_amb; -main() //checked changed to match cerberus output +main() { - level.levelspawndvars = ::levelspawndvars; - maps/mp/mp_slums_fx::main(); - precachemodel( "collision_physics_64x64x64" ); - precachemodel( "collision_physics_64x64x10" ); - precachemodel( "collision_physics_wall_32x32x10" ); - precachemodel( "collision_physics_128x128x128" ); - precachemodel( "collision_physics_128x128x10" ); - precachemodel( "collision_physics_256x256x10" ); - precachemodel( "collision_physics_256x256x256" ); - precachemodel( "collision_physics_512x512x512" ); - precachemodel( "collision_physics_32x32x128" ); - precachemodel( "collision_nosight_wall_64x64x10" ); - precachemodel( "collision_physics_64x64x128" ); - precachemodel( "collision_physics_cylinder_32x128" ); - precachemodel( "collision_physics_32x32x32" ); - precachemodel( "collision_physics_64x64x256" ); - precachemodel( "collision_physics_wall_64x64x10" ); - precachemodel( "collision_nosight_wall_64x64x10" ); - precachemodel( "me_corrugated_metal8x8_holes" ); - precachemodel( "me_corrugated_metal8x8" ); - precachemodel( "p_glo_corrugated_metal1" ); - precachemodel( "me_ac_window" ); - precachemodel( "collision_slums_curved_wall" ); - precachemodel( "collision_slums_curved_wall_bullet" ); - precachemodel( "intro_prayer_flags_unspecific_01" ); - precachemodel( "prop_brick_single_v2" ); - maps/mp/_load::main(); - maps/mp/_compass::setupminimap( "compass_map_mp_slums" ); - maps/mp/mp_slums_amb::main(); - game[ "strings" ][ "war_callsign_a" ] = &"MPUI_CALLSIGN_MAPNAME_A"; - game[ "strings" ][ "war_callsign_b" ] = &"MPUI_CALLSIGN_MAPNAME_B"; - game[ "strings" ][ "war_callsign_c" ] = &"MPUI_CALLSIGN_MAPNAME_C"; - game[ "strings" ][ "war_callsign_d" ] = &"MPUI_CALLSIGN_MAPNAME_D"; - game[ "strings" ][ "war_callsign_e" ] = &"MPUI_CALLSIGN_MAPNAME_E"; - game[ "strings_menu" ][ "war_callsign_a" ] = "@MPUI_CALLSIGN_MAPNAME_A"; - game[ "strings_menu" ][ "war_callsign_b" ] = "@MPUI_CALLSIGN_MAPNAME_B"; - game[ "strings_menu" ][ "war_callsign_c" ] = "@MPUI_CALLSIGN_MAPNAME_C"; - game[ "strings_menu" ][ "war_callsign_d" ] = "@MPUI_CALLSIGN_MAPNAME_D"; - game[ "strings_menu" ][ "war_callsign_e" ] = "@MPUI_CALLSIGN_MAPNAME_E"; - spawncollision( "collision_physics_64x64x64", "collider", ( -508, -3270, 928 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_64x64x64", "collider", ( -508, -3286, 928 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_wall_32x32x10", "collider", ( -72, 254, 930 ), vectorScale( ( 0, 1, 0 ), 15 ) ); - spawncollision( "collision_physics_wall_32x32x10", "collider", ( 48, 284, 930 ), vectorScale( ( 0, 1, 0 ), 15 ) ); - spawncollision( "collision_physics_wall_64x64x10", "collider", ( -104, 248, 891 ), ( 341.421, 12.9047, 0.661127 ) ); - spawncollision( "collision_physics_wall_64x64x10", "collider", ( 76.5, 293.5, 891.5 ), ( 340.335, 193.409, -5.20973 ) ); - spawncollision( "collision_physics_32x32x128", "collider", ( -451, -2508, 466 ), ( 270, 290, -5.5 ) ); - spawncollision( "collision_physics_wall_32x32x10", "collider", ( -472, -2490, 476 ), vectorScale( ( 0, 1, 0 ), 289.4 ) ); - spawncollision( "collision_physics_wall_32x32x10", "collider", ( -458, -2528, 476 ), vectorScale( ( 0, 1, 0 ), 289.4 ) ); - spawncollision( "collision_physics_wall_32x32x10", "collider", ( -217, -944, 578 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_wall_32x32x10", "collider", ( -217, -944, 566 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_wall_32x32x10", "collider", ( -186, -962, 567 ), vectorScale( ( 0, 1, 0 ), 287 ) ); - spawncollision( "collision_physics_wall_32x32x10", "collider", ( -186, -962, 578 ), vectorScale( ( 0, 1, 0 ), 287 ) ); - spawncollision( "collision_physics_128x128x128", "collider", ( 1297.09, 777.435, 1093 ), vectorScale( ( 0, 1, 0 ), 9.39996 ) ); - spawncollision( "collision_physics_128x128x128", "collider", ( -1070.8, -1111.64, 1073 ), vectorScale( ( 0, 1, 0 ), 0.4 ) ); - spawncollision( "collision_physics_128x128x128", "collider", ( -760.8, -1883.64, 1041 ), vectorScale( ( 0, 1, 0 ), 0.4 ) ); - spawncollision( "collision_physics_128x128x10", "collider", ( 1605, -1869, 847 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_128x128x10", "collider", ( 1733, -1869, 847 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_128x128x10", "collider", ( 1861, -1869, 847 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_128x128x10", "collider", ( 1989, -1869, 847 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_wall_128x128x10", "collider", ( 1706, -1918, 414 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_wall_128x128x10", "collider", ( 1832, -1918, 414 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_wall_128x128x10", "collider", ( 1935, -1918, 414 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_128x128x10", "collider", ( 1632, -1704, 674 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_128x128x10", "collider", ( 1760, -1704, 674 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_128x128x10", "collider", ( 1888, -1704, 674 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_wall_64x64x10", "collider", ( 562, 2058, 580 ), vectorScale( ( 0, 1, 0 ), 270 ) ); - spawncollision( "collision_physics_wall_256x256x10", "collider", ( 823, 1672, 870 ), vectorScale( ( 0, 1, 0 ), 273.2 ) ); - spawncollision( "collision_physics_wall_256x256x10", "collider", ( 839, 1454, 869 ), vectorScale( ( 0, 1, 0 ), 273.2 ) ); - spawncollision( "collision_physics_32x32x128", "collider", ( 828, 1550, 816 ), vectorScale( ( 0, 1, 0 ), 5 ) ); - spawncollision( "collision_physics_32x32x128", "collider", ( 826, 1572, 816 ), vectorScale( ( 0, 1, 0 ), 5 ) ); - spawncollision( "collision_physics_256x256x256", "collider", ( -1513, -220, 771 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_256x256x256", "collider", ( -1321, -220, 771 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_256x256x256", "collider", ( -1513, -220, 517 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_256x256x256", "collider", ( -1321, -220, 517 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_64x64x128", "collider", ( -1536, -365, 733 ), ( 1, 90, 90 ) ); - spawncollision( "collision_physics_64x64x128", "collider", ( -1407, -365, 733 ), ( 1, 90, 90 ) ); - spawncollision( "collision_physics_64x64x128", "collider", ( -1278, -365, 733 ), ( 1, 90, 90 ) ); - spawncollision( "collision_slums_curved_wall", "collider", ( 1258.5, -445, 558.5 ), ( 0, 0, 0 ) ); - spawncollision( "collision_slums_curved_wall_bullet", "collider", ( 1258.5, -445, 558.5 ), ( 0, 0, 0 ) ); - balconymetal1 = spawn( "script_model", ( -778, -1922.37, 990.03 ) ); - balconymetal1.angles = ( 0, 270, -90 ); - balconymetal2 = spawn( "script_model", ( -743, -1922.37, 989.03 ) ); - balconymetal2.angles = ( 0, 270, -90 ); - balconymetal3 = spawn( "script_model", ( -1088, -1147.37, 1015.03 ) ); - balconymetal3.angles = ( 0, 270, -90 ); - balconymetal4 = spawn( "script_model", ( -1053, -1147.37, 1014.03 ) ); - balconymetal4.angles = ( 0, 270, -90 ); - balconymetal1 setmodel( "p_glo_corrugated_metal1" ); - balconymetal2 setmodel( "p_glo_corrugated_metal1" ); - balconymetal3 setmodel( "p_glo_corrugated_metal1" ); - balconymetal4 setmodel( "p_glo_corrugated_metal1" ); - crate1 = spawn( "script_model", ( 1530, -1738, 493 ) ); - crate1.angles = ( 354.4, 270, -16 ); - prop1 = spawn( "script_model", ( 1936.37, -1924.03, 470 ) ); - prop1.angles = ( 89, 179.6, 180 ); - prop2 = spawn( "script_model", ( 1876.37, -1923.03, 471.005 ) ); - prop2.angles = ( 89, 179.6, 180 ); - prop3 = spawn( "script_model", ( 1783.37, -1922.03, 472 ) ); - prop3.angles = ( 89, 179.6, 180 ); - prop4 = spawn( "script_model", ( 1707.37, -1924.03, 486.001 ) ); - prop4.angles = ( 72, 179.6, 180 ); - crate1 setmodel( "me_ac_window" ); - prop1 setmodel( "p_glo_corrugated_metal1" ); - prop2 setmodel( "p_glo_corrugated_metal1" ); - prop3 setmodel( "p_glo_corrugated_metal1" ); - prop4 setmodel( "p_glo_corrugated_metal1" ); - fencemetal1 = spawn( "script_model", ( -719, -2557, 532 ) ); - fencemetal1.angles = ( 90, 333.5, -26.5 ); - fencemetal1 setmodel( "me_corrugated_metal8x8_holes" ); - fencemetal1 = spawn( "script_model", ( -798, -2556, 532 ) ); - fencemetal1.angles = ( 90, 333.5, -26.5 ); - fencemetal1 setmodel( "me_corrugated_metal8x8_holes" ); - fencemetal1 = spawn( "script_model", ( -885, -2557, 532 ) ); - fencemetal1.angles = ( 90, 153.5, -26.5 ); - fencemetal1 setmodel( "me_corrugated_metal8x8_holes" ); - fencemetal1 = spawn( "script_model", ( -975, -2556, 532 ) ); - fencemetal1.angles = ( 90, 333.5, -26.5 ); - fencemetal1 setmodel( "me_corrugated_metal8x8_holes" ); - spawncollision( "collision_physics_512x512x512", "collider", ( 1435, 2393, 780 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_64x64x64", "collider", ( 1371, 2229, 1044 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_64x64x64", "collider", ( 1371, 2253, 1044 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_64x64x64", "collider", ( 1234, 2229, 1102 ), vectorScale( ( 0, 1, 0 ), 315.2 ) ); - spawncollision( "collision_physics_64x64x64", "collider", ( 884, 1602, 1019 ), vectorScale( ( 0, 1, 0 ), 270 ) ); - spawncollision( "collision_physics_64x64x64", "collider", ( 908, 1602, 1019 ), vectorScale( ( 0, 1, 0 ), 270 ) ); - spawncollision( "collision_physics_64x64x64", "collider", ( 883, 1732, 1073 ), vectorScale( ( 0, 1, 0 ), 225 ) ); - spawncollision( "collision_physics_64x64x64", "collider", ( 1065.29, 1601.18, 1084.07 ), ( 315, 334.2, -4 ) ); - spawncollision( "collision_physics_64x64x64", "collider", ( 1106.29, 1581.18, 1129.07 ), ( 315, 334.2, -4 ) ); - spawncollision( "collision_physics_64x64x64", "collider", ( 1064.29, 1506.18, 1084.07 ), ( 315, 334.2, -4 ) ); - spawncollision( "collision_physics_64x64x64", "collider", ( 1105.29, 1486.18, 1129.07 ), ( 315, 334.2, -4 ) ); - spawncollision( "collision_physics_64x64x64", "collider", ( 1066.29, 1411.18, 1084.07 ), ( 315, 334.2, -4 ) ); - spawncollision( "collision_physics_64x64x64", "collider", ( 1107.29, 1391.18, 1129.07 ), ( 315, 334.2, -4 ) ); - spawncollision( "collision_physics_256x256x256", "collider", ( 1501, 1687, 812 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_256x256x256", "collider", ( 1722, 1687, 812 ), ( 0, 0, 0 ) ); - spawncollision( "collision_nosight_wall_64x64x10", "collider", ( -640, -2561, 523 ), ( 0, 0, 0 ) ); - middlevisblock1 = spawn( "script_model", ( 348, -66, 672 ) ); - middlevisblock1.angles = ( 6.30742, 309.785, -7.51566 ); - middlevisblock1 setmodel( "me_corrugated_metal8x8" ); - spawncollision( "collision_physics_32x32x128", "collider", ( -1011.5, -641.5, 801 ), ( 315, 0, -90 ) ); - spawncollision( "collision_physics_32x32x128", "collider", ( -1011.5, -541.5, 801 ), ( 315, 0, -90 ) ); - spawncollision( "collision_physics_32x32x128", "collider", ( -1011.5, -439, 801 ), ( 315, 0, -90 ) ); - spawncollision( "collision_physics_32x32x128", "collider", ( -997.5, -641.5, 781.5 ), ( 330, 0, -90 ) ); - spawncollision( "collision_physics_32x32x128", "collider", ( -997.5, -541.5, 781.5 ), ( 330, 0, -90 ) ); - spawncollision( "collision_physics_32x32x128", "collider", ( -997.5, -439, 781.5 ), ( 330, 0, -90 ) ); - spawncollision( "collision_physics_32x32x128", "collider", ( -1026, -641.5, 781.5 ), ( 330, 180, 90 ) ); - spawncollision( "collision_physics_32x32x128", "collider", ( -1026, -541.5, 781.5 ), ( 330, 180, 90 ) ); - spawncollision( "collision_physics_32x32x128", "collider", ( -1026, -439, 781.5 ), ( 330, 180, 90 ) ); - spawncollision( "collision_physics_32x32x32", "collider", ( -211, -972.5, 578 ), vectorScale( ( 0, 1, 0 ), 335.8 ) ); - spawncollision( "collision_nosight_wall_64x64x10", "collider", ( -636, -2562.5, 511 ), ( 0, 0, 0 ) ); - spawncollision( "collision_nosight_wall_64x64x10", "collider", ( -699.5, -2562.5, 511 ), ( 0, 0, 0 ) ); - spawncollision( "collision_nosight_wall_64x64x10", "collider", ( -763.5, -2562.5, 511 ), ( 0, 0, 0 ) ); - spawncollision( "collision_nosight_wall_64x64x10", "collider", ( -827.5, -2562.5, 511 ), ( 0, 0, 0 ) ); - spawncollision( "collision_nosight_wall_64x64x10", "collider", ( -636, -2562.5, 478 ), ( 0, 0, 0 ) ); - spawncollision( "collision_nosight_wall_64x64x10", "collider", ( -699.5, -2562.5, 478 ), ( 0, 0, 0 ) ); - spawncollision( "collision_nosight_wall_64x64x10", "collider", ( -763.5, -2562.5, 478 ), ( 0, 0, 0 ) ); - spawncollision( "collision_nosight_wall_64x64x10", "collider", ( -827.5, -2562.5, 478 ), ( 0, 0, 0 ) ); - prayerflags1 = spawn( "script_model", ( -967.622, -309.912, 794 ) ); - prayerflags1.angles = vectorScale( ( 0, 0, 0 ), 350.8 ); - prayerflags1 setmodel( "intro_prayer_flags_unspecific_01" ); - prayerflags2 = spawn( "script_model", ( -1065.16, -318.731, 833 ) ); - prayerflags2.angles = vectorScale( ( 0, 0, 0 ), 14.4 ); - prayerflags2 setmodel( "intro_prayer_flags_unspecific_01" ); - level.levelkillbrushes = []; - level.levelkillbrushes[ level.levelkillbrushes.size ] = spawn( "trigger_radius", ( -1673, 252, 526 ), 0, 550, 322 ); - spawncollision( "collision_physics_wall_128x128x10", "collider", ( -1171.5, -2502.5, 493.5 ), vectorScale( ( 0, 1, 0 ), 270 ) ); - spawncollision( "collision_physics_wall_128x128x10", "collider", ( -1231, -2502.5, 560.5 ), ( 6.83, 180, -90 ) ); - spawncollision( "collision_physics_wall_128x128x10", "collider", ( -1358.5, -2502.5, 560.5 ), ( 6.83, 180, -90 ) ); - blueroombrick = spawn( "script_model", ( -278.458, -803.132, 618.922 ) ); - blueroombrick.angles = ( 89.6232, 39.6618, 24.4607 ); - blueroombrick setmodel( "prop_brick_single_v2" ); - blueroombrick2 = spawn( "script_model", ( -284.21, -805.13, 618.92 ) ); - blueroombrick2.angles = ( 89.6232, 39.6618, 24.4607 ); - blueroombrick2 setmodel( "prop_brick_single_v2" ); - blueroombrick3 = spawn( "script_model", ( -278.46, -803.88, 643.17 ) ); - blueroombrick3.angles = ( 89.6232, 39.6618, 24.4607 ); - blueroombrick3 setmodel( "prop_brick_single_v2" ); - spawncollision( "collision_physics_32x32x32", "collider", ( 997.5, 633, 589 ), vectorScale( ( 0, 1, 0 ), 16.6 ) ); - spawncollision( "collision_physics_wall_64x64x10", "collider", ( -253, -374, 565 ), ( 4.27, 270, -35.9 ) ); - spawncollision( "collision_physics_wall_64x64x10", "collider", ( -253, -406, 565 ), ( 4.27, 270, -35.9 ) ); - spawncollision( "collision_physics_wall_64x64x10", "collider", ( -232.5, -374.455, 573.211 ), ( 346.3, 270, -0.39995 ) ); - spawncollision( "collision_physics_wall_64x64x10", "collider", ( -232.5, -405.545, 580.789 ), ( 346.3, 270, -0.39995 ) ); - spawncollision( "collision_physics_32x32x32", "collider", ( 726.5, 998.5, 607.5 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_32x32x32", "collider", ( 726.5, 967.5, 607.5 ), ( 0, 0, 0 ) ); - level.remotemotarviewleft = 30; - level.remotemotarviewright = 30; - level.remotemotarviewup = 10; - level.remotemotarviewdown = 25; + level.levelspawndvars = ::levelspawndvars; + maps\mp\mp_slums_fx::main(); + precachemodel( "collision_physics_64x64x64" ); + precachemodel( "collision_physics_64x64x10" ); + precachemodel( "collision_physics_wall_32x32x10" ); + precachemodel( "collision_physics_128x128x128" ); + precachemodel( "collision_physics_128x128x10" ); + precachemodel( "collision_physics_256x256x10" ); + precachemodel( "collision_physics_256x256x256" ); + precachemodel( "collision_physics_512x512x512" ); + precachemodel( "collision_physics_32x32x128" ); + precachemodel( "collision_nosight_wall_64x64x10" ); + precachemodel( "collision_physics_64x64x128" ); + precachemodel( "collision_physics_cylinder_32x128" ); + precachemodel( "collision_physics_32x32x32" ); + precachemodel( "collision_physics_64x64x256" ); + precachemodel( "collision_physics_wall_64x64x10" ); + precachemodel( "collision_nosight_wall_64x64x10" ); + precachemodel( "me_corrugated_metal8x8_holes" ); + precachemodel( "me_corrugated_metal8x8" ); + precachemodel( "p_glo_corrugated_metal1" ); + precachemodel( "me_ac_window" ); + precachemodel( "collision_slums_curved_wall" ); + precachemodel( "collision_slums_curved_wall_bullet" ); + precachemodel( "intro_prayer_flags_unspecific_01" ); + precachemodel( "prop_brick_single_v2" ); + maps\mp\_load::main(); + maps\mp\_compass::setupminimap( "compass_map_mp_slums" ); + maps\mp\mp_slums_amb::main(); + game["strings"]["war_callsign_a"] = &"MPUI_CALLSIGN_MAPNAME_A"; + game["strings"]["war_callsign_b"] = &"MPUI_CALLSIGN_MAPNAME_B"; + game["strings"]["war_callsign_c"] = &"MPUI_CALLSIGN_MAPNAME_C"; + game["strings"]["war_callsign_d"] = &"MPUI_CALLSIGN_MAPNAME_D"; + game["strings"]["war_callsign_e"] = &"MPUI_CALLSIGN_MAPNAME_E"; + game["strings_menu"]["war_callsign_a"] = "@MPUI_CALLSIGN_MAPNAME_A"; + game["strings_menu"]["war_callsign_b"] = "@MPUI_CALLSIGN_MAPNAME_B"; + game["strings_menu"]["war_callsign_c"] = "@MPUI_CALLSIGN_MAPNAME_C"; + game["strings_menu"]["war_callsign_d"] = "@MPUI_CALLSIGN_MAPNAME_D"; + game["strings_menu"]["war_callsign_e"] = "@MPUI_CALLSIGN_MAPNAME_E"; + spawncollision( "collision_physics_64x64x64", "collider", ( -508, -3270, 928 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_64x64x64", "collider", ( -508, -3286, 928 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_wall_32x32x10", "collider", ( -72, 254, 930 ), vectorscale( ( 0, 1, 0 ), 15.0 ) ); + spawncollision( "collision_physics_wall_32x32x10", "collider", ( 48, 284, 930 ), vectorscale( ( 0, 1, 0 ), 15.0 ) ); + spawncollision( "collision_physics_wall_64x64x10", "collider", ( -104, 248, 891 ), ( 341.421, 12.9047, 0.661127 ) ); + spawncollision( "collision_physics_wall_64x64x10", "collider", ( 76.5, 293.5, 891.5 ), ( 340.335, 193.409, -5.20973 ) ); + spawncollision( "collision_physics_32x32x128", "collider", ( -451, -2508, 466 ), ( 270, 290, -5.5 ) ); + spawncollision( "collision_physics_wall_32x32x10", "collider", ( -472, -2490, 476 ), vectorscale( ( 0, 1, 0 ), 289.4 ) ); + spawncollision( "collision_physics_wall_32x32x10", "collider", ( -458, -2528, 476 ), vectorscale( ( 0, 1, 0 ), 289.4 ) ); + spawncollision( "collision_physics_wall_32x32x10", "collider", ( -217, -944, 578 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_wall_32x32x10", "collider", ( -217, -944, 566 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_wall_32x32x10", "collider", ( -186, -962, 567 ), vectorscale( ( 0, 1, 0 ), 287.0 ) ); + spawncollision( "collision_physics_wall_32x32x10", "collider", ( -186, -962, 578 ), vectorscale( ( 0, 1, 0 ), 287.0 ) ); + spawncollision( "collision_physics_128x128x128", "collider", ( 1297.09, 777.435, 1093 ), vectorscale( ( 0, 1, 0 ), 9.39996 ) ); + spawncollision( "collision_physics_128x128x128", "collider", ( -1070.8, -1111.64, 1073 ), vectorscale( ( 0, 1, 0 ), 0.4 ) ); + spawncollision( "collision_physics_128x128x128", "collider", ( -760.8, -1883.64, 1041 ), vectorscale( ( 0, 1, 0 ), 0.4 ) ); + spawncollision( "collision_physics_128x128x10", "collider", ( 1605, -1869, 847 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_128x128x10", "collider", ( 1733, -1869, 847 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_128x128x10", "collider", ( 1861, -1869, 847 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_128x128x10", "collider", ( 1989, -1869, 847 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_wall_128x128x10", "collider", ( 1706, -1918, 414 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_wall_128x128x10", "collider", ( 1832, -1918, 414 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_wall_128x128x10", "collider", ( 1935, -1918, 414 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_128x128x10", "collider", ( 1632, -1704, 674 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_128x128x10", "collider", ( 1760, -1704, 674 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_128x128x10", "collider", ( 1888, -1704, 674 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_wall_64x64x10", "collider", ( 562, 2058, 580 ), vectorscale( ( 0, 1, 0 ), 270.0 ) ); + spawncollision( "collision_physics_wall_256x256x10", "collider", ( 823, 1672, 870 ), vectorscale( ( 0, 1, 0 ), 273.2 ) ); + spawncollision( "collision_physics_wall_256x256x10", "collider", ( 839, 1454, 869 ), vectorscale( ( 0, 1, 0 ), 273.2 ) ); + spawncollision( "collision_physics_32x32x128", "collider", ( 828, 1550, 816 ), vectorscale( ( 0, 1, 0 ), 5.0 ) ); + spawncollision( "collision_physics_32x32x128", "collider", ( 826, 1572, 816 ), vectorscale( ( 0, 1, 0 ), 5.0 ) ); + spawncollision( "collision_physics_256x256x256", "collider", ( -1513, -220, 771 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_256x256x256", "collider", ( -1321, -220, 771 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_256x256x256", "collider", ( -1513, -220, 517 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_256x256x256", "collider", ( -1321, -220, 517 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_64x64x128", "collider", ( -1536, -365, 733 ), ( 1, 90, 90 ) ); + spawncollision( "collision_physics_64x64x128", "collider", ( -1407, -365, 733 ), ( 1, 90, 90 ) ); + spawncollision( "collision_physics_64x64x128", "collider", ( -1278, -365, 733 ), ( 1, 90, 90 ) ); + spawncollision( "collision_slums_curved_wall", "collider", ( 1258.5, -445, 558.5 ), ( 0, 0, 0 ) ); + spawncollision( "collision_slums_curved_wall_bullet", "collider", ( 1258.5, -445, 558.5 ), ( 0, 0, 0 ) ); + balconymetal1 = spawn( "script_model", ( -778, -1922.37, 990.03 ) ); + balconymetal1.angles = ( 0, 270, -90 ); + balconymetal2 = spawn( "script_model", ( -743, -1922.37, 989.03 ) ); + balconymetal2.angles = ( 0, 270, -90 ); + balconymetal3 = spawn( "script_model", ( -1088, -1147.37, 1015.03 ) ); + balconymetal3.angles = ( 0, 270, -90 ); + balconymetal4 = spawn( "script_model", ( -1053, -1147.37, 1014.03 ) ); + balconymetal4.angles = ( 0, 270, -90 ); + balconymetal1 setmodel( "p_glo_corrugated_metal1" ); + balconymetal2 setmodel( "p_glo_corrugated_metal1" ); + balconymetal3 setmodel( "p_glo_corrugated_metal1" ); + balconymetal4 setmodel( "p_glo_corrugated_metal1" ); + crate1 = spawn( "script_model", ( 1530, -1738, 493 ) ); + crate1.angles = ( 354.4, 270, -16 ); + prop1 = spawn( "script_model", ( 1936.37, -1924.03, 470 ) ); + prop1.angles = ( 89, 179.6, 180 ); + prop2 = spawn( "script_model", ( 1876.37, -1923.03, 471.005 ) ); + prop2.angles = ( 89, 179.6, 180 ); + prop3 = spawn( "script_model", ( 1783.37, -1922.03, 472 ) ); + prop3.angles = ( 89, 179.6, 180 ); + prop4 = spawn( "script_model", ( 1707.37, -1924.03, 486.001 ) ); + prop4.angles = ( 72, 179.6, 180 ); + crate1 setmodel( "me_ac_window" ); + prop1 setmodel( "p_glo_corrugated_metal1" ); + prop2 setmodel( "p_glo_corrugated_metal1" ); + prop3 setmodel( "p_glo_corrugated_metal1" ); + prop4 setmodel( "p_glo_corrugated_metal1" ); + fencemetal1 = spawn( "script_model", ( -719, -2557, 532 ) ); + fencemetal1.angles = ( 90, 333.5, -26.5 ); + fencemetal1 setmodel( "me_corrugated_metal8x8_holes" ); + fencemetal1 = spawn( "script_model", ( -798, -2556, 532 ) ); + fencemetal1.angles = ( 90, 333.5, -26.5 ); + fencemetal1 setmodel( "me_corrugated_metal8x8_holes" ); + fencemetal1 = spawn( "script_model", ( -885, -2557, 532 ) ); + fencemetal1.angles = ( 90, 153.5, -26.5 ); + fencemetal1 setmodel( "me_corrugated_metal8x8_holes" ); + fencemetal1 = spawn( "script_model", ( -975, -2556, 532 ) ); + fencemetal1.angles = ( 90, 333.5, -26.5 ); + fencemetal1 setmodel( "me_corrugated_metal8x8_holes" ); + spawncollision( "collision_physics_512x512x512", "collider", ( 1435, 2393, 780 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_64x64x64", "collider", ( 1371, 2229, 1044 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_64x64x64", "collider", ( 1371, 2253, 1044 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_64x64x64", "collider", ( 1234, 2229, 1102 ), vectorscale( ( 0, 1, 0 ), 315.2 ) ); + spawncollision( "collision_physics_64x64x64", "collider", ( 884, 1602, 1019 ), vectorscale( ( 0, 1, 0 ), 270.0 ) ); + spawncollision( "collision_physics_64x64x64", "collider", ( 908, 1602, 1019 ), vectorscale( ( 0, 1, 0 ), 270.0 ) ); + spawncollision( "collision_physics_64x64x64", "collider", ( 883, 1732, 1073 ), vectorscale( ( 0, 1, 0 ), 225.0 ) ); + spawncollision( "collision_physics_64x64x64", "collider", ( 1065.29, 1601.18, 1084.07 ), ( 315, 334.2, -4 ) ); + spawncollision( "collision_physics_64x64x64", "collider", ( 1106.29, 1581.18, 1129.07 ), ( 315, 334.2, -4 ) ); + spawncollision( "collision_physics_64x64x64", "collider", ( 1064.29, 1506.18, 1084.07 ), ( 315, 334.2, -4 ) ); + spawncollision( "collision_physics_64x64x64", "collider", ( 1105.29, 1486.18, 1129.07 ), ( 315, 334.2, -4 ) ); + spawncollision( "collision_physics_64x64x64", "collider", ( 1066.29, 1411.18, 1084.07 ), ( 315, 334.2, -4 ) ); + spawncollision( "collision_physics_64x64x64", "collider", ( 1107.29, 1391.18, 1129.07 ), ( 315, 334.2, -4 ) ); + spawncollision( "collision_physics_256x256x256", "collider", ( 1501, 1687, 812 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_256x256x256", "collider", ( 1722, 1687, 812 ), ( 0, 0, 0 ) ); + spawncollision( "collision_nosight_wall_64x64x10", "collider", ( -640, -2561, 523 ), ( 0, 0, 0 ) ); + middlevisblock1 = spawn( "script_model", ( 348, -66, 672 ) ); + middlevisblock1.angles = ( 6.30742, 309.785, -7.51566 ); + middlevisblock1 setmodel( "me_corrugated_metal8x8" ); + spawncollision( "collision_physics_32x32x128", "collider", ( -1011.5, -641.5, 801 ), ( 315, 0, -90 ) ); + spawncollision( "collision_physics_32x32x128", "collider", ( -1011.5, -541.5, 801 ), ( 315, 0, -90 ) ); + spawncollision( "collision_physics_32x32x128", "collider", ( -1011.5, -439, 801 ), ( 315, 0, -90 ) ); + spawncollision( "collision_physics_32x32x128", "collider", ( -997.5, -641.5, 781.5 ), ( 330, 0, -90 ) ); + spawncollision( "collision_physics_32x32x128", "collider", ( -997.5, -541.5, 781.5 ), ( 330, 0, -90 ) ); + spawncollision( "collision_physics_32x32x128", "collider", ( -997.5, -439, 781.5 ), ( 330, 0, -90 ) ); + spawncollision( "collision_physics_32x32x128", "collider", ( -1026, -641.5, 781.5 ), ( 330, 180, 90 ) ); + spawncollision( "collision_physics_32x32x128", "collider", ( -1026, -541.5, 781.5 ), ( 330, 180, 90 ) ); + spawncollision( "collision_physics_32x32x128", "collider", ( -1026, -439, 781.5 ), ( 330, 180, 90 ) ); + spawncollision( "collision_physics_32x32x32", "collider", ( -211, -972.5, 578 ), vectorscale( ( 0, 1, 0 ), 335.8 ) ); + spawncollision( "collision_nosight_wall_64x64x10", "collider", ( -636, -2562.5, 511 ), ( 0, 0, 0 ) ); + spawncollision( "collision_nosight_wall_64x64x10", "collider", ( -699.5, -2562.5, 511 ), ( 0, 0, 0 ) ); + spawncollision( "collision_nosight_wall_64x64x10", "collider", ( -763.5, -2562.5, 511 ), ( 0, 0, 0 ) ); + spawncollision( "collision_nosight_wall_64x64x10", "collider", ( -827.5, -2562.5, 511 ), ( 0, 0, 0 ) ); + spawncollision( "collision_nosight_wall_64x64x10", "collider", ( -636, -2562.5, 478 ), ( 0, 0, 0 ) ); + spawncollision( "collision_nosight_wall_64x64x10", "collider", ( -699.5, -2562.5, 478 ), ( 0, 0, 0 ) ); + spawncollision( "collision_nosight_wall_64x64x10", "collider", ( -763.5, -2562.5, 478 ), ( 0, 0, 0 ) ); + spawncollision( "collision_nosight_wall_64x64x10", "collider", ( -827.5, -2562.5, 478 ), ( 0, 0, 0 ) ); + prayerflags1 = spawn( "script_model", ( -967.622, -309.912, 794 ) ); + prayerflags1.angles = vectorscale( ( 0, 1, 0 ), 350.8 ); + prayerflags1 setmodel( "intro_prayer_flags_unspecific_01" ); + prayerflags2 = spawn( "script_model", ( -1065.16, -318.731, 833 ) ); + prayerflags2.angles = vectorscale( ( 0, 1, 0 ), 14.4 ); + prayerflags2 setmodel( "intro_prayer_flags_unspecific_01" ); + level.levelkillbrushes = []; + level.levelkillbrushes[level.levelkillbrushes.size] = spawn( "trigger_radius", ( -1673, 252, 526 ), 0, 550, 322 ); + spawncollision( "collision_physics_wall_128x128x10", "collider", ( -1171.5, -2502.5, 493.5 ), vectorscale( ( 0, 1, 0 ), 270.0 ) ); + spawncollision( "collision_physics_wall_128x128x10", "collider", ( -1231, -2502.5, 560.5 ), ( 6.83, 180, -90 ) ); + spawncollision( "collision_physics_wall_128x128x10", "collider", ( -1358.5, -2502.5, 560.5 ), ( 6.83, 180, -90 ) ); + blueroombrick = spawn( "script_model", ( -278.458, -803.132, 618.922 ) ); + blueroombrick.angles = ( 89.6232, 39.6618, 24.4607 ); + blueroombrick setmodel( "prop_brick_single_v2" ); + blueroombrick2 = spawn( "script_model", ( -284.21, -805.13, 618.92 ) ); + blueroombrick2.angles = ( 89.6232, 39.6618, 24.4607 ); + blueroombrick2 setmodel( "prop_brick_single_v2" ); + blueroombrick3 = spawn( "script_model", ( -278.46, -803.88, 643.17 ) ); + blueroombrick3.angles = ( 89.6232, 39.6618, 24.4607 ); + blueroombrick3 setmodel( "prop_brick_single_v2" ); + spawncollision( "collision_physics_32x32x32", "collider", ( 997.5, 633, 589 ), vectorscale( ( 0, 1, 0 ), 16.6 ) ); + spawncollision( "collision_physics_wall_64x64x10", "collider", ( -253, -374, 565 ), ( 4.27, 270, -35.9 ) ); + spawncollision( "collision_physics_wall_64x64x10", "collider", ( -253, -406, 565 ), ( 4.27, 270, -35.9 ) ); + spawncollision( "collision_physics_wall_64x64x10", "collider", ( -232.5, -374.455, 573.211 ), ( 346.3, 270, -0.39995 ) ); + spawncollision( "collision_physics_wall_64x64x10", "collider", ( -232.5, -405.545, 580.789 ), ( 346.3, 270, -0.39995 ) ); + spawncollision( "collision_physics_32x32x32", "collider", ( 726.5, 998.5, 607.5 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_32x32x32", "collider", ( 726.5, 967.5, 607.5 ), ( 0, 0, 0 ) ); + level.remotemotarviewleft = 30; + level.remotemotarviewright = 30; + level.remotemotarviewup = 10; + level.remotemotarviewdown = 25; } -levelspawndvars( reset_dvars ) //checked matches cerberus output +levelspawndvars( reset_dvars ) { - ss = level.spawnsystem; - ss.enemy_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_radius", "2500", reset_dvars ); + ss = level.spawnsystem; + ss.enemy_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_radius", "2500", reset_dvars ); } - diff --git a/Multiplayer Core/patch_mp/maps/mp/mp_socotra.gsc b/Multiplayer Core/patch_mp/maps/mp/mp_socotra.gsc index b74faae..9befbda 100644 --- a/Multiplayer Core/patch_mp/maps/mp/mp_socotra.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/mp_socotra.gsc @@ -1,87 +1,86 @@ -//checked includes changed to match cerberus output -#include maps/mp/gametypes/_spawning; -#include maps/mp/mp_socotra_amb; -#include maps/mp/_compass; -#include maps/mp/_load; -#include maps/mp/mp_socotra_fx; -#include maps/mp/_utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\_utility; +#include maps\mp\mp_socotra_fx; +#include maps\mp\_load; +#include maps\mp\_compass; +#include maps\mp\mp_socotra_amb; +#include maps\mp\gametypes\_spawning; -main() //checked changed to match cerberus output +main() { - level.levelspawndvars = ::levelspawndvars; - maps/mp/mp_socotra_fx::main(); - precachemodel( "collision_physics_64x64x64" ); - precachemodel( "collision_physics_32x32x128" ); - precachemodel( "collision_physics_wall_256x256x256" ); - precachemodel( "collision_physics_wall_128x128x10" ); - precachemodel( "collision_clip_128x128x128" ); - precachemodel( "collision_physics_512x512x10" ); - precachemodel( "p6_wood_plank_rustic01_2x12_96" ); - maps/mp/_load::main(); - maps/mp/_compass::setupminimap( "compass_map_mp_socotra" ); - maps/mp/mp_socotra_amb::main(); - setheliheightpatchenabled( "war_mode_heli_height_lock", 0 ); - spawncollision( "collision_physics_64x64x64", "collider", ( -63, -2135, 47 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_128x128x128", "collider", ( 1922, -202, 139 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_256x256x256", "collider", ( 1826, -263, 25 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_256x256x256", "collider", ( 1998, -256, -26 ), vectorScale( ( 0, 1, 0 ), 341.4 ) ); - spawncollision( "collision_physics_wall_128x128x10", "collider", ( -1636, -391, 353 ), vectorScale( ( 0, 1, 0 ), 52 ) ); - spawncollision( "collision_physics_128x128x128", "collider", ( 213, 3058, 745 ), vectorScale( ( 0, 1, 0 ), 11.4 ) ); - spawncollision( "collision_physics_128x128x128", "collider", ( 6, 3052, 757 ), vectorScale( ( 0, 1, 0 ), 11.4 ) ); - spawncollision( "collision_physics_128x128x128", "collider", ( 1360, 2049, 498 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_wall_128x128x10", "collider", ( 2208, 1940, 1116 ), ( 0, 0, 0 ) ); - spawncollision( "collision_clip_128x128x128", "collider", ( 1586, 192, 81 ), ( 311.643, 43.2677, 5.16974 ) ); - spawncollision( "collision_clip_128x128x128", "collider", ( 1631, 229, 142 ), vectorScale( ( 0, 1, 0 ), 44.4 ) ); - spawncollision( "collision_clip_128x128x128", "collider", ( 1631, 229, 270 ), vectorScale( ( 0, 1, 0 ), 44.4 ) ); - spawncollision( "collision_clip_128x128x128", "collider", ( 1631, 229, 398 ), vectorScale( ( 0, 1, 0 ), 44.4 ) ); - spawncollision( "collision_clip_128x128x128", "collider", ( 1631, 229, 526 ), vectorScale( ( 0, 1, 0 ), 44.4 ) ); - spawncollision( "collision_physics_256x256x256", "collider", ( -819, 2061, 227 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_256x256x256", "collider", ( -819, 1804, 227 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_512x512x10", "collider", ( -921.363, 1719.01, 26.6748 ), ( 313, 359.6, 13.2 ) ); - spawncollision( "collision_physics_32x32x128", "collider", ( 40, 50, 69 ), ( 303.214, 312.283, 99.131 ) ); - spawncollision( "collision_physics_32x32x128", "collider", ( 146, 224, 89 ), ( 302.856, 333.349, 97.5482 ) ); - spawncollision( "collision_physics_32x32x128", "collider", ( 172, 382, 107 ), ( 302.856, 353.549, 97.5482 ) ); - spawncollision( "collision_physics_32x32x128", "collider", ( 526, -2, 74 ), ( 302.387, 100.157, -69.419 ) ); - spawncollision( "collision_physics_32x32x128", "collider", ( 380, -103, 90 ), ( 286.432, 125.086, -81.861 ) ); - spawncollision( "collision_physics_wall_128x128x10", "collider", ( 640, 1325, 289 ), ( 0, 0, 0 ) ); - roofboard1 = spawn( "script_model", ( -133, 602, 521 ) ); - roofboard1.angles = vectorScale( ( 0, 0, 0 ), 270 ); - roofboard1 setmodel( "p6_wood_plank_rustic01_2x12_96" ); - roofboard2 = spawn( "script_model", ( -133, 507, 521 ) ); - roofboard2.angles = vectorScale( ( 0, 0, 0 ), 270 ); - roofboard2 setmodel( "p6_wood_plank_rustic01_2x12_96" ); - roofboard3 = spawn( "script_model", ( -133, 412, 521 ) ); - roofboard3.angles = vectorScale( ( 0, 0, 0 ), 270 ); - roofboard3 setmodel( "p6_wood_plank_rustic01_2x12_96" ); - roofboard4 = spawn( "script_model", ( -133, 375, 522.5 ) ); - roofboard4.angles = vectorScale( ( 0, 0, 0 ), 270 ); - roofboard4 setmodel( "p6_wood_plank_rustic01_2x12_96" ); - spawncollision( "collision_physics_128x128x128", "collider", ( -970, 968.5, 407.5 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_128x128x128", "collider", ( -970, 841, 407.5 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_128x128x128", "collider", ( -842, 841, 407.5 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_128x128x128", "collider", ( -842, 968.5, 407.5 ), ( 0, 0, 0 ) ); - maps/mp/gametypes/_spawning::level_use_unified_spawning( 1 ); - rts_remove(); - level.remotemotarviewleft = 30; - level.remotemotarviewright = 30; - level.remotemotarviewup = 18; + level.levelspawndvars = ::levelspawndvars; + maps\mp\mp_socotra_fx::main(); + precachemodel( "collision_physics_64x64x64" ); + precachemodel( "collision_physics_32x32x128" ); + precachemodel( "collision_physics_wall_256x256x256" ); + precachemodel( "collision_physics_wall_128x128x10" ); + precachemodel( "collision_clip_128x128x128" ); + precachemodel( "collision_physics_512x512x10" ); + precachemodel( "p6_wood_plank_rustic01_2x12_96" ); + maps\mp\_load::main(); + maps\mp\_compass::setupminimap( "compass_map_mp_socotra" ); + maps\mp\mp_socotra_amb::main(); + setheliheightpatchenabled( "war_mode_heli_height_lock", 0 ); + spawncollision( "collision_physics_64x64x64", "collider", ( -63, -2135, 47 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_128x128x128", "collider", ( 1922, -202, 139 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_256x256x256", "collider", ( 1826, -263, 25 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_256x256x256", "collider", ( 1998, -256, -26 ), vectorscale( ( 0, 1, 0 ), 341.4 ) ); + spawncollision( "collision_physics_wall_128x128x10", "collider", ( -1636, -391, 353 ), vectorscale( ( 0, 1, 0 ), 52.0 ) ); + spawncollision( "collision_physics_128x128x128", "collider", ( 213, 3058, 745 ), vectorscale( ( 0, 1, 0 ), 11.4 ) ); + spawncollision( "collision_physics_128x128x128", "collider", ( 6, 3052, 757 ), vectorscale( ( 0, 1, 0 ), 11.4 ) ); + spawncollision( "collision_physics_128x128x128", "collider", ( 1360, 2049, 498 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_wall_128x128x10", "collider", ( 2208, 1940, 1116 ), ( 0, 0, 0 ) ); + spawncollision( "collision_clip_128x128x128", "collider", ( 1586, 192, 81 ), ( 311.643, 43.2677, 5.16974 ) ); + spawncollision( "collision_clip_128x128x128", "collider", ( 1631, 229, 142 ), vectorscale( ( 0, 1, 0 ), 44.4 ) ); + spawncollision( "collision_clip_128x128x128", "collider", ( 1631, 229, 270 ), vectorscale( ( 0, 1, 0 ), 44.4 ) ); + spawncollision( "collision_clip_128x128x128", "collider", ( 1631, 229, 398 ), vectorscale( ( 0, 1, 0 ), 44.4 ) ); + spawncollision( "collision_clip_128x128x128", "collider", ( 1631, 229, 526 ), vectorscale( ( 0, 1, 0 ), 44.4 ) ); + spawncollision( "collision_physics_256x256x256", "collider", ( -819, 2061, 227 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_256x256x256", "collider", ( -819, 1804, 227 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_512x512x10", "collider", ( -921.363, 1719.01, 26.6748 ), ( 313, 359.6, 13.2 ) ); + spawncollision( "collision_physics_32x32x128", "collider", ( 40, 50, 69 ), ( 303.214, 312.283, 99.131 ) ); + spawncollision( "collision_physics_32x32x128", "collider", ( 146, 224, 89 ), ( 302.856, 333.349, 97.5482 ) ); + spawncollision( "collision_physics_32x32x128", "collider", ( 172, 382, 107 ), ( 302.856, 353.549, 97.5482 ) ); + spawncollision( "collision_physics_32x32x128", "collider", ( 526, -2, 74 ), ( 302.387, 100.157, -69.419 ) ); + spawncollision( "collision_physics_32x32x128", "collider", ( 380, -103, 90 ), ( 286.432, 125.086, -81.861 ) ); + spawncollision( "collision_physics_wall_128x128x10", "collider", ( 640, 1325, 289 ), ( 0, 0, 0 ) ); + roofboard1 = spawn( "script_model", ( -133, 602, 521 ) ); + roofboard1.angles = vectorscale( ( 0, 1, 0 ), 270.0 ); + roofboard1 setmodel( "p6_wood_plank_rustic01_2x12_96" ); + roofboard2 = spawn( "script_model", ( -133, 507, 521 ) ); + roofboard2.angles = vectorscale( ( 0, 1, 0 ), 270.0 ); + roofboard2 setmodel( "p6_wood_plank_rustic01_2x12_96" ); + roofboard3 = spawn( "script_model", ( -133, 412, 521 ) ); + roofboard3.angles = vectorscale( ( 0, 1, 0 ), 270.0 ); + roofboard3 setmodel( "p6_wood_plank_rustic01_2x12_96" ); + roofboard4 = spawn( "script_model", ( -133, 375, 522.5 ) ); + roofboard4.angles = vectorscale( ( 0, 1, 0 ), 270.0 ); + roofboard4 setmodel( "p6_wood_plank_rustic01_2x12_96" ); + spawncollision( "collision_physics_128x128x128", "collider", ( -970, 968.5, 407.5 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_128x128x128", "collider", ( -970, 841, 407.5 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_128x128x128", "collider", ( -842, 841, 407.5 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_128x128x128", "collider", ( -842, 968.5, 407.5 ), ( 0, 0, 0 ) ); + maps\mp\gametypes\_spawning::level_use_unified_spawning( 1 ); + rts_remove(); + level.remotemotarviewleft = 30; + level.remotemotarviewright = 30; + level.remotemotarviewup = 18; } -levelspawndvars( reset_dvars ) //checked matches cerberus output +levelspawndvars( reset_dvars ) { - ss = level.spawnsystem; - ss.enemy_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_radius", "2200", reset_dvars ); + ss = level.spawnsystem; + ss.enemy_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_radius", "2200", reset_dvars ); } -rts_remove() //checked changed to match cerberus output +rts_remove() { - rtsfloors = getentarray( "overwatch_floor", "targetname" ); - foreach ( rtsfloor in rtsfloors ) - { - if ( isDefined( rtsfloor ) ) - { - rtsfloor delete(); - } - } -} + rtsfloors = getentarray( "overwatch_floor", "targetname" ); + foreach ( rtsfloor in rtsfloors ) + { + if ( isdefined( rtsfloor ) ) + rtsfloor delete(); + } +} diff --git a/Multiplayer Core/patch_mp/maps/mp/mp_studio.gsc b/Multiplayer Core/patch_mp/maps/mp/mp_studio.gsc index 64b0a69..4becbfd 100644 --- a/Multiplayer Core/patch_mp/maps/mp/mp_studio.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/mp_studio.gsc @@ -1,382 +1,373 @@ -//checked includes changed to match cerberus output -#include maps/mp/_tacticalinsertion; -#include maps/mp/gametypes/_weaponobjects; -#include maps/mp/mp_studio_amb; -#include maps/mp/_compass; -#include maps/mp/_load; -#include maps/mp/mp_studio_fx; -#include maps/mp/_utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\_utility; +#include maps\mp\mp_studio_fx; +#include maps\mp\_load; +#include maps\mp\_compass; +#include maps\mp\mp_studio_amb; +#include maps\mp\gametypes\_weaponobjects; +#include maps\mp\_tacticalinsertion; -main() //checked matches cerberus output +main() { - level.levelspawndvars = ::levelspawndvars; - maps/mp/mp_studio_fx::main(); - maps/mp/_load::main(); - maps/mp/_compass::setupminimap( "compass_map_mp_studio" ); - maps/mp/mp_studio_amb::main(); - setdvar( "compassmaxrange", "2100" ); - game[ "strings" ][ "war_callsign_a" ] = &"MPUI_CALLSIGN_MAPNAME_A"; - game[ "strings" ][ "war_callsign_b" ] = &"MPUI_CALLSIGN_MAPNAME_B"; - game[ "strings" ][ "war_callsign_c" ] = &"MPUI_CALLSIGN_MAPNAME_C"; - game[ "strings" ][ "war_callsign_d" ] = &"MPUI_CALLSIGN_MAPNAME_D"; - game[ "strings" ][ "war_callsign_e" ] = &"MPUI_CALLSIGN_MAPNAME_E"; - game[ "strings_menu" ][ "war_callsign_a" ] = "@MPUI_CALLSIGN_MAPNAME_A"; - game[ "strings_menu" ][ "war_callsign_b" ] = "@MPUI_CALLSIGN_MAPNAME_B"; - game[ "strings_menu" ][ "war_callsign_c" ] = "@MPUI_CALLSIGN_MAPNAME_C"; - game[ "strings_menu" ][ "war_callsign_d" ] = "@MPUI_CALLSIGN_MAPNAME_D"; - game[ "strings_menu" ][ "war_callsign_e" ] = "@MPUI_CALLSIGN_MAPNAME_E"; - level.destructible_callbacks[ "remove_streamers" ] = ::death_streamer_think; - alleytrigger = getent( "alleyTrigger", "targetname" ); - windowtrigger = getent( "triggerwindowTarget", "targetname" ); - target7 = getent( "trailerTarget_Window", "targetname" ); - target8 = getent( "alleyTarget_Cover", "targetname" ); - target9 = getent( "alleyTarget_Path", "targetname" ); - targetlight1_off = getent( "steelBuildingTargetLight1_off", "targetname" ); - targetlight1_on = getent( "steelBuildingTargetLight1_on", "targetname" ); - targetlight2_off = getent( "steelBuildingTargetLight2_off", "targetname" ); - targetlight2_on = getent( "steelBuildingTargetLight2_on", "targetname" ); - level.const_fx_exploder_red_light_1 = 1001; - level.const_fx_exploder_red_light_2 = 1002; - speaker1 = getent( "loudspeaker1", "targetname" ); - speaker2 = getent( "loudspeaker2", "targetname" ); - targetlight1_on hide(); - targetlight2_on hide(); - target8 setcandamage( 1 ); - target9 setcandamage( 1 ); - target8 thread damagetarget( 2 ); - target9 thread damagetarget( 2 ); - target7 thread movetarget( 7, ( 57, 23, 0 ), 3 ); - target8 thread movetarget( 1, 240, 10 ); - target9 thread movetarget( 1, 130, 8,6 ); - alleytrigger thread triggercheck( target9 ); - windowtrigger thread triggercheck( target7 ); + level.levelspawndvars = ::levelspawndvars; + maps\mp\mp_studio_fx::main(); + maps\mp\_load::main(); + maps\mp\_compass::setupminimap( "compass_map_mp_studio" ); + maps\mp\mp_studio_amb::main(); + setdvar( "compassmaxrange", "2100" ); + game["strings"]["war_callsign_a"] = &"MPUI_CALLSIGN_MAPNAME_A"; + game["strings"]["war_callsign_b"] = &"MPUI_CALLSIGN_MAPNAME_B"; + game["strings"]["war_callsign_c"] = &"MPUI_CALLSIGN_MAPNAME_C"; + game["strings"]["war_callsign_d"] = &"MPUI_CALLSIGN_MAPNAME_D"; + game["strings"]["war_callsign_e"] = &"MPUI_CALLSIGN_MAPNAME_E"; + game["strings_menu"]["war_callsign_a"] = "@MPUI_CALLSIGN_MAPNAME_A"; + game["strings_menu"]["war_callsign_b"] = "@MPUI_CALLSIGN_MAPNAME_B"; + game["strings_menu"]["war_callsign_c"] = "@MPUI_CALLSIGN_MAPNAME_C"; + game["strings_menu"]["war_callsign_d"] = "@MPUI_CALLSIGN_MAPNAME_D"; + game["strings_menu"]["war_callsign_e"] = "@MPUI_CALLSIGN_MAPNAME_E"; + level.destructible_callbacks["remove_streamers"] = ::death_streamer_think; + alleytrigger = getent( "alleyTrigger", "targetname" ); + windowtrigger = getent( "triggerwindowTarget", "targetname" ); + target7 = getent( "trailerTarget_Window", "targetname" ); + target8 = getent( "alleyTarget_Cover", "targetname" ); + target9 = getent( "alleyTarget_Path", "targetname" ); + targetlight1_off = getent( "steelBuildingTargetLight1_off", "targetname" ); + targetlight1_on = getent( "steelBuildingTargetLight1_on", "targetname" ); + targetlight2_off = getent( "steelBuildingTargetLight2_off", "targetname" ); + targetlight2_on = getent( "steelBuildingTargetLight2_on", "targetname" ); + level.const_fx_exploder_red_light_1 = 1001; + level.const_fx_exploder_red_light_2 = 1002; + speaker1 = getent( "loudspeaker1", "targetname" ); + speaker2 = getent( "loudspeaker2", "targetname" ); + targetlight1_on hide(); + targetlight2_on hide(); + target8 setcandamage( 1 ); + target9 setcandamage( 1 ); + target8 thread damagetarget( 2 ); + target9 thread damagetarget( 2 ); + target7 thread movetarget( 7, ( 57, 23, 0 ), 3 ); + target8 thread movetarget( 1, 240, 10 ); + target9 thread movetarget( 1, 130, 8.6 ); + alleytrigger thread triggercheck( target9 ); + windowtrigger thread triggercheck( target7 ); } -levelspawndvars( reset_dvars ) //checked matches cerberus output +levelspawndvars( reset_dvars ) { - ss = level.spawnsystem; - ss.enemy_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_radius", "1900", reset_dvars ); + ss = level.spawnsystem; + ss.enemy_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_radius", "1900", reset_dvars ); } -triggercheck( target ) //checked changed to match cerberus output +triggercheck( target ) { - self endon( "game_ended" ); - while ( 1 ) - { - self waittill( "trigger", player ); - distance = distance( target.origin, self.origin ); - if ( distance <= 90 ) - { - target notify( "targetStopMoving" ); - while ( isDefined( player ) && player istouching( self ) && distance <= 90 ) - { - if ( distancesquared( target.origin, target.railpoints[ 0 ] ) < distancesquared( player.origin, target.railpoints[ 0 ] ) ) - { - target.preferrednextpos = 0; - } - else - { - target.preferrednextpos = 1; - } - wait 0.25; - } - } - } + self endon( "game_ended" ); + + while ( true ) + { + self waittill( "trigger", player ); + + distance = distance( target.origin, self.origin ); + + if ( distance <= 90 ) + { + target notify( "targetStopMoving" ); + + while ( isdefined( player ) && player istouching( self ) && distance <= 90 ) + { + if ( distancesquared( target.origin, target.railpoints[0] ) < distancesquared( player.origin, target.railpoints[0] ) ) + target.preferrednextpos = 0; + else + target.preferrednextpos = 1; + + wait 0.25; + } + } + } } -damagetarget( dir ) //checked changed to match cerberus output +damagetarget( dir ) { - self endon( "game_ended" ); - while ( 1 ) - { - self waittill( "damage", damage, attacker, direction ); - switch( dir ) - { - case 1: - self rotateroll( self.angles[ 1 ] + 90, 0,1 ); - wait 0.2; - self rotateroll( self.angles[ 1 ] - 90, 0,1 ); - wait 0.2; - self playsound( "amb_target_flip" ); - break; - case 2: - rotation = 1; - if ( isDefined( attacker ) && isplayer( attacker ) ) - { - yaw = get2dyaw( attacker.origin, self.origin ); - if ( attacker.angles[ 1 ] > yaw ) - { - rotation = -1; - } - } - self rotateyaw( self.angles[ 2 ] + ( 180 * rotation ), 0,3 ); - self playsound( "amb_target_twirl" ); - self waittill( "rotatedone" ); - break; - case 3: - self rotatepitch( self.angles[ 1 ] + 90, 0,1 ); - wait 0.2; - self rotatepitch( self.angles[ 1 ] - 90, 0,1 ); - wait 0.2; - self playsound( "amb_target_flip" ); - break; - case 4: - self rotateroll( self.angles[ 1 ] - 90, 0,1 ); - wait 0.2; - self rotateroll( self.angles[ 1 ] + 90, 0,1 ); - wait 0.2; - self playsound( "amb_target_flip" ); - break; - case 5: - self rotatepitch( self.angles[ 1 ] - 90, 0,1 ); - wait 0.2; - self rotatepitch( self.angles[ 1 ] + 90, 0,1 ); - wait 0.2; - self playsound( "amb_target_flip" ); - break; - } - } + self endon( "game_ended" ); + + while ( true ) + { + self waittill( "damage", damage, attacker, direction ); + + switch ( dir ) + { + case "1": + self rotateroll( self.angles[1] + 90, 0.1 ); + wait 0.2; + self rotateroll( self.angles[1] - 90, 0.1 ); + wait 0.2; + self playsound( "amb_target_flip" ); + break; + case "2": + rotation = 1; + + if ( isdefined( attacker ) && isplayer( attacker ) ) + { + yaw = get2dyaw( attacker.origin, self.origin ); + + if ( attacker.angles[1] > yaw ) + rotation = -1; + } + + self rotateyaw( self.angles[2] + 180 * rotation, 0.3 ); + self playsound( "amb_target_twirl" ); + + self waittill( "rotatedone" ); + + break; + case "3": + self rotatepitch( self.angles[1] + 90, 0.1 ); + wait 0.2; + self rotatepitch( self.angles[1] - 90, 0.1 ); + wait 0.2; + self playsound( "amb_target_flip" ); + break; + case "4": + self rotateroll( self.angles[1] - 90, 0.1 ); + wait 0.2; + self rotateroll( self.angles[1] + 90, 0.1 ); + wait 0.2; + self playsound( "amb_target_flip" ); + break; + case "5": + self rotatepitch( self.angles[1] - 90, 0.1 ); + wait 0.2; + self rotatepitch( self.angles[1] + 90, 0.1 ); + wait 0.2; + self playsound( "amb_target_flip" ); + break; + } + } } -damagetargetlights( light_on, light_off, speaker, alias, exploderhandle ) //checked matches cerberus output +damagetargetlights( light_on, light_off, speaker, alias, exploderhandle ) { - self endon( "game_ended" ); - while ( 1 ) - { - self waittill( "damage" ); - speaker playsound( alias ); - exploder( exploderhandle ); - light_off hide(); - light_on show(); - wait 0.5; - exploder_stop( exploderhandle ); - light_off show(); - light_on hide(); - } + self endon( "game_ended" ); + + while ( true ) + { + self waittill( "damage" ); + + speaker playsound( alias ); + exploder( exploderhandle ); + light_off hide(); + light_on show(); + wait 0.5; + exploder_stop( exploderhandle ); + light_off show(); + light_on hide(); + } } -movetarget( dir, dis, speed ) //checked matches cerberus output +movetarget( dir, dis, speed ) { - self endon( "game_ended" ); - keepmoving = 1; - self thread movement_process(); - startpos = self.origin; - farpos = self.origin; - sound = spawn( "script_origin", self.origin ); - sound linkto( self ); - sound playloopsound( "amb_target_chain" ); - switch( dir ) - { - case 1: - farpos = self.origin + ( 0, dis, 0 ); - break; - case 2: - farpos = self.origin - ( 0, dis, 0 ); - break; - case 3: - farpos = self.origin + ( dis, 0, 0 ); - break; - case 4: - farpos = self.origin - ( dis, 0, 0 ); - break; - case 5: - farpos = self.origin + ( 0, 0, dis ); - break; - case 6: - farpos = self.origin - ( 0, 0, dis ); - break; - case 7: - farpos = self.origin - dis; - break; - } - self.railpoints = []; - self.railpoints[ 0 ] = startpos; - self.railpoints[ 1 ] = farpos; - self.preferrednextpos = 1; - self.playertrigger = 0; - while ( 1 ) - { - nextpos = self.railpoints[ self.preferrednextpos ]; - if ( self.preferrednextpos == 0 ) - { - self.preferrednextpos = 1; - } - else - { - self.preferrednextpos = 0; - } - self moveto( nextpos, speed ); - self waittill_either( "movedone", "targetStopMoving" ); - self playsound( "amb_target_stop" ); - } + self endon( "game_ended" ); + keepmoving = 1; + self thread movement_process(); + startpos = self.origin; + farpos = self.origin; + sound = spawn( "script_origin", self.origin ); + sound linkto( self ); + sound playloopsound( "amb_target_chain" ); + + switch ( dir ) + { + case "1": + farpos = self.origin + ( 0, dis, 0 ); + break; + case "2": + farpos = self.origin - ( 0, dis, 0 ); + break; + case "3": + farpos = self.origin + ( dis, 0, 0 ); + break; + case "4": + farpos = self.origin - ( dis, 0, 0 ); + break; + case "5": + farpos = self.origin + ( 0, 0, dis ); + break; + case "6": + farpos = self.origin - ( 0, 0, dis ); + break; + case "7": + farpos = self.origin - dis; + break; + } + + self.railpoints = []; + self.railpoints[0] = startpos; + self.railpoints[1] = farpos; + self.preferrednextpos = 1; + self.playertrigger = 0; + + while ( true ) + { + nextpos = self.railpoints[self.preferrednextpos]; + + if ( self.preferrednextpos == 0 ) + self.preferrednextpos = 1; + else + self.preferrednextpos = 0; + + self moveto( nextpos, speed ); + self waittill_either( "movedone", "targetStopMoving" ); + self playsound( "amb_target_stop" ); + } } -rotatetarget( dir, deg, speed, pausetime ) //checked changed to match cerberus output +rotatetarget( dir, deg, speed, pausetime ) { - self endon( "game_ended" ); - while ( 1 ) - { - switch( dir ) - { - case 1: - self rotateyaw( self.angles[ 2 ] + deg, speed ); - self playsound( "amb_target_rotate" ); - wait pausetime; - self rotateyaw( self.angles[ 2 ] - deg, speed ); - self playsound( "amb_target_rotate" ); - wait pausetime; - break; - case 2: - self rotateyaw( self.angles[ 2 ] - deg, speed ); - self playsound( "amb_target_rotate" ); - wait pausetime; - self rotateyaw( self.angles[ 2 ] + deg, speed ); - self playsound( "amb_target_rotate" ); - wait pausetime; - break; - case 3: - self rotateroll( self.angles[ 0 ] + deg, speed ); - self playsound( "amb_target_rotate" ); - wait pausetime; - self rotateroll( self.angles[ 0 ] - deg, speed ); - self playsound( "amb_target_rotate" ); - wait pausetime; - break; - case 4: - self rotateroll( self.angles[ 0 ] - deg, speed ); - self playsound( "amb_target_rotate" ); - wait pausetime; - self rotateroll( self.angles[ 0 ] + deg, speed ); - self playsound( "amb_target_rotate" ); - wait pausetime; - break; - case 5: - self rotateroll( self.angles[ 1 ] + deg, speed ); - self playsound( "amb_target_rotate" ); - wait pausetime; - self rotateroll( self.angles[ 1 ] - deg, speed ); - self playsound( "amb_target_rotate" ); - wait pausetime; - break; - case 6: - self rotatepitch( self.angles[ 1 ] - deg, speed ); - wait pausetime; - self rotatepitch( self.angles[ 1 ] + deg, speed ); - wait pausetime; - break; - case 7: - self rotateto( ( self.angles[ 0 ] + 90, self.angles[ 1 ] - 90, self.angles[ 2 ] + 45 ), speed ); - wait pausetime; - self rotateto( ( self.angles[ 0 ] - 90, self.angles[ 1 ] + 90, self.angles[ 2 ] - 45 ), speed ); - wait pausetime; - } - } + self endon( "game_ended" ); + + while ( true ) + { + switch ( dir ) + { + case "1": + self rotateyaw( self.angles[2] + deg, speed ); + self playsound( "amb_target_rotate" ); + wait( pausetime ); + self rotateyaw( self.angles[2] - deg, speed ); + self playsound( "amb_target_rotate" ); + wait( pausetime ); + break; + case "2": + self rotateyaw( self.angles[2] - deg, speed ); + self playsound( "amb_target_rotate" ); + wait( pausetime ); + self rotateyaw( self.angles[2] + deg, speed ); + self playsound( "amb_target_rotate" ); + wait( pausetime ); + break; + case "3": + self rotateroll( self.angles[0] + deg, speed ); + self playsound( "amb_target_rotate" ); + wait( pausetime ); + self rotateroll( self.angles[0] - deg, speed ); + self playsound( "amb_target_rotate" ); + wait( pausetime ); + break; + case "4": + self rotateroll( self.angles[0] - deg, speed ); + self playsound( "amb_target_rotate" ); + wait( pausetime ); + self rotateroll( self.angles[0] + deg, speed ); + self playsound( "amb_target_rotate" ); + wait( pausetime ); + break; + case "5": + self rotateroll( self.angles[1] + deg, speed ); + self playsound( "amb_target_rotate" ); + wait( pausetime ); + self rotateroll( self.angles[1] - deg, speed ); + self playsound( "amb_target_rotate" ); + wait( pausetime ); + break; + case "6": + self rotatepitch( self.angles[1] - deg, speed ); + wait( pausetime ); + self rotatepitch( self.angles[1] + deg, speed ); + wait( pausetime ); + break; + case "7": + self rotateto( ( self.angles[0] + 90, self.angles[1] - 90, self.angles[2] + 45 ), speed ); + wait( pausetime ); + self rotateto( ( self.angles[0] - 90, self.angles[1] + 90, self.angles[2] - 45 ), speed ); + wait( pausetime ); + } + } } -movement_process() //checked partially changed to match cerberus output see info.md +movement_process() { - for ( ;; ) - { - entities = getdamageableentarray( self.origin, 50 ); - i = 0; - while ( i < entities.size ) - { - if ( isDefined( entity.targetname ) || entity.targetname == "alleyTarget_Cover" && entity.targetname == "alleyTarget_Path" ) - { - i++; - continue; - } - if ( isplayer( entity ) ) - { - i++; - continue; - } - if ( !entity istouching( self ) ) - { - i++; - continue; - } - if ( isDefined( entity.classname ) && entity.classname == "grenade" ) - { - if ( !isDefined( entity.name ) ) - { - i++; - continue; - } - if ( !isDefined( entity.owner ) ) - { - i++; - continue; - } - if ( entity.name == "satchel_charge_mp" ) - { - if ( entity.origin[ 2 ] > ( self.origin[ 2 ] + 5 ) ) - { - i++; - continue; - } - } - watcher = entity.owner getwatcherforweapon( entity.name ); - if ( !isDefined( watcher ) ) - { - i++; - continue; - } - watcher thread maps/mp/gametypes/_weaponobjects::waitanddetonate( entity, 0, undefined ); - } - if ( isDefined( entity.targetname ) ) - { - if ( entity.targetname == "riotshield_mp" ) - { - entity dodamage( 1, self.origin + ( 0, 0, 1 ), self, self, 0, "MOD_CRUSH" ); - i++; - continue; - } - } - if ( isDefined( entity.model ) && entity.model == "t6_wpn_tac_insert_world" ) - { - entity thread maps/mp/_tacticalinsertion::fizzle(); - } - i++; - } - wait 0.25; - } + for (;;) + { + entities = getdamageableentarray( self.origin, 50 ); + + foreach ( entity in entities ) + { + if ( isdefined( entity.targetname ) && ( entity.targetname == "alleyTarget_Cover" || entity.targetname == "alleyTarget_Path" ) ) + continue; + + if ( isplayer( entity ) ) + continue; + + if ( !entity istouching( self ) ) + continue; + + if ( isdefined( entity.classname ) && entity.classname == "grenade" ) + { + if ( !isdefined( entity.name ) ) + continue; + + if ( !isdefined( entity.owner ) ) + continue; + + if ( entity.name == "satchel_charge_mp" ) + { + if ( entity.origin[2] > self.origin[2] + 5 ) + continue; + } + + watcher = entity.owner getwatcherforweapon( entity.name ); + + if ( !isdefined( watcher ) ) + continue; + + watcher thread maps\mp\gametypes\_weaponobjects::waitanddetonate( entity, 0.0, undefined ); + } + + if ( isdefined( entity.targetname ) ) + { + if ( entity.targetname == "riotshield_mp" ) + { + entity dodamage( 1, self.origin + ( 0, 0, 1 ), self, self, 0, "MOD_CRUSH" ); + continue; + } + } + + if ( isdefined( entity.model ) && entity.model == "t6_wpn_tac_insert_world" ) + entity thread maps\mp\_tacticalinsertion::fizzle(); + } + + wait 0.25; + } } -getwatcherforweapon( weapname ) //checked partially changed to match cerberus output see info.md +getwatcherforweapon( weapname ) { - if ( !isDefined( self ) ) - { - return undefined; - } - if ( !isplayer( self ) ) - { - return undefined; - } - i = 0; - while ( i < self.weaponobjectwatcherarray.size ) - { - if ( self.weaponobjectwatcherarray[ i ].weapon != weapname ) - { - i++; - continue; - } - return self.weaponobjectwatcherarray[ i ]; - i++; - } - return undefined; + if ( !isdefined( self ) ) + return undefined; + + if ( !isplayer( self ) ) + return undefined; + + for ( i = 0; i < self.weaponobjectwatcherarray.size; i++ ) + { + if ( self.weaponobjectwatcherarray[i].weapon != weapname ) + continue; + + return self.weaponobjectwatcherarray[i]; + } + + return undefined; } -death_streamer_think( notifytype, attacker ) //checked changed to match cerberus output +death_streamer_think( notifytype, attacker ) { - streamers = getentarray( "airconditioner_streamer", "targetname" ); - for ( i = 0; i < streamers.size; i++ ) - { - streamer = streamers[ i ]; - if ( distancesquared( streamer.origin, self.origin ) < 2500 ) - { - streamer delete(); - } - } -} + streamers = getentarray( "airconditioner_streamer", "targetname" ); + for ( i = 0; i < streamers.size; i++ ) + { + streamer = streamers[i]; + + if ( distancesquared( streamer.origin, self.origin ) < 2500 ) + streamer delete(); + } +} diff --git a/Multiplayer Core/patch_mp/maps/mp/mp_takeoff.gsc b/Multiplayer Core/patch_mp/maps/mp/mp_takeoff.gsc index 9a948d7..f47354a 100644 --- a/Multiplayer Core/patch_mp/maps/mp/mp_takeoff.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/mp_takeoff.gsc @@ -1,359 +1,355 @@ -//checked includes changed to match cerberus output -#include maps/mp/gametypes/_spawning; -#include maps/mp/_compass; -#include maps/mp/_load; -#include maps/mp/mp_takeoff_fx; -#include common_scripts/utility; -#include maps/mp/_events; -#include maps/mp/_utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\_utility; +#include maps\mp\_events; +#include common_scripts\utility; +#include maps\mp\mp_takeoff_fx; +#include maps\mp\_load; +#include maps\mp\_compass; +#include maps\mp\gametypes\_spawning; -main() //checked changed to match cerberus output +main() { - level.levelspawndvars = ::levelspawndvars; - level.overrideplayerdeathwatchtimer = ::leveloverridetime; - level.useintermissionpointsonwavespawn = ::useintermissionpointsonwavespawn; - maps/mp/mp_takeoff_fx::main(); - precachemodel( "collision_nosight_wall_64x64x10" ); - precachemodel( "collision_clip_wall_128x128x10" ); - precachemodel( "collision_mp_takeoff_solar_weap" ); - maps/mp/_load::main(); - maps/mp/_compass::setupminimap( "compass_map_mp_takeoff" ); - setdvar( "compassmaxrange", "2100" ); - game[ "strings" ][ "war_callsign_a" ] = &"MPUI_CALLSIGN_MAPNAME_A"; - game[ "strings" ][ "war_callsign_b" ] = &"MPUI_CALLSIGN_MAPNAME_B"; - game[ "strings" ][ "war_callsign_c" ] = &"MPUI_CALLSIGN_MAPNAME_C"; - game[ "strings" ][ "war_callsign_d" ] = &"MPUI_CALLSIGN_MAPNAME_D"; - game[ "strings" ][ "war_callsign_e" ] = &"MPUI_CALLSIGN_MAPNAME_E"; - game[ "strings_menu" ][ "war_callsign_a" ] = "@MPUI_CALLSIGN_MAPNAME_A"; - game[ "strings_menu" ][ "war_callsign_b" ] = "@MPUI_CALLSIGN_MAPNAME_B"; - game[ "strings_menu" ][ "war_callsign_c" ] = "@MPUI_CALLSIGN_MAPNAME_C"; - game[ "strings_menu" ][ "war_callsign_d" ] = "@MPUI_CALLSIGN_MAPNAME_D"; - game[ "strings_menu" ][ "war_callsign_e" ] = "@MPUI_CALLSIGN_MAPNAME_E"; - spawncollision( "collision_nosight_wall_64x64x10", "collider", ( -915, 790, 212 ), ( 0, 0, 0 ) ); - spawncollision( "collision_nosight_wall_64x64x10", "collider", ( -979, 790, 212 ), ( 0, 0, 0 ) ); - spawncollision( "collision_nosight_wall_64x64x10", "collider", ( -1043, 790, 212 ), ( 0, 0, 0 ) ); - spawncollision( "collision_nosight_wall_64x64x10", "collider", ( -1083, 790, 212 ), ( 0, 0, 0 ) ); - spawncollision( "collision_nosight_wall_64x64x10", "collider", ( -915, 790, 148 ), ( 0, 0, 0 ) ); - spawncollision( "collision_nosight_wall_64x64x10", "collider", ( -979, 790, 148 ), ( 0, 0, 0 ) ); - spawncollision( "collision_nosight_wall_64x64x10", "collider", ( -1043, 790, 148 ), ( 0, 0, 0 ) ); - spawncollision( "collision_nosight_wall_64x64x10", "collider", ( -1083, 790, 148 ), ( 0, 0, 0 ) ); - spawncollision( "collision_clip_wall_128x128x10", "collider", ( 136, 2511, 245.5 ), vectorScale( ( 0, 1, 0 ), 90 ) ); - spawncollision( "collision_mp_takeoff_solar_weap", "collider", ( 580, 3239.5, 32.5 ), ( 0, 1, 0 ) ); - maps/mp/gametypes/_spawning::level_use_unified_spawning( 1 ); - level thread dog_jump_think(); - level.disableoutrovisionset = 1; - level.mptakeoffrocket = getent( "takeoff_rocket", "targetname" ); - /* + level.levelspawndvars = ::levelspawndvars; + level.overrideplayerdeathwatchtimer = ::leveloverridetime; + level.useintermissionpointsonwavespawn = ::useintermissionpointsonwavespawn; + maps\mp\mp_takeoff_fx::main(); + precachemodel( "collision_nosight_wall_64x64x10" ); + precachemodel( "collision_clip_wall_128x128x10" ); + precachemodel( "collision_mp_takeoff_solar_weap" ); + maps\mp\_load::main(); + maps\mp\_compass::setupminimap( "compass_map_mp_takeoff" ); + setdvar( "compassmaxrange", "2100" ); + game["strings"]["war_callsign_a"] = &"MPUI_CALLSIGN_MAPNAME_A"; + game["strings"]["war_callsign_b"] = &"MPUI_CALLSIGN_MAPNAME_B"; + game["strings"]["war_callsign_c"] = &"MPUI_CALLSIGN_MAPNAME_C"; + game["strings"]["war_callsign_d"] = &"MPUI_CALLSIGN_MAPNAME_D"; + game["strings"]["war_callsign_e"] = &"MPUI_CALLSIGN_MAPNAME_E"; + game["strings_menu"]["war_callsign_a"] = "@MPUI_CALLSIGN_MAPNAME_A"; + game["strings_menu"]["war_callsign_b"] = "@MPUI_CALLSIGN_MAPNAME_B"; + game["strings_menu"]["war_callsign_c"] = "@MPUI_CALLSIGN_MAPNAME_C"; + game["strings_menu"]["war_callsign_d"] = "@MPUI_CALLSIGN_MAPNAME_D"; + game["strings_menu"]["war_callsign_e"] = "@MPUI_CALLSIGN_MAPNAME_E"; + spawncollision( "collision_nosight_wall_64x64x10", "collider", ( -915, 790, 212 ), ( 0, 0, 0 ) ); + spawncollision( "collision_nosight_wall_64x64x10", "collider", ( -979, 790, 212 ), ( 0, 0, 0 ) ); + spawncollision( "collision_nosight_wall_64x64x10", "collider", ( -1043, 790, 212 ), ( 0, 0, 0 ) ); + spawncollision( "collision_nosight_wall_64x64x10", "collider", ( -1083, 790, 212 ), ( 0, 0, 0 ) ); + spawncollision( "collision_nosight_wall_64x64x10", "collider", ( -915, 790, 148 ), ( 0, 0, 0 ) ); + spawncollision( "collision_nosight_wall_64x64x10", "collider", ( -979, 790, 148 ), ( 0, 0, 0 ) ); + spawncollision( "collision_nosight_wall_64x64x10", "collider", ( -1043, 790, 148 ), ( 0, 0, 0 ) ); + spawncollision( "collision_nosight_wall_64x64x10", "collider", ( -1083, 790, 148 ), ( 0, 0, 0 ) ); + spawncollision( "collision_clip_wall_128x128x10", "collider", ( 136, 2511, 245.5 ), vectorscale( ( 0, 1, 0 ), 90.0 ) ); + spawncollision( "collision_mp_takeoff_solar_weap", "collider", ( 580, 3239.5, 32.5 ), ( 0, 0, 0 ) ); + spawncollision( "collision_clip_wall_128x128x10", "collider", ( 1523.5, 2085.5, 220.5 ), vectorscale( ( 0, 1, 0 ), 270.3 ) ); + maps\mp\gametypes\_spawning::level_use_unified_spawning( 1 ); + level thread dog_jump_think(); + level.disableoutrovisionset = 1; + level.mptakeoffrocket = getent( "takeoff_rocket", "targetname" ); /# - assert( isDefined( level.mptakeoffrocket ), "Unable to find entity with targetname: 'takeoff_rocket'" ); + assert( isdefined( level.mptakeoffrocket ), "Unable to find entity with targetname: 'takeoff_rocket'" ); #/ - */ - level.endgamefunction = ::takeoff_end_game; - level.preendgamefunction = ::takeoff_pre_end_game; - level thread setuprocketcamera(); - /* + level.endgamefunction = ::takeoff_end_game; + level.preendgamefunction = ::takeoff_pre_end_game; + level thread setuprocketcamera(); /# - execdevgui( "devgui_mp_takeoff" ); - level thread watchdevnotify(); - level thread devgui_endgame(); + execdevgui( "devgui_mp_takeoff" ); + level thread watchdevnotify(); + level thread devgui_endgame(); #/ - */ } -dog_jump_think() //checked matches cerberus output +dog_jump_think() { - origin = ( 209, 3819, 91 ); - trigger = spawn( "trigger_box", origin, getaitriggerflags(), 64, 32, 64 ); - trigger setexcludeteamfortrigger( "none" ); - for ( ;; ) - { - trigger waittill( "trigger", entity ); - if ( isai( entity ) ) - { - glassradiusdamage( origin, 64, 5001, 5000 ); - trigger delete(); - return; - } - } + origin = ( 209, 3819, 91 ); + trigger = spawn( "trigger_box", origin, getaitriggerflags(), 64, 32, 64 ); + trigger setexcludeteamfortrigger( "none" ); + + for (;;) + { + trigger waittill( "trigger", entity ); + + if ( isai( entity ) ) + { + glassradiusdamage( origin, 64, 5001, 5000 ); + trigger delete(); + return; + } + } } -setuprocketcamera() //checked matches cerberus output +setuprocketcamera() { - wait 0.1; - getrocketcamera(); + wait 0.1; + getrocketcamera(); } -getrocketcamera() //checked matches cerberus output +getrocketcamera() { - camerastruct = getstruct( "endgame_first_camera", "targetname" ); - /* + camerastruct = getstruct( "endgame_first_camera", "targetname" ); /# - assert( isDefined( camerastruct ), "Unable to find entity with targetname: 'endgame_first_camera'" ); + assert( isdefined( camerastruct ), "Unable to find entity with targetname: 'endgame_first_camera'" ); #/ - */ - if ( !isDefined( level.rocketcamera ) ) - { - level.rocketcamera = spawn( "script_model", camerastruct.origin ); - level.rocketcamera setmodel( "tag_origin" ); - } - else - { - level.rocketcamera.origin = camerastruct.origin; - } - level.rocketcamera.angles = camerastruct.angles; - return level.rocketcamera; + if ( !isdefined( level.rocketcamera ) ) + { + level.rocketcamera = spawn( "script_model", camerastruct.origin ); + level.rocketcamera setmodel( "tag_origin" ); + } + else + level.rocketcamera.origin = camerastruct.origin; + + level.rocketcamera.angles = camerastruct.angles; + return level.rocketcamera; } -levelspawndvars( reset_dvars ) //checked matches cerberus output +levelspawndvars( reset_dvars ) { - ss = level.spawnsystem; - ss.enemy_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_radius", "2300", reset_dvars ); + ss = level.spawnsystem; + ss.enemy_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_radius", "2300", reset_dvars ); } -watchdevnotify() //checked matches cerberus output dvar not found +watchdevnotify() { - /* /# - startvalue = 0; - setdvarint( "scr_takeoff_rocket", startvalue ); - for ( ;; ) - { - takeoff_rocket = getDvarInt( #"12AE1013" ); - if ( takeoff_rocket != startvalue ) - { - level notify( "dev_takeoff_rocket" ); - startvalue = takeoff_rocket; - } - wait 0.2; + startvalue = 0; + setdvarint( "scr_takeoff_rocket", startvalue ); + + for (;;) + { + takeoff_rocket = getdvarint( "scr_takeoff_rocket" ); + + if ( takeoff_rocket != startvalue ) + { + level notify( "dev_takeoff_rocket" ); + startvalue = takeoff_rocket; + } + + wait 0.2; + } #/ - } - */ } -devgui_endgame() //checked changed to match cerberus output +devgui_endgame() { - /* /# - rocket = level.mptakeoffrocket; - assert( isDefined( rocket ), "Unable to find entity with targetname: 'takeoff_rocket'" ); - rocketorigin = rocket.origin; - rocketangles = rocket.angles; - rocketmodel = rocket.model; - for ( ;; ) - { - level waittill( "dev_takeoff_rocket" ); - visionsetnaked( "blackout", 0.1 ); - thread takeoff_pre_end_game(); - wait 1; - visionsetnaked( "mp_takeoff", 0.1 ); - thread takeoff_end_game(); - wait 4.5; - level notify( "debug_end_takeoff" ); - wait 1; - visionsetnaked( "mp_takeoff", 0.1 ); - for(i = 0; i < level.players.size; i++) - { - player = level.players[ i ]; - player cameraactivate( 0 ); - } - stop_exploder( 1001 ); - rocket delete(); - rocket = spawn( "script_model", rocketorigin ); - rocket.angles = rocketangles; - rocket setmodel( rocketmodel ); - level.mptakeoffrocket = rocket; + rocket = level.mptakeoffrocket; + assert( isdefined( rocket ), "Unable to find entity with targetname: 'takeoff_rocket'" ); + rocketorigin = rocket.origin; + rocketangles = rocket.angles; + rocketmodel = rocket.model; + + for (;;) + { + level waittill( "dev_takeoff_rocket" ); + + visionsetnaked( "blackout", 0.1 ); + thread takeoff_pre_end_game(); + wait 1.0; + visionsetnaked( "mp_takeoff", 0.1 ); + thread takeoff_end_game(); + wait 4.5; + level notify( "debug_end_takeoff" ); + wait 1.0; + visionsetnaked( "mp_takeoff", 0.1 ); + + for ( i = 0; i < level.players.size; i++ ) + { + player = level.players[i]; + player cameraactivate( 0 ); + } + + stop_exploder( 1001 ); + rocket delete(); + rocket = spawn( "script_model", rocketorigin ); + rocket.angles = rocketangles; + rocket setmodel( rocketmodel ); + level.mptakeoffrocket = rocket; + } #/ - } - */ } -water_trigger_init() //checked partially changed to match cerberus output see info.md +water_trigger_init() { - wait 3; - triggers = getentarray( "trigger_hurt", "classname" ); - foreach ( trigger in triggers ) - { - if ( trigger.origin[ 2 ] > level.mapcenter[ 2 ] ) - { - } - else - { - trigger thread water_trigger_think(); - } - } - triggers = getentarray( "water_killbrush", "targetname" ); - foreach ( trigger in triggers ) - { - trigger thread player_splash_think(); - } + wait 3; + triggers = getentarray( "trigger_hurt", "classname" ); + + foreach ( trigger in triggers ) + { + if ( trigger.origin[2] > level.mapcenter[2] ) + continue; + + trigger thread water_trigger_think(); + } + + triggers = getentarray( "water_killbrush", "targetname" ); + + foreach ( trigger in triggers ) + trigger thread player_splash_think(); } -player_splash_think() //checked matches cerberus output +player_splash_think() { - for ( ;; ) - { - self waittill( "trigger", entity ); - if ( isplayer( entity ) && isalive( entity ) ) - { - self thread trigger_thread( entity, ::player_water_fx ); - } - } + for (;;) + { + self waittill( "trigger", entity ); + + if ( isplayer( entity ) && isalive( entity ) ) + self thread trigger_thread( entity, ::player_water_fx ); + } } -player_water_fx( player, endon_condition ) //checked matches cerberus output +player_water_fx( player, endon_condition ) { - maxs = self.origin + self getmaxs(); - if ( maxs[ 2 ] > 60 ) - { - maxs += vectorScale( ( 0, 0, 1 ), 10 ); - } - origin = ( player.origin[ 0 ], player.origin[ 1 ], maxs[ 2 ] ); - playfx( level._effect[ "water_splash_sm" ], origin ); + maxs = self.origin + self getmaxs(); + + if ( maxs[2] > 60 ) + maxs += vectorscale( ( 0, 0, 1 ), 10.0 ); + + origin = ( player.origin[0], player.origin[1], maxs[2] ); + playfx( level._effect["water_splash_sm"], origin ); } -water_trigger_think() //checked matches cerberus output +water_trigger_think() { - for ( ;; ) - { - self waittill( "trigger", entity ); - if ( isplayer( entity ) ) - { - entity playsound( "mpl_splash_death" ); - playfx( level._effect[ "water_splash" ], entity.origin + vectorScale( ( 0, 0, 1 ), 40 ) ); - } - } + for (;;) + { + self waittill( "trigger", entity ); + + if ( isplayer( entity ) ) + { + entity playsound( "mpl_splash_death" ); + playfx( level._effect["water_splash"], entity.origin + vectorscale( ( 0, 0, 1 ), 40.0 ) ); + } + } } -leveloverridetime( defaulttime ) //checked matches cerberus output +leveloverridetime( defaulttime ) { - if ( self isinwater() ) - { - return 0.4; - } - return defaulttime; + if ( self isinwater() ) + return 0.4; + + return defaulttime; } -useintermissionpointsonwavespawn() //checked matches cerberus output +useintermissionpointsonwavespawn() { - return self isinwater(); + return self isinwater(); } -isinwater() //checked partially changed to match cerberus output see info.md +isinwater() { - triggers = getentarray( "trigger_hurt", "classname" ); - foreach ( trigger in triggers ) - { - if ( trigger.origin[ 2 ] > level.mapcenter[ 2 ] ) - { - } - else - { - if ( self istouching( trigger ) ) - { - return 1; - } - } - } - return 0; + triggers = getentarray( "trigger_hurt", "classname" ); + + foreach ( trigger in triggers ) + { + if ( trigger.origin[2] > level.mapcenter[2] ) + continue; + + if ( self istouching( trigger ) ) + return true; + } + + return false; } -takeoff_pre_end_game( timetillendgame, debug ) //checked matches cerberus output +takeoff_pre_end_game( timetillendgame, debug ) { - if ( !isDefined( debug ) ) - { - level waittill( "play_final_killcam" ); - wait 10; - } - rocket = level.mptakeoffrocket; - /* + if ( !isdefined( debug ) ) + { + level waittill( "play_final_killcam" ); + + wait 10.0; + } + + rocket = level.mptakeoffrocket; /# - assert( isDefined( rocket ), "Unable to find entity with targetname: 'takeoff_rocket'" ); + assert( isdefined( rocket ), "Unable to find entity with targetname: 'takeoff_rocket'" ); #/ - */ - rocket rocket_thrusters_initialize(); + rocket rocket_thrusters_initialize(); } -takeoff_end_game() //checked changed to match cerberus output +takeoff_end_game() { - /* /# - level endon( "debug_end_takeoff" ); + level endon( "debug_end_takeoff" ); #/ - */ - level.rocket_camera = 0; - rocket = level.mptakeoffrocket; - rocket playsound( "evt_shuttle_launch" ); - /* + level.rocket_camera = 0; + rocket = level.mptakeoffrocket; + rocket playsound( "evt_shuttle_launch" ); /# - assert( isDefined( rocket ), "Unable to find entity with targetname: 'takeoff_rocket'" ); + assert( isdefined( rocket ), "Unable to find entity with targetname: 'takeoff_rocket'" ); #/ - */ - rocket rocket_thrusters_initialize(); - cameraone = getrocketcamera(); - cameraone thread vibrateaftertime( getdvarfloatdefault( "mp_takeoff_shakewait", 0.5 ) ); - for ( i = 0; i < level.players.size; i++ ) - { - player = level.players[ i ]; - player camerasetposition( cameraone ); - player camerasetlookat(); - player cameraactivate( 1 ); - player setdepthoffield( 0, 0, 512, 512, 4, 0 ); - } - level.rocket_camera = 1; - rocket thread rocket_move(); - wait 4; - visionsetnaked( "blackout", getdvarfloatdefault( "mp_takeoff_fade_black", 0.5 ) ); + rocket rocket_thrusters_initialize(); + cameraone = getrocketcamera(); + cameraone thread vibrateaftertime( getdvarfloatdefault( "mp_takeoff_shakewait", 0.5 ) ); + + for ( i = 0; i < level.players.size; i++ ) + { + player = level.players[i]; + player camerasetposition( cameraone ); + player camerasetlookat(); + player cameraactivate( 1 ); + player setdepthoffield( 0, 0, 512, 512, 4, 0 ); + } + + level.rocket_camera = 1; + rocket thread rocket_move(); + wait 4.0; + visionsetnaked( "blackout", getdvarfloatdefault( "mp_takeoff_fade_black", 0.5 ) ); } -rocket_thrusters_initialize() //checked matches cerberus output +rocket_thrusters_initialize() { - if ( !isDefined( self.thrustersinited ) ) - { - self.thrustersinited = 1; - exploder( 1001 ); - playfxontag( level._effect[ "fx_mp_tak_shuttle_thruster_lg" ], self, "tag_fx" ); - playfxontag( level._effect[ "fx_mp_tak_shuttle_thruster_sm" ], self, "tag_fx5" ); - playfxontag( level._effect[ "fx_mp_tak_shuttle_thruster_md" ], self, "tag_fx6" ); - playfxontag( level._effect[ "fx_mp_tak_shuttle_thruster_sm" ], self, "tag_fx7" ); - } + if ( !isdefined( self.thrustersinited ) ) + { + self.thrustersinited = 1; + exploder( 1001 ); + playfxontag( level._effect["fx_mp_tak_shuttle_thruster_lg"], self, "tag_fx" ); + playfxontag( level._effect["fx_mp_tak_shuttle_thruster_sm"], self, "tag_fx5" ); + playfxontag( level._effect["fx_mp_tak_shuttle_thruster_md"], self, "tag_fx6" ); + playfxontag( level._effect["fx_mp_tak_shuttle_thruster_sm"], self, "tag_fx7" ); + } } -rocket_move() //checked matches cerberus output +rocket_move() { - origin = self.origin; - heightincrease = getdvarintdefault( "mp_takeoff_rocket_start_height", 0 ); - self.origin += ( 0, 0, heightincrease ); - movetime = getdvarintdefault( "mp_takeoff_moveTime", 17 ); - moveaccelratio = getdvarfloatdefault( "mp_takeoff_moveAccel", 1 ); - self moveto( self.origin + vectorScale( ( 0, 0, 1 ), 50000 ), movetime, movetime * moveaccelratio ); - self waittill( "movedone" ); - origin = self.origin; + origin = self.origin; + heightincrease = getdvarintdefault( "mp_takeoff_rocket_start_height", 0 ); + self.origin += ( 0, 0, heightincrease ); + movetime = getdvarintdefault( "mp_takeoff_moveTime", 17 ); + moveaccelratio = getdvarfloatdefault( "mp_takeoff_moveAccel", 1.0 ); + self moveto( self.origin + vectorscale( ( 0, 0, 1 ), 50000.0 ), movetime, movetime * moveaccelratio ); + + self waittill( "movedone" ); + + origin = self.origin; } -vibrateaftertime( waittime ) //checked matches cerberus output +vibrateaftertime( waittime ) { - self endon( "death" ); - /* + self endon( "death" ); /# - level endon( "debug_end_takeoff" ); + level endon( "debug_end_takeoff" ); #/ - */ - wait waittime; - pitchvibrateamplitude = getdvarfloatdefault( "mp_takeoff_start", 0.1 ); - vibrateamplitude = getdvarfloatdefault( "mp_takeoff_a_start", 0.1 ); - vibratetime = 0.05; - originalangles = self.angles; - for ( ;; ) - { - angles0 = ( originalangles[ 0 ] - pitchvibrateamplitude, originalangles[ 1 ], originalangles[ 2 ] - vibrateamplitude ); - angles1 = ( originalangles[ 0 ] + pitchvibrateamplitude, originalangles[ 1 ], originalangles[ 2 ] + vibrateamplitude ); - self rotateto( angles0, vibratetime ); - self waittill( "rotatedone" ); - self rotateto( angles1, vibratetime ); - self waittill( "rotatedone" ); - vibrateamplitude *= getdvarfloatdefault( "mp_takeoff_amp_vredux", 1.12 ); - pitchvibrateamplitude = 0 - pitchvibrateamplitude; - pitchvibrateamplitude *= getdvarfloatdefault( "mp_takeoff_amp_predux", 1.11 ); - } -} + wait( waittime ); + pitchvibrateamplitude = getdvarfloatdefault( "mp_takeoff_start", 0.1 ); + vibrateamplitude = getdvarfloatdefault( "mp_takeoff_a_start", 0.1 ); + vibratetime = 0.05; + originalangles = self.angles; + for (;;) + { + angles0 = ( originalangles[0] - pitchvibrateamplitude, originalangles[1], originalangles[2] - vibrateamplitude ); + angles1 = ( originalangles[0] + pitchvibrateamplitude, originalangles[1], originalangles[2] + vibrateamplitude ); + self rotateto( angles0, vibratetime ); + + self waittill( "rotatedone" ); + + self rotateto( angles1, vibratetime ); + + self waittill( "rotatedone" ); + + vibrateamplitude *= getdvarfloatdefault( "mp_takeoff_amp_vredux", 1.12 ); + pitchvibrateamplitude = 0 - pitchvibrateamplitude; + pitchvibrateamplitude *= getdvarfloatdefault( "mp_takeoff_amp_predux", 1.11 ); + } +} diff --git a/Multiplayer Core/patch_mp/maps/mp/mp_turbine.gsc b/Multiplayer Core/patch_mp/maps/mp/mp_turbine.gsc index ec3a11a..59a0f96 100644 --- a/Multiplayer Core/patch_mp/maps/mp/mp_turbine.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/mp_turbine.gsc @@ -1,112 +1,115 @@ -//checked includes changed to match cerberus output -#include maps/mp/mp_turbine_amb; -#include maps/mp/_compass; -#include maps/mp/_load; -#include maps/mp/mp_turbine_fx; -#include maps/mp/_utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\_utility; +#include maps\mp\mp_turbine_fx; +#include maps\mp\_load; +#include maps\mp\_compass; +#include maps\mp\mp_turbine_amb; -main() //checked changed to match cerberus output +main() { - level.levelspawndvars = ::levelspawndvars; - maps/mp/mp_turbine_fx::main(); - precachemodel( "collision_clip_cylinder_32x128" ); - precachemodel( "collision_physics_128x128x10" ); - precachemodel( "collision_physics_64x64x64" ); - precachemodel( "collision_physics_64x64x10" ); - precachemodel( "collision_physics_wall_64x64x10" ); - precachemodel( "collision_clip_32x32x32" ); - precachemodel( "collision_clip_64x64x64" ); - precachemodel( "collision_clip_wall_64x64x10" ); - precachemodel( "collision_missile_128x128x10" ); - precachemodel( "collision_clip_128x128x10" ); - precachemodel( "collision_missile_32x32x128" ); - precachemodel( "collision_clip_wall_128x128x10" ); - precachemodel( "p6_rocks_medium_01_nospec" ); - maps/mp/_load::main(); - maps/mp/_compass::setupminimap( "compass_map_mp_turbine" ); - maps/mp/mp_turbine_amb::main(); - if ( !level.console ) - { - precachemodel( "collision_clip_32x32x32" ); - spawncollision( "collision_clip_32x32x32", "collider", ( -1400, 550, 360 ), ( 0, 0, 0 ) ); - } - spawncollision( "collision_clip_cylinder_32x128", "collider", ( 334, 1724, -14 ), vectorScale( ( 0, 1, 0 ), 346.8 ) ); - spawncollision( "collision_clip_cylinder_32x128", "collider", ( 1249, 1250, 193 ), ( 270, 241.8, -4 ) ); - spawncollision( "collision_physics_128x128x10", "collider", ( -713, -737, 310 ), ( 276.402, 353.887, 29.1528 ) ); - spawncollision( "collision_physics_128x128x10", "collider", ( -707.5, -727, 310 ), ( 276.402, 353.887, 29.1528 ) ); - spawncollision( "collision_physics_64x64x64", "collider", ( -826.5, -866, 350.5 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_64x64x10", "collider", ( -678, -1044, 396.5 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_128x128x10", "collider", ( -612.5, -1001.5, 348.5 ), ( 355.897, 281.708, -59.5212 ) ); - spawncollision( "collision_clip_32x32x32", "collider", ( 828, 3006.5, -124.5 ), vectorScale( ( 0, 0, -1 ), 15.6 ) ); - spawncollision( "collision_clip_64x64x64", "collider", ( 96.5, 3649, 46.5 ), ( 0, 0, 0 ) ); - spawncollision( "collision_clip_wall_64x64x10", "collider", ( 171, -1578.5, 180.5 ), ( 2.65172, 9.74951, -15.074 ) ); - spawncollision( "collision_missile_128x128x10", "collider", ( -789.5, 2667, 424 ), ( 359.984, 19.5888, -179.3292 ) ); - spawncollision( "collision_missile_128x128x10", "collider", ( -807.5, 2660.5, 424 ), ( 359.984, 19.5888, -179.3292 ) ); - spawncollision( "collision_clip_128x128x10", "collider", ( -789.5, 2667, 424 ), ( 359.984, 19.5888, -89.3292 ) ); - spawncollision( "collision_clip_128x128x10", "collider", ( -807.5, 2660.5, 424 ), ( 359.984, 19.5888, -89.3292 ) ); - spawncollision( "collision_physics_128x128x10", "collider", ( -789.5, 2667, 424 ), ( 359.984, 19.5888, -89.3292 ) ); - spawncollision( "collision_physics_128x128x10", "collider", ( -807.5, 2660.5, 424 ), ( 359.984, 19.5888, -89.3292 ) ); - spawncollision( "collision_clip_wall_64x64x10", "collider", ( -1889.5, 1249.5, 318.5 ), ( 359.691, 90.6276, 26.2986 ) ); - spawncollision( "collision_missile_32x32x128", "collider", ( 1970, 2595.5, 75 ), vectorScale( ( 0, 1, 0 ), 45.2 ) ); - spawncollision( "collision_missile_32x32x128", "collider", ( 2221, 2396.5, 119.5 ), vectorScale( ( 0, 1, 0 ), 45 ) ); - spawncollision( "collision_missile_32x32x128", "collider", ( 2130, 2305.5, 116 ), vectorScale( ( 0, 1, 0 ), 45 ) ); - spawncollision( "collision_missile_32x32x128", "collider", ( 2111.5, 2287.5, 54 ), vectorScale( ( 0, 1, 0 ), 45 ) ); - spawncollision( "collision_missile_32x32x128", "collider", ( 1692.5, 2321.5, 60.5 ), vectorScale( ( 0, 1, 0 ), 45 ) ); - spawncollision( "collision_missile_32x32x128", "collider", ( 2195.5, 2702, 132.5 ), vectorScale( ( 0, 1, 0 ), 314.6 ) ); - spawncollision( "collision_clip_wall_32x32x10", "collider", ( 296, -181.5, 282 ), vectorScale( ( 0, 1, 0 ), 341.5 ) ); - spawncollision( "collision_clip_wall_32x32x10", "collider", ( 300, -84, 282 ), ( 0, 0, 0 ) ); - spawncollision( "collision_clip_wall_64x64x10", "collider", ( 937, 2270, -59 ), ( 0.562452, 274.866, -38.8762 ) ); - spawncollision( "collision_clip_32x32x32", "collider", ( 223.5, 3528, 132 ), ( 0, 0, 0 ) ); - rock1 = spawn( "script_model", ( 61.6428, 2656.92, 253.46 ) ); - rock1.angles = ( 288.55, 212.152, -86.8076 ); - rock1 setmodel( "p6_rocks_medium_01_nospec" ); - rock2 = spawn( "script_model", ( 30.64, 2652, 277.89 ) ); - rock2.angles = ( 352.368, 229.531, -57.337 ); - rock2 setmodel( "p6_rocks_medium_01_nospec" ); - spawncollision( "collision_clip_wall_64x64x10", "collider", ( 42.5, 2573.5, 334 ), vectorScale( ( 0, 1, 0 ), 319.3 ) ); - spawncollision( "collision_clip_wall_64x64x10", "collider", ( 91, 2569, 334 ), vectorScale( ( 0, 0, 0), 3.59998 ) ); - spawncollision( "collision_clip_wall_64x64x10", "collider", ( 60.5, 2610, 368.5 ), ( 3.43509, 325.664, -77.5079 ) ); - spawncollision( "collision_clip_wall_64x64x10", "collider", ( 89.5, 2594, 368.5 ), ( 3.43509, 12.164, -77.5079 ) ); - spawncollision( "collision_clip_32x32x32", "collider", ( -239, 1680.5, 318.5 ), vectorScale( ( 0, 1, 0 ), 319.3 ) ); - spawncollision( "collision_clip_wall_128x128x10", "collider", ( 62.5, 2557, 358 ), vectorScale( ( 0, 0, -1 ), 8.50021 ) ); - //added from cerberus output - spawncollision( "collision_clip_64x64x10", "collider", ( 348.02, 1176.13, 299.595 ), ( 339.37, 328.453, -22.7468 ) ); - spawncollision( "collision_clip_64x64x10", "collider", ( 388.801, 1219.68, 271.157 ), ( 339.37, 328.453, -22.7468 ) ); - spawncollision( "collision_clip_64x64x10", "collider", ( 432.597, 1264.16, 247.717 ), ( 339.37, 328.453, -22.7468 ) ); - - level.remotemotarviewleft = 50; - level.remotemotarviewright = 50; + level.levelspawndvars = ::levelspawndvars; + maps\mp\mp_turbine_fx::main(); + precachemodel( "collision_clip_cylinder_32x128" ); + precachemodel( "collision_physics_128x128x10" ); + precachemodel( "collision_physics_64x64x64" ); + precachemodel( "collision_physics_64x64x10" ); + precachemodel( "collision_physics_wall_64x64x10" ); + precachemodel( "collision_clip_32x32x32" ); + precachemodel( "collision_clip_64x64x64" ); + precachemodel( "collision_clip_wall_64x64x10" ); + precachemodel( "collision_missile_128x128x10" ); + precachemodel( "collision_clip_128x128x10" ); + precachemodel( "collision_missile_32x32x128" ); + precachemodel( "collision_clip_wall_128x128x10" ); + precachemodel( "p6_rocks_medium_01_nospec" ); + precachemodel( "collision_clip_64x64x10" ); + maps\mp\_load::main(); + maps\mp\_compass::setupminimap( "compass_map_mp_turbine" ); + maps\mp\mp_turbine_amb::main(); + + if ( !level.console ) + { + precachemodel( "collision_clip_32x32x32" ); + spawncollision( "collision_clip_32x32x32", "collider", ( -1400, 550, 360 ), ( 0, 0, 0 ) ); + } + + spawncollision( "collision_clip_cylinder_32x128", "collider", ( 334, 1724, -14 ), vectorscale( ( 0, 1, 0 ), 346.8 ) ); + spawncollision( "collision_clip_cylinder_32x128", "collider", ( 1249, 1250, 193 ), ( 270, 241.8, -4 ) ); + spawncollision( "collision_physics_128x128x10", "collider", ( -713, -737, 310 ), ( 276.402, 353.887, 29.1528 ) ); + spawncollision( "collision_physics_128x128x10", "collider", ( -707.5, -727, 310 ), ( 276.402, 353.887, 29.1528 ) ); + spawncollision( "collision_physics_64x64x64", "collider", ( -826.5, -866, 350.5 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_64x64x10", "collider", ( -678, -1044, 396.5 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_128x128x10", "collider", ( -612.5, -1001.5, 348.5 ), ( 355.897, 281.708, -59.5212 ) ); + spawncollision( "collision_clip_32x32x32", "collider", ( 828, 3006.5, -124.5 ), vectorscale( ( 0, 0, -1 ), 15.6 ) ); + spawncollision( "collision_clip_64x64x64", "collider", ( 96.5, 3649, 46.5 ), ( 0, 0, 0 ) ); + spawncollision( "collision_clip_wall_64x64x10", "collider", ( 171, -1578.5, 180.5 ), ( 2.65172, 9.74951, -15.074 ) ); + spawncollision( "collision_missile_128x128x10", "collider", ( -789.5, 2667, 424 ), ( 359.984, 19.5888, -179.329 ) ); + spawncollision( "collision_missile_128x128x10", "collider", ( -807.5, 2660.5, 424 ), ( 359.984, 19.5888, -179.329 ) ); + spawncollision( "collision_clip_128x128x10", "collider", ( -789.5, 2667, 424 ), ( 359.984, 19.5888, -89.3292 ) ); + spawncollision( "collision_clip_128x128x10", "collider", ( -807.5, 2660.5, 424 ), ( 359.984, 19.5888, -89.3292 ) ); + spawncollision( "collision_physics_128x128x10", "collider", ( -789.5, 2667, 424 ), ( 359.984, 19.5888, -89.3292 ) ); + spawncollision( "collision_physics_128x128x10", "collider", ( -807.5, 2660.5, 424 ), ( 359.984, 19.5888, -89.3292 ) ); + spawncollision( "collision_clip_wall_64x64x10", "collider", ( -1889.5, 1249.5, 318.5 ), ( 359.691, 90.6276, 26.2986 ) ); + spawncollision( "collision_missile_32x32x128", "collider", ( 1970, 2595.5, 75 ), vectorscale( ( 0, 1, 0 ), 45.2 ) ); + spawncollision( "collision_missile_32x32x128", "collider", ( 2221, 2396.5, 119.5 ), vectorscale( ( 0, 1, 0 ), 45.0 ) ); + spawncollision( "collision_missile_32x32x128", "collider", ( 2130, 2305.5, 116 ), vectorscale( ( 0, 1, 0 ), 45.0 ) ); + spawncollision( "collision_missile_32x32x128", "collider", ( 2111.5, 2287.5, 54 ), vectorscale( ( 0, 1, 0 ), 45.0 ) ); + spawncollision( "collision_missile_32x32x128", "collider", ( 1692.5, 2321.5, 60.5 ), vectorscale( ( 0, 1, 0 ), 45.0 ) ); + spawncollision( "collision_missile_32x32x128", "collider", ( 2195.5, 2702, 132.5 ), vectorscale( ( 0, 1, 0 ), 314.6 ) ); + spawncollision( "collision_clip_wall_32x32x10", "collider", ( 296, -181.5, 282 ), vectorscale( ( 0, 1, 0 ), 341.5 ) ); + spawncollision( "collision_clip_wall_32x32x10", "collider", ( 300, -84, 282 ), ( 0, 0, 0 ) ); + spawncollision( "collision_clip_wall_64x64x10", "collider", ( 937, 2270, -59 ), ( 0.562452, 274.866, -38.8762 ) ); + spawncollision( "collision_clip_32x32x32", "collider", ( 223.5, 3528, 132 ), ( 0, 0, 0 ) ); + rock1 = spawn( "script_model", ( 61.6428, 2656.92, 253.46 ) ); + rock1.angles = ( 288.55, 212.152, -86.8076 ); + rock1 setmodel( "p6_rocks_medium_01_nospec" ); + rock2 = spawn( "script_model", ( 30.64, 2652, 277.89 ) ); + rock2.angles = ( 352.368, 229.531, -57.337 ); + rock2 setmodel( "p6_rocks_medium_01_nospec" ); + spawncollision( "collision_clip_wall_64x64x10", "collider", ( 42.5, 2573.5, 334 ), vectorscale( ( 0, 1, 0 ), 319.3 ) ); + spawncollision( "collision_clip_wall_64x64x10", "collider", ( 91, 2569, 334 ), vectorscale( ( 0, 1, 0 ), 3.59998 ) ); + spawncollision( "collision_clip_wall_64x64x10", "collider", ( 60.5, 2610, 368.5 ), ( 3.43509, 325.664, -77.5079 ) ); + spawncollision( "collision_clip_wall_64x64x10", "collider", ( 89.5, 2594, 368.5 ), ( 3.43509, 12.164, -77.5079 ) ); + spawncollision( "collision_clip_32x32x32", "collider", ( -239, 1680.5, 318.5 ), vectorscale( ( 0, 1, 0 ), 319.3 ) ); + spawncollision( "collision_clip_wall_128x128x10", "collider", ( 62.5, 2557, 358 ), vectorscale( ( 0, 0, -1 ), 8.50021 ) ); + spawncollision( "collision_clip_64x64x10", "collider", ( 348.02, 1176.13, 299.595 ), ( 339.37, 328.453, -22.7468 ) ); + spawncollision( "collision_clip_64x64x10", "collider", ( 388.801, 1219.68, 271.157 ), ( 339.37, 328.453, -22.7468 ) ); + spawncollision( "collision_clip_64x64x10", "collider", ( 432.597, 1264.16, 247.717 ), ( 339.37, 328.453, -22.7468 ) ); + level.remotemotarviewleft = 50; + level.remotemotarviewright = 50; } -levelspawndvars( reset_dvars ) //checked matches cerberus output +levelspawndvars( reset_dvars ) { - ss = level.spawnsystem; - ss.enemy_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_radius", "2600", reset_dvars ); + ss = level.spawnsystem; + ss.enemy_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_radius", "2600", reset_dvars ); } -turbine_spin_init() //checked matches cerberus output +turbine_spin_init() { - level endon( "game_ended" ); - turbine1 = getent( "turbine_blades", "targetname" ); - turbine1 thread rotate_blades( 4 ); - turbine2 = getent( "turbine_blades2", "targetname" ); - turbine2 thread rotate_blades( 3 ); - turbine3 = getent( "turbine_blades3", "targetname" ); - turbine3 thread rotate_blades( 6 ); - turbine4 = getent( "turbine_blades4", "targetname" ); - turbine4 thread rotate_blades( 3 ); - turbine6 = getent( "turbine_blades6", "targetname" ); - turbine6 thread rotate_blades( 4 ); + level endon( "game_ended" ); + turbine1 = getent( "turbine_blades", "targetname" ); + turbine1 thread rotate_blades( 4 ); + turbine2 = getent( "turbine_blades2", "targetname" ); + turbine2 thread rotate_blades( 3 ); + turbine3 = getent( "turbine_blades3", "targetname" ); + turbine3 thread rotate_blades( 6 ); + turbine4 = getent( "turbine_blades4", "targetname" ); + turbine4 thread rotate_blades( 3 ); + turbine6 = getent( "turbine_blades6", "targetname" ); + turbine6 thread rotate_blades( 4 ); } -rotate_blades( time ) //checked matches cerberus output +rotate_blades( time ) { - self endon( "game_ended" ); - revolutions = 1000; - while ( 1 ) - { - self rotateroll( 360 * revolutions, time * revolutions ); - self waittill( "rotatedone" ); - } -} + self endon( "game_ended" ); + revolutions = 1000; + while ( true ) + { + self rotateroll( 360 * revolutions, time * revolutions ); + + self waittill( "rotatedone" ); + } +} diff --git a/Multiplayer Core/patch_mp/maps/mp/mp_uplink.gsc b/Multiplayer Core/patch_mp/maps/mp/mp_uplink.gsc index 809e598..699aa77 100644 --- a/Multiplayer Core/patch_mp/maps/mp/mp_uplink.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/mp_uplink.gsc @@ -1,99 +1,98 @@ -//checked includes changed to match cerberus output -#include maps/mp/gametypes/_spawning; -#include maps/mp/_compass; -#include maps/mp/mp_uplink_amb; -#include maps/mp/_load; -#include maps/mp/mp_uplink_fx; -#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 +#include common_scripts\utility; +#include maps\mp\_utility; +#include maps\mp\gametypes\_globallogic_utils; +#include maps\mp\mp_uplink_fx; +#include maps\mp\_load; +#include maps\mp\mp_uplink_amb; +#include maps\mp\_compass; +#include maps\mp\gametypes\_spawning; -main() //checked changed to match cerberus output +main() { - level.levelspawndvars = ::levelspawndvars; - maps/mp/mp_uplink_fx::main(); - precachemodel( "collision_physics_128x128x10" ); - precachemodel( "collision_physics_256x256x10" ); - precachemodel( "collision_physics_64x64x10" ); - precachemodel( "collision_physics_32x32x10" ); - precachemodel( "collision_clip_128x128x10" ); - maps/mp/_load::main(); - maps/mp/mp_uplink_amb::main(); - maps/mp/_compass::setupminimap( "compass_map_mp_uplink" ); - setdvar( "compassmaxrange", "2100" ); - registerclientfield( "world", "trigger_lightning", 1, 1, "int" ); - game[ "strings" ][ "war_callsign_a" ] = &"MPUI_CALLSIGN_MAPNAME_A"; - game[ "strings" ][ "war_callsign_b" ] = &"MPUI_CALLSIGN_MAPNAME_B"; - game[ "strings" ][ "war_callsign_c" ] = &"MPUI_CALLSIGN_MAPNAME_C"; - game[ "strings" ][ "war_callsign_d" ] = &"MPUI_CALLSIGN_MAPNAME_D"; - game[ "strings" ][ "war_callsign_e" ] = &"MPUI_CALLSIGN_MAPNAME_E"; - game[ "strings_menu" ][ "war_callsign_a" ] = "@MPUI_CALLSIGN_MAPNAME_A"; - game[ "strings_menu" ][ "war_callsign_b" ] = "@MPUI_CALLSIGN_MAPNAME_B"; - game[ "strings_menu" ][ "war_callsign_c" ] = "@MPUI_CALLSIGN_MAPNAME_C"; - game[ "strings_menu" ][ "war_callsign_d" ] = "@MPUI_CALLSIGN_MAPNAME_D"; - game[ "strings_menu" ][ "war_callsign_e" ] = "@MPUI_CALLSIGN_MAPNAME_E"; - spawncollision( "collision_physics_128x128x10", "collider", ( 1661, 345.5, 298.5 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_128x128x10", "collider", ( 1661, 345.5, 313.5 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_256x256x10", "collider", ( 3257, -3.5, 872.5 ), ( 360, 270, 90 ) ); - spawncollision( "collision_physics_256x256x10", "collider", ( 3394, -136.5, 872.5 ), ( 270, 183.902, 86.0983 ) ); - spawncollision( "collision_physics_256x256x10", "collider", ( 3270.5, -3.5, 872.5 ), ( 360, 270, 90 ) ); - spawncollision( "collision_physics_256x256x10", "collider", ( 3394, 129.5, 872.5 ), ( 270, 183.902, 86.0983 ) ); - spawncollision( "collision_physics_256x256x10", "collider", ( 3399.5, 1, 990 ), ( 1.12, 270, 180 ) ); - spawncollision( "collision_physics_128x128x10", "collider", ( 2343.5, 865.5, 320.5 ), vectorScale( ( 0, 1, 0 ), 332.7 ) ); - spawncollision( "collision_physics_64x64x10", "collider", ( 2291, 904, 316 ), ( 355.461, 27.1924, -2.32818 ) ); - spawncollision( "collision_physics_32x32x10", "collider", ( 3049.5, -3452, 339 ), ( 78.6193, 281.502, -105.573 ) ); - spawncollision( "collision_clip_128x128x10", "collider", ( 2477.5, -2957, 326 ), vectorScale( ( 1, 0, 0 ), 291.7 ) ); - spawncollision( "collision_clip_128x128x10", "collider", ( 2477.5, -3053, 326 ), vectorScale( ( 1, 0, 0 ), 291.7 ) ); - spawncollision( "collision_clip_128x128x10", "collider", ( 2159, -476.5, 353 ), vectorScale( ( 1, 0, 0 ), 279.2 ) ); - spawncollision( "collision_clip_128x128x10", "collider", ( 2159, -508, 353 ), vectorScale( ( 1, 0, 0 ), 279.2 ) ); - maps/mp/gametypes/_spawning::level_use_unified_spawning( 1 ); - level.remotemotarviewdown = 50; - level thread gondola_sway(); - glasses = getstructarray( "glass_shatter_on_spawn", "targetname" ); - for ( i = 0; i < glasses.size; i++ ) - { - radiusdamage( glasses[ i ].origin, 64, 101, 100 ); - } + level.levelspawndvars = ::levelspawndvars; + maps\mp\mp_uplink_fx::main(); + precachemodel( "collision_physics_128x128x10" ); + precachemodel( "collision_physics_256x256x10" ); + precachemodel( "collision_physics_64x64x10" ); + precachemodel( "collision_physics_32x32x10" ); + precachemodel( "collision_clip_128x128x10" ); + maps\mp\_load::main(); + maps\mp\mp_uplink_amb::main(); + maps\mp\_compass::setupminimap( "compass_map_mp_uplink" ); + setdvar( "compassmaxrange", "2100" ); + registerclientfield( "world", "trigger_lightning", 1, 1, "int" ); + game["strings"]["war_callsign_a"] = &"MPUI_CALLSIGN_MAPNAME_A"; + game["strings"]["war_callsign_b"] = &"MPUI_CALLSIGN_MAPNAME_B"; + game["strings"]["war_callsign_c"] = &"MPUI_CALLSIGN_MAPNAME_C"; + game["strings"]["war_callsign_d"] = &"MPUI_CALLSIGN_MAPNAME_D"; + game["strings"]["war_callsign_e"] = &"MPUI_CALLSIGN_MAPNAME_E"; + game["strings_menu"]["war_callsign_a"] = "@MPUI_CALLSIGN_MAPNAME_A"; + game["strings_menu"]["war_callsign_b"] = "@MPUI_CALLSIGN_MAPNAME_B"; + game["strings_menu"]["war_callsign_c"] = "@MPUI_CALLSIGN_MAPNAME_C"; + game["strings_menu"]["war_callsign_d"] = "@MPUI_CALLSIGN_MAPNAME_D"; + game["strings_menu"]["war_callsign_e"] = "@MPUI_CALLSIGN_MAPNAME_E"; + spawncollision( "collision_physics_128x128x10", "collider", ( 1661, 345.5, 298.5 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_128x128x10", "collider", ( 1661, 345.5, 313.5 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_256x256x10", "collider", ( 3257, -3.5, 872.5 ), ( 360, 270, 90 ) ); + spawncollision( "collision_physics_256x256x10", "collider", ( 3394, -136.5, 872.5 ), ( 270, 183.902, 86.0983 ) ); + spawncollision( "collision_physics_256x256x10", "collider", ( 3270.5, -3.5, 872.5 ), ( 360, 270, 90 ) ); + spawncollision( "collision_physics_256x256x10", "collider", ( 3394, 129.5, 872.5 ), ( 270, 183.902, 86.0983 ) ); + spawncollision( "collision_physics_256x256x10", "collider", ( 3399.5, 1, 990 ), ( 1.12, 270, 180 ) ); + spawncollision( "collision_physics_128x128x10", "collider", ( 2343.5, 865.5, 320.5 ), vectorscale( ( 0, 1, 0 ), 332.7 ) ); + spawncollision( "collision_physics_64x64x10", "collider", ( 2291, 904, 316 ), ( 355.461, 27.1924, -2.32818 ) ); + spawncollision( "collision_physics_32x32x10", "collider", ( 3049.5, -3452, 339 ), ( 78.6193, 281.502, -105.573 ) ); + spawncollision( "collision_clip_128x128x10", "collider", ( 2477.5, -2957, 326 ), vectorscale( ( 1, 0, 0 ), 291.7 ) ); + spawncollision( "collision_clip_128x128x10", "collider", ( 2477.5, -3053, 326 ), vectorscale( ( 1, 0, 0 ), 291.7 ) ); + spawncollision( "collision_clip_128x128x10", "collider", ( 2159, -476.5, 353 ), vectorscale( ( 1, 0, 0 ), 279.2 ) ); + spawncollision( "collision_clip_128x128x10", "collider", ( 2159, -508, 353 ), vectorscale( ( 1, 0, 0 ), 279.2 ) ); + maps\mp\gametypes\_spawning::level_use_unified_spawning( 1 ); + level.remotemotarviewdown = 50; + level thread gondola_sway(); + glasses = getstructarray( "glass_shatter_on_spawn", "targetname" ); + + for ( i = 0; i < glasses.size; i++ ) + radiusdamage( glasses[i].origin, 64, 101, 100 ); } -levelspawndvars( reset_dvars ) //checked matches cerberus output +levelspawndvars( reset_dvars ) { - ss = level.spawnsystem; - ss.enemy_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_radius", "2350", reset_dvars ); - ss.hq_objective_influencer_inner_radius = set_dvar_float_if_unset( "scr_spawn_hq_objective_influencer_inner_radius", "1000", reset_dvars ); + ss = level.spawnsystem; + ss.enemy_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_radius", "2350", reset_dvars ); + ss.hq_objective_influencer_inner_radius = set_dvar_float_if_unset( "scr_spawn_hq_objective_influencer_inner_radius", "1000", reset_dvars ); } -gondola_sway() //checked matches cerberus output +gondola_sway() { - gondola_cab = getent( "gondola_cab", "targetname" ); - gondola_cab setmovingplatformenabled( 1 ); - while ( 1 ) - { - randomswingangle = randomfloatrange( 0.25, 0.5 ); - randomswingtime = randomfloatrange( 2.5, 4 ); - gondola_cab rotateto( ( randomswingangle * 0.5, randomswingangle * 0.6, randomswingangle * 0.8 ), randomswingtime, randomswingtime * 0.3, randomswingtime * 0,.3 ); - gondola_cab playsound( "amb_gondola_swing" ); - wait randomswingtime; - gondola_cab rotateto( ( ( randomswingangle * 0.5 ) * -1, ( randomswingangle * -1 ) * 0.6, ( randomswingangle * 0.8 ) * -1 ), randomswingtime, randomswingtime * 0.3, randomswingtime * 0.3 ); - gondola_cab playsound( "amb_gondola_swing_back" ); - wait randomswingtime; - gondola_cab destroy_corpses(); - } + gondola_cab = getent( "gondola_cab", "targetname" ); + gondola_cab setmovingplatformenabled( 1 ); + + while ( true ) + { + randomswingangle = randomfloatrange( 0.25, 0.5 ); + randomswingtime = randomfloatrange( 2.5, 4.0 ); + gondola_cab rotateto( ( randomswingangle * 0.5, randomswingangle * 0.6, randomswingangle * 0.8 ), randomswingtime, randomswingtime * 0.3, randomswingtime * 0.3 ); + gondola_cab playsound( "amb_gondola_swing" ); + wait( randomswingtime ); + gondola_cab rotateto( ( randomswingangle * 0.5 * -1, randomswingangle * -1 * 0.6, randomswingangle * 0.8 * -1 ), randomswingtime, randomswingtime * 0.3, randomswingtime * 0.3 ); + gondola_cab playsound( "amb_gondola_swing_back" ); + wait( randomswingtime ); + gondola_cab destroy_corpses(); + } } -destroy_corpses() //checked changed to match cerberus output +destroy_corpses() { - time = getTime(); - corpses = getcorpsearray(); - for ( i = 0; i < corpses.size; i++ ) - { - if ( ( corpses[ i ].birthtime + 3000 ) < time ) - { - if ( distance2dsquared( corpses[ i ].origin, self.origin ) < 10000 ) - { - corpses[ i ] delete(); - } - } - } -} + time = gettime(); + corpses = getcorpsearray(); + for ( i = 0; i < corpses.size; i++ ) + { + if ( corpses[i].birthtime + 3000 < time ) + { + if ( distance2dsquared( corpses[i].origin, self.origin ) < 10000 ) + corpses[i] delete(); + } + } +} diff --git a/Multiplayer Core/patch_mp/maps/mp/mp_vertigo.gsc b/Multiplayer Core/patch_mp/maps/mp/mp_vertigo.gsc index 21b0172..8202b0a 100644 --- a/Multiplayer Core/patch_mp/maps/mp/mp_vertigo.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/mp_vertigo.gsc @@ -1,183 +1,181 @@ -//checked includes changed to match cerberus output -#include maps/mp/gametypes/_deathicons; -#include maps/mp/mp_vertigo_doors; -#include maps/mp/_compass; -#include maps/mp/mp_vertigo_amb; -#include maps/mp/_load; -#include maps/mp/mp_vertigo_fx; -#include maps/mp/_utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\_utility; +#include maps\mp\mp_vertigo_fx; +#include maps\mp\_load; +#include maps\mp\mp_vertigo_amb; +#include maps\mp\_compass; +#include maps\mp\mp_vertigo_doors; +#include maps\mp\gametypes\_deathicons; -main() //checked matches cerberus output +main() { - level.levelspawndvars = ::levelspawndvars; - level.ragdoll_override = ::ragdoll_override; - maps/mp/mp_vertigo_fx::main(); - maps/mp/_load::main(); - maps/mp/mp_vertigo_amb::main(); - maps/mp/_compass::setupminimap( "compass_map_mp_vertigo" ); - setdvar( "compassmaxrange", "2100" ); - game[ "strings" ][ "war_callsign_a" ] = &"MPUI_CALLSIGN_MAPNAME_A"; - game[ "strings" ][ "war_callsign_b" ] = &"MPUI_CALLSIGN_MAPNAME_B"; - game[ "strings" ][ "war_callsign_c" ] = &"MPUI_CALLSIGN_MAPNAME_C"; - game[ "strings" ][ "war_callsign_d" ] = &"MPUI_CALLSIGN_MAPNAME_D"; - game[ "strings" ][ "war_callsign_e" ] = &"MPUI_CALLSIGN_MAPNAME_E"; - game[ "strings_menu" ][ "war_callsign_a" ] = "@MPUI_CALLSIGN_MAPNAME_A"; - game[ "strings_menu" ][ "war_callsign_b" ] = "@MPUI_CALLSIGN_MAPNAME_B"; - game[ "strings_menu" ][ "war_callsign_c" ] = "@MPUI_CALLSIGN_MAPNAME_C"; - game[ "strings_menu" ][ "war_callsign_d" ] = "@MPUI_CALLSIGN_MAPNAME_D"; - game[ "strings_menu" ][ "war_callsign_e" ] = "@MPUI_CALLSIGN_MAPNAME_E"; - level thread waitforglassbreak(); - if ( getgametypesetting( "allowMapScripting" ) ) - { - level maps/mp/mp_vertigo_doors::init(); - } + level.levelspawndvars = ::levelspawndvars; + level.ragdoll_override = ::ragdoll_override; + maps\mp\mp_vertigo_fx::main(); + maps\mp\_load::main(); + maps\mp\mp_vertigo_amb::main(); + maps\mp\_compass::setupminimap( "compass_map_mp_vertigo" ); + setdvar( "compassmaxrange", "2100" ); + game["strings"]["war_callsign_a"] = &"MPUI_CALLSIGN_MAPNAME_A"; + game["strings"]["war_callsign_b"] = &"MPUI_CALLSIGN_MAPNAME_B"; + game["strings"]["war_callsign_c"] = &"MPUI_CALLSIGN_MAPNAME_C"; + game["strings"]["war_callsign_d"] = &"MPUI_CALLSIGN_MAPNAME_D"; + game["strings"]["war_callsign_e"] = &"MPUI_CALLSIGN_MAPNAME_E"; + game["strings_menu"]["war_callsign_a"] = "@MPUI_CALLSIGN_MAPNAME_A"; + game["strings_menu"]["war_callsign_b"] = "@MPUI_CALLSIGN_MAPNAME_B"; + game["strings_menu"]["war_callsign_c"] = "@MPUI_CALLSIGN_MAPNAME_C"; + game["strings_menu"]["war_callsign_d"] = "@MPUI_CALLSIGN_MAPNAME_D"; + game["strings_menu"]["war_callsign_e"] = "@MPUI_CALLSIGN_MAPNAME_E"; + level thread waitforglassbreak(); + + if ( getgametypesetting( "allowMapScripting" ) ) + level maps\mp\mp_vertigo_doors::init(); } -levelspawndvars( reset_dvars ) //checked matches cerberus output +levelspawndvars( reset_dvars ) { - ss = level.spawnsystem; - ss.enemy_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_radius", "2400", reset_dvars ); - ss.hq_objective_influencer_inner_radius = set_dvar_float_if_unset( "scr_spawn_hq_objective_influencer_inner_radius", "1400", reset_dvars ); + ss = level.spawnsystem; + ss.enemy_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_radius", "2400", reset_dvars ); + ss.hq_objective_influencer_inner_radius = set_dvar_float_if_unset( "scr_spawn_hq_objective_influencer_inner_radius", "1400", reset_dvars ); } -waitforglassbreak() //checked matches cerberus output +waitforglassbreak() { - if ( glassexploderssetupcorrectly( 1000, 3 ) == 0 ) - { - return; - } - if ( glassexploderssetupcorrectly( 1004, 3 ) == 0 ) - { - return; - } - if ( glassexploderssetupcorrectly( 1007, 3 ) == 0 ) - { - return; - } - for ( ;; ) - { - level waittill( "glass_smash", origin ); - playglassexploder( origin, 1000, 3 ); - playglassexploder( origin, 1004, 3 ); - playglassexploder( origin, 1007, 3 ); - } + if ( glassexploderssetupcorrectly( 1000, 3 ) == 0 ) + return; + + if ( glassexploderssetupcorrectly( 1004, 3 ) == 0 ) + return; + + if ( glassexploderssetupcorrectly( 1007, 3 ) == 0 ) + return; + + for (;;) + { + level waittill( "glass_smash", origin ); + + playglassexploder( origin, 1000, 3 ); + playglassexploder( origin, 1004, 3 ); + playglassexploder( origin, 1007, 3 ); + } } -playglassexploder( origin, exploderbase, explodercount ) //checked changed to match cerberus output +playglassexploder( origin, exploderbase, explodercount ) { - distancesq = distancesquared( origin, level.createfxexploders[ exploderbase ][ 0 ].v[ "origin" ] ); - if ( distancesq > 21000 ) - { - return; - } - nearestpane = exploderbase; - if ( distancesq > 5000 ) - { - nearestpane = -1; - distancesq = 5000; - } - nearestpanedistsq = distancesq; - for ( glassexploderindex = 1; glassexploderindex < explodercount; glassexploderindex++ ) - { - glassexploder = glassexploderindex + exploderbase; - currentdistsq = distancesquared( origin, level.createfxexploders[ glassexploder ][ 0 ].v[ "origin" ] ); - if ( currentdistsq < nearestpanedistsq ) - { - nearestpane = glassexploder; - nearestpanedistsq = currentdistsq; - } - } - if ( nearestpane != -1 ) - { - exploder( nearestpane ); - level thread window_smash_wind_sound( origin ); - } + distancesq = distancesquared( origin, level.createfxexploders[exploderbase][0].v["origin"] ); + + if ( distancesq > 21000 ) + return; + + nearestpane = exploderbase; + + if ( distancesq > 5000 ) + { + nearestpane = -1; + distancesq = 5000; + } + + nearestpanedistsq = distancesq; + + for ( glassexploderindex = 1; glassexploderindex < explodercount; glassexploderindex++ ) + { + glassexploder = glassexploderindex + exploderbase; + currentdistsq = distancesquared( origin, level.createfxexploders[glassexploder][0].v["origin"] ); + + if ( currentdistsq < nearestpanedistsq ) + { + nearestpane = glassexploder; + nearestpanedistsq = currentdistsq; + } + } + + if ( nearestpane != -1 ) + { + exploder( nearestpane ); + level thread window_smash_wind_sound( origin ); + } } -window_smash_wind_sound( origin ) //checked matches cerberus output +window_smash_wind_sound( origin ) { - wind_ent = spawn( "script_origin", origin ); - wind_ent playloopsound( "evt_window_wind", 1 ); - level waittill( "game_ended" ); - wind_ent stoploopsound( 0.5 ); - wind_ent delete(); + wind_ent = spawn( "script_origin", origin ); + wind_ent playloopsound( "evt_window_wind", 1 ); + + level waittill( "game_ended" ); + + wind_ent stoploopsound( 0.5 ); + wind_ent delete(); } -glassexploderssetupcorrectly( exploderbase, explodercount ) //checked changed to match cerberus output +glassexploderssetupcorrectly( exploderbase, explodercount ) { - for ( glassexploderindex = 0; glassexploderindex < explodercount; glassexploderindex++ ) - { - glassexploder = glassexploderindex + exploderbase; - if ( !isDefined( level.createfxexploders[ glassexploder ] ) ) - { - /* + for ( glassexploderindex = 0; glassexploderindex < explodercount; glassexploderindex++ ) + { + glassexploder = glassexploderindex + exploderbase; + + if ( !isdefined( level.createfxexploders[glassexploder] ) ) + { /# - assertmsg( "Glass exploder " + glassexploder + " is undefined" ); + assertmsg( "Glass exploder " + glassexploder + " is undefined" ); #/ - */ - return 0; - } - if ( isDefined( level.createfxexploders[ glassexploder ][ 0 ] ) || !isDefined( level.createfxexploders[ glassexploder ][ 0 ].v ) || !isDefined( level.createfxexploders[ glassexploder ][ 0 ].v[ "origin" ] ) ) - { - /* + return false; + } + + if ( !isdefined( level.createfxexploders[glassexploder][0] ) || !isdefined( level.createfxexploders[glassexploder][0].v ) || !isdefined( level.createfxexploders[glassexploder][0].v["origin"] ) ) + { /# - assertmsg( "Glass exploder " + glassexploder + " is undefined" ); + assertmsg( "Glass exploder " + glassexploder + " is undefined" ); #/ - */ - return 0; - } - } - return 1; + return false; + } + } + + return true; } -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" ) - { - deathanim = body getcorpseanim(); - startfrac = deathanimduration / 1000; - if ( animhasnotetrack( deathanim, "start_ragdoll" ) ) - { - times = getnotetracktimes( deathanim, "start_ragdoll" ); - if ( isDefined( times ) ) - { - startfrac = times[ 0 ]; - } - } - self.body = body; - if ( !isDefined( self.switching_teams ) ) - { - thread maps/mp/gametypes/_deathicons::adddeathicon( body, self, self.team, 5 ); - } - thread startragdollonground( startfrac ); - return 1; - } - return 0; + if ( smeansofdeath == "MOD_FALLING" ) + { + deathanim = body getcorpseanim(); + startfrac = deathanimduration / 1000; + + if ( animhasnotetrack( deathanim, "start_ragdoll" ) ) + { + times = getnotetracktimes( deathanim, "start_ragdoll" ); + + if ( isdefined( times ) ) + startfrac = times[0]; + } + + self.body = body; + + if ( !isdefined( self.switching_teams ) ) + thread maps\mp\gametypes\_deathicons::adddeathicon( body, self, self.team, 5.0 ); + + thread startragdollonground( startfrac ); + return true; + } + + return false; } -startragdollonground( deathanimduration ) //checked does not match cerberus output did not change +startragdollonground( deathanimduration ) { - timer = 0; - while ( timer < deathanimduration ) - { - if ( !isDefined( self ) || !isDefined( self.body ) ) - { - return; - } - if ( self isonground() ) - { - break; - } - else - { - wait 0.05; - timer += 0.05; - } - } - if ( !isDefined( self ) || !isDefined( self.body ) ) - { - return; - } - self.body startragdoll(); -} + for ( timer = 0; timer < deathanimduration; timer += 0.05 ) + { + if ( !isdefined( self ) || !isdefined( self.body ) ) + return; + if ( self isonground() ) + break; + + wait 0.05; + } + + if ( !isdefined( self ) || !isdefined( self.body ) ) + return; + + self.body startragdoll(); +} diff --git a/Multiplayer Core/patch_mp/maps/mp/mp_village.gsc b/Multiplayer Core/patch_mp/maps/mp/mp_village.gsc index f5a5cd5..ee3af2a 100644 --- a/Multiplayer Core/patch_mp/maps/mp/mp_village.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/mp_village.gsc @@ -1,122 +1,141 @@ -//checked includes changed to match cerberus output -#include maps/mp/_compass; -#include maps/mp/mp_village_amb; -#include maps/mp/_load; -#include maps/mp/mp_village_fx; -#include maps/mp/_utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\_utility; +#include maps\mp\mp_village_fx; +#include maps\mp\_load; +#include maps\mp\mp_village_amb; +#include maps\mp\_compass; -main() //checked changed to match cerberus output +main() { - level.levelspawndvars = ::levelspawndvars; - maps/mp/mp_village_fx::main(); - precachemodel( "collision_physics_32x32x32" ); - precachemodel( "collision_physics_32x32x128" ); - precachemodel( "collision_physics_128x128x10" ); - precachemodel( "collision_physics_256x256x10" ); - precachemodel( "collision_clip_wall_64x64x10" ); - precachemodel( "afr_corrugated_metal8x8" ); - precachemodel( "p6_pak_old_plywood" ); - destructibles = getentarray( "destructible", "targetname" ); - foreach ( destructible in destructibles ) - { - if ( destructible.destructibledef == "dest_propanetank_01" ) - { - destructible thread death_sound_think(); - } - } - foreach ( destructible in destructibles ) - { - if ( destructible getentitynumber() == 553 ) - { - destructible delete(); - break; - } - } - maps/mp/_load::main(); - maps/mp/mp_village_amb::main(); - maps/mp/_compass::setupminimap( "compass_map_mp_village" ); - game[ "strings" ][ "war_callsign_a" ] = &"MPUI_CALLSIGN_MAPNAME_A"; - game[ "strings" ][ "war_callsign_b" ] = &"MPUI_CALLSIGN_MAPNAME_B"; - game[ "strings" ][ "war_callsign_c" ] = &"MPUI_CALLSIGN_MAPNAME_C"; - game[ "strings" ][ "war_callsign_d" ] = &"MPUI_CALLSIGN_MAPNAME_D"; - game[ "strings" ][ "war_callsign_e" ] = &"MPUI_CALLSIGN_MAPNAME_E"; - game[ "strings_menu" ][ "war_callsign_a" ] = "@MPUI_CALLSIGN_MAPNAME_A"; - game[ "strings_menu" ][ "war_callsign_b" ] = "@MPUI_CALLSIGN_MAPNAME_B"; - game[ "strings_menu" ][ "war_callsign_c" ] = "@MPUI_CALLSIGN_MAPNAME_C"; - game[ "strings_menu" ][ "war_callsign_d" ] = "@MPUI_CALLSIGN_MAPNAME_D"; - game[ "strings_menu" ][ "war_callsign_e" ] = "@MPUI_CALLSIGN_MAPNAME_E"; - spawncollision( "collision_physics_32x32x32", "collider", ( 610, -126, 60 ), vectorScale( ( 1, 0, 0 ), 287.2 ) ); - spawncollision( "collision_physics_32x32x32", "collider", ( 590, -126, 67 ), vectorScale( ( 1, 0, 0 ), 287.2 ) ); - spawncollision( "collision_physics_32x32x32", "collider", ( 602, -233, 70 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_wall_128x128x10", "collider", ( 707, -812, 32 ), vectorScale( ( 0, 1, 0 ), 270 ) ); - spawncollision( "collision_physics_wall_128x128x10", "collider", ( 707, -730, 32 ), vectorScale( ( 0, 1, 0 ), 270 ) ); - spawncollision( "collision_physics_32x32x128", "collider", ( -1056, -1294, 32 ), vectorScale( ( 1, 0, 0 ), 270 ) ); - spawncollision( "collision_physics_32x32x128", "collider", ( -960, -1294, 32 ), vectorScale( ( 1, 0, 0 ), 270 ) ); - spawncollision( "collision_physics_32x32x128", "collider", ( -1057, -1294, 111 ), vectorScale( ( 1, 0, 0 ), 270 ) ); - spawncollision( "collision_physics_32x32x128", "collider", ( -964, -1294, 111 ), vectorScale( ( 1, 0, 0 ), 270 ) ); - spawncollision( "collision_physics_32x32x128", "collider", ( -344, 1356, 264 ), ( 270, 276.8, -6.8 ) ); - spawncollision( "collision_physics_32x32x128", "collider", ( -344, 1407, 264 ), ( 270, 276.8, -6.8 ) ); - spawncollision( "collision_physics_32x32x32", "collider", ( -1335.5, -1667, 196 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_32x32x32", "collider", ( -1335.5, -1676, 196 ), ( 0, 0, 0 ) ); - metalsheet1 = spawn( "script_model", ( -1487, 1156, 10 ) ); - metalsheet1.angles = vectorScale( ( 0, 0, -1 ), 90 ); - metalsheet1 setmodel( "afr_corrugated_metal8x8" ); - metalsheet1 = spawn( "script_model", ( -1487, 1252, 10 ) ); - metalsheet1.angles = vectorScale( ( 0, 0, -1 ), 90 ); - metalsheet1 setmodel( "afr_corrugated_metal8x8" ); - metalsheet1 = spawn( "script_model", ( -1487, 1348, 10 ) ); - metalsheet1.angles = vectorScale( ( 0, 0, -1 ), 90 ); - metalsheet1 setmodel( "afr_corrugated_metal8x8" ); - metalsheet1 = spawn( "script_model", ( -1487, 1444, 10 ) ); - metalsheet1.angles = vectorScale( ( 0, 0, -1 ), 90 ); - metalsheet1 setmodel( "afr_corrugated_metal8x8" ); - spawncollision( "collision_physics_32x32x32", "collider", ( 1095, 1482, 31 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_32x32x32", "collider", ( 1095, 1519, 31 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_32x32x32", "collider", ( 1054, 1552, 68 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_32x32x32", "collider", ( 1054, 1589, 68 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_32x32x32", "collider", ( 1054, 1552, 39 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_32x32x32", "collider", ( 1054, 1589, 39 ), ( 0, 0, 0 ) ); - spawncollision( "collision_physics_32x32x32", "collider", ( 1023.52, 1577.46, 37.8172 ), ( 353.857, 287.799, 18.4368 ) ); - spawncollision( "collision_physics_32x32x32", "collider", ( 990.481, 1565.54, 26.1828 ), ( 353.857, 287.799, 18.4368 ) ); - spawncollision( "collision_physics_32x32x32", "collider", ( 952.701, 1488.68, 29 ), vectorScale( ( 0, 1, 0 ), 24.6 ) ); - spawncollision( "collision_physics_32x32x32", "collider", ( 937.299, 1522.32, 29 ), vectorScale( ( 0, 1, 0 ), 24.6 ) ); - spawncollision( "collision_physics_256x256x10", "collider", ( 596, -1545, -8 ), vectorScale( ( 1, 0, 0 ), 2.2 ) ); - spawncollision( "collision_physics_32x32x128", "collider", ( 628.255, -1724.02, 2 ), ( 270, 307.4, 0 ) ); - spawncollision( "collision_physics_32x32x128", "collider", ( 645.992, -1840.11, 2 ), ( 270, 251.2, 0 ) ); - spawncollision( "collision_physics_32x32x128", "collider", ( 560.513, -1921.33, 2 ), ( 270, 196.2, 0 ) ); - spawncollision( "collision_physics_32x32x128", "collider", ( 443.23, -1896.61, 2 ), ( 270, 140.6, 0 ) ); - spawncollision( "collision_physics_32x32x128", "collider", ( 400.756, -1788.41, 2 ), ( 270, 85.6, 0 ) ); - spawncollision( "collision_physics_32x32x128", "collider", ( 435.565, -1707.94, 2 ), ( 270, 44.4, 0 ) ); - spawncollision( "collision_physics_32x32x128", "collider", ( 523, -1672, 2 ), vectorScale( ( 1, 0, 0 ), 270 ) ); - spawncollision( "collision_physics_32x32x32", "collider", ( -1861, -1004, 239 ), vectorScale( ( 0, 1, 0 ), 346 ) ); - spawncollision( "collision_physics_32x32x32", "collider", ( -1867, -1023, 239 ), vectorScale( ( 0, 1, 0 ), 346 ) ); - spawncollision( "collision_physics_32x32x32", "collider", ( -1861, -1324, 239 ), vectorScale( ( 0, 1, 0 ), 346 ) ); - spawncollision( "collision_physics_32x32x32", "collider", ( -1867, -1343, 239 ), vectorScale( ( 0, 1, 0 ), 346 ) ); - spawncollision( "collision_physics_32x32x32", "collider", ( -1876, -1400, 239 ), vectorScale( ( 0, 1, 0 ), 61 ) ); - spawncollision( "collision_physics_32x32x32", "collider", ( -1859, -1411, 239 ), vectorScale( ( 0, 1, 0 ), 61 ) ); - spawncollision( "collision_physics_32x32x128", "collider", ( 1335, 1029, 55 ), vectorScale( ( 1, 0, 0 ), 270 ) ); - spawncollision( "collision_physics_256x256x10", "collider", ( 645, -1562, 0 ), vectorScale( ( 0, 0, 1 ), 3 ) ); - level.levelkothdisable = []; - level.levelkothdisable[ level.levelkothdisable.size ] = spawn( "trigger_radius", ( -176, 1512, 133.5 ), 0, 60, 25 ); - level.levelkothdisable[ level.levelkothdisable.size ] = spawn( "trigger_radius", ( 243.5, 1010, 145.5 ), 0, 60, 25 ); - spawncollision( "collision_clip_wall_64x64x10", "collider", ( 1180, 1399.5, 34.5 ), ( 357.9, 356.4, -3.28 ) ); - board1 = spawn( "script_model", ( -633.5, 646.2, 22.45 ) ); - board1.angles = ( 0, 195.6, 90 ); - board1 setmodel( "p6_pak_old_plywood" ); - board2 = spawn( "script_model", ( -627.66, 646.19, 22.45 ) ); - board2.angles = ( 0, 184.4, 90 ); - board2 setmodel( "p6_pak_old_plywood" ); + level.levelspawndvars = ::levelspawndvars; + level thread spawnkilltrigger(); + maps\mp\mp_village_fx::main(); + precachemodel( "collision_physics_32x32x32" ); + precachemodel( "collision_physics_32x32x128" ); + precachemodel( "collision_physics_128x128x10" ); + precachemodel( "collision_physics_256x256x10" ); + precachemodel( "collision_clip_wall_64x64x10" ); + precachemodel( "collision_clip_64x64x10" ); + precachemodel( "afr_corrugated_metal8x8" ); + precachemodel( "p6_pak_old_plywood" ); + destructibles = getentarray( "destructible", "targetname" ); + + foreach ( destructible in destructibles ) + { + if ( destructible.destructibledef == "dest_propanetank_01" ) + destructible thread death_sound_think(); + } + + foreach ( destructible in destructibles ) + { + if ( destructible getentitynumber() == 553 ) + { + destructible delete(); + break; + } + } + + maps\mp\_load::main(); + maps\mp\mp_village_amb::main(); + maps\mp\_compass::setupminimap( "compass_map_mp_village" ); + game["strings"]["war_callsign_a"] = &"MPUI_CALLSIGN_MAPNAME_A"; + game["strings"]["war_callsign_b"] = &"MPUI_CALLSIGN_MAPNAME_B"; + game["strings"]["war_callsign_c"] = &"MPUI_CALLSIGN_MAPNAME_C"; + game["strings"]["war_callsign_d"] = &"MPUI_CALLSIGN_MAPNAME_D"; + game["strings"]["war_callsign_e"] = &"MPUI_CALLSIGN_MAPNAME_E"; + game["strings_menu"]["war_callsign_a"] = "@MPUI_CALLSIGN_MAPNAME_A"; + game["strings_menu"]["war_callsign_b"] = "@MPUI_CALLSIGN_MAPNAME_B"; + game["strings_menu"]["war_callsign_c"] = "@MPUI_CALLSIGN_MAPNAME_C"; + game["strings_menu"]["war_callsign_d"] = "@MPUI_CALLSIGN_MAPNAME_D"; + game["strings_menu"]["war_callsign_e"] = "@MPUI_CALLSIGN_MAPNAME_E"; + spawncollision( "collision_physics_32x32x32", "collider", ( 610, -126, 60 ), vectorscale( ( 1, 0, 0 ), 287.2 ) ); + spawncollision( "collision_physics_32x32x32", "collider", ( 590, -126, 67 ), vectorscale( ( 1, 0, 0 ), 287.2 ) ); + spawncollision( "collision_physics_32x32x32", "collider", ( 602, -233, 70 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_wall_128x128x10", "collider", ( 707, -812, 32 ), vectorscale( ( 0, 1, 0 ), 270.0 ) ); + spawncollision( "collision_physics_wall_128x128x10", "collider", ( 707, -730, 32 ), vectorscale( ( 0, 1, 0 ), 270.0 ) ); + spawncollision( "collision_physics_32x32x128", "collider", ( -1056, -1294, 32 ), vectorscale( ( 1, 0, 0 ), 270.0 ) ); + spawncollision( "collision_physics_32x32x128", "collider", ( -960, -1294, 32 ), vectorscale( ( 1, 0, 0 ), 270.0 ) ); + spawncollision( "collision_physics_32x32x128", "collider", ( -1057, -1294, 111 ), vectorscale( ( 1, 0, 0 ), 270.0 ) ); + spawncollision( "collision_physics_32x32x128", "collider", ( -964, -1294, 111 ), vectorscale( ( 1, 0, 0 ), 270.0 ) ); + spawncollision( "collision_physics_32x32x128", "collider", ( -344, 1356, 264 ), ( 270, 276.8, -6.8 ) ); + spawncollision( "collision_physics_32x32x128", "collider", ( -344, 1407, 264 ), ( 270, 276.8, -6.8 ) ); + spawncollision( "collision_physics_32x32x32", "collider", ( -1335.5, -1667, 196 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_32x32x32", "collider", ( -1335.5, -1676, 196 ), ( 0, 0, 0 ) ); + metalsheet1 = spawn( "script_model", ( -1487, 1156, 10 ) ); + metalsheet1.angles = vectorscale( ( 0, 0, -1 ), 90.0 ); + metalsheet1 setmodel( "afr_corrugated_metal8x8" ); + metalsheet1 = spawn( "script_model", ( -1487, 1252, 10 ) ); + metalsheet1.angles = vectorscale( ( 0, 0, -1 ), 90.0 ); + metalsheet1 setmodel( "afr_corrugated_metal8x8" ); + metalsheet1 = spawn( "script_model", ( -1487, 1348, 10 ) ); + metalsheet1.angles = vectorscale( ( 0, 0, -1 ), 90.0 ); + metalsheet1 setmodel( "afr_corrugated_metal8x8" ); + metalsheet1 = spawn( "script_model", ( -1487, 1444, 10 ) ); + metalsheet1.angles = vectorscale( ( 0, 0, -1 ), 90.0 ); + metalsheet1 setmodel( "afr_corrugated_metal8x8" ); + spawncollision( "collision_physics_32x32x32", "collider", ( 1095, 1482, 31 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_32x32x32", "collider", ( 1095, 1519, 31 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_32x32x32", "collider", ( 1054, 1552, 68 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_32x32x32", "collider", ( 1054, 1589, 68 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_32x32x32", "collider", ( 1054, 1552, 39 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_32x32x32", "collider", ( 1054, 1589, 39 ), ( 0, 0, 0 ) ); + spawncollision( "collision_physics_32x32x32", "collider", ( 1023.52, 1577.46, 37.8172 ), ( 353.857, 287.799, 18.4368 ) ); + spawncollision( "collision_physics_32x32x32", "collider", ( 990.481, 1565.54, 26.1828 ), ( 353.857, 287.799, 18.4368 ) ); + spawncollision( "collision_physics_32x32x32", "collider", ( 952.701, 1488.68, 29 ), vectorscale( ( 0, 1, 0 ), 24.6 ) ); + spawncollision( "collision_physics_32x32x32", "collider", ( 937.299, 1522.32, 29 ), vectorscale( ( 0, 1, 0 ), 24.6 ) ); + spawncollision( "collision_physics_256x256x10", "collider", ( 596, -1545, -8 ), vectorscale( ( 1, 0, 0 ), 2.2 ) ); + spawncollision( "collision_physics_32x32x128", "collider", ( 628.255, -1724.02, 2 ), ( 270, 307.4, 0 ) ); + spawncollision( "collision_physics_32x32x128", "collider", ( 645.992, -1840.11, 2 ), ( 270, 251.2, 0 ) ); + spawncollision( "collision_physics_32x32x128", "collider", ( 560.513, -1921.33, 2 ), ( 270, 196.2, 0 ) ); + spawncollision( "collision_physics_32x32x128", "collider", ( 443.23, -1896.61, 2 ), ( 270, 140.6, 0 ) ); + spawncollision( "collision_physics_32x32x128", "collider", ( 400.756, -1788.41, 2 ), ( 270, 85.6, 0 ) ); + spawncollision( "collision_physics_32x32x128", "collider", ( 435.565, -1707.94, 2 ), ( 270, 44.4, 0 ) ); + spawncollision( "collision_physics_32x32x128", "collider", ( 523, -1672, 2 ), vectorscale( ( 1, 0, 0 ), 270.0 ) ); + spawncollision( "collision_physics_32x32x32", "collider", ( -1861, -1004, 239 ), vectorscale( ( 0, 1, 0 ), 346.0 ) ); + spawncollision( "collision_physics_32x32x32", "collider", ( -1867, -1023, 239 ), vectorscale( ( 0, 1, 0 ), 346.0 ) ); + spawncollision( "collision_physics_32x32x32", "collider", ( -1861, -1324, 239 ), vectorscale( ( 0, 1, 0 ), 346.0 ) ); + spawncollision( "collision_physics_32x32x32", "collider", ( -1867, -1343, 239 ), vectorscale( ( 0, 1, 0 ), 346.0 ) ); + spawncollision( "collision_physics_32x32x32", "collider", ( -1876, -1400, 239 ), vectorscale( ( 0, 1, 0 ), 61.0 ) ); + spawncollision( "collision_physics_32x32x32", "collider", ( -1859, -1411, 239 ), vectorscale( ( 0, 1, 0 ), 61.0 ) ); + spawncollision( "collision_physics_32x32x128", "collider", ( 1335, 1029, 55 ), vectorscale( ( 1, 0, 0 ), 270.0 ) ); + spawncollision( "collision_physics_256x256x10", "collider", ( 645, -1562, 0 ), vectorscale( ( 0, 0, 1 ), 3.0 ) ); + level.levelkothdisable = []; + level.levelkothdisable[level.levelkothdisable.size] = spawn( "trigger_radius", ( -176, 1512, 133.5 ), 0, 60, 25 ); + level.levelkothdisable[level.levelkothdisable.size] = spawn( "trigger_radius", ( 243.5, 1010, 145.5 ), 0, 60, 25 ); + spawncollision( "collision_clip_wall_64x64x10", "collider", ( 1180, 1399.5, 34.5 ), ( 357.9, 356.4, -3.28 ) ); + spawncollision( "collision_clip_64x64x10", "collider", ( -83.966, 1292.63, 135.543 ), ( 0, 0, 0 ) ); + spawncollision( "collision_clip_64x64x10", "collider", ( -94.7516, 1383.63, 135.54 ), ( 0, 0, 0 ) ); + board1 = spawn( "script_model", ( -633.5, 646.2, 22.45 ) ); + board1.angles = ( 0, 195.6, 90 ); + board1 setmodel( "p6_pak_old_plywood" ); + board2 = spawn( "script_model", ( -627.66, 646.19, 22.45 ) ); + board2.angles = ( 0, 184.4, 90 ); + board2 setmodel( "p6_pak_old_plywood" ); } -levelspawndvars( reset_dvars ) //checked matches cerberus output +levelspawndvars( reset_dvars ) { - ss = level.spawnsystem; - ss.enemy_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_radius", "2300", reset_dvars ); + ss = level.spawnsystem; + ss.enemy_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_radius", "2300", reset_dvars ); } -death_sound_think() //checked matches cerberus output +death_sound_think() { - self waittill( "destructible_base_piece_death" ); - self playsound( "exp_barrel" ); + self waittill( "destructible_base_piece_death" ); + + self playsound( "exp_barrel" ); } +spawnkilltrigger() +{ + trigger = spawn( "trigger_radius", ( -108.857, 1221.1, 132.467 ), 0, 200, 5 ); + trigger = spawn( "trigger_radius", ( -213.452, 1405.1, 137 ), 0, 75, 5 ); + + while ( true ) + { + trigger waittill( "trigger", player ); + + player dodamage( player.health * 2, trigger.origin, trigger, trigger, "none", "MOD_SUICIDE", 0, "lava_mp" ); + } +} diff --git a/Multiplayer Core/patch_mp/maps/mp/teams/_teams.gsc b/Multiplayer Core/patch_mp/maps/mp/teams/_teams.gsc index 12cd788..dcd40ef 100644 --- a/Multiplayer Core/patch_mp/maps/mp/teams/_teams.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/teams/_teams.gsc @@ -1,373 +1,372 @@ -//checked includes match cerberus output -#include maps/mp/gametypes/_spectating; -#include maps/mp/gametypes/_globallogic_ui; -#include maps/mp/gametypes/_persistence; -#include maps/mp/_utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\_utility; +#include maps\mp\gametypes\_persistence; +#include maps\mp\gametypes\_globallogic_ui; +#include maps\mp\gametypes\_spectating; -init() //checked matches cerberus output +init() { - precacheshader( "mpflag_spectator" ); - game[ "strings" ][ "autobalance" ] = &"MP_AUTOBALANCE_NOW"; - precachestring( &"MP_AUTOBALANCE_NOW" ); - if ( getDvar( "scr_teambalance" ) == "" ) - { - setdvar( "scr_teambalance", "0" ); - } - level.teambalance = getDvarInt( "scr_teambalance" ); - level.teambalancetimer = 0; - if ( getDvar( "scr_timeplayedcap" ) == "" ) - { - setdvar( "scr_timeplayedcap", "1800" ); - } - level.timeplayedcap = int( getDvarInt( "scr_timeplayedcap" ) ); - level.freeplayers = []; - if ( level.teambased ) - { - level.alliesplayers = []; - level.axisplayers = []; - level thread onplayerconnect(); - level thread updateteambalancedvar(); - wait 0.15; - if ( level.rankedmatch || level.leaguematch ) - { - level thread updateplayertimes(); - } - } - else - { - level thread onfreeplayerconnect(); - wait 0.15; - if ( level.rankedmatch || level.leaguematch ) - { - level thread updateplayertimes(); - } - } + precacheshader( "mpflag_spectator" ); + game["strings"]["autobalance"] = &"MP_AUTOBALANCE_NOW"; + precachestring( &"MP_AUTOBALANCE_NOW" ); + + if ( getdvar( "scr_teambalance" ) == "" ) + setdvar( "scr_teambalance", "0" ); + + level.teambalance = getdvarint( "scr_teambalance" ); + level.teambalancetimer = 0; + + if ( getdvar( "scr_timeplayedcap" ) == "" ) + setdvar( "scr_timeplayedcap", "1800" ); + + level.timeplayedcap = int( getdvarint( "scr_timeplayedcap" ) ); + level.freeplayers = []; + + if ( level.teambased ) + { + level.alliesplayers = []; + level.axisplayers = []; + level thread onplayerconnect(); + level thread updateteambalancedvar(); + wait 0.15; + + if ( level.rankedmatch || level.leaguematch ) + level thread updateplayertimes(); + } + else + { + level thread onfreeplayerconnect(); + wait 0.15; + + if ( level.rankedmatch || level.leaguematch ) + level thread updateplayertimes(); + } } -onplayerconnect() //checked matches cerberus output +onplayerconnect() { - for ( ;; ) - { - level waittill( "connecting", player ); - player thread onjoinedteam(); - player thread onjoinedspectators(); - player thread trackplayedtime(); - } + for (;;) + { + level waittill( "connecting", player ); + + player thread onjoinedteam(); + player thread onjoinedspectators(); + player thread trackplayedtime(); + } } -onfreeplayerconnect() //checked matches cerberus output +onfreeplayerconnect() { - for ( ;; ) - { - level waittill( "connecting", player ); - player thread trackfreeplayedtime(); - } + for (;;) + { + level waittill( "connecting", player ); + + player thread trackfreeplayedtime(); + } } -onjoinedteam() //checked matches cerberus output +onjoinedteam() { - self endon( "disconnect" ); - for ( ;; ) - { - self waittill( "joined_team" ); - self logstring( "joined team: " + self.pers[ "team" ] ); - self updateteamtime(); - } + self endon( "disconnect" ); + + for (;;) + { + self waittill( "joined_team" ); + + self logstring( "joined team: " + self.pers["team"] ); + self updateteamtime(); + } } -onjoinedspectators() //checked changed to match cerberus output +onjoinedspectators() { - self endon( "disconnect" ); - for ( ;; ) - { - self waittill( "joined_spectators" ); - self.pers["teamTime"] = undefined; - } + self endon( "disconnect" ); + + for (;;) + { + self waittill( "joined_spectators" ); + + self.pers["teamTime"] = undefined; + } } -trackplayedtime() //checked partially changed to match beta dump see info.md +trackplayedtime() { - self endon( "disconnect" ); - foreach ( team in level.teams ) - { - self.timeplayed[ team ] = 0; - } - self.timeplayed[ "free" ] = 0; - self.timeplayed[ "other" ] = 0; - self.timeplayed[ "alive" ] = 0; - if ( level.gametype == "twar" && game[ "roundsplayed" ] >= 0 && self.timeplayed[ "total" ] >= 0 ) - { - self.timeplayed[ "total" ] = 0; - } - if ( !isDefined( self.timeplayed[ "total" ] ) ) - { - self.timeplayed[ "total" ] = 0; - } - while ( level.inprematchperiod ) - { - wait 0.05; - } - for ( ;; ) - { - if ( game[ "state" ] == "playing" ) - { - if ( isDefined( level.teams[ self.sessionteam ] ) ) - { - self.timeplayed[ self.sessionteam ]++; - self.timeplayed[ "total" ]++; - if ( isalive( self ) ) - { - self.timeplayed[ "alive" ]++; - } - } - else if ( self.sessionteam == "spectator" ) - { - self.timeplayed[ "other" ]++; - } - } - wait 1; - } + self endon( "disconnect" ); + + foreach ( team in level.teams ) + self.timeplayed[team] = 0; + + self.timeplayed["free"] = 0; + self.timeplayed["other"] = 0; + self.timeplayed["alive"] = 0; + + if ( !isdefined( self.timeplayed["total"] ) || !( level.gametype == "twar" && 0 < game["roundsplayed"] && 0 < self.timeplayed["total"] ) ) + self.timeplayed["total"] = 0; + + while ( level.inprematchperiod ) + wait 0.05; + + for (;;) + { + if ( game["state"] == "playing" ) + { + if ( isdefined( level.teams[self.sessionteam] ) ) + { + self.timeplayed[self.sessionteam]++; + self.timeplayed["total"]++; + + if ( isalive( self ) ) + self.timeplayed["alive"]++; + } + else if ( self.sessionteam == "spectator" ) + self.timeplayed["other"]++; + } + + wait 1.0; + } } -updateplayertimes() //checked changed to match cerberus output +updateplayertimes() { - nexttoupdate = 0; - for ( ;; ) - { - nexttoupdate++; - if ( nexttoupdate >= level.players.size ) - { - nexttoupdate = 0; - } - if ( isDefined( level.players[ nexttoupdate ] ) ) - { - level.players[ nexttoupdate ] updateplayedtime(); - level.players[ nexttoupdate ] maps/mp/gametypes/_persistence::checkcontractexpirations(); - } - wait 1; - } + nexttoupdate = 0; + + for (;;) + { + nexttoupdate++; + + if ( nexttoupdate >= level.players.size ) + nexttoupdate = 0; + + if ( isdefined( level.players[nexttoupdate] ) ) + { + level.players[nexttoupdate] updateplayedtime(); + level.players[nexttoupdate] maps\mp\gametypes\_persistence::checkcontractexpirations(); + } + + wait 1.0; + } } -updateplayedtime() //checked changed to match cerberus output +updateplayedtime() { - pixbeginevent( "updatePlayedTime" ); - foreach ( team in level.teams ) - { - if ( self.timeplayed[ team ] ) - { - self addplayerstat( "time_played_" + team, int( min( self.timeplayed[ team ], level.timeplayedcap ) ) ); - self addplayerstatwithgametype( "time_played_total", int( min( self.timeplayed[ team ], level.timeplayedcap ) ) ); - } - } - if ( self.timeplayed[ "other" ] ) - { - self addplayerstat( "time_played_other", int( min( self.timeplayed[ "other" ], level.timeplayedcap ) ) ); - self addplayerstatwithgametype( "time_played_total", int( min( self.timeplayed[ "other" ], level.timeplayedcap ) ) ); - } - if ( self.timeplayed[ "alive" ] ) - { - timealive = int( min( self.timeplayed[ "alive" ], level.timeplayedcap ) ); - self maps/mp/gametypes/_persistence::incrementcontracttimes( timealive ); - self addplayerstat( "time_played_alive", timealive ); - } - pixendevent(); - if ( game[ "state" ] == "postgame" ) - { - return; - } - foreach ( team in level.teams ) - { - self.timeplayed[ team ] = 0; - } - self.timeplayed[ "other" ] = 0; - self.timeplayed[ "alive" ] = 0; + pixbeginevent( "updatePlayedTime" ); + + foreach ( team in level.teams ) + { + if ( self.timeplayed[team] ) + { + self addplayerstat( "time_played_" + team, int( min( self.timeplayed[team], level.timeplayedcap ) ) ); + self addplayerstatwithgametype( "time_played_total", int( min( self.timeplayed[team], level.timeplayedcap ) ) ); + } + } + + if ( self.timeplayed["other"] ) + { + self addplayerstat( "time_played_other", int( min( self.timeplayed["other"], level.timeplayedcap ) ) ); + self addplayerstatwithgametype( "time_played_total", int( min( self.timeplayed["other"], level.timeplayedcap ) ) ); + } + + if ( self.timeplayed["alive"] ) + { + timealive = int( min( self.timeplayed["alive"], level.timeplayedcap ) ); + self maps\mp\gametypes\_persistence::incrementcontracttimes( timealive ); + self addplayerstat( "time_played_alive", timealive ); + } + + pixendevent(); + + if ( game["state"] == "postgame" ) + return; + + foreach ( team in level.teams ) + self.timeplayed[team] = 0; + + self.timeplayed["other"] = 0; + self.timeplayed["alive"] = 0; } -updateteamtime() //checked matches cerberus output +updateteamtime() { - if ( game[ "state" ] != "playing" ) - { - return; - } - self.pers[ "teamTime" ] = getTime(); + if ( game["state"] != "playing" ) + return; + + self.pers["teamTime"] = gettime(); } -updateteambalancedvar() //checked matches cerberus output +updateteambalancedvar() { - for ( ;; ) - { - teambalance = getDvarInt( "scr_teambalance" ); - if ( level.teambalance != teambalance ) - { - level.teambalance = getDvarInt( "scr_teambalance" ); - } - timeplayedcap = getDvarInt( "scr_timeplayedcap" ); - if ( level.timeplayedcap != timeplayedcap ) - { - level.timeplayedcap = int( getDvarInt( "scr_timeplayedcap" ) ); - } - wait 1; - } + for (;;) + { + teambalance = getdvarint( "scr_teambalance" ); + + if ( level.teambalance != teambalance ) + level.teambalance = getdvarint( "scr_teambalance" ); + + timeplayedcap = getdvarint( "scr_timeplayedcap" ); + + if ( level.timeplayedcap != timeplayedcap ) + level.timeplayedcap = int( getdvarint( "scr_timeplayedcap" ) ); + + wait 1; + } } -changeteam( team ) //checked changed to match cerberus output +changeteam( team ) { - if ( self.sessionstate != "dead" ) - { - self.switching_teams = 1; - self.joining_team = team; - self.leaving_team = self.pers[ "team" ]; - self suicide(); - } - self.pers[ "team" ] = team; - self.team = team; - self.pers["weapon"] = undefined; - self.pers["spawnweapon"] = undefined; - self.pers["savedmodel"] = undefined; - self.pers["teamTime"] = undefined; - self.sessionteam = self.pers[ "team" ]; - if ( !level.teambased ) - { - self.ffateam = team; - } - self maps/mp/gametypes/_globallogic_ui::updateobjectivetext(); - self maps/mp/gametypes/_spectating::setspectatepermissions(); - self setclientscriptmainmenu( game[ "menu_class" ] ); - self openmenu( game[ "menu_class" ] ); - self notify( "end_respawn" ); + if ( self.sessionstate != "dead" ) + { + self.switching_teams = 1; + self.joining_team = team; + self.leaving_team = self.pers["team"]; + self suicide(); + } + + self.pers["team"] = team; + self.team = team; + self.pers["weapon"] = undefined; + self.pers["spawnweapon"] = undefined; + self.pers["savedmodel"] = undefined; + self.pers["teamTime"] = undefined; + self.sessionteam = self.pers["team"]; + + if ( !level.teambased ) + self.ffateam = team; + + self maps\mp\gametypes\_globallogic_ui::updateobjectivetext(); + self maps\mp\gametypes\_spectating::setspectatepermissions(); + self setclientscriptmainmenu( game["menu_class"] ); + self openmenu( game["menu_class"] ); + self notify( "end_respawn" ); } -countplayers() //checked partially changed to match cerberus output see info.md +countplayers() { - players = level.players; - playercounts = []; - foreach ( team in level.teams ) - { - playercounts[ team ] = 0; - } - foreach ( player in level.players ) - { - if ( player == self ) - { - } - else - { - team = player.pers[ "team" ]; - if ( isDefined( team ) && isDefined( level.teams[ team ] ) ) - { - playercounts[ team ]++; - } - } - } - return playercounts; + players = level.players; + playercounts = []; + + foreach ( team in level.teams ) + playercounts[team] = 0; + + foreach ( player in level.players ) + { + if ( player == self ) + continue; + + team = player.pers["team"]; + + if ( isdefined( team ) && isdefined( level.teams[team] ) ) + playercounts[team]++; + } + + return playercounts; } -trackfreeplayedtime() //checked changed to match cerberus output +trackfreeplayedtime() { - self endon( "disconnect" ); - foreach ( team in level.teams ) - { - self.timeplayed[ team ] = 0; - } - self.timeplayed[ "other" ] = 0; - self.timeplayed[ "total" ] = 0; - self.timeplayed[ "alive" ] = 0; - for ( ;; ) - { - if ( game[ "state" ] == "playing" ) - { - team = self.pers[ "team" ]; - if ( isDefined( team ) && isDefined( level.teams[ team ] ) && self.sessionteam != "spectator" ) - { - self.timeplayed[ team ]++; - self.timeplayed[ "total" ]++; - if ( isalive( self ) ) - { - self.timeplayed[ "alive" ]++; - } - } - else - { - self.timeplayed[ "other" ]++; - } - } - wait 1; - } + self endon( "disconnect" ); + + foreach ( team in level.teams ) + self.timeplayed[team] = 0; + + self.timeplayed["other"] = 0; + self.timeplayed["total"] = 0; + self.timeplayed["alive"] = 0; + + for (;;) + { + if ( game["state"] == "playing" ) + { + team = self.pers["team"]; + + if ( isdefined( team ) && isdefined( level.teams[team] ) && self.sessionteam != "spectator" ) + { + self.timeplayed[team]++; + self.timeplayed["total"]++; + + if ( isalive( self ) ) + self.timeplayed["alive"]++; + } + else + self.timeplayed["other"]++; + } + + wait 1.0; + } } -set_player_model( team, weapon ) //checked matches cerberus output +set_player_model( team, weapon ) { - weaponclass = getweaponclass( weapon ); - bodytype = "default"; - switch( weaponclass ) - { - case "weapon_sniper": - bodytype = "rifle"; - break; - case "weapon_cqb": - bodytype = "spread"; - break; - case "weapon_lmg": - bodytype = "mg"; - break; - case "weapon_smg": - bodytype = "smg"; - break; - } - self detachall(); - self setmovespeedscale( 1 ); - self setsprintduration( 4 ); - self setsprintcooldown( 0 ); - if ( level.multiteam ) - { - bodytype = "default"; - switch( team ) - { - case "team7": - case "team8": - team = "allies"; - break; - } - } - self [[ game[ "set_player_model" ][ team ][ bodytype ] ]](); + weaponclass = getweaponclass( weapon ); + bodytype = "default"; + + switch ( weaponclass ) + { + case "weapon_sniper": + bodytype = "rifle"; + break; + case "weapon_cqb": + bodytype = "spread"; + break; + case "weapon_lmg": + bodytype = "mg"; + break; + case "weapon_smg": + bodytype = "smg"; + break; + } + + self detachall(); + self setmovespeedscale( 1 ); + self setsprintduration( 4 ); + self setsprintcooldown( 0 ); + + if ( level.multiteam ) + { + bodytype = "default"; + + switch ( team ) + { + case "team8": + case "team7": + team = "allies"; + break; + } + } + + self [[ game["set_player_model"][team][bodytype] ]](); } -getteamflagmodel( teamref ) //checked matches cerberus output +getteamflagmodel( teamref ) { - /* /# - assert( isDefined( game[ "flagmodels" ] ) ); + assert( isdefined( game["flagmodels"] ) ); #/ /# - assert( isDefined( game[ "flagmodels" ][ teamref ] ) ); + assert( isdefined( game["flagmodels"][teamref] ) ); #/ - */ - return game[ "flagmodels" ][ teamref ]; + return game["flagmodels"][teamref]; } -getteamflagcarrymodel( teamref ) //checked matches cerberus output +getteamflagcarrymodel( teamref ) { - /* /# - assert( isDefined( game[ "carry_flagmodels" ] ) ); + assert( isdefined( game["carry_flagmodels"] ) ); #/ /# - assert( isDefined( game[ "carry_flagmodels" ][ teamref ] ) ); + assert( isdefined( game["carry_flagmodels"][teamref] ) ); #/ - */ - return game[ "carry_flagmodels" ][ teamref ]; + return game["carry_flagmodels"][teamref]; } -getteamflagicon( teamref ) //checked matches cerberus output +getteamflagicon( teamref ) { - /* /# - assert( isDefined( game[ "carry_icon" ] ) ); + assert( isdefined( game["carry_icon"] ) ); #/ /# - assert( isDefined( game[ "carry_icon" ][ teamref ] ) ); + assert( isdefined( game["carry_icon"][teamref] ) ); #/ - */ - return game[ "carry_icon" ][ teamref ]; + return game["carry_icon"][teamref]; } - diff --git a/Multiplayer Core/patch_mp/maps/mp/teams/_teamset.gsc b/Multiplayer Core/patch_mp/maps/mp/teams/_teamset.gsc index 0e98d0c..bf8b250 100644 --- a/Multiplayer Core/patch_mp/maps/mp/teams/_teamset.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/teams/_teamset.gsc @@ -1,30 +1,25 @@ +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool -init() //checked matches cerberus output +init() { - if ( !isDefined( game[ "flagmodels" ] ) ) - { - game[ "flagmodels" ] = []; - } - if ( !isDefined( game[ "carry_flagmodels" ] ) ) - { - game[ "carry_flagmodels" ] = []; - } - if ( !isDefined( game[ "carry_icon" ] ) ) - { - game[ "carry_icon" ] = []; - } - game[ "flagmodels" ][ "neutral" ] = "mp_flag_neutral"; + if ( !isdefined( game["flagmodels"] ) ) + game["flagmodels"] = []; + + if ( !isdefined( game["carry_flagmodels"] ) ) + game["carry_flagmodels"] = []; + + if ( !isdefined( game["carry_icon"] ) ) + game["carry_icon"] = []; + + game["flagmodels"]["neutral"] = "mp_flag_neutral"; } -customteam_init() //checked matches cerberus output +customteam_init() { - if ( getDvar( "g_customTeamName_Allies" ) != "" ) - { - setdvar( "g_TeamName_Allies", getDvar( "g_customTeamName_Allies" ) ); - } - if ( getDvar( "g_customTeamName_Axis" ) != "" ) - { - setdvar( "g_TeamName_Axis", getDvar( "g_customTeamName_Axis" ) ); - } -} + if ( getdvar( "g_customTeamName_Allies" ) != "" ) + setdvar( "g_TeamName_Allies", getdvar( "g_customTeamName_Allies" ) ); + if ( getdvar( "g_customTeamName_Axis" ) != "" ) + setdvar( "g_TeamName_Axis", getdvar( "g_customTeamName_Axis" ) ); +} diff --git a/Multiplayer Core/patch_mp/maps/mp/teams/_teamset_multiteam.gsc b/Multiplayer Core/patch_mp/maps/mp/teams/_teamset_multiteam.gsc index 34fba8f..420c615 100644 --- a/Multiplayer Core/patch_mp/maps/mp/teams/_teamset_multiteam.gsc +++ b/Multiplayer Core/patch_mp/maps/mp/teams/_teamset_multiteam.gsc @@ -1,218 +1,219 @@ -#include mpbody/class_assault_cd; -#include mpbody/class_assault_isa; -#include mpbody/class_assault_chn_pla; -#include mpbody/class_assault_rus_pmc; -#include mpbody/class_assault_usa_fbi; -#include mpbody/class_assault_usa_seals; -#include maps/mp/teams/_teamset; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\teams\_teamset; +#include mpbody\class_assault_usa_seals; +#include mpbody\class_assault_usa_fbi; +#include mpbody\class_assault_rus_pmc; +#include mpbody\class_assault_chn_pla; +#include mpbody\class_assault_isa; +#include mpbody\class_assault_cd; -main() //checked matches cerberus output +main() { - maps/mp/teams/_teamset::init(); - init_seals( "allies" ); - init_pla( "axis" ); - init_fbi( "team3" ); - init_pmc( "team4" ); - init_isa( "team5" ); - init_cd( "team6" ); - init_seals( "team7" ); - init_seals( "team8" ); - precache(); + maps\mp\teams\_teamset::init(); + init_seals( "allies" ); + init_pla( "axis" ); + init_fbi( "team3" ); + init_pmc( "team4" ); + init_isa( "team5" ); + init_cd( "team6" ); + init_seals( "team7" ); + init_seals( "team8" ); + precache(); } -precache() //checked matches cerberus output +precache() { - mpbody/class_assault_usa_seals::precache(); - mpbody/class_assault_usa_fbi::precache(); - mpbody/class_assault_rus_pmc::precache(); - mpbody/class_assault_chn_pla::precache(); - mpbody/class_assault_isa::precache(); - mpbody/class_assault_cd::precache(); + mpbody\class_assault_usa_seals::precache(); + mpbody\class_assault_usa_fbi::precache(); + mpbody\class_assault_rus_pmc::precache(); + mpbody\class_assault_chn_pla::precache(); + mpbody\class_assault_isa::precache(); + mpbody\class_assault_cd::precache(); } -init_seals( team ) //checked matches cerberus output +init_seals( team ) { - game[ team ] = "seals"; - game[ "attackers" ] = team; - precacheshader( "faction_seals" ); - game[ "entity_headicon_" + team ] = "faction_seals"; - game[ "headicon_" + team ] = "faction_seals"; - level.teamprefix[ team ] = "vox_st"; - level.teampostfix[ team ] = "st6"; - setdvar( "g_TeamName_" + team, &"MPUI_SEALS_SHORT" ); - setdvar( "g_TeamColor_" + team, "0.6 0.64 0.69" ); - setdvar( "g_ScoresColor_" + team, "0.6 0.64 0.69" ); - setdvar( "g_FactionName_" + team, "usa_seals" ); - game[ "strings" ][ team + "_win" ] = &"MP_SEALS_WIN_MATCH"; - game[ "strings" ][ team + "_win_round" ] = &"MP_SEALS_WIN_ROUND"; - game[ "strings" ][ team + "_mission_accomplished" ] = &"MP_SEALS_MISSION_ACCOMPLISHED"; - game[ "strings" ][ team + "_eliminated" ] = &"MP_SEALS_ELIMINATED"; - game[ "strings" ][ team + "_forfeited" ] = &"MP_SEALS_FORFEITED"; - game[ "strings" ][ team + "_name" ] = &"MP_SEALS_NAME"; - game[ "music" ][ "spawn_" + team ] = "SPAWN_ST6"; - game[ "music" ][ "spawn_short" + team ] = "SPAWN_SHORT_ST6"; - game[ "music" ][ "victory_" + team ] = "VICTORY_ST6"; - game[ "icons" ][ team ] = "faction_seals"; - game[ "voice" ][ team ] = "vox_st6_"; - setdvar( "scr_" + team, "marines" ); - level.heli_vo[ team ][ "hit" ] = "vox_ops_2_kls_attackheli_hit"; - game[ "flagmodels" ][ team ] = "mp_flag_allies_1"; - game[ "carry_flagmodels" ][ team ] = "mp_flag_allies_1_carry"; - game[ "carry_icon" ][ team ] = "hudicon_marines_ctf_flag_carry"; + game[team] = "seals"; + game["attackers"] = team; + precacheshader( "faction_seals" ); + game["entity_headicon_" + team] = "faction_seals"; + game["headicon_" + team] = "faction_seals"; + level.teamprefix[team] = "vox_st"; + level.teampostfix[team] = "st6"; + setdvar( "g_TeamName_" + team, &"MPUI_SEALS_SHORT" ); + setdvar( "g_TeamColor_" + team, "0.6 0.64 0.69" ); + setdvar( "g_ScoresColor_" + team, "0.6 0.64 0.69" ); + setdvar( "g_FactionName_" + team, "usa_seals" ); + game["strings"][team + "_win"] = &"MP_SEALS_WIN_MATCH"; + game["strings"][team + "_win_round"] = &"MP_SEALS_WIN_ROUND"; + game["strings"][team + "_mission_accomplished"] = &"MP_SEALS_MISSION_ACCOMPLISHED"; + game["strings"][team + "_eliminated"] = &"MP_SEALS_ELIMINATED"; + game["strings"][team + "_forfeited"] = &"MP_SEALS_FORFEITED"; + game["strings"][team + "_name"] = &"MP_SEALS_NAME"; + game["music"]["spawn_" + team] = "SPAWN_ST6"; + game["music"]["spawn_short" + team] = "SPAWN_SHORT_ST6"; + game["music"]["victory_" + team] = "VICTORY_ST6"; + game["icons"][team] = "faction_seals"; + game["voice"][team] = "vox_st6_"; + setdvar( "scr_" + team, "marines" ); + level.heli_vo[team]["hit"] = "vox_ops_2_kls_attackheli_hit"; + game["flagmodels"][team] = "mp_flag_allies_1"; + game["carry_flagmodels"][team] = "mp_flag_allies_1_carry"; + game["carry_icon"][team] = "hudicon_marines_ctf_flag_carry"; } -init_pmc( team ) //checked matches cerberus output +init_pmc( team ) { - game[ team ] = "pmc"; - game[ "defenders" ] = team; - precacheshader( "faction_pmc" ); - game[ "entity_headicon_" + team ] = "faction_pmc"; - game[ "headicon_" + team ] = "faction_pmc"; - level.teamprefix[ team ] = "vox_pm"; - level.teampostfix[ team ] = "pmc"; - setdvar( "g_TeamName_" + team, &"MPUI_PMC_SHORT" ); - setdvar( "g_TeamColor_" + team, "0.65 0.57 0.41" ); - setdvar( "g_ScoresColor_" + team, "0.65 0.57 0.41" ); - setdvar( "g_FactionName_" + team, "rus_pmc" ); - game[ "strings" ][ team + "_win" ] = &"MP_PMC_WIN_MATCH"; - game[ "strings" ][ team + "_win_round" ] = &"MP_PMC_WIN_ROUND"; - game[ "strings" ][ team + "_mission_accomplished" ] = &"MP_PMC_MISSION_ACCOMPLISHED"; - game[ "strings" ][ team + "_eliminated" ] = &"MP_PMC_ELIMINATED"; - game[ "strings" ][ team + "_forfeited" ] = &"MP_PMC_FORFEITED"; - game[ "strings" ][ team + "_name" ] = &"MP_PMC_NAME"; - game[ "music" ][ "spawn_" + team ] = "SPAWN_PMC"; - game[ "music" ][ "spawn_short" + team ] = "SPAWN_SHORT_PMC"; - game[ "music" ][ "victory_" + team ] = "VICTORY_PMC"; - game[ "icons" ][ team ] = "faction_pmc"; - game[ "voice" ][ team ] = "vox_pmc_"; - setdvar( "scr_" + team, "ussr" ); - level.heli_vo[ team ][ "hit" ] = "vox_rus_0_kls_attackheli_hit"; - game[ "flagmodels" ][ team ] = "mp_flag_axis_1"; - game[ "carry_flagmodels" ][ team ] = "mp_flag_axis_1_carry"; - game[ "carry_icon" ][ team ] = "hudicon_spetsnaz_ctf_flag_carry"; + game[team] = "pmc"; + game["defenders"] = team; + precacheshader( "faction_pmc" ); + game["entity_headicon_" + team] = "faction_pmc"; + game["headicon_" + team] = "faction_pmc"; + level.teamprefix[team] = "vox_pm"; + level.teampostfix[team] = "pmc"; + setdvar( "g_TeamName_" + team, &"MPUI_PMC_SHORT" ); + setdvar( "g_TeamColor_" + team, "0.65 0.57 0.41" ); + setdvar( "g_ScoresColor_" + team, "0.65 0.57 0.41" ); + setdvar( "g_FactionName_" + team, "rus_pmc" ); + game["strings"][team + "_win"] = &"MP_PMC_WIN_MATCH"; + game["strings"][team + "_win_round"] = &"MP_PMC_WIN_ROUND"; + game["strings"][team + "_mission_accomplished"] = &"MP_PMC_MISSION_ACCOMPLISHED"; + game["strings"][team + "_eliminated"] = &"MP_PMC_ELIMINATED"; + game["strings"][team + "_forfeited"] = &"MP_PMC_FORFEITED"; + game["strings"][team + "_name"] = &"MP_PMC_NAME"; + game["music"]["spawn_" + team] = "SPAWN_PMC"; + game["music"]["spawn_short" + team] = "SPAWN_SHORT_PMC"; + game["music"]["victory_" + team] = "VICTORY_PMC"; + game["icons"][team] = "faction_pmc"; + game["voice"][team] = "vox_pmc_"; + setdvar( "scr_" + team, "ussr" ); + level.heli_vo[team]["hit"] = "vox_rus_0_kls_attackheli_hit"; + game["flagmodels"][team] = "mp_flag_axis_1"; + game["carry_flagmodels"][team] = "mp_flag_axis_1_carry"; + game["carry_icon"][team] = "hudicon_spetsnaz_ctf_flag_carry"; } -init_pla( team ) //checked matches cerberus output +init_pla( team ) { - game[ team ] = "pla"; - game[ "defenders" ] = team; - precacheshader( "faction_pla" ); - game[ "entity_headicon_" + team ] = "faction_pla"; - game[ "headicon_" + team ] = "faction_pla"; - level.teamprefix[ team ] = "vox_ch"; - level.teampostfix[ team ] = "pla"; - setdvar( "g_TeamName_" + team, &"MPUI_PLA_SHORT" ); - setdvar( "g_TeamColor_" + team, "0.65 0.57 0.41" ); - setdvar( "g_ScoresColor_" + team, "0.65 0.57 0.41" ); - setdvar( "g_FactionName_" + team, "chn_pla" ); - game[ "strings" ][ team + "_win" ] = &"MP_PLA_WIN_MATCH"; - game[ "strings" ][ team + "_win_round" ] = &"MP_PLA_WIN_ROUND"; - game[ "strings" ][ team + "_mission_accomplished" ] = &"MP_PLA_MISSION_ACCOMPLISHED"; - game[ "strings" ][ team + "_eliminated" ] = &"MP_PLA_ELIMINATED"; - game[ "strings" ][ team + "_forfeited" ] = &"MP_PLA_FORFEITED"; - game[ "strings" ][ team + "_name" ] = &"MP_PLA_NAME"; - game[ "music" ][ "spawn_" + team ] = "SPAWN_PLA"; - game[ "music" ][ "spawn_short" + team ] = "SPAWN_SHORT_PLA"; - game[ "music" ][ "victory_" + team ] = "VICTORY_PLA"; - game[ "icons" ][ team ] = "faction_pla"; - game[ "voice" ][ team ] = "vox_pla_"; - setdvar( "scr_" + team, "ussr" ); - level.heli_vo[ team ][ "hit" ] = "vox_rus_0_kls_attackheli_hit"; - game[ "flagmodels" ][ team ] = "mp_flag_axis_1"; - game[ "carry_flagmodels" ][ team ] = "mp_flag_axis_1_carry"; - game[ "carry_icon" ][ team ] = "hudicon_spetsnaz_ctf_flag_carry"; + game[team] = "pla"; + game["defenders"] = team; + precacheshader( "faction_pla" ); + game["entity_headicon_" + team] = "faction_pla"; + game["headicon_" + team] = "faction_pla"; + level.teamprefix[team] = "vox_ch"; + level.teampostfix[team] = "pla"; + setdvar( "g_TeamName_" + team, &"MPUI_PLA_SHORT" ); + setdvar( "g_TeamColor_" + team, "0.65 0.57 0.41" ); + setdvar( "g_ScoresColor_" + team, "0.65 0.57 0.41" ); + setdvar( "g_FactionName_" + team, "chn_pla" ); + game["strings"][team + "_win"] = &"MP_PLA_WIN_MATCH"; + game["strings"][team + "_win_round"] = &"MP_PLA_WIN_ROUND"; + game["strings"][team + "_mission_accomplished"] = &"MP_PLA_MISSION_ACCOMPLISHED"; + game["strings"][team + "_eliminated"] = &"MP_PLA_ELIMINATED"; + game["strings"][team + "_forfeited"] = &"MP_PLA_FORFEITED"; + game["strings"][team + "_name"] = &"MP_PLA_NAME"; + game["music"]["spawn_" + team] = "SPAWN_PLA"; + game["music"]["spawn_short" + team] = "SPAWN_SHORT_PLA"; + game["music"]["victory_" + team] = "VICTORY_PLA"; + game["icons"][team] = "faction_pla"; + game["voice"][team] = "vox_pla_"; + setdvar( "scr_" + team, "ussr" ); + level.heli_vo[team]["hit"] = "vox_rus_0_kls_attackheli_hit"; + game["flagmodels"][team] = "mp_flag_axis_1"; + game["carry_flagmodels"][team] = "mp_flag_axis_1_carry"; + game["carry_icon"][team] = "hudicon_spetsnaz_ctf_flag_carry"; } -init_fbi( team ) //checked matches cerberus output +init_fbi( team ) { - game[ team ] = "fbi"; - game[ "attackers" ] = team; - precacheshader( "faction_fbi" ); - game[ "entity_headicon_" + team ] = "faction_fbi"; - game[ "headicon_" + team ] = "faction_fbi"; - level.teamprefix[ team ] = "vox_hr"; - level.teampostfix[ team ] = "hrt"; - setdvar( "g_TeamName_" + team, &"MPUI_FBI_SHORT" ); - setdvar( "g_TeamColor_" + team, "0.6 0.64 0.69" ); - setdvar( "g_ScoresColor_" + team, "0.6 0.64 0.69" ); - setdvar( "g_FactionName_" + team, "usa_fbi" ); - game[ "strings" ][ team + "_win" ] = &"MP_FBI_WIN_MATCH"; - game[ "strings" ][ team + "_win_round" ] = &"MP_FBI_WIN_ROUND"; - game[ "strings" ][ team + "_mission_accomplished" ] = &"MP_FBI_MISSION_ACCOMPLISHED"; - game[ "strings" ][ team + "_eliminated" ] = &"MP_FBI_ELIMINATED"; - game[ "strings" ][ team + "_forfeited" ] = &"MP_FBI_FORFEITED"; - game[ "strings" ][ team + "_name" ] = &"MP_FBI_NAME"; - game[ "music" ][ "spawn_" + team ] = "SPAWN_FBI"; - game[ "music" ][ "spawn_short" + team ] = "SPAWN_SHORT_FBI"; - game[ "music" ][ "victory_" + team ] = "VICTORY_FBI"; - game[ "icons" ][ team ] = "faction_fbi"; - game[ "voice" ][ team ] = "vox_fbi_"; - setdvar( "scr_" + team, "marines" ); - level.heli_vo[ team ][ "hit" ] = "vox_ops_2_kls_attackheli_hit"; - game[ "flagmodels" ][ team ] = "mp_flag_allies_1"; - game[ "carry_flagmodels" ][ team ] = "mp_flag_allies_1_carry"; - game[ "carry_icon" ][ team ] = "hudicon_marines_ctf_flag_carry"; + game[team] = "fbi"; + game["attackers"] = team; + precacheshader( "faction_fbi" ); + game["entity_headicon_" + team] = "faction_fbi"; + game["headicon_" + team] = "faction_fbi"; + level.teamprefix[team] = "vox_hr"; + level.teampostfix[team] = "hrt"; + setdvar( "g_TeamName_" + team, &"MPUI_FBI_SHORT" ); + setdvar( "g_TeamColor_" + team, "0.6 0.64 0.69" ); + setdvar( "g_ScoresColor_" + team, "0.6 0.64 0.69" ); + setdvar( "g_FactionName_" + team, "usa_fbi" ); + game["strings"][team + "_win"] = &"MP_FBI_WIN_MATCH"; + game["strings"][team + "_win_round"] = &"MP_FBI_WIN_ROUND"; + game["strings"][team + "_mission_accomplished"] = &"MP_FBI_MISSION_ACCOMPLISHED"; + game["strings"][team + "_eliminated"] = &"MP_FBI_ELIMINATED"; + game["strings"][team + "_forfeited"] = &"MP_FBI_FORFEITED"; + game["strings"][team + "_name"] = &"MP_FBI_NAME"; + game["music"]["spawn_" + team] = "SPAWN_FBI"; + game["music"]["spawn_short" + team] = "SPAWN_SHORT_FBI"; + game["music"]["victory_" + team] = "VICTORY_FBI"; + game["icons"][team] = "faction_fbi"; + game["voice"][team] = "vox_fbi_"; + setdvar( "scr_" + team, "marines" ); + level.heli_vo[team]["hit"] = "vox_ops_2_kls_attackheli_hit"; + game["flagmodels"][team] = "mp_flag_allies_1"; + game["carry_flagmodels"][team] = "mp_flag_allies_1_carry"; + game["carry_icon"][team] = "hudicon_marines_ctf_flag_carry"; } -init_isa( team ) //checked matches cerberus output +init_isa( team ) { - game[ team ] = "isa"; - game[ "attackers" ] = team; - precacheshader( "faction_isa" ); - game[ "entity_headicon_" + team ] = "faction_isa"; - game[ "headicon_" + team ] = "faction_isa"; - level.teamprefix[ team ] = "vox_is"; - level.teampostfix[ team ] = "isa"; - setdvar( "g_TeamName_" + team, &"MPUI_ISA_SHORT" ); - setdvar( "g_TeamColor_" + team, "0.6 0.64 0.69" ); - setdvar( "g_ScoresColor_" + team, "0.6 0.64 0.69" ); - setdvar( "g_FactionName_" + team, "isa" ); - game[ "strings" ][ team + "_win" ] = &"MP_ISA_WIN_MATCH"; - game[ "strings" ][ team + "_win_round" ] = &"MP_ISA_WIN_ROUND"; - game[ "strings" ][ team + "_mission_accomplished" ] = &"MP_ISA_MISSION_ACCOMPLISHED"; - game[ "strings" ][ team + "_eliminated" ] = &"MP_ISA_ELIMINATED"; - game[ "strings" ][ team + "_forfeited" ] = &"MP_ISA_FORFEITED"; - game[ "strings" ][ team + "_name" ] = &"MP_ISA_NAME"; - game[ "music" ][ "spawn_" + team ] = "SPAWN_CIA"; - game[ "music" ][ "spawn_short" + team ] = "SPAWN_SHORT_CIA"; - game[ "music" ][ "victory_" + team ] = "VICTORY_CIA"; - game[ "icons" ][ team ] = "faction_isa"; - game[ "voice" ][ team ] = "vox_isa_"; - setdvar( "scr_" + team, "marines" ); - level.heli_vo[ team ][ "hit" ] = "vox_ops_2_kls_attackheli_hit"; - game[ "flagmodels" ][ team ] = "mp_flag_allies_1"; - game[ "carry_flagmodels" ][ team ] = "mp_flag_allies_1_carry"; - game[ "carry_icon" ][ team ] = "hudicon_marines_ctf_flag_carry"; + game[team] = "isa"; + game["attackers"] = team; + precacheshader( "faction_isa" ); + game["entity_headicon_" + team] = "faction_isa"; + game["headicon_" + team] = "faction_isa"; + level.teamprefix[team] = "vox_is"; + level.teampostfix[team] = "isa"; + setdvar( "g_TeamName_" + team, &"MPUI_ISA_SHORT" ); + setdvar( "g_TeamColor_" + team, "0.6 0.64 0.69" ); + setdvar( "g_ScoresColor_" + team, "0.6 0.64 0.69" ); + setdvar( "g_FactionName_" + team, "isa" ); + game["strings"][team + "_win"] = &"MP_ISA_WIN_MATCH"; + game["strings"][team + "_win_round"] = &"MP_ISA_WIN_ROUND"; + game["strings"][team + "_mission_accomplished"] = &"MP_ISA_MISSION_ACCOMPLISHED"; + game["strings"][team + "_eliminated"] = &"MP_ISA_ELIMINATED"; + game["strings"][team + "_forfeited"] = &"MP_ISA_FORFEITED"; + game["strings"][team + "_name"] = &"MP_ISA_NAME"; + game["music"]["spawn_" + team] = "SPAWN_CIA"; + game["music"]["spawn_short" + team] = "SPAWN_SHORT_CIA"; + game["music"]["victory_" + team] = "VICTORY_CIA"; + game["icons"][team] = "faction_isa"; + game["voice"][team] = "vox_isa_"; + setdvar( "scr_" + team, "marines" ); + level.heli_vo[team]["hit"] = "vox_ops_2_kls_attackheli_hit"; + game["flagmodels"][team] = "mp_flag_allies_1"; + game["carry_flagmodels"][team] = "mp_flag_allies_1_carry"; + game["carry_icon"][team] = "hudicon_marines_ctf_flag_carry"; } -init_cd( team ) //checked matches cerberus output +init_cd( team ) { - game[ team ] = "cd"; - game[ "attackers" ] = team; - precacheshader( "faction_cd" ); - game[ "entity_headicon_" + team ] = "faction_cd"; - game[ "headicon_" + team ] = "faction_cd"; - level.teamprefix[ team ] = "vox_cd"; - level.teampostfix[ team ] = "cda"; - setdvar( "g_TeamName_" + team, &"MPUI_CD_SHORT" ); - setdvar( "g_TeamColor_" + team, "0.6 0.64 0.69" ); - setdvar( "g_ScoresColor_" + team, "0.6 0.64 0.69" ); - setdvar( "g_FactionName_" + team, "cd" ); - game[ "strings" ][ team + "_win" ] = &"MP_CD_WIN_MATCH"; - game[ "strings" ][ team + "_win_round" ] = &"MP_CD_WIN_ROUND"; - game[ "strings" ][ team + "_mission_accomplished" ] = &"MP_CD_MISSION_ACCOMPLISHED"; - game[ "strings" ][ team + "_eliminated" ] = &"MP_CD_ELIMINATED"; - game[ "strings" ][ team + "_forfeited" ] = &"MP_CD_FORFEITED"; - game[ "strings" ][ team + "_name" ] = &"MP_CD_NAME"; - game[ "music" ][ "spawn_" + team ] = "SPAWN_TER"; - game[ "music" ][ "spawn_short" + team ] = "SPAWN_SHORT_TER"; - game[ "music" ][ "victory_" + team ] = "VICTORY_TER"; - game[ "icons" ][ team ] = "faction_cd"; - game[ "voice" ][ team ] = "vox_cda_"; - setdvar( "scr_" + team, "ussr" ); - level.heli_vo[ team ][ "hit" ] = "vox_cd2_kls_attackheli_hit"; - game[ "flagmodels" ][ team ] = "mp_flag_axis_1"; - game[ "carry_flagmodels" ][ team ] = "mp_flag_axis_1_carry"; - game[ "carry_icon" ][ team ] = "hudicon_spetsnaz_ctf_flag_carry"; + game[team] = "cd"; + game["attackers"] = team; + precacheshader( "faction_cd" ); + game["entity_headicon_" + team] = "faction_cd"; + game["headicon_" + team] = "faction_cd"; + level.teamprefix[team] = "vox_cd"; + level.teampostfix[team] = "cda"; + setdvar( "g_TeamName_" + team, &"MPUI_CD_SHORT" ); + setdvar( "g_TeamColor_" + team, "0.6 0.64 0.69" ); + setdvar( "g_ScoresColor_" + team, "0.6 0.64 0.69" ); + setdvar( "g_FactionName_" + team, "cd" ); + game["strings"][team + "_win"] = &"MP_CD_WIN_MATCH"; + game["strings"][team + "_win_round"] = &"MP_CD_WIN_ROUND"; + game["strings"][team + "_mission_accomplished"] = &"MP_CD_MISSION_ACCOMPLISHED"; + game["strings"][team + "_eliminated"] = &"MP_CD_ELIMINATED"; + game["strings"][team + "_forfeited"] = &"MP_CD_FORFEITED"; + game["strings"][team + "_name"] = &"MP_CD_NAME"; + game["music"]["spawn_" + team] = "SPAWN_TER"; + game["music"]["spawn_short" + team] = "SPAWN_SHORT_TER"; + game["music"]["victory_" + team] = "VICTORY_TER"; + game["icons"][team] = "faction_cd"; + game["voice"][team] = "vox_cda_"; + setdvar( "scr_" + team, "ussr" ); + level.heli_vo[team]["hit"] = "vox_cd2_kls_attackheli_hit"; + game["flagmodels"][team] = "mp_flag_axis_1"; + game["carry_flagmodels"][team] = "mp_flag_axis_1_carry"; + game["carry_icon"][team] = "hudicon_spetsnaz_ctf_flag_carry"; } -