diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp index cdf4fc11a..eea967559 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp @@ -143,35 +143,37 @@ struct npc_doomfire_spirit : public ScriptedAI { npc_doomfire_spirit(Creature* creature) : ScriptedAI(creature){ } + float const turnConstant = 0.785402f; + float fAngle = urand(0, M_PI * 2); + void Reset() override { scheduler.CancelAll(); ScheduleTimedEvent(0s, [&] { - me->GetMotionMaster()->MovePoint(NEAR_POINT, DoomfireMovement(me->GetPosition())); - }, 1500ms); + float nextOrientation = Position::NormalizeOrientation(me->GetOrientation() + irand(-1, 1) * turnConstant); + Position pos = GetFirstRandomAngleCollisionPosition(8.f, nextOrientation); // both orientation and distance verified with sniffs + me->NearTeleportTo(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), nextOrientation); + }, 1600ms); + + fAngle = urand(0, M_PI * 2); } - Position DoomfireMovement(Position mePos) + Position GetFirstRandomAngleCollisionPosition(float dist, float angle) { - float angle = mePos.GetOrientation(); - float distance = 100.0f; - float newAngle = angle + ((rand() % 181) - 90) * M_PI / 180; - float x = mePos.GetPositionX() + distance * cos(newAngle); - float y = mePos.GetPositionY() + distance * sin(newAngle); - - Position targetPos = Position(x, y, me->GetPositionZ()); - return targetPos; + Position pos; + for (uint32 i = 0; i < 10; ++i) + { + pos = me->WorldObject::GetFirstCollisionPosition(dist, angle); + if (me->GetDistance(pos) > dist * 0.8f) // if at least 80% distance, good enough + break; + angle += (M_PI / 5); // else try slightly different angle + } + return pos; } void UpdateAI(uint32 diff) override { scheduler.Update(diff); - - if (!UpdateVictim()) - return; - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; } }; @@ -313,7 +315,7 @@ struct boss_archimonde : public BossAI DoCastVictim(SPELL_RED_SKY_EFFECT); DoCastVictim(SPELL_HAND_OF_DEATH); }, 3s); - scheduler.Schedule(25s, 35s, GROUP_FEAR, [this](TaskContext context) + scheduler.Schedule(40s, GROUP_FEAR, [this](TaskContext context) { DoCastAOE(SPELL_FEAR); context.Repeat(42s); @@ -381,11 +383,6 @@ struct boss_archimonde : public BossAI summoned->CastSpell(summoned, SPELL_DOOMFIRE_SPAWN); summoned->CastSpell(summoned, SPELL_DOOMFIRE, true, 0, 0, me->GetGUID()); } - else if (summoned->GetEntry() == CREATURE_DOOMFIRE_SPIRIT) - { - Position randomPosition = summoned->GetRandomNearPosition(40.0f); - summoned->GetMotionMaster()->MovePoint(0, randomPosition); - } else { summoned->SetFaction(me->GetFaction()); //remove?