Neverwinter Nights: Enhanced Edition

Update 81.8193.16 (16 September 2020)

The hot fix is now live for the NWNEE patch, which should address the issues for non-english versions of the game. Here is a list of the fixes from today's release:


Update 81.8193.15 (15 September 2020)

NWNEE Patch Change Log / Sept 15, 2020

Lighting Engine Improvements

Enhanced graphics rendering for lighting & shadows.

Tileset Additions:

This patch includes all content from Darkness over Daggerford and Tyrants of the Moonsea.

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);

// 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

Art Changes

// Convert sHex, a string containing a hexadecimal object id,
// into a object reference. Counterpart to StringToObject().
object StringToObject(string sHex);

Miscellaneous Improvements

Update 80.8193.13 (19 May 2020)


Update 1.79 build 8193.3 (13 December 2019)

Fixes

Update 1.79 (03 December 2019)

Major Features
Further Features
Breaking Changes
Fixes
Content Creation
Toolset Changes
New Script Commands

Update 1.78 (26 November 2018)

Features:

Fixes:

Server Changes

Fixes: