/Questor.Modules/Arm.cs

https://github.com/dreadguristas/Questor · C# · 325 lines · 249 code · 51 blank · 25 comment · 69 complexity · 90003dc26a03a98ff58ebadc3a2c7c2a MD5 · raw file

  1. // ------------------------------------------------------------------------------
  2. // <copyright from='2010' to='2015' company='THEHACKERWITHIN.COM'>
  3. // Copyright (c) TheHackerWithin.COM. All Rights Reserved.
  4. //
  5. // Please look in the accompanying license.htm file for the license that
  6. // applies to this source code. (a copy can also be found at:
  7. // http://www.thehackerwithin.com/license.htm)
  8. // </copyright>
  9. // -------------------------------------------------------------------------------
  10. namespace Questor.Modules
  11. {
  12. using System;
  13. using System.Collections.Generic;
  14. using System.Linq;
  15. using DirectEve;
  16. public class Arm
  17. {
  18. private DateTime _lastAction;
  19. private bool _missionItemMoved;
  20. public Arm()
  21. {
  22. AmmoToLoad = new List<Ammo>();
  23. }
  24. // Bleh, dont want this here :(
  25. public long AgentId { get; set; }
  26. public ArmState State { get; set; }
  27. public List<Ammo> AmmoToLoad { get; private set; }
  28. public void ProcessState()
  29. {
  30. var cargo = Cache.Instance.DirectEve.GetShipsCargo();
  31. var droneBay = Cache.Instance.DirectEve.GetShipsDroneBay();
  32. var itemHangar = Cache.Instance.DirectEve.GetItemHangar();
  33. var shipHangar = Cache.Instance.DirectEve.GetShipHangar();
  34. DirectContainer corpHangar = null;
  35. if (!string.IsNullOrEmpty(Settings.Instance.AmmoHangar))
  36. corpHangar = Cache.Instance.DirectEve.GetCorporationHangar(Settings.Instance.AmmoHangar);
  37. // Select the correct ammo hangar
  38. var ammoHangar = corpHangar ?? itemHangar;
  39. switch (State)
  40. {
  41. case ArmState.Idle:
  42. case ArmState.Done:
  43. break;
  44. case ArmState.Begin:
  45. State = ArmState.OpenShipHangar;
  46. break;
  47. case ArmState.OpenShipHangar:
  48. case ArmState.SwitchToSalvageShip:
  49. // Is the ship hangar open?
  50. if (shipHangar.Window == null)
  51. {
  52. // No, command it to open
  53. Cache.Instance.DirectEve.ExecuteCommand(DirectCmd.OpenShipHangar);
  54. break;
  55. }
  56. if (!shipHangar.IsReady)
  57. break;
  58. if (State == ArmState.OpenShipHangar)
  59. {
  60. Logging.Log("Arm: Activating combat ship");
  61. State = ArmState.ActivateCombatShip;
  62. }
  63. else
  64. {
  65. Logging.Log("Arm: Activating salvage ship");
  66. State = ArmState.ActivateSalvageShip;
  67. }
  68. break;
  69. case ArmState.ActivateCombatShip:
  70. case ArmState.ActivateSalvageShip:
  71. var shipName = State == ArmState.ActivateCombatShip
  72. ? Settings.Instance.CombatShipName
  73. : Settings.Instance.SalvageShipName;
  74. if (!string.IsNullOrEmpty(shipName) && Cache.Instance.DirectEve.ActiveShip.GivenName != shipName)
  75. {
  76. if (DateTime.Now.Subtract(_lastAction).TotalSeconds > 15)
  77. {
  78. var ships = Cache.Instance.DirectEve.GetShipHangar().Items;
  79. foreach (var ship in ships.Where(ship => ship.GivenName == shipName))
  80. {
  81. Logging.Log("Arm: Making [" + ship.GivenName + "] active");
  82. ship.ActivateShip();
  83. _lastAction = DateTime.Now;
  84. return;
  85. }
  86. State = ArmState.NotEnoughAmmo;
  87. Logging.Log("Arm: Found the following ships:");
  88. foreach (var ship in ships)
  89. Logging.Log("Arm: [" + ship.GivenName + "]");
  90. Logging.Log("Arm: Could not find [" + shipName + "] ship!");
  91. return;
  92. }
  93. return;
  94. }
  95. if (State == ArmState.ActivateSalvageShip)
  96. {
  97. Logging.Log("Arm: Done");
  98. State = ArmState.Done;
  99. return;
  100. }
  101. _missionItemMoved = false;
  102. Cache.Instance.RefreshMissionItems(AgentId);
  103. if (AmmoToLoad.Count == 0 && string.IsNullOrEmpty(Cache.Instance.BringMissionItem))
  104. {
  105. Logging.Log("Arm: Done");
  106. State = ArmState.Done;
  107. }
  108. else
  109. {
  110. Logging.Log("Arm: Opening item hangar");
  111. State = ArmState.OpenItemHangar;
  112. }
  113. break;
  114. case ArmState.OpenItemHangar:
  115. // Is the hangar open?
  116. if (itemHangar.Window == null)
  117. {
  118. // No, command it to open
  119. Cache.Instance.DirectEve.ExecuteCommand(DirectCmd.OpenHangarFloor);
  120. break;
  121. }
  122. if (!itemHangar.IsReady)
  123. break;
  124. if (corpHangar != null)
  125. {
  126. Logging.Log("Arm: Opening corporation hangar");
  127. State = ArmState.OpenCorpHangar;
  128. }
  129. else
  130. {
  131. Logging.Log("Arm: Opening ship's cargo");
  132. State = ArmState.OpenCargo;
  133. }
  134. break;
  135. case ArmState.OpenCorpHangar:
  136. // Is the hangar open?
  137. if (corpHangar != null)
  138. {
  139. if (corpHangar.Window == null)
  140. {
  141. // No, command it to open
  142. Cache.Instance.DirectEve.OpenCorporationHangar();
  143. break;
  144. }
  145. if (!corpHangar.IsReady)
  146. break;
  147. }
  148. Logging.Log("Arm: Opening ship's cargo");
  149. State = ArmState.OpenCargo;
  150. break;
  151. case ArmState.OpenCargo:
  152. // Is cargo open?
  153. if (cargo.Window == null)
  154. {
  155. // No, command it to open
  156. Cache.Instance.DirectEve.ExecuteCommand(DirectCmd.OpenCargoHoldOfActiveShip);
  157. break;
  158. }
  159. if (!cargo.IsReady)
  160. break;
  161. if (Settings.Instance.UseDrones && Settings.Instance.DroneTypeId > 0)
  162. {
  163. Logging.Log("Arm: Opening ship's drone bay");
  164. State = ArmState.OpenDroneBay;
  165. }
  166. else
  167. {
  168. Logging.Log("Arm: Moving items");
  169. State = ArmState.MoveItems;
  170. }
  171. break;
  172. case ArmState.OpenDroneBay:
  173. // Is cargo open?
  174. if (droneBay.Window == null)
  175. {
  176. // No, command it to open
  177. Cache.Instance.DirectEve.ExecuteCommand(DirectCmd.OpenDroneBayOfActiveShip);
  178. break;
  179. }
  180. if (!droneBay.IsReady)
  181. break;
  182. Logging.Log("Arm: Moving drones");
  183. State = ArmState.MoveDrones;
  184. break;
  185. case ArmState.MoveDrones:
  186. var drone = ammoHangar.Items.FirstOrDefault(i => i.TypeId == Settings.Instance.DroneTypeId);
  187. if (drone == null || drone.Stacksize < 1)
  188. {
  189. Logging.Log("Arm: Out of drones");
  190. State = ArmState.NotEnoughAmmo;
  191. break;
  192. }
  193. var neededDrones = Math.Floor((droneBay.Capacity - droneBay.UsedCapacity)/drone.Volume);
  194. if (neededDrones == 0)
  195. {
  196. Logging.Log("Arm: Moving items");
  197. State = ArmState.MoveItems;
  198. break;
  199. }
  200. // Move needed drones
  201. droneBay.Add(drone, (int)Math.Min(neededDrones, drone.Stacksize));
  202. break;
  203. case ArmState.MoveItems:
  204. var bringItem = Cache.Instance.BringMissionItem;
  205. if (string.IsNullOrEmpty(bringItem))
  206. _missionItemMoved = true;
  207. if (!_missionItemMoved)
  208. {
  209. var missionItem = (corpHangar ?? itemHangar).Items.FirstOrDefault(i => (i.TypeName ?? string.Empty).ToLower() == bringItem);
  210. if (missionItem == null)
  211. missionItem = itemHangar.Items.FirstOrDefault(i => (i.TypeName ?? string.Empty).ToLower() == bringItem);
  212. if (missionItem != null)
  213. {
  214. Logging.Log("Arm: Moving [" + missionItem.TypeName + "]");
  215. cargo.Add(missionItem, 1);
  216. _missionItemMoved = true;
  217. break;
  218. }
  219. }
  220. var itemMoved = false;
  221. foreach (var item in ammoHangar.Items.OrderBy(i => i.Quantity))
  222. {
  223. if (item.ItemId <= 0)
  224. continue;
  225. var ammo = AmmoToLoad.FirstOrDefault(a => a.TypeId == item.TypeId);
  226. if (ammo == null)
  227. continue;
  228. Logging.Log("Arm: Moving [" + item.TypeName + "]");
  229. var moveQuantity = Math.Min(item.Quantity, ammo.Quantity);
  230. moveQuantity = Math.Max(moveQuantity, 1);
  231. cargo.Add(item, moveQuantity);
  232. ammo.Quantity -= moveQuantity;
  233. if (ammo.Quantity <= 0)
  234. AmmoToLoad.RemoveAll(a => a.TypeId == item.TypeId);
  235. itemMoved = true;
  236. break;
  237. }
  238. if (AmmoToLoad.Count == 0 && _missionItemMoved)
  239. {
  240. _lastAction = DateTime.Now;
  241. Logging.Log("Arm: Waiting for items");
  242. State = ArmState.WaitForItems;
  243. }
  244. else if (!itemMoved)
  245. {
  246. if (AmmoToLoad.Count > 0)
  247. foreach (var ammo in AmmoToLoad)
  248. Logging.Log("Arm: Missing ammo with TypeId [" + ammo.TypeId + "]");
  249. if (!_missionItemMoved)
  250. Logging.Log("Arm: Missing mission item [" + bringItem + "]");
  251. State = ArmState.NotEnoughAmmo;
  252. }
  253. break;
  254. case ArmState.WaitForItems:
  255. // Wait 5 seconds after moving
  256. if (DateTime.Now.Subtract(_lastAction).TotalSeconds < 5)
  257. break;
  258. if (cargo.Items.Count == 0)
  259. break;
  260. if (Cache.Instance.DirectEve.GetLockedItems().Count == 0)
  261. {
  262. // Close the drone bay, its not required in space.
  263. if (droneBay.IsReady)
  264. droneBay.Window.Close();
  265. Logging.Log("Arm: Done");
  266. State = ArmState.Done;
  267. break;
  268. }
  269. // Note, there's no unlock here as we *always* want our ammo!
  270. break;
  271. }
  272. }
  273. }
  274. }