Example #1
0
            internal void Init(ref DetectInfo detectInfo, MyCubeGrid myGrid, GridAi myAi, GridAi targetAi)
            {
                EntInfo   = detectInfo.EntInfo;
                Target    = detectInfo.Parent;
                PartCount = detectInfo.PartCount;
                FatCount  = detectInfo.FatCount;
                IsStatic  = Target.Physics.IsStatic;
                IsGrid    = detectInfo.IsGrid;
                LargeGrid = detectInfo.LargeGrid;
                MyGrid    = myGrid;
                MyAi      = myAi;
                TargetAi  = targetAi;
                Velocity  = Target.Physics.LinearVelocity;
                VelLenSqr = Velocity.LengthSquared();
                var targetSphere = Target.PositionComp.WorldVolume;

                TargetPos    = targetSphere.Center;
                TargetRadius = targetSphere.Radius;
                var myCenter = myAi.GridVolume.Center;

                if (!MyUtils.IsZero(Velocity, 1E-02F))
                {
                    var targetMag = myCenter - TargetPos;
                    Approaching = MathFuncs.IsDotProductWithinTolerance(ref Velocity, ref targetMag, myAi.Session.ApproachDegrees);
                }
                else
                {
                    Approaching   = false;
                    TargetHeading = Vector3D.Zero;
                }

                if (targetAi != null)
                {
                    OffenseRating = targetAi.Construct.OptimalDps / myAi.Construct.OptimalDps;
                    if (OffenseRating <= 0 && detectInfo.Armed)
                    {
                        OffenseRating = 0.0001f;
                    }
                }
                else if (detectInfo.Armed)
                {
                    OffenseRating = 0.0001f;
                }
                else
                {
                    OffenseRating = 0;
                }
                var myRadius       = myAi.MyGrid.PositionComp.LocalVolume.Radius;
                var sphereDistance = MyUtils.GetSmallestDistanceToSphere(ref myCenter, ref targetSphere);

                if (sphereDistance <= myRadius)
                {
                    sphereDistance = 0;
                }
                else
                {
                    sphereDistance -= myRadius;
                }
                DistSqr = sphereDistance * sphereDistance;
            }
Example #2
0
            internal void Init(ref DetectInfo detectInfo, MyCubeGrid myGrid, GridAi myAi, GridAi targetAi)
            {
                EntInfo   = detectInfo.EntInfo;
                Target    = detectInfo.Parent;
                PartCount = detectInfo.PartCount;
                FatCount  = detectInfo.FatCount;
                IsGrid    = detectInfo.IsGrid;
                LargeGrid = detectInfo.LargeGrid;
                MyGrid    = myGrid;
                MyAi      = myAi;
                TargetAi  = targetAi;
                Velocity  = Target.Physics.LinearVelocity;
                VelLenSqr = Velocity.LengthSquared();
                var targetSphere = Target.PositionComp.WorldVolume;

                TargetPos    = targetSphere.Center;
                TargetRadius = targetSphere.Radius;
                if (!MyUtils.IsZero(Velocity, 1E-02F))
                {
                    TargetDir = Vector3D.Normalize(Velocity);
                    var refDir = Vector3D.Normalize(myAi.GridVolume.Center - TargetPos);
                    Approaching = MathFuncs.IsDotProductWithinTolerance(ref TargetDir, ref refDir, myAi.Session.ApproachDegrees);
                }
                else
                {
                    TargetDir   = Vector3D.Zero;
                    Approaching = false;
                }

                if (targetAi != null)
                {
                    OffenseRating = targetAi.Construct.OptimalDps / myAi.Construct.OptimalDps;
                }
                else if (detectInfo.Armed)
                {
                    OffenseRating = 0.0001f;
                }
                else
                {
                    OffenseRating = 0;
                }

                var targetDist = Vector3D.Distance(myAi.GridVolume.Center, TargetPos) - TargetRadius;

                targetDist -= myAi.GridVolume.Radius;
                if (targetDist < 0)
                {
                    targetDist = 0;
                }
                DistSqr = targetDist * targetDist;
            }
Example #3
0
        internal bool GetTargetState()
        {
            var validFocus = false;

            for (int i = 0; i < Focus.Target.Length; i++)
            {
                var        target = Focus.Target[i];
                TargetInfo info;
                if (target == null || !Targets.TryGetValue(target, out info))
                {
                    continue;
                }
                validFocus = true;
                if (!Session.Tick20 && Focus.PrevTargetId[i] == info.EntInfo.EntityId)
                {
                    continue;
                }
                Focus.PrevTargetId[i] = info.EntInfo.EntityId;
                var targetVel = target.Physics?.LinearVelocity ?? Vector3.Zero;
                if (MyUtils.IsZero(targetVel, 1E-02F))
                {
                    targetVel = Vector3.Zero;
                }
                var targetDir    = Vector3D.Normalize(targetVel);
                var targetRevDir = -targetDir;
                var targetPos    = target.PositionComp.WorldAABB.Center;
                var myPos        = MyGrid.PositionComp.WorldAABB.Center;
                var myHeading    = Vector3D.Normalize(myPos - targetPos);

                if (info.LargeGrid && info.PartCount > 24000)
                {
                    Focus.TargetState[i].Size = 6;
                }
                else if (info.LargeGrid && info.PartCount > 12000)
                {
                    Focus.TargetState[i].Size = 5;
                }
                else if (info.LargeGrid && info.PartCount > 6000)
                {
                    Focus.TargetState[i].Size = 4;
                }
                else if (info.LargeGrid && info.PartCount > 3000)
                {
                    Focus.TargetState[i].Size = 3;
                }
                else if (info.LargeGrid)
                {
                    Focus.TargetState[i].Size = 2;
                }
                else if (info.PartCount > 2000)
                {
                    Focus.TargetState[i].Size = 1;
                }
                else
                {
                    Focus.TargetState[i].Size = 0;
                }

                var intercept = MathFuncs.IsDotProductWithinTolerance(ref targetDir, ref myHeading, Session.ApproachDegrees);
                var retreat   = MathFuncs.IsDotProductWithinTolerance(ref targetRevDir, ref myHeading, Session.ApproachDegrees);
                if (intercept)
                {
                    Focus.TargetState[i].Engagement = 0;
                }
                else if (retreat)
                {
                    Focus.TargetState[i].Engagement = 1;
                }
                else
                {
                    Focus.TargetState[i].Engagement = 2;
                }

                var distanceFromCenters = Vector3D.Distance(MyGrid.PositionComp.WorldAABB.Center, target.PositionComp.WorldAABB.Center);
                distanceFromCenters -= MyGrid.PositionComp.LocalVolume.Radius;
                distanceFromCenters -= target.PositionComp.LocalVolume.Radius;
                distanceFromCenters  = distanceFromCenters <= 0 ? 0 : distanceFromCenters;

                var distPercent = (distanceFromCenters / MaxTargetingRange) * 100;
                if (distPercent > 95)
                {
                    Focus.TargetState[i].Distance = 9;
                }
                else if (distPercent > 90)
                {
                    Focus.TargetState[i].Distance = 8;
                }
                else if (distPercent > 80)
                {
                    Focus.TargetState[i].Distance = 7;
                }
                else if (distPercent > 70)
                {
                    Focus.TargetState[i].Distance = 6;
                }
                else if (distPercent > 60)
                {
                    Focus.TargetState[i].Distance = 5;
                }
                else if (distPercent > 50)
                {
                    Focus.TargetState[i].Distance = 4;
                }
                else if (distPercent > 40)
                {
                    Focus.TargetState[i].Distance = 3;
                }
                else if (distPercent > 30)
                {
                    Focus.TargetState[i].Distance = 2;
                }
                else if (distPercent > 20)
                {
                    Focus.TargetState[i].Distance = 1;
                }
                else if (distPercent > 0)
                {
                    Focus.TargetState[i].Distance = 0;
                }
                else
                {
                    Focus.TargetState[i].Distance = -1;
                }

                var speed = Math.Round(target.Physics?.Speed ?? 0, 1);
                if (speed <= 0)
                {
                    Focus.TargetState[i].Speed = -1;
                }
                else
                {
                    var speedPercent = (speed / Session.MaxEntitySpeed) * 100;
                    if (speedPercent > 95)
                    {
                        Focus.TargetState[i].Speed = 9;
                    }
                    else if (speedPercent > 90)
                    {
                        Focus.TargetState[i].Speed = 8;
                    }
                    else if (speedPercent > 80)
                    {
                        Focus.TargetState[i].Speed = 7;
                    }
                    else if (speedPercent > 70)
                    {
                        Focus.TargetState[i].Speed = 6;
                    }
                    else if (speedPercent > 60)
                    {
                        Focus.TargetState[i].Speed = 5;
                    }
                    else if (speedPercent > 50)
                    {
                        Focus.TargetState[i].Speed = 4;
                    }
                    else if (speedPercent > 40)
                    {
                        Focus.TargetState[i].Speed = 3;
                    }
                    else if (speedPercent > 30)
                    {
                        Focus.TargetState[i].Speed = 2;
                    }
                    else if (speedPercent > 20)
                    {
                        Focus.TargetState[i].Speed = 1;
                    }
                    else if (speedPercent > 0)
                    {
                        Focus.TargetState[i].Speed = 0;
                    }
                    else
                    {
                        Focus.TargetState[i].Speed = -1;
                    }
                }

                MyTuple <bool, bool, float, float, float, int> shieldInfo = new MyTuple <bool, bool, float, float, float, int>();
                if (Session.ShieldApiLoaded)
                {
                    shieldInfo = Session.SApi.GetShieldInfo(target);
                }
                if (shieldInfo.Item1)
                {
                    var shieldPercent = shieldInfo.Item5;
                    if (shieldPercent > 95)
                    {
                        Focus.TargetState[i].ShieldHealth = 9;
                    }
                    else if (shieldPercent > 90)
                    {
                        Focus.TargetState[i].ShieldHealth = 8;
                    }
                    else if (shieldPercent > 80)
                    {
                        Focus.TargetState[i].ShieldHealth = 7;
                    }
                    else if (shieldPercent > 70)
                    {
                        Focus.TargetState[i].ShieldHealth = 6;
                    }
                    else if (shieldPercent > 60)
                    {
                        Focus.TargetState[i].ShieldHealth = 5;
                    }
                    else if (shieldPercent > 50)
                    {
                        Focus.TargetState[i].ShieldHealth = 4;
                    }
                    else if (shieldPercent > 40)
                    {
                        Focus.TargetState[i].ShieldHealth = 3;
                    }
                    else if (shieldPercent > 30)
                    {
                        Focus.TargetState[i].ShieldHealth = 2;
                    }
                    else if (shieldPercent > 20)
                    {
                        Focus.TargetState[i].ShieldHealth = 1;
                    }
                    else if (shieldPercent > 0)
                    {
                        Focus.TargetState[i].ShieldHealth = 0;
                    }
                    else
                    {
                        Focus.TargetState[i].ShieldHealth = -1;
                    }
                }
                else
                {
                    Focus.TargetState[i].ShieldHealth = -1;
                }

                var grid   = target as MyCubeGrid;
                var friend = false;
                if (grid != null && grid.BigOwners.Count != 0)
                {
                    var relation = MyIDModule.GetRelationPlayerBlock(MyOwner, grid.BigOwners[0], MyOwnershipShareModeEnum.Faction);
                    if (relation == MyRelationsBetweenPlayerAndBlock.FactionShare || relation == MyRelationsBetweenPlayerAndBlock.Owner || relation == MyRelationsBetweenPlayerAndBlock.Friends)
                    {
                        friend = true;
                    }
                }

                if (friend)
                {
                    Focus.TargetState[i].ThreatLvl = -1;
                }
                else
                {
                    int shieldBonus = 0;
                    if (Session.ShieldApiLoaded)
                    {
                        var myShieldInfo = Session.SApi.GetShieldInfo(MyGrid);
                        if (shieldInfo.Item1 && myShieldInfo.Item1)
                        {
                            shieldBonus = shieldInfo.Item5 > myShieldInfo.Item5 ? 1 : -1;
                        }
                        else if (shieldInfo.Item1)
                        {
                            shieldBonus = 1;
                        }
                        else if (myShieldInfo.Item1)
                        {
                            shieldBonus = -1;
                        }
                    }

                    var offenseRating = info.OffenseRating;
                    if (offenseRating > 5)
                    {
                        Focus.TargetState[i].ThreatLvl = shieldBonus < 0 ? 8 : 9;
                    }
                    else if (offenseRating > 4)
                    {
                        Focus.TargetState[i].ThreatLvl = 8 + shieldBonus;
                    }
                    else if (offenseRating > 3)
                    {
                        Focus.TargetState[i].ThreatLvl = 7 + shieldBonus;
                    }
                    else if (offenseRating > 2)
                    {
                        Focus.TargetState[i].ThreatLvl = 6 + shieldBonus;
                    }
                    else if (offenseRating > 1)
                    {
                        Focus.TargetState[i].ThreatLvl = 5 + shieldBonus;
                    }
                    else if (offenseRating > 0.5)
                    {
                        Focus.TargetState[i].ThreatLvl = 4 + shieldBonus;
                    }
                    else if (offenseRating > 0.25)
                    {
                        Focus.TargetState[i].ThreatLvl = 3 + shieldBonus;
                    }

                    else if (offenseRating > 0.125)
                    {
                        Focus.TargetState[i].ThreatLvl = 2 + shieldBonus;
                    }
                    else if (offenseRating > 0.0625)
                    {
                        Focus.TargetState[i].ThreatLvl = 1 + shieldBonus;
                    }
                    else if (offenseRating > 0)
                    {
                        Focus.TargetState[i].ThreatLvl = shieldBonus > 0 ? 1 : 0;
                    }
                    else
                    {
                        Focus.TargetState[i].ThreatLvl = -1;
                    }
                }
            }
            return(validFocus);
        }