Ejemplo n.º 1
0
        /// <summary>
        /// Tries to create a radio component for an entity. Creates the radio component if the entity is a radio antenna block, beacon block, or a character.
        /// </summary>
        /// <param name="obj">Entity to create the component for.</param>
        /// <returns>A new radio component for the entity, if it can be created. Null, otherwise.</returns>
        public static ComponentRadio TryCreateRadio(IMyEntity obj)
        {
            IMyRadioAntenna radioAnt = obj as IMyRadioAntenna;

            if (radioAnt != null)
            {
                return(new CR_AntennaBlock(radioAnt));
            }

            IMyBeacon beacon = obj as IMyBeacon;

            if (beacon != null)
            {
                return(new CR_BeaconBlock(beacon));
            }

            IMyCharacter character = obj as IMyCharacter;

            if (character != null)
            {
                return(new CR_Character(character));
            }

            return(null);
        }
Ejemplo n.º 2
0
        bool CollectParts(IMyTerminalBlock block)
        {
            if (block.CubeGrid.EntityId != Context.Reference.CubeGrid.EntityId)
            {
                return(false);
            }

            if (block.HasInventory && block.CustomName.Contains("<M>"))
            {
                Inventories.Add(block.GetInventory(block.InventoryCount - 1));
            }
            if (block is IMyGasTank &&
                (block.BlockDefinition.SubtypeId == "LargeHydrogenTank" ||
                 block.BlockDefinition.SubtypeId == "SmallHydrogenTank" ||
                 block.BlockDefinition.SubtypeId == "LargeHydrogenTankSmall" ||
                 block.BlockDefinition.SubtypeId == "SmallHydrogenTankSmall"))
            {
                HydrogenTanks.Add((IMyGasTank)block);
            }
            if (block is IMyBatteryBlock)
            {
                Batteries.Add((IMyBatteryBlock)block);
            }
            if (block is IMyBeacon)
            {
                Beacon = (IMyBeacon)block;
            }

            return(false);
        }
Ejemplo n.º 3
0
 void GetParts()
 {
     Inventories.Clear();
     HydrogenTanks.Clear();
     Batteries.Clear();
     Beacon = null;
     Context.Terminal.GetBlocksOfType <IMyTerminalBlock>(null, CollectParts);
 }
Ejemplo n.º 4
0
        public override void Init(MyObjectBuilder_EntityBase objectBuilder)
        {
            m_objectBuilder = objectBuilder;
            m_block         = Entity as IMyTerminalBlock;
            m_beacon        = m_block as IMyBeacon;
            //Initilize enabledChangedEvent
            m_beacon.EnabledChanged += M_beacon_EnabledChanged;

            NeedsUpdate = MyEntityUpdateEnum.EACH_100TH_FRAME;
        }
Ejemplo n.º 5
0
        private IMyBeacon timer_block; //Block object

        public override void Init(MyObjectBuilder_EntityBase objectBuilder)
        {
            timer_block = Entity as IMyBeacon;
            NeedsUpdate = MyEntityUpdateEnum.BEFORE_NEXT_FRAME;

            timer_block.EnabledChanged += new Action <IMyTerminalBlock>()
            {
                Method
            };
        }
Ejemplo n.º 6
0
        bool FuncTest(IMyBeacon block)
        {
            //Beacon
            //Interface name: IMyBeacon
            //Parent: IMyFunctionalBlock
            //Fields:
            float Radius = block.Radius;

            return(true);
        }
        public override void Init(MyObjectBuilder_EntityBase objectBuilder)
        {
            base.Init(objectBuilder);

            try{
                Beacon       = Entity as IMyBeacon;
                NeedsUpdate |= MyEntityUpdateEnum.EACH_100TH_FRAME;
            }catch (Exception exc) {
            }
        }
        public static Dictionary <string, List <IMyCubeBlock> > GetZonesInGrid(IMyCubeGrid cubeGrid)
        {
            Dictionary <String, List <IMyCubeBlock> > testList = new Dictionary <string, List <IMyCubeBlock> >();
            List <IMySlimBlock> cubeBlocks = new List <IMySlimBlock>();

            cubeGrid.GetBlocks(cubeBlocks);
            foreach (IMySlimBlock entityBlock in cubeBlocks)
            {
                if (entityBlock.FatBlock == null)
                {
                    continue;
                }

                if (!(entityBlock.FatBlock is IMyCubeBlock))
                {
                    continue;
                }

                IMyCubeBlock cubeBlock = (IMyCubeBlock)entityBlock.FatBlock;

                if (!(cubeBlock is IMyBeacon))
                {
                    continue;
                }

                IMyBeacon beacon = (IMyBeacon)cubeBlock;
                if (beacon.CustomName == null || beacon.CustomName == "")
                {
                    continue;
                }

                if (testList.ContainsKey(beacon.CustomName))
                {
                    testList[beacon.CustomName].Add(entityBlock.FatBlock);
                }
                else
                {
                    List <IMyCubeBlock> testBeaconList = new List <IMyCubeBlock>();
                    testBeaconList.Add(entityBlock.FatBlock);
                    testList.Add(beacon.CustomName, testBeaconList);
                }
            }

            Dictionary <String, List <IMyCubeBlock> > resultList = new Dictionary <string, List <IMyCubeBlock> >();

            foreach (KeyValuePair <String, List <IMyCubeBlock> > p in testList)
            {
                if (p.Value.Count == 4)
                {
                    resultList.Add(p.Key, p.Value);
                }
            }

            return(resultList);
        }
Ejemplo n.º 9
0
        private void M_beacon_EnabledChanged(IMyTerminalBlock obj)
        {
            m_beacon = m_beacon as IMyBeacon;

            //Prevent calling myself
            if (m_beacon.Enabled == true)
            {
                return;
            }

            m_beacon.Enabled = true;
            //throw new NotImplementedException();
            //m_beacon.EnabledChanged -= M_beacon_EnabledChanged;
        }
Ejemplo n.º 10
0
        public override void UpdateOnceBeforeFrame()
        {
            beacon = Entity as IMyBeacon;

            List <IMyTerminalControl> antennactrls = new List <IMyTerminalControl>();

            MyAPIGateway.TerminalControls.GetControls <IMyBeacon>(out antennactrls);

            IMyTerminalControlSlider RadiusSlider = antennactrls.Find(x => x.Id == "Radius") as IMyTerminalControlSlider;

            float maxVal = beacon.ParseMaxRange();

            RadiusSlider.SetLimits(0, Extensions.ParseMaxRange(beacon));
        }
        public override void Init(MyObjectBuilder_EntityBase objectBuilder)
        {
            base.Init(objectBuilder);

            beacon = (Entity as IMyBeacon);
            NoFlyZone_Thruster.beaconList.Add(beacon);
            if (beacon != null)
            {
                logicEnabled = true;
                NeedsUpdate |= MyEntityUpdateEnum.EACH_FRAME;
                //NeedsUpdate |= MyEntityUpdateEnum.EACH_10TH_FRAME;
                NeedsUpdate |= MyEntityUpdateEnum.EACH_100TH_FRAME;
            }

            client = MyAPIGateway.Session.LocalHumanPlayer;
        }
Ejemplo n.º 12
0
    /**
     * Locate the primary communication antenna and beacon. These may be used by the specific
     * bot implementation to indicate the status of the ship.
     */
    private void SetupComms() {
      IMyGridTerminalSystem terminal = m_ownedGrid.GetTerminalSystem();
      List<IMyRadioAntenna> antennas = terminal.GetBlocksOfType<IMyRadioAntenna>();
      if (antennas.Count > 0) {
        m_mainAntenna = antennas[0];
      }
      foreach(IMyRadioAntenna antenna in antennas) {
        antenna.EnableBroadcasting = false;
      }

      List<IMyBeacon> beacons = terminal.GetBlocksOfType<IMyBeacon>();
      if (beacons.Count > 0) {
        m_mainBeacon = beacons[0];
      }
      foreach(IMyBeacon beacon in beacons) {
        beacon.Enabled = false;
      }
    }
Ejemplo n.º 13
0
        public static float ParseMaxRange(this IMyBeacon Antenna)
        {
            float  range       = GetDefaultRange(Antenna);
            string description = GetCustomDefinition(Antenna);

            if (description != null)
            {
                var Description = description.Replace("\r\n", "\n").Trim().Split('\n');

                foreach (string DescriptionLine in Description)
                {
                    if (DescriptionLine.Trim().StartsWith("MaxRange:"))
                    {
                        float.TryParse(DescriptionLine.Split(':')[1].Trim(), out range);
                    }
                }
            }
            return(range);
        }
Ejemplo n.º 14
0
        public void Main(string argument, UpdateType updateSource)
        {
            // First get all the beacons and panels in current grid and return doing nothing if both are empty as then we have nowhere to display our data.
            GridTerminalSystem.GetBlocksOfType <IMyBeacon>(beacons);
            GridTerminalSystem.GetBlocksOfType <IMyTextPanel>(textPanels);

            if (beacons.Count == 0 && textPanels.Count == 0)
            {
                return;
            }

            GridTerminalSystem.GetBlocksOfType <IMyCargoContainer>(containers);
            CalculateInventory(cargoCapacity, containers);

            GridTerminalSystem.GetBlocksOfType <IMyShipDrill>(drills);
            CalculateInventory(cargoCapacity, drills);

            GridTerminalSystem.GetBlocksOfType <IMyShipConnector>(connectors);
            CalculateInventory(cargoCapacity, connectors);

            string capacityStr = new StringBuilder(cargoCapacity.ToCurrentVolume().ToString())
                                 .Append("Kl of ")
                                 .AppendLine(cargoCapacity.ToMaxVolume().ToString() + "Kl")
                                 .AppendLine(cargoCapacity.ToPercentage().ToString("0.00") + "%")
                                 .ToString();

            IMyBeacon    beacon    = FindBeacon(beacons);
            IMyTextPanel textPanel = FindTextPanel(textPanels);

            if (beacon != null)
            {
                SetBeaconName(beacon, DisplayName + "\n" + capacityStr);
            }
            if (textPanel != null)
            {
                SetPanelText(textPanel, capacityStr);
            }

            CleanUp();
        }
Ejemplo n.º 15
0
        //Disables all beacons and antennas and deletes the ship.
        public void DeleteShip()
        {
            var lstSlimBlock = new List <IMySlimBlock>();

            Ship.GetBlocks(lstSlimBlock, (x) => x.FatBlock is IMyRadioAntenna);
            foreach (var block in lstSlimBlock)
            {
                IMyRadioAntenna antenna = (IMyRadioAntenna)block.FatBlock;
                ITerminalAction act     = antenna.GetActionWithName("OnOff_Off");
                act.Apply(antenna);
            }

            lstSlimBlock = new List <IMySlimBlock>();
            Ship.GetBlocks(lstSlimBlock, (x) => x.FatBlock is IMyBeacon);
            foreach (var block in lstSlimBlock)
            {
                IMyBeacon       beacon = (IMyBeacon)block.FatBlock;
                ITerminalAction act    = beacon.GetActionWithName("OnOff_Off");
                act.Apply(beacon);
            }

            MyAPIGateway.Entities.RemoveEntity(Ship as IMyEntity);
            Ship = null;
        }
            protected override void LoadBlocks()
            {
                listDrills = new List <IMyShipDrill>();
                GetProgram().GridTerminalSystem.GetBlocksOfType(listDrills);

                IMyBlockGroup groupPistonsMDir = GetProgram().GridTerminalSystem.GetBlockGroupWithName(Params.GrpNamePistonMDir);

                listPistonMDir = new List <IMyPistonBase>();
                if (groupPistonsMDir == null)
                {
                    logger.Error("Group \"" + Params.GrpNamePistonMDir + "\" not found");
                }
                else
                {
                    groupPistonsMDir.GetBlocksOfType(listPistonMDir);
                }

                IMyBlockGroup groupPistonMODir = GetProgram().GridTerminalSystem.GetBlockGroupWithName(Params.GrpNamePistonMODir);

                listPistonMODir = new List <IMyPistonBase>();
                if (groupPistonMODir == null)
                {
                    logger.Info("Group \"" + Params.GrpNamePistonMODir + "\" not found");
                }
                else
                {
                    GetProgram().GridTerminalSystem.GetBlocksOfType(listPistonMODir);
                }

                List <IMyBeacon> listBeacon = new List <IMyBeacon>();

                GetProgram().GridTerminalSystem.GetBlocksOfType(listBeacon);
                if (listBeacon.Count > 0)
                {
                    beacon = listBeacon.First();
                    beacon.SetValue("Radius", Params.MinBeaconRadius);
                }
                else
                {
                    logger.Info("No beacon found");
                }

                mainMotor = GetProgram().GridTerminalSystem.GetBlockWithName(Params.MainRotorName) as IMyMotorStator;
                if (mainMotor == null)
                {
                    logger.Info("No rotor \"" + Params.MainRotorName + "\" found");
                }
                else
                {
                    mainMotor.SetValue("LowerLimit", Params.MinRotorAngle);
                    mainMotor.SetValue("UpperLimit", Params.MinRotorAngle);
                }

                IMyBlockGroup groupLights = GetProgram().GridTerminalSystem.GetBlockGroupWithName(Params.GrpNameLight);

                listLight = new List <IMyLightingBlock>();
                if (groupLights == null)
                {
                    logger.Info("Group \"" + Params.GrpNameLight + "\" not found");
                }
                else
                {
                    groupLights.GetBlocksOfType(listLight);
                }

                IMyBlockGroup groupCargo = GetProgram().GridTerminalSystem.GetBlockGroupWithName(Params.GrpNameCargo);

                listCargo = new List <IMyCargoContainer>();
                if (groupCargo == null)
                {
                    logger.Info("Group \"" + Params.GrpNameCargo + "\" not found");
                }
                else
                {
                    groupCargo.GetBlocksOfType(listCargo);
                }
            }
Ejemplo n.º 17
0
        /// <summary>
        /// Finds the closest player owned market of the specified open state.
        /// </summary>
        /// <returns></returns>
        public static MarketStruct FindClosestPlayerMarket(IMyPlayer player, bool?isOpen = null)
        {
            var character = player.GetCharacter();

            if (character == null)
            {
                // Cannot determine the player's location.
                return(null);
            }

            var position = ((IMyEntity)character).GetPosition();
            var markets  = EconomyScript.Instance.Data.Markets.Where(m => m.MarketId == player.SteamUserId && (!isOpen.HasValue || m.Open == isOpen.Value)).ToArray();

            if (markets.Length == 0)
            {
                // no open markets found for the player;
                return(null);
            }

            var list = new Dictionary <IMyTerminalBlock, double>();

            foreach (var market in markets)
            {
                IMyEntity entity;
                if (!MyAPIGateway.Entities.TryGetEntityById(market.EntityId, out entity))
                {
                    continue;
                }
                if (entity.Closed || entity.MarkedForClose)
                {
                    continue;
                }
                IMyBeacon beacon = entity as IMyBeacon;
                if (beacon == null)
                {
                    continue;
                }

                if (beacon.GetUserRelationToOwner(player.IdentityId) != MyRelationsBetweenPlayerAndBlock.Owner)
                {
                    // Close the market, because it's no longer owner by the player.
                    market.Open = false;
                    continue;
                }

                // TODO: should only return markets in the set range.

                var distance = (position - beacon.WorldMatrix.Translation).Length();
                list.Add(beacon, distance);
            }

            if (list.Count == 0)
            {
                return(null);
            }

            var closetEntity = list.OrderBy(f => f.Value).First().Key;
            var closetMarket = EconomyScript.Instance.Data.Markets.First(m => m.MarketId == player.SteamUserId && (!isOpen.HasValue || m.Open == isOpen.Value) && m.EntityId == closetEntity.EntityId);

            return(closetMarket);
        }
Ejemplo n.º 18
0
        /// <summary>
        /// Finds all available markets that are within range that can be traded with.
        /// </summary>
        /// <param name="position"></param>
        /// <returns></returns>
        public static List <MarketStruct> FindMarketsFromLocation(Vector3D position)
        {
            var list = new List <MarketStruct>();

            foreach (var market in EconomyScript.Instance.Data.Markets)
            {
                if (!market.Open)
                {
                    continue;
                }

                switch (market.MarketZoneType)
                {
                case MarketZoneType.EntitySphere:
                    if (!EconomyScript.Instance.ServerConfig.EnablePlayerTradezones)
                    {
                        continue;
                    }
                    if (market.EntityId == 0 || !MyAPIGateway.Entities.EntityExists(market.EntityId))
                    {
                        continue;
                    }
                    IMyEntity entity;
                    if (!MyAPIGateway.Entities.TryGetEntityById(market.EntityId, out entity))
                    {
                        // Close the market, because the cube no longer exists.
                        market.Open = false;
                        continue;
                    }
                    if (entity.Closed || entity.MarkedForClose)
                    {
                        // Close the market, because the cube no longer exists.
                        market.Open = false;
                        continue;
                    }
                    IMyBeacon beacon = entity as IMyBeacon;
                    if (beacon == null)
                    {
                        continue;
                    }
                    if (!beacon.IsWorking)
                    {
                        continue;
                    }

                    // TODO: I'm not sure if these two commands will impact perfomance.

                    // player will be null if the player is not online.
                    // I'm not sure if there is a way to may a steamId to a playerId without them been online.
                    var player = MyAPIGateway.Players.FindPlayerBySteamId(market.MarketId);
                    if (player != null && beacon.GetUserRelationToOwner(player.IdentityId) != MyRelationsBetweenPlayerAndBlock.Owner)
                    {
                        // Close the market, because it's no longer owner by the player.
                        market.Open = false;
                        continue;
                    }

                    var sphere = new BoundingSphereD(entity.WorldMatrix.Translation, market.MarketZoneSphere.HasValue ? market.MarketZoneSphere.Value.Radius : 1);
                    if (sphere.Contains(position) == ContainmentType.Contains)
                    {
                        list.Add(market);
                    }
                    break;

                case MarketZoneType.FixedSphere:
                    if (!EconomyScript.Instance.ServerConfig.EnableNpcTradezones)
                    {
                        continue;
                    }
                    if (!market.MarketZoneSphere.HasValue)
                    {
                        continue;
                    }
                    if (market.MarketZoneSphere.Value.Contains(position) == ContainmentType.Contains)
                    {
                        list.Add(market);
                    }
                    break;

                case MarketZoneType.FixedBox:
                    if (!EconomyScript.Instance.ServerConfig.EnableNpcTradezones)
                    {
                        continue;
                    }
                    if (!market.MarketZoneBox.HasValue)
                    {
                        continue;
                    }
                    if (market.MarketZoneBox.Value.Contains(position) == ContainmentType.Contains)
                    {
                        list.Add(market);
                    }
                    break;
                }
            }
            return(list);
        }
        public override void UpdateBeforeSimulation100()
        {
            if (SetupDone == false)
            {
                SetupDone = true;
                IsServer  = MyAPIGateway.Multiplayer.IsServer;

                if (IsServer == false)
                {
                    NeedsUpdate = MyEntityUpdateEnum.NONE;
                    return;
                }

                Beacon = Entity as IMyBeacon;
                Beacon.IsWorkingChanged += OnWorkingChange;
            }

            if (Beacon == null)
            {
                NeedsUpdate = MyEntityUpdateEnum.NONE;
                return;
            }

            if (Settings.CustomBlocks.UseDisposableBeaconInactivity == true)
            {
                if (IsWorking == false)
                {
                    TicksSinceWorking += 100;
                }
                else
                {
                    TicksSinceWorking = 0;
                }

                if ((TicksSinceWorking / 60) / 60 >= Settings.CustomBlocks.DisposableBeaconRemovalTimerMinutes)
                {
                    Beacon.CubeGrid.RazeBlock(Beacon.SlimBlock.Min);
                    NeedsUpdate = MyEntityUpdateEnum.NONE;
                    return;
                }
            }

            if (Settings.CustomBlocks.UseDisposableBeaconPlayerDistance == true)
            {
                double closestDistance = -1;

                foreach (var player in MES_SessionCore.PlayerList)
                {
                    if (player.IsBot == true || player.Character == null)
                    {
                        continue;
                    }

                    if (player.Character.IsDead == true || player.Character.IsPlayer == false)
                    {
                        continue;
                    }

                    var thisDist = Vector3D.Distance(player.GetPosition(), Beacon.GetPosition());

                    if (thisDist < closestDistance || closestDistance == -1)
                    {
                        closestDistance = thisDist;
                    }
                }

                if (closestDistance >= Settings.CustomBlocks.DisposableBeaconPlayerDistanceTrigger)
                {
                    TicksSincePlayerNearby += 100;

                    if ((TicksSincePlayerNearby / 60) / 60 >= Settings.CustomBlocks.DisposableBeaconRemovalTimerMinutes)
                    {
                        Beacon.CubeGrid.RazeBlock(Beacon.SlimBlock.Min);
                        NeedsUpdate = MyEntityUpdateEnum.NONE;
                        return;
                    }
                }
                else
                {
                    TicksSincePlayerNearby = 0;
                }
            }
        }
Ejemplo n.º 20
0
 public CR_BeaconBlock(IMyBeacon beacon)
 {
     this.m_beacon = beacon;
 }
Ejemplo n.º 21
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);
        }
Ejemplo n.º 22
0
        public Drone(IMyEntity ent, BroadcastingTypes broadcasting)
        {
            var    ship = (IMyCubeGrid)ent;
            double maxEngagementRange = ConquestMod.MaxEngagementRange;

            broadcastingType = broadcasting;

            Ship = ship;
            var lstSlimBlock = new List <IMySlimBlock>();

            GridTerminalSystem = MyAPIGateway.TerminalActionsHelper.GetTerminalSystemForGrid(ship);

            //If it has any type of cockipt
            ship.GetBlocks(lstSlimBlock, (x) => x.FatBlock is IMyShipController);
            FindWeapons();
            SetupActions();



            //If no cockpit the ship is either no ship or is broken.
            if (lstSlimBlock.Count != 0)
            {
                //Make the controls be the cockpit
                ShipControls = lstSlimBlock[0].FatBlock as IMyControllableEntity;

                _ownerId = ((Sandbox.ModAPI.IMyTerminalBlock)ShipControls).OwnerId;


                #region Activate Beacons && Antennas


                //Maximise radius on antennas and beacons.
                lstSlimBlock.Clear();
                ship.GetBlocks(lstSlimBlock, (x) => x.FatBlock is IMyRadioAntenna);
                foreach (var block in lstSlimBlock)
                {
                    IMyRadioAntenna antenna =
                        (IMyRadioAntenna)block.FatBlock;
                    if (antenna != null)
                    {
                        //antenna.GetActionWithName("SetCustomName").Apply(antenna, new ListReader<TerminalActionParameter>(new List<TerminalActionParameter>() { TerminalActionParameter.Get("Combat Drone " + _manualGats.Count) }));
                        antenna.SetValueFloat("Radius", 10000);//antenna.GetMaximum<float>("Radius"));
                        _blockOn.Apply(antenna);
                    }
                }

                lstSlimBlock = new List <IMySlimBlock>();
                ship.GetBlocks(lstSlimBlock, (x) => x.FatBlock is IMyBeacon);
                foreach (var block in lstSlimBlock)
                {
                    IMyBeacon beacon = (IMyBeacon)block.FatBlock;
                    if (beacon != null)
                    {
                        beacon.SetValueFloat("Radius", 10000);//beacon.GetMaximum<float>("Radius"));
                        _blockOn.Apply(beacon);
                    }
                }

                #endregion

                //SetWeaponPower(true);
                //AmmoManager.ReloadReactors(_allReactors);
                //AmmoManager.ReloadGuns(_manualGats);
                ship.GetBlocks(lstSlimBlock, x => x is IMyEntity);

                List <IMyTerminalBlock> massBlocks =
                    new List <IMyTerminalBlock>();

                GridTerminalSystem.GetBlocksOfType <IMyVirtualMass>(massBlocks);

                List <IMyTerminalBlock> allTerminalBlocks = new List <IMyTerminalBlock>();
                GridTerminalSystem.GetBlocksOfType <IMyCubeBlock>(allTerminalBlocks);
                HealthBlockBase = allTerminalBlocks.Count;


                if (ShipControls != null)
                {
                    navigation = new DroneNavigation(ship, ShipControls, _nearbyFloatingObjects, maxEngagementRange);
                }
            }
            Ship.OnBlockAdded += RecalcMaxHp;
            myNumber           = numDrones;
            numDrones++;
        }
Ejemplo n.º 23
0
        /// <summary>
        /// Finds all available markets that are within range that can be traded with.
        /// This is onyl called from the Client side, so any configuration must be passed in.
        /// </summary>
        public static List <MarketStruct> ClientFindMarketsFromLocation(List <MarketStruct> markets, Vector3D position,
                                                                        bool enablePlayerTradezones, bool enableNpcTradezones)
        {
            var list = new List <MarketStruct>();

            foreach (var market in markets)
            {
                if (!market.Open)
                {
                    continue;
                }

                switch (market.MarketZoneType)
                {
                case MarketZoneType.EntitySphere:
                    if (!enablePlayerTradezones)
                    {
                        continue;
                    }
                    if (market.EntityId == 0 || !MyAPIGateway.Entities.EntityExists(market.EntityId))
                    {
                        continue;
                    }
                    IMyEntity entity;
                    if (!MyAPIGateway.Entities.TryGetEntityById(market.EntityId, out entity))
                    {
                        // Not in range of player, or no longer exists.
                        continue;
                    }
                    if (entity.Closed || entity.MarkedForClose)
                    {
                        // Not in range of player, or no longer exists.
                        continue;
                    }
                    IMyBeacon beacon = entity as IMyBeacon;
                    if (beacon == null)
                    {
                        continue;
                    }
                    if (!beacon.IsWorking)
                    {
                        continue;
                    }

                    var sphere = new BoundingSphereD(entity.WorldMatrix.Translation, market.MarketZoneSphere?.Radius ?? 1);
                    if (sphere.Contains(position) == ContainmentType.Contains)
                    {
                        list.Add(market);
                    }
                    break;

                case MarketZoneType.FixedSphere:
                    if (!enableNpcTradezones)
                    {
                        continue;
                    }
                    if (market.MarketZoneSphere == null)
                    {
                        continue;
                    }
                    if (((BoundingSphereD)market.MarketZoneSphere).Contains(position) == ContainmentType.Contains)
                    {
                        list.Add(market);
                    }
                    break;

                case MarketZoneType.FixedBox:
                    if (!enableNpcTradezones)
                    {
                        continue;
                    }
                    if (!market.MarketZoneBox.HasValue)
                    {
                        continue;
                    }
                    if (market.MarketZoneBox.Value.Contains(position) == ContainmentType.Contains)
                    {
                        list.Add(market);
                    }
                    break;
                }
            }

            return(list);
        }
Ejemplo n.º 24
0
        public override void ProcessServer()
        {
            // update our own timestamp here
            AccountManager.UpdateLastSeen(SenderSteamId, SenderLanguage);
            EconomyScript.Instance.ServerLogger.WriteVerbose("Manage Npc Market Request for from '{0}'", SenderSteamId);

            var player = MyAPIGateway.Players.FindPlayerBySteamId(SenderSteamId);

            if (player == null || !player.IsAdmin()) // hold on there, are we an admin first?
            {
                return;
            }

            switch (CommandType)
            {
            case NpcMarketManage.Add:
            {
                if (string.IsNullOrWhiteSpace(MarketName) || MarketName == "*")
                {
                    MessageClientTextMessage.SendMessage(SenderSteamId, "NPC ADD", "Invalid name supplied for the market name.");
                    return;
                }

                var checkMarket = EconomyScript.Instance.Data.Markets.FirstOrDefault(m => m.DisplayName.Equals(MarketName, StringComparison.InvariantCultureIgnoreCase));
                if (checkMarket != null)
                {
                    MessageClientTextMessage.SendMessage(SenderSteamId, "NPC ADD", "A market of name '{0}' already exists.", checkMarket.DisplayName);
                    return;
                }

                // TODO: market inside market check?

                if (EntityId != 0)
                {
                    EconDataManager.CreateNpcMarket(MarketName, EntityId, Size);
                }
                else
                {
                    EconDataManager.CreateNpcMarket(MarketName, X, Y, Z, Size, Shape);
                }

                MessageUpdateClient.SendServerTradeZones();
                MessageClientTextMessage.SendMessage(SenderSteamId, "NPC ADD", "A new market called '{0}' has been created.", MarketName);
            }
            break;

            case NpcMarketManage.Delete:
            {
                var market = EconomyScript.Instance.Data.Markets.FirstOrDefault(m => m.DisplayName.Equals(MarketName, StringComparison.InvariantCultureIgnoreCase));
                if (market == null)
                {
                    var markets = EconomyScript.Instance.Data.Markets.Where(m => m.DisplayName.IndexOf(MarketName, StringComparison.InvariantCultureIgnoreCase) >= 0).ToArray();
                    if (markets.Length == 0)
                    {
                        MessageClientTextMessage.SendMessage(SenderSteamId, "NPC DELETE", "The specified market name could not be found.");
                        return;
                    }
                    if (markets.Length > 1)
                    {
                        var str = new StringBuilder();
                        str.Append("The specified market name could not be found.\r\n    Which did you mean?\r\n");
                        foreach (var m in markets)
                        {
                            str.AppendLine(m.DisplayName);
                        }
                        MessageClientDialogMessage.SendMessage(SenderSteamId, "NPC DELETE", " ", str.ToString());
                        return;
                    }
                    market = markets[0];
                }

                EconomyScript.Instance.Data.Markets.Remove(market);
                MessageUpdateClient.SendServerTradeZones();
                MessageClientTextMessage.SendMessage(SenderSteamId, "NPC DELETE", "The market '{0}' has been removed and all inventory.", market.DisplayName);
            }
            break;

            case NpcMarketManage.List:
            {
                var str = new StringBuilder();
                foreach (var market in EconomyScript.Instance.Data.Markets)
                {
                    if (market.MarketId != EconomyConsts.NpcMerchantId)
                    {
                        continue;
                    }

                    str.AppendFormat("Market: {0}\r\n", market.DisplayName);
                    str.AppendFormat("{0}", market.MarketZoneType);
                    if (market.MarketZoneType == MarketZoneType.FixedSphere && market.MarketZoneSphere != null)
                    {
                        str.AppendFormat("  Center Position=X:{0:N} | Y:{1:N} | Z:{2:N}  Radius={3:N}m\r\n\r\n", market.MarketZoneSphere.Center.X, market.MarketZoneSphere.Center.Y, market.MarketZoneSphere.Center.Z, market.MarketZoneSphere.Radius);
                    }
                    else if (market.MarketZoneType == MarketZoneType.FixedBox && market.MarketZoneBox.HasValue)
                    {
                        str.AppendFormat("  Center Position=X:{0:N} | Y:{1:N} | Z:{2:N}  Size={3:N}m\r\n\r\n", market.MarketZoneBox.Value.Center.X, market.MarketZoneBox.Value.Center.Y, market.MarketZoneBox.Value.Center.Z, market.MarketZoneBox.Value.Size.X);
                    }
                    else if (market.MarketZoneType == MarketZoneType.EntitySphere && market.MarketZoneSphere != null)
                    {
                        bool      destroyed = false;
                        IMyEntity entity;
                        if (!MyAPIGateway.Entities.TryGetEntityById(market.EntityId, out entity))
                        {
                            destroyed = true;
                        }

                        if (entity != null && (entity.Closed || entity.MarkedForClose))
                        {
                            destroyed = true;
                        }

                        IMyBeacon beacon = entity as IMyBeacon;
                        if (beacon == null)
                        {
                            destroyed = true;
                        }

                        if (!destroyed)
                        {
                            str.AppendFormat("  Center Position=X:{0:N} | Y:{1:N} | Z:{2:N}  Radius={3:N}m\r\n\r\n", beacon.WorldMatrix.Translation.X, beacon.WorldMatrix.Translation.Y, beacon.WorldMatrix.Translation.Z, market.MarketZoneSphere.Radius);
                        }
                        else
                        {
                            str.AppendFormat("  Unteathered  Radius={0:N}m\r\n\r\n", market.MarketZoneSphere.Radius);
                        }
                    }
                    else
                    {
                        str.AppendLine("\r\n");
                    }
                }

                MessageClientDialogMessage.SendMessage(SenderSteamId, "NPC Market List", " ", str.ToString());
            }
            break;

            case NpcMarketManage.Rename:
            {
                var market = EconomyScript.Instance.Data.Markets.FirstOrDefault(m => m.DisplayName.Equals(OldMarketName, StringComparison.InvariantCultureIgnoreCase));
                if (market == null)
                {
                    var markets = EconomyScript.Instance.Data.Markets.Where(m => m.DisplayName.IndexOf(OldMarketName, StringComparison.InvariantCultureIgnoreCase) >= 0).ToArray();
                    if (markets.Length == 0)
                    {
                        MessageClientTextMessage.SendMessage(SenderSteamId, "NPC RENAME", "The specified market name could not be found.");
                        return;
                    }
                    if (markets.Length > 1)
                    {
                        var str = new StringBuilder();
                        str.Append("The specified market name could not be found.\r\n    Which did you mean?\r\n");
                        foreach (var m in markets)
                        {
                            str.AppendLine(m.DisplayName);
                        }
                        MessageClientDialogMessage.SendMessage(SenderSteamId, "NPC RENAME", " ", str.ToString());
                        return;
                    }
                    market = markets[0];
                }

                if (string.IsNullOrWhiteSpace(MarketName) || MarketName == "*")
                {
                    MessageClientTextMessage.SendMessage(SenderSteamId, "NPC RENAME", "Invalid name supplied for the market name.");
                    return;
                }

                var checkMarket = EconomyScript.Instance.Data.Markets.FirstOrDefault(m => m.DisplayName.Equals(MarketName, StringComparison.InvariantCultureIgnoreCase));
                if (checkMarket != null)
                {
                    MessageClientTextMessage.SendMessage(SenderSteamId, "NPC RENAME", "A market of name '{0}' already exists.", checkMarket.DisplayName);
                    return;
                }

                var oldName = market.DisplayName;
                market.DisplayName = MarketName;
                MessageUpdateClient.SendServerTradeZones();
                MessageClientTextMessage.SendMessage(SenderSteamId, "NPC RENAME", "The market '{0}' has been renamed to '{1}.", oldName, market.DisplayName);
            }
            break;

            case NpcMarketManage.Move:
            {
                var market = EconomyScript.Instance.Data.Markets.FirstOrDefault(m => m.DisplayName.Equals(MarketName, StringComparison.InvariantCultureIgnoreCase));
                if (market == null)
                {
                    var markets = EconomyScript.Instance.Data.Markets.Where(m => m.DisplayName.IndexOf(MarketName, StringComparison.InvariantCultureIgnoreCase) >= 0).ToArray();
                    if (markets.Length == 0)
                    {
                        MessageClientTextMessage.SendMessage(SenderSteamId, "NPC MOVE", "The specified market name could not be found.");
                        return;
                    }
                    if (markets.Length > 1)
                    {
                        var str = new StringBuilder();
                        str.Append("The specified market name could not be found.\r\n    Which did you mean?\r\n");
                        foreach (var m in markets)
                        {
                            str.AppendLine(m.DisplayName);
                        }
                        MessageClientDialogMessage.SendMessage(SenderSteamId, "NPC MOVE", " ", str.ToString());
                        return;
                    }
                    market = markets[0];
                }

                EconDataManager.SetMarketShape(market, X, Y, Z, Size, Shape);
                MessageUpdateClient.SendServerTradeZones();
                MessageClientTextMessage.SendMessage(SenderSteamId, "NPC MOVE", "The market '{0}' has been moved and resized.", market.DisplayName);
            }
            break;
            }
        }
Ejemplo n.º 25
0
 public static float GetDefaultRange(this IMyBeacon Antenna)
 {
     return(Antenna.CubeGrid.GridSizeEnum == MyCubeSize.Large ? 10000 : 5000);
 }
Ejemplo n.º 26
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);
        }
Ejemplo n.º 27
0
 public override void Close()
 {
     timer_block = null;
 }