Esempio n. 1
0
        public override bool HasJobOnThing(Pawn pawn, Thing t, bool forced = false)
        {
            if (!(t is DiningSpot spot))
            {
                return(false);
            }
            if (RestaurantUtility.IsRegionDangerous(pawn, spot.GetRegion()) && !forced)
            {
                return(false);
            }
            if (spot.GetReservationSpots().Any(s => s == SpotState.Clear || s > SpotState.Ready))
            {
                var canReserve = pawn.Map.reservationManager.CanReserve(pawn, spot);
                if (!canReserve)
                {
                    //var reserver = pawn.Map.reservationManager.FirstRespectedReserver(spot, pawn);
                    //Log.Message($"{pawn.NameShortColored} can't reserve {spot.Position} for making. Is reserved by {reserver?.NameShortColored}. ");
                    return(false);
                }

                //Log.Message($"{pawn.NameShortColored} can make table at {spot.Position}.");
                return(true);
            }

            return(false);
        }
Esempio n. 2
0
        public static DiningSpot FindDiningSpotFor([NotNull] Pawn pawn, bool allowDrug, Predicate <Thing> extraSpotValidator = null)
        {
            const int maxRegionsToScan  = 1000;
            const int maxDistanceToScan = 1000; // TODO: Make mod option?

            var restaurant = pawn.GetRestaurant();

            if (restaurant == null)
            {
                return(null);
            }
            if (!restaurant.Stock.HasAnyFoodFor(pawn, allowDrug))
            {
                return(null);
            }

            bool Validator(Thing thing)
            {
                var spot = (DiningSpot)thing;

                //Log.Message($"Validating spot for {pawn.NameShortColored}: social = {spot.IsSociallyProper(pawn)}, political = {spot.IsPoliticallyProper(pawn)}, "
                //            + $"canReserve = {pawn.CanReserve(spot, spot.GetMaxReservations(), 0)}, canDineHere = {spot.MayDineHere(pawn)}, "
                //            + $"extraValidator = { extraSpotValidator == null || extraSpotValidator.Invoke(spot)}");
                return(!spot.IsForbidden(pawn) && spot.IsSociallyProper(pawn) && spot.IsPoliticallyProper(pawn) && CanReserve(pawn, spot) && !spot.HostileTo(pawn) &&
                       spot.CanDineHere(pawn) && !RestaurantUtility.IsRegionDangerous(pawn, JobUtility.MaxDangerDining, spot.GetRegion()) && (extraSpotValidator == null || extraSpotValidator.Invoke(spot)));
            }

            var diningSpot = (DiningSpot)GenClosest.ClosestThingReachable(pawn.Position, pawn.Map, ThingRequest.ForDef(diningSpotDef),
                                                                          PathEndMode.ClosestTouch, TraverseParms.For(pawn), maxDistanceToScan, Validator, null, 0,
                                                                          maxRegionsToScan);

            return(diningSpot);
        }
Esempio n. 3
0
        public override bool HasJobOnThing(Pawn pawn, Thing t, bool forced = false)
        {
            if (!(t is Pawn patron))
            {
                return(false);
            }
            if (pawn == t)
            {
                return(false);
            }
            var driver = patron.GetDriver <JobDriver_Dine>();

            if (driver == null || !driver.wantsToOrder)
            {
                return(false);
            }

            var canReserve = pawn.Map.reservationManager.CanReserve(pawn, patron, 1, -1, null, forced);

            if (!canReserve)
            {
                var reserver = pawn.Map.reservationManager.FirstRespectedReserver(patron, pawn);
                //Log.Message($"{pawn.NameShortColored} can't reserve {patron.NameShortColored}. Is reserved by {reserver?.NameShortColored}. ");
                return(false);
            }
            if (RestaurantUtility.IsRegionDangerous(pawn, patron.GetRegion()) && !forced)
            {
                return(false);
            }

            return(true);
        }
Esempio n. 4
0
        public override bool HasJobOnThing(Pawn pawn, Thing t, bool forced = false)
        {
            if (!(t is Pawn patron))
            {
                return(false);
            }

            if (pawn == t)
            {
                return(false);
            }

            var driver = patron.GetDriver <JobDriver_Dine>();

            if (driver == null || driver.wantsToOrder)
            {
                return(false);
            }

            var restaurant = pawn.GetRestaurant();
            var order      = restaurant.Orders.GetOrderFor(patron);

            if (order == null)
            {
                return(false);
            }
            if (order.delivered)
            {
                return(false);
            }

            if (restaurant.Orders.IsBeingDelivered(order))
            {
                return(false);
            }

            if (!patron.Spawned || patron.Dead)
            {
                Log.Message($"Order canceled. null? {order.patron == null} dead? {order.patron.Dead} unspawned? {!order.patron?.Spawned}");
                restaurant.Orders.CancelOrder(order);
                return(false);
            }

            //Log.Message($"{pawn.NameShortColored} is trying to serve {patron.NameShortColored} a {order.consumableDef.label}.");
            var consumable = restaurant.Stock.GetServableThing(order, pawn);

            if (consumable == null)
            {
                Log.Message($"Nothing found that matches order.");
                return(false);
            }

            if (RestaurantUtility.IsRegionDangerous(pawn, JobUtility.MaxDangerServing, patron.GetRegion()) && !forced)
            {
                return(false);
            }
            if (RestaurantUtility.IsRegionDangerous(pawn, JobUtility.MaxDangerServing, consumable.GetRegion()) && !forced)
            {
                return(false);
            }

            //Log.Message($"{pawn.NameShortColored} can serve {consumable.Label} to {order.patron.NameShortColored}.");
            order.consumable = consumable; // Store for JobOnThing
            return(true);
        }