fix(Core/Movement): fix multiple creature movement issues (#5097)

This commit is contained in:
Footman
2021-04-09 21:56:19 +03:00
committed by GitHub
parent 91a39f27d9
commit c32cd06a78
22 changed files with 7181 additions and 93 deletions
File diff suppressed because it is too large Load Diff
@@ -1703,8 +1703,8 @@ void Creature::setDeathState(DeathState s, bool despawn)
m_formation->FormationReset(true); m_formation->FormationReset(true);
bool needsFalling = !despawn && (IsFlying() || IsHovering()) && !IsUnderWater(); bool needsFalling = !despawn && (IsFlying() || IsHovering()) && !IsUnderWater();
SetHover(false, false); SetHover(false);
SetDisableGravity(false, false); SetDisableGravity(false);
if (needsFalling) if (needsFalling)
GetMotionMaster()->MoveFall(0, true); GetMotionMaster()->MoveFall(0, true);
@@ -1726,7 +1726,6 @@ void Creature::setDeathState(DeathState s, bool despawn)
// pussywizard: // pussywizard:
if (HasUnitMovementFlag(MOVEMENTFLAG_FALLING)) if (HasUnitMovementFlag(MOVEMENTFLAG_FALLING))
RemoveUnitMovementFlag(MOVEMENTFLAG_FALLING); RemoveUnitMovementFlag(MOVEMENTFLAG_FALLING);
UpdateEnvironmentIfNeeded(3);
SetUInt32Value(UNIT_NPC_FLAGS, cinfo->npcflag); SetUInt32Value(UNIT_NPC_FLAGS, cinfo->npcflag);
ClearUnitState(uint32(UNIT_STATE_ALL_STATE & ~(UNIT_STATE_IGNORE_PATHFINDING | UNIT_STATE_NO_ENVIRONMENT_UPD))); ClearUnitState(uint32(UNIT_STATE_ALL_STATE & ~(UNIT_STATE_IGNORE_PATHFINDING | UNIT_STATE_NO_ENVIRONMENT_UPD)));
@@ -1734,11 +1733,12 @@ void Creature::setDeathState(DeathState s, bool despawn)
Unit::setDeathState(ALIVE, despawn); Unit::setDeathState(ALIVE, despawn);
// Xinef: Load auras AFTER setting alive state
LoadCreaturesAddon(true);
Motion_Initialize(); Motion_Initialize();
LoadCreaturesAddon(true);
if (GetCreatureData() && GetPhaseMask() != GetCreatureData()->phaseMask) if (GetCreatureData() && GetPhaseMask() != GetCreatureData()->phaseMask)
SetPhaseMask(GetCreatureData()->phaseMask, false); SetPhaseMask(GetCreatureData()->phaseMask, false);
UpdateEnvironmentIfNeeded(3);
} }
} }
@@ -3013,7 +3013,7 @@ void Creature::SetObjectScale(float scale)
if (IsPet()) if (IsPet())
combatReach = DEFAULT_COMBAT_REACH; combatReach = DEFAULT_COMBAT_REACH;
SetFloatValue(UNIT_FIELD_COMBATREACH, combatReach * GetFloatValue(OBJECT_FIELD_SCALE_X) * scale); SetFloatValue(UNIT_FIELD_COMBATREACH, combatReach * scale);
} }
void Creature::SetDisplayId(uint32 modelId) void Creature::SetDisplayId(uint32 modelId)
+10 -12
View File
@@ -3671,7 +3671,7 @@ void Unit::UpdateEnvironmentIfNeeded(const uint8 option)
float radiusWidth = GetCollisionRadius(); float radiusWidth = GetCollisionRadius();
float radiusHeight = GetCollisionHeight() / 2; float radiusHeight = GetCollisionHeight() / 2;
float radiusAvg = (radiusWidth + radiusHeight) / 2; float radiusAvg = (radiusWidth + radiusHeight) / 2;
if (option <= 1 && GetExactDistSq(&m_last_environment_position) < radiusAvg*radiusAvg) if (option <= 1 && GetExactDistSq(&m_last_environment_position) < radiusAvg * radiusAvg)
return; return;
m_last_environment_position.Relocate(GetPositionX(), GetPositionY(), GetPositionZ()); m_last_environment_position.Relocate(GetPositionX(), GetPositionY(), GetPositionZ());
@@ -3687,7 +3687,8 @@ void Unit::UpdateEnvironmentIfNeeded(const uint8 option)
m_is_updating_environment = false; m_is_updating_environment = false;
return; return;
} }
bool canChangeFlying = option == 3 || GetMotionMaster()->GetCurrentMovementGeneratorType() != WAYPOINT_MOTION_TYPE;
bool canChangeFlying = option == 3 || ((c->GetScriptId() == 0 || GetInstanceId() == 0) && GetMotionMaster()->GetMotionSlotType(MOTION_SLOT_CONTROLLED) == NULL_MOTION_TYPE);
bool canFallGround = option == 0 && canChangeFlying && GetInstanceId() == 0 && !IsInCombat() && !GetVehicle() && !GetTransport() && !HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT) && !c->IsTrigger() && !c->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE) && GetMotionMaster()->GetCurrentMovementGeneratorType() <= RANDOM_MOTION_TYPE && !HasUnitState(UNIT_STATE_EVADE) && !IsControlledByPlayer(); bool canFallGround = option == 0 && canChangeFlying && GetInstanceId() == 0 && !IsInCombat() && !GetVehicle() && !GetTransport() && !HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT) && !c->IsTrigger() && !c->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE) && GetMotionMaster()->GetCurrentMovementGeneratorType() <= RANDOM_MOTION_TYPE && !HasUnitState(UNIT_STATE_EVADE) && !IsControlledByPlayer();
float x = GetPositionX(), y = GetPositionY(), z = GetPositionZ(); float x = GetPositionX(), y = GetPositionY(), z = GetPositionZ();
bool isInAir = true; bool isInAir = true;
@@ -3747,16 +3748,17 @@ void Unit::UpdateEnvironmentIfNeeded(const uint8 option)
} }
} }
bool canUpdateEnvironment = !HasUnitState(UNIT_STATE_NO_ENVIRONMENT_UPD);
bool flyingBarelyInWater = false; bool flyingBarelyInWater = false;
// Refresh being in water // Refresh being in water
if (m_last_isinwater_status) if (m_last_isinwater_status)
{ {
if (!c->CanFly() || enoughWater) if (!c->CanFly() || enoughWater)
{ {
if (!HasUnitState(UNIT_STATE_NO_ENVIRONMENT_UPD) && c->CanSwim() && (!HasUnitMovementFlag(MOVEMENTFLAG_SWIMMING) || !HasUnitMovementFlag(MOVEMENTFLAG_DISABLE_GRAVITY))) if (canUpdateEnvironment && c->CanSwim() && (!HasUnitMovementFlag(MOVEMENTFLAG_SWIMMING) || !HasUnitMovementFlag(MOVEMENTFLAG_DISABLE_GRAVITY)))
{ {
SetSwim(true); SetSwim(true);
// SetDisableGravity(true);
changed = true; changed = true;
} }
isInAir = false; isInAir = false;
@@ -3770,11 +3772,9 @@ void Unit::UpdateEnvironmentIfNeeded(const uint8 option)
if (!m_last_isinwater_status) if (!m_last_isinwater_status)
{ {
if (!HasUnitState(UNIT_STATE_NO_ENVIRONMENT_UPD) && c->CanWalk() && HasUnitMovementFlag(MOVEMENTFLAG_SWIMMING)) if (canUpdateEnvironment && c->CanWalk() && HasUnitMovementFlag(MOVEMENTFLAG_SWIMMING))
{ {
SetSwim(false); SetSwim(false);
if (!c->CanFly()) // if can fly, this will be removed below if needed
SetDisableGravity(false);
changed = true; changed = true;
} }
} }
@@ -3801,7 +3801,7 @@ void Unit::UpdateEnvironmentIfNeeded(const uint8 option)
} }
} }
if (!HasUnitState(UNIT_STATE_NO_ENVIRONMENT_UPD) && canChangeFlying) if (canUpdateEnvironment && canChangeFlying)
{ {
// xinef: summoned vehicles are treated as always in air, fixes flying on such units // xinef: summoned vehicles are treated as always in air, fixes flying on such units
if (IsVehicle() && !c->GetDBTableGUIDLow()) if (IsVehicle() && !c->GetDBTableGUIDLow())
@@ -3822,7 +3822,6 @@ void Unit::UpdateEnvironmentIfNeeded(const uint8 option)
} }
else if (c->CanFly() && isInAir && !c->IsFalling()) else if (c->CanFly() && isInAir && !c->IsFalling())
{ {
if (!HasUnitMovementFlag(MOVEMENTFLAG_CAN_FLY) || !HasUnitMovementFlag(MOVEMENTFLAG_DISABLE_GRAVITY)) if (!HasUnitMovementFlag(MOVEMENTFLAG_CAN_FLY) || !HasUnitMovementFlag(MOVEMENTFLAG_DISABLE_GRAVITY))
{ {
SetCanFly(true); SetCanFly(true);
@@ -3835,7 +3834,6 @@ void Unit::UpdateEnvironmentIfNeeded(const uint8 option)
SetHover(false); SetHover(false);
changed = true; changed = true;
} }
} }
else else
{ {
@@ -3869,7 +3867,7 @@ void Unit::UpdateEnvironmentIfNeeded(const uint8 option)
if (changed) if (changed)
propagateSpeedChange(); propagateSpeedChange();
if (!HasUnitState(UNIT_STATE_NO_ENVIRONMENT_UPD) && canFallGround && !c->CanFly() && !c->IsFalling() && !m_last_isinwater_status && (c->GetUnitMovementFlags() & (MOVEMENTFLAG_CAN_FLY | MOVEMENTFLAG_DISABLE_GRAVITY | MOVEMENTFLAG_HOVER | MOVEMENTFLAG_SWIMMING)) == 0 && z - ground_z > 5.0f && z - ground_z < 80.0f) if (canUpdateEnvironment && canFallGround && !c->CanFly() && !c->IsFalling() && !m_last_isinwater_status && (c->GetUnitMovementFlags() & (MOVEMENTFLAG_CAN_FLY | MOVEMENTFLAG_DISABLE_GRAVITY | MOVEMENTFLAG_HOVER | MOVEMENTFLAG_SWIMMING)) == 0 && z - ground_z > 5.0f && z - ground_z < 80.0f)
GetMotionMaster()->MoveFall(); GetMotionMaster()->MoveFall();
m_is_updating_environment = false; m_is_updating_environment = false;
@@ -20197,7 +20195,7 @@ float Unit::GetCollisionRadius() const
float Unit::GetCollisionHeight() const float Unit::GetCollisionHeight() const
{ {
float scaleMod = GetObjectScale(); // 99% sure about this float scaleMod = GetObjectScale(); // 99% sure about this
float defaultHeight = DEFAULT_WORLD_OBJECT_SIZE * scaleMod; float defaultHeight = DEFAULT_COLLISION_HEIGHT * scaleMod;
CreatureDisplayInfoEntry const* displayInfo = sCreatureDisplayInfoStore.AssertEntry(GetNativeDisplayId()); CreatureDisplayInfoEntry const* displayInfo = sCreatureDisplayInfoStore.AssertEntry(GetNativeDisplayId());
CreatureModelDataEntry const* modelData = sCreatureModelDataStore.AssertEntry(displayInfo->ModelId); CreatureModelDataEntry const* modelData = sCreatureModelDataStore.AssertEntry(displayInfo->ModelId);
@@ -48,7 +48,6 @@ bool ChaseMovementGenerator<T>::DoUpdate(T* owner, uint32 time_diff)
// the owner might be unable to move (rooted or casting), or we have lost the target, pause movement // the owner might be unable to move (rooted or casting), or we have lost the target, pause movement
if (owner->HasUnitState(UNIT_STATE_NOT_MOVE) || HasLostTarget(owner) || (cOwner && cOwner->IsMovementPreventedByCasting())) if (owner->HasUnitState(UNIT_STATE_NOT_MOVE) || HasLostTarget(owner) || (cOwner && cOwner->IsMovementPreventedByCasting()))
{ {
i_path = nullptr;
owner->StopMoving(); owner->StopMoving();
_lastTargetPosition.reset(); _lastTargetPosition.reset();
if (Creature* cOwner = owner->ToCreature()) if (Creature* cOwner = owner->ToCreature())
@@ -234,7 +233,7 @@ bool FollowMovementGenerator<T>::PositionOkay(T* owner, Unit* target, float rang
if (owner->GetExactDistSq(target) > G3D::square(owner->GetCombatReach() + target->GetCombatReach() + range)) if (owner->GetExactDistSq(target) > G3D::square(owner->GetCombatReach() + target->GetCombatReach() + range))
return false; return false;
return !owner->IsPet() || !angle || angle->IsAngleOkay(target->GetRelativeAngle(owner)); // need to check - dont think we need !pet exception here because there are scripts with MoveFollow that require angle return !angle || angle->IsAngleOkay(target->GetRelativeAngle(owner));
} }
template<class T> template<class T>
+2 -4
View File
@@ -2449,12 +2449,10 @@ void Spell::EffectSummonType(SpellEffIndex effIndex)
TempSummonType summonType = (duration <= 0) ? TEMPSUMMON_DEAD_DESPAWN : TEMPSUMMON_TIMED_DESPAWN; TempSummonType summonType = (duration <= 0) ? TEMPSUMMON_DEAD_DESPAWN : TEMPSUMMON_TIMED_DESPAWN;
uint32 currMinionsCount = m_caster->m_Controlled.size();
uint32 totalNumGuardians = numSummons + currMinionsCount;
for (uint32 count = 0; count < numSummons; ++count) for (uint32 count = 0; count < numSummons; ++count)
{ {
Position pos; Position pos;
if (totalNumGuardians == 1) if (count == 0)
pos = *destTarget; pos = *destTarget;
else else
// randomize position for multiple summons // randomize position for multiple summons
@@ -5069,7 +5067,7 @@ void Spell::EffectCharge(SpellEffIndex /*effIndex*/)
m_caster->GetFirstCollisionPosition(pos, dist, angle); m_caster->GetFirstCollisionPosition(pos, dist, angle);
} }
m_caster->GetMotionMaster()->MoveCharge(pos.m_positionX, pos.m_positionY, pos.m_positionZ); m_caster->GetMotionMaster()->MoveCharge(pos.m_positionX, pos.m_positionY, pos.m_positionZ + Z_OFFSET_FIND_HEIGHT);
} }
} }
@@ -136,9 +136,9 @@ public:
break; break;
case INTRO_4: case INTRO_4:
me->SetWalk(true); me->SetWalk(true);
me->SetCanFly(false);
me->SetDisableGravity(false); me->SetDisableGravity(false);
me->CastSpell(me, SPELL_KIRTONOS_TRANSFORM, true); me->CastSpell(me, SPELL_KIRTONOS_TRANSFORM, true);
me->SetCanFly(false);
break; break;
case INTRO_5: case INTRO_5:
me->HandleEmoteCommand(EMOTE_ONESHOT_ROAR); me->HandleEmoteCommand(EMOTE_ONESHOT_ROAR);
@@ -370,8 +370,8 @@ public:
{ {
if (summon->GetEntry() == NPC_ARMAGEDDON_TARGET) if (summon->GetEntry() == NPC_ARMAGEDDON_TARGET)
{ {
summon->SetDisableGravity(true);
summon->SetCanFly(true); summon->SetCanFly(true);
summon->SetDisableGravity(true);
summon->CastSpell(summon, SPELL_ARMAGEDDON_VISUAL, true); summon->CastSpell(summon, SPELL_ARMAGEDDON_VISUAL, true);
summon->SetPosition(summon->GetPositionX(), summon->GetPositionY(), summon->GetPositionZ() + 20.0f, 0.0f); summon->SetPosition(summon->GetPositionX(), summon->GetPositionY(), summon->GetPositionZ() + 20.0f, 0.0f);
summon->m_Events.AddEvent(new CastArmageddon(summon), summon->m_Events.CalculateTime(6000)); summon->m_Events.AddEvent(new CastArmageddon(summon), summon->m_Events.CalculateTime(6000));
@@ -786,8 +786,8 @@ public:
{ {
if (param == ACTION_START_POST_EVENT) if (param == ACTION_START_POST_EVENT)
{ {
me->SetDisableGravity(false);
me->SetCanFly(false); me->SetCanFly(false);
me->SetDisableGravity(false);
me->CastSpell(me, SPELL_TELEPORT_AND_TRANSFORM, true); me->CastSpell(me, SPELL_TELEPORT_AND_TRANSFORM, true);
events.ScheduleEvent(EVENT_SCENE_01, 35000); events.ScheduleEvent(EVENT_SCENE_01, 35000);
} }
@@ -153,7 +153,6 @@ public:
me->SetReactState(REACT_AGGRESSIVE); me->SetReactState(REACT_AGGRESSIVE);
me->SetCanFly(false); me->SetCanFly(false);
me->SetDisableGravity(false); me->SetDisableGravity(false);
me->SetHover(false);
me->SetSpeed(MOVE_RUN, me->GetCreatureTemplate()->speed_run, false); me->SetSpeed(MOVE_RUN, me->GetCreatureTemplate()->speed_run, false);
whelpSpam = false; whelpSpam = false;
@@ -277,7 +276,6 @@ public:
case 13: case 13:
me->SetCanFly(false); me->SetCanFly(false);
me->SetDisableGravity(false); me->SetDisableGravity(false);
me->SetHover(false);
me->SetSpeed(MOVE_RUN, me->GetCreatureTemplate()->speed_run, false); me->SetSpeed(MOVE_RUN, me->GetCreatureTemplate()->speed_run, false);
events.ScheduleEvent(EVENT_PHASE_3_ATTACK, 0); events.ScheduleEvent(EVENT_PHASE_3_ATTACK, 0);
break; break;
@@ -368,7 +366,6 @@ public:
me->DisableSpline(); me->DisableSpline();
me->SetCanFly(true); me->SetCanFly(true);
me->SetDisableGravity(true); me->SetDisableGravity(true);
me->SetHover(true);
me->SetOrientation(OnyxiaMoveData[0].o); me->SetOrientation(OnyxiaMoveData[0].o);
me->SendMovementFlagUpdate(); me->SendMovementFlagUpdate();
me->GetMotionMaster()->MoveTakeoff(11, OnyxiaMoveData[1].x + 1.0f, OnyxiaMoveData[1].y, OnyxiaMoveData[1].z, 12.0f); me->GetMotionMaster()->MoveTakeoff(11, OnyxiaMoveData[1].x + 1.0f, OnyxiaMoveData[1].y, OnyxiaMoveData[1].z, 12.0f);
@@ -115,9 +115,8 @@ struct boss_twin_valkyrAI : public ScriptedAI
if( IsHeroic() ) if( IsHeroic() )
events.RescheduleEvent(EVENT_SPELL_TOUCH, urand(10000, 25000), 1); events.RescheduleEvent(EVENT_SPELL_TOUCH, urand(10000, 25000), 1);
me->SetDisableGravity(true);
me->SetHover(true);
me->SetCanFly(true); me->SetCanFly(true);
me->SetDisableGravity(true);
} }
InstanceScript* pInstance; InstanceScript* pInstance;
@@ -478,8 +478,8 @@ public:
{ {
if (!c->IsAlive()) if (!c->IsAlive())
c->Respawn(); c->Respawn();
c->SetDisableGravity(true);
c->SetCanFly(true); c->SetCanFly(true);
c->SetDisableGravity(true);
c->SetVisible(true); c->SetVisible(true);
Item* i; Item* i;
@@ -501,8 +501,8 @@ public:
if (c->IsVisible()) if (c->IsVisible())
{ {
c->SetInCombatWithZone(); c->SetInCombatWithZone();
c->SetDisableGravity(false);
c->SetCanFly(false); c->SetCanFly(false);
c->SetDisableGravity(false);
c->GetMotionMaster()->MoveJump(fg->GetPositionX(), fg->GetPositionY(), fg->GetPositionZ(), 20.0f, 10.0f); c->GetMotionMaster()->MoveJump(fg->GetPositionX(), fg->GetPositionY(), fg->GetPositionZ(), 20.0f, 10.0f);
} }
break; break;
@@ -182,7 +182,6 @@ public:
c->CastSpell(c, 69413, true); c->CastSpell(c, 69413, true);
c->SetCanFly(true); c->SetCanFly(true);
c->SetDisableGravity(true); c->SetDisableGravity(true);
c->SetHover(true);
c->SendMovementFlagUpdate(); c->SendMovementFlagUpdate();
float dist = rand_norm() * 2.0f; float dist = rand_norm() * 2.0f;
float angle = rand_norm() * 2 * M_PI; float angle = rand_norm() * 2 * M_PI;
@@ -227,7 +226,6 @@ public:
continue; continue;
c->SetCanFly(false); c->SetCanFly(false);
c->SetDisableGravity(false); c->SetDisableGravity(false);
c->SetHover(false);
c->SendMovementFlagUpdate(); c->SendMovementFlagUpdate();
c->CastSpell(c, 69350, true); c->CastSpell(c, 69350, true);
} }
@@ -1218,7 +1216,6 @@ public:
{ {
c->SetCanFly(true); c->SetCanFly(true);
c->SetDisableGravity(true); c->SetDisableGravity(true);
c->SetHover(true);
c->GetMotionMaster()->MovePoint(0, TSSindragosaPos2); c->GetMotionMaster()->MovePoint(0, TSSindragosaPos2);
} }
@@ -208,7 +208,6 @@ public:
minchar->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0); minchar->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0);
minchar->SetCanFly(false); minchar->SetCanFly(false);
minchar->SetDisableGravity(false); minchar->SetDisableGravity(false);
minchar->SetHover(false);
minchar->RemoveAllAuras(); minchar->RemoveAllAuras();
minchar->GetMotionMaster()->MoveCharge(4629.3711f, 2782.6089f, 401.5301f, SPEED_CHARGE / 3.0f); minchar->GetMotionMaster()->MoveCharge(4629.3711f, 2782.6089f, 401.5301f, SPEED_CHARGE / 3.0f);
} }
@@ -226,7 +225,6 @@ public:
me->StopMoving(); me->StopMoving();
me->SetCanFly(true); me->SetCanFly(true);
me->SetDisableGravity(true); me->SetDisableGravity(true);
me->SetHover(true);
me->SendMovementFlagUpdate(); me->SendMovementFlagUpdate();
me->GetMotionMaster()->MovePoint(POINT_MINCHAR, mincharPos); me->GetMotionMaster()->MovePoint(POINT_MINCHAR, mincharPos);
} }
@@ -246,7 +244,6 @@ public:
{ {
me->SetCanFly(false); me->SetCanFly(false);
me->SetDisableGravity(false); me->SetDisableGravity(false);
me->SetHover(false);
_JustReachedHome(); _JustReachedHome();
if (bEnteredCombat) if (bEnteredCombat)
@@ -284,7 +281,6 @@ public:
case POINT_GROUND: case POINT_GROUND:
me->SetCanFly(false); me->SetCanFly(false);
me->SetDisableGravity(false); me->SetDisableGravity(false);
me->SetHover(false);
me->SetReactState(REACT_AGGRESSIVE); me->SetReactState(REACT_AGGRESSIVE);
if (Unit* target = me->SelectVictim()) if (Unit* target = me->SelectVictim())
AttackStart(target); AttackStart(target);
@@ -492,7 +488,6 @@ public:
me->DisableSpline(); me->DisableSpline();
me->SetCanFly(true); me->SetCanFly(true);
me->SetDisableGravity(true); me->SetDisableGravity(true);
me->SetHover(true);
me->SendMovementFlagUpdate(); me->SendMovementFlagUpdate();
me->GetMotionMaster()->MoveTakeoff(POINT_AIR, airPos, 0.642857f * 7.0f); me->GetMotionMaster()->MoveTakeoff(POINT_AIR, airPos, 0.642857f * 7.0f);
break; break;
@@ -281,8 +281,8 @@ public:
if (!_summoned) if (!_summoned)
{ {
me->SetDisableGravity(true);
me->SetCanFly(true); me->SetCanFly(true);
me->SetDisableGravity(true);
} }
} }
@@ -353,8 +353,8 @@ public:
instance->SetBossState(DATA_SINDRAGOSA, FAIL); instance->SetBossState(DATA_SINDRAGOSA, FAIL);
if (_summoned) if (_summoned)
{ {
me->SetDisableGravity(false);
me->SetCanFly(false); me->SetCanFly(false);
me->SetDisableGravity(false);
} }
} }
@@ -396,7 +396,6 @@ public:
me->setActive(true); me->setActive(true);
me->SetCanFly(true); me->SetCanFly(true);
me->SetDisableGravity(true); me->SetDisableGravity(true);
me->SetHover(true);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
me->SetSpeed(MOVE_RUN, 4.28571f); me->SetSpeed(MOVE_RUN, 4.28571f);
float moveTime = me->GetExactDist(&SindragosaFlyInPos) / (me->GetSpeed(MOVE_RUN) * 0.001f); float moveTime = me->GetExactDist(&SindragosaFlyInPos) / (me->GetSpeed(MOVE_RUN) * 0.001f);
@@ -422,9 +421,8 @@ public:
{ {
case POINT_FROSTWYRM_LAND: case POINT_FROSTWYRM_LAND:
me->setActive(false); me->setActive(false);
me->SetDisableGravity(false);
me->SetHover(false);
me->SetCanFly(false); me->SetCanFly(false);
me->SetDisableGravity(false);
me->SetSpeed(MOVE_RUN, me->GetCreatureTemplate()->speed_run); me->SetSpeed(MOVE_RUN, me->GetCreatureTemplate()->speed_run);
me->SetHomePosition(SindragosaLandPos); me->SetHomePosition(SindragosaLandPos);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
@@ -451,8 +449,8 @@ public:
case POINT_LAND_GROUND: case POINT_LAND_GROUND:
{ {
_isInAirPhase = false; _isInAirPhase = false;
me->SetDisableGravity(false);
me->SetCanFly(false); me->SetCanFly(false);
me->SetDisableGravity(false);
me->SetSpeed(MOVE_RUN, me->GetCreatureTemplate()->speed_run); me->SetSpeed(MOVE_RUN, me->GetCreatureTemplate()->speed_run);
me->SetReactState(REACT_AGGRESSIVE); me->SetReactState(REACT_AGGRESSIVE);
if (Unit* target = me->SelectVictim()) if (Unit* target = me->SelectVictim())
@@ -603,7 +601,6 @@ public:
me->StopMoving(); me->StopMoving();
me->SetCanFly(true); me->SetCanFly(true);
me->SetDisableGravity(true); me->SetDisableGravity(true);
me->SetHover(true);
me->SendMovementFlagUpdate(); me->SendMovementFlagUpdate();
me->GetMotionMaster()->MoveTakeoff(POINT_TAKEOFF, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() + 20.0f, 10.0f); me->GetMotionMaster()->MoveTakeoff(POINT_TAKEOFF, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() + 20.0f, 10.0f);
events.CancelEventGroup(EVENT_GROUP_LAND_PHASE); events.CancelEventGroup(EVENT_GROUP_LAND_PHASE);
@@ -1395,7 +1392,6 @@ public:
{ {
me->SetCanFly(true); me->SetCanFly(true);
me->SetDisableGravity(true); me->SetDisableGravity(true);
me->SetHover(true);
} }
} }
@@ -1406,7 +1402,6 @@ public:
{ {
me->SetCanFly(false); me->SetCanFly(false);
me->SetDisableGravity(false); me->SetDisableGravity(false);
me->SetHover(false);
} }
} }
@@ -1451,7 +1446,6 @@ public:
me->setActive(false); me->setActive(false);
me->SetCanFly(false); me->SetCanFly(false);
me->SetDisableGravity(false); me->SetDisableGravity(false);
me->SetHover(false);
me->SetHomePosition(SpinestalkerLandPos); me->SetHomePosition(SpinestalkerLandPos);
me->SetFacingTo(SpinestalkerLandPos.GetOrientation()); me->SetFacingTo(SpinestalkerLandPos.GetOrientation());
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
@@ -1532,7 +1526,6 @@ public:
{ {
me->SetCanFly(true); me->SetCanFly(true);
me->SetDisableGravity(true); me->SetDisableGravity(true);
me->SetHover(true);
} }
} }
@@ -1543,7 +1536,6 @@ public:
{ {
me->SetCanFly(false); me->SetCanFly(false);
me->SetDisableGravity(false); me->SetDisableGravity(false);
me->SetHover(false);
} }
} }
@@ -1590,7 +1582,6 @@ public:
me->setActive(false); me->setActive(false);
me->SetCanFly(false); me->SetCanFly(false);
me->SetDisableGravity(false); me->SetDisableGravity(false);
me->SetHover(false);
me->SetHomePosition(RimefangLandPos); me->SetHomePosition(RimefangLandPos);
me->SetFacingTo(RimefangLandPos.GetOrientation()); me->SetFacingTo(RimefangLandPos.GetOrientation());
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
@@ -1599,7 +1590,6 @@ public:
{ {
me->SetCanFly(false); me->SetCanFly(false);
me->SetDisableGravity(false); me->SetDisableGravity(false);
me->SetHover(false);
me->SetReactState(REACT_DEFENSIVE); me->SetReactState(REACT_DEFENSIVE);
if (Unit* victim = me->SelectVictim()) if (Unit* victim = me->SelectVictim())
AttackStart(victim); AttackStart(victim);
@@ -1644,7 +1634,6 @@ public:
me->AttackStop(); me->AttackStop();
me->SetCanFly(true); me->SetCanFly(true);
me->SetDisableGravity(true); me->SetDisableGravity(true);
me->SetHover(true);
me->SendMovementFlagUpdate(); me->SendMovementFlagUpdate();
float floorZ = me->GetMapHeight(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()); float floorZ = me->GetMapHeight(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ());
float destZ; float destZ;
@@ -798,13 +798,12 @@ public:
if (_phase == PHASE_OUTRO) if (_phase == PHASE_OUTRO)
{ {
if (!me->HasByteFlag(UNIT_FIELD_BYTES_1, UNIT_BYTES_1_OFFSET_ANIM_TIER, UNIT_BYTE1_FLAG_HOVER)) if (!me->IsLevitating())
damage = me->GetHealth() > 1 ? 1 : 0; damage = me->GetHealth() > 1 ? 1 : 0;
else if (damage >= me->GetHealth()) // dying... else if (damage >= me->GetHealth()) // dying...
{ {
damage = me->GetHealth() - 1; damage = me->GetHealth() - 1;
me->SetDisableGravity(false); me->SetDisableGravity(false);
me->RemoveByteFlag(UNIT_FIELD_BYTES_1, UNIT_BYTES_1_OFFSET_ANIM_TIER, UNIT_BYTE1_FLAG_ALWAYS_STAND | UNIT_BYTE1_FLAG_HOVER);
me->SendMonsterMove(me->GetPositionX() + 0.25f, me->GetPositionY(), 840.86f, 300, SPLINEFLAG_FALLING); me->SendMonsterMove(me->GetPositionX() + 0.25f, me->GetPositionY(), 840.86f, 300, SPLINEFLAG_FALLING);
me->m_positionZ = 840.86f; me->m_positionZ = 840.86f;
me->SetOrientation(0.0f); me->SetOrientation(0.0f);
@@ -1546,7 +1545,6 @@ public:
theLichKing->CastSpell((Unit*)nullptr, SPELL_SOUL_BARRAGE, TRIGGERED_IGNORE_CAST_IN_PROGRESS); theLichKing->CastSpell((Unit*)nullptr, SPELL_SOUL_BARRAGE, TRIGGERED_IGNORE_CAST_IN_PROGRESS);
sCreatureTextMgr->SendSound(theLichKing, SOUND_PAIN, CHAT_MSG_MONSTER_YELL, 0, TEXT_RANGE_NORMAL, TEAM_NEUTRAL, false); sCreatureTextMgr->SendSound(theLichKing, SOUND_PAIN, CHAT_MSG_MONSTER_YELL, 0, TEXT_RANGE_NORMAL, TEAM_NEUTRAL, false);
theLichKing->SetDisableGravity(true); theLichKing->SetDisableGravity(true);
theLichKing->SetByteFlag(UNIT_FIELD_BYTES_1, UNIT_BYTES_1_OFFSET_ANIM_TIER, UNIT_BYTE1_FLAG_ALWAYS_STAND | UNIT_BYTE1_FLAG_HOVER);
theLichKing->GetMotionMaster()->MovePoint(0, OutroFlying); theLichKing->GetMotionMaster()->MovePoint(0, OutroFlying);
_events.ScheduleEvent(EVENT_OUTRO_AFTER_SOUL_BARRAGE, 3000); _events.ScheduleEvent(EVENT_OUTRO_AFTER_SOUL_BARRAGE, 3000);
@@ -2656,9 +2654,8 @@ public:
break; break;
case EVENT_MOVE_TO_DROP_POS: case EVENT_MOVE_TO_DROP_POS:
me->AddUnitState(UNIT_STATE_NO_ENVIRONMENT_UPD); me->AddUnitState(UNIT_STATE_NO_ENVIRONMENT_UPD);
me->SetDisableGravity(false);
me->SetHover(false);
me->SetCanFly(false); me->SetCanFly(false);
me->SetDisableGravity(false);
me->GetMotionMaster()->MovePoint(POINT_DROP_PLAYER, _destPoint, false); me->GetMotionMaster()->MovePoint(POINT_DROP_PLAYER, _destPoint, false);
me->SetDisableGravity(true, true); me->SetDisableGravity(true, true);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
@@ -2666,9 +2663,8 @@ public:
case EVENT_MOVE_TO_SIPHON_POS: case EVENT_MOVE_TO_SIPHON_POS:
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); // just in case if passenger disappears so quickly that EVENT_MOVE_TO_DROP_POS is never executed me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); // just in case if passenger disappears so quickly that EVENT_MOVE_TO_DROP_POS is never executed
{ int32 bp0 = 80; me->CastCustomSpell(me, 1557, &bp0, nullptr, nullptr, true); } { int32 bp0 = 80; me->CastCustomSpell(me, 1557, &bp0, nullptr, nullptr, true); }
me->SetDisableGravity(true);
me->SetHover(true);
me->SetCanFly(true); me->SetCanFly(true);
me->SetDisableGravity(true);
me->SendMovementFlagUpdate(); me->SendMovementFlagUpdate();
me->GetMotionMaster()->MovePoint(POINT_START_SIPHON, _destPoint); me->GetMotionMaster()->MovePoint(POINT_START_SIPHON, _destPoint);
break; break;
@@ -989,7 +989,6 @@ public:
me->SetReactState(REACT_PASSIVE); me->SetReactState(REACT_PASSIVE);
me->SetCanFly(true); me->SetCanFly(true);
me->SetDisableGravity(true); me->SetDisableGravity(true);
me->SetHover(true);
me->SendMovementFlagUpdate(); me->SendMovementFlagUpdate();
} }
@@ -1112,7 +1111,6 @@ public:
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC);
me->SetCanFly(false); me->SetCanFly(false);
me->SetDisableGravity(false); me->SetDisableGravity(false);
me->SetHover(false);
me->SetReactState(REACT_AGGRESSIVE); me->SetReactState(REACT_AGGRESSIVE);
DoZoneInCombat(nullptr, 150.0f); DoZoneInCombat(nullptr, 150.0f);
} }
@@ -3048,9 +3046,8 @@ public:
{ {
npc_icc_spire_frostwyrmAI(Creature* creature) : ScriptedAI(creature) npc_icc_spire_frostwyrmAI(Creature* creature) : ScriptedAI(creature)
{ {
me->SetDisableGravity(true);
me->SetHover(true);
me->SetCanFly(true); me->SetCanFly(true);
me->SetDisableGravity(true);
} }
EventMap events; EventMap events;
@@ -3078,9 +3075,8 @@ public:
{ {
if (type == EFFECT_MOTION_TYPE && id == 1) if (type == EFFECT_MOTION_TYPE && id == 1)
{ {
me->SetDisableGravity(false);
me->SetHover(false);
me->SetCanFly(false); me->SetCanFly(false);
me->SetDisableGravity(false);
if (Player* p = SelectTargetFromPlayerList(100.0f)) if (Player* p = SelectTargetFromPlayerList(100.0f))
{ {
@@ -3329,6 +3325,7 @@ public:
events.ScheduleEvent(1, urand(3000, 10000)); // Crypt Scarabs events.ScheduleEvent(1, urand(3000, 10000)); // Crypt Scarabs
events.ScheduleEvent(2, urand(15000, 25000)); // Dark Mending events.ScheduleEvent(2, urand(15000, 25000)); // Dark Mending
events.ScheduleEvent(3, urand(8000, 15000)); // Web Wrap events.ScheduleEvent(3, urand(8000, 15000)); // Web Wrap
me->AddUnitState(UNIT_STATE_NO_ENVIRONMENT_UPD);
} }
void MoveInLineOfSight(Unit* who) override void MoveInLineOfSight(Unit* who) override
@@ -3374,15 +3371,11 @@ public:
me->SetDisableGravity(false); me->SetDisableGravity(false);
me->SetOrientation(0.0f); me->SetOrientation(0.0f);
me->NearTeleportTo(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation()); me->NearTeleportTo(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation());
me->ClearUnitState(UNIT_STATE_NO_ENVIRONMENT_UPD);
} }
} }
} }
bool CanAIAttack(const Unit* /*target*/) const override
{
return !me->IsLevitating();
}
void UpdateAI(uint32 diff) override void UpdateAI(uint32 diff) override
{ {
if (!UpdateVictim()) if (!UpdateVictim())
@@ -3540,7 +3533,6 @@ public:
if (summon->GetPositionZ() > 220.0f) if (summon->GetPositionZ() > 220.0f)
{ {
summon->SetDisableGravity(true); summon->SetDisableGravity(true);
summon->SetHover(true);
summon->SetWalk(true); summon->SetWalk(true);
} }
} }
@@ -293,7 +293,6 @@ public:
me->SendMeleeAttackStop(me->GetVictim()); me->SendMeleeAttackStop(me->GetVictim());
me->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF); me->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF);
me->SetDisableGravity(true); me->SetDisableGravity(true);
me->SetHover(true);
currentTarget = 0; currentTarget = 0;
events.ScheduleEvent(EVENT_FLIGHT_ICEBOLT, 3000); events.ScheduleEvent(EVENT_FLIGHT_ICEBOLT, 3000);
iceboltCount = RAID_MODE(2, 3); iceboltCount = RAID_MODE(2, 3);
@@ -377,7 +376,6 @@ public:
case EVENT_LAND: case EVENT_LAND:
me->HandleEmoteCommand(EMOTE_ONESHOT_LAND); me->HandleEmoteCommand(EMOTE_ONESHOT_LAND);
me->SetDisableGravity(false); me->SetDisableGravity(false);
me->SetHover(false);
events.ScheduleEvent(EVENT_GROUND, 1500); events.ScheduleEvent(EVENT_GROUND, 1500);
return; return;
case EVENT_GROUND: case EVENT_GROUND:
@@ -222,7 +222,6 @@ public:
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
me->SetCanFly(true); me->SetCanFly(true);
me->SetDisableGravity(true); me->SetDisableGravity(true);
//me->SetHover(true);
me->SendMovementFlagUpdate(); me->SendMovementFlagUpdate();
if (pInstance) if (pInstance)
@@ -277,7 +276,6 @@ public:
case MI_POINT_INTRO_LAND: case MI_POINT_INTRO_LAND:
me->SetCanFly(false); me->SetCanFly(false);
me->SetDisableGravity(false); me->SetDisableGravity(false);
//me->SetHover(false);
events.RescheduleEvent(EVENT_START_FIGHT, 0, 1); events.RescheduleEvent(EVENT_START_FIGHT, 0, 1);
break; break;
case MI_POINT_VORTEX_TAKEOFF: case MI_POINT_VORTEX_TAKEOFF:
@@ -286,7 +284,6 @@ public:
case MI_POINT_VORTEX_LAND: case MI_POINT_VORTEX_LAND:
me->SetCanFly(false); me->SetCanFly(false);
me->SetDisableGravity(false); me->SetDisableGravity(false);
//me->SetHover(false);
events.RescheduleEvent(EVENT_VORTEX_LAND_1, 0, 1); events.RescheduleEvent(EVENT_VORTEX_LAND_1, 0, 1);
break; break;
case MI_POINT_CENTER_AIR_PH_2: case MI_POINT_CENTER_AIR_PH_2:
@@ -458,7 +455,6 @@ public:
me->StopMoving(); me->StopMoving();
me->SetCanFly(true); me->SetCanFly(true);
me->SetDisableGravity(true); me->SetDisableGravity(true);
//me->SetHover(true);
me->SendMovementFlagUpdate(); me->SendMovementFlagUpdate();
me->GetMotionMaster()->MoveTakeoff(MI_POINT_VORTEX_TAKEOFF, me->GetPositionX(), me->GetPositionY(), CenterPos.GetPositionZ() + 20.0f, 7.0f); me->GetMotionMaster()->MoveTakeoff(MI_POINT_VORTEX_TAKEOFF, me->GetPositionX(), me->GetPositionY(), CenterPos.GetPositionZ() + 20.0f, 7.0f);
@@ -1366,7 +1362,6 @@ public:
events.ScheduleEvent(1, 9000); events.ScheduleEvent(1, 9000);
me->SetCanFly(true); me->SetCanFly(true);
me->SetDisableGravity(true); me->SetDisableGravity(true);
me->SetHover(true);
} }
EventMap events; EventMap events;
@@ -215,7 +215,6 @@ public:
{ {
pa->SetCanFly(true); pa->SetCanFly(true);
pa->SetDisableGravity(true); pa->SetDisableGravity(true);
pa->SetHover(true);
pa->SendMovementFlagUpdate(); pa->SendMovementFlagUpdate();
pa->CastSpell(pa, SPELL_PLANAR_AURA_VISUAL, true); pa->CastSpell(pa, SPELL_PLANAR_AURA_VISUAL, true);
pa->CastSpell(pa, SPELL_PLANAR_AURA_DAMAGE, true); pa->CastSpell(pa, SPELL_PLANAR_AURA_DAMAGE, true);
@@ -145,7 +145,6 @@ public:
me->SetCanFly(true); me->SetCanFly(true);
me->SetDisableGravity(true); me->SetDisableGravity(true);
me->SetHover(true);
me->SendMovementFlagUpdate(); me->SendMovementFlagUpdate();
me->setActive(true); me->setActive(true);
@@ -284,7 +283,6 @@ public:
me->SetFacingTo(M_PI / 2); me->SetFacingTo(M_PI / 2);
me->SetCanFly(false); me->SetCanFly(false);
me->SetDisableGravity(false); me->SetDisableGravity(false);
me->SetHover(false);
me->CastSpell(me, 62794, true); me->CastSpell(me, 62794, true);
events.ScheduleEvent(EVENT_WARN_DEEP_BREATH, 30000); events.ScheduleEvent(EVENT_WARN_DEEP_BREATH, 30000);
} }
@@ -498,7 +496,6 @@ public:
me->StopMoving(); me->StopMoving();
me->SetCanFly(true); me->SetCanFly(true);
me->SetDisableGravity(true); me->SetDisableGravity(true);
me->SetHover(true);
me->SendMovementFlagUpdate(); me->SendMovementFlagUpdate();
me->GetMotionMaster()->MoveTakeoff(1, CORDS_AIR, 25.0f); me->GetMotionMaster()->MoveTakeoff(1, CORDS_AIR, 25.0f);
events.ScheduleEvent(EVENT_RESUME_FIXING, 22000); events.ScheduleEvent(EVENT_RESUME_FIXING, 22000);
@@ -170,7 +170,6 @@ public:
ValkyrGUID = s->GetGUID(); ValkyrGUID = s->GetGUID();
s->SetCanFly(true); s->SetCanFly(true);
s->SetDisableGravity(true); s->SetDisableGravity(true);
s->SetHover(true);
s->SetPosition(s->GetPositionX(), s->GetPositionY(), s->GetPositionZ() + 35.0f, s->GetOrientation()); s->SetPosition(s->GetPositionX(), s->GetPositionY(), s->GetPositionZ() + 35.0f, s->GetOrientation());
s->SetFacingTo(s->GetOrientation()); s->SetFacingTo(s->GetOrientation());
} }
@@ -126,9 +126,8 @@ public:
if (Creature* rider = p->ToCreature()) if (Creature* rider = p->ToCreature())
rider->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0.25f); rider->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0.25f);
me->SetDisableGravity(false);
me->SetHover(false);
me->SetCanFly(false); me->SetCanFly(false);
me->SetDisableGravity(false);
me->SetFacingTo(0.25f); me->SetFacingTo(0.25f);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC);
} }
@@ -139,9 +138,8 @@ public:
if (type == TYPE_PROTODRAKE_AT && data == DATA_PROTODRAKE_MOVE && !_setData && me->IsAlive() && me->GetDistance(protodrakeCheckPos) < 10.0f) if (type == TYPE_PROTODRAKE_AT && data == DATA_PROTODRAKE_MOVE && !_setData && me->IsAlive() && me->GetDistance(protodrakeCheckPos) < 10.0f)
{ {
_setData = true; _setData = true;
me->SetDisableGravity(true);
me->SetHover(true);
me->SetCanFly(true); me->SetCanFly(true);
me->SetDisableGravity(true);
me->GetMotionMaster()->MovePath(PATH_PROTODRAKE, false); me->GetMotionMaster()->MovePath(PATH_PROTODRAKE, false);
} }
} }
@@ -183,8 +183,8 @@ public:
{ {
if (type == POINT_MOTION_TYPE && id == POINT_MIDDLE) if (type == POINT_MOTION_TYPE && id == POINT_MIDDLE)
{ {
me->SetDisableGravity(false);
me->SetCanFly(false); me->SetCanFly(false);
me->SetDisableGravity(false);
events.ScheduleEvent(EVENT_RESTORE_COMBAT, 0); events.ScheduleEvent(EVENT_RESTORE_COMBAT, 0);
events.ScheduleEvent(EVENT_SPELL_CONE_OF_FIRE, 5000); events.ScheduleEvent(EVENT_SPELL_CONE_OF_FIRE, 5000);
if (IsHeroic()) if (IsHeroic())