Factory "Good Hope Base" (under construction) / Die Entstehungsgeschichte...

    • Tagebuch

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • Factory "Good Hope Base" (under construction) / Die Entstehungsgeschichte...

      Jeder Space Engineer braucht es, einen Ort an dem die Ideen verwirklicht und Visionen wahr werden können.

      Der Grundstein ist gelegt und folgende Überlegungen prägten die Auslegung des Konzepts:

      Wieviel ist nötig?
      Ich entschied mich dafür, die Kapazität für Erzverarbeitung und Fertigung im "Doppelpack" auszulegen.
      Also zwei Lichtbogenöfen, zwei Raffinerien mit jeweils zwei Produktivitäts- und Effiziensmodulen,
      zwei Assembler ebenfalls mit zwei Produktivitätsmodulen.
      Frei nach dem Motto: "Nimm zwei!"

      Die Lichtbogenöfen können bei Bedarf vorab Eisen, Nickel und Kobalt "wegarbeiten",
      so bleibt mehr Kapazität für die Raffinerien...
      Wenn nötig wird die Modulausstattung der Raffinerien später noch etwas angepasst.
      Die zwei Assembler können mit den insgesamt vier Produktivitätsmodulen und im Coop-Modus
      instant fast alles schneller herkloppen als ich es je wegarbeiten könnte.
      Was wiederum einen reibungslosen Materialfluss voraussetzt und zum nächsten Punkt führt.

      Das Conveyor-System / Der Materialtransport - keep it simple...
      Eigentlich will ich die Sache möglichst einfach halten.
      Eindeutiger Materialfluss / Eingabe auf der einen Seite, Ausgabe auf der anderen Seite,
      alle weiteren Förderleitungen führen direkt zu den jeweiligen Systemen. (Life-Support, Abwehrsystem etc.)
      Hier mal eine Ansicht, wo man das Wesentliche erkennen kann:



      Rechts oben der Wareneingang, Sortierer oberhalb des Containers (nicht sichtbar) lagert jegliches antransportierte Material erstmal ein.
      Raffinerien und Lichtbogenöfen können sich das Material nehmen, der Sortierer am Zugang verhindert ein zurückschieben des Materials.
      Links oberhalb der Raffinerien ist der zweifache Warenausgang, Sortierer verhindern auch hier das Einlagern von Erz in den Connectoren.
      Ebenso sind auch Uranbrennstäbe gesperrt, damit zum Aufladen angedockte Fahrzeuge mit Reaktoren sich da nichts "klauen" können.
      Der Sortierer am Ausgang der Assembler dient eigentlich nur dazu, bei Bedarf das gesamte Material aus der Maschinerie abzuziehen
      und nach rechts unten einzulagern, ansonsten wäre er überflüssig.
      Die Lichtbogenöfen und der Reaktor sind unterhalb der Raffinerien angeschlossen
      und haben eine direkte Verbindung zum unteren Einlagerungscontainer. (welche aber eigentlich nichtnötig wäre)
      Das Life-Support bedient sich direkt vom oberen Eingangscontainer. Es ist geplant, den Air Vent für die Luftschleuse
      direkt unter der Medi-Bay anzuschliessen.


      In der Ansicht ist die Rücklaufleitung vom unteren zum oberen Container sichtbar,
      damit später auch oben vom Warenausgang auf das eingelagerte Material zugegriffen werden kann,
      ausserdem kann die Maschinerie bei Überlauf in den oberen Container auslagern.

      Ach ja, der gelbe Container da ist ein Überbleibsel mit allerlei Sammelsurium, kommt bei Gelegenheit mal weg.
      Und die Leitung da unten rechts führt zum "nördlichen" Geschützturm... ^^


      Mir fällt auf, dass Ganze liest sich komplizierter, als es in Wirklichkeit ist. :rolleyes:

      Fortsetzung folgt...

      Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von JumpinJack ()

    • Bergmannstätigkeiten / Magnet-Boots können so verdammt praktisch sein...

      ...vor allem bei der Herstellung nahezu perfekter, wie mit dem Lineal gezogener und am Grid ausgerichteter Tunnelbohrungen.
      Zugegeben, es war vorher auch schon machbar, aber es erleichtert die Sache doch enorm - vor allem in der Schwerelosigkeit.

      Vorgehensweise:

      Ausgehend von der Basis legt man unter sich einen "Laufsteg" an dem sich die Magnetboots heften können.
      Schaltet man das Jetpack ein während die Boots haften, ist man schonmal perfekt zur Ebene der Basis ausgerichtet.
      Die Richtung des "Laufstegs" (links/rechts) ist aber noch zu ungenau für eine wirklich perfekte Tunnelbohrung,
      daher wird ein GPS-Zielpunkt am geplanten Ausgang benötigt, welcher noch ermittelt werden muss.

      Dazu erstmal einen "Hilfs"-GPS-Punkt am Tunnelanfang setzen - praktischerweise steht man da gerade ^^
      Danach sich optisch auf dem bisher gelegten Laufsteg ausrichten
      (möglichst gewissenhaft, ist ja noch ungenau) - Jetpack ein (Ebenenausrichtung) und mit aktivierten Bohrer im Waffenmodus
      vorsichtig max. zwei, drei Blöcke tief ins Gestein arbeiten, danach Laufsteg verlängern.
      Diese Prozedur wiederholen, bis die ersten 50 Meter des Tunnels geschafft sind.
      Nun kann der zweite "Hilfs"-GPS-Punkt am Ende des bisherigen Tunnels gesetzt werden.

      Jetzt nur noch mit den Jetpack von aussen an dem voraussichtlichen Tunnelausgang manövrieren,
      bis die zwei Hilfspunkte im HUD exakt übereinander liegen. Genau hier muss der Tunnelausgang hin - GPS-Zielpunkt setzen,
      Die Hilfspunkte werden natürlich nicht mehr benötigt.
      Nun können längere Tunnelabschnitte mit Hilfe des GPS-Zielpunktes gebohrt werden, bis das Ziel erreicht ist.

      Das Ergebnis kann sich (meiner Meinung nach) sehen lassen:

      Der Tunnelausgang:


      Die ersten hundert(?) Meter:


      Kommt da auch mal ein Ende (?) (ach, das bischen Eisenerz lass ich einfach mal):


      Na endlich, der "Keller" der Basis in Sicht:


      Fragt mich nicht, wieviel (Kilo)Meter an Tunnelbohrungen ich für mein Verteidigungssystem hinter mir habe.
      Inzwischen ragen aus allen vier Himmelsrichtungen gepanzerte Geschütztürme aus dem Asteroiden,
      zwei Tunnelverläufe musste ich mehrfach um 90° knicken, um an gewünschter Stelle rauszukommen...

      Jedenfalls war 'ne Menge zu tun, bis die Förderleitung endlich soweit fertig war.
      Glücklicherweise war genug Platz für die Montage - wenn auch nicht gerade viel:


      So, und die Dinger sind nun versorgt, sofern genug Muni da ist:

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von JumpinJack ()

    • Sooo... Zeit für ein kleines Update.



      Jetzt wo die Luftschleuse steht, die Aussenverglasung angebracht und die Fabrik mit atembare Luft geflutet ist,
      hatte ich endlich die Zeit, mich ein wenig um ein paar Details zu kümmern.

      Dazu gehören vor allem Status- und Steuerdisplays für den gewissen Überblick diverser Dinge:



      So sieht das schon eher nach meinem Geschmack aus...

      Das nötige Script dafür hat mich wieder einmal 'nen Tag gekostet,
      obwohl der Teil für die Power-Statusanzeige ja schon vor einiger Zeit "erarbeitet" worden war.
      Eine Leuchte in Sachen Programmierung werd' ich wohl nie werden,
      bin ja schon froh, wenn's irgendwie funktioniert. :/

      Hier das zusammengewurschtelte Script das im Programable Block werkelt.
      Wenn's wem (wider erwarten) nützt soll es mir recht sein, Nutzung auf eigene Verantwortung.
      Tut bei mir in der Single-Survival-Welt seinen Job,
      keine Ahnung ob beispielsweise die Inventarabfragen so im Multiplayer noch fehlerfrei funktionieren.

      Ganz davon abgesehen, dass es vermutlich der ineffizienteste Code ever ist... :whistling:

      C#-Quellcode

      1. void Main ()
      2. // Space Engineers 01-168-006
      3. {
      4. // Definition der Variablen
      5. // Solarpanel
      6. float SOLARMAX = 0;
      7. float SOLARUSE = 0;
      8. double SOLARPERCENT = 0;
      9. var SOMAX = "MW";
      10. var SOUSE = "MW";
      11. // Batterien
      12. float BATTERYMAX = 0;
      13. float BATTERYUSE = 0;
      14. double BATTERYPERCENT = 0;
      15. var BAMAX = "MW";
      16. var BAUSE = "MW";
      17. float STOREDMAX = 0;
      18. float STOREDMIN = 0;
      19. double STOREDPERCENT = 0;
      20. var STMAX = "MWh";
      21. var STMIN = "MWh";
      22. // Reaktoren
      23. float REACTORMAX = 0;
      24. float REACTORUSE = 0;
      25. double REACTORPERCENT = 0;
      26. var REMAX = "MW";
      27. var REUSE = "MW";
      28. // Bezeichnung des LCD-Panels
      29. var INFOPANEL = (IMyTextPanel) GridTerminalSystem.GetBlockWithName
      30. (
      31. "LCD Panel (Power Status)"
      32. );
      33. var ALLSOLARPANELS = new List <IMyTerminalBlock> ();
      34. GridTerminalSystem.GetBlocksOfType <IMySolarPanel> (ALLSOLARPANELS);
      35. if (ALLSOLARPANELS.Count > 0)
      36. {
      37. for (int Z = 0; Z < ALLSOLARPANELS.Count; Z++)
      38. {
      39. var SOLARPANEL = (IMySolarPanel) ALLSOLARPANELS [Z];
      40. SOLARMAX += SOLARPANEL.MaxOutput;
      41. SOLARUSE += SOLARPANEL.CurrentOutput;
      42. }
      43. }
      44. if (SOLARMAX != 0)
      45. {
      46. SOLARPERCENT = Math.Round (SOLARUSE / SOLARMAX * 100, 2);
      47. }
      48. SOMAX = ChangeUnit (SOLARMAX, SOMAX);
      49. SOUSE = ChangeUnit (SOLARUSE, SOUSE);
      50. SOLARMAX = ChangeValue (SOLARMAX, SOMAX);
      51. SOLARUSE = ChangeValue (SOLARUSE, SOUSE);
      52. var ALLBATTERIES = new List <IMyTerminalBlock> ();
      53. GridTerminalSystem.GetBlocksOfType <IMyBatteryBlock> (ALLBATTERIES);
      54. if (ALLBATTERIES.Count > 0)
      55. {
      56. for (int Z = 0; Z < ALLBATTERIES.Count; Z++)
      57. {
      58. var BATTERY = (IMyBatteryBlock) ALLBATTERIES [Z];
      59. BATTERYMAX += Convert.ToSingle
      60. (
      61. BATTERY.DetailedInfo.Split ('\n') [1].Split (' ') [2]
      62. );
      63. BATTERYUSE += BATTERY.CurrentOutput;
      64. STOREDMAX += BATTERY.MaxStoredPower;
      65. STOREDMIN += BATTERY.CurrentStoredPower;
      66. }
      67. }
      68. if (BATTERYMAX != 0)
      69. {
      70. BATTERYPERCENT = Math.Round (BATTERYUSE / BATTERYMAX * 100, 2);
      71. }
      72. BAMAX = ChangeUnit (BATTERYMAX, BAMAX);
      73. BAUSE = ChangeUnit (BATTERYUSE, BAUSE);
      74. BATTERYMAX = ChangeValue (BATTERYMAX, BAMAX);
      75. BATTERYUSE = ChangeValue (BATTERYUSE, BAUSE);
      76. if (STOREDMAX != 0)
      77. {
      78. STOREDPERCENT = Math.Round (STOREDMIN / STOREDMAX * 100, 2);
      79. }
      80. STMAX = ChangeUnit (STOREDMAX, STMAX);
      81. STMIN = ChangeUnit (STOREDMIN, STMIN);
      82. STOREDMAX = ChangeValue (STOREDMAX, STMAX);
      83. STOREDMIN = ChangeValue (STOREDMIN, STMIN);
      84. var ALLREACTORS = new List <IMyTerminalBlock> ();
      85. GridTerminalSystem.GetBlocksOfType <IMyReactor> (ALLREACTORS);
      86. if (ALLREACTORS.Count > 0)
      87. {
      88. for (int Z = 0; Z < ALLREACTORS.Count; Z++)
      89. {
      90. var REACTOR = (IMyReactor) ALLREACTORS [Z];
      91. REACTORMAX += REACTOR.MaxOutput;
      92. REACTORUSE += REACTOR.CurrentOutput;
      93. }
      94. }
      95. if (REACTORMAX != 0)
      96. {
      97. REACTORPERCENT = Math.Round (REACTORUSE / REACTORMAX * 100, 2);
      98. }
      99. REMAX = ChangeUnit (REACTORMAX, REMAX);
      100. REUSE = ChangeUnit (REACTORUSE, REUSE);
      101. REACTORMAX = ChangeValue (REACTORMAX, REMAX);
      102. REACTORUSE = ChangeValue (REACTORUSE, REUSE);
      103. INFOPANEL.SetValue ("FontSize", 1.4f);
      104. INFOPANEL.WritePublicText
      105. (
      106. "\n" +
      107. " SOLAR: " + SOLARPERCENT + " %" + "\n" +
      108. " " + Math.Round (SOLARUSE, 1) + " " + SOUSE + " / " + Math.Round (SOLARMAX, 1) + " " + SOMAX + "\n" +
      109. "\n" +
      110. " BATTERIES: " + BATTERYPERCENT + " %" + "\n" +
      111. " " + Math.Round (BATTERYUSE, 1) + " " + BAUSE + " / " + Math.Round (BATTERYMAX, 1) + " " + BAMAX + "\n" +
      112. " STORED POWER: " + STOREDPERCENT + " %" + "\n" +
      113. " " + Math.Round (STOREDMIN, 1) + " " + STMIN + " / " + Math.Round (STOREDMAX, 1) + " " + STMAX + "\n" +
      114. "\n" +
      115. " REACTORS: " + REACTORPERCENT + " %" + "\n" +
      116. " " + Math.Round (REACTORUSE, 1) + " " + REUSE + " / " + Math.Round (REACTORMAX, 1) + " " + REMAX
      117. );
      118. // Aufruf weiterer Unterprogramme
      119. LifeSupportPanel ();
      120. RefineryFurnacePanel ();
      121. ReactorPanel ();
      122. DefenceSystem ();
      123. }
      124. string ChangeUnit (float VALUE, string UNIT)
      125. {
      126. // die Einheiten werden an die Grösse von VALUE angepasst
      127. // UNIT unterscheidet zwischen Leistung und physikalischer Arbeit
      128. // Default Rückgabewert
      129. string OUTPUT = "MW";
      130. if (VALUE >= 1000)
      131. {
      132. OUTPUT = "GW";
      133. }
      134. if (VALUE < 1)
      135. {
      136. OUTPUT = "kW";
      137. }
      138. if (VALUE < 0.001)
      139. {
      140. OUTPUT = "W";
      141. }
      142. if (UNIT == "MWh")
      143. {
      144. OUTPUT += "h";
      145. }
      146. return OUTPUT;
      147. }
      148. float ChangeValue (float VALUE, string UNIT)
      149. {
      150. // UNIT bestimmt den Umrechnungsfaktor für VALUE
      151. char C = UNIT [0];
      152. if (C == 'G')
      153. {
      154. VALUE /= 1000;
      155. }
      156. if (C == 'k')
      157. {
      158. VALUE *= 1000;
      159. }
      160. if (C == 'W')
      161. {
      162. VALUE *= 1000000;
      163. }
      164. return VALUE;
      165. }
      166. // weitere Unterprogramme
      167. void LifeSupportPanel ()
      168. {
      169. // Bezeichnung der abzufragenden Blöcke
      170. string [] BLOCKNAME = new string [3];
      171. BLOCKNAME [0] = "Oxygen Generator (Base)";
      172. BLOCKNAME [1] = "Oxygen Tank (Base) *PRI";
      173. BLOCKNAME [2] = "Oxygen Tank (Air Lock) *SEC";
      174. // Default Statuswerte
      175. string [] BLOCKSTATUS = new string [3];
      176. BLOCKSTATUS [0] = "OFFLINE";
      177. BLOCKSTATUS [1] = "OFFLINE";
      178. BLOCKSTATUS [2] = "OFFLINE";
      179. // Bezeichnung des LCD-Panels
      180. var STATUSPANEL = (IMyTextPanel) GridTerminalSystem.GetBlockWithName
      181. (
      182. "LCD Panel (Life Support)"
      183. );
      184. // Default Textfarbe
      185. STATUSPANEL.SetValue
      186. (
      187. "FontColor", new Color (100, 255, 100)
      188. );
      189. for (int Z = 0; Z < 3; Z++)
      190. {
      191. var BLOCK = (IMyFunctionalBlock) GridTerminalSystem.GetBlockWithName (BLOCKNAME [Z]);
      192. if (BLOCK.IsWorking)
      193. {
      194. BLOCKSTATUS [Z] = "ONLINE";
      195. }
      196. }
      197. if (BLOCKSTATUS [0] == "OFFLINE")
      198. {
      199. STATUSPANEL.SetValue
      200. (
      201. "FontColor", new Color (20, 220, 220)
      202. );
      203. if (BLOCKSTATUS [1] == "OFFLINE")
      204. {
      205. if (BLOCKSTATUS [2] == "OFFLINE")
      206. {
      207. STATUSPANEL.SetValue
      208. (
      209. "FontColor", new Color (255, 80, 80)
      210. );
      211. }
      212. }
      213. }
      214. var PRITANK = (IMyOxygenTank) GridTerminalSystem.GetBlockWithName (BLOCKNAME [1]);
      215. var PRILEVEL = (float) PRITANK.GetOxygenLevel ();
      216. var SECTANK = (IMyOxygenTank) GridTerminalSystem.GetBlockWithName (BLOCKNAME [2]);
      217. var SECLEVEL = (float) SECTANK.GetOxygenLevel ();
      218. STATUSPANEL.SetValue ("FontSize", 1.4f);
      219. STATUSPANEL.WritePublicText
      220. (
      221. "\n" +
      222. " OXYGEN GENERATOR:" + "\n" +
      223. " " + BLOCKSTATUS [0] + "\n" +
      224. "\n" +
      225. " PRIMARY" + "\n" +
      226. " OXYGEN TANK: " + Math.Round (PRILEVEL * 100, 2) + " %" + "\n" +
      227. " " + BLOCKSTATUS [1] + "\n" +
      228. "\n" +
      229. " SECONDARY" + "\n" +
      230. " OXYGEN TANK: " + Math.Round (SECLEVEL * 100, 2) + " %" + "\n" +
      231. " " + BLOCKSTATUS [2]
      232. );
      233. }
      234. void RefineryFurnacePanel ()
      235. {
      236. // Bezeichnung der abzufragenden Blöcke
      237. string [] BLOCKNAME = new string [3];
      238. BLOCKNAME [0] = "Refinery 1";
      239. BLOCKNAME [1] = "Arc furnace 1";
      240. BLOCKNAME [2] = "Conveyor Sorter *INCOMING*";
      241. // Default Statuswerte
      242. string [] BLOCKSTATUS = new string [3];
      243. BLOCKSTATUS [0] = "OFFLINE";
      244. BLOCKSTATUS [1] = "OFFLINE";
      245. BLOCKSTATUS [2] = "OFFLINE";
      246. var ACCESS = "DISABLED";
      247. var STORAGE = "ONLINE";
      248. // Bezeichnung des LCD-Panels
      249. var STATUSPANEL = (IMyTextPanel) GridTerminalSystem.GetBlockWithName
      250. (
      251. "LCD Panel (RefAss+Furnace)"
      252. );
      253. // Default Textfarbe
      254. STATUSPANEL.SetValue
      255. (
      256. "FontColor", new Color (255, 188, 28)
      257. );
      258. for (int Z = 0; Z < 3; Z++)
      259. {
      260. var BLOCK = (IMyFunctionalBlock) GridTerminalSystem.GetBlockWithName (BLOCKNAME [Z]);
      261. if (BLOCK.IsWorking)
      262. {
      263. BLOCKSTATUS [Z] = "ONLINE";
      264. }
      265. }
      266. if (BLOCKSTATUS [2] == "ONLINE")
      267. {
      268. ACCESS = "ENABLED";
      269. STORAGE = "OFFLINE";
      270. }
      271. if (BLOCKSTATUS [0] == "OFFLINE")
      272. {
      273. STATUSPANEL.SetValue
      274. (
      275. "FontColor", new Color (255, 100, 0)
      276. );
      277. }
      278. if (BLOCKSTATUS [2] == "OFFLINE")
      279. {
      280. STATUSPANEL.SetValue
      281. (
      282. "FontColor", new Color (255, 80, 80)
      283. );
      284. }
      285. STATUSPANEL.SetValue ("FontSize", 1.4f);
      286. STATUSPANEL.WritePublicText
      287. (
      288. "\n" +
      289. " REFINERY + ASSEMBLER:" + "\n" +
      290. " " + BLOCKSTATUS [0] + "\n" +
      291. "\n" +
      292. " FURNACE:" + "\n" +
      293. " " + BLOCKSTATUS [1] + "\n" +
      294. "\n" +
      295. " ACCESS " + ACCESS + "\n" +
      296. "\n" +
      297. " STORAGE PROCESS:" + "\n" +
      298. " " + STORAGE
      299. );
      300. }
      301. void ReactorPanel ()
      302. {
      303. // Bezeichnung des Reaktors sowie Defaultwerte
      304. var BLOCKNAME = "Small Reactor (Base)";
      305. var BLOCKSTATUS = "OFFLINE";
      306. float REACTORMAX = 0;
      307. float REACTORUSE = 0;
      308. double REACTORPERCENT = 0;
      309. var REMAX = "MW";
      310. var REUSE = "MW";
      311. float URANIUM = 0;
      312. float TOTAL = 0;
      313. // Bezeichnung des LCD-Panels
      314. var STATUSPANEL = (IMyTextPanel) GridTerminalSystem.GetBlockWithName
      315. (
      316. "LCD Panel (Reactor)"
      317. );
      318. // Default Textfarbe
      319. STATUSPANEL.SetValue
      320. (
      321. "FontColor", new Color (255, 188, 28)
      322. );
      323. var BLOCK = (IMyFunctionalBlock) GridTerminalSystem.GetBlockWithName (BLOCKNAME);
      324. if (BLOCK.IsWorking)
      325. {
      326. BLOCKSTATUS = "ONLINE";
      327. }
      328. var REACTOR = (IMyReactor) GridTerminalSystem.GetBlockWithName (BLOCKNAME);
      329. REACTORMAX = REACTOR.MaxOutput;
      330. REACTORUSE = REACTOR.CurrentOutput;
      331. if (REACTORMAX != 0)
      332. {
      333. REACTORPERCENT = Math.Round (REACTORUSE / REACTORMAX * 100, 2);
      334. }
      335. REMAX = ChangeUnit (REACTORMAX, REMAX);
      336. REUSE = ChangeUnit (REACTORUSE, REUSE);
      337. REACTORMAX = ChangeValue (REACTORMAX, REMAX);
      338. REACTORUSE = ChangeValue (REACTORUSE, REUSE);
      339. for (int Y = 0; Y < ((REACTOR.GetInventory (0)).GetItems ()).Count; Y++)
      340. {
      341. URANIUM = (float) ((REACTOR.GetInventory (0)).GetItems () [0]).Amount;
      342. }
      343. var INVENTORY = new List <IMyTerminalBlock> ();
      344. GridTerminalSystem.GetBlocksOfType <IMyEntity> (INVENTORY);
      345. for (int Z = 0; Z < INVENTORY.Count; Z++)
      346. {
      347. for (int N = 0; N < 2; N++)
      348. {
      349. if ((INVENTORY [Z].GetInventory (N)) != null)
      350. {
      351. for (int Y = 0; Y < ((INVENTORY [Z].GetInventory (N)).GetItems ()).Count; Y++)
      352. {
      353. if (((INVENTORY [Z].GetInventory (N)).GetItems () [Y]).Content.TypeId.ToString () == "MyObjectBuilder_Ingot")
      354. {
      355. if (((INVENTORY [Z].GetInventory (N)).GetItems () [Y]).Content.SubtypeName == "Uranium")
      356. {
      357. TOTAL += (float) ((INVENTORY [Z].GetInventory (N)).GetItems () [Y]).Amount;
      358. }
      359. }
      360. }
      361. }
      362. }
      363. }
      364. if (URANIUM < 20)
      365. {
      366. STATUSPANEL.SetValue
      367. (
      368. "FontColor", new Color (255, 100, 0)
      369. );
      370. }
      371. if (BLOCKSTATUS == "OFFLINE")
      372. {
      373. STATUSPANEL.SetValue
      374. (
      375. "FontColor", new Color (255, 80, 80)
      376. );
      377. }
      378. STATUSPANEL.SetValue ("FontSize", 1.4f);
      379. STATUSPANEL.WritePublicText
      380. (
      381. "\n" +
      382. " REACTOR: " + REACTORPERCENT + " %" + "\n" +
      383. " " + BLOCKSTATUS + "\n" +
      384. "\n" +
      385. " " + Math.Round (REACTORUSE, 1) + " " + REUSE + " / " + Math.Round (REACTORMAX, 1) + " " + REMAX + "\n" +
      386. "\n" +
      387. " URANIUM:" + "\n" +
      388. " " + Math.Round (URANIUM, 2) + " kg" + "\n" +
      389. "\n" +
      390. " URANIUM TOTAL:" + "\n" +
      391. " " + Math.Round (TOTAL, 2) + " kg"
      392. );
      393. }
      394. void DefenceSystem ()
      395. {
      396. // Defaultwerte
      397. var DEFENCESTATUS = "OFFLINE";
      398. var MISSILETURRETS = 0;
      399. var GATLINGTURRETS = 0;
      400. var MISSILESTATUS = "OFFLINE";
      401. var GATLINGSTATUS = "OFFLINE";
      402. float MISSILE = 0;
      403. float AMMO = 0;
      404. // Anzahl zur Kontrolle
      405. var ALLTURRETS = 15;
      406. // Bezeichnung des LCD-Panels
      407. var STATUSPANEL = (IMyTextPanel) GridTerminalSystem.GetBlockWithName
      408. (
      409. "LCD Panel (Defence System)"
      410. );
      411. // Default Textfarbe
      412. STATUSPANEL.SetValue
      413. (
      414. "FontColor", new Color (255, 160, 0)
      415. );
      416. var ALLMISSILETURRETS = new List <IMyTerminalBlock> ();
      417. GridTerminalSystem.GetBlocksOfType <IMyLargeMissileTurret> (ALLMISSILETURRETS);
      418. for (int Z = 0; Z < ALLMISSILETURRETS.Count; Z++)
      419. {
      420. if (ALLMISSILETURRETS [Z].IsWorking)
      421. {
      422. MISSILETURRETS += 1;
      423. }
      424. for (int Y = 0; Y < ((ALLMISSILETURRETS [Z].GetInventory (0)).GetItems ()).Count; Y++)
      425. {
      426. MISSILE += (float) ((ALLMISSILETURRETS [Z].GetInventory (0)).GetItems () [Y]).Amount;
      427. }
      428. }
      429. var ALLGATLINGTURRETS = new List <IMyTerminalBlock> ();
      430. GridTerminalSystem.GetBlocksOfType <IMyLargeGatlingTurret> (ALLGATLINGTURRETS);
      431. for (int Z = 0; Z < ALLGATLINGTURRETS.Count; Z++)
      432. {
      433. if (ALLGATLINGTURRETS [Z].IsWorking)
      434. {
      435. GATLINGTURRETS += 1;
      436. }
      437. for (int Y = 0; Y < ((ALLGATLINGTURRETS [Z].GetInventory (0)).GetItems ()).Count; Y++)
      438. {
      439. AMMO += (float) ((ALLGATLINGTURRETS [Z].GetInventory (0)).GetItems () [Y]).Amount;
      440. }
      441. }
      442. if (MISSILETURRETS > 0)
      443. {
      444. MISSILESTATUS = MISSILETURRETS + " x ONLINE";
      445. }
      446. if (GATLINGTURRETS > 0)
      447. {
      448. GATLINGSTATUS = GATLINGTURRETS + " x ONLINE";
      449. }
      450. if ((MISSILETURRETS + GATLINGTURRETS) > 0)
      451. {
      452. DEFENCESTATUS = "ONLINE";
      453. }
      454. if (MISSILE < 20)
      455. {
      456. STATUSPANEL.SetValue
      457. (
      458. "FontColor", new Color (255, 100, 0)
      459. );
      460. }
      461. if (AMMO < 100)
      462. {
      463. STATUSPANEL.SetValue
      464. (
      465. "FontColor", new Color (255, 100, 0)
      466. );
      467. }
      468. if ((MISSILETURRETS + GATLINGTURRETS) < ALLTURRETS)
      469. {
      470. STATUSPANEL.SetValue
      471. (
      472. "FontColor", new Color (255, 100, 0)
      473. );
      474. }
      475. if ((MISSILE + AMMO) == 0)
      476. {
      477. DEFENCESTATUS += " (DISABLED)";
      478. STATUSPANEL.SetValue
      479. (
      480. "FontColor", new Color (255, 80, 80)
      481. );
      482. }
      483. if ((MISSILETURRETS + GATLINGTURRETS) == 0)
      484. {
      485. STATUSPANEL.SetValue
      486. (
      487. "FontColor", new Color (255, 80, 80)
      488. );
      489. }
      490. STATUSPANEL.SetValue ("FontSize", 1.4f);
      491. STATUSPANEL.WritePublicText
      492. (
      493. "\n" +
      494. " DEFENCE SYSTEM:" + "\n" +
      495. " " + DEFENCESTATUS + "\n" +
      496. "\n" +
      497. " MISSILE TURRETS: " + "\n" +
      498. " " + MISSILESTATUS + "\n" +
      499. " MISSILE CONTAINER: " + MISSILE + "\n" +
      500. "\n" +
      501. " GATLING TURRETS: " + "\n" +
      502. " " + GATLINGSTATUS + "\n" +
      503. " AMMO CONTAINER: " + AMMO
      504. );
      505. }
      Alles anzeigen