aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Spells/SpellScript.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/Spells/SpellScript.cpp')
-rw-r--r--src/server/game/Spells/SpellScript.cpp215
1 files changed, 215 insertions, 0 deletions
diff --git a/src/server/game/Spells/SpellScript.cpp b/src/server/game/Spells/SpellScript.cpp
new file mode 100644
index 00000000000..fb2944fa651
--- /dev/null
+++ b/src/server/game/Spells/SpellScript.cpp
@@ -0,0 +1,215 @@
+/*
+ * Copyright (C) 2008-2010 Trinity <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include "SpellScript.h"
+#include "Spell.h"
+
+bool _SpellScript::_Validate(SpellEntry const * entry, const char * scriptname)
+{
+ if (!Validate(entry))
+ {
+ sLog.outError("TSCR: Spell `%u` did not pass Validate() function of script `%s` - script will be not added to the spell", entry->Id, scriptname);
+ return false;
+ }
+ return true;
+}
+
+_SpellScript::EffectHook::EffectHook(uint8 _effIndex)
+{
+ // effect index must be in range <0;2>, allow use of special effindexes
+ ASSERT(_effIndex == EFFECT_ALL || _effIndex == EFFECT_FIRST_FOUND || _effIndex < MAX_SPELL_EFFECTS);
+ effIndex = _effIndex;
+}
+
+uint8 _SpellScript::EffectHook::GetAffectedEffectsMask(SpellEntry const * spellEntry)
+{
+ uint8 mask = 0;
+ if ((effIndex == EFFECT_ALL) || (effIndex == EFFECT_FIRST_FOUND))
+ {
+ for(uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
+ {
+ if ((effIndex == EFFECT_FIRST_FOUND) && mask)
+ return mask;
+ if (CheckEffect(spellEntry, effIndex))
+ mask |= (uint8)1<<effIndex;
+ }
+ }
+ else
+ {
+ if (CheckEffect(spellEntry, effIndex))
+ mask |= (uint8)1<<effIndex;
+ }
+ return mask;
+}
+
+bool _SpellScript::EffectHook::IsEffectAffected(SpellEntry const * spellEntry, uint8 effIndex)
+{
+ return GetAffectedEffectsMask(spellEntry) & 1<<effIndex;
+}
+
+std::string _SpellScript::EffectHook::EffIndexToString()
+{
+ switch(effIndex)
+ {
+ case EFFECT_ALL:
+ return "EFFECT_ALL";
+ case EFFECT_FIRST_FOUND:
+ return "EFFECT_FIRST_FOUND";
+ case EFFECT_0:
+ return "EFFECT_0";
+ case EFFECT_1:
+ return "EFFECT_1";
+ case EFFECT_2:
+ return "EFFECT_2";
+ }
+ return "Invalid Value";
+}
+
+bool _SpellScript::EffectNameCheck::Check(SpellEntry const * spellEntry, uint8 effIndex)
+{
+ if (!spellEntry->Effect[effIndex] && !effName)
+ return true;
+ if (!spellEntry->Effect[effIndex])
+ return false;
+ return (effName == SPELL_EFFECT_ANY) || (spellEntry->Effect[effIndex] == effName);
+}
+
+std::string _SpellScript::EffectNameCheck::ToString()
+{
+ switch(effName)
+ {
+ case SPELL_EFFECT_ANY:
+ return "SPELL_EFFECT_ANY";
+ default:
+ char num[10];
+ sprintf (num,"%u",effName);
+ return num;
+ }
+}
+
+bool _SpellScript::EffectAuraNameCheck::Check(SpellEntry const * spellEntry, uint8 effIndex)
+{
+ if (!spellEntry->EffectApplyAuraName[effIndex] && !effAurName)
+ return true;
+ if (!spellEntry->EffectApplyAuraName[effIndex])
+ return false;
+ return (effAurName == SPELL_EFFECT_ANY) || (spellEntry->EffectApplyAuraName[effIndex] == effAurName);
+}
+
+std::string _SpellScript::EffectAuraNameCheck::ToString()
+{
+ switch(effAurName)
+ {
+ case SPELL_AURA_ANY:
+ return "SPELL_AURA_ANY";
+ default:
+ char num[10];
+ sprintf (num,"%u",effAurName);
+ return num;
+ }
+}
+
+SpellScript::EffectHandler::EffectHandler(EffectHandlerFnType _pEffectHandlerScript,uint8 _effIndex, uint16 _effName)
+ : _SpellScript::EffectNameCheck(_effName), _SpellScript::EffectHook(_effIndex)
+{
+ pEffectHandlerScript = _pEffectHandlerScript;
+}
+
+std::string SpellScript::EffectHandler::ToString()
+{
+ return "Index: " + EffIndexToString() + " Name: " +_SpellScript::EffectNameCheck::ToString();
+}
+
+bool SpellScript::EffectHandler::CheckEffect(SpellEntry const * spellEntry, uint8 effIndex)
+{
+ return _SpellScript::EffectNameCheck::Check(spellEntry, effIndex);
+}
+
+void SpellScript::EffectHandler::Call(SpellScript * spellScript, SpellEffIndex effIndex)
+{
+ (spellScript->*pEffectHandlerScript)(effIndex);
+}
+
+bool SpellScript::_Validate(SpellEntry const * entry, const char * scriptname)
+{
+ for (std::list<EffectHandler>::iterator itr = EffectHandlers.begin(); itr != EffectHandlers.end(); ++itr)
+ {
+ if (!(*itr).GetAffectedEffectsMask(entry))
+ {
+ sLog.outError("TSCR: Spell `%u` Effect `%s` of script`%s` did not match dbc effect data - bound handler won't be executed", entry->Id, (*itr).ToString().c_str(), scriptname);
+ }
+ }
+ return _SpellScript::_Validate(entry, scriptname);
+}
+
+bool SpellScript::_Load(Spell * spell)
+{
+ m_spell = spell;
+ return Load();
+}
+
+Unit * SpellScript::GetCaster()
+{
+ return m_spell->GetCaster();
+}
+
+Unit * SpellScript::GetOriginalCaster()
+{
+ return m_spell->GetOriginalCaster();
+}
+
+SpellEntry const * SpellScript::GetSpellInfo()
+{
+ return m_spell->GetSpellInfo();
+}
+
+Unit * SpellScript::GetEffectUnitTarget()
+{
+ return m_spell->unitTarget;
+}
+
+Creature * SpellScript::GetEffectCreatureTarget()
+{
+ if (m_spell->unitTarget)
+ return m_spell->unitTarget->ToCreature();
+ else
+ return NULL;
+}
+
+Player * SpellScript::GetEffectPlayerTarget()
+{
+ if (m_spell->unitTarget)
+ return m_spell->unitTarget->ToPlayer();
+ else
+ return NULL;
+}
+
+Item * SpellScript::GetEffectItemTarget()
+{
+ return m_spell->itemTarget;
+}
+
+GameObject * SpellScript::GetEffectGOTarget()
+{
+ return m_spell->gameObjTarget;
+}
+
+int32 SpellScript::GetEffectValue()
+{
+ return m_spell->damage;
+}