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 = []
}
|