Exemple #1
0
 private void SearchForHouse()
 {
     foreach (TownHouse house in TownHouse.AllTownHouses.Where(house => house.ForSaleSign == this))
     {
         c_House = house;
     }
 }
Exemple #2
0
        public virtual void ClearHouse()
        {
            UnconvertDoors();
            ClearDemolishTimer();
            ClearRentTimer();
            PackUpItems();
            RecreateItems();
            c_House = null;
            Visible = true;

            if (c_RentToOwn)
            {
                c_RentByTime = c_OriginalRentTime;
            }
        }
Exemple #3
0
        public void Purchase(Mobile m, bool sellitems)
        {
            try
            {
                if (Owned)
                {
                    m.SendMessage("Someone already owns this house!");
                    return;
                }

                if (!PriceReady)
                {
                    m.SendMessage("The setup for this house is not yet complete.");
                    return;
                }

                int price = c_Price + (sellitems ? c_ItemsPrice : 0);

                if (c_Free)
                {
                    price = 0;
                }

                if (m.AccessLevel == AccessLevel.Player && !Server.Mobiles.Banker.Withdraw(m, price))
                {
                    m.SendMessage("You cannot afford this house.");
                    return;
                }

                if (m.AccessLevel == AccessLevel.Player)
                {
                    m.SendLocalizedMessage(1060398, price.ToString()); // ~1_AMOUNT~ gold has been withdrawn from your bank box.
                }
                Visible = false;

                int minX = ((Rectangle2D)c_Blocks[0]).Start.X;
                int minY = ((Rectangle2D)c_Blocks[0]).Start.Y;
                int maxX = ((Rectangle2D)c_Blocks[0]).End.X;
                int maxY = ((Rectangle2D)c_Blocks[0]).End.Y;

                foreach (Rectangle2D rect in c_Blocks)
                {
                    if (rect.Start.X < minX)
                    {
                        minX = rect.Start.X;
                    }
                    if (rect.Start.Y < minY)
                    {
                        minY = rect.Start.Y;
                    }
                    if (rect.End.X > maxX)
                    {
                        maxX = rect.End.X;
                    }
                    if (rect.End.Y > maxY)
                    {
                        maxY = rect.End.Y;
                    }
                }

                c_House = new TownHouse(m, this, c_Locks, c_Secures);

                c_House.Components.Resize(maxX - minX, maxY - minY);
                c_House.Components.Add(0x520, c_House.Components.Width - 1, c_House.Components.Height - 1, -5);

                c_House.Location          = new Point3D(minX, minY, Map.GetAverageZ(minX, minY));
                c_House.Map               = Map;
                c_House.Region.GoLocation = c_BanLoc;
                c_House.Sign.Location     = c_SignLoc;
                c_House.Hanger            = new Item(0xB98);
                c_House.Hanger.Location   = c_SignLoc;
                c_House.Hanger.Map        = Map;
                c_House.Hanger.Movable    = false;

                c_House.Price = (RentByTime == TimeSpan.FromDays(0) ? c_Price : 1);

                RUOVersion.UpdateRegion(this);

                if (c_House.Price == 0)
                {
                    c_House.Price = 1;
                }

                if (c_RentByTime != TimeSpan.Zero)
                {
                    BeginRentTimer(c_RentByTime);
                }

                c_RTOPayments = 1;

                HideOtherSigns();

                c_DecoreItemInfos = new ArrayList();

                ConvertItems(sellitems);
            }
            catch (Exception e)
            {
                Errors.Report(String.Format("An error occurred during home purchasing.  More information available on the console."));
                Console.WriteLine(e.Message);
                Console.WriteLine(e.Source);
                Console.WriteLine(e.StackTrace);
            }
        }
Exemple #4
0
        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);

            int version = reader.ReadInt();

            if (version >= 12)
            {
                c_Free = reader.ReadBool();
            }

            if (version >= 11)
            {
                c_Murderers = (Intu)reader.ReadInt();
            }

            if (version >= 10)
            {
                c_LeaveItems = reader.ReadBool();
            }

            if (version >= 9)
            {
                c_RentToOwn        = reader.ReadBool();
                c_OriginalRentTime = reader.ReadTimeSpan();
                c_RTOPayments      = reader.ReadInt();
            }

            c_PreviewItems = new ArrayList();
            if (version >= 7)
            {
                c_PreviewItems = reader.ReadItemList();
            }

            if (version >= 6)
            {
                c_ItemsPrice = reader.ReadInt();
                c_KeepItems  = reader.ReadBool();
            }

            c_DecoreItemInfos = new ArrayList();
            if (version >= 5)
            {
                int            decorecount = reader.ReadInt();
                DecoreItemInfo info;
                for (int i = 0; i < decorecount; ++i)
                {
                    info = new DecoreItemInfo();
                    info.Load(reader);
                    c_DecoreItemInfos.Add(info);
                }

                c_Relock = reader.ReadBool();
            }

            if (version >= 4)
            {
                c_RecurRent     = reader.ReadBool();
                c_RentByTime    = reader.ReadTimeSpan();
                c_RentTime      = reader.ReadDateTime();
                c_DemolishTime  = reader.ReadDateTime();
                c_YoungOnly     = reader.ReadBool();
                c_MinTotalSkill = reader.ReadInt();
                c_MaxTotalSkill = reader.ReadInt();
            }

            if (version >= 3)
            {
                c_MinZ = reader.ReadInt();
                c_MaxZ = reader.ReadInt();
            }

            if (version >= 2)
            {
                c_House = (TownHouse)reader.ReadItem();
            }

            c_Price    = reader.ReadInt();
            c_Locks    = reader.ReadInt();
            c_Secures  = reader.ReadInt();
            c_BanLoc   = reader.ReadPoint3D();
            c_SignLoc  = reader.ReadPoint3D();
            c_Skill    = reader.ReadString();
            c_SkillReq = reader.ReadDouble();

            c_Blocks = new ArrayList();
            int count = reader.ReadInt();

            for (int i = 0; i < count; ++i)
            {
                c_Blocks.Add(reader.ReadRect2D());
            }

            if (c_RentTime > DateTime.Now)
            {
                BeginRentTimer(c_RentTime - DateTime.Now);
            }

            Timer.DelayCall(TimeSpan.Zero, new TimerCallback(StartTimers));

            ClearPreview();

            s_TownHouseSigns.Add(this);
        }
        public virtual void ClearHouse()
        {
            UnconvertDoors();
            ClearDemolishTimer();
            ClearRentTimer();
            PackUpItems();
            RecreateItems();
            c_House = null;
            Visible = true;

            if (c_RentToOwn)
            {
                c_RentByTime = c_OriginalRentTime;
            }
        }
        public void Purchase(Mobile m, bool sellitems = false)
        {
            try
            {
                if (Owned)
                {
                    m.SendMessage("Someone already owns this house!");
                    return;
                }

                if (!PriceReady)
                {
                    m.SendMessage("The setup for this house is not yet complete.");
                    return;
                }

                int price = c_Price + (sellitems ? c_ItemsPrice : 0);

                if (c_Free)
                {
                    price = 0;
                }

                if (m.AccessLevel == AccessLevel.Player && !Banker.Withdraw(m, price))
                {
                    m.SendMessage("You cannot afford this house.");
                    return;
                }

                if (m.AccessLevel == AccessLevel.Player)
                {
                    m.SendLocalizedMessage(1060398, price.ToString());
                    // ~1_AMOUNT~ gold has been withdrawn from your bank box.
                }

                Visible = false;

                int minX = c_Blocks[0].Start.X;
                int minY = c_Blocks[0].Start.Y;
                int maxX = c_Blocks[0].End.X;
                int maxY = c_Blocks[0].End.Y;

                foreach (Rectangle2D rect in c_Blocks)
                {
                    if (rect.Start.X < minX)
                    {
                        minX = rect.Start.X;
                    }
                    if (rect.Start.Y < minY)
                    {
                        minY = rect.Start.Y;
                    }
                    if (rect.End.X > maxX)
                    {
                        maxX = rect.End.X;
                    }
                    if (rect.End.Y > maxY)
                    {
                        maxY = rect.End.Y;
                    }
                }

                c_House = new TownHouse(m, this, c_Locks, c_Secures);

                c_House.Components.Resize(maxX - minX, maxY - minY);
                c_House.Components.Add(0x520, c_House.Components.Width - 1, c_House.Components.Height - 1, -5);

                c_House.Location = new Point3D(minX, minY, Map.GetAverageZ(minX, minY));
                c_House.Map = Map;
                c_House.Region.GoLocation = c_BanLoc;
                c_House.Sign.Location = c_SignLoc;
                c_House.Hanger = new Item(0xB98) {Location = c_SignLoc, Map = Map, Movable = false};

                if (c_ForcePublic)
                {
                    c_House.Public = true;
                }

                c_House.Price = (RentByTime == TimeSpan.FromDays(0) ? c_Price : 1);

                RUOVersion.UpdateRegion(this);

                if (c_House.Price == 0)
                {
                    c_House.Price = 1;
                }

                if (c_RentByTime != TimeSpan.Zero)
                {
                    BeginRentTimer(c_RentByTime);
                }

                c_RTOPayments = 1;

                HideOtherSigns();

                c_DecoreItemInfos = new List<DecoreItemInfo>();

                ConvertItems(sellitems);
            }
            catch (Exception e)
            {
                Errors.Report(
                    String.Format(
                        "An error occurred during home purchasing.  More information available on the console."));
                Console.WriteLine(e.Message);
                Console.WriteLine(e.Source);
                Console.WriteLine(e.StackTrace);
            }
        }
 private void SearchForHouse()
 {
     foreach (TownHouse house in TownHouse.AllTownHouses.Where(house => house.ForSaleSign == this))
     {
         c_House = house;
     }
 }
        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);

            int version = reader.ReadInt();

            if (version >= 13)
            {
                c_ForcePrivate = reader.ReadBool();
                c_ForcePublic = reader.ReadBool();
                c_NoTrade = reader.ReadBool();
            }

            if (version >= 12)
            {
                c_Free = reader.ReadBool();
            }

            if (version >= 11)
            {
                c_Murderers = (Intu) reader.ReadInt();
            }

            if (version >= 10)
            {
                c_LeaveItems = reader.ReadBool();
            }

            if (version >= 9)
            {
                c_RentToOwn = reader.ReadBool();
                c_OriginalRentTime = reader.ReadTimeSpan();
                c_RTOPayments = reader.ReadInt();
            }

            c_PreviewItems = new List<Item>();
            if (version >= 7)
            {
                int previewcount = reader.ReadInt();
                for (int i = 0; i < previewcount; ++i)
                {
                    Item item = reader.ReadItem();
                    c_PreviewItems.Add(item);
                }
            }

            if (version >= 6)
            {
                c_ItemsPrice = reader.ReadInt();
                c_KeepItems = reader.ReadBool();
            }

            c_DecoreItemInfos = new List<DecoreItemInfo>();
            if (version >= 5)
            {
                int decorecount = reader.ReadInt();
                DecoreItemInfo info;
                for (int i = 0; i < decorecount; ++i)
                {
                    info = new DecoreItemInfo();
                    info.Load(reader);
                    c_DecoreItemInfos.Add(info);
                }

                c_Relock = reader.ReadBool();
            }

            if (version >= 4)
            {
                c_RecurRent = reader.ReadBool();
                c_RentByTime = reader.ReadTimeSpan();
                c_RentTime = reader.ReadDateTime();
                c_DemolishTime = reader.ReadDateTime();
                c_YoungOnly = reader.ReadBool();
                c_MinTotalSkill = reader.ReadInt();
                c_MaxTotalSkill = reader.ReadInt();
            }

            if (version >= 3)
            {
                c_MinZ = reader.ReadInt();
                c_MaxZ = reader.ReadInt();
            }

            if (version >= 2)
            {
                c_House = (TownHouse) reader.ReadItem();
            }

            c_Price = reader.ReadInt();
            c_Locks = reader.ReadInt();
            c_Secures = reader.ReadInt();
            c_BanLoc = reader.ReadPoint3D();
            c_SignLoc = reader.ReadPoint3D();
            c_Skill = reader.ReadString();
            c_SkillReq = reader.ReadDouble();

            c_Blocks = new List<Rectangle2D>();
            int count = reader.ReadInt();
            for (int i = 0; i < count; ++i)
            {
                c_Blocks.Add(reader.ReadRect2D());
            }

            if (c_RentTime > DateTime.Now)
            {
                BeginRentTimer(c_RentTime - DateTime.Now);
            }

            Timer.DelayCall(TimeSpan.Zero, StartTimers);

            ClearPreview();

            s_TownHouseSigns.Add(this);
        }
Exemple #9
0
        private static bool CheckResponse(Gump gump, Mobile m, int id)
        {
            if (m == null || !m.Player)
            {
                return(true);
            }

            TownHouse th = null;

            ArrayList list = new ArrayList();

            foreach (Item item in m.GetItemsInRange(20))
            {
                if (item is TownHouse)
                {
                    list.Add(item);
                }
            }

            foreach (TownHouse t in list)
            {
                if (t.Owner == m)
                {
                    th = t;
                    break;
                }
            }

            if (th == null || th.ForSaleSign == null)
            {
                return(true);
            }

            if (gump is HouseGumpAOS)
            {
                int val = id - 1;

                if (val < 0)
                {
                    return(true);
                }

                int type  = val % 15;
                int index = val / 15;

                if (th.ForSaleSign.ForcePublic && type == 3 && index == 12 && th.Public)
                {
                    m.SendMessage("This house cannot be private.");
                    m.SendGump(gump);
                    return(false);
                }

                if (th.ForSaleSign.ForcePrivate && type == 3 && index == 13 && !th.Public)
                {
                    m.SendMessage("This house cannot be public.");
                    m.SendGump(gump);
                    return(false);
                }

                if (th.ForSaleSign.NoTrade && type == 6 && index == 1)
                {
                    m.SendMessage("This house cannot be traded.");
                    m.SendGump(gump);
                    return(false);
                }
            }
            else if (gump is HouseGump)
            {
                if (th.ForSaleSign.ForcePublic && id == 17 && th.Public)
                {
                    m.SendMessage("This house cannot be private.");
                    m.SendGump(gump);
                    return(false);
                }

                if (th.ForSaleSign.ForcePrivate && id == 17 && !th.Public)
                {
                    m.SendMessage("This house cannot be public.");
                    m.SendGump(gump);
                    return(false);
                }

                if (th.ForSaleSign.NoTrade && id == 14)
                {
                    m.SendMessage("This house cannot be traded.");
                    m.SendGump(gump);
                    return(false);
                }
            }

            return(true);
        }
Exemple #10
0
		private void SearchForHouse()
		{
			foreach( TownHouse house in TownHouse.AllTownHouses )
				if (house.ForSaleSign == this )
					c_House = house;
		}
Exemple #11
0
        private static bool CheckResponse(Gump gump, Mobile m, int id)
        {
            if (m == null || !m.Player)
            {
                return(true);
            }

            var list = m.GetItemsInRange(20).OfType <TownHouse>().Cast <Item>().ToList();

            TownHouse th = list.Cast <TownHouse>().FirstOrDefault(t => t != null && t.Owner == m);

            if (th == null || th.ForSaleSign == null)
            {
                return(true);
            }

            if (gump is HouseGumpAOS)
            {
                int val = id - 1;

                if (val < 0)
                {
                    return(true);
                }

                int type  = val % 15;
                int index = val / 15;

                if (th.ForSaleSign.ForcePublic && type == 3 && index == 12 && th.Public)
                {
                    m.SendMessage("This house cannot be private.");
                    m.SendGump(gump);
                    return(false);
                }

                if (th.ForSaleSign.ForcePrivate && type == 3 && index == 13 && !th.Public)
                {
                    m.SendMessage("This house cannot be public.");
                    m.SendGump(gump);
                    return(false);
                }

                if (!th.ForSaleSign.NoTrade || type != 6 || index != 1)
                {
                    return(true);
                }
                m.SendMessage("This house cannot be traded.");
                m.SendGump(gump);
                return(false);
            }

            if (!(gump is HouseGump))
            {
                return(true);
            }

            if (th.ForSaleSign.ForcePublic && id == 17 && th.Public)
            {
                m.SendMessage("This house cannot be private.");
                m.SendGump(gump);
                return(false);
            }

            if (th.ForSaleSign.ForcePrivate && id == 17 && !th.Public)
            {
                m.SendMessage("This house cannot be public.");
                m.SendGump(gump);
                return(false);
            }

            if (!th.ForSaleSign.NoTrade || id != 14)
            {
                return(true);
            }
            m.SendMessage("This house cannot be traded.");
            m.SendGump(gump);
            return(false);
        }
		public void Purchase( Mobile m, bool sellitems )
		{
            try
            {
                if (Owned)
                {
                    m.SendMessage("Someone already owns this house!");
                    return;
                }

                if (!PriceReady)
                {
                    m.SendMessage("The setup for this house is not yet complete.");
                    return;
                }

                int price = c_Price + (sellitems ? c_ItemsPrice : 0);

                if (c_Free)
                    price = 0;

                if (m.AccessLevel == AccessLevel.Player && !Server.Mobiles.Banker.Withdraw(m, price))
                {
                    m.SendMessage("You cannot afford this house.");
                    return;
                }

                if (m.AccessLevel == AccessLevel.Player)
                    m.SendLocalizedMessage(1060398, price.ToString()); // ~1_AMOUNT~ gold has been withdrawn from your bank box.

                Visible = false;

                int minX = ((Rectangle2D)c_Blocks[0]).Start.X;
                int minY = ((Rectangle2D)c_Blocks[0]).Start.Y;
                int maxX = ((Rectangle2D)c_Blocks[0]).End.X;
                int maxY = ((Rectangle2D)c_Blocks[0]).End.Y;

                foreach (Rectangle2D rect in c_Blocks)
                {
                    if (rect.Start.X < minX)
                        minX = rect.Start.X;
                    if (rect.Start.Y < minY)
                        minY = rect.Start.Y;
                    if (rect.End.X > maxX)
                        maxX = rect.End.X;
                    if (rect.End.Y > maxY)
                        maxY = rect.End.Y;
                }

                c_House = new TownHouse(m, this, c_Locks, c_Secures);

                c_House.Components.Resize( maxX-minX, maxY-minY );
                c_House.Components.Add( 0x520, c_House.Components.Width-1, c_House.Components.Height-1, -5 );

                c_House.Location = new Point3D(minX, minY, Map.GetAverageZ(minX, minY));
                c_House.Map = Map;
                c_House.Region.GoLocation = c_BanLoc;
                c_House.Sign.Location = c_SignLoc;
                c_House.Hanger = new Item(0xB98);
                c_House.Hanger.Location = c_SignLoc;
                c_House.Hanger.Map = Map;
                c_House.Hanger.Movable = false;

                c_House.Price = (RentByTime == TimeSpan.FromDays(0) ? c_Price : 1);

                RUOVersion.UpdateRegion(this);

                if (c_House.Price == 0)
                    c_House.Price = 1;

                if (c_RentByTime != TimeSpan.Zero)
                    BeginRentTimer(c_RentByTime);

                c_RTOPayments = 1;

                HideOtherSigns();

                c_DecoreItemInfos = new ArrayList();

                ConvertItems(sellitems);

                //Taran: Had to add this or else doors won't be linked to key when home is claimed
                c_House.ChangeLocks(m);
                for (int i = 0; c_House.Doors != null && i < c_House.Doors.Count; ++i)
                {
                    BaseDoor door = c_House.Doors[i] as BaseDoor;

                    if (door != null && door.KeyValue == c_House.HouseKeyVal)
                        door.Locked = true;
                }
            }
            catch(Exception e)
            {
                Errors.Report(String.Format("An error occurred during home purchasing.  More information available on the console."));
                Console.WriteLine(e.Message);
                Console.WriteLine(e.Source);
                Console.WriteLine(e.StackTrace);
            }
        }
        public void Purchase( Mobile m, bool sellitems )
        {
            try
            {
                if (Owned)
                {
                    m.SendMessage("Someone already owns this house!");
                    return;
                }

                if (!PriceReady)
                {
                    m.SendMessage("The setup for this house is not yet complete.");
                    return;
                }

                int price = c_Price + (sellitems ? c_ItemsPrice : 0);

                if (c_Free)
                    price = 0;

                if (m.AccessLevel == AccessLevel.Player && !Server.Mobiles.Banker.Withdraw(m, price))
                {
                    m.SendMessage("You cannot afford this house.");
                    return;
                }

                if (m.AccessLevel == AccessLevel.Player)
                {
                    m.SendMessage( "A total of " + price.ToString() + " copper coins has been withdrawn from your bank box." );
                    OnRentPaid();
                }

                Visible = false;

                int minX = ((Rectangle2D)c_Blocks[0]).Start.X;
                int minY = ((Rectangle2D)c_Blocks[0]).Start.Y;
                int maxX = ((Rectangle2D)c_Blocks[0]).End.X;
                int maxY = ((Rectangle2D)c_Blocks[0]).End.Y;

                foreach (Rectangle2D rect in c_Blocks)
                {
                    if (rect.Start.X < minX)
                        minX = rect.Start.X;
                    if (rect.Start.Y < minY)
                        minY = rect.Start.Y;
                    if (rect.End.X > maxX)
                        maxX = rect.End.X;
                    if (rect.End.Y > maxY)
                        maxY = rect.End.Y;
                }

                c_House = new TownHouse(m, this, c_Locks, c_Secures);

                c_House.Components.Resize( maxX-minX, maxY-minY );
                c_House.Components.Add( 0x520, c_House.Components.Width-1, c_House.Components.Height-1, -5 );

                c_House.Location = new Point3D(minX, minY, Map.GetAverageZ(minX, minY));
                c_House.Map = Map;
                c_House.Region.GoLocation = c_BanLoc;
                c_House.Sign.Location = c_SignLoc;
                c_House.Sign.OriginalName = m.Name;
                c_House.Sign.TownHouseSign = this;
                //c_House.Hanger = new Item(0xB98);
                //c_House.Hanger.Location = c_SignLoc;
                //c_House.Hanger.Map = Map;
                //c_House.Hanger.Movable = false;

                if (c_ForcePublic)
                    c_House.Public = true;

                c_House.Price = (RentByTime == TimeSpan.FromDays(0) ? c_Price : 1);

                RUOVersion.UpdateRegion(this);

                if (c_House.Price == 0)
                    c_House.Price = 1;

                if (c_RentByTime != TimeSpan.Zero)
                    BeginRentTimer(c_RentByTime);

                c_RTOPayments = 1;

                HideOtherSigns();

                c_DecoreItemInfos = new ArrayList();

                ConvertItems(sellitems);

                c_House.Sign.ItemID = (Flip == true ? 0xBD2 : 0xBD1);
            }
            catch(Exception e)
            {
                Errors.Report(String.Format("An error occurred during home purchasing.  More information available on the console."));
                Console.WriteLine(e.Message);
                Console.WriteLine(e.Source);
                Console.WriteLine(e.StackTrace);
            }
        }
        public override void Deserialize( GenericReader reader )
        {
            base.Deserialize( reader );

            int version = reader.ReadInt();

            if( version >= 15 )
                m_Flip = reader.ReadBool();

            if( version >= 14 )
            {
                m_Nation = (Nation)reader.ReadInt();
                m_Treasury = (Container)reader.ReadItem();
            }

            if (version >= 13)
            {
                c_ForcePrivate = reader.ReadBool();
                c_ForcePublic = reader.ReadBool();
                c_NoTrade = reader.ReadBool();
            }

            if (version >= 12)
                c_Free = reader.ReadBool();

            if ( version >= 11 )
                c_Murderers = (Intu)reader.ReadInt();

            if ( version >= 10 )
                c_LeaveItems = reader.ReadBool();

            if ( version >= 9 )
            {
                c_RentToOwn = reader.ReadBool();
                c_OriginalRentTime = reader.ReadTimeSpan();
                c_RTOPayments = reader.ReadInt();
            }

            c_PreviewItems = new ArrayList();
            if ( version >= 7 )
                c_PreviewItems = reader.ReadItemList();

            if ( version >= 6 )
            {
                c_ItemsPrice = reader.ReadInt();
                c_KeepItems = reader.ReadBool();
            }

            c_DecoreItemInfos = new ArrayList();
            if ( version >= 5 )
            {
                int decorecount = reader.ReadInt();
                DecoreItemInfo info;
                for( int i = 0; i < decorecount; ++i )
                {
                    info = new DecoreItemInfo();
                    info.Load( reader );
                    c_DecoreItemInfos.Add( info );
                }

                c_Relock = reader.ReadBool();
            }

            if ( version >= 4 )
            {
                c_RecurRent = reader.ReadBool();
                c_RentByTime = reader.ReadTimeSpan();
                c_RentTime = reader.ReadDateTime();
                c_DemolishTime = reader.ReadDateTime();
                c_YoungOnly = reader.ReadBool();
                c_MinTotalSkill = reader.ReadInt();
                c_MaxTotalSkill = reader.ReadInt();
            }

            if ( version >= 3 )
            {
                c_MinZ = reader.ReadInt();
                c_MaxZ = reader.ReadInt();
            }

            if ( version >= 2 )
                c_House = (TownHouse)reader.ReadItem();

            c_Price = reader.ReadInt();
            c_Locks = reader.ReadInt();
            c_Secures = reader.ReadInt();
            c_BanLoc = reader.ReadPoint3D();
            c_SignLoc = reader.ReadPoint3D();
            c_Skill = reader.ReadString();
            c_SkillReq = reader.ReadDouble();

            c_Blocks = new ArrayList();
            int count = reader.ReadInt();
            for ( int i = 0; i < count; ++i )
                c_Blocks.Add( reader.ReadRect2D() );

            Timer.DelayCall(TimeSpan.Zero, new TimerCallback(StartTimers));

            ClearPreview();

            s_TownHouseSigns.Add( this );
        }