private bool CanTalkTo(Pawn target)
 {
     if (target == null || target.talker == null)
     {
         return(false);
     }
     return((PAL.Position - target.Position).LengthHorizontalSquared <= MaxTalkRange * MaxTalkRange &&
            GenSight.LineOfSight(PAL.Position, target.Position, true) && TalkUtility.CanTalk(target) &&
            !InStandby(target));
 }
 public bool CanTalkTo(Pawn talkee)
 {
     if (talkee == null || talkee.talker == null)
     {
         return(false);
     }
     return(talkee.SpawnedInWorld &&
            (pawn.Position - talkee.Position).LengthHorizontalSquared <= MaxTalkRange * MaxTalkRange &&
            TalkUtility.CanTalk(pawn) && GenSight.LineOfSight(pawn.Position, talkee.Position, true) &&
            TalkUtility.CanListen(talkee) && !InStandby(pawn) && !InStandby(talkee));
 }
        public new bool TryDoSocialChat()
        {
            if (pawn == null)
            {
                Log.ErrorOnce("pawn is already null...", 3489643);
            }
            if (Find.TickManager.TicksGame < lastTalkTime + MinPreferredTalkInterval || (pawn.Downed) ||
                !TalkUtility.CanTalk(pawn))
            {
                return(false);
            }

            List <Pawn> list = Find.ListerPawns.PawnsInFaction(pawn.Faction);

            workingList.Clear();
            foreach (Pawn p in list)
            {
                workingList.Add(p);
            }
            workingList.Shuffle();
            foreach (Pawn p in workingList)
            {
                if (p != pawn && CanTalkTo(p))
                {
                    ThoughtDef thoughtDef = ThoughtDefOf.AbrasiveTalk;
                    if (!pawn.talker.TryTalkTo(new SpeechMessage(thoughtDef), p))
                    {
                        Log.Error(pawn + " failed to talk to " + p);
                    }
                    pawn.skills.Learn(SkillDefOf.Social, 4f);
                    pawn.needs.mood.thoughts.TryGainThought(ThoughtDefOf.SocialTalk);
                    return(true);
                }
            }
            return(false);
        }