diff --git a/Source/Game/Entities/Object/Update/UpdateFields.cs b/Source/Game/Entities/Object/Update/UpdateFields.cs index bea6dccea..ad1abe0aa 100644 --- a/Source/Game/Entities/Object/Update/UpdateFields.cs +++ b/Source/Game/Entities/Object/Update/UpdateFields.cs @@ -452,13 +452,13 @@ namespace Game.Entities public void AppendAllowedFieldsMaskForFlag(UpdateMask allowedMaskForTarget, UpdateFieldFlag fieldVisibilityFlags) { if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.Owner)) - allowedMaskForTarget |= new UpdateMask(40, new uint[] { 0x03FB1B00u, 0x00000000u }); + allowedMaskForTarget.OR(new UpdateMask(40, new uint[] { 0x03FB1B00u, 0x00000000u })); } public void FilterDisallowedFieldsMaskForFlag(UpdateMask changesMask, UpdateFieldFlag fieldVisibilityFlags) { if (!fieldVisibilityFlags.HasFlag(UpdateFieldFlag.Owner)) - changesMask &= new UpdateMask(40, new uint[] { 0xFC04E4FFu, 0xFFFFFFFFu }); + changesMask.AND(new UpdateMask(40, new uint[] { 0xFC04E4FFu, 0xFFFFFFFFu })); } public void WriteUpdate(WorldPacket data, UpdateMask changesMask, bool ignoreNestedChangesMask, Item owner, Player receiver) @@ -852,7 +852,10 @@ namespace Game.Entities data.WriteUInt32(UnlockedEssenceMilestones[i]); } data.FlushBits(); - data.WriteBit(Enabled); + if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.Owner)) + { + data.WriteBit(Enabled); + } for (int i = 0; i < SelectedEssences.Size(); ++i) { SelectedEssences[i].WriteCreate(data, owner, receiver); @@ -862,7 +865,7 @@ namespace Game.Entities public void WriteUpdate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, AzeriteItem owner, Player receiver) { - UpdateMask allowedMaskForTarget = new UpdateMask(9, new[] { 0x0000001Fu }); + UpdateMask allowedMaskForTarget = new UpdateMask(9, new[] { 0x0000001Du }); AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags); WriteUpdate(data, _changesMask & allowedMaskForTarget, false, owner, receiver); } @@ -870,13 +873,13 @@ namespace Game.Entities public void AppendAllowedFieldsMaskForFlag(UpdateMask allowedMaskForTarget, UpdateFieldFlag fieldVisibilityFlags) { if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.Owner)) - allowedMaskForTarget |= new UpdateMask(9, new[] { 0x000003E0u }); + allowedMaskForTarget.OR(new UpdateMask(9, new[] { 0x000003E2u })); } public void FilterDisallowedFieldsMaskForFlag(UpdateMask changesMask, UpdateFieldFlag fieldVisibilityFlags) { if (!fieldVisibilityFlags.HasFlag(UpdateFieldFlag.Owner)) - changesMask &= new UpdateMask(9, new[] { 0xFFFFFC1Fu }); + changesMask.AND(new UpdateMask(9, new[] { 0xFFFFFC1Du })); } public void WriteUpdate(WorldPacket data, UpdateMask changesMask, bool ignoreNestedChangesMask, AzeriteItem owner, Player receiver) @@ -1194,7 +1197,7 @@ namespace Game.Entities public UpdateField Lifesteal = new UpdateField(96, 98); public UpdateField MinRangedDamage = new UpdateField(96, 99); public UpdateField MaxRangedDamage = new UpdateField(96, 100); - public UpdateField ManaCostModifierModifier = new UpdateField(96, 101); + public UpdateField ManaCostMultiplier = new UpdateField(96, 101); public UpdateField MaxHealthModifier = new UpdateField(96, 102); public UpdateField HoverHeight = new UpdateField(96, 103); public UpdateField MinItemLevelCutoff = new UpdateField(96, 104); @@ -1224,7 +1227,7 @@ namespace Game.Entities public UpdateFieldArray StatNegBuff = new UpdateFieldArray(4, 154, 163); public UpdateFieldArray Resistances = new UpdateFieldArray(7, 167, 168); public UpdateFieldArray BonusResistanceMods = new UpdateFieldArray(7, 167, 175); - public UpdateFieldArray PowerCostModifier = new UpdateFieldArray(7, 167, 182); + public UpdateFieldArray ManaCostModifier = new UpdateFieldArray(7, 167, 182); public UnitData() : base(0, TypeId.Unit, 189) { } @@ -1356,7 +1359,7 @@ namespace Game.Entities for (int i = 0; i < 7; ++i) { data.WriteInt32(BonusResistanceMods[i]); - data.WriteInt32(PowerCostModifier[i]); + data.WriteInt32(ManaCostModifier[i]); } } data.WriteUInt32(BaseMana); @@ -1384,7 +1387,7 @@ namespace Game.Entities data.WriteFloat(Lifesteal); data.WriteFloat(MinRangedDamage); data.WriteFloat(MaxRangedDamage); - data.WriteFloat(ManaCostModifierModifier); + data.WriteFloat(ManaCostMultiplier); data.WriteFloat(MaxHealthModifier); } data.WriteFloat(HoverHeight); @@ -1427,21 +1430,21 @@ namespace Game.Entities public void AppendAllowedFieldsMaskForFlag(UpdateMask allowedMaskForTarget, UpdateFieldFlag fieldVisibilityFlags) { if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.Owner)) - allowedMaskForTarget |= new UpdateMask(192, new uint[] { 0x00002000u, 0x1E008000u, 0xFFE10000u, 0x0400007Eu, 0xFC07FF80u, 0x1FFFFFFFu }); + allowedMaskForTarget.OR(new UpdateMask(192, new uint[] { 0x00002000u, 0x1E008000u, 0xFFE10000u, 0x0400007Eu, 0xFC07FF80u, 0x1FFFFFFFu })); if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.UnitAll)) - allowedMaskForTarget |= new UpdateMask(192, new uint[] { 0x00000000u, 0x00000000u, 0x00000000u, 0x04000000u, 0x0007FF80u, 0x00000000u }); + allowedMaskForTarget.OR(new UpdateMask(192, new uint[] { 0x00000000u, 0x00000000u, 0x00000000u, 0x04000000u, 0x0007FF80u, 0x00000000u })); if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.Empath)) - allowedMaskForTarget |= new UpdateMask(192, new uint[] { 0x00000000u, 0x1E000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00007F80u }); + allowedMaskForTarget.OR(new UpdateMask(192, new uint[] { 0x00000000u, 0x1E000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00007F80u })); } public void FilterDisallowedFieldsMaskForFlag(UpdateMask changesMask, UpdateFieldFlag fieldVisibilityFlags) { if (!fieldVisibilityFlags.HasFlag(UpdateFieldFlag.Owner)) - changesMask &= new UpdateMask(192, new uint[] { 0xFFFFDFFFu, 0xE1FF7FFFu, 0x001EFFFFu, 0xFBFFFF81u, 0x03F8007Fu, 0xE0000000u }); + changesMask.AND(new UpdateMask(192, new uint[] { 0xFFFFDFFFu, 0xE1FF7FFFu, 0x001EFFFFu, 0xFBFFFF81u, 0x03F8007Fu, 0xE0000000u })); if (!fieldVisibilityFlags.HasFlag(UpdateFieldFlag.UnitAll)) - changesMask &= new UpdateMask(192, new uint[] { 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFBFFFFFFu, 0xFFF8007Fu, 0xFFFFFFFFu }); + changesMask.AND(new UpdateMask(192, new uint[] { 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFBFFFFFFu, 0xFFF8007Fu, 0xFFFFFFFFu })); if (!fieldVisibilityFlags.HasFlag(UpdateFieldFlag.Empath)) - changesMask &= new UpdateMask(192, new uint[] { 0xFFFFFFFFu, 0xE1FFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFF807Fu }); + changesMask.AND(new UpdateMask(192, new uint[] { 0xFFFFFFFFu, 0xE1FFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFF807Fu })); } public void WriteUpdate(WorldPacket data, UpdateMask changesMask, bool ignoreNestedChangesMask, Unit owner, Player receiver) @@ -1903,7 +1906,7 @@ namespace Game.Entities } if (changesMask[101]) { - data.WriteFloat(ManaCostModifierModifier); + data.WriteFloat(ManaCostMultiplier); } if (changesMask[102]) { @@ -2058,7 +2061,7 @@ namespace Game.Entities } if (changesMask[182 + i]) { - data.WriteInt32(PowerCostModifier[i]); + data.WriteInt32(ManaCostModifier[i]); } } } @@ -2163,7 +2166,7 @@ namespace Game.Entities ClearChangesMask(Lifesteal); ClearChangesMask(MinRangedDamage); ClearChangesMask(MaxRangedDamage); - ClearChangesMask(ManaCostModifierModifier); + ClearChangesMask(ManaCostMultiplier); ClearChangesMask(MaxHealthModifier); ClearChangesMask(HoverHeight); ClearChangesMask(MinItemLevelCutoff); @@ -2193,7 +2196,7 @@ namespace Game.Entities ClearChangesMask(StatNegBuff); ClearChangesMask(Resistances); ClearChangesMask(BonusResistanceMods); - ClearChangesMask(PowerCostModifier); + ClearChangesMask(ManaCostModifier); _changesMask.ResetAll(); } @@ -2607,13 +2610,13 @@ namespace Game.Entities public void AppendAllowedFieldsMaskForFlag(UpdateMask allowedMaskForTarget, UpdateFieldFlag fieldVisibilityFlags) { if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.PartyMember)) - allowedMaskForTarget |= new UpdateMask(185, new[] { 0x00000012u, 0xFFFFFFFCu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0x00000000u }); + allowedMaskForTarget.OR(new UpdateMask(185, new[] { 0x00000012u, 0xFFFFFFFCu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0x00000000u })); } void FilterDisallowedFieldsMaskForFlag(UpdateMask changesMask, UpdateFieldFlag fieldVisibilityFlags) { if (!fieldVisibilityFlags.HasFlag(UpdateFieldFlag.PartyMember)) - changesMask &= new UpdateMask(185, new uint[] { 0xFFFFFFEDu, 0x00000003u, 0x00000000u, 0x00000000u, 0x00000000u, 0xFFFFFFFFu }); + changesMask.AND(new UpdateMask(185, new uint[] { 0xFFFFFFEDu, 0x00000003u, 0x00000000u, 0x00000000u, 0x00000000u, 0xFFFFFFFFu })); } public void WriteUpdate(WorldPacket data, UpdateMask changesMask, bool ignoreNestedChangesMask, Player owner, Player receiver) diff --git a/Source/Game/Entities/Player/Player.cs b/Source/Game/Entities/Player/Player.cs index a6653e072..c0dd57b26 100644 --- a/Source/Game/Entities/Player/Player.cs +++ b/Source/Game/Entities/Player/Player.cs @@ -5780,7 +5780,7 @@ namespace Game.Entities SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.ModTargetResistance), 0); SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.ModTargetPhysicalResistance), 0); for (int i = 0; i < (int)SpellSchools.Max; ++i) - SetUpdateFieldValue(ref m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.PowerCostModifier, i), 0); + SetUpdateFieldValue(ref m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.ManaCostModifier, i), 0); // Reset no reagent cost field SetNoRegentCostMask(new Framework.Dynamic.FlagArray128()); diff --git a/Source/Game/Entities/StatSystem.cs b/Source/Game/Entities/StatSystem.cs index d1c132760..47b586fd6 100644 --- a/Source/Game/Entities/StatSystem.cs +++ b/Source/Game/Entities/StatSystem.cs @@ -929,7 +929,7 @@ namespace Game.Entities return Math.Max(resistMech, 0); } - public void ApplyModPowerCostModifier(SpellSchools school, int mod, bool apply) { ApplyModUpdateFieldValue(ref m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.PowerCostModifier, (int)school), mod, apply); } + public void ApplyModManaCostModifier(SpellSchools school, int mod, bool apply) { ApplyModUpdateFieldValue(ref m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.ManaCostModifier, (int)school), mod, apply); } } public partial class Player diff --git a/Source/Game/Spells/Auras/AuraEffect.cs b/Source/Game/Spells/Auras/AuraEffect.cs index 0206f27f7..e26069386 100644 --- a/Source/Game/Spells/Auras/AuraEffect.cs +++ b/Source/Game/Spells/Auras/AuraEffect.cs @@ -4141,11 +4141,15 @@ namespace Game.Spells if (!mode.HasAnyFlag(AuraEffectHandleModes.ChangeAmountMask)) return; + // handled in SpellInfo::CalcPowerCost, this is only for client UI + if ((GetMiscValueB() & (1 << (int)PowerType.Mana)) == 0) + return; + Unit target = aurApp.GetTarget(); for (int i = 0; i < (int)SpellSchools.Max; ++i) if (Convert.ToBoolean(GetMiscValue() & (1 << i))) - target.ApplyModPowerCostModifier((SpellSchools)i, GetAmount(), apply); + target.ApplyModManaCostModifier((SpellSchools)i, GetAmount(), apply); } [AuraEffectHandler(AuraType.ArenaPreparation)] diff --git a/Source/Game/Spells/SpellInfo.cs b/Source/Game/Spells/SpellInfo.cs index 0df2fc3b7..9a88cccd0 100644 --- a/Source/Game/Spells/SpellInfo.cs +++ b/Source/Game/Spells/SpellInfo.cs @@ -2774,7 +2774,7 @@ namespace Game.Spells } if (power.PowerType == PowerType.Mana) - flatMod *= (int)(1.0f + caster.m_unitData.ManaCostModifierModifier); + flatMod *= (int)(1.0f + caster.m_unitData.ManaCostMultiplier); // this is wrong powerCost += flatMod; }