using Server; using System; using Server.Mobiles; using Server.Items; using Server.Gumps; using Server.Accounting; using Server.Targeting; using System.Globalization; using Server.Network; using System.Linq; namespace Server.Engines.Auction { public class BaseAuctionGump : Gump { public const int Blue = 0x1FF; public const int Yellow = 0x6B45; public const int White = 0x7FFF; public const int Gray = 0x4E73; public const string HGray = "BFBFBF"; public const int Length = 400; public const int Height = 600; public AuctionSafe Safe { get; set; } public bool Owner { get; set; } public PlayerMobile User { get; set; } public Auction Auction { get; set; } public BaseAuctionGump(PlayerMobile p, AuctionSafe safe) : base(100, 100) { Safe = safe; Auction = safe.Auction; User = p; AddGumpLayout(); } public void Refresh() { Entries.Clear(); Entries.TrimExcess(); AddGumpLayout(); User.CloseGump(GetType()); User.SendGump(this, false); } public string Color(string color, string str) { return String.Format("{1}", color, str); } public virtual void AddGumpLayout() { AddPage(0); AddBackground(0, 0, Length, Height, 39925); AddHtmlLocalized(15, 25, 360, 18, 1114513, "#1156371", White, false, false); //
~1_TOKEN~
AddHtmlLocalized(15, 52, 360, 18, 1114513, Owner ? "#1150328" : "#1156442", Blue, false, false); //
~1_TOKEN~
AddHtmlLocalized(80, 88, 110, 22, 3000098, Yellow, false, false); // Information AddButton(40, 88, 4005, 4007, 100, GumpButtonType.Reply, 0); AddHtmlLocalized(265, 88, 110, 22, 3010004, Yellow, false, false); // History AddButton(225, 88, 4005, 4007, 101, GumpButtonType.Reply, 0); Account acct = User.Account as Account; AddHtmlLocalized(15, 117, 175, 18, 1114514, "#1156044", Yellow, false, false); // Total Gold: AddHtml(200, 117, 175, 18, Color(HGray, acct != null ? acct.TotalGold.ToString("N0", CultureInfo.GetCultureInfo("en-US")) : "0"), false, false); AddHtmlLocalized(15, 137, 175, 18, 1114514, "#1156045", Yellow, false, false); // Total Platinum: AddHtml(200, 137, 175, 18, Color(HGray, acct != null ? acct.TotalPlat.ToString("N0", CultureInfo.GetCultureInfo("en-US")) : "0"), false, false); if (Auction != null) Auction.AddViewer(User); } public override void OnResponse(NetState state, RelayInfo info) { switch (info.ButtonID) { case 0: break; case 100: Refresh(); User.SendGump(new AuctionInfoGump(User)); break; case 101: Refresh(); User.SendGump(new BidHistoryGump(User, Auction)); break; } if (Auction != null) Auction.RemoveViewer(User); } } public class AuctionOwnerGump : BaseAuctionGump { private long _TempBid; private long _TempBuyout; private bool _NoBid; public AuctionOwnerGump(PlayerMobile pm, AuctionSafe safe) : base(pm, safe) { Owner = true; } public override void AddGumpLayout() { base.AddGumpLayout(); _TempBid = 0; _TempBuyout = 0; _NoBid = false; if (Auction == null) { if (Safe.Auction != null) Auction = Safe.Auction; else Safe.Auction = Auction = new Auction(User, Safe); } int y = 166; // Add Auction Item AddHtmlLocalized(200, y, 175, 22, 1156421, Yellow, false, false); // Select New Auction Item AddButton(160, y, 4005, 4007, 1, GumpButtonType.Reply, 0); y += 24; // Description AddHtmlLocalized(15, y, 175, 110, 1114514, "#1156400", Yellow, false, false); // Description: AddButton(345, y, 4014, 4016, 2, GumpButtonType.Reply, 0); AddBackground(200, y, 140, 110, 9350); AddTextEntry(202, y + 2, 136, 106, 0, 1, Auction.Description, 140); // Display Item if (Auction.AuctionItem != null) { Item i = Auction.AuctionItem; AddImageTiledButton(102, 212, 0x918, 0x918, 0x0, GumpButtonType.Page, 0, i.ItemID, i.Hue, 23, 5); AddItemProperty(i.Serial); } y += 112; AddHtmlLocalized(15, y, 175, 18, 1114514, "#1156404", Yellow, false, false); // Time Remaining: if (Auction.HasBegun) { TimeSpan left = Auction.EndTime - DateTime.Now; int cliloc; double v; if (left.TotalSeconds < 0 || Auction.InClaimPeriod) { AddHtmlLocalized(200, y, 175, 18, 1114513, "#1156438", Gray, false, false); // Auction Ended } else { if (left.TotalDays >= 1) { cliloc = 1153091; // Lifespan: ~1_val~ days v = left.TotalDays; } else if (left.TotalHours >= 1) { cliloc = 1153090; // Lifespan: ~1_val~ hours v = left.TotalHours; } else { cliloc = 1153089; // Lifespan: ~1_val~ minutes v = left.TotalMinutes; } AddHtmlLocalized(200, y, 175, 18, cliloc, ((int)v).ToString(), Gray, false, false); } } else { TimeSpan ts = TimeSpan.FromMinutes(Auction.Duration); if (ts.TotalMinutes > 60) { AddHtmlLocalized(200, y, 175, 18, 1153091, String.Format("{0}", ts.TotalDays), Gray, false, false); // Lifespan: ~1_val~ days } else { AddHtmlLocalized(200, y, 175, 18, 1153089, String.Format("{0}", ts.TotalMinutes), Gray, false, false); // Lifespan: ~1_val~ minutes } } y += 20; AddHtmlLocalized(200, y, 140, 20, 1114514, "#1156455", Yellow, false, false); // One Hour AddButton(345, y, 4014, 4016, 3, GumpButtonType.Reply, 0); y += 20; AddHtmlLocalized(200, y, 140, 20, 1114514, "#1156418", Yellow, false, false); // Three Days AddButton(345, y, 4014, 4016, 4, GumpButtonType.Reply, 0); y += 20; AddHtmlLocalized(Length / 2, y, 140, 20, 1114514, "#1156419", Yellow, false, false); // Five Days AddButton(345, y, 4014, 4016, 5, GumpButtonType.Reply, 0); y += 20; AddHtmlLocalized(200, y, 140, 20, 1114514, "#1156420", Yellow, false, false); // Seven Days AddButton(Length - 55, y, 4014, 4016, 6, GumpButtonType.Reply, 0); y += 24; int[] startbid = GetPlatGold(Auction.StartBid); // Start Bid Plat/Gold AddHtmlLocalized(15, y, 175, 22, 1114514, "#1156410", Yellow, false, false); // Item Starting Bid Plat: AddBackground(200, y, 175, 22, 9350); AddTextEntry(202, y, 171, 18, 0, 2, startbid[0] > 0 ? startbid[0].ToString() : "", 9); y += 24; AddHtmlLocalized(15, y, 175, 22, 1114514, "#1156411", Yellow, false, false); // Item Starting Bid Gold: AddBackground(200, y, 175, 22, 9350); AddTextEntry(202, y, 171, 18, 0, 3, startbid[1] > 0 ? startbid[1].ToString() : "", 9); y += 24; AddHtmlLocalized(200, y, 175, 22, 1156416, Yellow, false, false); // Set Starting Bids AddButton(160, y, 4005, 4007, 7, GumpButtonType.Reply, 0); y += 26; // Buy Now AddHtmlLocalized(15, y, 175, 22, 1114514, "#1156413", Yellow, false, false); // Buy Now Plat Price: AddBackground(200, y, 175, 22, 9350); AddTextEntry(202, y + 2, 171, 18, 0, 4, Auction.BuyoutPlat > 0 ? Auction.BuyoutPlat.ToString() : "", 9); y += 26; AddHtmlLocalized(15, y, 175, 22, 1114514, "#1156412", Yellow, false, false); // Buy Now Gold Price: AddBackground(200, y, 175, 22, 9350); AddTextEntry(202, y, 171, 18, 0, 5, Auction.BuyoutGold > 0 ? Auction.BuyoutGold.ToString() : "", 9); y += 24; AddHtmlLocalized(200, y, 175, 22, 1156417, Yellow, false, false); // Set Buy Now Price AddButton(160, y, 4005, 4007, 8, GumpButtonType.Reply, 0); y += 24; if (Auction.AuctionItemOnDisplay() && !Auction.OnGoing) { AddHtmlLocalized(200, y, 175, 22, 1156414, Yellow, false, false); // Start Auction AddButton(160, y, 4005, 4007, 9, GumpButtonType.Reply, 0); } if (Auction.OnGoing && Auction.HighestBid == null) { AddHtmlLocalized(200, y, 175, 22, 1156415, Yellow, false, false); // Stop Auction AddButton(160, y, 4005, 4007, 23, GumpButtonType.Reply, 0); } } public int[] GetPlatGold(long amount) { int plat = 0; int gold = 0; if (amount >= Account.CurrencyThreshold) { plat = (int)(amount / Account.CurrencyThreshold); gold = (int)(amount - (plat * Account.CurrencyThreshold)); } else { gold = (int)amount; } return new int[] { plat, gold }; } private class InternalTarget : Target { private Auction Auction; private BaseAuctionGump Gump; public InternalTarget(Auction auction, BaseAuctionGump g) : base(-1, false, TargetFlags.None) { Auction = auction; Gump = g; } private bool IsBadItem(Item item) { return item == null || item.Weight > 300 || (item is Container && !(item is BaseQuiver)) || item is Gold || item is BankCheck || !item.Movable || item.Items.Count > 0; } protected override void OnTarget(Mobile from, object targeted) { if (Auction == null || Auction.Safe == null || Auction.Safe.Deleted) { return; } if (targeted is Item) { Item item = targeted as Item; if (!IsBadItem(item)) { if (item.IsChildOf(from.Backpack)) { Auction.AuctionItem = item; item.Movable = false; item.MoveToWorld(new Point3D(Gump.Safe.X, Gump.Safe.Y, Gump.Safe.Z + 7), Gump.Safe.Map); Gump.Refresh(); } else { from.SendLocalizedMessage(1042001); // That must be in your pack for you to use it. from.Target = new InternalTarget(Auction, Gump); } } else { from.Target = new InternalTarget(Auction, Gump); } } else { from.Target = new InternalTarget(Auction, Gump); } } protected override void OnTargetCancel(Mobile from, TargetCancelType cancelType) { Gump.Refresh(); from.SendLocalizedMessage(1149667); // Invalid target. } } public override void OnResponse(NetState state, RelayInfo info) { base.OnResponse(state, info); Mobile from = state.Mobile; switch (info.ButtonID) { case 1: { if (Auction.CheckModifyAuction(User, true)) { if (Auction.AuctionItem != null) { if (Auction.AuctionItem.LabelNumber != 0) { from.SendLocalizedMessage(1152339, String.Format("#{0}", Auction.AuctionItem.LabelNumber)); // A reward of ~1_ITEM~ has been placed in your backpack. } else { from.SendLocalizedMessage(1152339, Auction.AuctionItem.Name); // A reward of ~1_ITEM~ has been placed in your backpack. } Auction.AuctionItem.Movable = true; from.AddToBackpack(Auction.AuctionItem); Auction.AuctionItem = null; } from.Target = new InternalTarget(Auction, this); } else { Refresh(); } break; } case 2: { if (Auction.CheckModifyAuction(User)) { TextRelay relay = info.GetTextEntry(1); string str = null; if (relay != null) str = relay.Text; if (str != null || Guilds.BaseGuildGump.CheckProfanity(str, 140)) { Auction.Description = Utility.FixHtml(str.Trim()); } else { from.SendLocalizedMessage(1150315); // That text is unacceptable. } } Refresh(); break; } case 3: { if (Auction.CheckModifyAuction(User)) Auction.Duration = 60; Refresh(); break; } case 4: { if (Auction.CheckModifyAuction(User)) Auction.Duration = 4320; Refresh(); break; } case 5: { if (Auction.CheckModifyAuction(User)) Auction.Duration = 7200; Refresh(); break; } case 6: { if (Auction.CheckModifyAuction(User)) Auction.Duration = 10080; Refresh(); break; } case 7: { if (Auction.CheckModifyAuction(User)) { TextRelay relay1 = info.GetTextEntry(2); string plat1 = null; string gold1 = null; if (relay1 != null) plat1 = relay1.Text; relay1 = info.GetTextEntry(3); if (relay1 != null) gold1 = relay1.Text; long platAmnt = Utility.ToInt64(plat1); long goldAmnt = Utility.ToInt64(gold1); if (platAmnt >= 0 && goldAmnt >= 0) { _TempBid += platAmnt * Account.CurrencyThreshold; _TempBid += goldAmnt; } else { from.SendLocalizedMessage(1150315); // That text is unacceptable. _NoBid = true; } if (!_NoBid) { if (Auction.OnGoing && Auction.BidHistory == null) { Auction.CurrentBid = _TempBid; } Auction.StartBid = _TempBid; } } Refresh(); break; } case 8: { if (Auction.CheckModifyAuction(User)) { TextRelay relay2 = info.GetTextEntry(4); string plat2 = null; string gold2 = null; if (relay2 != null) plat2 = relay2.Text; relay2 = info.GetTextEntry(5); if (relay2 != null) gold2 = relay2.Text; long platAmnt2 = Utility.ToInt64(plat2); long goldAmnt2 = Utility.ToInt64(gold2); if (platAmnt2 >= 0 && goldAmnt2 >= 0) { _TempBuyout += platAmnt2 * Account.CurrencyThreshold; _TempBuyout += goldAmnt2; } else { from.SendLocalizedMessage(1150315); // That text is unacceptable. } Auction.Buyout = _TempBuyout; } Refresh(); break; } case 9: { if (Auction.StartBid <= 0) { User.SendLocalizedMessage(1156434); // You must set a starting bid. } else { Auction.OnBegin(); } Refresh(); break; } case 23: { if (Auction.OnGoing && Auction.HighestBid == null) { Auction.ClaimPrize(User); } break; } } } } public class AuctionBidGump : BaseAuctionGump { public long TempBid { get; set; } public AuctionBidGump(PlayerMobile pm, AuctionSafe safe) : base(pm, safe) { } public override void AddGumpLayout() { base.AddGumpLayout(); TempBid = 0; // Display Item if (Auction.AuctionItem != null) { Item i = Auction.AuctionItem; AddImageTiledButton(200, 166, 0x918, 0x918, 0x0, GumpButtonType.Page, 0, i.ItemID, i.Hue, 23, 5); AddItemProperty(i.Serial); } AddHtmlLocalized(15, 238, 175, 90, 1114514, "#1156400", Yellow, false, false); // Description: AddHtml(200, 238, 175, 90, Auction.Description, true, true); AddHtmlLocalized(15, 330, 175, 18, 1114514, "#1156404", Yellow, false, false); // Time Remaining: if (Auction.HasBegun) { TimeSpan left = Auction.EndTime - DateTime.Now; int cliloc; double v; if (left.TotalSeconds < 0 || Auction.InClaimPeriod) { AddHtmlLocalized(200, 330, 175, 18, 1114513, "#1156438", Gray, false, false); // Auction Ended } else { if (left.TotalDays >= 1) { cliloc = 1153091; // Lifespan: ~1_val~ days v = left.TotalDays; } else if (left.TotalHours >= 1) { cliloc = 1153090; // Lifespan: ~1_val~ hours v = left.TotalHours; } else { cliloc = 1153089; // Lifespan: ~1_val~ minutes v = left.TotalMinutes; } AddHtmlLocalized(200, 330, 175, 18, cliloc, ((int)v).ToString(), Gray, false, false); } } else { AddHtmlLocalized(200, 330, 175, 18, 1114513, "#1156440", Gray, false, false); // Auction Pending } AddHtmlLocalized(15, 350, 175, 18, 1114514, "#1156436", Yellow, false, false); // Current Platinum Bid: AddHtml(200, 350, 175, 18, Color(HGray, Auction.CurrentPlatBid.ToString("N0", CultureInfo.GetCultureInfo("en-US"))), false, false); AddHtmlLocalized(15, 370, 175, 18, 1114514, "#1156435", Yellow, false, false); // Current Gold Bid: AddHtml(200, 370, 175, 18, Color(HGray, Auction.CurrentGoldBid.ToString("N0", CultureInfo.GetCultureInfo("en-US"))), false, false); AddHtmlLocalized(15, 392, 175, 22, 1114514, "#1156406", Yellow, false, false); // Your Current Platinum Bid: AddBackground(200, 392, 175, 22, 9350); AddTextEntry(202, 394, 171, 18, 0, 1, "", 9); AddHtmlLocalized(15, 418, 175, 22, 1114514, "#1156405", Yellow, false, false); // Your Current Gold Bid: AddBackground(200, 418, 175, 22, 9350); AddTextEntry(202, 420, 171, 18, 0, 2, "", 9); AddHtmlLocalized(200, 442, 175, 22, 1156407, Yellow, false, false); // Place Bid AddButton(160, 442, 4005, 4007, 1, GumpButtonType.Reply, 0); if (Auction.Buyout > 0 && (Auction.HighestBid == null || Auction.HighestBid != null && Auction.HighestBid.Mobile != User)) { AddHtmlLocalized(15, 484, 175, 18, 1114514, "#1156413", Yellow, false, false); // Buy Now Plat Price: AddHtml(200, 484, 175, 18, Color(HGray, Auction.BuyoutPlat.ToString("N0", CultureInfo.GetCultureInfo("en-US"))), false, false); AddHtmlLocalized(15, 502, 175, 18, 1114514, "#1156412", Yellow, false, false); // Buy Now Gold Price: AddHtml(200, 502, 175, 18, Color(HGray, Auction.BuyoutGold.ToString("N0", CultureInfo.GetCultureInfo("en-US"))), false, false); AddHtmlLocalized(200, 520, 175, 22, 1156409, Yellow, false, false); // Buy Now AddButton(160, 520, 4005, 4007, 2, GumpButtonType.Reply, 0); } } public override void OnResponse(NetState state, RelayInfo info) { base.OnResponse(state, info); switch (info.ButtonID) { case 1: { TextRelay relay = info.GetTextEntry(1); string gold = null; string plat = null; if (relay != null) plat = relay.Text; relay = info.GetTextEntry(2); if (relay != null) gold = relay.Text; long val = Utility.ToInt64(plat); if (val < 0) val = 0; TempBid += val * Account.CurrencyThreshold; val = Utility.ToInt64(gold); if (val < 0) val = 0; TempBid += val; Auction.TryPlaceBid(User, TempBid); Refresh(); Auction.ResendGumps(User); break; } case 2: { Auction.TryBuyout(User); User.SendGump(new AuctionBidGump(User, Safe)); break; } } } } public class AuctionInfoGump : Gump { public AuctionInfoGump(PlayerMobile pm) : base(100, 200) { AddPage(0); AddBackground(0, 0, 600, 400, 0x9BF5); AddHtmlLocalized(50, 10, 500, 18, 1114513, "#1156371", 0x7FFF, false, false); //
~1_TOKEN~
/*
Auction Safe

Auction Safe deeds can be obtained from the veteran reward system.
An Auction * Safe can be placed within public houses. When placed in a home the owner will be able to set access security on which users are allowed * to place bids.
Setting up an auction first requires you to select an item from your backpack for auction. This item cannot be gold, * a container, over 399 stones in weight, and must meet * requirements for adding an item to a vendor.Once the item has been added it will be placed on the auction safe to be displayed. * A starting bid and auction length must be set before you can start the auction and cannot be changed once the auction begins. 140 * characters can be used to describe your auction item which can be updated at any time. A Buy Now price can be set which will allow * customers to skip a bidding war and purchase the item at listed cost, but by doing so includes an approximate 5% fee on the purchase * price.
On completion of the auction the owner account will receive their payment immediately and will be notified by in game mail * of the outcome. The winning bidder will now have 3 days to retrieve their item from the auction safe or it will revert back to the * owner. Once the auctioned item has been retrieved the auction safe will once again be available to start a new auction.

In order * to bid on an auction, players must have currency available in their * account. Bidders can then place a bid for the maximum amount they are willing to pay for the listed item. Funds will immediately * be removed from your account if your bid is successful. If your bid is higher than the current maximum bid yours will become the current * winning bid. If you are out bid as the winning bid you will be notified by in game mail and your bid will be refunded to your account. * On completion of the auction if you are the winning bid you will be notified that you have three days to claim your item. Upon claiming * your item if you have any change as a result of your maximum bid it will be refunded to you.
*/ AddHtmlLocalized(50, 37, 500, 313, 1156441, 0x4100, true, true); } } public class BidHistoryGump : Gump { private readonly int Green = 0x208; public const string HGray = "BFBFBF"; public Auction Auction { get; set; } public BidHistoryGump(PlayerMobile pm, Auction auction) : base(100, 200) { Auction = auction; AddPage(0); AddBackground(0, 0, 600, 400, 0x9BF5); AddHtmlLocalized(50, 10, 500, 18, 1114513, "#1156422", Green, false, false); //
~1_TOKEN~
AddHtmlLocalized(50, 46, 58, 22, 1078924, Green, false, false); // Name: AddHtmlLocalized(118, 46, 117, 22, 1156423, Green, false, false); // Platinum Bid: AddHtmlLocalized(245, 46, 117, 22, 1156424, Green, false, false); // Gold Bid: AddHtmlLocalized(372, 46, 176, 22, 1156425, Green, false, false); // Bid Time: if (Auction == null || Auction.BidHistory == null) return; int y = 70; for (int i = Auction.BidHistory.Count - 1; i >= 0; i--) { if (i < Auction.BidHistory.Count - 13) break; HistoryEntry h = Auction.BidHistory[i]; long bid = i != Auction.BidHistory.Count - 1 || h.ShowRealBid ? h.Bid : Auction.CurrentBid; long plat = bid >= Account.CurrencyThreshold ? bid / Account.CurrencyThreshold : 0; long gold = bid >= Account.CurrencyThreshold ? bid - ((bid / Account.CurrencyThreshold) * Account.CurrencyThreshold) : bid; AddHtml(50, y, 58, 22, Color(HGray, String.Format("{0}*****", h.Mobile != null ? h.Mobile.Name.Trim()[0].ToString() : "?")), false, false); AddHtml(118, y, 117, 22, Color(HGray, plat.ToString("N0", CultureInfo.GetCultureInfo("en-US"))), false, false); AddHtml(245, y, 117, 22, Color(HGray, gold.ToString("N0", CultureInfo.GetCultureInfo("en-US"))), false, false); AddHtml(372, y, 176, 22, Color(HGray, String.Format("{0}-{1}-{2} {3}", h.BidTime.Year, h.BidTime.Month, h.BidTime.Day, h.BidTime.ToShortTimeString())), false, false); y += 24; } } public string Color(string color, string str) { return String.Format("{1}", color, str); } } }