From bba6a6d0d7853620c63c41008915af83dcce954c Mon Sep 17 00:00:00 2001 From: Marisa the Magician Date: Tue, 30 Aug 2022 20:43:12 +0200 Subject: [PATCH] Fix swap weapons + item respawn glitch. --- language.version | 4 +-- zscript/weapons/swwm_baseweapon.zsc | 39 ++++++++++++++++++++++++++++- 2 files changed, 40 insertions(+), 3 deletions(-) diff --git a/language.version b/language.version index dfa516df9..b472bf714 100644 --- a/language.version +++ b/language.version @@ -1,3 +1,3 @@ [default] -SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r388 \cu(Tue 30 Aug 18:29:25 CEST 2022)\c-"; -SWWM_SHORTVER="\cw1.3pre r388 \cu(2022-08-30 18:29:25)\c-"; +SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r389 \cu(Tue 30 Aug 20:43:12 CEST 2022)\c-"; +SWWM_SHORTVER="\cw1.3pre r389 \cu(2022-08-30 20:43:12)\c-"; diff --git a/zscript/weapons/swwm_baseweapon.zsc b/zscript/weapons/swwm_baseweapon.zsc index d6088c664..300988602 100644 --- a/zscript/weapons/swwm_baseweapon.zsc +++ b/zscript/weapons/swwm_baseweapon.zsc @@ -2,7 +2,6 @@ Class SWWMWeapon : Weapon abstract { Mixin SWWMOverlapPickupSound; - Mixin SWWMRespawn; bool wasused; bool bUsePickup; @@ -20,6 +19,7 @@ Class SWWMWeapon : Weapon abstract FlagDef HideInMenu : SWeaponFlags, 1; // don't show in inventory menu (usually for sister weapons) FlagDef NoSwapWeapon : SWeaponFlags, 2; // weapon is not affected by slot swapping FlagDef HasScrTex : SWeaponFlags, 3; // weapon model has a scripted texture (calls RenderTexture() from Event Handler) + FlagDef SwappedTo : SWeaponFlags, 4; // this weapon was swapped to on pickup (so it won't respawn) int oldtagcolor; @@ -143,11 +143,13 @@ Class SWWMWeapon : Weapon abstract } } bUsePickup = true; + bSWAPPEDTO = true; Touch(user); bUsePickup = false; // we got picked up if ( bDestroyed || Owner || !bSPECIAL ) { + bSWAPPEDTO = false; // clear this flag // autoswitch to us if we got swapped if ( swapto ) user.A_SelectWeapon(GetClass()); Vector3 tracedir = level.Vec3Diff(userpos,itempos); @@ -317,6 +319,40 @@ Class SWWMWeapon : Weapon abstract if ( !bDROPPED && (deathmatch || alwaysapplydmflags) && sv_weaponstay ) return true; return false; } + // we need to copy this since we can't re-use the mixin + override void Hide() + { + bSPECIAL = false; + bNOGRAVITY = true; + bINVISIBLE = true; + SetState(FindState("HideDoomish")); + tics = 1050; + if ( (self is 'Ammo') || (self is 'MagAmmo') ) + tics -= 350; + if ( self.bBIGPOWERUP || SWWMUtility.IsVIPItem(self) ) + tics += 1050; + if ( RespawnTics != 0 ) tics = RespawnTics; + if ( ShouldRespawn() ) + { + Vector3 oldpos = pos; + A_RestoreSpecialPosition(); + let t = Spawn("SWWMRespawnTimer",pos); + t.tracer = self; + t.special1 = tics; + t.A_SetSize(radius,height); + SetOrigin(oldpos,false); + } + } + override bool ShouldRespawn() + { + // swapped-to weapons do not respawn + if ( bSWAPPEDTO ) return false; + // always respawn in DM + if ( deathmatch && !bNEVERRESPAWN ) return true; + if ( (bBigPowerup || SWWMUtility.IsVIPItem(self)) && !sv_respawnsuper ) return false; + if ( bNEVERRESPAWN ) return false; + return (sv_itemrespawn||bALWAYSRESPAWN); + } override void AttachToOwner( Actor other ) { Inventory.AttachToOwner(other); @@ -331,6 +367,7 @@ Class SWWMWeapon : Weapon abstract StatusBar.ReceivedWeapon(self); } GivenAsMorphWeapon = false; + bSwappedTo = false; } override void OwnerDied() {