Core/Scripts: Add SpellSC and new hook OnCalcMaxDuration

This commit is contained in:
Kargatum
2018-06-23 09:33:09 +07:00
committed by Barbz
parent e5d58de641
commit 7a5ed0c5bb
3 changed files with 36 additions and 0 deletions
+15
View File
@@ -58,6 +58,7 @@ template class ScriptRegistry<AllCreatureScript>;
template class ScriptRegistry<AllMapScript>; template class ScriptRegistry<AllMapScript>;
template class ScriptRegistry<MovementHandlerScript>; template class ScriptRegistry<MovementHandlerScript>;
template class ScriptRegistry<BGScript>; template class ScriptRegistry<BGScript>;
template class ScriptRegistry<SpellSC>;
#include "ScriptMgrMacros.h" #include "ScriptMgrMacros.h"
@@ -209,6 +210,7 @@ void ScriptMgr::Unload()
SCR_CLEAR(GlobalScript); SCR_CLEAR(GlobalScript);
SCR_CLEAR(ModuleScript); SCR_CLEAR(ModuleScript);
SCR_CLEAR(BGScript); SCR_CLEAR(BGScript);
SCR_CLEAR(SpellSC);
#undef SCR_CLEAR #undef SCR_CLEAR
} }
@@ -279,6 +281,7 @@ void ScriptMgr::CheckIfScriptsInDatabaseExist()
!ScriptRegistry<PlayerScript>::GetScriptById(sid) && !ScriptRegistry<PlayerScript>::GetScriptById(sid) &&
!ScriptRegistry<GuildScript>::GetScriptById(sid) && !ScriptRegistry<GuildScript>::GetScriptById(sid) &&
!ScriptRegistry<BGScript>::GetScriptById(sid) && !ScriptRegistry<BGScript>::GetScriptById(sid) &&
!ScriptRegistry<SpellSC>::GetScriptById(sid) &&
!ScriptRegistry<GroupScript>::GetScriptById(sid)) !ScriptRegistry<GroupScript>::GetScriptById(sid))
sLog->outErrorDb("Script named '%s' is assigned in database, but has no code!", (*itr).c_str()); sLog->outErrorDb("Script named '%s' is assigned in database, but has no code!", (*itr).c_str());
} }
@@ -1984,6 +1987,12 @@ void ScriptMgr::OnBattlegroundAddPlayer(Battleground* bg, Player* player)
FOREACH_SCRIPT(BGScript)->OnBattlegroundAddPlayer(bg, player); FOREACH_SCRIPT(BGScript)->OnBattlegroundAddPlayer(bg, player);
} }
// SpellSC
void ScriptMgr::OnCalcMaxDuration(Aura const* aura, int32& maxDuration)
{
FOREACH_SCRIPT(SpellSC)->OnCalcMaxDuration(aura, maxDuration);
}
AllMapScript::AllMapScript(const char* name) AllMapScript::AllMapScript(const char* name)
: ScriptObject(name) : ScriptObject(name)
{ {
@@ -2165,6 +2174,12 @@ BGScript::BGScript(char const* name)
ScriptRegistry<BGScript>::AddScript(this); ScriptRegistry<BGScript>::AddScript(this);
} }
SpellSC::SpellSC(char const* name)
: ScriptObject(name)
{
ScriptRegistry<SpellSC>::AddScript(this);
}
ModuleScript::ModuleScript(const char* name) ModuleScript::ModuleScript(const char* name)
: ScriptObject(name) : ScriptObject(name)
{ {
+19
View File
@@ -1061,6 +1061,21 @@ public:
virtual void OnBattlegroundAddPlayer(Battleground* /*bg*/, Player* /*player*/) { } virtual void OnBattlegroundAddPlayer(Battleground* /*bg*/, Player* /*player*/) { }
}; };
class SpellSC : public ScriptObject
{
protected:
SpellSC(const char* name);
public:
bool IsDatabaseBound() const { return false; }
// Calculate max duration in applying aura
virtual void OnCalcMaxDuration(Aura const* /*aura*/, int32& /*maxDuration*/) { }
};
// this class can be used to be extended by Modules // this class can be used to be extended by Modules
// creating their own custom hooks inside module itself // creating their own custom hooks inside module itself
class ModuleScript : public ScriptObject class ModuleScript : public ScriptObject
@@ -1387,6 +1402,10 @@ class ScriptMgr
void OnBattlegroundUpdate(Battleground* bg, uint32 diff); void OnBattlegroundUpdate(Battleground* bg, uint32 diff);
void OnBattlegroundAddPlayer(Battleground* bg, Player* player); void OnBattlegroundAddPlayer(Battleground* bg, Player* player);
public: /* SpellSC */
void OnCalcMaxDuration(Aura const* aura, int32& maxDuration);
private: private:
uint32 _scriptCount; uint32 _scriptCount;
@@ -815,6 +815,8 @@ int32 Aura::CalcMaxDuration(Unit* caster) const
if (IsPassive() && !m_spellInfo->DurationEntry) if (IsPassive() && !m_spellInfo->DurationEntry)
maxDuration = -1; maxDuration = -1;
sScriptMgr->OnCalcMaxDuration(this, maxDuration);
// IsPermanent() checks max duration (which we are supposed to calculate here) // IsPermanent() checks max duration (which we are supposed to calculate here)
if (maxDuration != -1 && modOwner) if (maxDuration != -1 && modOwner)
modOwner->ApplySpellMod(GetId(), SPELLMOD_DURATION, maxDuration); modOwner->ApplySpellMod(GetId(), SPELLMOD_DURATION, maxDuration);