aboutsummaryrefslogtreecommitdiff
path: root/Northstar.Custom/mod/scripts/vscripts/gamemodes/gg_earn_meter/cl_gg_earn_meter.gnut
blob: 92f7be612172073e3aa603e828e48560d4ec30a7 (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
global function Cl_GGEarnMeter_Init
global function Cl_GGEarnMeter_RegisterNetwork
global function ServerCallback_GGEarnMeter_SetWeaponIcon

const float FILL_ANIM_DURATION = 0.2

struct EarnChangeData
{
	float startValue = 0.0
	float endValue = 0.0
	float updateTime = 0.0
}

struct {
	EarnChangeData lastEarnedData
	var earnMeterRui
	asset functionref() getIconFunction
	bool functionref() testIconFunction
} file

void function Cl_GGEarnMeter_Init( asset functionref() getIconFunction, bool functionref() testIconFunction = null )
{
	AddCallback_OnClientScriptInit( CreateGGEarnMeterUI )

	file.getIconFunction = getIconFunction
	file.testIconFunction = testIconFunction
}

void function CreateGGEarnMeterUI( entity player )
{
	file.earnMeterRui = CreateCockpitRui( $"ui/earn_meter.rpak" )

	RuiSetFloat( file.earnMeterRui, "fillAnimDuration", FILL_ANIM_DURATION )
	RuiSetGameTime( file.earnMeterRui, "lastEarnChangeTime", RUI_BADGAMETIME )
	RuiSetFloat( file.earnMeterRui, "earnedStartFrac", 0.0 )
	RuiSetInt( file.earnMeterRui, "meterMode", 5 )

	RuiTrackFloat( file.earnMeterRui, "earnedFrac", player, RUI_TRACK_SCRIPT_NETWORK_VAR, GetNetworkedVariableIndex( "gunGameLevelPercentage" ) )

	thread Cl_GGEarnMeter_TrackWeaponIcon()
}

void function Cl_GGEarnMeter_RegisterNetwork()
{
	RegisterNetworkedVariableChangeCallback_float( "gunGameLevelPercentage", GunGamePercentageUpdate )
}

void function GunGamePercentageUpdate( entity player, float oldValue, float newValue, bool actuallyChanged )
{
	if ( !actuallyChanged )
		return

	float currentValue = Cl_GGEarnMeter_GetCurrentMeterValue( file.lastEarnedData )
	RuiSetGameTime( file.earnMeterRui, "lastEarnChangeTime", Time() )
	RuiSetFloat( file.earnMeterRui, "earnedStartFrac", currentValue )

	file.lastEarnedData.startValue = oldValue
	file.lastEarnedData.endValue = newValue
	file.lastEarnedData.updateTime = Time()
}

float function Cl_GGEarnMeter_GetCurrentMeterValue( EarnChangeData earnData )
{
	float elapsedTime = Time() - earnData.updateTime
	float delta = earnData.endValue - earnData.startValue
	return earnData.endValue - (delta * EaseIn( GraphCapped( elapsedTime, 0.0, FILL_ANIM_DURATION, 1.0, 0.0 ) ) )
}

void function Cl_GGEarnMeter_TrackWeaponIcon()
{
	int lastScore = -1
	while ( IsValid( file.earnMeterRui ) )
	{
		if ( file.testIconFunction == null || file.testIconFunction() )
		{
			asset weaponImage = file.getIconFunction()

			RuiSetImage( file.earnMeterRui, "goalBuildingIcon", weaponImage )
			RuiSetImage( file.earnMeterRui, "goalReadyIcon", weaponImage )
		}

		WaitFrame()
	}
}

void function ServerCallback_GGEarnMeter_SetWeaponIcon( int damageSourceId )
{
	asset weaponImage

	if ( damageSourceId > -1 )
	{
		if ( !DamageSourceIDHasString(damageSourceId) )
		{
			return
		}

		weaponImage = GetItemImage( DamageSourceIDToString( damageSourceId ) )
	}
	else
	{
		weaponImage = RandomFloat( 1 ) > 0.1 ? $"rui/menu/boosts/boost_icon_random" : $"rui/faction/faction_logo_mrvn"
	}

	RuiSetImage( file.earnMeterRui, "goalBuildingIcon", weaponImage )
	RuiSetImage( file.earnMeterRui, "goalReadyIcon", weaponImage )
}