Ejemplo n.º 1
0
 private static bool TryFindPlaceSpotNear(IntVec3 center, Map map, Thing thing, bool allowStacking, out IntVec3 bestSpot, Predicate <IntVec3> extraValidator = null)
 {
     GenPlace.PlaceSpotQuality placeSpotQuality = GenPlace.PlaceSpotQuality.Unusable;
     bestSpot = center;
     for (int i = 0; i < 9; i++)
     {
         IntVec3 intVec = center + GenRadial.RadialPattern[i];
         GenPlace.PlaceSpotQuality placeSpotQuality2 = GenPlace.PlaceSpotQualityAt(intVec, map, thing, center, allowStacking, extraValidator);
         if (placeSpotQuality2 > placeSpotQuality)
         {
             bestSpot         = intVec;
             placeSpotQuality = placeSpotQuality2;
         }
         if (placeSpotQuality == GenPlace.PlaceSpotQuality.Perfect)
         {
             break;
         }
     }
     if (placeSpotQuality >= GenPlace.PlaceSpotQuality.Okay)
     {
         return(true);
     }
     for (int j = 0; j < GenPlace.PlaceNearMiddleRadialCells; j++)
     {
         IntVec3 intVec = center + GenRadial.RadialPattern[j];
         GenPlace.PlaceSpotQuality placeSpotQuality2 = GenPlace.PlaceSpotQualityAt(intVec, map, thing, center, allowStacking, extraValidator);
         if (placeSpotQuality2 > placeSpotQuality)
         {
             bestSpot         = intVec;
             placeSpotQuality = placeSpotQuality2;
         }
         if (placeSpotQuality == GenPlace.PlaceSpotQuality.Perfect)
         {
             break;
         }
     }
     if (placeSpotQuality >= GenPlace.PlaceSpotQuality.Okay)
     {
         return(true);
     }
     for (int k = 0; k < GenPlace.PlaceNearMaxRadialCells; k++)
     {
         IntVec3 intVec = center + GenRadial.RadialPattern[k];
         GenPlace.PlaceSpotQuality placeSpotQuality2 = GenPlace.PlaceSpotQualityAt(intVec, map, thing, center, allowStacking, extraValidator);
         if (placeSpotQuality2 > placeSpotQuality)
         {
             bestSpot         = intVec;
             placeSpotQuality = placeSpotQuality2;
         }
         if (placeSpotQuality == GenPlace.PlaceSpotQuality.Perfect)
         {
             break;
         }
     }
     if (placeSpotQuality > GenPlace.PlaceSpotQuality.Unusable)
     {
         return(true);
     }
     bestSpot = center;
     return(false);
 }
Ejemplo n.º 2
0
        private static GenPlace.PlaceSpotQuality PlaceSpotQualityAt(IntVec3 c, Map map, Thing thing, IntVec3 center, bool allowStacking, Predicate <IntVec3> extraValidator = null)
        {
            if (!c.InBounds(map) || !c.Walkable(map))
            {
                return(GenPlace.PlaceSpotQuality.Unusable);
            }
            if (extraValidator != null && !extraValidator(c))
            {
                return(GenPlace.PlaceSpotQuality.Unusable);
            }
            List <Thing> list = map.thingGrid.ThingsListAt(c);

            for (int i = 0; i < list.Count; i++)
            {
                Thing thing2 = list[i];
                if (thing.def.saveCompressible && thing2.def.saveCompressible)
                {
                    return(GenPlace.PlaceSpotQuality.Unusable);
                }
                if (thing.def.category == ThingCategory.Item && thing2.def.category == ThingCategory.Item && (!thing2.CanStackWith(thing) || thing2.stackCount >= thing.def.stackLimit))
                {
                    return(GenPlace.PlaceSpotQuality.Unusable);
                }
            }
            if (c.GetRoom(map, RegionType.Set_Passable) == center.GetRoom(map, RegionType.Set_Passable))
            {
                if (allowStacking)
                {
                    for (int j = 0; j < list.Count; j++)
                    {
                        Thing thing3 = list[j];
                        if (thing3.def.category == ThingCategory.Item && thing3.CanStackWith(thing) && thing3.stackCount < thing.def.stackLimit)
                        {
                            return(GenPlace.PlaceSpotQuality.Perfect);
                        }
                    }
                }
                Pawn pawn = thing as Pawn;
                bool flag = pawn != null && pawn.Downed;
                GenPlace.PlaceSpotQuality placeSpotQuality = GenPlace.PlaceSpotQuality.Perfect;
                for (int k = 0; k < list.Count; k++)
                {
                    Thing thing4 = list[k];
                    if (thing4.def.IsDoor)
                    {
                        return(GenPlace.PlaceSpotQuality.Bad);
                    }
                    if (thing4 is Building_WorkTable)
                    {
                        return(GenPlace.PlaceSpotQuality.Bad);
                    }
                    Pawn pawn2 = thing4 as Pawn;
                    if (pawn2 != null)
                    {
                        if (pawn2.Downed || flag)
                        {
                            return(GenPlace.PlaceSpotQuality.Bad);
                        }
                        if (placeSpotQuality > GenPlace.PlaceSpotQuality.Okay)
                        {
                            placeSpotQuality = GenPlace.PlaceSpotQuality.Okay;
                        }
                    }
                    if (thing4.def.category == ThingCategory.Plant && thing4.def.selectable && placeSpotQuality > GenPlace.PlaceSpotQuality.Okay)
                    {
                        placeSpotQuality = GenPlace.PlaceSpotQuality.Okay;
                    }
                }
                return(placeSpotQuality);
            }
            if (!map.reachability.CanReach(center, c, PathEndMode.OnCell, TraverseMode.PassDoors, Danger.Deadly))
            {
                return(GenPlace.PlaceSpotQuality.Awful);
            }
            return(GenPlace.PlaceSpotQuality.Bad);
        }