public void SetSelectedAzeriteEssences(uint specializationId)
        {
            int index = m_azeriteItemData.SelectedEssences.FindIndexIf(essences => { return(essences.Enabled == 1); });

            if (index >= 0)
            {
                SelectedAzeriteEssences selectedEssences = m_values.ModifyValue(m_azeriteItemData).ModifyValue(m_azeriteItemData.SelectedEssences, index);
                SetUpdateFieldValue(selectedEssences.ModifyValue(selectedEssences.Enabled), 0u);
            }

            index = m_azeriteItemData.SelectedEssences.FindIndexIf(essences =>
            {
                return(essences.SpecializationID == specializationId);
            });

            if (index >= 0)
            {
                SelectedAzeriteEssences selectedEssences = m_values.ModifyValue(m_azeriteItemData).ModifyValue(m_azeriteItemData.SelectedEssences, index);
                SetUpdateFieldValue(selectedEssences.ModifyValue(selectedEssences.Enabled), 1u);
            }
            else
            {
                CreateSelectedAzeriteEssences(specializationId);
            }
        }
        public void CreateSelectedAzeriteEssences(uint specializationId)
        {
            SelectedAzeriteEssences selectedEssences = new SelectedAzeriteEssences();

            selectedEssences.ModifyValue(selectedEssences.SpecializationID).SetValue(specializationId);
            selectedEssences.ModifyValue(selectedEssences.Enabled).SetValue(1);
            AddDynamicUpdateFieldValue(m_values.ModifyValue(m_azeriteItemData).ModifyValue(m_azeriteItemData.SelectedEssences), selectedEssences);
        }
Beispiel #3
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);
                    }
                }
            }
        }
        public void SetSelectedAzeriteEssence(int slot, uint azeriteEssenceId)
        {
            //ASSERT(slot < MAX_AZERITE_ESSENCE_SLOT);
            int index = m_azeriteItemData.SelectedEssences.FindIndexIf(essences => { return(essences.Enabled == 1); });
            //ASSERT(index >= 0);
            SelectedAzeriteEssences selectedEssences = m_values.ModifyValue(m_azeriteItemData).ModifyValue(m_azeriteItemData.SelectedEssences, index);

            SetUpdateFieldValue(ref selectedEssences.ModifyValue(selectedEssences.AzeriteEssenceID, slot), azeriteEssenceId);
        }
Beispiel #5
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);
        }
        public void LoadAzeriteItemData(Player owner, AzeriteData azeriteData)
        {
            bool needSave = false;

            if (!CliDB.AzeriteLevelInfoStorage.ContainsKey(azeriteData.Level))
            {
                azeriteData.Xp             = 0;
                azeriteData.Level          = 1;
                azeriteData.KnowledgeLevel = GetCurrentKnowledgeLevel();
                needSave = true;
            }
            else if (azeriteData.Level > PlayerConst.MaxAzeriteItemLevel)
            {
                azeriteData.Xp    = 0;
                azeriteData.Level = PlayerConst.MaxAzeriteItemLevel;
                needSave          = true;
            }

            if (azeriteData.KnowledgeLevel != GetCurrentKnowledgeLevel())
            {
                // rescale XP to maintain same progress %
                ulong oldMax = CalcTotalXPToNextLevel(azeriteData.Level, azeriteData.KnowledgeLevel);
                azeriteData.KnowledgeLevel = GetCurrentKnowledgeLevel();
                ulong newMax = CalcTotalXPToNextLevel(azeriteData.Level, azeriteData.KnowledgeLevel);
                azeriteData.Xp = (ulong)(azeriteData.Xp / (double)oldMax * newMax);
                needSave       = true;
            }
            else if (azeriteData.KnowledgeLevel > PlayerConst.MaxAzeriteItemKnowledgeLevel)
            {
                azeriteData.KnowledgeLevel = PlayerConst.MaxAzeriteItemKnowledgeLevel;
                needSave = true;
            }

            SetUpdateFieldValue(m_values.ModifyValue(m_azeriteItemData).ModifyValue(m_azeriteItemData.Xp), azeriteData.Xp);
            SetUpdateFieldValue(m_values.ModifyValue(m_azeriteItemData).ModifyValue(m_azeriteItemData.Level), azeriteData.Level);
            SetUpdateFieldValue(m_values.ModifyValue(m_azeriteItemData).ModifyValue(m_azeriteItemData.KnowledgeLevel), azeriteData.KnowledgeLevel);

            foreach (uint azeriteItemMilestonePowerId in azeriteData.AzeriteItemMilestonePowers)
            {
                AddUnlockedEssenceMilestone(azeriteItemMilestonePowerId);
            }

            UnlockDefaultMilestones();

            foreach (AzeriteEssencePowerRecord unlockedAzeriteEssence in azeriteData.UnlockedAzeriteEssences)
            {
                SetEssenceRank((uint)unlockedAzeriteEssence.AzeriteEssenceID, unlockedAzeriteEssence.Tier);
            }

            foreach (AzeriteItemSelectedEssencesData selectedEssenceData in azeriteData.SelectedAzeriteEssences)
            {
                if (selectedEssenceData.SpecializationId == 0)
                {
                    continue;
                }

                var selectedEssences = new SelectedAzeriteEssences();
                selectedEssences.ModifyValue(selectedEssences.SpecializationID).SetValue(selectedEssenceData.SpecializationId);
                for (int i = 0; i < SharedConst.MaxAzeriteEssenceSlot; ++i)
                {
                    // Check if essence was unlocked
                    if (GetEssenceRank(selectedEssenceData.AzeriteEssenceId[i]) == 0)
                    {
                        continue;
                    }

                    selectedEssences.ModifyValue(selectedEssences.AzeriteEssenceID, i) = selectedEssenceData.AzeriteEssenceId[i];
                }

                if (owner != null && owner.GetPrimarySpecialization() == selectedEssenceData.SpecializationId)
                {
                    selectedEssences.ModifyValue(selectedEssences.Enabled).SetValue(1);
                }

                AddDynamicUpdateFieldValue(m_values.ModifyValue(m_azeriteItemData).ModifyValue(m_azeriteItemData.SelectedEssences), selectedEssences);
            }

            // add selected essences for current spec
            if (owner != null && GetSelectedAzeriteEssences() == null)
            {
                CreateSelectedAzeriteEssences(owner.GetPrimarySpecialization());
            }

            if (needSave)
            {
                PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.UPD_ITEM_INSTANCE_AZERITE_ON_LOAD);
                stmt.AddValue(0, azeriteData.Xp);
                stmt.AddValue(1, azeriteData.KnowledgeLevel);
                stmt.AddValue(2, GetGUID().GetCounter());
                DB.Characters.Execute(stmt);
            }
        }