private bool CheckTilePermission(TSPlayer player, DPoint location, BlockType blockType, int objectStyle, PaintColor paint, bool dropItem = false)
        {
            switch (blockType) {
            case BlockType.Statue: {
              DPoint originTileLocation = new DPoint(location.X, location.Y - 2);
              if (!TerrariaUtils.Tiles.IsObjectWired(originTileLocation, new DPoint(2, 3)))
            break;
              StatueStyle statueStyle = TerrariaUtils.Tiles.GetStatueStyle(objectStyle);
              StatueConfig statueConfig;
              if (!this.Config.StatueConfigs.TryGetValue(statueStyle, out statueConfig) || statueConfig == null)
            break;

              if (!player.Group.HasPermission(statueConfig.WirePermission)) {
            player.SendTileSquareEx(location, 10);

            if (dropItem) {
              ItemType itemTypeToDrop;
              itemTypeToDrop = TerrariaUtils.Tiles.GetItemTypeFromStatueStyle(statueStyle);

              Item.NewItem(location.X * TerrariaUtils.TileSize, location.Y * TerrariaUtils.TileSize, 0, 0, (int)itemTypeToDrop);
            }

            this.TellNoStatueWiringPermission(player, statueStyle);
            return false;
              }

              break;
            }
            case BlockType.DartTrap: {
              Tile destTile = TerrariaUtils.Tiles[location];
              if (!destTile.HasWire())
            break;
              TrapConfig trapConfig;
              TrapStyle trapStyle = TerrariaUtils.Tiles.GetTrapStyle(destTile.frameY / 18);
              TrapConfigKey configKey = new TrapConfigKey(trapStyle, paint);
              if (!this.Config.TrapConfigs.TryGetValue(configKey, out trapConfig))
            break;

              if (!player.Group.HasPermission(trapConfig.WirePermission)) {
            player.SendTileSquareEx(location, 10);

            if (dropItem) {
              ItemType itemTypeToDrop = TerrariaUtils.Tiles.GetItemTypeFromTrapStyle(trapStyle);
              Item.NewItem(location.X * TerrariaUtils.TileSize, location.Y * TerrariaUtils.TileSize, 0, 0, (int)itemTypeToDrop);
            }

            this.TellMissingComponentWiringPermission(player, blockType);
            return false;
              }

              break;
            }
            case BlockType.Boulder: {
              DPoint originTileLocation = new DPoint(location.X - 1, location.Y - 1);
              if (!TerrariaUtils.Tiles.IsObjectWired(originTileLocation, new DPoint(2, 2)))
            break;

              if (!player.Group.HasPermission(AdvancedCircuitsPlugin.WireBoulder_Permission)) {
            player.SendTileSquareEx(location, 10);

            if (dropItem)
              Item.NewItem(location.X * TerrariaUtils.TileSize, location.Y * TerrariaUtils.TileSize, 0, 0, (int)ItemType.Boulder);

            this.TellMissingComponentWiringPermission(player, blockType);
            return false;
              }

              break;
            }
            case BlockType.Sign: {
              if (!TerrariaUtils.Tiles.IsObjectWired(location, new DPoint(2, 2)))
            break;

              if (!player.Group.HasPermission(AdvancedCircuitsPlugin.WireSign_Permission)) {
            player.SendTileSquareEx(location, 10);

            if (dropItem)
              Item.NewItem(location.X * TerrariaUtils.TileSize, location.Y * TerrariaUtils.TileSize, 0, 0, (int)ItemType.Sign);

            this.TellMissingComponentWiringPermission(player, blockType);
            return false;
              }

              break;
            }
            case BlockType.InletPump:
            case BlockType.OutletPump: {
              DPoint originTileLocation = new DPoint(location.X - 1, location.Y - 1);
              if (!TerrariaUtils.Tiles.IsObjectWired(originTileLocation, new DPoint(2, 2)))
            break;
              PumpConfig pumpConfig;
              if (!this.Config.PumpConfigs.TryGetValue(paint, out pumpConfig))
            break;
              if (string.IsNullOrEmpty(pumpConfig.WirePermission))
            break;

              if (!player.Group.HasPermission(pumpConfig.WirePermission)) {
            player.SendTileSquareEx(location, 10);

            if (dropItem) {
              ItemType itemTypeToDrop = ItemType.OutletPump;
              if (blockType == BlockType.InletPump)
                itemTypeToDrop = ItemType.InletPump;

              Item.NewItem(location.X * TerrariaUtils.TileSize, location.Y * TerrariaUtils.TileSize, 0, 0, (int)itemTypeToDrop);
            }

            this.TellMissingComponentWiringPermission(player, blockType);
            return false;
              }

              break;
            }
            case AdvancedCircuits.BlockType_WirelessTransmitter: {
              if (!AdvancedCircuits.IsComponentWiredByPort(location, new DPoint(1, 1)))
            break;
              WirelessTransmitterConfig transmitterConfig;
              if (!this.Config.WirelessTransmitterConfigs.TryGetValue(paint, out transmitterConfig))
            break;

              if (!player.Group.HasPermission(transmitterConfig.WirePermission)) {
            player.SendTileSquareEx(location, 1);

            if (dropItem)
              Item.NewItem(location.X * TerrariaUtils.TileSize, location.Y * TerrariaUtils.TileSize, 0, 0, (int)ItemType.AdamantiteOre);

            this.TellMissingComponentWiringPermission(player, blockType);
            return false;
              }

              break;
            }
            case BlockType.Teleporter: {
              DPoint originTileLocation = new DPoint(location.X - 1, location.Y - 1);
              if (!TerrariaUtils.Tiles.IsObjectWired(originTileLocation, new DPoint(3, 1)))
            break;

              if (!player.Group.HasPermission(AdvancedCircuitsPlugin.WireTeleporter_Permission)) {
            player.SendTileSquareEx(location, 10);

            if (dropItem)
              Item.NewItem(location.X * TerrariaUtils.TileSize, location.Y * TerrariaUtils.TileSize, 0, 0, (int)ItemType.Teleporter);

            this.TellMissingComponentWiringPermission(player, blockType);
            return false;
              }

              break;
            }
              }

              return true;
        }