aboutsummaryrefslogtreecommitdiff
path: root/Northstar.CustomServers/scripts/vscripts/_powerup.gnut
blob: a154ddb6f0c09e3e3bd849a1350da3431c8aa96e (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
untyped
global function PowerUps_Init

struct {
	array<entity> powerupSpawns
} file

void function PowerUps_Init()
{
	SH_PowerUp_Init()
		
	AddSpawnCallbackEditorClass( "script_ref", "script_power_up_other", AddPowerupSpawn )
	AddCallback_OnTouchHealthKit( "item_powerup", OnPowerupCollected )
}

void function AddPowerupSpawn( entity spawnpoint )
{
	file.powerupSpawns.append( spawnpoint )
}

void function RespawnPowerups()
{
	foreach ( entity spawnpoint in file.powerupSpawns )
	{
		PowerUp powerupDef = GetPowerUpFromItemRef( expect string( spawnpoint.kv.powerUpType ) )
		thread PowerupSpawnerThink( spawnpoint, powerupDef )
	}
}

void function PowerupSpawnerThink( entity spawnpoint, PowerUp powerupDef )
{
	svGlobal.levelEnt.EndSignal( "CleanUpEntitiesForRoundEnd" )

	entity base = CreatePropDynamic( powerupDef.baseModel, spawnpoint.GetOrigin(), spawnpoint.GetAngles(), 2 )
	OnThreadEnd( function() : ( base ) 
	{
		base.Destroy()
	})

	while ( true )
	{
		if ( !powerupDef.spawnFunc() )
		{
			// unsure if this is the best way of doing it
			WaitFrame()
			continue
		}
						
		entity powerup = CreateEntity( "item_powerup" )
		
		powerup.SetParent( base ) // parenting ensures that gravity isn't an issue
		powerup.SetValueForModelKey( powerupDef.model )
		
		DispatchSpawn( powerup )
		
		// offset from parent's position/angles
		powerup.SetOrigin( powerupDef.modelOffset )
		powerup.SetAngles( powerupDef.modelAngles )
		
		powerup.SetModel( powerupDef.model )
		powerup.s.powerupRef <- powerupDef.itemRef
		
		PickupGlow glow = CreatePickupGlow( powerup, powerupDef.glowColor.x.tointeger(), powerupDef.glowColor.y.tointeger(), powerupDef.glowColor.z.tointeger() )
		glow.glowFX.SetOrigin( spawnpoint.GetOrigin() ) // want the glow to be parented to the powerup, but have the position of the spawnpoint
		
		OnThreadEnd( function() : ( powerup )
		{
			if ( IsValid( powerup ) )
			{
				powerup.Destroy()
			}
		})
		
		powerup.WaitSignal( "OnDestroy" )
		wait powerupDef.respawnDelay
	}
}

bool function OnPowerupCollected( entity player, entity healthpack )
{
	PowerUp powerup = GetPowerUpFromItemRef( expect string( healthpack.s.powerupRef ) )
	
	if ( player.IsTitan() == powerup.titanPickup )
	{
		// hack because i couldn't figure out any other way to do this without modifying sh_powerup
		// ensure we don't kill the powerup if it's a battery the player can't pickup
		if ( ( powerup.index == ePowerUps.titanTimeReduction || powerup.index == ePowerUps.LTS_TitanTimeReduction ) && PlayerHasBattery( player ) )
			return false
	
		powerup.destroyFunc( player )
		return true // destroys the powerup
	}
	
	return false // keeps powerup alive
}