From 0e91a0e54c4fd00c71ee4a7fd9d6a305110cbcc8 Mon Sep 17 00:00:00 2001 From: Trisjdc Date: Thu, 24 Jul 2014 03:40:05 +0100 Subject: Core/Spells: Solving the double dips in Hammer of the Righteous --- src/server/game/Spells/SpellEffects.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 0ab4e7c9e6e..0ee494d2898 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -625,8 +625,13 @@ void Spell::EffectSchoolDMG(SpellEffIndex effIndex) // Hammer of the Righteous if (m_spellInfo->SpellFamilyFlags[1]&0x00040000) { + float min_damage = m_caster->GetFloatValue(UNIT_FIELD_MINDAMAGE); + float max_damage = m_caster->GetFloatValue(UNIT_FIELD_MAXDAMAGE); + if (Player* player = m_caster->ToPlayer()) // UNIT_FIELD_MINDAMAGE/MAXDAMAGE already include damage bonuses, so try to get them without damage bonuses + player->CalculateMinMaxDamage(BASE_ATTACK, false, false, min_damage, max_damage); + + float average = (min_damage + max_damage) / 2; // Add main hand dps * effect[2] amount - float average = (m_caster->GetFloatValue(UNIT_FIELD_MINDAMAGE) + m_caster->GetFloatValue(UNIT_FIELD_MAXDAMAGE)) / 2; int32 count = m_caster->CalculateSpellDamage(unitTarget, m_spellInfo, EFFECT_2); damage += count * int32(average * IN_MILLISECONDS) / m_caster->GetAttackTime(BASE_ATTACK); break; -- cgit v1.2.3 From 3f9f2e3ee56832113e180c9cca01d414c1651955 Mon Sep 17 00:00:00 2001 From: Trisjdc Date: Thu, 24 Jul 2014 03:47:04 +0100 Subject: Core/Units: IsNonMeleeSpellCast will no longer return false if there's an instant cast spell still arriving at the target with the caster doing a channel --- src/server/game/Entities/Unit/Unit.cpp | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index d475a0bd6ea..87c92a40df8 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -3077,27 +3077,26 @@ bool Unit::IsNonMeleeSpellCast(bool withDelayed, bool skipChanneled, bool skipAu // We don't do loop here to explicitly show that melee spell is excluded. // Maybe later some special spells will be excluded too. - // if skipInstant then instant spells shouldn't count as being cast - if (skipInstant && m_currentSpells[CURRENT_GENERIC_SPELL] && !m_currentSpells[CURRENT_GENERIC_SPELL]->GetCastTime()) - return false; - // generic spells are cast when they are not finished and not delayed if (m_currentSpells[CURRENT_GENERIC_SPELL] && (m_currentSpells[CURRENT_GENERIC_SPELL]->getState() != SPELL_STATE_FINISHED) && (withDelayed || m_currentSpells[CURRENT_GENERIC_SPELL]->getState() != SPELL_STATE_DELAYED)) { - if (!isAutoshoot || !(m_currentSpells[CURRENT_GENERIC_SPELL]->m_spellInfo->AttributesEx2 & SPELL_ATTR2_NOT_RESET_AUTO_ACTIONS)) - return true; + if (!skipInstant || m_currentSpells[CURRENT_GENERIC_SPELL]->GetCastTime()) + { + if (!isAutoshoot || !(m_currentSpells[CURRENT_GENERIC_SPELL]->m_spellInfo->AttributesEx2 & SPELL_ATTR2_NOT_RESET_AUTO_ACTIONS)) + return true; + } } // channeled spells may be delayed, but they are still considered cast - else if (!skipChanneled && m_currentSpells[CURRENT_CHANNELED_SPELL] && + if (!skipChanneled && m_currentSpells[CURRENT_CHANNELED_SPELL] && (m_currentSpells[CURRENT_CHANNELED_SPELL]->getState() != SPELL_STATE_FINISHED)) { if (!isAutoshoot || !(m_currentSpells[CURRENT_CHANNELED_SPELL]->m_spellInfo->AttributesEx2 & SPELL_ATTR2_NOT_RESET_AUTO_ACTIONS)) return true; } // autorepeat spells may be finished or delayed, but they are still considered cast - else if (!skipAutorepeat && m_currentSpells[CURRENT_AUTOREPEAT_SPELL]) + if (!skipAutorepeat && m_currentSpells[CURRENT_AUTOREPEAT_SPELL]) return true; return false; -- cgit v1.2.3 From c541f4f5deb99522772f9ee12b06e8aedb3d87a5 Mon Sep 17 00:00:00 2001 From: Trisjdc Date: Thu, 24 Jul 2014 03:48:35 +0100 Subject: Scripts/Four Horsemen: Horsemen's main spells should only explicitly target players --- src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp b/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp index ca478244d2a..9a9e7aa6849 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp @@ -354,7 +354,7 @@ public: if (caster) { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 45.0f)) + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 45.0f, true)) DoCast(target, SPELL_PRIMARY(id)); } else -- cgit v1.2.3 From 26496375f8f180628588eabab18169cdbf3702f3 Mon Sep 17 00:00:00 2001 From: karn Date: Tue, 1 Jul 2014 17:29:19 +0200 Subject: Script/IoC: Move some spell scripts from spell_generic to isle_of_conquest cpp Signed-off-by: DDuarte --- src/server/scripts/Northrend/isle_of_conquest.cpp | 125 ++++++++++++++++++++++ src/server/scripts/Spells/spell_generic.cpp | 123 --------------------- 2 files changed, 125 insertions(+), 123 deletions(-) (limited to 'src') diff --git a/src/server/scripts/Northrend/isle_of_conquest.cpp b/src/server/scripts/Northrend/isle_of_conquest.cpp index 8cdfce90bc9..88958806f6b 100644 --- a/src/server/scripts/Northrend/isle_of_conquest.cpp +++ b/src/server/scripts/Northrend/isle_of_conquest.cpp @@ -20,6 +20,9 @@ #include "PassiveAI.h" #include "BattlegroundIC.h" #include "Player.h" +#include "Vehicle.h" +#include "SpellScript.h" +#include "SpellInfo.h" // TO-DO: This should be done with SmartAI, but yet it does not correctly support vehicles's AIs. // Even adding ReactState Passive we still have issues using SmartAI. @@ -70,7 +73,129 @@ class npc_four_car_garage : public CreatureScript } }; +class spell_gen_gunship_portal : public SpellScriptLoader +{ + public: + spell_gen_gunship_portal() : SpellScriptLoader("spell_gen_gunship_portal") { } + + class spell_gen_gunship_portal_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_gunship_portal_SpellScript); + + bool Load() override + { + return GetCaster()->GetTypeId() == TYPEID_PLAYER; + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + Player* caster = GetCaster()->ToPlayer(); + if (Battleground* bg = caster->GetBattleground()) + if (bg->GetTypeID(true) == BATTLEGROUND_IC) + bg->DoAction(1, caster->GetGUID()); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_gen_gunship_portal_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_gen_gunship_portal_SpellScript(); + } +}; + +enum ParachuteIC +{ + SPELL_PARACHUTE_IC = 66657 +}; + +class spell_gen_parachute_ic : public SpellScriptLoader +{ + public: + spell_gen_parachute_ic() : SpellScriptLoader("spell_gen_parachute_ic") { } + + class spell_gen_parachute_ic_AuraScript : public AuraScript + { + PrepareAuraScript(spell_gen_parachute_ic_AuraScript); + + void HandleTriggerSpell(AuraEffect const* /*aurEff*/) + { + if (Player* target = GetTarget()->ToPlayer()) + if (target->m_movementInfo.fallTime > 2000) + target->CastSpell(target, SPELL_PARACHUTE_IC, true); + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_gen_parachute_ic_AuraScript::HandleTriggerSpell, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_gen_parachute_ic_AuraScript(); + } +}; + +enum Launch +{ + SPELL_LAUNCH_NO_FALLING_DAMAGE = 66251 +}; + +class spell_gen_launch : public SpellScriptLoader +{ + public: + spell_gen_launch() : SpellScriptLoader("spell_gen_launch") { } + + class spell_gen_launch_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_launch_SpellScript); + + void HandleScript(SpellEffIndex /*effIndex*/) + { + if (Player* player = GetHitPlayer()) + player->AddAura(SPELL_LAUNCH_NO_FALLING_DAMAGE, player); // prevents falling damage + } + + void Launch() + { + WorldLocation const* const position = GetExplTargetDest(); + + if (Player* player = GetHitPlayer()) + { + player->ExitVehicle(); + + // A better research is needed + // There is no spell for this, the following calculation was based on void Spell::CalculateJumpSpeeds + + float speedZ = 10.0f; + float dist = position->GetExactDist2d(player->GetPositionX(), player->GetPositionY()); + float speedXY = dist; + + player->GetMotionMaster()->MoveJump(position->GetPositionX(), position->GetPositionY(), position->GetPositionZ(), speedXY, speedZ); + } + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_gen_launch_SpellScript::HandleScript, EFFECT_1, SPELL_EFFECT_FORCE_CAST); + AfterHit += SpellHitFn(spell_gen_launch_SpellScript::Launch); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_gen_launch_SpellScript(); + } +}; + void AddSC_isle_of_conquest() { new npc_four_car_garage(); + new spell_gen_gunship_portal(); + new spell_gen_parachute_ic(); + new spell_gen_launch(); } diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp index 43f33f996ad..1d5443e54d6 100644 --- a/src/server/scripts/Spells/spell_generic.cpp +++ b/src/server/scripts/Spells/spell_generic.cpp @@ -1640,93 +1640,6 @@ class spell_gen_gnomish_transporter : public SpellScriptLoader } }; -class spell_gen_gunship_portal : public SpellScriptLoader -{ - public: - spell_gen_gunship_portal() : SpellScriptLoader("spell_gen_gunship_portal") { } - - class spell_gen_gunship_portal_SpellScript : public SpellScript - { - PrepareSpellScript(spell_gen_gunship_portal_SpellScript); - - bool Load() override - { - return GetCaster()->GetTypeId() == TYPEID_PLAYER; - } - - void HandleScript(SpellEffIndex /*effIndex*/) - { - Player* caster = GetCaster()->ToPlayer(); - if (Battleground* bg = caster->GetBattleground()) - if (bg->GetTypeID(true) == BATTLEGROUND_IC) - bg->DoAction(1, caster->GetGUID()); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_gen_gunship_portal_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_gen_gunship_portal_SpellScript(); - } -}; - -enum Launch -{ - SPELL_LAUNCH_NO_FALLING_DAMAGE = 66251 -}; - -class spell_gen_launch : public SpellScriptLoader -{ - public: - spell_gen_launch() : SpellScriptLoader("spell_gen_launch") { } - - class spell_gen_launch_SpellScript : public SpellScript - { - PrepareSpellScript(spell_gen_launch_SpellScript); - - void HandleScript(SpellEffIndex /*effIndex*/) - { - if (Player* player = GetHitPlayer()) - player->AddAura(SPELL_LAUNCH_NO_FALLING_DAMAGE, player); // prevents falling damage - } - - void Launch() - { - WorldLocation const* const position = GetExplTargetDest(); - - if (Player* player = GetHitPlayer()) - { - player->ExitVehicle(); - - // A better research is needed - // There is no spell for this, the following calculation was based on void Spell::CalculateJumpSpeeds - - float speedZ = 10.0f; - float dist = position->GetExactDist2d(player->GetPositionX(), player->GetPositionY()); - float speedXY = dist; - - player->GetMotionMaster()->MoveJump(position->GetPositionX(), position->GetPositionY(), position->GetPositionZ(), speedXY, speedZ); - } - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_gen_launch_SpellScript::HandleScript, EFFECT_1, SPELL_EFFECT_FORCE_CAST); - AfterHit += SpellHitFn(spell_gen_launch_SpellScript::Launch); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_gen_launch_SpellScript(); - } -}; - - class spell_gen_lifeblood : public SpellScriptLoader { public: @@ -2783,39 +2696,6 @@ class spell_gen_parachute : public SpellScriptLoader } }; -enum ParachuteIC -{ - SPELL_PARACHUTE_IC = 66657 -}; - -class spell_gen_parachute_ic : public SpellScriptLoader -{ - public: - spell_gen_parachute_ic() : SpellScriptLoader("spell_gen_parachute_ic") { } - - class spell_gen_parachute_ic_AuraScript : public AuraScript - { - PrepareAuraScript(spell_gen_parachute_ic_AuraScript); - - void HandleTriggerSpell(AuraEffect const* /*aurEff*/) - { - if (Player* target = GetTarget()->ToPlayer()) - if (target->m_movementInfo.fallTime > 2000) - target->CastSpell(target, SPELL_PARACHUTE_IC, true); - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_gen_parachute_ic_AuraScript::HandleTriggerSpell, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_gen_parachute_ic_AuraScript(); - } -}; - enum PetSummoned { NPC_DOOMGUARD = 11859, @@ -3766,8 +3646,6 @@ void AddSC_generic_spell_scripts() new spell_gen_gadgetzan_transporter_backfire(); new spell_gen_gift_of_naaru(); new spell_gen_gnomish_transporter(); - new spell_gen_gunship_portal(); - new spell_gen_launch(); new spell_gen_lifeblood(); new spell_gen_lifebloom("spell_hexlord_lifebloom", SPELL_HEXLORD_MALACRASS_LIFEBLOOM_FINAL_HEAL); new spell_gen_lifebloom("spell_tur_ragepaw_lifebloom", SPELL_TUR_RAGEPAW_LIFEBLOOM_FINAL_HEAL); @@ -3791,7 +3669,6 @@ void AddSC_generic_spell_scripts() new spell_gen_oracle_wolvar_reputation(); new spell_gen_orc_disguise(); new spell_gen_parachute(); - new spell_gen_parachute_ic(); new spell_gen_pet_summoned(); new spell_gen_profession_research(); new spell_gen_remove_flight_auras(); -- cgit v1.2.3 From 73df8f838157333a7efec55e4cd1bc88b1829845 Mon Sep 17 00:00:00 2001 From: DDuarte Date: Thu, 24 Jul 2014 03:48:11 +0100 Subject: Scripts/IoC: Rename spell_gen_* spells to spell_ioc_* (Additions to 6bb63ab7db679d9c) Closes #12414 (PR) --- .../2014_07_24_04_world_spell_script_names.sql | 3 ++ src/server/scripts/Northrend/isle_of_conquest.cpp | 44 +++++++++++----------- 2 files changed, 25 insertions(+), 22 deletions(-) create mode 100644 sql/updates/world/2014_07_24_04_world_spell_script_names.sql (limited to 'src') diff --git a/sql/updates/world/2014_07_24_04_world_spell_script_names.sql b/sql/updates/world/2014_07_24_04_world_spell_script_names.sql new file mode 100644 index 00000000000..4a7a1ff648c --- /dev/null +++ b/sql/updates/world/2014_07_24_04_world_spell_script_names.sql @@ -0,0 +1,3 @@ +UPDATE `spell_script_names` SET `ScriptName`='spell_ioc_gunship_portal' WHERE `ScriptName`='spell_gen_gunship_portal'; +UPDATE `spell_script_names` SET `ScriptName`='spell_ioc_parachute_ic' WHERE `ScriptName`='spell_gen_parachute_ic'; +UPDATE `spell_script_names` SET `ScriptName`='spell_ioc_launch' WHERE `ScriptName`='spell_gen_launch'; diff --git a/src/server/scripts/Northrend/isle_of_conquest.cpp b/src/server/scripts/Northrend/isle_of_conquest.cpp index 88958806f6b..14763577c66 100644 --- a/src/server/scripts/Northrend/isle_of_conquest.cpp +++ b/src/server/scripts/Northrend/isle_of_conquest.cpp @@ -73,14 +73,14 @@ class npc_four_car_garage : public CreatureScript } }; -class spell_gen_gunship_portal : public SpellScriptLoader +class spell_ioc_gunship_portal : public SpellScriptLoader { public: - spell_gen_gunship_portal() : SpellScriptLoader("spell_gen_gunship_portal") { } + spell_ioc_gunship_portal() : SpellScriptLoader("spell_ioc_gunship_portal") { } - class spell_gen_gunship_portal_SpellScript : public SpellScript + class spell_ioc_gunship_portal_SpellScript : public SpellScript { - PrepareSpellScript(spell_gen_gunship_portal_SpellScript); + PrepareSpellScript(spell_ioc_gunship_portal_SpellScript); bool Load() override { @@ -97,13 +97,13 @@ class spell_gen_gunship_portal : public SpellScriptLoader void Register() override { - OnEffectHitTarget += SpellEffectFn(spell_gen_gunship_portal_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + OnEffectHitTarget += SpellEffectFn(spell_ioc_gunship_portal_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } }; SpellScript* GetSpellScript() const override { - return new spell_gen_gunship_portal_SpellScript(); + return new spell_ioc_gunship_portal_SpellScript(); } }; @@ -112,14 +112,14 @@ enum ParachuteIC SPELL_PARACHUTE_IC = 66657 }; -class spell_gen_parachute_ic : public SpellScriptLoader +class spell_ioc_parachute_ic : public SpellScriptLoader { public: - spell_gen_parachute_ic() : SpellScriptLoader("spell_gen_parachute_ic") { } + spell_ioc_parachute_ic() : SpellScriptLoader("spell_ioc_parachute_ic") { } - class spell_gen_parachute_ic_AuraScript : public AuraScript + class spell_ioc_parachute_ic_AuraScript : public AuraScript { - PrepareAuraScript(spell_gen_parachute_ic_AuraScript); + PrepareAuraScript(spell_ioc_parachute_ic_AuraScript); void HandleTriggerSpell(AuraEffect const* /*aurEff*/) { @@ -130,13 +130,13 @@ class spell_gen_parachute_ic : public SpellScriptLoader void Register() override { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_gen_parachute_ic_AuraScript::HandleTriggerSpell, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_ioc_parachute_ic_AuraScript::HandleTriggerSpell, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); } }; AuraScript* GetAuraScript() const override { - return new spell_gen_parachute_ic_AuraScript(); + return new spell_ioc_parachute_ic_AuraScript(); } }; @@ -145,14 +145,14 @@ enum Launch SPELL_LAUNCH_NO_FALLING_DAMAGE = 66251 }; -class spell_gen_launch : public SpellScriptLoader +class spell_ioc_launch : public SpellScriptLoader { public: - spell_gen_launch() : SpellScriptLoader("spell_gen_launch") { } + spell_ioc_launch() : SpellScriptLoader("spell_ioc_launch") { } - class spell_gen_launch_SpellScript : public SpellScript + class spell_ioc_launch_SpellScript : public SpellScript { - PrepareSpellScript(spell_gen_launch_SpellScript); + PrepareSpellScript(spell_ioc_launch_SpellScript); void HandleScript(SpellEffIndex /*effIndex*/) { @@ -181,21 +181,21 @@ class spell_gen_launch : public SpellScriptLoader void Register() override { - OnEffectHitTarget += SpellEffectFn(spell_gen_launch_SpellScript::HandleScript, EFFECT_1, SPELL_EFFECT_FORCE_CAST); - AfterHit += SpellHitFn(spell_gen_launch_SpellScript::Launch); + OnEffectHitTarget += SpellEffectFn(spell_ioc_launch_SpellScript::HandleScript, EFFECT_1, SPELL_EFFECT_FORCE_CAST); + AfterHit += SpellHitFn(spell_ioc_launch_SpellScript::Launch); } }; SpellScript* GetSpellScript() const override { - return new spell_gen_launch_SpellScript(); + return new spell_ioc_launch_SpellScript(); } }; void AddSC_isle_of_conquest() { new npc_four_car_garage(); - new spell_gen_gunship_portal(); - new spell_gen_parachute_ic(); - new spell_gen_launch(); + new spell_ioc_gunship_portal(); + new spell_ioc_parachute_ic(); + new spell_ioc_launch(); } -- cgit v1.2.3 From f79e7d764079e5ecdb479c30e35a21cf1c8e5e3c Mon Sep 17 00:00:00 2001 From: Trisjdc Date: Thu, 24 Jul 2014 03:52:19 +0100 Subject: Core/Spells: Unrelenting Assault shouldn't proc if the target isn't explicitly casting (turns out that UNIT_STATE_CASTING even a instant cast has a 'cast time') --- src/server/scripts/Spells/spell_warrior.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/server/scripts/Spells/spell_warrior.cpp b/src/server/scripts/Spells/spell_warrior.cpp index ac61577da5d..af2c541dbc4 100644 --- a/src/server/scripts/Spells/spell_warrior.cpp +++ b/src/server/scripts/Spells/spell_warrior.cpp @@ -501,7 +501,7 @@ class spell_warr_overpower : public SpellScriptLoader return; if (Player* target = GetHitPlayer()) - if (target->HasUnitState(UNIT_STATE_CASTING)) + if (target->IsNonMeleeSpellCast(false, false, true)) // UNIT_STATE_CASTING should not be used here, it's present during a tick for instant casts target->CastSpell(target, spellId, true); } -- cgit v1.2.3 From 40c573720080f00d124a1597a85d058e264bbdb5 Mon Sep 17 00:00:00 2001 From: Ergar Date: Thu, 24 Jul 2014 03:58:39 +0100 Subject: Scripts/Karazhan: Boss Maiden of Virtue - rewrite to events and timer adjustments Closes #12513 (PR) Signed-off-by: DDuarte --- .../Karazhan/boss_maiden_of_virtue.cpp | 135 ++++++++++----------- 1 file changed, 67 insertions(+), 68 deletions(-) (limited to 'src') diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_maiden_of_virtue.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_maiden_of_virtue.cpp index 04b58af2a4a..90306913534 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_maiden_of_virtue.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_maiden_of_virtue.cpp @@ -1,6 +1,5 @@ /* * Copyright (C) 2008-2014 TrinityCore - * Copyright (C) 2006-2009 ScriptDev2 * * 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 @@ -16,28 +15,34 @@ * with this program. If not, see . */ -/* ScriptData -SDName: Boss_Maiden_of_Virtue -SD%Complete: 100 -SDComment: -SDCategory: Karazhan -EndScriptData */ - #include "ScriptMgr.h" #include "ScriptedCreature.h" +#include "karazhan.h" + +enum Spells +{ + SPELL_REPENTANCE = 29511, + SPELL_HOLYFIRE = 29522, + SPELL_HOLYWRATH = 32445, + SPELL_HOLYGROUND = 29512, + SPELL_BERSERK = 26662 +}; -enum MaidenOfVirtue +enum Yells { - SAY_AGGRO = 0, - SAY_SLAY = 1, - SAY_REPENTANCE = 2, - SAY_DEATH = 3, - - SPELL_REPENTANCE = 29511, - SPELL_HOLYFIRE = 29522, - SPELL_HOLYWRATH = 32445, - SPELL_HOLYGROUND = 29512, - SPELL_BERSERK = 26662, + SAY_AGGRO = 0, + SAY_SLAY = 1, + SAY_REPENTANCE = 2, + SAY_DEATH = 3 +}; + +enum Events +{ + EVENT_REPENTANCE = 1, + EVENT_HOLYFIRE = 2, + EVENT_HOLYWRATH = 3, + EVENT_HOLYGROUND = 4, + EVENT_ENRAGE = 5 }; class boss_maiden_of_virtue : public CreatureScript @@ -50,27 +55,13 @@ public: return new boss_maiden_of_virtueAI(creature); } - struct boss_maiden_of_virtueAI : public ScriptedAI + struct boss_maiden_of_virtueAI : public BossAI { - boss_maiden_of_virtueAI(Creature* creature) : ScriptedAI(creature) { } - - uint32 Repentance_Timer; - uint32 Holyfire_Timer; - uint32 Holywrath_Timer; - uint32 Holyground_Timer; - uint32 Enrage_Timer; - - bool Enraged; + boss_maiden_of_virtueAI(Creature* creature) : BossAI(creature, TYPE_MAIDEN) { } void Reset() override { - Repentance_Timer = 25000 + (rand32() % 15000); - Holyfire_Timer = 8000 + (rand32() % 17000); - Holywrath_Timer = 15000 + (rand32() % 10000); - Holyground_Timer = 3000; - Enrage_Timer = 600000; - - Enraged = false; + _Reset(); } void KilledUnit(Unit* /*Victim*/) override @@ -82,11 +73,19 @@ public: void JustDied(Unit* /*killer*/) override { Talk(SAY_DEATH); + _JustDied(); } void EnterCombat(Unit* /*who*/) override { + _EnterCombat(); Talk(SAY_AGGRO); + + events.ScheduleEvent(EVENT_REPENTANCE, urand(33, 45) * IN_MILLISECONDS); + events.ScheduleEvent(EVENT_HOLYFIRE, 12 * IN_MILLISECONDS); + events.ScheduleEvent(EVENT_HOLYWRATH, urand(15, 25) * IN_MILLISECONDS); + events.ScheduleEvent(EVENT_HOLYGROUND, 3 * IN_MILLISECONDS); + events.ScheduleEvent(EVENT_ENRAGE, 600 * IN_MILLISECONDS); } void UpdateAI(uint32 diff) override @@ -94,41 +93,41 @@ public: if (!UpdateVictim()) return; - if (Enrage_Timer < diff && !Enraged) - { - DoCast(me, SPELL_BERSERK, true); - Enraged = true; - } else Enrage_Timer -= diff; - - if (Holyground_Timer <= diff) - { - DoCast(me, SPELL_HOLYGROUND, true); //Triggered so it doesn't interrupt her at all - Holyground_Timer = 3000; - } else Holyground_Timer -= diff; - - if (Repentance_Timer <= diff) - { - DoCastVictim(SPELL_REPENTANCE); - Talk(SAY_REPENTANCE); + events.Update(diff); - Repentance_Timer = urand(25000, 35000); //A little randomness on that spell - } else Repentance_Timer -= diff; - - if (Holyfire_Timer <= diff) - { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) - DoCast(target, SPELL_HOLYFIRE); - - Holyfire_Timer = urand(8000, 23000); //Anywhere from 8 to 23 seconds, good luck having several of those in a row! - } else Holyfire_Timer -= diff; + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - if (Holywrath_Timer <= diff) + while (uint32 eventId = events.ExecuteEvent()) { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) - DoCast(target, SPELL_HOLYWRATH); - - Holywrath_Timer = urand(20000, 25000); //20-30 secs sounds nice - } else Holywrath_Timer -= diff; + switch (eventId) + { + case EVENT_REPENTANCE: + DoCastVictim(SPELL_REPENTANCE); + Talk(SAY_REPENTANCE); + events.ScheduleEvent(EVENT_REPENTANCE, urand(33, 45) * IN_MILLISECONDS); + break; + case EVENT_HOLYFIRE: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50, true)) + DoCast(target, SPELL_HOLYFIRE); + events.ScheduleEvent(EVENT_HOLYFIRE, 12 * IN_MILLISECONDS); + break; + case EVENT_HOLYWRATH: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 80, true)) + DoCast(target, SPELL_HOLYWRATH); + events.ScheduleEvent(EVENT_HOLYWRATH, urand(15, 25) * IN_MILLISECONDS); + break; + case EVENT_HOLYGROUND: + DoCast(me, SPELL_HOLYGROUND, true); + events.ScheduleEvent(EVENT_HOLYGROUND, 3 * IN_MILLISECONDS); + break; + case EVENT_ENRAGE: + DoCast(me, SPELL_BERSERK, true); + break; + default: + break; + } + } DoMeleeAttackIfReady(); } -- cgit v1.2.3 From e2d6b9bf8ce25e9e44227f2ba77e1b29337b7d28 Mon Sep 17 00:00:00 2001 From: Trisjdc Date: Thu, 24 Jul 2014 04:06:49 +0100 Subject: Core/Units: Properly remove auras that don't pass IsHighestExclusiveAura --- src/server/game/Entities/Unit/Unit.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 87c92a40df8..9472fba6572 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -3510,7 +3510,7 @@ void Unit::_RemoveNoStackAurasDueToAura(Aura* aura) Spell::SendCastResult(caster->ToPlayer(), aura->GetSpellInfo(), 1, SPELL_FAILED_AURA_BOUNCED); } - RemoveAura(aura); + aura->Remove(); return; } -- cgit v1.2.3 From 2ae9afa9e86a616133b87fe1e959ab4c0fd786cb Mon Sep 17 00:00:00 2001 From: Trisjdc Date: Thu, 24 Jul 2014 04:09:38 +0100 Subject: Core/BGs: Reputation gained in BGs should be affected by SPELL_AURA_MOD_FACTION_REPUTATION_GAIN --- src/server/game/Battlegrounds/Battleground.cpp | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp index d17be29211a..61b25f1af72 100644 --- a/src/server/game/Battlegrounds/Battleground.cpp +++ b/src/server/game/Battlegrounds/Battleground.cpp @@ -675,10 +675,20 @@ void Battleground::RewardHonorToTeam(uint32 Honor, uint32 TeamID) void Battleground::RewardReputationToTeam(uint32 faction_id, uint32 Reputation, uint32 TeamID) { - if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(faction_id)) - for (BattlegroundPlayerMap::const_iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr) - if (Player* player = _GetPlayerForTeam(TeamID, itr, "RewardReputationToTeam")) - player->GetReputationMgr().ModifyReputation(factionEntry, Reputation); + FactionEntry const* factionEntry = sFactionStore.LookupEntry(faction_id); + if (!factionEntry) + return; + + for (BattlegroundPlayerMap::const_iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr) + { + Player* player = _GetPlayerForTeam(TeamID, itr, "RewardReputationToTeam"); + if (!player) + continue; + + uint32 repGain = Reputation; + AddPct(repGain, player->GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_FACTION_REPUTATION_GAIN, faction_id)); + player->GetReputationMgr().ModifyReputation(factionEntry, repGain); + } } void Battleground::UpdateWorldState(uint32 Field, uint32 Value) -- cgit v1.2.3 From b9b8d83eb67ce5641a42c5ff298b0eed156869b9 Mon Sep 17 00:00:00 2001 From: Trisjdc Date: Thu, 24 Jul 2014 04:16:36 +0100 Subject: Core/BGs: Reputation gained in BGs should be affected by SPELL_AURA_MOD_REPUTATION_GAIN An example would be Diplomacy (Racial Passive) --- src/server/game/Battlegrounds/Battleground.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'src') diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp index 61b25f1af72..86236cd0f2b 100644 --- a/src/server/game/Battlegrounds/Battleground.cpp +++ b/src/server/game/Battlegrounds/Battleground.cpp @@ -686,6 +686,7 @@ void Battleground::RewardReputationToTeam(uint32 faction_id, uint32 Reputation, continue; uint32 repGain = Reputation; + AddPct(repGain, player->GetTotalAuraModifier(SPELL_AURA_MOD_REPUTATION_GAIN)); AddPct(repGain, player->GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_FACTION_REPUTATION_GAIN, faction_id)); player->GetReputationMgr().ModifyReputation(factionEntry, repGain); } -- cgit v1.2.3 From 296956e06e02c06135aab6c5d86535b7e256a6b0 Mon Sep 17 00:00:00 2001 From: Vincent-Michael Date: Thu, 24 Jul 2014 16:14:25 +0200 Subject: Revert "Core/Spells: Death and Decay" This reverts commit 02d56e00bc256f224b7d05f90af2c0af7cb287bf. --- .../2014_07_24_08_world_spell_script_names.sql | 3 +++ src/server/game/Spells/Auras/SpellAuraEffects.cpp | 7 ------ src/server/scripts/Northrend/zone_dalaran.cpp | 6 ++--- src/server/scripts/Spells/spell_dk.cpp | 29 ++++++++++++++++++++++ 4 files changed, 35 insertions(+), 10 deletions(-) create mode 100644 sql/updates/world/2014_07_24_08_world_spell_script_names.sql (limited to 'src') diff --git a/sql/updates/world/2014_07_24_08_world_spell_script_names.sql b/sql/updates/world/2014_07_24_08_world_spell_script_names.sql new file mode 100644 index 00000000000..16c12b70c5a --- /dev/null +++ b/sql/updates/world/2014_07_24_08_world_spell_script_names.sql @@ -0,0 +1,3 @@ +DELETE FROM spell_script_names WHERE spell_id=-43265; +INSERT INTO spell_script_names VALUES +(-43265, 'spell_dk_death_and_decay'); diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 2205f0d4607..1894776c990 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -5457,13 +5457,6 @@ void AuraEffect::HandlePeriodicDummyAuraTick(Unit* target, Unit* caster) const target->DealDamage(target, damage, NULL, NODAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); break; } - // Death and Decay - if (GetSpellInfo()->SpellFamilyFlags[0] & 0x20) - { - if (caster) - target->CastCustomSpell(target, 52212, &m_amount, NULL, NULL, true, 0, this, caster->GetGUID()); - break; - } // Blood of the North // Reaping // Death Rune Mastery diff --git a/src/server/scripts/Northrend/zone_dalaran.cpp b/src/server/scripts/Northrend/zone_dalaran.cpp index 4cd0e929cd2..fb5e63a2301 100644 --- a/src/server/scripts/Northrend/zone_dalaran.cpp +++ b/src/server/scripts/Northrend/zone_dalaran.cpp @@ -202,7 +202,7 @@ class npc_minigob_manabonk : public CreatureScript me->setActive(true); } - void Reset() + void Reset() override { me->SetVisible(false); events.ScheduleEvent(EVENT_SELECT_TARGET, IN_MILLISECONDS); @@ -232,7 +232,7 @@ class npc_minigob_manabonk : public CreatureScript CharacterDatabase.CommitTransaction(trans); } - void UpdateAI(uint32 diff) + void UpdateAI(uint32 diff) override { events.Update(diff); @@ -276,7 +276,7 @@ class npc_minigob_manabonk : public CreatureScript EventMap events; }; - CreatureAI* GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const override { return new npc_minigob_manabonkAI(creature); } diff --git a/src/server/scripts/Spells/spell_dk.cpp b/src/server/scripts/Spells/spell_dk.cpp index 84608ba42f1..1d6dcdfaa6d 100644 --- a/src/server/scripts/Spells/spell_dk.cpp +++ b/src/server/scripts/Spells/spell_dk.cpp @@ -36,6 +36,7 @@ enum DeathKnightSpells SPELL_DK_BLOOD_PRESENCE = 48266, SPELL_DK_CORPSE_EXPLOSION_TRIGGERED = 43999, SPELL_DK_CORPSE_EXPLOSION_VISUAL = 51270, + SPELL_DK_DEATH_AND_DECAY_DAMAGE = 52212, SPELL_DK_DEATH_COIL_DAMAGE = 47632, SPELL_DK_DEATH_COIL_HEAL = 47633, SPELL_DK_DEATH_STRIKE_HEAL = 45470, @@ -445,6 +446,33 @@ class spell_dk_corpse_explosion : public SpellScriptLoader } }; +class spell_dk_death_and_decay : public SpellScriptLoader +{ + public: + spell_dk_death_and_decay() : SpellScriptLoader("spell_dk_death_and_decay") { } + + class spell_dk_death_and_decay_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dk_death_and_decay_AuraScript); + + void HandleDummyTick(AuraEffect const* aurEff) + { + if (Unit* caster = GetCaster()) + caster->CastCustomSpell(SPELL_DK_DEATH_AND_DECAY_DAMAGE, SPELLVALUE_BASE_POINT0, aurEff->GetAmount(), GetTarget(), true, NULL, aurEff); + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_dk_death_and_decay_AuraScript::HandleDummyTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_dk_death_and_decay_AuraScript(); + } +}; + // -47541, 52375, 59134, -62900 - Death Coil class spell_dk_death_coil : public SpellScriptLoader { @@ -1545,6 +1573,7 @@ void AddSC_deathknight_spell_scripts() new spell_dk_blood_boil(); new spell_dk_blood_gorged(); new spell_dk_corpse_explosion(); + new spell_dk_death_and_decay(); new spell_dk_death_coil(); new spell_dk_death_gate(); new spell_dk_death_grip(); -- cgit v1.2.3 From e48c37cc10ed391b3932a23ea52aa99d85d0026c Mon Sep 17 00:00:00 2001 From: untaught Date: Thu, 24 Jul 2014 15:14:40 +0100 Subject: Scripts/AreaTriggers: Fix an issue with an AT for the quest The Etymidian (Sholazar Waygate) Closes #12178 Signed-off-by: DDuarte --- src/server/scripts/World/areatrigger_scripts.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/server/scripts/World/areatrigger_scripts.cpp b/src/server/scripts/World/areatrigger_scripts.cpp index 4393f72eb1b..dcba4cf9573 100644 --- a/src/server/scripts/World/areatrigger_scripts.cpp +++ b/src/server/scripts/World/areatrigger_scripts.cpp @@ -236,11 +236,11 @@ class AreaTrigger_at_sholazar_waygate : public AreaTriggerScript switch (trigger->id) { case AT_SHOLAZAR: - player->CastSpell(player, SPELL_SHOLAZAR_TO_UNGORO_TELEPORT, false); + player->CastSpell(player, SPELL_SHOLAZAR_TO_UNGORO_TELEPORT, true); break; case AT_UNGORO: - player->CastSpell(player, SPELL_UNGORO_TO_SHOLAZAR_TELEPORT, false); + player->CastSpell(player, SPELL_UNGORO_TO_SHOLAZAR_TELEPORT, true); break; } } -- cgit v1.2.3 From 3009bb48088eda7928b5be89cf6823527e601cae Mon Sep 17 00:00:00 2001 From: untaught Date: Thu, 24 Jul 2014 15:18:04 +0100 Subject: Scripts/Darkshore: Fix an issue with the quest Gyromast's Revenge TODO: Rewrite the script in SAI Closes #11987 Signed-off-by: DDuarte --- src/server/scripts/Kalimdor/zone_darkshore.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/server/scripts/Kalimdor/zone_darkshore.cpp b/src/server/scripts/Kalimdor/zone_darkshore.cpp index 688dada2fc5..43a533ada01 100644 --- a/src/server/scripts/Kalimdor/zone_darkshore.cpp +++ b/src/server/scripts/Kalimdor/zone_darkshore.cpp @@ -349,7 +349,7 @@ public: if (Player* pHolder = GetLeaderForFollower()) AttackStart(pHolder); - SetFollowComplete(); + SetFollowComplete(true); } }; -- cgit v1.2.3 From f1a41eabaeef5468f1d510fcac253a8d7fabdf73 Mon Sep 17 00:00:00 2001 From: Shauren Date: Thu, 24 Jul 2014 17:08:53 +0200 Subject: Core/NetworkIO: Fixed boost::asio::async_write usage - packets will now be sent properly --- src/server/game/Server/Protocol/ServerPktHeader.h | 4 +++ src/server/game/Server/WorldSocket.cpp | 38 +++++++++++++++-------- src/server/game/Server/WorldSocket.h | 12 ++++--- 3 files changed, 37 insertions(+), 17 deletions(-) (limited to 'src') diff --git a/src/server/game/Server/Protocol/ServerPktHeader.h b/src/server/game/Server/Protocol/ServerPktHeader.h index 4b0dae9f0f3..fcb24cfa80d 100644 --- a/src/server/game/Server/Protocol/ServerPktHeader.h +++ b/src/server/game/Server/Protocol/ServerPktHeader.h @@ -21,6 +21,8 @@ #include "Log.h" +#pragma pack(push, 1) + struct ServerPktHeader { /** @@ -56,4 +58,6 @@ struct ServerPktHeader uint8 header[5]; }; +#pragma pack(pop) + #endif diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp index 8b4dd9b7f51..fa884090bfa 100644 --- a/src/server/game/Server/WorldSocket.cpp +++ b/src/server/game/Server/WorldSocket.cpp @@ -169,28 +169,40 @@ void WorldSocket::AsyncWrite(WorldPacket const& packet) TC_LOG_TRACE("network.opcode", "S->C: %s %s", (_worldSession ? _worldSession->GetPlayerInfo() : GetRemoteIpAddress()).c_str(), GetOpcodeNameForLogging(packet.GetOpcode()).c_str()); ServerPktHeader header(packet.size() + 2, packet.GetOpcode()); - _authCrypt.EncryptSend((uint8*)header.header, header.getHeaderLength()); - auto data = new char[header.getHeaderLength() + packet.size()]; - std::memcpy(data, (char*)header.header, header.getHeaderLength()); + std::vector data(header.getHeaderLength() + packet.size()); + std::memcpy(data.data(), header.header, header.getHeaderLength()); if (!packet.empty()) - std::memcpy(data + header.getHeaderLength(), (char const*)packet.contents(), packet.size()); + std::memcpy(&data[header.getHeaderLength()], packet.contents(), packet.size()); - // Use a shared_ptr here to prevent leaking memory after the async operation has completed - std::shared_ptr buffer(data, [=](char* _b) - { - delete[] _b; // Ensure that the data is deleted as an array - }); + std::lock_guard guard(_writeLock); - auto self(shared_from_this()); + bool needsWriteStart = _writeQueue.empty(); + _authCrypt.EncryptSend(data.data(), header.getHeaderLength()); + + _writeQueue.push(std::move(data)); - boost::asio::async_write(_socket, boost::asio::buffer(buffer.get(), header.getHeaderLength() + packet.size()), [this, self, buffer](boost::system::error_code error, std::size_t /*length*/) + if (needsWriteStart) + AsyncWrite(_writeQueue.front()); +} + +void WorldSocket::AsyncWrite(std::vector const& data) +{ + auto self(shared_from_this()); + boost::asio::async_write(_socket, boost::asio::buffer(data), [this, self](boost::system::error_code error, std::size_t /*length*/) { - if (error) + if (!error) { - _socket.close(); + std::lock_guard deleteGuard(_writeLock); + + _writeQueue.pop(); + + if (!_writeQueue.empty()) + AsyncWrite(_writeQueue.front()); } + else + _socket.close(); }); } diff --git a/src/server/game/Server/WorldSocket.h b/src/server/game/Server/WorldSocket.h index 039859b5579..07aae10513f 100644 --- a/src/server/game/Server/WorldSocket.h +++ b/src/server/game/Server/WorldSocket.h @@ -19,15 +19,16 @@ #ifndef __WORLDSOCKET_H__ #define __WORLDSOCKET_H__ -#include -#include -#include -#include #include "Common.h" #include "AuthCrypt.h" #include "Util.h" #include "WorldPacket.h" #include "WorldSession.h" +#include +#include +#include +#include +#include using boost::asio::ip::tcp; @@ -68,10 +69,13 @@ private: void AsyncReadHeader(); void AsyncReadData(size_t dataSize); + void AsyncWrite(std::vector const& data); tcp::socket _socket; char _readBuffer[4096]; + std::mutex _writeLock; + std::queue > _writeQueue; uint32 _authSeed; AuthCrypt _authCrypt; -- cgit v1.2.3 From 3de1714350f1f83ff880ee927523aabfb5731475 Mon Sep 17 00:00:00 2001 From: DDuarte Date: Thu, 24 Jul 2014 16:38:18 +0100 Subject: Scripts&DB/Feralas Convert npc_screecher_spirit to SAI SAI by @Rushor and gossip by @malcrom Closes #12630 --- sql/updates/world/2014_07_24_13_world_sai.sql | 14 ++++++++++++++ src/server/scripts/Kalimdor/zone_feralas.cpp | 23 +---------------------- 2 files changed, 15 insertions(+), 22 deletions(-) create mode 100644 sql/updates/world/2014_07_24_13_world_sai.sql (limited to 'src') diff --git a/sql/updates/world/2014_07_24_13_world_sai.sql b/sql/updates/world/2014_07_24_13_world_sai.sql new file mode 100644 index 00000000000..e63eb83831a --- /dev/null +++ b/sql/updates/world/2014_07_24_13_world_sai.sql @@ -0,0 +1,14 @@ +SET @ENTRY := 8612; + +-- Add missing gossip (by Malcrom) +DELETE FROM `gossip_menu` WHERE `entry`=1405; +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (1405,2039); +UPDATE `creature_template` SET `gossip_menu_id`=1405 WHERE entry=@ENTRY; + +-- SAI (by Rushor) +UPDATE `creature_template` SET `AIName`='SmartAI', `ScriptName`='' WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,1,64,0,100,0,0,0,0,0,33,8612,0,0,0,0,0,7,0,0,0,0,0,0,0,"Screecher Spirit - On Gossip Hello - Quest Credit 'Screecher Spirits'"), +(@ENTRY,0,1,2,61,0,100,0,0,0,0,0,18,33554432,0,0,0,0,0,1,0,0,0,0,0,0,0,"Screecher Spirit - On Gossip Hello - Set Flag Not Selectable"), +(@ENTRY,0,2,0,61,0,100,0,0,0,0,0,41,3000,0,0,0,0,0,1,0,0,0,0,0,0,0,"Screecher Spirit - On Gossip Hello - Despawn In 3000 ms"); diff --git a/src/server/scripts/Kalimdor/zone_feralas.cpp b/src/server/scripts/Kalimdor/zone_feralas.cpp index ef4ebed0387..17b5ddaf6bb 100644 --- a/src/server/scripts/Kalimdor/zone_feralas.cpp +++ b/src/server/scripts/Kalimdor/zone_feralas.cpp @@ -19,7 +19,7 @@ /* ScriptData SDName: Feralas SD%Complete: 100 -SDComment: Quest support: 3520, 2767, Special vendor Gregan Brewspewer +SDComment: Quest support: 2767, Special vendor Gregan Brewspewer SDCategory: Feralas EndScriptData */ @@ -183,26 +183,6 @@ public: }; -/*###### -## npc_screecher_spirit -######*/ - -class npc_screecher_spirit : public CreatureScript -{ -public: - npc_screecher_spirit() : CreatureScript("npc_screecher_spirit") { } - - bool OnGossipHello(Player* player, Creature* creature) override - { - player->SEND_GOSSIP_MENU(2039, creature->GetGUID()); - player->TalkedToCreature(creature->GetEntry(), creature->GetGUID()); - creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - creature->DespawnOrUnsummon(3*IN_MILLISECONDS); - return true; - } - -}; - enum GordunniTrap { GO_GORDUNNI_DIRT_MOUND = 144064, @@ -247,6 +227,5 @@ void AddSC_feralas() { new npc_gregan_brewspewer(); new npc_oox22fe(); - new npc_screecher_spirit(); new spell_gordunni_trap(); } -- cgit v1.2.3