コード例 #1
0
 public static bool isXenomorph(this Pawn p, out Comp_Xenomorph comp)
 {
     comp = p.TryGetComp <Comp_Xenomorph>() ?? null;
     return(p.RaceProps.FleshType == XenomorphRacesDefOf.RRY_Xenomorph);
 }
コード例 #2
0
        // Token: 0x060005B7 RID: 1463 RVA: 0x00037A28 File Offset: 0x00035E28
        protected override Job TryGiveJob(Pawn pawn)
        {
            if (pawn.GetLord() != null && pawn.GetLord() is Lord lord)
            {
                if (lord.LordJob is LordJob_DefendAndExpandHiveLike hivejob)
                {
                    if (lord.CurLordToil is LordToil_DefendAndExpandHiveLike hivetoil)
                    {
                        if (hivetoil.Data.assignedHiveLikes.TryGetValue(pawn) != null)
                        {
                            hive = hivetoil.Data.assignedHiveLikes.TryGetValue(pawn);
                        }
                    }
                }
                if (lord.CurLordToil is LordToil_DefendHiveLikeAggressively hivetoilA)
                {
                    if (hivetoilA.Data.assignedHiveLikes.TryGetValue(pawn) != null)
                    {
                        hive = hivetoilA.Data.assignedHiveLikes.TryGetValue(pawn);
                    }
                }
            }

            bool           aggressive;
            Comp_Xenomorph _Xenomorph = pawn.TryGetComp <Comp_Xenomorph>();

            if (pawn.TryGetAttackVerb(null, false) == null)
            {
                return(null);
            }


            Pawn pawn2 = null;

            if (_Xenomorph != null && hive.hiveDormant)
            {
                pawn2 = _Xenomorph.BestPawnToHuntForPredator(pawn, false, true);
            }
            if (pawn2 == null)
            {
                pawn2 = this.FindPawnTarget(pawn);
            }
            if (pawn2 == null)
            {
                return(null);
            }
            if (!pawn2.isPotentialHost())
            {
                return(null);
            }
            if (pawn2 != null && pawn.CanReach(pawn2, PathEndMode.Touch, Danger.Deadly, false, TraverseMode.ByPawn))
            {
                return(this.MeleeAttackJob(pawn, pawn2));
            }
            if (pawn2 != null)
            {
                using (PawnPath pawnPath = pawn.Map.pathFinder.FindPath(pawn.Position, pawn2.Position, TraverseParms.For(pawn, Danger.Deadly, TraverseMode.PassDoors, true), PathEndMode.OnCell))
                {
                    if (!pawnPath.Found)
                    {
                        return(null);
                    }
                    if (!pawnPath.TryFindLastCellBeforeBlockingDoor(pawn, out IntVec3 loc))
                    {
                        //    Log.Error(pawn + " did TryFindLastCellBeforeDoor but found none when it should have been one. Target: " + pawn2.LabelCap, false);
                        return(null);
                    }
                    IntVec3 randomCell = CellFinder.RandomRegionNear(loc.GetRegion(pawn.Map, RegionType.Set_Passable), 9, TraverseParms.For(pawn, Danger.Deadly, TraverseMode.ByPawn, true), null, null, RegionType.Set_Passable).RandomCell;
                    if (randomCell == pawn.Position)
                    {
                        return(new Job(JobDefOf.Wait, 30, false));
                    }
                    return(new Job(JobDefOf.Goto, randomCell));
                }
            }
            return(null);
        }
コード例 #3
0
        // Token: 0x060005B7 RID: 1463 RVA: 0x00037A28 File Offset: 0x00035E28
        protected override Job TryGiveJob(Pawn pawn)
        {
            Job  job     = null;
            bool healthy = (pawn.health.summaryHealth.SummaryHealthPercent > 0.75f && pawn.health.hediffSet.BleedRateTotal < 0.15f);

            if (!healthy)
            {
                return(job);
            }
            if (pawn.GetLord() != null && pawn.GetLord() is Lord lord)
            {
                if (lord.LordJob is LordJob_DefendAndExpandHiveLike hivejob)
                {
                    if (lord.CurLordToil is LordToil_DefendAndExpandHiveLike hivetoil)
                    {
                        if (hivetoil.Data.assignedHiveLikes.TryGetValue(pawn) != null)
                        {
                            hive = hivetoil.Data.assignedHiveLikes.TryGetValue(pawn);
                        }
                    }
                }
                else
                if (lord.CurLordToil is LordToil_DefendHiveLikeAggressively hivetoilA)
                {
                    if (hivetoilA.Data.assignedHiveLikes.TryGetValue(pawn) != null)
                    {
                        hive = hivetoilA.Data.assignedHiveLikes.TryGetValue(pawn);
                    }
                }
            }

            //    bool aggressive;
            Comp_Xenomorph _Xenomorph = pawn.TryGetComp <Comp_Xenomorph>();

            if (pawn.TryGetAttackVerb(null, false) == null)
            {
                return(job);
            }


            Pawn pawn2 = null;

            if (hive != null)
            {
                if (_Xenomorph != null)
                {
                    if (!hive.hiveDormant)
                    {
                        pawn2        = _Xenomorph.BestPawnToHuntForPredator(pawn, false, true);
                        requireLOS   = false;
                        HuntingRange = 40;
                    }
                    else
                    {
                        HuntingRange = 20;
                    }
                }
                else
                {
                }
            }
            if (pawn2 == null)
            {
                pawn2 = this.FindPawnTarget(pawn);
            }
            if (pawn2 != null)
            {
                if (pawn2.isPotentialHost())
                {
                    if (pawn.CanReach(pawn2, PathEndMode.Touch, Danger.Deadly, false, TraverseMode.ByPawn))
                    {
                        job = this.MeleeAttackJob(pawn, pawn2);
                    }
                    else
                    {
                        using (PawnPath pawnPath = pawn.Map.pathFinder.FindPath(pawn.Position, pawn2.Position, TraverseParms.For(pawn, Danger.Deadly, TraverseMode.PassDoors, true), PathEndMode.OnCell))
                        {
                            if (pawn.jobs.debugLog)
                            {
                                pawn.jobs.DebugLogEvent(string.Format("pawnPath.TotalCost: {0}", pawnPath.TotalCost));
                            }

                            if (!pawnPath.Found)
                            {
                                if (pawn.jobs.debugLog)
                                {
                                    pawn.jobs.DebugLogEvent(string.Format("pawnPath.Found NOT Found"));
                                }
                                job = null;
                            }
                            else
                            if (!pawnPath.TryFindLastCellBeforeBlockingDoor(pawn, out IntVec3 loc))
                            {
                                if (pawn.jobs.debugLog)
                                {
                                    pawn.jobs.DebugLogEvent(string.Format("pawnPath.TryFindLastCellBeforeBlockingDoor NOT Found"));
                                }
                                //    Log.Error(pawn + " did TryFindLastCellBeforeDoor but found none when it should have been one. Target: " + pawn2.LabelCap, false);
                                job = null;
                            }

                            /*
                             * else
                             * {
                             *  if (pawn.jobs.debugLog) pawn.jobs.DebugLogEvent(string.Format("pawnPath.TryFindLastCellBeforeBlockingDoor NOT Found"));
                             *  IntVec3 randomCell = CellFinder.RandomRegionNear(loc.GetRegion(pawn.Map, RegionType.Set_Passable), 9, TraverseParms.For(pawn, Danger.Deadly, TraverseMode.ByPawn, true), null, null, RegionType.Set_Passable).RandomCell;
                             *  if (randomCell == pawn.Position)
                             *  {
                             *      job = new Job(JobDefOf.Wait, 30, false);
                             *  }
                             *  else
                             *  {
                             *      job = new Job(JobDefOf.Goto, randomCell);
                             *  }
                             * }
                             */
                        }
                    }
                }
                if (pawn.jobs.debugLog)
                {
                    pawn.jobs.DebugLogEvent(string.Format("{0}: {1} Job Found: {2}: {3}", this, pawn, job != null, job));
                }
            }
            else
            {
                if (pawn.jobs.debugLog)
                {
                    pawn.jobs.DebugLogEvent(string.Format("{0}: {1} No target Found: {2}: {3}", this, pawn, job != null, job));
                }
            }

            return(job);
        }