Beispiel #1
0
        public void TakeItem(int x, int y, object slot, int amount)
        {
            TEItemFrame frame = FindItemFrame(x, y);

            frame.item = new Item();
            HandleItemFrameChange(x, y, frame.ID);
        }
Beispiel #2
0
        private void AddTerrariaTileEntity(ITileEntity tileEntity)
        {
            int id;
            var x = tileEntity.Position.X;
            var y = tileEntity.Position.Y;

            lock (_tileEntityLock)
            {
                switch (tileEntity)
                {
                case ItemFrame itemFrame:
                    var item = itemFrame.Item;
                    id = TEItemFrame.Place(x, y);
                    TEItemFrame.TryPlacing(x, y, item.Type, item.Prefix, item.StackSize);
                    break;

                case LogicSensor logicSensor:
                    id = TELogicSensor.Place(x, y);
                    var terrariaLogicSensor = (TELogicSensor)TileEntity.ByID[id];
                    terrariaLogicSensor.CountedData = logicSensor.Data;
                    terrariaLogicSensor.logicCheck  = (TELogicSensor.LogicCheckType)logicSensor.Type;
                    terrariaLogicSensor.On          = logicSensor.IsEnabled;
                    break;

                case TrainingDummy _:
                    id = TETrainingDummy.Place(x, y);
                    ((TETrainingDummy)TileEntity.ByID[id]).Activate();
                    break;

                default:
                    return;
                }
            }
            NetMessage.SendData(86, -1, -1, null, id, x, y);
        }
Beispiel #3
0
        public override void Execute()
        {
            Tools.PrepareUndo(x, y, x2, y2, plr);
            int signs  = 0;
            int frames = 0;
            int chests = 0;

            foreach (Sign sign in Main.sign)
            {
                if (sign == null)
                {
                    continue;
                }
                ushort type1 = Main.tile[sign.x, sign.y].type;
                if ((type1 != TileID.Signs) &&
                    (type1 != TileID.Tombstones) &&
                    (type1 != TileID.AnnouncementBox))
                {
                    Sign.KillSign(sign.x, sign.y);
                    signs++;
                }
            }
            for (int i = x; i <= x2; i++)
            {
                for (int j = y; j <= y2; j++)
                {
                    int ID = TEItemFrame.Find(i, j);
                    if (ID == -1)
                    {
                        continue;
                    }
                    if (Main.tile[i, j].type != TileID.ItemFrame)
                    {
                        TEItemFrame.Kill(i, j);
                        frames++;
                    }
                }
            }
            foreach (Chest chest in Main.chest)
            {
                if (chest == null)
                {
                    continue;
                }
                ushort type = Main.tile[chest.x, chest.y].type;
                if ((type != TileID.Containers) &&
                    (type != TileID.Containers2) &&
                    (type != TileID.Dressers))
                {
                    Chest.DestroyChest(chest.x, chest.y);
                    chests++;
                }
            }
            ResetSection();
            plr.SendSuccessMessage("Fixed ghost signs ({0}), item frames ({1}) and chests ({2}).", signs, frames, chests);
        }
Beispiel #4
0
        internal static void LoadContainers(TagCompound tag)
        {
            if (tag.ContainsKey("data"))
            {
                ReadContainers(new BinaryReader(new MemoryStream(tag.GetByteArray("data"))));
            }

            foreach (var frameTag in tag.GetList <TagCompound>("itemFrames"))
            {
                TEItemFrame itemFrame = TileEntity.ByID[tag.GetInt("id")] as TEItemFrame;
                ItemIO.Load(itemFrame.item, frameTag.GetCompound("item"));
            }
        }
Beispiel #5
0
        public bool InjectItem(int x, int y, Item item)
        {
            TEItemFrame frame = FindItemFrame(x, y);

            if (!frame.item.IsAir)
            {
                return(false);
            }

            frame.item       = item.Clone();
            frame.item.stack = 1;
            item.stack--;
            HandleItemFrameChange(x, y, frame.ID);
            return(true);
        }
Beispiel #6
0
 internal static void ReadContainers(BinaryReader reader)
 {
     byte[] flags = new byte[1];
     reader.Read(flags, 0, reader.ReadByte());
     if ((flags[0] & 1) == 1)
     {
         ContainerTables tables = ContainerTables.Create();
         int             count  = reader.ReadUInt16();
         for (int k = 0; k < count; k++)
         {
             int    slot    = reader.ReadUInt16();
             string modName = reader.ReadString();
             string name    = reader.ReadString();
             Mod    mod     = ModLoader.GetMod(modName);
             tables.headSlots[slot] = mod?.GetItem(name).item.headSlot ?? 0;
         }
         count = reader.ReadUInt16();
         for (int k = 0; k < count; k++)
         {
             int    slot    = reader.ReadUInt16();
             string modName = reader.ReadString();
             string name    = reader.ReadString();
             Mod    mod     = ModLoader.GetMod(modName);
             tables.bodySlots[slot] = mod?.GetItem(name).item.bodySlot ?? 0;
         }
         count = reader.ReadUInt16();
         for (int k = 0; k < count; k++)
         {
             int    slot    = reader.ReadUInt16();
             string modName = reader.ReadString();
             string name    = reader.ReadString();
             Mod    mod     = ModLoader.GetMod(modName);
             tables.legSlots[slot] = mod?.GetItem(name).item.legSlot ?? 0;
         }
         ReadContainerData(reader, tables);
     }
     //legacy load
     if ((flags[0] & 2) == 2)
     {
         int count = reader.ReadInt32();
         for (int k = 0; k < count; k++)
         {
             int         id        = reader.ReadInt32();
             TEItemFrame itemFrame = TileEntity.ByID[id] as TEItemFrame;
             ItemIO.LoadLegacy(itemFrame.item, reader, true);
         }
     }
 }
        public static TileEntity Read(BinaryReader reader)
        {
            TileEntity tileEntity = null;
            byte       b          = reader.ReadByte();

            switch (b)
            {
            case 0:
                tileEntity = new TETrainingDummy();
                break;

            case 1:
                tileEntity = new TEItemFrame();
                break;
            }
            tileEntity.type = b;
            tileEntity.ReadInner(reader);
            return(tileEntity);
        }
        void OnSendData(SendDataEventArgs args)
        {
            PacketTypes type = args.MsgId;

            List <PacketTypes> spamPackets = new List <PacketTypes> {
                PacketTypes.PlayerUpdate, PacketTypes.PlayerHp, PacketTypes.NpcTalk, PacketTypes.ProjectileDestroy, PacketTypes.ProjectileNew, PacketTypes.NpcUpdate, PacketTypes.Zones, PacketTypes.ItemDrop
            };

            if (!spamPackets.Contains(type))
            {
                Console.WriteLine($"{DateTime.Now}: [Send] {(byte)type} ({type}) ign: {args.ignoreClient} ({(args.ignoreClient == -1 ? "-" : Main.player[args.ignoreClient].name)}) | rem: {args.remoteClient} ({(args.remoteClient == -1 ? "-" : Main.player[args.remoteClient].name)})");
            }

            if (type == PacketTypes.UpdateTileEntity)
            {
                int           id     = args.number;
                bool          exists = TileEntity.ByID.ContainsKey(id);
                StringBuilder sb     = new StringBuilder();

                sb.Append($"{DateTime.Now}: \t\t[Send] TEupd. Entity ID: {id}. Remove entity: {!exists}.");

                if (exists)
                {
                    TEItemFrame iframe = (TEItemFrame)TileEntity.ByID[id];
                    sb.Append($"\n\t\t  Type: {iframe.type}. Position: ({iframe.Position.X}, {iframe.Position.Y})");
                    sb.Append($"\n\t\t  Item details: Type: {iframe.item?.type}. Stack: {iframe.item?.stack}");
                }

                Console.WriteLine(sb.ToString());
            }

            if (type == PacketTypes.Tile)
            {
                byte  action = (byte)args.number;
                short x      = (short)args.number2;
                short y      = (short)args.number3;
                short var1   = (short)args.number4;
                byte  var2   = (byte)args.number5;

                Console.WriteLine($"{DateTime.Now}: \t\t [Send] Tile Edit @ ({x}, {y}), action: {action}, var1: {var1}, var2: {var2}, fail: {var1 == 1}");
            }
        }
Beispiel #9
0
        private TEItemFrame FindItemFrame(int x, int y)
        {
            Tile tile = Main.tile[x, y];

            if (tile == null || !tile.active())
            {
                return(null);
            }

            int originX = x - tile.frameX % 36 / 18;
            int originY = y - tile.frameY / 18;

            int id = TEItemFrame.Find(originX, originY);

            if (id == -1)
            {
                return(null);
            }

            return((TEItemFrame)TileEntity.ByID[id]);
        }
Beispiel #10
0
 public static void ClearObjects(int x, int y, int x2, int y2)
 {
     ClearSigns(x, y, x2, y2, false);
     ClearChests(x, y, x2, y2, false);
     for (int i = x; i <= x2; i++)
     {
         for (int j = y; j <= y2; j++)
         {
             if (TEItemFrame.Find(i, j) != -1)
             {
                 TEItemFrame.Kill(i, j);
             }
             if (TELogicSensor.Find(i, j) != -1)
             {
                 TELogicSensor.Kill(i, j);
             }
             if (TETrainingDummy.Find(i, j) != -1)
             {
                 TETrainingDummy.Kill(i, j);
             }
         }
     }
 }
Beispiel #11
0
        // Token: 0x060012D4 RID: 4820 RVA: 0x004195E0 File Offset: 0x004177E0
        public static TileEntity Read(BinaryReader reader, bool networkSend = false)
        {
            TileEntity tileEntity = null;
            byte       b          = reader.ReadByte();

            switch (b)
            {
            case 0:
                tileEntity = new TETrainingDummy();
                break;

            case 1:
                tileEntity = new TEItemFrame();
                break;

            case 2:
                tileEntity = new TELogicSensor();
                break;
            }
            tileEntity.type = b;
            tileEntity.ReadInner(reader, networkSend);
            return(tileEntity);
        }
        public static TileEntity Read(BinaryReader reader)
        {
            TileEntity tETrainingDummy = null;
            byte       num             = reader.ReadByte();

            switch (num)
            {
            case 0:
            {
                tETrainingDummy = new TETrainingDummy();
                break;
            }

            case 1:
            {
                tETrainingDummy = new TEItemFrame();
                break;
            }
            }
            tETrainingDummy.type = num;
            tETrainingDummy.ReadInner(reader);
            return(tETrainingDummy);
        }
Beispiel #13
0
 public static void InitializeAll()
 {
     TETrainingDummy.Initialize();
     TEItemFrame.Initialize();
     TELogicSensor.Initialize();
 }
Beispiel #14
0
        public static void LoadWorldSection(WorldSectionData Data, int?X = null, int?Y = null, bool Tiles = true)
        {
            int x = (X ?? Data.X), y = (Y ?? Data.Y);

            if (Tiles)
            {
                for (var i = 0; i < Data.Width; i++)
                {
                    for (var j = 0; j < Data.Height; j++)
                    {
                        int _x = i + x, _y = j + y;
                        if (!InMapBoundaries(_x, _y))
                        {
                            continue;
                        }
                        Main.tile[_x, _y] = Data.Tiles[i, j];
                        Main.tile[_x, _y].skipLiquid(true);
                    }
                }
            }

            ClearObjects(x, y, x + Data.Width, y + Data.Height);

            foreach (var sign in Data.Signs)
            {
                var id = Sign.ReadSign(sign.X + x, sign.Y + y);
                if ((id == -1) || !InMapBoundaries(sign.X, sign.Y))
                {
                    continue;
                }
                Sign.TextSign(id, sign.Text);
            }

            foreach (var itemFrame in Data.ItemFrames)
            {
                var id = TEItemFrame.Place(itemFrame.X + x, itemFrame.Y + y);
                if (id == -1)
                {
                    continue;
                }

                var frame = (TEItemFrame)TileEntity.ByID[id];
                if (!InMapBoundaries(frame.Position.X, frame.Position.Y))
                {
                    continue;
                }
                frame.item = new Item();
                frame.item.netDefaults(itemFrame.Item.NetId);
                frame.item.stack  = itemFrame.Item.Stack;
                frame.item.prefix = itemFrame.Item.PrefixId;
            }

            foreach (var chest in Data.Chests)
            {
                int chestX = chest.X + x, chestY = chest.Y + y;

                int id;
                if ((id = Chest.FindChest(chestX, chestY)) == -1 &&
                    (id = Chest.CreateChest(chestX, chestY)) == -1)
                {
                    continue;
                }
                Chest _chest = Main.chest[id];
                if (!InMapBoundaries(chest.X, chest.Y))
                {
                    continue;
                }

                for (var index = 0; index < chest.Items.Length; index++)
                {
                    var netItem = chest.Items[index];
                    var item    = new Item();
                    item.netDefaults(netItem.NetId);
                    item.stack  = netItem.Stack;
                    item.prefix = netItem.PrefixId;
                    Main.chest[id].item[index] = item;
                }
            }

            foreach (var logicSensor in Data.LogicSensors)
            {
                var id = TELogicSensor.Place(logicSensor.X + x, logicSensor.Y + y);
                if (id == -1)
                {
                    continue;
                }
                var sensor = (TELogicSensor)TileEntity.ByID[id];
                if (!InMapBoundaries(sensor.Position.X, sensor.Position.Y))
                {
                    continue;
                }
                sensor.logicCheck = logicSensor.Type;
            }

            foreach (var trainingDummy in Data.TrainingDummies)
            {
                var id = TETrainingDummy.Place(trainingDummy.X + x, trainingDummy.Y + y);
                if (id == -1)
                {
                    continue;
                }
                var dummy = (TETrainingDummy)TileEntity.ByID[id];
                if (!InMapBoundaries(dummy.Position.X, dummy.Position.Y))
                {
                    continue;
                }
                dummy.npc = -1;
            }

            ResetSection(x, y, x + Data.Width, y + Data.Height);
        }
Beispiel #15
0
        public static void LoadWorldSection(string path)
        {
            var data = LoadWorldData(path);

            for (var i = 0; i < data.Width; i++)
            {
                for (var j = 0; j < data.Height; j++)
                {
                    Main.tile[i + data.X, j + data.Y] = data.Tiles[i, j];
                    Main.tile[i + data.X, j + data.Y].skipLiquid(true);
                }
            }

            foreach (var sign in data.Signs)
            {
                var id = Sign.ReadSign(sign.X + data.X, sign.Y + data.Y);
                if (id == -1)
                {
                    continue;
                }

                Sign.TextSign(id, sign.Text);
            }

            foreach (var itemFrame in data.ItemFrames)
            {
                var x = itemFrame.X + data.X;
                var y = itemFrame.Y + data.Y;

                var id = TEItemFrame.Place(x, y);
                if (id == -1)
                {
                    continue;
                }

                WorldGen.PlaceObject(x, y, TileID.ItemFrame);
                var frame = (TEItemFrame)TileEntity.ByID[id];

                frame.item = new Item();
                frame.item.netDefaults(itemFrame.Item.NetId);
                frame.item.stack  = itemFrame.Item.Stack;
                frame.item.prefix = itemFrame.Item.PrefixId;
            }

            foreach (var chest in data.Chests)
            {
                int chestX = chest.X + data.X, chestY = chest.Y + data.Y;

                int id;
                if ((id = Chest.FindChest(chestX, chestY)) == -1 &&
                    (id = Chest.CreateChest(chestX, chestY)) == -1)
                {
                    continue;
                }

                WorldGen.PlaceChest(chestX, chestY);
                for (var index = 0; index < chest.Items.Length; index++)
                {
                    var netItem = chest.Items[index];
                    var item    = new Item();
                    item.netDefaults(netItem.NetId);
                    item.stack  = netItem.Stack;
                    item.prefix = netItem.PrefixId;
                    Main.chest[id].item[index] = item;
                }
            }

            ResetSection(data.X, data.Y, data.X + data.Width, data.Y + data.Height);
        }
Beispiel #16
0
        public override void Execute()
        {
            var clipboardPath = Tools.GetClipboardPath(plr.User.ID);

            var data = Tools.LoadWorldData(clipboardPath);

            var width  = data.Width - 1;
            var height = data.Height - 1;

            if ((alignment & 1) == 0)
            {
                x2 = x + width;
            }
            else
            {
                x2 = x;
                x -= width;
            }
            if ((alignment & 2) == 0)
            {
                y2 = y + height;
            }
            else
            {
                y2 = y;
                y -= height;
            }

            Tools.PrepareUndo(x, y, x2, y2, plr);

            for (var i = x; i <= x2; i++)
            {
                for (var j = y; j <= y2; j++)
                {
                    if (i < 0 || j < 0 || i >= Main.maxTilesX || j >= Main.maxTilesY ||
                        expression != null && !expression.Evaluate(Main.tile[i, j]))
                    {
                        continue;
                    }

                    var index1 = i - x;
                    var index2 = j - y;

                    Main.tile[i, j] = data.Tiles[index1, index2];
                }
            }

            foreach (var sign in data.Signs)
            {
                var id = Sign.ReadSign(sign.X + x, sign.Y + y);
                if (id == -1)
                {
                    continue;
                }

                Sign.TextSign(id, sign.Text);
            }

            foreach (var itemFrame in data.ItemFrames)
            {
                var ifX = itemFrame.X + x;
                var ifY = itemFrame.Y + y;

                var id = TEItemFrame.Place(ifX, ifY);
                if (id == -1)
                {
                    continue;
                }

                WorldGen.PlaceObject(ifX, ifY, TileID.ItemFrame);
                var frame = (TEItemFrame)TileEntity.ByID[id];

                frame.item = new Item();
                frame.item.netDefaults(itemFrame.Item.NetId);
                frame.item.stack  = itemFrame.Item.Stack;
                frame.item.prefix = itemFrame.Item.PrefixId;
            }

            foreach (var chest in data.Chests)
            {
                int chestX = chest.X + x, chestY = chest.Y + y;

                int id;
                if ((id = Chest.FindChest(chestX, chestY)) == -1 &&
                    (id = Chest.CreateChest(chestX, chestY)) == -1)
                {
                    continue;
                }

                WorldGen.PlaceChest(chestX, chestY);
                for (var index = 0; index < chest.Items.Length; index++)
                {
                    var netItem = chest.Items[index];
                    var item    = new Item();
                    item.netDefaults(netItem.NetId);
                    item.stack  = netItem.Stack;
                    item.prefix = netItem.PrefixId;
                    Main.chest[id].item[index] = item;
                }
            }

            ResetSection();
            plr.SendSuccessMessage("Pasted clipboard to selection.");
        }
Beispiel #17
0
        //in Terraria.GameContent.Tile_Entities.TEItemFrame.WriteExtraData
        //  if item is a mod item write 0 as the ID
        internal static TagCompound SaveContainers()
        {
            var ms     = new MemoryStream();
            var writer = new BinaryWriter(ms);

            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; legacy
                    numFlags = 1;
                }
                if (!(entity.Value is ModTileEntity))
                {
                    tileEntity++;
                }
            }
            if (numFlags == 0)
            {
                return(null);
            }
            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(item.Name);
                }
                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(item.Name);
                }
                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(item.Name);
                }
                WriteContainerData(writer);
            }
            var tag = new TagCompound();

            tag.Set("data", ms.ToArray());

            if (itemFrames.Count > 0)
            {
                tag.Set("itemFrames", itemFrames.Select(entry =>
                                                        new TagCompound {
                    ["id"]   = entry.Value,
                    ["item"] = ItemIO.Save(((TEItemFrame)TileEntity.ByID[entry.Key]).item)
                }
                                                        ).ToList());
            }
            return(tag);
        }
Beispiel #18
0
        void OnSendData(SendDataEventArgs args)
        {
            PacketTypes type = args.MsgId;

            List <PacketTypes> spamPackets = new List <PacketTypes> {
                PacketTypes.TileSendSquare, PacketTypes.PlayerUpdate, PacketTypes.PlayerHp, PacketTypes.NpcTalk, PacketTypes.ProjectileDestroy, PacketTypes.ProjectileNew, PacketTypes.NpcUpdate, PacketTypes.Zones, PacketTypes.ItemDrop
            };

            if (!spamPackets.Contains(type))
            {
                SendOutput($"[Send] {(byte)type} ({type}) ign: {args.ignoreClient} ({(args.ignoreClient == -1 ? "-" : Main.player[args.ignoreClient].name)}) | rem: {args.remoteClient} ({(args.remoteClient == -1 ? "-" : Main.player[args.remoteClient].name)})");
            }
            else
            {
                return;
            }

            if (type == PacketTypes.UpdateTileEntity)
            {
                int           id     = args.number;
                bool          exists = TileEntity.ByID.ContainsKey(id);
                StringBuilder sb     = new StringBuilder();

                sb.Append($"\t\t[Send] TEupd. Entity ID: {id}. Remove entity: {!exists}.");

                if (exists)
                {
                    TEItemFrame iframe = (TEItemFrame)TileEntity.ByID[id];
                    sb.Append($"\n\t\t  Type: {iframe.type}. Position: ({iframe.Position.X}, {iframe.Position.Y})");
                    sb.Append($"\n\t\t  Item details: Type: {iframe.item?.type}. Stack: {iframe.item?.stack}");
                }

                SendOutput(sb.ToString());
            }

            if (type == PacketTypes.Tile)
            {
                byte  action = (byte)args.number;
                short x      = (short)args.number2;
                short y      = (short)args.number3;
                short var1   = (short)args.number4;
                byte  var2   = (byte)args.number5;

                SendOutput($"\t\t [Send] Tile Edit @ ({x}, {y}), action: {action}, var1: {var1}, var2: {var2}, fail: {var1 == 1}");
            }

            if (type == PacketTypes.TileSendSquare)
            {
                int size  = args.number;
                int tileX = (int)args.number2;
                int tileY = (int)args.number3;

                if (size < 0)
                {
                    size = 0;
                }

                if (tileX < size)
                {
                    tileX = size;
                }
                if (tileX >= Main.maxTilesX + size)
                {
                    tileX = Main.maxTilesX - size - 1;
                }

                if (tileY < size)
                {
                    tileY = size;
                }
                if (tileY >= Main.maxTilesY + size)
                {
                    tileY = Main.maxTilesY - size - 1;
                }

                int adjustedSize1 = size & 0x7FFF;
                int adjustedSize2 = ((size & 0x7FFF) | 0x8000);

                SendOutput($"[Send] Tile Square @ ({tileX}, {tileY}), size: {size}, adjustedSize1: {adjustedSize1:x4}, adjustedSize2: {adjustedSize2:x4}, hasChangeType: {args.number5 != 0}");
            }
        }
Beispiel #19
0
        //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);
        }
Beispiel #20
0
        public void ProcessTile(ITile tile, int x, int y)
        {
            Tiles[x, y] = new Tile();
            if (tile != null)
            {
                Tiles[x, y].CopyFrom(tile);
            }

            if (!tile.active())
            {
                return;
            }

            var actualX = x + X;
            var actualY = y + Y;

            switch (tile.type)
            {
            case TileID.Signs:
            case TileID.AnnouncementBox:
            case TileID.Tombstones:
                if (tile.frameX % 36 == 0 && tile.frameY == 0)
                {
                    var id = Sign.ReadSign(actualX, actualY, false);
                    if (id != -1)
                    {
                        Signs.Add(new SignData
                        {
                            Text = Main.sign[id].text,
                            X    = x,
                            Y    = y
                        });
                    }
                }
                break;

            case TileID.ItemFrame:
                if (tile.frameX % 36 == 0 && tile.frameY == 0)
                {
                    var id = TEItemFrame.Find(actualX, actualY);
                    if (id != -1)
                    {
                        var frame = (TEItemFrame)TileEntity.ByID[id];
                        ItemFrames.Add(new ItemFrameData
                        {
                            Item = new NetItem(frame.item.netID, frame.item.stack, frame.item.prefix),
                            X    = x,
                            Y    = y
                        });
                    }
                }
                break;

            case TileID.Containers:
            case TileID.Dressers:
                if (tile.frameX % 36 == 0 && tile.frameY == 0)
                {
                    var id = Chest.FindChest(actualX, actualY);
                    if (id != -1)
                    {
                        var chest = Main.chest[id];
                        if (chest.item != null)
                        {
                            var items = chest.item.Select(item => new NetItem(item.netID, item.stack, item.prefix)).ToArray();
                            Chests.Add(new ChestData
                            {
                                Items = items,
                                X     = x,
                                Y     = y
                            });
                        }
                    }
                }
                break;

            case TileID.LogicSensor:
            {
                var id = TELogicSensor.Find(actualX, actualY);
                if (id != -1)
                {
                    var sensor = (TELogicSensor)TileEntity.ByID[id];
                    LogicSensors.Add(new LogicSensorData
                        {
                            X    = x,
                            Y    = y,
                            Type = sensor.logicCheck
                        });
                }
                break;
            }

            case TileID.TargetDummy:
                if (tile.frameX % 36 == 0 && tile.frameY == 0)
                {
                    var id = TETrainingDummy.Find(actualX, actualY);
                    if (id != -1)
                    {
                        TrainingDummies.Add(new TrainingDummyData()
                        {
                            X = x,
                            Y = y
                        });
                    }
                }
                break;
            }
        }
Beispiel #21
0
        public IEnumerable <Tuple <Item, object> > EnumerateItems(int x, int y)
        {
            TEItemFrame frame = FindItemFrame(x, y);

            yield return(new Tuple <Item, object>(frame.item, null));
        }
Beispiel #22
0
        public override void Execute()
        {
            if (!CanUseCommand())
            {
                return;
            }
            Tools.PrepareUndo(x, y, x2, y2, plr);
            int signs = 0, frames = 0, chests = 0, sensors = 0, dummies = 0;

            foreach (Sign sign in Main.sign)
            {
                if (sign == null)
                {
                    continue;
                }
                ushort type = Main.tile[sign.x, sign.y].type;
                if (!Main.tile[sign.x, sign.y].active() ||
                    ((type != TileID.Signs) &&
                     (type != TileID.Tombstones) &&
                     (type != TileID.AnnouncementBox)))
                {
                    Sign.KillSign(sign.x, sign.y);
                    signs++;
                }
            }
            for (int i = x; i <= x2; i++)
            {
                for (int j = y; j <= y2; j++)
                {
                    int ID = TEItemFrame.Find(i, j);
                    if (ID == -1)
                    {
                        continue;
                    }
                    if (!Main.tile[i, j].active() ||
                        (Main.tile[i, j].type != TileID.ItemFrame))
                    {
                        TEItemFrame.Kill(i, j);
                        frames++;
                    }
                }
            }
            foreach (Chest chest in Main.chest)
            {
                if (chest == null)
                {
                    continue;
                }
                ushort type = Main.tile[chest.x, chest.y].type;
                if (!Main.tile[chest.x, chest.y].active() ||
                    ((type != TileID.Containers) &&
                     (type != TileID.Containers2) &&
                     (type != TileID.Dressers)))
                {
                    Chest.DestroyChest(chest.x, chest.y);
                    chests++;
                }
            }
            for (int i = x; i <= x2; i++)
            {
                for (int j = y; j <= y2; j++)
                {
                    int ID = TELogicSensor.Find(i, j);
                    if (ID == -1)
                    {
                        continue;
                    }
                    if (!Main.tile[i, j].active() ||
                        (Main.tile[i, j].type != TileID.LogicSensor))
                    {
                        TELogicSensor.Kill(i, j);
                        sensors++;
                    }
                }
            }
            for (int i = x; i <= x2; i++)
            {
                for (int j = y; j <= y2; j++)
                {
                    int ID = TETrainingDummy.Find(i, j);
                    if (ID == -1)
                    {
                        continue;
                    }
                    if (!Main.tile[i, j].active() ||
                        (Main.tile[i, j].type != TileID.TargetDummy))
                    {
                        TETrainingDummy.Kill(i, j);
                        dummies++;
                    }
                }
            }
            ResetSection();

            List <string> ghosts = new List <string>();

            if (signs > 0)
            {
                ghosts.Add($"signs ({signs})");
            }
            if (frames > 0)
            {
                ghosts.Add($"item frames ({frames})");
            }
            if (chests > 0)
            {
                ghosts.Add($"chests ({chests})");
            }
            if (sensors > 0)
            {
                ghosts.Add($"logic sensors ({sensors})");
            }
            if (dummies > 0)
            {
                ghosts.Add($"target dummies ({dummies})");
            }

            if (ghosts.Count > 0)
            {
                plr.SendSuccessMessage($"Fixed ghost {string.Join(", ", ghosts)}.");
            }
            else
            {
                plr.SendSuccessMessage("There are no ghost objects in this area.");
            }
        }
Beispiel #23
0
        public override void Execute()
        {
            if (!CanUseCommand())
            {
                return;
            }
            Tools.PrepareUndo(x, y, x2, y2, plr);
            int noMsg = 0;

            #region Signs

            if ((_action == 255) || (_action == 0))
            {
                int success = 0, failure = 0;
                for (int i = x; i <= x2; i++)
                {
                    for (int j = y; j <= y2; j++)
                    {
                        if ((Main.tile[i, j].type == TileID.Signs ||
                             Main.tile[i, j].type == TileID.Tombstones ||
                             Main.tile[i, j].type == TileID.AnnouncementBox) &&
                            Main.tile[i, j].frameX % 36 == 0 &&
                            Main.tile[i, j].frameY == 0 &&
                            Sign.ReadSign(i, j, false) == -1)
                        {
                            int sign = Sign.ReadSign(i, j);
                            if (sign == -1)
                            {
                                failure++;
                            }
                            else
                            {
                                success++;
                            }
                        }
                    }
                }
                if (success > 0 || failure > 0)
                {
                    plr.SendSuccessMessage("Activated signs. ({0}){1}", success,
                                           failure > 0 ? " Failed to activate signs. (" + failure + ")" : "");
                }
                else
                {
                    noMsg++;
                }
            }

            #endregion
            #region Chests

            if ((_action == 255) || (_action == 1))
            {
                int success = 0, failure = 0;
                for (int i = x; i <= x2; i++)
                {
                    for (int j = y; j <= y2; j++)
                    {
                        if ((Main.tile[i, j].type == TileID.Containers ||
                             Main.tile[i, j].type == TileID.Containers2 ||
                             Main.tile[i, j].type == TileID.Dressers) &&
                            Main.tile[i, j].frameX % 36 == 0 &&
                            Main.tile[i, j].frameY == 0 &&
                            Chest.FindChest(i, j) == -1)
                        {
                            int chest = Chest.CreateChest(i, j);
                            if (chest == -1)
                            {
                                failure++;
                            }
                            else
                            {
                                success++;
                            }
                        }
                    }
                }
                if (success > 0 || failure > 0)
                {
                    plr.SendSuccessMessage("Activated chests. ({0}){1}", success,
                                           failure > 0 ? " Failed to activate chests. (" + failure + ")" : "");
                }
                else
                {
                    noMsg++;
                }
            }

            #endregion
            #region ItemFrames

            if ((_action == 255) || (_action == 2))
            {
                int success = 0, failure = 0;
                for (int i = x; i <= x2; i++)
                {
                    for (int j = y; j <= y2; j++)
                    {
                        if (Main.tile[i, j].type == TileID.ItemFrame &&
                            Main.tile[i, j].frameX % 36 == 0 &&
                            Main.tile[i, j].frameY == 0 &&
                            TEItemFrame.Find(i, j) == -1)
                        {
                            int frame = TEItemFrame.Place(i, j);
                            if (frame == -1)
                            {
                                failure++;
                            }
                            else
                            {
                                success++;
                            }
                        }
                    }
                }
                if (success > 0 || failure > 0)
                {
                    plr.SendSuccessMessage("Activated item frames. ({0}){1}", success,
                                           failure > 0 ? " Failed to activate item frames. (" + failure + ")" : "");
                }
                else
                {
                    noMsg++;
                }
            }

            #endregion
            #region LogicSensors

            if ((_action == 255) || (_action == 3))
            {
                int success = 0, failure = 0;
                for (int i = x; i <= x2; i++)
                {
                    for (int j = y; j <= y2; j++)
                    {
                        if (Main.tile[i, j].type == TileID.LogicSensor &&
                            TELogicSensor.Find(i, j) == -1)
                        {
                            int sensor = TELogicSensor.Place(i, j);
                            if (sensor == -1)
                            {
                                failure++;
                            }
                            else
                            {
                                ((TELogicSensor)TELogicSensor.ByID[sensor]).logicCheck =
                                    (TELogicSensor.LogicCheckType)((Main.tile[i, j].frameY / 18) + 1);
                                success++;
                            }
                        }
                    }
                }
                if (success > 0 || failure > 0)
                {
                    plr.SendSuccessMessage("Activated logic sensors. ({0}){1}", success,
                                           failure > 0 ? " Failed to activate logic sensors. (" + failure + ")" : "");
                }
                else
                {
                    noMsg++;
                }
            }

            #endregion
            #region TargetDummies

            if ((_action == 255) || (_action == 4))
            {
                int success = 0, failure = 0;
                for (int i = x; i <= x2; i++)
                {
                    for (int j = y; j <= y2; j++)
                    {
                        if (Main.tile[i, j].type == TileID.TargetDummy &&
                            Main.tile[i, j].frameX % 36 == 0 &&
                            Main.tile[i, j].frameY == 0 &&
                            TETrainingDummy.Find(i, j) == -1)
                        {
                            int dummy = TETrainingDummy.Place(i, j);
                            if (dummy == -1)
                            {
                                failure++;
                            }
                            else
                            {
                                success++;
                            }
                        }
                    }
                }
                if (success > 0 || failure > 0)
                {
                    plr.SendSuccessMessage("Activated target dummies. ({0}){1}", success,
                                           failure > 0 ? " Failed to activate target dummies. (" + failure + ")" : "");
                }
                else
                {
                    noMsg++;
                }
            }

            #endregion
            if (noMsg == 5)
            {
                plr.SendSuccessMessage("There are no objects to activate in this area.");
            }
            ResetSection();
        }
Beispiel #24
0
        public override void Execute()
        {
            string message;

            switch (_action)
            {
            case 0:
            {
                int success = 0, failure = 0;
                for (int i = x; i <= x2; i++)
                {
                    for (int j = y; j <= y2; j++)
                    {
                        if ((Main.tile[i, j].type == TileID.Signs ||
                             Main.tile[i, j].type == TileID.Tombstones ||
                             Main.tile[i, j].type == TileID.AnnouncementBox) &&
                            Main.tile[i, j].frameX % 36 == 0 &&
                            Main.tile[i, j].frameY == 0 &&
                            Sign.ReadSign(i, j, false) == -1)
                        {
                            int sign = Sign.ReadSign(i, j);
                            if (sign == -1)
                            {
                                failure++;
                            }
                            else
                            {
                                success++;
                            }
                        }
                    }
                }
                message = string.Format("Activated signs. ({0}){1}", success,
                                        failure > 0 ? " Failed to activate signs. (" + failure + ")" : "");
                break;
            }

            case 1:
            {
                int success = 0, failure = 0;
                for (int i = x; i <= x2; i++)
                {
                    for (int j = y; j <= y2; j++)
                    {
                        if ((Main.tile[i, j].type == TileID.Containers ||
                             Main.tile[i, j].type == TileID.Containers2 ||
                             Main.tile[i, j].type == TileID.Dressers) &&
                            Main.tile[i, j].frameX % 36 == 0 &&
                            Main.tile[i, j].frameY == 0 &&
                            Chest.FindChest(i, j) == -1)
                        {
                            int chest = Chest.CreateChest(i, j);
                            if (chest == -1)
                            {
                                failure++;
                            }
                            else
                            {
                                success++;
                            }
                        }
                    }
                }
                message = string.Format("Activated chests. ({0}){1}", success,
                                        failure > 0 ? " Failed to activate chests. (" + failure + ")" : "");
                break;
            }

            case 2:
            {
                int success = 0, failure = 0;
                for (int i = x; i <= x2; i++)
                {
                    for (int j = y; j <= y2; j++)
                    {
                        if (Main.tile[i, j].type == TileID.ItemFrame &&
                            Main.tile[i, j].frameX % 36 == 0 &&
                            Main.tile[i, j].frameY == 0 &&
                            TEItemFrame.Find(i, j) == -1)
                        {
                            int frame = TEItemFrame.Place(i, j);
                            if (frame == -1)
                            {
                                failure++;
                            }
                            else
                            {
                                success++;
                            }
                        }
                    }
                }
                message = string.Format("Activated item frames. ({0}){1}", success,
                                        failure > 0 ? " Failed to activate item frames. (" + failure + ")" : "");
                break;
            }

            default: return;
            }
            ResetSection();
            plr.SendSuccessMessage(message);
        }