aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Handlers/QuestHandler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/Handlers/QuestHandler.cpp')
-rw-r--r--src/server/game/Handlers/QuestHandler.cpp122
1 files changed, 77 insertions, 45 deletions
diff --git a/src/server/game/Handlers/QuestHandler.cpp b/src/server/game/Handlers/QuestHandler.cpp
index 9590356f3dd..b888816666a 100644
--- a/src/server/game/Handlers/QuestHandler.cpp
+++ b/src/server/game/Handlers/QuestHandler.cpp
@@ -260,68 +260,100 @@ void WorldSession::HandleQuestgiverChooseRewardOpcode(WorldPackets::Quest::Quest
if (!quest)
return;
- // TODO: currency choice items
- if (packet.Choice.LootItemType != LootItemType::Item)
- return;
-
if (packet.Choice.Item.ItemID)
{
- ItemTemplate const* rewardProto = sObjectMgr->GetItemTemplate(packet.Choice.Item.ItemID);
- if (!rewardProto)
- {
- TC_LOG_ERROR("entities.player.cheat", "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.Choice.Item.ItemID, packet.QuestID);
- return;
- }
-
- bool itemValid = false;
- for (uint32 i = 0; i < quest->GetRewChoiceItemsCount(); ++i)
- {
- if (quest->RewardChoiceItemId[i] && quest->RewardChoiceItemId[i] == packet.Choice.Item.ItemID)
- {
- itemValid = true;
- break;
- }
- }
-
- if (!itemValid && quest->GetQuestPackageID())
+ switch (packet.Choice.LootItemType)
{
- if (std::vector<QuestPackageItemEntry const*> const* questPackageItems = sDB2Manager.GetQuestPackageItems(quest->GetQuestPackageID()))
+ case LootItemType::Item:
{
- for (QuestPackageItemEntry const* questPackageItem : *questPackageItems)
+ ItemTemplate const* rewardProto = sObjectMgr->GetItemTemplate(packet.Choice.Item.ItemID);
+ if (!rewardProto)
{
- if (questPackageItem->ItemID != packet.Choice.Item.ItemID)
- continue;
+ TC_LOG_ERROR("entities.player.cheat", "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.Choice.Item.ItemID, packet.QuestID);
+ return;
+ }
- if (_player->CanSelectQuestPackageItem(questPackageItem))
+ bool itemValid = false;
+ for (uint32 i = 0; i < quest->GetRewChoiceItemsCount(); ++i)
+ {
+ if (quest->RewardChoiceItemId[i] && quest->RewardChoiceItemType[i] == LootItemType::Item && quest->RewardChoiceItemId[i] == packet.Choice.Item.ItemID)
{
itemValid = true;
break;
}
}
- }
- if (!itemValid)
- {
- if (std::vector<QuestPackageItemEntry const*> const* questPackageItems = sDB2Manager.GetQuestPackageItemsFallback(quest->GetQuestPackageID()))
+ if (!itemValid && quest->GetQuestPackageID())
{
- for (QuestPackageItemEntry const* questPackageItem : *questPackageItems)
+ if (std::vector<QuestPackageItemEntry const*> const* questPackageItems = sDB2Manager.GetQuestPackageItems(quest->GetQuestPackageID()))
{
- if (questPackageItem->ItemID != packet.Choice.Item.ItemID)
- continue;
+ for (QuestPackageItemEntry const* questPackageItem : *questPackageItems)
+ {
+ if (questPackageItem->ItemID != packet.Choice.Item.ItemID)
+ continue;
+
+ if (_player->CanSelectQuestPackageItem(questPackageItem))
+ {
+ itemValid = true;
+ break;
+ }
+ }
+ }
- itemValid = true;
- break;
+ if (!itemValid)
+ {
+ if (std::vector<QuestPackageItemEntry const*> const* questPackageItems = sDB2Manager.GetQuestPackageItemsFallback(quest->GetQuestPackageID()))
+ {
+ for (QuestPackageItemEntry const* questPackageItem : *questPackageItems)
+ {
+ if (questPackageItem->ItemID != packet.Choice.Item.ItemID)
+ continue;
+
+ itemValid = true;
+ break;
+ }
+ }
}
}
+
+ if (!itemValid)
+ {
+ TC_LOG_ERROR("entities.player.cheat", "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.Choice.Item.ItemID, packet.QuestID);
+ return;
+ }
+ break;
}
- }
+ case LootItemType::Currency:
+ {
+ if (!sCurrencyTypesStore.HasRecord(packet.Choice.Item.ItemID))
+ {
+ TC_LOG_ERROR("entities.player.cheat", "Error in CMSG_QUESTGIVER_CHOOSE_REWARD: player %s (%s) tried to get invalid reward currency (Currency ID: %u) for quest %u (possible packet-hacking detected)",
+ _player->GetName().c_str(), _player->GetGUID().ToString().c_str(), packet.Choice.Item.ItemID, packet.QuestID);
+ return;
+ }
- if (!itemValid)
- {
- TC_LOG_ERROR("entities.player.cheat", "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.Choice.Item.ItemID, packet.QuestID);
- return;
+ bool currencyValid = false;
+ for (uint32 i = 0; i < quest->GetRewChoiceItemsCount(); ++i)
+ {
+ if (quest->RewardChoiceItemId[i] && quest->RewardChoiceItemType[i] == LootItemType::Currency && quest->RewardChoiceItemId[i] == packet.Choice.Item.ItemID)
+ {
+ currencyValid = true;
+ break;
+ }
+ }
+
+ if (!currencyValid)
+ {
+ TC_LOG_ERROR("entities.player.cheat", "Error in CMSG_QUESTGIVER_CHOOSE_REWARD: player %s (%s) tried to get reward currency (Currency ID: %u) wich is not a reward for quest %u (possible packet-hacking detected)",
+ _player->GetName().c_str(), _player->GetGUID().ToString().c_str(), packet.Choice.Item.ItemID, packet.QuestID);
+ return;
+ }
+ break;
+ }
+ default:
+ break;
}
}
@@ -346,9 +378,9 @@ void WorldSession::HandleQuestgiverChooseRewardOpcode(WorldPackets::Quest::Quest
return;
}
- if (_player->CanRewardQuest(quest, packet.Choice.Item.ItemID, true))
+ if (_player->CanRewardQuest(quest, packet.Choice.LootItemType, packet.Choice.Item.ItemID, true))
{
- _player->RewardQuest(quest, packet.Choice.Item.ItemID, object);
+ _player->RewardQuest(quest, packet.Choice.LootItemType, packet.Choice.Item.ItemID, object);
switch (object->GetTypeId())
{