Exemple #1
0
        public double SafeZoneIntersectionCheck(MySafeZone zone)
        {
            var zoneEntity = zone as IMyEntity;

            if (zone.Shape == MySafeZoneShape.Sphere)
            {
                var newSphere = new BoundingSphereD(zoneEntity.PositionComp.WorldVolume.Center, zone.Radius);
                var result    = Ray.Intersects(newSphere);

                if (result.HasValue == true)
                {
                    return((double)result);
                }
            }
            else
            {
                var result = Ray.Intersects(zoneEntity.PositionComp.WorldAABB);

                if (result.HasValue == true)
                {
                    return((double)result);
                }
            }

            return(-1);
        }
Exemple #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);
                }
            }
        }
        public static void InsertEntityInternalPostfix(MyEntity entity, ref MySafeZone __instance, ref bool __result)
        {
            if (!__result)
            {
                return;
            }
            var top = entity.GetTopMostParent();

            top.SetSafeZone(__instance);
        }
Exemple #4
0
        private bool TouchingSafeZone(MySafeZone safeZone)
        {
            var myObb = new MyOrientedBoundingBoxD(MyGrid.PositionComp.LocalAABB, MyGrid.PositionComp.WorldMatrixRef);

            if (safeZone.Shape == MySafeZoneShape.Sphere)
            {
                var sphere = new BoundingSphereD(safeZone.PositionComp.WorldVolume.Center, safeZone.Radius);
                return(myObb.Intersects(ref sphere));
            }

            return(new MyOrientedBoundingBoxD(safeZone.PositionComp.LocalAABB, safeZone.PositionComp.WorldMatrixRef).Contains(ref myObb) != ContainmentType.Disjoint);
        }
        private static bool IsAllowed(MySafeZone safezone, MyOrientedBoundingBoxD obb, IMyEntity original = null)
        {
            if (!safezone.Enabled)
            {
                return(true);
            }

            if (safezone.AccessTypeGrids == Sandbox.Common.ObjectBuilders.MySafeZoneAccess.Whitelist)
            {
                return(false);
            }

            if (safezone.Shape == Sandbox.Common.ObjectBuilders.MySafeZoneShape.Box)
            {
                var zoneOBB = new MyOrientedBoundingBoxD(safezone.PositionComp.LocalAABB, safezone.PositionComp.WorldMatrixRef);
                if (obb.Contains(ref zoneOBB) == ContainmentType.Disjoint)
                {
                    return(true);
                }
            }
            else
            {
                var zoneSphere = new BoundingSphereD(safezone.PositionComp.GetPosition(), safezone.Radius);
                if (obb.Contains(ref zoneSphere) == ContainmentType.Disjoint)
                {
                    return(true);
                }
            }

            // 512 = VRage.Game.ObjectBuilders.Components.MySafeZoneAction.BuildingProjections
            if (original == null)
            {
                return(safezone.IsActionAllowed(obb.GetAABB(), CastProhibit(safezone.AllowedActions, 512)));
            }
            return(safezone.IsActionAllowed((MyEntity)original, CastProhibit(safezone.AllowedActions, 512)));
        }
 public static void InsertEntity_ImplementationPostfix(long entityId, ref MyConcurrentHashSet <long> ___m_containedEntities, ref MySafeZone __instance)
 {
     if (___m_containedEntities.Contains(entityId))
     {
         return;
     }
     if (MyEntities.TryGetEntityById(entityId, out var top))
     {
         top.SetSafeZone(__instance);
     }
 }
Exemple #7
0
 public static bool IsOutside(this MySafeZone self, MyEntity entity)
 {
     return(MethodDelegateInstance(self, entity));
 }
Exemple #8
0
        public void TargetIntersectionCheck()
        {
            _entityScanList.Clear();
            _voxelScanList.Clear();
            _entityScanList = new List <MyLineSegmentOverlapResult <MyEntity> >();
            MyGamePruningStructure.GetTopmostEntitiesOverlappingRay(ref Line, _entityScanList);

            IMyCubeGrid closestGrid         = null;
            double      closestGridDistance = -1;

            MySafeZone closestZone         = null;
            double     closestZoneDistance = -1;

            IMyCharacter closestCharacter         = null;
            double       closestCharacterDistance = -1;

            foreach (var item in _entityScanList)
            {
                var targetGrid   = item.Element as IMyCubeGrid;
                var targetZone   = item.Element as MySafeZone;
                var targetVoxel  = item.Element as MyVoxelBase;
                var targetPlayer = item.Element as IMyCharacter;

                if (targetGrid != null)
                {
                    if (targetGrid == _collisionSystem.RemoteControl.SlimBlock.CubeGrid || _collisionSystem.RemoteControl.SlimBlock.CubeGrid.IsSameConstructAs(targetGrid))
                    {
                        continue;
                    }

                    if (closestGrid == null || (closestGrid != null && item.Distance < closestGridDistance))
                    {
                        closestGrid         = targetGrid;
                        closestGridDistance = item.Distance;
                    }
                }

                if (targetZone != null)
                {
                    if (closestZone == null || (closestZone != null && item.Distance < closestZoneDistance))
                    {
                        closestZone         = targetZone;
                        closestZoneDistance = item.Distance;
                    }
                }

                if (targetVoxel != null)
                {
                    _voxelScanList.Add(targetVoxel);
                }

                if (targetPlayer != null)
                {
                    if (closestCharacter == null || (closestCharacter != null && item.Distance < closestCharacterDistance))
                    {
                        closestCharacter         = targetPlayer;
                        closestCharacterDistance = item.Distance;
                    }
                }
            }

            if (closestGrid != null)
            {
                double minDist        = 0;
                double maxDist        = 0;
                bool   boxCheckResult = closestGrid.PositionComp.WorldAABB.Intersect(ref Ray, out minDist, out maxDist);

                Vector3D startBox = boxCheckResult ? (minDist - 5) * DirectionVector + StartPosition : StartPosition;
                Vector3D endBox   = boxCheckResult ? (maxDist + 5) * DirectionVector + StartPosition : EndPosition;

                var blockPos = closestGrid.RayCastBlocks(startBox, endBox);

                if (!blockPos.HasValue)
                {
                    return;
                }

                IMySlimBlock slimBlock = closestGrid.GetCubeBlock(blockPos.Value);

                if (slimBlock == null)
                {
                    return;
                }

                Vector3D blockPosition = Vector3D.Zero;
                slimBlock.ComputeWorldCenter(out blockPosition);


                GridCoords   = blockPosition;
                GridDistance = Vector3D.Distance(blockPosition, StartPosition);
                GridEntity   = closestGrid;
                GridOwner    = OwnershipHelper.GetOwnershipTypes(closestGrid, false);
                GridRelation = OwnershipHelper.GetTargetReputation(_collisionSystem.Owner, closestGrid, false);
            }

            if (closestZone != null)
            {
                SafezoneEntity   = closestZone;
                SafezoneCoords   = closestZoneDistance * DirectionVector + StartPosition;
                SafezoneDistance = closestZoneDistance;
            }

            if (closestCharacter != null)
            {
                PlayerEntity   = closestCharacter;
                PlayerCoords   = PlayerEntity.PositionComp.WorldAABB.Center;
                PlayerDistance = closestCharacterDistance;
            }
        }
Exemple #9
0
 public SafeZoneEntity(IMyEntity entity) : base(entity)
 {
     SafeZone = entity as MySafeZone;
 }
Exemple #10
0
 public static bool UpdateSafeZoneEnabledPatch(MySafeZoneComponent __instance, MySafeZone safeZone, bool activate)
 {
     Log.Info($"{nameof(MySafeZoneComponentPatch)}.{nameof(UpdateSafeZoneEnabledPatch)}({activate})");
     return(Plugin.PermitsPlayerSafeZone(__instance.Entity, activate));
 }