diff --git a/cvarinfo.txt b/cvarinfo.txt index 6862345..4760a3d 100644 --- a/cvarinfo.txt +++ b/cvarinfo.txt @@ -77,11 +77,7 @@ server bool sting_olsmp = false; // adds the stupid oldskool SMP 7243 to server bool sting_msentry = false; // allows the new Minigun Sentry, which // is an original creation for this mod server bool sting_dubious = false; // allows weapons of dubious origin - // (Demolisher and Razorclaw) - // along with the Minigun Sentry, since - // it's an original creation -server bool sting_proto = true; // enable all prototype items and - // features + // (Demolisher, Razorclaw, Autocannon) server bool sting_autoscuba = false; // SCUBA gear toggles automatically // when needed server bool sting_ehold = false; // eightball can be held fully loaded diff --git a/language.txt b/language.txt index c6504ca..5e77188 100644 --- a/language.txt +++ b/language.txt @@ -33,8 +33,10 @@ O_FLAMETHROWER = "%o was thoroughly roasted by %k's Flamethrower."; O_BIGGUN = "%k blew a hole through %o with the Demolisher."; O_SMINI = "%o got blasted into steaming chunks by %k's Autocannon."; O_SENTRY = "%%o shouldn't have walked into the sights of %s."; +O_ROGUESENTRY = "%o was gunned down by a Minigun Sentry."; O_OWNSENTRY = "%o was gunned down by %p own Minigun Sentry."; O_OSENTRY = "%%o took a bullet from %s."; +O_ROGUEOSENTRY = "%o took a bullet from a Light Sentry."; O_OWNOSENTRY = "%o took a bullet from %p own Light Sentry."; O_STINGERX = "%o ate flaming Tarydium death thanks to %k."; O_STINGERX2 = "%o ate flaming Tarydium death."; @@ -230,7 +232,7 @@ STING_PSHIELD = "Power Shield does not drain over time"; STING_NOPSTART = "Players don't start up with an Automag"; STING_OLSMP = "Enable SMP 7243 from Oldskool Amp'd"; STING_MSENTRY = "Enable new Minigun Sentry"; -STING_DUBIOUS = "Disable weapons of dubious origin (Demolisher, Razorclaw)"; +STING_DUBIOUS = "Enable Demolisher, Razorclaw and Autocannon"; STING_QOPTS = "Convenience features"; STING_AUTOSCUBA = "Automatic SCUBA Gear toggling"; STING_MCREDS = "Unreal Credits"; @@ -277,8 +279,10 @@ O_FLAMETHROWER = "%o fue asad@[ao_esp] a conciencia por el Lanzallamas de %k."; O_BIGGUN = "%k abrió un hoyo a través de %o con el Demoledor."; O_SMINI = "%o fue reventad@[ao_esp] en pedazos humeantes por el Autocañón de %k."; O_SENTRY = "%%o no debería haberse metido en el punto de mira de la %s."; +O_ROGUESENTRY = "%o fue abatid@[ao_esp] por una Torreta."; O_OWNSENTRY = "%o fue abatid@[ao_esp] por su propi@[ao_esp] Torreta."; O_OSENTRY = "%%o se llevó un tiro de la %s."; +O_ROGUEOSENTRY = "%o se llevó un tiro de una Torreta Ligera."; O_OWNOSENTRY = "%o se llevó un tiro de su propi@[ao_esp] Torreta Ligera."; O_STINGERX = "%o tragó muerte ardiente de Tarydium gracias a %k."; O_STINGERX2 = "%o tragó muerte ardiente de Tarydium."; @@ -455,6 +459,8 @@ STING_DPISTOL = "El fuego alternativo de la Pistola de Dispersión no es mejorad STING_PSHIELD = "El Escudo de Fuerza no pierde carga con el tiempo"; STING_NOPSTART = "Los jugadores no empiezan la partida con un Automag"; STING_OLSMP = "Habilitar SMP 7243 de Oldskool Amp'd"; +STING_MSENTRY = "Habilitar nueva Torreta"; +STING_DUBIOUS = "Habilitar Demoledor, Garra y Autocañón"; STING_QOPTS = "Características de comodidad"; STING_AUTOSCUBA = "Uso automático de Kit de Buceo"; STING_MCREDS = "Créditos de Unreal"; diff --git a/menudef.txt b/menudef.txt index 60f4fc8..97e7471 100644 --- a/menudef.txt +++ b/menudef.txt @@ -44,6 +44,8 @@ OptionMenu "UnrealOptionMenu" Option "$STING_PSHIELD", "sting_pshield", "YesNo" Option "$STING_NOPSTART", "sting_nopstart", "YesNo" Option "$STING_OLSMP", "sting_olsmp", "YesNo" + Option "$STING_MSENTRY", "sting_msentry", "YesNo" + Option "$STING_DUBIOUS", "sting_dubious", "YesNo" StaticText " " StaticText "$STING_QOPTS", "Gold" Option "$STING_AUTOSCUBA", "sting_autoscuba", "YesNo" diff --git a/sndinfo.txt b/sndinfo.txt index e75da72..7163cff 100644 --- a/sndinfo.txt +++ b/sndinfo.txt @@ -226,6 +226,8 @@ sentry/wind sentwind sentry/fire sentfire sentry/unwind sentuwnd sentry/explode cannonex +sentry/move sentmovs +sentry/movestop sentmove vfrag/bounce1 glasstk1 vfrag/bounce2 glasstk2 diff --git a/sounds/SentMovE.ogg b/sounds/SentMovE.ogg new file mode 100644 index 0000000..766d0be Binary files /dev/null and b/sounds/SentMovE.ogg differ diff --git a/sounds/SentMovS.ogg b/sounds/SentMovS.ogg new file mode 100644 index 0000000..30b2720 Binary files /dev/null and b/sounds/SentMovS.ogg differ diff --git a/zscript/biggun.zsc b/zscript/biggun.zsc index 43aa3bd..82164cc 100644 --- a/zscript/biggun.zsc +++ b/zscript/biggun.zsc @@ -18,6 +18,47 @@ Class BigAmmo : Ammo if ( PickupMsg.Length() > 0 ) return Super.PickupMessage(); return String.Format("%s%d%s",StringTable.Localize("$I_BIGAMMOL"),Amount,StringTable.Localize("$I_BIGAMMOR")); } + override bool TryPickup( in out Actor toucher ) + { + if ( !sting_dubious ) return false; // not allowed + return Super.TryPickup(toucher); + } + override void Tick() + { + Super.Tick(); + if ( sting_dubious ) return; + if ( !Owner ) + { + let r = Spawn((GetClass()=="BigAmmo")?"CellPack":"Cell",pos,ALLOW_REPLACE); + r.spawnangle = spawnangle; + r.spawnpoint = spawnpoint; + r.angle = angle; + r.pitch = pitch; + r.roll = roll; + r.special = special; + r.args[0] = args[0]; + r.args[1] = args[1]; + r.args[2] = args[2]; + r.args[3] = args[3]; + r.args[4] = args[4]; + r.ChangeTid(tid); + r.SpawnFlags = SpawnFlags&~MTF_SECRET; + r.HandleSpawnFlags(); + r.SpawnFlags = SpawnFlags; + r.bCountSecret = SpawnFlags&MTF_SECRET; + r.vel = vel; + r.master = master; + r.target = target; + r.tracer = tracer; + r.bDropped = bDropped; + Destroy(); + } + else + { + Owner.RemoveInventory(self); + Destroy(); + } + } States { Spawn: @@ -70,12 +111,53 @@ Class BigCasing : UTCasing { Default { - BounceSound "flak/bounce"; // much heavier sound + BounceSound "big/bounce"; // much heavier sound } } Class BigGun : UnrealWeapon { + override bool TryPickup( in out Actor toucher ) + { + if ( !sting_dubious ) return false; // not allowed + return Super.TryPickup(toucher); + } + override void Tick() + { + Super.Tick(); + if ( sting_dubious ) return; + if ( !Owner ) + { + let r = Spawn("BFG9000",pos,ALLOW_REPLACE); + r.spawnangle = spawnangle; + r.spawnpoint = spawnpoint; + r.angle = angle; + r.pitch = pitch; + r.roll = roll; + r.special = special; + r.args[0] = args[0]; + r.args[1] = args[1]; + r.args[2] = args[2]; + r.args[3] = args[3]; + r.args[4] = args[4]; + r.ChangeTid(tid); + r.SpawnFlags = SpawnFlags&~MTF_SECRET; + r.HandleSpawnFlags(); + r.SpawnFlags = SpawnFlags; + r.bCountSecret = SpawnFlags&MTF_SECRET; + r.vel = vel; + r.master = master; + r.target = target; + r.tracer = tracer; + r.bDropped = bDropped; + Destroy(); + } + else + { + Owner.RemoveInventory(self); + Destroy(); + } + } Default { Tag "$T_BIGGUN"; diff --git a/zscript/bonesaw.zsc b/zscript/bonesaw.zsc index 785268e..5d7f9f8 100644 --- a/zscript/bonesaw.zsc +++ b/zscript/bonesaw.zsc @@ -1,5 +1,46 @@ Class Bonesaw : UnrealWeapon { + override bool TryPickup( in out Actor toucher ) + { + if ( !sting_dubious ) return false; // not allowed + return Super.TryPickup(toucher); + } + override void Tick() + { + Super.Tick(); + if ( sting_dubious ) return; + if ( !Owner ) + { + let r = Spawn("Chainsaw",pos,ALLOW_REPLACE); + r.spawnangle = spawnangle; + r.spawnpoint = spawnpoint; + r.angle = angle; + r.pitch = pitch; + r.roll = roll; + r.special = special; + r.args[0] = args[0]; + r.args[1] = args[1]; + r.args[2] = args[2]; + r.args[3] = args[3]; + r.args[4] = args[4]; + r.ChangeTid(tid); + r.SpawnFlags = SpawnFlags&~MTF_SECRET; + r.HandleSpawnFlags(); + r.SpawnFlags = SpawnFlags; + r.bCountSecret = SpawnFlags&MTF_SECRET; + r.vel = vel; + r.master = master; + r.target = target; + r.tracer = tracer; + r.bDropped = bDropped; + Destroy(); + } + else + { + Owner.RemoveInventory(self); + Destroy(); + } + } Default { Tag "$T_BONESAW"; diff --git a/zscript/gatling.zsc b/zscript/gatling.zsc index 70cbc46..8681245 100644 --- a/zscript/gatling.zsc +++ b/zscript/gatling.zsc @@ -8,6 +8,18 @@ Class SMiniAmmo : Ammo Ammo.BackpackAmount 0; Ammo.BackpackMaxAmount 32; } + override bool TryPickup( in out Actor toucher ) + { + if ( !sting_dubious ) return false; // not allowed + return Super.TryPickup(toucher); + } + override void Tick() + { + Super.Tick(); + if ( sting_dubious ) return; + if ( Owner ) Owner.RemoveInventory(self); + Destroy(); + } } Class SMiniBlast : Actor @@ -16,6 +28,47 @@ Class SMiniBlast : Actor Class SMiniGun : UnrealWeapon { + override bool TryPickup( in out Actor toucher ) + { + if ( !sting_dubious ) return false; // not allowed + return Super.TryPickup(toucher); + } + override void Tick() + { + Super.Tick(); + if ( sting_dubious ) return; + if ( !Owner ) + { + let r = Spawn("BFG9000",pos,ALLOW_REPLACE); + r.spawnangle = spawnangle; + r.spawnpoint = spawnpoint; + r.angle = angle; + r.pitch = pitch; + r.roll = roll; + r.special = special; + r.args[0] = args[0]; + r.args[1] = args[1]; + r.args[2] = args[2]; + r.args[3] = args[3]; + r.args[4] = args[4]; + r.ChangeTid(tid); + r.SpawnFlags = SpawnFlags&~MTF_SECRET; + r.HandleSpawnFlags(); + r.SpawnFlags = SpawnFlags; + r.bCountSecret = SpawnFlags&MTF_SECRET; + r.vel = vel; + r.master = master; + r.target = target; + r.tracer = tracer; + r.bDropped = bDropped; + Destroy(); + } + else + { + Owner.RemoveInventory(self); + Destroy(); + } + } Default { Tag "$T_SMINI"; diff --git a/zscript/miscitems.zsc b/zscript/miscitems.zsc index 2536352..6e96b6e 100644 --- a/zscript/miscitems.zsc +++ b/zscript/miscitems.zsc @@ -1432,17 +1432,35 @@ Class SentryItem : UnrealInventory UnrealInventory.Charge MinigunSentryBase.sentryhealth; +UNREALINVENTORY.DRAWSPECIAL; } + override bool TryPickup( in out Actor toucher ) + { + if ( !sting_msentry ) return false; // not allowed + return Super.TryPickup(toucher); + } + override void Tick() + { + Super.Tick(); + if ( sting_msentry ) return; + if ( Owner ) Owner.RemoveInventory(self); + else + { + // TODO replace + } + Destroy(); + } override bool HandlePickup( Inventory item ) { if ( item.GetClass() == GetClass() ) return true; // can never get more than one return Super.HandlePickup(item); } - static void TransferOwnership( Actor newowner, Actor sentry ) + static bool TransferOwnership( Actor newowner, Actor sentry ) { - if ( sentry.master ) sentry.master.TakeInventory("SentryItem",200); + if ( sentry.master == newowner ) return false; + if ( sentry.master ) sentry.master.TakeInventory("SentryItem",1); sentry.master = newowner; sentry.SetTag(String.Format(StringTable.Localize("$T_OWNEDSENTRY"),newowner.player.GetUserName())); sentry.tracer.A_ClearTarget(); + sentry.tracer.bFRIENDLY = true; sentry.tracer.SetFriendPlayer(newowner.player); let si = SentryItem(newowner.FindInventory("SentryItem")); if ( si ) @@ -1457,6 +1475,7 @@ Class SentryItem : UnrealInventory si.bActive = true; si.tracer = sentry; } + return true; } override void AttachToOwner( Actor other ) { @@ -1632,7 +1651,7 @@ Class MinigunSentry : Actor angle = clamp(angle+clamp(angledelta,-angleturn,angleturn),master.angle-maxangle,master.angle+maxangle); pitch = clamp(pitch+clamp(pitchdelta,-pitchturn,pitchturn),master.pitch-maxpitch,master.pitch+maxpitch); } - void A_SentryFaceDir( int dest, statelabel next ) + void A_SentryFaceDir( double dest, statelabel next ) { double angledelta = DeltaAngle(angle,master.angle+dest); double pitchdelta = DeltaAngle(pitch,master.pitch); @@ -1714,34 +1733,31 @@ Class MinigunSentry : Actor SENR ABCDEFGHIJKLMNO 3; Goto Idle; Idle: - SENI A 1 A_SentryFaceDir(0,1); - Wait; - SENI A 1 + SENI A 0 { - A_LookEx(LOF_NOSOUNDCHECK|LOF_NOJUMP); - A_SentryFaceDir(-maxangle,1); - return A_JumpIf(TargetVisible(),"See"); - } - Wait; - SENI AAAAAA 1 - { - A_LookEx(LOF_NOSOUNDCHECK|LOF_NOJUMP); - return A_JumpIf(TargetVisible(),"See"); + A_PlaySound("sentry/move",CHAN_BODY,0.4,true,pitch:0.8); + if ( specialf1 > 0 ) specialf1 = -maxangle; + else specialf1 = maxangle; + special2 = 0; } SENI A 1 { A_LookEx(LOF_NOSOUNDCHECK|LOF_NOJUMP); - A_SentryFaceDir(maxangle,1); + A_SentryFaceDir(specialf1,"IdleStop"); return A_JumpIf(TargetVisible(),"See"); } Wait; - SENI AAAAAA 1 + IdleStop: + SENI A 0 A_PlaySound("sentry/movestop",CHAN_BODY,0.4,pitch:0.8); + SENI A 1 { A_LookEx(LOF_NOSOUNDCHECK|LOF_NOJUMP); + if ( special2++ > 20 ) return ResolveState("Idle"); return A_JumpIf(TargetVisible(),"See"); } - Goto Idle+1; + Wait; See: + SENI A 0 A_PlaySound("sentry/movestop",CHAN_BODY,0.4,pitch:0.8); SENI A 1 { if ( !TargetVisible() ) @@ -1992,6 +2008,7 @@ Class MinigunSentryBase : Actor Default { + Tag "$T_SENTRY"; Health sentryhealth; Mass int.max; Radius 12; @@ -2000,7 +2017,6 @@ Class MinigunSentryBase : Actor +SHOOTABLE; +NOBLOOD; +DONTTHRUST; - +SPECIAL; } override void PostBeginPlay() { @@ -2012,8 +2028,8 @@ Class MinigunSentryBase : Actor } else { - SetTag(StringTable.Localize("$T_SENTRY")); rememberedplayer = -1; + special1 = sentryammo; // rogue sentries need ammo assigned } tracer = Spawn("MinigunSentry",pos); tracer.special1 = special1; @@ -2026,15 +2042,23 @@ Class MinigunSentryBase : Actor tracer.SetOrigin(level.Vec3Offset(pos,z*38),false); if ( !deathmatch ) { - if ( !master || !master.player ) bFRIENDLY = false; + if ( !master || !master.player ) tracer.bFRIENDLY = bFRIENDLY; + bFRIENDLY = false; return; } if ( master && master.player ) tracer.SetFriendPlayer(master.player); - else tracer.bFRIENDLY = false; + else tracer.bFRIENDLY = bFRIENDLY; + bFRIENDLY = false; } override void Tick() { Super.Tick(); + if ( !sting_msentry ) + { + if ( tracer ) tracer.Destroy(); + Destroy(); + return; + } // hub return support if ( !master && (rememberedplayer != -1) && playeringame[rememberedplayer] ) { @@ -2056,25 +2080,28 @@ Class MinigunSentryBase : Actor } override string GetObituary( Actor victim, Actor inflictor, Name mod, bool playerattack ) { - if ( victim == master ) return String.Format(StringTable.Localize("$O_OWNSENTRY"),GetTag()); - return String.Format(StringTable.Localize("$O_SENTRY"),GetTag()); + if ( victim == master ) return StringTable.Localize("$O_OWNSENTRY"); + else if ( master && master.player ) return String.Format(StringTable.Localize("$O_SENTRY"),GetTag()); + return StringTable.Localize("$O_ROGUESENTRY"); } - override void Touch( Actor toucher ) + override bool Used( Actor user ) { - if ( !toucher.player || !bSPECIAL ) return; - if ( abs(DeltaAngle(angle,AngleTo(toucher))) < 120 ) return; + if ( !user.player || !InStateSequence(CurState,FindState("Idle")) ) return false; + if ( abs(DeltaAngle(angle,AngleTo(user))) < 120 ) return false; if ( deathmatch || !master ) { - if ( master && (toucher != master) && master.CheckLocalView() ) + if ( master && (user != master) && master.CheckLocalView() ) Console.Printf(StringTable.Localize("$M_SENTRYHIJACK")); - SentryItem.TransferOwnership(toucher,self); + if ( SentryItem.TransferOwnership(user,self) ) + return false; // on first touch only transfer ownership } - let amo = toucher.FindInventory("UMiniAmmo"); - if ( !amo || (amo.Amount <= 0) || (tracer.special1 >= sentryammo) ) return; + let amo = user.FindInventory("UMiniAmmo"); + if ( !amo || (amo.Amount <= 0) || (tracer.special1 >= sentryammo) ) return false; A_PlaySound("misc/i_pkup",CHAN_ITEM); int xammo = min(sentryammo-tracer.special1,amo.Amount); special1 = tracer.special1 += xammo; amo.Amount -= xammo; + return false; } override int DamageMobj( Actor inflictor, Actor source, int damage, Name mod, int flags, double angle ) { @@ -2110,7 +2137,6 @@ Class MinigunSentryBase : Actor PackUp: SENI A -1 { - bSPECIAL = false; tracer.SetStateLabel("PackUp"); } Stop; @@ -2222,6 +2248,7 @@ Class SentryGun : Actor int rememberedplayer; Default { + Tag "$T_OSENTRY"; Health 50; Mass int.max; Radius 10; @@ -2240,11 +2267,7 @@ Class SentryGun : Actor SetTag(String.Format(StringTable.Localize("$T_OWNEDOSENTRY"),master.player.GetUserName())); rememberedplayer = master.playernumber(); } - else - { - SetTag(StringTable.Localize("$T_OSENTRY")); - rememberedplayer = -1; - } + else rememberedplayer = -1; if ( !deathmatch ) { if ( !master || !master.player ) bFRIENDLY = false; @@ -2255,8 +2278,9 @@ Class SentryGun : Actor } override string GetObituary( Actor victim, Actor inflictor, Name mod, bool playerattack ) { - if ( victim == master ) return String.Format(StringTable.Localize("$O_OWNOSENTRY"),GetTag()); - return String.Format(StringTable.Localize("$O_OSENTRY"),GetTag()); + if ( victim == master ) return StringTable.Localize("$O_OWNOSENTRY"); + else if ( master && master.player ) return String.Format(StringTable.Localize("$O_OSENTRY"),GetTag()); + return StringTable.Localize("$O_ROGUEOSENTRY"); } override void Tick() { diff --git a/zscript/stinger.zsc b/zscript/stinger.zsc index dae65c9..c70f60f 100644 --- a/zscript/stinger.zsc +++ b/zscript/stinger.zsc @@ -264,6 +264,11 @@ Class TarydiumDebuff : Thinker override void Tick() { + if ( !sting_stinger ) + { + Destroy(); + return; + } if ( !victim || (victim.Health <= 0) ) { BlowUp(); @@ -316,6 +321,7 @@ Class TarydiumDebuff : Thinker static void Apply( Actor victim, Actor instigator, int amount ) { if ( !victim || (victim.Health <= 0) || !victim.bISMONSTER ) return; + if ( !sting_stinger ) return; let ti = ThinkerIterator.Create("TarydiumDebuff",STAT_USER); TarydiumDebuff t; while ( t = TarydiumDebuff(ti.Next()) ) diff --git a/zscript/ueightball.zsc b/zscript/ueightball.zsc index 54bf23f..29059d8 100644 --- a/zscript/ueightball.zsc +++ b/zscript/ueightball.zsc @@ -68,14 +68,14 @@ Class URocketTrail : Actor override void PostBeginPlay() { Super.PostBeginPlay(); - let l = Spawn("RocketLight",pos); - l.target = self; + A_AttachLight('RocketLight',DynamicLight.PointLight,Color(255,224,128),32,32); } override void Tick() { Super.Tick(); - if ( !target || target.InStateSequence(target.CurState,target.FindState("Death")) ) + if ( !target || !target.bMISSILE ) { + A_RemoveLight('RocketLight'); Destroy(); return; } diff --git a/zscript/unrealcommon.zsc b/zscript/unrealcommon.zsc index 890a573..c76edaa 100644 --- a/zscript/unrealcommon.zsc +++ b/zscript/unrealcommon.zsc @@ -830,10 +830,10 @@ Class UnrealMainHandler : EventHandler { if ( (e.Replacee == 'Chainsaw') || (e.Replacee == 'Gauntlets') ) { - if ( !Random[Replacements](0,3) ) e.Replacement = 'WeaponPowerUp'; + if ( (sting_dubious || sting_olsmp) && !Random[Replacements](0,3) ) e.Replacement = 'WeaponPowerUp'; else if ( Random[Replacements](0,2) ) { - if ( Random[Replacements](0,1) ) e.Replacement = 'Bonesaw'; + if ( sting_dubious && Random[Replacements](0,1) ) e.Replacement = 'Bonesaw'; else e.Replacement = 'Stunner'; } else if ( !Random[Replacements](0,2) ) e.Replacement = 'Betamag'; @@ -888,9 +888,13 @@ Class UnrealMainHandler : EventHandler } else if ( (e.Replacee == 'BFG9000') || (e.Replacee == 'Mace') ) { - if ( sting_olsmp && Random[Replacements](0,1) ) e.Replacement = 'OLSMP'; - else if ( Random[Replacements](0,1) ) e.Replacement = 'SMiniGun'; - else e.Replacement = 'BigGun'; + if ( sting_olsmp && (!sting_dubious || Random[Replacements](0,1)) ) e.Replacement = 'OLSMP'; + else if ( sting_dubious ) + { + if ( Random[Replacements](0,1) ) e.Replacement = 'SMiniGun'; + else e.Replacement = 'BigGun'; + } + else e.Replacement = 'WeaponPowerup'; // lousy, I know } else if ( (e.Replacee == 'Clip') || (e.Replacee == 'GoldWandAmmo') || (e.Replacee == 'GoldWandHefty') ) e.Replacement = 'UClip'; else if ( (e.Replacee == 'ClipBox') ) @@ -957,7 +961,7 @@ Class UnrealMainHandler : EventHandler } else if ( (e.Replacee == 'Cell') || (e.Replacee == 'SkullRodAmmo') ) { - if ( !Random[Replacements](0,4) ) + if ( sting_dubious && !Random[Replacements](0,4) ) { if ( !Random[Replacements](0,2) ) e.Replacement = 'BigAmmo2'; else e.Replacement = 'BigAmmo3'; @@ -980,7 +984,7 @@ Class UnrealMainHandler : EventHandler } else if ( (e.Replacee == 'CellPack') || (e.Replacee == 'SkullRodHefty') ) { - if ( !Random[Replacements](0,4) ) + if ( sting_dubious && !Random[Replacements](0,4) ) { if ( !Random[Replacements](0,2) ) e.Replacement = 'BigAmmo'; else e.Replacement = 'BigAmmo2'; @@ -993,8 +997,8 @@ Class UnrealMainHandler : EventHandler else if ( (e.Replacee == 'InvulnerabilitySphere') || (e.Replacee == 'ArtiInvulnerability') ) e.Replacement = 'PowerShield'; else if ( (e.Replacee == 'Berserk') || (e.Replacee == 'ArtiTomeOfPower') ) { - if ( !Random[Replacements](0,9) ) e.Replacement = 'SentryItem'; - else if ( !Random[Replacements](0,2) ) e.Replacement = 'WeaponPowerUp'; + if ( sting_msentry && !Random[Replacements](0,9) ) e.Replacement = 'SentryItem'; + else if ( (sting_dubious || sting_olsmp) && !Random[Replacements](0,2) ) e.Replacement = 'WeaponPowerUp'; else e.Replacement = 'Amplifier'; } else if ( e.Replacee == 'ArtiEgg' ) e.Replacement = 'VoiceBox'; diff --git a/zscript/unrealhud.zsc b/zscript/unrealhud.zsc index 279c18b..213baa3 100644 --- a/zscript/unrealhud.zsc +++ b/zscript/unrealhud.zsc @@ -190,7 +190,7 @@ Class UnrealHUD : BaseStatusBar private void DrawNumberOf( Inventory i, double x, double y ) { - if ( (i.Amount <= 1) && !((i is 'UnrealInventory') || !UnrealInventory(i).bDRAWSPECIAL) ) return; + if ( (i.Amount <= 1) && !((i is 'UnrealInventory') && UnrealInventory(i).bDRAWSPECIAL) ) return; double TempX = CurX, TempY = CurY; string itxt = String.Format("%d",((i is 'UnrealInventory')&&UnrealInventory(i).bDRAWSPECIAL)?i.special1:i.Amount); CurX += 30;