diff options
6 files changed, 100 insertions, 29 deletions
diff --git a/sql/updates/world/2011_08_27_01_world_spell_script_names.sql b/sql/updates/world/2011_08_27_01_world_spell_script_names.sql new file mode 100644 index 00000000000..7ca3c9f4d64 --- /dev/null +++ b/sql/updates/world/2011_08_27_01_world_spell_script_names.sql @@ -0,0 +1 @@ +UPDATE `spell_script_names` SET `ScriptName`='spell_marrowgar_coldflame_bonestorm' WHERE `spell_id`=72705 AND `ScriptName`='spell_marrowgar_coldflame'; diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp index 1954e18bafd..48c0edc2854 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp @@ -655,7 +655,7 @@ class spell_blood_queen_bloodbolt : public SpellScriptLoader void FilterTargets(std::list<Unit*>& targets) { - uint32 targetCount = targets.size() / 3 + 1; + uint32 targetCount = (targets.size() + 2) / 3; targets.remove_if(BloodboltHitCheck(static_cast<LanaThelAI*>(GetCaster()->GetAI()))); Trinity::RandomResizeList(targets, targetCount); } diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp index 1898fa253f6..e22e4ecb28b 100755 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp @@ -77,6 +77,8 @@ enum MovementPoints POINT_TARGET_COLDFLAME = 36672631, }; +#define DATA_COLDFLAME_GUID 0 + class boss_lord_marrowgar : public CreatureScript { public: @@ -165,8 +167,9 @@ class boss_lord_marrowgar : public CreatureScript break; case EVENT_COLDFLAME: _coldflameLastPos.Relocate(me); + _coldflameTarget = 0LL; if (!me->HasAura(SPELL_BONE_STORM)) - me->CastCustomSpell(SPELL_COLDFLAME_NORMAL, SPELLVALUE_MAX_TARGETS, 1, me); + DoCastAOE(SPELL_COLDFLAME_NORMAL); else DoCast(me, SPELL_COLDFLAME_BONE_STORM); events.ScheduleEvent(EVENT_COLDFLAME, 5000, EVENT_GROUP_SPECIAL); @@ -242,8 +245,24 @@ class boss_lord_marrowgar : public CreatureScript return &_coldflameLastPos; } + uint64 GetGUID(int32 type/* = 0 */) + { + if (type == DATA_COLDFLAME_GUID) + return _coldflameTarget; + return 0LL; + } + + void SetGUID(uint64 const guid, int32 type/* = 0 */) + { + if (type != DATA_COLDFLAME_GUID) + return; + + _coldflameTarget = guid; + } + private: Position _coldflameLastPos; + uint64 _coldflameTarget; uint32 _boneStormDuration; float _baseSpeed; bool _introDone; @@ -277,22 +296,7 @@ class npc_coldflame : public CreatureScript Creature* creOwner = owner->ToCreature(); Position pos; // random target case - if (!owner->HasAura(SPELL_BONE_STORM)) - { - // select any unit but not the tank (by owners threatlist) - Unit* target = creOwner->AI()->SelectTarget(SELECT_TARGET_RANDOM, 1, -owner->GetObjectSize(), true, -SPELL_IMPALED); - if (!target) - target = creOwner->AI()->SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true); // or the tank if its solo - if (!target) - { - me->DespawnOrUnsummon(); - return; - } - - me->SetOrientation(me->GetAngle(target)); - owner->GetNearPosition(pos, owner->GetObjectSize() / 2.0f, 0.0f); - } - else + if (owner->HasAura(SPELL_BONE_STORM)) { if (MarrowgarAI* marrowgarAI = CAST_AI(MarrowgarAI, creOwner->AI())) { @@ -303,6 +307,18 @@ class npc_coldflame : public CreatureScript owner->GetNearPosition(pos, 2.5f, 0.0f); } } + else + { + Player* target = ObjectAccessor::GetPlayer(*owner, owner->GetAI()->GetGUID(DATA_COLDFLAME_GUID)); + if (!target) + { + me->DespawnOrUnsummon(); + return; + } + + me->SetOrientation(owner->GetAngle(target)); + owner->GetNearPosition(pos, owner->GetObjectSize() / 2.0f, 0.0f); + } me->NearTeleportTo(pos.GetPositionX(), pos.GetPositionY(), me->GetPositionZ(), me->GetOrientation()); _events.ScheduleEvent(EVENT_COLDFLAME_TRIGGER, 450); @@ -399,16 +415,53 @@ class spell_marrowgar_coldflame : public SpellScriptLoader { PrepareSpellScript(spell_marrowgar_coldflame_SpellScript); + void SelectTarget(std::list<Unit*>& targets) + { + targets.clear(); + // select any unit but not the tank (by owners threatlist) + Unit* target = GetCaster()->GetAI()->SelectTarget(SELECT_TARGET_RANDOM, 1, -GetCaster()->GetObjectSize(), true, -SPELL_IMPALED); + if (!target) + target = GetCaster()->GetAI()->SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true); // or the tank if its solo + if (!target) + return; + + GetCaster()->GetAI()->SetGUID(target->GetGUID(), DATA_COLDFLAME_GUID); + targets.push_back(target); + } + void HandleScriptEffect(SpellEffIndex effIndex) { PreventHitDefaultEffect(effIndex); - Unit* caster = GetCaster(); - uint8 count = 1; - if (GetSpellInfo()->Id == 72705) - count = 4; + GetCaster()->CastSpell(GetHitUnit(), uint32(GetEffectValue()), true); + } - for (uint8 i = 0; i < count; ++i) - caster->CastSpell(caster, uint32(GetEffectValue() + i), true); + void Register() + { + OnUnitTargetSelect += SpellUnitTargetFn(spell_marrowgar_coldflame_SpellScript::SelectTarget, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY); + OnEffect += SpellEffectFn(spell_marrowgar_coldflame_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_marrowgar_coldflame_SpellScript(); + } +}; + +class spell_marrowgar_coldflame_bonestorm : public SpellScriptLoader +{ + public: + spell_marrowgar_coldflame_bonestorm() : SpellScriptLoader("spell_marrowgar_coldflame_bonestorm") { } + + class spell_marrowgar_coldflame_SpellScript : public SpellScript + { + PrepareSpellScript(spell_marrowgar_coldflame_SpellScript); + + void HandleScriptEffect(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + for (uint8 i = 0; i < 4; ++i) + GetCaster()->CastSpell(GetHitUnit(), uint32(GetEffectValue() + i), true); } void Register() @@ -534,6 +587,7 @@ void AddSC_boss_lord_marrowgar() new npc_coldflame(); new npc_bone_spike(); new spell_marrowgar_coldflame(); + new spell_marrowgar_coldflame_bonestorm(); new spell_marrowgar_coldflame_damage(); new spell_marrowgar_bone_spike_graveyard(); new spell_marrowgar_bone_storm(); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp index e2fdb7a1b99..6924878eff0 100755 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp @@ -840,6 +840,13 @@ class spell_putricide_expunged_gas : public SpellScriptLoader return GetCaster()->GetTypeId() == TYPEID_UNIT && GetCaster()->GetInstanceScript(); } + SpellCastResult CheckCast() + { + if (!GetCaster()->getVictim()) + return SPELL_FAILED_NO_VALID_TARGETS; + return SPELL_CAST_OK; + } + void CalcDamage(SpellEffIndex /*effIndex*/) { // checked in script loading, cant be NULL here @@ -850,7 +857,7 @@ class spell_putricide_expunged_gas : public SpellScriptLoader int32 dmg = 0; uint32 bloatId = sSpellMgr->GetSpellIdForDifficulty(SPELL_GASEOUS_BLOAT, GetCaster()); - if (Aura* gasBloat = GetTargetUnit()->GetAura(bloatId)) + if (Aura* gasBloat = GetCaster()->getVictim()->GetAura(bloatId)) { uint32 stack = gasBloat->GetStackAmount(); int32 const mod = (GetCaster()->GetMap()->GetSpawnMode() & 1) ? 1500 : 1250; diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp index b341a87c176..ab16458f8b1 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp @@ -659,15 +659,17 @@ class spell_rotface_unstable_ooze_explosion : public SpellScriptLoader void CheckTarget(SpellEffIndex effIndex) { PreventHitDefaultEffect(EFFECT_0); - if (!GetTargetUnit()) + if (!GetTargetDest()) return; uint32 triggered_spell_id = GetSpellInfo()->Effects[effIndex].TriggerSpell; + float x, y, z; + GetTargetDest()->GetPosition(x, y, z); // let Rotface handle the cast - caster dies before this executes - if (InstanceScript* script = GetTargetUnit()->GetInstanceScript()) + if (InstanceScript* script = GetCaster()->GetInstanceScript()) if (Creature* rotface = script->instance->GetCreature(script->GetData64(DATA_ROTFACE))) - rotface->CastSpell(GetTargetUnit(), triggered_spell_id, true, NULL, NULL, GetCaster()->GetGUID()); + rotface->CastSpell(x, y, z, triggered_spell_id, true, NULL, NULL, GetCaster()->GetGUID()); } void Register() diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp index a237f239386..10c0cbd1331 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp @@ -506,8 +506,15 @@ class npc_green_dragon_combat_trigger : public CreatureScript me->SetReactState(REACT_PASSIVE); } - void EnterCombat(Unit* /*target*/) + void EnterCombat(Unit* target) { + if (!instance->CheckRequiredBosses(DATA_VALITHRIA_DREAMWALKER, target->ToPlayer())) + { + EnterEvadeMode(); + instance->DoCastSpellOnPlayers(LIGHT_S_HAMMER_TELEPORT); + return; + } + me->setActive(true); DoZoneInCombat(); instance->SetBossState(DATA_VALITHRIA_DREAMWALKER, IN_PROGRESS); |