From 21a6a2638607ec4b7d8f4eb40911a22aca4034bc Mon Sep 17 00:00:00 2001 From: VladimirMangos Date: Thu, 25 Jun 2009 11:03:51 +0400 Subject: [PATCH] [8077] Resolve mixed store and use 2 different flags values types in single field. * Create new monster move field in Creature class and use it in all cases when expected use MONSTER_MOVE_* flags. * Store and use MOVEMENTFLAG_* values in field in MovementInfo structure of Player class. * Cleanups and fix related code. NOTE: DB in creature_addon store values similar MONSTER_MOVE_* flags, scritps also expected set only this flags. --- src/game/ConfusedMovementGenerator.cpp | 17 ++++--- src/game/Creature.cpp | 42 ++++++++++++++--- src/game/Creature.h | 12 ++++- src/game/FleeingMovementGenerator.cpp | 17 ++++--- src/game/HomeMovementGenerator.cpp | 4 +- src/game/Level3.cpp | 2 +- src/game/MiscHandler.cpp | 4 +- src/game/MovementHandler.cpp | 5 +- src/game/Object.cpp | 37 --------------- src/game/Object.h | 2 - src/game/Player.cpp | 22 +++++++-- src/game/Player.h | 46 ++++++++++++++++-- src/game/PointMovementGenerator.cpp | 2 +- src/game/RandomMovementGenerator.cpp | 23 +++++---- src/game/Spell.cpp | 4 +- src/game/SpellAuras.cpp | 10 ++-- src/game/TargetedMovementGenerator.cpp | 27 ++++++----- src/game/Traveller.h | 6 +-- src/game/Unit.cpp | 65 +++++++++++--------------- src/game/Unit.h | 51 ++------------------ src/game/WaypointMovementGenerator.cpp | 4 +- src/game/World.cpp | 4 +- src/game/WorldSession.cpp | 8 ++-- src/shared/revision_nr.h | 2 +- 24 files changed, 215 insertions(+), 201 deletions(-) diff --git a/src/game/ConfusedMovementGenerator.cpp b/src/game/ConfusedMovementGenerator.cpp index 2d46808c9..84ebdfc6b 100644 --- a/src/game/ConfusedMovementGenerator.cpp +++ b/src/game/ConfusedMovementGenerator.cpp @@ -64,7 +64,6 @@ ConfusedMovementGenerator::Initialize(T &unit) } unit.StopMoving(); - unit.RemoveUnitMovementFlag(MONSTER_MOVE_WALK); unit.addUnitState(UNIT_STAT_CONFUSED); } @@ -72,6 +71,8 @@ template<> void ConfusedMovementGenerator::_InitSpecific(Creature &creature, bool &is_water_ok, bool &is_land_ok) { + creature.RemoveMonsterMoveFlag(MONSTER_MOVE_WALK); + is_water_ok = creature.canSwim(); is_land_ok = creature.canWalk(); } @@ -138,17 +139,21 @@ ConfusedMovementGenerator::Update(T &unit, const uint32 &diff) return true; } -template -void -ConfusedMovementGenerator::Finalize(T &unit) +template<> +void ConfusedMovementGenerator::Finalize(Player &unit) { unit.clearUnitState(UNIT_STAT_CONFUSED); } +template<> +void ConfusedMovementGenerator::Finalize(Creature &unit) +{ + unit.clearUnitState(UNIT_STAT_CONFUSED); + unit.AddMonsterMoveFlag(MONSTER_MOVE_WALK); +} + template void ConfusedMovementGenerator::Initialize(Player &player); template void ConfusedMovementGenerator::Initialize(Creature &creature); -template void ConfusedMovementGenerator::Finalize(Player &player); -template void ConfusedMovementGenerator::Finalize(Creature &creature); template void ConfusedMovementGenerator::Reset(Player &player); template void ConfusedMovementGenerator::Reset(Creature &creature); template bool ConfusedMovementGenerator::Update(Player &player, const uint32 &diff); diff --git a/src/game/Creature.cpp b/src/game/Creature.cpp index e8b2a20d6..98e500d8e 100644 --- a/src/game/Creature.cpp +++ b/src/game/Creature.cpp @@ -109,9 +109,10 @@ lootForPickPocketed(false), lootForBody(false), m_groupLootTimer(0), lootingGrou m_lootMoney(0), m_lootRecipient(0), m_deathTimer(0), m_respawnTime(0), m_respawnDelay(25), m_corpseDelay(60), m_respawnradius(0.0f), m_gossipOptionLoaded(false), m_isPet(false), m_isVehicle(false), m_isTotem(false), -m_defaultMovementType(IDLE_MOTION_TYPE), m_DBTableGuid(0), m_equipmentId(0), m_AlreadyCallAssistance(false), +m_defaultMovementType(IDLE_MOTION_TYPE), m_DBTableGuid(0), m_equipmentId(0), +m_AlreadyCallAssistance(false), m_AlreadySearchedAssistance(false), m_regenHealth(true), m_AI_locked(false), m_isDeadByDefault(false), m_meleeDamageSchoolMask(SPELL_SCHOOL_MASK_NORMAL), -m_creatureInfo(NULL), m_isActiveObject(false), m_AlreadySearchedAssistance(false) +m_creatureInfo(NULL), m_isActiveObject(false), m_monsterMoveFlags(MONSTER_MOVE_WALK) { m_regenTimer = 200; m_valuesCount = UNIT_END; @@ -122,7 +123,8 @@ m_creatureInfo(NULL), m_isActiveObject(false), m_AlreadySearchedAssistance(false m_CreatureSpellCooldowns.clear(); m_CreatureCategoryCooldowns.clear(); m_GlobalCooldown = 0; - m_unit_movement_flags = MONSTER_MOVE_WALK; + + m_monsterMoveFlags = MONSTER_MOVE_WALK; } Creature::~Creature() @@ -1032,7 +1034,7 @@ void Creature::LoadGossipOptions() m_gossipOptionLoaded = true; } -void Creature::AI_SendMoveToPacket(float x, float y, float z, uint32 time, uint32 MovementFlags, uint8 type) +void Creature::AI_SendMoveToPacket(float x, float y, float z, uint32 time, MonsterMovementFlags flags, uint8 type) { /* uint32 timeElap = getMSTime(); if ((timeElap - m_startMove) < m_moveTime) @@ -1052,7 +1054,7 @@ void Creature::AI_SendMoveToPacket(float x, float y, float z, uint32 time, uint3 m_startMove = getMSTime(); m_moveTime = time;*/ - SendMonsterMove(x, y, z, type, MovementFlags, time); + SendMonsterMove(x, y, z, type, flags, time); } Player *Creature::GetLootRecipient() const @@ -1533,7 +1535,7 @@ void Creature::setDeathState(DeathState s) CreatureInfo const *cinfo = GetCreatureInfo(); SetUInt32Value(UNIT_DYNAMIC_FLAGS, 0); RemoveFlag (UNIT_FIELD_FLAGS, UNIT_FLAG_SKINNABLE); - AddUnitMovementFlag(MONSTER_MOVE_WALK); + AddMonsterMoveFlag(MONSTER_MOVE_WALK); SetUInt32Value(UNIT_NPC_FLAGS, cinfo->npcflag); clearUnitState(UNIT_STAT_ALL_STATE); i_motionMaster.Clear(); @@ -1938,7 +1940,7 @@ bool Creature::LoadCreaturesAddon(bool reload) SetUInt32Value(UNIT_NPC_EMOTESTATE, cainfo->emote); if (cainfo->move_flags != 0) - SetUnitMovementFlags(cainfo->move_flags); + SetMonsterMoveFlags(MonsterMovementFlags(cainfo->move_flags)); if(cainfo->auras) { @@ -2279,3 +2281,29 @@ void Creature::SetActiveObjectState( bool on ) if(world) map->Add(this); } + +void Creature::SendMonsterMoveWithSpeedToCurrentDestination(Player* player) +{ + float x, y, z; + if(GetMotionMaster()->GetDestination(x, y, z)) + SendMonsterMoveWithSpeed(x, y, z, 0, player); +} + +void Creature::SendMonsterMoveWithSpeed(float x, float y, float z, uint32 transitTime, Player* player) +{ + if (!transitTime) + { + if(GetTypeId()==TYPEID_PLAYER) + { + Traveller traveller(*(Player*)this); + transitTime = traveller.GetTotalTrevelTimeTo(x,y,z); + } + else + { + Traveller traveller(*(Creature*)this); + transitTime = traveller.GetTotalTrevelTimeTo(x,y,z); + } + } + //float orientation = (float)atan2((double)dy, (double)dx); + SendMonsterMove(x, y, z, 0, GetMonsterMoveFlags(), transitTime, player); +} diff --git a/src/game/Creature.h b/src/game/Creature.h index 01259c3ea..d2c548e3c 100644 --- a/src/game/Creature.h +++ b/src/game/Creature.h @@ -517,9 +517,18 @@ class MANGOS_DLL_SPEC Creature : public Unit bool AIM_Initialize(); - void AI_SendMoveToPacket(float x, float y, float z, uint32 time, uint32 MovementFlags, uint8 type); + void AI_SendMoveToPacket(float x, float y, float z, uint32 time, MonsterMovementFlags MovementFlags, uint8 type); CreatureAI* AI() { return i_AI; } + void AddMonsterMoveFlag(MonsterMovementFlags f) { m_monsterMoveFlags = MonsterMovementFlags(m_monsterMoveFlags | f); } + void RemoveMonsterMoveFlag(MonsterMovementFlags f) { m_monsterMoveFlags = MonsterMovementFlags(m_monsterMoveFlags & ~f); } + bool HasMonsterMoveFlag(MonsterMovementFlags f) const { return m_monsterMoveFlags & f; } + MonsterMovementFlags GetMonsterMoveFlags() const { return m_monsterMoveFlags; } + void SetMonsterMoveFlags(MonsterMovementFlags f) { m_monsterMoveFlags = f; } + + void SendMonsterMoveWithSpeed(float x, float y, float z, uint32 transitTime = 0, Player* player = NULL); + void SendMonsterMoveWithSpeedToCurrentDestination(Player* player = NULL); + uint32 GetShieldBlockValue() const //dunno mob block value { return (getLevel()/2 + uint32(GetStat(STAT_STRENGTH)/20)); @@ -725,6 +734,7 @@ class MANGOS_DLL_SPEC Creature : public Unit GridReference m_gridRef; CreatureInfo const* m_creatureInfo; // in heroic mode can different from ObjMgr::GetCreatureTemplate(GetEntry()) bool m_isActiveObject; + MonsterMovementFlags m_monsterMoveFlags; }; class AssistDelayEvent : public BasicEvent diff --git a/src/game/FleeingMovementGenerator.cpp b/src/game/FleeingMovementGenerator.cpp index f8f193ac9..a74790d9a 100644 --- a/src/game/FleeingMovementGenerator.cpp +++ b/src/game/FleeingMovementGenerator.cpp @@ -285,7 +285,6 @@ FleeingMovementGenerator::Initialize(T &owner) return; _Init(owner); - owner.RemoveUnitMovementFlag(MONSTER_MOVE_WALK); if(Unit * fright = ObjectAccessor::GetUnit(owner, i_frightGUID)) { @@ -313,6 +312,8 @@ FleeingMovementGenerator::_Init(Creature &owner) { if(!&owner) return; + + owner.RemoveMonsterMoveFlag(MONSTER_MOVE_WALK); owner.SetUInt64Value(UNIT_FIELD_TARGET, 0); is_water_ok = owner.canSwim(); is_land_ok = owner.canWalk(); @@ -326,13 +327,19 @@ FleeingMovementGenerator::_Init(Player &) is_land_ok = true; } -template -void -FleeingMovementGenerator::Finalize(T &owner) +template<> +void FleeingMovementGenerator::Finalize(Player &owner) { owner.clearUnitState(UNIT_STAT_FLEEING); } +template<> +void FleeingMovementGenerator::Finalize(Creature &owner) +{ + owner.AddMonsterMoveFlag(MONSTER_MOVE_WALK); + owner.clearUnitState(UNIT_STAT_FLEEING); +} + template void FleeingMovementGenerator::Reset(T &owner) @@ -379,8 +386,6 @@ template bool FleeingMovementGenerator::_getPoint(Player &, float &, flo template bool FleeingMovementGenerator::_getPoint(Creature &, float &, float &, float &); template void FleeingMovementGenerator::_setTargetLocation(Player &); template void FleeingMovementGenerator::_setTargetLocation(Creature &); -template void FleeingMovementGenerator::Finalize(Player &); -template void FleeingMovementGenerator::Finalize(Creature &); template void FleeingMovementGenerator::Reset(Player &); template void FleeingMovementGenerator::Reset(Creature &); template bool FleeingMovementGenerator::Update(Player &, const uint32 &); diff --git a/src/game/HomeMovementGenerator.cpp b/src/game/HomeMovementGenerator.cpp index 5dfbc8345..cc13446f0 100644 --- a/src/game/HomeMovementGenerator.cpp +++ b/src/game/HomeMovementGenerator.cpp @@ -27,7 +27,7 @@ void HomeMovementGenerator::Initialize(Creature & owner) { - owner.RemoveUnitMovementFlag(MONSTER_MOVE_WALK); + owner.RemoveMonsterMoveFlag(MONSTER_MOVE_WALK); _setTargetLocation(owner); } @@ -63,7 +63,7 @@ HomeMovementGenerator::Update(Creature &owner, const uint32& time_diff if (time_diff > i_travel_timer) { - owner.AddUnitMovementFlag(MONSTER_MOVE_WALK); + owner.AddMonsterMoveFlag(MONSTER_MOVE_WALK); // restore orientation of not moving creature at returning to home if(owner.GetDefaultMovementType()==IDLE_MOTION_TYPE) diff --git a/src/game/Level3.cpp b/src/game/Level3.cpp index 818864a51..f63f0077b 100644 --- a/src/game/Level3.cpp +++ b/src/game/Level3.cpp @@ -6057,7 +6057,7 @@ bool ChatHandler::HandleComeToMeCommand(const char *args) uint32 newFlags = atoi(newFlagStr); - caster->SetUnitMovementFlags(newFlags); + caster->SetMonsterMoveFlags(MonsterMovementFlags(newFlags)); Player* pl = m_session->GetPlayer(); diff --git a/src/game/MiscHandler.cpp b/src/game/MiscHandler.cpp index 95730eb6a..c727e292f 100644 --- a/src/game/MiscHandler.cpp +++ b/src/game/MiscHandler.cpp @@ -276,7 +276,7 @@ void WorldSession::HandleLogoutRequestOpcode( WorldPacket & /*recv_data*/ ) if( GetPlayer()->isInCombat() || //...is in combat GetPlayer()->duel || //...is in Duel //...is jumping ...is falling - GetPlayer()->m_movementInfo.HasMovementFlag(MOVEMENTFLAG_JUMPING | MOVEMENTFLAG_FALLING)) + GetPlayer()->m_movementInfo.HasMovementFlag(MovementFlags(MOVEMENTFLAG_JUMPING | MOVEMENTFLAG_FALLING))) { WorldPacket data( SMSG_LOGOUT_RESPONSE, (2+4) ) ; data << (uint8)0xC; @@ -1542,7 +1542,7 @@ void WorldSession::HandleMoveSetCanFlyAckOpcode( WorldPacket & recv_data ) recv_data >> guid >> unk >> flags; - _player->m_movementInfo.flags = flags; + _player->m_movementInfo.SetMovementFlags(MovementFlags(flags)); } void WorldSession::HandleRequestPetInfoOpcode( WorldPacket & /*recv_data */) diff --git a/src/game/MovementHandler.cpp b/src/game/MovementHandler.cpp index ef6e0a136..fd38c76bb 100644 --- a/src/game/MovementHandler.cpp +++ b/src/game/MovementHandler.cpp @@ -230,7 +230,7 @@ void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data ) return; /* handle special cases */ - if (movementInfo.flags & MOVEMENTFLAG_ONTRANSPORT) + if (movementInfo.HasMovementFlag(MOVEMENTFLAG_ONTRANSPORT)) { // transports size limited // (also received at zeppelin leave by some reason with t_* as absolute in continent coordinates, can be safely skipped) @@ -272,7 +272,7 @@ void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data ) if (opcode == MSG_MOVE_FALL_LAND && plMover && !plMover->isInFlight()) plMover->HandleFall(movementInfo); - if (plMover && ((movementInfo.flags & MOVEMENTFLAG_SWIMMING) != 0) != plMover->IsInWater()) + if (plMover && (movementInfo.HasMovementFlag(MOVEMENTFLAG_SWIMMING) != plMover->IsInWater())) { // now client not include swimming flag in case jumping under water plMover->SetInWater( !plMover->IsInWater() || plMover->GetBaseMap()->IsUnderWater(movementInfo.x, movementInfo.y, movementInfo.z) ); @@ -331,7 +331,6 @@ void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data ) { if(Map *map = mover->GetMap()) map->CreatureRelocation((Creature*)mover, movementInfo.x, movementInfo.y, movementInfo.z, movementInfo.o); - mover->SetUnitMovementFlags(movementInfo.flags); } } diff --git a/src/game/Object.cpp b/src/game/Object.cpp index 4f16c3dbd..560d607c0 100644 --- a/src/game/Object.cpp +++ b/src/game/Object.cpp @@ -1511,43 +1511,6 @@ void WorldObject::BuildMonsterChat(WorldPacket *data, uint8 msgtype, char const* *data << (uint8)0; // ChatTag } -void WorldObject::BuildHeartBeatMsg(WorldPacket *data) const -{ - //Heartbeat message cannot be used for non-units - if (!isType(TYPEMASK_UNIT)) - return; - - data->Initialize(MSG_MOVE_HEARTBEAT, 32); - data->append(GetPackGUID()); - *data << uint32(((Unit*)this)->GetUnitMovementFlags()); // movement flags - *data << uint16(0); // 2.3.0 - *data << uint32(getMSTime()); // time - *data << m_positionX; - *data << m_positionY; - *data << m_positionZ; - *data << m_orientation; - *data << uint32(0); -} - -void WorldObject::BuildTeleportAckMsg(WorldPacket *data, float x, float y, float z, float ang) const -{ - //TeleportAck message cannot be used for non-units - if (!isType(TYPEMASK_UNIT)) - return; - - data->Initialize(MSG_MOVE_TELEPORT_ACK, 41); - data->append(GetPackGUID()); - *data << uint32(0); // this value increments every time - *data << uint32(((Unit*)this)->GetUnitMovementFlags()); // movement flags - *data << uint16(0); // 2.3.0 - *data << uint32(getMSTime()); // time - *data << x; - *data << y; - *data << z; - *data << ang; - *data << uint32(0); -} - void WorldObject::SendMessageToSet(WorldPacket *data, bool /*bToSelf*/) { //if object is in world, map for it already created! diff --git a/src/game/Object.h b/src/game/Object.h index 9e4ff7cf6..9e1cdcdd1 100644 --- a/src/game/Object.h +++ b/src/game/Object.h @@ -449,8 +449,6 @@ class MANGOS_DLL_SPEC WorldObject : public Object virtual void SendMessageToSet(WorldPacket *data, bool self); virtual void SendMessageToSetInRange(WorldPacket *data, float dist, bool self); - void BuildHeartBeatMsg( WorldPacket *data ) const; - void BuildTeleportAckMsg( WorldPacket *data, float x, float y, float z, float ang) const; void MonsterSay(const char* text, uint32 language, uint64 TargetGuid); void MonsterYell(const char* text, uint32 language, uint64 TargetGuid); diff --git a/src/game/Player.cpp b/src/game/Player.cpp index 673ead2c7..22e94d137 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -449,9 +449,6 @@ Player::Player (WorldSession *session): Unit(), m_achievementMgr(this), m_reputa m_summon_y = 0.0f; m_summon_z = 0.0f; - //Default movement to run mode - m_unit_movement_flags = 0; - m_mover = this; m_miniPet = 0; @@ -1623,7 +1620,7 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati } // reset movement flags at teleport, because player will continue move with these flags after teleport - m_movementInfo.flags = 0; + m_movementInfo.SetMovementFlags(MOVEMENTFLAG_NONE); if ((GetMapId() == mapid) && (!m_transport)) { @@ -17970,7 +17967,7 @@ void Player::SendInitialPacketsBeforeAddToMap() // set fly flag if in fly form or taxi flight to prevent visually drop at ground in showup moment if(HasAuraType(SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED) || isInFlight()) - m_movementInfo.flags |= MOVEMENTFLAG_FLYING2; + m_movementInfo.AddMovementFlag(MOVEMENTFLAG_FLYING2); m_mover = this; } @@ -20321,3 +20318,18 @@ void Player::SendClearCooldown( uint32 spell_id, Unit* target ) data << uint64(target->GetGUID()); SendDirectMessage(&data); } + +void Player::BuildTeleportAckMsg( WorldPacket *data, float x, float y, float z, float ang ) const +{ + data->Initialize(MSG_MOVE_TELEPORT_ACK, 41); + data->append(GetPackGUID()); + *data << uint32(0); // this value increments every time + *data << uint32(m_movementInfo.GetMovementFlags()); // movement flags + *data << uint16(0); // 2.3.0 + *data << uint32(getMSTime()); // time + *data << x; + *data << y; + *data << z; + *data << ang; + *data << uint32(0); +} \ No newline at end of file diff --git a/src/game/Player.h b/src/game/Player.h index 836eccb8b..af441a59f 100644 --- a/src/game/Player.h +++ b/src/game/Player.h @@ -687,10 +687,42 @@ enum InstanceResetWarningType RAID_INSTANCE_EXPIRED = 5 }; +// used in most movement packets (send and received) +enum MovementFlags +{ + MOVEMENTFLAG_NONE = 0x00000000, + MOVEMENTFLAG_FORWARD = 0x00000001, + MOVEMENTFLAG_BACKWARD = 0x00000002, + MOVEMENTFLAG_STRAFE_LEFT = 0x00000004, + MOVEMENTFLAG_STRAFE_RIGHT = 0x00000008, + MOVEMENTFLAG_LEFT = 0x00000010, + MOVEMENTFLAG_RIGHT = 0x00000020, + MOVEMENTFLAG_PITCH_UP = 0x00000040, + MOVEMENTFLAG_PITCH_DOWN = 0x00000080, + MOVEMENTFLAG_WALK_MODE = 0x00000100, // Walking + MOVEMENTFLAG_ONTRANSPORT = 0x00000200, // Used for flying on some creatures + MOVEMENTFLAG_LEVITATING = 0x00000400, + MOVEMENTFLAG_FLY_UNK1 = 0x00000800, + MOVEMENTFLAG_JUMPING = 0x00001000, + MOVEMENTFLAG_UNK4 = 0x00002000, + MOVEMENTFLAG_FALLING = 0x00004000, + // 0x8000, 0x10000, 0x20000, 0x40000, 0x80000, 0x100000 + MOVEMENTFLAG_SWIMMING = 0x00200000, // appears with fly flag also + MOVEMENTFLAG_FLY_UP = 0x00400000, + MOVEMENTFLAG_CAN_FLY = 0x00800000, + MOVEMENTFLAG_FLYING = 0x01000000, + MOVEMENTFLAG_FLYING2 = 0x02000000, // Actual flying mode + MOVEMENTFLAG_SPLINE = 0x04000000, // used for flight paths + MOVEMENTFLAG_SPLINE2 = 0x08000000, // used for flight paths + MOVEMENTFLAG_WATERWALKING = 0x10000000, // prevent unit from falling through water + MOVEMENTFLAG_SAFE_FALL = 0x20000000, // active rogue safe fall spell (passive) + MOVEMENTFLAG_UNK3 = 0x40000000 +}; + struct MovementInfo { // common - uint32 flags; + uint32 flags; // see enum MovementFlags uint16 unk1; uint32 time; float x, y, z, o; @@ -710,16 +742,18 @@ struct MovementInfo MovementInfo() { - flags = 0; + flags = MOVEMENTFLAG_NONE; time = t_time = fallTime = 0; unk1 = 0; x = y = z = o = t_x = t_y = t_z = t_o = s_pitch = j_unk = j_sinAngle = j_cosAngle = j_xyspeed = u_unk1 = 0.0f; t_guid = 0; } - uint32 GetMovementFlags() { return flags; } - void AddMovementFlag(uint32 flag) { flags |= flag; } - bool HasMovementFlag(uint32 flag) const { return flags & flag; } + void AddMovementFlag(MovementFlags f) { flags |= f; } + void RemoveMovementFlag(MovementFlags f) { flags &= ~f; } + bool HasMovementFlag(MovementFlags f) const { return flags & f; } + MovementFlags GetMovementFlags() const { return MovementFlags(flags); } + void SetMovementFlags(MovementFlags f) { flags = f; } }; // flags that use in movement check for example at spell casting @@ -1945,6 +1979,8 @@ class MANGOS_DLL_SPEC Player : public Unit } void HandleFall(MovementInfo const& movementInfo); + void BuildTeleportAckMsg( WorldPacket *data, float x, float y, float z, float ang) const; + bool isMoving() const { return m_movementInfo.HasMovementFlag(movementFlagsMask); } bool isMovingOrTurning() const { return m_movementInfo.HasMovementFlag(movementOrTurningFlagsMask); } diff --git a/src/game/PointMovementGenerator.cpp b/src/game/PointMovementGenerator.cpp index 57d6f058b..19f596dd2 100644 --- a/src/game/PointMovementGenerator.cpp +++ b/src/game/PointMovementGenerator.cpp @@ -33,7 +33,7 @@ void PointMovementGenerator::Initialize(T &unit) i_destinationHolder.SetDestination(traveller,i_x,i_y,i_z); if (unit.GetTypeId() == TYPEID_UNIT && ((Creature*)&unit)->canFly()) - unit.AddUnitMovementFlag(MONSTER_MOVE_FLY); + ((Creature&)unit).AddMonsterMoveFlag(MONSTER_MOVE_FLY); } template diff --git a/src/game/RandomMovementGenerator.cpp b/src/game/RandomMovementGenerator.cpp index fcd9f7fc7..5cb713cbc 100644 --- a/src/game/RandomMovementGenerator.cpp +++ b/src/game/RandomMovementGenerator.cpp @@ -90,13 +90,13 @@ RandomMovementGenerator::_setRandomLocation(Creature &creature) if (is_air_ok) { i_nextMoveTime.Reset(i_destinationHolder.GetTotalTravelTime()); - creature.AddUnitMovementFlag(MONSTER_MOVE_FLY); + creature.AddMonsterMoveFlag(MONSTER_MOVE_FLY); } //else if (is_water_ok) // Swimming mode to be done with more than this check else { i_nextMoveTime.Reset(urand(500+i_destinationHolder.GetTotalTravelTime(),5000+i_destinationHolder.GetTotalTravelTime())); - creature.SetUnitMovementFlags(MONSTER_MOVE_WALK); + creature.AddMonsterMoveFlag(MONSTER_MOVE_WALK); } } @@ -108,9 +108,13 @@ RandomMovementGenerator::Initialize(Creature &creature) return; if (creature.canFly()) - creature.AddUnitMovementFlag(MONSTER_MOVE_FLY); + creature.AddMonsterMoveFlag(MONSTER_MOVE_FLY); + + else if(irand(0,RUNNING_CHANCE_RANDOMMV) > 0) + creature.AddMonsterMoveFlag(MONSTER_MOVE_WALK); else - creature.SetUnitMovementFlags(irand(0,RUNNING_CHANCE_RANDOMMV) > 0 ? MONSTER_MOVE_WALK : MONSTER_MOVE_NONE); + creature.RemoveMonsterMoveFlag(MONSTER_MOVE_WALK); // run with 1/RUNNING_CHANCE_RANDOMMV chance + _setRandomLocation(creature); } @@ -147,14 +151,17 @@ RandomMovementGenerator::Update(Creature &creature, const uint32 &diff if(i_nextMoveTime.Passed()) { if (creature.canFly()) - creature.AddUnitMovementFlag(MONSTER_MOVE_FLY); - else - creature.SetUnitMovementFlags(irand(0,RUNNING_CHANCE_RANDOMMV) > 0 ? MONSTER_MOVE_WALK : MONSTER_MOVE_NONE); + creature.AddMonsterMoveFlag(MONSTER_MOVE_FLY); + else if(irand(0,RUNNING_CHANCE_RANDOMMV) > 0) + creature.AddMonsterMoveFlag(MONSTER_MOVE_WALK); + else // run with 1/RUNNING_CHANCE_RANDOMMV chance + creature.RemoveMonsterMoveFlag(MONSTER_MOVE_WALK); + _setRandomLocation(creature); } else if(creature.isPet() && creature.GetOwner() && !creature.IsWithinDist(creature.GetOwner(),PET_FOLLOW_DIST+2.5f)) { - creature.SetUnitMovementFlags(MONSTER_MOVE_WALK); + creature.AddMonsterMoveFlag(MONSTER_MOVE_WALK); _setRandomLocation(creature); } } diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index 71351659f..51553cabb 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -2579,7 +2579,7 @@ void Spell::update(uint32 difftime) // check if the player caster has moved before the spell finished if ((m_caster->GetTypeId() == TYPEID_PLAYER && m_timer != 0) && (m_castPositionX != m_caster->GetPositionX() || m_castPositionY != m_caster->GetPositionY() || m_castPositionZ != m_caster->GetPositionZ()) && - (m_spellInfo->Effect[0] != SPELL_EFFECT_STUCK || !m_caster->HasUnitMovementFlag(MOVEMENTFLAG_FALLING))) + (m_spellInfo->Effect[0] != SPELL_EFFECT_STUCK || !((Player*)m_caster)->m_movementInfo.HasMovementFlag(MOVEMENTFLAG_FALLING))) { // always cancel for channeled spells if( m_spellState == SPELL_STATE_CASTING ) @@ -2611,7 +2611,7 @@ void Spell::update(uint32 difftime) if( m_caster->GetTypeId() == TYPEID_PLAYER ) { // check if player has jumped before the channeling finished - if(m_caster->HasUnitMovementFlag(MOVEMENTFLAG_JUMPING)) + if(((Player*)m_caster)->m_movementInfo.HasMovementFlag(MOVEMENTFLAG_JUMPING)) cancel(); // check for incapacitating player states diff --git a/src/game/SpellAuras.cpp b/src/game/SpellAuras.cpp index 442da5011..7ccc4eb5a 100644 --- a/src/game/SpellAuras.cpp +++ b/src/game/SpellAuras.cpp @@ -3174,7 +3174,7 @@ void Aura::HandleModPossessPet(bool apply, bool Real) { pet->AttackStop(); pet->GetMotionMaster()->MoveFollow(caster, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); - pet->SetUnitMovementFlags(MONSTER_MOVE_WALK); + pet->AddMonsterMoveFlag(MONSTER_MOVE_WALK); } } @@ -3415,10 +3415,10 @@ void Aura::HandleAuraModStun(bool apply, bool Real) // Creature specific if(m_target->GetTypeId() != TYPEID_PLAYER) - ((Creature*)m_target)->StopMoving(); + m_target->StopMoving(); else { - ((Player*)m_target)->m_movementInfo.flags = 0; // Clear movement flags + ((Player*)m_target)->m_movementInfo.SetMovementFlags(MOVEMENTFLAG_NONE); m_target->SetStandState(UNIT_STAND_STATE_STAND);// in 1.5 client } @@ -3702,10 +3702,10 @@ void Aura::HandleAuraModRoot(bool apply, bool Real) m_target->SendMessageToSet(&data, true); //Clear unit movement flags - ((Player*)m_target)->m_movementInfo.flags = 0; + ((Player*)m_target)->m_movementInfo.SetMovementFlags(MOVEMENTFLAG_NONE); } else - ((Creature *)m_target)->StopMoving(); + m_target->StopMoving(); } else { diff --git a/src/game/TargetedMovementGenerator.cpp b/src/game/TargetedMovementGenerator.cpp index 6643f2a26..f33cbcfd6 100644 --- a/src/game/TargetedMovementGenerator.cpp +++ b/src/game/TargetedMovementGenerator.cpp @@ -85,24 +85,29 @@ TargetedMovementGenerator::_setTargetLocation(T &owner) i_destinationHolder.SetDestination(traveller, x, y, z); owner.addUnitState(UNIT_STAT_CHASE); if (owner.GetTypeId() == TYPEID_UNIT && ((Creature*)&owner)->canFly()) - owner.AddUnitMovementFlag(MONSTER_MOVE_FLY); + ((Creature&)owner).AddMonsterMoveFlag(MONSTER_MOVE_FLY); } -template -void -TargetedMovementGenerator::Initialize(T &owner) +template<> +void TargetedMovementGenerator::Initialize(Creature &owner) { - if (owner.GetTypeId() == TYPEID_UNIT && ((Creature*)&owner)->HasSearchedAssistance()) - owner.AddUnitMovementFlag(MONSTER_MOVE_WALK); + if (owner.HasSearchedAssistance()) + owner.AddMonsterMoveFlag(MONSTER_MOVE_WALK); else - owner.RemoveUnitMovementFlag(MONSTER_MOVE_WALK); + owner.RemoveMonsterMoveFlag(MONSTER_MOVE_WALK); - if (owner.GetTypeId() == TYPEID_UNIT && ((Creature*)&owner)->canFly()) - owner.AddUnitMovementFlag(MONSTER_MOVE_FLY); + if (((Creature*)&owner)->canFly()) + owner.AddMonsterMoveFlag(MONSTER_MOVE_FLY); _setTargetLocation(owner); } +template<> +void TargetedMovementGenerator::Initialize(Player &owner) +{ + _setTargetLocation(owner); +} + template void TargetedMovementGenerator::Finalize(T &owner) @@ -150,7 +155,7 @@ TargetedMovementGenerator::Update(T &owner, const uint32 & time_diff) { owner.addUnitState(UNIT_STAT_CHASE); if (owner.GetTypeId() == TYPEID_UNIT && ((Creature*)&owner)->canFly()) - owner.AddUnitMovementFlag(MONSTER_MOVE_FLY); + ((Creature&)owner).AddMonsterMoveFlag(MONSTER_MOVE_FLY); i_destinationHolder.StartTravel(traveller); return true; @@ -199,8 +204,6 @@ TargetedMovementGenerator::GetTarget() const template void TargetedMovementGenerator::_setTargetLocation(Player &); template void TargetedMovementGenerator::_setTargetLocation(Creature &); -template void TargetedMovementGenerator::Initialize(Player &); -template void TargetedMovementGenerator::Initialize(Creature &); template void TargetedMovementGenerator::Finalize(Player &); template void TargetedMovementGenerator::Finalize(Creature &); template void TargetedMovementGenerator::Reset(Player &); diff --git a/src/game/Traveller.h b/src/game/Traveller.h index 0e98d8c0d..deb453dfa 100644 --- a/src/game/Traveller.h +++ b/src/game/Traveller.h @@ -71,9 +71,9 @@ inline uint32 Traveller::GetTotalTrevelTimeTo(float x, float y, float z) template<> inline float Traveller::Speed() { - if(i_traveller.HasUnitMovementFlag(MONSTER_MOVE_WALK)) + if(i_traveller.HasMonsterMoveFlag(MONSTER_MOVE_WALK)) return i_traveller.GetSpeed(MOVE_WALK); - else if(i_traveller.HasUnitMovementFlag(MONSTER_MOVE_FLY)) + else if(i_traveller.HasMonsterMoveFlag(MONSTER_MOVE_FLY)) return i_traveller.GetSpeed(MOVE_FLIGHT); else return i_traveller.GetSpeed(MOVE_RUN); @@ -102,7 +102,7 @@ inline float Traveller::GetMoveDestinationTo(float x, float y, float z template<> inline void Traveller::MoveTo(float x, float y, float z, uint32 t) { - i_traveller.AI_SendMoveToPacket(x, y, z, t, i_traveller.GetUnitMovementFlags(), 0); + i_traveller.AI_SendMoveToPacket(x, y, z, t, i_traveller.GetMonsterMoveFlags(), 0); } // specialization for players diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index e0196c9d2..697367c53 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -150,7 +150,6 @@ Unit::Unit() m_removedAuras = 0; m_charmInfo = NULL; - m_unit_movement_flags = 0; // remove aurastates allowing special moves for(int i=0; i < MAX_REACTIVE; ++i) @@ -229,33 +228,7 @@ bool Unit::haveOffhandWeapon() const return false; } -void Unit::SendMonsterMoveWithSpeedToCurrentDestination(Player* player) -{ - float x, y, z; - if(GetMotionMaster()->GetDestination(x, y, z)) - SendMonsterMoveWithSpeed(x, y, z, 0, player); -} - -void Unit::SendMonsterMoveWithSpeed(float x, float y, float z, uint32 transitTime, Player* player) -{ - if (!transitTime) - { - if(GetTypeId()==TYPEID_PLAYER) - { - Traveller traveller(*(Player*)this); - transitTime = traveller.GetTotalTrevelTimeTo(x,y,z); - } - else - { - Traveller traveller(*(Creature*)this); - transitTime = traveller.GetTotalTrevelTimeTo(x,y,z); - } - } - //float orientation = (float)atan2((double)dy, (double)dx); - SendMonsterMove(x, y, z, 0, GetUnitMovementFlags(), transitTime, player); -} - -void Unit::SendMonsterMove(float NewPosX, float NewPosY, float NewPosZ, uint8 type, uint32 MovementFlags, uint32 Time, Player* player) +void Unit::SendMonsterMove(float NewPosX, float NewPosY, float NewPosZ, uint8 type, MonsterMovementFlags flags, uint32 Time, Player* player) { float moveTime = Time; @@ -286,9 +259,9 @@ void Unit::SendMonsterMove(float NewPosX, float NewPosY, float NewPosZ, uint8 ty break; } - data << uint32(MovementFlags); + data << uint32(flags); - if(MovementFlags & MONSTER_MOVE_WALK) + if(flags & MONSTER_MOVE_WALK) moveTime *= 1.05f; data << uint32(moveTime); // Time in between points @@ -301,7 +274,7 @@ void Unit::SendMonsterMove(float NewPosX, float NewPosY, float NewPosZ, uint8 ty SendMessageToSet( &data, true ); } -void Unit::SendMonsterMoveByPath(Path const& path, uint32 start, uint32 end, uint32 MovementFlags) +void Unit::SendMonsterMoveByPath(Path const& path, uint32 start, uint32 end, MonsterMovementFlags flags) { uint32 traveltime = uint32(path.GetTotalLength(start, end) * 32); @@ -314,14 +287,32 @@ void Unit::SendMonsterMoveByPath(Path const& path, uint32 start, uint32 end, uin data << GetPositionY(); data << GetPositionZ(); data << uint32(getMSTime()); - data << uint8( 0 ); - data << uint32( MovementFlags ); - data << uint32( traveltime ); - data << uint32( pathSize ); - data.append( (char*)path.GetNodes(start), pathSize * 4 * 3 ); + data << uint8(0); + data << uint32(flags); + data << uint32(traveltime); + data << uint32(pathSize); + data.append((char*)path.GetNodes(start), pathSize * 4 * 3); SendMessageToSet(&data, true); } +void Unit::BuildHeartBeatMsg(WorldPacket *data) const +{ + MovementFlags move_flags = GetTypeId()==TYPEID_PLAYER + ? ((Player const*)this)->m_movementInfo.GetMovementFlags() + : MOVEMENTFLAG_NONE; + + data->Initialize(MSG_MOVE_HEARTBEAT, 32); + data->append(GetPackGUID()); + *data << uint32(move_flags); // movement flags + *data << uint16(0); // 2.3.0 + *data << uint32(getMSTime()); // time + *data << float(GetPositionX()); + *data << float(GetPositionY()); + *data << float(GetPositionZ()); + *data << float(GetOrientation()); + *data << uint32(0); +} + void Unit::resetAttackTimer(WeaponAttackType type) { m_attackTimer[type] = uint32(GetAttackTime(type) * m_modAttackSpeedPct[type]); @@ -11726,8 +11717,6 @@ void Unit::NearTeleportTo( float x, float y, float z, float orientation, bool ca GetMap()->CreatureRelocation((Creature*)this, x, y, z, orientation); WorldPacket data; - // Work strange for many spells: triggered active mover set for targeted player to creature - //BuildTeleportAckMsg(&data, x, y, z, orientation); BuildHeartBeatMsg(&data); SendMessageToSet(&data, false); } diff --git a/src/game/Unit.h b/src/game/Unit.h index 081b71e41..4b4b27d34 100644 --- a/src/game/Unit.h +++ b/src/game/Unit.h @@ -566,37 +566,7 @@ enum NPCFlags UNIT_NPC_FLAG_GUARD = 0x10000000, // custom flag for guards }; -enum MovementFlags -{ - MOVEMENTFLAG_NONE = 0x00000000, - MOVEMENTFLAG_FORWARD = 0x00000001, - MOVEMENTFLAG_BACKWARD = 0x00000002, - MOVEMENTFLAG_STRAFE_LEFT = 0x00000004, - MOVEMENTFLAG_STRAFE_RIGHT = 0x00000008, - MOVEMENTFLAG_LEFT = 0x00000010, - MOVEMENTFLAG_RIGHT = 0x00000020, - MOVEMENTFLAG_PITCH_UP = 0x00000040, - MOVEMENTFLAG_PITCH_DOWN = 0x00000080, - MOVEMENTFLAG_WALK_MODE = 0x00000100, // Walking - MOVEMENTFLAG_ONTRANSPORT = 0x00000200, // Used for flying on some creatures - MOVEMENTFLAG_LEVITATING = 0x00000400, - MOVEMENTFLAG_FLY_UNK1 = 0x00000800, - MOVEMENTFLAG_JUMPING = 0x00001000, - MOVEMENTFLAG_UNK4 = 0x00002000, - MOVEMENTFLAG_FALLING = 0x00004000, - // 0x8000, 0x10000, 0x20000, 0x40000, 0x80000, 0x100000 - MOVEMENTFLAG_SWIMMING = 0x00200000, // appears with fly flag also - MOVEMENTFLAG_FLY_UP = 0x00400000, - MOVEMENTFLAG_CAN_FLY = 0x00800000, - MOVEMENTFLAG_FLYING = 0x01000000, - MOVEMENTFLAG_FLYING2 = 0x02000000, // Actual flying mode - MOVEMENTFLAG_SPLINE = 0x04000000, // used for flight paths - MOVEMENTFLAG_SPLINE2 = 0x08000000, // used for flight paths - MOVEMENTFLAG_WATERWALKING = 0x10000000, // prevent unit from falling through water - MOVEMENTFLAG_SAFE_FALL = 0x20000000, // active rogue safe fall spell (passive) - MOVEMENTFLAG_UNK3 = 0x40000000 -}; - +// used in SMSG_MONSTER_MOVE enum MonsterMovementFlags { MONSTER_MOVE_NONE = 0x00000000, @@ -1143,10 +1113,10 @@ class MANGOS_DLL_SPEC Unit : public WorldObject void NearTeleportTo(float x, float y, float z, float orientation, bool casting = false); - void SendMonsterMove(float NewPosX, float NewPosY, float NewPosZ, uint8 type, uint32 MovementFlags, uint32 Time, Player* player = NULL); - void SendMonsterMoveByPath(Path const& path, uint32 start, uint32 end, uint32 MovementFlags); - void SendMonsterMoveWithSpeed(float x, float y, float z, uint32 transitTime = 0, Player* player = NULL); - void SendMonsterMoveWithSpeedToCurrentDestination(Player* player = NULL); + void SendMonsterMove(float NewPosX, float NewPosY, float NewPosZ, uint8 type, MonsterMovementFlags flags, uint32 Time, Player* player = NULL); + void SendMonsterMoveByPath(Path const& path, uint32 start, uint32 end, MonsterMovementFlags flags); + + void BuildHeartBeatMsg( WorldPacket *data ) const; virtual void MoveOutOfRange(Player &) { }; @@ -1474,16 +1444,6 @@ class MANGOS_DLL_SPEC Unit : public WorldObject bool IsStopped() const { return !(hasUnitState(UNIT_STAT_MOVING)); } void StopMoving(); - void AddUnitMovementFlag(uint32 f) { m_unit_movement_flags |= f; } - void RemoveUnitMovementFlag(uint32 f) - { - uint32 oldval = m_unit_movement_flags; - m_unit_movement_flags = oldval & ~f; - } - uint32 HasUnitMovementFlag(uint32 f) const { return m_unit_movement_flags & f; } - uint32 GetUnitMovementFlags() const { return m_unit_movement_flags; } - void SetUnitMovementFlags(uint32 f) { m_unit_movement_flags = f; } - void SetFeared(bool apply, uint64 casterGUID = 0, uint32 spellID = 0, uint32 time = 0); void SetConfused(bool apply, uint64 casterGUID = 0, uint32 spellID = 0); @@ -1558,7 +1518,6 @@ class MANGOS_DLL_SPEC Unit : public WorldObject virtual SpellSchoolMask GetMeleeDamageSchoolMask() const; MotionMaster i_motionMaster; - uint32 m_unit_movement_flags; uint32 m_reactiveTimer[MAX_REACTIVE]; uint32 m_regenTimer; diff --git a/src/game/WaypointMovementGenerator.cpp b/src/game/WaypointMovementGenerator.cpp index 3ee796ed6..874fadf79 100644 --- a/src/game/WaypointMovementGenerator.cpp +++ b/src/game/WaypointMovementGenerator.cpp @@ -110,7 +110,7 @@ bool WaypointMovementGenerator::Update(Creature &creature, const uint3 // Now we re-set destination to same node and start travel creature.addUnitState(UNIT_STAT_ROAMING); if (creature.canFly()) - creature.AddUnitMovementFlag(MONSTER_MOVE_FLY); + creature.AddMonsterMoveFlag(MONSTER_MOVE_FLY); const WaypointNode &node = i_path->at(i_currentNode); i_destinationHolder.SetDestination(traveller, node.x, node.y, node.z); i_nextMoveTime.Reset(i_destinationHolder.GetTotalTravelTime()); @@ -173,7 +173,7 @@ bool WaypointMovementGenerator::Update(Creature &creature, const uint3 { creature.addUnitState(UNIT_STAT_ROAMING); if (creature.canFly()) - creature.AddUnitMovementFlag(MONSTER_MOVE_FLY); + creature.AddMonsterMoveFlag(MONSTER_MOVE_FLY); const WaypointNode &node = i_path->at(i_currentNode); i_destinationHolder.SetDestination(traveller, node.x, node.y, node.z); i_nextMoveTime.Reset(i_destinationHolder.GetTotalTravelTime()); diff --git a/src/game/World.cpp b/src/game/World.cpp index 1bfe54577..87b06e7b8 100644 --- a/src/game/World.cpp +++ b/src/game/World.cpp @@ -1821,8 +1821,8 @@ void World::ScriptsProcess() sLog.outError("SCRIPT_COMMAND_MOVE_TO call for non-creature (TypeId: %u), skipping.",source->GetTypeId()); break; } - ((Unit *)source)->SendMonsterMoveWithSpeed(step.script->x, step.script->y, step.script->z, step.script->datalong2 ); - ((Unit *)source)->GetMap()->CreatureRelocation(((Creature *)source), step.script->x, step.script->y, step.script->z, 0); + ((Creature*)source)->SendMonsterMoveWithSpeed(step.script->x, step.script->y, step.script->z, step.script->datalong2 ); + ((Creature*)source)->GetMap()->CreatureRelocation(((Creature*)source), step.script->x, step.script->y, step.script->z, 0); break; case SCRIPT_COMMAND_FLAG_SET: if(!source) diff --git a/src/game/WorldSession.cpp b/src/game/WorldSession.cpp index 7279352f2..f0d11f587 100644 --- a/src/game/WorldSession.cpp +++ b/src/game/WorldSession.cpp @@ -635,7 +635,7 @@ void WorldSession::ReadMovementInfo(WorldPacket &data, MovementInfo *mi) data >> mi->z; data >> mi->o; - if(mi->flags & MOVEMENTFLAG_ONTRANSPORT) + if(mi->HasMovementFlag(MOVEMENTFLAG_ONTRANSPORT)) { if(!data.readPackGUID(mi->t_guid)) return; @@ -649,7 +649,7 @@ void WorldSession::ReadMovementInfo(WorldPacket &data, MovementInfo *mi) data >> mi->t_seat; } - if((mi->flags & (MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_FLYING2)) || (mi->unk1 & 0x20)) + if((mi->HasMovementFlag(MovementFlags(MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_FLYING2))) || (mi->unk1 & 0x20)) { CHECK_PACKET_SIZE(data, data.rpos()+4); data >> mi->s_pitch; @@ -658,7 +658,7 @@ void WorldSession::ReadMovementInfo(WorldPacket &data, MovementInfo *mi) CHECK_PACKET_SIZE(data, data.rpos()+4); data >> mi->fallTime; - if(mi->flags & MOVEMENTFLAG_JUMPING) + if(mi->HasMovementFlag(MOVEMENTFLAG_JUMPING)) { CHECK_PACKET_SIZE(data, data.rpos()+4+4+4+4); data >> mi->j_unk; @@ -667,7 +667,7 @@ void WorldSession::ReadMovementInfo(WorldPacket &data, MovementInfo *mi) data >> mi->j_xyspeed; } - if(mi->flags & MOVEMENTFLAG_SPLINE) + if(mi->HasMovementFlag(MOVEMENTFLAG_SPLINE)) { CHECK_PACKET_SIZE(data, data.rpos()+4); data >> mi->u_unk1; diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 958440da3..97c16489c 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "8076" + #define REVISION_NR "8077" #endif // __REVISION_NR_H__