using System; using System.Collections; using System.Collections.Generic; using Server; using Server.Items; using Server.Gumps; using Server.Network; namespace Server.Mobiles { public class Barber : BaseVendor { private List m_SBInfos = new List(); protected override List SBInfos{ get { return m_SBInfos; } } public override bool ClickTitle{ get{ return false; } } public override bool IsActiveBuyer{ get{ return false; } } public override bool IsActiveSeller{ get{ return true; } } public override bool OnBuyItems( Mobile buyer, List list ) { return false; } public static readonly object From = new object(); public static readonly object Vendor = new object(); public static readonly object Price = new object(); private static HairstylistBuyInfo[] m_SellList = new HairstylistBuyInfo[] { new HairstylistBuyInfo( 1018357, 50000, false, typeof( ChangeHairstyleGump ), new object[] { From, Vendor, Price, false, ChangeHairstyleEntry.HairEntries } ), new HairstylistBuyInfo( 1018358, 50000, true, typeof( ChangeHairstyleGump ), new object[] { From, Vendor, Price, true, ChangeHairstyleEntry.BeardEntries } ), new HairstylistBuyInfo( 1018359, 50, false, typeof( ChangeHairHueGump ), new object[] { From, Vendor, Price, true, true, ChangeHairHueEntry.RegularEntries } ), new HairstylistBuyInfo( 1018360, 500000, false, typeof( ChangeHairHueGump ), new object[] { From, Vendor, Price, true, true, ChangeHairHueEntry.BrightEntries } ), new HairstylistBuyInfo( 1018361, 30000, false, typeof( ChangeHairHueGump ), new object[] { From, Vendor, Price, true, false, ChangeHairHueEntry.RegularEntries } ), new HairstylistBuyInfo( 1018362, 30000, true, typeof( ChangeHairHueGump ), new object[] { From, Vendor, Price, false, true, ChangeHairHueEntry.RegularEntries } ), new HairstylistBuyInfo( 1018363, 500000, false, typeof( ChangeHairHueGump ), new object[] { From, Vendor, Price, true, false, ChangeHairHueEntry.BrightEntries } ), new HairstylistBuyInfo( 1018364, 500000, true, typeof( ChangeHairHueGump ), new object[] { From, Vendor, Price, false, true, ChangeHairHueEntry.BrightEntries } ) }; public override void VendorBuy( Mobile from ) { from.SendGump( new HairstylistBuyGump( from, this, m_SellList ) ); } [Constructable] public Barber() : base( "the barber" ) { } public override void InitSBInfo() { } public Barber( Serial serial ) : base( serial ) { } public override void Serialize( GenericWriter writer ) { base.Serialize( writer ); writer.Write( (int) 0 ); // version } public override void Deserialize( GenericReader reader ) { base.Deserialize( reader ); int version = reader.ReadInt(); } } public class HairstylistBuyInfo { private int m_Title; private string m_TitleString; private int m_Price; private bool m_FacialHair; private Type m_GumpType; private object[] m_GumpArgs; public int Title{ get{ return m_Title; } } public string TitleString{ get{ return m_TitleString; } } public int Price{ get{ return m_Price; } } public bool FacialHair{ get{ return m_FacialHair; } } public Type GumpType{ get{ return m_GumpType; } } public object[] GumpArgs{ get{ return m_GumpArgs; } } public HairstylistBuyInfo( int title, int price, bool facialHair, Type gumpType, object[] args ) { m_Title = title; m_Price = price; m_FacialHair = facialHair; m_GumpType = gumpType; m_GumpArgs = args; } public HairstylistBuyInfo( string title, int price, bool facialHair, Type gumpType, object[] args ) { m_TitleString = title; m_Price = price; m_FacialHair = facialHair; m_GumpType = gumpType; m_GumpArgs = args; } } public class HairstylistBuyGump : Gump { private Mobile m_From; private Mobile m_Vendor; private HairstylistBuyInfo[] m_SellList; public HairstylistBuyGump( Mobile from, Mobile vendor, HairstylistBuyInfo[] sellList ) : base( 50, 50 ) { m_From = from; m_Vendor = vendor; m_SellList = sellList; from.CloseGump( typeof( HairstylistBuyGump ) ); from.CloseGump( typeof( ChangeHairHueGump ) ); from.CloseGump( typeof( ChangeHairstyleGump ) ); bool isFemale = ( from.Female || from.Body.IsFemale ); int balance = Innkeeper.GetBalance( from ); int canAfford = 0; for ( int i = 0; i < sellList.Length; ++i ) { if ( balance >= sellList[i].Price && (!sellList[i].FacialHair || !isFemale) ) ++canAfford; } AddPage( 0 ); AddBackground( 50, 10, 450, 100 + (canAfford * 25), 2600 ); AddHtmlLocalized( 100, 40, 350, 20, 1018356, false, false ); // Choose your hairstyle change: int index = 0; for ( int i = 0; i < sellList.Length; ++i ) { if ( balance >= sellList[i].Price && (!sellList[i].FacialHair || !isFemale) ) { if ( sellList[i].TitleString != null ) AddHtml( 140, 75 + (index * 25), 300, 20, sellList[i].TitleString, false, false ); else AddHtmlLocalized( 140, 75 + (index * 25), 300, 20, sellList[i].Title, false, false ); AddButton( 100, 75 + (index++ * 25), 4005, 4007, 1 + i, GumpButtonType.Reply, 0 ); } } } public override void OnResponse( NetState sender, RelayInfo info ) { int index = info.ButtonID - 1; if ( index >= 0 && index < m_SellList.Length ) { HairstylistBuyInfo buyInfo = m_SellList[index]; int balance = Innkeeper.GetBalance( m_From ); bool isFemale = ( m_From.Female || m_From.Body.IsFemale ); if ( buyInfo.FacialHair && isFemale ) { // You cannot place facial hair on a woman! m_Vendor.PrivateOverheadMessage( MessageType.Regular, 0x3B2, 1010639, m_From.NetState ); } else if ( balance >= buyInfo.Price ) { try { object[] origArgs = buyInfo.GumpArgs; object[] args = new object[origArgs.Length]; for ( int i = 0; i < args.Length; ++i ) { if ( origArgs[i] == Barber.Price ) args[i] = m_SellList[index].Price; else if ( origArgs[i] == Barber.From ) args[i] = m_From; else if ( origArgs[i] == Barber.Vendor ) args[i] = m_Vendor; else args[i] = origArgs[i]; } Gump g = Activator.CreateInstance( buyInfo.GumpType, args ) as Gump; m_From.SendGump( g ); } catch { } } else { // You cannot afford my services for that style. m_Vendor.PrivateOverheadMessage( MessageType.Regular, 0x3B2, 1042293, m_From.NetState ); } } } } public class ChangeHairHueEntry { private string m_Name; private int[] m_Hues; public string Name{ get{ return m_Name; } } public int[] Hues{ get{ return m_Hues; } } public ChangeHairHueEntry( string name, int[] hues ) { m_Name = name; m_Hues = hues; } public ChangeHairHueEntry( string name, int start, int count ) { m_Name = name; m_Hues = new int[count]; for ( int i = 0; i < count; ++i ) m_Hues[i] = start + i; } public static readonly ChangeHairHueEntry[] BrightEntries = new ChangeHairHueEntry[] { new ChangeHairHueEntry( "*****", 12, 10 ), new ChangeHairHueEntry( "*****", 32, 5 ), new ChangeHairHueEntry( "*****", 38, 8 ), new ChangeHairHueEntry( "*****", 54, 3 ), new ChangeHairHueEntry( "*****", 62, 10 ), new ChangeHairHueEntry( "*****", 81, 2 ), new ChangeHairHueEntry( "*****", 89, 2 ), new ChangeHairHueEntry( "*****", 1153, 2 ) }; public static readonly ChangeHairHueEntry[] RegularEntries = new ChangeHairHueEntry[] { new ChangeHairHueEntry( "*****", 1602, 26 ), new ChangeHairHueEntry( "*****", 1628, 27 ), new ChangeHairHueEntry( "*****", 1502, 32 ), new ChangeHairHueEntry( "*****", 1302, 32 ), new ChangeHairHueEntry( "*****", 1402, 32 ), new ChangeHairHueEntry( "*****", 1202, 24 ), new ChangeHairHueEntry( "*****", 2402, 29 ), new ChangeHairHueEntry( "*****", 2213, 6 ), new ChangeHairHueEntry( "*****", 1102, 8 ), new ChangeHairHueEntry( "*****", 1110, 8 ), new ChangeHairHueEntry( "*****", 1118, 16 ), new ChangeHairHueEntry( "*****", 1134, 16 ) }; } public class ChangeHairHueGump : Gump { private Mobile m_From; private Mobile m_Vendor; private int m_Price; private bool m_Hair; private bool m_FacialHair; private ChangeHairHueEntry[] m_Entries; public ChangeHairHueGump( Mobile from, Mobile vendor, int price, bool hair, bool facialHair, ChangeHairHueEntry[] entries ) : base( 50, 50 ) { m_From = from; m_Vendor = vendor; m_Price = price; m_Hair = hair; m_FacialHair = facialHair; m_Entries = entries; from.CloseGump( typeof( HairstylistBuyGump ) ); from.CloseGump( typeof( ChangeHairHueGump ) ); from.CloseGump( typeof( ChangeHairstyleGump ) ); AddPage( 0 ); AddBackground( 100, 10, 350, 370, 2600 ); AddBackground( 120, 54, 110, 270, 5100 ); AddHtmlLocalized( 155, 25, 240, 30, 1011013, false, false ); //
Hair Color Selection Menu
AddHtmlLocalized( 150, 330, 220, 35, 1011014, false, false ); // Dye my hair this color! AddButton( 380, 330, 4005, 4007, 1, GumpButtonType.Reply, 0 ); for ( int i = 0; i < entries.Length; ++i ) { ChangeHairHueEntry entry = entries[i]; AddLabel( 130, 59 + (i * 22), entry.Hues[0] - 1, entry.Name ); AddButton( 207, 60 + (i * 22), 5224, 5224, 0, GumpButtonType.Page, 1 + i ); } for ( int i = 0; i < entries.Length; ++i ) { ChangeHairHueEntry entry = entries[i]; int[] hues = entry.Hues; string name = entry.Name; AddPage( 1 + i ); for ( int j = 0; j < hues.Length; ++j ) { AddLabel( 278 + ((j / 16) * 80), 52 + ((j % 16) * 17), hues[j] - 1, name ); AddRadio( 260 + ((j / 16) * 80), 52 + ((j % 16) * 17), 210, 211, false, (j * entries.Length) + i ); } } } public override void OnResponse( NetState sender, RelayInfo info ) { if ( info.ButtonID == 1 ) { int[] switches = info.Switches; if ( switches.Length > 0 ) { int index = switches[0] % m_Entries.Length; int offset = switches[0] / m_Entries.Length; if ( index >= 0 && index < m_Entries.Length ) { if ( offset >= 0 && offset < m_Entries[index].Hues.Length ) { if ( m_Hair && m_From.HairItemID > 0 || m_FacialHair && m_From.FacialHairItemID > 0 ) { if ( !Innkeeper.Withdraw( m_From, m_Price ) ) { m_Vendor.PrivateOverheadMessage( MessageType.Regular, 0x3B2, 1042293, m_From.NetState ); // You cannot afford my services for that style. return; } int hue = m_Entries[index].Hues[offset]; if ( m_Hair ) m_From.HairHue = hue; if ( m_FacialHair ) m_From.FacialHairHue = hue; } else m_Vendor.PrivateOverheadMessage( MessageType.Regular, 0x3B2, 502623, m_From.NetState ); // You have no hair to dye and you cannot use this. } } } else { // You decide not to change your hairstyle. m_Vendor.PrivateOverheadMessage( MessageType.Regular, 0x3B2, 1013009, m_From.NetState ); } } else { // You decide not to change your hairstyle. m_Vendor.PrivateOverheadMessage( MessageType.Regular, 0x3B2, 1013009, m_From.NetState ); } } } public class ChangeHairstyleEntry { private int m_ItemID; private int m_GumpID; private int m_X, m_Y; public int ItemID{ get{ return m_ItemID; } } public int GumpID{ get{ return m_GumpID; } } public int X{ get{ return m_X; } } public int Y{ get{ return m_Y; } } public ChangeHairstyleEntry( int gumpID, int x, int y, int itemID ) { m_GumpID = gumpID; m_X = x; m_Y = y; m_ItemID = itemID; } public static readonly ChangeHairstyleEntry[] HairEntries = new ChangeHairstyleEntry[] { new ChangeHairstyleEntry( 50700, 70 - 137, 20 - 60, 0x203B ), new ChangeHairstyleEntry( 60710, 193 - 260, 18 - 60, 0x2045 ), new ChangeHairstyleEntry( 50703, 316 - 383, 25 - 60, 0x2044 ), new ChangeHairstyleEntry( 60708, 70 - 137, 75 - 125, 0x203C ), new ChangeHairstyleEntry( 60900, 193 - 260, 85 - 125, 0x2047 ), new ChangeHairstyleEntry( 60713, 320 - 383, 85 - 125, 0x204A ), new ChangeHairstyleEntry( 60702, 70 - 137, 140 - 190, 0x203D ), new ChangeHairstyleEntry( 60707, 193 - 260, 140 - 190, 0x2049 ), new ChangeHairstyleEntry( 60901, 315 - 383, 150 - 190, 0x2048 ), new ChangeHairstyleEntry( 0, 0, 0, 0 ) }; public static readonly ChangeHairstyleEntry[] BeardEntries = new ChangeHairstyleEntry[] { new ChangeHairstyleEntry( 50800, 120 - 187, 30 - 80, 0x2040 ), new ChangeHairstyleEntry( 50904, 243 - 310, 33 - 80, 0x204B ), new ChangeHairstyleEntry( 50906, 120 - 187, 100 - 150, 0x204D ), new ChangeHairstyleEntry( 50801, 243 - 310, 95 - 150, 0x203E ), new ChangeHairstyleEntry( 50802, 120 - 187, 173 - 220, 0x203F ), new ChangeHairstyleEntry( 50905, 243 - 310, 165 - 220, 0x204C ), new ChangeHairstyleEntry( 50808, 120 - 187, 242 - 290, 0x2041 ), new ChangeHairstyleEntry( 0, 0, 0, 0 ) }; } public class ChangeHairstyleGump : Gump { private Mobile m_From; private Mobile m_Vendor; private int m_Price; private bool m_FacialHair; private ChangeHairstyleEntry[] m_Entries; public ChangeHairstyleGump( Mobile from, Mobile vendor, int price, bool facialHair, ChangeHairstyleEntry[] entries ) : base( 50, 50 ) { m_From = from; m_Vendor = vendor; m_Price = price; m_FacialHair = facialHair; m_Entries = entries; from.CloseGump( typeof( HairstylistBuyGump ) ); from.CloseGump( typeof( ChangeHairHueGump ) ); from.CloseGump( typeof( ChangeHairstyleGump ) ); int tableWidth = ( m_FacialHair ? 2 : 3 ); int tableHeight = ( (entries.Length + tableWidth - ( m_FacialHair ? 1 : 2 )) / tableWidth ); int offsetWidth = 123; int offsetHeight = ( m_FacialHair ? 70 : 65 ); AddPage( 0 ); AddBackground( 0, 0, 81 + (tableWidth * offsetWidth), 105 + (tableHeight * offsetHeight), 2600 ); AddButton( 45, 45 + (tableHeight * offsetHeight), 4005, 4007, 1, GumpButtonType.Reply, 0 ); AddHtmlLocalized( 77, 45 + (tableHeight * offsetHeight), 90, 35, 1006044, false, false ); // Ok AddButton( 81 + (tableWidth * offsetWidth) - 180, 45 + (tableHeight * offsetHeight), 4005, 4007, 0, GumpButtonType.Reply, 0 ); AddHtmlLocalized( 81 + (tableWidth * offsetWidth) - 148, 45 + (tableHeight * offsetHeight), 90, 35, 1006045, false, false ); // Cancel if ( !facialHair ) AddHtmlLocalized( 50, 15, 350, 20, 1018353, false, false ); //
New Hairstyle
else AddHtmlLocalized( 55, 15, 200, 20, 1018354, false, false ); //
New Beard
for ( int i = 0; i < entries.Length; ++i ) { int xTable = i % tableWidth; int yTable = i / tableWidth; if ( entries[i].GumpID != 0 ) { AddRadio( 40 + (xTable * offsetWidth), 70 + (yTable * offsetHeight), 208, 209, false, i ); AddBackground( 87 + (xTable * offsetWidth), 50 + (yTable * offsetHeight), 50, 50, 2620 ); AddImage( 87 + (xTable * offsetWidth) + entries[i].X, 50 + (yTable * offsetHeight) + entries[i].Y, entries[i].GumpID ); } else if ( !facialHair ) { AddRadio( 40 + ((xTable + 1) * offsetWidth), 240, 208, 209, false, i ); AddHtmlLocalized( 60 + ((xTable + 1) * offsetWidth), 240, 85, 35, 1011064, false, false ); // Bald } else { AddRadio( 40 + (xTable * offsetWidth), 70 + (yTable * offsetHeight), 208, 209, false, i ); AddHtmlLocalized( 60 + (xTable * offsetWidth), 70 + (yTable * offsetHeight), 85, 35, 1011064, false, false ); // Bald } } } public override void OnResponse( NetState sender, RelayInfo info ) { if ( m_FacialHair && (m_From.Female || m_From.Body.IsFemale) ) return; if ( info.ButtonID == 1 ) { int[] switches = info.Switches; if ( switches.Length > 0 ) { int index = switches[0]; if ( index >= 0 && index < m_Entries.Length ) { ChangeHairstyleEntry entry = m_Entries[index]; if ( m_From is PlayerMobile ) ((PlayerMobile)m_From).SetHairMods( -1, -1 ); int hairID = m_From.RecordHair; int facialHairID = m_From.RecordBeard; if ( entry.ItemID == 0 ) { if ( m_FacialHair ? (facialHairID == 0) : (hairID == 0) ) return; if ( Innkeeper.Withdraw( m_From, m_Price ) ) { if ( m_FacialHair ) { m_From.FacialHairItemID = 0; m_From.RecordBeard = 0; } else { m_From.HairItemID = 0; m_From.RecordHair = 0; } } else m_Vendor.PrivateOverheadMessage( MessageType.Regular, 0x3B2, 1042293, m_From.NetState ); // You cannot afford my services for that style. } else { if ( m_FacialHair ) { if ( facialHairID > 0 && facialHairID == entry.ItemID ) return; } else { if ( hairID > 0 && hairID == entry.ItemID ) return; } if ( Innkeeper.Withdraw( m_From, m_Price ) ) { if ( m_FacialHair ) { m_From.FacialHairItemID = entry.ItemID; m_From.RecordBeard = m_From.FacialHairItemID; } else { m_From.HairItemID = entry.ItemID; m_From.RecordHair = m_From.HairItemID; } } else m_Vendor.PrivateOverheadMessage( MessageType.Regular, 0x3B2, 1042293, m_From.NetState ); // You cannot afford my services for that style. } } } else { // You decide not to change your hairstyle. m_Vendor.PrivateOverheadMessage( MessageType.Regular, 0x3B2, 1013009, m_From.NetState ); } } else { // You decide not to change your hairstyle. m_Vendor.PrivateOverheadMessage( MessageType.Regular, 0x3B2, 1013009, m_From.NetState ); } } } }