public static bool PlaceThing(this Thing wanted, Pawn pawn, IEnumerable <IntVec3> roomCells, Rot4 rot, Room room,
                                      out Job furnitureJobResult)
        {
            rot = wanted.def.rotatable ? rot: Rot4.North;
            foreach (var vec3 in roomCells.InRandomOrder())
            {
                if (!GenConstruct.CanPlaceBlueprintAt(wanted.GetInnerIfMinified().def, vec3, rot, room.Map)
                    .Accepted)
                {
#if DEBUG
                    Log.Message("Not Place-able");
#endif
                    continue;
                }

                var bp = wanted.BlueprintInstall(pawn, vec3, room, rot);

                if (bp == null)
                {
#if DEBUG
                    Log.Message("Couldn't place blueprint, oops");
#endif
                    continue;
                }

                var job = bp.InstallJob(pawn);

                if (job != null)
                {
                    {
                        furnitureJobResult = job;
                        return(true);
                    }
                }
#if DEBUG
                Log.Message("No job for bp");
#endif
            }

            furnitureJobResult = null;
            return(false);
        }
        public static bool PlaceThing(this Thing wanted, Pawn pawn, IEnumerable <IntVec3> roomCells, Rot4 rot, Room room,
                                      out Job furnitureJobResult)
        {
            var defToPlace = wanted.GetInnerIfMinified().def;

            rot = defToPlace.rotatable ? rot : Rot4.North;
            var roomBorder = room.BorderCells;
            var wallCells  = roomCells.Where(cell => IsNextToBorder(cell, roomBorder)).InRandomOrder();
            var innerCells = roomCells.Where(cell => !wallCells.Contains(cell)).InRandomOrder();
            var firstList  = true;

            foreach (var listOfCells in new List <IEnumerable <IntVec3> > {
                wallCells, innerCells
            })
            {
                foreach (var vec3 in listOfCells)
                {
                    var placeRot = rot;
                    if (defToPlace.rotatable && firstList)
                    {
                        for (var i = 0; i < 4; i++)
                        {
                            if (roomCells.Contains(vec3 + GenAdj.CardinalDirections[i]))
                            {
                                continue;
                            }

                            placeRot = new Rot4(i).Opposite;
#if DEBUG
                            Log.Message($"Found cell next to a wall, will place with rotation {placeRot}");
#endif
                            if (new Random().Next(2) == 0)
                            {
                                break;
                            }
                        }
                    }

                    if (defToPlace.size.Area > 1)
                    {
                        var cellsCovered = GenAdj.OccupiedRect(vec3, placeRot, defToPlace.Size);
                        if (cellsCovered.Any(cell => !roomCells.Contains(cell)))
                        {
#if DEBUG
                            Log.Message("Placed furniture would cover a non-room cell (probably the door-entrance)");
#endif
                            continue;
                        }
                    }

                    if (!GenConstruct.CanPlaceBlueprintAt(defToPlace, vec3, placeRot, room.Map).Accepted)
                    {
#if DEBUG
                        Log.Message("Not Place-able");
#endif
                        continue;
                    }

                    if (vec3.GetFirstBuilding(room.Map)?.def == defToPlace)
                    {
#if DEBUG
                        Log.Message("Placed furniture would have replaced an item");
#endif
                        continue;
                    }

                    var bp = wanted.BlueprintInstall(pawn, vec3, room, placeRot);

                    if (bp == null)
                    {
#if DEBUG
                        Log.Message("Couldn't place blueprint, oops");
#endif
                        continue;
                    }

                    var job = bp.InstallJob(pawn);

                    if (job == null)
                    {
                        continue;
                    }

                    furnitureJobResult = job;
                    return(true);

#if DEBUG
                    Log.Message("No job for bp");
#endif
                }

                firstList = false;
            }

            furnitureJobResult = null;
            return(false);
        }