aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorariel- <ariel-@users.noreply.github.com>2017-04-24 16:33:51 -0300
committerariel- <ariel-@users.noreply.github.com>2017-04-24 16:34:50 -0300
commit157e9311c41a8d33f7a2e3d5381ffc09d4585c42 (patch)
tree7a28c7d3617a5dfb979d987f969d58a8018f066c /src
parent4c09b8a02f983e54bdd8049af130f7ca0bde218d (diff)
Core/Quests: implemented MSG_QUEST_PUSH_RESULT notifications
- Allow to share already completed (but not rewarded) quests, restriction was unblizzlike thanks Cannix for the heads up
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Player/Player.cpp10
-rw-r--r--src/server/game/Entities/Player/Player.h2
-rw-r--r--src/server/game/Handlers/QuestHandler.cpp31
-rw-r--r--src/server/game/Quests/QuestDef.h3
4 files changed, 26 insertions, 20 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index e73d83af94c..e359ec8af4f 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -15952,12 +15952,12 @@ bool Player::CanShareQuest(uint32 quest_id) const
QuestStatusMap::const_iterator itr = m_QuestStatus.find(quest_id);
if (itr != m_QuestStatus.end())
{
- if (itr->second.Status != QUEST_STATUS_INCOMPLETE)
- return false;
-
// in pool and not currently available (wintergrasp weekly, dalaran weekly) - can't share
if (sPoolMgr->IsPartOfAPool<Quest>(quest_id) && !sPoolMgr->IsSpawnedObject<Quest>(quest_id))
+ {
+ SendPushToPartyResponse(this, QUEST_PARTY_MSG_CANT_BE_SHARED_TODAY);
return false;
+ }
return true;
}
@@ -16821,14 +16821,14 @@ void Player::SendQuestConfirmAccept(const Quest* quest, Player* pReceiver) const
}
}
-void Player::SendPushToPartyResponse(Player* player, uint8 msg) const
+void Player::SendPushToPartyResponse(Player const* player, uint8 msg) const
{
if (player)
{
WorldPacket data(MSG_QUEST_PUSH_RESULT, 8 + 1);
data << uint64(player->GetGUID());
data << uint8(msg); // valid values: 0-8
- GetSession()->SendPacket(&data);
+ SendDirectMessage(&data);
TC_LOG_DEBUG("network", "WORLD: Sent MSG_QUEST_PUSH_RESULT");
}
}
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index c251681eb09..75ebfe4e60c 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -1420,7 +1420,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
void SendQuestTimerFailed(uint32 questId) const;
void SendCanTakeQuestResponse(QuestFailedReason msg) const;
void SendQuestConfirmAccept(Quest const* quest, Player* pReceiver) const;
- void SendPushToPartyResponse(Player* player, uint8 msg) const;
+ void SendPushToPartyResponse(Player const* player, uint8 msg) const;
void SendQuestUpdateAddItem(Quest const* quest, uint32 itemIdx, uint16 count) const;
void SendQuestUpdateAddCreatureOrGo(Quest const* quest, ObjectGuid guid, uint32 creatureOrGOIdx, uint16 oldCount, uint16 addCount);
void SendQuestUpdateAddPlayer(Quest const* quest, uint16 oldCount, uint16 addCount);
diff --git a/src/server/game/Handlers/QuestHandler.cpp b/src/server/game/Handlers/QuestHandler.cpp
index c549a49adf3..85254d068b7 100644
--- a/src/server/game/Handlers/QuestHandler.cpp
+++ b/src/server/game/Handlers/QuestHandler.cpp
@@ -555,7 +555,10 @@ void WorldSession::HandlePushQuestToParty(WorldPacket& recvPacket)
Group* group = sender->GetGroup();
if (!group)
+ {
+ sender->SendPushToPartyResponse(sender, QUEST_PARTY_MSG_NOT_IN_PARTY);
return;
+ }
for (GroupReference* itr = group->GetFirstMember(); itr != NULL; itr = itr->next())
{
@@ -576,6 +579,12 @@ void WorldSession::HandlePushQuestToParty(WorldPacket& recvPacket)
continue;
}
+ if (!receiver->SatisfyQuestDay(quest, false))
+ {
+ sender->SendPushToPartyResponse(receiver, QUEST_PARTY_MSG_NOT_ELIGIBLE_TODAY);
+ continue;
+ }
+
if (!receiver->CanTakeQuest(quest, false))
{
sender->SendPushToPartyResponse(receiver, QUEST_PARTY_MSG_CANT_TAKE_QUEST);
@@ -618,21 +627,17 @@ void WorldSession::HandleQuestPushResult(WorldPacket& recvPacket)
TC_LOG_DEBUG("network", "WORLD: Received MSG_QUEST_PUSH_RESULT");
- if (_player->GetDivider())
+ if (!_player->GetDivider())
+ return;
+
+ if (_player->GetDivider() == guid)
{
- if (_player->GetDivider() == guid)
- {
- Player* player = ObjectAccessor::FindPlayer(_player->GetDivider());
- if (player)
- {
- WorldPacket data(MSG_QUEST_PUSH_RESULT, 8 + 4 + 1);
- data << uint64(_player->GetGUID());
- data << uint8(msg); // valid values: 0-8
- player->SendDirectMessage(&data);
- }
- }
- _player->SetDivider(ObjectGuid::Empty);
+ Player* player = ObjectAccessor::FindPlayer(guid);
+ if (player)
+ player->SendPushToPartyResponse(_player, msg);
}
+
+ _player->SetDivider(ObjectGuid::Empty);
}
void WorldSession::HandleQuestgiverStatusMultipleQuery(WorldPacket& /*recvPacket*/)
diff --git a/src/server/game/Quests/QuestDef.h b/src/server/game/Quests/QuestDef.h
index c92b548f7b4..eb653ccf096 100644
--- a/src/server/game/Quests/QuestDef.h
+++ b/src/server/game/Quests/QuestDef.h
@@ -73,7 +73,8 @@ enum QuestShareMessages : uint8
QUEST_PARTY_MSG_FINISH_QUEST = 7,
QUEST_PARTY_MSG_CANT_BE_SHARED_TODAY = 8,
QUEST_PARTY_MSG_SHARING_TIMER_EXPIRED = 9,
- QUEST_PARTY_MSG_NOT_IN_PARTY = 10
+ QUEST_PARTY_MSG_NOT_IN_PARTY = 10,
+ QUEST_PARTY_MSG_NOT_ELIGIBLE_TODAY = 11
};
enum QuestTradeSkill