Advertisement
NickNDS

Laser Antennae Pointer

Nov 18th, 2019
1,107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.18 KB | None | 0 0
  1. public string antennaeKeyword = "laser"; // Keyword to specify which laser antennae are used
  2.  
  3. public bool
  4. setRangeIfNotInfinite = true, // Set range on laser antennae if they're not set to infinite
  5. preferIdle = true; // Prefer to use idle antennae
  6.  
  7. public double rangeMultiplier = 1.1; // Multiply range by this number when setting range (1000 * 1.1 = 1100)
  8.  
  9. //
  10. // ---------- END OF USER SETTINGS ----------
  11. //
  12.  
  13. public List<IMyLaserAntenna> antennae = new List<IMyLaserAntenna>();
  14.  
  15. public Program()
  16. {
  17.     Scan();
  18.     Echo("Known Laser Antennae: " + antennae.Count);
  19. }
  20.  
  21. public void Save() {}
  22.  
  23. public void Main(string arg, UpdateType updateSource)
  24. {
  25.     if (arg != "") Commands(arg);
  26.     Echo("Known Laser Antennae: " + antennae.Count);
  27. }
  28.  
  29. public void Commands(string argument)
  30. {
  31.     string arg = argument.ToLower();
  32.     if (arg == "scan" || arg == "rescan" || arg == "find" || arg == "look") Scan();
  33.     else if (arg.StartsWith("gps:") && arg.EndsWith(":"))
  34.     {
  35.         if (antennae.Count > 0) SetTarget(argument);
  36.         else Echo("No antennae found");
  37.     }
  38. }
  39.  
  40. public void SetTarget(string argument)
  41. {
  42.     try {
  43.         string subArg = argument.Substring(argument.IndexOf(":") + 1), name = "", X = "", Y = "", Z = "";
  44.         string[] argArray = subArg.Split(':');
  45.         name = argArray[0];
  46.         X = argArray[1];
  47.         Y = argArray[2];
  48.         Z = argArray[3];
  49.         Vector3D targetVector = new Vector3D(double.Parse(X), double.Parse(Y), double.Parse(Z));
  50.         int closestIndex = 0, closestIdleIndex = -1;
  51.         double closestDistance = Vector3D.Distance(targetVector, antennae[0].GetPosition()), closestIdleDistance = double.MaxValue, nextDistance = 0;
  52.         if (preferIdle && antennae[0].Status == MyLaserAntennaStatus.Idle)
  53.         {
  54.             closestIdleIndex = 0;
  55.             closestIdleDistance = closestDistance;
  56.         }
  57.         for (int i = 1; i < antennae.Count; i++)
  58.         {
  59.             nextDistance = Vector3D.Distance(targetVector, antennae[i].GetPosition());
  60.             if (nextDistance < closestDistance)
  61.             {
  62.                 closestDistance = nextDistance;
  63.                 closestIndex = i;
  64.             }
  65.             if (preferIdle && nextDistance < closestIdleDistance && antennae[i].Status == MyLaserAntennaStatus.Idle)
  66.             {
  67.                 closestIdleDistance = nextDistance;
  68.                 closestIdleIndex = i;
  69.             }
  70.         }
  71.         if (preferIdle && closestIdleIndex != -1) closestIndex = closestIdleIndex;
  72.         if (setRangeIfNotInfinite && antennae[closestIndex].Range < 100000000f) antennae[closestIndex].Range = (float)(closestDistance * rangeMultiplier);
  73.         antennae[closestIndex].SetTargetCoords(argument);
  74.         antennae[closestIndex].Connect();
  75.         Echo("Setting Target For: " + name + " At: (" + X + ", " + Y + ", " + Z + ")");
  76.     } catch { Echo("Error setting target to: " + argument); }
  77. }
  78.  
  79. public void Scan()
  80. {
  81.     GridTerminalSystem.GetBlocksOfType<IMyLaserAntenna>(antennae, a => a.IsWorking && a.CustomName.ToLower().Contains(antennaeKeyword.ToLower()));
  82.     if (antennae.Count == 0) GridTerminalSystem.GetBlocksOfType<IMyLaserAntenna>(antennae, a => a.IsWorking);
  83. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement