Many more performance and stability/compatibility improvements
We’re proud to announce two new curated content adventures, released in full cooperation with their authors.
With the latest update, you can also play them in multiplayer— and Eye of the Beholder by Rick Francis was designed to do just that. So gather your friends, and play the thrilling remake of the classic 1991 release from Strategic Simulations, Inc.
Or perhaps you're in the mood to dive into early tabletop AD&D nostalgia? Against the Cult of the Reptile God, by Rich Barker adapts the novice-series module into a smart, single-player dungeon crawl!
By Rich Barker
Terror by night! The village of Orlane is dying. Once a small and thriving community, Orlane has become a maze of locked doors and frightened faces.
Strangers are shunned, trade has withered. Rumours flourish, growing wilder with each retelling.
Terrified peasants flee their homes, abandoning their farms with no explanation.
Others simply disappear...
The adventure is set in Greyhawk and is based on the original TSR AD&D module N1 : Against the Cult of the Reptile God by Douglas Niles, which was ranked the 19th best AD&D module of all time by Dungeon Magazine.
While this conversion has added considerably to the original source material, all of the core elements of the adventure remain.
It is a mixture of wilderness, underground, and urban adventure, with a number of unique monsters and items, and some class-specific treasure hoards and rewards.
It is suitable for any class, although is harder for rogues. Druids and rangers are particularly well catered for, and can talk to many of the animals.
The adventure has a duration of approximately 15 hours, and is designed for starting 1st level characters, who can be expected to progress to around 8th level by the end of the adventure.
There are no alignment restrictions, but the storyline is predominantly suitable for good or neutral characters.
By Rick Francis
A two-part remake of the classic game by Westwood/SSI.
The Eye of the Beholder series is designed to be fully multiplayer-compatible!
A drow spy was captured two nights ago by Oltec, Captain of the Guard. Under interrogation, the drow revealed a disturbing plan. He claimed to be working for a being named "Xanathar". The spy claimed that "Xanathar" is an evil crime lord that inhabits the deepest part of the sewer system. Supposedly, Xanathar magically teleported this drow into the city to spy on the Lords of Waterdeep, but was unable to use his magic to teleport him back underground safely. Speak with Khelben Blackstaff to find out more information that could help you before setting out on your journey.
You are summoned by the wizard Khelben Blackstaff, and sent to investigate the dreaded Temple Darkmoon. The heroes of Waterdeep are sent to investigate strange disappearances from villages north of the city in the outline areas of the dark forest. Reports have been made of discoveries of human remains in shallow graves. The clues seem to lead to the Temple Darkmoon, which appears to be a peaceful sanctuary, run by divinely-inspired priests. You must explore the temple, deal with its inhabitants, avoid traps, and battle monsters to discover the temple's evil secrets. Alas, as often happens, appearances are deceiving, and the Temple's dark secret is up to the player to unfold.
The multiplayer UI now uses the same slick design already offered in single-player.
You can now host games with modules downloaded from the curated content list (or any other third party repository used).
The repository will be automatically shared with other players, so they will be offered the download transparently (it’s just like joining a NWSync-enabled persistent world)!
Note: Multiplayer is not supported by all modules. Some were designed for singleplayer, and may break in unexpected ways when played with multiple people. Play them at your own risk!
In addition, the Start Game UI (for both single and multiplayer) saw the following changes:
Tons of performance and stability/compatibility improvements went into this patch:
We spent some time improving font rendering after the feedback from the last patch:
We cleaned up the dataset for the Tyrants of the Moonsea premium module. All content that is already part of the base game has been removed from the DLC download.
In addition, the following fixes went in:
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:
NWNEE Patch Change Log / Sept 15, 2020
Enhanced graphics rendering for lighting & shadows.
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.)
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);
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.
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.
// Convert sHex, a string containing a hexadecimal object id, // into a object reference. Counterpart to StringToObject(). object StringToObject(string sHex);
The new patch for #NeverwinterNights: Enhanced Edition on PC (1.79) is finally here! Thanks to our amazing community for your patience.
Check out the list of improvements, including bug fixes, 64bit support, achievements, keyholing, toolset updates & more in our patch notes below.
Both client and server are now 64bit binaries. We do not provide 32bit binaries anymore as of this patch. (The binary directories in the game install are now misnamed; we didn't change this yet but will in a future patch.)
CodeBase (“Bioware Campaign Database”) has been replaced with sqlite3, as the old database code would not work when compiled with a 64bit compiler. All new database files end up in the database/ directory in your user home. They have the extension .sqlite3. Old database files will be imported once at module startup.
A new configuration system has been put in place. Most client and server config is now stored in a file called settings.tml, instead of nwn and nwnplayer ini.
We're changing how networking is done in NWN:EE, with the following benefits: Cryptographic server and client identity authentication; full network encryption to prevent traffic snooping - and in the case of public servers via the master, connection hijacking; floating connections (you might be able to IP/port-hop and retain your connection); better use of compression; and no more host/port confusion when connecting multiple times from behind the same LAN.
Networking/Crypto: Servers can now have fixed identities that persist between restarts. This identity is stored in a file named “cryptographic_secret” in the user home. Leaking this identity allows others to impersonate your server, much in the same way as leaking a private CD key. Favourites and History storage will now use server identities if available, so that floating IP/port servers can be found again easily.
We ported keyholing from Android. It is turned ON by default, but can be turned off with a console command (KeyholeToggle) or the configuration setting. There are also bindable keys.
New main menu background art. (Also configurable in settings.tml)
A management UI for NWSync was added to the Options dialog. It allows players to remove downloaded data they don’t want anymore.
New script calls (see below).
Shaders now support #include. Use with care: It's not a real preprocessor, just a verbatim string replace.
NWSync now cleans up downloaded manifest mappings when getting updates from known servers. It will not remove unreferenced data yet (as desktop users might not want to lose it), but that will come next.
NWSync will automatically reconnect you to the server if you are still around after the download finishes (based on keyboard/mouse input detection).
A debug UI for advanced users to showcase experimental new features and UI scenes has been implemented (Ctrl+Shift+F12 to access).
A lot of new configuration keys have been added, too numerous to list here.
Configuration will be imported from ini files. Once imported, the .ini will not be written anymore (but left in place in case you want to go back to a previous build).
All configuration keys can be overridden via ENV variables (useful for automated server setups), like so: NWN_CONFIG_SET_key, where key is the fully-qualified configuration key.
Some configuration still remains in .ini files; these will be migrated as we go along.
The .tml file is in TOML format and has a full schema embedded for better introspection and tool-based editing.
The debug UI offers access to the full new configuration system.
The game now defaults to windowed mode (instead of exclusive fullscreen) on new installs.
The game will now remember the window position between restarts when in windowed mode.
A simple frame limiter has been added, which can be used to reduce CPU/GPU usage on battery-constrained devices. It is accessible through the Debug UI as explained below.
Walking/Running with shift held down is now an invertible config toggle. This is also accessible through the Debug UI.
NWSync now automatically purges outdated server manifests, removing stale and unneeded data. Manifests are considered outdated if they are coming from the same server URL and carry the same group_id (see NWSync documentation).
NWSync can now download offline modules from preconfigured servers. This is a experimental feature and only accessible via the Debug UI, and requires adding a specially-prepared repository.
The debug UI offers to purge unwanted nwsync manifests and all associated data. This will eventually be turned into a more user-friendly UI.
Music and ambient sounds are now loaded through ResMan and can thus be in hak and nwsync.
The game will now read plain mp3 files (the .bmu extension rename is still required, because this extension is used in all existing resources/haks).
The game user home (i.e. Documents/Neverwinter Nights) is now provisioned “development” directory, which detects changes and content is reloaded at runtime. This directory sits at the very top of the resources search path (unlike override/, which is sitting below ERF containers such as HAKs).
NB: This content reload only affects resource types that are not cached. For example, it can be used to inject scripts or GFF data, but not replace textures on the fly.
ResMan resource management and priorities has been rewritten. The debug UI can show this to you.
[Linux/Mac only] The game can now optionally mmap() all core game resources. This speeds up loading times drastically on some systems. This is turned off by default.
We have added a script command to JIT-compile and run a chunk of NWScript.
We have added functionality that allows attaching UUIDs to objects. These UUIDs are persisted to GFF and can be used by authors to identify items across module restarts, among other use cases.
Script calls that serialise/deserialise objects (StoreCampaignObject and CopyObject as of now) can now work with the following object types: Creatures, Items, Placeables, Waypoints, Stores, Doors, Triggers.
Model compiler: Added a new alias to nwn.ini: MODELCOMPILER (instead of clobbering the installation directory)
New console command: compileloadedmodels (comppiles all loaded models, including binary)
New console command: compileloadedasciimodels (compiles all loaded models, only ascii)
New console command: compilemodel <name> (specific model, will load and unload it for you even if it is not currently loaded)
New command line switch: nwmain.exe compilemodel <name> (same as the above console command; will compile the model and exit the game immediately)
NWSync now shows network and storage speed separately while downloading.
A new toolset build has been added. See the Toolset section below for details.
New console command: cfg <key> [value] to change config values.
Configuration keys to set min-height (from ground level), min-radius (percentage of screen), and max-radius (also percentage of screen) for keyholing have been added. These are available through the Debug UI and by editing settings.tml.
A configuration key that allows toggling keyholing alongside tooltip (TAB, by default) has been added. It is available through the Debug UI and by editing settings.tml.
DM Creator Palettes can now contain plain CExoString entries in addition to STRREFs. Strictly speaking, this was possible before (node name was DELETE_ME); we’ve renamed that node to - surprise - “NAME” to make it * prettier.
Experimental area precaching has been added. It is guarded behind a configuration toggle and defaults to off.
Performance and memory usage improvements at NWSync startup.
History/Favorites have been fixed to once again show what has been saved to the .ini.
We fixed the SetName and SetHiddenWhenEquipped script commands not reliably updating all clients.
We fixed some doors becoming unclickable after having been destroyed, despite having a scripted transition present.
We fixed the script compiler sometimes confusing functions where the full name of one is a prefix of the other ("Action" <-> "ActionTwo").
We fixed module content (hak, tlk, nwsync) not properly unloading when disconnecting from a server.
We fixed a bug where resources were indexed twice when loading a module, resulting in prolonged load/connect times.
We fixed an issue where sending visual transforms or material updates for creatures only seen on the party bar, but not yet in an area, crashed clients.
C++: Thousands of cases of undefined behaviour have been addressed. A lot of code duplication has been removed in the process.
KTX texture loading order has been fixed.
The Load/Save dialogue now properly removes savegames from the resource manager when exiting the UI.
GL Render Culling was fixed (i.e. flickering trees and keyholing showing backfaces of geometry instead of punching through).
We fixed invalid user savegames being deleted on read errors; for example when erroneously storing savegames in subdirectories, or when AV denies access to reading the .sav.
Automatic tangent generation has been fixed.
Steam CD key retrieval should be more robust; and in the case of errors, will emit a useful support token that can be used to follow up with Beamdog.
A memleak in script evaluation was fixed.
SetPhenoType: The constraint condition was too narrow in clamping the phenotype; this has been fixed.
SetName() on areas now sends the configured language, instead of English.
The rather arbitrary builtin effect icon limit has been removed.
Object Visual Transforms: We now send VTs for newly-created doors and placeables. Some inefficiencies in network updates have been removed.
Material Shader Params: Some inefficiencies in network updates have been removed.
The server now waits 3 seconds before attempting to list with the master, allowing a module to load in non-interactive use.
Running a local multiplayer game now should never reject the primary player if the master is unreachable.
A case where arturo texture animations failed to animate has been addressed.
A bug in the creature serialisation code (for StoreCampaignObject) has been addressed where it would erroneously embed transient object IDs for inventory items, resulting in issues when loading this creature again in a persistent world setting.
A nullptr deref crash related to funny/zombie-walking a player was fixed.
A nullptr deref crash when clicking placeables without a valid player creature was fixed.
A thread race crash during sound system initialisation was fixed.
A nullptr deref crash when the server sends a weapon switch request for a creature where the model did not yet load was fixed.
A selection of nullptr deref crashes when the server sends a creature update for a non-existing creature were fixed.
A case where encounters containing creatures only of the same CR would fail to select the proper amount/difficulty was fixed.
NWSync SQLite migration stability has been improved. They are now defined in code, and no longer in the installation directory. The schema, of course, remains public.
The effect limit configuration keys have been uncapped. They used to be limited to [1, default]; they now are [0, 255]. Beware: You may run into strange behaviour if you exceed a total bonus/penalty of -128, 127 or 255 regardless of configuration; since some values are internally typed with 8 bits.
Hosting local multiplayer games on Mac and Linux, where the system hostname is not resolvable through DNS, has been fixed.
The server config "Server vault by player name" does not require "Sticky player names" enabled anymore to work. This will help servers that want to set up custom authentication schemes.
We fixed an issue where the threadpool would not spawn enough worker threads if your CPU had less than three (virtual) cores.
Scripting: The effect limit accessors now adhere to the configuration constraints. Values set through these will always override the user-configured values for the running module only.
We addressed a custom content-related crash when adding invalid items to merchants.
A handful of UI-crashes inside NWSync have been fixed.
The crash reporter now says which OS it came from.
We fixed an issue where playing wav ambient sounds would confuse the resource manager into either leaking or freeing memory excessively.
A serious memleak when rendering skinmeshed objects was fixed.
A memleak when calculating tangent space basis was fixed.
An issue where the internal resource manager would needlessly evict recently used files under memory pressure was fixed, which had resulted in disk churn.
[Windows] The game does not crash anymore when wiggling the window. If you are curious - this was a result of Windows queueing up “window moved” messages while you held on to the window and then dumping them onto NWN all at once; overrunning a bounded queue before the game had a chance to clear it out. Other platfoms did not exhibit this behaviour.
A nullptr deref in the expression parser of TestStringAgainstPattern has been fixed. It triggered when trying to match empty groups following a token (i.e. “hello()”).
We fixed a crash when unloading compiled skinmesh models.
We fixed a crash when loading uncompiled skinmesh models that had invalid array lengths for the bone array.
The uncompiled model parser now skips empty lines. This will NOT fix invalid array lengths. Models that have invalid array lengths in any definition will still behave erratically and/or not animate and/or just be broken, but at least it won’t crash anymore.
We fixed a memleak in loading tile walkmeshes.
We fixed a memleak in internal string handling.
The premium modules have been fixed to once again run on 64 bit without crashing. The fix was to strip the DRM! There are no script sources in the package yet due to time constraints on this patch, but we will be providing them in the future.
We fixed the script call CopyItem not properly copying item description overrides.
We fixed CopyObject() not properly copying the faction of a creature.
We fixed Store/RetrieveCampaignObject() not properly storing/retrieving the faction of a creature.
Player characters stored/copied now end up in the Commoner faction (it used to be a the PC faction; with no valid party).
We fixed a crash that happened when trying to RetrieveCampaignObject a creature with an invalid faction.
We fixed the game not properly reconnecting immediately after clicking Cancel during a connection attempt.
We fixed “legacy CD keys” not being sent properly to the server during the connection process.
We fixed some memory management issues in CExoResMan, where having a lot of RAM would make it evict cached resources early.
The Examine Panel now scales it’s UI properly.
We now return to the premium selection UI when cancelling out of running a premium module, instead of the normal module selection.
classes.2da: New column StatGainTable. This column contains a table that describes ability and natural AC progression per level.
Palemaster Natural AC progression has been changed to use this mechanism.
Dragon Disciple Natural AC and Ability progression has been changed as well. As a consequence of this change, existing creatures will be stripped of their baked-in modifiers; thus changing characters/saves irreversibly and making them invalid with older game versions. Character changes are tracked in the character file itself: A new field “DataMigration” has been added to the GFF CreatureStats struct to accommodate this. In the interest of transparency, changes made to character files are published in the patch notes, below. If you want to return to a previous game version, make sure to create a backup first.
racialtypes.2da: New columns to configure extra skill points and feats at first level.
racialtypes.2da: New columns to configure the skill points modifier at first level.
racialtypes.2da: New columns to configure Ability Point Buy.
racialtypes.2da: New columns to configure normal feat progression.
racialtypes.2da: New column SkillPointModifierAbility. This column determines the ability which will provide additional skill points on level up. Can be blank. (INT by default, obviously).
ruleset.2da: New 2da added that contains a set of builtin ruleset defines. These defines were previously hardcoded in the game engine and are now overridable on a per-module basis. No explicit guarantees of functionality are given due to their scope and amount; however we will gladly listen for feedback on what works, what doesn’t work as expected, and what needs changing to accommodate further use cases. We reserve the right to change and remove entries with future patches.
You can find all of these files in the game installation directory, subdirectory ovr/.
DataMigration < 1: Dragon Disciple Class:
if (level >= 10) STR -= 4;
if (level >= 4) STR -= 2;
if (level >= 2) STR -= 2;
if (level >= 7) CON -= 2;
if (level >= 9) INT -= 2;
if (level >= 10) CHA -= 2;
// Note: Natural AC was already calculated at runtime and not persisted to character data.
Added support for visual transforms
The new options are available in Adjust Location dialog
You can use Ctrl+Mousewheel to quickly scale objects
Visual transforms currently only work on creatures, items, doors and non-static placeables
Added support for opening multiple areas in tabs
Tabs are disabled by default. To enable them, go to Toolset settings -> Area editor -> Open areas in tabs, then restart the Toolset.
To close a tab, right-click on the tab and choose 'Close' in the context menu.
Inventory editor improvements - added key bindings
Move selection with arrow keys
Set Infinite flag with 'I' key
Delete items with 'Delete' key
After deleting, it now switches to the next item in the list
Significantly optimized Build Module and Update Instances, as well as some minor operations like expanding an area that is not currently open
The Toolset is now built using a newer version of the C++ compiler. We have fixed most of the bugs caused by this change, but there might be a few regressions. If you see any issues that did not exist in the Toolset shipped with 1.78, please help us fix them by reporting them to us.
Fixed reputation editing in Faction Editor
Fixed renaming areas in the main area list
The Toolset now properly saves Z translation when it's the only transform defined
Fixed access violation when dragging equipped items to trash
Fix toolbar icons becoming disabled when double clicking on objects in the area list
Fixed Unicode issues in Creature properties dialog
Fixed Z translations not saving
Fixed undo issues when using tabs
Fixed fog rendering when using tabs
Fixed Unicode issues in Token Selector dialog
Visual transforms are now reset when static flag is set on a placeable
Fixed tab order for rotation fields in Adjust Location dialog
Fixed "sqrt domain" errors on some fancymapped content
Fixed Update Instances dialog layout
A memory leak that was observed when switching between areas has finally been fixed
Test Module now correctly passes -userdirectory to the game when launching it
// Execute a script chunk.
// The script chunk runs immediately, same as ExecuteScript().
// The script is jitted in place and currently not cached: Each invocation will recompile the script chunk.
// Note that the script chunk will run as if a separate script. This is not eval().
// By default, the script chunk is wrapped into void main() {}. Pass in bWrapIntoMain = FALSE to override.
// Returns "" on success, or the compilation error.
string ExecuteScriptChunk(string sScriptChunk, object oObject = OBJECT_SELF, int bWrapIntoMain = TRUE);
// Returns a UUID. This UUID will not be associated with any object.
// The generated UUID is currently a v4.
string GetRandomUUID();
// Returns the given objects' UUID. This UUID is persisted across save boundaries,
// like Save/RestoreCampaignObject and save games.
// Thus, reidentification is only guaranteed in scenarios where players cannot introduce
// new objects (i.e. servervault servers).
// UUIDs are guaranteed to be unique in any single running game.
// If a loaded object would collide with a UUID already present in the game, the
// object receives no UUID and a warning is emitted to the log. Requesting a UUID
// for the new object will generate a random one.
// This UUID is useful to, for example:
// - Safely identify servervault characters
// - Track serialisable objects (like items or creatures) as they are saved to the
// campaign DB - i.e. persistent storage chests or dropped items.
// - Track objects across multiple game instances (in trusted scenarios).
// Currently, the following objects can carry UUIDs:
// Items, Creatures, Placeables, Triggers, Doors, Waypoints, Stores,
// Encounters, Areas.
// Will return "" (empty string) when the given object cannot carry a UUID.
string GetObjectUUID(object oObject);
// Forces the given object to receive a new UUID, discarding the current value.
void ForceRefreshObjectUUID(object oObject);
// Looks up a object on the server by it's UUID.
// Returns OBJECT_INVALID if the UUID is not on the server.
object GetObjectByUUID(string sUUID);
Features:
Gamma x
in the console, where x is a floating point value larger than 0. The default is 2.2. This value is persisted to nwn.ini (under a new configuration key). Gamma only affects the rendered ingame scenery, not menus or UI, as it is applied through a FBO shader, not GL/system-wide gamma correction. Fixes:
Fixes: