From 34b7945fc723c2c4ba3f27720ddfb176b05d0aef Mon Sep 17 00:00:00 2001 From: WarrentyExpired Date: Tue, 6 Oct 2026 20:51:27 -0400 Subject: [PATCH] #W# Change: Changed to UOR expansion. Added Hover text for armor and weapons. --- Distribution/Configuration/expansion.json | 24 ++-- Distribution/Configuration/modernuo.json | 3 +- Projects/UOContent/Items/Armor/BaseArmor.cs | 92 ++++++++++++++- .../UOContent/Items/Weapons/BaseWeapon.cs | 108 +++++++++++++++++- 4 files changed, 212 insertions(+), 15 deletions(-) diff --git a/Distribution/Configuration/expansion.json b/Distribution/Configuration/expansion.json index 4ddbdb733..d3f504955 100644 --- a/Distribution/Configuration/expansion.json +++ b/Distribution/Configuration/expansion.json @@ -1,14 +1,14 @@ { - "Id": 5, - "Name": "Age of Shadows", - "ClientFlags": "Malas", + "Id": 2, + "Name": "Renaissance", + "ClientFlags": "Trammel", "SupportedFeatures": { "ExpansionT2A": true, "T2A": true, "UOR": true, "UOTD": false, - "LBR": true, - "AOS": true, + "LBR": false, + "AOS": false, "SixthCharacterSlot": false, "SE": false, "ML": false, @@ -19,7 +19,7 @@ "SeventhCharacterSlot": false, "RoleplayFaces": false, "TrialAccount": false, - "LiveAccount": true, + "LiveAccount": false, "SA": false, "HS": false, "Gothic": false, @@ -40,7 +40,7 @@ "ExpansionUOR": true, "ContextMenus": true, "SlotLimit": false, - "AOS": true, + "AOS": false, "SixthCharacterSlot": false, "SE": false, "ML": false, @@ -53,8 +53,8 @@ "NewFeluccaAreas": false }, "HousingFlags": { - "AOS": true, - "HousingAOS": true, + "AOS": false, + "HousingAOS": false, "SE": false, "ML": false, "Crystal": false, @@ -67,12 +67,12 @@ "TOL": false, "EJ": false }, - "MobileStatusVersion": 6, + "MobileStatusVersion": 3, "MapSelectionFlags": { "Felucca": true, "Trammel": true, - "Ilshenar": true, - "Malas": true, + "Ilshenar": false, + "Malas": false, "Tokuno": false, "TerMur": false } diff --git a/Distribution/Configuration/modernuo.json b/Distribution/Configuration/modernuo.json index 75728c72d..0ee6e7a58 100644 --- a/Distribution/Configuration/modernuo.json +++ b/Distribution/Configuration/modernuo.json @@ -103,6 +103,7 @@ "visibleDamage": "True", "world.enableAutoRestart": "False", "world.savePath": "Saves", - "world.useMultithreadedSaves": "True" + "world.useMultithreadedSaves": "True", + "opl.enable": "Core.AOS" } } diff --git a/Projects/UOContent/Items/Armor/BaseArmor.cs b/Projects/UOContent/Items/Armor/BaseArmor.cs index a55400e5a..1e45b5200 100644 --- a/Projects/UOContent/Items/Armor/BaseArmor.cs +++ b/Projects/UOContent/Items/Armor/BaseArmor.cs @@ -1392,7 +1392,7 @@ namespace Server.Items from.NetState.SendDisplayEquipmentInfo(Serial, number, _crafter, false, attrs); } - public void OnSingleClickPreUOTD(Mobile from) + /*public void OnSingleClickPreUOTD(Mobile from) { var isMagicItem = _durability != ArmorDurabilityLevel.Regular || _protectionLevel != ArmorProtectionLevel.Regular; @@ -1455,6 +1455,96 @@ namespace Server.Items : $"{name} crafted by {Crafter}" ); } + */ + public void OnSingleClickPreUOTD(Mobile from) + { + var isMagicItem = _durability != ArmorDurabilityLevel.Regular || + _protectionLevel != ArmorProtectionLevel.Regular; + + // 1. Display the main item name + if (isMagicItem && !_identified) + { + LabelTo(from, $"an unidentified {Name ?? Localization.GetText(LabelNumber).ToLowerInvariant()}"); + } + else + { + var name = Name; + var articleAnName = (TileData.ItemTable[ItemID].Flags & TileFlag.ArticleAn) != 0; + + if (isMagicItem) + { + var builder = new ValueStringBuilder(stackalloc char[128]); + + var durabilityText = DurabilityText(out var articleAnDurability); + if (durabilityText != null) + { + builder.AppendSpaceWithArticle(durabilityText, articleAnDurability); + } + + if (name == null) + { + builder.AppendSpaceWithArticle(Localization.GetText(LabelNumber).ToLowerInvariant(), articleAnName); + } + else if (builder.Length != 0) + { + builder.Append($" {name}"); + } + else + { + builder.Append(name); + } + + var protectionText = ProtectionText; + if (protectionText != null) + { + builder.Append($" of {protectionText}"); + } + + LabelTo(from, builder.ToString()); + builder.Dispose(); + } + else + { + name ??= $"{(articleAnName ? "an" : "a")} {Localization.GetText(LabelNumber).ToLowerInvariant()}"; + + if (Crafter == null) + { + LabelTo(from, Quality == ArmorQuality.Exceptional ? $"{name} of exceptional quality" : name); + } + else + { + LabelTo( + from, + Quality == ArmorQuality.Exceptional + ? $"{name} crafted with exceptional quality by {Crafter}" + : $"{name} crafted by {Crafter}" + ); + } + } + } + + // 2. --- Sovereign Realm: Custom UOR Stat Display --- + + // Show Strength Requirement + int strReq = ComputeStatReq(StatType.Str); + if (strReq > 0) + { + LabelTo(from, $"Strength Requirement: {strReq}"); + } + + // Show Dexterity Penalty (using Math.Abs to format "-5" as just "5") + int dexBonus = ComputeStatBonus(StatType.Dex); + if (dexBonus < 0) + { + LabelTo(from, $"Dexterity Penalty: {Math.Abs(dexBonus)}"); + } + + // Show Durability (using HitPoints / MaxHitPoints) + if (_maxHitPoints > 0) + { + LabelTo(from, $"Durability: {_hitPoints} / {_maxHitPoints}"); + } + } [MethodImpl(MethodImplOptions.AggressiveInlining)] private string DurabilityText(out bool articleAn) diff --git a/Projects/UOContent/Items/Weapons/BaseWeapon.cs b/Projects/UOContent/Items/Weapons/BaseWeapon.cs index 0ecf36dfc..a94c7df2c 100644 --- a/Projects/UOContent/Items/Weapons/BaseWeapon.cs +++ b/Projects/UOContent/Items/Weapons/BaseWeapon.cs @@ -3228,7 +3228,7 @@ public abstract partial class BaseWeapon from.NetState.SendDisplayEquipmentInfo(Serial, number, _crafter, false, attrs); } - public virtual void OnSingleClickPreUOTD(Mobile from) + /*public virtual void OnSingleClickPreUOTD(Mobile from) { var isMagicItem = _durabilityLevel > WeaponDurabilityLevel.Regular || _accuracyLevel > WeaponAccuracyLevel.Regular || @@ -3307,6 +3307,112 @@ public abstract partial class BaseWeapon : $"{name} crafted by {Crafter}" ); } + */ + public virtual void OnSingleClickPreUOTD(Mobile from) + { + var isMagicItem = _durabilityLevel > WeaponDurabilityLevel.Regular || + _accuracyLevel > WeaponAccuracyLevel.Regular || + _damageLevel > WeaponDamageLevel.Regular || + _slayer != SlayerName.None; + + // 1. Display the main item name + if (isMagicItem && !_identified) + { + LabelTo(from, $"an unidentified {Name ?? Localization.GetText(LabelNumber).ToLowerInvariant()}"); + } + else + { + var name = Name; + var articleAnName = (TileData.ItemTable[ItemID].Flags & TileFlag.ArticleAn) != 0; + + if (isMagicItem) + { + var builder = new ValueStringBuilder(stackalloc char[160]); + + var durabilityText = DurabilityText(out var articleAnDurability); + if (durabilityText != null) + { + builder.AppendSpaceWithArticle(durabilityText, articleAnDurability); + } + + var accuracyText = AccuracyText(out var articleAnAccuracy); + if (accuracyText != null) + { + builder.AppendSpaceWithArticle(accuracyText, articleAnAccuracy); + } + + var slayerEntry = SlayerGroup.GetEntryByName(_slayer); + if (slayerEntry != null) + { + builder.AppendSpaceWithArticle(slayerEntry.SlayerText(out var articleAnSlayer), articleAnSlayer); + } + + if (name == null) + { + builder.AppendSpaceWithArticle(Localization.GetText(LabelNumber).ToLowerInvariant(), articleAnName); + } + else if (builder.Length != 0) + { + builder.Append($" {name}"); + } + else + { + builder.Append(name); + } + + var weaponDamageText = WeaponDamageText; + if (weaponDamageText != null) + { + builder.Append($" of {weaponDamageText}"); + } + + // TODO: Spells (of Ghoul's Touch) + + LabelTo(from, builder.ToString()); + builder.Dispose(); + } + else + { + // Handles regular, non-magic, or crafted weapons + name ??= $"{(articleAnName ? "an" : "a")} {Localization.GetText(LabelNumber).ToLowerInvariant()}"; + + if (Crafter == null) + { + LabelTo(from, Quality == WeaponQuality.Exceptional ? $"{name} of exceptional quality" : name); + } + else + { + LabelTo( + from, + Quality == WeaponQuality.Exceptional + ? $"{name} crafted with exceptional quality by {Crafter}" + : $"{name} crafted by {Crafter}" + ); + } + } + } + + // 2. --- Sovereign Realm: Custom UOR Stat Display --- + + // Show Damage + LabelTo(from, $"Damage: {MinDamage} to {MaxDamage}"); + + // Show Weapon Speed + LabelTo(from, $"Speed: {Speed}"); + + // Show Strength Requirement + int strReq = StrRequirement; // Usually named StrRequirement or DefStrReq depending on the emulator version + if (strReq > 0) + { + LabelTo(from, $"Strength Requirement: {strReq}"); + } + + // Show Durability + if (MaxHitPoints > 0) + { + LabelTo(from, $"Durability: {HitPoints} / {MaxHitPoints}"); + } + } [MethodImpl(MethodImplOptions.AggressiveInlining)] private string DurabilityText(out bool articleAn)