From 46866bad047498e7e86d6873c0d635750ebc51b8 Mon Sep 17 00:00:00 2001 From: ariel- Date: Sat, 16 Dec 2017 05:00:35 -0300 Subject: [PATCH] Core/GameObject: implement dismount on use of certain GOs - The fact of player dismounting was entirely client-sided, with no server code enforcing it. Closes #19979 # Conflicts: # src/server/game/Entities/GameObject/GameObject.cpp --- .../game/Entities/GameObject/GameObjectData.h | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/server/game/Entities/GameObject/GameObjectData.h b/src/server/game/Entities/GameObject/GameObjectData.h index 920efabda6..71a8e99a2f 100644 --- a/src/server/game/Entities/GameObject/GameObjectData.h +++ b/src/server/game/Entities/GameObject/GameObjectData.h @@ -453,6 +453,20 @@ struct GameObjectTemplate } } + bool DismountOnUse() const + { + switch (type) + { + case GAMEOBJECT_TYPE_MAILBOX: return false; + case GAMEOBJECT_TYPE_BARBER_CHAIR: return true; + default: + { + // this part not implemented properly, missing an internal check + return (GetPropNum(0x5B) >= uint32(0x18)); + } + } + } + uint32 GetLockId() const { switch (type) @@ -615,6 +629,20 @@ struct GameObjectTemplate void InitializeQueryData(); WorldPacket BuildQueryData(LocaleConstant loc) const; + +private: + static std::vector const _goTypeProperties[MAX_GAMEOBJECT_TYPE]; + + uint32 GetPropNum(int32 propNum) const + { + if (type >= MAX_GAMEOBJECT_TYPE || propNum >= 0x81) + return uint32(-1); + + auto itr = std::find(_goTypeProperties[type].begin(), _goTypeProperties[type].end(), propNum); + if (itr == _goTypeProperties[type].end()) + return uint32(-1); + return uint32(std::distance(_goTypeProperties[type].begin(), itr)); + } }; // From `gameobject_template_addon`