Class UFireLight : PaletteLight { Default { Tag "FlamG"; Args 0,0,0,60; } } Class UFireTrail : Actor { Default { RenderStyle "Add"; Radius 0.1; Height 0; +NOBLOCKMAP; +NOGRAVITY; +DONTSPLASH; +FORCEXYBILLBOARD; +NOTELEPORT; Scale 0.5; Alpha 0.2; } override void Tick() { Super.Tick(); if ( !target || !target.bMISSILE ) { Destroy(); return; } SetOrigin(target.pos,true); } States { Spawn: FGFL A -1 Bright; Stop; } } Class UFireball : Actor { Vector3 Acceleration; double spreadf; int ns, nsp; property SpreadFactor : spreadf; property NumSmokes : ns; property NumSparks : nsp; Default { DamageType 'Fire'; DamageFunction 30; Radius 4; Height 4; Speed 15; PROJECTILE; +SKYEXPLODE; +EXPLODEONWATER; +FORCERADIUSDMG; +NODAMAGETHRUST; +FORCEXYBILLBOARD; UFireball.SpreadFactor 0.2; UFireball.NumSmokes 1; UFireball.NumSparks 2; } override void PostBeginPlay() { Super.PostBeginPlay(); if ( bAMBUSH ) return; let l = Spawn("UFireTrail",pos); l.target = self; Acceleration = vel.unit()*50; A_PlaySound("eightball/fly",CHAN_VOICE,1.0,true,3.,pitch:1.5); } action void A_Spread() { vel += invoker.Acceleration/TICRATE; vel += (FRandom[EWizFX](-1,1),FRandom[EWizFX](-1,1),FRandom[EWizFX](-1,1))*FRandom[EWizFX](.5,1.)*invoker.spreadf; Vector3 dir = vel.unit(); if ( vel.length() > 30. ) vel = dir*30.; angle = atan2(dir.y,dir.x); pitch = asin(-dir.z); if ( waterlevel > 0 ) { int numpt = Random[ExploS](10,15); if ( bAMBUSH ) numpt /= 3; for ( int i=0; i40,"AltRelease"); } Wait; AltRelease: FGNF B 2 { invoker.special1 = 0; A_WeaponOffset(0,32); A_FlameGunFire(true); } FGNF CDEFGHIJ 2; FGNT ABCDEFGHIJKLM 2; Goto Idle; Deselect: FGND A 1 A_Overlay(-9999,"Null"); FGND BCDEFGHIJ 1; FGND J 1 A_Lower(int.max); Wait; } }