aboutsummaryrefslogtreecommitdiff
path: root/Northstar.CustomServers/mod/scripts/vscripts/earn_meter/sv_earn_meter_mp.gnut
diff options
context:
space:
mode:
authorBobTheBob <32057864+BobTheBob9@users.noreply.github.com>2021-08-31 23:14:58 +0100
committerBobTheBob <32057864+BobTheBob9@users.noreply.github.com>2021-08-31 23:14:58 +0100
commit9a96d0bff56f1969c68bb52a2f33296095bdc67d (patch)
tree4175928e488632705692e3cccafa1a38dd854615 /Northstar.CustomServers/mod/scripts/vscripts/earn_meter/sv_earn_meter_mp.gnut
parent27bd240871b7c0f2f49fef137718b2e3c208e3b4 (diff)
downloadNorthstarMods-9a96d0bff56f1969c68bb52a2f33296095bdc67d.tar.gz
NorthstarMods-9a96d0bff56f1969c68bb52a2f33296095bdc67d.zip
move to new mod format
Diffstat (limited to 'Northstar.CustomServers/mod/scripts/vscripts/earn_meter/sv_earn_meter_mp.gnut')
-rw-r--r--Northstar.CustomServers/mod/scripts/vscripts/earn_meter/sv_earn_meter_mp.gnut136
1 files changed, 136 insertions, 0 deletions
diff --git a/Northstar.CustomServers/mod/scripts/vscripts/earn_meter/sv_earn_meter_mp.gnut b/Northstar.CustomServers/mod/scripts/vscripts/earn_meter/sv_earn_meter_mp.gnut
new file mode 100644
index 000000000..b41640ad4
--- /dev/null
+++ b/Northstar.CustomServers/mod/scripts/vscripts/earn_meter/sv_earn_meter_mp.gnut
@@ -0,0 +1,136 @@
+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 ) )
+}
+
+void function EarnMeterMP_SetPassiveMeterGainEnabled( bool enabled )
+{
+ file.passiveMeterGainEnabled = enabled
+}
+
+void function SetupPlayerEarnMeter( entity player )
+{
+ PlayerEarnMeter_Reset( player )
+
+ // todo: need to do burnmeter stuff here ( e.g. rewards/boosts )
+ if ( EarnMeterMP_IsTitanEarnGametype() )
+ PlayerEarnMeter_SetGoal( player, EarnObject_GetByRef( GetTitanLoadoutForPlayer( player ).titanClass ) )
+
+ PlayerEarnMeter_EnableGoal( player ) // prevents goalstate from being set incorrectly
+
+ // 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 )
+
+ // 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
+ AddEarnMeterThresholdEarnedCallback( 1.0, void function( entity player ) { SetTitanAvailable( player ) }, true )
+ }
+ else // if no titans from earnmeter in this mode, just reset when we finish meter
+ AddEarnMeterThresholdEarnedCallback( 1.0, PlayerEarnMeter_Reset, true )
+}
+
+void function OnPlayerRespawned( entity player )
+{
+ thread EarnMeterMP_PlayerLifeThink( 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 )
+
+ 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()
+ }
+} \ No newline at end of file