From a9174d5eb75b4e0f28542c44b797fcacddc7ab64 Mon Sep 17 00:00:00 2001 From: Seyden Date: Thu, 20 Jul 2017 00:15:02 +0200 Subject: Core/Scripts: Implement generic script loaders (and script registry macros) to greatly reduce code duplication (#19526) --- src/server/game/Scripting/ScriptMgr.h | 68 +++++++++++++++++++++++++++++++++-- 1 file changed, 66 insertions(+), 2 deletions(-) (limited to 'src/server/game/Scripting/ScriptMgr.h') diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h index 020df6d54ac..eea4d7cc39c 100644 --- a/src/server/game/Scripting/ScriptMgr.h +++ b/src/server/game/Scripting/ScriptMgr.h @@ -205,10 +205,10 @@ class TC_GAME_API SpellScriptLoader : public ScriptObject public: // Should return a fully valid SpellScript pointer. - virtual SpellScript* GetSpellScript() const { return NULL; } + virtual SpellScript* GetSpellScript() const { return nullptr; } // Should return a fully valid AuraScript pointer. - virtual AuraScript* GetAuraScript() const { return NULL; } + virtual AuraScript* GetAuraScript() const { return nullptr; } }; class TC_GAME_API ServerScript : public ScriptObject @@ -1175,6 +1175,70 @@ class TC_GAME_API ScriptMgr std::string _currentContext; }; +template +class GenericSpellScriptLoader : public SpellScriptLoader +{ + public: + GenericSpellScriptLoader(char const* name) : SpellScriptLoader(name) { } + SpellScript* GetSpellScript() const override { return new S(); } +}; +#define RegisterSpellScript(spell_script) new GenericSpellScriptLoader(#spell_script) + +template +class GenericAuraScriptLoader : public SpellScriptLoader +{ + public: + GenericAuraScriptLoader(char const* name) : SpellScriptLoader(name) { } + AuraScript* GetAuraScript() const override { return new A(); } +}; +#define RegisterAuraScript(aura_script) new GenericAuraScriptLoader(#aura_script) + +template +class GenericSpellAndAuraScriptLoader : public SpellScriptLoader +{ + public: + GenericSpellAndAuraScriptLoader(char const* name) : SpellScriptLoader(name) { } + SpellScript* GetSpellScript() const override { return new S(); } + AuraScript* GetAuraScript() const override { return new A(); } +}; +#define RegisterSpellAndAuraScriptPair(spell_script, aura_script) new GenericSpellAndAuraScriptLoader(#spell_script) + +template +class GenericCreatureScript : public CreatureScript +{ + public: + GenericCreatureScript(char const* name) : CreatureScript(name) { } + CreatureAI* GetAI(Creature* me) const override { return new AI(me); } +}; +#define RegisterCreatureAI(ai_name) new GenericCreatureScript(#ai_name) + +template +class FactoryCreatureScript : public CreatureScript +{ + public: + FactoryCreatureScript(char const* name) : CreatureScript(name) { } + CreatureAI* GetAI(Creature* me) const override { return AIFactory(me); } +}; +#define RegisterCreatureAIWithFactory(ai_name, factory_fn) new FactoryCreatureScript(#ai_name) + +template +class GenericGameObjectScript : public GameObjectScript +{ + public: + GenericGameObjectScript(char const* name) : GameObjectScript(name) { } + GameObjectAI* GetAI(GameObject* go) const override { return new AI(go); } +}; +#define RegisterGameObjectAI(ai_name) new GenericGameObjectScript(#ai_name) + +template +class GenericAreaTriggerEntityScript : public AreaTriggerEntityScript +{ + public: + GenericAreaTriggerEntityScript(char const* name) : AreaTriggerEntityScript(name) { } + AreaTriggerAI* GetAI(AreaTrigger* at) const override { return new AI(at); } +}; +#define RegisterAreaTriggerAI(ai_name) new GenericAreaTriggerEntityScript(#ai_name) + #define sScriptMgr ScriptMgr::instance() #endif -- cgit v1.2.3