Skip to content

Commit

Permalink
Merge pull request #648 from SerTheGreat/ser-changes
Browse files Browse the repository at this point in the history
Added a config to specify ignored parts and modules
  • Loading branch information
MOARdV authored Oct 25, 2017
2 parents 17a183e + c1d17d8 commit 99c90ef
Show file tree
Hide file tree
Showing 4 changed files with 108 additions and 111 deletions.
5 changes: 5 additions & 0 deletions RasterPropMonitor/Core/RPMGlobals.cs
Original file line number Diff line number Diff line change
Expand Up @@ -67,5 +67,10 @@ internal static class RPMGlobals
internal static List<string> knownLoadedAssemblies = new List<string>();
internal static SortedDictionary<string, string> systemNamedResources = new SortedDictionary<string, string>();
internal static List<RasterPropMonitorComputer.TriggeredEventTemplate> triggeredEvents = new List<RasterPropMonitorComputer.TriggeredEventTemplate>();

/// List of parts where all PartModule should be ignored.
internal static List<string> ignoreAllPartModules = new List<string>();
/// List of parts where some PartModules should be ignored. Part names are the Key, list of module names is the Value.
internal static Dictionary<string, List<string>> ignorePartModules = new Dictionary<string, List<string>>();
}
}
186 changes: 76 additions & 110 deletions RasterPropMonitor/Core/RPMVCPerModule.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ public partial class RPMVesselComputer : VesselModule
/// JSIInternalButtons methods is outright eliminated.

private bool listsInvalid = true;
private readonly static List<string> emptyIgnoreList = new List<string>();

//--- Docking Nodes
internal ModuleDockingNode mainDockingNode;
Expand Down Expand Up @@ -168,115 +169,79 @@ internal void UpdateModuleLists()
var partsList = vessel.parts;
for (int partsIdx = 0; partsIdx < partsList.Count; ++partsIdx)
{
foreach (PartModule module in partsList[partsIdx].Modules)
{
if (module.isEnabled)
{
if (module is ModuleEngines)
{
availableEngines.Add(module as ModuleEngines);
}
else if (module is MultiModeEngine)
{
availableMultiModeEngines.Add(module as MultiModeEngine);
}
else if (module is JSIThrustReverser)
{
availableThrustReverser.Add(module as JSIThrustReverser);
}
else if (module is ModuleAblator)
{
availableAblators.Add(module as ModuleAblator);
}
else if (module is ModuleResourceIntake)
{
if ((module as ModuleResourceIntake).resourceName == "IntakeAir")
{
availableAirIntakes.Add(module as ModuleResourceIntake);
}
else
{
JUtil.LogMessage(this, "intake resource is {0}?", (module as ModuleResourceIntake).resourceName);
}
}
else if (module is ModuleAlternator)
{
ModuleAlternator alt = module as ModuleAlternator;
for (int i = 0; i < alt.resHandler.outputResources.Count; ++i)
{
if (alt.resHandler.outputResources[i].name == "ElectricCharge")
{
availableAlternators.Add(alt);
break;
}
}
}
else if (module is ModuleGenerator)
{
ModuleGenerator gen = module as ModuleGenerator;
for (int i = 0; i < gen.resHandler.outputResources.Count; ++i)
{
if (gen.resHandler.outputResources[i].name == "ElectricCharge")
{
availableGenerators.Add(gen);
availableGeneratorOutput.Add((float)gen.resHandler.outputResources[i].rate);
break;
}
}
}
else if (module is ModuleResourceConverter)
{
ModuleResourceConverter gen = module as ModuleResourceConverter;
ConversionRecipe recipe = gen.Recipe;
for (int i = 0; i < recipe.Outputs.Count; ++i)
{
if (recipe.Outputs[i].ResourceName == "ElectricCharge")
{
availableFuelCells.Add(gen);
availableFuelCellOutput.Add((float)recipe.Outputs[i].Ratio);
break;
}
}
}
else if (module is ModuleDeployableSolarPanel)
{
ModuleDeployableSolarPanel sp = module as ModuleDeployableSolarPanel;

if (sp.resourceName == "ElectricCharge")
{
availableSolarPanels.Add(sp);
}
}
else if (module is ModuleGimbal)
{
availableGimbals.Add(module as ModuleGimbal);
}
else if (module is JSIRadar)
{
availableRadars.Add(module as JSIRadar);
}
else if (module is ModuleParachute)
{
availableParachutes.Add(module as ModuleParachute);
}
else if (module is ModuleWheels.ModuleWheelDeployment)
{
availableDeployableWheels.Add(module as ModuleWheels.ModuleWheelDeployment);
}
else if (module is ModuleWheels.ModuleWheelDamage)
{
availableWheelDamage.Add(module as ModuleWheels.ModuleWheelDamage);
}
else if (module is ModuleWheels.ModuleWheelBrakes)
{
availableWheelBrakes.Add(module as ModuleWheels.ModuleWheelBrakes);
}
else if (JSIParachute.rcFound && module.GetType() == JSIParachute.rcModuleRealChute)
{
availableRealChutes.Add(module);
}
}
}
string partName = partsList[partsIdx].partInfo.name;
if (!RPMGlobals.ignoreAllPartModules.Contains(partName)) {
List<string> modulesToIgnore;
if (!RPMGlobals.ignorePartModules.TryGetValue(partName, out modulesToIgnore)) {
modulesToIgnore = emptyIgnoreList;
}
foreach (PartModule module in partsList[partsIdx].Modules) {
if (module.isEnabled && !modulesToIgnore.Contains(module.moduleName)) {
if (module is ModuleEngines) {
availableEngines.Add(module as ModuleEngines);
} else if (module is MultiModeEngine) {
availableMultiModeEngines.Add(module as MultiModeEngine);
} else if (module is JSIThrustReverser) {
availableThrustReverser.Add(module as JSIThrustReverser);
} else if (module is ModuleAblator) {
availableAblators.Add(module as ModuleAblator);
} else if (module is ModuleResourceIntake) {
if ((module as ModuleResourceIntake).resourceName == "IntakeAir") {
availableAirIntakes.Add(module as ModuleResourceIntake);
} else {
JUtil.LogMessage(this, "intake resource is {0}?", (module as ModuleResourceIntake).resourceName);
}
} else if (module is ModuleAlternator) {
ModuleAlternator alt = module as ModuleAlternator;
for (int i = 0; i < alt.resHandler.outputResources.Count; ++i) {
if (alt.resHandler.outputResources[i].name == "ElectricCharge") {
availableAlternators.Add(alt);
break;
}
}
} else if (module is ModuleGenerator) {
ModuleGenerator gen = module as ModuleGenerator;
for (int i = 0; i < gen.resHandler.outputResources.Count; ++i) {
if (gen.resHandler.outputResources[i].name == "ElectricCharge") {
availableGenerators.Add(gen);
availableGeneratorOutput.Add((float)gen.resHandler.outputResources[i].rate);
break;
}
}
} else if (module is ModuleResourceConverter) {
ModuleResourceConverter gen = module as ModuleResourceConverter;
ConversionRecipe recipe = gen.Recipe;
for (int i = 0; i < recipe.Outputs.Count; ++i) {
if (recipe.Outputs[i].ResourceName == "ElectricCharge") {
availableFuelCells.Add(gen);
availableFuelCellOutput.Add((float)recipe.Outputs[i].Ratio);
break;
}
}
} else if (module is ModuleDeployableSolarPanel) {
ModuleDeployableSolarPanel sp = module as ModuleDeployableSolarPanel;

if (sp.resourceName == "ElectricCharge") {
availableSolarPanels.Add(sp);
}
} else if (module is ModuleGimbal) {
availableGimbals.Add(module as ModuleGimbal);
} else if (module is JSIRadar) {
availableRadars.Add(module as JSIRadar);
} else if (module is ModuleParachute) {
availableParachutes.Add(module as ModuleParachute);
} else if (module is ModuleWheels.ModuleWheelDeployment) {
availableDeployableWheels.Add(module as ModuleWheels.ModuleWheelDeployment);
} else if (module is ModuleWheels.ModuleWheelDamage) {
availableWheelDamage.Add(module as ModuleWheels.ModuleWheelDamage);
} else if (module is ModuleWheels.ModuleWheelBrakes) {
availableWheelBrakes.Add(module as ModuleWheels.ModuleWheelBrakes);
} else if (JSIParachute.rcFound && module.GetType() == JSIParachute.rcModuleRealChute) {
availableRealChutes.Add(module);
}
}
}
}

if (vessel.currentStage <= partsList[partsIdx].inverseStage)
{
Expand Down Expand Up @@ -802,7 +767,8 @@ internal void SetEnableEngines(bool state)
{
Part thatPart = availableEngines[i].part;

if (thatPart.inverseStage == StageManager.CurrentStage || !state)
if (StageManager.CurrentStage == StageManager.StageCount && thatPart.inverseStage == StageManager.StageCount - 1 || //This line allows to start engines of the first stage before the initial launch
thatPart.inverseStage == StageManager.CurrentStage || !state)
{
if (availableEngines[i].EngineIgnited != state)
{
Expand Down
3 changes: 2 additions & 1 deletion RasterPropMonitor/Core/RPMVesselComputer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -638,6 +638,7 @@ protected override void OnAwake()
}
//vid = vessel.id;
}

GameEvents.onVesselChange.Add(onVesselChange);
GameEvents.onVesselWasModified.Add(onVesselWasModified);
GameEvents.onStageActivate.Add(onStageActivate);
Expand Down Expand Up @@ -1436,7 +1437,7 @@ internal double SuicideBurnCountdown()
return impactTime - decelTime / 2.0 - Planetarium.GetUniversalTime();
}

/// <summary>
/// <summary>
/// Determines if enough screen updates have passed to trigger another data update.
/// </summary>
/// <returns>true if it's time to update things</returns>
Expand Down
25 changes: 25 additions & 0 deletions RasterPropMonitor/Core/UtilityFunctions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2034,6 +2034,31 @@ private IEnumerator LoadRasterPropMonitorValues()
}
}

RPMGlobals.ignoreAllPartModules.Clear();
RPMGlobals.ignorePartModules.Clear();
nodes = GameDatabase.Instance.GetConfigNodes("RPM_IGNORE_MODULES");
for (int idx = 0; idx < nodes.Length; ++idx) {
foreach (string nameExpression in nodes[idx].GetValuesList("moduleName")) {
string[] splitted = nameExpression.Split(':'); //splitted[0] - part name, splitted[1] - module name
if (splitted.Length != 2 || splitted[0].Length == 0 || splitted[1].Length == 0) {
continue; //just skipping in case of bad syntax
}
string partName = splitted[0].Replace('_','.'); //KSP does it, so we do
if (splitted[1] == "*") {
RPMGlobals.ignoreAllPartModules.Add(partName);
} else {
List<string> moduleNameList;
if (!RPMGlobals.ignorePartModules.TryGetValue(partName, out moduleNameList)) {
moduleNameList = new List<string>();
RPMGlobals.ignorePartModules.Add(partName, moduleNameList);
}
if (!moduleNameList.Contains(splitted[1])) {
moduleNameList.Add(splitted[1]);
}
}
}
}

RPMGlobals.knownLoadedAssemblies.Clear();
for (int i = 0; i < AssemblyLoader.loadedAssemblies.Count; ++i)
{
Expand Down

0 comments on commit 99c90ef

Please sign in to comment.