#W# Change: Changed to UOR expansion. Added Hover text for armor and weapons.

This commit is contained in:
WarrentyExpired 2026-10-06 20:51:27 -04:00
parent fa33f8466d
commit 34b7945fc7
4 changed files with 212 additions and 15 deletions

View file

@ -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
}

View file

@ -103,6 +103,7 @@
"visibleDamage": "True",
"world.enableAutoRestart": "False",
"world.savePath": "Saves",
"world.useMultithreadedSaves": "True"
"world.useMultithreadedSaves": "True",
"opl.enable": "Core.AOS"
}
}

View file

@ -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)

View file

@ -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)