mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-20 17:27:36 +01:00
Core/Transports: solved all remaining visual issues for transports
This commit is contained in:
@@ -2442,7 +2442,7 @@ void GameObject::BuildValuesUpdate(uint8 updateType, ByteBuffer* data, Player* t
|
||||
Transport const* transport = ToTransport();
|
||||
if (uint32 transportPeriod = transport->GetTransportPeriod())
|
||||
{
|
||||
float timer = float(transport->GetPathProgress() % transportPeriod);
|
||||
float timer = float(transport->GetTimer() % transportPeriod);
|
||||
pathProgress = int16(timer / float(transportPeriod) * 65535.0f);
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -643,10 +643,8 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint16 flags) const
|
||||
{
|
||||
if (GameObject const* go = ToGameObject())
|
||||
{
|
||||
if (MapTransport const* transport = go->ToMapTransport())
|
||||
*data << uint32(transport->GetPathProgress());
|
||||
else if (Transport const* transport = go->ToTransport())
|
||||
*data << uint32(getMSTime() + transport->GetCurrentTransportTime());
|
||||
if (Transport const* transport = go->ToTransport())
|
||||
*data << uint32(transport->GetTimer());
|
||||
else
|
||||
*data << uint32(getMSTime());
|
||||
}
|
||||
|
||||
@@ -67,7 +67,7 @@ void Transport::AddPassenger(WorldObject* passenger)
|
||||
{
|
||||
passenger->SetTransport(this);
|
||||
passenger->m_movementInfo.transport.guid = GetGUID();
|
||||
passenger->m_movementInfo.transport.time = GetPathProgress();
|
||||
passenger->m_movementInfo.transport.time = GetTimer();
|
||||
TC_LOG_DEBUG("entities.transport", "Object %s boarded transport %s.", passenger->GetName().c_str(), GetName().c_str());
|
||||
|
||||
if (Unit* unit = passenger->ToUnit())
|
||||
@@ -214,7 +214,19 @@ bool Transport::Create(ObjectGuid::LowType guidlow, uint32 entry, Map* map, uint
|
||||
else
|
||||
SetGoState(GO_STATE_TRANSPORT_ACTIVE);
|
||||
|
||||
SetPathProgress(0);
|
||||
if (_isDynamicTransport)
|
||||
{
|
||||
SetPeriod(m_goValue.Transport.AnimationInfo->TotalTime);
|
||||
m_goValue.Transport.PathProgress = getMSTime();
|
||||
if (m_goValue.Transport.AnimationInfo)
|
||||
m_goValue.Transport.PathProgress -= m_goValue.Transport.PathProgress % GetTransportPeriod(); // align to period
|
||||
}
|
||||
else
|
||||
{
|
||||
SetPeriod(getMSTime() + stopTimer);
|
||||
m_goValue.Transport.PathProgress = getMSTime() + stopTimer;
|
||||
}
|
||||
|
||||
SetDestinationStopFrameTime(stopTimer);
|
||||
SetCurrentTransportTime(stopTimer);
|
||||
|
||||
@@ -291,6 +303,7 @@ void Transport::Update(uint32 diff)
|
||||
|
||||
if (IsDynamicTransport())
|
||||
{
|
||||
m_goValue.Transport.PathProgress += diff;
|
||||
SetCurrentTransportTime(GetCurrentTransportTime() + diff);
|
||||
if (GetCurrentTransportTime() >= GetTransportPeriod())
|
||||
SetCurrentTransportTime(GetCurrentTransportTime() % GetTransportPeriod());
|
||||
@@ -358,9 +371,9 @@ void Transport::Update(uint32 diff)
|
||||
SetCurrentTransportTime(currentTime);
|
||||
}
|
||||
}
|
||||
m_goValue.Transport.PathProgress = getMSTime() + GetCurrentTransportTime();
|
||||
}
|
||||
|
||||
SetPathProgress(getMSTime() + GetCurrentTransportTime());
|
||||
RelocateToProgress(GetCurrentTransportTime());
|
||||
}
|
||||
|
||||
@@ -474,15 +487,6 @@ void Transport::UpdatePassengerPositions(PassengerSet& passengers)
|
||||
}
|
||||
}
|
||||
|
||||
uint32 Transport::GetTransportPeriod() const
|
||||
{
|
||||
ASSERT(m_goInfo->type == GAMEOBJECT_TYPE_TRANSPORT);
|
||||
if (m_goValue.Transport.AnimationInfo)
|
||||
return m_goValue.Transport.AnimationInfo->TotalTime;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void Transport::SetTransportState(GOState state, uint32 stopFrame /*= 0*/)
|
||||
{
|
||||
// Do not change the transport state before reaching the last selected destination
|
||||
@@ -497,9 +501,10 @@ void Transport::SetTransportState(GOState state, uint32 stopFrame /*= 0*/)
|
||||
if (state == GO_STATE_TRANSPORT_ACTIVE)
|
||||
{
|
||||
if (GetGoState() >= GO_STATE_TRANSPORT_STOPPED)
|
||||
{
|
||||
stopTimer = m_goValue.Transport.StopFrames->at(GetGoState() - GO_STATE_TRANSPORT_STOPPED);
|
||||
|
||||
SetUInt32Value(GAMEOBJECT_LEVEL, getMSTime() + stopTimer);
|
||||
SetPeriod(stopTimer);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -514,15 +519,16 @@ void Transport::SetTransportState(GOState state, uint32 stopFrame /*= 0*/)
|
||||
|
||||
// forward movement. target frame time - current frame time
|
||||
if (GetCurrentTransportTime() < stopTimer)
|
||||
SetUInt32Value(GAMEOBJECT_LEVEL, getMSTime() + stopTimer - GetCurrentTransportTime());
|
||||
SetPeriod(getMSTime() + stopTimer - GetCurrentTransportTime());
|
||||
else if (backwardsTimer)
|
||||
SetUInt32Value(GAMEOBJECT_LEVEL, getMSTime() + backwardsTimer);
|
||||
SetPeriod(getMSTime() + backwardsTimer);
|
||||
else
|
||||
SetUInt32Value(GAMEOBJECT_LEVEL, getMSTime() + GetCurrentTransportTime() - stopTimer);
|
||||
SetPeriod(getMSTime() + GetCurrentTransportTime() - stopTimer);
|
||||
|
||||
state = GOState(GO_STATE_TRANSPORT_STOPPED + stopFrame);
|
||||
}
|
||||
|
||||
|
||||
SetDestinationStopFrameTime(stopTimer);
|
||||
SetLastStopFrameTime(GetCurrentTransportTime());
|
||||
if (GetCurrentTransportTime() > backwardsTimer)
|
||||
@@ -563,7 +569,7 @@ bool MapTransport::CreateMapTransport(ObjectGuid::LowType guidlow, uint32 entry,
|
||||
_triggeredArrivalEvent = false;
|
||||
_triggeredDepartureEvent = false;
|
||||
|
||||
SetPathProgress(0);
|
||||
m_goValue.Transport.PathProgress = 0;
|
||||
SetPeriod(tInfo->pathTime);
|
||||
SetGoState(!m_goInfo->moTransport.canBeStopped ? GO_STATE_READY : GO_STATE_ACTIVE);
|
||||
SetLocalRotation(0.0f, 0.0f, 0.0f, 1.0f);
|
||||
@@ -765,7 +771,7 @@ Creature* MapTransport::CreateNPCPassenger(ObjectGuid::LowType guid, CreatureDat
|
||||
|
||||
creature->SetTransport(this);
|
||||
creature->m_movementInfo.transport.guid = GetGUID();
|
||||
creature->m_movementInfo.transport.time = GetPathProgress();
|
||||
creature->m_movementInfo.transport.time = GetTimer();
|
||||
creature->m_movementInfo.transport.pos.Relocate(x, y, z, o);
|
||||
CalculatePassengerPosition(x, y, z, &o);
|
||||
creature->Relocate(x, y, z, o);
|
||||
@@ -824,7 +830,7 @@ GameObject* MapTransport::CreateGOPassenger(ObjectGuid::LowType guid, GameObject
|
||||
|
||||
go->SetTransport(this);
|
||||
go->m_movementInfo.transport.guid = GetGUID();
|
||||
go->m_movementInfo.transport.time = GetPathProgress();
|
||||
go->m_movementInfo.transport.time = GetTimer();
|
||||
go->m_movementInfo.transport.pos.Relocate(x, y, z, o);
|
||||
CalculatePassengerPosition(x, y, z, &o);
|
||||
go->Relocate(x, y, z, o);
|
||||
@@ -939,7 +945,7 @@ TempSummon* MapTransport::SummonPassenger(uint32 entry, Position const& pos, Tem
|
||||
summon->SetTransport(this);
|
||||
summon->m_movementInfo.transport.guid = GetGUID();
|
||||
summon->m_movementInfo.transport.pos.Relocate(pos);
|
||||
summon->m_movementInfo.transport.time = GetPathProgress();
|
||||
summon->m_movementInfo.transport.time = GetTimer();
|
||||
summon->Relocate(x, y, z, o);
|
||||
summon->SetHomePosition(x, y, z, o);
|
||||
summon->SetTransportHomePosition(pos);
|
||||
|
||||
@@ -58,10 +58,10 @@ class TC_GAME_API Transport : public GameObject, public TransportBase
|
||||
|
||||
bool IsDynamicTransport() const { return _isDynamicTransport; }
|
||||
|
||||
uint32 GetPathProgress() const { return GetGOValue()->Transport.PathProgress; }
|
||||
void SetPathProgress(uint32 val) { m_goValue.Transport.PathProgress = val; }
|
||||
uint32 GetTransportPeriod() const { return GetUInt32Value(GAMEOBJECT_LEVEL); }
|
||||
void SetPeriod(uint32 period) { SetUInt32Value(GAMEOBJECT_LEVEL, period); }
|
||||
uint32 GetTimer() const { return GetGOValue()->Transport.PathProgress; }
|
||||
|
||||
virtual uint32 GetTransportPeriod() const;
|
||||
void SetTransportState(GOState state, uint32 stopFrame = 0);
|
||||
|
||||
void RelocateToProgress(uint32 progress);
|
||||
@@ -131,9 +131,6 @@ class TC_GAME_API MapTransport : public Transport
|
||||
*/
|
||||
TempSummon* SummonPassenger(uint32 entry, Position const& pos, TempSummonType summonType, SummonPropertiesEntry const* properties = nullptr, uint32 duration = 0, Unit* summoner = nullptr, uint32 spellId = 0, uint32 vehId = 0);
|
||||
|
||||
uint32 GetTransportPeriod() const override { return GetUInt32Value(GAMEOBJECT_LEVEL); }
|
||||
void SetPeriod(uint32 period) { SetUInt32Value(GAMEOBJECT_LEVEL, period); }
|
||||
|
||||
KeyFrameVec const& GetKeyFrames() const { return _transportInfo->keyFrames; }
|
||||
|
||||
void UpdatePosition(float x, float y, float z, float o);
|
||||
|
||||
Reference in New Issue
Block a user