From 182c209080ab7f79f1ac5137306f654bfe062fdb Mon Sep 17 00:00:00 2001 From: Marisa Kirisame Date: Thu, 16 Sep 2021 21:09:33 +0200 Subject: [PATCH] Fix ammo drops in "on-demand" replacement mode. --- language.version | 4 ++-- zscript/items/swwm_ammospawn.zsc | 33 +++++++++++++++++++++++++++++ zscript/items/swwm_baseammo.zsc | 13 +++++++++++- zscript/weapons/swwm_baseweapon.zsc | 17 +++++++++------ 4 files changed, 58 insertions(+), 9 deletions(-) diff --git a/language.version b/language.version index f31bc0987..7c7d9b3f5 100644 --- a/language.version +++ b/language.version @@ -1,3 +1,3 @@ [default] -SWWM_MODVER="\chSWWM \czGZ\c- \cw1.1pre r24 \cu(Thu 16 Sep 20:28:45 CEST 2021)\c-"; -SWWM_SHORTVER="\cw1.1pre r24 \cu(2021-09-16 20:28:45)\c-"; +SWWM_MODVER="\chSWWM \czGZ\c- \cw1.1pre r25 \cu(Thu 16 Sep 21:09:33 CEST 2021)\c-"; +SWWM_SHORTVER="\cw1.1pre r25 \cu(2021-09-16 21:09:33)\c-"; diff --git a/zscript/items/swwm_ammospawn.zsc b/zscript/items/swwm_ammospawn.zsc index 723bc6812..f5cb53281 100644 --- a/zscript/items/swwm_ammospawn.zsc +++ b/zscript/items/swwm_ammospawn.zsc @@ -1,11 +1,44 @@ // on-demand ammo spawners Mixin Class SWWMOndemandAmmoSpawner { + Actor dropper; + bool enemydrop; + int dropamount; + + override void ModifyDropAmount( int amt ) + { + dropamount = amt; + } + + override bool SpecialDropAction( Actor dropper ) + { + self.dropper = dropper; + enemydrop = true; + return false; + } + override void SpawnAmmo() { let ac = PickAmmo(); if ( !ac ) return; let a = Spawn(ac,pos); + if ( enemydrop ) + { + a.bDropped = true; + a.bNoGravity = false; + if ( !(level.compatflags&COMPATF_NOTOSSDROPS) ) + a.TossItem(); + if ( a is 'Inventory' ) + { + let i = Inventory(a); + i.bTossed = true; + if ( i.SpecialDropAction(dropper) ) + { + i.Destroy(); + return; + } + } + } SWWMUtility.TransferItemProp(self,a); } } diff --git a/zscript/items/swwm_baseammo.zsc b/zscript/items/swwm_baseammo.zsc index 7109c8a8e..6c2bfbecb 100644 --- a/zscript/items/swwm_baseammo.zsc +++ b/zscript/items/swwm_baseammo.zsc @@ -579,7 +579,7 @@ Class MagAmmo : Inventory abstract } // Ref class for ammo spawners, used by on-demand replacers -Class SWWMAmmoSpawner : Actor abstract +Class SWWMAmmoSpawner : Inventory abstract { virtual void SpawnAmmo() {} @@ -590,6 +590,16 @@ Class SWWMAmmoSpawner : Actor abstract Destroy(); } + override bool CanPickup( Actor toucher ) + { + return false; + } + + override bool TryPickup( in out Actor toucher ) + { + return false; + } + default { +NOGRAVITY; @@ -597,5 +607,6 @@ Class SWWMAmmoSpawner : Actor abstract +NOINTERACTION; +NOTELEPORT; +DONTSPLASH; + -SPECIAL; } } diff --git a/zscript/weapons/swwm_baseweapon.zsc b/zscript/weapons/swwm_baseweapon.zsc index fcc740d48..9dd2afd26 100644 --- a/zscript/weapons/swwm_baseweapon.zsc +++ b/zscript/weapons/swwm_baseweapon.zsc @@ -12,6 +12,7 @@ Class SWWMWeapon : Weapon abstract String tooltip; bool tooltipsent; Class dropammotype; + int dropamount; Property Tooltip : tooltip; Property DropAmmoType : dropammotype; @@ -395,6 +396,7 @@ Class SWWMWeapon : Weapon abstract } override void ModifyDropAmount( int dropamount ) { + self.dropamount = dropamount; Super.ModifyDropAmount(dropamount); if ( (AmmoGive1 <= 0) && (default.AmmoGive1 > 0) ) AmmoGive1 = 1; @@ -412,17 +414,20 @@ Class SWWMWeapon : Weapon abstract return false; // drop us // drop our corresponding ammo if ( !DropAmmoType ) return true; - let a = Inventory(Spawn(DropAmmoType,pos,ALLOW_REPLACE)); + let a = Spawn(DropAmmoType,pos,ALLOW_REPLACE); if ( !a ) return true; a.bDROPPED = true; a.bNOGRAVITY = false; if ( !(level.compatflags&COMPATF_NOTOSSDROPS) ) a.TossItem(); - if ( a is 'Ammo' ) - a.ModifyDropAmount(Ammo(a).DropAmount); - a.bTOSSED = true; - if ( a.SpecialDropAction(dropper) ) - a.Destroy(); + if ( a is 'Inventory' ) + { + let i = Inventory(a); + i.ModifyDropAmount(dropamount); + i.bTOSSED = true; + if ( i.SpecialDropAction(dropper) ) + i.Destroy(); + } return true; } // no weapon drops from enemies