diff options
Diffstat (limited to 'src/server/game/Handlers/QuestHandler.cpp')
-rw-r--r-- | src/server/game/Handlers/QuestHandler.cpp | 122 |
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()) { |