aboutsummaryrefslogtreecommitdiff
path: root/Northstar.CustomServers/mod/scripts/vscripts/earn_meter/sv_earn_meter_mp.gnut
blob: 4c42a825bbef7feb6324d78ed065b9825010630e (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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
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()

	BurnMeter_GiveRewardDirect( player, burncard.ref )
}

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 )
	}
}