private static IntVec3 GetRestSpot(IntVec3 originCell, Danger maxDanger, Pawn me) { if (!(me is PawnConverted)) { return(originCell); } var currentDanger = me.Position.GetDangerFor(me); var danger = (Danger)Math.Max((int)maxDanger, (int)currentDanger); Predicate <IntVec3> validator = c => c.Standable() && Find.RoofGrid.Roofed(c) && CoverUtility.TotalSurroundingCoverScore(c) > 2.5f && !NextToDoor(c, me) && originCell.CanReach(c, PathEndMode.OnCell, TraverseMode.PassDoors, danger); if (validator(originCell) && InRange(originCell, me, 20)) { return(originCell); } for (int i = 0; i < 50; i++) { Thing thing = GetRandom(Find.ListerBuildings.allBuildingsColonist); if (thing == null) { thing = GetRandom(Find.ListerBuildings.allBuildingsColonistCombatTargets); } if (thing == null) { thing = GetRandom(Find.ListerPawns.FreeColonists); } if (thing == null) { thing = GetRandom(Find.ListerPawns.ColonistsAndPrisoners); } if (thing == null) { break; } IntVec3 result; if (CellFinder.TryFindRandomCellNear(thing.Position, 10, validator, out result)) { return(result); } } Predicate <IntVec3> simpleValidator = c => c.Standable() && CoverUtility.TotalSurroundingCoverScore(c) > 1 && !NextToDoor(c, me) && originCell.CanReach(c, PathEndMode.OnCell, TraverseMode.PassDoors, danger); IntVec3 randomCell; return(CellFinder.TryFindRandomCellNear(originCell, 20, simpleValidator, out randomCell) ? randomCell : originCell); }
public override AcceptanceReport CanDesignateCell(IntVec3 loc) { if (loc.CanReach(vehicle, PathEndMode.OnCell, TraverseMode.ByPawn, Danger.Deadly)) return true; else return new AcceptanceReport(txtCannotMove.Translate()); }
public override AcceptanceReport CanDesignateCell(IntVec3 loc) { if (loc.CanReach(driver, PathEndMode.OnCell, TraverseMode.ByPawn, Danger.Deadly)) { return(true); } return(new AcceptanceReport(txtCannotMove.Translate())); }
public static Thing ClosestThing_Global_Reachable(IntVec3 center, IEnumerable<Thing> searchSet, PathEndMode pathMode, TraverseParms traverseParams, float maxDistance, Pawn pawn) { if (searchSet == null) { return null; } int num = 0; int num2 = 0; Thing result = null; int num3 = -2147483648; int num4 = 0; float num5 = maxDistance * maxDistance; float num6 = 2.14748365E+09f; foreach (Thing current in searchSet) { num2++; float lengthHorizontalSquared = (center - current.Position).LengthHorizontalSquared; if (lengthHorizontalSquared <= num5) { if (num4 > num3 || lengthHorizontalSquared < num6) { if (center.CanReach(current, pathMode, traverseParams)) { if (current.SpawnedInWorld) { if(((Building_DroidChargePad)current).IsAvailable(pawn)) { result = current; num6 = lengthHorizontalSquared; num3 = num4; num++; } } } } } } return result; }
// overhauled version (vanilla is bugged) public static PlaceSpotQuality PlaceSpotQualityAt(IntVec3 c, Thing thing, IntVec3 center) { if (!c.InBounds() || !c.Walkable()) { return PlaceSpotQuality.Unusable; } List<Thing> list = Find.ThingGrid.ThingsListAt(c); // if other things on cell int i = 0; while (i < list.Count) { Thing thing2 = list[i]; if (thing.def.saveCompressible && thing2.def.saveCompressible) { return PlaceSpotQuality.Unusable; } // same thing type if (thing2.def.category == ThingCategory.Item) { // can stack with if (thing2.def == thing.def && thing2.stackCount < thing.def.stackLimit) { // can absorb // Required, because thing reference is changed to the absorber, if absorbed Thing t = thing2; if (thing.TryAbsorbStack(thing2, true)) { // Clean up to prevent haulables lists overflow RemoveHaulableFromLists(t); return PlaceSpotQuality.Perfect; } // cannot absorb all/anything else return PlaceSpotQuality.Unusable; } return PlaceSpotQuality.Unusable; } else { i++; } } // if in same room if (c.GetRoom() == center.GetRoom()) { PlaceSpotQuality placeSpotQuality = PlaceSpotQuality.Perfect; for (int j = 0; j < list.Count; j++) { Thing thing3 = list[j]; if (thing3.def.thingClass == typeof(Building_Door)) { return PlaceSpotQuality.Bad; } Pawn pawn = thing3 as Pawn; if (pawn != null) { if (pawn.Downed) { return PlaceSpotQuality.Bad; } if (placeSpotQuality > PlaceSpotQuality.Okay) { placeSpotQuality = PlaceSpotQuality.Okay; } } if (thing3.def.category == ThingCategory.Plant && thing3.def.selectable && placeSpotQuality > PlaceSpotQuality.Okay) { placeSpotQuality = PlaceSpotQuality.Okay; } } return placeSpotQuality; } if (!center.CanReach(c, PathEndMode.OnCell, TraverseMode.PassDoors, Danger.Deadly)) { return PlaceSpotQuality.Awful; } return PlaceSpotQuality.Okay; }
public static Thing ClosestThingReachable_JT(IntVec3 root, ThingRequest thingReq, PathEndMode peMode, TraverseParms traverseParams, float maxDistance = 9999f, Predicate <Thing> validator = null, IEnumerable <Thing> customGlobalSearchSet = null, int searchRegionsMax = -1, bool forceGlobalSearch = false) { //customGlobalSearchSet in context of hauling is list of things to be hauled //forceGlobalSearch is true when customGlobalSearchSet is not null //searchRegionMax is only used for cleaning ProfilerThreadCheck.BeginSample("ClosestThingReachable"); //Guessing if searchRegionsMax is > 0, customGlobalSearchSet is not suppose to be used. if (searchRegionsMax > 0 && customGlobalSearchSet != null && !forceGlobalSearch) { Log.ErrorOnce("searchRegionsMax > 0 && customGlobalSearchSet != null && !forceGlobalSearch. customGlobalSearchSet will never be used.", 634984); } //There is no null check for thingReq, always not null? //if thingReq group == nothing || //if there is thingReq and customGlobalSearchSet is null and there are things matching thingReq if (EarlyOutSearch_JT(root, thingReq, customGlobalSearchSet)) { ProfilerThreadCheck.EndSample(); return(null); } //Use either searchRegionsMax or customGlobalSearchSet //We're interested in thingReq.group == HaulableEver, HaulableAlways, HaulableEverOrMinifiable //This means customGlobalSearch has to have something (when there are such items on map) --> correct //Actual stuff begins? Thing thing = null; //IsUndefined == singleDef == null && thingReq group == Undefined if (!thingReq.IsUndefined) { //The debug bellow only resuted in group == Pawn, 7 times with 3 pawns all set only to haul, perhaps dogs loving? //Therefore probably ignore this if //Log.Message("First if was called. " + thingReq.group.ToString()); //Hauling: searchRegionsMax should be -1 --> maxRegions = 30 int maxRegions = (searchRegionsMax <= 0) ? 30 : searchRegionsMax; thing = GenClosest.RegionwiseBFSWorker(root, thingReq, peMode, traverseParams, validator, null, 0, maxRegions, maxDistance); } if (thing == null && (searchRegionsMax < 0 || forceGlobalSearch)) { //validator = (Thing t) => !t.IsForbidden(pawn) && scanner.HasJobOnThing(pawn, t); //Debug bellow gives thingReq group to be Undefined, skips first //Log.Message("First if resulted in null " + thingReq.group.ToString()); Predicate <Thing> validator2 = (Thing t) => root.CanReach(t, peMode, traverseParams) && (validator == null || validator(t)); IEnumerable <Thing> searchSet = customGlobalSearchSet ?? Find.ListerThings.ThingsMatching(thingReq); //Main start of my code List <Thing> degrade = new List <Thing>(); List <Thing> undegrade = new List <Thing>(); //Seperate into degrade or not foreach (Thing t in searchSet) { if (t.GetStatValue(StatDefOf.DeteriorationRate) > 0) { degrade.Add(t); } else { undegrade.Add(t); } } //Loop through all haul areas in order foreach (Area a in AreaFinder.getHaulAreas()) { //Check if got degradable item thing = GenClosest.ClosestThing_Global(root, AreaFinder.searcher(a, degrade), maxDistance, validator2); if (thing != null) { break; } //Check if got undegradable item thing = GenClosest.ClosestThing_Global(root, AreaFinder.searcher(a, undegrade), maxDistance, validator2); if (thing != null) { break; } } if (thing == null) { thing = GenClosest.ClosestThing_Global(root, degrade, maxDistance, validator2); if (thing == null) { thing = GenClosest.ClosestThing_Global(root, undegrade, maxDistance, validator2); } } /* old 50 cell code * thing = GenClosest.ClosestThing_Global(root, degrade, 50f, validator2); //If there is degradable with 50 cells * if (thing == null) * { * thing = GenClosest.ClosestThing_Global(root, undegrade, 50f, validator2);//If there is undegradable with 50 cells * if (thing == null) * { * thing = GenClosest.ClosestThing_Global(root, degrade, maxDistance, validator2); //If there is degradable * if (thing == null) * { * thing = GenClosest.ClosestThing_Global(root, undegrade, maxDistance, validator2); //If there is undegradable * } * } * } */ //Main end of my code } /* * if (thing != null) * { * Log.Message(thing.def.defName); * } * else { * Log.Message("Resulted in null"); * }*/ ProfilerThreadCheck.EndSample(); return(thing); }
// overhauled version (vanilla is bugged) public static PlaceSpotQuality PlaceSpotQualityAt(IntVec3 c, Thing thing, IntVec3 center) { if (!c.InBounds() || !c.Walkable()) { return(PlaceSpotQuality.Unusable); } List <Thing> list = Find.ThingGrid.ThingsListAt(c); // if other things on cell int i = 0; while (i < list.Count) { Thing thing2 = list[i]; if (thing.def.saveCompressible && thing2.def.saveCompressible) { return(PlaceSpotQuality.Unusable); } // same thing type if (thing2.def.category == ThingCategory.Item) { // can stack with if (thing2.def == thing.def && thing2.stackCount < thing.def.stackLimit) { // can absorb // Required, because thing reference is changed to the absorber, if absorbed Thing t = thing2; if (thing.TryAbsorbStack(thing2, true)) { // Clean up to prevent haulables lists overflow RemoveHaulableFromLists(t); return(PlaceSpotQuality.Perfect); } // cannot absorb all/anything else { return(PlaceSpotQuality.Unusable); } } return(PlaceSpotQuality.Unusable); } else { i++; } } // if in same room if (c.GetRoom() == center.GetRoom()) { PlaceSpotQuality placeSpotQuality = PlaceSpotQuality.Perfect; for (int j = 0; j < list.Count; j++) { Thing thing3 = list[j]; if (thing3.def.thingClass == typeof(Building_Door)) { return(PlaceSpotQuality.Bad); } Pawn pawn = thing3 as Pawn; if (pawn != null) { if (pawn.Downed) { return(PlaceSpotQuality.Bad); } if (placeSpotQuality > PlaceSpotQuality.Okay) { placeSpotQuality = PlaceSpotQuality.Okay; } } if (thing3.def.category == ThingCategory.Plant && thing3.def.selectable && placeSpotQuality > PlaceSpotQuality.Okay) { placeSpotQuality = PlaceSpotQuality.Okay; } } return(placeSpotQuality); } if (!center.CanReach(c, PathEndMode.OnCell, TraverseMode.PassDoors, Danger.Deadly)) { return(PlaceSpotQuality.Awful); } return(PlaceSpotQuality.Okay); }
internal static _GenPlace._PlaceSpotQuality _PlaceSpotQualityAt(IntVec3 c, Thing thing, IntVec3 center) { if ( (!c.InBounds()) || (!c.Walkable()) ) { return(_GenPlace._PlaceSpotQuality.Unusable); } List <Thing> list = Find.ThingGrid.ThingsListAt(c); for (int index = 0; index < list.Count; ++index) { Thing thing1 = list[index]; if ( (thing.def.saveCompressible) && (thing1.def.saveCompressible) ) { return(_GenPlace._PlaceSpotQuality.Unusable); } if (thing1.def.category == ThingCategory.Item) { return (( (thing1.def == thing.def) && (thing1.stackCount < thing.def.stackLimit) ) ? _GenPlace._PlaceSpotQuality.Perfect : _GenPlace._PlaceSpotQuality.Unusable); } } if (c.GetRoom() != center.GetRoom()) { return ((!center.CanReach(c, PathEndMode.OnCell, TraverseMode.PassDoors, Danger.Deadly)) ? _GenPlace._PlaceSpotQuality.Awful : _GenPlace._PlaceSpotQuality.Bad); } _GenPlace._PlaceSpotQuality placeSpotQuality = _GenPlace._PlaceSpotQuality.Perfect; for (int index = 0; index < list.Count; ++index) { Thing thing1 = list[index]; if ( (thing1.def.thingClass == typeof(Building_Door)) || (thing1.def.thingClass.IsSubclassOf(typeof(Building_Door))) ) { return(_GenPlace._PlaceSpotQuality.Bad); } Pawn pawn = thing1 as Pawn; if (pawn != null) { if (pawn.Downed) { return(_GenPlace._PlaceSpotQuality.Bad); } if (placeSpotQuality > _GenPlace._PlaceSpotQuality.Okay) { placeSpotQuality = _GenPlace._PlaceSpotQuality.Okay; } } if ( (thing1.def.category == ThingCategory.Plant) && (thing1.def.selectable) && (placeSpotQuality > _GenPlace._PlaceSpotQuality.Okay) ) { placeSpotQuality = _GenPlace._PlaceSpotQuality.Okay; } } return(placeSpotQuality); }