コード例 #1
0
        public static bool TryFindBestBetterStoreCellFor(Thing t, Pawn carrier, Map map, StoragePriority currentPriority, Faction faction, out IntVec3 foundCell, bool needAccurateResult = true)
        {
            List <SlotGroup> allGroupsListInPriorityOrder = map.slotGroupManager.AllGroupsListInPriorityOrder;

            if (allGroupsListInPriorityOrder.Count == 0)
            {
                foundCell = IntVec3.Invalid;
                return(false);
            }
            IntVec3         a = (!t.SpawnedOrAnyParentSpawned) ? carrier.PositionHeld : t.PositionHeld;
            StoragePriority storagePriority = currentPriority;
            float           num             = 2.14748365E+09f;
            IntVec3         intVec          = default(IntVec3);
            bool            flag            = false;
            int             count           = allGroupsListInPriorityOrder.Count;
            int             num2            = 0;

            while (num2 < count)
            {
                SlotGroup       slotGroup = allGroupsListInPriorityOrder[num2];
                StoragePriority priority  = slotGroup.Settings.Priority;
                if ((int)priority >= (int)storagePriority && (int)priority > (int)currentPriority)
                {
                    if (slotGroup.Settings.AllowedToAccept(t))
                    {
                        List <IntVec3> cellsList = slotGroup.CellsList;
                        int            count2    = cellsList.Count;
                        int            num3      = needAccurateResult ? Mathf.FloorToInt((float)count2 * Rand.Range(0.005f, 0.018f)) : 0;
                        for (int i = 0; i < count2; i++)
                        {
                            IntVec3 intVec2 = cellsList[i];
                            float   num4    = (float)(a - intVec2).LengthHorizontalSquared;
                            if (!(num4 > num) && StoreUtility.IsGoodStoreCell(intVec2, map, t, carrier, faction))
                            {
                                flag            = true;
                                intVec          = intVec2;
                                num             = num4;
                                storagePriority = priority;
                                if (i >= num3)
                                {
                                    break;
                                }
                            }
                        }
                    }
                    num2++;
                    continue;
                }
                break;
            }
            if (!flag)
            {
                foundCell = IntVec3.Invalid;
                return(false);
            }
            foundCell = intVec;
            return(true);
        }
コード例 #2
0
        private static void TryFindBestBetterStoreCellForWorker(Thing t, Pawn carrier, Map map, Faction faction, SlotGroup slotGroup, bool needAccurateResult, ref IntVec3 closestSlot, ref float closestDistSquared, ref StoragePriority foundPriority)
        {
            if (!slotGroup.parent.Accepts(t))
            {
                return;
            }
            IntVec3        a         = (!t.SpawnedOrAnyParentSpawned) ? carrier.PositionHeld : t.PositionHeld;
            List <IntVec3> cellsList = slotGroup.CellsList;
            int            count     = cellsList.Count;
            int            num;

            if (needAccurateResult)
            {
                num = Mathf.FloorToInt((float)count * Rand.Range(0.005f, 0.018f));
            }
            else
            {
                num = 0;
            }
            for (int i = 0; i < count; i++)
            {
                IntVec3 intVec = cellsList[i];
                float   num2   = (float)(a - intVec).LengthHorizontalSquared;
                if (num2 <= closestDistSquared)
                {
                    if (StoreUtility.IsGoodStoreCell(intVec, map, t, carrier, faction))
                    {
                        closestSlot        = intVec;
                        closestDistSquared = num2;
                        foundPriority      = slotGroup.Settings.Priority;
                        if (i >= num)
                        {
                            break;
                        }
                    }
                }
            }
        }
コード例 #3
0
        private IntVec3 FindRandomDropCell(Pawn pawn, Pawn downedPawn)
        {
            IntVec3 cell = pawn.mindState.duty.focusSecond.Cell;

            return(CellFinder.RandomClosewalkCellNear(cell, pawn.Map, 6, (IntVec3 x) => x.Standable(pawn.Map) && StoreUtility.IsGoodStoreCell(x, pawn.Map, downedPawn, pawn, pawn.Faction)));
        }
コード例 #4
0
 public static bool TryFindStoreCellNearColonyDesperate(Thing item, Pawn carrier, out IntVec3 storeCell)
 {
     if (StoreUtility.TryFindBestBetterStoreCellFor(item, carrier, carrier.Map, StoragePriority.Unstored, carrier.Faction, out storeCell, true))
     {
         return(true);
     }
     for (int i = -4; i < 20; i++)
     {
         int     num    = (i >= 0) ? i : Rand.RangeInclusive(0, 4);
         IntVec3 intVec = carrier.Position + GenRadial.RadialPattern[num];
         if (intVec.InBounds(carrier.Map) && carrier.Map.areaManager.Home[intVec] && carrier.CanReach(intVec, PathEndMode.ClosestTouch, Danger.Deadly, false, TraverseMode.ByPawn) && intVec.GetSlotGroup(carrier.Map) == null && StoreUtility.IsGoodStoreCell(intVec, carrier.Map, item, carrier, carrier.Faction))
         {
             storeCell = intVec;
             return(true);
         }
     }
     if (RCellFinder.TryFindRandomSpotJustOutsideColony(carrier.Position, carrier.Map, carrier, out storeCell, (IntVec3 x) => x.GetSlotGroup(carrier.Map) == null && StoreUtility.IsGoodStoreCell(x, carrier.Map, item, carrier, carrier.Faction)))
     {
         return(true);
     }
     storeCell = IntVec3.Invalid;
     return(false);
 }
コード例 #5
0
 internal bool <> m__0(IntVec3 x)
 {
     return(x.GetSlotGroup(this.carrier.Map) == null && StoreUtility.IsGoodStoreCell(x, this.carrier.Map, this.item, this.carrier, this.carrier.Faction));
 }