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);
        }
Beispiel #2
0
        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);
                }
            }
        }