Patch Version1.87.8193.35
Patch release date (PC)

Development/beta - 16/3/2023

Final - 25/5/2023

Patch release date (Others)
Patch release notes


Hello adventurers!

Today we’re releasing a new update for
Neverwinter Nights: Enhanced Edition. Patch 8193.35 is the result of a year-long love effort by community developers.

Patch Highlights

  • AOE Indicator | Spells and spell-like abilities now display a targeting indicator displaying their range and, if appropriate, their AOE shape and size

  • 8 Multiclasses | Added support for up to 8 multiclasses, configurable per-module

  • Faster Load Times | Improved area load times by up to 100x (!)

  • News Section | Added an in-game News UI that shows upcoming patches and community news

  • Script-created UI Improvements | “NUI” (script-created UI) will no longer break input to the game (WASD, drag & drop)

  • Play NWN as a Cartoon | Added a new "Toon" post-processing shader as a graphical option

  • Goodies for Builders  | Hundreds of new functions and goodies for module builders

  • Hundreds of Bugfixes & Optimizations | More bugs squashed

Check out the full patch notes here:

Join the community and provide feedback directly to development team members on Discord: (Before posting, please take a moment to carefully read the introductory text in #welcome).

If you're currently subscribed to the development patch, you'll continue with the upcoming .36 patch cycle going forward. If you wish to stick to this stable release (.35), select the “default” branch in Steam/GOG Galaxy/BDC.

Thank you for your support!

This patch was made entirely by community members: Done entirely for personal enjoyment, out of good will, and with copious amounts of adhesive.

Development team:

clippy, Daz, Jasperre, Liareth, niv, Soren, tinygiant, virusman

With explicit thanks to:

The NWNDEV Discord folks. Your testing and support was and is invaluable.
The Neverwinter Vault.
Nereida and Zwerkules.
Everyone in the community!

Patch Notes


  • Spells and spell-like abilities now display a targeting indicator displaying their range and, if appropriate, their AOE shape and size.
  • Added support for up to 8 multiclasses, configurable per-module.
  • Improved area load times by up to 100x!
  • Added an in-game News UI that shows upcoming patches and community news.
  • NUI windows will no longer break input to the game (WASD, drag&drop).
  • Added a new "Toon" postprocessing shader.
  • Hundreds of new functions and goodies for module builders.
  • Hundreds of bugfixes and optimizations.


  • Added support for up to 8 multiclasses on creatures, controlled by ruleset.2da toggle.
  • Added spell targeting indicators, sourced from spells.2da.
  • Added a News UI to the main menu with preview of upcoming patches and important community news.
    • All nwsync CI repos can add their own news as well.
  • Added a new "Toon" postprocessing shader that makes NWN looks more like a cartoon.
    • Disabled by default, set graphics.fbo.toon.enabled = true to enable.
    • Includes a few other graphics.fbo.toon.* settings to fine-tune.
  • Added support for dynamic area lighting (e.g. moving sun). See nw_dynlight.nss for details.
  • Added option to combine PLT textures on the GPU using shaders.
  • Added support for custom damage types. The game can now support up to 32 damage types (13 hardcoded plus up to 19 custom).
  • Added support for customizable weapon glow FX.
  • Added support for emitters with custom shaders.
  • Added scriptable (per-player) global shader uniforms (see SetShaderUniform* in nwscript.nss and inc_scriptable.shd).
  • Added aarch64 client and server linux binaries.
  • Added support for arbitrary character encoding/languages through a new encoding.2da.
  • Added option to confirm casting of spells that target self (so you can preview the impact area).
  • Modules may now specify a "default character", which can be shipped as a .bic file inside the .mod.
    • If specified, the module is launched immediately using that character without options to choose a different one or create new.
    • To use, set the "Mod_DefaultBic" resref field in module.ifo (no GUI option yet).
  • Modules may now specify party control mode that takes precedence over server settings.
    • No GUI option yet, but you can set "Mod_PartyControl" INT in module.ifo: 0=Server default, 1=enabled, 2=disabled.
  • Added 8 new tile pathnodes ('q'..'x').
  • Added support for wireframe rendering in debug UI.
  • Added Cancel button to the NWScript UI object picker.
  • Added rock/chasm crosser to Medieval Rural 2.
  • Added missing tiles to Medieval City 2.

82 new NWScript functions (see nwscript.nss for documentation)

  • UnyieldingEffect()
  • IgnoreEffectImmunity()
  • SetShaderUniformFloat(), SetShaderUniformInt(), SetShaderUniformVec()
  • SetSpellTargetingData(), SetEnterTargetingModeData()
  • GetMemorizedSpellCountByLevel(), GetMemorizedSpellId(), GetMemorizedSpellReady()
  • GetMemorizedSpellMetaMagic(), GetMemorizedSpellIsDomainSpell()
  • SetMemorizedSpell(), SetMemorizedSpellReady(), ReadySpellLevel()
  • ClearMemorizedSpell(), ClearMemorizedSpellBySpellId()
  • GetKnownSpellCount(), GetKnownSpellId(), GetIsInKnownSpellList()
  • GetSpellUsesLeft(), GetSpellLevelByClass()
  • ReplaceObjectAnimation()
  • SetObjectVisibleDistance(), GetObjectVisibleDistance()
  • SetGameActivePause(), GetGamePauseState()
  • SetGender()
  • SetSoundset(), GetSoundset()
  • SetCommandingPlayer()
  • SetCameraLimits(), SetCameraFlags()
  • RegExpMatch(), RegExpIterate(), RegExpReplace()
  • ResManGetFileContents()
  • CompileScript()
  • AttachCamera()
  • GetObjectUiDiscoveryMask(), SetObjectUiDiscoveryMask()
  • SetObjectTextBubbleOverride()
  • ClearObjectVisualTransform()
  • GetLastGuiEventVector()
  • GetAreaLightColor(), SetAreaLightColor()
  • GetAreaLightDirection(), SetAreaLightDirection()
  • AbortRunningScript()
  • GetScriptBacktrace(), GetScriptRecursionLevel()
  • SetJmp(), LongJmp(), GetIsValidJmp()
  • GetScriptName(), GetScriptChunk()
  • EffectPacified(), EffectBonusFeat(), EffectTimestopImmunity(), EffectForcedWalk()
  • GetPlayerBuildVersionPostfix(), GetPlayerBuildVersionCommitSha1()
  • GetEffectLinkId()
  • GetFeatRemainingUses()
  • GetTileID(), GetTileOrientation(), GetTileHeight()
  • SetTile(), SetTileJson()
  • SetTileAnimationLoops()
  • ReloadAreaGrass(), ReloadAreaBorder()
  • SetEffectIconFlashing()
  • GetPCItemLastEquippedSlot(), GetPCItemLastUnequippedSlot()
  • GetSpallCastSpontaneously(), GetLastSpellLevel()
  • SqlResetQuery()
  • GetTickRate(), GetMicrosecondCounter(), GetSpellFeatId()
  • HashString()

NUI additions

  • NUI can now be skinned, both globally and per-module. See nui_skin.tml for details.
  • "disabled_tooltip" property, shows up on hover over disabled elements only.
  • Strings can now be sent as STRREF.
  • draw_list now supports BEFORE and AFTER (per-widget), so you can paint behind widgets too.
  • draw_list now supports rendering only on hover, mouse button down.
  • You can now "encourage" (= breathing inner glow) elements same as some native buttons. This should work with all widget types.
  • Added support for rendering image subregions (e.g. spritemaps).
  • Added bindable optional "acceptsInput" param to window constructor.
    • All interaction will fall through to the window or game scene beneath.
    • This also means the player cannot move, resize, or close the window.
  • Added a few more options for aligning windows:
    • Centering a window by setting the window x/y position to -1.0 can now be done per axis.
    • Setting the window x/y position to -2.0 will position the top left of the window at the mouse cursor's position.
    • Setting the window x/y position to -3.0 will center the window at the mouse cursor's position.
  • Added tabbars, which work exactly as option groups, including properties, except toggle buttons are rendered instead of radio buttons.


  • Added support for using an external script editor to edit scripts (Options -> Script Editor -> External Script Editor).
  • Right clicking on a script in the pane to the left now provides the user with an option to build that script.
  • Added a few new module events to the Module Properties window:
    • OnPlayerTarget
    • OnPlayerGuiEvent
    • OnPlayerTileAction
    • OnNuiEvent
  • The Build Module option in the toolset now observes changes in temp0/ when compiling scripts.
  • Toolset no longer artificially restricts which item/body part ranges are available.

New config options

  • graphics.experimental.generate-plt-with-shaders
  • graphics.fbo.dof.focus-type
  • graphics.fbo.toon.color-edge-threshold
  • graphics.fbo.toon.depth-edge-threshold
  • graphics.fbo.toon.edge-hardness
  • graphics.fbo.toon.enabled
  • graphics.keyholing.disables-camera-collisions
  • graphics.shadows.all-types-can-cast-dynamic
  • graphics.spell-targeting-effect.color.dangerous
  • graphics.spell-targeting-effect.color.harmful
  • graphics.spell-targeting-effect.color.helpful
  • graphics.spell-targeting-effect.color.other
  • graphics.spell-targeting-effect.enabled
  • server.player-party-control
  • server.tweaks.message-limit
  • server.tweaks.message-limit-loading
  • ui.confirm-self-cast-feats
  • ui.confirm-self-cast-items
  • ui.confirm-self-cast-spells
  • ui.hide-quick-chat-text-in-chat-window
  • ui.radial.class-abilities.always-show-as-subradial
  • ui.radial.spellcasting.always-show-as-subradial

New ruleset.2da options


Enabled sqlite pragmas

  • collation_list
  • compile_options
  • defer_foreign_keys
  • foreign_key_check
  • foreign_key_list
  • foreign_keys
  • freelist_count
  • function_list
  • index_info
  • index_list
  • index_xinfo
  • page_count
  • page_size
  • table_info
  • table_list
  • table_xinfo


  • Gameplay:
    • Pressing 'H' to hide in-game GUI now also hides scriptable NUI windows.
    • NUI key down/up detection changed to not interfere with game.
    • NUI textedit(multiline=true) now auto-expands to available container height.
      • This is a breaking change for existing nui panels, but arguably better behaviour.
    • NUI textedit(multiline=true) now word wraps when reaching width limits.
    • Quickbar spells now show the name of the class they belong to, for when you have multiple spellcaster classes.
    • Disabled camera bumping into geometry when keyholing is enabled.
    • Restored pre-EE costs for items with charges. Use MAX_CHARGES_FOR_ITEM_COST ruleset.2da toggle to modify. (#483)
  • Renderer:
    • Game now uses OpenGL 3.3.
    • Nicer looking waves on water.
    • Transparent surfaces are now also backlit.
    • Models of classification other than character only cast shadows if not transparent.
  • Building and Scripting:
    • All SQL query/execution errors are now echoed to all players (like script VM errors).
    • All SQL transactions are now always rolled back when the parent script exits.
      • This means you cannot stagger a transaction across multiple DelayCommands().
    • SetUseableFlag() now also works on Doors, Creatures and Items.
    • GetItemAppearance() now works with per-part colors.
    • Get{First,Next}ObjectInArea() now has a nObjectFilter parameter.
    • SetName() now works for player characters.
    • SetObjectVisualTransform() can now target sub-models (e.g. HEAD, WING, TAIL, CLOAK).
    • SetObjectVisualTransform() now has nRepeatsRemaining and nBehaviorFlags parameters.
    • SetGuiPanelDisabled() now has an oTarget parameter.
    • GetPlayerDeviceProperty() can now query most client config values.
    • GetEffectInteger() now works on the complete range of integers for EffectDamage.
    • ActionUseFeat() now allow subfeats to be used and locations to be targeted.
    • GUI events can now trigger on radial menu (GUIEVENT_RADIAL_OPEN).
    • Area transitions now allow targeting any tag. (#425)
      • Doors and waypoints are given priority over other objects of same tag.
    • Script Compiler: Now accepts string constants in case statements. See HashString() function in nwscript.nss.
    • Script Compiler: Increased max identifier count from 16384 to 65536.
    • Script Compiler: Increased max string constant size from 512 to 8192.
    • Script Compiler: Increased max include files from 128 to 512.
  • Custom Content:
    • Increased NWSync single file max size from 15MB to 64MB.
    • Upped the body part and armor variations limit from 255 to 999 (higher may also work).
      • Older clients will default to part 0 if given a part greater than 255.
    • The shader postprocessing pass now runs always, even if no effects are enabled.
      • This allows modules to script their own post processing effects.
    • Game no longer requires po_*_m.tga file to be present to use DDS portraits.
    • Game will now fallback to closest available portrait size if one is missing.
    • Refined the debug rendering of tile path nodes.
    • "Log Model Errors" will now never truncate the log file.
    • "Log Model Errors" will now log all rejected/erroneous commands in ascii mdl files.
    • Improved handled of model vertex data, allowing for up to 3x more vertices per mesh.
    • Models with classification other than Character now all project shadows.
    • "Configure" option at chargen now uses the selected package to configure.
      • Removed the classes.2da to packages.2da matching line ID assumption.
    • Added a few more material rendering modes that can be set in MTR files:
      • transparency 1: Always render after opaque models, guarantees transparency.
      • twosided 1: renders both back- and front-facing vertices.
      • sample_framebuffer 1/2: renders near the end of the frame. Allows rendering refractions and similar.
      • volumetric 1: renders back-facing vertices to depth and renders with updated depth buffer sample texture before rendering front-facing.
  • Miscellaneous:
    • 64bit linux platforms (x86 and ARM) now advertises as such, not 32bit.
    • Internal sqlite version updated to 3.39.0.
    • ContentIndex repositories (Community tab in New Game) now accept schemaless-URLs (e.g. http://my-server.tld/repo -> my-server.tld/repo) to make input easier.
    • CI Storage Manager now shows path in addition to hostname, to make identifying multihost content easier.
    • Made backing out of submenus in 'New Game' more intuitive.
  • 2DA changes:
    • Added a row for base damage to iprp_damagetype.2da and damagehitvisual.2da.
      • This row is necessary to line up subsequent rows for custom damage types.
    • iprp_damagetypes.2da has been extended with a new column, VisualFX (index into iprp_visualfx.2da)
    • Added four new columns to spells.2da for spell targeting indicators: TargetShape, TargetSizeX, TargetSizeY, Flags
    • Added HideFromLevelUp column to skills.2da.
    • Added SkipSpellSelection column to classes.2da.
    • Added FavoredEnemtyFeat column to racialtypes.2da.


  • Fixed a bug where factions went crazy when using a non-dm client created .bic file as DM character.
  • Fixed nwsync download UI cutting off http errors.
  • Fixed visual effects on placeables re-applying over and over. (#140)
  • Fixed a human multiclass xp penalty bug. (#182)
  • Fixed a crash when unloading iprp_costtable.2da if it had blank lines or missing 2das.
  • Fixed empty sqlquery error messages in server log.
  • Fixed the DM creature selection box not working when player-party-control is off. (#432)
  • Fixed NWScript Debug UI not being able to run 16-character long script files.
  • Fixed issue where combining damage types would sometimes result in magical damage type. (#106)
  • Fixed a bug where effects of ReplaceObjectTexture() would be lost after a VFX like stoneskin is applied to the object.
  • Fixed EffectDamage to preserve damage power when doing physical damage. (#265)
  • Fixed an issue where framelimiter was also limiting the nwsync download speed.
  • Fixed over twenty distinct memory leaks.
  • Fixed ReplaceObjectTexture() removing the texture when given sNewName="" without previously having set a value.
  • Fixed familiars sometimes failing to spawn.
  • Fixed a crash when hovering over party members in other areas.
  • Fixed a crash when portalling between servers on the DM client.
  • Fixed 'a' nodes in models not always being rendered dynamic, causing transparency issues.
  • Fixed bad displacement rendering at steep view angles.
  • Fixed multiple issues when applying texture replacements to and from MTR files.
  • Fixed crash when a shadow has more vertices than OGL driver reports as recommended max.
  • Fixed a crash when getting a range from an empty json array in nwscript.
  • Fixed the "Environment shadows" setting.
  • Fixed camera collision not adjusting properly to keyhole toggle.
  • Fixed vertex normals on grass. (#470)
  • Fixed a crash that can happen when referencing an invalid class/skill/race, such as when adding DM cheat spells to the quickbar for a player DM.
  • Fixed issue with custom materials for meshes without an existing base texture.
  • Fixed several game crashes when loading broken CC (usually internal node/texture names too long).
  • Fixed textures on body parts that don't use PLT. (#471)
  • Fixed normal maps on HD pack heads. (#468)
  • Fixed crash on joining a server if character sheet GUI panel is disabled.
  • Fixed wielded items going out of sync with creature LOD models. (#431)
  • Fixed Windows end lines causing the text edit cursor to display as a question mark when at the end of a line.
  • Fixed blending issues when fading between skyboxes.
  • Fixed emitter lightning update linked rendering (what was causing ray of frost and similar to not appear right). (#459)
  • Fixed non-fading lights appearing with a delay because they were waiting for others to fade out. (#473, #445)
  • Fixed creatures facing east when standing on _POST waypoints.
  • Fixed effects incorrectly setting creator, caster level and spell ID.
  • Fixed incorrect spell failure calculation from multiple EffectSpellFailure().
  • Fixed inconsistent application of temporary HP with EffectNegativeLevel().
  • Fixed stacking and cap of EffectMovementSpeed{Increase,Decrease}().
  • Fixed bad state when using EffectRegenerate() with negative values.
  • Fixed floating dwarf head being summon when giving a bad resref to EffectSummonMonster().
  • Fixed applying spell failure to non-concentration spells (e.g. Barbarian Range) when under EffectEntangle().
  • Fixed EffectDeaf() to apply 20% spell failure to all verbal spells without Silent metamagic.
  • Fixed monk bonus speed occasionally going above the 300% cap.
  • Fixed not properly using cubemap environment maps if they are specified in the TXI.
  • Fixed net.udp.window.timeout not being properly applied.
  • Fixed being able to do melee attacks through doors that do not block sight.
  • Fixed a crash related to models with no or corrupt faces.
  • Fixed a crash caused by missing bone weights in model skinmeshes.
  • Fixed journal entries not being retained after relogging on a server.
  • Fixed beam VFXs being rendered too thin.
  • NUI:
    • Fixed bad modifier array index being sent for watch events. (#448)
    • Fixed exception when reducing NUI scrolled list view contents. (#427)
    • Fixed NuiDrawListImage without NuiDrawListImageRegion not working.
    • Fixed NuiDrawListLine() not working.
    • Fixed carriage returns being rendered as question marks.
    • Fixed drawlist items not working correctly with gui scale.
      • Note: this may break any workarounds you have in place.

Performance Improvements

  • Optimized area load times significantly (up to 10000% faster!), particularly in singleplayer.
  • Optimized default visual transformation handling: Reduced memory usage and network traffic for most serverside objects.
  • Optimized JSON handling in nwscript VM. It is now copy-on-write, so read operations are much faster.
  • Optimized stock shader performance.
  • Optimized handling of vertex data for high poly meshes.
  • Optimized how emitters are sorted.
  • Optimized how minimap data is updated, which was causing performance issues on large PWs.
  • Optimized VFX and creature perception list updates.
  • Optimized ruleset.2da lookups when entry is not present.
  • Minor optimizations when rendering grass and objects.


  • Disabled non-functional object preloading when entering an area: Reduces network traffic on load screens.
  • Disabled non-functional FTS5 sqlite extension.
  • Removed optional http ocsp toggle in config.
  • Removed io.mmap.* options that were interfering with movie playback.
  • No labels