iw6-scripts-dev/maps/mp/alien/_persistence.gsc
2024-12-11 11:28:08 +01:00

1864 lines
54 KiB
Plaintext

#include common_scripts\utility;
#include maps\mp\_utility;
#include maps\mp\agents\_agent_utility;
#include maps\mp\alien\_utility;
#include maps\mp\alien\_perk_utility;
//=======================================================
// Player persistent data script
//=======================================================
CURRENCY_START = 500;
CURRENCY_UPGRADE_START = 1500;
CURRENCY_MAX = 6000;
POINTS_MAX = 255;
MAX_PRESTIGE = 25;
FREE_SKILL_POINTS = 1; // given at start after having purchased this with tokens
CHAOS_START_SKILL_POINTS = 50; // enough skill points for player to upgrade to max skill level via bonus packages
/*
> Player XP & Rank & Prestige
> Player Unlocks ( title cards, perks, dpad abilities )
> Player Loadout setup
> Player Options/Settings
> Player Combat Stats ( career stats and scoring )
> Player Leaderboard data
> Player Permanent Items
*/
// sets game state for: join in progress rules, leaderboard rules, etc...
set_game_state( state )
{
allowed_states = [ "pregame", "prehive", "progressing", "escaping", "ended" ]; // matches enums in playerdata.def
state_allowed = array_contains( allowed_states, state );
assertex( state_allowed, "State: " + state + " is not allowed" );
self SetCoopPlayerData( "alienSession", "game_state", state );
}
//=======================================================
// PERKS
//=======================================================
// get player selected perks
get_selected_perk_0()
{
if( is_chaos_mode() )
{
return "perk_none";
}
return self getcoopplayerdata( "alienPlayerLoadout", "perks", 0 );
}
get_selected_perk_0_secondary()
{
//secondary class options inheret their level from selected perk 0;
secondaryClass = "perk_none";
if ( self is_upgrade_enabled( "multi_class" ) && !is_chaos_mode( ))
{
secondaryClassIndex = self GetCoopPlayerDataReservedInt( "secondary_class" );
keys = getArrayKeys( level.alien_perks["perk_0"] );
foreach( key in keys )
{
if ( level.alien_perks["perk_0"][key].baseIdx == secondaryClassIndex )
{
secondaryClass = key;
}
}
}
return secondaryClass;
}
get_selected_perk_1() { return self getcoopplayerdata( "alienPlayerLoadout", "perks", 1 ); }
// get current perks, upgraded perks is tracked in alienSession perks[]
get_perk_0_level() { return self getcoopplayerdata( "alienSession", "perk_0_level" ); }
get_perk_1_level() { return self getcoopplayerdata( "alienSession", "perk_1_level" ); }
// set current perk upgrade
set_perk_0_level( upgrade_level ) { self setcoopplayerdata( "alienSession", "perk_0_level", upgrade_level ); }
set_perk_1_level( upgrade_level ) { self setcoopplayerdata( "alienSession", "perk_1_level", upgrade_level ); }
set_perk( perk_ref ) { self [[level.alien_perk_callbacks[perk_ref].Set]](); }
unset_perk( perk_ref ) { self [[level.alien_perk_callbacks[perk_ref].unSet]](); }
// initialize the current perk upgrade level, 0
init_perk_level()
{
self set_perk_0_level( 0 );
self set_perk_1_level( 0 );
}
give_initial_perks()
{
self set_perk( self get_selected_perk_0() );
self set_perk( self get_selected_perk_1() ); //<NOTE J.C.> Delete if we decide to remove Perk 1
if( self is_upgrade_enabled( "multi_class" ))
{
self set_perk( self get_selected_perk_0_secondary() );
}
}
//=======================================================
// COMBAT RESOURCES
//=======================================================
// get player selected dpad combat resources
get_selected_dpad_up() { return self getcoopplayerdata( "alienPlayerLoadout", "munition" ); }
get_selected_dpad_down() { return self getcoopplayerdata( "alienPlayerLoadout", "support" ); }
get_selected_dpad_left()
{
defense = self getcoopplayerdata( "alienPlayerLoadout", "defense" );
if ( defense == "dpad_placeholder_def_1" && maps\mp\alien\_utility::is_chaos_mode() )
return "dpad_minigun_turret";
else
return defense;
}
get_selected_dpad_right()
{
offense = self getcoopplayerdata( "alienPlayerLoadout", "offense" );
if ( offense == "dpad_placeholder_off_1" && maps\mp\alien\_utility::is_chaos_mode() )
return "dpad_ims";
else
return offense;
}
// get current combat resources, upgraded resources is tracked in alienSession...
get_dpad_up_level() { return self getcoopplayerdata( "alienSession", "munition_level" ); }
get_dpad_down_level() { return self getcoopplayerdata( "alienSession", "support_level" ); }
get_dpad_left_level() { return self getcoopplayerdata( "alienSession", "defense_level" ); }
get_dpad_right_level() { return self getcoopplayerdata( "alienSession", "offense_level" ); }
get_upgrade_level( type ) { return self getcoopplayerdata( "alienSession", type + "_level" ); }
set_upgrade_level( type, upgrade_level )
{
self setcoopplayerdata( "alienSession", type + "_level", upgrade_level );
// EoG tracking: update everyone's loadout upgrade level, used by in-game UI to see teammate's info
loadout_ref = "LoadoutPlayer" + ( self GetEntityNumber() );
setcoopplayerdata_for_everyone( loadout_ref, type + "_level", upgrade_level );
}
// set current combat resource upgrades
set_dpad_up_level( upgrade_level ) { self setcoopplayerdata( "alienSession", "munition_level", upgrade_level ); }
set_dpad_down_level( upgrade_level ) { self setcoopplayerdata( "alienSession", "support_level", upgrade_level ); }
set_dpad_left_level( upgrade_level ) { self setcoopplayerdata( "alienSession", "defense_level", upgrade_level ); }
set_dpad_right_level( upgrade_level ) { self setcoopplayerdata( "alienSession", "offense_level", upgrade_level ); }
// initialize the current combat resource upgrade level, 0
init_combat_resource_level()
{
self set_dpad_up_level( 0 );
self set_dpad_down_level( 0 );
self set_dpad_left_level( 0 );
self set_dpad_right_level( 0 );
}
//=======================================================
// CURRENCY
//=======================================================
get_player_currency() { return self getcoopplayerdata( "alienSession", "currency" ); }
get_player_max_currency() { return self.maxCurrency; }
wait_to_set_player_currency( amount )
{
self endon( "disconnect" );
level endon( "game_ended" );
wait( 0.5 ); // wait because level.players array may not yet be populated at this point
if ( self is_upgrade_enabled( "more_cash_upgrade" ) )
set_player_currency( CURRENCY_UPGRADE_START );
else
set_player_currency( amount );
}
set_player_currency( amount )
{
self setcoopplayerdata( "alienSession", "currency", int( amount ) );
// EoG tracking: currency
self eog_player_update_stat( "currency", int( amount ), true );
}
get_player_points() { return self getcoopplayerdata( "alienSession", "skill_points" ); }
set_player_points( amount ) { self setcoopplayerdata( "alienSession", "skill_points", int( amount ) ); }
set_player_max_currency( amount )
{
amount = int( amount );
self SetClientOmnvar( "ui_alien_max_currency", amount );
self.maxCurrency = amount;
}
give_player_currency( amount, font_size, sHitloc, skip_prestige_scalar )
{
assert( amount >= 0 );
if ( !is_true( skip_prestige_scalar ) )
{
amount = int( amount * self maps\mp\alien\_prestige::prestige_getMoneyEarnedScalar() );
amount = maps\mp\alien\_gamescore::round_up_to_nearest( amount, 5 );
}
if ( is_chaos_mode() && is_true( self.chaosinthemoney ) )
{
amount = int( amount * 1.5 );
amount = maps\mp\alien\_gamescore::round_up_to_nearest( amount, 5 );
}
current_amount = self get_player_currency();
max_amount = self get_player_max_currency();
new_amount = current_amount + amount;
new_amount = min( new_amount, max_amount );
if ( !isdefined( self.total_currency_earned ) )
self.total_currency_earned = amount;
else
self.total_currency_earned += ( new_amount - current_amount );
// EoG tracking: currency
self eog_player_update_stat( "currencytotal", int( self.total_currency_earned ), true );
self notify( "loot_pickup" );
self set_player_currency( new_amount );
//show the player a hint if he's max'd out his cash
MAX_CASH_COOL_DOWN_TIME = 30000; //30 seconds
current_time = getTime();
if ( current_amount == max_amount )
self setclientomnvar( "ui_alien_cash_overflow", true );
if ( new_amount >= max_amount )
{
if ( !isDefined( self.next_maxmoney_hint_time ) )
{
self.next_maxmoney_hint_time = current_time + MAX_CASH_COOL_DOWN_TIME;
}
else if ( current_time < self.next_maxmoney_hint_time )
{
return;
}
if ( !level.gameEnded )
{
self maps\mp\_utility::setLowerMessage( "maxmoney", &"ALIEN_COLLECTIBLES_MONEY_MAX", 4 );
self.next_maxmoney_hint_time = current_time + MAX_CASH_COOL_DOWN_TIME;
}
}
}
take_player_currency( amount, dont_update_challenge, spending_type, weapon_ref )
{
assert( amount >= 0 );
current_amount = self get_player_currency();
new_amount = max( 0, current_amount - amount );
amount_spent = int( current_amount - new_amount );
maps\mp\alien\_chaos::update_spending_currency_event( self, spending_type, weapon_ref );
self notify( "loot_removed" );
self set_player_currency( new_amount );
if ( isDefined ( spending_type ) )
maps\mp\alien\_alien_matchdata::update_spending_type( amount_spent, spending_type );
if ( isDefined ( dont_update_challenge ) && dont_update_challenge )
return;
self eog_player_update_stat( "currencyspent", amount_spent );
//don't fail challenges if the player spends 0 dollars
if ( amount_spent < 1 )
return;
maps\mp\alien\_challenge::update_challenge ( "spend_10k", amount );
maps\mp\alien\_challenge::update_challenge ( "spend_20k", amount );
maps\mp\alien\_challenge::update_challenge ( "spend_no_money" );
}
take_all_currency()
{
self set_player_currency( 0 );
}
player_has_enough_currency( amount )
{
assert( amount >= 0 );
currency = self get_player_currency();
return (currency >= amount);
}
try_take_player_currency( amount )
{
if ( self player_has_enough_currency( amount ) )
{
self take_player_currency( amount );
return true;
}
else
{
return false;
}
}
give_player_points( amount )
{
assert( amount >= 0 );
current_amount = self get_player_points();
new_amount = current_amount + amount;
new_amount = min( new_amount, POINTS_MAX );
self set_player_points( new_amount );
}
take_player_points( amount )
{
assert( amount >= 0 );
current_amount = self get_player_points();
new_amount = max( 0, current_amount - amount );
self notify( "points_removed" );
self set_player_points( new_amount );
}
player_has_enough_points( amount )
{
assert( amount >= 0 );
points = self get_player_points();
return (points >= amount);
}
try_take_player_points( amount )
{
if ( self player_has_enough_points( amount ) )
{
self take_player_points( amount );
return true;
}
else
{
return false;
}
}
// check against rank for unlock
is_unlocked( item_ref )
{
item_type = undefined;
item_type = strtok( item_ref, "_" )[ 0 ]; // currently only "perk" or "dpad"
item_unlock_rank = level.combat_resource[ item_ref ].unlock;
player_rank = self get_player_rank();
return player_rank >= item_unlock_rank;
// return int( self getplayerdata( "unlock", item_ref ) );
}
player_persistence_init()
{
// enable xp
level.alien_xp = true;
// inits with playerdata
self init_combat_resource_level();
self init_perk_level();
self init_each_perk();
self give_initial_perks();
// initial values for session data
starting_currency = get_starting_currency();
self thread wait_to_set_player_currency( starting_currency );
self set_player_max_currency( CURRENCY_MAX * maps\mp\alien\_prestige::prestige_getWalletSizeScalar() );
starting_skill_point = get_starting_skill_point();
self set_player_points( starting_skill_point );
self set_player_session_xp( 0 );
self set_player_session_rankup( 0 );
// let's tell the game to send this info to everybody else
self SetRank( self get_player_rank(), self get_player_prestige() );
self session_stats_init();
num_nerf_selected = maps\mp\alien\_prestige::get_num_nerf_selected();
self LB_player_update_stat( "prestigenerfs", num_nerf_selected, true );
self thread update_loadout_for_everyone();
// init HUD - XP
//if ( isdefined( level.alien_xp ) && level.alien_xp )
// self maps\mp\alien\_hud::init_player_xp_display();
}
get_starting_currency()
{
/#
if ( isDefined( level.debug_starting_currency ) )
return level.debug_starting_currency;
#/
return CURRENCY_START;
}
get_starting_skill_point()
{
/#
if ( isDefined( level.debug_starting_skill_point ) )
return level.debug_starting_skill_point;
#/
if ( is_chaos_mode() )
return CHAOS_START_SKILL_POINTS;
if ( self is_upgrade_enabled( "free_skill_points_upgrade" ) )
return FREE_SKILL_POINTS;
else
return 0;
}
update_loadout_for_everyone()
{
// self is connecting player
// if called twice within a short time (delays within this function), last call takes effect
level notify( "updating_player_loadout_data" );
level endon( "updating_player_loadout_data" );
if ( !isdefined( level.players ) || level.players.size == 0 )
wait 0.5;
wait 1; // padding for all players to be connected on start of game
foreach ( p in level.players )
{
loadout_ref = "LoadoutPlayer" + ( p GetEntityNumber() );
perk_0 = p get_selected_perk_0(); // "perks", 0
perk_1 = p get_selected_perk_1(); // "perks", 1
dpad_up = p get_selected_dpad_up(); // "munition"
dpad_down = p get_selected_dpad_down(); // "support"
dpad_left = p get_selected_dpad_left(); // "defense"
dpad_right = p get_selected_dpad_right(); // "offense"
// upgrade levels - initialize, will be updated later as well
perk_0_level = p get_perk_0_level(); // "perk_0_level"
perk_1_level = p get_perk_1_level(); // "perk_1_level"
dpad_up_level = p get_dpad_up_level(); // "munition_level"
dpad_down_level = p get_dpad_down_level(); // "support_level"
dpad_left_level = p get_dpad_left_level(); // "defense_level"
dpad_right_level = p get_dpad_right_level(); // "offense_level"
// update everyone, everyone's loadout
foreach ( player in level.players )
{
player setcoopplayerdata( loadout_ref, "perks", 0, perk_0 );
player setcoopplayerdata( loadout_ref, "perks", 1, perk_1 );
player setcoopplayerdata( loadout_ref, "munition", dpad_up );
player setcoopplayerdata( loadout_ref, "support", dpad_down );
player setcoopplayerdata( loadout_ref, "defense", dpad_left );
player setcoopplayerdata( loadout_ref, "offense", dpad_right );
player setcoopplayerdata( loadout_ref, "perk_0_level", perk_0_level );
player setcoopplayerdata( loadout_ref, "perk_1_level", perk_1_level );
player setcoopplayerdata( loadout_ref, "munition_level", dpad_up_level );
player setcoopplayerdata( loadout_ref, "support_level", dpad_down_level );
player setcoopplayerdata( loadout_ref, "defense_level", dpad_left_level );
player setcoopplayerdata( loadout_ref, "offense_level", dpad_right_level );
}
if ( !isdefined( p.bbprint_loadout ) )
{
p.bbprint_loadout = true; // print once
// ============== BBPrint for player loadout (self) ===============
// self is player on connect
playername = "";
if ( isdefined( self.name ) )
playername = self.name;
playerrank = self get_player_rank();
playerxp = self get_player_xp();
playerprestige = self get_player_prestige();
playerescaped = self get_player_escaped();
connecttime = gettime();
cyclenum = 0;
if ( isdefined( level.current_cycle_num ) )
cyclenum = level.current_cycle_num;
/#
if ( GetDvarInt( "alien_bbprint_debug" ) > 0 )
{
IPrintLnBold( "^8bbprint: alienplayerloadout (1/2)\n" +
" playername=" + playername +
" playerrank=" + playerrank +
" playerxp=" + playerxp +
" playerprestige=" + playerprestige +
" playerescaped=" + playerescaped +
" connecttime=" + connecttime +
" cyclenum=" + cyclenum );
IPrintLnBold( "^8bbprint: alienplayerloadout (2/2)\n" +
" perk0=" + perk_0 +
" perk1=" + perk_1 +
" dpadup=" + dpad_up +
" dpaddown=" + dpad_down +
" dpadleft=" + dpad_left +
" dpadright=" + dpad_right );
}
#/
bbprint( "alienplayerloadout",
"playername %s playerrank %i playerxp %i playerprestige %i playerescaped %i connecttime %i cyclenum %i perk0 %s perk1 %s dpadup %s dpaddown %s dpadleft %s dpadright %s ",
playername,
playerrank,
playerxp,
playerprestige,
playerescaped,
connecttime,
cyclenum,
perk_0,
perk_1,
dpad_up,
dpad_down,
dpad_left,
dpad_right );
}
}
}
setcoopplayerdata_for_everyone( param0, param1, param2, param3, param4 )
{
assertex( level.players.size > 0, "setting player data when level.players array is not yet populated" );
foreach ( player in level.players )
{
if ( isdefined( param0 ) && isdefined( param1 ) && isdefined( param2 ) && isdefined( param3 ) && isdefined( param4 ) )
{
player setcoopplayerdata( param0, param1, param2, param3, param4 );
continue;
}
if ( isdefined( param0 ) && isdefined( param1 ) && isdefined( param2 ) && isdefined( param3 ) && !isdefined( param4 ) )
{
player setcoopplayerdata( param0, param1, param2, param3 );
continue;
}
if ( isdefined( param0 ) && isdefined( param1 ) && isdefined( param2 ) && !isdefined( param3 ) && !isdefined( param4 ) )
{
player setcoopplayerdata( param0, param1, param2 );
continue;
}
if ( isdefined( param0 ) && isdefined( param1 ) && !isdefined( param2 ) && !isdefined( param3 ) && !isdefined( param4 ) )
{
player setcoopplayerdata( param0, param1 );
continue;
}
}
}
//=======================================================
// TOKENS ( TEETH ) - Currency spent in the front end
//=======================================================
//we have space for 28 independent bonus awards, these are setup to be awarded by calling wait_then_try_give_one_shot_token_bonus
//from spawn player in ffotd. Since a bonus is only awarded once make sure we are keeping track of which bonus we have given out so far.
//NEXT BONUS IS BONUS 0
get_token_bonus_flag( bonusNum )
{
flagNum = 4;
if( bonusNum < 28 )
flagNum += bonusNum;
return flagNum;
}
is_valid_bonus_flag( flag )
{
//available flags are the bits of reserve data 'eggstra_award_flags' ( bits 0-3 are used elsewhere )
return ( flag >= 4 && flag < 32 );
}
wait_then_try_give_one_shot_token_bonus( bonusFlag, numTokens )
{
self endon( "disconnect" );
level endon( "game_ended" );
if( !is_valid_bonus_flag( bonusFlag ))
return;
//wait until the first hive is killed to give any awards.
level waittill ( "regular_hive_destroyed" );
try_give_one_shot_token_bonus( bonusFlag, numTokens );
}
try_give_one_shot_token_bonus( bonusFlag, numTokens )
{
if ( !is_using_extinction_tokens( ) )
return;
if ( !level.onlineGame )
return;
if( !is_valid_bonus_flag( bonusFlag ))
return;
eggstra_award_flags = self GetCoopPlayerDataReservedInt( "eggstra_award_flags" );
value = ( eggstra_award_flags >> bonusFlag ) & 1;
//if the bit is already flagged then we have already awarded the bonus and we dont want to award it again.
if ( value == 1 )
return;
//mark the flag so we know we have awarded the bonus in the future.
eggstra_award_flags |= ( 1 << bonusFlag );
self SetCoopPlayerDataReservedInt( "eggstra_award_flags", eggstra_award_flags );
give_player_tokens( numTokens, true );
}
is_using_extinction_tokens()
{
if ( GetDvarInt( "extinction_tokens_enabled" ) > 0 )
{
return true;
}
return false;
}
give_player_tokens( numTokens, showSplash )
{
//if the feature is not enabled return false
if ( !is_using_extinction_tokens( ) )
{
return;
}
if ( is_true( showSplash ) )
{
self setclientomnvar ( "ui_alien_award_token", numTokens ); // display award notification via LUA
}
currTokens = self GetCoopPlayerDataReservedInt( "extinction_tokens" );
self SetCoopPlayerDataReservedInt( "extinction_tokens", currTokens + numTokens );
self give_player_session_tokens( numTokens );
}
try_award_bonus_pool_token()
{
//if the feature is not enabled we dont want to read from bonus_pool_size
if ( !is_using_extinction_tokens( ) )
return;
//bonus pool rewards only apply to online games ( offline games cannot manage a reliable week timeout )
if ( !level.onlineGame )
return;
//players are limited to one bonus pool tooth per game
if( isDefined( self.pers["hasEarnedBonusToken"] ))
return;
self.pers["hasEarnedBonusToken"] = true;
numInBonusPool = self GetCoopPlayerDataReservedInt( "bonus_pool_size" );
if ( numInBonusPool > 0 )
{
self SetCoopPlayerDataReservedInt( "bonus_pool_size", numInBonusPool - 1 );
give_player_tokens( 1, true );
}
}
award_rank_up_tokens( oldRank )
{
prestigeLevel = self get_player_prestige();
if ( oldRank < level.alien_ranks.size && prestigeLevel == 0 )
{
numAwarded = level.alien_ranks[ oldRank ].tokenReward;
if ( numAwarded > 0 )
{
give_player_tokens( numAwarded, true );
}
}
}
award_completion_tokens()
{
if ( is_casual_mode() )
return;
//self is the player being awarded tokens
//standard completion bonus is 3 token scaled with xp bonus weekends
numAwarded = get_scaled_xp( 5 );
//bonus tooth for completion in hardcore mode
if( is_hardcore_mode( ) )
{
numAwarded = numAwarded + 3;
/#
if ( getDvar( "alien_debug_eog" ) == "1" )
iprintln( "Hardcore Bonus Token Awarded!" );
#/
}
//4 for getting completionist
if ( level.all_challenge_completed )
{
numAwarded = numAwarded + 4;
}
//bonus token for finishing with any active relics.
num_active_relics = self maps\mp\alien\_prestige::get_num_nerf_selected();
if ( num_active_relics > 0 && !is_true( self.pers["hotjoined"] ))
{
if ( num_active_relics == 1 )
numAwarded = numAwarded + 1;
else if ( num_active_relics == 2 )
numAwarded = numAwarded + 2;
else if ( num_active_relics >= 3 )
numAwarded = numAwarded + 3;
/#
if ( getDvar( "alien_debug_eog" ) == "1" )
iprintln( "Active Relics Bonus Token Awarded!" );
#/
}
//An sssist bonus is awarded when a player with previous escapes helps a new guy escape for the first time.
if( 1 < self get_player_escaped() )
{
foreach ( player in level.players )
{
if ( player != self && 1 == player get_player_escaped() )
{
numAwarded++;
/#
if ( getDvar( "alien_debug_eog" ) == "1" )
iprintln( "New Player Assist Bonus Token Awarded!" );
#/
}
}
}
give_player_tokens( numAwarded );
}
is_upgrade_enabled( itemRef )
{
if ( is_chaos_mode() )
{
return false;
}
//if the feature is not enabled return false
if ( !is_using_extinction_tokens( ) )
{
return false;
}
/#
// Forces all purchasables to enabled
if ( GetDvarInt( "EnableExtinctionPurchasables" ) )
{
return true;
}
// Forces all purchasables to disabled
if ( GetDvarInt( "DisableExtinctionPurchasables" ) )
{
return false;
}
#/
if ( self alienscheckisupgradeenabled( itemRef ))
{
return true;
}
else
{
return false;
}
}
is_upgrade_purchased( itemRef )
{
//if the feature is not enabled return false
if ( !is_using_extinction_tokens( ) )
{
return false;
}
if ( self alienscheckisitempurchased( itemRef ))
{
return true;
}
else
{
return false;
}
}
//=======================================================
// CAREER STATS
//=======================================================
session_stats_init()
{
// store team total stats on playerdata on each player
self SetCoopPlayerData( "alienSession", "team_shots", 0 );
self SetCoopPlayerData( "alienSession", "team_kills", 0 );
self SetCoopPlayerData( "alienSession", "team_hives", 0 );
self SetCoopPlayerData( "alienSession", "downed", 0 );
self SetCoopPlayerData( "alienSession", "hivesDestroyed", 0 );
self SetCoopPlayerData( "alienSession", "prestigenerfs", 0 );
self SetCoopPlayerData( "alienSession", "repairs", 0 );
self SetCoopPlayerData( "alienSession", "drillPlants", 0 );
self SetCoopPlayerData( "alienSession", "deployables", 0 );
self SetCoopPlayerData( "alienSession", "challengesCompleted", 0 );
self SetCoopPlayerData( "alienSession", "challengesAttempted", 0 );
self SetCoopPlayerData( "alienSession", "trapKills", 0 );
self SetCoopPlayerData( "alienSession", "currencyTotal", 0 );
self SetCoopPlayerData( "alienSession", "currencySpent", 0 );
self SetCoopPlayerData( "alienSession", "escapedRank0", 0 );
self SetCoopPlayerData( "alienSession", "escapedRank1", 0 );
self SetCoopPlayerData( "alienSession", "escapedRank2", 0 );
self SetCoopPlayerData( "alienSession", "escapedRank3", 0 );
self SetCoopPlayerData( "alienSession", "kills", 0 );
self SetCoopPlayerData( "alienSession", "revives", 0 );
self SetCoopPlayerData( "alienSession", "time", 0 );
self SetCoopPlayerData( "alienSession", "score", 0 );
self SetCoopPlayerData( "alienSession", "shots", 0 ); //Used to track tokens awarded
self SetCoopPlayerData( "alienSession", "last_stand_count", 0 );
// "deaths", "headShots", "hits" and "shots" are not used by the game mode. Init them here so each level can use them for
// level-specific purpose
self SetCoopPlayerData( "alienSession", "deaths", 0 );
self SetCoopPlayerData( "alienSession", "headShots", 0 );
self SetCoopPlayerData( "alienSession", "hits", 0 );
self thread weapons_tracking_init();
self thread resource_tracking_init();
self thread eog_player_tracking_init();
}
// ============== tracking end of game stats ================
eog_player_tracking_init()
{
// self is connecting player
// wait till level.players are populated on game start
wait 0.5;
// "available stats: eog_player_0, eog_player_1, eog_player_2, eog_player_3"
// ============ write connecting player's initial values into everyone's playerdata ============
player_ref = self get_player_ref();
foreach ( player in level.players )
{
/#
if ( getDvar( "alien_debug_eog" ) == "1" )
iprintln( "^6[EOG STAT] " + player_ref + " updated for " + " player_" + player GetEntityNumber() );
#/
// reset data
player reset_EoG_stats( player_ref );
// init name
player_name = "unknownPlayer";
if ( isdefined( self.name ) )
player_name = self.name;
if ( !level.console )
{
player_name = GetSubStr( player_name, 0, 19 );
}
else
{
if ( have_clan_tag( player_name ) )
player_name = remove_clan_tag( player_name );
}
player setcoopplayerdata( player_ref, "name", player_name );
}
// a barrier between script's level.players indexing and getEntityNumber() index
players_eog_updated = [ false, false, false, false ]; // player entity numbers: 0, 1, 2, 3
// connecting player grabs other in-game player's EoG stats
foreach ( p in level.players )
{
players_eog_updated[ int( p GetEntityNumber() ) ] = true;
// skip self
if ( p == self )
continue;
player_ref = p get_player_ref();
/#
if ( getDvar( "alien_debug_eog" ) == "1" )
iprintln( "^6[EOG STAT] player_" + self GetEntityNumber() + " grabbed " + player_ref );
#/
name = p getcoopplayerdata( player_ref, "name" );
kills = p getcoopplayerdata( player_ref, "kills" );
score = p getcoopplayerdata( player_ref, "score" );
assists = p getcoopplayerdata( player_ref, "assists" );
revives = p getcoopplayerdata( player_ref, "revives" );
drillrestarts = p getcoopplayerdata( player_ref, "drillrestarts" );
drillplants = p getcoopplayerdata( player_ref, "drillplants" );
downs = p getcoopplayerdata( player_ref, "downs" );
deaths = p getcoopplayerdata( player_ref, "deaths" );
hivesdestroyed = p getcoopplayerdata( player_ref, "hivesdestroyed" );
currency = p getcoopplayerdata( player_ref, "currency" );
currencyspent = p getcoopplayerdata( player_ref, "currencyspent" );
currencytotal = p getcoopplayerdata( player_ref, "currencytotal" );
traps = p getcoopplayerdata( player_ref, "traps" );
deployables = p getcoopplayerdata( player_ref, "deployables" );
deployablesused = p getcoopplayerdata( player_ref, "deployablesused" );
self setcoopplayerdata( player_ref, "name", name );
self setcoopplayerdata( player_ref, "kills", kills );
self setcoopplayerdata( player_ref, "score", score );
self setcoopplayerdata( player_ref, "assists", assists );
self setcoopplayerdata( player_ref, "revives", revives );
self setcoopplayerdata( player_ref, "drillrestarts", drillrestarts );
self setcoopplayerdata( player_ref, "drillplants", drillplants );
self setcoopplayerdata( player_ref, "downs", downs );
self setcoopplayerdata( player_ref, "deaths", deaths );
self setcoopplayerdata( player_ref, "hivesdestroyed", hivesdestroyed );
self setcoopplayerdata( player_ref, "currency", currency );
self setcoopplayerdata( player_ref, "currencyspent", currencyspent );
self setcoopplayerdata( player_ref, "currencytotal", currencytotal );
self setcoopplayerdata( player_ref, "traps", traps );
self setcoopplayerdata( player_ref, "deployables", deployables );
self setcoopplayerdata( player_ref, "deployablesused", deployablesused );
}
// connecting player erases old EoG stats that current in-game players have not replaced
foreach ( index, result in players_eog_updated )
{
// reset
if ( !result )
{
/#
if ( getDvar( "alien_debug_eog" ) == "1" )
iprintln( "^6[EOG STAT] player_" + self GetEntityNumber() + " reset EoGPlayer" + index );
#/
self reset_EoG_stats( "EoGPlayer" + index );
}
}
}
reset_EoG_stats( EoGPlayer_ref )
{
self setcoopplayerdata( EoGPlayer_ref, "name", "" );
self setcoopplayerdata( EoGPlayer_ref, "kills", 0 );
self setcoopplayerdata( EoGPlayer_ref, "score", 0 );
self setcoopplayerdata( EoGPlayer_ref, "assists", 0 );
self setcoopplayerdata( EoGPlayer_ref, "revives", 0 );
self setcoopplayerdata( EoGPlayer_ref, "drillrestarts", 0 );
self setcoopplayerdata( EoGPlayer_ref, "drillplants", 0 );
self setcoopplayerdata( EoGPlayer_ref, "downs", 0 );
self setcoopplayerdata( EoGPlayer_ref, "deaths", 0 );
self setcoopplayerdata( EoGPlayer_ref, "hivesdestroyed", 0 );
self setcoopplayerdata( EoGPlayer_ref, "currency", 0 );
self setcoopplayerdata( EoGPlayer_ref, "currencyspent", 0 );
self setcoopplayerdata( EoGPlayer_ref, "currencytotal", 0 );
self setcoopplayerdata( EoGPlayer_ref, "traps", 0 );
self setcoopplayerdata( EoGPlayer_ref, "deployables", 0 );
self setcoopplayerdata( EoGPlayer_ref, "deployablesused", 0 );
}
eog_player_update_stat( stat_ref, amount, override_value )
{
// self is player
player_ref = get_player_ref();
new_amount = amount;
if ( !isdefined( override_value ) || !override_value )
{
old_amount = self GetCoopPlayerData( player_ref, stat_ref );
new_amount = int( old_amount ) + int( amount );
}
try_update_LB_playerdata( stat_ref, new_amount, true );
setcoopplayerdata_for_everyone( player_ref, stat_ref, new_amount );
}
try_update_LB_playerdata( EoG_ref, new_amount, override_value )
{
LB_ref = get_mapped_LB_ref_from_EoG_ref( EoG_ref );
if ( !isDefined( LB_ref ) )
return;
LB_player_update_stat( LB_ref, new_amount, override_value );
}
LB_player_update_stat( alienSession_ref, amount, override_value )
{
if( is_true( override_value ) )
{
new_value = amount;
}
else
{
old_value = self GetCoopPlayerData( "alienSession", alienSession_ref );
new_value = old_value + amount;
}
self SetCoopPlayerData( "alienSession", alienSession_ref, new_value );
}
// ============== tracking weapon career ================
weapons_tracking_init()
{
// called after level.collectibles is setup
assertex( isdefined( level.collectibles ), "level.collectibles not yet setup" );
self.persistence_weaponstats = [];
foreach ( weapon_ref, item in level.collectibles )
{
if ( StrTok( weapon_ref, "_" )[0] == "weapon" )
{
base_weapon = get_base_weapon_name( weapon_ref );
self.persistence_weaponstats[ base_weapon ] = true;
// reset session stat values
//self thread weaponstats_reset( "weaponStatsSession", base_weapon );
}
}
self thread player_weaponstats_track_shots();
}
// removes "weapon_" and removes any string after "_mp"
get_base_weapon_name( weapon_ref )
{
base_weapon = "";
tokenized = StrTok( weapon_ref, "_" );
for( i = 0; i < tokenized.size; i++ )
{
token = tokenized[ i ];
if ( token == "weapon" && i == 0 )
continue;
if ( token == "mp" )
{
base_weapon += "mp";
break;
}
if ( i < tokenized.size - 1 )
{
base_weapon += token + "_";
}
else
{
base_weapon += token;
break;
}
}
if ( base_weapon == "" )
return "none";
return base_weapon;
}
// resets tracking values to 0
weaponstats_reset( stat_type, weapon_ref )
{
// hits
self setcoopplayerdata( stat_type, weapon_ref, "hits", 0 );
// shots
self setcoopplayerdata( stat_type, weapon_ref, "shots", 0 );
// kills
self setcoopplayerdata( stat_type, weapon_ref, "kills", 0 );
}
// track hits
update_weaponstats_hits( weapon_ref, hits, sMeansOfDeath )
{
/#
maps\mp\alien\_debug::debug_print_weapon_hits( weapon_ref, sMeansOfDeath );
#/
if ( !is_valid_weapon_hit( weapon_ref, sMeansOfDeath ) )
return;
assertex( isdefined( hits ) && hits >= 0, "value not accepted as hits for weapon stats tracking" );
self update_weaponstats( "weaponStats", weapon_ref, "hits", hits );
//self update_weaponstats( "weaponStatsSession", weapon_ref, "hits", hits );
self maps\mp\alien\_gamescore::update_personal_encounter_performance( maps\mp\alien\_gamescore::get_personal_score_component_name(), "shots_hit", hits );
}
is_valid_weapon_hit( weapon_ref, sMeansOfDeath )
{
if ( weapon_ref == "none" ) // things like electric fence and fire trap
return false;
if ( sMeansOfDeath == "MOD_MELEE" )
return false;
// If the weapon does not send an "weapon_fired" notify on firing, we cannot track its firing. Thus, we should not track its
// hits either
if ( no_weapon_fired_notify( weapon_ref ) )
return false;
return true;
}
no_weapon_fired_notify( weapon_ref )
{
switch( weapon_ref )
{
case "turret_minigun_alien": // manned turret
case "alien_manned_gl_turret_mp": // grenade turret
case "alien_manned_gl_turret1_mp": // grenade turret
case "alien_manned_gl_turret2_mp": // grenade turret
case "alien_manned_gl_turret3_mp": // grenade turret
case "alien_manned_gl_turret4_mp": // grenade turret
case "alien_manned_minigun_turret_mp": // portable minigun turret
case "alien_manned_minigun_turret1_mp": // portable minigun turret
case "alien_manned_minigun_turret2_mp": // portable minigun turret
case "alien_manned_minigun_turret3_mp": // portable minigun turret
case "alien_manned_minigun_turret4_mp": // portable minigun turret
case "switchblade_rocket_mp": // switchblade missile
case "alienmortar_strike_mp": // mortar strike
case "aliensemtex_mp": // semtex grenade
case "alien_sentry_minigun_1_mp": // sentry gun
case "alien_sentry_minigun_2_mp": // sentry gun
case "alien_sentry_minigun_3_mp": // sentry gun
case "alien_sentry_minigun_4_mp": // sentry gun
case "aliensoflam_missle_mp": // SOFLAM
case "alienthrowingknife_mp": // pet bomb
case "alienims_projectile_mp": // IMS
case "alienclaymore_mp": // claymore
case "alienmortar_shell_mp": // mortar shell
case "alien_ball_drone_gun_mp": // ball drone
case "alien_ball_drone_gun1_mp": // ball drone
case "alien_ball_drone_gun2_mp": // ball drone
case "alien_ball_drone_gun3_mp": // ball drone
case "alien_ball_drone_gun4_mp": // ball drone
case "alienvulture_mp": // ball drone
case "alienbetty_mp": // bouncing betty
case "turret_minigun_alien_railgun":
case "turret_minigun_alien_grenade":
case "alientank_turret_mp":
case "alientank_rigger_turret_mp":
return true;
default:
return false;
}
}
// track shots
update_weaponstats_shots( weapon_ref, shots )
{
/#
maps\mp\alien\_debug::debug_print_weapon_shots( weapon_ref );
#/
assertex( isdefined( shots ) && shots >= 0, "value not accepted as shots for weapon stats tracking" );
if ( !self.should_track_weapon_fired )
return;
// black box data tracking
level.alienBBData[ "bullets_shot" ] += shots;
self update_weaponstats( "weaponStats", weapon_ref, "shots", shots );
//self update_weaponstats( "weaponStatsSession", weapon_ref, "shots", shots );
self maps\mp\alien\_gamescore::update_personal_encounter_performance( maps\mp\alien\_gamescore::get_personal_score_component_name(), "shots_fired", shots );
}
// track kills
update_weaponstats_kills( weapon_ref, kills )
{
assertex( isdefined( kills ) && kills >= 0, "value not accepted as kills for weapon stats tracking" );
self update_weaponstats( "weaponStats", weapon_ref, "kills", kills );
//self update_weaponstats( "weaponStatsSession", weapon_ref, "kills", kills );
}
// tracks stats raw
update_weaponstats( stat_type, weapon_ref, stat, value )
{
if ( !isplayer( self ) )
return;
// allow upgraded weapons to contribute to same base weapon stat
base_weapon = get_base_weapon_name( weapon_ref );
if ( !isdefined( base_weapon ) || !isdefined( self.persistence_weaponstats[ base_weapon ] ) )
return;
if(IsDefined(level.weapon_stats_override_name_func))
base_weapon = [[level.weapon_stats_override_name_func]](base_weapon);
// if(IsSubStr(base_weapon,"altalien"))
// {
// switch ( base_weapon )
// {
// case "iw6_altalienlsat_mp":
// base_weapon = "iw6_alienDLC12_mp";
// break;
// case "iw6_altaliensvu_mp":
// base_weapon = "iw6_alienDLC13_mp";
// break;
// case "iw6_altalienarx_mp":
// base_weapon = "iw6_alienDLC14_mp";
// break;
// case "iw6_altalienmaverick_mp":
// base_weapon = "iw6_alienDLC15_mp";
// break;
//
// default:
// break;
// }
// }
if(IsSubStr(base_weapon,"dlc"))
{
//replace "dlc" with "DLC" for getting player data
tokens = StrTok( base_weapon, "d" );
//tokens = iw6_alien, lc12_mp
base_weapon = tokens[ 0 ] + "DLC"; // + tokens[1];
tokens = StrTok( tokens[ 1 ], "c" );
//tokens = l,12_mp
base_weapon = base_weapon + tokens[ 1 ];
}
old_value = int( self getcoopplayerdata( stat_type, base_weapon, stat ) );
new_value = old_value + int( value );
self setcoopplayerdata( stat_type, base_weapon, stat, new_value );
}
player_weaponstats_track_shots()
{
self endon( "disconnect" );
self notify( "weaponstats_track_shots" );
self endon( "weaponstats_track_shots" );
while ( 1 )
{
self waittill ( "weapon_fired", weapon_ref );
if ( !isdefined( weapon_ref ) )
continue;
shotsFired = 1;
self update_weaponstats_shots( weapon_ref, shotsFired );
}
}
// ============== tracking combat resource purchases/upgrades ================
resource_tracking_init()
{
// reset all session resource data
foreach ( combat_resources in level.alien_combat_resources )
{
foreach ( resource, resource_struct in combat_resources )
{
self setcoopplayerdata( "resourceStatsSession", resource, "purchase", 0 );
self setcoopplayerdata( "resourceStatsSession", resource, "upgrade", 0 );
self setcoopplayerdata( "resourceStatsSession", resource, "used", 0 );
}
}
foreach ( perk in level.alien_perks[ "perk_0" ] )
{
self setcoopplayerdata( "resourceStatsSession", perk.ref, "purchase", 0 );
self setcoopplayerdata( "resourceStatsSession", perk.ref, "upgrade", 0 );
}
foreach ( perk in level.alien_perks[ "perk_1" ] )
{
self setcoopplayerdata( "resourceStatsSession", perk.ref, "purchase", 0 );
self setcoopplayerdata( "resourceStatsSession", perk.ref, "upgrade", 0 );
}
}
// combat resource purchases
update_resource_stats( track_type, resource, count )
{
if ( !isplayer( self ) )
return;
assertex( isdefined( resource ), "resource reference string invalid" );
self thread update_resource_stats_raw( "resourceStats", track_type, resource, count );
self thread update_resource_stats_raw( "resourceStatsSession", track_type, resource, count );
}
update_resource_stats_raw( stat_type, track_type, resource, count )
{
old_value = int( self getcoopplayerdata( stat_type, resource, track_type ) );
new_value = old_value + int( count );
self setcoopplayerdata( stat_type, resource, track_type, new_value );
}
//=======================================================
// XP/RANK/PRESTIGE
//=======================================================
// XP/Rank Table
RANK_TABLE = "mp/alien/rankTable.csv";
TABLE_ID = 0; // [int] Rank ID
TABLE_REF = 1; // [string] Rank Reference
TABLE_XP_MIN = 2; // [int] Min XP
TABLE_XP_NEXT = 3; // [int] XP to Next
TABLE_RANK_SHORT = 4; // [string] Short rank localized
TABLE_RANK_FULL = 5; // [string] Full rank localized
TABLE_ICON = 6; // [string] Rank icon
TABLE_XP_MAX = 7; // [int] Max XP
TABLE_WEAPON_UNLOCK = 8; //
TABLE_PERK_UNLOCK = 9; //
TABLE_CHALLENGE = 10; //
TABLE_CAMO = 11; //
TABLE_ATTACHMENT = 12; //
TABLE_LEVEL = 13; // [int] Rank number display
TABLE_DISPLAY_LEVEL = 14; //
TABLE_FEATURE_UNLOCK = 15; //
TABLE_RANK_INGAME = 16; // [string] In game rank localized
TABLE_UNLOCK_STRING = 17; //
TABLE_TOKEN_REWARD = 18; // [int] tokens awarded for completing the rank at prestige level 0;
// Populates data table entries into level array
rank_init()
{
// level.alien_perks_table can be used to override default table, should be set before _alien::main()
if ( !isdefined( level.alien_ranks_table ) )
level.alien_ranks_table = RANK_TABLE;
level.alien_ranks = [];
// max rank is defined in table
level.alien_max_rank = int( tablelookup( level.alien_ranks_table, TABLE_ID, "maxrank", TABLE_REF ) );
assertex( isdefined( level.alien_max_rank ) && level.alien_max_rank );
for ( i = 0; i <= level.alien_max_rank; i++ )
{
// break on end of line
rank_ref = get_ref_by_id( i );
if ( rank_ref == "" ) { break; }
if ( !isdefined( level.alien_ranks[ i ] ) )
{
rank = spawnstruct();
rank.id = i;
rank.ref = rank_ref;
rank.lvl = get_level_by_id( i );
rank.icon = get_icon_by_id( i );
rank.tokenReward = get_token_reward_by_id( i );
rank.xp = [];
rank.xp[ "min" ] = get_minxp_by_id( i );
rank.xp[ "next" ] = get_nextxp_by_id( i );
rank.xp[ "max" ] = get_maxxp_by_id( i );
rank.name = [];
rank.name[ "short" ] = get_shortrank_by_id( i );
rank.name[ "full" ] = get_fullrank_by_id( i );
rank.name[ "ingame" ] = get_ingamerank_by_id( i );
level.alien_ranks[ i ] = rank;
}
}
}
get_ref_by_id( id )
{
return tablelookup( level.alien_ranks_table, TABLE_ID, id, TABLE_REF );
}
get_minxp_by_id( id )
{
return int( tablelookup( level.alien_ranks_table, TABLE_ID, id, TABLE_XP_MIN ) );
}
get_maxxp_by_id( id )
{
return int( tablelookup( level.alien_ranks_table, TABLE_ID, id, TABLE_XP_MAX ) );
}
get_nextxp_by_id( id )
{
return int( tablelookup( level.alien_ranks_table, TABLE_ID, id, TABLE_XP_NEXT ) );
}
get_level_by_id( id )
{
return int( tablelookup( level.alien_ranks_table, TABLE_ID, id, TABLE_LEVEL ) );
}
get_shortrank_by_id( id )
{
return tablelookup( level.alien_ranks_table, TABLE_ID, id, TABLE_RANK_SHORT );
}
get_fullrank_by_id( id )
{
return tablelookup( level.alien_ranks_table, TABLE_ID, id, TABLE_RANK_FULL );
}
get_ingamerank_by_id( id )
{
return tablelookup( level.alien_ranks_table, TABLE_ID, id, TABLE_RANK_INGAME );
}
get_icon_by_id( id )
{
return tablelookup( level.alien_ranks_table, TABLE_ID, id, TABLE_ICON );
}
get_token_reward_by_id( id )
{
return int( tablelookup( level.alien_ranks_table, TABLE_ID, id, TABLE_TOKEN_REWARD ) );
}
// get player xp stats
get_player_rank() { return self getcoopplayerdata( "alienPlayerStats", "rank" ); }
get_player_xp() { return self getcoopplayerdata( "alienPlayerStats", "experience" ); }
get_player_prestige() { return self getcoopplayerdata( "alienPlayerStats", "prestige" ); }
get_player_escaped() { return self getcoopplayerdata( "alienPlayerStats", "escaped" ); }
get_player_kills() { return self getcoopplayerdata( "alienPlayerStats", "kills" ); }
get_player_revives() { return self getcoopplayerdata( "alienPlayerStats", "revives" ); }
get_player_highest_nerf_escape_count() { return self getcoopplayerdata( "alienPlayerStats", "headShots" ); }
// tracking session xp
get_player_session_xp()
{
return self getcoopplayerdata( "alienSession", "experience" );
}
set_player_session_xp( experience )
{
self setcoopplayerdata( "alienSession", "experience", experience );
}
give_player_session_xp( amount )
{
old_session_xp = self get_player_session_xp();
new_session_xp = amount + old_session_xp;
self set_player_session_xp( new_session_xp );
}
// tracking session tokens
get_player_session_tokens()
{
return self getcoopplayerdata( "alienSession", "shots" );
}
set_player_session_tokens( tokens )
{
self setcoopplayerdata( "alienSession", "shots", tokens );
}
give_player_session_tokens( amount )
{
old_session_tokens = self get_player_session_tokens();
new_session_tokens = amount + old_session_tokens;
self set_player_session_tokens( new_session_tokens );
}
// tracking how many times player ranked up in this session
set_player_session_rankup( ranked_up_times )
{
self setcoopplayerdata( "alienSession", "ranked_up", int( ranked_up_times ) );
}
get_player_session_rankup()
{
return self getcoopplayerdata( "alienSession", "ranked_up" );
}
update_player_session_rankup( ranked_up_times )
{
if ( !isdefined( ranked_up_times ) )
ranked_up_times = 1;
old_ranked_up_times = self get_player_session_rankup();
new_ranked_up_times = ranked_up_times + old_ranked_up_times;
self set_player_session_rankup( new_ranked_up_times );
}
// set player xp stats
set_player_rank( rank )
{
self setcoopplayerdata( "alienPlayerStats", "rank", rank );
}
set_player_xp( xp )
{
self setcoopplayerdata( "alienPlayerStats", "experience", xp );
// updates TEMP HUD
//self maps\mp\alien\_hud::update_player_xp_display( 0.05 );
}
set_player_kills()
{
old_kills = get_player_kills();
new_kills = old_kills + 1;
self setcoopplayerdata( "alienPlayerStats", "kills", new_kills );
}
set_player_revives()
{
old_revives = get_player_revives();
new_revives = old_revives + 1;
self setcoopplayerdata( "alienPlayerStats", "revives", new_revives );
}
set_player_escaped()
{
old_escaped = get_player_escaped();
new_escaped = old_escaped + 1;
self setcoopplayerdata( "alienPlayerStats", "escaped", new_escaped );
}
// WARNING: this should not be called in game anyways, only for testing.
set_player_prestige( prestige )
{
self setcoopplayerdata( "alienPlayerStats", "prestige", prestige );
// reset rank and xp
self setcoopplayerdata( "alienPlayerStats", "experience", 0 );
self setcoopplayerdata( "alienPlayerStats", "rank", 0 );
}
// validates if rank meets xp requirements
get_rank_by_xp( xp )
{
rank = 0;
for ( i = 0; i < level.alien_ranks.size; i++ )
{
if ( xp >= level.alien_ranks[ i ].xp[ "min" ] )
{
if ( xp < level.alien_ranks[ i ].xp[ "max" ] )
{
rank = level.alien_ranks[ i ].id;
break;
}
}
}
return ( rank );
}
get_scaled_xp( xp )
{
if( is_chaos_mode() ) //scale down xp in chaos mode only
xp = int( 0.66 * xp );
return int( xp * level.xpScale );
}
wait_and_give_player_xp( xp, waitTime )
{
self endon( "disconnect" );
level endon( "game_ended" );
wait waitTime;
give_player_xp( xp );
}
give_player_xp( xp )
{
xp = get_scaled_xp( xp ); // double xp day, etc
// JohnW: HACK to fix an xp progression blocker. We will fix this properly after DLC1 ships.
if ( xp > 90000 )
{
xp = 90000;
}
// record xp for session
self thread give_player_session_xp( xp );
at_max_rank = false;
old_rank = self get_player_rank(); // get old rank for rank check later
old_xp = self get_player_xp(); // get old xp for addition of xp
old_prestige = self GetCoopPlayerData( "alienPlayerStats", "prestige" );
//Fix for DLC 4 TU because we were capping at prestige 20 and rank 31
if ( ( old_prestige == 5 || old_prestige == 10 || old_prestige == 15 || old_prestige == 20 ) && old_xp >= level.alien_ranks[ 29 ].xp[ "max" ] )
{
old_xp = level.alien_ranks[ 29 ].xp[ "max" ] - 1;
old_rank = 29;
}
new_xp = old_xp + xp;
new_prestige = 0;
/#
if ( getDvar( "alien_debug_xp" ) == "1" )
IPrintLn( "+" + xp + "xp [" + new_xp + "]" );
#/
// set new xp
self set_player_xp( new_xp ); // set new xp
// did player level up?
new_rank = self get_rank_by_xp( new_xp ); // get new rank
if ( new_rank > old_rank ) // is new rank higher than old rank
{
if ( new_rank == level.alien_max_rank )
{
prestige = self GetCoopPlayerData( "alienPlayerStats", "prestige" );
new_prestige = prestige;
if ( prestige < MAX_PRESTIGE )
{
set_player_prestige( prestige + 1 );
new_prestige = prestige + 1;
give_player_tokens( 1, true );
}
else //player is at MAX_PRESTIGE and Max Rank (31)
{
at_max_rank = true;
self set_player_rank( new_rank );
}
}
else
{
self set_player_rank( new_rank ); // set new rank
}
if ( at_max_rank == false )
{
if ( new_rank == 30 )
display_rank = 1;
else
display_rank = new_rank + 1;
self setclientomnvar ( "ui_alien_rankup", display_rank ); // display rank up notification via LUA
self notify( "ranked_up", new_rank ); // notify for any splash or blah
self update_player_session_rankup(); // track number of times player ranked
/# if ( getDvar( "alien_debug_xp" ) == "1" )
IPrintLnbold( "Ranked up: Lv." + new_rank + " [XP: " + new_xp + "]" );
#/
self award_rank_up_tokens( old_rank );
}
// let's tell the game to send this info to everybody else
self SetRank( self get_player_rank(), self get_player_prestige() );
}
}
inc_stat( ref_name, stat_name, value )
{
old_value = self getcoopplayerdata( ref_name, stat_name );
new_value = old_value + value;
self setcoopplayerdata( ref_name, stat_name, new_value );
}
inc_session_stat( stat_name, value )
{
inc_stat( "alienSession", stat_name, value );
}
get_hives_destroyed_stat()
{
return get_alienSession_stat( "hivesDestroyed" );
}
get_alienSession_stat( field )
{
return ( self getcoopplayerdata( "alienSession", field ) );
}
set_alienSession_stat( field, value )
{
self setcoopplayerdata( "alienSession", field, value );
}
//=======================================================
// BLACK BOX DATA TRACKING
//=======================================================
BBData_init()
{
level.alienBBData = [];
level.alienBBData[ "times_downed" ] = 0; //
level.alienBBData[ "times_died" ] = 0; //
level.alienBBData[ "times_drill_stuck" ] = 0; //
level.alienBBData[ "aliens_killed" ] = 0; //
level.alienBBData[ "team_item_deployed" ] = 0; //
level.alienBBData[ "team_item_used" ] = 0; //
level.alienBBData[ "bullets_shot" ] = 0; //
level.alienBBData[ "damage_taken" ] = 0; //
level.alienBBData[ "damage_done" ] = 0; //
level.alienBBData[ "traps_used" ] = 0; //
level notify( "BBData_initialized" );
}
deployablebox_used_track( boxEnt )
{
// self is user
// track usage
itemname = boxEnt.boxType;
if ( isdefined( boxEnt.dpadName ) )
itemname = boxEnt.dpadName;
self thread maps\mp\alien\_persistence::update_resource_stats( "used", itemname, 1 );
self maps\mp\alien\_gamescore::update_personal_encounter_performance( maps\mp\alien\_gamescore::get_team_score_component_name(), "team_support_deploy" );
// black box data trcking
level.alienBBData[ "team_item_used" ]++;
self eog_player_update_stat( "deployablesused", 1 );
username = "";
if ( isdefined( self.name ) )
username = self.name;
/#
if ( GetDvarInt( "alien_bbprint_debug" ) > 0 )
{
IPrintLnBold( "^8bbprint: aliendeployableused \n" +
" itemname=" + itemname +
" itemlevel=" + boxEnt.upgrade_rank +
" itemx,y,z=" + boxEnt.origin +
" username=" + username );
}
#/
bbprint( "aliendeployableused",
"itemname %s itemlevel %i itemx %f itemy %f itemz %f username %s ",
boxEnt.boxType,
boxEnt.upgrade_rank,
boxEnt.origin[0],
boxEnt.origin[1],
boxEnt.origin[2],
username );
}
get_player_ref()
{
return ( "EoGPlayer" + ( self GetEntityNumber() ) );
}
update_LB_alienSession_challenge( challenge_succeed )
{
foreach ( player in level.players )
{
player LB_player_update_stat( "challengesAttempted", 1 );
if ( challenge_succeed )
player LB_player_update_stat( "challengesCompleted", 1 );
}
}
update_LB_alienSession_escape( players_escaped, escape_time_remains )
{
LB_escape_rank = get_LB_escape_rank( escape_time_remains );
foreach( player in players_escaped )
{
player LB_player_update_stat( "escapedRank" + LB_escape_rank, 1, true );
player LB_player_update_stat( "hits", 1, true ); // We are using player session data "hits" to indicate that player successfully escapes from Point of Contact
}
}
update_alien_kill_sessionStats( eInflictor, eAttacker )
{
if ( !isDefined( eAttacker ) || !isPlayer( eAttacker ) )
return;
if ( maps\mp\alien\_utility::is_trap( eInflictor ) )
eAttacker LB_player_update_stat( "trapKills", 1 );
}
register_LB_escape_rank( escape_rank_array )
{
level.escape_rank_array = escape_rank_array;
}
get_LB_escape_rank( escape_time_remains )
{
for ( i = 0; i < level.escape_rank_array.size - 1; i++ )
{
if ( escape_time_remains >= level.escape_rank_array[ i ] && escape_time_remains < level.escape_rank_array[ i+1 ] )
return i;
}
}
have_clan_tag( player_name )
{
return ( IsSubStr( player_name, "[" ) && IsSubStr( player_name, "]" ) );
}
remove_clan_tag( player_name )
{
name_tokenized = StrToK( player_name, "]" );
return name_tokenized[1];
}
register_EoG_to_LB_playerdata_mapping()
{
// In playerdata, some fields in alienSession are tracking the same data as fields in EoGPlayer. The mapping below
// allow us to update LB playerdata when EoGPlayer data is updated.
alienSession_to_EoG_mapping = [];
// EoGPlayer field name LB field name ( both field names need to match playerdata )
EoG_to_LB_playerdata_mapping[ "kills" ] = "kills";
EoG_to_LB_playerdata_mapping[ "deployables" ] = "deployables";
EoG_to_LB_playerdata_mapping[ "drillplants" ] = "drillPlants";
EoG_to_LB_playerdata_mapping[ "revives" ] = "revives";
EoG_to_LB_playerdata_mapping[ "downs" ] = "downed";
EoG_to_LB_playerdata_mapping[ "drillrestarts" ] = "repairs";
EoG_to_LB_playerdata_mapping[ "score" ] = "score";
EoG_to_LB_playerdata_mapping[ "currencyspent" ] = "currencySpent";
EoG_to_LB_playerdata_mapping[ "currencytotal" ] = "currencyTotal";
EoG_to_LB_playerdata_mapping[ "hivesdestroyed" ] = "hivesDestroyed";
level.EoG_to_LB_playerdata_mapping = EoG_to_LB_playerdata_mapping;
}
get_mapped_LB_ref_from_EoG_ref( EoG_ref )
{
return level.EoG_to_LB_playerdata_mapping[ EoG_ref ];
}
play_time_monitor()
{
self endon( "disconnect" );
while ( true )
{
wait ( 1 );
self LB_player_update_stat( "time", 1 );
}
}