示例#1
0
        public override void GetProperties(ObjectPropertyList list)
        {
            base.GetProperties(list);

            list.Add(1061639, Name == "a house sign" ? "nothing" : Utility.FixHtml(Name));                    // Name: ~1_NAME~
            list.Add(1061640, (m_Owner == null || m_Owner.Owner == null) ? UnownedName : m_Owner.Owner.Name); // Owner: ~1_OWNER~

            if (m_Owner != null)
            {
                list.Add(m_Owner.Public ? 1061641 : 1061642);                   // This House is Open to the Public : This is a Private Home

                DecayLevel level = m_Owner.DecayLevel;

                if (level == DecayLevel.DemolitionPending)
                {
                    list.Add(1062497);                       // Demolition Pending
                }
                else if (level != DecayLevel.Ageless)
                {
                    if (level == DecayLevel.Collapsed)
                    {
                        level = DecayLevel.IDOC;
                    }

                    list.Add(1043009 + (int)level);                        // This structure is ...
                }
            }
        }
示例#2
0
        public override void GetProperties(ObjectPropertyList list)
        {
            base.GetProperties(list);

            list.Add(1061639, Utility.FixHtml(GetName()));                                                 // Name: ~1_NAME~
            list.Add(1061640, (m_Owner == null || m_Owner.Owner == null) ? "nobody" : m_Owner.Owner.Name); // Owner: ~1_OWNER~

            if (m_Owner != null)
            {
                list.Add(m_Owner.Public ? 1061641 : 1061642);                   // This House is Open to the Public : This is a Private Home

                DecayLevel level = m_Owner.DecayLevel;

                if (level == DecayLevel.DemolitionPending)
                {
                    list.Add(1062497);                       // Demolition Pending
                }
                else if (level != DecayLevel.Ageless)
                {
                    if (level == DecayLevel.Collapsed)
                    {
                        level = DecayLevel.IDOC;
                    }

                    list.Add(1062028, String.Format("#{0}", 1043009 + (int)level));                         // Condition: This structure is ...
                }
            }
        }
示例#3
0
        public void SetDynamicDecay(DecayLevel level)
        {
            m_CurrentStage = level;

            if (DynamicDecay.Decays(level))
                m_NextDecayStage = DateTime.Now + DynamicDecay.GetRandomDuration(level);
            else
                m_NextDecayStage = DateTime.MinValue;
        }
示例#4
0
		public static void Register( DecayLevel level, TimeSpan min, TimeSpan max )
		{
			DecayStageInfo info = new DecayStageInfo( min, max );

			if ( m_Stages.ContainsKey( level ) )
				m_Stages[level] = info;
			else
				m_Stages.Add( level, info );
		}
示例#5
0
		public static TimeSpan GetRandomDuration( DecayLevel level )
		{
			if ( !m_Stages.ContainsKey( level ) )
				return TimeSpan.Zero;

			DecayStageInfo info = m_Stages[level];
			long min = info.MinDuration.Ticks;
			long max = info.MaxDuration.Ticks;

			return TimeSpan.FromTicks( min + (long)( Utility.RandomDouble() * ( max - min ) ) );
		}
示例#6
0
        public static TimeSpan GetRandomDuration(DecayLevel level)
        {
            if (!m_Stages.TryGetValue(level, out var info))
            {
                return(TimeSpan.Zero);
            }

            var min = info.MinDuration.Ticks;
            var max = info.MaxDuration.Ticks;

            return(TimeSpan.FromTicks(min + (long)(Utility.RandomDouble() * (max - min))));
        }
示例#7
0
        public static TimeSpan GetRandomDuration(DecayLevel level)
        {
            if (!m_Stages.ContainsKey(level))
            {
                return(TimeSpan.Zero);
            }

            DecayStageInfo info = m_Stages[level];
            long           min  = info.MinDuration.Ticks;
            long           max  = info.MaxDuration.Ticks;

            return(TimeSpan.FromTicks(min + (long)(Utility.RandomDouble() * (max - min))));
        }
示例#8
0
        public static void Register(DecayLevel level, TimeSpan min, TimeSpan max)
        {
            DecayStageInfo info = new DecayStageInfo(min, max);

            if (m_Stages.ContainsKey(level))
            {
                m_Stages[level] = info;
            }
            else
            {
                m_Stages.Add(level, info);
            }
        }
示例#9
0
 public static bool Decays(DecayLevel level)
 {
     return(m_Stages.ContainsKey(level));
 }
示例#10
0
		public static bool Decays(DecayLevel level)
		{
			return m_Stages.ContainsKey(level);
		}
示例#11
0
 public void ResetDynamicDecay()
 {
     m_CurrentStage = DecayLevel.Ageless;
     m_NextDecayStage = DateTime.MinValue;
 }
示例#12
0
		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
			int count;
            bool loadedDynamicDecay = false;

            switch (version)
            {
                case 15:
                    {
                        int stage = reader.ReadInt();

                        if (stage != -1)
                        {
                            m_CurrentStage = (DecayLevel)stage;
                            m_NextDecayStage = reader.ReadDateTime();
                            loadedDynamicDecay = true;
                        }

                        goto case 14;
                    }
				case 14:
				{
					m_RelativeBanLocation = reader.ReadPoint3D();
					goto case 13;
				}
				case 13: // removed ban location serialization
				case 12:
				{
					m_VendorRentalContracts = reader.ReadItemList();
					m_InternalizedVendors = reader.ReadMobileList();

					int relocatedCount = reader.ReadEncodedInt();
					for ( int i = 0; i < relocatedCount; i++ )
					{
						Point3D relLocation = reader.ReadPoint3D();
						IEntity entity = World.FindEntity( reader.ReadInt() );

						if ( entity != null )
							m_RelocatedEntities.Add( new RelocatedEntity( entity, relLocation ) );
					}

					int inventoryCount = reader.ReadEncodedInt();
					for ( int i = 0; i < inventoryCount; i++ )
					{
						VendorInventory inventory = new VendorInventory( this, reader );
						m_VendorInventories.Add( inventory );
					}

					goto case 11;
				}
				case 11:
				{
					m_LastRefreshed = reader.ReadDateTime();
					m_RestrictDecay = reader.ReadBool();
					goto case 10;
				}
				case 10: // just a signal for updates
				case 9:
				{
					m_Visits = reader.ReadInt();
					goto case 8;
				}
				case 8:
				{
					m_Price = reader.ReadInt();
					goto case 7;
				}
				case 7:
				{
					m_Access = reader.ReadMobileList();
					goto case 6;
				}
				case 6:
				{
					m_BuiltOn = reader.ReadDateTime();
					m_LastTraded = reader.ReadDateTime();
					goto case 5;
				}
				case 5: // just removed fields
				case 4:
				{
					m_Addons = reader.ReadItemList();
					goto case 3;
				}
				case 3:
				{
					count = reader.ReadInt();
					m_Secures = new ArrayList( count );

					for ( int i = 0; i < count; ++i )
					{
						SecureInfo info = new SecureInfo( reader );

						if ( info.Item != null )
						{
							info.Item.IsSecure = true;
							m_Secures.Add( info );
						}
					}

					goto case 2;
				}
				case 2:
				{
					m_Public = reader.ReadBool();
					goto case 1;
				}
				case 1:
				{
					if ( version < 13 )
						reader.ReadPoint3D(); // house ban location
					goto case 0;
				}
				case 0:
				{
					if ( version < 14 )
						m_RelativeBanLocation = this.BaseBanLocation;

					if ( version < 12 )
					{
						m_VendorRentalContracts = new ArrayList();
						m_InternalizedVendors = new ArrayList();
					}

					if ( version < 4 )
						m_Addons = new ArrayList();

					if ( version < 7 )
						m_Access = new ArrayList();

					if ( version < 8 )
						m_Price = DefaultPrice;

					m_Owner = reader.ReadMobile();

					if ( version < 5 )
					{
						count = reader.ReadInt();

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

					UpdateRegion();

					m_CoOwners = reader.ReadMobileList();
					m_Friends = reader.ReadMobileList();
					m_Bans = reader.ReadMobileList();

					m_Sign = reader.ReadItem() as HouseSign;
					m_Trash = reader.ReadItem() as TrashBarrel;

					m_Doors = reader.ReadItemList();
					m_LockDowns = reader.ReadItemList();

					for ( int i = 0; i < m_LockDowns.Count; ++i )
						((Item)m_LockDowns[i]).IsLockedDown = true;

					for ( int i = 0; i < m_VendorRentalContracts.Count; ++i )
						((Item)m_VendorRentalContracts[i]).IsLockedDown = true;

					if ( version < 3 )
					{
						ArrayList items = reader.ReadItemList();
						m_Secures = new ArrayList( items.Count );

						for ( int i = 0; i < items.Count; ++i )
						{
							Container c = items[i] as Container;

							if ( c != null )
							{
								c.IsSecure = true;
								m_Secures.Add( new SecureInfo( c, SecureLevel.CoOwners ) );
							}
						}
					}

					m_MaxLockDowns = reader.ReadInt();
					m_MaxSecures = reader.ReadInt();

					if ( (Map == null || Map == Map.Internal) && Location == Point3D.Zero )
						Delete();

					if ( m_Owner != null )
					{
						List<BaseHouse> list = null;
						m_Table.TryGetValue( m_Owner, out list );

						if ( list == null )
							m_Table[m_Owner] = list = new List<BaseHouse>();

						list.Add( this );
					}
					break;
				}
			}

			if ( version <= 1 )
				ChangeSignType( 0xBD2 );//private house, plain brass sign

			if ( version < 10 )
			{
				/* NOTE: This can exceed the house lockdown limit. It must be this way, because
				 * we do not want players' items to decay without them knowing. Or not even
				 * having a chance to fix it themselves.
				 */

				Timer.DelayCall( TimeSpan.Zero, new TimerCallback( FixLockdowns_Sandbox ) );
			}

			if ( version < 11 )
				m_LastRefreshed = DateTime.Now + TimeSpan.FromHours( 24 * Utility.RandomDouble() );

            if (DynamicDecay.Enabled && !loadedDynamicDecay)
            {
                DecayLevel old = GetOldDecayLevel();

                if (old == DecayLevel.DemolitionPending)
                    old = DecayLevel.Collapsed;

                SetDynamicDecay(old);
            }

			if ( !CheckDecay() )
			{
				if ( RelocatedEntities.Count > 0 )
					Timer.DelayCall( TimeSpan.Zero, new TimerCallback( RestoreRelocatedEntities ) );

				if ( m_Owner == null && m_Friends.Count == 0 && m_CoOwners.Count == 0 )
					Timer.DelayCall( TimeSpan.FromSeconds( 10.0 ), new TimerCallback( Delete ) );
			}
		}
示例#13
0
 public static bool Decays(DecayLevel level) => m_Stages.ContainsKey(level);
示例#14
0
 public static void Register(DecayLevel level, TimeSpan min, TimeSpan max)
 {
     m_Stages[level] = new DecayStageInfo(min, max);
 }
示例#15
0
        public bool CheckDecay()
        {
            if ( Deleted )
                return false;

            DecayLevel result;

            if ( !CanDecay )
            {
                ResetDynamicDecay();

                m_LastRefreshed = DateTime.Now;
                result = DecayLevel.Ageless;
            }
            else
            {
                DecayLevel stage = m_CurrentStage;

                if ( stage == DecayLevel.Ageless || ( DynamicDecay.Decays( stage ) && m_NextDecayStage <= DateTime.Now ) )
                    SetDynamicDecay( ++stage );

                if ( stage == DecayLevel.Collapsed && ( HasRentedVendors || VendorInventories.Count > 0 ) )
                {
                    result = DecayLevel.DemolitionPending;
                    ClearOwnership();
                }
                else
                    result = stage;
            }

            if ( result != m_DecayLevel )
            {
                m_DecayLevel = result;

                if ( m_Sign != null )
                    m_Sign.InvalidateProperties();
            }

            if ( result == DecayLevel.Collapsed )
            {
                Timer.DelayCall( TimeSpan.Zero, new TimerCallback( Decay_Sandbox ) );
                return true;
            }

            return false;
        }