diff --git a/Source/Framework/Constants/SharedConst.cs b/Source/Framework/Constants/SharedConst.cs index 47aeabaff..9a0569a0c 100644 --- a/Source/Framework/Constants/SharedConst.cs +++ b/Source/Framework/Constants/SharedConst.cs @@ -245,6 +245,7 @@ namespace Framework.Constants public const float DefaultVisibilityInstance = 170.0f; // default visible distance in instances, 170 yards public const float DefaultVisibilityBGAreans = 533.0f; // default visible distance in BG/Arenas, roughly 533 yards public const int DefaultVisibilityNotifyPeriod = 1000; + public static TimeSpan HeartbeatInterval = TimeSpan.FromSeconds(5.2); public const int WorldTrigger = 12999; diff --git a/Source/Game/Entities/Object/WorldObject.cs b/Source/Game/Entities/Object/WorldObject.cs index 3976891d9..1336bdf08 100644 --- a/Source/Game/Entities/Object/WorldObject.cs +++ b/Source/Game/Entities/Object/WorldObject.cs @@ -41,6 +41,8 @@ namespace Game.Entities m_objectData = new ObjectFieldData(); m_staticFloorZ = MapConst.VMAPInvalidHeightValue; + + _heartbeatTimer = SharedConst.HeartbeatInterval; } public virtual void Dispose() @@ -992,8 +994,17 @@ namespace Game.Entities public virtual void Update(uint diff) { m_Events.Update(diff); + + _heartbeatTimer -= TimeSpan.FromMilliseconds(diff); + while (_heartbeatTimer <= TimeSpan.Zero) + { + _heartbeatTimer += SharedConst.HeartbeatInterval; + Heartbeat(); + } } + public virtual void Heartbeat() { } + public void SetIsStoredInWorldObjectGridContainer(bool on) { if (!IsInWorld) @@ -3859,6 +3870,8 @@ namespace Game.Entities SmoothPhasing _smoothPhasing; + TimeSpan _heartbeatTimer; + public FlaggedArray32 m_stealth = new(2); public FlaggedArray32 m_stealthDetect = new(2);