aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorleak <none@none>2010-12-18 15:29:11 +0100
committerleak <none@none>2010-12-18 15:29:11 +0100
commit04e4561134a6ce0e93c96ed97df77f6b45f8b44f (patch)
treeafc63c829af8f98b73181cfe3f138c96e811f360
parent57132e35b8c334b855c130187c970d42bb6e9ec5 (diff)
Prevent completing quests by packet manipulation
--HG-- branch : trunk
-rwxr-xr-xsrc/server/game/Server/Protocol/Handlers/QuestHandler.cpp20
1 files changed, 12 insertions, 8 deletions
diff --git a/src/server/game/Server/Protocol/Handlers/QuestHandler.cpp b/src/server/game/Server/Protocol/Handlers/QuestHandler.cpp
index d3bdebbdbeb..9ce3b4b3a25 100755
--- a/src/server/game/Server/Protocol/Handlers/QuestHandler.cpp
+++ b/src/server/game/Server/Protocol/Handlers/QuestHandler.cpp
@@ -127,10 +127,8 @@ void WorldSession::HandleQuestgiverAcceptQuestOpcode(WorldPacket & recv_data)
Object* pObject = ObjectAccessor::GetObjectByTypeMask(*_player, guid,TYPEMASK_UNIT|TYPEMASK_GAMEOBJECT|TYPEMASK_ITEM|TYPEMASK_PLAYER);
// no or incorrect quest giver
- if (!pObject
- || (pObject->GetTypeId() != TYPEID_PLAYER && !pObject->hasQuest(quest))
- || (pObject->GetTypeId() == TYPEID_PLAYER && !pObject->ToPlayer()->CanShareQuest(quest))
-)
+ if (!pObject || (pObject->GetTypeId() != TYPEID_PLAYER && !pObject->hasQuest(quest)) ||
+ (pObject->GetTypeId() == TYPEID_PLAYER && !pObject->ToPlayer()->CanShareQuest(quest)))
{
_player->PlayerTalkClass->CloseGossip();
_player->SetDivider(0);
@@ -462,7 +460,7 @@ void WorldSession::HandleQuestgiverCompleteQuest(WorldPacket& recv_data)
uint64 guid;
recv_data >> guid >> quest;
- if (!GetPlayer()->isAlive())
+ if (!_player->isAlive())
return;
sLog.outDebug("WORLD: Received CMSG_QUESTGIVER_COMPLETE_QUEST npc = %u, quest = %u",uint32(GUID_LOPART(guid)),quest);
@@ -470,11 +468,17 @@ void WorldSession::HandleQuestgiverCompleteQuest(WorldPacket& recv_data)
Quest const *pQuest = sObjectMgr.GetQuestTemplate(quest);
if (pQuest)
{
+ if (!_player->CanSeeStartQuest(pQuest) && _player->GetQuestStatus(quest)==QUEST_STATUS_NONE)
+ {
+ sLog.outError("Possible hacking attempt: Player %s [guid: %u] tried to complete quest [entry: %u] without being in possession of the quest!",
+ _player->GetName(), _player->GetGUIDLow(), quest);
+ return;
+ }
// TODO: need a virtual function
- if (GetPlayer()->InBattleground())
- if (Battleground* bg = GetPlayer()->GetBattleground())
+ if (_player->InBattleground())
+ if (Battleground* bg = _player->GetBattleground())
if (bg->GetTypeID() == BATTLEGROUND_AV)
- ((BattlegroundAV*)bg)->HandleQuestComplete(quest, GetPlayer());
+ ((BattlegroundAV*)bg)->HandleQuestComplete(quest, _player);
if (_player->GetQuestStatus(quest) != QUEST_STATUS_COMPLETE)
{