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); }
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); }
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); } }