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