diff options
| author | Shauren <shauren.trinity@gmail.com> | 2024-08-02 13:25:41 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2024-08-02 13:25:41 +0200 |
| commit | e59eef5432c7b70679d33f4911c88d0f7d75fd39 (patch) | |
| tree | fe9bce9c82496589facec3719b3f2943d8295e76 /src/server/game/Entities/Player | |
| parent | 7fb9168d57f378075b0f6692ea7ad822c1d8e43d (diff) | |
Core/PacketIO: Updated to 11.0.0
Diffstat (limited to 'src/server/game/Entities/Player')
| -rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 71 | ||||
| -rw-r--r-- | src/server/game/Entities/Player/Player.h | 21 |
2 files changed, 62 insertions, 30 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 55ad4d6a98f..32343bbe64d 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -216,6 +216,7 @@ Player::Player(WorldSession* session) : Unit(true), m_sceneMgr(this) m_bCanDelayTeleport = false; m_bHasDelayedTeleport = false; m_teleport_options = TELE_TO_NONE; + m_newWorldCounter = 0; m_trade = nullptr; @@ -1488,6 +1489,8 @@ bool Player::TeleportTo(TeleportLocation const& teleportLocation, TeleportToOpti if (!GetSession()->PlayerLogout()) { + ++m_newWorldCounter; + WorldPackets::Movement::SuspendToken suspendToken; suspendToken.SequenceIndex = m_movementCounter; // not incrementing suspendToken.Reason = options & TELE_TO_SEAMLESS ? 2 : 1; @@ -6370,8 +6373,8 @@ void Player::CheckAreaExplore() uint32 offset = areaEntry->AreaBit / PLAYER_EXPLORED_ZONES_BITS; uint64 val = UI64LIT(1) << (areaEntry->AreaBit % PLAYER_EXPLORED_ZONES_BITS); - if (offset >= m_activePlayerData->DataFlags[PLAYER_DATA_FLAG_EXPLORED_ZONES_INDEX].size() - || !(m_activePlayerData->DataFlags[PLAYER_DATA_FLAG_EXPLORED_ZONES_INDEX][offset] & val)) + if (offset >= m_activePlayerData->BitVectors->Values[PLAYER_DATA_FLAG_EXPLORED_ZONES_INDEX].size() + || !(m_activePlayerData->BitVectors->Values[PLAYER_DATA_FLAG_EXPLORED_ZONES_INDEX][offset] & val)) { AddExploredZones(offset, val); @@ -6423,7 +6426,8 @@ void Player::AddExploredZones(uint32 pos, uint64 mask) { SetUpdateFieldFlagValue(m_values .ModifyValue(&Player::m_activePlayerData) - .ModifyValue(&UF::ActivePlayerData::DataFlags, PLAYER_DATA_FLAG_EXPLORED_ZONES_INDEX) + .ModifyValue(&UF::ActivePlayerData::BitVectors) + .ModifyValue(&UF::BitVectors::Values, PLAYER_DATA_FLAG_EXPLORED_ZONES_INDEX) .ModifyValue(pos), mask); } @@ -6431,7 +6435,8 @@ void Player::RemoveExploredZones(uint32 pos, uint64 mask) { RemoveUpdateFieldFlagValue(m_values .ModifyValue(&Player::m_activePlayerData) - .ModifyValue(&UF::ActivePlayerData::DataFlags, PLAYER_DATA_FLAG_EXPLORED_ZONES_INDEX) + .ModifyValue(&UF::ActivePlayerData::BitVectors) + .ModifyValue(&UF::BitVectors::Values, PLAYER_DATA_FLAG_EXPLORED_ZONES_INDEX) .ModifyValue(pos), mask); } @@ -6445,11 +6450,11 @@ bool Player::HasExploredZone(uint32 areaId) const return false; size_t playerIndexOffset = size_t(area->AreaBit) / PLAYER_EXPLORED_ZONES_BITS; - if (playerIndexOffset >= m_activePlayerData->DataFlags[PLAYER_DATA_FLAG_EXPLORED_ZONES_INDEX].size()) + if (playerIndexOffset >= m_activePlayerData->BitVectors->Values[PLAYER_DATA_FLAG_EXPLORED_ZONES_INDEX].size()) return false; uint64 mask = uint64(1) << (area->AreaBit % PLAYER_EXPLORED_ZONES_BITS); - return (m_activePlayerData->DataFlags[PLAYER_DATA_FLAG_EXPLORED_ZONES_INDEX][playerIndexOffset] & mask) != 0; + return (m_activePlayerData->BitVectors->Values[PLAYER_DATA_FLAG_EXPLORED_ZONES_INDEX][playerIndexOffset] & mask) != 0; } void Player::CheckOutdoorsAuraRequirements() @@ -13891,6 +13896,9 @@ void Player::SendNewItem(Item* item, uint32 quantity, bool pushed, bool created, packet.QuestLogItemID = item->GetTemplate()->QuestLogItemId; packet.Quantity = quantity; packet.QuantityInInventory = GetItemCount(item->GetEntry()); + if (QuestObjective const* questObjective = GetQuestObjectiveForItem(item->GetEntry(), false)) + packet.QuantityInQuestLog = GetQuestObjectiveData(*questObjective); + packet.BattlePetSpeciesID = item->GetModifier(ITEM_MODIFIER_BATTLE_PET_SPECIES_ID); packet.BattlePetBreedID = item->GetModifier(ITEM_MODIFIER_BATTLE_PET_BREED_DATA) & 0xFFFFFF; packet.BattlePetBreedQuality = (item->GetModifier(ITEM_MODIFIER_BATTLE_PET_BREED_DATA) >> 24) & 0xFF; @@ -14225,7 +14233,8 @@ void Player::OnGossipSelect(WorldObject* source, int32 gossipOptionId, uint32 me PlayerInteractionType::Renown, PlayerInteractionType::BlackMarketAuctioneer, PlayerInteractionType::PerksProgramVendor, PlayerInteractionType::ProfessionsCraftingOrder, PlayerInteractionType::Professions, PlayerInteractionType::ProfessionsCustomerOrder, PlayerInteractionType::TraitSystem, PlayerInteractionType::BarbersChoice, PlayerInteractionType::MajorFactionRenown, - PlayerInteractionType::PersonalTabardVendor + PlayerInteractionType::PersonalTabardVendor, PlayerInteractionType::ForgeMaster, PlayerInteractionType::CharacterBanker, + PlayerInteractionType::AccountBanker }; PlayerInteractionType interactionType = GossipOptionNpcToInteractionType[AsUnderlyingType(gossipOptionNpc)]; @@ -16167,20 +16176,28 @@ QuestGiverStatus Player::GetQuestDialogStatus(Object const* questgiver) const case QUEST_STATUS_COMPLETE: if (quest->IsImportant()) result |= quest->HasFlag(QUEST_FLAGS_HIDE_REWARD_POI) ? QuestGiverStatus::ImportantQuestRewardCompleteNoPOI : QuestGiverStatus::ImportantQuestRewardCompletePOI; + else if (quest->IsMeta()) + result |= quest->HasFlag(QUEST_FLAGS_HIDE_REWARD_POI) ? QuestGiverStatus::MetaQuestRewardCompleteNoPOI : QuestGiverStatus::MetaQuestRewardCompletePOI; else if (quest->GetQuestTag() == QuestTagType::CovenantCalling) result |= quest->HasFlag(QUEST_FLAGS_HIDE_REWARD_POI) ? QuestGiverStatus::CovenantCallingRewardCompleteNoPOI : QuestGiverStatus::CovenantCallingRewardCompletePOI; else if (quest->HasFlagEx(QUEST_FLAGS_EX_LEGENDARY)) result |= quest->HasFlag(QUEST_FLAGS_HIDE_REWARD_POI) ? QuestGiverStatus::LegendaryRewardCompleteNoPOI : QuestGiverStatus::LegendaryRewardCompletePOI; + else if (quest->IsDailyOrWeekly()) + result |= quest->HasFlag(QUEST_FLAGS_HIDE_REWARD_POI) ? QuestGiverStatus::RepeatableRewardCompleteNoPOI : QuestGiverStatus::RepeatableRewardCompletePOI; else result |= quest->HasFlag(QUEST_FLAGS_HIDE_REWARD_POI) ? QuestGiverStatus::RewardCompleteNoPOI : QuestGiverStatus::RewardCompletePOI; break; case QUEST_STATUS_INCOMPLETE: if (quest->IsImportant()) result |= QuestGiverStatus::ImportantReward; + else if (quest->IsMeta()) + result |= QuestGiverStatus::MetaReward; else if (quest->GetQuestTag() == QuestTagType::CovenantCalling) result |= QuestGiverStatus::CovenantCallingReward; else if (quest->HasFlagEx(QUEST_FLAGS_EX_LEGENDARY)) result |= QuestGiverStatus::LegendaryReward; + else if (quest->IsDailyOrWeekly()) + result |= QuestGiverStatus::RepeatableReward; else result |= QuestGiverStatus::Reward; break; @@ -16188,12 +16205,17 @@ QuestGiverStatus Player::GetQuestDialogStatus(Object const* questgiver) const break; } - if (quest->IsTurnIn() && CanTakeQuest(quest, false) && quest->IsRepeatable() && !quest->IsDailyOrWeekly() && !quest->IsMonthly()) + if (quest->IsTurnIn() && CanTakeQuest(quest, false)) { - if (GetLevel() > (GetQuestLevel(quest) + sWorld->getIntConfig(CONFIG_QUEST_LOW_LEVEL_HIDE_DIFF))) - result |= QuestGiverStatus::RepeatableTurnin; + if (quest->IsRepeatable()) + { + if (GetLevel() > (GetQuestLevel(quest) + sWorld->getIntConfig(CONFIG_QUEST_LOW_LEVEL_HIDE_DIFF))) + result |= QuestGiverStatus::RepeatableTurnin; + else + result |= QuestGiverStatus::TrivialRepeatableTurnin; + } else - result |= QuestGiverStatus::TrivialRepeatableTurnin; + result |= quest->HasFlag(QUEST_FLAGS_HIDE_REWARD_POI) ? QuestGiverStatus::RewardCompleteNoPOI : QuestGiverStatus::RewardCompletePOI; } } @@ -16215,12 +16237,14 @@ QuestGiverStatus Player::GetQuestDialogStatus(Object const* questgiver) const bool isTrivial = GetLevel() > (GetQuestLevel(quest) + sWorld->getIntConfig(CONFIG_QUEST_LOW_LEVEL_HIDE_DIFF)); if (quest->IsImportant()) result |= isTrivial ? QuestGiverStatus::TrivialImportantQuest : QuestGiverStatus::ImportantQuest; + else if (quest->IsMeta()) + result |= isTrivial ? QuestGiverStatus::TrivialMetaQuest : QuestGiverStatus::MetaQuest; else if (quest->GetQuestTag() == QuestTagType::CovenantCalling) result |= QuestGiverStatus::CovenantCallingQuest; else if (quest->HasFlagEx(QUEST_FLAGS_EX_LEGENDARY)) result |= isTrivial ? QuestGiverStatus::TrivialLegendaryQuest : QuestGiverStatus::LegendaryQuest; - else if (quest->IsDaily()) - result |= isTrivial ? QuestGiverStatus::TrivialDailyQuest : QuestGiverStatus::DailyQuest; + else if (quest->IsDailyOrWeekly()) + result |= isTrivial ? QuestGiverStatus::TrivialRepeatableQuest : QuestGiverStatus::RepeatableQuest; else result |= isTrivial ? QuestGiverStatus::Trivial : QuestGiverStatus::Quest; } @@ -20067,10 +20091,10 @@ void Player::SaveToDB(LoginDatabaseTransaction loginTransaction, CharacterDataba stmt->setUInt32(index++, GetLootSpecId()); ss.str(""); - for (size_t i = 0; i < m_activePlayerData->DataFlags[PLAYER_DATA_FLAG_EXPLORED_ZONES_INDEX].size(); ++i) + for (size_t i = 0; i < m_activePlayerData->BitVectors->Values[PLAYER_DATA_FLAG_EXPLORED_ZONES_INDEX].size(); ++i) { - ss << uint32(m_activePlayerData->DataFlags[PLAYER_DATA_FLAG_EXPLORED_ZONES_INDEX][i] & 0xFFFFFFFF) << ' '; - ss << uint32((m_activePlayerData->DataFlags[PLAYER_DATA_FLAG_EXPLORED_ZONES_INDEX][i] >> 32) & 0xFFFFFFFF) << ' '; + ss << uint32(m_activePlayerData->BitVectors->Values[PLAYER_DATA_FLAG_EXPLORED_ZONES_INDEX][i] & 0xFFFFFFFF) << ' '; + ss << uint32((m_activePlayerData->BitVectors->Values[PLAYER_DATA_FLAG_EXPLORED_ZONES_INDEX][i] >> 32) & 0xFFFFFFFF) << ' '; } stmt->setString(index++, ss.str()); @@ -20224,10 +20248,10 @@ void Player::SaveToDB(LoginDatabaseTransaction loginTransaction, CharacterDataba stmt->setUInt32(index++, GetLootSpecId()); ss.str(""); - for (size_t i = 0; i < m_activePlayerData->DataFlags[PLAYER_DATA_FLAG_EXPLORED_ZONES_INDEX].size(); ++i) + for (size_t i = 0; i < m_activePlayerData->BitVectors->Values[PLAYER_DATA_FLAG_EXPLORED_ZONES_INDEX].size(); ++i) { - ss << uint32(m_activePlayerData->DataFlags[PLAYER_DATA_FLAG_EXPLORED_ZONES_INDEX][i] & 0xFFFFFFFF) << ' '; - ss << uint32((m_activePlayerData->DataFlags[PLAYER_DATA_FLAG_EXPLORED_ZONES_INDEX][i] >> 32) & 0xFFFFFFFF) << ' '; + ss << uint32(m_activePlayerData->BitVectors->Values[PLAYER_DATA_FLAG_EXPLORED_ZONES_INDEX][i] & 0xFFFFFFFF) << ' '; + ss << uint32((m_activePlayerData->BitVectors->Values[PLAYER_DATA_FLAG_EXPLORED_ZONES_INDEX][i] >> 32) & 0xFFFFFFFF) << ' '; } stmt->setString(index++, ss.str()); @@ -25361,9 +25385,10 @@ void Player::UpdateVisibleObjectInteractions(bool allUnits, bool onlySpellClicks { UF::ObjectData::Base objMask; UF::UnitData::Base unitMask; - for (uint32 i = 0; i < creature->m_unitData->NpcFlags.size(); ++i) - if (creature->m_unitData->NpcFlags[i]) - unitMask.MarkChanged(&UF::UnitData::NpcFlags, i); + if (creature->m_unitData->NpcFlags) + unitMask.MarkChanged(&UF::UnitData::NpcFlags); + if (creature->m_unitData->NpcFlags2) + unitMask.MarkChanged(&UF::UnitData::NpcFlags2); if (objMask.GetChangesMask().IsAnySet() || unitMask.GetChangesMask().IsAnySet()) creature->BuildValuesUpdateForPlayerWithMask(&udata, objMask.GetChangesMask(), unitMask.GetChangesMask(), this); @@ -25384,7 +25409,7 @@ void Player::UpdateVisibleObjectInteractions(bool allUnits, bool onlySpellClicks { UF::ObjectData::Base objMask; UF::UnitData::Base unitMask; - unitMask.MarkChanged(&UF::UnitData::NpcFlags, 0); // NpcFlags[0] has UNIT_NPC_FLAG_SPELLCLICK + unitMask.MarkChanged(&UF::UnitData::NpcFlags); // NpcFlags has UNIT_NPC_FLAG_SPELLCLICK creature->BuildValuesUpdateForPlayerWithMask(&udata, objMask.GetChangesMask(), unitMask.GetChangesMask(), this); break; } diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index b3d3d9c7466..f83e54de2bc 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -146,7 +146,7 @@ enum PlayerSkillsConstants enum PlayerDataFlagConstants { - PLAYER_EXPLORED_ZONES_BITS = UF::size_of_value_type<decltype(UF::ActivePlayerData::DataFlags)::value_type>() * 8, + PLAYER_EXPLORED_ZONES_BITS = UF::size_of_value_type<decltype(UF::BitVectors::Values)::value_type>() * 8, PLAYER_DATA_FLAG_EXPLORED_ZONES_INDEX = 1, PLAYER_DATA_FLAG_CHARACTER_DATA_INDEX = 2, @@ -638,7 +638,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 = 232, PLAYER_SLOTS_COUNT = (PLAYER_SLOT_END - PLAYER_SLOT_START) }; @@ -761,6 +761,12 @@ enum EquipableSpellSlots EQUIPABLE_SPELL_WEAPON_SLOT4 = 226, }; +enum AccountBankBagSlots +{ + ACCOUNT_BANK_SLOT_BAG_START = 227, + ACCOUNT_BANK_SLOT_BAG_END = 232 +}; + struct ItemPosCount { ItemPosCount(uint16 _pos, uint32 _count) : pos(_pos), count(_count) { } @@ -811,11 +817,10 @@ enum NewWorldReason enum InstanceResetWarningType { - RAID_INSTANCE_WARNING_HOURS = 1, // WARNING! %s is scheduled to reset in %d hour(s). - RAID_INSTANCE_WARNING_MIN = 2, // WARNING! %s is scheduled to reset in %d minute(s)! - RAID_INSTANCE_WARNING_MIN_SOON = 3, // WARNING! %s is scheduled to reset in %d minute(s). Please exit the zone or you will be returned to your bind location! - RAID_INSTANCE_WELCOME = 4, // Welcome to %s. This raid instance is scheduled to reset in %s. - RAID_INSTANCE_EXPIRED = 5 + RAID_INSTANCE_WELCOME = 1, // Welcome to %s. Instance locks are scheduled to expire in %s. + RAID_INSTANCE_EXPIRED = 2, // Your instance lock for %s has expired. + RAID_INSTANCE_WELCOME_DAILY = 3, // Welcome to %s. The daily reset is scheduled to occur in %s and will reset this instance. + RAID_INSTANCE_WARNING_TIME = 4, // any GlobalStrings tag that has 1 formattable argument, like DELVES_INSTANCE_RESET_WARNING }; // PLAYER_FIELD_ARENA_TEAM_INFO_1_1 offsets @@ -2294,6 +2299,7 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player> TeleportLocation& GetTeleportDest() { return m_teleport_dest; } uint32 GetTeleportOptions() const { return m_teleport_options; } + int32 GetNewWorldCounter() const { return m_newWorldCounter; } bool IsBeingTeleported() const { return IsBeingTeleportedNear() || IsBeingTeleportedFar(); } bool IsBeingTeleportedNear() const { return mSemaphoreTeleport_Near; } bool IsBeingTeleportedFar() const { return mSemaphoreTeleport_Far; } @@ -3251,6 +3257,7 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player> // Current teleport data TeleportLocation m_teleport_dest; TeleportToOptions m_teleport_options; + int32 m_newWorldCounter; bool mSemaphoreTeleport_Near; bool mSemaphoreTeleport_Far; |
