aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMachiavelli <machiavelli.trinity@gmail.com>2012-03-12 00:45:58 +0100
committerMachiavelli <machiavelli.trinity@gmail.com>2012-03-12 00:53:45 +0100
commit03a24a84e493f914d46488e8c4ae9e9d663c21d7 (patch)
tree6299dee664c6a97fa9fbbb3482aa7a97d6e7d0dd /src
parent5ca27f40cced56414900aaaf656b45353a41aaf8 (diff)
Core/Units:
- Implement UNIT_FIELD_HOVERHEIGHT (requires DB data). This field, sent in update object packet, will determine the height at which a creature hovers if it has movementflag_hover applied. Note that hovering will now update the server-sided z-coordinate by the value of this field, and that all subsequent positional updates to the client will need to send z coordinate MINUS the hover height offset, or the hoverheight will be visually doubled client side. - Correct our usage of movementflag_flying, movementflag_can_fly, movementflag_hover and movementflag_disable_gravity (previously levitate), and how they relate to InhabitType in the database. This fixes "flying creatures on steroids" bug (wings flapping too fast), and potentially a lot of visual issues in AI scripts. Note that a lot of scripts still set wrong movementflags, these need to be fixed on a case by case basis. - Send correct packets for SPELL_AURA_FEATHER_FALL, SPELL_AURA_WATER_WALK and SPELL_AURA_HOVER apply/unapply. - Send correct packet contents for movement update in Unit::SetSpeed. - Misc. cleanup in affected scripts.
Diffstat (limited to 'src')
-rwxr-xr-xsrc/server/game/AI/CoreAI/GuardAI.cpp2
-rw-r--r--src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp2
-rw-r--r--src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp2
-rw-r--r--src/server/game/AI/SmartScripts/SmartAI.cpp12
-rwxr-xr-xsrc/server/game/Entities/Creature/Creature.cpp104
-rwxr-xr-xsrc/server/game/Entities/Creature/Creature.h6
-rwxr-xr-xsrc/server/game/Entities/Object/Object.cpp19
-rwxr-xr-xsrc/server/game/Entities/Object/Object.h3
-rwxr-xr-xsrc/server/game/Entities/Player/Player.cpp20
-rwxr-xr-xsrc/server/game/Entities/Player/Player.h9
-rwxr-xr-xsrc/server/game/Entities/Unit/Unit.cpp109
-rwxr-xr-xsrc/server/game/Entities/Unit/Unit.h45
-rwxr-xr-xsrc/server/game/Globals/ObjectMgr.cpp49
-rwxr-xr-xsrc/server/game/Maps/Map.cpp12
-rwxr-xr-xsrc/server/game/Movement/MovementGenerators/PointMovementGenerator.cpp2
-rwxr-xr-xsrc/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp2
-rw-r--r--src/server/game/Movement/Spline/MoveSplineInit.cpp2
-rwxr-xr-xsrc/server/game/Server/Protocol/Opcodes.cpp6
-rwxr-xr-xsrc/server/game/Spells/Auras/SpellAuraEffects.cpp41
-rw-r--r--src/server/scripts/Commands/cs_reload.cpp35
-rw-r--r--src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp4
-rw-r--r--src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp4
-rw-r--r--src/server/scripts/EasternKingdoms/ScarletEnclave/the_scarlet_enclave.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp4
-rw-r--r--src/server/scripts/EasternKingdoms/SunwellPlateau/boss_brutallus.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp6
-rw-r--r--src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp8
-rw-r--r--src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp6
-rw-r--r--src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp6
-rw-r--r--src/server/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/undercity.cpp4
-rw-r--r--src/server/scripts/EasternKingdoms/western_plaguelands.cpp2
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp6
-rw-r--r--src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp4
-rw-r--r--src/server/scripts/Kalimdor/silithus.cpp8
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp1
-rw-r--r--src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_saviana_ragefire.cpp12
-rwxr-xr-xsrc/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp5
-rwxr-xr-xsrc/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp4
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp4
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp2
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp2
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp36
-rwxr-xr-xsrc/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp10
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp40
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp8
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp4
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp4
-rw-r--r--src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp20
-rw-r--r--src/server/scripts/Northrend/Nexus/Oculus/boss_urom.cpp4
-rw-r--r--src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp1
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_assembly_of_iron.cpp2
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp8
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp1
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp1
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp6
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp94
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp2
-rw-r--r--src/server/scripts/Northrend/sholazar_basin.cpp2
-rw-r--r--src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_tailonking_ikiss.cpp2
-rw-r--r--src/server/scripts/Outland/BlackTemple/boss_illidan.cpp6
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp2
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp2
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/instance_serpent_shrine.cpp2
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp4
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_watchkeeper_gargolmar.cpp2
-rw-r--r--src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp6
-rw-r--r--src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp2
-rw-r--r--src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp2
-rw-r--r--src/server/scripts/Outland/blades_edge_mountains.cpp2
-rw-r--r--src/server/scripts/Outland/shadowmoon_valley.cpp8
-rw-r--r--src/server/scripts/World/npcs_special.cpp3
73 files changed, 486 insertions, 382 deletions
diff --git a/src/server/game/AI/CoreAI/GuardAI.cpp b/src/server/game/AI/CoreAI/GuardAI.cpp
index b78fec7c142..df29d485cba 100755
--- a/src/server/game/AI/CoreAI/GuardAI.cpp
+++ b/src/server/game/AI/CoreAI/GuardAI.cpp
@@ -54,7 +54,7 @@ bool GuardAI::CanSeeAlways(WorldObject const* obj)
void GuardAI::MoveInLineOfSight(Unit* unit)
{
// Ignore Z for flying creatures
- if (!me->canFly() && me->GetDistanceZ(unit) > CREATURE_Z_ATTACK_RANGE)
+ if (!me->CanFly() && me->GetDistanceZ(unit) > CREATURE_Z_ATTACK_RANGE)
return;
if (!me->getVictim() && me->IsValidAttackTarget(unit) &&
diff --git a/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp b/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp
index 1e0c3f5c1fc..688d48b41ad 100644
--- a/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp
+++ b/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp
@@ -95,7 +95,7 @@ void npc_escortAI::MoveInLineOfSight(Unit* who)
if (HasEscortState(STATE_ESCORT_ESCORTING) && AssistPlayerInCombat(who))
return;
- if (!me->canFly() && me->GetDistanceZ(who) > CREATURE_Z_ATTACK_RANGE)
+ if (!me->CanFly() && me->GetDistanceZ(who) > CREATURE_Z_ATTACK_RANGE)
return;
if (me->IsHostileTo(who))
diff --git a/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp b/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp
index e0fe12082f1..13bbbe2c338 100644
--- a/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp
+++ b/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp
@@ -93,7 +93,7 @@ void FollowerAI::MoveInLineOfSight(Unit* who)
if (HasFollowState(STATE_FOLLOW_INPROGRESS) && AssistPlayerInCombat(who))
return;
- if (!me->canFly() && me->GetDistanceZ(who) > CREATURE_Z_ATTACK_RANGE)
+ if (!me->CanFly() && me->GetDistanceZ(who) > CREATURE_Z_ATTACK_RANGE)
return;
if (me->IsHostileTo(who))
diff --git a/src/server/game/AI/SmartScripts/SmartAI.cpp b/src/server/game/AI/SmartScripts/SmartAI.cpp
index 50c7aba0360..4cf438da5a4 100644
--- a/src/server/game/AI/SmartScripts/SmartAI.cpp
+++ b/src/server/game/AI/SmartScripts/SmartAI.cpp
@@ -729,17 +729,7 @@ void SmartAI::SetRun(bool run)
void SmartAI::SetFly(bool fly)
{
- if (fly)
- {
- me->SetLevitate(true);
- me->SetByteFlag(UNIT_FIELD_BYTES_1, 3, 0x01);
- }
- else
- {
- me->SetLevitate(false);
- me->RemoveByteFlag(UNIT_FIELD_BYTES_1, 3, 0x01);
- }
- me->SetFlying(fly);
+ me->SetDisableGravity(fly);
me->SendMovementFlagUpdate();
}
diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp
index 2b4f1275993..1fb972ccfdf 100755
--- a/src/server/game/Entities/Creature/Creature.cpp
+++ b/src/server/game/Entities/Creature/Creature.cpp
@@ -334,7 +334,8 @@ bool Creature::InitEntry(uint32 Entry, uint32 /*team*/, const CreatureData* data
SetSpeed(MOVE_FLIGHT, 1.0f); // using 1.0 rate
SetFloatValue(OBJECT_FIELD_SCALE_X, cinfo->scale);
- SetLevitate(canFly());
+
+ SetFloatValue(UNIT_FIELD_HOVERHEIGHT, cinfo->HoverHeight);
// checked at loading
m_defaultMovementType = MovementGeneratorType(cinfo->MovementType);
@@ -418,10 +419,25 @@ bool Creature::UpdateEntry(uint32 Entry, uint32 team, const CreatureData* data)
ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_ATTACK_ME, true);
}
- // TODO: In fact monster move flags should be set - not movement flags.
- if (cInfo->InhabitType & INHABIT_AIR)
- AddUnitMovementFlag(MOVEMENTFLAG_CAN_FLY | MOVEMENTFLAG_FLYING);
-
+ //! Suspect it works this way:
+ //! If creature can walk and fly (usually with pathing)
+ //! Set MOVEMENTFLAG_CAN_FLY. Otherwise if it can only fly
+ //! Set MOVEMENTFLAG_DISABLE_GRAVITY
+ //! The only time I saw Movement Flags: DisableGravity, CanFly, Flying (50332672) on the same unit
+ //! it was a vehicle
+ if (cInfo->InhabitType & INHABIT_AIR && cInfo->InhabitType & INHABIT_GROUND)
+ SetCanFly(true);
+ else if (cInfo->InhabitType & INHABIT_AIR)
+ SetDisableGravity(true);
+ /*! Implemented in LoadCreatureAddon. Suspect there's a rule for UNIT_BYTE_1_FLAG_HOVER
+ in relation to DisableGravity also.
+
+ else if (GetByteValue(UNIT_FIELD_BYTES_1, 3) & UNIT_BYTE_1_FLAG_HOVER)
+ SetHover(true);
+
+ */
+
+ // TODO: Shouldn't we check whether or not the creature is in water first?
if (cInfo->InhabitType & INHABIT_WATER)
AddUnitMovementFlag(MOVEMENTFLAG_SWIMMING);
@@ -742,6 +758,14 @@ bool Creature::Create(uint32 guidlow, Map* map, uint32 phaseMask, uint32 Entry,
return false;
}
+ //oX = x; oY = y; dX = x; dY = y; m_moveTime = 0; m_startMove = 0;
+ if (!CreateFromProto(guidlow, Entry, vehId, team, data))
+ return false;
+
+ //! Need to be called after CreateFromProto
+ if (HasUnitMovementFlag(MOVEMENTFLAG_DISABLE_GRAVITY))
+ z += GetFloatValue(UNIT_FIELD_HOVERHEIGHT);
+
Relocate(x, y, z, ang);
if (!IsPositionValid())
@@ -750,10 +774,6 @@ bool Creature::Create(uint32 guidlow, Map* map, uint32 phaseMask, uint32 Entry,
return false;
}
- //oX = x; oY = y; dX = x; dY = y; m_moveTime = 0; m_startMove = 0;
- if (!CreateFromProto(guidlow, Entry, vehId, team, data))
- return false;
-
switch (GetCreatureTemplate()->rank)
{
case CREATURE_ELITE_RARE:
@@ -783,17 +803,6 @@ bool Creature::Create(uint32 guidlow, Map* map, uint32 phaseMask, uint32 Entry,
SetByteValue(UNIT_FIELD_BYTES_0, 2, minfo->gender);
}
- if (GetCreatureTemplate()->InhabitType & INHABIT_AIR)
- {
- if (GetDefaultMovementType() == IDLE_MOTION_TYPE)
- AddUnitMovementFlag(MOVEMENTFLAG_CAN_FLY);
- else
- SetFlying(true);
- }
-
- if (GetCreatureTemplate()->InhabitType & INHABIT_WATER)
- AddUnitMovementFlag(MOVEMENTFLAG_SWIMMING);
-
LastUsedScriptID = GetCreatureTemplate()->ScriptID;
// TODO: Replace with spell, handle from DB
@@ -1065,11 +1074,11 @@ void Creature::SaveToDB(uint32 mapid, uint8 spawnMask, uint32 phaseMask)
data.equipmentId = GetEquipmentId();
data.posX = GetPositionX();
data.posY = GetPositionY();
- data.posZ = GetPositionZ();
+ data.posZ = GetPositionZMinusOffset();
data.orientation = GetOrientation();
data.spawntimesecs = m_respawnDelay;
// prevent add data integrity problems
- data.spawndist = GetDefaultMovementType() == IDLE_MOTION_TYPE ? 0 : m_respawnradius;
+ data.spawndist = GetDefaultMovementType() == IDLE_MOTION_TYPE ? 0.0f : m_respawnradius;
data.currentwaypoint = 0;
data.curhealth = GetHealth();
data.curmana = GetPower(POWER_MANA);
@@ -1287,7 +1296,7 @@ bool Creature::LoadCreatureFromDB(uint32 guid, Map* map, bool addToMap)
if (m_respawnTime) // respawn on Update
{
m_deathState = DEAD;
- if (canFly())
+ if (CanFly())
{
float tz = map->GetHeight(GetPhaseMask(), data->posX, data->posY, data->posZ, false);
if (data->posZ - tz > 0.1f)
@@ -1420,7 +1429,7 @@ bool Creature::canStartAttack(Unit const* who, bool force) const
if (who->GetTypeId() == TYPEID_UNIT && who->GetCreatureType() == CREATURE_TYPE_NON_COMBAT_PET)
return false;
- if (!canFly() && (GetDistanceZ(who) > CREATURE_Z_ATTACK_RANGE + m_CombatDistance))
+ if (!CanFly() && (GetDistanceZ(who) > CREATURE_Z_ATTACK_RANGE + m_CombatDistance))
//|| who->IsControlledByPlayer() && who->IsFlying()))
// we cannot check flying for other creatures, too much map/vmap calculation
// TODO: should switch to range attack
@@ -1517,7 +1526,7 @@ void Creature::setDeathState(DeathState s)
if (m_formation && m_formation->getLeader() == this)
m_formation->FormationReset(true);
- if ((canFly() || IsFlying()))
+ if ((CanFly() || IsFlying()))
i_motionMaster.MoveFall();
Unit::setDeathState(CORPSE);
@@ -1532,7 +1541,7 @@ void Creature::setDeathState(DeathState s)
CreatureTemplate const* cinfo = GetCreatureTemplate();
SetWalk(true);
if (GetCreatureTemplate()->InhabitType & INHABIT_AIR)
- AddUnitMovementFlag(MOVEMENTFLAG_CAN_FLY | MOVEMENTFLAG_FLYING);
+ SetDisableGravity(true);
if (GetCreatureTemplate()->InhabitType & INHABIT_WATER)
AddUnitMovementFlag(MOVEMENTFLAG_SWIMMING);
SetUInt32Value(UNIT_NPC_FLAGS, cinfo->npcflag);
@@ -2040,6 +2049,12 @@ bool Creature::LoadCreaturesAddon(bool reload)
SetByteValue(UNIT_FIELD_BYTES_1, 1, 0);
SetByteValue(UNIT_FIELD_BYTES_1, 2, uint8((cainfo->bytes1 >> 16) & 0xFF));
SetByteValue(UNIT_FIELD_BYTES_1, 3, uint8((cainfo->bytes1 >> 24) & 0xFF));
+
+ //! Suspected correlation between UNIT_FIELD_BYTES_1, offset 3, value 0x2:
+ //! If no inhabittype_fly (if no MovementFlag_DisableGravity flag found in sniffs)
+ //! Set MovementFlag_Hover. Otherwise do nothing.
+ if (GetByteValue(UNIT_FIELD_BYTES_1, 3) & UNIT_BYTE1_FLAG_HOVER && !IsLevitating())
+ AddUnitMovementFlag(MOVEMENTFLAG_HOVER);
}
if (cainfo->bytes2 != 0)
@@ -2088,6 +2103,7 @@ bool Creature::LoadCreaturesAddon(bool reload)
sLog->outDebug(LOG_FILTER_UNITS, "Spell: %u added to creature (GUID: %u Entry: %u)", *itr, GetGUIDLow(), GetEntry());
}
}
+
return true;
}
@@ -2415,17 +2431,43 @@ bool Creature::SetWalk(bool enable)
WorldPacket data(enable ? SMSG_SPLINE_MOVE_SET_WALK_MODE : SMSG_SPLINE_MOVE_SET_RUN_MODE, 9);
data.append(GetPackGUID());
- SendMessageToSet(&data, true);
+ SendMessageToSet(&data, false);
+ return true;
+}
+
+bool Creature::SetDisableGravity(bool disable, bool packetOnly/*=false*/)
+{
+ //! It's possible only a packet is sent but moveflags are not updated
+ //! Need more research on this
+ if (!packetOnly && !Unit::SetDisableGravity(disable))
+ return false;
+
+ if (!movespline->Initialized())
+ return true;
+
+ WorldPacket data(disable ? SMSG_SPLINE_MOVE_GRAVITY_DISABLE : SMSG_SPLINE_MOVE_GRAVITY_ENABLE, 9);
+ data.append(GetPackGUID());
+ SendMessageToSet(&data, false);
return true;
}
-bool Creature::SetLevitate(bool enable)
+bool Creature::SetHover(bool enable)
{
- if (!Unit::SetLevitate(enable))
+ if (!Unit::SetHover(enable))
return false;
- WorldPacket data(enable ? SMSG_SPLINE_MOVE_GRAVITY_DISABLE : SMSG_SPLINE_MOVE_GRAVITY_ENABLE, 9);
+ //! Unconfirmed for players:
+ if (enable)
+ SetByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_HOVER);
+ else
+ RemoveByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_HOVER);
+
+ if (!movespline->Initialized())
+ return true;
+
+ //! Not always a packet is sent
+ WorldPacket data(enable ? SMSG_SPLINE_MOVE_SET_HOVER : SMSG_SPLINE_MOVE_UNSET_HOVER, 9);
data.append(GetPackGUID());
- SendMessageToSet(&data, true);
+ SendMessageToSet(&data, false);
return true;
}
diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h
index f986e09e7cb..2f9549fd70a 100755
--- a/src/server/game/Entities/Creature/Creature.h
+++ b/src/server/game/Entities/Creature/Creature.h
@@ -134,6 +134,7 @@ struct CreatureTemplate
std::string AIName;
uint32 MovementType;
uint32 InhabitType;
+ float HoverHeight;
float ModHealth;
float ModMana;
float ModArmor;
@@ -467,7 +468,7 @@ class Creature : public Unit, public GridObject<Creature>, public MapCreature
bool isGuard() const { return GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_GUARD; }
bool canWalk() const { return GetCreatureTemplate()->InhabitType & INHABIT_GROUND; }
bool canSwim() const { return GetCreatureTemplate()->InhabitType & INHABIT_WATER; }
- //bool canFly() const { return GetCreatureTemplate()->InhabitType & INHABIT_AIR; }
+ bool CanFly() const { return GetCreatureTemplate()->InhabitType & INHABIT_AIR; }
void SetReactState(ReactStates st) { m_reactState = st; }
ReactStates GetReactState() { return m_reactState; }
@@ -521,7 +522,8 @@ class Creature : public Unit, public GridObject<Creature>, public MapCreature
CreatureAI* AI() const { return (CreatureAI*)i_AI; }
bool SetWalk(bool enable);
- bool SetLevitate(bool enable);
+ bool SetDisableGravity(bool disable, bool packetOnly = false);
+ bool SetHover(bool enable);
uint32 GetShieldBlockValue() const //dunno mob block value
{
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp
index 2a2b78f4630..56ddd14dc3a 100755
--- a/src/server/game/Entities/Object/Object.cpp
+++ b/src/server/game/Entities/Object/Object.cpp
@@ -340,7 +340,10 @@ void Object::_BuildMovementUpdate(ByteBuffer* data, uint16 flags) const
*data << ((WorldObject*)this)->GetPositionX();
*data << ((WorldObject*)this)->GetPositionY();
- *data << ((WorldObject*)this)->GetPositionZ();
+ if (isType(TYPEMASK_UNIT))
+ *data << ((Unit*)this)->GetPositionZMinusOffset();
+ else
+ *data << ((WorldObject*)this)->GetPositionZ();
if (transport)
{
@@ -352,7 +355,10 @@ void Object::_BuildMovementUpdate(ByteBuffer* data, uint16 flags) const
{
*data << ((WorldObject*)this)->GetPositionX();
*data << ((WorldObject*)this)->GetPositionY();
- *data << ((WorldObject*)this)->GetPositionZ();
+ if (isType(TYPEMASK_UNIT))
+ *data << ((Unit*)this)->GetPositionZMinusOffset();
+ else
+ *data << ((WorldObject*)this)->GetPositionZ();
}
*data << ((WorldObject*)this)->GetOrientation();
@@ -369,7 +375,10 @@ void Object::_BuildMovementUpdate(ByteBuffer* data, uint16 flags) const
{
*data << ((WorldObject*)this)->GetPositionX();
*data << ((WorldObject*)this)->GetPositionY();
- *data << ((WorldObject*)this)->GetPositionZ();
+ if (isType(TYPEMASK_UNIT))
+ *data << ((Unit*)this)->GetPositionZMinusOffset();
+ else
+ *data << ((WorldObject*)this)->GetPositionZ();
*data << ((WorldObject*)this)->GetOrientation();
}
}
@@ -1557,7 +1566,7 @@ void WorldObject::UpdateAllowedPositionZ(float x, float y, float &z) const
{
// non fly unit don't must be in air
// non swim unit must be at ground (mostly speedup, because it don't must be in water and water level check less fast
- if (!ToCreature()->canFly())
+ if (!ToCreature()->CanFly())
{
bool canSwim = ToCreature()->canSwim();
float ground_z = z;
@@ -1583,7 +1592,7 @@ void WorldObject::UpdateAllowedPositionZ(float x, float y, float &z) const
case TYPEID_PLAYER:
{
// for server controlled moves playr work same as creature (but it can always swim)
- if (!ToPlayer()->canFly())
+ if (!ToPlayer()->CanFly())
{
float ground_z = z;
float max_z = GetBaseMap()->GetWaterOrGroundLevel(x, y, z, &ground_z, !ToUnit()->HasAuraType(SPELL_AURA_WATER_WALK));
diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h
index c243527570b..fd8deb1b841 100755
--- a/src/server/game/Entities/Object/Object.h
+++ b/src/server/game/Entities/Object/Object.h
@@ -776,7 +776,8 @@ class WorldObject : public Object, public WorldLocation
GetClosePoint(x, y, z, GetObjectSize());
ang = GetOrientation();
}
- Position pos = {x, y, z, ang};
+ Position pos;
+ pos.Relocate(x, y, z, ang);
return SummonCreature(id, pos, spwtype, despwtime, 0);
}
GameObject* SummonGameObject(uint32 entry, float x, float y, float z, float ang, float rotation0, float rotation1, float rotation2, float rotation3, uint32 respawnTime);
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 8318bd246d0..f3f376dae04 100755
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -22170,6 +22170,18 @@ void Player::SendAurasForTarget(Unit* target)
if (!target || target->GetVisibleAuras()->empty()) // speedup things
return;
+ /*! Blizz sends certain movement packets sometimes even before CreateObject
+ These movement packets are usually found in SMSG_COMPRESSED_MOVES
+ */
+ if (target->HasAuraType(SPELL_AURA_FEATHER_FALL))
+ target->SendMovementFeatherFall();
+
+ if (target->HasAuraType(SPELL_AURA_WATER_WALK))
+ target->SendMovementWaterWalking();
+
+ if (target->HasAuraType(SPELL_AURA_HOVER))
+ target->SendMovementHover();
+
WorldPacket data(SMSG_AURA_UPDATE_ALL);
data.append(target->GetPackGUID());
@@ -25158,3 +25170,11 @@ bool Player::IsInWhisperWhiteList(uint64 guid)
}
return false;
}
+
+bool Player::SetHover(bool enable)
+{
+ if (!Unit::SetHover(enable))
+ return false;
+
+ return true;
+}
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index bd58827c0e4..7f6b2322e93 100755
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -2287,6 +2287,8 @@ class Player : public Unit, public GridObject<Player>
m_mover->m_movedPlayer = this;
}
+ bool SetHover(bool enable);
+
void SetSeer(WorldObject* target) { m_seer = target; }
void SetViewpoint(WorldObject* target, bool apply);
WorldObject* GetViewpoint() const;
@@ -2479,6 +2481,10 @@ class Player : public Unit, public GridObject<Player>
void AddWhisperWhiteList(uint64 guid) { WhisperList.push_back(guid); }
bool IsInWhisperWhiteList(uint64 guid);
+ #pragma region Player Movement
+
+ bool CanFly() const { return m_movementInfo.HasMovementFlag(MOVEMENTFLAG_CAN_FLY); }
+
//! Return collision height sent to client
float GetCollisionHeight(bool mounted)
{
@@ -2511,8 +2517,9 @@ class Player : public Unit, public GridObject<Player>
return modelData->CollisionHeight;
}
- //! TODO: Need a proper calculation for collision height when mounted
}
+ #pragma endregion Player Movement
+
protected:
// Gamemaster whisper whitelist
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 3411d285b1e..6d4963f1960 100755
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -3049,7 +3049,7 @@ bool Unit::isInAccessiblePlaceFor(Creature const* c) const
if (IsInWater())
return c->canSwim();
else
- return c->canWalk() || c->canFly();
+ return c->canWalk() || c->CanFly();
}
bool Unit::IsInWater() const
@@ -12597,15 +12597,7 @@ void Unit::SetSpeed(UnitMoveType mtype, float rate, bool forced)
return;
}
- data.append(GetPackGUID());
- data << uint32(0); // movement flags
- data << uint16(0); // unk flags
- data << uint32(getMSTime());
- data << float(GetPositionX());
- data << float(GetPositionY());
- data << float(GetPositionZ());
- data << float(GetOrientation());
- data << uint32(0); // fall time
+ BuildMovementPacket(&data);
data << float(GetSpeed(mtype));
SendMessageToSet(&data, true);
}
@@ -12664,14 +12656,6 @@ void Unit::SetSpeed(UnitMoveType mtype, float rate, bool forced)
}
}
-void Unit::SetHover(bool on)
-{
- if (on)
- CastSpell(this, 11010, true);
- else
- RemoveAurasDueToSpell(11010);
-}
-
void Unit::setDeathState(DeathState s)
{
// death state needs to be updated before RemoveAllAurasOnDeath() calls HandleChannelDeathItem(..) so that
@@ -17058,12 +17042,12 @@ void Unit::_ExitVehicle(Position const* exitPosition)
void Unit::BuildMovementPacket(ByteBuffer *data) const
{
- *data << uint32(GetUnitMovementFlags()); // movement flags
- *data << uint16(m_movementInfo.flags2); // 2.3.0
- *data << uint32(getMSTime()); // time
+ *data << uint32(GetUnitMovementFlags()); // movement flags
+ *data << uint16(GetExtraUnitMovementFlags()); // 2.3.0
+ *data << uint32(getMSTime()); // time / counter
*data << GetPositionX();
*data << GetPositionY();
- *data << GetPositionZ();
+ *data << GetPositionZMinusOffset();
*data << GetOrientation();
// 0x00000200
@@ -17108,18 +17092,12 @@ void Unit::BuildMovementPacket(ByteBuffer *data) const
*data << (float)m_movementInfo.splineElevation;
}
-void Unit::SetFlying(bool apply)
+void Unit::SetCanFly(bool apply)
{
if (apply)
- {
- SetByteFlag(UNIT_FIELD_BYTES_1, 3, 0x02);
- AddUnitMovementFlag(MOVEMENTFLAG_CAN_FLY | MOVEMENTFLAG_FLYING);
- }
+ AddUnitMovementFlag(MOVEMENTFLAG_CAN_FLY);
else
- {
- RemoveByteFlag(UNIT_FIELD_BYTES_1, 3, 0x02);
- RemoveUnitMovementFlag(MOVEMENTFLAG_CAN_FLY | MOVEMENTFLAG_FLYING);
- }
+ RemoveUnitMovementFlag(MOVEMENTFLAG_CAN_FLY);
}
void Unit::NearTeleportTo(float x, float y, float z, float orientation, bool casting /*= false*/)
@@ -17165,11 +17143,20 @@ bool Unit::UpdatePosition(float x, float y, float z, float orientation, bool tel
return (relocated || turn);
}
+//! Only server-side orientation update, does not broadcast to client
void Unit::UpdateOrientation(float orientation)
{
SetOrientation(orientation);
if (IsVehicle())
- GetVehicleKit()->RelocatePassengers(GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation());
+ GetVehicleKit()->RelocatePassengers(GetPositionX(), GetPositionY(), GetPositionZ(), orientation);
+}
+
+//! Only server-side height update, does not broadcast to client
+void Unit::UpdateHeight(float newZ)
+{
+ Relocate(GetPositionX(), GetPositionY(), newZ);
+ if (IsVehicle())
+ GetVehicleKit()->RelocatePassengers(GetPositionX(), GetPositionY(), newZ, GetOrientation());
}
void Unit::SendThreatListUpdate()
@@ -17457,15 +17444,65 @@ bool Unit::SetWalk(bool enable)
return true;
}
-bool Unit::SetLevitate(bool enable)
+bool Unit::SetDisableGravity(bool disable)
+{
+ if (disable == IsLevitating())
+ return false;
+
+ if (disable)
+ AddUnitMovementFlag(MOVEMENTFLAG_DISABLE_GRAVITY);
+ else
+ RemoveUnitMovementFlag(MOVEMENTFLAG_DISABLE_GRAVITY);
+
+ return true;
+}
+
+bool Unit::SetHover(bool enable)
{
- if (enable == IsLevitating())
+ if (enable == HasUnitMovementFlag(MOVEMENTFLAG_HOVER))
return false;
if (enable)
- AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING);
+ {
+ //! No need to check height on ascent
+ AddUnitMovementFlag(MOVEMENTFLAG_HOVER);
+ if (float hh = GetFloatValue(UNIT_FIELD_HOVERHEIGHT))
+ UpdateHeight(GetPositionZ() + hh);
+ }
else
- RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING);
+ {
+ RemoveUnitMovementFlag(MOVEMENTFLAG_HOVER);
+ if (float hh = GetFloatValue(UNIT_FIELD_HOVERHEIGHT))
+ {
+ float newZ = GetPositionZ() - hh;
+ UpdateAllowedPositionZ(GetPositionX(), GetPositionY(), newZ);
+ UpdateHeight(newZ);
+ }
+ }
return true;
}
+
+void Unit::SendMovementHover()
+{
+ WorldPacket data(MSG_MOVE_HOVER, 64);
+ data.append(GetPackGUID());
+ BuildMovementPacket(&data);
+ SendMessageToSet(&data, true);
+}
+
+void Unit::SendMovementWaterWalking()
+{
+ WorldPacket data(MSG_MOVE_WATER_WALK, 64);
+ data.append(GetPackGUID());
+ BuildMovementPacket(&data);
+ SendMessageToSet(&data, true);
+}
+
+void Unit::SendMovementFeatherFall()
+{
+ WorldPacket data(MSG_MOVE_FEATHER_FALL, 64);
+ data.append(GetPackGUID());
+ BuildMovementPacket(&data);
+ SendMessageToSet(&data, true);
+}
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index b07f2ae1c16..79ed0ec2f3d 100755
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -184,10 +184,10 @@ enum UnitStandFlags
// byte flags value (UNIT_FIELD_BYTES_1, 3)
enum UnitBytes1_Flags
{
- UNIT_BYTE1_FLAG_ALWAYS_STAND = 0x01,
- UNIT_BYTE1_FLAG_UNK_2 = 0x02,
- UNIT_BYTE1_FLAG_UNK_3 = 0x04,
- UNIT_BYTE1_FLAG_ALL = 0xFF
+ UNIT_BYTE1_FLAG_ALWAYS_STAND = 0x01,
+ UNIT_BYTE1_FLAG_HOVER = 0x02,
+ UNIT_BYTE1_FLAG_UNK_3 = 0x04,
+ UNIT_BYTE1_FLAG_ALL = 0xFF
};
// high byte (3 from 0..3) of UNIT_FIELD_BYTES_2
@@ -676,7 +676,7 @@ enum MovementFlags
MOVEMENTFLAG_PITCH_DOWN = 0x00000080,
MOVEMENTFLAG_WALKING = 0x00000100, // Walking
MOVEMENTFLAG_ONTRANSPORT = 0x00000200, // Used for flying on some creatures
- MOVEMENTFLAG_LEVITATING = 0x00000400,
+ MOVEMENTFLAG_DISABLE_GRAVITY = 0x00000400, // Former MOVEMENTFLAG_LEVITATING. This is used when walking is not possible.
MOVEMENTFLAG_ROOT = 0x00000800, // Must not be set along with MOVEMENTFLAG_MASK_MOVING
MOVEMENTFLAG_JUMPING = 0x00001000,
MOVEMENTFLAG_FALLING = 0x00002000, // damage dealt on that type of falling
@@ -690,8 +690,8 @@ enum MovementFlags
MOVEMENTFLAG_SWIMMING = 0x00200000, // appears with fly flag also
MOVEMENTFLAG_ASCENDING = 0x00400000, // press "space" when flying
MOVEMENTFLAG_DESCENDING = 0x00800000,
- MOVEMENTFLAG_CAN_FLY = 0x01000000, // can fly
- MOVEMENTFLAG_FLYING = 0x02000000, // hover
+ MOVEMENTFLAG_CAN_FLY = 0x01000000, // Appears when unit can fly AND also walk
+ MOVEMENTFLAG_FLYING = 0x02000000, // unit is actually flying. pretty sure this is only used for players. creatures use disable_gravity
MOVEMENTFLAG_SPLINE_ELEVATION = 0x04000000, // used for flight paths
MOVEMENTFLAG_SPLINE_ENABLED = 0x08000000, // used for flight paths
MOVEMENTFLAG_WATERWALKING = 0x10000000, // prevent unit from falling through water
@@ -706,6 +706,10 @@ enum MovementFlags
MOVEMENTFLAG_MASK_TURNING =
MOVEMENTFLAG_LEFT | MOVEMENTFLAG_RIGHT,
+
+ //! TODO if needed: add more flags to this masks that are exclusive to players
+ MOVEMENTFLAG_MASK_PLAYER_ONLY =
+ MOVEMENTFLAG_FLYING,
};
enum MovementFlags2
{
@@ -1615,6 +1619,7 @@ class Unit : public WorldObject
// returns true if unit's position really changed
bool UpdatePosition(const Position &pos, bool teleport = false) { return UpdatePosition(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation(), teleport); }
void UpdateOrientation(float orientation);
+ void UpdateHeight(float newZ);
void KnockbackFrom(float x, float y, float speedXY, float speedZ);
void JumpTo(float speedXY, float speedZ, bool forward = true);
@@ -1626,10 +1631,14 @@ class Unit : public WorldObject
//void SendMonsterMove(float NewPosX, float NewPosY, float NewPosZ, uint8 type, uint32 MovementFlags, uint32 Time, Player* player = NULL);
void SendMonsterMoveTransport(Unit* vehicleOwner);
void SendMovementFlagUpdate();
- bool IsLevitating() const { return m_movementInfo.HasMovementFlag(MOVEMENTFLAG_LEVITATING);}
+ void SendMovementHover();
+ void SendMovementFeatherFall();
+ void SendMovementWaterWalking();
+ bool IsLevitating() const { return m_movementInfo.HasMovementFlag(MOVEMENTFLAG_DISABLE_GRAVITY);}
bool IsWalking() const { return m_movementInfo.HasMovementFlag(MOVEMENTFLAG_WALKING);}
virtual bool SetWalk(bool enable);
- virtual bool SetLevitate(bool enable);
+ virtual bool SetDisableGravity(bool disable);
+ bool SetHover(bool enable);
void SetInFront(Unit const* target);
void SetFacingTo(float ori);
@@ -2053,7 +2062,6 @@ class Unit : public WorldObject
void SetSpeed(UnitMoveType mtype, float rate, bool forced = false);
float m_TempSpeed;
- void SetHover(bool on);
bool isHover() const { return HasAuraType(SPELL_AURA_HOVER); }
float ApplyEffectModifiers(SpellInfo const* spellProto, uint8 effect_index, float value) const;
@@ -2077,7 +2085,7 @@ class Unit : public WorldObject
void AddUnitMovementFlag(uint32 f) { m_movementInfo.flags |= f; }
void RemoveUnitMovementFlag(uint32 f) { m_movementInfo.flags &= ~f; }
- uint32 HasUnitMovementFlag(uint32 f) const { return m_movementInfo.flags & f; }
+ bool HasUnitMovementFlag(uint32 f) const { return (m_movementInfo.flags & f) == f; }
uint32 GetUnitMovementFlags() const { return m_movementInfo.flags; }
void SetUnitMovementFlags(uint32 f) { m_movementInfo.flags = f; }
@@ -2087,6 +2095,15 @@ class Unit : public WorldObject
uint16 GetExtraUnitMovementFlags() const { return m_movementInfo.flags2; }
void SetExtraUnitMovementFlags(uint16 f) { m_movementInfo.flags2 = f; }
+ float GetPositionZMinusOffset() const
+ {
+ float offset = 0.0f;
+ if (HasUnitMovementFlag(MOVEMENTFLAG_HOVER))
+ offset = GetFloatValue(UNIT_FIELD_HOVERHEIGHT);
+
+ return GetPositionZ() - offset;
+ }
+
void SetControlled(bool apply, UnitState state);
void AddComboPointHolder(uint32 lowguid) { m_ComboPointHolders.insert(lowguid); }
@@ -2171,9 +2188,9 @@ class Unit : public WorldObject
bool isMoving() const { return m_movementInfo.HasMovementFlag(MOVEMENTFLAG_MASK_MOVING); }
bool isTurning() const { return m_movementInfo.HasMovementFlag(MOVEMENTFLAG_MASK_TURNING); }
- bool canFly() const { return m_movementInfo.HasMovementFlag(MOVEMENTFLAG_CAN_FLY); }
- bool IsFlying() const { return m_movementInfo.HasMovementFlag(MOVEMENTFLAG_FLYING); }
- void SetFlying(bool apply);
+ virtual bool CanFly() const = 0;
+ bool IsFlying() const { return m_movementInfo.HasMovementFlag(MOVEMENTFLAG_FLYING | MOVEMENTFLAG_DISABLE_GRAVITY); }
+ void SetCanFly(bool apply);
void RewardRage(uint32 damage, uint32 weaponSpeedHitFactor, bool attacker);
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index 11977280177..f2b867b91ff 100755
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -377,9 +377,9 @@ void ObjectMgr::LoadCreatureTemplates()
// 54 55 56 57 58 59 60 61 62 63 64 65 66
"spell2, spell3, spell4, spell5, spell6, spell7, spell8, PetSpellDataId, VehicleId, mingold, maxgold, AIName, MovementType, "
// 67 68 69 70 71 72 73 74 75 76 77
- "InhabitType, Health_mod, Mana_mod, Armor_mod, RacialLeader, questItem1, questItem2, questItem3, questItem4, questItem5, questItem6, "
+ "InhabitType, HoverHeight, Health_mod, Mana_mod, Armor_mod, RacialLeader, questItem1, questItem2, questItem3, questItem4, questItem5, "
// 78 79 80 81 82 83
- "movementId, RegenHealth, equipment_id, mechanic_immune_mask, flags_extra, ScriptName "
+ " questItem6, movementId, RegenHealth, equipment_id, mechanic_immune_mask, flags_extra, ScriptName "
"FROM creature_template;");
if (!result)
@@ -463,20 +463,21 @@ void ObjectMgr::LoadCreatureTemplates()
creatureTemplate.AIName = fields[65].GetString();
creatureTemplate.MovementType = uint32(fields[66].GetUInt8());
creatureTemplate.InhabitType = uint32(fields[67].GetUInt8());
- creatureTemplate.ModHealth = fields[68].GetFloat();
- creatureTemplate.ModMana = fields[69].GetFloat();
- creatureTemplate.ModArmor = fields[70].GetFloat();
- creatureTemplate.RacialLeader = fields[71].GetBool();
+ creatureTemplate.HoverHeight = fields[68].GetFloat();
+ creatureTemplate.ModHealth = fields[69].GetFloat();
+ creatureTemplate.ModMana = fields[70].GetFloat();
+ creatureTemplate.ModArmor = fields[71].GetFloat();
+ creatureTemplate.RacialLeader = fields[72].GetBool();
for (uint8 i = 0; i < MAX_CREATURE_QUEST_ITEMS; ++i)
- creatureTemplate.questItems[i] = fields[72 + i].GetUInt32();
+ creatureTemplate.questItems[i] = fields[73 + i].GetUInt32();
- creatureTemplate.movementId = fields[78].GetUInt32();
- creatureTemplate.RegenHealth = fields[79].GetBool();
- creatureTemplate.equipmentId = fields[80].GetUInt32();
- creatureTemplate.MechanicImmuneMask = fields[81].GetUInt32();
- creatureTemplate.flags_extra = fields[82].GetUInt32();
- creatureTemplate.ScriptID = GetScriptId(fields[83].GetCString());
+ creatureTemplate.movementId = fields[79].GetUInt32();
+ creatureTemplate.RegenHealth = fields[80].GetBool();
+ creatureTemplate.equipmentId = fields[81].GetUInt32();
+ creatureTemplate.MechanicImmuneMask = fields[82].GetUInt32();
+ creatureTemplate.flags_extra = fields[83].GetUInt32();
+ creatureTemplate.ScriptID = GetScriptId(fields[84].GetCString());
++count;
}
@@ -494,7 +495,7 @@ void ObjectMgr::LoadCreatureTemplateAddons()
{
uint32 oldMSTime = getMSTime();
- // 0 1 2 3 4 5 6
+ // 0 1 2 3 4 5 6
QueryResult result = WorldDatabase.Query("SELECT entry, path_id, mount, bytes1, bytes2, emote, auras FROM creature_template_addon");
if (!result)
@@ -549,7 +550,10 @@ void ObjectMgr::LoadCreatureTemplateAddons()
}
if (!sEmotesStore.LookupEntry(creatureAddon.emote))
- sLog->outErrorDb("Creature (Entry: %u) has invalid emote (%u) defined in `creature_template_addon`.", entry, creatureAddon.emote);
+ {
+ sLog->outErrorDb("Creature (Entry: %u) has invalid emote (%u) defined in `creature_addon`.", entry, creatureAddon.emote);
+ creatureAddon.emote = 0;
+ }
++count;
}
@@ -793,6 +797,12 @@ void ObjectMgr::CheckCreatureTemplate(CreatureTemplate const* cInfo)
const_cast<CreatureTemplate*>(cInfo)->InhabitType = INHABIT_ANYWHERE;
}
+ if (cInfo->HoverHeight < 0.0f)
+ {
+ sLog->outErrorDb("Creature (Entry: %u) has wrong value (%f) in `HoverHeight`", cInfo->Entry, cInfo->HoverHeight);
+ const_cast<CreatureTemplate*>(cInfo)->HoverHeight = 1.0f;
+ }
+
if (cInfo->VehicleId)
{
VehicleEntry const* vehId = sVehicleStore.LookupEntry(cInfo->VehicleId);
@@ -862,7 +872,7 @@ void ObjectMgr::LoadCreatureAddons()
{
uint32 oldMSTime = getMSTime();
- // 0 1 2 3 4 5 6
+ // 0 1 2 3 4 5 6
QueryResult result = WorldDatabase.Query("SELECT guid, path_id, mount, bytes1, bytes2, emote, auras FROM creature_addon");
if (!result)
@@ -899,7 +909,7 @@ void ObjectMgr::LoadCreatureAddons()
creatureAddon.bytes1 = fields[3].GetUInt32();
creatureAddon.bytes2 = fields[4].GetUInt32();
creatureAddon.emote = fields[5].GetUInt32();
-
+
Tokens tokens(fields[6].GetString(), ' ');
uint8 i = 0;
creatureAddon.auras.resize(tokens.size());
@@ -914,7 +924,7 @@ void ObjectMgr::LoadCreatureAddons()
creatureAddon.auras[i++] = uint32(atol(*itr));
}
- if (creatureAddon.mount)
+ if (creatureAddon.mount)
{
if (!sCreatureDisplayInfoStore.LookupEntry(creatureAddon.mount))
{
@@ -924,7 +934,10 @@ void ObjectMgr::LoadCreatureAddons()
}
if (!sEmotesStore.LookupEntry(creatureAddon.emote))
+ {
sLog->outErrorDb("Creature (GUID: %u) has invalid emote (%u) defined in `creature_addon`.", guid, creatureAddon.emote);
+ creatureAddon.emote = 0;
+ }
++count;
}
diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp
index 7f27a474534..7403a86a47f 100755
--- a/src/server/game/Maps/Map.cpp
+++ b/src/server/game/Maps/Map.cpp
@@ -702,6 +702,12 @@ void Map::PlayerRelocation(Player* player, float x, float y, float z, float orie
Cell old_cell(player->GetPositionX(), player->GetPositionY());
Cell new_cell(x, y);
+ //! If hovering, always increase our server-side Z position
+ //! Client automatically projects correct position based on Z coord sent in monster move
+ //! and UNIT_FIELD_HOVERHEIGHT sent in object updates
+ if (player->HasUnitMovementFlag(MOVEMENTFLAG_HOVER))
+ z += player->GetFloatValue(UNIT_FIELD_HOVERHEIGHT);
+
player->Relocate(x, y, z, orientation);
if (player->IsVehicle())
player->GetVehicleKit()->RelocatePassengers(x, y, z, orientation);
@@ -731,6 +737,12 @@ void Map::CreatureRelocation(Creature* creature, float x, float y, float z, floa
if (!respawnRelocationOnFail && !getNGrid(new_cell.GridX(), new_cell.GridY()))
return;
+ //! If hovering, always increase our server-side Z position
+ //! Client automatically projects correct position based on Z coord sent in monster move
+ //! and UNIT_FIELD_HOVERHEIGHT sent in object updates
+ if (creature->HasUnitMovementFlag(MOVEMENTFLAG_HOVER))
+ z += creature->GetFloatValue(UNIT_FIELD_HOVERHEIGHT);
+
// delay creature move for grid/cell to grid/cell moves
if (old_cell.DiffCell(new_cell) || old_cell.DiffGrid(new_cell))
{
diff --git a/src/server/game/Movement/MovementGenerators/PointMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/PointMovementGenerator.cpp
index fddfe5f8fb0..91b50344ccb 100755
--- a/src/server/game/Movement/MovementGenerators/PointMovementGenerator.cpp
+++ b/src/server/game/Movement/MovementGenerators/PointMovementGenerator.cpp
@@ -57,7 +57,7 @@ bool PointMovementGenerator<T>::Update(T &unit, const uint32 & /*diff*/)
}
template<class T>
-void PointMovementGenerator<T>:: Finalize(T &unit)
+void PointMovementGenerator<T>::Finalize(T &unit)
{
unit.ClearUnitState(UNIT_STATE_ROAMING|UNIT_STATE_ROAMING_MOVE);
diff --git a/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp
index b65fa210723..e520253eb46 100755
--- a/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp
+++ b/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp
@@ -42,7 +42,7 @@ void RandomMovementGenerator<Creature>::_setRandomLocation(Creature& creature)
// For 2D/3D system selection
//bool is_land_ok = creature.CanWalk(); // not used?
//bool is_water_ok = creature.CanSwim(); // not used?
- bool is_air_ok = creature.canFly();
+ bool is_air_ok = creature.CanFly();
const float angle = float(rand_norm()) * static_cast<float>(M_PI*2.0f);
const float range = float(rand_norm()) * wander_distance;
diff --git a/src/server/game/Movement/Spline/MoveSplineInit.cpp b/src/server/game/Movement/Spline/MoveSplineInit.cpp
index b5ae923dc32..f5d2ae59329 100644
--- a/src/server/game/Movement/Spline/MoveSplineInit.cpp
+++ b/src/server/game/Movement/Spline/MoveSplineInit.cpp
@@ -100,7 +100,7 @@ namespace Movement
{
// mix existing state into new
args.flags.walkmode = unit.m_movementInfo.HasMovementFlag(MOVEMENTFLAG_WALKING);
- args.flags.flying = unit.m_movementInfo.HasMovementFlag((MovementFlags)(MOVEMENTFLAG_FLYING|MOVEMENTFLAG_LEVITATING));
+ args.flags.flying = unit.m_movementInfo.HasMovementFlag((MovementFlags)(MOVEMENTFLAG_CAN_FLY|MOVEMENTFLAG_DISABLE_GRAVITY));
}
void MoveSplineInit::SetFacing(const Unit * target)
diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp
index e5b5b20dcfa..c6ccfaa8004 100755
--- a/src/server/game/Server/Protocol/Opcodes.cpp
+++ b/src/server/game/Server/Protocol/Opcodes.cpp
@@ -270,10 +270,10 @@ OpcodeHandler opcodeTable[NUM_MSG_TYPES] =
/*0x0F1*/ { "MSG_MOVE_KNOCK_BACK", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL },
/*0x0F2*/ { "SMSG_MOVE_FEATHER_FALL", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide },
/*0x0F3*/ { "SMSG_MOVE_NORMAL_FALL", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide },
- /*0x0F4*/ { "SMSG_MOVE_SET_HOVER", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide },
- /*0x0F5*/ { "SMSG_MOVE_UNSET_HOVER", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide },
+ /*0x0F4*/ { "SMSG_MOVE_SET_HOVER", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL },
+ /*0x0F5*/ { "SMSG_MOVE_UNSET_HOVER", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL },
/*0x0F6*/ { "CMSG_MOVE_HOVER_ACK", STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleMoveHoverAck },
- /*0x0F7*/ { "MSG_MOVE_HOVER", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL },
+ /*0x0F7*/ { "MSG_MOVE_HOVER", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide },
/*0x0F8*/ { "CMSG_TRIGGER_CINEMATIC_CHEAT", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL },
/*0x0F9*/ { "CMSG_OPENING_CINEMATIC", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL },
/*0x0FA*/ { "SMSG_TRIGGER_CINEMATIC", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide },
diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
index 56bca65788c..387f76bbc7f 100755
--- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp
+++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
@@ -2845,7 +2845,7 @@ void AuraEffect::HandleAuraAllowFlight(AuraApplication const* aurApp, uint8 mode
}
if (target->GetTypeId() == TYPEID_UNIT)
- target->SetFlying(apply);
+ target->SetCanFly(apply);
if (Player* player = target->m_movedPlayer)
{
@@ -2856,7 +2856,7 @@ void AuraEffect::HandleAuraAllowFlight(AuraApplication const* aurApp, uint8 mode
else
data.Initialize(SMSG_MOVE_UNSET_CAN_FLY, 12);
data.append(target->GetPackGUID());
- data << uint32(0); // unk
+ data << uint32(0); // movement counter
player->SendDirectMessage(&data);
}
}
@@ -2875,14 +2875,16 @@ void AuraEffect::HandleAuraWaterWalk(AuraApplication const* aurApp, uint8 mode,
return;
}
- WorldPacket data;
if (apply)
- data.Initialize(SMSG_MOVE_WATER_WALK, 8+4);
+ {
+ target->AddUnitMovementFlag(MOVEMENTFLAG_WATERWALKING);
+ target->SendMovementWaterWalking();
+ }
else
- data.Initialize(SMSG_MOVE_LAND_WALK, 8+4);
- data.append(target->GetPackGUID());
- data << uint32(0);
- target->SendMessageToSet(&data, true);
+ {
+ target->RemoveUnitMovementFlag(MOVEMENTFLAG_WATERWALKING);
+ target->SendMovementFlagUpdate();
+ }
}
void AuraEffect::HandleAuraFeatherFall(AuraApplication const* aurApp, uint8 mode, bool apply) const
@@ -2899,14 +2901,16 @@ void AuraEffect::HandleAuraFeatherFall(AuraApplication const* aurApp, uint8 mode
return;
}
- WorldPacket data;
if (apply)
- data.Initialize(SMSG_MOVE_FEATHER_FALL, 8+4);
+ {
+ target->AddUnitMovementFlag(MOVEMENTFLAG_FALLING_SLOW);
+ target->SendMovementFeatherFall();
+ }
else
- data.Initialize(SMSG_MOVE_NORMAL_FALL, 8+4);
- data.append(target->GetPackGUID());
- data << uint32(0);
- target->SendMessageToSet(&data, true);
+ {
+ target->RemoveUnitMovementFlag(MOVEMENTFLAG_FALLING_SLOW);
+ target->SendMovementFlagUpdate();
+ }
// start fall from current height
if (!apply && target->GetTypeId() == TYPEID_PLAYER)
@@ -2927,14 +2931,11 @@ void AuraEffect::HandleAuraHover(AuraApplication const* aurApp, uint8 mode, bool
return;
}
- WorldPacket data;
+ target->SetHover(apply); //! Sets movementflags
if (apply)
- data.Initialize(SMSG_MOVE_SET_HOVER, 8+4);
+ target->SendMovementHover();
else
- data.Initialize(SMSG_MOVE_UNSET_HOVER, 8+4);
- data.append(target->GetPackGUID());
- data << uint32(0);
- target->SendMessageToSet(&data, true);
+ target->SendMovementFlagUpdate();
}
void AuraEffect::HandleWaterBreathing(AuraApplication const* aurApp, uint8 mode, bool /*apply*/) const
diff --git a/src/server/scripts/Commands/cs_reload.cpp b/src/server/scripts/Commands/cs_reload.cpp
index 28920f7c109..1520a944f6e 100644
--- a/src/server/scripts/Commands/cs_reload.cpp
+++ b/src/server/scripts/Commands/cs_reload.cpp
@@ -413,7 +413,7 @@ public:
for (Tokens::const_iterator itr = entries.begin(); itr != entries.end(); ++itr)
{
uint32 entry = uint32(atoi(*itr));
- QueryResult result = WorldDatabase.PQuery("SELECT difficulty_entry_1, difficulty_entry_2, difficulty_entry_3, KillCredit1, KillCredit2, modelid1, modelid2, modelid3, modelid4, name, subname, IconName, gossip_menu_id, minlevel, maxlevel, exp, faction_A, faction_H, npcflag, speed_walk, speed_run, scale, rank, mindmg, maxdmg, dmgschool, attackpower, dmg_multiplier, baseattacktime, rangeattacktime, unit_class, unit_flags, dynamicflags, family, trainer_type, trainer_spell, trainer_class, trainer_race, minrangedmg, maxrangedmg, rangedattackpower, type, type_flags, lootid, pickpocketloot, skinloot, resistance1, resistance2, resistance3, resistance4, resistance5, resistance6, spell1, spell2, spell3, spell4, spell5, spell6, spell7, spell8, PetSpellDataId, VehicleId, mingold, maxgold, AIName, MovementType, InhabitType, Health_mod, Mana_mod, Armor_mod, RacialLeader, questItem1, questItem2, questItem3, questItem4, questItem5, questItem6, movementId, RegenHealth, equipment_id, mechanic_immune_mask, flags_extra, ScriptName FROM creature_template WHERE entry = %u", entry);
+ QueryResult result = WorldDatabase.PQuery("SELECT difficulty_entry_1, difficulty_entry_2, difficulty_entry_3, KillCredit1, KillCredit2, modelid1, modelid2, modelid3, modelid4, name, subname, IconName, gossip_menu_id, minlevel, maxlevel, exp, faction_A, faction_H, npcflag, speed_walk, speed_run, scale, rank, mindmg, maxdmg, dmgschool, attackpower, dmg_multiplier, baseattacktime, rangeattacktime, unit_class, unit_flags, dynamicflags, family, trainer_type, trainer_spell, trainer_class, trainer_race, minrangedmg, maxrangedmg, rangedattackpower, type, type_flags, lootid, pickpocketloot, skinloot, resistance1, resistance2, resistance3, resistance4, resistance5, resistance6, spell1, spell2, spell3, spell4, spell5, spell6, spell7, spell8, PetSpellDataId, VehicleId, mingold, maxgold, AIName, MovementType, InhabitType, HoverHeight, Health_mod, Mana_mod, Armor_mod, RacialLeader, questItem1, questItem2, questItem3, questItem4, questItem5, questItem6, movementId, RegenHealth, equipment_id, mechanic_immune_mask, flags_extra, ScriptName FROM creature_template WHERE entry = %u", entry);
if (!result)
{
handler->PSendSysMessage(LANG_COMMAND_CREATURETEMPLATE_NOTFOUND, entry);
@@ -498,22 +498,23 @@ public:
const_cast<CreatureTemplate*>(cInfo)->AIName = fields[64].GetString();
const_cast<CreatureTemplate*>(cInfo)->MovementType = fields[65].GetUInt32();
const_cast<CreatureTemplate*>(cInfo)->InhabitType = fields[66].GetUInt32();
- const_cast<CreatureTemplate*>(cInfo)->ModHealth = fields[67].GetFloat();
- const_cast<CreatureTemplate*>(cInfo)->ModMana = fields[68].GetFloat();
- const_cast<CreatureTemplate*>(cInfo)->ModArmor = fields[69].GetFloat();
- const_cast<CreatureTemplate*>(cInfo)->RacialLeader = fields[70].GetBool();
- const_cast<CreatureTemplate*>(cInfo)->questItems[0] = fields[71].GetUInt32();
- const_cast<CreatureTemplate*>(cInfo)->questItems[1] = fields[72].GetUInt32();
- const_cast<CreatureTemplate*>(cInfo)->questItems[2] = fields[73].GetUInt32();
- const_cast<CreatureTemplate*>(cInfo)->questItems[3] = fields[74].GetUInt32();
- const_cast<CreatureTemplate*>(cInfo)->questItems[4] = fields[75].GetUInt32();
- const_cast<CreatureTemplate*>(cInfo)->questItems[5] = fields[76].GetUInt32();
- const_cast<CreatureTemplate*>(cInfo)->movementId = fields[77].GetUInt32();
- const_cast<CreatureTemplate*>(cInfo)->RegenHealth = fields[78].GetBool();
- const_cast<CreatureTemplate*>(cInfo)->equipmentId = fields[79].GetUInt32();
- const_cast<CreatureTemplate*>(cInfo)->MechanicImmuneMask = fields[80].GetUInt32();
- const_cast<CreatureTemplate*>(cInfo)->flags_extra = fields[81].GetUInt32();
- const_cast<CreatureTemplate*>(cInfo)->ScriptID = sObjectMgr->GetScriptId(fields[82].GetCString());
+ const_cast<CreatureTemplate*>(cInfo)->HoverHeight = fields[67].GetFloat();
+ const_cast<CreatureTemplate*>(cInfo)->ModHealth = fields[68].GetFloat();
+ const_cast<CreatureTemplate*>(cInfo)->ModMana = fields[69].GetFloat();
+ const_cast<CreatureTemplate*>(cInfo)->ModArmor = fields[70].GetFloat();
+ const_cast<CreatureTemplate*>(cInfo)->RacialLeader = fields[71].GetBool();
+ const_cast<CreatureTemplate*>(cInfo)->questItems[0] = fields[72].GetUInt32();
+ const_cast<CreatureTemplate*>(cInfo)->questItems[1] = fields[73].GetUInt32();
+ const_cast<CreatureTemplate*>(cInfo)->questItems[2] = fields[74].GetUInt32();
+ const_cast<CreatureTemplate*>(cInfo)->questItems[3] = fields[75].GetUInt32();
+ const_cast<CreatureTemplate*>(cInfo)->questItems[4] = fields[76].GetUInt32();
+ const_cast<CreatureTemplate*>(cInfo)->questItems[5] = fields[77].GetUInt32();
+ const_cast<CreatureTemplate*>(cInfo)->movementId = fields[78].GetUInt32();
+ const_cast<CreatureTemplate*>(cInfo)->RegenHealth = fields[79].GetBool();
+ const_cast<CreatureTemplate*>(cInfo)->equipmentId = fields[80].GetUInt32();
+ const_cast<CreatureTemplate*>(cInfo)->MechanicImmuneMask = fields[81].GetUInt32();
+ const_cast<CreatureTemplate*>(cInfo)->flags_extra = fields[82].GetUInt32();
+ const_cast<CreatureTemplate*>(cInfo)->ScriptID = sObjectMgr->GetScriptId(fields[83].GetCString());
sObjectMgr->CheckCreatureTemplate(cInfo);
}
diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp
index 2a8676d7915..0cf68852041 100644
--- a/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp
+++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp
@@ -121,7 +121,7 @@ public:
MovePhase = 0;
me->SetSpeed(MOVE_RUN, 2.0f);
- me->SetLevitate(true);
+ me->SetDisableGravity(true);
me->SetWalk(false);
me->setActive(true);
@@ -240,7 +240,7 @@ public:
me->InterruptSpell(CURRENT_GENERIC_SPELL);
me->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF);
- me->SetLevitate(true);
+ me->SetDisableGravity(true);
(*me).GetMotionMaster()->Clear(false);
(*me).GetMotionMaster()->MovePoint(0, IntroWay[2][0], IntroWay[2][1], IntroWay[2][2]);
diff --git a/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp
index b4345c61a77..fd5a77fb816 100644
--- a/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp
+++ b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp
@@ -527,7 +527,7 @@ public:
if (!Arcanagos)
return;
ArcanagosGUID = Arcanagos->GetGUID();
- Arcanagos->SetLevitate(true);
+ Arcanagos->SetDisableGravity(true);
(*Arcanagos).GetMotionMaster()->MovePoint(0, ArcanagosPos[0], ArcanagosPos[1], ArcanagosPos[2]);
Arcanagos->SetOrientation(ArcanagosPos[3]);
me->SetOrientation(MedivPos[3]);
diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp
index a46037f2662..0c1017edfdb 100644
--- a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp
+++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp
@@ -497,7 +497,7 @@ public:
void Reset()
{
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE + UNIT_FLAG_NON_ATTACKABLE);
- me->SetLevitate(true);
+ me->SetDisableGravity(true);
DoCast(me, SPELL_PHOENIX_BURN, true);
BurnTimer = 2000;
Death_Timer = 3000;
@@ -651,7 +651,7 @@ public:
ChangeTargetTimer = urand(6000, 12000);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- me->SetLevitate(true);
+ me->SetDisableGravity(true);
me->setFaction(14);
DoCast(me, SPELL_ARCANE_SPHERE_PASSIVE, true);
}
diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/the_scarlet_enclave.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/the_scarlet_enclave.cpp
index 4f4622b6d4a..bf09e008dff 100644
--- a/src/server/scripts/EasternKingdoms/ScarletEnclave/the_scarlet_enclave.cpp
+++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/the_scarlet_enclave.cpp
@@ -46,7 +46,7 @@ public:
me->setActive(true);
me->SetVisible(false);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
- me->SetFlying(true);
+ me->SetCanFly(true);
FlyBackTimer = 500;
phase = 0;
diff --git a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp
index 77099f2e2d7..b71f0ef8b9a 100644
--- a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp
+++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp
@@ -429,7 +429,7 @@ public:
{
me->SetVisible(false);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
- me->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT | MOVEMENTFLAG_LEVITATING);
+ me->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT | MOVEMENTFLAG_DISABLE_GRAVITY);
me->SetSpeed(MOVE_WALK, 5.0f, true);
wp_reached = false;
count = 0;
@@ -462,7 +462,7 @@ public:
instance->SetData(GAMEOBJECT_PUMPKIN_SHRINE, 0); //hide gameobject
break;
case 19:
- me->RemoveUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT | MOVEMENTFLAG_LEVITATING);
+ me->RemoveUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT | MOVEMENTFLAG_DISABLE_GRAVITY);
break;
case 20:
{
diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_brutallus.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_brutallus.cpp
index 78d00e19cdf..5089c3b8074 100644
--- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_brutallus.cpp
+++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_brutallus.cpp
@@ -216,7 +216,7 @@ public:
break;
case 3:
DoCast(me, SPELL_INTRO_FROST_BLAST);
- Madrigosa->SetLevitate(true);
+ Madrigosa->SetDisableGravity(true);
me->AttackStop();
Madrigosa->AttackStop();
IntroFrostBoltTimer = 3000;
diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp
index 0d98efd703b..b3ea89c1d66 100644
--- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp
+++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp
@@ -137,7 +137,7 @@ public:
uiFlightCount = 0;
- me->SetLevitate(true);
+ me->SetDisableGravity(true);
me->SetFloatValue(UNIT_FIELD_BOUNDINGRADIUS, 10);
me->SetFloatValue(UNIT_FIELD_COMBATREACH, 10);
@@ -254,7 +254,7 @@ public:
events.ScheduleEvent(EVENT_FLIGHT, 60000);
break;
case PHASE_FLIGHT:
- me->SetUnitMovementFlags(MOVEMENTFLAG_LEVITATING);
+ me->SetUnitMovementFlags(MOVEMENTFLAG_DISABLE_GRAVITY);
events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 1000);
uiFlightCount = 0;
uiBreathCount = 0;
@@ -391,7 +391,7 @@ public:
}
break;
case 10:
- me->SetLevitate(false);
+ me->SetDisableGravity(false);
me->HandleEmoteCommand(EMOTE_ONESHOT_LAND);
EnterPhase(PHASE_GROUND);
AttackStart(SelectTarget(SELECT_TARGET_TOPAGGRO));
diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp
index 1735c0c4f07..45153c21ea6 100644
--- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp
+++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp
@@ -159,7 +159,7 @@ public:
if (!bJustReset) //first reset at create
{
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE + UNIT_FLAG_NOT_SELECTABLE);
- me->SetLevitate(false);
+ me->SetDisableGravity(false);
me->SetVisible(true);
me->SetStandState(UNIT_STAND_STATE_SLEEP);
}
@@ -231,7 +231,7 @@ public:
if (ResetTimer <= diff)
{
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE);
- me->SetLevitate(false);
+ me->SetDisableGravity(false);
me->SetVisible(true);
me->SetStandState(UNIT_STAND_STATE_SLEEP);
ResetTimer = 10000;
@@ -400,7 +400,7 @@ public:
TalkTimer = 10000;
break;
case 3:
- me->SetLevitate(true);
+ me->SetDisableGravity(true);
me->GetMotionMaster()->MovePoint(0, FLY_X, FLY_Y, FLY_Z);
TalkTimer = 600000;
break;
@@ -418,7 +418,7 @@ public:
TalkTimer = 3000;
break;
case 2:
- me->SetLevitate(true);
+ me->SetDisableGravity(true);
me->GetMotionMaster()->MovePoint(0, FLY_X, FLY_Y, FLY_Z);
TalkTimer = 15000;
break;
diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp
index 02a8de14fdf..e9101d123dc 100644
--- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp
+++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp
@@ -264,7 +264,7 @@ public:
{
OrbsEmpowered = 0;
EmpowerCount = 0;
- me->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT | MOVEMENTFLAG_LEVITATING);
+ me->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT | MOVEMENTFLAG_DISABLE_GRAVITY);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
me->setActive(true);
@@ -451,7 +451,7 @@ public:
summoned->CastSpell(summoned, SPELL_SHADOW_CHANNELING, false);
break;
case CREATURE_ANVEENA:
- summoned->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT | MOVEMENTFLAG_LEVITATING);
+ summoned->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT | MOVEMENTFLAG_DISABLE_GRAVITY);
summoned->CastSpell(summoned, SPELL_ANVEENA_PRISON, true);
summoned->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
break;
@@ -1188,7 +1188,7 @@ public:
void Reset()
{
- me->SetLevitate(true);
+ me->SetDisableGravity(true);
bPointReached = true;
uiTimer = urand(500, 1000);
uiCheckTimer = 1000;
diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp
index eee6b08d834..df8d9bb83f8 100644
--- a/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp
@@ -324,14 +324,14 @@ class boss_akilzon : public CreatureScript
target->GetPosition(x, y, z);
if (target)
{
- target->SetUnitMovementFlags(MOVEMENTFLAG_LEVITATING);
+ target->SetUnitMovementFlags(MOVEMENTFLAG_DISABLE_GRAVITY);
target->MonsterMoveWithSpeed(x, y, me->GetPositionZ()+15, 0);
}
Unit* Cloud = me->SummonTrigger(x, y, me->GetPositionZ()+16, 0, 15000);
if (Cloud)
{
CloudGUID = Cloud->GetGUID();
- Cloud->SetUnitMovementFlags(MOVEMENTFLAG_LEVITATING);
+ Cloud->SetUnitMovementFlags(MOVEMENTFLAG_DISABLE_GRAVITY);
Cloud->StopMoving();
Cloud->SetFloatValue(OBJECT_FIELD_SCALE_X, 1.0f);
Cloud->setFaction(35);
@@ -409,7 +409,7 @@ class mob_akilzon_eagle : public CreatureScript
EagleSwoop_Timer = urand(5000, 10000);
arrived = true;
TargetGUID = 0;
- me->SetUnitMovementFlags(MOVEMENTFLAG_LEVITATING);
+ me->SetUnitMovementFlags(MOVEMENTFLAG_DISABLE_GRAVITY);
}
void EnterCombat(Unit* /*who*/) {DoZoneInCombat();}
diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp
index 8bbcdd6c036..8d29cfefc6e 100644
--- a/src/server/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp
@@ -632,7 +632,7 @@ class mob_janalai_hatchling : public CreatureScript
else
me->GetMotionMaster()->MovePoint(0, hatcherway[1][3][0]+rand()%4-2, 1150.0f+rand()%4-2, hatcherway[1][3][2]);
- me->SetUnitMovementFlags(MOVEMENTFLAG_LEVITATING);
+ me->SetUnitMovementFlags(MOVEMENTFLAG_DISABLE_GRAVITY);
}
void EnterCombat(Unit* /*who*/) {/*DoZoneInCombat();*/}
diff --git a/src/server/scripts/EasternKingdoms/undercity.cpp b/src/server/scripts/EasternKingdoms/undercity.cpp
index bf3d07ad5ae..3f088bf00b9 100644
--- a/src/server/scripts/EasternKingdoms/undercity.cpp
+++ b/src/server/scripts/EasternKingdoms/undercity.cpp
@@ -114,7 +114,7 @@ public:
summoned->CastSpell(target, SPELL_RIBBON_OF_SOULS, false);
}
- summoned->SetLevitate(true);
+ summoned->SetDisableGravity(true);
targetGUID = summoned->GetGUID();
}
}
@@ -184,7 +184,7 @@ public:
{
if (EventMove_Timer <= diff)
{
- me->SetLevitate(true);
+ me->SetDisableGravity(true);
me->MonsterMoveWithSpeed(me->GetPositionX(), me->GetPositionY(), HIGHBORNE_LOC_Y_NEW, me->GetDistance(me->GetPositionX(), me->GetPositionY(), HIGHBORNE_LOC_Y_NEW) / (5000 * 0.001f));
me->SetPosition(me->GetPositionX(), me->GetPositionY(), HIGHBORNE_LOC_Y_NEW, me->GetOrientation());
EventMove = false;
diff --git a/src/server/scripts/EasternKingdoms/western_plaguelands.cpp b/src/server/scripts/EasternKingdoms/western_plaguelands.cpp
index 07766455495..1a31c29f5bb 100644
--- a/src/server/scripts/EasternKingdoms/western_plaguelands.cpp
+++ b/src/server/scripts/EasternKingdoms/western_plaguelands.cpp
@@ -355,7 +355,7 @@ public:
break;
case 23:
Ughost = me->SummonCreature(NPC_GHOST_UTHER, 971.86f, -1825.42f, 81.99f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
- Ughost->SetLevitate(true);
+ Ughost->SetDisableGravity(true);
DoScriptText(SAY_WP_4, Ughost, me);
m_uiChatTimer = 4000;
break;
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp
index ecc6b865b3d..e1d7d97e0b8 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp
@@ -459,7 +459,7 @@ public:
{
trigger->SetVisible(false);
trigger->setFaction(me->getFaction());
- trigger->SetLevitate(true);
+ trigger->SetDisableGravity(true);
trigger->CastSpell(me, SPELL_METEOR, true);
}
me->GetMotionMaster()->Clear();
@@ -1176,7 +1176,7 @@ public:
{
FrostBreathTimer = 5000;
MoveTimer = 0;
- me->SetLevitate(true);
+ me->SetDisableGravity(true);
}
void WaypointReached(uint32 i)
@@ -1298,7 +1298,7 @@ public:
Zpos = 10.0f;
StrikeTimer = 2000+rand()%5000;
MoveTimer = 0;
- me->SetLevitate(true);
+ me->SetDisableGravity(true);
}
void WaypointReached(uint32 i)
diff --git a/src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp b/src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp
index 3b42fc3ed7b..3b3dfae92b2 100644
--- a/src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp
+++ b/src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp
@@ -261,7 +261,7 @@ public:
m_uiBellowingRoarTimer = 1000;
break;
case 10:
- me->SetFlying(true);
+ me->SetCanFly(true);
me->GetMotionMaster()->MovePoint(11, Phase2Location.GetPositionX(), Phase2Location.GetPositionY(), Phase2Location.GetPositionZ()+25);
me->SetSpeed(MOVE_FLIGHT, 1.0f);
DoScriptText(SAY_PHASE_2_TRANS, me);
@@ -414,7 +414,7 @@ public:
DoScriptText(SAY_PHASE_3_TRANS, me);
SetCombatMovement(true);
- me->SetFlying(false);
+ me->SetCanFly(false);
m_bIsMoving = false;
me->GetMotionMaster()->MovePoint(9, me->GetHomePosition());
return;
diff --git a/src/server/scripts/Kalimdor/silithus.cpp b/src/server/scripts/Kalimdor/silithus.cpp
index 2c21ac18752..2c498cfdc43 100644
--- a/src/server/scripts/Kalimdor/silithus.cpp
+++ b/src/server/scripts/Kalimdor/silithus.cpp
@@ -576,7 +576,7 @@ public:
break;
case 10:
Merithra->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF);
- Merithra->SetLevitate(true);
+ Merithra->SetDisableGravity(true);
Merithra->GetMotionMaster()->MoveCharge(-8065, 1530, 6.61f, 3);
break;
case 11:
@@ -603,7 +603,7 @@ public:
break;
case 18:
Arygos->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF);
- Arygos->SetLevitate(true);
+ Arygos->SetDisableGravity(true);
Arygos->GetMotionMaster()->MoveCharge(-8065, 1530, 6.61f, 42);
break;
case 19:
@@ -630,7 +630,7 @@ public:
break;
case 26:
Caelestrasz->HandleEmoteCommand(254);
- Caelestrasz->SetLevitate(true);
+ Caelestrasz->SetDisableGravity(true);
Caelestrasz->GetMotionMaster()->MoveCharge(-8065, 1530, 7.61f, 4);
break;
case 27:
@@ -769,7 +769,7 @@ public:
break;
case 63:
me->HandleEmoteCommand(254);
- me->SetLevitate(true);
+ me->SetDisableGravity(true);
break;
case 64:
me->GetMotionMaster()->MoveCharge(-8000, 1400, 150, 9);
diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp
index 636be5e29be..c756aa4f232 100644
--- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp
+++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp
@@ -349,6 +349,7 @@ public:
void Reset()
{
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ //! HACK: Creature's can't have MOVEMENTFLAG_FLYING
me->AddUnitMovementFlag(MOVEMENTFLAG_FLYING);
me->setFaction(16);
me->SetFloatValue(OBJECT_FIELD_SCALE_X, 1.0f);
diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_saviana_ragefire.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_saviana_ragefire.cpp
index 03a04648793..3407b42b2a7 100644
--- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_saviana_ragefire.cpp
+++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_saviana_ragefire.cpp
@@ -105,8 +105,8 @@ class boss_saviana_ragefire : public CreatureScript
Talk(SAY_CONFLAGRATION);
break;
case POINT_LAND:
- me->SetFlying(false);
- me->SetLevitate(false);
+ me->SetCanFly(false);
+ me->SetDisableGravity(false);
me->SetReactState(REACT_AGGRESSIVE);
if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() == POINT_MOTION_TYPE)
me->GetMotionMaster()->MovementExpired();
@@ -120,8 +120,8 @@ class boss_saviana_ragefire : public CreatureScript
void JustReachedHome()
{
_JustReachedHome();
- me->SetFlying(false);
- me->SetLevitate(false);
+ me->SetCanFly(false);
+ me->SetDisableGravity(false);
}
void KilledUnit(Unit* victim)
@@ -146,8 +146,8 @@ class boss_saviana_ragefire : public CreatureScript
{
case EVENT_FLIGHT:
{
- me->SetFlying(true);
- me->SetLevitate(true);
+ me->SetCanFly(true);
+ me->SetDisableGravity(true);
me->SetReactState(REACT_PASSIVE);
me->GetMotionMaster()->MovePoint(POINT_FLIGHT, SavianaRagefireFlyPos);
events.ScheduleEvent(EVENT_FLIGHT, 50000);
diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp
index 7dcdaa28879..b64e324d4da 100755
--- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp
@@ -571,7 +571,10 @@ class mob_frost_sphere : public CreatureScript
{
_isFalling = false;
me->SetReactState(REACT_PASSIVE);
- me->SetFlying(true);
+ //! Confirmed sniff 3.3.5.a
+ me->SetDisableGravity(true);
+ me->SetByteValue(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND | UNIT_BYTE1_FLAG_HOVER);
+ //! end
me->SetDisplayId(me->GetCreatureTemplate()->Modelid2);
me->SetSpeed(MOVE_RUN, 0.5f, false);
me->GetMotionMaster()->MoveRandom(20.0f);
diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp
index 0e604566276..3e2427d66b3 100755
--- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp
@@ -576,8 +576,8 @@ struct mob_unleashed_ballAI : public ScriptedAI
{
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_NOT_SELECTABLE);
me->SetReactState(REACT_PASSIVE);
- me->SetLevitate(true);
- me->SetFlying(true);
+ me->SetDisableGravity(true);
+ me->SetCanFly(true);
SetCombatMovement(false);
MoveToNextPoint();
m_uiRangeCheckTimer = IN_MILLISECONDS;
diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp
index 8e211cbd2cb..6520d58da20 100644
--- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp
@@ -347,7 +347,7 @@ class boss_krick : public CreatureScript
else
tyrannusPtr = me->SummonCreature(NPC_TYRANNUS_EVENTS, outroPos[1], TEMPSUMMON_MANUAL_DESPAWN);
- tyrannusPtr->SetFlying(true);
+ tyrannusPtr->SetCanFly(true);
me->GetMotionMaster()->MovePoint(POINT_KRICK_INTRO, outroPos[0].GetPositionX(), outroPos[0].GetPositionY(), outroPos[0].GetPositionZ());
tyrannusPtr->SetFacingToObject(me);
}
@@ -439,6 +439,7 @@ class boss_krick : public CreatureScript
_events.ScheduleEvent(EVENT_OUTRO_8, 5000);
break;
case EVENT_OUTRO_8:
+ //! HACK: Creature's can't have MOVEMENTFLAG_FLYING
me->AddUnitMovementFlag(MOVEMENTFLAG_FLYING);
me->GetMotionMaster()->MovePoint(0, outroPos[5]);
DoCast(me, SPELL_STRANGULATING);
@@ -453,6 +454,7 @@ class boss_krick : public CreatureScript
_events.ScheduleEvent(EVENT_OUTRO_10, 1000);
break;
case EVENT_OUTRO_10:
+ //! HACK: Creature's can't have MOVEMENTFLAG_FLYING
me->RemoveUnitMovementFlag(MOVEMENTFLAG_FLYING);
me->AddUnitMovementFlag(MOVEMENTFLAG_FALLING);
me->GetMotionMaster()->MovePoint(0, outroPos[6]);
diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp
index d6b2c2e3a97..88e9bedcd07 100644
--- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp
@@ -295,7 +295,7 @@ class boss_rimefang : public CreatureScript
_events.SetPhase(PHASE_NONE);
_currentWaypoint = 0;
_hoarfrostTargetGUID = 0;
- me->SetFlying(true);
+ me->SetCanFly(true);
me->SetReactState(REACT_PASSIVE);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
}
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp
index 8ee0ef02cbd..c557b6ad831 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp
@@ -1058,7 +1058,7 @@ class npc_blood_queen_lana_thel : public CreatureScript
void Reset()
{
_events.Reset();
- me->SetLevitate(true);
+ me->SetDisableGravity(true);
if (_instance->GetBossState(DATA_BLOOD_PRINCE_COUNCIL) == DONE)
{
me->SetVisible(false);
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp
index 5eeb941d9aa..784cda8f595 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp
@@ -198,8 +198,8 @@ class boss_blood_queen_lana_thel : public CreatureScript
if (Creature* minchar = me->FindNearestCreature(NPC_INFILTRATOR_MINCHAR_BQ, 200.0f))
{
minchar->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0);
- minchar->RemoveByteFlag(UNIT_FIELD_BYTES_1, 3, 0x01);
- minchar->SetFlying(false);
+ minchar->RemoveByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND);
+ minchar->SetCanFly(false);
minchar->SendMovementFlagUpdate();
minchar->RemoveAllAuras();
minchar->GetMotionMaster()->MoveCharge(4629.3711f, 2782.6089f, 401.5301f, SPEED_CHARGE/3.0f);
@@ -216,9 +216,9 @@ class boss_blood_queen_lana_thel : public CreatureScript
_killMinchar = true;
else
{
- me->SetLevitate(true);
- me->SetByteFlag(UNIT_FIELD_BYTES_1, 3, 0x01);
- me->SetFlying(true);
+ me->SetDisableGravity(true);
+ me->SetByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND);
+ me->SetCanFly(true);
me->SendMovementFlagUpdate();
me->GetMotionMaster()->MovePoint(POINT_MINCHAR, mincharPos);
}
@@ -230,9 +230,9 @@ class boss_blood_queen_lana_thel : public CreatureScript
if (_killMinchar)
{
_killMinchar = false;
- me->SetLevitate(true);
- me->SetByteFlag(UNIT_FIELD_BYTES_1, 3, 0x01);
- me->SetFlying(true);
+ me->SetDisableGravity(true);
+ me->SetByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND);
+ me->SetCanFly(true);
me->GetMotionMaster()->MovePoint(POINT_MINCHAR, mincharPos);
}
else
@@ -244,9 +244,9 @@ class boss_blood_queen_lana_thel : public CreatureScript
void JustReachedHome()
{
- me->SetLevitate(false);
- me->RemoveByteFlag(UNIT_FIELD_BYTES_1, 3, 0x01);
- me->SetFlying(false);
+ me->SetDisableGravity(false);
+ me->RemoveByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND);
+ me->SetCanFly(false);
me->SetReactState(REACT_AGGRESSIVE);
_JustReachedHome();
Talk(SAY_WIPE);
@@ -295,9 +295,9 @@ class boss_blood_queen_lana_thel : public CreatureScript
events.ScheduleEvent(EVENT_AIR_FLY_DOWN, 10000);
break;
case POINT_GROUND:
- me->SetLevitate(false);
- me->RemoveByteFlag(UNIT_FIELD_BYTES_1, 3, 0x01);
- me->SetFlying(false);
+ me->SetDisableGravity(false);
+ me->RemoveByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND);
+ me->SetCanFly(false);
me->SendMovementFlagUpdate();
me->SetReactState(REACT_AGGRESSIVE);
if (Unit* victim = me->SelectVictim())
@@ -372,7 +372,7 @@ class boss_blood_queen_lana_thel : public CreatureScript
break;
}
case EVENT_DELIRIOUS_SLASH:
- if (_offtank && !me->HasByteFlag(UNIT_FIELD_BYTES_1, 3, 0x03))
+ if (_offtank && !me->HasByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND | UNIT_BYTE1_FLAG_HOVER))
DoCast(_offtank, SPELL_DELIRIOUS_SLASH);
events.ScheduleEvent(EVENT_DELIRIOUS_SLASH, urand(20000, 24000), EVENT_GROUP_NORMAL);
break;
@@ -424,9 +424,9 @@ class boss_blood_queen_lana_thel : public CreatureScript
me->GetMotionMaster()->MovePoint(POINT_CENTER, centerPos);
break;
case EVENT_AIR_START_FLYING:
- me->SetLevitate(true);
- me->SetByteFlag(UNIT_FIELD_BYTES_1, 3, 0x01);
- me->SetFlying(true);
+ me->SetDisableGravity(true);
+ me->SetByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND);
+ me->SetCanFly(true);
me->SendMovementFlagUpdate();
me->GetMotionMaster()->MovePoint(POINT_AIR, airPos);
break;
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp
index 5177f65f670..e57fd7bbcb8 100755
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp
@@ -605,7 +605,7 @@ class npc_high_overlord_saurfang_icc : public CreatureScript
_events.ScheduleEvent(EVENT_OUTRO_HORDE_3, 18000); // say
_events.ScheduleEvent(EVENT_OUTRO_HORDE_4, 24000); // cast
_events.ScheduleEvent(EVENT_OUTRO_HORDE_5, 30000); // move
- me->SetLevitate(false);
+ me->SetDisableGravity(false);
me->SendMovementFlagUpdate();
me->Relocate(me->GetPositionX(), me->GetPositionY(), 539.2917f);
me->MonsterMoveWithSpeed(me->GetPositionX(), me->GetPositionY(), 539.2917f, 0.0f);
@@ -629,7 +629,7 @@ class npc_high_overlord_saurfang_icc : public CreatureScript
{
if (spell->Id == SPELL_GRIP_OF_AGONY)
{
- me->SetLevitate(true);
+ me->SetDisableGravity(true);
me->GetMotionMaster()->MovePoint(POINT_CHOKE, chokePos[0]);
}
}
@@ -812,7 +812,7 @@ class npc_muradin_bronzebeard_icc : public CreatureScript
{
me->RemoveAurasDueToSpell(SPELL_GRIP_OF_AGONY);
Talk(SAY_OUTRO_ALLIANCE_1);
- me->SetLevitate(false);
+ me->SetDisableGravity(false);
me->SendMovementFlagUpdate();
me->Relocate(me->GetPositionX(), me->GetPositionY(), 539.2917f);
me->MonsterMoveWithSpeed(me->GetPositionX(), me->GetPositionY(), 539.2917f, 0.0f);
@@ -832,7 +832,7 @@ class npc_muradin_bronzebeard_icc : public CreatureScript
{
if (spell->Id == SPELL_GRIP_OF_AGONY)
{
- me->SetLevitate(true);
+ me->SetDisableGravity(true);
me->GetMotionMaster()->MovePoint(POINT_CHOKE, chokePos[0]);
}
}
@@ -934,7 +934,7 @@ class npc_saurfang_event : public CreatureScript
{
if (spell->Id == SPELL_GRIP_OF_AGONY)
{
- me->SetLevitate(true);
+ me->SetDisableGravity(true);
me->GetMotionMaster()->MovePoint(POINT_CHOKE, chokePos[_index]);
}
}
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp
index 01879240e3a..649efc59681 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp
@@ -198,8 +198,8 @@ class boss_sindragosa : public CreatureScript
if (instance->GetData(DATA_SINDRAGOSA_FROSTWYRMS) != 255)
{
- me->SetFlying(true);
- me->SetLevitate(true);
+ me->SetCanFly(true);
+ me->SetDisableGravity(true);
}
}
@@ -228,8 +228,8 @@ class boss_sindragosa : public CreatureScript
{
BossAI::JustReachedHome();
instance->SetBossState(DATA_SINDRAGOSA, FAIL);
- me->SetFlying(false);
- me->SetLevitate(false);
+ me->SetCanFly(false);
+ me->SetDisableGravity(false);
}
void KilledUnit(Unit* victim)
@@ -275,8 +275,8 @@ class boss_sindragosa : public CreatureScript
{
case POINT_FROSTWYRM_LAND:
me->setActive(false);
- me->SetFlying(false);
- me->SetLevitate(false);
+ me->SetCanFly(false);
+ me->SetDisableGravity(false);
me->SetHomePosition(SindragosaLandPos);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
me->SetSpeed(MOVE_FLIGHT, 2.0f);
@@ -292,8 +292,8 @@ class boss_sindragosa : public CreatureScript
events.ScheduleEvent(EVENT_FROST_BOMB, 8000);
break;
case POINT_LAND:
- me->SetFlying(false);
- me->SetLevitate(false);
+ me->SetCanFly(false);
+ me->SetDisableGravity(false);
me->SetReactState(REACT_DEFENSIVE);
if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() == POINT_MOTION_TYPE)
me->GetMotionMaster()->MovementExpired();
@@ -425,8 +425,8 @@ class boss_sindragosa : public CreatureScript
{
_isInAirPhase = true;
Talk(SAY_AIR_PHASE);
- me->SetFlying(true);
- me->SetLevitate(true);
+ me->SetCanFly(true);
+ me->SetDisableGravity(true);
me->SetReactState(REACT_PASSIVE);
Position pos;
pos.Relocate(me);
@@ -617,8 +617,8 @@ class npc_spinestalker : public CreatureScript
if (_instance->GetData(DATA_SPINESTALKER) != 255)
{
- me->SetFlying(true);
- me->SetLevitate(true);
+ me->SetCanFly(true);
+ me->SetDisableGravity(true);
}
}
@@ -660,8 +660,8 @@ class npc_spinestalker : public CreatureScript
return;
me->setActive(false);
- me->SetFlying(false);
- me->SetLevitate(false);
+ me->SetCanFly(false);
+ me->SetDisableGravity(false);
me->SetHomePosition(SpinestalkerLandPos);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
}
@@ -742,8 +742,8 @@ class npc_rimefang : public CreatureScript
if (_instance->GetData(DATA_RIMEFANG) != 255)
{
- me->SetFlying(true);
- me->SetLevitate(true);
+ me->SetCanFly(true);
+ me->SetDisableGravity(true);
}
}
@@ -785,8 +785,8 @@ class npc_rimefang : public CreatureScript
return;
me->setActive(false);
- me->SetFlying(false);
- me->SetLevitate(false);
+ me->SetCanFly(false);
+ me->SetDisableGravity(false);
me->SetHomePosition(RimefangLandPos);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
}
@@ -819,7 +819,7 @@ class npc_rimefang : public CreatureScript
_icyBlastCounter = RAID_MODE<uint8>(5, 7, 6, 8);
me->SetReactState(REACT_PASSIVE);
me->AttackStop();
- me->SetFlying(true);
+ me->SetCanFly(true);
me->GetMotionMaster()->MovePoint(POINT_FROSTWYRM_FLY_IN, RimefangFlyPos);
float moveTime = me->GetExactDist(&RimefangFlyPos)/(me->GetSpeed(MOVE_FLIGHT)*0.001f);
_events.ScheduleEvent(EVENT_ICY_BLAST, uint64(moveTime) + urand(60000, 70000));
@@ -840,7 +840,7 @@ class npc_rimefang : public CreatureScript
{
me->SetReactState(REACT_DEFENSIVE);
AttackStart(victim);
- me->SetFlying(false);
+ me->SetCanFly(false);
}
break;
default:
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp
index 19a8e42e14b..554ac228be0 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp
@@ -500,8 +500,8 @@ class boss_the_lich_king : public CreatureScript
{
_JustDied();
DoCastAOE(SPELL_PLAY_MOVIE, false);
- me->SetLevitate(false);
- me->RemoveByteFlag(UNIT_FIELD_BYTES_1, 3, 0x03);
+ me->SetDisableGravity(false);
+ me->RemoveByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_UNK_3);
me->GetMotionMaster()->MoveFall();
}
@@ -1073,8 +1073,8 @@ class boss_the_lich_king : public CreatureScript
DoCastAOE(SPELL_SOUL_BARRAGE);
sCreatureTextMgr->SendSound(me, SOUND_PAIN, CHAT_MSG_MONSTER_YELL, 0, TEXT_RANGE_NORMAL, TEAM_OTHER, false);
// set flight
- me->SetLevitate(true);
- me->SetByteFlag(UNIT_FIELD_BYTES_1, 3, 0x03);
+ me->SetDisableGravity(true);
+ me->SetByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_UNK_3);
me->GetMotionMaster()->MovePoint(POINT_LK_OUTRO_2, OutroFlying);
break;
case EVENT_OUTRO_TALK_7:
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp
index 60e85165cd5..ef222963dfb 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp
@@ -796,7 +796,7 @@ class boss_sister_svalna : public CreatureScript
{
_JustReachedHome();
me->SetReactState(REACT_PASSIVE);
- me->SetFlying(false);
+ me->SetCanFly(false);
}
void DoAction(int32 const action)
@@ -844,7 +844,7 @@ class boss_sister_svalna : public CreatureScript
_isEventInProgress = false;
me->setActive(false);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC);
- me->SetFlying(false);
+ me->SetCanFly(false);
}
void SpellHitTarget(Unit* target, SpellInfo const* spell)
diff --git a/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp b/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp
index abd16cd9c93..e37ceb6925f 100644
--- a/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp
@@ -296,7 +296,7 @@ public:
{
case EVENT_LIFTOFF:
me->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF);
- me->SetLevitate(true);
+ me->SetDisableGravity(true);
me->SendMovementFlagUpdate();
events.ScheduleEvent(EVENT_ICEBOLT, 1500);
iceboltCount = RAID_MODE(2, 3);
@@ -340,7 +340,7 @@ public:
return;
case EVENT_LAND:
me->HandleEmoteCommand(EMOTE_ONESHOT_LAND);
- me->SetLevitate(false);
+ me->SetDisableGravity(false);
me->SendMovementFlagUpdate();
events.ScheduleEvent(EVENT_GROUND, 1500);
return;
diff --git a/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp
index e03440cec98..9e889bb9941 100644
--- a/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp
+++ b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp
@@ -240,7 +240,7 @@ public:
_cannotMove = true;
- me->SetFlying(true);
+ me->SetCanFly(true);
if (instance)
instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
@@ -271,7 +271,7 @@ public:
{
me->SetHomePosition(_homePosition);
- me->SetLevitate(true);
+ me->SetDisableGravity(true);
BossAI::EnterEvadeMode();
@@ -354,8 +354,8 @@ public:
{
_EnterCombat();
- me->SetLevitate(false);
- me->SetFlying(false);
+ me->SetDisableGravity(false);
+ me->SetCanFly(false);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
@@ -412,8 +412,8 @@ public:
void PrepareForVortex()
{
- me->SetLevitate(true);
- me->SetFlying(true);
+ me->SetDisableGravity(true);
+ me->SetCanFly(true);
me->GetMotionMaster()->MovementExpired();
me->GetMotionMaster()->MovePoint(MOVE_VORTEX, MalygosPositions[1].GetPositionX(), MalygosPositions[1].GetPositionY(), MalygosPositions[1].GetPositionZ());
@@ -461,8 +461,8 @@ public:
{
SetPhase(PHASE_TWO, true);
- me->SetLevitate(true);
- me->SetFlying(true);
+ me->SetDisableGravity(true);
+ me->SetCanFly(true);
me->GetMotionMaster()->MoveIdle();
me->GetMotionMaster()->MovePoint(MOVE_DEEP_BREATH_ROTATION, MalygosPhaseTwoWaypoints[0]);
@@ -704,8 +704,8 @@ class spell_malygos_vortex_visual : public SpellScriptLoader
// Anyway even with this issue, the boss does not enter in evade mode - this prevents iterate an empty list in the next vortex execution.
malygos->SetInCombatWithZone();
- malygos->SetLevitate(false);
- malygos->SetFlying(false);
+ malygos->SetDisableGravity(false);
+ malygos->SetCanFly(false);
malygos->GetMotionMaster()->MoveChase(caster->getVictim());
malygos->RemoveAura(SPELL_VORTEX_1);
diff --git a/src/server/scripts/Northrend/Nexus/Oculus/boss_urom.cpp b/src/server/scripts/Northrend/Nexus/Oculus/boss_urom.cpp
index 9671d59bcec..357b0bad13c 100644
--- a/src/server/scripts/Northrend/Nexus/Oculus/boss_urom.cpp
+++ b/src/server/scripts/Northrend/Nexus/Oculus/boss_urom.cpp
@@ -316,7 +316,9 @@ public:
LeaveCombat();
break;
case SPELL_TELEPORT:
- me->AddUnitMovementFlag(MOVEMENTFLAG_CAN_FLY); // with out it the npc will fall down while is casting
+ //! Unconfirmed, previous below
+ me->SetDisableGravity(true);
+ //me->AddUnitMovementFlag(MOVEMENTFLAG_CAN_FLY); // with out it the npc will fall down while is casting
canCast = true;
break;
default:
diff --git a/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp b/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp
index 187dbed6901..7ebaac1e938 100644
--- a/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp
+++ b/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp
@@ -170,6 +170,7 @@ class npc_azure_ring_captain : public CreatureScript
targetGUID = 0;
me->SetWalk(true);
+ //! HACK: Creature's can't have MOVEMENTFLAG_FLYING
me->AddUnitMovementFlag(MOVEMENTFLAG_FLYING);
me->SetReactState(REACT_AGGRESSIVE);
}
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_assembly_of_iron.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_assembly_of_iron.cpp
index 1671953aba1..f7c523d1521 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_assembly_of_iron.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_assembly_of_iron.cpp
@@ -575,7 +575,7 @@ class boss_stormcaller_brundir : public CreatureScript
_Reset();
phase = 0;
me->RemoveAllAuras();
- me->SetLevitate(false);
+ me->SetDisableGravity(false);
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_INTERRUPT, false); // Should be interruptable unless overridden by spell (Overload)
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_STUN, false); // Reset immumity, Brundir should be stunnable by default
RespawnEncounter(instance, me);
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp
index d245c77b9df..85b5c13c6ee 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp
@@ -330,7 +330,7 @@ class boss_razorscale : public CreatureScript
void Reset()
{
_Reset();
- me->SetFlying(true);
+ me->SetCanFly(true);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
me->SetReactState(REACT_PASSIVE);
PermaGround = false;
@@ -419,7 +419,7 @@ class boss_razorscale : public CreatureScript
case EVENT_FLIGHT:
phase = PHASE_FLIGHT;
events.SetPhase(PHASE_FLIGHT);
- me->SetFlying(true);
+ me->SetCanFly(true);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
me->SetReactState(REACT_PASSIVE);
me->AttackStop();
@@ -430,7 +430,7 @@ class boss_razorscale : public CreatureScript
++FlyCount;
return;
case EVENT_LAND:
- me->SetFlying(false);
+ me->SetCanFly(false);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED | UNIT_FLAG_PACIFIED);
if (Creature* commander = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(DATA_EXPEDITION_COMMANDER) : 0))
@@ -524,7 +524,7 @@ class boss_razorscale : public CreatureScript
me->MonsterTextEmote(EMOTE_PERMA, 0, true);
phase = PHASE_PERMAGROUND;
events.SetPhase(PHASE_PERMAGROUND);
- me->SetFlying(false);
+ me->SetCanFly(false);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
me->SetReactState(REACT_AGGRESSIVE);
me->RemoveAurasDueToSpell(SPELL_HARPOON_TRIGGER);
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp
index a11f88fc6af..7d37621e787 100644
--- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp
@@ -321,6 +321,7 @@ public:
void Reset()
{
+ //! HACK: Creature's can't have MOVEMENTFLAG_FLYING
me->AddUnitMovementFlag(MOVEMENTFLAG_FLYING | MOVEMENTFLAG_HOVER);
me->SetSpeed(MOVE_SWIM, 1.0f);
me->SetSpeed(MOVE_RUN, 1.0f);
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp
index 656b2931abb..d40dba22fcd 100644
--- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp
@@ -765,6 +765,7 @@ public:
{
currentPhase = PHASE_NONE;
SummonTimer = 5000;
+ //! HACK: Creature's can't have MOVEMENTFLAG_FLYING
me->AddUnitMovementFlag(MOVEMENTFLAG_FLYING);
me->RemoveAurasDueToSpell(SPELL_ORB_VISUAL);
me->SetSpeed(MOVE_FLIGHT, 0.5f);
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp
index dd3557071cd..5ce26ab1467 100644
--- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp
@@ -217,7 +217,7 @@ public:
void JustReachedHome()
{
- me->SetFlying(false);
+ me->SetCanFly(false);
me->Dismount();
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE);
if (Unit::GetCreature((*me), m_uiGraufGUID) == NULL)
@@ -284,7 +284,7 @@ public:
if (m_uiSpellHitCount >= 3)
{
Phase = SKADI;
- me->SetFlying(false);
+ me->SetCanFly(false);
me->Dismount();
if (Creature* pGrauf = me->SummonCreature(CREATURE_GRAUF, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 3*IN_MILLISECONDS))
{
@@ -328,7 +328,7 @@ public:
if (m_uiMountTimer && m_uiMountTimer <= diff)
{
me->Mount(DATA_MOUNT);
- me->SetFlying(true);
+ me->SetCanFly(true);
m_uiMountTimer = 0;
} else m_uiMountTimer -= diff;
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp
index a4289b2eb06..10dc8957d93 100644
--- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp
@@ -91,12 +91,6 @@ enum SvalaPhase
INTRO,
NORMAL,
SACRIFICING,
- SVALADEAD
-};
-
-enum SvalaPoint
-{
- POINT_FALL_GROUND = 1,
};
#define DATA_INCREDIBLE_HULK 2043
@@ -158,15 +152,11 @@ public:
summons.DespawnAll();
me->RemoveAllAuras();
- if (Phase > INTRO)
- {
- me->SetFlying(true);
- me->SetLevitate(true);
- }
-
if (Phase > NORMAL)
Phase = NORMAL;
+ me->SetDisableGravity(Phase == NORMAL);
+
introTimer = 1 * IN_MILLISECONDS;
introPhase = 0;
arthasGUID = 0;
@@ -178,17 +168,6 @@ public:
}
}
- void JustReachedHome()
- {
- if (Phase > INTRO)
- {
- me->SetFlying(false);
- me->SetLevitate(false);
- me->SetOrientation(1.58f);
- me->SendMovementFlagUpdate();
- }
- }
-
void EnterCombat(Unit* /*who*/)
{
Talk(SAY_AGGRO);
@@ -240,44 +219,13 @@ public:
Talk(SAY_SLAY);
}
- void DamageTaken(Unit* attacker, uint32 &damage)
- {
- if (Phase == SVALADEAD)
- {
- if (attacker != me)
- damage = 0;
- return;
- }
-
- if (damage >= me->GetHealth())
- {
- if (Phase == SACRIFICING)
- SetEquipmentSlots(false, EQUIP_UNEQUIP, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE);
-
- damage = 0;
- Phase = SVALADEAD;
- me->InterruptNonMeleeSpells(true);
- me->RemoveAllAuras();
- me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
- me->SetHealth(1);
-
- SetCombatMovement(false);
- me->HandleEmoteCommand(EMOTE_ONESHOT_FLYDEATH);
- me->GetMotionMaster()->MoveFall(POINT_FALL_GROUND);
- }
- }
-
- void MovementInform(uint32 motionType, uint32 pointId)
+ void JustDied(Unit* /*killer*/)
{
- if (motionType != EFFECT_MOTION_TYPE)
- return;
+ if (Phase == SACRIFICING)
+ SetEquipmentSlots(false, EQUIP_UNEQUIP, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE);
- if (pointId == POINT_FALL_GROUND)
- me->DealDamage(me, me->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
- }
+ me->HandleEmoteCommand(EMOTE_ONESHOT_FLYDEATH);
- void JustDied(Unit* /*killer*/)
- {
summons.DespawnAll();
if (instance)
@@ -325,8 +273,6 @@ public:
break;
case 2:
arthas->CastSpell(me, SPELL_TRANSFORMING_CHANNEL, false);
- me->SetFlying(true);
- me->SetLevitate(true);
pos.Relocate(me);
pos.m_positionZ += 8.0f;
me->GetMotionMaster()->MoveTakeoff(0, pos, 3.30078125f);
@@ -382,14 +328,13 @@ public:
introTimer = 13800;
break;
case 8:
- me->SetFlying(false);
- me->SetLevitate(false);
- me->SendMovementFlagUpdate();
pos.Relocate(me);
pos.m_positionX = me->GetHomePosition().GetPositionX();
pos.m_positionY = me->GetHomePosition().GetPositionY();
pos.m_positionZ = 90.6065f;
me->GetMotionMaster()->MoveLand(0, pos, 6.247422f);
+ me->SetDisableGravity(false, true);
+ me->SetHover(true);
++introPhase;
introTimer = 3000;
break;
@@ -403,7 +348,8 @@ public:
break;
}
}
- else introTimer -= diff;
+ else
+ introTimer -= diff;
return;
}
@@ -414,33 +360,29 @@ public:
if (!UpdateVictim())
return;
- if (me->IsWithinMeleeRange(me->getVictim()) && me->HasUnitMovementFlag(MOVEMENTFLAG_LEVITATING))
- {
- me->SetFlying(false);
- me->SetLevitate(false);
- me->SendMovementFlagUpdate();
- }
-
if (sinsterStrikeTimer <= diff)
{
DoCast(me->getVictim(), SPELL_SINSTER_STRIKE);
sinsterStrikeTimer = urand(5 * IN_MILLISECONDS, 9 * IN_MILLISECONDS);
- } else sinsterStrikeTimer -= diff;
+ }
+ else
+ sinsterStrikeTimer -= diff;
if (callFlamesTimer <= diff)
{
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true))
{
DoCast(target, SPELL_CALL_FLAMES);
callFlamesTimer = urand(10 * IN_MILLISECONDS, 20 * IN_MILLISECONDS);
}
- } else callFlamesTimer -= diff;
+ }
+ else callFlamesTimer -= diff;
if (!sacrificed)
{
if (HealthBelowPct(50))
{
- if (Unit* sacrificeTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 80, true))
+ if (Unit* sacrificeTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 80.0f, true))
{
if (instance)
instance->SetData64(DATA_SACRIFICED_PLAYER, sacrificeTarget->GetGUID());
@@ -450,8 +392,6 @@ public:
DoCast(sacrificeTarget, SPELL_RITUAL_PREPARATION);
SetCombatMovement(false);
- me->SetFlying(true);
- me->SetLevitate(true);
Phase = SACRIFICING;
sacrePhase = 0;
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp
index 35bbb98fd77..0d8e22ff630 100644
--- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp
@@ -218,7 +218,7 @@ public:
m_uiActivedCreatureGUID = temp->GetGUID();
temp->CastSpell(me, SPELL_CHANNEL_SPIRIT_TO_YMIRON, true);
temp->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
- temp->SetLevitate(true);
+ temp->SetDisableGravity(true);
switch (m_uiActiveOrder[m_uiActivedNumber])
{
case 0: m_bIsActiveWithBJORN = true; break;
diff --git a/src/server/scripts/Northrend/sholazar_basin.cpp b/src/server/scripts/Northrend/sholazar_basin.cpp
index f0445273d43..d43cf6fb98f 100644
--- a/src/server/scripts/Northrend/sholazar_basin.cpp
+++ b/src/server/scripts/Northrend/sholazar_basin.cpp
@@ -92,7 +92,7 @@ public:
me->RemoveUnitMovementFlag(MOVEMENTFLAG_SWIMMING);
me->RemoveUnitMovementFlag(MOVEMENTFLAG_JUMPING);
me->SetSpeed(MOVE_SWIM, 0.85f, true);
- me->AddUnitMovementFlag(MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_LEVITATING);
+ me->AddUnitMovementFlag(MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_DISABLE_GRAVITY);
break;
case 19:
me->SetUnitMovementFlags(MOVEMENTFLAG_JUMPING);
diff --git a/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_tailonking_ikiss.cpp b/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_tailonking_ikiss.cpp
index c3c53416a9b..51271cdfe42 100644
--- a/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_tailonking_ikiss.cpp
+++ b/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_tailonking_ikiss.cpp
@@ -101,7 +101,7 @@ public:
DoScriptText(SAY_INTRO, me);
}
- if (!me->canFly() && me->GetDistanceZ(who) > CREATURE_Z_ATTACK_RANGE)
+ if (!me->CanFly() && me->GetDistanceZ(who) > CREATURE_Z_ATTACK_RANGE)
return;
float attackRadius = me->GetAttackDistance(who);
diff --git a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp
index ace1a2ab717..93b687d3f3d 100644
--- a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp
+++ b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp
@@ -798,7 +798,7 @@ public:
{
case 1: // lift off
me->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF);
- me->SetUnitMovementFlags(MOVEMENTFLAG_LEVITATING);
+ me->SetUnitMovementFlags(MOVEMENTFLAG_DISABLE_GRAVITY);
me->StopMoving();
me->MonsterYell(SAY_TAKEOFF, LANG_UNIVERSAL, 0);
DoPlaySoundToSet(me, SOUND_TAKEOFF);
@@ -867,7 +867,7 @@ public:
Timer[EVENT_FLIGHT_SEQUENCE] = 2000;
break;
case 9: // land
- me->SetLevitate(false);
+ me->SetDisableGravity(false);
me->StopMoving();
me->HandleEmoteCommand(EMOTE_ONESHOT_LAND);
for (uint8 i = 0; i < 2; ++i)
@@ -1869,7 +1869,7 @@ void boss_illidan_stormrage::boss_illidan_stormrageAI::Reset()
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
SetEquipmentSlots(false, EQUIP_UNEQUIP, EQUIP_UNEQUIP, EQUIP_NO_CHANGE);
- me->SetLevitate(false);
+ me->SetDisableGravity(false);
me->setActive(false);
Summons.DespawnAll();
}
diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp
index fbafb9615f7..2df9e0e65ba 100644
--- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp
+++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp
@@ -731,7 +731,7 @@ public:
void Reset()
{
- me->SetLevitate(true);
+ me->SetDisableGravity(true);
me->setFaction(14);
MovementTimer = 0;
ToxicSporeTimer = 5000;
diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp
index 4af20d70816..41a8b12dd51 100644
--- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp
+++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp
@@ -109,7 +109,7 @@ public:
}
void Reset()
{
- me->AddUnitMovementFlag(MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_LEVITATING);
+ me->AddUnitMovementFlag(MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_DISABLE_GRAVITY);
SpoutAnimTimer = 1000;
RotTimer = 0;
WaterboltTimer = 15000; // give time to get in range when fight starts
diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/instance_serpent_shrine.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/instance_serpent_shrine.cpp
index 6c4019c7989..3ed3d1a82de 100644
--- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/instance_serpent_shrine.cpp
+++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/instance_serpent_shrine.cpp
@@ -153,7 +153,7 @@ class instance_serpent_shrine : public InstanceMapScript
if (Creature* frenzy = player->SummonCreature(MOB_COILFANG_FRENZY, player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), player->GetOrientation(), TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 2000))
{
frenzy->Attack(player, false);
- frenzy->AddUnitMovementFlag(MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_LEVITATING);
+ frenzy->AddUnitMovementFlag(MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_DISABLE_GRAVITY);
}
DoSpawnFrenzy = false;
}
diff --git a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp
index 4f422da35ad..66d445c1f39 100644
--- a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp
@@ -145,7 +145,7 @@ class boss_nazan : public CreatureScript
flight = false;
BellowingRoar_Timer = 6000;
ConeOfFire_Timer = 12000;
- me->SetLevitate(false);
+ me->SetDisableGravity(false);
me->SetWalk(true);
me->GetMotionMaster()->Clear();
if (Unit* victim = SelectTarget(SELECT_TARGET_NEAREST, 0))
@@ -374,7 +374,7 @@ class boss_vazruden_the_herald : public CreatureScript
if (summoned->GetEntry() == ENTRY_NAZAN)
{
CAST_AI(boss_nazan::boss_nazanAI, summoned->AI())->VazrudenGUID = VazrudenGUID;
- summoned->SetLevitate(true);
+ summoned->SetDisableGravity(true);
summoned->SetSpeed(MOVE_FLIGHT, 2.5f);
if (victim)
AttackStartNoMove(victim);
diff --git a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_watchkeeper_gargolmar.cpp b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_watchkeeper_gargolmar.cpp
index b2f8af2c80d..cc732b86ea4 100644
--- a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_watchkeeper_gargolmar.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_watchkeeper_gargolmar.cpp
@@ -87,7 +87,7 @@ class boss_watchkeeper_gargolmar : public CreatureScript
{
if (!me->getVictim() && me->canCreatureAttack(who))
{
- if (!me->canFly() && me->GetDistanceZ(who) > CREATURE_Z_ATTACK_RANGE)
+ if (!me->CanFly() && me->GetDistanceZ(who) > CREATURE_Z_ATTACK_RANGE)
return;
float attackRadius = me->GetAttackDistance(who);
diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp
index fcfe6c0ea16..97ac0b9da5e 100644
--- a/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp
+++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp
@@ -130,7 +130,7 @@ class boss_alar : public CreatureScript
//me->SetFloatValue(UNIT_FIELD_BOUNDINGRADIUS, 10);
//me->SetFloatValue(UNIT_FIELD_COMBATREACH, 10);
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FIRE, true);
- me->SetUnitMovementFlags(MOVEMENTFLAG_LEVITATING);
+ me->SetUnitMovementFlags(MOVEMENTFLAG_DISABLE_GRAVITY);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
me->setActive(false);
}
@@ -140,7 +140,7 @@ class boss_alar : public CreatureScript
if (instance)
instance->SetData(DATA_ALAREVENT, IN_PROGRESS);
- me->SetUnitMovementFlags(MOVEMENTFLAG_LEVITATING); // after enterevademode will be set walk movement
+ me->SetUnitMovementFlags(MOVEMENTFLAG_DISABLE_GRAVITY); // after enterevademode will be set walk movement
DoZoneInCombat();
me->setActive(true);
}
@@ -470,7 +470,7 @@ class mob_ember_of_alar : public CreatureScript
mob_ember_of_alarAI(Creature* creature) : ScriptedAI(creature)
{
instance = creature->GetInstanceScript();
- creature->SetUnitMovementFlags(MOVEMENTFLAG_LEVITATING);
+ creature->SetUnitMovementFlags(MOVEMENTFLAG_DISABLE_GRAVITY);
creature->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FIRE, true);
}
diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp
index 904b2851816..577c8bf9f54 100644
--- a/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp
+++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp
@@ -399,7 +399,7 @@ class boss_kaelthas : public CreatureScript
{
if (!me->HasUnitState(UNIT_STATE_STUNNED) && me->canCreatureAttack(who))
{
- if (!me->canFly() && me->GetDistanceZ(who) > CREATURE_Z_ATTACK_RANGE)
+ if (!me->CanFly() && me->GetDistanceZ(who) > CREATURE_Z_ATTACK_RANGE)
return;
float attackRadius = me->GetAttackDistance(who);
diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp
index db95f60f556..24ea29702f5 100644
--- a/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp
+++ b/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp
@@ -316,7 +316,7 @@ class npc_warden_mellichar : public CreatureScript
if (!me->getVictim() && me->canCreatureAttack(who))
{
- if (!me->canFly() && me->GetDistanceZ(who) > CREATURE_Z_ATTACK_RANGE)
+ if (!me->CanFly() && me->GetDistanceZ(who) > CREATURE_Z_ATTACK_RANGE)
return;
if (who->GetTypeId() != TYPEID_PLAYER)
return;
diff --git a/src/server/scripts/Outland/blades_edge_mountains.cpp b/src/server/scripts/Outland/blades_edge_mountains.cpp
index d5b08d83c71..f46f7f1d745 100644
--- a/src/server/scripts/Outland/blades_edge_mountains.cpp
+++ b/src/server/scripts/Outland/blades_edge_mountains.cpp
@@ -751,7 +751,7 @@ class npc_simon_bunny : public CreatureScript
// Used for getting involved player guid. Parameter id is used for defining if is a large(Monument) or small(Relic) node
void SetGUID(uint64 guid, int32 id)
{
- me->SetFlying(true);
+ me->SetCanFly(true);
large = (bool)id;
playerGUID = guid;
diff --git a/src/server/scripts/Outland/shadowmoon_valley.cpp b/src/server/scripts/Outland/shadowmoon_valley.cpp
index 79d284d779a..be0166b6d19 100644
--- a/src/server/scripts/Outland/shadowmoon_valley.cpp
+++ b/src/server/scripts/Outland/shadowmoon_valley.cpp
@@ -223,7 +223,7 @@ public:
me->setFaction(FACTION_DEFAULT);
FlyTimer = 10000;
- me->SetLevitate(false);
+ me->SetDisableGravity(false);
me->SetVisible(true);
}
@@ -270,7 +270,7 @@ public:
PlayerGUID = 0;
}
me->SetVisible(false);
- me->SetLevitate(false);
+ me->SetDisableGravity(false);
me->DealDamage(me, me->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
me->RemoveCorpse();
}
@@ -308,7 +308,7 @@ public:
pos.m_positionZ += 25;
}
- me->SetLevitate(true);
+ me->SetDisableGravity(true);
me->GetMotionMaster()->MovePoint(1, pos);
}
}
@@ -808,7 +808,7 @@ public:
case 19: DoScriptText(LORD_ILLIDAN_SAY_7, Illi); return 5000; break;
case 20:
Illi->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF);
- Illi->SetLevitate(true);
+ Illi->SetDisableGravity(true);
return 500; break;
case 21: DoScriptText(OVERLORD_SAY_5, me); return 500; break;
case 22:
diff --git a/src/server/scripts/World/npcs_special.cpp b/src/server/scripts/World/npcs_special.cpp
index b7aee4a3f07..67b04dab29d 100644
--- a/src/server/scripts/World/npcs_special.cpp
+++ b/src/server/scripts/World/npcs_special.cpp
@@ -421,7 +421,7 @@ public:
float x, y, z;
me->GetPosition(x, y, z);
me->Relocate(x, y, z + 0.94f);
- me->SetLevitate(true);
+ me->SetDisableGravity(true);
me->HandleEmoteCommand(EMOTE_ONESHOT_DANCE);
WorldPacket data; //send update position to client
me->BuildHeartBeatMsg(&data);
@@ -1937,6 +1937,7 @@ public:
me->CastSpell(me, 54661, true);
me->SetReactState(REACT_PASSIVE);
+ //! HACK: Creature's can't have MOVEMENTFLAG_FLYING
// Fly Away
me->AddUnitMovementFlag(MOVEMENTFLAG_CAN_FLY|MOVEMENTFLAG_ASCENDING|MOVEMENTFLAG_FLYING);
me->SetSpeed(MOVE_FLIGHT, 0.75f, true);