using System; using System.Collections; using System.Collections.Generic; using System.Linq; using Server.Items; using Server.Mobiles; using Server.Multis; using Server.Network; using Server.Prompts; namespace Server.Gumps { public enum HouseGumpPageAOS { Information, Security, Storage, Customize, Ownership, ChangeHanger, ChangeFoundation, ChangeSign, RemoveCoOwner, ListCoOwner, RemoveFriend, ListFriend, RemoveBan, ListBan, RemoveAccess, ListAccess, ChangePost, Vendors } public class HouseGumpAOS : Gump { private readonly BaseHouse m_House; private readonly HouseGumpPageAOS m_Page; private const int LabelColor = 0x7FFF; private const int SelectedColor = 0x421F; private const int DisabledColor = 0x4210; private const int WarningColor = 0x7E10; private const int LabelHue = 0x481; private const int HighlightedLabelHue = 0x64; private List m_List; private string GetOwnerName() { Mobile m = m_House.Owner; if (m == null || m.Deleted) return "(unowned)"; string name; if ((name = m.Name) == null || (name = name.Trim()).Length <= 0) name = "(no name)"; return name; } private string GetDateTime(DateTime val) { if (val == DateTime.MinValue) return ""; return val.ToString("yyyy'-'MM'-'dd HH':'mm':'ss"); } public void AddPageButton(int x, int y, int buttonID, int number, HouseGumpPageAOS page) { bool isSelection = (m_Page == page); AddButton(x, y, isSelection ? 4006 : 4005, 4007, buttonID, GumpButtonType.Reply, 0); AddHtmlLocalized(x + 45, y, 200, 20, number, isSelection ? SelectedColor : LabelColor, false, false); } public void AddButtonLabeled(int x, int y, int buttonID, int number) { AddButtonLabeled(x, y, buttonID, number, true); } public void AddButtonLabeled(int x, int y, int buttonID, int number, bool enabled) { if (enabled) AddButton(x, y, 4005, 4007, buttonID, GumpButtonType.Reply, 0); AddHtmlLocalized(x + 35, y, 240, 20, number, enabled ? LabelColor : DisabledColor, false, false); } public void AddList(List list, int button, bool accountOf, bool leadingStar, Mobile from) { if (list == null) return; m_List = new List(list); int lastPage = 0; int index = 0; for (int i = 0; i < list.Count; ++i) { int xoffset = ((index % 20) / 10) * 200; int yoffset = (index % 10) * 20; int page = 1 + (index / 20); if (page != lastPage) { if (lastPage != 0) AddButton(40, 360, 4005, 4007, 0, GumpButtonType.Page, page); AddPage(page); if (lastPage != 0) AddButton(10, 360, 4014, 4016, 0, GumpButtonType.Page, lastPage); lastPage = page; } Mobile m = list[i]; string name; int labelHue = LabelHue; if (m is PlayerVendor) { PlayerVendor vendor = (PlayerVendor)m; name = vendor.ShopName; if (vendor.IsOwner(from)) labelHue = HighlightedLabelHue; } else if (m != null) { name = m.Name; } else { continue; } if ((name = name.Trim()).Length <= 0) continue; if (button != -1) AddButton(10 + xoffset, 150 + yoffset, 4005, 4007, GetButtonID(button, i), GumpButtonType.Reply, 0); if (accountOf && m.Player && m.Account != null) name = "Account of " + name; if (leadingStar) name = "* " + name; AddLabel(button > 0 ? 45 + xoffset : 10 + xoffset, 150 + yoffset, labelHue, name); ++index; } } public int GetButtonID(int type, int index) { return 1 + (index * 15) + type; } private static readonly int[] m_HangerNumbers = new int[] { 2968, 2970, 2972, 2974, 2976, 2978 }; private static readonly int[] m_FoundationNumbers = (Core.ML ? new int[] { 20, 189, 765, 65, 101, 11767, 11771, 11207, 11715, 11181, 13938, 13942, 16806, 16732, 19208, 39614, 39888 } : new int[] { 20, 189, 765, 65, 101 }); private static readonly int[] m_PostNumbers = new int[] { 9, 29, 54, 90, 147, 169, 177, 204, 251, 257, 263, 298, 347, 353, 424, 441, 466, 514, 553, 600, 601, 602, 603, 660, 666, 672, 898, 970, 974, 982, 11212, 11720, 11186, 13788, 13849, 17190, 16796, 16733, 16663, 20758, 19214, 39603, 39809 }; private static readonly List _HouseSigns = new List(); public HouseGumpAOS(HouseGumpPageAOS page, Mobile from, BaseHouse house) : base(50, 40) { m_House = house; m_Page = page; from.CloseGump(typeof(HouseGumpAOS)); //from.CloseGump( typeof( HouseListGump ) ); //from.CloseGump( typeof( HouseRemoveGump ) ); bool isCombatRestricted = house.IsCombatRestricted(from); bool isOwner = house.IsOwner(from); bool isCoOwner = isOwner || house.IsCoOwner(from); bool isFriend = isCoOwner || house.IsFriend(from); if (isCombatRestricted) isFriend = isCoOwner = isOwner = false; AddPage(0); if (isFriend || page == HouseGumpPageAOS.Vendors) { AddBackground(0, 0, 420, page != HouseGumpPageAOS.Vendors ? 440 : 420, 5054); AddImageTiled(10, 10, 400, 100, 2624); AddAlphaRegion(10, 10, 400, 100); AddImageTiled(10, 120, 400, 260, 2624); AddAlphaRegion(10, 120, 400, 260); AddImageTiled(10, 390, 400, page != HouseGumpPageAOS.Vendors ? 40 : 20, 2624); AddAlphaRegion(10, 390, 400, page != HouseGumpPageAOS.Vendors ? 40 : 20); AddButtonLabeled(250, page != HouseGumpPageAOS.Vendors ? 410 : 390, 0, 1060675); // CLOSE } if (!Core.TOL) { AddImage(10, 10, 100); if (m_House.Sign != null) { ArrayList lines = Wrap(m_House.Sign.GetName()); if (lines != null) { for (int i = 0, y = (114 - (lines.Count * 14)) / 2; i < lines.Count; ++i, y += 14) { string s = (string)lines[i]; AddLabel(10 + ((160 - (s.Length * 8)) / 2), y, 0, s); } } } } if (page == HouseGumpPageAOS.Vendors) { AddHtmlLocalized(10, 120, 400, 20, 1062428, LabelColor, false, false); //
SHOPS
AddList(house.AvailableVendorsFor(from), 1, false, false, from); return; } if (!isFriend) return; if (house.Public) { AddButtonLabeled(10, 390, GetButtonID(0, 0), 1060674); // Banish AddButtonLabeled(10, 410, GetButtonID(0, 1), 1011261); // Lift a Ban } else { AddButtonLabeled(10, 390, GetButtonID(0, 2), 1060676); // Grant Access AddButtonLabeled(10, 410, GetButtonID(0, 3), 1060677); // Revoke Access } AddPageButton(Core.TOL ? 10 : 150, 10, GetButtonID(1, 0), 1060668, HouseGumpPageAOS.Information); AddPageButton(Core.TOL ? 10 : 150, 30, GetButtonID(1, 1), 1060669, HouseGumpPageAOS.Security); AddPageButton(Core.TOL ? 10 : 150, 50, GetButtonID(1, 2), 1060670, HouseGumpPageAOS.Storage); AddPageButton(Core.TOL ? 10 : 150, 70, GetButtonID(1, 3), 1060671, HouseGumpPageAOS.Customize); AddPageButton(Core.TOL ? 10 : 150, 90, GetButtonID(1, 4), 1060672, HouseGumpPageAOS.Ownership); switch ( page ) { case HouseGumpPageAOS.Information: { AddHtmlLocalized(20, 130, 200, 20, 1011242, LabelColor, false, false); // Owned By: AddLabel(210, 130, LabelHue, GetOwnerName()); AddHtmlLocalized(20, 170, 380, 20, 1018032, SelectedColor, false, false); // This house is properly placed. AddHtmlLocalized(20, 190, 380, 20, 1018035, SelectedColor, false, false); // This house is of modern design. AddHtmlLocalized(20, 210, 380, 20, (house is HouseFoundation) ? 1060681 : 1060680, SelectedColor, false, false); // This is a (pre | custom)-built house. AddHtmlLocalized(20, 230, 380, 20, house.Public ? 1060678 : 1060679, SelectedColor, false, false); // This house is (private | open to the public). switch ( house.DecayType ) { case DecayType.Ageless: case DecayType.AutoRefresh: { AddHtmlLocalized(20, 250, 380, 20, 1062209, SelectedColor, false, false); // This house is Automatically refreshed. break; } case DecayType.ManualRefresh: { AddHtmlLocalized(20, 250, 380, 20, 1062208, SelectedColor, false, false); // This house is Grandfathered. break; } case DecayType.Condemned: { AddHtmlLocalized(20, 250, 380, 20, 1062207, WarningColor, false, false); // This house is Condemned. break; } } AddHtmlLocalized(20, 290, 200, 20, 1060692, SelectedColor, false, false); // Built On: AddLabel(250, 290, LabelHue, GetDateTime(house.BuiltOn)); AddHtmlLocalized(20, 310, 200, 20, 1060693, SelectedColor, false, false); // Last Traded: AddLabel(250, 310, LabelHue, GetDateTime(house.LastTraded)); AddHtmlLocalized(20, 330, 200, 20, 1061793, SelectedColor, false, false); // House Value AddLabel(250, 330, LabelHue, house.Price.ToString("N0", System.Globalization.CultureInfo.GetCultureInfo("en-US"))); AddHtmlLocalized(20, 360, 300, 20, 1011241, SelectedColor, false, false); // Number of visits this building has had: AddLabel(350, 360, LabelHue, house.TotalVisits.ToString()); break; } case HouseGumpPageAOS.Security: { AddButtonLabeled(10, 130, GetButtonID(3, 0), 1011266, isCoOwner); // View Co-Owner List AddButtonLabeled(10, 150, GetButtonID(3, 1), 1011267, isOwner); // Add a Co-Owner AddButtonLabeled(10, 170, GetButtonID(3, 2), 1018036, isOwner); // Remove a Co-Owner AddButtonLabeled(10, 190, GetButtonID(3, 3), 1011268, isOwner); // Clear Co-Owner List AddButtonLabeled(10, 220, GetButtonID(3, 4), 1011243); // View Friends List AddButtonLabeled(10, 240, GetButtonID(3, 5), 1011244, isCoOwner); // Add a Friend AddButtonLabeled(10, 260, GetButtonID(3, 6), 1018037, isCoOwner); // Remove a Friend AddButtonLabeled(10, 280, GetButtonID(3, 7), 1011245, isCoOwner); // Clear Friend List if (house.Public) { AddButtonLabeled(10, 310, GetButtonID(3, 8), 1011260); // View Ban List AddButtonLabeled(10, 330, GetButtonID(3, 9), 1060698); // Clear Ban List AddButtonLabeled(210, 130, GetButtonID(3, 12), 1060695, isOwner); // Change to Private AddHtmlLocalized(245, 150, 240, 20, 1060694, SelectedColor, false, false); // Change to Public } else { AddButtonLabeled(10, 310, GetButtonID(3, 10), 1060699); // View Access List AddButtonLabeled(10, 330, GetButtonID(3, 11), 1060700); // Clear Access List AddHtmlLocalized(245, 130, 240, 20, 1060695, SelectedColor, false, false); // Change to Private AddButtonLabeled(210, 150, GetButtonID(3, 13), 1060694, isOwner); // Change to Public } break; } case HouseGumpPageAOS.Storage: { AddHtmlLocalized(10, 130, 400, 20, 1060682, LabelColor, false, false); //
HOUSE STORAGE SUMMARY
// This is not as OSI; storage changes not yet implemented /*AddHtmlLocalized( 10, 170, 275, 20, 1011237, LabelColor, false, false ); // Number of locked down items: AddLabel( 310, 170, LabelHue, m_House.LockDownCount.ToString() ); AddHtmlLocalized( 10, 190, 275, 20, 1011238, LabelColor, false, false ); // Maximum locked down items: AddLabel( 310, 190, LabelHue, m_House.MaxLockDowns.ToString() ); AddHtmlLocalized( 10, 210, 275, 20, 1011239, LabelColor, false, false ); // Number of secure containers: AddLabel( 310, 210, LabelHue, m_House.SecureCount.ToString() ); AddHtmlLocalized( 10, 230, 275, 20, 1011240, LabelColor, false, false ); // Maximum number of secure containers: AddLabel( 310, 230, LabelHue, m_House.MaxSecures.ToString() );*/ int fromSecures, fromVendors, fromLockdowns, fromMovingCrate; int maxSecures = house.GetAosMaxSecures(); int curSecures = house.GetAosCurSecures(out fromSecures, out fromVendors, out fromLockdowns, out fromMovingCrate); int maxLockdowns = house.GetAosMaxLockdowns(); int curLockdowns = house.GetAosCurLockdowns(); int bonusStorage = (int)((house.BonusStorageScalar * 100) - 100); if (bonusStorage > 0) { AddHtmlLocalized(10, 150, 300, 20, 1072519, LabelColor, false, false); // Increased Storage AddLabel(310, 150, LabelHue, String.Format("{0}%", bonusStorage)); } AddHtmlLocalized(10, 170, 300, 20, 1060683, LabelColor, false, false); // Maximum Secure Storage AddLabel(310, 170, LabelHue, maxSecures.ToString()); AddHtmlLocalized(10, 190, 300, 20, 1060685, LabelColor, false, false); // Used by Moving Crate AddLabel(310, 190, LabelHue, fromMovingCrate.ToString()); AddHtmlLocalized(10, 210, 300, 20, 1060686, LabelColor, false, false); // Used by Lockdowns AddLabel(310, 210, LabelHue, fromLockdowns.ToString()); if (BaseHouse.NewVendorSystem) { AddHtmlLocalized(10, 230, 300, 20, 1060688, LabelColor, false, false); // Used by Secure Containers AddLabel(310, 230, LabelHue, fromSecures.ToString()); AddHtmlLocalized(10, 250, 300, 20, 1060689, LabelColor, false, false); // Available Storage AddLabel(310, 250, LabelHue, Math.Max(maxSecures - curSecures, 0).ToString()); AddHtmlLocalized(10, 290, 300, 20, 1060690, LabelColor, false, false); // Maximum Lockdowns AddLabel(310, 290, LabelHue, maxLockdowns.ToString()); AddHtmlLocalized(10, 310, 300, 20, 1060691, LabelColor, false, false); // Available Lockdowns AddLabel(310, 310, LabelHue, Math.Max(maxLockdowns - curLockdowns, 0).ToString()); int maxVendors = house.GetNewVendorSystemMaxVendors(); int vendors = house.PlayerVendors.Count + house.VendorRentalContracts.Count; AddHtmlLocalized(10, 350, 300, 20, 1062391, LabelColor, false, false); // Vendor Count AddLabel(310, 350, LabelHue, vendors.ToString() + " / " + maxVendors.ToString()); } else { AddHtmlLocalized(10, 230, 300, 20, 1060687, LabelColor, false, false); // Used by Vendors AddLabel(310, 230, LabelHue, fromVendors.ToString()); AddHtmlLocalized(10, 250, 300, 20, 1060688, LabelColor, false, false); // Used by Secure Containers AddLabel(310, 250, LabelHue, fromSecures.ToString()); AddHtmlLocalized(10, 270, 300, 20, 1060689, LabelColor, false, false); // Available Storage AddLabel(310, 270, LabelHue, Math.Max(maxSecures - curSecures, 0).ToString()); AddHtmlLocalized(10, 330, 300, 20, 1060690, LabelColor, false, false); // Maximum Lockdowns AddLabel(310, 330, LabelHue, maxLockdowns.ToString()); AddHtmlLocalized(10, 350, 300, 20, 1060691, LabelColor, false, false); // Available Lockdowns AddLabel(310, 350, LabelHue, Math.Max(maxLockdowns - curLockdowns, 0).ToString()); } break; } case HouseGumpPageAOS.Customize: { bool isCustomizable = isOwner && (house is HouseFoundation); AddButtonLabeled(10, 120, GetButtonID(5, 0), 1060759, isOwner && !isCustomizable && (house.ConvertEntry != null)); // Convert Into Customizable House AddButtonLabeled(10, 140, GetButtonID(5, 8), 1060004, isOwner && house is BaseContestHouse || house is Castle || house is Keep); AddButtonLabeled(10, 160, GetButtonID(5, 1), 1060765, isOwner && isCustomizable); // Customize This House AddButtonLabeled(10, 180, GetButtonID(5, 2), 1060760, isOwner && house.MovingCrate != null); // Relocate Moving Crate AddButtonLabeled(10, 210, GetButtonID(5, 3), 1060761, isOwner && house.Public); // Change House Sign AddButtonLabeled(10, 230, GetButtonID(5, 4), 1060762, isOwner && isCustomizable); // Change House Sign Hanger AddButtonLabeled(10, 250, GetButtonID(5, 5), 1060763, isOwner && isCustomizable && (((HouseFoundation)house).Signpost != null)); // Change Signpost AddButtonLabeled(10, 280, GetButtonID(5, 6), 1062004, isOwner && isCustomizable); // Change Foundation Style AddButtonLabeled(10, 310, GetButtonID(5, 7), 1060764, isCoOwner); // Rename House break; } case HouseGumpPageAOS.Ownership: { AddButtonLabeled(10, 130, GetButtonID(6, 0), 1061794, isOwner && house.MovingCrate == null && house.InternalizedVendors.Count == 0); // Demolish House AddButtonLabeled(10, 150, GetButtonID(6, 1), 1061797, isOwner); // Trade House AddButtonLabeled(10, 190, GetButtonID(6, 2), 1061798, false); // Make Primary break; } case HouseGumpPageAOS.ChangeHanger: { for (int i = 0; i < m_HangerNumbers.Length; ++i) { int x = 50 + ((i % 3) * 100); int y = 180 + ((i / 3) * 80); AddButton(x, y, 4005, 4007, GetButtonID(7, i), GumpButtonType.Reply, 0); AddItem(x + 20, y, m_HangerNumbers[i]); } break; } case HouseGumpPageAOS.ChangeFoundation: { int index = 0; for (int i = 0; i < 2; ++i) { AddPage(i + 1); if (i == 0) AddButton(10, 360, 4005, 4007, 0, GumpButtonType.Page, ((i + 1) % 2) + 1); else AddButton(10, 360, 4014, 4016, 0, GumpButtonType.Page, ((i + 1) % 2) + 1); for (int j = 0; j < 15 && index < m_FoundationNumbers.Length; ++j) { int x = 15 + ((j % 5) * 80); int y = 150 + ((j / 5) * 80); AddButton(x, y, 4005, 4007, GetButtonID(8, index), GumpButtonType.Reply, 0); AddItem(x + 25, y, m_FoundationNumbers[index++]); } } break; } case HouseGumpPageAOS.ChangeSign: { int index = 0; if (_HouseSigns.Count == 0) { // Add standard signs for (int i = 0; i < 54; ++i) { _HouseSigns.Add(2980 + (i * 2)); } // Add library and beekeeper signs ( ML ) _HouseSigns.Add(2966); _HouseSigns.Add(3140); } int signsPerPage = Core.ML ? 24 : 18; int totalSigns = Core.ML ? 56 : 54; int pages = (int)Math.Ceiling((double)totalSigns / signsPerPage); for (int i = 0; i < pages; ++i) { AddPage(i + 1); AddButton(10, 360, 4005, 4007, 0, GumpButtonType.Page, ((i + 1) % pages) + 1); for (int j = 0; j < signsPerPage && totalSigns - (signsPerPage * i) - j > 0; ++j) { int x = 30 + ((j % 6) * 60); int y = 130 + ((j / 6) * 60); AddButton(x, y, 4005, 4007, GetButtonID(9, index), GumpButtonType.Reply, 0); AddItem(x + 20, y, _HouseSigns[index++]); } } break; } case HouseGumpPageAOS.RemoveCoOwner: { AddHtmlLocalized(10, 120, 400, 20, 1060730, LabelColor, false, false); //
CO-OWNER LIST
AddList(house.CoOwners, 10, false, true, from); break; } case HouseGumpPageAOS.ListCoOwner: { AddHtmlLocalized(10, 120, 400, 20, 1060730, LabelColor, false, false); //
CO-OWNER LIST
AddList(house.CoOwners, -1, false, true, from); break; } case HouseGumpPageAOS.RemoveFriend: { AddHtmlLocalized(10, 120, 400, 20, 1060731, LabelColor, false, false); //
FRIENDS LIST
AddList(house.Friends, 11, false, true, from); break; } case HouseGumpPageAOS.ListFriend: { AddHtmlLocalized(10, 120, 400, 20, 1060731, LabelColor, false, false); //
FRIENDS LIST
AddList(house.Friends, -1, false, true, from); break; } case HouseGumpPageAOS.RemoveBan: { AddHtmlLocalized(10, 120, 400, 20, 1060733, LabelColor, false, false); //
BAN LIST
AddList(house.Bans, 12, true, true, from); break; } case HouseGumpPageAOS.ListBan: { AddHtmlLocalized(10, 120, 400, 20, 1060733, LabelColor, false, false); //
BAN LIST
AddList(house.Bans, -1, true, true, from); break; } case HouseGumpPageAOS.RemoveAccess: { AddHtmlLocalized(10, 120, 400, 20, 1060732, LabelColor, false, false); //
ACCESS LIST
AddList(house.Access, 13, false, true, from); break; } case HouseGumpPageAOS.ListAccess: { AddHtmlLocalized(10, 120, 400, 20, 1060732, LabelColor, false, false); //
ACCESS LIST
AddList(house.Access, -1, false, true, from); break; } case HouseGumpPageAOS.ChangePost: { int index = 0; for (int i = 0; i < 3; ++i) { AddPage(i + 1); AddButton(10, 360, 4005, 4007, 0, GumpButtonType.Page, ((i + 1) % 3) + 1); for (int j = 0; j < 16 && index < m_PostNumbers.Length; ++j) { int x = 15 + ((j % 8) * 50); int y = 130 + ((j / 8) * 110); AddButton(x, y, 4005, 4007, GetButtonID(14, index), GumpButtonType.Reply, 0); AddItem(x + 10, y, m_PostNumbers[index++]); } } break; } } } public static void PublicPrivateNotice_Callback(Mobile from, object state) { BaseHouse house = (BaseHouse)state; if (!house.Deleted) from.SendGump(new HouseGumpAOS(HouseGumpPageAOS.Security, from, house)); } public static void CustomizeNotice_Callback(Mobile from, object state) { BaseHouse house = (BaseHouse)state; if (!house.Deleted) from.SendGump(new HouseGumpAOS(HouseGumpPageAOS.Customize, from, house)); } public static void ClearCoOwners_Callback(Mobile from, bool okay, object state) { BaseHouse house = (BaseHouse)state; if (house.Deleted) return; if (okay && house.IsOwner(from)) { if (house.CoOwners != null) { List list = new List(house.CoOwners); foreach (var m in list) { house.RemoveCoOwner(from, m, false); } ColUtility.Free(list); } from.SendLocalizedMessage(501333); // All co-owners have been removed from this house. } from.SendGump(new HouseGumpAOS(HouseGumpPageAOS.Security, from, house)); } public static void ClearFriends_Callback(Mobile from, bool okay, object state) { BaseHouse house = (BaseHouse)state; if (house.Deleted) return; if (okay && house.IsCoOwner(from)) { if (house.Friends != null) { List list = new List(house.Friends); foreach (var m in list) { house.RemoveFriend(from, m, false); } ColUtility.Free(list); } from.SendLocalizedMessage(501332); // All friends have been removed from this house. } from.SendGump(new HouseGumpAOS(HouseGumpPageAOS.Security, from, house)); } public static void ClearBans_Callback(Mobile from, bool okay, object state) { BaseHouse house = (BaseHouse)state; if (house.Deleted) return; if (okay && house.IsFriend(from)) { if (house.Bans != null) house.Bans.Clear(); from.SendLocalizedMessage(1060754); // All bans for this house have been lifted. } from.SendGump(new HouseGumpAOS(HouseGumpPageAOS.Security, from, house)); } public static void ClearAccess_Callback(Mobile from, bool okay, object state) { BaseHouse house = (BaseHouse)state; if (house.Deleted) return; if (okay && house.IsFriend(from)) { ArrayList list = new ArrayList(house.Access); if (house.Access != null) house.Access.Clear(); for (int i = 0; i < list.Count; ++i) { Mobile m = (Mobile)list[i]; if (!house.HasAccess(m) && house.IsInside(m)) { m.Location = house.BanLocation; m.SendLocalizedMessage(1060734); // Your access to this house has been revoked. } } from.SendLocalizedMessage(1061843); // This house's Access List has been cleared. } from.SendGump(new HouseGumpAOS(HouseGumpPageAOS.Security, from, house)); } public static void ConvertHouse_Callback(Mobile from, bool okay, object state) { BaseHouse house = (BaseHouse)state; if (house.Deleted) return; if (okay && house.IsOwner(from) && !house.HasRentedVendors) { HousePlacementEntry e = house.ConvertEntry; if (e != null) { int cost = e.Cost - house.Price; if (cost > 0) { if (Banker.Withdraw(from, cost)) { from.SendLocalizedMessage(1060398, cost.ToString()); // ~1_AMOUNT~ gold has been withdrawn from your bank box. } else { from.SendLocalizedMessage(1061624); // You do not have enough funds in your bank to cover the difference between your old house and your new one. return; } } else if (cost < 0) { if (Banker.Deposit(from, -cost)) from.SendLocalizedMessage(1060397, (-cost).ToString()); // ~1_AMOUNT~ gold has been deposited into your bank box. else return; } BaseHouse newHouse = e.ConstructHouse(from); if (newHouse != null) { newHouse.Price = e.Cost; house.MoveAllToCrate(); newHouse.Friends = new List(house.Friends); newHouse.CoOwners = new List(house.CoOwners); newHouse.Bans = new List(house.Bans); newHouse.Access = new List(house.Access); newHouse.BuiltOn = house.BuiltOn; newHouse.LastTraded = house.LastTraded; newHouse.Public = house.Public; newHouse.VendorInventories.AddRange(house.VendorInventories); house.VendorInventories.Clear(); foreach (VendorInventory inventory in newHouse.VendorInventories) { inventory.House = newHouse; } newHouse.InternalizedVendors.AddRange(house.InternalizedVendors); house.InternalizedVendors.Clear(); foreach (Mobile mobile in newHouse.InternalizedVendors) { if (mobile is PlayerVendor) ((PlayerVendor)mobile).House = newHouse; else if (mobile is PlayerBarkeeper) ((PlayerBarkeeper)mobile).House = newHouse; } if (house.MovingCrate != null) { newHouse.MovingCrate = house.MovingCrate; newHouse.MovingCrate.House = newHouse; house.MovingCrate = null; } List items = house.GetItems(); List mobiles = house.GetMobiles(); newHouse.MoveToWorld(new Point3D(house.X + house.ConvertOffsetX, house.Y + house.ConvertOffsetY, house.Z + house.ConvertOffsetZ), house.Map); house.Delete(); foreach (Item item in items) { item.Location = newHouse.BanLocation; } foreach (Mobile mobile in mobiles) { mobile.Location = newHouse.BanLocation; } /* You have successfully replaced your original house with a new house. * The value of the replaced house has been deposited into your bank box. * All of the items in your original house have been relocated to a Moving Crate in the new house. * Any deed-based house add-ons have been converted back into deeds. * Vendors and barkeeps in the house, if any, have been stored in the Moving Crate as well. * Use the Get Vendor context-sensitive menu option on your character to retrieve them. * These containers can be used to re-create the vendor in a new location. * Any barkeepers have been converted into deeds. */ from.SendGump(new NoticeGump(1060637, 30720, 1060012, 32512, 420, 280, null, null)); return; } } } from.SendGump(new HouseGumpAOS(HouseGumpPageAOS.Security, from, house)); } public static void SwapHouse_Callback(Mobile from, bool okay, object state) { var house = state as BaseHouse; if (okay && house != null) { from.MoveToWorld(house.BanLocation, house.Map); HousePlacementEntry[] entries = null; if ((house is BaseContestHouse && ((BaseContestHouse)house).HouseType == ContestHouseType.Keep) || house is Keep) { entries = HousePlacementEntry.HousesEJ.Where(e => e.MultiID != house.ItemID && (e.MultiID == 0x007C || e.MultiID == 0x147E || e.MultiID >= 0x1484)).ToArray(); } else if ((house is BaseContestHouse && ((BaseContestHouse)house).HouseType == ContestHouseType.Castle) || house is Castle) { entries = HousePlacementEntry.HousesEJ.Where(e => e.MultiID != house.ItemID && (e.MultiID == 0x007E || (e.MultiID >= 0x147F && e.MultiID <= 0x1483))).ToArray(); } if (entries != null) { BaseGump.SendGump(new HouseSwapGump(from, house, entries)); } } } public override void OnResponse(NetState sender, RelayInfo info) { if (m_House.Deleted) return; Mobile from = sender.Mobile; bool isCombatRestricted = m_House.IsCombatRestricted(from); bool isOwner = m_House.IsOwner(from); bool isCoOwner = isOwner || m_House.IsCoOwner(from); bool isFriend = isCoOwner || m_House.IsFriend(from); if (isCombatRestricted) isCoOwner = isFriend = false; if (!from.CheckAlive()) return; Item sign = m_House.Sign; if (sign == null || from.Map != sign.Map || !from.InRange(sign.GetWorldLocation(), 18)) return; HouseFoundation foundation = m_House as HouseFoundation; bool isCustomizable = (foundation != null); int val = info.ButtonID - 1; if (val < 0) return; int type = val % 15; int index = val / 15; if (m_Page == HouseGumpPageAOS.Vendors) { if (index >= 0 && index < m_List.Count) { PlayerVendor vendor = (PlayerVendor)m_List[index]; if (!vendor.CanInteractWith(from, false)) return; if (from.Map != sign.Map || !from.InRange(sign, 5)) { from.SendLocalizedMessage(1062429); // You must be within five paces of the house sign to use this option. } else if (vendor.IsOwner(from)) { vendor.SendOwnerGump(from); } else { vendor.OpenBackpack(from); } } return; } if (!isFriend) return; switch ( type ) { case 0: { switch ( index ) { case 0: // Banish { if (m_House.Public) { from.SendLocalizedMessage(501325); // Target the individual to ban from this house. from.Target = new HouseBanTarget(true, m_House); } break; } case 1: // Lift Ban { if (m_House.Public) from.SendGump(new HouseGumpAOS(HouseGumpPageAOS.RemoveBan, from, m_House)); break; } case 2: // Grant Access { if (!m_House.Public) { from.SendLocalizedMessage(1060711); // Target the person you would like to grant access to. from.Target = new HouseAccessTarget(m_House); } break; } case 3: // Revoke Access { if (!m_House.Public) from.SendGump(new HouseGumpAOS(HouseGumpPageAOS.RemoveAccess, from, m_House)); break; } } break; } case 1: { HouseGumpPageAOS page; switch ( index ) { case 0: page = HouseGumpPageAOS.Information; break; case 1: page = HouseGumpPageAOS.Security; break; case 2: page = HouseGumpPageAOS.Storage; break; case 3: page = HouseGumpPageAOS.Customize; break; case 4: page = HouseGumpPageAOS.Ownership; break; default: return; } from.SendGump(new HouseGumpAOS(page, from, m_House)); break; } case 3: { switch ( index ) { case 0: // View Co-Owner List { if (isCoOwner) from.SendGump(new HouseGumpAOS(HouseGumpPageAOS.ListCoOwner, from, m_House)); break; } case 1: // Add a Co-Owner { if (isOwner) { from.SendLocalizedMessage(501328); // Target the person you wish to name a co-owner of your household. from.Target = new CoOwnerTarget(true, m_House); } break; } case 2: // Remove a Co-Owner { if (isOwner) from.SendGump(new HouseGumpAOS(HouseGumpPageAOS.RemoveCoOwner, from, m_House)); break; } case 3: // Clear Co-Owner List { if (isOwner) from.SendGump(new WarningGump(1060635, 30720, 1060736, 32512, 420, 280, new WarningGumpCallback(ClearCoOwners_Callback), m_House)); break; } case 4: // View Friends List { from.SendGump(new HouseGumpAOS(HouseGumpPageAOS.ListFriend, from, m_House)); break; } case 5: // Add a Friend { if (isCoOwner) { from.SendLocalizedMessage(501317); // Target the person you wish to name a friend of your household. from.Target = new HouseFriendTarget(true, m_House); } break; } case 6: // Remove a Friend { if (isCoOwner) from.SendGump(new HouseGumpAOS(HouseGumpPageAOS.RemoveFriend, from, m_House)); break; } case 7: // Clear Friend List { if (isCoOwner) from.SendGump(new WarningGump(1060635, 30720, 1018039, 32512, 420, 280, new WarningGumpCallback(ClearFriends_Callback), m_House)); break; } case 8: // View Ban List { from.SendGump(new HouseGumpAOS(HouseGumpPageAOS.ListBan, from, m_House)); break; } case 9: // Clear Ban List { from.SendGump(new WarningGump(1060635, 30720, 1060753, 32512, 420, 280, new WarningGumpCallback(ClearBans_Callback), m_House)); break; } case 10: // View Access List { from.SendGump(new HouseGumpAOS(HouseGumpPageAOS.ListAccess, from, m_House)); break; } case 11: // Clear Access List { from.SendGump(new WarningGump(1060635, 30720, 1061842, 32512, 420, 280, new WarningGumpCallback(ClearAccess_Callback), m_House)); break; } case 12: // Make Private { if (isOwner) { if (m_House.PlayerVendors.Count > 0) { // You have vendors working out of this building. It cannot be declared private until there are no vendors in place. from.SendGump(new NoticeGump(1060637, 30720, 501887, 32512, 320, 180, new NoticeGumpCallback(PublicPrivateNotice_Callback), m_House)); break; } if (m_House.VendorRentalContracts.Count > 0) { // You cannot currently take this action because you have vendor contracts locked down in your home. You must remove them first. from.SendGump(new NoticeGump(1060637, 30720, 1062351, 32512, 320, 180, new NoticeGumpCallback(PublicPrivateNotice_Callback), m_House)); break; } else if (m_House.HasActiveAuction) { // You cannot currently take this action because you have auction safes locked down in your home. You must remove them first. from.SendLocalizedMessage(1156453); break; } m_House.Public = false; m_House.ChangeLocks(from); // This house is now private. from.SendGump(new NoticeGump(1060637, 30720, 501888, 32512, 320, 180, new NoticeGumpCallback(PublicPrivateNotice_Callback), m_House)); Region r = m_House.Region; List list = r.GetMobiles(); for (int i = 0; i < list.Count; ++i) { Mobile m = (Mobile)list[i]; if (!m_House.HasAccess(m) && m_House.IsInside(m)) m.Location = m_House.BanLocation; } } break; } case 13: // Make Public { if (isOwner) { m_House.Public = true; m_House.RemoveKeys(from); m_House.RemoveLocks(); if (BaseHouse.NewVendorSystem) { // This house is now public. The owner may now place vendors and vendor rental contracts. from.SendGump(new NoticeGump(1060637, 30720, 501886, 32512, 320, 180, new NoticeGumpCallback(PublicPrivateNotice_Callback), m_House)); } else { from.SendGump(new NoticeGump(1060637, 30720, "This house is now public. Friends of the house may now have vendors working out of this building.", 0xF8C000, 320, 180, new NoticeGumpCallback(PublicPrivateNotice_Callback), m_House)); } Region r = m_House.Region; List list = r.GetMobiles(); for (int i = 0; i < list.Count; ++i) { Mobile m = (Mobile)list[i]; if (m_House.IsBanned(m) && m_House.IsInside(m)) m.Location = m_House.BanLocation; } } break; } } break; } case 5: { switch ( index ) { case 0: // Convert Into Customizable House { if (isOwner && !isCustomizable) { if (m_House.HasRentedVendors) { // You cannot perform this action while you still have vendors rented out in this house. from.SendGump(new NoticeGump(1060637, 30720, 1062395, 32512, 320, 180, new NoticeGumpCallback(CustomizeNotice_Callback), m_House)); } else if (m_House.HasAddonContainers) { // The house can not be customized when add-on containers such as aquariums, elven furniture containers, vanities, and boiling cauldrons // are present in the house. Please re-deed the add-on containers before customizing the house. from.SendGump(new NoticeGump(1060637, 30720, 1074863, 32512, 320, 180, new NoticeGumpCallback(CustomizeNotice_Callback), m_House)); } else if (m_House.Map == Map.TerMur && !Server.Engines.Points.PointsSystem.QueensLoyalty.IsNoble(from)) { from.SendLocalizedMessage(1113714, "2000"); //You can't resize a house in Ter Mur unless you have at least ~1_MIN~ loyalty to the Gargoyle Queen. } else { HousePlacementEntry e = m_House.ConvertEntry; if (e != null) { /* You are about to turn your house into a customizable house. * You will be refunded the value of this house, and then be charged the cost of the equivalent customizable dirt lot. * All of your possessions in the house will be transported to a Moving Crate. * Deed-based house add-ons will be converted back into deeds. * Vendors and barkeeps will also be stored in the Moving Crate. * Your house will be leveled to its foundation, and you will be able to build new walls, windows, doors, and stairs. * Are you sure you wish to continue? */ from.SendGump(new WarningGump(1060635, 30720, 1060013, 32512, 420, 280, new WarningGumpCallback(ConvertHouse_Callback), m_House)); } } } break; } case 1: // Customize This House { if (isOwner && isCustomizable) { if (m_House.HasRentedVendors) { // You cannot perform this action while you still have vendors rented out in this house. from.SendGump(new NoticeGump(1060637, 30720, 1062395, 32512, 320, 180, new NoticeGumpCallback(CustomizeNotice_Callback), m_House)); } #region Mondain's Legacy else if (m_House.HasAddonContainers) { // The house can not be customized when add-on containers such as aquariums, elven furniture containers, vanities, and boiling cauldrons // are present in the house. Please re-deed the add-on containers before customizing the house. from.SendGump(new NoticeGump(1060637, 30720, 1074863, 32512, 320, 180, new NoticeGumpCallback(CustomizeNotice_Callback), m_House)); } #endregion else if (m_House.HasActiveAuction) { from.SendLocalizedMessage(1156453); // You cannot currently take this action because you have auction safes locked down in your home. You must remove them first. return; } else { foundation.BeginCustomize(from); } } break; } case 2: // Relocate Moving Crate { MovingCrate crate = m_House.MovingCrate; if (isOwner && crate != null) { if (!m_House.IsInside(from)) { from.SendLocalizedMessage(502092); // You must be in your house to do } else { crate.MoveToWorld(from.Location, from.Map); crate.RestartTimer(); } } break; } case 3: // Change House Sign { if (isOwner && m_House.Public) from.SendGump(new HouseGumpAOS(HouseGumpPageAOS.ChangeSign, from, m_House)); break; } case 4: // Change House Sign Hanger { if (isOwner && isCustomizable) from.SendGump(new HouseGumpAOS(HouseGumpPageAOS.ChangeHanger, from, m_House)); break; } case 5: // Change Signpost { if (isOwner && isCustomizable && foundation.Signpost != null) from.SendGump(new HouseGumpAOS(HouseGumpPageAOS.ChangePost, from, m_House)); break; } case 6: // Change Foundation Style { if (isOwner && isCustomizable) from.SendGump(new HouseGumpAOS(HouseGumpPageAOS.ChangeFoundation, from, m_House)); break; } case 7: // Rename House { if (isCoOwner) { from.Prompt = new RenamePrompt(m_House); from.SendLocalizedMessage(501302); // What dost thou wish the sign to say? } break; } case 8: // Securely Replace This House { if (isOwner && (m_House is BaseContestHouse || m_House is Keep || m_House is Castle)) { if (m_House.HasRentedVendors) { // You cannot perform this action while you still have vendors rented out in this house. from.SendGump(new NoticeGump(1060637, 30720, 1062395, 32512, 320, 180, new NoticeGumpCallback(CustomizeNotice_Callback), m_House)); } else if (m_House.HasAddonContainers) { /*The house cannot be swapped when certain special house add-ons including aquariums, raised garden beds, house_only items, goza mats, and special * temporary add-ons are present in the house. Please re-deed or remove the special add-ons before swapping the house.*/ from.SendGump(new NoticeGump(1060637, 30720, 1158659, 32512, 320, 180, new NoticeGumpCallback(CustomizeNotice_Callback), m_House)); } else { /*You are about to swap your house into another classic house. You will be refunded or charged the value of this house. All your possessions * in the house will be transported to a Moving Crate. Deed-based house add-ons will be converted back into deeds. Vendors and barkeeps will * also be stored in the Moving Crate. Are you sure you wish to continue? */ from.SendGump(new WarningGump(1060635, 30720, 1158658, 32512, 420, 280, new WarningGumpCallback(SwapHouse_Callback), m_House)); } } break; } } break; } case 6: { switch ( index ) { case 0: // Demolish { if (isOwner && m_House.MovingCrate == null && m_House.InternalizedVendors.Count == 0) { if (!Guilds.Guild.NewGuildSystem && m_House.FindGuildstone() != null) { from.SendLocalizedMessage(501389); // You cannot redeed a house with a guildstone inside. } else if (Core.ML && from.AccessLevel < AccessLevel.GameMaster && DateTime.UtcNow <= m_House.BuiltOn.AddHours(1)) { from.SendLocalizedMessage(1080178); // You must wait one hour between each house demolition. } else { from.CloseGump(typeof(HouseDemolishGump)); from.SendGump(new HouseDemolishGump(from, m_House)); } } break; } case 1: // Trade House { if (isOwner) { if (BaseHouse.NewVendorSystem && m_House.HasPersonalVendors) { from.SendLocalizedMessage(1062467); // You cannot trade this house while you still have personal vendors inside. } else if (m_House.HasActiveAuction) { from.SendLocalizedMessage(1156453); // You cannot currently take this action because you have auction safes locked down in your home. You must remove them first. } else if (m_House.DecayLevel == DecayLevel.DemolitionPending) { from.SendLocalizedMessage(1005321); // This house has been marked for demolition, and it cannot be transferred. } else { from.SendLocalizedMessage(501309); // Target the person to whom you wish to give this house. from.Target = new HouseOwnerTarget(m_House); } } break; } case 2: // Make Primary break; } break; } case 7: { if (isOwner && isCustomizable && index >= 0 && index < m_HangerNumbers.Length) { Item hanger = foundation.SignHanger; if (hanger != null) hanger.ItemID = m_HangerNumbers[index]; from.SendGump(new HouseGumpAOS(HouseGumpPageAOS.Customize, from, m_House)); } break; } case 8: { if (isOwner && isCustomizable) { FoundationType newType; if (Core.ML && index >= 5) { switch( index ) { case 5: newType = FoundationType.ElvenGrey; break; case 6: newType = FoundationType.ElvenNatural; break; case 7: newType = FoundationType.SimpleMarble; break; case 8: newType = FoundationType.PlainMarble; break; case 9: newType = FoundationType.OrnateMarble; break; case 10: newType = FoundationType.Crystal; break; case 11: newType = FoundationType.Shadow; break; case 12: newType = FoundationType.GargishGreenMarble; break; case 13: newType = FoundationType.GargishTwoToneStone; break; case 14: newType = FoundationType.Gothic; break; case 15: newType = FoundationType.Brick1; break; case 16: newType = FoundationType.Brick2; break; default: return; } } else { switch( index ) { case 0: newType = FoundationType.DarkWood; break; case 1: newType = FoundationType.LightWood; break; case 2: newType = FoundationType.Dungeon; break; case 3: newType = FoundationType.Brick; break; case 4: newType = FoundationType.Stone; break; default: return; } } foundation.Type = newType; DesignState state = foundation.BackupState; HouseFoundation.ApplyFoundation(newType, state.Components); state.OnRevised(); state = foundation.DesignState; HouseFoundation.ApplyFoundation(newType, state.Components); state.OnRevised(); state = foundation.CurrentState; HouseFoundation.ApplyFoundation(newType, state.Components); state.OnRevised(); foundation.Delta(ItemDelta.Update); from.SendGump(new HouseGumpAOS(HouseGumpPageAOS.Customize, from, m_House)); } break; } case 9: { if (isOwner && m_House.Public && index >= 0 && index < _HouseSigns.Count) { m_House.ChangeSignType(_HouseSigns[index]); from.SendGump(new HouseGumpAOS(HouseGumpPageAOS.Customize, from, m_House)); } break; } case 10: { if (isOwner && m_List != null && index >= 0 && index < m_List.Count) { m_House.RemoveCoOwner(from, (Mobile)m_List[index]); if (m_House.CoOwners.Count > 0) from.SendGump(new HouseGumpAOS(HouseGumpPageAOS.RemoveCoOwner, from, m_House)); else from.SendGump(new HouseGumpAOS(HouseGumpPageAOS.Security, from, m_House)); } break; } case 11: { if (isCoOwner && m_List != null && index >= 0 && index < m_List.Count) { m_House.RemoveFriend(from, (Mobile)m_List[index]); if (m_House.Friends.Count > 0) from.SendGump(new HouseGumpAOS(HouseGumpPageAOS.RemoveFriend, from, m_House)); else from.SendGump(new HouseGumpAOS(HouseGumpPageAOS.Security, from, m_House)); } break; } case 12: { if (m_List != null && index >= 0 && index < m_List.Count) { m_House.RemoveBan(from, (Mobile)m_List[index]); if (m_House.Bans.Count > 0) from.SendGump(new HouseGumpAOS(HouseGumpPageAOS.RemoveBan, from, m_House)); else from.SendGump(new HouseGumpAOS(HouseGumpPageAOS.Security, from, m_House)); } break; } case 13: { if (m_List != null && index >= 0 && index < m_List.Count) { m_House.RemoveAccess(from, (Mobile)m_List[index]); if (m_House.Access.Count > 0) from.SendGump(new HouseGumpAOS(HouseGumpPageAOS.RemoveAccess, from, m_House)); else from.SendGump(new HouseGumpAOS(HouseGumpPageAOS.Security, from, m_House)); } break; } case 14: { if (isOwner && isCustomizable && index >= 0 && index < m_PostNumbers.Length) { foundation.SignpostGraphic = m_PostNumbers[index]; foundation.CheckSignpost(); from.SendGump(new HouseGumpAOS(HouseGumpPageAOS.Customize, from, m_House)); } break; } } } private ArrayList Wrap(string value) { if (value == null || (value = value.Trim()).Length <= 0) return null; string[] values = value.Split(' '); ArrayList list = new ArrayList(); string current = ""; for (int i = 0; i < values.Length; ++i) { string val = values[i]; string v = current.Length == 0 ? val : current + ' ' + val; if (v.Length < 10) { current = v; } else if (v.Length == 10) { list.Add(v); if (list.Count == 6) return list; current = ""; } else if (val.Length <= 10) { list.Add(current); if (list.Count == 6) return list; current = val; } else { while (v.Length >= 10) { list.Add(v.Substring(0, 10)); if (list.Count == 6) return list; v = v.Substring(10); } current = v; } } if (current.Length > 0) list.Add(current); return list; } } }