Adds a new [location command for easy display of target XYZ (#97)

This commit is contained in:
Andrew Fryer 2020-04-13 00:35:03 -04:00 committed by GitHub
parent 038c3be258
commit 5fcd3b7505
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 54 additions and 1 deletions

View file

@ -59,6 +59,7 @@ namespace Server.Commands.Generic
Register(new FactionKickCommand(FactionKickType.Unban)); Register(new FactionKickCommand(FactionKickType.Unban));
Register(new BringToPackCommand()); Register(new BringToPackCommand());
Register(new TraceLockdownCommand()); Register(new TraceLockdownCommand());
Register(new LocationCommand());
} }
public static void Register(BaseCommand command) public static void Register(BaseCommand command)
@ -751,7 +752,7 @@ namespace Server.Commands.Generic
{ {
AccessLevel = AccessLevel.GameMaster; AccessLevel = AccessLevel.GameMaster;
Supports = CommandSupport.AllNPCs | CommandSupport.AllItems; Supports = CommandSupport.AllNPCs | CommandSupport.AllItems;
Commands = new[] { "Delete", "Remove" }; Commands = new[] { "Delete", "Remove", "Rm" };
ObjectTypes = ObjectTypes.Both; ObjectTypes = ObjectTypes.Both;
Usage = "Delete"; Usage = "Delete";
Description = "Deletes a targeted item or mobile. Does not delete players."; Description = "Deletes a targeted item or mobile. Does not delete players.";

View file

@ -0,0 +1,52 @@
using Server.Commands.Generic;
using Server.Items;
using Server.Targeting;
using System.Globalization;
using System.Linq;
namespace Server.Commands
{
public class LocationCommand : BaseCommand
{
public LocationCommand() : base()
{
AccessLevel = AccessLevel.Counselor;
Commands = new[] { "Location", "Loc", "Pos" };
ObjectTypes = ObjectTypes.All;
Supports = CommandSupport.Single | CommandSupport.Multi;
Usage = "Location [itemIds ...]";
Description = "Retrieves the positional coordinates of a target. Displaying a message above the item, "
+ "mobile, or environment. Environment targets will also have a graphic temporarily displayed "
+ "on the tile. This graphic can be changed to the provided list of itemIds.";
}
public override void Execute(CommandEventArgs e, object obj)
{
int[] graphics = new[] { 0x17AF, 0X17B0, 0X17B1, 0X17B2 };
if (e.Arguments.Length > 0)
graphics = e.Arguments
.Select(x => int.TryParse(x, out int result)
? result : int.TryParse(x.Substring(2), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out result)
? result : (int?)null)
.Where(x => x.HasValue)
.Select(x => x.Value)
.ToArray();
if (obj is IPoint3D point)
{
var label = $"(x:{point.X}, y:{point.Y}, z:{point.Z})";
if (obj is LandTarget || obj is StaticTarget)
{
var item = EffectItem.Create(new Point3D(point), e.Mobile.Map, EffectItem.DefaultDuration);
foreach (int graphic in graphics)
Effects.SendLocationParticles(item, graphic, 10, 50, 2023);
item.LabelTo(e.Mobile, label);
}
else if (obj is Mobile entity) entity.SayTo(e.Mobile, label);
else if (obj is Item item) item.LabelTo(e.Mobile, label);
AddResponse($"Location: {label}");
}
else
LogFailure("That is not locatable.");
}
}
}