mirror of
https://github.com/ServUO/ServUO
synced 2026-08-11 20:23:04 -04:00
* - Internal Galleon Update: Galleon Facing now uses the Multi Component List to change the ID's of fixtures. Some of the ID's (weapon pads) were not using the correct ID's, and this way the code is much more simplified. All fixture lists have been consolidated into one list. - Gargish Jewels no longer drop on non-SA Core - Fixed issue with trapped boxes - Added Event Sink for sending detailed house foundation packet. - Fixed issue where imbued jewelry weren't getting durability. * update solution fixed graphical issue * Bug Fixes - Added Blackthorne DUngeon stealables - Added proper base resists to Leather Ninja Hood - Medusa now drops Medusa Floor Tile Addon Deed (THANKS MILVA!) - AOSWeaponAttributes now work on Armor - Protection now expires after player death - Fixed crash in PVP Arena Gumps - Exceptional Damage Inc no longer gives extra points for Clean up Britannia Turn In - Fixed Loyalty Gump Crash - Fixed Stygian Dragon arty drops per EA * Potential Crash Fix * csproj update * Fixed conflict issue... WTF? * Bug Fixes *Requires Core Recompile* - Fixed cliloc on new belt craftables - failed craft no longer deletes crimson cincture and luck mempo - Added a core edit to Container.cs (had to do it folks) for better resource evaluation when considering resources to consume while crafting. In this instance, we don't want VvV or Faction items being used as craftable resources due to thier ease of obtaining. - Consolidated no-delete resources in CraftSystem.cs - Fellowship Data now serializes to prevent generation at each server start * Resolve Conflicts
632 lines
18 KiB
C#
632 lines
18 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
|
|
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;
|
|
|
|
private bool m_QuestOption;
|
|
private bool m_CanAlter;
|
|
|
|
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 m_MinCraftEffect;
|
|
}
|
|
}
|
|
public int MaxCraftEffect
|
|
{
|
|
get
|
|
{
|
|
return m_MaxCraftEffect;
|
|
}
|
|
}
|
|
public double Delay
|
|
{
|
|
get
|
|
{
|
|
return m_Delay;
|
|
}
|
|
}
|
|
|
|
public CraftItemCol CraftItems
|
|
{
|
|
get
|
|
{
|
|
return m_CraftItems;
|
|
}
|
|
}
|
|
public CraftGroupCol CraftGroups
|
|
{
|
|
get
|
|
{
|
|
return m_CraftGroups;
|
|
}
|
|
}
|
|
public CraftSubResCol CraftSubRes
|
|
{
|
|
get
|
|
{
|
|
return m_CraftSubRes;
|
|
}
|
|
}
|
|
public CraftSubResCol CraftSubRes2
|
|
{
|
|
get
|
|
{
|
|
return 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)
|
|
{
|
|
m_ContextTable.Remove(m);
|
|
return null;
|
|
}
|
|
|
|
CraftContext c = null;
|
|
m_ContextTable.TryGetValue(m, out c);
|
|
|
|
if (c == null)
|
|
m_ContextTable[m] = c = new CraftContext(m, this);
|
|
|
|
return c;
|
|
}
|
|
|
|
public void OnMade(Mobile m, CraftItem item)
|
|
{
|
|
CraftContext c = GetContext(m);
|
|
|
|
if (c != null)
|
|
c.OnMade(item);
|
|
}
|
|
|
|
public void OnRepair(Mobile m, ITool tool, Item deed, Item addon, IEntity e)
|
|
{
|
|
Item source;
|
|
|
|
if (tool is Item)
|
|
{
|
|
source = (Item)tool;
|
|
}
|
|
else
|
|
{
|
|
source = deed ?? addon;
|
|
}
|
|
|
|
EventSink.InvokeRepairItem(new RepairItemEventArgs(m, source, e));
|
|
}
|
|
|
|
public bool Resmelt
|
|
{
|
|
get
|
|
{
|
|
return m_Resmelt;
|
|
}
|
|
set
|
|
{
|
|
m_Resmelt = value;
|
|
}
|
|
}
|
|
|
|
public bool Repair
|
|
{
|
|
get
|
|
{
|
|
return m_Repair;
|
|
}
|
|
set
|
|
{
|
|
m_Repair = value;
|
|
}
|
|
}
|
|
|
|
public bool MarkOption
|
|
{
|
|
get
|
|
{
|
|
return m_MarkOption;
|
|
}
|
|
set
|
|
{
|
|
m_MarkOption = value;
|
|
}
|
|
}
|
|
|
|
public bool CanEnhance
|
|
{
|
|
get
|
|
{
|
|
return m_CanEnhance;
|
|
}
|
|
set
|
|
{
|
|
m_CanEnhance = value;
|
|
}
|
|
}
|
|
|
|
public bool QuestOption
|
|
{
|
|
get
|
|
{
|
|
return m_QuestOption;
|
|
}
|
|
set
|
|
{
|
|
m_QuestOption = value;
|
|
}
|
|
}
|
|
|
|
public bool CanAlter
|
|
{
|
|
get
|
|
{
|
|
return m_CanAlter;
|
|
}
|
|
set
|
|
{
|
|
m_CanAlter = value;
|
|
}
|
|
}
|
|
|
|
public CraftSystem(int minCraftEffect, int maxCraftEffect, double delay)
|
|
{
|
|
m_MinCraftEffect = minCraftEffect;
|
|
m_MaxCraftEffect = maxCraftEffect;
|
|
m_Delay = delay;
|
|
|
|
m_CraftItems = new CraftItemCol();
|
|
m_CraftGroups = new CraftGroupCol();
|
|
m_CraftSubRes = new CraftSubResCol();
|
|
m_CraftSubRes2 = new CraftSubResCol();
|
|
|
|
InitCraftList();
|
|
AddSystem(this);
|
|
}
|
|
|
|
private void AddSystem(CraftSystem system)
|
|
{
|
|
if (Systems == null)
|
|
Systems = new List<CraftSystem>();
|
|
|
|
Systems.Add(system);
|
|
}
|
|
|
|
private Type[] _GlobalNoConsume =
|
|
{
|
|
typeof(CapturedEssence), typeof(EyeOfTheTravesty), typeof(DiseasedBark), typeof(LardOfParoxysmus), typeof(GrizzledBones), typeof(DreadHornMane),
|
|
|
|
typeof(Blight), typeof(Corruption), typeof(Muculent), typeof(Scourge), typeof(Putrefaction), typeof(Taint),
|
|
|
|
// Tailoring
|
|
typeof(MidnightBracers), typeof(CrimsonCincture), typeof(GargishCrimsonCincture), typeof(LeurociansMempoOfFortune),
|
|
|
|
// Blacksmithy
|
|
typeof(LeggingsOfBane), typeof(GauntletsOfNobility),
|
|
|
|
// Carpentry
|
|
typeof(StaffOfTheMagi), typeof(BlackrockMoonstone),
|
|
|
|
// Tinkering
|
|
typeof(Server.Factions.Silver), typeof(RingOfTheElements), typeof(HatOfTheMagi), typeof(AutomatonActuator),
|
|
|
|
// Inscription
|
|
typeof(AntiqueDocumentsKit)
|
|
};
|
|
|
|
public virtual bool ConsumeOnFailure(Mobile from, Type resourceType, CraftItem craftItem)
|
|
{
|
|
return !_GlobalNoConsume.Any(t => t == resourceType);
|
|
}
|
|
|
|
public virtual bool ConsumeOnFailure(Mobile from, Type resourceType, CraftItem craftItem, ref MasterCraftsmanTalisman talisman)
|
|
{
|
|
if (!ConsumeOnFailure(from, resourceType, craftItem))
|
|
return false;
|
|
|
|
Item item = from.FindItemOnLayer(Layer.Talisman);
|
|
|
|
if (item is MasterCraftsmanTalisman)
|
|
{
|
|
MasterCraftsmanTalisman mct = (MasterCraftsmanTalisman)item;
|
|
|
|
if (mct.Charges > 0)
|
|
{
|
|
talisman = mct;
|
|
return false;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public void CreateItem(Mobile from, Type type, Type typeRes, ITool tool, CraftItem realCraftItem)
|
|
{
|
|
// Verify if the type is in the list of the craftable item
|
|
CraftItem craftItem = 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 AddCraft(typeItem, group, name, 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 AddCraft(typeItem, group, name, 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 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);
|
|
|
|
DoGroup(group, craftItem);
|
|
return m_CraftItems.Add(craftItem);
|
|
}
|
|
|
|
private void DoGroup(TextDefinition groupName, CraftItem craftItem)
|
|
{
|
|
int index = m_CraftGroups.SearchFor(groupName);
|
|
|
|
if (index == -1)
|
|
{
|
|
CraftGroup craftGroup = new CraftGroup(groupName);
|
|
craftGroup.AddCraftItem(craftItem);
|
|
m_CraftGroups.Add(craftGroup);
|
|
}
|
|
else
|
|
{
|
|
m_CraftGroups.GetAt(index).AddCraftItem(craftItem);
|
|
}
|
|
}
|
|
|
|
public void SetItemHue(int index, int hue)
|
|
{
|
|
CraftItem craftItem = m_CraftItems.GetAt(index);
|
|
craftItem.ItemHue = hue;
|
|
}
|
|
|
|
public void SetManaReq(int index, int mana)
|
|
{
|
|
CraftItem craftItem = m_CraftItems.GetAt(index);
|
|
craftItem.Mana = mana;
|
|
}
|
|
|
|
public void SetStamReq(int index, int stam)
|
|
{
|
|
CraftItem craftItem = m_CraftItems.GetAt(index);
|
|
craftItem.Stam = stam;
|
|
}
|
|
|
|
public void SetHitsReq(int index, int hits)
|
|
{
|
|
CraftItem craftItem = m_CraftItems.GetAt(index);
|
|
craftItem.Hits = hits;
|
|
}
|
|
|
|
public void SetUseAllRes(int index, bool useAll)
|
|
{
|
|
CraftItem craftItem = m_CraftItems.GetAt(index);
|
|
craftItem.UseAllRes = useAll;
|
|
}
|
|
|
|
public void SetForceTypeRes(int index, bool value)
|
|
{
|
|
CraftItem craftItem = m_CraftItems.GetAt(index);
|
|
craftItem.ForceTypeRes = value;
|
|
}
|
|
|
|
public void SetNeedHeat(int index, bool needHeat)
|
|
{
|
|
CraftItem craftItem = m_CraftItems.GetAt(index);
|
|
craftItem.NeedHeat = needHeat;
|
|
}
|
|
|
|
public void SetNeedOven(int index, bool needOven)
|
|
{
|
|
CraftItem craftItem = m_CraftItems.GetAt(index);
|
|
craftItem.NeedOven = needOven;
|
|
}
|
|
|
|
public void SetNeedMaker(int index, bool needMaker)
|
|
{
|
|
CraftItem craftItem = m_CraftItems.GetAt(index);
|
|
craftItem.NeedMaker = needMaker;
|
|
}
|
|
|
|
public void SetNeedWater(int index, bool needWater)
|
|
{
|
|
CraftItem craftItem = m_CraftItems.GetAt(index);
|
|
craftItem.NeedWater = needWater;
|
|
}
|
|
|
|
public void SetBeverageType(int index, BeverageType requiredBeverage)
|
|
{
|
|
CraftItem craftItem = m_CraftItems.GetAt(index);
|
|
craftItem.RequiredBeverage = requiredBeverage;
|
|
}
|
|
|
|
public void SetNeedMill(int index, bool needMill)
|
|
{
|
|
CraftItem craftItem = m_CraftItems.GetAt(index);
|
|
craftItem.NeedMill = needMill;
|
|
}
|
|
|
|
public void SetNeededThemePack(int index, ThemePack pack)
|
|
{
|
|
CraftItem craftItem = m_CraftItems.GetAt(index);
|
|
craftItem.RequiredThemePack = pack;
|
|
}
|
|
|
|
public void SetRequiresBasketWeaving(int index)
|
|
{
|
|
CraftItem craftItem = m_CraftItems.GetAt(index);
|
|
craftItem.RequiresBasketWeaving = true;
|
|
}
|
|
|
|
public void SetRequireResTarget(int index)
|
|
{
|
|
CraftItem craftItem = m_CraftItems.GetAt(index);
|
|
craftItem.RequiresResTarget = true;
|
|
}
|
|
|
|
public void SetRequiresMechanicalLife(int index)
|
|
{
|
|
CraftItem craftItem = m_CraftItems.GetAt(index);
|
|
craftItem.RequiresMechanicalLife = true;
|
|
}
|
|
|
|
public void SetData(int index, object data)
|
|
{
|
|
CraftItem craftItem = m_CraftItems.GetAt(index);
|
|
craftItem.Data = data;
|
|
}
|
|
|
|
public void SetDisplayID(int index, int id)
|
|
{
|
|
CraftItem craftItem = m_CraftItems.GetAt(index);
|
|
craftItem.DisplayID = id;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Add a callback Action to allow mutating the crafted item. Handy when you have a single Item Type but you want to create variations of it.
|
|
/// </summary>
|
|
/// <param name="index"></param>
|
|
/// <param name="action"></param>
|
|
public void SetMutateAction(int index, Action<Mobile, Item, ITool> action)
|
|
{
|
|
CraftItem craftItem = m_CraftItems.GetAt(index);
|
|
craftItem.MutateAction = action;
|
|
}
|
|
|
|
public void SetForceSuccess(int index, int success)
|
|
{
|
|
CraftItem craftItem = m_CraftItems.GetAt(index);
|
|
craftItem.ForceSuccessChance = success;
|
|
}
|
|
|
|
public void AddRes(int index, Type type, TextDefinition name, int amount)
|
|
{
|
|
AddRes(index, type, name, amount, "");
|
|
}
|
|
|
|
public void AddRes(int index, Type type, TextDefinition name, int amount, TextDefinition message)
|
|
{
|
|
CraftItem craftItem = m_CraftItems.GetAt(index);
|
|
craftItem.AddRes(type, name, amount, message);
|
|
}
|
|
|
|
public void AddResCallback(int index, Func<Mobile, ConsumeType, int> func)
|
|
{
|
|
CraftItem craftItem = m_CraftItems.GetAt(index);
|
|
craftItem.ConsumeResCallback = func;
|
|
}
|
|
|
|
public void AddSkill(int index, SkillName skillToMake, double minSkill, double maxSkill)
|
|
{
|
|
CraftItem craftItem = m_CraftItems.GetAt(index);
|
|
craftItem.AddSkill(skillToMake, minSkill, maxSkill);
|
|
}
|
|
|
|
public void SetUseSubRes2(int index, bool val)
|
|
{
|
|
CraftItem craftItem = m_CraftItems.GetAt(index);
|
|
craftItem.UseSubRes2 = val;
|
|
}
|
|
|
|
public void AddRecipe(int index, int id)
|
|
{
|
|
CraftItem craftItem = m_CraftItems.GetAt(index);
|
|
craftItem.AddRecipe(id, this);
|
|
}
|
|
|
|
public void ForceNonExceptional(int index)
|
|
{
|
|
CraftItem craftItem = m_CraftItems.GetAt(index);
|
|
craftItem.ForceNonExceptional = true;
|
|
}
|
|
|
|
public void ForceExceptional(int index)
|
|
{
|
|
CraftItem craftItem = m_CraftItems.GetAt(index);
|
|
craftItem.ForceExceptional = true;
|
|
}
|
|
|
|
public void SetMinSkillOffset(int index, double skillOffset)
|
|
{
|
|
CraftItem craftItem = m_CraftItems.GetAt(index);
|
|
craftItem.MinSkillOffset = skillOffset;
|
|
}
|
|
|
|
public void AddCraftAction(int index, Action<Mobile, CraftItem, ITool> action)
|
|
{
|
|
CraftItem craftItem = m_CraftItems.GetAt(index);
|
|
craftItem.TryCraft = action;
|
|
}
|
|
|
|
public void AddCreateItem(int index, Func<Mobile, CraftItem, ITool, Item> func)
|
|
{
|
|
CraftItem craftItem = m_CraftItems.GetAt(index);
|
|
craftItem.CreateItem = func;
|
|
}
|
|
|
|
public void SetSubRes(Type type, string name)
|
|
{
|
|
m_CraftSubRes.ResType = type;
|
|
m_CraftSubRes.NameString = name;
|
|
m_CraftSubRes.Init = true;
|
|
}
|
|
|
|
public void SetSubRes(Type type, int name)
|
|
{
|
|
m_CraftSubRes.ResType = type;
|
|
m_CraftSubRes.NameNumber = name;
|
|
m_CraftSubRes.Init = true;
|
|
}
|
|
|
|
public void AddSubRes(Type type, int name, double reqSkill, object message)
|
|
{
|
|
CraftSubRes craftSubRes = new CraftSubRes(type, name, reqSkill, message);
|
|
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);
|
|
m_CraftSubRes.Add(craftSubRes);
|
|
}
|
|
|
|
public void AddSubRes(Type type, string name, double reqSkill, object message)
|
|
{
|
|
CraftSubRes craftSubRes = new CraftSubRes(type, name, reqSkill, message);
|
|
m_CraftSubRes.Add(craftSubRes);
|
|
}
|
|
|
|
public void SetSubRes2(Type type, string name)
|
|
{
|
|
m_CraftSubRes2.ResType = type;
|
|
m_CraftSubRes2.NameString = name;
|
|
m_CraftSubRes2.Init = true;
|
|
}
|
|
|
|
public void SetSubRes2(Type type, int name)
|
|
{
|
|
m_CraftSubRes2.ResType = type;
|
|
m_CraftSubRes2.NameNumber = name;
|
|
m_CraftSubRes2.Init = true;
|
|
}
|
|
|
|
public void AddSubRes2(Type type, int name, double reqSkill, object message)
|
|
{
|
|
CraftSubRes craftSubRes = new CraftSubRes(type, name, reqSkill, message);
|
|
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);
|
|
m_CraftSubRes2.Add(craftSubRes);
|
|
}
|
|
|
|
public void AddSubRes2(Type type, string name, double reqSkill, object message)
|
|
{
|
|
CraftSubRes craftSubRes = new CraftSubRes(type, name, reqSkill, message);
|
|
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, ITool tool, Type itemType);
|
|
}
|
|
}
|