Jump to content

OSex+ The Greatest Virtual Sex Ever


Recommended Posts

Posted

 

 

 

Funny thing is i couldnt be more clear in comparison and shared files in my previous post yet some people still misinterpret what i said. I guess language barrier thing.

 

 

I didn't misinterpret what you were saying.  I just saw an opportunity to say something I've been thinking.

 

 

Wasnt talking about you. :D

I was trying to show sexlab as engine and 0sex as a fully funcional car but Serkad figured it out the opposite.

 

 

We are lucky to have that "engine" at all. Some of your criticism in making an comparison to Sexlab and 0SEX doesn't seem exactly constructive, not trying to be anal about it, but remember they are mods, not products. 0SEX is an amazing mod and it does things better than Sexlab, but I wouldn't bash Sexlab because of it.

 

Posted

This mod is unbelievable. So where can i download the 1.082. I can't find the source..? Thanks to the incredible mod author.

 

Not going to happen.

Ceo has stated that his SDK (or however it wants to be named) is not going to be released due to an enormous effort (which of Ceo is probably forgotten IF an SDK was released).

 

But on a side note: I am not able to get the visuals (better said; icons that is beeing controlled by NP-keys to work).

Am I dumb or just forgot an step?

Posted

 

 

 

We are lucky to have that "engine" at all. Some of your criticism in making an comparison to Sexlab and 0SEX doesn't seem exactly constructive, not trying to be anal about it, but remember they are mods, not products. 0SEX is an amazing mod and it does things better than Sexlab, but I wouldn't bash Sexlab because of it.

 

 

 

There was no bashing of any mod or criticism, only pure comparison. I dont know where you get the idea that i dont like sexlab. What i said is to clear up the confusion that lots of people are having about the 2.

 

"This mod does NOTHING by itself, and requires a separate mod to make use of the resources provided." - Ashal, Sexlab description

 

People ask a lot about overwriting files so i highlighted what will be overwriten and explained what each mod does and if it has other mods built for it.

 

 

This mod is unbelievable. So where can i download the 1.082. I can't find the source..? Thanks to the incredible mod author.

 

Not going to happen.

Ceo has stated that his SDK (or however it wants to be named) is not going to be released due to an enormous effort (which of Ceo is probably forgotten IF an SDK was released).

 

 

Thats old news. CEO said he will bring it back. Read nexus sticky.

Posted

 

 

Managed to fix the last issue we were having with the scaling Migal but as you can see from the solution there's something strange that's not being revealed to us since this works:

 

Basically I noticed the OHeight reports and console getScale were reporting correct values however visually they appeared off. Hitting arrange twice would put them at the correct scales but arrange and the scaling that happens at the start both use the same actionscript to figure it out. It turns out that if the player gets moveTo() meaning it isn't starting on their location then they would retain their original scale and not take the new scaling. Why this happens I'm not entirely sure, Maybe something goes on with moveTo that makes them not able to take the scale.

 

Here's the solution. I added a bool so this only goes down once per scene. It waits one second after the first scale and then scales them again to the same value. It winds up being correct the 2nd time it happens. 

 

bool firstScale = true

 

Event OnBodyScale(string eventName, string zType, float zAmount, Form sender)
actra.setScale(zAmount)
if firstScale
firstScale = false
utility.wait(1.0)
actra.setScale(zAmount)
endif
EndEvent
 
Anything less then 1 second seemed to be unreliable, from my tests it appears there is a kind of window that they are scale immune in.
 
-------------------------------------------------
 
Next build is almost complete:
I've broken out OSA from OSex and will release OSA on the first of next month as a separate thing. I've finished a majority of the core OSA stuff like Main Menu, Inspect Menu etc. Keys are all binded in the Main Menu as well as all config (Except ESG which is still in the .xml but I will move that too at some point.) I've removed Actra entirely, and made the UI have to do a lot less stuff every time it boots, I hope this reduces the crashing.
 
OSA now saves the bindings and few config options with your game which makes it not have to load and set up so much everytime. The one drawback is laptop mode is going to be a bitch since there isn't a way to assign the keys if you can't access the keys, (The keys are set up once now and only setup again when you rebind them) I don't want to add all the mcm overhead just to avoid this so I've added a hard reset key that every keyboard would have that puts the keys somewhere not optimal but at least in a place any user can reach.
 
Since OSA and OSex are separate the main menu now has library where all installed modules go. You'll open the main menu > library > click OSex > Bind  to bind it to a key (It will be an entry in the list once you have it installed.) You can also cast modules directly from the library if you don't want to bind them, this allows for NPC NPC scenes as well. (Without AI still NPC NPC scenes don't do anything except pose BUT I've added observer mode which you can reach from the inspect menu that allows you to gain access to the controls for an npc npc scene. 
 
Added a few of the more universal things from my OMenu project into it: MyEquip and MyAnim, which both are totally optional. If you want to use them the script can load up an XML document which is user made that categorizes your equipment and allows you to equip it from an easy menu, as opposed to having lots of treasure boxes and console equipItem etc. MyAnim functions the same way only it plays animations by ID. Built in poser mod functionality basically. You don't have to use them if you don't want. The user defines the categories, and groupings and names etc, these are just a simple display of the xml that allows animation or equipping on selection.
 
Full notes on OSA here:
 
Posted

Man these are the best animations/UI for skyrim ever IMO. Thank you CEO you rock.

 

I'm very interested in the 0SBODY. Is it released? Is there any ETA on its release?

 

 

Posted

Man these are the best animations/UI for skyrim ever IMO. Thank you CEO you rock.

 

I'm very interested in the 0SBODY. Is it released? Is there any ETA on its release?

 

Thanks!

 

No, OSBody is obsolete now. I've replaced it with a small script based version that's a lot easier to manage. It will be built into OMenu if I finish that. BodySlide makes OSBody have no point for most users as OSBody takes 3DSMax skills to be able to shine and it can't do to much extra ontop of Bodyslide. OMenu will have the scripts incorporated if users do want to try a similar setup. I've put all the user friendly features from OMenu into OSA, but the more advanced niche stuff, texture replacing, OBody, Adaptable equipment and _oOutfits will stay in OMenu since I'm most likely the only person that would use any of that stuff.

Posted

 

 

bool firstScale = true

 

Event OnBodyScale(string eventName, string zType, float zAmount, Form sender)

actra.setScale(zAmount)

if firstScale

firstScale = false

utility.wait(1.0)

actra.setScale(zAmount)

endif

EndEvent

 

Anything less then 1 second seemed to be unreliable, from my tests it appears there is a kind of window that they are scale immune in.

 

 

Unless it's being used in a way I don't remember, MoveTo should only be firing on NPCs that are sitting or sleeping and never on the player. It would definitely auto-scale them to natural by virtue of getting them out of the RaceToScale furniture (which is the point). However, the problem was persistent on NPCs that were not using RaceToScale furniture, so MoveTo shouldn't have been getting fired at all.  And if MoveTo was the cause, I can't think of a logical reason this would only come into play for female/male scenarios.

 

During my own testing, sometimes hitting the arrange twice did not fix it.  Sometimes, each arrange just made it progressively worse.  If the problem was timing (animation or script queue), then your change should solve it.  If not, I don't know.  I'd like to test the snot out of it.

 

 

Next build is almost complete:

I've broken out OSA from OSex and will release OSA on the first of next month as a separate thing. I've finished a majority of the core OSA stuff like Main Menu, Inspect Menu etc. Keys are all binded in the Main Menu as well as all config (Except ESG which is still in the .xml but I will move that too at some point.) I've removed Actra entirely, and made the UI have to do a lot less stuff every time it boots, I hope this reduces the crashing.

I wonder how this will effect the API. Currently, I know OSex is installed because I can getformfromfile on OSA.esm.

 

OSA now saves the bindings and few config options with your game which makes it not have to load and set up so much everytime. The one drawback is laptop mode is going to be a bitch since there isn't a way to assign the keys if you can't access the keys, (The keys are set up once now and only setup again when you rebind them) I don't want to add all the mcm overhead just to avoid this so I've added a hard reset key that every keyboard would have that puts the keys somewhere not optimal but at least in a place any user can reach.

Good. I'm wondering. Couldn't you keep the default bindings in an INI file and offer an optional download that overwrote that INI file with bindings for laptops with no numpad?

Posted

 

 

Thanks Migal,

I'll post soon, to test. Not quite sure now that I think about it more if MoveTo has anything to do with it. For now all I know is there's some Skyrim magic at play, the moveTo would occur if the start scene was started somewhere else then the player's location but this wouldn't be the case like you mentioned. Maybe it's the translateTo. I'll look into it more later to figure out what's up but this seems to be working 100% for now.

 

For the API question. I've added this function: 

 

osa.moduleExists("0Sex") 

 

bool function moduleExists(string osaModuleID) global
If UI.GetInt("HUD Menu", "_root.WidgetContainer."+(Quest.GetQuest("0SA") as _oOmni).glyph+".widget."+osaModuleID) == 1
return true
else
return false
endIf
endFunction

 

 

which will return true if the OSA module is installed "0Sex" in this case. However this is going to be baked into the osex.start function which returns false if it fails to have everything it needs so you can leave out all the checks and just do:

 

if(osex.start(actor1, actor2)

;things to do if it starts

else

;thing to do if the scene can't start

endIf 

 

-----------------------

 

there's also

 

osa.exists() which will return true or false if the UI itself is installed.

 

bool function exists() global
If Quest.GetQuest("0SA")
return true
else
return false
endIf
endFunction

 

--------------------------------------------------------

 

For key idea:

Yea I could do that, and might it's a good idea. It would be more loading on loadgame to get the ini in. I'm trying to clean that out almost entirely to make sure OSA is doing as little as possible on load. I'd also worry that the ini is to advanced to use for some users, for example I believe there is a key on almost all lap tops that put the numpad somewhere on the letter keys, like a numlock kind of thing ( in the UIOP section) but that's to advanced also, so any solution here has to be for the most primitive computer interaction possible.

Posted

During my own testing, sometimes hitting the arrange twice did not fix it.  Sometimes, each arrange just made it progressively worse.  If the problem was timing (animation or script queue), then your change should solve it.  If not, I don't know.  I'd like to test the snot out of it.

 

...

 

Good. I'm wondering. Couldn't you keep the default bindings in an INI file and offer an optional download that overwrote that INI file with bindings for laptops with no numpad?

 

 

 

--------------------------------------------------------

 

For key idea:

Yea I could do that, and might it's a good idea. It would be more loading on loadgame to get the ini in. I'm trying to clean that out almost entirely to make sure OSA is doing as little as possible on load. I'd also worry that the ini is to advanced to use for some users, for example I believe there is a key on almost all lap tops that put the numpad somewhere on the letter keys, like a numlock kind of thing ( in the UIOP section) but that's to advanced also, so any solution here has to be for the most primitive computer interaction possible.

 

 

Arrange was all random for me too during 1.082 alpha testing. Scaling would sometimes get better and sometimes worse.

 

About key setup that is not on numpad you can use the one from my signature. Its pretty much same as original 0sex so maybe more familiar to ppl.

Posted

osa.moduleExists("0Sex") 

 

bool function moduleExists(string osaModuleID) global

If UI.GetInt("HUD Menu", "_root.WidgetContainer."+(Quest.GetQuest("0SA") as _oOmni).glyph+".widget."+osaModuleID) == 1

return true

else

return false

endIf

endFunction

It's going to have to be this one for me and I'll have to call it during game load. GetFormFromFile causes papyrus log errors when the file you're testing for isn't there. I don't want errors spammed throughout game play, so I test for the file during game load, set a global to 0 or 1, then never test again. I can alter my current code to also run that function in order to get a positive result. Not a big deal, unless the function can't be called that early for some reason.  I'm wondering if the UI will be available that early.

 

Not all implementations can practically test for OSex existence during scene starting code.

 

if(osex.start(actor1, actor2)

 

Something like Amorous Adventures could be written to use a fade to black if OSex isn't installed, so the check can happen after the dialogue is triggered.  Other mods, like my own, will only have dialogue options to fire OSex if OSex exists.  Which means the existence of the mod has to be a condition setting in the INFO.  The global I set during game load serves this purpose.

 

For key idea:

Yea I could do that, and might it's a good idea. It would be more loading on loadgame to get the ini in. I'm trying to clean that out almost entirely to make sure OSA is doing as little as possible on load. I'd also worry that the ini is to advanced to use for some users, for example I believe there is a key on almost all lap tops that put the numpad somewhere on the letter keys, like a numlock kind of thing ( in the UIOP section) but that's to advanced also, so any solution here has to be for the most primitive computer interaction possible.

 

I wouldn't add anything to game load at this time if I were you. It's better to get anything you can out of there for the next release.

 

If you absolutely don't want to use an MCM or INI, there's another possibility. You could add a main menu option (right side) to swap keybindings for laptops with no numpads. Just store the two different binding sets in your code. I'm imagining something similar to Arrange, except for lack of a better term, it would be Keyboard Arrange.  Edit:  It just occurred to me that this won't work.  How will the laptop user press num-enter to reach the right menu and thus swap binds if they don't have a num pad.  Doh!  I suppose you could make the binding swap trigger off a single key everyone has.  Maybe right-ctrl as a toggle?  I dunno.

Posted

 

 

I see what you mean Migal,

 

On load the UI has no idea what's installed. It will start, then event the papyrus to gather some info for it, which includes scanning the _install folder to get an array of the plugins installed. The ui takes the list and figures out what's up so even if the UI is loaded it wouldn't be aware for another few seconds after all the quests get rolling. An on game load thing would go through before the UI has the info.

 

If we did a utility.wait it's still might not catch it depending on how clogged up a user's papyrus is. 

 

The easiest solution would be to send out a modevent when everything is set that mods can listen for and set up from there. However if your whole thing is waiting on this information to get started it might not be ideal. Doesn't sound like it though since it appears you're using it as a toggle for dialogue after the player initiates talking, so it might be fine coming in as a mod event. I can't really see another way to confirm if 0Sex is installed. Let me know if that wont work and I'll see what else I can come up with.

 

Something like this:

 

Event onOSA()

if osa.moduleExists()

Global Variable = 1

endIf

EndEvent

 

You might be able to replace the formGetFile with a:  If Quest.GetQuest("0SA")   which I believe is faster since formGetFile might take a frame to output and seems more errorprone but maybe there are issues where the quest can still be around even if the esm isn't (I'm not sure entirely).

 

I've actually been wondering about this from a checking sense because I'm not sure what will happen under these circumstances:

 

 

 

The osa.exist checks using Quest.GetQuest("0SA") however if osa isn't installed hense osa.psc isn't installed would that still return false? (Not entirely sure) I might just start recommending that ( If Quest.GetQuest("0SA") ) be used instead since it wouldn't have to rely on my global script. Not really sure how much that would be needed even because I imagine for most cases like yours the installation of OSA is irrelevant and they would be targeting a specific module instead like 0Sex.

 

 

Let me know if the event solution doesn't work for you and I'll see what else can be done but I'm not really seeing any other way at the moment. 

------------------------------------------

 

On the keys that's the issue exactly that I'm facing. Rebinding is on the right side menu now and key.ini has been removed (Main Menu, you'll see in the next version all the menus are there now and fleshed out) . However it needs the keybinds to navigate the main menu. So if the user can't use the OSA keys they can't navigate the menu to rebind their keys.

 

For now I have F8 as the emergency OSA key. If you hold it down for 5 seconds it rebinds all the keys to around the wasd using wasd as the dpad so at least they can get to the menu and set things up better. It's kind of an obnoxious place to put them since it overlaps movement keys making it a little weird to reset them up, but I've had a few users tell me in the past they dont' have a dpad either so that's the only thing I could see that everyone is going to have.

Posted

 

The easiest solution would be to send out a modevent when everything is set that mods can listen for and set up from there.

 

The easiest solution is to include an esp file with OSex that has only one record in it, the record to be used in GetFormFromFile.  The lightest record would probably be a global that never gets used for anything.

 

The vulnerability here would be people mod merging OSex.esp into OSA.esm.  But, that's a GetFormFromFile vulnerability with any mod.

Posted

 

 

I see the point in the applications you are using it. Perhaps the only reason a mod developer would implement an onload event is to track if an OSA module is installed if they are using it like you to set dialogue flags, which seems efficient and a good way to do it.

 

I like the simplicity as it is now where modules can go in with no esp whatsoever and feel it makes an easy step for developers and installation as well as keeping the esp count down, (although considering my tempertantrums, according to me OSex might be the only module we ever get.) However if this comes at the cost of forcing mod developers to set up load events and put more strain on game load just to detect a module it's not worth it.

 

Thinking outloud:

 

The issue with the mod event is you'd have to check every time. If OSex was uninstalled and the user started a game the global variable would still be set to 1 so it would need to set it to 0 at the start everytime then wait for OSA to respond that it does exist and set it to 1. I imagine any mod that adds dialogue would require a quest, so the ground work is there but it would still need to add strain onto stuff that happens on load. let's say OSA became magic insane popular and had 100 mods, all 100 would be prompting checks of global variables at load might be a lot of pressure idk.

 

Proposal:

 

- I'll send a mod event when the UI finishes registering all Plugins / Modules. Developers can connect to this if it suits them.

- I want to look into something applicable like your mentioning and think about including an esp with 0Sex and advise modules that apply to dialogue to do the same. 

 

The question is this, maybe you can help me understand because I don't work with Dialogues really so I don't have a lot of experience. The Conditions menu would still need a specific reference that the CK can locate to assign, even if we did include a global variable for 0Sex it would then require the developer to master the 0Sex esp. Part of what i wanted to do was let developers optionally use modules to add animation but not have to dictate they requiring their users to install them, so if 0SA is around it can benefit the scenes but they don't have to isolate user groups from their mod that are scared of 0SA which I'm sure is highly possible since there's people that refuse to use SKSE and FNIS even etc.

 

I'm looking through the conditions under dialogue now for something we can use to get around this but so far it seems like we're either looking at requiring mastery or the mod developer would need their script to detect 0SA's global variable outside of the dialogue menu and set their own global variable like you are doing now.

 

Having it require mastery is something I'd like to stay away from but will do it if it's causing major problems, however if the variable has to be set in a script outside of dialogue anyways then most likely the mod event will do the trick and be quicker then requiring an esp.

 

Any ideas on loopholes to get something persistent to align with the condition flags? I use things like factions etc. to get around some limitations of those things but I don't see a way so far of influencing the dialogue flags.

 

-----------

 

I agree it would be very simple and elegant  if a mod developer could simply set a dialogue flag and have it all be done. If we can't find a solution to working around mastery with Dialgoue conditions then: Due to 0Sex's scale as a module, almost certainly maybe, it will forever be the largest OSA module I'll most likely take at least part of your suggestion and add a .esp to OSex. If a developer feels mastery of osex to access the global variable outweighs isolating some their userbase then they can master 0Sex, if they don't want to do that they can hook on to the mod event, or use the osa.exists(), osa.moduleExists() functions.

Posted

Here's an example of MyOSA also to give people an idea so they can find it if they are interested:

 

MyOSA is simple parts of my oMenu project that had application for all users without extra setup. Those sections I decided to just put into OSA because I think they would get some use for some and have no foot print unless you turn it on and use it. MyOSA is completely dependent on the user to fill in, I'm just providing a simple menu panel to display and apply what you put into.

 

It's a small script that's meant to be able to construct menus from endless amounts of xml. The main idea here is that MyOSA has two types of data "Entry" or "Tier"  Entry is something you would click to apply, for example an equipment entry would equip that item to the target, an Animation entry would make the target play that animation. Tier is a folder you can put more entries in a folder or folder within folders to organize your animations or equipment however you want.

 

Styling:

I'm not doing any styling by default but optionally you can style them up however you want, you can set border color, fill color, font color, line thickness etc. and you can use any icon image available in OSA as an icon and you can define their halo.

 

You can also set them to a square in which you can then also define their hover color, fill, thickness etc. 

 

Tier's and Entries will be styled the same by default but you can break them out however you want to differentiate. As you can see in this example I've styled the Tiers as filled in squares and the circles for the entries.

 

tumblr_o98fwoVC1x1ubnr1mo2_r1_1280.jpg

 

Creating a MyOSA document: Varies slightly by type.

 

--------------------

 

Equipment: Example of the required fields:

 

<entry n="Wolf Bikini Cuirass" fo="00A68A" s="32" m="OS.esp"/> 

 

n= name  | fo = formID  | s = Slot | m = mod it's from

 

you can get this data by help "Wolf Bikini Cuirass" into console while in game.

 

----------------------

 

Animation are quicker:

 

<entry n="Push Ups (F)" id="FemaleDoingPushUps" /> 

 

 

Both types share the same styling, I'll go more into this later but here's an example that makes the grey boxes shown above with an icon:

 

<tier1 n="Bikini Plate Sets" sh="sq" sth="4" i="ome_a_intlow_f" slc="FFFFFF" sb="e86570" b="BBBBBB">

 

there's just a few cryptic flags you'd have to lookup

 

t= additional flavor text displayed at the bottom, for color variations patterns mainly | b= fillcolor | lc = linecolor | th = thickness | i = icon | h = halo | sh= shape(for square) sb, slc, sth are for square shapes when hovered over.

 

------------------------------------------------------

 

Example of a MyOSA document:

 

<global id="myskyrimcollection"/>
 
<tier0 n="My Favorite Stuff">
<entry n="Wolf Cuirass" fo="00A68A" s="32" m="OS.esp"/> 
<entry n="Wolf Bikini Cuirass" fo="00A68A" s="32" m="OS.esp"/> 
<entry n="Platform Daedric PowerHeels" fo="00A68A" s="32" m="OS.esp"/> 
<entry n="Daedric Crown" fo="00A68A" s="32" m="OS.esp"/> 
<entry n="Excalibur" fo="00A68A" s="32" m="OS.esp"/> 
 
<tier1 n="Bikini Plate Sets" sh="sq" sth="4" slc="FFFFFF" i="cimaj_equipment01_bw!a" sb="e86570" b="BBBBBB">
<entry n="Iron Cuirass" fo="00A68A" s="32" m="OS.esp"/> 
<entry n="Iron Bikini Cuirass" fo="00A68A" s="32" m="OS.esp"/> 
</tier1>
</tier0>

 

-----------------------------

 

As you can see everytime you want to step up a folder you add 1 to the tier   tier1 are folder divisions within tier0 etc. tier2 would be inside tier1. MyOSA is just a script to assemble and display this format of XML and the ability to tell papyrus to do stuff when you select something.

Posted

The issue with the mod event is you'd have to check every time. If OSex was uninstalled and the user started a game the global variable would still be set to 1 so it would need to set it to 0 at the start everytime then wait for OSA to respond that it does exist and set it to 1. I imagine any mod that adds dialogue would require a quest, so the ground work is there but it would still need to add strain onto stuff that happens on load. let's say OSA became magic insane popular and had 100 mods, all 100 would be prompting checks of global variables at load might be a lot of pressure idk.

Not an issue with GetFormFromFile used during game load. It sets the global correctly every time the game is loaded. And I wouldn't be worried about the 100 add-on mods scenario. Nobody is going to make a mod that hunts for 100 other add-ons. Maybe five, tops. OSex is so complete in terms of animations most dialogue-driven implementations like Amorous Adventures wouldn't need more than it.

 

- I'll send a mod event when the UI finishes registering all Plugins / Modules. Developers can connect to this if it suits them.

I'd have to see the mod event implemented before knowing if it could be used instead of GetFormFromFile. The problem is, when? When does the mod event fire? What fires the mod event? How can we guaranty it happens before anyone tries to initiate a scene through our mods? That goes for any event, not just custom mod events. The only events we can really rely on for this purpose are those that fire as a result of the game loading.

 

I'm looking through the conditions under dialogue now for something we can use to get around this but so far it seems like we're either looking at requiring mastery or the mod developer would need their script to detect 0SA's global variable outside of the dialogue menu and set their own global variable like you are doing now.

OSA doesn't need a global variable.  Mod makers can make their own globals.

 

 Any ideas on loopholes to get something persistent to align with the condition flags? I use things like factions etc. to get around some limitations of those things but I don't see a way so far of influencing the dialogue flags.

I have done hundreds of dialogues using a wide variety of conditions including factions, inventory tokens, globals, locations, cells, almost anything you can imagine. In the end, they all have one thing in common. There has to be a way to set those things so the conditions work. This requires an event or function call forced by the player.  Dialogues and spells can fire functions and events.  In an abode mod, you can use scripted triggers and xmarkers to fire events.  But, what if you don't want the dialogues or spells to be available unless you already know OSex is there?

 

Essentially, what we're talking about is just an aspect of the game itself.  Skyrim events can be described in two ways:  Those that happen during game load and those that happen because the player did something.  Unless someone wants to create a dialogue or spell that checks to see if OSex is installed (bye-bye immersion), we need it to happen during game load.

Posted

 

 

 

Would something like this work:

 

event onTheOnLoadEvent()

registerformodevent("OSA_OStart")

myGlobalVariable.setTo(0)

endEvent

 

event OnOStart()

if osa.moduleExists("0Sex")

myGlobalVariable.setTo(1)

else

myGlobalVariable.setTo(0)

endIf

unregisterformodevent("OSA_OStart")

endEvent

 

In this case OSA_OStart would be sent from the UI after it finishes looking at the _install array and trigger within a few seconds of the fade from black after a load screen everytime after a game load. The mod event would be triggered by OSA's load event which does a small chain of OSA things then would send the event upon completion.

 

You could prob just register for OSA_OStart in the init to simplify things also.

-----------------------------------------------------------------------

 

As opposed to:

 

event onTheOnLoadEvent()

int has0Sex = (game.getFormFromFile("09213A" "OSA.esm") as globalVariable).Get()

if has0Sex == 1

myGlobalVariable.setTo(has0Sex)

else

myGlobalVariable.setTo(0)

endIf

endEvent

 
 
----------------
 
They seem relatively the same overall but the first doesn't need an esp per module to function. Timing will be relatively the same, maybe 1-2 seconds difference. The question is if that's enough to warrant making every module that plugs into OSA require an esp.
Posted

Would something like this work:

 

event onTheOnLoadEvent()

registerformodevent("OSA_OStart")

myGlobalVariable.setTo(0)

endEvent

 

event OnOStart()

if osa.moduleExists("0Sex")

myGlobalVariable.setTo(1)

else

myGlobalVariable.setTo(0)

endIf

unregisterformodevent("OSA_OStart")

endEvent()

 

In this case OSA_OStart would be sent from the UI after it finishes looking at the _install array and trigger within a few seconds of the fade from black after a load screen everytime after a game load. The mod event would be triggered by OSA's load event which does a small chain of OSA things then would send the event upon completion.

If that's all code run by OSA.esm, then the only benefit is a global and it would only benefit slaved mods.

 

If, OTOH, we're supposed to run the event in our own mods, where would we put the OnOStart() event? Is OnOStart() inside a script class that extends something?  And would it make sense for us to script an event if we don't know the mod that creates the event is loaded?  I haven't tried it, but I believe that would probably produce a compile error.

 

You could prob just register for OSA_OStart in the init to simplify things also.

-----------------------------------------------------------------------

 

As opposed to:

 

event onTheOnLoadEvent()

int has0Sex = game.getFormFromFile("09213A" "OSA.esm") 

if has0Sex == 1

myGlobalVariable.setTo(has0Sex)

else

myGlobalVariable.setTo(0)

endIf

endEvent

That's approximately what I was doing in OnGameReload before OSex was split away.

 

If I understand what you're trying to do, you're looking for ways to remove the modder's responsibility regarding discovery of OSex's presence in favor of some kind of method attached OSA.esm that essentially announces OSex's presence for them?  For unslaved mods, we would still need to make sure OSA.esm was there with GetFormFromFile, so I'm not really sure it makes a difference. Either we're checking for OSA.esm or we're checking for OSex.esp. I don't think modders are going to call an API function for a mod if they can't be sure the mod is loaded. That could throw errors.

 

Certainly, I could use an SKSE file utility to read the disk and hunt for the OSex plugin myself, but now my mod is dependent on the SKSE file utility, whether OSA/OSex is installed or not.

 

I'm also not sure I've been clear in my termniology.  By "global," I mean a global variable you create with the global form in the CK.  They can't be booleans or strings, so you set them as ints with 0 meaning false and 1 meaning true.  You call them in code like theGlobal.SetValueInt(1) and theGlobal.GetValueInt().

Posted

 

 

 

Sorry I think I'm being confusing Migal,

 

this would go in your script. TheOnLoadEvent represents the event you are using now that is triggered on load. The OnOStart would go in that same script that has your load event. (It would look exactly like this in the script.

 

** This would all go in your script just like this

 

event onTheOnLoadEvent()  <---------------- (This is the event you are currently using for your load event. I'm assuming it's the MCM parent onload you showed me.)

registerformodevent("OSA_OStart", "OnOStart")  <-------- Now you will receive the event in this script. (Sorry i forgot to put the OnOStart)

myGlobalVariable.setTo(0)          <-------- This is the global variable you are checking dialogue against that exists in your esp.

endEvent

 

event OnOStart()   <----------------- This is in your script too we registered for it in the load event. The UI will send this event when it's ready.

if osa.moduleExists("0Sex")

myGlobalVariable.setTo(1)

else

myGlobalVariable.setTo(0)

endIf

unregisterformodevent("OSA_OStart")

endEvent

 

No extending or anything is needed that will all go through just as is. You're registering to listen for the event in your load event so will definitely receive it, events that are created with papyrus can be received by any script that's running (They are global like that) as long as a script it listening for it they will receive it. The base events built into papyrus like onUnequipped, onAddItem those things are special and only go to forms that are registered for them. User made events sendModEvent("OSA_OStart") for example can be heard by any script that is running and listening for it.

 

I use them for a lot of bypassing papyrus stuff like having 2 different spells talk to each other (actro and actra) etc.

 

-------------------------------------

 

osa.moduleExists("0Sex") is the problem i think you are referring to by checking a script that might not be installed. I see what you mean and I'd be worried about that too. 

 

You'll have to use the interior of it directly: This is all basic SKSE stuff from here, as long as SKSE is installed it will work: You'll get a 0 if OSA isn't installed or if OSex isn't installed.

 

If UI.GetInt("HUD Menu", "_root.WidgetContainer."+(Quest.GetQuest("0SA") as _oOmni).glyph+".widget."+osaModuleID) == 1

 

It does have one major problem that I can see which I know you know, but it's more of just a nuissance for the developer which is that compiling UI scripts are a bitch and take extra set up + downloads. I'm not sure if that extra setup will apply to this, it might only apply if you are extending the SKI_WidgetBase, hopefully it doesn't.

 

------------------------------

Cleaned up conclusion. This most likely will be the most efficient: Doesn't depend on anything (external scripts etc.) 

If anyone else is reading this you will need the osa papyrus in your scripts folder to compile it (since i'm calling _oOmni) but it wont be needed at runtime, it would just make it return a 0. The event will never be received anyways if 0SA isn't installed since it's sent from the UI so your global variable would stay at 0.

You might need to download the SKYUI widget UI source if it's throwing up weird UI related compiling errors.

 

event onTheOnLoadEvent()

registerformodevent("OSA_OStart", "OnOStart") 

myGlobalVariable.SetValueInt(0)

endEvent

 

event OnOStart(string eventName, string stringArg, float floatArg, Form sender)  

if UI.GetInt("HUD Menu", "_root.WidgetContainer."+(Quest.GetQuest("0SA") as _oOmni).glyph+".widget."+osaModuleID) == 1

myGlobalVariable.SetValueInt(1)

else

myGlobalVariable.SetValueInt(0)

endIf

unregisterformodevent("OSA_OStart")

endEvent

 

 

Sorry, I'm on the same page with you on globalVariables I know they need special functions to use like .setTo but I can't recall exactly what the format was and creationkit.com has been barely functioning for me since it got the Fallout 4 section. You are right on with what I'm trying to do, basically I want to escape from Mastering / slave esps to allow for flexibility for the developer and the user. So OSA can be an accent if the user has it but things can go down without it also. It is a setup where you'll access it with no mastery / extending, but does need something like this to serve as a flag that it exists.

 

The above solution is basically checking the 0SA quest and then the 0Sex module, but I think it's beneficial since I don't see much gain at the cost of potentially adding lots of esps to users load orders (if many osa modules come to be.)

 

At this point:

 

if UI.GetInt("HUD Menu", "_root.WidgetContainer."+(Quest.GetQuest("0SA") as _oOmni).glyph+".widget."+osaModuleID) == 1

 

is a bit more intimidating looking then

 

if game.getFormFromFile("AE329" "OSA.esm")  as globalVariable

 

but serve the exact same purpose and do the same results of basically returning true if installed false if not.

Posted

So, three possible event types:
1. Game load events.
2.  Player triggered events.
3.  Actionscript UI triggered events.
 
We're talking about the modder relying on 1 and 3 for OSex discovery, correct?
 
I create a quest called OSAListeningQuest.  It exists solely for the purpose of housing a script with the OnOStart() event inside.  It's job is nothing more than waiting for the UI to return that event when it's ready.  The quest would have to be start-enabled in order for its script to work.  Start-enabled quests don't actually start enabled since Skyrim 1.7 unless one creates an SEQ file, so I would need another trigger back in my original game load event to launch the quest.  Compare that to what I was doing previously:
 

GlobalVariable Property LSOSARunning Auto
 
event OnGameReload()
   parent.OnGameReload()
   debug.trace("=== BBLS is checking for the presence of compatible plugins.  IGNORE missing file warnings. ===")
   OSApresent = Game.GetFormFromFile(0x00000D62, "OSA.esm")
   if OSApresent
      LSOSARunning.SetValueInt(1)
   else
      LSOSARunning.SetValueInt(0)
   endif
   debug.trace("=== BBLS is finished checking for compatible plugins. ===")
endEvent

What you're proposing still requires a variant of that, but it also requires a whole lot more.

 
 

Sorry, I'm on the same page with you on globalVariables I know they need special functions to use like .setTo but I can't recall exactly what the format was and creationkit.com has been barely functioning for me since it got the Fallout 4 section. You are right on with what I'm trying to do, basically I want to escape from Mastering / slave esps to allow for flexibility for the developer and the user. So OSA can be an accent if the user has it but things can go down without it also. It is a setup where you'll access it with no mastery / extending, but does need something like this to serve as a flag that it exists.

 
This is literally why Bethesda created GetFormFromFile, so mods could be accessed without being masters.  It's how Bethesda does it in its own DLCs, so they know if other Bethesda DLCs are present.

 

I can understand you not wanting animators to have to make one record ESP files to go with their animations and xml.  But, also understand that API users don't want the wheel reinvented with spokes added.  Neither is a particularly attractive option, but I don't know of a way to avoid both.

Posted

Ok I found a source for the Havok stuff but now can't find 3DS max 2012 so I'm going to try following your guides with 2014 and its bits ^o^

Posted

 

 

 

Sorry if I'm misunderstanding: It could all just live in one script the exact same way you're doing now. Just would need to add a second event to get notified when the UI is ready. This will work without any tweaking, can just paste it in place of where OnGameReload is now:

 

---------------------------

 

GlobalVariable Property LSOSARunning Auto

 

event OnGameReload()

   parent.OnGameReload()

   debug.trace("=== BBLS is checking for the presence of compatible plugins.  IGNORE missing file warnings. ===")

   registerformodevent("OSA_OStart", "OnOStart") 

   LSOSARunning.SetValueInt(0)

endEvent

 

event OnOStart(string eventName, string stringArg, float floatArg, Form sender)  

if UI.GetInt("HUD Menu", "_root.WidgetContainer."+(Quest.GetQuest("0SA") as _oOmni).glyph+".widget.__0Sex") == 1

 LSOSARunning.SetValueInt(1)

else

LSOSARunning.SetValueInt(0)

endIf

unregisterformodevent("OSA_OStart")

debug.trace("=== BBLS is finished checking for compatible plugins. ===")

endEvent

 

-------------------------------

 

OnGameReload it reverts the global variable to 0 (in case it was uninstalled) will start listening for OSA being ready, When it catches that event it will set the global value according to if 0Sex exists or not.

 

To explain the long UI part it's entering something like this:

UI.GetInt("HUD Menu", "_root.WidgetContainer.1.widget.__0Sex")

 

Skyrim has a few vanilla UI overlays HUD MENU is the one everything SKYUI added attaches to. The rest is just action script properties, actionscript can have properties in properties like MyPeople.Friends.Name.Nickname. widget is the base level SKYUI assigns to every new UI so it's looking in the main file of my UI for the value of the property named __0Sex. If it finds nothing it will return a 0 regardless if my widget exists or not. 

 

 

Posted

Having a really hard time following this technical talk. Not really sure what you are trying to do beside having the ability for other mods to recognize if 0sex is installed. What ill say could be bunch of nonsense but here i go :D

 

Quests are saved inside save games if im not mistaken. So Is it possible for 0sa to start a quest - not the type of a quest that will be in players journal but similar type of quest that ppl use for dialouges. IF the quest is started then it means 0sa is installed and scripted mods can check it easy. 0sa can then have built in function to check for its modules so ppl can use that function to find what they need. Im a noob but dont see the need for esp or bunch of on-load events from 0sa side with this approach (if its possible).

 

Posted

Having a really hard time following this technical talk. Not really sure what you are trying to do beside having the ability for other mods to recognize if 0sex is installed. What ill say could be bunch of nonsense but here i go :D

 

Quests are saved inside save games if im not mistaken. So Is it possible for 0sa to start a quest - not the type of a quest that will be in players journal but similar type of quest that ppl use for dialouges. IF the quest is started then it means 0sa is installed and scripted mods can check it easy. 0sa can then have built in function to check for its modules so ppl can use that function to find what they need. Im a noob but dont see the need for esp or bunch of on-load events from 0sa side with this approach (if its possible).

 

The issue is about how OSA is now separate from OSex. Your idea would work prior to this. You could Quest.GetQuest("0SA") to see if it's installed. 

 

The problem now is that OSA is installed but it could have many modules installed for it like OSex all at once. Migal's dialogue in his mod relates exclusively to 0Sex being installed so he doesn't care if 0SA is installed but does want to know if 0Sex is installed.

 

----------------------------------

 

The only way to know if it is installed is to use an onLoad event like we're talking about, without it he would have to master 0SA and 0Sex which would cut down the people that would be willing to use BBLS by a large amount if they are scared of OSA.

 

We're debating requiring every module for 0Sex to have an esp that holds a property to check onLoad for it vs registering for an event that gets notified when information is ready. OSA does assemble a list of what's installed but it takes a few seconds to put all the information together. If a mod goes right onLoad to see if things are installed it will get nothing because OSA isn't ready yet. 

 

With the extra event they have to wait a few seconds to be notified via event and modules don't need an esp, with the esp approach they have the information available right away but every module will need an esp.

Posted

Ok but since he knows that 0SA is installed then he can run 0SA function to search for installed modules and see if he has 0sex installed?

 

Unless he really doesnt want to use/wait for OSA in which case: whats the difference between having bunch of .esp vs bunch of  .osmod files?

 

If he needs some info then this seems like a perfect oportunity to make .osmod files more usefull and not just empty.

 

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
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...