ModernUO/Projects/UOContent/Items/Misc/FlippableAttribute.cs
Kamron Batman fffda53263
fix: Adds command help, webpage, and fixes issues with other commands (#1669)
### Summary

- Fixes `[AdvancedSearch` being accessible by players 😱 
- Adds `[GenCommands` to generate the same commands html page on https://muo.gg/commands.
- Fixes `[helpinfo` so all commands properly show up!

> [!WARNING]  
> ### Developer Warning:
> Commands must now be registered in the `Configure` bootup phase.
> If a command is not registered early enough, it may not be available to systems like [helpinfo
> that cache their information.

> [!NOTE]  
> ### Developer Note:
> Various commands related to generating content have been changed to _Developer_ and above access level.

### Screenshots
<img width="673" alt="image" src="https://github.com/modernuo/ModernUO/assets/3953314/b105b5c9-5eb4-4ace-93ff-1bfb31e7132f">

<img width="547" alt="image" src="https://github.com/modernuo/ModernUO/assets/3953314/e97487e8-47a5-4aa7-89cc-9fe3deda584d">
2024-02-10 00:19:19 -08:00

93 lines
2.1 KiB
C#

using System;
using Server.Targeting;
namespace Server.Items;
public static class FlipCommandHandlers
{
public static void Configure()
{
CommandSystem.Register("Flip", AccessLevel.GameMaster, Flip_OnCommand);
}
[Usage("Flip"), Description("Turns an item.")]
public static void Flip_OnCommand(CommandEventArgs e)
{
e.Mobile.Target = new FlipTarget();
}
private class FlipTarget : Target
{
public FlipTarget() : base(-1, false, TargetFlags.None)
{
}
protected override void OnTarget(Mobile from, object targeted)
{
if (targeted is not Item item || item.Movable == false && from.AccessLevel == AccessLevel.Player)
{
return;
}
var type = item.GetType();
var array = (FlippableAttribute[])type.GetCustomAttributes(typeof(FlippableAttribute), false);
if (array.Length == 0)
{
return;
}
var fa = array[0];
fa.Flip(item);
}
}
}
[AttributeUsage(AttributeTargets.Class)]
public class DynamicFlippingAttribute : Attribute
{
}
[AttributeUsage(AttributeTargets.Class)]
public class FlippableAttribute : Attribute
{
public FlippableAttribute(params int[] itemIDs) => ItemIDs = itemIDs;
public int[] ItemIDs { get; }
public virtual void Flip(Item item)
{
if (ItemIDs == null || ItemIDs.Length == 0)
{
try
{
item.GetType().GetMethod("Flip", Type.EmptyTypes)?.Invoke(item, Array.Empty<object>());
}
catch
{
// ignored
}
}
else
{
var index = 0;
for (var i = 0; i < ItemIDs.Length; i++)
{
if (item.ItemID == ItemIDs[i])
{
index = i + 1;
break;
}
}
if (index > ItemIDs.Length - 1)
{
index = 0;
}
item.ItemID = ItemIDs[index];
}
}
}