aboutsummaryrefslogtreecommitdiff
path: root/Northstar.CustomServers/scripts/vscripts/earn_meter/sv_earn_meter_mp.gnut
blob: b41640ad407b51eee30aa212726ac3492549f849 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
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()
	}
}