diff options
| author | Shauren <shauren.trinity@gmail.com> | 2015-04-23 15:47:50 +0200 |
|---|---|---|
| committer | DDuarte <dnpd.dd@gmail.com> | 2015-04-29 00:05:47 +0100 |
| commit | 8b07f1cd4d1714379f8beeea3d13ea0af118de23 (patch) | |
| tree | 91fdda34a092c341638243db11412f2e8f2acf06 /src/server/game/Entities/GameObject | |
| parent | 9759aa2cfd4e58831bc071a253cdfa67d6c8d2a9 (diff) | |
Core/GameObjects: Removed the possibility to spawn transports wih gm commands (such objects did not have any transport mechanics but could still cause crashes)
Closes #14542
(cherry picked from commit 149ff8da879a8286a01081d4ffb1f200a67ddefd)
Conflicts:
src/server/game/Entities/GameObject/GameObject.cpp
src/server/game/Entities/GameObject/GameObject.h
src/server/game/Globals/ObjectMgr.cpp
Diffstat (limited to 'src/server/game/Entities/GameObject')
| -rw-r--r-- | src/server/game/Entities/GameObject/GameObject.cpp | 24 | ||||
| -rw-r--r-- | src/server/game/Entities/GameObject/GameObject.h | 1 |
2 files changed, 24 insertions, 1 deletions
diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index a73cbfa3e5c..6bf737819d7 100644 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -190,6 +190,12 @@ bool GameObject::Create(uint32 guidlow, uint32 name_id, Map* map, uint32 phaseMa return false; } + if (goinfo->type == GAMEOBJECT_TYPE_MAP_OBJ_TRANSPORT) + { + TC_LOG_ERROR("sql.sql", "Gameobject (GUID: " UI64FMTD " Entry: %u) not created: gameobject type GAMEOBJECT_TYPE_MAP_OBJ_TRANSPORT cannot be manually created.", guidlow, name_id); + return false; + } + if (goinfo->type == GAMEOBJECT_TYPE_TRANSPORT) m_updateFlag = (m_updateFlag | UPDATEFLAG_TRANSPORT) & ~UPDATEFLAG_POSITION; @@ -2068,6 +2074,15 @@ void GameObject::SetGoState(GOState state) } } +uint32 GameObject::GetTransportPeriod() const +{ + ASSERT(GetGOInfo()->type == GAMEOBJECT_TYPE_TRANSPORT); + if (m_goValue.Transport.AnimationInfo) + return m_goValue.Transport.AnimationInfo->TotalTime; + + return 0; +} + void GameObject::SetDisplayId(uint32 displayid) { SetUInt32Value(GAMEOBJECT_DISPLAYID, displayid); @@ -2206,9 +2221,16 @@ void GameObject::BuildValuesUpdate(uint8 updateType, ByteBuffer* data, Player* t if (ActivateToQuest(target)) dynFlags |= GO_DYNFLAG_LO_SPARKLE; break; + case GAMEOBJECT_TYPE_TRANSPORT: case GAMEOBJECT_TYPE_MO_TRANSPORT: - pathProgress = int16(float(m_goValue.Transport.PathProgress) / float(GetUInt32Value(GAMEOBJECT_LEVEL)) * 65535.0f); + { + if (uint32 transportPeriod = GetTransportPeriod()) + { + float timer = float(m_goValue.Transport.PathProgress % transportPeriod); + pathProgress = int16(timer / float(transportPeriod) * 65535.0f); + } break; + } default: break; } diff --git a/src/server/game/Entities/GameObject/GameObject.h b/src/server/game/Entities/GameObject/GameObject.h index 844674b2210..b3e8510e2fb 100644 --- a/src/server/game/Entities/GameObject/GameObject.h +++ b/src/server/game/Entities/GameObject/GameObject.h @@ -717,6 +717,7 @@ class GameObject : public WorldObject, public GridObject<GameObject>, public Map void SetGoType(GameobjectTypes type) { SetByteValue(GAMEOBJECT_BYTES_1, 1, type); } GOState GetGoState() const { return GOState(GetByteValue(GAMEOBJECT_BYTES_1, 0)); } void SetGoState(GOState state); + virtual uint32 GetTransportPeriod() const; uint8 GetGoArtKit() const { return GetByteValue(GAMEOBJECT_BYTES_1, 2); } void SetGoArtKit(uint8 artkit); uint8 GetGoAnimProgress() const { return GetByteValue(GAMEOBJECT_BYTES_1, 3); } |
