diff options
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 18 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.h | 3 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 54 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 12 | ||||
-rw-r--r-- | src/server/game/Handlers/MovementHandler.cpp | 8 | ||||
-rw-r--r-- | src/server/game/Handlers/SpellHandler.cpp | 16 |
6 files changed, 48 insertions, 63 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 2d2443edcf9..a4043aa6747 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -23990,7 +23990,7 @@ bool Player::IsNeverVisibleFor(WorldObject const* seer) const bool Player::CanAlwaysSee(WorldObject const* obj) const { // Always can see self - if (m_unitMovedByMe == obj) + if (GetUnitBeingMoved() == obj) return true; ObjectGuid guid = m_activePlayerData->FarsightObject; @@ -24431,7 +24431,7 @@ void Player::SendInitialPacketsBeforeAddToMap() initialSetup.ServerExpansionLevel = sWorld->getIntConfig(CONFIG_EXPANSION); SendDirectMessage(initialSetup.Write()); - SetMover(this); + SetMovedUnit(this); } void Player::SendInitialPacketsAfterAddToMap() @@ -25748,19 +25748,7 @@ void Player::SetClientControl(Unit* target, bool allowMove) SetViewpoint(target, allowMove); if (allowMove) - SetMover(target); -} - -void Player::SetMover(Unit* target) -{ - m_unitMovedByMe->m_playerMovingMe = nullptr; - - m_unitMovedByMe = target; - m_unitMovedByMe->m_playerMovingMe = this; - - WorldPackets::Movement::MoveSetActiveMover packet; - packet.MoverGUID = target->GetGUID(); - SendDirectMessage(packet.Write()); + SetMovedUnit(target); } void Player::UpdateZoneDependentAuras(uint32 newZone) diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 37c89b30800..ad773d6878b 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -2369,15 +2369,12 @@ 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); void SetClientControl(Unit* target, bool allowMove); - void SetMover(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 324a44646ec..ba787843086 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -298,11 +298,10 @@ SpellNonMeleeDamage::SpellNonMeleeDamage(Unit* _attacker, Unit* _target, SpellIn } 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_interruptMask(SpellAuraInterruptFlags::None), m_interruptMask2(SpellAuraInterruptFlags2::None), - 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_interruptMask(SpellAuraInterruptFlags::None), m_interruptMask2(SpellAuraInterruptFlags2::None), + 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), _playHoverAnim(false), _aiAnimKitId(0), _movementAnimKitId(0), _meleeAnimKitId(0), @@ -433,6 +432,7 @@ Unit::~Unit() ASSERT(m_removedAuras.empty()); ASSERT(m_gameObj.empty()); ASSERT(m_dynObj.empty()); + ASSERT(!m_playerMovingMe); } void Unit::Update(uint32 p_time) @@ -8093,7 +8093,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 WorldPackets::Movement::MoveSetSpeed selfpacket(moveTypeToOpcode[mtype][1]); @@ -9481,18 +9481,15 @@ 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; -} + m_unitMovedByMe->m_playerMovingMe = nullptr; + m_unitMovedByMe = ASSERT_NOTNULL(target); + m_unitMovedByMe->m_playerMovingMe = ASSERT_NOTNULL(ToPlayer()); -Player* Unit::GetPlayerBeingMoved() const -{ - if (Unit* mover = GetUnitBeingMoved()) - return mover->ToPlayer(); - return nullptr; + WorldPackets::Movement::MoveSetActiveMover packet; + packet.MoverGUID = target->GetGUID(); + ToPlayer()->SendDirectMessage(packet.Write()); } uint32 createProcHitMask(SpellNonMeleeDamage* damageInfo, SpellMissInfo missCondition) @@ -10740,7 +10737,7 @@ void Unit::SetRooted(bool apply, bool packetOnly /*= false*/) { SMSG_MOVE_SPLINE_ROOT, SMSG_MOVE_ROOT } }; - if (Player* playerMover = GetPlayerBeingMoved()) // unit controlled by a player. + if (Player* playerMover = Unit::ToPlayer(GetUnitBeingMoved())) // unit controlled by a player. { WorldPackets::Movement::MoveSetFlag packet(rootOpcodeTable[apply][1]); packet.MoverGUID = GetGUID(); @@ -11534,7 +11531,7 @@ void Unit::KnockbackFrom(Position const& origin, float speedXY, float speedZ, Mo if (Unit* charmer = GetCharmer()) { player = charmer->ToPlayer(); - if (player && player->m_unitMovedByMe != this) + if (player && player->GetUnitBeingMoved() != this) player = nullptr; } } @@ -12002,7 +11999,8 @@ void Unit::SendTeleportPacket(Position const& pos) moveUpdateTeleport.MovementForces = _movementForces->GetForces(); 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())) { float x, y, z, o; pos.GetPosition(x, y, z, o); @@ -12360,7 +12358,7 @@ bool Unit::SetDisableGravity(bool disable) { SMSG_MOVE_SPLINE_DISABLE_GRAVITY, SMSG_MOVE_DISABLE_GRAVITY } }; - if (Player* playerMover = GetPlayerBeingMoved()) + if (Player* playerMover = Unit::ToPlayer(GetUnitBeingMoved())) { WorldPackets::Movement::MoveSetFlag packet(gravityOpcodeTable[disable][1]); packet.MoverGUID = GetGUID(); @@ -12438,7 +12436,7 @@ bool Unit::SetCanFly(bool enable) if (!enable && GetTypeId() == TYPEID_PLAYER) ToPlayer()->SetFallInformation(0, GetPositionZ()); - if (Player* playerMover = GetPlayerBeingMoved()) + if (Player* playerMover = Unit::ToPlayer(GetUnitBeingMoved())) { WorldPackets::Movement::MoveSetFlag packet(flyOpcodeTable[enable][1]); packet.MoverGUID = GetGUID(); @@ -12475,7 +12473,7 @@ bool Unit::SetWaterWalking(bool enable) { SMSG_MOVE_SPLINE_SET_WATER_WALK, SMSG_MOVE_SET_WATER_WALK } }; - if (Player* playerMover = GetPlayerBeingMoved()) + if (Player* playerMover = Unit::ToPlayer(GetUnitBeingMoved())) { WorldPackets::Movement::MoveSetFlag packet(waterWalkingOpcodeTable[enable][1]); packet.MoverGUID = GetGUID(); @@ -12513,7 +12511,7 @@ bool Unit::SetFeatherFall(bool enable) { SMSG_MOVE_SPLINE_SET_FEATHER_FALL, SMSG_MOVE_SET_FEATHER_FALL } }; - if (Player* playerMover = GetPlayerBeingMoved()) + if (Player* playerMover = Unit::ToPlayer(GetUnitBeingMoved())) { WorldPackets::Movement::MoveSetFlag packet(featherFallOpcodeTable[enable][1]); packet.MoverGUID = GetGUID(); @@ -12566,7 +12564,7 @@ bool Unit::SetHover(bool enable) { SMSG_MOVE_SPLINE_SET_HOVER, SMSG_MOVE_SET_HOVERING } }; - if (Player* playerMover = GetPlayerBeingMoved()) + if (Player* playerMover = Unit::ToPlayer(GetUnitBeingMoved())) { WorldPackets::Movement::MoveSetFlag packet(hoverOpcodeTable[enable][1]); packet.MoverGUID = GetGUID(); @@ -12603,7 +12601,7 @@ bool Unit::SetCollision(bool disable) { SMSG_MOVE_SPLINE_DISABLE_COLLISION, SMSG_MOVE_DISABLE_COLLISION } }; - if (Player* playerMover = GetPlayerBeingMoved()) + if (Player* playerMover = Unit::ToPlayer(GetUnitBeingMoved())) { WorldPackets::Movement::MoveSetFlag packet(collisionOpcodeTable[disable][1]); packet.MoverGUID = GetGUID(); @@ -12643,7 +12641,7 @@ bool Unit::SetCanTransitionBetweenSwimAndFly(bool enable) SMSG_MOVE_ENABLE_TRANSITION_BETWEEN_SWIM_AND_FLY }; - if (Player* playerMover = GetPlayerBeingMoved()) + if (Player* playerMover = Unit::ToPlayer(GetUnitBeingMoved())) { WorldPackets::Movement::MoveSetFlag packet(swimToFlyTransOpcodeTable[enable]); packet.MoverGUID = GetGUID(); @@ -12675,7 +12673,7 @@ bool Unit::SetCanTurnWhileFalling(bool enable) SMSG_MOVE_SET_CAN_TURN_WHILE_FALLING }; - if (Player* playerMover = GetPlayerBeingMoved()) + if (Player* playerMover = Unit::ToPlayer(GetUnitBeingMoved())) { WorldPackets::Movement::MoveSetFlag packet(canTurnWhileFallingOpcodeTable[enable]); packet.MoverGUID = GetGUID(); @@ -12706,7 +12704,7 @@ bool Unit::SetCanDoubleJump(bool enable) SMSG_MOVE_ENABLE_DOUBLE_JUMP }; - if (Player* playerMover = GetPlayerBeingMoved()) + if (Player* playerMover = Unit::ToPlayer(GetUnitBeingMoved())) { WorldPackets::Movement::MoveSetFlag packet(doubleJumpOpcodeTable[enable]); packet.MoverGUID = GetGUID(); diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 0b01aad923a..837004de029 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1288,14 +1288,14 @@ class TC_GAME_API Unit : public WorldObject void DeleteCharmInfo(); void SetPetNumberForClient(uint32 petNumber) { SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::PetNumber), petNumber); } void SetPetNameTimestamp(uint32 timestamp) { SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::PetNameTimestamp), timestamp); } + + // 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); @@ -1918,6 +1918,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/MovementHandler.cpp b/src/server/game/Handlers/MovementHandler.cpp index c546e964f8a..43fdc510b8a 100644 --- a/src/server/game/Handlers/MovementHandler.cpp +++ b/src/server/game/Handlers/MovementHandler.cpp @@ -249,7 +249,7 @@ void WorldSession::HandleMoveTeleportAck(WorldPackets::Movement::MoveTeleportAck { TC_LOG_DEBUG("network", "CMSG_MOVE_TELEPORT_ACK: Guid: %s, Sequence: %u, Time: %u", packet.MoverGUID.ToString().c_str(), packet.AckIndex, packet.MoveTime); - Player* plMover = _player->m_unitMovedByMe->ToPlayer(); + Player* plMover = _player->GetUnitBeingMoved()->ToPlayer(); if (!plMover || !plMover->IsBeingTeleportedNear()) return; @@ -296,7 +296,7 @@ void WorldSession::HandleMovementOpcodes(WorldPackets::Movement::ClientPlayerMov void WorldSession::HandleMovementOpcode(OpcodeClient opcode, MovementInfo& movementInfo) { - Unit* mover = _player->m_unitMovedByMe; + Unit* mover = _player->GetUnitBeingMoved(); ASSERT(mover != nullptr); // there must always be a mover @@ -529,8 +529,8 @@ void WorldSession::HandleForceSpeedChangeAck(WorldPackets::Movement::MovementSpe void WorldSession::HandleSetActiveMoverOpcode(WorldPackets::Movement::SetActiveMover& packet) { if (GetPlayer()->IsInWorld()) - if (_player->m_unitMovedByMe->GetGUID() != packet.ActiveMover) - TC_LOG_DEBUG("network", "HandleSetActiveMoverOpcode: incorrect mover guid: mover is %s and should be %s" , packet.ActiveMover.ToString().c_str(), _player->m_unitMovedByMe->GetGUID().ToString().c_str()); + if (_player->GetUnitBeingMoved()->GetGUID() != packet.ActiveMover) + TC_LOG_DEBUG("network", "HandleSetActiveMoverOpcode: incorrect mover guid: mover is %s and should be %s" , packet.ActiveMover.ToString().c_str(), _player->GetUnitBeingMoved()->GetGUID().ToString().c_str()); } void WorldSession::HandleMoveKnockBackAck(WorldPackets::Movement::MoveKnockBackAck& movementAck) diff --git a/src/server/game/Handlers/SpellHandler.cpp b/src/server/game/Handlers/SpellHandler.cpp index cfc2b1cefcd..fd1fbf56d9e 100644 --- a/src/server/game/Handlers/SpellHandler.cpp +++ b/src/server/game/Handlers/SpellHandler.cpp @@ -43,7 +43,7 @@ void WorldSession::HandleUseItemOpcode(WorldPackets::Spells::UseItem& packet) Player* user = _player; // ignore for remote control state - if (user->m_unitMovedByMe != user) + if (user->GetUnitBeingMoved() != user) return; Item* item = user->GetUseableItemByPos(packet.PackSlot, packet.Slot); @@ -137,7 +137,7 @@ void WorldSession::HandleOpenItemOpcode(WorldPackets::Spells::OpenItem& packet) Player* player = GetPlayer(); // ignore for remote control state - if (player->m_unitMovedByMe != player) + if (player->GetUnitBeingMoved() != player) return; TC_LOG_INFO("network", "bagIndex: %u, slot: %u", packet.Slot, packet.PackSlot); @@ -248,8 +248,8 @@ void WorldSession::HandleGameObjectUseOpcode(WorldPackets::GameObject::GameObjUs if (GameObject* obj = GetPlayer()->GetGameObjectIfCanInteractWith(packet.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()); @@ -259,7 +259,7 @@ void WorldSession::HandleGameObjectUseOpcode(WorldPackets::GameObject::GameObjUs void WorldSession::HandleGameobjectReportUse(WorldPackets::GameObject::GameObjReportUse& packet) { // ignore for remote control state - if (_player->m_unitMovedByMe != _player) + if (_player->GetUnitBeingMoved() != _player) return; if (GameObject* go = GetPlayer()->GetGameObjectIfCanInteractWith(packet.Guid)) @@ -274,7 +274,7 @@ void WorldSession::HandleGameobjectReportUse(WorldPackets::GameObject::GameObjRe void WorldSession::HandleCastSpellOpcode(WorldPackets::Spells::CastSpell& cast) { // 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; @@ -482,7 +482,7 @@ void WorldSession::HandleCancelAutoRepeatSpellOpcode(WorldPackets::Spells::Cance void WorldSession::HandleCancelChanneling(WorldPackets::Spells::CancelChannelling& /*cancelChanneling*/) { // 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; @@ -492,7 +492,7 @@ void WorldSession::HandleCancelChanneling(WorldPackets::Spells::CancelChannellin void WorldSession::HandleTotemDestroyed(WorldPackets::Totem::TotemDestroyed& totemDestroyed) { // ignore for remote control state - if (_player->m_unitMovedByMe != _player) + if (_player->GetUnitBeingMoved() != _player) return; uint8 slotId = totemDestroyed.Slot; |