aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Scripting
diff options
context:
space:
mode:
authorTraesh <Traesh@users.noreply.github.com>2017-12-04 17:35:37 +0100
committerShauren <shauren.trinity@gmail.com>2017-12-04 17:35:37 +0100
commit422ad436c70e3f2f0c67794b3b902d3b398689c0 (patch)
tree154f03ffce0eed410edc25b4349c3927b81ffc93 /src/server/game/Scripting
parenta6bdb75d0b275989f159841032de8512a3cde374 (diff)
Core/Scripts: Added new QuestScript hooks (#20950)
* OnQuestStatusChange and OnQuestObjectiveChange
Diffstat (limited to 'src/server/game/Scripting')
-rw-r--r--src/server/game/Scripting/ScriptMgr.cpp58
-rw-r--r--src/server/game/Scripting/ScriptMgr.h20
2 files changed, 78 insertions, 0 deletions
diff --git a/src/server/game/Scripting/ScriptMgr.cpp b/src/server/game/Scripting/ScriptMgr.cpp
index 2e7bd6b52da..883c4c2c68d 100644
--- a/src/server/game/Scripting/ScriptMgr.cpp
+++ b/src/server/game/Scripting/ScriptMgr.cpp
@@ -118,6 +118,10 @@ template<>
struct is_script_database_bound<SceneScript>
: std::true_type { };
+template<>
+struct is_script_database_bound<QuestScript>
+ : std::true_type { };
+
enum Spells
{
SPELL_HOTSWAP_VISUAL_SPELL_EFFECT = 40162 // 59084
@@ -748,6 +752,35 @@ private:
bool swapped;
};
+/// This hook is responsible for swapping QuestScript's
+template<typename Base>
+class ScriptRegistrySwapHooks<QuestScript, Base>
+ : public ScriptRegistrySwapHookBase
+{
+public:
+ ScriptRegistrySwapHooks() : swapped(false) { }
+
+ void BeforeReleaseContext(std::string const& context) final override
+ {
+ auto const bounds = static_cast<Base*>(this)->_ids_of_contexts.equal_range(context);
+ if (bounds.first != bounds.second)
+ swapped = true;
+ }
+
+ void BeforeSwapContext(bool /*initialize*/) override
+ {
+ swapped = false;
+ }
+
+ void BeforeUnload() final override
+ {
+ ASSERT(!swapped);
+ }
+
+private:
+ bool swapped;
+};
+
/// This hook is responsible for swapping SpellScriptLoader's
template<typename Base>
class ScriptRegistrySwapHooks<SpellScriptLoader, Base>
@@ -2460,6 +2493,24 @@ void ScriptMgr::OnSceneComplete(Player* player, uint32 sceneInstanceID, SceneTem
tmpscript->OnSceneComplete(player, sceneInstanceID, sceneTemplate);
}
+void ScriptMgr::OnQuestStatusChange(Player* player, Quest const* quest, QuestStatus oldStatus, QuestStatus newStatus)
+{
+ ASSERT(player);
+ ASSERT(quest);
+
+ GET_SCRIPT(QuestScript, quest->GetScriptId(), tmpscript);
+ tmpscript->OnQuestStatusChange(player, quest, oldStatus, newStatus);
+}
+
+void ScriptMgr::OnQuestObjectiveChange(Player* player, Quest const* quest, QuestObjective const& objective, int32 oldAmount, int32 newAmount)
+{
+ ASSERT(player);
+ ASSERT(quest);
+
+ GET_SCRIPT(QuestScript, quest->GetScriptId(), tmpscript);
+ tmpscript->OnQuestObjectiveChange(player, quest, objective, oldAmount, newAmount);
+}
+
SpellScriptLoader::SpellScriptLoader(const char* name)
: ScriptObject(name)
{
@@ -2639,6 +2690,12 @@ SceneScript::SceneScript(const char* name)
ScriptRegistry<SceneScript>::Instance()->AddScript(this);
}
+QuestScript::QuestScript(const char* name)
+ : ScriptObject(name)
+{
+ ScriptRegistry<QuestScript>::Instance()->AddScript(this);
+}
+
GuildScript::GuildScript(const char* name)
: ScriptObject(name)
{
@@ -2693,3 +2750,4 @@ template class TC_GAME_API ScriptRegistry<AccountScript>;
template class TC_GAME_API ScriptRegistry<AreaTriggerEntityScript>;
template class TC_GAME_API ScriptRegistry<ConversationScript>;
template class TC_GAME_API ScriptRegistry<SceneScript>;
+template class TC_GAME_API ScriptRegistry<QuestScript>;
diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h
index fb1e8668558..7d3b30baddb 100644
--- a/src/server/game/Scripting/ScriptMgr.h
+++ b/src/server/game/Scripting/ScriptMgr.h
@@ -72,6 +72,7 @@ struct CreatureData;
struct ItemTemplate;
struct MapEntry;
struct OutdoorPvPData;
+struct QuestObjective;
struct SceneTemplate;
enum BattlegroundTypeId : uint32;
@@ -891,6 +892,20 @@ class TC_GAME_API SceneScript : public ScriptObject
virtual void OnSceneComplete(Player* /*player*/, uint32 /*sceneInstanceID*/, SceneTemplate const* /*sceneTemplate*/) { }
};
+class TC_GAME_API QuestScript : public ScriptObject
+{
+ protected:
+
+ QuestScript(const char* name);
+
+ public:
+ // Called when a quest status change
+ virtual void OnQuestStatusChange(Player* /*player*/, Quest const* /*quest*/, QuestStatus /*oldStatus*/, QuestStatus /*newStatus*/) { }
+
+ // Called when a quest objective data change
+ virtual void OnQuestObjectiveChange(Player* /*player*/, Quest const* /*quest*/, QuestObjective const& /*objective*/, int32 /*oldAmount*/, int32 /*newAmount*/) { }
+};
+
// Manages registration, loading, and execution of scripts.
class TC_GAME_API ScriptMgr
{
@@ -1184,6 +1199,11 @@ class TC_GAME_API ScriptMgr
void OnSceneCancel(Player* player, uint32 sceneInstanceID, SceneTemplate const* sceneTemplate);
void OnSceneComplete(Player* player, uint32 sceneInstanceID, SceneTemplate const* sceneTemplate);
+ public: /* QuestScript */
+
+ void OnQuestStatusChange(Player* player, Quest const* quest, QuestStatus oldStatus, QuestStatus newStatus);
+ void OnQuestObjectiveChange(Player* player, Quest const* quest, QuestObjective const& objective, int32 oldAmount, int32 newAmount);
+
private:
uint32 _scriptCount;