#region References using System; using System.Collections; using Server; using Server.Targeting; #endregion namespace Knives.TownHouses { public class ContractSetupGump : GumpPlusLight { public enum Page { Blocks, Floors, Sign, LocSec, Length, Price } public enum TargetType { SignLoc, MinZ, MaxZ, BlockOne, BlockTwo } private readonly RentalContract c_Contract; private Page c_Page; public ContractSetupGump(Mobile m, RentalContract contract) : base(m, 50, 50) { m.CloseGump(typeof(ContractSetupGump)); c_Contract = contract; } protected override void BuildGump() { var width = 300; var y = 0; switch (c_Page) { case Page.Blocks: BlocksPage(width, ref y); break; case Page.Floors: FloorsPage(width, ref y); break; case Page.Sign: SignPage(width, ref y); break; case Page.LocSec: LocSecPage(width, ref y); break; case Page.Length: LengthPage(width, ref y); break; case Page.Price: PricePage(width, ref y); break; } AddBackgroundZero(0, 0, width, y + 40, 0x13BE); } private void BlocksPage(int width, ref int y) { if (c_Contract == null) { return; } c_Contract.ShowAreaPreview(Owner); AddHtml(0, y += 10, width, "
Create the Area"); AddImage(width / 2 - 100, y + 2, 0x39); AddImage(width / 2 + 70, y + 2, 0x3B); y += 25; if (!General.HasOtherContract(c_Contract.ParentHouse, c_Contract)) { AddHtml(60, y, 90, "Entire House"); AddButton(30, y, c_Contract.EntireHouse ? 0xD3 : 0xD2, "Entire House", EntireHouse); } if (!c_Contract.EntireHouse) { AddHtml(170, y, 70, "Add Area"); AddButton(240, y, 0x15E1, 0x15E5, "Add Area", AddBlock); AddHtml(170, y += 20, 70, "Clear All"); AddButton(240, y, 0x15E1, 0x15E5, "Clear All", ClearBlocks); } var helptext = String.Format( " Welcome to the rental contract setup menu! To begin, you must " + "first create the area which you wish to sell. As seen above, there are two ways to do this: " + "rent the entire house, or parts of it. As you create the area, a simple preview will show you exactly " + "what area you've selected so far. You can make all sorts of odd shapes by using multiple areas!"); AddHtml(10, y += 35, width - 20, 170, helptext, false, false); y += 170; if (c_Contract.EntireHouse || c_Contract.Blocks.Count != 0) { AddHtml(width - 60, y += 20, 60, "Next"); AddButton(width - 30, y, 0x15E1, 0x15E5, "Next", ChangePage, (int)c_Page + (c_Contract.EntireHouse ? 4 : 1)); } } private void FloorsPage(int width, ref int y) { AddHtml(0, y += 10, width, "
Floors"); AddImage(width / 2 - 100, y + 2, 0x39); AddImage(width / 2 + 70, y + 2, 0x3B); AddHtml(40, y += 25, 80, "Base Floor"); AddButton(110, y, 0x15E1, 0x15E5, "Base Floor", MinZSelect); AddHtml(160, y, 80, "Top Floor"); AddButton(230, y, 0x15E1, 0x15E5, "Top Floor", MaxZSelect); AddHtml( 100, y += 25, 100, String.Format( "{0} total floor{1}", c_Contract.Floors > 10 ? "1" : "" + c_Contract.Floors, c_Contract.Floors == 1 || c_Contract.Floors > 10 ? "" : "s")); var helptext = String.Format( " Now you will need to target the floors you wish to rent out. " + "If you only want one floor, you can skip targeting the top floor. Everything within the base " + "and highest floor will come with the rental, and the more floors, the higher the cost later on."); AddHtml(10, y += 35, width - 20, 120, helptext, false, false); y += 120; AddHtml(30, y += 20, 80, "Previous"); AddButton(10, y, 0x15E3, 0x15E7, "Previous", ChangePage, (int)c_Page - 1); if (c_Contract.MinZ != short.MinValue) { AddHtml(width - 60, y, 60, "Next"); AddButton(width - 30, y, 0x15E1, 0x15E5, "Next", ChangePage, (int)c_Page + 1); } } private void SignPage(int width, ref int y) { if (c_Contract == null) { return; } c_Contract.ShowSignPreview(); AddHtml(0, y += 10, width, "
Their Sign Location"); AddImage(width / 2 - 100, y + 2, 0x39); AddImage(width / 2 + 70, y + 2, 0x3B); AddHtml(100, y += 25, 80, "Set Location"); AddButton(180, y, 0x15E1, 0x15E5, "Sign Loc", SignLocSelect); var helptext = String.Format( " With this sign, the rentee will have all the powers an owner has " + "over their area. If they use this power to demolish their rental unit, they have broken their " + "contract and will not receive their security deposit. They can also ban you from their rental home!"); AddHtml(10, y += 35, width - 20, 110, helptext, false, false); y += 110; AddHtml(30, y += 20, 80, "Previous"); AddButton(10, y, 0x15E3, 0x15E7, "Previous", ChangePage, (int)c_Page - 1); if (c_Contract.SignLoc != Point3D.Zero) { AddHtml(width - 60, y, 60, "Next"); AddButton(width - 30, y, 0x15E1, 0x15E5, "Next", ChangePage, (int)c_Page + 1); } } private void LocSecPage(int width, ref int y) { AddHtml(0, y += 10, width, "
Lockdowns and Secures"); AddImage(width / 2 - 100, y + 2, 0x39); AddImage(width / 2 + 70, y + 2, 0x3B); AddHtml(0, y += 25, width, "
Suggest Secures"); AddButton(width / 2 - 70, y + 3, 0x2716, "Suggest LocSec", SuggestLocSec); AddButton(width / 2 + 60, y + 3, 0x2716, "Suggest LocSec", SuggestLocSec); AddHtml( 30, y += 25, width / 2 - 20, "
Secures (Max: " + (General.RemainingSecures(c_Contract.ParentHouse) + c_Contract.Secures) + ")"); AddTextField(width / 2 + 50, y, 50, 20, 0x480, 0xBBC, "Secures", c_Contract.Secures.ToString()); AddButton(width / 2 + 25, y + 3, 0x2716, "Secures", Secures); AddHtml( 30, y += 20, width / 2 - 20, "
Lockdowns (Max: " + (General.RemainingLocks(c_Contract.ParentHouse) + c_Contract.Locks) + ")"); AddTextField(width / 2 + 50, y, 50, 20, 0x480, 0xBBC, "Lockdowns", c_Contract.Locks.ToString()); AddButton(width / 2 + 25, y + 3, 0x2716, "Lockdowns", Lockdowns); var helptext = String.Format( " Without giving storage, this wouldn't be much of a home! Here you give them lockdowns " + "and secures from your own home. Use the suggest button for an idea of how much you should give. Be very careful when " + "renting your property: if you use too much storage you begin to use storage you reserved for your clients. " + "You will receive a 48 hour warning when this happens, but after that the contract disappears!"); AddHtml(10, y += 35, width - 20, 180, helptext, false, false); y += 180; AddHtml(30, y += 20, 80, "Previous"); AddButton(10, y, 0x15E3, 0x15E7, "Previous", ChangePage, (int)c_Page - 1); if (c_Contract.Locks != 0 && c_Contract.Secures != 0) { AddHtml(width - 60, y, 60, "Next"); AddButton(width - 30, y, 0x15E1, 0x15E5, "Next", ChangePage, (int)c_Page + 1); } } private void LengthPage(int width, ref int y) { AddHtml(0, y += 10, width, "
Time Period"); AddImage(width / 2 - 100, y + 2, 0x39); AddImage(width / 2 + 70, y + 2, 0x3B); AddHtml(120, y += 25, 50, c_Contract.PriceType); AddButton(170, y + 8, 0x985, "LengthUp", LengthUp); AddButton(170, y - 2, 0x983, "LengthDown", LengthDown); var helptext = String.Format( " Every {0} the bank will automatically transfer the rental cost from them to you. " + "By using the arrows, you can cycle through other time periods to something better fitting your needs.", c_Contract.PriceTypeShort.ToLower()); AddHtml(10, y += 35, width - 20, 100, helptext, false, false); y += 100; AddHtml(30, y += 20, 80, "Previous"); AddButton(10, y, 0x15E3, 0x15E7, "Previous", ChangePage, (int)c_Page - (c_Contract.EntireHouse ? 4 : 1)); AddHtml(width - 60, y, 60, "Next"); AddButton(width - 30, y, 0x15E1, 0x15E5, "Next", ChangePage, (int)c_Page + 1); } private void PricePage(int width, ref int y) { AddHtml(0, y += 10, width, "
Charge Per Period"); AddImage(width / 2 - 100, y + 2, 0x39); AddImage(width / 2 + 70, y + 2, 0x3B); AddHtml(0, y += 25, width, "
Free"); AddButton(width / 2 - 80, y, c_Contract.Free ? 0xD3 : 0xD2, "Free", Free); AddButton(width / 2 + 60, y, c_Contract.Free ? 0xD3 : 0xD2, "Free", Free); if (!c_Contract.Free) { AddHtml(0, y += 25, width / 2 - 20, "
Per " + c_Contract.PriceTypeShort); AddTextField(width / 2 + 20, y, 70, 20, 0x480, 0xBBC, "Price", c_Contract.Price.ToString()); AddButton(width / 2 - 5, y + 3, 0x2716, "Price", Price); AddHtml(0, y += 20, width, "
Suggest"); AddButton(width / 2 - 70, y + 3, 0x2716, "Suggest", SuggestPrice); AddButton(width / 2 + 60, y + 3, 0x2716, "Suggest", SuggestPrice); } var helptext = String.Format( " Now you can finalize the contract by including your price per {0}. " + "Once you finalize, the only way you can modify it is to dump it and start a new contract! By " + "using the suggest button, a price will automatically be figured based on the following:
", c_Contract.PriceTypeShort); helptext += String.Format("
Volume: {0}
", c_Contract.CalcVolume()); helptext += String.Format("Cost per unit: {0} gold
", General.SuggestionFactor); helptext += "
You may also give this space away for free using the option above."; AddHtml(10, y += 35, width - 20, 150, helptext, false, true); y += 150; AddHtml(30, y += 20, 80, "Previous"); AddButton(10, y, 0x15E3, 0x15E7, "Previous", ChangePage, (int)c_Page - 1); if (c_Contract.Price != 0) { AddHtml(width - 70, y, 60, "Finalize"); AddButton(width - 30, y, 0x15E1, 0x15E5, "Finalize", FinalizeSetup); } } protected override void OnClose() { c_Contract.ClearPreview(); } private void SuggestPrice() { if (c_Contract == null) { return; } c_Contract.Price = c_Contract.CalcVolume() * General.SuggestionFactor; if (c_Contract.RentByTime == TimeSpan.FromDays(1)) { c_Contract.Price /= 60; } if (c_Contract.RentByTime == TimeSpan.FromDays(7)) { c_Contract.Price = (int)(c_Contract.Price / 8.57); } if (c_Contract.RentByTime == TimeSpan.FromDays(30)) { c_Contract.Price /= 2; } NewGump(); } private void SuggestLocSec() { var price = c_Contract.CalcVolume() * General.SuggestionFactor; c_Contract.Secures = price / 75; c_Contract.Locks = c_Contract.Secures / 2; c_Contract.FixLocSec(); NewGump(); } private void Price() { c_Contract.Price = GetTextFieldInt("Price"); Owner.SendMessage("Price set!"); NewGump(); } private void Secures() { c_Contract.Secures = GetTextFieldInt("Secures"); Owner.SendMessage("Secures set!"); NewGump(); } private void Lockdowns() { c_Contract.Locks = GetTextFieldInt("Lockdowns"); Owner.SendMessage("Lockdowns set!"); NewGump(); } private void ChangePage(object obj) { if (c_Contract == null || !(obj is int)) { return; } c_Contract.ClearPreview(); c_Page = (Page)(int)obj; NewGump(); } private void EntireHouse() { if (c_Contract == null || c_Contract.ParentHouse == null) { return; } c_Contract.EntireHouse = !c_Contract.EntireHouse; c_Contract.ClearPreview(); if (c_Contract.EntireHouse) { var list = new ArrayList(); var once = false; foreach (var rect in RUOVersion.RegionArea(c_Contract.ParentHouse.Region)) { list.Add(new Rectangle2D(new Point2D(rect.Start.X, rect.Start.Y), new Point2D(rect.End.X, rect.End.Y))); if (once) { continue; } if (rect.Start.Z >= rect.End.Z) { c_Contract.MinZ = rect.End.Z; c_Contract.MaxZ = rect.Start.Z; } else { c_Contract.MinZ = rect.Start.Z; c_Contract.MaxZ = rect.End.Z; } once = true; } c_Contract.Blocks = list; } else { c_Contract.Blocks.Clear(); c_Contract.MinZ = short.MinValue; c_Contract.MaxZ = short.MinValue; } NewGump(); } private void SignLocSelect() { Owner.Target = new InternalTarget(this, c_Contract, TargetType.SignLoc); } private void MinZSelect() { Owner.SendMessage("Target the base floor for your rental area."); Owner.Target = new InternalTarget(this, c_Contract, TargetType.MinZ); } private void MaxZSelect() { Owner.SendMessage("Target the highest floor for your rental area."); Owner.Target = new InternalTarget(this, c_Contract, TargetType.MaxZ); } private void LengthUp() { if (c_Contract == null) { return; } c_Contract.NextPriceType(); if (c_Contract.RentByTime == TimeSpan.FromDays(0)) { c_Contract.RentByTime = TimeSpan.FromDays(1); } NewGump(); } private void LengthDown() { if (c_Contract == null) { return; } c_Contract.PrevPriceType(); if (c_Contract.RentByTime == TimeSpan.FromDays(0)) { c_Contract.RentByTime = TimeSpan.FromDays(30); } NewGump(); } private void Free() { c_Contract.Free = !c_Contract.Free; NewGump(); } private void AddBlock() { Owner.SendMessage("Target the north western corner."); Owner.Target = new InternalTarget(this, c_Contract, TargetType.BlockOne); } private void ClearBlocks() { if (c_Contract == null) { return; } c_Contract.Blocks.Clear(); c_Contract.ClearPreview(); NewGump(); } private void FinalizeSetup() { if (c_Contract == null) { return; } if (c_Contract.Price == 0) { Owner.SendMessage("You can't rent the area for 0 gold!"); NewGump(); return; } c_Contract.Completed = true; c_Contract.BanLoc = c_Contract.ParentHouse.Region.GoLocation; if (c_Contract.EntireHouse) { var point = c_Contract.ParentHouse.Sign.Location; c_Contract.SignLoc = new Point3D(point.X, point.Y, point.Z - 5); c_Contract.Secures = Core.AOS ? c_Contract.ParentHouse.GetAosMaxSecures() : c_Contract.ParentHouse.MaxSecures; c_Contract.Locks = Core.AOS ? c_Contract.ParentHouse.GetAosMaxLockdowns() : c_Contract.ParentHouse.MaxLockDowns; } Owner.SendMessage("You have finalized this rental contract. Now find someone to sign it!"); } private class InternalTarget : Target { private readonly ContractSetupGump c_Gump; private readonly RentalContract c_Contract; private readonly TargetType c_Type; private readonly Point3D c_BoundOne; public InternalTarget(ContractSetupGump gump, RentalContract contract, TargetType type) : this(gump, contract, type, Point3D.Zero) { } public InternalTarget(ContractSetupGump gump, RentalContract contract, TargetType type, Point3D point) : base(20, true, TargetFlags.None) { c_Gump = gump; c_Contract = contract; c_Type = type; c_BoundOne = point; } protected override void OnTarget(Mobile m, object o) { var point = (IPoint3D)o; if (c_Contract == null || c_Contract.ParentHouse == null) { return; } if (!c_Contract.ParentHouse.Region.Contains(new Point3D(point.X, point.Y, point.Z))) { m.SendMessage("You must target within the home."); m.Target = new InternalTarget(c_Gump, c_Contract, c_Type, c_BoundOne); return; } switch (c_Type) { case TargetType.SignLoc: c_Contract.SignLoc = new Point3D(point.X, point.Y, point.Z); c_Contract.ShowSignPreview(); c_Gump.NewGump(); break; case TargetType.MinZ: if (!c_Contract.ParentHouse.Region.Contains(new Point3D(point.X, point.Y, point.Z))) { m.SendMessage("That isn't within your house."); } else if (c_Contract.HasContractedArea(point.Z)) { m.SendMessage("That area is already taken by another rental contract."); } else { c_Contract.MinZ = point.Z; if (c_Contract.MaxZ < c_Contract.MinZ + 19) { c_Contract.MaxZ = point.Z + 19; } } c_Contract.ShowFloorsPreview(m); c_Gump.NewGump(); break; case TargetType.MaxZ: if (!c_Contract.ParentHouse.Region.Contains(new Point3D(point.X, point.Y, point.Z))) { m.SendMessage("That isn't within your house."); } else if (c_Contract.HasContractedArea(point.Z)) { m.SendMessage("That area is already taken by another rental contract."); } else { c_Contract.MaxZ = point.Z + 19; if (c_Contract.MinZ > c_Contract.MaxZ) { c_Contract.MinZ = point.Z; } } c_Contract.ShowFloorsPreview(m); c_Gump.NewGump(); break; case TargetType.BlockOne: m.SendMessage("Now target the south eastern corner."); m.Target = new InternalTarget(c_Gump, c_Contract, TargetType.BlockTwo, new Point3D(point.X, point.Y, point.Z)); break; case TargetType.BlockTwo: var rect = TownHouseSetupGump.FixRect(new Rectangle2D(c_BoundOne, new Point3D(point.X + 1, point.Y + 1, point.Z))); if (c_Contract.HasContractedArea(rect, point.Z)) { m.SendMessage("That area is already taken by another rental contract."); } else { c_Contract.Blocks.Add(rect); c_Contract.ShowAreaPreview(m); } c_Gump.NewGump(); break; } } protected override void OnTargetCancel(Mobile m, TargetCancelType cancelType) { c_Gump.NewGump(); } } } }