public void RelocateEntities() { foreach ( IEntity entity in GetHouseEntities() ) { Point3D relLoc = new Point3D( entity.X - this.X, entity.Y - this.Y, entity.Z - this.Z ); RelocatedEntity relocEntity = new RelocatedEntity( entity, relLoc ); RelocatedEntities.Add( relocEntity ); if ( entity is Item ) { ( (Item) entity ).Internalize(); if ( entity is ParrotPerchAddon ) { ParrotPerchAddon perch = entity as ParrotPerchAddon; if ( perch.Parrot != null && !perch.Parrot.Deleted ) perch.Parrot.Internalize(); } } else { ( (Mobile) entity ).Internalize(); } } }
public static void Run() { List <Item> items = new List <Item>(); List <Item> validItems = new List <Item>(); List <Mobile> hairCleanup = new List <Mobile>(); int boxes = 0; foreach (Item item in World.Items.Values) { if (item.Map == null) { items.Add(item); continue; } if (item is CommodityDeed deed) { if (deed.Commodity != null) { validItems.Add(deed.Commodity); } continue; } if (item is BaseHouse house) { for (var index = 0; index < house.RelocatedEntities.Count; index++) { RelocatedEntity relEntity = house.RelocatedEntities[index]; if (relEntity.Entity is Item entity) { validItems.Add(entity); } } for (var index = 0; index < house.VendorInventories.Count; index++) { VendorInventory inventory = house.VendorInventories[index]; for (var i = 0; i < inventory.Items.Count; i++) { Item subItem = inventory.Items[i]; validItems.Add(subItem); } } } else if (item is BankBox box) { 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 m) { if (item.Parent != m && m.IsPlayer()) { items.Add(item); continue; } if (item.Parent == m) { hairCleanup.Add(m); continue; } } } if (item.Parent != null || item.Map != Map.Internal || item.HeldBy != null) { continue; } if (item.Location != Point3D.Zero) { continue; } if (!IsBuggable(item)) { continue; } if (item is BaseBoat || item is BaseDockedBoat) { continue; } items.Add(item); } for (int i = 0; i < validItems.Count; ++i) { items.Remove(validItems[i]); } if (items.Count > 0) { if (boxes > 0) { Console.WriteLine("Cleanup: Detected {0} inaccessible items, including {1} bank boxes, removing..", items.Count, boxes); } else { Console.WriteLine("Cleanup: Detected {0} inaccessible items, removing..", items.Count); } for (int i = 0; i < items.Count; ++i) { Console.WriteLine(items[i].ToString()); items[i].Delete(); } } if (hairCleanup.Count > 0) { Console.WriteLine("Cleanup: Detected {0} hair and facial hair items being worn, converting to their virtual counterparts..", hairCleanup.Count); for (int i = 0; i < hairCleanup.Count; i++) { hairCleanup[i].ConvertHair(); } } }