ModernUO/Projects/UOContent/Gumps/AddDoorGump.cs

183 lines
5 KiB
C#

using System;
using Server.Items;
using Server.Network;
namespace Server.Gumps;
public class AddDoorGump : DynamicGump
{
public static void Configure()
{
CommandSystem.Register("AddDoor", AccessLevel.GameMaster, AddDoor_OnCommand);
}
[Usage("AddDoor"), Description("Displays a menu from which you can interactively add doors.")]
public static void AddDoor_OnCommand(CommandEventArgs e)
{
e.Mobile.SendGump(new AddDoorGump());
}
private static readonly (Type Type, int BaseID)[][] _types =
[
// Standard
[
(typeof(MetalDoor), 0x675),
(typeof(RattanDoor), 0x695),
(typeof(DarkWoodDoor), 0x6A5),
(typeof(LightWoodDoor), 0x6D5),
(typeof(StrongWoodDoor), 0x6E5),
(typeof(BarredMetalDoor2), 0x1FED),
],
// Tall
[
(typeof(BarredMetalDoor), 0x685),
(typeof(MediumWoodDoor), 0x6B5),
(typeof(MetalDoor2), 0x6C5),
],
// Short
[
(typeof(IronGate), 0x824),
(typeof(IronGateShort), 0x84C),
(typeof(LightWoodGate), 0x839),
(typeof(DarkWoodGate), 0x866),
],
// Secret
[
(typeof(SecretStoneDoor1), 0xE8),
(typeof(SecretDungeonDoor), 0x314),
(typeof(SecretStoneDoor2), 0x324),
(typeof(SecretWoodenDoor), 0x334),
(typeof(SecretLightWoodDoor), 0x344),
(typeof(SecretStoneDoor3), 0x354)
]
];
private Type _type;
private int _baseId;
private int _page;
public AddDoorGump() : base(50, 40)
{
}
public override bool Singleton => true;
protected override void BuildLayout(ref DynamicGumpBuilder builder)
{
builder.AddPage();
if (_type != null)
{
AddBlueBack(ref builder, 155, 174);
builder.AddItem(25, 24, _baseId);
builder.AddButton(26, 37, 0x5782, 0x5782, 10);
builder.AddItem(47, 45, _baseId + 2);
builder.AddButton(43, 57, 0x5783, 0x5783, 11);
builder.AddItem(87, 22, _baseId + 10);
builder.AddButton(116, 35, 0x5785, 0x5785, 15);
builder.AddItem(65, 45, _baseId + 8);
builder.AddButton(96, 55, 0x5784, 0x5784, 14);
builder.AddButton(73, 36, 0x2716, 0x2716, 18);
}
else
{
var pages = _types.Length;
var types = _types[_page];
AddBlueBack(ref builder, 20 + (types.Length + 1) * 50, 165);
builder.AddHtmlLocalized(30, 45, 60, 20, 1043353, 0x7FFF); // Next
builder.AddHtmlLocalized(30, 85, 60, 20, 1011393, 0x7FFF); // Back
builder.AddButton(30, 60, 0xFA5, 0xFA7, 1);
builder.AddButton(30, 100, 0xFAE, 0xFB0, 2);
for (var i = 0; i < types.Length; i++)
{
var x = (i + 1) * 50;
builder.AddButton(30 + x, 20, 0x2624, 0x2625, _page * types.Length + i + 10);
builder.AddItem(15 + x, 30, types[i].BaseID);
}
}
}
private static void AddBlueBack(ref DynamicGumpBuilder builder, int width, int height)
{
builder.AddBackground(0, 0, width - 00, height - 00, 0xE10);
builder.AddBackground(8, 5, width - 16, height - 11, 0x053);
builder.AddImageTiled(15, 14, width - 29, height - 29, 0xE14);
builder.AddAlphaRegion(15, 14, width - 29, height - 29);
}
public override void OnResponse(NetState sender, in RelayInfo info)
{
var from = sender.Mobile;
var button = info.ButtonID;
if (button == 0)
{
if (_type != null)
{
_type = null;
_baseId = 0;
}
else
{
return;
}
}
else if (button == 1) // Next
{
_page++;
if (_page >= _types.Length)
{
_page = 0;
}
}
else if (button == 2) // Prev
{
_page--;
if (_page < 0)
{
_page = _types.Length - 1;
}
}
else
{
button -= 10;
if (_type == null)
{
var types = _types[_page];
var page = Math.DivRem(button, types.Length, out var pos);
if (page < 0 || pos >= types.Length)
{
return;
}
var door = types[pos];
_type = door.Type;
_baseId = door.BaseID;
}
else if (button is >= 0 and < 8)
{
CommandSystem.Handle(
from,
$"{CommandSystem.Prefix}Add {_type.Name} {(DoorFacing)button}"
);
}
else if (button == 8)
{
CommandSystem.Handle(from, $"{CommandSystem.Prefix}Link");
}
}
from.SendGump(this);
}
}