mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-24 02:46:33 +01:00
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
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -903,6 +903,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)
|
||||
|
||||
Reference in New Issue
Block a user