untyped global function Sv_EarnMeterMP_Init global function EarnMeterMP_SetTitanLoadout global function EarnMeterMP_SetPassiveMeterGainEnabled struct { float playingStartTime bool passiveMeterGainEnabled = true } file void function Sv_EarnMeterMP_Init() { if ( !EARNMETER_ENABLED ) return AddCallback_OnClientConnected( SetupPlayerEarnMeter ) AddCallback_GameStateEnter( eGameState.Playing, OnPlaying ) // can't change boost after prematch AddCallback_OnPlayerRespawned( OnPlayerRespawned ) } void function EarnMeterMP_SetTitanLoadout( entity player ) { if ( EarnMeterMP_IsTitanEarnGametype() ) PlayerEarnMeter_SetGoal( player, EarnObject_GetByRef( GetTitanLoadoutForPlayer( player ).titanClass ) ) else PlayerEarnMeter_SetGoal( player, EarnObject_GetByRef( GetSelectedBurncardRefFromWeaponOrPlayer( null, player ) ) ) } void function EarnMeterMP_SetPassiveMeterGainEnabled( bool enabled ) { file.passiveMeterGainEnabled = enabled } void function SetupPlayerEarnMeter( entity player ) { PlayerEarnMeter_Reset( player ) if ( Riff_BoostAvailability() != eBoostAvailability.Disabled ) { string burncardRef = GetSelectedBurncardRefFromWeaponOrPlayer( null, player ) PlayerEarnMeter_SetReward( player, EarnObject_GetByRef( burncardRef ) ) // pretty sure this works? PlayerEarnMeter_SetRewardFrac( player, BurnReward_GetByRef( burncardRef ).cost ) PlayerEarnMeter_EnableReward( player ) } if ( EarnMeterMP_IsTitanEarnGametype() ) { PlayerEarnMeter_SetGoal( player, EarnObject_GetByRef( GetTitanLoadoutForPlayer( player ).titanClass ) ) PlayerEarnMeter_EnableGoal( player ) // prevents goalstate from being set incorrectly } else PlayerEarnMeter_SetGoal( player, EarnObject_GetByRef( GetSelectedBurncardRefFromWeaponOrPlayer( null, player ) ) ) // catchup bonus for late joiners // todo: maths on this is fine but for some reason it won't set correctly, could be getting reset somewhere? PlayerEarnMeter_AddOwnedFrac( player, ( ( Time() - file.playingStartTime ) / 4.0 ) * 0.01 ) } void function OnPlaying() { file.playingStartTime = Time() foreach ( entity player in GetPlayerArray() ) SetupPlayerEarnMeter( player ) if ( Riff_BoostAvailability() != eBoostAvailability.Disabled ) SetCallback_EarnMeterRewardEarned( EarnMeterMP_BoostEarned ) // do this in playing so that gamemodes/maps can disable and this'll take affect if ( EarnMeterMP_IsTitanEarnGametype() ) // settitanavailable when earnmeter full { Riff_ForceTitanAvailability( eTitanAvailability.Custom ) // doesn't seem to affect anything aside from preventing some annoying client stuff svGlobal.titanAvailabilityCheck = IsTitanAvailable } SetCallback_EarnMeterGoalEarned( EarnMeterMP_TitanEarned ) } void function OnPlayerRespawned( entity player ) { thread EarnMeterMP_PlayerLifeThink( player ) if ( PlayerEarnMeter_IsRewardAvailable( player ) ) EarnMeterMP_BoostEarned( player ) } void function EarnMeterMP_PlayerLifeThink( entity player ) { player.EndSignal( "OnDeath" ) player.EndSignal( "OnDestroy" ) int lastEarnMeterMode = PlayerEarnMeter_GetMode( player ) float lastPassiveGainTime = Time() while ( true ) { int desiredEarnMeterMode if ( player.IsTitan() ) { entity soul = player.GetTitanSoul() if ( SoulTitanCore_GetExpireTime( soul ) > Time() ) desiredEarnMeterMode = eEarnMeterMode.CORE_ACTIVE else desiredEarnMeterMode = eEarnMeterMode.CORE } else if ( IsValid( player.GetPetTitan() ) ) desiredEarnMeterMode = eEarnMeterMode.PET else desiredEarnMeterMode = eEarnMeterMode.DEFAULT if ( desiredEarnMeterMode != lastEarnMeterMode ) { PlayerEarnMeter_SetMode( player, desiredEarnMeterMode ) if ( desiredEarnMeterMode == eEarnMeterMode.DEFAULT ) { if ( !IsTitanAvailable( player ) && PlayerEarnMeter_GetOwnedFrac( player ) == 1.0 ) // this should only be the case after player has dropped their titan { PlayerEarnMeter_Reset( player ) // reset rewards string burncardRef = GetSelectedBurncardRefFromWeaponOrPlayer( null, player ) PlayerEarnMeter_SetReward( player, EarnObject_GetByRef( burncardRef ) ) PlayerEarnMeter_SetRewardFrac( player, BurnReward_GetByRef( burncardRef ).cost ) PlayerEarnMeter_EnableReward( player ) } if ( PlayerEarnMeter_GetRewardFrac( player ) != 0 ) PlayerEarnMeter_EnableReward( player ) } else { PlayerEarnMeter_DisableGoal( player ) PlayerEarnMeter_DisableReward( player ) } lastEarnMeterMode = desiredEarnMeterMode } if ( lastEarnMeterMode == eEarnMeterMode.DEFAULT ) { if ( PlayerEarnMeter_GetOwnedFrac( player ) < 1.0 ) PlayerEarnMeter_DisableGoal( player ) else if ( player.GetPlayerNetInt( "goalState" ) != eRewardState.UNAVAILABLE ) { // if goal is enabled then the client will show "titan ready" alerts even if it isn't // the problem is that if the goal isn't available when we fill the earnmeter, then it won't make it available // so unfortunately we have to do this manually player.SetPlayerNetInt( "goalState", eRewardState.AVAILABLE ) PlayerEarnMeter_RefreshGoal( player ) } if ( Time() - lastPassiveGainTime > 4.0 && file.passiveMeterGainEnabled ) // this might be 5.0 { lastPassiveGainTime = Time() PlayerEarnMeter_AddOwnedFrac( player, 0.01 ) } } WaitFrame() } } void function EarnMeterMP_BoostEarned( entity player ) { BurnReward burncard = BurnReward_GetByRef( GetSelectedBurnCardRef( player ) ) while ( burncard.ref == "burnmeter_random_foil" ) burncard = BurnReward_GetRandom() array mods = [ "burn_card_weapon_mod" ] if ( burncard.extraWeaponMod != "" ) mods.append( burncard.extraWeaponMod ) // ensure inventory slot isn't full to avoid crash entity preexistingWeapon = player.GetOffhandWeapon( OFFHAND_INVENTORY ) if ( IsValid( preexistingWeapon ) ) player.TakeWeaponNow( preexistingWeapon.GetWeaponClassName() ) player.GiveOffhandWeapon( burncard.weaponName, OFFHAND_INVENTORY, mods ) Remote_CallFunction_Replay( player, "ServerCallback_RewardReadyMessage", player.s.respawnTime ) } void function EarnMeterMP_TitanEarned( entity player ) { if ( EarnMeterMP_IsTitanEarnGametype() ) { SetTitanAvailable( player ) //Remote_CallFunction_Replay( player, "ServerCallback_TitanReadyMessage" ) // broken for some reason } else { PlayerEarnMeter_Reset( player ) // reset rewards string burncardRef = GetSelectedBurncardRefFromWeaponOrPlayer( null, player ) PlayerEarnMeter_SetReward( player, EarnObject_GetByRef( burncardRef ) ) PlayerEarnMeter_SetRewardFrac( player, BurnReward_GetByRef( burncardRef ).cost ) PlayerEarnMeter_EnableReward( player ) if ( PlayerEarnMeter_GetRewardFrac( player ) != 0 ) PlayerEarnMeter_EnableReward( player ) } }