sarbian

[1.4.1] Module Manager 3.0.7 (May 5th 2018) - It's Dangerous to go Alone! Take those Cats with you

Recommended Posts

Why isn't this working?

 

@PART[LS_Tank_*|LifeSupportMiniPack]:NEEDS[TACLifeSupport]
{
    foodFactor = 0.000016927083333
    waterFactor = 0.000011188078704
    oxygenFactor = 0.001713537562385
	
	%amountSupplies = #$/RESOURCE[Supplies]/maxAmount$

	RESOURCE
    {
		name = Food

		amount = #$/amountSupplies$
		@amount *= #$/foodFactor$ 

		maxAmount = #$/amountSupplies$
		@maxAmount *= #$/foodFactor$ 
	}
	RESOURCE
    {
		name = Water

		amount = #$/amountSupplies$
		@amount *= #$/waterFactor$ 

		maxAmount = #$/amountSupplies$
		@maxAmount *= #$/waterFactor$ 
	}
	RESOURCE
    {
		name = Oxygen

		amount = #$/amountSupplies$
		@amount *= #$/oxygenFactor$ 

		maxAmount = #$/amountSupplies$
		@maxAmount *= #$/oxygenFactor$ 
	}
    !RESOURCE[Supplies] {}
    !amountSupplies = delete
    
    !foodFactor = delete
    !waterFactor = delete
    !oxygenFactor = delete
}

@PART[MulchMiniPack]:NEEDS[TACLifeSupport]
{
    wasteFactor = 0.000001539351852
    wasteWaterFactor = 0.000014247685185
    carbonDioxideFactor = 0.00148012889876
	
	%amountSupplies = #$/RESOURCE[Mulch]/maxAmount$

	RESOURCE
    {
		name = Waste

		amount = #$/amountMulch$
		@amount *= #$/wasteFactor$ 

		maxAmount = #$/amountMulch$
		@maxAmount *= #$/wasteFactor$ 
	}
	RESOURCE
    {
		name = WasteWater

		amount = #$/amountMulch$
		@amount *= #$/wasteWaterFactor$ 

		maxAmount = #$/amountMulch$
		@maxAmount *= #$/wasteWaterFactor$ 
	}
	RESOURCE
    {
		name = CarbonDioxide

		amount = #$/amountMulch$
		@amount *= #$/carbonDioxideFactor$ 

		maxAmount = #$/amountMulch$
		@maxAmount *= #$/carbonDioxideFactor$ 
	}
    !RESOURCE[Mulch] {}
    !amountMulch = delete
    
    !wasteFactor = delete
    !wasteWaterFactor = delete
    !carbonDioxideFactor = delete
}

 

Share this post


Link to post
Share on other sites
19 hours ago, Wyzard said:

Are the "&" and "|" characters intended to work in a patch's name filter?  e.g. is it OK to write "@PART[foo|bar]" to modify both the "foo" and "bar" parts with a single patch?  I ask because it seems to work, but I can't tell from the documentation whether that's an intentional feature, or a quirk that might change in future versions.  The text in the brackets is documented as being a "NodeNameWithWildcards", which doesn't sound like it's meant to be a boolean expression.  I know that "@PART[foo]" is equivalent to "@PART:HAS[#name[foo]]", so "@PART[foo|bar]" should be equivalent to "@PART:HAS[#name[foo|bar]]", but the former works and the latter doesn't.  This makes me think it might just be a quirk.

(The only thing the documentation specifically says can use "|" is a :NEEDS clause.  There are examples of :HAS clauses using commas for AND relationships, so I'd expect that they can use "|" for OR as well.  Based on that, I'd expect "@PART:HAS[#name[foo]|#name[bar]]" to work, but strangely it doesn't quite: only the "foo" part gets the patch.)

I'm testing with MM 3.0.1, btw.

@PART[foo|bar] works (and will look for a PART  node with name = foo or name = bar).  | does not work in a :HAS block (only , or & which represent AND will work, and then only separating different conditions, e.g. :HAS[#foo1[bar1],#foo2[bar2]]).  However, you can use any of | & , in a NEEDS block (first is OR, second two are AND, OR binds tighter than AND)

E: clarified about and in a :HAS block

Edited by blowfish
  • Like 1

Share this post


Link to post
Share on other sites
5 hours ago, PyjackMeat said:
the amountSupplies key isn't found

I am not at my computer, but I believe that you need to add 

../

Somewhere at the beginning of the key, it looks like you are defining it in the main body, but are referencing it inside a RESOURCE node

Edit:  Just got to my computer, I was correct, I just looked at a cfg which is doing something similar to what you are trying to do.  So, I suspect that the waterFactor and oxygenFactor are also both not working, please confirm.  Assuming that is so, then the following syntax should work for you.

I also saw that  you had an extra definition of amountSupplies in the second PART module which wasn't being used, so I deleted it from there

@PART[LS_Tank_*|LifeSupportMiniPack]:NEEDS[TACLifeSupport]
{
    foodFactor = 0.000016927083333
    waterFactor = 0.000011188078704
    oxygenFactor = 0.001713537562385
	
    %amountSupplies = #$/RESOURCE[Supplies]/maxAmount$

    RESOURCE
    {
		name = Food

		amount = #$../amountSupplies$
		@amount *= #$../foodFactor$ 

		maxAmount = #$../amountSupplies$
		@maxAmount *= #$../foodFactor$ 
	}
    RESOURCE
    {
		name = Water

		amount = #$../amountSupplies$
		@amount *= #$../waterFactor$ 

		maxAmount = #$../amountSupplies$
		@maxAmount *= #$../waterFactor$ 
	}
    RESOURCE
    {
		name = Oxygen

		amount = #$../amountSupplies$
		@amount *= #$../oxygenFactor$ 

		maxAmount = #$../amountSupplies$
		@maxAmount *= #$../oxygenFactor$ 
	}
    !RESOURCE[Supplies] {}
    !amountSupplies = delete
    
    !foodFactor = delete
    !waterFactor = delete
    !oxygenFactor = delete
}

@PART[MulchMiniPack]:NEEDS[TACLifeSupport]
{
    wasteFactor = 0.000001539351852
    wasteWaterFactor = 0.000014247685185
    carbonDioxideFactor = 0.00148012889876
	

    RESOURCE
    {
		name = Waste

		amount = #$../amountMulch$
		@amount *= #$../wasteFactor$ 

		maxAmount = #$../amountMulch$
		@maxAmount *= #$../wasteFactor$ 
	}
    RESOURCE
    {
		name = WasteWater

		amount = #$../amountMulch$
		@amount *= #$../wasteWaterFactor$ 

		maxAmount = #$../amountMulch$
		@maxAmount *= #$../wasteWaterFactor$ 
	}
    RESOURCE
    {
		name = CarbonDioxide

		amount = #$../amountMulch$
		@amount *= #$../carbonDioxideFactor$ 

		maxAmount = #$../amountMulch$
		@maxAmount *= #$../carbonDioxideFactor$ 
	}
    !RESOURCE[Mulch] {}
    !amountMulch = delete
    
    !wasteFactor = delete
    !wasteWaterFactor = delete
    !carbonDioxideFactor = delete
}
 

 

 

Edited by linuxgurugamer

Share this post


Link to post
Share on other sites

Just a quick question I cannot find specified through all my searches......

It appears you can have spaces throughout a MM patch, just NOT in the PART line? I was trying  some simple patches and couldn't get them to work, but eventually tried it without spaces and it worked. The spaces/tabs were to make it a little more readable and shorten the overall length of the file.

Didn't work:

    @PART[SIL02375mRGB]        :FINAL        :NEEDS[CommunityCategoryKit]        { %tags = cck-lights  }

Worked:
    @PART[SIL02375mRGB] :FINAL:NEEDS[CommunityCategoryKit]        { %tags = cck-lights  }

Was just curious. 

Thanks!

Share this post


Link to post
Share on other sites
Posted (edited)
55 minutes ago, jmbailey2000 said:

Just a quick question I cannot find specified through all my searches......

It appears you can have spaces throughout a MM patch, just NOT in the PART line? I was trying  some simple patches and couldn't get them to work, but eventually tried it without spaces and it worked. The spaces/tabs were to make it a little more readable and shorten the overall length of the file.

Didn't work:

    @PART[SIL02375mRGB]        :FINAL        :NEEDS[CommunityCategoryKit]        { %tags = cck-lights  }

Worked:
    @PART[SIL02375mRGB] :FINAL:NEEDS[CommunityCategoryKit]        { %tags = cck-lights  }

Was just curious. 

Thanks!

Correct, it's a KSP limitation.  KSP excludes everything after the first space from the node name*, so MM has no access to it.

Spoiler

* KSP actually splits the node name on space and parenthases, and from that the first part becomes the node name and the second becomes the node's ID.  Why does this ID exist?  I have no idea.  KSP doesn't appear to use it, and I am unaware of any mods that do.  Any further parts of the node name are discarded.

 

Edited by blowfish

Share this post


Link to post
Share on other sites
1 hour ago, blowfish said:

Correct, it's a KSP limitation.  KSP excludes everything after the first space from the node name*, so MM has no access to it.

 

Figured. Greatly appreciated!!!

Share this post


Link to post
Share on other sites

Is there a way to target specific science definitions? I've been trying to write a patch for CrowdSourcedScience that deletes the stock scidefs, but I can't seem to make it target only Squad's definitions. Here's what I've got so far for removing EVA Reports:

Spoiler

@EXPERIMENT_DEFINITION:HAS[#id[evaReport]]:FOR[SQUAD]
{
    !RESULTS { }
}

Naturally, it doesn't work. It deletes all scidefs, including CSS'. How do I make it target only Squad?

Share this post


Link to post
Share on other sites
7 hours ago, voicey99 said:

Is there a way to target specific science definitions? I've been trying to write a patch for CrowdSourcedScience that deletes the stock scidefs, but I can't seem to make it target only Squad's definitions. Here's what I've got so far for removing EVA Reports:

  Hide contents

@EXPERIMENT_DEFINITION:HAS[#id[evaReport]]:FOR[SQUAD]
{
    !RESULTS { }
}

Naturally, it doesn't work. It deletes all scidefs, including CSS'. How do I make it target only Squad?

There's no way to target nodes based on their location in GameData unfortunately.

Share this post


Link to post
Share on other sites
5 minutes ago, blowfish said:

There's no way to target nodes based on their location in GameData unfortunately.

Damn, looks like I'll just have to comment out the lines from the scidef config directly. Thank you for confirming I can't do it though, at least.

Share this post


Link to post
Share on other sites
Posted (edited)

This seemed to have worked before but it was several MM and KSP versions ago.  But does MM have an issue with modifying EXPERIMENT_DEFINITION?

 

I want to boost baseValue to scienceCap for all experiment_definition (similar to the less grindy mod but 0 grind)....

This seemed to have worked before but it was several MM and KSP versions ago.  But does MM have an issue with modifying EXPERIMENT_DEFINITION?

 

I want to boost baseValue to scienceCap for all experiment_definition (similar to the less grindy mod but 0 grind)....

 

@EXPERIMENT_DEFINITION[*]:FINAL
{
	@baseValue = #$scienceCap$
}

but it doesn't work. 

 

If I call out a specific EXPERIMENT_DEFINITION it doesnt work either:

@EXPERIMENT_DEFINITION[surfaceSample]:FINAL
{
	@baseValue = 40 //original 30
}

This is on a plain vanilla KSP installation.  Only MM 3.0.1 installed.  I tried without the FINAL keyword too, but no dice.

Modifying the SQUAD .cfg files works (obviously).

I'm sure it's something simple that I'm missing.  Appreciate any help.

Edited by bdlarkin

Share this post


Link to post
Share on other sites
Posted (edited)
1 hour ago, bdlarkin said:

This seemed to have worked before but it was several MM and KSP versions ago.  But does MM have an issue with modifying EXPERIMENT_DEFINITION?

 

I want to boost baseValue to scienceCap for all experiment_definition (similar to the less grindy mod but 0 grind)....

This seemed to have worked before but it was several MM and KSP versions ago.  But does MM have an issue with modifying EXPERIMENT_DEFINITION?

 

I want to boost baseValue to scienceCap for all experiment_definition (similar to the less grindy mod but 0 grind)....

 

@EXPERIMENT_DEFINITION[*]:FINAL
{
	@baseValue = #$scienceCap$
}

but it doesn't work. 

 

If I call out a specific EXPERIMENT_DEFINITION it doesnt work either:

@EXPERIMENT_DEFINITION[surfaceSample]:FINAL
{
	@baseValue = 40 //original 30
}

This is on a plain vanilla KSP installation.  Only MM 3.0.1 installed.  I tried without the FINAL keyword too, but no dice.

Modifying the SQUAD .cfg files works (obviously).

I'm sure it's something simple that I'm missing.  Appreciate any help.

It was a change.  It wasn't exactly intended, but after consulting the docs, it is 100% consistent with the intended behavior, so it was kept.  You want @EXPERIMENT_DEFINITION:FINAL - the [*] bit implies that there is a name value to match the * against (however, experiment definitions use id rather than name).  If you want to match a particular experiment definition you can use @EXPERIMENT_DEFINITION:HAS[#id[xxx]]

Just to clarify why this worked before, it was actually matching * against EXPERIMENT_DEFINITION (quirk in the way that KSP interprets root nodes).  So e.g. @EXPERIMENT_DEFINITION[EXPERIMENT_DEFINITION] would have matched every EXPERIMENT_DEFINITION

Edited by blowfish
  • Like 2

Share this post


Link to post
Share on other sites
Posted (edited)
On 1/3/2018 at 1:24 PM, blowfish said:

It was a change.  It wasn't exactly intended, but after consulting the docs, it is 100% consistent with the intended behavior, so it was kept.  You want @EXPERIMENT_DEFINITION:FINAL - the [*] bit implies that there is a name value to match the * against (however, experiment definitions use id rather than name).  If you want to match a particular experiment definition you can use @EXPERIMENT_DEFINITION:HAS[#id[xxx]]

Just to clarify why this worked before, it was actually matching * against EXPERIMENT_DEFINITION (quirk in the way that KSP interprets root nodes).  So e.g. @EXPERIMENT_DEFINITION[EXPERIMENT_DEFINITION] would have matched every EXPERIMENT_DEFINITION

I am having a similar issue, but I am trying to edit a node that does not have a discernible name or id.

This worked before the update:

@LIFE_SUPPORT_SETTINGS[*]:AFTER[USILifeSupport]
{
	...
}

I have tried:

@LIFE_SUPPORT_SETTINGS:AFTER[USILifeSupport]{}	//	@LIFE_SUPPORT_SETTINGS,0:AFTER[USILifeSupport]{}	//	@LIFE_SUPPORT_SETTINGS,*:AFTER[USILifeSupport]{}

But none appear to work. I'm afraid I have not been able to figure out the proper syntnax to target an unnamed node on my own using the GitHub wiki.

The first key in the parent node is SupplyTime = 324000. Would this work?

@LIFE_SUPPORT_SETTINGS:HAS[#SupplyTime[324000]]:AFTER[USILifeSupport]

Cheers,

Edited by Stratickus

Share this post


Link to post
Share on other sites
Posted (edited)
36 minutes ago, Stratickus said:

I am having a similar issue, but I am trying to edit a node that does not have a discernible name or id.

This worked before the update:

@LIFE_SUPPORT_SETTINGS[*]:AFTER[USILifeSupport]
{
	...
}

I have tried:

@LIFE_SUPPORT_SETTINGS:AFTER[USILifeSupport]{}	//	@LIFE_SUPPORT_SETTINGS,0:AFTER[USILifeSupport]{}	//	@LIFE_SUPPORT_SETTINGS,*:AFTER[USILifeSupport]{}

But none appear to work. I'm afraid I have not been able to figure out the proper syntnax to target an unnamed node on my own using the GitHub wiki.

The first key in the parent node is SupplyTime = 324000. Would this work?

@LIFE_SUPPORT_SETTINGS:HAS[#SupplyTime[324000]]:AFTER[USILifeSupport]

Cheers,

Are you absolutely sure @LIFE_SUPPORT_SETTINGS:AFTER[USILifeSupport]{} didn't work?  This should target every LIFE_SUPPORT_SETTINGS node, and should have worked both before and after the update.

Edited by blowfish

Share this post


Link to post
Share on other sites
40 minutes ago, Stratickus said:

I am having a similar issue, but I am trying to edit a node that does not have a discernible name or id.

This worked before the update:

@LIFE_SUPPORT_SETTINGS[*]:AFTER[USILifeSupport]
{
	...
}

I have tried:

@LIFE_SUPPORT_SETTINGS:AFTER[USILifeSupport]{}	//	@LIFE_SUPPORT_SETTINGS,0:AFTER[USILifeSupport]{}	//	@LIFE_SUPPORT_SETTINGS,*:AFTER[USILifeSupport]{}

But none appear to work. I'm afraid I have not been able to figure out the proper syntnax to target an unnamed node on my own using the GitHub wiki.

The first key in the parent node is SupplyTime = 324000. Would this work?

@LIFE_SUPPORT_SETTINGS:HAS[#SupplyTime[324000]]:AFTER[USILifeSupport]

Cheers,

For this one: Are you remembering you need to start a *new* save every time you test?  (Since the settings you're trying to change are just defaults, and are written into the save - and can be changed on a per-save basis in-game.)

  • Like 2

Share this post


Link to post
Share on other sites
Posted (edited)
57 minutes ago, DStaal said:

For this one: Are you remembering you need to start a *new* save every time you test?  (Since the settings you're trying to change are just defaults, and are written into the save - and can be changed on a per-save basis in-game.)

Right.  When debugging ModuleManager patches, it's always a good idea to see what the final result is in ModuleManager.ConfigCache since that won't be affected by how KSP/whatever mod is actually loading the data.

Edited by blowfish
  • Like 1

Share this post


Link to post
Share on other sites
4 hours ago, blowfish said:

Are you absolutely sure @LIFE_SUPPORT_SETTINGS:AFTER[USILifeSupport]{} didn't work?  This should target every LIFE_SUPPORT_SETTINGS node, and should have worked both before and after the update.

 

4 hours ago, DStaal said:

For this one: Are you remembering you need to start a *new* save every time you test?  (Since the settings you're trying to change are just defaults, and are written into the save - and can be changed on a per-save basis in-game.)

Doh! You are absolutely correct. I now remember having to do this when I originally came up with this patch long ago. Turns out I had correctly applied the patch, but completely forgot about how these settings work. Thanks guys.

Cheers,

  • Like 2

Share this post


Link to post
Share on other sites

I have a line in an MM patch I'm writing:

MODULE:HAS[#/CrewCapacity[>0]]

Basically, I'm creating a new module on a series of parts, but only if the part has CrewCapacity.  Trouble is, the MODULE seems to be created regardless of whether CrewCapacity is set.  Any idea what I'm doing wrong?

Share this post


Link to post
Share on other sites
43 minutes ago, chrisl said:

I have a line in an MM patch I'm writing:

MODULE:HAS[#/CrewCapacity[>0]]

Basically, I'm creating a new module on a series of parts, but only if the part has CrewCapacity.  Trouble is, the MODULE seems to be created regardless of whether CrewCapacity is set.  Any idea what I'm doing wrong?

You can't check variables that way unfortunately.  You'll need to do it outside that

@PART:HAS[#CrewCapacity[>0]]
{
    MODULE
    {
    	...
    }
}

 

Share this post


Link to post
Share on other sites

Is there a way to search for an external part using the name of the module in the part you're currently working in?  For example:

SSTU_MODEL
{
  name = Adapter-2-1-Short
  volume = 10
  .
}
PART
{
  .
   MODULE
   {
      .
      CAP
      {
          name = Adapter-2-1-Short
          volume = #$SSTU_MODEL[#name]/volume$
      }
   }
}


I keep getting errors but I'm not sure if they are because what I trying to do is not possible or if I simply have a syntax or formatting error.

Edited by chrisl

Share this post


Link to post
Share on other sites

@chrisl To access another root level node you use #[email protected]$. Also you don't use #name like that - it would be [#name[XXX]] but can be shortened to just [XXX]. 

Try this:

PART
{
  .
   MODULE
   {
      .
      CAP
      {
          name = Adapter-2-1-Short
          volume = #[email protected]_MODEL[Adapter-2-1-Short]/volume$
      }
   }
}

 

Share this post


Link to post
Share on other sites
15 minutes ago, Aelfhe1m said:

@chrisl To access another root level node you use #[email protected]$. Also you don't use #name like that - it would be [#name[XXX]] but can be shortened to just [XXX]. 

Try this:

PART
{
  .
   MODULE
   {
      .
      CAP
      {
          name = Adapter-2-1-Short
          volume = #[email protected]_MODEL[Adapter-2-1-Short]/volume$
      }
   }
}

 

What I'm hoping to do is create a single command that will pull the volume figure on every CAP that we find in a part. 

@CAP,*
{
   %volume = #[email protected]_MODEL[#name]/volume$
	}

So if there are five CAP in a particular part, it would grab the name of each, look for the SSTU_MODEL with the same name, and return the volume of that part.

Share this post


Link to post
Share on other sites
12 hours ago, chrisl said:

What I'm hoping to do is create a single command that will pull the volume figure on every CAP that we find in a part. 

@CAP,*
{
   %volume = #[email protected]_MODEL[#name]/volume$
	}

 

So if there are five CAP in a particular part, it would grab the name of each, look for the SSTU_MODEL with the same name, and return the volume of that part.

That's not currently possible, unfortunately.  MM does not process variable searches within those brackets.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now