diff --git a/Source/Game/Entities/Item/Item.cs b/Source/Game/Entities/Item/Item.cs index 816bd58e0..bb2f75b3e 100644 --- a/Source/Game/Entities/Item/Item.cs +++ b/Source/Game/Entities/Item/Item.cs @@ -505,7 +505,7 @@ namespace Game.Entities { for (int i = 0; i < (int)EnchantmentSlot.Max; ++i) { - ItemEnchantment enchantmentField = m_itemData.ModifyValue(m_itemData.Enchantment, i); + ItemEnchantment enchantmentField = m_values.ModifyValue(m_itemData).ModifyValue(m_itemData.Enchantment, i); SetUpdateFieldValue(enchantmentField.ModifyValue(enchantmentField.ID), uint.Parse(enchantmentTokens[i * 3 + 0])); SetUpdateFieldValue(enchantmentField.ModifyValue(enchantmentField.Duration), uint.Parse(enchantmentTokens[i * 3 + 1])); SetUpdateFieldValue(enchantmentField.ModifyValue(enchantmentField.Charges), short.Parse(enchantmentTokens[i * 3 + 2])); @@ -945,7 +945,7 @@ namespace Game.Entities ApplyArtifactPowerEnchantmentBonuses(slot, GetEnchantmentId(slot), false, owner); ApplyArtifactPowerEnchantmentBonuses(slot, id, true, owner); - ItemEnchantment enchantmentField = m_itemData.ModifyValue(m_itemData.Enchantment, (int)slot); + ItemEnchantment enchantmentField = m_values.ModifyValue(m_itemData).ModifyValue(m_itemData.Enchantment, (int)slot); SetUpdateFieldValue(enchantmentField.ModifyValue(enchantmentField.ID), id); SetUpdateFieldValue(enchantmentField.ModifyValue(enchantmentField.Duration), duration); SetUpdateFieldValue(enchantmentField.ModifyValue(enchantmentField.Charges), (short)charges); @@ -957,7 +957,8 @@ namespace Game.Entities if (GetEnchantmentDuration(slot) == duration) return; - SetUpdateFieldValue(m_itemData.ModifyValue(m_itemData.Enchantment, (int)slot).ModifyValue((ItemEnchantment itemEnchantment) => itemEnchantment.Duration), duration); + ItemEnchantment enchantmentField = m_values.ModifyValue(m_itemData).ModifyValue(m_itemData.Enchantment, (int)slot); + SetUpdateFieldValue(enchantmentField.ModifyValue(enchantmentField.Duration), duration); SetState(ItemUpdateState.Changed, owner); // Cannot use GetOwner() here, has to be passed as an argument to avoid freeze due to hashtable locking } @@ -967,7 +968,8 @@ namespace Game.Entities if (GetEnchantmentCharges(slot) == charges) return; - SetUpdateFieldValue(m_itemData.ModifyValue(m_itemData.Enchantment, (int)slot).ModifyValue((ItemEnchantment itemEnchantment) => itemEnchantment.Charges), (short)charges); + ItemEnchantment enchantmentField = m_values.ModifyValue(m_itemData).ModifyValue(m_itemData.Enchantment, (int)slot); + SetUpdateFieldValue(enchantmentField.ModifyValue(enchantmentField.Charges), (short)charges); SetState(ItemUpdateState.Changed, GetOwner()); } @@ -976,7 +978,7 @@ namespace Game.Entities if (GetEnchantmentId(slot) == 0) return; - ItemEnchantment enchantmentField = m_itemData.ModifyValue(m_itemData.Enchantment, (int)slot); + ItemEnchantment enchantmentField = m_values.ModifyValue(m_itemData).ModifyValue(m_itemData.Enchantment, (int)slot); SetUpdateFieldValue(enchantmentField.ModifyValue(enchantmentField.ID), 0u); SetUpdateFieldValue(enchantmentField.ModifyValue(enchantmentField.Duration), 0u); SetUpdateFieldValue(enchantmentField.ModifyValue(enchantmentField.Charges), (short)0); @@ -1055,7 +1057,7 @@ namespace Game.Entities } } - SocketedGem gemField = m_itemData.ModifyValue(m_itemData.Gems, slot); + SocketedGem gemField = m_values.ModifyValue(m_itemData).ModifyValue(m_itemData.Gems, slot); SetUpdateFieldValue(gemField.ModifyValue(gemField.ItemId), gem.ItemId); SetUpdateFieldValue(gemField.ModifyValue(gemField.Context), gem.Context); for (int i = 0; i < 16; ++i) @@ -2063,7 +2065,7 @@ namespace Game.Entities var foundIndex = m_artifactPowerIdToIndex.LookupByKey(artifactPowerId); if (foundIndex != 0) { - ArtifactPower artifactPower = m_itemData.ModifyValue(m_itemData.ArtifactPowers, foundIndex); + ArtifactPower artifactPower = m_values.ModifyValue(m_itemData).ModifyValue(m_itemData.ArtifactPowers, foundIndex); SetUpdateFieldValue(ref artifactPower.PurchasedRank, purchasedRank); SetUpdateFieldValue(ref artifactPower.CurrentRankWithBonus, currentRankWithBonus); } @@ -2118,7 +2120,7 @@ namespace Game.Entities else newRank -= (byte)enchant.EffectPointsMin[i]; - artifactPower = m_itemData.ModifyValue(m_itemData.ArtifactPowers, artifactPowerIndex); + artifactPower = m_values.ModifyValue(m_itemData).ModifyValue(m_itemData.ArtifactPowers, artifactPowerIndex); SetUpdateFieldValue(ref artifactPower.CurrentRankWithBonus, newRank); if (IsEquipped()) @@ -2142,7 +2144,7 @@ namespace Game.Entities else newRank -= (byte)enchant.EffectPointsMin[i]; - ArtifactPower artifactPower = m_itemData.ModifyValue(m_itemData.ArtifactPowers, artifactPowerIndex); + ArtifactPower artifactPower = m_values.ModifyValue(m_itemData).ModifyValue(m_itemData.ArtifactPowers, artifactPowerIndex); SetUpdateFieldValue(ref artifactPower.CurrentRankWithBonus, newRank); if (IsEquipped()) @@ -2174,7 +2176,7 @@ namespace Game.Entities else newRank -= (byte)enchant.EffectPointsMin[i]; - artifactPower = m_itemData.ModifyValue(m_itemData.ArtifactPowers, artifactPowerIndex); + artifactPower = m_values.ModifyValue(m_itemData).ModifyValue(m_itemData.ArtifactPowers, artifactPowerIndex); SetUpdateFieldValue(ref artifactPower.CurrentRankWithBonus, newRank); if (IsEquipped()) @@ -2243,11 +2245,13 @@ namespace Game.Entities public void SetPetitionId(uint petitionId) { - SetUpdateFieldValue(m_itemData.ModifyValue(m_itemData.Enchantment, 0).ModifyValue((ItemEnchantment itemEnchantment) => itemEnchantment.ID), petitionId); + ItemEnchantment enchantmentField = m_values.ModifyValue(m_itemData).ModifyValue(m_itemData.Enchantment, 0); + SetUpdateFieldValue(enchantmentField.ModifyValue(enchantmentField.ID), petitionId); } public void SetPetitionNumSignatures(uint signatures) { - SetUpdateFieldValue(m_itemData.ModifyValue(m_itemData.Enchantment, 0).ModifyValue((ItemEnchantment itemEnchantment) => itemEnchantment.Duration), signatures); + ItemEnchantment enchantmentField = m_values.ModifyValue(m_itemData).ModifyValue(m_itemData.Enchantment, 0); + SetUpdateFieldValue(enchantmentField.ModifyValue(enchantmentField.Duration), signatures); } public void SetFixedLevel(uint level) diff --git a/Source/Game/Entities/Object/Update/UpdateField.cs b/Source/Game/Entities/Object/Update/UpdateField.cs index 1d4c3703a..f7908923b 100644 --- a/Source/Game/Entities/Object/Update/UpdateField.cs +++ b/Source/Game/Entities/Object/Update/UpdateField.cs @@ -20,8 +20,6 @@ using Game.Networking; using System; using System.Collections.Generic; using System.Linq; -using System.Linq.Expressions; -using System.Reflection; namespace Game.Entities { @@ -355,13 +353,13 @@ namespace Game.Entities public void ClearChangesMask(UpdateField updateField) where U : new() { - if (typeof(U).GetInterfaces().Any(x => typeof(IHasChangesMask) == x)) + if (typeof(IHasChangesMask).IsAssignableFrom(typeof(U))) ((IHasChangesMask)updateField._value).ClearChangesMask(); } public void ClearChangesMask(UpdateFieldArray updateField) where U : new() { - if (typeof(U).GetInterfaces().Any(x => typeof(IHasChangesMask) == x)) + if (typeof(IHasChangesMask).IsAssignableFrom(typeof(U))) { for (int i = 0; i < updateField.GetSize(); ++i) ((IHasChangesMask)updateField[i]).ClearChangesMask(); @@ -370,7 +368,7 @@ namespace Game.Entities public void ClearChangesMask(DynamicUpdateField updateField) where U : new() { - if (typeof(U).GetInterfaces().Any(x => typeof(IHasChangesMask) == x)) + if (typeof(IHasChangesMask).IsAssignableFrom(typeof(U))) { for (int i = 0; i < updateField.Size(); ++i) ((IHasChangesMask)updateField[i]).ClearChangesMask(); @@ -379,30 +377,6 @@ namespace Game.Entities } } - public UpdateField ModifyValue(Expression>> expression) where UU : new() - { - var fieldInfo = ((MemberExpression)expression.Body).Member as FieldInfo; - if (fieldInfo == null) - throw new ArgumentException("The lambda expression 'property' should point to a valid Property"); - - var updateField = (UpdateField)fieldInfo.GetValue(this); - _changesMask.Set(updateField.BlockBit); - _changesMask.Set(updateField.Bit); - return updateField; - } - - public ref UU ModifyValue(Expression>> expression, int index) where UU : new() - { - var fieldInfo = ((MemberExpression)expression.Body).Member as FieldInfo; - if (fieldInfo == null) - throw new ArgumentException("The lambda expression should point to a valid Field"); - - var updateFieldArray = (UpdateFieldArray)fieldInfo.GetValue(this); - _changesMask.Set(updateFieldArray.Bit); - _changesMask.Set(updateFieldArray.FirstElementBit + index); - return ref updateFieldArray._values[index]; - } - public UpdateField ModifyValue(UpdateField updateField) where U : new() { MarkChanged(updateField); diff --git a/Source/Game/Entities/Object/Update/UpdateFields.cs b/Source/Game/Entities/Object/Update/UpdateFields.cs index 398c1b167..a108a8304 100644 --- a/Source/Game/Entities/Object/Update/UpdateFields.cs +++ b/Source/Game/Entities/Object/Update/UpdateFields.cs @@ -2599,7 +2599,7 @@ namespace Game.Entities public void WriteUpdate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Player owner, Player receiver) { - UpdateMask allowedMaskForTarget = new UpdateMask(192, new[] { 0xFFFFFFEDu, 0x00000003u, 0x00000000u, 0x00000000u, 0x00000000u, 0x01FFFFFFu }); + UpdateMask allowedMaskForTarget = new UpdateMask(185, new[] { 0xFFFFFFEDu, 0x00000003u, 0x00000000u, 0x00000000u, 0x00000000u, 0x01FFFFFFu }); AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags); WriteUpdate(data, _changesMask & allowedMaskForTarget, false, owner, receiver); } @@ -2607,13 +2607,13 @@ namespace Game.Entities public void AppendAllowedFieldsMaskForFlag(UpdateMask allowedMaskForTarget, UpdateFieldFlag fieldVisibilityFlags) { if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.PartyMember)) - allowedMaskForTarget |= new UpdateMask(192, new[] { 0x00000012u, 0xFFFFFFFCu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0x00000000u }); + allowedMaskForTarget |= new UpdateMask(185, new[] { 0x00000012u, 0xFFFFFFFCu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0x00000000u }); } void FilterDisallowedFieldsMaskForFlag(UpdateMask changesMask, UpdateFieldFlag fieldVisibilityFlags) { if (!fieldVisibilityFlags.HasFlag(UpdateFieldFlag.PartyMember)) - changesMask &= new UpdateMask(192, new uint[] { 0xFFFFFFEDu, 0x00000003u, 0x00000000u, 0x00000000u, 0x00000000u, 0xFFFFFFFFu }); + changesMask &= 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.Quest.cs b/Source/Game/Entities/Player/Player.Quest.cs index 98cf9dc44..8b8f95409 100644 --- a/Source/Game/Entities/Player/Player.Quest.cs +++ b/Source/Game/Entities/Player/Player.Quest.cs @@ -2037,24 +2037,26 @@ namespace Game.Entities if (counter >= SharedConst.MaxQuestCounts) return; - SetUpdateFieldValue(ref m_playerData.ModifyValue(m_playerData.QuestLog, slot).ModifyValue((QuestLog questLogField) => questLogField.ObjectiveProgress, counter), count); + QuestLog questLog = m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.QuestLog, slot); + SetUpdateFieldValue(ref questLog.ModifyValue(questLog.ObjectiveProgress, counter), count); } public void SetQuestSlotState(ushort slot, QuestSlotStateMask state) { - QuestLog questLogField = m_playerData.ModifyValue(m_playerData.QuestLog, slot); + QuestLog questLogField = m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.QuestLog, slot); SetUpdateFieldFlagValue(questLogField.ModifyValue(questLogField.StateFlags), (uint)state); } public void RemoveQuestSlotState(ushort slot, QuestSlotStateMask state) { - QuestLog questLogField = m_playerData.ModifyValue(m_playerData.QuestLog, slot); + QuestLog questLogField = m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.QuestLog, slot); RemoveUpdateFieldFlagValue(questLogField.ModifyValue(questLogField.StateFlags), (uint)state); } public void SetQuestSlotTimer(ushort slot, uint timer) { - SetUpdateFieldValue(m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.QuestLog, slot).ModifyValue((QuestLog questLog) => questLog.EndTime), timer); + QuestLog questLog = m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.QuestLog, slot); + SetUpdateFieldValue(questLog.ModifyValue(questLog.EndTime), timer); } void SetQuestCompletedBit(uint questBit, bool completed) diff --git a/Source/Game/Entities/Player/Player.Spells.cs b/Source/Game/Entities/Player/Player.Spells.cs index 0821dde9d..38757fed3 100644 --- a/Source/Game/Entities/Player/Player.Spells.cs +++ b/Source/Game/Entities/Player/Player.Spells.cs @@ -820,7 +820,8 @@ namespace Game.Entities // visualize enchantment at player and equipped items if (slot == EnchantmentSlot.Perm) { - SetUpdateFieldValue(m_playerData.ModifyValue(m_playerData.VisibleItems, item.GetSlot()).ModifyValue((VisibleItem visibleItemField) => visibleItemField.ItemVisual), item.GetVisibleItemVisual(this)); + VisibleItem visibleItem = m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.VisibleItems, item.GetSlot()); + SetUpdateFieldValue(visibleItem.ModifyValue(visibleItem.ItemVisual), item.GetVisibleItemVisual(this)); } if (apply_dur) @@ -3474,13 +3475,41 @@ namespace Game.Entities public void SetPetSpellPower(uint spellPower) { SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.PetSpellPower), spellPower); } - public void SetSkillLineId(uint pos, ushort skillLineId) { SetUpdateFieldValue(ref m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.Skill)._value.ModifyValue((SkillInfo skillInfo) => skillInfo.SkillLineID, (int)pos), skillLineId); } - public void SetSkillStep(uint pos, ushort step) { SetUpdateFieldValue(ref m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.Skill)._value.ModifyValue((SkillInfo skillInfo) => skillInfo.SkillStep, (int)pos), step); } - public void SetSkillRank(uint pos, ushort rank) { SetUpdateFieldValue(ref m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.Skill)._value.ModifyValue((SkillInfo skillInfo) => skillInfo.SkillRank, (int)pos), rank); } - public void SetSkillStartingRank(uint pos, ushort starting) { SetUpdateFieldValue(ref m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.Skill)._value.ModifyValue((SkillInfo skillInfo) => skillInfo.SkillStartingRank, (int)pos), starting); } - public void SetSkillMaxRank(uint pos, ushort max) { SetUpdateFieldValue(ref m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.Skill)._value.ModifyValue((SkillInfo skillInfo) => skillInfo.SkillMaxRank, (int)pos), max); } - public void SetSkillTempBonus(uint pos, ushort bonus) { SetUpdateFieldValue(ref m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.Skill)._value.ModifyValue((SkillInfo skillInfo) => skillInfo.SkillTempBonus, (int)pos), bonus); } - public void SetSkillPermBonus(uint pos, ushort bonus) { SetUpdateFieldValue(ref m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.Skill)._value.ModifyValue((SkillInfo skillInfo) => skillInfo.SkillPermBonus, (int)pos), bonus); } + public void SetSkillLineId(uint pos, ushort skillLineId) + { + SkillInfo skillInfo = m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.Skill); + SetUpdateFieldValue(ref skillInfo.ModifyValue(skillInfo.SkillLineID, (int)pos), skillLineId); + } + public void SetSkillStep(uint pos, ushort step) + { + SkillInfo skillInfo = m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.Skill); + SetUpdateFieldValue(ref skillInfo.ModifyValue(skillInfo.SkillStep, (int)pos), step); + } + public void SetSkillRank(uint pos, ushort rank) + { + SkillInfo skillInfo = m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.Skill); + SetUpdateFieldValue(ref skillInfo.ModifyValue(skillInfo.SkillRank, (int)pos), rank); + } + public void SetSkillStartingRank(uint pos, ushort starting) + { + SkillInfo skillInfo = m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.Skill); + SetUpdateFieldValue(ref skillInfo.ModifyValue(skillInfo.SkillStartingRank, (int)pos), starting); + } + public void SetSkillMaxRank(uint pos, ushort max) + { + SkillInfo skillInfo = m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.Skill); + SetUpdateFieldValue(ref skillInfo.ModifyValue(skillInfo.SkillMaxRank, (int)pos), max); + } + public void SetSkillTempBonus(uint pos, ushort bonus) + { + SkillInfo skillInfo = m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.Skill); + SetUpdateFieldValue(ref skillInfo.ModifyValue(skillInfo.SkillTempBonus, (int)pos), bonus); + } + public void SetSkillPermBonus(uint pos, ushort bonus) + { + SkillInfo skillInfo = m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.Skill); + SetUpdateFieldValue(ref skillInfo.ModifyValue(skillInfo.SkillPermBonus, (int)pos), bonus); + } } public class PlayerSpell diff --git a/Source/Game/Entities/Player/Player.cs b/Source/Game/Entities/Player/Player.cs index 1c5975f6e..444263b07 100644 --- a/Source/Game/Entities/Player/Player.cs +++ b/Source/Game/Entities/Player/Player.cs @@ -3548,8 +3548,8 @@ namespace Game.Entities if (creature == null || (!creature.IsTrigger() && !creature.HasAuraType(AuraType.Transform) && !creature.HasUnitFlag(UnitFlags.NotSelectable))) continue; - creature.m_unitData.ModifyValue(m_unitData.DisplayID); - creature.m_unitData.ModifyValue(m_unitData.Flags); + creature.m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.DisplayID); + creature.m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.Flags); creature.ForceUpdateFieldChange(); creature.BuildValuesUpdateBlockForPlayer(udata, this); } @@ -7271,11 +7271,13 @@ namespace Game.Entities public void SetRestState(RestTypes type, PlayerRestState state) { - SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.RestInfo, (int)type).ModifyValue((RestInfo restInfo) => restInfo.StateID), (byte)state); + RestInfo restInfo = m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.RestInfo, (int)type); + SetUpdateFieldValue(restInfo.ModifyValue(restInfo.StateID), (byte)state); } public void SetRestThreshold(RestTypes type, uint threshold) { - SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.RestInfo, (int)type).ModifyValue((RestInfo restInfo) => restInfo.Threshold), threshold); + RestInfo restInfo = m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.RestInfo, (int)type); + SetUpdateFieldValue(restInfo.ModifyValue(restInfo.Threshold), threshold); } public bool HasPlayerFlag(PlayerFlags flags) { return (m_playerData.PlayerFlags & (uint)flags) != 0; } diff --git a/Source/Game/Entities/Unit/Unit.cs b/Source/Game/Entities/Unit/Unit.cs index af9ff36d0..50d298d9d 100644 --- a/Source/Game/Entities/Unit/Unit.cs +++ b/Source/Game/Entities/Unit/Unit.cs @@ -1777,9 +1777,9 @@ namespace Game.Entities return; var virtualItemField = m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.VirtualItems, (int)slot); - SetUpdateFieldValue(virtualItemField.ModifyValue((VisibleItem visibleItem) => visibleItem.ItemID), itemId); - SetUpdateFieldValue(virtualItemField.ModifyValue((VisibleItem visibleItem) => visibleItem.ItemAppearanceModID), appearanceModId); - SetUpdateFieldValue(virtualItemField.ModifyValue((VisibleItem visibleItem) => visibleItem.ItemVisual), itemVisual); + SetUpdateFieldValue(virtualItemField.ModifyValue(virtualItemField.ItemID), itemId); + SetUpdateFieldValue(virtualItemField.ModifyValue(virtualItemField.ItemAppearanceModID), appearanceModId); + SetUpdateFieldValue(virtualItemField.ModifyValue(virtualItemField.ItemVisual), itemVisual); } //Unit @@ -2363,7 +2363,7 @@ namespace Game.Entities public uint GetChannelScriptVisualId() { return m_unitData.ChannelData.GetValue().SpellVisual.ScriptVisualID; } public void SetChannelVisual(SpellCastVisualField channelVisual) { - UnitChannel unitChannel = m_unitData.ModifyValue(m_unitData.ChannelData); + UnitChannel unitChannel = m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.ChannelData); SetUpdateFieldValue(ref unitChannel.SpellVisual, channelVisual); } public void AddChannelObject(ObjectGuid guid) { AddDynamicUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.ChannelObjects), guid); }