diff options
author | ariel- <ariel-@users.noreply.github.com> | 2016-08-28 05:25:09 -0300 |
---|---|---|
committer | ariel- <ariel-@users.noreply.github.com> | 2016-08-28 05:32:39 -0300 |
commit | be3199314ab4c8fba31dd29cbc3a79838e5b3138 (patch) | |
tree | 82aaccc602d94228ce31aa521d0857f8ecf0fc94 /src | |
parent | 17917171f3bb7d8c5727a1611ed017ebeccf5ae7 (diff) |
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
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/GameObject/GameObject.cpp | 6 | ||||
-rw-r--r-- | src/server/game/Entities/GameObject/GameObject.h | 2 |
2 files changed, 7 insertions, 1 deletions
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<GameObject> 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<ObjectGuid::LowType> m_SkillupList; ObjectGuid m_ritualOwnerGUID; // used for GAMEOBJECT_TYPE_SUMMONING_RITUAL where GO is not summoned (no owner) |