diff options
Diffstat (limited to 'src')
7 files changed, 306 insertions, 173 deletions
diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index c0f844825f5..854e155c148 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -152,7 +152,6 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u delete targets; } - mTalkerEntry = talker->GetEntry(); mLastTextID = e.action.talk.textGroupID; mTextTimer = e.action.talk.duration; @@ -211,10 +210,10 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u { for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); ++itr) { - if (IsCreature(*itr)) + if (IsPlayer(*itr)) { - sCreatureTextMgr->SendSound((*itr)->ToCreature(), e.action.sound.sound, CHAT_MSG_MONSTER_SAY, 0, TextRange(e.action.sound.range), Team(0), false); - sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction:: SMART_ACTION_SOUND: source: %s (GuidLow: %u), sound: %u, range: %u", + (*itr)->SendPlaySound(e.action.sound.sound, e.action.sound.range > 0 ? true : false); + sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction:: SMART_ACTION_SOUND: target: %s (GuidLow: %u), sound: %u, onlyself: %u", (*itr)->GetName(), (*itr)->GetGUIDLow(), e.action.sound.sound, e.action.sound.range); } } diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index b34d4f73461..e8de9c4c773 100755 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -5623,6 +5623,13 @@ void AuraEffect::HandlePeriodicDummyAuraTick(Unit* target, Unit* caster) const case SPELLFAMILY_GENERIC: switch (GetId()) { + case 66149: // Bullet Controller Periodic - 10 Man + case 68396: // Bullet Controller Periodic - 25 Man + { + caster->CastCustomSpell(66152, SPELLVALUE_MAX_TARGETS, urand(1,6), target, true); + caster->CastCustomSpell(66153, SPELLVALUE_MAX_TARGETS, urand(1,6), target, true); + break; + } case 54798: // FLAMING Arrow Triggered Effect { if (!caster || !target || !target->ToCreature() || !caster->GetVehicle() || target->HasAura(54683)) diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp index 8c9741f407f..51a125d8c79 100755 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp @@ -95,7 +95,7 @@ enum BossSpells SPELL_BURNING_SPRAY = 66902, SPELL_SWEEP_1 = 67646, SPELL_EMERGE_0 = 66947, - SPELL_SUBMERGE_0 = 53421, + SPELL_SUBMERGE_0 = 66948, SPELL_ENRAGE = 68335, SPELL_SLIME_POOL_EFFECT = 66882, //In 60s it diameter grows from 10y to 40y (r=r+0.25 per second) @@ -149,6 +149,27 @@ public: Summons.DespawnAll(); } + void EnterEvadeMode() + { + m_pInstance->DoUseDoorOrButton(m_pInstance->GetData64(GO_MAIN_GATE_DOOR)); + ScriptedAI::EnterEvadeMode(); + } + + void MovementInform(uint32 uiType, uint32 uiId) + { + if (uiType != POINT_MOTION_TYPE) return; + + switch (uiId) + { + case 0: + m_pInstance->DoUseDoorOrButton(m_pInstance->GetData64(GO_MAIN_GATE_DOOR)); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_OOC_NOT_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); + me->SetReactState(REACT_AGGRESSIVE); + me->SetInCombatWithZone(); + break; + } + } + void JustDied(Unit* /*killer*/) { if (m_pInstance) @@ -158,7 +179,10 @@ public: void JustReachedHome() { if (m_pInstance) + { + m_pInstance->DoUseDoorOrButton(m_pInstance->GetData64(GO_MAIN_GATE_DOOR)); m_pInstance->SetData(TYPE_NORTHREND_BEASTS, FAIL); + } me->DespawnOrUnsummon(); } @@ -265,6 +289,12 @@ public: me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_OOC_NOT_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); } + void EnterEvadeMode() + { + m_pInstance->DoUseDoorOrButton(m_pInstance->GetData64(GO_MAIN_GATE_DOOR)); + ScriptedAI::EnterEvadeMode(); + } + void EnterCombat(Unit* who) { m_uiTargetGUID = who->GetGUID(); @@ -397,7 +427,9 @@ struct boss_jormungarAI : public ScriptedAI void JustReachedHome() { if (instanceScript && instanceScript->GetData(TYPE_NORTHREND_BEASTS) != FAIL) + { instanceScript->SetData(TYPE_NORTHREND_BEASTS, FAIL); + } me->DespawnOrUnsummon(); } @@ -608,7 +640,12 @@ public: struct boss_dreadscaleAI : public boss_jormungarAI { - boss_dreadscaleAI(Creature* creature) : boss_jormungarAI(creature) { } + boss_dreadscaleAI(Creature* creature) : boss_jormungarAI(creature) + { + instanceScript = creature->GetInstanceScript(); + } + + InstanceScript* instanceScript; void Reset() { @@ -624,6 +661,42 @@ public: submergeTimer = 45 * IN_MILLISECONDS; stage = 0; } + + void MovementInform(uint32 uiType, uint32 uiId) + { + if (uiType != POINT_MOTION_TYPE) return; + + switch (uiId) + { + case 0: + instanceScript->DoUseDoorOrButton(instanceScript->GetData64(GO_MAIN_GATE_DOOR)); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_OOC_NOT_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); + me->SetReactState(REACT_AGGRESSIVE); + me->SetInCombatWithZone(); + if (Creature* otherWorm = Unit::GetCreature(*me, instanceScript->GetData64(otherWormEntry))) + { + otherWorm->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_OOC_NOT_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); + otherWorm->SetReactState(REACT_AGGRESSIVE); + otherWorm->SetVisible(true); + otherWorm->SetInCombatWithZone(); + } + break; + } + } + + void EnterEvadeMode() + { + instanceScript->DoUseDoorOrButton(instanceScript->GetData64(GO_MAIN_GATE_DOOR)); + boss_jormungarAI::EnterEvadeMode(); + } + + void JustReachedHome() + { + if (instanceScript) + instanceScript->DoUseDoorOrButton(instanceScript->GetData64(GO_MAIN_GATE_DOOR)); + + boss_jormungarAI::JustReachedHome(); + } }; CreatureAI* GetAI(Creature* creature) const @@ -746,13 +819,28 @@ public: case 1: // Finish trample m_bMovementFinish = true; break; + case 2: + m_pInstance->DoUseDoorOrButton(m_pInstance->GetData64(GO_MAIN_GATE_DOOR)); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_OOC_NOT_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); + me->SetReactState(REACT_AGGRESSIVE); + me->SetInCombatWithZone(); + break; } } + void EnterEvadeMode() + { + m_pInstance->DoUseDoorOrButton(m_pInstance->GetData64(GO_MAIN_GATE_DOOR)); + ScriptedAI::EnterEvadeMode(); + } + void JustReachedHome() { if (m_pInstance) + { + m_pInstance->DoUseDoorOrButton(m_pInstance->GetData64(GO_MAIN_GATE_DOOR)); m_pInstance->SetData(TYPE_NORTHREND_BEASTS, FAIL); + } me->DespawnOrUnsummon(); } diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp index d5dd7cf27dd..2aefaeeea31 100755 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp @@ -53,50 +53,39 @@ enum Equipment enum Summons { - NPC_UNLEASHED_DARK = 34628, - NPC_UNLEASHED_LIGHT = 34630, + NPC_BULLET_CONTROLLER = 34743, - // Future Development - NPC_BULLET_CONTROLLER = 34743, // Npc controller for all bullets - - NPC_BULLET_STALKER_DARK = 34704, // Npc spawner for dark bullets - NPC_BULLET_STALKER_LIGHT = 34720, // Npc spawner for light bullets + NPC_BULLET_DARK = 34628, + NPC_BULLET_LIGHT = 34630, }; enum BossSpells { - SPELL_CONTROLLER_PERIODIC = 66149, // Future Development - SPELL_LIGHT_TWIN_SPIKE = 66075, SPELL_LIGHT_SURGE = 65766, SPELL_LIGHT_SHIELD = 65858, SPELL_LIGHT_TWIN_PACT = 65876, SPELL_LIGHT_VORTEX = 66046, SPELL_LIGHT_TOUCH = 67297, + SPELL_LIGHT_ESSENCE = 65686, + SPELL_EMPOWERED_LIGHT = 65748, + SPELL_TWIN_EMPATHY_LIGHT = 66133, + SPELL_UNLEASHED_LIGHT = 65795, SPELL_DARK_TWIN_SPIKE = 66069, SPELL_DARK_SURGE = 65768, SPELL_DARK_SHIELD = 65874, SPELL_DARK_TWIN_PACT = 65875, - SPELL_POWER_TWINS = 65879, SPELL_DARK_VORTEX = 66058, SPELL_DARK_TOUCH = 67282, - - SPELL_TWIN_POWER = 65916, - SPELL_LIGHT_ESSENCE = 65686, SPELL_DARK_ESSENCE = 65684, - SPELL_BERSERK = 64238, - SPELL_NONE = 0, - SPELL_EMPOWERED_DARK = 65724, - SPELL_EMPOWERED_LIGHT = 65748, - - SPELL_UNLEASHED_DARK = 65808, - SPELL_UNLEASHED_LIGHT = 65795, - - SPELL_TWIN_EMPATHY_1 = 66132, - SPELL_TWIN_EMPATHY_2 = 66133, - + SPELL_TWIN_EMPATHY_DARK = 66132, + SPELL_UNLEASHED_DARK = 65808, + + SPELL_CONTROLLER_PERIODIC = 66149, + SPELL_POWER_TWINS = 65879, + SPELL_BERSERK = 64238, SPELL_POWERING_UP = 67590, SPELL_SURGE_OF_SPEED = 65828, }; @@ -104,10 +93,10 @@ enum BossSpells #define SPELL_DARK_ESSENCE_HELPER RAID_MODE<uint32>(65684, 67176, 67177, 67178) #define SPELL_LIGHT_ESSENCE_HELPER RAID_MODE<uint32>(65686, 67222, 67223, 67224) -#define SPELL_POWERING_UP_HELPER RAID_MODE(67590, 67602, 67603, 67604) +#define SPELL_POWERING_UP_HELPER RAID_MODE<uint32>(67590, 67602, 67603, 67604) -#define SPELL_EMPOWERED_DARK_HELPER RAID_MODE<uint32>(65724,67213,67214,67215) -#define SPELL_EMPOWERED_LIGHT_HELPER RAID_MODE<uint32>(65748, 67216, 67217, 67218) +#define SPELL_UNLEASHED_DARK_HELPER RAID_MODE<uint32>(65808, 67172, 67173, 67174) +#define SPELL_UNLEASHED_LIGHT_HELPER RAID_MODE<uint32>(65795, 67238, 67239, 67240) enum Actions { @@ -119,6 +108,37 @@ enum Actions ## boss_twin_base ######*/ +class OrbsDespawner : public BasicEvent +{ + public: + explicit OrbsDespawner(Creature* creature) : _creature(creature) + { + } + + bool Execute(uint64 /*currTime*/, uint32 /*diff*/) + { + Trinity::CreatureWorker<OrbsDespawner> worker(_creature, *this); + _creature->VisitNearbyGridObject(5000.0f, worker); + return true; + } + + void operator()(Creature* creature) const + { + switch (creature->GetEntry()) + { + case NPC_BULLET_DARK: + case NPC_BULLET_LIGHT: + creature->DespawnOrUnsummon(); + return; + default: + return; + } + } + + private: + Creature* _creature; +}; + struct boss_twin_baseAI : public ScriptedAI { boss_twin_baseAI(Creature* creature) : ScriptedAI(creature), Summons(me) @@ -133,9 +153,7 @@ struct boss_twin_baseAI : public ScriptedAI uint8 m_uiStage; bool m_bIsBerserk; - uint8 m_uiWaveCount; uint32 m_uiWeapon; - uint32 m_uiColorballsTimer; uint32 m_uiSpecialAbilityTimer; uint32 m_uiSpikeTimer; uint32 m_uiTouchTimer; @@ -144,12 +162,8 @@ struct boss_twin_baseAI : public ScriptedAI int32 m_uiVortexSay; int32 m_uiVortexEmote; uint32 m_uiSisterNpcId; - uint32 m_uiColorballNpcId; uint32 m_uiMyEmphatySpellId; - uint32 m_uiEssenceNpcId; - uint32 m_uiMyEssenceSpellId; uint32 m_uiOtherEssenceSpellId; - uint32 m_uiEmpoweredWeaknessSpellId; uint32 m_uiSurgeSpellId; uint32 m_uiVortexSpellId; uint32 m_uiShieldSpellId; @@ -157,9 +171,6 @@ struct boss_twin_baseAI : public ScriptedAI uint32 m_uiSpikeSpellId; uint32 m_uiTouchSpellId; - Position HomeLocation; - Position EssenceLocation[2]; - void Reset() { me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_OOC_NOT_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); me->SetReactState(REACT_PASSIVE); @@ -169,8 +180,6 @@ struct boss_twin_baseAI : public ScriptedAI me->SetFlying(true); */ m_bIsBerserk = false; - m_uiWaveCount = 1; - m_uiColorballsTimer = 15*IN_MILLISECONDS; m_uiSpecialAbilityTimer = MINUTE*IN_MILLISECONDS; m_uiSpikeTimer = 20*IN_MILLISECONDS; m_uiTouchTimer = urand(10, 15)*IN_MILLISECONDS; @@ -182,9 +191,9 @@ struct boss_twin_baseAI : public ScriptedAI void JustReachedHome() { if (m_pInstance) - { m_pInstance->SetData(TYPE_VALKIRIES, FAIL); - } + + Summons.DespawnAll(); me->DespawnOrUnsummon(); } @@ -194,11 +203,8 @@ struct boss_twin_baseAI : public ScriptedAI switch (uiId) { - case 0: - me->GetMotionMaster()->MovePoint(1, HomeLocation.GetPositionX(), HomeLocation.GetPositionY(), HomeLocation.GetPositionZ()); - me->SetHomePosition(HomeLocation); - break; case 1: + m_pInstance->DoUseDoorOrButton(m_pInstance->GetData64(GO_MAIN_GATE_DOOR)); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_OOC_NOT_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); me->SetReactState(REACT_AGGRESSIVE); break; @@ -217,13 +223,6 @@ struct boss_twin_baseAI : public ScriptedAI void JustSummoned(Creature* summoned) { - switch (summoned->GetEntry()) - { - case NPC_UNLEASHED_DARK: - case NPC_UNLEASHED_LIGHT: - summoned->SetCorpseDelay(0); - break; - } Summons.Summon(summoned); } @@ -239,25 +238,13 @@ struct boss_twin_baseAI : public ScriptedAI m_pInstance->DoRemoveAurasDueToSpellOnPlayers(SPELL_DARK_ESSENCE_HELPER); m_pInstance->DoRemoveAurasDueToSpellOnPlayers(SPELL_POWERING_UP_HELPER); break; + case NPC_BULLET_CONTROLLER: + me->m_Events.AddEvent(new OrbsDespawner(me), me->m_Events.CalculateTime(100)); + break; } Summons.Despawn(summoned); } - void SummonColorballs(uint8 quantity) - { - float x0 = ToCCommonLoc[1].GetPositionX(), y0 = ToCCommonLoc[1].GetPositionY(), r = 47.0f; - float y = y0; - for (uint8 i = 0; i < quantity; i++) - { - float x = float(urand(uint32(x0 - r), uint32(x0 + r))); - if (urand(0, 1)) - y = y0 + sqrt(pow(r, 2) - pow((x-x0), 2)); - else - y = y0 - sqrt(pow(r, 2) - pow((x-x0), 2)); - me->SummonCreature(m_uiColorballNpcId, x, y, me->GetPositionZ(), TEMPSUMMON_CORPSE_DESPAWN); - } - } - void JustDied(Unit* /*killer*/) { DoScriptText(SAY_DEATH, me); @@ -267,10 +254,17 @@ struct boss_twin_baseAI : public ScriptedAI { if (!pSister->isAlive()) { + me->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE); + pSister->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE); + m_pInstance->SetData(TYPE_VALKIRIES, DONE); Summons.DespawnAll(); } - else m_pInstance->SetData(TYPE_VALKIRIES, SPECIAL); + else + { + me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE); + m_pInstance->SetData(TYPE_VALKIRIES, SPECIAL); + } } } Summons.DespawnAll(); @@ -288,15 +282,13 @@ struct boss_twin_baseAI : public ScriptedAI if (m_pInstance) { if (Creature* pSister = GetSister()) + { me->AddAura(m_uiMyEmphatySpellId, pSister); - + pSister->SetInCombatWithZone(); + } m_pInstance->SetData(TYPE_VALKIRIES, IN_PROGRESS); } - if (me->isAlive()) - { - me->SummonCreature(m_uiEssenceNpcId, EssenceLocation[0].GetPositionX(), EssenceLocation[0].GetPositionY(), EssenceLocation[0].GetPositionZ()); - me->SummonCreature(m_uiEssenceNpcId, EssenceLocation[1].GetPositionX(), EssenceLocation[1].GetPositionY(), EssenceLocation[1].GetPositionZ()); - } + DoScriptText(SAY_AGGRO, me); DoCast(me, m_uiSurgeSpellId); } @@ -310,12 +302,11 @@ struct boss_twin_baseAI : public ScriptedAI break; case ACTION_PACT: m_uiStage = me->GetEntry() == NPC_LIGHTBANE ? 1 : 2; - DoCast(me, SPELL_TWIN_POWER); break; } } - void EnableDualWield(bool mode) + void EnableDualWield(bool mode = true) { SetEquipmentSlots(false, m_uiWeapon, mode ? m_uiWeapon : EQUIP_UNEQUIP, EQUIP_UNEQUIP); me->SetCanDualWield(mode); @@ -384,23 +375,6 @@ struct boss_twin_baseAI : public ScriptedAI else m_uiTouchTimer -= uiDiff; - if (m_uiColorballsTimer <= uiDiff) - { - if (m_uiWaveCount >= 2) - { - SummonColorballs(12); - m_uiWaveCount = 0; - } - else - { - SummonColorballs(2); - m_uiWaveCount++; - } - m_uiColorballsTimer = 15*IN_MILLISECONDS; - } - else - m_uiColorballsTimer -= uiDiff; - if (!m_bIsBerserk && m_uiBerserkTimer <= uiDiff) { DoCast(me, SPELL_BERSERK); @@ -430,7 +404,12 @@ public: struct boss_fjolaAI : public boss_twin_baseAI { - boss_fjolaAI(Creature* creature) : boss_twin_baseAI(creature) {} + boss_fjolaAI(Creature* creature) : boss_twin_baseAI(creature) + { + m_pInstance = (InstanceScript*)creature->GetInstanceScript(); + } + + InstanceScript* m_pInstance; void Reset() { boss_twin_baseAI::Reset(); @@ -441,12 +420,8 @@ public: m_uiVortexEmote = EMOTE_LIGHT_VORTEX; m_uiVortexSay = SAY_LIGHT_VORTEX; m_uiSisterNpcId = NPC_DARKBANE; - m_uiColorballNpcId = NPC_UNLEASHED_LIGHT; - m_uiEssenceNpcId = NPC_LIGHT_ESSENCE; - m_uiMyEmphatySpellId = SPELL_TWIN_EMPATHY_1; - m_uiMyEssenceSpellId = SPELL_LIGHT_ESSENCE_HELPER; + m_uiMyEmphatySpellId = SPELL_TWIN_EMPATHY_DARK; m_uiOtherEssenceSpellId = SPELL_DARK_ESSENCE_HELPER; - m_uiEmpoweredWeaknessSpellId = SPELL_EMPOWERED_DARK_HELPER; m_uiSurgeSpellId = SPELL_LIGHT_SURGE; m_uiVortexSpellId = SPELL_LIGHT_VORTEX; m_uiShieldSpellId = SPELL_LIGHT_SHIELD; @@ -454,10 +429,6 @@ public: m_uiTouchSpellId = SPELL_LIGHT_TOUCH; m_uiSpikeSpellId = SPELL_LIGHT_TWIN_SPIKE; - HomeLocation = ToCCommonLoc[8]; - EssenceLocation[0] = TwinValkyrsLoc[2]; - EssenceLocation[1] = TwinValkyrsLoc[3]; - if (m_pInstance) { m_pInstance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, EVENT_START_TWINS_FIGHT); @@ -466,11 +437,27 @@ public: void EnterCombat(Unit* who) { - boss_twin_baseAI::EnterCombat(who); if (m_pInstance) { m_pInstance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, EVENT_START_TWINS_FIGHT); } + + me->SummonCreature(NPC_BULLET_CONTROLLER, ToCCommonLoc[1].GetPositionX(), ToCCommonLoc[1].GetPositionY(), ToCCommonLoc[1].GetPositionZ(), 0.0f, TEMPSUMMON_MANUAL_DESPAWN); + boss_twin_baseAI::EnterCombat(who); + } + + void EnterEvadeMode() + { + m_pInstance->DoUseDoorOrButton(m_pInstance->GetData64(GO_MAIN_GATE_DOOR)); + boss_twin_baseAI::EnterEvadeMode(); + } + + void JustReachedHome() + { + if (m_pInstance) + m_pInstance->DoUseDoorOrButton(m_pInstance->GetData64(GO_MAIN_GATE_DOOR)); + + boss_twin_baseAI::JustReachedHome(); } }; @@ -503,22 +490,14 @@ public: m_uiVortexEmote = EMOTE_DARK_VORTEX; m_uiVortexSay = SAY_DARK_VORTEX; m_uiSisterNpcId = NPC_LIGHTBANE; - m_uiColorballNpcId = NPC_UNLEASHED_DARK; - m_uiEssenceNpcId = NPC_DARK_ESSENCE; - m_uiMyEmphatySpellId = SPELL_TWIN_EMPATHY_2; - m_uiMyEssenceSpellId = SPELL_DARK_ESSENCE_HELPER; + m_uiMyEmphatySpellId = SPELL_TWIN_EMPATHY_LIGHT; m_uiOtherEssenceSpellId = SPELL_LIGHT_ESSENCE_HELPER; - m_uiEmpoweredWeaknessSpellId = SPELL_EMPOWERED_LIGHT_HELPER; m_uiSurgeSpellId = SPELL_DARK_SURGE; m_uiVortexSpellId = SPELL_DARK_VORTEX; m_uiShieldSpellId = SPELL_DARK_SHIELD; m_uiTwinPactSpellId = SPELL_DARK_TWIN_PACT; m_uiTouchSpellId = SPELL_DARK_TOUCH; m_uiSpikeSpellId = SPELL_DARK_TWIN_SPIKE; - - HomeLocation = ToCCommonLoc[9]; - EssenceLocation[0] = TwinValkyrsLoc[0]; - EssenceLocation[1] = TwinValkyrsLoc[1]; } }; @@ -650,8 +629,11 @@ public: void SpellHitTarget(Unit* who, const SpellInfo* /*spell*/) { - if (who->HasAura(SPELL_DARK_ESSENCE_HELPER)) - who->CastSpell(who, SPELL_POWERING_UP, true); + if(spell->Id == SPELL_UNLEASHED_DARK_HELPER) + { + if (who->HasAura(SPELL_DARK_ESSENCE_HELPER)) + who->CastSpell(who, SPELL_POWERING_UP, true); + } } }; @@ -689,13 +671,45 @@ public: void SpellHitTarget(Unit* who, const SpellInfo* /*spell*/) { - if (who->HasAura(SPELL_LIGHT_ESSENCE_HELPER)) - who->CastSpell(who, SPELL_POWERING_UP, true); + if(spell->Id == SPELL_UNLEASHED_LIGHT_HELPER) + { + if (who->HasAura(SPELL_LIGHT_ESSENCE_HELPER)) + who->CastSpell(who, SPELL_POWERING_UP, true); + } } }; }; +class mob_bullet_controller : public CreatureScript +{ +public: + mob_bullet_controller() : CreatureScript("mob_bullet_controller") { } + + CreatureAI* GetAI(Creature* creature) const + { + return new mob_bullet_controllerAI(creature); + } + + struct mob_bullet_controllerAI : public Scripted_NoMovementAI + { + mob_bullet_controllerAI(Creature* creature) : Scripted_NoMovementAI(creature) + { + Reset(); + } + + void Reset() + { + DoCastAOE(SPELL_CONTROLLER_PERIODIC); + } + + void UpdateAI(const uint32 /*uiDiff*/) + { + UpdateVictim(); + } + }; +}; + class spell_powering_up : public SpellScriptLoader { public: @@ -860,6 +874,7 @@ void AddSC_boss_twin_valkyr() new mob_unleashed_light(); new mob_unleashed_dark(); new mob_essence_of_twin(); + new mob_bullet_controller(); new spell_powering_up(); new spell_valkyr_essences(); new spell_power_of_the_twins(); diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp index 34c065f5649..dd772a14b5d 100755 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp @@ -553,17 +553,16 @@ class npc_tirion_toc : public CreatureScript DoScriptText(SAY_STAGE_0_02, me); m_uiUpdateTimer = 5000; m_pInstance->SetData(TYPE_EVENT, 150); - m_pInstance->DoUseDoorOrButton(m_pInstance->GetData64(GO_MAIN_GATE_DOOR)); break; case 150: me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_NONE); if (m_pInstance->GetData(TYPE_BEASTS) != DONE) { - me->SummonCreature(NPC_GORMOK, ToCCommonLoc[10].GetPositionX(), ToCCommonLoc[10].GetPositionY(), ToCCommonLoc[10].GetPositionZ(), 5, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30*IN_MILLISECONDS); - if (Creature* pTemp = Unit::GetCreature((*me), m_pInstance->GetData64(NPC_GORMOK))) + m_pInstance->DoUseDoorOrButton(m_pInstance->GetData64(GO_MAIN_GATE_DOOR)); + + if (Creature* pTemp = me->SummonCreature(NPC_GORMOK, ToCSpawnLoc[0].GetPositionX(), ToCSpawnLoc[0].GetPositionY(), ToCSpawnLoc[0].GetPositionZ(), 5, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30*IN_MILLISECONDS)) { pTemp->GetMotionMaster()->MovePoint(0, ToCCommonLoc[5].GetPositionX(), ToCCommonLoc[5].GetPositionY(), ToCCommonLoc[5].GetPositionZ()); - pTemp->AddUnitMovementFlag(MOVEMENTFLAG_WALKING); pTemp->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_OOC_NOT_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); pTemp->SetReactState(REACT_PASSIVE); } @@ -572,13 +571,6 @@ class npc_tirion_toc : public CreatureScript m_pInstance->SetData(TYPE_EVENT, 155); break; case 155: - if (Creature* pTemp = Unit::GetCreature((*me), m_pInstance->GetData64(NPC_GORMOK))) - { - pTemp->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_OOC_NOT_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); - pTemp->SetReactState(REACT_AGGRESSIVE); - pTemp->SetInCombatWithZone(); - } - m_pInstance->DoUseDoorOrButton(m_pInstance->GetData64(GO_MAIN_GATE_DOOR)); m_pInstance->SetData(TYPE_BEASTS, IN_PROGRESS); m_uiUpdateTimer = 5000; m_pInstance->SetData(TYPE_EVENT, 160); @@ -591,24 +583,20 @@ class npc_tirion_toc : public CreatureScript case 205: m_uiUpdateTimer = 3000; m_pInstance->SetData(TYPE_EVENT, 210); - m_pInstance->DoUseDoorOrButton(m_pInstance->GetData64(GO_MAIN_GATE_DOOR)); break; case 210: if (m_pInstance->GetData(TYPE_BEASTS) != DONE) { - me->SummonCreature(NPC_DREADSCALE, ToCCommonLoc[3].GetPositionX(), ToCCommonLoc[3].GetPositionY(), ToCCommonLoc[3].GetPositionZ(), 5, TEMPSUMMON_MANUAL_DESPAWN); - me->SummonCreature(NPC_ACIDMAW, ToCCommonLoc[4].GetPositionX(), ToCCommonLoc[4].GetPositionY(), ToCCommonLoc[4].GetPositionZ(), 5, TEMPSUMMON_MANUAL_DESPAWN); - if (Creature* pTemp = Unit::GetCreature((*me), m_pInstance->GetData64(NPC_DREADSCALE))) + m_pInstance->DoUseDoorOrButton(m_pInstance->GetData64(GO_MAIN_GATE_DOOR)); + if (Creature* pTemp = me->SummonCreature(NPC_DREADSCALE, ToCSpawnLoc[1].GetPositionX(), ToCSpawnLoc[1].GetPositionY(), ToCSpawnLoc[1].GetPositionZ(), 5, TEMPSUMMON_MANUAL_DESPAWN)) { pTemp->GetMotionMaster()->MovePoint(0, ToCCommonLoc[8].GetPositionX(), ToCCommonLoc[8].GetPositionY(), ToCCommonLoc[8].GetPositionZ()); - pTemp->AddUnitMovementFlag(MOVEMENTFLAG_WALKING); pTemp->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_OOC_NOT_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); pTemp->SetReactState(REACT_PASSIVE); } - if (Creature* pTemp = Unit::GetCreature((*me), m_pInstance->GetData64(NPC_ACIDMAW))) + if (Creature* pTemp = me->SummonCreature(NPC_ACIDMAW, ToCCommonLoc[9].GetPositionX(), ToCCommonLoc[9].GetPositionY(), ToCCommonLoc[9].GetPositionZ(), 5, TEMPSUMMON_MANUAL_DESPAWN)) { - pTemp->GetMotionMaster()->MovePoint(0, ToCCommonLoc[9].GetPositionX(), ToCCommonLoc[9].GetPositionY(), ToCCommonLoc[9].GetPositionZ()); - pTemp->AddUnitMovementFlag(MOVEMENTFLAG_WALKING); + pTemp->SetVisible(true); pTemp->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_OOC_NOT_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); pTemp->SetReactState(REACT_PASSIVE); } @@ -617,20 +605,7 @@ class npc_tirion_toc : public CreatureScript m_pInstance->SetData(TYPE_EVENT, 220); break; case 220: - if (Creature* pTemp = Unit::GetCreature((*me), m_pInstance->GetData64(NPC_DREADSCALE))) - { - pTemp->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_OOC_NOT_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); - pTemp->SetReactState(REACT_AGGRESSIVE); - pTemp->SetInCombatWithZone(); - } - if (Creature* pTemp = Unit::GetCreature((*me), m_pInstance->GetData64(NPC_ACIDMAW))) - { - pTemp->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_OOC_NOT_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); - pTemp->SetReactState(REACT_AGGRESSIVE); - pTemp->SetInCombatWithZone(); - } m_pInstance->SetData(TYPE_EVENT, 230); - m_pInstance->DoUseDoorOrButton(m_pInstance->GetData64(GO_MAIN_GATE_DOOR)); break; case 300: DoScriptText(SAY_STAGE_0_05, me); @@ -640,23 +615,23 @@ class npc_tirion_toc : public CreatureScript case 305: m_uiUpdateTimer = 3000; m_pInstance->SetData(TYPE_EVENT, 310); - m_pInstance->DoUseDoorOrButton(m_pInstance->GetData64(GO_MAIN_GATE_DOOR)); break; case 310: if (m_pInstance->GetData(TYPE_BEASTS) != DONE) { - me->SummonCreature(NPC_ICEHOWL, ToCCommonLoc[10].GetPositionX(), ToCCommonLoc[10].GetPositionY(), ToCCommonLoc[10].GetPositionZ(), 5, TEMPSUMMON_DEAD_DESPAWN); - if (Creature* pTemp = Unit::GetCreature((*me), m_pInstance->GetData64(NPC_ICEHOWL))) + m_pInstance->DoUseDoorOrButton(m_pInstance->GetData64(GO_MAIN_GATE_DOOR)); + if (Creature* pTemp = me->SummonCreature(NPC_ICEHOWL, ToCSpawnLoc[0].GetPositionX(), ToCSpawnLoc[0].GetPositionY(), ToCSpawnLoc[0].GetPositionZ(), 5, TEMPSUMMON_DEAD_DESPAWN)) { - pTemp->GetMotionMaster()->MovePoint(0, ToCCommonLoc[5].GetPositionX(), ToCCommonLoc[5].GetPositionY(), ToCCommonLoc[5].GetPositionZ()); - pTemp->SetInCombatWithZone(); + pTemp->GetMotionMaster()->MovePoint(2, ToCCommonLoc[5].GetPositionX(), ToCCommonLoc[5].GetPositionY(), ToCCommonLoc[5].GetPositionZ()); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_OOC_NOT_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); + me->SetReactState(REACT_PASSIVE); + } } m_uiUpdateTimer = 5000; m_pInstance->SetData(TYPE_EVENT, 315); break; case 315: - m_pInstance->DoUseDoorOrButton(m_pInstance->GetData64(GO_MAIN_GATE_DOOR)); m_pInstance->SetData(TYPE_EVENT, 320); break; case 400: @@ -673,7 +648,7 @@ class npc_tirion_toc : public CreatureScript DoScriptText(SAY_STAGE_1_01, me); m_uiUpdateTimer = 7000; m_pInstance->DoUseDoorOrButton(m_pInstance->GetData64(GO_MAIN_GATE_DOOR)); - me->SummonCreature(NPC_FIZZLEBANG, ToCCommonLoc[10].GetPositionX(), ToCCommonLoc[10].GetPositionY(), ToCCommonLoc[10].GetPositionZ(), 2, TEMPSUMMON_CORPSE_TIMED_DESPAWN, DESPAWN_TIME); + me->SummonCreature(NPC_FIZZLEBANG, ToCSpawnLoc[0].GetPositionX(), ToCSpawnLoc[0].GetPositionY(), ToCSpawnLoc[0].GetPositionZ(), 2, TEMPSUMMON_CORPSE_TIMED_DESPAWN, DESPAWN_TIME); m_pInstance->SetData(TYPE_EVENT, 0); break; case 1180: @@ -713,16 +688,14 @@ class npc_tirion_toc : public CreatureScript break; //Summoning crusaders case 3091: - me->SummonCreature(NPC_CHAMPIONS_CONTROLLER, ToCCommonLoc[1]); - if (Creature* pChampionController = Unit::GetCreature((*me), m_pInstance->GetData64(NPC_CHAMPIONS_CONTROLLER))) + if (Creature* pChampionController = me->SummonCreature(NPC_CHAMPIONS_CONTROLLER, ToCCommonLoc[1])) pChampionController->AI()->SetData(0, HORDE); m_uiUpdateTimer = 3000; m_pInstance->SetData(TYPE_EVENT, 3092); break; //Summoning crusaders case 3090: - me->SummonCreature(NPC_CHAMPIONS_CONTROLLER, ToCCommonLoc[1]); - if (Creature* pChampionController = Unit::GetCreature((*me), m_pInstance->GetData64(NPC_CHAMPIONS_CONTROLLER))) + if (Creature* pChampionController = me->SummonCreature(NPC_CHAMPIONS_CONTROLLER, ToCCommonLoc[1])) pChampionController->AI()->SetData(0, ALLIANCE); m_uiUpdateTimer = 3000; m_pInstance->SetData(TYPE_EVENT, 3092); @@ -745,14 +718,14 @@ class npc_tirion_toc : public CreatureScript break; case 4010: DoScriptText(SAY_STAGE_3_02, me); - if(Creature* pTemp = me->SummonCreature(NPC_LIGHTBANE, ToCCommonLoc[3].GetPositionX(), ToCCommonLoc[3].GetPositionY(), ToCCommonLoc[3].GetPositionZ(), 5, TEMPSUMMON_CORPSE_TIMED_DESPAWN, DESPAWN_TIME)) + if(Creature* pTemp = me->SummonCreature(NPC_LIGHTBANE, ToCSpawnLoc[1].GetPositionX(), ToCSpawnLoc[1].GetPositionY(), ToCSpawnLoc[1].GetPositionZ(), 5, TEMPSUMMON_CORPSE_TIMED_DESPAWN, DESPAWN_TIME)) { pTemp->SetVisible(false); pTemp->SetReactState(REACT_PASSIVE); pTemp->SummonCreature(NPC_LIGHT_ESSENCE, TwinValkyrsLoc[0].GetPositionX(), TwinValkyrsLoc[0].GetPositionY(), TwinValkyrsLoc[0].GetPositionZ()); pTemp->SummonCreature(NPC_LIGHT_ESSENCE, TwinValkyrsLoc[1].GetPositionX(), TwinValkyrsLoc[1].GetPositionY(), TwinValkyrsLoc[1].GetPositionZ()); } - if(Creature* pTemp = me->SummonCreature(NPC_DARKBANE, ToCCommonLoc[4].GetPositionX(), ToCCommonLoc[4].GetPositionY(), ToCCommonLoc[4].GetPositionZ(), 5, TEMPSUMMON_CORPSE_TIMED_DESPAWN, DESPAWN_TIME)) + if(Creature* pTemp = me->SummonCreature(NPC_DARKBANE, ToCSpawnLoc[2].GetPositionX(), ToCSpawnLoc[2].GetPositionY(), ToCSpawnLoc[2].GetPositionZ(), 5, TEMPSUMMON_CORPSE_TIMED_DESPAWN, DESPAWN_TIME)) { pTemp->SetVisible(false); pTemp->SetReactState(REACT_PASSIVE); @@ -766,14 +739,12 @@ class npc_tirion_toc : public CreatureScript m_pInstance->DoUseDoorOrButton(m_pInstance->GetData64(GO_MAIN_GATE_DOOR)); if (Creature* pTemp = Unit::GetCreature((*me), m_pInstance->GetData64(NPC_LIGHTBANE))) { - pTemp->GetMotionMaster()->MovePoint(0, ToCCommonLoc[6].GetPositionX(), ToCCommonLoc[6].GetPositionY(), ToCCommonLoc[6].GetPositionZ()); - pTemp->AddUnitMovementFlag(MOVEMENTFLAG_WALKING); + pTemp->GetMotionMaster()->MovePoint(1, ToCCommonLoc[8].GetPositionX(), ToCCommonLoc[8].GetPositionY(), ToCCommonLoc[8].GetPositionZ()); pTemp->SetVisible(true); } if (Creature* pTemp = Unit::GetCreature((*me), m_pInstance->GetData64(NPC_DARKBANE))) { - pTemp->GetMotionMaster()->MovePoint(0, ToCCommonLoc[7].GetPositionX(), ToCCommonLoc[7].GetPositionY(), ToCCommonLoc[7].GetPositionZ()); - pTemp->AddUnitMovementFlag(MOVEMENTFLAG_WALKING); + pTemp->GetMotionMaster()->MovePoint(1, ToCCommonLoc[9].GetPositionX(), ToCCommonLoc[9].GetPositionY(), ToCCommonLoc[9].GetPositionZ()); pTemp->SetVisible(true); } m_uiUpdateTimer = 5000; @@ -781,7 +752,6 @@ class npc_tirion_toc : public CreatureScript break; case 4016: m_pInstance->SetData(TYPE_EVENT, 4017); - m_pInstance->DoUseDoorOrButton(m_pInstance->GetData64(GO_MAIN_GATE_DOOR)); break; case 4040: m_uiUpdateTimer = 60000; @@ -795,7 +765,7 @@ class npc_tirion_toc : public CreatureScript case 5005: m_uiUpdateTimer = 8000; m_pInstance->SetData(TYPE_EVENT, 5010); - me->SummonCreature(NPC_LICH_KING_1, ToCCommonLoc[2].GetPositionX(), ToCCommonLoc[2].GetPositionY(), ToCCommonLoc[2].GetPositionZ(), 5); + me->SummonCreature(NPC_LICH_KING_1, ToCSpawnLoc[0].GetPositionX(), ToCSpawnLoc[0].GetPositionY(), ToCSpawnLoc[0].GetPositionZ(), 5); break; case 5020: DoScriptText(SAY_STAGE_4_03, me); diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.h b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.h index a0ee721a26a..99525b6fb32 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.h +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.h @@ -35,6 +35,13 @@ enum DESPAWN_TIME = 300000, }; +const Position ToCSpawnLoc[]= +{ + {563.912f, 261.625f, 394.73f, 4.70437f}, // 0 Center + {575.451f, 261.496f, 394.73f, 4.6541f}, // 1 Left + {549.951f, 261.55f, 394.73f, 4.74835f}, // 2 Right +}; + const Position ToCCommonLoc[]= { {559.257996f, 90.266197f, 395.122986f, 0}, // 0 Barrent diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp index dfdf03c421e..248dd31c2a8 100644 --- a/src/server/scripts/Spells/spell_generic.cpp +++ b/src/server/scripts/Spells/spell_generic.cpp @@ -1313,6 +1313,52 @@ class spell_gen_vehicle_scaling : public SpellScriptLoader } }; + +class spell_gen_oracle_wolvar_reputation: public SpellScriptLoader +{ +public: + spell_gen_oracle_wolvar_reputation() : SpellScriptLoader("spell_gen_oracle_wolvar_reputation") { } + + class spell_gen_oracle_wolvar_reputation_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_oracle_wolvar_reputation_SpellScript) + + void HandleDummy(SpellEffIndex effIndex) + { + + if (Player* player = GetCaster()->ToPlayer()) + { + + uint32 factionId = GetSpellInfo()->Effects[effIndex].CalcValue(); + int32 repChange = GetSpellInfo()->Effects[EFFECT_1].CalcValue(); + + FactionEntry const* factionEntry = sFactionStore.LookupEntry(factionId); + + if (!factionEntry) + return; + + // Set rep to baserep + basepoints (expecting spillover for oposite faction -> become hated) + // Not when player already has equal or higher rep with this faction + if (player->GetReputationMgr().GetBaseReputation(factionEntry) < repChange) + player->GetReputationMgr().SetReputation(factionEntry, repChange); + + // EFFECT_INDEX_2 most likely update at war state, we already handle this in SetReputation + } + + } + + void Register() + { + OnEffect += SpellEffectFn(spell_gen_oracle_wolvar_reputation_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_gen_oracle_wolvar_reputation_SpellScript(); + } +}; + void AddSC_generic_spell_scripts() { new spell_gen_absorb0_hitlimit1(); @@ -1343,4 +1389,5 @@ void AddSC_generic_spell_scripts() new spell_gen_allow_cast_from_item_only(); new spell_gen_launch(); new spell_gen_vehicle_scaling(); + new spell_gen_oracle_wolvar_reputation(); } |