aboutsummaryrefslogtreecommitdiff
path: root/Northstar.CustomServers/scripts/vscripts/titan/_battery_generator.gnut
blob: 567ad6e747c9416bce3ad7f2a07a3380304ee424 (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
global function InitDestroyableGenerator
global function ClearGenerators

const GENERATOR_HEALTH = 200

const MODEL_DESTROYED_GENERATOR = $"models/beacon/charge_generator_01_destroyed.mdl"
const FX_GENERATOR_EXP = $"P_generator_exp"

struct
{
	array<entity> generators
} file

void function InitDestroyableGenerator()
{
	AddSpawnCallbackEditorClass( "script_ref", "script_battery_generator", SpawnPropGenerator )
	AddSpawnCallback_ScriptName( "prop_battery_generator", PropBatteryGeneratorThink )

	PrecacheModel( MODEL_GENERATOR )
	PrecacheModel( MODEL_DESTROYED_GENERATOR )
	PrecacheParticleSystem( FX_GENERATOR_EXP )
}

void function SpawnPropGenerator( entity generatorRef )
{
	entity generator = CreatePropScript( MODEL_GENERATOR, generatorRef.GetOrigin(), generatorRef.GetAngles(), 6 )
	thread PropBatteryGeneratorThink( generator )
	generatorRef.Destroy()
}

void function PropBatteryGeneratorThink( entity generator )
{
	SetObjectCanBeMeleed( generator, true )
	SetVisibleEntitiesInConeQueriableEnabled( generator, true )
	generator.SetTakeDamageType( DAMAGE_EVENTS_ONLY )
	generator.SetDamageNotifications( true )
	generator.SetMaxHealth( GENERATOR_HEALTH )
	generator.SetHealth( GENERATOR_HEALTH )
	generator.DisableHibernation()
	AddEntityCallback_OnDamaged( generator, GeneratorOnDamage )

	entity trigger = CreateEntity( "trigger_cylinder" )
	trigger.SetRadius( 150 )
	trigger.SetAboveHeight( 150 )
	trigger.SetBelowHeight( 150 ) //i.e. make the trigger a sphere as opposed to a cylinder
	trigger.SetOrigin( generator.GetOrigin() )
	trigger.SetParent( generator )
	DispatchSpawn( trigger )
	trigger.SetEnterCallback( GeneratorTriggerThink )


	file.generators.append( generator )
}

void function GeneratorTriggerThink( entity trigger, entity ent )
{
	if ( ent.IsTitan() || IsSuperSpectre( ent ) )
	{
		entity generator = trigger.GetParent()

		if ( generator != null )
		{
			GeneratorDestroy( generator )
		}
	}
}

void function GeneratorOnDamage( entity generator, var damageInfo )
{
	if ( !IsValid( generator ) )
	{
		// sometimes OnDamage gets called twice in the same frame, ( scorch's fire )
		// and first call destroys generator in GeneratorDestroy()
		return
	}

	float damage = DamageInfo_GetDamage( damageInfo )

	int health = generator.GetHealth()
	health -= int( damage )

	if ( health <= 0 )
		GeneratorDestroy( generator )
	else
		generator.SetHealth( health )
}

void function GeneratorDestroy( entity generator )
{
	int solidType = 6 //phys collision
	entity destroyedProp = CreatePropDynamic( MODEL_DESTROYED_GENERATOR, generator.GetOrigin(), generator.GetAngles(), solidType )
	if ( generator.GetParent() )
		destroyedProp.SetToSameParentAs( generator )

	destroyedProp.AllowMantle()
	destroyedProp.DisableHibernation()
	int fxID = GetParticleSystemIndex( FX_GENERATOR_EXP )
	vector origin = generator.GetOrigin()
	vector up 		= generator.GetUpVector()

	EmitSoundOnEntity( destroyedProp, "BatteryCrate_Explosion" )
	StartParticleEffectOnEntity( destroyedProp, fxID, FX_PATTACH_ABSORIGIN_FOLLOW, -1 )

	entity battery = CreateTitanBattery( origin + ( up * 40 ) )
	battery.DisableHibernation()

	//throw out the battery
	vector right 	= generator.GetRightVector() * RandomFloatRange( -0.5, 0.5 )
	vector forward 	= generator.GetForwardVector() * RandomFloatRange( -0.5, 0.5 )
	vector velocity = Normalize( up + right + forward ) * 10

	//for moving geo
	vector parentVelocity = generator.GetVelocity()

	battery.SetVelocity( velocity + parentVelocity )

	file.generators.fastremovebyvalue( generator )
	generator.Destroy()
}

void function ClearGenerators()
{
	foreach ( g in file.generators )
	{
		g.Destroy()
	}
	file.generators = []
}