diff options
author | MaxtorCoder <warsongkiller.s8@gmail.com> | 2024-03-13 21:16:18 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-03-13 21:16:18 +0100 |
commit | cfc9cc9ec285e7934f3160047ff87be3c649594f (patch) | |
tree | be680d4f88fac55274862251c349c644a5d90930 /src | |
parent | 46d929cb82b631648ef4a84e75ca7bc174a03fdd (diff) |
Core/PacketIO: Update to 4.4.0.53627 (#29805)
* Core/PacketIO: Update to 4.4.0.53627
* Core/IO: Remove duplicate declaration of PetSpellDataID
* Core/IO: Assign STATUS_UNHANDLED to some azerite packets
Diffstat (limited to 'src')
63 files changed, 1308 insertions, 5269 deletions
diff --git a/src/server/database/Database/Implementation/CharacterDatabase.cpp b/src/server/database/Database/Implementation/CharacterDatabase.cpp index 4bff3f1796e..70941741186 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/database/Database/Implementation/CharacterDatabase.cpp @@ -165,15 +165,6 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_SEL_CHARACTER_ACTIONS_SPEC, "SELECT button, action, type FROM character_action WHERE guid = ? AND spec = ? AND traitConfigId = ? ORDER BY button", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_MAILITEMS, "SELECT " SelectItemInstanceContent ", ii.owner_guid, m.id FROM mail_items mi INNER JOIN mail m ON mi.mail_id = m.id LEFT JOIN item_instance ii ON mi.item_guid = ii.guid LEFT JOIN item_instance_gems ig ON ii.guid = ig.itemGuid LEFT JOIN item_instance_transmog iit ON ii.guid = iit.itemGuid LEFT JOIN item_instance_modifiers im ON ii.guid = im.itemGuid WHERE m.receiver = ?", CONNECTION_BOTH); PrepareStatement(CHAR_SEL_MAILITEMS_ARTIFACT, "SELECT a.itemGuid, a.xp, a.artifactAppearanceId, a.artifactTierId, ap.artifactPowerId, ap.purchasedRank FROM item_instance_artifact_powers ap LEFT JOIN item_instance_artifact a ON ap.itemGuid = a.itemGuid INNER JOIN mail_items mi ON a.itemGuid = mi.item_guid INNER JOIN mail m ON mi.mail_id = m.id WHERE m.receiver = ?", CONNECTION_BOTH); - PrepareStatement(CHAR_SEL_MAILITEMS_AZERITE, "SELECT iz.itemGuid, iz.xp, iz.level, iz.knowledgeLevel, " - "iz.selectedAzeriteEssences1specId, iz.selectedAzeriteEssences1azeriteEssenceId1, iz.selectedAzeriteEssences1azeriteEssenceId2, iz.selectedAzeriteEssences1azeriteEssenceId3, iz.selectedAzeriteEssences1azeriteEssenceId4, " - "iz.selectedAzeriteEssences2specId, iz.selectedAzeriteEssences2azeriteEssenceId1, iz.selectedAzeriteEssences2azeriteEssenceId2, iz.selectedAzeriteEssences2azeriteEssenceId3, iz.selectedAzeriteEssences2azeriteEssenceId4, " - "iz.selectedAzeriteEssences3specId, iz.selectedAzeriteEssences3azeriteEssenceId1, iz.selectedAzeriteEssences3azeriteEssenceId2, iz.selectedAzeriteEssences3azeriteEssenceId3, iz.selectedAzeriteEssences3azeriteEssenceId4, " - "iz.selectedAzeriteEssences4specId, iz.selectedAzeriteEssences4azeriteEssenceId1, iz.selectedAzeriteEssences4azeriteEssenceId2, iz.selectedAzeriteEssences4azeriteEssenceId3, iz.selectedAzeriteEssences4azeriteEssenceId4 " - "FROM item_instance_azerite iz INNER JOIN mail_items mi ON iz.itemGuid = mi.item_guid INNER JOIN mail m ON mi.mail_id = m.id WHERE m.receiver = ?", CONNECTION_BOTH); - PrepareStatement(CHAR_SEL_MAILITEMS_AZERITE_MILESTONE_POWER, "SELECT iamp.itemGuid, iamp.azeriteItemMilestonePowerId FROM item_instance_azerite_milestone_power iamp INNER JOIN mail_items mi ON iamp.itemGuid = mi.item_guid INNER JOIN mail m ON mi.mail_id = m.id WHERE m.receiver = ?", CONNECTION_BOTH); - PrepareStatement(CHAR_SEL_MAILITEMS_AZERITE_UNLOCKED_ESSENCE, "SELECT iaue.itemGuid, iaue.azeriteEssenceId, iaue.`rank` FROM item_instance_azerite_unlocked_essence iaue INNER JOIN mail_items mi ON iaue.itemGuid = mi.item_guid INNER JOIN mail m ON mi.mail_id = m.id WHERE m.receiver = ?", CONNECTION_BOTH); - PrepareStatement(CHAR_SEL_MAILITEMS_AZERITE_EMPOWERED, "SELECT iae.itemGuid, iae.azeritePowerId1, iae.azeritePowerId2, iae.azeritePowerId3, iae.azeritePowerId4, iae.azeritePowerId5 FROM item_instance_azerite_empowered iae INNER JOIN mail_items mi ON iae.itemGuid = mi.item_guid INNER JOIN mail m ON mi.mail_id = m.id WHERE m.receiver = ?", CONNECTION_BOTH); PrepareStatement(CHAR_SEL_AUCTION_ITEMS, "SELECT " SelectItemInstanceContent ", ii.owner_guid, ai.auctionId FROM auction_items ai INNER JOIN item_instance ii ON ai.itemGuid = ii.guid LEFT JOIN item_instance_gems ig ON ii.guid = ig.itemGuid LEFT JOIN item_instance_transmog iit ON ii.guid = iit.itemGuid LEFT JOIN item_instance_modifiers im ON ii.guid = im.itemGuid", CONNECTION_SYNCH); PrepareStatement(CHAR_SEL_AUCTIONS, "SELECT id, auctionHouseId, owner, bidder, minBid, buyoutOrUnitPrice, deposit, bidAmount, startTime, endTime, serverFlags FROM auctionhouse", CONNECTION_SYNCH); PrepareStatement(CHAR_INS_AUCTION_ITEMS, "INSERT INTO auction_items (auctionId, itemGuid) VALUES (?, ?)", CONNECTION_ASYNC); @@ -225,32 +216,6 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_INS_ITEM_INSTANCE_MODIFIERS, "INSERT INTO item_instance_modifiers (itemGuid, fixedScalingLevel, artifactKnowledgeLevel) VALUES (?, ?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_ITEM_INSTANCE_MODIFIERS, "DELETE FROM item_instance_modifiers WHERE itemGuid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_ITEM_INSTANCE_MODIFIERS_BY_OWNER, "DELETE im FROM item_instance_modifiers im LEFT JOIN item_instance ii ON im.itemGuid = ii.guid WHERE ii.owner_guid = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_SEL_ITEM_INSTANCE_AZERITE, "SELECT iz.itemGuid, iz.xp, iz.level, iz.knowledgeLevel, " - "iz.selectedAzeriteEssences1specId, iz.selectedAzeriteEssences1azeriteEssenceId1, iz.selectedAzeriteEssences1azeriteEssenceId2, iz.selectedAzeriteEssences1azeriteEssenceId3, iz.selectedAzeriteEssences1azeriteEssenceId4, " - "iz.selectedAzeriteEssences2specId, iz.selectedAzeriteEssences2azeriteEssenceId1, iz.selectedAzeriteEssences2azeriteEssenceId2, iz.selectedAzeriteEssences2azeriteEssenceId3, iz.selectedAzeriteEssences2azeriteEssenceId4, " - "iz.selectedAzeriteEssences3specId, iz.selectedAzeriteEssences3azeriteEssenceId1, iz.selectedAzeriteEssences3azeriteEssenceId2, iz.selectedAzeriteEssences3azeriteEssenceId3, iz.selectedAzeriteEssences3azeriteEssenceId4, " - "iz.selectedAzeriteEssences4specId, iz.selectedAzeriteEssences4azeriteEssenceId1, iz.selectedAzeriteEssences4azeriteEssenceId2, iz.selectedAzeriteEssences4azeriteEssenceId3, iz.selectedAzeriteEssences4azeriteEssenceId4 " - "FROM item_instance_azerite iz INNER JOIN character_inventory ci ON iz.itemGuid = ci.item WHERE ci.guid = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_INS_ITEM_INSTANCE_AZERITE, "INSERT INTO item_instance_azerite (itemGuid, xp, level, knowledgeLevel, selectedAzeriteEssences1specId, selectedAzeriteEssences1azeriteEssenceId1, selectedAzeriteEssences1azeriteEssenceId2, selectedAzeriteEssences1azeriteEssenceId3, selectedAzeriteEssences1azeriteEssenceId4, " - "selectedAzeriteEssences2specId, selectedAzeriteEssences2azeriteEssenceId1, selectedAzeriteEssences2azeriteEssenceId2, selectedAzeriteEssences2azeriteEssenceId3, selectedAzeriteEssences2azeriteEssenceId4, " - "selectedAzeriteEssences3specId, selectedAzeriteEssences3azeriteEssenceId1, selectedAzeriteEssences3azeriteEssenceId2, selectedAzeriteEssences3azeriteEssenceId3, selectedAzeriteEssences3azeriteEssenceId4, " - "selectedAzeriteEssences4specId, selectedAzeriteEssences4azeriteEssenceId1, selectedAzeriteEssences4azeriteEssenceId2, selectedAzeriteEssences4azeriteEssenceId3, selectedAzeriteEssences4azeriteEssenceId4) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); - PrepareStatement(CHAR_UPD_ITEM_INSTANCE_AZERITE_ON_LOAD, "UPDATE item_instance_azerite SET xp = ?, knowledgeLevel = ? WHERE itemGuid = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_DEL_ITEM_INSTANCE_AZERITE, "DELETE FROM item_instance_azerite WHERE itemGuid = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_DEL_ITEM_INSTANCE_AZERITE_BY_OWNER, "DELETE iz FROM item_instance_azerite iz LEFT JOIN item_instance ii ON iz.itemGuid = ii.guid WHERE ii.owner_guid = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_SEL_ITEM_INSTANCE_AZERITE_MILESTONE_POWER, "SELECT iamp.itemGuid, iamp.azeriteItemMilestonePowerId FROM item_instance_azerite_milestone_power iamp INNER JOIN character_inventory ci ON iamp.itemGuid = ci.item WHERE ci.guid = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_INS_ITEM_INSTANCE_AZERITE_MILESTONE_POWER, "INSERT INTO item_instance_azerite_milestone_power (itemGuid, azeriteItemMilestonePowerId) VALUES (?, ?)", CONNECTION_ASYNC); - PrepareStatement(CHAR_DEL_ITEM_INSTANCE_AZERITE_MILESTONE_POWER, "DELETE FROM item_instance_azerite_milestone_power WHERE itemGuid = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_DEL_ITEM_INSTANCE_AZERITE_MILESTONE_POWER_BY_OWNER, "DELETE iamp FROM item_instance_azerite_milestone_power iamp LEFT JOIN item_instance ii ON iamp.itemGuid = ii.guid WHERE ii.owner_guid = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_SEL_ITEM_INSTANCE_AZERITE_UNLOCKED_ESSENCE, "SELECT iaue.itemGuid, iaue.azeriteEssenceId, iaue.`rank` FROM item_instance_azerite_unlocked_essence iaue INNER JOIN character_inventory ci ON iaue.itemGuid = ci.item WHERE ci.guid = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_INS_ITEM_INSTANCE_AZERITE_UNLOCKED_ESSENCE, "INSERT INTO item_instance_azerite_unlocked_essence (itemGuid, azeriteEssenceId, `rank`) VALUES (?, ?, ?)", CONNECTION_ASYNC); - PrepareStatement(CHAR_DEL_ITEM_INSTANCE_AZERITE_UNLOCKED_ESSENCE, "DELETE FROM item_instance_azerite_unlocked_essence WHERE itemGuid = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_DEL_ITEM_INSTANCE_AZERITE_UNLOCKED_ESSENCE_BY_OWNER, "DELETE iaue FROM item_instance_azerite_unlocked_essence iaue LEFT JOIN item_instance ii ON iaue.itemGuid = ii.guid WHERE ii.owner_guid = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_SEL_ITEM_INSTANCE_AZERITE_EMPOWERED, "SELECT iae.itemGuid, iae.azeritePowerId1, iae.azeritePowerId2, iae.azeritePowerId3, iae.azeritePowerId4, iae.azeritePowerId5 FROM item_instance_azerite_empowered iae INNER JOIN character_inventory ci ON iae.itemGuid = ci.item WHERE ci.guid = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_INS_ITEM_INSTANCE_AZERITE_EMPOWERED, "INSERT INTO item_instance_azerite_empowered (itemGuid, azeritePowerId1, azeritePowerId2, azeritePowerId3, azeritePowerId4, azeritePowerId5) VALUES (?, ?, ?, ? ,? ,?)", CONNECTION_ASYNC); - PrepareStatement(CHAR_UPD_ITEM_INSTANCE_AZERITE_EMPOWERED, "UPDATE item_instance_azerite_empowered SET azeritePowerId1 = ?, azeritePowerId2 = ?, azeritePowerId3 = ?, azeritePowerId4 = ?, azeritePowerId5 = ? WHERE itemGuid = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_DEL_ITEM_INSTANCE_AZERITE_EMPOWERED, "DELETE FROM item_instance_azerite_empowered WHERE itemGuid = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_DEL_ITEM_INSTANCE_AZERITE_EMPOWERED_BY_OWNER, "DELETE iae FROM item_instance_azerite_empowered iae LEFT JOIN item_instance ii ON iae.itemGuid = ii.guid WHERE ii.owner_guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_UPD_GIFT_OWNER, "UPDATE character_gifts SET guid = ? WHERE item_guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_GIFT, "DELETE FROM character_gifts WHERE item_guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_GIFT_BY_ITEM, "SELECT entry, flags FROM character_gifts WHERE item_guid = ?", CONNECTION_ASYNC); diff --git a/src/server/database/Database/Implementation/CharacterDatabase.h b/src/server/database/Database/Implementation/CharacterDatabase.h index e9e985eed5c..dfdf5d27ad4 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.h +++ b/src/server/database/Database/Implementation/CharacterDatabase.h @@ -121,10 +121,6 @@ enum CharacterDatabaseStatements : uint32 CHAR_SEL_ACCOUNT_INSTANCELOCKTIMES, CHAR_SEL_MAILITEMS, CHAR_SEL_MAILITEMS_ARTIFACT, - CHAR_SEL_MAILITEMS_AZERITE, - CHAR_SEL_MAILITEMS_AZERITE_MILESTONE_POWER, - CHAR_SEL_MAILITEMS_AZERITE_UNLOCKED_ESSENCE, - CHAR_SEL_MAILITEMS_AZERITE_EMPOWERED, CHAR_SEL_AUCTION_ITEMS, CHAR_INS_AUCTION, CHAR_DEL_AUCTION, @@ -173,24 +169,6 @@ enum CharacterDatabaseStatements : uint32 CHAR_INS_ITEM_INSTANCE_MODIFIERS, CHAR_DEL_ITEM_INSTANCE_MODIFIERS, CHAR_DEL_ITEM_INSTANCE_MODIFIERS_BY_OWNER, - CHAR_SEL_ITEM_INSTANCE_AZERITE, - CHAR_INS_ITEM_INSTANCE_AZERITE, - CHAR_UPD_ITEM_INSTANCE_AZERITE_ON_LOAD, - CHAR_DEL_ITEM_INSTANCE_AZERITE, - CHAR_DEL_ITEM_INSTANCE_AZERITE_BY_OWNER, - CHAR_SEL_ITEM_INSTANCE_AZERITE_MILESTONE_POWER, - CHAR_INS_ITEM_INSTANCE_AZERITE_MILESTONE_POWER, - CHAR_DEL_ITEM_INSTANCE_AZERITE_MILESTONE_POWER, - CHAR_DEL_ITEM_INSTANCE_AZERITE_MILESTONE_POWER_BY_OWNER, - CHAR_SEL_ITEM_INSTANCE_AZERITE_UNLOCKED_ESSENCE, - CHAR_INS_ITEM_INSTANCE_AZERITE_UNLOCKED_ESSENCE, - CHAR_DEL_ITEM_INSTANCE_AZERITE_UNLOCKED_ESSENCE, - CHAR_DEL_ITEM_INSTANCE_AZERITE_UNLOCKED_ESSENCE_BY_OWNER, - CHAR_SEL_ITEM_INSTANCE_AZERITE_EMPOWERED, - CHAR_INS_ITEM_INSTANCE_AZERITE_EMPOWERED, - CHAR_UPD_ITEM_INSTANCE_AZERITE_EMPOWERED, - CHAR_DEL_ITEM_INSTANCE_AZERITE_EMPOWERED, - CHAR_DEL_ITEM_INSTANCE_AZERITE_EMPOWERED_BY_OWNER, CHAR_UPD_GIFT_OWNER, CHAR_DEL_GIFT, CHAR_SEL_CHARACTER_GIFT_BY_ITEM, diff --git a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp index 576346aa47d..12f959949a0 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp +++ b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp @@ -341,9 +341,9 @@ SpellInfo const* ScriptedAI::SelectSpell(Unit* target, uint32 school, uint32 mec if (!target) return nullptr; - // Silenced so we can't cast - if (me->IsSilenced(school ? SpellSchoolMask(school) : SPELL_SCHOOL_MASK_MAGIC)) - return nullptr; + // Silenced so we can't cast @TODO: 4.4.0 + // if (me->HasUnitFlag(UNIT_FLAG_SILENCED)) + // return nullptr; // Using the extended script system we first create a list of viable spells SpellInfo const* apSpell[MAX_CREATURE_SPELLS]; diff --git a/src/server/game/Achievements/CriteriaHandler.cpp b/src/server/game/Achievements/CriteriaHandler.cpp index f04b1b5651f..66627e24b0a 100644 --- a/src/server/game/Achievements/CriteriaHandler.cpp +++ b/src/server/game/Achievements/CriteriaHandler.cpp @@ -17,7 +17,6 @@ #include "CriteriaHandler.h" #include "ArenaTeamMgr.h" -#include "AzeriteItem.h" #include "Battleground.h" #include "BattlePetMgr.h" #include "CollectionMgr.h" @@ -2746,12 +2745,7 @@ bool CriteriaHandler::ModifierSatisfied(ModifierTreeEntry const* modifier, uint6 break; } case ModifierTreeType::PlayerAzeriteLevelEqualOrGreaterThan: // 235 - { - Item const* heartOfAzeroth = referencePlayer->GetItemByEntry(ITEM_ID_HEART_OF_AZEROTH, ItemSearchLocation::Everywhere); - if (!heartOfAzeroth || heartOfAzeroth->ToAzeriteItem()->GetLevel() < reqValue) - return false; - break; - } + return false; case ModifierTreeType::PlayerIsOnQuestInQuestline: // 236 { bool isOnQuest = false; @@ -2923,33 +2917,10 @@ bool CriteriaHandler::ModifierSatisfied(ModifierTreeEntry const* modifier, uint6 if (!ref || !ref->IsUnit() || ref->ToUnit()->GetAuraCount(secondaryAsset) < reqValue) return false; break; - case ModifierTreeType::PlayerHasAzeriteEssenceRankLessThan: // 259 - { - if (Item const* heartOfAzeroth = referencePlayer->GetItemByEntry(ITEM_ID_HEART_OF_AZEROTH, ItemSearchLocation::Everywhere)) - if (AzeriteItem const* azeriteItem = heartOfAzeroth->ToAzeriteItem()) - for (UF::UnlockedAzeriteEssence const& essence : azeriteItem->m_azeriteItemData->UnlockedEssences) - if (essence.AzeriteEssenceID == reqValue && essence.Rank < secondaryAsset) - return true; - return false; - } - case ModifierTreeType::PlayerHasAzeriteEssenceRankEqual: // 260 - { - if (Item const* heartOfAzeroth = referencePlayer->GetItemByEntry(ITEM_ID_HEART_OF_AZEROTH, ItemSearchLocation::Everywhere)) - if (AzeriteItem const* azeriteItem = heartOfAzeroth->ToAzeriteItem()) - for (UF::UnlockedAzeriteEssence const& essence : azeriteItem->m_azeriteItemData->UnlockedEssences) - if (essence.AzeriteEssenceID == reqValue && essence.Rank == secondaryAsset) - return true; - return false; - } - case ModifierTreeType::PlayerHasAzeriteEssenceRankGreaterThan: // 261 - { - if (Item const* heartOfAzeroth = referencePlayer->GetItemByEntry(ITEM_ID_HEART_OF_AZEROTH, ItemSearchLocation::Everywhere)) - if (AzeriteItem const* azeriteItem = heartOfAzeroth->ToAzeriteItem()) - for (UF::UnlockedAzeriteEssence const& essence : azeriteItem->m_azeriteItemData->UnlockedEssences) - if (essence.AzeriteEssenceID == reqValue && essence.Rank > secondaryAsset) - return true; + case ModifierTreeType::PlayerHasAzeriteEssenceRankLessThan: // 259 NYI + case ModifierTreeType::PlayerHasAzeriteEssenceRankEqual: // 260 NYI + case ModifierTreeType::PlayerHasAzeriteEssenceRankGreaterThan: // 261 NYI return false; - } case ModifierTreeType::PlayerHasAuraWithEffectIndex: // 262 if (!referencePlayer->GetAuraEffect(reqValue, secondaryAsset)) return false; @@ -2974,21 +2945,8 @@ bool CriteriaHandler::ModifierSatisfied(ModifierTreeEntry const* modifier, uint6 return false; break; } - case ModifierTreeType::PlayerHasAzeriteEssenceInSlotAtRankLessThan: // 266 - if (Item const* heartOfAzeroth = referencePlayer->GetItemByEntry(ITEM_ID_HEART_OF_AZEROTH, ItemSearchLocation::Everywhere)) - if (AzeriteItem const* azeriteItem = heartOfAzeroth->ToAzeriteItem()) - if (UF::SelectedAzeriteEssences const* selectedEssences = azeriteItem->GetSelectedAzeriteEssences()) - for (UF::UnlockedAzeriteEssence const& essence : azeriteItem->m_azeriteItemData->UnlockedEssences) - if (essence.AzeriteEssenceID == selectedEssences->AzeriteEssenceID[reqValue] && essence.Rank < secondaryAsset) - return true; - return false; - case ModifierTreeType::PlayerHasAzeriteEssenceInSlotAtRankGreaterThan: // 267 - if (Item const* heartOfAzeroth = referencePlayer->GetItemByEntry(ITEM_ID_HEART_OF_AZEROTH, ItemSearchLocation::Everywhere)) - if (AzeriteItem const* azeriteItem = heartOfAzeroth->ToAzeriteItem()) - if (UF::SelectedAzeriteEssences const* selectedEssences = azeriteItem->GetSelectedAzeriteEssences()) - for (UF::UnlockedAzeriteEssence const& essence : azeriteItem->m_azeriteItemData->UnlockedEssences) - if (essence.AzeriteEssenceID == selectedEssences->AzeriteEssenceID[reqValue] && essence.Rank > secondaryAsset) - return true; + case ModifierTreeType::PlayerHasAzeriteEssenceInSlotAtRankLessThan: // 266 NYI + case ModifierTreeType::PlayerHasAzeriteEssenceInSlotAtRankGreaterThan: // 267 NYI return false; case ModifierTreeType::PlayerLevelWithinContentTuning: // 268 { @@ -3041,11 +2999,8 @@ bool CriteriaHandler::ModifierSatisfied(ModifierTreeEntry const* modifier, uint6 } case ModifierTreeType::PlayerLevelWithinOrAboveLevelRange: // 274 NYI case ModifierTreeType::TargetLevelWithinOrAboveLevelRange: // 275 NYI + case ModifierTreeType::MaxJailersTowerLevelEqualOrGreaterThan: // 276 NYI return false; - case ModifierTreeType::MaxJailersTowerLevelEqualOrGreaterThan: // 276 - if (referencePlayer->m_activePlayerData->JailersTowerLevelMax < int32(reqValue)) - return false; - break; case ModifierTreeType::GroupedWithRaFRecruit: // 277 { Group const* group = referencePlayer->GetGroup(); @@ -3087,11 +3042,8 @@ bool CriteriaHandler::ModifierSatisfied(ModifierTreeEntry const* modifier, uint6 case ModifierTreeType::HonorGainSource: // 285 NYI case ModifierTreeType::JailersTowerActiveFloorIndexEqualOrGreaterThan: // 286 NYI case ModifierTreeType::JailersTowerActiveFloorDifficultyEqualOrGreaterThan: // 287 NYI + case ModifierTreeType::PlayerCovenant: // 288 NYI return false; - case ModifierTreeType::PlayerCovenant: // 288 - if (referencePlayer->m_playerData->CovenantID != int32(reqValue)) - return false; - break; case ModifierTreeType::HasTimeEventPassed: // 289 { time_t eventTimestamp = GameTime::GetGameTime(); @@ -3129,11 +3081,7 @@ bool CriteriaHandler::ModifierSatisfied(ModifierTreeEntry const* modifier, uint6 break; } case ModifierTreeType::GarrisonHasPermanentTalent: // 290 NYI - return false; - case ModifierTreeType::HasActiveSoulbind: // 291 - if (referencePlayer->m_playerData->SoulbindID != int32(reqValue)) - return false; - break; + case ModifierTreeType::HasActiveSoulbind: // 291 NYI case ModifierTreeType::HasMemorizedSpell: // 292 NYI return false; case ModifierTreeType::PlayerHasAPACSubscriptionReward_2020: // 293 @@ -3160,31 +3108,12 @@ bool CriteriaHandler::ModifierSatisfied(ModifierTreeEntry const* modifier, uint6 return true; return false; } - case ModifierTreeType::PlayerIsInChromieTime: // 300 - if (referencePlayer->m_activePlayerData->UiChromieTimeExpansionID != int32(reqValue)) - return false; - break; - case ModifierTreeType::PlayerIsInAnyChromieTime: // 301 - if (referencePlayer->m_activePlayerData->UiChromieTimeExpansionID == 0) - return false; - break; - case ModifierTreeType::ItemIsAzeriteArmor: // 302 - if (!sDB2Manager.GetAzeriteEmpoweredItem(miscValue1)) - return false; - break; - case ModifierTreeType::PlayerHasRuneforgePower: // 303 - { - uint32 block = reqValue / 32; - if (block >= referencePlayer->m_activePlayerData->RuneforgePowers.size()) - return false; - - uint32 bit = reqValue % 32; - return referencePlayer->m_activePlayerData->RuneforgePowers[block] & (1 << bit); - } - case ModifierTreeType::PlayerInChromieTimeForScaling: // 304 - if (!(referencePlayer->m_playerData->CtrOptions->ContentTuningConditionMask & 1)) - return false; - break; + case ModifierTreeType::PlayerIsInChromieTime: // 300 NYI + case ModifierTreeType::PlayerIsInAnyChromieTime: // 301 NYI + case ModifierTreeType::ItemIsAzeriteArmor: // 302 NYI + case ModifierTreeType::PlayerHasRuneforgePower: // 303 NYI + case ModifierTreeType::PlayerInChromieTimeForScaling: // 304 NYI + return false; case ModifierTreeType::IsRaFRecruit: // 305 if (!referencePlayer->GetSession()->GetRecruiterId()) return false; @@ -3236,16 +3165,8 @@ bool CriteriaHandler::ModifierSatisfied(ModifierTreeEntry const* modifier, uint6 return false; break; } - case ModifierTreeType::PlayerHasWeeklyRewardsAvailable: // 313 - if (!*referencePlayer->m_activePlayerData->WeeklyRewardsPeriodSinceOrigin) - return false; - break; - case ModifierTreeType::TargetCovenant: // 314 - if (!ref || !ref->IsPlayer()) - return false; - if (ref->ToPlayer()->m_playerData->CovenantID != int32(reqValue)) - return false; - break; + case ModifierTreeType::PlayerHasWeeklyRewardsAvailable: // 313 NYI + case ModifierTreeType::TargetCovenant: // 314 NYI case ModifierTreeType::PlayerHasTBCCollectorsEdition: // 315 case ModifierTreeType::PlayerHasWrathCollectorsEdition: // 316 return false; @@ -3404,10 +3325,8 @@ bool CriteriaHandler::ModifierSatisfied(ModifierTreeEntry const* modifier, uint6 if (GameTime::GetGameTime() - referencePlayer->m_playerData->LogoutTime < int64(reqValue) * DAY) return false; break; - case ModifierTreeType::PlayerHasPerksProgramPendingReward: // 350 - if (!referencePlayer->m_activePlayerData->HasPerksProgramPendingReward) - return false; - break; + case ModifierTreeType::PlayerHasPerksProgramPendingReward: // 350 NYI + return false; case ModifierTreeType::PlayerCanUseItem: // 351 { ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(reqValue); diff --git a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp index a89cca92af9..9de88514704 100644 --- a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp +++ b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp @@ -72,7 +72,7 @@ AuctionsBucketKey AuctionsBucketKey::ForItem(Item const* item) return { item->GetEntry(), - uint16(Item::GetItemLevel(itemTemplate, *item->GetBonus(), 0, item->GetRequiredLevel(), 0, 0, 0, false, 0)), + uint16(Item::GetItemLevel(itemTemplate, *item->GetBonus(), 0, item->GetRequiredLevel(), 0, 0, 0, false)), uint16(item->GetModifier(ITEM_MODIFIER_BATTLE_PET_SPECIES_ID)), uint16(item->GetBonus()->Suffix) }; diff --git a/src/server/game/AuctionHouseBot/AuctionHouseBotBuyer.cpp b/src/server/game/AuctionHouseBot/AuctionHouseBotBuyer.cpp index 95e98c53a6f..c96281ca7b9 100644 --- a/src/server/game/AuctionHouseBot/AuctionHouseBotBuyer.cpp +++ b/src/server/game/AuctionHouseBot/AuctionHouseBotBuyer.cpp @@ -169,7 +169,7 @@ bool AuctionBotBuyer::RollBuyChance(BuyerItemInfo const* ahInfo, AuctionPosting Item const* item = auction->Items[0]; float itemBuyPrice = float(auction->BuyoutOrUnitPrice); float itemPrice; - if (uint32 itemSellPrice = item->GetSellPrice(item->GetTemplate(), item->GetQuality(), item->GetItemLevel(item->GetTemplate(), *item->GetBonus(), 0, 0, 0, 0, 0, false, 0))) + if (uint32 itemSellPrice = item->GetSellPrice(item->GetTemplate(), item->GetQuality(), item->GetItemLevel(item->GetTemplate(), *item->GetBonus(), 0, 0, 0, 0, 0, false))) itemPrice = float(itemSellPrice); else itemPrice = float(GetVendorPrice(item->GetQuality())); @@ -214,7 +214,7 @@ bool AuctionBotBuyer::RollBidChance(BuyerItemInfo const* ahInfo, AuctionPosting Item const* item = auction->Items[0]; float itemBidPrice = float(bidPrice); float itemPrice; - if (uint32 itemSellPrice = item->GetSellPrice(item->GetTemplate(), item->GetQuality(), item->GetItemLevel(item->GetTemplate(), *item->GetBonus(), 0, 0, 0, 0, 0, false, 0))) + if (uint32 itemSellPrice = item->GetSellPrice(item->GetTemplate(), item->GetQuality(), item->GetItemLevel(item->GetTemplate(), *item->GetBonus(), 0, 0, 0, 0, 0, false))) itemPrice = float(itemSellPrice); else itemPrice = float(GetVendorPrice(item->GetQuality())); diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h index fa15667504d..ce4cbaedb0c 100644 --- a/src/server/game/DataStores/DBCEnums.h +++ b/src/server/game/DataStores/DBCEnums.h @@ -1553,7 +1553,7 @@ enum class ModifierTreeType : int32 PlayerMainhandWeaponType = 232, // Player has main hand weapon of type "{$Weapon Type}" PlayerOffhandWeaponType = 233, // Player has off-hand weapon of type "{$Weapon Type}" PlayerPvpTier = 234, // Player is in PvP tier {PvpTier} - PlayerAzeriteLevelEqualOrGreaterThan = 235, // Players' Azerite Item is at or above level "{#Azerite Level}" + PlayerAzeriteLevelEqualOrGreaterThan = 235, /*NYI*/ // Players' Azerite Item is at or above level "{#Azerite Level}" PlayerIsOnQuestInQuestline = 236, // Player is on quest in questline "{QuestLine}" PlayerIsQnQuestLinkedToScheduledWorldStateGroup = 237, // Player is on quest associated with current progressive unlock group "{ScheduledWorldStateGroup}" PlayerIsInRaidGroup = 238, // Player is in raid group @@ -1577,15 +1577,15 @@ enum class ModifierTreeType : int32 TargetAuraStackCountEqual = 256, // Target has exactly {#Stacks} stacks of aura "{Spell}" PlayerAuraStackCountEqualOrGreaterThan = 257, // Player has at least {#Stacks} stacks of aura "{Spell}" TargetAuraStackCountEqualOrGreaterThan = 258, // Target has at least {#Stacks} stacks of aura "{Spell}" - PlayerHasAzeriteEssenceRankLessThan = 259, // Player has Azerite Essence {AzeriteEssence} at less than rank {#rank} - PlayerHasAzeriteEssenceRankEqual = 260, // Player has Azerite Essence {AzeriteEssence} at rank {#rank} - PlayerHasAzeriteEssenceRankGreaterThan = 261, // Player has Azerite Essence {AzeriteEssence} at greater than rank {#rank} + PlayerHasAzeriteEssenceRankLessThan = 259, /*NYI*/ // Player has Azerite Essence {AzeriteEssence} at less than rank {#rank} + PlayerHasAzeriteEssenceRankEqual = 260, /*NYI*/ // Player has Azerite Essence {AzeriteEssence} at rank {#rank} + PlayerHasAzeriteEssenceRankGreaterThan = 261, /*NYI*/ // Player has Azerite Essence {AzeriteEssence} at greater than rank {#rank} PlayerHasAuraWithEffectIndex = 262, // Player has Aura {Spell} with Effect Index {#index} active PlayerLootSpecializationMatchesRole = 263, // Player loot specialization matches role {@LFG_ROLE} PlayerIsAtMaxExpansionLevel = 264, // Player is at max expansion level TransmogSource = 265, // Transmog Source is "{@TRANSMOG_SOURCE}" - PlayerHasAzeriteEssenceInSlotAtRankLessThan = 266, // Player has Azerite Essence in slot {@AZERITE_ESSENCE_SLOT} at less than rank {#rank} - PlayerHasAzeriteEssenceInSlotAtRankGreaterThan = 267, // Player has Azerite Essence in slot {@AZERITE_ESSENCE_SLOT} at greater than rank {#rank} + PlayerHasAzeriteEssenceInSlotAtRankLessThan = 266, /*NYI*/ // Player has Azerite Essence in slot {@AZERITE_ESSENCE_SLOT} at less than rank {#rank} + PlayerHasAzeriteEssenceInSlotAtRankGreaterThan = 267, /*NYI*/ // Player has Azerite Essence in slot {@AZERITE_ESSENCE_SLOT} at greater than rank {#rank} PlayerLevelWithinContentTuning = 268, // Player has level within Content Tuning {ContentTuning} TargetLevelWithinContentTuning = 269, // Target has level within Content Tuning {ContentTuning} PlayerIsScenarioInitiator = 270, /*NYI*/ // Player is Scenario Initiator @@ -1594,7 +1594,7 @@ enum class ModifierTreeType : int32 TargetLevelWithinOrAboveContentTuning = 273, // Target has level within or above Content Tuning {ContentTuning} PlayerLevelWithinOrAboveLevelRange = 274, /*NYI*/ // Player has level within or above Level Range {LevelRange} TargetLevelWithinOrAboveLevelRange = 275, /*NYI*/ // Target has level within or above Level Range {LevelRange} - MaxJailersTowerLevelEqualOrGreaterThan = 276, // Max Jailers Tower Level Atleast {#Level} + MaxJailersTowerLevelEqualOrGreaterThan = 276, /*NYI*/ // Max Jailers Tower Level Atleast {#Level} GroupedWithRaFRecruit = 277, // Grouped With Recruit GroupedWithRaFRecruiter = 278, // Grouped with Recruiter PlayerSpecialization = 279, // Specialization is "{ChrSpecialization}" @@ -1606,10 +1606,10 @@ enum class ModifierTreeType : int32 HonorGainSource = 285, /*NYI*/ // Player gained honor from source {@SPECIAL_MISC_HONOR_GAIN_SOURCE} JailersTowerActiveFloorIndexEqualOrGreaterThan = 286, /*NYI*/ // Active Floor Index Atleast {#Level} JailersTowerActiveFloorDifficultyEqualOrGreaterThan = 287, /*NYI*/ // Active Floor Difficulty Atleast {#Level} - PlayerCovenant = 288, // Player is member of covenant "{Covenant}" + PlayerCovenant = 288, /*NYI*/ // Player is member of covenant "{Covenant}" HasTimeEventPassed = 289, // Has time event "{TimeEvent}" passed GarrisonHasPermanentTalent = 290, /*NYI*/ // Garrison has permanent talent "{GarrTalent}" - HasActiveSoulbind = 291, // Has Active Soulbind "{Soulbind}" + HasActiveSoulbind = 291, /*NYI*/ // Has Active Soulbind "{Soulbind}" HasMemorizedSpell = 292, /*NYI*/ // Has memorized spell "{Spell}" PlayerHasAPACSubscriptionReward_2020 = 293, // Player has APAC Subscription Reward 2020 PlayerHasTBCCDEWarpStalker_Mount = 294, // Player has TBCC:DE Warp Stalker Mount @@ -1618,11 +1618,11 @@ enum class ModifierTreeType : int32 PlayerHasImpInABallToySubscriptionReward = 297, // Player has Imp in a Ball Toy Subscription Reward PlayerIsInAreaGroup = 298, // Player is in area group "{AreaGroup}" TargetIsInAreaGroup = 299, // Target is in area group "{AreaGroup}" - PlayerIsInChromieTime = 300, // Player has selected Chromie Time ID "{UiChromieTimeExpansionInfo}" - PlayerIsInAnyChromieTime = 301, // Player has selected ANY Chromie Time ID - ItemIsAzeriteArmor = 302, // Item is Azerite Armor - PlayerHasRuneforgePower = 303, // Player Has Runeforge Power "{RuneforgeLegendaryAbility}" - PlayerInChromieTimeForScaling = 304, // Player is Chromie Time for Scaling + PlayerIsInChromieTime = 300, /*NYI*/ // Player has selected Chromie Time ID "{UiChromieTimeExpansionInfo}" + PlayerIsInAnyChromieTime = 301, /*NYI*/ // Player has selected ANY Chromie Time ID + ItemIsAzeriteArmor = 302, /*NYI*/ // Item is Azerite Armor + PlayerHasRuneforgePower = 303, /*NYI*/ // Player Has Runeforge Power "{RuneforgeLegendaryAbility}" + PlayerInChromieTimeForScaling = 304, /*NYI*/ // Player is Chromie Time for Scaling IsRaFRecruit = 305, // Is RAF recruit AllPlayersInGroupHaveAchievement = 306, // All Players In Group Have Achievement "{Achievement}" PlayerHasSoulbindConduitRankEqualOrGreaterThan = 307, /*NYI*/ // Player has Conduit "{SoulbindConduit}" at Rank {#Rank} or Higher @@ -1631,8 +1631,8 @@ enum class ModifierTreeType : int32 PlayerIsRestrictedAccount = 310, // Player is a Restricted Account PlayerIsFlying = 311, // Player is flying PlayerScenarioIsLastStep = 312, // Player is on the last step of a Scenario - PlayerHasWeeklyRewardsAvailable = 313, // Player has weekly rewards available - TargetCovenant = 314, // Target is member of covenant "{Covenant}" + PlayerHasWeeklyRewardsAvailable = 313, /*NYI*/ // Player has weekly rewards available + TargetCovenant = 314, /*NYI*/ // Target is member of covenant "{Covenant}" PlayerHasTBCCollectorsEdition = 315, // Player has TBC Collector's Edition PlayerHasWrathCollectorsEdition = 316, // Player has Wrath Collector's Edition GarrisonTalentResearchedAndAtRankEqualOrGreaterThan = 317, /*NYI*/ // Garrison has talent "{GarrTalent}" researched and active at or above {#Rank} @@ -1665,7 +1665,7 @@ enum class ModifierTreeType : int32 CraftingOrderSkillLineAbility = 347, /*NYI*/ CraftingOrderProfession = 348, /*NYI*/ // ProfessionEnum - PlayerHasPerksProgramPendingReward = 350, + PlayerHasPerksProgramPendingReward = 350, /*NYI*/ PlayerCanUseItem = 351, // Player can use item {#Item} PlayerSummonedBattlePetSpecies = 352, PlayerSummonedBattlePetIsMaxLevel = 353, diff --git a/src/server/game/DungeonFinding/LFGMgr.cpp b/src/server/game/DungeonFinding/LFGMgr.cpp index 642367f1128..94e596acff9 100644 --- a/src/server/game/DungeonFinding/LFGMgr.cpp +++ b/src/server/game/DungeonFinding/LFGMgr.cpp @@ -1759,7 +1759,7 @@ LfgLockMap LFGMgr::GetLockedDungeons(ObjectGuid guid) return LFG_LOCKSTATUS_RAID_LOCKED; if (sInstanceLockMgr.FindActiveInstanceLock(guid, { dungeon->map, Difficulty(dungeon->difficulty) })) return LFG_LOCKSTATUS_RAID_LOCKED; - if (Optional<ContentTuningLevels> levels = sDB2Manager.GetContentTuningData(dungeon->contentTuningId, player->m_playerData->CtrOptions->ContentTuningConditionMask)) + if (Optional<ContentTuningLevels> levels = sDB2Manager.GetContentTuningData(dungeon->contentTuningId, 0 /*player->m_playerData->CtrOptions->ContentTuningConditionMask*/)) { if (levels->MinLevel > level) return LFG_LOCKSTATUS_TOO_LOW_LEVEL; diff --git a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp index bce08be9666..d1ead16c014 100644 --- a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp +++ b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp @@ -145,8 +145,7 @@ bool AreaTrigger::Create(AreaTriggerCreatePropertiesId areaTriggerCreateProperti SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::SpellID), spellInfo->Id); if (spellInfo) SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::SpellForVisuals), spellInfo->Id); - SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::SpellVisual).ModifyValue(&UF::SpellCastVisual::SpellXSpellVisualID), spellVisual.SpellXSpellVisualID); - SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::SpellVisual).ModifyValue(&UF::SpellCastVisual::ScriptVisualID), spellVisual.ScriptVisualID); + SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::SpellXSpellVisualID), spellVisual.SpellXSpellVisualID); if (!IsStaticSpawn()) SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::TimeToTargetScale), GetCreateProperties()->TimeToTargetScale != 0 ? GetCreateProperties()->TimeToTargetScale : *m_areaTriggerData->Duration); SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::BoundsRadius2D), GetCreateProperties()->Shape.GetMaxSearchRadius()); @@ -710,9 +709,7 @@ void AreaTrigger::SearchUnitInCylinder(std::vector<Unit*>& targetList) float scale = CalcCurrentScale(); float radius = G3D::lerp(_shape.CylinderDatas.Radius, _shape.CylinderDatas.RadiusTarget, progress) * scale; - float height = G3D::lerp(_shape.CylinderDatas.Height, _shape.CylinderDatas.HeightTarget, progress); - if (!m_areaTriggerData->HeightIgnoresScale) - height *= scale; + float height = G3D::lerp(_shape.CylinderDatas.Height, _shape.CylinderDatas.HeightTarget, progress) * scale; float minZ = GetPositionZ() - height; float maxZ = GetPositionZ() + height; @@ -736,9 +733,7 @@ void AreaTrigger::SearchUnitInDisk(std::vector<Unit*>& targetList) float scale = CalcCurrentScale(); float innerRadius = G3D::lerp(_shape.DiskDatas.InnerRadius, _shape.DiskDatas.InnerRadiusTarget, progress) * scale; float outerRadius = G3D::lerp(_shape.DiskDatas.OuterRadius, _shape.DiskDatas.OuterRadiusTarget, progress) * scale; - float height = G3D::lerp(_shape.DiskDatas.Height, _shape.DiskDatas.HeightTarget, progress); - if (!m_areaTriggerData->HeightIgnoresScale) - height *= scale; + float height = G3D::lerp(_shape.DiskDatas.Height, _shape.DiskDatas.HeightTarget, progress) * scale; float minZ = GetPositionZ() - height; float maxZ = GetPositionZ() + height; @@ -819,10 +814,6 @@ void AreaTrigger::HandleUnitEnterExit(std::vector<Unit*> const& newTargetList) _ai->OnUnitExit(leavingUnit); } } - - SetUpdateFieldValue(m_values.ModifyValue(&AreaTrigger::m_areaTriggerData).ModifyValue(&UF::AreaTriggerData::NumUnitsInside), _insideUnits.size()); - SetUpdateFieldValue(m_values.ModifyValue(&AreaTrigger::m_areaTriggerData).ModifyValue(&UF::AreaTriggerData::NumPlayersInside), - std::count_if(_insideUnits.begin(), _insideUnits.end(), [](ObjectGuid const& guid) { return guid.IsPlayer(); })); } AreaTriggerTemplate const* AreaTrigger::GetTemplate() const diff --git a/src/server/game/Entities/AreaTrigger/AreaTrigger.h b/src/server/game/Entities/AreaTrigger/AreaTrigger.h index 02f69ce40cf..0fa519631d5 100644 --- a/src/server/game/Entities/AreaTrigger/AreaTrigger.h +++ b/src/server/game/Entities/AreaTrigger/AreaTrigger.h @@ -100,8 +100,6 @@ class TC_GAME_API AreaTrigger final : public WorldObject, public GridObject<Area AuraEffect const* GetAuraEffect() const { return _aurEff; } uint32 GetTimeSinceCreated() const { return _timeSinceCreated; } - void SetHeightIgnoresScale(bool heightIgnoresScale) { SetUpdateFieldValue(m_values.ModifyValue(&AreaTrigger::m_areaTriggerData).ModifyValue(&UF::AreaTriggerData::HeightIgnoresScale), heightIgnoresScale); } - void SetOverrideScaleCurve(float overrideScale); void SetOverrideScaleCurve(std::array<DBCPosition2D, 2> const& points, Optional<uint32> startTimeOffset = {}, CurveInterpolationMode interpolation = CurveInterpolationMode::Linear); void ClearOverrideScaleCurve(); diff --git a/src/server/game/Entities/Conversation/Conversation.cpp b/src/server/game/Entities/Conversation/Conversation.cpp index 11801ca0763..2de2e747b28 100644 --- a/src/server/game/Entities/Conversation/Conversation.cpp +++ b/src/server/game/Entities/Conversation/Conversation.cpp @@ -69,15 +69,7 @@ void Conversation::Update(uint32 diff) sScriptMgr->OnConversationUpdate(this, diff); if (GetDuration() > Milliseconds(diff)) - { _duration -= Milliseconds(diff); - DoWithSuppressingObjectUpdates([&]() - { - // Only sent in CreateObject - ApplyModUpdateFieldValue(m_values.ModifyValue(&Conversation::m_conversationData).ModifyValue(&UF::ConversationData::Progress), int32(diff), true); - const_cast<UF::ConversationData&>(*m_conversationData).ClearChanged(&UF::ConversationData::Progress); - }); - } else { Remove(); // expired @@ -200,7 +192,6 @@ void Conversation::Create(ObjectGuid::LowType lowGuid, uint32 conversationEntry, lineField.UiCameraID = line->UiCameraID; lineField.ActorIndex = line->ActorIdx; lineField.Flags = line->Flags; - lineField.ChatType = line->ChatType; for (LocaleConstant locale = LOCALE_enUS; locale < TOTAL_LOCALES; locale = LocaleConstant(locale + 1)) { @@ -236,7 +227,7 @@ bool Conversation::Start() for (UF::ConversationLine const& line : *m_conversationData->Lines) { UF::ConversationActor const* actor = line.ActorIndex < m_conversationData->Actors.size() ? &m_conversationData->Actors[line.ActorIndex] : nullptr; - if (!actor || (!actor->CreatureID && actor->ActorGUID.IsEmpty() && !actor->NoActorObject)) + if (!actor || (!actor->CreatureID && actor->ActorGUID.IsEmpty())) { TC_LOG_ERROR("entities.conversation", "Failed to create conversation (Id: {}) due to missing actor (Idx: {}).", GetEntry(), line.ActorIndex); return false; @@ -265,7 +256,6 @@ void Conversation::AddActor(int32 actorId, uint32 actorIdx, ObjectGuid const& ac SetUpdateFieldValue(actorField.ModifyValue(&UF::ConversationActor::ActorGUID), actorGuid); SetUpdateFieldValue(actorField.ModifyValue(&UF::ConversationActor::Id), actorId); SetUpdateFieldValue(actorField.ModifyValue(&UF::ConversationActor::Type), AsUnderlyingType(ConversationActorType::WorldObject)); - SetUpdateFieldValue(actorField.ModifyValue(&UF::ConversationActor::NoActorObject), 0); } void Conversation::AddActor(int32 actorId, uint32 actorIdx, ConversationActorType type, uint32 creatureId, uint32 creatureDisplayInfoId) @@ -276,7 +266,6 @@ void Conversation::AddActor(int32 actorId, uint32 actorIdx, ConversationActorTyp SetUpdateFieldValue(actorField.ModifyValue(&UF::ConversationActor::ActorGUID), ObjectGuid::Empty); SetUpdateFieldValue(actorField.ModifyValue(&UF::ConversationActor::Id), actorId); SetUpdateFieldValue(actorField.ModifyValue(&UF::ConversationActor::Type), AsUnderlyingType(type)); - SetUpdateFieldValue(actorField.ModifyValue(&UF::ConversationActor::NoActorObject), type == ConversationActorType::WorldObject ? 1 : 0); } Milliseconds const* Conversation::GetLineStartTime(LocaleConstant locale, int32 lineId) const diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index c122e51800a..cc8e3fc7757 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -645,15 +645,7 @@ bool Creature::UpdateEntry(uint32 entry, CreatureData const* data /*= nullptr*/, // checked and error show at loading templates if (FactionTemplateEntry const* factionTemplate = sFactionTemplateStore.LookupEntry(cInfo->faction)) - { SetPvP((factionTemplate->Flags & FACTION_TEMPLATE_FLAG_PVP) != 0); - if (IsTaxi()) - { - uint32 taxiNodesId = sObjectMgr->GetNearestTaxiNode(GetPositionX(), GetPositionY(), GetPositionZ(), GetMapId(), - factionTemplate->FactionGroup & FACTION_MASK_ALLIANCE ? ALLIANCE : HORDE); - SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::TaxiNodesID), taxiNodesId); - } - } // updates spell bars for vehicles and set player's faction - should be called here, to overwrite faction that is set from the new template if (IsVehicle()) diff --git a/src/server/game/Entities/DynamicObject/DynamicObject.cpp b/src/server/game/Entities/DynamicObject/DynamicObject.cpp index f4023c18c68..d19a1f012d7 100644 --- a/src/server/game/Entities/DynamicObject/DynamicObject.cpp +++ b/src/server/game/Entities/DynamicObject/DynamicObject.cpp @@ -102,8 +102,7 @@ bool DynamicObject::CreateDynamicObject(ObjectGuid::LowType guidlow, Unit* caste auto dynamicObjectData = m_values.ModifyValue(&DynamicObject::m_dynamicObjectData); SetUpdateFieldValue(dynamicObjectData.ModifyValue(&UF::DynamicObjectData::Caster), caster->GetGUID()); SetUpdateFieldValue(dynamicObjectData.ModifyValue(&UF::DynamicObjectData::Type), type); - SetUpdateFieldValue(dynamicObjectData.ModifyValue(&UF::DynamicObjectData::SpellVisual).ModifyValue(&UF::SpellCastVisual::SpellXSpellVisualID), spellVisual.SpellXSpellVisualID); - SetUpdateFieldValue(dynamicObjectData.ModifyValue(&UF::DynamicObjectData::SpellVisual).ModifyValue(&UF::SpellCastVisual::ScriptVisualID), spellVisual.ScriptVisualID); + SetUpdateFieldValue(dynamicObjectData.ModifyValue(&UF::DynamicObjectData::SpellXSpellVisualID), spellVisual.SpellXSpellVisualID); SetUpdateFieldValue(dynamicObjectData.ModifyValue(&UF::DynamicObjectData::SpellID), spell->Id); SetUpdateFieldValue(dynamicObjectData.ModifyValue(&UF::DynamicObjectData::Radius), radius); SetUpdateFieldValue(dynamicObjectData.ModifyValue(&UF::DynamicObjectData::CastTime), GameTime::GetGameTimeMS()); diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index 5816b1c3707..e6b894b0d32 100644 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -17,8 +17,6 @@ #include "GameObject.h" #include "ArtifactPackets.h" -#include "AzeriteItem.h" -#include "AzeritePackets.h" #include "Battleground.h" #include "BattlegroundPackets.h" #include "CellImpl.h" @@ -2183,7 +2181,7 @@ uint8 GameObject::GetLevelForTarget(WorldObject const* target) const if (GetGoType() == GAMEOBJECT_TYPE_TRAP) { if (Player const* player = target->ToPlayer()) - if (Optional<ContentTuningLevels> userLevels = sDB2Manager.GetContentTuningData(GetGOInfo()->ContentTuningId, player->m_playerData->CtrOptions->ContentTuningConditionMask)) + if (Optional<ContentTuningLevels> userLevels = sDB2Manager.GetContentTuningData(GetGOInfo()->ContentTuningId, 0 /*player->m_playerData->CtrOptions->ContentTuningConditionMask*/)) return uint8(std::clamp<int16>(player->GetLevel(), userLevels->MinLevel, userLevels->MaxLevel)); if (Unit const* targetUnit = target->ToUnit()) @@ -3073,11 +3071,11 @@ void GameObject::Use(Unit* user) return; //required lvl checks! - if (Optional<ContentTuningLevels> userLevels = sDB2Manager.GetContentTuningData(info->ContentTuningId, player->m_playerData->CtrOptions->ContentTuningConditionMask)) + if (Optional<ContentTuningLevels> userLevels = sDB2Manager.GetContentTuningData(info->ContentTuningId, 0 /*player->m_playerData->CtrOptions->ContentTuningConditionMask*/)) if (player->GetLevel() < userLevels->MaxLevel) return; - if (Optional<ContentTuningLevels> targetLevels = sDB2Manager.GetContentTuningData(info->ContentTuningId, targetPlayer->m_playerData->CtrOptions->ContentTuningConditionMask)) + if (Optional<ContentTuningLevels> targetLevels = sDB2Manager.GetContentTuningData(info->ContentTuningId, 0 /*player->m_playerData->CtrOptions->ContentTuningConditionMask*/)) if (targetPlayer->GetLevel() < targetLevels->MaxLevel) return; @@ -3323,18 +3321,6 @@ void GameObject::Use(Unit* user) player->SendDirectMessage(openArtifactForge.Write()); break; } - case 2: // Heart Forge - { - Item const* item = player->GetItemByEntry(ITEM_ID_HEART_OF_AZEROTH, ItemSearchLocation::Everywhere); - if (!item) - return; - - WorldPackets::GameObject::GameObjectInteraction openHeartForge; - openHeartForge.ObjectGUID = GetGUID(); - openHeartForge.InteractionType = PlayerInteractionType::AzeriteForge; - player->SendDirectMessage(openHeartForge.Write()); - break; - } default: break; } diff --git a/src/server/game/Entities/Item/AzeriteItem/AzeriteEmpoweredItem.cpp b/src/server/game/Entities/Item/AzeriteItem/AzeriteEmpoweredItem.cpp deleted file mode 100644 index c755a372a1d..00000000000 --- a/src/server/game/Entities/Item/AzeriteItem/AzeriteEmpoweredItem.cpp +++ /dev/null @@ -1,250 +0,0 @@ -/* - * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#include "AzeriteEmpoweredItem.h" -#include "DatabaseEnv.h" -#include "DB2Stores.h" -#include "Player.h" -#include "UpdateData.h" - -AzeriteEmpoweredItem::AzeriteEmpoweredItem() -{ - m_objectType |= TYPEMASK_AZERITE_EMPOWERED_ITEM; - m_objectTypeId = TYPEID_AZERITE_EMPOWERED_ITEM; - - m_azeritePowers = nullptr; - m_maxTier = 0; -} - -bool AzeriteEmpoweredItem::Create(ObjectGuid::LowType guidlow, uint32 itemId, ItemContext context, Player const* owner) -{ - if (!Item::Create(guidlow, itemId, context, owner)) - return false; - - InitAzeritePowerData(); - return true; -} - -void AzeriteEmpoweredItem::SaveToDB(CharacterDatabaseTransaction trans) -{ - CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE_AZERITE_EMPOWERED); - stmt->setUInt64(0, GetGUID().GetCounter()); - trans->Append(stmt); - - switch (GetState()) - { - case ITEM_NEW: - case ITEM_CHANGED: - { - stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_ITEM_INSTANCE_AZERITE_EMPOWERED); - stmt->setUInt64(0, GetGUID().GetCounter()); - for (uint32 i = 0; i < MAX_AZERITE_EMPOWERED_TIER; ++i) - stmt->setInt32(1 + i, m_azeriteEmpoweredItemData->Selections[i]); - - trans->Append(stmt); - break; - } - case ITEM_REMOVED: - default: - break; - } - - Item::SaveToDB(trans); -} - -void AzeriteEmpoweredItem::LoadAzeriteEmpoweredItemData(Player const* owner, AzeriteEmpoweredItemData& azeriteEmpoweredItem) -{ - InitAzeritePowerData(); - bool needSave = false; - if (m_azeritePowers) - { - for (int32 i = MAX_AZERITE_EMPOWERED_TIER; --i >= 0; ) - { - int32 selection = azeriteEmpoweredItem.SelectedAzeritePowers[i]; - if (GetTierForAzeritePower(Classes(owner->GetClass()), selection) != i) - { - needSave = true; - break; - } - - SetSelectedAzeritePower(i, selection); - } - } - else - needSave = true; - - if (needSave) - { - CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_ITEM_INSTANCE_AZERITE_EMPOWERED); - for (uint32 i = 0; i < MAX_AZERITE_EMPOWERED_TIER; ++i) - stmt->setInt32(i, m_azeriteEmpoweredItemData->Selections[i]); - - stmt->setUInt64(5, GetGUID().GetCounter()); - CharacterDatabase.Execute(stmt); - } -} - -void AzeriteEmpoweredItem::DeleteFromDB(CharacterDatabaseTransaction trans, ObjectGuid::LowType itemGuid) -{ - CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE_AZERITE_EMPOWERED); - stmt->setUInt64(0, itemGuid); - CharacterDatabase.ExecuteOrAppend(trans, stmt); -} - -void AzeriteEmpoweredItem::DeleteFromDB(CharacterDatabaseTransaction trans) -{ - AzeriteEmpoweredItem::DeleteFromDB(trans, GetGUID().GetCounter()); - Item::DeleteFromDB(trans); -} - -uint32 AzeriteEmpoweredItem::GetRequiredAzeriteLevelForTier(uint32 tier) const -{ - return sDB2Manager.GetRequiredAzeriteLevelForAzeritePowerTier(_bonusData.AzeriteTierUnlockSetId, GetContext(), tier); -} - -int32 AzeriteEmpoweredItem::GetTierForAzeritePower(Classes playerClass, int32 azeritePowerId) const -{ - auto azeritePowerItr = std::find_if(m_azeritePowers->begin(), m_azeritePowers->end(), [&](AzeritePowerSetMemberEntry const* power) - { - return power->AzeritePowerID == azeritePowerId && power->Class == playerClass; - }); - if (azeritePowerItr != m_azeritePowers->end()) - return (*azeritePowerItr)->Tier; - - return MAX_AZERITE_EMPOWERED_TIER; -} - -void AzeriteEmpoweredItem::SetSelectedAzeritePower(int32 tier, int32 azeritePowerId) -{ - SetUpdateFieldValue(m_values.ModifyValue(&AzeriteEmpoweredItem::m_azeriteEmpoweredItemData).ModifyValue(&UF::AzeriteEmpoweredItemData::Selections, uint32(tier)), azeritePowerId); - - // Not added to UF::ItemData::BonusListIDs, client fakes it on its own too - _bonusData.AddBonusList(sAzeritePowerStore.AssertEntry(azeritePowerId)->ItemBonusListID); -} - -void AzeriteEmpoweredItem::ClearSelectedAzeritePowers() -{ - for (uint32 i = 0; i < MAX_AZERITE_EMPOWERED_TIER; ++i) - SetUpdateFieldValue(m_values.ModifyValue(&AzeriteEmpoweredItem::m_azeriteEmpoweredItemData).ModifyValue(&UF::AzeriteEmpoweredItemData::Selections, i), 0); - - _bonusData.Initialize(GetTemplate()); - for (int32 bonusListID : GetBonusListIDs()) - _bonusData.AddBonusList(bonusListID); -} - -int64 AzeriteEmpoweredItem::GetRespecCost() const -{ - if (Player const* owner = GetOwner()) - return int64(float(GOLD) * sDB2Manager.GetCurveValueAt(CURVE_ID_AZERITE_EMPOWERED_ITEM_RESPEC_COST, float(owner->GetNumRespecs()))); - - return MAX_MONEY_AMOUNT + 1; -} - -void AzeriteEmpoweredItem::BuildValuesCreate(ByteBuffer* data, Player const* target) const -{ - UF::UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target); - std::size_t sizePos = data->wpos(); - *data << uint32(0); - *data << uint8(flags); - m_objectData->WriteCreate(*data, flags, this, target); - m_itemData->WriteCreate(*data, flags, this, target); - m_azeriteEmpoweredItemData->WriteCreate(*data, flags, this, target); - data->put<uint32>(sizePos, data->wpos() - sizePos - 4); -} - -void AzeriteEmpoweredItem::BuildValuesUpdate(ByteBuffer* data, Player const* target) const -{ - UF::UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target); - std::size_t sizePos = data->wpos(); - *data << uint32(0); - *data << uint32(m_values.GetChangedObjectTypeMask()); - - if (m_values.HasChanged(TYPEID_OBJECT)) - m_objectData->WriteUpdate(*data, flags, this, target); - - if (m_values.HasChanged(TYPEID_ITEM)) - m_itemData->WriteUpdate(*data, flags, this, target); - - if (m_values.HasChanged(TYPEID_AZERITE_EMPOWERED_ITEM)) - m_azeriteEmpoweredItemData->WriteUpdate(*data, flags, this, target); - - data->put<uint32>(sizePos, data->wpos() - sizePos - 4); -} - -void AzeriteEmpoweredItem::BuildValuesUpdateForPlayerWithMask(UpdateData* data, UF::ObjectData::Mask const& requestedObjectMask, - UF::ItemData::Mask const& requestedItemMask, UF::AzeriteEmpoweredItemData::Mask const& requestedAzeriteEmpoweredItemMask, Player const* target) const -{ - UF::UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target); - UpdateMask<NUM_CLIENT_OBJECT_TYPES> valuesMask; - if (requestedObjectMask.IsAnySet()) - valuesMask.Set(TYPEID_OBJECT); - - UF::ItemData::Mask itemMask = requestedItemMask; - m_itemData->FilterDisallowedFieldsMaskForFlag(itemMask, flags); - if (itemMask.IsAnySet()) - valuesMask.Set(TYPEID_ITEM); - - if (requestedAzeriteEmpoweredItemMask.IsAnySet()) - valuesMask.Set(TYPEID_AZERITE_EMPOWERED_ITEM); - - ByteBuffer& buffer = PrepareValuesUpdateBuffer(data); - std::size_t sizePos = buffer.wpos(); - buffer << uint32(0); - buffer << uint32(valuesMask.GetBlock(0)); - - if (valuesMask[TYPEID_OBJECT]) - m_objectData->WriteUpdate(buffer, requestedObjectMask, true, this, target); - - if (valuesMask[TYPEID_ITEM]) - m_itemData->WriteUpdate(buffer, itemMask, true, this, target); - - if (valuesMask[TYPEID_AZERITE_EMPOWERED_ITEM]) - m_azeriteEmpoweredItemData->WriteUpdate(buffer, requestedAzeriteEmpoweredItemMask, true, this, target); - - buffer.put<uint32>(sizePos, buffer.wpos() - sizePos - 4); - - data->AddUpdateBlock(); -} - -void AzeriteEmpoweredItem::ValuesUpdateForPlayerWithMaskSender::operator()(Player const* player) const -{ - UpdateData udata(player->GetMapId()); - WorldPacket packet; - - Owner->BuildValuesUpdateForPlayerWithMask(&udata, ObjectMask.GetChangesMask(), ItemMask.GetChangesMask(), AzeriteEmpoweredItemMask.GetChangesMask(), player); - - udata.BuildPacket(&packet); - player->SendDirectMessage(&packet); -} - -void AzeriteEmpoweredItem::ClearUpdateMask(bool remove) -{ - m_values.ClearChangesMask(&AzeriteEmpoweredItem::m_azeriteEmpoweredItemData); - Item::ClearUpdateMask(remove); -} - -void AzeriteEmpoweredItem::InitAzeritePowerData() -{ - m_azeritePowers = sDB2Manager.GetAzeritePowers(GetEntry()); - if (m_azeritePowers) - { - m_maxTier = (*std::max_element(m_azeritePowers->begin(), m_azeritePowers->end(), [](AzeritePowerSetMemberEntry const* a1, AzeritePowerSetMemberEntry const* a2) - { - return a1->Tier < a2->Tier; - }))->Tier; - } -} diff --git a/src/server/game/Entities/Item/AzeriteItem/AzeriteEmpoweredItem.h b/src/server/game/Entities/Item/AzeriteItem/AzeriteEmpoweredItem.h deleted file mode 100644 index 0fb82e6e09e..00000000000 --- a/src/server/game/Entities/Item/AzeriteItem/AzeriteEmpoweredItem.h +++ /dev/null @@ -1,74 +0,0 @@ -/* - * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef AzeriteEmpoweredItem_h__ -#define AzeriteEmpoweredItem_h__ - -#include "Item.h" - -class TC_GAME_API AzeriteEmpoweredItem final : public Item -{ -public: - AzeriteEmpoweredItem(); - - bool Create(ObjectGuid::LowType guidlow, uint32 itemId, ItemContext context, Player const* owner) override; - - void SaveToDB(CharacterDatabaseTransaction trans) override; - void LoadAzeriteEmpoweredItemData(Player const* owner, AzeriteEmpoweredItemData& azeriteEmpoweredItem); - static void DeleteFromDB(CharacterDatabaseTransaction trans, ObjectGuid::LowType itemGuid); - void DeleteFromDB(CharacterDatabaseTransaction trans) override; - - uint32 GetRequiredAzeriteLevelForTier(uint32 tier) const; - int32 GetTierForAzeritePower(Classes playerClass, int32 azeritePowerId) const; - int32 GetMaxAzeritePowerTier() const { return m_maxTier; } - - uint32 GetSelectedAzeritePower(int32 tier) const { return uint32(m_azeriteEmpoweredItemData->Selections[uint32(tier)]); } - void SetSelectedAzeritePower(int32 tier, int32 azeritePowerId); - void ClearSelectedAzeritePowers(); - - int64 GetRespecCost() const; - -protected: - void BuildValuesCreate(ByteBuffer* data, Player const* target) const override; - void BuildValuesUpdate(ByteBuffer* data, Player const* target) const override; - void ClearUpdateMask(bool remove) override; - -public: - void BuildValuesUpdateForPlayerWithMask(UpdateData* data, UF::ObjectData::Mask const& requestedObjectMask, UF::ItemData::Mask const& requestedItemMask, - UF::AzeriteEmpoweredItemData::Mask const& requestedAzeriteEmpoweredItemMask, Player const* target) const; - - struct ValuesUpdateForPlayerWithMaskSender // sender compatible with MessageDistDeliverer - { - explicit ValuesUpdateForPlayerWithMaskSender(AzeriteEmpoweredItem const* owner) : Owner(owner) { } - - AzeriteEmpoweredItem const* Owner; - UF::ObjectData::Base ObjectMask; - UF::ItemData::Base ItemMask; - UF::AzeriteEmpoweredItemData::Base AzeriteEmpoweredItemMask; - - void operator()(Player const* player) const; - }; - - UF::UpdateField<UF::AzeriteEmpoweredItemData, 0, TYPEID_AZERITE_EMPOWERED_ITEM> m_azeriteEmpoweredItemData; - -private: - void InitAzeritePowerData(); - std::vector<AzeritePowerSetMemberEntry const*> const* m_azeritePowers; - int32 m_maxTier; -}; - -#endif // AzeriteEmpoweredItem_h__ diff --git a/src/server/game/Entities/Item/AzeriteItem/AzeriteItem.cpp b/src/server/game/Entities/Item/AzeriteItem/AzeriteItem.cpp deleted file mode 100644 index 6f76852e93a..00000000000 --- a/src/server/game/Entities/Item/AzeriteItem/AzeriteItem.cpp +++ /dev/null @@ -1,523 +0,0 @@ -/* - * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#include "AzeriteItem.h" -#include "AzeritePackets.h" -#include "ConditionMgr.h" -#include "DB2Stores.h" -#include "DatabaseEnv.h" -#include "GameObject.h" -#include "GameTime.h" -#include "Player.h" -#include "UpdateData.h" -#include <boost/date_time/gregorian/gregorian_types.hpp> -#include <boost/date_time/posix_time/conversion.hpp> - -AzeriteItem::AzeriteItem() : Item() -{ - m_objectType |= TYPEMASK_AZERITE_ITEM; - m_objectTypeId = TYPEID_AZERITE_ITEM; - - SetUpdateFieldValue(m_values.ModifyValue(&AzeriteItem::m_azeriteItemData).ModifyValue(&UF::AzeriteItemData::DEBUGknowledgeWeek), -1); -} - -bool AzeriteItem::Create(ObjectGuid::LowType guidlow, uint32 itemId, ItemContext context, Player const* owner) -{ - if (!Item::Create(guidlow, itemId, context, owner)) - return false; - - SetUpdateFieldValue(m_values.ModifyValue(&AzeriteItem::m_azeriteItemData).ModifyValue(&UF::AzeriteItemData::Level), 1); - SetUpdateFieldValue(m_values.ModifyValue(&AzeriteItem::m_azeriteItemData).ModifyValue(&UF::AzeriteItemData::KnowledgeLevel), GetCurrentKnowledgeLevel()); - UnlockDefaultMilestones(); - return true; -} - -void AzeriteItem::SaveToDB(CharacterDatabaseTransaction trans) -{ - CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE_AZERITE); - stmt->setUInt64(0, GetGUID().GetCounter()); - trans->Append(stmt); - - stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE_AZERITE_MILESTONE_POWER); - stmt->setUInt64(0, GetGUID().GetCounter()); - trans->Append(stmt); - - stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE_AZERITE_UNLOCKED_ESSENCE); - stmt->setUInt64(0, GetGUID().GetCounter()); - trans->Append(stmt); - - switch (GetState()) - { - case ITEM_NEW: - case ITEM_CHANGED: - { - stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_ITEM_INSTANCE_AZERITE); - stmt->setUInt64(0, GetGUID().GetCounter()); - stmt->setUInt64(1, m_azeriteItemData->Xp); - stmt->setUInt32(2, m_azeriteItemData->Level); - stmt->setUInt32(3, m_azeriteItemData->KnowledgeLevel); - std::size_t specIndex = 0; - for (; specIndex < m_azeriteItemData->SelectedEssences.size(); ++specIndex) - { - stmt->setUInt32(4 + specIndex * 5, m_azeriteItemData->SelectedEssences[specIndex].SpecializationID); - for (std::size_t j = 0; j < MAX_AZERITE_ESSENCE_SLOT; ++j) - stmt->setUInt32(5 + specIndex * 5 + j, m_azeriteItemData->SelectedEssences[specIndex].AzeriteEssenceID[j]); - } - for (; specIndex < 4; ++specIndex) - { - stmt->setUInt32(4 + specIndex * 5, 0); - for (std::size_t j = 0; j < MAX_AZERITE_ESSENCE_SLOT; ++j) - stmt->setUInt32(5 + specIndex * 5 + j, 0); - } - - trans->Append(stmt); - - for (uint32 azeriteItemMilestonePowerId : m_azeriteItemData->UnlockedEssenceMilestones) - { - stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_ITEM_INSTANCE_AZERITE_MILESTONE_POWER); - stmt->setUInt64(0, GetGUID().GetCounter()); - stmt->setUInt32(1, azeriteItemMilestonePowerId); - trans->Append(stmt); - } - - for (UF::UnlockedAzeriteEssence const& azeriteEssence : m_azeriteItemData->UnlockedEssences) - { - stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_ITEM_INSTANCE_AZERITE_UNLOCKED_ESSENCE); - stmt->setUInt64(0, GetGUID().GetCounter()); - stmt->setUInt32(1, azeriteEssence.AzeriteEssenceID); - stmt->setUInt32(2, azeriteEssence.Rank); - trans->Append(stmt); - } - break; - } - case ITEM_REMOVED: - default: - break; - } - - Item::SaveToDB(trans); -} - -void AzeriteItem::LoadAzeriteItemData(Player const* owner, AzeriteItemData& azeriteItemData) -{ - bool needSave = false; - - if (!sAzeriteLevelInfoStore.LookupEntry(azeriteItemData.Level)) - { - azeriteItemData.Xp = 0; - azeriteItemData.Level = 1; - azeriteItemData.KnowledgeLevel = GetCurrentKnowledgeLevel(); - needSave = true; - } - else if (azeriteItemData.Level > MAX_AZERITE_ITEM_LEVEL) - { - azeriteItemData.Xp = 0; - azeriteItemData.Level = MAX_AZERITE_ITEM_LEVEL; - needSave = true; - } - - if (azeriteItemData.KnowledgeLevel != GetCurrentKnowledgeLevel()) - { - // rescale XP to maintain same progress % - uint64 oldMax = CalcTotalXPToNextLevel(azeriteItemData.Level, azeriteItemData.KnowledgeLevel); - azeriteItemData.KnowledgeLevel = GetCurrentKnowledgeLevel(); - uint64 newMax = CalcTotalXPToNextLevel(azeriteItemData.Level, azeriteItemData.KnowledgeLevel); - azeriteItemData.Xp = uint64(azeriteItemData.Xp / double(oldMax) * newMax); - needSave = true; - } - else if (azeriteItemData.KnowledgeLevel > MAX_AZERITE_ITEM_KNOWLEDGE_LEVEL) - { - azeriteItemData.KnowledgeLevel = MAX_AZERITE_ITEM_KNOWLEDGE_LEVEL; - needSave = true; - } - - SetUpdateFieldValue(m_values.ModifyValue(&AzeriteItem::m_azeriteItemData).ModifyValue(&UF::AzeriteItemData::Xp), azeriteItemData.Xp); - SetUpdateFieldValue(m_values.ModifyValue(&AzeriteItem::m_azeriteItemData).ModifyValue(&UF::AzeriteItemData::Level), azeriteItemData.Level); - SetUpdateFieldValue(m_values.ModifyValue(&AzeriteItem::m_azeriteItemData).ModifyValue(&UF::AzeriteItemData::KnowledgeLevel), azeriteItemData.KnowledgeLevel); - for (uint32 azeriteItemMilestonePowerId : azeriteItemData.AzeriteItemMilestonePowers) - AddUnlockedEssenceMilestone(azeriteItemMilestonePowerId); - - UnlockDefaultMilestones(); - - for (AzeriteEssencePowerEntry const* unlockedAzeriteEssence : azeriteItemData.UnlockedAzeriteEssences) - SetEssenceRank(unlockedAzeriteEssence->AzeriteEssenceID, unlockedAzeriteEssence->Tier); - - for (AzeriteItemSelectedEssencesData const& selectedEssenceData : azeriteItemData.SelectedAzeriteEssences) - { - if (!selectedEssenceData.SpecializationId) - continue; - - auto selectedEssences = AddDynamicUpdateFieldValue(m_values.ModifyValue(&AzeriteItem::m_azeriteItemData).ModifyValue(&UF::AzeriteItemData::SelectedEssences)); - selectedEssences.ModifyValue(&UF::SelectedAzeriteEssences::SpecializationID).SetValue(selectedEssenceData.SpecializationId); - for (uint32 i = 0; i < MAX_AZERITE_ESSENCE_SLOT; ++i) - { - // Check if essence was unlocked - if (!GetEssenceRank(selectedEssenceData.AzeriteEssenceId[i])) - continue; - - selectedEssences.ModifyValue(&UF::SelectedAzeriteEssences::AzeriteEssenceID, i).SetValue(selectedEssenceData.AzeriteEssenceId[i]); - } - - if (owner && owner->GetPrimarySpecialization() == ChrSpecialization(selectedEssenceData.SpecializationId)) - selectedEssences.ModifyValue(&UF::SelectedAzeriteEssences::Enabled).SetValue(true); - } - - // add selected essences for current spec - if (owner && !GetSelectedAzeriteEssences()) - CreateSelectedAzeriteEssences(AsUnderlyingType(owner->GetPrimarySpecialization())); - - if (needSave) - { - CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_ITEM_INSTANCE_AZERITE_ON_LOAD); - stmt->setUInt64(0, azeriteItemData.Xp); - stmt->setUInt32(1, azeriteItemData.KnowledgeLevel); - stmt->setUInt64(2, GetGUID().GetCounter()); - CharacterDatabase.Execute(stmt); - } -} - -void AzeriteItem::DeleteFromDB(CharacterDatabaseTransaction trans, ObjectGuid::LowType itemGuid) -{ - CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE_AZERITE); - stmt->setUInt64(0, itemGuid); - CharacterDatabase.ExecuteOrAppend(trans, stmt); - - stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE_AZERITE_MILESTONE_POWER); - stmt->setUInt64(0, itemGuid); - CharacterDatabase.ExecuteOrAppend(trans, stmt); - - stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE_AZERITE_UNLOCKED_ESSENCE); - stmt->setUInt64(0, itemGuid); - CharacterDatabase.ExecuteOrAppend(trans, stmt); -} - -void AzeriteItem::DeleteFromDB(CharacterDatabaseTransaction trans) -{ - AzeriteItem::DeleteFromDB(trans, GetGUID().GetCounter()); - Item::DeleteFromDB(trans); -} - -uint32 AzeriteItem::GetCurrentKnowledgeLevel() -{ - // count weeks from 14.01.2020 - boost::gregorian::date now = boost::posix_time::from_time_t(GameTime::GetGameTime()).date(); - boost::gregorian::week_iterator itr(boost::gregorian::date(2020, boost::date_time::Jan, 14)); - uint32 knowledge = 0; - while (*itr < now && knowledge < MAX_AZERITE_ITEM_KNOWLEDGE_LEVEL) - { - ++knowledge; - ++itr; - } - return knowledge; -} - -uint64 AzeriteItem::CalcTotalXPToNextLevel(uint32 level, uint32 knowledgeLevel) -{ - AzeriteLevelInfoEntry const* levelInfo = sAzeriteLevelInfoStore.AssertEntry(level); - uint64 totalXp = levelInfo->BaseExperienceToNextLevel * sAzeriteKnowledgeMultiplierStore.AssertEntry(knowledgeLevel)->Multiplier; - return std::max(totalXp, levelInfo->MinimumExperienceToNextLevel); -} - -void AzeriteItem::GiveXP(uint64 xp) -{ - Player* owner = GetOwner(); - uint32 level = m_azeriteItemData->Level; - if (level < MAX_AZERITE_ITEM_LEVEL) - { - uint64 currentXP = m_azeriteItemData->Xp; - uint64 remainingXP = xp; - do - { - uint64 totalXp = CalcTotalXPToNextLevel(level, m_azeriteItemData->KnowledgeLevel); - if (currentXP + remainingXP >= totalXp) - { - // advance to next level - ++level; - remainingXP -= totalXp - currentXP; - currentXP = 0; - } - else - { - currentXP += remainingXP; - remainingXP = 0; - } - } while (remainingXP > 0 && level < MAX_AZERITE_ITEM_LEVEL); - - SetUpdateFieldValue(m_values.ModifyValue(&AzeriteItem::m_azeriteItemData).ModifyValue(&UF::AzeriteItemData::Xp), currentXP); - - owner->UpdateCriteria(CriteriaType::EarnArtifactXPForAzeriteItem, xp); - - // changing azerite level changes item level, need to update stats - if (m_azeriteItemData->Level != level) - { - if (IsEquipped()) - owner->_ApplyItemBonuses(this, GetSlot(), false); - - SetUpdateFieldValue(m_values.ModifyValue(&AzeriteItem::m_azeriteItemData).ModifyValue(&UF::AzeriteItemData::Level), level); - UnlockDefaultMilestones(); - owner->UpdateCriteria(CriteriaType::AzeriteLevelReached, level); - - if (IsEquipped()) - owner->_ApplyItemBonuses(this, GetSlot(), true); - } - - SetState(ITEM_CHANGED, owner); - } - - WorldPackets::Azerite::PlayerAzeriteItemGains xpGain; - xpGain.ItemGUID = GetGUID(); - xpGain.XP = xp; - owner->SendDirectMessage(xpGain.Write()); -} - -GameObject const* AzeriteItem::FindHeartForge(Player const* owner) -{ - if (GameObject const* forge = owner->FindNearestGameObjectOfType(GAMEOBJECT_TYPE_ITEM_FORGE, 40.0f)) - if (forge->GetGOInfo()->itemForge.ForgeType == 2) - return forge; - - return nullptr; -} - -bool AzeriteItem::CanUseEssences() const -{ - if (PlayerConditionEntry const* condition = sPlayerConditionStore.LookupEntry(PLAYER_CONDITION_ID_UNLOCKED_AZERITE_ESSENCES)) - return ConditionMgr::IsPlayerMeetingCondition(GetOwner(), condition); - - return false; -} - -bool AzeriteItem::HasUnlockedEssenceSlot(uint8 slot) const -{ - AzeriteItemMilestonePowerEntry const* milestone = sDB2Manager.GetAzeriteItemMilestonePower(slot); - return m_azeriteItemData->UnlockedEssenceMilestones.FindIndex(milestone->ID) != -1; -} - -uint32 AzeriteItem::GetEssenceRank(uint32 azeriteEssenceId) const -{ - int32 index = m_azeriteItemData->UnlockedEssences.FindIndexIf([azeriteEssenceId](UF::UnlockedAzeriteEssence const& essence) - { - return essence.AzeriteEssenceID == azeriteEssenceId; - }); - - if (index < 0) - return 0; - - return m_azeriteItemData->UnlockedEssences[index].Rank; -} - -void AzeriteItem::SetEssenceRank(uint32 azeriteEssenceId, uint32 rank) -{ - int32 index = m_azeriteItemData->UnlockedEssences.FindIndexIf([azeriteEssenceId](UF::UnlockedAzeriteEssence const& essence) - { - return essence.AzeriteEssenceID == azeriteEssenceId; - }); - - if (!rank && index >= 0) - { - RemoveDynamicUpdateFieldValue(m_values.ModifyValue(&AzeriteItem::m_azeriteItemData).ModifyValue(&UF::AzeriteItemData::UnlockedEssences), index); - return; - } - - if (!sDB2Manager.GetAzeriteEssencePower(azeriteEssenceId, rank)) - return; - - if (index < 0) - { - UF::UnlockedAzeriteEssence& unlockedEssence = AddDynamicUpdateFieldValue(m_values.ModifyValue(&AzeriteItem::m_azeriteItemData) - .ModifyValue(&UF::AzeriteItemData::UnlockedEssences)); - unlockedEssence.AzeriteEssenceID = azeriteEssenceId; - unlockedEssence.Rank = rank; - } - else - SetUpdateFieldValue(m_values.ModifyValue(&AzeriteItem::m_azeriteItemData).ModifyValue(&UF::AzeriteItemData::UnlockedEssences, index) - .ModifyValue(&UF::UnlockedAzeriteEssence::Rank), rank); -} - -UF::SelectedAzeriteEssences const* AzeriteItem::GetSelectedAzeriteEssences() const -{ - for (UF::SelectedAzeriteEssences const& essences : m_azeriteItemData->SelectedEssences) - if (essences.Enabled) - return &essences; - - return nullptr; -} - -void AzeriteItem::SetSelectedAzeriteEssences(uint32 specializationId) -{ - int32 index = m_azeriteItemData->SelectedEssences.FindIndexIf([](UF::SelectedAzeriteEssences const& essences) { return essences.Enabled == 1; }); - if (index >= 0) - SetUpdateFieldValue(m_values.ModifyValue(&AzeriteItem::m_azeriteItemData).ModifyValue(&UF::AzeriteItemData::SelectedEssences, index) - .ModifyValue(&UF::SelectedAzeriteEssences::Enabled), false); - - index = m_azeriteItemData->SelectedEssences.FindIndexIf([specializationId](UF::SelectedAzeriteEssences const& essences) - { - return essences.SpecializationID == specializationId; - }); - - if (index >= 0) - SetUpdateFieldValue(m_values.ModifyValue(&AzeriteItem::m_azeriteItemData).ModifyValue(&UF::AzeriteItemData::SelectedEssences, index) - .ModifyValue(&UF::SelectedAzeriteEssences::Enabled), true); - else - CreateSelectedAzeriteEssences(specializationId); -} - -void AzeriteItem::CreateSelectedAzeriteEssences(uint32 specializationId) -{ - auto selectedEssences = AddDynamicUpdateFieldValue(m_values.ModifyValue(&AzeriteItem::m_azeriteItemData).ModifyValue(&UF::AzeriteItemData::SelectedEssences)); - selectedEssences.ModifyValue(&UF::SelectedAzeriteEssences::SpecializationID).SetValue(specializationId); - selectedEssences.ModifyValue(&UF::SelectedAzeriteEssences::Enabled).SetValue(true); -} - -void AzeriteItem::SetSelectedAzeriteEssence(uint8 slot, uint32 azeriteEssenceId) -{ - ASSERT(slot < MAX_AZERITE_ESSENCE_SLOT); - int32 index = m_azeriteItemData->SelectedEssences.FindIndexIf([](UF::SelectedAzeriteEssences const& essences) { return essences.Enabled == 1; }); - ASSERT(index >= 0); - SetUpdateFieldValue(m_values.ModifyValue(&AzeriteItem::m_azeriteItemData).ModifyValue(&UF::AzeriteItemData::SelectedEssences, index) - .ModifyValue(&UF::SelectedAzeriteEssences::AzeriteEssenceID, slot), azeriteEssenceId); -} - -void AzeriteItem::BuildValuesCreate(ByteBuffer* data, Player const* target) const -{ - UF::UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target); - std::size_t sizePos = data->wpos(); - *data << uint32(0); - *data << uint8(flags); - m_objectData->WriteCreate(*data, flags, this, target); - m_itemData->WriteCreate(*data, flags, this, target); - m_azeriteItemData->WriteCreate(*data, flags, this, target); - data->put<uint32>(sizePos, data->wpos() - sizePos - 4); -} - -void AzeriteItem::BuildValuesUpdate(ByteBuffer* data, Player const* target) const -{ - UF::UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target); - std::size_t sizePos = data->wpos(); - *data << uint32(0); - *data << uint32(m_values.GetChangedObjectTypeMask()); - - if (m_values.HasChanged(TYPEID_OBJECT)) - m_objectData->WriteUpdate(*data, flags, this, target); - - if (m_values.HasChanged(TYPEID_ITEM)) - m_itemData->WriteUpdate(*data, flags, this, target); - - if (m_values.HasChanged(TYPEID_AZERITE_ITEM)) - m_azeriteItemData->WriteUpdate(*data, flags, this, target); - - data->put<uint32>(sizePos, data->wpos() - sizePos - 4); -} - -void AzeriteItem::BuildValuesUpdateWithFlag(ByteBuffer* data, UF::UpdateFieldFlag flags, Player const* target) const -{ - UpdateMask<NUM_CLIENT_OBJECT_TYPES> valuesMask; - valuesMask.Set(TYPEID_ITEM); - valuesMask.Set(TYPEID_AZERITE_ITEM); - - std::size_t sizePos = data->wpos(); - *data << uint32(0); - *data << uint32(valuesMask.GetBlock(0)); - - UF::ItemData::Mask mask; - m_itemData->AppendAllowedFieldsMaskForFlag(mask, flags); - m_itemData->WriteUpdate(*data, mask, true, this, target); - - UF::AzeriteItemData::Mask mask2; - m_azeriteItemData->AppendAllowedFieldsMaskForFlag(mask2, flags); - m_azeriteItemData->WriteUpdate(*data, mask2, true, this, target); - - data->put<uint32>(sizePos, data->wpos() - sizePos - 4); -} - -void AzeriteItem::BuildValuesUpdateForPlayerWithMask(UpdateData* data, UF::ObjectData::Mask const& requestedObjectMask, - UF::ItemData::Mask const& requestedItemMask, UF::AzeriteItemData::Mask const& requestedAzeriteItemMask, Player const* target) const -{ - UF::UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target); - UpdateMask<NUM_CLIENT_OBJECT_TYPES> valuesMask; - if (requestedObjectMask.IsAnySet()) - valuesMask.Set(TYPEID_OBJECT); - - UF::ItemData::Mask itemMask = requestedItemMask; - m_itemData->FilterDisallowedFieldsMaskForFlag(itemMask, flags); - if (itemMask.IsAnySet()) - valuesMask.Set(TYPEID_ITEM); - - UF::AzeriteItemData::Mask azeriteItemMask = requestedAzeriteItemMask; - m_azeriteItemData->FilterDisallowedFieldsMaskForFlag(azeriteItemMask, flags); - if (azeriteItemMask.IsAnySet()) - valuesMask.Set(TYPEID_AZERITE_ITEM); - - ByteBuffer& buffer = PrepareValuesUpdateBuffer(data); - std::size_t sizePos = buffer.wpos(); - buffer << uint32(0); - buffer << uint32(valuesMask.GetBlock(0)); - - if (valuesMask[TYPEID_OBJECT]) - m_objectData->WriteUpdate(buffer, requestedObjectMask, true, this, target); - - if (valuesMask[TYPEID_ITEM]) - m_itemData->WriteUpdate(buffer, itemMask, true, this, target); - - if (valuesMask[TYPEID_AZERITE_ITEM]) - m_azeriteItemData->WriteUpdate(buffer, azeriteItemMask, true, this, target); - - buffer.put<uint32>(sizePos, buffer.wpos() - sizePos - 4); - - data->AddUpdateBlock(); -} - -void AzeriteItem::ValuesUpdateForPlayerWithMaskSender::operator()(Player const* player) const -{ - UpdateData udata(player->GetMapId()); - WorldPacket packet; - - Owner->BuildValuesUpdateForPlayerWithMask(&udata, ObjectMask.GetChangesMask(), ItemMask.GetChangesMask(), AzeriteItemMask.GetChangesMask(), player); - - udata.BuildPacket(&packet); - player->SendDirectMessage(&packet); -} - -void AzeriteItem::ClearUpdateMask(bool remove) -{ - m_values.ClearChangesMask(&AzeriteItem::m_azeriteItemData); - Item::ClearUpdateMask(remove); -} - -void AzeriteItem::UnlockDefaultMilestones() -{ - bool hasPreviousMilestone = true; - for (AzeriteItemMilestonePowerEntry const* milestone : sDB2Manager.GetAzeriteItemMilestonePowers()) - { - if (!hasPreviousMilestone) - break; - - if (milestone->RequiredLevel > int32(GetLevel())) - break; - - if (HasUnlockedEssenceMilestone(milestone->ID)) - continue; - - if (milestone->AutoUnlock) - { - AddUnlockedEssenceMilestone(milestone->ID); - hasPreviousMilestone = true; - } - else - hasPreviousMilestone = false; - } -} diff --git a/src/server/game/Entities/Item/AzeriteItem/AzeriteItem.h b/src/server/game/Entities/Item/AzeriteItem/AzeriteItem.h deleted file mode 100644 index b682452f1ac..00000000000 --- a/src/server/game/Entities/Item/AzeriteItem/AzeriteItem.h +++ /dev/null @@ -1,104 +0,0 @@ -/* - * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef AzeriteItem_h__ -#define AzeriteItem_h__ - -#include "Item.h" - -constexpr uint32 ITEM_ID_HEART_OF_AZEROTH = 158075; -constexpr uint32 MAX_AZERITE_ITEM_LEVEL = 129; -constexpr uint32 MAX_AZERITE_ITEM_KNOWLEDGE_LEVEL = 30; -constexpr uint32 PLAYER_CONDITION_ID_UNLOCKED_AZERITE_ESSENCES = 69048; -constexpr uint32 SPELL_ID_HEART_ESSENCE_ACTION_BAR_OVERRIDE = 298554; - -class TC_GAME_API AzeriteItem final : public Item -{ -public: - AzeriteItem(); - - bool Create(ObjectGuid::LowType guidlow, uint32 itemId, ItemContext context, Player const* owner) override; - - void SaveToDB(CharacterDatabaseTransaction trans) override; - void LoadAzeriteItemData(Player const* owner, AzeriteItemData& azeriteItem); - static void DeleteFromDB(CharacterDatabaseTransaction trans, ObjectGuid::LowType itemGuid); - void DeleteFromDB(CharacterDatabaseTransaction trans) override; - - uint32 GetLevel() const { return m_azeriteItemData->Level; } - uint32 GetEffectiveLevel() const - { - uint32 level = m_azeriteItemData->AuraLevel; - if (!level) - level = m_azeriteItemData->Level; - - return level; - } - - // Gaining artifact power - static uint32 GetCurrentKnowledgeLevel(); - static uint64 CalcTotalXPToNextLevel(uint32 level, uint32 knowledgeLevel); - void GiveXP(uint64 xp); - - // Essences - // C_AzeriteEssence.CanOpenUI - checks PlayerCondition 69048 - HasAura(261912) || RewardedQuest(57010) || IsOnQuest(57010) - static GameObject const* FindHeartForge(Player const* owner); - bool CanUseEssences() const; - bool HasUnlockedEssenceSlot(uint8 slot) const; - bool HasUnlockedEssenceMilestone(uint32 azeriteItemMilestonePowerId) const { return m_azeriteItemData->UnlockedEssenceMilestones.FindIndex(azeriteItemMilestonePowerId) != -1; } - void AddUnlockedEssenceMilestone(uint32 azeriteItemMilestonePowerId) - { - AddDynamicUpdateFieldValue(m_values.ModifyValue(&AzeriteItem::m_azeriteItemData) - .ModifyValue(&UF::AzeriteItemData::UnlockedEssenceMilestones)) = azeriteItemMilestonePowerId; - } - - uint32 GetEssenceRank(uint32 azeriteEssenceId) const; - void SetEssenceRank(uint32 azeriteEssenceId, uint32 rank); - - UF::SelectedAzeriteEssences const* GetSelectedAzeriteEssences() const; - void SetSelectedAzeriteEssences(uint32 specializationId); - void CreateSelectedAzeriteEssences(uint32 specializationId); - void SetSelectedAzeriteEssence(uint8 slot, uint32 azeriteEssenceId); - -protected: - void BuildValuesCreate(ByteBuffer* data, Player const* target) const override; - void BuildValuesUpdate(ByteBuffer* data, Player const* target) const override; - void ClearUpdateMask(bool remove) override; - -public: - void BuildValuesUpdateWithFlag(ByteBuffer* data, UF::UpdateFieldFlag flags, Player const* target) const override; - void BuildValuesUpdateForPlayerWithMask(UpdateData* data, UF::ObjectData::Mask const& requestedObjectMask, UF::ItemData::Mask const& requestedItemMask, - UF::AzeriteItemData::Mask const& requestedAzeriteItemMask, Player const* target) const; - - struct ValuesUpdateForPlayerWithMaskSender // sender compatible with MessageDistDeliverer - { - explicit ValuesUpdateForPlayerWithMaskSender(AzeriteItem const* owner) : Owner(owner) { } - - AzeriteItem const* Owner; - UF::ObjectData::Base ObjectMask; - UF::ItemData::Base ItemMask; - UF::AzeriteItemData::Base AzeriteItemMask; - - void operator()(Player const* player) const; - }; - - UF::UpdateField<UF::AzeriteItemData, 0, TYPEID_AZERITE_ITEM> m_azeriteItemData; - -private: - void UnlockDefaultMilestones(); -}; - -#endif // AzeriteItem_h__ diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp index af82859acf1..89b950bb54a 100644 --- a/src/server/game/Entities/Item/Item.cpp +++ b/src/server/game/Entities/Item/Item.cpp @@ -17,8 +17,6 @@ #include "Item.h" #include "ArtifactPackets.h" -#include "AzeriteEmpoweredItem.h" -#include "AzeriteItem.h" #include "Bag.h" #include "CollectionMgr.h" #include "Common.h" @@ -54,12 +52,6 @@ Item* NewItemOrBag(ItemTemplate const* proto) if (proto->GetInventoryType() == INVTYPE_BAG) return new Bag(); - if (sDB2Manager.IsAzeriteItem(proto->GetId())) - return new AzeriteItem(); - - if (sDB2Manager.GetAzeriteEmpoweredItem(proto->GetId())) - return new AzeriteEmpoweredItem(); - return new Item(); } @@ -89,7 +81,7 @@ void AddItemsSetItem(Player* player, Item const* item) { uint32 maxLevel = sDB2Manager.GetCurveXAxisRange(item->GetBonus()->PlayerLevelToItemLevelCurveId).second; - if (Optional<ContentTuningLevels> contentTuning = sDB2Manager.GetContentTuningData(item->GetBonus()->ContentTuningId, player->m_playerData->CtrOptions->ContentTuningConditionMask, true)) + if (Optional<ContentTuningLevels> contentTuning = sDB2Manager.GetContentTuningData(item->GetBonus()->ContentTuningId, 0 /*player->m_playerData->CtrOptions->ContentTuningConditionMask*/, true)) maxLevel = std::min<uint32>(maxLevel, contentTuning->MaxLevel); if (player->GetLevel() > maxLevel) @@ -308,9 +300,7 @@ ItemModifier const SecondaryAppearanceModifierSlotBySpec[MAX_SPECIALIZATIONS] = }; void ItemAdditionalLoadInfo::Init(std::unordered_map<ObjectGuid::LowType, ItemAdditionalLoadInfo>* loadInfo, - PreparedQueryResult artifactResult, PreparedQueryResult azeriteItemResult, - PreparedQueryResult azeriteItemMilestonePowersResult, PreparedQueryResult azeriteItemUnlockedEssencesResult, - PreparedQueryResult azeriteEmpoweredItemResult) + PreparedQueryResult artifactResult) { // 0 1 2 3 4 5 // SELECT a.itemGuid, a.xp, a.artifactAppearanceId, a.artifactTierId, ap.artifactPowerId, ap.purchasedRank FROM item_instance_artifact_powers ap LEFT JOIN item_instance_artifact a ON ap.itemGuid = a.itemGuid ... @@ -345,100 +335,6 @@ void ItemAdditionalLoadInfo::Init(std::unordered_map<ObjectGuid::LowType, ItemAd } while (artifactResult->NextRow()); } - - // 0 1 2 3 - // SELECT iz.itemGuid, iz.xp, iz.level, iz.knowledgeLevel, - // 4 5 6 7 8 - // iz.selectedAzeriteEssences1specId, iz.selectedAzeriteEssences1azeriteEssenceId1, iz.selectedAzeriteEssences1azeriteEssenceId2, iz.selectedAzeriteEssences1azeriteEssenceId3, iz.selectedAzeriteEssences1azeriteEssenceId4, - // 9 10 11 12 13 - // iz.selectedAzeriteEssences2specId, iz.selectedAzeriteEssences2azeriteEssenceId1, iz.selectedAzeriteEssences2azeriteEssenceId2, iz.selectedAzeriteEssences2azeriteEssenceId3, iz.selectedAzeriteEssences2azeriteEssenceId4, - // 14 15 16 17 18 - // iz.selectedAzeriteEssences3specId, iz.selectedAzeriteEssences3azeriteEssenceId1, iz.selectedAzeriteEssences3azeriteEssenceId2, iz.selectedAzeriteEssences3azeriteEssenceId3, iz.selectedAzeriteEssences3azeriteEssenceId4, - // 19 20 21 22 23 - // iz.selectedAzeriteEssences4specId, iz.selectedAzeriteEssences4azeriteEssenceId1, iz.selectedAzeriteEssences4azeriteEssenceId2, iz.selectedAzeriteEssences4azeriteEssenceId3, iz.selectedAzeriteEssences4azeriteEssenceId4 - // FROM item_instance_azerite iz INNER JOIN ... - if (azeriteItemResult) - { - do - { - Field* fields = azeriteItemResult->Fetch(); - ItemAdditionalLoadInfo& info = (*loadInfo)[fields[0].GetUInt64()]; - if (!info.AzeriteItem) - info.AzeriteItem.emplace(); - info.AzeriteItem->Xp = fields[1].GetUInt64(); - info.AzeriteItem->Level = fields[2].GetUInt32(); - info.AzeriteItem->KnowledgeLevel = fields[3].GetUInt32(); - for (std::size_t i = 0; i < info.AzeriteItem->SelectedAzeriteEssences.size(); ++i) - { - uint32 specializationId = fields[4 + i * 4].GetUInt32(); - if (!sChrSpecializationStore.LookupEntry(specializationId)) - continue; - - info.AzeriteItem->SelectedAzeriteEssences[i].SpecializationId = specializationId; - for (std::size_t j = 0; j < MAX_AZERITE_ESSENCE_SLOT; ++j) - { - AzeriteEssenceEntry const* azeriteEssence = sAzeriteEssenceStore.LookupEntry(fields[5 + i * 5 + j].GetUInt32()); - if (!azeriteEssence || !sDB2Manager.IsSpecSetMember(azeriteEssence->SpecSetID, specializationId)) - continue; - - info.AzeriteItem->SelectedAzeriteEssences[i].AzeriteEssenceId[j] = azeriteEssence->ID; - } - } - - } while (azeriteItemResult->NextRow()); - } - - // 0 1 - // SELECT iamp.itemGuid, iamp.azeriteItemMilestonePowerId FROM item_instance_azerite_milestone_power iamp INNER JOIN ... - if (azeriteItemMilestonePowersResult) - { - do - { - Field* fields = azeriteItemMilestonePowersResult->Fetch(); - ItemAdditionalLoadInfo& info = (*loadInfo)[fields[0].GetUInt64()]; - if (!info.AzeriteItem) - info.AzeriteItem.emplace(); - info.AzeriteItem->AzeriteItemMilestonePowers.push_back(fields[1].GetUInt32()); - } - while (azeriteItemMilestonePowersResult->NextRow()); - } - - // 0 1 2 - // SELECT iaue.itemGuid, iaue.azeriteEssenceId, iaue.`rank` FROM item_instance_azerite_unlocked_essence iaue INNER JOIN ... - if (azeriteItemUnlockedEssencesResult) - { - do - { - Field* fields = azeriteItemUnlockedEssencesResult->Fetch(); - if (AzeriteEssencePowerEntry const* azeriteEssencePower = sDB2Manager.GetAzeriteEssencePower(fields[1].GetUInt32(), fields[2].GetUInt32())) - { - ItemAdditionalLoadInfo& info = (*loadInfo)[fields[0].GetUInt64()]; - if (!info.AzeriteItem) - info.AzeriteItem.emplace(); - - info.AzeriteItem->UnlockedAzeriteEssences.push_back(azeriteEssencePower); - } - } - while (azeriteItemUnlockedEssencesResult->NextRow()); - } - - // 0 1 2 3 4 5 - // SELECT iae.itemGuid, iae.azeritePowerId1, iae.azeritePowerId2, iae.azeritePowerId3, iae.azeritePowerId4, iae.azeritePowerId5 FROM item_instance_azerite_empowered iae INNER JOIN ... - if (azeriteEmpoweredItemResult) - { - do - { - Field* fields = azeriteEmpoweredItemResult->Fetch(); - ItemAdditionalLoadInfo& info = (*loadInfo)[fields[0].GetUInt64()]; - if (!info.AzeriteEmpoweredItem) - info.AzeriteEmpoweredItem.emplace(); - - for (uint32 i = 0; i < MAX_AZERITE_EMPOWERED_TIER; ++i) - if (sAzeritePowerStore.LookupEntry(fields[1 + i].GetInt32())) - info.AzeriteEmpoweredItem->SelectedAzeritePowers[i] = fields[1 + i].GetInt32(); - - } while (azeriteEmpoweredItemResult->NextRow()); - } } Item::Item() @@ -1474,7 +1370,8 @@ void Item::ClearEnchantment(EnchantmentSlot slot) SetUpdateFieldValue(enchantmentField.ModifyValue(&UF::ItemEnchantment::ID), 0); SetUpdateFieldValue(enchantmentField.ModifyValue(&UF::ItemEnchantment::Duration), 0); SetUpdateFieldValue(enchantmentField.ModifyValue(&UF::ItemEnchantment::Charges), 0); - SetUpdateFieldValue(enchantmentField.ModifyValue(&UF::ItemEnchantment::Inactive), 0); + SetUpdateFieldValue(enchantmentField.ModifyValue(&UF::ItemEnchantment::Field_A), 0); + SetUpdateFieldValue(enchantmentField.ModifyValue(&UF::ItemEnchantment::Field_B), 0); SetState(ITEM_CHANGED, GetOwner()); } @@ -2283,23 +2180,17 @@ uint32 Item::GetItemLevel(Player const* owner) const uint32 minItemLevelCutoff = owner->m_unitData->MinItemLevelCutoff; uint32 maxItemLevel = itemTemplate->HasFlag(ITEM_FLAG3_IGNORE_ITEM_LEVEL_CAP_IN_PVP) ? 0 : owner->m_unitData->MaxItemLevel; bool pvpBonus = owner->IsUsingPvpItemLevels(); - uint32 azeriteLevel = 0; - if (AzeriteItem const* azeriteItem = ToAzeriteItem()) - azeriteLevel = azeriteItem->GetEffectiveLevel(); return Item::GetItemLevel(itemTemplate, _bonusData, owner->GetLevel(), GetModifier(ITEM_MODIFIER_TIMEWALKER_LEVEL), - minItemLevel, minItemLevelCutoff, maxItemLevel, pvpBonus, azeriteLevel); + minItemLevel, minItemLevelCutoff, maxItemLevel, pvpBonus); } uint32 Item::GetItemLevel(ItemTemplate const* itemTemplate, BonusData const& bonusData, uint32 level, uint32 fixedLevel, - uint32 minItemLevel, uint32 minItemLevelCutoff, uint32 maxItemLevel, bool pvpBonus, uint32 azeriteLevel) + uint32 minItemLevel, uint32 minItemLevelCutoff, uint32 maxItemLevel, bool pvpBonus) { if (!itemTemplate) return MIN_ITEM_LEVEL; uint32 itemLevel = itemTemplate->GetBaseItemLevel(); - if (AzeriteLevelInfoEntry const* azeriteLevelInfo = sAzeriteLevelInfoStore.LookupEntry(azeriteLevel)) - itemLevel = azeriteLevelInfo->ItemLevel; - if (bonusData.PlayerLevelToItemLevelCurveId) { if (fixedLevel) diff --git a/src/server/game/Entities/Item/Item.h b/src/server/game/Entities/Item/Item.h index ff873c859e0..984329e1e10 100644 --- a/src/server/game/Entities/Item/Item.h +++ b/src/server/game/Entities/Item/Item.h @@ -126,35 +126,11 @@ struct ArtifactData std::vector<ArtifactPowerData> ArtifactPowers; }; -struct AzeriteItemSelectedEssencesData -{ - uint32 SpecializationId = 0; - std::array<uint32, MAX_AZERITE_ESSENCE_SLOT> AzeriteEssenceId = { }; -}; - -struct AzeriteItemData -{ - uint64 Xp; - uint32 Level; - uint32 KnowledgeLevel; - std::vector<uint32> AzeriteItemMilestonePowers; - std::vector<AzeriteEssencePowerEntry const*> UnlockedAzeriteEssences; - std::array<AzeriteItemSelectedEssencesData, 4> SelectedAzeriteEssences = { }; -}; - -struct AzeriteEmpoweredItemData -{ - std::array<int32, MAX_AZERITE_EMPOWERED_TIER> SelectedAzeritePowers; -}; - struct ItemAdditionalLoadInfo { - static void Init(std::unordered_map<ObjectGuid::LowType, ItemAdditionalLoadInfo>* loadInfo, PreparedQueryResult artifactResult, PreparedQueryResult azeriteItemResult, - PreparedQueryResult azeriteItemMilestonePowersResult, PreparedQueryResult azeriteItemUnlockedEssencesResult, PreparedQueryResult azeriteEmpoweredItemResult); + static void Init(std::unordered_map<ObjectGuid::LowType, ItemAdditionalLoadInfo>* loadInfo, PreparedQueryResult artifactResult); Optional<ArtifactData> Artifact; - Optional<AzeriteItemData> AzeriteItem; - Optional<AzeriteEmpoweredItemData> AzeriteEmpoweredItem; }; struct ItemDynamicFieldGems @@ -240,10 +216,6 @@ class TC_GAME_API Item : public Object Bag* ToBag() { if (IsBag()) return reinterpret_cast<Bag*>(this); else return nullptr; } Bag const* ToBag() const { if (IsBag()) return reinterpret_cast<Bag const*>(this); else return nullptr; } - AzeriteItem* ToAzeriteItem() { return IsAzeriteItem() ? reinterpret_cast<AzeriteItem*>(this) : nullptr; } - AzeriteItem const* ToAzeriteItem() const { return IsAzeriteItem() ? reinterpret_cast<AzeriteItem const*>(this) : nullptr; } - AzeriteEmpoweredItem* ToAzeriteEmpoweredItem() { return IsAzeriteEmpoweredItem() ? reinterpret_cast<AzeriteEmpoweredItem*>(this) : nullptr; } - AzeriteEmpoweredItem const* ToAzeriteEmpoweredItem() const { return IsAzeriteEmpoweredItem() ? reinterpret_cast<AzeriteEmpoweredItem const*>(this) : nullptr; } bool IsRefundable() const { return HasItemFlag(ITEM_FIELD_FLAG_REFUNDABLE); } bool IsBOPTradeable() const { return HasItemFlag(ITEM_FIELD_FLAG_BOP_TRADEABLE); } @@ -337,7 +309,7 @@ class TC_GAME_API Item : public Object uint32 GetQuality() const { return _bonusData.Quality; } uint32 GetItemLevel(Player const* owner) const; static uint32 GetItemLevel(ItemTemplate const* itemTemplate, BonusData const& bonusData, uint32 level, uint32 fixedLevel, - uint32 minItemLevel, uint32 minItemLevelCutoff, uint32 maxItemLevel, bool pvpBonus, uint32 azeriteLevel); + uint32 minItemLevel, uint32 minItemLevelCutoff, uint32 maxItemLevel, bool pvpBonus); int32 GetRequiredLevel() const; int32 GetItemStatType(uint32 index) const { ASSERT(index < MAX_ITEM_PROTO_STATS); return _bonusData.ItemStatType[index]; } float GetItemStatValue(uint32 index, Player const* owner) const; diff --git a/src/server/game/Entities/Item/ItemBonusMgr.cpp b/src/server/game/Entities/Item/ItemBonusMgr.cpp index 7315bc8ea8a..1a840d8cda3 100644 --- a/src/server/game/Entities/Item/ItemBonusMgr.cpp +++ b/src/server/game/Entities/Item/ItemBonusMgr.cpp @@ -78,7 +78,7 @@ ItemContext GetContextForPlayer(MapDifficultyEntry const* mapDifficulty, Player if (mapDifficulty->ItemContextPickerID) { - uint32 contentTuningId = sDB2Manager.GetRedirectedContentTuningId(mapDifficulty->ContentTuningID, player->m_playerData->CtrOptions->ContentTuningConditionMask); + uint32 contentTuningId = sDB2Manager.GetRedirectedContentTuningId(mapDifficulty->ContentTuningID, 0 /*player->m_playerData->CtrOptions->ContentTuningConditionMask*/); ItemContextPickerEntryEntry const* selectedPickerEntry = nullptr; for (ItemContextPickerEntryEntry const* itemContextPickerEntry : sItemContextPickerEntryStore) diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index 350756f3313..8e31a00d45f 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -727,9 +727,11 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags, Playe bool HasSceneInstanceIDs = !player->GetSceneMgr().GetSceneTemplateByInstanceMap().empty(); bool HasRuneState = ToUnit()->GetPowerIndex(POWER_RUNES) != MAX_POWERS; + bool HasActionButtons = true; data->WriteBit(HasSceneInstanceIDs); data->WriteBit(HasRuneState); + data->WriteBit(HasActionButtons); data->FlushBits(); if (HasSceneInstanceIDs) { @@ -748,6 +750,18 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags, Playe for (uint32 i = 0; i < maxRunes; ++i) *data << uint8((baseCd - float(player->GetRuneCooldown(i))) / baseCd * 255); } + if (HasActionButtons) + { + ActionButtonList const& actionButtonList = player->GetActionButtons(); + for (uint8 i = 0; i < MAX_ACTION_BUTTONS; ++i) + { + auto const& itr = actionButtonList.find(i); + if (itr != actionButtonList.end() && itr->second.uState != ACTIONBUTTON_DELETED) + *data << uint32(itr->second.GetAction()); + else + *data << uint32(0); + } + } } if (flags.Conversation) diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.cpp b/src/server/game/Entities/Object/Updates/UpdateFields.cpp index 2e012897754..195a6019d1b 100644 --- a/src/server/game/Entities/Object/Updates/UpdateFields.cpp +++ b/src/server/game/Entities/Object/Updates/UpdateFields.cpp @@ -82,7 +82,8 @@ void ItemEnchantment::WriteCreate(ByteBuffer& data, Item const* owner, Player co data << int32(ID); data << uint32(Duration); data << int16(Charges); - data << uint16(Inactive); + data << uint8(Field_A); + data << uint8(Field_B); } void ItemEnchantment::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Item const* owner, Player const* receiver) const @@ -91,7 +92,7 @@ void ItemEnchantment::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Item if (ignoreChangesMask) changesMask.SetAll(); - data.WriteBits(changesMask.GetBlock(0), 5); + data.WriteBits(changesMask.GetBlock(0), 6); data.FlushBits(); if (changesMask[0]) @@ -110,7 +111,11 @@ void ItemEnchantment::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Item } if (changesMask[4]) { - data << uint16(Inactive); + data << uint8(Field_A); + } + if (changesMask[5]) + { + data << uint8(Field_B); } } } @@ -120,7 +125,8 @@ void ItemEnchantment::ClearChangesMask() Base::ClearChangesMask(ID); Base::ClearChangesMask(Duration); Base::ClearChangesMask(Charges); - Base::ClearChangesMask(Inactive); + Base::ClearChangesMask(Field_A); + Base::ClearChangesMask(Field_B); _changesMask.ResetAll(); } @@ -280,6 +286,8 @@ void ItemData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi { Enchantment[i].WriteCreate(data, owner, receiver); } + data << int32(PropertySeed); + data << int32(RandomPropertiesID); if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner)) { data << uint32(Durability); @@ -317,7 +325,7 @@ void ItemData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi void ItemData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Item const* owner, Player const* receiver) const { - Mask allowedMaskForTarget({ 0xF80A727Fu, 0x000001FFu }); + Mask allowedMaskForTarget({ 0xE029CE7Fu, 0x000007FFu }); AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags); WriteUpdate(data, _changesMask & allowedMaskForTarget, false, owner, receiver); } @@ -325,12 +333,12 @@ void ItemData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi void ItemData::AppendAllowedFieldsMaskForFlag(Mask& allowedMaskForTarget, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) { if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner)) - allowedMaskForTarget |= { 0x07F58D80u, 0x00000000u }; + allowedMaskForTarget |= { 0x1FD63180u, 0x00000000u }; } void ItemData::FilterDisallowedFieldsMaskForFlag(Mask& changesMask, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) { - Mask allowedMaskForTarget({ 0xF80A727Fu, 0x000001FFu }); + Mask allowedMaskForTarget({ 0xE029CE7Fu, 0x000007FFu }); AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags); changesMask &= allowedMaskForTarget; } @@ -412,64 +420,72 @@ void ItemData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignor } if (changesMask[10]) { - data << uint32(Durability); + data << int32(PropertySeed); } if (changesMask[11]) { - data << uint32(MaxDurability); + data << int32(RandomPropertiesID); } if (changesMask[12]) { - data << uint32(CreatePlayedTime); + data << uint32(Durability); } if (changesMask[13]) { - data << int32(Context); + data << uint32(MaxDurability); } if (changesMask[14]) { - data << int64(CreateTime); + data << uint32(CreatePlayedTime); } if (changesMask[15]) { - data << uint64(ArtifactXP); + data << int32(Context); } if (changesMask[16]) { - data << uint8(ItemAppearanceModID); + data << int64(CreateTime); + } + if (changesMask[17]) + { + data << uint64(ArtifactXP); } if (changesMask[18]) { + data << uint8(ItemAppearanceModID); + } + if (changesMask[20]) + { data << uint32(DynamicFlags2); } - if (changesMask[19]) + if (changesMask[21]) { data << ItemBonusKey; } - if (changesMask[20]) + if (changesMask[22]) { data << uint16(DEBUGItemLevel); } - if (changesMask[17]) + if (changesMask[19]) { Modifiers->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } - if (changesMask[21]) + if (changesMask[23]) { for (uint32 i = 0; i < 5; ++i) { - if (changesMask[22 + i]) + if (changesMask[24 + i]) { data << int32(SpellCharges[i]); } } } - if (changesMask[27]) + if (changesMask[29]) { for (uint32 i = 0; i < 13; ++i) { - if (changesMask[28 + i]) + if (changesMask[30 + i]) { Enchantment[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } @@ -488,6 +504,8 @@ void ItemData::ClearChangesMask() Base::ClearChangesMask(StackCount); Base::ClearChangesMask(Expiration); Base::ClearChangesMask(DynamicFlags); + Base::ClearChangesMask(PropertySeed); + Base::ClearChangesMask(RandomPropertiesID); Base::ClearChangesMask(Durability); Base::ClearChangesMask(MaxDurability); Base::ClearChangesMask(CreatePlayedTime); @@ -552,315 +570,27 @@ void ContainerData::ClearChangesMask() _changesMask.ResetAll(); } -void AzeriteEmpoweredItemData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, AzeriteEmpoweredItem const* owner, Player const* receiver) const -{ - for (uint32 i = 0; i < 5; ++i) - { - data << int32(Selections[i]); - } -} - -void AzeriteEmpoweredItemData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, AzeriteEmpoweredItem const* owner, Player const* receiver) const -{ - WriteUpdate(data, _changesMask, false, owner, receiver); -} - -void AzeriteEmpoweredItemData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignoreNestedChangesMask, AzeriteEmpoweredItem const* owner, Player const* receiver) const -{ - data.WriteBits(changesMask.GetBlocksMask(0), 1); - if (changesMask.GetBlock(0)) - data.WriteBits(changesMask.GetBlock(0), 32); - - data.FlushBits(); - if (changesMask[0]) - { - for (uint32 i = 0; i < 5; ++i) - { - if (changesMask[1 + i]) - { - data << int32(Selections[i]); - } - } - } -} - -void AzeriteEmpoweredItemData::ClearChangesMask() -{ - Base::ClearChangesMask(Selections); - _changesMask.ResetAll(); -} - -void UnlockedAzeriteEssence::WriteCreate(ByteBuffer& data, AzeriteItem const* owner, Player const* receiver) const -{ - data << uint32(AzeriteEssenceID); - data << uint32(Rank); -} - -void UnlockedAzeriteEssence::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, AzeriteItem const* owner, Player const* receiver) const -{ - data << uint32(AzeriteEssenceID); - data << uint32(Rank); -} - -bool UnlockedAzeriteEssence::operator==(UnlockedAzeriteEssence const& right) const -{ - return AzeriteEssenceID == right.AzeriteEssenceID - && Rank == right.Rank; -} - -void SelectedAzeriteEssences::WriteCreate(ByteBuffer& data, AzeriteItem const* owner, Player const* receiver) const -{ - for (uint32 i = 0; i < 4; ++i) - { - data << uint32(AzeriteEssenceID[i]); - } - data << uint32(SpecializationID); - data.WriteBit(Enabled); - data.FlushBits(); -} - -void SelectedAzeriteEssences::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, AzeriteItem const* owner, Player const* receiver) const -{ - Mask changesMask = _changesMask; - if (ignoreChangesMask) - changesMask.SetAll(); - - data.WriteBits(changesMask.GetBlocksMask(0), 1); - if (changesMask.GetBlock(0)) - data.WriteBits(changesMask.GetBlock(0), 32); - - if (changesMask[0]) - { - if (changesMask[1]) - { - data.WriteBit(Enabled); - } - } - data.FlushBits(); - if (changesMask[0]) - { - if (changesMask[2]) - { - data << uint32(SpecializationID); - } - } - if (changesMask[3]) - { - for (uint32 i = 0; i < 4; ++i) - { - if (changesMask[4 + i]) - { - data << uint32(AzeriteEssenceID[i]); - } - } - } - data.FlushBits(); -} - -void SelectedAzeriteEssences::ClearChangesMask() -{ - Base::ClearChangesMask(Enabled); - Base::ClearChangesMask(SpecializationID); - Base::ClearChangesMask(AzeriteEssenceID); - _changesMask.ResetAll(); -} - -void AzeriteItemData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, AzeriteItem const* owner, Player const* receiver) const -{ - if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner)) - { - data << uint64(Xp); - data << uint32(Level); - data << uint32(AuraLevel); - data << uint32(KnowledgeLevel); - data << int32(DEBUGknowledgeWeek); - } - data << uint32(UnlockedEssences.size()); - data << uint32(SelectedEssences.size()); - data << uint32(UnlockedEssenceMilestones.size()); - for (uint32 i = 0; i < UnlockedEssences.size(); ++i) - { - UnlockedEssences[i].WriteCreate(data, owner, receiver); - } - for (uint32 i = 0; i < UnlockedEssenceMilestones.size(); ++i) - { - data << uint32(UnlockedEssenceMilestones[i]); - } - if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner)) - { - data.WriteBit(Enabled); - } - for (uint32 i = 0; i < SelectedEssences.size(); ++i) - { - SelectedEssences[i].WriteCreate(data, owner, receiver); - } - data.FlushBits(); -} - -void AzeriteItemData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, AzeriteItem const* owner, Player const* receiver) const -{ - Mask allowedMaskForTarget({ 0x0000001Du }); - AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags); - WriteUpdate(data, _changesMask & allowedMaskForTarget, false, owner, receiver); -} - -void AzeriteItemData::AppendAllowedFieldsMaskForFlag(Mask& allowedMaskForTarget, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) -{ - if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner)) - allowedMaskForTarget |= { 0x000003E2u }; -} - -void AzeriteItemData::FilterDisallowedFieldsMaskForFlag(Mask& changesMask, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) -{ - Mask allowedMaskForTarget({ 0x0000001Du }); - AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags); - changesMask &= allowedMaskForTarget; -} - -void AzeriteItemData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignoreNestedChangesMask, AzeriteItem const* owner, Player const* receiver) const -{ - data.WriteBits(changesMask.GetBlock(0), 10); - - if (changesMask[0]) - { - if (changesMask[1]) - { - data.WriteBit(Enabled); - } - if (changesMask[2]) - { - if (!ignoreNestedChangesMask) - UnlockedEssences.WriteUpdateMask(data); - else - WriteCompleteDynamicFieldUpdateMask(UnlockedEssences.size(), data); - } - if (changesMask[3]) - { - if (!ignoreNestedChangesMask) - SelectedEssences.WriteUpdateMask(data); - else - WriteCompleteDynamicFieldUpdateMask(SelectedEssences.size(), data); - } - if (changesMask[4]) - { - if (!ignoreNestedChangesMask) - UnlockedEssenceMilestones.WriteUpdateMask(data); - else - WriteCompleteDynamicFieldUpdateMask(UnlockedEssenceMilestones.size(), data); - } - } - data.FlushBits(); - if (changesMask[0]) - { - if (changesMask[2]) - { - for (uint32 i = 0; i < UnlockedEssences.size(); ++i) - { - if (UnlockedEssences.HasChanged(i) || ignoreNestedChangesMask) - { - UnlockedEssences[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); - } - } - } - if (changesMask[4]) - { - for (uint32 i = 0; i < UnlockedEssenceMilestones.size(); ++i) - { - if (UnlockedEssenceMilestones.HasChanged(i) || ignoreNestedChangesMask) - { - data << uint32(UnlockedEssenceMilestones[i]); - } - } - } - if (changesMask[3]) - { - for (uint32 i = 0; i < SelectedEssences.size(); ++i) - { - if (SelectedEssences.HasChanged(i) || ignoreNestedChangesMask) - { - SelectedEssences[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); - } - } - } - if (changesMask[5]) - { - data << uint64(Xp); - } - if (changesMask[6]) - { - data << uint32(Level); - } - if (changesMask[7]) - { - data << uint32(AuraLevel); - } - if (changesMask[8]) - { - data << uint32(KnowledgeLevel); - } - if (changesMask[9]) - { - data << int32(DEBUGknowledgeWeek); - } - } - data.FlushBits(); -} - -void AzeriteItemData::ClearChangesMask() -{ - Base::ClearChangesMask(Enabled); - Base::ClearChangesMask(UnlockedEssences); - Base::ClearChangesMask(UnlockedEssenceMilestones); - Base::ClearChangesMask(SelectedEssences); - Base::ClearChangesMask(Xp); - Base::ClearChangesMask(Level); - Base::ClearChangesMask(AuraLevel); - Base::ClearChangesMask(KnowledgeLevel); - Base::ClearChangesMask(DEBUGknowledgeWeek); - _changesMask.ResetAll(); -} - -void SpellCastVisual::WriteCreate(ByteBuffer& data, Object const* owner, Player const* receiver) const -{ - data << int32(SpellXSpellVisualID); - data << int32(ScriptVisualID); -} - -void SpellCastVisual::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Object const* owner, Player const* receiver) const -{ - data << int32(SpellXSpellVisualID); - data << int32(ScriptVisualID); -} - -bool SpellCastVisual::operator==(SpellCastVisual const& right) const -{ - return SpellXSpellVisualID == right.SpellXSpellVisualID - && ScriptVisualID == right.ScriptVisualID; -} - void UnitChannel::WriteCreate(ByteBuffer& data, Unit const* owner, Player const* receiver) const { data << int32(SpellID); - SpellVisual.WriteCreate(data, owner, receiver); + data << int32(SpellXSpellVisualID); } void UnitChannel::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Unit const* owner, Player const* receiver) const { data << int32(SpellID); - SpellVisual.WriteUpdate(data, ignoreChangesMask, owner, receiver); + data << int32(SpellXSpellVisualID); } bool UnitChannel::operator==(UnitChannel const& right) const { return SpellID == right.SpellID - && SpellVisual == right.SpellVisual; + && SpellXSpellVisualID == right.SpellXSpellVisualID; } void VisibleItem::WriteCreate(ByteBuffer& data, Unit const* owner, Player const* receiver) const { data << int32(ItemID); - data << int32(SecondaryItemModifiedAppearanceID); - data << int32(ConditionalItemAppearanceID); data << uint16(ItemAppearanceModID); data << uint16(ItemVisual); } @@ -871,7 +601,7 @@ void VisibleItem::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Unit con if (ignoreChangesMask) changesMask.SetAll(); - data.WriteBits(changesMask.GetBlock(0), 6); + data.WriteBits(changesMask.GetBlock(0), 4); data.FlushBits(); if (changesMask[0]) @@ -882,17 +612,9 @@ void VisibleItem::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Unit con } if (changesMask[2]) { - data << int32(SecondaryItemModifiedAppearanceID); - } - if (changesMask[3]) - { - data << int32(ConditionalItemAppearanceID); - } - if (changesMask[4]) - { data << uint16(ItemAppearanceModID); } - if (changesMask[5]) + if (changesMask[3]) { data << uint16(ItemVisual); } @@ -902,8 +624,6 @@ void VisibleItem::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Unit con void VisibleItem::ClearChangesMask() { Base::ClearChangesMask(ItemID); - Base::ClearChangesMask(SecondaryItemModifiedAppearanceID); - Base::ClearChangesMask(ConditionalItemAppearanceID); Base::ClearChangesMask(ItemAppearanceModID); Base::ClearChangesMask(ItemVisual); _changesMask.ResetAll(); @@ -929,6 +649,8 @@ bool PassiveSpellHistory::operator==(PassiveSpellHistory const& right) const void UnitData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Unit const* owner, Player const* receiver) const { + data << int64(Health); + data << int64(MaxHealth); data << int32(ViewerDependentValue<DisplayIDTag>::GetValue(this, owner, receiver)); for (uint32 i = 0; i < 2; ++i) { @@ -938,8 +660,6 @@ void UnitData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi data << uint32(StateAnimID); data << uint32(StateAnimKitID); data << uint32(StateWorldEffectIDs->size()); - data << uint32(StateWorldEffectsQuestObjectiveID); - data << int32(SpellOverrideNameID); for (uint32 i = 0; i < StateWorldEffectIDs->size(); ++i) { data << uint32((*StateWorldEffectIDs)[i]); @@ -959,7 +679,6 @@ void UnitData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi data << BattlePetCompanionGUID; data << uint64(BattlePetDBID); ChannelData->WriteCreate(data, owner, receiver); - data << int8(SpellEmpowerStage); data << uint32(SummonedByHomeRealm); data << uint8(Race); data << uint8(ClassId); @@ -967,12 +686,6 @@ void UnitData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi data << uint8(Sex); data << uint8(DisplayPower); data << uint32(OverrideDisplayPowerID); - data << int64(Health); - for (uint32 i = 0; i < 10; ++i) - { - data << int32(Power[i]); - data << int32(MaxPower[i]); - } if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner | UpdateFieldFlag::UnitAll)) { for (uint32 i = 0; i < 10; ++i) @@ -981,7 +694,12 @@ void UnitData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi data << float(PowerRegenInterruptedFlatModifier[i]); } } - data << int64(MaxHealth); + for (uint32 i = 0; i < 10; ++i) + { + data << int32(Power[i]); + data << int32(MaxPower[i]); + data << float(ModPowerRegen[i]); + } data << int32(Level); data << int32(EffectiveLevel); data << int32(ContentTuningID); @@ -1011,12 +729,9 @@ void UnitData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi data << float(BoundingRadius); data << float(CombatReach); data << float(DisplayScale); - data << int32(CreatureFamily); - data << int32(CreatureType); data << int32(NativeDisplayID); data << float(NativeXDisplayScale); data << int32(MountDisplayID); - data << int32(CosmeticMountDisplayID); if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner | UpdateFieldFlag::Empath)) { data << float(MinDamage); @@ -1033,7 +748,6 @@ void UnitData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi data << uint32(PetExperience); data << uint32(PetNextLevelExperience); data << float(ModCastingSpeed); - data << float(ModCastingSpeedNeg); data << float(ModSpellHaste); data << float(ModHaste); data << float(ModRangedHaste); @@ -1041,14 +755,15 @@ void UnitData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi data << float(ModTimeRate); data << int32(CreatedBySpell); data << int32(EmoteState); + data << int16(TrainingPointsUsed); + data << int16(TrainingPointsTotal); if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner)) { - for (uint32 i = 0; i < 4; ++i) + for (uint32 i = 0; i < 5; ++i) { data << int32(Stats[i]); data << int32(StatPosBuff[i]); data << int32(StatNegBuff[i]); - data << int32(StatSupportBuff[i]); } } if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner | UpdateFieldFlag::Empath)) @@ -1062,10 +777,15 @@ void UnitData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi { for (uint32 i = 0; i < 7; ++i) { - data << int32(BonusResistanceMods[i]); - data << int32(ManaCostModifier[i]); + data << int32(PowerCostModifier[i]); + data << float(PowerCostMultiplier[i]); } } + for (uint32 i = 0; i < 7; ++i) + { + data << int32(ResistanceBuffModsPositive[i]); + data << int32(ResistanceBuffModsNegative[i]); + } data << int32(BaseMana); if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner)) { @@ -1081,29 +801,21 @@ void UnitData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi data << int32(AttackPowerModPos); data << int32(AttackPowerModNeg); data << float(AttackPowerMultiplier); - data << int32(AttackPowerModSupport); data << int32(RangedAttackPower); data << int32(RangedAttackPowerModPos); data << int32(RangedAttackPowerModNeg); data << float(RangedAttackPowerMultiplier); - data << int32(RangedAttackPowerModSupport); - data << int32(MainHandWeaponAttackPower); - data << int32(OffHandWeaponAttackPower); - data << int32(RangedWeaponAttackPower); data << int32(SetAttackSpeedAura); data << float(Lifesteal); data << float(MinRangedDamage); data << float(MaxRangedDamage); - data << float(ManaCostMultiplier); data << float(MaxHealthModifier); } data << float(HoverHeight); data << int32(MinItemLevelCutoff); data << int32(MinItemLevel); data << int32(MaxItemLevel); - data << int32(AzeriteItemLevel); data << int32(WildBattlePetLevel); - data << int32(BattlePetCompanionExperience); data << uint32(BattlePetCompanionNameTimestamp); data << int32(ViewerDependentValue<InteractSpellIDTag>::GetValue(this, owner, receiver)); data << int32(ScaleDuration); @@ -1111,16 +823,18 @@ void UnitData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi data << int32(LooksLikeCreatureID); data << int32(LookAtControllerID); data << int32(PerksVendorItemID); - data << int32(TaxiNodesID); data << GuildGUID; data << uint32(PassiveSpells.size()); data << uint32(WorldEffects.size()); data << uint32(ChannelObjects.size()); + data << SkinningOwnerGUID; data << int32(FlightCapabilityID); data << float(GlideEventSpeedDivisor); - data << uint32(SilencedSchoolMask); data << uint32(CurrentAreaID); - data << NameplateAttachToGUID; + if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner)) + { + data << ComboTarget; + } for (uint32 i = 0; i < PassiveSpells.size(); ++i) { PassiveSpells[i].WriteCreate(data, owner, receiver); @@ -1137,7 +851,7 @@ void UnitData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi void UnitData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Unit const* owner, Player const* receiver) const { - Mask allowedMaskForTarget({ 0xFFFFDFFFu, 0xC3FEFFFFu, 0x003DFFFFu, 0xFFFFFC01u, 0x007FFFFFu, 0x0003F800u, 0x00000000u }); + Mask allowedMaskForTarget({ 0xFFFFDFFFu, 0xFF0FDFFFu, 0xC001EFFFu, 0x001EFFFFu, 0xFFFFFE00u, 0x00003FFFu, 0xFFF00000u, 0x00000007u }); AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags); WriteUpdate(data, _changesMask & allowedMaskForTarget, false, owner, receiver); } @@ -1145,24 +859,24 @@ void UnitData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi void UnitData::AppendAllowedFieldsMaskForFlag(Mask& allowedMaskForTarget, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) { if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner)) - allowedMaskForTarget |= { 0x00002000u, 0x3C010000u, 0xFFC20000u, 0x000003FEu, 0xFF800004u, 0xFFFC07FFu, 0x01FFFFFFu }; + allowedMaskForTarget |= { 0x00002000u, 0x00F02000u, 0x3FFE1000u, 0xFFF10000u, 0x000001FFu, 0xFFFFC000u, 0x000FFFFFu, 0x00000000u }; if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::UnitAll)) - allowedMaskForTarget |= { 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0xFF800004u, 0x000007FFu, 0x00000000u }; + allowedMaskForTarget |= { 0x00000000u, 0x00000000u, 0x00000000u, 0xFFF00000u, 0x000001FFu, 0x00000000u, 0x00000000u, 0x00000000u }; if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Empath)) - allowedMaskForTarget |= { 0x00000000u, 0x3C000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x000007F8u }; + allowedMaskForTarget |= { 0x00000000u, 0x00F00000u, 0x00000000u, 0x00000000u, 0x00000000u, 0xC0000000u, 0x0000003Fu, 0x00000000u }; } void UnitData::FilterDisallowedFieldsMaskForFlag(Mask& changesMask, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) { - Mask allowedMaskForTarget({ 0xFFFFDFFFu, 0xC3FEFFFFu, 0x003DFFFFu, 0xFFFFFC01u, 0x007FFFFFu, 0x0003F800u, 0x00000000u }); + Mask allowedMaskForTarget({ 0xFFFFDFFFu, 0xFF0FDFFFu, 0xC001EFFFu, 0x001EFFFFu, 0xFFFFFE00u, 0x00003FFFu, 0xFFF00000u, 0x00000007u }); AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags); changesMask &= allowedMaskForTarget; } void UnitData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignoreNestedChangesMask, Unit const* owner, Player const* receiver) const { - data.WriteBits(changesMask.GetBlocksMask(0), 7); - for (uint32 i = 0; i < 7; ++i) + data.WriteBits(changesMask.GetBlocksMask(0), 8); + for (uint32 i = 0; i < 8; ++i) if (changesMask.GetBlock(i)) data.WriteBits(changesMask.GetBlock(i), 32); @@ -1237,27 +951,27 @@ void UnitData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignor } if (changesMask[5]) { - data << int32(ViewerDependentValue<DisplayIDTag>::GetValue(this, owner, receiver)); + data << int64(Health); } if (changesMask[6]) { - data << uint32(StateSpellVisualID); + data << int64(MaxHealth); } if (changesMask[7]) { - data << uint32(StateAnimID); + data << int32(ViewerDependentValue<DisplayIDTag>::GetValue(this, owner, receiver)); } if (changesMask[8]) { - data << uint32(StateAnimKitID); + data << uint32(StateSpellVisualID); } if (changesMask[9]) { - data << uint32(StateWorldEffectsQuestObjectiveID); + data << uint32(StateAnimID); } if (changesMask[10]) { - data << int32(SpellOverrideNameID); + data << uint32(StateAnimKitID); } if (changesMask[11]) { @@ -1309,507 +1023,465 @@ void UnitData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignor } if (changesMask[23]) { - data << int8(SpellEmpowerStage); + data << uint32(SummonedByHomeRealm); } if (changesMask[24]) { - data << uint32(SummonedByHomeRealm); + data << uint8(Race); } if (changesMask[25]) { - data << uint8(Race); + data << uint8(ClassId); } if (changesMask[26]) { - data << uint8(ClassId); + data << uint8(PlayerClassId); } if (changesMask[27]) { - data << uint8(PlayerClassId); + data << uint8(Sex); } if (changesMask[28]) { - data << uint8(Sex); + data << uint8(DisplayPower); } if (changesMask[29]) { - data << uint8(DisplayPower); + data << uint32(OverrideDisplayPowerID); } if (changesMask[30]) { - data << uint32(OverrideDisplayPowerID); + data << int32(Level); } if (changesMask[31]) { - data << int64(Health); + data << int32(EffectiveLevel); } } if (changesMask[32]) { if (changesMask[33]) { - data << int64(MaxHealth); + data << int32(ContentTuningID); } if (changesMask[34]) { - data << int32(Level); + data << int32(ScalingLevelMin); } if (changesMask[35]) { - data << int32(EffectiveLevel); + data << int32(ScalingLevelMax); } if (changesMask[36]) { - data << int32(ContentTuningID); + data << int32(ScalingLevelDelta); } if (changesMask[37]) { - data << int32(ScalingLevelMin); + data << int32(ScalingFactionGroup); } if (changesMask[38]) { - data << int32(ScalingLevelMax); + data << int32(ScalingHealthItemLevelCurveID); } if (changesMask[39]) { - data << int32(ScalingLevelDelta); + data << int32(ScalingDamageItemLevelCurveID); } if (changesMask[40]) { - data << int32(ScalingFactionGroup); + data << int32(ViewerDependentValue<FactionTemplateTag>::GetValue(this, owner, receiver)); } if (changesMask[41]) { - data << int32(ScalingHealthItemLevelCurveID); + data << uint32(ViewerDependentValue<FlagsTag>::GetValue(this, owner, receiver)); } if (changesMask[42]) { - data << int32(ScalingDamageItemLevelCurveID); + data << uint32(Flags2); } if (changesMask[43]) { - data << int32(ViewerDependentValue<FactionTemplateTag>::GetValue(this, owner, receiver)); + data << uint32(ViewerDependentValue<Flags3Tag>::GetValue(this, owner, receiver)); } if (changesMask[44]) { - data << uint32(ViewerDependentValue<FlagsTag>::GetValue(this, owner, receiver)); + data << uint32(ViewerDependentValue<AuraStateTag>::GetValue(this, owner, receiver)); } if (changesMask[45]) { - data << uint32(Flags2); + data << uint32(RangedAttackRoundBaseTime); } if (changesMask[46]) { - data << uint32(ViewerDependentValue<Flags3Tag>::GetValue(this, owner, receiver)); + data << float(BoundingRadius); } if (changesMask[47]) { - data << uint32(ViewerDependentValue<AuraStateTag>::GetValue(this, owner, receiver)); + data << float(CombatReach); } if (changesMask[48]) { - data << uint32(RangedAttackRoundBaseTime); + data << float(DisplayScale); } if (changesMask[49]) { - data << float(BoundingRadius); + data << int32(NativeDisplayID); } if (changesMask[50]) { - data << float(CombatReach); + data << float(NativeXDisplayScale); } if (changesMask[51]) { - data << float(DisplayScale); + data << int32(MountDisplayID); } if (changesMask[52]) { - data << int32(CreatureFamily); + data << float(MinDamage); } if (changesMask[53]) { - data << int32(CreatureType); + data << float(MaxDamage); } if (changesMask[54]) { - data << int32(NativeDisplayID); + data << float(MinOffHandDamage); } if (changesMask[55]) { - data << float(NativeXDisplayScale); + data << float(MaxOffHandDamage); } if (changesMask[56]) { - data << int32(MountDisplayID); + data << uint8(StandState); } if (changesMask[57]) { - data << int32(CosmeticMountDisplayID); + data << uint8(PetTalentPoints); } if (changesMask[58]) { - data << float(MinDamage); + data << uint8(VisFlags); } if (changesMask[59]) { - data << float(MaxDamage); + data << uint8(AnimTier); } if (changesMask[60]) { - data << float(MinOffHandDamage); + data << uint32(PetNumber); } if (changesMask[61]) { - data << float(MaxOffHandDamage); + data << uint32(PetNameTimestamp); } if (changesMask[62]) { - data << uint8(StandState); + data << uint32(PetExperience); } if (changesMask[63]) { - data << uint8(PetTalentPoints); + data << uint32(PetNextLevelExperience); } } if (changesMask[64]) { if (changesMask[65]) { - data << uint8(VisFlags); + data << float(ModCastingSpeed); } if (changesMask[66]) { - data << uint8(AnimTier); + data << float(ModSpellHaste); } if (changesMask[67]) { - data << uint32(PetNumber); + data << float(ModHaste); } if (changesMask[68]) { - data << uint32(PetNameTimestamp); + data << float(ModRangedHaste); } if (changesMask[69]) { - data << uint32(PetExperience); + data << float(ModHasteRegen); } if (changesMask[70]) { - data << uint32(PetNextLevelExperience); + data << float(ModTimeRate); } if (changesMask[71]) { - data << float(ModCastingSpeed); + data << int32(CreatedBySpell); } if (changesMask[72]) { - data << float(ModCastingSpeedNeg); + data << int32(EmoteState); } if (changesMask[73]) { - data << float(ModSpellHaste); + data << int16(TrainingPointsUsed); } if (changesMask[74]) { - data << float(ModHaste); + data << int16(TrainingPointsTotal); } if (changesMask[75]) { - data << float(ModRangedHaste); + data << int32(BaseMana); } if (changesMask[76]) { - data << float(ModHasteRegen); + data << int32(BaseHealth); } if (changesMask[77]) { - data << float(ModTimeRate); + data << uint8(SheatheState); } if (changesMask[78]) { - data << int32(CreatedBySpell); + data << uint8(ViewerDependentValue<PvpFlagsTag>::GetValue(this, owner, receiver)); } if (changesMask[79]) { - data << int32(EmoteState); + data << uint8(PetFlags); } if (changesMask[80]) { - data << int32(BaseMana); + data << uint8(ShapeshiftForm); } if (changesMask[81]) { - data << int32(BaseHealth); + data << int32(AttackPower); } if (changesMask[82]) { - data << uint8(SheatheState); + data << int32(AttackPowerModPos); } if (changesMask[83]) { - data << uint8(ViewerDependentValue<PvpFlagsTag>::GetValue(this, owner, receiver)); + data << int32(AttackPowerModNeg); } if (changesMask[84]) { - data << uint8(PetFlags); + data << float(AttackPowerMultiplier); } if (changesMask[85]) { - data << uint8(ShapeshiftForm); + data << int32(RangedAttackPower); } if (changesMask[86]) { - data << int32(AttackPower); + data << int32(RangedAttackPowerModPos); } if (changesMask[87]) { - data << int32(AttackPowerModPos); + data << int32(RangedAttackPowerModNeg); } if (changesMask[88]) { - data << int32(AttackPowerModNeg); + data << float(RangedAttackPowerMultiplier); } if (changesMask[89]) { - data << float(AttackPowerMultiplier); + data << int32(SetAttackSpeedAura); } if (changesMask[90]) { - data << int32(AttackPowerModSupport); + data << float(Lifesteal); } if (changesMask[91]) { - data << int32(RangedAttackPower); + data << float(MinRangedDamage); } if (changesMask[92]) { - data << int32(RangedAttackPowerModPos); + data << float(MaxRangedDamage); } if (changesMask[93]) { - data << int32(RangedAttackPowerModNeg); + data << float(MaxHealthModifier); } if (changesMask[94]) { - data << float(RangedAttackPowerMultiplier); + data << float(HoverHeight); } if (changesMask[95]) { - data << int32(RangedAttackPowerModSupport); + data << int32(MinItemLevelCutoff); } } if (changesMask[96]) { if (changesMask[97]) { - data << int32(MainHandWeaponAttackPower); + data << int32(MinItemLevel); } if (changesMask[98]) { - data << int32(OffHandWeaponAttackPower); + data << int32(MaxItemLevel); } if (changesMask[99]) { - data << int32(RangedWeaponAttackPower); + data << int32(WildBattlePetLevel); } if (changesMask[100]) { - data << int32(SetAttackSpeedAura); + data << uint32(BattlePetCompanionNameTimestamp); } if (changesMask[101]) { - data << float(Lifesteal); + data << int32(ViewerDependentValue<InteractSpellIDTag>::GetValue(this, owner, receiver)); } if (changesMask[102]) { - data << float(MinRangedDamage); + data << int32(ScaleDuration); } if (changesMask[103]) { - data << float(MaxRangedDamage); + data << int32(LooksLikeMountID); } if (changesMask[104]) { - data << float(ManaCostMultiplier); + data << int32(LooksLikeCreatureID); } if (changesMask[105]) { - data << float(MaxHealthModifier); + data << int32(LookAtControllerID); } if (changesMask[106]) { - data << float(HoverHeight); + data << int32(PerksVendorItemID); } if (changesMask[107]) { - data << int32(MinItemLevelCutoff); + data << GuildGUID; } if (changesMask[108]) { - data << int32(MinItemLevel); + data << SkinningOwnerGUID; } if (changesMask[109]) { - data << int32(MaxItemLevel); - } - if (changesMask[110]) - { - data << int32(AzeriteItemLevel); - } - if (changesMask[111]) - { - data << int32(WildBattlePetLevel); - } - if (changesMask[112]) - { - data << int32(BattlePetCompanionExperience); - } - if (changesMask[113]) - { - data << uint32(BattlePetCompanionNameTimestamp); - } - if (changesMask[114]) - { - data << int32(ViewerDependentValue<InteractSpellIDTag>::GetValue(this, owner, receiver)); - } - if (changesMask[115]) - { - data << int32(ScaleDuration); - } - if (changesMask[116]) - { - data << int32(LooksLikeMountID); - } - if (changesMask[117]) - { - data << int32(LooksLikeCreatureID); - } - if (changesMask[118]) - { - data << int32(LookAtControllerID); - } - if (changesMask[119]) - { - data << int32(PerksVendorItemID); - } - if (changesMask[120]) - { - data << int32(TaxiNodesID); - } - if (changesMask[121]) - { - data << GuildGUID; - } - if (changesMask[122]) - { data << int32(FlightCapabilityID); } - if (changesMask[123]) + if (changesMask[110]) { data << float(GlideEventSpeedDivisor); } - if (changesMask[124]) - { - data << uint32(SilencedSchoolMask); - } - if (changesMask[125]) + if (changesMask[111]) { data << uint32(CurrentAreaID); } - if (changesMask[126]) + if (changesMask[112]) { - data << NameplateAttachToGUID; + data << ComboTarget; } } - if (changesMask[127]) + if (changesMask[113]) { for (uint32 i = 0; i < 2; ++i) { - if (changesMask[128 + i]) + if (changesMask[114 + i]) { data << uint32(ViewerDependentValue<NpcFlagsTag>::GetValue(this, i, owner, receiver)); } } } - if (changesMask[130]) + if (changesMask[116]) { for (uint32 i = 0; i < 10; ++i) { - if (changesMask[131 + i]) + if (changesMask[117 + i]) { - data << int32(Power[i]); + data << float(PowerRegenFlatModifier[i]); } - if (changesMask[141 + i]) + if (changesMask[127 + i]) { - data << int32(MaxPower[i]); + data << float(PowerRegenInterruptedFlatModifier[i]); } - if (changesMask[151 + i]) + if (changesMask[137 + i]) { - data << float(PowerRegenFlatModifier[i]); + data << int32(Power[i]); } - if (changesMask[161 + i]) + if (changesMask[147 + i]) { - data << float(PowerRegenInterruptedFlatModifier[i]); + data << int32(MaxPower[i]); + } + if (changesMask[157 + i]) + { + data << float(ModPowerRegen[i]); } } } - if (changesMask[171]) + if (changesMask[167]) { for (uint32 i = 0; i < 3; ++i) { - if (changesMask[172 + i]) + if (changesMask[168 + i]) { VirtualItems[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } } - if (changesMask[175]) + if (changesMask[171]) { for (uint32 i = 0; i < 2; ++i) { - if (changesMask[176 + i]) + if (changesMask[172 + i]) { data << uint32(AttackRoundBaseTime[i]); } } } - if (changesMask[178]) + if (changesMask[174]) { - for (uint32 i = 0; i < 4; ++i) + for (uint32 i = 0; i < 5; ++i) { - if (changesMask[179 + i]) + if (changesMask[175 + i]) { data << int32(Stats[i]); } - if (changesMask[183 + i]) + if (changesMask[180 + i]) { data << int32(StatPosBuff[i]); } - if (changesMask[187 + i]) + if (changesMask[185 + i]) { data << int32(StatNegBuff[i]); } - if (changesMask[191 + i]) - { - data << int32(StatSupportBuff[i]); - } } } - if (changesMask[195]) + if (changesMask[190]) { for (uint32 i = 0; i < 7; ++i) { - if (changesMask[196 + i]) + if (changesMask[191 + i]) { data << int32(Resistances[i]); } - if (changesMask[203 + i]) + if (changesMask[198 + i]) { - data << int32(BonusResistanceMods[i]); + data << int32(PowerCostModifier[i]); } - if (changesMask[210 + i]) + if (changesMask[205 + i]) { - data << int32(ManaCostModifier[i]); + data << float(PowerCostMultiplier[i]); + } + } + } + if (changesMask[212]) + { + for (uint32 i = 0; i < 7; ++i) + { + if (changesMask[213 + i]) + { + data << int32(ResistanceBuffModsPositive[i]); + } + if (changesMask[220 + i]) + { + data << int32(ResistanceBuffModsNegative[i]); } } } @@ -1821,12 +1493,12 @@ void UnitData::ClearChangesMask() Base::ClearChangesMask(PassiveSpells); Base::ClearChangesMask(WorldEffects); Base::ClearChangesMask(ChannelObjects); + Base::ClearChangesMask(Health); + Base::ClearChangesMask(MaxHealth); Base::ClearChangesMask(DisplayID); Base::ClearChangesMask(StateSpellVisualID); Base::ClearChangesMask(StateAnimID); Base::ClearChangesMask(StateAnimKitID); - Base::ClearChangesMask(StateWorldEffectsQuestObjectiveID); - Base::ClearChangesMask(SpellOverrideNameID); Base::ClearChangesMask(Charm); Base::ClearChangesMask(Summon); Base::ClearChangesMask(Critter); @@ -1839,7 +1511,6 @@ void UnitData::ClearChangesMask() Base::ClearChangesMask(BattlePetCompanionGUID); Base::ClearChangesMask(BattlePetDBID); Base::ClearChangesMask(ChannelData); - Base::ClearChangesMask(SpellEmpowerStage); Base::ClearChangesMask(SummonedByHomeRealm); Base::ClearChangesMask(Race); Base::ClearChangesMask(ClassId); @@ -1847,8 +1518,6 @@ void UnitData::ClearChangesMask() Base::ClearChangesMask(Sex); Base::ClearChangesMask(DisplayPower); Base::ClearChangesMask(OverrideDisplayPowerID); - Base::ClearChangesMask(Health); - Base::ClearChangesMask(MaxHealth); Base::ClearChangesMask(Level); Base::ClearChangesMask(EffectiveLevel); Base::ClearChangesMask(ContentTuningID); @@ -1867,12 +1536,9 @@ void UnitData::ClearChangesMask() Base::ClearChangesMask(BoundingRadius); Base::ClearChangesMask(CombatReach); Base::ClearChangesMask(DisplayScale); - Base::ClearChangesMask(CreatureFamily); - Base::ClearChangesMask(CreatureType); Base::ClearChangesMask(NativeDisplayID); Base::ClearChangesMask(NativeXDisplayScale); Base::ClearChangesMask(MountDisplayID); - Base::ClearChangesMask(CosmeticMountDisplayID); Base::ClearChangesMask(MinDamage); Base::ClearChangesMask(MaxDamage); Base::ClearChangesMask(MinOffHandDamage); @@ -1886,7 +1552,6 @@ void UnitData::ClearChangesMask() Base::ClearChangesMask(PetExperience); Base::ClearChangesMask(PetNextLevelExperience); Base::ClearChangesMask(ModCastingSpeed); - Base::ClearChangesMask(ModCastingSpeedNeg); Base::ClearChangesMask(ModSpellHaste); Base::ClearChangesMask(ModHaste); Base::ClearChangesMask(ModRangedHaste); @@ -1894,6 +1559,8 @@ void UnitData::ClearChangesMask() Base::ClearChangesMask(ModTimeRate); Base::ClearChangesMask(CreatedBySpell); Base::ClearChangesMask(EmoteState); + Base::ClearChangesMask(TrainingPointsUsed); + Base::ClearChangesMask(TrainingPointsTotal); Base::ClearChangesMask(BaseMana); Base::ClearChangesMask(BaseHealth); Base::ClearChangesMask(SheatheState); @@ -1904,28 +1571,20 @@ void UnitData::ClearChangesMask() Base::ClearChangesMask(AttackPowerModPos); Base::ClearChangesMask(AttackPowerModNeg); Base::ClearChangesMask(AttackPowerMultiplier); - Base::ClearChangesMask(AttackPowerModSupport); Base::ClearChangesMask(RangedAttackPower); Base::ClearChangesMask(RangedAttackPowerModPos); Base::ClearChangesMask(RangedAttackPowerModNeg); Base::ClearChangesMask(RangedAttackPowerMultiplier); - Base::ClearChangesMask(RangedAttackPowerModSupport); - Base::ClearChangesMask(MainHandWeaponAttackPower); - Base::ClearChangesMask(OffHandWeaponAttackPower); - Base::ClearChangesMask(RangedWeaponAttackPower); Base::ClearChangesMask(SetAttackSpeedAura); Base::ClearChangesMask(Lifesteal); Base::ClearChangesMask(MinRangedDamage); Base::ClearChangesMask(MaxRangedDamage); - Base::ClearChangesMask(ManaCostMultiplier); Base::ClearChangesMask(MaxHealthModifier); Base::ClearChangesMask(HoverHeight); Base::ClearChangesMask(MinItemLevelCutoff); Base::ClearChangesMask(MinItemLevel); Base::ClearChangesMask(MaxItemLevel); - Base::ClearChangesMask(AzeriteItemLevel); Base::ClearChangesMask(WildBattlePetLevel); - Base::ClearChangesMask(BattlePetCompanionExperience); Base::ClearChangesMask(BattlePetCompanionNameTimestamp); Base::ClearChangesMask(InteractSpellID); Base::ClearChangesMask(ScaleDuration); @@ -1933,27 +1592,28 @@ void UnitData::ClearChangesMask() Base::ClearChangesMask(LooksLikeCreatureID); Base::ClearChangesMask(LookAtControllerID); Base::ClearChangesMask(PerksVendorItemID); - Base::ClearChangesMask(TaxiNodesID); Base::ClearChangesMask(GuildGUID); + Base::ClearChangesMask(SkinningOwnerGUID); Base::ClearChangesMask(FlightCapabilityID); Base::ClearChangesMask(GlideEventSpeedDivisor); - Base::ClearChangesMask(SilencedSchoolMask); Base::ClearChangesMask(CurrentAreaID); - Base::ClearChangesMask(NameplateAttachToGUID); + Base::ClearChangesMask(ComboTarget); Base::ClearChangesMask(NpcFlags); - Base::ClearChangesMask(Power); - Base::ClearChangesMask(MaxPower); Base::ClearChangesMask(PowerRegenFlatModifier); Base::ClearChangesMask(PowerRegenInterruptedFlatModifier); + Base::ClearChangesMask(Power); + Base::ClearChangesMask(MaxPower); + Base::ClearChangesMask(ModPowerRegen); Base::ClearChangesMask(VirtualItems); Base::ClearChangesMask(AttackRoundBaseTime); Base::ClearChangesMask(Stats); Base::ClearChangesMask(StatPosBuff); Base::ClearChangesMask(StatNegBuff); - Base::ClearChangesMask(StatSupportBuff); Base::ClearChangesMask(Resistances); - Base::ClearChangesMask(BonusResistanceMods); - Base::ClearChangesMask(ManaCostModifier); + Base::ClearChangesMask(PowerCostModifier); + Base::ClearChangesMask(PowerCostMultiplier); + Base::ClearChangesMask(ResistanceBuffModsPositive); + Base::ClearChangesMask(ResistanceBuffModsNegative); _changesMask.ResetAll(); } @@ -1980,10 +1640,9 @@ void QuestLog::WriteCreate(ByteBuffer& data, Player const* owner, Player const* data << int64(EndTime); data << int32(QuestID); data << uint32(StateFlags); - data << uint32(ObjectiveFlags); for (uint32 i = 0; i < 24; ++i) { - data << int16(ObjectiveProgress[i]); + data << uint16(ObjectiveProgress[i]); } } @@ -2012,18 +1671,14 @@ void QuestLog::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player cons { data << uint32(StateFlags); } - if (changesMask[4]) - { - data << uint32(ObjectiveFlags); - } } - if (changesMask[5]) + if (changesMask[4]) { for (uint32 i = 0; i < 24; ++i) { - if (changesMask[6 + i]) + if (changesMask[5 + i]) { - data << int16(ObjectiveProgress[i]); + data << uint16(ObjectiveProgress[i]); } } } @@ -2034,7 +1689,6 @@ void QuestLog::ClearChangesMask() Base::ClearChangesMask(EndTime); Base::ClearChangesMask(QuestID); Base::ClearChangesMask(StateFlags); - Base::ClearChangesMask(ObjectiveFlags); Base::ClearChangesMask(ObjectiveProgress); _changesMask.ResetAll(); } @@ -2042,6 +1696,7 @@ void QuestLog::ClearChangesMask() void ArenaCooldown::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const { data << int32(SpellID); + data << int32(ItemID); data << int32(Charges); data << uint32(Flags); data << uint32(StartTime); @@ -2056,7 +1711,7 @@ void ArenaCooldown::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player if (ignoreChangesMask) changesMask.SetAll(); - data.WriteBits(changesMask.GetBlock(0), 8); + data.WriteBits(changesMask.GetBlock(0), 9); data.FlushBits(); if (changesMask[0]) @@ -2067,26 +1722,30 @@ void ArenaCooldown::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player } if (changesMask[2]) { - data << int32(Charges); + data << int32(ItemID); } if (changesMask[3]) { - data << uint32(Flags); + data << int32(Charges); } if (changesMask[4]) { - data << uint32(StartTime); + data << uint32(Flags); } if (changesMask[5]) { - data << uint32(EndTime); + data << uint32(StartTime); } if (changesMask[6]) { - data << uint32(NextChargeTime); + data << uint32(EndTime); } if (changesMask[7]) { + data << uint32(NextChargeTime); + } + if (changesMask[8]) + { data << uint8(MaxCharges); } } @@ -2095,6 +1754,7 @@ void ArenaCooldown::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player void ArenaCooldown::ClearChangesMask() { Base::ClearChangesMask(SpellID); + Base::ClearChangesMask(ItemID); Base::ClearChangesMask(Charges); Base::ClearChangesMask(Flags); Base::ClearChangesMask(StartTime); @@ -2104,27 +1764,6 @@ void ArenaCooldown::ClearChangesMask() _changesMask.ResetAll(); } -void CTROptions::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const -{ - data << int32(ContentTuningConditionMask); - data << uint32(Field_4); - data << uint32(ExpansionLevelMask); -} - -void CTROptions::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const -{ - data << int32(ContentTuningConditionMask); - data << uint32(Field_4); - data << uint32(ExpansionLevelMask); -} - -bool CTROptions::operator==(CTROptions const& right) const -{ - return ContentTuningConditionMask == right.ContentTuningConditionMask - && Field_4 == right.Field_4 - && ExpansionLevelMask == right.ExpansionLevelMask; -} - void DeclinedNames::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const { for (uint32 i = 0; i < 5; ++i) @@ -2246,24 +1885,25 @@ void PlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVi data << uint32(GuildDeleteDate); data << int32(GuildLevel); data << uint32(Customizations.size()); - data << uint32(QaCustomizations.size()); for (uint32 i = 0; i < 2; ++i) { data << uint8(PartyType[i]); } + data << uint8(NumBankSlots); data << uint8(NativeSex); data << uint8(Inebriation); data << uint8(PvpTitle); data << uint8(ArenaFaction); + data << uint8(PvpRank); + data << int32(Field_88); data << uint32(DuelTeam); data << int32(GuildTimeStamp); if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::PartyMember)) { - for (uint32 i = 0; i < 175; ++i) + for (uint32 i = 0; i < 25; ++i) { QuestLog[i].WriteCreate(data, owner, receiver); } - data << uint32(QuestSessionQuestLog.size()); } for (uint32 i = 0; i < 19; ++i) { @@ -2282,12 +1922,7 @@ void PlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVi data << int32(HonorLevel); data << int64(LogoutTime); data << uint32(ArenaCooldowns.size()); - data << int32(Field_B0); - data << int32(Field_B4); data << int32(CurrentBattlePetSpeciesID); - CtrOptions->WriteCreate(data, owner, receiver); - data << int32(CovenantID); - data << int32(SoulbindID); data << uint32(VisualItemReplacements.size()); for (uint32 i = 0; i < 19; ++i) { @@ -2298,17 +1933,6 @@ void PlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVi { Customizations[i].WriteCreate(data, owner, receiver); } - for (uint32 i = 0; i < QaCustomizations.size(); ++i) - { - QaCustomizations[i].WriteCreate(data, owner, receiver); - } - if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::PartyMember)) - { - for (uint32 i = 0; i < QuestSessionQuestLog.size(); ++i) - { - QuestSessionQuestLog[i].WriteCreate(data, owner, receiver); - } - } for (uint32 i = 0; i < ArenaCooldowns.size(); ++i) { ArenaCooldowns[i].WriteCreate(data, owner, receiver); @@ -2317,13 +1941,7 @@ void PlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVi { data << int32(VisualItemReplacements[i]); } - data.FlushBits(); data.WriteBits(Name->size(), 6); - if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::PartyMember)) - { - data.WriteBit(HasQuestSession); - } - data.WriteBit(HasLevelLink); data.WriteBits(DeclinedNames.has_value(), 1); data << DungeonScore; data.WriteString(Name); @@ -2336,7 +1954,7 @@ void PlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVi void PlayerData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Player const* owner, Player const* receiver) const { - Mask allowedMaskForTarget({ 0xFFFFFFDDu, 0x00003FFFu, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0xC0000000u, 0xFFFFFFFFu, 0x00001FFFu }); + Mask allowedMaskForTarget({ 0xFFFFFFFFu, 0x000000FFu, 0xFFFFFFFCu, 0x0001FFFFu }); AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags); WriteUpdate(data, _changesMask & allowedMaskForTarget, false, owner, receiver); } @@ -2344,20 +1962,20 @@ void PlayerData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVi void PlayerData::AppendAllowedFieldsMaskForFlag(Mask& allowedMaskForTarget, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) { if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::PartyMember)) - allowedMaskForTarget |= { 0x00000022u, 0xFFFFC000u, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0x3FFFFFFFu, 0x00000000u, 0x00000000u }; + allowedMaskForTarget |= { 0x00000000u, 0xFFFFFF00u, 0x00000003u, 0x00000000u }; } void PlayerData::FilterDisallowedFieldsMaskForFlag(Mask& changesMask, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) { - Mask allowedMaskForTarget({ 0xFFFFFFDDu, 0x00003FFFu, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0xC0000000u, 0xFFFFFFFFu, 0x00001FFFu }); + Mask allowedMaskForTarget({ 0xFFFFFFFFu, 0x000000FFu, 0xFFFFFFFCu, 0x0001FFFFu }); AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags); changesMask &= allowedMaskForTarget; } void PlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignoreNestedChangesMask, Player const* owner, Player const* receiver) const { - data.WriteBits(changesMask.GetBlocksMask(0), 9); - for (uint32 i = 0; i < 9; ++i) + data.WriteBits(changesMask.GetBlocksMask(0), 4); + for (uint32 i = 0; i < 4; ++i) if (changesMask.GetBlock(i)) data.WriteBits(changesMask.GetBlock(i), 32); @@ -2366,41 +1984,19 @@ void PlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ign { if (changesMask[1]) { - data.WriteBit(HasQuestSession); - } - if (changesMask[2]) - { - data.WriteBit(HasLevelLink); - } - if (changesMask[3]) - { if (!ignoreNestedChangesMask) Customizations.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(Customizations.size(), data); } - if (changesMask[4]) - { - if (!ignoreNestedChangesMask) - QaCustomizations.WriteUpdateMask(data); - else - WriteCompleteDynamicFieldUpdateMask(QaCustomizations.size(), data); - } - if (changesMask[5]) - { - if (!ignoreNestedChangesMask) - QuestSessionQuestLog.WriteUpdateMask(data); - else - WriteCompleteDynamicFieldUpdateMask(QuestSessionQuestLog.size(), data); - } - if (changesMask[6]) + if (changesMask[2]) { if (!ignoreNestedChangesMask) ArenaCooldowns.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(ArenaCooldowns.size(), data); } - if (changesMask[7]) + if (changesMask[3]) { if (!ignoreNestedChangesMask) VisualItemReplacements.WriteUpdateMask(data); @@ -2411,7 +2007,7 @@ void PlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ign data.FlushBits(); if (changesMask[0]) { - if (changesMask[3]) + if (changesMask[1]) { for (uint32 i = 0; i < Customizations.size(); ++i) { @@ -2421,30 +2017,7 @@ void PlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ign } } } - if (changesMask[4]) - { - for (uint32 i = 0; i < QaCustomizations.size(); ++i) - { - if (QaCustomizations.HasChanged(i) || ignoreNestedChangesMask) - { - QaCustomizations[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); - } - } - } - if (changesMask[5]) - { - for (uint32 i = 0; i < QuestSessionQuestLog.size(); ++i) - { - if (QuestSessionQuestLog.HasChanged(i) || ignoreNestedChangesMask) - { - if (noQuestLogChangesMask) - QuestSessionQuestLog[i].WriteCreate(data, owner, receiver); - else - QuestSessionQuestLog[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); - } - } - } - if (changesMask[6]) + if (changesMask[2]) { for (uint32 i = 0; i < ArenaCooldowns.size(); ++i) { @@ -2454,7 +2027,7 @@ void PlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ign } } } - if (changesMask[7]) + if (changesMask[3]) { for (uint32 i = 0; i < VisualItemReplacements.size(); ++i) { @@ -2464,148 +2037,152 @@ void PlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ign } } } - if (changesMask[8]) + if (changesMask[4]) { data << DuelArbiter; } - if (changesMask[9]) + if (changesMask[5]) { data << WowAccount; } - if (changesMask[10]) + if (changesMask[6]) { data << BnetAccount; } - if (changesMask[11]) + if (changesMask[7]) { data << uint64(GuildClubMemberID); } - if (changesMask[12]) + if (changesMask[8]) { data << LootTargetGUID; } - if (changesMask[13]) + if (changesMask[9]) { data << uint32(PlayerFlags); } - if (changesMask[14]) + if (changesMask[10]) { data << uint32(PlayerFlagsEx); } - if (changesMask[15]) + if (changesMask[11]) { data << uint32(GuildRankID); } - if (changesMask[16]) + if (changesMask[12]) { data << uint32(GuildDeleteDate); } - if (changesMask[17]) + if (changesMask[13]) { data << int32(GuildLevel); } - if (changesMask[18]) + if (changesMask[14]) + { + data << uint8(NumBankSlots); + } + if (changesMask[15]) { data << uint8(NativeSex); } - if (changesMask[19]) + if (changesMask[16]) { data << uint8(Inebriation); } - if (changesMask[20]) + if (changesMask[17]) { data << uint8(PvpTitle); } - if (changesMask[21]) + if (changesMask[18]) { data << uint8(ArenaFaction); } - if (changesMask[22]) + if (changesMask[19]) + { + data << uint8(PvpRank); + } + if (changesMask[20]) + { + data << int32(Field_88); + } + if (changesMask[21]) { data << uint32(DuelTeam); } - if (changesMask[23]) + if (changesMask[22]) { data << int32(GuildTimeStamp); } - if (changesMask[24]) + if (changesMask[23]) { data << int32(PlayerTitle); } - if (changesMask[25]) + if (changesMask[24]) { data << int32(FakeInebriation); } - if (changesMask[26]) + if (changesMask[25]) { data << uint32(VirtualPlayerRealm); } - if (changesMask[27]) + if (changesMask[26]) { data << uint32(CurrentSpecID); } - if (changesMask[28]) + if (changesMask[27]) { data << int32(TaxiMountAnimKitID); } - if (changesMask[29]) + if (changesMask[28]) { data << uint8(CurrentBattlePetBreedQuality); } - if (changesMask[30]) + if (changesMask[29]) { data << int32(HonorLevel); } - if (changesMask[31]) + if (changesMask[30]) { data << int64(LogoutTime); } } if (changesMask[32]) { - if (changesMask[34]) - { - data << int32(Field_B0); - } - if (changesMask[35]) - { - data << int32(Field_B4); - } - if (changesMask[36]) + if (changesMask[33]) { data << int32(CurrentBattlePetSpeciesID); } - if (changesMask[37]) - { - CtrOptions->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); - } - if (changesMask[38]) - { - data << int32(CovenantID); - } - if (changesMask[39]) - { - data << int32(SoulbindID); - } - if (changesMask[42]) + if (changesMask[36]) { PersonalTabard->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } - if (changesMask[33]) + } + if (changesMask[0]) + { + if (changesMask[31]) { data.WriteBits(Name->size(), 32); } + } + if (changesMask[32]) + { data.WriteBits(DeclinedNames.has_value(), 1); data.FlushBits(); - if (changesMask[40]) + if (changesMask[34]) { data << DungeonScore; } - if (changesMask[33]) + } + if (changesMask[0]) + { + if (changesMask[31]) { data.WriteString(Name); } - if (changesMask[41]) + } + if (changesMask[32]) + { + if (changesMask[35]) { if (DeclinedNames.has_value()) { @@ -2613,21 +2190,21 @@ void PlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ign } } } - if (changesMask[43]) + if (changesMask[37]) { for (uint32 i = 0; i < 2; ++i) { - if (changesMask[44 + i]) + if (changesMask[38 + i]) { data << uint8(PartyType[i]); } } } - if (changesMask[46]) + if (changesMask[40]) { - for (uint32 i = 0; i < 175; ++i) + for (uint32 i = 0; i < 25; ++i) { - if (changesMask[47 + i]) + if (changesMask[41 + i]) { if (noQuestLogChangesMask) QuestLog[i].WriteCreate(data, owner, receiver); @@ -2636,31 +2213,31 @@ void PlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ign } } } - if (changesMask[222]) + if (changesMask[66]) { for (uint32 i = 0; i < 19; ++i) { - if (changesMask[223 + i]) + if (changesMask[67 + i]) { VisibleItems[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } } - if (changesMask[242]) + if (changesMask[86]) { for (uint32 i = 0; i < 6; ++i) { - if (changesMask[243 + i]) + if (changesMask[87 + i]) { data << float(AvgItemLevel[i]); } } } - if (changesMask[249]) + if (changesMask[93]) { for (uint32 i = 0; i < 19; ++i) { - if (changesMask[250 + i]) + if (changesMask[94 + i]) { data << uint32(Field_3120[i]); } @@ -2671,11 +2248,7 @@ void PlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ign void PlayerData::ClearChangesMask() { - Base::ClearChangesMask(HasQuestSession); - Base::ClearChangesMask(HasLevelLink); Base::ClearChangesMask(Customizations); - Base::ClearChangesMask(QaCustomizations); - Base::ClearChangesMask(QuestSessionQuestLog); Base::ClearChangesMask(ArenaCooldowns); Base::ClearChangesMask(VisualItemReplacements); Base::ClearChangesMask(DuelArbiter); @@ -2688,10 +2261,13 @@ void PlayerData::ClearChangesMask() Base::ClearChangesMask(GuildRankID); Base::ClearChangesMask(GuildDeleteDate); Base::ClearChangesMask(GuildLevel); + Base::ClearChangesMask(NumBankSlots); Base::ClearChangesMask(NativeSex); Base::ClearChangesMask(Inebriation); Base::ClearChangesMask(PvpTitle); Base::ClearChangesMask(ArenaFaction); + Base::ClearChangesMask(PvpRank); + Base::ClearChangesMask(Field_88); Base::ClearChangesMask(DuelTeam); Base::ClearChangesMask(GuildTimeStamp); Base::ClearChangesMask(PlayerTitle); @@ -2703,12 +2279,7 @@ void PlayerData::ClearChangesMask() Base::ClearChangesMask(HonorLevel); Base::ClearChangesMask(LogoutTime); Base::ClearChangesMask(Name); - Base::ClearChangesMask(Field_B0); - Base::ClearChangesMask(Field_B4); Base::ClearChangesMask(CurrentBattlePetSpeciesID); - Base::ClearChangesMask(CtrOptions); - Base::ClearChangesMask(CovenantID); - Base::ClearChangesMask(SoulbindID); Base::ClearChangesMask(DungeonScore); Base::ClearChangesMask(DeclinedNames); Base::ClearChangesMask(PersonalTabard); @@ -3125,186 +2696,6 @@ void ResearchHistory::ClearChangesMask() _changesMask.ResetAll(); } -void MawPower::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const -{ - data << int32(Field_0); - data << int32(Field_4); - data << int32(Field_8); -} - -void MawPower::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const -{ - data << int32(Field_0); - data << int32(Field_4); - data << int32(Field_8); -} - -bool MawPower::operator==(MawPower const& right) const -{ - return Field_0 == right.Field_0 - && Field_4 == right.Field_4 - && Field_8 == right.Field_8; -} - -void MultiFloorExplore::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const -{ - data << uint32(WorldMapOverlayIDs.size()); - for (uint32 i = 0; i < WorldMapOverlayIDs.size(); ++i) - { - data << int32(WorldMapOverlayIDs[i]); - } -} - -void MultiFloorExplore::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const -{ - data << uint32(WorldMapOverlayIDs.size()); - for (uint32 i = 0; i < WorldMapOverlayIDs.size(); ++i) - { - data << int32(WorldMapOverlayIDs[i]); - } - data.FlushBits(); -} - -bool MultiFloorExplore::operator==(MultiFloorExplore const& right) const -{ - return WorldMapOverlayIDs == right.WorldMapOverlayIDs; -} - -void RecipeProgressionInfo::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const -{ - data << uint16(RecipeProgressionGroupID); - data << uint16(Experience); -} - -void RecipeProgressionInfo::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const -{ - data << uint16(RecipeProgressionGroupID); - data << uint16(Experience); -} - -bool RecipeProgressionInfo::operator==(RecipeProgressionInfo const& right) const -{ - return RecipeProgressionGroupID == right.RecipeProgressionGroupID - && Experience == right.Experience; -} - -void ActivePlayerUnk901::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const -{ - data << Field_0; - data << int32(Field_10); -} - -void ActivePlayerUnk901::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const -{ - Mask changesMask = _changesMask; - if (ignoreChangesMask) - changesMask.SetAll(); - - data.WriteBits(changesMask.GetBlock(0), 3); - - data.FlushBits(); - if (changesMask[0]) - { - if (changesMask[1]) - { - data << Field_0; - } - if (changesMask[2]) - { - data << int32(Field_10); - } - } -} - -void ActivePlayerUnk901::ClearChangesMask() -{ - Base::ClearChangesMask(Field_0); - Base::ClearChangesMask(Field_10); - _changesMask.ResetAll(); -} - -void QuestSession::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const -{ - data << Owner; - for (uint32 i = 0; i < 950; ++i) - { - data << uint64(QuestCompleted[i]); - } -} - -void QuestSession::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const -{ - Mask changesMask = _changesMask; - if (ignoreChangesMask) - changesMask.SetAll(); - - data.WriteBits(changesMask.GetBlocksMask(0), 30); - for (uint32 i = 0; i < 30; ++i) - if (changesMask.GetBlock(i)) - data.WriteBits(changesMask.GetBlock(i), 32); - - data.FlushBits(); - if (changesMask[0]) - { - if (changesMask[1]) - { - data << Owner; - } - } - if (changesMask[2]) - { - for (uint32 i = 0; i < 950; ++i) - { - if (changesMask[3 + i]) - { - data << uint64(QuestCompleted[i]); - } - } - } -} - -void QuestSession::ClearChangesMask() -{ - Base::ClearChangesMask(Owner); - Base::ClearChangesMask(QuestCompleted); - _changesMask.ResetAll(); -} - -void ReplayedQuest::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const -{ - data << int32(QuestID); - data << uint32(ReplayTime); -} - -void ReplayedQuest::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const -{ - Mask changesMask = _changesMask; - if (ignoreChangesMask) - changesMask.SetAll(); - - data.WriteBits(changesMask.GetBlock(0), 3); - - data.FlushBits(); - if (changesMask[0]) - { - if (changesMask[1]) - { - data << int32(QuestID); - } - if (changesMask[2]) - { - data << uint32(ReplayTime); - } - } -} - -void ReplayedQuest::ClearChangesMask() -{ - Base::ClearChangesMask(QuestID); - Base::ClearChangesMask(ReplayTime); - _changesMask.ResetAll(); -} - void TraitEntry::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const { data << int32(TraitNodeID); @@ -3463,391 +2854,6 @@ void TraitConfig::ClearChangesMask() _changesMask.ResetAll(); } -void CraftingOrderItem::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const -{ - data << uint64(Field_0); - data << ItemGUID; - data << OwnerGUID; - data << int32(ItemID); - data << uint32(Quantity); - data << int32(ReagentQuality); - data.WriteBits(DataSlotIndex.has_value(), 1); - data.FlushBits(); - if (DataSlotIndex.has_value()) - { - data << uint8(DataSlotIndex); - } -} - -void CraftingOrderItem::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const -{ - Mask changesMask = _changesMask; - if (ignoreChangesMask) - changesMask.SetAll(); - - data.WriteBits(changesMask.GetBlock(0), 7); - - data.FlushBits(); - if (changesMask[0]) - { - data << uint64(Field_0); - } - if (changesMask[1]) - { - data << ItemGUID; - } - if (changesMask[2]) - { - data << OwnerGUID; - } - if (changesMask[3]) - { - data << int32(ItemID); - } - if (changesMask[4]) - { - data << uint32(Quantity); - } - if (changesMask[5]) - { - data << int32(ReagentQuality); - } - data.WriteBits(DataSlotIndex.has_value(), 1); - data.FlushBits(); - if (changesMask[6]) - { - if (DataSlotIndex.has_value()) - { - data << uint8(DataSlotIndex); - } - } -} - -void CraftingOrderItem::ClearChangesMask() -{ - Base::ClearChangesMask(Field_0); - Base::ClearChangesMask(ItemGUID); - Base::ClearChangesMask(OwnerGUID); - Base::ClearChangesMask(ItemID); - Base::ClearChangesMask(Quantity); - Base::ClearChangesMask(ReagentQuality); - Base::ClearChangesMask(DataSlotIndex); - _changesMask.ResetAll(); -} - -void CraftingOrderData::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const -{ - data << int32(Field_0); - data << uint64(OrderID); - data << int32(SkillLineAbilityID); - data << uint8(OrderState); - data << uint8(OrderType); - data << uint8(MinQuality); - data << int64(ExpirationTime); - data << int64(ClaimEndTime); - data << int64(TipAmount); - data << int64(ConsortiumCut); - data << uint32(Flags); - data << CustomerGUID; - data << CustomerAccountGUID; - data << CrafterGUID; - data << PersonalCrafterGUID; - data << uint32(Reagents.size()); - data.WriteBits(CustomerNotes->size(), 10); - data.WriteBits(OutputItem.has_value(), 1); - data.WriteBits(OutputItemData.has_value(), 1); - data.FlushBits(); - for (uint32 i = 0; i < Reagents.size(); ++i) - { - Reagents[i].WriteCreate(data, owner, receiver); - } - data.WriteString(CustomerNotes); - if (OutputItem.has_value()) - { - OutputItem->WriteCreate(data, owner, receiver); - } - if (OutputItemData.has_value()) - { - data << OutputItemData; - } - data.FlushBits(); -} - -void CraftingOrderData::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const -{ - Mask changesMask = _changesMask; - if (ignoreChangesMask) - changesMask.SetAll(); - - data.WriteBits(changesMask.GetBlock(0), 24); - - if (changesMask[0]) - { - if (changesMask[1]) - { - if (!ignoreChangesMask) - Reagents.WriteUpdateMask(data); - else - WriteCompleteDynamicFieldUpdateMask(Reagents.size(), data); - } - } - data.FlushBits(); - if (changesMask[0]) - { - if (changesMask[1]) - { - for (uint32 i = 0; i < Reagents.size(); ++i) - { - if (Reagents.HasChanged(i) || ignoreChangesMask) - { - Reagents[i].WriteUpdate(data, ignoreChangesMask, owner, receiver); - } - } - } - if (changesMask[2]) - { - data << int32(Field_0); - } - if (changesMask[3]) - { - data << uint64(OrderID); - } - if (changesMask[4]) - { - data << int32(SkillLineAbilityID); - } - } - if (changesMask[5]) - { - if (changesMask[6]) - { - data << uint8(OrderState); - } - if (changesMask[7]) - { - data << uint8(OrderType); - } - if (changesMask[8]) - { - data << uint8(MinQuality); - } - if (changesMask[9]) - { - data << int64(ExpirationTime); - } - } - if (changesMask[10]) - { - if (changesMask[11]) - { - data << int64(ClaimEndTime); - } - if (changesMask[12]) - { - data << int64(TipAmount); - } - if (changesMask[13]) - { - data << int64(ConsortiumCut); - } - if (changesMask[14]) - { - data << uint32(Flags); - } - } - if (changesMask[15]) - { - if (changesMask[16]) - { - data << CustomerGUID; - } - if (changesMask[17]) - { - data << CustomerAccountGUID; - } - if (changesMask[18]) - { - data << CrafterGUID; - } - if (changesMask[19]) - { - data << PersonalCrafterGUID; - } - } - if (changesMask[20]) - { - if (changesMask[21]) - { - data.WriteBits(CustomerNotes->size(), 10); - data.WriteString(CustomerNotes); - } - data.WriteBits(OutputItem.has_value(), 1); - data.WriteBits(OutputItemData.has_value(), 1); - data.FlushBits(); - if (changesMask[22]) - { - if (OutputItem.has_value()) - { - OutputItem->WriteUpdate(data, ignoreChangesMask, owner, receiver); - } - } - if (changesMask[23]) - { - if (OutputItemData.has_value()) - { - data << OutputItemData; - } - } - } - data.FlushBits(); -} - -void CraftingOrderData::ClearChangesMask() -{ - Base::ClearChangesMask(Reagents); - Base::ClearChangesMask(Field_0); - Base::ClearChangesMask(OrderID); - Base::ClearChangesMask(SkillLineAbilityID); - Base::ClearChangesMask(OrderState); - Base::ClearChangesMask(OrderType); - Base::ClearChangesMask(MinQuality); - Base::ClearChangesMask(ExpirationTime); - Base::ClearChangesMask(ClaimEndTime); - Base::ClearChangesMask(TipAmount); - Base::ClearChangesMask(ConsortiumCut); - Base::ClearChangesMask(Flags); - Base::ClearChangesMask(CustomerGUID); - Base::ClearChangesMask(CustomerAccountGUID); - Base::ClearChangesMask(CrafterGUID); - Base::ClearChangesMask(PersonalCrafterGUID); - Base::ClearChangesMask(CustomerNotes); - Base::ClearChangesMask(OutputItem); - Base::ClearChangesMask(OutputItemData); - _changesMask.ResetAll(); -} - -void CraftingOrder::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const -{ - Data->WriteCreate(data, owner, receiver); - data.WriteBits(RecraftItemInfo.has_value(), 1); - data.WriteBits(Enchantments.size(), 4); - data.WriteBits(Gems.size(), 2); - data.FlushBits(); - if (RecraftItemInfo.has_value()) - { - data << RecraftItemInfo; - } - for (uint32 i = 0; i < Enchantments.size(); ++i) - { - data << Enchantments[i]; - } - for (uint32 i = 0; i < Gems.size(); ++i) - { - data << Gems[i]; - } - data.FlushBits(); -} - -void CraftingOrder::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const -{ - Mask changesMask = _changesMask; - if (ignoreChangesMask) - changesMask.SetAll(); - - data.WriteBits(changesMask.GetBlock(0), 4); - - if (changesMask[0]) - { - if (!ignoreChangesMask) - Enchantments.WriteUpdateMask(data, 4); - else - WriteCompleteDynamicFieldUpdateMask(Enchantments.size(), data, 4); - } - if (changesMask[1]) - { - if (!ignoreChangesMask) - Gems.WriteUpdateMask(data, 2); - else - WriteCompleteDynamicFieldUpdateMask(Gems.size(), data, 2); - } - data.FlushBits(); - if (changesMask[0]) - { - for (uint32 i = 0; i < Enchantments.size(); ++i) - { - if (Enchantments.HasChanged(i) || ignoreChangesMask) - { - data << Enchantments[i]; - } - } - } - if (changesMask[1]) - { - for (uint32 i = 0; i < Gems.size(); ++i) - { - if (Gems.HasChanged(i) || ignoreChangesMask) - { - data << Gems[i]; - } - } - } - if (changesMask[2]) - { - Data->WriteUpdate(data, ignoreChangesMask, owner, receiver); - } - data.WriteBits(RecraftItemInfo.has_value(), 1); - data.FlushBits(); - if (changesMask[3]) - { - if (RecraftItemInfo.has_value()) - { - data << RecraftItemInfo; - } - } - data.FlushBits(); -} - -void CraftingOrder::ClearChangesMask() -{ - Base::ClearChangesMask(Enchantments); - Base::ClearChangesMask(Gems); - Base::ClearChangesMask(Data); - Base::ClearChangesMask(RecraftItemInfo); - _changesMask.ResetAll(); -} - -void PersonalCraftingOrderCount::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const -{ - data << int32(ProfessionID); - data << uint32(Count); -} - -void PersonalCraftingOrderCount::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const -{ - Mask changesMask = _changesMask; - if (ignoreChangesMask) - changesMask.SetAll(); - - data.WriteBits(changesMask.GetBlock(0), 2); - - data.FlushBits(); - if (changesMask[0]) - { - data << int32(ProfessionID); - } - if (changesMask[1]) - { - data << uint32(Count); - } -} - -void PersonalCraftingOrderCount::ClearChangesMask() -{ - Base::ClearChangesMask(ProfessionID); - Base::ClearChangesMask(Count); - _changesMask.ResetAll(); -} - void CategoryCooldownMod::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const { data << int32(SpellCategoryID); @@ -4008,47 +3014,6 @@ void StableInfo::ClearChangesMask() _changesMask.ResetAll(); } -void CollectableSourceTrackedData::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const -{ - data << int32(TargetType); - data << int32(TargetID); - data << int32(CollectableSourceInfoID); -} - -void CollectableSourceTrackedData::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const -{ - Mask changesMask = _changesMask; - if (ignoreChangesMask) - changesMask.SetAll(); - - data.WriteBits(changesMask.GetBlock(0), 4); - - data.FlushBits(); - if (changesMask[0]) - { - if (changesMask[1]) - { - data << int32(TargetType); - } - if (changesMask[2]) - { - data << int32(TargetID); - } - if (changesMask[3]) - { - data << int32(CollectableSourceInfoID); - } - } -} - -void CollectableSourceTrackedData::ClearChangesMask() -{ - Base::ClearChangesMask(TargetType); - Base::ClearChangesMask(TargetID); - Base::ClearChangesMask(CollectableSourceInfoID); - _changesMask.ResetAll(); -} - void Research::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const { data << int16(ResearchProjectID); @@ -4066,7 +3031,7 @@ bool Research::operator==(Research const& right) const void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Player const* owner, Player const* receiver) const { - for (uint32 i = 0; i < 227; ++i) + for (uint32 i = 0; i < 141; ++i) { data << InvSlots[i]; } @@ -4081,6 +3046,10 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f data << int32(CharacterPoints); data << int32(MaxTalentTiers); data << uint32(TrackCreatureMask); + for (uint32 i = 0; i < 2; ++i) + { + data << uint32(TrackResourceMask[i]); + } data << float(MainhandExpertise); data << float(OffhandExpertise); data << float(RangedExpertise); @@ -4093,7 +3062,13 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f data << float(CritPercentage); data << float(RangedCritPercentage); data << float(OffhandCritPercentage); - data << float(SpellCritPercentage); + for (uint32 i = 0; i < 7; ++i) + { + data << float(SpellCritPercentage[i]); + data << int32(ModDamageDonePos[i]); + data << int32(ModDamageDoneNeg[i]); + data << float(ModDamageDonePercent[i]); + } data << int32(ShieldBlock); data << float(ShieldBlockCritPercentage); data << float(Mastery); @@ -4116,15 +3091,9 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f { RestInfo[i].WriteCreate(data, owner, receiver); } - for (uint32 i = 0; i < 7; ++i) - { - data << int32(ModDamageDonePos[i]); - data << int32(ModDamageDoneNeg[i]); - data << float(ModDamageDonePercent[i]); - data << float(ModHealingDonePercent[i]); - } data << int32(ModHealingDonePos); data << float(ModHealingPercent); + data << float(ModHealingDonePercent); data << float(ModPeriodicHealingDonePercent); for (uint32 i = 0; i < 3; ++i) { @@ -4142,6 +3111,7 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f data << uint8(MultiActionBars); data << uint8(LifetimeMaxRank); data << uint8(NumRespecs); + data << int32(AmmoID); data << uint32(PvpMedals); for (uint32 i = 0; i < 12; ++i) { @@ -4149,14 +3119,25 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f data << int64(BuybackTimestamp[i]); } data << uint16(TodayHonorableKills); + data << uint16(TodayDishonorableKills); data << uint16(YesterdayHonorableKills); + data << uint16(YesterdayDishonorableKills); + data << uint16(LastWeekHonorableKills); + data << uint16(LastWeekDishonorableKills); + data << uint16(ThisWeekHonorableKills); + data << uint16(ThisWeekDishonorableKills); + data << uint32(ThisWeekContribution); data << uint32(LifetimeHonorableKills); + data << uint32(LifetimeDishonorableKills); + data << uint32(Field_F24); + data << uint32(YesterdayContribution); + data << uint32(LastWeekContribution); + data << uint32(LastWeekRank); data << int32(WatchedFactionIndex); for (uint32 i = 0; i < 32; ++i) { data << int32(CombatRatings[i]); } - data << uint32(PvpInfo.size()); data << int32(MaxLevel); data << int32(ScalingPlayerLevelDelta); data << int32(MaxCreatureScalingLevel); @@ -4173,15 +3154,14 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f data << float(UiSpellHitModifier); data << int32(HomeRealmTimeOffset); data << float(ModPetHaste); - data << int8(JailersTowerLevelMax); - data << int8(JailersTowerLevel); data << uint8(LocalRegenFlags); data << uint8(AuraVision); data << uint8(NumBackpackSlots); data << int32(OverrideSpellsID); + data << int32(LfgBonusFactionID); data << uint16(LootSpecID); data << uint32(OverrideZonePVPType); - for (uint32 i = 0; i < 5; ++i) + for (uint32 i = 0; i < 4; ++i) { data << uint32(BagSlotFlags[i]); } @@ -4195,8 +3175,11 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f } data << int32(Honor); data << int32(HonorNextLevel); + data << int32(Field_F74); + data << int32(PvpTierMaxFromWins); + data << int32(PvpLastWeeksTierMaxFromWins); + data << uint8(PvpRankProgress); data << int32(PerksProgramCurrency); - data << uint8(NumBankSlots); for (uint32 i = 0; i < 1; ++i) { data << uint32(ResearchSites[i].size()); @@ -4217,46 +3200,30 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f } data << uint32(DailyQuestsCompleted.size()); data << uint32(AvailableQuestLineXQuestIDs.size()); + data << uint32(Field_1000.size()); data << uint32(Heirlooms.size()); data << uint32(HeirloomFlags.size()); data << uint32(Toys.size()); - data << uint32(ToyFlags.size()); data << uint32(Transmog.size()); data << uint32(ConditionalTransmog.size()); data << uint32(SelfResSpells.size()); - data << uint32(RuneforgePowers.size()); - data << uint32(TransmogIllusions.size()); data << uint32(CharacterRestrictions.size()); data << uint32(SpellPctModByLabel.size()); data << uint32(SpellFlatModByLabel.size()); - data << uint32(MawPowers.size()); - data << uint32(MultiFloorExploration.size()); - data << uint32(RecipeProgression.size()); - data << uint32(ReplayedQuests.size()); data << uint32(TaskQuests.size()); - data << uint32(DisabledSpells.size()); - data << int32(UiChromieTimeExpansionID); data << int32(TransportServerTime); - data << uint32(WeeklyRewardsPeriodSinceOrigin); - data << int16(DEBUGSoulbindConduitRank); data << uint32(TraitConfigs.size()); data << uint32(ActiveCombatTraitConfigID); - data << uint32(CraftingOrders.size()); - data << uint32(PersonalCraftingOrderCounts.size()); + for (uint32 i = 0; i < 9; ++i) + { + data << uint32(GlyphSlots[i]); + data << uint32(Glyphs[i]); + } + data << uint8(GlyphsEnabled); + data << uint8(LfgRoles); data << uint32(CategoryCooldownMods.size()); data << uint32(WeeklySpellUses.size()); - for (uint32 i = 0; i < 17; ++i) - { - data << float(ItemUpgradeHighWatermark[i]); - } - data << int32(ItemUpgradeHighOnehandWeaponItemID); - data << int32(ItemUpgradeHighFingerItemID); - data << float(ItemUpgradeHighFingerWatermark); - data << int32(ItemUpgradeHighTrinketItemID); - data << float(ItemUpgradeHighTrinketWatermark); - data << uint64(LootHistoryInstanceID); - data << uint32(TrackedCollectableSources.size()); - data << uint8(RequiredMountCapabilityFlags); + data << uint8(NumStableSlots); for (uint32 i = 0; i < KnownTitles.size(); ++i) { data << uint64(KnownTitles[i]); @@ -4269,6 +3236,10 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f { data << int32(AvailableQuestLineXQuestIDs[i]); } + for (uint32 i = 0; i < Field_1000.size(); ++i) + { + data << int32(Field_1000[i]); + } for (uint32 i = 0; i < Heirlooms.size(); ++i) { data << int32(Heirlooms[i]); @@ -4281,10 +3252,6 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f { data << int32(Toys[i]); } - for (uint32 i = 0; i < ToyFlags.size(); ++i) - { - data << uint32(ToyFlags[i]); - } for (uint32 i = 0; i < Transmog.size(); ++i) { data << uint32(Transmog[i]); @@ -4297,14 +3264,6 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f { data << int32(SelfResSpells[i]); } - for (uint32 i = 0; i < RuneforgePowers.size(); ++i) - { - data << uint32(RuneforgePowers[i]); - } - for (uint32 i = 0; i < TransmogIllusions.size(); ++i) - { - data << uint32(TransmogIllusions[i]); - } for (uint32 i = 0; i < SpellPctModByLabel.size(); ++i) { SpellPctModByLabel[i].WriteCreate(data, owner, receiver); @@ -4313,34 +3272,10 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f { SpellFlatModByLabel[i].WriteCreate(data, owner, receiver); } - for (uint32 i = 0; i < MawPowers.size(); ++i) - { - MawPowers[i].WriteCreate(data, owner, receiver); - } - for (uint32 i = 0; i < MultiFloorExploration.size(); ++i) - { - MultiFloorExploration[i].WriteCreate(data, owner, receiver); - } - for (uint32 i = 0; i < RecipeProgression.size(); ++i) - { - RecipeProgression[i].WriteCreate(data, owner, receiver); - } - for (uint32 i = 0; i < ReplayedQuests.size(); ++i) - { - ReplayedQuests[i].WriteCreate(data, owner, receiver); - } for (uint32 i = 0; i < TaskQuests.size(); ++i) { TaskQuests[i].WriteCreate(data, owner, receiver); } - for (uint32 i = 0; i < DisabledSpells.size(); ++i) - { - data << int32(DisabledSpells[i]); - } - for (uint32 i = 0; i < PersonalCraftingOrderCounts.size(); ++i) - { - PersonalCraftingOrderCounts[i].WriteCreate(data, owner, receiver); - } for (uint32 i = 0; i < CategoryCooldownMods.size(); ++i) { CategoryCooldownMods[i].WriteCreate(data, owner, receiver); @@ -4349,32 +3284,17 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f { WeeklySpellUses[i].WriteCreate(data, owner, receiver); } - for (uint32 i = 0; i < TrackedCollectableSources.size(); ++i) + for (uint32 i = 0; i < 9; ++i) { - TrackedCollectableSources[i].WriteCreate(data, owner, receiver); + PvpInfo[i].WriteCreate(data, owner, receiver); } data.FlushBits(); - data.WriteBit(BackpackAutoSortDisabled); - data.WriteBit(BackpackSellJunkDisabled); - data.WriteBit(BankAutoSortDisabled); data.WriteBit(SortBagsRightToLeft); data.WriteBit(InsertItemsLeftToRight); - data.WriteBit(HasPerksProgramPendingReward); - data.WriteBits(QuestSession.has_value(), 1); data.WriteBits(PetStable.has_value(), 1); data.FlushBits(); ResearchHistory->WriteCreate(data, owner, receiver); - if (QuestSession.has_value()) - { - QuestSession->WriteCreate(data, owner, receiver); - } data << FrozenPerksVendorItem; - Field_1410->WriteCreate(data, owner, receiver); - data << DungeonScore; - for (uint32 i = 0; i < PvpInfo.size(); ++i) - { - PvpInfo[i].WriteCreate(data, owner, receiver); - } for (uint32 i = 0; i < CharacterRestrictions.size(); ++i) { CharacterRestrictions[i].WriteCreate(data, owner, receiver); @@ -4383,10 +3303,6 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f { TraitConfigs[i].WriteCreate(data, owner, receiver); } - for (uint32 i = 0; i < CraftingOrders.size(); ++i) - { - CraftingOrders[i].WriteCreate(data, owner, receiver); - } if (PetStable.has_value()) { PetStable->WriteCreate(data, owner, receiver); @@ -4403,8 +3319,8 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo { for (uint32 i = 0; i < 1; ++i) data << uint32(changesMask.GetBlocksMask(i)); - data.WriteBits(changesMask.GetBlocksMask(1), 14); - for (uint32 i = 0; i < 46; ++i) + data.WriteBits(changesMask.GetBlocksMask(1), 11); + for (uint32 i = 0; i < 43; ++i) if (changesMask.GetBlock(i)) data.WriteBits(changesMask.GetBlock(i), 32); @@ -4412,29 +3328,13 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo { if (changesMask[1]) { - data.WriteBit(BackpackAutoSortDisabled); - } - if (changesMask[2]) - { - data.WriteBit(BackpackSellJunkDisabled); - } - if (changesMask[3]) - { - data.WriteBit(BankAutoSortDisabled); - } - if (changesMask[4]) - { data.WriteBit(SortBagsRightToLeft); } - if (changesMask[5]) + if (changesMask[2]) { data.WriteBit(InsertItemsLeftToRight); } - if (changesMask[6]) - { - data.WriteBit(HasPerksProgramPendingReward); - } - if (changesMask[7]) + if (changesMask[3]) { if (!ignoreNestedChangesMask) KnownTitles.WriteUpdateMask(data); @@ -4442,11 +3342,11 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo WriteCompleteDynamicFieldUpdateMask(KnownTitles.size(), data); } } - if (changesMask[36]) + if (changesMask[20]) { for (uint32 i = 0; i < 8; ++i) { - if (changesMask[37]) + if (changesMask[21]) { if (!ignoreNestedChangesMask) DataFlags[i].WriteUpdateMask(data); @@ -4455,11 +3355,11 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[36]) + if (changesMask[20]) { for (uint32 i = 0; i < 8; ++i) { - if (changesMask[37]) + if (changesMask[21]) { for (uint32 j = 0; j < DataFlags[i].size(); ++j) { @@ -4471,21 +3371,11 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[0]) - { - if (changesMask[8]) - { - if (!ignoreNestedChangesMask) - PvpInfo.WriteUpdateMask(data); - else - WriteCompleteDynamicFieldUpdateMask(PvpInfo.size(), data); - } - } - if (changesMask[38]) + if (changesMask[22]) { for (uint32 i = 0; i < 1; ++i) { - if (changesMask[39]) + if (changesMask[23]) { if (!ignoreNestedChangesMask) ResearchSites[i].WriteUpdateMask(data); @@ -4494,11 +3384,11 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[40]) + if (changesMask[24]) { for (uint32 i = 0; i < 1; ++i) { - if (changesMask[41]) + if (changesMask[25]) { if (!ignoreNestedChangesMask) ResearchSiteProgress[i].WriteUpdateMask(data); @@ -4507,11 +3397,11 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[42]) + if (changesMask[26]) { for (uint32 i = 0; i < 1; ++i) { - if (changesMask[43]) + if (changesMask[27]) { if (!ignoreNestedChangesMask) Research[i].WriteUpdateMask(data); @@ -4520,11 +3410,11 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[38]) + if (changesMask[22]) { for (uint32 i = 0; i < 1; ++i) { - if (changesMask[39]) + if (changesMask[23]) { for (uint32 j = 0; j < ResearchSites[i].size(); ++j) { @@ -4536,11 +3426,11 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[40]) + if (changesMask[24]) { for (uint32 i = 0; i < 1; ++i) { - if (changesMask[41]) + if (changesMask[25]) { for (uint32 j = 0; j < ResearchSiteProgress[i].size(); ++j) { @@ -4552,11 +3442,11 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[42]) + if (changesMask[26]) { for (uint32 i = 0; i < 1; ++i) { - if (changesMask[43]) + if (changesMask[27]) { for (uint32 j = 0; j < Research[i].size(); ++j) { @@ -4571,196 +3461,123 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo data.FlushBits(); if (changesMask[0]) { - if (changesMask[9]) + if (changesMask[4]) { if (!ignoreNestedChangesMask) DailyQuestsCompleted.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(DailyQuestsCompleted.size(), data); } - if (changesMask[10]) + if (changesMask[5]) { if (!ignoreNestedChangesMask) AvailableQuestLineXQuestIDs.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(AvailableQuestLineXQuestIDs.size(), data); } - if (changesMask[11]) + if (changesMask[6]) + { + if (!ignoreNestedChangesMask) + Field_1000.WriteUpdateMask(data); + else + WriteCompleteDynamicFieldUpdateMask(Field_1000.size(), data); + } + if (changesMask[7]) { if (!ignoreNestedChangesMask) Heirlooms.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(Heirlooms.size(), data); } - if (changesMask[12]) + if (changesMask[8]) { if (!ignoreNestedChangesMask) HeirloomFlags.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(HeirloomFlags.size(), data); } - if (changesMask[13]) + if (changesMask[9]) { if (!ignoreNestedChangesMask) Toys.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(Toys.size(), data); } - if (changesMask[14]) - { - if (!ignoreNestedChangesMask) - ToyFlags.WriteUpdateMask(data); - else - WriteCompleteDynamicFieldUpdateMask(ToyFlags.size(), data); - } - if (changesMask[15]) + if (changesMask[10]) { if (!ignoreNestedChangesMask) Transmog.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(Transmog.size(), data); } - if (changesMask[16]) + if (changesMask[11]) { if (!ignoreNestedChangesMask) ConditionalTransmog.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(ConditionalTransmog.size(), data); } - if (changesMask[17]) + if (changesMask[12]) { if (!ignoreNestedChangesMask) SelfResSpells.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(SelfResSpells.size(), data); } - if (changesMask[18]) - { - if (!ignoreNestedChangesMask) - RuneforgePowers.WriteUpdateMask(data); - else - WriteCompleteDynamicFieldUpdateMask(RuneforgePowers.size(), data); - } - if (changesMask[19]) - { - if (!ignoreNestedChangesMask) - TransmogIllusions.WriteUpdateMask(data); - else - WriteCompleteDynamicFieldUpdateMask(TransmogIllusions.size(), data); - } - if (changesMask[20]) + if (changesMask[13]) { if (!ignoreNestedChangesMask) CharacterRestrictions.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(CharacterRestrictions.size(), data); } - if (changesMask[21]) + if (changesMask[14]) { if (!ignoreNestedChangesMask) SpellPctModByLabel.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(SpellPctModByLabel.size(), data); } - if (changesMask[22]) + if (changesMask[15]) { if (!ignoreNestedChangesMask) SpellFlatModByLabel.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(SpellFlatModByLabel.size(), data); } - if (changesMask[23]) - { - if (!ignoreNestedChangesMask) - MawPowers.WriteUpdateMask(data); - else - WriteCompleteDynamicFieldUpdateMask(MawPowers.size(), data); - } - if (changesMask[24]) - { - if (!ignoreNestedChangesMask) - MultiFloorExploration.WriteUpdateMask(data); - else - WriteCompleteDynamicFieldUpdateMask(MultiFloorExploration.size(), data); - } - if (changesMask[25]) - { - if (!ignoreNestedChangesMask) - RecipeProgression.WriteUpdateMask(data); - else - WriteCompleteDynamicFieldUpdateMask(RecipeProgression.size(), data); - } - if (changesMask[26]) - { - if (!ignoreNestedChangesMask) - ReplayedQuests.WriteUpdateMask(data); - else - WriteCompleteDynamicFieldUpdateMask(ReplayedQuests.size(), data); - } - if (changesMask[27]) + if (changesMask[16]) { if (!ignoreNestedChangesMask) TaskQuests.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(TaskQuests.size(), data); } - if (changesMask[28]) - { - if (!ignoreNestedChangesMask) - DisabledSpells.WriteUpdateMask(data); - else - WriteCompleteDynamicFieldUpdateMask(DisabledSpells.size(), data); - } - if (changesMask[29]) + if (changesMask[17]) { if (!ignoreNestedChangesMask) TraitConfigs.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(TraitConfigs.size(), data); } - if (changesMask[30]) - { - if (!ignoreNestedChangesMask) - CraftingOrders.WriteUpdateMask(data); - else - WriteCompleteDynamicFieldUpdateMask(CraftingOrders.size(), data); - } - if (changesMask[31]) - { - if (!ignoreNestedChangesMask) - PersonalCraftingOrderCounts.WriteUpdateMask(data); - else - WriteCompleteDynamicFieldUpdateMask(PersonalCraftingOrderCounts.size(), data); - } - } - if (changesMask[32]) - { - if (changesMask[33]) + if (changesMask[18]) { if (!ignoreNestedChangesMask) CategoryCooldownMods.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(CategoryCooldownMods.size(), data); } - if (changesMask[34]) + if (changesMask[19]) { if (!ignoreNestedChangesMask) WeeklySpellUses.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(WeeklySpellUses.size(), data); } - if (changesMask[35]) - { - if (!ignoreNestedChangesMask) - TrackedCollectableSources.WriteUpdateMask(data); - else - WriteCompleteDynamicFieldUpdateMask(TrackedCollectableSources.size(), data); - } } data.FlushBits(); if (changesMask[0]) { - if (changesMask[7]) + if (changesMask[3]) { for (uint32 i = 0; i < KnownTitles.size(); ++i) { @@ -4770,7 +3587,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[9]) + if (changesMask[4]) { for (uint32 i = 0; i < DailyQuestsCompleted.size(); ++i) { @@ -4780,7 +3597,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[10]) + if (changesMask[5]) { for (uint32 i = 0; i < AvailableQuestLineXQuestIDs.size(); ++i) { @@ -4790,7 +3607,17 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[11]) + if (changesMask[6]) + { + for (uint32 i = 0; i < Field_1000.size(); ++i) + { + if (Field_1000.HasChanged(i) || ignoreNestedChangesMask) + { + data << int32(Field_1000[i]); + } + } + } + if (changesMask[7]) { for (uint32 i = 0; i < Heirlooms.size(); ++i) { @@ -4800,7 +3627,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[12]) + if (changesMask[8]) { for (uint32 i = 0; i < HeirloomFlags.size(); ++i) { @@ -4810,7 +3637,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[13]) + if (changesMask[9]) { for (uint32 i = 0; i < Toys.size(); ++i) { @@ -4820,17 +3647,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[14]) - { - for (uint32 i = 0; i < ToyFlags.size(); ++i) - { - if (ToyFlags.HasChanged(i) || ignoreNestedChangesMask) - { - data << uint32(ToyFlags[i]); - } - } - } - if (changesMask[15]) + if (changesMask[10]) { for (uint32 i = 0; i < Transmog.size(); ++i) { @@ -4840,7 +3657,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[16]) + if (changesMask[11]) { for (uint32 i = 0; i < ConditionalTransmog.size(); ++i) { @@ -4850,7 +3667,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[17]) + if (changesMask[12]) { for (uint32 i = 0; i < SelfResSpells.size(); ++i) { @@ -4860,27 +3677,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[18]) - { - for (uint32 i = 0; i < RuneforgePowers.size(); ++i) - { - if (RuneforgePowers.HasChanged(i) || ignoreNestedChangesMask) - { - data << uint32(RuneforgePowers[i]); - } - } - } - if (changesMask[19]) - { - for (uint32 i = 0; i < TransmogIllusions.size(); ++i) - { - if (TransmogIllusions.HasChanged(i) || ignoreNestedChangesMask) - { - data << uint32(TransmogIllusions[i]); - } - } - } - if (changesMask[21]) + if (changesMask[14]) { for (uint32 i = 0; i < SpellPctModByLabel.size(); ++i) { @@ -4890,7 +3687,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[22]) + if (changesMask[15]) { for (uint32 i = 0; i < SpellFlatModByLabel.size(); ++i) { @@ -4900,527 +3697,447 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[23]) + if (changesMask[16]) { - for (uint32 i = 0; i < MawPowers.size(); ++i) + for (uint32 i = 0; i < TaskQuests.size(); ++i) { - if (MawPowers.HasChanged(i) || ignoreNestedChangesMask) + if (TaskQuests.HasChanged(i) || ignoreNestedChangesMask) { - MawPowers[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + TaskQuests[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } } - if (changesMask[24]) + if (changesMask[18]) { - for (uint32 i = 0; i < MultiFloorExploration.size(); ++i) + for (uint32 i = 0; i < CategoryCooldownMods.size(); ++i) { - if (MultiFloorExploration.HasChanged(i) || ignoreNestedChangesMask) + if (CategoryCooldownMods.HasChanged(i) || ignoreNestedChangesMask) { - MultiFloorExploration[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + CategoryCooldownMods[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } } - if (changesMask[25]) + if (changesMask[19]) { - for (uint32 i = 0; i < RecipeProgression.size(); ++i) + for (uint32 i = 0; i < WeeklySpellUses.size(); ++i) { - if (RecipeProgression.HasChanged(i) || ignoreNestedChangesMask) + if (WeeklySpellUses.HasChanged(i) || ignoreNestedChangesMask) { - RecipeProgression[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + WeeklySpellUses[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } } - if (changesMask[26]) + if (changesMask[13]) { - for (uint32 i = 0; i < ReplayedQuests.size(); ++i) + for (uint32 i = 0; i < CharacterRestrictions.size(); ++i) { - if (ReplayedQuests.HasChanged(i) || ignoreNestedChangesMask) + if (CharacterRestrictions.HasChanged(i) || ignoreNestedChangesMask) { - ReplayedQuests[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + CharacterRestrictions[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } } - if (changesMask[27]) + if (changesMask[17]) { - for (uint32 i = 0; i < TaskQuests.size(); ++i) + for (uint32 i = 0; i < TraitConfigs.size(); ++i) { - if (TaskQuests.HasChanged(i) || ignoreNestedChangesMask) + if (TraitConfigs.HasChanged(i) || ignoreNestedChangesMask) { - TaskQuests[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + TraitConfigs[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } } if (changesMask[28]) { - for (uint32 i = 0; i < DisabledSpells.size(); ++i) - { - if (DisabledSpells.HasChanged(i) || ignoreNestedChangesMask) - { - data << int32(DisabledSpells[i]); - } - } + data << FarsightObject; + } + if (changesMask[29]) + { + data << SummonedBattlePetGUID; + } + if (changesMask[30]) + { + data << uint64(Coinage); } if (changesMask[31]) { - for (uint32 i = 0; i < PersonalCraftingOrderCounts.size(); ++i) - { - if (PersonalCraftingOrderCounts.HasChanged(i) || ignoreNestedChangesMask) - { - PersonalCraftingOrderCounts[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); - } - } + data << int32(XP); + } + if (changesMask[32]) + { + data << int32(NextLevelXP); } - } - if (changesMask[32]) - { if (changesMask[33]) { - for (uint32 i = 0; i < CategoryCooldownMods.size(); ++i) - { - if (CategoryCooldownMods.HasChanged(i) || ignoreNestedChangesMask) - { - CategoryCooldownMods[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); - } - } + data << int32(TrialXP); } if (changesMask[34]) { - for (uint32 i = 0; i < WeeklySpellUses.size(); ++i) - { - if (WeeklySpellUses.HasChanged(i) || ignoreNestedChangesMask) - { - WeeklySpellUses[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); - } - } + Skill->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } if (changesMask[35]) { - for (uint32 i = 0; i < TrackedCollectableSources.size(); ++i) - { - if (TrackedCollectableSources.HasChanged(i) || ignoreNestedChangesMask) - { - TrackedCollectableSources[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); - } - } + data << int32(CharacterPoints); } - } - if (changesMask[0]) - { - if (changesMask[8]) + if (changesMask[36]) { - for (uint32 i = 0; i < PvpInfo.size(); ++i) - { - if (PvpInfo.HasChanged(i) || ignoreNestedChangesMask) - { - PvpInfo[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); - } - } + data << int32(MaxTalentTiers); } - if (changesMask[20]) + if (changesMask[37]) { - for (uint32 i = 0; i < CharacterRestrictions.size(); ++i) - { - if (CharacterRestrictions.HasChanged(i) || ignoreNestedChangesMask) - { - CharacterRestrictions[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); - } - } + data << uint32(TrackCreatureMask); } - if (changesMask[29]) + if (changesMask[38]) { - for (uint32 i = 0; i < TraitConfigs.size(); ++i) - { - if (TraitConfigs.HasChanged(i) || ignoreNestedChangesMask) - { - TraitConfigs[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); - } - } + data << float(MainhandExpertise); } - if (changesMask[30]) + if (changesMask[39]) { - for (uint32 i = 0; i < CraftingOrders.size(); ++i) - { - if (CraftingOrders.HasChanged(i) || ignoreNestedChangesMask) - { - CraftingOrders[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); - } - } + data << float(OffhandExpertise); } } - if (changesMask[32]) + if (changesMask[40]) { + if (changesMask[41]) + { + data << float(RangedExpertise); + } + if (changesMask[42]) + { + data << float(CombatRatingExpertise); + } + if (changesMask[43]) + { + data << float(BlockPercentage); + } if (changesMask[44]) { - data << FarsightObject; + data << float(DodgePercentage); } if (changesMask[45]) { - data << SummonedBattlePetGUID; + data << float(DodgePercentageFromAttribute); } if (changesMask[46]) { - data << uint64(Coinage); + data << float(ParryPercentage); } if (changesMask[47]) { - data << int32(XP); + data << float(ParryPercentageFromAttribute); } if (changesMask[48]) { - data << int32(NextLevelXP); + data << float(CritPercentage); } if (changesMask[49]) { - data << int32(TrialXP); + data << float(RangedCritPercentage); } if (changesMask[50]) { - Skill->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + data << float(OffhandCritPercentage); } if (changesMask[51]) { - data << int32(CharacterPoints); + data << int32(ShieldBlock); } if (changesMask[52]) { - data << int32(MaxTalentTiers); + data << float(ShieldBlockCritPercentage); } if (changesMask[53]) { - data << uint32(TrackCreatureMask); + data << float(Mastery); } if (changesMask[54]) { - data << float(MainhandExpertise); + data << float(Speed); } if (changesMask[55]) { - data << float(OffhandExpertise); + data << float(Avoidance); } if (changesMask[56]) { - data << float(RangedExpertise); + data << float(Sturdiness); } if (changesMask[57]) { - data << float(CombatRatingExpertise); + data << int32(Versatility); } if (changesMask[58]) { - data << float(BlockPercentage); + data << float(VersatilityBonus); } if (changesMask[59]) { - data << float(DodgePercentage); + data << float(PvpPowerDamage); } if (changesMask[60]) { - data << float(DodgePercentageFromAttribute); + data << float(PvpPowerHealing); } if (changesMask[61]) { - data << float(ParryPercentage); + data << int32(ModHealingDonePos); } if (changesMask[62]) { - data << float(ParryPercentageFromAttribute); + data << float(ModHealingPercent); } if (changesMask[63]) { - data << float(CritPercentage); + data << float(ModHealingDonePercent); } if (changesMask[64]) { - data << float(RangedCritPercentage); + data << float(ModPeriodicHealingDonePercent); } if (changesMask[65]) { - data << float(OffhandCritPercentage); + data << float(ModSpellPowerPercent); } if (changesMask[66]) { - data << float(SpellCritPercentage); + data << float(ModResiliencePercent); } if (changesMask[67]) { - data << int32(ShieldBlock); + data << float(OverrideSpellPowerByAPPercent); } if (changesMask[68]) { - data << float(ShieldBlockCritPercentage); + data << float(OverrideAPBySpellPowerPercent); } if (changesMask[69]) { - data << float(Mastery); + data << int32(ModTargetResistance); } if (changesMask[70]) { - data << float(Speed); + data << int32(ModTargetPhysicalResistance); } if (changesMask[71]) { - data << float(Avoidance); + data << uint32(LocalFlags); } } if (changesMask[72]) { if (changesMask[73]) { - data << float(Sturdiness); + data << uint8(GrantableLevels); } if (changesMask[74]) { - data << int32(Versatility); + data << uint8(MultiActionBars); } if (changesMask[75]) { - data << float(VersatilityBonus); + data << uint8(LifetimeMaxRank); } if (changesMask[76]) { - data << float(PvpPowerDamage); + data << uint8(NumRespecs); } if (changesMask[77]) { - data << float(PvpPowerHealing); + data << int32(AmmoID); } if (changesMask[78]) { - data << int32(ModHealingDonePos); + data << uint32(PvpMedals); } if (changesMask[79]) { - data << float(ModHealingPercent); + data << uint16(TodayHonorableKills); } if (changesMask[80]) { - data << float(ModPeriodicHealingDonePercent); + data << uint16(TodayDishonorableKills); } if (changesMask[81]) { - data << float(ModSpellPowerPercent); + data << uint16(YesterdayHonorableKills); } if (changesMask[82]) { - data << float(ModResiliencePercent); + data << uint16(YesterdayDishonorableKills); } if (changesMask[83]) { - data << float(OverrideSpellPowerByAPPercent); + data << uint16(LastWeekHonorableKills); } if (changesMask[84]) { - data << float(OverrideAPBySpellPowerPercent); + data << uint16(LastWeekDishonorableKills); } if (changesMask[85]) { - data << int32(ModTargetResistance); + data << uint16(ThisWeekHonorableKills); } if (changesMask[86]) { - data << int32(ModTargetPhysicalResistance); + data << uint16(ThisWeekDishonorableKills); } if (changesMask[87]) { - data << uint32(LocalFlags); + data << uint32(ThisWeekContribution); } if (changesMask[88]) { - data << uint8(GrantableLevels); + data << uint32(LifetimeHonorableKills); } if (changesMask[89]) { - data << uint8(MultiActionBars); + data << uint32(LifetimeDishonorableKills); } if (changesMask[90]) { - data << uint8(LifetimeMaxRank); + data << uint32(Field_F24); } if (changesMask[91]) { - data << uint8(NumRespecs); + data << uint32(YesterdayContribution); } if (changesMask[92]) { - data << uint32(PvpMedals); + data << uint32(LastWeekContribution); } if (changesMask[93]) { - data << uint16(TodayHonorableKills); + data << uint32(LastWeekRank); } if (changesMask[94]) { - data << uint16(YesterdayHonorableKills); + data << int32(WatchedFactionIndex); } if (changesMask[95]) { - data << uint32(LifetimeHonorableKills); + data << int32(MaxLevel); } if (changesMask[96]) { - data << int32(WatchedFactionIndex); + data << int32(ScalingPlayerLevelDelta); } if (changesMask[97]) { - data << int32(MaxLevel); + data << int32(MaxCreatureScalingLevel); } if (changesMask[98]) { - data << int32(ScalingPlayerLevelDelta); + data << int32(PetSpellPower); } if (changesMask[99]) { - data << int32(MaxCreatureScalingLevel); + data << float(UiHitModifier); } if (changesMask[100]) { - data << int32(PetSpellPower); + data << float(UiSpellHitModifier); } if (changesMask[101]) { - data << float(UiHitModifier); + data << int32(HomeRealmTimeOffset); } if (changesMask[102]) { - data << float(UiSpellHitModifier); + data << float(ModPetHaste); } if (changesMask[103]) { - data << int32(HomeRealmTimeOffset); + data << uint8(LocalRegenFlags); } } if (changesMask[104]) { if (changesMask[105]) { - data << float(ModPetHaste); + data << uint8(AuraVision); } if (changesMask[106]) { - data << int8(JailersTowerLevelMax); + data << uint8(NumBackpackSlots); } if (changesMask[107]) { - data << int8(JailersTowerLevel); + data << int32(OverrideSpellsID); } if (changesMask[108]) { - data << uint8(LocalRegenFlags); + data << int32(LfgBonusFactionID); } if (changesMask[109]) { - data << uint8(AuraVision); + data << uint16(LootSpecID); } if (changesMask[110]) { - data << uint8(NumBackpackSlots); + data << uint32(OverrideZonePVPType); } if (changesMask[111]) { - data << int32(OverrideSpellsID); + data << int32(Honor); } if (changesMask[112]) { - data << uint16(LootSpecID); + data << int32(HonorNextLevel); } if (changesMask[113]) { - data << uint32(OverrideZonePVPType); + data << int32(Field_F74); } if (changesMask[114]) { - data << int32(Honor); + data << int32(PvpTierMaxFromWins); } if (changesMask[115]) { - data << int32(HonorNextLevel); + data << int32(PvpLastWeeksTierMaxFromWins); } if (changesMask[116]) { - data << int32(PerksProgramCurrency); + data << uint8(PvpRankProgress); } if (changesMask[117]) { - data << uint8(NumBankSlots); - } - if (changesMask[122]) - { - data << int32(UiChromieTimeExpansionID); + data << int32(PerksProgramCurrency); } - if (changesMask[123]) + if (changesMask[120]) { data << int32(TransportServerTime); } - if (changesMask[124]) - { - data << uint32(WeeklyRewardsPeriodSinceOrigin); - } - if (changesMask[125]) - { - data << int16(DEBUGSoulbindConduitRank); - } - if (changesMask[127]) + if (changesMask[121]) { data << uint32(ActiveCombatTraitConfigID); } - if (changesMask[128]) - { - data << int32(ItemUpgradeHighOnehandWeaponItemID); - } - if (changesMask[129]) - { - data << int32(ItemUpgradeHighFingerItemID); - } - if (changesMask[130]) - { - data << float(ItemUpgradeHighFingerWatermark); - } - if (changesMask[131]) - { - data << int32(ItemUpgradeHighTrinketItemID); - } - if (changesMask[132]) + if (changesMask[122]) { - data << float(ItemUpgradeHighTrinketWatermark); + data << uint8(GlyphsEnabled); } - if (changesMask[133]) + if (changesMask[123]) { - data << uint64(LootHistoryInstanceID); + data << uint8(LfgRoles); } - if (changesMask[135]) + if (changesMask[125]) { - data << uint8(RequiredMountCapabilityFlags); + data << uint8(NumStableSlots); } - data.WriteBits(QuestSession.has_value(), 1); - data.WriteBits(PetStable.has_value(), 1); } data.FlushBits(); if (changesMask[104]) { + data.WriteBits(PetStable.has_value(), 1); if (changesMask[118]) { ResearchHistory->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } - if (changesMask[120]) - { - if (QuestSession.has_value()) - { - QuestSession->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); - } - } if (changesMask[119]) { data << FrozenPerksVendorItem; } - if (changesMask[121]) - { - Field_1410->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); - } - if (changesMask[126]) - { - data << DungeonScore; - } - if (changesMask[134]) + if (changesMask[124]) { if (PetStable.has_value()) { @@ -5428,143 +4145,167 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[136]) + if (changesMask[126]) { - for (uint32 i = 0; i < 227; ++i) + for (uint32 i = 0; i < 141; ++i) { - if (changesMask[137 + i]) + if (changesMask[127 + i]) { data << InvSlots[i]; } } } - if (changesMask[364]) + if (changesMask[268]) { for (uint32 i = 0; i < 2; ++i) { - if (changesMask[365 + i]) + if (changesMask[269 + i]) { - RestInfo[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + data << uint32(TrackResourceMask[i]); } } } - if (changesMask[367]) + if (changesMask[271]) { for (uint32 i = 0; i < 7; ++i) { - if (changesMask[368 + i]) + if (changesMask[272 + i]) + { + data << float(SpellCritPercentage[i]); + } + if (changesMask[279 + i]) { data << int32(ModDamageDonePos[i]); } - if (changesMask[375 + i]) + if (changesMask[286 + i]) { data << int32(ModDamageDoneNeg[i]); } - if (changesMask[382 + i]) + if (changesMask[293 + i]) { data << float(ModDamageDonePercent[i]); } - if (changesMask[389 + i]) + } + } + if (changesMask[300]) + { + for (uint32 i = 0; i < 2; ++i) + { + if (changesMask[301 + i]) { - data << float(ModHealingDonePercent[i]); + RestInfo[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } } - if (changesMask[396]) + if (changesMask[303]) { for (uint32 i = 0; i < 3; ++i) { - if (changesMask[397 + i]) + if (changesMask[304 + i]) { data << float(WeaponDmgMultipliers[i]); } - if (changesMask[400 + i]) + if (changesMask[307 + i]) { data << float(WeaponAtkSpeedMultipliers[i]); } } } - if (changesMask[403]) + if (changesMask[310]) { for (uint32 i = 0; i < 12; ++i) { - if (changesMask[404 + i]) + if (changesMask[311 + i]) { data << uint32(BuybackPrice[i]); } - if (changesMask[416 + i]) + if (changesMask[323 + i]) { data << int64(BuybackTimestamp[i]); } } } - if (changesMask[428]) + if (changesMask[335]) { for (uint32 i = 0; i < 32; ++i) { - if (changesMask[429 + i]) + if (changesMask[336 + i]) { data << int32(CombatRatings[i]); } } } - if (changesMask[461]) + if (changesMask[378]) { for (uint32 i = 0; i < 4; ++i) { - if (changesMask[462 + i]) + if (changesMask[379 + i]) { data << uint32(NoReagentCostMask[i]); } } } - if (changesMask[466]) + if (changesMask[383]) { for (uint32 i = 0; i < 2; ++i) { - if (changesMask[467 + i]) + if (changesMask[384 + i]) { data << int32(ProfessionSkillLine[i]); } } } - if (changesMask[469]) + if (changesMask[386]) { - for (uint32 i = 0; i < 5; ++i) + for (uint32 i = 0; i < 4; ++i) { - if (changesMask[470 + i]) + if (changesMask[387 + i]) { data << uint32(BagSlotFlags[i]); } } } - if (changesMask[475]) + if (changesMask[391]) { for (uint32 i = 0; i < 7; ++i) { - if (changesMask[476 + i]) + if (changesMask[392 + i]) { data << uint32(BankBagSlotFlags[i]); } } } - if (changesMask[483]) + if (changesMask[399]) { for (uint32 i = 0; i < 950; ++i) { - if (changesMask[484 + i]) + if (changesMask[400 + i]) { data << uint64(QuestCompleted[i]); } } } - if (changesMask[1434]) + if (changesMask[1350]) + { + for (uint32 i = 0; i < 9; ++i) + { + if (changesMask[1351 + i]) + { + data << uint32(GlyphSlots[i]); + } + if (changesMask[1360 + i]) + { + data << uint32(Glyphs[i]); + } + } + } + if (changesMask[368]) { - for (uint32 i = 0; i < 17; ++i) + for (uint32 i = 0; i < 9; ++i) { - if (changesMask[1435 + i]) + if (changesMask[369 + i]) { - data << float(ItemUpgradeHighWatermark[i]); + PvpInfo[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } } @@ -5573,12 +4314,8 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo void ActivePlayerData::ClearChangesMask() { - Base::ClearChangesMask(BackpackAutoSortDisabled); - Base::ClearChangesMask(BackpackSellJunkDisabled); - Base::ClearChangesMask(BankAutoSortDisabled); Base::ClearChangesMask(SortBagsRightToLeft); Base::ClearChangesMask(InsertItemsLeftToRight); - Base::ClearChangesMask(HasPerksProgramPendingReward); Base::ClearChangesMask(DataFlags); Base::ClearChangesMask(ResearchSites); Base::ClearChangesMask(ResearchSiteProgress); @@ -5586,31 +4323,20 @@ void ActivePlayerData::ClearChangesMask() Base::ClearChangesMask(KnownTitles); Base::ClearChangesMask(DailyQuestsCompleted); Base::ClearChangesMask(AvailableQuestLineXQuestIDs); + Base::ClearChangesMask(Field_1000); Base::ClearChangesMask(Heirlooms); Base::ClearChangesMask(HeirloomFlags); Base::ClearChangesMask(Toys); - Base::ClearChangesMask(ToyFlags); Base::ClearChangesMask(Transmog); Base::ClearChangesMask(ConditionalTransmog); Base::ClearChangesMask(SelfResSpells); - Base::ClearChangesMask(RuneforgePowers); - Base::ClearChangesMask(TransmogIllusions); Base::ClearChangesMask(SpellPctModByLabel); Base::ClearChangesMask(SpellFlatModByLabel); - Base::ClearChangesMask(MawPowers); - Base::ClearChangesMask(MultiFloorExploration); - Base::ClearChangesMask(RecipeProgression); - Base::ClearChangesMask(ReplayedQuests); Base::ClearChangesMask(TaskQuests); - Base::ClearChangesMask(DisabledSpells); - Base::ClearChangesMask(PersonalCraftingOrderCounts); Base::ClearChangesMask(CategoryCooldownMods); Base::ClearChangesMask(WeeklySpellUses); - Base::ClearChangesMask(TrackedCollectableSources); - Base::ClearChangesMask(PvpInfo); Base::ClearChangesMask(CharacterRestrictions); Base::ClearChangesMask(TraitConfigs); - Base::ClearChangesMask(CraftingOrders); Base::ClearChangesMask(FarsightObject); Base::ClearChangesMask(SummonedBattlePetGUID); Base::ClearChangesMask(Coinage); @@ -5633,7 +4359,6 @@ void ActivePlayerData::ClearChangesMask() Base::ClearChangesMask(CritPercentage); Base::ClearChangesMask(RangedCritPercentage); Base::ClearChangesMask(OffhandCritPercentage); - Base::ClearChangesMask(SpellCritPercentage); Base::ClearChangesMask(ShieldBlock); Base::ClearChangesMask(ShieldBlockCritPercentage); Base::ClearChangesMask(Mastery); @@ -5646,6 +4371,7 @@ void ActivePlayerData::ClearChangesMask() Base::ClearChangesMask(PvpPowerHealing); Base::ClearChangesMask(ModHealingDonePos); Base::ClearChangesMask(ModHealingPercent); + Base::ClearChangesMask(ModHealingDonePercent); Base::ClearChangesMask(ModPeriodicHealingDonePercent); Base::ClearChangesMask(ModSpellPowerPercent); Base::ClearChangesMask(ModResiliencePercent); @@ -5658,10 +4384,23 @@ void ActivePlayerData::ClearChangesMask() Base::ClearChangesMask(MultiActionBars); Base::ClearChangesMask(LifetimeMaxRank); Base::ClearChangesMask(NumRespecs); + Base::ClearChangesMask(AmmoID); Base::ClearChangesMask(PvpMedals); Base::ClearChangesMask(TodayHonorableKills); + Base::ClearChangesMask(TodayDishonorableKills); Base::ClearChangesMask(YesterdayHonorableKills); + Base::ClearChangesMask(YesterdayDishonorableKills); + Base::ClearChangesMask(LastWeekHonorableKills); + Base::ClearChangesMask(LastWeekDishonorableKills); + Base::ClearChangesMask(ThisWeekHonorableKills); + Base::ClearChangesMask(ThisWeekDishonorableKills); + Base::ClearChangesMask(ThisWeekContribution); Base::ClearChangesMask(LifetimeHonorableKills); + Base::ClearChangesMask(LifetimeDishonorableKills); + Base::ClearChangesMask(Field_F24); + Base::ClearChangesMask(YesterdayContribution); + Base::ClearChangesMask(LastWeekContribution); + Base::ClearChangesMask(LastWeekRank); Base::ClearChangesMask(WatchedFactionIndex); Base::ClearChangesMask(MaxLevel); Base::ClearChangesMask(ScalingPlayerLevelDelta); @@ -5671,53 +4410,48 @@ void ActivePlayerData::ClearChangesMask() Base::ClearChangesMask(UiSpellHitModifier); Base::ClearChangesMask(HomeRealmTimeOffset); Base::ClearChangesMask(ModPetHaste); - Base::ClearChangesMask(JailersTowerLevelMax); - Base::ClearChangesMask(JailersTowerLevel); Base::ClearChangesMask(LocalRegenFlags); Base::ClearChangesMask(AuraVision); Base::ClearChangesMask(NumBackpackSlots); Base::ClearChangesMask(OverrideSpellsID); + Base::ClearChangesMask(LfgBonusFactionID); Base::ClearChangesMask(LootSpecID); Base::ClearChangesMask(OverrideZonePVPType); Base::ClearChangesMask(Honor); Base::ClearChangesMask(HonorNextLevel); + Base::ClearChangesMask(Field_F74); + Base::ClearChangesMask(PvpTierMaxFromWins); + Base::ClearChangesMask(PvpLastWeeksTierMaxFromWins); + Base::ClearChangesMask(PvpRankProgress); Base::ClearChangesMask(PerksProgramCurrency); - Base::ClearChangesMask(NumBankSlots); Base::ClearChangesMask(ResearchHistory); Base::ClearChangesMask(FrozenPerksVendorItem); - Base::ClearChangesMask(Field_1410); - Base::ClearChangesMask(QuestSession); - Base::ClearChangesMask(UiChromieTimeExpansionID); Base::ClearChangesMask(TransportServerTime); - Base::ClearChangesMask(WeeklyRewardsPeriodSinceOrigin); - Base::ClearChangesMask(DEBUGSoulbindConduitRank); - Base::ClearChangesMask(DungeonScore); Base::ClearChangesMask(ActiveCombatTraitConfigID); - Base::ClearChangesMask(ItemUpgradeHighOnehandWeaponItemID); - Base::ClearChangesMask(ItemUpgradeHighFingerItemID); - Base::ClearChangesMask(ItemUpgradeHighFingerWatermark); - Base::ClearChangesMask(ItemUpgradeHighTrinketItemID); - Base::ClearChangesMask(ItemUpgradeHighTrinketWatermark); - Base::ClearChangesMask(LootHistoryInstanceID); + Base::ClearChangesMask(GlyphsEnabled); + Base::ClearChangesMask(LfgRoles); Base::ClearChangesMask(PetStable); - Base::ClearChangesMask(RequiredMountCapabilityFlags); + Base::ClearChangesMask(NumStableSlots); Base::ClearChangesMask(InvSlots); - Base::ClearChangesMask(RestInfo); + Base::ClearChangesMask(TrackResourceMask); + Base::ClearChangesMask(SpellCritPercentage); Base::ClearChangesMask(ModDamageDonePos); Base::ClearChangesMask(ModDamageDoneNeg); Base::ClearChangesMask(ModDamageDonePercent); - Base::ClearChangesMask(ModHealingDonePercent); + Base::ClearChangesMask(RestInfo); Base::ClearChangesMask(WeaponDmgMultipliers); Base::ClearChangesMask(WeaponAtkSpeedMultipliers); Base::ClearChangesMask(BuybackPrice); Base::ClearChangesMask(BuybackTimestamp); Base::ClearChangesMask(CombatRatings); + Base::ClearChangesMask(PvpInfo); Base::ClearChangesMask(NoReagentCostMask); Base::ClearChangesMask(ProfessionSkillLine); Base::ClearChangesMask(BagSlotFlags); Base::ClearChangesMask(BankBagSlotFlags); Base::ClearChangesMask(QuestCompleted); - Base::ClearChangesMask(ItemUpgradeHighWatermark); + Base::ClearChangesMask(GlyphSlots); + Base::ClearChangesMask(Glyphs); _changesMask.ResetAll(); } @@ -5729,7 +4463,6 @@ void GameObjectData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fie data << uint32(SpawnTrackingStateAnimID); data << uint32(SpawnTrackingStateAnimKitID); data << uint32(StateWorldEffectIDs->size()); - data << uint32(StateWorldEffectsQuestObjectiveID); for (uint32 i = 0; i < StateWorldEffectIDs->size(); ++i) { data << uint32((*StateWorldEffectIDs)[i]); @@ -5742,17 +4475,13 @@ void GameObjectData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fie data << float(ParentRotation->z); data << float(ParentRotation->w); data << int32(FactionTemplate); + data << int32(Level); data << int8(ViewerDependentValue<StateTag>::GetValue(this, owner, receiver)); data << int8(TypeID); data << uint8(PercentHealth); data << uint32(ArtKit); data << uint32(EnableDoodadSets.size()); data << uint32(CustomParam); - data << int32(Level); - data << uint32(AnimGroupInstance); - data << uint32(UiWidgetItemID); - data << uint32(UiWidgetItemQuality); - data << uint32(UiWidgetItemUnknown1000); data << uint32(WorldEffects.size()); for (uint32 i = 0; i < EnableDoodadSets.size(); ++i) { @@ -5771,7 +4500,7 @@ void GameObjectData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fie void GameObjectData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignoreNestedChangesMask, GameObject const* owner, Player const* receiver) const { - data.WriteBits(changesMask.GetBlock(0), 25); + data.WriteBits(changesMask.GetBlock(0), 20); if (changesMask[0]) { @@ -5847,31 +4576,31 @@ void GameObjectData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool } if (changesMask[9]) { - data << uint32(StateWorldEffectsQuestObjectiveID); - } - if (changesMask[10]) - { data << CreatedBy; } - if (changesMask[11]) + if (changesMask[10]) { data << GuildGUID; } - if (changesMask[12]) + if (changesMask[11]) { data << uint32(ViewerDependentValue<FlagsTag>::GetValue(this, owner, receiver)); } - if (changesMask[13]) + if (changesMask[12]) { data << float(ParentRotation->x); data << float(ParentRotation->y); data << float(ParentRotation->z); data << float(ParentRotation->w); } - if (changesMask[14]) + if (changesMask[13]) { data << int32(FactionTemplate); } + if (changesMask[14]) + { + data << int32(Level); + } if (changesMask[15]) { data << int8(ViewerDependentValue<StateTag>::GetValue(this, owner, receiver)); @@ -5892,26 +4621,6 @@ void GameObjectData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool { data << uint32(CustomParam); } - if (changesMask[20]) - { - data << int32(Level); - } - if (changesMask[21]) - { - data << uint32(AnimGroupInstance); - } - if (changesMask[22]) - { - data << uint32(UiWidgetItemID); - } - if (changesMask[23]) - { - data << uint32(UiWidgetItemQuality); - } - if (changesMask[24]) - { - data << uint32(UiWidgetItemUnknown1000); - } } } @@ -5925,22 +4634,17 @@ void GameObjectData::ClearChangesMask() Base::ClearChangesMask(StateSpellVisualID); Base::ClearChangesMask(SpawnTrackingStateAnimID); Base::ClearChangesMask(SpawnTrackingStateAnimKitID); - Base::ClearChangesMask(StateWorldEffectsQuestObjectiveID); Base::ClearChangesMask(CreatedBy); Base::ClearChangesMask(GuildGUID); Base::ClearChangesMask(Flags); Base::ClearChangesMask(ParentRotation); Base::ClearChangesMask(FactionTemplate); + Base::ClearChangesMask(Level); Base::ClearChangesMask(State); Base::ClearChangesMask(TypeID); Base::ClearChangesMask(PercentHealth); Base::ClearChangesMask(ArtKit); Base::ClearChangesMask(CustomParam); - Base::ClearChangesMask(Level); - Base::ClearChangesMask(AnimGroupInstance); - Base::ClearChangesMask(UiWidgetItemID); - Base::ClearChangesMask(UiWidgetItemQuality); - Base::ClearChangesMask(UiWidgetItemUnknown1000); _changesMask.ResetAll(); } @@ -5948,7 +4652,7 @@ void DynamicObjectData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> { data << Caster; data << uint8(Type); - SpellVisual->WriteCreate(data, owner, receiver); + data << int32(SpellXSpellVisualID); data << int32(SpellID); data << float(Radius); data << uint32(CastTime); @@ -5976,7 +4680,7 @@ void DynamicObjectData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, b } if (changesMask[3]) { - SpellVisual->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + data << int32(SpellXSpellVisualID); } if (changesMask[4]) { @@ -5997,7 +4701,7 @@ void DynamicObjectData::ClearChangesMask() { Base::ClearChangesMask(Caster); Base::ClearChangesMask(Type); - Base::ClearChangesMask(SpellVisual); + Base::ClearChangesMask(SpellXSpellVisualID); Base::ClearChangesMask(SpellID); Base::ClearChangesMask(Radius); Base::ClearChangesMask(CastTime); @@ -6021,7 +4725,6 @@ void CorpseData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVi data << uint32(Customizations.size()); data << uint32(Flags); data << int32(FactionTemplate); - data << uint32(StateSpellVisualKitID); for (uint32 i = 0; i < Customizations.size(); ++i) { Customizations[i].WriteCreate(data, owner, receiver); @@ -6035,10 +4738,7 @@ void CorpseData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVi void CorpseData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignoreNestedChangesMask, Corpse const* owner, Player const* receiver) const { - data.WriteBits(changesMask.GetBlocksMask(0), 2); - for (uint32 i = 0; i < 2; ++i) - if (changesMask.GetBlock(i)) - data.WriteBits(changesMask.GetBlock(i), 32); + data.WriteBits(changesMask.GetBlock(0), 32); if (changesMask[0]) { @@ -6103,16 +4803,12 @@ void CorpseData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ign { data << int32(FactionTemplate); } - if (changesMask[12]) - { - data << uint32(StateSpellVisualKitID); - } } - if (changesMask[13]) + if (changesMask[12]) { for (uint32 i = 0; i < 19; ++i) { - if (changesMask[14 + i]) + if (changesMask[13 + i]) { data << uint32(Items[i]); } @@ -6133,7 +4829,6 @@ void CorpseData::ClearChangesMask() Base::ClearChangesMask(Class); Base::ClearChangesMask(Flags); Base::ClearChangesMask(FactionTemplate); - Base::ClearChangesMask(StateSpellVisualKitID); Base::ClearChangesMask(Items); _changesMask.ResetAll(); } @@ -6262,24 +4957,16 @@ void AreaTriggerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fi data << uint32(TimeToTargetPos); data << int32(SpellID); data << int32(SpellForVisuals); - SpellVisual->WriteCreate(data, owner, receiver); + data << int32(SpellXSpellVisualID); data << float(BoundsRadius2D); data << uint32(DecalPropertiesID); data << CreatingEffectGUID; - data << uint32(NumUnitsInside); - data << uint32(NumPlayersInside); data << OrbitPathTarget; - data << RollPitchYaw; - data << int32(PositionalSoundKitID); ExtraScaleCurve->WriteCreate(data, owner, receiver); - data.FlushBits(); - data.WriteBit(HeightIgnoresScale); - data.WriteBit(Field_261); OverrideMoveCurveX->WriteCreate(data, owner, receiver); OverrideMoveCurveY->WriteCreate(data, owner, receiver); OverrideMoveCurveZ->WriteCreate(data, owner, receiver); VisualAnim->WriteCreate(data, owner, receiver); - data.FlushBits(); } void AreaTriggerData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, AreaTrigger const* owner, Player const* receiver) const @@ -6289,122 +4976,92 @@ void AreaTriggerData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fi void AreaTriggerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignoreNestedChangesMask, AreaTrigger const* owner, Player const* receiver) const { - data.WriteBits(changesMask.GetBlock(0), 26); + data.WriteBits(changesMask.GetBlock(0), 20); - if (changesMask[0]) - { - if (changesMask[1]) - { - data.WriteBit(HeightIgnoresScale); - } - if (changesMask[2]) - { - data.WriteBit(Field_261); - } - } data.FlushBits(); if (changesMask[0]) { - if (changesMask[3]) + if (changesMask[1]) { OverrideScaleCurve->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } - if (changesMask[8]) + if (changesMask[6]) { data << Caster; } - if (changesMask[9]) + if (changesMask[7]) { data << uint32(Duration); } - if (changesMask[10]) + if (changesMask[8]) { data << uint32(TimeToTarget); } - if (changesMask[11]) + if (changesMask[9]) { data << uint32(TimeToTargetScale); } - if (changesMask[12]) + if (changesMask[10]) { data << uint32(TimeToTargetExtraScale); } - if (changesMask[13]) + if (changesMask[11]) { data << uint32(TimeToTargetPos); } - if (changesMask[14]) + if (changesMask[12]) { data << int32(SpellID); } - if (changesMask[15]) + if (changesMask[13]) { data << int32(SpellForVisuals); } - if (changesMask[16]) + if (changesMask[14]) { - SpellVisual->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + data << int32(SpellXSpellVisualID); } - if (changesMask[17]) + if (changesMask[15]) { data << float(BoundsRadius2D); } - if (changesMask[18]) + if (changesMask[16]) { data << uint32(DecalPropertiesID); } - if (changesMask[19]) + if (changesMask[17]) { data << CreatingEffectGUID; } - if (changesMask[20]) - { - data << uint32(NumUnitsInside); - } - if (changesMask[21]) - { - data << uint32(NumPlayersInside); - } - if (changesMask[22]) + if (changesMask[18]) { data << OrbitPathTarget; } - if (changesMask[23]) - { - data << RollPitchYaw; - } - if (changesMask[24]) - { - data << int32(PositionalSoundKitID); - } - if (changesMask[4]) + if (changesMask[2]) { ExtraScaleCurve->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } - if (changesMask[5]) + if (changesMask[3]) { OverrideMoveCurveX->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } - if (changesMask[6]) + if (changesMask[4]) { OverrideMoveCurveY->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } - if (changesMask[7]) + if (changesMask[5]) { OverrideMoveCurveZ->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } - if (changesMask[25]) + if (changesMask[19]) { VisualAnim->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } - data.FlushBits(); } void AreaTriggerData::ClearChangesMask() { - Base::ClearChangesMask(HeightIgnoresScale); - Base::ClearChangesMask(Field_261); Base::ClearChangesMask(OverrideScaleCurve); Base::ClearChangesMask(ExtraScaleCurve); Base::ClearChangesMask(OverrideMoveCurveX); @@ -6418,15 +5075,11 @@ void AreaTriggerData::ClearChangesMask() Base::ClearChangesMask(TimeToTargetPos); Base::ClearChangesMask(SpellID); Base::ClearChangesMask(SpellForVisuals); - Base::ClearChangesMask(SpellVisual); + Base::ClearChangesMask(SpellXSpellVisualID); Base::ClearChangesMask(BoundsRadius2D); Base::ClearChangesMask(DecalPropertiesID); Base::ClearChangesMask(CreatingEffectGUID); - Base::ClearChangesMask(NumUnitsInside); - Base::ClearChangesMask(NumPlayersInside); Base::ClearChangesMask(OrbitPathTarget); - Base::ClearChangesMask(RollPitchYaw); - Base::ClearChangesMask(PositionalSoundKitID); Base::ClearChangesMask(VisualAnim); _changesMask.ResetAll(); } @@ -6487,7 +5140,6 @@ void ConversationLine::WriteCreate(ByteBuffer& data, Conversation const* owner, data << int32(UiCameraID); data << uint8(ActorIndex); data << uint8(Flags); - data << uint8(ChatType); } void ConversationLine::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Conversation const* owner, Player const* receiver) const @@ -6498,7 +5150,6 @@ void ConversationLine::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Con data << int32(UiCameraID); data << uint8(ActorIndex); data << uint8(Flags); - data << uint8(ChatType); } bool ConversationLine::operator==(ConversationLine const& right) const @@ -6508,59 +5159,63 @@ bool ConversationLine::operator==(ConversationLine const& right) const && StartTime == right.StartTime && UiCameraID == right.UiCameraID && ActorIndex == right.ActorIndex - && Flags == right.Flags - && ChatType == right.ChatType; + && Flags == right.Flags; } void ConversationActor::WriteCreate(ByteBuffer& data, Conversation const* owner, Player const* receiver) const { - data << uint32(CreatureID); - data << uint32(CreatureDisplayInfoID); - data << ActorGUID; - data << int32(Id); data.WriteBits(Type, 1); - data.WriteBits(NoActorObject, 1); + data << int32(Id); + if (Type == 1) + { + data << uint32(CreatureID); + data << uint32(CreatureDisplayInfoID); + } + if (Type == 0) + { + data << ActorGUID; + } data.FlushBits(); } void ConversationActor::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Conversation const* owner, Player const* receiver) const { - data << uint32(CreatureID); - data << uint32(CreatureDisplayInfoID); - data << ActorGUID; - data << int32(Id); data.WriteBits(Type, 1); - data.WriteBits(NoActorObject, 1); + data << int32(Id); + if (Type == 1) + { + data << uint32(CreatureID); + data << uint32(CreatureDisplayInfoID); + } + if (Type == 0) + { + data << ActorGUID; + } data.FlushBits(); } bool ConversationActor::operator==(ConversationActor const& right) const { - return CreatureID == right.CreatureID - && CreatureDisplayInfoID == right.CreatureDisplayInfoID - && ActorGUID == right.ActorGUID + return Type == right.Type && Id == right.Id - && Type == right.Type - && NoActorObject == right.NoActorObject; + && CreatureID == right.CreatureID + && CreatureDisplayInfoID == right.CreatureDisplayInfoID + && ActorGUID == right.ActorGUID; } void ConversationData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Conversation const* owner, Player const* receiver) const { data << uint32(Lines->size()); data << int32(ViewerDependentValue<LastLineEndTimeTag>::GetValue(this, owner, receiver)); - data << uint32(Progress); for (uint32 i = 0; i < Lines->size(); ++i) { (*Lines)[i].WriteCreate(data, owner, receiver); } - data.WriteBit(DontPlayBroadcastTextSounds); data << uint32(Actors.size()); - data << uint32(Flags); for (uint32 i = 0; i < Actors.size(); ++i) { Actors[i].WriteCreate(data, owner, receiver); } - data.FlushBits(); } void ConversationData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Conversation const* owner, Player const* receiver) const @@ -6570,16 +5225,12 @@ void ConversationData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f void ConversationData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignoreNestedChangesMask, Conversation const* owner, Player const* receiver) const { - data.WriteBits(changesMask.GetBlock(0), 7); + data.WriteBits(changesMask.GetBlock(0), 4); if (changesMask[0]) { if (changesMask[1]) { - data.WriteBit(DontPlayBroadcastTextSounds); - } - if (changesMask[2]) - { data.WriteBits(Lines->size(), 32); for (uint32 i = 0; i < Lines->size(); ++i) { @@ -6590,7 +5241,7 @@ void ConversationData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo data.FlushBits(); if (changesMask[0]) { - if (changesMask[3]) + if (changesMask[2]) { if (!ignoreNestedChangesMask) Actors.WriteUpdateMask(data); @@ -6601,7 +5252,7 @@ void ConversationData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo data.FlushBits(); if (changesMask[0]) { - if (changesMask[3]) + if (changesMask[2]) { for (uint32 i = 0; i < Actors.size(); ++i) { @@ -6611,33 +5262,20 @@ void ConversationData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[4]) + if (changesMask[3]) { data << int32(ViewerDependentValue<LastLineEndTimeTag>::GetValue(this, owner, receiver)); } - if (changesMask[5]) - { - data << uint32(Progress); - } - if (changesMask[6]) - { - data << uint32(Flags); - } } - data.FlushBits(); } void ConversationData::ClearChangesMask() { - Base::ClearChangesMask(DontPlayBroadcastTextSounds); Base::ClearChangesMask(Lines); Base::ClearChangesMask(Actors); Base::ClearChangesMask(LastLineEndTime); - Base::ClearChangesMask(Progress); - Base::ClearChangesMask(Flags); _changesMask.ResetAll(); } - } #if TRINITY_COMPILER == TRINITY_COMPILER_GNU diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.h b/src/server/game/Entities/Object/Updates/UpdateFields.h index 078f0e5738c..d9543196a31 100644 --- a/src/server/game/Entities/Object/Updates/UpdateFields.h +++ b/src/server/game/Entities/Object/Updates/UpdateFields.h @@ -31,8 +31,6 @@ // This file is automatically generated, DO NOT EDIT class AreaTrigger; -class AzeriteEmpoweredItem; -class AzeriteItem; class Bag; class ByteBuffer; class Conversation; @@ -60,12 +58,13 @@ struct ObjectData : public IsUpdateFieldStructureTag, public HasChangesMask<4> void ClearChangesMask(); }; -struct ItemEnchantment : public IsUpdateFieldStructureTag, public HasChangesMask<5> +struct ItemEnchantment : public IsUpdateFieldStructureTag, public HasChangesMask<6> { UpdateField<int32, 0, 1> ID; UpdateField<uint32, 0, 2> Duration; UpdateField<int16, 0, 3> Charges; - UpdateField<uint16, 0, 4> Inactive; + UpdateField<uint8, 0, 4> Field_A; + UpdateField<uint8, 0, 5> Field_B; void WriteCreate(ByteBuffer& data, Item const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Item const* owner, Player const* receiver) const; @@ -115,7 +114,7 @@ struct SocketedGem : public IsUpdateFieldStructureTag, public HasChangesMask<20> void ClearChangesMask(); }; -struct ItemData : public IsUpdateFieldStructureTag, public HasChangesMask<41> +struct ItemData : public IsUpdateFieldStructureTag, public HasChangesMask<43> { DynamicUpdateField<UF::ArtifactPower, 0, 1> ArtifactPowers; DynamicUpdateField<UF::SocketedGem, 0, 2> Gems; @@ -126,19 +125,21 @@ struct ItemData : public IsUpdateFieldStructureTag, public HasChangesMask<41> UpdateField<uint32, 0, 7> StackCount; UpdateField<uint32, 0, 8> Expiration; UpdateField<uint32, 0, 9> DynamicFlags; - UpdateField<uint32, 0, 10> Durability; - UpdateField<uint32, 0, 11> MaxDurability; - UpdateField<uint32, 0, 12> CreatePlayedTime; - UpdateField<int32, 0, 13> Context; - UpdateField<int64, 0, 14> CreateTime; - UpdateField<uint64, 0, 15> ArtifactXP; - UpdateField<uint8, 0, 16> ItemAppearanceModID; - UpdateField<UF::ItemModList, 0, 17> Modifiers; - UpdateField<uint32, 0, 18> DynamicFlags2; - UpdateField<WorldPackets::Item::ItemBonusKey, 0, 19> ItemBonusKey; - UpdateField<uint16, 0, 20> DEBUGItemLevel; - UpdateFieldArray<int32, 5, 21, 22> SpellCharges; - UpdateFieldArray<UF::ItemEnchantment, 13, 27, 28> Enchantment; + UpdateField<int32, 0, 10> PropertySeed; + UpdateField<int32, 0, 11> RandomPropertiesID; + UpdateField<uint32, 0, 12> Durability; + UpdateField<uint32, 0, 13> MaxDurability; + UpdateField<uint32, 0, 14> CreatePlayedTime; + UpdateField<int32, 0, 15> Context; + UpdateField<int64, 0, 16> CreateTime; + UpdateField<uint64, 0, 17> ArtifactXP; + UpdateField<uint8, 0, 18> ItemAppearanceModID; + UpdateField<UF::ItemModList, 0, 19> Modifiers; + UpdateField<uint32, 0, 20> DynamicFlags2; + UpdateField<WorldPackets::Item::ItemBonusKey, 0, 21> ItemBonusKey; + UpdateField<uint16, 0, 22> DEBUGItemLevel; + UpdateFieldArray<int32, 5, 23, 24> SpellCharges; + UpdateFieldArray<UF::ItemEnchantment, 13, 29, 30> Enchantment; void WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Item const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Item const* owner, Player const* receiver) const; @@ -159,73 +160,10 @@ struct ContainerData : public IsUpdateFieldStructureTag, public HasChangesMask<3 void ClearChangesMask(); }; -struct AzeriteEmpoweredItemData : public IsUpdateFieldStructureTag, public HasChangesMask<6> -{ - UpdateFieldArray<int32, 5, 0, 1> Selections; - - void WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, AzeriteEmpoweredItem const* owner, Player const* receiver) const; - void WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, AzeriteEmpoweredItem const* owner, Player const* receiver) const; - void WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignoreNestedChangesMask, AzeriteEmpoweredItem const* owner, Player const* receiver) const; - void ClearChangesMask(); -}; - -struct UnlockedAzeriteEssence : public IsUpdateFieldStructureTag -{ - uint32 AzeriteEssenceID; - uint32 Rank; - - void WriteCreate(ByteBuffer& data, AzeriteItem const* owner, Player const* receiver) const; - void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, AzeriteItem const* owner, Player const* receiver) const; - bool operator==(UnlockedAzeriteEssence const& right) const; - bool operator!=(UnlockedAzeriteEssence const& right) const { return !(*this == right); } -}; - -struct SelectedAzeriteEssences : public IsUpdateFieldStructureTag, public HasChangesMask<8> -{ - UpdateField<bool, 0, 1> Enabled; - UpdateField<uint32, 0, 2> SpecializationID; - UpdateFieldArray<uint32, 4, 3, 4> AzeriteEssenceID; - - void WriteCreate(ByteBuffer& data, AzeriteItem const* owner, Player const* receiver) const; - void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, AzeriteItem const* owner, Player const* receiver) const; - void ClearChangesMask(); -}; - -struct AzeriteItemData : public IsUpdateFieldStructureTag, public HasChangesMask<10> -{ - UpdateField<bool, 0, 1> Enabled; - DynamicUpdateField<UF::UnlockedAzeriteEssence, 0, 2> UnlockedEssences; - DynamicUpdateField<uint32, 0, 4> UnlockedEssenceMilestones; - DynamicUpdateField<UF::SelectedAzeriteEssences, 0, 3> SelectedEssences; - UpdateField<uint64, 0, 5> Xp; - UpdateField<uint32, 0, 6> Level; - UpdateField<uint32, 0, 7> AuraLevel; - UpdateField<uint32, 0, 8> KnowledgeLevel; - UpdateField<int32, 0, 9> DEBUGknowledgeWeek; - - void WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, AzeriteItem const* owner, Player const* receiver) const; - void WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, AzeriteItem const* owner, Player const* receiver) const; - void WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignoreNestedChangesMask, AzeriteItem const* owner, Player const* receiver) const; - static void AppendAllowedFieldsMaskForFlag(Mask& allowedMaskForTarget, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags); - static void FilterDisallowedFieldsMaskForFlag(Mask& changesMask, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags); - void ClearChangesMask(); -}; - -struct SpellCastVisual : public IsUpdateFieldStructureTag -{ - int32 SpellXSpellVisualID; - int32 ScriptVisualID; - - void WriteCreate(ByteBuffer& data, Object const* owner, Player const* receiver) const; - void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Object const* owner, Player const* receiver) const; - bool operator==(SpellCastVisual const& right) const; - bool operator!=(SpellCastVisual const& right) const { return !(*this == right); } -}; - struct UnitChannel : public IsUpdateFieldStructureTag { int32 SpellID; - UF::SpellCastVisual SpellVisual; + int32 SpellXSpellVisualID; void WriteCreate(ByteBuffer& data, Unit const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Unit const* owner, Player const* receiver) const; @@ -233,13 +171,11 @@ struct UnitChannel : public IsUpdateFieldStructureTag bool operator!=(UnitChannel const& right) const { return !(*this == right); } }; -struct VisibleItem : public IsUpdateFieldStructureTag, public HasChangesMask<6> +struct VisibleItem : public IsUpdateFieldStructureTag, public HasChangesMask<4> { UpdateField<int32, 0, 1> ItemID; - UpdateField<int32, 0, 2> SecondaryItemModifiedAppearanceID; - UpdateField<int32, 0, 3> ConditionalItemAppearanceID; - UpdateField<uint16, 0, 4> ItemAppearanceModID; - UpdateField<uint16, 0, 5> ItemVisual; + UpdateField<uint16, 0, 2> ItemAppearanceModID; + UpdateField<uint16, 0, 3> ItemVisual; void WriteCreate(ByteBuffer& data, Unit const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Unit const* owner, Player const* receiver) const; @@ -257,19 +193,19 @@ struct PassiveSpellHistory : public IsUpdateFieldStructureTag bool operator!=(PassiveSpellHistory const& right) const { return !(*this == right); } }; -struct UnitData : public IsUpdateFieldStructureTag, public HasChangesMask<217> +struct UnitData : public IsUpdateFieldStructureTag, public HasChangesMask<227> { UpdateField<std::vector<uint32>, 0, 1> StateWorldEffectIDs; DynamicUpdateField<UF::PassiveSpellHistory, 0, 2> PassiveSpells; DynamicUpdateField<int32, 0, 3> WorldEffects; DynamicUpdateField<ObjectGuid, 0, 4> ChannelObjects; - UpdateField<int32, 0, 5> DisplayID; + UpdateField<int64, 0, 5> Health; + UpdateField<int64, 0, 6> MaxHealth; + UpdateField<int32, 0, 7> DisplayID; struct DisplayIDTag : ViewerDependentValueTag<int32> {}; - UpdateField<uint32, 0, 6> StateSpellVisualID; - UpdateField<uint32, 0, 7> StateAnimID; - UpdateField<uint32, 0, 8> StateAnimKitID; - UpdateField<uint32, 0, 9> StateWorldEffectsQuestObjectiveID; - UpdateField<int32, 0, 10> SpellOverrideNameID; + UpdateField<uint32, 0, 8> StateSpellVisualID; + UpdateField<uint32, 0, 9> StateAnimID; + UpdateField<uint32, 0, 10> StateAnimKitID; UpdateField<ObjectGuid, 0, 11> Charm; UpdateField<ObjectGuid, 0, 12> Summon; UpdateField<ObjectGuid, 0, 13> Critter; @@ -282,128 +218,116 @@ struct UnitData : public IsUpdateFieldStructureTag, public HasChangesMask<217> UpdateField<ObjectGuid, 0, 20> BattlePetCompanionGUID; UpdateField<uint64, 0, 21> BattlePetDBID; UpdateField<UF::UnitChannel, 0, 22> ChannelData; - UpdateField<int8, 0, 23> SpellEmpowerStage; - UpdateField<uint32, 0, 24> SummonedByHomeRealm; - UpdateField<uint8, 0, 25> Race; - UpdateField<uint8, 0, 26> ClassId; - UpdateField<uint8, 0, 27> PlayerClassId; - UpdateField<uint8, 0, 28> Sex; - UpdateField<uint8, 0, 29> DisplayPower; - UpdateField<uint32, 0, 30> OverrideDisplayPowerID; - UpdateField<int64, 0, 31> Health; - UpdateField<int64, 32, 33> MaxHealth; - UpdateField<int32, 32, 34> Level; - UpdateField<int32, 32, 35> EffectiveLevel; - UpdateField<int32, 32, 36> ContentTuningID; - UpdateField<int32, 32, 37> ScalingLevelMin; - UpdateField<int32, 32, 38> ScalingLevelMax; - UpdateField<int32, 32, 39> ScalingLevelDelta; - UpdateField<int32, 32, 40> ScalingFactionGroup; - UpdateField<int32, 32, 41> ScalingHealthItemLevelCurveID; - UpdateField<int32, 32, 42> ScalingDamageItemLevelCurveID; - UpdateField<int32, 32, 43> FactionTemplate; + UpdateField<uint32, 0, 23> SummonedByHomeRealm; + UpdateField<uint8, 0, 24> Race; + UpdateField<uint8, 0, 25> ClassId; + UpdateField<uint8, 0, 26> PlayerClassId; + UpdateField<uint8, 0, 27> Sex; + UpdateField<uint8, 0, 28> DisplayPower; + UpdateField<uint32, 0, 29> OverrideDisplayPowerID; + UpdateField<int32, 0, 30> Level; + UpdateField<int32, 0, 31> EffectiveLevel; + UpdateField<int32, 32, 33> ContentTuningID; + UpdateField<int32, 32, 34> ScalingLevelMin; + UpdateField<int32, 32, 35> ScalingLevelMax; + UpdateField<int32, 32, 36> ScalingLevelDelta; + UpdateField<int32, 32, 37> ScalingFactionGroup; + UpdateField<int32, 32, 38> ScalingHealthItemLevelCurveID; + UpdateField<int32, 32, 39> ScalingDamageItemLevelCurveID; + UpdateField<int32, 32, 40> FactionTemplate; struct FactionTemplateTag : ViewerDependentValueTag<int32> {}; - UpdateField<uint32, 32, 44> Flags; + UpdateField<uint32, 32, 41> Flags; struct FlagsTag : ViewerDependentValueTag<uint32> {}; - UpdateField<uint32, 32, 45> Flags2; - UpdateField<uint32, 32, 46> Flags3; + UpdateField<uint32, 32, 42> Flags2; + UpdateField<uint32, 32, 43> Flags3; struct Flags3Tag : ViewerDependentValueTag<uint32> {}; - UpdateField<uint32, 32, 47> AuraState; + UpdateField<uint32, 32, 44> AuraState; struct AuraStateTag : ViewerDependentValueTag<uint32> {}; - UpdateField<uint32, 32, 48> RangedAttackRoundBaseTime; - UpdateField<float, 32, 49> BoundingRadius; - UpdateField<float, 32, 50> CombatReach; - UpdateField<float, 32, 51> DisplayScale; - UpdateField<int32, 32, 52> CreatureFamily; - UpdateField<int32, 32, 53> CreatureType; - UpdateField<int32, 32, 54> NativeDisplayID; - UpdateField<float, 32, 55> NativeXDisplayScale; - UpdateField<int32, 32, 56> MountDisplayID; - UpdateField<int32, 32, 57> CosmeticMountDisplayID; - UpdateField<float, 32, 58> MinDamage; - UpdateField<float, 32, 59> MaxDamage; - UpdateField<float, 32, 60> MinOffHandDamage; - UpdateField<float, 32, 61> MaxOffHandDamage; - UpdateField<uint8, 32, 62> StandState; - UpdateField<uint8, 32, 63> PetTalentPoints; - UpdateField<uint8, 64, 65> VisFlags; - UpdateField<uint8, 64, 66> AnimTier; - UpdateField<uint32, 64, 67> PetNumber; - UpdateField<uint32, 64, 68> PetNameTimestamp; - UpdateField<uint32, 64, 69> PetExperience; - UpdateField<uint32, 64, 70> PetNextLevelExperience; - UpdateField<float, 64, 71> ModCastingSpeed; - UpdateField<float, 64, 72> ModCastingSpeedNeg; - UpdateField<float, 64, 73> ModSpellHaste; - UpdateField<float, 64, 74> ModHaste; - UpdateField<float, 64, 75> ModRangedHaste; - UpdateField<float, 64, 76> ModHasteRegen; - UpdateField<float, 64, 77> ModTimeRate; - UpdateField<int32, 64, 78> CreatedBySpell; - UpdateField<int32, 64, 79> EmoteState; - UpdateField<int32, 64, 80> BaseMana; - UpdateField<int32, 64, 81> BaseHealth; - UpdateField<uint8, 64, 82> SheatheState; - UpdateField<uint8, 64, 83> PvpFlags; + UpdateField<uint32, 32, 45> RangedAttackRoundBaseTime; + UpdateField<float, 32, 46> BoundingRadius; + UpdateField<float, 32, 47> CombatReach; + UpdateField<float, 32, 48> DisplayScale; + UpdateField<int32, 32, 49> NativeDisplayID; + UpdateField<float, 32, 50> NativeXDisplayScale; + UpdateField<int32, 32, 51> MountDisplayID; + UpdateField<float, 32, 52> MinDamage; + UpdateField<float, 32, 53> MaxDamage; + UpdateField<float, 32, 54> MinOffHandDamage; + UpdateField<float, 32, 55> MaxOffHandDamage; + UpdateField<uint8, 32, 56> StandState; + UpdateField<uint8, 32, 57> PetTalentPoints; + UpdateField<uint8, 32, 58> VisFlags; + UpdateField<uint8, 32, 59> AnimTier; + UpdateField<uint32, 32, 60> PetNumber; + UpdateField<uint32, 32, 61> PetNameTimestamp; + UpdateField<uint32, 32, 62> PetExperience; + UpdateField<uint32, 32, 63> PetNextLevelExperience; + UpdateField<float, 64, 65> ModCastingSpeed; + UpdateField<float, 64, 66> ModSpellHaste; + UpdateField<float, 64, 67> ModHaste; + UpdateField<float, 64, 68> ModRangedHaste; + UpdateField<float, 64, 69> ModHasteRegen; + UpdateField<float, 64, 70> ModTimeRate; + UpdateField<int32, 64, 71> CreatedBySpell; + UpdateField<int32, 64, 72> EmoteState; + UpdateField<int16, 64, 73> TrainingPointsUsed; + UpdateField<int16, 64, 74> TrainingPointsTotal; + UpdateField<int32, 64, 75> BaseMana; + UpdateField<int32, 64, 76> BaseHealth; + UpdateField<uint8, 64, 77> SheatheState; + UpdateField<uint8, 64, 78> PvpFlags; struct PvpFlagsTag : ViewerDependentValueTag<uint8> {}; - UpdateField<uint8, 64, 84> PetFlags; - UpdateField<uint8, 64, 85> ShapeshiftForm; - UpdateField<int32, 64, 86> AttackPower; - UpdateField<int32, 64, 87> AttackPowerModPos; - UpdateField<int32, 64, 88> AttackPowerModNeg; - UpdateField<float, 64, 89> AttackPowerMultiplier; - UpdateField<int32, 64, 90> AttackPowerModSupport; - UpdateField<int32, 64, 91> RangedAttackPower; - UpdateField<int32, 64, 92> RangedAttackPowerModPos; - UpdateField<int32, 64, 93> RangedAttackPowerModNeg; - UpdateField<float, 64, 94> RangedAttackPowerMultiplier; - UpdateField<int32, 64, 95> RangedAttackPowerModSupport; - UpdateField<int32, 96, 97> MainHandWeaponAttackPower; - UpdateField<int32, 96, 98> OffHandWeaponAttackPower; - UpdateField<int32, 96, 99> RangedWeaponAttackPower; - UpdateField<int32, 96, 100> SetAttackSpeedAura; - UpdateField<float, 96, 101> Lifesteal; - UpdateField<float, 96, 102> MinRangedDamage; - UpdateField<float, 96, 103> MaxRangedDamage; - UpdateField<float, 96, 104> ManaCostMultiplier; - UpdateField<float, 96, 105> MaxHealthModifier; - UpdateField<float, 96, 106> HoverHeight; - UpdateField<int32, 96, 107> MinItemLevelCutoff; - UpdateField<int32, 96, 108> MinItemLevel; - UpdateField<int32, 96, 109> MaxItemLevel; - UpdateField<int32, 96, 110> AzeriteItemLevel; - UpdateField<int32, 96, 111> WildBattlePetLevel; - UpdateField<int32, 96, 112> BattlePetCompanionExperience; - UpdateField<uint32, 96, 113> BattlePetCompanionNameTimestamp; - UpdateField<int32, 96, 114> InteractSpellID; + UpdateField<uint8, 64, 79> PetFlags; + UpdateField<uint8, 64, 80> ShapeshiftForm; + UpdateField<int32, 64, 81> AttackPower; + UpdateField<int32, 64, 82> AttackPowerModPos; + UpdateField<int32, 64, 83> AttackPowerModNeg; + UpdateField<float, 64, 84> AttackPowerMultiplier; + UpdateField<int32, 64, 85> RangedAttackPower; + UpdateField<int32, 64, 86> RangedAttackPowerModPos; + UpdateField<int32, 64, 87> RangedAttackPowerModNeg; + UpdateField<float, 64, 88> RangedAttackPowerMultiplier; + UpdateField<int32, 64, 89> SetAttackSpeedAura; + UpdateField<float, 64, 90> Lifesteal; + UpdateField<float, 64, 91> MinRangedDamage; + UpdateField<float, 64, 92> MaxRangedDamage; + UpdateField<float, 64, 93> MaxHealthModifier; + UpdateField<float, 64, 94> HoverHeight; + UpdateField<int32, 64, 95> MinItemLevelCutoff; + UpdateField<int32, 96, 97> MinItemLevel; + UpdateField<int32, 96, 98> MaxItemLevel; + UpdateField<int32, 96, 99> WildBattlePetLevel; + UpdateField<uint32, 96, 100> BattlePetCompanionNameTimestamp; + UpdateField<int32, 96, 101> InteractSpellID; struct InteractSpellIDTag : ViewerDependentValueTag<int32> {}; - UpdateField<int32, 96, 115> ScaleDuration; - UpdateField<int32, 96, 116> LooksLikeMountID; - UpdateField<int32, 96, 117> LooksLikeCreatureID; - UpdateField<int32, 96, 118> LookAtControllerID; - UpdateField<int32, 96, 119> PerksVendorItemID; - UpdateField<int32, 96, 120> TaxiNodesID; - UpdateField<ObjectGuid, 96, 121> GuildGUID; - UpdateField<int32, 96, 122> FlightCapabilityID; - UpdateField<float, 96, 123> GlideEventSpeedDivisor; // Movement speed gets divided by this value when evaluating what GlideEvents to use - UpdateField<uint32, 96, 124> SilencedSchoolMask; - UpdateField<uint32, 96, 125> CurrentAreaID; - UpdateField<ObjectGuid, 96, 126> NameplateAttachToGUID; // When set, nameplate of this unit will instead appear on that object - UpdateFieldArray<uint32, 2, 127, 128> NpcFlags; + UpdateField<int32, 96, 102> ScaleDuration; + UpdateField<int32, 96, 103> LooksLikeMountID; + UpdateField<int32, 96, 104> LooksLikeCreatureID; + UpdateField<int32, 96, 105> LookAtControllerID; + UpdateField<int32, 96, 106> PerksVendorItemID; + UpdateField<ObjectGuid, 96, 107> GuildGUID; + UpdateField<ObjectGuid, 96, 108> SkinningOwnerGUID; + UpdateField<int32, 96, 109> FlightCapabilityID; + UpdateField<float, 96, 110> GlideEventSpeedDivisor; // Movement speed gets divided by this value when evaluating what GlideEvents to use + UpdateField<uint32, 96, 111> CurrentAreaID; + UpdateField<ObjectGuid, 96, 112> ComboTarget; + UpdateFieldArray<uint32, 2, 113, 114> NpcFlags; struct NpcFlagsTag : ViewerDependentValueTag<uint32> {}; - UpdateFieldArray<int32, 10, 130, 131> Power; - UpdateFieldArray<int32, 10, 130, 141> MaxPower; - UpdateFieldArray<float, 10, 130, 151> PowerRegenFlatModifier; - UpdateFieldArray<float, 10, 130, 161> PowerRegenInterruptedFlatModifier; - UpdateFieldArray<UF::VisibleItem, 3, 171, 172> VirtualItems; - UpdateFieldArray<uint32, 2, 175, 176> AttackRoundBaseTime; - UpdateFieldArray<int32, 4, 178, 179> Stats; - UpdateFieldArray<int32, 4, 178, 183> StatPosBuff; - UpdateFieldArray<int32, 4, 178, 187> StatNegBuff; - UpdateFieldArray<int32, 4, 178, 191> StatSupportBuff; - UpdateFieldArray<int32, 7, 195, 196> Resistances; - UpdateFieldArray<int32, 7, 195, 203> BonusResistanceMods; - UpdateFieldArray<int32, 7, 195, 210> ManaCostModifier; + UpdateFieldArray<float, 10, 116, 117> PowerRegenFlatModifier; + UpdateFieldArray<float, 10, 116, 127> PowerRegenInterruptedFlatModifier; + UpdateFieldArray<int32, 10, 116, 137> Power; + UpdateFieldArray<int32, 10, 116, 147> MaxPower; + UpdateFieldArray<float, 10, 116, 157> ModPowerRegen; // Applies to power regen only if expansion < 2, hidden from lua + UpdateFieldArray<UF::VisibleItem, 3, 167, 168> VirtualItems; + UpdateFieldArray<uint32, 2, 171, 172> AttackRoundBaseTime; + UpdateFieldArray<int32, 5, 174, 175> Stats; + UpdateFieldArray<int32, 5, 174, 180> StatPosBuff; + UpdateFieldArray<int32, 5, 174, 185> StatNegBuff; + UpdateFieldArray<int32, 7, 190, 191> Resistances; + UpdateFieldArray<int32, 7, 190, 198> PowerCostModifier; + UpdateFieldArray<float, 7, 190, 205> PowerCostMultiplier; + UpdateFieldArray<int32, 7, 212, 213> ResistanceBuffModsPositive; + UpdateFieldArray<int32, 7, 212, 220> ResistanceBuffModsNegative; void WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Unit const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Unit const* owner, Player const* receiver) const; @@ -424,46 +348,34 @@ struct ChrCustomizationChoice : public IsUpdateFieldStructureTag bool operator!=(ChrCustomizationChoice const& right) const { return !(*this == right); } }; -struct QuestLog : public IsUpdateFieldStructureTag, public HasChangesMask<30> +struct QuestLog : public IsUpdateFieldStructureTag, public HasChangesMask<29> { UpdateField<int64, 0, 1> EndTime; UpdateField<int32, 0, 2> QuestID; UpdateField<uint32, 0, 3> StateFlags; - UpdateField<uint32, 0, 4> ObjectiveFlags; - UpdateFieldArray<int16, 24, 5, 6> ObjectiveProgress; + UpdateFieldArray<uint16, 24, 4, 5> ObjectiveProgress; void WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const; void ClearChangesMask(); }; -struct ArenaCooldown : public IsUpdateFieldStructureTag, public HasChangesMask<8> +struct ArenaCooldown : public IsUpdateFieldStructureTag, public HasChangesMask<9> { UpdateField<int32, 0, 1> SpellID; - UpdateField<int32, 0, 2> Charges; - UpdateField<uint32, 0, 3> Flags; - UpdateField<uint32, 0, 4> StartTime; - UpdateField<uint32, 0, 5> EndTime; - UpdateField<uint32, 0, 6> NextChargeTime; - UpdateField<uint8, 0, 7> MaxCharges; + UpdateField<int32, 0, 2> ItemID; + UpdateField<int32, 0, 3> Charges; + UpdateField<uint32, 0, 4> Flags; + UpdateField<uint32, 0, 5> StartTime; + UpdateField<uint32, 0, 6> EndTime; + UpdateField<uint32, 0, 7> NextChargeTime; + UpdateField<uint8, 0, 8> MaxCharges; void WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const; void ClearChangesMask(); }; -struct CTROptions : public IsUpdateFieldStructureTag -{ - int32 ContentTuningConditionMask; - uint32 Field_4; - uint32 ExpansionLevelMask; - - void WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const; - void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const; - bool operator==(CTROptions const& right) const; - bool operator!=(CTROptions const& right) const { return !(*this == right); } -}; - struct DeclinedNames : public IsUpdateFieldStructureTag, public HasChangesMask<6> { UpdateFieldArray<std::string, 5, 0, 1> Name; @@ -486,54 +398,48 @@ struct CustomTabardInfo : public IsUpdateFieldStructureTag, public HasChangesMas void ClearChangesMask(); }; -struct PlayerData : public IsUpdateFieldStructureTag, public HasChangesMask<269> +struct PlayerData : public IsUpdateFieldStructureTag, public HasChangesMask<113> { - UpdateField<bool, 0, 1> HasQuestSession; - UpdateField<bool, 0, 2> HasLevelLink; - DynamicUpdateField<UF::ChrCustomizationChoice, 0, 3> Customizations; - DynamicUpdateField<UF::ChrCustomizationChoice, 0, 4> QaCustomizations; - DynamicUpdateField<UF::QuestLog, 0, 5> QuestSessionQuestLog; - DynamicUpdateField<UF::ArenaCooldown, 0, 6> ArenaCooldowns; - DynamicUpdateField<int32, 0, 7> VisualItemReplacements; - UpdateField<ObjectGuid, 0, 8> DuelArbiter; - UpdateField<ObjectGuid, 0, 9> WowAccount; - UpdateField<ObjectGuid, 0, 10> BnetAccount; - UpdateField<uint64, 0, 11> GuildClubMemberID; - UpdateField<ObjectGuid, 0, 12> LootTargetGUID; - UpdateField<uint32, 0, 13> PlayerFlags; - UpdateField<uint32, 0, 14> PlayerFlagsEx; - UpdateField<uint32, 0, 15> GuildRankID; - UpdateField<uint32, 0, 16> GuildDeleteDate; - UpdateField<int32, 0, 17> GuildLevel; - UpdateField<uint8, 0, 18> NativeSex; - UpdateField<uint8, 0, 19> Inebriation; - UpdateField<uint8, 0, 20> PvpTitle; - UpdateField<uint8, 0, 21> ArenaFaction; - UpdateField<uint32, 0, 22> DuelTeam; - UpdateField<int32, 0, 23> GuildTimeStamp; - UpdateField<int32, 0, 24> PlayerTitle; - UpdateField<int32, 0, 25> FakeInebriation; - UpdateField<uint32, 0, 26> VirtualPlayerRealm; - UpdateField<uint32, 0, 27> CurrentSpecID; - UpdateField<int32, 0, 28> TaxiMountAnimKitID; - UpdateField<uint8, 0, 29> CurrentBattlePetBreedQuality; - UpdateField<int32, 0, 30> HonorLevel; - UpdateField<int64, 0, 31> LogoutTime; - UpdateField<std::string, 32, 33> Name; - UpdateField<int32, 32, 34> Field_B0; - UpdateField<int32, 32, 35> Field_B4; - UpdateField<int32, 32, 36> CurrentBattlePetSpeciesID; - UpdateField<UF::CTROptions, 32, 37> CtrOptions; - UpdateField<int32, 32, 38> CovenantID; - UpdateField<int32, 32, 39> SoulbindID; - UpdateField<WorldPackets::MythicPlus::DungeonScoreSummary, 32, 40> DungeonScore; - OptionalUpdateField<UF::DeclinedNames, 32, 41> DeclinedNames; - UpdateField<UF::CustomTabardInfo, 32, 42> PersonalTabard; - UpdateFieldArray<uint8, 2, 43, 44> PartyType; - UpdateFieldArray<UF::QuestLog, 175, 46, 47> QuestLog; - UpdateFieldArray<UF::VisibleItem, 19, 222, 223> VisibleItems; - UpdateFieldArray<float, 6, 242, 243> AvgItemLevel; - UpdateFieldArray<uint32, 19, 249, 250> Field_3120; + DynamicUpdateField<UF::ChrCustomizationChoice, 0, 1> Customizations; + DynamicUpdateField<UF::ArenaCooldown, 0, 2> ArenaCooldowns; + DynamicUpdateField<int32, 0, 3> VisualItemReplacements; + UpdateField<ObjectGuid, 0, 4> DuelArbiter; + UpdateField<ObjectGuid, 0, 5> WowAccount; + UpdateField<ObjectGuid, 0, 6> BnetAccount; + UpdateField<uint64, 0, 7> GuildClubMemberID; + UpdateField<ObjectGuid, 0, 8> LootTargetGUID; + UpdateField<uint32, 0, 9> PlayerFlags; + UpdateField<uint32, 0, 10> PlayerFlagsEx; + UpdateField<uint32, 0, 11> GuildRankID; + UpdateField<uint32, 0, 12> GuildDeleteDate; + UpdateField<int32, 0, 13> GuildLevel; + UpdateField<uint8, 0, 14> NumBankSlots; + UpdateField<uint8, 0, 15> NativeSex; + UpdateField<uint8, 0, 16> Inebriation; + UpdateField<uint8, 0, 17> PvpTitle; + UpdateField<uint8, 0, 18> ArenaFaction; + UpdateField<uint8, 0, 19> PvpRank; + UpdateField<int32, 0, 20> Field_88; + UpdateField<uint32, 0, 21> DuelTeam; + UpdateField<int32, 0, 22> GuildTimeStamp; + UpdateField<int32, 0, 23> PlayerTitle; + UpdateField<int32, 0, 24> FakeInebriation; + UpdateField<uint32, 0, 25> VirtualPlayerRealm; + UpdateField<uint32, 0, 26> CurrentSpecID; + UpdateField<int32, 0, 27> TaxiMountAnimKitID; + UpdateField<uint8, 0, 28> CurrentBattlePetBreedQuality; + UpdateField<int32, 0, 29> HonorLevel; + UpdateField<int64, 0, 30> LogoutTime; + UpdateField<std::string, 0, 31> Name; + UpdateField<int32, 32, 33> CurrentBattlePetSpeciesID; + UpdateField<WorldPackets::MythicPlus::DungeonScoreSummary, 32, 34> DungeonScore; + OptionalUpdateField<UF::DeclinedNames, 32, 35> DeclinedNames; + UpdateField<UF::CustomTabardInfo, 32, 36> PersonalTabard; + UpdateFieldArray<uint8, 2, 37, 38> PartyType; + UpdateFieldArray<UF::QuestLog, 25, 40, 41> QuestLog; + UpdateFieldArray<UF::VisibleItem, 19, 66, 67> VisibleItems; + UpdateFieldArray<float, 6, 86, 87> AvgItemLevel; + UpdateFieldArray<uint32, 19, 93, 94> Field_3120; void WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Player const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Player const* owner, Player const* receiver) const; @@ -652,69 +558,6 @@ struct ResearchHistory : public IsUpdateFieldStructureTag, public HasChangesMask void ClearChangesMask(); }; -struct MawPower : public IsUpdateFieldStructureTag -{ - int32 Field_0; - int32 Field_4; - int32 Field_8; - - void WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const; - void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const; - bool operator==(MawPower const& right) const; - bool operator!=(MawPower const& right) const { return !(*this == right); } -}; - -struct MultiFloorExplore : public IsUpdateFieldStructureTag -{ - std::vector<int32> WorldMapOverlayIDs; - - void WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const; - void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const; - bool operator==(MultiFloorExplore const& right) const; - bool operator!=(MultiFloorExplore const& right) const { return !(*this == right); } -}; - -struct RecipeProgressionInfo : public IsUpdateFieldStructureTag -{ - uint16 RecipeProgressionGroupID; - uint16 Experience; - - void WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const; - void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const; - bool operator==(RecipeProgressionInfo const& right) const; - bool operator!=(RecipeProgressionInfo const& right) const { return !(*this == right); } -}; - -struct ActivePlayerUnk901 : public IsUpdateFieldStructureTag, public HasChangesMask<3> -{ - UpdateField<ObjectGuid, 0, 1> Field_0; - UpdateField<int32, 0, 2> Field_10; - - void WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const; - void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const; - void ClearChangesMask(); -}; - -struct QuestSession : public IsUpdateFieldStructureTag, public HasChangesMask<953> -{ - UpdateField<ObjectGuid, 0, 1> Owner; - UpdateFieldArray<uint64, 950, 2, 3> QuestCompleted; - - void WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const; - void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const; - void ClearChangesMask(); -}; - -struct ReplayedQuest : public IsUpdateFieldStructureTag, public HasChangesMask<3> -{ - UpdateField<int32, 0, 1> QuestID; - UpdateField<uint32, 0, 2> ReplayTime; - - void WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const; - void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const; - void ClearChangesMask(); -}; - struct TraitEntry : public IsUpdateFieldStructureTag { int32 TraitNodeID; @@ -745,70 +588,6 @@ struct TraitConfig : public IsUpdateFieldStructureTag, public HasChangesMask<12> void ClearChangesMask(); }; -struct CraftingOrderItem : public IsUpdateFieldStructureTag, public HasChangesMask<7> -{ - UpdateField<uint64, -1, 0> Field_0; - UpdateField<ObjectGuid, -1, 1> ItemGUID; - UpdateField<ObjectGuid, -1, 2> OwnerGUID; - UpdateField<int32, -1, 3> ItemID; - UpdateField<uint32, -1, 4> Quantity; - UpdateField<int32, -1, 5> ReagentQuality; - OptionalUpdateField<uint8, -1, 6> DataSlotIndex; - - void WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const; - void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const; - void ClearChangesMask(); -}; - -struct CraftingOrderData : public IsUpdateFieldStructureTag, public HasChangesMask<24> -{ - DynamicUpdateField<UF::CraftingOrderItem, 0, 1> Reagents; - UpdateField<int32, 0, 2> Field_0; - UpdateField<uint64, 0, 3> OrderID; - UpdateField<int32, 0, 4> SkillLineAbilityID; - UpdateField<uint8, 5, 6> OrderState; - UpdateField<uint8, 5, 7> OrderType; - UpdateField<uint8, 5, 8> MinQuality; - UpdateField<int64, 5, 9> ExpirationTime; - UpdateField<int64, 10, 11> ClaimEndTime; - UpdateField<int64, 10, 12> TipAmount; - UpdateField<int64, 10, 13> ConsortiumCut; - UpdateField<uint32, 10, 14> Flags; - UpdateField<ObjectGuid, 15, 16> CustomerGUID; - UpdateField<ObjectGuid, 15, 17> CustomerAccountGUID; - UpdateField<ObjectGuid, 15, 18> CrafterGUID; - UpdateField<ObjectGuid, 15, 19> PersonalCrafterGUID; - UpdateField<std::string, 20, 21> CustomerNotes; - OptionalUpdateField<UF::CraftingOrderItem, 20, 22> OutputItem; - OptionalUpdateField<WorldPackets::Item::ItemInstance, 20, 23> OutputItemData; - - void WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const; - void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const; - void ClearChangesMask(); -}; - -struct CraftingOrder : public IsUpdateFieldStructureTag, public HasChangesMask<4> -{ - DynamicUpdateField<WorldPackets::Item::ItemEnchantData, -1, 0> Enchantments; - DynamicUpdateField<WorldPackets::Item::ItemGemData, -1, 1> Gems; - UpdateField<UF::CraftingOrderData, -1, 2> Data; - OptionalUpdateField<WorldPackets::Item::ItemInstance, -1, 3> RecraftItemInfo; - - void WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const; - void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const; - void ClearChangesMask(); -}; - -struct PersonalCraftingOrderCount : public IsUpdateFieldStructureTag, public HasChangesMask<2> -{ - UpdateField<int32, -1, 0> ProfessionID; - UpdateField<uint32, -1, 1> Count; - - void WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const; - void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const; - void ClearChangesMask(); -}; - struct CategoryCooldownMod : public IsUpdateFieldStructureTag { int32 SpellCategoryID; @@ -856,17 +635,6 @@ struct StableInfo : public IsUpdateFieldStructureTag, public HasChangesMask<3> void ClearChangesMask(); }; -struct CollectableSourceTrackedData : public IsUpdateFieldStructureTag, public HasChangesMask<4> -{ - UpdateField<int32, 0, 1> TargetType; - UpdateField<int32, 0, 2> TargetID; - UpdateField<int32, 0, 3> CollectableSourceInfoID; - - void WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const; - void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const; - void ClearChangesMask(); -}; - struct Research : public IsUpdateFieldStructureTag { int16 ResearchProjectID; @@ -877,153 +645,146 @@ struct Research : public IsUpdateFieldStructureTag bool operator!=(Research const& right) const { return !(*this == right); } }; -struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMask<1452> -{ - UpdateField<bool, 0, 1> BackpackAutoSortDisabled; - UpdateField<bool, 0, 2> BackpackSellJunkDisabled; - UpdateField<bool, 0, 3> BankAutoSortDisabled; - UpdateField<bool, 0, 4> SortBagsRightToLeft; - UpdateField<bool, 0, 5> InsertItemsLeftToRight; - UpdateField<bool, 0, 6> HasPerksProgramPendingReward; - UpdateFieldArray<DynamicUpdateFieldBase<uint64>, 8, 36, 37> DataFlags; - UpdateFieldArray<DynamicUpdateFieldBase<uint16>, 1, 38, 39> ResearchSites; - UpdateFieldArray<DynamicUpdateFieldBase<uint32>, 1, 40, 41> ResearchSiteProgress; - UpdateFieldArray<DynamicUpdateFieldBase<UF::Research>, 1, 42, 43> Research; - DynamicUpdateField<uint64, 0, 7> KnownTitles; - DynamicUpdateField<int32, 0, 9> DailyQuestsCompleted; - DynamicUpdateField<int32, 0, 10> AvailableQuestLineXQuestIDs; - DynamicUpdateField<int32, 0, 11> Heirlooms; - DynamicUpdateField<uint32, 0, 12> HeirloomFlags; - DynamicUpdateField<int32, 0, 13> Toys; - DynamicUpdateField<uint32, 0, 14> ToyFlags; - DynamicUpdateField<uint32, 0, 15> Transmog; - DynamicUpdateField<int32, 0, 16> ConditionalTransmog; - DynamicUpdateField<int32, 0, 17> SelfResSpells; - DynamicUpdateField<uint32, 0, 18> RuneforgePowers; - DynamicUpdateField<uint32, 0, 19> TransmogIllusions; - DynamicUpdateField<UF::SpellPctModByLabel, 0, 21> SpellPctModByLabel; - DynamicUpdateField<UF::SpellFlatModByLabel, 0, 22> SpellFlatModByLabel; - DynamicUpdateField<UF::MawPower, 0, 23> MawPowers; - DynamicUpdateField<UF::MultiFloorExplore, 0, 24> MultiFloorExploration; - DynamicUpdateField<UF::RecipeProgressionInfo, 0, 25> RecipeProgression; - DynamicUpdateField<UF::ReplayedQuest, 0, 26> ReplayedQuests; - DynamicUpdateField<UF::QuestLog, 0, 27> TaskQuests; - DynamicUpdateField<int32, 0, 28> DisabledSpells; - DynamicUpdateField<UF::PersonalCraftingOrderCount, 0, 31> PersonalCraftingOrderCounts; - DynamicUpdateField<UF::CategoryCooldownMod, 32, 33> CategoryCooldownMods; - DynamicUpdateField<UF::WeeklySpellUse, 32, 34> WeeklySpellUses; - DynamicUpdateField<UF::CollectableSourceTrackedData, 32, 35> TrackedCollectableSources; - DynamicUpdateField<UF::PVPInfo, 0, 8> PvpInfo; - DynamicUpdateField<UF::CharacterRestriction, 0, 20> CharacterRestrictions; - DynamicUpdateField<UF::TraitConfig, 0, 29> TraitConfigs; - DynamicUpdateField<UF::CraftingOrder, 0, 30> CraftingOrders; - UpdateField<ObjectGuid, 32, 44> FarsightObject; - UpdateField<ObjectGuid, 32, 45> SummonedBattlePetGUID; - UpdateField<uint64, 32, 46> Coinage; - UpdateField<int32, 32, 47> XP; - UpdateField<int32, 32, 48> NextLevelXP; - UpdateField<int32, 32, 49> TrialXP; - UpdateField<UF::SkillInfo, 32, 50> Skill; - UpdateField<int32, 32, 51> CharacterPoints; - UpdateField<int32, 32, 52> MaxTalentTiers; - UpdateField<uint32, 32, 53> TrackCreatureMask; - UpdateField<float, 32, 54> MainhandExpertise; - UpdateField<float, 32, 55> OffhandExpertise; - UpdateField<float, 32, 56> RangedExpertise; - UpdateField<float, 32, 57> CombatRatingExpertise; - UpdateField<float, 32, 58> BlockPercentage; - UpdateField<float, 32, 59> DodgePercentage; - UpdateField<float, 32, 60> DodgePercentageFromAttribute; - UpdateField<float, 32, 61> ParryPercentage; - UpdateField<float, 32, 62> ParryPercentageFromAttribute; - UpdateField<float, 32, 63> CritPercentage; - UpdateField<float, 32, 64> RangedCritPercentage; - UpdateField<float, 32, 65> OffhandCritPercentage; - UpdateField<float, 32, 66> SpellCritPercentage; - UpdateField<int32, 32, 67> ShieldBlock; - UpdateField<float, 32, 68> ShieldBlockCritPercentage; - UpdateField<float, 32, 69> Mastery; - UpdateField<float, 32, 70> Speed; - UpdateField<float, 32, 71> Avoidance; - UpdateField<float, 72, 73> Sturdiness; - UpdateField<int32, 72, 74> Versatility; - UpdateField<float, 72, 75> VersatilityBonus; - UpdateField<float, 72, 76> PvpPowerDamage; - UpdateField<float, 72, 77> PvpPowerHealing; - UpdateField<int32, 72, 78> ModHealingDonePos; - UpdateField<float, 72, 79> ModHealingPercent; - UpdateField<float, 72, 80> ModPeriodicHealingDonePercent; - UpdateField<float, 72, 81> ModSpellPowerPercent; - UpdateField<float, 72, 82> ModResiliencePercent; - UpdateField<float, 72, 83> OverrideSpellPowerByAPPercent; - UpdateField<float, 72, 84> OverrideAPBySpellPowerPercent; - UpdateField<int32, 72, 85> ModTargetResistance; - UpdateField<int32, 72, 86> ModTargetPhysicalResistance; - UpdateField<uint32, 72, 87> LocalFlags; - UpdateField<uint8, 72, 88> GrantableLevels; - UpdateField<uint8, 72, 89> MultiActionBars; - UpdateField<uint8, 72, 90> LifetimeMaxRank; - UpdateField<uint8, 72, 91> NumRespecs; - UpdateField<uint32, 72, 92> PvpMedals; - UpdateField<uint16, 72, 93> TodayHonorableKills; - UpdateField<uint16, 72, 94> YesterdayHonorableKills; - UpdateField<uint32, 72, 95> LifetimeHonorableKills; - UpdateField<int32, 72, 96> WatchedFactionIndex; - UpdateField<int32, 72, 97> MaxLevel; - UpdateField<int32, 72, 98> ScalingPlayerLevelDelta; - UpdateField<int32, 72, 99> MaxCreatureScalingLevel; - UpdateField<int32, 72, 100> PetSpellPower; - UpdateField<float, 72, 101> UiHitModifier; - UpdateField<float, 72, 102> UiSpellHitModifier; - UpdateField<int32, 72, 103> HomeRealmTimeOffset; - UpdateField<float, 104, 105> ModPetHaste; - UpdateField<int8, 104, 106> JailersTowerLevelMax; - UpdateField<int8, 104, 107> JailersTowerLevel; - UpdateField<uint8, 104, 108> LocalRegenFlags; - UpdateField<uint8, 104, 109> AuraVision; - UpdateField<uint8, 104, 110> NumBackpackSlots; - UpdateField<int32, 104, 111> OverrideSpellsID; - UpdateField<uint16, 104, 112> LootSpecID; - UpdateField<uint32, 104, 113> OverrideZonePVPType; - UpdateField<int32, 104, 114> Honor; - UpdateField<int32, 104, 115> HonorNextLevel; - UpdateField<int32, 104, 116> PerksProgramCurrency; - UpdateField<uint8, 104, 117> NumBankSlots; +struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMask<1369> +{ + UpdateField<bool, 0, 1> SortBagsRightToLeft; + UpdateField<bool, 0, 2> InsertItemsLeftToRight; + UpdateFieldArray<DynamicUpdateFieldBase<uint64>, 8, 20, 21> DataFlags; + UpdateFieldArray<DynamicUpdateFieldBase<uint16>, 1, 22, 23> ResearchSites; + UpdateFieldArray<DynamicUpdateFieldBase<uint32>, 1, 24, 25> ResearchSiteProgress; + UpdateFieldArray<DynamicUpdateFieldBase<UF::Research>, 1, 26, 27> Research; + DynamicUpdateField<uint64, 0, 3> KnownTitles; + DynamicUpdateField<int32, 0, 4> DailyQuestsCompleted; + DynamicUpdateField<int32, 0, 5> AvailableQuestLineXQuestIDs; + DynamicUpdateField<int32, 0, 6> Field_1000; + DynamicUpdateField<int32, 0, 7> Heirlooms; + DynamicUpdateField<uint32, 0, 8> HeirloomFlags; + DynamicUpdateField<int32, 0, 9> Toys; + DynamicUpdateField<uint32, 0, 10> Transmog; + DynamicUpdateField<int32, 0, 11> ConditionalTransmog; + DynamicUpdateField<int32, 0, 12> SelfResSpells; + DynamicUpdateField<UF::SpellPctModByLabel, 0, 14> SpellPctModByLabel; + DynamicUpdateField<UF::SpellFlatModByLabel, 0, 15> SpellFlatModByLabel; + DynamicUpdateField<UF::QuestLog, 0, 16> TaskQuests; + DynamicUpdateField<UF::CategoryCooldownMod, 0, 18> CategoryCooldownMods; + DynamicUpdateField<UF::WeeklySpellUse, 0, 19> WeeklySpellUses; + DynamicUpdateField<UF::CharacterRestriction, 0, 13> CharacterRestrictions; + DynamicUpdateField<UF::TraitConfig, 0, 17> TraitConfigs; + UpdateField<ObjectGuid, 0, 28> FarsightObject; + UpdateField<ObjectGuid, 0, 29> SummonedBattlePetGUID; + UpdateField<uint64, 0, 30> Coinage; + UpdateField<int32, 0, 31> XP; + UpdateField<int32, 0, 32> NextLevelXP; + UpdateField<int32, 0, 33> TrialXP; + UpdateField<UF::SkillInfo, 0, 34> Skill; + UpdateField<int32, 0, 35> CharacterPoints; + UpdateField<int32, 0, 36> MaxTalentTiers; + UpdateField<uint32, 0, 37> TrackCreatureMask; + UpdateField<float, 0, 38> MainhandExpertise; + UpdateField<float, 0, 39> OffhandExpertise; + UpdateField<float, 40, 41> RangedExpertise; + UpdateField<float, 40, 42> CombatRatingExpertise; + UpdateField<float, 40, 43> BlockPercentage; + UpdateField<float, 40, 44> DodgePercentage; + UpdateField<float, 40, 45> DodgePercentageFromAttribute; + UpdateField<float, 40, 46> ParryPercentage; + UpdateField<float, 40, 47> ParryPercentageFromAttribute; + UpdateField<float, 40, 48> CritPercentage; + UpdateField<float, 40, 49> RangedCritPercentage; + UpdateField<float, 40, 50> OffhandCritPercentage; + UpdateField<int32, 40, 51> ShieldBlock; + UpdateField<float, 40, 52> ShieldBlockCritPercentage; + UpdateField<float, 40, 53> Mastery; + UpdateField<float, 40, 54> Speed; + UpdateField<float, 40, 55> Avoidance; + UpdateField<float, 40, 56> Sturdiness; + UpdateField<int32, 40, 57> Versatility; + UpdateField<float, 40, 58> VersatilityBonus; + UpdateField<float, 40, 59> PvpPowerDamage; + UpdateField<float, 40, 60> PvpPowerHealing; + UpdateField<int32, 40, 61> ModHealingDonePos; + UpdateField<float, 40, 62> ModHealingPercent; + UpdateField<float, 40, 63> ModHealingDonePercent; + UpdateField<float, 40, 64> ModPeriodicHealingDonePercent; + UpdateField<float, 40, 65> ModSpellPowerPercent; + UpdateField<float, 40, 66> ModResiliencePercent; + UpdateField<float, 40, 67> OverrideSpellPowerByAPPercent; + UpdateField<float, 40, 68> OverrideAPBySpellPowerPercent; + UpdateField<int32, 40, 69> ModTargetResistance; + UpdateField<int32, 40, 70> ModTargetPhysicalResistance; + UpdateField<uint32, 40, 71> LocalFlags; + UpdateField<uint8, 72, 73> GrantableLevels; + UpdateField<uint8, 72, 74> MultiActionBars; + UpdateField<uint8, 72, 75> LifetimeMaxRank; + UpdateField<uint8, 72, 76> NumRespecs; + UpdateField<int32, 72, 77> AmmoID; + UpdateField<uint32, 72, 78> PvpMedals; + UpdateField<uint16, 72, 79> TodayHonorableKills; + UpdateField<uint16, 72, 80> TodayDishonorableKills; + UpdateField<uint16, 72, 81> YesterdayHonorableKills; + UpdateField<uint16, 72, 82> YesterdayDishonorableKills; + UpdateField<uint16, 72, 83> LastWeekHonorableKills; + UpdateField<uint16, 72, 84> LastWeekDishonorableKills; + UpdateField<uint16, 72, 85> ThisWeekHonorableKills; + UpdateField<uint16, 72, 86> ThisWeekDishonorableKills; + UpdateField<uint32, 72, 87> ThisWeekContribution; + UpdateField<uint32, 72, 88> LifetimeHonorableKills; + UpdateField<uint32, 72, 89> LifetimeDishonorableKills; + UpdateField<uint32, 72, 90> Field_F24; + UpdateField<uint32, 72, 91> YesterdayContribution; + UpdateField<uint32, 72, 92> LastWeekContribution; + UpdateField<uint32, 72, 93> LastWeekRank; + UpdateField<int32, 72, 94> WatchedFactionIndex; + UpdateField<int32, 72, 95> MaxLevel; + UpdateField<int32, 72, 96> ScalingPlayerLevelDelta; + UpdateField<int32, 72, 97> MaxCreatureScalingLevel; + UpdateField<int32, 72, 98> PetSpellPower; + UpdateField<float, 72, 99> UiHitModifier; + UpdateField<float, 72, 100> UiSpellHitModifier; + UpdateField<int32, 72, 101> HomeRealmTimeOffset; + UpdateField<float, 72, 102> ModPetHaste; + UpdateField<uint8, 72, 103> LocalRegenFlags; + UpdateField<uint8, 104, 105> AuraVision; + UpdateField<uint8, 104, 106> NumBackpackSlots; + UpdateField<int32, 104, 107> OverrideSpellsID; + UpdateField<int32, 104, 108> LfgBonusFactionID; + UpdateField<uint16, 104, 109> LootSpecID; + UpdateField<uint32, 104, 110> OverrideZonePVPType; + UpdateField<int32, 104, 111> Honor; + UpdateField<int32, 104, 112> HonorNextLevel; + UpdateField<int32, 104, 113> Field_F74; + UpdateField<int32, 104, 114> PvpTierMaxFromWins; + UpdateField<int32, 104, 115> PvpLastWeeksTierMaxFromWins; + UpdateField<uint8, 104, 116> PvpRankProgress; + UpdateField<int32, 104, 117> PerksProgramCurrency; UpdateField<UF::ResearchHistory, 104, 118> ResearchHistory; UpdateField<WorldPackets::PerksProgram::PerksVendorItem, 104, 119> FrozenPerksVendorItem; - UpdateField<UF::ActivePlayerUnk901, 104, 121> Field_1410; - OptionalUpdateField<UF::QuestSession, 104, 120> QuestSession; - UpdateField<int32, 104, 122> UiChromieTimeExpansionID; - UpdateField<int32, 104, 123> TransportServerTime; - UpdateField<uint32, 104, 124> WeeklyRewardsPeriodSinceOrigin; // week count since Cfg_RegionsEntry::ChallengeOrigin - UpdateField<int16, 104, 125> DEBUGSoulbindConduitRank; - UpdateField<WorldPackets::MythicPlus::DungeonScoreData, 104, 126> DungeonScore; - UpdateField<uint32, 104, 127> ActiveCombatTraitConfigID; - UpdateField<int32, 104, 128> ItemUpgradeHighOnehandWeaponItemID; - UpdateField<int32, 104, 129> ItemUpgradeHighFingerItemID; - UpdateField<float, 104, 130> ItemUpgradeHighFingerWatermark; - UpdateField<int32, 104, 131> ItemUpgradeHighTrinketItemID; - UpdateField<float, 104, 132> ItemUpgradeHighTrinketWatermark; - UpdateField<uint64, 104, 133> LootHistoryInstanceID; - OptionalUpdateField<UF::StableInfo, 104, 134> PetStable; - UpdateField<uint8, 104, 135> RequiredMountCapabilityFlags; - UpdateFieldArray<ObjectGuid, 227, 136, 137> InvSlots; - UpdateFieldArray<UF::RestInfo, 2, 364, 365> RestInfo; - UpdateFieldArray<int32, 7, 367, 368> ModDamageDonePos; - UpdateFieldArray<int32, 7, 367, 375> ModDamageDoneNeg; - UpdateFieldArray<float, 7, 367, 382> ModDamageDonePercent; - UpdateFieldArray<float, 7, 367, 389> ModHealingDonePercent; - UpdateFieldArray<float, 3, 396, 397> WeaponDmgMultipliers; - UpdateFieldArray<float, 3, 396, 400> WeaponAtkSpeedMultipliers; - UpdateFieldArray<uint32, 12, 403, 404> BuybackPrice; - UpdateFieldArray<int64, 12, 403, 416> BuybackTimestamp; - UpdateFieldArray<int32, 32, 428, 429> CombatRatings; - UpdateFieldArray<uint32, 4, 461, 462> NoReagentCostMask; - UpdateFieldArray<int32, 2, 466, 467> ProfessionSkillLine; - UpdateFieldArray<uint32, 5, 469, 470> BagSlotFlags; - UpdateFieldArray<uint32, 7, 475, 476> BankBagSlotFlags; - UpdateFieldArray<uint64, 950, 483, 484> QuestCompleted; - UpdateFieldArray<float, 17, 1434, 1435> ItemUpgradeHighWatermark; + UpdateField<int32, 104, 120> TransportServerTime; + UpdateField<uint32, 104, 121> ActiveCombatTraitConfigID; + UpdateField<uint8, 104, 122> GlyphsEnabled; + UpdateField<uint8, 104, 123> LfgRoles; + OptionalUpdateField<UF::StableInfo, 104, 124> PetStable; + UpdateField<uint8, 104, 125> NumStableSlots; + UpdateFieldArray<ObjectGuid, 141, 126, 127> InvSlots; + UpdateFieldArray<uint32, 2, 268, 269> TrackResourceMask; + UpdateFieldArray<float, 7, 271, 272> SpellCritPercentage; + UpdateFieldArray<int32, 7, 271, 279> ModDamageDonePos; + UpdateFieldArray<int32, 7, 271, 286> ModDamageDoneNeg; + UpdateFieldArray<float, 7, 271, 293> ModDamageDonePercent; + UpdateFieldArray<UF::RestInfo, 2, 300, 301> RestInfo; + UpdateFieldArray<float, 3, 303, 304> WeaponDmgMultipliers; + UpdateFieldArray<float, 3, 303, 307> WeaponAtkSpeedMultipliers; + UpdateFieldArray<uint32, 12, 310, 311> BuybackPrice; + UpdateFieldArray<int64, 12, 310, 323> BuybackTimestamp; + UpdateFieldArray<int32, 32, 335, 336> CombatRatings; + UpdateFieldArray<UF::PVPInfo, 9, 368, 369> PvpInfo; + UpdateFieldArray<uint32, 4, 378, 379> NoReagentCostMask; + UpdateFieldArray<int32, 2, 383, 384> ProfessionSkillLine; + UpdateFieldArray<uint32, 4, 386, 387> BagSlotFlags; + UpdateFieldArray<uint32, 7, 391, 392> BankBagSlotFlags; + UpdateFieldArray<uint64, 950, 399, 400> QuestCompleted; + UpdateFieldArray<uint32, 9, 1350, 1351> GlyphSlots; + UpdateFieldArray<uint32, 9, 1350, 1360> Glyphs; void WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Player const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Player const* owner, Player const* receiver) const; @@ -1031,7 +792,7 @@ struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMas void ClearChangesMask(); }; -struct GameObjectData : public IsUpdateFieldStructureTag, public HasChangesMask<25> +struct GameObjectData : public IsUpdateFieldStructureTag, public HasChangesMask<20> { UpdateField<std::vector<uint32>, 0, 1> StateWorldEffectIDs; DynamicUpdateField<int32, 0, 2> EnableDoodadSets; @@ -1041,24 +802,19 @@ struct GameObjectData : public IsUpdateFieldStructureTag, public HasChangesMask< UpdateField<uint32, 0, 6> StateSpellVisualID; UpdateField<uint32, 0, 7> SpawnTrackingStateAnimID; UpdateField<uint32, 0, 8> SpawnTrackingStateAnimKitID; - UpdateField<uint32, 0, 9> StateWorldEffectsQuestObjectiveID; - UpdateField<ObjectGuid, 0, 10> CreatedBy; - UpdateField<ObjectGuid, 0, 11> GuildGUID; - UpdateField<uint32, 0, 12> Flags; + UpdateField<ObjectGuid, 0, 9> CreatedBy; + UpdateField<ObjectGuid, 0, 10> GuildGUID; + UpdateField<uint32, 0, 11> Flags; struct FlagsTag : ViewerDependentValueTag<uint32> {}; - UpdateField<QuaternionData, 0, 13> ParentRotation; - UpdateField<int32, 0, 14> FactionTemplate; + UpdateField<QuaternionData, 0, 12> ParentRotation; + UpdateField<int32, 0, 13> FactionTemplate; + UpdateField<int32, 0, 14> Level; UpdateField<int8, 0, 15> State; struct StateTag : ViewerDependentValueTag<int8> {}; UpdateField<int8, 0, 16> TypeID; UpdateField<uint8, 0, 17> PercentHealth; UpdateField<uint32, 0, 18> ArtKit; UpdateField<uint32, 0, 19> CustomParam; - UpdateField<int32, 0, 20> Level; - UpdateField<uint32, 0, 21> AnimGroupInstance; - UpdateField<uint32, 0, 22> UiWidgetItemID; - UpdateField<uint32, 0, 23> UiWidgetItemQuality; - UpdateField<uint32, 0, 24> UiWidgetItemUnknown1000; void WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, GameObject const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, GameObject const* owner, Player const* receiver) const; @@ -1070,7 +826,7 @@ struct DynamicObjectData : public IsUpdateFieldStructureTag, public HasChangesMa { UpdateField<ObjectGuid, 0, 1> Caster; UpdateField<uint8, 0, 2> Type; - UpdateField<UF::SpellCastVisual, 0, 3> SpellVisual; + UpdateField<int32, 0, 3> SpellXSpellVisualID; UpdateField<int32, 0, 4> SpellID; UpdateField<float, 0, 5> Radius; UpdateField<uint32, 0, 6> CastTime; @@ -1081,7 +837,7 @@ struct DynamicObjectData : public IsUpdateFieldStructureTag, public HasChangesMa void ClearChangesMask(); }; -struct CorpseData : public IsUpdateFieldStructureTag, public HasChangesMask<33> +struct CorpseData : public IsUpdateFieldStructureTag, public HasChangesMask<32> { DynamicUpdateField<UF::ChrCustomizationChoice, 0, 1> Customizations; UpdateField<uint32, 0, 2> DynamicFlags; @@ -1094,8 +850,7 @@ struct CorpseData : public IsUpdateFieldStructureTag, public HasChangesMask<33> UpdateField<uint8, 0, 9> Class; UpdateField<uint32, 0, 10> Flags; UpdateField<int32, 0, 11> FactionTemplate; - UpdateField<uint32, 0, 12> StateSpellVisualKitID; - UpdateFieldArray<uint32, 19, 13, 14> Items; + UpdateFieldArray<uint32, 19, 12, 13> Items; void WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Corpse const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Corpse const* owner, Player const* receiver) const; @@ -1127,33 +882,27 @@ struct VisualAnim : public IsUpdateFieldStructureTag, public HasChangesMask<5> void ClearChangesMask(); }; -struct AreaTriggerData : public IsUpdateFieldStructureTag, public HasChangesMask<26> -{ - UpdateField<bool, 0, 1> HeightIgnoresScale; - UpdateField<bool, 0, 2> Field_261; - UpdateField<UF::ScaleCurve, 0, 3> OverrideScaleCurve; - UpdateField<UF::ScaleCurve, 0, 4> ExtraScaleCurve; - UpdateField<UF::ScaleCurve, 0, 5> OverrideMoveCurveX; - UpdateField<UF::ScaleCurve, 0, 6> OverrideMoveCurveY; - UpdateField<UF::ScaleCurve, 0, 7> OverrideMoveCurveZ; - UpdateField<ObjectGuid, 0, 8> Caster; - UpdateField<uint32, 0, 9> Duration; - UpdateField<uint32, 0, 10> TimeToTarget; - UpdateField<uint32, 0, 11> TimeToTargetScale; - UpdateField<uint32, 0, 12> TimeToTargetExtraScale; - UpdateField<uint32, 0, 13> TimeToTargetPos; // Linked to m_overrideMoveCurve - UpdateField<int32, 0, 14> SpellID; - UpdateField<int32, 0, 15> SpellForVisuals; - UpdateField<UF::SpellCastVisual, 0, 16> SpellVisual; - UpdateField<float, 0, 17> BoundsRadius2D; - UpdateField<uint32, 0, 18> DecalPropertiesID; - UpdateField<ObjectGuid, 0, 19> CreatingEffectGUID; - UpdateField<uint32, 0, 20> NumUnitsInside; - UpdateField<uint32, 0, 21> NumPlayersInside; // When not 0 this causes SpellVisualEvent 14 to trigger, playing alternate visuals, typically used by "SOAK THIS" areatriggers - UpdateField<ObjectGuid, 0, 22> OrbitPathTarget; - UpdateField<TaggedPosition<Position::XYZ>, 0, 23> RollPitchYaw; - UpdateField<int32, 0, 24> PositionalSoundKitID; - UpdateField<UF::VisualAnim, 0, 25> VisualAnim; +struct AreaTriggerData : public IsUpdateFieldStructureTag, public HasChangesMask<20> +{ + UpdateField<UF::ScaleCurve, 0, 1> OverrideScaleCurve; + UpdateField<UF::ScaleCurve, 0, 2> ExtraScaleCurve; + UpdateField<UF::ScaleCurve, 0, 3> OverrideMoveCurveX; + UpdateField<UF::ScaleCurve, 0, 4> OverrideMoveCurveY; + UpdateField<UF::ScaleCurve, 0, 5> OverrideMoveCurveZ; + UpdateField<ObjectGuid, 0, 6> Caster; + UpdateField<uint32, 0, 7> Duration; + UpdateField<uint32, 0, 8> TimeToTarget; + UpdateField<uint32, 0, 9> TimeToTargetScale; + UpdateField<uint32, 0, 10> TimeToTargetExtraScale; + UpdateField<uint32, 0, 11> TimeToTargetPos; // Linked to m_overrideMoveCurve + UpdateField<int32, 0, 12> SpellID; + UpdateField<int32, 0, 13> SpellForVisuals; + UpdateField<int32, 0, 14> SpellXSpellVisualID; + UpdateField<float, 0, 15> BoundsRadius2D; + UpdateField<uint32, 0, 16> DecalPropertiesID; + UpdateField<ObjectGuid, 0, 17> CreatingEffectGUID; + UpdateField<ObjectGuid, 0, 18> OrbitPathTarget; + UpdateField<UF::VisualAnim, 0, 19> VisualAnim; void WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, AreaTrigger const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, AreaTrigger const* owner, Player const* receiver) const; @@ -1183,7 +932,6 @@ struct ConversationLine : public IsUpdateFieldStructureTag int32 UiCameraID; uint8 ActorIndex; uint8 Flags; - uint8 ChatType; void WriteCreate(ByteBuffer& data, Conversation const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Conversation const* owner, Player const* receiver) const; @@ -1193,12 +941,11 @@ struct ConversationLine : public IsUpdateFieldStructureTag struct ConversationActor : public IsUpdateFieldStructureTag { + uint32 Type; + int32 Id; uint32 CreatureID; uint32 CreatureDisplayInfoID; ObjectGuid ActorGUID; - int32 Id; - uint32 Type; - uint32 NoActorObject; void WriteCreate(ByteBuffer& data, Conversation const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Conversation const* owner, Player const* receiver) const; @@ -1206,22 +953,18 @@ struct ConversationActor : public IsUpdateFieldStructureTag bool operator!=(ConversationActor const& right) const { return !(*this == right); } }; -struct ConversationData : public IsUpdateFieldStructureTag, public HasChangesMask<7> +struct ConversationData : public IsUpdateFieldStructureTag, public HasChangesMask<4> { - UpdateField<bool, 0, 1> DontPlayBroadcastTextSounds; - UpdateField<std::vector<UF::ConversationLine>, 0, 2> Lines; - DynamicUpdateField<UF::ConversationActor, 0, 3> Actors; - UpdateField<int32, 0, 4> LastLineEndTime; + UpdateField<std::vector<UF::ConversationLine>, 0, 1> Lines; + DynamicUpdateField<UF::ConversationActor, 0, 2> Actors; + UpdateField<int32, 0, 3> LastLineEndTime; struct LastLineEndTimeTag : ViewerDependentValueTag<int32> {}; - UpdateField<uint32, 0, 5> Progress; - UpdateField<uint32, 0, 6> Flags; void WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Conversation const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Conversation const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignoreNestedChangesMask, Conversation const* owner, Player const* receiver) const; void ClearChangesMask(); }; - } #endif // UpdateFields_h__ diff --git a/src/server/game/Entities/Player/CollectionMgr.cpp b/src/server/game/Entities/Player/CollectionMgr.cpp index a2b27285f17..2089afdcb86 100644 --- a/src/server/game/Entities/Player/CollectionMgr.cpp +++ b/src/server/game/Entities/Player/CollectionMgr.cpp @@ -880,13 +880,9 @@ void CollectionMgr::SendFavoriteAppearances() const _owner->SendPacket(accountTransmogUpdate.Write()); } +// @TODO: Remove void CollectionMgr::LoadTransmogIllusions() { - Player* owner = _owner->GetPlayer(); - boost::to_block_range(*_transmogIllusions, DynamicBitsetBlockOutputIterator([owner](uint32 blockValue) - { - owner->AddIllusionBlock(blockValue); - })); } void CollectionMgr::LoadAccountTransmogIllusions(PreparedQueryResult knownTransmogIllusions) @@ -947,23 +943,9 @@ void CollectionMgr::SaveAccountTransmogIllusions(LoginDatabaseTransaction trans) })); } -void CollectionMgr::AddTransmogIllusion(uint32 transmogIllusionId) +// @TODO: Remove +void CollectionMgr::AddTransmogIllusion(uint32 /*transmogIllusionId*/) { - Player* owner = _owner->GetPlayer(); - if (_transmogIllusions->size() <= transmogIllusionId) - { - std::size_t numBlocks = _transmogIllusions->num_blocks(); - _transmogIllusions->resize(transmogIllusionId + 1); - numBlocks = _transmogIllusions->num_blocks() - numBlocks; - while (numBlocks--) - owner->AddIllusionBlock(0); - } - - _transmogIllusions->set(transmogIllusionId); - uint32 blockIndex = transmogIllusionId / 32; - uint32 bitIndex = transmogIllusionId % 32; - - owner->AddIllusionFlag(blockIndex, 1 << bitIndex); } bool CollectionMgr::HasTransmogIllusion(uint32 transmogIllusionId) const diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index a5e59506fcc..9c916689153 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -21,8 +21,6 @@ #include "AchievementMgr.h" #include "ArenaTeam.h" #include "ArenaTeamMgr.h" -#include "AzeriteEmpoweredItem.h" -#include "AzeriteItem.h" #include "Bag.h" #include "Battlefield.h" #include "BattlefieldMgr.h" @@ -2464,7 +2462,6 @@ void Player::InitStatsForLevel(bool reapplyMods) SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::ModDamageDoneNeg, i), 0); SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::ModDamageDonePos, i), 0); SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::ModDamageDonePercent, i), 1.0f); - SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::ModHealingDonePercent, i), 1.0f); } SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::ModSpellPowerPercent), 1.0f); @@ -2496,7 +2493,8 @@ void Player::InitStatsForLevel(bool reapplyMods) SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::RangedCritPercentage), 0.0f); // Init spell schools (will be recalculated in UpdateAllStats() at loading and in _ApplyAllStatBonuses() at reset - SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::SpellCritPercentage), 0.0f); + for (uint8 i = SPELL_SCHOOL_NORMAL; i < MAX_SPELL_SCHOOL; ++i) + SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::SpellCritPercentage, i), 0.0f); SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::ParryPercentage), 0.0f); SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::BlockPercentage), 0.0f); @@ -2508,18 +2506,13 @@ void Player::InitStatsForLevel(bool reapplyMods) // set armor (resistance 0) to original value (create_agility*2) SetArmor(int32(m_createStats[STAT_AGILITY] * 2), 0); - SetBonusResistanceMod(SPELL_SCHOOL_NORMAL, 0); + // set other resistance to original value (0) for (uint8 i = SPELL_SCHOOL_HOLY; i < MAX_SPELL_SCHOOL; ++i) - { SetResistance(SpellSchools(i), 0); - SetBonusResistanceMod(SpellSchools(i), 0); - } SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::ModTargetResistance), 0); SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::ModTargetPhysicalResistance), 0); - for (uint8 i = SPELL_SCHOOL_NORMAL; i < MAX_SPELL_SCHOOL; ++i) - SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::ManaCostModifier, i), 0); // Reset no reagent cost field SetNoRegentCostMask(flag128()); @@ -3899,25 +3892,8 @@ void Player::DeleteFromDB(ObjectGuid playerguid, uint32 accountId, bool updateRe stmt->setUInt64(0, guid); PreparedQueryResult artifactResult = CharacterDatabase.Query(stmt); - stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_MAILITEMS_AZERITE); - stmt->setUInt64(0, guid); - PreparedQueryResult azeriteResult = CharacterDatabase.Query(stmt); - - stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_MAILITEMS_AZERITE_MILESTONE_POWER); - stmt->setUInt64(0, guid); - PreparedQueryResult azeriteItemMilestonePowersResult = CharacterDatabase.Query(stmt); - - stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_MAILITEMS_AZERITE_UNLOCKED_ESSENCE); - stmt->setUInt64(0, guid); - PreparedQueryResult azeriteItemUnlockedEssencesResult = CharacterDatabase.Query(stmt); - - stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_MAILITEMS_AZERITE_EMPOWERED); - stmt->setUInt64(0, guid); - PreparedQueryResult azeriteEmpoweredItemResult = CharacterDatabase.Query(stmt); - std::unordered_map<ObjectGuid::LowType, ItemAdditionalLoadInfo> additionalData; - ItemAdditionalLoadInfo::Init(&additionalData, artifactResult, azeriteResult, azeriteItemMilestonePowersResult, - azeriteItemUnlockedEssencesResult, azeriteEmpoweredItemResult); + ItemAdditionalLoadInfo::Init(&additionalData, artifactResult); do { @@ -4133,22 +4109,6 @@ void Player::DeleteFromDB(ObjectGuid playerguid, uint32 accountId, bool updateRe stmt->setUInt64(0, guid); trans->Append(stmt); - stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE_AZERITE_BY_OWNER); - stmt->setUInt64(0, guid); - trans->Append(stmt); - - stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE_AZERITE_MILESTONE_POWER_BY_OWNER); - stmt->setUInt64(0, guid); - trans->Append(stmt); - - stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE_AZERITE_UNLOCKED_ESSENCE_BY_OWNER); - stmt->setUInt64(0, guid); - trans->Append(stmt); - - stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE_AZERITE_EMPOWERED_BY_OWNER); - stmt->setUInt64(0, guid); - trans->Append(stmt); - stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE_BY_OWNER); stmt->setUInt64(0, guid); trans->Append(stmt); @@ -7073,15 +7033,6 @@ void Player::ModifyCurrency(uint32 id, int32 amount, CurrencyGainSource gainSour return; } - // Azerite - if (id == CURRENCY_TYPE_AZERITE) - { - if (amount > 0) - if (Item* heartOfAzeroth = GetItemByEntry(ITEM_ID_HEART_OF_AZEROTH, ItemSearchLocation::Everywhere)) - heartOfAzeroth->ToAzeriteItem()->GiveXP(uint64(amount)); - return; - } - PlayerCurrenciesMap::iterator itr = _currencyStorage.find(id); if (itr == _currencyStorage.end()) { @@ -7789,7 +7740,6 @@ void Player::_ApplyItemMods(Item* item, uint8 slot, bool apply, bool updateItemA UpdateWeaponDependentAuras(attackType); } ApplyArtifactPowers(item, apply); - ApplyAzeritePowers(item, apply); ApplyEnchantment(item, apply); TC_LOG_DEBUG("entities.player.items", "Player::_ApplyItemMods: completed"); @@ -8049,6 +7999,7 @@ void Player::_ApplyItemBonuses(Item* item, uint8 slot, bool apply) _ApplyWeaponDamage(slot, item, apply); } +// @TODO: Ovahlord ScalingStat db2s void Player::_ApplyWeaponDamage(uint8 slot, Item* item, bool apply) { ItemTemplate const* proto = item->GetTemplate(); @@ -8056,43 +8007,46 @@ void Player::_ApplyWeaponDamage(uint8 slot, Item* item, bool apply) if (!IsInFeralForm() && apply && !CanUseAttackType(attType)) return; - float damage = 0.0f; - uint32 itemLevel = item->GetItemLevel(this); - float minDamage, maxDamage; - proto->GetDamage(itemLevel, minDamage, maxDamage); + // ScalingStatDistributionEntry const* ssd = sScalingStatDistributionStore.LookupEntry(proto->GetScalingStatDistributionID()); + // ScalingStatValuesEntry const* ssv = (ssd && proto->GetScalingStatValue() != 0) ? sDB2Manager.GetScalingStatValuesForLevel(std::clamp<uint32>(GetLevel(), ssd->MinLevel, ssd->MaxLevel)) : nullptr; - if (minDamage > 0) + float damage = 0.0f; + //for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i) { - damage = apply ? minDamage : BASE_MINDAMAGE; - SetBaseWeaponDamage(attType, MINDAMAGE, damage); - } + float minDamage = 0.0f; // proto->GetMinDamage(0); + float maxDamage = 0.0f; // proto->GetMaxDamage(0); - if (maxDamage > 0) - { - damage = apply ? maxDamage : BASE_MAXDAMAGE; - SetBaseWeaponDamage(attType, MAXDAMAGE, damage); + // If set dpsMod in ScalingStatValue use it for min (70% from average), max (130% from average) damage + // if (ssv) + // { + // int32 extraDPS = ssv->getDPSMod(proto->GetScalingStatValue()); + // if (extraDPS) + // { + // float average = extraDPS * proto->GetDelay() / 1000.0f; + // float mod = ssv->isTwoHand(proto->GetScalingStatValue()) ? 0.2f : 0.3f; + // + // minDamage = (1.0f - mod) * average; + // maxDamage = (1.0f + mod) * average; + // } + // } + + if (minDamage > 0) + { + damage = apply ? minDamage : BASE_MINDAMAGE; + SetBaseWeaponDamage(attType, MINDAMAGE, damage); + } + + if (maxDamage > 0) + { + damage = apply ? maxDamage : BASE_MAXDAMAGE; + SetBaseWeaponDamage(attType, MAXDAMAGE, damage); + } } SpellShapeshiftFormEntry const* shapeshift = sSpellShapeshiftFormStore.LookupEntry(GetShapeshiftForm()); if (proto->GetDelay() && !(shapeshift && shapeshift->CombatRoundTime)) SetBaseAttackTime(attType, apply ? proto->GetDelay() : BASE_ATTACK_TIME); - int32 weaponBasedAttackPower = apply ? int32(proto->GetDPS(itemLevel) * 6.0f) : 0; - switch (attType) - { - case BASE_ATTACK: - SetMainHandWeaponAttackPower(weaponBasedAttackPower); - break; - case OFF_ATTACK: - SetOffHandWeaponAttackPower(weaponBasedAttackPower); - break; - case RANGED_ATTACK: - SetRangedWeaponAttackPower(weaponBasedAttackPower); - break; - default: - break; - } - if (CanModifyStats() && (damage || proto->GetDelay())) UpdateDamagePhysical(attType); } @@ -8413,110 +8367,6 @@ void Player::ApplyArtifactPowerRank(Item* artifact, ArtifactPowerRankEntry const } -void Player::ApplyAzeritePowers(Item* item, bool apply) -{ - if (AzeriteItem* azeriteItem = item->ToAzeriteItem()) - { - // milestone powers - for (uint32 azeriteItemMilestonePowerId : azeriteItem->m_azeriteItemData->UnlockedEssenceMilestones) - ApplyAzeriteItemMilestonePower(azeriteItem, sAzeriteItemMilestonePowerStore.AssertEntry(azeriteItemMilestonePowerId), apply); - - // essences - if (UF::SelectedAzeriteEssences const* selectedEssences = azeriteItem->GetSelectedAzeriteEssences()) - for (uint8 slot = 0; slot < MAX_AZERITE_ESSENCE_SLOT; ++slot) - if (selectedEssences->AzeriteEssenceID[slot]) - ApplyAzeriteEssence(azeriteItem, selectedEssences->AzeriteEssenceID[slot], azeriteItem->GetEssenceRank(selectedEssences->AzeriteEssenceID[slot]), - AzeriteItemMilestoneType(sDB2Manager.GetAzeriteItemMilestonePower(slot)->Type) == AzeriteItemMilestoneType::MajorEssence, apply); - } - else if (AzeriteEmpoweredItem* azeriteEmpoweredItem = item->ToAzeriteEmpoweredItem()) - { - if (!apply || GetItemByEntry(ITEM_ID_HEART_OF_AZEROTH, ItemSearchLocation::Equipment)) - for (int32 i = 0; i < MAX_AZERITE_EMPOWERED_TIER; ++i) - if (AzeritePowerEntry const* azeritePower = sAzeritePowerStore.LookupEntry(azeriteEmpoweredItem->GetSelectedAzeritePower(i))) - ApplyAzeritePower(azeriteEmpoweredItem, azeritePower, apply); - } -} - -void Player::ApplyAzeriteItemMilestonePower(AzeriteItem* item, AzeriteItemMilestonePowerEntry const* azeriteItemMilestonePower, bool apply) -{ - AzeriteItemMilestoneType type = AzeriteItemMilestoneType(azeriteItemMilestonePower->Type); - if (type == AzeriteItemMilestoneType::BonusStamina) - { - if (AzeritePowerEntry const* azeritePower = sAzeritePowerStore.LookupEntry(azeriteItemMilestonePower->AzeritePowerID)) - { - if (apply) - CastSpell(this, azeritePower->SpellID, item); - else - RemoveAurasDueToItemSpell(azeritePower->SpellID, item->GetGUID()); - } - } -} - -void Player::ApplyAzeriteEssence(AzeriteItem* item, uint32 azeriteEssenceId, uint32 rank, bool major, bool apply) -{ - for (uint32 currentRank = 1; currentRank <= rank; ++currentRank) - { - if (AzeriteEssencePowerEntry const* azeriteEssencePower = sDB2Manager.GetAzeriteEssencePower(azeriteEssenceId, currentRank)) - { - ApplyAzeriteEssencePower(item, azeriteEssencePower, major, apply); - if (major && currentRank == 1) - { - if (apply) - { - CastSpellExtraArgs args(TRIGGERED_FULL_MASK); - args.AddSpellMod(SPELLVALUE_BASE_POINT0, azeriteEssencePower->MajorPowerDescription); - CastSpell(this, SPELL_ID_HEART_ESSENCE_ACTION_BAR_OVERRIDE, args); - } - else - RemoveAurasDueToSpell(SPELL_ID_HEART_ESSENCE_ACTION_BAR_OVERRIDE); - } - } - } -} - -void Player::ApplyAzeriteEssencePower(AzeriteItem* item, AzeriteEssencePowerEntry const* azeriteEssencePower, bool major, bool apply) -{ - if (SpellInfo const* powerSpell = sSpellMgr->GetSpellInfo(azeriteEssencePower->MinorPowerDescription, DIFFICULTY_NONE)) - { - if (apply) - CastSpell(this, powerSpell->Id, item); - else - RemoveAurasDueToItemSpell(powerSpell->Id, item->GetGUID()); - } - - if (major) - { - if (SpellInfo const* powerSpell = sSpellMgr->GetSpellInfo(azeriteEssencePower->MajorPowerDescription, DIFFICULTY_NONE)) - { - if (powerSpell->IsPassive()) - { - if (apply) - CastSpell(this, powerSpell->Id, item); - else - RemoveAurasDueToItemSpell(powerSpell->Id, item->GetGUID()); - } - else - { - if (apply) - LearnSpell(powerSpell->Id, true, 0, true); - else - RemoveSpell(powerSpell->Id, false, false, true); - } - } - } -} - -void Player::ApplyAzeritePower(AzeriteEmpoweredItem* item, AzeritePowerEntry const* azeritePower, bool apply) -{ - if (apply) - { - if (!azeritePower->SpecSetID || sDB2Manager.IsSpecSetMember(azeritePower->SpecSetID, AsUnderlyingType(GetPrimarySpecialization()))) - CastSpell(this, azeritePower->SpellID, item); - } - else - RemoveAurasDueToItemSpell(azeritePower->SpellID, item->GetGUID()); -} - void Player::CastItemCombatSpell(DamageInfo const& damageInfo) { Unit* target = damageInfo.GetVictim(); @@ -8904,34 +8754,6 @@ void Player::_ApplyAllLevelScaleItemMods(bool apply) } } -void Player::ApplyAllAzeriteItemMods(bool apply) -{ - for (uint8 i = 0; i < INVENTORY_SLOT_BAG_END; ++i) - { - if (m_items[i]) - { - if (!m_items[i]->IsAzeriteItem() || m_items[i]->IsBroken() || !CanUseAttackType(Player::GetAttackBySlot(i, m_items[i]->GetTemplate()->GetInventoryType()))) - continue; - - ApplyAzeritePowers(m_items[i], apply); - } - } -} - -void Player::ApplyAllAzeriteEmpoweredItemMods(bool apply) -{ - for (uint8 i = 0; i < INVENTORY_SLOT_BAG_END; ++i) - { - if (m_items[i]) - { - if (!m_items[i]->IsAzeriteEmpoweredItem() || m_items[i]->IsBroken() || !CanUseAttackType(Player::GetAttackBySlot(i, m_items[i]->GetTemplate()->GetInventoryType()))) - continue; - - ApplyAzeritePowers(m_items[i], apply); - } - } -} - Loot* Player::GetLootByWorldObjectGUID(ObjectGuid const& lootWorldObjectGuid) const { auto itr = std::find_if(m_AELootView.begin(), m_AELootView.end(), [&lootWorldObjectGuid](std::pair<ObjectGuid const, Loot*> const& lootView) @@ -11869,14 +11691,12 @@ void Player::SetVisibleItemSlot(uint8 slot, Item* pItem) if (pItem) { SetUpdateFieldValue(itemField.ModifyValue(&UF::VisibleItem::ItemID), pItem->GetVisibleEntry(this)); - SetUpdateFieldValue(itemField.ModifyValue(&UF::VisibleItem::SecondaryItemModifiedAppearanceID), pItem->GetVisibleSecondaryModifiedAppearanceId(this)); SetUpdateFieldValue(itemField.ModifyValue(&UF::VisibleItem::ItemAppearanceModID), pItem->GetVisibleAppearanceModId(this)); SetUpdateFieldValue(itemField.ModifyValue(&UF::VisibleItem::ItemVisual), pItem->GetVisibleItemVisual(this)); } else { SetUpdateFieldValue(itemField.ModifyValue(&UF::VisibleItem::ItemID), 0); - SetUpdateFieldValue(itemField.ModifyValue(&UF::VisibleItem::SecondaryItemModifiedAppearanceID), 0); SetUpdateFieldValue(itemField.ModifyValue(&UF::VisibleItem::ItemAppearanceModID), 0); SetUpdateFieldValue(itemField.ModifyValue(&UF::VisibleItem::ItemVisual), 0); } @@ -14297,7 +14117,7 @@ int32 Player::GetQuestMinLevel(Quest const* quest) const int32 Player::GetQuestMinLevel(uint32 contentTuningId) const { - if (Optional<ContentTuningLevels> questLevels = sDB2Manager.GetContentTuningData(contentTuningId, m_playerData->CtrOptions->ContentTuningConditionMask)) + if (Optional<ContentTuningLevels> questLevels = sDB2Manager.GetContentTuningData(contentTuningId, 0 /*m_playerData->CtrOptions->ContentTuningConditionMask*/)) { ChrRacesEntry const* race = sChrRacesStore.AssertEntry(GetRace()); FactionTemplateEntry const* raceFaction = sFactionTemplateStore.AssertEntry(race->FactionID); @@ -14321,7 +14141,7 @@ int32 Player::GetQuestLevel(Quest const* quest) const int32 Player::GetQuestLevel(uint32 contentTuningId) const { - if (Optional<ContentTuningLevels> questLevels = sDB2Manager.GetContentTuningData(contentTuningId, m_playerData->CtrOptions->ContentTuningConditionMask)) + if (Optional<ContentTuningLevels> questLevels = sDB2Manager.GetContentTuningData(contentTuningId, 0 /*m_playerData->CtrOptions->ContentTuningConditionMask*/)) { int32 minLevel = GetQuestMinLevel(contentTuningId); int32 maxLevel = questLevels->MaxLevel; @@ -16327,13 +16147,6 @@ int64 Player::GetQuestSlotEndTime(uint16 slot) const return m_playerData->QuestLog[slot].EndTime; } -bool Player::GetQuestSlotObjectiveFlag(uint16 slot, int8 objectiveIndex) const -{ - if (objectiveIndex < MAX_QUEST_COUNTS) - return (*m_playerData->QuestLog[slot].ObjectiveFlags) & (1 << objectiveIndex); - return false; -} - int32 Player::GetQuestSlotObjectiveData(uint16 slot, QuestObjective const& objective) const { if (objective.StorageIndex < 0) @@ -16353,7 +16166,7 @@ int32 Player::GetQuestSlotObjectiveData(uint16 slot, QuestObjective const& objec if (!objective.IsStoringFlag()) return GetQuestSlotCounter(slot, objective.StorageIndex); - return GetQuestSlotObjectiveFlag(slot, objective.StorageIndex) ? 1 : 0; + return uint8((GetQuestSlotState(slot) & objective.StorageIndex) != 0); } int32 Player::GetQuestObjectiveData(uint32 questId, uint32 objectiveId) const @@ -16375,7 +16188,6 @@ void Player::SetQuestSlot(uint16 slot, uint32 quest_id) SetUpdateFieldValue(questLogField.ModifyValue(&UF::QuestLog::QuestID), quest_id); SetUpdateFieldValue(questLogField.ModifyValue(&UF::QuestLog::StateFlags), 0); SetUpdateFieldValue(questLogField.ModifyValue(&UF::QuestLog::EndTime), 0); - SetUpdateFieldValue(questLogField.ModifyValue(&UF::QuestLog::ObjectiveFlags), 0); for (uint32 i = 0; i < MAX_QUEST_COUNTS; ++i) SetUpdateFieldValue(questLogField.ModifyValue(&UF::QuestLog::ObjectiveProgress, i), 0); } @@ -16411,20 +16223,6 @@ void Player::SetQuestSlotEndTime(uint16 slot, time_t endTime) .ModifyValue(&UF::QuestLog::EndTime), uint32(endTime)); } -void Player::SetQuestSlotObjectiveFlag(uint16 slot, int8 objectiveIndex) -{ - SetUpdateFieldFlagValue(m_values.ModifyValue(&Player::m_playerData) - .ModifyValue(&UF::PlayerData::QuestLog, slot) - .ModifyValue(&UF::QuestLog::ObjectiveFlags), 1 << objectiveIndex); -} - -void Player::RemoveQuestSlotObjectiveFlag(uint16 slot, int8 objectiveIndex) -{ - RemoveUpdateFieldFlagValue(m_values.ModifyValue(&Player::m_playerData) - .ModifyValue(&UF::PlayerData::QuestLog, slot) - .ModifyValue(&UF::QuestLog::ObjectiveFlags), 1 << objectiveIndex); -} - void Player::SetQuestCompletedBit(uint32 questBit, bool completed) { if (!questBit) @@ -16891,9 +16689,9 @@ void Player::SetQuestObjectiveData(QuestObjective const& objective, int32 data) if (!objective.IsStoringFlag()) SetQuestSlotCounter(status.Slot, objective.StorageIndex, data); else if (data) - SetQuestSlotObjectiveFlag(status.Slot, objective.StorageIndex); + SetQuestSlotState(status.Slot, 256 << objective.StorageIndex); else - RemoveQuestSlotObjectiveFlag(status.Slot, objective.StorageIndex); + RemoveQuestSlotState(status.Slot, 256 << objective.StorageIndex); } bool Player::IsQuestObjectiveCompletable(uint16 slot, Quest const* quest, QuestObjective const& objective) const @@ -18179,10 +17977,6 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder const& hol _LoadInventory(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_INVENTORY), holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_ARTIFACTS), - holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_AZERITE), - holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_AZERITE_MILESTONE_POWERS), - holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_AZERITE_UNLOCKED_ESSENCES), - holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_AZERITE_EMPOWERED), time_diff); if (IsVoidStorageUnlocked()) @@ -18196,11 +17990,7 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder const& hol // unread mails and next delivery time, actual mails not loaded _LoadMail(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_MAILS), holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_MAIL_ITEMS), - holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_MAIL_ITEMS_ARTIFACT), - holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_MAIL_ITEMS_AZERITE), - holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_MAIL_ITEMS_AZERITE_MILESTONE_POWER), - holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_MAIL_ITEMS_AZERITE_UNLOCKED_ESSENCE), - holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_MAIL_ITEMS_AZERITE_EMPOWERED)); + holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_MAIL_ITEMS_ARTIFACT)); m_social = sSocialMgr->LoadFromDB(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_SOCIAL_LIST), GetGUID()); @@ -18618,9 +18408,7 @@ void Player::LoadCorpse(PreparedQueryResult result) RemoveAtLoginFlag(AT_LOGIN_RESURRECT); } -void Player::_LoadInventory(PreparedQueryResult result, PreparedQueryResult artifactsResult, PreparedQueryResult azeriteResult, - PreparedQueryResult azeriteItemMilestonePowersResult, PreparedQueryResult azeriteItemUnlockedEssencesResult, - PreparedQueryResult azeriteEmpoweredItemResult, uint32 timeDiff) +void Player::_LoadInventory(PreparedQueryResult result, PreparedQueryResult artifactsResult, uint32 timeDiff) { // 0 1 2 3 4 5 6 7 8 9 10 11 12 // SELECT guid, itemEntry, creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyId, durability, playedTime, text, @@ -18651,8 +18439,7 @@ void Player::_LoadInventory(PreparedQueryResult result, PreparedQueryResult arti //expected to be equipped before offhand items (@todo fixme) std::unordered_map<ObjectGuid::LowType, ItemAdditionalLoadInfo> additionalData; - ItemAdditionalLoadInfo::Init(&additionalData, artifactsResult, azeriteResult, azeriteItemMilestonePowersResult, - azeriteItemUnlockedEssencesResult, azeriteEmpoweredItemResult); + ItemAdditionalLoadInfo::Init(&additionalData, artifactsResult); if (result) { @@ -18675,14 +18462,6 @@ void Player::_LoadInventory(PreparedQueryResult result, PreparedQueryResult arti if (item->GetTemplate()->GetArtifactID() && addionalDataPtr->Artifact) item->LoadArtifactData(this, addionalDataPtr->Artifact->Xp, addionalDataPtr->Artifact->ArtifactAppearanceId, addionalDataPtr->Artifact->ArtifactTierId, addionalDataPtr->Artifact->ArtifactPowers); - - if (addionalDataPtr->AzeriteItem) - if (AzeriteItem* azeriteItem = item->ToAzeriteItem()) - azeriteItem->LoadAzeriteItemData(this, *addionalDataPtr->AzeriteItem); - - if (addionalDataPtr->AzeriteEmpoweredItem) - if (AzeriteEmpoweredItem* azeriteEmpoweredItem = item->ToAzeriteEmpoweredItem()) - azeriteEmpoweredItem->LoadAzeriteEmpoweredItemData(this, *addionalDataPtr->AzeriteEmpoweredItem); } ObjectGuid bagGuid = fields[51].GetUInt64() ? ObjectGuid::Create<HighGuid::Item>(fields[51].GetUInt64()) : ObjectGuid::Empty; @@ -18810,8 +18589,6 @@ void Player::_LoadInventory(PreparedQueryResult result, PreparedQueryResult arti } //if (IsAlive()) _ApplyAllItemMods(); - // Apply all azerite item mods, azerite empowered item mods will get applied through its spell script - ApplyAllAzeriteItemMods(true); } void Player::_LoadVoidStorage(PreparedQueryResult result) @@ -18992,8 +18769,6 @@ Item* Player::_LoadItem(CharacterDatabaseTransaction trans, uint32 zoneId, uint3 GetGUID().ToString(), GetName(), itemEntry); Item::DeleteFromInventoryDB(trans, itemGuid); Item::DeleteFromDB(trans, itemGuid); - AzeriteItem::DeleteFromDB(trans, itemGuid); - AzeriteEmpoweredItem::DeleteFromDB(trans, itemGuid); } return item; } @@ -19017,8 +18792,6 @@ Item* Player::_LoadMailedItem(ObjectGuid const& playerGuid, Player* player, uint trans->Append(stmt); Item::DeleteFromDB(trans, itemGuid); - AzeriteItem::DeleteFromDB(trans, itemGuid); - AzeriteEmpoweredItem::DeleteFromDB(trans, itemGuid); CharacterDatabase.CommitTransaction(trans); return nullptr; @@ -19047,14 +18820,6 @@ Item* Player::_LoadMailedItem(ObjectGuid const& playerGuid, Player* player, uint if (item->GetTemplate()->GetArtifactID() && addionalData->Artifact) item->LoadArtifactData(player, addionalData->Artifact->Xp, addionalData->Artifact->ArtifactAppearanceId, addionalData->Artifact->ArtifactTierId, addionalData->Artifact->ArtifactPowers); - - if (addionalData->AzeriteItem) - if (AzeriteItem* azeriteItem = item->ToAzeriteItem()) - azeriteItem->LoadAzeriteItemData(player, *addionalData->AzeriteItem); - - if (addionalData->AzeriteEmpoweredItem) - if (AzeriteEmpoweredItem* azeriteEmpoweredItem = item->ToAzeriteEmpoweredItem()) - azeriteEmpoweredItem->LoadAzeriteEmpoweredItemData(player, *addionalData->AzeriteEmpoweredItem); } if (mail) @@ -19066,8 +18831,7 @@ Item* Player::_LoadMailedItem(ObjectGuid const& playerGuid, Player* player, uint return item; } -void Player::_LoadMail(PreparedQueryResult mailsResult, PreparedQueryResult mailItemsResult, PreparedQueryResult artifactResult, PreparedQueryResult azeriteItemResult, - PreparedQueryResult azeriteItemMilestonePowersResult, PreparedQueryResult azeriteItemUnlockedEssencesResult, PreparedQueryResult azeriteEmpoweredItemResult) +void Player::_LoadMail(PreparedQueryResult mailsResult, PreparedQueryResult mailItemsResult, PreparedQueryResult artifactResult) { std::unordered_map<uint64, Mail*> mailById; @@ -19109,8 +18873,7 @@ void Player::_LoadMail(PreparedQueryResult mailsResult, PreparedQueryResult mail if (mailItemsResult) { std::unordered_map<ObjectGuid::LowType, ItemAdditionalLoadInfo> additionalData; - ItemAdditionalLoadInfo::Init(&additionalData, artifactResult, azeriteItemResult, azeriteItemMilestonePowersResult, - azeriteItemUnlockedEssencesResult, azeriteEmpoweredItemResult); + ItemAdditionalLoadInfo::Init(&additionalData, artifactResult); do { @@ -19245,7 +19008,7 @@ void Player::_LoadQuestStatusObjectives(PreparedQueryResult result) if (!objectiveItr->IsStoringFlag()) SetQuestSlotCounter(questStatusData.Slot, storageIndex, data); else if (data) - SetQuestSlotObjectiveFlag(questStatusData.Slot, storageIndex); + SetQuestSlotState(questStatusData.Slot, 256 << storageIndex); } else TC_LOG_ERROR("entities.player", "Player::_LoadQuestStatusObjectives: Player '{}' ({}) has quest {} out of range objective index {}.", GetName(), GetGUID().ToString(), questID, storageIndex); @@ -20618,11 +20381,7 @@ void Player::_SaveMail(CharacterDatabaseTransaction trans) if (m->HasItems()) { for (MailItemInfoVec::iterator itr2 = m->items.begin(); itr2 != m->items.end(); ++itr2) - { Item::DeleteFromDB(trans, itr2->item_guid); - AzeriteItem::DeleteFromDB(trans, itr2->item_guid); - AzeriteEmpoweredItem::DeleteFromDB(trans, itr2->item_guid); - } } stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_BY_ID); stmt->setUInt64(0, m->messageID); @@ -21035,7 +20794,7 @@ void Player::_SaveStats(CharacterDatabaseTransaction trans) const stmt->setFloat(index++, m_activePlayerData->ParryPercentage); stmt->setFloat(index++, m_activePlayerData->CritPercentage); stmt->setFloat(index++, m_activePlayerData->RangedCritPercentage); - stmt->setFloat(index++, m_activePlayerData->SpellCritPercentage); + stmt->setFloat(index++, 0.f); // m_activePlayerData->SpellCritPercentage// @todo (4.4.0): in wotlk spell crit percentage was split by spell school stmt->setUInt32(index++, m_unitData->AttackPower); stmt->setUInt32(index++, m_unitData->RangedAttackPower); stmt->setUInt32(index++, GetBaseSpellPowerBonus()); @@ -21504,14 +21263,12 @@ void Player::SetBattlePetData(BattlePets::BattlePet const* pet) { SetSummonedBattlePetGUID(pet->PacketInfo.Guid); SetCurrentBattlePetBreedQuality(pet->PacketInfo.Quality); - SetBattlePetCompanionExperience(pet->PacketInfo.Exp); SetWildBattlePetLevel(pet->PacketInfo.Level); } else { SetSummonedBattlePetGUID(ObjectGuid::Empty); SetCurrentBattlePetBreedQuality(AsUnderlyingType(BattlePets::BattlePetBreedQuality::Poor)); - SetBattlePetCompanionExperience(0); SetWildBattlePetLevel(0); } } @@ -22335,12 +22092,12 @@ uint32 Player::GetArenaPersonalRating(uint8 slot) const UF::PVPInfo const* Player::GetPvpInfoForBracket(int8 bracket) const { - int32 index = m_activePlayerData->PvpInfo.FindIndexIf([bracket](UF::PVPInfo const& pvpInfo) + auto itr = std::find_if(m_activePlayerData->PvpInfo.begin(), m_activePlayerData->PvpInfo.end(), [bracket](UF::PVPInfo const& pvpInfo) { return pvpInfo.Bracket == bracket && !*pvpInfo.Disqualified; }); - if (index >= 0) - return &m_activePlayerData->PvpInfo[index]; + if (itr != m_activePlayerData->PvpInfo.end()) + return itr; return nullptr; } @@ -27086,7 +26843,7 @@ void Player::SendTalentsInfoData() packet.Info.TalentGroups.push_back(groupInfoPkt); } - SendDirectMessage(packet.Write()); + // SendDirectMessage(packet.Write()); } void Player::SendEquipmentSetList() @@ -27837,28 +27594,6 @@ void Player::ActivateTalentGroup(ChrSpecializationEntry const* spec) activeGlyphs.IsFullUpdate = true; SendDirectMessage(activeGlyphs.Write()); - if (Item* item = GetItemByEntry(ITEM_ID_HEART_OF_AZEROTH, ItemSearchLocation::Everywhere)) - { - if (AzeriteItem* azeriteItem = item->ToAzeriteItem()) - { - if (azeriteItem->IsEquipped()) - { - ApplyAllAzeriteEmpoweredItemMods(false); - ApplyAzeritePowers(azeriteItem, false); - } - - azeriteItem->SetSelectedAzeriteEssences(spec->ID); - - if (azeriteItem->IsEquipped()) - { - ApplyAzeritePowers(azeriteItem, true); - ApplyAllAzeriteEmpoweredItemMods(true); - } - - azeriteItem->SetState(ITEM_CHANGED, this); - } - } - Unit::AuraEffectList const& shapeshiftAuras = GetAuraEffectsByType(SPELL_AURA_MOD_SHAPESHIFT); for (AuraEffect* aurEff : shapeshiftAuras) { diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 3493f79b0b8..f8079305193 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -615,7 +615,7 @@ enum PlayerSlots // first slot for item stored (in any way in player m_items data) PLAYER_SLOT_START = 0, // last+1 slot for item stored (in any way in player m_items data) - PLAYER_SLOT_END = 227, + PLAYER_SLOT_END = 141, PLAYER_SLOTS_COUNT = (PLAYER_SLOT_END - PLAYER_SLOT_START) }; @@ -849,17 +849,9 @@ enum PlayerLoginQueryIndex PLAYER_LOGIN_QUERY_LOAD_REPUTATION, PLAYER_LOGIN_QUERY_LOAD_INVENTORY, PLAYER_LOGIN_QUERY_LOAD_ARTIFACTS, - PLAYER_LOGIN_QUERY_LOAD_AZERITE, - PLAYER_LOGIN_QUERY_LOAD_AZERITE_MILESTONE_POWERS, - PLAYER_LOGIN_QUERY_LOAD_AZERITE_UNLOCKED_ESSENCES, - PLAYER_LOGIN_QUERY_LOAD_AZERITE_EMPOWERED, PLAYER_LOGIN_QUERY_LOAD_MAILS, PLAYER_LOGIN_QUERY_LOAD_MAIL_ITEMS, PLAYER_LOGIN_QUERY_LOAD_MAIL_ITEMS_ARTIFACT, - PLAYER_LOGIN_QUERY_LOAD_MAIL_ITEMS_AZERITE, - PLAYER_LOGIN_QUERY_LOAD_MAIL_ITEMS_AZERITE_MILESTONE_POWER, - PLAYER_LOGIN_QUERY_LOAD_MAIL_ITEMS_AZERITE_UNLOCKED_ESSENCE, - PLAYER_LOGIN_QUERY_LOAD_MAIL_ITEMS_AZERITE_EMPOWERED, PLAYER_LOGIN_QUERY_LOAD_SOCIAL_LIST, PLAYER_LOGIN_QUERY_LOAD_HOME_BIND, PLAYER_LOGIN_QUERY_LOAD_SPELL_COOLDOWNS, @@ -1362,8 +1354,8 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player> bool IsValidPos(uint8 bag, uint8 slot, bool explicit_pos) const; uint8 GetInventorySlotCount() const { return m_activePlayerData->NumBackpackSlots; } void SetInventorySlotCount(uint8 slots); - uint8 GetBankBagSlotCount() const { return m_activePlayerData->NumBankSlots; } - void SetBankBagSlotCount(uint8 count) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::NumBankSlots), count); } + uint8 GetBankBagSlotCount() const { return m_playerData->NumBankSlots; } + void SetBankBagSlotCount(uint8 count) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_playerData).ModifyValue(&UF::PlayerData::NumBankSlots), count); } bool HasItemCount(uint32 item, uint32 count = 1, bool inBankAlso = false) const; bool HasItemFitToSpellRequirements(SpellInfo const* spellInfo, Item const* ignoreItem = nullptr) const; bool CanNoReagentCast(SpellInfo const* spellInfo) const; @@ -1601,7 +1593,6 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player> uint32 GetQuestSlotState(uint16 slot) const; uint16 GetQuestSlotCounter(uint16 slot, uint8 counter) const; int64 GetQuestSlotEndTime(uint16 slot) const; - bool GetQuestSlotObjectiveFlag(uint16 slot, int8 objectiveIndex) const; int32 GetQuestSlotObjectiveData(uint16 slot, QuestObjective const& objective) const; int32 GetQuestObjectiveData(uint32 questId, uint32 objectiveId) const; void SetQuestSlot(uint16 slot, uint32 quest_id); @@ -1609,8 +1600,6 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player> void SetQuestSlotState(uint16 slot, uint32 state); void RemoveQuestSlotState(uint16 slot, uint32 state); void SetQuestSlotEndTime(uint16 slot, time_t endTime); - void SetQuestSlotObjectiveFlag(uint16 slot, int8 objectiveIndex); - void RemoveQuestSlotObjectiveFlag(uint16 slot, int8 objectiveIndex); void SetQuestCompletedBit(uint32 questBit, bool completed); uint16 GetReqKillOrCastCurrentCount(uint32 quest_id, int32 entry) const; @@ -2327,8 +2316,6 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player> void _RemoveAllItemMods(); void _ApplyAllItemMods(); void _ApplyAllLevelScaleItemMods(bool apply); - void ApplyAllAzeriteItemMods(bool apply); - void ApplyAllAzeriteEmpoweredItemMods(bool apply); void _ApplyItemBonuses(Item* item, uint8 slot, bool apply); void _ApplyWeaponDamage(uint8 slot, Item* item, bool apply); bool EnchantmentFitsRequirements(uint32 enchantmentcondition, int8 slot) const; @@ -2342,11 +2329,6 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player> void UpdateItemSetAuras(bool formChange = false); void ApplyArtifactPowers(Item* item, bool apply); void ApplyArtifactPowerRank(Item* artifact, ArtifactPowerRankEntry const* artifactPowerRank, bool apply); - void ApplyAzeritePowers(Item* item, bool apply); - void ApplyAzeriteItemMilestonePower(AzeriteItem* item, AzeriteItemMilestonePowerEntry const* azeriteItemMilestonePower, bool apply); - void ApplyAzeriteEssence(AzeriteItem* item, uint32 azeriteEssenceId, uint32 rank, bool major, bool apply); - void ApplyAzeriteEssencePower(AzeriteItem* item, AzeriteEssencePowerEntry const* azeriteEssencePower, bool major, bool apply); - void ApplyAzeritePower(AzeriteEmpoweredItem* item, AzeritePowerEntry const* azeritePower, bool apply); void CastItemCombatSpell(DamageInfo const& damageInfo); void CastItemCombatSpell(DamageInfo const& damageInfo, Item* item, ItemTemplate const* proto); @@ -2767,11 +2749,7 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player> void SetHeirloom(uint32 slot, int32 itemId) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::Heirlooms, slot), itemId); } void SetHeirloomFlags(uint32 slot, uint32 flags) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::HeirloomFlags, slot), flags); } - void AddToy(int32 itemId, uint32 flags) - { - AddDynamicUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::Toys)) = itemId; - AddDynamicUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::ToyFlags)) = flags; - } + void AddToy(int32 itemId, uint32 /*flags*/) { AddDynamicUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::Toys)) = itemId; } void AddTransmogBlock(uint32 blockValue) { AddDynamicUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::Transmog)) = blockValue; } void AddTransmogFlag(uint32 slot, uint32 flag) { SetUpdateFieldFlagValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::Transmog, slot), flag); } @@ -2784,9 +2762,6 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player> RemoveDynamicUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::ConditionalTransmog), uint32(index)); } - void AddIllusionBlock(uint32 blockValue) { AddDynamicUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::TransmogIllusions)) = blockValue; } - void AddIllusionFlag(uint32 slot, uint32 flag) { SetUpdateFieldFlagValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::TransmogIllusions, slot), flag); } - void AddSelfResSpell(int32 spellId) { AddDynamicUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::SelfResSpells)) = spellId; } void RemoveSelfResSpell(int32 spellId) { @@ -2823,9 +2798,6 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player> void SetTransportServerTime(int32 transportServerTime) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::TransportServerTime), transportServerTime); } - void SetRequiredMountCapabilityFlag(uint8 flag) { SetUpdateFieldFlagValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::RequiredMountCapabilityFlags), flag); } - void ReplaceAllRequiredMountCapabilityFlags(uint8 flags) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::RequiredMountCapabilityFlags), flags); } - bool IsInFriendlyArea() const; bool IsFriendlyArea(AreaTableEntry const* inArea) const; @@ -2903,12 +2875,9 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player> void _LoadActions(PreparedQueryResult result); void _LoadAuras(PreparedQueryResult auraResult, PreparedQueryResult effectResult, uint32 timediff); void _LoadGlyphAuras(); - void _LoadInventory(PreparedQueryResult result, PreparedQueryResult artifactsResult, PreparedQueryResult azeriteResult, - PreparedQueryResult azeriteItemMilestonePowersResult, PreparedQueryResult azeriteItemUnlockedEssencesResult, - PreparedQueryResult azeriteEmpoweredItemResult, uint32 timeDiff); + void _LoadInventory(PreparedQueryResult result, PreparedQueryResult artifactsResult, uint32 timeDiff); void _LoadVoidStorage(PreparedQueryResult result); - void _LoadMail(PreparedQueryResult mailsResult, PreparedQueryResult mailItemsResult, PreparedQueryResult artifactResult, PreparedQueryResult azeriteItemResult, - PreparedQueryResult azeriteItemMilestonePowersResult, PreparedQueryResult azeriteItemUnlockedEssencesResult, PreparedQueryResult azeriteEmpoweredItemResult); + void _LoadMail(PreparedQueryResult mailsResult, PreparedQueryResult mailItemsResult, PreparedQueryResult artifactResult); static Item* _LoadMailedItem(ObjectGuid const& playerGuid, Player* player, uint64 mailId, Mail* mail, Field* fields, ItemAdditionalLoadInfo* addionalData); void _LoadQuestStatus(PreparedQueryResult result); void _LoadQuestStatusObjectives(PreparedQueryResult result); diff --git a/src/server/game/Entities/Unit/StatSystem.cpp b/src/server/game/Entities/Unit/StatSystem.cpp index 5dd4eaf42d0..8697f2656a1 100644 --- a/src/server/game/Entities/Unit/StatSystem.cpp +++ b/src/server/game/Entities/Unit/StatSystem.cpp @@ -584,13 +584,12 @@ void Player::UpdateHealingDonePercentMod() { float value = 1.0f; - AddPct(value, GetRatingBonusValue(CR_VERSATILITY_HEALING_DONE) + GetTotalAuraModifier(SPELL_AURA_MOD_VERSATILITY)); + // AddPct(value, GetRatingBonusValue(CR_VERSATILITY_HEALING_DONE) + GetTotalAuraModifier(SPELL_AURA_MOD_VERSATILITY)); for (AuraEffect const* auraEffect : GetAuraEffectsByType(SPELL_AURA_MOD_HEALING_DONE_PERCENT)) AddPct(value, auraEffect->GetAmount()); - for (uint32 i = 0; i < MAX_SPELL_SCHOOL; ++i) - SetUpdateFieldStatValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::ModHealingDonePercent, i), value); + SetUpdateFieldStatValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::ModHealingDonePercent), value); } float const m_diminishing_k[MAX_CLASSES] = @@ -722,7 +721,8 @@ void Player::UpdateSpellCritChance() crit += GetRatingBonusValue(CR_CRIT_SPELL); // Store crit value - SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::SpellCritPercentage), crit); + for (uint8 i = SPELL_SCHOOL_NORMAL; i < MAX_SPELL_SCHOOL; ++i) + SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::SpellCritPercentage, i), crit); } void Player::UpdateCorruption() @@ -836,7 +836,6 @@ void Player::_ApplyAllStatBonuses() _ApplyAllAuraStatMods(); _ApplyAllItemMods(); - ApplyAllAzeriteItemMods(true); SetCanModifyStats(true); @@ -847,7 +846,6 @@ void Player::_RemoveAllStatBonuses() { SetCanModifyStats(false); - ApplyAllAzeriteItemMods(false); _RemoveAllItemMods(); _RemoveAllAuraStatMods(); @@ -1113,17 +1111,12 @@ void Guardian::UpdateResistances(uint32 school) if (school > SPELL_SCHOOL_NORMAL) { float baseValue = GetFlatModifierValue(UnitMods(UNIT_MOD_RESISTANCE_START + school), BASE_VALUE); - float bonusValue = GetTotalAuraModValue(UnitMods(UNIT_MOD_RESISTANCE_START + school)) - baseValue; // hunter and warlock pets gain 40% of owner's resistance if (IsPet()) - { baseValue += float(CalculatePct(m_owner->GetResistance(SpellSchools(school)), 40)); - bonusValue += float(CalculatePct(m_owner->GetBonusResistanceMod(SpellSchools(school)), 40)); - } SetResistance(SpellSchools(school), int32(baseValue)); - SetBonusResistanceMod(SpellSchools(school), int32(bonusValue)); } else UpdateArmor(); diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 708b35d2418..136208da8e7 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -6943,24 +6943,13 @@ float Unit::SpellCritChanceDone(Spell* spell, AuraEffect const* aurEff, SpellSch case SPELL_DAMAGE_CLASS_NONE: case SPELL_DAMAGE_CLASS_MAGIC: { - auto getPhysicalCritChance = [&] - { - return GetUnitCriticalChanceDone(attackType); - }; - - auto getMagicCritChance = [&] - { - if (Player const* thisPlayer = ToPlayer()) - return *thisPlayer->m_activePlayerData->SpellCritPercentage; - - return m_baseSpellCritChance; - }; - if (schoolMask & SPELL_SCHOOL_MASK_NORMAL) - crit_chance = std::max(crit_chance, getPhysicalCritChance()); - - if (schoolMask & ~SPELL_SCHOOL_MASK_NORMAL) - crit_chance = std::max(crit_chance, getMagicCritChance()); + crit_chance = 0.0f; + // For other schools + else if (Player const* thisPlayer = ToPlayer()) + crit_chance = thisPlayer->m_activePlayerData->SpellCritPercentage[AsUnderlyingType(GetFirstSchoolInMask(schoolMask))]; + else + crit_chance = (float)m_baseSpellCritChance; break; } case SPELL_DAMAGE_CLASS_MELEE: @@ -7252,14 +7241,7 @@ float Unit::SpellHealingPctDone(Unit* victim, SpellInfo const* spellProto) const // Healing done percent if (Player const* thisPlayer = ToPlayer()) - { - float maxModDamagePercentSchool = 0.0f; - for (uint32 i = 0; i < MAX_SPELL_SCHOOL; ++i) - if (spellProto->GetSchoolMask() & (1 << i)) - maxModDamagePercentSchool = std::max(maxModDamagePercentSchool, thisPlayer->m_activePlayerData->ModHealingDonePercent[i]); - - DoneTotalMod *= maxModDamagePercentSchool; - } + DoneTotalMod *= thisPlayer->m_activePlayerData->ModHealingDonePercent; else // SPELL_AURA_MOD_HEALING_DONE_PERCENT is included in m_activePlayerData->ModHealingDonePercent for players DoneTotalMod *= GetTotalAuraMultiplier(SPELL_AURA_MOD_HEALING_DONE_PERCENT); @@ -9260,14 +9242,10 @@ void Unit::UpdateResistances(uint32 school) float value = CalculatePct(GetFlatModifierValue(unitMod, BASE_VALUE), std::max(GetFlatModifierValue(unitMod, BASE_PCT_EXCLUDE_CREATE), -100.0f)); value *= GetPctModifierValue(unitMod, BASE_PCT); - - float baseValue = value; - value += GetFlatModifierValue(unitMod, TOTAL_VALUE); value *= GetPctModifierValue(unitMod, TOTAL_PCT); SetResistance(SpellSchools(school), int32(value)); - SetBonusResistanceMod(SpellSchools(school), int32(value - baseValue)); } else UpdateArmor(); @@ -9278,8 +9256,6 @@ float Unit::GetTotalAttackPowerValue(WeaponAttackType attType, bool includeWeapo if (attType == RANGED_ATTACK) { float ap = m_unitData->RangedAttackPower + m_unitData->RangedAttackPowerModPos + m_unitData->RangedAttackPowerModNeg; - if (includeWeapon) - ap += std::max<float>(m_unitData->MainHandWeaponAttackPower, m_unitData->RangedWeaponAttackPower); if (ap < 0) return 0.0f; return ap * (1.0f + m_unitData->RangedAttackPowerMultiplier); @@ -9287,16 +9263,6 @@ float Unit::GetTotalAttackPowerValue(WeaponAttackType attType, bool includeWeapo else { float ap = m_unitData->AttackPower + m_unitData->AttackPowerModPos + m_unitData->AttackPowerModNeg; - if (includeWeapon) - { - if (attType == BASE_ATTACK) - ap += std::max<float>(m_unitData->MainHandWeaponAttackPower, m_unitData->RangedWeaponAttackPower); - else - { - ap += m_unitData->OffHandWeaponAttackPower; - ap /= 2; - } - } if (ap < 0) return 0.0f; return ap * (1.0f + m_unitData->AttackPowerMultiplier); diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 96596d60ac6..bdf55ce3a45 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -756,17 +756,11 @@ class TC_GAME_API Unit : public WorldObject float GetStat(Stats stat) const { return float(m_unitData->Stats[stat]); } void SetStat(Stats stat, int32 val) { SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::Stats, stat), val); } uint32 GetArmor() const { return GetResistance(SPELL_SCHOOL_NORMAL); } - void SetArmor(int32 val, int32 bonusVal) - { - SetResistance(SPELL_SCHOOL_NORMAL, val); - SetBonusResistanceMod(SPELL_SCHOOL_NORMAL, bonusVal); - } + void SetArmor(int32 val, int32 /*bonusVal*/) { SetResistance(SPELL_SCHOOL_NORMAL, val); } int32 GetResistance(SpellSchools school) const { return m_unitData->Resistances[school]; } - int32 GetBonusResistanceMod(SpellSchools school) const { return m_unitData->BonusResistanceMods[school]; } int32 GetResistance(SpellSchoolMask mask) const; void SetResistance(SpellSchools school, int32 val) { SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::Resistances, school), val); } - void SetBonusResistanceMod(SpellSchools school, int32 val) { SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::BonusResistanceMods, school), val); } static float CalculateAverageResistReduction(WorldObject const* caster, SpellSchoolMask schoolMask, Unit const* victim, SpellInfo const* spellInfo = nullptr); uint64 GetHealth() const { return m_unitData->Health; } @@ -809,9 +803,6 @@ class TC_GAME_API Unit : public WorldObject // returns the change in power int32 ModifyPower(Powers power, int32 val, bool withPowerUpdate = true); - void ApplyModManaCostMultiplier(float manaCostMultiplier, bool apply) { ApplyModUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::ManaCostMultiplier), manaCostMultiplier, apply); } - void ApplyModManaCostModifier(SpellSchools school, int32 mod, bool apply) { ApplyModUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::ManaCostModifier, school), mod, apply); } - uint32 GetBaseAttackTime(WeaponAttackType att) const; void SetBaseAttackTime(WeaponAttackType att, uint32 val); void UpdateAttackTimeField(WeaponAttackType att); @@ -842,8 +833,6 @@ class TC_GAME_API Unit : public WorldObject void SetCreatedBySpell(int32 spellId) { SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::CreatedBySpell), spellId); } - void SetNameplateAttachToGUID(ObjectGuid guid) { SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::NameplateAttachToGUID), guid); } - Emote GetEmoteState() const { return Emote(*m_unitData->EmoteState); } void SetEmoteState(Emote emote) { SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::EmoteState), emote); } @@ -894,8 +883,6 @@ class TC_GAME_API Unit : public WorldObject bool IsMounted() const { return HasUnitFlag(UNIT_FLAG_MOUNT); } uint32 GetMountDisplayId() const { return m_unitData->MountDisplayID; } void SetMountDisplayId(uint32 mountDisplayId) { SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::MountDisplayID), mountDisplayId); } - uint32 GetCosmeticMountDisplayId() const { return m_unitData->CosmeticMountDisplayID; } - void SetCosmeticMountDisplayId(uint32 mountDisplayId) { SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::CosmeticMountDisplayID), mountDisplayId); } void Mount(uint32 mount, uint32 vehicleId = 0, uint32 creatureEntry = 0); void Dismount(); MountCapabilityEntry const* GetMountCapability(uint32 mountType) const; @@ -1240,8 +1227,6 @@ class TC_GAME_API Unit : public WorldObject uint32 GetBattlePetCompanionNameTimestamp() const { return m_unitData->BattlePetCompanionNameTimestamp; } void SetBattlePetCompanionNameTimestamp(uint32 timestamp) { SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::BattlePetCompanionNameTimestamp), timestamp); } - uint32 GetBattlePetCompanionExperience() const { return m_unitData->BattlePetCompanionExperience; } - void SetBattlePetCompanionExperience(uint32 experience) { SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::BattlePetCompanionExperience), experience); } uint32 GetWildBattlePetLevel() const { return m_unitData->WildBattlePetLevel; } void SetWildBattlePetLevel(uint32 wildBattlePetLevel) { SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::WildBattlePetLevel), wildBattlePetLevel); } @@ -1403,14 +1388,13 @@ class TC_GAME_API Unit : public WorldObject .ModifyValue(&UF::UnitData::ChannelData) .ModifyValue(&UF::UnitChannel::SpellID), channelSpellId); } - uint32 GetChannelSpellXSpellVisualId() const { return m_unitData->ChannelData->SpellVisual.SpellXSpellVisualID; } - uint32 GetChannelScriptVisualId() const { return m_unitData->ChannelData->SpellVisual.ScriptVisualID; } + uint32 GetChannelSpellXSpellVisualId() const { return m_unitData->ChannelData->SpellXSpellVisualID; } void SetChannelVisual(SpellCastVisual channelVisual) { SetUpdateFieldValue(m_values .ModifyValue(&Unit::m_unitData) .ModifyValue(&UF::UnitData::ChannelData) - .ModifyValue(&UF::UnitChannel::SpellVisual), channelVisual); + .ModifyValue(&UF::UnitChannel::SpellXSpellVisualID), channelVisual.SpellXSpellVisualID); } void AddChannelObject(ObjectGuid guid) { AddDynamicUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::ChannelObjects)) = guid; } void SetChannelObject(uint32 slot, ObjectGuid guid) { SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::ChannelObjects, slot), guid); } @@ -1446,10 +1430,6 @@ class TC_GAME_API Unit : public WorldObject virtual bool IsMovementPreventedByCasting() const; bool CanCastSpellWhileMoving(SpellInfo const* spellInfo) const; - bool IsSilenced(SpellSchoolMask schoolMask) const { return (*m_unitData->SilencedSchoolMask & schoolMask) != 0; } - void SetSilencedSchoolMask(SpellSchoolMask schoolMask) { SetUpdateFieldFlagValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::SilencedSchoolMask), schoolMask); } - void ReplaceAllSilencedSchoolMask(SpellSchoolMask schoolMask) { SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::SilencedSchoolMask), schoolMask); } - SpellHistory* GetSpellHistory() { return _spellHistory.get(); } SpellHistory const* GetSpellHistory() const { return _spellHistory.get(); } @@ -1517,9 +1497,6 @@ class TC_GAME_API Unit : public WorldObject void SetRangedAttackPowerModPos(int32 attackPowerMod) { SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::RangedAttackPowerModPos), attackPowerMod); } void SetRangedAttackPowerModNeg(int32 attackPowerMod) { SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::RangedAttackPowerModNeg), attackPowerMod); } void SetRangedAttackPowerMultiplier(float attackPowerMult) { SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::RangedAttackPowerMultiplier), attackPowerMult); } - void SetMainHandWeaponAttackPower(int32 attackPower) { SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::MainHandWeaponAttackPower), attackPower); } - void SetOffHandWeaponAttackPower(int32 attackPower) { SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::OffHandWeaponAttackPower), attackPower); } - void SetRangedWeaponAttackPower(int32 attackPower) { SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::RangedWeaponAttackPower), attackPower); } virtual void UpdateDamagePhysical(WeaponAttackType attType); float GetTotalAttackPowerValue(WeaponAttackType attType, bool includeWeapon = true) const; float GetWeaponDamageRange(WeaponAttackType attType, WeaponDamageRange type) const; diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 7715e1fcb84..5aaa3e6e080 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -19,8 +19,6 @@ #include "ArenaTeamMgr.h" #include "AreaTriggerDataStore.h" #include "AreaTriggerTemplate.h" -#include "AzeriteEmpoweredItem.h" -#include "AzeriteItem.h" #include "Chat.h" #include "Containers.h" #include "CreatureAIFactory.h" @@ -6376,13 +6374,10 @@ void ObjectMgr::ReturnOrDeleteOldMails(bool serverUp) if (m->messageType != MAIL_NORMAL || (m->checked & (MAIL_CHECK_MASK_COD_PAYMENT | MAIL_CHECK_MASK_RETURNED))) { CharacterDatabaseTransaction nonTransactional(nullptr); + // mail open and then not returned for (MailItemInfoVec::iterator itr2 = m->items.begin(); itr2 != m->items.end(); ++itr2) - { Item::DeleteFromDB(nonTransactional, itr2->item_guid); - AzeriteItem::DeleteFromDB(nonTransactional, itr2->item_guid); - AzeriteEmpoweredItem::DeleteFromDB(nonTransactional, itr2->item_guid); - } stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_ITEM_BY_ID); stmt->setUInt64(0, m->messageID); diff --git a/src/server/game/Handlers/AzeriteHandler.cpp b/src/server/game/Handlers/AzeriteHandler.cpp deleted file mode 100644 index 015ec05e570..00000000000 --- a/src/server/game/Handlers/AzeriteHandler.cpp +++ /dev/null @@ -1,245 +0,0 @@ -/* - * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#include "WorldSession.h" -#include "AzeriteEmpoweredItem.h" -#include "AzeriteItem.h" -#include "AzeritePackets.h" -#include "DB2Stores.h" -#include "NPCPackets.h" -#include "Player.h" -#include "SpellHistory.h" - -void WorldSession::HandleAzeriteEssenceUnlockMilestone(WorldPackets::Azerite::AzeriteEssenceUnlockMilestone& azeriteEssenceUnlockMilestone) -{ - if (!AzeriteItem::FindHeartForge(_player)) - return; - - Item* item = _player->GetItemByEntry(ITEM_ID_HEART_OF_AZEROTH, ItemSearchLocation::Everywhere); - if (!item) - return; - - AzeriteItem* azeriteItem = item->ToAzeriteItem(); - if (!azeriteItem || !azeriteItem->CanUseEssences()) - return; - - AzeriteItemMilestonePowerEntry const* milestonePower = sAzeriteItemMilestonePowerStore.LookupEntry(azeriteEssenceUnlockMilestone.AzeriteItemMilestonePowerID); - if (!milestonePower || milestonePower->RequiredLevel > int32(azeriteItem->GetLevel())) - return; - - // check that all previous milestones are unlocked - for (AzeriteItemMilestonePowerEntry const* previousMilestone : sDB2Manager.GetAzeriteItemMilestonePowers()) - { - if (previousMilestone == milestonePower) - break; - - if (!azeriteItem->HasUnlockedEssenceMilestone(previousMilestone->ID)) - return; - } - - azeriteItem->AddUnlockedEssenceMilestone(milestonePower->ID); - _player->ApplyAzeriteItemMilestonePower(azeriteItem, milestonePower, true); - azeriteItem->SetState(ITEM_CHANGED, _player); -} - -void WorldSession::HandleAzeriteEssenceActivateEssence(WorldPackets::Azerite::AzeriteEssenceActivateEssence& azeriteEssenceActivateEssence) -{ - WorldPackets::Azerite::ActivateEssenceFailed activateEssenceResult; - activateEssenceResult.AzeriteEssenceID = azeriteEssenceActivateEssence.AzeriteEssenceID; - Item* item = _player->GetItemByEntry(ITEM_ID_HEART_OF_AZEROTH, ItemSearchLocation::Equipment); - if (!item) - { - activateEssenceResult.Reason = AzeriteEssenceActivateResult::NotEquipped; - activateEssenceResult.Slot = azeriteEssenceActivateEssence.Slot; - SendPacket(activateEssenceResult.Write()); - return; - } - - AzeriteItem* azeriteItem = item->ToAzeriteItem(); - if (!azeriteItem || !azeriteItem->CanUseEssences()) - { - activateEssenceResult.Reason = AzeriteEssenceActivateResult::ConditionFailed; - SendPacket(activateEssenceResult.Write()); - return; - } - - if (azeriteEssenceActivateEssence.Slot >= MAX_AZERITE_ESSENCE_SLOT || !azeriteItem->HasUnlockedEssenceSlot(azeriteEssenceActivateEssence.Slot)) - { - activateEssenceResult.Reason = AzeriteEssenceActivateResult::SlotLocked; - SendPacket(activateEssenceResult.Write()); - return; - } - - UF::SelectedAzeriteEssences const* selectedEssences = azeriteItem->GetSelectedAzeriteEssences(); - // essence is already in that slot, nothing to do - if (selectedEssences && selectedEssences->AzeriteEssenceID[azeriteEssenceActivateEssence.Slot] == uint32(azeriteEssenceActivateEssence.AzeriteEssenceID)) - return; - - uint32 rank = azeriteItem->GetEssenceRank(azeriteEssenceActivateEssence.AzeriteEssenceID); - if (!rank) - { - activateEssenceResult.Reason = AzeriteEssenceActivateResult::EssenceNotUnlocked; - activateEssenceResult.Arg = azeriteEssenceActivateEssence.AzeriteEssenceID; - SendPacket(activateEssenceResult.Write()); - return; - } - - if (_player->IsInCombat()) - { - activateEssenceResult.Reason = AzeriteEssenceActivateResult::AffectingCombat; - activateEssenceResult.Slot = azeriteEssenceActivateEssence.Slot; - SendPacket(activateEssenceResult.Write()); - return; - } - - if (_player->isDead()) - { - activateEssenceResult.Reason = AzeriteEssenceActivateResult::CantDoThatRightNow; - activateEssenceResult.Slot = azeriteEssenceActivateEssence.Slot; - SendPacket(activateEssenceResult.Write()); - return; - } - - if (!_player->HasPlayerFlag(PLAYER_FLAGS_RESTING) && !_player->HasUnitFlag2(UNIT_FLAG2_ALLOW_CHANGING_TALENTS)) - { - activateEssenceResult.Reason = AzeriteEssenceActivateResult::NotInRestArea; - activateEssenceResult.Slot = azeriteEssenceActivateEssence.Slot; - SendPacket(activateEssenceResult.Write()); - return; - } - - if (selectedEssences) - { - // need to remove selected essence from another slot if selected - int32 removeEssenceFromSlot = -1; - for (int32 slot = 0; slot < MAX_AZERITE_ESSENCE_SLOT; ++slot) - if (azeriteEssenceActivateEssence.Slot != uint8(slot) && selectedEssences->AzeriteEssenceID[slot] == uint32(azeriteEssenceActivateEssence.AzeriteEssenceID)) - removeEssenceFromSlot = slot; - - // check cooldown of major essence slot - if (selectedEssences->AzeriteEssenceID[0] && (azeriteEssenceActivateEssence.Slot == 0 || removeEssenceFromSlot == 0)) - { - for (uint32 essenceRank = 1; essenceRank <= rank; ++essenceRank) - { - AzeriteEssencePowerEntry const* azeriteEssencePower = ASSERT_NOTNULL(sDB2Manager.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.Write()); - return; - } - } - } - - if (removeEssenceFromSlot != -1) - { - _player->ApplyAzeriteEssence(azeriteItem, selectedEssences->AzeriteEssenceID[removeEssenceFromSlot], MAX_AZERITE_ESSENCE_RANK, - AzeriteItemMilestoneType(sDB2Manager.GetAzeriteItemMilestonePower(removeEssenceFromSlot)->Type) == AzeriteItemMilestoneType::MajorEssence, false); - azeriteItem->SetSelectedAzeriteEssence(removeEssenceFromSlot, 0); - } - - if (selectedEssences->AzeriteEssenceID[azeriteEssenceActivateEssence.Slot]) - { - _player->ApplyAzeriteEssence(azeriteItem, selectedEssences->AzeriteEssenceID[azeriteEssenceActivateEssence.Slot], MAX_AZERITE_ESSENCE_RANK, - AzeriteItemMilestoneType(sDB2Manager.GetAzeriteItemMilestonePower(azeriteEssenceActivateEssence.Slot)->Type) == AzeriteItemMilestoneType::MajorEssence, false); - } - } - else - azeriteItem->CreateSelectedAzeriteEssences(AsUnderlyingType(_player->GetPrimarySpecialization())); - - azeriteItem->SetSelectedAzeriteEssence(azeriteEssenceActivateEssence.Slot, azeriteEssenceActivateEssence.AzeriteEssenceID); - - _player->ApplyAzeriteEssence(azeriteItem, azeriteEssenceActivateEssence.AzeriteEssenceID, rank, - AzeriteItemMilestoneType(sDB2Manager.GetAzeriteItemMilestonePower(azeriteEssenceActivateEssence.Slot)->Type) == AzeriteItemMilestoneType::MajorEssence, true); - - azeriteItem->SetState(ITEM_CHANGED, _player); -} - -void WorldSession::HandleAzeriteEmpoweredItemViewed(WorldPackets::Azerite::AzeriteEmpoweredItemViewed& azeriteEmpoweredItemViewed) -{ - Item* item = _player->GetItemByGuid(azeriteEmpoweredItemViewed.ItemGUID); - if (!item || !item->IsAzeriteEmpoweredItem()) - return; - - item->SetItemFlag(ITEM_FIELD_FLAG_AZERITE_EMPOWERED_ITEM_VIEWED); - item->SetState(ITEM_CHANGED, _player); -} - -void WorldSession::HandleAzeriteEmpoweredItemSelectPower(WorldPackets::Azerite::AzeriteEmpoweredItemSelectPower& azeriteEmpoweredItemSelectPower) -{ - Item* item = _player->GetItemByPos(azeriteEmpoweredItemSelectPower.ContainerSlot, azeriteEmpoweredItemSelectPower.Slot); - if (!item) - return; - - AzeritePowerEntry const* azeritePower = sAzeritePowerStore.LookupEntry(azeriteEmpoweredItemSelectPower.AzeritePowerID); - if (!azeritePower) - return; - - AzeriteEmpoweredItem* azeriteEmpoweredItem = item->ToAzeriteEmpoweredItem(); - if (!azeriteEmpoweredItem) - return; - - // Validate tier - int32 actualTier = azeriteEmpoweredItem->GetTierForAzeritePower(Classes(_player->GetClass()), azeriteEmpoweredItemSelectPower.AzeritePowerID); - if (azeriteEmpoweredItemSelectPower.Tier > MAX_AZERITE_EMPOWERED_TIER || azeriteEmpoweredItemSelectPower.Tier != actualTier) - return; - - uint32 azeriteLevel = 0; - Item const* heartOfAzeroth = _player->GetItemByEntry(ITEM_ID_HEART_OF_AZEROTH, ItemSearchLocation::Everywhere); - if (!heartOfAzeroth) - return; - - if (AzeriteItem const* azeriteItem = heartOfAzeroth->ToAzeriteItem()) - azeriteLevel = azeriteItem->GetEffectiveLevel(); - - // Check required heart of azeroth level - if (azeriteLevel < azeriteEmpoweredItem->GetRequiredAzeriteLevelForTier(uint32(actualTier))) - return; - - // tiers are ordered backwards, you first select the highest one - for (int32 i = actualTier + 1; i < azeriteEmpoweredItem->GetMaxAzeritePowerTier(); ++i) - if (!azeriteEmpoweredItem->GetSelectedAzeritePower(i)) - return; - - bool activateAzeritePower = azeriteEmpoweredItem->IsEquipped() && heartOfAzeroth->IsEquipped(); - if (azeritePower->ItemBonusListID && 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) - _player->_ApplyItemMods(azeriteEmpoweredItem, azeriteEmpoweredItem->GetSlot(), true); - else - _player->ApplyAzeritePower(azeriteEmpoweredItem, azeritePower, true); - } - - azeriteEmpoweredItem->SetState(ITEM_CHANGED, _player); -} - -void WorldSession::SendAzeriteRespecNPC(ObjectGuid npc) -{ - WorldPackets::NPC::NPCInteractionOpenResult npcInteraction; - npcInteraction.Npc = npc; - npcInteraction.InteractionType = PlayerInteractionType::AzeriteRespec; - npcInteraction.Success = true; - SendPacket(npcInteraction.Write()); -} diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index 3a07852a3e1..8bcb9011c69 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -161,22 +161,6 @@ bool LoginQueryHolder::Initialize() stmt->setUInt64(0, lowGuid); res &= SetPreparedQuery(PLAYER_LOGIN_QUERY_LOAD_ARTIFACTS, stmt); - stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_ITEM_INSTANCE_AZERITE); - stmt->setUInt64(0, lowGuid); - res &= SetPreparedQuery(PLAYER_LOGIN_QUERY_LOAD_AZERITE, stmt); - - stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_ITEM_INSTANCE_AZERITE_MILESTONE_POWER); - stmt->setUInt64(0, lowGuid); - res &= SetPreparedQuery(PLAYER_LOGIN_QUERY_LOAD_AZERITE_MILESTONE_POWERS, stmt); - - stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_ITEM_INSTANCE_AZERITE_UNLOCKED_ESSENCE); - stmt->setUInt64(0, lowGuid); - res &= SetPreparedQuery(PLAYER_LOGIN_QUERY_LOAD_AZERITE_UNLOCKED_ESSENCES, stmt); - - stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_ITEM_INSTANCE_AZERITE_EMPOWERED); - stmt->setUInt64(0, lowGuid); - res &= SetPreparedQuery(PLAYER_LOGIN_QUERY_LOAD_AZERITE_EMPOWERED, stmt); - stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_VOID_STORAGE); stmt->setUInt64(0, lowGuid); res &= SetPreparedQuery(PLAYER_LOGIN_QUERY_LOAD_VOID_STORAGE, stmt); @@ -193,22 +177,6 @@ bool LoginQueryHolder::Initialize() stmt->setUInt64(0, lowGuid); res &= SetPreparedQuery(PLAYER_LOGIN_QUERY_LOAD_MAIL_ITEMS_ARTIFACT, stmt); - stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_MAILITEMS_AZERITE); - stmt->setUInt64(0, lowGuid); - res &= SetPreparedQuery(PLAYER_LOGIN_QUERY_LOAD_MAIL_ITEMS_AZERITE, stmt); - - stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_MAILITEMS_AZERITE_MILESTONE_POWER); - stmt->setUInt64(0, lowGuid); - res &= SetPreparedQuery(PLAYER_LOGIN_QUERY_LOAD_MAIL_ITEMS_AZERITE_MILESTONE_POWER, stmt); - - stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_MAILITEMS_AZERITE_UNLOCKED_ESSENCE); - stmt->setUInt64(0, lowGuid); - res &= SetPreparedQuery(PLAYER_LOGIN_QUERY_LOAD_MAIL_ITEMS_AZERITE_UNLOCKED_ESSENCE, stmt); - - stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_MAILITEMS_AZERITE_EMPOWERED); - stmt->setUInt64(0, lowGuid); - res &= SetPreparedQuery(PLAYER_LOGIN_QUERY_LOAD_MAIL_ITEMS_AZERITE_EMPOWERED, stmt); - stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHARACTER_SOCIALLIST); stmt->setUInt64(0, lowGuid); res &= SetPreparedQuery(PLAYER_LOGIN_QUERY_LOAD_SOCIAL_LIST, stmt); diff --git a/src/server/game/Handlers/InspectHandler.cpp b/src/server/game/Handlers/InspectHandler.cpp index 5bfd00dc1fa..a6a664fee14 100644 --- a/src/server/game/Handlers/InspectHandler.cpp +++ b/src/server/game/Handlers/InspectHandler.cpp @@ -17,7 +17,6 @@ #include "WorldSession.h" #include "AchievementMgr.h" -#include "AzeriteItem.h" #include "Guild.h" #include "GuildMgr.h" #include "InspectPackets.h" @@ -71,10 +70,6 @@ void WorldSession::HandleInspectOpcode(WorldPackets::Inspect::Inspect& inspect) inspectResult.GuildData->AchievementPoints = guild->GetAchievementMgr().GetAchievementPoints(); } - if (Item const* heartOfAzeroth = player->GetItemByEntry(ITEM_ID_HEART_OF_AZEROTH, ItemSearchLocation::Everywhere)) - if (AzeriteItem const* azeriteItem = heartOfAzeroth->ToAzeriteItem()) - inspectResult.AzeriteLevel = azeriteItem->GetEffectiveLevel(); - inspectResult.ItemLevel = int32(player->GetAverageItemLevel()); inspectResult.LifetimeMaxRank = player->m_activePlayerData->LifetimeMaxRank; inspectResult.TodayHK = player->m_activePlayerData->TodayHonorableKills; diff --git a/src/server/game/Handlers/LFGHandler.cpp b/src/server/game/Handlers/LFGHandler.cpp index baaeebaf5bc..ed946568930 100644 --- a/src/server/game/Handlers/LFGHandler.cpp +++ b/src/server/game/Handlers/LFGHandler.cpp @@ -143,7 +143,7 @@ void WorldSession::SendLfgPlayerLockInfo() // Get Random dungeons that can be done at a certain level and expansion uint8 level = GetPlayer()->GetLevel(); - uint32 contentTuningReplacementConditionMask = GetPlayer()->m_playerData->CtrOptions->ContentTuningConditionMask; + uint32 contentTuningReplacementConditionMask = 0 /*GetPlayer()->m_playerData->CtrOptions->ContentTuningConditionMask*/; lfg::LfgDungeonSet const& randomDungeons = sLFGMgr->GetRandomAndSeasonalDungeons(level, GetExpansion(), contentTuningReplacementConditionMask); WorldPackets::LFG::LfgPlayerInfo lfgPlayerInfo; diff --git a/src/server/game/Loot/Loot.cpp b/src/server/game/Loot/Loot.cpp index 050f205eb8c..3c9f0b4f643 100644 --- a/src/server/game/Loot/Loot.cpp +++ b/src/server/game/Loot/Loot.cpp @@ -568,7 +568,7 @@ ItemDisenchantLootEntry const* LootRoll::GetItemDisenchantLoot() const return nullptr; ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(m_lootItem->itemid); - uint32 itemLevel = Item::GetItemLevel(itemTemplate, bonusData, 1, 0, 0, 0, 0, false, 0); + uint32 itemLevel = Item::GetItemLevel(itemTemplate, bonusData, 1, 0, 0, 0, 0, false); return Item::GetDisenchantLoot(itemTemplate, bonusData.Quality, itemLevel); } diff --git a/src/server/game/Quests/QuestDef.cpp b/src/server/game/Quests/QuestDef.cpp index 17003ca274a..5e7a46641f6 100644 --- a/src/server/game/Quests/QuestDef.cpp +++ b/src/server/game/Quests/QuestDef.cpp @@ -619,19 +619,6 @@ WorldPacket Quest::BuildQueryData(LocaleConstant loc, Player* player) const response.Info.PortraitGiverName = GetPortraitGiverName(); response.Info.PortraitTurnInText = GetPortraitTurnInText(); response.Info.PortraitTurnInName = GetPortraitTurnInName(); - std::transform(GetConditionalQuestDescription().begin(), GetConditionalQuestDescription().end(), std::back_inserter(response.Info.ConditionalQuestDescription), [loc](QuestConditionalText const& text) - { - std::string_view content = text.Text[LOCALE_enUS]; - ObjectMgr::GetLocaleString(text.Text, loc, content); - return WorldPackets::Quest::ConditionalQuestText { text.PlayerConditionId, text.QuestgiverCreatureId, content }; - }); - - std::transform(GetConditionalQuestCompletionLog().begin(), GetConditionalQuestCompletionLog().end(), std::back_inserter(response.Info.ConditionalQuestCompletionLog), [loc](QuestConditionalText const& text) - { - std::string_view content = text.Text[LOCALE_enUS]; - ObjectMgr::GetLocaleString(text.Text, loc, content); - return WorldPackets::Quest::ConditionalQuestText { text.PlayerConditionId, text.QuestgiverCreatureId, content }; - }); if (loc != LOCALE_enUS) { @@ -651,7 +638,6 @@ WorldPacket Quest::BuildQueryData(LocaleConstant loc, Player* player) const response.Info.QuestID = GetQuestId(); response.Info.QuestType = GetQuestType(); - response.Info.ContentTuningID = GetContentTuningId(); response.Info.QuestPackageID = GetQuestPackageID(); response.Info.QuestSortID = GetZoneOrSort(); response.Info.QuestInfoID = GetQuestInfoID(); @@ -666,12 +652,13 @@ WorldPacket Quest::BuildQueryData(LocaleConstant loc, Player* player) const response.Info.RewardMoneyDifficulty = GetRewMoneyDifficulty(); response.Info.RewardMoneyMultiplier = GetMoneyMultiplier(); response.Info.RewardBonusMoney = GetRewMoneyMaxLevel(); - for (QuestRewardDisplaySpell displaySpell : RewardDisplaySpell) + + for (uint8 i = 0; i < QUEST_REWARD_DISPLAY_SPELL_COUNT; ++i) { - WorldPackets::Quest::QuestCompleteDisplaySpell& rewardDisplaySpell = response.Info.RewardDisplaySpell.emplace_back(); - rewardDisplaySpell.SpellID = displaySpell.SpellId; - rewardDisplaySpell.PlayerConditionID = displaySpell.PlayerConditionId; - rewardDisplaySpell.Type = int32(displaySpell.Type); + if (RewardDisplaySpell.empty() || RewardDisplaySpell.size() < i) + continue; + + response.Info.RewardDisplaySpell[i] = RewardDisplaySpell[i].SpellId; } response.Info.RewardSpell = GetRewSpell(); diff --git a/src/server/game/Server/Packets/AllPackets.h b/src/server/game/Server/Packets/AllPackets.h index a9658aec4eb..d047007694b 100644 --- a/src/server/game/Server/Packets/AllPackets.h +++ b/src/server/game/Server/Packets/AllPackets.h @@ -26,7 +26,6 @@ #include "ArtifactPackets.h" #include "AuctionHousePackets.h" #include "AuthenticationPackets.h" -#include "AzeritePackets.h" #include "BankPackets.h" #include "BlackMarketPackets.h" #include "BattlegroundPackets.h" diff --git a/src/server/game/Server/Packets/AzeritePackets.cpp b/src/server/game/Server/Packets/AzeritePackets.cpp deleted file mode 100644 index 87406b757dc..00000000000 --- a/src/server/game/Server/Packets/AzeritePackets.cpp +++ /dev/null @@ -1,71 +0,0 @@ -/* - * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#include "AzeritePackets.h" -#include "Util.h" - -WorldPacket const* WorldPackets::Azerite::PlayerAzeriteItemGains::Write() -{ - _worldPacket << ItemGUID; - _worldPacket << uint64(XP); - - return &_worldPacket; -} - -void WorldPackets::Azerite::AzeriteEssenceUnlockMilestone::Read() -{ - _worldPacket >> AzeriteItemMilestonePowerID; -} - -void WorldPackets::Azerite::AzeriteEssenceActivateEssence::Read() -{ - _worldPacket >> AzeriteEssenceID; - _worldPacket >> Slot; -} - -WorldPacket const* WorldPackets::Azerite::ActivateEssenceFailed::Write() -{ - _worldPacket.WriteBits(AsUnderlyingType(Reason), 4); - _worldPacket.WriteBit(Slot.has_value()); - _worldPacket << int32(Arg); - _worldPacket << int32(AzeriteEssenceID); - if (Slot) - _worldPacket << uint8(*Slot); - - return &_worldPacket; -} - -void WorldPackets::Azerite::AzeriteEmpoweredItemViewed::Read() -{ - _worldPacket >> ItemGUID; -} - -void WorldPackets::Azerite::AzeriteEmpoweredItemSelectPower::Read() -{ - _worldPacket >> Tier; - _worldPacket >> AzeritePowerID; - _worldPacket >> ContainerSlot; - _worldPacket >> Slot; -} - -WorldPacket const* WorldPackets::Azerite::PlayerAzeriteItemEquippedStatusChanged::Write() -{ - _worldPacket.WriteBit(IsHeartEquipped); - _worldPacket.FlushBits(); - - return &_worldPacket; -} diff --git a/src/server/game/Server/Packets/AzeritePackets.h b/src/server/game/Server/Packets/AzeritePackets.h deleted file mode 100644 index 0a0204c61e7..00000000000 --- a/src/server/game/Server/Packets/AzeritePackets.h +++ /dev/null @@ -1,110 +0,0 @@ -/* - * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef AzeriteItemPackets_h__ -#define AzeriteItemPackets_h__ - -#include "Packet.h" -#include "ItemDefines.h" -#include "ObjectGuid.h" -#include "Optional.h" - -namespace WorldPackets -{ - namespace Azerite - { - class PlayerAzeriteItemGains final : public ServerPacket - { - public: - PlayerAzeriteItemGains() : ServerPacket(SMSG_PLAYER_AZERITE_ITEM_GAINS, 16 + 8) { } - - WorldPacket const* Write() override; - - ObjectGuid ItemGUID; - uint64 XP = 0; - }; - - class AzeriteEssenceUnlockMilestone final : public ClientPacket - { - public: - AzeriteEssenceUnlockMilestone(WorldPacket&& packet) : ClientPacket(CMSG_AZERITE_ESSENCE_UNLOCK_MILESTONE, std::move(packet)) { } - - void Read() override; - - int32 AzeriteItemMilestonePowerID = 0; - }; - - class AzeriteEssenceActivateEssence final : public ClientPacket - { - public: - AzeriteEssenceActivateEssence(WorldPacket&& packet) : ClientPacket(CMSG_AZERITE_ESSENCE_ACTIVATE_ESSENCE, std::move(packet)) { } - - void Read() override; - - int32 AzeriteEssenceID = 0; - uint8 Slot = 0; - }; - - class ActivateEssenceFailed final : public ServerPacket - { - public: - ActivateEssenceFailed() : ServerPacket(SMSG_ACTIVATE_ESSENCE_FAILED, 1 + 4 + 4 + 1) { } - - WorldPacket const* Write() override; - - AzeriteEssenceActivateResult Reason = AzeriteEssenceActivateResult::None; - int32 Arg = 0; - int32 AzeriteEssenceID = 0; - Optional<uint8> Slot; - }; - - class AzeriteEmpoweredItemViewed final : public ClientPacket - { - public: - AzeriteEmpoweredItemViewed(WorldPacket&& packet) : ClientPacket(CMSG_AZERITE_EMPOWERED_ITEM_VIEWED, std::move(packet)) { } - - void Read() override; - - ObjectGuid ItemGUID; - }; - - class AzeriteEmpoweredItemSelectPower final : public ClientPacket - { - public: - AzeriteEmpoweredItemSelectPower(WorldPacket&& packet) : ClientPacket(CMSG_AZERITE_EMPOWERED_ITEM_SELECT_POWER, std::move(packet)) { } - - void Read() override; - - int32 Tier = 0; - int32 AzeritePowerID = 0; - uint8 ContainerSlot = 0; - uint8 Slot = 0; - }; - - class TC_GAME_API PlayerAzeriteItemEquippedStatusChanged final : public ServerPacket - { - public: - PlayerAzeriteItemEquippedStatusChanged() : ServerPacket(SMSG_PLAYER_AZERITE_ITEM_EQUIPPED_STATUS_CHANGED, 1) { } - - WorldPacket const* Write() override; - - bool IsHeartEquipped = false; - }; - } -} - -#endif // AzeriteItemPackets_h__ diff --git a/src/server/game/Server/Packets/InspectPackets.cpp b/src/server/game/Server/Packets/InspectPackets.cpp index cd2d25b80a1..942ffdc8f63 100644 --- a/src/server/game/Server/Packets/InspectPackets.cpp +++ b/src/server/game/Server/Packets/InspectPackets.cpp @@ -16,7 +16,6 @@ */ #include "InspectPackets.h" -#include "AzeriteItem.h" #include "Item.h" #include "Player.h" @@ -181,28 +180,6 @@ InspectItemData::InspectItemData(::Item const* item, uint8 index) } ++i; } - - if (AzeriteItem const* azeriteItem = item->ToAzeriteItem()) - { - if (UF::SelectedAzeriteEssences const* essences = azeriteItem->GetSelectedAzeriteEssences()) - { - for (uint8 slot = 0; slot < essences->AzeriteEssenceID.size(); ++slot) - { - AzeriteEssences.emplace_back(); - - AzeriteEssenceData& essence = AzeriteEssences.back(); - essence.Index = slot; - essence.AzeriteEssenceID = essences->AzeriteEssenceID[slot]; - if (essence.AzeriteEssenceID) - { - essence.Rank = azeriteItem->GetEssenceRank(essence.AzeriteEssenceID); - essence.SlotUnlocked = true; - } - else - essence.SlotUnlocked = azeriteItem->HasUnlockedEssenceSlot(slot); - } - } - } } WorldPacket const* InspectResult::Write() diff --git a/src/server/game/Server/Packets/MiscPackets.cpp b/src/server/game/Server/Packets/MiscPackets.cpp index 5e7c646d529..2240f4ae250 100644 --- a/src/server/game/Server/Packets/MiscPackets.cpp +++ b/src/server/game/Server/Packets/MiscPackets.cpp @@ -182,7 +182,6 @@ WorldPacket const* WorldPackets::Misc::TriggerMovie::Write() WorldPacket const* WorldPackets::Misc::TriggerCinematic::Write() { _worldPacket << uint32(CinematicID); - _worldPacket << ConversationGuid; return &_worldPacket; } diff --git a/src/server/game/Server/Packets/MiscPackets.h b/src/server/game/Server/Packets/MiscPackets.h index 10aeacead81..b0bab1847df 100644 --- a/src/server/game/Server/Packets/MiscPackets.h +++ b/src/server/game/Server/Packets/MiscPackets.h @@ -196,7 +196,6 @@ namespace WorldPackets WorldPacket const* Write() override; uint32 CinematicID = 0; - ObjectGuid ConversationGuid; }; class TriggerMovie final : public ServerPacket diff --git a/src/server/game/Server/Packets/MovementPackets.cpp b/src/server/game/Server/Packets/MovementPackets.cpp index 49e7c7f9f92..7c2bc3206eb 100644 --- a/src/server/game/Server/Packets/MovementPackets.cpp +++ b/src/server/game/Server/Packets/MovementPackets.cpp @@ -282,18 +282,6 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Movement::MonsterSplineAn return data; } -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Movement::MonsterSplineUnknown901 const& unk) -{ - for (WorldPackets::Movement::MonsterSplineUnknown901::Inner const& unkInner : unk.Data) - { - data << int32(unkInner.Unknown_1); - data << unkInner.Visual; - data << uint32(unkInner.Unknown_4); - } - - return data; -} - ByteBuffer& WorldPackets::operator<<(ByteBuffer& data, Movement::MovementSpline const& movementSpline) { data << uint32(movementSpline.Flags); @@ -312,7 +300,6 @@ ByteBuffer& WorldPackets::operator<<(ByteBuffer& data, Movement::MovementSpline data.WriteBit(movementSpline.SpellEffectExtraData.has_value()); data.WriteBit(movementSpline.JumpExtraData.has_value()); data.WriteBit(movementSpline.AnimTierTransition.has_value()); - data.WriteBit(movementSpline.Unknown901.has_value()); data.FlushBits(); if (movementSpline.SplineFilter) @@ -347,9 +334,6 @@ ByteBuffer& WorldPackets::operator<<(ByteBuffer& data, Movement::MovementSpline if (movementSpline.AnimTierTransition) data << *movementSpline.AnimTierTransition; - if (movementSpline.Unknown901) - data << *movementSpline.Unknown901; - return data; } diff --git a/src/server/game/Server/Packets/MovementPackets.h b/src/server/game/Server/Packets/MovementPackets.h index 77cc00d71c7..51a0c4c002a 100644 --- a/src/server/game/Server/Packets/MovementPackets.h +++ b/src/server/game/Server/Packets/MovementPackets.h @@ -100,18 +100,6 @@ namespace WorldPackets uint8 AnimTier = 0; }; - struct MonsterSplineUnknown901 - { - struct Inner - { - int32 Unknown_1 = 0; - Spells::SpellCastVisual Visual; - uint32 Unknown_4 = 0; - }; - - std::array<Inner, 16> Data; - }; - struct MovementSpline { uint32 Flags = 0; // Spline flags @@ -130,7 +118,6 @@ namespace WorldPackets Optional<MonsterSplineSpellEffectExtraData> SpellEffectExtraData; Optional<MonsterSplineJumpExtraData> JumpExtraData; Optional<MonsterSplineAnimTierTransition> AnimTierTransition; - Optional<MonsterSplineUnknown901> Unknown901; float FaceDirection = 0.0f; ObjectGuid FaceGUID; TaggedPosition<Position::XYZ> FaceSpot; diff --git a/src/server/game/Server/Packets/QueryPackets.cpp b/src/server/game/Server/Packets/QueryPackets.cpp index 8f6e7572638..377072f69c0 100644 --- a/src/server/game/Server/Packets/QueryPackets.cpp +++ b/src/server/game/Server/Packets/QueryPackets.cpp @@ -78,7 +78,7 @@ WorldPacket const* QueryCreatureResponse::Write() _worldPacket.WriteBits(Stats.Title.length() + 1, 11); _worldPacket.WriteBits(Stats.TitleAlt.length() + 1, 11); _worldPacket.WriteBits(Stats.CursorName.length() + 1, 6); - _worldPacket.WriteBit(Stats.Cilivilan); + _worldPacket.WriteBit(Stats.Civilian); _worldPacket.WriteBit(Stats.Leader); for (std::size_t i = 0; i < Stats.Name.size(); ++i) @@ -102,7 +102,7 @@ WorldPacket const* QueryCreatureResponse::Write() _worldPacket << int32(Stats.CreatureType); _worldPacket << int32(Stats.CreatureFamily); _worldPacket << int32(Stats.Classification); - _worldPacket << uint32(Stats.PetSpellDataId); + _worldPacket << uint32(Stats.PetSpellDataID); _worldPacket.append(Stats.ProxyCreatureID.data(), Stats.ProxyCreatureID.size()); _worldPacket << uint32(Stats.Display.CreatureDisplay.size()); _worldPacket << float(Stats.Display.TotalProbability); diff --git a/src/server/game/Server/Packets/QueryPackets.h b/src/server/game/Server/Packets/QueryPackets.h index 74b777f6d93..6bd43833081 100644 --- a/src/server/game/Server/Packets/QueryPackets.h +++ b/src/server/game/Server/Packets/QueryPackets.h @@ -67,11 +67,11 @@ namespace WorldPackets int32 CreatureType = 0; int32 CreatureFamily = 0; int32 Classification = 0; - uint32 PetSpellDataId = 0; + uint32 PetSpellDataID = 0; CreatureDisplayStats Display; float HpMulti = 0.0f; float EnergyMulti = 0.0f; - bool Cilivilan = false; + bool Civilian = false; bool Leader = false; std::vector<int32> QuestItems; std::vector<int32> QuestCurrencies; diff --git a/src/server/game/Server/Packets/QuestPackets.cpp b/src/server/game/Server/Packets/QuestPackets.cpp index cefc2959e07..8418f13c0f3 100644 --- a/src/server/game/Server/Packets/QuestPackets.cpp +++ b/src/server/game/Server/Packets/QuestPackets.cpp @@ -104,8 +104,11 @@ WorldPacket const* QueryQuestInfoResponse::Write() { _worldPacket << int32(Info.QuestID); _worldPacket << int32(Info.QuestType); + _worldPacket << int32(Info.QuestLevel); + _worldPacket << int32(Info.QuestScalingFactionGroup); + _worldPacket << int32(Info.QuestMaxScalingLevel); _worldPacket << int32(Info.QuestPackageID); - _worldPacket << int32(Info.ContentTuningID); + _worldPacket << int32(Info.QuestMinLevel); _worldPacket << int32(Info.QuestSortID); _worldPacket << int32(Info.QuestInfoID); _worldPacket << int32(Info.SuggestedGroupNum); @@ -116,7 +119,7 @@ WorldPacket const* QueryQuestInfoResponse::Write() _worldPacket << int32(Info.RewardMoneyDifficulty); _worldPacket << float(Info.RewardMoneyMultiplier); _worldPacket << int32(Info.RewardBonusMoney); - _worldPacket << uint32(Info.RewardDisplaySpell.size()); + _worldPacket.append(Info.RewardDisplaySpell.data(), Info.RewardDisplaySpell.size()); _worldPacket << int32(Info.RewardSpell); _worldPacket << int32(Info.RewardHonor); _worldPacket << float(Info.RewardKillHonor); @@ -188,12 +191,6 @@ WorldPacket const* QueryQuestInfoResponse::Write() _worldPacket << int32(Info.QuestSessionBonus); _worldPacket << int32(Info.QuestGiverCreatureID); - _worldPacket << uint32(Info.ConditionalQuestDescription.size()); - _worldPacket << uint32(Info.ConditionalQuestCompletionLog.size()); - - for (QuestCompleteDisplaySpell const& rewardDisplaySpell : Info.RewardDisplaySpell) - _worldPacket << rewardDisplaySpell; - _worldPacket.WriteBits(Info.LogTitle.size(), 9); _worldPacket.WriteBits(Info.LogDescription.size(), 12); _worldPacket.WriteBits(Info.QuestDescription.size(), 12); @@ -236,12 +233,6 @@ WorldPacket const* QueryQuestInfoResponse::Write() _worldPacket.WriteString(Info.PortraitTurnInText); _worldPacket.WriteString(Info.PortraitTurnInName); _worldPacket.WriteString(Info.QuestCompletionLog); - - for (ConditionalQuestText const& conditionalQuestText : Info.ConditionalQuestDescription) - _worldPacket << conditionalQuestText; - - for (ConditionalQuestText const& conditionalQuestText : Info.ConditionalQuestCompletionLog) - _worldPacket << conditionalQuestText; } return &_worldPacket; diff --git a/src/server/game/Server/Packets/QuestPackets.h b/src/server/game/Server/Packets/QuestPackets.h index 582144adcb2..bfdfae08758 100644 --- a/src/server/game/Server/Packets/QuestPackets.h +++ b/src/server/game/Server/Packets/QuestPackets.h @@ -135,8 +135,11 @@ namespace WorldPackets { int32 QuestID = 0; int32 QuestType = 0; // Accepted values: 0, 1 or 2. 0 == IsAutoComplete() (skip objectives/details) - int32 ContentTuningID = 0; + int32 QuestLevel = 0; + int32 QuestScalingFactionGroup = 0; + int32 QuestMaxScalingLevel = 0; int32 QuestPackageID = 0; + int32 QuestMinLevel = 0; int32 QuestSortID = 0; // zone or sort to display in quest log int32 QuestInfoID = 0; int32 SuggestedGroupNum = 0; @@ -147,7 +150,7 @@ namespace WorldPackets int32 RewardMoneyDifficulty = 0; float RewardMoneyMultiplier = 1.0f; int32 RewardBonusMoney = 0; - std::vector<QuestCompleteDisplaySpell> RewardDisplaySpell; // reward spell, this spell will be displayed (icon) + std::array<int32, QUEST_REWARD_DISPLAY_SPELL_COUNT> RewardDisplaySpell; // reward spell, this spell will be displayed (icon) int32 RewardSpell = 0; int32 RewardHonor = 0; float RewardKillHonor = 0.0f; @@ -191,8 +194,6 @@ namespace WorldPackets int32 QuestSessionBonus = 0; int32 QuestGiverCreatureID = 0; // used to select ConditionalQuestText std::vector<QuestObjective> Objectives; - std::vector<ConditionalQuestText> ConditionalQuestDescription; - std::vector<ConditionalQuestText> ConditionalQuestCompletionLog; int32 RewardItems[QUEST_REWARD_ITEM_COUNT] = { }; int32 RewardAmount[QUEST_REWARD_ITEM_COUNT] = { }; int32 ItemDrop[QUEST_ITEM_DROP_COUNT] = { }; diff --git a/src/server/game/Server/Packets/SystemPackets.cpp b/src/server/game/Server/Packets/SystemPackets.cpp index 1849327538b..59131fa2c4a 100644 --- a/src/server/game/Server/Packets/SystemPackets.cpp +++ b/src/server/game/Server/Packets/SystemPackets.cpp @@ -130,14 +130,18 @@ WorldPacket const* FeatureSystemStatus::Write() _worldPacket.WriteBit(LFGListCustomRequiresAuthenticator); _worldPacket.WriteBit(AddonsDisabled); _worldPacket.WriteBit(WarGamesEnabled); + _worldPacket.WriteBit(false); // unk, unused 4.4.0 + _worldPacket.WriteBit(false); // unk, unused 4.4.0 _worldPacket.WriteBit(ContentTrackingEnabled); _worldPacket.WriteBit(IsSellAllJunkEnabled); + _worldPacket.WriteBit(IsGroupFinderEnabled); _worldPacket.WriteBit(IsLFDEnabled); - _worldPacket.WriteBit(IsLFREnabled); _worldPacket.WriteBit(IsPremadeGroupEnabled); + _worldPacket.WriteBits(Field_16F.size(), 8); + _worldPacket.FlushBits(); { @@ -173,6 +177,9 @@ WorldPacket const* FeatureSystemStatus::Write() _worldPacket << int32(SessionAlert->DisplayTime); } + if (!Field_16F.empty()) + _worldPacket.WriteString(Field_16F); + { _worldPacket.WriteBit(Squelch.IsSquelched); _worldPacket << Squelch.BnetAccountGuid; @@ -209,11 +216,15 @@ WorldPacket const* FeatureSystemStatusGlueScreen::Write() _worldPacket.WriteBit(Unknown901CheckoutRelated); _worldPacket.WriteBit(false); // unused, 10.0.2 _worldPacket.WriteBit(EuropaTicketSystemStatus.has_value()); - _worldPacket.WriteBit(false); // unused, 10.0.2 + _worldPacket.WriteBit(IsNameReservationEnabled); _worldPacket.WriteBit(LaunchETA.has_value()); + _worldPacket.WriteBit(false); // unused, 4.4.0 + _worldPacket.WriteBit(false); // unused, 4.4.0 + + _worldPacket.WriteBit(false); // unused, 4.4.0 + _worldPacket.WriteBit(IsSoMNotificationEnabled); _worldPacket.WriteBit(AddonsDisabled); _worldPacket.WriteBit(Unused1000); - _worldPacket.WriteBit(AccountSaveDataExportEnabled); _worldPacket.WriteBit(AccountLockedByExport); _worldPacket.WriteBit(RealmHiddenAlert.has_value()); @@ -243,6 +254,7 @@ WorldPacket const* FeatureSystemStatusGlueScreen::Write() _worldPacket << PlayerNameQueryInterval; _worldPacket << uint32(DebugTimeEvents.size()); _worldPacket << int32(Unused1007); + _worldPacket << int32(Unused440); if (LaunchETA) _worldPacket << int32(*LaunchETA); diff --git a/src/server/game/Server/Packets/SystemPackets.h b/src/server/game/Server/Packets/SystemPackets.h index afb0600db98..aebb3e658c9 100644 --- a/src/server/game/Server/Packets/SystemPackets.h +++ b/src/server/game/Server/Packets/SystemPackets.h @@ -169,6 +169,7 @@ namespace WorldPackets SquelchInfo Squelch; RafSystemFeatureInfo RAFSystem; std::vector<GameRuleValuePair> GameRuleValues; + std::string Field_16F = ""; }; struct DebugTimeEventInfo @@ -202,9 +203,11 @@ namespace WorldPackets bool LiveRegionKeyBindingsCopyEnabled = false; bool Unknown901CheckoutRelated = false; // NYI bool AddonsDisabled = false; + bool IsSoMNotificationEnabled = false; // NYI bool Unused1000 = false; bool AccountSaveDataExportEnabled = false; bool AccountLockedByExport = false; + bool IsNameReservationEnabled = false; // NYI Optional<EuropaTicketConfig> EuropaTicketSystemStatus; std::vector<int32> LiveRegionCharacterCopySourceRegions; uint32 TokenPollTimeSeconds = 0; // NYI @@ -224,6 +227,7 @@ namespace WorldPackets Optional<int32> LaunchETA; std::vector<DebugTimeEventInfo> DebugTimeEvents; int32 Unused1007 = 0; + int32 Unused440 = 0; Optional<std::string> RealmHiddenAlert; }; diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 36b9bc1ef46..83c4d7e4bf4 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -193,10 +193,10 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_AUTO_GUILD_BANK_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAutoGuildBankItem); DEFINE_HANDLER(CMSG_AUTO_STORE_BAG_ITEM, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleAutoStoreBagItemOpcode); DEFINE_HANDLER(CMSG_AUTO_STORE_GUILD_BANK_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAutoStoreGuildBankItem); - DEFINE_HANDLER(CMSG_AZERITE_EMPOWERED_ITEM_SELECT_POWER, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleAzeriteEmpoweredItemSelectPower); - DEFINE_HANDLER(CMSG_AZERITE_EMPOWERED_ITEM_VIEWED, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleAzeriteEmpoweredItemViewed); - DEFINE_HANDLER(CMSG_AZERITE_ESSENCE_ACTIVATE_ESSENCE, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleAzeriteEssenceActivateEssence); - DEFINE_HANDLER(CMSG_AZERITE_ESSENCE_UNLOCK_MILESTONE, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleAzeriteEssenceUnlockMilestone); + DEFINE_HANDLER(CMSG_AZERITE_EMPOWERED_ITEM_SELECT_POWER, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_AZERITE_EMPOWERED_ITEM_VIEWED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_AZERITE_ESSENCE_ACTIVATE_ESSENCE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_AZERITE_ESSENCE_UNLOCK_MILESTONE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_BANKER_ACTIVATE, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleBankerActivateOpcode); DEFINE_HANDLER(CMSG_BATTLEFIELD_LEAVE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBattlefieldLeaveOpcode); DEFINE_HANDLER(CMSG_BATTLEFIELD_LIST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBattlefieldListOpcode); diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index e7b63f99464..d5aa44ac58b 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -153,14 +153,6 @@ namespace WorldPackets enum class ConnectToSerial : uint32; } - namespace Azerite - { - class AzeriteEmpoweredItemSelectPower; - class AzeriteEmpoweredItemViewed; - class AzeriteEssenceUnlockMilestone; - class AzeriteEssenceActivateEssence; - } - namespace Bank { class AutoBankItem; @@ -1830,13 +1822,6 @@ class TC_GAME_API WorldSession // Scenario void HandleQueryScenarioPOI(WorldPackets::Scenario::QueryScenarioPOI& queryScenarioPOI); - // Azerite - void HandleAzeriteEssenceUnlockMilestone(WorldPackets::Azerite::AzeriteEssenceUnlockMilestone& azeriteEssenceUnlockMilestone); - void HandleAzeriteEssenceActivateEssence(WorldPackets::Azerite::AzeriteEssenceActivateEssence& azeriteEssenceActivateEssence); - void HandleAzeriteEmpoweredItemViewed(WorldPackets::Azerite::AzeriteEmpoweredItemViewed& azeriteEmpoweredItemViewed); - void HandleAzeriteEmpoweredItemSelectPower(WorldPackets::Azerite::AzeriteEmpoweredItemSelectPower& azeriteEmpoweredItemSelectPower); - void SendAzeriteRespecNPC(ObjectGuid npc); - void HandleRequestLatestSplashScreen(WorldPackets::Misc::RequestLatestSplashScreen& requestLatestSplashScreen); void HandleSocialContractRequest(WorldPackets::Social::SocialContractRequest& socialContractRequest); diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index ce642c60e63..e8393cf19d0 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -555,7 +555,7 @@ NonDefaultConstructible<pAuraEffectHandler> AuraEffectHandler[TOTAL_AURAS]= &AuraEffect::HandleNULL, //484 SPELL_AURA_ALLOW_INTERRUPT_SPELL &AuraEffect::HandleModMovementForceMagnitude, //485 SPELL_AURA_MOD_MOVEMENT_FORCE_MAGNITUDE &AuraEffect::HandleNULL, //486 - &AuraEffect::HandleCosmeticMounted, //487 SPELL_AURA_COSMETIC_MOUNTED + &AuraEffect::HandleNULL, //487 SPELL_AURA_COSMETIC_MOUNTED &AuraEffect::HandleNULL, //488 &AuraEffect::HandleModAlternativeDefaultLanguage, //489 SPELL_AURA_MOD_ALTERNATIVE_DEFAULT_LANGUAGE &AuraEffect::HandleNULL, //490 @@ -609,7 +609,7 @@ NonDefaultConstructible<pAuraEffectHandler> AuraEffectHandler[TOTAL_AURAS]= &AuraEffect::HandleUnused, //538 SPELL_AURA_MOD_FAKE_INEBRIATION_MOVEMENT_ONLY handled clientside &AuraEffect::HandleNoImmediateEffect, //539 SPELL_AURA_ALLOW_MOUNT_IN_COMBAT implemented in SpellInfo::CanBeUsedInCombat &AuraEffect::HandleNULL, //540 SPELL_AURA_MOD_SUPPORT_STAT - &AuraEffect::HandleModRequiredMountCapabilityFlags, //541 SPELL_AURA_MOD_REQUIRED_MOUNT_CAPABILITY_FLAGS + &AuraEffect::HandleNULL, //541 SPELL_AURA_MOD_REQUIRED_MOUNT_CAPABILITY_FLAGS &AuraEffect::HandleNULL, //542 &AuraEffect::HandleNULL, //543 &AuraEffect::HandleNULL, //544 @@ -2470,7 +2470,8 @@ void AuraEffect::HandleAuraModSilence(AuraApplication const* aurApp, uint8 mode, if (apply) { - target->SetSilencedSchoolMask(SpellSchoolMask(GetMiscValue())); + // @TODO: Fix for 4.4.0 + // target->SetUnitFlag(UNIT_FLAG_SILENCED); // call functions which may have additional effects after changing state of unit // Stop cast only spells vs PreventionType & SPELL_PREVENTION_TYPE_SILENCE @@ -2482,14 +2483,12 @@ void AuraEffect::HandleAuraModSilence(AuraApplication const* aurApp, uint8 mode, } else { - int32 silencedSchoolMask = 0; - for (AuraEffect const* auraEffect : target->GetAuraEffectsByType(SPELL_AURA_MOD_SILENCE)) - silencedSchoolMask |= auraEffect->GetMiscValue(); - - for (AuraEffect const* auraEffect : target->GetAuraEffectsByType(SPELL_AURA_MOD_PACIFY_SILENCE)) - silencedSchoolMask |= auraEffect->GetMiscValue(); + // do not remove unit flag if there are more than this auraEffect of that kind on unit on unit + if (target->HasAuraType(SPELL_AURA_MOD_SILENCE) || target->HasAuraType(SPELL_AURA_MOD_PACIFY_SILENCE)) + return; - target->ReplaceAllSilencedSchoolMask(SpellSchoolMask(silencedSchoolMask)); + // @TODO: Fix for 4.4.0 + // target->RemoveUnitFlag(UNIT_FLAG_SILENCED); } } @@ -4111,8 +4110,6 @@ void AuraEffect::HandleModManaCostPct(AuraApplication const* aurApp, uint8 mode, { if (!(mode & (AURA_EFFECT_HANDLE_CHANGE_AMOUNT_MASK | AURA_EFFECT_HANDLE_STAT))) return; - - aurApp->GetTarget()->ApplyModManaCostMultiplier(GetAmount() / 100.0f, apply); } void AuraEffect::HandleAuraModPowerDisplay(AuraApplication const* aurApp, uint8 mode, bool apply) const @@ -4667,11 +4664,11 @@ void AuraEffect::HandleModPowerCost(AuraApplication const* aurApp, uint8 mode, b if (!(GetMiscValueB() & (1 << POWER_MANA))) return; - Unit* target = aurApp->GetTarget(); - - for (int i = 0; i < MAX_SPELL_SCHOOL; ++i) - if (GetMiscValue() & (1 << i)) - target->ApplyModManaCostModifier(SpellSchools(i), GetAmount(), apply); + // Unit* target = aurApp->GetTarget(); + // + // for (int i = 0; i < MAX_SPELL_SCHOOL; ++i) + // if (GetMiscValue() & (1 << i)) + // target->ApplyModManaCostModifier(SpellSchools(i), GetAmount(), apply); } void AuraEffect::HandleArenaPreparation(AuraApplication const* aurApp, uint8 mode, bool apply) const @@ -6379,44 +6376,6 @@ void AuraEffect::HandleMountRestrictions(AuraApplication const* aurApp, uint8 mo aurApp->GetTarget()->UpdateMountCapability(); } -void AuraEffect::HandleCosmeticMounted(AuraApplication const* aurApp, uint8 mode, bool apply) const -{ - if (!(mode & AURA_EFFECT_HANDLE_REAL)) - return; - - if (apply) - aurApp->GetTarget()->SetCosmeticMountDisplayId(GetMiscValue()); - else - aurApp->GetTarget()->SetCosmeticMountDisplayId(0); // set cosmetic mount to 0, even if multiple auras are active; tested with zandalari racial + divine steed - - Player* playerTarget = aurApp->GetTarget()->ToPlayer(); - if (!playerTarget) - return; - - playerTarget->SendMovementSetCollisionHeight(playerTarget->GetCollisionHeight(), WorldPackets::Movement::UpdateCollisionHeightReason::Force); -} - -void AuraEffect::HandleModRequiredMountCapabilityFlags(AuraApplication const* aurApp, uint8 mode, bool apply) const -{ - if (!(mode & AURA_EFFECT_HANDLE_REAL)) - return; - - Player* playerTarget = aurApp->GetTarget()->ToPlayer(); - if (!playerTarget) - return; - - if (apply) - playerTarget->SetRequiredMountCapabilityFlag(GetMiscValue()); - else - { - int32 mountCapabilityFlags = 0; - for (AuraEffect* otherAura : playerTarget->GetAuraEffectsByType(GetAuraType())) - mountCapabilityFlags |= otherAura->GetMiscValue(); - - playerTarget->ReplaceAllRequiredMountCapabilityFlags(mountCapabilityFlags); - } -} - void AuraEffect::HandleSuppressItemPassiveEffectBySpellLabel(AuraApplication const* aurApp, uint8 mode, bool /*apply*/) const { if (!(mode & AURA_EFFECT_HANDLE_REAL)) diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.h b/src/server/game/Spells/Auras/SpellAuraEffects.h index 8260d96f621..7f7321d80d0 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.h +++ b/src/server/game/Spells/Auras/SpellAuraEffects.h @@ -333,8 +333,6 @@ class TC_GAME_API AuraEffect void HandleTriggerSpellOnExpire(AuraApplication const* aurApp, uint8 mode, bool apply) const; void HandleStoreTeleportReturnPoint(AuraApplication const* aurApp, uint8 mode, bool apply) const; void HandleMountRestrictions(AuraApplication const* aurApp, uint8 mode, bool apply) const; - void HandleCosmeticMounted(AuraApplication const* aurApp, uint8 mode, bool apply) const; - void HandleModRequiredMountCapabilityFlags(AuraApplication const* aurApp, uint8 mode, bool apply) const; void HandleSuppressItemPassiveEffectBySpellLabel(AuraApplication const* aurApp, uint8 mode, bool apply) const; void HandleForceBreathBar(AuraApplication const* aurApp, uint8 mode, bool apply) const; diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 0086030683f..1bb329d982d 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -16,7 +16,6 @@ */ #include "Spell.h" -#include "AzeriteEmpoweredItem.h" #include "Battlefield.h" #include "BattlefieldMgr.h" #include "Battleground.h" @@ -6856,7 +6855,8 @@ SpellCastResult Spell::CheckCasterAuras(int32* param1) const else if ((m_spellInfo->Mechanic & MECHANIC_IMMUNE_SHIELD) && m_caster->ToUnit() && m_caster->ToUnit()->HasAuraWithMechanic(1 << MECHANIC_BANISH)) result = SPELL_FAILED_STUNNED; } - else if (unitCaster->IsSilenced(m_spellSchoolMask) && m_spellInfo->PreventionType & SPELL_PREVENTION_TYPE_SILENCE && !CheckSpellCancelsSilence(param1)) + // @TODO: Fix for 4.4.0 + else if (/*unitCaster->HasUnitFlag(UNIT_FLAG_SILENCED) &&*/ m_spellInfo->PreventionType & SPELL_PREVENTION_TYPE_SILENCE && !CheckSpellCancelsSilence(param1)) result = SPELL_FAILED_SILENCED; else if (unitflag & UNIT_FLAG_PACIFIED && m_spellInfo->PreventionType & SPELL_PREVENTION_TYPE_PACIFY && !CheckSpellCancelsPacify(param1)) result = SPELL_FAILED_PACIFIED; @@ -7735,37 +7735,6 @@ SpellCastResult Spell::CheckItems(int32* param1 /*= nullptr*/, int32* param2 /*= return SPELL_FAILED_ITEM_AT_MAX_CHARGES; break; } - case SPELL_EFFECT_RESPEC_AZERITE_EMPOWERED_ITEM: - { - Item const* item = m_targets.GetItemTarget(); - if (!item) - return SPELL_FAILED_AZERITE_EMPOWERED_ONLY; - - if (item->GetOwnerGUID() != m_caster->GetGUID()) - return SPELL_FAILED_DONT_REPORT; - - AzeriteEmpoweredItem const* azeriteEmpoweredItem = item->ToAzeriteEmpoweredItem(); - if (!azeriteEmpoweredItem) - return SPELL_FAILED_AZERITE_EMPOWERED_ONLY; - - bool hasSelections = false; - for (int32 tier = 0; tier < MAX_AZERITE_EMPOWERED_TIER; ++tier) - { - if (azeriteEmpoweredItem->GetSelectedAzeritePower(tier)) - { - hasSelections = true; - break; - } - } - - if (!hasSelections) - return SPELL_FAILED_AZERITE_EMPOWERED_NO_CHOICES_TO_UNDO; - - if (!m_caster->ToPlayer()->HasEnoughMoney(azeriteEmpoweredItem->GetRespecCost())) - return SPELL_FAILED_DONT_REPORT; - - break; - } default: break; } @@ -9360,14 +9329,6 @@ CastSpellExtraArgs& CastSpellExtraArgs::SetTriggeringAura(AuraEffect const* trig return *this; } -SpellCastVisual::operator UF::SpellCastVisual() const -{ - UF::SpellCastVisual visual; - visual.SpellXSpellVisualID = SpellXSpellVisualID; - visual.ScriptVisualID = ScriptVisualID; - return visual; -} - SpellCastVisual::operator WorldPackets::Spells::SpellCastVisual() const { return { int32(SpellXSpellVisualID), int32(ScriptVisualID) }; diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h index 9c452f59c9a..9deaa008721 100644 --- a/src/server/game/Spells/Spell.h +++ b/src/server/game/Spells/Spell.h @@ -412,8 +412,6 @@ class TC_GAME_API Spell void EffectGiveHonor(); void EffectJumpCharge(); void EffectLearnTransmogSet(); - void EffectRespecAzeriteEmpoweredItem(); - void EffectLearnAzeriteEssencePower(); void EffectCreatePrivateConversation(); void EffectSendChatMessage(); void EffectGrantBattlePetExperience(); diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 3c4a40ff587..ebc57399656 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -18,8 +18,6 @@ #include "Spell.h" #include "AccountMgr.h" #include "AreaTrigger.h" -#include "AzeriteEmpoweredItem.h" -#include "AzeriteItem.h" #include "Battleground.h" #include "BattlegroundMgr.h" #include "BattlePetMgr.h" @@ -346,13 +344,13 @@ NonDefaultConstructible<SpellEffectHandlerFn> SpellEffectHandlers[TOTAL_SPELL_EF &Spell::EffectUnused, //256 SPELL_EFFECT_256 &Spell::EffectUnused, //257 SPELL_EFFECT_257 &Spell::EffectNULL, //258 SPELL_EFFECT_MODIFY_KEYSTONE - &Spell::EffectRespecAzeriteEmpoweredItem, //259 SPELL_EFFECT_RESPEC_AZERITE_EMPOWERED_ITEM + &Spell::EffectNULL, //259 SPELL_EFFECT_RESPEC_AZERITE_EMPOWERED_ITEM &Spell::EffectNULL, //260 SPELL_EFFECT_SUMMON_STABLED_PET &Spell::EffectNULL, //261 SPELL_EFFECT_SCRAP_ITEM &Spell::EffectUnused, //262 SPELL_EFFECT_262 &Spell::EffectNULL, //263 SPELL_EFFECT_REPAIR_ITEM &Spell::EffectNULL, //264 SPELL_EFFECT_REMOVE_GEM - &Spell::EffectLearnAzeriteEssencePower, //265 SPELL_EFFECT_LEARN_AZERITE_ESSENCE_POWER + &Spell::EffectNULL, //265 SPELL_EFFECT_LEARN_AZERITE_ESSENCE_POWER &Spell::EffectNULL, //266 SPELL_EFFECT_SET_ITEM_BONUS_LIST_GROUP_ENTRY &Spell::EffectCreatePrivateConversation, //267 SPELL_EFFECT_CREATE_PRIVATE_CONVERSATION &Spell::EffectNULL, //268 SPELL_EFFECT_APPLY_MOUNT_EQUIPMENT @@ -5770,73 +5768,6 @@ void Spell::EffectLearnTransmogSet() unitTarget->ToPlayer()->GetSession()->GetCollectionMgr()->AddTransmogSet(effectInfo->MiscValue); } -void Spell::EffectRespecAzeriteEmpoweredItem() -{ - if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) - return; - - if (!itemTarget || !itemTarget->IsAzeriteEmpoweredItem()) - return; - - Player* owner = m_caster->ToPlayer(); - if (!owner) - return; - - AzeriteEmpoweredItem* azeriteEmpoweredItem = itemTarget->ToAzeriteEmpoweredItem(); - owner->ModifyMoney(-azeriteEmpoweredItem->GetRespecCost()); - - // reapply all item mods - item level change affects stats and auras - if (azeriteEmpoweredItem->IsEquipped()) - owner->_ApplyItemMods(azeriteEmpoweredItem, azeriteEmpoweredItem->GetSlot(), false); - - azeriteEmpoweredItem->ClearSelectedAzeritePowers(); - - if (azeriteEmpoweredItem->IsEquipped()) - owner->_ApplyItemMods(azeriteEmpoweredItem, azeriteEmpoweredItem->GetSlot(), true); - - azeriteEmpoweredItem->SetState(ITEM_CHANGED, owner); - owner->SetNumRespecs(owner->GetNumRespecs() + 1); -} - -void Spell::EffectLearnAzeriteEssencePower() -{ - if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) - return; - - Player* playerTarget = unitTarget ? unitTarget->ToPlayer() : nullptr; - if (!playerTarget) - return; - - Item* heartOfAzeroth = playerTarget->GetItemByEntry(ITEM_ID_HEART_OF_AZEROTH, ItemSearchLocation::Everywhere); - if (!heartOfAzeroth) - return; - - AzeriteItem* azeriteItem = heartOfAzeroth->ToAzeriteItem(); - if (!azeriteItem) - return; - - // remove old rank and apply new one - if (azeriteItem->IsEquipped()) - { - if (UF::SelectedAzeriteEssences const* selectedEssences = azeriteItem->GetSelectedAzeriteEssences()) - { - for (int32 slot = 0; slot < MAX_AZERITE_ESSENCE_SLOT; ++slot) - { - if (selectedEssences->AzeriteEssenceID[slot] == uint32(effectInfo->MiscValue)) - { - bool major = AzeriteItemMilestoneType(sDB2Manager.GetAzeriteItemMilestonePower(slot)->Type) == AzeriteItemMilestoneType::MajorEssence; - playerTarget->ApplyAzeriteEssence(azeriteItem, effectInfo->MiscValue, MAX_AZERITE_ESSENCE_RANK, major, false); - playerTarget->ApplyAzeriteEssence(azeriteItem, effectInfo->MiscValue, effectInfo->MiscValueB, major, false); - break; - } - } - } - } - - azeriteItem->SetEssenceRank(effectInfo->MiscValue, effectInfo->MiscValueB); - azeriteItem->SetState(ITEM_CHANGED, playerTarget); -} - void Spell::EffectCreatePrivateConversation() { if (effectHandleMode != SPELL_EFFECT_HANDLE_LAUNCH_TARGET) diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index 74676b7db47..e8f973eebd9 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -4032,9 +4032,6 @@ Optional<SpellPowerCost> SpellInfo::CalcPowerCost(SpellPowerEntry const* power, } } - if (power->PowerType == POWER_MANA) - powerCost = float(powerCost) * (1.0f + unitCaster->m_unitData->ManaCostMultiplier); - // power cost cannot become negative if initially positive if (initiallyNegative != (powerCost < 0)) powerCost = 0; @@ -4116,7 +4113,7 @@ inline float CalcPPMCritMod(SpellProcsPerMinuteModEntry const* mod, Unit* caster float crit = player->m_activePlayerData->CritPercentage; float rangedCrit = player->m_activePlayerData->RangedCritPercentage; - float spellCrit = player->m_activePlayerData->SpellCritPercentage; + float spellCrit = player->m_activePlayerData->SpellCritPercentage[0]; switch (mod->Param) { diff --git a/src/server/game/Tools/PlayerDump.cpp b/src/server/game/Tools/PlayerDump.cpp index 2737ca0e6ab..8cfac55b236 100644 --- a/src/server/game/Tools/PlayerDump.cpp +++ b/src/server/game/Tools/PlayerDump.cpp @@ -136,10 +136,6 @@ DumpTable const DumpTables[] = { "character_gifts", DTT_ITEM_GIFT }, // must be after item_instance { "item_instance_artifact", DTT_ITEM_TABLE }, // must be after item_instance { "item_instance_artifact_powers", DTT_ITEM_TABLE }, // must be after item_instance - { "item_instance_azerite", DTT_ITEM_TABLE }, // must be after item_instance - { "item_instance_azerite_empowered", DTT_ITEM_TABLE }, // must be after item_instance - { "item_instance_azerite_milestone_power", DTT_ITEM_TABLE }, // must be after item_instance - { "item_instance_azerite_unlocked_essence", DTT_ITEM_TABLE }, // must be after item_instance { "item_instance_gems", DTT_ITEM_TABLE }, // must be after item_instance { "item_instance_modifiers", DTT_ITEM_TABLE }, // must be after item_instance { "item_instance_transmog", DTT_ITEM_TABLE }, // must be after item_instance diff --git a/src/server/game/Tools/PlayerDump.h b/src/server/game/Tools/PlayerDump.h index 7858acff731..e15751accc1 100644 --- a/src/server/game/Tools/PlayerDump.h +++ b/src/server/game/Tools/PlayerDump.h @@ -52,9 +52,7 @@ enum DumpTableType DTT_ITEM_GIFT, // <- item guids // character_gifts - DTT_ITEM_TABLE, // <- item guids // item_instance_artifact, item_instance_artifact_powers, item_instance_azerite - // item_instance_azerite_empowered, item_instance_azerite_milestone_power, - // item_instance_azerite_unlocked_essence, item_instance_gems, item_instance_modifiers, + DTT_ITEM_TABLE, // <- item guids // item_instance_artifact, item_instance_artifact_powers, item_instance_gems, item_instance_modifiers, // item_instance_transmog DTT_PET, // -> pet guids collection // character_pet diff --git a/src/server/scripts/Commands/cs_lookup.cpp b/src/server/scripts/Commands/cs_lookup.cpp index cfd9b4fd99a..354820cb2ec 100644 --- a/src/server/scripts/Commands/cs_lookup.cpp +++ b/src/server/scripts/Commands/cs_lookup.cpp @@ -684,8 +684,7 @@ public: if (handler->GetSession()) { int32 maxLevel = 0; - if (Optional<ContentTuningLevels> questLevels = sDB2Manager.GetContentTuningData(questTemplatePair.second.GetContentTuningId(), - handler->GetSession()->GetPlayer()->m_playerData->CtrOptions->ContentTuningConditionMask)) + if (Optional<ContentTuningLevels> questLevels = sDB2Manager.GetContentTuningData(questTemplatePair.second.GetContentTuningId(), 0)) maxLevel = questLevels->MaxLevel; int32 scalingFactionGroup = 0; @@ -744,8 +743,7 @@ public: if (handler->GetSession()) { int32 maxLevel = 0; - if (Optional<ContentTuningLevels> questLevels = sDB2Manager.GetContentTuningData(questTemplatePair.second.GetContentTuningId(), - handler->GetSession()->GetPlayer()->m_playerData->CtrOptions->ContentTuningConditionMask)) + if (Optional<ContentTuningLevels> questLevels = sDB2Manager.GetContentTuningData(questTemplatePair.second.GetContentTuningId(), 0)) maxLevel = questLevels->MaxLevel; int32 scalingFactionGroup = 0; @@ -814,8 +812,7 @@ public: if (handler->GetSession()) { int32 maxLevel = 0; - if (Optional<ContentTuningLevels> questLevels = sDB2Manager.GetContentTuningData(quest->GetContentTuningId(), - handler->GetSession()->GetPlayer()->m_playerData->CtrOptions->ContentTuningConditionMask)) + if (Optional<ContentTuningLevels> questLevels = sDB2Manager.GetContentTuningData(quest->GetContentTuningId(), 0)) maxLevel = questLevels->MaxLevel; int32 scalingFactionGroup = 0; diff --git a/src/server/scripts/Spells/spell_warlock.cpp b/src/server/scripts/Spells/spell_warlock.cpp index 2b131d686f2..a13eaa70265 100644 --- a/src/server/scripts/Spells/spell_warlock.cpp +++ b/src/server/scripts/Spells/spell_warlock.cpp @@ -158,9 +158,10 @@ class spell_warl_chaos_bolt : public SpellScript return GetCaster()->GetTypeId() == TYPEID_PLAYER; } + // @TODO: Fix for 4.4.0 void HandleDummy(SpellEffIndex /*effIndex*/) { - SetHitDamage(GetHitDamage() + CalculatePct(GetHitDamage(), GetCaster()->ToPlayer()->m_activePlayerData->SpellCritPercentage)); + SetHitDamage(GetHitDamage() + CalculatePct(GetHitDamage(), GetCaster()->ToPlayer()->m_activePlayerData->SpellCritPercentage[0])); } void CalcCritChance(Unit const* /*victim*/, float& critChance) |