void UpdateRelays()
        {
            IMyCubeGrid OwnGrid = AntennaBlock.GetTopMostParent() as IMyCubeGrid;

            RelayedReceivers.Clear();
            RelayedGridsIngame.Clear();
            RelayedChars.Clear();
            if (Antenna == null)
            {
                RadarCore.LogError(AntennaBlock.DisplayName + ".Update10()", new Exception("Antenna == null"));
            }
            if (Antenna.BroadcastersInRange == null)
            {
                RadarCore.LogError(AntennaBlock.DisplayName + ".Update10()", new Exception("BroadcastersInRange == null"));
            }
            if (Antenna.BroadcastersInRange == null)
            {
                return;
            }
            foreach (var Receiver in Antenna.BroadcastersInRange.Select(x => x.Entity.GetComponent <MyDataReceiver>()))
            {
                TryAddRelay(Receiver);
                if (Receiver?.BroadcastersInRange == null)
                {
                    continue;
                }
                foreach (var RelayedReceiver in Receiver.BroadcastersInRange.Select(x => x.Entity.GetComponent <MyDataReceiver>()))
                {
                    TryAddRelay(RelayedReceiver);
                }
            }
        }
 public override void UpdateBeforeSimulation10()
 {
     try
     {
         UpdateRelays();
         AntennaBlock.RefreshCustomInfo();
     }
     catch (Exception Scrap)
     {
         RadarCore.LogError(AntennaBlock.DisplayName + ".Update10().General", Scrap);
     }
 }
        void TryAddRelay(MyDataReceiver Receiver)
        {
            if (Receiver == null)
            {
                return;
            }
            if (Receiver == Antenna)
            {
                return;
            }
            if (RelayedReceivers.Contains(Receiver))
            {
                return;
            }
            IMyTerminalBlock ReceiverBlock = (Receiver.Entity as IMyTerminalBlock);

            if (ReceiverBlock != null)
            {
                if (!ReceiverBlock.HasPlayerAccess(AntennaBlock.OwnerId))
                {
                    return;
                }
                if (!ReceiverBlock.IsWorking)
                {
                    return;
                }
                IMyCubeGrid Grid = ReceiverBlock.CubeGrid.GetTopMostParent() as IMyCubeGrid;
                if (Grid == null || Grid == AntennaGrid)
                {
                    return;
                }

                RelayedReceivers.Add(Receiver);
                if (!RelayedGrids.Any(x => x.EntityId == Grid.EntityId))
                {
                    RelayedGrids.Add(Grid);
                    RelayedGridsIngame.Add(MyDetectedEntityInfoHelper.Create(Grid as MyEntity, AntennaBlock.OwnerId));
                }
            }
            else
            {
                IMyCharacter Char = Receiver.Entity as IMyCharacter;
                if (Char != null)
                {
                    if (Char.IsPlayer && !Char.IsDead && AntennaBlock.HasPlayerAccess(Char.ControllerInfo.ControllingIdentityId))
                    {
                        RelayedChars.Add(Char);
                    }
                }
            }
        }
Exemple #4
0
        void GetAntennae()
        {
            List <IMyRadioAntenna> AntennaeBlocks = new List <IMyRadioAntenna>();

            Term.GetBlocksOfType(AntennaeBlocks);
            Antennae = new HashSet <AntennaComms>();
            foreach (var AntennaBlock in AntennaeBlocks)
            {
                AntennaComms Antenna = AntennaBlock.GetComponent <AntennaComms>();
                if (Antenna != null)
                {
                    Antennae.Add(Antenna);
                }
            }
        }
        public override void UpdateOnceBeforeFrame()
        {
            if (AntennaBlock.CubeGrid.Physics == null)
            {
                NeedsUpdate |= MyEntityUpdateEnum.BEFORE_NEXT_FRAME;
                return;
            }

            NeedsUpdate |= MyEntityUpdateEnum.EACH_10TH_FRAME;
            if (AntennaBlock is IMyRadioAntenna && !InitedRadioAntennaControls)
            {
                InitRadioAntennaControls();
            }
            if (AntennaBlock is IMyLaserAntenna && !InitedLaserAntennaControls)
            {
                InitLaserAntennaControls();
            }
            SyncAllowReceive = new AutoSet <bool>(Entity, "Receive", true);
            Load();
            AntennaBlock.AppendingCustomInfo += AntennaBlock_AppendingCustomInfo;
            AntennaBlock.OnMarkForClose      += AntennaBlock_OnMarkForClose;
            AntennaGrid = AntennaBlock.GetTopMostParent() as IMyCubeGrid;
            RadarCore.SaveRegister(Save);
        }
        private void AntennaBlock_AppendingCustomInfo(IMyTerminalBlock Block, StringBuilder Info)
        {
            AntennaComms CommComp = Block.GetComponent <AntennaComms>();

            if (CommComp == null)
            {
                return;
            }
            Info.AppendLine($"Relays ({CommComp.RelayedReceivers.Count}):");
            foreach (var Relayed in CommComp.RelayedReceivers.OrderBy(x => Vector3D.DistanceSquared(AntennaBlock.GetPosition(), x.Broadcaster.Entity.GetPosition())))
            {
                IMyTerminalBlock RelayBlock  = Relayed.Entity as IMyTerminalBlock;
                IMyCharacter     RelayedChar = Relayed.Entity as IMyCharacter;
                if (RelayBlock != null)
                {
                    Info.AppendLine($"{RelayBlock.CustomName} on {RelayBlock.CubeGrid.DisplayName} ({Math.Round(Vector3D.Distance(Block.GetPosition(), RelayBlock.GetPosition()))}m)");
                }
                else if (RelayedChar != null)
                {
                    Info.AppendLine($"{RelayedChar.DisplayName} ({Math.Round(Vector3D.Distance(Block.GetPosition(), RelayBlock.GetPosition()))}m)");
                }
            }
        }