fix(items): restrict resonance aggregation hosts

This commit is contained in:
Crome696 2026-07-11 13:57:51 +02:00
parent 7d50457e4a
commit c71bf47be8
2 changed files with 32 additions and 24 deletions

View file

@ -147,37 +147,41 @@ public class ResonancePropertyTests
public void ResonanceAggregation_UsesOnlyMatchingEligibleEquipmentAndCapsAtFortyPercent()
{
var previousExpansion = Core.Expansion;
var mobile = CreateMobile(player: true);
var shieldBearer = CreateMobile(player: true);
var weaponBearer = CreateMobile(player: true);
var shield = new BronzeShield { Layer = Layer.TwoHanded };
var weapon = new WarHammer();
var armor = new LeatherChest();
var oneHandedWeapon = new Katana();
try
{
shield.AbsorptionAttributes.FireResonance = 25;
shield.AbsorptionAttributes.FireResonance = 50;
shield.AbsorptionAttributes.ColdResonance = 16;
weapon.AbsorptionAttributes.FireResonance = 25;
weapon.AbsorptionAttributes.PoisonResonance = 19;
oneHandedWeapon.AbsorptionAttributes.FireResonance = 99;
armor.AbsorptionAttributes[AbsorptionAttribute.FireResonance] = 99;
oneHandedWeapon.AbsorptionAttributes[AbsorptionAttribute.FireResonance] = 99;
mobile.AddItem(shield);
mobile.AddItem(weapon);
mobile.AddItem(oneHandedWeapon);
shieldBearer.AddItem(shield);
shieldBearer.AddItem(armor);
weaponBearer.AddItem(weapon);
weaponBearer.AddItem(oneHandedWeapon);
Assert.Contains(shield, mobile.Items);
Assert.Contains(weapon, mobile.Items);
Assert.Contains(oneHandedWeapon, mobile.Items);
Assert.Equal(Layer.TwoHanded, shield.Layer);
Assert.Equal(Layer.TwoHanded, weapon.Layer);
Assert.Same(shield, shieldBearer.FindItemOnLayer<BaseShield>(Layer.TwoHanded));
Assert.Same(weapon, weaponBearer.FindItemOnLayer<BaseWeapon>(Layer.TwoHanded));
Core.Expansion = Expansion.ML;
Assert.Equal(0, AbsorptionAttributes.GetResonanceValue(mobile, DamageType.Fire));
Assert.Equal(0, AbsorptionAttributes.GetResonanceValue(shieldBearer, DamageType.Fire));
Assert.Equal(0, AbsorptionAttributes.GetResonanceValue(weaponBearer, DamageType.Fire));
Core.Expansion = Expansion.SA;
Assert.Equal(AOS.ResonanceChanceCap, AbsorptionAttributes.GetResonanceValue(mobile, DamageType.Fire));
Assert.Equal(16, AbsorptionAttributes.GetResonanceValue(mobile, DamageType.Cold));
Assert.Equal(19, AbsorptionAttributes.GetResonanceValue(mobile, DamageType.Poison));
Assert.Equal(0, AbsorptionAttributes.GetResonanceValue(mobile, DamageType.Energy));
Assert.Equal(AOS.ResonanceChanceCap, AbsorptionAttributes.GetResonanceValue(shieldBearer, DamageType.Fire));
Assert.Equal(16, AbsorptionAttributes.GetResonanceValue(shieldBearer, DamageType.Cold));
Assert.Equal(0, AbsorptionAttributes.GetResonanceValue(shieldBearer, DamageType.Poison));
Assert.Equal(25, AbsorptionAttributes.GetResonanceValue(weaponBearer, DamageType.Fire));
Assert.Equal(19, AbsorptionAttributes.GetResonanceValue(weaponBearer, DamageType.Poison));
Assert.Equal(0, AbsorptionAttributes.GetResonanceValue(weaponBearer, DamageType.Energy));
Assert.Equal(0, oneHandedWeapon.AbsorptionAttributes.FireResonance);
}
finally
@ -185,8 +189,10 @@ public class ResonancePropertyTests
Core.Expansion = previousExpansion;
shield.Delete();
weapon.Delete();
armor.Delete();
oneHandedWeapon.Delete();
mobile.Delete();
shieldBearer.Delete();
weaponBearer.Delete();
}
}

View file

@ -1535,18 +1535,20 @@ namespace Server
{
var obj = items[i];
if (obj is BaseArmor armor)
if (IsResonance(attribute))
{
var attrs = armor.AbsorptionAttributes;
if (attrs != null)
if (obj is BaseShield shield)
{
value += attrs[attribute];
value += shield.AbsorptionAttributes[attribute];
}
else if (obj is BaseWeapon { Layer: Layer.TwoHanded } weapon)
{
value += weapon.AbsorptionAttributes[attribute];
}
}
else if (IsResonance(attribute) && obj is BaseWeapon weapon)
else if (obj is BaseArmor armor)
{
var attrs = weapon.AbsorptionAttributes;
var attrs = armor.AbsorptionAttributes;
if (attrs != null)
{