Core/Player: Updated sending completed quests data to client
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user