Core/Player: Updated sending completed quests data to client

This commit is contained in:
Shauren
2015-03-14 19:47:07 +01:00
parent 291d23e5f5
commit 62f0847ebb
6 changed files with 28 additions and 138 deletions
+25 -72
View File
@@ -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
+3 -5
View File
@@ -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,