From 19f65dcabeb6cdbdd3bc619599a234972d17dc3f Mon Sep 17 00:00:00 2001
From: Kamron Batman <3953314+kamronbatman@users.noreply.github.com>
Date: Mon, 10 Jun 2024 18:11:35 -0700
Subject: [PATCH] fix: Fixes edge cases with on off items (#1832)
### Summary
- Generalizes the On/Off toggle items concept
- Updates the OnOffGump so it is static
- Standardizes OnOff items so they can be used by staff
### Notes
Decided to not fix #1417 because it is not clear that the clilocs or errors are for that purpose. Can't test this on OSI anyways.
---
Projects/Application/Application.cs | 1 -
.../Server.Tests/Fixtures/ServerFixture.cs | 2 -
.../Network/Packets/Outgoing/GumpPackets.cs | 1 -
Projects/Server/Events/EventSink.cs | 2 -
Projects/Server/Items/VirtualCheck.cs | 1 -
.../Tests/Multis/Houses/HousePackets.cs | 1 -
.../UOContent/Items/Misc/GumpToggleItems.cs | 75 +++++++++
Projects/UOContent/Items/Misc/WindChimes.cs | 51 +-----
.../Items/Special/MonsterStatuette.cs | 152 +++++++-----------
Projects/UOContent/Misc/CrashGuard.cs | 1 -
10 files changed, 141 insertions(+), 146 deletions(-)
create mode 100644 Projects/UOContent/Items/Misc/GumpToggleItems.cs
diff --git a/Projects/Application/Application.cs b/Projects/Application/Application.cs
index 28964f02fd..28c3aeda16 100644
--- a/Projects/Application/Application.cs
+++ b/Projects/Application/Application.cs
@@ -1,6 +1,5 @@
using System.Diagnostics;
using System.Reflection;
-using System.Threading;
namespace Server;
diff --git a/Projects/Server.Tests/Fixtures/ServerFixture.cs b/Projects/Server.Tests/Fixtures/ServerFixture.cs
index 38b4a4c97f..b572482864 100644
--- a/Projects/Server.Tests/Fixtures/ServerFixture.cs
+++ b/Projects/Server.Tests/Fixtures/ServerFixture.cs
@@ -1,7 +1,5 @@
using System;
-using System.Diagnostics;
using System.Reflection;
-using System.Threading;
namespace Server.Tests;
diff --git a/Projects/Server.Tests/Tests/Network/Packets/Outgoing/GumpPackets.cs b/Projects/Server.Tests/Tests/Network/Packets/Outgoing/GumpPackets.cs
index d0b8aa0698..2620bba2b4 100644
--- a/Projects/Server.Tests/Tests/Network/Packets/Outgoing/GumpPackets.cs
+++ b/Projects/Server.Tests/Tests/Network/Packets/Outgoing/GumpPackets.cs
@@ -1,7 +1,6 @@
using System;
using System.Buffers;
using System.Collections.Generic;
-using System.IO.Compression;
using System.Text;
using Server.Compression;
using Server.Gumps;
diff --git a/Projects/Server/Events/EventSink.cs b/Projects/Server/Events/EventSink.cs
index 846779b10e..129e256e7a 100644
--- a/Projects/Server/Events/EventSink.cs
+++ b/Projects/Server/Events/EventSink.cs
@@ -14,8 +14,6 @@
*************************************************************************/
using System;
-using System.Collections.Generic;
-using Server.Network;
namespace Server;
diff --git a/Projects/Server/Items/VirtualCheck.cs b/Projects/Server/Items/VirtualCheck.cs
index 6adb3cd475..a4362d84c6 100644
--- a/Projects/Server/Items/VirtualCheck.cs
+++ b/Projects/Server/Items/VirtualCheck.cs
@@ -13,7 +13,6 @@
* along with this program. If not, see . *
*************************************************************************/
-using System.Drawing;
using ModernUO.Serialization;
using Server.Gumps;
using Server.Network;
diff --git a/Projects/UOContent.Tests/Tests/Multis/Houses/HousePackets.cs b/Projects/UOContent.Tests/Tests/Multis/Houses/HousePackets.cs
index 109e53b7aa..2290178a7c 100644
--- a/Projects/UOContent.Tests/Tests/Multis/Houses/HousePackets.cs
+++ b/Projects/UOContent.Tests/Tests/Multis/Houses/HousePackets.cs
@@ -1,7 +1,6 @@
using System;
using System.Buffers;
using System.IO;
-using System.IO.Compression;
using Server.Compression;
namespace Server.Network
diff --git a/Projects/UOContent/Items/Misc/GumpToggleItems.cs b/Projects/UOContent/Items/Misc/GumpToggleItems.cs
new file mode 100644
index 0000000000..f8c92ea16c
--- /dev/null
+++ b/Projects/UOContent/Items/Misc/GumpToggleItems.cs
@@ -0,0 +1,75 @@
+using Server.Gumps;
+using Server.Network;
+
+namespace Server.Items;
+
+public interface IGumpToggleItem
+{
+ public bool IsLockedDown { get; }
+ public bool TurnedOn { get; set; }
+}
+
+public sealed class TurnOnGump : TurnOnOffGump
+{
+ public TurnOnGump(IGumpToggleItem item) : base(item)
+ {
+ }
+
+ protected override void BuildLayout(ref StaticGumpBuilder builder)
+ {
+ base.BuildLayout(ref builder);
+
+ builder.AddHtmlLocalized(45, 20, 300, 35, 1011034); // Activate this item
+ }
+}
+
+public sealed class TurnOffGump : TurnOnOffGump
+{
+ public TurnOffGump(IGumpToggleItem item) : base(item)
+ {
+ }
+
+ protected override void BuildLayout(ref StaticGumpBuilder builder)
+ {
+ base.BuildLayout(ref builder);
+
+ builder.AddHtmlLocalized(45, 20, 300, 35, 1011035); // Deactivate this item
+ }
+}
+
+public abstract class TurnOnOffGump : StaticGump where T : TurnOnOffGump
+{
+ protected readonly IGumpToggleItem _item;
+
+ public TurnOnOffGump(IGumpToggleItem item) : base(150, 200) => _item = item;
+
+ protected override void BuildLayout(ref StaticGumpBuilder builder)
+ {
+ builder.AddBackground(0, 0, 300, 150, 0xA28);
+
+ builder.AddButton(40, 53, 0xFA5, 0xFA7, 1);
+ builder.AddHtmlLocalized(80, 55, 65, 35, 1011036); // OKAY
+
+ builder.AddButton(150, 53, 0xFA5, 0xFA7, 0);
+ builder.AddHtmlLocalized(190, 55, 100, 35, 1011012); // CANCEL
+ }
+
+ public override void OnResponse(NetState sender, in RelayInfo info)
+ {
+ var from = sender.Mobile;
+
+ if (info.ButtonID != 1)
+ {
+ from.SendLocalizedMessage(502694); // Cancelled action.
+ return;
+ }
+
+ var newValue = !_item.TurnedOn;
+ _item.TurnedOn = newValue;
+
+ if (newValue && !_item.IsLockedDown)
+ {
+ from.SendLocalizedMessage(502693); // Remember, this only works when locked down.
+ }
+ }
+}
diff --git a/Projects/UOContent/Items/Misc/WindChimes.cs b/Projects/UOContent/Items/Misc/WindChimes.cs
index 2c9bbcc36d..022f6516e6 100644
--- a/Projects/UOContent/Items/Misc/WindChimes.cs
+++ b/Projects/UOContent/Items/Misc/WindChimes.cs
@@ -1,12 +1,10 @@
using ModernUO.Serialization;
-using Server.Gumps;
using Server.Multis;
-using Server.Network;
namespace Server.Items;
[SerializationGenerator(0, false)]
-public abstract partial class BaseWindChimes : Item
+public abstract partial class BaseWindChimes : Item, IGumpToggleItem
{
[InvalidateProperties]
[SerializableField(0)]
@@ -46,55 +44,22 @@ public override void GetProperties(IPropertyList list)
}
}
- public bool IsOwner(Mobile mob) => BaseHouse.FindHouseAt(this)?.IsOwner(mob) == true;
+ public bool HasAccess(Mobile mob) => mob.AccessLevel >= AccessLevel.GameMaster ||
+ BaseHouse.FindHouseAt(this)?.IsOwner(mob) == true;
public override void OnDoubleClick(Mobile from)
{
- if (IsOwner(from))
- {
- from.SendGump(new OnOffGump(this));
- }
- else
+ if (!HasAccess(from))
{
from.SendLocalizedMessage(502691); // You must be the owner to use this.
}
- }
-
- private class OnOffGump : Gump
- {
- private readonly BaseWindChimes m_Chimes;
-
- public OnOffGump(BaseWindChimes chimes) : base(150, 200)
+ else if (TurnedOn)
{
- m_Chimes = chimes;
-
- AddBackground(0, 0, 300, 150, 0xA28);
- AddHtmlLocalized(45, 20, 300, 35, chimes.TurnedOn ? 1011035 : 1011034); // [De]Activate this item
- AddButton(40, 53, 0xFA5, 0xFA7, 1);
- AddHtmlLocalized(80, 55, 65, 35, 1011036); // OKAY
- AddButton(150, 53, 0xFA5, 0xFA7, 0);
- AddHtmlLocalized(190, 55, 100, 35, 1011012); // CANCEL
+ from.SendGump(new TurnOffGump(this));
}
-
- public override void OnResponse(NetState sender, in RelayInfo info)
+ else
{
- var from = sender.Mobile;
-
- if (info.ButtonID == 1)
- {
- var newValue = !m_Chimes.TurnedOn;
-
- m_Chimes.TurnedOn = newValue;
-
- if (newValue && !m_Chimes.IsLockedDown)
- {
- from.SendLocalizedMessage(502693); // Remember, this only works when locked down.
- }
- }
- else
- {
- from.SendLocalizedMessage(502694); // Cancelled action.
- }
+ from.SendGump(new TurnOnGump(this));
}
}
}
diff --git a/Projects/UOContent/Items/Special/MonsterStatuette.cs b/Projects/UOContent/Items/Special/MonsterStatuette.cs
index 36f3ceded3..2f7dd67522 100644
--- a/Projects/UOContent/Items/Special/MonsterStatuette.cs
+++ b/Projects/UOContent/Items/Special/MonsterStatuette.cs
@@ -1,9 +1,6 @@
-using System;
using ModernUO.Serialization;
using Server.Engines.VeteranRewards;
-using Server.Gumps;
using Server.Multis;
-using Server.Network;
namespace Server.Items;
@@ -53,55 +50,55 @@ public enum MonsterStatuetteType
public class MonsterStatuetteInfo
{
- private static readonly MonsterStatuetteInfo[] m_Table =
- {
- /* Crocodile */ new(1041249, 0x20DA, 660),
- /* Daemon */ new(1041250, 0x20D3, 357),
- /* Dragon */ new(1041251, 0x20D6, 362),
- /* EarthElemental */ new(1041252, 0x20D7, 268),
- /* Ettin */ new(1041253, 0x20D8, 367),
- /* Gargoyle */ new(1041254, 0x20D9, 372),
- /* Gorilla */ new(1041255, 0x20F5, 158),
- /* Lich */ new(1041256, 0x20F8, 1001),
- /* Lizardman */ new(1041257, 0x20DE, 417),
- /* Ogre */ new(1041258, 0x20DF, 427),
- /* Orc */ new(1041259, 0x20E0, 1114),
- /* Ratman */ new(1041260, 0x20E3, 437),
- /* Skeleton */ new(1041261, 0x20E7, 1165),
- /* Troll */ new(1041262, 0x20E9, 461),
- /* Cow */ new(1041263, 0x2103, 120),
- /* Zombie */ new(1041264, 0x20EC, 471),
- /* Llama */ new(1041265, 0x20F6, 1011),
- /* Ophidian */ new(1049742, 0x2133, 634),
- /* Reaper */ new(1049743, 0x20FA, 442),
- /* Mongbat */ new(1049744, 0x20F9, 422),
- /* Gazer */ new(1049768, 0x20F4, 377),
- /* FireElemental */ new(1049769, 0x20F3, 838),
- /* Wolf */ new(1049770, 0x2122, 229),
- /* Phillip's Steed */ new(1063488, 0x3FFE, 168),
- /* Seahorse */ new(1070819, 0x25BA, 138),
- /* Harrower */ new(1080520, 0x25BB, new[] { 0x289, 0x28A, 0x28B }),
- /* Efreet */ new(1080521, 0x2590, 0x300),
- /* Slime */ new(1015246, 0x20E8, 456),
- /* PlagueBeast */ new(1029747, 0x2613, 0x1BF),
- /* RedDeath */ new(1094932, 0x2617, Array.Empty()),
- /* Spider */ new(1029668, 0x25C4, 1170),
- /* OphidianArchMage */ new(1029641, 0x25A9, 639),
- /* OphidianWarrior */ new(1029645, 0x25AD, 634),
- /* OphidianKnight */ new(1029642, 0x25aa, 634),
- /* OphidianMage */ new(1029643, 0x25ab, 639),
- /* DreadHorn */ new(1031651, 0x2D83, 0xA8),
- /* Minotaur */ new(1031657, 0x2D89, 0x596),
- /* Black Cat */ new(1096928, 0x4688, 0x69),
- /* HalloweenGhoul */ new(1076782, 0x2109, 0x482),
- /* Santa */ new(1097968, 0x4A98, 0x669)
- };
+ private static readonly MonsterStatuetteInfo[] _table =
+ [
+ /* Crocodile */new MonsterStatuetteInfo(1041249, 0x20DA, 660),
+ /* Daemon */ new MonsterStatuetteInfo(1041250, 0x20D3, 357),
+ /* Dragon */ new MonsterStatuetteInfo(1041251, 0x20D6, 362),
+ /* EarthElemental */ new MonsterStatuetteInfo(1041252, 0x20D7, 268),
+ /* Ettin */ new MonsterStatuetteInfo(1041253, 0x20D8, 367),
+ /* Gargoyle */ new MonsterStatuetteInfo(1041254, 0x20D9, 372),
+ /* Gorilla */ new MonsterStatuetteInfo(1041255, 0x20F5, 158),
+ /* Lich */ new MonsterStatuetteInfo(1041256, 0x20F8, 1001),
+ /* Lizardman */ new MonsterStatuetteInfo(1041257, 0x20DE, 417),
+ /* Ogre */ new MonsterStatuetteInfo(1041258, 0x20DF, 427),
+ /* Orc */ new MonsterStatuetteInfo(1041259, 0x20E0, 1114),
+ /* Ratman */ new MonsterStatuetteInfo(1041260, 0x20E3, 437),
+ /* Skeleton */ new MonsterStatuetteInfo(1041261, 0x20E7, 1165),
+ /* Troll */ new MonsterStatuetteInfo(1041262, 0x20E9, 461),
+ /* Cow */ new MonsterStatuetteInfo(1041263, 0x2103, 120),
+ /* Zombie */ new MonsterStatuetteInfo(1041264, 0x20EC, 471),
+ /* Llama */ new MonsterStatuetteInfo(1041265, 0x20F6, 1011),
+ /* Ophidian */ new MonsterStatuetteInfo(1049742, 0x2133, 634),
+ /* Reaper */ new MonsterStatuetteInfo(1049743, 0x20FA, 442),
+ /* Mongbat */ new MonsterStatuetteInfo(1049744, 0x20F9, 422),
+ /* Gazer */ new MonsterStatuetteInfo(1049768, 0x20F4, 377),
+ /* FireElemental */ new MonsterStatuetteInfo(1049769, 0x20F3, 838),
+ /* Wolf */ new MonsterStatuetteInfo(1049770, 0x2122, 229),
+ /* Phillip's Steed */ new MonsterStatuetteInfo(1063488, 0x3FFE, 168),
+ /* Seahorse */ new MonsterStatuetteInfo(1070819, 0x25BA, 138),
+ /* Harrower */ new MonsterStatuetteInfo(1080520, 0x25BB, [0x289, 0x28A, 0x28B]),
+ /* Efreet */ new MonsterStatuetteInfo(1080521, 0x2590, 0x300),
+ /* Slime */ new MonsterStatuetteInfo(1015246, 0x20E8, 456),
+ /* PlagueBeast */ new MonsterStatuetteInfo(1029747, 0x2613, 0x1BF),
+ /* RedDeath */ new MonsterStatuetteInfo(1094932, 0x2617, []),
+ /* Spider */ new MonsterStatuetteInfo(1029668, 0x25C4, 1170),
+ /* OphidianArchMage */ new MonsterStatuetteInfo(1029641, 0x25A9, 639),
+ /* OphidianWarrior */ new MonsterStatuetteInfo(1029645, 0x25AD, 634),
+ /* OphidianKnight */ new MonsterStatuetteInfo(1029642, 0x25aa, 634),
+ /* OphidianMage */ new MonsterStatuetteInfo(1029643, 0x25ab, 639),
+ /* DreadHorn */ new MonsterStatuetteInfo(1031651, 0x2D83, 0xA8),
+ /* Minotaur */ new MonsterStatuetteInfo(1031657, 0x2D89, 0x596),
+ /* Black Cat */ new MonsterStatuetteInfo(1096928, 0x4688, 0x69),
+ /* HalloweenGhoul */ new MonsterStatuetteInfo(1076782, 0x2109, 0x482),
+ /* Santa */ new MonsterStatuetteInfo(1097968, 0x4A98, 0x669)
+ ];
public MonsterStatuetteInfo(int labelNumber, int itemID, int baseSoundID)
{
LabelNumber = labelNumber;
ItemID = itemID;
- Sounds = new[] { baseSoundID, baseSoundID + 1, baseSoundID + 2, baseSoundID + 3, baseSoundID + 4 };
+ Sounds = [baseSoundID, baseSoundID + 1, baseSoundID + 2, baseSoundID + 3, baseSoundID + 4];
}
public MonsterStatuetteInfo(int labelNumber, int itemID, int[] sounds)
@@ -121,17 +118,17 @@ public static MonsterStatuetteInfo GetInfo(MonsterStatuetteType type)
{
var v = (int)type;
- if (v < 0 || v >= m_Table.Length)
+ if (v < 0 || v >= _table.Length)
{
v = 0;
}
- return m_Table[v];
+ return _table[v];
}
}
[SerializationGenerator(0, false)]
-public partial class MonsterStatuette : Item, IRewardItem
+public partial class MonsterStatuette : Item, IRewardItem, IGumpToggleItem
{
[InvalidateProperties]
[SerializableField(1)]
@@ -203,13 +200,16 @@ public override void OnMovement(Mobile m, Point3D oldLocation)
base.OnMovement(m, oldLocation);
}
+ private static readonly object[] _typeArgs = new object[1];
+
public override void GetProperties(IPropertyList list)
{
base.GetProperties(list);
if (Core.ML && IsRewardItem)
{
- list.Add(RewardSystem.GetRewardYearLabel(this, new object[] { _type })); // X Year Veteran Reward
+ _typeArgs[0] = _type;
+ list.Add(RewardSystem.GetRewardYearLabel(this, _typeArgs)); // X Year Veteran Reward
}
if (_turnedOn)
@@ -222,58 +222,22 @@ public override void GetProperties(IPropertyList list)
}
}
- public bool IsOwner(Mobile mob) => BaseHouse.FindHouseAt(this)?.IsOwner(mob) == true;
+ public bool HasAccess(Mobile mob) => mob.AccessLevel >= AccessLevel.GameMaster ||
+ BaseHouse.FindHouseAt(this)?.IsOwner(mob) == true;
public override void OnDoubleClick(Mobile from)
{
- if (IsOwner(from))
- {
- var onOffGump = new OnOffGump(this);
- from.SendGump(onOffGump);
- }
- else
+ if (!HasAccess(from))
{
from.SendLocalizedMessage(502691); // You must be the owner to use this.
}
- }
-
- private class OnOffGump : Gump
- {
- private readonly MonsterStatuette m_Statuette;
-
- public OnOffGump(MonsterStatuette statuette) : base(150, 200)
+ else if (TurnedOn)
{
- m_Statuette = statuette;
-
- AddBackground(0, 0, 300, 150, 0xA28);
-
- AddHtmlLocalized(45, 20, 300, 35, statuette.TurnedOn ? 1011035 : 1011034); // [De]Activate this item
-
- AddButton(40, 53, 0xFA5, 0xFA7, 1);
- AddHtmlLocalized(80, 55, 65, 35, 1011036); // OKAY
-
- AddButton(150, 53, 0xFA5, 0xFA7, 0);
- AddHtmlLocalized(190, 55, 100, 35, 1011012); // CANCEL
+ from.SendGump(new TurnOffGump(this));
}
-
- public override void OnResponse(NetState sender, in RelayInfo info)
+ else
{
- var from = sender.Mobile;
-
- if (info.ButtonID == 1)
- {
- var newValue = !m_Statuette.TurnedOn;
- m_Statuette.TurnedOn = newValue;
-
- if (newValue && !m_Statuette.IsLockedDown)
- {
- from.SendLocalizedMessage(502693); // Remember, this only works when locked down.
- }
- }
- else
- {
- from.SendLocalizedMessage(502694); // Cancelled action.
- }
+ from.SendGump(new TurnOnGump(this));
}
}
}
diff --git a/Projects/UOContent/Misc/CrashGuard.cs b/Projects/UOContent/Misc/CrashGuard.cs
index e2245fd04e..5273ae0708 100644
--- a/Projects/UOContent/Misc/CrashGuard.cs
+++ b/Projects/UOContent/Misc/CrashGuard.cs
@@ -1,5 +1,4 @@
using System;
-using System.Diagnostics;
using System.IO;
using Server.Accounting;
using Server.Logging;