diff --git a/language.version b/language.version index a4be9a002..86f5eb393 100644 --- a/language.version +++ b/language.version @@ -1,3 +1,3 @@ [default] -SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r732 \cu(Thu 19 Jan 10:11:24 CET 2023)\c-"; -SWWM_SHORTVER="\cw1.3pre r732 \cu(2023-01-19 10:11:24)\c-"; +SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r733 \cu(Thu 19 Jan 10:13:21 CET 2023)\c-"; +SWWM_SHORTVER="\cw1.3pre r733 \cu(2023-01-19 10:13:21)\c-"; diff --git a/zscript/player/swwm_player.zsc b/zscript/player/swwm_player.zsc index 09861a941..a7d3e1de9 100644 --- a/zscript/player/swwm_player.zsc +++ b/zscript/player/swwm_player.zsc @@ -80,8 +80,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 02be8064f..b95b975dd 100644 --- a/zscript/player/swwm_player_fx.zsc +++ b/zscript/player/swwm_player_fx.zsc @@ -45,6 +45,21 @@ Class SWWMMagItem play } } +// 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 875e0af07..2e69d2570 100644 --- a/zscript/player/swwm_player_think.zsc +++ b/zscript/player/swwm_player_think.zsc @@ -183,6 +183,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() { oldangle = angle; @@ -198,7 +213,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) )