What does it mean when the actor is still wearing clothing during the animation? The animations otherwise play - but they're fully clothed? I am running the "Playable NPC Clothings" as well.
Thanks for the reply, and the mod! It works great! No issues installing or running it - at all. I would like to find a way to somehow automate the process without hopping into the console each time. I think macros and hotkeys might be a partial solution, but. . . I'm not very good at this modding stuff. So I'll probably have to wait and see what others may or may not create. Once again, thanks for the reply and the mod!
one question howdo i install this programm i am a newby with mod install i get in game only a text message that something is happening and nothing happens after that
I would recommend installing this mod with one of the commonly used mod managers: Vortex or Mod Organizer 2. Once it's installed along with the requirements, launch the game with sfse_loader.exe to start it with SFSE mods enabled.
Hey Snapdragon, awesome framework you built here. I played around with it a little and it works great. I found some little things that would round it off really well in my opinion:
A response (false/status code as int) from PlayAnimation()/StartSequence() to be able to tell if the animation failed to play (e.g. because the .glb file is missing).
A function to check if a specific .glb file is installed. (This would be very helpful since we can’t check that through papyrus.) Kind of makes the idea above obsolete but would be nice to have one of the two or both. :D
A function that returns all available animations (.glb files). (Again because this can’t be done in papyrus.)
A function e.g. IsInstalled() or GetVersion() that always returns true/version number as a proper way to check whether NAF is installed or not.
Anyways thanks for this awesome mod and keep up the great work!
Hey, thanks, glad you like the mod ^^ On the suggestions, there are some technical challenges which would prevent some of them from working:
#1 is not fully possible atm, due to multi-threading. When a script calls the PlayAnimation()/StartSequence() function, NAF lets its internal file manager know that actor A wants animation file B. Then, when it can get around to it, the file manager's worker thread attempts to load animation file B, and lets actor A know whether it was able to load it or not. It's set up this way to avoid hitches when waiting on the disk. I can work around this by making PlayAnimation()/StartSequence() latent, but script functions can't be safely made latent until SFSE adds co-save serialization (otherwise there's a risk of the Papyrus stack getting permanently frozen.)
Although, when using StartSequence(), you can register for the PhaseBegin event to know when an animation file has finished loading and begun playing. If the file fails to load, then the SequenceEnd event will trigger instead.
#2 and #3 are possible, will try to add those in some form. (In relation to #1, I could make PlayAnimation()/StartSequence() return true/false based on a simple "file exists" check, but in that case a value of true won't neccesarily guarentee the animation will play, as the file may contain malformed data.)
For #4, NAF can't really provide an IsInstalled() function itself, because if the NAF .pex file and/or .dll file is not installed, then the mod attempting to call NAF.IsInstalled() will error out and not execute anything after that call. GetVersion() can definitely be done though.
Thanks for the reply. I have some further remarks:
#1 Thanks for the explanation. You made me realize that I can just check if I receive the PhaseBegin event the correct number of times (once for each phase) and if I receive a SequenceEnd event before that I will know something went wrong and can handle the error. Also I can just always use sequences instead of PlayAnimation() so there is really no need for this to be implemented.
Not really necessary but you could add a PhaseFailed/SequenceFailed event that fires before SequenceEnd if an animation failed to play. (So lazy people like me don’t need to count PhaseBegin events. ;p) #2 / #3 Would be greatly appreciated. In my opinion a check if the file exists should suffice as it’s highly unlikely, that a user would have a corrupt .glb file in the NAF directory.
#4 Yes this should be totally possible! I tested it by calling GetSequencePhase() on the player. I’m happy to report that papyrus handles perfectly well if either NAF or SFSE (or both) are not installed. It returns “None”, throws an error but keeps executing.
So, by adding something like this to NAF.pex, we (other modders) could determine if NAF is installed and if SFSE is installed by simply calling NAF.isInstalled(). (There is the edge case where NAF.pex is installed but NAF.dll is not, but this is highly unlikely to occur.)
; Checks if NAF and it's dependency SFSE are installed. Returns: ; None => NAF.pex (this script) is missing ; false => NAF.pex is installed but SFSE or NAF.dll are missing ; true => NAF.pex, NAF.dll and SFSE are installed bool Function IsInstalled() Global If (IsSFSEInstalled()) Return true Else Return false EndIf EndFunction
; Utility function. Call IsInstalled() instead. bool Function IsSFSEInstalled() Native"IsSFSEInstalled()" would just need to always return true in your SFSE plugin for this to work.
This would be awesome as it would allow us to display a Message to the player in game with a specific reason (NAF not installed or SFSE not installed) as to why the mod is not working.
I have been struggling trying to install this mod. I installed it via Vortex, I have the CustomCommandFramework and the SFSE libraries also installed via Vortex. When I am in game the command NAF is not found. I followed the solution where you try to start the game with the sfse_loader.exe instead but it crashes instantly every time I try to load a save, can anyone help?
Please install the Trainwreck Crash Logger, which will generate a log at Documents\My Games\Starfield\SFSE\Crashlogs whenever a crash occurs, then upload the contents of the log as a new bug report on the "Bugs" tab of this page.
for the life of me i cannot get sfse and native animation framework to load in vortex. both files show in the mods but says there a rule conflict. i select naf to load first but when i click save it does nothing
For mod manager issues, I'd suggest visiting their respective support forums: MO2 Discord Vortex Support
I don't recommend manual installation, and won't be able to provide effective support if something goes wrong with a manual installation, but if absolutely neccesary, you can just drop the contents of the .zip file into your main game folder.
Not a Blender expert here, but how do you make multiple actors in a blend? It seems like I can highlight it all, duplicate it, and move it, but this seems to cause a lot of synchronization errors. I've noticed there's a dotted line for the root, to what makes me believe this has something to do with the alignment. I've tried removing it as a parent, but it makes the actor T-Pose. My only workaround for having more than one actor is to export the .glbs into two separate animations, then call them from a script. Then I go back to Blender and make small adjustments, export, test, make small adjustments, export etc. until the alignment seems close enough.
Create a new, empty Blender scene, then go to File -> Append, select the rig .blend file -> Objects, press A to select all objects then press Append. You can do this any number of times to get multiple characters in one Blender scene, then in the NAF Export Helper you can switch between their roots to export each one.
Note: For actors to align properly in-game, make sure you do not move their root node. You can move the COM node to move them around the scene.
Love this mod! Thanks so much for all your hard work Snapdragon. Question: is it possible to export body shapekey animations using morph.dat files from custom body mods such as CRT-Body Mesh or SFF Body Replacer? I know it’s currently possible to animate shapekey animations for the face when importing vanilla morph.dat files for the head mesh into a blender scene using the Blender Geometry bridge, however when trying to export any animated shapekey animations from a morph.dat file pertaining to the body of an aforementioned body replacer mod, the animated shapekeys/morphs don’t seem to work when playing the .glb animation in game. If NAF currently supports shapekey animation exports for a custom body just as it does for vanilla shapekey animations for the face, is there any chance anyone could please explain how? I’m hope I’m making sense! Happy to provide more detail if needed.
Atm it's not possible to animate body morphs. Internally, the game handles face morphs and body morphs very differently - face morphs are automatically re-rendered every frame and are unique to every actor, while body morphs are only re-rendered during character creation and are shared between actors with common appearances.
There is a way I can make the game update body morphs every frame, but there are potential performance implications with that which I need to look further into.
are there any known incompatibilities? i experience immediate crash on new game with this mod installed, but theres no log generating to actually send in. obviously im not being helpful but i dont have any other ideas than an incompatible mod.
No, there are no known incompatibilities atm. Do you have Trainwreck installed? It should generate a log in the <User>/Documents/My Games/Starfield/SFSE/Crashlogs folder upon a crash.
211 comments
I found some little things that would round it off really well in my opinion:
Anyways thanks for this awesome mod and keep up the great work!
Agreed that Snapdragon's work is awesome!
On the suggestions, there are some technical challenges which would prevent some of them from working:
#1 is not fully possible atm, due to multi-threading. When a script calls the PlayAnimation()/StartSequence() function, NAF lets its internal file manager know that actor A wants animation file B. Then, when it can get around to it, the file manager's worker thread attempts to load animation file B, and lets actor A know whether it was able to load it or not. It's set up this way to avoid hitches when waiting on the disk. I can work around this by making PlayAnimation()/StartSequence() latent, but script functions can't be safely made latent until SFSE adds co-save serialization (otherwise there's a risk of the Papyrus stack getting permanently frozen.)
Although, when using StartSequence(), you can register for the PhaseBegin event to know when an animation file has finished loading and begun playing. If the file fails to load, then the SequenceEnd event will trigger instead.
#2 and #3 are possible, will try to add those in some form. (In relation to #1, I could make PlayAnimation()/StartSequence() return true/false based on a simple "file exists" check, but in that case a value of true won't neccesarily guarentee the animation will play, as the file may contain malformed data.)
For #4, NAF can't really provide an IsInstalled() function itself, because if the NAF .pex file and/or .dll file is not installed, then the mod attempting to call NAF.IsInstalled() will error out and not execute anything after that call. GetVersion() can definitely be done though.
#1 Thanks for the explanation. You made me realize that I can just check if I receive the PhaseBegin event the correct number of times (once for each phase) and if I receive a SequenceEnd event before that I will know something went wrong and can handle the error. Also I can just always use sequences instead of PlayAnimation() so there is really no need for this to be implemented.
Not really necessary but you could add a PhaseFailed/SequenceFailed event that fires before SequenceEnd if an animation failed to play. (So lazy people like me don’t need to count PhaseBegin events. ;p)
#2 / #3 Would be greatly appreciated. In my opinion a check if the file exists should suffice as it’s highly unlikely, that a user would have a corrupt .glb file in the NAF directory.
#4 Yes this should be totally possible! I tested it by calling GetSequencePhase() on the player. I’m happy to report that papyrus handles perfectly well if either NAF or SFSE (or both) are not installed. It returns “None”, throws an error but keeps executing.
So, by adding something like this to NAF.pex, we (other modders) could determine if NAF is installed and if SFSE is installed by simply calling NAF.isInstalled(). (There is the edge case where NAF.pex is installed but NAF.dll is not, but this is highly unlikely to occur.)
; Checks if NAF and it's dependency SFSE are installed. Returns:
"IsSFSEInstalled()" would just need to always return true in your SFSE plugin for this to work.; None => NAF.pex (this script) is missing
; false => NAF.pex is installed but SFSE or NAF.dll are missing
; true => NAF.pex, NAF.dll and SFSE are installed
bool Function IsInstalled() Global
If (IsSFSEInstalled())
Return true
Else
Return false
EndIf
EndFunction
; Utility function. Call IsInstalled() instead.
bool Function IsSFSEInstalled() Native
This would be awesome as it would allow us to display a Message to the player in game with a specific reason (NAF not installed or SFSE not installed) as to why the mod is not working.
Documents\My Games\Starfield\SFSE\Crashlogs
whenever a crash occurs, then upload the contents of the log as a new bug report on the "Bugs" tab of this page.MO2 Discord
Vortex Support
I don't recommend manual installation, and won't be able to provide effective support if something goes wrong with a manual installation, but if absolutely neccesary, you can just drop the contents of the .zip file into your main game folder.
Note: For actors to align properly in-game, make sure you do not move their root node. You can move the COM node to move them around the scene.
There is a way I can make the game update body morphs every frame, but there are potential performance implications with that which I need to look further into.