From a6ab7196ca1d62bdecb55d5d91b99e146e6bd35a Mon Sep 17 00:00:00 2001 From: ariel- Date: Sun, 28 Aug 2016 05:25:09 -0300 Subject: [PATCH] Core/GameObject: save spawn GOState and reset to it instead of toggling from whatever current state we have Prevents exploit of SMART_ACTION_ACTIVATE_GOBJECT --- src/server/game/Entities/GameObject/GameObject.cpp | 6 +++++- src/server/game/Entities/GameObject/GameObject.h | 2 ++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index 320c5dbb5f2..1f2a37da56f 100644 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -49,6 +49,7 @@ GameObject::GameObject() : WorldObject(false), MapObject(), m_usetimes = 0; m_spellId = 0; m_cooldownTime = 0; + m_prevGoState = GO_STATE_ACTIVE; m_goInfo = nullptr; m_goData = nullptr; m_packedRotation = 0; @@ -248,6 +249,7 @@ bool GameObject::Create(ObjectGuid::LowType guidlow, uint32 name_id, Map* map, u m_model = CreateModel(); // GAMEOBJECT_BYTES_1, index at 0, 1, 2 and 3 SetGoType(GameobjectTypes(goinfo->type)); + m_prevGoState = go_state; SetGoState(go_state); SetGoArtKit(artKit); @@ -1162,7 +1164,9 @@ void GameObject::ResetDoorOrButton() if (m_lootState == GO_READY || m_lootState == GO_JUST_DEACTIVATED) return; - SwitchDoorOrButton(false); + RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE); + SetGoState(m_prevGoState); + SetLootState(GO_JUST_DEACTIVATED); m_cooldownTime = 0; } diff --git a/src/server/game/Entities/GameObject/GameObject.h b/src/server/game/Entities/GameObject/GameObject.h index 984989becad..5431656ba4c 100644 --- a/src/server/game/Entities/GameObject/GameObject.h +++ b/src/server/game/Entities/GameObject/GameObject.h @@ -903,6 +903,8 @@ class TC_GAME_API GameObject : public WorldObject, public GridObject bool m_spawnedByDefault; time_t m_cooldownTime; // used as internal reaction delay time store (not state change reaction). // For traps this: spell casting cooldown, for doors/buttons: reset time. + GOState m_prevGoState; // What state to set whenever resetting + std::list m_SkillupList; ObjectGuid m_ritualOwnerGUID; // used for GAMEOBJECT_TYPE_SUMMONING_RITUAL where GO is not summoned (no owner)