diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json index 99cb98e18..805e7d4d8 100644 --- a/.config/dotnet-tools.json +++ b/.config/dotnet-tools.json @@ -3,7 +3,7 @@ "isRoot": true, "tools": { "modernuoschemagenerator": { - "version": "2.5.0", + "version": "2.5.1", "commands": [ "ModernUOSchemaGenerator" ] diff --git a/Projects/Server/Serialization/IGenericReader.cs b/Projects/Server/Serialization/IGenericReader.cs index f5b29f611..0f5fb6eec 100644 --- a/Projects/Server/Serialization/IGenericReader.cs +++ b/Projects/Server/Serialization/IGenericReader.cs @@ -120,5 +120,16 @@ public interface IGenericReader BitArray ReadBitArray(); + TextDefinition ReadTextDefinition() + { + return ReadEncodedInt() switch + { + 0 => new TextDefinition(), + 1 => new TextDefinition(ReadEncodedInt()), + 2 => new TextDefinition(ReadString()), + _ => null + }; + } + long Seek(long offset, SeekOrigin origin); } diff --git a/Projects/Server/Serialization/IGenericWriter.cs b/Projects/Server/Serialization/IGenericWriter.cs index a7dd75a1a..26b24bc0c 100644 --- a/Projects/Server/Serialization/IGenericWriter.cs +++ b/Projects/Server/Serialization/IGenericWriter.cs @@ -164,5 +164,27 @@ public interface IGenericWriter void Write(BitArray bitArray); + void Write(TextDefinition def) + { + if (def == null) + { + WriteEncodedInt(3); + } + else if (def.Number > 0) + { + WriteEncodedInt(1); + WriteEncodedInt(def.Number); + } + else if (def.String != null) + { + WriteEncodedInt(2); + Write(def.String); + } + else + { + WriteEncodedInt(0); // Empty + } + } + long Seek(long offset, SeekOrigin origin); } diff --git a/Projects/Server/Server.csproj b/Projects/Server/Server.csproj index 5a6f0146f..bb6f94411 100755 --- a/Projects/Server/Server.csproj +++ b/Projects/Server/Server.csproj @@ -42,7 +42,7 @@ - + diff --git a/Projects/Server/Text/TextDefinition.cs b/Projects/Server/Text/TextDefinition.cs new file mode 100644 index 000000000..bfb2f4f08 --- /dev/null +++ b/Projects/Server/Text/TextDefinition.cs @@ -0,0 +1,65 @@ +/************************************************************************* + * ModernUO * + * Copyright 2019-2022 - ModernUO Development Team * + * Email: hi@modernuo.com * + * File: TextDefinition.cs * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + *************************************************************************/ + +namespace Server; + +[Parsable] +[PropertyObject] +public class TextDefinition +{ + public TextDefinition(string text) : this(0, text) + { + } + + public TextDefinition(int number = 0, string text = null) + { + Number = number; + String = text; + } + + [CommandProperty(AccessLevel.GameMaster)] + public int Number { get; } + + [CommandProperty(AccessLevel.GameMaster)] + public string String { get; } + + public bool IsEmpty => Number <= 0 && String == null; + + public override string ToString() => Number > 0 ? $"#{Number}" : String ?? ""; + + public string Format() => + Number > 0 ? $"{Number} (0x{Number:X})" : + String != null ? $"\"{String}\"" : null; + + public string GetValue() => Number > 0 ? Number.ToString() : String ?? ""; + + public static implicit operator TextDefinition(int v) => new(v); + + public static implicit operator TextDefinition(string s) => new(s); + + public static implicit operator int(TextDefinition m) => m?.Number ?? 0; + + public static implicit operator string(TextDefinition m) => m?.String; + + public static TextDefinition Parse(string value) + { + if (value == null) + { + return null; + } + + return Utility.ToInt32(value, out var i) ? new TextDefinition(i) : new TextDefinition(value); + } +} diff --git a/Projects/Server/Text/TextDefinitionExtensions.cs b/Projects/Server/Text/TextDefinitionExtensions.cs new file mode 100644 index 000000000..af93ad833 --- /dev/null +++ b/Projects/Server/Text/TextDefinitionExtensions.cs @@ -0,0 +1,159 @@ +/************************************************************************* + * ModernUO * + * Copyright 2019-2022 - ModernUO Development Team * + * Email: hi@modernuo.com * + * File: TextDefinitionExtensions.cs * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + *************************************************************************/ + +using Server.Gumps; +using Server.Network; + +namespace Server; + +public static class TextDefinitionExtensions +{ + public static void AddHtmlText( + this TextDefinition def, + Gump g, + int x, + int y, + int width, + int height, + bool back, + bool scroll, + int numberColor = -1, + int stringColor = -1 + ) + { + if (def == null) + { + return; + } + + if (def.Number > 0) + { + if (numberColor >= 0) // 5 bits per RGB component (15 bit RGB) + { + g.AddHtmlLocalized(x, y, width, height, def.Number, numberColor, back, scroll); + } + else + { + g.AddHtmlLocalized(x, y, width, height, def.Number, back, scroll); + } + } + else if (def.String != null) + { + if (stringColor >= 0) // 8 bits per RGB component (24 bit RGB) + { + g.AddHtml( + x, + y, + width, + height, + $"{def.String}", + back, + scroll + ); + } + else + { + g.AddHtml(x, y, width, height, def.String, back, scroll); + } + } + } + + public static void AddTo(this TextDefinition def, IPropertyList list) + { + if (def == null) + { + return; + } + + if (def.Number > 0) + { + list.Add(def.Number); + } + else if (def.String != null) + { + list.Add(def.String); + } + } + + public static void AddTo(this TextDefinition def, IPropertyList list, int number) + { + if (def == null) + { + return; + } + + if (def.Number > 0) + { + list.Add(number, $"{def.Number:#}"); + } + else if (def.String != null) + { + list.Add(number, $"{def.String}"); + } + } + + public static void SendMessageTo(this TextDefinition def, Mobile m) + { + if (def == null) + { + return; + } + + if (def.Number > 0) + { + m.SendLocalizedMessage(def.Number); + } + else if (def.String != null) + { + m.SendMessage(def.String); + } + } + + public static void SendMessageTo(this TextDefinition def, Mobile m, int hue) + { + if (def == null) + { + return; + } + + if (def.Number > 0) + { + m.SendLocalizedMessage(def.Number, "", hue); + } + else if (def.String != null) + { + m.SendMessage(hue, def.String); + } + } + + public static void PublicOverheadMessage(this TextDefinition def, Mobile m, MessageType messageType, int hue) + { + if (def == null) + { + return; + } + + if (def.Number > 0) + { + m.PublicOverheadMessage(messageType, hue, def.Number); + } + else if (def.String != null) + { + m.PublicOverheadMessage(messageType, hue, false, def.String); + } + } + + public static bool IsNullOrEmpty(this TextDefinition def) => def?.IsEmpty != false; +} diff --git a/Projects/UOContent/Commands/Properties.cs b/Projects/UOContent/Commands/Properties.cs index 8d888bb1f..1f35f1147 100644 --- a/Projects/UOContent/Commands/Properties.cs +++ b/Projects/UOContent/Commands/Properties.cs @@ -319,7 +319,7 @@ namespace Server.Commands } else if (IsText(type)) { - toString = ((TextDefinition)value).Format(false); + toString = ((TextDefinition)value).Format() ?? "empty"; } else { diff --git a/Projects/UOContent/Engines/Craft/Core/CraftGumpItem.cs b/Projects/UOContent/Engines/Craft/Core/CraftGumpItem.cs index d4e24ea9b..ca87b5aa0 100644 --- a/Projects/UOContent/Engines/Craft/Core/CraftGumpItem.cs +++ b/Projects/UOContent/Engines/Craft/Core/CraftGumpItem.cs @@ -112,13 +112,12 @@ namespace Server.Engines.Craft if (craftItem.RequiredExpansion != Expansion.None) { var supportsEx = from.NetState?.SupportsExpansion(craftItem.RequiredExpansion) == true; - TextDefinition.AddHtmlText( + RequiredExpansionMessage(craftItem.RequiredExpansion).AddHtmlText( this, 170, 302 + m_OtherCount++ * 20, 310, 18, - RequiredExpansionMessage(craftItem.RequiredExpansion), false, false, supportsEx ? LabelColor : RedLabelColor, diff --git a/Projects/UOContent/Engines/Factions/Items/Sigil.cs b/Projects/UOContent/Engines/Factions/Items/Sigil.cs index 8fab6abd9..997aae5d5 100644 --- a/Projects/UOContent/Engines/Factions/Items/Sigil.cs +++ b/Projects/UOContent/Engines/Factions/Items/Sigil.cs @@ -134,7 +134,7 @@ namespace Server.Factions if (IsCorrupted) { - TextDefinition.AddTo(list, m_Corrupted.Definition.SigilControl); + m_Corrupted.Definition.SigilControl.AddTo(list); } else { diff --git a/Projects/UOContent/Engines/Harvest/Core/BonusHarvestResource.cs b/Projects/UOContent/Engines/Harvest/Core/BonusHarvestResource.cs index ca7f95183..c5d51e70d 100644 --- a/Projects/UOContent/Engines/Harvest/Core/BonusHarvestResource.cs +++ b/Projects/UOContent/Engines/Harvest/Core/BonusHarvestResource.cs @@ -23,7 +23,7 @@ namespace Server.Engines.Harvest public void SendSuccessTo(Mobile m) { - TextDefinition.SendMessageTo(m, SuccessMessage); + SuccessMessage.SendMessageTo(m); } } } diff --git a/Projects/UOContent/Engines/ML Quests/Gumps/BaseQuestGump.cs b/Projects/UOContent/Engines/ML Quests/Gumps/BaseQuestGump.cs index 9db8b74a8..d323db205 100644 --- a/Projects/UOContent/Engines/ML Quests/Gumps/BaseQuestGump.cs +++ b/Projects/UOContent/Engines/ML Quests/Gumps/BaseQuestGump.cs @@ -149,7 +149,7 @@ namespace Server.Engines.MLQuests.Gumps 0x2710 ); - TextDefinition.AddHtmlText(this, 98, 156, 312, 240, quest.Description, false, true, 0x15F90, 0xBDE784); + quest.Description.AddHtmlText(this, 98, 156, 312, 240, false, true, 0x15F90, 0xBDE784); } public void AddObjectives(MLQuest quest) @@ -250,7 +250,7 @@ namespace Server.Engines.MLQuests.Gumps public void AddConversation(TextDefinition text) { - TextDefinition.AddHtmlText(this, 98, 140, 312, 180, text, false, true, 0x15F90, 0xBDE784); + text.AddHtmlText(this, 98, 140, 312, 180, false, true, 0x15F90, 0xBDE784); } /* OSI gump IDs: diff --git a/Projects/UOContent/Engines/ML Quests/Gumps/InfoNPCGump.cs b/Projects/UOContent/Engines/ML Quests/Gumps/InfoNPCGump.cs index 8aa04b5a4..6a646a68b 100644 --- a/Projects/UOContent/Engines/ML Quests/Gumps/InfoNPCGump.cs +++ b/Projects/UOContent/Engines/ML Quests/Gumps/InfoNPCGump.cs @@ -10,8 +10,8 @@ namespace Server.Engines.MLQuests.Gumps SetPageCount(1); BuildPage(); - TextDefinition.AddHtmlText(this, 160, 108, 250, 16, title, false, false, 0x2710, 0x4AC684); - TextDefinition.AddHtmlText(this, 98, 156, 312, 180, message, false, true, 0x15F90, 0xBDE784); + title.AddHtmlText(this, 160, 108, 250, 16, false, false, 0x2710, 0x4AC684); + message.AddHtmlText(this, 98, 156, 312, 180, false, true, 0x15F90, 0xBDE784); } } } diff --git a/Projects/UOContent/Engines/ML Quests/Gumps/QuestLogGump.cs b/Projects/UOContent/Engines/ML Quests/Gumps/QuestLogGump.cs index f12b7f46b..4d4477ccc 100644 --- a/Projects/UOContent/Engines/ML Quests/Gumps/QuestLogGump.cs +++ b/Projects/UOContent/Engines/ML Quests/Gumps/QuestLogGump.cs @@ -47,13 +47,12 @@ namespace Server.Engines.MLQuests.Gumps numberColor = stringColor = 0xFFFFFF; } - TextDefinition.AddHtmlText( + instances[i].Quest.Title.AddHtmlText( this, 98, 140 + 21 * i, 270, 21, - instances[i].Quest.Title, false, false, numberColor, diff --git a/Projects/UOContent/Engines/ML Quests/Items/Teleporters.cs b/Projects/UOContent/Engines/ML Quests/Items/Teleporters.cs index e7abdc648..a97718529 100644 --- a/Projects/UOContent/Engines/ML Quests/Items/Teleporters.cs +++ b/Projects/UOContent/Engines/ML Quests/Items/Teleporters.cs @@ -67,7 +67,7 @@ namespace Server.Engines.MLQuests.Items return true; } - TextDefinition.SendMessageTo(m, Message); + Message.SendMessageTo(m); return false; } @@ -88,7 +88,7 @@ namespace Server.Engines.MLQuests.Items writer.Write(0); // version writer.Write(m_QuestType?.FullName); - TextDefinition.Serialize(writer, Message); + writer.Write(Message); } public override void Deserialize(IGenericReader reader) @@ -104,7 +104,7 @@ namespace Server.Engines.MLQuests.Items m_QuestType = AssemblyHandler.FindTypeByFullName(typeName); } - Message = TextDefinition.Deserialize(reader); + Message = reader.ReadTextDefinition(); } } @@ -170,7 +170,7 @@ namespace Server.Engines.MLQuests.Items if (ticket == null) { - TextDefinition.SendMessageTo(m, Message); + Message.SendMessageTo(m); return false; } @@ -196,7 +196,7 @@ namespace Server.Engines.MLQuests.Items writer.Write(0); // version writer.Write( m_TicketType?.FullName); - TextDefinition.Serialize(writer, Message); + writer.Write(Message); } public override void Deserialize(IGenericReader reader) @@ -212,7 +212,7 @@ namespace Server.Engines.MLQuests.Items m_TicketType = AssemblyHandler.FindTypeByFullName(typeName); } - Message = TextDefinition.Deserialize(reader); + Message = reader.ReadTextDefinition(); } } } diff --git a/Projects/UOContent/Engines/ML Quests/MLQuestEntry.cs b/Projects/UOContent/Engines/ML Quests/MLQuestEntry.cs index 6816fc2a2..598a45995 100644 --- a/Projects/UOContent/Engines/ML Quests/MLQuestEntry.cs +++ b/Projects/UOContent/Engines/ML Quests/MLQuestEntry.cs @@ -96,7 +96,7 @@ namespace Server.Engines.MLQuests public BaseObjectiveInstance[] Objectives { get; set; } - public bool SkipReportBack => TextDefinition.IsNullOrEmpty(Quest.CompletionMessage); + public bool SkipReportBack => Quest.CompletionMessage.IsNullOrEmpty(); private void Register() { @@ -166,7 +166,7 @@ namespace Server.Engines.MLQuests obj.OnQuestCompleted(); } - TextDefinition.SendMessageTo(Player, Quest.CompletionNotice, 0x23); + Quest.CompletionNotice.SendMessageTo(Player, 0x23); /* * Advance to the ClaimReward=true stage if this quest has no @@ -176,8 +176,8 @@ namespace Server.Engines.MLQuests * For quests that require collections, this is done later when * the player double clicks the quester. */ - if (!Removed && SkipReportBack && !Quest.RequiresCollection - ) // An OnQuestCompleted can potentially have removed this instance already + // An OnQuestCompleted can potentially have removed this instance already + if (!Removed && SkipReportBack && !Quest.RequiresCollection) { ContinueReportBack(false); } diff --git a/Projects/UOContent/Engines/ML Quests/Mobiles/BoonCollector.cs b/Projects/UOContent/Engines/ML Quests/Mobiles/BoonCollector.cs index b6c00bcc4..0d5d65f01 100644 --- a/Projects/UOContent/Engines/ML Quests/Mobiles/BoonCollector.cs +++ b/Projects/UOContent/Engines/ML Quests/Mobiles/BoonCollector.cs @@ -243,7 +243,7 @@ namespace Server.Engines.MLQuests.Mobiles } } - TextDefinition.PublicOverheadMessage(m_Owner, MessageType.Regular, 0x3B2, m_Conversation[m_Index++]); + m_Conversation[m_Index++].PublicOverheadMessage(m_Owner, MessageType.Regular, 0x3B2); Interval = GetDelay(); } } @@ -257,9 +257,9 @@ namespace Server.Engines.MLQuests.Mobiles 1073998, // Blessings of Sosaria to you and merry met, friend. 1073999, // I am glad for your company and wonder if you seek the heritage of your people? I sense within you an elven bloodline -- the purity of which was lost when our brothers and sisters were exiled here in the Rupture. 1074000, // If it is your desire to reclaim your place amongst the people, you must demonstrate that you understand and embrace the responsibilities expected of you as an elf. - 1074001, // The most basic lessons of our Sosaria are taught by her humblest children. Seek Maul, the great bear, who understands instictively the seasons. + 1074001, // The most basic lessons of our Sosaria are taught by her humblest children. Seek Maul, the great bear, who understands instinctively the seasons. 1074398, // Seek Strongroot, the great treefellow, whose very roots reach to the heart of the world. Seek Enigma, whose wisdom can only be conveyed in riddles and rhymes. Seek Bravehorn, the great hart, who exemplifies the fierce dedication of a protector of his people. - 1074399, // Seek the Huntsman, the centuar tasked with maintaining the balance. And lastly seek Arielle, the pixie, who has perhaps the most important lesson -- not to take yourself too seriously. + 1074399, // Seek the Huntsman, the centaur tasked with maintaining the balance. And lastly seek Arielle, the pixie, who has perhaps the most important lesson -- not to take yourself too seriously. 1074400 // Or do none of these things. You must choose your own path in the world, and what use you'll make of your existence. }; diff --git a/Projects/UOContent/Engines/ML Quests/Rewards/BaseReward.cs b/Projects/UOContent/Engines/ML Quests/Rewards/BaseReward.cs index 7825ceebd..52788a212 100644 --- a/Projects/UOContent/Engines/ML Quests/Rewards/BaseReward.cs +++ b/Projects/UOContent/Engines/ML Quests/Rewards/BaseReward.cs @@ -14,7 +14,7 @@ namespace Server.Engines.MLQuests.Rewards public void WriteToGump(Gump g, int x, ref int y) { - TextDefinition.AddHtmlText(g, x, y, 280, LabelHeight, Name, false, false, 0x15F90, 0xBDE784); + Name.AddHtmlText(g, x, y, 280, LabelHeight, false, false, 0x15F90, 0xBDE784); } public abstract void AddRewardItems(PlayerMobile pm, List rewards); diff --git a/Projects/UOContent/Engines/Spawners/ProximitySpawner.cs b/Projects/UOContent/Engines/Spawners/ProximitySpawner.cs index 74cdaffe3..8b62f6e86 100644 --- a/Projects/UOContent/Engines/Spawners/ProximitySpawner.cs +++ b/Projects/UOContent/Engines/Spawners/ProximitySpawner.cs @@ -145,7 +145,7 @@ namespace Server.Engines.Spawners if (IsEmpty && End <= Core.Now && m.InRange(GetWorldLocation(), TriggerRange) && m.Location != oldLocation && ValidTrigger(m)) { - TextDefinition.SendMessageTo(m, SpawnMessage); + SpawnMessage.SendMessageTo(m); DoTimer(); Spawn(); @@ -170,7 +170,7 @@ namespace Server.Engines.Spawners writer.WriteEncodedInt(0); // version writer.Write(TriggerRange); - TextDefinition.Serialize(writer, SpawnMessage); + writer.Write(SpawnMessage); writer.Write(InstantFlag); } @@ -181,7 +181,7 @@ namespace Server.Engines.Spawners var version = reader.ReadEncodedInt(); TriggerRange = reader.ReadInt(); - SpawnMessage = TextDefinition.Deserialize(reader); + SpawnMessage = reader.ReadTextDefinition(); InstantFlag = reader.ReadBool(); } } diff --git a/Projects/UOContent/Engines/Treasures of Tokuno/BasePigmentsOfTokuno.cs b/Projects/UOContent/Engines/Treasures of Tokuno/BasePigmentsOfTokuno.cs index f9745cb4c..5fe787e17 100644 --- a/Projects/UOContent/Engines/Treasures of Tokuno/BasePigmentsOfTokuno.cs +++ b/Projects/UOContent/Engines/Treasures of Tokuno/BasePigmentsOfTokuno.cs @@ -117,11 +117,7 @@ namespace Server.Items { base.GetProperties(list); - if (m_Label > 0) - { - TextDefinition.AddTo(list, m_Label); - } - + m_Label.AddTo(list); list.Add(1060584, m_UsesRemaining); // uses remaining: ~1_val~ } diff --git a/Projects/UOContent/Gumps/BaseImageTileButtonsGump.cs b/Projects/UOContent/Gumps/BaseImageTileButtonsGump.cs index 9e15cb31c..f18be777a 100644 --- a/Projects/UOContent/Gumps/BaseImageTileButtonsGump.cs +++ b/Projects/UOContent/Gumps/BaseImageTileButtonsGump.cs @@ -70,7 +70,7 @@ namespace Server.Gumps AddButton(10, y + 54, 0xFB1, 0xFB2, 0); // Cancel Button AddHtmlLocalized(45, y + 56, x - 50, 20, 1060051, 0x7FFF); // CANCEL - TextDefinition.AddHtmlText(this, 14, 12, x, 20, header, false, false, 0x7FFF, 0xFFFFFF); + header.AddHtmlText(this, 14, 12, x, 20, false, false, 0x7FFF, 0xFFFFFF); AddPage(1); @@ -112,7 +112,7 @@ namespace Server.Gumps 10 ); AddTooltip(b.LocalizedTooltip); - TextDefinition.AddHtmlText(this, innerX + 84, innerY, 250, 60, b.Label, false, false, 0x7FFF, 0xFFFFFF); + b.Label.AddHtmlText(this, innerX + 84, innerY, 250, 60, false, false, 0x7FFF, 0xFFFFFF); } } diff --git a/Projects/UOContent/Gumps/Props/PropsGump.cs b/Projects/UOContent/Gumps/Props/PropsGump.cs index 7eb76c502..2a66c32ed 100644 --- a/Projects/UOContent/Gumps/Props/PropsGump.cs +++ b/Projects/UOContent/Gumps/Props/PropsGump.cs @@ -545,7 +545,7 @@ namespace Server.Gumps if (o is TextDefinition definition) { - return definition.Format(true); + return definition.Format() ?? "-empty-"; } return o.ToString(); diff --git a/Projects/UOContent/Items/Misc/PromotionalToken.cs b/Projects/UOContent/Items/Misc/PromotionalToken.cs index d2def4a95..6c3a562f6 100644 --- a/Projects/UOContent/Items/Misc/PromotionalToken.cs +++ b/Projects/UOContent/Items/Misc/PromotionalToken.cs @@ -78,16 +78,9 @@ public abstract partial class PromotionalToken : Item AddPage(0); AddBackground(0, 0, 240, 135, 0x2422); - AddHtmlLocalized( - 15, - 15, - 210, - 75, - 1070972, - 0x0, - true - ); // Click "OKAY" to redeem the following promotional item: - TextDefinition.AddHtmlText(this, 15, 60, 210, 75, m_Token.ItemGumpName, false, false); + // Click "OKAY" to redeem the following promotional item: + AddHtmlLocalized(15, 15, 210, 75, 1070972, 0x0, true); + m_Token.ItemGumpName.AddHtmlText(this, 15, 60, 210, 75, false, false); AddButton(160, 95, 0xF7, 0xF8, 1); // Okay AddButton(90, 95, 0xF2, 0xF1, 0); // Cancel @@ -113,7 +106,7 @@ public abstract partial class PromotionalToken : Item if (i != null) { from.BankBox.AddItem(i); - TextDefinition.SendMessageTo(from, m_Token.ItemReceiveMessage); + m_Token.ItemReceiveMessage.SendMessageTo(from); m_Token.Delete(); } } diff --git a/Projects/UOContent/Items/Skill Items/Magical/Misc/Moongate.cs b/Projects/UOContent/Items/Skill Items/Magical/Misc/Moongate.cs index 9bf834dba..1bad249cc 100644 --- a/Projects/UOContent/Items/Skill Items/Magical/Misc/Moongate.cs +++ b/Projects/UOContent/Items/Skill Items/Magical/Misc/Moongate.cs @@ -313,7 +313,7 @@ namespace Server.Items writer.Write(1); // version - TextDefinition.Serialize(writer, Message); + writer.Write(Message); writer.WriteEncodedInt(GumpWidth); writer.WriteEncodedInt(GumpHeight); @@ -334,7 +334,7 @@ namespace Server.Items { case 1: { - Message = TextDefinition.Deserialize(reader); + Message = reader.ReadTextDefinition(); goto case 0; } case 0: diff --git a/Projects/UOContent/Items/Skill Items/Misc/RepairDeed.cs b/Projects/UOContent/Items/Skill Items/Misc/RepairDeed.cs index 671506b55..8b569c313 100644 --- a/Projects/UOContent/Items/Skill Items/Misc/RepairDeed.cs +++ b/Projects/UOContent/Items/Skill Items/Misc/RepairDeed.cs @@ -182,7 +182,7 @@ namespace Server.Items } else if (!VerifyRegion(from)) { - TextDefinition.SendMessageTo(from, RepairSkillInfo.GetInfo(m_Skill).NotNearbyMessage); + RepairSkillInfo.GetInfo(m_Skill).NotNearbyMessage.SendMessageTo(from); } else { diff --git a/Projects/UOContent/Items/Talismans/TalismanAttribute.cs b/Projects/UOContent/Items/Talismans/TalismanAttribute.cs index cfcc0f9c4..90871bf11 100644 --- a/Projects/UOContent/Items/Talismans/TalismanAttribute.cs +++ b/Projects/UOContent/Items/Talismans/TalismanAttribute.cs @@ -39,7 +39,7 @@ namespace Server.Items if (GetSaveFlag(flags, SaveFlag.Name)) { - Name = TextDefinition.Deserialize(reader); + Name = reader.ReadTextDefinition(); } if (GetSaveFlag(flags, SaveFlag.Amount)) @@ -94,7 +94,7 @@ namespace Server.Items if (GetSaveFlag(flags, SaveFlag.Name)) { - TextDefinition.Serialize(writer, Name); + writer.Write(Name); } if (GetSaveFlag(flags, SaveFlag.Amount)) diff --git a/Projects/UOContent/Misc/TextDefinition.cs b/Projects/UOContent/Misc/TextDefinition.cs deleted file mode 100644 index 97d71507b..000000000 --- a/Projects/UOContent/Misc/TextDefinition.cs +++ /dev/null @@ -1,207 +0,0 @@ -using Server.Gumps; -using Server.Network; - -namespace Server -{ - [Parsable] - public class TextDefinition - { - public TextDefinition(string text) : this(0, text) - { - } - - public TextDefinition(int number = 0, string text = null) - { - Number = number; - String = text; - } - - public int Number { get; } - - public string String { get; } - - public bool IsEmpty => Number <= 0 && String == null; - - public override string ToString() => Number > 0 ? $"#{Number}" : String ?? ""; - - public string Format(bool propsGump) => - Number > 0 ? $"{Number} (0x{Number:X})" : - String != null ? $"\"{String}\"" : - propsGump ? "-empty-" : "empty"; - - public string GetValue() => Number > 0 ? Number.ToString() : String ?? ""; - - public static void Serialize(IGenericWriter writer, TextDefinition def) - { - if (def == null) - { - writer.WriteEncodedInt(3); - } - else if (def.Number > 0) - { - writer.WriteEncodedInt(1); - writer.WriteEncodedInt(def.Number); - } - else if (def.String != null) - { - writer.WriteEncodedInt(2); - writer.Write(def.String); - } - else - { - writer.WriteEncodedInt(0); - } - } - - public static TextDefinition Deserialize(IGenericReader reader) - { - var type = reader.ReadEncodedInt(); - - return type switch - { - 0 => new TextDefinition(), - 1 => new TextDefinition(reader.ReadEncodedInt()), - 2 => new TextDefinition(reader.ReadString()), - _ => null - }; - } - - public static void AddTo(IPropertyList list, TextDefinition def) - { - if (def == null) - { - return; - } - - if (def.Number > 0) - { - list.Add(def.Number); - } - else if (def.String != null) - { - list.Add(def.String); - } - } - - public static implicit operator TextDefinition(int v) => new(v); - - public static implicit operator TextDefinition(string s) => new(s); - - public static implicit operator int(TextDefinition m) => m?.Number ?? 0; - - public static implicit operator string(TextDefinition m) => m?.String; - - public static void AddHtmlText( - Gump g, int x, int y, int width, int height, TextDefinition def, bool back, - bool scroll, int numberColor, int stringColor - ) - { - if (def == null) - { - return; - } - - if (def.Number > 0) - { - if (numberColor >= 0) // 5 bits per RGB component (15 bit RGB) - { - g.AddHtmlLocalized(x, y, width, height, def.Number, numberColor, back, scroll); - } - else - { - g.AddHtmlLocalized(x, y, width, height, def.Number, back, scroll); - } - } - else if (def.String != null) - { - if (stringColor >= 0) // 8 bits per RGB component (24 bit RGB) - { - g.AddHtml( - x, - y, - width, - height, - $"{def.String}", - back, - scroll - ); - } - else - { - g.AddHtml(x, y, width, height, def.String, back, scroll); - } - } - } - - public static void AddHtmlText( - Gump g, int x, int y, int width, int height, TextDefinition def, bool back, - bool scroll - ) - { - AddHtmlText(g, x, y, width, height, def, back, scroll, -1, -1); - } - - public static void SendMessageTo(Mobile m, TextDefinition def) - { - if (def == null) - { - return; - } - - if (def.Number > 0) - { - m.SendLocalizedMessage(def.Number); - } - else if (def.String != null) - { - m.SendMessage(def.String); - } - } - - public static void SendMessageTo(Mobile m, TextDefinition def, int hue) - { - if (def == null) - { - return; - } - - if (def.Number > 0) - { - m.SendLocalizedMessage(def.Number, "", hue); - } - else if (def.String != null) - { - m.SendMessage(hue, def.String); - } - } - - public static void PublicOverheadMessage(Mobile m, MessageType messageType, int hue, TextDefinition def) - { - if (def == null) - { - return; - } - - if (def.Number > 0) - { - m.PublicOverheadMessage(messageType, hue, def.Number); - } - else if (def.String != null) - { - m.PublicOverheadMessage(messageType, hue, false, def.String); - } - } - - public static TextDefinition Parse(string value) - { - if (value == null) - { - return null; - } - - return Utility.ToInt32(value, out var i) ? new TextDefinition(i) : new TextDefinition(value); - } - - public static bool IsNullOrEmpty(TextDefinition def) => def?.IsEmpty != false; - } -} diff --git a/Projects/UOContent/Spells/Base/SpecialMove.cs b/Projects/UOContent/Spells/Base/SpecialMove.cs index 4d85f3f14..25e6b5f3c 100644 --- a/Projects/UOContent/Spells/Base/SpecialMove.cs +++ b/Projects/UOContent/Spells/Base/SpecialMove.cs @@ -252,7 +252,7 @@ namespace Server.Spells m.NetState.SendToggleSpecialAbility(moveID + 1, true); } - TextDefinition.SendMessageTo(m, move.AbilityMessage); + move.AbilityMessage.SendMessageTo(m); } return true; diff --git a/Projects/UOContent/Spells/Spellweaving/Items/TransientItem.cs b/Projects/UOContent/Spells/Spellweaving/Items/TransientItem.cs index 8f5bec909..bfbd9fa81 100644 --- a/Projects/UOContent/Spells/Spellweaving/Items/TransientItem.cs +++ b/Projects/UOContent/Spells/Spellweaving/Items/TransientItem.cs @@ -33,10 +33,7 @@ namespace Server.Items public override void HandleInvalidTransfer(Mobile from) { - if (InvalidTransferMessage != null) - { - TextDefinition.SendMessageTo(from, InvalidTransferMessage); - } + InvalidTransferMessage.SendMessageTo(from); Delete(); } diff --git a/Projects/UOContent/UOContent.csproj b/Projects/UOContent/UOContent.csproj index 02c7dce37..9da10909e 100755 --- a/Projects/UOContent/UOContent.csproj +++ b/Projects/UOContent/UOContent.csproj @@ -48,7 +48,7 @@ - +