public InspectItemData(Item item, byte index) { CreatorGUID = item.GetCreator(); Item = new ItemInstance(item); Index = index; Usable = true; // @todo for (EnchantmentSlot enchant = 0; enchant < EnchantmentSlot.Max; ++enchant) { uint enchId = item.GetEnchantmentId(enchant); if (enchId != 0) { Enchants.Add(new InspectEnchantData(enchId, (byte)enchant)); } } byte i = 0; foreach (SocketedGem gemData in item.m_itemData.Gems) { if (gemData.ItemId != 0) { ItemGemData gem = new(); gem.Slot = i; gem.Item = new ItemInstance(gemData); Gems.Add(gem); } ++i; } AzeriteItem azeriteItem = item.ToAzeriteItem(); if (azeriteItem != null) { SelectedAzeriteEssences essences = azeriteItem.GetSelectedAzeriteEssences(); if (essences != null) { for (byte slot = 0; slot < essences.AzeriteEssenceID.GetSize(); ++slot) { AzeriteEssenceData essence = new(); essence.Index = slot; essence.AzeriteEssenceID = essences.AzeriteEssenceID[slot]; if (essence.AzeriteEssenceID != 0) { essence.Rank = azeriteItem.GetEssenceRank(essence.AzeriteEssenceID); essence.SlotUnlocked = true; } else { essence.SlotUnlocked = azeriteItem.HasUnlockedEssenceSlot(slot); } AzeriteEssences.Add(essence); } } } }
void HandleAzeriteEssenceUnlockMilestone(AzeriteEssenceUnlockMilestone azeriteEssenceUnlockMilestone) { if (!AzeriteItem.FindHeartForge(_player)) { return; } Item item = _player.GetItemByEntry(PlayerConst.ItemIdHeartOfAzeroth, ItemSearchLocation.Everywhere); if (!item) { return; } AzeriteItem azeriteItem = item.ToAzeriteItem(); if (!azeriteItem || !azeriteItem.CanUseEssences()) { return; } AzeriteItemMilestonePowerRecord milestonePower = CliDB.AzeriteItemMilestonePowerStorage.LookupByKey(azeriteEssenceUnlockMilestone.AzeriteItemMilestonePowerID); if (milestonePower == null || milestonePower.RequiredLevel > azeriteItem.GetLevel()) { return; } // check that all previous milestones are unlocked foreach (AzeriteItemMilestonePowerRecord previousMilestone in Global.DB2Mgr.GetAzeriteItemMilestonePowers()) { if (previousMilestone == milestonePower) { break; } if (!azeriteItem.HasUnlockedEssenceMilestone(previousMilestone.Id)) { return; } } azeriteItem.AddUnlockedEssenceMilestone(milestonePower.Id); _player.ApplyAzeriteItemMilestonePower(azeriteItem, milestonePower, true); azeriteItem.SetState(ItemUpdateState.Changed, _player); }
void HandleAzeriteEssenceActivateEssence(AzeriteEssenceActivateEssence azeriteEssenceActivateEssence) { AzeriteEssenceSelectionResult activateEssenceResult = new AzeriteEssenceSelectionResult(); activateEssenceResult.AzeriteEssenceID = azeriteEssenceActivateEssence.AzeriteEssenceID; Item item = _player.GetItemByEntry(PlayerConst.ItemIdHeartOfAzeroth, ItemSearchLocation.InEquipment); if (item == null) { activateEssenceResult.Reason = AzeriteEssenceActivateResult.NotEquipped; activateEssenceResult.Slot = azeriteEssenceActivateEssence.Slot; SendPacket(activateEssenceResult); return; } AzeriteItem azeriteItem = item.ToAzeriteItem(); if (azeriteItem == null || !azeriteItem.CanUseEssences()) { activateEssenceResult.Reason = AzeriteEssenceActivateResult.ConditionFailed; SendPacket(activateEssenceResult); return; } if (azeriteEssenceActivateEssence.Slot >= SharedConst.MaxAzeriteEssenceSlot || !azeriteItem.HasUnlockedEssenceSlot(azeriteEssenceActivateEssence.Slot)) { activateEssenceResult.Reason = AzeriteEssenceActivateResult.SlotLocked; SendPacket(activateEssenceResult); return; } SelectedAzeriteEssences selectedEssences = azeriteItem.GetSelectedAzeriteEssences(); // essence is already in that slot, nothing to do if (selectedEssences != null && selectedEssences.AzeriteEssenceID[azeriteEssenceActivateEssence.Slot] == azeriteEssenceActivateEssence.AzeriteEssenceID) { return; } uint rank = azeriteItem.GetEssenceRank(azeriteEssenceActivateEssence.AzeriteEssenceID); if (rank == 0) { activateEssenceResult.Reason = AzeriteEssenceActivateResult.EssenceNotUnlocked; activateEssenceResult.Arg = azeriteEssenceActivateEssence.AzeriteEssenceID; SendPacket(activateEssenceResult); return; } if (_player.IsInCombat()) { activateEssenceResult.Reason = AzeriteEssenceActivateResult.AffectingCombat; activateEssenceResult.Slot = azeriteEssenceActivateEssence.Slot; SendPacket(activateEssenceResult); return; } if (_player.IsDead()) { activateEssenceResult.Reason = AzeriteEssenceActivateResult.CantDoThatRightNow; activateEssenceResult.Slot = azeriteEssenceActivateEssence.Slot; SendPacket(activateEssenceResult); return; } if (!_player.HasPlayerFlag(PlayerFlags.Resting) && !_player.HasUnitFlag2(UnitFlags2.AllowChangingTalents)) { activateEssenceResult.Reason = AzeriteEssenceActivateResult.NotInRestArea; activateEssenceResult.Slot = azeriteEssenceActivateEssence.Slot; SendPacket(activateEssenceResult); return; } if (selectedEssences != null) { // need to remove selected essence from another slot if selected int removeEssenceFromSlot = -1; for (int slot = 0; slot < SharedConst.MaxAzeriteEssenceSlot; ++slot) { if (azeriteEssenceActivateEssence.Slot != slot && selectedEssences.AzeriteEssenceID[slot] == azeriteEssenceActivateEssence.AzeriteEssenceID) { removeEssenceFromSlot = slot; } } // check cooldown of major essence slot if (selectedEssences.AzeriteEssenceID[0] != 0 && (azeriteEssenceActivateEssence.Slot == 0 || removeEssenceFromSlot == 0)) { for (uint essenceRank = 1; essenceRank <= rank; ++essenceRank) { AzeriteEssencePowerRecord azeriteEssencePower = Global.DB2Mgr.GetAzeriteEssencePower(selectedEssences.AzeriteEssenceID[0], essenceRank); if (_player.GetSpellHistory().HasCooldown(azeriteEssencePower.MajorPowerDescription)) { activateEssenceResult.Reason = AzeriteEssenceActivateResult.CantRemoveEssence; activateEssenceResult.Arg = azeriteEssencePower.MajorPowerDescription; activateEssenceResult.Slot = azeriteEssenceActivateEssence.Slot; SendPacket(activateEssenceResult); return; } } } if (removeEssenceFromSlot != -1) { _player.ApplyAzeriteEssence(azeriteItem, selectedEssences.AzeriteEssenceID[removeEssenceFromSlot], SharedConst.MaxAzeriteEssenceRank, (AzeriteItemMilestoneType)Global.DB2Mgr.GetAzeriteItemMilestonePower(removeEssenceFromSlot).Type == AzeriteItemMilestoneType.MajorEssence, false); azeriteItem.SetSelectedAzeriteEssence(removeEssenceFromSlot, 0); } if (selectedEssences.AzeriteEssenceID[azeriteEssenceActivateEssence.Slot] != 0) { _player.ApplyAzeriteEssence(azeriteItem, selectedEssences.AzeriteEssenceID[azeriteEssenceActivateEssence.Slot], SharedConst.MaxAzeriteEssenceRank, (AzeriteItemMilestoneType)Global.DB2Mgr.GetAzeriteItemMilestonePower(azeriteEssenceActivateEssence.Slot).Type == AzeriteItemMilestoneType.MajorEssence, false); } } else { azeriteItem.CreateSelectedAzeriteEssences(_player.GetPrimarySpecialization()); } azeriteItem.SetSelectedAzeriteEssence(azeriteEssenceActivateEssence.Slot, azeriteEssenceActivateEssence.AzeriteEssenceID); _player.ApplyAzeriteEssence(azeriteItem, azeriteEssenceActivateEssence.AzeriteEssenceID, rank, (AzeriteItemMilestoneType)Global.DB2Mgr.GetAzeriteItemMilestonePower(azeriteEssenceActivateEssence.Slot).Type == AzeriteItemMilestoneType.MajorEssence, true); azeriteItem.SetState(ItemUpdateState.Changed, _player); }
void HandleAzeriteEmpoweredItemSelectPower(AzeriteEmpoweredItemSelectPower azeriteEmpoweredItemSelectPower) { Item item = _player.GetItemByPos(azeriteEmpoweredItemSelectPower.ContainerSlot, azeriteEmpoweredItemSelectPower.Slot); if (item == null) { return; } AzeritePowerRecord azeritePower = CliDB.AzeritePowerStorage.LookupByKey(azeriteEmpoweredItemSelectPower.AzeritePowerID); if (azeritePower == null) { return; } AzeriteEmpoweredItem azeriteEmpoweredItem = item.ToAzeriteEmpoweredItem(); if (azeriteEmpoweredItem == null) { return; } // Validate tier int actualTier = azeriteEmpoweredItem.GetTierForAzeritePower(_player.GetClass(), azeriteEmpoweredItemSelectPower.AzeritePowerID); if (azeriteEmpoweredItemSelectPower.Tier > SharedConst.MaxAzeriteEmpoweredTier || azeriteEmpoweredItemSelectPower.Tier != actualTier) { return; } uint azeriteLevel = 0; Item heartOfAzeroth = _player.GetItemByEntry(PlayerConst.ItemIdHeartOfAzeroth, ItemSearchLocation.Everywhere); if (heartOfAzeroth == null) { return; } AzeriteItem azeriteItem = heartOfAzeroth.ToAzeriteItem(); if (azeriteItem != null) { azeriteLevel = azeriteItem.GetEffectiveLevel(); } // Check required heart of azeroth level if (azeriteLevel < azeriteEmpoweredItem.GetRequiredAzeriteLevelForTier((uint)actualTier)) { return; } // tiers are ordered backwards, you first select the highest one for (int i = actualTier + 1; i < azeriteEmpoweredItem.GetMaxAzeritePowerTier(); ++i) { if (azeriteEmpoweredItem.GetSelectedAzeritePower(i) == 0) { return; } } bool activateAzeritePower = azeriteEmpoweredItem.IsEquipped() && heartOfAzeroth.IsEquipped(); if (azeritePower.ItemBonusListID != 0 && activateAzeritePower) { _player._ApplyItemMods(azeriteEmpoweredItem, azeriteEmpoweredItem.GetSlot(), false); } azeriteEmpoweredItem.SetSelectedAzeritePower(actualTier, azeriteEmpoweredItemSelectPower.AzeritePowerID); if (activateAzeritePower) { // apply all item mods when azerite power grants a bonus, item level changes and that affects stats and auras that scale with item level if (azeritePower.ItemBonusListID != 0) { _player._ApplyItemMods(azeriteEmpoweredItem, azeriteEmpoweredItem.GetSlot(), true); } else { _player.ApplyAzeritePower(azeriteEmpoweredItem, azeritePower, true); } } azeriteEmpoweredItem.SetState(ItemUpdateState.Changed, _player); }
void HandleInspect(Inspect inspect) { Player player = Global.ObjAccessor.GetPlayer(_player, inspect.Target); if (!player) { Log.outDebug(LogFilter.Network, "WorldSession.HandleInspectOpcode: Target {0} not found.", inspect.Target.ToString()); return; } if (!GetPlayer().IsWithinDistInMap(player, SharedConst.InspectDistance, false)) { return; } if (GetPlayer().IsValidAttackTarget(player)) { return; } InspectResult inspectResult = new(); inspectResult.DisplayInfo.Initialize(player); if (GetPlayer().CanBeGameMaster() || WorldConfig.GetIntValue(WorldCfg.TalentsInspecting) + (GetPlayer().GetTeamId() == player.GetTeamId() ? 1 : 0) > 1) { var talents = player.GetTalentMap(player.GetActiveTalentGroup()); foreach (var v in talents) { if (v.Value != PlayerSpellState.Removed) { inspectResult.Talents.Add((ushort)v.Key); } } } Guild guild = Global.GuildMgr.GetGuildById(player.GetGuildId()); if (guild) { inspectResult.GuildData.HasValue = true; InspectGuildData guildData; guildData.GuildGUID = guild.GetGUID(); guildData.NumGuildMembers = guild.GetMembersCount(); guildData.AchievementPoints = (int)guild.GetAchievementMgr().GetAchievementPoints(); inspectResult.GuildData.Set(guildData); } Item heartOfAzeroth = player.GetItemByEntry(PlayerConst.ItemIdHeartOfAzeroth, ItemSearchLocation.Everywhere); if (heartOfAzeroth != null) { AzeriteItem azeriteItem = heartOfAzeroth.ToAzeriteItem(); if (azeriteItem != null) { inspectResult.AzeriteLevel = azeriteItem.GetEffectiveLevel(); } } inspectResult.ItemLevel = (int)player.GetAverageItemLevel(); inspectResult.LifetimeMaxRank = player.m_activePlayerData.LifetimeMaxRank; inspectResult.TodayHK = player.m_activePlayerData.TodayHonorableKills; inspectResult.YesterdayHK = player.m_activePlayerData.YesterdayHonorableKills; inspectResult.LifetimeHK = player.m_activePlayerData.LifetimeHonorableKills; inspectResult.HonorLevel = player.m_playerData.HonorLevel; SendPacket(inspectResult); }