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
}
}
}