ace/Source/ACE.Server/WorldObjects/Container_Tick.cs
Ty Conner bc13aaf444
Switch Lifespan to RealTime instead of GameTime (#2543)
* Switch Lifespan to RealTime instead of GameTime

* Update WorldObject_Tick.cs

* Update WorldObject_Tick.cs
2019-12-19 03:53:27 -05:00

67 lines
2.3 KiB
C#

using System.Collections.Generic;
using System.Linq;
using ACE.Entity.Enum;
using ACE.Server.Network.GameMessages.Messages;
namespace ACE.Server.WorldObjects
{
partial class Container
{
public override void Heartbeat(double currentUnixTime)
{
// TODO: fix bug for landblock containers w/ no heartbeat
Inventory_Tick(this);
foreach (var subcontainer in Inventory.Values.OfType<Container>())
subcontainer.Inventory_Tick(this);
// for landblock containers
if (IsOpen && CurrentLandblock != null)
{
var viewer = CurrentLandblock.GetObject(Viewer) as Player;
if (viewer == null)
{
Close(null);
return;
}
var withinUseRadius = CurrentLandblock.WithinUseRadius(viewer, Guid, out var targetValid);
if (!withinUseRadius)
{
Close(viewer);
return;
}
}
base.Heartbeat(currentUnixTime);
}
public void Inventory_Tick(Container rootOwner)
{
var expireItems = new List<WorldObject>();
// added where clause
foreach (var wo in Inventory.Values.Where(i => i.EnchantmentManager.HasEnchantments || i.Lifespan.HasValue))
{
// FIXME: wo.NextHeartbeatTime is double.MaxValue here
//if (wo.NextHeartbeatTime <= currentUnixTime)
//wo.Heartbeat(currentUnixTime);
// just go by parent heartbeats, only for enchantments?
if (wo.EnchantmentManager.HasEnchantments)
wo.EnchantmentManager.HeartBeat(CachedHeartbeatInterval);
if (wo.IsLifespanSpent)
expireItems.Add(wo);
}
// delete items when RemainingLifespan <= 0
foreach (var expireItem in expireItems)
{
expireItem.DeleteObject(rootOwner);
if (rootOwner is Player player)
player.Session.Network.EnqueueSend(new GameMessageSystemChat($"Its lifespan finished, your {expireItem.Name} crumbles to dust.", ChatMessageType.Broadcast));
}
}
}
}