diff --git a/language.version b/language.version index bbf3c05d2..09c528d3f 100644 --- a/language.version +++ b/language.version @@ -1,3 +1,3 @@ [default] -SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r740 \cu(Thu 19 Jan 09:47:00 CET 2023)\c-"; -SWWM_SHORTVER="\cw1.3pre r740 \cu(2023-01-19 09:47:00)\c-"; +SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r741 \cu(Thu 19 Jan 10:09:20 CET 2023)\c-"; +SWWM_SHORTVER="\cw1.3pre r741 \cu(2023-01-19 10:09:20)\c-"; diff --git a/zscript/player/swwm_player.zsc b/zscript/player/swwm_player.zsc index d898451cb..9fe113ca6 100644 --- a/zscript/player/swwm_player.zsc +++ b/zscript/player/swwm_player.zsc @@ -81,8 +81,9 @@ Class Demolitionist : PlayerPawn bool hitactivate; Actor froggy; - transient int lastuse, failcounter, failcooldown; + transient int lastuse, failcounter, failcooldown, mirrorcooldown; transient SWWMItemTracer itrace; + transient SWWMMirrorTracer mtrace; bool meleeuse; transient bool bWalking; diff --git a/zscript/player/swwm_player_fx.zsc b/zscript/player/swwm_player_fx.zsc index 852fd293a..2fe808b0d 100644 --- a/zscript/player/swwm_player_fx.zsc +++ b/zscript/player/swwm_player_fx.zsc @@ -55,7 +55,7 @@ Class SWWMItemTracer : LineTracer if ( (Results.HitActor is 'Inventory') && Results.HitActor.bSPECIAL ) return TRACE_Stop; return TRACE_Skip; } - else if ( (Results.HitType == TRACE_HitWall) && (Results.Tier == TIER_Middle) ) + if ( (Results.HitType == TRACE_HitWall) && (Results.Tier == TIER_Middle) ) { if ( !Results.HitLine.sidedef[1] || (Results.HitLine.Flags&(Line.ML_BlockUse|Line.ML_BlockEverything)) ) return TRACE_Stop; @@ -65,6 +65,21 @@ Class SWWMItemTracer : LineTracer } } +// finds the closest reflective surface +// can only match lines, as reflective sector plane data isn't obtainable from zscript +Class SWWMMirrorTracer : LineTracer +{ + override ETraceStatus TraceCallback() + { + if ( Results.HitType == TRACE_HitWall ) + { + if ( !Results.HitLine.sidedef[1] && (Results.HitLine.special == Line_Mirror) ) + return TRACE_Stop; + } + return TRACE_Skip; + } +} + Class DashTrail : SWWMNonInteractiveActor { Mixin SWWMMinimalMovingWaterTick; diff --git a/zscript/player/swwm_player_think.zsc b/zscript/player/swwm_player_think.zsc index dce7de18e..fbeab6ad0 100644 --- a/zscript/player/swwm_player_think.zsc +++ b/zscript/player/swwm_player_think.zsc @@ -181,6 +181,21 @@ extend Class Demolitionist } } + bool CheckMirrorUse() + { + if ( !mtrace ) mtrace = new("SWWMMirrorTracer"); + Vector3 dir = SWWMUtility.GetPlayerAimDir(self); + Vector3 origin = SWWMUtility.GetPlayerEye(self); + mtrace.Trace(origin,level.PointInSector(origin.xy),dir,UseRange,0,ignoreallactors:true); + if ( mtrace.Results.HitType != TRACE_HitWall ) return false; + // there's a mirror here + if ( (gametic > mirrorcooldown) && (swwm_mutevoice < 2) ) + mirrorcooldown = SWWMHandler.AddOneliner("mirror",2,10)+70; + // mute fail use + A_StopSound(CHAN_VOICE); + return true; + } + override void PlayerThink() { oldangles = (angle,pitch,roll); @@ -194,7 +209,7 @@ extend Class Demolitionist CheckItemUsePickup(); } Super.PlayerThink(); - if ( (gametic == lastuse) && IsActorPlayingSound(CHAN_VOICE,"*usefail") ) + if ( (gametic == lastuse) && IsActorPlayingSound(CHAN_VOICE,"*usefail") && !CheckMirrorUse() ) // don't play fail use if we're checking out a mirror { failcounter++; if ( (failcounter > 8) && !Random[DemoLines](0,max(0,12-failcounter/3)) && (gametic > failcooldown) && (swwm_mutevoice < 2) )