bool FuncTest(IMyMedicalRoom block) { //Medical Room //Interface name: IMyMedicalRoom //Parent: IMyFunctionalBlock return(true); }
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); }
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); }
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(); }