// Spreadgun projectiles and effects Class RedShellCasing : SWWMCasing { Default { BounceSound "spreadgun/casing"; } override void PostBeginPlay() { Super.PostBeginPlay(); heat = 0; } } Class GoldShellCasing : RedShellCasing { Default { BounceSound "spreadgun/gcasing"; } } Class SpreadImpact : SWWMNonInteractiveActor { override void PostBeginPlay() { Super.PostBeginPlay(); A_StartSound("spreadgun/pellet",CHAN_VOICE,CHANF_DEFAULT,.4,2.); A_SprayDecal("TinyPock",-20); int numpt = Random[Spreadgun](2,4)-special1; Vector3 x = SWWMUtility.Vec3FromAngles(angle,pitch); for ( int i=0; i 30) ) return; FLineTraceData d; Vector3 HitNormal; Vector3 origin; double ang, pt; for ( int i=0; i<3; i++ ) { double totaldist = 30+(special1**2.)*.4; ang = FRandom[ExploS](0,360); pt = FRandom[ExploS](-90,90); origin = pos; while ( totaldist > 0 ) { LineTrace(ang,totaldist,pt,TRF_THRUACTORS|TRF_ABSPOSITION,origin.z,origin.x,origin.y,d); HitNormal = SWWMUtility.GetLineTraceHitNormal(d); totaldist -= d.Distance; if ( totaldist > 0 ) { Vector3 bounced = d.HitDir-(1.2*hitnormal*(d.HitDir dot HitNormal)); ang = atan2(bounced.y,bounced.x); pt = asin(-bounced.z); origin = d.HitLocation+hitnormal; } } let p = Spawn("GoldenSubImpact",d.HitLocation+hitnormal*4); p.angle = atan2(hitnormal.y,hitnormal.x); p.pitch = asin(-hitnormal.z); p.target = target; } } States { Spawn: XEX1 AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]] 1 Bright A_GoldSpread(); Stop; } } Class GoldenSubImpact : SWWMNonInteractiveActor { Default { DamageType "Explodium"; RenderStyle "Add"; Scale 6.; Alpha .8; +NODAMAGETHRUST; +FORCERADIUSDMG; +FORCEXYBILLBOARD; +FOILINVUL; } override void PostBeginPlay() { Super.PostBeginPlay(); SWWMUtility.DoExplosion(self,777,80000,500,400,DE_EXTRAZTHRUST); A_QuakeEx(7,7,7,20,0,2000,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:200,rollintensity:.8); A_SprayDecal("BigRocketBlast",-172); Scale *= FRandom[ExploS](0.8,1.1); Scale.x *= RandomPick[ExploS](-1,1); Scale.y *= RandomPick[ExploS](-1,1); int numpt = Random[ExploS](4,8); for ( int i=0; i 20) ) return; FLineTraceData d; Vector3 HitNormal; Vector3 origin; double ang, pt; for ( int i=0; i<2; i++ ) { double totaldist = 20+(special1**2.)*.2; ang = FRandom[ExploS](0,360); pt = FRandom[ExploS](-90,90); origin = pos; while ( totaldist > 0 ) { LineTrace(ang,totaldist,pt,TRF_THRUACTORS|TRF_ABSPOSITION,origin.z,origin.x,origin.y,d); HitNormal = SWWMUtility.GetLineTraceHitNormal(d); totaldist -= d.Distance; if ( totaldist > 0 ) { Vector3 bounced = d.HitDir-(1.2*hitnormal*(d.HitDir dot HitNormal)); ang = atan2(bounced.y,bounced.x); pt = asin(-bounced.z); origin = d.HitLocation+hitnormal; } } let p = Spawn("GoldenSubSubImpact",d.HitLocation+hitnormal*4); p.angle = atan2(hitnormal.y,hitnormal.x); p.pitch = asin(-hitnormal.z); p.target = target; } } States { Spawn: XEX1 ABCDEFGHIJKLMNOPQRSTUVWXYZ[\] 1 Bright A_GoldSubSpread(); Stop; } } Class GoldenSubSubImpact : SWWMNonInteractiveActor { Default { DamageType "Explodium"; RenderStyle "Add"; Scale 3.; Alpha .6; +NODAMAGETHRUST; +FORCERADIUSDMG; +FORCEXYBILLBOARD; +FOILINVUL; } override void PostBeginPlay() { Super.PostBeginPlay(); SWWMUtility.DoExplosion(self,77,70000,400,300,DE_EXTRAZTHRUST); A_QuakeEx(4,4,4,15,0,1000,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:100,rollintensity:.4); A_SprayDecal("RocketBlast",-172); Scale *= FRandom[ExploS](0.8,1.1); Scale.x *= RandomPick[ExploS](-1,1); Scale.y *= RandomPick[ExploS](-1,1); int numpt = Random[ExploS](1,2); for ( int i=0; i