From 9b8704965835b9d704280eb8949363a5a81c44f2 Mon Sep 17 00:00:00 2001 From: Kamron Batman <3953314+kamronbatman@users.noreply.github.com> Date: Tue, 3 Oct 2023 20:44:15 -0700 Subject: [PATCH] fix: Codegens BulkOrderBooks (#1531) --- .../Engines/Bulk Orders/Books/BOBFilter.cs | 102 ++-- .../Engines/Bulk Orders/Books/BODBuyGump.cs | 2 +- .../Bulk Orders/Books/BulkOrderBook.cs | 526 ++++++++---------- ...erver.Engines.BulkOrders.BOBFilter.v2.json | 42 ++ ...r.Engines.BulkOrders.BulkOrderBook.v3.json | 44 ++ Projects/UOContent/Mobiles/PlayerMobile.cs | 3 +- 6 files changed, 372 insertions(+), 347 deletions(-) create mode 100644 Projects/UOContent/Migrations/Server.Engines.BulkOrders.BOBFilter.v2.json create mode 100644 Projects/UOContent/Migrations/Server.Engines.BulkOrders.BulkOrderBook.v3.json diff --git a/Projects/UOContent/Engines/Bulk Orders/Books/BOBFilter.cs b/Projects/UOContent/Engines/Bulk Orders/Books/BOBFilter.cs index dc211ac67..962c3d8e3 100644 --- a/Projects/UOContent/Engines/Bulk Orders/Books/BOBFilter.cs +++ b/Projects/UOContent/Engines/Bulk Orders/Books/BOBFilter.cs @@ -1,62 +1,52 @@ -namespace Server.Engines.BulkOrders +using ModernUO.Serialization; + +namespace Server.Engines.BulkOrders; + +[SerializationGenerator(2)] +public partial class BOBFilter { - public class BOBFilter + [SerializableField(0)] + private int _type; + + [SerializableFieldSaveFlag(0)] + private bool ShouldSerializeType() => _type != 0; + + [SerializableField(1)] + private int _quality; + + [SerializableFieldSaveFlag(1)] + private bool ShouldSerializeQuality() => _quality != 0; + + [SerializableField(2)] + private int _material; + + [SerializableFieldSaveFlag(2)] + private bool ShouldSerializeMaterial() => _material != 0; + + [SerializableField(3)] + private int _quantity; + + [SerializableFieldSaveFlag(3)] + private bool ShouldSerializeQuantity() => _quantity != 0; + + private void Deserialize(IGenericReader reader, int version) { - public BOBFilter() + if (version == 1) { - } - - public BOBFilter(IGenericReader reader) - { - var version = reader.ReadEncodedInt(); - - switch (version) - { - case 1: - { - Type = reader.ReadEncodedInt(); - Quality = reader.ReadEncodedInt(); - Material = reader.ReadEncodedInt(); - Quantity = reader.ReadEncodedInt(); - - break; - } - } - } - - public bool IsDefault => Type == 0 && Quality == 0 && Material == 0 && Quantity == 0; - - public int Type { get; set; } - - public int Quality { get; set; } - - public int Material { get; set; } - - public int Quantity { get; set; } - - public void Clear() - { - Type = 0; - Quality = 0; - Material = 0; - Quantity = 0; - } - - public void Serialize(IGenericWriter writer) - { - if (IsDefault) - { - writer.WriteEncodedInt(0); // version - } - else - { - writer.WriteEncodedInt(1); // version - - writer.WriteEncodedInt(Type); - writer.WriteEncodedInt(Quality); - writer.WriteEncodedInt(Material); - writer.WriteEncodedInt(Quantity); - } + _type = reader.ReadEncodedInt(); + _quality = reader.ReadEncodedInt(); + _material = reader.ReadEncodedInt(); + _quantity = reader.ReadEncodedInt(); } } + + public bool IsDefault => _type == 0 && _quality == 0 && _material == 0 && _quantity == 0; + + public void Clear() + { + Type = 0; + Quality = 0; + Material = 0; + Quantity = 0; + } } diff --git a/Projects/UOContent/Engines/Bulk Orders/Books/BODBuyGump.cs b/Projects/UOContent/Engines/Bulk Orders/Books/BODBuyGump.cs index 4b8a13b5c..8b8721c9d 100644 --- a/Projects/UOContent/Engines/Bulk Orders/Books/BODBuyGump.cs +++ b/Projects/UOContent/Engines/Bulk Orders/Books/BODBuyGump.cs @@ -103,7 +103,7 @@ namespace Server.Engines.BulkOrders { if (pack.ConsumeTotal(typeof(Gold), price) || Banker.Withdraw(m_From, price)) { - m_Book.Entries.Remove(m_Entry); + m_Book.RemoveEntry(m_Entry); m_Book.InvalidateProperties(); pv.HoldGold += price; m_From.AddToBackpack(item); diff --git a/Projects/UOContent/Engines/Bulk Orders/Books/BulkOrderBook.cs b/Projects/UOContent/Engines/Bulk Orders/Books/BulkOrderBook.cs index df7334310..c80621d47 100644 --- a/Projects/UOContent/Engines/Bulk Orders/Books/BulkOrderBook.cs +++ b/Projects/UOContent/Engines/Bulk Orders/Books/BulkOrderBook.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using ModernUO.Serialization; using Server.ContextMenus; using Server.Gumps; using Server.Items; @@ -6,347 +7,294 @@ using Server.Mobiles; using Server.Multis; using Server.Prompts; -namespace Server.Engines.BulkOrders +namespace Server.Engines.BulkOrders; + +[SerializationGenerator(3, false)] +public partial class BulkOrderBook : Item, ISecurable { - public class BulkOrderBook : Item, ISecurable + [SerializableField(0)] + private int _itemCount; + + [InvalidateProperties] + [SerializableField(1)] + [SerializedCommandProperty(AccessLevel.GameMaster)] + private SecureLevel _level; + + [InvalidateProperties] + [SerializableField(2)] + [SerializedCommandProperty(AccessLevel.GameMaster)] + private string _bookName; + + [SerializableField(3)] + [SerializedCommandProperty(AccessLevel.GameMaster)] + private BOBFilter _filter; + + [SerializableField(4)] + [SerializedCommandProperty(AccessLevel.GameMaster)] + private List _entries; + + [Constructible] + public BulkOrderBook() : base(0x2259) { - private string m_BookName; + Weight = 1.0; + LootType = LootType.Blessed; - [Constructible] - public BulkOrderBook() : base(0x2259) + _entries = new List(); + _filter = new BOBFilter(); + + _level = SecureLevel.CoOwners; + } + + public override void OnDoubleClick(Mobile from) + { + if (!from.InRange(GetWorldLocation(), 2)) { - Weight = 1.0; - LootType = LootType.Blessed; - - Entries = new List(); - Filter = new BOBFilter(); - - Level = SecureLevel.CoOwners; + from.LocalOverheadMessage(MessageType.Regular, 0x3B2, 1019045); // I can't reach that. } - - public BulkOrderBook(Serial serial) : base(serial) + else if (Entries.Count == 0) { + from.SendLocalizedMessage(1062381); // The book is empty. } - - [CommandProperty(AccessLevel.GameMaster)] - public string BookName + else if (from is PlayerMobile mobile) { - get => m_BookName; - set + mobile.SendGump(new BOBGump(mobile, this)); + } + } + + public override void OnDoubleClickSecureTrade(Mobile from) + { + if (!from.InRange(GetWorldLocation(), 2)) + { + from.SendLocalizedMessage(500446); // That is too far away. + } + else if (Entries.Count == 0) + { + from.SendLocalizedMessage(1062381); // The book is empty. + } + else + { + from.SendGump(new BOBGump((PlayerMobile)from, this)); + + var trade = GetSecureTradeCont()?.Trade; + + if (trade?.From.Mobile == from) { - m_BookName = value; - InvalidateProperties(); + trade.To.Mobile.SendGump(new BOBGump((PlayerMobile)trade.To.Mobile, this)); + } + else if (trade?.To.Mobile == from) + { + trade.From.Mobile.SendGump(new BOBGump((PlayerMobile)trade.From.Mobile, this)); } } + } - public List Entries { get; private set; } - - public BOBFilter Filter { get; private set; } - - public int ItemCount { get; set; } - - [CommandProperty(AccessLevel.GameMaster)] - public SecureLevel Level { get; set; } - - public override void OnDoubleClick(Mobile from) + public override bool OnDragDrop(Mobile from, Item dropped) + { + if (dropped is BaseBOD) { - if (!from.InRange(GetWorldLocation(), 2)) + if (!IsChildOf(from.Backpack)) { - from.LocalOverheadMessage(MessageType.Regular, 0x3B2, 1019045); // I can't reach that. - } - else if (Entries.Count == 0) - { - from.SendLocalizedMessage(1062381); // The book is empty. - } - else if (from is PlayerMobile mobile) - { - mobile.SendGump(new BOBGump(mobile, this)); - } - } - - public override void OnDoubleClickSecureTrade(Mobile from) - { - if (!from.InRange(GetWorldLocation(), 2)) - { - from.SendLocalizedMessage(500446); // That is too far away. - } - else if (Entries.Count == 0) - { - from.SendLocalizedMessage(1062381); // The book is empty. - } - else - { - from.SendGump(new BOBGump((PlayerMobile)from, this)); - - var trade = GetSecureTradeCont()?.Trade; - - if (trade?.From.Mobile == from) - { - trade.To.Mobile.SendGump(new BOBGump((PlayerMobile)trade.To.Mobile, this)); - } - else if (trade?.To.Mobile == from) - { - trade.From.Mobile.SendGump(new BOBGump((PlayerMobile)trade.From.Mobile, this)); - } - } - } - - public override bool OnDragDrop(Mobile from, Item dropped) - { - if (dropped is BaseBOD) - { - if (!IsChildOf(from.Backpack)) - { - from.SendLocalizedMessage(1062385); // You must have the book in your backpack to add deeds to it. - return false; - } - - if (!from.Backpack.CheckHold(from, dropped, true, true)) - { - return false; - } - - if (Entries.Count < 500) - { - if (dropped is LargeBOD bod) - { - Entries.Add(new BOBLargeEntry(bod)); - } - else - { - Entries.Add(new BOBSmallEntry((SmallBOD)dropped)); - } - - InvalidateProperties(); - - if (Entries.Count / 5 > ItemCount) - { - ItemCount++; - InvalidateItems(); - } - - from.SendSound(0x42, GetWorldLocation()); - from.SendLocalizedMessage(1062386); // Deed added to book. - - if (from is PlayerMobile pm) - { - pm.SendGump(new BOBGump(pm, this)); - } - - dropped.Delete(); - - return true; - } - - from.SendLocalizedMessage(1062387); // The book is full of deeds. + from.SendLocalizedMessage(1062385); // You must have the book in your backpack to add deeds to it. return false; } - from.SendLocalizedMessage(1062388); // That is not a bulk order deed. + if (!from.Backpack.CheckHold(from, dropped, true, true)) + { + return false; + } + + if (Entries.Count < 500) + { + IBOBEntry entry = dropped is LargeBOD largeBod ? new BOBLargeEntry(largeBod) : new BOBSmallEntry((SmallBOD)dropped); + AddEntry(entry); + + if (Entries.Count / 5 > ItemCount) + { + ItemCount++; + InvalidateItems(); + } + + from.SendSound(0x42, GetWorldLocation()); + from.SendLocalizedMessage(1062386); // Deed added to book. + + if (from is PlayerMobile pm) + { + pm.SendGump(new BOBGump(pm, this)); + } + + dropped.Delete(); + + return true; + } + + from.SendLocalizedMessage(1062387); // The book is full of deeds. return false; } - public override int GetTotal(TotalType type) + from.SendLocalizedMessage(1062388); // That is not a bulk order deed. + return false; + } + + public override int GetTotal(TotalType type) + { + var total = base.GetTotal(type); + + if (type == TotalType.Items) { - var total = base.GetTotal(type); - - if (type == TotalType.Items) - { - total = ItemCount; - } - - return total; + total = ItemCount; } - public void InvalidateItems() + return total; + } + + public void AddEntry(IBOBEntry entry) + { + this.Add(Entries, entry); + InvalidateProperties(); + } + + public void RemoveEntry(IBOBEntry entry) + { + this.Remove(Entries, entry); + InvalidateProperties(); + } + + public void InvalidateItems() + { + if (RootParent is Mobile m) { - if (RootParent is Mobile m) - { - m.UpdateTotals(); - InvalidateContainers(Parent); - } + m.UpdateTotals(); + InvalidateContainers(Parent); } + } - public void InvalidateContainers(IEntity parent) + public void InvalidateContainers(IEntity parent) + { + if (parent is Container c) { - if (parent is Container c) - { - c.InvalidateProperties(); - InvalidateContainers(c.Parent); - } + c.InvalidateProperties(); + InvalidateContainers(c.Parent); } + } - public override void Serialize(IGenericWriter writer) + private void Deserialize(IGenericReader reader, int version) + { + _itemCount = reader.ReadInt(); + _level = (SecureLevel)reader.ReadInt(); + + _bookName = reader.ReadString(); + + _filter = new BOBFilter(); + _filter.Deserialize(reader); + + var count = reader.ReadEncodedInt(); + + Entries = new List(count); + + for (var i = 0; i < count; ++i) { - base.Serialize(writer); + var v = reader.ReadEncodedInt(); - writer.Write(2); // version - - writer.Write(ItemCount); - - writer.Write((int)Level); - - writer.Write(m_BookName); - - Filter.Serialize(writer); - - writer.WriteEncodedInt(Entries.Count); - - for (var i = 0; i < Entries.Count; ++i) + switch (v) { - object obj = Entries[i]; - - if (obj is BOBLargeEntry entry) - { - writer.WriteEncodedInt(0); - entry.Serialize(writer); - } - else - { - writer.WriteEncodedInt(1); - ((BOBSmallEntry)obj).Serialize(writer); - } - } - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - - switch (version) - { - case 2: + case 0: { - ItemCount = reader.ReadInt(); - goto case 1; + var largeEntry = new BOBLargeEntry(BOBEntries.NewBOBEntry); + largeEntry.Deserialize(reader); + AddEntry(largeEntry); + break; } case 1: { - Level = (SecureLevel)reader.ReadInt(); - goto case 0; - } - case 0: - { - m_BookName = reader.ReadString(); - - Filter = new BOBFilter(reader); - - var count = reader.ReadEncodedInt(); - - Entries = new List(count); - - for (var i = 0; i < count; ++i) - { - var v = reader.ReadEncodedInt(); - - switch (v) - { - case 0: - { - var largeEntry = new BOBLargeEntry(BOBEntries.NewBOBEntry); - largeEntry.Deserialize(reader); - - Entries.Add(largeEntry); - break; - } - case 1: - { - var smallEntry = new BOBSmallEntry(BOBEntries.NewBOBEntry); - smallEntry.Deserialize(reader); - Entries.Add(smallEntry); - break; - } - } - } - + var smallEntry = new BOBSmallEntry(BOBEntries.NewBOBEntry); + smallEntry.Deserialize(reader); + AddEntry(smallEntry); break; } } } + } - public override void GetProperties(IPropertyList list) + public override void GetProperties(IPropertyList list) + { + base.GetProperties(list); + + list.Add(1062344, Entries.Count); // Deeds in book: ~1_val~ + + if (!string.IsNullOrEmpty(_bookName)) { - base.GetProperties(list); + list.Add(1062481, _bookName); // Book Name: ~1_val~ + } + } - list.Add(1062344, Entries.Count); // Deeds in book: ~1_val~ + public override void OnSingleClick(Mobile from) + { + base.OnSingleClick(from); - if (!string.IsNullOrEmpty(m_BookName)) - { - list.Add(1062481, m_BookName); // Book Name: ~1_val~ - } + LabelTo(from, 1062344, Entries.Count.ToString()); // Deeds in book: ~1_val~ + + if (!string.IsNullOrEmpty(_bookName)) + { + LabelTo(from, 1062481, _bookName); + } + } + + public override void GetContextMenuEntries(Mobile from, List list) + { + base.GetContextMenuEntries(from, list); + + if (from.CheckAlive() && IsChildOf(from.Backpack)) + { + list.Add(new NameBookEntry(from, this)); } - public override void OnSingleClick(Mobile from) + SetSecureLevelEntry.AddTo(from, this, list); + } + + private class NameBookEntry : ContextMenuEntry + { + private readonly BulkOrderBook m_Book; + private readonly Mobile m_From; + + public NameBookEntry(Mobile from, BulkOrderBook book) : base(6216) { - base.OnSingleClick(from); - - LabelTo(from, 1062344, Entries.Count.ToString()); // Deeds in book: ~1_val~ - - if (!string.IsNullOrEmpty(m_BookName)) - { - LabelTo(from, 1062481, m_BookName); - } + m_From = from; + m_Book = book; } - public override void GetContextMenuEntries(Mobile from, List list) + public override void OnClick() { - base.GetContextMenuEntries(from, list); - - if (from.CheckAlive() && IsChildOf(from.Backpack)) - { - list.Add(new NameBookEntry(from, this)); - } - - SetSecureLevelEntry.AddTo(from, this, list); - } - - private class NameBookEntry : ContextMenuEntry - { - private readonly BulkOrderBook m_Book; - private readonly Mobile m_From; - - public NameBookEntry(Mobile from, BulkOrderBook book) : base(6216) - { - m_From = from; - m_Book = book; - } - - public override void OnClick() - { - if (m_From.CheckAlive() && m_Book.IsChildOf(m_From.Backpack)) - { - m_From.Prompt = new NameBookPrompt(m_Book); - m_From.SendLocalizedMessage(1062479); // Type in the new name of the book: - } - } - } - - private class NameBookPrompt : Prompt - { - private readonly BulkOrderBook m_Book; - - public NameBookPrompt(BulkOrderBook book) => m_Book = book; - - public override void OnResponse(Mobile from, string text) - { - if (text.Length > 40) - { - text = text[..40]; - } - - if (from.CheckAlive() && m_Book.IsChildOf(from.Backpack)) - { - m_Book.BookName = Utility.FixHtml(text.Trim()); - - from.SendLocalizedMessage(1062480); // The bulk order book's name has been changed. - } - } - - public override void OnCancel(Mobile from) + if (m_From.CheckAlive() && m_Book.IsChildOf(m_From.Backpack)) { + m_From.Prompt = new NameBookPrompt(m_Book); + m_From.SendLocalizedMessage(1062479); // Type in the new name of the book: } } } + + private class NameBookPrompt : Prompt + { + private readonly BulkOrderBook m_Book; + + public NameBookPrompt(BulkOrderBook book) => m_Book = book; + + public override void OnResponse(Mobile from, string text) + { + if (text.Length > 40) + { + text = text[..40]; + } + + if (from.CheckAlive() && m_Book.IsChildOf(from.Backpack)) + { + m_Book.BookName = Utility.FixHtml(text.Trim()); + + from.SendLocalizedMessage(1062480); // The bulk order book's name has been changed. + } + } + + public override void OnCancel(Mobile from) + { + } + } } diff --git a/Projects/UOContent/Migrations/Server.Engines.BulkOrders.BOBFilter.v2.json b/Projects/UOContent/Migrations/Server.Engines.BulkOrders.BOBFilter.v2.json new file mode 100644 index 000000000..bf2354228 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.BulkOrders.BOBFilter.v2.json @@ -0,0 +1,42 @@ +{ + "version": 2, + "type": "Server.Engines.BulkOrders.BOBFilter", + "properties": [ + { + "name": "Type", + "type": "int", + "usesSaveFlag": true, + "rule": "PrimitiveTypeMigrationRule", + "ruleArguments": [ + "" + ] + }, + { + "name": "Quality", + "type": "int", + "usesSaveFlag": true, + "rule": "PrimitiveTypeMigrationRule", + "ruleArguments": [ + "" + ] + }, + { + "name": "Material", + "type": "int", + "usesSaveFlag": true, + "rule": "PrimitiveTypeMigrationRule", + "ruleArguments": [ + "" + ] + }, + { + "name": "Quantity", + "type": "int", + "usesSaveFlag": true, + "rule": "PrimitiveTypeMigrationRule", + "ruleArguments": [ + "" + ] + } + ] +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.BulkOrders.BulkOrderBook.v3.json b/Projects/UOContent/Migrations/Server.Engines.BulkOrders.BulkOrderBook.v3.json new file mode 100644 index 000000000..37899091a --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.BulkOrders.BulkOrderBook.v3.json @@ -0,0 +1,44 @@ +{ + "version": 3, + "type": "Server.Engines.BulkOrders.BulkOrderBook", + "properties": [ + { + "name": "ItemCount", + "type": "int", + "rule": "PrimitiveTypeMigrationRule", + "ruleArguments": [ + "" + ] + }, + { + "name": "Level", + "type": "Server.Multis.SecureLevel", + "rule": "EnumMigrationRule" + }, + { + "name": "BookName", + "type": "string", + "rule": "PrimitiveTypeMigrationRule", + "ruleArguments": [ + "" + ] + }, + { + "name": "Filter", + "type": "Server.Engines.BulkOrders.BOBFilter", + "rule": "RawSerializableMigrationRule", + "ruleArguments": [ + "" + ] + }, + { + "name": "Entries", + "type": "System.Collections.Generic.List\u003CServer.Engines.BulkOrders.IBOBEntry\u003E", + "rule": "ListMigrationRule", + "ruleArguments": [ + "Server.Engines.BulkOrders.IBOBEntry", + "SerializableInterfaceMigrationRule" + ] + } + ] +} \ No newline at end of file diff --git a/Projects/UOContent/Mobiles/PlayerMobile.cs b/Projects/UOContent/Mobiles/PlayerMobile.cs index ad7836ba4..0c668510e 100644 --- a/Projects/UOContent/Mobiles/PlayerMobile.cs +++ b/Projects/UOContent/Mobiles/PlayerMobile.cs @@ -3040,7 +3040,8 @@ namespace Server.Mobiles case 13: // just removed m_PaidInsurance list case 12: { - BOBFilter = new BOBFilter(reader); + BOBFilter = new BOBFilter(); + BOBFilter.Deserialize(reader); goto case 11; } case 11: