Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* Twinkie Industries™ Automation Presents
- * Tool Operation Script v2.5*/
- // PLEASE EDIT THIS SECTION ONLY------------------------------------------------------------------------------------------------------------------------------
- // Must be present in the title of all blocks that are to be controlled
- private const string NAME_OF_GRID = "[NAME]";
- // PLEASE DO NOT EDIT BELOW-----------------------------------------------------------------------------------------------------------------------------------
- // Off must be at the beginning and Warnings must be at the end.
- private enum ToolTypes
- {
- Off,
- Welders,
- Grinders,
- Drills,
- Warnings
- }
- Dictionary<ToolTypes,List<IMyTerminalBlock>> _availableTools = new Dictionary<ToolTypes, List<IMyTerminalBlock>>();
- private const string ACTION_TURN_ON = "OnOff_On";
- private const string ACTION_TURN_OFF = "OnOff_Off";
- private const string ACTION_PLAY = "PlaySound";
- public void Main()
- {
- // Find the blocks
- FillLists();
- // Make sure things aren't mixed up
- if (CheckForMixedState())
- {
- SetPower(ToolTypes.Off);
- return;
- }
- // Find the current mode
- ToolTypes currentMode = GetCurrentMode();
- Echo($"Old state: {currentMode}");
- // This is dumb but something weird was going on with listing modes.
- switch (currentMode)
- {
- case ToolTypes.Off:
- if (_availableTools.ContainsKey(ToolTypes.Drills))
- {
- SetPower(ToolTypes.Drills);
- break;
- }
- goto case ToolTypes.Drills;
- case ToolTypes.Drills:
- if (_availableTools.ContainsKey(ToolTypes.Welders))
- {
- SetPower(ToolTypes.Welders);
- break;
- }
- goto case ToolTypes.Welders;
- case ToolTypes.Welders:
- if (_availableTools.ContainsKey(ToolTypes.Grinders))
- {
- SetPower(ToolTypes.Grinders);
- break;
- }
- goto case ToolTypes.Grinders;
- case ToolTypes.Grinders:
- SetPower(ToolTypes.Off);
- break;
- }
- }
- private bool CheckForMixedState()
- {
- short poweredStates = 0;
- foreach (KeyValuePair<ToolTypes, List<IMyTerminalBlock>> mode in _availableTools)
- {
- if (mode.Key != ToolTypes.Warnings && CheckListForPower(mode.Value))
- {
- ++poweredStates;
- }
- }
- if (poweredStates > 1)
- return true;
- return false;
- }
- private void FillLists()
- {
- var allBlocks = new List<IMyTerminalBlock>();
- GridTerminalSystem.GetBlocks(allBlocks);
- // Create the block lists
- _availableTools[ToolTypes.Welders] = new List<IMyTerminalBlock>();
- _availableTools[ToolTypes.Grinders] = new List<IMyTerminalBlock>();
- _availableTools[ToolTypes.Drills] = new List<IMyTerminalBlock>();
- _availableTools[ToolTypes.Warnings] = new List<IMyTerminalBlock>();
- // Add the blocks to the lists if they are the correct type and if they have the grid name
- GridTerminalSystem.GetBlocksOfType<IMyShipWelder>(_availableTools[ToolTypes.Welders], NameCheck);
- GridTerminalSystem.GetBlocksOfType<IMyShipGrinder>(_availableTools[ToolTypes.Grinders], NameCheck);
- GridTerminalSystem.GetBlocksOfType<IMyShipDrill>(_availableTools[ToolTypes.Drills], NameCheck);
- // Check all the blocks for lights and sound blocks that we can use to flash and beep!
- for (int i = 0; i < allBlocks.Count; i++)
- {
- // Add only lights and sound blocks
- if (!(allBlocks[i] is IMyLightingBlock) && !(allBlocks[i] is IMySoundBlock))
- continue;
- // Add only blocks that have the grid name and are also marked with "TOOL"
- if (!NameCheck(allBlocks[i]) || !CheckCustomNameForTool(allBlocks[i]))
- continue;
- _availableTools[ToolTypes.Warnings].Add(allBlocks[i]);
- }
- }
- /// <summary>Check to see if any of the blocks in the list are powered on.</summary>
- private bool CheckListForPower(List<IMyTerminalBlock> list)
- {
- foreach (IMyTerminalBlock block in list)
- {
- if ((block as IMyFunctionalBlock).Enabled)
- return true;
- }
- return false;
- }
- private ToolTypes GetCurrentMode()
- {
- foreach (KeyValuePair<ToolTypes, List<IMyTerminalBlock>> tool in _availableTools)
- {
- if (tool.Key != ToolTypes.Warnings && CheckListForPower(tool.Value))
- return tool.Key;
- }
- return ToolTypes.Off;
- }
- private void SetPower(ToolTypes type)
- {
- Echo($"New state: {type}");
- switch (type)
- {
- case ToolTypes.Drills:
- SetPower(_availableTools[ToolTypes.Drills], ACTION_TURN_ON);
- SetPower(_availableTools[ToolTypes.Welders], ACTION_TURN_OFF);
- SetPower(_availableTools[ToolTypes.Grinders], ACTION_TURN_OFF);
- SetPower(_availableTools[ToolTypes.Warnings], ACTION_TURN_ON);
- TryToPlaySound();
- break;
- case ToolTypes.Grinders:
- SetPower(_availableTools[ToolTypes.Drills], ACTION_TURN_OFF);
- SetPower(_availableTools[ToolTypes.Welders], ACTION_TURN_OFF);
- SetPower(_availableTools[ToolTypes.Grinders], ACTION_TURN_ON);
- SetPower(_availableTools[ToolTypes.Warnings], ACTION_TURN_ON);
- TryToPlaySound();
- break;
- case ToolTypes.Welders:
- SetPower(_availableTools[ToolTypes.Drills], ACTION_TURN_OFF);
- SetPower(_availableTools[ToolTypes.Welders], ACTION_TURN_ON);
- SetPower(_availableTools[ToolTypes.Grinders], ACTION_TURN_OFF);
- SetPower(_availableTools[ToolTypes.Warnings], ACTION_TURN_ON);
- TryToPlaySound();
- break;
- case ToolTypes.Off:
- SetPower(_availableTools[ToolTypes.Drills], ACTION_TURN_OFF);
- SetPower(_availableTools[ToolTypes.Welders], ACTION_TURN_OFF);
- SetPower(_availableTools[ToolTypes.Grinders], ACTION_TURN_OFF);
- SetPower(_availableTools[ToolTypes.Warnings], ACTION_TURN_OFF);
- break;
- }
- }
- /// <summary>Fill the lists with appropriately named and typed blocks. Check to see if any lists are empty.</summary>
- /// <summary>Turn all of the blocks on a list on or off.</summary>
- private void SetPower(List<IMyTerminalBlock> list, string setting)
- {
- try
- {
- foreach (IMyTerminalBlock block in list)
- block.GetActionWithName(setting).Apply(block);
- }
- catch { }
- }
- /// <summary>This attempts to make a sound block play its sound. Future: choose the sound based on conditions.</summary>
- private void TryToPlaySound()
- {
- if (_availableTools[ToolTypes.Warnings].Count == 0)
- return;
- foreach (IMyTerminalBlock block in _availableTools[ToolTypes.Warnings])
- {
- if (block is IMySoundBlock && CheckCustomNameForTool(block))
- {
- try
- {
- (block as IMySoundBlock).Play();//.GetActionWithName(ACTION_PLAY)?.Apply(block);
- }
- catch { }
- }
- }
- }
- ///<summary>TI™ NameCheck Filter v2.0 - Returns true if the block contains the string NAME_OF_GRID in its name.</summary>
- private bool NameCheck(IMyTerminalBlock block)
- {
- return block?.CustomName?.Contains(NAME_OF_GRID) ?? false;
- }
- /// <summary>Returns true if the block contains the string tool.</summary>
- private bool CheckCustomNameForTool(IMyTerminalBlock block)
- {
- string name = block?.CustomName?.ToUpper();
- if (name != null && name.IndexOf("TOOL", StringComparison.OrdinalIgnoreCase) >= 0)
- return true;
- return false;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement