public static bool CheckConnection(MyIdentity sender, MyIdentity receiver) { if (sender == receiver) { return(true); } var senderRelayedBroadcasters = sender.Character.RadioReceiver.GetRelayedBroadcastersForPlayer(sender.IdentityId); var receiverRelayedBroadcasters = receiver.Character.RadioReceiver.GetRelayedBroadcastersForPlayer(receiver.IdentityId); foreach (var senderRelayedBroadcaster in senderRelayedBroadcasters) { //Is the broadcaster in range of sender broadcaster? if (VRageMath.Vector3D.Distance(senderRelayedBroadcaster.BroadcastPosition, sender.Character.PositionComp.GetPosition()) > sender.Character.RadioBroadcaster.BroadcastRadius) { continue; } //Relayed broadcasters include antennas and characters if (senderRelayedBroadcaster.Parent is IMyComponentOwner <MyIDModule> ) { MyIDModule broadcasterId; if ((senderRelayedBroadcaster.Parent as IMyComponentOwner <MyIDModule>).GetComponent(out broadcasterId)) { Sandbox.Common.MyRelationsBetweenPlayerAndBlock relation = broadcasterId.GetUserRelationToOwner(sender.IdentityId); if (relation == Sandbox.Common.MyRelationsBetweenPlayerAndBlock.Enemies || relation == Sandbox.Common.MyRelationsBetweenPlayerAndBlock.Neutral || broadcasterId.Owner == 0) { continue; } } } if (senderRelayedBroadcaster.Parent is MyCharacter) { var relation = (senderRelayedBroadcaster.Parent as MyCharacter).GetRelationTo(sender.IdentityId); if (relation == Sandbox.Common.MyRelationsBetweenPlayerAndBlock.Enemies || relation == Sandbox.Common.MyRelationsBetweenPlayerAndBlock.Neutral) { continue; } } if (receiverRelayedBroadcasters.Contains(senderRelayedBroadcaster)) { return(true); } } return(false); }
private void runActionOnBlock(string blockName, string actionString) { //log("entered runActionOnBlock("+blockName+", "+actionString+")", "runActionOnBlock()", Logger.severity.TRACE); blockName = blockName.ToLower().Replace(" ", ""); actionString = actionString.Trim(); List <IMySlimBlock> blocksWithName = new List <IMySlimBlock>(); owner.myGrid.GetBlocks(blocksWithName); foreach (IMySlimBlock block in blocksWithName) { IMyCubeBlock fatblock = block.FatBlock; if (fatblock == null) { continue; } Sandbox.Common.MyRelationsBetweenPlayerAndBlock relationship = fatblock.GetUserRelationToOwner(owner.currentRCblock.OwnerId); if (relationship != Sandbox.Common.MyRelationsBetweenPlayerAndBlock.Owner && relationship != Sandbox.Common.MyRelationsBetweenPlayerAndBlock.FactionShare) { //log("failed relationship test for " + fatblock.DisplayNameText + ", result was " + relationship.ToString(), "runActionOnBlock()", Logger.severity.TRACE); continue; } //log("passed relationship test for " + fatblock.DisplayNameText + ", result was " + relationship.ToString(), "runActionOnBlock()", Logger.severity.TRACE); //log("testing: " + fatblock.DisplayNameText, "runActionOnBlock()", Logger.severity.TRACE); // name test if (fatblock is Ingame.IMyRemoteControl) { string nameOnly = fatblock.getNameOnly(); if (nameOnly == null || !nameOnly.Contains(blockName)) { continue; } } else { if (!fatblock.DisplayNameText.looseContains(blockName)) { //log("testing failed " + fatblock.DisplayNameText + " does not contain " + blockName, "runActionOnBlock()", Logger.severity.TRACE); continue; } //log("testing successfull " + fatblock.DisplayNameText + " contains " + blockName, "runActionOnBlock()", Logger.severity.TRACE); } if (!(fatblock is IMyTerminalBlock)) { //log("not a terminal block: " + fatblock.DisplayNameText, "runActionOnBlock()", Logger.severity.TRACE); continue; } IMyTerminalBlock terminalBlock = fatblock as IMyTerminalBlock; ITerminalAction actionToRun = terminalBlock.GetActionWithName(actionString); // get actionToRun on every iteration so invalid blocks can be ignored if (actionToRun != null) { log("running action: " + actionString + " on block: " + fatblock.DisplayNameText, "runActionOnBlock()", Logger.severity.DEBUG); actionToRun.Apply(fatblock); } else { log("could not get action: " + actionString + " for: " + fatblock.DisplayNameText, "runActionOnBlock()", Logger.severity.TRACE); } } }