diff options
| author | xinef1 <w.szyszko2@gmail.com> | 2017-03-02 02:19:25 +0100 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2019-08-17 20:04:14 +0200 |
| commit | 60663d1374beef3103f4787152654034fa4a8897 (patch) | |
| tree | 38e07d44442ad903a9729536942e8e253a072274 /src/server/game/Entities/GameObject | |
| parent | 98180ecdc179386270e93b80c0db8344b659557f (diff) | |
Ensure that all actions are compared to fixed point in time (ie. world update start) (#18910)
- Actions will not be dependent on processing moment
- Increased GameObjects cooldown resolution to milliseconds, fixes arming time of traps to be exactly one second and not something from range (1000, 1999)
- Created GameTime namespace and UpdateTime class and moved there some code out of world
(cherrypicked from 7567cafec84080d26ea513242a1f540a823b8f9d)
Diffstat (limited to 'src/server/game/Entities/GameObject')
| -rw-r--r-- | src/server/game/Entities/GameObject/GameObject.cpp | 23 | ||||
| -rw-r--r-- | src/server/game/Entities/GameObject/GameObjectData.h | 2 |
2 files changed, 13 insertions, 12 deletions
diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index 7b38072a9e5..34d4a38e9b3 100644 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -25,6 +25,7 @@ #include "GameObjectAI.h" #include "GameObjectModel.h" #include "GameObjectPackets.h" +#include "GameTime.h" #include "GridNotifiersImpl.h" #include "Group.h" #include "GroupMgr.h" @@ -514,10 +515,10 @@ void GameObject::Update(uint32 diff) // Bombs if (goInfo->trap.charges == 2) // Hardcoded tooltip value - m_cooldownTime = time(NULL) + 10; + m_cooldownTime = GameTime::GetGameTimeMS() + 10 * IN_MILLISECONDS; else if (Unit* owner = GetOwner()) if (owner->IsInCombat()) - m_cooldownTime = time(NULL) + goInfo->trap.startDelay; + m_cooldownTime = GameTime::GetGameTimeMS() + goInfo->trap.startDelay * IN_MILLISECONDS; SetLootState(GO_READY); break; @@ -682,7 +683,7 @@ void GameObject::Update(uint32 diff) GameObjectTemplate const* goInfo = GetGOInfo(); if (goInfo->type == GAMEOBJECT_TYPE_TRAP) { - if (m_cooldownTime >= time(NULL)) + if (GameTime::GetGameTimeMS() < m_cooldownTime) break; // Type 2 (bomb) does not need to be triggered by a unit and despawns after casting its spell. @@ -749,11 +750,11 @@ void GameObject::Update(uint32 diff) { case GAMEOBJECT_TYPE_DOOR: case GAMEOBJECT_TYPE_BUTTON: - if (m_cooldownTime && (m_cooldownTime < time(NULL))) + if (m_cooldownTime && GameTime::GetGameTimeMS() >= m_cooldownTime) ResetDoorOrButton(); break; case GAMEOBJECT_TYPE_GOOBER: - if (m_cooldownTime < time(NULL)) + if (GameTime::GetGameTimeMS() >= m_cooldownTime) { RemoveFlag(GO_FLAG_IN_USE); @@ -792,7 +793,7 @@ void GameObject::Update(uint32 diff) CastSpell(target, goInfo->trap.spell); // Template value or 4 seconds - m_cooldownTime = time(NULL) + (goInfo->trap.cooldown ? goInfo->trap.cooldown : uint32(4)); + m_cooldownTime = GameTime::GetGameTimeMS() + (goInfo->trap.cooldown ? goInfo->trap.cooldown : uint32(4)) * IN_MILLISECONDS; if (goInfo->trap.charges == 1) SetLootState(GO_JUST_DEACTIVATED); @@ -1355,7 +1356,7 @@ void GameObject::UseDoorOrButton(uint32 time_to_restore, bool alternative /* = f SwitchDoorOrButton(true, alternative); SetLootState(GO_ACTIVATED, user); - m_cooldownTime = time_to_restore ? (time(NULL) + time_to_restore) : 0; + m_cooldownTime = GameTime::GetGameTimeMS() + time_to_restore; } void GameObject::SetGoArtKit(uint8 kit) @@ -1413,10 +1414,10 @@ void GameObject::Use(Unit* user) // If cooldown data present in template if (uint32 cooldown = GetGOInfo()->GetCooldown()) { - if (m_cooldownTime > sWorld->GetGameTime()) + if (m_cooldownTime > GameTime::GetGameTime()) return; - m_cooldownTime = sWorld->GetGameTime() + cooldown; + m_cooldownTime = GameTime::GetGameTimeMS() + cooldown * IN_MILLISECONDS; } switch (GetGoType()) @@ -1443,7 +1444,7 @@ void GameObject::Use(Unit* user) if (goInfo->trap.spell) CastSpell(user, goInfo->trap.spell); - m_cooldownTime = time(NULL) + (goInfo->trap.cooldown ? goInfo->trap.cooldown : uint32(4)); // template or 4 seconds + m_cooldownTime = GameTime::GetGameTimeMS() + (goInfo->trap.cooldown ? goInfo->trap.cooldown : uint32(4)) * IN_MILLISECONDS; // template or 4 seconds if (goInfo->trap.charges == 1) // Deactivate after trigger SetLootState(GO_JUST_DEACTIVATED); @@ -1590,7 +1591,7 @@ void GameObject::Use(Unit* user) else SetGoState(GO_STATE_ACTIVE); - m_cooldownTime = time(NULL) + info->GetAutoCloseTime(); + m_cooldownTime = GameTime::GetGameTimeMS() + info->GetAutoCloseTime(); // cast this spell later if provided spellId = info->goober.spell; diff --git a/src/server/game/Entities/GameObject/GameObjectData.h b/src/server/game/Entities/GameObject/GameObjectData.h index 7f8c6e8b977..0bc3dc7e454 100644 --- a/src/server/game/Entities/GameObject/GameObjectData.h +++ b/src/server/game/Entities/GameObject/GameObjectData.h @@ -816,7 +816,7 @@ struct GameObjectTemplate case GAMEOBJECT_TYPE_TRAPDOOR: autoCloseTime = trapdoor.autoClose; break; default: break; } - return autoCloseTime / IN_MILLISECONDS; // prior to 3.0.3, conversion was / 0x10000; + return autoCloseTime; // prior to 3.0.3, conversion was / 0x10000; } uint32 GetLootId() const |
