示例#1
0
        public void Tick(IHTNAgent npc, float deltaTime, float time)
        {
            BearContext npcContext = npc.AiDomain.NpcContext as BearContext;

            if (npcContext == null)
            {
                return;
            }
            BaseNpc animal      = null;
            float   sqrDistance = Single.MaxValue;

            for (int i = 0; i < npcContext.AnimalsInRange.Count; i++)
            {
                AnimalInfo item = npcContext.AnimalsInRange[i];
                if (item.Animal != null && item.SqrDistance < sqrDistance)
                {
                    sqrDistance = item.SqrDistance;
                    animal      = item.Animal;
                }
            }
            if (!(animal != null) || sqrDistance >= npc.AiDefinition.Engagement.SqrMediumRange)
            {
                npcContext.SetFact(Facts.NearbyAnimal, false, true, true, true);
                return;
            }
            npcContext.Memory.RememberPrimaryAnimal(animal);
            npcContext.SetFact(Facts.NearbyAnimal, true, true, true, true);
        }
示例#2
0
        public static bool TickLineOfSightTest(IHTNAgent npc, ref NpcPlayerInfo info)
        {
            info.HeadVisible = false;
            info.BodyVisible = false;
            Vector3 vector3_1    = Vector3.op_Subtraction(((Component)info.Player).get_transform().get_position(), npc.transform.get_position());
            Vector3 vector3_2    = Quaternion.op_Multiply(npc.EyeRotation, Vector3.get_forward());
            float   sqrMagnitude = ((Vector3) ref vector3_1).get_sqrMagnitude();
            Vector3 normalized   = ((Vector3) ref vector3_1).get_normalized();
            float   num          = Vector3.Dot(vector3_2, normalized);

            if ((double)sqrMagnitude < (double)npc.AiDefinition.Engagement.SqrAggroRange && (double)num > (double)npc.AiDefinition.Sensory.FieldOfViewRadians)
            {
                if (info.Player.IsVisible(npc.EyePosition, info.Player.CenterPoint(), npc.AiDefinition.Engagement.AggroRange))
                {
                    info.BodyVisible = true;
                    npc.AiDomain.NpcContext.EnemyPlayersInLineOfSight.Add(info);
                }
                else if (info.Player.IsVisible(npc.EyePosition, info.Player.eyes.position, npc.AiDefinition.Engagement.AggroRange))
                {
                    info.HeadVisible = true;
                    npc.AiDomain.NpcContext.EnemyPlayersInLineOfSight.Add(info);
                }
            }
            if (!info.HeadVisible)
            {
                return(info.BodyVisible);
            }
            return(true);
        }
        private static bool EvaluateRetreat(
            IHTNAgent npc,
            ScientistAStarContext c,
            ref float bestScore,
            ref BaseNpcMemory.EnemyPlayerInfo enemyInfo,
            CoverPoint option,
            Vector3 dirCover,
            Vector3 dirDanger,
            ref float directness)
        {
            float sqrMagnitude = ((Vector3) ref dirCover).get_sqrMagnitude();

            if ((double)directness <= -0.200000002980232)
            {
                float allowedCoverRangeSqr = c.Domain.GetAllowedCoverRangeSqr();
                float num = (float)((double)directness * -1.0 + ((double)allowedCoverRangeSqr - (double)sqrMagnitude) / (double)allowedCoverRangeSqr) + option.Score;
                if ((double)num > (double)bestScore)
                {
                    bestScore          = num;
                    c.BestRetreatCover = option;
                    return(true);
                }
            }
            return(false);
        }
        public void Tick(IHTNAgent npc, float deltaTime, float time)
        {
            ScientistContext npcContext = npc.AiDomain.NpcContext as ScientistContext;

            if (npcContext == null)
            {
                return;
            }
            for (int index = 0; index < npcContext.Memory.KnownTimedExplosives.Count; ++index)
            {
                BaseNpcMemory.EntityOfInterestInfo knownTimedExplosive = npcContext.Memory.KnownTimedExplosives[index];
                if (Object.op_Inequality((Object)knownTimedExplosive.Entity, (Object)null))
                {
                    AttackEntity firearm = npcContext.Domain.GetFirearm();
                    Vector3      vector3 = Vector3.op_Subtraction(((Component)knownTimedExplosive.Entity).get_transform().get_position(), npcContext.BodyPosition);
                    if ((double)((Vector3) ref vector3).get_sqrMagnitude() < (double)npcContext.Body.AiDefinition.Engagement.SqrCloseRangeFirearm(firearm))
                    {
                        npcContext.SetFact(Rust.Ai.HTN.Scientist.Facts.NearbyExplosives, true, true, true, true);
                        npcContext.IncrementFact(Rust.Ai.HTN.Scientist.Facts.Alertness, 2, true, true, true);
                        return;
                    }
                }
            }
            npcContext.SetFact(Rust.Ai.HTN.Scientist.Facts.NearbyExplosives, false, true, true, true);
        }
        public void Tick(IHTNAgent npc, float deltaTime, float time)
        {
            NavMeshHit       navMeshHit;
            ScientistContext npcContext = npc.AiDomain.NpcContext as ScientistContext;

            if (npcContext == null)
            {
                return;
            }
            if (!npcContext.IsFact(Facts.IsReturningHome))
            {
                if (npcContext.Memory.PrimaryKnownEnemyPlayer.PlayerInfo.Player == null || time - npcContext.Memory.PrimaryKnownEnemyPlayer.Time > npcContext.Body.AiDefinition.Memory.NoSeeReturnToSpawnTime)
                {
                    npcContext.SetFact(Facts.IsReturningHome, true, true, true, true);
                    if (NavMesh.SamplePosition(npcContext.Domain.SpawnPosition, out navMeshHit, 1f, npcContext.Domain.NavAgent.areaMask))
                    {
                        npcContext.Domain.SetDestination(navMeshHit.position);
                        npcContext.Body.modelState.ducked = false;
                        npcContext.SetFact(Facts.IsDucking, 0, false, true, true);
                        return;
                    }
                }
            }
            else if (npcContext.IsFact(Facts.CanSeeEnemy) || time - npcContext.Body.lastAttackedTime < 2f || npcContext.IsFact(Facts.AtLocationHome))
            {
                npcContext.SetFact(Facts.IsReturningHome, false, true, true, true);
            }
        }
        public void Tick(IHTNAgent npc, float deltaTime, float time)
        {
            NPCTurretContext npcContext = npc.AiDomain.NpcContext as NPCTurretContext;

            if (npcContext == null)
            {
                return;
            }
            npcContext.SetFact(Facts.CanSeeEnemy, npcContext.EnemyPlayersInLineOfSight.Count > 0, true, true, true);
            float         single        = 0f;
            NpcPlayerInfo npcPlayerInfo = new NpcPlayerInfo();

            foreach (NpcPlayerInfo enemyPlayersInLineOfSight in npc.AiDomain.NpcContext.EnemyPlayersInLineOfSight)
            {
                float forwardDotDir = (enemyPlayersInLineOfSight.ForwardDotDir + 1f) * 0.5f;
                float sqrDistance   = (1f - enemyPlayersInLineOfSight.SqrDistance / npc.AiDefinition.Engagement.SqrAggroRange) * 2f + forwardDotDir;
                if (sqrDistance > single)
                {
                    single        = sqrDistance;
                    npcPlayerInfo = enemyPlayersInLineOfSight;
                }
                NpcPlayerInfo npcPlayerInfo1 = enemyPlayersInLineOfSight;
                npcPlayerInfo1.VisibilityScore = sqrDistance;
                npcContext.Memory.RememberEnemyPlayer(npc, ref npcPlayerInfo1, time, 0f, "SEE!");
            }
            npcContext.PrimaryEnemyPlayerInLineOfSight = npcPlayerInfo;
            if (npcPlayerInfo.Player != null && (npcContext.Memory.PrimaryKnownEnemyPlayer.PlayerInfo.Player == null || npcContext.Memory.PrimaryKnownEnemyPlayer.PlayerInfo.AudibleScore < single))
            {
                npcContext.Memory.RememberPrimaryEnemyPlayer(npcPlayerInfo.Player);
                npcContext.IncrementFact(Facts.Alertness, 2, true, true, true);
            }
        }
        public void Tick(IHTNAgent npc, float deltaTime, float time)
        {
            ScientistAStarContext npcContext = npc.AiDomain.NpcContext as ScientistAStarContext;

            if (npcContext == null)
            {
                return;
            }
            npcContext.SetFact(Facts.CanSeeEnemy, npcContext.EnemyPlayersInLineOfSight.Count > 0, true, true, true);
            float         num1           = 0.0f;
            NpcPlayerInfo npcPlayerInfo1 = new NpcPlayerInfo();

            foreach (NpcPlayerInfo npcPlayerInfo2 in npc.AiDomain.NpcContext.EnemyPlayersInLineOfSight)
            {
                float num2 = (float)((1.0 - (double)npcPlayerInfo2.SqrDistance / (double)npc.AiDefinition.Engagement.SqrAggroRange) * 2.0) + (float)(((double)npcPlayerInfo2.ForwardDotDir + 1.0) * 0.5);
                if ((double)num2 > (double)num1)
                {
                    num1           = num2;
                    npcPlayerInfo1 = npcPlayerInfo2;
                }
                NpcPlayerInfo info = npcPlayerInfo2;
                info.VisibilityScore = num2;
                npcContext.Memory.RememberEnemyPlayer(npc, ref info, time, 0.0f, "SEE!");
            }
            npcContext.PrimaryEnemyPlayerInLineOfSight = npcPlayerInfo1;
            if (!Object.op_Inequality((Object)npcPlayerInfo1.Player, (Object)null) || !Object.op_Equality((Object)npcContext.Memory.PrimaryKnownEnemyPlayer.PlayerInfo.Player, (Object)null) && (double)npcContext.Memory.PrimaryKnownEnemyPlayer.PlayerInfo.AudibleScore >= (double)num1)
            {
                return;
            }
            npcContext.Memory.RememberPrimaryEnemyPlayer(npcPlayerInfo1.Player);
            npcContext.IncrementFact(Facts.Alertness, 2, true, true, true);
        }
        public void Tick(IHTNAgent npc, float deltaTime, float time)
        {
            NPCTurretContext npcContext = npc.AiDomain.NpcContext as NPCTurretContext;

            if (npcContext == null)
            {
                return;
            }
            BaseNpc animal      = null;
            float   sqrDistance = Single.MaxValue;

            for (int i = 0; i < npcContext.AnimalsInRange.Count; i++)
            {
                AnimalInfo item = npcContext.AnimalsInRange[i];
                if (item.Animal != null && item.SqrDistance < sqrDistance)
                {
                    sqrDistance = item.SqrDistance;
                    animal      = item.Animal;
                }
            }
            if (animal != null)
            {
                AttackEntity firearm = npcContext.Domain.GetFirearm();
                if (sqrDistance < npc.AiDefinition.Engagement.SqrCloseRangeFirearm(firearm))
                {
                    npcContext.Memory.RememberPrimaryAnimal(animal);
                    npcContext.SetFact(Facts.NearbyAnimal, true, true, true, true);
                    return;
                }
            }
            npcContext.SetFact(Facts.NearbyAnimal, false, true, true, true);
        }
示例#9
0
        public static void TickLineOfSightTest(IHTNAgent npc, ref NpcPlayerInfo info)
        {
            BearDomain aiDomain = npc.AiDomain as BearDomain;

            if (aiDomain == null)
            {
                return;
            }
            bool flag = aiDomain.BearContext.IsFact(Facts.IsStandingUp);

            info.HeadVisible = false;
            info.BodyVisible = false;
            if (info.SqrDistance < aiDomain.BearDefinition.SqrAggroRange(flag) && info.ForwardDotDir > npc.AiDefinition.Sensory.FieldOfViewRadians)
            {
                float single = aiDomain.BearDefinition.AggroRange(flag);
                Ray   ray    = BearEnemyPlayersLineOfSightSensor.AimAtBody(npc, ref info);
                if (info.Player.IsVisible(ray, single))
                {
                    info.BodyVisible = true;
                    npc.AiDomain.NpcContext.EnemyPlayersInLineOfSight.Add(info);
                    return;
                }
                ray = BearEnemyPlayersLineOfSightSensor.AimAtHead(npc, ref info);
                if (info.Player.IsVisible(ray, single))
                {
                    info.HeadVisible = true;
                    npc.AiDomain.NpcContext.EnemyPlayersInLineOfSight.Add(info);
                }
            }
        }
示例#10
0
        public void Tick(IHTNAgent npc, float deltaTime, float time)
        {
            ScientistAStarContext npcContext = npc.AiDomain.NpcContext as ScientistAStarContext;

            if (npcContext == null)
            {
                return;
            }
            if (npcContext.ReservedCoverPoint == null)
            {
                npcContext.SetFact(Facts.AtLocationCover, false, true, true, true);
                npcContext.SetFact(Facts.CoverState, CoverState.None, true, true, true);
                return;
            }
            Vector3      position       = npcContext.ReservedCoverPoint.Position;
            BasePathNode closestToPoint = npcContext.Domain.Path.GetClosestToPoint(position);

            if (!(closestToPoint != null) || !(closestToPoint.transform != null) || (closestToPoint.transform.position - npcContext.BodyPosition).sqrMagnitude >= 1f)
            {
                npcContext.SetFact(Facts.AtLocationCover, false, true, true, true);
                npcContext.SetFact(Facts.CoverState, CoverState.None, true, true, true);
                return;
            }
            npcContext.SetFact(Facts.AtLocationCover, true, true, true, true);
            npcContext.SetFact(Facts.CoverState, (npcContext.ReservedCoverPoint.NormalCoverType == CoverPoint.CoverType.Partial ? CoverState.Partial : CoverState.Full), true, true, true);
        }
        public void Tick(IHTNAgent npc, float deltaTime, float time)
        {
            ScientistContext npcContext = npc.AiDomain.NpcContext as ScientistContext;

            if (npcContext == null)
            {
                return;
            }
            NpcPlayerInfo enemyPlayerTarget = npcContext.GetPrimaryEnemyPlayerTarget();

            if (!Object.op_Inequality((Object)enemyPlayerTarget.Player, (Object)null))
            {
                return;
            }
            AttackEntity firearm = npcContext.Domain.GetFirearm();

            if (PreferredFightingRangeReasoner.IsAtPreferredRange(npcContext, ref enemyPlayerTarget, firearm))
            {
                npcContext.SetFact(Rust.Ai.HTN.Scientist.Facts.AtLocationPreferredFightingRange, 1, true, true, true);
            }
            else
            {
                npcContext.SetFact(Rust.Ai.HTN.Scientist.Facts.AtLocationPreferredFightingRange, 0, true, true, true);
            }
        }
        public void Tick(IHTNAgent npc, float deltaTime, float time)
        {
            ScientistJunkpileContext npcContext = npc.AiDomain.NpcContext as ScientistJunkpileContext;

            if (npcContext == null)
            {
                return;
            }
            float npcJunkpileDistAggroGate = ConVar.AI.npc_junkpile_dist_aggro_gate * ConVar.AI.npc_junkpile_dist_aggro_gate;

            for (int i = 0; i < npc.AiDomain.NpcContext.EnemyPlayersInRange.Count; i++)
            {
                NpcPlayerInfo item = npc.AiDomain.NpcContext.EnemyPlayersInRange[i];
                if (!(item.Player == null) && !(item.Player.transform == null))
                {
                    if (Mathf.Approximately(item.SqrDistance, 0f))
                    {
                        Vector3 player = item.Player.transform.position - npc.BodyPosition;
                        item.SqrDistance = player.sqrMagnitude;
                        npc.AiDomain.NpcContext.EnemyPlayersInRange[i] = item;
                    }
                    if (item.SqrDistance < npcJunkpileDistAggroGate)
                    {
                        npcContext.Memory.MarkEnemy(item.Player);
                    }
                }
            }
        }
 private static bool EvaluateAdvancement(IHTNAgent npc, ScientistAStarContext c, ref float bestScore, ref BaseNpcMemory.EnemyPlayerInfo enemyInfo, CoverPoint option, Vector3 dirCover, Vector3 dirDanger, float directness)
 {
     if (directness >= 0.2f)
     {
         float single = dirCover.sqrMagnitude;
         if (single > dirDanger.sqrMagnitude || single < 0.5f)
         {
             return(false);
         }
         float position             = (option.Position - enemyInfo.LastKnownPosition).sqrMagnitude;
         float allowedCoverRangeSqr = c.Domain.GetAllowedCoverRangeSqr();
         float single1 = directness + (allowedCoverRangeSqr - single) / allowedCoverRangeSqr + option.Score + (position < single ? 1f : 0f);
         if (single1 > bestScore)
         {
             if (ConVar.AI.npc_cover_use_path_distance && npc != null && !c.Domain.PathDistanceIsValid(enemyInfo.LastKnownPosition, option.Position, false))
             {
                 return(false);
             }
             if ((option.Position - enemyInfo.LastKnownPosition).sqrMagnitude < single)
             {
                 single1 *= 0.9f;
             }
             bestScore          = single1;
             c.BestAdvanceCover = option;
             return(true);
         }
     }
     return(false);
 }
示例#14
0
        public void Tick(IHTNAgent npc, float deltaTime, float time)
        {
            ScientistJunkpileContext npcContext = npc.AiDomain.NpcContext as ScientistJunkpileContext;

            if (npcContext == null)
            {
                return;
            }
            BaseNpc animal      = (BaseNpc)null;
            float   sqrDistance = float.MaxValue;

            for (int index = 0; index < npcContext.AnimalsInRange.Count; ++index)
            {
                AnimalInfo animalInfo = npcContext.AnimalsInRange[index];
                if (Object.op_Inequality((Object)animalInfo.Animal, (Object)null) && (double)animalInfo.SqrDistance < (double)sqrDistance)
                {
                    sqrDistance = animalInfo.SqrDistance;
                    animal      = animalInfo.Animal;
                }
            }
            if (Object.op_Inequality((Object)animal, (Object)null) && AnimalReasoner.IsNearby(npcContext.Domain, sqrDistance))
            {
                npcContext.Memory.RememberPrimaryAnimal(animal);
                npcContext.SetFact(Rust.Ai.HTN.ScientistJunkpile.Facts.NearbyAnimal, true, true, true, true);
            }
            else
            {
                npcContext.SetFact(Rust.Ai.HTN.ScientistJunkpile.Facts.NearbyAnimal, false, true, true, true);
            }
        }
        public void Tick(IHTNAgent npc, float deltaTime, float time)
        {
            ScientistAStarContext npcContext = npc.AiDomain.NpcContext as ScientistAStarContext;

            if (npcContext == null)
            {
                return;
            }
            HTNPlayer htnPlayer = npc as HTNPlayer;

            if (Object.op_Equality((Object)htnPlayer, (Object)null))
            {
                return;
            }
            FireTactic   fireTactic = FireTactic.Single;
            AttackEntity heldEntity = htnPlayer.GetHeldEntity() as AttackEntity;

            if (Object.op_Implicit((Object)heldEntity))
            {
                BaseProjectile baseProjectile = heldEntity as BaseProjectile;
                float          num            = float.MaxValue;
                if (Object.op_Inequality((Object)npcContext.PrimaryEnemyPlayerInLineOfSight.Player, (Object)null))
                {
                    num = npcContext.PrimaryEnemyPlayerInLineOfSight.SqrDistance;
                    if (Mathf.Approximately(num, 0.0f))
                    {
                        num = float.MaxValue;
                    }
                }
                fireTactic = (double)heldEntity.attackLengthMin <0.0 || (double)num> (double) npcContext.Body.AiDefinition.Engagement.SqrCloseRangeFirearm((AttackEntity)baseProjectile) ? ((double)heldEntity.attackLengthMin <0.0 || (double)num> (double) npcContext.Body.AiDefinition.Engagement.SqrMediumRangeFirearm((AttackEntity)baseProjectile) ? FireTactic.Single : FireTactic.Burst) : FireTactic.FullAuto;
            }
            npcContext.SetFact(Rust.Ai.HTN.ScientistAStar.Facts.FireTactic, fireTactic, true, true, true);
        }
        public void Tick(IHTNAgent npc, float deltaTime, float time)
        {
            ScientistContext npcContext = npc.AiDomain.NpcContext as ScientistContext;

            if (npcContext == null)
            {
                return;
            }
            if (!npcContext.IsFact(Facts.IsReturningHome))
            {
                if (!Object.op_Equality((Object)npcContext.Memory.PrimaryKnownEnemyPlayer.PlayerInfo.Player, (Object)null) && (double)time - (double)npcContext.Memory.PrimaryKnownEnemyPlayer.Time <= (double)npcContext.Body.AiDefinition.Memory.NoSeeReturnToSpawnTime)
                {
                    return;
                }
                npcContext.SetFact(Facts.IsReturningHome, true, true, true, true);
                NavMeshHit navMeshHit;
                if (!NavMesh.SamplePosition(npcContext.Domain.SpawnPosition, ref navMeshHit, 1f, npcContext.Domain.NavAgent.get_areaMask()))
                {
                    return;
                }
                npcContext.Domain.SetDestination(((NavMeshHit) ref navMeshHit).get_position());
                npcContext.Body.modelState.set_ducked(false);
                npcContext.SetFact(Facts.IsDucking, 0, false, true, true);
            }
            else
            {
                if (!npcContext.IsFact(Facts.CanSeeEnemy) && (double)time - (double)npcContext.Body.lastAttackedTime >= 2.0 && !npcContext.IsFact(Facts.AtLocationHome))
                {
                    return;
                }
                npcContext.SetFact(Facts.IsReturningHome, false, true, true, true);
            }
        }
        public void Tick(IHTNAgent npc, float deltaTime, float time)
        {
            ScientistAStarContext npcContext = npc.AiDomain.NpcContext as ScientistAStarContext;

            if (npcContext == null)
            {
                return;
            }
            BaseNpc animal = (BaseNpc)null;
            float   num    = float.MaxValue;

            for (int index = 0; index < npcContext.AnimalsInRange.Count; ++index)
            {
                AnimalInfo animalInfo = npcContext.AnimalsInRange[index];
                if (Object.op_Inequality((Object)animalInfo.Animal, (Object)null) && (double)animalInfo.SqrDistance < (double)num)
                {
                    num    = animalInfo.SqrDistance;
                    animal = animalInfo.Animal;
                }
            }
            if (Object.op_Inequality((Object)animal, (Object)null))
            {
                AttackEntity firearm = npcContext.Domain.GetFirearm();
                if ((double)num < (double)npc.AiDefinition.Engagement.SqrCloseRangeFirearm(firearm))
                {
                    npcContext.Memory.RememberPrimaryAnimal(animal);
                    npcContext.SetFact(Rust.Ai.HTN.ScientistAStar.Facts.NearbyAnimal, true, true, true, true);
                    return;
                }
            }
            npcContext.SetFact(Rust.Ai.HTN.ScientistAStar.Facts.NearbyAnimal, false, true, true, true);
        }
        public void Tick(IHTNAgent npc, float deltaTime, float time)
        {
            ScientistJunkpileContext npcContext = npc.AiDomain.NpcContext as ScientistJunkpileContext;

            if (npcContext == null)
            {
                return;
            }
            float num = AI.npc_junkpile_dist_aggro_gate * AI.npc_junkpile_dist_aggro_gate;

            for (int index = 0; index < npc.AiDomain.NpcContext.EnemyPlayersInRange.Count; ++index)
            {
                NpcPlayerInfo npcPlayerInfo = npc.AiDomain.NpcContext.EnemyPlayersInRange[index];
                if (!Object.op_Equality((Object)npcPlayerInfo.Player, (Object)null) && !Object.op_Equality((Object)((Component)npcPlayerInfo.Player).get_transform(), (Object)null))
                {
                    if (Mathf.Approximately(npcPlayerInfo.SqrDistance, 0.0f))
                    {
                        ref NpcPlayerInfo local        = ref npcPlayerInfo;
                        Vector3           vector3      = Vector3.op_Subtraction(((Component)npcPlayerInfo.Player).get_transform().get_position(), npc.BodyPosition);
                        double            sqrMagnitude = (double)((Vector3) ref vector3).get_sqrMagnitude();
                        local.SqrDistance = (float)sqrMagnitude;
                        npc.AiDomain.NpcContext.EnemyPlayersInRange[index] = npcPlayerInfo;
                    }
                    if ((double)npcPlayerInfo.SqrDistance < (double)num)
                    {
                        npcContext.Memory.MarkEnemy(npcPlayerInfo.Player);
                    }
                }
            }
        public static bool TickLineOfSightTest(IHTNAgent npc, ref NpcPlayerInfo info)
        {
            info.HeadVisible = false;
            info.BodyVisible = false;
            Vector3 player      = info.Player.transform.position - npc.transform.position;
            Vector3 eyeRotation = npc.EyeRotation * Vector3.forward;
            float   single      = player.sqrMagnitude;
            float   single1     = Vector3.Dot(eyeRotation, player.normalized);

            if (single < npc.AiDefinition.Engagement.SqrAggroRange && single1 > npc.AiDefinition.Sensory.FieldOfViewRadians)
            {
                if (info.Player.IsVisible(npc.EyePosition, info.Player.CenterPoint(), npc.AiDefinition.Engagement.AggroRange))
                {
                    info.BodyVisible = true;
                    npc.AiDomain.NpcContext.EnemyPlayersInLineOfSight.Add(info);
                }
                else if (info.Player.IsVisible(npc.EyePosition, info.Player.eyes.position, npc.AiDefinition.Engagement.AggroRange))
                {
                    info.HeadVisible = true;
                    npc.AiDomain.NpcContext.EnemyPlayersInLineOfSight.Add(info);
                }
            }
            if (info.HeadVisible)
            {
                return(true);
            }
            return(info.BodyVisible);
        }
        protected virtual bool EvaluatePlayer(
            BaseNpcContext context,
            IHTNAgent npc,
            ref NpcPlayerInfo player,
            float time)
        {
            if (player.Player.Family == npc.Family)
            {
                return(false);
            }
            List <NpcPlayerInfo> playersInRange = npc.AiDomain.NpcContext.PlayersInRange;
            bool flag = false;

            for (int index = 0; index < playersInRange.Count; ++index)
            {
                if (Object.op_Equality((Object)playersInRange[index].Player, (Object)player.Player))
                {
                    flag = true;
                    break;
                }
            }
            if (!flag)
            {
                playersInRange.Add(player);
            }
            return(true);
        }
示例#21
0
        public static void TickLineOfSightTest(IHTNAgent npc, ref NpcPlayerInfo info)
        {
            BearDomain aiDomain = npc.AiDomain as BearDomain;

            if (Object.op_Equality((Object)aiDomain, (Object)null))
            {
                return;
            }
            bool isStanding = aiDomain.BearContext.IsFact(Rust.Ai.HTN.Bear.Facts.IsStandingUp);

            info.HeadVisible = false;
            info.BodyVisible = false;
            if ((double)info.SqrDistance >= (double)aiDomain.BearDefinition.SqrAggroRange(isStanding) || (double)info.ForwardDotDir <= (double)npc.AiDefinition.Sensory.FieldOfViewRadians)
            {
                return;
            }
            float maxDistance = aiDomain.BearDefinition.AggroRange(isStanding);
            Ray   ray1        = BearEnemyPlayersLineOfSightSensor.AimAtBody(npc, ref info);

            if (info.Player.IsVisible(ray1, maxDistance))
            {
                info.BodyVisible = true;
                npc.AiDomain.NpcContext.EnemyPlayersInLineOfSight.Add(info);
            }
            else
            {
                Ray ray2 = BearEnemyPlayersLineOfSightSensor.AimAtHead(npc, ref info);
                if (!info.Player.IsVisible(ray2, maxDistance))
                {
                    return;
                }
                info.HeadVisible = true;
                npc.AiDomain.NpcContext.EnemyPlayersInLineOfSight.Add(info);
            }
        }
 public static void TickFootstepHearingTest(IHTNAgent npc, ref NpcPlayerInfo info)
 {
     if (info.SqrDistance < npc.AiDefinition.Sensory.SqrHearingRange)
     {
         float player = info.Player.estimatedSpeed;
         if (player <= 2f)
         {
             return;
         }
         if (player > 5f)
         {
             npc.AiDomain.NpcContext.EnemyPlayersAudible.Add(info);
         }
         else
         {
             HTNPlayer hTNPlayer = npc as HTNPlayer;
             if (hTNPlayer)
             {
                 AttackEntity heldEntity = hTNPlayer.GetHeldEntity() as AttackEntity;
                 if (info.SqrDistance < npc.AiDefinition.Engagement.SqrCloseRangeFirearm(heldEntity))
                 {
                     npc.AiDomain.NpcContext.EnemyPlayersAudible.Add(info);
                     return;
                 }
             }
             else if (info.SqrDistance < npc.AiDefinition.Engagement.SqrCloseRange)
             {
                 npc.AiDomain.NpcContext.EnemyPlayersAudible.Add(info);
                 return;
             }
         }
     }
 }
示例#23
0
        public void Tick(IHTNAgent npc, float deltaTime, float time)
        {
            ScientistContext npcContext = npc.AiDomain.NpcContext as ScientistContext;

            if (npcContext == null)
            {
                return;
            }
            if (npcContext.IsFact(Facts.MaintainCover) || npcContext.IsFact(Facts.IsReloading) || npcContext.IsFact(Facts.IsApplyingMedical))
            {
                if (npcContext.ReservedCoverPoint != null && !npcContext.ReservedCoverPoint.IsCompromised && !npcContext.IsFact(Facts.AtLocationCover) && time - npcContext.ReservedCoverTime < 0.8f)
                {
                    return;
                }
                if (!npcContext.IsFact(Facts.CanSeeEnemy) && npcContext.Body.SecondsSinceAttacked - 1f > time - npcContext.ReservedCoverTime)
                {
                    return;
                }
                if (ScientistDomain.CanNavigateToCoverLocation.Try(CoverTactic.Retreat, npcContext))
                {
                    Vector3 coverPosition = ScientistDomain.NavigateToCover.GetCoverPosition(CoverTactic.Retreat, npcContext);
                    npcContext.Domain.SetDestination(coverPosition);
                    npcContext.Body.modelState.ducked = false;
                    npcContext.SetFact(Facts.IsDucking, 0, false, true, true);
                    npcContext.SetFact(Facts.FirearmOrder, FirearmOrders.FireAtWill, false, true, true);
                }
            }
        }
        public void Tick(IHTNAgent npc, float deltaTime, float time)
        {
            NPCTurretContext npcContext = npc.AiDomain.NpcContext as NPCTurretContext;

            if (npcContext == null)
            {
                return;
            }
            float single = npc.healthFraction;

            if (single > 0.9f)
            {
                npcContext.SetFact(Facts.HealthState, HealthState.FullHealth, true, true, true);
                return;
            }
            if (single > 0.6f)
            {
                npcContext.SetFact(Facts.HealthState, HealthState.HighHealth, true, true, true);
                return;
            }
            if (single > 0.3f)
            {
                npcContext.SetFact(Facts.HealthState, HealthState.MediumHealth, true, true, true);
                return;
            }
            if (single > 0f)
            {
                npcContext.SetFact(Facts.HealthState, HealthState.LowHealth, true, true, true);
                return;
            }
            npcContext.SetFact(Facts.HealthState, HealthState.Dead, true, true, true);
        }
        protected virtual bool EvaluatePlayer(BaseNpcContext context, IHTNAgent npc, ref NpcPlayerInfo player, float time)
        {
            if (player.Player.Family == npc.Family)
            {
                return(false);
            }
            List <NpcPlayerInfo> playersInRange = npc.AiDomain.NpcContext.PlayersInRange;
            bool flag = false;
            int  num  = 0;

            while (num < playersInRange.Count)
            {
                if (playersInRange[num].Player != player.Player)
                {
                    num++;
                }
                else
                {
                    flag = true;
                    break;
                }
            }
            if (!flag)
            {
                playersInRange.Add(player);
            }
            return(true);
        }
示例#26
0
        public void Tick(IHTNAgent npc, float deltaTime, float time)
        {
            ScientistAStarContext npcContext = npc.AiDomain.NpcContext as ScientistAStarContext;

            if (npcContext == null)
            {
                return;
            }
            if (npcContext.ReservedCoverPoint == null)
            {
                npcContext.SetFact(Rust.Ai.HTN.ScientistAStar.Facts.AtLocationCover, false, true, true, true);
                npcContext.SetFact(Rust.Ai.HTN.ScientistAStar.Facts.CoverState, Rust.Ai.HTN.ScientistAStar.CoverState.None, true, true, true);
            }
            else
            {
                Vector3      position       = npcContext.ReservedCoverPoint.Position;
                BasePathNode closestToPoint = npcContext.Domain.Path.GetClosestToPoint(position);
                if (Object.op_Inequality((Object)closestToPoint, (Object)null) && Object.op_Inequality((Object)((Component)closestToPoint).get_transform(), (Object)null))
                {
                    Vector3 vector3 = Vector3.op_Subtraction(((Component)closestToPoint).get_transform().get_position(), npcContext.BodyPosition);
                    if ((double)((Vector3) ref vector3).get_sqrMagnitude() < 1.0)
                    {
                        npcContext.SetFact(Rust.Ai.HTN.ScientistAStar.Facts.AtLocationCover, true, true, true, true);
                        npcContext.SetFact(Rust.Ai.HTN.ScientistAStar.Facts.CoverState, npcContext.ReservedCoverPoint.NormalCoverType == CoverPoint.CoverType.Partial ? Rust.Ai.HTN.ScientistAStar.CoverState.Partial : Rust.Ai.HTN.ScientistAStar.CoverState.Full, true, true, true);
                        return;
                    }
                }
                npcContext.SetFact(Rust.Ai.HTN.ScientistAStar.Facts.AtLocationCover, false, true, true, true);
                npcContext.SetFact(Rust.Ai.HTN.ScientistAStar.Facts.CoverState, Rust.Ai.HTN.ScientistAStar.CoverState.None, true, true, true);
            }
        }
        public void Tick(IHTNAgent npc, float deltaTime, float time)
        {
            ScientistJunkpileContext npcContext = npc.AiDomain.NpcContext as ScientistJunkpileContext;

            if (npcContext == null)
            {
                return;
            }
            if (npcContext.Memory.PrimaryKnownEnemyPlayer.PlayerInfo.Player == null)
            {
                npcContext.SetFact(Facts.EnemyRange, EnemyRange.OutOfRange, true, true, true);
            }
            Vector3      lastKnownPosition = npcContext.Memory.PrimaryKnownEnemyPlayer.LastKnownPosition - npcContext.BodyPosition;
            float        single            = lastKnownPosition.sqrMagnitude;
            AttackEntity firearm           = npcContext.Domain.GetFirearm();

            if (single <= npcContext.Body.AiDefinition.Engagement.SqrCloseRangeFirearm(firearm))
            {
                npcContext.SetFact(Facts.EnemyRange, EnemyRange.CloseRange, true, true, true);
                return;
            }
            if (single <= npcContext.Body.AiDefinition.Engagement.SqrMediumRangeFirearm(firearm))
            {
                npcContext.SetFact(Facts.EnemyRange, EnemyRange.MediumRange, true, true, true);
                return;
            }
            if (single <= npcContext.Body.AiDefinition.Engagement.SqrLongRangeFirearm(firearm))
            {
                npcContext.SetFact(Facts.EnemyRange, EnemyRange.LongRange, true, true, true);
                return;
            }
            npcContext.SetFact(Facts.EnemyRange, EnemyRange.OutOfRange, true, true, true);
        }
        public void Tick(IHTNAgent npc, float deltaTime, float time)
        {
            NPCTurretContext npcContext = npc.AiDomain.NpcContext as NPCTurretContext;

            if (npcContext == null)
            {
                return;
            }
            float healthFraction = npc.healthFraction;

            if ((double)healthFraction > 0.899999976158142)
            {
                npcContext.SetFact(Facts.HealthState, HealthState.FullHealth, true, true, true);
            }
            else if ((double)healthFraction > 0.600000023841858)
            {
                npcContext.SetFact(Facts.HealthState, HealthState.HighHealth, true, true, true);
            }
            else if ((double)healthFraction > 0.300000011920929)
            {
                npcContext.SetFact(Facts.HealthState, HealthState.MediumHealth, true, true, true);
            }
            else if ((double)healthFraction > 0.0)
            {
                npcContext.SetFact(Facts.HealthState, HealthState.LowHealth, true, true, true);
            }
            else
            {
                npcContext.SetFact(Facts.HealthState, HealthState.Dead, true, true, true);
            }
        }
 private static bool EvaluateAdvancement(
     IHTNAgent npc,
     ScientistAStarContext c,
     ref float bestScore,
     ref BaseNpcMemory.EnemyPlayerInfo enemyInfo,
     CoverPoint option,
     Vector3 dirCover,
     Vector3 dirDanger,
     float directness)
 {
     if ((double)directness >= 0.200000002980232)
     {
         float sqrMagnitude1 = ((Vector3) ref dirCover).get_sqrMagnitude();
         if ((double)sqrMagnitude1 > (double)((Vector3) ref dirDanger).get_sqrMagnitude() || (double)sqrMagnitude1 < 0.5)
         {
             return(false);
         }
         Vector3 vector3_1            = Vector3.op_Subtraction(option.Position, enemyInfo.LastKnownPosition);
         float   sqrMagnitude2        = ((Vector3) ref vector3_1).get_sqrMagnitude();
         float   allowedCoverRangeSqr = c.Domain.GetAllowedCoverRangeSqr();
         float   num = (float)((double)directness + ((double)allowedCoverRangeSqr - (double)sqrMagnitude1) / (double)allowedCoverRangeSqr + (double)option.Score + ((double)sqrMagnitude2 < (double)sqrMagnitude1 ? 1.0 : 0.0));
         if ((double)num > (double)bestScore && (!AI.npc_cover_use_path_distance || npc == null || c.Domain.PathDistanceIsValid(enemyInfo.LastKnownPosition, option.Position, false)))
         {
             Vector3 vector3_2 = Vector3.op_Subtraction(option.Position, enemyInfo.LastKnownPosition);
             if ((double)((Vector3) ref vector3_2).get_sqrMagnitude() < (double)sqrMagnitude1)
             {
                 num *= 0.9f;
             }
             bestScore          = num;
             c.BestAdvanceCover = option;
             return(true);
         }
     }
     return(false);
 }
        public void Tick(IHTNAgent npc, float deltaTime, float time)
        {
            ScientistAStarContext npcContext = npc.AiDomain.NpcContext as ScientistAStarContext;

            if (npcContext == null)
            {
                return;
            }
            if (!npcContext.IsFact(Facts.IsReturningHome))
            {
                if (!Object.op_Equality((Object)npcContext.Memory.PrimaryKnownEnemyPlayer.PlayerInfo.Player, (Object)null) && (double)time - (double)npcContext.Memory.PrimaryKnownEnemyPlayer.Time <= (double)npcContext.Body.AiDefinition.Memory.NoSeeReturnToSpawnTime)
                {
                    return;
                }
                npcContext.SetFact(Facts.IsReturningHome, true, true, true, true);
            }
            else
            {
                if (!npcContext.IsFact(Facts.CanSeeEnemy) && (double)time - (double)npcContext.Body.lastAttackedTime >= 2.0 && !npcContext.IsFact(Facts.AtLocationHome))
                {
                    return;
                }
                npcContext.SetFact(Facts.IsReturningHome, false, true, true, true);
            }
        }