Multiplayer-related tweaks.

This commit is contained in:
Mari the Deer 2021-05-23 14:05:28 +02:00
commit 749a2c7708
20 changed files with 199 additions and 33 deletions

View file

@ -696,6 +696,7 @@ SWWM_LOVED_ALT = "F\cg♥\c-CK NAZIS";
SWWM_FROGGED = "RIBBIT";
SWWM_PARRY = "Parry";
SWWM_PPARRY = "Perfect Parry";
SWWM_TRESPAWN = "\cu[\cf%ds\c- to respawn\cu]\c-";
// score messages
SWWM_FINDSECRET = "\cf%s\cf found a secret. +%d\c-";
SWWM_FINDKEY = "\cf%s\cf got the %s\cf. +%d\c-";

View file

@ -598,6 +598,7 @@ SWWM_BUTTSLAM = "Culazo";
SWWM_FROGGED = "CROAC";
SWWM_PARRY = "Parada";
SWWM_PPARRY = "Parada Perfecta";
SWWM_TRESPAWN = "\cu[\cf%ds\c- para reaparecer\cu]\c-";
// score messages
SWWM_FINDSECRET = "\cf%s\cf encontró un secreto. +%d\c-";
SWWM_FINDKEY = "\cf%s\cf obtuvo la %s\cf. +%d\c-";

View file

@ -1,3 +1,3 @@
[default]
SWWM_MODVER="\chSWWM \czGZ\c- \cw0.9.11b-pre r505 \cu(Sun 23 May 10:32:23 CEST 2021)\c-";
SWWM_SHORTVER="\cw0.9.11b-pre r505 \cu(2021-05-23 10:32:23)\c-";
SWWM_MODVER="\chSWWM \czGZ\c- \cw0.9.11b-pre r505 \cu(Sun 23 May 14:05:28 CEST 2021)\c-";
SWWM_SHORTVER="\cw0.9.11b-pre r505 \cu(2021-05-23 14:05:28)\c-";

View file

@ -6,6 +6,7 @@ Class SMW05Ammo : Ammo
Mixin SWWMAmmo;
Mixin SWWMOverlapPickupSound;
Mixin SWWMUseToPickup;
Mixin SWWMRespawn;
Default
{
@ -46,6 +47,7 @@ Class SMW05BundleSpawn : Actor
a.bCOUNTSECRET = true;
level.total_secrets++;
}
a.bDROPPED = bDROPPED;
}
Destroy();
}
@ -72,6 +74,7 @@ Class SheenAmmo : Ammo
Mixin SWWMAmmo;
Mixin SWWMOverlapPickupSound;
Mixin SWWMUseToPickup;
Mixin SWWMRespawn;
override string PickupMessage()
{
@ -136,6 +139,7 @@ Class QuadravolAmmo : Ammo
Mixin SWWMAmmo;
Mixin SWWMOverlapPickupSound;
Mixin SWWMUseToPickup;
Mixin SWWMRespawn;
Default
{
@ -183,6 +187,7 @@ Class QuadravolAmmoBundleSpawn : Actor
a.bCOUNTSECRET = true;
level.total_secrets++;
}
a.bDROPPED = bDROPPED;
}
Destroy();
}
@ -193,6 +198,7 @@ Class DarkCanister : Ammo
Mixin SWWMAmmo;
Mixin SWWMOverlapPickupSound;
Mixin SWWMUseToPickup;
Mixin SWWMRespawn;
Default
{
@ -274,6 +280,7 @@ Class EMPCoreBundleSpawn : Actor
a.bCOUNTSECRET = true;
level.total_secrets++;
}
a.bDROPPED = bDROPPED;
}
Destroy();
}
@ -317,6 +324,7 @@ Class RayBoltBundleSpawn : Actor
a.bCOUNTSECRET = true;
level.total_secrets++;
}
a.bDROPPED = bDROPPED;
}
Destroy();
}
@ -327,6 +335,7 @@ Class RayAmmo : Ammo
Mixin SWWMAmmo;
Mixin SWWMOverlapPickupSound;
Mixin SWWMUseToPickup;
Mixin SWWMRespawn;
Default
{
@ -361,6 +370,7 @@ Class RayBattery : Ammo
Mixin SWWMAmmo;
Mixin SWWMOverlapPickupSound;
Mixin SWWMUseToPickup;
Mixin SWWMRespawn;
Default
{
@ -418,6 +428,7 @@ Class GrandAmmo : Ammo
Mixin SWWMAmmo;
Mixin SWWMOverlapPickupSound;
Mixin SWWMUseToPickup;
Mixin SWWMRespawn;
Default
{

View file

@ -732,6 +732,11 @@ Class SWWMStatusBar : BaseStatusBar
Screen.DrawText(fnt,s.vipitem?Font.CR_PURPLE:s.scoreitem?Font.CR_GOLD:Font.CR_GREEN,(vpos.x-hsd.x*fnt.StringWidth(tag)/2.)/hsd.x,(vpos.y-hsd.y*fnt.GetHeight()/2.)/hsd.y,tag,DTA_VirtualWidthF,ssd.x,DTA_VirtualHeightF,ssd.y,DTA_KeepRatio,true,DTA_Alpha,alph,DTA_ClipTop,cliptop,DTA_ClipBottom,clipbottom,DTA_ClipLeft,clipleft,DTA_ClipRight,clipright);
tag = String.Format("\cu(%s\cu)\c-",FormatDist(tdir.length()));
Screen.DrawText(fnt,Font.CR_WHITE,(vpos.x-hsd.x*fnt.StringWidth(tag)/2.)/hsd.x,(vpos.y+hsd.y*fnt.GetHeight()/2.)/hsd.y,tag,DTA_VirtualWidthF,ssd.x,DTA_VirtualHeightF,ssd.y,DTA_KeepRatio,true,DTA_Alpha,alph,DTA_ClipTop,cliptop,DTA_ClipBottom,clipbottom,DTA_ClipLeft,clipleft,DTA_ClipRight,clipright);
if ( s.item is 'SWWMRespawnTimer' )
{
tag = String.Format(StringTable.Localize("$SWWM_TRESPAWN"),s.item.special2/GameTicRate);
Screen.DrawText(fnt,Font.CR_WHITE,(vpos.x-hsd.x*fnt.StringWidth(tag)/2.)/hsd.x,(vpos.y+hsd.y*fnt.GetHeight()*2)/hsd.y,tag,DTA_VirtualWidthF,ssd.x,DTA_VirtualHeightF,ssd.y,DTA_KeepRatio,true,DTA_Alpha,alph,DTA_ClipTop,cliptop,DTA_ClipBottom,clipbottom,DTA_ClipLeft,clipleft,DTA_ClipRight,clipright);
}
}
}
// targetting array
@ -1570,6 +1575,7 @@ Class SWWMStatusBar : BaseStatusBar
yy += 3;
}
// draw key icons
if ( deathmatch ) return;
Vector2 keypos = (ss.x-(margin+2),yy);
int colc = 0;
double colh = 0;

View file

@ -6,6 +6,7 @@ Class AmmoFabricator : Inventory abstract
{
Mixin SWWMOverlapPickupSound;
Mixin SWWMUseToPickup;
Mixin SWWMRespawn;
int budget, pertype, maxunitprice;
@ -307,6 +308,7 @@ Class HammerspaceEmbiggener : Inventory
{
Mixin SWWMOverlapPickupSound;
Mixin SWWMUseToPickup;
Mixin SWWMRespawn;
override Inventory CreateCopy( Actor other )
{

View file

@ -8,6 +8,7 @@ Class RedShell : Ammo
Mixin SWWMAmmo;
Mixin SWWMOverlapPickupSound;
Mixin SWWMUseToPickup;
Mixin SWWMRespawn;
Default
{
@ -55,6 +56,7 @@ Class GreenShell : Ammo
Mixin SWWMAmmo;
Mixin SWWMOverlapPickupSound;
Mixin SWWMUseToPickup;
Mixin SWWMRespawn;
Default
{
@ -102,6 +104,7 @@ Class WhiteShell : Ammo
Mixin SWWMAmmo;
Mixin SWWMOverlapPickupSound;
Mixin SWWMUseToPickup;
Mixin SWWMRespawn;
Default
{
@ -148,6 +151,7 @@ Class BlueShell : Ammo
Mixin SWWMAmmo;
Mixin SWWMOverlapPickupSound;
Mixin SWWMUseToPickup;
Mixin SWWMRespawn;
Default
{
@ -195,6 +199,7 @@ Class BlackShell : Ammo
Mixin SWWMAmmo;
Mixin SWWMOverlapPickupSound;
Mixin SWWMUseToPickup;
Mixin SWWMRespawn;
Default
{
@ -242,6 +247,7 @@ Class PurpleShell : Ammo
Mixin SWWMAmmo;
Mixin SWWMOverlapPickupSound;
Mixin SWWMUseToPickup;
Mixin SWWMRespawn;
Default
{
@ -323,6 +329,7 @@ Class GoldShell : Ammo
Mixin SWWMAmmo;
Mixin SWWMOverlapPickupSound;
Mixin SWWMUseToPickup;
Mixin SWWMRespawn;
action void A_GoldShellTrail()
{
@ -379,6 +386,7 @@ Class EvisceratorShell : Ammo
Mixin SWWMAmmo;
Mixin SWWMOverlapPickupSound;
Mixin SWWMUseToPickup;
Mixin SWWMRespawn;
Default
{
@ -439,6 +447,7 @@ Class EvisceratorTrioSpawn : Actor
a.bCOUNTSECRET = true;
level.total_secrets++;
}
a.bDROPPED = bDROPPED;
}
Destroy();
}
@ -453,6 +462,7 @@ Class HellblazerMissiles : Ammo
Mixin SWWMAmmo;
Mixin SWWMOverlapPickupSound;
Mixin SWWMUseToPickup;
Mixin SWWMRespawn;
Default
{
@ -511,6 +521,7 @@ Class HellblazerMissileTrioSpawn : Actor
a.bCOUNTSECRET = true;
level.total_secrets++;
}
a.bDROPPED = bDROPPED;
}
Destroy();
}
@ -521,6 +532,7 @@ Class HellblazerCrackshots : Ammo
Mixin SWWMAmmo;
Mixin SWWMOverlapPickupSound;
Mixin SWWMUseToPickup;
Mixin SWWMRespawn;
Default
{
@ -568,6 +580,7 @@ Class HellblazerRavagers : Ammo
Mixin SWWMAmmo;
Mixin SWWMOverlapPickupSound;
Mixin SWWMUseToPickup;
Mixin SWWMRespawn;
Default
{
@ -615,6 +628,7 @@ Class HellblazerWarheads : Ammo
Mixin SWWMAmmo;
Mixin SWWMOverlapPickupSound;
Mixin SWWMUseToPickup;
Mixin SWWMRespawn;
Default
{
@ -666,6 +680,7 @@ Class SparkUnit : Ammo
Mixin SWWMAmmo;
Mixin SWWMOverlapPickupSound;
Mixin SWWMUseToPickup;
Mixin SWWMRespawn;
Default
{
@ -706,6 +721,7 @@ Class SilverBulletAmmo : Ammo
Mixin SWWMAmmo;
Mixin SWWMOverlapPickupSound;
Mixin SWWMUseToPickup;
Mixin SWWMRespawn;
Default
{
@ -753,6 +769,7 @@ Class SilverBulletAmmo2 : Ammo
Mixin SWWMAmmo;
Mixin SWWMOverlapPickupSound;
Mixin SWWMUseToPickup;
Mixin SWWMRespawn;
Default
{
@ -858,6 +875,7 @@ Class SilverBulletsBundleSpawn : Actor
a.bCOUNTSECRET = true;
level.total_secrets++;
}
a.bDROPPED = bDROPPED;
}
Destroy();
}
@ -880,6 +898,7 @@ Class SilverBullets2BundleSpawn : Actor
a.bCOUNTSECRET = true;
level.total_secrets++;
}
a.bDROPPED = bDROPPED;
}
Destroy();
}
@ -894,6 +913,7 @@ Class CandyGunAmmo : Ammo
Mixin SWWMAmmo;
Mixin SWWMOverlapPickupSound;
Mixin SWWMUseToPickup;
Mixin SWWMRespawn;
Default
{
@ -976,6 +996,7 @@ Class CandyGunBulletsBundleSpawn : Actor
a.bCOUNTSECRET = true;
level.total_secrets++;
}
a.bDROPPED = bDROPPED;
}
Destroy();
}
@ -1023,6 +1044,7 @@ Class YnykronAmmo : Ammo
Mixin SWWMAmmo;
Mixin SWWMOverlapPickupSound;
Mixin SWWMUseToPickup;
Mixin SWWMRespawn;
Default
{

View file

@ -69,6 +69,7 @@ Class ArmorNuggetBundleSpawn : Actor
a.bCOUNTSECRET = true;
level.total_secrets++;
}
a.bDROPPED = bDROPPED;
}
Destroy();
}

View file

@ -184,6 +184,7 @@ Class MagAmmo : Inventory abstract
{
Mixin SWWMOverlapPickupSound;
Mixin SWWMUseToPickup;
Mixin SWWMRespawn;
Class<Ammo> ParentAmmo;
Ammo pamo;

View file

@ -152,6 +152,7 @@ Class SWWMSpareArmor : Inventory abstract
Mixin SWWMAutoUseFix;
Mixin SWWMUseToPickup;
Mixin SWWMOverlapPickupSound;
Mixin SWWMRespawn;
Class<SWWMArmor> giveme;

View file

@ -4,6 +4,7 @@ Class SWWMHealth : Inventory abstract
Mixin SWWMAutoUseFix;
Mixin SWWMUseToPickup;
Mixin SWWMOverlapPickupSound;
Mixin SWWMRespawn;
// can't use the Health class for whatever reason
// nice parser you got there I guess?

View file

@ -86,3 +86,86 @@ Mixin Class SWWMOverlapPickupSound
toucher.A_StartSound(PickupSound,CHAN_ITEM,flags,1.,atten);
}
}
Class SWWMRespawnTimer : Actor
{
default
{
+NOGRAVITY;
+NOINTERACTION;
+DONTSPLASH;
+NOTELEPORT;
Radius .1;
Height 0.;
Args 0,3,2;
}
override void PostBeginPlay()
{
args[3] = Random[ExploS](0,30);
if ( !Inventory(tracer) || !Inventory(tracer).PickupFlash ) return;
// copy pickup flash color
let fog = GetDefaultByType(Inventory(tracer).PickupFlash);
for ( int i=0; i<3; i++ ) args[i] = fog.args[i+1];
}
override void Tick()
{
if ( !tracer || !tracer.InStateSequence(tracer.CurState,tracer.FindState("HideDoomish")) )
{
Destroy();
return;
}
special2 = tracer.tics;
if ( isFrozen() ) return;
double str = 1.-special2/double(special1);
int freq = int(clamp(30*(1.-str),3,30));
if ( (level.maptime+args[3])%freq ) return;
int numpt = int(Random[ExploS](0,10)*str);
for ( int i=0; i<numpt; i++ )
{
double ang = FRandom[ExploS](0,360);
double pt = FRandom[ExploS](-90,90);
A_SpawnParticle(Color(args[0]*85,args[1]*85,args[2]*85),SPF_FULLBRIGHT,Random[ExploS](30,60),FRandom[ExploS](1.,2.),0,0,0,16,FRandom[ExploS](-.8,.8),FRandom[ExploS](-.8,.8),FRandom[ExploS](-.8,.8),0,0,0,FRandom[ExploS](.45,.9)*str,-1,FRandom[ExploS](-.04,-.02)*str);
}
}
States
{
Spawn:
TNT1 A -1;
Stop;
}
}
Mixin Class SWWMRespawn
{
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()
{
// 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);
}
}

View file

@ -31,6 +31,7 @@ Class SWWMCollectible : Inventory abstract
+INVENTORY.UNDROPPABLE;
+INVENTORY.UNCLEARABLE;
+INVENTORY.AUTOACTIVATE;
+INVENTORY.NEVERRESPAWN;
+FLOATBOB;
+DONTGIB;
FloatBobStrength 0.25;

View file

@ -114,6 +114,7 @@ Class HealthNuggetBundleSpawn : Actor
a.bCOUNTSECRET = true;
level.total_secrets++;
}
a.bDROPPED = bDROPPED;
}
Destroy();
}

View file

@ -41,7 +41,7 @@ Class SWWMKey : Key abstract
override bool Use( bool pickup )
{
if ( Owner.player && !propagated )
if ( Owner.player && !propagated && !deathmatch )
{
if ( pickup && CVar.GetCVar('swwm_collectanimkey',Owner.player).GetBool() )
SWWMGesture.SetSpecialGesture(Owner.player.mo,gesture);

View file

@ -18,6 +18,7 @@ Class GrilledCheeseSandwich : Inventory
Mixin SWWMAutoUseFix;
Mixin SWWMOverlapPickupSound;
Mixin SWWMUseToPickup;
Mixin SWWMRespawn;
// for falling off cliffs and others
// last 5 seconds of safe positions
@ -437,6 +438,7 @@ Class GhostArtifact : Inventory
Mixin SWWMAutoUseFix;
Mixin SWWMOverlapPickupSound;
Mixin SWWMUseToPickup;
Mixin SWWMRespawn;
Default
{
@ -609,6 +611,7 @@ Class GravitySuppressor : Inventory
Mixin SWWMAutoUseFix;
Mixin SWWMOverlapPickupSound;
Mixin SWWMUseToPickup;
Mixin SWWMRespawn;
override bool Use( bool pickup )
{
@ -842,6 +845,7 @@ Class FuckingInvinciball : Inventory
Mixin SWWMAutoUseFix;
Mixin SWWMOverlapPickupSound;
Mixin SWWMUseToPickup;
Mixin SWWMRespawn;
override Inventory CreateCopy( Actor other )
{
@ -1124,6 +1128,7 @@ Class Ragekit : Inventory
Mixin SWWMAutoUseFix;
Mixin SWWMOverlapPickupSound;
Mixin SWWMUseToPickup;
Mixin SWWMRespawn;
override bool Use( bool pickup )
{
@ -1203,6 +1208,7 @@ Class Omnisight : Inventory
{
Mixin SWWMOverlapPickupSound;
Mixin SWWMUseToPickup;
Mixin SWWMRespawn;
override bool Use( bool pickup )
{
@ -1818,6 +1824,7 @@ Class SWWMLamp : Inventory
{
Mixin SWWMOverlapPickupSound;
Mixin SWWMUseToPickup;
Mixin SWWMRespawn;
bool bActive, bActivated;
TextureID OnIcon;
@ -2087,6 +2094,7 @@ Class EBarrier : Inventory
Mixin SWWMAutoUseFix;
Mixin SWWMOverlapPickupSound;
Mixin SWWMUseToPickup;
Mixin SWWMRespawn;
override bool Use( bool pickup )
{
@ -2625,6 +2633,7 @@ Class Mykradvo : Inventory
Mixin SWWMAutoUseFix;
Mixin SWWMOverlapPickupSound;
Mixin SWWMUseToPickup;
Mixin SWWMRespawn;
Actor ringa[2];

View file

@ -2253,27 +2253,30 @@ Class DemolitionistMenu : GenericMenu
else if ( tabs[curtab] == TAB_KEYS )
{
invlist.Clear();
// keys sorted by their index
int n = Key.GetKeyTypeCount();
for ( int i=0; i<n; i++ )
if ( !deathmatch )
{
let k = Key(players[consoleplayer].mo.FindInventory(Key.GetKeyType(i)));
if ( !k ) continue;
invlist.Push(k);
}
// because we can't call GetReplacement from ui, let's wrangle something real ugly here to clean up replaced keys
for ( int i=0; i<invlist.Size(); i++ )
{
if ( !(invlist[i] is 'SWWMKey') ) continue;
// remove the key this replaces
Class<Key> pc = invlist[i].Species;
if ( !pc ) continue;
for ( int j=0; j<invlist.Size(); j++ )
// keys sorted by their index
int n = Key.GetKeyTypeCount();
for ( int i=0; i<n; i++ )
{
if ( invlist[j].GetClass() != pc ) continue;
invlist.Delete(j);
j--;
if ( i >= j ) i--;
let k = Key(players[consoleplayer].mo.FindInventory(Key.GetKeyType(i)));
if ( !k ) continue;
invlist.Push(k);
}
// because we can't call GetReplacement from ui, let's wrangle something real ugly here to clean up replaced keys
for ( int i=0; i<invlist.Size(); i++ )
{
if ( !(invlist[i] is 'SWWMKey') ) continue;
// remove the key this replaces
Class<Key> pc = invlist[i].Species;
if ( !pc ) continue;
for ( int j=0; j<invlist.Size(); j++ )
{
if ( invlist[j].GetClass() != pc ) continue;
invlist.Delete(j);
j--;
if ( i >= j ) i--;
}
}
}
// collectibles, sorted by name

View file

@ -507,7 +507,7 @@ Class Demolitionist : PlayerPawn
while ( bt.Next() )
{
let i = bt.Thing;
if ( !i || (!(i is 'Inventory') && !(i is 'Chancebox')) ) continue;
if ( !i || (!(i is 'Inventory') && !(i is 'Chancebox') && !(i is 'SWWMRespawnTimer')) ) continue;
if ( (i is 'Inventory') && (i.bINVISIBLE || !i.bSPECIAL || Inventory(i).Owner) ) continue;
if ( (i is 'Chancebox') && (i.CurState != i.SpawnState) ) continue;
if ( !SWWMUtility.SphereIntersect(i,pos,800) ) continue;

View file

@ -206,8 +206,16 @@ Class SWWMItemSense : Thinker
let i = new("SWWMItemSense");
i.ChangeStatNum(STAT_USER);
i.item = item;
i.scoreitem = SWWMUtility.IsScoreItem(item);
i.vipitem = SWWMUtility.IsVipItem(item);
if ( item is 'SWWMRespawnTimer' )
{
i.scoreitem = SWWMUtility.IsScoreItem(item.tracer);
i.vipitem = SWWMUtility.IsVipItem(item.tracer);
}
else
{
i.scoreitem = SWWMUtility.IsScoreItem(item);
i.vipitem = SWWMUtility.IsVipItem(item);
}
i.parent = parent;
i.updated = level.maptime+35;
i.UpdateTag();
@ -221,15 +229,22 @@ Class SWWMItemSense : Thinker
void UpdateTag()
{
if ( !item ) return;
let i = item;
if ( i is 'SWWMRespawnTimer' ) i = i.tracer;
if ( !i ) return;
// certain ammo types use the pickup message as it's amount-aware
if ( (item is 'RedShell') || (item is 'GreenShell')
|| (item is 'WhiteShell') || (item is 'BlueShell')
|| (item is 'BlackShell') || (item is 'PurpleShell')
|| (item is 'GoldShell') || (item is 'SMW05Ammo')
|| (item is 'SheenAmmo') )
tag = Inventory(item).PickupMessage();
else tag = item.GetTag();
if ( (i is 'RedShell') || (i is 'GreenShell')
|| (i is 'WhiteShell') || (i is 'BlueShell')
|| (i is 'BlackShell') || (i is 'PurpleShell')
|| (i is 'GoldShell') || (i is 'EvisceratorShell')
|| (i is 'HellblazerMissiles')
|| (i is 'HellblazerCrackshots')
|| (i is 'HellblazerRavagers')
|| (i is 'HellblazerWarheads')
|| (i is 'SMW05Ammo')
|| (i is 'SheenAmmo') )
tag = Inventory(i).PickupMessage();
else tag = i.GetTag();
}
override void OnDestroy()

View file

@ -2,6 +2,7 @@
Class SWWMWeapon : Weapon abstract
{
Mixin SWWMOverlapPickupSound;
Mixin SWWMRespawn;
bool wasused;
private int SWeaponFlags;
@ -206,6 +207,12 @@ Class SWWMWeapon : Weapon abstract
}
return Super.HandlePickup(item);
}
override bool ShouldStay()
{
// SWWM weapons never stay unless explicitly stated
if ( !bDROPPED && (deathmatch || alwaysapplydmflags) && sv_weaponstay ) return true;
return false;
}
override void AttachToOwner( Actor other )
{
Inventory.AttachToOwner(other);