diff options
| author | megamage <none@none> | 2008-10-31 21:42:00 -0500 |
|---|---|---|
| committer | megamage <none@none> | 2008-10-31 21:42:00 -0500 |
| commit | e2eb694c57885e49f37c328b899d802e1ff4ea90 (patch) | |
| tree | 7259333552fadf2bd67414c70e85b3cf3bd797c0 /src | |
| parent | 1c3d4c40c3fef1eec9d1c8438254e97cdcef063a (diff) | |
[svn] Improve TargetedMovement (TODO: let mob find "near angle" rather than "random angle").
Delete a repeated check in instance canenter().
Fix some spell targets.
Add some sunwell spell sql.
Fix Magtheridons earthquake. (TODO: need to find out why soul transfer has no effect when casted by mobs)
Let Brutallus dual wield. Enable burn (still no script effect).
Quick fix for shadowmoon valley illidan quest crash (wait for author's fix).
--HG--
branch : trunk
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; |
