diff --git a/wadsrc/static/zscript/actors/actor.zs b/wadsrc/static/zscript/actors/actor.zs index 72f441b10c..7c52030da2 100644 --- a/wadsrc/static/zscript/actors/actor.zs +++ b/wadsrc/static/zscript/actors/actor.zs @@ -509,6 +509,11 @@ class Actor : Thinker native native clearscope void DisableLocalRendering(uint playerNum, bool disable); native ui bool ShouldRenderLocally(); // Only clients get to check this, never the playsim. + // Called when the Actor is being used within a PSprite. This happens before potentially changing PSprite + // state so that any custom actions based on things like player input can be done before moving to the next + // state of something like a weapon. + virtual void PSpriteTick(PSprite psp) {} + // Called by inventory items to see if this actor is capable of touching them. // If true, the item will attempt to be picked up. Useful for things like // allowing morphs to pick up limited items such as keys while preventing diff --git a/wadsrc/static/zscript/actors/player/player.zs b/wadsrc/static/zscript/actors/player/player.zs index 65fc289438..0cee7a7f32 100644 --- a/wadsrc/static/zscript/actors/player/player.zs +++ b/wadsrc/static/zscript/actors/player/player.zs @@ -2708,13 +2708,23 @@ class PSprite : Object native play { if (processPending) { - // drop tic count and possibly change state - if (Tics != -1) // a -1 tic count never changes + if (Caller) { - Tics--; - // [BC] Apply double firing speed. - if (bPowDouble && Tics && (Owner.mo.FindInventory ("PowerDoubleFiringSpeed", true))) Tics--; - if (!Tics && Caller != null) SetState(CurState.NextState); + Caller.PSpriteTick(self); + if (bDestroyed) + return; + } + + if (processPending) + { + // drop tic count and possibly change state + if (Tics != -1) // a -1 tic count never changes + { + Tics--; + // [BC] Apply double firing speed. + if (bPowDouble && Tics && (Owner.mo.FindInventory ("PowerDoubleFiringSpeed", true))) Tics--; + if (!Tics && Caller != null) SetState(CurState.NextState); + } } } }