aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Handlers/QuestHandler.cpp
diff options
context:
space:
mode:
authorRat <gmstreetrat@gmail.com>2015-04-13 22:25:35 +0200
committerRat <gmstreetrat@gmail.com>2015-04-13 22:25:35 +0200
commite5675412735a33f05f9c3215fb0cc7327a800c6c (patch)
tree333c9accdaa65a5c5d600f5f7af4823894848f16 /src/server/game/Handlers/QuestHandler.cpp
parentf20c6530b8ef496259c8e6a6401b11c50efd5940 (diff)
Core/Quests: fixed quest rewarding
* ItemSpec.dbc still needs some research to handle all cases correctly
Diffstat (limited to 'src/server/game/Handlers/QuestHandler.cpp')
-rw-r--r--src/server/game/Handlers/QuestHandler.cpp35
1 files changed, 28 insertions, 7 deletions
diff --git a/src/server/game/Handlers/QuestHandler.cpp b/src/server/game/Handlers/QuestHandler.cpp
index ee3ccea9460..5e73fb71ae8 100644
--- a/src/server/game/Handlers/QuestHandler.cpp
+++ b/src/server/game/Handlers/QuestHandler.cpp
@@ -237,17 +237,38 @@ void WorldSession::HandleQuestQueryOpcode(WorldPackets::Quest::QueryQuestInfo& p
void WorldSession::HandleQuestgiverChooseRewardOpcode(WorldPackets::Quest::QuestGiverChooseReward& packet)
{
- if (packet.ItemChoiceID >= QUEST_REWARD_CHOICES_COUNT)
- {
- TC_LOG_ERROR("network", "Error in CMSG_QUESTGIVER_CHOOSE_REWARD: player %s (%s) tried to get invalid reward (%u) (possible packet-hacking detected)", _player->GetName().c_str(), _player->GetGUID().ToString().c_str(), packet.ItemChoiceID);
- return;
- }
-
TC_LOG_DEBUG("network", "WORLD: Received CMSG_QUESTGIVER_CHOOSE_REWARD npc = %s, quest = %u, reward = %u", packet.QuestGiverGUID.ToString().c_str(), packet.QuestID, packet.ItemChoiceID);
Quest const* quest = sObjectMgr->GetQuestTemplate(packet.QuestID);
if (!quest)
return;
+
+ // This is Real Item Entry, not slot id as pre 5.x
+ if (packet.ItemChoiceID)
+ {
+ ItemTemplate const* rewardProto = sObjectMgr->GetItemTemplate(packet.ItemChoiceID);
+ if (!rewardProto)
+ {
+ TC_LOG_ERROR("network", "Error in CMSG_QUESTGIVER_CHOOSE_REWARD: player %s (%s) tried to get invalid reward item (Item Entry: %u) for quest %u (possible packet-hacking detected)", _player->GetName().c_str(), _player->GetGUID().ToString().c_str(), packet.ItemChoiceID, packet.QuestID);
+ return;
+ }
+
+ bool itemValid = false;
+ for (uint32 i = 0; i < quest->GetRewChoiceItemsCount(); ++i)
+ {
+ if (quest->RewardChoiceItemId[i] && quest->RewardChoiceItemId[i] == packet.ItemChoiceID)
+ {
+ itemValid = true;
+ break;
+ }
+ }
+
+ if (!itemValid)
+ {
+ TC_LOG_ERROR("network", "Error in CMSG_QUESTGIVER_CHOOSE_REWARD: player %s (%s) tried to get reward item (Item Entry: %u) wich is not a reward for quest %u (possible packet-hacking detected)", _player->GetName().c_str(), _player->GetGUID().ToString().c_str(), packet.ItemChoiceID, packet.QuestID);
+ return;
+ }
+ }
Object* object = _player;
@@ -643,4 +664,4 @@ void WorldSession::HandleQuestgiverStatusMultipleQuery(WorldPackets::Quest::Ques
}
SendPacket(response.Write());
-} \ No newline at end of file
+}