aboutsummaryrefslogtreecommitdiff
path: root/src/server/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/scripts')
-rw-r--r--src/server/scripts/Commands/cs_gobject.cpp11
-rw-r--r--src/server/scripts/Commands/cs_mmaps.cpp4
-rw-r--r--src/server/scripts/Commands/cs_modify.cpp10
-rw-r--r--src/server/scripts/EasternKingdoms/zone_tirisfal_glades.cpp13
-rw-r--r--src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp4
-rw-r--r--src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp7
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp2
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp194
-rw-r--r--src/server/scripts/Spells/spell_generic.cpp45
-rw-r--r--src/server/scripts/Spells/spell_quest.cpp41
-rw-r--r--src/server/scripts/Spells/spell_warrior.cpp23
-rw-r--r--src/server/scripts/World/chat_log.cpp225
12 files changed, 363 insertions, 216 deletions
diff --git a/src/server/scripts/Commands/cs_gobject.cpp b/src/server/scripts/Commands/cs_gobject.cpp
index 423a47eb3c8..ce0bee0d8c5 100644
--- a/src/server/scripts/Commands/cs_gobject.cpp
+++ b/src/server/scripts/Commands/cs_gobject.cpp
@@ -166,7 +166,11 @@ public:
// fill the gameobject data and save to the db
object->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), player->GetPhaseMaskForSpawn());
+ // delete the old object and do a clean load from DB with a fresh new GameObject instance.
+ // this is required to avoid weird behavior and memory leaks
+ delete object;
+ object = new GameObject();
// this will generate a new guid if the object is in an instance
if (!object->LoadGameObjectFromDB(guidLow, map))
{
@@ -209,6 +213,13 @@ public:
uint32 objectId = atoi(id);
+ if (!sObjectMgr->GetGameObjectTemplate(objectId))
+ {
+ handler->PSendSysMessage(LANG_GAMEOBJECT_NOT_EXIST, objectId);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
player->SummonGameObject(objectId, x, y, z, ang, 0, 0, rot2, rot3, spawntm);
return true;
diff --git a/src/server/scripts/Commands/cs_mmaps.cpp b/src/server/scripts/Commands/cs_mmaps.cpp
index 61598bf0945..47cb5636672 100644
--- a/src/server/scripts/Commands/cs_mmaps.cpp
+++ b/src/server/scripts/Commands/cs_mmaps.cpp
@@ -127,8 +127,8 @@ public:
int32 gx = 32 - player->GetPositionX() / SIZE_OF_GRIDS;
int32 gy = 32 - player->GetPositionY() / SIZE_OF_GRIDS;
- handler->PSendSysMessage("%03u%02i%02i.mmtile", player->GetMapId(), gy, gx);
- handler->PSendSysMessage("gridloc [%i, %i]", gx, gy);
+ handler->PSendSysMessage("%03u%02i%02i.mmtile", player->GetMapId(), gx, gy);
+ handler->PSendSysMessage("gridloc [%i, %i]", gy, gx);
// calculate navmesh tile location
dtNavMesh const* navmesh = MMAP::MMapFactory::createOrGetMMapManager()->GetNavMesh(handler->GetSession()->GetPlayer()->GetMapId());
diff --git a/src/server/scripts/Commands/cs_modify.cpp b/src/server/scripts/Commands/cs_modify.cpp
index c2d6bf47154..4cd7228a24a 100644
--- a/src/server/scripts/Commands/cs_modify.cpp
+++ b/src/server/scripts/Commands/cs_modify.cpp
@@ -476,7 +476,7 @@ public:
return false;
}
- Player* target = handler->getSelectedPlayer();
+ Player* target = handler->getSelectedPlayerOrSelf();
if (!target)
{
handler->SendSysMessage(LANG_NO_CHAR_SELECTED);
@@ -524,7 +524,7 @@ public:
return false;
}
- Player* target = handler->getSelectedPlayer();
+ Player* target = handler->getSelectedPlayerOrSelf();
if (!target)
{
handler->SendSysMessage(LANG_NO_CHAR_SELECTED);
@@ -569,7 +569,7 @@ public:
return false;
}
- Player* target = handler->getSelectedPlayer();
+ Player* target = handler->getSelectedPlayerOrSelf();
if (!target)
{
handler->SendSysMessage(LANG_NO_CHAR_SELECTED);
@@ -614,7 +614,7 @@ public:
return false;
}
- Player* target = handler->getSelectedPlayer();
+ Player* target = handler->getSelectedPlayerOrSelf();
if (!target)
{
handler->SendSysMessage(LANG_NO_CHAR_SELECTED);
@@ -659,7 +659,7 @@ public:
return false;
}
- Player* target = handler->getSelectedPlayer();
+ Player* target = handler->getSelectedPlayerOrSelf();
if (!target)
{
handler->SendSysMessage(LANG_NO_CHAR_SELECTED);
diff --git a/src/server/scripts/EasternKingdoms/zone_tirisfal_glades.cpp b/src/server/scripts/EasternKingdoms/zone_tirisfal_glades.cpp
index 925d0d73a70..e11e387ab0a 100644
--- a/src/server/scripts/EasternKingdoms/zone_tirisfal_glades.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_tirisfal_glades.cpp
@@ -177,12 +177,13 @@ public:
if (player->GetQuestStatus(QUEST_ULAG) != QUEST_STATUS_INCOMPLETE)
return false;
- if (GameObject* pTrigger = player->FindNearestGameObject(GO_TRIGGER, 30.0f))
- {
- pTrigger->SetGoState(GO_STATE_READY);
- player->SummonCreature(NPC_ULAG, 2390.26f, 336.47f, 40.01f, 2.26f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 300000);
- return false;
- }
+ if (!player->FindNearestCreature(NPC_ULAG, 50.0f))
+ if (GameObject* pTrigger = player->FindNearestGameObject(GO_TRIGGER, 30.0f))
+ {
+ pTrigger->SetGoState(GO_STATE_READY);
+ player->SummonCreature(NPC_ULAG, 2390.26f, 336.47f, 40.01f, 2.26f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 300000);
+ return false;
+ }
return false;
}
diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp
index d0b0db2e1ab..8ac095971bc 100644
--- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp
+++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp
@@ -229,14 +229,14 @@ class npc_onyx_flamecaller : public CreatureScript
void IsSummonedBy(Unit* /*summoner*/) OVERRIDE
{
- // Let Zarithrian count as summoner. _instance cant be null since we got GetRubySanctumAI
+ // Let Zarithrian count as summoner.
if (Creature* zarithrian = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_GENERAL_ZARITHRIAN)))
zarithrian->AI()->JustSummoned(me);
}
void WaypointReached(uint32 waypointId) OVERRIDE
{
- if (waypointId == MAX_PATH_FLAMECALLER_WAYPOINTS || waypointId == MAX_PATH_FLAMECALLER_WAYPOINTS*2)
+ if (waypointId == MAX_PATH_FLAMECALLER_WAYPOINTS - 1 || waypointId == MAX_PATH_FLAMECALLER_WAYPOINTS * 2 - 1)
{
DoZoneInCombat();
SetEscortPaused(true);
diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp
index c35c9ba2d11..47c876f2a52 100644
--- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp
+++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp
@@ -394,6 +394,13 @@ class boss_halion : public CreatureScript
if (events.IsInPhase(PHASE_TWO))
return;
+ // Rough radius, it is not an exactly perfect circle
+ if (me->GetDistance2d(HalionControllerSpawnPos.GetPositionX(), HalionControllerSpawnPos.GetPositionY()) > 48.5f)
+ {
+ EnterEvadeMode();
+ return;
+ }
+
generic_halionAI::UpdateAI(diff);
}
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp
index d0a25d2b216..c98a3db2334 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp
@@ -116,6 +116,7 @@ class instance_ulduar : public InstanceMapScript
SetBossNumber(MAX_ENCOUNTER);
LoadDoorData(doorData);
LoadMinionData(minionData);
+ LeviathanGUID = 0;
IgnisGUID = 0;
RazorscaleGUID = 0;
RazorscaleController = 0;
@@ -154,6 +155,7 @@ class instance_ulduar : public InstanceMapScript
keepersCount = 0;
conSpeedAtory = false;
Unbroken = true;
+ IsDriveMeCrazyEligible = true;
_algalonSummoned = false;
_summonAlgalon = false;
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp
index cc37dde57dd..fe29f4e9f7c 100644
--- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp
@@ -18,28 +18,25 @@
/* ScriptData
SDName: Boss_Ingvar_The_Plunderer
SD%Complete: 95
-SDComment: Some Problems with Annhylde Movement, Blizzlike Timers (just shadow axe summon needs a new timer)
-SDCategory: Udgarde Keep
+SDComment: Blizzlike Timers (just shadow axe summon needs a new timer)
+SDCategory: Utgarde Keep
EndScriptData */
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
+#include "SpellScript.h"
+#include "SpellAuraEffects.h"
#include "utgarde_keep.h"
enum Yells
{
- // Ingvar (Human)
- SAY_AGGRO_1 = 0,
- SAY_SLAY_1 = 1,
- SAY_DEATH_1 = 2,
-
- // Ingvar (Undead)
- SAY_AGGRO_2 = 3,
- SAY_SLAY_2 = 4,
- SAY_DEATH_2 = 5,
+ // Ingvar (Human/Undead)
+ SAY_AGGRO = 0,
+ SAY_SLAY = 1,
+ SAY_DEATH = 2,
// Annhylde The Caller
- YELL_RESURRECT = 0
+ YELL_RESURRECT = 0
};
enum Events
@@ -83,8 +80,10 @@ enum Spells
SPELL_DARK_SMASH = 42723,
SPELL_DREADFUL_ROAR = 42729,
SPELL_WOE_STRIKE = 42730,
+ SPELL_WOE_STRIKE_EFFECT = 42739,
SPELL_SHADOW_AXE_SUMMON = 42748,
+ SPELL_SHADOW_AXE_PERIODIC_DAMAGE = 42750,
// Spells for Annhylde
SPELL_SCOURG_RESURRECTION_HEAL = 42704, // Heal Max + DummyAura
@@ -105,16 +104,14 @@ class boss_ingvar_the_plunderer : public CreatureScript
struct boss_ingvar_the_plundererAI : public BossAI
{
- boss_ingvar_the_plundererAI(Creature* creature) : BossAI(creature, DATA_INGVAR)
- {
- _isUndead = false;
- }
+ boss_ingvar_the_plundererAI(Creature* creature) : BossAI(creature, DATA_INGVAR) { }
void Reset() OVERRIDE
{
- _isUndead = false;
+ if (me->GetEntry() != NPC_INGVAR)
+ me->UpdateEntry(NPC_INGVAR);
- me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_NOT_SELECTABLE);
_Reset();
events.SetPhase(PHASE_HUMAN);
@@ -132,12 +129,12 @@ class boss_ingvar_the_plunderer : public CreatureScript
me->RemoveAllAuras();
DoCast(me, SPELL_INGVAR_FEIGN_DEATH, true);
- me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_NOT_SELECTABLE);
events.SetPhase(PHASE_EVENT);
events.ScheduleEvent(EVENT_SUMMON_BANSHEE, 3 * IN_MILLISECONDS, 0, PHASE_EVENT);
- Talk(SAY_DEATH_1);
+ Talk(SAY_DEATH);
}
if (events.IsInPhase(PHASE_EVENT))
@@ -152,26 +149,22 @@ class boss_ingvar_the_plunderer : public CreatureScript
void StartZombiePhase()
{
- _isUndead = true;
me->RemoveAura(SPELL_INGVAR_FEIGN_DEATH);
- DoCast(me, SPELL_INGVAR_TRANSFORM, true); /// @todo: should be death persistent
+ DoCast(me, SPELL_INGVAR_TRANSFORM, true);
+ me->UpdateEntry(NPC_INGVAR_UNDEAD);
events.ScheduleEvent(EVENT_JUST_TRANSFORMED, 2 * IN_MILLISECONDS, 0, PHASE_EVENT);
-
- Talk(SAY_AGGRO_2);
}
void EnterCombat(Unit* /*who*/) OVERRIDE
{
_EnterCombat();
-
- if (!_isUndead)
- Talk(SAY_AGGRO_1);
+ Talk(SAY_AGGRO);
}
void JustDied(Unit* /*killer*/) OVERRIDE
{
_JustDied();
- Talk(SAY_DEATH_2);
+ Talk(SAY_DEATH);
}
void ScheduleSecondPhase()
@@ -183,9 +176,10 @@ class boss_ingvar_the_plunderer : public CreatureScript
events.ScheduleEvent(EVENT_SHADOW_AXE, 30*IN_MILLISECONDS, 0, PHASE_UNDEAD);
}
- void KilledUnit(Unit* /*victim*/) OVERRIDE
+ void KilledUnit(Unit* who) OVERRIDE
{
- Talk(_isUndead ? SAY_SLAY_1 : SAY_SLAY_2);
+ if (who->GetTypeId() == TYPEID_PLAYER)
+ Talk(SAY_SLAY);
}
void UpdateAI(uint32 diff) OVERRIDE
@@ -220,7 +214,7 @@ class boss_ingvar_the_plunderer : public CreatureScript
events.ScheduleEvent(EVENT_SMASH, urand(12, 16)*IN_MILLISECONDS, 0, PHASE_HUMAN);
break;
case EVENT_JUST_TRANSFORMED:
- me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_NOT_SELECTABLE);
DoZoneInCombat();
ScheduleSecondPhase();
return;
@@ -241,20 +235,18 @@ class boss_ingvar_the_plunderer : public CreatureScript
events.ScheduleEvent(EVENT_WOE_STRIKE, urand(10, 14)*IN_MILLISECONDS, 0, PHASE_UNDEAD);
break;
case EVENT_SHADOW_AXE:
- if (Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 1))
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true))
DoCast(target, SPELL_SHADOW_AXE_SUMMON);
-
events.ScheduleEvent(EVENT_SHADOW_AXE, 30*IN_MILLISECONDS, 0, PHASE_UNDEAD);
break;
+ default:
+ break;
}
}
if (!events.IsInPhase(PHASE_EVENT))
DoMeleeAttackIfReady();
}
-
- private:
- bool _isUndead;
};
CreatureAI* GetAI(Creature* creature) const OVERRIDE
@@ -279,12 +271,8 @@ class npc_annhylde_the_caller : public CreatureScript
{
_events.Reset();
- //! HACK: Creature's can't have MOVEMENTFLAG_FLYING
- me->SetHover(true);
-
me->GetPosition(x, y, z);
- DoTeleportTo(x+1, y, z+30);
- me->GetMotionMaster()->MovePoint(1, x, y, z+15);
+ me->GetMotionMaster()->MovePoint(1, x, y, z - 15.0f);
}
void MovementInform(uint32 type, uint32 id) OVERRIDE
@@ -339,7 +327,7 @@ class npc_annhylde_the_caller : public CreatureScript
ingvar->AI()->DoAction(ACTION_START_PHASE_2);
}
- me->GetMotionMaster()->MovePoint(2, x+1, y, z+30);
+ me->GetMotionMaster()->MovePoint(2, x, y, z + 15.0f);
break;
default:
break;
@@ -359,52 +347,112 @@ class npc_annhylde_the_caller : public CreatureScript
}
};
-enum ShadowAxe
-{
- SPELL_SHADOW_AXE_DAMAGE = 42750,
- H_SPELL_SHADOW_AXE_DAMAGE = 59719,
- POINT_TARGET = 28
-};
-
class npc_ingvar_throw_dummy : public CreatureScript
{
-public:
- npc_ingvar_throw_dummy() : CreatureScript("npc_ingvar_throw_dummy") { }
+ public:
+ npc_ingvar_throw_dummy() : CreatureScript("npc_ingvar_throw_dummy") { }
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return new npc_ingvar_throw_dummyAI(creature);
- }
+ struct npc_ingvar_throw_dummyAI : public ScriptedAI
+ {
+ npc_ingvar_throw_dummyAI(Creature* creature) : ScriptedAI(creature) { }
+
+ void Reset() OVERRIDE
+ {
+ me->SetReactState(REACT_PASSIVE);
+
+ if (Creature* target = me->FindNearestCreature(NPC_THROW_TARGET, 200.0f))
+ {
+ float x, y, z;
+ target->GetPosition(x, y, z);
+ me->GetMotionMaster()->MoveCharge(x, y, z);
+ target->DespawnOrUnsummon();
+ }
+ else
+ me->DespawnOrUnsummon();
+ }
+
+ void MovementInform(uint32 type, uint32 id) OVERRIDE
+ {
+ if (type == EFFECT_MOTION_TYPE && id == EVENT_CHARGE)
+ {
+ me->CastSpell(me, SPELL_SHADOW_AXE_PERIODIC_DAMAGE, true);
+ me->DespawnOrUnsummon(10000);
+ }
+ }
+ };
- struct npc_ingvar_throw_dummyAI : public ScriptedAI
- {
- npc_ingvar_throw_dummyAI(Creature* creature) : ScriptedAI(creature)
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
{
+ return new npc_ingvar_throw_dummyAI(creature);
}
+};
+
+// 42912 - Summon Banshee
+class spell_ingvar_summon_banshee : public SpellScriptLoader
+{
+ public:
+ spell_ingvar_summon_banshee() : SpellScriptLoader("spell_ingvar_summon_banshee") { }
- void Reset() OVERRIDE
+ class spell_ingvar_summon_banshee_SpellScript : public SpellScript
{
- if (Creature* target = me->FindNearestCreature(NPC_THROW_TARGET, 50.0f))
+ PrepareSpellScript(spell_ingvar_summon_banshee_SpellScript);
+
+ void SetDest(SpellDestination& dest)
{
- float x, y, z;
- target->GetPosition(x, y, z);
- me->GetMotionMaster()->MoveCharge(x, y, z, 42.0f, POINT_TARGET);
- target->DisappearAndDie();
+ dest.RelocateOffset({ 0.0f, 0.0f, 30.0f, 0.0f });
}
- else
- me->DisappearAndDie();
+
+ void Register() OVERRIDE
+ {
+ OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_ingvar_summon_banshee_SpellScript::SetDest, EFFECT_0, TARGET_DEST_CASTER_BACK);
+ }
+ };
+
+ SpellScript* GetSpellScript() const OVERRIDE
+ {
+ return new spell_ingvar_summon_banshee_SpellScript();
}
+};
- void MovementInform(uint32 type, uint32 id) OVERRIDE
+// 42730, 59735 - Woe Strike
+class spell_ingvar_woe_strike : public SpellScriptLoader
+{
+ public:
+ spell_ingvar_woe_strike() : SpellScriptLoader("spell_ingvar_woe_strike") { }
+
+ class spell_ingvar_woe_strike_AuraScript : public AuraScript
{
- if (type == EFFECT_MOTION_TYPE && id == POINT_TARGET)
+ PrepareAuraScript(spell_ingvar_woe_strike_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_WOE_STRIKE_EFFECT))
+ return false;
+ return true;
+ }
+
+ bool CheckProc(ProcEventInfo& eventInfo)
+ {
+ return eventInfo.GetHealInfo()->GetHeal();
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+ GetTarget()->CastSpell(eventInfo.GetActor(), SPELL_WOE_STRIKE_EFFECT, true, NULL, aurEff);
+ }
+
+ void Register() OVERRIDE
{
- DoCast(me, SPELL_SHADOW_AXE_DAMAGE);
- me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
- me->DespawnOrUnsummon(10000);
+ DoCheckProc += AuraCheckProcFn(spell_ingvar_woe_strike_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_ingvar_woe_strike_AuraScript::HandleProc, EFFECT_1, SPELL_AURA_PROC_TRIGGER_SPELL);
}
+ };
+
+ AuraScript* GetAuraScript() const OVERRIDE
+ {
+ return new spell_ingvar_woe_strike_AuraScript();
}
- };
};
void AddSC_boss_ingvar_the_plunderer()
@@ -412,4 +460,6 @@ void AddSC_boss_ingvar_the_plunderer()
new boss_ingvar_the_plunderer();
new npc_annhylde_the_caller();
new npc_ingvar_throw_dummy();
+ new spell_ingvar_summon_banshee();
+ new spell_ingvar_woe_strike();
}
diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp
index 68c16a1b2d6..65aa22c776d 100644
--- a/src/server/scripts/Spells/spell_generic.cpp
+++ b/src/server/scripts/Spells/spell_generic.cpp
@@ -711,7 +711,7 @@ class spell_gen_clone : public SpellScriptLoader
void HandleScriptEffect(SpellEffIndex effIndex)
{
PreventHitDefaultEffect(effIndex);
- GetHitUnit()->CastSpell(GetCaster(), GetEffectValue(), true);
+ GetHitUnit()->CastSpell(GetCaster(), uint32(GetEffectValue()), true);
}
void Register() OVERRIDE
@@ -751,10 +751,7 @@ class spell_gen_clone_weapon : public SpellScriptLoader
void HandleScriptEffect(SpellEffIndex effIndex)
{
PreventHitDefaultEffect(effIndex);
- Unit* caster = GetCaster();
-
- if (Unit* target = GetHitUnit())
- caster->CastSpell(target, GetEffectValue(), true);
+ GetHitUnit()->CastSpell(GetCaster(), uint32(GetEffectValue()), true);
}
void Register() OVERRIDE
@@ -778,8 +775,6 @@ class spell_gen_clone_weapon_aura : public SpellScriptLoader
{
PrepareAuraScript(spell_gen_clone_weapon_auraScript);
- uint32 prevItem;
-
bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
{
if (!sSpellMgr->GetSpellInfo(SPELL_COPY_WEAPON_AURA) ||
@@ -792,6 +787,12 @@ class spell_gen_clone_weapon_aura : public SpellScriptLoader
return true;
}
+ bool Load() OVERRIDE
+ {
+ prevItem = 0;
+ return true;
+ }
+
void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
Unit* caster = GetCaster();
@@ -877,6 +878,8 @@ class spell_gen_clone_weapon_aura : public SpellScriptLoader
OnEffectRemove += AuraEffectRemoveFn(spell_gen_clone_weapon_auraScript::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK);
}
+ private:
+ uint32 prevItem;
};
AuraScript* GetAuraScript() const OVERRIDE
@@ -3282,6 +3285,33 @@ class spell_gen_summon_tournament_mount : public SpellScriptLoader
}
};
+// 41213, 43416, 69222, 73076 - Throw Shield
+class spell_gen_throw_shield : public SpellScriptLoader
+{
+ public:
+ spell_gen_throw_shield() : SpellScriptLoader("spell_gen_throw_shield") { }
+
+ class spell_gen_throw_shield_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_gen_throw_shield_SpellScript);
+
+ void HandleScriptEffect(SpellEffIndex effIndex)
+ {
+ PreventHitDefaultEffect(effIndex);
+ GetCaster()->CastSpell(GetHitUnit(), uint32(GetEffectValue()), true);
+ }
+
+ void Register() OVERRIDE
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_gen_throw_shield_SpellScript::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+ };
+
+ SpellScript* GetSpellScript() const OVERRIDE
+ {
+ return new spell_gen_throw_shield_SpellScript();
+ }
+};
enum MountedDuelSpells
{
@@ -3773,6 +3803,7 @@ void AddSC_generic_spell_scripts()
new spell_gen_summon_elemental("spell_gen_summon_fire_elemental", SPELL_SUMMON_FIRE_ELEMENTAL);
new spell_gen_summon_elemental("spell_gen_summon_earth_elemental", SPELL_SUMMON_EARTH_ELEMENTAL);
new spell_gen_summon_tournament_mount();
+ new spell_gen_throw_shield();
new spell_gen_tournament_duel();
new spell_gen_tournament_pennant();
new spell_pvp_trinket_wotf_shared_cd();
diff --git a/src/server/scripts/Spells/spell_quest.cpp b/src/server/scripts/Spells/spell_quest.cpp
index d1b32570795..b9fd07293cd 100644
--- a/src/server/scripts/Spells/spell_quest.cpp
+++ b/src/server/scripts/Spells/spell_quest.cpp
@@ -2276,6 +2276,46 @@ class spell_q13400_illidan_kill_master : public SpellScriptLoader
}
};
+enum RelicOfTheEarthenRing
+{
+ SPELL_TOTEM_OF_THE_EARTHEN_RING = 66747
+};
+
+// 66744 - Make Player Destroy Totems
+class spell_q14100_q14111_make_player_destroy_totems : public SpellScriptLoader
+{
+ public:
+ spell_q14100_q14111_make_player_destroy_totems() : SpellScriptLoader("spell_q14100_q14111_make_player_destroy_totems") { }
+
+ class spell_q14100_q14111_make_player_destroy_totems_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_q14100_q14111_make_player_destroy_totems_SpellScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_TOTEM_OF_THE_EARTHEN_RING))
+ return false;
+ return true;
+ }
+
+ void HandleScriptEffect(SpellEffIndex /*effIndex*/)
+ {
+ if (Player* player = GetHitPlayer())
+ player->CastSpell(player, SPELL_TOTEM_OF_THE_EARTHEN_RING, TRIGGERED_FULL_MASK); // ignore reagent cost, consumed by quest
+ }
+
+ void Register() OVERRIDE
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_q14100_q14111_make_player_destroy_totems_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+ };
+
+ SpellScript* GetSpellScript() const OVERRIDE
+ {
+ return new spell_q14100_q14111_make_player_destroy_totems_SpellScript();
+ }
+};
+
void AddSC_quest_spell_scripts()
{
new spell_q55_sacred_cleansing();
@@ -2331,4 +2371,5 @@ void AddSC_quest_spell_scripts()
new spell_q12919_gymers_grab();
new spell_q12919_gymers_throw();
new spell_q13400_illidan_kill_master();
+ new spell_q14100_q14111_make_player_destroy_totems();
}
diff --git a/src/server/scripts/Spells/spell_warrior.cpp b/src/server/scripts/Spells/spell_warrior.cpp
index d0ba39e8b09..e48f16d6558 100644
--- a/src/server/scripts/Spells/spell_warrior.cpp
+++ b/src/server/scripts/Spells/spell_warrior.cpp
@@ -28,6 +28,7 @@
enum WarriorSpells
{
+ SPELL_WARRIOR_BLADESTORM_PERIODIC_WHIRLWIND = 50622,
SPELL_WARRIOR_BLOODTHIRST = 23885,
SPELL_WARRIOR_BLOODTHIRST_DAMAGE = 23881,
SPELL_WARRIOR_CHARGE = 34846,
@@ -45,7 +46,8 @@ enum WarriorSpells
SPELL_WARRIOR_RETALIATION_DAMAGE = 22858,
SPELL_WARRIOR_SLAM = 50783,
SPELL_WARRIOR_SUNDER_ARMOR = 58567,
- SPELL_WARRIOR_SWEEPING_STRIKES_EXTRA_ATTACK = 26654,
+ SPELL_WARRIOR_SWEEPING_STRIKES_EXTRA_ATTACK_1 = 12723,
+ SPELL_WARRIOR_SWEEPING_STRIKES_EXTRA_ATTACK_2 = 26654,
SPELL_WARRIOR_TAUNT = 355,
SPELL_WARRIOR_UNRELENTING_ASSAULT_RANK_1 = 46859,
SPELL_WARRIOR_UNRELENTING_ASSAULT_RANK_2 = 46860,
@@ -686,7 +688,7 @@ class spell_warr_sweeping_strikes : public SpellScriptLoader
bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
{
- if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_SWEEPING_STRIKES_EXTRA_ATTACK))
+ if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_SWEEPING_STRIKES_EXTRA_ATTACK_1) || !sSpellMgr->GetSpellInfo(SPELL_WARRIOR_SWEEPING_STRIKES_EXTRA_ATTACK_2))
return false;
return true;
}
@@ -703,10 +705,23 @@ class spell_warr_sweeping_strikes : public SpellScriptLoader
return _procTarget;
}
- void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/)
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
{
PreventDefaultAction();
- GetTarget()->CastSpell(_procTarget, SPELL_WARRIOR_SWEEPING_STRIKES_EXTRA_ATTACK, true, NULL, aurEff);
+ if (eventInfo.GetDamageInfo())
+ {
+ SpellInfo const* spellInfo = eventInfo.GetDamageInfo()->GetSpellInfo();
+ if (spellInfo && (spellInfo->Id == SPELL_WARRIOR_BLADESTORM_PERIODIC_WHIRLWIND || (spellInfo->Id == SPELL_WARRIOR_EXECUTE && !_procTarget->HasAuraState(AURA_STATE_HEALTHLESS_20_PERCENT))))
+ {
+ // If triggered by Execute (while target is not under 20% hp) or Bladestorm deals normalized weapon damage
+ GetTarget()->CastSpell(_procTarget, SPELL_WARRIOR_SWEEPING_STRIKES_EXTRA_ATTACK_2, true, NULL, aurEff);
+ }
+ else
+ {
+ int32 damage = eventInfo.GetDamageInfo()->GetDamage();
+ GetTarget()->CastCustomSpell(SPELL_WARRIOR_SWEEPING_STRIKES_EXTRA_ATTACK_1, SPELLVALUE_BASE_POINT0, damage, _procTarget, true, NULL, aurEff);
+ }
+ }
}
void Register() OVERRIDE
diff --git a/src/server/scripts/World/chat_log.cpp b/src/server/scripts/World/chat_log.cpp
index ef854246d20..7074de3ed48 100644
--- a/src/server/scripts/World/chat_log.cpp
+++ b/src/server/scripts/World/chat_log.cpp
@@ -22,144 +22,133 @@
class ChatLogScript : public PlayerScript
{
-public:
- ChatLogScript() : PlayerScript("ChatLogScript") { }
+ public:
+ ChatLogScript() : PlayerScript("ChatLogScript") { }
- void OnChat(Player* player, uint32 type, uint32 lang, std::string& msg)
- {
- switch (type)
+ void OnChat(Player* player, uint32 type, uint32 lang, std::string& msg) OVERRIDE
{
- case CHAT_MSG_ADDON:
- if (sWorld->getBoolConfig(CONFIG_CHATLOG_ADDON))
- TC_LOG_DEBUG("chat.log", "[ADDON] Player %s sends: %s",
- player->GetName().c_str(), msg.c_str());
- break;
-
- case CHAT_MSG_SAY:
- if (sWorld->getBoolConfig(CONFIG_CHATLOG_PUBLIC))
- TC_LOG_DEBUG("chat.log", "[SAY] Player %s says (language %u): %s",
+ switch (type)
+ {
+ case CHAT_MSG_SAY:
+ TC_LOG_DEBUG("chat.log.say", "Player %s says (language %u): %s",
player->GetName().c_str(), lang, msg.c_str());
- break;
+ break;
- case CHAT_MSG_EMOTE:
- if (sWorld->getBoolConfig(CONFIG_CHATLOG_PUBLIC))
- TC_LOG_DEBUG("chat.log", "[TEXTEMOTE] Player %s emotes: %s",
+ case CHAT_MSG_EMOTE:
+ TC_LOG_DEBUG("chat.log.emote", "Player %s emotes: %s",
player->GetName().c_str(), msg.c_str());
- break;
+ break;
- case CHAT_MSG_YELL:
- if (sWorld->getBoolConfig(CONFIG_CHATLOG_PUBLIC))
- TC_LOG_DEBUG("chat.log", "[YELL] Player %s yells (language %u): %s",
+ case CHAT_MSG_YELL:
+ TC_LOG_DEBUG("chat.log.yell", "Player %s yells (language %u): %s",
player->GetName().c_str(), lang, msg.c_str());
- break;
+ break;
+ }
+ }
+
+ void OnChat(Player* player, uint32 /*type*/, uint32 lang, std::string& msg, Player* receiver) OVERRIDE
+ {
+ if (lang != LANG_ADDON)
+ TC_LOG_DEBUG("chat.log.whisper", "Player %s tells %s: %s",
+ player->GetName().c_str(), receiver ? receiver->GetName().c_str() : "<unknown>", msg.c_str());
+ else
+ TC_LOG_DEBUG("chat.log.addon.whisper", "Player %s tells %s: %s",
+ player->GetName().c_str(), receiver ? receiver->GetName().c_str() : "<unknown>", msg.c_str());
}
- }
-
- void OnChat(Player* player, uint32 /*type*/, uint32 lang, std::string& msg, Player* receiver)
- {
- if (lang != LANG_ADDON && sWorld->getBoolConfig(CONFIG_CHATLOG_WHISPER))
- TC_LOG_DEBUG("chat.log", "[WHISPER] Player %s tells %s: %s",
- player->GetName().c_str(), receiver ? receiver->GetName().c_str() : "<unknown>", msg.c_str());
- else if (lang == LANG_ADDON && sWorld->getBoolConfig(CONFIG_CHATLOG_ADDON))
- TC_LOG_DEBUG("chat.log", "[ADDON] Player %s tells %s: %s",
- player->GetName().c_str(), receiver ? receiver->GetName().c_str() : "<unknown>", msg.c_str());
- }
-
- void OnChat(Player* player, uint32 type, uint32 lang, std::string& msg, Group* group)
- {
- //! NOTE:
- //! LANG_ADDON can only be sent by client in "PARTY", "RAID", "GUILD", "BATTLEGROUND", "WHISPER"
- switch (type)
+
+ void OnChat(Player* player, uint32 type, uint32 lang, std::string& msg, Group* group) OVERRIDE
{
- case CHAT_MSG_PARTY:
- if (lang != LANG_ADDON && sWorld->getBoolConfig(CONFIG_CHATLOG_PARTY))
- TC_LOG_DEBUG("chat.log", "[PARTY] Player %s tells group with leader %s: %s",
- player->GetName().c_str(), group ? group->GetLeaderName() : "<unknown>", msg.c_str());
- else if (lang == LANG_ADDON && sWorld->getBoolConfig(CONFIG_CHATLOG_ADDON))
- TC_LOG_DEBUG("chat.log", "[ADDON] Player %s tells group with leader %s: %s",
- player->GetName().c_str(), group ? group->GetLeaderName() : "<unknown>", msg.c_str());
- break;
-
- case CHAT_MSG_PARTY_LEADER:
- if (sWorld->getBoolConfig(CONFIG_CHATLOG_PARTY))
- TC_LOG_DEBUG("chat.log", "[PARTY] Leader %s tells group: %s",
+ //! NOTE:
+ //! LANG_ADDON can only be sent by client in "PARTY", "RAID", "GUILD", "BATTLEGROUND", "WHISPER"
+ switch (type)
+ {
+ case CHAT_MSG_PARTY:
+ if (lang != LANG_ADDON)
+ TC_LOG_DEBUG("chat.log.party", "Player %s tells group with leader %s: %s",
+ player->GetName().c_str(), group ? group->GetLeaderName() : "<unknown>", msg.c_str());
+ else
+ TC_LOG_DEBUG("chat.log.addon.party", "Player %s tells group with leader %s: %s",
+ player->GetName().c_str(), group ? group->GetLeaderName() : "<unknown>", msg.c_str());
+ break;
+
+ case CHAT_MSG_PARTY_LEADER:
+ TC_LOG_DEBUG("chat.log.party", "Leader %s tells group: %s",
player->GetName().c_str(), msg.c_str());
- break;
-
- case CHAT_MSG_RAID:
- if (lang != LANG_ADDON && sWorld->getBoolConfig(CONFIG_CHATLOG_RAID))
- TC_LOG_DEBUG("chat.log", "[RAID] Player %s tells raid with leader %s: %s",
- player->GetName().c_str(), group ? group->GetLeaderName() : "<unknown>", msg.c_str());
- else if (lang == LANG_ADDON && sWorld->getBoolConfig(CONFIG_CHATLOG_ADDON))
- TC_LOG_DEBUG("chat.log", "[ADDON] Player %s tells raid with leader %s: %s",
- player->GetName().c_str(), group ? group->GetLeaderName() : "<unknown>", msg.c_str());
- break;
-
- case CHAT_MSG_RAID_LEADER:
- if (sWorld->getBoolConfig(CONFIG_CHATLOG_RAID))
- TC_LOG_DEBUG("chat.log", "[RAID] Leader player %s tells raid: %s",
+ break;
+
+ case CHAT_MSG_RAID:
+ if (lang != LANG_ADDON)
+ TC_LOG_DEBUG("chat.log.raid", "Player %s tells raid with leader %s: %s",
+ player->GetName().c_str(), group ? group->GetLeaderName() : "<unknown>", msg.c_str());
+ else
+ TC_LOG_DEBUG("chat.log.addon.raid", "Player %s tells raid with leader %s: %s",
+ player->GetName().c_str(), group ? group->GetLeaderName() : "<unknown>", msg.c_str());
+ break;
+
+ case CHAT_MSG_RAID_LEADER:
+ TC_LOG_DEBUG("chat.log.raid", "Leader player %s tells raid: %s",
player->GetName().c_str(), msg.c_str());
- break;
+ break;
- case CHAT_MSG_RAID_WARNING:
- if (sWorld->getBoolConfig(CONFIG_CHATLOG_RAID))
- TC_LOG_DEBUG("chat.log", "[RAID] Leader player %s warns raid with: %s",
+ case CHAT_MSG_RAID_WARNING:
+ TC_LOG_DEBUG("chat.log.raid", "Leader player %s warns raid with: %s",
player->GetName().c_str(), msg.c_str());
- break;
-
- case CHAT_MSG_BATTLEGROUND:
- if (lang != LANG_ADDON && sWorld->getBoolConfig(CONFIG_CHATLOG_BGROUND))
- TC_LOG_DEBUG("chat.log", "[BATTLEGROUND] Player %s tells battleground with leader %s: %s",
- player->GetName().c_str(), group ? group->GetLeaderName() : "<unknown>", msg.c_str());
- else if (lang == LANG_ADDON && sWorld->getBoolConfig(CONFIG_CHATLOG_ADDON))
- TC_LOG_DEBUG("chat.log", "[ADDON] Player %s tells battleground with leader %s: %s",
- player->GetName().c_str(), group ? group->GetLeaderName() : "<unknown>", msg.c_str());
- break;
-
- case CHAT_MSG_BATTLEGROUND_LEADER:
- if (sWorld->getBoolConfig(CONFIG_CHATLOG_BGROUND))
- TC_LOG_DEBUG("chat.log", "[BATTLEGROUND] Leader player %s tells battleground: %s",
+ break;
+
+ case CHAT_MSG_BATTLEGROUND:
+ if (lang != LANG_ADDON)
+ TC_LOG_DEBUG("chat.log.bg", "Player %s tells battleground with leader %s: %s",
+ player->GetName().c_str(), group ? group->GetLeaderName() : "<unknown>", msg.c_str());
+ else
+ TC_LOG_DEBUG("chat.log.addon.bg", "Player %s tells battleground with leader %s: %s",
+ player->GetName().c_str(), group ? group->GetLeaderName() : "<unknown>", msg.c_str());
+ break;
+
+ case CHAT_MSG_BATTLEGROUND_LEADER:
+ TC_LOG_DEBUG("chat.log.bg", "Leader player %s tells battleground: %s",
player->GetName().c_str(), msg.c_str());
- break;
+ break;
+ }
}
- }
- void OnChat(Player* player, uint32 type, uint32 lang, std::string& msg, Guild* guild)
- {
- switch (type)
+ void OnChat(Player* player, uint32 type, uint32 lang, std::string& msg, Guild* guild) OVERRIDE
{
- case CHAT_MSG_GUILD:
- if (lang != LANG_ADDON && sWorld->getBoolConfig(CONFIG_CHATLOG_GUILD))
- TC_LOG_DEBUG("chat.log", "[GUILD] Player %s tells guild %s: %s",
- player->GetName().c_str(), guild ? guild->GetName().c_str() : "<unknown>", msg.c_str());
- else if (lang == LANG_ADDON && sWorld->getBoolConfig(CONFIG_CHATLOG_ADDON))
- TC_LOG_DEBUG("chat.log", "[ADDON] Player %s sends to guild %s: %s",
+ switch (type)
+ {
+ case CHAT_MSG_GUILD:
+ if (lang != LANG_ADDON)
+ TC_LOG_DEBUG("chat.log.guild", "Player %s tells guild %s: %s",
+ player->GetName().c_str(), guild ? guild->GetName().c_str() : "<unknown>", msg.c_str());
+ else
+ TC_LOG_DEBUG("chat.log.addon.guild", "Player %s sends to guild %s: %s",
+ player->GetName().c_str(), guild ? guild->GetName().c_str() : "<unknown>", msg.c_str());
+ break;
+
+ case CHAT_MSG_OFFICER:
+ TC_LOG_DEBUG("chat.log.guild.officer", "Player %s tells guild %s officers: %s",
player->GetName().c_str(), guild ? guild->GetName().c_str() : "<unknown>", msg.c_str());
- break;
+ break;
+ }
+ }
- case CHAT_MSG_OFFICER:
- if (sWorld->getBoolConfig(CONFIG_CHATLOG_GUILD))
- TC_LOG_DEBUG("chat.log", "[OFFICER] Player %s tells guild %s officers: %s",
- player->GetName().c_str(), guild ? guild->GetName().c_str() : "<unknown>", msg.c_str());
- break;
+ void OnChat(Player* player, uint32 /*type*/, uint32 /*lang*/, std::string& msg, Channel* channel) OVERRIDE
+ {
+ bool isSystem = channel &&
+ (channel->HasFlag(CHANNEL_FLAG_TRADE) ||
+ channel->HasFlag(CHANNEL_FLAG_GENERAL) ||
+ channel->HasFlag(CHANNEL_FLAG_CITY) ||
+ channel->HasFlag(CHANNEL_FLAG_LFG));
+
+ if (isSystem)
+ TC_LOG_DEBUG("chat.log.system", "Player %s tells channel %s: %s",
+ player->GetName().c_str(), channel->GetName().c_str(), msg.c_str());
+ else
+ {
+ std::string channelName = channel ? channel->GetName() : "<unknown>";
+ TC_LOG_DEBUG("chat.log.channel." + channelName, "Player %s tells channel %s: %s",
+ player->GetName().c_str(), channelName.c_str(), msg.c_str());
+ }
}
- }
-
- void OnChat(Player* player, uint32 /*type*/, uint32 /*lang*/, std::string& msg, Channel* channel)
- {
- bool isSystem = channel &&
- (channel->HasFlag(CHANNEL_FLAG_TRADE) ||
- channel->HasFlag(CHANNEL_FLAG_GENERAL) ||
- channel->HasFlag(CHANNEL_FLAG_CITY) ||
- channel->HasFlag(CHANNEL_FLAG_LFG));
-
- if (sWorld->getBoolConfig(CONFIG_CHATLOG_SYSCHAN) && isSystem)
- TC_LOG_DEBUG("chat.log", "[SYSCHAN] Player %s tells channel %s: %s",
- player->GetName().c_str(), channel->GetName().c_str(), msg.c_str());
- else if (sWorld->getBoolConfig(CONFIG_CHATLOG_CHANNEL))
- TC_LOG_DEBUG("chat.log", "[CHANNEL] Player %s tells channel %s: %s",
- player->GetName().c_str(), channel ? channel->GetName().c_str() : "<unknown>", msg.c_str());
- }
};
void AddSC_chat_log()