From be3199314ab4c8fba31dd29cbc3a79838e5b3138 Mon Sep 17 00:00:00 2001 From: ariel- Date: Sun, 28 Aug 2016 05:25:09 -0300 Subject: 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(-) (limited to 'src/server/game/Entities/GameObject') diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index 9db3fc6a402..6e538b935bf 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; @@ -247,6 +248,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); @@ -1122,7 +1124,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 4fcb31e1722..455e68463e1 100644 --- a/src/server/game/Entities/GameObject/GameObject.h +++ b/src/server/game/Entities/GameObject/GameObject.h @@ -891,6 +891,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) -- cgit v1.2.3