1. Neverwinter Nights: Enhanced Edition
  2. News

Neverwinter Nights: Enhanced Edition News

Development Build 85.8193.30

Hello, dear friends!

Today, we have a development build for you. We appreciate your assistance in testing it, and reporting any issues you find.

The module compatibility has once again been bumped - to version 1.85 - due to the new script commands that allow tile/area actions in the radial menu, and a bit more GUI modification.

Fixes
  • Renderer: Disabled soft particles on world-aligned emitters; fixes faded/missing effects such as spell mantle.
  • Renderer: TSB are now generated correctly for animated/danglies.
  • Renderer: Removed creature preloading code; it was doing nothing useful on desktop platforms.
  • Renderer: Drawbucket implementation for caching transform lists; also fixes additive blending render issues (such as water making visual effects wavy; water showing geometry from own model).
  • Renderer: Fixed highlight gobs ("tab glow") not correctly scaling along visual transforms.
  • Renderer: Fixed static placeables incorrectly disabling/breaking animations of non-static placeables with the same model.

  • Game: Fixed a memleak in pathfinding.
  • Game: Fixed placeables not bumping creatures out of the way when being spawned into an area. #349
  • Game/VM: Fixed Get*DurationRemaining returning the wrong value due to time overflow.
  • Game: Fixed a rare crash when exiting the game while a NWSync download is in progress.

  • Startgame UI: Fixed URL escaping for URLs with long paths.
  • Startgame UI: Removed superfluous text warnings about "Clicking link opens browser".
  • Startgame UI: Improvements to the promotion panels for custom repositories.
  • Startgame UI: Images loaded in the new content browser are now correctly served from cache if no internet connection is available.
  • UI: Put most hardcoded strings in StartGame, NWSync and Config panels into the tlk (not translated yet).

  • Config: On Windows, codepage is now auto-detected from the system locale.


Tile/Radial actions, surfacemat.2da
  • You can now assign custom radial actions on tiles (There is a new module event you can access via SetEventScript).
  • surfacemat now support 64 materials, up from 32.
  • surfacemat.2da is re/loaded as part of custom content.


// Gets the ID (1..8) of the last tile action performed in OnPlayerTileAction
int GetLastTileActionId();

// Gets the target position in the module OnPlayerTileAction event.
vector GetLastTileActionPosition();

// Gets the player object that triggered the OnPlayerTileAction event.
object GetLastPlayerToDoTileAction();


New Script Commands

You can now pop up or restrict GUI panels.

We added a event that triggers clientside interaction with some panels (There is a new module event you can access via SetEventScript).

int GUI_PANEL_PLAYER_DEATH   = 0;
int GUI_PANEL_MINIMAP = 2;
int GUI_PANEL_COMPASS = 3;
int GUI_PANEL_INVENTORY = 4;
int GUI_PANEL_PLAYERLIST = 5;
int GUI_PANEL_JOURNAL = 6;
int GUI_PANEL_SPELLBOOK = 7;
int GUI_PANEL_CHARACTERSHEET = 8;

int GUIEVENT_CHATBAR_FOCUS = 1;
int GUIEVENT_CHATBAR_UNFOCUS = 2;
int GUIEVENT_CHARACTERSHEET_SKILL_CLICK = 3;
int GUIEVENT_CHARACTERSHEET_FEAT_CLICK = 4;
int GUIEVENT_EFFECTICON_CLICK = 5;
int GUIEVENT_DEATHPANEL_WAITFORHELP_CLICK = 6;
int GUIEVENT_MINIMAP_MAPPIN_CLICK = 7;
int GUIEVENT_MINIMAP_OPEN = 8;
int GUIEVENT_MINIMAP_CLOSE = 9;
int GUIEVENT_JOURNAL_OPEN = 10;
int GUIEVENT_JOURNAL_CLOSE = 11;
int GUIEVENT_PLAYERLIST_PLAYER_CLICK = 12;
int GUIEVENT_PARTYBAR_PORTRAIT_CLICK = 13;
int GUIEVENT_DISABLED_PANEL_ATTEMPT_OPEN = 14;

// Gets the player that last triggered the module OnPlayerGuiEvent event.
object GetLastGuiEventPlayer();

// Gets the last triggered GUIEVENT_* in the module OnPlayerGuiEvent event.
int GetLastGuiEventType();

// Gets an optional integer of specific gui events in the module OnPlayerGuiEvent event.
// * GUIEVENT_CHATBAR_*: The selected chat channel. Does not indicate the actual used channel.
// 0 = Shout, 1 = Whisper, 2 = Talk, 3 = Party, 4 = DM
// * GUIEVENT_CHARACTERSHEET_SKILL_SELECT: The skill ID.
// * GUIEVENT_CHARACTERSHEET_FEAT_SELECT: The feat ID.
// * GUIEVENT_EFFECTICON_CLICK: The effect icon ID (EFFECT_ICON_*)
// * GUIEVENT_DISABLED_PANEL_ATTEMPT_OPEN: The GUI_PANEL_* the player attempted to open.
int GetLastGuiEventInteger();

// Gets an optional object of specific gui events in the module OnPlayerGuiEvent event.
// * GUIEVENT_MINIMAP_MAPPIN_CLICK: The waypoint the map note is attached to.
// * GUIEVENT_CHARACTERSHEET_*_SELECT: The owner of the character sheet.
// * GUIEVENT_PLAYERLIST_PLAYER_CLICK: The player clicked on.
// * GUIEVENT_PARTYBAR_PORTRAIT_CLICK: The creature clicked on.
// * GUIEVENT_DISABLED_PANEL_ATTEMPT_OPEN: For GUI_PANEL_CHARACTERSHEET, the owner of the character sheet.
object GetLastGuiEventObject();

// Disable a gui panel for the client that controls oPlayer.
// Notes: Will close the gui panel if currently open.
// Does not persist through relogging or in savegames.
// Will fire a GUIEVENT_DISABLED_PANEL_ATTEMPT_OPEN OnPlayerGuiEvent for some gui panels if a player attempts to open them.
// You can still force show a panel with PopUpGUIPanel().
// * nGuiPanel: A GUI_PANEL_* constant, except GUI_PANEL_PLAYER_DEATH.
void SetGuiPanelDisabled(object oPlayer, int nGuiPanel, int bDisabled);


Tyrants of the Moonsea
  • one dialog branch in Hlesson's conversation breaks his quest
  • fixed a rare situation in the Marel fight where the exit door wouldn't open
  • removed Sharalyn's Cloud of Bewilderment spell because it caused in-party hostility
  • the Kur-Tharsu areas are now "No PVP" to reduce in-party hostility


Darkness over Daggerford
  • a cutscene in smuggler's cave sometimes did not trigger
  • a cutscene in smuggler's cave sometimes was aborted early


Known Issues
  • The toolset tilefade setting "Always" doesn't work correctly.

New Patch Arrives Today: Stable Build 8193.28 is Live!

Hello, dear community!

We just released a small update for Neverwinter Nights: Enhanced Edition. Thank you all for your continued support— read on for details!

Today's patch (aka Revision 28) includes:

  • Toolset: Fixed a crash when rendering some custom content.
  • Nuklear/Nui: Fixed line breaks with non-ASCII characters: Module descriptions for polish and russian should now wrap properly.
  • LoadAliases: Fixed DOCINSTALL not working on some systems (Options -> Open Source Licences tab was empty).
  • Movies: Fixed EndMovie() not working for nwsync-sourced content, such as Eye of the Beholder (because the manifest had already been unloaded).


If you are feeling adventurous, why not give the development build a try, with many more fixes and features in it?!

Development Build 84.8193.29

Hello friends,

we're now shipping dev build 29!

Please note: Modules saved with the toolset of this patch are flagged as Compat 1.84, due to some new script commands.

As always, we appreciate your continued support!

[h2]Game, Logic and Rules[/h2]
  • Shields: Now take their AC from the BaseAC column, no longer hardcoded. Still only works for the three base shield types!
  • Game: Reverted the MoveToObject fRange change; fRange is now once again ignored for that specific breakage. This fixes various issues in custom content modules, notably the elusive wizard in Aielund III Pt 3.
  • Game/baseitems: New column IsMonkWeapon replaces all hardcoded checks against BASETYPE_KAMA.
  • Game/baseitems: Custom content can now make Flurry Of Blows also work with ranged weapons (when IsMonkWeapon is enabled).
  • Game/baseitems: New column WeaponFinesseMinimumCreatureSize. Takes 0/**** or the minimum creature size type needed to finesse.
  • Game: Other stealthed/concealed creatures no longer pop up briefly when transitioning into a new area or into a doored-off room.
  • Game: Fixed creatures doing a weird shimmy/turny when coming to a stop.
  • Game data: Added “Neverwinter Chess” module from old Bioware demo modules.


[h2]Config[/h2]
  • Game/Config: You can now hide player quickchat lines from the chat window (Config->UI->Feedback)
  • Config: Exposing codepage setting under Game->Advanced; this should make it easier for Russian language players to set the correct codepage without having to edit settings.tml.
  • Config: New option to enable SQLite API tracing to the server log: Show all queries, or just show queries running longer than N msec.


[h2]Tech[/h2]
  • Core: Upgraded static openssl to 1.1.1k.
  • Core: Upgraded libyuv to latest master upstream.
  • Core: Upgraded SQLite to version 3.36.0.

  • Renderer: VDO optimisations in preparation for OpenGL 3.3.
  • Renderer: The fallback envmap is now a globally shared object, not tied to the scene.
  • Renderer: Fixed most visual oddities related to water refraction (fringing, edge gaps, highlight strangeness).
  • Renderer: Fixed a regression that prevented custom shader params being set in scripting.
  • Renderer: Improved TSB generation, doing away with some visual glitches when adjacent faces had opposing hardness.
  • Renderer: Fixed a crash when setting hilite color of party members clients haven’t seen yet.
  • Renderer: Fixed a crash when setting a texture override for a creature object that the client hasn’t seen yet.

  • Nk/Nui: Image renderer can now render webm.
  • Nk/Nui: Fix key repeat not working.
  • Nk/Nui/json: NWSync Repository CExoLocStr fields now convert to the local game encoding; should fix various special characters. This means you now need to have the json once again properly encoded as UTF-8. (e.g. module descriptions in Polish)
  • Nk/Nui: Copy/Paste now works with Cmd on Mac, instead of Ctrl.

  • Game Launcher: Repositories can now advertise websites (such as the Vault on the Curated repo).
  • Game Launcher: Modules can now have a list of web links.
  • Game Launcher: Repository Info now shows the origin URL.

  • NWSync Management UI: Text clarity improvements to the disk space effect of deleting manifests.
  • NWSync UI: Sped up manifest loading. Game Launcher and Storage UI should now appear much faster.
  • NWSync UI: Fixed the NWSync housekeeping UI no longer popping up when deleting multiple manifests in a row.
  • NWSync UI: NWSync Storage UI now remembers selected checkboxes and sorting.
  • NWSync: Game no longer crashes when running out of disk space while downloading manifest, shows error instead.
  • NWSync/SQLite: We now use soft limits on shard size, not hard limits. This fixes a very rare “out of disk” error when trying to write metadata even though plenty of free space is available.

  • VM: Fixed a crash in reconciling automap data when trying to load a player TURD. #309
  • VM: Fixed CopyObject not triggering OnAreaEnter (fixes HotU Beholder caves anti-magic restore)
  • VM: Fixed SetCampaignString(, “”) resulting in a SQL error. Now it deletes the variable from the database instead. It now also deletes entries when other types are “empty”.
  • VM: GetCurrentlyRunningEvent now has param bInheritParent for cases such as CreatureOnDeath/Damaged returning the wrong event ID otherwise.
  • VM: Fixed Area Of Effect sometimes not returning the expected objects due to local object positions in memory not updating correctly. #52
  • VM: SQLite: soundex() now available to scripting. https://sqlite.org/lang_corefunc.html#soundex
  • VM: SQLite: Math functions now available to scripting. https://sqlite.org/lang_mathfunc.html
  • VM: Cassowary: Fixed a crash when calling AddConstraint with invalid math formula. #293
  • VM: We had to change how Create/Copy/DestroyArea works. Most prominently:
  • Areas you create via Create/Copy now have their own auto-generated resref in the nw_ namespace; they no longer have the same resref as the originating area/template. You cannot influence this. nw_ is also the same namespace that the toolset reserves for game-builtin content, so you shouldn’t be able to clobber into it. Instanced areas go into CURRENTGAME:, until they are saved into a .sav. (This also means you can CreateArea with the new template, if you really wanted, though why would you? You’d get the area as it looked like at original instantiation time)
  • Areas are now saved to savegames correctly and savegames no longer corrupt when the area count changes.
  • Savegames now also store a serialised image of the .are data.
  • This means that CreateArea(“originalresref”) in savegames will now instance the area as saved in the savegame, NOT as designed in the toolset. This is because modules don’t actually load anymore after a savegame; the savegame replaces the original module.
  • CopyArea now supports assigning a new tag and name directly on instantiation.
  • This is a high-risk change, as it touches significant parts of the area load codepath. We’d appreciate thorough testing.

  • Movies: We no longer show the Bioware credits for all modules; only the last module in each main campaign.
  • Movies: Fixed error/crash when calling EndGame(“”). Now the game shows no movie instead, and just quits the main menu.


[h2]New Script Commands[/h2]

// Create a RunScript effect.
// Notes: When applied as instant effect, only sOnAppliedScript will fire.
// In the scripts, OBJECT_SELF will be the object the effect is applied to.
// * sOnAppliedScript: An optional script to execute when the effect is applied.
// * sOnRemovedScript: An optional script to execute when the effect is removed.
// * sOnIntervalScript: An optional script to execute every fInterval seconds.
// * fInterval: The interval in seconds, must be >0.0f if an interval script is set.
// Very low values may have an adverse effect on performance.
// * sData: An optional string of data saved in the effect, retrievable with GetEffectString() at index 0.
effect EffectRunScript(string sOnAppliedScript = "", string sOnRemovedScript = "", string sOnIntervalScript = "", float fInterval = 0.0f, string sData = "");

// Get the effect that last triggered an EffectRunScript() script.
// Note: This can be used to get creator or tag, among others, of the EffectRunScript() in one of its scripts.
// * Returns an effect of type EFFECT_TYPE_INVALIDEFFECT when called outside of an EffectRunScript() script.
effect GetLastRunScriptEffect();

// Get the script type (RUNSCRIPT_EFFECT_SCRIPT_TYPE_*) of the last triggered EffectRunScript() script.
// * Returns 0 when called outside of an EffectRunScript() script.
int GetLastRunScriptEffectScriptType();

// Hides the effect icon of eEffect and of all effects currently linked to it.
effect HideEffectIcon(effect eEffect);

// Create an Icon effect.
// * nIconID: The effect icon (EFFECT_ICON_*) to display.
// Using the icon for Poison/Disease will also color the health bar green/brown, useful to simulate custom poisons/diseases.
// Returns an effect of type EFFECT_TYPE_INVALIDEFFECT when nIconID is < 1 or > 255.
effect EffectIcon(int nIconID);

Development Build 8193.28

Hello, everyone!

This developent build .28 contains stabilisation fixes.

If you were having issues with the toolset on the latest stable release, please try this one.

  • Toolset: Fixed the crashing regressed with the previous patch.
  • Nuklear/Nui: Fixed line breaks with non-ASCII characters. Module descriptions for Polish and Russian should now wrap properly.
  • LoadAliases: Fixed DOCINSTALL not working on some systems (Options -> Open Source Licences tab was empty).
  • Movies: Fixed EndMovie() not working for nwsync-sourced content (because the manifest had already been unloaded).

Stable Build 8193.27

Hello there!

This build is a hotfix to address an issue with single-player save games for curated content. No other changes have been made.

As always, please enjoy the game, and have a nice weekend.