コード例 #1
0
        public override void PlaceInWorld(int i, int j, Item item)
        {
            // TODO: TileObject.CanPlace is throwing null-ref exceptions.  why???

            MachineItem mItem = item.modItem as MachineItem;

            GetDefaultParams(out _, out uint width, out uint height, out _);

            Point16 tePos = new Point16(i, j) - new Point16((int)width / 2, (int)height - 1);

            int type = (item.modItem as MachineItem).TileType;

            MachineEntity entity = TileUtils.tileToEntity[type];

            if (entity.Find(tePos.X, tePos.Y) < 0)
            {
                int id = entity.Place(tePos.X, tePos.Y);

                if (Main.netMode == NetmodeID.MultiplayerClient)
                {
                    NetMessage.SendData(MessageID.TileEntitySharing, remoteClient: -1, ignoreClient: Main.myPlayer, number: id);
                }
            }

            //Restore the saved data, if it exists
            MachineEntity placed = TileEntity.ByPosition[tePos] as MachineEntity;

            if (mItem.entityData != null)
            {
                placed.Load(mItem.entityData);
            }

            //If this structure has a powered entity on it, try to connect it to nearby networks
            Point16 checkOrig = tePos - new Point16(1, 1);

            bool canUseWires      = placed is PoweredMachineEntity;
            bool canUseItemPipes  = placed.SlotsCount > 0;
            bool canUseFluidPipes = placed is ILiquidMachine || placed is IGasMachine;

            for (int cx = checkOrig.X; cx < checkOrig.X + width + 2; cx++)
            {
                for (int cy = checkOrig.Y; cy < checkOrig.Y + height + 2; cy++)
                {
                    WorldGen.TileFrame(cx, cy);

                    //Ignore the corners
                    if ((cx == 0 && cy == 0) || (cx == width + 1 && cy == 0) || (cx == 0 && cy == height + 1) || (cx == width + 1 && cy == height + 1))
                    {
                        continue;
                    }

                    Point16 test = new Point16(cx, cy);

                    if (canUseWires && NetworkCollection.HasWireAt(test, out WireNetwork wireNet))
                    {
                        wireNet.AddMachine(placed);
                    }
                    if (canUseItemPipes && NetworkCollection.HasItemPipeAt(test, out ItemNetwork itemNet))
                    {
                        itemNet.AddMachine(placed);
                        itemNet.pipesConnectedToMachines.Add(test);
                    }
                    if (canUseFluidPipes && NetworkCollection.HasFluidPipeAt(test, out FluidNetwork fluidNet))
                    {
                        fluidNet.AddMachine(placed);
                    }
                }
            }

            if (Main.netMode == NetmodeID.MultiplayerClient)
            {
                NetMessage.SendTileRange(Main.myPlayer, checkOrig.X, checkOrig.Y, (int)width + 1, (int)height + 1);
            }
        }