Exemple #1
0
        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);
                    }
                }
            }
        }
Exemple #2
0
        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);
        }
Exemple #3
0
        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);
        }
Exemple #4
0
        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);
        }
Exemple #5
0
        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);
        }