1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.

basevendor hair /need help

Discussion in 'Script Support' started by thor86, Jun 18, 2014.

  1. thor86
    Offline

    thor86 Member

    Joined:
    Jun 10, 2014
    Messages:
    44
    Likes Received:
    7
    I noticed sometimes when the vendors spawn or respawn sometimes the girls have beards and sometimes the guys dress like girls not sure whats going on there but would like to find a way to change it to only male can have facial hair thanks if anyone can help

    Code (C#):
    1. #region Header
    2. // **********
    3. // ServUO - BaseVendor.cs
    4. // **********
    5. #endregion
    6.  
    7. #region References
    8. using System;
    9. using System.Collections;
    10. using System.Collections.Generic;
    11. #region Alpha Gold Ledger Edit 1
    12. using System.Collections.Generic;
    13. #endregion
    14. using Server.ContextMenus;
    15. using Server.Engines.BulkOrders;
    16. using Server.Factions;
    17. using Server.Items;
    18. using Server.Misc;
    19. using Server.Mobiles;
    20. using Server.Network;
    21. using Server.Regions;
    22. #endregion
    23.  
    24.  
    25. #region References
    26. using System;
    27. using System.Collections;
    28. using System.Collections.Generic;
    29.  
    30. using Server.ContextMenus;
    31. using Server.Engines.BulkOrders;
    32. using Server.Factions;
    33. using Server.Items;
    34. using Server.Misc;
    35. using Server.Mobiles;
    36. using Server.Network;
    37. using Server.Regions;
    38. #endregion
    39.  
    40. namespace Server.Mobiles
    41. {
    42.     public enum VendorShoeType
    43.     {
    44.         None,
    45.         Shoes,
    46.         Boots,
    47.         Sandals,
    48.         ThighBoots
    49.     }
    50.  
    51.     public abstract class BaseVendor : BaseCreature, IVendor
    52.     {
    53.         private const int MaxSell = 500;
    54.  
    55.         protected abstract List<SBInfo> SBInfos { get; }
    56.  
    57.         private readonly ArrayList m_ArmorBuyInfo = new ArrayList();
    58.         private readonly ArrayList m_ArmorSellInfo = new ArrayList();
    59.  
    60.         private DateTime m_LastRestock;
    61.  
    62.         public override bool CanTeach { get { return true; } }
    63.  
    64.         public override bool BardImmune { get { return true; } }
    65.  
    66.         public override bool PlayerRangeSensitive { get { return true; } }
    67.  
    68.         public virtual bool IsActiveVendor { get { return true; } }
    69.         public virtual bool IsActiveBuyer { get { return IsActiveVendor; } } // response to vendor SELL
    70.         public virtual bool IsActiveSeller { get { return IsActiveVendor; } } // repsonse to vendor BUY
    71.  
    72.         public virtual NpcGuild NpcGuild { get { return NpcGuild.None; } }
    73.  
    74.         public override bool IsInvulnerable { get { return true; } }
    75.  
    76.         public virtual DateTime NextTrickOrTreat { get; set; }
    77.  
    78.         public override bool ShowFameTitle { get { return false; } }
    79.  
    80.         public virtual bool IsValidBulkOrder(Item item)
    81.         {
    82.             return false;
    83.         }
    84.  
    85.         public virtual Item CreateBulkOrder(Mobile from, bool fromContextMenu)
    86.         {
    87.             return null;
    88.         }
    89.  
    90.         public virtual bool SupportsBulkOrders(Mobile from)
    91.         {
    92.             return false;
    93.         }
    94.  
    95.         public virtual TimeSpan GetNextBulkOrder(Mobile from)
    96.         {
    97.             return TimeSpan.Zero;
    98.         }
    99.  
    100.         public virtual void OnSuccessfulBulkOrderReceive(Mobile from)
    101.         { }
    102.  
    103.         #region Faction
    104.         public virtual int GetPriceScalar()
    105.         {
    106.             Town town = Town.FromRegion(Region);
    107.  
    108.             if (town != null)
    109.             {
    110.                 return (100 + town.Tax);
    111.             }
    112.  
    113.             return 100;
    114.         }
    115.  
    116.         public void UpdateBuyInfo()
    117.         {
    118.             int priceScalar = GetPriceScalar();
    119.  
    120.             var buyinfo = (IBuyItemInfo[])m_ArmorBuyInfo.ToArray(typeof(IBuyItemInfo));
    121.  
    122.             if (buyinfo != null)
    123.             {
    124.                 foreach (IBuyItemInfo info in buyinfo)
    125.                 {
    126.                     info.PriceScalar = priceScalar;
    127.                 }
    128.             }
    129.         }
    130.         #endregion
    131.  
    132.         private class BulkOrderInfoEntry : ContextMenuEntry
    133.         {
    134.             private readonly Mobile m_From;
    135.             private readonly BaseVendor m_Vendor;
    136.  
    137.             public BulkOrderInfoEntry(Mobile from, BaseVendor vendor)
    138.                 : base(6152)
    139.             {
    140.                 m_From = from;
    141.                 m_Vendor = vendor;
    142.             }
    143.  
    144.             public override void OnClick()
    145.             {
    146.                 if (m_Vendor.SupportsBulkOrders(m_From))
    147.                 {
    148.                     TimeSpan ts = m_Vendor.GetNextBulkOrder(m_From);
    149.  
    150.                     int totalSeconds = (int)ts.TotalSeconds;
    151.                     int totalHours = (totalSeconds + 3599) / 3600;
    152.                     int totalMinutes = (totalSeconds + 59) / 60;
    153.  
    154.                     if (((Core.SE) ? totalMinutes == 0 : totalHours == 0))
    155.                     {
    156.                         m_From.SendLocalizedMessage(1049038); // You can get an order now.
    157.  
    158.                         if (Core.AOS)
    159.                         {
    160.                             Item bulkOrder = m_Vendor.CreateBulkOrder(m_From, true);
    161.  
    162.                             if (bulkOrder is LargeBOD)
    163.                             {
    164.                                 m_From.SendGump(new LargeBODAcceptGump(m_From, (LargeBOD)bulkOrder));
    165.                             }
    166.                             else if (bulkOrder is SmallBOD)
    167.                             {
    168.                                 m_From.SendGump(new SmallBODAcceptGump(m_From, (SmallBOD)bulkOrder));
    169.                             }
    170.                         }
    171.                     }
    172.                     else
    173.                     {
    174.                         int oldSpeechHue = m_Vendor.SpeechHue;
    175.                         m_Vendor.SpeechHue = 0x3B2;
    176.  
    177.                         if (Core.SE)
    178.                         {
    179.                             m_Vendor.SayTo(m_From, 1072058, totalMinutes.ToString());
    180.                             // An offer may be available in about ~1_minutes~ minutes.
    181.                         }
    182.                         else
    183.                         {
    184.                             m_Vendor.SayTo(m_From, 1049039, totalHours.ToString()); // An offer may be available in about ~1_hours~ hours.
    185.                         }
    186.  
    187.                         m_Vendor.SpeechHue = oldSpeechHue;
    188.                     }
    189.                 }
    190.             }
    191.         }
    192.  
    193.         public BaseVendor(string title)
    194.             : base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
    195.         {
    196.             LoadSBInfo();
    197.  
    198.             Title = title;
    199.  
    200.             InitBody();
    201.             InitOutfit();
    202.  
    203.             Container pack;
    204.             //these packs MUST exist, or the client will crash when the packets are sent
    205.             pack = new Backpack();
    206.             pack.Layer = Layer.ShopBuy;
    207.             pack.Movable = false;
    208.             pack.Visible = false;
    209.             AddItem(pack);
    210.  
    211.             pack = new Backpack();
    212.             pack.Layer = Layer.ShopResale;
    213.             pack.Movable = false;
    214.             pack.Visible = false;
    215.             AddItem(pack);
    216.  
    217.             m_LastRestock = DateTime.UtcNow;
    218.         }
    219.  
    220.         public BaseVendor(Serial serial)
    221.             : base(serial)
    222.         { }
    223.  
    224.         public DateTime LastRestock { get { return m_LastRestock; } set { m_LastRestock = value; } }
    225.  
    226.         public virtual TimeSpan RestockDelay { get { return TimeSpan.FromHours(1); } }
    227.  
    228.         public Container BuyPack
    229.         {
    230.             get
    231.             {
    232.                 Container pack = FindItemOnLayer(Layer.ShopBuy) as Container;
    233.  
    234.                 if (pack == null)
    235.                 {
    236.                     pack = new Backpack();
    237.                     pack.Layer = Layer.ShopBuy;
    238.                     pack.Visible = false;
    239.                     AddItem(pack);
    240.                 }
    241.  
    242.                 return pack;
    243.             }
    244.         }
    245.  
    246.         public abstract void InitSBInfo();
    247.  
    248.         public virtual bool IsTokunoVendor { get { return (Map == Map.Tokuno); } }
    249.  
    250.         protected void LoadSBInfo()
    251.         {
    252.             m_LastRestock = DateTime.UtcNow;
    253.  
    254.             for (int i = 0; i < m_ArmorBuyInfo.Count; ++i)
    255.             {
    256.                 GenericBuyInfo buy = m_ArmorBuyInfo[i] as GenericBuyInfo;
    257.  
    258.                 if (buy != null)
    259.                 {
    260.                     buy.DeleteDisplayEntity();
    261.                 }
    262.             }
    263.  
    264.             SBInfos.Clear();
    265.  
    266.             InitSBInfo();
    267.  
    268.             m_ArmorBuyInfo.Clear();
    269.             m_ArmorSellInfo.Clear();
    270.  
    271.             for (int i = 0; i < SBInfos.Count; i++)
    272.             {
    273.                 SBInfo sbInfo = SBInfos[i];
    274.                 m_ArmorBuyInfo.AddRange(sbInfo.BuyInfo);
    275.                 m_ArmorSellInfo.Add(sbInfo.SellInfo);
    276.             }
    277.         }
    278.  
    279.         public virtual bool GetGender()
    280.         {
    281.             return Utility.RandomBool();
    282.         }
    283.  
    284.         public virtual void InitBody()
    285.         {
    286.             InitStats(100, 100, 25);
    287.  
    288.             SpeechHue = Utility.RandomDyedHue();
    289.             Hue = Utility.RandomSkinHue();
    290.  
    291.             if (Female = GetGender())
    292.             {
    293.                 Body = 0x191;
    294.                 Name = NameList.RandomName("female");
    295.             }
    296.             else
    297.             {
    298.                 Body = 0x190;
    299.                 Name = NameList.RandomName("male");
    300.             }
    301.         }
    302.  
    303.         public virtual int GetRandomHue()
    304.         {
    305.             switch (Utility.Random(5))
    306.             {
    307.                 default:
    308.                 case 0:
    309.                     return Utility.RandomBlueHue();
    310.                 case 1:
    311.                     return Utility.RandomGreenHue();
    312.                 case 2:
    313.                     return Utility.RandomRedHue();
    314.                 case 3:
    315.                     return Utility.RandomYellowHue();
    316.                 case 4:
    317.                     return Utility.RandomNeutralHue();
    318.             }
    319.         }
    320.  
    321.         public virtual int GetShoeHue()
    322.         {
    323.             if (0.1 > Utility.RandomDouble())
    324.             {
    325.                 return 0;
    326.             }
    327.  
    328.             return Utility.RandomNeutralHue();
    329.         }
    330.  
    331.         public virtual VendorShoeType ShoeType { get { return VendorShoeType.Shoes; } }
    332.  
    333.         public virtual void CheckMorph()
    334.         {
    335.             if (CheckGargoyle())
    336.             {
    337.                 return;
    338.             }
    339.                 #region SA
    340.             else if (CheckTerMur())
    341.             {
    342.                 return;
    343.             }
    344.                 #endregion
    345.  
    346.             else if (CheckNecromancer())
    347.             {
    348.                 return;
    349.             }
    350.             else if (CheckTokuno())
    351.             {
    352.                 return;
    353.             }
    354.  
    355.             if (Female = GetGender())
    356.             {
    357.                 Body = 0x191;
    358.                 Name = NameList.RandomName("female");
    359.             }
    360.             else
    361.             {
    362.                 Body = 0x190;
    363.                 Name = NameList.RandomName("male");
    364.             }
    365.         }
    366.  
    367.         public virtual bool CheckTokuno()
    368.         {
    369.             if (Map != Map.Tokuno)
    370.             {
    371.                 return false;
    372.             }
    373.  
    374.             NameList n;
    375.  
    376.             if (Female)
    377.             {
    378.                 n = NameList.GetNameList("tokuno female");
    379.             }
    380.             else
    381.             {
    382.                 n = NameList.GetNameList("tokuno male");
    383.             }
    384.  
    385.             if (!n.ContainsName(Name))
    386.             {
    387.                 TurnToTokuno();
    388.             }
    389.  
    390.             return true;
    391.         }
    392.  
    393.         public virtual void TurnToTokuno()
    394.         {
    395.             if (Female)
    396.             {
    397.                 Name = NameList.RandomName("tokuno female");
    398.             }
    399.             else
    400.             {
    401.                 Name = NameList.RandomName("tokuno male");
    402.             }
    403.         }
    404.  
    405.         public virtual bool CheckGargoyle()
    406.         {
    407.             Map map = Map;
    408.  
    409.             if (map != Map.Ilshenar)
    410.             {
    411.                 return false;
    412.             }
    413.  
    414.             if (!Region.IsPartOf("Gargoyle City"))
    415.             {
    416.                 return false;
    417.             }
    418.  
    419.             if (Body != 0x2F6 || (Hue & 0x8000) == 0)
    420.             {
    421.                 TurnToGargoyle();
    422.             }
    423.  
    424.             return true;
    425.         }
    426.  
    427.         #region SA Change
    428.         public virtual bool CheckTerMur()
    429.         {
    430.             Map map = Map;
    431.  
    432.             if (map != Map.TerMur)
    433.             {
    434.                 return false;
    435.             }
    436.  
    437.             if (!Region.IsPartOf("Royal City") && !Region.IsPartOf("Holy City"))
    438.             {
    439.                 return false;
    440.             }
    441.  
    442.             if (Body != 0x29A || Body != 0x29B)
    443.             {
    444.                 TurnToGargRace();
    445.             }
    446.  
    447.             return true;
    448.         }
    449.         #endregion
    450.  
    451.         public virtual bool CheckNecromancer()
    452.         {
    453.             Map map = Map;
    454.  
    455.             if (map != Map.Malas)
    456.             {
    457.                 return false;
    458.             }
    459.  
    460.             if (!Region.IsPartOf("Umbra"))
    461.             {
    462.                 return false;
    463.             }
    464.  
    465.             if (Hue != 0x83E8)
    466.             {
    467.                 TurnToNecromancer();
    468.             }
    469.  
    470.             return true;
    471.         }
    472.  
    473.         public override void OnAfterSpawn()
    474.         {
    475.             CheckMorph();
    476.         }
    477.  
    478.         protected override void OnMapChange(Map oldMap)
    479.         {
    480.             base.OnMapChange(oldMap);
    481.  
    482.             CheckMorph();
    483.  
    484.             LoadSBInfo();
    485.         }
    486.  
    487.         public virtual int GetRandomNecromancerHue()
    488.         {
    489.             switch (Utility.Random(20))
    490.             {
    491.                 case 0:
    492.                     return 0;
    493.                 case 1:
    494.                     return 0x4E9;
    495.                 default:
    496.                     return Utility.RandomList(0x485, 0x497);
    497.             }
    498.         }
    499.  
    500.         public virtual void TurnToNecromancer()
    501.         {
    502.             for (int i = 0; i < Items.Count; ++i)
    503.             {
    504.                 Item item = Items[i];
    505.  
    506.                 if (item is Hair || item is Beard)
    507.                 {
    508.                     item.Hue = 0;
    509.                 }
    510.                 else if (item is BaseClothing || item is BaseWeapon || item is BaseArmor || item is BaseTool)
    511.                 {
    512.                     item.Hue = GetRandomNecromancerHue();
    513.                 }
    514.             }
    515.  
    516.             HairHue = 0;
    517.             FacialHairHue = 0;
    518.  
    519.             Hue = 0x83E8;
    520.         }
    521.  
    522.         public virtual void TurnToGargoyle()
    523.         {
    524.             for (int i = 0; i < Items.Count; ++i)
    525.             {
    526.                 Item item = Items[i];
    527.  
    528.                 if (item is BaseClothing || item is Hair || item is Beard)
    529.                 {
    530.                     item.Delete();
    531.                 }
    532.             }
    533.  
    534.             HairItemID = 0;
    535.             FacialHairItemID = 0;
    536.  
    537.             Body = 0x2F6;
    538.             Hue = Utility.RandomBrightHue() | 0x8000;
    539.             Name = NameList.RandomName("gargoyle vendor");
    540.  
    541.             CapitalizeTitle();
    542.         }
    543.  
    544.         #region SA
    545.         public virtual void TurnToGargRace()
    546.         {
    547.             for (int i = 0; i < Items.Count; ++i)
    548.             {
    549.                 Item item = Items[i];
    550.  
    551.                 if (item is BaseClothing)
    552.                 {
    553.                     item.Delete();
    554.                 }
    555.             }
    556.  
    557.             Race = Race.Gargoyle;
    558.  
    559.             Hue = Race.RandomSkinHue();
    560.  
    561.             HairItemID = Race.RandomHair(Female);
    562.             HairHue = Race.RandomHairHue();
    563.  
    564.             FacialHairItemID = Race.RandomFacialHair(Female);
    565.             if (FacialHairItemID != 0)
    566.             {
    567.                 FacialHairHue = Race.RandomHairHue();
    568.             }
    569.             else
    570.             {
    571.                 FacialHairHue = 0;
    572.             }
    573.  
    574.             InitGargOutfit();
    575.  
    576.             if (Female = GetGender())
    577.             {
    578.                 Body = 0x29B;
    579.                 Name = NameList.RandomName("gargoyle female");
    580.             }
    581.             else
    582.             {
    583.                 Body = 0x29A;
    584.                 Name = NameList.RandomName("gargoyle male");
    585.             }
    586.  
    587.             CapitalizeTitle();
    588.         }
    589.         #endregion
    590.  
    591.         public virtual void CapitalizeTitle()
    592.         {
    593.             string title = Title;
    594.  
    595.             if (title == null)
    596.             {
    597.                 return;
    598.             }
    599.  
    600.             var split = title.Split(' ');
    601.  
    602.             for (int i = 0; i < split.Length; ++i)
    603.             {
    604.                 if (Insensitive.Equals(split[i], "the"))
    605.                 {
    606.                     continue;
    607.                 }
    608.  
    609.                 if (split[i].Length > 1)
    610.                 {
    611.                     split[i] = Char.ToUpper(split[i][0]) + split[i].Substring(1);
    612.                 }
    613.                 else if (split[i].Length > 0)
    614.                 {
    615.                     split[i] = Char.ToUpper(split[i][0]).ToString();
    616.                 }
    617.             }
    618.  
    619.             Title = String.Join(" ", split);
    620.         }
    621.  
    622.         public virtual int GetHairHue()
    623.         {
    624.             return Utility.RandomHairHue();
    625.         }
    626.  
    627.         public virtual void InitOutfit()
    628.         {
    629.             switch (Utility.Random(3))
    630.             {
    631.                 case 0:
    632.                     AddItem(new FancyShirt(GetRandomHue()));
    633.                     break;
    634.                 case 1:
    635.                     AddItem(new Doublet(GetRandomHue()));
    636.                     break;
    637.                 case 2:
    638.                     AddItem(new Shirt(GetRandomHue()));
    639.                     break;
    640.             }
    641.  
    642.             switch (ShoeType)
    643.             {
    644.                 case VendorShoeType.Shoes:
    645.                     AddItem(new Shoes(GetShoeHue()));
    646.                     break;
    647.                 case VendorShoeType.Boots:
    648.                     AddItem(new Boots(GetShoeHue()));
    649.                     break;
    650.                 case VendorShoeType.Sandals:
    651.                     AddItem(new Sandals(GetShoeHue()));
    652.                     break;
    653.                 case VendorShoeType.ThighBoots:
    654.                     AddItem(new ThighBoots(GetShoeHue()));
    655.                     break;
    656.             }
    657.  
    658.             int hairHue = GetHairHue();
    659.  
    660.             Utility.AssignRandomHair(this, hairHue);
    661.             Utility.AssignRandomFacialHair(this, hairHue);
    662.  
    663.             if (Female)
    664.             {
    665.                 switch (Utility.Random(6))
    666.                 {
    667.                     case 0:
    668.                         AddItem(new ShortPants(GetRandomHue()));
    669.                         break;
    670.                     case 1:
    671.                     case 2:
    672.                         AddItem(new Kilt(GetRandomHue()));
    673.                         break;
    674.                     case 3:
    675.                     case 4:
    676.                     case 5:
    677.                         AddItem(new Skirt(GetRandomHue()));
    678.                         break;
    679.                 }
    680.             }
    681.             else
    682.             {
    683.                 switch (Utility.Random(2))
    684.                 {
    685.                     case 0:
    686.                         AddItem(new LongPants(GetRandomHue()));
    687.                         break;
    688.                     case 1:
    689.                         AddItem(new ShortPants(GetRandomHue()));
    690.                         break;
    691.                 }
    692.             }
    693.  
    694.             PackGold(100, 200);
    695.         }
    696.  
    697.         #region SA
    698.         public virtual void InitGargOutfit()
    699.         {
    700.             for (int i = 0; i < Items.Count; ++i)
    701.             {
    702.                 Item item = Items[i];
    703.  
    704.                 if (item is BaseClothing)
    705.                 {
    706.                     item.Delete();
    707.                 }
    708.             }
    709.  
    710.             if (Female)
    711.             {
    712.                 switch (Utility.Random(2))
    713.                 {
    714.                     case 0:
    715.                         AddItem(new FemaleGargishClothLegs(GetRandomHue()));
    716.                         AddItem(new FemaleGargishClothKilt(GetRandomHue()));
    717.                         AddItem(new FemaleGargishClothChest(GetRandomHue()));
    718.                         break;
    719.                     case 1:
    720.                         AddItem(new FemaleGargishClothKilt(GetRandomHue()));
    721.                         AddItem(new FemaleGargishClothChest(GetRandomHue()));
    722.                         break;
    723.                 }
    724.             }
    725.             else
    726.             {
    727.                 switch (Utility.Random(2))
    728.                 {
    729.                     case 0:
    730.                         AddItem(new MaleGargishClothLegs(GetRandomHue()));
    731.                         AddItem(new MaleGargishClothKilt(GetRandomHue()));
    732.                         AddItem(new MaleGargishClothChest(GetRandomHue()));
    733.                         break;
    734.                     case 1:
    735.                         AddItem(new MaleGargishClothKilt(GetRandomHue()));
    736.                         AddItem(new MaleGargishClothChest(GetRandomHue()));
    737.                         break;
    738.                 }
    739.             }
    740.             PackGold(100, 200);
    741.         }
    742.         #endregion
    743.  
    744.         public virtual void Restock()
    745.         {
    746.             m_LastRestock = DateTime.UtcNow;
    747.  
    748.             var buyInfo = GetBuyInfo();
    749.  
    750.             foreach (IBuyItemInfo bii in buyInfo)
    751.             {
    752.                 bii.OnRestock();
    753.             }
    754.         }
    755.  
    756.         private static readonly TimeSpan InventoryDecayTime = TimeSpan.FromHours(1.0);
    757.  
    758.         public virtual void VendorBuy(Mobile from)
    759.         {
    760.             if (!IsActiveSeller)
    761.             {
    762.                 return;
    763.             }
    764.  
    765.             if (!from.CheckAlive())
    766.             {
    767.                 return;
    768.             }
    769.  
    770.             if (!CheckVendorAccess(from))
    771.             {
    772.                 Say(501522); // I shall not treat with scum like thee!
    773.                 return;
    774.             }
    775.  
    776.             if (DateTime.UtcNow - m_LastRestock > RestockDelay)
    777.             {
    778.                 Restock();
    779.             }
    780.  
    781.             UpdateBuyInfo();
    782.  
    783.             int count = 0;
    784.             List<BuyItemState> list;
    785.             var buyInfo = GetBuyInfo();
    786.             var sellInfo = GetSellInfo();
    787.  
    788.             list = new List<BuyItemState>(buyInfo.Length);
    789.             Container cont = BuyPack;
    790.  
    791.             List<ObjectPropertyList> opls = null;
    792.  
    793.             for (int idx = 0; idx < buyInfo.Length; idx++)
    794.             {
    795.                 IBuyItemInfo buyItem = buyInfo[idx];
    796.  
    797.                 if (buyItem.Amount <= 0 || list.Count >= 250)
    798.                 {
    799.                     continue;
    800.                 }
    801.  
    802.                 // NOTE: Only GBI supported; if you use another implementation of IBuyItemInfo, this will crash
    803.                 GenericBuyInfo gbi = (GenericBuyInfo)buyItem;
    804.                 IEntity disp = gbi.GetDisplayEntity();
    805.  
    806.                 list.Add(
    807.                     new BuyItemState(
    808.                         buyItem.Name,
    809.                         cont.Serial,
    810.                         disp == null ? (Serial)0x7FC0FFEE : disp.Serial,
    811.                         buyItem.Price,
    812.                         buyItem.Amount,
    813.                         buyItem.ItemID,
    814.                         buyItem.Hue));
    815.                 count++;
    816.  
    817.                 if (opls == null)
    818.                 {
    819.                     opls = new List<ObjectPropertyList>();
    820.                 }
    821.  
    822.                 if (disp is Item)
    823.                 {
    824.                     opls.Add(((Item)disp).PropertyList);
    825.                 }
    826.                 else if (disp is Mobile)
    827.                 {
    828.                     opls.Add(((Mobile)disp).PropertyList);
    829.                 }
    830.             }
    831.  
    832.             var playerItems = cont.Items;
    833.  
    834.             for (int i = playerItems.Count - 1; i >= 0; --i)
    835.             {
    836.                 if (i >= playerItems.Count)
    837.                 {
    838.                     continue;
    839.                 }
    840.  
    841.                 Item item = playerItems[i];
    842.  
    843.                 if ((item.LastMoved + InventoryDecayTime) <= DateTime.UtcNow)
    844.                 {
    845.                     item.Delete();
    846.                 }
    847.             }
    848.  
    849.             for (int i = 0; i < playerItems.Count; ++i)
    850.             {
    851.                 Item item = playerItems[i];
    852.  
    853.                 int price = 0;
    854.                 string name = null;
    855.  
    856.                 foreach (IShopSellInfo ssi in sellInfo)
    857.                 {
    858.                     if (ssi.IsSellable(item))
    859.                     {
    860.                         price = ssi.GetBuyPriceFor(item);
    861.                         name = ssi.GetNameFor(item);
    862.                         break;
    863.                     }
    864.                 }
    865.  
    866.                 if (name != null && list.Count < 250)
    867.                 {
    868.                     list.Add(new BuyItemState(name, cont.Serial, item.Serial, price, item.Amount, item.ItemID, item.Hue));
    869.                     count++;
    870.  
    871.                     if (opls == null)
    872.                     {
    873.                         opls = new List<ObjectPropertyList>();
    874.                     }
    875.  
    876.                     opls.Add(item.PropertyList);
    877.                 }
    878.             }
    879.  
    880.             //one (not all) of the packets uses a byte to describe number of items in the list.  Osi = dumb.
    881.             //if ( list.Count > 255 )
    882.             //  Console.WriteLine( "Vendor Warning: Vendor {0} has more than 255 buy items, may cause client errors!", this );
    883.  
    884.             if (list.Count > 0)
    885.             {
    886.                 list.Sort(new BuyItemStateComparer());
    887.  
    888.                 SendPacksTo(from);
    889.  
    890.                 NetState ns = from.NetState;
    891.  
    892.                 if (ns == null)
    893.                 {
    894.                     return;
    895.                 }
    896.  
    897.                 if (ns.ContainerGridLines)
    898.                 {
    899.                     from.Send(new VendorBuyContent6017(list));
    900.                 }
    901.                 else
    902.                 {
    903.                     from.Send(new VendorBuyContent(list));
    904.                 }
    905.  
    906.                 from.Send(new VendorBuyList(this, list));
    907.  
    908.                 if (ns.HighSeas)
    909.                 {
    910.                     from.Send(new DisplayBuyListHS(this));
    911.                 }
    912.                 else
    913.                 {
    914.                     from.Send(new DisplayBuyList(this));
    915.                 }
    916.  
    917.                 from.Send(new MobileStatusExtended(from)); //make sure their gold amount is sent
    918.  
    919.                 if (opls != null)
    920.                 {
    921.                     for (int i = 0; i < opls.Count; ++i)
    922.                     {
    923.                         from.Send(opls[i]);
    924.                     }
    925.                 }
    926.  
    927.                 SayTo(from, 500186); // Greetings.  Have a look around.
    928.             }
    929.         }
    930.  
    931.         public virtual void SendPacksTo(Mobile from)
    932.         {
    933.             Item pack = FindItemOnLayer(Layer.ShopBuy);
    934.  
    935.             if (pack == null)
    936.             {
    937.                 pack = new Backpack();
    938.                 pack.Layer = Layer.ShopBuy;
    939.                 pack.Movable = false;
    940.                 pack.Visible = false;
    941.                 AddItem(pack);
    942.             }
    943.  
    944.             from.Send(new EquipUpdate(pack));
    945.  
    946.             pack = FindItemOnLayer(Layer.ShopSell);
    947.  
    948.             if (pack != null)
    949.             {
    950.                 from.Send(new EquipUpdate(pack));
    951.             }
    952.  
    953.             pack = FindItemOnLayer(Layer.ShopResale);
    954.  
    955.             if (pack == null)
    956.             {
    957.                 pack = new Backpack();
    958.                 pack.Layer = Layer.ShopResale;
    959.                 pack.Movable = false;
    960.                 pack.Visible = false;
    961.                 AddItem(pack);
    962.             }
    963.  
    964.             from.Send(new EquipUpdate(pack));
    965.         }
    966.  
    967.         public virtual void VendorSell(Mobile from)
    968.         {
    969.             if (!IsActiveBuyer)
    970.             {
    971.                 return;
    972.             }
    973.  
    974.             if (!from.CheckAlive())
    975.             {
    976.                 return;
    977.             }
    978.  
    979.             if (!CheckVendorAccess(from))
    980.             {
    981.                 Say(501522); // I shall not treat with scum like thee!
    982.                 return;
    983.             }
    984.  
    985.             Container pack = from.Backpack;
    986.  
    987.             if (pack != null)
    988.             {
    989.                 var info = GetSellInfo();
    990.  
    991.                 Hashtable table = new Hashtable();
    992.  
    993.                 foreach (IShopSellInfo ssi in info)
    994.                 {
    995.                     var items = pack.FindItemsByType(ssi.Types);
    996.  
    997.                     foreach (Item item in items)
    998.                     {
    999.                         if (item is Container && (item).Items.Count != 0)
    1000.                         {
    1001.                             continue;
    1002.                         }
    1003.  
    1004.                         if (item.IsStandardLoot() && item.Movable && ssi.IsSellable(item))
    1005.                         {
    1006.                             table[item] = new SellItemState(item, ssi.GetSellPriceFor(item), ssi.GetNameFor(item));
    1007.                         }
    1008.                     }
    1009.                 }
    1010.  
    1011.                 if (table.Count > 0)
    1012.                 {
    1013.                     SendPacksTo(from);
    1014.  
    1015.                     from.Send(new VendorSellList(this, table));
    1016.                 }
    1017.                 else
    1018.                 {
    1019.                     Say(true, "You have nothing I would be interested in.");
    1020.                 }
    1021.             }
    1022.         }
    1023.  
    1024.         public override bool OnDragDrop(Mobile from, Item dropped)
    1025.         {
    1026.             /* TODO: Thou art giving me? and fame/karma for gold gifts */
    1027.             if (dropped is SmallBOD || dropped is LargeBOD)
    1028.             {
    1029.                 PlayerMobile pm = from as PlayerMobile;
    1030.  
    1031.                 if (Core.ML && pm != null && pm.NextBODTurnInTime > DateTime.UtcNow)
    1032.                 {
    1033.                     SayTo(from, 1079976); // You'll have to wait a few seconds while I inspect the last order.
    1034.                     return false;
    1035.                 }
    1036.                 else if (!IsValidBulkOrder(dropped) || !SupportsBulkOrders(from))
    1037.                 {
    1038.                     SayTo(from, 1045130); // That order is for some other shopkeeper.
    1039.                     return false;
    1040.                 }
    1041.                 else if ((dropped is SmallBOD && !((SmallBOD)dropped).Complete) ||
    1042.                          (dropped is LargeBOD && !((LargeBOD)dropped).Complete))
    1043.                 {
    1044.                     SayTo(from, 1045131); // You have not completed the order yet.
    1045.                     return false;
    1046.                 }
    1047.  
    1048.                 Item reward;
    1049.                 int gold, fame;
    1050.  
    1051.                 if (dropped is SmallBOD)
    1052.                 {
    1053.                     ((SmallBOD)dropped).GetRewards(out reward, out gold, out fame);
    1054.                 }
    1055.                 else
    1056.                 {
    1057.                     ((LargeBOD)dropped).GetRewards(out reward, out gold, out fame);
    1058.                 }
    1059.  
    1060.                 from.SendSound(0x3D);
    1061.  
    1062.                 SayTo(from, 1045132); // Thank you so much!  Here is a reward for your effort.
    1063.  
    1064.                 if (reward != null)
    1065.                 {
    1066.                     from.AddToBackpack(reward);
    1067.                 }
    1068.  
    1069.                 if (gold > 1000)
    1070.                 {
    1071.                     from.AddToBackpack(new BankCheck(gold));
    1072.                 }
    1073.                 else if (gold > 0)
    1074.                 {
    1075.                     from.AddToBackpack(new Gold(gold));
    1076.                 }
    1077.  
    1078.                 Titles.AwardFame(from, fame, true);
    1079.  
    1080.                 OnSuccessfulBulkOrderReceive(from);
    1081.  
    1082.                 if (Core.ML && pm != null)
    1083.                 {
    1084.                     pm.NextBODTurnInTime = DateTime.UtcNow + TimeSpan.FromSeconds(10.0);
    1085.                 }
    1086.  
    1087.                 dropped.Delete();
    1088.                 return true;
    1089.             }
    1090.  
    1091.             return base.OnDragDrop(from, dropped);
    1092.         }
    1093.  
    1094.         private GenericBuyInfo LookupDisplayObject(object obj)
    1095.         {
    1096.             var buyInfo = GetBuyInfo();
    1097.  
    1098.             for (int i = 0; i < buyInfo.Length; ++i)
    1099.             {
    1100.                 GenericBuyInfo gbi = (GenericBuyInfo)buyInfo[i];
    1101.  
    1102.                 if (gbi.GetDisplayEntity() == obj)
    1103.                 {
    1104.                     return gbi;
    1105.                 }
    1106.             }
    1107.  
    1108.             return null;
    1109.         }
    1110.  
    1111.         private void ProcessSinglePurchase(
    1112.             BuyItemResponse buy,
    1113.             IBuyItemInfo bii,
    1114.             List<BuyItemResponse> validBuy,
    1115.             ref int controlSlots,
    1116.             ref bool fullPurchase,
    1117.             ref int totalCost)
    1118.         {
    1119.             int amount = buy.Amount;
    1120.  
    1121.             if (amount > bii.Amount)
    1122.             {
    1123.                 amount = bii.Amount;
    1124.             }
    1125.  
    1126.             if (amount <= 0)
    1127.             {
    1128.                 return;
    1129.             }
    1130.  
    1131.             int slots = bii.ControlSlots * amount;
    1132.  
    1133.             if (controlSlots >= slots)
    1134.             {
    1135.                 controlSlots -= slots;
    1136.             }
    1137.             else
    1138.             {
    1139.                 fullPurchase = false;
    1140.                 return;
    1141.             }
    1142.  
    1143.             totalCost += bii.Price * amount;
    1144.             validBuy.Add(buy);
    1145.         }
    1146.  
    1147.         private void ProcessValidPurchase(int amount, IBuyItemInfo bii, Mobile buyer, Container cont)
    1148.         {
    1149.             if (amount > bii.Amount)
    1150.             {
    1151.                 amount = bii.Amount;
    1152.             }
    1153.  
    1154.             if (amount < 1)
    1155.             {
    1156.                 return;
    1157.             }
    1158.  
    1159.             bii.Amount -= amount;
    1160.  
    1161.             IEntity o = bii.GetEntity();
    1162.  
    1163.             if (o is Item)
    1164.             {
    1165.                 Item item = (Item)o;
    1166.  
    1167.                 if (item.Stackable)
    1168.                 {
    1169.                     item.Amount = amount;
    1170.  
    1171.                     if (cont == null || !cont.TryDropItem(buyer, item, false))
    1172.                     {
    1173.                         item.MoveToWorld(buyer.Location, buyer.Map);
    1174.                     }
    1175.                 }
    1176.                 else
    1177.                 {
    1178.                     item.Amount = 1;
    1179.  
    1180.                     if (cont == null || !cont.TryDropItem(buyer, item, false))
    1181.                     {
    1182.                         item.MoveToWorld(buyer.Location, buyer.Map);
    1183.                     }
    1184.  
    1185.                     for (int i = 1; i < amount; i++)
    1186.                     {
    1187.                         item = bii.GetEntity() as Item;
    1188.  
    1189.                         if (item != null)
    1190.                         {
    1191.                             item.Amount = 1;
    1192.  
    1193.                             if (cont == null || !cont.TryDropItem(buyer, item, false))
    1194.                             {
    1195.                                 item.MoveToWorld(buyer.Location, buyer.Map);
    1196.                             }
    1197.                         }
    1198.                     }
    1199.                 }
    1200.             }
    1201.             else if (o is Mobile)
    1202.             {
    1203.                 Mobile m = (Mobile)o;
    1204.  
    1205.                 m.Direction = (Direction)Utility.Random(8);
    1206.                 m.MoveToWorld(buyer.Location, buyer.Map);
    1207.                 m.PlaySound(m.GetIdleSound());
    1208.  
    1209.                 if (m is BaseCreature)
    1210.                 {
    1211.                     ((BaseCreature)m).SetControlMaster(buyer);
    1212.                 }
    1213.  
    1214.                 for (int i = 1; i < amount; ++i)
    1215.                 {
    1216.                     m = bii.GetEntity() as Mobile;
    1217.  
    1218.                     if (m != null)
    1219.                     {
    1220.                         m.Direction = (Direction)Utility.Random(8);
    1221.                         m.MoveToWorld(buyer.Location, buyer.Map);
    1222.  
    1223.                         if (m is BaseCreature)
    1224.                         {
    1225.                             ((BaseCreature)m).SetControlMaster(buyer);
    1226.                         }
    1227.                     }
    1228.                 }
    1229.             }
    1230.         }
    1231.  
    1232.         public virtual bool OnBuyItems(Mobile buyer, List<BuyItemResponse> list)
    1233.         {
    1234.             if (!IsActiveSeller)
    1235.             {
    1236.                 return false;
    1237.             }
    1238.  
    1239.             if (!buyer.CheckAlive())
    1240.             {
    1241.                 return false;
    1242.             }
    1243.  
    1244.             if (!CheckVendorAccess(buyer))
    1245.             {
    1246.                 Say(501522); // I shall not treat with scum like thee!
    1247.                 return false;
    1248.             }
    1249.  
    1250.             UpdateBuyInfo();
    1251.  
    1252.             var buyInfo = GetBuyInfo();
    1253.             var info = GetSellInfo();
    1254.             int totalCost = 0;
    1255.             var validBuy = new List<BuyItemResponse>(list.Count);
    1256.             Container cont;
    1257.             bool bought = false;
    1258.             bool fromBank = false;
    1259.             bool fullPurchase = true;
    1260.             int controlSlots = buyer.FollowersMax - buyer.Followers;
    1261.  
    1262.             foreach (BuyItemResponse buy in list)
    1263.             {
    1264.                 Serial ser = buy.Serial;
    1265.                 int amount = buy.Amount;
    1266.  
    1267.                 if (ser.IsItem)
    1268.                 {
    1269.                     Item item = World.FindItem(ser);
    1270.  
    1271.                     if (item == null)
    1272.                     {
    1273.                         continue;
    1274.                     }
    1275.  
    1276.                     GenericBuyInfo gbi = LookupDisplayObject(item);
    1277.  
    1278.                     if (gbi != null)
    1279.                     {
    1280.                         ProcessSinglePurchase(buy, gbi, validBuy, ref controlSlots, ref fullPurchase, ref totalCost);
    1281.                     }
    1282.                     else if (item != BuyPack && item.IsChildOf(BuyPack))
    1283.                     {
    1284.                         if (amount > item.Amount)
    1285.                         {
    1286.                             amount = item.Amount;
    1287.                         }
    1288.  
    1289.                         if (amount <= 0)
    1290.                         {
    1291.                             continue;
    1292.                         }
    1293.  
    1294.                         foreach (IShopSellInfo ssi in info)
    1295.                         {
    1296.                             if (ssi.IsSellable(item))
    1297.                             {
    1298.                                 if (ssi.IsResellable(item))
    1299.                                 {
    1300.                                     totalCost += ssi.GetBuyPriceFor(item) * amount;
    1301.                                     validBuy.Add(buy);
    1302.                                     break;
    1303.                                 }
    1304.                             }
    1305.                         }
    1306.                     }
    1307.                 }
    1308.                 else if (ser.IsMobile)
    1309.                 {
    1310.                     Mobile mob = World.FindMobile(ser);
    1311.  
    1312.                     if (mob == null)
    1313.                     {
    1314.                         continue;
    1315.                     }
    1316.  
    1317.                     GenericBuyInfo gbi = LookupDisplayObject(mob);
    1318.  
    1319.                     if (gbi != null)
    1320.                     {
    1321.                         ProcessSinglePurchase(buy, gbi, validBuy, ref controlSlots, ref fullPurchase, ref totalCost);
    1322.                     }
    1323.                 }
    1324.             } //foreach
    1325.  
    1326.             if (fullPurchase && validBuy.Count == 0)
    1327.             {
    1328.                 SayTo(buyer, 500190); // Thou hast bought nothing!
    1329.             }
    1330.             else if (validBuy.Count == 0)
    1331.             {
    1332.                 SayTo(buyer, 500187); // Your order cannot be fulfilled, please try again.
    1333.             }
    1334.  
    1335.             if (validBuy.Count == 0)
    1336.             {
    1337.                 return false;
    1338.             }
    1339.  
    1340.             bought = (buyer.AccessLevel >= AccessLevel.GameMaster);
    1341.  
    1342.             cont = buyer.Backpack;
    1343.             if (!bought && cont != null)
    1344.             {
    1345.                 #region Alpha Gold Ledger #2
    1346.                 Item item = buyer.Backpack.FindItemByType(typeof(GoldLedger));
    1347.                 GoldLedger ledger = item as GoldLedger;
    1348.                 Item[] item2 = buyer.Backpack.FindItemsByType(typeof(Gold));
    1349.  
    1350.                 int goldint = 0;
    1351.                 foreach (Item item3 in item2)
    1352.                     goldint += item3.Amount;
    1353.  
    1354.                 #endregion #2
    1355.                 if (cont.ConsumeTotal(typeof(Gold), totalCost))
    1356.                 {
    1357.                     bought = true;
    1358.                   #region Alpha Gold Ledger #3
    1359.                  if( ledger != null )
    1360.                 {
    1361.                     if( (goldint + ledger.Gold) >= totalCost )
    1362.                     {
    1363.                         ledger.Gold -= (totalCost - goldint);
    1364.                         bought = true;
    1365.                         buyer.SendMessage(2125, "{0} gold has been withdrawn from your gold ledger.", (totalCost - goldint).ToString( "#,0" ));
    1366.                         cont.ConsumeTotal( typeof( Gold ), goldint);
    1367.                     }
    1368.                     else if( ledger.Gold >= totalCost )
    1369.                     {
    1370.                         ledger.Gold -= totalCost;
    1371.                         bought = true;
    1372.                         buyer.SendMessage(2125, "{0} gold has been withdrawn from your gold ledger.", totalCost.ToString( "#,0" ));
    1373.                     }
    1374.                 }
    1375. #endregion #3
    1376.                 }
    1377.                 else if (totalCost < 2000)
    1378.                 {
    1379.                     SayTo(buyer, 500192); //Begging thy pardon, but thou casnt afford that.
    1380.                 }
    1381.             }
    1382.  
    1383.             if (!bought && totalCost >= 2000)
    1384.             {
    1385.                 cont = buyer.FindBankNoCreate();
    1386.                 if (cont != null && cont.ConsumeTotal(typeof(Gold), totalCost))
    1387.                 {
    1388.                     bought = true;
    1389.                     fromBank = true;
    1390.                 }
    1391.                 else
    1392.                 {
    1393.                     SayTo(buyer, 500191); //Begging thy pardon, but thy bank account lacks these funds.
    1394.                 }
    1395.             }
    1396.  
    1397.             if (!bought)
    1398.             {
    1399.                 return false;
    1400.             }
    1401.             else
    1402.             {
    1403.                 buyer.PlaySound(0x32);
    1404.             }
    1405.  
    1406.             cont = buyer.Backpack;
    1407.             if (cont == null)
    1408.             {
    1409.                 cont = buyer.BankBox;
    1410.             }
    1411.  
    1412.             foreach (BuyItemResponse buy in validBuy)
    1413.             {
    1414.                 Serial ser = buy.Serial;
    1415.                 int amount = buy.Amount;
    1416.  
    1417.                 if (amount < 1)
    1418.                 {
    1419.                     continue;
    1420.                 }
    1421.  
    1422.                 if (ser.IsItem)
    1423.                 {
    1424.                     Item item = World.FindItem(ser);
    1425.  
    1426.                     if (item == null)
    1427.                     {
    1428.                         continue;
    1429.                     }
    1430.  
    1431.                     GenericBuyInfo gbi = LookupDisplayObject(item);
    1432.  
    1433.                     if (gbi != null)
    1434.                     {
    1435.                         ProcessValidPurchase(amount, gbi, buyer, cont);
    1436.                     }
    1437.                     else
    1438.                     {
    1439.                         if (amount > item.Amount)
    1440.                         {
    1441.                             amount = item.Amount;
    1442.                         }
    1443.  
    1444.                         foreach (IShopSellInfo ssi in info)
    1445.                         {
    1446.                             if (ssi.IsSellable(item))
    1447.                             {
    1448.                                 if (ssi.IsResellable(item))
    1449.                                 {
    1450.                                     Item buyItem;
    1451.                                     if (amount >= item.Amount)
    1452.                                     {
    1453.                                         buyItem = item;
    1454.                                     }
    1455.                                     else
    1456.                                     {
    1457.                                         buyItem = LiftItemDupe(item, item.Amount - amount);
    1458.  
    1459.                                         if (buyItem == null)
    1460.                                         {
    1461.                                             buyItem = item;
    1462.                                         }
    1463.                                     }
    1464.  
    1465.                                     if (cont == null || !cont.TryDropItem(buyer, buyItem, false))
    1466.                                     {
    1467.                                         buyItem.MoveToWorld(buyer.Location, buyer.Map);
    1468.                                     }
    1469.  
    1470.                                     break;
    1471.                                 }
    1472.                             }
    1473.                         }
    1474.                     }
    1475.                 }
    1476.                 else if (ser.IsMobile)
    1477.                 {
    1478.                     Mobile mob = World.FindMobile(ser);
    1479.  
    1480.                     if (mob == null)
    1481.                     {
    1482.                         continue;
    1483.                     }
    1484.  
    1485.                     GenericBuyInfo gbi = LookupDisplayObject(mob);
    1486.  
    1487.                     if (gbi != null)
    1488.                     {
    1489.                         ProcessValidPurchase(amount, gbi, buyer, cont);
    1490.                     }
    1491.                 }
    1492.             } //foreach
    1493.  
    1494.             if (fullPurchase)
    1495.             {
    1496.                 if (buyer.AccessLevel >= AccessLevel.GameMaster)
    1497.                 {
    1498.                     SayTo(buyer, true, "I would not presume to charge thee anything.  Here are the goods you requested.");
    1499.                 }
    1500.                 else if (fromBank)
    1501.                 {
    1502.                     SayTo(
    1503.                         buyer,
    1504.                         true,
    1505.                         "The total of thy purchase is {0} gold, which has been withdrawn from your bank account.  My thanks for the patronage.",
    1506.                         totalCost);
    1507.                 }
    1508.                 else
    1509.                 {
    1510.                     SayTo(buyer, true, "The total of thy purchase is {0} gold.  My thanks for the patronage.", totalCost);
    1511.                 }
    1512.             }
    1513.             else
    1514.             {
    1515.                 if (buyer.AccessLevel >= AccessLevel.GameMaster)
    1516.                 {
    1517.                     SayTo(
    1518.                         buyer,
    1519.                         true,
    1520.                         "I would not presume to charge thee anything.  Unfortunately, I could not sell you all the goods you requested.");
    1521.                 }
    1522.                 else if (fromBank)
    1523.                 {
    1524.                     SayTo(
    1525.                         buyer,
    1526.                         true,
    1527.                         "The total of thy purchase is {0} gold, which has been withdrawn from your bank account.  My thanks for the patronage.  Unfortunately, I could not sell you all the goods you requested.",
    1528.                         totalCost);
    1529.                 }
    1530.                 else
    1531.                 {
    1532.                     SayTo(
    1533.                         buyer,
    1534.                         true,
    1535.                         "The total of thy purchase is {0} gold.  My thanks for the patronage.  Unfortunately, I could not sell you all the goods you requested.",
    1536.                         totalCost);
    1537.                 }
    1538.             }
    1539.  
    1540.             return true;
    1541.         }
    1542.  
    1543.         public virtual bool CheckVendorAccess(Mobile from)
    1544.         {
    1545.             GuardedRegion reg = (GuardedRegion)Region.GetRegion(typeof(GuardedRegion));
    1546.  
    1547.             if (reg != null && !reg.CheckVendorAccess(this, from))
    1548.             {
    1549.                 return false;
    1550.             }
    1551.  
    1552.             if (Region != from.Region)
    1553.             {
    1554.                 reg = (GuardedRegion)from.Region.GetRegion(typeof(GuardedRegion));
    1555.  
    1556.                 if (reg != null && !reg.CheckVendorAccess(this, from))
    1557.                 {
    1558.                     return false;
    1559.                 }
    1560.             }
    1561.  
    1562.             return true;
    1563.         }
    1564.  
    1565.         public virtual bool OnSellItems(Mobile seller, List<SellItemResponse> list)
    1566.         {
    1567.             if (!IsActiveBuyer)
    1568.             {
    1569.                 return false;
    1570.             }
    1571.  
    1572.             if (!seller.CheckAlive())
    1573.             {
    1574.                 return false;
    1575.             }
    1576.  
    1577.             if (!CheckVendorAccess(seller))
    1578.             {
    1579.                 Say(501522); // I shall not treat with scum like thee!
    1580.                 return false;
    1581.             }
    1582.  
    1583.             seller.PlaySound(0x32);
    1584.  
    1585.             var info = GetSellInfo();
    1586.             var buyInfo = GetBuyInfo();
    1587.             int GiveGold = 0;
    1588.             int Sold = 0;
    1589.             Container cont;
    1590.  
    1591.             foreach (SellItemResponse resp in list)
    1592.             {
    1593.                 if (resp.Item.RootParent != seller || resp.Amount <= 0 || !resp.Item.IsStandardLoot() || !resp.Item.Movable ||
    1594.                     (resp.Item is Container && (resp.Item).Items.Count != 0))
    1595.                 {
    1596.                     continue;
    1597.                 }
    1598.  
    1599.                 foreach (IShopSellInfo ssi in info)
    1600.                 {
    1601.                     if (ssi.IsSellable(resp.Item))
    1602.                     {
    1603.                         Sold++;
    1604.                         break;
    1605.                     }
    1606.                 }
    1607.             }
    1608.  
    1609.             if (Sold > MaxSell)
    1610.             {
    1611.                 SayTo(seller, true, "You may only sell {0} items at a time!", MaxSell);
    1612.                 return false;
    1613.             }
    1614.             else if (Sold == 0)
    1615.             {
    1616.                 return true;
    1617.             }
    1618.  
    1619.             foreach (SellItemResponse resp in list)
    1620.             {
    1621.                 if (resp.Item.RootParent != seller || resp.Amount <= 0 || !resp.Item.IsStandardLoot() || !resp.Item.Movable ||
    1622.                     (resp.Item is Container && (resp.Item).Items.Count != 0))
    1623.                 {
    1624.                     continue;
    1625.                 }
    1626.  
    1627.                 foreach (IShopSellInfo ssi in info)
    1628.                 {
    1629.                     if (ssi.IsSellable(resp.Item))
    1630.                     {
    1631.                         int amount = resp.Amount;
    1632.  
    1633.                         if (amount > resp.Item.Amount)
    1634.                         {
    1635.                             amount = resp.Item.Amount;
    1636.                         }
    1637.  
    1638.                         if (ssi.IsResellable(resp.Item))
    1639.                         {
    1640.                             bool found = false;
    1641.  
    1642.                             foreach (IBuyItemInfo bii in buyInfo)
    1643.                             {
    1644.                                 if (bii.Restock(resp.Item, amount))
    1645.                                 {
    1646.                                     resp.Item.Consume(amount);
    1647.                                     found = true;
    1648.  
    1649.                                     break;
    1650.                                 }
    1651.                             }
    1652.  
    1653.                             if (!found)
    1654.                             {
    1655.                                 cont = BuyPack;
    1656.  
    1657.                                 if (amount < resp.Item.Amount)
    1658.                                 {
    1659.                                     Item item = LiftItemDupe(resp.Item, resp.Item.Amount - amount);
    1660.  
    1661.                                     if (item != null)
    1662.                                     {
    1663.                                         item.SetLastMoved();
    1664.                                         cont.DropItem(item);
    1665.                                     }
    1666.                                     else
    1667.                                     {
    1668.                                         resp.Item.SetLastMoved();
    1669.                                         cont.DropItem(resp.Item);
    1670.                                     }
    1671.                                 }
    1672.                                 else
    1673.                                 {
    1674.                                     resp.Item.SetLastMoved();
    1675.                                     cont.DropItem(resp.Item);
    1676.                                 }
    1677.                             }
    1678.                         }
    1679.                         else
    1680.                         {
    1681.                             if (amount < resp.Item.Amount)
    1682.                             {
    1683.                                 resp.Item.Amount -= amount;
    1684.                             }
    1685.                             else
    1686.                             {
    1687.                                 resp.Item.Delete();
    1688.                             }
    1689.                         }
    1690.  
    1691.                         GiveGold += ssi.GetSellPriceFor(resp.Item) * amount;
    1692.                         break;
    1693.                     }
    1694.                 }
    1695.             }
    1696.  
    1697.             if (GiveGold > 0)
    1698.             {
    1699.                 while (GiveGold > 60000)
    1700.                 {
    1701.                     seller.AddToBackpack(new Gold(60000));
    1702.                     GiveGold -= 60000;
    1703.                 }
    1704.  
    1705.                 seller.AddToBackpack(new Gold(GiveGold));
    1706.  
    1707.                 seller.PlaySound(0x0037); //Gold dropping sound
    1708.  
    1709.                 if (SupportsBulkOrders(seller))
    1710.                 {
    1711.                     Item bulkOrder = CreateBulkOrder(seller, false);
    1712.  
    1713.                     if (bulkOrder is LargeBOD)
    1714.                     {
    1715.                         seller.SendGump(new LargeBODAcceptGump(seller, (LargeBOD)bulkOrder));
    1716.                     }
    1717.                     else if (bulkOrder is SmallBOD)
    1718.                     {
    1719.                         seller.SendGump(new SmallBODAcceptGump(seller, (SmallBOD)bulkOrder));
    1720.                     }
    1721.                 }
    1722.             }
    1723.             //no cliloc for this?
    1724.             //SayTo( seller, true, "Thank you! I bought {0} item{1}. Here is your {2}gp.", Sold, (Sold > 1 ? "s" : ""), GiveGold );
    1725.  
    1726.             return true;
    1727.         }
    1728.  
    1729.         public override void Serialize(GenericWriter writer)
    1730.         {
    1731.             base.Serialize(writer);
    1732.  
    1733.             writer.Write(1); // version
    1734.  
    1735.             var sbInfos = SBInfos;
    1736.  
    1737.             for (int i = 0; sbInfos != null && i < sbInfos.Count; ++i)
    1738.             {
    1739.                 SBInfo sbInfo = sbInfos[i];
    1740.                 var buyInfo = sbInfo.BuyInfo;
    1741.  
    1742.                 for (int j = 0; buyInfo != null && j < buyInfo.Count; ++j)
    1743.                 {
    1744.                     GenericBuyInfo gbi = buyInfo[j];
    1745.  
    1746.                     int maxAmount = gbi.MaxAmount;
    1747.                     int doubled = 0;
    1748.  
    1749.                     switch (maxAmount)
    1750.                     {
    1751.                         case 40:
    1752.                             doubled = 1;
    1753.                             break;
    1754.                         case 80:
    1755.                             doubled = 2;
    1756.                             break;
    1757.                         case 160:
    1758.                             doubled = 3;
    1759.                             break;
    1760.                         case 320:
    1761.                             doubled = 4;
    1762.                             break;
    1763.                         case 640:
    1764.                             doubled = 5;
    1765.                             break;
    1766.                         case 999:
    1767.                             doubled = 6;
    1768.                             break;
    1769.                     }
    1770.  
    1771.                     if (doubled > 0)
    1772.                     {
    1773.                         writer.WriteEncodedInt(1 + ((j * sbInfos.Count) + i));
    1774.                         writer.WriteEncodedInt(doubled);
    1775.                     }
    1776.                 }
    1777.             }
    1778.  
    1779.             writer.WriteEncodedInt(0);
    1780.         }
    1781.  
    1782.         public override void Deserialize(GenericReader reader)
    1783.         {
    1784.             base.Deserialize(reader);
    1785.  
    1786.             int version = reader.ReadInt();
    1787.  
    1788.             LoadSBInfo();
    1789.  
    1790.             var sbInfos = SBInfos;
    1791.  
    1792.             switch (version)
    1793.             {
    1794.                 case 1:
    1795.                     {
    1796.                         int index;
    1797.  
    1798.                         while ((index = reader.ReadEncodedInt()) > 0)
    1799.                         {
    1800.                             int doubled = reader.ReadEncodedInt();
    1801.  
    1802.                             if (sbInfos != null)
    1803.                             {
    1804.                                 index -= 1;
    1805.                                 int sbInfoIndex = index % sbInfos.Count;
    1806.                                 int buyInfoIndex = index / sbInfos.Count;
    1807.  
    1808.                                 if (sbInfoIndex >= 0 && sbInfoIndex < sbInfos.Count)
    1809.                                 {
    1810.                                     SBInfo sbInfo = sbInfos[sbInfoIndex];
    1811.                                     var buyInfo = sbInfo.BuyInfo;
    1812.  
    1813.                                     if (buyInfo != null && buyInfoIndex >= 0 && buyInfoIndex < buyInfo.Count)
    1814.                                     {
    1815.                                         GenericBuyInfo gbi = buyInfo[buyInfoIndex];
    1816.  
    1817.                                         int amount = 20;
    1818.  
    1819.                                         switch (doubled)
    1820.                                         {
    1821.                                             case 1:
    1822.                                                 amount = 40;
    1823.                                                 break;
    1824.                                             case 2:
    1825.                                                 amount = 80;
    1826.                                                 break;
    1827.                                             case 3:
    1828.                                                 amount = 160;
    1829.                                                 break;
    1830.                                             case 4:
    1831.                                                 amount = 320;
    1832.                                                 break;
    1833.                                             case 5:
    1834.                                                 amount = 640;
    1835.                                                 break;
    1836.                                             case 6:
    1837.                                                 amount = 999;
    1838.                                                 break;
    1839.                                         }
    1840.  
    1841.                                         gbi.Amount = gbi.MaxAmount = amount;
    1842.                                     }
    1843.                                 }
    1844.                             }
    1845.                         }
    1846.  
    1847.                         break;
    1848.                     }
    1849.             }
    1850.  
    1851.             if (IsParagon)
    1852.             {
    1853.                 IsParagon = false;
    1854.             }
    1855.  
    1856.             Timer.DelayCall(TimeSpan.Zero, CheckMorph);
    1857.         }
    1858.  
    1859.         public override void AddCustomContextEntries(Mobile from, List<ContextMenuEntry> list)
    1860.         {
    1861.             if (from.Alive && IsActiveVendor)
    1862.             {
    1863.                 if (SupportsBulkOrders(from))
    1864.                 {
    1865.                     list.Add(new BulkOrderInfoEntry(from, this));
    1866.                 }
    1867.  
    1868.                 if (IsActiveSeller)
    1869.                 {
    1870.                     list.Add(new VendorBuyEntry(from, this));
    1871.                 }
    1872.  
    1873.                 if (IsActiveBuyer)
    1874.                 {
    1875.                     list.Add(new VendorSellEntry(from, this));
    1876.                 }
    1877.             }
    1878.  
    1879.             base.AddCustomContextEntries(from, list);
    1880.         }
    1881.  
    1882.         public virtual IShopSellInfo[] GetSellInfo()
    1883.         {
    1884.             return (IShopSellInfo[])m_ArmorSellInfo.ToArray(typeof(IShopSellInfo));
    1885.         }
    1886.  
    1887.         public virtual IBuyItemInfo[] GetBuyInfo()
    1888.         {
    1889.             return (IBuyItemInfo[])m_ArmorBuyInfo.ToArray(typeof(IBuyItemInfo));
    1890.         }
    1891.     }
    1892. }
    1893.  
    1894. namespace Server.ContextMenus
    1895. {
    1896.     public class VendorBuyEntry : ContextMenuEntry
    1897.     {
    1898.         private readonly BaseVendor m_Vendor;
    1899.  
    1900.         public VendorBuyEntry(Mobile from, BaseVendor vendor)
    1901.             : base(6103, 8)
    1902.         {
    1903.             m_Vendor = vendor;
    1904.             Enabled = vendor.CheckVendorAccess(from);
    1905.         }
    1906.  
    1907.         public override void OnClick()
    1908.         {
    1909.             m_Vendor.VendorBuy(Owner.From);
    1910.         }
    1911.     }
    1912.  
    1913.     public class VendorSellEntry : ContextMenuEntry
    1914.     {
    1915.         private readonly BaseVendor m_Vendor;
    1916.  
    1917.         public VendorSellEntry(Mobile from, BaseVendor vendor)
    1918.             : base(6104, 8)
    1919.         {
    1920.             m_Vendor = vendor;
    1921.             Enabled = vendor.CheckVendorAccess(from);
    1922.         }
    1923.  
    1924.         public override void OnClick()
    1925.         {
    1926.             m_Vendor.VendorSell(Owner.From);
    1927.         }
    1928.     }
    1929. }
    1930.  
    1931. namespace Server
    1932. {
    1933.     public interface IShopSellInfo
    1934.     {
    1935.         //get display name for an item
    1936.         string GetNameFor(Item item);
    1937.  
    1938.         //get price for an item which the player is selling
    1939.         int GetSellPriceFor(Item item);
    1940.  
    1941.         //get price for an item which the player is buying
    1942.         int GetBuyPriceFor(Item item);
    1943.  
    1944.         //can we sell this item to this vendor?
    1945.         bool IsSellable(Item item);
    1946.  
    1947.         //What do we sell?
    1948.         Type[] Types { get; }
    1949.  
    1950.         //does the vendor resell this item?
    1951.         bool IsResellable(Item item);
    1952.     }
    1953.  
    1954.     public interface IBuyItemInfo
    1955.     {
    1956.         //get a new instance of an object (we just bought it)
    1957.         IEntity GetEntity();
    1958.  
    1959.         int ControlSlots { get; }
    1960.  
    1961.         int PriceScalar { get; set; }
    1962.  
    1963.         //display price of the item
    1964.         int Price { get; }
    1965.  
    1966.         //display name of the item
    1967.         string Name { get; }
    1968.  
    1969.         //display hue
    1970.         int Hue { get; }
    1971.  
    1972.         //display id
    1973.         int ItemID { get; }
    1974.  
    1975.         //amount in stock
    1976.         int Amount { get; set; }
    1977.  
    1978.         //max amount in stock
    1979.         int MaxAmount { get; }
    1980.  
    1981.         //Attempt to restock with item, (return true if restock sucessful)
    1982.         bool Restock(Item item, int amount);
    1983.  
    1984.         //called when its time for the whole shop to restock
    1985.         void OnRestock();
    1986.     }
    1987. }
     
  2. arphile
    Offline

    arphile Active Member

    Joined:
    Apr 24, 2014
    Messages:
    159
    Likes Received:
    29
    Change public virtual void InitOutfit() in Line 627
     
Similar Threads: basevendor hair
Forum Title Date
General Discussion Adding XMLSpawner TalkingBaseVendor Oct 26, 2016
Script Support not sure if i coded it out on mistake but been looking in my basevendor Jul 27, 2016
ServUO Discussion IShopSellInfo & BaseVendor Jan 17, 2016
Archived Bug Reports Elf facial hair on character creation Dec 29, 2016
Archived Bug Reports Gargoyles animation out of sync and rubberbanding when you get up from chair. Sep 18, 2016
Custom Releases ChangeHairStyle Command Jan 31, 2016
Custom Releases HairGrowth with FacialHairGrowth Jul 10, 2014