Пример #1
0
        protected override IEnumerable <Toil> MakeNewToils()
        {
            Toil followAndAttack = new Toil();

            followAndAttack.tickAction = delegate()
            {
                Pawn  actor  = followAndAttack.actor;
                Job   curJob = actor.jobs.curJob;
                Thing thing  = curJob.GetTarget(TargetIndex.A).Thing;
                Pawn  pawn   = thing as Pawn;
                bool  flag   = this.pawn.Faction != Faction.OfPlayer;
                bool  flag2  = flag;
                if (flag2)
                {
                    actor.mindState.mentalStateHandler.TryStartMentalState(DefDatabase <MentalStateDef> .GetNamed("MurderousRage", true), null, false, false, null);
                }
                bool flag3 = thing != actor.pather.Destination.Thing || (!this.pawn.pather.Moving && !GenAdj.AdjacentTo8WayOrInside(this.pawn.Position, thing));
                bool flag4 = flag3;
                if (flag4)
                {
                    actor.pather.StartPath(thing, PathEndMode.Touch);
                }
                else
                {
                    bool flag5 = GenAdj.AdjacentTo8WayOrInside(this.pawn.Position, thing);
                    bool flag6 = flag5;
                    if (flag6)
                    {
                        bool flag7 = thing is Pawn && pawn.Downed && !curJob.killIncappedTarget;
                        bool flag8 = flag7;
                        if (flag8)
                        {
                            this.EndJobWith(JobCondition.Succeeded);
                        }
                        bool flag9  = actor.meleeVerbs.TryMeleeAttack(thing, null, false);
                        bool flag10 = flag9;
                        if (flag10)
                        {
                            this.numMeleeAttacksLanded += 1;
                            bool flag11 = this.numMeleeAttacksLanded >= curJob.maxNumMeleeAttacks;
                            bool flag12 = flag11;
                            if (flag12)
                            {
                                this.EndJobWith(JobCondition.Succeeded);
                            }
                        }
                    }
                }
            };
            followAndAttack.defaultCompleteMode = ToilCompleteMode.Never;
            ToilFailConditions.EndOnDespawnedOrNull <Toil>(followAndAttack, TargetIndex.A, JobCondition.Succeeded);
            ToilFailConditions.FailOn <Toil>(followAndAttack, new Func <bool>(this.hunterIsKilled));
            yield return(followAndAttack);

            yield break;
        }
        public static bool CanPotentiallyLinkTo_Static(ThingDef facilityDef, IntVec3 facilityPos, Rot4 facilityRot, ThingDef myDef, IntVec3 myPos, Rot4 myRot)
        {
            CompProperties_Facility compProperties = facilityDef.GetCompProperties <CompProperties_Facility>();

            if (compProperties.mustBePlacedAdjacent)
            {
                CellRect rect  = GenAdj.OccupiedRect(myPos, myRot, myDef.size);
                CellRect rect2 = GenAdj.OccupiedRect(facilityPos, facilityRot, facilityDef.size);
                if (!GenAdj.AdjacentTo8WayOrInside(rect, rect2))
                {
                    return(false);
                }
            }
            if (compProperties.mustBePlacedAdjacentCardinalToBedHead)
            {
                if (!myDef.IsBed)
                {
                    return(false);
                }
                CellRect other = GenAdj.OccupiedRect(facilityPos, facilityRot, facilityDef.size);
                bool     flag  = false;
                int      sleepingSlotsCount = BedUtility.GetSleepingSlotsCount(myDef.size);
                for (int i = 0; i < sleepingSlotsCount; i++)
                {
                    IntVec3 sleepingSlotPos = BedUtility.GetSleepingSlotPos(i, myPos, myRot, myDef.size);
                    if (sleepingSlotPos.IsAdjacentToCardinalOrInside(other))
                    {
                        flag = true;
                    }
                }
                if (!flag)
                {
                    return(false);
                }
            }
            if (!compProperties.mustBePlacedAdjacent && !compProperties.mustBePlacedAdjacentCardinalToBedHead)
            {
                Vector3 a = Gen.TrueCenter(myPos, myRot, myDef.size, myDef.Altitude);
                Vector3 b = Gen.TrueCenter(facilityPos, facilityRot, facilityDef.size, facilityDef.Altitude);
                if (Vector3.Distance(a, b) > compProperties.maxDistance)
                {
                    return(false);
                }
            }
            return(true);
        }