From 6b5d455023054a4533fe743b5effceb10be7b442 Mon Sep 17 00:00:00 2001 From: Vincent-Michael Date: Wed, 13 Jun 2012 14:06:35 +0200 Subject: Core/Spells: Fix no combo points after Mind Control --- src/server/game/Entities/Unit/Unit.cpp | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'src') diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index a99356681e2..d8165f3e6c9 100755 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -16164,12 +16164,16 @@ void Unit::RemoveCharmedBy(Unit* charmer) charmer->ToPlayer()->SetClientControl(charmer, 1); charmer->ToPlayer()->SetViewpoint(this, false); charmer->ToPlayer()->SetClientControl(this, 0); + if (GetTypeId() == TYPEID_PLAYER) + ToPlayer()->SetMover(this); break; case CHARM_TYPE_POSSESS: charmer->ToPlayer()->SetClientControl(charmer, 1); charmer->ToPlayer()->SetViewpoint(this, false); charmer->ToPlayer()->SetClientControl(this, 0); charmer->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE); + if (GetTypeId() == TYPEID_PLAYER) + ToPlayer()->SetMover(this); break; case CHARM_TYPE_CHARM: if (GetTypeId() == TYPEID_UNIT && charmer->getClass() == CLASS_WARLOCK) -- cgit v1.2.3 From 0e7ed5ec857706f27378b00773aa46b8825c3f27 Mon Sep 17 00:00:00 2001 From: Faq Date: Tue, 18 Sep 2012 23:19:31 +0300 Subject: Core/Spells: Implementing some hooks for split damage taken, fixes the limitation of dmg such auras can split, for example at Hand of Sacrifice. Might have unexpected results, but they are called unexpected for a reason.. .Author Tibbi closes #6025 Made new one as https://github.com/TrinityCore/TrinityCore/pull/7423/ was closed. --- .../2012_09_18_02_world_spell_script_names.sql | 3 ++ src/server/game/Entities/Unit/Unit.cpp | 11 +++-- src/server/game/Spells/Auras/SpellAuras.cpp | 15 +++++++ src/server/game/Spells/Auras/SpellAuras.h | 2 + src/server/game/Spells/SpellScript.cpp | 18 ++++++++ src/server/game/Spells/SpellScript.h | 17 ++++++++ src/server/scripts/Spells/spell_paladin.cpp | 49 ++++++++++++++++++++++ 7 files changed, 111 insertions(+), 4 deletions(-) create mode 100644 sql/updates/world/2012_09_18_02_world_spell_script_names.sql (limited to 'src') diff --git a/sql/updates/world/2012_09_18_02_world_spell_script_names.sql b/sql/updates/world/2012_09_18_02_world_spell_script_names.sql new file mode 100644 index 00000000000..00734753691 --- /dev/null +++ b/sql/updates/world/2012_09_18_02_world_spell_script_names.sql @@ -0,0 +1,3 @@ +DELETE FROM spell_script_names WHERE spell_id = 6940; +INSERT INTO spell_script_names (spell_id, ScriptName) VALUES +(6940, 'spell_pal_hand_of_sacrifice'); diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 6e9ebb38e48..a5ba72cb9b2 100755 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -1769,8 +1769,10 @@ void Unit::CalcAbsorbResist(Unit* victim, SpellSchoolMask schoolMask, DamageEffe for (AuraEffectList::iterator itr = vSplitDamagePctCopy.begin(), next; (itr != vSplitDamagePctCopy.end()) && (dmgInfo.GetDamage() > 0); ++itr) { // Check if aura was removed during iteration - we don't need to work on such auras - if (!((*itr)->GetBase()->IsAppliedOnTarget(victim->GetGUID()))) + AuraApplication const* aurApp = (*itr)->GetBase()->GetApplicationOfTarget(victim->GetGUID()); + if (!aurApp) continue; + // check damage school mask if (!((*itr)->GetMiscValue() & schoolMask)) continue; @@ -1780,13 +1782,14 @@ void Unit::CalcAbsorbResist(Unit* victim, SpellSchoolMask schoolMask, DamageEffe if (!caster || (caster == victim) || !caster->IsInWorld() || !caster->isAlive()) continue; - int32 splitDamage = CalculatePctN(dmgInfo.GetDamage(), (*itr)->GetAmount()); + uint32 splitDamage = CalculatePctN(dmgInfo.GetDamage(), (*itr)->GetAmount()); + + (*itr)->GetBase()->CallScriptEffectSplitHandlers((*itr), aurApp, dmgInfo, splitDamage); // absorb must be smaller than the damage itself - splitDamage = RoundToInterval(splitDamage, 0, int32(dmgInfo.GetDamage())); + splitDamage = RoundToInterval(splitDamage, uint32(0), uint32(dmgInfo.GetDamage())); dmgInfo.AbsorbDamage(splitDamage); - uint32 splitted = splitDamage; uint32 split_absorb = 0; DealDamageMods(caster, splitted, &split_absorb); diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp index 3de11b98e30..abffc65245d 100755 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -2324,6 +2324,21 @@ void Aura::CallScriptEffectAfterManaShieldHandlers(AuraEffect* aurEff, AuraAppli } } +void Aura::CallScriptEffectSplitHandlers(AuraEffect* aurEff, AuraApplication const* aurApp, DamageInfo & dmgInfo, uint32 & splitAmount) +{ + for (std::list::iterator scritr = m_loadedScripts.begin(); scritr != m_loadedScripts.end(); ++scritr) + { + (*scritr)->_PrepareScriptCall(AURA_SCRIPT_HOOK_EFFECT_SPLIT, aurApp); + std::list::iterator effEndItr = (*scritr)->OnEffectSplit.end(), effItr = (*scritr)->OnEffectSplit.begin(); + for (; effItr != effEndItr; ++effItr) + { + if ((*effItr).IsEffectAffected(m_spellInfo, aurEff->GetEffIndex())) + (*effItr).Call(*scritr, aurEff, dmgInfo, splitAmount); + } + (*scritr)->_FinishScriptCall(); + } +} + UnitAura::UnitAura(SpellInfo const* spellproto, uint8 effMask, WorldObject* owner, Unit* caster, int32 *baseAmount, Item* castItem, uint64 casterGUID) : Aura(spellproto, owner, caster, castItem, casterGUID) { diff --git a/src/server/game/Spells/Auras/SpellAuras.h b/src/server/game/Spells/Auras/SpellAuras.h index 2f50d47a79b..85c8992c597 100755 --- a/src/server/game/Spells/Auras/SpellAuras.h +++ b/src/server/game/Spells/Auras/SpellAuras.h @@ -217,6 +217,8 @@ class Aura void CallScriptEffectAfterAbsorbHandlers(AuraEffect* aurEff, AuraApplication const* aurApp, DamageInfo & dmgInfo, uint32 & absorbAmount); void CallScriptEffectManaShieldHandlers(AuraEffect* aurEff, AuraApplication const* aurApp, DamageInfo & dmgInfo, uint32 & absorbAmount, bool & defaultPrevented); void CallScriptEffectAfterManaShieldHandlers(AuraEffect* aurEff, AuraApplication const* aurApp, DamageInfo & dmgInfo, uint32 & absorbAmount); + void CallScriptEffectSplitHandlers(AuraEffect* aurEff, AuraApplication const* aurApp, DamageInfo & dmgInfo, uint32 & splitAmount); + std::list m_loadedScripts; private: void _DeleteRemovedApplications(); diff --git a/src/server/game/Spells/SpellScript.cpp b/src/server/game/Spells/SpellScript.cpp index 1399934efeb..f7ab6e22f2e 100755 --- a/src/server/game/Spells/SpellScript.cpp +++ b/src/server/game/Spells/SpellScript.cpp @@ -675,6 +675,10 @@ bool AuraScript::_Validate(SpellInfo const* entry) if (!(*itr).GetAffectedEffectsMask(entry)) sLog->outError(LOG_FILTER_TSCR, "Spell `%u` Effect `%s` of script `%s` did not match dbc effect data - handler bound to hook `AfterEffectManaShield` of AuraScript won't be executed", entry->Id, (*itr).ToString().c_str(), m_scriptName->c_str()); + for (std::list::iterator itr = OnEffectSplit.begin(); itr != OnEffectSplit.end(); ++itr) + if (!(*itr).GetAffectedEffectsMask(entry)) + sLog->outError(LOG_FILTER_TSCR, "Spell `%u` Effect `%s` of script `%s` did not match dbc effect data - handler bound to hook `OnEffectSplit` of AuraScript won't be executed", entry->Id, (*itr).ToString().c_str(), m_scriptName->c_str()); + return _SpellScript::_Validate(entry); } @@ -803,6 +807,17 @@ void AuraScript::EffectManaShieldHandler::Call(AuraScript* auraScript, AuraEffec (auraScript->*pEffectHandlerScript)(aurEff, dmgInfo, absorbAmount); } +AuraScript::EffectSplitHandler::EffectSplitHandler(AuraEffectSplitFnType _pEffectHandlerScript, uint8 _effIndex) + : AuraScript::EffectBase(_effIndex, SPELL_AURA_SPLIT_DAMAGE_PCT) +{ + pEffectHandlerScript = _pEffectHandlerScript; +} + +void AuraScript::EffectSplitHandler::Call(AuraScript* auraScript, AuraEffect* aurEff, DamageInfo& dmgInfo, uint32& splitAmount) +{ + (auraScript->*pEffectHandlerScript)(aurEff, dmgInfo, splitAmount); +} + bool AuraScript::_Load(Aura* aura) { m_aura = aura; @@ -837,6 +852,7 @@ bool AuraScript::_IsDefaultActionPrevented() case AURA_SCRIPT_HOOK_EFFECT_REMOVE: case AURA_SCRIPT_HOOK_EFFECT_PERIODIC: case AURA_SCRIPT_HOOK_EFFECT_ABSORB: + case AURA_SCRIPT_HOOK_EFFECT_SPLIT: return m_defaultActionPrevented; default: ASSERT(false && "AuraScript::_IsDefaultActionPrevented is called in a wrong place"); @@ -852,6 +868,7 @@ void AuraScript::PreventDefaultAction() case AURA_SCRIPT_HOOK_EFFECT_REMOVE: case AURA_SCRIPT_HOOK_EFFECT_PERIODIC: case AURA_SCRIPT_HOOK_EFFECT_ABSORB: + case AURA_SCRIPT_HOOK_EFFECT_SPLIT: m_defaultActionPrevented = true; break; default: @@ -1033,6 +1050,7 @@ Unit* AuraScript::GetTarget() const case AURA_SCRIPT_HOOK_EFFECT_AFTER_ABSORB: case AURA_SCRIPT_HOOK_EFFECT_MANASHIELD: case AURA_SCRIPT_HOOK_EFFECT_AFTER_MANASHIELD: + case AURA_SCRIPT_HOOK_EFFECT_SPLIT: return m_auraApplication->GetTarget(); default: sLog->outError(LOG_FILTER_TSCR, "Script: `%s` Spell: `%u` AuraScript::GetTarget called in a hook in which the call won't have effect!", m_scriptName->c_str(), m_scriptSpellId); diff --git a/src/server/game/Spells/SpellScript.h b/src/server/game/Spells/SpellScript.h index 460a4e20d7f..a5d77806739 100755 --- a/src/server/game/Spells/SpellScript.h +++ b/src/server/game/Spells/SpellScript.h @@ -423,6 +423,7 @@ enum AuraScriptHookType AURA_SCRIPT_HOOK_EFFECT_AFTER_ABSORB, AURA_SCRIPT_HOOK_EFFECT_MANASHIELD, AURA_SCRIPT_HOOK_EFFECT_AFTER_MANASHIELD, + AURA_SCRIPT_HOOK_EFFECT_SPLIT, AURA_SCRIPT_HOOK_CHECK_AREA_TARGET, AURA_SCRIPT_HOOK_DISPEL, AURA_SCRIPT_HOOK_AFTER_DISPEL @@ -449,6 +450,7 @@ class AuraScript : public _SpellScript typedef void(CLASSNAME::*AuraEffectCalcPeriodicFnType)(AuraEffect const*, bool &, int32 &); \ typedef void(CLASSNAME::*AuraEffectCalcSpellModFnType)(AuraEffect const*, SpellModifier* &); \ typedef void(CLASSNAME::*AuraEffectAbsorbFnType)(AuraEffect*, DamageInfo &, uint32 &); \ + typedef void(CLASSNAME::*AuraEffectSplitFnType)(AuraEffect*, DamageInfo &, uint32 &); \ AURASCRIPT_FUNCTION_TYPE_DEFINES(AuraScript) @@ -540,6 +542,14 @@ class AuraScript : public _SpellScript private: AuraEffectAbsorbFnType pEffectHandlerScript; }; + class EffectSplitHandler : public EffectBase + { + public: + EffectSplitHandler(AuraEffectSplitFnType _pEffectHandlerScript, uint8 _effIndex); + void Call(AuraScript* auraScript, AuraEffect* aurEff, DamageInfo & dmgInfo, uint32 & splitAmount); + private: + AuraEffectSplitFnType pEffectHandlerScript; + }; #define AURASCRIPT_FUNCTION_CAST_DEFINES(CLASSNAME) \ class CheckAreaTargetFunction : public AuraScript::CheckAreaTargetHandler { public: CheckAreaTargetFunction(AuraCheckAreaTargetFnType _pHandlerScript) : AuraScript::CheckAreaTargetHandler((AuraScript::AuraCheckAreaTargetFnType)_pHandlerScript) {} }; \ @@ -552,6 +562,7 @@ class AuraScript : public _SpellScript class EffectApplyHandlerFunction : public AuraScript::EffectApplyHandler { public: EffectApplyHandlerFunction(AuraEffectApplicationModeFnType _pEffectHandlerScript, uint8 _effIndex, uint16 _effName, AuraEffectHandleModes _mode) : AuraScript::EffectApplyHandler((AuraScript::AuraEffectApplicationModeFnType)_pEffectHandlerScript, _effIndex, _effName, _mode) {} }; \ class EffectAbsorbFunction : public AuraScript::EffectAbsorbHandler { public: EffectAbsorbFunction(AuraEffectAbsorbFnType _pEffectHandlerScript, uint8 _effIndex) : AuraScript::EffectAbsorbHandler((AuraScript::AuraEffectAbsorbFnType)_pEffectHandlerScript, _effIndex) {} }; \ class EffectManaShieldFunction : public AuraScript::EffectManaShieldHandler { public: EffectManaShieldFunction(AuraEffectAbsorbFnType _pEffectHandlerScript, uint8 _effIndex) : AuraScript::EffectManaShieldHandler((AuraScript::AuraEffectAbsorbFnType)_pEffectHandlerScript, _effIndex) {} }; \ + class EffectSplitFunction : public AuraScript::EffectSplitHandler { public: EffectSplitFunction(AuraEffectSplitFnType _pEffectHandlerScript, uint8 _effIndex) : AuraScript::EffectSplitHandler((AuraScript::AuraEffectSplitFnType)_pEffectHandlerScript, _effIndex) {} }; \ #define PrepareAuraScript(CLASSNAME) AURASCRIPT_FUNCTION_TYPE_DEFINES(CLASSNAME) AURASCRIPT_FUNCTION_CAST_DEFINES(CLASSNAME) @@ -676,6 +687,12 @@ class AuraScript : public _SpellScript // where function is: void function (AuraEffect* aurEff, DamageInfo& dmgInfo, uint32& absorbAmount); HookList AfterEffectManaShield; + // executed when the caster of some spell with split dmg aura gets damaged through it + // example: OnEffectSplit += AuraEffectSplitFn(class::function, EffectIndexSpecifier); + // where function is: void function (AuraEffect* aurEff, DamageInfo& dmgInfo, uint32& splitAmount); + HookList OnEffectSplit; + #define AuraEffectSplitFn(F, I) EffectSplitFunction(&F, I) + // AuraScript interface - hook/effect execution manipulators // prevents default action of a hook from being executed (works only while called in a hook which default action can be prevented) diff --git a/src/server/scripts/Spells/spell_paladin.cpp b/src/server/scripts/Spells/spell_paladin.cpp index 0bf2e5664a0..43c4dc139a3 100644 --- a/src/server/scripts/Spells/spell_paladin.cpp +++ b/src/server/scripts/Spells/spell_paladin.cpp @@ -47,6 +47,8 @@ enum PaladinSpells SPELL_FORBEARANCE = 25771, SPELL_AVENGING_WRATH_MARKER = 61987, SPELL_IMMUNE_SHIELD_MARKER = 61988, + + SPELL_HAND_OF_SACRIFICE = 6940, }; // 31850 - Ardent Defender @@ -566,6 +568,52 @@ class spell_pal_exorcism_and_holy_wrath_damage : public SpellScriptLoader } }; +class spell_pal_hand_of_sacrifice : public SpellScriptLoader +{ + public: + spell_pal_hand_of_sacrifice() : SpellScriptLoader("spell_pal_hand_of_sacrifice") { } + + class spell_pal_hand_of_sacrifice_AuraScript : public AuraScript + { + PrepareAuraScript(spell_pal_hand_of_sacrifice_AuraScript); + + uint32 splitPct; + int32 remainingAmount; + Unit* caster; + + bool Load() + { + caster = GetCaster(); + if (!caster) + return false; + remainingAmount = caster->GetMaxHealth(); + splitPct = GetSpellInfo()->Effects[EFFECT_0].CalcValue(GetCaster()); + return true; + } + + void Split(AuraEffect* /*aurEff*/, DamageInfo & /*dmgInfo*/, uint32 & splitAmount) + { + remainingAmount -= splitAmount; + + if (remainingAmount <= 0) + { + Unit* target = GetTarget(); + target->RemoveAura(SPELL_HAND_OF_SACRIFICE); + } + } + + void Register() + { + OnEffectSplit += AuraEffectSplitFn(spell_pal_hand_of_sacrifice_AuraScript::Split, EFFECT_0); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_pal_hand_of_sacrifice_AuraScript(); + } +}; + void AddSC_paladin_spell_scripts() { new spell_pal_ardent_defender(); @@ -579,4 +627,5 @@ void AddSC_paladin_spell_scripts() new spell_pal_lay_on_hands(); new spell_pal_righteous_defense(); new spell_pal_exorcism_and_holy_wrath_damage(); + new spell_pal_hand_of_sacrifice(); } -- cgit v1.2.3 From dc935ef8b14721fba81f9aff4c7190df8de5db09 Mon Sep 17 00:00:00 2001 From: Kandera Date: Mon, 24 Sep 2012 10:37:58 -0400 Subject: Core/Spells: fix beacon of light being on a non player. --- src/server/game/Entities/Unit/Unit.cpp | 48 ++++++++++++++++++++++------------ 1 file changed, 32 insertions(+), 16 deletions(-) (limited to 'src') diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 8e18f1de9ab..e64afb70d5f 100755 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -6633,31 +6633,47 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere // Light's Beacon - Beacon of Light if (dummySpell->Id == 53651) { - if (this->GetTypeId() != TYPEID_PLAYER) + if (!victim) return false; - // Check Party/Raid Group - if (Group *group = this->ToPlayer()->GetGroup()) + triggered_spell_id = 0; + Unit* beaconTarget = NULL; + if (this->GetTypeId() != TYPEID_PLAYER) { - for (GroupReference *itr = group->GetFirstMember(); itr != NULL; itr = itr->next()) + beaconTarget = triggeredByAura->GetBase()->GetCaster(); + if (beaconTarget == this || !(beaconTarget->GetAura(53563, victim->GetGUID()))) + return false; + basepoints0 = int32(damage); + triggered_spell_id = procSpell->IsRankOf(sSpellMgr->GetSpellInfo(365)) ? 53652 : 53654; + } + else + { // Check Party/Raid Group + if (Group *group = this->ToPlayer()->GetGroup()) { - Player* Member = itr->getSource(); - - // check if it was heal by paladin which casted this beacon of light - if (Aura const * aura = Member->GetAura(53563, victim->GetGUID())) + for (GroupReference *itr = group->GetFirstMember(); itr != NULL; itr = itr->next()) { - Unit* beaconTarget = Member; + Player* Member = itr->getSource(); - // do not proc when target of beacon of light is healed - if (beaconTarget == this) - return false; + // check if it was heal by paladin which casted this beacon of light + if (Aura const * aura = Member->GetAura(53563, victim->GetGUID())) + { + // do not proc when target of beacon of light is healed + if (Member == this) + return false; - basepoints0 = int32(damage); - triggered_spell_id = 53652; - victim->CastCustomSpell(beaconTarget, triggered_spell_id, &basepoints0, NULL, NULL, true, 0, triggeredByAura); - return true; + beaconTarget = Member; + basepoints0 = int32(damage); + triggered_spell_id = procSpell->IsRankOf(sSpellMgr->GetSpellInfo(365)) ? 53652 : 53654; + break; + } } } } + + if (triggered_spell_id && beaconTarget) + { + victim->CastCustomSpell(beaconTarget, triggered_spell_id, &basepoints0, NULL, NULL, true, 0, triggeredByAura); + return true; + } else return false; } -- cgit v1.2.3 From da4067cb30f3bf45f1456dd1411cf9f4c1df8c5c Mon Sep 17 00:00:00 2001 From: faq Date: Mon, 24 Sep 2012 18:05:00 +0300 Subject: Implementing split dmg cap to Divine Sacrifice. Author Tibbi +correcting previos sql Closes #6024 --- .../2012_09_18_02_world_spell_script_names.sql | 3 -- .../2012_09_24_00_world_spell_script_names.sql | 3 ++ .../2012_09_24_01_world_spell_script_names.sql | 3 ++ src/server/scripts/Spells/spell_paladin.cpp | 58 +++++++++++++++++++++- 4 files changed, 62 insertions(+), 5 deletions(-) delete mode 100644 sql/updates/world/2012_09_18_02_world_spell_script_names.sql create mode 100644 sql/updates/world/2012_09_24_00_world_spell_script_names.sql create mode 100644 sql/updates/world/2012_09_24_01_world_spell_script_names.sql (limited to 'src') diff --git a/sql/updates/world/2012_09_18_02_world_spell_script_names.sql b/sql/updates/world/2012_09_18_02_world_spell_script_names.sql deleted file mode 100644 index 00734753691..00000000000 --- a/sql/updates/world/2012_09_18_02_world_spell_script_names.sql +++ /dev/null @@ -1,3 +0,0 @@ -DELETE FROM spell_script_names WHERE spell_id = 6940; -INSERT INTO spell_script_names (spell_id, ScriptName) VALUES -(6940, 'spell_pal_hand_of_sacrifice'); diff --git a/sql/updates/world/2012_09_24_00_world_spell_script_names.sql b/sql/updates/world/2012_09_24_00_world_spell_script_names.sql new file mode 100644 index 00000000000..611325d4b11 --- /dev/null +++ b/sql/updates/world/2012_09_24_00_world_spell_script_names.sql @@ -0,0 +1,3 @@ +DELETE FROM `spell_script_names` WHERE `spell_id`=6940; +INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES +(6940, 'spell_pal_hand_of_sacrifice'); diff --git a/sql/updates/world/2012_09_24_01_world_spell_script_names.sql b/sql/updates/world/2012_09_24_01_world_spell_script_names.sql new file mode 100644 index 00000000000..e14b6833a09 --- /dev/null +++ b/sql/updates/world/2012_09_24_01_world_spell_script_names.sql @@ -0,0 +1,3 @@ +DELETE FROM `spell_script_names` WHERE `spell_id`=64205; +INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES +(64205, 'spell_pal_divine_sacrifice'); diff --git a/src/server/scripts/Spells/spell_paladin.cpp b/src/server/scripts/Spells/spell_paladin.cpp index 43c4dc139a3..ad0ed6a7e20 100644 --- a/src/server/scripts/Spells/spell_paladin.cpp +++ b/src/server/scripts/Spells/spell_paladin.cpp @@ -24,6 +24,7 @@ #include "ScriptMgr.h" #include "SpellScript.h" #include "SpellAuraEffects.h" +#include "Group.h" enum PaladinSpells @@ -49,6 +50,7 @@ enum PaladinSpells SPELL_IMMUNE_SHIELD_MARKER = 61988, SPELL_HAND_OF_SACRIFICE = 6940, + SPELL_DIVINE_SACRIFICE = 64205, }; // 31850 - Ardent Defender @@ -577,7 +579,6 @@ class spell_pal_hand_of_sacrifice : public SpellScriptLoader { PrepareAuraScript(spell_pal_hand_of_sacrifice_AuraScript); - uint32 splitPct; int32 remainingAmount; Unit* caster; @@ -587,7 +588,6 @@ class spell_pal_hand_of_sacrifice : public SpellScriptLoader if (!caster) return false; remainingAmount = caster->GetMaxHealth(); - splitPct = GetSpellInfo()->Effects[EFFECT_0].CalcValue(GetCaster()); return true; } @@ -614,6 +614,59 @@ class spell_pal_hand_of_sacrifice : public SpellScriptLoader } }; +class spell_pal_divine_sacrifice : public SpellScriptLoader +{ + public: + spell_pal_divine_sacrifice() : SpellScriptLoader("spell_pal_divine_sacrifice") { } + + class spell_pal_divine_sacrifice_AuraScript : public AuraScript + { + PrepareAuraScript(spell_pal_divine_sacrifice_AuraScript); + + uint32 splitPct, groupSize, minHpPct; + int32 remainingAmount; + Unit* caster; + + bool Load() + { + caster = GetCaster(); + if (!caster) + return false; + + if (caster->ToPlayer()->GetGroup()) + groupSize = caster->ToPlayer()->GetGroup()->GetMembersCount(); + else + groupSize = 1; + + remainingAmount = (caster->CountPctFromMaxHealth(GetSpellInfo()->Effects[EFFECT_2].CalcValue(caster)) * groupSize); + splitPct = GetSpellInfo()->Effects[EFFECT_0].CalcValue(caster); + minHpPct = GetSpellInfo()->Effects[EFFECT_1].CalcValue(caster); + + return true; + } + + void Split(AuraEffect* /*aurEff*/, DamageInfo & dmgInfo, uint32 & splitAmount) + { + splitAmount = CalculatePctN(dmgInfo.GetDamage(), splitPct); + remainingAmount -= splitAmount; + + // break when absorbed everything it could, or if the casters hp drops below 20% + if (remainingAmount <= 0 || (GetCaster()->GetHealthPct() < minHpPct)) + GetCaster()->RemoveAura(SPELL_DIVINE_SACRIFICE); + } + + void Register() + { + OnEffectSplit += AuraEffectSplitFn(spell_pal_divine_sacrifice_AuraScript::Split, EFFECT_0); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_pal_divine_sacrifice_AuraScript(); + } +}; + void AddSC_paladin_spell_scripts() { new spell_pal_ardent_defender(); @@ -628,4 +681,5 @@ void AddSC_paladin_spell_scripts() new spell_pal_righteous_defense(); new spell_pal_exorcism_and_holy_wrath_damage(); new spell_pal_hand_of_sacrifice(); + new spell_pal_divine_sacrifice(); } -- cgit v1.2.3 From 58d3758f4c8913ffd734b2d963a22bccd55b879a Mon Sep 17 00:00:00 2001 From: faq Date: Mon, 24 Sep 2012 18:33:54 +0300 Subject: Core/Spell: Correcting previos PR. splitamount is already calculated in core and removing not in. variable --- src/server/scripts/Spells/spell_paladin.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/server/scripts/Spells/spell_paladin.cpp b/src/server/scripts/Spells/spell_paladin.cpp index ad0ed6a7e20..e2f449e38a1 100644 --- a/src/server/scripts/Spells/spell_paladin.cpp +++ b/src/server/scripts/Spells/spell_paladin.cpp @@ -623,7 +623,7 @@ class spell_pal_divine_sacrifice : public SpellScriptLoader { PrepareAuraScript(spell_pal_divine_sacrifice_AuraScript); - uint32 splitPct, groupSize, minHpPct; + uint32 groupSize, minHpPct; int32 remainingAmount; Unit* caster; @@ -639,15 +639,13 @@ class spell_pal_divine_sacrifice : public SpellScriptLoader groupSize = 1; remainingAmount = (caster->CountPctFromMaxHealth(GetSpellInfo()->Effects[EFFECT_2].CalcValue(caster)) * groupSize); - splitPct = GetSpellInfo()->Effects[EFFECT_0].CalcValue(caster); minHpPct = GetSpellInfo()->Effects[EFFECT_1].CalcValue(caster); return true; } - void Split(AuraEffect* /*aurEff*/, DamageInfo & dmgInfo, uint32 & splitAmount) + void Split(AuraEffect* /*aurEff*/, DamageInfo & /*dmgInfo*/, uint32 & splitAmount) { - splitAmount = CalculatePctN(dmgInfo.GetDamage(), splitPct); remainingAmount -= splitAmount; // break when absorbed everything it could, or if the casters hp drops below 20% -- cgit v1.2.3 From 5adc3d28a48a39bd1cff7d79443a9379124ebca3 Mon Sep 17 00:00:00 2001 From: Kandera Date: Mon, 24 Sep 2012 12:08:25 -0400 Subject: Core/Player: fix teleporting while on vehicle. Closes #7812 thx joschiwald --- src/server/game/Entities/Player/Player.cpp | 3 +++ 1 file changed, 3 insertions(+) (limited to 'src') diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index c498350c78c..68be167f919 100755 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -2113,6 +2113,9 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati else sLog->outDebug(LOG_FILTER_MAPS, "Player %s is being teleported to map %u", GetName(), mapid); + if (m_vehicle) + ExitVehicle(); + // reset movement flags at teleport, because player will continue move with these flags after teleport SetUnitMovementFlags(0); DisableSpline(); -- cgit v1.2.3 From 3cf359068ef642ff0959fdf2dc2e29939708b275 Mon Sep 17 00:00:00 2001 From: Kandera Date: Mon, 24 Sep 2012 12:16:37 -0400 Subject: Core/Spells: Fix things from commit da4067cb30f3bf45f1456dd1411cf9f4c1df8c5c thx dracosvk --- src/server/scripts/Spells/spell_paladin.cpp | 51 +++++++++++++++-------------- 1 file changed, 27 insertions(+), 24 deletions(-) (limited to 'src') diff --git a/src/server/scripts/Spells/spell_paladin.cpp b/src/server/scripts/Spells/spell_paladin.cpp index e2f449e38a1..0102c3cb1ae 100644 --- a/src/server/scripts/Spells/spell_paladin.cpp +++ b/src/server/scripts/Spells/spell_paladin.cpp @@ -580,15 +580,15 @@ class spell_pal_hand_of_sacrifice : public SpellScriptLoader PrepareAuraScript(spell_pal_hand_of_sacrifice_AuraScript); int32 remainingAmount; - Unit* caster; bool Load() { - caster = GetCaster(); - if (!caster) - return false; - remainingAmount = caster->GetMaxHealth(); - return true; + if (Unit* caster = GetCaster()) + { + remainingAmount = caster->GetMaxHealth(); + return true; + } + return false; } void Split(AuraEffect* /*aurEff*/, DamageInfo & /*dmgInfo*/, uint32 & splitAmount) @@ -597,8 +597,7 @@ class spell_pal_hand_of_sacrifice : public SpellScriptLoader if (remainingAmount <= 0) { - Unit* target = GetTarget(); - target->RemoveAura(SPELL_HAND_OF_SACRIFICE); + GetTarget()->RemoveAura(SPELL_HAND_OF_SACRIFICE); } } @@ -625,32 +624,36 @@ class spell_pal_divine_sacrifice : public SpellScriptLoader uint32 groupSize, minHpPct; int32 remainingAmount; - Unit* caster; bool Load() { - caster = GetCaster(); - if (!caster) - return false; - - if (caster->ToPlayer()->GetGroup()) - groupSize = caster->ToPlayer()->GetGroup()->GetMembersCount(); - else - groupSize = 1; - - remainingAmount = (caster->CountPctFromMaxHealth(GetSpellInfo()->Effects[EFFECT_2].CalcValue(caster)) * groupSize); - minHpPct = GetSpellInfo()->Effects[EFFECT_1].CalcValue(caster); + + if (Unit* caster = GetCaster()) + { + if (caster->GetTypeId() == TYPEID_PLAYER) + { + if (caster->ToPlayer()->GetGroup()) + groupSize = caster->ToPlayer()->GetGroup()->GetMembersCount(); + else + groupSize = 1; + } + else + return false; - return true; + remainingAmount = (caster->CountPctFromMaxHealth(GetSpellInfo()->Effects[EFFECT_2].CalcValue(caster)) * groupSize); + minHpPct = GetSpellInfo()->Effects[EFFECT_1].CalcValue(caster); + return true; + } + return false; } void Split(AuraEffect* /*aurEff*/, DamageInfo & /*dmgInfo*/, uint32 & splitAmount) { remainingAmount -= splitAmount; - // break when absorbed everything it could, or if the casters hp drops below 20% - if (remainingAmount <= 0 || (GetCaster()->GetHealthPct() < minHpPct)) - GetCaster()->RemoveAura(SPELL_DIVINE_SACRIFICE); + if (Unit* caster = GetCaster()) + if (remainingAmount <= 0 || (caster->GetHealthPct() < minHpPct)) + caster->RemoveAura(SPELL_DIVINE_SACRIFICE); } void Register() -- cgit v1.2.3 From 1c1405cb25cc9152c1477b9769cf45aa43ba4bc8 Mon Sep 17 00:00:00 2001 From: Xanvial Date: Mon, 24 Sep 2012 12:35:09 -0400 Subject: Core/Scripts: fix rotface oozes from spawning after death. Closes #7736 --- src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp index 5a0560293da..03427a4cfc2 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp @@ -124,9 +124,9 @@ class boss_rotface : public CreatureScript void JustDied(Unit* /*killer*/) { + instance->DoRemoveAurasDueToSpellOnPlayers(MUTATED_INFECTION); _JustDied(); Talk(SAY_DEATH); - instance->DoRemoveAurasDueToSpellOnPlayers(MUTATED_INFECTION); if (Creature* professor = Unit::GetCreature(*me, instance->GetData64(DATA_PROFESSOR_PUTRICIDE))) professor->AI()->DoAction(ACTION_ROTFACE_DEATH); } -- cgit v1.2.3 From 118825601b101eb6d3b9c1678afed1c405235d8e Mon Sep 17 00:00:00 2001 From: Vincent-Michael Date: Mon, 24 Sep 2012 12:39:02 -0400 Subject: Core/Spells: fix misdirection removal on cancel. Closes #7776 --- src/server/scripts/Spells/spell_hunter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/server/scripts/Spells/spell_hunter.cpp b/src/server/scripts/Spells/spell_hunter.cpp index a2ee6c1c3a3..e445f68cfba 100644 --- a/src/server/scripts/Spells/spell_hunter.cpp +++ b/src/server/scripts/Spells/spell_hunter.cpp @@ -574,7 +574,7 @@ class spell_hun_misdirection : public SpellScriptLoader void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { if (Unit* caster = GetCaster()) - if (!GetDuration()) + if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_DEFAULT) caster->SetReducedThreatPercent(0, 0); } -- cgit v1.2.3