From 315ccb4f9f5bd210a78e1c3149f4afd473139ed3 Mon Sep 17 00:00:00 2001 From: Ovalord <1Don7H4v3@m41L.com> Date: Fri, 26 Jan 2018 01:00:18 +0100 Subject: [PATCH] Core/Spells: fixed mage Flame Orb summon and Frostfire orb summon *todo: the core has a bug that prevents the orb from slowing down *frostfire orb handling --- .../4.3.4/custom_2018_01_26_00_world.sql | 15 ++ src/server/game/AI/CoreAI/PetAI.cpp | 1 - .../Entities/Creature/TemporarySummon.cpp | 2 +- src/server/game/Spells/Auras/SpellAuras.cpp | 5 +- src/server/game/Spells/SpellMgr.cpp | 6 + src/server/scripts/Spells/spell_mage.cpp | 158 ++++++++++++++++++ src/server/scripts/World/npcs_special.cpp | 84 ++++++++++ 7 files changed, 267 insertions(+), 4 deletions(-) create mode 100644 sql/updates/world/4.3.4/custom_2018_01_26_00_world.sql diff --git a/sql/updates/world/4.3.4/custom_2018_01_26_00_world.sql b/sql/updates/world/4.3.4/custom_2018_01_26_00_world.sql new file mode 100644 index 0000000000..56636f3275 --- /dev/null +++ b/sql/updates/world/4.3.4/custom_2018_01_26_00_world.sql @@ -0,0 +1,15 @@ +DELETE FROM `spell_script_names` WHERE `ScriptName` IN +('spell_mage_flame_orb', +'spell_mage_flame_orb_aoe_dummy'); + +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(82731, 'spell_mage_flame_orb'), -- Flame Orb +(92283, 'spell_mage_flame_orb'), -- Frostfire Orb +(82734, 'spell_mage_flame_orb_aoe_dummy'), +(84718, 'spell_mage_flame_orb_aoe_dummy'); + +UPDATE `creature_template` SET `minlevel`= 74, `maxlevel`= 74, `faction`= 5, `unit_flags`= 33556552, `unit_flags2`= 32768, `HoverHeight`= 2, `flags_extra`= 2, `speed_walk`= 1, `ScriptName`= 'npc_mage_orb' WHERE `entry` IN (44214, 45322); +DELETE FROM `creature_template_addon` WHERE `entry` IN (44214, 45322); +INSERT INTO `creature_template_addon` (`entry`, `bytes1`) VALUES +(44214, 33554432), +(45322, 33554432); diff --git a/src/server/game/AI/CoreAI/PetAI.cpp b/src/server/game/AI/CoreAI/PetAI.cpp index fc1c9ec3f6..f315e569d4 100644 --- a/src/server/game/AI/CoreAI/PetAI.cpp +++ b/src/server/game/AI/CoreAI/PetAI.cpp @@ -253,7 +253,6 @@ void PetAI::UpdateAI(uint32 diff) me->UpdateSpeed(MOVE_RUN); me->UpdateSpeed(MOVE_WALK); me->UpdateSpeed(MOVE_FLIGHT); - } void PetAI::UpdateAllies() diff --git a/src/server/game/Entities/Creature/TemporarySummon.cpp b/src/server/game/Entities/Creature/TemporarySummon.cpp index d113e14749..17a8be7406 100644 --- a/src/server/game/Entities/Creature/TemporarySummon.cpp +++ b/src/server/game/Entities/Creature/TemporarySummon.cpp @@ -345,7 +345,7 @@ Guardian::Guardian(SummonPropertiesEntry const* properties, Unit* owner, bool is { memset(m_statFromOwner, 0, sizeof(float)*MAX_STATS); m_unitTypeMask |= UNIT_MASK_GUARDIAN; - if (properties && (properties->Type == SUMMON_TYPE_PET || properties->Category == SUMMON_CATEGORY_PET)) + if (properties && properties->Type == SUMMON_TYPE_PET) { m_unitTypeMask |= UNIT_MASK_CONTROLABLE_GUARDIAN; InitCharmInfo(); diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp index 0786250b72..64a3124de0 100644 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -150,7 +150,7 @@ void AuraApplication::_InitFlags(Unit* caster, uint8 effMask) _flags |= positiveFound ? AFLAG_POSITIVE : AFLAG_NEGATIVE; } - if (GetBase()->GetSpellInfo()->HasAttribute(SPELL_ATTR8_AURA_SEND_AMOUNT)) + if (GetBase()->GetSpellInfo()->HasAttribute(SPELL_ATTR8_AURA_SEND_AMOUNT) || GetBase()->HasEffectType(SPELL_AURA_OVERRIDE_ACTIONBAR_SPELLS)) _flags |= AFLAG_ANY_EFFECT_AMOUNT_SENT; } @@ -1032,7 +1032,8 @@ bool Aura::CanBeSaved() const bool Aura::CanBeSentToClient() const { - return !IsPassive() || GetSpellInfo()->HasAreaAuraEffect() || HasEffectType(SPELL_AURA_ABILITY_IGNORE_AURASTATE) || HasEffectType(SPELL_AURA_CAST_WHILE_WALKING); + return !IsPassive() || GetSpellInfo()->HasAreaAuraEffect() || HasEffectType(SPELL_AURA_ABILITY_IGNORE_AURASTATE) + || HasEffectType(SPELL_AURA_CAST_WHILE_WALKING) || HasEffectType(SPELL_AURA_OVERRIDE_ACTIONBAR_SPELLS); } bool Aura::IsSingleTargetWith(Aura const* aura) const diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index f78722b1bc..d2801a8008 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -2844,6 +2844,12 @@ void SpellMgr::LoadSpellInfoCorrections() spellInfo->Effects[EFFECT_0].Effect = 0; }); + // Flame Orb / Frostfire Orb + ApplySpellFix({ 82690, 84717 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].Amplitude = 1000; + }); + ApplySpellFix({ 63665, // Charge (Argent Tournament emote on riders) 31298, // Sleep (needs target selection script) diff --git a/src/server/scripts/Spells/spell_mage.cpp b/src/server/scripts/Spells/spell_mage.cpp index 57af21af00..6864d676ab 100644 --- a/src/server/scripts/Spells/spell_mage.cpp +++ b/src/server/scripts/Spells/spell_mage.cpp @@ -53,6 +53,23 @@ enum MageSpells SPELL_MAGE_FROST_NOVA = 122, SPELL_MAGE_FROST_WARDING_R1 = 11189, SPELL_MAGE_FROST_WARDING_TRIGGERED = 57776, + + SPELL_MAGE_FLAME_ORB_DUMMY = 82731, + SPELL_MAGE_FLAME_ORB_SUMMON = 84765, + SPELL_MAGE_FLAME_ORB_AOE = 82734, + SPELL_MAGE_FLAME_ORB_BEAM_DUMMY = 86719, + SPELL_MAGE_FLAME_ORB_DAMAGE = 82739, + SPELL_MAGE_FLAME_ORB_SELF_SNARE = 82736, + + SPELL_MAGE_FROSTFIRE_ORB_DUMMY = 92283, + SPELL_MAGE_FROSTFIRE_ORB_SUMMON = 84714, + SPELL_MAGE_FROSTFIRE_ORB_AOE = 84718, + + SPELL_MAGE_FROSTFIRE_ORB_DAMAGE = 95969, + SPELL_MAGE_FROSTFIRE_ORB_DAMAGE_SLOW = 84721, + + SPELL_MAGE_FROSTFIRE_BOLT_CHILL_EFFECT = 44614, + SPELL_MAGE_IMPROVED_POLYMORPH_RANK_1 = 11210, SPELL_MAGE_IMPROVED_POLYMORPH_STUN_RANK_1 = 83046, SPELL_MAGE_IMPROVED_POLYMORPH_MARKER = 87515, @@ -1693,6 +1710,145 @@ public: } }; +// 82731 - Flame Orb +class spell_mage_flame_orb: public SpellScriptLoader +{ + public: + spell_mage_flame_orb() : SpellScriptLoader("spell_mage_flame_orb") { } + + class spell_mage_flame_orb_SpellScript : public SpellScript + { + PrepareSpellScript(spell_mage_flame_orb_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo( + { + SPELL_MAGE_FLAME_ORB_DUMMY, + SPELL_MAGE_FROSTFIRE_ORB_DUMMY, + SPELL_MAGE_FLAME_ORB_SUMMON, + SPELL_MAGE_FROSTFIRE_ORB_SUMMON + }); + } + + bool Load() override + { + dummySpellId = GetSpellInfo()->Id; + return true; + } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + if (Unit* caster = GetCaster()) + { + switch (dummySpellId) + { + case SPELL_MAGE_FLAME_ORB_DUMMY: + caster->CastSpell(caster, SPELL_MAGE_FLAME_ORB_SUMMON, true); + break; + case SPELL_MAGE_FROSTFIRE_ORB_DUMMY: + caster->CastSpell(caster, SPELL_MAGE_FROSTFIRE_ORB_SUMMON, true); + break; + default: + break; + } + } + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_mage_flame_orb_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + + private: + uint32 dummySpellId; + }; + + SpellScript* GetSpellScript() const override + { + return new spell_mage_flame_orb_SpellScript(); + } +}; + +// 82734 - Flame Orb dummy AOE +class spell_mage_flame_orb_aoe_dummy: public SpellScriptLoader +{ + public: + spell_mage_flame_orb_aoe_dummy() : SpellScriptLoader("spell_mage_flame_orb_aoe_dummy") { } + + class spell_mage_flame_orb_aoe_dummy_SpellScript : public SpellScript + { + PrepareSpellScript(spell_mage_flame_orb_aoe_dummy_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo( + { + SPELL_MAGE_FLAME_ORB_AOE, + SPELL_MAGE_FROSTFIRE_ORB_AOE, + SPELL_MAGE_FLAME_ORB_BEAM_DUMMY, + SPELL_MAGE_FROSTFIRE_ORB_DAMAGE, + SPELL_MAGE_FROSTFIRE_ORB_DAMAGE_SLOW, + SPELL_MAGE_FLAME_ORB_DAMAGE, + SPELL_MAGE_FLAME_ORB_SELF_SNARE + }); + } + + bool Load() override + { + dummySpellId = GetSpellInfo()->Id; + return true; + } + + void FilterTargets(std::list& targets) + { + if (targets.empty()) + return; + + targets.sort(Trinity::ObjectDistanceOrderPred(GetCaster(), true)); + targets.resize(1); + } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + if (TempSummon* caster = GetCaster()->ToTempSummon()) + if (Unit* summoner = caster->GetSummoner()) + if (Unit* target = GetHitUnit()) + { + switch (dummySpellId) + { + case SPELL_MAGE_FLAME_ORB_AOE: + caster->CastSpell(caster, SPELL_MAGE_FLAME_ORB_SELF_SNARE, true); + caster->CastSpell(target, SPELL_MAGE_FLAME_ORB_BEAM_DUMMY, true); + summoner->CastSpell(target, SPELL_MAGE_FLAME_ORB_DAMAGE, true); + break; + case SPELL_MAGE_FROSTFIRE_ORB_AOE: + caster->CastSpell(caster, SPELL_MAGE_FLAME_ORB_SELF_SNARE, true); + caster->CastSpell(caster, SPELL_MAGE_FLAME_ORB_BEAM_DUMMY, true); + // summoner->CastSpell(target, target->HasAura(SPELL_MAGE_FROSTFIRE_BOLT_CHILL_EFFECT) ? SPELL_MAGE_FROSTFIRE_ORB_DAMAGE_SLOW : SPELL_MAGE_FROSTFIRE_ORB_DAMAGE, true); + break; + default: + break; + } + } + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_mage_flame_orb_aoe_dummy_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY); + OnEffectHitTarget += SpellEffectFn(spell_mage_flame_orb_aoe_dummy_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + + private: + uint32 dummySpellId; + }; + + SpellScript* GetSpellScript() const override + { + return new spell_mage_flame_orb_aoe_dummy_SpellScript(); + } +}; + void AddSC_mage_spell_scripts() { new spell_mage_arcane_potency(); @@ -1705,6 +1861,8 @@ void AddSC_mage_spell_scripts() RegisterAuraScript(spell_mage_dragon_breath); new spell_mage_early_frost(); new spell_mage_fire_frost_ward(); + new spell_mage_flame_orb(); + new spell_mage_flame_orb_aoe_dummy(); new spell_mage_focus_magic(); new spell_mage_frostbolt(); new spell_mage_ice_barrier(); diff --git a/src/server/scripts/World/npcs_special.cpp b/src/server/scripts/World/npcs_special.cpp index 8aa55a80be..86816e19cf 100644 --- a/src/server/scripts/World/npcs_special.cpp +++ b/src/server/scripts/World/npcs_special.cpp @@ -3011,6 +3011,89 @@ public: } }; +enum MageOrb +{ + EVENT_START_MOVING = 1, + EVENT_APPLY_PERIODIC_EFFECT = 2, + EVENT_EXPLODE = 3, + + SPELL_FLAME_ORB_AURA = 82690, + SPELL_FROSTFIRE_ORB_AURA = 84717, + + NPC_FLAME_ORB = 44214, + NPC_FROSTFIRE_ORB = 45322, + +}; + +// Frostfire Orb / Flaming Orb +class npc_mage_orb : public CreatureScript +{ + public: + npc_mage_orb() : CreatureScript("npc_mage_orb") { } + + struct npc_mage_orbAI : public ScriptedAI + { + npc_mage_orbAI(Creature* creature) : ScriptedAI(creature) { } + + void IsSummonedBy(Unit* /*summoner*/) override + { + events.ScheduleEvent(EVENT_START_MOVING, Milliseconds(1)); + events.ScheduleEvent(EVENT_APPLY_PERIODIC_EFFECT, Milliseconds(400)); + me->m_ControlledByPlayer = false; + } + + void EnterEvadeMode(EvadeReason why) override + { + me->Yell("evade mode triggered", LANG_UNIVERSAL, 0); + } + + void SpellHitTarget(Unit* target, SpellInfo const* spell) override + { + me->UpdateSpeed(MOVE_RUN); + } + + void UpdateAI(uint32 diff) override + { + events.Update(diff); + + if (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_START_MOVING: + { + me->GetMotionMaster()->Clear(); + pos.SetOrientation(me->GetOrientation()); + pos.m_positionX = me->GetPositionX() + cos(pos.GetOrientation()) * 100.0f; + pos.m_positionY = me->GetPositionY() + sin(pos.GetOrientation()) * 100.0f; + float ground; + me->GetMap()->GetWaterOrGroundLevel(me->GetPhases(), pos.GetPositionX(), pos.GetPositionY(), me->GetPositionZ(), &ground); + pos.m_positionZ = ground; + Movement::MoveSplineInit init(me); + init.SetSmooth(); + init.MoveTo(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), false); + init.Launch(); + break; + } + case EVENT_APPLY_PERIODIC_EFFECT: + DoCastSelf(me->GetEntry() == NPC_FLAME_ORB ? SPELL_FLAME_ORB_AURA : SPELL_FROSTFIRE_ORB_AURA, true); + break; + default: + break; + } + } + } + private: + EventMap events; + Position pos; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_mage_orbAI(creature); + } +}; + void AddSC_npcs_special() { new npc_air_force_bots(); @@ -3038,4 +3121,5 @@ void AddSC_npcs_special() new npc_train_wrecker(); new npc_argent_squire_gruntling(); new npc_bountiful_table(); + new npc_mage_orb(); }