/// <summary> /// Called every ~5 seconds for Creatures /// </summary> public override void Heartbeat(double currentUnixTime) { var expireItems = new List <WorldObject>(); // added where clause foreach (var wo in EquippedObjects.Values.Where(i => i.EnchantmentManager.HasEnchantments || i.RemainingLifespan.HasValue)) { // FIXME: wo.NextHeartbeatTime is double.MaxValue here //if (wo.NextHeartbeatTime <= currentUnixTime) //wo.Heartbeat(currentUnixTime); // just go by parent heartbeats, only for enchantments? // TODO: handle players dropping / picking up items wo.EnchantmentManager.HeartBeat(CachedHeartbeatInterval); if (wo.RemainingLifespan != null) { wo.RemainingLifespan -= (int)CachedHeartbeatInterval; if (wo.RemainingLifespan <= 0) { expireItems.Add(wo); } } } VitalHeartBeat(); EmoteManager.HeartBeat(); DamageHistory.TryPrune(); // delete items when RemainingLifespan <= 0 foreach (var expireItem in expireItems) { expireItem.DeleteObject(this); if (this is Player player) { player.Session.Network.EnqueueSend(new GameMessageSystemChat($"Its lifespan finished, your {expireItem.Name} crumbles to dust.", ChatMessageType.Broadcast)); } } base.Heartbeat(currentUnixTime); }
/// <summary> /// Called every ~5 seconds for Creatures /// </summary> public override void Heartbeat(double currentUnixTime) { // added where clause foreach (var wo in EquippedObjects.Values.Where(i => i.EnchantmentManager.HasEnchantments)) { // FIXME: wo.NextHeartbeatTime is double.MaxValue here //if (wo.NextHeartbeatTime <= currentUnixTime) //wo.Heartbeat(currentUnixTime); // just go by parent heartbeats, only for enchantments? // TODO: handle players dropping / picking up items wo.EnchantmentManager.HeartBeat(HeartbeatInterval); } VitalHeartBeat(); EmoteManager.HeartBeat(); DamageHistory.TryPrune(); base.Heartbeat(currentUnixTime); }