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 ... } } }
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 ... } } }
public void SetDynamicDecay(DecayLevel level) { m_CurrentStage = level; if (DynamicDecay.Decays(level)) m_NextDecayStage = DateTime.Now + DynamicDecay.GetRandomDuration(level); else m_NextDecayStage = DateTime.MinValue; }
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 ); }
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 ) ) ); }
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)))); }
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)))); }
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); } }
public static bool Decays(DecayLevel level) { return(m_Stages.ContainsKey(level)); }
public static bool Decays(DecayLevel level) { return m_Stages.ContainsKey(level); }
public void ResetDynamicDecay() { m_CurrentStage = DecayLevel.Ageless; m_NextDecayStage = DateTime.MinValue; }
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 ) ); } }
public static bool Decays(DecayLevel level) => m_Stages.ContainsKey(level);
public static void Register(DecayLevel level, TimeSpan min, TimeSpan max) { m_Stages[level] = new DecayStageInfo(min, max); }
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; }