internal static bool WriteInventory(Item[] inv, BinaryWriter writer, bool writeStack = false, bool writeFavorite = false) { ushort count = 0; byte[] data; using (MemoryStream stream = new MemoryStream()) { using (BinaryWriter invWriter = new BinaryWriter(stream)) { for (int k = 0; k < inv.Length; k++) { if (ItemLoader.NeedsModSaving(inv[k])) { invWriter.Write((ushort)k); ItemIO.WriteItem(inv[k], invWriter, writeStack, writeFavorite); count++; } } } data = stream.ToArray(); } if (count > 0) { writer.Write(count); writer.Write(data); return(true); } return(false); }
//in Terraria.GameContent.Tile_Entities.TEItemFrame.WriteExtraData // if item is a mod item write 0 as the ID internal static bool WriteContainers(BinaryWriter writer) { byte[] flags = new byte[1]; byte numFlags = 0; ISet <int> headSlots = new HashSet <int>(); ISet <int> bodySlots = new HashSet <int>(); ISet <int> legSlots = new HashSet <int>(); IDictionary <int, int> itemFrames = new Dictionary <int, int>(); for (int i = 0; i < Main.maxTilesX; i++) { for (int j = 0; j < Main.maxTilesY; j++) { Tile tile = Main.tile[i, j]; if (tile.active() && (tile.type == TileID.Mannequin || tile.type == TileID.Womannequin)) { int slot = tile.frameX / 100; int position = tile.frameY / 18; if (HasModArmor(slot, position)) { if (position == 0) { headSlots.Add(slot); } else if (position == 1) { bodySlots.Add(slot); } else if (position == 2) { legSlots.Add(slot); } flags[0] |= 1; numFlags = 1; } } } } int tileEntity = 0; foreach (KeyValuePair <int, TileEntity> entity in TileEntity.ByID) { TEItemFrame itemFrame = entity.Value as TEItemFrame; if (itemFrame != null && ItemLoader.NeedsModSaving(itemFrame.item)) { itemFrames.Add(itemFrame.ID, tileEntity); flags[0] |= 2; numFlags = 1; } tileEntity++; } if (numFlags == 0) { return(false); } writer.Write(numFlags); writer.Write(flags, 0, numFlags); if ((flags[0] & 1) == 1) { writer.Write((ushort)headSlots.Count); foreach (int slot in headSlots) { writer.Write((ushort)slot); ModItem item = ItemLoader.GetItem(EquipLoader.slotToId[EquipType.Head][slot]); writer.Write(item.mod.Name); writer.Write(Main.itemName[item.item.type]); } writer.Write((ushort)bodySlots.Count); foreach (int slot in bodySlots) { writer.Write((ushort)slot); ModItem item = ItemLoader.GetItem(EquipLoader.slotToId[EquipType.Body][slot]); writer.Write(item.mod.Name); writer.Write(Main.itemName[item.item.type]); } writer.Write((ushort)legSlots.Count); foreach (int slot in legSlots) { writer.Write((ushort)slot); ModItem item = ItemLoader.GetItem(EquipLoader.slotToId[EquipType.Legs][slot]); writer.Write(item.mod.Name); writer.Write(Main.itemName[item.item.type]); } WriteContainerData(writer); } if ((flags[0] & 2) == 2) { writer.Write(itemFrames.Count); foreach (int oldID in itemFrames.Keys) { TEItemFrame itemFrame = TileEntity.ByID[oldID] as TEItemFrame; writer.Write(itemFrames[oldID]); ItemIO.WriteItem(itemFrame.item, writer, true); } } return(true); }