Patch Version | 1.87.8193.35 |
Patch release date (PC) | Development/beta - 16/3/2023 Final - 25/5/2023 |
Patch release date (Others) | |
Patch release notes | https://steamcommunity.com/games/704450/announcements/detail/3677797598539852337 |
Summary
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: https://nwn.beamdog.net/docs/
Join the community and provide feedback directly to development team members on Discord: https://nwn.beamdog.net/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!
Credits
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
Highlights
- 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
- 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.
- Disabled by default, set
- 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*
innwscript.nss
andinc_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).
- Added new nwscript built-in constants:
LOCATION_INVALID
,JSON_FALSE
,JSON_TRUE
,JSON_OBJECT
,JSON_ARRAY
,JSON_STRING
. - 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 inmodule.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 inmodule.ifo
: 0=Server default, 1=enabled, 2=disabled.
- No GUI option yet, but you can set
- 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.
Toolset
- 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.run-shader-even-with-no-effects
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.show-player-join-messages
server.tweaks.game-obj-update-interval
server.tweaks.game-obj-update-interval-loading
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
DEATH_ATTACK_BASE_SAVE_DC
QUICKENED_SPELL_MINIMUM_CONJURE_TIME
HASTED_SPELL_CONJURE_TIME_MODIFIER
FIX_EFFECTDAMAGEINCREASE_BYPASSING_DR_AND_DI
TWO_HANDED_WEAPON_STRENGTH_MODIFIER
OFFHAND_WEAPON_STRENGTH_MODIFIER
HASTE_MOVEMENT_SPEED_INCREASE_BONUS
HASTE_DODGE_AC_INCREASE_AMOUNT
ALL_ASSOCIATES_RUN_SCRIPTS
MOVEMENT_SPEED_BONUS_DEFAULT_CAP
MOVEMENT_SPEED_BONUS_MONK_CAP
MOVEMENT_SPEED_PENALTY_CAP
MOVEMENT_STAGE_PENALTY_DETECT_MODE
MOVEMENT_STAGE_PENALTY_STEALTH_MODE
MOVEMENT_STAGE_PENALTY_ENCUMBRANCE_HEAVY
MOVEMENT_STAGE_PENALTY_ENCUMBRANCE_OVERLOADED
MAX_CHARGES_FOR_ITEM_COST
CHARGEN_ENABLE_RECOMMENDED_BUTTON
MULTICLASS_LIMIT
ALL_ASSOCIATES_CAN_INTERACT
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
Changed
- 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()
.
- This means you cannot stagger a transaction across multiple
SetUseableFlag()
now also works on Doors, Creatures and Items.GetItemAppearance()
now works with per-part colors.Get{First,Next}ObjectInArea()
now has anObjectFilter
parameter.SetName()
now works for player characters.SetObjectVisualTransform()
can now target sub-models (e.g. HEAD, WING, TAIL, CLOAK).SetObjectVisualTransform()
now hasnRepeatsRemaining
andnBehaviorFlags
parameters.SetGuiPanelDisabled()
now has anoTarget
parameter.GetPlayerDeviceProperty()
can now query most client config values.GetEffectInteger()
now works on the complete range of integers forEffectDamage
.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 innwscript.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
anddamagehitvisual.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 intoiprp_visualfx.2da
)- Added four new columns to
spells.2da
for spell targeting indicators:TargetShape
,TargetSizeX
,TargetSizeY
,Flags
- Added
HideFromLevelUp
column toskills.2da
. - Added
SkipSpellSelection
column toclasses.2da
. - Added
FavoredEnemtyFeat
column toracialtypes.2da
.
- Added a row for base damage to
Fixed
- 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 givensNewName=""
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.
Removed
- 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.