153 lines
5.9 KiB
C#
153 lines
5.9 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using Server;
|
|
using Server.Engines.Craft;
|
|
using Server.Items;
|
|
|
|
namespace Server.Engines.Craft
|
|
{
|
|
public class CraftQueueEntry
|
|
{
|
|
public CraftItem CraftItem { get; set; }
|
|
public Type ResourceType { get; set; }
|
|
public int TargetAmount { get; set; }
|
|
public int AmountMade { get; set; }
|
|
public int AmountFailed { get; set; }
|
|
public int AmountExceptional { get; set; }
|
|
public bool IsCompleted { get; set; }
|
|
|
|
public CraftQueueEntry( CraftItem item, Type resType, int target )
|
|
{
|
|
CraftItem = item;
|
|
ResourceType = resType;
|
|
TargetAmount = target;
|
|
IsCompleted = false;
|
|
}
|
|
}
|
|
|
|
public class CraftQueue
|
|
{
|
|
public List<CraftQueueEntry> Entries { get; set; }
|
|
public bool IsPaused { get; set; }
|
|
|
|
public CraftQueue()
|
|
{
|
|
Entries = new List<CraftQueueEntry>();
|
|
IsPaused = true; // Always start paused so they can safely build the list
|
|
}
|
|
}
|
|
|
|
public static class CraftQueueManager
|
|
{
|
|
private static Dictionary<Mobile, Dictionary<CraftSystem, CraftQueue>> m_Data = new Dictionary<Mobile, Dictionary<CraftSystem, CraftQueue>>();
|
|
|
|
// Here is the GetQueue method that went missing!
|
|
public static CraftQueue GetQueue( Mobile m, CraftSystem system )
|
|
{
|
|
if ( !m_Data.ContainsKey( m ) )
|
|
m_Data[m] = new Dictionary<CraftSystem, CraftQueue>();
|
|
|
|
if ( !m_Data[m].ContainsKey( system ) )
|
|
m_Data[m][system] = new CraftQueue();
|
|
|
|
return m_Data[m][system];
|
|
}
|
|
|
|
public static bool CheckQueue( Mobile from, CraftSystem system, BaseTool tool, int endquality, bool success, object haltMessage )
|
|
{
|
|
CraftQueue queue = GetQueue( from, system );
|
|
|
|
if ( queue.IsPaused || queue.Entries.Count == 0 )
|
|
return false;
|
|
|
|
// --- AVATARS CONQUEST: Seamless Auto-Tool Replacement ---
|
|
if ( haltMessage is int && (int)haltMessage == 1044038 )
|
|
{
|
|
BaseTool replacement = from.Backpack != null ? from.Backpack.FindItemByType( tool.GetType() ) as BaseTool : null;
|
|
|
|
if ( replacement != null && !replacement.Deleted && replacement.UsesRemaining > 0 )
|
|
{
|
|
tool = replacement; // Swap to the new tool
|
|
haltMessage = null; // Erase the error message so the queue doesn't pause!
|
|
from.SendMessage( 0x35, "Your tool broke, but you automatically equipped a new one!" );
|
|
}
|
|
}
|
|
|
|
// 1. Tally stats for the item that just finished
|
|
CraftQueueEntry current = queue.Entries.Find( e => !e.IsCompleted );
|
|
|
|
if ( current != null )
|
|
{
|
|
if ( success )
|
|
{
|
|
current.AmountMade++; // <--- The ONLY place it counts up now!
|
|
|
|
if ( endquality == 2 )
|
|
current.AmountExceptional++;
|
|
|
|
if ( current.AmountMade >= current.TargetAmount )
|
|
{
|
|
current.IsCompleted = true;
|
|
from.SendMessage( 0x3E, "Queue task complete: " + current.CraftItem.NameString );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// If it wasn't a success and it isn't just a broken tool, count it as a failure
|
|
if ( haltMessage is int && (int)haltMessage == 1044038 )
|
|
{
|
|
// The item WAS successfully made, the tool just broke, so don't count a failure
|
|
}
|
|
else
|
|
{
|
|
current.AmountFailed++;
|
|
|
|
// Also check completion on failure if we want to stop after X attempts
|
|
if ( (current.AmountMade + current.AmountFailed) >= current.TargetAmount )
|
|
{
|
|
current.IsCompleted = true;
|
|
from.SendMessage( 0x3E, "Queue task complete (with failures): " + current.CraftItem.NameString );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( haltMessage != null )
|
|
{
|
|
queue.IsPaused = true;
|
|
from.SendMessage( 0x22, "Queue paused: Missing materials, tool broke, or skill too low." );
|
|
from.CloseGump( typeof( CraftQueueGump ) );
|
|
from.SendGump( new CraftQueueGump( from, system, tool ) );
|
|
return false;
|
|
}
|
|
|
|
// Refresh UI
|
|
from.CloseGump( typeof( CraftQueueGump ) );
|
|
from.SendGump( new CraftQueueGump( from, system, tool ) );
|
|
|
|
// 2. Logic to find the NEXT thing to craft
|
|
Timer.DelayCall( TimeSpan.FromSeconds( 1.0 ), delegate()
|
|
{
|
|
CraftQueue currentQueue = GetQueue( from, system );
|
|
|
|
// Find the next incomplete item
|
|
CraftQueueEntry next = currentQueue.Entries.Find( e => !e.IsCompleted );
|
|
|
|
if ( !currentQueue.IsPaused && next != null && from.NetState != null && tool != null && !tool.Deleted )
|
|
{
|
|
// Execute the craft call for the NEXT item
|
|
next.CraftItem.Craft( from, system, next.ResourceType, tool );
|
|
}
|
|
else if ( next == null ) // All entries completed
|
|
{
|
|
currentQueue.IsPaused = true;
|
|
from.SendMessage( 0x3E, "All crafting queue tasks are finished." );
|
|
from.CloseGump( typeof( CraftQueueGump ) );
|
|
from.SendGump( new CraftQueueGump( from, system, tool ) );
|
|
}
|
|
});
|
|
|
|
return true;
|
|
}
|
|
}
|
|
}
|