This development build is a huge one. As usual, you can use it to play on .20.1 servers (current stable release); and we’d like to encourage you to do so and report any issues you find with us!
Thank you.
Executive overview
A new game launcher UI that also includes a curated content repository, free for everyone (see below)
Full TTF font support throughout the game, for clearer and more adaptive text rendering
Fractional/floating-point UI scaling
Better UI skinning
Game/renderer performance improvements
Renderer: soft particle support, blending with fog
Three new portraits sourced from the community portrait contest
Hundreds of fixes and smaller features
Curated Content
This patch ships with a new (singleplayer) game launcher UI. It showcases all campaigns and premiums in a nicer way, with header images and descriptions; access to screenshots, and more. There is a split view for Premium and user modules, as well as filtering and search facilities.
We also bring in a curated content repository, hosted by Beamdog, that gives all players access to selected community content.
All you need to do to play them is click Download and wait a bit.
As part of this development patch release cycle, we will be reaching out to others that have authored widely popular modules on the Neverwinter Vault and elsewhere.
The UI also allows adding third party content repositories, which can be hosted by anyone without going through the Beamdog curation process.
This new UI, and the curated content repository bundled with the game now, is a work in progress. We will be making changes and improvements in the future.
TTF and UI scaling
The game now supports TTF fonts, and decimal UI scaling (e.g. 1.3x, not just 1x, 2x).
Water improvements
Visual Object Transform lerping
Visual effects applied via scripting can now lerp. This means that, for example, a creature size change can appear smoothly over a configured time, and not instant.
All existing visual transforms can be interpolated this way.
To accommodate this, the script API has been amended:
float SetObjectVisualTransform(object oObject, int nTransform, float fValue, int nLerpType = OBJECT_VISUAL_TRANSFORM_LERP_NONE, float fLerpDuration = 0.0, int bPauseWithGame = TRUE);
int OBJECT_VISUAL_TRANSFORM_LERP_NONE = 0; // 1
int OBJECT_VISUAL_TRANSFORM_LERP_LINEAR = 1; // x
int OBJECT_VISUAL_TRANSFORM_LERP_SMOOTHSTEP = 2; // x * x * (3 - 2 * x)
int OBJECT_VISUAL_TRANSFORM_LERP_INVERSE_SMOOTHSTEP = 3; // 0.5 - sin(asin(1.0 - 2.0 * x) / 3.0)
int OBJECT_VISUAL_TRANSFORM_LERP_EASE_IN = 4; // (1 - cosf(x * M_PI * 0.5))
int OBJECT_VISUAL_TRANSFORM_LERP_EASE_OUT = 5; // sinf(x * M_PI * 0.5)
int OBJECT_VISUAL_TRANSFORM_LERP_QUADRATIC = 6; // x * x
int OBJECT_VISUAL_TRANSFORM_LERP_SMOOTHERSTEP = 7; // (x * x * x * (x * (6.0 * x - 15.0) + 10.0))
New script commands
// Returns the currently executing event (EVENT_SCRIPT_*) or 0 if not determinable.
// Note: Will return 0 in DelayCommand/AssignCommand. ExecuteScript(Chunk) will inherit their event ID from their parent event.
int GetCurrentlyRunningEvent();
// Get the integer parameter of eEffect at nIndex.
// * nIndex bounds: 0 >= nIndex < 8.
// * Some experimentation will be needed to find the right index for the value you wish to determine.
// Returns: the value or 0 on error/when not set.
int GetEffectInteger(effect eEffect, int nIndex);
// Get the float parameter of eEffect at nIndex.
// * nIndex bounds: 0 >= nIndex < 4.
// * Some experimentation will be needed to find the right index for the value you wish to determine.
// Returns: the value or 0.0f on error/when not set.
float GetEffectFloat(effect eEffect, int nIndex);
// Get the string parameter of eEffect at nIndex.
// * nIndex bounds: 0 >= nIndex < 6.
// * Some experimentation will be needed to find the right index for the value you wish to determine.
// Returns: the value or "" on error/when not set.
string GetEffectString(effect eEffect, int nIndex);
// Get the object parameter of eEffect at nIndex.
// * nIndex bounds: 0 >= nIndex < 4.
// * Some experimentation will be needed to find the right index for the value you wish to determine.
// Returns: the value or OBJECT_INVALID on error/when not set.
object GetEffectObject(effect eEffect, int nIndex);
// Get the vector parameter of eEffect at nIndex.
// * nIndex bounds: 0 >= nIndex < 2.
// * Some experimentation will be needed to find the right index for the value you wish to determine.
// Returns: the value or {0.0f, 0.0f, 0.0f} on error/when not set.
vector GetEffectVector(effect eEffect, int nIndex);
// Check if nBaseItemType fits in oTarget's inventory.
// Note: Does not check inside any container items possessed by oTarget.
// * nBaseItemType: a BASE_ITEM_* constant.
// * oTarget: a valid creature, placeable or item.
// Returns: TRUE if the baseitem type fits, FALSE if not or on error.
int GetBaseItemFitsInInventory(int nBaseItemType, object oTarget);
// Get oObject's local cassowary variable reference sVarName
// * Return value on error: empty solver
// * NB: cassowary types are references, same as objects.
// Unlike scalars such as int and string, solver references share the same data.
// Modifications made to one reference are reflected on others.
cassowary GetLocalCassowary(object oObject, string sVarName);
// Set a reference to the given solver on oObject.
// * NB: cassowary types are references, same as objects.
// Unlike scalars such as int and string, solver references share the same data.
// Modifications made to one reference are reflected on others.
void SetLocalCassowary(object oObject, string sVarName, cassowary cSolver);
// Delete local solver reference.
// * NB: cassowary types are references, same as objects.
// Unlike scalars such as int and string, solver references share the same data.
// Modifications made to one reference are reflected on others.
void DeleteLocalCassowary(object oObject, string sVarName);
// Clear out this solver, removing all state, constraints and suggestions.
// This is provided as a convenience if you wish to reuse a cassowary variable.
// It is not necessary to call this for solvers you simply want to let go out of scope.
void CassowaryReset(cassowary cSolver);
// Add a constraint to the system.
// * The constraint needs to be a valid comparison equation, one of: >=, ==, <=.
// * This implementation is a linear constraint solver.
// * You cannot multiply or divide variables and expressions with each other.
// Doing so will result in a error when attempting to add the constraint.
// (You can, of course, multiply or divide by constants).
// * fStrength must be >= CASSOWARY_STRENGTH_WEAK && <= CASSOWARY_STRENGTH_REQUIRED.
// * Any referenced variables can be retrieved with CassowaryGetValue().
// * Returns "" on success, or the parser/constraint system error message.
string CassowaryConstrain(cassowary cSolver, string sConstraint, float fStrength = CASSOWARY_STRENGTH_REQUIRED);
// Suggest a value to the solver.
// * Edit variables are soft constraints and exist as an optimisation for complex systems.
// You can do the same with Constrain("v == 5", CASSOWARY_STRENGTH_xxx); but edit variables
// allow you to suggest values without having to rebuild the solver.
// * fStrength must be >= CASSOWARY_STRENGTH_WEAK && < CASSOWARY_STRENGTH_REQUIRED
// Suggested values cannot be required, as suggesting a value must not invalidate the solver.
void CassowarySuggestValue(cassowary cSolver, string sVarName, float fValue, float fStrength = CASSOWARY_STRENGTH_STRONG);
// Get the value for the given variable, or 0.0 on error.
float CassowaryGetValue(cassowary cSolver, string sVarName);
// Gets a printable debug state of the given solver, which may help you debug
// complex systems.
string CassowaryDebug(cassowary cSolver);
// Overrides a given strref to always return sValue instead of what is in the TLK file.
// Setting sValue to "" will delete the override
void SetTlkOverride(int nStrRef, string sValue="");
// Constructs a custom itemproperty given all the parameters explicitly.
// This function can be used in place of all the other ItemPropertyXxx constructors
// Use GetItemProperty{Type,SubType,CostTableValue,Param1Value} to see the values for a given itemproperty.
itemproperty ItemPropertyCustom(int nType, int nSubType=-1, int nCostTableValue=-1, int nParam1Value=-1);
Pathfinding
Makes PC pathfinding no longer use simplified pathfinding at certain distances. Given that PC pathfinding is given more time, it is generally well able to handle this and benefit from it.
Fixed inaccurate calculation of grid step tolerance when using grid pathfinding.
Fixed potential endless loops with ActionMoveAwayFromLocation.
Fixed inconsistencies between when to use Z when comparing distances, which would result in certain actions failing when they shouldn't.
Adds lacking safety checks which was causing pathfinding to floor performance if trying to interact with a door that was unreachable.
Server settings: Removed experimental enhanced pathfinding toggle (now always on).
Fixed some minor errors related to collision resulting in imprecisions.
Other Features
GUI/NUI: Implemented floating point UI scaling.
GUI/NUI: Implemented TTF font rendering.
NUI: Implemented 9-slice gui skinning.
NUI: Now using a cassowary constraint solver system to layout widgets.
Floating damage numbers are now colourised based on the damage type taken.
NUI: Redesigned the Options UI.
NUI: Redesigned the NWSync Storage Management UI. (Now called Storage in the menu, and also accessible via the new game launcher).
NUI: Fixed up some other UI panels to layout properly even when scaled.
NUI: Added a panel to show Open Source Licences to config UI.
NUI: Made sound effects more immersive/in line with base UI usage (different click noises depending on widget).
GUI: Added a windowed/fullscreen/borderless dropdown to the Config UI and fixed the mode sometimes not initialising correctly.
Async loading of files and images via http streaming. (Backend system work)
ResMan: Movies can now be stored and played from override, ERF (hak, mod) and NWSync.
SQLite: Added a configurable busy timeout, so that just externally running something on a campaign/nwsync database doesn’t immediately abort queries running in the game. (3s default)
SQLite: Added builtin functions for NWCompressedBuf compression, base64 de/encode, and hashing. See SQLITE_Readme.md in data.
HTTP: Added a disk caching service to avoid repeated requests; added alias CACHE: (USERDIR/cache) by default. Configurable in settings, default max size is 100MB.
Base: Game windowed size is now 1024x768 by default, because some UI just got too big.
Base: TLK files now have a local cache, improving repeated lookup performance.
Base: API cleanup for NWNX support
Server: Removed some superfluous service updates (very minor perf).
Renderer: Unified and simplified the shader setup, allowing the default vs/fslit_nm/sm shaders to be used for all standard PBR setups.
Renderer: Made displacement offset a uniform that can be passed from materials to set a base level. To use it, add parameter float DisplacementOffset in a material. By default, the shaders assume the base (zero) level of the heightmap is 1 (white), so if base level is 0.6, the value needs to be -0.4, etc.
Renderer: Made alpha level adhere to Fresnel effects at high shader quality.
Renderer/Debug UI: Added a dropdown to select various rendering modes helpful for debugging (Material modes, Lighting channels, ..)
Renderer: Improvements to FBO, grant all shaders access to color and depth buffer textures
Renderer: Quickbar icons can now reload via SetTextureOverride #121
Renderer: Fixed broken normal and tangent generation for skinmeshes due to invalidated render hints. Improved shader picking based on tangets/handedness.
Renderer: Shader compilation errors are now printed to the game log file.
Renderer: Separated out area wide lighting from area point lights. (Small perf improvement).
Renderer/OVT: WALKDIST and RUNDIST now scales properly with visual transforms for you, in order to keep footsteps in sync.
Renderer: Added material files for icy tileset.
Renderer: Added material files for male and female old human heads so their hair no longer appears metallic.
Fixes
Fixed main menu music not playing when intro movies are skipped.
Renderer: Fixed a bad hashing algo for PLT textures resulting in excessive cache misses.
Renderer: Fixed incorrectly initialised null textures in some cases, resulting in incorrect textures and unnecessary texture binds.
Renderer: Removed redundant skinmesh bone remapping. Slight performance improvement, especially for models with many nodes.
Renderer: Made texture management more efficient, streamline for future changes to PBR.
Renderer/ResMan: Disabled the async model loader. Addresses the bodyparts missing issue. #145
Renderer: Maximum number of bones of a single skinmesh is now 64, to match mobile. This should fix the case where the game runs with 1-2fps on some GPUs.
Renderer: Fixed crashes due to NULL textures.
Renderer: Fixed crashing due to broken skinmesh models.
Renderer: Regression: Fixed compiled light models having issues due to memory misalignment/struct packing.
Renderer: Fixed an issue that would potentially cause scenes using custom shaders to malfunction in the event that a user changes video options in game.
Renderer: Fix text input caret pulsing when paused. Fix caret colouring following text in some situations.
Renderer: Safeguard against crashes when an animation was missing
Renderer: Optimised animesh buffer uploading; reduce time spent on GUI rendering.
Renderer: Make the `decal` property actually disable lighting, rather than just self-illuminating brightly. Fixed some GUI scenes by adding decal to txis.
Renderer: Fixed issue with darkness and similar negative light effects always being pushed to the end of the light priority list.
Renderer: Fixed tile lights being added to the BSP before having their radii set (causing minor imprecisions.)
Renderer: Fixed an issue with setting custom shaders when objects were using just one material for all parts while having more than one part.
Renderer: Fixed a minor regression with the high contrast shader.
Renderer: Removed a good chunk of dead/redundant code.
Nuklear: Fixed a memleak that would degrade long play sessions
VM: Fixed crash when calling DestroyArea() on a invalid object.
VM: Stopped ExecuteScriptChunk from writing “!chunk.ndb” to override.
VM: sqlite commands: Added missing newline in log output.
VM: Fixed issue in string handling (also: VM: SubString()) that would have resulted in memory leaks or crashes.
Game: Don’t use weapon AB for ranged touch attacks anymore.
Fixes to passive attack target selection. This should address Cleave etc. sometimes failing to find a followup target. #172
Game: Effect Miss Chance/Blind Fighting: Fix erroneous re-roll against target concealment, fix effect being ignored against blind fighting. #15
Game: Fixed error in levelup validation related to SkillpointModifierAbility being starred out #180
Game: Fixed ResistSpell() when called from AOE spell scripts.
Game: Fixed classstat modifiers applying incorrectly to polymorph. #185
Fixed the DM flag being set incorrectly on player characters when copying files around. #216
Fixed a rare crash in game object update netcode when writing out the party state of a player that just exited.
Fixed a loop wraparound overflow game hang/crash when removing effect icons.
Game: Fixed a crash when the game tried to write a log entry as it was shutting down.
Emitters: fixed them not interpolating if not both size_y start and end were set (correct behaviour is to do if either is non-zero).
Game: Never allow the window size to shrink below (100, 100). This works around the case where the window was too small to spot or resize back up0.
Fixed a crash when clicking the Recommended button on chargen package selection with no packages available.
Fixed a string type conversion error resulting in some empty strings in UI
http:// Made http errors more verbose. Verbosity is Friend.
Fixed nwsync-enabled savegames not loading due to missing TLK error.
Input: Character input is now correctly converted from the language charset. This should address broken polish text input.
NUI: Fixed codepage glyphs cutting text off due to incorrectly-set codepage.
NUI: Fix window flickering from (0,0) to center pos on first frame after opening.
NUI: Fix window sometimes scaling down to (0,0).
NUI: Pressing Escape now closes the currently focused window.
NUI: Fixed UI not properly hiding when pressing Alt-F4/X to close the game.
NUI Skinning: Made font white in all widgets, instead of grey.
NUI Skinning: Skinned text input box.
NUI Skinning: Title bars now look like native windows.
NUI Skinning: Close/Minimise buttons match native style.
NUI Skinning: Fixed combo box style.
NUI Skinning: Window and group borders are now rendered 9-sliced.
NUI Skinning: Fixed scrollbars not aligning properly.
NUI: Fixed windows not properly auto-centering when ui-scaled.
NUI: Fixed line fitting code to no longer repeat words when word-wrapping; improved performance to only do line flowing once.
NUI: Fixed layouting reflow triggering once per frame when UI-scaled.
NUI/GUI: Fixed TTF font rendering for Polish. #191 #235
GUI: Fixed input caret; now back with extra cyan and more blinkage.
GUI: Fixed password input box not accepting your passwords, no matter how good they were.
Movie player: Optimised so it doesn’t create the movie texture as often.
Toolset: Fixed floating point drifting for X/YOrientation
Toolset: Now reads DEVELOPMENT: (but it might not live-reload the same as the game would).
Art
Added three content winner portraits to base game (aragnosh/human male, seafaref/halfelf female, seafarem/halfelf male).
We just launched Patch 8193.20 for Neverwinter Nights: Enhanced Edition! The update adds scores of features & fixes to the core campaigns, premium modules and toolsets. Today’s patch also addresses the voiceover issue for non-english localizations.
Huge thanks to our amazing community for helping to test out the beta versions of this patch— we couldn’t have done it without you!
Check out the Patch Highlights & Full Details below!
Patch Highlights
Non-English Voiceover: We fixed the issue causing english voiceover to play for non-english localizations
NPC Movement: We improved the movement/navigation of Non-Player Characters (NPCs) and Creatures
Multiplayer: We fixed a server-side issue and increased the module description size so players get the full details
Dozens of Fixes: We’ve added dozens of fixes to improve the overall experience in adventures, toolsets and the Dungeon Master Client
New Scripting Functionality: See details below!
Check out the full patch notes below!
Patch Notes
NPC Movement
Improved navigation of NPCs and Creatures
Creatures now move in a logical direction when they are bumped or pushed
Performance Improvements
Optimized “Hardness” (placeable damage resistance) in the game so it no longer imposes heavy impact on server loads
Fixes
Non-English localizations now use correct voiceovers
Fixed the multiplayer UI not saving the network port configuration
Increased module description size to avoid cutting off text in the multiplayer browser
Fixed an issue causing invalid skill point messages and preventing level ups
Fixed a rare crash when loading custom content models
Fixed a crash occurring in character selection when existing character files have an invalid player class or race
Added a fix to make sure NPCs, like Deekin, level up correctly
Fixed issues in the Premium Module Darkness over Daggerford
Fixed an issue with the Daggerford Wagon
Fixed minor issues in the Great Cheese Caper quest
Graphics
Improved the appearance of armor and metals
Shadows now fade more smoothly in relation to distance, height and angles.
The Dynamic Contrast Shader now has adjustable settings in the options menu
The Depth of Field Shader now has adjustable settings in the options menu
Lights now fade in and out out more smoothly
Texture animations now animate consistently
Fixed the water shader showing seams
Water now always uses the env map
Grass now fades in smoothly rather than appearing abruptly
Skyfade fog coloured model below the horizon now covers below area, so missing meshes and keyholing show a black backdrop
Renderer Improvements
Optimised renderer GL buffer handling
Fixed clear colour erroneously reverting to black when loading into an area if a game object was received at exactly the wrong time
Fixed some erratic keyholing behaviour in certain situations
Reduced the number of shader reloads
Fixed dropped items floating too far over the ground
Fixed weather not correctly cleaning up after lightning events, sometimes resulting in heavy FPS drops
Fixed skin meshes (cloaks, robes) occasionally being warped or dislocated when animating
Normal maps are now read as two-channel textures (three are still supported, but this was needed for BC5)
Water reflections now ignore subsurface alpha
Env map tex coords are now always calculated per-fragment in HQ mode
Specular lighting now ignores material transparency
Refined light occlusion calculations
Shared material uniform data is now reset for each draw call. This fixes issues where a material incorrectly adopts parameters from the previously-rendered, if the current material has none.
NWSync Optimizations
Dedicated servers can now load their module data from a specially prepared NWSync repository, instead of having to have a copy of the module and hak files. (This mainly benefits big servers that have a CI/CD pipeline set up.)
Added argument -moduleurl, from which the module data will be sourced
Added a new optional argument -modulehash; which is considered to be `latest` if omitted
Generate the server/module repository with --with-module
You can reuse the public repository to save on duplication/disk space; or use a separate/private one. If you reuse the same repository and do not want to leak the module data, turn off http content listing and write the data with --no-latest.
Data is stored in SERVERHOME/nwsync (this works the same as on the client). It will auto-prune old data if the group_id matches. The rest is left up to you.
Content Updates
Added half-dragon tail to half-dragon blueprint
Added missing texture for worldmap placeables
Rendered new icons for the gem shields
Fixed Tanarukk Blueprints, Factions & Script
Fixed some tile models resulting in Access Violation in the toolset
Set all weapons for Ambient and Diffuse of 100% (1 1 1), in alignment with the new graphics & lighting
Fixes to Shadow, Mesh and Bounding Boxes
Added in several missing art models and portraits, along with toolset blueprints (DoD Flags, Signs, & Duke Painting; Tyrants Flowering Plants & Wavy Water 1x1, Invisible Ground 4x4, Worldmaps - Floor and Wall-Mounted)
Rebuilt placeable walkmeshes on several larger models to be 3D instead of a flat plane
Low Ambient Values raised to 1 1 1 (to allow other forms of tinting)
Shields/Cloaks/Robes: Compiled shield models and turned Ambient and Diffuse values to 1.0 1.0 1.0, so area lighting and tinting can have fullest effect as well as clothing matched-up from race-to-race
Skybox, Black: Added missing model
XP3 placeables: Many fixes for useability, shadows, z-fighting, walkmesh, and appearance
Daggerford & Tyrants of the Moonsea Placeables: Reworked placeable Use nodes to strict 13-character length requirement, cleaned up PWK walkmesh settings
Glass and Metal textures: Fixed TXI settings, added an alpha channel to maps for specularity and custom environment mapping (new textures)
Candles (Non-Ambient): Added a dynamic light with shadowing (Disclaimer: nearby props must not be set to Static in order to cast shadows, but work much better than Ambient lights)
Elven Lanterns: Fixed candle flame not showing through panes and added ambient/dynamic versions, as with candles
Kochrachon: Fixed deformed arms & a floating "thumb"
Orcus (Blueprint): Added missing creature hide and Wand to inventory
Gem Greatswords, Warhammers, Shields and Placeable Gemstones: Fixed UV's and self-illumination settings
Doortypes.2DA: Added proper blueprint ref's for the two new elven doors (TTF02)
Loadscreens.2DA: Added default tileset entries for DoD and Tyrants loadscreens
Placeables.2DA: Fixed various settings on placeable entries
PlaceablePalStd.ITP: Added new entries for missing blueprints, removed a couple bogus entries
Portraits.2DA: Added missing entries, for missing blueprints
Tailmodel.2DA: Changed entry 5000 from "karandas" to "Half-Dragon"
PLC_C10 (Placeable Door): Fixed a bad set of Use Nodes (“secret door” fix)
TNO01: Fixed a SQRT Domain error in TNO01 Boat (at last!)
TNO01: Fixed a crash in TNO01 Ship1 and Market Stall, Long: caused by too many mesh parts
TNO01: Fixed chimney & window animations in Inn, Coach 2x2
TTF02 and TTS02 Doors: Fixed DWK naming and settings
TTF02 Water: Fixed bad transparency settings in stream tiles (as seen through tree branches)
TSS13 (Seaships): Added edge tiles TSS13_edge.2DA
TSS13_C07_04: Fixed a bad water reference
TCN_UDoor_02: Fixed a shifted walkmesh and transition mesh (you could transition the door w/o opening)
TDM01_O11_01: Replaced a missing face in the doorway mesh
TCN01_A06_01: Fixed some meshes which had shifted from bas X-Forms
TRM02.SET: Added a missing crosser entry
TCM02.SET: Fixed typos in a couple tile names
TCM02: Replaced small/misaligned water meshes on several tiles
IIT_Torch02: Adjusted smoke to be much more minimal than a standard torch
TTF02_I07_02: Removed a bunch of extra/ugly tree foliage meshes
TTF02_T13-14_01: Set meshes from Render 0 to 1, fixed UV's on tent flap, added bottom mesh to lean-to
TWC03_C53_01, TWC03_C54_06: Fixed broken fireplace animations, added a woodpile for fuel
TDE01, TNI02, and TSW01: Restored the "Lightning Tiles" in TDE01, TNI02, and TSW01, added animloops for shutdown where needed
Toolset
Fixed some shadows not rendering properly
Fixed VFX emitters not rendering properly
Other Updates
Fixed minimap data being assigned incorrectly when deleting an area via VM::DestroyArea
Fixed cloaks and robes not inheriting visual transform animation speed
Fixed items losing the possessor reference when failing to merge a stack out of a container, resulting in dead/unusable items and eventually a crash
“Hide Second Story Tiles” setting is now disabled by default
Linux binaries are now built against Debian Stretch (9), fixing requirements to Debian 9, Ubuntu 18.04 LTS, or newer. This should take care of the glibc issues some folks were seeing, as well as the stray libsndio linkage
Danglymesh is now properly frozen when the game is paused
Model loader: Set mesh ambient and diffuse to vec3(1.0) by default
NWSync command line args now verify the URL and Hash formats
Fixed an issue where the first texture in a material was replaced with the NULL texture after an area change
Fixed classstat abilities modifiers not being considered for feat requirements on levelup, when the abilities are gained on the very same level
Fixed class stat ability modifiers sometimes not updating after a levelup (for example, for STR damage bonus)
Fixed blank value in SkillPointModifierAbility in racialtypes.2da failing ELC
Debug UI: Fixed a client crash in the NWScript Widget when inputting a invalid object ID
Config: The default value for 2D/3D bias is now 1.0 which should fix sound effect quietness (you need to reset it manually in Options if you want to try this)
Scripting:
Fixed material parameters not being updated for single float changes
Cutscenes: Fixed Hide Second Story Tiles not being saved/restored correctly
Cutscenes: Fixed camera being reset with incorrect values despite VM::StoreCameraFacing not having been called
ActivatePortal: Fixed some cases where NAT punchthrough or relaying failed to work
Fixed a crash when calling area management functions twice (e.g. CopyArea(CopyArea()))
EnterTargetingMode() now also triggers when the user cancels out, with the target area or object returned as INVALID_OBJECT
Material filenames and params now allow underscore
New Scripting Functionality
// Sets the current hitpoints of oObject. // * You cannot destroy or revive objects or creatures with this function. // * For currently dying PCs, you can only set hitpoints in the range of -9 to 0. // * All other objects need to be alive and the range is clamped to 1 and max hitpoints. // * This is not considered damage (or healing). It circumvents all combat logic, including damage resistance and reduction. // * This is not considered a friendly or hostile combat action. It will not affect factions, nor will it trigger script events. // * This will not advise player parties in the combat log. void SetCurrentHitPoints(object oObject, int nHitPoints);
We’re just about ready to ship Patch 8193.20 for Neverwinter Nights: Enhanced Edition— but we need your help to test the Beta (Round 2)!
Based on your feedback from the latest beta test, we’ve updated the build of the next Neverwinter Nights: Enhanced Edition patch with a few fixes. Huge thanks to all testers for their feedback on this!
Now we'd like to gather your thoughts on the new build: Is it stable & solid? Is it ready for release? Let us know!
How to Participate:
In your Steam Library, Right-Click Neverwinter Nights: Enhanced Edition and choose “Properties”
Yes, it's Ready to Release! - or - No, it's not ready (please explain)
Keep in mind, we plan to release future patches, so if a fix or feature you’re keen to see added isn’t here, we may be able to address it in a future update. The feedback we need from you today is to make sure this patch is stable and moves the game in the right direction! Is Beta Build 8193.20 ready to release as a patch for Neverwinter Nights: Enhanced Edition?
Patch Highlights:
Last month we shipped an epic patch with some huge graphical upgrades. This month we’re looking to tackle a few bugs that the big patch introduced, and improve the overall polish of our favorite RPG.
Fixes issue where Non-English voice overs played in English
Fixes several crashes in campaigns, menus & toolset
Refines the shaders and lighting renderers added in the last patch
Added a few fixes based on user feedback in the previous test, including the hardness fix
We’re just about ready to ship Patch 8193.19 for Neverwinter Nights: Enhanced Edition— but we need your help to test the Beta!
Last month we shipped an epic patch with some huge graphical upgrades. This month we’re looking to tackle a few bugs that big patch introduced, and improve the overall polish of our favorite RPG.
How to Participate:
In your Steam Library, Right-Click Neverwinter Nights: Enhanced Edition and choose “Properties”
Fixes issue where Non-English voice overs played in English
Fixes several crashes in campaigns, menus & toolset
Refines the shaders and lighting renderers added in the last patch
Keep in mind, we plan to release future patches, so if a fix or feature you’re keen to see added isn’t here, we may be able to address it in a future update. The feedback we need from you today is to make sure this patch is stable and moves the game in the right direction!
Vote Below: Yes, Ready to Release! / Not Ready! (please explain)
Multiplayer browser: Bumped module description size to 1KB, to avoid needless cutoff.
Linux binaries are now built against Debian Stretch (9), fixing requirements to Debian 9, Ubuntu 18.04 LTS, or newer. This should take care of the glibc issues some folks were seeing, as well as the stray libsndio linkage.
Config: The default value for 2D/3D bias is now 1.0. This should fix sound effect quietness. You need to reset it manually in Options if you want to try this.
Fixes
Renderer: Fixed weather not correctly cleaning up after lightning events, sometimes resulting in heavy FPS drops.
Renderer: Fixed skinmeshes (cloaks, robes) occasionally being warped or dislocated when animating.
Renderer: Normal maps are now read as two-channel textures (three are still supported, but this was needed for BC5).
Renderer: Water reflections now ignore subsurface alpha.
Renderer: env map tex coords are now always calculated per-fragment in HQ mode.
Renderer: Specular lighting now ignores material transparency.
Renderer: Refined light occlusion calculations.
Renderer: Shared material uniform data is now reset for each draw call. This fixes issues where a material incorrectly adopts parameters from the previously-rendered, if the current material has none.
Multiplayer Server UI: Fixed server port not being saved.
VM: Fixed material parameters not being updated for single float changes.
VM: Cutscenes: Fixed Hide Second Story Tiles not being saved/restored correctly. #137
VM: Cutscenes: Fixed camera being reset with incorrect values despite VM::StoreCameraFacing not having been called. #126
VM: ActivatePortal: Fixed some cases where NAT punchthrough or relaying failed to work.
Fixed a regression in ValidateCharacter that resulted in invalid skill point messages. #180
Fixed blank value in SkillPointModifierAbility in racialtypes.2da failing ELC. #180
Fixed a rare crash when loading custom content models.
Premiums
DoD: Addressed two minor issues related to the Great Cheese Caper quest
Art
Set all weapons for Ambient and Diffuse of 100% (1 1 1), in alignment with the new graphics & lighting
TCN_UDoor_02: Fixed a shifted walkmesh and transition mesh (you could transition the door w/o opening)
TSS13_C07_04: Fixed a bad water reference
PLC_C10 (Placeable Door): Fixed a bad set of Use Nodes (“secret door” fix)
TDM01_O11_01: Replaced a missing face in the doorway mesh (#183)
TCN01_A06_01: Fixed some meshes which had shifted from bas X-Forms (#178)
TTF02_T13-14_01: Set meshes from Render 0 to 1, fixed UV's on tent flap, added bottom mesh to lean-to (#186)
Orcus (Blueprint): Added missing creature hide and Wand to inventory (#177)
TWC03_C53_01, TWC03_C54_06: Fixed broken fireplace animations, added a woodpile for fuel (#188)
Gem Greatswords, Warhammers, Shields and Placeable Gemstones: Fixed UV's and self-illumination settings (#174)
TRM02.SET Added a missing crosser entry (#194)
TCM02.SET Fixed typos in a couple tile names (#196)
TCM02 Replaced small/misaligned water meshes on several tiles (#195)
IIT_Torch02 Adjusted smoke to be much more minimal than a standard torch (#189)
TTF02_I07_02: Removed a bunch of extra/ugly tree foliage meshes (#181)
Config: “Hide secondary story tiles” is now disabled by default.
Dynamic contrast shader now has config options for intensity and midpoint.
Depth of Field shader should now behave better; added configuration option for used focusing type.
Armour/metals are now rendered with more detail and less blotches.
Shadows now fade out more smoothly in relation to distance and height/angle.
Fixes
Fixed the localisations not loading some keytable content (like voiceovers).
Lighting: Fixed an issue in the light range calculation that resulted in lights occasionally flicking off/on rather than fading out smoothly.
Renderer: Optimised renderer GL buffer handling.
Fix texture animations sometimes not animating. #68
Renderer: Fixed clear colour erroneously reverting to black when loading into an area if a game object was received at exactly the wrong time.
Fixed the water shader showing seams.
Water now always uses the env map.
Danglymesh is now properly frozen when the game is paused.
Grass: Fixed fade-in Z fighting/shimmering when viewing from above, fixed grass appearing abruptly instead of fading in smoothly.
Skyfade fog coloured model below the horizon now covers below area, so missing meshes and keyholing show a black backdrop.
Fixed minimap data being assigned incorrectly when deleting an area via VM::DestroyArea.
Fixed cloaks and robes not inheriting visual transform animation speed. #159
Fixed items losing the possessor reference when failing to merge a stack out of a container, resulting in dead/unusable items and eventually a crash.
Model loader: Set mesh ambient and diffuse to vec3(1.0) by default.
NWSync command line args now verify the URL and Hash formats.
Debug UI: Fixed a client crash in the NWScript Widget when inputting a invalid object ID. #141
Fixed an issue where the first texture in a material was replaced with the NULL texture after an area change.
Fixed classstat abilities modifiers not being considered for feat requirements on levelup, when the abilities are gained on the very same level. #45
Fixed classstat ability modifiers sometimes not updating after a levelup (for example, for STR damage bonus).
Renderer: Fixed some erratic keyholing behaviour in certain situations.
Renderer: Reduced the number of shader reloads.
Toolset
Toolset: Fixed shadow rendering with fog disabled.
Toolset: Fixed VFX emitters not rendering properly. #162
Toolset: Fixed some shadows not rendering properly.
Art Fixes
Fixed a crash in TNO01 Ship1 and Market Stall, Long: caused by too many mesh parts
TTF02 and TTS02 Doors: Fixed DWK naming and settings
TTF02 Water: Fixed bad transparency settings in stream tiles (as seen through tree branches)
TSS13 (Seaships): Added edge tiles TSS13_edge.2DA
TNO01: Fixed chimney & window animations in Inn, Coach 2x2
Shields/Cloaks/Robes (all): Turned Ambient and Diffuse values to 1.0 1.0 1.0, so area lighting and tinting can have fullest effect as well as clothing matched-up from race-to-race. Compiled shield models
Skybox, Black: Added missing model
Restored the "Lightning Tiles" in TDE01, TNI02, and TSW01, added animloops for shutdown where needed
XP3 placeables: Many fixes for useability, shadows, z-fighting, walkmesh, and appearance
Reworked placeable Use nodes to strict 13-character length requirement, cleaned up PWK walkmesh settings
Shadow, Mesh and Bounding Box fixes
Rebuilt placeable walkmeshes on several larger models to be 3D instead of a flat plane
Low Ambient Values raised to 1 1 1 (to allow other forms of tinting)
Added in several missing art models and portraits, along with toolset blueprints (DoD Flags, Signs, & Duke Painting; Tyrants Flowering Plants & Wavy Water 1x1, Invisible Ground 4x4, Worldmaps - Floor and Wall-Mounted)
Added half-dragon tail to Half-Dragon blueprint
Added missing texture for worldmap placeables
Glass and Metal textures: Fixed TXI settings, added an alpha channel to maps for specularity and custom environment mapping (new textures)
Candles (Non-Ambient): Added a dynamic light with shadowing (Disclaimer: nearby props must not be set to Static in order to cast shadows, but work much better than Ambient lights)
Elven Lanterns, Fixed candle flame not showing through panes, added ambient/dynamic versions as with candles
Fixed a SQRT Domain error in TNO01 Boat (at last!)
Kochrachon: Fixed deformed arms & a floating "thumb"
Kobolds/Goblins/Orcs/Golems/Giants/a few others: Added default environmental mapping
Doortypes.2DA
Added proper blueprint ref's for the two new elven doors (TTF02)
Loadscreens.2DA
Added default tileset entries for DoD and Tyrants loadscreens
Placeables.2DA
Fixed various settings on placeable entries
PlaceablePalStd.ITP
Added new entries for missing blueprints, removed a couple bogus entries
Portraits.2DA
Added missing entries, for missing blueprints
Tailmodel.2DA
Changed entry 5000 from "karandas" to "Half-Dragon"
Premiums
DoD: Fixed use node on the Daggerford Wagon in the dev hak
Using NWSync Serverside
The linux/macos nwserver binaries can now bootstrap from NWSync instead of having to have a copy of all hak data.
New argument -moduleurl, from which the module data will be sourced.
New optional argument -modulehash; which is considered to be `latest` if omitted.
You need to generate the server/module repository with --with-module.
You can reuse the public repository to save on duplication/disk space; or use a separate/private one. If you reuse the same repository and do not want to leak the module data, turn off http content listing and write the data with --no-latest.
Data is stored in SERVERHOME/nwsync, same as on the client. It will auto-prune old data if the group_id matches, also same as the client. The rest is left up to you.
New Scripting Functionality
// Sets the current hitpoints of oObject.
// * You cannot destroy or revive objects or creatures with this function.
// * For currently dying PCs, you can only set hitpoints in the range of -9 to 0.
// * All other objects need to be alive and the range is clamped to 1 and max hitpoints.
// * This is not considered damage (or healing). It circumvents all combat logic, including damage resistance and reduction.
// * This is not considered a friendly or hostile combat action. It will not affect factions, nor will it trigger script events.
// * This will not advise player parties in the combat log.
void SetCurrentHitPoints(object oObject, int nHitPoints);
This is a hotfix patch to 8193.15, which we released yesterday.
The changes in this patch are clientside only. You do not need to upgrade your dedicated server if it is already on .15 for full feature support.
Fixes
Fixed the game not starting when a language override was selected
The music tracks added in the DOD/TOTM content release now show up properly in the toolset (instead of "Bad Strref")
The game no longer tries to read the N: drive when trying to load a non-existent supermodel
nwscript.nss: Fixed error in description of StringToObject
Known Issues
This is a (incomplete) list of known issues on this build. Items on this list do not need to be reported!
Ability score bonuses from levelstat (class progression) do not contribute toward feat requirements when the score increase is received on the same levelup.
Non-functional anti-aliasing and anisotropic filtering settings have been removed pending a potential future reimplementation. We suggest you use the driver control panel to force it meanwhile, if so desired.
UI: Nuklear-based UI (NWSync, Configuration) does not observe ui scaling
UI: Nuklear-based UI (NWSync, Configuration) is not skinned as beautiful as can be
UI: Nuklear-based UI (NWSync, Configuration) does not close with the Esc key
UI: Nuklear-based UI (NWSync, Configuration) is only partially translated or labels are less descriptive than they could be
Water renderer does not use the area environment map, resulting in unseemly seams
VM: DestroyArea() sometimes erroneously removes the wrong minimap data on clients, resulting in black/unexplored areas.
Hosting a module from within the DM client does not update/show the creator palettes correctly
Items dropped on the ground appear to be floating slightly. This is a clientside rendering issue and does not require server/module adjustments by you!
Items dropped on tables fall through (mesh hit check). This is also clientside only and does not require you to fix things in the module/in scripting!
There is a memleak on the main menu. It does not manifest in game.
Today we release Patch 8193.15 for Neverwinter Nights: Enhanced Edition!
This update is big — the biggest the game has seen since its original release in 2018. We’re introducing a new lighting engine to enhance the graphics, dozens of toolset updates, plus plenty more features and fixes. Read on for all the details!
As always, this patch is network-compatible within the current major version (8193), including the old stable release .13; so you can play on servers with it that have not yet upgraded (though the majority of the new features will not work). To get the full experience, you will have to update both server and clients to this release. Singleplayer modules made with this new patch 1.81 cannot be played on older versions, however.
New Lighting Engine
This patch includes a new enhanced lighting engine, that is governed by the same principles as you would see in other modern games that aim for realistic lighting. The aim is both to allow much higher quality future content, but also to enhance the visual quality of existing content.
These are the main elements of this new lighting engine:
Physically based rendering (PBR), with emulation of specular reflection, surface “roughness”, Fresnel-effects and gamma correction. All in all, this gives a more realistic and “natural” look.
Tone mapping that prevents color distortion of bright lights and enables overbright.
Per-pixel lighting rather than per-vertex of the old setup, yielding much more precise light illumination levels relative to distance.
Full dynamic lighting, supporting up to 32 dynamic lights (previously NWN effectively only supported 6).
Since a picture says more than a thousand words, please visit this link to see some comparison shots:
Slide the blue dot in the middle of the images to compare before/after. The left side is the old/current render; the right side is the new lighting engine.
The lighting engine is by default on, but optional, as it is heavier on the GPU than the previous lighting model (especially if you run with 32 lights, but a minimum of 16 lights is recommended). You can turn it off in the Options menu. You can also tweak various parameters of the new lighting engine, such as attenuation and falloff. We would suggest leaving them at the defaults though, to ensure uniform content presentation.
Note that since the new lighting engine constitutes a significantly different way of computing light interaction and behavior, it is inevitable that overall illumination levels in some areas will change, which can result in certain areas becoming too bright or too dark. We have been carefully tuning the various parameters to minimize this effect, but ultimately, moving toward more realistic and sophisticated lighting will always come with this trade-off. If you find that the game has become too dark or too bright, we recommend that you adjust the brightness level by using the gamma slider accessible in the graphics options.
New Water Rendering
Water presentation has also been improved significantly. It now renders full dynamic light reflections, including sun and moon. It also shows wave displacement based on area wide and local wind sources (such as explosions) much more realistically than the previous water did.
As with the other lighting changes, some areas may appear differently, and builders using tile lights will now see them in the reflections, and may wish to edit an area’s lights so that both the area and the reflections appear as desired.
There are configuration options in the UI to turn this feature off.
Again, please visit this link to see the improvements to water in action:
Grass is now rendered sorted by distance, fixing transparency issues and making it look denser and more natural.
The comparison link posted above has visual examples of this.
Grass rendering also has been heavily optimised and should no longer pose a performance consideration, even in scenes with lots of it.
Other miscellaneous graphical improvements
Models spawned by visual effects now have fog properly applied and are not self-illuminated with a bright light anymore. This makes content spawned as visual effect render identical to other in game content, making things such as VFX spawned tiles and character equipment appear more natural.
Content import from Ossian premium modules
This patch includes all content from Darkness over Daggerford and Tyrants of the Moonsea.
Tileset facelifts for the Forest and Rural Winter tileset, crafted by Zwerkules
Medieval City, Medieval Rural, and Mountain Snow sets, also by Zwerkules
Lizardfolk Interior microset
Seaships microset
Additions to several tilesets:
Several new docking ships groups, and a thatched-roof building, in Castle Exterior, Rural
New doorway tiles for Crypts and City Interior
476 assorted placeables
13 creature models
3 shields, the Wand of Orcus, and a brass candlestick 'torch'
A complete "time of day" skybox texture set for the “Icy, Clear sky” skybox
42 ambient Music tracks
54 load screens
25 assorted ambient sounds
5 sound sets (for specific new creatures)
Palettes and blueprints for all imported Ossian content: Items, Creatures, and Placeables
For the tileset facelifts, there is a configuration toggle (on by default) to use them in the main campaigns and all official DLC. Custom content modules can use them as new tilesets. (As the tile layout is compatible, you could also just open the .are file in GFFEditor and replace the tileset reference.)
Player Dungeon Master Mode
Players can now acquire and relinquish DM privileges during normal play, assuming they know the DM password. A player DM will have all of the normal dungeon master ruleset amenities: Their player character will turn invincible; they will be able to cast any spell they wish, and their skill checks will always be made against max.
However, player DMs will not gain features specific to DM characters: Their feat list will not include all the DM abilities, and they will not walk any faster. They will also not join the DM party/faction, so they will not be able to see all player parties.
Dedicated servers can turn this off in configuration.
To enter player DM mode, you can use the console commands (`dm_login <pw>` and `dm_logout`), or you can use the debug UI.
There is a new script command that can be used to distinguish between player DMs and “real” DMs:
// Returns TRUE if the given player-controlled creature has DM privileges
// gained through a player login (as opposed to the DM client).
// Note: GetIsDM() also returns TRUE for player creature DMs.
int GetIsPlayerDM(object oCreature);
As a consequence, GetIsDM() will now return TRUE for player DMs. Previously, you could rely on this being static per-connection, as true DMs could not drop their privileges.
Pathfinding improvements
Pathfinding quality in placeable and creature-heavy areas has been significantly improved, beyond the optimisations already done in 8193.13.
Your character should no longer get stuck on random placeables, or not find their way around other creatures.
Conversation script parameters
You can now specify script parameters in the toolset conversation editor, and these parameters can be queried via new the new script command:
// Returns the script parameter value for a given parameter name.
// Script parameters can be set for conversation scripts in the toolset's
// Conversation Editor, or for any script with SetScriptParam().
// * Will return "" if a parameter with the given name does not exist.
string GetScriptParam(string sParamName);
There is also a script command to set parameters when invoking other scripts via ExecuteScript.
// Set a script parameter value for the next script to be run.
// Call this function to set parameters right before calling ExecuteScript().
void SetScriptParam(string sParamName, string sParamValue);
Scripted access to SQLite databases
Full access to the sqlite API has been added.
You can access the following databases:
Campaign: Databases spanning modules and savegames, living in database/.
Module: A database attached to the running module, persisted to savegames.
Player: Each player character has a database attached that gets saved to the character .bic file when saving to a vault (local/server), or exporting the character in singleplayer. It also gets saved to savegames.
To get you started, please check INSTALLDIR/lang/en/docs/SQLite.txt for a short introduction and further documentation on the newly-added script commands.
Please note: This is an advanced feature, and requires a solid understanding of SQL to make robust and effective use of.
Scripted mouse targeting mode
You can now trigger cursor targeting mode from scripting:
// Makes oPC enter a targeting mode, letting them select an object as a target
// If a PC selects a target, it will trigger the module OnPlayerTarget event.
void EnterTargetingMode(object oPC, int nValidObjectTypes = OBJECT_TYPE_ALL, int nMouseCursorId = MOUSECURSOR_MAGIC);
// Gets the target object in the module OnPlayerTarget event.
// Returns the area object when the target is the ground.
object GetTargetingModeSelectedObject();
// Gets the target position in the module OnPlayerTarget event.
vector GetTargetingModeSelectedPosition();
// Gets the player object that triggered the OnPlayerTarget event.
object GetLastPlayerToSelectTarget();
A new module event has been added to support this.
Caveat: The toolset cannot currently configure this module event. You need to set it via SetEventScript() at module load.
New script actions related to item property usage
These script commands allow NWScript to properly trigger item property usage, circumventing the Talent system.
// Returns the number of uses per day remaining of the given item and item property.
// * Will return 0 if the given item does not have the requested item property,
// or the item property is not uses/day.
int GetItemPropertyUsesPerDayRemaining(object oItem, itemproperty ip);
// Sets the number of uses per day remaining of the given item and item property.
// * Will do nothing if the given item and item property is not uses/day.
// * Will constrain nUsesPerDay to the maximum allowed as the cost table defines.
void SetItemPropertyUsesPerDayRemaining(object oItem, itemproperty ip, int nUsesPerDay);
// Queue an action to use an active item property.
// * oItem - item that has the item property to use
// * ip - item property to use
// * object oTarget - target
// * nSubPropertyIndex - specify if your itemproperty has subproperties (such as subradial spells)
// * bDecrementCharges - decrement charges if item property is limited
void ActionUseItemOnObject(object oItem, itemproperty ip, object oTarget, int nSubPropertyIndex = 0, int bDecrementCharges = TRUE);
// Queue an action to use an active item property.
// * oItem - item that has the item property to use
// * ip - item property to use
// * location lTarget - target location (must be in the same area as item possessor)
// * nSubPropertyIndex - specify if your itemproperty has subproperties (such as subradial spells)
// * bDecrementCharges - decrement charges if item property is limited
void ActionUseItemAtLocation(object oItem, itemproperty ip, location lTarget, int nSubPropertyIndex = 0, int bDecrementCharges = TRUE);
Override hilite colour on objects
You can now override the mouse-over (“hilite”) colour on objects.
// Sets oObject's hilite color to nColor
// The nColor format is 0xRRGGBB; -1 clears the color override.
void SetObjectHiliteColor(object oObject, int nColor = -1);
Custom mouse cursors
You can now override the mouse cursor a ingame object presents. Additionally, mouse cursors have been unhardcoded, so you can add more via custom content (see MOUSECURSOR_CUSTOM_00).
// Sets the cursor (MOUSECURSOR_*) to use when hovering over oObject
void SetObjectMouseCursor(object oObject, int nCursor = -1);
ProgFX have been unhardcoded
A new 2da, progfx.2da has been added, that links visualeffect.2da columns. This allows for adding additional custom skin effects, beams, MIRVs, etc.
Texture replacements
You can now replace individual textures on objects at runtime.
// Replace's oObject's texture sOld with sNew.
// Specifying sNew = "" will restore the original texture.
// If sNew cannot be found, the original texture will be restored.
// sNew must refer to a simple texture, not PLT
void ReplaceObjectTexture(object oObject, string sOld, string sNew = "");
Walk animations have been unhardcoded
You can add new walk anims by naming them `walk_002`, `walk_003`, etc. (001 is walkdead, 002 is hardcoded to walkinj)
Weather Types Unhardcoded
Added new 2da: weatherypes.2da; which - unsurprising, considering the name - unhardcodes weather types.
Scripted wind management
The game now allows much finer-grained scripted control over the wind data.
// Sets the detailed wind data for oArea
// The predefined values in the toolset are:
// NONE: vDirection=(1.0, 1.0, 0.0), fMagnitude=0.0, fYaw=0.0, fPitch=0.0
// LIGHT: vDirection=(1.0, 1.0, 0.0), fMagnitude=1.0, fYaw=100.0, fPitch=3.0
// HEAVY: vDirection=(1.0, 1.0, 0.0), fMagnitude=2.0, fYaw=150.0, fPitch=5.0
void SetAreaWind(object oArea, vector vDirection, float fMagnitude, float fYaw, float fPitch);
Visual effects can now use PLT textures
Visual effects can now refer to PLT textures. The layer colours/indices are inherited from the object the effect is applied to (such as creatures).
Visual effects can now be scaled, rotated, and translated
When applying a visual effect, you can now scale, rotate and translate it, in relation to the parented object. The script commands have been extended to support this:
effect EffectVisualEffect(int nVisualEffectId, int nMissEffect=FALSE, float fScale=1.0f, vector vTranslate=[0.0,0.0,0.0], vector vRotate=[0.0,0.0,0.0]);
effect EffectBeam(int nBeamVisualEffect, object oEffector, int nBodyPart, int bMissEffect=FALSE, float fScale=1.0f, vector vTranslate=[0.0,0.0,0.0], vector vRotate=[0.0,0.0,0.0]);
Modules and HAKs can now contain more than 16k items
The game can now load more than 16356 resources from ERF containers (modules and haks).
New Configuration UI
The game options UI has been replaced with a new implementation that now allows access to all of the new configuration options. The “Debug UI” configuration tab has been removed as a consequence.
This UI is still work in progress, but it is useful enough to include now.
Debug UI has been revamped, including a new NWScript evaluation helper
The debug UI has been rewritten to be leaner and expose more useful features. You can now toggle DebugMode, renderaab, rendertilepathnodes via checkboxes.
A new widget has been added that allows evaluating NWScript snippets on the running server (assuming you have DM privileges, or are in DebugMode).
Local variable access has been sped up significantly
Local variable access on objects is now O(n) in the worst case, but usually significantly faster than that. This is especially noticeable when you have thousands of variables on a single object. Previously, this could take up to 500ms to read a single variable; now access is below 10ms in these scenarios.
Repaired bounding box on Candlestick torch; changed light to yellow 5m; repaired mesh and fixed smoke placement #95
Removed erroneous palette entry from Birds category #107
Compiled ~200 models (mostly for DODEE)
TTF02 & TTS02: Baked a new set of minimaps, to add missing waters and roads
TNO01: Fixed 3x1 and 4x1 Ship (Grass Set) for floating meshes (X-form)
TTS02: Replaced Road to Bridge texture, fixed walkmesh
Placeable Fog Emitters: Added missing mf_smoke texture
Daggerford & Tyrants of the Moonsea Placeables:
Reworked placeable Use nodes on card table, and a couple other placeables (#110)
Shadow and Mesh fixes
Bounding Box fixes
PX2_G02 (Dragon Statue): Fixed flipped collision
Emerald Golem: Set the skinmesh so golems body would also be translucent
TNO01: Fixed tiles from Grass group that were using tno01_dirt03 City ground (#152)
PLC_F06 (Catapult): Fixed shadows on multiple meshes, welded parts and gave it a proper rope texture
TTS02: Several Shadow Fixes, Mesh Fixes
TNO01: Restored 3 thatch houses (Grass section) that never made palette. New doors added to doortypes.2da (tn_sdoor_03, tn_sdoor_25)
TDM01: Mining Platform 2 (2x2) Fixed an animloop that wouldn't shut off, and added one for the molten forge tile
TWC03_A02_07: Fixed a broken fireplace animation
TTS02 & TTF02: Shadow fixes, new & fixed animations (w/ new animloop options), a-nodes for transparency (water etc. blends properly)
TSS13 (Seaships): Fixed several boats that were causing a toolset crash #142
Miscellaneous Script Commands
The StringToObject() script command can be used as the reverse of ObjectToString().
// Convert sHex, a string containing a hexadecimal object id,
// into a object reference. Counterpart to ObjectToString().
object StringToObject(string sHex);
Miscellaneous Improvements
Texture pack support has been removed. All texture pack content has been merged into nwn_base.key.
GUI: The bright ambient light has been disabled in UI scenes. This results in a more natural look in chargen and the compass.
Nui: Windows now store position, size and collapse state in tml
Nui: Modal windows now autosize to parent
nwsync: increased check batch size for verifying existing data, dramatically speeding up process
nwsync: increased local recv buffer size, speeding up transfers on low framerates
WriteTimestampedLogEntry() now gets sent to all players as a console/debug message, if the server is in DebugMode. This is mostly useful for singleplayer module testing, when the module author uses the game log for debugging.
ExoConfig: Trap and highlight colors are now stored as hex codes.
DDS textures now support BC4 and BC5 encodings, to provide higher quality DDS options for greyscale and two-channel textures, such as height or specularity.
Config UI: Added a configuration setting: General Shader/Lighting Quality.
Shaders: Defines BUILD_VERSION and BUILD_REVISION expose build info.
Fixes
Renderer: Fixed needlessly recalculating static lights in full dynamic light mode; this used to impact performance heavily with some specific static tile lights.
Fixed grass occasionally overlapping, resulting in flickering.
Fixed wind direction variation being offset by 120 degrees at peak.
SQLite: No longer emit “error: schema has changed” non-errors when related to migrations.
VM::DestroyArea() will now also fail with return code -2 if players are currently on a load screen transitioning into the area.
Fixed large creatures intruding into your personal space. #124
Config: The experimental “Aggressive Texture Caching” option has been removed (it is now on for everyone).
Sending WriteTimestampedLogEntry messages to clients in DebugMode can now be toggled off with a setting.
NUI expand/minimize chevrons have been inverted.
Chat Panes: When in split mode, second chat pane now shows CONSOLE-level messages (debug messages, etc) #18
Character generation: Spell school strrefs are now actually read from the 2da
VM: Script situations now always keep a hold of the actual bytecode they are spawned from. This fixes the game doing funny things when the underlying compiled script file is swapped out. This also fixes code closures from within ExecuteScriptChunk (and the Debug UI).
Store and load TemplateResRef from gff for door object types (so that GetResRef() does not return “”). #100
Dead players now call CNWSArea::DecrementPlayersInArea() #105
VM::AdjustAlignment(): Game will now render the actual alignment shift that has happened, instead of the requested one: AdjustAlignment(-100) when at 50 will now say "You have shifted by -35" (to get you to 15, where the good/evil notchiness is) instead of "You have shifted by -100" but still putting you to 15.
VM::AdjustAlignment(): Game will now not render any feedback if no alignment shift occurred (previously, it would render "Your alignment has shifted by -100" if you requested -100, even if you were already at rock bottom).
Object hilite state is now properly persisted to GFF.
Fixed the game crashing or reading invalid memory when quickslotting spells as a DM.
Fixed a crash happening with drag & drop of inventory icons.
Area transition screens on the client no longer partially render a grey overlay.
Drag selection rendering in DM client was fixed.
The nwhak.exe binary has moved into bin/, out of util/.
Fixed heap overflow in ExoString::Insert (VM::Insert, dm_dumplocals)
DestroyArea(): no longer skip the last object; this used to leave things in object space attached to nothing
Movies: search path now prefers userdirectory over install, allowing users to override base movies.
GUI: Nuklear-based UI now emits sounds when clicking buttons. #5
GUI: The button “Remove Server from Favorites” in MP ui has been made to work once again.
GPU vendor optimisations are now detected automatically; the config key optimize-buffer-updates has been removed.
ambientmusic.2da: Fixed ids #80
VM: A memleak in PostString has been fixed.
Toolset
Toolset: Fixed bearing not being saved for placeables and doors
Toolset: texture pack selector was removed.
Toolset: Removed errant “OK” label in Area Properties #59
Toolset: Portrait backgrounds in object properties have been fixed.
Toolset: Update static lighting after changing tile light properties.
Toolset: The Bearing float should no longer flap sign when saving out the area gff.
Toolset: Improved script editor responsiveness as well as save/load module performance.
Toolset: Area view settings are now applied to all open tabs.
Toolset: A menu option to toggle AABB rendering was added.
Toolset: No longer select last-opened module in save UI.
Toolset: The UI for caching scripts has been removed, as the underlying system has been disabled for a while. It was pointless and counterproductive from a performance standpoint.
Toolset is now linked to 32bit oal-soft. Hopefully no more sound woes.
Campaigns and Premiums
Campaign SoU: Fixed the Baby Achievement
TotM: Small fix for floating placeables in Elmwood