// TODO: review logic
        public static bool CanReachImmediate(IntVec3 start, LocalTargetInfo target, Map map, PathEndMode peMode, Thing thing)
        {
            if (!target.IsValid)
            {
                return(false);
            }

            // TODO
            //target = (LocalTargetInfo)GenPath.ResolvePathMode(pawn, target.ToTargetInfo(map), ref peMode);

            if (target.HasThing)
            {
                Thing thing2 = target.Thing;
                if (!thing2.Spawned)
                {
                    return(false);
                }
                if (thing2.Map != map)
                {
                    return(false);
                }
            }
            if (!target.HasThing || (target.Thing.def.size.x == 1 && target.Thing.def.size.z == 1))
            {
                if (start == target.Cell)
                {
                    return(true);
                }
            }
            else if (start.IsInside(target.Thing))
            {
                return(true);
            }
            return(peMode == PathEndMode.Touch && TouchPathEndModeUtility.IsAdjacentOrInsideAndAllowedToTouch(start, target, map));
        }
        public static bool CanReachImmediate(IntVec3 start, LocalTargetInfo target, Map map, PathEndMode peMode, Pawn pawn)
        {
            if (!target.IsValid)
            {
                return(false);
            }
            target = (LocalTargetInfo)GenPath.ResolvePathMode(pawn, target.ToTargetInfo(map), ref peMode);
            if (target.HasThing)
            {
                Thing thing = target.Thing;
                if (thing.Spawned)
                {
                    if (thing.Map != map)
                    {
                        return(false);
                    }
                    goto IL_00d3;
                }
                if (pawn != null)
                {
                    if (pawn.carryTracker.innerContainer.Contains(thing))
                    {
                        return(true);
                    }
                    if (pawn.inventory.innerContainer.Contains(thing))
                    {
                        return(true);
                    }
                    if (pawn.apparel != null && pawn.apparel.Contains(thing))
                    {
                        return(true);
                    }
                    if (pawn.equipment != null && pawn.equipment.Contains(thing))
                    {
                        return(true);
                    }
                }
                return(false);
            }
            goto IL_00d3;
IL_00d3:
            if (!target.HasThing || (target.Thing.def.size.x == 1 && target.Thing.def.size.z == 1))
            {
                if (start == target.Cell)
                {
                    return(true);
                }
            }
            else if (start.IsInside(target.Thing))
            {
                return(true);
            }
            if (peMode == PathEndMode.Touch && TouchPathEndModeUtility.IsAdjacentOrInsideAndAllowedToTouch(start, target, map))
            {
                return(true);
            }
            return(false);
        }
Пример #3
0
            private static void Prefix(ref Building_Cage[] __state, Map ___map, ref IntVec3 start, ref LocalTargetInfo dest,
                                       TraverseParms traverseParms, PathEndMode peMode)
            {
                if (traverseParms.pawn is null)
                {
                    return;
                }
                var map = ___map;

                (var cage1, var cage2) = (start.CageHere(map), dest.Cell.CageHere(map));
                __state = new Building_Cage[] { cage1, cage2 };
                foreach (var cage in map.CagesOnMap())
                {
                    if (cage1 != cage && cage2 != cage)
                    {
                        cage.isBlocking = true;
                    }
                }
                if (cage1 != null && (peMode == PathEndMode.Touch || peMode == PathEndMode.ClosestTouch) &&
                    TouchPathEndModeUtility.IsAdjacentOrInsideAndAllowedToTouch(start, dest, traverseParms.pawn.Map))
                {
                    dest = dest.Cell.ClampInsideRect(cage1.OccupiedRect());
                    return;
                }
                if (cage1 == cage2)
                {
                    if (cage1 != null)
                    {
                        cage1.pathCost = 0;
                    }
                    return;
                }
                if (cage1 != null)
                {
                    var spot1 = cage1.InteractionCell;
                    var spot2 = cage1.EntranceCell;
                    dest           = start == spot2 ? spot1 : spot2;
                    cage1.pathCost = 0;
                }
                else
                {
                    var spot1 = cage2.InteractionCell;
                    dest           = start == spot1 ? cage2.EntranceCell : spot1;
                    cage2.pathCost = 8000;
                }
            }
Пример #4
0
        public static bool Reachable(IntVec3 start, LocalTargetInfo dest, PathEndMode peMode,
                                     TraverseParms traverseParams)
        {
            var pawn = traverseParams.pawn;

            if (pawn is null || !pawn.IsCaptiveOf(null))
            {
                return(false);
            }
            if ((peMode == PathEndMode.Touch || peMode == PathEndMode.ClosestTouch) && TouchPathEndModeUtility.
                IsAdjacentOrInsideAndAllowedToTouch(start, dest, pawn.Map))
            {
                return(true);
            }
            else if (dest.Cell.IsInside(pawn.CurrentCage()))
            {
                return(true);
            }
            return(false);
        }