fix(Core/Cinematics): Cinematic camera improvements (#25097)
This commit is contained in:
@@ -2957,7 +2957,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
|
||||
if (!IsPlayer(target))
|
||||
continue;
|
||||
|
||||
target->ToPlayer()->SendCinematicStart(e.action.cinematic.entry);
|
||||
target->ToPlayer()->GetCinematicMgr().StartCinematic(e.action.cinematic.entry);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -1703,7 +1703,7 @@ void GameObject::Use(Unit* user)
|
||||
Player* player = user->ToPlayer();
|
||||
|
||||
if (info->camera.cinematicId)
|
||||
player->SendCinematicStart(info->camera.cinematicId);
|
||||
player->GetCinematicMgr().StartCinematic(info->camera.cinematicId);
|
||||
|
||||
if (info->camera.eventID)
|
||||
{
|
||||
@@ -2142,7 +2142,32 @@ void GameObject::SendCustomAnim(uint32 anim)
|
||||
SendMessageToSet(&data, true);
|
||||
}
|
||||
|
||||
bool GameObject::IsInRange(float x, float y, float z, float radius) const
|
||||
bool GameObject::IsInRange2d(float x, float y, float radius) const
|
||||
{
|
||||
GameObjectDisplayInfoEntry const* info = sGameObjectDisplayInfoStore.LookupEntry(m_goInfo->displayId);
|
||||
if (!info)
|
||||
return IsWithinDist2d(x, y, radius);
|
||||
|
||||
float sinA = std::sin(GetOrientation());
|
||||
float cosA = cos(GetOrientation());
|
||||
float dx = x - GetPositionX();
|
||||
float dy = y - GetPositionY();
|
||||
float dist = std::sqrt(dx * dx + dy * dy);
|
||||
//! Check if the distance between the 2 objects is 0, can happen if both objects are on the same position.
|
||||
//! The code below this check wont crash if dist is 0 because 0/0 in float operations is valid, and returns infinite
|
||||
if (G3D::fuzzyEq(dist, 0.0f))
|
||||
return true;
|
||||
|
||||
float scale = GetObjectScale();
|
||||
float sinB = dx / dist;
|
||||
float cosB = dy / dist;
|
||||
dx = dist * (cosA * cosB + sinA * sinB);
|
||||
dy = dist * (cosA * sinB - sinA * cosB);
|
||||
return dx < (info->maxX * scale) + radius && dx >(info->minX * scale) - radius
|
||||
&& dy < (info->maxY * scale) + radius && dy >(info->minY * scale) - radius;
|
||||
}
|
||||
|
||||
bool GameObject::IsInRange3d(float x, float y, float z, float radius) const
|
||||
{
|
||||
GameObjectDisplayInfoEntry const* info = sGameObjectDisplayInfoStore.LookupEntry(m_goInfo->displayId);
|
||||
if (!info)
|
||||
@@ -2217,6 +2242,11 @@ void GameObject::UpdatePackedRotation()
|
||||
m_packedRotation = z | (y << 21) | (x << 42);
|
||||
}
|
||||
|
||||
bool GameObject::IsWithinSightRange(Position const& pos, float dist) const
|
||||
{
|
||||
return IsInRange2d(pos.GetPositionX(), pos.GetPositionY(), dist);
|
||||
}
|
||||
|
||||
void GameObject::SetWorldRotation(G3D::Quat const& rot)
|
||||
{
|
||||
G3D::Quat rotation = rot;
|
||||
|
||||
@@ -284,7 +284,8 @@ public:
|
||||
|
||||
void CastSpell(Unit* target, uint32 spell);
|
||||
void SendCustomAnim(uint32 anim);
|
||||
[[nodiscard]] bool IsInRange(float x, float y, float z, float radius) const;
|
||||
bool IsInRange2d(float x, float y, float radius) const;
|
||||
bool IsInRange3d(float x, float y, float z, float radius) const;
|
||||
|
||||
void ModifyHealth(int32 change, Unit* attackerOrHealer = nullptr, uint32 spellId = 0);
|
||||
void SetDestructibleBuildingModifyState(bool allow) { m_allowModifyDestructibleBuilding = allow; }
|
||||
@@ -418,8 +419,11 @@ private:
|
||||
{
|
||||
//! Following check does check 3d distance
|
||||
dist2compare += obj->GetObjectSize();
|
||||
return IsInRange(obj->GetPositionX(), obj->GetPositionY(), obj->GetPositionZ(), dist2compare);
|
||||
return IsInRange3d(obj->GetPositionX(), obj->GetPositionY(), obj->GetPositionZ(), dist2compare);
|
||||
}
|
||||
|
||||
bool IsWithinSightRange(Position const& pos, float dist) const override;
|
||||
|
||||
GameObjectAI* m_AI;
|
||||
|
||||
bool m_saveStateOnDb = false;
|
||||
|
||||
@@ -1362,6 +1362,12 @@ bool WorldObject::IsWithinDist2d(const Position* pos, float dist) const
|
||||
return IsInDist2d(pos, dist + GetObjectSize());
|
||||
}
|
||||
|
||||
// Visibility always uses 2d checks, factors in self-object size already. Gameobjects will override this for custom calc
|
||||
bool WorldObject::IsWithinSightRange(Position const& pos, float dist) const
|
||||
{
|
||||
return IsInDist2d(&pos, dist + GetObjectSize());
|
||||
}
|
||||
|
||||
// use only if you will sure about placing both object at same map
|
||||
bool WorldObject::IsWithinDist(WorldObject const* obj, float dist2compare, bool is3D, bool incOwnRadius, bool incTargetRadius) const
|
||||
{
|
||||
@@ -1674,7 +1680,7 @@ float WorldObject::GetGridActivationRange() const
|
||||
{
|
||||
if (ToPlayer())
|
||||
{
|
||||
if (ToPlayer()->GetCinematicMgr()->IsOnCinematic())
|
||||
if (ToPlayer()->GetCinematicMgr().IsOnCinematic())
|
||||
{
|
||||
return DEFAULT_VISIBILITY_INSTANCE;
|
||||
}
|
||||
@@ -1725,7 +1731,7 @@ float WorldObject::GetSightRange(WorldObject const* target) const
|
||||
return VISIBILITY_DIST_WINTERGRASP;
|
||||
else if (target->IsVisibilityOverridden())
|
||||
return target->GetVisibilityOverrideDistance();
|
||||
else if (ToPlayer()->GetCinematicMgr()->IsOnCinematic())
|
||||
else if (ToPlayer()->GetCinematicMgr().IsOnCinematic())
|
||||
return DEFAULT_VISIBILITY_INSTANCE;
|
||||
else
|
||||
return GetMap()->GetVisibilityRange();
|
||||
@@ -1794,10 +1800,10 @@ bool WorldObject::CanSeeOrDetect(WorldObject const* obj, bool ignoreStealth, boo
|
||||
if (distanceCheck)
|
||||
{
|
||||
bool corpseCheck = false;
|
||||
WorldObject const* viewpoint = this;
|
||||
Position const* sightPosition = this;
|
||||
if (Player const* thisPlayer = ToPlayer())
|
||||
{
|
||||
viewpoint = thisPlayer->GetSeer();
|
||||
sightPosition = &thisPlayer->GetSightPosition();
|
||||
|
||||
if (Creature const* creature = obj->ToCreature())
|
||||
{
|
||||
@@ -1843,8 +1849,7 @@ bool WorldObject::CanSeeOrDetect(WorldObject const* obj, bool ignoreStealth, boo
|
||||
return false;
|
||||
}
|
||||
|
||||
// Xinef: check reversely obj vs viewpoint, object could be a gameObject which overrides _IsWithinDist function to include gameobject size
|
||||
if (!corpseCheck && !viewpoint->IsWithinDist(obj, GetSightRange(obj), false))
|
||||
if (!corpseCheck && !obj->IsWithinSightRange(*sightPosition, GetSightRange(obj)))
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@@ -543,6 +543,7 @@ public:
|
||||
bool IsWithinDist3d(const Position* pos, float dist) const;
|
||||
[[nodiscard]] bool IsWithinDist2d(float x, float y, float dist) const;
|
||||
bool IsWithinDist2d(const Position* pos, float dist) const;
|
||||
virtual bool IsWithinSightRange(Position const& pos, float dist) const;
|
||||
// use only if you will sure about placing both object at same map
|
||||
bool IsWithinDist(WorldObject const* obj, float dist2compare, bool is3D = true, bool incOwnRadius = true, bool incTargetRadius = true) const;
|
||||
bool IsWithinDistInMap(WorldObject const* obj, float dist2compare, bool is3D = true, bool incOwnRadius = true, bool incTargetRadius = true) const;
|
||||
|
||||
@@ -17,92 +17,84 @@
|
||||
|
||||
#include "CinematicMgr.h"
|
||||
#include "M2Stores.h"
|
||||
#include "MotionMaster.h"
|
||||
#include "Player.h"
|
||||
|
||||
CinematicMgr::CinematicMgr(Player* playerref)
|
||||
CinematicMgr::CinematicMgr(Player& player) : _player(player)
|
||||
{
|
||||
player = playerref;
|
||||
m_cinematicDiff = 0;
|
||||
m_lastCinematicCheck = 0;
|
||||
m_activeCinematicCameraId = 0;
|
||||
m_cinematicLength = 0;
|
||||
m_cinematicCamera = nullptr;
|
||||
m_remoteSightPosition = Position(0.0f, 0.0f, 0.0f);
|
||||
m_CinematicObject = nullptr;
|
||||
_cinematicDiff = 0;
|
||||
_activeCinematicCameraId = 0;
|
||||
_cinematicCamera = nullptr;
|
||||
_remoteSightPosition = Position(0.0f, 0.0f, 0.0f);
|
||||
_cinematicUpdateTimer.SetInterval(CINEMATIC_UPDATEDIFF);
|
||||
}
|
||||
|
||||
CinematicMgr::~CinematicMgr()
|
||||
void CinematicMgr::StartCinematic(uint32 const cinematicSequenceId)
|
||||
{
|
||||
if (m_cinematicCamera && m_activeCinematicCameraId)
|
||||
EndCinematic();
|
||||
_player.SendCinematicStart(cinematicSequenceId);
|
||||
if (CinematicSequencesEntry const* sequence = sCinematicSequencesStore.LookupEntry(cinematicSequenceId))
|
||||
SetActiveCinematicCamera(sequence->cinematicCamera);
|
||||
}
|
||||
|
||||
void CinematicMgr::BeginCinematic()
|
||||
void CinematicMgr::StartCinematicCamera()
|
||||
{
|
||||
// Sanity check for active camera set
|
||||
if (m_activeCinematicCameraId == 0)
|
||||
if (_activeCinematicCameraId == 0)
|
||||
return;
|
||||
|
||||
if (std::vector<FlyByCamera> const* flyByCameras = GetFlyByCameras(m_activeCinematicCameraId))
|
||||
if (std::vector<FlyByCamera> const* flyByCameras = GetFlyByCameras(_activeCinematicCameraId))
|
||||
{
|
||||
// Initialize diff, and set camera
|
||||
m_cinematicDiff = 0;
|
||||
m_cinematicCamera = flyByCameras;
|
||||
_cinematicDiff = 0;
|
||||
_cinematicUpdateTimer.Reset();
|
||||
_cinematicCamera = flyByCameras;
|
||||
|
||||
auto camitr = m_cinematicCamera->begin();
|
||||
if (camitr != m_cinematicCamera->end())
|
||||
auto camitr = _cinematicCamera->begin();
|
||||
if (camitr != _cinematicCamera->end())
|
||||
{
|
||||
Position const& pos = camitr->locations;
|
||||
if (!pos.IsPositionValid())
|
||||
return;
|
||||
|
||||
player->GetMap()->LoadGrid(pos.GetPositionX(), pos.GetPositionY());
|
||||
m_CinematicObject = player->SummonCreature(VISUAL_WAYPOINT, pos.m_positionX, pos.m_positionY, pos.m_positionZ, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 120000);
|
||||
if (m_CinematicObject)
|
||||
{
|
||||
m_CinematicObject->setActive(true);
|
||||
player->SetViewpoint(m_CinematicObject, true);
|
||||
}
|
||||
|
||||
// Get cinematic length
|
||||
m_cinematicLength = flyByCameras->back().timeStamp;
|
||||
_player.GetMap()->LoadGridsInRange(pos, MAX_VISIBILITY_DISTANCE);
|
||||
_remoteSightPosition.Relocate(pos);
|
||||
_player.UpdateVisibilityForPlayer();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CinematicMgr::EndCinematic()
|
||||
{
|
||||
if (m_activeCinematicCameraId == 0)
|
||||
if (_activeCinematicCameraId == 0)
|
||||
return;
|
||||
|
||||
m_cinematicDiff = 0;
|
||||
m_cinematicCamera = nullptr;
|
||||
m_activeCinematicCameraId = 0;
|
||||
if (m_CinematicObject)
|
||||
{
|
||||
if (WorldObject* vpObject = player->GetViewpoint())
|
||||
if (vpObject == m_CinematicObject)
|
||||
player->SetViewpoint(m_CinematicObject, false);
|
||||
|
||||
m_CinematicObject->AddObjectToRemoveList();
|
||||
}
|
||||
_cinematicDiff = 0;
|
||||
_cinematicUpdateTimer.Reset();
|
||||
_cinematicCamera = nullptr;
|
||||
_activeCinematicCameraId = 0;
|
||||
_player.UpdateVisibilityForPlayer();
|
||||
}
|
||||
|
||||
void CinematicMgr::UpdateCinematicLocation(uint32 /*diff*/)
|
||||
void CinematicMgr::UpdateCinematic(uint32 const diff)
|
||||
{
|
||||
if (m_activeCinematicCameraId == 0 || !m_cinematicCamera || m_cinematicCamera->size() == 0)
|
||||
if (_activeCinematicCameraId == 0 || !_cinematicCamera || _cinematicCamera->empty())
|
||||
return;
|
||||
|
||||
_cinematicDiff += diff;
|
||||
_cinematicUpdateTimer.Update(diff);
|
||||
if (!_cinematicUpdateTimer.Passed())
|
||||
return;
|
||||
|
||||
_cinematicUpdateTimer.Reset();
|
||||
|
||||
Position lastPosition;
|
||||
uint32 lastTimestamp = 0;
|
||||
Position nextPosition;
|
||||
uint32 nextTimestamp = 0;
|
||||
|
||||
// Obtain direction of travel
|
||||
for (FlyByCamera cam : *m_cinematicCamera)
|
||||
for (FlyByCamera const& cam : *_cinematicCamera)
|
||||
{
|
||||
if (cam.timeStamp > m_cinematicDiff)
|
||||
if (cam.timeStamp > _cinematicDiff)
|
||||
{
|
||||
nextPosition.Relocate(cam.locations);
|
||||
nextTimestamp = cam.timeStamp;
|
||||
@@ -113,26 +105,25 @@ void CinematicMgr::UpdateCinematicLocation(uint32 /*diff*/)
|
||||
}
|
||||
float angle = lastPosition.GetAbsoluteAngle(&nextPosition);
|
||||
angle -= lastPosition.GetOrientation();
|
||||
if (angle < 0)
|
||||
angle += 2 * float(M_PI);
|
||||
angle = Position::NormalizeOrientation(angle);
|
||||
|
||||
// Look for position around 2 second ahead of us.
|
||||
int32 workDiff = m_cinematicDiff;
|
||||
int32 workDiff = _cinematicDiff;
|
||||
|
||||
// Modify result based on camera direction (Humans for example, have the camera point behind)
|
||||
workDiff += static_cast<int32>(float(CINEMATIC_LOOKAHEAD) * cos(angle));
|
||||
|
||||
// Get an iterator to the last entry in the cameras, to make sure we don't go beyond the end
|
||||
auto endItr = m_cinematicCamera->rbegin();
|
||||
if (endItr != m_cinematicCamera->rend() && workDiff > static_cast<int32>(endItr->timeStamp))
|
||||
auto endItr = _cinematicCamera->rbegin();
|
||||
if (endItr != _cinematicCamera->rend() && workDiff > static_cast<int32>(endItr->timeStamp))
|
||||
workDiff = endItr->timeStamp;
|
||||
|
||||
// Never try to go back in time before the start of cinematic!
|
||||
if (workDiff < 0)
|
||||
workDiff = m_cinematicDiff;
|
||||
workDiff = _cinematicDiff;
|
||||
|
||||
// Obtain the previous and next waypoint based on timestamp
|
||||
for (FlyByCamera cam : *m_cinematicCamera)
|
||||
for (FlyByCamera const& cam : *_cinematicCamera)
|
||||
{
|
||||
if (static_cast<int32>(cam.timeStamp) >= workDiff)
|
||||
{
|
||||
@@ -157,12 +148,15 @@ void CinematicMgr::UpdateCinematicLocation(uint32 /*diff*/)
|
||||
Position interPosition(lastPosition.m_positionX + (xDiff * (float(interDiff) / float(timeDiff))), lastPosition.m_positionY +
|
||||
(yDiff * (float(interDiff) / float(timeDiff))), lastPosition.m_positionZ + (zDiff * (float(interDiff) / float(timeDiff))));
|
||||
|
||||
// Advance (at speed) to this position. The remote sight object is used
|
||||
// to send update information to player in cinematic
|
||||
if (m_CinematicObject && interPosition.IsPositionValid())
|
||||
m_CinematicObject->MonsterMoveWithSpeed(interPosition.m_positionX, interPosition.m_positionY, interPosition.m_positionZ, 500.0f);
|
||||
// Advance _remoteSightPosition to new position
|
||||
if (interPosition.IsPositionValid())
|
||||
{
|
||||
_player.GetMap()->LoadGridsInRange(interPosition, MAX_VISIBILITY_DISTANCE);
|
||||
_remoteSightPosition.Relocate(interPosition);
|
||||
_player.UpdateVisibilityForPlayer();
|
||||
}
|
||||
|
||||
// If we never received an end packet 10 seconds after the final timestamp then force an end
|
||||
if (m_cinematicDiff > m_cinematicLength + 10 * IN_MILLISECONDS)
|
||||
if (_cinematicDiff > _cinematicCamera->back().timeStamp + 10 * IN_MILLISECONDS)
|
||||
EndCinematic();
|
||||
}
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
|
||||
#include "Define.h"
|
||||
#include "Position.h"
|
||||
#include "TemporarySummon.h"
|
||||
#include "Timer.h"
|
||||
#include <vector>
|
||||
|
||||
constexpr auto CINEMATIC_UPDATEDIFF = 500;
|
||||
@@ -31,31 +31,27 @@ struct FlyByCamera;
|
||||
|
||||
class AC_GAME_API CinematicMgr
|
||||
{
|
||||
friend class Player;
|
||||
public:
|
||||
explicit CinematicMgr(Player* playerref);
|
||||
~CinematicMgr();
|
||||
explicit CinematicMgr(Player& player);
|
||||
~CinematicMgr() = default;
|
||||
|
||||
// Cinematic camera data and remote sight functions
|
||||
uint32 GetActiveCinematicCamera() const { return m_activeCinematicCameraId; }
|
||||
void SetActiveCinematicCamera(uint32 cinematicCameraId = 0) { m_activeCinematicCameraId = cinematicCameraId; }
|
||||
bool IsOnCinematic() const { return (m_cinematicCamera != nullptr); }
|
||||
void BeginCinematic();
|
||||
void StartCinematic(uint32 const cinematicSequenceId);
|
||||
uint32 GetActiveCinematicCamera() const { return _activeCinematicCameraId; }
|
||||
void SetActiveCinematicCamera(uint32 cinematicCameraId = 0) { _activeCinematicCameraId = cinematicCameraId; }
|
||||
bool IsOnCinematic() const { return (_cinematicCamera != nullptr); }
|
||||
void StartCinematicCamera();
|
||||
void EndCinematic();
|
||||
void UpdateCinematicLocation(uint32 diff);
|
||||
void UpdateCinematic(uint32 const diff);
|
||||
Position const& GetRemoteSightPosition() const { return _remoteSightPosition; }
|
||||
|
||||
private:
|
||||
// Remote location information
|
||||
Player* player;
|
||||
|
||||
protected:
|
||||
uint32 m_cinematicDiff;
|
||||
uint32 m_lastCinematicCheck;
|
||||
uint32 m_activeCinematicCameraId;
|
||||
uint32 m_cinematicLength;
|
||||
std::vector<FlyByCamera> const* m_cinematicCamera;
|
||||
Position m_remoteSightPosition;
|
||||
TempSummon* m_CinematicObject;
|
||||
Player& _player;
|
||||
uint32 _cinematicDiff;
|
||||
uint32 _activeCinematicCameraId;
|
||||
std::vector<FlyByCamera> const* _cinematicCamera;
|
||||
Position _remoteSightPosition;
|
||||
IntervalTimer _cinematicUpdateTimer;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -154,7 +154,7 @@ static uint32 copseReclaimDelay[MAX_DEATH_COUNT] = { 30, 60, 120 };
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(disable:4355)
|
||||
#endif
|
||||
Player::Player(WorldSession* session): Unit(), m_mover(this)
|
||||
Player::Player(WorldSession* session): Unit(), m_mover(this), _cinematicMgr(*this)
|
||||
{
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(default:4355)
|
||||
@@ -395,8 +395,6 @@ Player::Player(WorldSession* session): Unit(), m_mover(this)
|
||||
|
||||
m_creationTime = 0s;
|
||||
|
||||
_cinematicMgr = new CinematicMgr(this);
|
||||
|
||||
m_achievementMgr = new AchievementMgr(this);
|
||||
m_reputationMgr = new ReputationMgr(this);
|
||||
|
||||
@@ -462,7 +460,6 @@ Player::~Player()
|
||||
delete m_runes;
|
||||
delete m_achievementMgr;
|
||||
delete m_reputationMgr;
|
||||
delete _cinematicMgr;
|
||||
|
||||
sWorldSessionMgr->DecreasePlayerCount();
|
||||
|
||||
@@ -5688,10 +5685,6 @@ void Player::SendCinematicStart(uint32 CinematicSequenceId) const
|
||||
WorldPacket data(SMSG_TRIGGER_CINEMATIC, 4);
|
||||
data << uint32(CinematicSequenceId);
|
||||
SendDirectMessage(&data);
|
||||
if (CinematicSequencesEntry const* sequence = sCinematicSequencesStore.LookupEntry(CinematicSequenceId))
|
||||
{
|
||||
_cinematicMgr->SetActiveCinematicCamera(sequence->cinematicCamera);
|
||||
}
|
||||
}
|
||||
|
||||
void Player::SendMovieStart(uint32 MovieId)
|
||||
@@ -13201,6 +13194,14 @@ WorldObject* Player::GetViewpoint() const
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
Position const& Player::GetSightPosition() const
|
||||
{
|
||||
if (_cinematicMgr.IsOnCinematic())
|
||||
return _cinematicMgr.GetRemoteSightPosition();
|
||||
|
||||
return *m_seer;
|
||||
}
|
||||
|
||||
bool Player::CanUseBattlegroundObject(GameObject* gameobject) const
|
||||
{
|
||||
// It is possible to call this method will a nullptr pointer, only skipping faction check.
|
||||
@@ -16270,7 +16271,10 @@ bool Player::IsWorldObjectOutOfSightRange(WorldObject const* target) const
|
||||
}
|
||||
|
||||
// Check if out of range
|
||||
return !m_seer->IsWithinDist(target, GetSightRange(target), false);
|
||||
if (!target->IsWithinSightRange(GetSightPosition(), GetSightRange(target)))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
std::string Player::GetPlayerName()
|
||||
|
||||
@@ -1393,7 +1393,8 @@ public:
|
||||
[[nodiscard]] TradeData* GetTradeData() const { return m_trade; }
|
||||
void TradeCancel(bool sendback, TradeStatus status = TRADE_STATUS_TRADE_CANCELED);
|
||||
|
||||
CinematicMgr* GetCinematicMgr() const { return _cinematicMgr; }
|
||||
CinematicMgr& GetCinematicMgr() { return _cinematicMgr; }
|
||||
CinematicMgr const& GetCinematicMgr() const { return _cinematicMgr; }
|
||||
|
||||
void UpdateEnchantTime(uint32 time);
|
||||
void UpdateSoulboundTradeItems();
|
||||
@@ -2384,6 +2385,7 @@ public:
|
||||
WorldObject* GetSeer() const { return m_seer; }
|
||||
void SetViewpoint(WorldObject* target, bool apply);
|
||||
[[nodiscard]] WorldObject* GetViewpoint() const;
|
||||
Position const& GetSightPosition() const;
|
||||
void StopCastingCharm(Aura* except = nullptr);
|
||||
void StopCastingBindSight(Aura* except = nullptr);
|
||||
|
||||
@@ -2978,7 +2980,7 @@ private:
|
||||
Item* _StoreItem(uint16 pos, Item* pItem, uint32 count, bool clone, bool update);
|
||||
Item* _LoadItem(CharacterDatabaseTransaction trans, uint32 zoneId, uint32 timeDiff, Field* fields);
|
||||
|
||||
CinematicMgr* _cinematicMgr;
|
||||
CinematicMgr _cinematicMgr;
|
||||
|
||||
typedef GuidSet RefundableItemsSet;
|
||||
RefundableItemsSet m_refundableItems;
|
||||
|
||||
@@ -68,14 +68,8 @@ void Player::Update(uint32 p_time)
|
||||
m_nextMailDelivereTime = time_t(0);
|
||||
}
|
||||
|
||||
// Update cinematic location, if 500ms have passed and we're doing a
|
||||
// cinematic now.
|
||||
_cinematicMgr->m_cinematicDiff += p_time;
|
||||
if (_cinematicMgr->m_cinematicCamera && _cinematicMgr->m_activeCinematicCameraId && GetMSTimeDiffToNow(_cinematicMgr->m_lastCinematicCheck) > CINEMATIC_UPDATEDIFF)
|
||||
{
|
||||
_cinematicMgr->m_lastCinematicCheck = getMSTime();
|
||||
_cinematicMgr->UpdateCinematicLocation(p_time);
|
||||
}
|
||||
// Update cinematic camera (if needed)
|
||||
_cinematicMgr.UpdateCinematic(p_time);
|
||||
|
||||
// used to implement delayed far teleports
|
||||
SetMustDelayTeleport(true);
|
||||
@@ -1608,8 +1602,8 @@ void Player::UpdateVisibilityForPlayer(bool mapChange)
|
||||
m_seer = this;
|
||||
|
||||
Acore::VisibleNotifier notifier(*this, mapChange);
|
||||
Cell::VisitObjects(m_seer, notifier, GetSightRange());
|
||||
Cell::VisitFarVisibleObjects(m_seer, notifier, VISIBILITY_DISTANCE_GIGANTIC);
|
||||
Cell::VisitObjects(GetSightPosition().GetPositionX(), GetSightPosition().GetPositionY(), GetMap(), notifier, GetSightRange());
|
||||
Cell::VisitFarVisibleObjects(GetSightPosition().GetPositionX(), GetSightPosition().GetPositionY(), GetMap(), notifier, VISIBILITY_DISTANCE_GIGANTIC);
|
||||
notifier.SendToSelf();
|
||||
|
||||
if (mapChange)
|
||||
|
||||
@@ -16325,8 +16325,8 @@ void Unit::ExecuteDelayedUnitRelocationEvent()
|
||||
GetMap()->LoadGridsInRange(*player, MAX_VISIBILITY_DISTANCE);
|
||||
|
||||
Acore::PlayerRelocationNotifier notifier(*player);
|
||||
Cell::VisitObjects(viewPoint, notifier, player->GetSightRange());
|
||||
Cell::VisitFarVisibleObjects(viewPoint, notifier, VISIBILITY_DISTANCE_GIGANTIC);
|
||||
Cell::VisitObjects(player->GetSightPosition().GetPositionX(), player->GetSightPosition().GetPositionY(), player->GetMap(), notifier, player->GetSightRange());
|
||||
Cell::VisitFarVisibleObjects(player->GetSightPosition().GetPositionX(), player->GetSightPosition().GetPositionY(), player->GetMap(), notifier, VISIBILITY_DISTANCE_GIGANTIC);
|
||||
notifier.SendToSelf();
|
||||
|
||||
this->AddToNotify(NOTIFY_AI_RELOCATION);
|
||||
|
||||
@@ -107,6 +107,7 @@ struct Cell
|
||||
template<class T> static void VisitObjects(float x, float y, Map* map, T& visitor, float radius);
|
||||
|
||||
template<class T> static void VisitFarVisibleObjects(WorldObject const* obj, T& visitor, float radius);
|
||||
template<class T> static void VisitFarVisibleObjects(float x, float y, Map* map, T& visitor, float radius);
|
||||
|
||||
private:
|
||||
template<class T, class CONTAINER> void VisitCircle(TypeContainerVisitor<T, CONTAINER>&, Map&, CellCoord const&, CellCoord const&) const;
|
||||
|
||||
@@ -164,11 +164,7 @@ inline void Cell::VisitCircle(TypeContainerVisitor<T, CONTAINER>& visitor, Map&
|
||||
template<class T>
|
||||
inline void Cell::VisitObjects(WorldObject const* center_obj, T& visitor, float radius)
|
||||
{
|
||||
CellCoord p(Acore::ComputeCellCoord(center_obj->GetPositionX(), center_obj->GetPositionY()));
|
||||
Cell cell(p);
|
||||
|
||||
TypeContainerVisitor<T, GridTypeMapContainer> gnotifier(visitor);
|
||||
cell.Visit(p, gnotifier, *center_obj->GetMap(), *center_obj, radius);
|
||||
VisitObjects(center_obj->GetPositionX(), center_obj->GetPositionY(), center_obj->GetMap(), visitor, radius);
|
||||
}
|
||||
|
||||
template<class T>
|
||||
@@ -184,11 +180,17 @@ inline void Cell::VisitObjects(float x, float y, Map* map, T& visitor, float rad
|
||||
template<class T>
|
||||
inline void Cell::VisitFarVisibleObjects(WorldObject const* center_obj, T& visitor, float radius)
|
||||
{
|
||||
CellCoord p(Acore::ComputeCellCoord(center_obj->GetPositionX(), center_obj->GetPositionY()));
|
||||
VisitFarVisibleObjects(center_obj->GetPositionX(), center_obj->GetPositionY(), center_obj->GetMap(), visitor, radius);
|
||||
}
|
||||
|
||||
template<class T>
|
||||
inline void Cell::VisitFarVisibleObjects(float x, float y, Map* map, T& visitor, float radius)
|
||||
{
|
||||
CellCoord p(Acore::ComputeCellCoord(x, y));
|
||||
Cell cell(p);
|
||||
|
||||
TypeContainerVisitor<T, FarVisibleGridContainer> gnotifier(visitor);
|
||||
cell.Visit(p, gnotifier, *center_obj->GetMap(), *center_obj, radius);
|
||||
cell.Visit(p, gnotifier, *map, x, y, radius);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
@@ -192,7 +192,7 @@ void MessageDistDeliverer::Visit(VisiblePlayersMap const& m)
|
||||
for (auto const& kvPair : m)
|
||||
{
|
||||
Player const* target = kvPair.second;
|
||||
if (i_distSq != 0.0f && target->m_seer->GetExactDist2dSq(i_source) > i_distSq)
|
||||
if (i_distSq != 0.0f && target->GetSightPosition().GetExactDist2dSq(i_source) > i_distSq)
|
||||
continue;
|
||||
|
||||
// @todo: Might not need this check anymore
|
||||
|
||||
@@ -1384,7 +1384,7 @@ namespace Acore
|
||||
AnyPlayerExactPositionInGameObjectRangeCheck(GameObject const* go, float range) : _go(go), _range(range) {}
|
||||
bool operator()(Player* u)
|
||||
{
|
||||
if (!_go->IsInRange(u->GetPositionX(), u->GetPositionY(), u->GetPositionZ(), _range))
|
||||
if (!_go->IsInRange3d(u->GetPositionX(), u->GetPositionY(), u->GetPositionZ(), _range))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
@@ -1604,7 +1604,7 @@ namespace Acore
|
||||
bool operator() (GameObject* go)
|
||||
{
|
||||
if (!entry || (go->GetGOInfo() && go->GetGOInfo()->entry == entry))
|
||||
return go->IsInRange(x, y, z, range);
|
||||
return go->IsInRange3d(x, y, z, range);
|
||||
else return false;
|
||||
}
|
||||
private:
|
||||
|
||||
@@ -872,9 +872,9 @@ void WorldSession::HandlePlayerLoginFromDB(LoginQueryHolder const& holder)
|
||||
if (ChrClassesEntry const* cEntry = sChrClassesStore.LookupEntry(pCurrChar->getClass()))
|
||||
{
|
||||
if (cEntry->CinematicSequence)
|
||||
pCurrChar->SendCinematicStart(cEntry->CinematicSequence);
|
||||
pCurrChar->GetCinematicMgr().StartCinematic(cEntry->CinematicSequence);
|
||||
else if (ChrRacesEntry const* rEntry = sChrRacesStore.LookupEntry(pCurrChar->getRace()))
|
||||
pCurrChar->SendCinematicStart(rEntry->CinematicSequence);
|
||||
pCurrChar->GetCinematicMgr().StartCinematic(rEntry->CinematicSequence);
|
||||
|
||||
// send new char string if not empty
|
||||
std::string_view newCharString = sWorld->getStringConfig(CONFIG_NEW_CHAR_STRING);
|
||||
|
||||
@@ -947,14 +947,14 @@ void WorldSession::HandleSetActionButtonOpcode(WorldPacket& recv_data)
|
||||
|
||||
void WorldSession::HandleCompleteCinematic(WorldPacket& /*recv_data*/)
|
||||
{
|
||||
// If player has sight bound to visual waypoint NPC we should remove it
|
||||
GetPlayer()->GetCinematicMgr()->EndCinematic();
|
||||
// End the current cinematic and restore the normal player view
|
||||
GetPlayer()->GetCinematicMgr().EndCinematic();
|
||||
}
|
||||
|
||||
void WorldSession::HandleNextCinematicCamera(WorldPacket& /*recv_data*/)
|
||||
{
|
||||
// Sent by client when cinematic actually begun. So we begin the server side process
|
||||
GetPlayer()->GetCinematicMgr()->BeginCinematic();
|
||||
GetPlayer()->GetCinematicMgr().StartCinematicCamera();
|
||||
}
|
||||
|
||||
void WorldSession::HandleSetActionBarToggles(WorldPacket& recv_data)
|
||||
|
||||
@@ -379,8 +379,8 @@ void OpcodeTable::Initialize()
|
||||
/*0x0F8*/ DEFINE_HANDLER(CMSG_TRIGGER_CINEMATIC_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
|
||||
/*0x0F9*/ DEFINE_HANDLER(CMSG_OPENING_CINEMATIC, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
|
||||
/*0x0FA*/ DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRIGGER_CINEMATIC, STATUS_NEVER);
|
||||
/*0x0FB*/ DEFINE_HANDLER(CMSG_NEXT_CINEMATIC_CAMERA, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleNextCinematicCamera );
|
||||
/*0x0FC*/ DEFINE_HANDLER(CMSG_COMPLETE_CINEMATIC, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleCompleteCinematic );
|
||||
/*0x0FB*/ DEFINE_HANDLER(CMSG_NEXT_CINEMATIC_CAMERA, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleNextCinematicCamera );
|
||||
/*0x0FC*/ DEFINE_HANDLER(CMSG_COMPLETE_CINEMATIC, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleCompleteCinematic );
|
||||
/*0x0FD*/ DEFINE_SERVER_OPCODE_HANDLER(SMSG_TUTORIAL_FLAGS, STATUS_NEVER);
|
||||
/*0x0FE*/ DEFINE_HANDLER(CMSG_TUTORIAL_FLAG, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleTutorialFlag );
|
||||
/*0x0FF*/ DEFINE_HANDLER(CMSG_TUTORIAL_CLEAR, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleTutorialClear );
|
||||
|
||||
@@ -9069,7 +9069,7 @@ namespace Acore
|
||||
{
|
||||
if (target->IsGameObject())
|
||||
{
|
||||
if (!target->ToGameObject()->IsInRange(_position->GetPositionX(), _position->GetPositionY(), _position->GetPositionZ(), _range))
|
||||
if (!target->ToGameObject()->IsInRange3d(_position->GetPositionX(), _position->GetPositionY(), _position->GetPositionZ(), _range))
|
||||
return false;
|
||||
}
|
||||
else if (!target->IsWithinDist3d(_position, _range))
|
||||
|
||||
Reference in New Issue
Block a user