public virtual void AddThing(int index, Thing thing) { Creature creature = thing as Creature; if (creature != null) { Map.ClearSpectatorCache(); creature.SetParent(this); MakeCreatureList(); Creatures.Insert(0, creature); } else { Item item = thing as Item; if (item == null) { return; } if (Items != null && Items.Count >= 0xFFFF) { return; } item.SetParent(this); if (item.IsGroundTile) { if (Ground == null) { Ground = item; OnAddTileItem(item); } else { ItemTemplate oldType = ItemManager.Templates[Ground.Id]; ItemTemplate newType = ItemManager.Templates[item.Id]; Item oldGround = Ground; Ground.SetParent(null); Game.ReleaseItem(Ground); Ground = item; ResetFlags(oldGround); SetFlags(item); OnUpdateTileItem(oldGround, oldType, item, newType); PostRemoveNotification(oldGround, null, 0); } } else if (item.IsAlwaysOnTop) { if (item.IsSplash) { //remove old splash if exists if (Items != null) { for (int i = TopItemsIndex; i < Items.Count; i++) { Item oldSplash = Items[i]; if (oldSplash.IsSplash) { RemoveThing(oldSplash, 1); oldSplash.SetParent(null); Game.ReleaseItem(oldSplash); PostRemoveNotification(oldSplash, null, 0); break; } } } } bool isInserted = false; if (Items != null) { for (int i = TopItemsIndex; i < Items.Count; i++) { //Note: this is different from internalAddThing if (ItemManager.Templates[item.Id].AlwaysOnTopOrder <= ItemManager.Templates[Items[i].Id].AlwaysOnTopOrder) { Items.Insert(i, item); isInserted = true; break; } } } else { MakeItemList(); } if (!isInserted) { Items.Add(item); } OnAddTileItem(item); } else { if (item.IsMagicField) { //remove old field item if exists if (Items != null) { for (int i = 0; i < TopItemsIndex; i++) { MagicField oldField = Items[i] as MagicField; if (oldField != null) { if (oldField.IsReplaceable) { RemoveThing(oldField, 1); oldField.SetParent(null); Game.ReleaseItem(oldField); PostRemoveNotification(oldField, null, 0); break; } else { //This magic field cannot be replaced. item.SetParent(null); Game.ReleaseItem(item); return; } } } } } MakeItemList(); Items.Insert(0, item); ++_downItemCount; OnAddTileItem(item); } } }
public static Item CreateItem(ushort itemId, byte count = 0) { Item newItem = null; ItemTemplate it = ItemManager.Templates[itemId]; if (it.Group == ItemGroups.Deprecated) { return(null); } if (it.IsStackable && count == 0) { count = 1; } if (it.Id != 0) { if (it.Type == ItemTypes.Depot) { newItem = new DepotLocker(itemId); } else if (it.Group.HasFlag(ItemGroups.Container)) { newItem = new Container(itemId); } else if (it.Type == ItemTypes.Teleport) { newItem = new Teleport(itemId); } else if (it.Type == ItemTypes.MagicField) { newItem = new MagicField(itemId); } else if (it.Type == ItemTypes.Door) { newItem = new Door(itemId); } else if (it.Type == ItemTypes.TrashHolder) { newItem = new TrashHolder(itemId); } else if (it.Type == ItemTypes.Mailbox) { newItem = new Mailbox(itemId); } else if (it.Type == ItemTypes.Bed) { newItem = new BedItem(itemId); } else if (it.Id >= 2210 && it.Id <= 2212) { newItem = new Item((ushort)(itemId - 3), count); } else if (it.Id == 2215 || it.Id == 2216) { newItem = new Item((ushort)(itemId - 2), count); } else if (it.Id >= 2202 && it.Id <= 2206) { newItem = new Item((ushort)(itemId - 37), count); } else if (it.Id == 2640) { newItem = new Item(6132, count); } else if (it.Id == 6301) { newItem = new Item(6300, count); } else if (it.Id == 18528) { newItem = new Item(18408, count); } else { newItem = new Item(itemId, count); } newItem.IncrementReferenceCounter(); } return(newItem); }