From d59a20701e089a3770c95ff9cf5e1940da7899bd Mon Sep 17 00:00:00 2001 From: Ovahlord Date: Thu, 2 Aug 2018 13:52:12 +0200 Subject: [PATCH] Core/Movement: merged more movement commits and fixed build by merging the changes done to movement generators by the header cleanup --- .../game/Entities/Creature/Creature.cpp | 19 +++++++++++++++++++ src/server/game/Entities/Creature/Creature.h | 4 +++- src/server/game/Entities/Unit/Unit.h | 4 ++-- .../FormationMovementGenerator.cpp | 4 ++-- .../PointMovementGenerator.cpp | 4 ++-- .../RandomMovementGenerator.cpp | 6 +++--- .../RandomMovementGenerator.h | 5 +++-- .../TargetedMovementGenerator.cpp | 11 ++++++----- .../TargetedMovementGenerator.h | 5 +++-- 9 files changed, 43 insertions(+), 19 deletions(-) diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 85211e77aa3..ba9d86ba6f0 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -3012,6 +3012,25 @@ void Creature::ReleaseFocus(Spell const* focusSpell, bool withDelay) m_focusDelay = (!IsPet() && withDelay) ? GameTime::GetGameTimeMS() : 0; // don't allow re-target right away to prevent visual bugs } +bool Creature::IsMovementPreventedByCasting() const +{ + // first check if currently a movement allowed channel is active and we're not casting + if (Spell* spell = m_currentSpells[CURRENT_CHANNELED_SPELL]) + { + if (spell->getState() != SPELL_STATE_FINISHED && spell->IsChannelActive()) + if (spell->GetSpellInfo()->IsMoveAllowedChannel()) + return false; + } + + if (const_cast(this)->IsFocusing(nullptr, true)) + return true; + + if (HasUnitState(UNIT_STATE_CASTING)) + return true; + + return false; +} + void Creature::StartPickPocketRefillTimer() { _pickpocketLootRestore = time(nullptr) + sWorld->getIntConfig(CONFIG_CREATURE_PICKPOCKET_REFILL); diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index b51a0a66d04..bb210d64f7c 100644 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -322,9 +322,11 @@ class TC_GAME_API Creature : public Unit, public GridObject, public Ma void MustReacquireTarget() { m_shouldReacquireTarget = true; } // flags the Creature for forced (client displayed) target reacquisition in the next ::Update call void DoNotReacquireTarget() { m_shouldReacquireTarget = false; m_suppressedTarget = ObjectGuid::Empty; m_suppressedOrientation = 0.0f; } void FocusTarget(Spell const* focusSpell, WorldObject const* target); - bool IsFocusing(Spell const* focusSpell = nullptr, bool withDelay = false); + bool IsFocusing(Spell const* focusSpell = nullptr, bool withDelay = false) override; void ReleaseFocus(Spell const* focusSpell = nullptr, bool withDelay = true); + bool IsMovementPreventedByCasting() const override; + CreatureTextRepeatIds GetTextRepeatGroup(uint8 textGroup); void SetTextRepeatId(uint8 textGroup, uint8 id); void ClearTextRepeatGroup(uint8 textGroup); diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 9334d64a723..e98bd52bd21 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1587,8 +1587,8 @@ class TC_GAME_API Unit : public WorldObject int32 GetCurrentSpellCastTime(uint32 spell_id) const; SpellInfo const* GetCastSpellInfo(SpellInfo const* spellInfo) const; - // Check if our current channel spell has attribute SPELL_ATTR5_CAN_CHANNEL_WHEN_MOVING - bool IsMovementPreventedByCasting() const; + virtual bool IsFocusing(Spell const* /*focusSpell*/ = nullptr, bool /*withDelay*/ = false) { return false; } + virtual bool IsMovementPreventedByCasting() const; SpellHistory* GetSpellHistory() { return m_spellHistory; } SpellHistory const* GetSpellHistory() const { return m_spellHistory; } diff --git a/src/server/game/Movement/MovementGenerators/FormationMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/FormationMovementGenerator.cpp index f95260b6f8e..b7ded5a419e 100644 --- a/src/server/game/Movement/MovementGenerators/FormationMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/FormationMovementGenerator.cpp @@ -35,7 +35,7 @@ void FormationMovementGenerator::DoInitialize(Creature* owner) owner->AddUnitState(UNIT_STATE_ROAMING_MOVE); Movement::MoveSplineInit init(owner); - init.MoveTo(_destination); + init.MoveTo(_destination.GetPositionX(), _destination.GetPositionY(), _destination.GetPositionZ()); if (_orientation) init.SetFacing(_destination.GetOrientation()); @@ -81,7 +81,7 @@ bool FormationMovementGenerator::DoUpdate(Creature* owner, uint32 /*diff*/) owner->AddUnitState(UNIT_STATE_ROAMING_MOVE); Movement::MoveSplineInit init(owner); - init.MoveTo(_destination); + init.MoveTo(_destination.GetPositionX(), _destination.GetPositionY(), _destination.GetPositionZ()); if (_orientation) init.SetFacing(_destination.GetOrientation()); diff --git a/src/server/game/Movement/MovementGenerators/PointMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/PointMovementGenerator.cpp index d1abbd46944..83dfe10298b 100755 --- a/src/server/game/Movement/MovementGenerators/PointMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/PointMovementGenerator.cpp @@ -56,7 +56,7 @@ void PointMovementGenerator::DoInitialize(T* owner) // Call for creature group update if (Creature* creature = owner->ToCreature()) if (creature->GetFormation() && creature->GetFormation()->getLeader() == creature) - creature->GetFormation()->LeaderMoveTo(Position(_destination), _movementId); + creature->GetFormation()->LeaderMoveTo(Position(_x, _y, _z), _movementId); } template @@ -90,7 +90,7 @@ bool PointMovementGenerator::DoUpdate(T* owner, uint32 /*diff*/) // Call for creature group update if (Creature* creature = owner->ToCreature()) if (creature->GetFormation() && creature->GetFormation()->getLeader() == creature) - creature->GetFormation()->LeaderMoveTo(Position(_destination), _movementId); + creature->GetFormation()->LeaderMoveTo(Position(_x, _y, _z), _movementId); } return !owner->movespline->Finalized(); diff --git a/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp index f80b0c04017..b1038fa772d 100644 --- a/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp @@ -16,13 +16,13 @@ * with this program. If not, see . */ +#include "RandomMovementGenerator.h" #include "Creature.h" #include "CreatureGroups.h" #include "Map.h" #include "MoveSplineInit.h" #include "MoveSpline.h" #include "PathGenerator.h" -#include "RandomMovementGenerator.h" #include "Random.h" template @@ -44,7 +44,7 @@ void RandomMovementGenerator::DoInitialize(Creature* owner) return; owner->AddUnitState(UNIT_STATE_ROAMING); - owner->GetPosition(_reference.x, _reference.y, _reference.z); + _reference = owner->GetPosition(); owner->StopMoving(); if (!_wanderDistance) @@ -91,7 +91,7 @@ void RandomMovementGenerator::SetRandomLocation(Creature* owner) owner->AddUnitState(UNIT_STATE_ROAMING_MOVE); - Position position(_reference.x, _reference.y, _reference.z); + Position position(_reference); float distance = frand(0.f, 1.f) * _wanderDistance; float angle = frand(0.f, 1.f) * float(M_PI) * 2.f; owner->MovePositionToFirstCollision(position, distance, angle); diff --git a/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.h b/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.h index 88485dcaed3..cc8441f6cab 100644 --- a/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.h +++ b/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.h @@ -20,13 +20,14 @@ #define TRINITY_RANDOMMOTIONGENERATOR_H #include "MovementGenerator.h" +#include "Position.h" #include "Timer.h" template class RandomMovementGenerator : public MovementGeneratorMedium< T, RandomMovementGenerator > { public: - explicit RandomMovementGenerator(float distance = 0.0f) : _path(nullptr), _timer(0), _reference(0.f, 0.f, 0.f), _wanderDistance(distance), _interrupt(false) { } + explicit RandomMovementGenerator(float distance = 0.0f) : _path(nullptr), _timer(0), _reference(), _wanderDistance(distance), _interrupt(false) { } ~RandomMovementGenerator(); MovementGeneratorType GetMovementGeneratorType() const override { return RANDOM_MOTION_TYPE; } @@ -41,7 +42,7 @@ class RandomMovementGenerator : public MovementGeneratorMedium< T, RandomMovemen PathGenerator* _path; TimeTracker _timer; - G3D::Vector3 _reference; + Position _reference; float _wanderDistance; bool _interrupt; }; diff --git a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp index 168b9f8c040..510a4e4106d 100755 --- a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp @@ -41,8 +41,7 @@ bool TargetedMovementGenerator::DoUpdate(T* owner, uint32 diff) if (!owner || !owner->IsAlive()) return false; - if (owner->HasUnitState(UNIT_STATE_NOT_MOVE) || owner->IsMovementPreventedByCasting() || HasLostTarget(owner) - || (owner->GetTypeId() == TYPEID_UNIT && owner->ToCreature()->IsFocusing(nullptr, true))) + if (owner->HasUnitState(UNIT_STATE_NOT_MOVE) || owner->IsMovementPreventedByCasting() || HasLostTarget(owner)) { _interrupt = true; owner->StopMoving(); @@ -82,7 +81,9 @@ bool TargetedMovementGenerator::DoUpdate(T* owner, uint32 diff) } if (targetMoved) - SetTargetLocation(owner, targetMoved); + SetTargetLocation(owner, true); + else if (_speedChanged) + SetTargetLocation(owner, false); if (!_targetReached && owner->movespline->Finalized()) { @@ -136,8 +137,7 @@ void TargetedMovementGenerator::SetTargetLocation(T* owner, bool updateDes if (!owner || !owner->IsAlive()) return; - if (owner->HasUnitState(UNIT_STATE_NOT_MOVE) || owner->IsMovementPreventedByCasting() || HasLostTarget(owner) - || (owner->GetTypeId() == TYPEID_UNIT && owner->ToCreature()->IsFocusing(nullptr, true))) + if (owner->HasUnitState(UNIT_STATE_NOT_MOVE) || owner->IsMovementPreventedByCasting() || HasLostTarget(owner)) { _interrupt = true; owner->StopMoving(); @@ -204,6 +204,7 @@ void TargetedMovementGenerator::SetTargetLocation(T* owner, bool updateDes _targetReached = false; _recalculateTravel = false; + _speedChanged = false; AddUnitStateMove(owner); diff --git a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.h b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.h index bfaea28bd78..fa9444c5745 100755 --- a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.h +++ b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.h @@ -45,11 +45,11 @@ template class TargetedMovementGenerator : public MovementGeneratorMedium< T, D >, public TargetedMovementGeneratorBase { public: - explicit TargetedMovementGenerator(Unit* target, float offset, float angle) : TargetedMovementGeneratorBase(target), _path(nullptr), _timer(0), _advanceMovementTimer(0), _offset(offset), _angle(angle), _recalculateTravel(false), _targetReached(false), _interrupt(false) { } + explicit TargetedMovementGenerator(Unit* target, float offset, float angle) : TargetedMovementGeneratorBase(target), _path(nullptr), _timer(0), _advanceMovementTimer(0), _offset(offset), _angle(angle), _recalculateTravel(false), _speedChanged(false), _targetReached(false), _interrupt(false) { } ~TargetedMovementGenerator(); bool DoUpdate(T*, uint32); - void UnitSpeedChanged() override { _recalculateTravel = true; } + void UnitSpeedChanged() override { _speedChanged = true; } virtual void ClearUnitStateMove(T*) { } virtual void AddUnitStateMove(T*) { } @@ -69,6 +69,7 @@ class TargetedMovementGenerator : public MovementGeneratorMedium< T, D >, public float _offset; float _angle; bool _recalculateTravel; + bool _speedChanged; bool _targetReached; bool _interrupt; };