using System;
using Server.Mobiles;
using Server.Network;
using Server.Items;
using System.Collections.Generic;
using Server.Targeting;
using Server.SkillHandlers;
using System.Linq;
namespace Server.Gumps
{
public class ImbuingGump : BaseGump
{
private const int LabelColor = 0x7FFF;
public ImbuingGump(PlayerMobile pm)
: base(pm, 25, 50)
{
User.CloseGump(typeof(ImbueSelectGump));
User.CloseGump(typeof(ImbueGump));
}
public override void AddGumpLayout()
{
ImbuingContext context = Imbuing.GetContext(User);
context.Imbue_ModVal = 0;
context.ImbMenu_Cat = 0;
AddPage(0);
AddBackground(0, 0, 520, 310, 5054);
AddImageTiled(10, 10, 500, 290, 2624);
AddImageTiled(10, 30, 500, 10, 5058);
AddImageTiled(10, 270, 500, 10, 5058);
AddAlphaRegion(10, 10, 520, 310);
AddHtmlLocalized(10, 12, 520, 20, 1079588, LabelColor, false, false); //
IMBUING MENU
AddButton(15, 60, 4005, 4007, 10005, GumpButtonType.Reply, 0);
AddHtmlLocalized(50, 60, 430, 20, 1080432, LabelColor, false, false); //Imbue Item - Adds or modifies an item property on an item
AddButton(15, 90, 4005, 4007, 10006, GumpButtonType.Reply, 0);
AddHtmlLocalized(50, 90, 430, 20, 1113622, LabelColor, false, false); //Reimbue Last - Repeats the last imbuing attempt
AddButton(15, 120, 4005, 4007, 10007, GumpButtonType.Reply, 0);
AddHtmlLocalized(50, 120, 430, 20, 1113571, LabelColor, false, false); //Imbue Last Item - Auto targets the last imbued item
AddButton(15, 150, 4005, 4007, 10008, GumpButtonType.Reply, 0);
AddHtmlLocalized(50, 150, 430, 20, 1114274, LabelColor, false, false); //Imbue Last Property - Imbues a new item with the last property
AddButton(15, 180, 4005, 4007, 10010, GumpButtonType.Reply, 0);
AddHtmlLocalized(50, 180, 470, 20, 1080431, LabelColor, false, false); //Unravel Item - Extracts magical ingredients User an item, destroying it
AddButton(15, 210, 4005, 4007, 10011, GumpButtonType.Reply, 0);
AddHtmlLocalized(50, 210, 430, 20, 1114275, LabelColor, false, false); //Unravel Container - Unravels all items in a container
AddButton(15, 280, 4017, 4019, 1, GumpButtonType.Reply, 0);
AddHtmlLocalized(50, 280, 50, 20, 1011012, LabelColor, false, false); //CANCEL
}
public override void OnResponse(RelayInfo info)
{
ImbuingContext context = Imbuing.GetContext(User);
switch (info.ButtonID)
{
case 0: // Close
case 1:
{
User.EndAction(typeof(Imbuing));
break;
}
case 10005: // Imbue Item
{
User.SendLocalizedMessage(1079589); //Target an item you wish to imbue.
User.Target = new ImbueItemTarget();
User.Target.BeginTimeout(User, TimeSpan.FromSeconds(10.0));
break;
}
case 10006: // Reimbue Last
{
Item item = context.LastImbued;
int mod = context.Imbue_Mod;
int modint = context.Imbue_ModInt;
if (item == null || mod < 0 || modint == 0)
{
User.SendLocalizedMessage(1113572); // You haven't imbued anything yet!
User.EndAction(typeof(Imbuing));
break;
}
if (Imbuing.CanImbueItem(User, item) && Imbuing.OnBeforeImbue(User, item, mod, modint))
{
Imbuing.TryImbueItem(User, item, mod, modint);
ImbueGump.SendGumpDelayed(User);
}
break;
}
case 10007: // Imbue Last Item
{
Item item = context.LastImbued;
int mod = context.Imbue_Mod;
int modint = context.Imbue_ModInt;
if (context.LastImbued == null)
{
User.SendLocalizedMessage(1113572); // You haven't imbued anything yet!
User.EndAction(typeof(Imbuing));
break;
}
else
{
ImbueStep1(User, item);
}
break;
}
case 10008: // Imbue Last Property
{
context.LastImbued = null;
int mod = context.Imbue_Mod;
int modint = context.Imbue_ModInt;
if (modint < 0)
modint = 0;
if (mod < 0)
{
User.SendLocalizedMessage(1113572); // You haven't imbued anything yet!
User.EndAction(typeof(Imbuing));
break;
}
else
{
ImbueLastProp(User, mod, modint);
}
break;
}
case 10010: // Unravel Item
{
User.SendLocalizedMessage(1080422); // Target an item you wish to magically unravel.
User.Target = new UnravelTarget();
User.Target.BeginTimeout(User, TimeSpan.FromSeconds(10.0));
break;
}
case 10011: // Unravel Container
{
User.SendLocalizedMessage(1080422); // Target an item you wish to magically unravel.
User.Target = new UnravelContainerTarget();
User.Target.BeginTimeout(User, TimeSpan.FromSeconds(10.0));
break;
}
}
return;
}
private class UnravelTarget : Target
{
public UnravelTarget()
: base(-1, false, TargetFlags.None)
{
AllowNonlocal = true;
}
protected override void OnTarget(Mobile m, object o)
{
m.EndAction(typeof(Imbuing));
Item item = o as Item;
if (item == null)
{
m.SendLocalizedMessage(1080425); // You cannot magically unravel this item.
}
else if (m is PlayerMobile && Imbuing.CanUnravelItem(m, item))
{
m.BeginAction(typeof(Imbuing));
BaseGump.SendGump(new UnravelGump((PlayerMobile)m, item));
}
}
protected override void OnTargetCancel(Mobile User, TargetCancelType cancelType)
{
User.EndAction(typeof(Imbuing));
}
private class UnravelGump : BaseGump
{
private Item m_Item;
public UnravelGump(PlayerMobile pm, Item item)
: base(pm, 60, 36)
{
m_Item = item;
}
public override void AddGumpLayout()
{
AddPage(0);
AddBackground(0, 0, 520, 245, 5054);
AddImageTiled(10, 10, 500, 225, 2624);
AddImageTiled(10, 30, 500, 10, 5058);
AddImageTiled(10, 202, 500, 10, 5058);
AddAlphaRegion(10, 10, 500, 225);
AddHtmlLocalized(10, 12, 520, 20, 1112402, LabelColor, false, false); // UNRAVEL MAGIC ITEM CONFIRMATION
AddHtmlLocalized(15, 58, 490, 113, 1112403, true, true); // WARNING! You have targeted an item made out of special material.
This item will be DESTROYED.
Are you sure you wish to unravel this item?
AddButton(10, 180, 4005, 4007, 1, GumpButtonType.Reply, 0);
AddHtmlLocalized(45, 180, 430, 20, 1114292, LabelColor, false, false); // Unravel Item
AddButton(10, 212, 4017, 4019, 0, GumpButtonType.Reply, 0);
AddHtmlLocalized(45, 212, 50, 20, 1011012, LabelColor, false, false); // CANCEL
}
public override void OnResponse(RelayInfo info)
{
User.EndAction(typeof(Imbuing));
if (info.ButtonID == 0 || m_Item.Deleted)
return;
if (Imbuing.CanUnravelItem(User, m_Item) && Imbuing.UnravelItem(User, m_Item))
{
Effects.SendPacket(User, User.Map, new GraphicalEffect(EffectType.FixedFrom, User.Serial, Server.Serial.Zero, 0x375A, User.Location, User.Location, 1, 17, true, false));
User.PlaySound(0x1EB);
User.SendLocalizedMessage(1080429); // You magically unravel the item!
User.SendLocalizedMessage(1072223); // An item has been placed in your backpack.
}
}
}
}
private class UnravelContainerTarget : Target
{
public UnravelContainerTarget() : base(-1, false, TargetFlags.None)
{
}
protected override void OnTarget(Mobile m, object o)
{
m.EndAction(typeof(Imbuing));
Container cont = o as Container;
if (cont == null)
return;
if (!cont.IsChildOf(m.Backpack))
{
m.SendLocalizedMessage(1062334); // This item must be in your backpack to be used.
m.EndAction(typeof(Imbuing));
}
else if (cont == null || (cont is LockableContainer && ((LockableContainer)cont).Locked))
{
m.SendLocalizedMessage(1111814, "0\t0"); // Unraveled: ~1_COUNT~/~2_NUM~ items
m.EndAction(typeof(Imbuing));
}
else if (m is PlayerMobile)
{
bool unraveled = cont.Items.FirstOrDefault(x => Imbuing.CanUnravelItem(m, x, false)) != null;
if (unraveled)
{
m.BeginAction(typeof(Imbuing));
BaseGump.SendGump(new UnravelContainerGump((PlayerMobile)m, cont));
}
else
{
TryUnravelContainer(m, cont);
m.EndAction(typeof(Imbuing));
}
}
}
protected override void OnTargetCancel(Mobile User, TargetCancelType cancelType)
{
User.EndAction(typeof(Imbuing));
}
public static void TryUnravelContainer(Mobile User, Container c)
{
c.Items.ForEach(y =>
{
Imbuing.CanUnravelItem(User, y, true);
});
User.SendLocalizedMessage(1111814, String.Format("{0}\t{1}", 0, c.Items.Count)); // Unraveled: ~1_COUNT~/~2_NUM~ items
}
private class UnravelContainerGump : BaseGump
{
private Container m_Container;
private List- m_List;
public UnravelContainerGump(PlayerMobile pm, Container c)
: base(pm, 25, 50)
{
m_Container = c;
m_List = new List
- (c.Items);
}
public override void AddGumpLayout()
{
AddPage(0);
AddBackground(0, 0, 520, 245, 5054);
AddImageTiled(10, 10, 500, 225, 2624);
AddImageTiled(10, 30, 500, 10, 5058);
AddImageTiled(10, 202, 500, 10, 5058);
AddAlphaRegion(10, 10, 500, 225);
AddHtmlLocalized(10, 12, 520, 20, 1112402, LabelColor, false, false); // UNRAVEL MAGIC ITEM CONFIRMATION
AddHtmlLocalized(15, 58, 490, 113, 1112404, true, true); // WARNING! The selected container contains items made with a special material.
These items will be DESTROYED.
Do you wish to unravel these items as well?
AddButton(10, 180, 4005, 4007, 1, GumpButtonType.Reply, 0);
AddHtmlLocalized(45, 180, 430, 20, 1049717, LabelColor, false, false); // YES
AddButton(10, 212, 4017, 4019, 0, GumpButtonType.Reply, 0);
AddHtmlLocalized(45, 212, 50, 20, 1049718, LabelColor, false, false); // NO
}
public override void OnResponse(RelayInfo info)
{
User.EndAction(typeof(Imbuing));
if (m_Container == null || m_List == null)
return;
if (info.ButtonID == 0)
{
TryUnravelContainer(User, m_Container);
return;
}
int count = 0;
m_List.ForEach(x =>
{
if (Imbuing.CanUnravelItem(User, x, true) && Imbuing.UnravelItem(User, x, true))
{
count++;
}
});
if (count > 0)
{
User.SendLocalizedMessage(1080429); // You magically unravel the item!
User.SendLocalizedMessage(1072223); // An item has been placed in your backpack.
}
User.SendLocalizedMessage(1111814, String.Format("{0}\t{1}", count, m_List.Count));
ColUtility.Free(m_List);
}
}
}
private class ImbueItemTarget : Target
{
public ImbueItemTarget()
: base(-1, false, TargetFlags.None)
{
AllowNonlocal = true;
}
protected override void OnTarget(Mobile m, object o)
{
Item item = o as Item;
if (item == null)
{
m.SendLocalizedMessage(1079576); // You cannot imbue this item.
return;
}
ImbuingContext context = Imbuing.GetContext(m);
var itemType = ItemPropertyInfo.GetItemType(item);
if (itemType == ItemType.Invalid)
{
m.SendLocalizedMessage(1079576); // You cannot imbue this item.
return;
}
ImbueStep1(m, item);
}
protected override void OnTargetCancel(Mobile m, TargetCancelType cancelType)
{
m.EndAction(typeof(Imbuing));
}
}
public static void ImbueStep1(Mobile m, Item item)
{
if (m is PlayerMobile && Imbuing.CanImbueItem(m, item))
{
ImbuingContext context = Imbuing.GetContext(m);
context.LastImbued = item;
if (context.ImbMenu_Cat == 0)
context.ImbMenu_Cat = 1;
m.CloseGump(typeof(ImbuingGump));
BaseGump.SendGump(new ImbueSelectGump((PlayerMobile)m, item));
}
}
public static void ImbueLastProp(Mobile m, int Mod, int Mint)
{
m.Target = new ImbueLastModTarget();
}
private class ImbueLastModTarget : Target
{
public ImbueLastModTarget()
: base(-1, false, TargetFlags.None)
{
AllowNonlocal = true;
}
protected override void OnTarget(Mobile m, object o)
{
Item item = o as Item;
if (item == null || !(m is PlayerMobile))
{
m.SendLocalizedMessage(1079576); // You cannot imbue this item.
return;
}
ImbuingContext context = Imbuing.GetContext(m);
int mod = context.Imbue_Mod;
int modInt = context.Imbue_ModInt;
if (!Imbuing.CanImbueItem(m, item) || !Imbuing.OnBeforeImbue(m, item, mod, modInt) || !Imbuing.CanImbueProperty(m, item, mod))
{
ImbueGump.SendGumpDelayed((PlayerMobile)m);
}
else
{
Imbuing.TryImbueItem(m, item, mod, modInt);
ImbueGump.SendGumpDelayed((PlayerMobile)m);
}
}
protected override void OnTargetCancel(Mobile m, TargetCancelType cancelType)
{
m.EndAction(typeof(Imbuing));
}
}
}
}