aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Entities/Player/Player.cpp97
-rw-r--r--src/server/game/Entities/Player/Player.h8
-rw-r--r--src/server/game/Server/Packets/QuestPackets.cpp23
-rw-r--r--src/server/game/Server/Packets/QuestPackets.h32
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp3
-rw-r--r--src/server/game/Server/Protocol/Opcodes.h3
6 files changed, 28 insertions, 138 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 565e6e66185..47b46f05752 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -96,7 +96,6 @@
#include "ItemPackets.h"
#include "QuestPackets.h"
#include "LootPackets.h"
-#include <boost/dynamic_bitset.hpp>
#define ZONE_UPDATE_INTERVAL (1*IN_MILLISECONDS)
@@ -869,7 +868,6 @@ Player::Player(WorldSession* session): Unit(true)
isDebugAreaTriggers = false;
- _completedQuestBits = new boost::dynamic_bitset<uint8>(QUESTS_COMPLETED_BITS_SIZE * 8);
m_WeeklyQuestChanged = false;
m_MonthlyQuestChanged = false;
m_SeasonalQuestChanged = false;
@@ -914,7 +912,6 @@ Player::~Player()
delete m_declinedname;
delete m_runes;
- delete _completedQuestBits;
delete m_achievementMgr;
delete m_reputationMgr;
@@ -14761,14 +14758,7 @@ void Player::RewardQuest(Quest const* quest, uint32 reward, Object* questGiver,
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST, quest->GetQuestId());
if (uint32 questBit = GetQuestUniqueBitFlag(quest_id))
- {
- _completedQuestBits->set(questBit - 1);
-
- WorldPackets::Quest::SetQuestCompletedBit setCompletedBit;
- setCompletedBit.QuestID = quest_id;
- setCompletedBit.Bit = questBit;
- SendDirectMessage(setCompletedBit.Write());
- }
+ SetQuestCompletedBit(questBit, true);
if (quest->HasFlag(QUEST_FLAGS_FLAGS_PVP))
{
@@ -15400,14 +15390,7 @@ void Player::RemoveRewardedQuest(uint32 questId, bool update /*= true*/)
}
if (uint32 questBit = GetQuestUniqueBitFlag(questId))
- {
- _completedQuestBits->reset(questBit - 1);
-
- WorldPackets::Quest::ClearQuestCompletedBit clearCompletedBit;
- clearCompletedBit.QuestID = questId;
- clearCompletedBit.Bit = questBit;
- SendDirectMessage(clearCompletedBit.Write());
- }
+ SetQuestCompletedBit(questBit, false);
if (update)
SendQuestUpdate(questId);
@@ -15649,6 +15632,18 @@ void Player::SwapQuestSlot(uint16 slot1, uint16 slot2)
}
}
+void Player::SetQuestCompletedBit(uint32 questBit, bool completed)
+{
+ if (!questBit)
+ return;
+
+ uint32 fieldOffset = (questBit - 1) >> 5;
+ if (fieldOffset >= QUESTS_COMPLETED_BITS_SIZE)
+ return;
+
+ ApplyModFlag(PLAYER_FIELD_QUEST_COMPLETED + ((questBit - 1) >> 5), 1 << ((questBit - 1) & 31), completed);
+}
+
void Player::AreaExploredOrEventHappens(uint32 questId)
{
if (questId)
@@ -18057,7 +18052,7 @@ void Player::_LoadQuestStatusRewarded(PreparedQueryResult result)
// instead add them separately from load daily/weekly/monthly/seasonal
if (!quest->IsDailyOrWeekly() && !quest->IsMonthly() && !quest->IsSeasonal())
if (uint32 questBit = GetQuestUniqueBitFlag(quest_id))
- _completedQuestBits->set(questBit - 1);
+ SetQuestCompletedBit(questBit, true);
}
m_RewardedQuests.insert(quest_id);
@@ -18097,7 +18092,7 @@ void Player::_LoadDailyQuestStatus(PreparedQueryResult result)
AddDynamicValue(PLAYER_DYNAMIC_FIELD_DAILY_QUESTS, quest_id);
if (uint32 questBit = GetQuestUniqueBitFlag(quest_id))
- _completedQuestBits->set(questBit - 1);
+ SetQuestCompletedBit(questBit, true);
TC_LOG_DEBUG("entities.player.loading", "Daily quest (%u) cooldown for player (%s)", quest_id, GetGUID().ToString().c_str());
}
@@ -18123,7 +18118,7 @@ void Player::_LoadWeeklyQuestStatus(PreparedQueryResult result)
m_weeklyquests.insert(quest_id);
if (uint32 questBit = GetQuestUniqueBitFlag(quest_id))
- _completedQuestBits->set(questBit - 1);
+ SetQuestCompletedBit(questBit, true);
TC_LOG_DEBUG("entities.player.loading", "Weekly quest {%u} cooldown for player (%s)", quest_id, GetGUID().ToString().c_str());
}
@@ -18150,7 +18145,7 @@ void Player::_LoadSeasonalQuestStatus(PreparedQueryResult result)
m_seasonalquests[event_id].insert(quest_id);
if (uint32 questBit = GetQuestUniqueBitFlag(quest_id))
- _completedQuestBits->set(questBit - 1);
+ SetQuestCompletedBit(questBit, true);
TC_LOG_DEBUG("entities.player.loading", "Seasonal quest {%u} cooldown for player (%s)", quest_id, GetGUID().ToString().c_str());
}
@@ -18176,7 +18171,7 @@ void Player::_LoadMonthlyQuestStatus(PreparedQueryResult result)
m_monthlyquests.insert(quest_id);
if (uint32 questBit = GetQuestUniqueBitFlag(quest_id))
- _completedQuestBits->set(questBit - 1);
+ SetQuestCompletedBit(questBit, true);
TC_LOG_DEBUG("entities.player.loading", "Monthly quest {%u} cooldown for player (%s)", quest_id, GetGUID().ToString().c_str());
}
@@ -22476,8 +22471,6 @@ void Player::SendInitialPacketsBeforeAddToMap()
WorldPackets::Character::InitialSetup initialSetup;
initialSetup.ServerExpansionLevel = sWorld->getIntConfig(CONFIG_EXPANSION);
- // To-Do: Move this to PLAYER_FIELD_QUEST_COMPLETED
- //boost::to_block_range(*_completedQuestBits, std::back_inserter(initialSetup.QuestsCompleted));
SendDirectMessage(initialSetup.Write());
SetMover(this);
@@ -22977,22 +22970,9 @@ void Player::SetMonthlyQuestStatus(uint32 quest_id)
void Player::ResetDailyQuestStatus()
{
- std::vector<uint32> dailies = GetDynamicValues(PLAYER_DYNAMIC_FIELD_DAILY_QUESTS);
- if (!dailies.empty())
- {
- WorldPackets::Quest::ClearQuestCompletedBits clearCompletedBits;
- for (uint32 questId : dailies)
- {
- if (uint32 questBit = GetQuestUniqueBitFlag(questId))
- {
- clearCompletedBits.Qbits.push_back(questBit);
- _completedQuestBits->reset(questBit - 1);
- }
- }
-
- if (!clearCompletedBits.Qbits.empty())
- SendDirectMessage(clearCompletedBits.Write());
- }
+ for (uint32 questId : GetDynamicValues(PLAYER_DYNAMIC_FIELD_DAILY_QUESTS))
+ if (uint32 questBit = GetQuestUniqueBitFlag(questId))
+ SetQuestCompletedBit(questBit, false);
ClearDynamicValue(PLAYER_DYNAMIC_FIELD_DAILY_QUESTS);
@@ -23008,18 +22988,9 @@ void Player::ResetWeeklyQuestStatus()
if (m_weeklyquests.empty())
return;
- WorldPackets::Quest::ClearQuestCompletedBits clearCompletedBits;
for (uint32 questId : m_weeklyquests)
- {
if (uint32 questBit = GetQuestUniqueBitFlag(questId))
- {
- clearCompletedBits.Qbits.push_back(questBit);
- _completedQuestBits->reset(questBit - 1);
- }
- }
-
- if (!clearCompletedBits.Qbits.empty())
- SendDirectMessage(clearCompletedBits.Write());
+ SetQuestCompletedBit(questBit, false);
m_weeklyquests.clear();
// DB data deleted in caller
@@ -23035,18 +23006,9 @@ void Player::ResetSeasonalQuestStatus(uint16 event_id)
if (eventItr->second.empty())
return;
- WorldPackets::Quest::ClearQuestCompletedBits clearCompletedBits;
for (uint32 questId : eventItr->second)
- {
if (uint32 questBit = GetQuestUniqueBitFlag(questId))
- {
- clearCompletedBits.Qbits.push_back(questBit);
- _completedQuestBits->reset(questBit - 1);
- }
- }
-
- if (!clearCompletedBits.Qbits.empty())
- SendDirectMessage(clearCompletedBits.Write());
+ SetQuestCompletedBit(questBit, false);
m_seasonalquests.erase(eventItr);
// DB data deleted in caller
@@ -23058,18 +23020,9 @@ void Player::ResetMonthlyQuestStatus()
if (m_monthlyquests.empty())
return;
- WorldPackets::Quest::ClearQuestCompletedBits clearCompletedBits;
for (uint32 questId : m_monthlyquests)
- {
if (uint32 questBit = GetQuestUniqueBitFlag(questId))
- {
- clearCompletedBits.Qbits.push_back(questBit);
- _completedQuestBits->reset(questBit - 1);
- }
- }
-
- if (!clearCompletedBits.Qbits.empty())
- SendDirectMessage(clearCompletedBits.Write());
+ SetQuestCompletedBit(questBit, false);
m_monthlyquests.clear();
// DB data deleted in caller
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index 79ee97e16c9..d0cf22ca24b 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -35,7 +35,6 @@
#include <limits>
#include <string>
#include <vector>
-#include <boost/dynamic_bitset_fwd.hpp>
struct CreatureTemplate;
struct Mail;
@@ -664,8 +663,8 @@ enum QuestSaveType
// quest
typedef std::map<uint32, QuestSaveType> QuestStatusSaveMap;
-// Size (in bytes) of client completed quests bit map
-#define QUESTS_COMPLETED_BITS_SIZE 2500
+// Size of client completed quests bit map
+#define QUESTS_COMPLETED_BITS_SIZE 625
enum QuestSlotOffsets
{
@@ -1691,6 +1690,7 @@ class Player : public Unit, public GridObject<Player>
void RemoveQuestSlotState(uint16 slot, uint32 state);
void SetQuestSlotTimer(uint16 slot, uint32 timer);
void SwapQuestSlot(uint16 slot1, uint16 slot2);
+ void SetQuestCompletedBit(uint32 questBit, bool completed);
uint16 GetReqKillOrCastCurrentCount(uint32 quest_id, int32 entry);
void AreaExploredOrEventHappens(uint32 questId);
@@ -2801,8 +2801,6 @@ class Player : public Unit, public GridObject<Player>
RewardedQuestSet m_RewardedQuests;
QuestStatusSaveMap m_RewardedQuestsSave;
- boost::dynamic_bitset<uint8>* _completedQuestBits;
-
SkillStatusMap mSkillStatus;
ObjectGuid::LowType m_GuildIdInvited;
diff --git a/src/server/game/Server/Packets/QuestPackets.cpp b/src/server/game/Server/Packets/QuestPackets.cpp
index db30e8d2ec0..471d4846f16 100644
--- a/src/server/game/Server/Packets/QuestPackets.cpp
+++ b/src/server/game/Server/Packets/QuestPackets.cpp
@@ -426,26 +426,3 @@ void WorldPackets::Quest::QuestGiverQueryQuest::Read()
_worldPacket >> QuestID;
RespondToGiver = _worldPacket.ReadBit();
}
-
-WorldPacket const* WorldPackets::Quest::SetQuestCompletedBit::Write()
-{
- _worldPacket << int32(Bit);
- _worldPacket << int32(QuestID);
- return &_worldPacket;
-}
-
-WorldPacket const* WorldPackets::Quest::ClearQuestCompletedBit::Write()
-{
- _worldPacket << int32(Bit);
- _worldPacket << int32(QuestID);
- return &_worldPacket;
-}
-
-WorldPacket const* WorldPackets::Quest::ClearQuestCompletedBits::Write()
-{
- _worldPacket << uint32(Qbits.size());
- if (!Qbits.empty())
- _worldPacket.append(Qbits.data(), Qbits.size());
-
- return &_worldPacket;
-}
diff --git a/src/server/game/Server/Packets/QuestPackets.h b/src/server/game/Server/Packets/QuestPackets.h
index 3796649f2c9..9dea2ba1cff 100644
--- a/src/server/game/Server/Packets/QuestPackets.h
+++ b/src/server/game/Server/Packets/QuestPackets.h
@@ -405,38 +405,6 @@ namespace WorldPackets
int32 QuestID = 0;
bool RespondToGiver = false;
};
-
- class SetQuestCompletedBit final : public ServerPacket
- {
- public:
- SetQuestCompletedBit() : ServerPacket(SMSG_SET_QUEST_COMPLETED_BIT, 4 + 4) { }
-
- WorldPacket const* Write() override;
-
- int32 Bit = 0;
- int32 QuestID = 0;
- };
-
- class ClearQuestCompletedBit final : public ServerPacket
- {
- public:
- ClearQuestCompletedBit() : ServerPacket(SMSG_CLEAR_QUEST_COMPLETED_BIT, 4 + 4) { }
-
- WorldPacket const* Write() override;
-
- int32 Bit = 0;
- int32 QuestID = 0;
- };
-
- class ClearQuestCompletedBits final : public ServerPacket
- {
- public:
- ClearQuestCompletedBits() : ServerPacket(SMSG_CLEAR_QUEST_COMPLETED_BITS, 4) { }
-
- WorldPacket const* Write() override;
-
- std::vector<int32> Qbits;
- };
}
}
diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp
index 939ce698a80..0211732d312 100644
--- a/src/server/game/Server/Protocol/Opcodes.cpp
+++ b/src/server/game/Server/Protocol/Opcodes.cpp
@@ -1097,8 +1097,6 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_COOLDOWNS, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_FAR_SIGHT_IMMEDIATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_LOSS_OF_CONTROL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_QUEST_COMPLETED_BIT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_QUEST_COMPLETED_BITS, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_SPELL_CHARGES, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_TARGET, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLIENTCACHE_VERSION, STATUS_NEVER, CONNECTION_TYPE_REALM);
@@ -1750,7 +1748,6 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_PLAY_HOVER_ANIM, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_PROFICIENCY, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_PROJECTILE_POSITION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_QUEST_COMPLETED_BIT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_RAID_DIFFICULTY, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_SPELL_CHARGES, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_TASK_COMPLETE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h
index 70c377e29f9..5c406e8b1fe 100644
--- a/src/server/game/Server/Protocol/Opcodes.h
+++ b/src/server/game/Server/Protocol/Opcodes.h
@@ -1010,8 +1010,6 @@ enum OpcodeServer : uint32
SMSG_CLEAR_COOLDOWNS = 0xBADD,
SMSG_CLEAR_FAR_SIGHT_IMMEDIATE = 0xBADD,
SMSG_CLEAR_LOSS_OF_CONTROL = 0xBADD,
- SMSG_CLEAR_QUEST_COMPLETED_BIT = 0xBADD,
- SMSG_CLEAR_QUEST_COMPLETED_BITS = 0xBADD,
SMSG_CLEAR_SPELL_CHARGES = 0xBADD,
SMSG_CLEAR_TARGET = 0x17FA,
SMSG_CLIENTCACHE_VERSION = 0x116C,
@@ -1701,7 +1699,6 @@ enum OpcodeServer : uint32
SMSG_SET_PROFICIENCY = 0x092A,
SMSG_SET_PROJECTILE_POSITION = 0xBADD,
SMSG_SET_PROMOTION_RESPONSE = 0xBADD,
- SMSG_SET_QUEST_COMPLETED_BIT = 0xBADD,
SMSG_SET_RAID_DIFFICULTY = 0x1319,
SMSG_SET_SERVER_WOW_TIME = 0xBADD,
SMSG_SET_SPELL_CHARGES = 0xBADD,