コード例 #1
0
        public static bool ColorGridOrBlockRequestValidationPatch(MyCubeGrid __instance, ref bool __result, long player)
        {
            if (player == 0L || !Sandbox.Game.Multiplayer.Sync.IsServer || __instance.BigOwners.Count == 0)
            {
                __result = true;
            }
            else
            {
                foreach (long bigOwner in __instance.BigOwners)
                {
                    MyRelationsBetweenPlayerAndBlock relationPlayerBlock = MyIDModule.GetRelationPlayerBlock(bigOwner, player, MyOwnershipShareModeEnum.Faction, MyRelationsBetweenPlayerAndBlock.Enemies, MyRelationsBetweenFactions.Enemies, MyRelationsBetweenPlayerAndBlock.FactionShare);

                    if (relationPlayerBlock == MyRelationsBetweenPlayerAndBlock.Owner ||
                        relationPlayerBlock == MyRelationsBetweenPlayerAndBlock.FactionShare ||
                        relationPlayerBlock == MyRelationsBetweenPlayerAndBlock.NoOwnership)
                    {
                        __result = true;
                        break;
                    }
                }
            }

            // Stop the original method from running
            return(false);
        }
コード例 #2
0
        private void CheckAdminRights()
        {
            const string spider = "Space_spider";
            const string wolf   = "SpaceWolf";

            foreach (var item in Players)
            {
                var pLevel   = item.Value.PromoteLevel;
                var playerId = item.Key;
                var player   = item.Value;
                var wasAdmin = Admins.ContainsKey(playerId);

                if (pLevel == MyPromoteLevel.Admin || pLevel == MyPromoteLevel.Owner || pLevel == MyPromoteLevel.SpaceMaster)
                {
                    var character = player.Character;
                    var isAdmin   = false;
                    if (character != null)
                    {
                        if (character.Definition.Id.SubtypeName.Equals(wolf) || character.Definition.Id.SubtypeName.StartsWith(spider))
                        {
                            continue;
                        }

                        if (MySafeZone.CheckAdminIgnoreSafezones(player.SteamUserId))
                        {
                            isAdmin = true;
                        }
                        else
                        {
                            foreach (var gridAi in GridTargetingAIs.Values)
                            {
                                if (gridAi.Targets.ContainsKey((MyEntity)character) && gridAi.Weapons.Count > 0 && ((IMyTerminalBlock)gridAi.Weapons[0].MyCube).HasPlayerAccess(playerId))
                                {
                                    if (MyIDModule.GetRelationPlayerBlock(playerId, gridAi.AiOwner) == MyRelationsBetweenPlayerAndBlock.Enemies)
                                    {
                                        isAdmin = true;
                                        break;
                                    }
                                }
                            }
                        }

                        if (isAdmin)
                        {
                            Admins[playerId]    = character;
                            AdminMap[character] = player;
                            continue;
                        }
                    }
                }

                if (wasAdmin)
                {
                    IMyCharacter removeCharacter;
                    IMyPlayer    removePlayer;
                    Admins.TryRemove(playerId, out removeCharacter);
                    AdminMap.TryRemove(removeCharacter, out removePlayer);
                }
            }
        }
コード例 #3
0
        private static void PrepBlocks(Random rand, MyIDModule owner, MyObjectBuilder_CubeGrid grid, GridComponents comps)
        {
            for (int i = grid.CubeBlocks.Count - 1; i >= 0; i--)
            {
                MyObjectBuilder_CubeBlock cubeBuilder = grid.CubeBlocks[i];
                if (cubeBuilder.EntityId == 0)
                {
                    if (!Utilities.RandomEntityId(rand, out cubeBuilder.EntityId))
                    {
                        grid.CubeBlocks.RemoveAtFast(i);
                        continue;
                    }
                }

                cubeBuilder.SetupForProjector();
                MyCubeBlockDefinition def = MyDefinitionManager.Static.GetCubeBlockDefinition(cubeBuilder);
                if (def == null)
                {
                    grid.CubeBlocks.RemoveAtFast(i);
                    continue;
                }

                if (comps != null)
                {
                    comps.Include(def);
                }

                cubeBuilder.Owner     = owner.Owner;
                cubeBuilder.BuiltBy   = owner.Owner;
                cubeBuilder.ShareMode = owner.ShareMode;

                // Since the cross grid entity ids are invalid, remove references to them.
                if (cubeBuilder is MyObjectBuilder_AttachableTopBlockBase)
                {
                    ((MyObjectBuilder_AttachableTopBlockBase)cubeBuilder).ParentEntityId = 0;
                }
                if (cubeBuilder is MyObjectBuilder_MechanicalConnectionBlock)
                {
                    ((MyObjectBuilder_MechanicalConnectionBlock)cubeBuilder).TopBlockId = null;
                }
                if (cubeBuilder is MyObjectBuilder_MotorBase)
                {
                    ((MyObjectBuilder_MotorBase)cubeBuilder).RotorEntityId = null;
                }


                if (cubeBuilder is MyObjectBuilder_FunctionalBlock)
                {
                    ((MyObjectBuilder_FunctionalBlock)cubeBuilder).Enabled = true;
                }
                if (cubeBuilder is MyObjectBuilder_BatteryBlock)
                {
                    MyBatteryBlockDefinition batDef = (MyBatteryBlockDefinition)def;
                    ((MyObjectBuilder_BatteryBlock)cubeBuilder).CurrentStoredPower = batDef.InitialStoredPowerRatio * batDef.MaxStoredPower;
                }
            }
        }
コード例 #4
0
        private static bool PrepBlocks(ulong activator, MyIDModule owner, MyObjectBuilder_CubeGrid grid, GridComponents comps)
        {
            foreach (MyObjectBuilder_CubeBlock cubeBuilder in grid.CubeBlocks)
            {
                if (cubeBuilder.EntityId == 0)
                {
                    if (!Constants.RandomEntityId(out cubeBuilder.EntityId))
                    {
                        return(false);
                    }
                }

                cubeBuilder.SetupForProjector();
                MyCubeBlockDefinition def = MyDefinitionManager.Static.GetCubeBlockDefinition(cubeBuilder);
                if (def == null)
                {
                    Constants.Notify(Constants.msgUnknownBlock, activator);
                    return(false);
                }

                if (comps != null)
                {
                    comps.Include(def);
                }

                cubeBuilder.Owner     = owner.Owner;
                cubeBuilder.BuiltBy   = owner.Owner;
                cubeBuilder.ShareMode = owner.ShareMode;

                // Since the cross grid entity ids are invalid, remove references to them.
                if (cubeBuilder is MyObjectBuilder_AttachableTopBlockBase)
                {
                    ((MyObjectBuilder_AttachableTopBlockBase)cubeBuilder).ParentEntityId = 0;
                }
                if (cubeBuilder is MyObjectBuilder_MechanicalConnectionBlock)
                {
                    ((MyObjectBuilder_MechanicalConnectionBlock)cubeBuilder).TopBlockId = null;
                }

                if (cubeBuilder is MyObjectBuilder_FunctionalBlock)
                {
                    ((MyObjectBuilder_FunctionalBlock)cubeBuilder).Enabled = true;
                }
                if (cubeBuilder is MyObjectBuilder_BatteryBlock)
                {
                    MyBatteryBlockDefinition batDef = (MyBatteryBlockDefinition)def;
                    ((MyObjectBuilder_BatteryBlock)cubeBuilder).CurrentStoredPower = batDef.InitialStoredPowerRatio * batDef.MaxStoredPower;
                }
            }

            return(true);
        }
コード例 #5
0
        public static bool GridEnemy(long gridOwner, MyCubeGrid grid, List <long> owners = null)
        {
            if (owners == null)
            {
                owners = grid.BigOwners;
            }
            if (owners.Count == 0)
            {
                return(true);
            }
            var relationship = MyIDModule.GetRelationPlayerBlock(gridOwner, owners[0], MyOwnershipShareModeEnum.Faction);
            var enemy        = relationship != MyRelationsBetweenPlayerAndBlock.Owner && relationship != MyRelationsBetweenPlayerAndBlock.FactionShare;

            return(enemy);
        }
コード例 #6
0
        private void OnMessageRecieved(MyRadioAntenna requester, string arg, MyTransmitTarget target)
        {
            if (!ReferenceEquals(requester.CubeGrid, base.CubeGrid))
            {
                MyProgrammableBlock block2;
                switch (MyIDModule.GetRelation(base.OwnerId, requester.OwnerId, MyOwnershipShareModeEnum.Faction, MyRelationsBetweenPlayerAndBlock.Enemies, MyRelationsBetweenFactions.Enemies, MyRelationsBetweenPlayerAndBlock.FactionShare))
                {
                case MyRelationsBetweenPlayerAndBlock.NoOwnership:
                case MyRelationsBetweenPlayerAndBlock.Neutral:
                    if (target.HasFlag(MyTransmitTarget.Neutral))
                    {
                        break;
                    }
                    return;

                case MyRelationsBetweenPlayerAndBlock.Owner:
                    if (target.HasFlag(MyTransmitTarget.Owned))
                    {
                        break;
                    }
                    return;

                case MyRelationsBetweenPlayerAndBlock.FactionShare:
                    if (!this.m_ignoreAlliedBroadcast.Value && target.HasFlag(MyTransmitTarget.Ally))
                    {
                        break;
                    }
                    return;

                case MyRelationsBetweenPlayerAndBlock.Enemies:
                    if (!this.m_ignoreOtherBroadcast.Value && target.HasFlag(MyTransmitTarget.Enemy))
                    {
                        break;
                    }
                    return;

                default:
                    return;
                }
                Sandbox.Game.Entities.MyEntities.TryGetEntityById <MyProgrammableBlock>(this.m_attachedPB.Value, out block2, false);
                if (((this.RadioReceiver != null) && ((block2 != null) && MyCubeGridGroups.Static.Logical.GetGroup(block2.CubeGrid).Nodes.Any <MyGroups <MyCubeGrid, MyGridLogicalGroupData> .Node>(n => (n.NodeData == base.CubeGrid)))) && MyAntennaSystem.Static.GetAllRelayedBroadcasters(this.RadioReceiver, base.OwnerId, false, null).Contains(requester.RadioBroadcaster))
                {
                    block2.Run(arg, UpdateType.Antenna);
                }
            }
        }
コード例 #7
0
        private void UpdatePlayerPainters()
        {
            ActiveMarks.Clear();
            foreach (var pair in PlayerDummyTargets)
            {
                IMyPlayer player;
                if (Players.TryGetValue(pair.Key, out player))
                {
                    var      painted = pair.Value.PaintedTarget;
                    MyEntity target;
                    if (!painted.Dirty && painted.EntityId != 0 && Tick - painted.LastInfoTick < 300 && !MyUtils.IsZero(painted.LocalPosition) && MyEntities.TryGetEntityById(painted.EntityId, out target))
                    {
                        var grid = target as MyCubeGrid;
                        if (player.IdentityId == PlayerId && grid != null)
                        {
                            var    v3 = grid.LocalToGridInteger(painted.LocalPosition);
                            MyCube cube;

                            if (!grid.TryGetCube(v3, out cube))
                            {
                                var startPos = grid.GridIntegerToWorld(v3);
                                var endPos   = startPos + (TargetUi.AimDirection * grid.PositionComp.LocalVolume.Radius);

                                if (grid.RayCastBlocks(startPos, endPos) == null)
                                {
                                    if (++painted.MissCount > 2)
                                    {
                                        painted.ClearMark(Tick);
                                    }
                                }
                            }
                        }

                        var rep    = MyIDModule.GetRelationPlayerPlayer(PlayerId, player.IdentityId);
                        var self   = rep == MyRelationsBetweenPlayers.Self;
                        var friend = rep == MyRelationsBetweenPlayers.Allies;
                        var neut   = rep == MyRelationsBetweenPlayers.Neutral;
                        var color  = neut ? new Vector4(1, 1, 1, 1) : self ? new Vector4(0.025f, 1f, 0.25f, 2) : friend ? new Vector4(0.025f, 0.025f, 1, 2) : new Vector4(1, 0.025f, 0.025f, 2);
                        ActiveMarks.Add(new MyTuple <IMyPlayer, Vector4, GridAi.FakeTarget>(player, color, painted));
                    }
                }
            }
        }
コード例 #8
0
ファイル: SessionJobs.cs プロジェクト: dbenson24/WeaponCore
 private void UpdatePlayerPainters()
 {
     ActiveMarks.Clear();
     foreach (var pair in PlayerDummyTargets)
     {
         IMyPlayer player;
         if (Players.TryGetValue(pair.Key, out player))
         {
             var      painted = pair.Value.PaintedTarget;
             MyEntity target;
             if (!painted.Dirty && painted.EntityId != 0 && Tick - painted.LastInfoTick < 300 && !MyUtils.IsZero(painted.LocalPosition) && MyEntities.TryGetEntityById(painted.EntityId, out target))
             {
                 var rep    = MyIDModule.GetRelationPlayerPlayer(PlayerId, player.IdentityId);
                 var self   = rep == MyRelationsBetweenPlayers.Self;
                 var friend = rep == MyRelationsBetweenPlayers.Allies;
                 var neut   = rep == MyRelationsBetweenPlayers.Neutral;
                 var color  = neut ? new Vector4(1, 1, 1, 1) : self ? new Vector4(0.025f, 1f, 0.25f, 2) : friend ? new Vector4(0.025f, 0.025f, 1, 2) : new Vector4(1, 0.025f, 0.025f, 2);
                 ActiveMarks.Add(new MyTuple <IMyPlayer, Vector4, GridAi.FakeTarget>(player, color, painted));
             }
         }
     }
 }
コード例 #9
0
        /// <summary>
        /// Check the ownership of the grid
        /// </summary>
        /// <param name="cubeGrid"></param>
        /// <param name="userId"></param>
        /// <returns></returns>
        public static VRage.Game.MyRelationsBetweenPlayerAndBlock GetUserRelationToOwner(this IMyCubeGrid cubeGrid, long userId)
        {
            var enemies = false;
            var neutral = false;

            try
            {
                foreach (var key in cubeGrid.BigOwners)
                {
                    var relation = MyIDModule.GetRelation(key, userId, VRage.Game.MyOwnershipShareModeEnum.Faction);
                    if (relation == VRage.Game.MyRelationsBetweenPlayerAndBlock.Owner || relation == VRage.Game.MyRelationsBetweenPlayerAndBlock.FactionShare)
                    {
                        return(relation);
                    }
                    else if (relation == VRage.Game.MyRelationsBetweenPlayerAndBlock.Enemies)
                    {
                        enemies = true;
                    }
                    else if (relation == VRage.Game.MyRelationsBetweenPlayerAndBlock.Neutral)
                    {
                        neutral = true;
                    }
                }
            }
            catch {
                //The list BigOwners could change while iterating -> a silent catch
            }
            if (enemies)
            {
                return(VRage.Game.MyRelationsBetweenPlayerAndBlock.Enemies);
            }
            if (neutral)
            {
                return(VRage.Game.MyRelationsBetweenPlayerAndBlock.Neutral);
            }
            return(VRage.Game.MyRelationsBetweenPlayerAndBlock.NoOwnership);
        }
コード例 #10
0
        internal bool GetTargetState(Session s)
        {
            var ai         = s.TrackingAi;
            var validFocus = false;
            var size0      = s.Settings.Enforcement.ShipSizes[0];
            var size1      = s.Settings.Enforcement.ShipSizes[1];
            var size2      = s.Settings.Enforcement.ShipSizes[2];
            var size3      = s.Settings.Enforcement.ShipSizes[3];
            var size4      = s.Settings.Enforcement.ShipSizes[4];
            var size5      = s.Settings.Enforcement.ShipSizes[5];
            var size6      = s.Settings.Enforcement.ShipSizes[6];

            if (s.Tick - MasterUpdateTick > 300 || MasterUpdateTick < 300 && _masterTargets.Count == 0)
            {
                BuildMasterCollections(ai);
            }

            for (int i = 0; i < ai.Construct.Data.Repo.FocusData.Target.Length; i++)
            {
                var      targetId = ai.Construct.Data.Repo.FocusData.Target[i];
                float    offenseRating;
                MyEntity target;
                if (targetId <= 0 || !MyEntities.TryGetEntityById(targetId, out target) || !_masterTargets.TryGetValue(target, out offenseRating))
                {
                    continue;
                }
                validFocus = true;
                if (!s.Tick20)
                {
                    continue;
                }
                var grid      = target as MyCubeGrid;
                var partCount = 1;
                var largeGrid = false;
                var smallGrid = false;
                if (grid != null)
                {
                    largeGrid = grid.GridSizeEnum == MyCubeSize.Large;
                    smallGrid = !largeGrid;
                    GridAi  targetAi;
                    GridMap gridMap;
                    if (s.GridToMasterAi.TryGetValue(grid, out targetAi))
                    {
                        partCount = targetAi.Construct.BlockCount;
                    }
                    else if (s.GridToInfoMap.TryGetValue(grid, out gridMap))
                    {
                        partCount = gridMap.MostBlocks;
                    }
                }

                var targetVel = target.Physics?.LinearVelocity ?? Vector3.Zero;
                if (MyUtils.IsZero(targetVel, 1E-01F))
                {
                    targetVel = Vector3.Zero;
                }
                var targetDir    = Vector3D.Normalize(targetVel);
                var targetRevDir = -targetDir;
                var targetPos    = target.PositionComp.WorldAABB.Center;
                var myPos        = ai.MyGrid.PositionComp.WorldAABB.Center;
                var myHeading    = Vector3D.Normalize(myPos - targetPos);

                if ((size6.LargeGrid && largeGrid || !size6.LargeGrid && smallGrid) && partCount > size6.BlockCount)
                {
                    ai.TargetState[i].Size = 6;
                }
                else if ((size5.LargeGrid && largeGrid || !size5.LargeGrid && smallGrid) && partCount > size5.BlockCount)
                {
                    ai.TargetState[i].Size = 5;
                }
                else if ((size4.LargeGrid && largeGrid || !size4.LargeGrid && smallGrid) && partCount > size4.BlockCount)
                {
                    ai.TargetState[i].Size = 4;
                }
                else if ((size3.LargeGrid && largeGrid || !size3.LargeGrid && smallGrid) && partCount > size3.BlockCount)
                {
                    ai.TargetState[i].Size = 3;
                }
                else if ((size2.LargeGrid && largeGrid || !size2.LargeGrid && smallGrid) && partCount > size2.BlockCount)
                {
                    ai.TargetState[i].Size = 2;
                }
                else if ((size1.LargeGrid && largeGrid || !size1.LargeGrid && smallGrid) && partCount > size1.BlockCount)
                {
                    ai.TargetState[i].Size = 1;
                }
                else
                {
                    ai.TargetState[i].Size = 0;
                }

                ai.TargetState[i].SizeExtended = partCount / (largeGrid ? 100f : 500f);

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

                var distanceFromCenters = Vector3D.Distance(ai.MyGrid.PositionComp.WorldAABB.Center, target.PositionComp.WorldAABB.Center);
                distanceFromCenters           -= ai.MyGrid.PositionComp.LocalVolume.Radius;
                distanceFromCenters           -= target.PositionComp.LocalVolume.Radius;
                distanceFromCenters            = distanceFromCenters <= 0 ? 0 : distanceFromCenters;
                ai.TargetState[i].RealDistance = distanceFromCenters;

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

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

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

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

                if (friend)
                {
                    ai.TargetState[i].ThreatLvl = -1;
                }
                else
                {
                    int shieldBonus = 0;
                    if (s.ShieldApiLoaded)
                    {
                        var myShieldInfo = s.SApi.GetShieldInfo(ai.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;
                        }
                    }

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

                    else if (offenseRating > 0.125)
                    {
                        ai.TargetState[i].ThreatLvl = 2 + shieldBonus;
                    }
                    else if (offenseRating > 0.0625)
                    {
                        ai.TargetState[i].ThreatLvl = 1 + shieldBonus;
                    }
                    else if (offenseRating > 0)
                    {
                        ai.TargetState[i].ThreatLvl = shieldBonus > 0 ? 1 : 0;
                    }
                    else
                    {
                        ai.TargetState[i].ThreatLvl = -1;
                    }
                }
            }
            return(validFocus);
        }
コード例 #11
0
ファイル: Disruption.cs プロジェクト: zrisher/ARMS
        /// <summary>
        /// Adds a disruption effect to a grid.
        /// </summary>
        /// <param name="grid">Grid that will be disrupted</param>
        /// <param name="duration">Duration of disruption</param>
        /// <param name="strength">Strength of disruption (in hackyness)</param>
        /// <param name="effectOwner">The owner of the disruption.</param>
        public void Start(IMyCubeGrid grid, TimeSpan duration, ref float strength, long effectOwner)
        {
            if (strength < MinCost)
            {
                Logger.DebugLog("strength: " + strength + ", below minimum: " + MinCost);
                return;
            }

            CubeGridCache cache   = CubeGridCache.GetFor(grid);
            float         applied = 0;

            if (!EffectOwnerCanAccess)
            {
                effectOwner = long.MinValue;
            }
            m_effectOwner = effectOwner;
            foreach (MyObjectBuilderType type in BlocksAffected)
            {
                foreach (IMyCubeBlock block in cache.BlocksOfType(type).OrderBy(OrderBy))
                {
                    if (!block.IsWorking || m_allAffected.Contains(block))
                    {
                        Logger.DebugLog("cannot disrupt: " + block);
                        continue;
                    }
                    float cost = BlockCost(block);
                    if (cost > strength)
                    {
                        Logger.DebugLog("cannot disrupt block: " + block + ", cost: " + cost + " is greater than strength available: " + strength);
                        continue;
                    }

                    StartEffect(block);
                    Logger.DebugLog("disrupting: " + block + ", cost: " + cost + ", remaining strength: " + strength);
                    strength -= cost;
                    applied  += cost;
                    MyCubeBlock cubeBlock = block as MyCubeBlock;
                    MyIDModule  idMod     = new MyIDModule()
                    {
                        Owner = cubeBlock.IDModule.Owner, ShareMode = cubeBlock.IDModule.ShareMode
                    };
                    m_affected.Add(block, idMod);
                    m_allAffected.Add(block);

                    block.SetDamageEffect(true);
                    cubeBlock.ChangeOwner(effectOwner, MyOwnershipShareModeEnum.Faction);

                    if (strength < MinCost)
                    {
                        goto FinishedBlocks;
                    }
                }
            }
FinishedBlocks:
            if (m_affected.Count != 0)
            {
                Logger.DebugLog("Added new effect, strength: " + applied);
                m_expire = Globals.ElapsedTime.Add(duration);

                UpdateManager.Register(UpdateFrequency, UpdateEffect);                 // don't unregister on grid close, blocks can still be valid
                AllDisruptions.Add(this);
            }
        }
コード例 #12
0
ファイル: AiSupport.cs プロジェクト: Coreman230/WeaponCore
        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);
        }
コード例 #13
0
        /// <summary>
        /// Check the ownership of the grid
        /// </summary>
        /// <param name="cubeGrid"></param>
        /// <param name="userId"></param>
        /// <returns></returns>
        public static VRage.Game.MyRelationsBetweenPlayerAndBlock GetUserRelationToOwner(this IMyCubeGrid cubeGrid, long userId, bool ignoreCubeGridList = false)
        {
            var enemies = false;
            var neutral = false;

            try
            {
                if (cubeGrid.BigOwners != null && cubeGrid.BigOwners.Count != 0)
                {
                    foreach (var key in cubeGrid.BigOwners)
                    {
                        var relation = MyIDModule.GetRelationPlayerBlock(key, userId, VRage.Game.MyOwnershipShareModeEnum.Faction);
                        if (relation == VRage.Game.MyRelationsBetweenPlayerAndBlock.Owner || relation == VRage.Game.MyRelationsBetweenPlayerAndBlock.FactionShare)
                        {
                            return(relation);
                        }
                        else if (relation == VRage.Game.MyRelationsBetweenPlayerAndBlock.Enemies)
                        {
                            enemies = true;
                        }
                        else if (relation == VRage.Game.MyRelationsBetweenPlayerAndBlock.Neutral)
                        {
                            neutral = true;
                        }
                    }
                }
                else if (!ignoreCubeGridList)
                {
                    //E.G. the case if a landing gear is directly attatched to piston/rotor (with no ownable block in the same subgrid) and the gear gets connected to something
                    var cubegridsList = MyAPIGateway.GridGroups.GetGroup(cubeGrid, GridLinkTypeEnum.Mechanical);
                    if (cubegridsList != null)
                    {
                        foreach (var cubeGrid1 in cubegridsList)
                        {
                            if (cubeGrid1 == cubeGrid)
                            {
                                continue;
                            }
                            var relation = cubeGrid1.GetUserRelationToOwner(userId, true); //Do not recurse as this list is already complete
                            if (relation == VRage.Game.MyRelationsBetweenPlayerAndBlock.Owner || relation == VRage.Game.MyRelationsBetweenPlayerAndBlock.FactionShare)
                            {
                                return(relation);
                            }
                            else if (relation == VRage.Game.MyRelationsBetweenPlayerAndBlock.Enemies)
                            {
                                enemies = true;
                            }
                            else if (relation == VRage.Game.MyRelationsBetweenPlayerAndBlock.Neutral)
                            {
                                neutral = true;
                            }
                        }
                    }
                }
            }
            catch {
                //The list BigOwners could change while iterating -> a silent catch
            }
            if (enemies)
            {
                return(VRage.Game.MyRelationsBetweenPlayerAndBlock.Enemies);
            }
            if (neutral)
            {
                return(VRage.Game.MyRelationsBetweenPlayerAndBlock.Neutral);
            }
            return(VRage.Game.MyRelationsBetweenPlayerAndBlock.NoOwnership);
        }
コード例 #14
0
        void Server_GrindingBlock(IMySlimBlock block, ref MyDamageInformation info, IMyAngleGrinder grinder, ulong attackerSteamId)
        {
            DetachData data = Server_DetachData.GetValueOrDefault(attackerSteamId);

            if (data == null || !data.DetachMode)
            {
                return;
            }

            float grindAmount = info.Amount; // store grinder speed for later use

            info.Amount = 0;                 // prevent grinding while detach mode is enabled

            MyCubeBlockDefinition blockDef = (MyCubeBlockDefinition)block.BlockDefinition;

            if (!blockDef.IsStandAlone || !blockDef.HasPhysics)
            {
                ProgressPacket.Send(attackerSteamId, DetachState.NoStandalone);
                return;
            }

            if (grindAmount == 0)
            {
                ProgressPacket.Send(attackerSteamId, DetachState.ZeroGrindAmount);
                return;
            }

            long owner = block.OwnerId;

            if (owner == 0 && block.CubeGrid.BigOwners != null && block.CubeGrid.BigOwners.Count > 0)
            {
                owner = block.CubeGrid.BigOwners[0];
            }

            if (owner == 0)
            {
                owner = block.BuiltBy;
            }

            if (owner != 0)
            {
                MyRelationsBetweenPlayerAndBlock relation = MyIDModule.GetRelationPlayerBlock(owner, grinder.OwnerIdentityId, MyOwnershipShareModeEnum.Faction);
                if (relation == MyRelationsBetweenPlayerAndBlock.Enemies)
                {
                    ProgressPacket.Send(attackerSteamId, DetachState.EnemyBlock);
                    return;
                }
            }

            MyCubeGrid grid = (MyCubeGrid)block.CubeGrid;

            if (grid.BlocksCount <= 1)
            {
                if (grid.DisplayName.StartsWith("(Detached"))
                {
                    ProgressPacket.Send(attackerSteamId, DetachState.DetachComplete);
                }
                else
                {
                    ProgressPacket.Send(attackerSteamId, DetachState.SingleBlock);
                }
                return;
            }

            // checking safezones doesn't seem necessary, as you cannot grind to begin with...

            if (data.GrindedBlock != block)
            {
                data.GrindedBlock       = block;
                data.GrindedTimes       = 0;
                data.GrindExpiresAtTick = 0;
            }

            int tick = MyAPIGateway.Session.GameplayFrameCounter;

            if (data.GrindExpiresAtTick == 0 || data.GrindExpiresAtTick > tick)
            {
                data.GrindedTimes++;
            }
            else
            {
                data.GrindedTimes = 0;
            }

            data.GrindExpiresAtTick = tick + 30;

            // make it require as much time as it normally would to grind to critical line
            float divideBy           = (block.FatBlock != null ? block.FatBlock.DisassembleRatio : blockDef.DisassembleRatio);
            float finalDamage        = (grindAmount / divideBy) * blockDef.IntegrityPointsPerSec;
            int   grindTimesToDetach = (int)((block.MaxIntegrity * blockDef.CriticalIntegrityRatio) / finalDamage);

            grindTimesToDetach = Math.Max(grindTimesToDetach, (int)(1000 / GrinderCooldownMs)); // at least one second

            if (data.GrindedTimes >= grindTimesToDetach)
            {
                data.GrindedTimes = 0;
                ProgressPacket.Send(attackerSteamId, DetachState.DetachComplete);
                DetachBlock(block, grinder);
            }
            else
            {
                int progress = (data.GrindedTimes * 100) / grindTimesToDetach;
                ProgressPacket.Send(attackerSteamId, DetachState.Detaching, progress);
            }
        }
コード例 #15
0
        public static bool TryCreate(ulong activator, IMyProjector p, bool shiftBuildArea, out ProjectedGrid projectedGrid)
        {
            projectedGrid = null;

            // Ensure the projector is valid and has a projection
            if (p.CubeGrid?.Physics == null)
            {
                Utilities.Notify(Constants.msgError + "bad_physics", activator);
                return(false);
            }

            if (p.ProjectedGrid == null)
            {
                Utilities.Notify(Constants.msgNoGrid, activator);
                return(false);
            }

            MyObjectBuilder_Projector pBuilder = (MyObjectBuilder_Projector)p.GetObjectBuilderCubeBlock(true);

            if (pBuilder.ProjectedGrids == null || pBuilder.ProjectedGrids.Count == 0)
            {
                Utilities.Notify(Constants.msgNoGrid, activator);
                return(false);
            }

            // Prepare list of grids
            List <MyObjectBuilder_CubeGrid> grids = pBuilder.ProjectedGrids;
            int largestIndex = FindLargest(grids);

            MyObjectBuilder_CubeGrid largestGrid = grids[largestIndex];

            if (Utilities.SupportsSubgrids(p))
            {
                if (largestIndex != 0)
                {
                    MyObjectBuilder_CubeGrid temp = grids[0];
                    grids[0]            = largestGrid;
                    grids[largestIndex] = temp;
                }
            }
            else
            {
                grids.Clear();
                grids.Add(largestGrid);
            }

            MatrixD largestMatrixInvert = MatrixD.Invert(largestGrid.PositionAndOrientation.Value.GetMatrix());
            MatrixD targetMatrix        = p.ProjectedGrid.WorldMatrix;

            float scale = GetScale(p);

            GridOrientation orientation = new GridOrientation(p);

            GridComponents comps = null;

            if (!MyAPIGateway.Session.CreativeMode)
            {
                comps = new GridComponents();
            }

            int totalBlocks = 0;

            MyIDModule owner = ((MyCubeBlock)p).IDModule;

            if (activator != 0)
            {
                long temp = MyAPIGateway.Players.TryGetIdentityId(activator);
                if (temp != 0)
                {
                    if (owner.ShareMode == MyOwnershipShareModeEnum.All)
                    {
                        owner = new MyIDModule(temp, MyOwnershipShareModeEnum.Faction);
                    }
                    else
                    {
                        owner = new MyIDModule(temp, owner.ShareMode);
                    }
                }
            }

            Random rand = new Random();

            foreach (MyObjectBuilder_CubeGrid grid in grids)
            {
                totalBlocks += grid.CubeBlocks.Count;
                if (totalBlocks > IPSession.Instance.MapSettings.MaxBlocks)
                {
                    Utilities.Notify(Constants.msgGridLarge, activator);
                    return(false);
                }

                PrepBlocks(rand, owner, grid, comps);
                if (grid.CubeBlocks.Count == 0)
                {
                    Utilities.Notify(Constants.msgGridSmall, activator);
                    return(false);
                }

                grid.IsStatic           = false;
                grid.CreatePhysics      = true;
                grid.Immune             = false;
                grid.DestructibleBlocks = true;

                MatrixD current = grid.PositionAndOrientation.Value.GetMatrix();
                if (scale != 1)
                {
                    current.Translation /= scale;
                }

                MatrixD newWorldMatrix = (current * largestMatrixInvert) * targetMatrix;
                grid.PositionAndOrientation = new MyPositionAndOrientation(ref newWorldMatrix);
                orientation.Include(newWorldMatrix);
            }

            if (totalBlocks < IPSession.Instance.MapSettings.MinBlocks)
            {
                Utilities.Notify(Constants.msgGridSmall, activator);
                return(false);
            }


            if (comps == null)
            {
                comps = new GridComponents();
            }
            else
            {
                comps.ApplySettings(IPSession.Instance.MapSettings);
                int            needed;
                MyDefinitionId neededId;
                if (!comps.HasComponents(Utilities.GetInventories(p), out needed, out neededId))
                {
                    Utilities.Notify(Utilities.GetCompsString(needed, neededId), activator);
                    return(false);
                }
            }


            GridBounds bounds = new GridBounds(p, grids);
            IMyEntity  e      = bounds.GetOverlappingEntity();

            if (e != null && (!shiftBuildArea || !bounds.HasClearArea()))
            {
                Utilities.Notify(Utilities.GetOverlapString(true, e), activator);
                return(false);
            }

            projectedGrid = new ProjectedGrid(activator, p, grids, bounds, comps, orientation, shiftBuildArea, totalBlocks);
            return(true);
        }
コード例 #16
0
        public Ent EntType(MyEntity ent)
        {
            if (ent is IMyFloatingObject)
            {
                if (CustomCollision.AllAabbInShield(ent.PositionComp.WorldAABB, DetectMatrixOutsideInv, _obbCorners))
                {
                    return(Ent.Ignore);
                }
                return(Ent.Floater);
            }

            var voxel = ent as MyVoxelBase;

            if (voxel != null && (Session.Enforced.DisableVoxelSupport == 1 || ShieldComp.Modulator == null || ShieldComp.Modulator.ModSet.Settings.ModulateVoxels || !GridIsMobile))
            {
                return(Ent.Ignore);
            }

            if (EntityBypass.Contains(ent))
            {
                return(Ent.Ignore);
            }

            var character = ent as IMyCharacter;

            if (character != null)
            {
                var getComponentOwner = ent as IMyComponentOwner <MyIDModule>;

                long       playerId;
                MyIDModule targetIdModule;
                if (getComponentOwner != null && getComponentOwner.GetComponent(out targetIdModule))
                {
                    playerId = targetIdModule.Owner;
                }
                else
                {
                    var controllingId = character.ControllerInfo?.ControllingIdentityId;
                    playerId = controllingId ?? 0;
                }

                if (playerId == 0 || character.IsDead || character.Integrity <= 0)
                {
                    return(Ent.Ignore);
                }

                var playerrelationship = MyIDModule.GetRelationPlayerBlock(MyCube.IDModule.Owner, playerId, MyOwnershipShareModeEnum.Faction);

                var modulateAllies = (ShieldComp.Modulator != null && ShieldComp.Modulator.ModSet.Settings.AllowAllies);
                if (playerrelationship == MyRelationsBetweenPlayerAndBlock.Owner || playerrelationship == MyRelationsBetweenPlayerAndBlock.FactionShare || modulateAllies && playerrelationship == MyRelationsBetweenPlayerAndBlock.Friends)
                {
                    var playerInShield = CustomCollision.PointInShield(ent.PositionComp.WorldAABB.Center, DetectMatrixOutsideInv);
                    return(playerInShield ? Ent.Protected : Ent.Friendly);
                }

                if (CustomCollision.NewObbPointsInShield(ent, DetectMatrixOutsideInv, _obbPoints) == 9)
                {
                    return(Ent.EnemyInside);
                }

                return(Ent.EnemyPlayer);
            }
            var grid = ent as MyCubeGrid;

            if (grid != null)
            {
                var modulateGrids = (ShieldComp.Modulator != null && ShieldComp.Modulator.ModSet.Settings.ModulateGrids) || Session.Enforced.DisableEntityBarrier == 1;

                ModulatorGridComponent modComp;
                grid.Components.TryGet(out modComp);
                if (!string.IsNullOrEmpty(modComp?.ModulationPassword) && modComp.ModulationPassword == Shield.CustomData)
                {
                    var modShield = modComp.Modulator?.ShieldComp?.DefenseShields;
                    if (modShield != null)
                    {
                        foreach (var subGrid in modShield.ShieldComp.SubGrids.Keys)
                        {
                            if (ShieldEnt.PositionComp.WorldVolume.Intersects(grid.PositionComp.WorldVolume))
                            {
                                if (CustomCollision.CornerOrCenterInShield(grid, DetectMatrixOutsideInv, _resetEntCorners) > 0)
                                {
                                    return(Ent.Protected);
                                }
                                AuthenticatedCache.Add(subGrid);
                            }
                            else
                            {
                                AuthenticatedCache.Add(subGrid);
                            }
                        }
                        return(Ent.Authenticated);
                    }
                    foreach (var subGrid in modComp.SubGrids)
                    {
                        if (ShieldEnt.PositionComp.WorldVolume.Intersects(grid.PositionComp.WorldVolume))
                        {
                            if (CustomCollision.CornerOrCenterInShield(grid, DetectMatrixOutsideInv, _resetEntCorners) > 0)
                            {
                                return(Ent.Protected);
                            }
                            AuthenticatedCache.Add((MyCubeGrid)subGrid);
                        }
                        else
                        {
                            AuthenticatedCache.Add((MyCubeGrid)subGrid);
                        }
                    }
                }

                List <long>        bigOwners;
                int                bigOwnersCnt;
                Session.ParentGrid parent;
                if (Session.Instance.GetParentGrid.TryGetValue(grid, out parent) && !CustomCollision.AllAabbInShield(parent.Parent.PositionComp.WorldAABB, DetectMatrixOutsideInv, _obbCorners))
                {
                    bigOwners    = grid.BigOwners;
                    bigOwnersCnt = bigOwners.Count;
                    if (bigOwnersCnt == 0 || GridEnemy(grid, bigOwners))
                    {
                        return(Ent.EnemyGrid);
                    }
                }
                else
                {
                    bigOwners    = grid.BigOwners;
                    bigOwnersCnt = bigOwners.Count;
                }


                if (CustomCollision.AllAabbInShield(ent.PositionComp.WorldAABB, DetectMatrixOutsideInv, _obbCorners))
                {
                    return(Ent.Protected);
                }
                if (!modulateGrids && bigOwnersCnt == 0)
                {
                    return(Ent.NobodyGrid);
                }
                var enemy = !modulateGrids && GridEnemy(grid, bigOwners);
                if (!enemy)
                {
                    if (ShieldComp.SubGrids.ContainsKey(grid))
                    {
                        return(Ent.Protected);
                    }

                    var pointsInShield = CustomCollision.NewObbPointsInShield(grid, DetectMatrixOutsideInv, _obbPoints);
                    return(pointsInShield > 0 ? Ent.Protected : Ent.Friendly);
                }

                ShieldGridComponent shieldComponent;
                grid.Components.TryGet(out shieldComponent);
                if (shieldComponent?.DefenseShields?.ShieldComp != null && shieldComponent.DefenseShields.NotFailed && shieldComponent.DefenseShields.DsState != null && !shieldComponent.DefenseShields.DsState.State.ReInforce)
                {
                    var dsComp       = shieldComponent.DefenseShields;
                    var shieldEntity = MyCube.Parent;
                    dsComp.EnemyShields.Add(shieldEntity);
                    return(Ent.Shielded);
                }
                return(Ent.EnemyGrid);
            }

            if (ent is IMyMeteor || (ent.DefinitionId.HasValue && ent.DefinitionId.Value.TypeId == Session.Instance.MissileObj))
            {
                return(Ent.Other);
            }
            if (voxel != null && GridIsMobile)
            {
                return(Ent.VoxelBase);
            }
            return(0);
        }
コード例 #17
0
        internal bool CreateEntInfo(MyEntity entity, long gridOwner, out Sandbox.ModAPI.Ingame.MyDetectedEntityInfo entInfo)
        {
            try
            {
                MyRelationsBetweenPlayerAndBlock relationship = MyRelationsBetweenPlayerAndBlock.Neutral;
                if (entity == null)
                {
                    entInfo = new Sandbox.ModAPI.Ingame.MyDetectedEntityInfo();
                    return(false);
                }
                var grid = entity.GetTopMostParent() as MyCubeGrid;
                if (grid != null)
                {
                    if (!grid.DestructibleBlocks || grid.Immune || grid.GridGeneralDamageModifier <= 0)
                    {
                        entInfo = new Sandbox.ModAPI.Ingame.MyDetectedEntityInfo();
                        return(false);
                    }

                    var bigOwners = grid.BigOwners;
                    var topOwner  = bigOwners.Count > 0 ? bigOwners[0] : long.MaxValue;

                    relationship = topOwner != long.MaxValue ? MyIDModule.GetRelationPlayerBlock(gridOwner, topOwner, MyOwnershipShareModeEnum.Faction) : MyRelationsBetweenPlayerAndBlock.NoOwnership;

                    var type = grid.GridSizeEnum != MyCubeSize.Small ? Sandbox.ModAPI.Ingame.MyDetectedEntityType.LargeGrid : Sandbox.ModAPI.Ingame.MyDetectedEntityType.SmallGrid;
                    entInfo = new Sandbox.ModAPI.Ingame.MyDetectedEntityInfo(grid.EntityId, string.Empty, type, null, MatrixD.Zero, Vector3.Zero, relationship, new BoundingBoxD(), Session.Tick);
                    return(true);
                }

                var myCharacter = entity as IMyCharacter;
                if (myCharacter != null)
                {
                    var type = !myCharacter.IsPlayer ? Sandbox.ModAPI.Ingame.MyDetectedEntityType.CharacterOther : Sandbox.ModAPI.Ingame.MyDetectedEntityType.CharacterHuman;

                    var getComponentOwner = entity as IMyComponentOwner <MyIDModule>;

                    long       playerId;
                    MyIDModule targetIdModule;
                    if (getComponentOwner != null && getComponentOwner.GetComponent(out targetIdModule))
                    {
                        playerId = targetIdModule.Owner;
                    }
                    else
                    {
                        var controllingId = myCharacter.ControllerInfo?.ControllingIdentityId;
                        playerId = controllingId ?? 0;
                    }

                    relationship = MyIDModule.GetRelationPlayerBlock(gridOwner, playerId, MyOwnershipShareModeEnum.Faction);

                    entInfo = new Sandbox.ModAPI.Ingame.MyDetectedEntityInfo(entity.EntityId, string.Empty, type, null, MatrixD.Zero, Vector3.Zero, relationship, new BoundingBoxD(), Session.Tick);
                    return(!myCharacter.IsDead && myCharacter.Integrity > 0);
                }

                var myPlanet = entity as MyPlanet;

                if (myPlanet != null)
                {
                    const Sandbox.ModAPI.Ingame.MyDetectedEntityType type = Sandbox.ModAPI.Ingame.MyDetectedEntityType.Planet;
                    entInfo = new Sandbox.ModAPI.Ingame.MyDetectedEntityInfo(entity.EntityId, string.Empty, type, null, MatrixD.Zero, Vector3.Zero, relationship, new BoundingBoxD(), Session.Tick);
                    return(true);
                }
                if (entity is MyVoxelMap)
                {
                    const Sandbox.ModAPI.Ingame.MyDetectedEntityType type = Sandbox.ModAPI.Ingame.MyDetectedEntityType.Asteroid;
                    entInfo = new Sandbox.ModAPI.Ingame.MyDetectedEntityInfo(entity.EntityId, string.Empty, type, null, MatrixD.Zero, Vector3.Zero, relationship, new BoundingBoxD(), Session.Tick);
                    return(true);
                }
                if (entity is MyMeteor)
                {
                    const Sandbox.ModAPI.Ingame.MyDetectedEntityType type = Sandbox.ModAPI.Ingame.MyDetectedEntityType.Meteor;
                    entInfo = new Sandbox.ModAPI.Ingame.MyDetectedEntityInfo(entity.EntityId, string.Empty, type, null, MatrixD.Zero, Vector3.Zero, MyRelationsBetweenPlayerAndBlock.Enemies, new BoundingBoxD(), Session.Tick);
                    return(true);
                }
            }
            catch (Exception ex) { Log.Line($"Exception in CreateEntInfo: {ex}"); }

            entInfo = new Sandbox.ModAPI.Ingame.MyDetectedEntityInfo();
            return(false);
        }
コード例 #18
0
        internal bool GetTargetState(Session s)
        {
            var ai            = s.TrackingAi;
            var validFocus    = false;
            var maxNameLength = 18;

            if (s.Tick - MasterUpdateTick > 300 || MasterUpdateTick < 300 && _masterTargets.Count == 0)
            {
                BuildMasterCollections(ai);
            }

            for (int i = 0; i < ai.Construct.Data.Repo.FocusData.Target.Length; i++)
            {
                var      targetId = ai.Construct.Data.Repo.FocusData.Target[i];
                float    offenseRating;
                MyEntity target;
                if (targetId <= 0 || !MyEntities.TryGetEntityById(targetId, out target) || !_masterTargets.TryGetValue(target, out offenseRating))
                {
                    continue;
                }
                validFocus = true;
                if (!s.Tick20)
                {
                    continue;
                }
                var    grid      = target as MyCubeGrid;
                var    partCount = 1;
                var    largeGrid = false;
                GridAi targetAi  = null;
                if (grid != null)
                {
                    largeGrid = grid.GridSizeEnum == MyCubeSize.Large;
                    GridMap gridMap;
                    if (s.GridToMasterAi.TryGetValue(grid, out targetAi))
                    {
                        partCount = targetAi.Construct.BlockCount;
                    }
                    else if (s.GridToInfoMap.TryGetValue(grid, out gridMap))
                    {
                        partCount = gridMap.MostBlocks;
                    }
                }

                var state = ai.TargetState[i];

                state.Aware = targetAi != null?AggressionState(ai, targetAi) : TargetStatus.Awareness.WONDERING;

                var displayName = target.DisplayName;
                var name        = string.IsNullOrEmpty(displayName) ? string.Empty : displayName.Length <= maxNameLength ? displayName : displayName.Substring(0, maxNameLength);

                var targetVel = target.Physics?.LinearVelocity ?? Vector3.Zero;
                if (MyUtils.IsZero(targetVel, 1E-01F))
                {
                    targetVel = Vector3.Zero;
                }
                var targetDir    = Vector3D.Normalize(targetVel);
                var targetRevDir = -targetDir;
                var targetPos    = target.PositionComp.WorldAABB.Center;
                var myPos        = ai.MyGrid.PositionComp.WorldAABB.Center;
                var myHeading    = Vector3D.Normalize(myPos - targetPos);

                var intercept = MathFuncs.IsDotProductWithinTolerance(ref targetDir, ref myHeading, s.ApproachDegrees);
                var retreat   = MathFuncs.IsDotProductWithinTolerance(ref targetRevDir, ref myHeading, s.ApproachDegrees);

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

                var speed = (float)Math.Round(target.Physics?.Speed ?? 0, 1);

                state.Name = name;

                state.RealDistance = distanceFromCenters;

                state.SizeExtended = (float)Math.Round(partCount / (largeGrid ? 100f : 500f), 1);

                state.Speed = speed;

                if (intercept)
                {
                    state.Engagement = 0;
                }
                else if (retreat)
                {
                    state.Engagement = 1;
                }
                else
                {
                    state.Engagement = 2;
                }

                MyTuple <bool, bool, float, float, float, int> shieldInfo = new MyTuple <bool, bool, float, float, float, int>();
                if (s.ShieldApiLoaded)
                {
                    shieldInfo = s.SApi.GetShieldInfo(target);
                }
                if (shieldInfo.Item1)
                {
                    var modInfo  = s.SApi.GetModulationInfo(target);
                    var modValue = MyUtils.IsEqual(modInfo.Item3, modInfo.Item4) ? 0 : modInfo.Item3 > modInfo.Item4 ? modInfo.Item3 : -modInfo.Item4;
                    var faceInfo = s.SApi.GetFacesFast(target);
                    state.ShieldFaces  = faceInfo.Item1 ? faceInfo.Item2 : Vector3I.Zero;
                    state.ShieldHeat   = shieldInfo.Item6 / 10;
                    state.ShieldMod    = modValue;
                    state.ShieldHealth = (float)Math.Round(shieldInfo.Item5);
                }
                else
                {
                    state.ShieldHeat   = 0;
                    state.ShieldMod    = 0;
                    state.ShieldHealth = -1;
                    state.ShieldFaces  = Vector3I.Zero;
                }

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

                if (friend)
                {
                    state.ThreatLvl = -1;
                }
                else
                {
                    int shieldBonus = 0;
                    if (s.ShieldApiLoaded)
                    {
                        var myShieldInfo = s.SApi.GetShieldInfo(ai.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;
                        }
                    }

                    if (offenseRating > 5)
                    {
                        state.ThreatLvl = shieldBonus < 0 ? 8 : 9;
                    }
                    else if (offenseRating > 4)
                    {
                        state.ThreatLvl = 8 + shieldBonus;
                    }
                    else if (offenseRating > 3)
                    {
                        state.ThreatLvl = 7 + shieldBonus;
                    }
                    else if (offenseRating > 2)
                    {
                        state.ThreatLvl = 6 + shieldBonus;
                    }
                    else if (offenseRating > 1)
                    {
                        state.ThreatLvl = 5 + shieldBonus;
                    }
                    else if (offenseRating > 0.5)
                    {
                        state.ThreatLvl = 4 + shieldBonus;
                    }
                    else if (offenseRating > 0.25)
                    {
                        state.ThreatLvl = 3 + shieldBonus;
                    }
                    else if (offenseRating > 0.125)
                    {
                        state.ThreatLvl = 2 + shieldBonus;
                    }
                    else if (offenseRating > 0.0625)
                    {
                        state.ThreatLvl = 1 + shieldBonus;
                    }
                    else if (offenseRating > 0)
                    {
                        state.ThreatLvl = shieldBonus > 0 ? 1 : 0;
                    }
                    else
                    {
                        state.ThreatLvl = -1;
                    }
                }
            }
            return(validFocus);
        }
コード例 #19
0
ファイル: AiSupport.cs プロジェクト: Coreman230/WeaponCore
        internal bool CreateEntInfo(MyEntity entity, long gridOwner, out Sandbox.ModAPI.Ingame.MyDetectedEntityInfo entInfo)
        {
            if (entity == null)
            {
                entInfo = new Sandbox.ModAPI.Ingame.MyDetectedEntityInfo();
                return(false);
            }

            var topMostParent = entity.GetTopMostParent() as MyCubeGrid;

            if (topMostParent != null)
            {
                var type     = topMostParent.GridSizeEnum != MyCubeSize.Small ? Sandbox.ModAPI.Ingame.MyDetectedEntityType.LargeGrid : Sandbox.ModAPI.Ingame.MyDetectedEntityType.SmallGrid;
                var hasOwner = topMostParent.BigOwners.Count != 0;
                MyRelationsBetweenPlayerAndBlock relationship;
                if (hasOwner)
                {
                    var topOwner = topMostParent.BigOwners[0];
                    relationship = MyIDModule.GetRelationPlayerBlock(gridOwner, topOwner, MyOwnershipShareModeEnum.Faction);

                    if (relationship == MyRelationsBetweenPlayerAndBlock.Neutral)
                    {
                        var topFaction = MyAPIGateway.Session.Factions.TryGetPlayerFaction(topOwner);
                        if (topFaction != null)
                        {
                            var aiFaction = MyAPIGateway.Session.Factions.TryGetPlayerFaction(gridOwner);
                            if (aiFaction != null && MyAPIGateway.Session.Factions.GetReputationBetweenPlayerAndFaction(aiFaction.FactionId, topFaction.FactionId) < -500)
                            {
                                relationship = MyRelationsBetweenPlayerAndBlock.Enemies;
                            }
                        }
                    }
                }
                else
                {
                    relationship = MyRelationsBetweenPlayerAndBlock.Owner;
                }

                entInfo = new Sandbox.ModAPI.Ingame.MyDetectedEntityInfo(topMostParent.EntityId, string.Empty, type, null, MatrixD.Zero, Vector3.Zero, relationship, new BoundingBoxD(), Session.Tick);
                return(true);
            }

            var myCharacter = entity as IMyCharacter;

            if (myCharacter != null)
            {
                var controllingId = myCharacter.ControllerInfo?.ControllingIdentityId;
                var playerId      = controllingId ?? 0;

                var type = !myCharacter.IsPlayer ? Sandbox.ModAPI.Ingame.MyDetectedEntityType.CharacterOther : Sandbox.ModAPI.Ingame.MyDetectedEntityType.CharacterHuman;
                var relationPlayerBlock = MyIDModule.GetRelationPlayerBlock(gridOwner, playerId, MyOwnershipShareModeEnum.Faction);

                entInfo = new Sandbox.ModAPI.Ingame.MyDetectedEntityInfo(entity.EntityId, string.Empty, type, null, MatrixD.Zero, Vector3.Zero, relationPlayerBlock, new BoundingBoxD(), Session.Tick);
                return(!myCharacter.IsDead);
            }
            const MyRelationsBetweenPlayerAndBlock relationship1 = MyRelationsBetweenPlayerAndBlock.Neutral;
            var myPlanet = entity as MyPlanet;

            if (myPlanet != null)
            {
                const Sandbox.ModAPI.Ingame.MyDetectedEntityType type = Sandbox.ModAPI.Ingame.MyDetectedEntityType.Planet;
                entInfo = new Sandbox.ModAPI.Ingame.MyDetectedEntityInfo(entity.EntityId, string.Empty, type, null, MatrixD.Zero, Vector3.Zero, relationship1, new BoundingBoxD(), Session.Tick);
                return(true);
            }
            if (entity is MyVoxelMap)
            {
                const Sandbox.ModAPI.Ingame.MyDetectedEntityType type = Sandbox.ModAPI.Ingame.MyDetectedEntityType.Asteroid;
                entInfo = new Sandbox.ModAPI.Ingame.MyDetectedEntityInfo(entity.EntityId, string.Empty, type, null, MatrixD.Zero, Vector3.Zero, relationship1, new BoundingBoxD(), Session.Tick);
                return(true);
            }
            if (entity is MyMeteor)
            {
                const Sandbox.ModAPI.Ingame.MyDetectedEntityType type = Sandbox.ModAPI.Ingame.MyDetectedEntityType.Meteor;
                entInfo = new Sandbox.ModAPI.Ingame.MyDetectedEntityInfo(entity.EntityId, string.Empty, type, null, MatrixD.Zero, Vector3.Zero, MyRelationsBetweenPlayerAndBlock.Enemies, new BoundingBoxD(), Session.Tick);
                return(true);
            }
            entInfo = new Sandbox.ModAPI.Ingame.MyDetectedEntityInfo();
            return(false);
        }
コード例 #20
0
        void Scan()
        {
            m_lastScan = MySession.Static.GameplayFrameCounter;
            ProfilerShort.Begin("QueryTargets");
            BoundingSphereD bs = new BoundingSphereD(Vector3D.Transform(m_queryLocal.Center, m_grid.WorldMatrix), m_queryLocal.Radius);

            m_targetRoots.Clear();
            m_targetBlocks.Clear();

            ProfilerShort.Begin("MyGamePruningStructure.GetAllTop...");
            MyGamePruningStructure.GetAllTopMostEntitiesInSphere(ref bs, m_targetRoots);
            ProfilerShort.End();

            int targetCount = m_targetRoots.Count;

            m_ownersA.AddList(m_grid.SmallOwners);
            m_ownersA.AddList(m_grid.BigOwners);
            for (int i = 0; i < targetCount; i++)
            {
                var grid = m_targetRoots[i] as MyCubeGrid; //perf: using grid owners to not querry friendly ships for blocks
                if (grid != null)
                {
                    if (grid.Physics != null && !grid.Physics.Enabled)
                    {
                        continue;
                    }

                    ProfilerShort.Begin("Friend checks");
                    bool enemy = false;
                    if (grid.BigOwners.Count == 0 && grid.SmallOwners.Count == 0)
                    {
                        foreach (var owner in m_ownersA)
                        {
                            if (MyIDModule.GetRelation(owner, 0) == VRage.Game.MyRelationsBetweenPlayerAndBlock.Enemies)
                            {
                                enemy = true;
                                break;
                            }
                        }
                    }
                    else
                    {
                        m_ownersB.AddList(grid.BigOwners);
                        m_ownersB.AddList(grid.SmallOwners);


                        foreach (var owner in m_ownersA)
                        {
                            foreach (var other in m_ownersB)
                            {
                                if (MyIDModule.GetRelation(owner, other) == VRage.Game.MyRelationsBetweenPlayerAndBlock.Enemies)
                                {
                                    enemy = true;
                                    break;
                                }
                            }
                        }
                        m_ownersB.Clear();
                    }
                    ProfilerShort.End();
                    if (enemy)
                    {
                        ProfilerShort.Begin("grid.Hierarchy.QuerySphere");
                        var list = m_targetBlocks.GetOrAddList(grid);
                        grid.Hierarchy.QuerySphere(ref bs, list);
                        ProfilerShort.End();
                    }
                    else
                    {
                        MyIDModule module;
                        //performance unfriendly case when grid is not clearly neutral or enemy
                        foreach (var block in grid.GetFatBlocks())
                        {
                            var moduleOwner = ((MyEntity)block) as IMyComponentOwner <MyIDModule>;
                            if (!(moduleOwner != null && moduleOwner.GetComponent(out module)))
                            {
                                continue;
                            }

                            var myID = block.OwnerId;
                            foreach (var owner in m_ownersA)
                            {
                                if (MyIDModule.GetRelation(owner, myID) == VRage.Game.MyRelationsBetweenPlayerAndBlock.Enemies)
                                {
                                    enemy = true;
                                    break;
                                }
                            }
                            if (enemy)
                            {
                                break;
                            }
                        }

                        if (enemy)
                        {
                            ProfilerShort.Begin("grid.Hierarchy.QuerySphere");
                            var list = m_targetBlocks.GetOrAddList(grid);
                            grid.Hierarchy.QuerySphere(ref bs, list);
                            ProfilerShort.End();
                        }
                    }
                }
            }
            m_ownersA.Clear();

            ProfilerShort.Begin("Filter small objects");
            for (int i = m_targetRoots.Count - 1; i >= 0; i--)
            {
                var target = m_targetRoots[i];
                if (target is Sandbox.Game.Entities.Debris.MyDebrisBase ||
                    target is MyFloatingObject ||
                    (target.Physics != null && !target.Physics.Enabled) ||
                    target.GetTopMostParent().Physics == null || !target.GetTopMostParent().Physics.Enabled)
                {
                    m_targetRoots.RemoveAtFast(i);
                }
            }
            ProfilerShort.End();
            ProfilerShort.End();
        }
コード例 #21
0
        private static MyTuple <bool, float> TAPI_IntersectEntToShieldFast(List <MyEntity> entities, RayD ray, bool onlyIfOnline, bool enenmyOnly = false, long requesterId = 0, float maxLengthSqr = float.MaxValue)
        {
            if (enenmyOnly)
            {
                if (requesterId == 0)
                {
                    return(new MyTuple <bool, float>(false, 0));
                }
            }

            float closestOtherDist  = float.MaxValue;
            float closestFriendDist = float.MaxValue;
            bool  closestOther      = false;
            bool  closestFriend     = false;

            for (int i = 0; i < entities.Count; i++)
            {
                var entity = entities[i];
                ShieldGridComponent c;
                if (entity != null && Session.Instance.IdToBus.TryGetValue(entity.EntityId, out c) && c?.DefenseShields?.DsState?.State != null && c.DefenseShields.MyCube != null)
                {
                    var s = c.DefenseShields;
                    if (onlyIfOnline && (!s.DsState.State.Online || s.DsState.State.Lowered) || s.ReInforcedShield)
                    {
                        continue;
                    }

                    lock (s.MatrixLock) {
                        var normSphere = new BoundingSphereD(Vector3.Zero, 1f);
                        var kRay       = new RayD(Vector3D.Zero, Vector3D.Forward);

                        var      ellipsoidMatrixInv = s.DetectMatrixOutsideInv;
                        Vector3D krayPos;
                        Vector3D.Transform(ref ray.Position, ref ellipsoidMatrixInv, out krayPos);

                        Vector3D nDir;
                        Vector3D.TransformNormal(ref ray.Direction, ref ellipsoidMatrixInv, out nDir);

                        Vector3D krayDir;
                        Vector3D.Normalize(ref nDir, out krayDir);

                        kRay.Direction = krayDir;
                        kRay.Position  = krayPos;
                        var nullDist = normSphere.Intersects(kRay);

                        if (!nullDist.HasValue)
                        {
                            continue;
                        }

                        var hitPos = krayPos + (krayDir * -nullDist.Value);

                        var      ellipsoidMatrix = s.DetectMatrixOutside;
                        Vector3D worldHitPos;
                        Vector3D.Transform(ref hitPos, ref ellipsoidMatrix, out worldHitPos);
                        var intersectDist = Vector3.DistanceSquared(worldHitPos, ray.Position);
                        if (intersectDist <= 0 || intersectDist > maxLengthSqr)
                        {
                            continue;
                        }

                        var firstOrLast   = enenmyOnly && (!closestFriend || intersectDist < closestFriendDist);
                        var notEnemyCheck = false;
                        if (firstOrLast)
                        {
                            var relationship = MyIDModule.GetRelationPlayerBlock(requesterId, s.MyCube.OwnerId);
                            var enemy        = relationship != MyRelationsBetweenPlayerAndBlock.Owner && relationship != MyRelationsBetweenPlayerAndBlock.FactionShare;
                            notEnemyCheck = !enemy;
                        }

                        if (notEnemyCheck)
                        {
                            closestFriendDist = intersectDist;
                            closestFriend     = true;
                        }
                        else
                        {
                            closestOtherDist = intersectDist;
                            closestOther     = true;
                        }
                    }
                }
            }

            if (!enenmyOnly && closestOther || closestOther && !closestFriend)
            {
                return(new MyTuple <bool, float>(true, closestOtherDist));
            }

            if (closestFriend && !closestOther || closestFriendDist < closestOtherDist)
            {
                return(new MyTuple <bool, float>(false, closestFriendDist));
            }

            if (!closestOther)
            {
                return(new MyTuple <bool, float>(false, 0));
            }

            return(new MyTuple <bool, float>(true, closestOtherDist));
        }