Advertisement
NickNDS

Attack Ship 3

Aug 2nd, 2019
242
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 8.54 KB | None | 0 0
  1. public string receiveTag = "controlcoordinate", settingBackup = "",
  2. scriptName = "NDS Attack Station", missileKeyword = "missile";
  3.  
  4. public IMyBroadcastListener coordinateListener;
  5.  
  6. public List<Vector3D> receivedCoordinates = new List<Vector3D>(), unlaunchedCoordinates = new List<Vector3D>();
  7.  
  8. public SortedList<long, MissileControlUnit> missileControlUnits = new SortedList<long, MissileControlUnit>();
  9.  
  10. public double settingsVersion = 1.0, missileBuildTime = 5;
  11.  
  12. public int primedMissiles = 0;
  13.  
  14. public bool resave = false, foundName = false, foundVersion = false;
  15.  
  16. public Program()
  17. {
  18.     Runtime.UpdateFrequency = UpdateFrequency.Update10;
  19.     if (Me.CustomData != "") LoadData();
  20.     else {
  21.         SaveData();
  22.         SetListeners();
  23.     }
  24.     GetMissileControlUnits();
  25.     Save();
  26. }
  27.  
  28. public void Save()
  29. {
  30.  
  31. }
  32.  
  33. public void Main(string argument, UpdateType updateSource)
  34. {
  35.     if (Me.CustomData != settingBackup) LoadData();
  36.     AgeMissiles();
  37.     if (argument != "")
  38.     {
  39.         Vector3D targetVector = new Vector3D(0, 0, 0);
  40.         if (Convert(argument, ref targetVector))
  41.             TargetCoordinate(targetVector);
  42.         else Echo("Error targeting: " + argument);
  43.     }
  44.     if (coordinateListener.HasPendingMessage)
  45.     {
  46.         MyIGCMessage message = coordinateListener.AcceptMessage();
  47.         Vector3D coordinate = (Vector3D)(message.Data);
  48.         Echo("Coordinate received at: " + coordinate.ToString("N0"));
  49.         if (!receivedCoordinates.Contains(coordinate)) receivedCoordinates.Add(coordinate);
  50.         TargetCoordinate(coordinate);
  51.     }
  52.     if (unlaunchedCoordinates.Count > 0) TargetCoordinate(unlaunchedCoordinates[0]);
  53.     Echo("Missile Control Units: " + missileControlUnits.Count);
  54.     Echo("Primed Missile Control Units: " + primedMissiles);
  55.     Echo("Unlaunched Coordinates: " + unlaunchedCoordinates.Count);
  56.     Output();
  57.     Save();
  58. }
  59.  
  60. public bool Convert(string argument, ref Vector3D targetVector)
  61. {
  62.     string arg = argument.Substring(argument.IndexOf(":") + 1);
  63.     arg = arg.Substring(arg.IndexOf(":") + 1);
  64.     try
  65.     {
  66.         targetVector.X = double.Parse(arg.Substring(0, arg.IndexOf(":")));
  67.     } catch { return false; }
  68.     arg = arg.Substring(arg.IndexOf(":") + 1);
  69.     try
  70.     {
  71.         targetVector.Y = double.Parse(arg.Substring(0, arg.IndexOf(":")));
  72.     } catch { return false; }
  73.     arg = arg.Substring(arg.IndexOf(":") + 1);
  74.     try
  75.     {
  76.         targetVector.Z = double.Parse(arg.Substring(0, arg.IndexOf(":")));
  77.     } catch { return false; }
  78.     Echo("Targeting: " + targetVector.ToString());
  79.     return true;
  80. }
  81.  
  82. public void AgeMissiles()
  83. {
  84.     primedMissiles = 0;
  85.     TimeSpan timeSinceLastRun = Runtime.TimeSinceLastRun;
  86.     for (int i = 0; i < missileControlUnits.Values.Count; i++)
  87.         AdvanceTimeSpan(ref missileControlUnits.Values[i].knownSpan, timeSinceLastRun);
  88. }
  89.  
  90. public void AdvanceTimeSpan(ref TimeSpan timespan, TimeSpan timeSinceLastRun)
  91. {
  92.     if (timespan.TotalSeconds < missileBuildTime)
  93.         timespan += timeSinceLastRun;
  94.     else primedMissiles++;
  95. }
  96.  
  97. public void TargetCoordinate(Vector3D coordinate)
  98. {
  99.     GetMissileControlUnits();
  100.     bool launched = false;
  101.     if (missileControlUnits.Count > 0)
  102.     {
  103.         IMyProgrammableBlock missileControlUnit = Me;
  104.         long entityId = -12345654321;
  105.         for (int i = 0; i < missileControlUnits.Values.Count; i += 0)
  106.         {
  107.             if (!missileControlUnits.Values[i].missileControlUnit.CubeGrid.CubeExists(missileControlUnits.Values[i].missileControlUnit.Position))
  108.                 missileControlUnits.RemoveAt(i);
  109.             else {
  110.                 if (missileControlUnits.Values[i].knownSpan.TotalSeconds >= missileBuildTime)
  111.                 {
  112.                     missileControlUnit = missileControlUnits.Values[i].missileControlUnit;
  113.                     entityId = missileControlUnit.EntityId;
  114.                     break;
  115.                 }
  116.                 i++;
  117.             }
  118.         }
  119.         if (entityId != -12345654321 && missileControlUnit != Me)
  120.         {
  121.             if (!missileControlUnit.IsRunning && missileControlUnit.TryRun(Convert(coordinate)))
  122.             {
  123.                 launched = true;
  124.                 missileControlUnits.RemoveAt(0);
  125.                 if (unlaunchedCoordinates.Count > 0 && unlaunchedCoordinates[0] == coordinate) unlaunchedCoordinates.RemoveAt(0);
  126.             }
  127.         }
  128.     }
  129.     if (!launched && !unlaunchedCoordinates.Contains(coordinate)) unlaunchedCoordinates.Add(coordinate);
  130. }
  131.  
  132. public string Convert(Vector3D coordinate)
  133. {
  134.     return "GPS:Target:" + coordinate.X + ":" + coordinate.Y + ":" + coordinate.Z + ":";
  135. }
  136.  
  137. public void GetMissileControlUnits()
  138. {
  139.     List<IMyTerminalBlock> blocks = new List<IMyTerminalBlock>();
  140.     GridTerminalSystem.GetBlocksOfType<IMyProgrammableBlock>(blocks, m => ((IMyFunctionalBlock)m).Enabled && m.CustomName.ToLower().Contains(missileKeyword.ToLower()) && m != Me && UsableUnit(m));
  141. }
  142.  
  143. public bool UsableUnit(IMyTerminalBlock block)
  144. {
  145.     if (!missileControlUnits.ContainsKey(block.EntityId))
  146.     {
  147.         MissileControlUnit unit = new MissileControlUnit();
  148.         unit.missileControlUnit = (IMyProgrammableBlock)block;
  149.         missileControlUnits[block.EntityId] = unit;
  150.     }
  151.     return false;
  152. }
  153.  
  154. public void Output()
  155. {
  156.     StringBuilder builder = new StringBuilder();
  157.     for (int i = 0; i < receivedCoordinates.Count; i++)
  158.     {
  159.         builder.AppendLine(receivedCoordinates[i].ToString("N0"));
  160.     }
  161.     List<IMyTerminalBlock> blocks = new List<IMyTerminalBlock>();
  162.     GridTerminalSystem.GetBlocksOfType<IMyTextPanel>(blocks, b => b.CustomName.ToLower().Contains("coordinate"));
  163.     for (int i = 0; i < blocks.Count; i++)
  164.     {
  165.         IMyTextSurface surface = (IMyTextSurface)blocks[i];
  166.         surface.ContentType = VRage.Game.GUI.TextPanel.ContentType.TEXT_AND_IMAGE;
  167.         surface.WriteText(builder);
  168.     }
  169. }
  170.  
  171. public void SetListeners()
  172. {
  173.     List<IMyBroadcastListener> listeners = new List<IMyBroadcastListener>();
  174.     IGC.GetBroadcastListeners(listeners);
  175.     for (int i = 0; i < listeners.Count; i++)
  176.         IGC.DisableBroadcastListener(listeners[i]);
  177.     coordinateListener = IGC.RegisterBroadcastListener(receiveTag);
  178.     Echo("Listening on tag: " + receiveTag);
  179. }
  180.  
  181. public void SaveData()
  182. {
  183.     StringBuilder builder = new StringBuilder();
  184.    
  185.     builder.AppendLine("receiveTag=" + receiveTag + ";");
  186.     builder.AppendLine("missileKeyword=" + missileKeyword + ";");
  187.     builder.AppendLine("missileBuildTime=" + missileBuildTime.ToString() + ";");
  188.     builder.AppendLine("scriptName=" + scriptName + ";");
  189.     builder.AppendLine("settingsVersion=" + settingsVersion.ToString("N2") + ";");
  190.    
  191.     Me.CustomData = builder.ToString().TrimEnd();
  192.    
  193.     foundVersion = false;
  194.     foundName = false;
  195.     resave = false;
  196.     Storage = Me.CustomData;
  197.     settingBackup = Me.CustomData;
  198. }
  199.  
  200. public void LoadData()
  201. {
  202.     if (Me.CustomData == "" && Storage != "") Me.CustomData = Storage;
  203.    
  204.     string temp = Me.CustomData.Replace("\r\n", String.Empty).Replace("\n", String.Empty).Replace("\r", String.Empty).Replace("\t", String.Empty);
  205.    
  206.     string[] settingArray = temp.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
  207.    
  208.     for (int i = 0; i < settingArray.Length; i++)
  209.         ProcessSetting(settingArray[i]);
  210.  
  211.     SetListeners();
  212.     if (resave || !foundVersion || !foundName) SaveData();
  213.     else settingBackup = Me.CustomData;
  214. }
  215.  
  216. public void ProcessSetting(string settingString)
  217. {
  218.     string settingKey = settingString.Substring(0, settingString.IndexOf("=")), settingValue = settingString.Substring(settingString.IndexOf("=") + 1);
  219.    
  220.     bool settingBool = settingValue.ToLower() == "true";
  221.    
  222.     double settingDouble = 0.0;
  223.     try { settingDouble = double.Parse(settingValue); } catch { }
  224.    
  225.     switch (settingKey)
  226.     {
  227.         case "receiveTag":
  228.             receiveTag = settingValue;
  229.         break;
  230.         case "missileKeyword":
  231.             missileKeyword = settingValue;
  232.         break;
  233.         case "missileBuildTime":
  234.             missileBuildTime = settingDouble;
  235.         break;
  236.         case "scriptName":
  237.             foundName = true;
  238.             if (settingValue != scriptName) resave = true;
  239.         break;
  240.         case "settingsVersion":
  241.             foundVersion = true;
  242.             if (settingDouble != settingsVersion) resave = true;
  243.         break;
  244.     }
  245. }
  246.  
  247. public class MissileControlUnit
  248. {
  249.     public TimeSpan knownSpan = new TimeSpan(0, 0, 0);
  250.     public IMyProgrammableBlock missileControlUnit;
  251. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement