Пример #1
0
 bool FuncTest(IMyMedicalRoom block)
 {
     //Medical Room
     //Interface name: IMyMedicalRoom
     //Parent: IMyFunctionalBlock
     return(true);
 }
Пример #2
0
        private static bool CheckRevealMedbay(IMyCubeGrid grid, ulong steamId)
        {
            // Live dangerously
            List <IMySlimBlock> blocks = new List <IMySlimBlock>();

            grid.GetBlocks(blocks, x => x.FatBlock != null);
            foreach (IMySlimBlock block in blocks)
            {
                IMyCubeBlock cubeBlock = block.FatBlock;

                if (cubeBlock.BlockDefinition.TypeId == typeof(MyObjectBuilder_MedicalRoom))
                {
                    IMyMedicalRoom medical = (IMyMedicalRoom)cubeBlock;
                    if (!medical.Enabled)
                    {
                        continue;
                    }

                    long playerId = PlayerMap.Instance.GetFastPlayerIdFromSteamId(steamId);
                    //if (medical.Owner == playerId || (medical.ShareMode == MyOwnershipShareModeEnum.Faction && Player.CheckPlayerSameFaction(medical.Owner, playerId)))
                    if (medical.HasPlayerAccess(playerId))
                    {
                        return(true);
                    }
                }
            }

            return(false);
        }
    private bool MustBeExecuted(IMyPlayer player)
    {
        Vector3D position = player.GetPosition();

        BoundingSphereD sphere = new BoundingSphereD(position, 3.0);

        List <MyEntity> entities = MyEntities.GetEntitiesInSphere(ref sphere);

        double         minDist = int.MaxValue;
        IMyMedicalRoom nearest = null;

        foreach (MyEntity entity in entities)
        {
            if (!(entity is IMyMedicalRoom))
            {
                continue;
            }

            IMyMedicalRoom medicalRoom = entity as IMyMedicalRoom;

            var dist = Vector3D.DistanceSquared(medicalRoom.GetPosition(), position);

            if (dist < minDist)
            {
                minDist = dist;
                nearest = medicalRoom;
            }
        }

        if (nearest == null)
        {
            return(false);
        }

        /* Only affect Medbays that have the following customData */
        if (nearest.CustomData.Contains("spawnPointMedbay"))
        {
            logger.WriteLine(player.DisplayName + " spawned at " + nearest.CustomName + " on grid " + nearest.CubeGrid.Name);
            return(true);
        }

        return(false);
    }
    public MatrixD GetSpawnPosition(IMyMedicalRoom myMedicalRoom)
    {
        var model = myMedicalRoom.Model;

        Dictionary <String, IMyModelDummy> dummies = new Dictionary <string, IMyModelDummy>();

        model.GetDummies(dummies);

        IMyModelDummy myModelDummy;

        /* Try find the detectorRespawnDummy */
        if (!dummies.TryGetValue("dummy detector_respawn", out myModelDummy))
        {
            if (!dummies.TryGetValue("detector_respawn", out myModelDummy))
            {
                myModelDummy = null;
            }
        }

        if (myModelDummy != null)
        {
            return(MatrixD.Multiply(MatrixD.CreateTranslation(myModelDummy.Matrix.Translation), myMedicalRoom.WorldMatrix));
        }

        logger.WriteLine("GetSpawnPosition: Couldnt Find Dummies fallback to World-Matrix!");

        MatrixD matrix = myMedicalRoom.WorldMatrix;

        Vector3D positon = myMedicalRoom.Position;

        positon += matrix.Forward;
        positon += matrix.Down;
        positon += matrix.Right;

        matrix.Translation = positon;

        return(matrix);
    }
Пример #5
0
        private static bool CheckRevealBlockRules(IMyCubeGrid grid, List <IMyPlayer> players, out string reason)
        {
            reason = "";
            // This is actually faster, but doesn't include power checks

            // Live dangerously
            List <IMySlimBlock> blocks = new List <IMySlimBlock>();

            grid.GetBlocks(blocks, x => x.FatBlock != null);
            //CubeGrids.GetAllConnectedBlocks(_processedGrids, grid, blocks, x => x.FatBlock != null);
            //bool found = false;
            //bool powered = false;
            foreach (IMySlimBlock block in blocks)
            {
                IMyCubeBlock cubeBlock = block.FatBlock;

                if (cubeBlock.BlockDefinition.TypeId == typeof(MyObjectBuilder_Beacon))
                {
                    //MyObjectBuilder_Beacon beacon = (MyObjectBuilder_Beacon)cubeBlock.GetObjectBuilderCubeBlock();
                    IMyBeacon beacon = (IMyBeacon)cubeBlock;
                    if (!beacon.Enabled)
                    {
                        continue;
                    }

                    //Sandbox.ModAPI.Ingame.IMyFunctionalBlock functionalBlock = (Sandbox.ModAPI.Ingame.IMyFunctionalBlock)cubeBlock;
                    //if (!functionalBlock.Enabled)
                    //	continue;

                    //Console.WriteLine("Beacon: {0} {1} {2}", beacon.BroadcastRadius, terminalBlock.IsWorking, terminalBlock.IsFunctional);
                    //if (!terminalBlock.IsWorking)
                    //	continue;


                    foreach (IMyPlayer player in players)
                    {
                        double distance = 0d;
                        if (Entity.GetDistanceBetweenPointAndPlayer(grid.GetPosition(), player, out distance))
                        {
                            if (distance < beacon.Radius)
                            {
                                //found = true;
                                //break;
                                reason = string.Format("{0} distance to beacon broadcast: {1}", player.DisplayName, distance);
                                return(true);
                            }
                        }
                    }
                }

                if (cubeBlock.BlockDefinition.TypeId == typeof(MyObjectBuilder_RadioAntenna))
                {
                    //MyObjectBuilder_RadioAntenna antenna = (MyObjectBuilder_RadioAntenna)cubeBlock.GetObjectBuilderCubeBlock();
                    IMyRadioAntenna antenna = (IMyRadioAntenna)cubeBlock;

                    if (!antenna.Enabled)
                    {
                        continue;
                    }

                    //Sandbox.ModAPI.Ingame.IMyFunctionalBlock functionalBlock = (Sandbox.ModAPI.Ingame.IMyFunctionalBlock)cubeBlock;
                    //if (!functionalBlock.Enabled)
                    //	continue;

                    foreach (IMyPlayer player in players)
                    {
                        double distance = 0d;
                        if (Entity.GetDistanceBetweenPointAndPlayer(grid.GetPosition(), player, out distance))
                        {
                            if (distance < antenna.Radius)
                            {
                                //found = true;
                                //break;
                                reason = string.Format("{0} distance to antenna broadcast: {1}", player.DisplayName, distance);
                                return(true);
                            }
                        }
                    }
                }

                if (cubeBlock.BlockDefinition.TypeId == typeof(MyObjectBuilder_MedicalRoom))
                {
                    //MyObjectBuilder_MedicalRoom medical = (MyObjectBuilder_MedicalRoom)cubeBlock.GetObjectBuilderCubeBlock();
                    IMyMedicalRoom medical = (IMyMedicalRoom)cubeBlock;
                    if (!medical.Enabled)
                    {
                        continue;
                    }

                    IMyFunctionalBlock functionalBlock = (IMyFunctionalBlock)cubeBlock;
                    if (!functionalBlock.IsFunctional)
                    {
                        continue;
                    }

                    //if (!functionalBlock.Enabled)
                    //	continue;

                    if (PluginSettings.Instance.DynamicConcealIncludeMedBays)
                    {
                        lock (Online)
                        {
                            foreach (ulong connectedPlayer in Online)
                            {
                                long playerId = PlayerMap.Instance.GetFastPlayerIdFromSteamId(connectedPlayer);
                                //if (medical.Owner == playerId || (medical.ShareMode == MyOwnershipShareModeEnum.Faction && Player.CheckPlayerSameFaction(medical.Owner, playerId)))
                                if (functionalBlock.OwnerId == playerId)
                                {
                                    reason = string.Format("Grid has medbay and player is logged in - playerid: {0}", playerId);
                                    return(true);
                                }

                                if (functionalBlock.GetUserRelationToOwner(playerId) == MyRelationsBetweenPlayerAndBlock.FactionShare)
                                {
                                    reason = string.Format("Grid has medbay and player is factionshare - playerid: {0}", playerId);
                                    return(true);
                                }
                            }
                        }

                        /*
                         * foreach (ulong connectedPlayer in PlayerManager.Instance.ConnectedPlayers)
                         * {
                         *      long playerId = PlayerMap.Instance.GetFastPlayerIdFromSteamId(connectedPlayer);
                         *      //if (medical.Owner == playerId || (medical.ShareMode == MyOwnershipShareModeEnum.Faction && Player.CheckPlayerSameFaction(medical.Owner, playerId)))
                         *      //if (functionalBlock.OwnerId == playerId || (functionalBlock.GetUserRelationToOwner(playerId) == Sandbox.Common.MyRelationsBetweenPlayerAndBlock.FactionShare))
                         *      if(medical.HasPlayerAccess(playerId))
                         *      {
                         *              reason = string.Format("Grid has medbay and player is logged in - playerid: {0}", playerId);
                         *              return true;
                         *      }
                         * }
                         */
                    }
                    else
                    {
                        reason = string.Format("Grid has medbay and conceal can not include medbays");
                        return(true);
                    }
                }

                if (cubeBlock.BlockDefinition.TypeId == typeof(MyObjectBuilder_ProductionBlock))
                {
                    MyObjectBuilder_ProductionBlock production = (MyObjectBuilder_ProductionBlock)cubeBlock.GetObjectBuilderCubeBlock();
                    if (!production.Enabled)
                    {
                        continue;
                    }

                    IMyProductionBlock productionBlock = (IMyProductionBlock)cubeBlock;
                    if (production.Queue.Length > 0)
                    {
                        reason = string.Format("Grid has production facility that has a queue");
                        return(true);
                    }
                }
            }

            return(false);
        }
Пример #6
0
        private static bool CheckConcealBlockRules(IMyCubeGrid grid, List <IMyPlayer> players)
        {
            List <IMySlimBlock> blocks = new List <IMySlimBlock>();

            // Live dangerously
            grid.GetBlocks(blocks, x => x.FatBlock != null);
            //CubeGrids.GetAllConnectedBlocks(_processedGrids, grid, blocks, x => x.FatBlock != null);

            int beaconCount = 0;

            //bool found = false;
            //bool powered = false;
            foreach (IMySlimBlock block in blocks)
            {
                IMyCubeBlock cubeBlock = block.FatBlock;

                if (cubeBlock.BlockDefinition.TypeId == typeof(MyObjectBuilder_Beacon))
                {
                    IMyBeacon beacon = (IMyBeacon)cubeBlock;
                    //MyObjectBuilder_Beacon beacon = (MyObjectBuilder_Beacon)cubeBlock.GetObjectBuilderCubeBlock();
                    beaconCount++;
                    // Keep this return here, as 4 beacons always means true
                    if (beaconCount >= 4)
                    {
                        return(true);
                    }

                    if (!beacon.Enabled)
                    {
                        continue;
                    }

                    IMyTerminalBlock terminalBlock = (IMyTerminalBlock)cubeBlock;
//					Console.WriteLine("Found: {0} {1} {2}", beacon.BroadcastRadius, terminalBlock.IsWorking, terminalBlock.IsFunctional);
                    //if (!terminalBlock.IsWorking)
                    //{
//						continue;
                    //}

                    foreach (IMyPlayer player in players)
                    {
                        double distance = 0d;
                        if (Entity.GetDistanceBetweenPointAndPlayer(grid.GetPosition(), player, out distance))
                        {
                            if (distance < beacon.Radius)
                            {
//								Console.WriteLine("Not concealed due to broadcast radius");
                                //found = true;
                                //break;
                                return(true);
                            }
                        }
                    }
                }

                if (cubeBlock.BlockDefinition.TypeId == typeof(MyObjectBuilder_RadioAntenna))
                {
                    //MyObjectBuilder_RadioAntenna antenna = (MyObjectBuilder_RadioAntenna)cubeBlock.GetObjectBuilderCubeBlock();
                    IMyRadioAntenna antenna = (IMyRadioAntenna)cubeBlock;

                    if (!antenna.Enabled)
                    {
                        continue;
                    }

                    IMyTerminalBlock terminalBlock = (IMyTerminalBlock)cubeBlock;
                    //if (!terminalBlock.IsWorking)
                    //	continue;

                    foreach (IMyPlayer player in players)
                    {
                        double distance = 0d;
                        if (Entity.GetDistanceBetweenPointAndPlayer(grid.GetPosition(), player, out distance))
                        {
                            if (distance < antenna.Radius)
                            {
//								Console.WriteLine("Not concealed due to antenna broadcast radius");
                                //found = true;
                                //break;
                                return(true);
                            }
                        }
                    }
                }

                if (cubeBlock.BlockDefinition.TypeId == typeof(MyObjectBuilder_MedicalRoom))
                {
                    //MyObjectBuilder_MedicalRoom medical = (MyObjectBuilder_MedicalRoom)cubeBlock.GetObjectBuilderCubeBlock();
                    IMyMedicalRoom medical = (IMyMedicalRoom)cubeBlock;

                    if (!medical.Enabled)
                    {
                        continue;
                    }

                    IMyFunctionalBlock functionalBlock = (IMyFunctionalBlock)cubeBlock;
                    //if (!terminalBlock.IsWorking)
                    //	continue;

                    if (PluginSettings.Instance.DynamicConcealIncludeMedBays)
                    {
                        lock (Online)
                        {
                            foreach (ulong connectedPlayer in Online)
                            {
                                //if (PlayerMap.Instance.GetPlayerIdsFromSteamId(connectedPlayer).Count < 1)
                                //continue;

                                //long playerId = PlayerMap.Instance.GetPlayerIdsFromSteamId(connectedPlayer).First();
                                long playerId = PlayerMap.Instance.GetFastPlayerIdFromSteamId(connectedPlayer);

                                if (functionalBlock.OwnerId == playerId || (functionalBlock.GetUserRelationToOwner(playerId) == MyRelationsBetweenPlayerAndBlock.FactionShare))
                                //if (functionalBlock.Owner == playerId || (functionalBlock.ShareMode == MyOwnershipShareModeEnum.Faction && Player.CheckPlayerSameFaction(functionalBlock.Owner, playerId)))
                                //if (medical.HasPlayerAccess(playerId))
                                {
                                    return(true);
                                }
                            }
                        }

                        /*
                         * foreach (ulong connectedPlayer in PlayerManager.Instance.ConnectedPlayers)
                         * {
                         *      //if (PlayerMap.Instance.GetPlayerIdsFromSteamId(connectedPlayer).Count < 1)
                         *              //continue;
                         *
                         *      //long playerId = PlayerMap.Instance.GetPlayerIdsFromSteamId(connectedPlayer).First();
                         *      long playerId = PlayerMap.Instance.GetFastPlayerIdFromSteamId(connectedPlayer);
                         *      //if (medical.Owner == playerId || (medical.ShareMode == MyOwnershipShareModeEnum.Faction && Player.CheckPlayerSameFaction(medical.Owner, playerId)))
                         *      if(medical.HasPlayerAccess(playerId))
                         *      {
                         *              return true;
                         *      }
                         * }
                         */
                    }
                    else
                    {
                        return(true);
                    }
                }

                if (cubeBlock.BlockDefinition.TypeId == typeof(MyObjectBuilder_Refinery) || cubeBlock.BlockDefinition.TypeId == typeof(MyObjectBuilder_Assembler))
                {
                    //MyObjectBuilder_ProductionBlock production = (MyObjectBuilder_ProductionBlock)cubeBlock.GetObjectBuilderCubeBlock();
                    IMyProductionBlock production = (IMyProductionBlock)cubeBlock;
                    if (!production.Enabled)
                    {
                        continue;
                    }

                    if (production.IsProducing)
                    {
                        return(true);
                    }
                }

                foreach (string subType in PluginSettings.Instance.DynamicConcealIgnoreSubTypeList)
                {
                    if (cubeBlock.BlockDefinition.SubtypeName.Contains(subType))
                    {
//						Console.WriteLine("Not concealed due subtype");
                        //found = true;
                        return(true);
                    }
                }
            }

            return(false);
        }
    public void PlayerSpawned(long playerId)
    {
        IMyPlayer player = Player(playerId);

        if (player == null)
        {
            logger.WriteLine("Player Spawned Event: Player #" + playerId + " not found!");
            return;
        }

        var character = player.Character;

        if (character == null)
        {
            logger.WriteLine("Player Spawned Event: Player '" + player.DisplayName + "' has no Character!");
            return;
        }

        if (!playerLastDiedLocation.ContainsKey(playerId))
        {
            logger.WriteLine("Player Spawned Event: Player '" + player.DisplayName + "' has no last Died Location!");
            return;
        }

        Vector3D lastDiedPositon = playerLastDiedLocation[playerId];

        double         shortestDistance = 0;
        IMyMedicalRoom nearestMedbay    = null;

        lock (allMedicalRooms) {
            foreach (Medbay medbay in allMedicalRooms)
            {
                IMyEntity entity         = medbay.Entity;
                Vector3D  medbayPosition = entity.GetPosition();

                IMyMedicalRoom medicalRoom = entity as IMyMedicalRoom;

                /* Wir ignorieren Medbays vom Independent Survival Mod */
                SerializableDefinitionId definiton = medicalRoom.BlockDefinition;
                if (definiton.SubtypeId.ToString() == "CythonSuitMedicalRoom")
                {
                    continue;
                }

                /* Wenn nicht Funktional, Nicht Working, Nicht Enabled, oder nicht Powered continue */
                if (!medicalRoom.IsFunctional || !medicalRoom.IsWorking || !medicalRoom.Enabled)
                {
                    continue;
                }

                MyRelationsBetweenPlayerAndBlock relation = medicalRoom.GetUserRelationToOwner(playerId);

                /* Fremde Medbays sind nicht erlaubt. No Owner, Owner und Faction share ist fein. Enemies und Neutral definitiv nicht.  */
                if (relation == MyRelationsBetweenPlayerAndBlock.Enemies ||
                    relation == MyRelationsBetweenPlayerAndBlock.Neutral)
                {
                    continue;
                }

                double distance = Vector3D.Distance(medbayPosition, lastDiedPositon);

                if (nearestMedbay == null || distance < shortestDistance)
                {
                    nearestMedbay    = medicalRoom;
                    shortestDistance = distance;
                }
            }
        }

        if (nearestMedbay == null)
        {
            logger.WriteLine("Player Spawned Event: Player '" + player.DisplayName + "' has usable Medbay nearby!");
            return;
        }

        MatrixD matrix = GetSpawnPosition(nearestMedbay);

        lock (playerLastDiedLocation) {
            playerLastDiedLocation.Remove(playerId);
            playerLastDiedLocation.Add(playerId, matrix.Translation);
        }

        Vector3 velocity = nearestMedbay.CubeGrid.Physics.GetVelocityAtPoint(matrix.Translation);

        character.Physics.LinearVelocity = velocity;
        character.SetWorldMatrix(matrix);

        bool needsDamping = character.Physics.Speed == 0;

        if ((!character.EnabledDamping && needsDamping) ||
            (character.EnabledDamping && !needsDamping))
        {
            character.SwitchDamping();
        }


        MyVisualScriptLogicProvider.ShowNotification("You got teleported to the Medical Room nearest to the location you died at.", 5000, MyFontEnum.Green, playerId);
        logger.WriteLine("Player Spawned Event: Player '" + player.DisplayName + "' spawned at Position " + matrix.Translation + "!");

        serializePlayerData();
    }