servuo/Scripts/Services/Craft/Core/CraftSystem.cs
Dexter d57ee162bf - Updated Scroll Binder Deed. No more internalizing items to reference the type of scroll. It now uses an enum. Updated clilocs and opl stuff.
- Gargoyle to non-gargoyle auto dismounts
- Craft Context now serializes using new Persistence
- Update Craft gumps/categories per EA
- Implemented Make Amount/Max Max in CraftGumpItem.cs
- Added Termur to XmlFind Gump
- Added Passive Detect Hidden Check, every 2 seconds on movement. Forumula needs to be tested.
2015-10-06 13:16:06 -07:00

479 lines
No EOL
14 KiB
C#

using System;
using System.Collections.Generic;
using Server.Items;
namespace Server.Engines.Craft
{
public enum CraftECA
{
ChanceMinusSixty,
FiftyPercentChanceMinusTenPercent,
ChanceMinusSixtyToFourtyFive
}
public abstract class CraftSystem
{
public static List<CraftSystem> Systems { get; set; }
private readonly int m_MinCraftEffect;
private readonly int m_MaxCraftEffect;
private readonly double m_Delay;
private bool m_Resmelt;
private bool m_Repair;
private bool m_MarkOption;
private bool m_CanEnhance;
#region SA
private bool m_QuestOption;
private bool m_CanAlter;
#endregion
private readonly CraftItemCol m_CraftItems;
private readonly CraftGroupCol m_CraftGroups;
private readonly CraftSubResCol m_CraftSubRes;
private readonly CraftSubResCol m_CraftSubRes2;
public int MinCraftEffect
{
get
{
return this.m_MinCraftEffect;
}
}
public int MaxCraftEffect
{
get
{
return this.m_MaxCraftEffect;
}
}
public double Delay
{
get
{
return this.m_Delay;
}
}
public CraftItemCol CraftItems
{
get
{
return this.m_CraftItems;
}
}
public CraftGroupCol CraftGroups
{
get
{
return this.m_CraftGroups;
}
}
public CraftSubResCol CraftSubRes
{
get
{
return this.m_CraftSubRes;
}
}
public CraftSubResCol CraftSubRes2
{
get
{
return this.m_CraftSubRes2;
}
}
public abstract SkillName MainSkill { get; }
public virtual int GumpTitleNumber
{
get
{
return 0;
}
}
public virtual string GumpTitleString
{
get
{
return "";
}
}
public virtual CraftECA ECA
{
get
{
return CraftECA.ChanceMinusSixty;
}
}
private readonly Dictionary<Mobile, CraftContext> m_ContextTable = new Dictionary<Mobile, CraftContext>();
public abstract double GetChanceAtMin(CraftItem item);
public virtual bool RetainsColorFrom(CraftItem item, Type type)
{
return false;
}
public void AddContext(Mobile m, CraftContext c)
{
if (c == null || m == null || c.System != this)
return;
m_ContextTable[m] = c;
}
public CraftContext GetContext(Mobile m)
{
if (m == null)
return null;
if (m.Deleted)
{
this.m_ContextTable.Remove(m);
return null;
}
CraftContext c = null;
this.m_ContextTable.TryGetValue(m, out c);
if (c == null)
this.m_ContextTable[m] = c = new CraftContext(m, this);
return c;
}
public void OnMade(Mobile m, CraftItem item)
{
CraftContext c = this.GetContext(m);
if (c != null)
c.OnMade(item);
}
public bool Resmelt
{
get
{
return this.m_Resmelt;
}
set
{
this.m_Resmelt = value;
}
}
public bool Repair
{
get
{
return this.m_Repair;
}
set
{
this.m_Repair = value;
}
}
public bool MarkOption
{
get
{
return this.m_MarkOption;
}
set
{
this.m_MarkOption = value;
}
}
public bool CanEnhance
{
get
{
return this.m_CanEnhance;
}
set
{
this.m_CanEnhance = value;
}
}
#region SA
public bool QuestOption
{
get
{
return this.m_QuestOption;
}
set
{
this.m_QuestOption = value;
}
}
public bool CanAlter
{
get
{
return this.m_CanAlter;
}
set
{
this.m_CanAlter = value;
}
}
#endregion
public CraftSystem(int minCraftEffect, int maxCraftEffect, double delay)
{
this.m_MinCraftEffect = minCraftEffect;
this.m_MaxCraftEffect = maxCraftEffect;
this.m_Delay = delay;
this.m_CraftItems = new CraftItemCol();
this.m_CraftGroups = new CraftGroupCol();
this.m_CraftSubRes = new CraftSubResCol();
this.m_CraftSubRes2 = new CraftSubResCol();
this.InitCraftList();
AddSystem(this);
}
private void AddSystem(CraftSystem system)
{
if (Systems == null)
Systems = new List<CraftSystem>();
Systems.Add(system);
}
public virtual bool ConsumeOnFailure(Mobile from, Type resourceType, CraftItem craftItem)
{
return true;
}
public void CreateItem(Mobile from, Type type, Type typeRes, BaseTool tool, CraftItem realCraftItem)
{
// Verify if the type is in the list of the craftable item
CraftItem craftItem = this.m_CraftItems.SearchFor(type);
if (craftItem != null)
{
// The item is in the list, try to create it
// Test code: items like sextant parts can be crafted either directly from ingots, or from different parts
realCraftItem.Craft(from, this, typeRes, tool);
//craftItem.Craft( from, this, typeRes, tool );
}
}
public int AddCraft(Type typeItem, TextDefinition group, TextDefinition name, double minSkill, double maxSkill, Type typeRes, TextDefinition nameRes, int amount)
{
return this.AddCraft(typeItem, group, name, this.MainSkill, minSkill, maxSkill, typeRes, nameRes, amount, "");
}
public int AddCraft(Type typeItem, TextDefinition group, TextDefinition name, double minSkill, double maxSkill, Type typeRes, TextDefinition nameRes, int amount, TextDefinition message)
{
return this.AddCraft(typeItem, group, name, this.MainSkill, minSkill, maxSkill, typeRes, nameRes, amount, message);
}
public int AddCraft(Type typeItem, TextDefinition group, TextDefinition name, SkillName skillToMake, double minSkill, double maxSkill, Type typeRes, TextDefinition nameRes, int amount)
{
return this.AddCraft(typeItem, group, name, skillToMake, minSkill, maxSkill, typeRes, nameRes, amount, "");
}
public int AddCraft(Type typeItem, TextDefinition group, TextDefinition name, SkillName skillToMake, double minSkill, double maxSkill, Type typeRes, TextDefinition nameRes, int amount, TextDefinition message)
{
CraftItem craftItem = new CraftItem(typeItem, group, name);
craftItem.AddRes(typeRes, nameRes, amount, message);
craftItem.AddSkill(skillToMake, minSkill, maxSkill);
this.DoGroup(group, craftItem);
return this.m_CraftItems.Add(craftItem);
}
private void DoGroup(TextDefinition groupName, CraftItem craftItem)
{
int index = this.m_CraftGroups.SearchFor(groupName);
if (index == -1)
{
CraftGroup craftGroup = new CraftGroup(groupName);
craftGroup.AddCraftItem(craftItem);
this.m_CraftGroups.Add(craftGroup);
}
else
{
this.m_CraftGroups.GetAt(index).AddCraftItem(craftItem);
}
}
public void SetItemHue(int index, int hue)
{
CraftItem craftItem = this.m_CraftItems.GetAt(index);
craftItem.ItemHue = hue;
}
public void SetManaReq(int index, int mana)
{
CraftItem craftItem = this.m_CraftItems.GetAt(index);
craftItem.Mana = mana;
}
public void SetStamReq(int index, int stam)
{
CraftItem craftItem = this.m_CraftItems.GetAt(index);
craftItem.Stam = stam;
}
public void SetHitsReq(int index, int hits)
{
CraftItem craftItem = this.m_CraftItems.GetAt(index);
craftItem.Hits = hits;
}
public void SetUseAllRes(int index, bool useAll)
{
CraftItem craftItem = this.m_CraftItems.GetAt(index);
craftItem.UseAllRes = useAll;
}
public void SetNeedHeat(int index, bool needHeat)
{
CraftItem craftItem = this.m_CraftItems.GetAt(index);
craftItem.NeedHeat = needHeat;
}
public void SetNeedOven(int index, bool needOven)
{
CraftItem craftItem = this.m_CraftItems.GetAt(index);
craftItem.NeedOven = needOven;
}
public void SetBeverageType(int index, BeverageType requiredBeverage)
{
CraftItem craftItem = this.m_CraftItems.GetAt(index);
craftItem.RequiredBeverage = requiredBeverage;
}
public void SetNeedMill(int index, bool needMill)
{
CraftItem craftItem = this.m_CraftItems.GetAt(index);
craftItem.NeedMill = needMill;
}
public void SetNeededExpansion(int index, Expansion expansion)
{
CraftItem craftItem = this.m_CraftItems.GetAt(index);
craftItem.RequiredExpansion = expansion;
}
public void AddRes(int index, Type type, TextDefinition name, int amount)
{
this.AddRes(index, type, name, amount, "");
}
public void AddRes(int index, Type type, TextDefinition name, int amount, TextDefinition message)
{
CraftItem craftItem = this.m_CraftItems.GetAt(index);
craftItem.AddRes(type, name, amount, message);
}
public void AddSkill(int index, SkillName skillToMake, double minSkill, double maxSkill)
{
CraftItem craftItem = this.m_CraftItems.GetAt(index);
craftItem.AddSkill(skillToMake, minSkill, maxSkill);
}
public void SetUseSubRes2(int index, bool val)
{
CraftItem craftItem = this.m_CraftItems.GetAt(index);
craftItem.UseSubRes2 = val;
}
public void AddRecipe(int index, int id)
{
CraftItem craftItem = this.m_CraftItems.GetAt(index);
craftItem.AddRecipe(id, this);
}
public void ForceNonExceptional(int index)
{
CraftItem craftItem = this.m_CraftItems.GetAt(index);
craftItem.ForceNonExceptional = true;
}
public void SetSubRes(Type type, string name)
{
this.m_CraftSubRes.ResType = type;
this.m_CraftSubRes.NameString = name;
this.m_CraftSubRes.Init = true;
}
public void SetSubRes(Type type, int name)
{
this.m_CraftSubRes.ResType = type;
this.m_CraftSubRes.NameNumber = name;
this.m_CraftSubRes.Init = true;
}
public void AddSubRes(Type type, int name, double reqSkill, object message)
{
CraftSubRes craftSubRes = new CraftSubRes(type, name, reqSkill, message);
this.m_CraftSubRes.Add(craftSubRes);
}
public void AddSubRes(Type type, int name, double reqSkill, int genericName, object message)
{
CraftSubRes craftSubRes = new CraftSubRes(type, name, reqSkill, genericName, message);
this.m_CraftSubRes.Add(craftSubRes);
}
public void AddSubRes(Type type, string name, double reqSkill, object message)
{
CraftSubRes craftSubRes = new CraftSubRes(type, name, reqSkill, message);
this.m_CraftSubRes.Add(craftSubRes);
}
public void SetSubRes2(Type type, string name)
{
this.m_CraftSubRes2.ResType = type;
this.m_CraftSubRes2.NameString = name;
this.m_CraftSubRes2.Init = true;
}
public void SetSubRes2(Type type, int name)
{
this.m_CraftSubRes2.ResType = type;
this.m_CraftSubRes2.NameNumber = name;
this.m_CraftSubRes2.Init = true;
}
public void AddSubRes2(Type type, int name, double reqSkill, object message)
{
CraftSubRes craftSubRes = new CraftSubRes(type, name, reqSkill, message);
this.m_CraftSubRes2.Add(craftSubRes);
}
public void AddSubRes2(Type type, int name, double reqSkill, int genericName, object message)
{
CraftSubRes craftSubRes = new CraftSubRes(type, name, reqSkill, genericName, message);
this.m_CraftSubRes2.Add(craftSubRes);
}
public void AddSubRes2(Type type, string name, double reqSkill, object message)
{
CraftSubRes craftSubRes = new CraftSubRes(type, name, reqSkill, message);
this.m_CraftSubRes2.Add(craftSubRes);
}
public abstract void InitCraftList();
public abstract void PlayCraftEffect(Mobile from);
public abstract int PlayEndingEffect(Mobile from, bool failed, bool lostMaterial, bool toolBroken, int quality, bool makersMark, CraftItem item);
public abstract int CanCraft(Mobile from, BaseTool tool, Type itemType);
}
}