aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xsrc/server/game/Entities/Player/Player.cpp18
-rwxr-xr-xsrc/server/game/Entities/Player/Player.h1
-rwxr-xr-xsrc/server/game/Server/Protocol/Handlers/QuestHandler.cpp33
3 files changed, 38 insertions, 14 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 6d0d8aee1bf..0a468c6ac06 100755
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -2648,6 +2648,24 @@ void Player::ResetAllPowers()
}
}
+bool Player::CanInteractWithQuestGiver(Object* questGiver)
+{
+ switch (questGiver->GetTypeId())
+ {
+ case TYPEID_UNIT:
+ return GetNPCIfCanInteractWith(questGiver->GetGUID(), UNIT_NPC_FLAG_QUESTGIVER) != NULL;
+ case TYPEID_GAMEOBJECT:
+ return GetGameObjectIfCanInteractWith(questGiver->GetGUID(), GAMEOBJECT_TYPE_QUESTGIVER) != NULL;
+ case TYPEID_PLAYER:
+ return isAlive() && questGiver->ToPlayer()->isAlive();
+ case TYPEID_ITEM:
+ return isAlive();
+ default:
+ break;
+ }
+ return false;
+}
+
Creature* Player::GetNPCIfCanInteractWith(uint64 guid, uint32 npcflagmask)
{
// unit checks
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index 299f3543cef..081948d7b9d 100755
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -1081,6 +1081,7 @@ class Player : public Unit, public GridObject<Player>
void SendTransferAborted(uint32 mapid, TransferAbortReason reason, uint8 arg = 0);
void SendInstanceResetWarning(uint32 mapid, Difficulty difficulty, uint32 time);
+ bool CanInteractWithQuestGiver(Object* questGiver);
Creature* GetNPCIfCanInteractWith(uint64 guid, uint32 npcflagmask);
GameObject* GetGameObjectIfCanInteractWith(uint64 guid, GameobjectTypes type) const;
diff --git a/src/server/game/Server/Protocol/Handlers/QuestHandler.cpp b/src/server/game/Server/Protocol/Handlers/QuestHandler.cpp
index 3c77cf72a93..324403d98b5 100755
--- a/src/server/game/Server/Protocol/Handlers/QuestHandler.cpp
+++ b/src/server/game/Server/Protocol/Handlers/QuestHandler.cpp
@@ -119,9 +119,6 @@ void WorldSession::HandleQuestgiverAcceptQuestOpcode(WorldPacket & recv_data)
uint32 unk1;
recv_data >> guid >> quest >> unk1;
- if (!GetPlayer()->isAlive())
- return;
-
sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_QUESTGIVER_ACCEPT_QUEST npc = %u, quest = %u, unk1 = %u", uint32(GUID_LOPART(guid)), quest, unk1);
Object* pObject = ObjectAccessor::GetObjectByTypeMask(*_player, guid, TYPEMASK_UNIT|TYPEMASK_GAMEOBJECT|TYPEMASK_ITEM|TYPEMASK_PLAYER);
@@ -135,6 +132,10 @@ void WorldSession::HandleQuestgiverAcceptQuestOpcode(WorldPacket & recv_data)
return;
}
+ // some kind of WPE protection
+ if (!_player->CanInteractWithQuestGiver(pObject))
+ return;
+
Quest const* qInfo = sObjectMgr->GetQuestTemplate(quest);
if (qInfo)
{
@@ -294,16 +295,14 @@ void WorldSession::HandleQuestgiverChooseRewardOpcode(WorldPacket & recv_data)
return;
}
- if (!GetPlayer()->isAlive())
- return;
-
sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_QUESTGIVER_CHOOSE_REWARD npc = %u, quest = %u, reward = %u", uint32(GUID_LOPART(guid)), quest, reward);
Object* pObject = ObjectAccessor::GetObjectByTypeMask(*_player, guid, TYPEMASK_UNIT|TYPEMASK_GAMEOBJECT);
- if (!pObject)
+ if (!pObject || !pObject->hasInvolvedQuest(quest))
return;
- if (!pObject->hasInvolvedQuest(quest))
+ // some kind of WPE protection
+ if (!_player->CanInteractWithQuestGiver(pObject))
return;
Quest const *pQuest = sObjectMgr->GetQuestTemplate(quest);
@@ -349,13 +348,14 @@ void WorldSession::HandleQuestgiverRequestRewardOpcode(WorldPacket & recv_data)
uint64 guid;
recv_data >> guid >> quest;
- if (!GetPlayer()->isAlive())
- return;
-
sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_QUESTGIVER_REQUEST_REWARD npc = %u, quest = %u", uint32(GUID_LOPART(guid)), quest);
Object* pObject = ObjectAccessor::GetObjectByTypeMask(*_player, guid, TYPEMASK_UNIT|TYPEMASK_GAMEOBJECT);
- if (!pObject||!pObject->hasInvolvedQuest(quest))
+ if (!pObject || !pObject->hasInvolvedQuest(quest))
+ return;
+
+ // some kind of WPE protection
+ if (!_player->CanInteractWithQuestGiver(pObject))
return;
if (_player->CanCompleteQuest(quest))
@@ -462,10 +462,15 @@ void WorldSession::HandleQuestgiverCompleteQuest(WorldPacket& recv_data)
uint64 guid;
recv_data >> guid >> quest;
- if (!_player->isAlive())
+ sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_QUESTGIVER_COMPLETE_QUEST npc = %u, quest = %u", uint32(GUID_LOPART(guid)), quest);
+
+ Object* pObject = ObjectAccessor::GetObjectByTypeMask(*_player, guid, TYPEMASK_UNIT|TYPEMASK_GAMEOBJECT);
+ if (!pObject || !pObject->hasInvolvedQuest(quest))
return;
- sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_QUESTGIVER_COMPLETE_QUEST npc = %u, quest = %u", uint32(GUID_LOPART(guid)), quest);
+ // some kind of WPE protection
+ if (!_player->CanInteractWithQuestGiver(pObject))
+ return;
Quest const *pQuest = sObjectMgr->GetQuestTemplate(quest);
if (pQuest)