#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, "Id": 2,
"Name": "Age of Shadows", "Name": "Renaissance",
"ClientFlags": "Malas", "ClientFlags": "Trammel",
"SupportedFeatures": { "SupportedFeatures": {
"ExpansionT2A": true, "ExpansionT2A": true,
"T2A": true, "T2A": true,
"UOR": true, "UOR": true,
"UOTD": false, "UOTD": false,
"LBR": true, "LBR": false,
"AOS": true, "AOS": false,
"SixthCharacterSlot": false, "SixthCharacterSlot": false,
"SE": false, "SE": false,
"ML": false, "ML": false,
@ -19,7 +19,7 @@
"SeventhCharacterSlot": false, "SeventhCharacterSlot": false,
"RoleplayFaces": false, "RoleplayFaces": false,
"TrialAccount": false, "TrialAccount": false,
"LiveAccount": true, "LiveAccount": false,
"SA": false, "SA": false,
"HS": false, "HS": false,
"Gothic": false, "Gothic": false,
@ -40,7 +40,7 @@
"ExpansionUOR": true, "ExpansionUOR": true,
"ContextMenus": true, "ContextMenus": true,
"SlotLimit": false, "SlotLimit": false,
"AOS": true, "AOS": false,
"SixthCharacterSlot": false, "SixthCharacterSlot": false,
"SE": false, "SE": false,
"ML": false, "ML": false,
@ -53,8 +53,8 @@
"NewFeluccaAreas": false "NewFeluccaAreas": false
}, },
"HousingFlags": { "HousingFlags": {
"AOS": true, "AOS": false,
"HousingAOS": true, "HousingAOS": false,
"SE": false, "SE": false,
"ML": false, "ML": false,
"Crystal": false, "Crystal": false,
@ -67,12 +67,12 @@
"TOL": false, "TOL": false,
"EJ": false "EJ": false
}, },
"MobileStatusVersion": 6, "MobileStatusVersion": 3,
"MapSelectionFlags": { "MapSelectionFlags": {
"Felucca": true, "Felucca": true,
"Trammel": true, "Trammel": true,
"Ilshenar": true, "Ilshenar": false,
"Malas": true, "Malas": false,
"Tokuno": false, "Tokuno": false,
"TerMur": false "TerMur": false
} }

View file

@ -103,6 +103,7 @@
"visibleDamage": "True", "visibleDamage": "True",
"world.enableAutoRestart": "False", "world.enableAutoRestart": "False",
"world.savePath": "Saves", "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); from.NetState.SendDisplayEquipmentInfo(Serial, number, _crafter, false, attrs);
} }
public void OnSingleClickPreUOTD(Mobile from) /*public void OnSingleClickPreUOTD(Mobile from)
{ {
var isMagicItem = _durability != ArmorDurabilityLevel.Regular || var isMagicItem = _durability != ArmorDurabilityLevel.Regular ||
_protectionLevel != ArmorProtectionLevel.Regular; _protectionLevel != ArmorProtectionLevel.Regular;
@ -1455,6 +1455,96 @@ namespace Server.Items
: $"{name} crafted by {Crafter}" : $"{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)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
private string DurabilityText(out bool articleAn) 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); 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 || var isMagicItem = _durabilityLevel > WeaponDurabilityLevel.Regular ||
_accuracyLevel > WeaponAccuracyLevel.Regular || _accuracyLevel > WeaponAccuracyLevel.Regular ||
@ -3307,6 +3307,112 @@ public abstract partial class BaseWeapon
: $"{name} crafted by {Crafter}" : $"{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)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
private string DurabilityText(out bool articleAn) private string DurabilityText(out bool articleAn)