From b1683dae8efa70c5bcdfe2f09a71c81eae6d6192 Mon Sep 17 00:00:00 2001 From: Marisa the Magician Date: Sun, 18 Dec 2022 20:03:36 +0100 Subject: [PATCH] Generalized hitnormal functions (where possible). --- language.version | 4 +- zscript/dlc1/swwm_heavymahsheengun.zsc | 19 +-- zscript/dlc1/swwm_mister.zsc | 74 +--------- zscript/dlc1/swwm_mister_fx.zsc | 57 +------- zscript/items/swwm_funstuff.zsc | 17 +-- zscript/items/swwm_miscitems.zsc | 59 +------- zscript/swwm_blod.zsc | 17 +-- zscript/swwm_common_fx.zsc | 68 +-------- zscript/utility/swwm_utility_map.zsc | 132 +++++++++++++++++- zscript/weapons/swwm_baseweapon_melee.zsc | 19 +-- zscript/weapons/swwm_blazeit_fx.zsc | 58 +------- zscript/weapons/swwm_cbt.zsc | 19 +-- zscript/weapons/swwm_cbt_fx.zsc | 11 +- zscript/weapons/swwm_danmaku_fx.zsc | 58 +------- .../weapons/swwm_deathlydeathcannon_altfx.zsc | 73 +--------- .../weapons/swwm_deathlydeathcannon_fx.zsc | 19 +-- zscript/weapons/swwm_shot.zsc | 38 +---- zscript/weapons/swwm_shot_fx.zsc | 34 +---- zscript/weapons/swwm_sparkyboi_fx.zsc | 112 ++------------- zscript/weapons/swwm_splode.zsc | 38 +---- zscript/weapons/swwm_splode_fx.zsc | 2 +- zscript/weapons/swwm_tastytreat.zsc | 19 +-- zscript/weapons/swwm_tastytreat_fx.zsc | 27 +--- zscript/weapons/swwm_thiccboolet.zsc | 17 +-- 24 files changed, 206 insertions(+), 785 deletions(-) diff --git a/language.version b/language.version index fed9069df..e51a195ec 100644 --- a/language.version +++ b/language.version @@ -1,3 +1,3 @@ [default] -SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r697 \cu(Sat 17 Dec 11:56:08 CET 2022)\c-"; -SWWM_SHORTVER="\cw1.3pre r697 \cu(2022-12-17 11:56:08)\c-"; +SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r698 \cu(Sun 18 Dec 20:03:37 CET 2022)\c-"; +SWWM_SHORTVER="\cw1.3pre r698 \cu(2022-12-18 20:03:37)\c-"; diff --git a/zscript/dlc1/swwm_heavymahsheengun.zsc b/zscript/dlc1/swwm_heavymahsheengun.zsc index e5467c21e..df84ed4a1 100644 --- a/zscript/dlc1/swwm_heavymahsheengun.zsc +++ b/zscript/dlc1/swwm_heavymahsheengun.zsc @@ -202,28 +202,13 @@ Class HeavyMahSheenGun : SWWMWeapon } if ( (st.Results.HitType != TRACE_HitNone) && (st.Results.HitType != TRACE_HasHitSky) && (st.Results.HitType != TRACE_HitActor) ) { - Vector3 hitnormal = -st.Results.HitVector; - if ( st.Results.HitType == TRACE_HitFloor ) - { - if ( st.Results.FFloor ) hitnormal = -st.Results.FFloor.top.Normal; - else hitnormal = st.Results.HitSector.floorplane.Normal; - } - else if ( st.Results.HitType == TRACE_HitCeiling ) - { - if ( st.Results.FFloor ) hitnormal = -st.Results.FFloor.bottom.Normal; - else hitnormal = st.Results.HitSector.ceilingplane.Normal; - } - else if ( st.Results.HitType == TRACE_HitWall ) - { - hitnormal = (-st.Results.HitLine.delta.y,st.Results.HitLine.delta.x,0).unit(); - if ( !st.Results.Side ) hitnormal *= -1; - } + Vector3 hitnormal = SWWMUtility.GetLineTracerHitNormal(st.Results); let p = Spawn("SWWMBulletImpact",st.Results.HitPos+hitnormal*4); p.angle = atan2(hitnormal.y,hitnormal.x); p.pitch = asin(-hitnormal.z); p.target = self; if ( st.Results.HitType == TRACE_HitFloor ) p.CheckSplash(40); - if ( st.Results.HitLine ) st.Results.HitLine.RemoteActivate(self,st.Results.Side,SPAC_Impact,st.Results.HitPos); + else if ( st.Results.HitType == TRACE_HitWall ) st.Results.HitLine.RemoteActivate(self,st.Results.Side,SPAC_Impact,st.Results.HitPos); } for ( int i=0; i<(5-invoker.firespeed); i++ ) { diff --git a/zscript/dlc1/swwm_mister.zsc b/zscript/dlc1/swwm_mister.zsc index 6e998557f..892580bc7 100644 --- a/zscript/dlc1/swwm_mister.zsc +++ b/zscript/dlc1/swwm_mister.zsc @@ -523,27 +523,12 @@ Class MisterRifle : SWWMWeapon } else if ( d.HitType != TRACE_HitNone ) { - Vector3 hitnormal = -d.HitDir; - if ( d.HitType == TRACE_HitFloor ) - { - if ( d.Hit3DFloor ) hitnormal = -d.Hit3DFloor.top.Normal; - else hitnormal = d.HitSector.floorplane.Normal; - } - else if ( d.HitType == TRACE_HitCeiling ) - { - if ( d.Hit3DFloor ) hitnormal = -d.Hit3DFloor.bottom.Normal; - else hitnormal = d.HitSector.ceilingplane.Normal; - } - else if ( d.HitType == TRACE_HitWall ) - { - hitnormal = (-d.HitLine.delta.y,d.HitLine.delta.x,0).unit(); - if ( !d.LineSide ) hitnormal *= -1; - } + Vector3 hitnormal = SWWMUtility.GetLineTraceHitNormal(d); let p = Spawn("SpreadImpact",d.HitLocation+hitnormal*0.01); p.angle = atan2(hitnormal.y,hitnormal.x); p.pitch = asin(-hitnormal.z); p.target = self; - if ( d.HitLine ) d.HitLine.RemoteActivate(self,d.LineSide,SPAC_Impact,d.HitLocation); + if ( d.HitType == TRACE_HitWall ) d.HitLine.RemoteActivate(self,d.LineSide,SPAC_Impact,d.HitLocation); let b = Spawn("MisterBuckshotImpact",d.HitLocation+hitnormal*4.); b.angle = atan2(hitnormal.y,hitnormal.x); b.pitch = asin(-hitnormal.z); @@ -590,27 +575,12 @@ Class MisterRifle : SWWMWeapon } else if ( d.HitType != TRACE_HitNone ) { - Vector3 hitnormal = -d.HitDir; - if ( d.HitType == TRACE_HitFloor ) - { - if ( d.Hit3DFloor ) hitnormal = -d.Hit3DFloor.top.Normal; - else hitnormal = d.HitSector.floorplane.Normal; - } - else if ( d.HitType == TRACE_HitCeiling ) - { - if ( d.Hit3DFloor ) hitnormal = -d.Hit3DFloor.bottom.Normal; - else hitnormal = d.HitSector.ceilingplane.Normal; - } - else if ( d.HitType == TRACE_HitWall ) - { - hitnormal = (-d.HitLine.delta.y,d.HitLine.delta.x,0).unit(); - if ( !d.LineSide ) hitnormal *= -1; - } + Vector3 hitnormal = SWWMUtility.GetLineTraceHitNormal(d); let p = Spawn("SWWMBulletImpact",d.HitLocation+hitnormal*0.01); p.angle = atan2(hitnormal.y,hitnormal.x); p.pitch = asin(-hitnormal.z); p.target = self; - if ( d.HitLine ) d.HitLine.RemoteActivate(self,d.LineSide,SPAC_Impact,d.HitLocation); + if ( d.HitType == TRACE_HitWall ) d.HitLine.RemoteActivate(self,d.LineSide,SPAC_Impact,d.HitLocation); let b = Spawn("MisterBulletImpact",d.HitLocation+hitnormal*4.); b.angle = atan2(hitnormal.y,hitnormal.x); b.pitch = asin(-hitnormal.z); @@ -669,27 +639,12 @@ Class MisterRifle : SWWMWeapon } else if ( d.HitType != TRACE_HitNone ) { - Vector3 hitnormal = -d.HitDir; - if ( d.HitType == TRACE_HitFloor ) - { - if ( d.Hit3DFloor ) hitnormal = -d.Hit3DFloor.top.Normal; - else hitnormal = d.HitSector.floorplane.Normal; - } - else if ( d.HitType == TRACE_HitCeiling ) - { - if ( d.Hit3DFloor ) hitnormal = -d.Hit3DFloor.bottom.Normal; - else hitnormal = d.HitSector.ceilingplane.Normal; - } - else if ( d.HitType == TRACE_HitWall ) - { - hitnormal = (-d.HitLine.delta.y,d.HitLine.delta.x,0).unit(); - if ( !d.LineSide ) hitnormal *= -1; - } + Vector3 hitnormal = SWWMUtility.GetLineTraceHitNormal(d); let p = Spawn("SWWMBulletImpact",d.HitLocation+hitnormal*0.01); p.angle = atan2(hitnormal.y,hitnormal.x); p.pitch = asin(-hitnormal.z); p.target = self; - if ( d.HitLine ) d.HitLine.RemoteActivate(self,d.LineSide,SPAC_Impact,d.HitLocation); + if ( d.HitType == TRACE_HitWall ) d.HitLine.RemoteActivate(self,d.LineSide,SPAC_Impact,d.HitLocation); let b = Spawn("MisterStreamImpact",d.HitLocation+hitnormal*4.); b.angle = atan2(hitnormal.y,hitnormal.x); b.pitch = asin(-hitnormal.z); @@ -963,22 +918,7 @@ Class MisterRifle : SWWMWeapon } if ( (mrt.Results.HitType != TRACE_HitNone) && (mrt.Results.HitType != TRACE_HasHitSky) && (mrt.Results.HitType != TRACE_HitActor) ) { - Vector3 hitnormal = -mrt.Results.HitVector; - if ( mrt.Results.HitType == TRACE_HitFloor ) - { - if ( mrt.Results.FFloor ) hitnormal = -mrt.Results.FFloor.top.Normal; - else hitnormal = mrt.Results.HitSector.floorplane.Normal; - } - else if ( mrt.Results.HitType == TRACE_HitCeiling ) - { - if ( mrt.Results.FFloor ) hitnormal = -mrt.Results.FFloor.bottom.Normal; - else hitnormal = mrt.Results.HitSector.ceilingplane.Normal; - } - else if ( mrt.Results.HitType == TRACE_HitWall ) - { - hitnormal = (-mrt.Results.HitLine.delta.y,mrt.Results.HitLine.delta.x,0).unit(); - if ( !mrt.Results.Side ) hitnormal *= -1; - } + Vector3 hitnormal = SWWMUtility.GetLineTracerHitNormal(mrt.Results); let b = MisterBulletImpact(Spawn("MisterRailEntryImpact",mrt.Results.HitPos+hitnormal*4.)); b.angle = atan2(hitnormal.y,hitnormal.x); b.pitch = asin(-hitnormal.z); diff --git a/zscript/dlc1/swwm_mister_fx.zsc b/zscript/dlc1/swwm_mister_fx.zsc index 017f95bd7..87880e2c3 100644 --- a/zscript/dlc1/swwm_mister_fx.zsc +++ b/zscript/dlc1/swwm_mister_fx.zsc @@ -233,24 +233,9 @@ Class MisterFuzzy : SWWMNonInteractiveActor double ang = atan2(dir.y,dir.x); double pt = asin(-dir.z); LineTrace(ang,dist,pt,TRF_THRUACTORS|TRF_THRUHITSCAN|TRF_ABSPOSITION,newpos.z,newpos.x,newpos.y,d); - Vector3 hitnormal = -d.HitDir; - if ( d.HitType == TRACE_HitFloor ) - { - if ( d.Hit3DFloor ) hitnormal = -d.Hit3DFloor.top.Normal; - else hitnormal = d.HitSector.floorplane.Normal; - } - else if ( d.HitType == TRACE_HitCeiling ) - { - if ( d.Hit3DFloor ) hitnormal = -d.Hit3DFloor.bottom.Normal; - else hitnormal = d.HitSector.ceilingplane.Normal; - } - else if ( d.HitType == TRACE_HitWall ) - { - hitnormal = (-d.HitLine.delta.y,d.HitLine.delta.x,0).unit(); - if ( !d.LineSide ) hitnormal *= -1; - } if ( d.HitType != TRACE_HitNone ) { + Vector3 hitnormal = SWWMUtility.GetLineTraceHitNormal(d); dist -= d.Distance; // should only happen if we bounced dir = d.HitDir-(FRandom[Puff](1.5,2.)*hitnormal*(d.HitDir dot hitnormal)); @@ -1007,45 +992,7 @@ Class MisterGrenade : Actor virtual void A_HandleBounce() { - Vector3 HitNormal = -vel.unit(); - F3DFloor ff; - if ( BlockingFloor ) - { - // find closest 3d floor for its normal - for ( int i=0; i= mo.radius ) HitNormal += (1,0,0); + else if ( diff.x <= -mo.radius ) HitNormal += (-1,0,0); + if ( diff.y >= mo.radius ) HitNormal += (0,1,0); + else if ( diff.y <= -mo.radius ) HitNormal += (0,-1,0); + if ( diff.z >= mo.height ) HitNormal += (0,0,1); + else if ( diff.z <= 0. ) HitNormal += (0,0,-1); + double len = HitNormal.length(); + if ( len < double.epsilon ) HitNormal = Vec3FromAngles(FRandom[ExploS](0,360),FRandom[ExploS](-90,90)); + else HitNormal /= len; + } + else if ( a.BlockingFloor ) + { + // find closest 3d floor for its normal + for ( int i=0; i 0. ) HitNormal = bNoBounce?(-a.vel/len):(a.vel/len); + } + return HitNormal; + } + static clearscope Vector3 GetLineTraceHitNormal( FLineTraceData d ) + { + Vector3 HitNormal = (0,0,0); + if ( d.HitType == TRACE_HitActor ) + { + let mo = d.HitActor; + Vector3 diff = level.Vec3Diff(mo.pos,d.HitLocation); + if ( diff.x >= mo.radius ) HitNormal += (1,0,0); + else if ( diff.x <= -mo.radius ) HitNormal += (-1,0,0); + if ( diff.y >= mo.radius ) HitNormal += (0,1,0); + else if ( diff.y <= -mo.radius ) HitNormal += (0,-1,0); + if ( diff.z >= mo.height ) HitNormal += (0,0,1); + else if ( diff.z <= 0. ) HitNormal += (0,0,-1); + double len = HitNormal.length(); + if ( len < double.epsilon ) HitNormal = Vec3FromAngles(FRandom[ExploS](0,360),FRandom[ExploS](-90,90)); + else HitNormal /= len; + } + else if ( d.HitType == TRACE_HitFloor ) + { + if ( d.Hit3DFloor ) HitNormal = -d.Hit3DFloor.top.Normal; + else HitNormal = d.HitSector.floorplane.Normal; + } + else if ( d.HitType == TRACE_HitCeiling ) + { + if ( d.Hit3DFloor ) HitNormal = -d.Hit3DFloor.bottom.Normal; + else HitNormal = d.HitSector.ceilingplane.Normal; + } + else if ( d.HitType == TRACE_HitWall ) + { + HitNormal = (-d.HitLine.delta.y,d.HitLine.delta.x,0).unit(); + if ( !d.LineSide ) HitNormal *= -1; + } + else HitNormal = -d.HitDir; + return HitNormal; + } + static clearscope Vector3 GetLineTracerHitNormal( TraceResults r ) + { + Vector3 HitNormal = (0,0,0); + if ( r.HitType == TRACE_HitActor ) + { + let mo = r.HitActor; + Vector3 diff = level.Vec3Diff(mo.pos,r.HitPos); + if ( diff.x >= mo.radius ) HitNormal += (1,0,0); + else if ( diff.x <= -mo.radius ) HitNormal += (-1,0,0); + if ( diff.y >= mo.radius ) HitNormal += (0,1,0); + else if ( diff.y <= -mo.radius ) HitNormal += (0,-1,0); + if ( diff.z >= mo.height ) HitNormal += (0,0,1); + else if ( diff.z <= 0. ) HitNormal += (0,0,-1); + double len = HitNormal.length(); + if ( len < double.epsilon ) HitNormal = Vec3FromAngles(FRandom[ExploS](0,360),FRandom[ExploS](-90,90)); + else HitNormal /= len; + } + else if ( r.HitType == TRACE_HitFloor ) + { + if ( r.ffloor ) HitNormal = -r.ffloor.top.Normal; + else HitNormal = r.HitSector.floorplane.Normal; + } + else if ( r.HitType == TRACE_HitCeiling ) + { + if ( r.ffloor ) HitNormal = -r.ffloor.bottom.Normal; + else HitNormal = r.HitSector.ceilingplane.Normal; + } + else if ( r.HitType == TRACE_HitWall ) + { + HitNormal = (-r.HitLine.delta.y,r.HitLine.delta.x,0).unit(); + if ( !r.Side ) HitNormal *= -1; + } + else HitNormal = -r.HitVector; + return HitNormal; + } + static bool, TextureID DefaceTexture( TextureID checkme ) { String tn = TexMan.GetName(checkme); diff --git a/zscript/weapons/swwm_baseweapon_melee.zsc b/zscript/weapons/swwm_baseweapon_melee.zsc index 3388ef7e0..20ffa06b5 100644 --- a/zscript/weapons/swwm_baseweapon_melee.zsc +++ b/zscript/weapons/swwm_baseweapon_melee.zsc @@ -520,23 +520,8 @@ extend Class SWWMWeapon FLineTraceData d; LineTrace(angle,DEFMELEERANGE*rangemul,slope,TRF_THRUACTORS,player.viewheight,data:d); if ( d.HitType == TRACE_HitNone ) return res; - Vector3 HitNormal = -d.HitDir; - if ( d.HitType == TRACE_HitFloor ) - { - if ( d.Hit3DFloor ) HitNormal = -d.Hit3DFloor.top.Normal; - else HitNormal = d.HitSector.floorplane.Normal; - } - else if ( d.HitType == TRACE_HitCeiling ) - { - if ( d.Hit3DFloor ) HitNormal = -d.Hit3DFloor.bottom.Normal; - else HitNormal = d.HitSector.ceilingplane.Normal; - } - else if ( d.HitType == TRACE_HitWall ) - { - HitNormal = (-d.HitLine.delta.y,d.HitLine.delta.x,0).unit(); - if ( !d.LineSide ) HitNormal *= -1; - d.HitLine.RemoteActivate(self,d.LineSide,SPAC_Impact,d.HitLocation+HitNormal*4); - } + Vector3 HitNormal = SWWMUtility.GetLineTraceHitNormal(d); + if ( d.HitType == TRACE_HitWall ) d.HitLine.RemoteActivate(self,d.LineSide,SPAC_Impact,d.HitLocation); if ( impactclass ) { let p = Spawn(raging?(Class)("BigPunchImpact"):impactclass,d.HitLocation+HitNormal*4); diff --git a/zscript/weapons/swwm_blazeit_fx.zsc b/zscript/weapons/swwm_blazeit_fx.zsc index 8d9375126..5fee7b955 100644 --- a/zscript/weapons/swwm_blazeit_fx.zsc +++ b/zscript/weapons/swwm_blazeit_fx.zsc @@ -334,24 +334,8 @@ Class HellblazerMissile : Actor ang = FRandom[Hellblazer](0,360); pt = FRandom[Hellblazer](-90,90); FLineTraceData d; - Vector3 HitNormal; LineTrace(ang,FRandom[Hellblazer](10,20)+10*special1*xscale,pt,TRF_THRUACTORS,data:d); - hitnormal = -d.HitDir; - if ( d.HitType == TRACE_HitFloor ) - { - if ( d.Hit3DFloor ) hitnormal = -d.Hit3DFloor.top.Normal; - else hitnormal = d.HitSector.floorplane.Normal; - } - else if ( d.HitType == TRACE_HitCeiling ) - { - if ( d.Hit3DFloor ) hitnormal = -d.Hit3DFloor.bottom.Normal; - else hitnormal = d.HitSector.ceilingplane.Normal; - } - else if ( d.HitType == TRACE_HitWall ) - { - hitnormal = (-d.HitLine.delta.y,d.HitLine.delta.x,0).unit(); - if ( !d.LineSide ) hitnormal *= -1; - } + Vector3 HitNormal = SWWMUtility.GetLineTraceHitNormal(d); let p = Spawn("HellblazerSubExpl",d.HitLocation+hitnormal*4); p.angle = atan2(hitnormal.y,hitnormal.x); p.pitch = asin(-hitnormal.z); @@ -436,45 +420,7 @@ Class HellblazerMissile2 : HellblazerMissile } virtual void A_HandleBounce() { - Vector3 HitNormal = -vel.unit(); - F3DFloor ff; - if ( BlockingFloor ) - { - // find closest 3d floor for its normal - for ( int i=0; i 0. ) HitNormal = vel.unit(); + Vector3 HitNormal = SWWMUtility.GetActorHitNormal(self); if ( swwm_omnibust ) BusterWall.ProjectileBust(self,GetMissileDamage(0,0),oldvel.unit()); // undo the bounce, we need to hook in our own vel = oldvel; @@ -558,22 +519,7 @@ Class EvisceratorProj : Actor FLineTraceData d; Vector3 HitNormal; LineTrace(ang,FRandom[Eviscerator](10,30)+10*special1,pt,TRF_THRUACTORS,data:d); - hitnormal = -d.HitDir; - if ( d.HitType == TRACE_HitFloor ) - { - if ( d.Hit3DFloor ) hitnormal = -d.Hit3DFloor.top.Normal; - else hitnormal = d.HitSector.floorplane.Normal; - } - else if ( d.HitType == TRACE_HitCeiling ) - { - if ( d.Hit3DFloor ) hitnormal = -d.Hit3DFloor.bottom.Normal; - else hitnormal = d.HitSector.ceilingplane.Normal; - } - else if ( d.HitType == TRACE_HitWall ) - { - hitnormal = (-d.HitLine.delta.y,d.HitLine.delta.x,0).unit(); - if ( !d.LineSide ) hitnormal *= -1; - } + hitnormal = SWWMUtility.GetLineTraceHitNormal(d); let p = Spawn("EvisceratorSubExpl",d.HitLocation+hitnormal*4); p.angle = atan2(hitnormal.y,hitnormal.x); p.pitch = asin(-hitnormal.z); diff --git a/zscript/weapons/swwm_deathlydeathcannon_altfx.zsc b/zscript/weapons/swwm_deathlydeathcannon_altfx.zsc index f37ea062f..630574e82 100644 --- a/zscript/weapons/swwm_deathlydeathcannon_altfx.zsc +++ b/zscript/weapons/swwm_deathlydeathcannon_altfx.zsc @@ -395,27 +395,12 @@ Class YnykronLightningArc : SWWMNonInteractiveActor let p = SWWMPuff.Setup(hit.hitlocation,hit.x,self,target,hit.hitactor); hit.hitactor.DamageMobj(p,target,GetMissileDamage(0,0),'Electric',DMG_THRUSTLESS|DMG_INFLICTOR_IS_PUFF); } - Vector3 normal = -t.Results.HitVector, dir = t.Results.HitVector; + Vector3 normal = SWWMUtility.GetLineTracerHitNormal(t.Results), dir = t.Results.HitVector; if ( t.Results.HitType != TRACE_HitNone ) { if ( t.Results.HitType != TRACE_HasHitSky ) { - if ( t.Results.HitType == TRACE_HitWall ) - { - normal = (-t.Results.HitLine.delta.y,t.Results.HitLine.delta.x,0).unit(); - if ( !t.Results.Side ) normal *= -1; - t.Results.HitLine.RemoteActivate(target,t.Results.Side,SPAC_Impact,t.Results.HitPos); - } - else if ( t.Results.HitType == TRACE_HitFloor ) - { - if ( t.Results.ffloor ) normal = -t.Results.ffloor.top.Normal; - else normal = t.Results.HitSector.floorplane.Normal; - } - else if ( t.Results.HitType == TRACE_HitCeiling ) - { - if ( t.Results.ffloor ) normal = -t.Results.ffloor.bottom.Normal; - else normal = t.Results.HitSector.ceilingplane.Normal; - } + if ( t.Results.HitType == TRACE_HitWall ) t.Results.HitLine.RemoteActivate(target,t.Results.Side,SPAC_Impact,t.Results.HitPos); let s = Spawn("YnykronLightningImpact",level.Vec3Offset(t.Results.HitPos,normal*8)); s.target = target; s.angle = atan2(normal.y,normal.x); @@ -1040,23 +1025,7 @@ Class YnykronSingularity : SWWMNonInteractiveActor FLineTraceData d; double dst = FRandom[ExploS](1500,2000)*scale.x; LineTrace(ang,dst,pt,TRF_THRUACTORS|TRF_THRUHITSCAN,data:d); - Vector3 norm; - if ( d.HitType == TRACE_HitWall ) - { - norm = (d.HitLine.delta.y,-d.HitLine.delta.x,0).unit(); - if ( d.LineSide ) norm *= -1; - } - else if ( d.HitType == TRACE_HitFloor ) - { - if ( d.Hit3DFloor ) norm = -d.Hit3DFloor.top.Normal; - else norm = d.HitSector.floorplane.Normal; - } - else if ( d.HitType == TRACE_HitCeiling ) - { - if ( d.Hit3DFloor ) norm = -d.Hit3DFloor.bottom.Normal; - else norm = d.HitSector.ceilingplane.Normal; - } - else norm = (0,0,0); + Vector3 norm = SWWMUtility.GetLineTraceHitNormal(d); let gd = Spawn("GatherDust",level.Vec3Offset(d.HitLocation,norm*8)); gd.target = self; } @@ -1325,22 +1294,7 @@ Class YnykronSingularity : SWWMNonInteractiveActor while ( totaldist > 0 ) { LineTrace(ang,totaldist,pt,TRF_THRUACTORS|TRF_ABSPOSITION,origin.z,origin.x,origin.y,d); - hitnormal = -d.HitDir; - if ( d.HitType == TRACE_HitFloor ) - { - if ( d.Hit3DFloor ) hitnormal = -d.Hit3DFloor.top.Normal; - else hitnormal = d.HitSector.floorplane.Normal; - } - else if ( d.HitType == TRACE_HitCeiling ) - { - if ( d.Hit3DFloor ) hitnormal = -d.Hit3DFloor.bottom.Normal; - else hitnormal = d.HitSector.ceilingplane.Normal; - } - else if ( d.HitType == TRACE_HitWall ) - { - hitnormal = (-d.HitLine.delta.y,d.HitLine.delta.x,0).unit(); - if ( !d.LineSide ) hitnormal *= -1; - } + HitNormal = SWWMUtility.GetLineTraceHitNormal(d); totaldist -= d.Distance; if ( totaldist > 0 ) { @@ -1419,23 +1373,8 @@ Class YnykronAltBeam : SWWMNonInteractiveActor if ( t.Results.HitType != TRACE_HitNone ) { // hit something - Vector3 norm = -t.Results.HitVector; - if ( t.Results.HitType == TRACE_HitWall ) - { - norm = (t.Results.HitLine.delta.y,-t.Results.HitLine.delta.x,0).unit(); - if ( t.Results.Side ) norm *= -1; - t.Results.HitLine.RemoteActivate(tracer,t.Results.Side,SPAC_Impact,t.Results.HitPos); - } - else if ( t.Results.HitType == TRACE_HitFloor ) - { - if ( t.Results.ffloor ) norm = -t.Results.ffloor.top.Normal; - else norm = t.Results.HitSector.floorplane.Normal; - } - else if ( t.Results.HitType == TRACE_HitCeiling ) - { - if ( t.Results.ffloor ) norm = -t.Results.ffloor.bottom.Normal; - else norm = t.Results.HitSector.ceilingplane.Normal; - } + Vector3 norm = SWWMUtility.GetLineTracerHitNormal(t.Results); + if ( t.Results.HitType == TRACE_HitWall ) t.Results.HitLine.RemoteActivate(tracer,t.Results.Side,SPAC_Impact,t.Results.HitPos); let b = Spawn("YnykronSingularity",level.Vec3Offset(t.Results.HitPos,norm*16)); b.target = target; b.angle = atan2(norm.y,norm.x); diff --git a/zscript/weapons/swwm_deathlydeathcannon_fx.zsc b/zscript/weapons/swwm_deathlydeathcannon_fx.zsc index 136a7fa6c..d2ffff41b 100644 --- a/zscript/weapons/swwm_deathlydeathcannon_fx.zsc +++ b/zscript/weapons/swwm_deathlydeathcannon_fx.zsc @@ -690,23 +690,8 @@ Class YnykronBeam : SWWMNonInteractiveActor if ( t.Results.HitType != TRACE_HitNone ) { // hit something - Vector3 norm = -t.Results.HitVector; - if ( t.Results.HitType == TRACE_HitWall ) - { - norm = (t.Results.HitLine.delta.y,-t.Results.HitLine.delta.x,0).unit(); - if ( t.Results.Side ) norm *= -1; - t.Results.HitLine.RemoteActivate(tracer,t.Results.Side,SPAC_Impact,t.Results.HitPos); - } - else if ( t.Results.HitType == TRACE_HitFloor ) - { - if ( t.Results.ffloor ) norm = -t.Results.ffloor.top.Normal; - else norm = t.Results.HitSector.floorplane.Normal; - } - else if ( t.Results.HitType == TRACE_HitCeiling ) - { - if ( t.Results.ffloor ) norm = -t.Results.ffloor.bottom.Normal; - else norm = t.Results.HitSector.ceilingplane.Normal; - } + Vector3 norm = SWWMUtility.GetLineTracerHitNormal(t.Results); + if ( t.Results.HitType == TRACE_HitWall ) t.Results.HitLine.RemoteActivate(tracer,t.Results.Side,SPAC_Impact,t.Results.HitPos); let b = Spawn("YnykronImpact",level.Vec3Offset(t.Results.HitPos,norm*16)); b.target = target; b.master = master; diff --git a/zscript/weapons/swwm_shot.zsc b/zscript/weapons/swwm_shot.zsc index 475988b7a..4934ca7ae 100644 --- a/zscript/weapons/swwm_shot.zsc +++ b/zscript/weapons/swwm_shot.zsc @@ -198,28 +198,13 @@ Class Spreadgun : SWWMWeapon } if ( (t.Results.HitType != TRACE_HitNone) && (t.Results.HitType != TRACE_HasHitSky) && (t.Results.HitType != TRACE_HitActor) ) { - Vector3 hitnormal = -t.Results.HitVector; - if ( t.Results.HitType == TRACE_HitFloor ) - { - if ( t.Results.FFloor ) hitnormal = -t.Results.FFloor.top.Normal; - else hitnormal = t.Results.HitSector.floorplane.Normal; - } - else if ( t.Results.HitType == TRACE_HitCeiling ) - { - if ( t.Results.FFloor ) hitnormal = -t.Results.FFloor.bottom.Normal; - else hitnormal = t.Results.HitSector.ceilingplane.Normal; - } - else if ( t.Results.HitType == TRACE_HitWall ) - { - hitnormal = (-t.Results.HitLine.delta.y,t.Results.HitLine.delta.x,0).unit(); - if ( !t.Results.Side ) hitnormal *= -1; - } + Vector3 hitnormal = SWWMUtility.GetLineTracerHitNormal(t.Results); let p = Spawn(impact,t.Results.HitPos+hitnormal*4); p.angle = atan2(hitnormal.y,hitnormal.x); p.pitch = asin(-hitnormal.z); p.target = self; if ( t.Results.HitType == TRACE_HitFloor ) p.CheckSplash(40); - if ( t.Results.HitLine ) t.Results.HitLine.RemoteActivate(self,t.Results.Side,SPAC_Impact,t.Results.HitPos); + if ( t.Results.HitType == TRACE_HitWall ) t.Results.HitLine.RemoteActivate(self,t.Results.Side,SPAC_Impact,t.Results.HitPos); } } @@ -266,27 +251,12 @@ Class Spreadgun : SWWMWeapon SWWMBulletTrail.DoTrail(self,origin,dir,10000,2,true); if ( d.HitType != TRACE_HitNone ) { - Vector3 hitnormal = -d.HitDir; - if ( d.HitType == TRACE_HitFloor ) - { - if ( d.Hit3DFloor ) hitnormal = -d.Hit3DFloor.top.Normal; - else hitnormal = d.HitSector.floorplane.Normal; - } - else if ( d.HitType == TRACE_HitCeiling ) - { - if ( d.Hit3DFloor ) hitnormal = -d.Hit3DFloor.bottom.Normal; - else hitnormal = d.HitSector.ceilingplane.Normal; - } - else if ( d.HitType == TRACE_HitWall ) - { - hitnormal = (-d.HitLine.delta.y,d.HitLine.delta.x,0).unit(); - if ( !d.LineSide ) hitnormal *= -1; - } + Vector3 hitnormal = SWWMUtility.GetLineTraceHitNormal(d); let p = Spawn("SWWMBulletImpact",d.HitLocation+hitnormal); p.angle = atan2(hitnormal.y,hitnormal.x); p.pitch = asin(-hitnormal.z); p.target = self; - if ( d.HitLine ) d.HitLine.RemoteActivate(self,d.LineSide,SPAC_Impact,d.HitLocation); + if ( d.HitType == TRACE_HitWall ) d.HitLine.RemoteActivate(self,d.LineSide,SPAC_Impact,d.HitLocation); let b = Spawn("GoldenImpact",d.HitLocation+hitnormal*4.); b.angle = atan2(hitnormal.y,hitnormal.x); b.pitch = asin(-hitnormal.z); diff --git a/zscript/weapons/swwm_shot_fx.zsc b/zscript/weapons/swwm_shot_fx.zsc index 702538428..51addb38b 100644 --- a/zscript/weapons/swwm_shot_fx.zsc +++ b/zscript/weapons/swwm_shot_fx.zsc @@ -159,22 +159,7 @@ Class GoldenImpact : SWWMNonInteractiveActor while ( totaldist > 0 ) { LineTrace(ang,totaldist,pt,TRF_THRUACTORS|TRF_ABSPOSITION,origin.z,origin.x,origin.y,d); - hitnormal = -d.HitDir; - if ( d.HitType == TRACE_HitFloor ) - { - if ( d.Hit3DFloor ) hitnormal = -d.Hit3DFloor.top.Normal; - else hitnormal = d.HitSector.floorplane.Normal; - } - else if ( d.HitType == TRACE_HitCeiling ) - { - if ( d.Hit3DFloor ) hitnormal = -d.Hit3DFloor.bottom.Normal; - else hitnormal = d.HitSector.ceilingplane.Normal; - } - else if ( d.HitType == TRACE_HitWall ) - { - hitnormal = (-d.HitLine.delta.y,d.HitLine.delta.x,0).unit(); - if ( !d.LineSide ) hitnormal *= -1; - } + HitNormal = SWWMUtility.GetLineTraceHitNormal(d); totaldist -= d.Distance; if ( totaldist > 0 ) { @@ -272,22 +257,7 @@ Class GoldenSubImpact : SWWMNonInteractiveActor while ( totaldist > 0 ) { LineTrace(ang,totaldist,pt,TRF_THRUACTORS|TRF_ABSPOSITION,origin.z,origin.x,origin.y,d); - hitnormal = -d.HitDir; - if ( d.HitType == TRACE_HitFloor ) - { - if ( d.Hit3DFloor ) hitnormal = -d.Hit3DFloor.top.Normal; - else hitnormal = d.HitSector.floorplane.Normal; - } - else if ( d.HitType == TRACE_HitCeiling ) - { - if ( d.Hit3DFloor ) hitnormal = -d.Hit3DFloor.bottom.Normal; - else hitnormal = d.HitSector.ceilingplane.Normal; - } - else if ( d.HitType == TRACE_HitWall ) - { - hitnormal = (-d.HitLine.delta.y,d.HitLine.delta.x,0).unit(); - if ( !d.LineSide ) hitnormal *= -1; - } + HitNormal = SWWMUtility.GetLineTraceHitNormal(d); totaldist -= d.Distance; if ( totaldist > 0 ) { diff --git a/zscript/weapons/swwm_sparkyboi_fx.zsc b/zscript/weapons/swwm_sparkyboi_fx.zsc index 45bda2a75..c10979356 100644 --- a/zscript/weapons/swwm_sparkyboi_fx.zsc +++ b/zscript/weapons/swwm_sparkyboi_fx.zsc @@ -970,22 +970,7 @@ Class BiosparkComboImpact : SWWMNonInteractiveActor FLineTraceData d; Vector3 HitNormal; LineTrace(ang,FRandom[Sparkster](10,20)+mul*special2,pt,TRF_THRUACTORS,data:d); - hitnormal = -d.HitDir; - if ( d.HitType == TRACE_HitFloor ) - { - if ( d.Hit3DFloor ) hitnormal = -d.Hit3DFloor.top.Normal; - else hitnormal = d.HitSector.floorplane.Normal; - } - else if ( d.HitType == TRACE_HitCeiling ) - { - if ( d.Hit3DFloor ) hitnormal = -d.Hit3DFloor.bottom.Normal; - else hitnormal = d.HitSector.ceilingplane.Normal; - } - else if ( d.HitType == TRACE_HitWall ) - { - hitnormal = (-d.HitLine.delta.y,d.HitLine.delta.x,0).unit(); - if ( !d.LineSide ) hitnormal *= -1; - } + hitnormal = SWWMUtility.GetLineTraceHitNormal(d); let p = Spawn("BiosparkComboImpactSub",d.HitLocation+hitnormal*4); p.angle = atan2(hitnormal.y,hitnormal.x); p.pitch = asin(-hitnormal.z); @@ -1056,25 +1041,8 @@ Class BiosparkBeam : SWWMNonInteractiveActor hit.hitactor.Howl(); } } - Vector3 normal = -t.Results.HitVector, dir = t.Results.HitVector; - if ( t.Results.HitType == TRACE_HitWall ) - { - normal = (-t.Results.HitLine.delta.y,t.Results.HitLine.delta.x,0).unit(); - if ( !t.Results.Side ) normal *= -1; - t.Results.HitLine.RemoteActivate(target,t.Results.Side,SPAC_Impact,t.Results.HitPos); - } - else if ( t.Results.HitType == TRACE_HitFloor ) - { - if ( t.Results.ffloor ) normal = -t.Results.ffloor.top.Normal; - else normal = t.Results.HitSector.floorplane.Normal; - } - else if ( t.Results.HitType == TRACE_HitCeiling ) - { - if ( t.Results.ffloor ) normal = -t.Results.ffloor.bottom.Normal; - else normal = t.Results.HitSector.ceilingplane.Normal; - } - else normal *= 0; - nextpos = level.Vec3Offset(t.Results.HitPos,normal*8.); + Vector3 normal = SWWMUtility.GetLineTracerHitNormal(t.Results), dir = t.Results.HitVector; + if ( t.Results.HitType == TRACE_HitWall ) t.Results.HitLine.RemoteActivate(target,t.Results.Side,SPAC_Impact,t.Results.HitPos); if ( t.Results.HitType == TRACE_HasHitSky ) { bAMBUSH = true; @@ -1083,7 +1051,7 @@ Class BiosparkBeam : SWWMNonInteractiveActor } if ( t.Results.HitType != TRACE_HitNone ) { - let s = Spawn("BiosparkBeamImpact",nextpos); + let s = Spawn("BiosparkBeamImpact",t.Results.HitPos+normal*8.); s.target = target; s.angle = atan2(normal.y,normal.x); s.pitch = asin(-normal.z); @@ -1092,6 +1060,7 @@ Class BiosparkBeam : SWWMNonInteractiveActor speed = t.Results.Distance; // shortens in minimap return; } + nextpos = t.Results.HitPos; double closest = double.infinity; let bt = BlockThingsIterator.Create(self,500); while ( bt.Next() ) @@ -1378,35 +1347,20 @@ Class BiosparkArc : SWWMNonInteractiveActor if ( hit.hitactor && hit.hitactor.bISMONSTER && !Random[Sparkster](0,3) ) hit.hitactor.Howl(); } - Vector3 normal = -t.Results.HitVector, dir = t.Results.HitVector; - if ( t.Results.HitType == TRACE_HitWall ) - { - normal = (-t.Results.HitLine.delta.y,t.Results.HitLine.delta.x,0).unit(); - if ( !t.Results.Side ) normal *= -1; - t.Results.HitLine.RemoteActivate(target,t.Results.Side,SPAC_Impact,t.Results.HitPos); - dir -= 2*normal*(dir dot normal); - } - else if ( t.Results.HitType == TRACE_HitFloor ) - { - if ( t.Results.ffloor ) normal = -t.Results.ffloor.top.Normal; - else normal = t.Results.HitSector.floorplane.Normal; - dir -= 2*normal*(dir dot normal); - } - else if ( t.Results.HitType == TRACE_HitCeiling ) - { - if ( t.Results.ffloor ) normal = -t.Results.ffloor.bottom.Normal; - else normal = t.Results.HitSector.ceilingplane.Normal; - dir -= 2*normal*(dir dot normal); - } - else normal *= 0; - nextpos = level.Vec3Offset(t.Results.HitPos,normal); - if ( t.Results.HitType != TRACE_HitNone ) speed = t.Results.Distance; // shortens in minimap + Vector3 normal = SWWMUtility.GetLineTracerHitNormal(t.Results), dir = t.Results.HitVector; + if ( t.Results.HitType == TRACE_HitWall ) t.Results.HitLine.RemoteActivate(target,t.Results.Side,SPAC_Impact,t.Results.HitPos); if ( t.Results.HitType == TRACE_HasHitSky ) { bAMBUSH = true; speed = t.Results.Distance; // shortens in minimap return; } + if ( t.Results.HitType != TRACE_HitNone ) + { + speed = t.Results.Distance; // shortens in minimap + nextpos = level.Vec3Offset(t.Results.HitPos,normal); // offset by normal so next segment doesn't spawn inside walls + } + else nextpos = t.Results.HitPos; double a = FRandom[Sparkster](0,360), s = FRandom[Sparkster](0.,.8); dir = SWWMUtility.ConeSpread(dir,y,z,a,s); if ( master ) @@ -1608,45 +1562,7 @@ Class BiosparkCore : Actor void A_HandleBounce() { bHITOWNER = true; - Vector3 HitNormal = -vel.unit(); - F3DFloor ff; - if ( BlockingFloor ) - { - // find closest 3d floor for its normal - for ( int i=0; i pop = "CandyPop", Class smk = "SWWMHalfSmoke" ) diff --git a/zscript/weapons/swwm_thiccboolet.zsc b/zscript/weapons/swwm_thiccboolet.zsc index e7790c8d6..0cd835d2a 100644 --- a/zscript/weapons/swwm_thiccboolet.zsc +++ b/zscript/weapons/swwm_thiccboolet.zsc @@ -357,22 +357,7 @@ Class SilverBullet : SWWMWeapon } if ( (t.Results.HitType != TRACE_HitNone) && (t.Results.HitType != TRACE_HasHitSky) && (t.Results.HitType != TRACE_HitActor) ) { - Vector3 hitnormal = -t.Results.HitVector; - if ( t.Results.HitType == TRACE_HitFloor ) - { - if ( t.Results.FFloor ) hitnormal = -t.Results.FFloor.top.Normal; - else hitnormal = t.Results.HitSector.floorplane.Normal; - } - else if ( t.Results.HitType == TRACE_HitCeiling ) - { - if ( t.Results.FFloor ) hitnormal = -t.Results.FFloor.bottom.Normal; - else hitnormal = t.Results.HitSector.ceilingplane.Normal; - } - else if ( t.Results.HitType == TRACE_HitWall ) - { - hitnormal = (-t.Results.HitLine.delta.y,t.Results.HitLine.delta.x,0).unit(); - if ( !t.Results.Side ) hitnormal *= -1; - } + Vector3 hitnormal = SWWMUtility.GetLineTracerHitNormal(t.Results); let p = Spawn("SilverImpact",t.Results.HitPos+hitnormal*4); p.angle = atan2(hitnormal.y,hitnormal.x); p.pitch = asin(-hitnormal.z);