aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities/Player
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2024-08-02 13:25:41 +0200
committerShauren <shauren.trinity@gmail.com>2024-08-02 13:25:41 +0200
commite59eef5432c7b70679d33f4911c88d0f7d75fd39 (patch)
treefe9bce9c82496589facec3719b3f2943d8295e76 /src/server/game/Entities/Player
parent7fb9168d57f378075b0f6692ea7ad822c1d8e43d (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.cpp71
-rw-r--r--src/server/game/Entities/Player/Player.h21
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;