Advertisement
idiotonastic

Untitled

Jan 29th, 2021
1,017
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.22 KB | None | 0 0
  1. using Sandbox.Game.EntityComponents;
  2. using Sandbox.ModAPI.Ingame;
  3. using Sandbox.ModAPI.Interfaces;
  4. using SpaceEngineers.Game.ModAPI.Ingame;
  5. using System;
  6. using System.Collections;
  7. using System.Collections.Generic;
  8. using System.Linq;
  9. using System.Text;
  10. using VRage;
  11. using VRage.Collections;
  12. using VRage.Game;
  13. using VRage.Game.Components;
  14. using VRage.Game.GUI.TextPanel;
  15. using VRage.Game.ModAPI.Ingame;
  16. using VRage.Game.ModAPI.Ingame.Utilities;
  17. using VRage.Game.ObjectBuilders.Definitions;
  18. using VRageMath;
  19.  
  20. namespace IngameScript
  21. {
  22.     partial class Program : MyGridProgram
  23.     {
  24.  
  25.  
  26.         List<IMyBatteryBlock> batteries = new List<IMyBatteryBlock>();
  27.         List<IMyShipMergeBlock> Merge = new List<IMyShipMergeBlock>();
  28.  
  29.         // Battery variables
  30.         float storedPowerAll = 0;
  31.         float storedPowerAllMax = 0;
  32.  
  33.         DateTime balanceTime = DateTime.Now;
  34.  
  35.         // Command line parameters
  36.         string setting = "";
  37.         string message = "";
  38.         string action = "";
  39.         DateTime actionTime;
  40.  
  41.         HashSet<string> allWarnings = new HashSet<string>();
  42.         HashSet<string> currentWarnings = new HashSet<string>();
  43.  
  44.         // Script timing variables
  45.         int savedBlockCount = 0;
  46.         int execCounter = 1;
  47.         bool firstRun = true;
  48.         /// <summary>
  49.         /// Pre-Run preparations
  50.         /// </summary>
  51.         public Program()
  52.         {
  53.             // Set UpdateFrequency for starting the programmable block over and over again
  54.             Runtime.UpdateFrequency = UpdateFrequency.Update10;
  55.  
  56.         }
  57.  
  58.  
  59.         /// <summary>
  60.         /// Main method
  61.         /// </summary>
  62.         void Main(string arg)
  63.         {
  64.  
  65.             // First run
  66.             if (firstRun)
  67.             {
  68.                 Echo("Initializing.. ");
  69.                 if (execCounter == 1) GetBlocks();
  70.                 if (execCounter >= 2) Echo("Found: " + batteries.Count + " batteries");
  71.                 if (execCounter >= 10) Echo("\nStarting script..");
  72.  
  73.                 execCounter++;
  74.                 if (execCounter >= 15)
  75.                 {
  76.                     execCounter = 1;
  77.                     firstRun = false;
  78.                 }
  79.  
  80.                 return;
  81.             }
  82.  
  83.             // Store the parameter
  84.             if (arg != "")
  85.             {
  86.                 action = arg;
  87.                 execCounter = 0;
  88.                 message = "";
  89.                 actionTime = DateTime.Now;
  90.             }
  91.  
  92.             // Execute commandline argument
  93.             if (ExecuteArgument(action)) return;
  94.  
  95.             // Get all blocks, the script should use
  96.             var allBlocks = new List<IMyTerminalBlock>();
  97.             GridTerminalSystem.GetBlocks(allBlocks);
  98.             int blockCount = allBlocks.Count;
  99.  
  100.             if (execCounter == 0 || blockCount != savedBlockCount)
  101.             {
  102.                 GetBlocks();
  103.                 savedBlockCount = blockCount;
  104.  
  105.                 if (execCounter == 0)
  106.                 {
  107.                     execCounter++;
  108.                 }
  109.  
  110.                 return;
  111.             }
  112.  
  113.             if (execCounter == 1)
  114.             {
  115.                 // Get state of doners
  116.                 if (IsDonerDead())
  117.                 {
  118.                     ReleaseMerge();
  119.                 }
  120.  
  121.             }
  122.  
  123.             // Update the script execution counter
  124.             if (execCounter >= 2)
  125.             {
  126.                 // Reset the counter
  127.                 execCounter = 0;
  128.  
  129.                 // Overwrite all warnings set with current warnings
  130.                 allWarnings = new HashSet<string>(currentWarnings);
  131.                 currentWarnings.Clear();
  132.                 ResetMerge();
  133.             }
  134.             else
  135.             {
  136.                 execCounter++;
  137.             }
  138.         }
  139.  
  140.         private void ReleaseMerge()
  141.         {
  142.             foreach (IMyShipMergeBlock e in Merge)
  143.             {
  144.                 e.Enabled = false;
  145.             }
  146.         }
  147.         private void ResetMerge()
  148.         {
  149.             foreach (IMyShipMergeBlock e in Merge)
  150.             {
  151.                 e.Enabled = true;
  152.             }
  153.         }
  154.  
  155.         private Boolean IsDonerDead()
  156.         {
  157.             int x = 0;
  158.             int y = 0;
  159.             foreach (IMyBatteryBlock e in batteries)
  160.             {
  161.                 if (e.ChargeMode == ChargeMode.Discharge)
  162.                 {
  163.                     x++;
  164.                     if (e.CurrentStoredPower.Equals(0f))
  165.                     {
  166.                         y++;
  167.                     }
  168.                 }
  169.             }
  170.             return y == x;
  171.         }
  172.  
  173.         bool ExecuteArgument(string arg)
  174.         {
  175.             bool validArgument = true;
  176.             bool status = true;
  177.  
  178.             if (arg != "msg")
  179.             {
  180.                 if (!arg.Contains(" on") && !arg.Contains(" off") && !arg.Contains(" toggle")) return false;
  181.                 if (arg.Contains(" off")) status = false;
  182.             }
  183.  
  184.             if (arg == "msg")
  185.             {
  186.             }
  187.             else
  188.             {
  189.                 validArgument = false;
  190.             }
  191.  
  192.             if (validArgument)
  193.             {
  194.                 TimeSpan timeSinceAction = DateTime.Now - actionTime;
  195.  
  196.                 if (message == "") message = setting + " temporarily " + (status ? "enabled" : "disabled") + "!\n";
  197.                 Echo(message);
  198.                 Echo("Continuing in " + Math.Ceiling(3 - timeSinceAction.TotalSeconds) + " seconds..");
  199.                 action = "msg";
  200.  
  201.                 if (timeSinceAction.TotalSeconds >= 3)
  202.                 {
  203.                     setting = "";
  204.                     message = "";
  205.                     action = "";
  206.                 }
  207.             }
  208.  
  209.             return validArgument;
  210.         }
  211.  
  212.  
  213.  
  214.         /// Gets all blocks that should be used by the script
  215.  
  216.         void GetBlocks()
  217.         {
  218.             List<IMyBatteryBlock> batteriesTemp = new List<IMyBatteryBlock>();
  219.             GridTerminalSystem.GetBlocksOfType<IMyBatteryBlock>(batteriesTemp);
  220.  
  221.             List<IMyShipMergeBlock> MergeTemp = new List<IMyShipMergeBlock>();
  222.             GridTerminalSystem.GetBlocksOfType<IMyShipMergeBlock>(MergeTemp);
  223.             foreach (IMyShipMergeBlock e in MergeTemp)
  224.             {
  225.                 if (!e.DisplayName.Contains("[Bat]"))
  226.                 {
  227.                     MergeTemp.Remove(e);
  228.                 }
  229.             }
  230.             Merge = MergeTemp;
  231.  
  232.         }
  233.  
  234.  
  235.  
  236.  
  237.         /// Save method for recompiling the script or saving the world
  238.  
  239.         public void Save()
  240.         {
  241.             // Activate everything
  242.             foreach (var battery in batteries)
  243.             {
  244.                 battery.Enabled = true;
  245.                 battery.ChargeMode = ChargeMode.Auto;
  246.             }
  247.  
  248.         }
  249.     }
  250. }
  251.  
  252.  
  253.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement