BodyLanguage

Plugins BodyLanguage

First things first, thanks a bunch for your work on this amazing plugin.

One quick question: from the plugin description we can read that the focus is on 'anal' for the moment. I personally have no interest for anal in my scenes so i was wondering what is already taken care of by the plugin regarding vagina and what are your plans for improving vaginal penetrations later?
 
First things first, thanks a bunch for your work on this amazing plugin.

One quick question: from the plugin description we can read that the focus is on 'anal' for the moment. I personally have no interest for anal in my scenes so i was wondering what is already taken care of by the plugin regarding vagina and what are your plans for improving vaginal penetrations later?
Thanks for the positive feedback :)

I hate to say this, but my interest enhancing the vagina is very minor. That's because:
  • I don't really care about vam vag sex
  • There already are plugins to enhance the vagina (auto labia etc.)
  • The vag does not feature the same system with colliders that have to be spread apart to enter
So, there probably won't be any auto morphing the vag, but all the other features like triggers, bulging and stimulation work (nearly) the same as with the anus.
 
Thanks for the positive feedback :)

I hate to say this, but my interest enhancing the vagina is very minor. That's because:
  • I don't really care about vam vag sex
  • There already are plugins to enhance the vagina (auto labia etc.)
  • The vag does not feature the same system with colliders that have to be spread apart to enter
So, there probably won't be any auto morphing the vag, but all the other features like triggers, bulging and stimulation work (nearly) the same as with the anus.
Thanks for the clarification.

That being said from the perspective of someone that is far from being an expert at creating scenes using VAM i must say that dealing with vagina mophs and everything related to coliders because of penis sizes and poses creating issues is a real pain in the *** to say the least. And the fact is that there is no other plugin that deals with such issues as well as your.

Anyway, once again, thanks a bunch for your fantastic work on BodyLanguage. (y)
 
I'm running into a couple of exceptions when the plugin loads after customizing and saving some settings.

Code:
!> Exception during plugin script Init: System.NullReferenceException: Object reference not set to an instance of an object
  at CheesyFX.Orifice.<Init>m__4 (Single val) [0x00000] in <filename unknown>:0
  at JSONStorableFloat.InternalSetVal (Single f, Boolean doCallback) [0x00000] in <filename unknown>:0
  at JSONStorableFloat.set_val (Single value) [0x00000] in <filename unknown>:0
  at CheesyFX.JSONStorableParamExt.Load (.JSONStorableParam jsonParam, SimpleJSON.JSONClass jc) [0x00000] in <filename unknown>:0
  at CheesyFX.Orifice.Load (SimpleJSON.JSONClass jc, System.String subScenePrefix) [0x00000] in <filename unknown>:0
  at CheesyFX.Anus.Load (SimpleJSON.JSONClass jc, System.String subScenePrefix) [0x00000] in <filename unknown>:0
  at CheesyFX.FillMeUp.Load (SimpleJSON.JSONClass jc) [0x00000] in <filename unknown>:0
  at CheesyFX.PresetSystem.ApplyFromUrl (System.String path) [0x00000] in <filename unknown>:0
  at CheesyFX.PresetSystem.ApplyLatestMatchingPreset () [0x00000] in <filename unknown>:0
  at CheesyFX.PresetSystem.Init () [0x00000] in <filename unknown>:0
  at CheesyFX.FillMeUp.Init () [0x00000] in <filename unknown>:0
  at MVRPluginManager.CreateScriptController (.MVRPlugin mvrp, DynamicCSharp.ScriptType type) [0x00000] in <filename unknown>:0

Code:
!> Exception during RestoreFromLast of plugin#3_CheesyFX.FillMeUp: System.NullReferenceException: Object reference not set to an instance of an object
  at CheesyFX.Orifice.UpdateTriggerPosition () [0x00000] in <filename unknown>:0 
  at CheesyFX.Orifice.<Init>m__3 (Single x) [0x00000] in <filename unknown>:0 
  at JSONStorableFloat.InternalSetVal (Single f, Boolean doCallback) [0x00000] in <filename unknown>:0 
  at JSONStorableFloat.set_val (Single value) [0x00000] in <filename unknown>:0 
  at CheesyFX.JSONStorableParamExt.Load (.JSONStorableParam jsonParam, SimpleJSON.JSONClass jc) [0x00000] in <filename unknown>:0 
  at CheesyFX.Orifice.Load (SimpleJSON.JSONClass jc, System.String subScenePrefix) [0x00000] in <filename unknown>:0 
  at CheesyFX.Anus.Load (SimpleJSON.JSONClass jc, System.String subScenePrefix) [0x00000] in <filename unknown>:0 
  at CheesyFX.FillMeUp.Load (SimpleJSON.JSONClass jc) [0x00000] in <filename unknown>:0 
  at CheesyFX.FillMeUp.LateRestoreFromJSON (SimpleJSON.JSONClass jc, Boolean restorePhysical, Boolean restoreAppearance, Boolean setMissingToDefault) [0x00000] in <filename unknown>:0 
  at Atom.RestoreFromLast (.JSONStorable js) [0x00000] in <filename unknown>:0
 
Upon further digging, it appears the trigger game object hasn't been created by the time FillMeUp loads the preset.
You're running CreateTriggersHandlers as a subroutine without waiting for it to finish which causes a thread race.

Code:
!> Exception during plugin script Init: System.InvalidOperationException: enterTriggerGO is null
  at CheesyFX.Orifice.UpdateTriggerPosition () [0x00000] in <filename unknown>:0 
  at CheesyFX.Orifice.TriggerOffsetForwardCallback (Single x) [0x00000] in <filename unknown>:0 
  at JSONStorableFloat.InternalSetVal (Single f, Boolean doCallback) [0x00000] in <filename unknown>:0 
  at JSONStorableFloat.set_val (Single value) [0x00000] in <filename unknown>:0 
  at CheesyFX.JSONStorableParamExt.Load (.JSONStorableParam jsonParam, SimpleJSON.JSONClass jc) [0x00000] in <filename unknown>:0 
  at CheesyFX.Orifice.Load (SimpleJSON.JSONClass jc, System.String subScenePrefix) [0x00000] in <filename unknown>:0 
  at CheesyFX.FillMeUp.Load (SimpleJSON.JSONClass jc) [0x00000] in <filename unknown>:0 
  at CheesyFX.PresetSystem.ApplyFromUrl (System.String path) [0x00000] in <filename unknown>:0 
  at CheesyFX.PresetSystem.ApplyLatestMatchingPreset () [0x00000] in <filename unknown>:0 
  at CheesyFX.PresetSystem.Init () [0x00000] in <filename unknown>:0 
  at CheesyFX.FillMeUp.Init () [0x00000] in <filename unknown>:0 
  at MVRPluginManager.CreateScriptController (.MVRPlugin mvrp, DynamicCSharp.ScriptType type) [0x00000] in <filename unknown>:0
 
CheesyFX updated BodyLanguage with a new update entry:

v24: Touch triggers

You can add touch triggers to every body region from left pinky to right big toe. All triggering is based on the time the region is touched.
  • General settings:
    • Reset Rate: By default the time touched is not instantly set back to 0 once the collision breaks. Instead, it decays with a rate proportional to this.
      Tip: If you set the rate to 0 the timer will not be reset. It will count the total amount of time the region has been touched so far (cumulative).
    • Instant...

Read the rest of this update entry...
 
Upon further digging, it appears the trigger game object hasn't been created by the time FillMeUp loads the preset.
You're running CreateTriggersHandlers as a subroutine without waiting for it to finish which causes a thread race.

Code:
!> Exception during plugin script Init: System.InvalidOperationException: enterTriggerGO is null
  at CheesyFX.Orifice.UpdateTriggerPosition () [0x00000] in <filename unknown>:0
  at CheesyFX.Orifice.TriggerOffsetForwardCallback (Single x) [0x00000] in <filename unknown>:0
  at JSONStorableFloat.InternalSetVal (Single f, Boolean doCallback) [0x00000] in <filename unknown>:0
  at JSONStorableFloat.set_val (Single value) [0x00000] in <filename unknown>:0
  at CheesyFX.JSONStorableParamExt.Load (.JSONStorableParam jsonParam, SimpleJSON.JSONClass jc) [0x00000] in <filename unknown>:0
  at CheesyFX.Orifice.Load (SimpleJSON.JSONClass jc, System.String subScenePrefix) [0x00000] in <filename unknown>:0
  at CheesyFX.FillMeUp.Load (SimpleJSON.JSONClass jc) [0x00000] in <filename unknown>:0
  at CheesyFX.PresetSystem.ApplyFromUrl (System.String path) [0x00000] in <filename unknown>:0
  at CheesyFX.PresetSystem.ApplyLatestMatchingPreset () [0x00000] in <filename unknown>:0
  at CheesyFX.PresetSystem.Init () [0x00000] in <filename unknown>:0
  at CheesyFX.FillMeUp.Init () [0x00000] in <filename unknown>:0
  at MVRPluginManager.CreateScriptController (.MVRPlugin mvrp, DynamicCSharp.ScriptType type) [0x00000] in <filename unknown>:0
fixed in v24
 
Possible enhancements:
- pull in/out animation for ass and vagina
- orgasm: morph belly for both sexes and ball sack for men and maybe dick also. You know, just for science ;)
 
It would be great to make an orgasm time regulator. Now the orgasm is too long. I don't know if this is implemented in VAMoan
 
Sliders work, morphs didn't. I unpacked them from .var and they work now, though that's weird.
Oh, I'll check. May be that I forgot to rerout the path when loading from var (I always use the local version, obviously).

Edit: No, it's all set up and working correctly on my side. Do you have any error prints?
 
Last edited:
Oh, I'll check. May be that I forgot to rerout the path when loading from var (I always use the local version, obviously).

Edit: No, it's all set up and working correctly on my side. Do you have any error prints?
Possibly, but none that I could find about that morph. Not sure what caused it since other morphs in the var work fine.
 
Possibly, but none that I could find about that morph. Not sure what caused it since other morphs in the var work fine.
The error wouldn't be about the morph itself, just BL in general. Are you sure that it doesn't work? Are the morph sliders moving up while touching the nipple? I just noticed that the effect is not that prominent on a default model. I only used my model to test while creating the morph and the plugin drives it to a max value of 1.5. The next version will have adjustable strength for that reason. Maybe that solves your problem.
 
CheesyFX updated BodyLanguage with a new update entry:

v25 Slap Triggers

  • Slap triggers:
    • Addable to any body region
    • Based on the intensity of the slap(s)
    • Cooldown available
    • Threshold triggers (exceed, undershot)
    • Value trigger, mainly useful in cumulative mode
    • Cumulative mode:
      • Slap intensities add up to a total value
      • The total value decays by a configurable rate
      • This is specifically useful to drive slap marks. Example: Use the value trigger with some range (like [0, 100]) to map it to the alpha of your...

Read the rest of this update entry...
 
fixed in v24
still getting exceptions in v24 and v25 :cry:
Why do you run CreateTriggersHandlers as a subroutine in the first place? It works fine for me if I change it to execute synchronously.

The secondary error regarding the slaps.audiobundle happens only when body language is added or updated by your plugin suit.

Code:
!> Exception during plugin script Init: System.NullReferenceException: Object reference not set to an instance of an object
  at CheesyFX.Orifice.<Init>m__4 (Single val) [0x00000] in <filename unknown>:0
  at JSONStorableFloat.InternalSetVal (Single f, Boolean doCallback) [0x00000] in <filename unknown>:0
  at JSONStorableFloat.set_val (Single value) [0x00000] in <filename unknown>:0
  at CheesyFX.JSONStorableParamExt.Load (.JSONStorableParam jsonParam, SimpleJSON.JSONClass jc) [0x00000] in <filename unknown>:0
  at CheesyFX.Orifice.Load (SimpleJSON.JSONClass jc, System.String subScenePrefix) [0x00000] in <filename unknown>:0
  at CheesyFX.Anus.Load (SimpleJSON.JSONClass jc, System.String subScenePrefix) [0x00000] in <filename unknown>:0
  at CheesyFX.FillMeUp.Load (SimpleJSON.JSONClass jc) [0x00000] in <filename unknown>:0
  at CheesyFX.PresetSystem.ApplyFromUrl (System.String path) [0x00000] in <filename unknown>:0
  at CheesyFX.PresetSystem.ApplyLatestMatchingPreset () [0x00000] in <filename unknown>:0
  at CheesyFX.PresetSystem.Init () [0x00000] in <filename unknown>:0
  at CheesyFX.FillMeUp.Init () [0x00000] in <filename unknown>:0
  at MVRPluginManager.CreateScriptController (.MVRPlugin mvrp, DynamicCSharp.ScriptType type) [0x00000] in <filename unknown>:0
!> Error during attempt to load assetbundle CheesyFX.BodyLanguage.24:/Custom/Scripts/CheesyFX/BodyLanguage/audiobundles/slaps.audiobundle. Not valid
!> Exception caught: System.NullReferenceException: Object reference not set to an instance of an object
  at CheesyFX.AudioImporter.ReadBundle (MeshVR.AssetBundleFromFileRequest bundle, System.Collections.Generic.List`1 clipLibraries) [0x00000] in <filename unknown>:0
  at CheesyFX.AudioImporter.OnBundleLoaded (MeshVR.AssetBundleFromFileRequest request, System.Collections.Generic.List`1 clipLibraries) [0x00000] in <filename unknown>:0
 
Last edited:
still getting exceptions in v24 and v25 :cry:
Why do you run CreateTriggersHandlers as a subroutine in the first place? It works fine for me if I change it to execute synchronously.

The secondary error regarding the slaps.audiobundle happens only when body language is added or updated by your plugin suit.

Code:
!> Exception during plugin script Init: System.NullReferenceException: Object reference not set to an instance of an object
  at CheesyFX.Orifice.<Init>m__4 (Single val) [0x00000] in <filename unknown>:0
  at JSONStorableFloat.InternalSetVal (Single f, Boolean doCallback) [0x00000] in <filename unknown>:0
  at JSONStorableFloat.set_val (Single value) [0x00000] in <filename unknown>:0
  at CheesyFX.JSONStorableParamExt.Load (.JSONStorableParam jsonParam, SimpleJSON.JSONClass jc) [0x00000] in <filename unknown>:0
  at CheesyFX.Orifice.Load (SimpleJSON.JSONClass jc, System.String subScenePrefix) [0x00000] in <filename unknown>:0
  at CheesyFX.Anus.Load (SimpleJSON.JSONClass jc, System.String subScenePrefix) [0x00000] in <filename unknown>:0
  at CheesyFX.FillMeUp.Load (SimpleJSON.JSONClass jc) [0x00000] in <filename unknown>:0
  at CheesyFX.PresetSystem.ApplyFromUrl (System.String path) [0x00000] in <filename unknown>:0
  at CheesyFX.PresetSystem.ApplyLatestMatchingPreset () [0x00000] in <filename unknown>:0
  at CheesyFX.PresetSystem.Init () [0x00000] in <filename unknown>:0
  at CheesyFX.FillMeUp.Init () [0x00000] in <filename unknown>:0
  at MVRPluginManager.CreateScriptController (.MVRPlugin mvrp, DynamicCSharp.ScriptType type) [0x00000] in <filename unknown>:0
!> Error during attempt to load assetbundle CheesyFX.BodyLanguage.24:/Custom/Scripts/CheesyFX/BodyLanguage/audiobundles/slaps.audiobundle. Not valid
!> Exception caught: System.NullReferenceException: Object reference not set to an instance of an object
  at CheesyFX.AudioImporter.ReadBundle (MeshVR.AssetBundleFromFileRequest bundle, System.Collections.Generic.List`1 clipLibraries) [0x00000] in <filename unknown>:0
  at CheesyFX.AudioImporter.OnBundleLoaded (MeshVR.AssetBundleFromFileRequest request, System.Collections.Generic.List`1 clipLibraries) [0x00000] in <filename unknown>:0
Because it's better to wait for the physics to settle before creating the triggers.

Could you please be more specific how to reproduce this? In default scene too? Only on scene load? Does the scene contain the settings or does it try to load "UserDefaults"? What settings did you change? Etc. I assumed you changed the trigger offsets.
 
Because it's better to wait for the physics to settle before creating the triggers.

Could you please be more specific how to reproduce this? In default scene too? Only on scene load? Does the scene contain the settings or does it try to load "UserDefaults"? What settings did you change? Etc. I assumed you changed the trigger offsets.
Yes, I changed trigger offsets. It happens both when I load a scene that contains the plugin and when adding the plugin if I have a default preset.

I did not change the offset for the anus trigger, however, which is the one that's initialized first and fails.

The PresetSystem is initialized before that subroutine finishes.
 
Last edited:
As with any race condition, it may or may not happen due to a number of factors. If you cannot reproduce it on your system try increasing the
"WaitForSeconds(.5f)" to something longer.
 
Wow I had no idea discussions for this were so active.

What I meant in my comment about the triggers may not be possible in this specific plugin but another one called Extra Triggers , has a feature that can only activate when a specific atom collides with another.. so for example, normally anything would trigger mouth collider but its unique ability is to make something like the Penis be the only thing that triggers a collision with the mouth.

But this handles so many different body parts I don't know if it's possible to specify a specific atom as the only trigger for each.

But the benefit of it does work is that a scene creator can have different comments or voice lines for each touch to a different body part. An ass slap can have comments but sitting down won't cause the same comments because the chair touched the ass, a paddle can have a different reaction than a hand. And best of all since it would be in one plugin , settings can be saved and it could be used to bring life and reactions to a character in ANY scene.

But like I said I don't know much of that is actually possible, and this doesn so much already, I'm likely just thinking crazy or missing details.
 
As with any race condition, it may or may not happen due to a number of factors. If you cannot reproduce it on your system try increasing the
"WaitForSeconds(.5f)" to something longer.
I did not test it extensively, but after your posts it was clear to me that there will be an error when trying to set the offsets. I thought my fix should have prevented that, but I'll give it another look.
 
Wow I had no idea discussions for this were so active.

What I meant in my comment about the triggers may not be possible in this specific plugin but another one called Extra Triggers , has a feature that can only activate when a specific atom collides with another.. so for example, normally anything would trigger mouth collider but its unique ability is to make something like the Penis be the only thing that triggers a collision with the mouth.

But this handles so many different body parts I don't know if it's possible to specify a specific atom as the only trigger for each.

But the benefit of it does work is that a scene creator can have different comments or voice lines for each touch to a different body part. An ass slap can have comments but sitting down won't cause the same comments because the chair touched the ass, a paddle can have a different reaction than a hand. And best of all since it would be in one plugin , settings can be saved and it could be used to bring life and reactions to a character in ANY scene.

But like I said I don't know much of that is actually possible, and this doesn so much already, I'm likely just thinking crazy or missing details.
Hey! You can also join my discord for more!

If you go to the General tab in TouchMe you can see and edit what atoms should collide with the person. By default all furniture, cuas and floors etc. are excluded, but you can reenable them or exclude some more. These exclusions will prevent slaps and all triggering, so you won't get a reaction if she sits down, but if you slap her by hand or with a toy.
Restrictions per bodyregion are not implemented right now, but definitely possible. I don't see a real benefit of it though. Why would you want reacions to a paddle on the legs but not on the arms for example? Different reactions to different objects hitting the same region could be of use though. But this is a bit more complicated to get done, cause it would require an aray of the existing custom triggers per region, not just just the one you get now. And each of them had to have it's own "colliding object" condition.

To wrap it up: Almost everything is possible. If another person is touching I could even allow you to restrict the triggering to a certain body region of that other person. E.g. a reaction if he is kicking her ass, and none (or another) if he's slapping it by hand. The thing is, that till today there are zero released scenes making use of the triggers. The plugin isn't even used as a "passive" dependency for the moans and so on. Everyone is still using VAMMoan, belly bulger and expression randomizer. So I'd like to see if there's actually a real demand for it before diving deep, making it even more complex.
 
I did not test it extensively, but after your posts it was clear to me that there will be an error when trying to set the offsets. I thought my fix should have prevented that, but I'll give it another look.
It works when I change CreateTriggersHandlers to execute synchronously instead of as a subroutine. My configured values load fine.
 
It works when I change CreateTriggersHandlers to execute synchronously instead of as a subroutine. My configured values load fine.
I haven't really tested how it works without the delay, but my experience with HeelAdjust2 tells me that if you start adding colliders while the model isn't fully loaded things might get messed up big time. Just load a scene containing the original HeelAdjust from prestigitis - you'll get toes flying all over the place.

You may not get an error by running it synchonously and there may not be a visual bug like in the above scenario, but that's only because my colliders are triggers and thus do not interfere with the model. They may be very well misplaced though.
 

Similar threads

Back
Top Bottom