using System; using ACE.Common; using ACE.Entity; using ACE.Entity.Enum; using ACE.Entity.Enum.Properties; using ACE.Entity.Models; using ACE.Server.Network.GameMessages.Messages; namespace ACE.Server.WorldObjects { /// /// Activates an object based on collision /// public class PressurePlate : WorldObject { /// /// The last time this pressure plate was activated /// public DateTime LastUseTime; /// /// A new biota be created taking all of its values from weenie. /// public PressurePlate(Weenie weenie, ObjectGuid guid) : base(weenie, guid) { SetEphemeralValues(); } /// /// Restore a WorldObject from the database. /// public PressurePlate(Biota biota) : base(biota) { SetEphemeralValues(); } private void SetEphemeralValues() { if (UseSound == 0) UseSound = Sound.TriggerActivated; } public override void SetLinkProperties(WorldObject wo) { wo.ActivationTarget = Guid.Full; } /// /// Called when a player runs over the pressure plate /// public override void OnCollideObject(WorldObject wo) { OnActivate(wo); } /// /// Activates the object linked to a pressure plate /// public override void OnActivate(WorldObject activator) { // handle monsters walking on pressure plates if (!(activator is Player player)) return; // prevent continuous event stream // TODO: should this go in base.OnActivate()? var currentTime = DateTime.UtcNow; if (currentTime < LastUseTime + TimeSpan.FromSeconds(2)) return; LastUseTime = currentTime; player.EnqueueBroadcast(new GameMessageSound(player.Guid, UseSound)); if (Time.GetUnixTime() < ResetTimestamp) { var activationFailure = GetProperty(PropertyString.ActivationFailure); if (activationFailure != null) { player.Session.Network.EnqueueSend(new GameMessageSystemChat(activationFailure, ChatMessageType.Broadcast)); } } else { base.OnActivate(activator); if (ResetInterval > 0) { ResetTimestamp = Time.GetFutureUnixTime(ResetInterval ?? 0); } } } public override void ActOnUse(WorldObject wo) { // Do nothing } } }