diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/bindings/scripts/scripts/zone/black_temple/boss_illidan.cpp | 2 | ||||
-rw-r--r-- | src/bindings/scripts/scripts/zone/hellfire_citadel/magtheridons_lair/boss_magtheridon.cpp | 20 | ||||
-rw-r--r-- | src/bindings/scripts/scripts/zone/hellfire_citadel/magtheridons_lair/instance_magtheridons_lair.cpp | 9 | ||||
-rw-r--r-- | src/bindings/scripts/scripts/zone/shadowmoon_valley/shadowmoon_valley.cpp | 505 | ||||
-rw-r--r-- | src/bindings/scripts/scripts/zone/sunwell_plateau/boss_brutallus.cpp | 6 | ||||
-rw-r--r-- | src/game/Map.cpp | 16 | ||||
-rw-r--r-- | src/game/Object.cpp | 12 | ||||
-rw-r--r-- | src/game/Object.h | 1 | ||||
-rw-r--r-- | src/game/Spell.cpp | 8 | ||||
-rw-r--r-- | src/game/SpellEffects.cpp | 16 | ||||
-rw-r--r-- | src/game/TargetedMovementGenerator.cpp | 6 | ||||
-rw-r--r-- | src/game/Unit.cpp | 10 | ||||
-rw-r--r-- | src/game/Unit.h | 1 |
13 files changed, 304 insertions, 308 deletions
diff --git a/src/bindings/scripts/scripts/zone/black_temple/boss_illidan.cpp b/src/bindings/scripts/scripts/zone/black_temple/boss_illidan.cpp index f1278aa8c6e..9f0a47acdf6 100644 --- a/src/bindings/scripts/scripts/zone/black_temple/boss_illidan.cpp +++ b/src/bindings/scripts/scripts/zone/black_temple/boss_illidan.cpp @@ -2079,7 +2079,7 @@ void boss_illidan_stormrageAI::Reset() m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY+1, 0); m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING + MOVEMENTFLAG_ONTRANSPORT); - DoCast(m_creature, SPELL_DUAL_WIELD, true); + m_creature->CastSpell(m_creature, SPELL_DUAL_WIELD, true); } void boss_illidan_stormrageAI::HandleTalkSequence() diff --git a/src/bindings/scripts/scripts/zone/hellfire_citadel/magtheridons_lair/boss_magtheridon.cpp b/src/bindings/scripts/scripts/zone/hellfire_citadel/magtheridons_lair/boss_magtheridon.cpp index 49dd5d5950d..458dafa2511 100644 --- a/src/bindings/scripts/scripts/zone/hellfire_citadel/magtheridons_lair/boss_magtheridon.cpp +++ b/src/bindings/scripts/scripts/zone/hellfire_citadel/magtheridons_lair/boss_magtheridon.cpp @@ -31,7 +31,7 @@ EndScriptData */ #define SPELL_BLASTNOVA 30616 #define SPELL_CLEAVE 30619 -#define SPELL_QUAKE_TRIGGER 30576 // must be cast with 30561 as the proc spell +#define SPELL_QUAKE_TRIGGER 30657 // must be cast with 30561 as the proc spell #define SPELL_QUAKE_KNOCKBACK 30571 #define SPELL_BLAZE_TARGET 30541 // core bug, does not support target 7 #define SPELL_BLAZE_TRAP 30542 @@ -168,6 +168,21 @@ struct TRINITY_DLL_DECL boss_magtheridonAI : public ScriptedAI pInstance =(ScriptedInstance*)m_creature->GetInstanceData(); m_creature->SetFloatValue(UNIT_FIELD_BOUNDINGRADIUS, 10); m_creature->SetFloatValue(UNIT_FIELD_COMBATREACH, 10); + + // target 7, random target with certain entry spell, need core fix + SpellEntry *TempSpell; + TempSpell = (SpellEntry*)GetSpellStore()->LookupEntry(SPELL_BLAZE_TARGET); + if(TempSpell && TempSpell->EffectImplicitTargetA[0] != 6) + { + TempSpell->EffectImplicitTargetA[0] = 6; + TempSpell->EffectImplicitTargetB[0] = 0; + } + TempSpell = (SpellEntry*)GetSpellStore()->LookupEntry(SPELL_QUAKE_TRIGGER); + if(TempSpell && TempSpell->EffectTriggerSpell[0] != SPELL_QUAKE_KNOCKBACK) + { + TempSpell->EffectTriggerSpell[0] = SPELL_QUAKE_KNOCKBACK; + } + Reset(); } @@ -328,8 +343,7 @@ struct TRINITY_DLL_DECL boss_magtheridonAI : public ScriptedAI // to avoid blastnova interruption if(!m_creature->IsNonMeleeSpellCasted(false)) { - int32 i = SPELL_QUAKE_KNOCKBACK; - m_creature->CastCustomSpell(m_creature, SPELL_QUAKE_TRIGGER, &i, 0, 0, false); + m_creature->CastSpell(m_creature, SPELL_QUAKE_TRIGGER, true); Quake_Timer = 50000; } }else Quake_Timer -= diff; diff --git a/src/bindings/scripts/scripts/zone/hellfire_citadel/magtheridons_lair/instance_magtheridons_lair.cpp b/src/bindings/scripts/scripts/zone/hellfire_citadel/magtheridons_lair/instance_magtheridons_lair.cpp index b059b81c1bd..8a6815e068a 100644 --- a/src/bindings/scripts/scripts/zone/hellfire_citadel/magtheridons_lair/instance_magtheridons_lair.cpp +++ b/src/bindings/scripts/scripts/zone/hellfire_citadel/magtheridons_lair/instance_magtheridons_lair.cpp @@ -26,8 +26,6 @@ EndScriptData */ #define SPELL_SOUL_TRANSFER 30531 // core bug, does not support target 7 #define SPELL_BLAZE_TARGET 30541 // core bug, does not support target 7 -#define SPELL_DEBRIS_DAMAGE 30631 // core bug, does not support target 8 -#define SPELL_DEBRIS_KNOCKDOWN 36449 // core bug, does not support target 8 #define CHAMBER_CENTER_X -15.14 #define CHAMBER_CENTER_Y 1.8 @@ -40,13 +38,6 @@ struct TRINITY_DLL_DECL instance_magtheridons_lair : public ScriptedInstance instance_magtheridons_lair(Map *Map) : ScriptedInstance(Map) { Initialize(); - // target 7, random target with certain entry spell, need core fix - SpellEntry *TempSpell = (SpellEntry*)GetSpellStore()->LookupEntry(SPELL_BLAZE_TARGET); - if(TempSpell && TempSpell->EffectImplicitTargetA[0] != 6) - { - TempSpell->EffectImplicitTargetA[0] = 6; - TempSpell->EffectImplicitTargetB[0] = 0; - } } uint32 Encounters[ENCOUNTERS]; diff --git a/src/bindings/scripts/scripts/zone/shadowmoon_valley/shadowmoon_valley.cpp b/src/bindings/scripts/scripts/zone/shadowmoon_valley/shadowmoon_valley.cpp index 8024b1d0bd2..7bc1ad312a9 100644 --- a/src/bindings/scripts/scripts/zone/shadowmoon_valley/shadowmoon_valley.cpp +++ b/src/bindings/scripts/scripts/zone/shadowmoon_valley/shadowmoon_valley.cpp @@ -813,261 +813,266 @@ void DoSpeach(int phase) struct TRINITY_DLL_DECL Overlord_MorghorAI : public ScriptedAI { -Overlord_MorghorAI(Creature *c) : ScriptedAI(c) {Reset();} - - Unit* m_player; - Unit* PlayerCheck; - - uint32 SpeachTimer; - uint32 SpeachNum; - - uint64 PlayerGUID; - uint64 YazillGUID; - - bool DoingSpeach; - bool Failed; - - Creature* Lord; - Creature* Yarzill; - -void Reset() -{ - if (Lord) - { - Lord->SetUInt64Value(UNIT_FIELD_TARGET, 0); - Lord->SetVisibility(VISIBILITY_OFF); - Lord->setDeathState(JUST_DIED); - } + Overlord_MorghorAI(Creature *c) : ScriptedAI(c) + { + Lord = NULL; + Yarzill = NULL; + Reset(); + } - if (Yarzill) - { - Yarzill->SetUInt64Value(UNIT_FIELD_TARGET, 0); - } - - m_creature->Relocate(-5085.77, 577.231, 86.6719, 2.32608); - m_creature->SetUInt32Value(UNIT_NPC_FLAGS, 2); - m_creature->SetUInt64Value(UNIT_FIELD_TARGET, 0); - m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1,0); - m_player = NULL; - PlayerCheck = NULL; - PlayerGUID = 0; - YazillGUID = 0; - Lord = NULL; - Yarzill = NULL; - DoingSpeach = false; - Failed = false; - SpeachNum = 0; - SpeachTimer = 0; -} + Unit* m_player; + Unit* PlayerCheck; -void BeginSpeach(Unit* target) -{ - m_creature->SetUInt32Value(UNIT_NPC_FLAGS, 0); - m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1,0); - DoSay(OVERLORD_SAY_1,LANG_UNIVERSAL,target); - m_player = target; - PlayerCheck = NULL; - PlayerGUID = target->GetGUID(); - SpeachTimer = 4200; - SpeachNum = 0; - DoingSpeach = true; -} - -void Aggro(Unit *who){} + uint32 SpeachTimer; + uint32 SpeachNum; -void MoveInLineOfSight(Unit *who) -{ - if (!who) - return; + uint64 PlayerGUID; + uint64 YazillGUID; - if (DoingSpeach) - { - if (who->GetEntry() == 23141 && m_creature->IsWithinDistInMap(who, 15)) - { - if (!YazillGUID) - { - YazillGUID = who->GetGUID(); - } - } - } -} + bool DoingSpeach; + bool Failed; -void UpdateAI(const uint32 diff) -{ - //Speach - if (DoingSpeach) - { - if (SpeachTimer < diff) - { - if (YazillGUID && !Yarzill) - Yarzill = ((Creature*)Unit::GetUnit((*m_creature), YazillGUID)); - - if (!m_creature->IsWithinDistInMap(m_player, 50) && ((Player*)m_player)->GetQuestStatus(QUEST_LORD_ILLIDAN_STORMRAGE) == QUEST_STATUS_INCOMPLETE) - { - ((Player*)m_player)->FailQuest(QUEST_LORD_ILLIDAN_STORMRAGE); - SpeachNum = 30; - } - - switch (SpeachNum) - { - // Overlord Movement - case 0: - m_creature->GetMotionMaster()->MovePoint(0, -5104.41, 595.297, 85.6838); - SpeachTimer = 9000; SpeachNum++; break; - // Overlord Yell 1 - case 1: - m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_SHOUT); - DoYell(OVERLORD_YELL_1,LANG_UNIVERSAL,m_player); - SpeachTimer = 4500; SpeachNum++; break; - // Overlord Angle - case 2: - m_creature->SetUInt64Value(UNIT_FIELD_TARGET, PlayerGUID); - SpeachTimer = 3200; SpeachNum++; break; - // Overlord Say 2 - case 3: - DoSay(OVERLORD_SAY_2,LANG_UNIVERSAL,NULL); - SpeachTimer = 2000; SpeachNum++; break; - // Summon Illidan - case 4: - Lord = m_creature->SummonCreature(LORD_ILLIDAN_STORMRAGE, -5107.83, 602.584, 85.2393, 4.92598, TEMPSUMMON_CORPSE_DESPAWN, 0); - Lord->LoadCreaturesAddon(); - SpeachTimer = 350; SpeachNum++; break; - // Illidan Cast Red Bolt - case 5: - Lord->CastSpell(Lord, SPELL_ONE, true); - Lord->SetUInt64Value(UNIT_FIELD_TARGET, m_creature->GetGUID()); - m_creature->SetUInt64Value(UNIT_FIELD_TARGET, Lord->GetGUID()); - SpeachTimer = 2000; SpeachNum++; break; - // Overlord Yell 2 - case 6: - DoYell(OVERLORD_YELL_2,LANG_UNIVERSAL,NULL); - SpeachTimer = 4500; SpeachNum++; break; - // Overlord Kneel - case 7: - m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1,8); - SpeachTimer = 2500; SpeachNum++; break; - // Overlord Say 3 - case 8: - DoSay(OVERLORD_SAY_3,LANG_UNIVERSAL,NULL); - SpeachTimer = 6500; SpeachNum++; break; - // Illidan Say 1 - case 9: - ((Lord_IllidanAI*)Lord->AI())->DoSpeach(1); - SpeachTimer = 5000; SpeachNum++; break; - // Overlord Say 4 - case 10: - DoSay(OVERLORD_SAY_4,LANG_UNIVERSAL,m_player); - SpeachTimer = 6000; SpeachNum++; break; - // Illidan Say 2 - case 11: - ((Lord_IllidanAI*)Lord->AI())->DoSpeach(2); - SpeachTimer = 5500; SpeachNum++; break; - // Illidan Say 3 - case 12: - ((Lord_IllidanAI*)Lord->AI())->DoSpeach(3); - SpeachTimer = 4000; SpeachNum++; break; - // Illidan Angle - case 13: - Lord->SetUInt64Value(UNIT_FIELD_TARGET, PlayerGUID); - SpeachTimer = 1500; SpeachNum++; break; - // Illidan Say 4 - case 14: - ((Lord_IllidanAI*)Lord->AI())->DoSpeach(4); - SpeachTimer = 1500; SpeachNum++; break; - // Illidan Cast - case 15: - PlayerCheck = Unit::GetUnit(*Lord, PlayerGUID); - if (PlayerCheck) - { - Lord->CastSpell(m_player, SPELL_TWO, true); - m_player->RemoveAurasDueToSpell(SPELL_THREE); - m_player->RemoveAurasDueToSpell(SPELL_FOUR); - SpeachTimer = 5000; SpeachNum++; - } - else - { - ((Player*)m_player)->FailQuest(QUEST_LORD_ILLIDAN_STORMRAGE); - SpeachTimer = 100; SpeachNum = 30; - } - break; - // Illidan Say 5 - case 16: - ((Lord_IllidanAI*)Lord->AI())->DoSpeach(5); - SpeachTimer = 5000; SpeachNum++; break; - // Illidan Say 6 - case 17: - ((Lord_IllidanAI*)Lord->AI())->DoSpeach(6); - SpeachTimer = 5000; SpeachNum++; break; - // Illidan Say 7 - case 18: - ((Lord_IllidanAI*)Lord->AI())->DoSpeach(7); - SpeachTimer = 5000; SpeachNum++; break; - // Illidan Fly - case 19: - Lord->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF); - Lord->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT + MOVEMENTFLAG_LEVITATING); - SpeachTimer = 500; SpeachNum++; break; - // Overlord Say 5 - case 20: - DoSay(OVERLORD_SAY_5,LANG_UNIVERSAL,NULL); - SpeachTimer = 500; SpeachNum++; break; - // Illidan Despawn - case 21: - Lord->SetVisibility(VISIBILITY_OFF); - Lord->setDeathState(JUST_DIED); - Lord = NULL; - SpeachTimer = 1000; SpeachNum++; break; - // Overlord Stand Up - case 22: - m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1,0); - SpeachTimer = 2000; SpeachNum++; break; - // Overlord Angle - case 23: - m_creature->SetUInt64Value(UNIT_FIELD_TARGET, PlayerGUID); - SpeachTimer = 5000; SpeachNum++; break; - // Overlord Say 6 - case 24: - DoSay(OVERLORD_SAY_6,LANG_UNIVERSAL,NULL); - SpeachTimer = 2000; SpeachNum++; break; - // Complete Quest - case 25: - ((Player*)m_player)->CompleteQuest(QUEST_LORD_ILLIDAN_STORMRAGE); - SpeachTimer = 6000; SpeachNum++; break; - // Goblin Angle - case 26: - if (Yarzill) - Yarzill->SetUInt64Value(UNIT_FIELD_TARGET, PlayerGUID); - SpeachTimer = 500; SpeachNum++; break; - // Cast Again Dragonaw Illusion - case 27: - m_player->RemoveAurasDueToSpell(SPELL_TWO); - m_player->RemoveAurasDueToSpell(41519); - m_player->CastSpell(m_player, SPELL_THREE, true); - m_player->CastSpell(m_player, SPELL_FOUR, true); - SpeachTimer = 1000; SpeachNum++; break; - // Goblin - case 28: - if (Yarzill) - ((Yarzill_The_MercAI*)Yarzill->AI())->DoSpeach(m_player); - SpeachTimer = 5000; SpeachNum++; break; - // Goblin Off - case 29: - if (Yarzill) - Yarzill->SetUInt64Value(UNIT_FIELD_TARGET, 0); - SpeachTimer = 5000; SpeachNum++; break; - // Overlord Go Back - case 30: - m_creature->GetMotionMaster()->MovePoint(0, -5085.77, 577.231, 86.6719); - SpeachTimer = 5000; SpeachNum++; break; - // Reset - case 31: - Reset(); - break; - default: break; - } - }else SpeachTimer -= diff; -} -} + Creature* Lord; + Creature* Yarzill; + + void Reset() + { + if (Lord) + { + Lord->SetUInt64Value(UNIT_FIELD_TARGET, 0); + Lord->SetVisibility(VISIBILITY_OFF); + Lord->setDeathState(JUST_DIED); + } + + if (Yarzill) + { + Yarzill->SetUInt64Value(UNIT_FIELD_TARGET, 0); + } + + m_creature->Relocate(-5085.77, 577.231, 86.6719, 2.32608); + m_creature->SetUInt32Value(UNIT_NPC_FLAGS, 2); + m_creature->SetUInt64Value(UNIT_FIELD_TARGET, 0); + m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1,0); + m_player = NULL; + PlayerCheck = NULL; + PlayerGUID = 0; + YazillGUID = 0; + Lord = NULL; + Yarzill = NULL; + DoingSpeach = false; + Failed = false; + SpeachNum = 0; + SpeachTimer = 0; + } + + void BeginSpeach(Unit* target) + { + m_creature->SetUInt32Value(UNIT_NPC_FLAGS, 0); + m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1,0); + DoSay(OVERLORD_SAY_1,LANG_UNIVERSAL,target); + m_player = target; + PlayerCheck = NULL; + PlayerGUID = target->GetGUID(); + SpeachTimer = 4200; + SpeachNum = 0; + DoingSpeach = true; + } + + void Aggro(Unit *who){} + + void MoveInLineOfSight(Unit *who) + { + if (!who) + return; + + if (DoingSpeach) + { + if (who->GetEntry() == 23141 && m_creature->IsWithinDistInMap(who, 15)) + { + if (!YazillGUID) + { + YazillGUID = who->GetGUID(); + } + } + } + } + + void UpdateAI(const uint32 diff) + { + //Speach + if (DoingSpeach) + { + if (SpeachTimer < diff) + { + if (YazillGUID && !Yarzill) + Yarzill = ((Creature*)Unit::GetUnit((*m_creature), YazillGUID)); + + if (!m_creature->IsWithinDistInMap(m_player, 50) && ((Player*)m_player)->GetQuestStatus(QUEST_LORD_ILLIDAN_STORMRAGE) == QUEST_STATUS_INCOMPLETE) + { + ((Player*)m_player)->FailQuest(QUEST_LORD_ILLIDAN_STORMRAGE); + SpeachNum = 30; + } + + switch (SpeachNum) + { + // Overlord Movement + case 0: + m_creature->GetMotionMaster()->MovePoint(0, -5104.41, 595.297, 85.6838); + SpeachTimer = 9000; SpeachNum++; break; + // Overlord Yell 1 + case 1: + m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_SHOUT); + DoYell(OVERLORD_YELL_1,LANG_UNIVERSAL,m_player); + SpeachTimer = 4500; SpeachNum++; break; + // Overlord Angle + case 2: + m_creature->SetUInt64Value(UNIT_FIELD_TARGET, PlayerGUID); + SpeachTimer = 3200; SpeachNum++; break; + // Overlord Say 2 + case 3: + DoSay(OVERLORD_SAY_2,LANG_UNIVERSAL,NULL); + SpeachTimer = 2000; SpeachNum++; break; + // Summon Illidan + case 4: + Lord = m_creature->SummonCreature(LORD_ILLIDAN_STORMRAGE, -5107.83, 602.584, 85.2393, 4.92598, TEMPSUMMON_CORPSE_DESPAWN, 0); + Lord->LoadCreaturesAddon(); + SpeachTimer = 350; SpeachNum++; break; + // Illidan Cast Red Bolt + case 5: + Lord->CastSpell(Lord, SPELL_ONE, true); + Lord->SetUInt64Value(UNIT_FIELD_TARGET, m_creature->GetGUID()); + m_creature->SetUInt64Value(UNIT_FIELD_TARGET, Lord->GetGUID()); + SpeachTimer = 2000; SpeachNum++; break; + // Overlord Yell 2 + case 6: + DoYell(OVERLORD_YELL_2,LANG_UNIVERSAL,NULL); + SpeachTimer = 4500; SpeachNum++; break; + // Overlord Kneel + case 7: + m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1,8); + SpeachTimer = 2500; SpeachNum++; break; + // Overlord Say 3 + case 8: + DoSay(OVERLORD_SAY_3,LANG_UNIVERSAL,NULL); + SpeachTimer = 6500; SpeachNum++; break; + // Illidan Say 1 + case 9: + ((Lord_IllidanAI*)Lord->AI())->DoSpeach(1); + SpeachTimer = 5000; SpeachNum++; break; + // Overlord Say 4 + case 10: + DoSay(OVERLORD_SAY_4,LANG_UNIVERSAL,m_player); + SpeachTimer = 6000; SpeachNum++; break; + // Illidan Say 2 + case 11: + ((Lord_IllidanAI*)Lord->AI())->DoSpeach(2); + SpeachTimer = 5500; SpeachNum++; break; + // Illidan Say 3 + case 12: + ((Lord_IllidanAI*)Lord->AI())->DoSpeach(3); + SpeachTimer = 4000; SpeachNum++; break; + // Illidan Angle + case 13: + Lord->SetUInt64Value(UNIT_FIELD_TARGET, PlayerGUID); + SpeachTimer = 1500; SpeachNum++; break; + // Illidan Say 4 + case 14: + ((Lord_IllidanAI*)Lord->AI())->DoSpeach(4); + SpeachTimer = 1500; SpeachNum++; break; + // Illidan Cast + case 15: + PlayerCheck = Unit::GetUnit(*Lord, PlayerGUID); + if (PlayerCheck) + { + Lord->CastSpell(m_player, SPELL_TWO, true); + m_player->RemoveAurasDueToSpell(SPELL_THREE); + m_player->RemoveAurasDueToSpell(SPELL_FOUR); + SpeachTimer = 5000; SpeachNum++; + } + else + { + ((Player*)m_player)->FailQuest(QUEST_LORD_ILLIDAN_STORMRAGE); + SpeachTimer = 100; SpeachNum = 30; + } + break; + // Illidan Say 5 + case 16: + ((Lord_IllidanAI*)Lord->AI())->DoSpeach(5); + SpeachTimer = 5000; SpeachNum++; break; + // Illidan Say 6 + case 17: + ((Lord_IllidanAI*)Lord->AI())->DoSpeach(6); + SpeachTimer = 5000; SpeachNum++; break; + // Illidan Say 7 + case 18: + ((Lord_IllidanAI*)Lord->AI())->DoSpeach(7); + SpeachTimer = 5000; SpeachNum++; break; + // Illidan Fly + case 19: + Lord->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF); + Lord->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT + MOVEMENTFLAG_LEVITATING); + SpeachTimer = 500; SpeachNum++; break; + // Overlord Say 5 + case 20: + DoSay(OVERLORD_SAY_5,LANG_UNIVERSAL,NULL); + SpeachTimer = 500; SpeachNum++; break; + // Illidan Despawn + case 21: + Lord->SetVisibility(VISIBILITY_OFF); + Lord->setDeathState(JUST_DIED); + Lord = NULL; + SpeachTimer = 1000; SpeachNum++; break; + // Overlord Stand Up + case 22: + m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1,0); + SpeachTimer = 2000; SpeachNum++; break; + // Overlord Angle + case 23: + m_creature->SetUInt64Value(UNIT_FIELD_TARGET, PlayerGUID); + SpeachTimer = 5000; SpeachNum++; break; + // Overlord Say 6 + case 24: + DoSay(OVERLORD_SAY_6,LANG_UNIVERSAL,NULL); + SpeachTimer = 2000; SpeachNum++; break; + // Complete Quest + case 25: + ((Player*)m_player)->CompleteQuest(QUEST_LORD_ILLIDAN_STORMRAGE); + SpeachTimer = 6000; SpeachNum++; break; + // Goblin Angle + case 26: + if (Yarzill) + Yarzill->SetUInt64Value(UNIT_FIELD_TARGET, PlayerGUID); + SpeachTimer = 500; SpeachNum++; break; + // Cast Again Dragonaw Illusion + case 27: + m_player->RemoveAurasDueToSpell(SPELL_TWO); + m_player->RemoveAurasDueToSpell(41519); + m_player->CastSpell(m_player, SPELL_THREE, true); + m_player->CastSpell(m_player, SPELL_FOUR, true); + SpeachTimer = 1000; SpeachNum++; break; + // Goblin + case 28: + if (Yarzill) + ((Yarzill_The_MercAI*)Yarzill->AI())->DoSpeach(m_player); + SpeachTimer = 5000; SpeachNum++; break; + // Goblin Off + case 29: + if (Yarzill) + Yarzill->SetUInt64Value(UNIT_FIELD_TARGET, 0); + SpeachTimer = 5000; SpeachNum++; break; + // Overlord Go Back + case 30: + m_creature->GetMotionMaster()->MovePoint(0, -5085.77, 577.231, 86.6719); + SpeachTimer = 5000; SpeachNum++; break; + // Reset + case 31: + Reset(); + break; + default: break; + } + }else SpeachTimer -= diff; + } + } }; CreatureAI* GetAI_Overlord_Morghor(Creature *_Creature) diff --git a/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_brutallus.cpp b/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_brutallus.cpp index fefc0655383..fc1bca5233f 100644 --- a/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_brutallus.cpp +++ b/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_brutallus.cpp @@ -59,6 +59,7 @@ EndScriptData */ #define SPELL_BURN 46394 #define SPELL_STOMP 45185 #define SPELL_BERSERK 26662 +#define SPELL_DUAL_WIELD 42459 struct TRINITY_DLL_DECL boss_brutallusAI : public ScriptedAI { @@ -75,6 +76,7 @@ struct TRINITY_DLL_DECL boss_brutallusAI : public ScriptedAI StompTimer = 30000; BurnTimer = 60000; BerserkTimer = 360000; + m_creature->CastSpell(m_creature, SPELL_DUAL_WIELD, true); } void Aggro(Unit *who) @@ -145,8 +147,8 @@ struct TRINITY_DLL_DECL boss_brutallusAI : public ScriptedAI if(BurnTimer < diff) { - Unit *target = SelectUnit(SELECT_TARGET_RANDOM, 0); - //DoCast(target,SPELL_BURN); + if(Unit *target = SelectUnit(SELECT_TARGET_RANDOM, 0)) + target->CastSpell(target,SPELL_BURN,true); BurnTimer = 60000; } else BurnTimer -= diff; diff --git a/src/game/Map.cpp b/src/game/Map.cpp index 04d7e028479..87bd6344c38 100644 --- a/src/game/Map.cpp +++ b/src/game/Map.cpp @@ -1419,13 +1419,6 @@ InstanceMap::~InstanceMap() */ bool InstanceMap::CanEnter(Player *player) { - if(!player->isGameMaster() && i_data && i_data->IsEncounterInProgress()) - { - sLog.outDebug("InstanceMap::CanEnter - Player '%s' can't enter instance '%s' while an encounter is in progress.", player->GetName(), GetMapName()); - player->SendTransferAborted(GetId(), TRANSFER_ABORT_ZONE_IN_COMBAT); - return false; - } - if(std::find(i_Players.begin(),i_Players.end(),player)!=i_Players.end()) { sLog.outError("InstanceMap::CanEnter - player %s(%u) already in map %d,%d,%d!", player->GetName(), player->GetGUIDLow(), GetId(), GetInstanceId(), GetSpawnMode()); @@ -1444,12 +1437,19 @@ bool InstanceMap::CanEnter(Player *player) // cannot enter while players in the instance are in combat Group *pGroup = player->GetGroup(); - if(pGroup && pGroup->InCombatToInstance(GetInstanceId()) && player->isAlive() && player->GetMapId() != GetId()) + if(!player->isGameMaster() && pGroup && pGroup->InCombatToInstance(GetInstanceId()) && player->isAlive() && player->GetMapId() != GetId()) { player->SendTransferAborted(GetId(), TRANSFER_ABORT_ZONE_IN_COMBAT); return false; } + /*if(!player->isGameMaster() && i_data && i_data->IsEncounterInProgress()) + { + sLog.outDebug("InstanceMap::CanEnter - Player '%s' can't enter instance '%s' while an encounter is in progress.", player->GetName(), GetMapName()); + player->SendTransferAborted(GetId(), TRANSFER_ABORT_ZONE_IN_COMBAT); + return false; + }*/ + return Map::CanEnter(player); } diff --git a/src/game/Object.cpp b/src/game/Object.cpp index 5a4d5d126f4..d7ec1c110cc 100644 --- a/src/game/Object.cpp +++ b/src/game/Object.cpp @@ -1531,14 +1531,4 @@ void WorldObject::GetNearPoint(WorldObject const* searcher, float &x, float &y, z = GetPositionZ(); UpdateGroundPositionZ(x,y,z); -} - -void WorldObject::GetRandomContactPoint( const WorldObject* obj, float &x, float &y, float &z, float distance2dMin, float distance2dMax ) const -{ - float object_size = obj->GetObjectSize();//here we use object_size to determine the angle offset, the bigger object the smaller angle offset, then this makes mob move naturally in visual. - //let assume 12.0f is the max size for object to have 0 angle offset. - float angle_offset_ratio = 1 - object_size/12.0f; - if (angle_offset_ratio < 0.05) angle_offset_ratio = 0.05; - // angle to face `obj` to `this`plus a random angle offset(from -90 degree to 90 degree)*angle_offset_ratio using distance from distance2dMin to distance2dMax includes size of `obj` - GetNearPoint(obj,x,y,z,object_size,distance2dMin+(distance2dMax-distance2dMin)*rand_norm(), GetAngle( obj ) + (M_PI/2 - M_PI * rand_norm()) * angle_offset_ratio); -} +}
\ No newline at end of file diff --git a/src/game/Object.h b/src/game/Object.h index 65e7ea0b84a..f17ec4d0920 100644 --- a/src/game/Object.h +++ b/src/game/Object.h @@ -377,7 +377,6 @@ class TRINITY_DLL_SPEC WorldObject : public Object // angle to face `obj` to `this` using distance includes size of `obj` GetNearPoint(obj,x,y,z,obj->GetObjectSize(),distance2d,GetAngle( obj )); } - void GetRandomContactPoint( const WorldObject* obj, float &x, float &y, float &z, float distance2dMin, float distance2dMax ) const; float GetObjectSize() const { diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index a39b6cfcdf8..074eff34950 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -1443,7 +1443,6 @@ void Spell::SetTargetMap(uint32 i,uint32 cur,std::list<Unit*> &TagUnitMap) break; // area targets - case TARGET_AREAEFFECT_CUSTOM: case TARGET_ALL_ENEMY_IN_AREA_INSTANT: if(m_spellInfo->Effect[i] == SPELL_EFFECT_PERSISTENT_AREA_AURA) break; @@ -1456,15 +1455,16 @@ void Spell::SetTargetMap(uint32 i,uint32 cur,std::list<Unit*> &TagUnitMap) case TARGET_ALL_FRIENDLY_UNITS_AROUND_CASTER: SearchAreaTarget(TagUnitMap, radius, PUSH_DEST_CENTER, SPELL_TARGETS_FRIENDLY); break; - //case TARGET_AREAEFFECT_CUSTOM: - // m_targets.m_targetMask |= TARGET_FLAG_DEST_LOCATION; + case TARGET_AREAEFFECT_CUSTOM: + m_targets.m_targetMask |= TARGET_FLAG_DEST_LOCATION; case TARGET_UNIT_AREA_ENTRY: { SpellScriptTarget::const_iterator lower = spellmgr.GetBeginSpellScriptTarget(m_spellInfo->Id); SpellScriptTarget::const_iterator upper = spellmgr.GetEndSpellScriptTarget(m_spellInfo->Id); if(lower==upper) { - sLog.outErrorDb("Spell (ID: %u) has effect EffectImplicitTargetA/EffectImplicitTargetB = TARGET_SCRIPT, but does not have record in `spell_script_target`",m_spellInfo->Id); + SearchAreaTarget(TagUnitMap, radius, PUSH_DEST_CENTER, SPELL_TARGETS_AOE_DAMAGE); + //sLog.outErrorDb("Spell (ID: %u) has effect EffectImplicitTargetA/EffectImplicitTargetB = TARGET_SCRIPT, but does not have record in `spell_script_target`",m_spellInfo->Id); break; } // let it be done in one check? diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp index db0a4d7a4b1..6a335d73a06 100644 --- a/src/game/SpellEffects.cpp +++ b/src/game/SpellEffects.cpp @@ -1982,24 +1982,10 @@ void Spell::EffectTeleportUnits(uint32 i) ((Player*)unitTarget)->TeleportTo(((Player*)unitTarget)->m_homebindMapId,((Player*)unitTarget)->m_homebindX,((Player*)unitTarget)->m_homebindY,((Player*)unitTarget)->m_homebindZ,unitTarget->GetOrientation(),unitTarget==m_caster ? TELE_TO_SPELL : 0); return; } - case TARGET_TABLE_X_Y_Z_COORDINATES: - { - // TODO: Only players can teleport? - if (unitTarget->GetTypeId() != TYPEID_PLAYER) - return; - SpellTargetPosition const* st = spellmgr.GetSpellTargetPosition(m_spellInfo->Id); - if(!st) - { - sLog.outError( "Spell::EffectTeleportUnits - unknown Teleport coordinates for spell ID %u\n", m_spellInfo->Id ); - return; - } - ((Player*)unitTarget)->TeleportTo(st->target_mapId,st->target_X,st->target_Y,st->target_Z,st->target_Orientation,unitTarget==m_caster ? TELE_TO_SPELL : 0); - break; - } default: { // If not exist data for dest location - return - if(!(m_targets.m_targetMask & TARGET_FLAG_DEST_LOCATION)) + if(!m_targets.HasDest()) { sLog.outError( "Spell::EffectTeleportUnits - unknown EffectImplicitTargetB[%u] = %u for spell ID %u\n", i, m_spellInfo->EffectImplicitTargetB[i], m_spellInfo->Id ); return; diff --git a/src/game/TargetedMovementGenerator.cpp b/src/game/TargetedMovementGenerator.cpp index 125335455d4..283fcfa8343 100644 --- a/src/game/TargetedMovementGenerator.cpp +++ b/src/game/TargetedMovementGenerator.cpp @@ -60,7 +60,7 @@ TargetedMovementGenerator<T>::_setTargetLocation(T &owner) if(!i_offset) { // to nearest random contact position - i_target->GetRandomContactPoint( &owner, x, y, z,0.5f,4.5f ); + i_target->GetRandomContactPoint( &owner, x, y, z, 0.5f, ATTACK_DISTANCE - 0.5f ); } else { @@ -164,7 +164,7 @@ TargetedMovementGenerator<T>::Update(T &owner, const uint32 & time_diff) if (owner.GetObjectSize()) i_destinationHolder.ResetUpdate(50); - float dist = i_target->GetObjectSize() + owner.GetObjectSize() + sWorld.getRate(RATE_TARGET_POS_RECALCULATION_RANGE); + float dist = owner.GetFloatValue(UNIT_FIELD_COMBATREACH) + i_target.getTarget()->GetFloatValue(UNIT_FIELD_COMBATREACH) + sWorld.getRate(RATE_TARGET_POS_RECALCULATION_RANGE); //More distance let have better performance, less distance let have more sensitive reaction at target move. @@ -185,7 +185,7 @@ TargetedMovementGenerator<T>::Update(T &owner, const uint32 & time_diff) owner.SetInFront(i_target.getTarget()); owner.StopMoving(); - if(owner.canReachWithAttack(i_target.getTarget()) && !owner.hasUnitState(UNIT_STAT_FOLLOW)) + if(owner.IsWithinCombatDist(i_target.getTarget(), ATTACK_DISTANCE) && !owner.hasUnitState(UNIT_STAT_FOLLOW)) owner.Attack(i_target.getTarget(),true); } } diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index 5660f8a561b..a095083d4ae 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -420,12 +420,20 @@ bool Unit::IsWithinCombatDist(Unit *obj, float dist2compare) const float dz = GetPositionZ() - obj->GetPositionZ(); float distsq = dx*dx + dy*dy + dz*dz; //not sure here, or combatreach + combatreach? - float sizefactor = GetObjectSize() + obj->GetFloatValue(UNIT_FIELD_COMBATREACH); + float sizefactor = GetFloatValue(UNIT_FIELD_COMBATREACH) + obj->GetFloatValue(UNIT_FIELD_COMBATREACH); float maxdist = dist2compare + sizefactor; return distsq < maxdist * maxdist; } +void Unit::GetRandomContactPoint( const Unit* obj, float &x, float &y, float &z, float distance2dMin, float distance2dMax ) const +{ + uint32 attacker_number = getAttackers().size(); + if(attacker_number > 0) --attacker_number; + GetNearPoint(obj,x,y,z,obj->GetFloatValue(UNIT_FIELD_COMBATREACH),distance2dMin+(distance2dMax-distance2dMin)*rand_norm() + , GetAngle(obj) + (attacker_number ? (M_PI/2 - M_PI * rand_norm()) * (float)attacker_number / GetFloatValue(UNIT_FIELD_COMBATREACH) / 3 : 0)); +} + void Unit::RemoveSpellsCausingAura(AuraType auraType) { if (auraType >= TOTAL_AURAS) return; diff --git a/src/game/Unit.h b/src/game/Unit.h index dd60c347fbb..81a2b5f8eb8 100644 --- a/src/game/Unit.h +++ b/src/game/Unit.h @@ -721,6 +721,7 @@ class TRINITY_DLL_SPEC Unit : public WorldObject void SetCanDualWield(bool value) { m_canDualWield = value; } bool canReachWithAttack(Unit *pVictim) const; bool IsWithinCombatDist(Unit *obj, float dist2compare) const; + void GetRandomContactPoint( const Unit* target, float &x, float &y, float &z, float distance2dMin, float distance2dMax ) const; uint32 m_extraAttacks; bool m_canDualWield; |