diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 10 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.h | 3 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 29 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 12 | ||||
-rw-r--r-- | src/server/game/Handlers/MiscHandler.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Handlers/MovementHandler.cpp | 10 | ||||
-rw-r--r-- | src/server/game/Handlers/SpellHandler.cpp | 16 | ||||
-rw-r--r-- | src/server/game/Server/WorldSession.cpp | 4 |
8 files changed, 36 insertions, 50 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 53fe8bd1de8..378cadad747 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -22226,7 +22226,7 @@ bool Player::IsNeverVisible() const bool Player::CanAlwaysSee(WorldObject const* obj) const { // Always can see self - if (m_unitMovedByMe == obj) + if (GetUnitBeingMoved() == obj) return true; if (ObjectGuid guid = GetGuidValue(PLAYER_FARSIGHT)) @@ -23894,14 +23894,6 @@ void Player::SetClientControl(Unit* target, bool allowMove) SetMovedUnit(target); } -void Player::SetMovedUnit(Unit* target) -{ - m_unitMovedByMe->m_playerMovingMe = nullptr; - - m_unitMovedByMe = target; - m_unitMovedByMe->m_playerMovingMe = this; -} - void Player::UpdateZoneDependentAuras(uint32 newZone) { // Some spells applied at enter into zone (with subzones), aura removed in UpdateAreaDependentAuras that called always at zone->area update diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 626b75709d6..9c481ee64b4 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1942,7 +1942,6 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> /*********************************************************/ void UpdateFallInformationIfNeed(MovementInfo const& minfo, uint16 opcode); // only changed for direct client control (possess, vehicle etc.), not stuff you control using pet commands - Unit* m_unitMovedByMe; WorldObject* m_seer; void SetFallInformation(uint32 time, float z); void HandleFall(MovementInfo const& movementInfo); @@ -1951,8 +1950,6 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> void SetClientControl(Unit* target, bool allowMove); - void SetMovedUnit(Unit* target); - void SetSeer(WorldObject* target) { m_seer = target; } void SetViewpoint(WorldObject* target, bool apply); WorldObject* GetViewpoint() const; diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 29a34e48ddf..4c36de9b22e 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -289,9 +289,9 @@ bool DispelableAura::RollDispel() const } Unit::Unit(bool isWorldObject) : - WorldObject(isWorldObject), m_playerMovingMe(nullptr), m_lastSanctuaryTime(0), LastCharmerGUID(), - movespline(new Movement::MoveSpline()), m_ControlledByPlayer(false), m_AutoRepeatFirstCast(false), - m_procDeep(0), m_transformSpell(0), m_removedAurasCount(0), m_charmer(nullptr), m_charmed(nullptr), + WorldObject(isWorldObject), m_lastSanctuaryTime(0), LastCharmerGUID(), movespline(new Movement::MoveSpline()), + m_ControlledByPlayer(false), m_AutoRepeatFirstCast(false), m_procDeep(0), m_transformSpell(0), + m_removedAurasCount(0), m_unitMovedByMe(nullptr), m_playerMovingMe(nullptr), m_charmer(nullptr), m_charmed(nullptr), i_motionMaster(new MotionMaster(this)), m_regenTimer(0), m_vehicle(nullptr), m_vehicleKit(nullptr), m_unitTypeMask(UNIT_MASK_NONE), m_Diminishing(), m_isEngaged(false), m_combatManager(this), m_threatManager(this), m_aiLocked(false), m_comboTarget(nullptr), m_comboPoints(0), m_spellHistory(new SpellHistory(this)) @@ -412,6 +412,7 @@ Unit::~Unit() ASSERT(m_removedAuras.empty()); ASSERT(m_gameObj.empty()); ASSERT(m_dynObj.empty()); + ASSERT(!m_playerMovingMe); } void Unit::Update(uint32 p_time) @@ -8561,7 +8562,7 @@ void Unit::SetSpeedRate(UnitMoveType mtype, float rate) pet->SetSpeedRate(mtype, m_speed_rate[mtype]); } - if (Player* playerMover = GetPlayerBeingMoved()) // unit controlled by a player. + if (Player* playerMover = Unit::ToPlayer(GetUnitBeingMoved())) // unit controlled by a player. { // Send notification to self. this packet is only sent to one client (the client of the player concerned by the change). WorldPacket self; @@ -9841,18 +9842,11 @@ void CharmInfo::SetSpellAutocast(SpellInfo const* spellInfo, bool state) } } -Unit* Unit::GetUnitBeingMoved() const +void Unit::SetMovedUnit(Unit* target) { - if (Player const* player = ToPlayer()) - return player->m_unitMovedByMe; - return nullptr; -} - -Player* Unit::GetPlayerBeingMoved() const -{ - if (Unit* mover = GetUnitBeingMoved()) - return mover->ToPlayer(); - return nullptr; + m_unitMovedByMe->m_playerMovingMe = nullptr; + m_unitMovedByMe = ASSERT_NOTNULL(target); + m_unitMovedByMe->m_playerMovingMe = ASSERT_NOTNULL(ToPlayer()); } uint32 createProcHitMask(SpellNonMeleeDamage* damageInfo, SpellMissInfo missCondition) @@ -12003,7 +11997,7 @@ void Unit::KnockbackFrom(float x, float y, float speedXY, float speedZ) if (Unit* charmer = GetCharmer()) { player = charmer->ToPlayer(); - if (player && player->m_unitMovedByMe != this) + if (player && player->GetUnitBeingMoved() != this) player = nullptr; } } @@ -12744,7 +12738,8 @@ void Unit::SendTeleportPacket(Position const& pos, bool teleportingTransport /*= moveUpdateTeleport << GetPackGUID(); Unit* broadcastSource = this; - if (Player* playerMover = GetPlayerBeingMoved()) + // should this really be the unit _being_ moved? not the unit doing the moving? + if (Player* playerMover = Unit::ToPlayer(GetUnitBeingMoved())) { WorldPacket moveTeleport(MSG_MOVE_TELEPORT_ACK, 41); moveTeleport << GetPackGUID(); diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 26a7c52f002..557de4a2b89 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1190,14 +1190,14 @@ class TC_GAME_API Unit : public WorldObject CharmInfo* GetCharmInfo() { return m_charmInfo; } CharmInfo* InitCharmInfo(); void DeleteCharmInfo(); + + // all of these are for DIRECT CLIENT CONTROL only + void SetMovedUnit(Unit* target); // returns the unit that this player IS CONTROLLING - Unit* GetUnitBeingMoved() const; - // returns the player that this player IS CONTROLLING - Player* GetPlayerBeingMoved() const; + Unit* GetUnitBeingMoved() const { return m_unitMovedByMe; } // returns the player that this unit is BEING CONTROLLED BY Player* GetPlayerMovingMe() const { return m_playerMovingMe; } - // only set for direct client control (possess effects, vehicles and similar) - Player* m_playerMovingMe; + SharedVisionList const& GetSharedVisionList() { return m_sharedVision; } void AddPlayerToVision(Player* player); void RemovePlayerFromVision(Player* player); @@ -1739,6 +1739,8 @@ class TC_GAME_API Unit : public WorldObject float m_speed_rate[MAX_MOVE_TYPE]; + Unit* m_unitMovedByMe; // only ever set for players, and only for direct client control + Player* m_playerMovingMe; // only set for direct client control (possess effects, vehicles and similar) Unit* m_charmer; // Unit that is charming ME Unit* m_charmed; // Unit that is being charmed BY ME CharmInfo* m_charmInfo; diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp index 54be85e6efe..63d27951c7f 100644 --- a/src/server/game/Handlers/MiscHandler.cpp +++ b/src/server/game/Handlers/MiscHandler.cpp @@ -1387,7 +1387,7 @@ void WorldSession::HandleMoveSetCanFlyAckOpcode(WorldPacket& recvData) recvData.read_skip<float>(); // unk2 - _player->m_unitMovedByMe->m_movementInfo.flags = movementInfo.GetMovementFlags(); + _player->GetUnitBeingMoved()->m_movementInfo.flags = movementInfo.GetMovementFlags(); } void WorldSession::HandleRequestPetInfoOpcode(WorldPacket& /*recvData */) diff --git a/src/server/game/Handlers/MovementHandler.cpp b/src/server/game/Handlers/MovementHandler.cpp index e2030f62303..cdbb939518f 100644 --- a/src/server/game/Handlers/MovementHandler.cpp +++ b/src/server/game/Handlers/MovementHandler.cpp @@ -216,7 +216,7 @@ void WorldSession::HandleMoveTeleportAck(WorldPacket& recvData) uint32 sequenceIndex, time; recvData >> sequenceIndex >> time; - Player* plMover = _player->m_unitMovedByMe->ToPlayer(); + Player* plMover = _player->GetUnitBeingMoved()->ToPlayer(); if (!plMover || !plMover->IsBeingTeleportedNear()) return; @@ -260,7 +260,7 @@ void WorldSession::HandleMovementOpcodes(WorldPacket& recvData) { uint16 opcode = recvData.GetOpcode(); - Unit* mover = _player->m_unitMovedByMe; + Unit* mover = _player->GetUnitBeingMoved(); ASSERT(mover != nullptr); // there must always be a mover @@ -521,8 +521,8 @@ void WorldSession::HandleSetActiveMoverOpcode(WorldPacket &recvData) recvData >> guid; if (GetPlayer()->IsInWorld()) - if (_player->m_unitMovedByMe->GetGUID() != guid) - TC_LOG_DEBUG("network", "HandleSetActiveMoverOpcode: incorrect mover guid: mover is %s and should be %s" , guid.ToString().c_str(), _player->m_unitMovedByMe->GetGUID().ToString().c_str()); + if (_player->GetUnitBeingMoved()->GetGUID() != guid) + TC_LOG_DEBUG("network", "HandleSetActiveMoverOpcode: incorrect mover guid: mover is %s and should be %s" , guid.ToString().c_str(), _player->GetUnitBeingMoved()->GetGUID().ToString().c_str()); } void WorldSession::HandleMoveNotActiveMover(WorldPacket &recvData) @@ -555,7 +555,7 @@ void WorldSession::HandleMoveKnockBackAck(WorldPacket& recvData) ObjectGuid guid; recvData >> guid.ReadAsPacked(); - if (_player->m_unitMovedByMe->GetGUID() != guid) + if (_player->GetUnitBeingMoved()->GetGUID() != guid) return; recvData.read_skip<uint32>(); // unk diff --git a/src/server/game/Handlers/SpellHandler.cpp b/src/server/game/Handlers/SpellHandler.cpp index b05c972faf9..0e349c1732f 100644 --- a/src/server/game/Handlers/SpellHandler.cpp +++ b/src/server/game/Handlers/SpellHandler.cpp @@ -66,7 +66,7 @@ void WorldSession::HandleUseItemOpcode(WorldPacket& recvPacket) Player* pUser = _player; // ignore for remote control state - if (pUser->m_unitMovedByMe != pUser) + if (pUser->GetUnitBeingMoved() != pUser) return; uint8 bagIndex, slot, castFlags; @@ -177,7 +177,7 @@ void WorldSession::HandleOpenItemOpcode(WorldPacket& recvPacket) Player* player = GetPlayer(); // ignore for remote control state - if (player->m_unitMovedByMe != player) + if (player->GetUnitBeingMoved() != player) return; // additional check, client outputs message on its own @@ -297,8 +297,8 @@ void WorldSession::HandleGameObjectUseOpcode(WorldPacket& recvData) if (GameObject* obj = GetPlayer()->GetGameObjectIfCanInteractWith(guid)) { // ignore for remote control state - if (GetPlayer()->m_unitMovedByMe != GetPlayer()) - if (!(GetPlayer()->IsOnVehicle(GetPlayer()->m_unitMovedByMe) || GetPlayer()->IsMounted()) && !obj->GetGOInfo()->IsUsableMounted()) + if (GetPlayer()->GetUnitBeingMoved() != GetPlayer()) + if (!(GetPlayer()->IsOnVehicle(GetPlayer()->GetUnitBeingMoved()) || GetPlayer()->IsMounted()) && !obj->GetGOInfo()->IsUsableMounted()) return; obj->Use(GetPlayer()); @@ -313,7 +313,7 @@ void WorldSession::HandleGameobjectReportUse(WorldPacket& recvPacket) TC_LOG_DEBUG("network", "WORLD: Recvd CMSG_GAMEOBJ_REPORT_USE Message [%s]", guid.ToString().c_str()); // ignore for remote control state - if (_player->m_unitMovedByMe != _player) + if (_player->GetUnitBeingMoved() != _player) return; if (GameObject* go = GetPlayer()->GetGameObjectIfCanInteractWith(guid)) @@ -335,7 +335,7 @@ void WorldSession::HandleCastSpellOpcode(WorldPacket& recvPacket) TC_LOG_DEBUG("network", "WORLD: got cast spell packet, castCount: %u, spellId: %u, castFlags: %u, data length = %u", castCount, spellId, castFlags, (uint32)recvPacket.size()); // ignore for remote control state (for player case) - Unit* mover = _player->m_unitMovedByMe; + Unit* mover = _player->GetUnitBeingMoved(); if (mover != _player && mover->GetTypeId() == TYPEID_PLAYER) { recvPacket.rfinish(); // prevent spam at ignore packet @@ -549,7 +549,7 @@ void WorldSession::HandleCancelChanneling(WorldPacket& recvData) recvData.read_skip<uint32>(); // spellid, not used // ignore for remote control state (for player case) - Unit* mover = _player->m_unitMovedByMe; + Unit* mover = _player->GetUnitBeingMoved(); if (mover != _player && mover->GetTypeId() == TYPEID_PLAYER) return; @@ -559,7 +559,7 @@ void WorldSession::HandleCancelChanneling(WorldPacket& recvData) void WorldSession::HandleTotemDestroyed(WorldPacket& recvPacket) { // ignore for remote control state - if (_player->m_unitMovedByMe != _player) + if (_player->GetUnitBeingMoved() != _player) return; uint8 slotId; diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index 3c1de96e01b..c8836c7704a 100644 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -934,8 +934,8 @@ void WorldSession::ReadMovementInfo(WorldPacket &data, MovementInfo* mi) */ REMOVE_VIOLATING_FLAGS(mi->HasMovementFlag(MOVEMENTFLAG_FLYING | MOVEMENTFLAG_CAN_FLY) && GetSecurity() == SEC_PLAYER && - !GetPlayer()->m_unitMovedByMe->HasAuraType(SPELL_AURA_FLY) && - !GetPlayer()->m_unitMovedByMe->HasAuraType(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED), + !GetPlayer()->GetUnitBeingMoved()->HasAuraType(SPELL_AURA_FLY) && + !GetPlayer()->GetUnitBeingMoved()->HasAuraType(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED), MOVEMENTFLAG_FLYING | MOVEMENTFLAG_CAN_FLY); //! Cannot fly and fall at the same time |