/// <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); }
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); }
void GetParts() { Inventories.Clear(); HydrogenTanks.Clear(); Batteries.Clear(); Beacon = null; Context.Terminal.GetBlocksOfType <IMyTerminalBlock>(null, CollectParts); }
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; }
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 }; }
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); }
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; }
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; }
/** * 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; } }
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); }
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(); }
//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); } }
/// <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); }
/// <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; } } }
public CR_BeaconBlock(IMyBeacon beacon) { this.m_beacon = beacon; }
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 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++; }
/// <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); }
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; } }
public static float GetDefaultRange(this IMyBeacon Antenna) { return(Antenna.CubeGrid.GridSizeEnum == MyCubeSize.Large ? 10000 : 5000); }
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); }
public override void Close() { timer_block = null; }