private static bool CheckParams(ITerminalAction termAction, out string message, out List<Ingame.TerminalActionParameter> termParams, params string[] termParamStrings) { ListReader<Ingame.TerminalActionParameter> parameterDefinitions = termAction.GetParameterDefinitions(); if (parameterDefinitions.Count != termParamStrings.Length) { message = "wrong number of parameters: " + termParamStrings.Length + ", expected: " + parameterDefinitions.Count; termParams = null; return false; } termParams = new List<Ingame.TerminalActionParameter>(parameterDefinitions.Count); Logger.DebugLog("counts: " + parameterDefinitions.Count + ", " + termParamStrings.Length + ", " + termParams.Count); for (int index = 0; index < parameterDefinitions.Count; index++) { object obj; try { obj = Convert.ChangeType(termParamStrings[index], parameterDefinitions[index].TypeCode); } catch (InvalidCastException) { message = termParamStrings[index] + " cannot be cast to " + parameterDefinitions[index].TypeCode; return false; } catch (FormatException) { message = termParamStrings[index] + " is not in a format recognized by " + parameterDefinitions[index].TypeCode; return false; } catch (OverflowException) { message = termParamStrings[index] + " is out of range of " + parameterDefinitions[index].TypeCode; return false; } catch (ArgumentException) { message = "type code is invalid: " + parameterDefinitions[index].TypeCode; return false; } termParams.Add(Ingame.TerminalActionParameter.Get(obj)); } message = null; return true; }
private static bool CheckParams(VRage.Game.ModAPI.IMyCubeBlock autopilot, string blockName, string actionName, string[] parameters, out string message, out List<Ingame.TerminalActionParameter> termParams) { int needParams = -1; message = actionName + " not found"; foreach (IMyCubeBlock block in AttachedGrid.AttachedCubeBlocks((IMyCubeGrid)autopilot.CubeGrid, AttachedGrid.AttachmentKind.Permanent, true)) { if (!block.DisplayNameText.Contains(blockName, StringComparison.InvariantCultureIgnoreCase)) continue; IMyTerminalBlock term = block as IMyTerminalBlock; if (term == null) continue; ITerminalAction terminalAction = (ITerminalAction)term.GetActionWithName(actionName); if (terminalAction != null) { int paramCount = terminalAction.GetParameterDefinitions().Count; if (Math.Abs(parameters.Length - paramCount) > (Math.Abs(parameters.Length - needParams))) continue; needParams = paramCount; if (parameters.Length == needParams && CheckParams(terminalAction, out message, out termParams, parameters)) return true; } } if (needParams < 0) { message = actionName + " has no parameters"; termParams = null; return false; } if (parameters.Length != needParams) { message = actionName + " requires " + needParams + " parameters, got " + parameters.Length; termParams = null; return false; } termParams = null; return false; }