aboutsummaryrefslogtreecommitdiff
path: root/Northstar.CustomServers/mod/scripts/vscripts/_xp.gnut
blob: 6f044b7acbb9fe3d6d35f0a2f38ff498ce76ee6f (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
global function SvXP_Init
global function PlayerProgressionAllowed
global function HandleXPGainForScoreEvent

void function SvXP_Init()
{
	AddCallback_OnClientConnected( SetupPlayerPreviousXPValues )
}

void function SetupPlayerPreviousXPValues( entity player )
{
	InitXP( player )

	foreach ( string xpFaction in GetAllFactionRefs() )
		player.SetPersistentVar( "previousFactionXP[" + xpFaction + "]", FactionGetXP( player, xpFaction ) )

	foreach ( string xpTitan in shTitanXP.titanClasses )
		player.SetPersistentVar( "previousTitanXP[" + xpTitan + "]", TitanGetXP( player, xpTitan ) )

	foreach ( string xpWeapon in shWeaponXP.weaponClassNames )
		player.SetPersistentVar( GetItemPersistenceStruct( xpWeapon ) + ".previousWeaponXP", WeaponGetXP( player, xpWeapon ) )
}

bool function PlayerProgressionAllowed( entity player )
{
	return true
}

void function HandleXPGainForScoreEvent( entity player, ScoreEvent event )
{
	// note: obviously all xp stuff can be cheated in if people want to on customs, this is mainly just here for fun for those who want it and feature completeness
	// most score events don't have this, so we'll set this to the xp value of other categories later if needed
	int xpValue = ScoreEvent_GetXPValue( event )
	int weaponXp = ScoreEvent_GetXPValueWeapon( event )
	int titanXp = ScoreEvent_GetXPValueTitan( event )

	if ( xpValue < weaponXp )
		xpValue = weaponXp
	else if ( xpValue < titanXp )
		xpValue = titanXp

	entity weapon = player.GetActiveWeapon()
	if ( IsValid( weapon ) && ShouldTrackXPForWeapon( weapon.GetWeaponClassName() ) )
		AddWeaponXP( player, xpValue )

	// if we specifically gain titan xp, then give titan xp no matter what, otherwise only give it when we're in a titan
	if ( titanXp != 0 || player.IsTitan() )
		AddTitanXP( player, xpValue )

	// most events don't have faction xp but almost everything should give it
	int factionXp = ScoreEvent_GetXPValueFaction( event )
	if ( xpValue > factionXp )
		factionXp = xpValue
	else if ( xpValue < factionXp )
		xpValue = factionXp

	if ( factionXp != 0 )
		AddFactionXP( player, factionXp )

	if ( xpValue == 0 )
		return

	// global xp
	int oldXp = player.GetPersistentVarAsInt( "xp" )
	if(oldXp<0) oldXp = 0
	int oldLevel = GetLevelForXP( oldXp )
	player.SetPersistentVar( "xp", min( oldXp + xpValue, PlayerGetMaxXPPerGen() ) )
	player.XPChanged() // network xp change to client, gen can't change here

	int newXp = player.GetPersistentVarAsInt( "xp" )
	int newLevel = GetLevelForXP( newXp )
	if ( newLevel != oldLevel )
		Remote_CallFunction_NonReplay( player, "ServerCallback_PlayerLeveledUp", player.GetPersistentVarAsInt( "gen" ), newLevel )
}