705 lines
21 KiB
C#
705 lines
21 KiB
C#
using System;
|
|
using Server;
|
|
using Server.Network;
|
|
using Server.Gumps;
|
|
using Server.Mobiles;
|
|
using System.Collections.Generic;
|
|
|
|
namespace Server.Items
|
|
{
|
|
public enum RefinementType
|
|
{
|
|
Reinforcing,
|
|
Deflecting
|
|
}
|
|
|
|
public enum RefinementCraftType
|
|
{
|
|
Blacksmith,
|
|
Tailor,
|
|
Carpenter
|
|
}
|
|
|
|
public enum ModType
|
|
{
|
|
Defense,
|
|
Protection,
|
|
Hardening,
|
|
Fortification,
|
|
Invulnerability
|
|
}
|
|
|
|
public enum RefinementSubCraftType
|
|
{
|
|
StuddedLeather,
|
|
StuddedSamurai,
|
|
Hide,
|
|
Bone,
|
|
Ringmail,
|
|
Chainmail,
|
|
Platemail,
|
|
PlatemailSamurai,
|
|
GargishPlatemail,
|
|
Dragon,
|
|
Woodland,
|
|
GargishStone
|
|
}
|
|
|
|
public class RefinementComponent : Item
|
|
{
|
|
private RefinementType m_RefinementType;
|
|
private RefinementCraftType m_CraftType;
|
|
private RefinementSubCraftType m_SubCraftType;
|
|
private ModType m_ModType;
|
|
|
|
[CommandProperty(AccessLevel.GameMaster)]
|
|
public RefinementType RefinementType
|
|
{
|
|
get { return m_RefinementType; }
|
|
set
|
|
{
|
|
m_RefinementType = value;
|
|
GetItemID();
|
|
GetHue();
|
|
InvalidateProperties();
|
|
}
|
|
}
|
|
|
|
[CommandProperty(AccessLevel.GameMaster)]
|
|
public RefinementCraftType CraftType
|
|
{
|
|
get { return m_CraftType; }
|
|
set
|
|
{
|
|
RefinementCraftType old = m_CraftType;
|
|
|
|
m_CraftType = value;
|
|
|
|
if (old != m_CraftType)
|
|
GetSubCraftType();
|
|
|
|
GetItemID();
|
|
GetHue();
|
|
InvalidateProperties();
|
|
}
|
|
}
|
|
|
|
[CommandProperty(AccessLevel.GameMaster)]
|
|
public RefinementSubCraftType SubCraftType { get { return m_SubCraftType; } set { m_SubCraftType = value; } }
|
|
|
|
[CommandProperty(AccessLevel.GameMaster)]
|
|
public ModType ModType { get { return m_ModType; } set { m_ModType = value; InvalidateProperties(); } }
|
|
|
|
[Constructable]
|
|
public RefinementComponent()
|
|
: this(RefinementType.Reinforcing, RefinementCraftType.Blacksmith, ModType.Defense)
|
|
{
|
|
}
|
|
|
|
public RefinementComponent(RefinementType type, RefinementCraftType craftType, ModType modType)
|
|
: base(0)
|
|
{
|
|
m_RefinementType = type;
|
|
m_CraftType = craftType;
|
|
GetSubCraftType();
|
|
m_ModType = modType;
|
|
GetItemID();
|
|
GetHue();
|
|
}
|
|
|
|
public override void AddNameProperty(ObjectPropertyList list)
|
|
{
|
|
list.Add(1153966, String.Format("#{0}\t#{1}", Labels[(int)m_RefinementType][(int)m_CraftType], GetModLabel())); // ~1_OBJTYPE~ ~2_BONUSLEVEL~
|
|
}
|
|
|
|
public override void GetProperties(ObjectPropertyList list)
|
|
{
|
|
base.GetProperties(list);
|
|
|
|
list.Add(1154002, String.Format("#{0}", 1153954 + (int)m_SubCraftType)); // Armor Type: ~1_TYPE~
|
|
list.Add(1154124, String.Format("#{0}", m_RefinementType == RefinementType.Reinforcing ? 1154123 : 1154122)); // Bonus Type: ~1_TYPE~
|
|
}
|
|
|
|
public override void OnDoubleClick(Mobile from)
|
|
{
|
|
if(!IsChildOf(from.Backpack) || from.Backpack == null)
|
|
from.SendLocalizedMessage(1054107); // This item must be in your backpack.
|
|
else if(!CheckSkill(from))
|
|
from.SendLocalizedMessage(1153981, m_CraftType.ToString()); // Only a Grandmaster ~1_PROFESSION~ would know what to do with this.
|
|
else if(!from.Backpack.ConsumeTotal(GetRawMaterial(), 20))
|
|
from.SendLocalizedMessage(1153978); // You lack the required quantity of raw materials to craft the Armor Refinement.
|
|
else
|
|
{
|
|
from.Backpack.DropItem(new RefinementItem(m_RefinementType, m_CraftType, m_SubCraftType, m_ModType));
|
|
from.PrivateOverheadMessage(MessageType.Regular, 0, 1153979, from.NetState); // *You carefully and skillfully craft an Armor Refinement* TODO Hue???
|
|
|
|
Consume();
|
|
}
|
|
}
|
|
|
|
private void GetHue()
|
|
{
|
|
if (m_RefinementType == RefinementType.Reinforcing)
|
|
{
|
|
switch (m_CraftType)
|
|
{
|
|
case RefinementCraftType.Blacksmith: Hue = 2967; break;
|
|
case RefinementCraftType.Tailor: Hue = 2587; break;
|
|
case RefinementCraftType.Carpenter: Hue = 0; break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
switch (m_CraftType)
|
|
{
|
|
case RefinementCraftType.Blacksmith: Hue = 2506; break;
|
|
case RefinementCraftType.Tailor: Hue = 2952; break;
|
|
case RefinementCraftType.Carpenter: Hue = 2119; break;
|
|
}
|
|
}
|
|
}
|
|
|
|
private bool CheckSkill(Mobile from)
|
|
{
|
|
SkillName check = SkillName.Blacksmith;
|
|
|
|
switch (m_CraftType)
|
|
{
|
|
case RefinementCraftType.Blacksmith: break;
|
|
case RefinementCraftType.Tailor: check = SkillName.Tailoring; break;
|
|
case RefinementCraftType.Carpenter: check = SkillName.Carpentry; break;
|
|
}
|
|
|
|
return from.Skills[check].Value >= 100;
|
|
}
|
|
|
|
private Type GetRawMaterial()
|
|
{
|
|
switch (m_CraftType)
|
|
{
|
|
default:
|
|
case RefinementCraftType.Blacksmith: return typeof(MalleableAlloy);
|
|
case RefinementCraftType.Tailor: return typeof(LeatherBraid);
|
|
case RefinementCraftType.Carpenter: return typeof(SolventFlask);
|
|
}
|
|
}
|
|
|
|
public void GetSubCraftType()
|
|
{
|
|
switch (m_CraftType)
|
|
{
|
|
case RefinementCraftType.Blacksmith:
|
|
m_SubCraftType = (RefinementSubCraftType)Utility.RandomMinMax(4, 9); break;
|
|
case RefinementCraftType.Tailor:
|
|
m_SubCraftType = (RefinementSubCraftType)Utility.RandomMinMax(0, 3); break;
|
|
case RefinementCraftType.Carpenter:
|
|
m_SubCraftType = (RefinementSubCraftType)Utility.RandomMinMax(10, 11); break;
|
|
}
|
|
}
|
|
|
|
private int[][] Labels = new int[][]
|
|
{
|
|
//Scour Thread Varnish
|
|
//Polish Wash Gloss
|
|
new int[] { 1153951, 1153948, 1153952 },
|
|
new int[] { 1153950, 1153949, 1153953 }
|
|
};
|
|
|
|
private int GetModLabel()
|
|
{
|
|
switch ((int)m_ModType)
|
|
{
|
|
default:
|
|
case 0: return 1153941;
|
|
case 1: return 1153944;
|
|
case 2: return 1153945;
|
|
case 3: return 1153946;
|
|
case 4: return 1153947;
|
|
}
|
|
}
|
|
|
|
private int[][] ItemIDs = new int[][]
|
|
{
|
|
// Smith Tail Carp
|
|
new int[] { 19673, 5163, 11617 }, //Reinforcing
|
|
new int[] { 19672, 5162, 19674 } //Deflecting
|
|
};
|
|
|
|
private void GetItemID()
|
|
{
|
|
ItemID = ItemIDs[(int)m_RefinementType][(int)m_CraftType];
|
|
}
|
|
|
|
public static bool Roll(Container c, int rolls, double chance)
|
|
{
|
|
for (int i = 0; i < rolls; i++)
|
|
{
|
|
if (chance >= Utility.RandomDouble())
|
|
{
|
|
c.DropItem(GetRandom());
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public static RefinementComponent GetRandom()
|
|
{
|
|
return new RefinementComponent((RefinementType)Utility.Random(2), (RefinementCraftType)Utility.Random(3), GetRandomMod());
|
|
}
|
|
|
|
private static ModType GetRandomMod()
|
|
{
|
|
double ran = Utility.RandomDouble();
|
|
|
|
if (ran >= .95) return ModType.Invulnerability;
|
|
if (ran >= .80) return ModType.Fortification;
|
|
if (ran >= .70) return ModType.Hardening;
|
|
if (ran >= .50) return ModType.Protection;
|
|
|
|
return ModType.Defense;
|
|
}
|
|
|
|
public RefinementComponent(Serial serial)
|
|
: base(serial)
|
|
{
|
|
}
|
|
|
|
public override void Serialize(GenericWriter writer)
|
|
{
|
|
base.Serialize(writer);
|
|
writer.Write((int)0);
|
|
|
|
writer.Write((int)m_RefinementType);
|
|
writer.Write((int)m_CraftType);
|
|
writer.Write((int)m_SubCraftType);
|
|
writer.Write((int)m_ModType);
|
|
}
|
|
|
|
public override void Deserialize(GenericReader reader)
|
|
{
|
|
base.Deserialize(reader);
|
|
int v = reader.ReadInt();
|
|
|
|
m_RefinementType = (RefinementType)reader.ReadInt();
|
|
m_CraftType = (RefinementCraftType)reader.ReadInt();
|
|
m_SubCraftType = (RefinementSubCraftType)reader.ReadInt();
|
|
m_ModType = (ModType)reader.ReadInt();
|
|
}
|
|
}
|
|
|
|
public class RefinementItem : Item
|
|
{
|
|
private RefinementType m_RefinementType;
|
|
private RefinementCraftType m_CraftType;
|
|
private RefinementSubCraftType m_SubCraftType;
|
|
private ModType m_ModType;
|
|
private int m_ModAmount;
|
|
private bool m_CheckBonus;
|
|
private ModEntry m_Entry;
|
|
|
|
[CommandProperty(AccessLevel.GameMaster)]
|
|
public RefinementType RefinementType
|
|
{
|
|
get { return m_RefinementType; }
|
|
set
|
|
{
|
|
m_RefinementType = value;
|
|
GetItemID();
|
|
GetHue();
|
|
InvalidateProperties();
|
|
}
|
|
}
|
|
|
|
[CommandProperty(AccessLevel.GameMaster)]
|
|
public RefinementCraftType CraftType
|
|
{
|
|
get { return m_CraftType; }
|
|
set
|
|
{
|
|
RefinementCraftType old = m_CraftType;
|
|
|
|
m_CraftType = value;
|
|
|
|
if(old != m_CraftType)
|
|
GetSubCraftType();
|
|
|
|
GetItemID();
|
|
GetHue();
|
|
InvalidateProperties();
|
|
}
|
|
}
|
|
|
|
[CommandProperty(AccessLevel.GameMaster)]
|
|
public RefinementSubCraftType SubCraftType { get { return m_SubCraftType; } set { m_SubCraftType = value; InvalidateProperties(); } }
|
|
|
|
[CommandProperty(AccessLevel.GameMaster)]
|
|
public ModType ModType { get { return m_ModType; } set { m_ModType = value; InvalidateProperties(); ApplyModAmount(); } }
|
|
|
|
[CommandProperty(AccessLevel.GameMaster)]
|
|
public int ModAmount { get { return m_ModAmount; } set { m_ModAmount = value; if (m_ModAmount > 5) m_ModAmount = 5; if (m_ModAmount < 1) m_ModAmount = 1; ; } }
|
|
|
|
[CommandProperty(AccessLevel.GameMaster)]
|
|
public bool CheckBonus { get { return m_CheckBonus; } set { m_CheckBonus = value; } }
|
|
|
|
public ModEntry Entry { get { return m_Entry; } }
|
|
|
|
[Constructable]
|
|
public RefinementItem()
|
|
: this(RefinementType.Reinforcing, RefinementCraftType.Blacksmith, RefinementSubCraftType.Ringmail, ModType.Defense)
|
|
{
|
|
}
|
|
|
|
public RefinementItem(RefinementType type, RefinementCraftType craftType, RefinementSubCraftType srtype, ModType modType)
|
|
: base(0)
|
|
{
|
|
m_RefinementType = type;
|
|
m_CraftType = craftType;
|
|
m_SubCraftType = srtype;
|
|
ModType = modType;
|
|
GetItemID();
|
|
GetHue();
|
|
ApplyModAmount();
|
|
|
|
m_Entry = new ModEntry(m_ModAmount);
|
|
|
|
m_CheckBonus = false;
|
|
}
|
|
|
|
public void ApplyModAmount()
|
|
{
|
|
switch ((int)m_ModType)
|
|
{
|
|
default:
|
|
case 0:
|
|
case 1: m_ModAmount = 1; break;
|
|
case 2: m_ModAmount = 2; break;
|
|
case 3: m_ModAmount = 3; break;
|
|
case 4: m_ModAmount = 4; break;
|
|
}
|
|
}
|
|
|
|
public override void OnDoubleClick(Mobile from)
|
|
{
|
|
if (!IsChildOf(from.Backpack))
|
|
from.SendLocalizedMessage(1054107); // This item must be in your backpack.
|
|
else if (CheckForVendor(from, this))
|
|
{
|
|
from.CloseGump(typeof(RefinementGump));
|
|
from.SendGump(new RefinementGump(this));
|
|
}
|
|
}
|
|
|
|
public override void AddNameProperty(ObjectPropertyList list)
|
|
{
|
|
list.Add(1153967, GetNameArgs()); // ~1_BONUSTYPE~ ~2_OBJTYPE~ ~3_BONUSLEVEL~
|
|
}
|
|
|
|
public override void GetProperties(ObjectPropertyList list)
|
|
{
|
|
base.GetProperties(list);
|
|
|
|
list.Add(1154002, String.Format("#{0}", (1153954 + (int)m_SubCraftType).ToString())); // Armor Type: ~1_TYPE~
|
|
list.Add(1154124, m_RefinementType == RefinementType.Reinforcing ? "#1154123" : "#1154122"); // Bonus Type: ~1_TYPE~
|
|
}
|
|
|
|
private void GetHue()
|
|
{
|
|
if (m_RefinementType == RefinementType.Reinforcing)
|
|
Hue = 2970;
|
|
else
|
|
Hue = 2953;
|
|
}
|
|
|
|
private bool CheckSkill(Mobile from)
|
|
{
|
|
SkillName check = SkillName.Blacksmith;
|
|
|
|
switch (m_CraftType)
|
|
{
|
|
case RefinementCraftType.Blacksmith: break;
|
|
case RefinementCraftType.Tailor: check = SkillName.Tailoring; break;
|
|
case RefinementCraftType.Carpenter: check = SkillName.Carpentry; break;
|
|
}
|
|
|
|
return from.Skills[check].Value >= 100;
|
|
}
|
|
|
|
public virtual int GetBonusChance()
|
|
{
|
|
if (m_ModType == ModType.Defense)
|
|
return 0;
|
|
|
|
return 5;
|
|
}
|
|
|
|
private void GetItemID()
|
|
{
|
|
ItemID = ItemIDs[(int)m_RefinementType][(int)m_CraftType];
|
|
}
|
|
|
|
public void GetSubCraftType()
|
|
{
|
|
switch (m_CraftType)
|
|
{
|
|
case RefinementCraftType.Blacksmith:
|
|
m_SubCraftType = (RefinementSubCraftType)Utility.RandomMinMax(4, 9); break;
|
|
case RefinementCraftType.Tailor:
|
|
m_SubCraftType = (RefinementSubCraftType)Utility.RandomMinMax(0, 3); break;
|
|
case RefinementCraftType.Carpenter:
|
|
m_SubCraftType = (RefinementSubCraftType)Utility.RandomMinMax(10, 11); break;
|
|
}
|
|
}
|
|
|
|
public string GetNameArgs()
|
|
{
|
|
return String.Format("#{0}\t#{1}\t#{2}", LabelPrefix[(int)m_RefinementType][(int)m_CraftType], LabelSuffix[(int)m_CraftType], GetModLabel());
|
|
}
|
|
|
|
public int[][] LabelPrefix = new int[][]
|
|
{ //Scoured Cured Varnished
|
|
//Polished Washed Glazed
|
|
new int[] { 1153971, 1153968, 1153972 }, // Reinforcing
|
|
new int[] { 1153970, 1153969, 1153973 } // Deflecting
|
|
};
|
|
|
|
public int[] LabelSuffix = new int[]
|
|
{
|
|
//Plating Thread Resin
|
|
1153975, 1153974, 1153976 //Reinforcing and Deflecting
|
|
};
|
|
|
|
private int GetModLabel()
|
|
{
|
|
switch ((int)m_ModType)
|
|
{
|
|
default:
|
|
case 0: return 1153941; // of Defense
|
|
case 1: return 1153944; // of Protection
|
|
case 2: return 1153945; // of Hardening
|
|
case 3: return 1153946; // of Fortification
|
|
case 4: return 1153947; // of Invulnerability
|
|
}
|
|
}
|
|
|
|
private int[][] ItemIDs = new int[][]
|
|
{ // Smith Tail Carp
|
|
new int[] { 19676, 19675, 19677 }, //Reinforcing
|
|
new int[] { 19676, 19675, 19677 } //Deflecing
|
|
};
|
|
|
|
public static bool CheckForVendor(Mobile from, RefinementItem item)
|
|
{
|
|
IPooledEnumerable eable = from.Map.GetMobilesInRange(from.Location, 12);
|
|
|
|
foreach (Mobile m in eable)
|
|
{
|
|
if (m is ArmorRefiner && ((ArmorRefiner)m).RefineType == item.CraftType)
|
|
{
|
|
eable.Free();
|
|
return true;
|
|
}
|
|
}
|
|
|
|
bool wtf = .5 > Utility.RandomDouble();
|
|
|
|
switch (item.CraftType)
|
|
{
|
|
case RefinementCraftType.Blacksmith: from.SendLocalizedMessage(wtf ? 1154012 : 1154009); break;
|
|
case RefinementCraftType.Tailor: from.SendLocalizedMessage(wtf ? 1154011 : 1154008); break;
|
|
case RefinementCraftType.Carpenter: from.SendLocalizedMessage(wtf ? 1154013 : 1154010); break;
|
|
}
|
|
|
|
eable.Free();
|
|
return false;
|
|
}
|
|
|
|
public RefinementItem(Serial serial)
|
|
: base(serial)
|
|
{
|
|
}
|
|
|
|
public override void Serialize(GenericWriter writer)
|
|
{
|
|
base.Serialize(writer);
|
|
writer.Write((int)0);
|
|
|
|
writer.Write((int)m_RefinementType);
|
|
writer.Write((int)m_CraftType);
|
|
writer.Write((int)m_SubCraftType);
|
|
writer.Write((int)m_ModType);
|
|
writer.Write(m_ModAmount);
|
|
writer.Write(m_CheckBonus);
|
|
|
|
m_Entry.Serialize(writer);
|
|
}
|
|
|
|
public override void Deserialize(GenericReader reader)
|
|
{
|
|
base.Deserialize(reader);
|
|
int v = reader.ReadInt();
|
|
|
|
m_RefinementType = (RefinementType)reader.ReadInt();
|
|
m_CraftType = (RefinementCraftType)reader.ReadInt();
|
|
m_SubCraftType = (RefinementSubCraftType)reader.ReadInt();
|
|
m_ModType = (ModType)reader.ReadInt();
|
|
m_ModAmount = reader.ReadInt();
|
|
m_CheckBonus = reader.ReadBool();
|
|
|
|
m_Entry = new ModEntry(reader);
|
|
}
|
|
}
|
|
|
|
public class ModEntry
|
|
{
|
|
private ResistanceType[] m_Resists = new ResistanceType[5];
|
|
private int[] m_Values = new int[5];
|
|
|
|
public ResistanceType[] Resists { get { return m_Resists; } }
|
|
public int[] Values { get { return m_Values; } }
|
|
|
|
public ModEntry(int count)
|
|
{
|
|
for (int i = 0; i < m_Resists.Length; i++)
|
|
{
|
|
m_Resists[i] = (ResistanceType)i;
|
|
m_Values[i] = 0;
|
|
}
|
|
}
|
|
|
|
public ModEntry(GenericReader reader)
|
|
{
|
|
int version = reader.ReadInt();
|
|
|
|
int count = reader.ReadInt();
|
|
|
|
for (int i = 0; i < count; i++)
|
|
{
|
|
m_Resists[i] = (ResistanceType)reader.ReadInt();
|
|
m_Values[i] = reader.ReadInt();
|
|
}
|
|
}
|
|
|
|
public void Serialize(GenericWriter writer)
|
|
{
|
|
writer.Write((int)0);
|
|
|
|
writer.Write(m_Resists.Length);
|
|
|
|
for (int i = 0; i < m_Resists.Length; i++)
|
|
{
|
|
writer.Write((int)m_Resists[i]);
|
|
writer.Write(m_Values[i]);
|
|
}
|
|
}
|
|
}
|
|
|
|
public class LeatherBraid : Item
|
|
{
|
|
public override int LabelNumber { get { return 1154003; } } // Leather braid
|
|
|
|
[Constructable]
|
|
public LeatherBraid() : this(1)
|
|
{
|
|
}
|
|
|
|
[Constructable]
|
|
public LeatherBraid(int amount) : base(5152)
|
|
{
|
|
Stackable = true;
|
|
Amount = amount;
|
|
Hue = 2968;
|
|
}
|
|
|
|
public LeatherBraid(Serial serial)
|
|
: base(serial)
|
|
{
|
|
}
|
|
|
|
public override void Serialize(GenericWriter writer)
|
|
{
|
|
base.Serialize(writer);
|
|
writer.Write((int)0);
|
|
}
|
|
|
|
public override void Deserialize(GenericReader reader)
|
|
{
|
|
base.Deserialize(reader);
|
|
int v = reader.ReadInt();
|
|
}
|
|
}
|
|
|
|
public class MalleableAlloy : Item
|
|
{
|
|
public override int LabelNumber { get { return 1154005; } } // Melleable Alloy
|
|
|
|
[Constructable]
|
|
public MalleableAlloy()
|
|
: this(1)
|
|
{
|
|
}
|
|
|
|
[Constructable]
|
|
public MalleableAlloy(int amount)
|
|
: base(0x1BE9)
|
|
{
|
|
Stackable = true;
|
|
Amount = amount;
|
|
Hue = 2949;
|
|
}
|
|
|
|
public MalleableAlloy(Serial serial)
|
|
: base(serial)
|
|
{
|
|
}
|
|
|
|
public override void Serialize(GenericWriter writer)
|
|
{
|
|
base.Serialize(writer);
|
|
writer.Write((int)0);
|
|
}
|
|
|
|
public override void Deserialize(GenericReader reader)
|
|
{
|
|
base.Deserialize(reader);
|
|
int v = reader.ReadInt();
|
|
}
|
|
}
|
|
|
|
public class SolventFlask : Item
|
|
{
|
|
public override int LabelNumber { get { return 1154004; } } // Solvent Flask
|
|
|
|
[Constructable]
|
|
public SolventFlask()
|
|
: this(1)
|
|
{
|
|
}
|
|
|
|
[Constructable]
|
|
public SolventFlask(int amount)
|
|
: base(7192)
|
|
{
|
|
Stackable = true;
|
|
Amount = amount;
|
|
Hue = 2969;
|
|
}
|
|
|
|
public SolventFlask(Serial serial)
|
|
: base(serial)
|
|
{
|
|
}
|
|
|
|
public override void Serialize(GenericWriter writer)
|
|
{
|
|
base.Serialize(writer);
|
|
writer.Write((int)0);
|
|
}
|
|
|
|
public override void Deserialize(GenericReader reader)
|
|
{
|
|
base.Deserialize(reader);
|
|
int v = reader.ReadInt();
|
|
}
|
|
}
|
|
} |