#region Header // _,-'/-'/ // . __,-; ,'( '/ // \. `-.__`-._`:_,-._ _ , . `` // `:-._,------' ` _,`--` -: `_ , ` ,' : // `---..__,,--' (C) 2023 ` -'. -' // # Vita-Nex [http://core.vita-nex.com] # // {o)xxx|===============- # -===============|xxx(o} // # # #endregion #region References using System; using Server; using Server.Network; using Server.Targeting; #endregion namespace VitaNex.Targets { public enum TargetResult { Success, Cancelled, NoAccess, CantSee, OutOfSight, OutOfRange, Invalid } public interface ISelectTarget { Mobile User { get; } TargetResult Result { get; } } public interface ISelectTarget : ISelectTarget { Action SuccessHandler { get; set; } Action FailHandler { get; set; } } /// /// Provides methods for selecting specific Items of the given Type /// /// Type of the TObj to be selected public class GenericSelectTarget : Target, ISelectTarget { /// /// Begin targeting for the specified Mobile with definded handlers /// /// Mobile owner of the new GenericSelectTarget instance /// Success callback /// Failure callback /// Maximum distance allowed /// Allow ground as valid target /// Target flags determine the target action public static void Begin( Mobile m, Action success, Action fail, int range = -1, bool allowGround = false, TargetFlags flags = TargetFlags.None) { if (m != null) { m.Target = new GenericSelectTarget(success, fail, range, allowGround, flags); } } public Mobile User { get; protected set; } public TargetResult Result { get; protected set; } /// /// Gets or sets the Multi display ID /// public int MultiID { get; set; } /// /// Gets or sets the Multi display Hue /// public int MultiHue { get; set; } /// /// Gets or sets the Multi display Offset /// public Point3D MultiOffset { get; set; } /// /// Gets or sets the current Success callback /// public Action SuccessHandler { get; set; } /// /// Gets or sets the current Failure callback /// public Action FailHandler { get; set; } /// /// Create an instance of GenericSelectTarget with handlers /// /// Success handler /// Failure handler public GenericSelectTarget(Action success, Action fail) : base(-1, false, TargetFlags.None) { MultiID = -1; SuccessHandler = success; FailHandler = fail; } public GenericSelectTarget( Action success, Action fail, int range, bool allowGround, TargetFlags flags) : base(range, allowGround, flags) { MultiID = -1; SuccessHandler = success; FailHandler = fail; } public sealed class MultiTargetReq : Packet { public MultiTargetReq(GenericSelectTarget t, bool hs) : base(0x99, hs ? 30 : 26) { m_Stream.Write(t.AllowGround); m_Stream.Write(t.TargetID); m_Stream.Write((byte)t.Flags); m_Stream.Fill(11); m_Stream.Write((short)t.MultiID); m_Stream.Write((short)t.MultiOffset.X); m_Stream.Write((short)t.MultiOffset.Y); m_Stream.Write((short)t.MultiOffset.Z); if (hs) { m_Stream.Write(t.MultiHue); } } } public override Packet GetPacketFor(NetState ns) { User = ns.Mobile; if (MultiID > -1) { return new MultiTargetReq(this, ns.HighSeas); } return base.GetPacketFor(ns); } protected virtual void OnTargetFail() { } /// /// Called when this instance of GenericSelectTarget is cancelled /// /// Mobile owner of the current GenericSelectTarget instance /// CancelType protected override sealed void OnTargetCancel(Mobile from, TargetCancelType cancelType) { base.OnTargetCancel(from, cancelType); Result = TargetResult.Cancelled; OnTargetFail(); if (FailHandler != null) { FailHandler(from); } } /// /// Called when this instance of GenericSelectTarget is checked /// /// Mobile owner of the current GenericSelectTarget instance /// The targeted TObj object protected override sealed void OnTarget(Mobile from, object targeted) { base.OnTarget(from, targeted); if (targeted is TObj) { if (typeof(TObj).IsEqual() || typeof(TObj).IsEqual()) { if (targeted is Item) { targeted = ((Item)targeted).GetWorldLocation(); } else if (targeted is Mobile) { targeted = ((Mobile)targeted).Location; } } Result = TargetResult.Success; OnTarget(from, (TObj)targeted); } else { Result = TargetResult.Invalid; OnTargetFail(); if (FailHandler != null) { FailHandler(from); } } } /// /// Called when this instance of GenericSelectTarget is successful /// /// Mobile owner of the current GenericSelectTarget instance /// The targeted TObj object protected virtual void OnTarget(Mobile from, TObj targeted) { if (SuccessHandler != null) { SuccessHandler(from, targeted); } } protected override void OnTargetNotAccessible(Mobile from, object targeted) { base.OnTargetNotAccessible(from, targeted); Result = TargetResult.NoAccess; } protected override void OnTargetInSecureTrade(Mobile from, object targeted) { base.OnTargetInSecureTrade(from, targeted); Result = TargetResult.NoAccess; } protected override void OnTargetUntargetable(Mobile from, object targeted) { base.OnTargetUntargetable(from, targeted); Result = TargetResult.Invalid; } protected override void OnTargetOutOfLOS(Mobile from, object targeted) { base.OnTargetOutOfLOS(from, targeted); Result = TargetResult.OutOfSight; } protected override void OnTargetOutOfRange(Mobile from, object targeted) { base.OnTargetOutOfRange(from, targeted); Result = TargetResult.OutOfRange; } protected override void OnCantSeeTarget(Mobile from, object targeted) { base.OnCantSeeTarget(from, targeted); Result = TargetResult.CantSee; } } }