RunUO/Scripts/Engines/Craft/Core/CraftQueueGump.cs

191 lines
7 KiB
C#

using System;
using Server.Gumps;
using Server.Network;
using Server.Mobiles;
using Server.Items;
namespace Server.Engines.Craft
{
public class CraftQueueGump : Gump
{
private Mobile m_From;
private CraftSystem m_System;
private BaseTool m_Tool;
private CraftQueue m_Queue;
public CraftQueueGump( Mobile from, CraftSystem system, BaseTool tool ) : base( 40, 40 )
{
m_From = from;
m_System = system;
m_Tool = tool;
m_Queue = CraftQueueManager.GetQueue( from, system );
AddPage( 0 );
AddBackground( 0, 0, 600, 440, 5054 );
AddImageTiled( 10, 10, 580, 22, 2624 );
AddImageTiled( 10, 37, 580, 360, 2624 );
AddImageTiled( 10, 402, 580, 28, 2624 );
AddAlphaRegion( 10, 10, 580, 420 );
AddHtml( 10, 12, 580, 20, "<CENTER><BASEFONT COLOR=#FFFFFF>CRAFTING QUEUE</BASEFONT></CENTER>", false, false );
// Column Headers
AddHtml( 15, 40, 150, 20, "<BASEFONT COLOR=#FFFFFF>Item</BASEFONT>", false, false );
AddHtml( 165, 40, 100, 20, "<BASEFONT COLOR=#FFFFFF>Material</BASEFONT>", false, false );
AddHtml( 275, 40, 50, 20, "<BASEFONT COLOR=#FFFFFF>Target</BASEFONT>", false, false );
AddHtml( 335, 40, 50, 20, "<BASEFONT COLOR=#FFFFFF>Made</BASEFONT>", false, false );
AddHtml( 395, 40, 50, 20, "<BASEFONT COLOR=#FFFFFF>Fail</BASEFONT>", false, false );
AddHtml( 455, 40, 50, 20, "<BASEFONT COLOR=#FFFFFF>Exc</BASEFONT>", false, false );
AddHtml( 515, 40, 50, 20, "<BASEFONT COLOR=#FFFFFF>Remove</BASEFONT>", false, false );
int y = 60;
for ( int i = 0; i < m_Queue.Entries.Count; i++ )
{
CraftQueueEntry entry = m_Queue.Entries[i];
int statusHue = entry.IsCompleted ? 0x3E : 0x480;
if ( entry.CraftItem.NameNumber > 0 )
AddHtmlLocalized( 15, y, 140, 20, entry.CraftItem.NameNumber, 0x7FFF, false, false );
else
AddLabel( 15, y, statusHue, entry.CraftItem.NameString );
// --- MANUAL RESOURCE OVERRIDE ---
string resName = "Default";
if (entry.ResourceType != null)
{
resName = entry.ResourceType.Name;
}
else
{
// Clean up the system name
string systemName = m_System.GetType().Name.Replace("Def", "").Replace("Craft", "");
// Hardcode the base materials
if (systemName == "Blacksmithy")
resName = "Iron Ingot";
else if (systemName == "Carpentry" || systemName == "Bowcraft")
resName = "Board";
else if (systemName == "Tailoring")
{
bool requiresCloth = false;
// Look at the first ingredient required to make this item
if (entry.CraftItem.Resources.Count > 0)
{
Type reqType = entry.CraftItem.Resources.GetAt(0).ItemType;
if (reqType == typeof(Server.Items.Cloth) || reqType == typeof(Server.Items.UncutCloth))
{
requiresCloth = true;
}
}
if (requiresCloth)
resName = "Cloth";
else
resName = "Leather";
}
}
// Render as pure white (1152) using the standard AddLabel method
AddLabel(165, y, 1152, resName);
AddLabel( 275, y, 0x480, entry.TargetAmount.ToString() );
AddLabel( 335, y, 0x35, entry.AmountMade.ToString() );
AddLabel( 395, y, 0x22, entry.AmountFailed.ToString() );
AddLabel( 455, y, 0x3E, entry.AmountExceptional.ToString() );
AddButton( 525, y + 3, 4017, 4019, 100 + i, GumpButtonType.Reply, 0 );
y += 20;
if ( y > 380 ) break;
}
// Footer Buttons
AddButton( 15, 405, 4014, 4016, 0, GumpButtonType.Reply, 0 );
AddHtml( 50, 407, 100, 20, "<BASEFONT COLOR=#FFFFFF>BACK</BASEFONT>", false, false );
// Dynamic Play/Pause Button
AddButton( 250, 405, m_Queue.IsPaused ? 4005 : 4011, m_Queue.IsPaused ? 4007 : 4012, 1, GumpButtonType.Reply, 0 );
AddHtml( 285, 407, 100, 20, m_Queue.IsPaused ? "<BASEFONT COLOR=#00FF00>PLAY QUEUE</BASEFONT>" : "<BASEFONT COLOR=#FF0000>PAUSE QUEUE</BASEFONT>", false, false );
AddButton( 450, 405, 4017, 4019, 2, GumpButtonType.Reply, 0 );
AddHtml( 485, 407, 100, 20, "<BASEFONT COLOR=#FFFFFF>CLEAR ALL</BASEFONT>", false, false );
}
public override void OnResponse( NetState sender, RelayInfo info )
{
if ( info.ButtonID == 0 ) // Back
{
m_From.SendGump( new CraftGump( m_From, m_System, m_Tool, null ) );
}
else if ( info.ButtonID == 1 ) // Play/Pause Toggle
{
m_Queue.IsPaused = !m_Queue.IsPaused;
if ( !m_Queue.IsPaused && m_Queue.Entries.Count > 0 )
{
// --- AVATARS CONQUEST: Auto-Tool Replacement ---
if ( m_Tool == null || m_Tool.Deleted || m_Tool.UsesRemaining <= 0 )
{
// Try to find a replacement tool of the exact same type in their backpack
BaseTool replacement = m_From.Backpack != null ? m_From.Backpack.FindItemByType( m_Tool.GetType() ) as BaseTool : null;
if ( replacement != null && !replacement.Deleted && replacement.UsesRemaining > 0 )
{
m_Tool = replacement; // Swap the broken tool for the new one!
m_From.SendMessage( 0x35, "Equipped a new tool from your backpack." );
}
else
{
m_From.SendMessage( 0x22, "You do not have a working tool to continue crafting." );
m_Queue.IsPaused = true;
m_From.SendGump( new CraftQueueGump( m_From, m_System, m_Tool ) );
return;
}
}
// -----------------------------------------------
m_From.SendMessage( 0x35, "Crafting queue started." );
// Make sure we grab the next INCOMPLETE item, not just the top of the list
CraftQueueEntry next = m_Queue.Entries.Find( e => !e.IsCompleted );
if ( next != null )
{
next.CraftItem.Craft( m_From, m_System, next.ResourceType, m_Tool );
return; // Exit here so it doesn't reopen the gump
}
else
{
m_From.SendMessage( 0x3E, "Queue is already completely finished." );
m_Queue.IsPaused = true;
}
}
else if ( !m_Queue.IsPaused && m_Queue.Entries.Count == 0 )
{
m_From.SendMessage( 0x22, "Your queue is empty." );
m_Queue.IsPaused = true;
}
else
{
m_From.SendMessage( 0x22, "Crafting queue paused." );
}
m_From.SendGump( new CraftQueueGump( m_From, m_System, m_Tool ) );
}
else if ( info.ButtonID == 2 ) // Clear All
{
m_Queue.Entries.Clear();
m_From.SendGump( new CraftQueueGump( m_From, m_System, m_Tool ) );
}
else if ( info.ButtonID >= 100 ) // Remove specific item
{
int index = info.ButtonID - 100;
if ( index >= 0 && index < m_Queue.Entries.Count )
{
m_Queue.Entries.RemoveAt( index );
}
m_From.SendGump( new CraftQueueGump( m_From, m_System, m_Tool ) );
}
}
}
}