boiii-scripts/shared/scoreevents_shared.gsc
2023-04-13 17:30:38 +02:00

409 lines
15 KiB
Plaintext

#using scripts\codescripts\struct;
#using scripts\shared\callbacks_shared;
#using scripts\shared\killstreaks_shared;
#using scripts\shared\system_shared;
#using scripts\shared\util_shared;
#using scripts\shared\abilities\_ability_power;
#using scripts\shared\gameskill_shared;
#namespace scoreevents;
function processScoreEvent( event, player, victim, weapon )
{
pixbeginevent("processScoreEvent");
scoreGiven = 0;
if ( !isplayer(player) )
{
AssertMsg("processScoreEvent called on non player entity: " + event );
return scoreGiven;
}
if( GetDvarInt( "teamOpsEnabled" ) == 1 )
{
if ( isdefined( level.teamopsOnProcessPlayerEvent ) )
{
level [[level.teamopsOnProcessPlayerEvent]]( event, player );
}
}
if ( isdefined( level.challengesOnEventReceived ) )
{
player thread [[level.challengesOnEventReceived]]( event );
}
if ( isRegisteredEvent( event ) && (!SessionModeIsZombiesGame() || level.onlineGame) )
{
allowPlayerScore = false;
if ( !isdefined( weapon ) || !killstreaks::is_killstreak_weapon( weapon ) )
{
allowPlayerScore = true;
}
else
{
allowPlayerScore = killstreakWeaponsAllowedScore( event );
}
if ( allowPlayerScore )
{
if ( isdefined( level.scoreOnGivePlayerScore ) )
{
scoreGiven = [[level.scoreOnGivePlayerScore]]( event, player, victim, undefined, weapon );
isScoreEvent = ( scoreGiven > 0 );
if ( isScoreEvent )
{
hero_restricted = is_hero_score_event_restricted( event );
player ability_power::power_gain_event_score( victim, scoreGiven, weapon, hero_restricted );
}
}
}
}
if ( shouldAddRankXP( player ) && ( GetDvarInt( "teamOpsEnabled" ) == 0 ) )
{
pickedup = false;
if( isdefined( weapon) && isdefined( player.pickedUpWeapons ) && isdefined( player.pickedUpWeapons[weapon] ) )
{
pickedup = true;
}
// In CP, the player earns an XP multiplier by playing on harder difficulties.
if (SessionModeIsCampaignGame())
{
// Determine game difficulty. Player receives an XP multiplier for harder difficulties.
xp_difficulty_multiplier = player gameskill::get_player_xp_difficulty_multiplier();
}
else
{
// No multiplier if not in CP.
xp_difficulty_multiplier = 1;
}
player AddRankXp( event, weapon, player.class_num, pickedup, isScoreEvent, xp_difficulty_multiplier );
}
pixendevent();
// In campaign, use the same difficulty modifier and apply it to the player's score for killing enemies.
if (SessionModeIsCampaignGame() && isdefined(xp_difficulty_multiplier))
{
// Only apply a score multiplier if we killed an enemy.
if (isdefined(victim) && isdefined(victim.team))
{
if (victim.team == "axis" || victim.team == "team3")
{
scoreGiven *= xp_difficulty_multiplier;
}
}
}
return scoreGiven;
}
function shouldAddRankXP( player )
{
if( ( SessionModeIsCampaignZombiesGame() ) )
{
return false;
}
if( level.gametype == "fr" )
{
return false;
}
if ( !isdefined( level.rankCap ) || level.rankCap == 0 )
{
return true;
}
if ( ( player.pers[ "plevel" ] > 0 ) || ( player.pers[ "rank" ] > level.rankCap ) )
{
return false;
}
return true;
}
function uninterruptedObitFeedKills( attacker, weapon )
{
self endon( "disconnect" );
wait .1;
util::WaitTillSlowProcessAllowed();
wait .1;
scoreevents::processScoreEvent( "uninterrupted_obit_feed_kills", attacker, self, weapon );
}
function isRegisteredEvent( type )
{
if ( isdefined( level.scoreInfo[type] ) )
return true;
else
return false;
}
function decrementLastObituaryPlayerCountAfterFade()
{
level endon( "reset_obituary_count" );
wait( 5 );
level.lastObituaryPlayerCount--;
assert( level.lastObituaryPlayerCount >= 0 );
}
function getScoreEventTableName()
{
if ( SessionModeIsCampaignGame() )
{
return "gamedata/tables/cp/scoreInfo.csv";
}
else if ( SessionModeIsZombiesGame() )
{
return "gamedata/tables/zm/scoreInfo.csv";
}
else
{
return "gamedata/tables/mp/scoreInfo.csv";
}
}
function getScoreEventTableID()
{
scoreInfoTableLoaded = false;
scoreInfoTableID = TableLookupFindCoreAsset( getScoreEventTableName() );
if ( isdefined( scoreInfoTableID ) )
{
scoreInfoTableLoaded = true;
}
assert( scoreInfoTableLoaded, "Score Event Table is not loaded: " + getScoreEventTableName() );
return scoreInfoTableID;
}
function getScoreEventColumn( gameType )
{
columnOffset = getColumnOffsetForGametype( gameType );
assert( columnOffset >= 0 );
if ( columnOffset >= 0 )
{
columnOffset += 0;
}
return columnOffset;
}
function getXPEventColumn( gameType )
{
columnOffset = getColumnOffsetForGametype( gameType );
assert( columnOffset >= 0 );
if ( columnOffset >= 0 )
{
columnOffset += 1;
}
return columnOffset;
}
function getColumnOffsetForGametype( gameType )
{
foundGameMode = false;
if ( !isdefined ( level.scoreEventTableID ) )
{
level.scoreEventTableID = getScoreEventTableID();
}
assert( isdefined ( level.scoreEventTableID ) );
if ( !isdefined ( level.scoreEventTableID ) )
{
return -1;
}
for ( gameModeColumn = 14; ; gameModeColumn += 2 )
{
column_header = TableLookupColumnForRow( level.scoreEventTableID, 0, gameModeColumn );
if ( column_header == "" )
{
gameModeColumn = 14;
break;
}
if ( column_header == level.gameType + " score" )
{
foundGameMode = true;
break;
}
}
assert( foundGameMode, "Could not find gamemode in scoreInfo.csv:" + gameType );
return gameModeColumn;
}
function killstreakWeaponsAllowedScore( type )
{
if( GetDvarInt( "teamOpsEnabled" ) == 1 )
return false;
if( isdefined( level.scoreInfo[type]["allowKillstreakWeapons"] ) && level.scoreInfo[type]["allowKillstreakWeapons"] == true )
{
return true;
}
else
{
return false;
}
}
function is_hero_score_event_restricted( event )
{
if( !isdefined( level.scoreInfo[event]["allow_hero"] ) || level.scoreInfo[event]["allow_hero"] != true )
{
return true;
}
return false;
}
function giveCrateCaptureMedal( crate, capturer )
{
if ( isdefined( crate ) && isdefined( capturer ) && isdefined( crate.owner ) && isplayer( crate.owner ) )
{
if ( level.teambased )
{
if ( capturer.team != crate.owner.team )
{
crate.owner playlocalsound( "mpl_crate_enemy_steals" );
// don't give a medal for capturing a booby trapped crate
if( !IsDefined( crate.hacker ) )
{
scoreevents::processScoreEvent( "capture_enemy_crate", capturer );
}
}
else
{
if ( isdefined ( crate.owner ) && ( capturer != crate.owner ) )
{
crate.owner playlocalsound( "mpl_crate_friendly_steals" );
// don't give a medal for capturing a booby trapped crate
if( !IsDefined( crate.hacker ) )
{
level.globalSharePackages++;
scoreevents::processScoreEvent( "share_care_package", crate.owner );
}
}
}
}
else
{
if ( capturer != crate.owner )
{
crate.owner playlocalsound( "mpl_crate_enemy_steals" );
// don't give a medal for capturing a booby trapped crate
if( !IsDefined( crate.hacker ) )
{
scoreevents::processScoreEvent( "capture_enemy_crate", capturer );
}
}
}
}
}
function register_hero_ability_kill_event( event_func )
{
if ( !isdefined( level.hero_ability_kill_events ) )
level.hero_ability_kill_events = [];
level.hero_ability_kill_events[ level.hero_ability_kill_events.size ] = event_func;
}
function register_hero_ability_multikill_event( event_func )
{
if ( !isdefined( level.hero_ability_multikill_events ) )
level.hero_ability_multikill_events = [];
level.hero_ability_multikill_events[ level.hero_ability_multikill_events.size ] = event_func;
}
function register_hero_weapon_multikill_event( event_func )
{
if ( !isdefined( level.hero_weapon_multikill_events ) )
level.hero_weapon_multikill_events = [];
level.hero_weapon_multikill_events[ level.hero_weapon_multikill_events.size ] = event_func;
}
function register_thief_shutdown_enemy_event( event_func )
{
if ( !isdefined( level.thief_shutdown_enemy_events ) )
level.thief_shutdown_enemy_events = [];
level.thief_shutdown_enemy_events[ level.thief_shutdown_enemy_events.size ] = event_func;
}
function hero_ability_kill_event( ability, victim_ability )
{
if ( !isdefined( level.hero_ability_kill_events ) )
return;
foreach( event_func in level.hero_ability_kill_events )
{
if ( isdefined( event_func ) )
{
self [[ event_func ]]( ability, victim_ability );
}
}
}
function hero_ability_multikill_event( killcount, ability )
{
if ( !isdefined( level.hero_ability_multikill_events ) )
return;
foreach( event_func in level.hero_ability_multikill_events )
{
if ( isdefined( event_func ) )
{
self [[ event_func ]]( killcount, ability );
}
}
}
function hero_weapon_multikill_event( killcount, weapon )
{
if ( !isdefined( level.hero_weapon_multikill_events ) )
return;
foreach( event_func in level.hero_weapon_multikill_events )
{
if ( isdefined( event_func ) )
{
self [[ event_func ]]( killcount, weapon );
}
}
}
function thief_shutdown_enemy_event()
{
if ( !isdefined( level.thief_shutdown_enemy_event ) )
return;
foreach( event_func in level.thief_shutdown_enemy_event )
{
if ( isdefined( event_func ) )
{
self [[ event_func ]]();
}
}
}