aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2022-07-29 20:24:28 +0200
committerShauren <shauren.trinity@gmail.com>2022-07-29 20:24:28 +0200
commit6713fa4c93f87af351f3ee65c1ff36b52ea85ddb (patch)
tree1f7c928593dc5acd796f2f1e6f5da118d1451ef3
parent988b27e24df74048778784ef52f8d0adc58ba049 (diff)
Core/Scripts: Added CalcCastTime spell script hook
-rw-r--r--src/server/game/Entities/Object/Object.cpp4
-rw-r--r--src/server/game/Spells/Spell.cpp24
-rw-r--r--src/server/game/Spells/Spell.h1
-rw-r--r--src/server/game/Spells/SpellScript.h7
4 files changed, 22 insertions, 14 deletions
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp
index 52349b9f749..4aaf3a5971b 100644
--- a/src/server/game/Entities/Object/Object.cpp
+++ b/src/server/game/Entities/Object/Object.cpp
@@ -2333,7 +2333,9 @@ void WorldObject::ModSpellCastTime(SpellInfo const* spellInfo, int32& castTime,
if (!unitCaster)
return;
- if (!(spellInfo->HasAttribute(SPELL_ATTR0_IS_ABILITY) || spellInfo->HasAttribute(SPELL_ATTR0_IS_TRADESKILL) || spellInfo->HasAttribute(SPELL_ATTR3_IGNORE_CASTER_MODIFIERS)) &&
+ if (unitCaster->IsPlayer() && unitCaster->ToPlayer()->GetCommandStatus(CHEAT_CASTTIME))
+ castTime = 0;
+ else if (!(spellInfo->HasAttribute(SPELL_ATTR0_IS_ABILITY) || spellInfo->HasAttribute(SPELL_ATTR0_IS_TRADESKILL) || spellInfo->HasAttribute(SPELL_ATTR3_IGNORE_CASTER_MODIFIERS)) &&
((GetTypeId() == TYPEID_PLAYER && spellInfo->SpellFamilyName) || GetTypeId() == TYPEID_UNIT))
castTime = unitCaster->CanInstantCast() ? 0 : int32(float(castTime) * unitCaster->m_unitData->ModCastingSpeed);
else if (spellInfo->HasAttribute(SPELL_ATTR0_USES_RANGED_SLOT) && !spellInfo->HasAttribute(SPELL_ATTR2_AUTO_REPEAT))
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index 92cbb69912f..d461c4298f7 100644
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -3377,18 +3377,7 @@ SpellCastResult Spell::prepare(SpellCastTargets const& targets, AuraEffect const
// Prepare data for triggers
prepareDataForTriggerSystem();
- if (Player* player = m_caster->ToPlayer())
- {
- if (!player->GetCommandStatus(CHEAT_CASTTIME))
- {
- // calculate cast time (calculated after first CheckCast check to prevent charge counting for first CheckCast fail)
- m_casttime = m_spellInfo->CalcCastTime(this);
- }
- else
- m_casttime = 0; // Set cast time to 0 if .cheat casttime is enabled.
- }
- else
- m_casttime = m_spellInfo->CalcCastTime(this);
+ m_casttime = CallScriptCalcCastTimeHandlers(m_spellInfo->CalcCastTime(this));
if (m_caster->IsUnit() && m_caster->ToUnit()->isMoving())
{
@@ -8432,6 +8421,17 @@ SpellCastResult Spell::CallScriptCheckCastHandlers()
return retVal;
}
+int32 Spell::CallScriptCalcCastTimeHandlers(int32 castTime)
+{
+ for (auto scritr = m_loadedScripts.begin(); scritr != m_loadedScripts.end(); ++scritr)
+ {
+ (*scritr)->_PrepareScriptCall(SPELL_SCRIPT_HOOK_CALC_CAST_TIME);
+ castTime = (*scritr)->CalcCastTime(castTime);
+ (*scritr)->_FinishScriptCall();
+ }
+ return castTime;
+}
+
bool Spell::CallScriptEffectHandlers(SpellEffIndex effIndex, SpellEffectHandleMode mode)
{
// execute script effect handler hooks and check if effects was prevented
diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h
index 58e39fc634b..0fda5253439 100644
--- a/src/server/game/Spells/Spell.h
+++ b/src/server/game/Spells/Spell.h
@@ -823,6 +823,7 @@ class TC_GAME_API Spell
void CallScriptOnCastHandlers();
void CallScriptAfterCastHandlers();
SpellCastResult CallScriptCheckCastHandlers();
+ int32 CallScriptCalcCastTimeHandlers(int32 originalCastTime);
bool CallScriptEffectHandlers(SpellEffIndex effIndex, SpellEffectHandleMode mode);
void CallScriptSuccessfulDispel(SpellEffIndex effIndex);
void CallScriptBeforeHitHandlers(SpellMissInfo missInfo);
diff --git a/src/server/game/Spells/SpellScript.h b/src/server/game/Spells/SpellScript.h
index dfd44b1bed3..044122a3a51 100644
--- a/src/server/game/Spells/SpellScript.h
+++ b/src/server/game/Spells/SpellScript.h
@@ -217,6 +217,7 @@ enum SpellScriptHookType
SPELL_SCRIPT_HOOK_AFTER_CAST,
SPELL_SCRIPT_HOOK_CALC_CRIT_CHANCE,
SPELL_SCRIPT_HOOK_ON_PRECAST,
+ SPELL_SCRIPT_HOOK_CALC_CAST_TIME,
};
#define HOOK_SPELL_HIT_START SPELL_SCRIPT_HOOK_EFFECT_HIT
@@ -415,6 +416,7 @@ class TC_GAME_API SpellScript : public _SpellScript
#define PrepareSpellScript(CLASSNAME) SPELLSCRIPT_FUNCTION_TYPE_DEFINES(CLASSNAME) SPELLSCRIPT_FUNCTION_CAST_DEFINES(CLASSNAME)
public:
+ SpellScript() : m_spell(nullptr), m_hitPreventEffectMask(0), m_hitPreventDefaultEffectMask(0) { }
bool _Validate(SpellInfo const* entry) override;
bool _Load(Spell* spell);
void _InitHit();
@@ -436,7 +438,7 @@ class TC_GAME_API SpellScript : public _SpellScript
//
// SpellScript interface
//
- // example: void OnPrecast override { }
+ // example: void OnPrecast() override { }
virtual void OnPrecast() { }
//
// hooks to which you can attach your functions
@@ -454,6 +456,9 @@ class TC_GAME_API SpellScript : public _SpellScript
HookList<CheckCastHandler> OnCheckCast;
#define SpellCheckCastFn(F) CheckCastHandlerFunction(&F)
+ // example: int32 CalcCastTime(int32 castTime) override { return 1500; }
+ virtual int32 CalcCastTime(int32 castTime) { return castTime; }
+
// example: OnCalculateResistAbsorb += SpellOnResistAbsorbCalculateFn(class::function);
// where function is void function(DamageInfo const& damageInfo, uint32& resistAmount, int32& absorbAmount)
HookList<OnCalculateResistAbsorbHandler> OnCalculateResistAbsorb;