aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities/GameObject
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2015-04-23 15:47:50 +0200
committerDDuarte <dnpd.dd@gmail.com>2015-04-29 00:05:47 +0100
commit8b07f1cd4d1714379f8beeea3d13ea0af118de23 (patch)
tree91fdda34a092c341638243db11412f2e8f2acf06 /src/server/game/Entities/GameObject
parent9759aa2cfd4e58831bc071a253cdfa67d6c8d2a9 (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.cpp24
-rw-r--r--src/server/game/Entities/GameObject/GameObject.h1
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); }