1722 lines
54 KiB
Plaintext
1722 lines
54 KiB
Plaintext
#include maps\mp\alien\_utility;
|
|
#include common_scripts\utility;
|
|
#include maps\mp\_utility;
|
|
|
|
GOAL_SPEND_CURRENCY = 10000;
|
|
GOAL_SPEND_CURRENCY_20K = 20000;
|
|
KILL_LEPER_DURATION = 30; // 30 seconds
|
|
MELEE_GOONS_AMOUNT = 5;
|
|
MELEE_SPITTER_AMOUNT = 1;
|
|
KILL_WITH_PROPANE_AMOUNT = 10;
|
|
KILL_WITH_TRAPS_AMOUNT = 10;
|
|
KILL_WHILE_PRONE_AMOUNT = 10;
|
|
KILL_WITH_TURRETS_AMNT = 10;
|
|
KILL_AIRBORNE_AMNT = 5;
|
|
KILL_WITH_WEAPON_AMT = 10;
|
|
SPEND_NO_MONEY_DURATION = 120;
|
|
NO_RELOAD_DURATION = 60;
|
|
NO_ABILITIES_DURATION = 90;
|
|
|
|
init_challenge_type()
|
|
{
|
|
level.challenge_data = [];
|
|
|
|
if ( !isDefined( level.challenge_scalar_func ) )
|
|
level.challenge_scalar_func = ::default_challenge_scalar_func;
|
|
|
|
if ( isDefined ( level.challenge_registration_func))
|
|
{
|
|
[[level.challenge_registration_func]]();
|
|
}
|
|
|
|
if ( is_true( level.include_default_challenges ) )
|
|
{
|
|
// level._effect["challenge_ring_800"] = loadfx ( "vfx/gameplay/alien/vfx_challenge_ring_800" );
|
|
|
|
register_challenge( "spend_10k",GOAL_SPEND_CURRENCY, false, undefined, undefined , ::activate_spend_currency, ::deactivate_spend_currency, undefined, ::update_spend_currency );
|
|
register_challenge( "spend_20k",GOAL_SPEND_CURRENCY_20K, false, undefined, undefined , ::activate_spend_currency, ::deactivate_spend_currency, undefined, ::update_spend_currency );
|
|
register_challenge( "kill_leper",KILL_LEPER_DURATION, false, undefined, undefined, ::activate_kill_leper, ::deactivate_kill_leper, undefined, ::update_kill_leper );
|
|
register_challenge( "spend_no_money", SPEND_NO_MONEY_DURATION, true, undefined, undefined, ::activate_spend_no_money, ::default_resetSuccess, undefined, ::update_spend_no_money );
|
|
register_challenge( "no_reloads", NO_RELOAD_DURATION, true, undefined, undefined, ::activate_no_reloads, ::default_resetSuccess, undefined, ::update_no_reloads );
|
|
register_challenge( "no_abilities", NO_ABILITIES_DURATION, true, undefined, undefined, ::activate_no_abilities, ::default_resetSuccess, undefined, ::update_no_abilities );
|
|
register_challenge( "take_no_damage", undefined, true, undefined, undefined, ::default_resetSuccess, ::default_resetSuccess, undefined, ::update_take_no_damage );
|
|
register_challenge( "melee_5_goons", MELEE_GOONS_AMOUNT, false, undefined, undefined, ::activate_melee_goons, ::deactivate_melee_goons, undefined, ::update_melee_goons );
|
|
register_challenge( "melee_spitter", MELEE_SPITTER_AMOUNT, false, undefined, undefined, ::activate_melee_spitter, ::deactivate_melee_spitter, undefined, ::update_melee_spitter );
|
|
register_challenge( "no_stuck_drill", undefined, true, undefined, undefined, ::default_resetSuccess, ::default_resetSuccess, undefined, ::update_no_stuck_drill );
|
|
register_challenge( "kill_10_with_propane",KILL_WITH_PROPANE_AMOUNT,false,undefined,undefined,::activate_kill_10_with_propane,::deactivate_kill_10_with_propane,undefined,::update_kill_10_with_propane );
|
|
register_challenge( "stay_prone",KILL_WHILE_PRONE_AMOUNT,false,undefined,undefined,::activate_stay_prone,::deactivate_stay_prone,undefined,::update_stay_prone );
|
|
register_challenge( "kill_10_with_traps",KILL_WITH_TRAPS_AMOUNT,false,undefined,undefined,::activate_kill_10_with_traps,::deactivate_kill_10_with_traps,undefined,::update_kill_10_with_traps );
|
|
register_challenge( "avoid_minion_explosion",undefined,true,undefined,undefined,::activate_avoid_minion_exp,::deactivate_avoid_minion_exp,undefined,::update_avoid_minion_exp );
|
|
register_challenge( "75_percent_accuracy",undefined,true,::seventyfive_percent_accuracy_success_test,undefined,::activate_percent_accuracy,::deactivate_percent_accuracy,undefined,::update_75_percent_accuracy );
|
|
register_challenge( "pistols_only",KILL_WITH_WEAPON_AMT,false,undefined,undefined,::activate_use_weapon_challenge,::default_resetSuccess,undefined,::update_pistols_only );
|
|
register_challenge( "shotguns_only",KILL_WITH_WEAPON_AMT,false,undefined,undefined,::activate_use_weapon_challenge,::deactivate_weapon_challenge_waypoints,undefined,::update_shotguns_only );
|
|
register_challenge( "snipers_only",KILL_WITH_WEAPON_AMT,false,undefined,undefined,::activate_use_weapon_challenge,::deactivate_weapon_challenge_waypoints,undefined,::update_snipers_only );
|
|
register_challenge( "lmgs_only",KILL_WITH_WEAPON_AMT,false,undefined,undefined,::activate_use_weapon_challenge,::deactivate_weapon_challenge_waypoints,undefined,::update_lmgs_only );
|
|
register_challenge( "ar_only",KILL_WITH_WEAPON_AMT,false,undefined,undefined,::activate_use_weapon_challenge,::deactivate_weapon_challenge_waypoints,undefined,::update_ar_only );
|
|
register_challenge( "smg_only",KILL_WITH_WEAPON_AMT,false,undefined,undefined,::activate_use_weapon_challenge,::deactivate_weapon_challenge_waypoints,undefined,::update_smgs_only );
|
|
|
|
register_challenge( "kill_10_with_turrets",KILL_WITH_TURRETS_AMNT,false,undefined,undefined,::activate_kill_10_with_turrets,::deactivate_kill_10_with_turrets,undefined,::update_kill_10_with_turrets );
|
|
register_challenge( "kill_airborne_aliens",KILL_AIRBORNE_AMNT,false,undefined,undefined,::activate_kill_airborne_aliens,::deactivate_kill_airborne_aliens,undefined,::update_kill_airborne_aliens );
|
|
register_challenge( "melee_only",undefined,true,undefined,undefined,::activate_melee_only,::deactivate_melee_only,undefined,::update_melee_only);
|
|
register_challenge( "50_percent_accuracy",undefined,true,::fifty_percent_accuracy_success_test,undefined,::activate_percent_accuracy,::deactivate_percent_accuracy,undefined,::update_50_percent_accuracy );
|
|
register_challenge( "stay_within_area",10,false,undefined,::pre_activate_stay_within_area,::activate_stay_within_area,::deactivate_stay_within_area,undefined,::update_stay_within_area );
|
|
register_challenge ( "kill_10_in_30",10,false,undefined,undefined,::activate_kill_10_in_30,::default_resetSuccess,undefined,::update_kill_10_in_30 );
|
|
//special challenges for the blocker hives
|
|
|
|
//register_challenge( "no_spitter_damage",undefined,true,undefined,undefined,::activate_no_spitter_damage,::deactivate_no_spitter_damage,undefined,::update_no_spitter_damage);
|
|
register_challenge( "protect_player",undefined,true,undefined,undefined,::activate_protect_a_player,::deactivate_protect_a_player,undefined,::update_protect_a_player );
|
|
register_challenge( "no_laststand", undefined, true, undefined, undefined, ::default_resetSuccess, ::default_resetSuccess, undefined, ::update_no_laststand );
|
|
register_challenge( "no_bleedout", undefined, true, undefined, undefined, ::default_resetSuccess, ::default_resetSuccess, undefined, ::update_no_bleedout );
|
|
register_challenge( "challenge_failed",undefined,false,undefined,undefined,::default_resetSuccess,::default_resetSuccess,undefined,undefined);
|
|
register_challenge( "challenge_success",undefined,false,undefined,undefined,::default_resetSuccess,::default_resetSuccess,undefined,undefined );
|
|
register_challenge( "barrier_hive",undefined,false,undefined,undefined,::default_resetSuccess,::default_resetSuccess,undefined,undefined );
|
|
|
|
}
|
|
init_alien_challenges_from_table();
|
|
|
|
//default level variables for storing challenge states so hojoiners can participate in challenges
|
|
level.current_challenge_index = -1;
|
|
level.current_challenge_progress_max = -1;
|
|
level.current_challenge_progress_current = -1;
|
|
level.current_challenge_percent = -1;
|
|
level.current_challenge_target_player = -1;
|
|
level.current_challenge_timer = -1;
|
|
level.current_challenge_scalar = -1;
|
|
level.current_challenge_title = -1;
|
|
level.current_challenge_pre_challenge = 0;
|
|
|
|
//level flag to record whether all challenges are completed for achievement
|
|
level.all_challenge_completed = true;
|
|
level.pre_challenge_active = false;
|
|
level.num_challenge_completed = 0;
|
|
}
|
|
|
|
register_challenge( ref, goal, default_success , successFunc, canActivateFunc, activateFunc, deactivateFunc, failActivateFunc, updateFunc, rewardFunc,failFunc )
|
|
{
|
|
challenge_struct = spawnStruct();
|
|
|
|
challenge_struct.ref = ref;
|
|
challenge_struct.goal = goal;
|
|
challenge_struct.default_success = default_success;
|
|
|
|
challenge_struct.isSuccessFunc = ::default_isSuccessFunc;
|
|
if ( isDefined ( successFunc ) )
|
|
challenge_struct.isSuccessFunc = successFunc;
|
|
|
|
challenge_struct.canActivateFunc = ::default_canActivateFunc;
|
|
if ( isDefined ( canActivateFunc ) )
|
|
challenge_struct.canActivateFunc = canActivateFunc;
|
|
|
|
challenge_struct.activateFunc = activateFunc;
|
|
challenge_struct.deactivateFunc = deactivateFunc;
|
|
|
|
challenge_struct.failActivateFunc = ::default_failActivateFunc;
|
|
if ( isDefined ( failActivateFunc ) )
|
|
challenge_struct.failActivateFunc = failActivateFunc;
|
|
|
|
challenge_struct.updateFunc = updateFunc;
|
|
|
|
challenge_struct.rewardFunc = ::default_rewardFunc;
|
|
if( IsDefined( rewardFunc ) )
|
|
challenge_struct.rewardFunc = rewardFunc;
|
|
|
|
challenge_struct.failFunc = ::default_failFunc;
|
|
if ( isDefined ( failFunc ) )
|
|
challenge_struct.failFunc = failFunc;
|
|
|
|
level.challenge_data [ ref ] = challenge_struct;
|
|
}
|
|
|
|
init_alien_challenges_from_table()
|
|
{
|
|
CHALLENGE_TABLE = level.alien_challenge_table; // spawn node info lookup table
|
|
TABLE_INDEX = 0;
|
|
TABLE_CHALLENGE_START_INDEX = 1;
|
|
TABLE_CHALLENGE_END_INDEX = 99;
|
|
TABLE_CHALLENGE_REF = 1; // The reference name for the challenge
|
|
TABLE_CHALLENGE_ALLOWED_CYCLES = 2; // The allowed cycles that this challenge can appear in
|
|
TABLE_ALLOWEDINSOLO = 6; // is this challenge allowed in solo mode
|
|
TABLE_CHALLENGE_PRECHALLENGE_TEXT = 7; // text to appear during the pre-challenge period
|
|
TABLE_CHALLENGE_ALLOWED_HIVES = 8; // hives during which the challenge can appear ( checked against the allowed cycle )
|
|
|
|
for ( entryIndex = TABLE_CHALLENGE_START_INDEX; entryIndex <= TABLE_CHALLENGE_END_INDEX; entryIndex++ )
|
|
{
|
|
challengeID = tablelookup( CHALLENGE_TABLE, TABLE_INDEX, entryIndex, TABLE_CHALLENGE_REF );
|
|
if ( challengeID == "" )
|
|
break;
|
|
allowed_cycles = tablelookup( CHALLENGE_TABLE, TABLE_INDEX, entryIndex, TABLE_CHALLENGE_ALLOWED_CYCLES );
|
|
allowed_hives = tablelookup( CHALLENGE_TABLE, TABLE_INDEX, entryIndex, TABLE_CHALLENGE_ALLOWED_HIVES );
|
|
|
|
level.challenge_data[ challengeID ].allowed_cycles = allowed_cycles; //strtok( allowed_cycles," " );
|
|
level.challenge_data[ challengeID ].allowedinsolo = int ( tablelookup( CHALLENGE_TABLE, TABLE_INDEX, entryIndex, TABLE_ALLOWEDINSOLO ) );
|
|
level.challenge_data[ challengeID ].allowed_hives = allowed_hives; //strtok( allowed_hives," " );
|
|
}
|
|
|
|
}
|
|
|
|
|
|
//=======================================================
|
|
// default
|
|
//=======================================================
|
|
default_canActivateFunc() { return true; }
|
|
default_failActivateFunc() { AssertMsg ( "Fail to activate challenge: " + self.ref ); }
|
|
default_isSuccessFunc() { return self.success; }
|
|
default_failFunc() {}
|
|
default_resetSuccess() { self.success = self.default_success; }
|
|
|
|
default_rewardFunc()
|
|
{
|
|
CHALLENGE_COMPLETE_SKILL_POINT = 1;
|
|
|
|
foreach ( player in level.players )
|
|
player maps\mp\alien\_persistence::give_player_points ( CHALLENGE_COMPLETE_SKILL_POINT );
|
|
}
|
|
|
|
//=======================================================
|
|
// spend_currency
|
|
//=======================================================
|
|
activate_spend_currency() { activate_spend_money_progress(); }
|
|
deactivate_spend_currency() { reset_spend_money_progress(); }
|
|
|
|
reset_spend_money_progress()
|
|
{
|
|
default_resetSuccess();
|
|
self.current_progress = 0;
|
|
}
|
|
|
|
activate_spend_money_progress()
|
|
{
|
|
default_resetSuccess();
|
|
self.current_progress = 0;
|
|
self.goal = self.goal * 1000;
|
|
update_challenge_progress ( 0, self.goal );
|
|
}
|
|
|
|
update_spend_currency ( currency_spent, unused_2, unused_3, unused_4, unused_5, unused_6, unused_7, unused_8, unused_9 )
|
|
{
|
|
self.current_progress += currency_spent;
|
|
|
|
if ( self.current_progress >= self.goal )
|
|
self.success = true;
|
|
|
|
update_challenge_progress ( self.current_progress, self.goal );
|
|
|
|
if ( self.success )
|
|
maps\mp\alien\_challenge::deactivate_current_challenge();
|
|
}
|
|
|
|
//=======================================================
|
|
// kill_leper
|
|
//=======================================================
|
|
activate_kill_leper()
|
|
{
|
|
default_resetSuccess();
|
|
|
|
// Make sure the cycle has been initialized
|
|
if ( !isDefined( level.current_cycle ) )
|
|
{
|
|
level waittill( "alien_cycle_started" );
|
|
}
|
|
|
|
self.leper = maps\mp\alien\_spawn_director::spawn_alien( "leper" );
|
|
self.leper thread leper_watch_death();
|
|
self.leper thread maps\mp\agents\alien\_alien_leper::leper_challenge_despawn( self.goal );
|
|
|
|
challenge_time = int ( gettime() + 30000 );
|
|
foreach ( player in level.players )
|
|
{
|
|
player SetClientOmnvar ( "ui_intel_timer", challenge_time );
|
|
}
|
|
level.current_challenge_timer = 30;
|
|
level thread update_current_challenge_timer();
|
|
}
|
|
|
|
deactivate_kill_leper()
|
|
{
|
|
default_resetSuccess();
|
|
if ( IsAlive( self.leper ) )
|
|
{
|
|
self.leper thread maps\mp\agents\alien\_alien_leper::leper_despawn();
|
|
self.leper = undefined;
|
|
}
|
|
}
|
|
|
|
leper_watch_death()
|
|
{
|
|
self waittill( "death", attacker, cause, weapon );
|
|
if ( isDefined( attacker ) && ( isPlayer( attacker) || isDefined( attacker.classname ) && attacker.classname == "misc_turret" && isDefined( attacker.owner ) && attacker.owner IsUsingTurret() ))
|
|
{
|
|
// win!
|
|
maps\mp\alien\_challenge::update_challenge( "kill_leper", "success" );
|
|
|
|
}
|
|
else
|
|
{
|
|
maps\mp\alien\_challenge::update_challenge( "kill_leper", "fail" );
|
|
}
|
|
level notify( "stop_challenge_timer" );
|
|
level.current_challenge_timer = -1;
|
|
}
|
|
|
|
update_kill_leper ( leper_state, unused_2, unused_3, unused_4, unused_5, unused_6, unused_7, unused_8, unused_9 )
|
|
{
|
|
if ( leper_state == "success" )
|
|
{
|
|
self.success = true;
|
|
}
|
|
|
|
maps\mp\alien\_challenge::deactivate_current_challenge();
|
|
}
|
|
|
|
|
|
//=======================================================
|
|
// spend_no_money
|
|
//=======================================================
|
|
activate_spend_no_money()
|
|
{
|
|
default_resetSuccess();
|
|
challenge_time = int ( gettime() + self.goal * 1000 );
|
|
foreach ( player in level.players )
|
|
{
|
|
player SetClientOmnvar ( "ui_intel_timer", challenge_time );
|
|
}
|
|
level.current_challenge_timer = self.goal;
|
|
level thread update_current_challenge_timer();
|
|
level thread spend_no_money_timer( self );
|
|
}
|
|
|
|
spend_no_money_timer( challenge )
|
|
{
|
|
level endon( "game_ended" );
|
|
challenge endon( "fail" );
|
|
wait ( challenge.goal );
|
|
challenge.success = true;
|
|
level notify( "stop_challenge_timer" );
|
|
maps\mp\alien\_challenge::deactivate_current_challenge();
|
|
|
|
}
|
|
update_spend_no_money( spent_money, unused_2, unused_3, unused_4, unused_5, unused_6, unused_7, unused_8, unused_9 )
|
|
{
|
|
self.success = false;
|
|
self notify( "fail" );
|
|
level notify( "stop_challenge_timer" );
|
|
maps\mp\alien\_challenge::deactivate_current_challenge();
|
|
}
|
|
|
|
//=======================================================
|
|
// no_reloads
|
|
//=======================================================
|
|
activate_no_reloads()
|
|
{
|
|
default_resetSuccess();
|
|
challenge_time = int ( gettime() + self.goal * 1000 );
|
|
level.current_challenge_timer = self.goal;
|
|
level thread update_current_challenge_timer();
|
|
level thread no_reload_timer( self );
|
|
|
|
foreach( player in level.players )
|
|
{
|
|
player SetClientOmnvar ( "ui_intel_timer", challenge_time );
|
|
player thread wait_for_reload();
|
|
}
|
|
}
|
|
|
|
no_reload_timer( challenge )
|
|
{
|
|
level endon ( "stop_watching_reload" );
|
|
wait( challenge.goal );
|
|
challenge.success = true;
|
|
maps\mp\alien\_challenge::deactivate_current_challenge();
|
|
level notify( "stop_challenge_timer" );
|
|
level notify( "stop_watching_reload" );
|
|
}
|
|
|
|
wait_for_reload()
|
|
{
|
|
level endon ( "stop_watching_reload" );
|
|
self waittill( "reload" ); //self is player
|
|
maps\mp\alien\_challenge::update_challenge( "no_reloads" );
|
|
level notify ( "stop_watching_reload" );
|
|
}
|
|
|
|
update_no_reloads( unused_1, unused_2, unused_3, unused_4, unused_5, unused_6, unused_7, unused_8, unused_9 )
|
|
{
|
|
self.success = false;
|
|
maps\mp\alien\_challenge::deactivate_current_challenge();
|
|
level notify( "stop_challenge_timer" );
|
|
}
|
|
|
|
|
|
//=======================================================
|
|
// no_abilities
|
|
//=======================================================
|
|
activate_no_abilities()
|
|
{
|
|
default_resetSuccess();
|
|
challenge_time = int ( gettime() + self.goal * 1000 );
|
|
level.current_challenge_timer = self.goal;
|
|
level thread update_current_challenge_timer();
|
|
level thread no_abilities_timer( self );
|
|
|
|
foreach( player in level.players )
|
|
{
|
|
player SetClientOmnvar ( "ui_intel_timer", challenge_time );
|
|
player thread wait_for_ability_use();
|
|
}
|
|
}
|
|
|
|
no_abilities_timer( challenge )
|
|
{
|
|
level endon( "stop_watching_ability_use" );
|
|
wait( challenge.goal );
|
|
challenge.success = true;
|
|
maps\mp\alien\_challenge::deactivate_current_challenge();
|
|
level notify( "stop_challenge_timer" );
|
|
level notify( "stop_watching_ability_use" );
|
|
}
|
|
|
|
|
|
wait_for_ability_use()
|
|
{
|
|
level endon ( "stop_watching_ability_use" );
|
|
self waittill_any( "action_finish_used" , "class_skill_used" ); //self is player, this is the notify we get when the player uses a combat resource
|
|
maps\mp\alien\_challenge::update_challenge( "no_abilities" );
|
|
level notify ( "stop_watching_ability_use" );
|
|
}
|
|
|
|
update_no_abilities( unused_1, unused_2, unused_3, unused_4, unused_5, unused_6, unused_7, unused_8, unused_9 )
|
|
{
|
|
self.success = false;
|
|
maps\mp\alien\_challenge::deactivate_current_challenge();
|
|
level notify( "stop_challenge_timer" );
|
|
}
|
|
|
|
|
|
//=======================================================
|
|
// take_no_damage
|
|
//=======================================================
|
|
update_take_no_damage ( unused_1, unused_2, unused_3, unused_4 , unused_5, unused_6, unused_7, unused_8, unused_9 )
|
|
{
|
|
self.success = false;
|
|
maps\mp\alien\_challenge::deactivate_current_challenge();
|
|
}
|
|
|
|
nodamage_rewardFunc()
|
|
{
|
|
NODAMAGE_REWARD_POINT = 250;
|
|
foreach ( player in level.players )
|
|
player thread maps\mp\alien\_persistence::give_player_currency( NODAMAGE_REWARD_POINT );
|
|
}
|
|
|
|
//=======================================================
|
|
// melee_goons
|
|
//=======================================================
|
|
activate_melee_goons()
|
|
{
|
|
reset_melee_goons_progress();
|
|
update_challenge_progress ( 0, self.goal );
|
|
|
|
|
|
}
|
|
deactivate_melee_goons() { reset_melee_goons_progress(); }
|
|
|
|
reset_melee_goons_progress()
|
|
{
|
|
default_resetSuccess();
|
|
self.current_progress = 0;
|
|
}
|
|
|
|
update_melee_goons ( goons_killed, unused_2, unused_3, unused_4, unused_5, unused_6, unused_7, unused_8, unused_9 )
|
|
{
|
|
self.current_progress += goons_killed; //self is the current struct return ( self.current_progress >= self.goal );
|
|
|
|
if ( self.current_progress >= self.goal )
|
|
self.success = true;
|
|
|
|
remaining = ( self.goal - self.current_progress );
|
|
update_challenge_progress ( self.current_progress, self.goal );
|
|
|
|
if ( self.success )
|
|
maps\mp\alien\_challenge::deactivate_current_challenge();
|
|
}
|
|
|
|
|
|
//=======================================================
|
|
// melee_spitter
|
|
//=======================================================
|
|
activate_melee_spitter() { reset_melee_spitter_progress(); }
|
|
deactivate_melee_spitter() { reset_melee_spitter_progress(); }
|
|
|
|
reset_melee_spitter_progress()
|
|
{
|
|
default_resetSuccess();
|
|
self.current_progress = 0;
|
|
}
|
|
|
|
update_melee_spitter ( spitter_killed, unused_2, unused_3, unused_4, unused_5, unused_6, unused_7, unused_8, unused_9 )
|
|
{
|
|
self.current_progress += spitter_killed; //self is the current struct return ( self.current_progress >= self.goal );
|
|
|
|
if ( self.current_progress >= self.goal )
|
|
self.success = true;
|
|
|
|
if ( self.success )
|
|
maps\mp\alien\_challenge::deactivate_current_challenge();
|
|
}
|
|
|
|
//=======================================================
|
|
// no_stuck_drill
|
|
//=======================================================
|
|
update_no_stuck_drill ( unused_1, unused_2, unused_3, unused_4, unused_5, unused_6, unused_7, unused_8, unused_9 )
|
|
{
|
|
self.success = false;
|
|
maps\mp\alien\_challenge::deactivate_current_challenge();
|
|
}
|
|
|
|
//=======================================================
|
|
// no_laststand
|
|
//=======================================================
|
|
update_no_laststand ( unused_1, unused_2, unused_3, unused_4, unused_5, unused_6, unused_7, unused_8, unused_9 )
|
|
{
|
|
self.success = false;
|
|
maps\mp\alien\_challenge::deactivate_current_challenge();
|
|
}
|
|
|
|
//=======================================================
|
|
// no_bleedout
|
|
//=======================================================
|
|
update_no_bleedout( unused_1, unused_2, unused_3, unused_4, unused_5, unused_6, unused_7, unused_8, unused_9 )
|
|
{
|
|
self.success = false;
|
|
maps\mp\alien\_challenge::deactivate_current_challenge();
|
|
}
|
|
|
|
|
|
//=======================================================
|
|
// kill 10 with propane tanks
|
|
//=======================================================
|
|
activate_kill_10_with_propane()
|
|
{
|
|
reset_kill_10_with_propane_progress();
|
|
update_challenge_progress ( 0, self.goal );
|
|
}
|
|
|
|
deactivate_kill_10_with_propane() { reset_kill_10_with_propane_progress(); }
|
|
|
|
reset_kill_10_with_propane_progress()
|
|
{
|
|
default_resetSuccess();
|
|
self.current_progress = 0;
|
|
}
|
|
|
|
update_kill_10_with_propane ( aliens_killed, unused_2, unused_3, unused_4, unused_5, unused_6, unused_7, unused_8, unused_9 )
|
|
{
|
|
self.current_progress += aliens_killed; //self is the current struct return ( self.current_progress >= self.goal );
|
|
|
|
if ( self.current_progress >= self.goal )
|
|
self.success = true;
|
|
|
|
remaining = ( self.goal - self.current_progress );
|
|
update_challenge_progress ( self.current_progress, self.goal );
|
|
|
|
if ( self.success )
|
|
maps\mp\alien\_challenge::deactivate_current_challenge();
|
|
}
|
|
|
|
//=======================================================
|
|
// kill 10 with propane tanks
|
|
//=======================================================
|
|
activate_kill_10_with_traps()
|
|
{
|
|
reset_kill_10_with_traps_progress();
|
|
update_challenge_progress ( 0, self.goal );
|
|
|
|
}
|
|
|
|
deactivate_kill_10_with_traps() { reset_kill_10_with_traps_progress(); }
|
|
|
|
reset_kill_10_with_traps_progress()
|
|
{
|
|
default_resetSuccess();
|
|
self.current_progress = 0;
|
|
}
|
|
|
|
update_kill_10_with_traps ( aliens_killed, unused_2, unused_3, unused_4, unused_5, unused_6, unused_7, unused_8, unused_9 )
|
|
{
|
|
self.current_progress += aliens_killed; //self is the current struct return ( self.current_progress >= self.goal );
|
|
|
|
if ( self.current_progress >= self.goal )
|
|
self.success = true;
|
|
|
|
remaining = ( self.goal - self.current_progress );
|
|
update_challenge_progress ( self.current_progress, self.goal );
|
|
|
|
|
|
if ( self.success )
|
|
maps\mp\alien\_challenge::deactivate_current_challenge();
|
|
}
|
|
|
|
//=======================================================
|
|
// stay_prone
|
|
//=======================================================
|
|
activate_stay_prone()
|
|
{
|
|
reset_stay_prone_progress();
|
|
|
|
update_challenge_progress ( 0, self.goal );
|
|
|
|
}
|
|
|
|
deactivate_stay_prone() { reset_stay_prone_progress(); }
|
|
|
|
reset_stay_prone_progress()
|
|
{
|
|
default_resetSuccess();
|
|
self.current_progress = 0;
|
|
}
|
|
|
|
update_stay_prone( aliens_killed, unused_2, unused_3, unused_4, unused_5, unused_6, unused_7, unused_8, unused_9 )
|
|
{
|
|
self.current_progress += aliens_killed; //self is the current struct return ( self.current_progress >= self.goal );
|
|
|
|
if ( self.current_progress >= self.goal )
|
|
self.success = true;
|
|
|
|
remaining = ( self.goal - self.current_progress );
|
|
|
|
update_challenge_progress ( self.current_progress, self.goal );
|
|
|
|
|
|
if ( self.success )
|
|
maps\mp\alien\_challenge::deactivate_current_challenge();
|
|
}
|
|
|
|
//=======================================================
|
|
// protect a player
|
|
//=======================================================
|
|
activate_protect_a_player()
|
|
{
|
|
|
|
default_resetSuccess();
|
|
//choose a random player
|
|
alive_players = [];
|
|
foreach ( player in level.players )
|
|
{
|
|
if ( isAlive ( player ) && !player is_in_laststand() )
|
|
alive_players[alive_players.size] = player;
|
|
}
|
|
|
|
targetPlayer = random( alive_players );
|
|
|
|
foreach ( player in level.players )
|
|
{
|
|
entnum = targetPlayer GetEntityNumber();
|
|
player SetClientOmnvar( "ui_intel_target_player", entnum );
|
|
}
|
|
|
|
level.current_challenge_target_player = targetplayer GetEntityNumber();
|
|
|
|
targetplayer maps\mp\_entityheadIcons::setHeadIcon( targetplayer.team, "waypoint_defend", (0,0,72), 4, 4, undefined, undefined, undefined, true, undefined, false );
|
|
level thread watch_target_player( targetPlayer, self );
|
|
level thread watch_drill_detonated( targetPlayer,self );
|
|
|
|
}
|
|
watch_target_player( player, challenge )
|
|
{
|
|
level endon("drill_detonated");
|
|
player waittill_any( "death","last_stand","disconnect" );
|
|
|
|
player remove_head_icon();
|
|
|
|
challenge.success = false;
|
|
update_protect_a_player();
|
|
|
|
}
|
|
update_protect_a_player ()
|
|
{
|
|
maps\mp\alien\_challenge::deactivate_current_challenge();
|
|
|
|
foreach ( player in level.players )
|
|
{
|
|
player SetClientOmnvar( "ui_intel_target_player", -1 );
|
|
}
|
|
|
|
level.current_challenge_target_player = -1;
|
|
|
|
}
|
|
|
|
watch_drill_detonated( player, challenge )
|
|
{
|
|
player endon( "death" );
|
|
player endon( "last_stand" );
|
|
player endon( "disconnect" );
|
|
|
|
level waittill( "drill_detonated" );
|
|
|
|
player remove_head_icon();
|
|
|
|
update_protect_a_player();
|
|
}
|
|
|
|
remove_head_icon()
|
|
{
|
|
foreach ( key, headIcon in self.entityHeadIcons )
|
|
{
|
|
if( !isDefined( headIcon ) )
|
|
continue;
|
|
|
|
headIcon destroy();
|
|
}
|
|
}
|
|
|
|
deactivate_protect_a_player()
|
|
{
|
|
default_resetSuccess();
|
|
}
|
|
|
|
|
|
//=======================================================
|
|
// avoid minion explosions
|
|
//=======================================================
|
|
activate_avoid_minion_exp()
|
|
{
|
|
default_resetSuccess();
|
|
}
|
|
|
|
deactivate_avoid_minion_exp()
|
|
{
|
|
default_resetSuccess();
|
|
}
|
|
|
|
update_avoid_minion_exp( unused_1, unused_2, unused_3, unused_4, unused_5, unused_6, unused_7, unused_8, unused_9 )
|
|
{
|
|
self.success = false;
|
|
maps\mp\alien\_challenge::deactivate_current_challenge();
|
|
}
|
|
|
|
|
|
//=======================================================
|
|
// 75% accuracy
|
|
//=======================================================
|
|
update_75_percent_accuracy( unused_1, unused_2, unused_3, unused_4, unused_5, unused_6, unused_7, unused_8, unused_9 )
|
|
{
|
|
self.total_shots_hit++;
|
|
}
|
|
|
|
seventyfive_percent_accuracy_success_test( unused_1, unused_2, unused_3, unused_4, unused_5, unused_6, unused_7, unused_8, unused_9 )
|
|
{
|
|
return self.current_accuracy >= 75;
|
|
}
|
|
|
|
//=======================================================
|
|
// 50% accuracy
|
|
//=======================================================
|
|
fifty_percent_accuracy_success_test( unused_1, unused_2, unused_3, unused_4, unused_5, unused_6, unused_7, unused_8, unused_9 )
|
|
{
|
|
return self.current_accuracy >= 50;
|
|
}
|
|
|
|
update_50_percent_accuracy( hit, unused_2, unused_3, unused_4, unused_5, unused_6, unused_7, unused_8, unused_9 )
|
|
{
|
|
self.total_shots_hit++;
|
|
}
|
|
|
|
activate_percent_accuracy()
|
|
{
|
|
default_resetSuccess();
|
|
self.total_shots_fired = 0;
|
|
self.total_shots_hit = 0;
|
|
self.current_accuracy = 0;
|
|
self.is_updating = false;
|
|
level thread track_percent_accuracy_shots_fired( self );
|
|
level thread update_percent_accuracy( self );
|
|
update_challenge_percent( 0 );
|
|
}
|
|
|
|
deactivate_percent_accuracy()
|
|
{
|
|
default_resetSuccess();
|
|
self.total_shots_fired = 0;
|
|
self.total_shots_hit = 0;
|
|
level notify( "deactivate_track_accuracy" );
|
|
}
|
|
|
|
//=======================================================
|
|
//activation function for "kill x with weapon type" challenges
|
|
//=======================================================
|
|
activate_use_weapon_challenge()
|
|
{
|
|
setup_challenge_waypoints( self );
|
|
default_resetSuccess();
|
|
self.current_progress = 0;
|
|
update_challenge_progress ( 0, self.goal );
|
|
}
|
|
|
|
|
|
//=======================================================
|
|
// pistols_only
|
|
//=======================================================
|
|
update_pistols_only( weapon, sMeansOfDeath, arc_death, unused_4, unused_5, unused_6, unused_7, unused_8, unused_9 )
|
|
{
|
|
if ( getweaponclass( weapon ) == "weapon_pistol" || is_true ( arc_death ) )
|
|
self.current_progress++;
|
|
|
|
update_challenge_progress ( self.current_progress , self.goal );
|
|
|
|
if ( self.current_progress >= self.goal )
|
|
{
|
|
self.success = true;
|
|
maps\mp\alien\_challenge::deactivate_current_challenge();
|
|
}
|
|
|
|
}
|
|
|
|
//=======================================================
|
|
// shotguns_only
|
|
//=======================================================
|
|
update_shotguns_only( weapon ,sMeansOfDeath, arc_death, unused_4, unused_5, unused_6, unused_7, unused_8, unused_9 )
|
|
{
|
|
if ( getweaponclass( weapon ) == "weapon_shotgun" || is_true ( arc_death ) )
|
|
self.current_progress++;
|
|
|
|
update_challenge_progress ( self.current_progress , self.goal );
|
|
|
|
if ( self.current_progress >= self.goal )
|
|
{
|
|
self.success = true;
|
|
maps\mp\alien\_challenge::deactivate_current_challenge();
|
|
}
|
|
}
|
|
|
|
//=======================================================
|
|
// snipers_only
|
|
//=======================================================
|
|
update_snipers_only( weapon ,sMeansOfDeath, arc_death, unused_4, unused_5, unused_6, unused_7, unused_8, unused_9 )
|
|
{
|
|
if ( getweaponclass( weapon ) == "weapon_sniper" || is_true ( arc_death ) )
|
|
self.current_progress++;
|
|
|
|
update_challenge_progress ( self.current_progress , self.goal );
|
|
|
|
if ( self.current_progress >= self.goal )
|
|
{
|
|
self.success = true;
|
|
maps\mp\alien\_challenge::deactivate_current_challenge();
|
|
}
|
|
}
|
|
|
|
//=======================================================
|
|
// lmgs_only
|
|
//=======================================================
|
|
update_lmgs_only( weapon ,sMeansOfDeath, arc_death, unused_4, unused_5, unused_6, unused_7, unused_8, unused_9 )
|
|
{
|
|
if ( getweaponclass( weapon ) == "weapon_lmg" || is_true ( arc_death ) )
|
|
self.current_progress++;
|
|
|
|
update_challenge_progress ( self.current_progress , self.goal );
|
|
|
|
if ( self.current_progress >= self.goal )
|
|
{
|
|
self.success = true;
|
|
maps\mp\alien\_challenge::deactivate_current_challenge();
|
|
}
|
|
}
|
|
|
|
//=======================================================
|
|
// ar_only
|
|
//=======================================================
|
|
update_ar_only( weapon ,sMeansOfDeath, arc_death, unused_4, unused_5, unused_6, unused_7, unused_8, unused_9 )
|
|
{
|
|
if ( getweaponclass( weapon ) == "weapon_assault" || is_true ( arc_death ) )
|
|
self.current_progress++;
|
|
|
|
update_challenge_progress ( self.current_progress , self.goal );
|
|
|
|
if ( self.current_progress >= self.goal )
|
|
{
|
|
self.success = true;
|
|
maps\mp\alien\_challenge::deactivate_current_challenge();
|
|
}
|
|
}
|
|
//=======================================================
|
|
// smg_only
|
|
//=======================================================
|
|
update_smgs_only( weapon ,sMeansOfDeath, arc_death, unused_4, unused_5, unused_6, unused_7, unused_8, unused_9 )
|
|
{
|
|
if ( getweaponclass( weapon ) == "weapon_smg" || is_true ( arc_death ) )
|
|
self.current_progress++;
|
|
|
|
update_challenge_progress ( self.current_progress , self.goal );
|
|
|
|
if ( self.current_progress >= self.goal )
|
|
{
|
|
self.success = true;
|
|
maps\mp\alien\_challenge::deactivate_current_challenge();
|
|
}
|
|
}
|
|
|
|
//=======================================================
|
|
// kill_10_with_turrets
|
|
//=======================================================
|
|
activate_kill_10_with_turrets()
|
|
{
|
|
reset_kill_10_with_turrets_progress();
|
|
update_challenge_progress ( 0, self.goal );
|
|
}
|
|
|
|
deactivate_kill_10_with_turrets() { reset_kill_10_with_turrets_progress(); }
|
|
|
|
reset_kill_10_with_turrets_progress()
|
|
{
|
|
default_resetSuccess();
|
|
self.current_progress = 0;
|
|
}
|
|
|
|
update_kill_10_with_turrets ( aliens_killed, unused_2, unused_3, unused_4, unused_5, unused_6, unused_7, unused_8, unused_9 )
|
|
{
|
|
self.current_progress += aliens_killed; //self is the current struct return ( self.current_progress >= self.goal );
|
|
|
|
if ( self.current_progress >= self.goal )
|
|
self.success = true;
|
|
|
|
remaining = ( self.goal - self.current_progress );
|
|
update_challenge_progress ( self.current_progress, self.goal );
|
|
|
|
if ( self.success )
|
|
maps\mp\alien\_challenge::deactivate_current_challenge();
|
|
}
|
|
|
|
//=======================================================
|
|
// kill_airborne_aliens
|
|
//=======================================================
|
|
activate_kill_airborne_aliens()
|
|
{
|
|
reset_kill_airborne_aliens_progress();
|
|
update_challenge_progress ( 0, self.goal );
|
|
}
|
|
|
|
deactivate_kill_airborne_aliens() { reset_kill_airborne_aliens_progress(); }
|
|
|
|
reset_kill_airborne_aliens_progress()
|
|
{
|
|
default_resetSuccess();
|
|
self.current_progress = 0;
|
|
}
|
|
|
|
update_kill_airborne_aliens ( aliens_killed, unused_2, unused_3, unused_4, unused_5, unused_6, unused_7, unused_8, unused_9 )
|
|
{
|
|
self.current_progress += aliens_killed; //self is the current struct return ( self.current_progress >= self.goal );
|
|
|
|
if ( self.current_progress >= self.goal )
|
|
self.success = true;
|
|
|
|
remaining = ( self.goal - self.current_progress );
|
|
update_challenge_progress ( self.current_progress, self.goal );
|
|
|
|
if ( self.success )
|
|
maps\mp\alien\_challenge::deactivate_current_challenge();
|
|
}
|
|
|
|
//=======================================================
|
|
// melee only
|
|
//=======================================================
|
|
|
|
activate_melee_only() { reset_melee_only_progress(); }
|
|
deactivate_melee_only() { reset_melee_only_progress(); }
|
|
|
|
reset_melee_only_progress()
|
|
{
|
|
default_resetSuccess();
|
|
}
|
|
|
|
update_melee_only ( unused_1, unused_2, unused_3, unused_4, unused_5, unused_6, unused_7, unused_8, unused_9 )
|
|
{
|
|
self.success = false;
|
|
maps\mp\alien\_challenge::deactivate_current_challenge();
|
|
}
|
|
|
|
//=======================================================
|
|
// stay within area
|
|
//=======================================================
|
|
pre_activate_stay_within_area()
|
|
{
|
|
ring_location = get_challenge_ring_location( level.current_hive_name );
|
|
trace = BulletTrace( ring_location + (0,0,20), ring_location - (0,0,20), false,undefined,true,false,true,true );
|
|
|
|
self.ring_ent = spawn ( "script_model",trace["position"] );
|
|
self.ring_ent setmodel( "tag_origin" );
|
|
wait( 0.1 );
|
|
self.ring_fx = PlayFXOnTag(level._effect["challenge_ring"], self.ring_ent, "tag_origin" );
|
|
|
|
return true;
|
|
}
|
|
|
|
activate_stay_within_area()
|
|
{
|
|
default_resetSuccess();
|
|
self.current_progress = 0;
|
|
self.distance_check = 150*150;
|
|
update_challenge_progress ( 0, self.goal );
|
|
}
|
|
|
|
update_stay_within_area ( alien_pos, player_pos, unused_3, unused_4, unused_5, unused_6, unused_7, unused_8, unused_9 )
|
|
{
|
|
if ( abs( player_pos[2] - self.ring_ent.origin[2] ) > 75 )
|
|
return; //player is too far above/below the challenge zone
|
|
|
|
dist = distancesquared ( player_pos, self.ring_ent.origin );
|
|
if ( dist > self.distance_check ) //make sure that you are not too far above/below the challenge zone
|
|
return;
|
|
|
|
self.current_progress ++;
|
|
|
|
if ( self.current_progress >= self.goal )
|
|
{
|
|
self.success = true;
|
|
}
|
|
|
|
remaining = ( self.goal - self.current_progress );
|
|
update_challenge_progress ( self.current_progress, self.goal );
|
|
|
|
if ( self.success )
|
|
maps\mp\alien\_challenge::deactivate_current_challenge();
|
|
|
|
}
|
|
deactivate_stay_within_area()
|
|
{
|
|
level notify( "ring_challenge_ended" );
|
|
self.current_progress = 0;
|
|
self.ring_ent delete();
|
|
self.ring_fx = undefined;
|
|
if( isDefined( level.ring_waypoint_icon ))
|
|
level.ring_waypoint_icon destroy();
|
|
default_resetSuccess();
|
|
|
|
}
|
|
|
|
|
|
//=======================================================
|
|
// kill 10 in 30
|
|
//=======================================================
|
|
activate_kill_10_in_30()
|
|
{
|
|
default_resetSuccess();
|
|
self.current_progress = 0;
|
|
|
|
challenge_time = int ( gettime() + 30000 );
|
|
foreach ( player in level.players )
|
|
{
|
|
player SetClientOmnvar ( "ui_intel_timer", challenge_time );
|
|
}
|
|
level.current_challenge_timer = 30;
|
|
level thread update_current_challenge_timer();
|
|
update_challenge_progress ( 0, self.goal );
|
|
level thread kill_10_in_30_timer( self );
|
|
}
|
|
|
|
kill_10_in_30_timer( challenge )
|
|
{
|
|
level endon( "game_ended" );
|
|
self endon( "success" );
|
|
wait ( 30 );
|
|
self.success = false;
|
|
maps\mp\alien\_challenge::deactivate_current_challenge();
|
|
}
|
|
|
|
update_kill_10_in_30( num_killed, unused_2, unused_3, unused_4, unused_5, unused_6, unused_7, unused_8, unused_9 )
|
|
{
|
|
self.current_progress+= num_killed;
|
|
|
|
if ( self.current_progress >= self.goal )
|
|
{
|
|
self.success = true;
|
|
self notify( "success" );
|
|
}
|
|
|
|
remaining = ( self.goal - self.current_progress );
|
|
update_challenge_progress ( self.current_progress, self.goal );
|
|
|
|
if ( self.success )
|
|
maps\mp\alien\_challenge::deactivate_current_challenge();
|
|
}
|
|
|
|
|
|
/*
|
|
=============
|
|
///ScriptDocBegin
|
|
"Name: update_alien_death_challenges()"
|
|
"Summary: Update any challenges related to aliens dying a specifc way"
|
|
"Module: Alien"
|
|
"Example: update_alien_death_challenges( eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, timeOffset, deathAnimDuration )"
|
|
"SPMP: multiplayer"
|
|
///ScriptDocEnd
|
|
=============
|
|
*/
|
|
update_alien_death_challenges( eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, timeOffset, deathAnimDuration )
|
|
{
|
|
|
|
if ( !isDefined( level.current_challenge ) )
|
|
return;
|
|
|
|
current_challenge = level.current_challenge;
|
|
|
|
//for DLC challenges
|
|
if ( isDefined( level.custom_death_challenge_func ) )
|
|
{
|
|
continue_processing_challenges = self [[level.custom_death_challenge_func]]( eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, timeOffset, deathAnimDuration );
|
|
|
|
if ( !is_true ( continue_processing_challenges ) )
|
|
return;
|
|
}
|
|
|
|
attacker_is_player = isDefined ( eAttacker ) && isPlayer ( eAttacker );
|
|
attacker_defined = isDefined ( eAttacker );
|
|
inflictor_is_player = IsDefined ( eInflictor ) && isPlayer( eInflictor );
|
|
inflictor_defined = isDefined ( eInflictor );
|
|
alien_type = self get_alien_type();
|
|
weapon_defined = isDefined( sWeapon );
|
|
|
|
explosive_kill = false;
|
|
if ( weapon_defined )
|
|
{
|
|
explosive_kill = is_explosive_kill( sWeapon );
|
|
}
|
|
|
|
is_trap_kill = false;
|
|
if( inflictor_defined )
|
|
is_trap_kill = is_trap( eInflictor );
|
|
|
|
switch ( current_challenge )
|
|
{
|
|
case "pistols_only":
|
|
case "shotguns_only":
|
|
case "snipers_only":
|
|
case "lmgs_only":
|
|
case "ar_only":
|
|
case "smg_only":
|
|
if ( weapon_defined && sMeansOfDeath != "MOD_MELEE" )
|
|
{
|
|
isArcDeath = is_arc_death( eInflictor, eAttacker, attacker_defined, attacker_is_player, inflictor_defined,inflictor_is_player);
|
|
if ( !inflictor_defined || inflictor_is_player || isArcDeath ) //don't allow non-player damage to affect the weapons challenges
|
|
{
|
|
if ( isArcDeath )
|
|
maps\mp\alien\_challenge::update_challenge( current_challenge, sWeapon, sMeansofDeath, isArcDeath );
|
|
else
|
|
maps\mp\alien\_challenge::update_challenge( current_challenge, sWeapon, sMeansofDeath );
|
|
}
|
|
}
|
|
break;
|
|
|
|
case "melee_5_goons":
|
|
if ( alien_type == "goon" && attacker_is_player && sMeansOfDeath == "MOD_MELEE" )
|
|
maps\mp\alien\_challenge::update_challenge( "melee_5_goons", 1 );
|
|
break;
|
|
|
|
case "melee_spitter":
|
|
if ( alien_type == "spitter" && attacker_is_player && sMeansOfDeath == "MOD_MELEE" )
|
|
maps\mp\alien\_challenge::update_challenge( "melee_spitter", 1 );
|
|
break;
|
|
|
|
case "melee_only":
|
|
if ( attacker_is_player && sMeansOfDeath != "MOD_MELEE" )
|
|
maps\mp\alien\_challenge::update_challenge( "melee_only" );
|
|
break;
|
|
|
|
case "kill_airborne_aliens":
|
|
if ( attacker_is_player && isDefined( self.trajectoryActive ) && self.trajectoryActive )
|
|
maps\mp\alien\_challenge::update_challenge( "kill_airborne_aliens", 1 );
|
|
else if ( attacker_is_player && ( is_true ( self.in_air ) || alien_type == "bomber" ) && sMeansOfDeath != "MOD_SUICIDE" )
|
|
maps\mp\alien\_challenge::update_challenge( "kill_airborne_aliens", 1 );
|
|
else if ( attacker_is_player && alien_type == "ancestor" )
|
|
maps\mp\alien\_challenge::update_challenge( "kill_airborne_aliens", 1 );
|
|
break;
|
|
|
|
case "stay_prone":
|
|
if ( ( attacker_is_player || inflictor_is_player )&& eAttacker GetStance() == "prone" )
|
|
maps\mp\alien\_challenge::update_challenge( "stay_prone", 1 );
|
|
break;
|
|
|
|
case "kill_10_with_turrets":
|
|
if ( attacker_is_player && weapon_defined && maps\mp\alien\_damage::isAlienTurret( sWeapon ) )
|
|
maps\mp\alien\_challenge::update_challenge( "kill_10_with_turrets", 1 );
|
|
else if ( attacker_defined && isDefined( eAttacker.classname ) && eAttacker.classname == "misc_turret" && weapon_defined && maps\mp\alien\_damage::isAlienTurret( sWeapon ) )
|
|
maps\mp\alien\_challenge::update_challenge( "kill_10_with_turrets", 1 );
|
|
break;
|
|
|
|
case "stay_within_area":
|
|
if ( attacker_is_player )
|
|
maps\mp\alien\_challenge::update_challenge( "stay_within_area", self.origin, eAttacker.origin );
|
|
break;
|
|
|
|
case "kill_10_in_30":
|
|
if ( attacker_is_player )
|
|
maps\mp\alien\_challenge::update_challenge( "kill_10_in_30", 1 );
|
|
break;
|
|
|
|
case "kill_10_with_propane":
|
|
if ( weapon_defined && sWeapon == "alienpropanetank_mp" ) //killed with propane tank explosion
|
|
maps\mp\alien\_challenge::update_challenge( "kill_10_with_propane", 1 );
|
|
else if ( inflictor_defined && isDefined( eInflictor.classname) && eInflictor.classname == "trigger_radius" ) //killed with lingering fire damage from propane tank explosion
|
|
maps\mp\alien\_challenge::update_challenge( "kill_10_with_propane", 1 );
|
|
break;
|
|
|
|
case "kill_10_with_traps":
|
|
if ( is_trap_kill )
|
|
maps\mp\alien\_challenge::update_challenge( "kill_10_with_traps", 1 );
|
|
break;
|
|
}
|
|
}
|
|
|
|
is_arc_death( eInflictor, eAttacker,attacker_defined, attacker_is_player, inflictor_defined, inflictor_is_player )
|
|
{
|
|
return ( attacker_defined &&
|
|
attacker_is_player &&
|
|
inflictor_defined &&
|
|
!inflictor_is_player &&
|
|
IsDefined( eAttacker.stun_struct )&&
|
|
IsDefined( eAttacker.stun_struct.attack_bolt )&&
|
|
eInflictor == eAttacker.stun_struct.attack_bolt );
|
|
}
|
|
|
|
|
|
update_alien_damage_challenge( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, timeOffset, alien )
|
|
{
|
|
|
|
if ( !IsDefined( level.current_challenge ) )
|
|
return;
|
|
|
|
if ( level.current_challenge == "melee_only" && sMeansOfDeath != "MOD_MELEE" && !is_flaming_stowed_riotshield_damage( sMeansOfDeath, sWeapon, eInflictor ) && IsPlayer( eAttacker ) )
|
|
{
|
|
maps\mp\alien\_challenge::update_challenge( "melee_only" );
|
|
}
|
|
|
|
if ( isDefined ( eAttacker ) && isPlayer( eAttacker ) )
|
|
{
|
|
|
|
//for DLC challenges
|
|
if ( isDefined( level.custom_damage_challenge_func ) )
|
|
{
|
|
continue_processing_challenges = self [[level.custom_damage_challenge_func]]( eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, timeOffset, alien );
|
|
if ( !is_true ( continue_processing_challenges ) )
|
|
return;
|
|
}
|
|
|
|
eAttacker endon( "disconnect" );
|
|
waitframe();
|
|
|
|
if ( isDefined ( eAttacker.fired_weapon ) ) //for tracking accuracy challenges
|
|
{
|
|
|
|
if ( isDefined ( sWeapon ) && sWeapon == "alienpropanetank_mp" || sWeapon == "spore_pet_beam_mp" )
|
|
{
|
|
return;
|
|
}
|
|
|
|
if ( isDefined ( eInflictor) && isDefined( eInflictor.classname) && eInflictor.classname == "trigger_radius" ) //killed with lingering fire damage from propane tank explosion
|
|
{
|
|
return;
|
|
}
|
|
if ( isDefined ( sMeansOfDeath ) && sMeansOfDeath == "MOD_MELEE" )
|
|
{
|
|
return;
|
|
}
|
|
if ( iDFlags & 8 ) //no bullet penetration kills for accuracy, screws it up
|
|
{
|
|
return;
|
|
}
|
|
|
|
if ( maps\mp\alien\_damage::isAlienNonMannedTurret( sWeapon ) ) //no accuracy tracking with the automated turrets
|
|
{
|
|
return;
|
|
}
|
|
|
|
if ( sMeansOfDeath == "MOD_EXPLOSIVE_BULLET" && sHitLoc == "none" ) //explosive bullet damage - doesn't count
|
|
{
|
|
return;
|
|
}
|
|
|
|
if ( isDefined( sWeapon ) && sWeapon == "alienims_projectile_mp" )
|
|
{
|
|
return;
|
|
}
|
|
|
|
if ( isDefined ( sWeapon ) && getWeaponClass( sWeapon ) == "weapon_shotgun" )
|
|
{
|
|
eAttacker.fired_weapon = undefined;
|
|
}
|
|
|
|
if ( IsDefined( level.current_challenge ) )
|
|
{
|
|
if ( level.current_challenge == "75_percent_accuracy" )
|
|
maps\mp\alien\_challenge::update_challenge( "75_percent_accuracy", 1 );
|
|
else if ( level.current_challenge == "50_percent_accuracy" )
|
|
maps\mp\alien\_challenge::update_challenge( "50_percent_accuracy", 1 );
|
|
}
|
|
|
|
eAttacker.fired_weapon = undefined;
|
|
}
|
|
}
|
|
}
|
|
|
|
is_explosive_kill( sWeapon )
|
|
{
|
|
switch ( sWeapon )
|
|
{
|
|
case "aliensemtex_mp":
|
|
case "alienbetty_mp":
|
|
case "alienclaymore_mp":
|
|
case "iw6_alienmk32_mp":
|
|
case "iw6_alienmk321_mp":
|
|
case "iw6_alienmk322_mp":
|
|
case "iw6_alienmk323_mp":
|
|
case "iw6_alienmk324_mp":
|
|
return true;
|
|
default:
|
|
return false;
|
|
}
|
|
}
|
|
|
|
clear_last_alien_damaged_time()
|
|
{
|
|
self endon( "disconnect" );
|
|
wait( .05 );
|
|
self.last_alien_damaged_time = undefined;
|
|
|
|
}
|
|
|
|
update_alien_weapon_challenges ( weapon, sMeansOfDeath )
|
|
{
|
|
if ( !isDefined ( level.current_challenge ) )
|
|
return;
|
|
|
|
switch ( level.current_challenge )
|
|
{
|
|
case "pistols_only":
|
|
case "shotguns_only":
|
|
case "snipers_only":
|
|
case "lmgs_only":
|
|
case "ar_only":
|
|
case "smg_only":
|
|
maps\mp\alien\_challenge::update_challenge( level.current_challenge, weapon, sMeansofDeath );
|
|
break;
|
|
|
|
default:
|
|
return;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
update_challenge_progress ( current_val, max_val )
|
|
{
|
|
foreach ( player in level.players )
|
|
{
|
|
player SetClientOmnvar ( "ui_intel_progress_current",int( current_val ) );
|
|
player setClientOmnvar ( "ui_intel_progress_max",int ( max_val ) );
|
|
}
|
|
|
|
level.current_challenge_progress_max = max_val;
|
|
level.current_challenge_progress_current = current_val;
|
|
|
|
}
|
|
|
|
update_challenge_percent ( percent )
|
|
{
|
|
foreach ( player in level.players )
|
|
{
|
|
player SetClientOmnvar ( "ui_intel_percent",percent );
|
|
}
|
|
level.current_challenge_percent = percent;
|
|
}
|
|
|
|
update_percent_accuracy( challenge )
|
|
{
|
|
level endon( "deactivate_track_accuracy" );
|
|
last_accuracy = 0;
|
|
last_accuracy_count = 0;
|
|
while ( 1 )
|
|
{
|
|
if ( (challenge.total_shots_hit == 0 && challenge.total_shots_fired == 0) || challenge.total_shots_fired < 1 )
|
|
{
|
|
wait( 0.25);
|
|
continue;
|
|
}
|
|
accuracy = int ( ( challenge.total_shots_hit/challenge.total_shots_fired ) * 10000 );
|
|
|
|
//cap accuracy at no greater than 100% ( can go above 100% if you kill more than 1 alien with 1 bullet )
|
|
if ( accuracy > 10000 )
|
|
accuracy = 10000;
|
|
|
|
trimmed_accuracy = accuracy / 100;
|
|
challenge.current_accuracy = trimmed_accuracy;
|
|
if ( accuracy == last_accuracy )
|
|
{
|
|
last_accuracy_count++;
|
|
if ( last_accuracy_count > 2 ) //don't update the challenge until the value has stabilized for 3 frames
|
|
{
|
|
update_challenge_percent( accuracy );
|
|
last_accuracy_count = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
last_accuracy_count = 0;
|
|
}
|
|
wait .05;
|
|
last_accuracy = accuracy;
|
|
}
|
|
}
|
|
|
|
fail_challenge( challenge )
|
|
{
|
|
challenge.success = false;
|
|
maps\mp\alien\_challenge::deactivate_current_challenge();
|
|
}
|
|
|
|
track_percent_accuracy_shots_fired( challenge )
|
|
{
|
|
foreach ( player in level.players )
|
|
{
|
|
if ( !isAlive ( player ) )
|
|
continue;
|
|
player thread track_percent_accuracy_shots_fired_internal( challenge );
|
|
}
|
|
}
|
|
track_percent_accuracy_shots_fired_internal( challenge )
|
|
{
|
|
level endon( "deactivate_track_accuracy" );
|
|
self endon( "disconnect" );
|
|
self endon( "death" );
|
|
|
|
self childthread track_percent_accuracy_misc_shots_fired( challenge ); //for tracking turrets and other misc weapon fires
|
|
|
|
while ( 1 )
|
|
{
|
|
self waittill( "weapon_fired", wpn );
|
|
|
|
if ( !weapon_should_count_towards_accuracy_challenge( wpn ) )
|
|
continue;
|
|
|
|
self.fired_weapon = true;
|
|
challenge.total_shots_fired++;
|
|
}
|
|
}
|
|
|
|
track_percent_accuracy_misc_shots_fired( challenge )
|
|
{
|
|
level endon( "deactivate_track_accuracy" );
|
|
self endon( "disconnect" );
|
|
self endon( "death" );
|
|
|
|
while ( 1 )
|
|
{
|
|
self waittill_any( "turret_fire","nx1_large_fire" );
|
|
self.fired_weapon = true;
|
|
challenge.total_shots_fired++;
|
|
}
|
|
}
|
|
|
|
update_current_challenge_timer()
|
|
{
|
|
level endon( "stop_challenge_timer" );
|
|
while ( level.current_challenge_timer > 0 )
|
|
{
|
|
wait ( .1 );
|
|
level.current_challenge_timer = level.current_challenge_timer - 0.1;
|
|
}
|
|
}
|
|
|
|
weapon_should_count_towards_accuracy_challenge( wpn )
|
|
{
|
|
switch ( wpn )
|
|
{
|
|
case "alienbomb_mp":
|
|
case "alienclaymore_mp":
|
|
case "bouncingbetty_mp":
|
|
case "alientrophy_mp":
|
|
case "deployable_vest_marker_mp":
|
|
case "aliendeployable_crate_marker_mp":
|
|
case "alienpropanetank_mp":
|
|
case "alien_turret_marker_mp":
|
|
case "switchblade_laptop_mp":
|
|
case "mortar_detonator_mp":
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
get_challenge_scalar( challenge_name )
|
|
{
|
|
return [[level.challenge_scalar_func]]( challenge_name );
|
|
}
|
|
|
|
default_challenge_scalar_func( challenge_name )
|
|
{
|
|
switch ( challenge_name )
|
|
{
|
|
case "pistols_only":
|
|
case "snipers_only":
|
|
case "shotguns_only":
|
|
case "ar_only":
|
|
case "smg_only":
|
|
case "lmgs_only":
|
|
switch ( level.players.size )
|
|
{
|
|
case 1: return 15;
|
|
case 2: return 20;
|
|
case 3:
|
|
case 4: return 25;
|
|
}
|
|
|
|
case "kill_10_with_propane":
|
|
case "kill_10_with_traps":
|
|
case "kill_10_with_turrets":
|
|
switch ( level.players.size )
|
|
{
|
|
case 1: return 5;
|
|
case 2:
|
|
case 3:
|
|
case 4: return 10;
|
|
}
|
|
|
|
case "kill_10_in_30":
|
|
switch ( level.players.size )
|
|
{
|
|
case 1: return 5;
|
|
case 2:
|
|
case 3:
|
|
case 4: return 10;
|
|
}
|
|
|
|
case "stay_within_area":
|
|
switch ( level.players.size )
|
|
{
|
|
case 1: return 10;
|
|
case 2:
|
|
case 3:
|
|
case 4: return 20;
|
|
}
|
|
|
|
case "kill_airborne_aliens":
|
|
switch ( level.players.size )
|
|
{
|
|
case 1: return 3;
|
|
case 2:
|
|
case 3:
|
|
case 4: return 5;
|
|
}
|
|
|
|
case "stay_prone":
|
|
switch ( level.players.size )
|
|
{
|
|
case 1: return 15;
|
|
case 2:
|
|
case 3:
|
|
case 4: return 25;
|
|
}
|
|
case "spend_20k": //the string contains "$X,000" so we don't need to pass in the whole number
|
|
switch ( level.players.size )
|
|
{
|
|
case 1: return 6;
|
|
case 2: return 10;
|
|
case 3: return 15;
|
|
case 4: return 20;
|
|
}
|
|
case "spend_10k": //the string contains "$X,000" so we don't need to pass in the whole number
|
|
switch ( level.players.size )
|
|
{
|
|
case 1: return 6;
|
|
case 2:
|
|
case 3:
|
|
case 4: return 10;
|
|
}
|
|
|
|
case "melee_5_goons":
|
|
switch ( level.players.size )
|
|
{
|
|
case 1: return 5;
|
|
case 2: return 10;
|
|
case 3: return 10;
|
|
case 4: return 15;
|
|
}
|
|
|
|
}
|
|
return undefined;
|
|
|
|
}
|
|
|
|
show_barrier_hive_intel()
|
|
{
|
|
CONST_CHALLENGE_HIVE_INTEL = 52; //challenge table entry
|
|
CONST_BARRIER_HIVE_TITLE = 2; // omnvar entry to show barrier hive title in the challenge window
|
|
|
|
foreach ( player in level.players )
|
|
{
|
|
player SetClientOmnvar("ui_intel_title", CONST_BARRIER_HIVE_TITLE );
|
|
player SetClientOmnvar("ui_intel_active_index", CONST_CHALLENGE_HIVE_INTEL );
|
|
}
|
|
|
|
level.current_challenge_title = CONST_BARRIER_HIVE_TITLE;
|
|
level.current_challenge_index = CONST_CHALLENGE_HIVE_INTEL;
|
|
}
|
|
|
|
hide_barrier_hive_intel()
|
|
{
|
|
foreach ( player in level.players )
|
|
{
|
|
player SetClientOmnvar("ui_intel_active_index",-1 );
|
|
player SetClientOmnvar("ui_intel_title", -1 );
|
|
}
|
|
|
|
level.current_challenge_title = -1;
|
|
level.current_challenge_index = -1;
|
|
}
|
|
|
|
get_challenge_ring_location( hive_name )
|
|
{
|
|
if( isDefined( level.challenge_ring_location_func ) )
|
|
return [[level.challenge_ring_location_func]]( hive_name );
|
|
|
|
return undefined;
|
|
|
|
}
|
|
|
|
create_challenge_waypoints( item )
|
|
{
|
|
wayPoint_SHADER = "waypoint_alien_weapon_challenge";
|
|
wayPoint_WIDTH = 14;
|
|
wayPoint_HEIGHT = 14;
|
|
wayPoint_ALPHA = 0.75;
|
|
wayPoint_POS = item.origin;
|
|
|
|
if ( level.script == "mp_alien_armory" )
|
|
wayPoint_ALPHA = 0;
|
|
|
|
waypoint_icon = maps\mp\alien\_hud::make_wayPoint( wayPoint_SHADER, wayPoint_WIDTH, wayPoint_HEIGHT, wayPoint_ALPHA, wayPoint_POS );
|
|
|
|
return waypoint_icon;
|
|
}
|
|
|
|
setup_challenge_waypoints( challenge )
|
|
{
|
|
current_area = get_current_area_name();
|
|
|
|
current_challenge = level.current_challenge;
|
|
|
|
if ( current_challenge == "pistols_only" )
|
|
return;
|
|
|
|
challenge_weapons = get_challenge_weapons ( current_area, current_challenge );
|
|
|
|
self.challenge_weapons = [];
|
|
|
|
foreach ( weapon in challenge_weapons )
|
|
{
|
|
self.challenge_weapons[ self.challenge_weapons.size ] = getBaseWeaponName( weapon );
|
|
}
|
|
}
|
|
|
|
get_challenge_weapons ( current_area, current_challenge )
|
|
{
|
|
challenge_weapon_class = get_weapon_class_for_current_challenge( current_challenge );
|
|
|
|
if ( !IsDefined (challenge_weapon_class) && current_challenge == "semi_autos_only" )
|
|
|
|
{
|
|
challenge_weapon_class = [ "weapon_dmr", "weapon_sniper" ];
|
|
}
|
|
|
|
possible_weapons = [];
|
|
|
|
waypoints = [];
|
|
|
|
foreach ( item in level.world_items )
|
|
{
|
|
if ( level.script == "mp_alien_armory" )
|
|
{
|
|
if ( IsDefined ( item.script_noteworthy ) && item.script_noteworthy == "weapon_iw6_aliendlc15_mp" )
|
|
{
|
|
item.areas = [];
|
|
item.areas [0] = "checkpoint";
|
|
}
|
|
}
|
|
if ( IsDefined ( item.areas ) && item.areas[ 0 ] == current_area )
|
|
{
|
|
if ( !IsDefined ( item.script_noteworthy ) )
|
|
continue;
|
|
|
|
base_weapon = GetSubStr ( item.script_noteworthy, 7 );
|
|
|
|
WeaponClass = getWeaponClass( base_weapon );
|
|
if ( IsArray ( challenge_weapon_class ) )
|
|
{
|
|
if ( array_contains ( challenge_weapon_class, WeaponClass ) )
|
|
{
|
|
possible_weapons[ possible_weapons.size ] = base_weapon;
|
|
|
|
waypoint = create_challenge_waypoints( item );
|
|
waypoints[ waypoints.size ] = waypoint;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ( challenge_weapon_class != WeaponClass )
|
|
continue;
|
|
possible_weapons[ possible_weapons.size ] = base_weapon;
|
|
|
|
waypoint = create_challenge_waypoints( item );
|
|
waypoints[ waypoints.size ] = waypoint;
|
|
}
|
|
}
|
|
}
|
|
self.waypoints = waypoints;
|
|
|
|
return possible_weapons;
|
|
}
|
|
|
|
get_weapon_class_for_current_challenge( current_challenge )
|
|
{
|
|
switch ( current_challenge )
|
|
{
|
|
case "ar_only": return "weapon_assault";
|
|
case "snipers_only": return "weapon_sniper";
|
|
case "smg_only": return "weapon_smg";
|
|
case "lmgs_only": return "weapon_lmg";
|
|
case "shotguns_only": return "weapon_shotgun";
|
|
}
|
|
}
|
|
|
|
deactivate_weapon_challenge_waypoints()
|
|
{
|
|
if ( IsDefined ( self ) && IsDefined ( self.waypoints ) )
|
|
{
|
|
foreach ( waypoint in self.waypoints )
|
|
{
|
|
waypoint Destroy ();
|
|
}
|
|
}
|
|
default_resetSuccess();
|
|
}
|
|
|
|
//self = an alien
|
|
focus_fire_update_alien_outline( player )
|
|
{
|
|
foreach ( player in level.players )
|
|
{
|
|
if ( array_contains ( self.damaged_by_players, player ) )
|
|
{
|
|
if ( isDefined( player.isFeral ) && player.isFeral )
|
|
{
|
|
maps\mp\alien\_outline_proto::enable_outline_for_player( self, player, 4, false, "high" );
|
|
}
|
|
else
|
|
{
|
|
maps\mp\alien\_outline_proto::disable_outline_for_player( self, player ); //remove outline once damaged
|
|
}
|
|
}
|
|
else
|
|
{
|
|
maps\mp\alien\_outline_proto::enable_outline_for_player( self, player, 0, false, "high" ); //show white outline to players who haven't shot the alien
|
|
}
|
|
}
|
|
} |