THIS IS A WORK IN PROGRESS, IF YOU WANT THE ORIGINAL GUIDE, SCROLL TO THE COMMENT BELOW
Intro
This guide is for porting NWN2 creatures to NWN EE. The original guide was written by Discord Zetamog and was placed as a comment to a blank page. The original comment has been brought up and edited here.
Scope
This guide will cover porting NWN2 creatures to NWN EE with the scope of (a) using NWN2 animations and (b) upscaling the original textures to NWN EE's PBR texture maps.
Currently this guide is just for monstrous creatures who use unarmed attacks only.
OverviewAll credit to Symmetric for neverblender and Freshlook for NWN2mdk, and both for all their advice/just doing it all for me!!! ---
One thing to note before starting out
...
is that NWN2 models might have more complicated animations but appear to have fewer than
...
NWN EE ones, at least for creatures.
...
Overall however all of the key NWN1 animations can be fulfilled, with some adaptation. In general, NWN2 animations tend to be longer than NWNEE and in some cases the animation will be speed up for NWN EE. However the end results are generally reasonable.
NWN2 models are accompanied with GR2 (Granny) animations. When starting you will need to have the base NWN2 game and be able to search through the files and grab them.
You should do some background reading first, including:
For reference check out these pages:
NWN2 tools:
https://forum.neverwintervault.org/t/mdb-gr2-to-fbx-fbx-to-mdb-gr2-tools/348
Neverblender: https://
...
...
...
...
...
NWN EE Animations:
https://nwn.wiki/display/NWN1/Animations
Getting the right tools
In addition to owning the games, you will also need the below tools. Install them if you don't have them already.
- Blender (https://www.blender.org/download/)
- NWN2 Blender Addon and nwn2mdk (https://
...
...
...
...
...
- releases)
- NWN EE Blender Addon "Neverblender" (
...
- neverwintervault.org/project/nwn1/other/tool/neverblender-28)
- An image upscaler of your choice, such as Cupscale (https://github.com/n00mkrad/cupscale)
- A PBR map generation tool of your choice, such as ShaderMap (https://shadermap.com/home/)
Note on the NWN2 Blender addon: if you do not have NWN2 installed in the standard install path, the plugin has to be updated. If you have issues later importing an MDB file, make sure you update the config.yml file at C:\Users\[profile]\AppData\Roaming\Blender Foundation\Blender\[version]\scripts\addons\nwn2mdk.
Digging through NWN2 files
All of the files you need are in your NWN2\Data folder. Unzip all of the files so you can grab their contents easily using 7Zip or WinRAR or a tool of your choice.
It is probably also best to go into the NWN2 toolset and look at the creature you wish to convert. Look in the creature properties and get the model filename, which will help you find the files, such as "c_umberhulk".
If you search through the unzipped the files with a tool, like windows search, you'll start to see results. As you research the files you'll likely find the keyword that all the creature files share. Below is an example search:
At a minimum, copy all of the file types out to a working directory: MDB, TGA, DDS and GR2. You will also want WAV and SSF files if you need to make a soundset.
Import models and animations to Blender; setup
...
http://www.neverwinternights.info/cc_creatureanimation.htm
- Get blender + neverblender + nw2mdk from NWNVault
- You could animate the NWN2 model/MDB yourself or hook up some vertex groups to a NWN1 model and take the anims from that, but it’s probably easier to take the GR2 animation files from NWN2 and just animate the model with those. NWN2 base game models will already be animated obviously, and if you download MDBs that have no animations you should find they have super models in NWN2 they’re supposed to inherit their anims from, which are basically just base game models anyway.
- So you need to locate and extract those NWN2 anims. You can either find where NWN2 is installed and extract out all the zip files so you can go through them like usual or do this with nw2mdk. On Windows you use that through the command line. Type ‘cd [file path]’ into cmd to navigate to the folder it’s extracted into, then ‘start nw2fbx.exe [name of creature you want to take anims from]’ to run that program, creating a file in its folder called log.txt that has the filepath to the folder in your NWN2 install containing the model you want, and its GR2 animation files. You can just copy that lot out. You do want all the GR2 files.
...
Head to blender and import all the GR2s, and the MDB
...
in one go. That makes sure your MDB ends up with a usable skeleton.
...
The skeleton is the thing that animates the MDB skin. When you select all the GR2s and the MDB for import, one of the files you’re getting has
...
"skel.GR2
...
" at the end of its name. That’s the skeleton the
...
animations should end up copied onto when you import them. Only one can be imported at once though for some reason
...
, so when you did the batch import, you'll have only one on it at the time.
Clean up the model.
- Delete all of the objects of spheres named 'COLS'. Just right click these on the right hand list and click delete hierarchy.
- Inspect the creature mesh(s) and delete any LODs.
As a general note, to import a particular
...
animation, go back to the import menu and select both the "skel.
...
gr2" file and that particular GR2 animation file then hit import. A new skeleton model, separate from the creature mesh/skin model, should show up in blender with that animation on it. When trying to bring in more animations, do not forget to import the "skel.gr2" model with an individual animation file. You may have animations that look similar in name, so you might want to use this time to take inventory and also clean out duplicate animations.
First though, you should probably list out a map of the animations you’re going to
...
work with. It's best to do this in something like Excel or Google Sheets. At a minimum, you will want the below NWNEE animations and they need to be mapped. Read up on Animations very carefully for these.
| ca1slashl |
| ca1slashr |
| ca1stab |
| cappear |
| ccastout |
| ccastoutlp |
| ccloseh |
| cclosel |
| cconjure1 |
| ccwalkb |
| ccwalkf |
| ccwalkl |
| ccwalkr |
| cdamagel |
| cdamager |
| cdamages |
| cdead |
| cdisappear |
| cdodgelr |
| cdodges |
| cgustandb |
| ckdbck |
| ckdbckdie |
| ckdbckps |
| cparryl |
| cparryr |
| cpause1 |
| creach |
| creadyl |
| creadyr |
| crun |
| ctaunt |
| cwalk |
Finally, review all of your GR2 files that you will want to import. You should prepare to make a sheet with each animation, and, as you import them, record the location you placed them in the time line. Below is an example of one way of recording the wyvern animations might look.
| Begin | End | |
| c_wyvern_idlefidget | 1 | 191 |
| c_wyvern_run | 200 | 220 |
| c_wyvern_runL | 230 | 250 |
| c_wyvern_runR | 260 | 280 |
| c_wyvern_UNA_1attack01 | 290 | 335 |
| c_wyvern_UNA_1attack02 | 340 | 385 |
| c_wyvern_UNA_damage01 | 390 | 400 |
| c_wyvern_UNA_death01 | 410 | 486 |
| c_wyvern_UNA_death02 | 490 | 560 |
| c_wyvern_UNA_dodge | 570 | 620 |
| c_wyvern_UNA_idleM | 630 | 870 |
| c_wyvern_UNA_knockdownB | 880 | 920 |
| c_wyvern_UNA_proneB | 930 | 970 |
| c_wyvern_UNA_standupB | 980 | 1030 |
| c_wyvern_UNA_taunt | 1040 | 1100 |
| c_wyvern_UNA_walk | 1110 | 1160 |
Tediously import your animations
Make an entry in your table (like above) for the first animation that was imported. Note the Begin and End times.
Start importing the rest of the animations, one by one:
- Import your next animation by selecting the animation's GR2 file and the "skel.GR2" file. It will create a "skel.001" object.
- Go to the "skel.001" object and look in your animation dope sheet. Find the frames and right mouse button copy them.
- Go to the master "skel" object and place your timeline cursor at an appropriate interval after the existing last animation. I usually increment it to the next sequence in 10, so if the prior ends at 191, start at 200.
- Right click on the dope sheet timeline cursor, with the cursor located at the end of your existing timeline, and click paste. The animation should copy over.
- Review and double check your animation is good. Note the ending location and put it in your table.
- Delete the "skel.001" object.
- Rinse and repeat the above until you have all the animations.
SPECIAL NOTE: NWN expects the on-hit damage animation to be 10 seconds, and the NWN2 animations for that are generally 30 seconds or a bit more. Unless you scale the NWN2 animation down to 10 frames, it will clip over your death/knockback animations. So, when you import the on-hit damage animation, scale it to 10 seconds first by pressing "S" for scale and a modifier. Usually it will be ".33" making you have 10 frames. The NWN2 animations for on-hit damage are generally "_damage01" and "_damage02", etc. Everything else will be fine in terms of the NWN game engine will auto-compensate for animation length.
SPECIAL NOTE: Don't forget to place your timeline cursor out or you will overwrite existing!
SPECIAL NOTE: Take notes like the table above or you will regret it later.
Create your pseudo-bones
Once you are satisfied with your animations you will use Neverblender to create pseudo-bones. That’s because NWN EE doesn’t recognize
- Once this is done, to get the animations off the animated skeletons you import and onto the one attached to the creature mesh, simply select the skeleton, select it’s animations, and copy in the usual fashion. You can now left click the skeleton attached to the creature, put the timeline cursor bar wherever you want the animation to turn up on the animation timeline, and paste in the usual fashion. Voila. You’ve got the imported animation off it’s imported skeleton and onto the creature one.
- Rinse and repeat for each animation you want. Don’t forget to reposition the timeline cursor or you’ll end up overwriting anims after the first time.
...
actual skeletons, unless there’s a pseudo-skeleton there to do the exact same thing.
...
- Anyways, all you need to do is select the skeleton with all the animations on it and hit ‘generate pseudo-bones’ from the bone menu. Voila, pseudo-skelly. Select this and make the base object all the NWN2 model/skeleton stuff is parented to, it’s parent. Might be easiest to shift + left click it and drag it onto said base object.
- Almost there. The NWN2 mesh/skin object isn’t the right type by default. You just need to head to the Neverblender aurora mesh panel in the object menu while you have that mesh selected, then change it’s type to ‘skinmesh’.
- Finally, add an empty and parent everything to that, then name it whatever you want to put in the 2da. NWN1 wants an empty at the top of it’s hierarchy when it looks at a model, or something.
- You can now export to MDL via the export menu. Unfortunately, there is one more step if you want the textures to work right. Open the new MDL in nwnexplorer and export the ASCII version of it, then open that in Notepad++ or a similar editor and search for the word 'bitmap'. You need to check that the main texture files for the creature - not the strange lighting map ones you sometimes get but the tga with the creature texture as it should show up in game - is the file named after 'bitmap'. Look through the file and you'll find several instances of it to change. It might be actually that there's several textures you need to change in this way for some models that use multiple base textures but I haven't encountered this yet. Either way, once you've done this, just save the text file as MDL once again and...
Select the "skel" object and go to the Object Data Properties tab. Find the "Generate Pseudo Bones" button. Uncheck "Add Aurora Base" and "Add Rootdummy". Press the "Generate Pseudo Bones" button. A new object should be created with your pseudo-bones with the name of "skel.001".
Fix object hierarchies
Basically, here you need to create your root and move out the armature in favor of keeping the pseudo bones. You can do it several ways, but this one works fine:
- Take the new "skel.001" psuedo-bones object and parent it to the main "skel" armature object you've been working with.
- Now create a new root of the name of the creature model with Shift-A=>Empty=>Plain Axes , eg "c_umberhulk". Parent your "skel" armature object to that.
- Now take your "skel" armature object and unparent it from the root since we don't want it in the NWN mdl file. Rename it to something new like "skel_arm".
- Rename the "skel.001" pseudo-bones that is still in the root hierarchy by removing the ".001".
Change model type to Skinmesh
Highlight your mesh(s) in the model and change them to type "Skinmesh"
Add your nodes
Add the below nodes and parent them to the relevant special node (TO DO ENTER THOSE).
- handconjure = ap_hand_right or ap_forehead or ap_mouth
- headconjure = ap_forehead
- impact = ap_torso
- lforearm =
- lhand = ap_hand_left
- rhand = ap_hand_right
Place them where appropriate relative to the mesh.
Update the texture reference
Go to your mesh object and name the material file name / texture. We'll make the texture later.
Tediously map your animations and add events
Again you should refer back to your notes that you've been taking and map out how you want the NWN2 animations to line up with the NWN1 animations. Generally you'll have something for everything, but you'll have some choices to make. Review your animations that you've imported and decide what is best for each NWN animation type. When you map the NWN2 animation and later create the NWN animation with start and stop times, refer back to the table you made above listing which frames are for when. Below is an example mapping of a wyvern, as well as the events you should add to for each NWN animation. You may want to add more events, such as more footsteps, but the below should be considered the minimum. Refer back to your timeline to figure out which frame timings will work best for each event. Ultimately, its probably most efficient to make a vlookup to your begin end times.
| NWN Animation | Event1 | Event2 | NWN2 Animation | Vlookup Begin | Vlookup End |
| ca1slashl | hit | c_wyvern_UNA_1attack02 | 340 | 385 | |
| ca1slashr | hit | c_wyvern_UNA_1attack02 | 340 | 385 | |
| ca1stab | hit | c_wyvern_UNA_1attack01 | 290 | 335 | |
| cappear | c_wyvern_UNA_idleM | 630 | 870 | ||
| ccastout | cast | c_wyvern_UNA_idleM | 630 | 870 | |
| ccastoutlp | c_wyvern_UNA_idleM | 630 | 870 | ||
| ccloseh | hit | c_wyvern_UNA_1attack02 | 340 | 385 | |
| cclosel | hit | c_wyvern_UNA_1attack02 | 340 | 385 | |
| cconjure1 | c_wyvern_UNA_idleM | 630 | 870 | ||
| ccwalkb | snd_footstep | snd_footstep | c_wyvern_UNA_walk | 1110 | 1160 |
| ccwalkf | snd_footstep | snd_footstep | c_wyvern_UNA_walk | 1110 | 1160 |
| ccwalkl | snd_footstep | snd_footstep | c_wyvern_runL | 230 | 250 |
| ccwalkr | snd_footstep | snd_footstep | c_wyvern_runR | 260 | 280 |
| cdamagel | c_wyvern_UNA_damage01 | 390 | 400 | ||
| cdamager | c_wyvern_UNA_damage01 | 390 | 400 | ||
| cdamages | c_wyvern_UNA_damage01 | 390 | 400 | ||
| cdead * see tips | c_wyvern_UNA_proneB | 930 | 970 | ||
| cdisappear | c_wyvern_UNA_idleM | 630 | 870 | ||
| cdodgelr | snd_footstep | c_wyvern_UNA_dodge | 570 | 620 | |
| cdodges | snd_footstep | c_wyvern_UNA_dodge | 570 | 620 | |
| cgustandb | c_wyvern_UNA_standupB | 980 | 1030 | ||
| ckdbck | snd_hitground | c_wyvern_UNA_knockdownB | 880 | 920 | |
| ckdbckdie * see tips | c_wyvern_UNA_proneB | 930 | 970 | ||
| ckdbckps | c_wyvern_UNA_proneB | 930 | 970 | ||
| cparryl | c_wyvern_UNA_dodge | 570 | 620 | ||
| cparryr | c_wyvern_UNA_dodge | 570 | 620 | ||
| cpause1 | c_wyvern_UNA_idleM | 630 | 870 | ||
| creach | hit | c_wyvern_UNA_1attack01 | 290 | 335 | |
| creadyl | c_wyvern_UNA_idleM | 630 | 870 | ||
| creadyr | c_wyvern_UNA_idleM | 630 | 870 | ||
| crun | snd_footstep | snd_footstep | c_wyvern_run | 200 | 220 |
| ctaunt | c_wyvern_UNA_taunt | 1040 | 1100 | ||
| cwalk | snd_footstep | snd_footstep | c_wyvern_UNA_walk | 1110 | 1160 |
TIPS:
- ccastout: NWN2 doesn't often have a casting animation for creatures. In NWN1, the casting animation is 30 frames. As a default, you can use the idle animation for the NWN ccastout animation. The game will expect 30 frames here, so clip the end time of ccastout to be T+30, not the last frame of the animation. If you just use the default times, the game will speed up the idle animation and compress it and you will get a janky look.
- cdead: Just use the first frame of the prone animation as both start and end, so it is looping off that. So if the prone animation runs from 930-970, your start and stop will be 930 both.
- ckdbckdie: Just use the first frame of the prone animation as both start and end, so it is looping off that. So if the prone animation runs from 930-970, your start and stop will be 930 both.
TOOLSET TIP:
- Go through your time line and find the first frame of your idle animation. Copy that frame and paste it at frame zero of the timeline. It will make the toolset render better with bounding boxes and preview panes.
MORE ANIMATIONS THAN YOU USE TIP:
- You'll notice that you didn't use your death animations from NWN2 at all. There are almost always two. Keep them and add the following custom animations. Add some snd_hitground events too.
| xdeath1act | c_wyvern_death01 | start and stop times for the death animation |
| xdeath1lp | c_wyvern_death01 | start and stop times to be the last frame of the death animation |
| xdeath2act | c_wyvern_death02 | start and stop times for the death animation |
| xdeath2lp | c_wyvern_death02 | start and stop times to be the last frame of the death animation |
In version .35 of NWNEE and higher, you can call these and have custom death animations using the following script commands per animation. They can go in the creature's death script.
ReplaceObjectAnimation(OBJECT_SELF, "ckdbck", "xdeath1act");
ReplaceObjectAnimation(OBJECT_SELF, "ckdbckdie", "xdeath1lp");
As a general rule, it makes sense to keep all the NWN2 animations since you can ultimately call them through script. Better to have them just in case.
DONE FOR NOW - YOUR MODEL SHOULD BE READY FOR EXPORT. MORE LATER ON TEXTURES, BUT THAT'S ALL THATS REALLY LEFT....
------
section on armed vs unarmed animations
- use "una" for unarmed set
- make diff model for diff animation types (2hs, 1hs, etc)
- cant do standard attach to bone or child to constraints
- how to: generate the psuedo bones, import your mesh like a sword, parent it to the psuedo bone in the skel object it relates to, eg right hand sword to ap_hand_right
Tip for casting:
Place the two NWN2 animations if present together in the dopesheet timeline, it will be 60 seconds / 2 seconds, which just happens to be the maximum time spell that conjure1 uses in spells 2a, so fits perfect.
| c_x_gen_conjure |
| c_x_gen_conjureloop |
Gen cast maps to to essentially castout anad castoutlp, which has a maximum of 90 frames / 3 seconds in spells.2da. Consider splitting out c_x_gen_cast out so that the first half provides the castout FNF animation and cast event, then take about 5 frames after and copy paste/reverse them so you create a seamless loop (copy paste on dope sheet, press S and the "-1" to reverse); make the end of your loop matches the start or you will hitch; this will be at a really shakey speed, so then on the same seamless loop scale it slower by pressing "S" and then "4'.
| c_x_gen_cast |
...