Fixes code according to modern code style. Fixes a few expression bugs.

This commit is contained in:
Kamron Batman 2018-09-15 09:58:51 -07:00
parent 89eea25e5f
commit 970fd563b2
3324 changed files with 441118 additions and 433755 deletions

View file

@ -2,54 +2,54 @@ using System.Collections.Generic;
namespace Server.Engines.Craft
{
public enum CraftMarkOption
{
MarkItem,
DoNotMark,
PromptForMark
}
public enum CraftMarkOption
{
MarkItem,
DoNotMark,
PromptForMark
}
public class CraftContext
{
public List<CraftItem> Items { get; }
public class CraftContext
{
public CraftContext()
{
Items = new List<CraftItem>();
LastResourceIndex = -1;
LastResourceIndex2 = -1;
LastGroupIndex = -1;
}
public int LastResourceIndex { get; set; }
public List<CraftItem> Items{ get; }
public int LastResourceIndex2 { get; set; }
public int LastResourceIndex{ get; set; }
public int LastGroupIndex { get; set; }
public int LastResourceIndex2{ get; set; }
public bool DoNotColor { get; set; }
public int LastGroupIndex{ get; set; }
public CraftMarkOption MarkOption { get; set; }
public bool DoNotColor{ get; set; }
public CraftContext()
{
Items = new List<CraftItem>();
LastResourceIndex = -1;
LastResourceIndex2 = -1;
LastGroupIndex = -1;
}
public CraftMarkOption MarkOption{ get; set; }
public CraftItem LastMade
{
get
{
if ( Items.Count > 0 )
return Items[0];
public CraftItem LastMade
{
get
{
if (Items.Count > 0)
return Items[0];
return null;
}
}
return null;
}
}
public void OnMade( CraftItem item )
{
Items.Remove( item );
public void OnMade(CraftItem item)
{
Items.Remove(item);
if ( Items.Count == 10 )
Items.RemoveAt( 9 );
if (Items.Count == 10)
Items.RemoveAt(9);
Items.Insert( 0, item );
}
}
}
Items.Insert(0, item);
}
}
}

View file

@ -1,23 +1,23 @@
namespace Server.Engines.Craft
{
public class CraftGroup
{
public CraftGroup( TextDefinition groupName )
{
NameNumber = groupName;
NameString = groupName;
CraftItems = new CraftItemCol();
}
public class CraftGroup
{
public CraftGroup(TextDefinition groupName)
{
NameNumber = groupName;
NameString = groupName;
CraftItems = new CraftItemCol();
}
public void AddCraftItem( CraftItem craftItem )
{
CraftItems.Add( craftItem );
}
public CraftItemCol CraftItems{ get; }
public CraftItemCol CraftItems { get; }
public string NameString{ get; }
public string NameString { get; }
public int NameNumber{ get; }
public int NameNumber { get; }
}
public void AddCraftItem(CraftItem craftItem)
{
CraftItems.Add(craftItem);
}
}
}

View file

@ -1,46 +1,45 @@
using System.Collections;
namespace Server.Engines.Craft
{
public class CraftGroupCol : System.Collections.CollectionBase
{
public CraftGroupCol()
{
}
public class CraftGroupCol : CollectionBase
{
public int Add(CraftGroup craftGroup)
{
return List.Add(craftGroup);
}
public int Add( CraftGroup craftGroup )
{
return List.Add( craftGroup );
}
public void Remove(int index)
{
if (index > Count - 1 || index < 0)
{
}
else
{
List.RemoveAt(index);
}
}
public void Remove( int index )
{
if ( index > Count - 1 || index < 0 )
{
}
else
{
List.RemoveAt( index );
}
}
public CraftGroup GetAt(int index)
{
return (CraftGroup)List[index];
}
public CraftGroup GetAt( int index )
{
return ( CraftGroup ) List[index];
}
public int SearchFor(TextDefinition groupName)
{
for (int i = 0; i < List.Count; i++)
{
CraftGroup craftGroup = (CraftGroup)List[i];
public int SearchFor( TextDefinition groupName )
{
for ( int i = 0; i < List.Count; i++ )
{
CraftGroup craftGroup = (CraftGroup)List[i];
int nameNumber = craftGroup.NameNumber;
string nameString = craftGroup.NameString;
int nameNumber = craftGroup.NameNumber;
string nameString = craftGroup.NameString;
if (nameNumber != 0 && nameNumber == groupName.Number ||
nameString != null && nameString == groupName.String)
return i;
}
if ( ( nameNumber != 0 && nameNumber == groupName.Number ) || ( nameString != null && nameString == groupName.String ) )
return i;
}
return -1;
}
}
return -1;
}
}
}

File diff suppressed because it is too large Load diff

View file

@ -1,287 +1,295 @@
using System;
using Server.Gumps;
using Server.Network;
using Server.Items;
using Server.Mobiles;
using Server.Network;
namespace Server.Engines.Craft
{
public class CraftGumpItem : Gump
{
private Mobile m_From;
private CraftSystem m_CraftSystem;
private CraftItem m_CraftItem;
private BaseTool m_Tool;
public class CraftGumpItem : Gump
{
private const int LabelHue = 0x480; // 0x384
private const int RedLabelHue = 0x20;
private const int LabelHue = 0x480; // 0x384
private const int RedLabelHue = 0x20;
private const int LabelColor = 0x7FFF;
private const int RedLabelColor = 0x6400;
private const int LabelColor = 0x7FFF;
private const int RedLabelColor = 0x6400;
private const int GreyLabelColor = 0x3DEF;
private const int GreyLabelColor = 0x3DEF;
private static Type typeofBlankScroll = typeof(BlankScroll);
private static Type typeofSpellScroll = typeof(SpellScroll);
private CraftItem m_CraftItem;
private CraftSystem m_CraftSystem;
private Mobile m_From;
private int m_OtherCount;
private int m_OtherCount;
public CraftGumpItem( Mobile from, CraftSystem craftSystem, CraftItem craftItem, BaseTool tool ) : base( 40, 40 )
{
m_From = from;
m_CraftSystem = craftSystem;
m_CraftItem = craftItem;
m_Tool = tool;
private bool m_ShowExceptionalChance;
private BaseTool m_Tool;
from.CloseGump( typeof( CraftGump ) );
from.CloseGump( typeof( CraftGumpItem ) );
public CraftGumpItem(Mobile from, CraftSystem craftSystem, CraftItem craftItem, BaseTool tool) : base(40, 40)
{
m_From = from;
m_CraftSystem = craftSystem;
m_CraftItem = craftItem;
m_Tool = tool;
AddPage( 0 );
AddBackground( 0, 0, 530, 417, 5054 );
AddImageTiled( 10, 10, 510, 22, 2624 );
AddImageTiled( 10, 37, 150, 148, 2624 );
AddImageTiled( 165, 37, 355, 90, 2624 );
AddImageTiled( 10, 190, 155, 22, 2624 );
AddImageTiled( 10, 217, 150, 53, 2624 );
AddImageTiled( 165, 132, 355, 80, 2624 );
AddImageTiled( 10, 275, 155, 22, 2624 );
AddImageTiled( 10, 302, 150, 53, 2624 );
AddImageTiled( 165, 217, 355, 80, 2624 );
AddImageTiled( 10, 360, 155, 22, 2624 );
AddImageTiled( 165, 302, 355, 80, 2624 );
AddImageTiled( 10, 387, 510, 22, 2624 );
AddAlphaRegion( 10, 10, 510, 399 );
from.CloseGump(typeof(CraftGump));
from.CloseGump(typeof(CraftGumpItem));
AddHtmlLocalized( 170, 40, 150, 20, 1044053, LabelColor, false, false ); // ITEM
AddHtmlLocalized( 10, 192, 150, 22, 1044054, LabelColor, false, false ); // <CENTER>SKILLS</CENTER>
AddHtmlLocalized( 10, 277, 150, 22, 1044055, LabelColor, false, false ); // <CENTER>MATERIALS</CENTER>
AddHtmlLocalized( 10, 362, 150, 22, 1044056, LabelColor, false, false ); // <CENTER>OTHER</CENTER>
AddPage(0);
AddBackground(0, 0, 530, 417, 5054);
AddImageTiled(10, 10, 510, 22, 2624);
AddImageTiled(10, 37, 150, 148, 2624);
AddImageTiled(165, 37, 355, 90, 2624);
AddImageTiled(10, 190, 155, 22, 2624);
AddImageTiled(10, 217, 150, 53, 2624);
AddImageTiled(165, 132, 355, 80, 2624);
AddImageTiled(10, 275, 155, 22, 2624);
AddImageTiled(10, 302, 150, 53, 2624);
AddImageTiled(165, 217, 355, 80, 2624);
AddImageTiled(10, 360, 155, 22, 2624);
AddImageTiled(165, 302, 355, 80, 2624);
AddImageTiled(10, 387, 510, 22, 2624);
AddAlphaRegion(10, 10, 510, 399);
if ( craftSystem.GumpTitleNumber > 0 )
AddHtmlLocalized( 10, 12, 510, 20, craftSystem.GumpTitleNumber, LabelColor, false, false );
else
AddHtml( 10, 12, 510, 20, craftSystem.GumpTitleString, false, false );
AddHtmlLocalized(170, 40, 150, 20, 1044053, LabelColor, false, false); // ITEM
AddHtmlLocalized(10, 192, 150, 22, 1044054, LabelColor, false, false); // <CENTER>SKILLS</CENTER>
AddHtmlLocalized(10, 277, 150, 22, 1044055, LabelColor, false, false); // <CENTER>MATERIALS</CENTER>
AddHtmlLocalized(10, 362, 150, 22, 1044056, LabelColor, false, false); // <CENTER>OTHER</CENTER>
AddButton( 15, 387, 4014, 4016, 0, GumpButtonType.Reply, 0 );
AddHtmlLocalized( 50, 390, 150, 18, 1044150, LabelColor, false, false ); // BACK
if (craftSystem.GumpTitleNumber > 0)
AddHtmlLocalized(10, 12, 510, 20, craftSystem.GumpTitleNumber, LabelColor, false, false);
else
AddHtml(10, 12, 510, 20, craftSystem.GumpTitleString, false, false);
bool needsRecipe = ( craftItem.Recipe != null && from is PlayerMobile mobile && !mobile.HasRecipe( craftItem.Recipe ) );
AddButton(15, 387, 4014, 4016, 0, GumpButtonType.Reply, 0);
AddHtmlLocalized(50, 390, 150, 18, 1044150, LabelColor, false, false); // BACK
if ( needsRecipe )
{
AddButton( 270, 387, 4005, 4007, 0, GumpButtonType.Page, 0 );
AddHtmlLocalized( 305, 390, 150, 18, 1044151, GreyLabelColor, false, false ); // MAKE NOW
}
else
{
AddButton( 270, 387, 4005, 4007, 1, GumpButtonType.Reply, 0 );
AddHtmlLocalized( 305, 390, 150, 18, 1044151, LabelColor, false, false ); // MAKE NOW
}
bool needsRecipe = craftItem.Recipe != null && from is PlayerMobile mobile &&
!mobile.HasRecipe(craftItem.Recipe);
if ( craftItem.NameNumber > 0 )
AddHtmlLocalized( 330, 40, 180, 18, craftItem.NameNumber, LabelColor, false, false );
else
AddLabel( 330, 40, LabelHue, craftItem.NameString );
if (needsRecipe)
{
AddButton(270, 387, 4005, 4007, 0, GumpButtonType.Page, 0);
AddHtmlLocalized(305, 390, 150, 18, 1044151, GreyLabelColor, false, false); // MAKE NOW
}
else
{
AddButton(270, 387, 4005, 4007, 1, GumpButtonType.Reply, 0);
AddHtmlLocalized(305, 390, 150, 18, 1044151, LabelColor, false, false); // MAKE NOW
}
if ( craftItem.UseAllRes )
AddHtmlLocalized( 170, 302 + (m_OtherCount++ * 20), 310, 18, 1048176, LabelColor, false, false ); // Makes as many as possible at once
if (craftItem.NameNumber > 0)
AddHtmlLocalized(330, 40, 180, 18, craftItem.NameNumber, LabelColor, false, false);
else
AddLabel(330, 40, LabelHue, craftItem.NameString);
DrawItem();
DrawSkill();
DrawResource();
if (craftItem.UseAllRes)
AddHtmlLocalized(170, 302 + m_OtherCount++ * 20, 310, 18, 1048176, LabelColor, false,
false); // Makes as many as possible at once
/*
if ( craftItem.RequiresSE )
AddHtmlLocalized( 170, 302 + (m_OtherCount++ * 20), 310, 18, 1063363, LabelColor, false, false ); //* Requires the "Samurai Empire" expansion
* */
DrawItem();
DrawSkill();
DrawResource();
if ( craftItem.RequiredExpansion != Expansion.None )
{
bool supportsEx = (from.NetState != null && from.NetState.SupportsExpansion( craftItem.RequiredExpansion ));
TextDefinition.AddHtmlText( this, 170, 302 + (m_OtherCount++ * 20), 310, 18, RequiredExpansionMessage( craftItem.RequiredExpansion ), false, false, supportsEx ? LabelColor : RedLabelColor, supportsEx ? LabelHue : RedLabelHue );
}
/*
if ( craftItem.RequiresSE )
AddHtmlLocalized( 170, 302 + (m_OtherCount++ * 20), 310, 18, 1063363, LabelColor, false, false ); //* Requires the "Samurai Empire" expansion
* */
if ( needsRecipe )
AddHtmlLocalized( 170, 302 + (m_OtherCount++ * 20), 310, 18, 1073620, RedLabelColor, false, false ); // You have not learned this recipe.
if (craftItem.RequiredExpansion != Expansion.None)
{
bool supportsEx = from.NetState != null && from.NetState.SupportsExpansion(craftItem.RequiredExpansion);
TextDefinition.AddHtmlText(this, 170, 302 + m_OtherCount++ * 20, 310, 18,
RequiredExpansionMessage(craftItem.RequiredExpansion), false, false,
supportsEx ? LabelColor : RedLabelColor, supportsEx ? LabelHue : RedLabelHue);
}
}
if (needsRecipe)
AddHtmlLocalized(170, 302 + m_OtherCount++ * 20, 310, 18, 1073620, RedLabelColor, false,
false); // You have not learned this recipe.
}
private TextDefinition RequiredExpansionMessage( Expansion expansion )
{
switch( expansion )
{
case Expansion.SE:
return 1063363; // * Requires the "Samurai Empire" expansion
case Expansion.ML:
return 1072651; // * Requires the "Mondain's Legacy" expansion
default:
return $"* Requires the \"{ExpansionInfo.GetInfo(expansion).Name}\" expansion";
}
}
private TextDefinition RequiredExpansionMessage(Expansion expansion)
{
switch (expansion)
{
case Expansion.SE:
return 1063363; // * Requires the "Samurai Empire" expansion
case Expansion.ML:
return 1072651; // * Requires the "Mondain's Legacy" expansion
default:
return $"* Requires the \"{ExpansionInfo.GetInfo(expansion).Name}\" expansion";
}
}
private bool m_ShowExceptionalChance;
public void DrawItem()
{
Type type = m_CraftItem.ItemType;
public void DrawItem()
{
Type type = m_CraftItem.ItemType;
AddItem(20, 50, CraftItem.ItemIDOf(type), m_CraftItem.ItemHue);
AddItem( 20, 50, CraftItem.ItemIDOf( type ), m_CraftItem.ItemHue );
if (m_CraftItem.IsMarkable(type))
{
AddHtmlLocalized(170, 302 + m_OtherCount++ * 20, 310, 18, 1044059, LabelColor, false,
false); // This item may hold its maker's mark
m_ShowExceptionalChance = true;
}
}
if ( m_CraftItem.IsMarkable( type ) )
{
AddHtmlLocalized( 170, 302 + (m_OtherCount++ * 20), 310, 18, 1044059, LabelColor, false, false ); // This item may hold its maker's mark
m_ShowExceptionalChance = true;
}
}
public void DrawSkill()
{
for (int i = 0; i < m_CraftItem.Skills.Count; i++)
{
CraftSkill skill = m_CraftItem.Skills.GetAt(i);
double minSkill = skill.MinSkill, maxSkill = skill.MaxSkill;
public void DrawSkill()
{
for ( int i = 0; i < m_CraftItem.Skills.Count; i++ )
{
CraftSkill skill = m_CraftItem.Skills.GetAt( i );
double minSkill = skill.MinSkill, maxSkill = skill.MaxSkill;
if (minSkill < 0)
minSkill = 0;
if ( minSkill < 0 )
minSkill = 0;
AddHtmlLocalized(170, 132 + i * 20, 200, 18, AosSkillBonuses.GetLabel(skill.SkillToMake), LabelColor, false,
false);
AddLabel(430, 132 + i * 20, LabelHue, $"{minSkill:F1}");
}
AddHtmlLocalized( 170, 132 + (i * 20), 200, 18, AosSkillBonuses.GetLabel( skill.SkillToMake ), LabelColor, false, false );
AddLabel( 430, 132 + (i * 20), LabelHue, $"{minSkill:F1}");
}
CraftSubResCol res = m_CraftItem.UseSubRes2 ? m_CraftSystem.CraftSubRes2 : m_CraftSystem.CraftSubRes;
int resIndex = -1;
CraftSubResCol res = ( m_CraftItem.UseSubRes2 ? m_CraftSystem.CraftSubRes2 : m_CraftSystem.CraftSubRes );
int resIndex = -1;
CraftContext context = m_CraftSystem.GetContext(m_From);
CraftContext context = m_CraftSystem.GetContext( m_From );
if (context != null)
resIndex = m_CraftItem.UseSubRes2 ? context.LastResourceIndex2 : context.LastResourceIndex;
if ( context != null )
resIndex = ( m_CraftItem.UseSubRes2 ? context.LastResourceIndex2 : context.LastResourceIndex );
bool allRequiredSkills = true;
double chance = m_CraftItem.GetSuccessChance(m_From, resIndex > -1 ? res.GetAt(resIndex).ItemType : null,
m_CraftSystem, false, ref allRequiredSkills);
double excepChance = m_CraftItem.GetExceptionalChance(m_CraftSystem, chance, m_From);
bool allRequiredSkills = true;
double chance = m_CraftItem.GetSuccessChance( m_From, resIndex > -1 ? res.GetAt( resIndex ).ItemType : null, m_CraftSystem, false, ref allRequiredSkills );
double excepChance = m_CraftItem.GetExceptionalChance( m_CraftSystem, chance, m_From );
if (chance < 0.0)
chance = 0.0;
else if (chance > 1.0)
chance = 1.0;
if ( chance < 0.0 )
chance = 0.0;
else if ( chance > 1.0 )
chance = 1.0;
AddHtmlLocalized(170, 80, 250, 18, 1044057, LabelColor, false, false); // Success Chance:
AddLabel(430, 80, LabelHue, $"{chance * 100:F1}%");
AddHtmlLocalized( 170, 80, 250, 18, 1044057, LabelColor, false, false ); // Success Chance:
AddLabel( 430, 80, LabelHue, $"{chance * 100:F1}%");
if (m_ShowExceptionalChance)
{
if (excepChance < 0.0)
excepChance = 0.0;
else if (excepChance > 1.0)
excepChance = 1.0;
if ( m_ShowExceptionalChance )
{
if ( excepChance < 0.0 )
excepChance = 0.0;
else if ( excepChance > 1.0 )
excepChance = 1.0;
AddHtmlLocalized(170, 100, 250, 18, 1044058, 32767, false, false); // Exceptional Chance:
AddLabel(430, 100, LabelHue, $"{excepChance * 100:F1}%");
}
}
AddHtmlLocalized( 170, 100, 250, 18, 1044058, 32767, false, false ); // Exceptional Chance:
AddLabel( 430, 100, LabelHue, $"{excepChance * 100:F1}%");
}
}
public void DrawResource()
{
bool retainedColor = false;
private static Type typeofBlankScroll = typeof( BlankScroll );
private static Type typeofSpellScroll = typeof( SpellScroll );
CraftContext context = m_CraftSystem.GetContext(m_From);
public void DrawResource()
{
bool retainedColor = false;
CraftSubResCol res = m_CraftItem.UseSubRes2 ? m_CraftSystem.CraftSubRes2 : m_CraftSystem.CraftSubRes;
int resIndex = -1;
CraftContext context = m_CraftSystem.GetContext( m_From );
if (context != null)
resIndex = m_CraftItem.UseSubRes2 ? context.LastResourceIndex2 : context.LastResourceIndex;
CraftSubResCol res = ( m_CraftItem.UseSubRes2 ? m_CraftSystem.CraftSubRes2 : m_CraftSystem.CraftSubRes );
int resIndex = -1;
bool cropScroll = m_CraftItem.Resources.Count > 1
&& m_CraftItem.Resources.GetAt(m_CraftItem.Resources.Count - 1).ItemType == typeofBlankScroll
&& typeofSpellScroll.IsAssignableFrom(m_CraftItem.ItemType);
if ( context != null )
resIndex = ( m_CraftItem.UseSubRes2 ? context.LastResourceIndex2 : context.LastResourceIndex );
for (int i = 0; i < m_CraftItem.Resources.Count - (cropScroll ? 1 : 0) && i < 4; i++)
{
Type type;
string nameString;
int nameNumber;
bool cropScroll = ( m_CraftItem.Resources.Count > 1 )
&& m_CraftItem.Resources.GetAt( m_CraftItem.Resources.Count - 1 ).ItemType == typeofBlankScroll
&& typeofSpellScroll.IsAssignableFrom( m_CraftItem.ItemType );
CraftRes craftResource = m_CraftItem.Resources.GetAt(i);
for ( int i = 0; i < m_CraftItem.Resources.Count - (cropScroll ? 1 : 0) && i < 4; i++ )
{
Type type;
string nameString;
int nameNumber;
type = craftResource.ItemType;
nameString = craftResource.NameString;
nameNumber = craftResource.NameNumber;
CraftRes craftResource = m_CraftItem.Resources.GetAt( i );
// Resource Mutation
if (type == res.ResType && resIndex > -1)
{
CraftSubRes subResource = res.GetAt(resIndex);
type = craftResource.ItemType;
nameString = craftResource.NameString;
nameNumber = craftResource.NameNumber;
type = subResource.ItemType;
// Resource Mutation
if ( type == res.ResType && resIndex > -1 )
{
CraftSubRes subResource = res.GetAt( resIndex );
nameString = subResource.NameString;
nameNumber = subResource.GenericNameNumber;
type = subResource.ItemType;
if (nameNumber <= 0)
nameNumber = subResource.NameNumber;
}
// ******************
nameString = subResource.NameString;
nameNumber = subResource.GenericNameNumber;
if (!retainedColor && m_CraftItem.RetainsColorFrom(m_CraftSystem, type))
{
retainedColor = true;
AddHtmlLocalized(170, 302 + m_OtherCount++ * 20, 310, 18, 1044152, LabelColor, false,
false); // * The item retains the color of this material
AddLabel(500, 219 + i * 20, LabelHue, "*");
}
if ( nameNumber <= 0 )
nameNumber = subResource.NameNumber;
}
// ******************
if (nameNumber > 0)
AddHtmlLocalized(170, 219 + i * 20, 310, 18, nameNumber, LabelColor, false, false);
else
AddLabel(170, 219 + i * 20, LabelHue, nameString);
if ( !retainedColor && m_CraftItem.RetainsColorFrom( m_CraftSystem, type ) )
{
retainedColor = true;
AddHtmlLocalized( 170, 302 + (m_OtherCount++ * 20), 310, 18, 1044152, LabelColor, false, false ); // * The item retains the color of this material
AddLabel( 500, 219 + (i * 20), LabelHue, "*" );
}
AddLabel(430, 219 + i * 20, LabelHue, craftResource.Amount.ToString());
}
if ( nameNumber > 0 )
AddHtmlLocalized( 170, 219 + (i * 20), 310, 18, nameNumber, LabelColor, false, false );
else
AddLabel( 170, 219 + (i * 20), LabelHue, nameString );
if (m_CraftItem.NameNumber == 1041267) // runebook
{
AddHtmlLocalized(170, 219 + m_CraftItem.Resources.Count * 20, 310, 18, 1044447, LabelColor, false, false);
AddLabel(430, 219 + m_CraftItem.Resources.Count * 20, LabelHue, "1");
}
AddLabel( 430, 219 + (i * 20), LabelHue, craftResource.Amount.ToString() );
}
if (cropScroll)
AddHtmlLocalized(170, 302 + m_OtherCount++ * 20, 360, 18, 1044379, LabelColor, false,
false); // Inscribing scrolls also requires a blank scroll and mana.
}
if ( m_CraftItem.NameNumber == 1041267 ) // runebook
{
AddHtmlLocalized( 170, 219 + (m_CraftItem.Resources.Count * 20), 310, 18, 1044447, LabelColor, false, false );
AddLabel( 430, 219 + (m_CraftItem.Resources.Count * 20), LabelHue, "1" );
}
public override void OnResponse(NetState sender, RelayInfo info)
{
// Back Button
if (info.ButtonID == 0)
{
CraftGump craftGump = new CraftGump(m_From, m_CraftSystem, m_Tool, null);
m_From.SendGump(craftGump);
}
else // Make Button
{
int num = m_CraftSystem.CanCraft(m_From, m_Tool, m_CraftItem.ItemType);
if ( cropScroll )
AddHtmlLocalized( 170, 302 + (m_OtherCount++ * 20), 360, 18, 1044379, LabelColor, false, false ); // Inscribing scrolls also requires a blank scroll and mana.
}
if (num > 0)
{
m_From.SendGump(new CraftGump(m_From, m_CraftSystem, m_Tool, num));
}
else
{
Type type = null;
public override void OnResponse( NetState sender, RelayInfo info )
{
// Back Button
if ( info.ButtonID == 0 )
{
CraftGump craftGump = new CraftGump( m_From, m_CraftSystem, m_Tool, null );
m_From.SendGump( craftGump );
}
else // Make Button
{
int num = m_CraftSystem.CanCraft( m_From, m_Tool, m_CraftItem.ItemType );
CraftContext context = m_CraftSystem.GetContext(m_From);
if ( num > 0 )
{
m_From.SendGump( new CraftGump( m_From, m_CraftSystem, m_Tool, num ) );
}
else
{
Type type = null;
if (context != null)
{
CraftSubResCol res = m_CraftItem.UseSubRes2 ? m_CraftSystem.CraftSubRes2 : m_CraftSystem.CraftSubRes;
int resIndex = m_CraftItem.UseSubRes2 ? context.LastResourceIndex2 : context.LastResourceIndex;
CraftContext context = m_CraftSystem.GetContext( m_From );
if (resIndex > -1)
type = res.GetAt(resIndex).ItemType;
}
if ( context != null )
{
CraftSubResCol res = ( m_CraftItem.UseSubRes2 ? m_CraftSystem.CraftSubRes2 : m_CraftSystem.CraftSubRes );
int resIndex = ( m_CraftItem.UseSubRes2 ? context.LastResourceIndex2 : context.LastResourceIndex );
if ( resIndex > -1 )
type = res.GetAt( resIndex ).ItemType;
}
m_CraftSystem.CreateItem( m_From, m_CraftItem.ItemType, type, m_Tool, m_CraftItem );
}
}
}
}
}
m_CraftSystem.CreateItem(m_From, m_CraftItem.ItemType, type, m_Tool, m_CraftItem);
}
}
}
}
}

File diff suppressed because it is too large Load diff

View file

@ -1,58 +1,53 @@
using System;
using System.Collections;
namespace Server.Engines.Craft
{
public class CraftItemCol : System.Collections.CollectionBase
{
public CraftItemCol()
{
}
public class CraftItemCol : CollectionBase
{
public int Add(CraftItem craftItem)
{
return List.Add(craftItem);
}
public int Add( CraftItem craftItem )
{
return List.Add( craftItem );
}
public void Remove(int index)
{
if (index > Count - 1 || index < 0)
{
}
else
{
List.RemoveAt(index);
}
}
public void Remove( int index )
{
if ( index > Count - 1 || index < 0 )
{
}
else
{
List.RemoveAt( index );
}
}
public CraftItem GetAt(int index)
{
return (CraftItem)List[index];
}
public CraftItem GetAt( int index )
{
return ( CraftItem ) List[index];
}
public CraftItem SearchForSubclass(Type type)
{
for (int i = 0; i < List.Count; i++)
{
CraftItem craftItem = (CraftItem)List[i];
public CraftItem SearchForSubclass( Type type )
{
for ( int i = 0; i < List.Count; i++ )
{
CraftItem craftItem = ( CraftItem )List[i];
if (craftItem.ItemType == type || type.IsSubclassOf(craftItem.ItemType))
return craftItem;
}
if ( craftItem.ItemType == type || type.IsSubclassOf( craftItem.ItemType ) )
return craftItem;
}
return null;
}
return null;
}
public CraftItem SearchFor(Type type)
{
for (int i = 0; i < List.Count; i++)
{
CraftItem craftItem = (CraftItem)List[i];
if (craftItem.ItemType == type) return craftItem;
}
public CraftItem SearchFor( Type type )
{
for ( int i = 0; i < List.Count; i++ )
{
CraftItem craftItem = ( CraftItem )List[i];
if ( craftItem.ItemType == type )
{
return craftItem;
}
}
return null;
}
}
return null;
}
}
}

View file

@ -2,14 +2,14 @@ using System;
namespace Server.Engines.Craft
{
[AttributeUsage( AttributeTargets.Class )]
public class CraftItemIDAttribute : Attribute
{
public int ItemID { get; }
[AttributeUsage(AttributeTargets.Class)]
public class CraftItemIDAttribute : Attribute
{
public CraftItemIDAttribute(int itemID)
{
ItemID = itemID;
}
public CraftItemIDAttribute( int itemID )
{
ItemID = itemID;
}
}
public int ItemID{ get; }
}
}

View file

@ -2,43 +2,43 @@ using System;
namespace Server.Engines.Craft
{
public class CraftRes
{
public CraftRes( Type type, int amount )
{
ItemType = type;
Amount = amount;
}
public class CraftRes
{
public CraftRes(Type type, int amount)
{
ItemType = type;
Amount = amount;
}
public CraftRes( Type type, TextDefinition name, int amount, TextDefinition message ): this ( type, amount )
{
NameNumber = name;
MessageNumber = message;
public CraftRes(Type type, TextDefinition name, int amount, TextDefinition message) : this(type, amount)
{
NameNumber = name;
MessageNumber = message;
NameString = name;
MessageString = message;
}
NameString = name;
MessageString = message;
}
public void SendMessage( Mobile from )
{
if ( MessageNumber > 0 )
from.SendLocalizedMessage( MessageNumber );
else if ( !string.IsNullOrEmpty( MessageString ) )
from.SendMessage( MessageString );
else
from.SendLocalizedMessage( 502925 ); // You don't have the resources required to make that item.
}
public Type ItemType{ get; }
public Type ItemType { get; }
public string MessageString{ get; }
public string MessageString { get; }
public int MessageNumber{ get; }
public int MessageNumber { get; }
public string NameString{ get; }
public string NameString { get; }
public int NameNumber{ get; }
public int NameNumber { get; }
public int Amount{ get; }
public int Amount { get; }
}
}
public void SendMessage(Mobile from)
{
if (MessageNumber > 0)
from.SendLocalizedMessage(MessageNumber);
else if (!string.IsNullOrEmpty(MessageString))
from.SendMessage(MessageString);
else
from.SendLocalizedMessage(502925); // You don't have the resources required to make that item.
}
}
}

View file

@ -1,30 +1,28 @@
using System.Collections;
namespace Server.Engines.Craft
{
public class CraftResCol : System.Collections.CollectionBase
{
public CraftResCol()
{
}
public class CraftResCol : CollectionBase
{
public void Add(CraftRes craftRes)
{
List.Add(craftRes);
}
public void Add( CraftRes craftRes )
{
List.Add( craftRes );
}
public void Remove(int index)
{
if (index > Count - 1 || index < 0)
{
}
else
{
List.RemoveAt(index);
}
}
public void Remove( int index )
{
if ( index > Count - 1 || index < 0 )
{
}
else
{
List.RemoveAt( index );
}
}
public CraftRes GetAt( int index )
{
return ( CraftRes ) List[index];
}
}
public CraftRes GetAt(int index)
{
return (CraftRes)List[index];
}
}
}

View file

@ -1,18 +1,18 @@
namespace Server.Engines.Craft
{
public class CraftSkill
{
public CraftSkill( SkillName skillToMake, double minSkill, double maxSkill )
{
SkillToMake = skillToMake;
MinSkill = minSkill;
MaxSkill = maxSkill;
}
public class CraftSkill
{
public CraftSkill(SkillName skillToMake, double minSkill, double maxSkill)
{
SkillToMake = skillToMake;
MinSkill = minSkill;
MaxSkill = maxSkill;
}
public SkillName SkillToMake { get; }
public SkillName SkillToMake{ get; }
public double MinSkill { get; }
public double MinSkill{ get; }
public double MaxSkill { get; }
}
public double MaxSkill{ get; }
}
}

View file

@ -1,30 +1,28 @@
using System.Collections;
namespace Server.Engines.Craft
{
public class CraftSkillCol : System.Collections.CollectionBase
{
public CraftSkillCol()
{
}
public class CraftSkillCol : CollectionBase
{
public void Add(CraftSkill craftSkill)
{
List.Add(craftSkill);
}
public void Add( CraftSkill craftSkill )
{
List.Add( craftSkill );
}
public void Remove(int index)
{
if (index > Count - 1 || index < 0)
{
}
else
{
List.RemoveAt(index);
}
}
public void Remove( int index )
{
if ( index > Count - 1 || index < 0 )
{
}
else
{
List.RemoveAt( index );
}
}
public CraftSkill GetAt( int index )
{
return ( CraftSkill ) List[index];
}
}
public CraftSkill GetAt(int index)
{
return (CraftSkill)List[index];
}
}
}

View file

@ -2,32 +2,33 @@ using System;
namespace Server.Engines.Craft
{
public class CraftSubRes
{
public CraftSubRes( Type type, TextDefinition name, double reqSkill, object message ) : this( type, name, reqSkill, 0, message )
{
}
public class CraftSubRes
{
public CraftSubRes(Type type, TextDefinition name, double reqSkill, object message) : this(type, name, reqSkill, 0,
message)
{
}
public CraftSubRes( Type type, TextDefinition name, double reqSkill, int genericNameNumber, object message )
{
ItemType = type;
NameNumber = name;
NameString = name;
RequiredSkill = reqSkill;
GenericNameNumber = genericNameNumber;
Message = message;
}
public CraftSubRes(Type type, TextDefinition name, double reqSkill, int genericNameNumber, object message)
{
ItemType = type;
NameNumber = name;
NameString = name;
RequiredSkill = reqSkill;
GenericNameNumber = genericNameNumber;
Message = message;
}
public Type ItemType { get; }
public Type ItemType{ get; }
public string NameString { get; }
public string NameString{ get; }
public int NameNumber { get; }
public int NameNumber{ get; }
public int GenericNameNumber { get; }
public int GenericNameNumber{ get; }
public object Message { get; }
public object Message{ get; }
public double RequiredSkill { get; }
}
public double RequiredSkill{ get; }
}
}

View file

@ -1,54 +1,53 @@
using System;
using System.Collections;
namespace Server.Engines.Craft
{
public class CraftSubResCol : System.Collections.CollectionBase
{
public bool Init { get; set; }
public class CraftSubResCol : CollectionBase
{
public CraftSubResCol()
{
Init = false;
}
public Type ResType { get; set; }
public bool Init{ get; set; }
public string NameString { get; set; }
public Type ResType{ get; set; }
public int NameNumber { get; set; }
public string NameString{ get; set; }
public CraftSubResCol()
{
Init = false;
}
public int NameNumber{ get; set; }
public void Add( CraftSubRes craftSubRes )
{
List.Add( craftSubRes );
}
public void Add(CraftSubRes craftSubRes)
{
List.Add(craftSubRes);
}
public void Remove( int index )
{
if ( index > Count - 1 || index < 0 )
{
}
else
{
List.RemoveAt( index );
}
}
public void Remove(int index)
{
if (index > Count - 1 || index < 0)
{
}
else
{
List.RemoveAt(index);
}
}
public CraftSubRes GetAt( int index )
{
return ( CraftSubRes ) List[index];
}
public CraftSubRes GetAt(int index)
{
return (CraftSubRes)List[index];
}
public CraftSubRes SearchFor( Type type )
{
for ( int i = 0; i < List.Count; i++ )
{
CraftSubRes craftSubRes = ( CraftSubRes )List[i];
if ( craftSubRes.ItemType == type )
{
return craftSubRes;
}
}
return null;
}
}
public CraftSubRes SearchFor(Type type)
{
for (int i = 0; i < List.Count; i++)
{
CraftSubRes craftSubRes = (CraftSubRes)List[i];
if (craftSubRes.ItemType == type) return craftSubRes;
}
return null;
}
}
}

View file

@ -4,360 +4,359 @@ using Server.Items;
namespace Server.Engines.Craft
{
public enum CraftECA
{
ChanceMinusSixty,
FiftyPercentChanceMinusTenPercent,
ChanceMinusSixtyToFourtyFive
}
public enum CraftECA
{
ChanceMinusSixty,
FiftyPercentChanceMinusTenPercent,
ChanceMinusSixtyToFourtyFive
}
public abstract class CraftSystem
{
private List<int> m_Recipes;
private List<int> m_RareRecipes;
public abstract class CraftSystem
{
private Dictionary<Mobile, CraftContext> m_ContextTable = new Dictionary<Mobile, CraftContext>();
private List<int> m_RareRecipes;
private List<int> m_Recipes;
public int MinCraftEffect { get; }
public CraftSystem(int minCraftEffect, int maxCraftEffect, double delay)
{
MinCraftEffect = minCraftEffect;
MaxCraftEffect = maxCraftEffect;
Delay = delay;
public int MaxCraftEffect { get; }
CraftItems = new CraftItemCol();
CraftGroups = new CraftGroupCol();
CraftSubRes = new CraftSubResCol();
CraftSubRes2 = new CraftSubResCol();
public double Delay { get; }
m_Recipes = new List<int>();
m_RareRecipes = new List<int>();
public CraftItemCol CraftItems { get; }
InitCraftList();
}
public CraftGroupCol CraftGroups { get; }
public int MinCraftEffect{ get; }
public CraftSubResCol CraftSubRes { get; }
public int MaxCraftEffect{ get; }
public CraftSubResCol CraftSubRes2 { get; }
public double Delay{ get; }
public abstract SkillName MainSkill{ get; }
public CraftItemCol CraftItems{ get; }
public virtual int GumpTitleNumber => 0;
public virtual string GumpTitleString => "";
public CraftGroupCol CraftGroups{ get; }
public virtual CraftECA ECA => CraftECA.ChanceMinusSixty;
public CraftSubResCol CraftSubRes{ get; }
private Dictionary<Mobile, CraftContext> m_ContextTable = new Dictionary<Mobile, CraftContext>();
public CraftSubResCol CraftSubRes2{ get; }
public abstract double GetChanceAtMin( CraftItem item );
public abstract SkillName MainSkill{ get; }
public virtual bool RetainsColorFrom( CraftItem item, Type type )
{
return false;
}
public virtual int GumpTitleNumber => 0;
public virtual string GumpTitleString => "";
public CraftContext GetContext( Mobile m )
{
if ( m == null )
return null;
public virtual CraftECA ECA => CraftECA.ChanceMinusSixty;
if ( m.Deleted )
{
m_ContextTable.Remove( m );
return null;
}
public bool Resmelt{ get; set; }
m_ContextTable.TryGetValue( m, out CraftContext c );
public bool Repair{ get; set; }
if ( c == null )
m_ContextTable[m] = c = new CraftContext();
public bool MarkOption{ get; set; }
return c;
}
public bool CanEnhance{ get; set; }
public void OnMade( Mobile m, CraftItem item )
{
CraftContext c = GetContext( m );
public abstract double GetChanceAtMin(CraftItem item);
c?.OnMade( item );
}
public virtual bool RetainsColorFrom(CraftItem item, Type type)
{
return false;
}
public bool Resmelt { get; set; }
public CraftContext GetContext(Mobile m)
{
if (m == null)
return null;
public bool Repair { get; set; }
if (m.Deleted)
{
m_ContextTable.Remove(m);
return null;
}
public bool MarkOption { get; set; }
m_ContextTable.TryGetValue(m, out CraftContext c);
public bool CanEnhance { get; set; }
if (c == null)
m_ContextTable[m] = c = new CraftContext();
public CraftSystem( int minCraftEffect, int maxCraftEffect, double delay )
{
MinCraftEffect = minCraftEffect;
MaxCraftEffect = maxCraftEffect;
Delay = delay;
return c;
}
CraftItems = new CraftItemCol();
CraftGroups = new CraftGroupCol();
CraftSubRes = new CraftSubResCol();
CraftSubRes2 = new CraftSubResCol();
public void OnMade(Mobile m, CraftItem item)
{
CraftContext c = GetContext(m);
m_Recipes = new List<int>();
m_RareRecipes = new List<int>();
c?.OnMade(item);
}
InitCraftList();
}
public virtual bool ConsumeOnFailure(Mobile from, Type resourceType, CraftItem craftItem)
{
return true;
}
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 = CraftItems.SearchFor(type);
if (craftItem != null) realCraftItem.Craft(from, this, typeRes, tool);
}
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 = 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 RandomRecipe()
{
if (m_Recipes.Count == 0)
return -1;
public int RandomRecipe()
{
if ( m_Recipes.Count == 0 )
return -1;
return m_Recipes[Utility.Random(m_Recipes.Count)];
}
return m_Recipes[Utility.Random( m_Recipes.Count )];
}
public int RandomRareRecipe()
{
if ( m_RareRecipes.Count == 0 )
return -1;
return m_RareRecipes[Utility.Random( m_RareRecipes.Count )];
}
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 CraftItems.Add( craftItem );
}
private void DoGroup( TextDefinition groupName, CraftItem craftItem )
{
int index = CraftGroups.SearchFor( groupName );
if ( index == -1)
{
CraftGroup craftGroup = new CraftGroup( groupName );
craftGroup.AddCraftItem( craftItem );
CraftGroups.Add( craftGroup );
}
else
{
CraftGroups.GetAt( index ).AddCraftItem( craftItem );
}
}
public void SetItemHue( int index, int hue )
{
CraftItem craftItem = CraftItems.GetAt( index );
craftItem.ItemHue = hue;
}
public void SetManaReq( int index, int mana )
{
CraftItem craftItem = CraftItems.GetAt( index );
craftItem.Mana = mana;
}
public void SetStamReq( int index, int stam )
{
CraftItem craftItem = CraftItems.GetAt( index );
craftItem.Stam = stam;
}
public void SetHitsReq( int index, int hits )
{
CraftItem craftItem = CraftItems.GetAt( index );
craftItem.Hits = hits;
}
public void SetUseAllRes( int index, bool useAll )
{
CraftItem craftItem = CraftItems.GetAt( index );
craftItem.UseAllRes = useAll;
}
public void SetNeedHeat( int index, bool needHeat )
{
CraftItem craftItem = CraftItems.GetAt( index );
craftItem.NeedHeat = needHeat;
}
public void SetNeedOven( int index, bool needOven )
{
CraftItem craftItem = CraftItems.GetAt( index );
craftItem.NeedOven = needOven;
}
public void SetBeverageType( int index, BeverageType requiredBeverage )
{
CraftItem craftItem = CraftItems.GetAt( index );
craftItem.RequiredBeverage = requiredBeverage;
}
public void SetNeedMill( int index, bool needMill )
{
CraftItem craftItem = CraftItems.GetAt( index );
craftItem.NeedMill = needMill;
}
public void SetNeededExpansion( int index, Expansion expansion )
{
CraftItem craftItem = CraftItems.GetAt( index );
craftItem.RequiredExpansion = expansion;
}
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 = CraftItems.GetAt( index );
craftItem.AddRes( type, name, amount, message );
}
public void AddSkill( int index, SkillName skillToMake, double minSkill, double maxSkill )
{
CraftItem craftItem = CraftItems.GetAt(index);
craftItem.AddSkill(skillToMake, minSkill, maxSkill);
}
public void SetUseSubRes2( int index, bool val )
{
CraftItem craftItem = CraftItems.GetAt(index);
craftItem.UseSubRes2 = val;
}
private void AddRecipeBase( int index, int id )
{
CraftItem craftItem = CraftItems.GetAt( index );
craftItem.AddRecipe( id, this );
}
public void AddRecipe( int index, int id )
{
AddRecipeBase( index, id );
m_Recipes.Add( id );
}
public void AddRareRecipe( int index, int id )
{
AddRecipeBase( index, id );
m_RareRecipes.Add( id );
}
public void AddQuestRecipe( int index, int id )
{
AddRecipeBase( index, id );
}
public void ForceNonExceptional( int index )
{
CraftItem craftItem = CraftItems.GetAt( index );
craftItem.ForceNonExceptional = true;
}
public void SetSubRes( Type type, string name )
{
CraftSubRes.ResType = type;
CraftSubRes.NameString = name;
CraftSubRes.Init = true;
}
public void SetSubRes( Type type, int name )
{
CraftSubRes.ResType = type;
CraftSubRes.NameNumber = name;
CraftSubRes.Init = true;
}
public void AddSubRes( Type type, int name, double reqSkill, object message )
{
CraftSubRes craftSubRes = new CraftSubRes( type, name, reqSkill, message );
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 );
CraftSubRes.Add( craftSubRes );
}
public void AddSubRes( Type type, string name, double reqSkill, object message )
{
CraftSubRes craftSubRes = new CraftSubRes( type, name, reqSkill, message );
CraftSubRes.Add( craftSubRes );
}
public void SetSubRes2( Type type, string name )
{
CraftSubRes2.ResType = type;
CraftSubRes2.NameString = name;
CraftSubRes2.Init = true;
}
public void SetSubRes2( Type type, int name )
{
CraftSubRes2.ResType = type;
CraftSubRes2.NameNumber = name;
CraftSubRes2.Init = true;
}
public void AddSubRes2( Type type, int name, double reqSkill, object message )
{
CraftSubRes craftSubRes = new CraftSubRes( type, name, reqSkill, message );
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 );
CraftSubRes2.Add( craftSubRes );
}
public void AddSubRes2( Type type, string name, double reqSkill, object message )
{
CraftSubRes craftSubRes = new CraftSubRes( type, name, reqSkill, message );
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 );
}
}
public int RandomRareRecipe()
{
if (m_RareRecipes.Count == 0)
return -1;
return m_RareRecipes[Utility.Random(m_RareRecipes.Count)];
}
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 CraftItems.Add(craftItem);
}
private void DoGroup(TextDefinition groupName, CraftItem craftItem)
{
int index = CraftGroups.SearchFor(groupName);
if (index == -1)
{
CraftGroup craftGroup = new CraftGroup(groupName);
craftGroup.AddCraftItem(craftItem);
CraftGroups.Add(craftGroup);
}
else
{
CraftGroups.GetAt(index).AddCraftItem(craftItem);
}
}
public void SetItemHue(int index, int hue)
{
CraftItem craftItem = CraftItems.GetAt(index);
craftItem.ItemHue = hue;
}
public void SetManaReq(int index, int mana)
{
CraftItem craftItem = CraftItems.GetAt(index);
craftItem.Mana = mana;
}
public void SetStamReq(int index, int stam)
{
CraftItem craftItem = CraftItems.GetAt(index);
craftItem.Stam = stam;
}
public void SetHitsReq(int index, int hits)
{
CraftItem craftItem = CraftItems.GetAt(index);
craftItem.Hits = hits;
}
public void SetUseAllRes(int index, bool useAll)
{
CraftItem craftItem = CraftItems.GetAt(index);
craftItem.UseAllRes = useAll;
}
public void SetNeedHeat(int index, bool needHeat)
{
CraftItem craftItem = CraftItems.GetAt(index);
craftItem.NeedHeat = needHeat;
}
public void SetNeedOven(int index, bool needOven)
{
CraftItem craftItem = CraftItems.GetAt(index);
craftItem.NeedOven = needOven;
}
public void SetBeverageType(int index, BeverageType requiredBeverage)
{
CraftItem craftItem = CraftItems.GetAt(index);
craftItem.RequiredBeverage = requiredBeverage;
}
public void SetNeedMill(int index, bool needMill)
{
CraftItem craftItem = CraftItems.GetAt(index);
craftItem.NeedMill = needMill;
}
public void SetNeededExpansion(int index, Expansion expansion)
{
CraftItem craftItem = CraftItems.GetAt(index);
craftItem.RequiredExpansion = expansion;
}
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 = CraftItems.GetAt(index);
craftItem.AddRes(type, name, amount, message);
}
public void AddSkill(int index, SkillName skillToMake, double minSkill, double maxSkill)
{
CraftItem craftItem = CraftItems.GetAt(index);
craftItem.AddSkill(skillToMake, minSkill, maxSkill);
}
public void SetUseSubRes2(int index, bool val)
{
CraftItem craftItem = CraftItems.GetAt(index);
craftItem.UseSubRes2 = val;
}
private void AddRecipeBase(int index, int id)
{
CraftItem craftItem = CraftItems.GetAt(index);
craftItem.AddRecipe(id, this);
}
public void AddRecipe(int index, int id)
{
AddRecipeBase(index, id);
m_Recipes.Add(id);
}
public void AddRareRecipe(int index, int id)
{
AddRecipeBase(index, id);
m_RareRecipes.Add(id);
}
public void AddQuestRecipe(int index, int id)
{
AddRecipeBase(index, id);
}
public void ForceNonExceptional(int index)
{
CraftItem craftItem = CraftItems.GetAt(index);
craftItem.ForceNonExceptional = true;
}
public void SetSubRes(Type type, string name)
{
CraftSubRes.ResType = type;
CraftSubRes.NameString = name;
CraftSubRes.Init = true;
}
public void SetSubRes(Type type, int name)
{
CraftSubRes.ResType = type;
CraftSubRes.NameNumber = name;
CraftSubRes.Init = true;
}
public void AddSubRes(Type type, int name, double reqSkill, object message)
{
CraftSubRes craftSubRes = new CraftSubRes(type, name, reqSkill, message);
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);
CraftSubRes.Add(craftSubRes);
}
public void AddSubRes(Type type, string name, double reqSkill, object message)
{
CraftSubRes craftSubRes = new CraftSubRes(type, name, reqSkill, message);
CraftSubRes.Add(craftSubRes);
}
public void SetSubRes2(Type type, string name)
{
CraftSubRes2.ResType = type;
CraftSubRes2.NameString = name;
CraftSubRes2.Init = true;
}
public void SetSubRes2(Type type, int name)
{
CraftSubRes2.ResType = type;
CraftSubRes2.NameNumber = name;
CraftSubRes2.Init = true;
}
public void AddSubRes2(Type type, int name, double reqSkill, object message)
{
CraftSubRes craftSubRes = new CraftSubRes(type, name, reqSkill, message);
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);
CraftSubRes2.Add(craftSubRes);
}
public void AddSubRes2(Type type, string name, double reqSkill, object message)
{
CraftSubRes craftSubRes = new CraftSubRes(type, name, reqSkill, message);
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);
}
}

View file

@ -3,31 +3,32 @@ using Server.Items;
namespace Server.Engines.Craft
{
public abstract class CustomCraft
{
public Mobile From { get; }
public abstract class CustomCraft
{
public CustomCraft(Mobile from, CraftItem craftItem, CraftSystem craftSystem, Type typeRes, BaseTool tool,
int quality)
{
From = from;
CraftItem = craftItem;
CraftSystem = craftSystem;
TypeRes = typeRes;
Tool = tool;
Quality = quality;
}
public CraftItem CraftItem { get; }
public Mobile From{ get; }
public CraftSystem CraftSystem { get; }
public CraftItem CraftItem{ get; }
public Type TypeRes { get; }
public CraftSystem CraftSystem{ get; }
public BaseTool Tool { get; }
public Type TypeRes{ get; }
public int Quality { get; }
public BaseTool Tool{ get; }
public CustomCraft( Mobile from, CraftItem craftItem, CraftSystem craftSystem, Type typeRes, BaseTool tool, int quality )
{
From = from;
CraftItem = craftItem;
CraftSystem = craftSystem;
TypeRes = typeRes;
Tool = tool;
Quality = quality;
}
public int Quality{ get; }
public abstract void EndCraftAction();
public abstract Item CompleteCraft( out int message );
}
public abstract void EndCraftAction();
public abstract Item CompleteCraft(out int message);
}
}

View file

@ -1,317 +1,340 @@
using System;
using Server.Targeting;
using Server.Items;
using Server.Targeting;
namespace Server.Engines.Craft
{
public enum EnhanceResult
{
None,
NotInBackpack,
BadItem,
BadResource,
AlreadyEnhanced,
Success,
Failure,
Broken,
NoResources,
NoSkill
}
public enum EnhanceResult
{
None,
NotInBackpack,
BadItem,
BadResource,
AlreadyEnhanced,
Success,
Failure,
Broken,
NoResources,
NoSkill
}
public class Enhance
{
public static EnhanceResult Invoke( Mobile from, CraftSystem craftSystem, BaseTool tool, Item item, CraftResource resource, Type resType, ref object resMessage )
{
if ( item == null )
return EnhanceResult.BadItem;
public class Enhance
{
public static EnhanceResult Invoke(Mobile from, CraftSystem craftSystem, BaseTool tool, Item item,
CraftResource resource, Type resType, ref object resMessage)
{
if (item == null)
return EnhanceResult.BadItem;
if ( !item.IsChildOf( from.Backpack ) )
return EnhanceResult.NotInBackpack;
if (!item.IsChildOf(from.Backpack))
return EnhanceResult.NotInBackpack;
if ( !(item is BaseArmor) && !(item is BaseWeapon) )
return EnhanceResult.BadItem;
if (!(item is BaseArmor) && !(item is BaseWeapon))
return EnhanceResult.BadItem;
if ( item is IArcaneEquip eq && eq.IsArcane )
return EnhanceResult.BadItem;
if (item is IArcaneEquip eq && eq.IsArcane)
return EnhanceResult.BadItem;
if ( CraftResources.IsStandard( resource ) )
return EnhanceResult.BadResource;
if (CraftResources.IsStandard(resource))
return EnhanceResult.BadResource;
int num = craftSystem.CanCraft( from, tool, item.GetType() );
int num = craftSystem.CanCraft(from, tool, item.GetType());
if ( num > 0 )
{
resMessage = num;
return EnhanceResult.None;
}
if (num > 0)
{
resMessage = num;
return EnhanceResult.None;
}
CraftItem craftItem = craftSystem.CraftItems.SearchFor( item.GetType() );
CraftItem craftItem = craftSystem.CraftItems.SearchFor(item.GetType());
if ( craftItem == null || craftItem.Resources.Count == 0 )
return EnhanceResult.BadItem;
if (craftItem == null || craftItem.Resources.Count == 0)
return EnhanceResult.BadItem;
bool allRequiredSkills = false;
if ( craftItem.GetSuccessChance( from, resType, craftSystem, false, ref allRequiredSkills ) <= 0.0 )
return EnhanceResult.NoSkill;
bool allRequiredSkills = false;
if (craftItem.GetSuccessChance(from, resType, craftSystem, false, ref allRequiredSkills) <= 0.0)
return EnhanceResult.NoSkill;
CraftResourceInfo info = CraftResources.GetInfo( resource );
CraftResourceInfo info = CraftResources.GetInfo(resource);
if ( info == null || info.ResourceTypes.Length == 0 )
return EnhanceResult.BadResource;
if (info == null || info.ResourceTypes.Length == 0)
return EnhanceResult.BadResource;
CraftAttributeInfo attributes = info.AttributeInfo;
CraftAttributeInfo attributes = info.AttributeInfo;
if ( attributes == null )
return EnhanceResult.BadResource;
if (attributes == null)
return EnhanceResult.BadResource;
int resHue = 0, maxAmount = 0;
int resHue = 0, maxAmount = 0;
if ( !craftItem.ConsumeRes( from, resType, craftSystem, ref resHue, ref maxAmount, ConsumeType.None, ref resMessage ) )
return EnhanceResult.NoResources;
if (!craftItem.ConsumeRes(from, resType, craftSystem, ref resHue, ref maxAmount, ConsumeType.None,
ref resMessage))
return EnhanceResult.NoResources;
if ( craftSystem is DefBlacksmithy )
{
if ( from.FindItemOnLayer( Layer.OneHanded ) is AncientSmithyHammer hammer )
{
hammer.UsesRemaining--;
if ( hammer.UsesRemaining < 1 )
hammer.Delete();
}
}
if (craftSystem is DefBlacksmithy)
if (from.FindItemOnLayer(Layer.OneHanded) is AncientSmithyHammer hammer)
{
hammer.UsesRemaining--;
if (hammer.UsesRemaining < 1)
hammer.Delete();
}
int phys = 0, fire = 0, cold = 0, pois = 0, nrgy = 0;
int dura = 0, luck = 0, lreq = 0, dinc = 0;
int baseChance = 0;
int phys = 0, fire = 0, cold = 0, pois = 0, nrgy = 0;
int dura = 0, luck = 0, lreq = 0, dinc = 0;
int baseChance = 0;
bool physBonus = false;
bool fireBonus = false;
bool coldBonus = false;
bool nrgyBonus = false;
bool poisBonus = false;
bool duraBonus = false;
bool luckBonus = false;
bool lreqBonus = false;
bool dincBonus = false;
bool physBonus = false;
bool fireBonus = false;
bool coldBonus = false;
bool nrgyBonus = false;
bool poisBonus = false;
bool duraBonus = false;
bool luckBonus = false;
bool lreqBonus = false;
bool dincBonus = false;
if ( item is BaseWeapon weapon )
{
if ( !CraftResources.IsStandard( weapon.Resource ) )
return EnhanceResult.AlreadyEnhanced;
if (item is BaseWeapon weapon)
{
if (!CraftResources.IsStandard(weapon.Resource))
return EnhanceResult.AlreadyEnhanced;
baseChance = 20;
baseChance = 20;
dura = weapon.MaxHitPoints;
luck = weapon.Attributes.Luck;
lreq = weapon.WeaponAttributes.LowerStatReq;
dinc = weapon.Attributes.WeaponDamage;
dura = weapon.MaxHitPoints;
luck = weapon.Attributes.Luck;
lreq = weapon.WeaponAttributes.LowerStatReq;
dinc = weapon.Attributes.WeaponDamage;
fireBonus = ( attributes.WeaponFireDamage > 0 );
coldBonus = ( attributes.WeaponColdDamage > 0 );
nrgyBonus = ( attributes.WeaponEnergyDamage > 0 );
poisBonus = ( attributes.WeaponPoisonDamage > 0 );
fireBonus = attributes.WeaponFireDamage > 0;
coldBonus = attributes.WeaponColdDamage > 0;
nrgyBonus = attributes.WeaponEnergyDamage > 0;
poisBonus = attributes.WeaponPoisonDamage > 0;
duraBonus = ( attributes.WeaponDurability > 0 );
luckBonus = ( attributes.WeaponLuck > 0 );
lreqBonus = ( attributes.WeaponLowerRequirements > 0 );
dincBonus = ( dinc > 0 );
}
else
{
BaseArmor armor = (BaseArmor)item;
duraBonus = attributes.WeaponDurability > 0;
luckBonus = attributes.WeaponLuck > 0;
lreqBonus = attributes.WeaponLowerRequirements > 0;
dincBonus = dinc > 0;
}
else
{
BaseArmor armor = (BaseArmor)item;
if ( !CraftResources.IsStandard( armor.Resource ) )
return EnhanceResult.AlreadyEnhanced;
if (!CraftResources.IsStandard(armor.Resource))
return EnhanceResult.AlreadyEnhanced;
baseChance = 20;
baseChance = 20;
phys = armor.PhysicalResistance;
fire = armor.FireResistance;
cold = armor.ColdResistance;
pois = armor.PoisonResistance;
nrgy = armor.EnergyResistance;
phys = armor.PhysicalResistance;
fire = armor.FireResistance;
cold = armor.ColdResistance;
pois = armor.PoisonResistance;
nrgy = armor.EnergyResistance;
dura = armor.MaxHitPoints;
luck = armor.Attributes.Luck;
lreq = armor.ArmorAttributes.LowerStatReq;
dura = armor.MaxHitPoints;
luck = armor.Attributes.Luck;
lreq = armor.ArmorAttributes.LowerStatReq;
physBonus = ( attributes.ArmorPhysicalResist > 0 );
fireBonus = ( attributes.ArmorFireResist > 0 );
coldBonus = ( attributes.ArmorColdResist > 0 );
nrgyBonus = ( attributes.ArmorEnergyResist > 0 );
poisBonus = ( attributes.ArmorPoisonResist > 0 );
physBonus = attributes.ArmorPhysicalResist > 0;
fireBonus = attributes.ArmorFireResist > 0;
coldBonus = attributes.ArmorColdResist > 0;
nrgyBonus = attributes.ArmorEnergyResist > 0;
poisBonus = attributes.ArmorPoisonResist > 0;
duraBonus = ( attributes.ArmorDurability > 0 );
luckBonus = ( attributes.ArmorLuck > 0 );
lreqBonus = ( attributes.ArmorLowerRequirements > 0 );
dincBonus = false;
}
duraBonus = attributes.ArmorDurability > 0;
luckBonus = attributes.ArmorLuck > 0;
lreqBonus = attributes.ArmorLowerRequirements > 0;
dincBonus = false;
}
int skill = from.Skills[craftSystem.MainSkill].Fixed / 10;
int skill = from.Skills[craftSystem.MainSkill].Fixed / 10;
if ( skill >= 100 )
baseChance -= (skill - 90) / 10;
if (skill >= 100)
baseChance -= (skill - 90) / 10;
EnhanceResult res = EnhanceResult.Success;
EnhanceResult res = EnhanceResult.Success;
if ( physBonus )
CheckResult( ref res, baseChance + phys );
if (physBonus)
CheckResult(ref res, baseChance + phys);
if ( fireBonus )
CheckResult( ref res, baseChance + fire );
if (fireBonus)
CheckResult(ref res, baseChance + fire);
if ( coldBonus )
CheckResult( ref res, baseChance + cold );
if (coldBonus)
CheckResult(ref res, baseChance + cold);
if ( nrgyBonus )
CheckResult( ref res, baseChance + nrgy );
if (nrgyBonus)
CheckResult(ref res, baseChance + nrgy);
if ( poisBonus )
CheckResult( ref res, baseChance + pois );
if (poisBonus)
CheckResult(ref res, baseChance + pois);
if ( duraBonus )
CheckResult( ref res, baseChance + (dura / 40) );
if (duraBonus)
CheckResult(ref res, baseChance + dura / 40);
if ( luckBonus )
CheckResult( ref res, baseChance + 10 + (luck / 2) );
if (luckBonus)
CheckResult(ref res, baseChance + 10 + luck / 2);
if ( lreqBonus )
CheckResult( ref res, baseChance + (lreq / 4) );
if (lreqBonus)
CheckResult(ref res, baseChance + lreq / 4);
if ( dincBonus )
CheckResult( ref res, baseChance + (dinc / 4) );
if (dincBonus)
CheckResult(ref res, baseChance + dinc / 4);
switch ( res )
{
case EnhanceResult.Broken:
{
if ( !craftItem.ConsumeRes( from, resType, craftSystem, ref resHue, ref maxAmount, ConsumeType.Half, ref resMessage ) )
return EnhanceResult.NoResources;
switch (res)
{
case EnhanceResult.Broken:
{
if (!craftItem.ConsumeRes(from, resType, craftSystem, ref resHue, ref maxAmount, ConsumeType.Half,
ref resMessage))
return EnhanceResult.NoResources;
item.Delete();
break;
}
case EnhanceResult.Success:
{
if ( !craftItem.ConsumeRes( from, resType, craftSystem, ref resHue, ref maxAmount, ConsumeType.All, ref resMessage ) )
return EnhanceResult.NoResources;
item.Delete();
break;
}
case EnhanceResult.Success:
{
if (!craftItem.ConsumeRes(from, resType, craftSystem, ref resHue, ref maxAmount, ConsumeType.All,
ref resMessage))
return EnhanceResult.NoResources;
if ( item is BaseWeapon w )
{
w.Resource = resource;
if (item is BaseWeapon w)
{
w.Resource = resource;
int hue = w.GetElementalDamageHue();
if ( hue > 0 )
w.Hue = hue;
}
else
{
((BaseArmor)item).Resource = resource;
}
int hue = w.GetElementalDamageHue();
if (hue > 0)
w.Hue = hue;
}
else
{
((BaseArmor)item).Resource = resource;
}
break;
}
case EnhanceResult.Failure:
{
if ( !craftItem.ConsumeRes( from, resType, craftSystem, ref resHue, ref maxAmount, ConsumeType.Half, ref resMessage ) )
return EnhanceResult.NoResources;
break;
}
case EnhanceResult.Failure:
{
if (!craftItem.ConsumeRes(from, resType, craftSystem, ref resHue, ref maxAmount, ConsumeType.Half,
ref resMessage))
return EnhanceResult.NoResources;
break;
}
}
break;
}
}
return res;
}
return res;
}
public static void CheckResult( ref EnhanceResult res, int chance )
{
if ( res != EnhanceResult.Success )
return; // we've already failed..
public static void CheckResult(ref EnhanceResult res, int chance)
{
if (res != EnhanceResult.Success)
return; // we've already failed..
int random = Utility.Random( 100 );
int random = Utility.Random(100);
if ( 10 > random )
res = EnhanceResult.Failure;
else if ( chance > random )
res = EnhanceResult.Broken;
}
if (10 > random)
res = EnhanceResult.Failure;
else if (chance > random)
res = EnhanceResult.Broken;
}
public static void BeginTarget( Mobile from, CraftSystem craftSystem, BaseTool tool )
{
CraftContext context = craftSystem.GetContext( from );
public static void BeginTarget(Mobile from, CraftSystem craftSystem, BaseTool tool)
{
CraftContext context = craftSystem.GetContext(from);
if ( context == null )
return;
if (context == null)
return;
int lastRes = context.LastResourceIndex;
CraftSubResCol subRes = craftSystem.CraftSubRes;
int lastRes = context.LastResourceIndex;
CraftSubResCol subRes = craftSystem.CraftSubRes;
if ( lastRes >= 0 && lastRes < subRes.Count )
{
CraftSubRes res = subRes.GetAt( lastRes );
if (lastRes >= 0 && lastRes < subRes.Count)
{
CraftSubRes res = subRes.GetAt(lastRes);
if ( from.Skills[craftSystem.MainSkill].Value < res.RequiredSkill )
{
from.SendGump( new CraftGump( from, craftSystem, tool, res.Message ) );
}
else
{
CraftResource resource = CraftResources.GetFromType( res.ItemType );
if (from.Skills[craftSystem.MainSkill].Value < res.RequiredSkill)
{
from.SendGump(new CraftGump(from, craftSystem, tool, res.Message));
}
else
{
CraftResource resource = CraftResources.GetFromType(res.ItemType);
if ( resource != CraftResource.None )
{
from.Target = new InternalTarget( craftSystem, tool, res.ItemType, resource );
from.SendLocalizedMessage( 1061004 ); // Target an item to enhance with the properties of your selected material.
}
else
{
from.SendGump( new CraftGump( from, craftSystem, tool, 1061010 ) ); // You must select a special material in order to enhance an item with its properties.
}
}
}
else
{
from.SendGump( new CraftGump( from, craftSystem, tool, 1061010 ) ); // You must select a special material in order to enhance an item with its properties.
}
if (resource != CraftResource.None)
{
from.Target = new InternalTarget(craftSystem, tool, res.ItemType, resource);
from.SendLocalizedMessage(
1061004); // Target an item to enhance with the properties of your selected material.
}
else
{
from.SendGump(new CraftGump(from, craftSystem, tool,
1061010)); // You must select a special material in order to enhance an item with its properties.
}
}
}
else
{
from.SendGump(new CraftGump(from, craftSystem, tool,
1061010)); // You must select a special material in order to enhance an item with its properties.
}
}
}
private class InternalTarget : Target
{
private CraftSystem m_CraftSystem;
private CraftResource m_Resource;
private Type m_ResourceType;
private BaseTool m_Tool;
private class InternalTarget : Target
{
private CraftSystem m_CraftSystem;
private BaseTool m_Tool;
private Type m_ResourceType;
private CraftResource m_Resource;
public InternalTarget(CraftSystem craftSystem, BaseTool tool, Type resourceType, CraftResource resource) : base(
2, false, TargetFlags.None)
{
m_CraftSystem = craftSystem;
m_Tool = tool;
m_ResourceType = resourceType;
m_Resource = resource;
}
public InternalTarget( CraftSystem craftSystem, BaseTool tool, Type resourceType, CraftResource resource ) : base ( 2, false, TargetFlags.None )
{
m_CraftSystem = craftSystem;
m_Tool = tool;
m_ResourceType = resourceType;
m_Resource = resource;
}
protected override void OnTarget(Mobile from, object targeted)
{
if (targeted is Item item)
{
object message = null;
EnhanceResult res = Enhance.Invoke(from, m_CraftSystem, m_Tool, item, m_Resource, m_ResourceType,
ref message);
protected override void OnTarget( Mobile from, object targeted )
{
if ( targeted is Item item )
{
object message = null;
EnhanceResult res = Enhance.Invoke( from, m_CraftSystem, m_Tool, item, m_Resource, m_ResourceType, ref message );
switch (res)
{
case EnhanceResult.NotInBackpack:
message = 1061005;
break; // The item must be in your backpack to enhance it.
case EnhanceResult.AlreadyEnhanced:
message = 1061012;
break; // This item is already enhanced with the properties of a special material.
case EnhanceResult.BadItem:
message = 1061011;
break; // You cannot enhance this type of item with the properties of the selected special material.
case EnhanceResult.BadResource:
message = 1061010;
break; // You must select a special material in order to enhance an item with its properties.
case EnhanceResult.Broken:
message = 1061080;
break; // You attempt to enhance the item, but fail catastrophically. The item is lost.
case EnhanceResult.Failure:
message = 1061082;
break; // You attempt to enhance the item, but fail. Some material is lost in the process.
case EnhanceResult.Success:
message = 1061008;
break; // You enhance the item with the properties of the special material.
case EnhanceResult.NoSkill:
message = 1044153;
break; // You don't have the required skills to attempt this item.
}
switch ( res )
{
case EnhanceResult.NotInBackpack: message = 1061005; break; // The item must be in your backpack to enhance it.
case EnhanceResult.AlreadyEnhanced: message = 1061012; break; // This item is already enhanced with the properties of a special material.
case EnhanceResult.BadItem: message = 1061011; break; // You cannot enhance this type of item with the properties of the selected special material.
case EnhanceResult.BadResource: message = 1061010; break; // You must select a special material in order to enhance an item with its properties.
case EnhanceResult.Broken: message = 1061080; break; // You attempt to enhance the item, but fail catastrophically. The item is lost.
case EnhanceResult.Failure: message = 1061082; break; // You attempt to enhance the item, but fail. Some material is lost in the process.
case EnhanceResult.Success: message = 1061008; break; // You enhance the item with the properties of the special material.
case EnhanceResult.NoSkill: message = 1044153; break; // You don't have the required skills to attempt this item.
}
from.SendGump( new CraftGump( from, m_CraftSystem, m_Tool, message ) );
}
}
}
}
}
from.SendGump(new CraftGump(from, m_CraftSystem, m_Tool, message));
}
}
}
}
}

View file

@ -1,53 +1,55 @@
using System;
using Server.Gumps;
using Server.Items;
using Server.Network;
namespace Server.Engines.Craft
{
public class QueryMakersMarkGump : Gump
{
private int m_Quality;
private Mobile m_From;
private CraftItem m_CraftItem;
private CraftSystem m_CraftSystem;
private Type m_TypeRes;
private BaseTool m_Tool;
public class QueryMakersMarkGump : Gump
{
private CraftItem m_CraftItem;
private CraftSystem m_CraftSystem;
private Mobile m_From;
private int m_Quality;
private BaseTool m_Tool;
private Type m_TypeRes;
public QueryMakersMarkGump( int quality, Mobile from, CraftItem craftItem, CraftSystem craftSystem, Type typeRes, BaseTool tool ) : base( 100, 200 )
{
from.CloseGump( typeof( QueryMakersMarkGump ) );
public QueryMakersMarkGump(int quality, Mobile from, CraftItem craftItem, CraftSystem craftSystem, Type typeRes,
BaseTool tool) : base(100, 200)
{
from.CloseGump(typeof(QueryMakersMarkGump));
m_Quality = quality;
m_From = from;
m_CraftItem = craftItem;
m_CraftSystem = craftSystem;
m_TypeRes = typeRes;
m_Tool = tool;
m_Quality = quality;
m_From = from;
m_CraftItem = craftItem;
m_CraftSystem = craftSystem;
m_TypeRes = typeRes;
m_Tool = tool;
AddPage( 0 );
AddPage(0);
AddBackground( 0, 0, 220, 170, 5054 );
AddBackground( 10, 10, 200, 150, 3000 );
AddBackground(0, 0, 220, 170, 5054);
AddBackground(10, 10, 200, 150, 3000);
AddHtmlLocalized( 20, 20, 180, 80, 1018317, false, false ); // Do you wish to place your maker's mark on this item?
AddHtmlLocalized(20, 20, 180, 80, 1018317, false, false); // Do you wish to place your maker's mark on this item?
AddHtmlLocalized( 55, 100, 140, 25, 1011011, false, false ); // CONTINUE
AddButton( 20, 100, 4005, 4007, 1, GumpButtonType.Reply, 0 );
AddHtmlLocalized(55, 100, 140, 25, 1011011, false, false); // CONTINUE
AddButton(20, 100, 4005, 4007, 1, GumpButtonType.Reply, 0);
AddHtmlLocalized( 55, 125, 140, 25, 1011012, false, false ); // CANCEL
AddButton( 20, 125, 4005, 4007, 0, GumpButtonType.Reply, 0 );
}
AddHtmlLocalized(55, 125, 140, 25, 1011012, false, false); // CANCEL
AddButton(20, 125, 4005, 4007, 0, GumpButtonType.Reply, 0);
}
public override void OnResponse( Network.NetState sender, RelayInfo info )
{
bool makersMark = ( info.ButtonID == 1 );
public override void OnResponse(NetState sender, RelayInfo info)
{
bool makersMark = info.ButtonID == 1;
if ( makersMark )
m_From.SendLocalizedMessage( 501808 ); // You mark the item.
else
m_From.SendLocalizedMessage( 501809 ); // Cancelled mark.
if (makersMark)
m_From.SendLocalizedMessage(501808); // You mark the item.
else
m_From.SendLocalizedMessage(501809); // Cancelled mark.
m_CraftItem.CompleteCraft( m_Quality, makersMark, m_From, m_CraftSystem, m_TypeRes, m_Tool, null );
}
}
m_CraftItem.CompleteCraft(m_Quality, makersMark, m_From, m_CraftSystem, m_TypeRes, m_Tool, null);
}
}
}

View file

@ -1,97 +1,99 @@
using System;
using System.Collections.Generic;
using Server.Mobiles;
using Server.Commands;
using Server.Mobiles;
using Server.Targeting;
namespace Server.Engines.Craft
{
public class Recipe
{
public static void Initialize()
{
CommandSystem.Register( "LearnAllRecipes", AccessLevel.GameMaster, LearnAllRecipes_OnCommand );
CommandSystem.Register( "ForgetAllRecipes", AccessLevel.GameMaster, ForgetAllRecipes_OnCommand );
}
public class Recipe
{
private TextDefinition m_TD;
[Usage( "LearnAllRecipes" )]
[Description( "Teaches a player all available recipes." )]
private static void LearnAllRecipes_OnCommand( CommandEventArgs e )
{
Mobile m = e.Mobile;
m.SendMessage( "Target a player to teach them all of the recipies." );
public Recipe(int id, CraftSystem system, CraftItem item)
{
ID = id;
CraftSystem = system;
CraftItem = item;
m.BeginTarget( -1, false, Targeting.TargetFlags.None, delegate( Mobile from, object targeted )
{
if ( targeted is PlayerMobile mobile )
{
foreach( KeyValuePair<int, Recipe> kvp in Recipes )
mobile.AcquireRecipe( kvp.Key );
if (Recipes.ContainsKey(id))
throw new Exception("Attempting to create recipe with preexisting ID.");
m.SendMessage( "You teach them all of the recipies." );
}
else
{
m.SendMessage( "That is not a player!" );
}
} );
}
[Usage( "ForgetAllRecipes" )]
[Description( "Makes a player forget all the recipies they've learned." )]
private static void ForgetAllRecipes_OnCommand( CommandEventArgs e )
{
Mobile m = e.Mobile;
m.SendMessage( "Target a player to have them forget all of the recipies they've learned." );
m.BeginTarget( -1, false, Targeting.TargetFlags.None, delegate( Mobile from, object targeted )
{
if ( targeted is PlayerMobile mobile )
{
mobile.ResetRecipes();
m.SendMessage( "They forget all their recipies." );
}
else
{
m.SendMessage( "That is not a player!" );
}
} );
}
Recipes.Add(id, this);
LargestRecipeID = Math.Max(id, LargestRecipeID);
}
public static Dictionary<int, Recipe> Recipes { get; } = new Dictionary<int, Recipe>();
public static Dictionary<int, Recipe> Recipes{ get; } = new Dictionary<int, Recipe>();
public static int LargestRecipeID { get; private set; }
public static int LargestRecipeID{ get; private set; }
public CraftSystem CraftSystem { get; set; }
public CraftSystem CraftSystem{ get; set; }
public CraftItem CraftItem { get; set; }
public CraftItem CraftItem{ get; set; }
public int ID { get; }
public int ID{ get; }
private TextDefinition m_TD;
public TextDefinition TextDefinition
{
get
{
if ( m_TD == null )
m_TD = new TextDefinition( CraftItem.NameNumber, CraftItem.NameString );
public TextDefinition TextDefinition
{
get
{
if (m_TD == null)
m_TD = new TextDefinition(CraftItem.NameNumber, CraftItem.NameString);
return m_TD;
}
}
return m_TD;
}
}
public Recipe( int id, CraftSystem system, CraftItem item )
{
ID = id;
CraftSystem = system;
CraftItem = item;
public static void Initialize()
{
CommandSystem.Register("LearnAllRecipes", AccessLevel.GameMaster, LearnAllRecipes_OnCommand);
CommandSystem.Register("ForgetAllRecipes", AccessLevel.GameMaster, ForgetAllRecipes_OnCommand);
}
if ( Recipes.ContainsKey( id ) )
throw new Exception( "Attempting to create recipe with preexisting ID." );
[Usage("LearnAllRecipes")]
[Description("Teaches a player all available recipes.")]
private static void LearnAllRecipes_OnCommand(CommandEventArgs e)
{
Mobile m = e.Mobile;
m.SendMessage("Target a player to teach them all of the recipies.");
Recipes.Add( id, this );
LargestRecipeID = Math.Max( id, LargestRecipeID );
}
}
}
m.BeginTarget(-1, false, TargetFlags.None, delegate(Mobile from, object targeted)
{
if (targeted is PlayerMobile mobile)
{
foreach (KeyValuePair<int, Recipe> kvp in Recipes)
mobile.AcquireRecipe(kvp.Key);
m.SendMessage("You teach them all of the recipies.");
}
else
{
m.SendMessage("That is not a player!");
}
});
}
[Usage("ForgetAllRecipes")]
[Description("Makes a player forget all the recipies they've learned.")]
private static void ForgetAllRecipes_OnCommand(CommandEventArgs e)
{
Mobile m = e.Mobile;
m.SendMessage("Target a player to have them forget all of the recipies they've learned.");
m.BeginTarget(-1, false, TargetFlags.None, delegate(Mobile from, object targeted)
{
if (targeted is PlayerMobile mobile)
{
mobile.ResetRecipes();
m.SendMessage("They forget all their recipies.");
}
else
{
m.SendMessage("That is not a player!");
}
});
}
}
}

View file

@ -1,512 +1,523 @@
using System;
using Server.Items;
using Server.Mobiles;
using Server.Targeting;
using Server.Items;
namespace Server.Engines.Craft
{
public class Repair
{
public Repair()
{
}
public class Repair
{
public static void Do(Mobile from, CraftSystem craftSystem, BaseTool tool)
{
from.Target = new InternalTarget(craftSystem, tool);
from.SendLocalizedMessage(1044276); // Target an item to repair.
}
public static void Do( Mobile from, CraftSystem craftSystem, BaseTool tool )
{
from.Target = new InternalTarget( craftSystem, tool );
from.SendLocalizedMessage( 1044276 ); // Target an item to repair.
}
public static void Do(Mobile from, CraftSystem craftSystem, RepairDeed deed)
{
from.Target = new InternalTarget(craftSystem, deed);
from.SendLocalizedMessage(1044276); // Target an item to repair.
}
public static void Do( Mobile from, CraftSystem craftSystem, RepairDeed deed )
{
from.Target = new InternalTarget( craftSystem, deed );
from.SendLocalizedMessage( 1044276 ); // Target an item to repair.
}
private class InternalTarget : Target
{
private CraftSystem m_CraftSystem;
private RepairDeed m_Deed;
private BaseTool m_Tool;
private class InternalTarget : Target
{
private CraftSystem m_CraftSystem;
private BaseTool m_Tool;
private RepairDeed m_Deed;
public InternalTarget(CraftSystem craftSystem, BaseTool tool) : base(2, false, TargetFlags.None)
{
m_CraftSystem = craftSystem;
m_Tool = tool;
}
public InternalTarget( CraftSystem craftSystem, BaseTool tool ) : base ( 2, false, TargetFlags.None )
{
m_CraftSystem = craftSystem;
m_Tool = tool;
}
public InternalTarget(CraftSystem craftSystem, RepairDeed deed) : base(2, false, TargetFlags.None)
{
m_CraftSystem = craftSystem;
m_Deed = deed;
}
public InternalTarget( CraftSystem craftSystem, RepairDeed deed ) : base( 2, false, TargetFlags.None )
{
m_CraftSystem = craftSystem;
m_Deed = deed;
}
private static void EndGolemRepair(object state)
{
((Mobile)state).EndAction(typeof(Golem));
}
private static void EndGolemRepair( object state )
{
((Mobile)state).EndAction( typeof( Golem ) );
}
private int GetWeakenChance(Mobile mob, SkillName skill, int curHits, int maxHits)
{
// 40% - (1% per hp lost) - (1% per 10 craft skill)
return 40 + (maxHits - curHits) - (int)((m_Deed?.SkillLevel ?? mob.Skills[skill].Value) / 10);
}
private int GetWeakenChance( Mobile mob, SkillName skill, int curHits, int maxHits )
{
// 40% - (1% per hp lost) - (1% per 10 craft skill)
return (40 + (maxHits - curHits)) - (int)((m_Deed?.SkillLevel ?? mob.Skills[skill].Value) / 10);
}
private bool CheckWeaken(Mobile mob, SkillName skill, int curHits, int maxHits)
{
return GetWeakenChance(mob, skill, curHits, maxHits) > Utility.Random(100);
}
private bool CheckWeaken( Mobile mob, SkillName skill, int curHits, int maxHits )
{
return ( GetWeakenChance( mob, skill, curHits, maxHits ) > Utility.Random( 100 ) );
}
private int GetRepairDifficulty(int curHits, int maxHits)
{
return (maxHits - curHits) * 1250 / Math.Max(maxHits, 1) - 250;
}
private int GetRepairDifficulty( int curHits, int maxHits )
{
return (((maxHits - curHits) * 1250) / Math.Max( maxHits, 1 )) - 250;
}
private bool CheckRepairDifficulty( Mobile mob, SkillName skill, int curHits, int maxHits )
{
double difficulty = GetRepairDifficulty( curHits, maxHits ) * 0.1;
private bool CheckRepairDifficulty(Mobile mob, SkillName skill, int curHits, int maxHits)
{
double difficulty = GetRepairDifficulty(curHits, maxHits) * 0.1;
if ( m_Deed != null )
{
double value = m_Deed.SkillLevel;
double minSkill = difficulty - 25.0;
double maxSkill = difficulty + 25;
if (m_Deed != null)
{
double value = m_Deed.SkillLevel;
double minSkill = difficulty - 25.0;
double maxSkill = difficulty + 25;
if ( value < minSkill )
return false; // Too difficult
if ( value >= maxSkill )
return true; // No challenge
if (value < minSkill)
return false; // Too difficult
if (value >= maxSkill)
return true; // No challenge
double chance = (value - minSkill) / (maxSkill - minSkill);
double chance = (value - minSkill) / (maxSkill - minSkill);
return (chance >= Utility.RandomDouble());
}
return chance >= Utility.RandomDouble();
}
return mob.CheckSkill( skill, difficulty - 25.0, difficulty + 25.0 );
}
return mob.CheckSkill(skill, difficulty - 25.0, difficulty + 25.0);
}
private bool CheckDeed( Mobile from )
{
if ( m_Deed != null )
{
return m_Deed.Check( from );
}
private bool CheckDeed(Mobile from)
{
if (m_Deed != null) return m_Deed.Check(from);
return true;
}
return true;
}
private bool IsSpecialClothing( BaseClothing clothing )
{
// Clothing repairable but not craftable
private bool IsSpecialClothing(BaseClothing clothing)
{
// Clothing repairable but not craftable
if ( m_CraftSystem is DefTailoring )
{
return ( clothing is BearMask )
|| ( clothing is DeerMask )
|| ( clothing is TheMostKnowledgePerson )
|| ( clothing is TheRobeOfBritanniaAri )
|| ( clothing is EmbroideredOakLeafCloak );
}
if (m_CraftSystem is DefTailoring)
return clothing is BearMask
|| clothing is DeerMask
|| clothing is TheMostKnowledgePerson
|| clothing is TheRobeOfBritanniaAri
|| clothing is EmbroideredOakLeafCloak;
return false;
}
return false;
}
private bool IsSpecialWeapon( BaseWeapon weapon )
{
// Weapons repairable but not craftable
private bool IsSpecialWeapon(BaseWeapon weapon)
{
// Weapons repairable but not craftable
if ( m_CraftSystem is DefTinkering )
{
return ( weapon is Cleaver )
|| ( weapon is Hatchet )
|| ( weapon is Pickaxe )
|| ( weapon is ButcherKnife )
|| ( weapon is SkinningKnife );
}
if (m_CraftSystem is DefTinkering)
return weapon is Cleaver
|| weapon is Hatchet
|| weapon is Pickaxe
|| weapon is ButcherKnife
|| weapon is SkinningKnife;
if ( m_CraftSystem is DefCarpentry )
{
return ( weapon is Club )
|| ( weapon is BlackStaff )
|| ( weapon is MagicWand )
#region Temporary
// TODO: Make these items craftable
|| ( weapon is WildStaff );
#endregion
}
if ( m_CraftSystem is DefBlacksmithy )
{
return ( weapon is Pitchfork )
#region Temporary
// TODO: Make these items craftable
|| ( weapon is RadiantScimitar )
|| ( weapon is WarCleaver )
|| ( weapon is ElvenSpellblade )
|| ( weapon is AssassinSpike )
|| ( weapon is Leafblade )
|| ( weapon is RuneBlade )
|| ( weapon is ElvenMachete )
|| ( weapon is OrnateAxe )
|| ( weapon is DiamondMace );
#endregion
}
#region Temporary
// TODO: Make these items craftable
if ( m_CraftSystem is DefBowFletching )
{
return ( weapon is ElvenCompositeLongbow )
|| ( weapon is MagicalShortbow );
}
if (m_CraftSystem is DefCarpentry)
{
return weapon is Club
|| weapon is BlackStaff
|| weapon is MagicWand
#endregion
#region Temporary
return false;
}
// TODO: Make these items craftable
|| weapon is WildStaff;
private bool IsSpecialArmor( BaseArmor armor )
{
// Armor repairable but not craftable
#endregion
}
#region Temporary
// TODO: Make these items craftable
if ( m_CraftSystem is DefTailoring )
{
return ( armor is LeafTonlet )
|| ( armor is LeafArms )
|| ( armor is LeafChest )
|| ( armor is LeafGloves )
|| ( armor is LeafGorget )
|| ( armor is LeafLegs )
|| ( armor is HideChest )
|| ( armor is HideGloves )
|| ( armor is HideGorget )
|| ( armor is HidePants )
|| ( armor is HidePauldrons );
}
if (m_CraftSystem is DefBlacksmithy)
{
return weapon is Pitchfork
if ( m_CraftSystem is DefCarpentry )
{
return ( armor is WingedHelm )
|| ( armor is RavenHelm )
|| ( armor is VultureHelm )
|| ( armor is WoodlandArms )
|| ( armor is WoodlandChest )
|| ( armor is WoodlandGloves )
|| ( armor is WoodlandGorget )
|| ( armor is WoodlandLegs );
}
if ( m_CraftSystem is DefBlacksmithy )
{
return ( armor is Circlet )
|| ( armor is RoyalCirclet )
|| ( armor is GemmedCirclet );
}
#region Temporary
#endregion
// TODO: Make these items craftable
|| weapon is RadiantScimitar
|| weapon is WarCleaver
|| weapon is ElvenSpellblade
|| weapon is AssassinSpike
|| weapon is Leafblade
|| weapon is RuneBlade
|| weapon is ElvenMachete
|| weapon is OrnateAxe
|| weapon is DiamondMace;
return false;
}
#endregion
}
protected override void OnTarget( Mobile from, object targeted )
{
int number;
#region Temporary
if ( !CheckDeed( from ) )
return;
// TODO: Make these items craftable
if (m_CraftSystem is DefBowFletching)
return weapon is ElvenCompositeLongbow
|| weapon is MagicalShortbow;
bool usingDeed = (m_Deed != null);
bool toDelete = false;
#endregion
// TODO: Make an IRepairable
return false;
}
if ( m_CraftSystem.CanCraft( from, m_Tool, targeted.GetType() ) == 1044267 )
{
number = 1044282; // You must be near a forge and and anvil to repair items. * Yes, there are two and's *
}
else if ( m_CraftSystem is DefTinkering && targeted is Golem g )
{
int damage = g.HitsMax - g.Hits;
private bool IsSpecialArmor(BaseArmor armor)
{
// Armor repairable but not craftable
if ( g.IsDeadBondedPet )
{
number = 500426; // You can't repair that.
}
else if ( damage <= 0 )
{
number = 500423; // That is already in full repair.
}
else
{
double skillValue = (usingDeed)? m_Deed.SkillLevel : from.Skills[SkillName.Tinkering].Value;
#region Temporary
if ( skillValue < 60.0 )
{
number = 1044153; // You don't have the required skills to attempt this item. //TODO: How does OSI handle this with deeds with golems?
}
else if ( !from.CanBeginAction( typeof( Golem ) ) )
{
number = 501789; // You must wait before trying again.
}
else
{
if ( damage > (int)(skillValue * 0.3) )
damage = (int)(skillValue * 0.3);
// TODO: Make these items craftable
if (m_CraftSystem is DefTailoring)
return armor is LeafTonlet
|| armor is LeafArms
|| armor is LeafChest
|| armor is LeafGloves
|| armor is LeafGorget
|| armor is LeafLegs
|| armor is HideChest
|| armor is HideGloves
|| armor is HideGorget
|| armor is HidePants
|| armor is HidePauldrons;
damage += 30;
if (m_CraftSystem is DefCarpentry)
return armor is WingedHelm
|| armor is RavenHelm
|| armor is VultureHelm
|| armor is WoodlandArms
|| armor is WoodlandChest
|| armor is WoodlandGloves
|| armor is WoodlandGorget
|| armor is WoodlandLegs;
if (m_CraftSystem is DefBlacksmithy)
return armor is Circlet
|| armor is RoyalCirclet
|| armor is GemmedCirclet;
if ( !from.CheckSkill( SkillName.Tinkering, 0.0, 100.0 ) )
damage /= 2;
#endregion
Container pack = from.Backpack;
return false;
}
if ( pack != null )
{
int v = pack.ConsumeUpTo( typeof( IronIngot ), (damage+4)/5 );
protected override void OnTarget(Mobile from, object targeted)
{
int number;
if ( v > 0 )
{
g.Hits += v*5;
if (!CheckDeed(from))
return;
number = 1044279; // You repair the item.
toDelete = true;
bool usingDeed = m_Deed != null;
bool toDelete = false;
from.BeginAction( typeof( Golem ) );
Timer.DelayCall( TimeSpan.FromSeconds( 12.0 ), new TimerStateCallback( EndGolemRepair ), from );
}
else
{
number = 1044037; // You do not have sufficient metal to make that.
}
}
else
{
number = 1044037; // You do not have sufficient metal to make that.
}
}
}
}
else if ( targeted is BaseWeapon weapon )
{
SkillName skill = m_CraftSystem.MainSkill;
int toWeaken = 0;
// TODO: Make an IRepairable
if ( Core.AOS )
{
toWeaken = 1;
}
else if ( skill != SkillName.Tailoring )
{
double skillLevel = (usingDeed)? m_Deed.SkillLevel : from.Skills[skill].Base;
if (m_CraftSystem.CanCraft(from, m_Tool, targeted.GetType()) == 1044267)
{
number = 1044282; // You must be near a forge and and anvil to repair items. * Yes, there are two and's *
}
else if (m_CraftSystem is DefTinkering && targeted is Golem g)
{
int damage = g.HitsMax - g.Hits;
if ( skillLevel >= 90.0 )
toWeaken = 1;
else if ( skillLevel >= 70.0 )
toWeaken = 2;
else
toWeaken = 3;
}
if (g.IsDeadBondedPet)
{
number = 500426; // You can't repair that.
}
else if (damage <= 0)
{
number = 500423; // That is already in full repair.
}
else
{
double skillValue = usingDeed ? m_Deed.SkillLevel : from.Skills[SkillName.Tinkering].Value;
if ( m_CraftSystem.CraftItems.SearchForSubclass( weapon.GetType() ) == null && !IsSpecialWeapon( weapon ) )
{
number = (usingDeed)? 1061136 : 1044277; // That item cannot be repaired. // You cannot repair that item with this type of repair contract.
}
else if ( !weapon.IsChildOf( from.Backpack ) && ( !Core.ML || weapon.Parent != from ) )
{
number = 1044275; // The item must be in your backpack to repair it.
}
else if ( !Core.AOS && weapon.PoisonCharges != 0 )
{
number = 1005012; // You cannot repair an item while a caustic substance is on it.
}
else if ( weapon.MaxHitPoints <= 0 || weapon.HitPoints == weapon.MaxHitPoints )
{
number = 1044281; // That item is in full repair
}
else if ( weapon.MaxHitPoints <= toWeaken )
{
number = 1044278; // That item has been repaired many times, and will break if repairs are attempted again.
}
else
{
if ( CheckWeaken( from, skill, weapon.HitPoints, weapon.MaxHitPoints ) )
{
weapon.MaxHitPoints -= toWeaken;
weapon.HitPoints = Math.Max( 0, weapon.HitPoints - toWeaken );
}
if (skillValue < 60.0)
{
number =
1044153; // You don't have the required skills to attempt this item. //TODO: How does OSI handle this with deeds with golems?
}
else if (!from.CanBeginAction(typeof(Golem)))
{
number = 501789; // You must wait before trying again.
}
else
{
if (damage > (int)(skillValue * 0.3))
damage = (int)(skillValue * 0.3);
if ( CheckRepairDifficulty( from, skill, weapon.HitPoints, weapon.MaxHitPoints ) )
{
number = 1044279; // You repair the item.
m_CraftSystem.PlayCraftEffect( from );
weapon.HitPoints = weapon.MaxHitPoints;
}
else
{
number = (usingDeed)? 1061137 : 1044280; // You fail to repair the item. [And the contract is destroyed]
m_CraftSystem.PlayCraftEffect( from );
}
damage += 30;
toDelete = true;
}
}
else if ( targeted is BaseArmor armor )
{
SkillName skill = m_CraftSystem.MainSkill;
int toWeaken = 0;
if (!from.CheckSkill(SkillName.Tinkering, 0.0, 100.0))
damage /= 2;
if ( Core.AOS )
{
toWeaken = 1;
}
else if ( skill != SkillName.Tailoring )
{
double skillLevel = (usingDeed)? m_Deed.SkillLevel : from.Skills[skill].Base;
Container pack = from.Backpack;
if ( skillLevel >= 90.0 )
toWeaken = 1;
else if ( skillLevel >= 70.0 )
toWeaken = 2;
else
toWeaken = 3;
}
if (pack != null)
{
int v = pack.ConsumeUpTo(typeof(IronIngot), (damage + 4) / 5);
if ( m_CraftSystem.CraftItems.SearchForSubclass( armor.GetType() ) == null && !IsSpecialArmor( armor ) )
{
number = (usingDeed)? 1061136 : 1044277; // That item cannot be repaired. // You cannot repair that item with this type of repair contract.
}
else if ( !armor.IsChildOf( from.Backpack ) && ( !Core.ML || armor.Parent != from ) )
{
number = 1044275; // The item must be in your backpack to repair it.
}
else if ( armor.MaxHitPoints <= 0 || armor.HitPoints == armor.MaxHitPoints )
{
number = 1044281; // That item is in full repair
}
else if ( armor.MaxHitPoints <= toWeaken )
{
number = 1044278; // That item has been repaired many times, and will break if repairs are attempted again.
}
else
{
if ( CheckWeaken( from, skill, armor.HitPoints, armor.MaxHitPoints ) )
{
armor.MaxHitPoints -= toWeaken;
armor.HitPoints = Math.Max( 0, armor.HitPoints - toWeaken );
}
if (v > 0)
{
g.Hits += v * 5;
if ( CheckRepairDifficulty( from, skill, armor.HitPoints, armor.MaxHitPoints ) )
{
number = 1044279; // You repair the item.
m_CraftSystem.PlayCraftEffect( from );
armor.HitPoints = armor.MaxHitPoints;
}
else
{
number = (usingDeed)? 1061137 : 1044280; // You fail to repair the item. [And the contract is destroyed]
m_CraftSystem.PlayCraftEffect( from );
}
number = 1044279; // You repair the item.
toDelete = true;
toDelete = true;
}
}
else if ( targeted is BaseClothing clothing )
{
SkillName skill = m_CraftSystem.MainSkill;
int toWeaken = 0;
from.BeginAction(typeof(Golem));
Timer.DelayCall(TimeSpan.FromSeconds(12.0), new TimerStateCallback(EndGolemRepair),
from);
}
else
{
number = 1044037; // You do not have sufficient metal to make that.
}
}
else
{
number = 1044037; // You do not have sufficient metal to make that.
}
}
}
}
else if (targeted is BaseWeapon weapon)
{
SkillName skill = m_CraftSystem.MainSkill;
int toWeaken = 0;
if ( Core.AOS )
{
toWeaken = 1;
}
else if ( skill != SkillName.Tailoring )
{
double skillLevel = (usingDeed) ? m_Deed.SkillLevel : from.Skills[skill].Base;
if (Core.AOS)
{
toWeaken = 1;
}
else if (skill != SkillName.Tailoring)
{
double skillLevel = usingDeed ? m_Deed.SkillLevel : from.Skills[skill].Base;
if ( skillLevel >= 90.0 )
toWeaken = 1;
else if ( skillLevel >= 70.0 )
toWeaken = 2;
else
toWeaken = 3;
}
if (skillLevel >= 90.0)
toWeaken = 1;
else if (skillLevel >= 70.0)
toWeaken = 2;
else
toWeaken = 3;
}
if (m_CraftSystem.CraftItems.SearchForSubclass(clothing.GetType()) == null && !IsSpecialClothing(clothing) && !((clothing is TribalMask) || (clothing is HornedTribalMask)) )
{
number = (usingDeed) ? 1061136 : 1044277; // That item cannot be repaired. // You cannot repair that item with this type of repair contract.
}
else if ( !clothing.IsChildOf( from.Backpack ) && ( !Core.ML || clothing.Parent != from ) )
{
number = 1044275; // The item must be in your backpack to repair it.
}
else if ( clothing.MaxHitPoints <= 0 || clothing.HitPoints == clothing.MaxHitPoints )
{
number = 1044281; // That item is in full repair
}
else if ( clothing.MaxHitPoints <= toWeaken )
{
number = 1044278; // That item has been repaired many times, and will break if repairs are attempted again.
}
else
{
if ( CheckWeaken( from, skill, clothing.HitPoints, clothing.MaxHitPoints ) )
{
clothing.MaxHitPoints -= toWeaken;
clothing.HitPoints = Math.Max( 0, clothing.HitPoints - toWeaken );
}
if (m_CraftSystem.CraftItems.SearchForSubclass(weapon.GetType()) == null && !IsSpecialWeapon(weapon))
{
number = usingDeed
? 1061136
: 1044277; // That item cannot be repaired. // You cannot repair that item with this type of repair contract.
}
else if (!weapon.IsChildOf(from.Backpack) && (!Core.ML || weapon.Parent != from))
{
number = 1044275; // The item must be in your backpack to repair it.
}
else if (!Core.AOS && weapon.PoisonCharges != 0)
{
number = 1005012; // You cannot repair an item while a caustic substance is on it.
}
else if (weapon.MaxHitPoints <= 0 || weapon.HitPoints == weapon.MaxHitPoints)
{
number = 1044281; // That item is in full repair
}
else if (weapon.MaxHitPoints <= toWeaken)
{
number = 1044278; // That item has been repaired many times, and will break if repairs are attempted again.
}
else
{
if (CheckWeaken(from, skill, weapon.HitPoints, weapon.MaxHitPoints))
{
weapon.MaxHitPoints -= toWeaken;
weapon.HitPoints = Math.Max(0, weapon.HitPoints - toWeaken);
}
if ( CheckRepairDifficulty( from, skill, clothing.HitPoints, clothing.MaxHitPoints ) )
{
number = 1044279; // You repair the item.
m_CraftSystem.PlayCraftEffect( from );
clothing.HitPoints = clothing.MaxHitPoints;
}
else
{
number = (usingDeed) ? 1061137 : 1044280; // You fail to repair the item. [And the contract is destroyed]
m_CraftSystem.PlayCraftEffect( from );
}
if (CheckRepairDifficulty(from, skill, weapon.HitPoints, weapon.MaxHitPoints))
{
number = 1044279; // You repair the item.
m_CraftSystem.PlayCraftEffect(from);
weapon.HitPoints = weapon.MaxHitPoints;
}
else
{
number = usingDeed
? 1061137
: 1044280; // You fail to repair the item. [And the contract is destroyed]
m_CraftSystem.PlayCraftEffect(from);
}
toDelete = true;
}
}
else if ( !usingDeed && targeted is BlankScroll scroll )
{
SkillName skill = m_CraftSystem.MainSkill;
toDelete = true;
}
}
else if (targeted is BaseArmor armor)
{
SkillName skill = m_CraftSystem.MainSkill;
int toWeaken = 0;
if ( from.Skills[skill].Value >= 50.0 )
{
scroll.Consume( 1 );
RepairDeed deed = new RepairDeed( RepairDeed.GetTypeFor( m_CraftSystem ), from.Skills[skill].Value, from );
from.AddToBackpack( deed );
if (Core.AOS)
{
toWeaken = 1;
}
else if (skill != SkillName.Tailoring)
{
double skillLevel = usingDeed ? m_Deed.SkillLevel : from.Skills[skill].Base;
number = 500442; // You create the item and put it in your backpack.
}
else
number = 1047005; // You must be at least apprentice level to create a repair service contract.
}
else if ( targeted is Item )
{
number = (usingDeed)? 1061136 : 1044277; // That item cannot be repaired. // You cannot repair that item with this type of repair contract.
}
else
{
number = 500426; // You can't repair that.
}
if (skillLevel >= 90.0)
toWeaken = 1;
else if (skillLevel >= 70.0)
toWeaken = 2;
else
toWeaken = 3;
}
if ( !usingDeed )
{
CraftContext context = m_CraftSystem.GetContext( from );
from.SendGump( new CraftGump( from, m_CraftSystem, m_Tool, number ) );
}
else
{
from.SendLocalizedMessage( number );
if (m_CraftSystem.CraftItems.SearchForSubclass(armor.GetType()) == null && !IsSpecialArmor(armor))
{
number = usingDeed
? 1061136
: 1044277; // That item cannot be repaired. // You cannot repair that item with this type of repair contract.
}
else if (!armor.IsChildOf(from.Backpack) && (!Core.ML || armor.Parent != from))
{
number = 1044275; // The item must be in your backpack to repair it.
}
else if (armor.MaxHitPoints <= 0 || armor.HitPoints == armor.MaxHitPoints)
{
number = 1044281; // That item is in full repair
}
else if (armor.MaxHitPoints <= toWeaken)
{
number = 1044278; // That item has been repaired many times, and will break if repairs are attempted again.
}
else
{
if (CheckWeaken(from, skill, armor.HitPoints, armor.MaxHitPoints))
{
armor.MaxHitPoints -= toWeaken;
armor.HitPoints = Math.Max(0, armor.HitPoints - toWeaken);
}
if ( toDelete )
m_Deed.Delete();
}
}
}
}
}
if (CheckRepairDifficulty(from, skill, armor.HitPoints, armor.MaxHitPoints))
{
number = 1044279; // You repair the item.
m_CraftSystem.PlayCraftEffect(from);
armor.HitPoints = armor.MaxHitPoints;
}
else
{
number = usingDeed
? 1061137
: 1044280; // You fail to repair the item. [And the contract is destroyed]
m_CraftSystem.PlayCraftEffect(from);
}
toDelete = true;
}
}
else if (targeted is BaseClothing clothing)
{
SkillName skill = m_CraftSystem.MainSkill;
int toWeaken = 0;
if (Core.AOS)
{
toWeaken = 1;
}
else if (skill != SkillName.Tailoring)
{
double skillLevel = usingDeed ? m_Deed.SkillLevel : from.Skills[skill].Base;
if (skillLevel >= 90.0)
toWeaken = 1;
else if (skillLevel >= 70.0)
toWeaken = 2;
else
toWeaken = 3;
}
if (m_CraftSystem.CraftItems.SearchForSubclass(clothing.GetType()) == null &&
!IsSpecialClothing(clothing) && !(clothing is TribalMask || clothing is HornedTribalMask))
{
number = usingDeed
? 1061136
: 1044277; // That item cannot be repaired. // You cannot repair that item with this type of repair contract.
}
else if (!clothing.IsChildOf(from.Backpack) && (!Core.ML || clothing.Parent != from))
{
number = 1044275; // The item must be in your backpack to repair it.
}
else if (clothing.MaxHitPoints <= 0 || clothing.HitPoints == clothing.MaxHitPoints)
{
number = 1044281; // That item is in full repair
}
else if (clothing.MaxHitPoints <= toWeaken)
{
number = 1044278; // That item has been repaired many times, and will break if repairs are attempted again.
}
else
{
if (CheckWeaken(from, skill, clothing.HitPoints, clothing.MaxHitPoints))
{
clothing.MaxHitPoints -= toWeaken;
clothing.HitPoints = Math.Max(0, clothing.HitPoints - toWeaken);
}
if (CheckRepairDifficulty(from, skill, clothing.HitPoints, clothing.MaxHitPoints))
{
number = 1044279; // You repair the item.
m_CraftSystem.PlayCraftEffect(from);
clothing.HitPoints = clothing.MaxHitPoints;
}
else
{
number = usingDeed
? 1061137
: 1044280; // You fail to repair the item. [And the contract is destroyed]
m_CraftSystem.PlayCraftEffect(from);
}
toDelete = true;
}
}
else if (!usingDeed && targeted is BlankScroll scroll)
{
SkillName skill = m_CraftSystem.MainSkill;
if (from.Skills[skill].Value >= 50.0)
{
scroll.Consume(1);
RepairDeed deed = new RepairDeed(RepairDeed.GetTypeFor(m_CraftSystem), from.Skills[skill].Value,
from);
from.AddToBackpack(deed);
number = 500442; // You create the item and put it in your backpack.
}
else
{
number = 1047005; // You must be at least apprentice level to create a repair service contract.
}
}
else if (targeted is Item)
{
number = usingDeed
? 1061136
: 1044277; // That item cannot be repaired. // You cannot repair that item with this type of repair contract.
}
else
{
number = 500426; // You can't repair that.
}
if (!usingDeed)
{
CraftContext context = m_CraftSystem.GetContext(from);
from.SendGump(new CraftGump(from, m_CraftSystem, m_Tool, number));
}
else
{
from.SendLocalizedMessage(number);
if (toDelete)
m_Deed.Delete();
}
}
}
}
}

View file

@ -1,166 +1,186 @@
using System;
using Server.Targeting;
using Server.Ethics;
using Server.Items;
using Server.Targeting;
namespace Server.Engines.Craft
{
public enum SmeltResult
{
Success,
Invalid,
NoSkill
}
public enum SmeltResult
{
Success,
Invalid,
NoSkill
}
public class Resmelt
{
public Resmelt()
{
}
public class Resmelt
{
public static void Do(Mobile from, CraftSystem craftSystem, BaseTool tool)
{
int num = craftSystem.CanCraft(from, tool, null);
public static void Do( Mobile from, CraftSystem craftSystem, BaseTool tool )
{
int num = craftSystem.CanCraft( from, tool, null );
if (num > 0 && num != 1044267)
{
from.SendGump(new CraftGump(from, craftSystem, tool, num));
}
else
{
from.Target = new InternalTarget(craftSystem, tool);
from.SendLocalizedMessage(1044273); // Target an item to recycle.
}
}
if ( num > 0 && num != 1044267 )
{
from.SendGump( new CraftGump( from, craftSystem, tool, num ) );
}
else
{
from.Target = new InternalTarget( craftSystem, tool );
from.SendLocalizedMessage( 1044273 ); // Target an item to recycle.
}
}
private class InternalTarget : Target
{
private CraftSystem m_CraftSystem;
private BaseTool m_Tool;
private class InternalTarget : Target
{
private CraftSystem m_CraftSystem;
private BaseTool m_Tool;
public InternalTarget(CraftSystem craftSystem, BaseTool tool) : base(2, false, TargetFlags.None)
{
m_CraftSystem = craftSystem;
m_Tool = tool;
}
public InternalTarget( CraftSystem craftSystem, BaseTool tool ) : base ( 2, false, TargetFlags.None )
{
m_CraftSystem = craftSystem;
m_Tool = tool;
}
private SmeltResult Resmelt(Mobile from, Item item, CraftResource resource)
{
try
{
if (Ethic.IsImbued(item))
return SmeltResult.Invalid;
private SmeltResult Resmelt( Mobile from, Item item, CraftResource resource )
{
try
{
if (CraftResources.GetType(resource) != CraftResourceType.Metal)
return SmeltResult.Invalid;
if ( Ethics.Ethic.IsImbued( item ) )
return SmeltResult.Invalid;
CraftResourceInfo info = CraftResources.GetInfo(resource);
if ( CraftResources.GetType( resource ) != CraftResourceType.Metal )
return SmeltResult.Invalid;
if (info == null || info.ResourceTypes.Length == 0)
return SmeltResult.Invalid;
CraftResourceInfo info = CraftResources.GetInfo( resource );
CraftItem craftItem = m_CraftSystem.CraftItems.SearchFor(item.GetType());
if ( info == null || info.ResourceTypes.Length == 0 )
return SmeltResult.Invalid;
if (craftItem == null || craftItem.Resources.Count == 0)
return SmeltResult.Invalid;
CraftItem craftItem = m_CraftSystem.CraftItems.SearchFor( item.GetType() );
CraftRes craftResource = craftItem.Resources.GetAt(0);
if ( craftItem == null || craftItem.Resources.Count == 0 )
return SmeltResult.Invalid;
if (craftResource.Amount < 2)
return SmeltResult.Invalid; // Not enough metal to resmelt
CraftRes craftResource = craftItem.Resources.GetAt( 0 );
double difficulty = 0.0;
if ( craftResource.Amount < 2 )
return SmeltResult.Invalid; // Not enough metal to resmelt
switch (resource)
{
case CraftResource.DullCopper:
difficulty = 65.0;
break;
case CraftResource.ShadowIron:
difficulty = 70.0;
break;
case CraftResource.Copper:
difficulty = 75.0;
break;
case CraftResource.Bronze:
difficulty = 80.0;
break;
case CraftResource.Gold:
difficulty = 85.0;
break;
case CraftResource.Agapite:
difficulty = 90.0;
break;
case CraftResource.Verite:
difficulty = 95.0;
break;
case CraftResource.Valorite:
difficulty = 99.0;
break;
}
double difficulty = 0.0;
if (difficulty > from.Skills[SkillName.Mining].Value)
return SmeltResult.NoSkill;
switch ( resource )
{
case CraftResource.DullCopper: difficulty = 65.0; break;
case CraftResource.ShadowIron: difficulty = 70.0; break;
case CraftResource.Copper: difficulty = 75.0; break;
case CraftResource.Bronze: difficulty = 80.0; break;
case CraftResource.Gold: difficulty = 85.0; break;
case CraftResource.Agapite: difficulty = 90.0; break;
case CraftResource.Verite: difficulty = 95.0; break;
case CraftResource.Valorite: difficulty = 99.0; break;
}
Type resourceType = info.ResourceTypes[0];
Item ingot = (Item)Activator.CreateInstance(resourceType);
if ( difficulty > from.Skills[ SkillName.Mining ].Value )
return SmeltResult.NoSkill;
if (item is DragonBardingDeed || item is BaseArmor armor && armor.PlayerConstructed ||
item is BaseWeapon weapon && weapon.PlayerConstructed ||
item is BaseClothing clothing && clothing.PlayerConstructed)
ingot.Amount = craftResource.Amount / 2;
else
ingot.Amount = 1;
Type resourceType = info.ResourceTypes[0];
Item ingot = (Item)Activator.CreateInstance( resourceType );
item.Delete();
from.AddToBackpack(ingot);
if ( item is DragonBardingDeed || (item is BaseArmor armor && armor.PlayerConstructed) || (item is BaseWeapon weapon && weapon.PlayerConstructed) || (item is BaseClothing clothing && clothing.PlayerConstructed) )
ingot.Amount = craftResource.Amount / 2;
else
ingot.Amount = 1;
from.PlaySound(0x2A);
from.PlaySound(0x240);
return SmeltResult.Success;
}
catch
{
}
item.Delete();
from.AddToBackpack( ingot );
return SmeltResult.Invalid;
}
from.PlaySound( 0x2A );
from.PlaySound( 0x240 );
return SmeltResult.Success;
}
catch
{
}
protected override void OnTarget(Mobile from, object targeted)
{
int num = m_CraftSystem.CanCraft(from, m_Tool, null);
return SmeltResult.Invalid;
}
if (num > 0)
{
if (num == 1044267)
{
bool anvil, forge;
protected override void OnTarget( Mobile from, object targeted )
{
int num = m_CraftSystem.CanCraft( from, m_Tool, null );
DefBlacksmithy.CheckAnvilAndForge(from, 2, out anvil, out forge);
if ( num > 0 )
{
if ( num == 1044267 )
{
bool anvil, forge;
if (!anvil)
num = 1044266; // You must be near an anvil
else if (!forge)
num = 1044265; // You must be near a forge.
}
DefBlacksmithy.CheckAnvilAndForge( from, 2, out anvil, out forge );
from.SendGump(new CraftGump(from, m_CraftSystem, m_Tool, num));
}
else
{
SmeltResult result = SmeltResult.Invalid;
bool isStoreBought = false;
int message;
if ( !anvil )
num = 1044266; // You must be near an anvil
else if ( !forge )
num = 1044265; // You must be near a forge.
}
if (targeted is BaseArmor armor)
{
result = Resmelt(from, armor, armor.Resource);
isStoreBought = !armor.PlayerConstructed;
}
else if (targeted is BaseWeapon weapon)
{
result = Resmelt(from, weapon, weapon.Resource);
isStoreBought = !weapon.PlayerConstructed;
}
else if (targeted is DragonBardingDeed deed)
{
result = Resmelt(from, deed, deed.Resource);
isStoreBought = false;
}
from.SendGump( new CraftGump( from, m_CraftSystem, m_Tool, num ) );
}
else
{
SmeltResult result = SmeltResult.Invalid;
bool isStoreBought = false;
int message;
switch (result)
{
default:
case SmeltResult.Invalid:
message = 1044272;
break; // You can't melt that down into ingots.
case SmeltResult.NoSkill:
message = 1044269;
break; // You have no idea how to work this metal.
case SmeltResult.Success:
message = isStoreBought ? 500418 : 1044270;
break; // You melt the item down into ingots.
}
if ( targeted is BaseArmor armor )
{
result = Resmelt( from, armor, armor.Resource );
isStoreBought = !armor.PlayerConstructed;
}
else if ( targeted is BaseWeapon weapon )
{
result = Resmelt( from, weapon, weapon.Resource );
isStoreBought = !weapon.PlayerConstructed;
}
else if ( targeted is DragonBardingDeed deed )
{
result = Resmelt( from, deed, deed.Resource );
isStoreBought = false;
}
switch ( result )
{
default:
case SmeltResult.Invalid: message = 1044272; break; // You can't melt that down into ingots.
case SmeltResult.NoSkill: message = 1044269; break; // You have no idea how to work this metal.
case SmeltResult.Success: message = isStoreBought ? 500418 : 1044270; break; // You melt the item down into ingots.
}
from.SendGump( new CraftGump( from, m_CraftSystem, m_Tool, message ) );
}
}
}
}
}
from.SendGump(new CraftGump(from, m_CraftSystem, m_Tool, message));
}
}
}
}
}