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); }
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); }
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); }
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); }