bool isValidHousePosition(House house)
        {
            foreach (House other in houses.Values)
            {
                bool xIntersects = false;
                bool yIntersects = false;

                if (house.x >= other.x && house.x < other.x + other.width)
                    xIntersects = true;

                if (other.x >= house.x && other.x < house.x + house.width)
                    xIntersects = true;

                if (house.y >= other.y && house.y < other.y + other.width)
                    yIntersects = true;

                if (other.y >= house.y && other.y < house.y + house.width)
                    yIntersects = true;

                if (xIntersects && yIntersects)
                {
                    IPlayer player = bot.Room.getPlayer(house.builder);
                    if (player != null)
                    {
                        string builder = house.builder;
                        string neighbor = other.builder;

                        player.Reply("Your house would be too close to " + neighbor + "'s house.");
                        player.Reply("The size of the house is " + house.width + "x" + house.height + " blocks.");
                    }

                    return false;
                }
            }

            for (int x = 0; x < house.width; ++x)
            {
                for (int y = 0; y < house.height; ++y)
                {
                    int bx = house.x + x;
                    int by = house.y + y;

                    int blockId = bot.Room.getBlock(0, bx, by).Id;

                    if (!house.houseType.isGroundBlockAllowed(blockId))
                    {
                        IPlayer player = bot.Room.getPlayer(house.builder);
                        if (player != null)
                        {
                            player.Reply("You must build the house on empty space without dirt and ores!");
                            player.Reply("The size of the house is " + house.width + "x" + house.height + " blocks.");
                        }
                        return false;
                    }
                }
            }

            foreach (var isValidPos in isValidPosEvent)
            {
                if (!isValidPos(house))
                    return false;
            }

            return true;
        }
        public void DrawHouse(House house, IPlayer builder = null)
        {
            for (int xx = 0; xx < house.houseType.Width; ++xx)
            {
                for (int yy = 0; yy < house.houseType.Height; ++yy)
                {
                    int blockId = 22;
                    int backgroundBlock = house.houseType.BackgroundBlock;

                    if (xx == 0 || xx == house.houseType.Width - 1 || yy == 0 || yy == house.houseType.Height - 1)
                        blockId = house.houseType.WallBlock;
                    else
                        blockId = house.houseType.BaseBlock;

                    if (builder == null || (builder.BlockX != house.x + xx || builder.BlockY != house.y + yy))
                    {
                        if (!house.Furniture.ContainsKey(new BlockPos(0, xx + house.x, yy + house.y)))
                            this.bot.Room.setBlock(xx + house.x, yy + house.y, new Room.Block.NormalBlock(blockId));
                    }

                    this.bot.Room.setBlock(xx + house.x, yy + house.y, new Room.Block.NormalBlock(backgroundBlock));

                }
            }

            foreach (var v in house.Furniture)
                bot.Room.setBlock(v.Key.X, v.Key.Y, v.Value.getBlock(bot, builder, house));
        }
        public void Load()
        {
            houses.Clear();
            SaveFile saveFile = new SaveFile("data/houses");
            saveFile.Load();
            Dictionary<string, Node> nodes = saveFile.Nodes;
            if (nodes.ContainsKey("houses"))
            {
                Node houses2 = nodes["houses"];
                foreach (KeyValuePair<string, Node> house in houses2.Nodes)
                {
                    int x = int.Parse(house.Value.Nodes["x"].Value);
                    int y = int.Parse(house.Value.Nodes["y"].Value);
                    string type = house.Value.Nodes["type"].Value;

                    House newhouse = new House(houseTypes[type], house.Key, x, y, houseTypes[type].Width, houseTypes[type].Height);

                    if (house.Value.Nodes.ContainsKey("furniture"))						// <furniture>
                    {
                        Node furniture = house.Value.Nodes["furniture"];
                        foreach (KeyValuePair<string, Node> furnitures in furniture.Nodes)
                        {
                            // <x|y>
                            int furniturex = int.Parse(furnitures.Value.Nodes["x"].Value);
                            int furniturey = int.Parse(furnitures.Value.Nodes["y"].Value);
                            string furnituretype = furnitures.Value.Nodes["type"].Value;

                            Furniture newFurniture = FurnitureManager.FurnitureTypes[furnituretype].FromNode(furnitures.Value);
                            newhouse.Furniture.Add(new BlockPos(0, furniturex, furniturey), newFurniture);
                        }
                    }
                    this.houses.Add(newhouse.builder, newhouse);
                    DrawHouse(newhouse);
                }
            }
        }
        public bool BuildHouse(IPlayer builder, string houseTypeStr)
        {
            if (buildingHouses.ContainsKey(builder))
            {
                builder.Reply("You are already building a house, use !finishhouse to finish it.");
                return false;
            }

            if (houses.ContainsKey(builder.Name))
            {
                builder.Reply("You already have a house. Use !destroyhouse to delete it. ;)");
                return false;
            }

            HouseType houseType = null;

            if (!houseTypes.ContainsKey(houseTypeStr))
            {
                builder.Reply("There is no building called '" + houseTypeStr + "'!");
                ShowHouses(builder);
                return false;
            }

            houseType = houseTypes[houseTypeStr];

            // Make sure the player cna buy the house!
            if (!houseType.CanBuy(builder))
            {
                //builder.Reply("You don't have enough resources to build " + houseType.Name + ".");
                //houseType.PrintCost(builder);
                return false;
            }

            int x = builder.BlockX - houseType.Width / 2;
            int y = builder.BlockY - houseType.Height / 2;

            House house = new House(houseType, builder.Name, x, y, houseType.Width, houseType.Height, HouseState.Building);
            if (!isValidHousePosition(house))
                return false;
            buildingHouses.Add(builder, house);
            houses.Add(builder.Name, house);
            DrawHouse(house, builder);
            bot.ChatSayer.Command("/tp " + builder.Name + " " + builder.BlockX + " " + builder.BlockY);

            // Nothing went wrong, let the player pay for his house.
            houseType.Buy(builder);

            return true;
        }