From 46cad2a53c4a5710292f9ff3d3a6284d6ed388a4 Mon Sep 17 00:00:00 2001 From: Ovahlord Date: Sat, 23 Jun 2018 17:53:56 +0200 Subject: [PATCH] Core/Transports: fixed generic elevators such as in Orgrimmar * fixed Lady Deathwhisper's Elevator * use a better value for returning to stop frame 0 --- .../game/Entities/GameObject/GameObject.cpp | 32 +++++++++---------- .../game/Entities/GameObject/GameObject.h | 1 - .../game/Entities/GameObject/GameObjectData.h | 22 ++++++------- src/server/game/Entities/Object/Object.cpp | 2 +- 4 files changed, 27 insertions(+), 30 deletions(-) diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index 0c7ab9dbd1..cd34a9258e 100644 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -297,18 +297,20 @@ bool GameObject::Create(ObjectGuid::LowType guidlow, uint32 name_id, Map* map, u m_goValue.Transport.PathProgress -= m_goValue.Transport.PathProgress % GetTransportPeriod(); // align to period m_goValue.Transport.CurrentSeg = 0; m_goValue.Transport.StateUpdateTimer = 0; - m_goValue.Transport.CurrentStopFrameIndex = 0; m_goValue.Transport.StopFrames = new std::vector(); - m_goValue.Transport.StopFrames->push_back(0); // assign default stop frame - if (goinfo->transport.stopFrame1 > 0) - m_goValue.Transport.StopFrames->push_back(goinfo->transport.stopFrame1); - if (goinfo->transport.stopFrame2 > 0) - m_goValue.Transport.StopFrames->push_back(goinfo->transport.stopFrame2); - if (goinfo->transport.stopFrame3 > 0) - m_goValue.Transport.StopFrames->push_back(goinfo->transport.stopFrame3); - if (goinfo->transport.stopFrame4 > 0) - m_goValue.Transport.StopFrames->push_back(goinfo->transport.stopFrame4); + if (goinfo->transport.Timeto2ndfloor > 0) + { + if (!goinfo->transport.startOpen) + m_goValue.Transport.StopFrames->push_back(0); + m_goValue.Transport.StopFrames->push_back(goinfo->transport.Timeto2ndfloor); + } + if (goinfo->transport.Timeto3rdfloor > 0) + m_goValue.Transport.StopFrames->push_back(goinfo->transport.Timeto3rdfloor); + if (goinfo->transport.Timeto4thfloor > 0) + m_goValue.Transport.StopFrames->push_back(goinfo->transport.Timeto4thfloor); + if (goinfo->transport.Timeto5thfloor > 0) + m_goValue.Transport.StopFrames->push_back(goinfo->transport.Timeto5thfloor); if (goinfo->transport.startOpen) SetTransportState(GO_STATE_TRANSPORT_STOPPED, goinfo->transport.startOpen - 1); else @@ -2228,7 +2230,7 @@ void GameObject::SetTransportState(GOState state, uint32 stopFrame /*= 0*/) m_goValue.Transport.StateUpdateTimer = 0; m_goValue.Transport.PathProgress = getMSTime(); if (GetGoState() >= GO_STATE_TRANSPORT_STOPPED) - m_goValue.Transport.StopFrames->at(GetGoState() - GO_STATE_TRANSPORT_STOPPED); + m_goValue.Transport.PathProgress += m_goValue.Transport.StopFrames->at(GetGoState() - GO_STATE_TRANSPORT_STOPPED); SetGoState(GO_STATE_TRANSPORT_ACTIVE); } else @@ -2237,14 +2239,10 @@ void GameObject::SetTransportState(GOState state, uint32 stopFrame /*= 0*/) ASSERT(stopFrame < m_goValue.Transport.StopFrames->size()); uint32 stopFrameTime = m_goValue.Transport.StopFrames->at(stopFrame); - - // If we return to StopFrame 0 we are going to use the sum of passed transport frames to get a valid travel time to avoid "teleports" - if (!stopFrame) - for (uint8 i = 0; i <= m_goValue.Transport.CurrentStopFrameIndex; i++) - stopFrameTime += m_goValue.Transport.StopFrames->at(i); + if (!stopFrameTime) // returning to a previous stop frame that has no travel time (e.g. stop frame at 0ms) + stopFrameTime = m_goValue.Transport.StopFrames->at(stopFrame + 1); m_goValue.Transport.PathProgress = getMSTime() + stopFrameTime; - m_goValue.Transport.CurrentStopFrameIndex = stopFrame; SetGoState(GOState(GO_STATE_TRANSPORT_STOPPED + stopFrame)); } diff --git a/src/server/game/Entities/GameObject/GameObject.h b/src/server/game/Entities/GameObject/GameObject.h index 8269b54d7b..6fb21709ad 100644 --- a/src/server/game/Entities/GameObject/GameObject.h +++ b/src/server/game/Entities/GameObject/GameObject.h @@ -41,7 +41,6 @@ union GameObjectValue struct { uint32 PathProgress; - uint32 CurrentStopFrameIndex; TransportAnimation const* AnimationInfo; uint32 CurrentSeg; std::vector* StopFrames; diff --git a/src/server/game/Entities/GameObject/GameObjectData.h b/src/server/game/Entities/GameObject/GameObjectData.h index d86d2bd444..6dd2621ea6 100644 --- a/src/server/game/Entities/GameObject/GameObjectData.h +++ b/src/server/game/Entities/GameObject/GameObjectData.h @@ -197,17 +197,17 @@ struct GameObjectTemplate //11 GAMEOBJECT_TYPE_TRANSPORT struct { - int32 stopFrame1; //0 - uint32 startOpen; //1 - uint32 autoCloseTime; //2 secs till autoclose = autoCloseTime / 0x10000 - uint32 pause1EventID; //3 - uint32 pause2EventID; //4 - uint32 mapId; //5 - int32 stopFrame2; //6 - uint32 unknown; - int32 stopFrame3; //8 - uint32 unknown2; - int32 stopFrame4; //10 + uint32 Timeto2ndfloor; // 0 Time to 2nd floor (ms), int, Min value: 0, Max value: 2147483647, Default value: 0 + uint32 startOpen; // 1 startOpen, enum { false, true, }; Default: false + uint32 autoCloseTime; // 2 autoClose (ms), int, Min value: 0, Max value: 2147483647, Default value: 0 + uint32 Reached1stfloor; // 3 Reached 1st floor, References: GameEvents, NoValue = 0 + uint32 Reached2ndfloor; // 4 Reached 2nd floor, References: GameEvents, NoValue = 0 + int32 SpawnMap; // 5 Spawn Map, References: Map, NoValue = -1 + uint32 Timeto3rdfloor; // 6 Time to 3rd floor (ms), int, Min value: 0, Max value: 2147483647, Default value: 0 + uint32 Reached3rdfloor; // 7 Reached 3rd floor, References: GameEvents, NoValue = 0 + uint32 Timeto4thfloor; // 8 Time to 4th floor (ms), int, Min value: 0, Max value: 2147483647, Default value: 0 + uint32 Reached4thfloor; // 9 Reached 4th floor, References: GameEvents, NoValue = 0 + uint32 Timeto5thfloor; // 10 Time to 5th floor (ms), int, Min value: 0, Max value: 2147483647, Default value: 0 } transport; //12 GAMEOBJECT_TYPE_AREADAMAGE struct diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index 622b679a07..727ca5c286 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -424,7 +424,7 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint16 flags) const ObjectGuid transGuid = self->m_movementInfo.transport.guid; data->WriteBit(transGuid[1]); - data->WriteBit(hasTransportTime2); // Has transport time 2 + data->WriteBit(hasTransportTime2); // Has transport time 2 data->WriteBit(transGuid[4]); data->WriteBit(transGuid[0]); data->WriteBit(transGuid[6]);