From ea8dfd29bd35c6ec8d220db9982dd3ac91bb2a4d Mon Sep 17 00:00:00 2001 From: Kamron Batman <3953314+kamronbatman@users.noreply.github.com> Date: Mon, 22 Jun 2026 08:28:59 -0700 Subject: [PATCH] refactor(weapon): emit AOS attributes via AosAttributes/AosWeaponAttributes.GetProperties --- .../PropertyList/BaseWeaponPropertiesTests.cs | 38 +++ .../UOContent/Items/Weapons/BaseWeapon.cs | 219 +----------------- 2 files changed, 47 insertions(+), 210 deletions(-) create mode 100644 Projects/UOContent.Tests/Tests/PropertyList/BaseWeaponPropertiesTests.cs diff --git a/Projects/UOContent.Tests/Tests/PropertyList/BaseWeaponPropertiesTests.cs b/Projects/UOContent.Tests/Tests/PropertyList/BaseWeaponPropertiesTests.cs new file mode 100644 index 000000000..213e59cb9 --- /dev/null +++ b/Projects/UOContent.Tests/Tests/PropertyList/BaseWeaponPropertiesTests.cs @@ -0,0 +1,38 @@ +using Server.Items; +using Xunit; + +namespace UOContent.Tests; + +[Collection("Sequential UOContent Tests")] +public class BaseWeaponPropertiesTests +{ + [Fact] + public void Weapon_AttributeLineSet_Preserved() + { + var weapon = new Longsword(); + try + { + weapon.Attributes.DefendChance = 5; + weapon.Attributes.BonusInt = 6; + weapon.Attributes.SpellChanneling = 1; + weapon.WeaponAttributes.UseBestSkill = 1; + weapon.WeaponAttributes.HitFireball = 12; + weapon.WeaponAttributes.MageWeapon = 25; + weapon.WeaponAttributes.SelfRepair = 3; + + var map = ItemOplTestHelper.DecodeAttributeLines(weapon); + + Assert.Equal("5", map[1060408]); // DefendChance + Assert.Equal("6", map[1060432]); // BonusInt + Assert.Equal("", map[1060482]); // SpellChanneling + Assert.Equal("", map[1060400]); // UseBestSkill + Assert.Equal("12", map[1060420]); // HitFireball + Assert.Equal("5", map[1060438]); // MageWeapon (30 - 25) + Assert.Equal("3", map[1060450]); // SelfRepair + } + finally + { + weapon.Delete(); + } + } +} diff --git a/Projects/UOContent/Items/Weapons/BaseWeapon.cs b/Projects/UOContent/Items/Weapons/BaseWeapon.cs index c746a83a2..a3dfb1e13 100644 --- a/Projects/UOContent/Items/Weapons/BaseWeapon.cs +++ b/Projects/UOContent/Items/Weapons/BaseWeapon.cs @@ -2998,114 +2998,11 @@ public abstract partial class BaseWeapon list.Add(1072792); // Balanced } - if (WeaponAttributes.UseBestSkill != 0) - { - list.Add(1060400); // use best weapon skill - } + WeaponAttributes.GetProperties(list); - if ((prop = GetDamageBonus() + Attributes.WeaponDamage) != 0) + if ((prop = GetLowerStatReq()) != 0) { - list.Add(1060401, prop); // damage increase ~1_val~% - } - - if ((prop = Attributes.DefendChance) != 0) - { - list.Add(1060408, prop); // defense chance increase ~1_val~% - } - - if ((prop = Attributes.EnhancePotions) != 0) - { - list.Add(1060411, prop); // enhance potions ~1_val~% - } - - if ((prop = Attributes.CastRecovery) != 0) - { - list.Add(1060412, prop); // faster cast recovery ~1_val~ - } - - if ((prop = Attributes.CastSpeed) != 0) - { - list.Add(1060413, prop); // faster casting ~1_val~ - } - - if ((prop = GetHitChanceBonus() + Attributes.AttackChance) != 0) - { - list.Add(1060415, prop); // hit chance increase ~1_val~% - } - - if ((prop = WeaponAttributes.HitColdArea) != 0) - { - list.Add(1060416, prop); // hit cold area ~1_val~% - } - - if ((prop = WeaponAttributes.HitDispel) != 0) - { - list.Add(1060417, prop); // hit dispel ~1_val~% - } - - if ((prop = WeaponAttributes.HitEnergyArea) != 0) - { - list.Add(1060418, prop); // hit energy area ~1_val~% - } - - if ((prop = WeaponAttributes.HitFireArea) != 0) - { - list.Add(1060419, prop); // hit fire area ~1_val~% - } - - if ((prop = WeaponAttributes.HitFireball) != 0) - { - list.Add(1060420, prop); // hit fireball ~1_val~% - } - - if ((prop = WeaponAttributes.HitHarm) != 0) - { - list.Add(1060421, prop); // hit harm ~1_val~% - } - - if ((prop = WeaponAttributes.HitLeechHits) != 0) - { - list.Add(1060422, prop); // hit life leech ~1_val~% - } - - if ((prop = WeaponAttributes.HitLightning) != 0) - { - list.Add(1060423, prop); // hit lightning ~1_val~% - } - - if ((prop = WeaponAttributes.HitLowerAttack) != 0) - { - list.Add(1060424, prop); // hit lower attack ~1_val~% - } - - if ((prop = WeaponAttributes.HitLowerDefend) != 0) - { - list.Add(1060425, prop); // hit lower defense ~1_val~% - } - - if ((prop = WeaponAttributes.HitMagicArrow) != 0) - { - list.Add(1060426, prop); // hit magic arrow ~1_val~% - } - - if ((prop = WeaponAttributes.HitLeechMana) != 0) - { - list.Add(1060427, prop); // hit mana leech ~1_val~% - } - - if ((prop = WeaponAttributes.HitPhysicalArea) != 0) - { - list.Add(1060428, prop); // hit physical area ~1_val~% - } - - if ((prop = WeaponAttributes.HitPoisonArea) != 0) - { - list.Add(1060429, prop); // hit poison area ~1_val~% - } - - if ((prop = WeaponAttributes.HitLeechStam) != 0) - { - list.Add(1060430, prop); // hit stamina leech ~1_val~% + list.Add(1060435, prop); // lower requirements ~1_val~% } if (ImmolatingWeaponSpell.IsImmolating(this)) @@ -3118,110 +3015,12 @@ public abstract partial class BaseWeapon list.Add(1072793, prop); // Velocity ~1_val~% } - if ((prop = Attributes.BonusDex) != 0) - { - list.Add(1060409, prop); // dexterity bonus ~1_val~ - } - - if ((prop = Attributes.BonusHits) != 0) - { - list.Add(1060431, prop); // hit point increase ~1_val~ - } - - if ((prop = Attributes.BonusInt) != 0) - { - list.Add(1060432, prop); // intelligence bonus ~1_val~ - } - - if ((prop = Attributes.LowerManaCost) != 0) - { - list.Add(1060433, prop); // lower mana cost ~1_val~% - } - - if ((prop = Attributes.LowerRegCost) != 0) - { - list.Add(1060434, prop); // lower reagent cost ~1_val~% - } - - if ((prop = GetLowerStatReq()) != 0) - { - list.Add(1060435, prop); // lower requirements ~1_val~% - } - - if ((prop = GetLuckBonus() + Attributes.Luck) != 0) - { - list.Add(1060436, prop); // luck ~1_val~ - } - - if ((prop = WeaponAttributes.MageWeapon) != 0) - { - list.Add(1060438, 30 - prop); // mage weapon -~1_val~ skill - } - - if ((prop = Attributes.BonusMana) != 0) - { - list.Add(1060439, prop); // mana increase ~1_val~ - } - - if ((prop = Attributes.RegenMana) != 0) - { - list.Add(1060440, prop); // mana regeneration ~1_val~ - } - - if (Attributes.NightSight != 0) - { - list.Add(1060441); // night sight - } - - if ((prop = Attributes.ReflectPhysical) != 0) - { - list.Add(1060442, prop); // reflect physical damage ~1_val~% - } - - if ((prop = Attributes.RegenStam) != 0) - { - list.Add(1060443, prop); // stamina regeneration ~1_val~ - } - - if ((prop = Attributes.RegenHits) != 0) - { - list.Add(1060444, prop); // hit point regeneration ~1_val~ - } - - if ((prop = WeaponAttributes.SelfRepair) != 0) - { - list.Add(1060450, prop); // self repair ~1_val~ - } - - if (Attributes.SpellChanneling != 0) - { - list.Add(1060482); // spell channeling - } - - if ((prop = Attributes.SpellDamage) != 0) - { - list.Add(1060483, prop); // spell damage increase ~1_val~% - } - - if ((prop = Attributes.BonusStam) != 0) - { - list.Add(1060484, prop); // stamina increase ~1_val~ - } - - if ((prop = Attributes.BonusStr) != 0) - { - list.Add(1060485, prop); // strength bonus ~1_val~ - } - - if ((prop = Attributes.WeaponSpeed) != 0) - { - list.Add(1060486, prop); // swing speed increase ~1_val~% - } - - if (Core.ML && (prop = Attributes.IncreasedKarmaLoss) != 0) - { - list.Add(1075210, prop); // Increased Karma Loss ~1val~% - } + Attributes.GetProperties( + list, + damageBonus: GetDamageBonus(), + hitChanceBonus: GetHitChanceBonus(), + luckBonus: GetLuckBonus() + ); GetDamageTypes( null,