using System; using System.Collections.Generic; using System.Collections; using Server; using Server.Items; using Server.Multis; using Server.Mobiles; namespace Server.Misc { public class Cleanup { public static void Initialize() { Timer.DelayCall( TimeSpan.FromSeconds( 2.5 ), new TimerCallback( Run ) ); } public static void Run() { List items = new List(); List validItems = new List(); List hairCleanup = new List(); int boxes = 0; foreach ( Item item in World.Items.Values ) { if ( item.Map == null ) { items.Add( item ); continue; } else if ( item is BaseHouse ) { BaseHouse house = (BaseHouse)item; foreach ( RelocatedEntity relEntity in house.RelocatedEntities ) { if ( relEntity.Entity is Item ) validItems.Add( (Item)relEntity.Entity ); } foreach ( VendorInventory inventory in house.VendorInventories ) { foreach ( Item subItem in inventory.Items ) validItems.Add( subItem ); } } else if ( item is InnBox ) { InnBox box = (InnBox)item; Mobile owner = box.Owner; if ( owner == null ) { items.Add( box ); ++boxes; } else if ( box.Items.Count == 0 ) { items.Add( box ); ++boxes; } continue; } else if ( (item.Layer == Layer.Hair || item.Layer == Layer.FacialHair) ) { object rootParent = item.RootParent; if ( rootParent is Mobile ) { Mobile rootMobile = (Mobile)rootParent; if ( item.Parent != rootMobile && rootMobile.AccessLevel == AccessLevel.Player ) { items.Add( item ); continue; } else if( item.Parent == rootMobile ) { hairCleanup.Add( rootMobile ); continue; } } } if ( item.Parent != null || item.Map != Map.Internal || item.HeldBy != null ) continue; if ( item.Location != Point3D.Zero ) continue; if ( !IsBuggable( item ) ) continue; items.Add( item ); } for ( int i = 0; i < validItems.Count; ++i ) items.Remove( validItems[i] ); if ( items.Count > 0 ) { for ( int i = 0; i < items.Count; ++i ) items[i].Delete(); } if ( hairCleanup.Count > 0 ) { for ( int i = 0; i < hairCleanup.Count; i++ ) hairCleanup[i].ConvertHair(); } ArrayList cleanup = new ArrayList(); foreach ( Mobile creature in World.Mobiles.Values ) { if ( creature is BaseCreature && creature.Map == Map.Internal ) { if (((BaseCreature)creature).IsStabled){} // DO NOTHING else if ( creature is BaseMount && ((BaseMount)creature).Rider != null ){} // DO NOTHING else { cleanup.Add( creature ); } } } for ( int i = 0; i < cleanup.Count; ++i ) { Mobile creature = ( Mobile )cleanup[ i ]; creature.Delete(); } } public static bool IsBuggable( Item item ) { if ( item is Fists ) return false; if ( item is Multis.BaseBoat || item is Fish || item is BigFish || item is BasePotion || item is Food || item is CookableFood || item is SpecialFishingNet || item is BaseMagicFish || item is Shoes || item is Sandals || item is Boots || item is ThighBoots || item is TreasureMap || item is MessageInABottle || item is BaseArmor || item is BaseWeapon || item is BaseClothing) return true; return false; } } }