aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Player/Player.cpp63
-rw-r--r--src/server/game/Entities/Player/Player.h2
-rw-r--r--src/server/game/Handlers/QuestHandler.cpp48
-rw-r--r--src/server/game/Phasing/PhasingHandler.cpp5
-rw-r--r--src/server/game/Phasing/PhasingHandler.h2
5 files changed, 64 insertions, 56 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index bf5e6a9a4fb..788e4ba63da 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -15051,15 +15051,70 @@ void Player::RewardQuest(Quest const* quest, LootItemType rewardType, uint32 rew
UpdatePvPState();
}
- SendQuestUpdate(quest_id);
-
SendQuestGiverStatusMultiple();
+ bool conditionChanged = SendQuestUpdate(quest_id, false);
+
//lets remove flag for delayed teleports
SetCanDelayTeleport(false);
+ bool canHaveNextQuest = !quest->HasFlag(QUEST_FLAGS_AUTOCOMPLETE) ? !questGiver->IsPlayer() : true;
+ if (canHaveNextQuest)
+ {
+ switch (questGiver->GetTypeId())
+ {
+ case TYPEID_UNIT:
+ case TYPEID_PLAYER:
+ {
+ //For AutoSubmition was added plr case there as it almost same exclute AI script cases.
+ // Send next quest
+ if (Quest const* nextQuest = GetNextQuest(questGiver->GetGUID(), quest))
+ {
+ // Only send the quest to the player if the conditions are met
+ if (CanTakeQuest(nextQuest, false))
+ {
+ if (nextQuest->IsAutoAccept() && CanAddQuest(nextQuest, true))
+ AddQuestAndCheckCompletion(nextQuest, questGiver);
+
+ PlayerTalkClass->SendQuestGiverQuestDetails(nextQuest, questGiver->GetGUID(), true, false);
+ }
+ }
+
+ PlayerTalkClass->ClearMenus();
+ if (Creature* creatureQGiver = questGiver->ToCreature())
+ creatureQGiver->AI()->OnQuestReward(this, quest, rewardType, rewardId);
+ break;
+ }
+ case TYPEID_GAMEOBJECT:
+ {
+ GameObject* questGiverGob = questGiver->ToGameObject();
+ // Send next quest
+ if (Quest const* nextQuest = GetNextQuest(questGiverGob->GetGUID(), quest))
+ {
+ // Only send the quest to the player if the conditions are met
+ if (CanTakeQuest(nextQuest, false))
+ {
+ if (nextQuest->IsAutoAccept() && CanAddQuest(nextQuest, true))
+ AddQuestAndCheckCompletion(nextQuest, questGiver);
+
+ PlayerTalkClass->SendQuestGiverQuestDetails(nextQuest, questGiverGob->GetGUID(), true, false);
+ }
+ }
+
+ PlayerTalkClass->ClearMenus();
+ questGiverGob->AI()->OnQuestReward(this, quest, rewardType, rewardId);
+ break;
+ }
+ default:
+ break;
+ }
+ }
+
sScriptMgr->OnQuestStatusChange(this, quest_id);
sScriptMgr->OnQuestStatusChange(this, quest, oldStatus, QUEST_STATUS_REWARDED);
+
+ if (conditionChanged)
+ UpdateObjectVisibility();
}
void Player::SetRewardedQuest(uint32 quest_id)
@@ -15750,7 +15805,7 @@ void Player::RemoveRewardedQuest(uint32 questId, bool update /*= true*/)
SendQuestUpdate(questId);
}
-void Player::SendQuestUpdate(uint32 questId)
+bool Player::SendQuestUpdate(uint32 questId, bool updateVisiblity /*= true*/)
{
SpellAreaForQuestMapBounds saBounds = sSpellMgr->GetSpellAreaForQuestMapBounds(questId);
@@ -15799,7 +15854,7 @@ void Player::SendQuestUpdate(uint32 questId)
}
UpdateVisibleGameobjectsOrSpellClicks();
- PhasingHandler::OnConditionChange(this);
+ return PhasingHandler::OnConditionChange(this, updateVisiblity);
}
QuestGiverStatus Player::GetQuestDialogStatus(Object* questgiver)
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index 3c795bcee63..85737fe83e6 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -1607,7 +1607,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
void SetQuestStatus(uint32 questId, QuestStatus status, bool update = true);
void RemoveActiveQuest(uint32 questId, bool update = true);
void RemoveRewardedQuest(uint32 questId, bool update = true);
- void SendQuestUpdate(uint32 questId);
+ bool SendQuestUpdate(uint32 questId, bool updateVisiblity = true);
QuestGiverStatus GetQuestDialogStatus(Object* questGiver);
void SetDailyQuestStatus(uint32 quest_id);
diff --git a/src/server/game/Handlers/QuestHandler.cpp b/src/server/game/Handlers/QuestHandler.cpp
index 94cbf2a48de..220eaba8985 100644
--- a/src/server/game/Handlers/QuestHandler.cpp
+++ b/src/server/game/Handlers/QuestHandler.cpp
@@ -386,54 +386,6 @@ void WorldSession::HandleQuestgiverChooseRewardOpcode(WorldPackets::Quest::Quest
bg->HandleQuestComplete(packet.QuestID, _player);
_player->RewardQuest(quest, packet.Choice.LootItemType, packet.Choice.Item.ItemID, object);
-
- switch (object->GetTypeId())
- {
- case TYPEID_UNIT:
- case TYPEID_PLAYER:
- {
- //For AutoSubmition was added plr case there as it almost same exclute AI script cases.
- // Send next quest
- if (Quest const* nextQuest = _player->GetNextQuest(packet.QuestGiverGUID, quest))
- {
- // Only send the quest to the player if the conditions are met
- if (_player->CanTakeQuest(nextQuest, false))
- {
- if (nextQuest->IsAutoAccept() && _player->CanAddQuest(nextQuest, true))
- _player->AddQuestAndCheckCompletion(nextQuest, object);
-
- _player->PlayerTalkClass->SendQuestGiverQuestDetails(nextQuest, packet.QuestGiverGUID, true, false);
- }
- }
-
- _player->PlayerTalkClass->ClearMenus();
- if (Creature* creatureQGiver = object->ToCreature())
- creatureQGiver->AI()->OnQuestReward(_player, quest, packet.Choice.LootItemType, packet.Choice.Item.ItemID);
- break;
- }
- case TYPEID_GAMEOBJECT:
- {
- GameObject* questGiver = object->ToGameObject();
- // Send next quest
- if (Quest const* nextQuest = _player->GetNextQuest(packet.QuestGiverGUID, quest))
- {
- // Only send the quest to the player if the conditions are met
- if (_player->CanTakeQuest(nextQuest, false))
- {
- if (nextQuest->IsAutoAccept() && _player->CanAddQuest(nextQuest, true))
- _player->AddQuestAndCheckCompletion(nextQuest, object);
-
- _player->PlayerTalkClass->SendQuestGiverQuestDetails(nextQuest, packet.QuestGiverGUID, true, false);
- }
- }
-
- _player->PlayerTalkClass->ClearMenus();
- questGiver->AI()->OnQuestReward(_player, quest, packet.Choice.LootItemType, packet.Choice.Item.ItemID);
- break;
- }
- default:
- break;
- }
}
}
else
diff --git a/src/server/game/Phasing/PhasingHandler.cpp b/src/server/game/Phasing/PhasingHandler.cpp
index 5521d7f0d57..b4eef7b5e90 100644
--- a/src/server/game/Phasing/PhasingHandler.cpp
+++ b/src/server/game/Phasing/PhasingHandler.cpp
@@ -366,7 +366,7 @@ void PhasingHandler::OnAreaChange(WorldObject* object)
UpdateVisibilityIfNeeded(object, true, changed);
}
-void PhasingHandler::OnConditionChange(WorldObject* object)
+bool PhasingHandler::OnConditionChange(WorldObject* object, bool updateVisibility /*= true*/)
{
PhaseShift& phaseShift = object->GetPhaseShift();
PhaseShift& suppressedPhaseShift = object->GetSuppressedPhaseShift();
@@ -478,7 +478,8 @@ void PhasingHandler::OnConditionChange(WorldObject* object)
unit->RemoveNotOwnSingleTargetAuras(true);
}
- UpdateVisibilityIfNeeded(object, true, changed);
+ UpdateVisibilityIfNeeded(object, updateVisibility, changed);
+ return changed;
}
void PhasingHandler::SendToPlayer(Player const* player, PhaseShift const& phaseShift)
diff --git a/src/server/game/Phasing/PhasingHandler.h b/src/server/game/Phasing/PhasingHandler.h
index 6da249558a7..5a751dcc725 100644
--- a/src/server/game/Phasing/PhasingHandler.h
+++ b/src/server/game/Phasing/PhasingHandler.h
@@ -52,7 +52,7 @@ public:
static void OnMapChange(WorldObject* object);
static void OnAreaChange(WorldObject* object);
- static void OnConditionChange(WorldObject* object);
+ static bool OnConditionChange(WorldObject* object, bool updateVisibility = true);
static void SendToPlayer(Player const* player, PhaseShift const& phaseShift);
static void SendToPlayer(Player const* player);