





🌟 Special thanks to our amazing supporters:
✨ $10 Tier: [Geeks Love Detail]
🌈 $5 Tier: [Arch Toasty][Benedikt][David Martínez Martí]
Hello again Neverwinter Nights players! This release was developed for personal enjoyment and out of goodwill for our fellow players and creators by unpaid software engineers from the NWN community: - clippy, Daz, Jasperre, niv, shadguy, Soren, tinygiant, virusman You are cordially invited to join the NWN community developer Discord, here: https://nwn.beamdog.net/discord/
Greetings again, Neverwinter Nights players! NWN:EE Premium Module Doom of Icewind Dale has received another update. As always, thank you for all your feedback on the new Module. Please continue sharing issues you find here.
Greetings, Neverwinter Nights players! NWN:EE Premium Module Doom of Icewind Dale has been updated to the 1.01 version. Thank you for all your feedback on the new Module. Please keep sharing issues you find here.
At long last, a sequel to the original Neverwinter Nights campaign is here!
Play Doom of Icewind Dale, a new NWN:EE Premium Module by Luke Scull, also known as Alazander in the Neverwinter Nights community, now available on Steam!
Continue your story as Hero of Neverwinterand battle an ancient foe threatening the frozen north of the Forgotten Realms!
Hello again Neverwinter Nights players! This release was developed for personal enjoyment and out of goodwill for our fellow players and creators by unpaid software engineers from the NWN community: - clippy, Daz, Jasperre, niv, shadguy, Soren, tinygiant, virusman With thanks to:
Greetings, Neverwinter Nights players! This release is being developed for personal enjoyment and out of goodwill for our fellow players and creators by unpaid software engineers from the NWN community: - clippy, Daz, Jasperre, niv, shadguy, Soren, tinygiant, virusman With thanks to:
It's THE time to check out community content in NWN:EE if you haven't already! Enhanced Editions of Siege of Shadowdale & Tides of Tethyr modules by Luke Scull received beefy updates!
To access the modules, just launch Neverwinter Nights: Enhanced Edition and go to New Game -> Community. You can install them right inside the game, with no external downloads.
Hey there everyone! We're releasing a small fix:
Greetings again, Neverwinter Nights players! Thank you for all your feedback on the last patch. Engineers from the NWN community worked hard and released a hotfix to reported issues.
Hello Neverwinter Nights players! This release was developed for personal enjoyment and out of goodwill for our fellow players and creators by unpaid software engineers from the NWN community: - clippy, Daz, Jasperre, Liareth, niv, shadguy, Soren, Squatting Monk, tinygiant, virusman To our fellow community: Thank you all for keeping this shared adventure alive.
Hey there everyone! This release is being developed for personal enjoyment and out of goodwill for our fellow players and creators by unpaid software engineers from the NWN community: - clippy, Daz, Jasperre, Liareth, niv, shadguy, Soren, Squatting Monk, tinygiant, virusman To our fellow community: Thank you all for keeping this shared adventure alive.
New curated community content in NWN:EE keeps expanding! An Enhanced Edition of a classic Neverwinter Nights module Crimson Tides of Tethyr by Luke Scull is now available in the game launcher!
A 20-hour adventure with a colorful cast of characters, epic war storyline, and tactically challenging encounters inspired by Baldur's Gate, this Enhanced Edition features rewritten dialogue, visual improvements, bug fixes, new systems and quality-of-life improvements, a new hour of gameplay content, and 100 new lines of voiced dialogue.
Check out more details here!
What is MythForce?
Hello adventurers! Today were releasing a new update for Neverwinter Nights: Enhanced Edition. Patch 8193.35 is the result of a year-long love effort by community developers.
Hello, everyone! A new patch for NWN:EE is being worked on, and you all are cordially invited to participate in playtestingor just playingusing the new branch and its added fixes and features. This effort is being done entirely for personal enjoyment by community members, out of good will and with copious amounts of adhesive. This is a work-in-progress and not a full final patch release yet. The full patch notes are extensive and available inside of the game on the "News" button, as well as here: https://nwn.beamdog.net/docs/ To opt-in, please subscribe to the development channel on Steam or GOG Galaxy (Beamdog Client will follow). Keep an eye on the main menu News button, where available updates will be shown. The above link will also be kept current. To provide feedback, or to just chat with us, please join the Discord: https://discord.gg/a9XN6xKWn8 Before posting there, please take a moment to carefully consider the introductory text in #welcome. See you around! clippy, Daz, Jasperre, Liareth, niv, Soren, tinygiant, virusman With thanks to: The NWNX folks. The Neverwinter Vault. Everyone in the community. neverwintereye
NWN:EE just received new curated community content! An Enhanced Edition of a classic Neverwinter Nights module Siege of Shadowdale by Luke Scull is now available in the game launcher!
Play Siege of Shadowdale Enhanced Edition with new quests, overhauled graphics & more!
Greetings, Neverwinter Nights players and modders! A new PC patch for Neverwinter Nights: Enhanced Edition arrives today. This update brings new quality of life improvements and fixes a few regressions introduced by the previous stable update.
// Returns the number of script instructions remaining for the currently-running script.
// Once this value hits zero, the script will abort with TOO MANY INSTRUCTIONS.
// The instruction limit is configurable by the user, so if you have a really long-running
// process, this value can guide you with splitting it up into smaller, discretely schedulable parts.
// Note: Running this command and checking/handling the value also takes up some instructions.
int GetScriptInstructionsRemaining();
// Returns a modified copy of jArray with the value order changed according to nTransform:
// * JSON_ARRAY_SORT_ASCENDING, JSON_ARRAY_SORT_DESCENDING
// Sorting is dependent on the type and follows json standards (.e.g. 99 < "100").
// * JSON_ARRAY_SHUFFLE
// Randomises the order of elements.
// * JSON_ARRAY_REVERSE
// Reverses the array.
// * JSON_ARRAY_UNIQUE
// Returns a modified copy of jArray with duplicate values removed.
// Coercable but different types are not considered equal (e.g. 99 != "99"); int/float equivalence however applies: 4.0 == 4.
// Order is preserved.
// * JSON_ARRAY_COALESCE
// Returns the first non-null entry. Empty-ish values (e.g. "", 0) are not considered null, only the json scalar type.
json JsonArrayTransform(json jArray, int nTransform);
// Returns the nth-matching index or key of jNeedle in jHaystack.
// Supported haystacks: object, array
// Ordering behaviour for objects is unspecified.
// Return null when not found or on any error.
json JsonFind(json jHaystack, json jNeedle, int nNth = 0, int nConditional = JSON_FIND_EQUAL);
// Returns a copy of the range (nBeginIndex, nEndIndex) inclusive of jArray.
// Negative nEndIndex values count from the other end.
// Out-of-bound values are clamped to the array range.
// Examples:
// json a = JsonParse("[0, 1, 2, 3, 4]");
// JsonArrayGetRange(a, 0, 1) // => [0, 1]
// JsonArrayGetRange(a, 1, -1) // => [1, 2, 3, 4]
// JsonArrayGetRange(a, 0, 4) // => [0, 1, 2, 3, 4]
// JsonArrayGetRange(a, 0, 999) // => [0, 1, 2, 3, 4]
// JsonArrayGetRange(a, 1, 0) // => []
// JsonArrayGetRange(a, 1, 1) // => [1]
// Returns a null type on error, including type mismatches.
json JsonArrayGetRange(json jArray, int nBeginIndex, int nEndIndex);
// Returns the result of a set operation on two arrays.
// Operations:
// * JSON_SET_SUBSET (v <= o):
// Returns true if every element in jValue is also in jOther.
// * JSON_SET_UNION (v | o):
// Returns a new array containing values from both sides.
// * JSON_SET_INTERSECT (v & o):
// Returns a new array containing only values common to both sides.
// * JSON_SET_DIFFERENCE (v - o):
// Returns a new array containing only values not in jOther.
// * JSON_SET_SYMMETRIC_DIFFERENCE (v ^ o):
// Returns a new array containing all elements present in either array, but not both.
json JsonSetOp(json jValue, int nOp, json jOther);
// Returns the column name of s2DA at nColumn index (starting at 0).
// Returns "" if column nColumn doesn't exist (at end).
string Get2DAColumn(string s2DA, int nColumnIdx);
// Returns the number of defined rows in the 2da s2DA.
int Get2DARowCount(string s2DA);
Hello, friends. Today, we ship build .34 to DEV. Please test it against your custom content and on your servers! It contains:
// Returns the number of script instructions remaining for the currently-running script.
// Once this value hits zero, the script will abort with TOO MANY INSTRUCTIONS.
// The instruction limit is configurable by the user, so if you have a really long-running
// process, this value can guide you with splitting it up into smaller, discretely schedulable parts.
// Note: Running this command and checking/handling the value also takes up some instructions.
int GetScriptInstructionsRemaining();
// Returns a modified copy of jArray with the value order changed according to nTransform:
// * JSON_ARRAY_SORT_ASCENDING, JSON_ARRAY_SORT_DESCENDING
// Sorting is dependent on the type and follows json standards (.e.g. 99 < "100").
// * JSON_ARRAY_SHUFFLE
// Randomises the order of elements.
// * JSON_ARRAY_REVERSE
// Reverses the array.
// * JSON_ARRAY_UNIQUE
// Returns a modified copy of jArray with duplicate values removed.
// Coercable but different types are not considered equal (e.g. 99 != "99"); int/float equivalence however applies: 4.0 == 4.
// Order is preserved.
// * JSON_ARRAY_COALESCE
// Returns the first non-null entry. Empty-ish values (e.g. "", 0) are not considered null, only the json scalar type.
json JsonArrayTransform(json jArray, int nTransform);
// Returns the nth-matching index or key of jNeedle in jHaystack.
// Supported haystacks: object, array
// Ordering behaviour for objects is unspecified.
// Return null when not found or on any error.
json JsonFind(json jHaystack, json jNeedle, int nNth = 0, int nConditional = JSON_FIND_EQUAL);
// Returns a copy of the range (nBeginIndex, nEndIndex) inclusive of jArray.
// Negative nEndIndex values count from the other end.
// Out-of-bound values are clamped to the array range.
// Examples:
// json a = JsonParse("[0, 1, 2, 3, 4]");
// JsonArrayGetRange(a, 0, 1) // => [0, 1]
// JsonArrayGetRange(a, 1, -1) // => [1, 2, 3, 4]
// JsonArrayGetRange(a, 0, 4) // => [0, 1, 2, 3, 4]
// JsonArrayGetRange(a, 0, 999) // => [0, 1, 2, 3, 4]
// JsonArrayGetRange(a, 1, 0) // => []
// JsonArrayGetRange(a, 1, 1) // => [1]
// Returns a null type on error, including type mismatches.
json JsonArrayGetRange(json jArray, int nBeginIndex, int nEndIndex);
// Returns the result of a set operation on two arrays.
// Operations:
// * JSON_SET_SUBSET (v <= o):
// Returns true if every element in jValue is also in jOther.
// * JSON_SET_UNION (v | o):
// Returns a new array containing values from both sides.
// * JSON_SET_INTERSECT (v & o):
// Returns a new array containing only values common to both sides.
// * JSON_SET_DIFFERENCE (v - o):
// Returns a new array containing only values not in jOther.
// * JSON_SET_SYMMETRIC_DIFFERENCE (v ^ o):
// Returns a new array containing all elements present in either array, but not both.
json JsonSetOp(json jValue, int nOp, json jOther);
// Returns the column name of s2DA at nColumn index (starting at 0).
// Returns "" if column nColumn doesn't exist (at end).
string Get2DAColumn(string s2DA, int nColumnIdx);
// Returns the number of defined rows in the 2da s2DA.
int Get2DARowCount(string s2DA);
Good day to all Neverwinter Nights adventurers!
Beamdog is happy to announce that after several years of hard work, Neverwinter Nights: Enhanced Edition models of player characters and their equipment (armor, weapons and shields) have finally been remade! Thank you kindly for your patience and support over these years!
Attention: using remade models on lower-end machines can lead to potential problems with the game performance.
This is why weve decided to provide a separate link for all our players to download The HD Models & Textures Pack for Neverwinter Nights: Enhanced Edition (4.1 gb). This pack includes updated models of weapons and shields previously released as the Steam Workshop content.
New models now support normal and spec information. All of these pieces can be further modded by the community, which is in line with the base game setup.
Greetings from the Neverwinter Nights team! Were pushing Build 85.8193.33 to the live branch!
Hello, this beta build is following the previous patch .32, with a few critical fixes:
Greetings, Neverwinter Nights players and modders! Today were releasing Patch 8193.32 for Neverwinter Nights: Enhanced Edition! This update brings dozens of bug fixes and new features including some exciting updates for content creators! Curated community content is also getting a new addition: A Hunt Through The Dark, by Markus Schlegel!
int GUIEVENT_COMPASS_CLICK = 15;
int GUIEVENT_LEVELUP_CANCELLED = 16;
int GUIEVENT_AREA_LOADSCREEN_FINISHED = 17;
int GUIEVENT_QUICKCHAT_ACTIVATE = 18;
int GUIEVENT_QUICKCHAT_SELECT = 19;
int GUIEVENT_QUICKCHAT_CLOSE = 20;
int GUIEVENT_SELECT_CREATURE = 21;
int GUIEVENT_UNSELECT_CREATURE = 22;
int GUIEVENT_EXAMINE_OBJECT = 23;
int GUIEVENT_OPTIONS_OPEN = 24;
int GUIEVENT_OPTIONS_CLOSE = 25;
int JSON_TYPE_NULL = 0; // Also invalid
int JSON_TYPE_OBJECT = 1;
int JSON_TYPE_ARRAY = 2;
int JSON_TYPE_STRING = 3;
int JSON_TYPE_INTEGER = 4;
int JSON_TYPE_FLOAT = 5;
int JSON_TYPE_BOOL = 6;
// The player's gui width (inner window bounds).
string PLAYER_DEVICE_PROPERTY_GUI_WIDTH = "gui_width";
// The player's gui height (inner window bounds).
string PLAYER_DEVICE_PROPERTY_GUI_HEIGHT = "gui_height";
// The player's gui scale, in percent (factor 1.4 = 140)
string PLAYER_DEVICE_PROPERTY_GUI_SCALE = "gui_scale";
int PLAYER_LANGUAGE_INVALID = -1;
int PLAYER_LANGUAGE_ENGLISH = 0;
int PLAYER_LANGUAGE_FRENCH = 1;
int PLAYER_LANGUAGE_GERMAN = 2;
int PLAYER_LANGUAGE_ITALIAN = 3;
int PLAYER_LANGUAGE_SPANISH = 4;
int PLAYER_LANGUAGE_POLISH = 5;
int PLAYER_DEVICE_PLATFORM_INVALID = 0;
int PLAYER_DEVICE_PLATFORM_WINDOWS_X86 = 1;
int PLAYER_DEVICE_PLATFORM_WINDOWS_X64 = 2;
int PLAYER_DEVICE_PLATFORM_LINUX_X86 = 10;
int PLAYER_DEVICE_PLATFORM_LINUX_X64 = 11;
int PLAYER_DEVICE_PLATFORM_LINUX_ARM32 = 12;
int PLAYER_DEVICE_PLATFORM_LINUX_ARM64 = 13;
int PLAYER_DEVICE_PLATFORM_MAC_X86 = 20;
int PLAYER_DEVICE_PLATFORM_MAC_X64 = 21;
int PLAYER_DEVICE_PLATFORM_IOS = 30;
int PLAYER_DEVICE_PLATFORM_ANDROID_ARM32 = 40;
int PLAYER_DEVICE_PLATFORM_ANDROID_ARM64 = 41;
int PLAYER_DEVICE_PLATFORM_ANDROID_X64 = 42;
int PLAYER_DEVICE_PLATFORM_NINTENDO_SWITCH = 50;
int PLAYER_DEVICE_PLATFORM_MICROSOFT_XBOXONE = 60;
int PLAYER_DEVICE_PLATFORM_SONY_PS4 = 70;
int RESTYPE_RES = 0;
...
int RESTYPE_CAF = 2082;
// Parse the given string as a valid json value, and returns the corresponding type.
// Returns a JSON_TYPE_NULL on error.
// Check JsonGetError() to see the parse error, if any.
// NB: The parsed string needs to be in game-local encoding, but the generated json structure
// will contain UTF-8 data.
json JsonParse(string sJson);
// Dump the given json value into a string that can be read back in via JsonParse.
// nIndent describes the indentation level for pretty-printing; a value of -1 means no indentation and no linebreaks.
// Returns a string describing JSON_TYPE_NULL on error.
// NB: The dumped string is in game-local encoding, with all non-ascii characters escaped.
string JsonDump(json jValue, int nIndent = -1);
// Describes the type of the given json value.
// Returns JSON_TYPE_NULL if the value is empty.
int JsonGetType(json jValue);
// Returns the length of the given json type.
// For objects, returns the number of top-level keys present.
// For arrays, returns the number of elements.
// Null types are of size 0.
// All other types return 1.
int JsonGetLength(json jValue);
// Returns the error message if the value has errored out.
// Currently only describes parse errors.
string JsonGetError(json jValue);
// Create a NULL json value, seeded with a optional error message for JsonGetError().
json JsonNull(string sError = "");
// Create a empty json object.
json JsonObject();
// Create a empty json array.
json JsonArray();
// Create a json string value.
// NB: Strings are encoded to UTF-8 from the game-local charset.
json JsonString(string sValue);
// Create a json integer value.
json JsonInt(int nValue);
// Create a json floating point value.
json JsonFloat(float fValue);
// Create a json bool valye.
json JsonBool(int bValue);
// Returns a string representation of the json value.
// Returns "" if the value cannot be represented as a string, or is empty.
// NB: Strings are decoded from UTF-8 to the game-local charset.
string JsonGetString(json jValue);
// Returns a int representation of the json value, casting where possible.
// Returns 0 if the value cannot be represented as a float.
// Use this to parse json bool types.
// NB: This will narrow down to signed 32 bit, as that is what NWScript int is.
// If you are trying to read a 64 bit or unsigned integer, you will lose data.
// You will not lose data if you keep the value as a json element (via Object/ArrayGet).
int JsonGetInt(json jValue);
// Returns a float representation of the json value, casting where possible.
// Returns 0.0 if the value cannot be represented as a float.
// NB: This will narrow doubles down to float.
// If you are trying to read a double, you will lose data.
// You will not lose data if you keep the value as a json element (via Object/ArrayGet).
float JsonGetFloat(json jValue);
// Returns a json array containing all keys of jObject.
// Returns a empty array if the object is empty or not a json object, with GetJsonError() filled in.
json JsonObjectKeys(json jObject);
// Returns the key value of sKey on the object jObect.
// Returns a null json value if jObject is not a object or sKey does not exist on the object, with GetJsonError() filled in.
json JsonObjectGet(json jObject, string sKey);
// Returns a modified copy of jObject with the key at sKey set to jValue.
// Returns a json null value if jObject is not a object, with GetJsonError() filled in.
json JsonObjectSet(json jObject, string sKey, json jValue);
// Returns a modified copy of jObject with the key at sKey deleted.
// Returns a json null value if jObject is not a object, with GetJsonError() filled in.
json JsonObjectDel(json jObject, string sKey);
// Gets the json object at jArray index position nIndex.
// Returns a json null value if the index is out of bounds, with GetJsonError() filled in.
json JsonArrayGet(json jArray, int nIndex);
// Returns a modified copy of jArray with position nIndex set to jValue.
// Returns a json null value if jArray is not actually an array, with GetJsonError() filled in.
// Returns a json null value if nIndex is out of bounds, with GetJsonError() filled in.
json JsonArraySet(json jArray, int nIndex, json jValue);
// Returns a modified copy of jArray with jValue inserted at position nIndex.
// All succeeding objects in the array will move by one.
// By default (-1), inserts objects at the end of the array ("push").
// nIndex = 0 inserts at the beginning of the array.
// Returns a json null value if jArray is not actually an array, with GetJsonError() filled in.
// Returns a json null value if nIndex is not 0 or -1 and out of bounds, with GetJsonError() filled in.
json JsonArrayInsert(json jArray, json jValue, int nIndex = -1);
// Returns a modified copy of jArray with the element at position nIndex removed,
// and the array resized by one.
// Returns a json null value if jArray is not actually an array, with GetJsonError() filled in.
// Returns a json null value if nIndex is out of bounds, with GetJsonError() filled in.
json JsonArrayDel(json jArray, int nIndex);
// Transforms the given object into a json structure.
// The json format is compatible with what https://github.com/niv/neverwinter.nim@1.4.3+ emits.
// Returns the null json type on errors, or if oObject is not serializable, with GetJsonError() filled in.
// Supported object types: creature, item, trigger, placeable, door, waypoint, encounter, store, area (combined format)
// If bSaveObjectState is TRUE, local vars, effects, action queue, and transition info (triggers, doors) are saved out
// (except for Combined Area Format, which always has object state saved out).
json ObjectToJson(object oObject, int bSaveObjectState = FALSE);
// Deserializes the game object described in jObject.
// Returns OBJECT_INVALID on errors.
// Supported object types: creature, item, trigger, placeable, door, waypoint, encounter, store, area (combined format)
// For areas, locLocation is ignored.
// If bLoadObjectState is TRUE, local vars, effects, action queue, and transition info (triggers, doors) are read in.
object JsonToObject(json jObject, location locLocation, object oOwner = OBJECT_INVALID, int bLoadObjectState = FALSE);
// Returns the element at the given JSON pointer value.
// See https://datatracker.ietf.org/doc/html/rfc6901 for details.
// Returns a json null value on error, with GetJsonError() filled in.
json JsonPointer(json jData, string sPointer);
// Return a modified copy of jData with jValue inserted at the path described by sPointer.
// See https://datatracker.ietf.org/doc/html/rfc6901 for details.
// Returns a json null value on error, with GetJsonError() filled in.
// jPatch is an array of patch elements, each containing a op, a path, and a value field. Example:
// [
// { "op": "replace", "path": "/baz", "value": "boo" },
// { "op": "add", "path": "/hello", "value": ["world"] },
// { "op": "remove", "path": "/foo"}
// ]
// Valid operations are: add, remove, replace, move, copy, test
json JsonPatch(json jData, json jPatch);
// Returns the diff (described as a json structure you can pass into JsonPatch) between the two objects.
// Returns a json null value on error, with GetJsonError() filled in.
json JsonDiff(json jLHS, json jRHS);
// Returns a modified copy of jData with jMerge merged into it. This is an alternative to
// JsonPatch/JsonDiff, with a syntax more closely resembling the final object.
// See https://datatracker.ietf.org/doc/html/rfc7386 for details.
// Returns a json null value on error, with GetJsonError() filled in.
json JsonMerge(json jData, json jMerge);
// Get oObject's local json variable sVarName
// * Return value on error: json null type
json GetLocalJson(object oObject, string sVarName);
// Set oObject's local json variable sVarName to jValue
void SetLocalJson(object oObject, string sVarName, json jValue);
// Delete oObject's local json variable sVarName
void DeleteLocalJson(object oObject, string sVarName);
// Bind an json to a named parameter of the given prepared query.
// Json values are serialised into a string.
// Example:
// sqlquery v = SqlPrepareQueryObject(GetModule(), "insert into test (col) values (@myjson);");
// SqlBindJson(v, "@myjson", myJsonObject);
// SqlStep(v);
void SqlBindJson(sqlquery sqlQuery, string sParam, json jValue);
// Retrieve a column cast as a json value of the currently stepped row.
// You can call this after SqlStep() returned TRUE.
// In case of error, a json null value will be returned.
// In traditional fashion, nIndex starts at 0.
json SqlGetJson(sqlquery sqlQuery, int nIndex);
// This stores a json out to the specified campaign database
// The database name:
// - is case insensitive and it must be the same for both set and get functions.
// - can only contain alphanumeric characters, no spaces.
// The var name must be unique across the entire database, regardless of the variable type.
// If you want a variable to pertain to a specific player in the game, provide a player object.
void SetCampaignJson(string sCampaignName, string sVarName, json jValue, object oPlayer=OBJECT_INVALID);
// This will read a json from the specified campaign database
// The database name:
// - is case insensitive and it must be the same for both set and get functions.
// - can only contain alphanumeric characters, no spaces.
// The var name must be unique across the entire database, regardless of the variable type.
// If you want a variable to pertain to a specific player in the game, provide a player object.
json GetCampaignJson(string sCampaignName, string sVarName, object oPlayer=OBJECT_INVALID);
// Gets a device property/capability as advertised by the client.
// sProperty is one of PLAYER_DEVICE_PROPERTY_xxx.
// Returns -1 if
// - the property was never set by the client,
// - the the actual value is -1,
// - the player is running a older build that does not advertise device properties,
// - the player has disabled sending device properties (Options->Game->Privacy).
int GetPlayerDeviceProperty(object oPlayer, string sProperty);
// Returns the LANGUAGE_xx code of the given player, or -1 if unavailable.
int GetPlayerLanguage(object oPlayer);
// Returns one of PLAYER_DEVICE_PLATFORM_xxx, or 0 if unavailable.
int GetPlayerDevicePlatform(object oPlayer);
// Deserializes the given resref/template into a JSON structure.
// Supported GFF resource types:
// * RESTYPE_CAF (and RESTYPE_ARE, RESTYPE_GIT, RESTYPE_GIC)
// * RESTYPE_UTC
// * RESTYPE_UTI
// * RESTYPE_UTT
// * RESTYPE_UTP
// * RESTYPE_UTD
// * RESTYPE_UTW
// * RESTYPE_UTE
// * RESTYPE_UTM
// Returns a valid gff-type json structure, or a null value with GetJsonError() set.
json TemplateToJson(string sResRef, int nResType);
// Returns the resource location of sResRef.nResType, as seen by the running module.
// Note for dedicated servers: Checks on the module/server side, not the client.
// Returns "" if the resource does not exist in the search space.
string ResManGetAliasFor(string sResRef, int nResType);
// Finds the nNth available resref starting with sPrefix.
// * Set bSearchBaseData to TRUE to also search base game content stored in your game installation directory.
// WARNING: This can be very slow.
// * Set sOnlyKeyTable to a specific keytable to only search the given named keytable (e.g. "OVERRIDE:").
// Returns "" if no such resref exists.
string ResManFindPrefix(string sPrefix, int nResType, int nNth = 1, int bSearchBaseData = FALSE, string sOnlyKeyTable = "");
// Create a NUI window from the given resref(.jui) for the given player.
// * The resref needs to be available on the client, not the server.
// * The token is a integer for ease of handling only. You are not supposed to do anything with it, except store/pass it.
// * The window ID needs to be alphanumeric and short. Only one window (per client) with the same ID can exist at a time.
// Re-creating a window with the same id of one already open will immediately close the old one.
// * See nw_inc_nui.nss for full documentation.
// Returns the window token on success (>0), or 0 on error.
int NuiCreateFromResRef(object oPlayer, string sResRef, string sWindowId = "");
// Create a NUI window inline for the given player.
// * The token is a integer for ease of handling only. You are not supposed to do anything with it, except store/pass it.
// * The window ID needs to be alphanumeric and short. Only one window (per client) with the same ID can exist at a time.
// Re-creating a window with the same id of one already open will immediately close the old one.
// * See nw_inc_nui.nss for full documentation.
// Returns the window token on success (>0), or 0 on error.
int NuiCreate(object oPlayer, json jNui, string sWindowId = "");
// You can look up windows by ID, if you gave them one.
// * Windows with a ID present are singletons - attempting to open a second one with the same ID
// will fail, even if the json definition is different.
// Returns the token if found, or 0.
int NuiFindWindow(object oPlayer, string sId);
// Destroys the given window, by token, immediately closing it on the client.
// Does nothing if nUiToken does not exist on the client.
// Does not send a close event - this immediately destroys all serverside state.
// The client will close the window asynchronously.
void NuiDestroy(object oPlayer, int nUiToken);
// Returns the originating player of the current event.
object NuiGetEventPlayer();
// Gets the window token of the current event (or 0 if not in a event).
int NuiGetEventWindow();
// Returns the event type of the current event.
// * See nw_inc_nui.nss for full documentation of all events.
string NuiGetEventType();
// Returns the ID of the widget that triggered the event.
string NuiGetEventElement();
// Get the array index of the current event.
// This can be used to get the index into an array, for example when rendering lists of buttons.
// Returns -1 if the event is not originating from within an array.
int NuiGetEventArrayIndex();
// Returns the window ID of the window described by nUiToken.
// Returns "" on error, or if the window has no ID.
string NuiGetWindowId(object oPlayer, int nUiToken);
// Gets the json value for the given player, token and bind.
// * json values can hold all kinds of values; but NUI widgets require specific bind types.
// It is up to you to either handle this in NWScript, or just set compatible bind types.
// No auto-conversion happens.
// Returns a json null value if the bind does not exist.
json NuiGetBind(object oPlayer, int nUiToken, string sBindName);
// Sets a json value for the given player, token and bind.
// The value is synced down to the client and can be used in UI binding.
// When the UI changes the value, it is returned to the server and can be retrieved via NuiGetBind().
// * json values can hold all kinds of values; but NUI widgets require specific bind types.
// It is up to you to either handle this in NWScript, or just set compatible bind types.
// No auto-conversion happens.
// * If the bind is on the watch list, this will immediately invoke the event handler with the "watch"
// even type; even before this function returns. Do not update watched binds from within the watch handler
// unless you enjoy stack overflows.
// Does nothing if the given player+token is invalid.
void NuiSetBind(object oPlayer, int nUiToken, string sBindName, json jValue);
// Swaps out the given element (by id) with the given nui layout (partial).
// * This currently only works with the "group" element type, and the special "_window_" root group.
void NuiSetGroupLayout(object oPlayer, int nUiToken, string sElement, json jNui);
// Mark the given bind name as watched.
// A watched bind will invoke the NUI script event every time it's value changes.
// Be careful with binding nui data inside a watch event handler: It's easy to accidentally recurse yourself into a stack overflow.
int NuiSetBindWatch(object oPlayer, int nUiToken, string sBind, int bWatch);
// Returns the nNth window token of the player, or 0.
// nNth starts at 0.
// Iterator is not write-safe: Calling DestroyWindow() will invalidate move following offsets by one.
int NuiGetNthWindow(object oPlayer, int nNth = 0);
// Return the nNth bind name of the given window, or "".
// If bWatched is TRUE, iterates only watched binds.
// If FALSE, iterates all known binds on the window (either set locally or in UI).
string NuiGetNthBind(object oPlayer, int nToken, int bWatched, int nNth = 0);
// Returns the event payload, specific to the event.
// Returns JsonNull if event has no payload.
json NuiGetEventPayload();
// Get the userdata of the given window token.
// Returns JsonNull if the window does not exist on the given player, or has no userdata set.
json NuiGetUserData(object oPlayer, int nToken);
// Sets an arbitrary json value as userdata on the given window token.
// This userdata is not read or handled by the game engine and not sent to clients.
// This mechanism only exists as a convenience for the programmer to store data bound to a windows' lifecycle.
// Will do nothing if the window does not exist.
void NuiSetUserData(object oPlayer, int nToken, json jUserData);
Hello friends! How have you been doing? The Beamdog team has been hard at work on the next Neverwinter Nights: Enhanced Edition patch! Today, we are shipping release 8193.31 to the development branch of NWN:EE. This is a huge beta patch, with many new and exciting features. We appreciate your assistance in helping us test them, and reporting any/all issues you find.
int GUIEVENT_COMPASS_CLICK = 15;
int GUIEVENT_LEVELUP_CANCELLED = 16;
int GUIEVENT_AREA_LOADSCREEN_FINISHED = 17;
int GUIEVENT_QUICKCHAT_ACTIVATE = 18;
int GUIEVENT_QUICKCHAT_SELECT = 19;
int GUIEVENT_QUICKCHAT_CLOSE = 20;
int GUIEVENT_SELECT_CREATURE = 21;
int GUIEVENT_UNSELECT_CREATURE = 22;
int GUIEVENT_EXAMINE_OBJECT = 23;
int GUIEVENT_OPTIONS_OPEN = 24;
int GUIEVENT_OPTIONS_CLOSE = 25;
int JSON_TYPE_NULL = 0; // Also invalid
int JSON_TYPE_OBJECT = 1;
int JSON_TYPE_ARRAY = 2;
int JSON_TYPE_STRING = 3;
int JSON_TYPE_INTEGER = 4;
int JSON_TYPE_FLOAT = 5;
int JSON_TYPE_BOOL = 6;
// The player's gui width (inner window bounds).
string PLAYER_DEVICE_PROPERTY_GUI_WIDTH = "gui_width";
// The player's gui height (inner window bounds).
string PLAYER_DEVICE_PROPERTY_GUI_HEIGHT = "gui_height";
// The player's gui scale, in percent (factor 1.4 = 140)
string PLAYER_DEVICE_PROPERTY_GUI_SCALE = "gui_scale";
int PLAYER_LANGUAGE_INVALID = -1;
int PLAYER_LANGUAGE_ENGLISH = 0;
int PLAYER_LANGUAGE_FRENCH = 1;
int PLAYER_LANGUAGE_GERMAN = 2;
int PLAYER_LANGUAGE_ITALIAN = 3;
int PLAYER_LANGUAGE_SPANISH = 4;
int PLAYER_LANGUAGE_POLISH = 5;
int PLAYER_DEVICE_PLATFORM_INVALID = 0;
int PLAYER_DEVICE_PLATFORM_WINDOWS_X86 = 1;
int PLAYER_DEVICE_PLATFORM_WINDOWS_X64 = 2;
int PLAYER_DEVICE_PLATFORM_LINUX_X86 = 10;
int PLAYER_DEVICE_PLATFORM_LINUX_X64 = 11;
int PLAYER_DEVICE_PLATFORM_LINUX_ARM32 = 12;
int PLAYER_DEVICE_PLATFORM_LINUX_ARM64 = 13;
int PLAYER_DEVICE_PLATFORM_MAC_X86 = 20;
int PLAYER_DEVICE_PLATFORM_MAC_X64 = 21;
int PLAYER_DEVICE_PLATFORM_IOS = 30;
int PLAYER_DEVICE_PLATFORM_ANDROID_ARM32 = 40;
int PLAYER_DEVICE_PLATFORM_ANDROID_ARM64 = 41;
int PLAYER_DEVICE_PLATFORM_ANDROID_X64 = 42;
int PLAYER_DEVICE_PLATFORM_NINTENDO_SWITCH = 50;
int PLAYER_DEVICE_PLATFORM_MICROSOFT_XBOXONE = 60;
int PLAYER_DEVICE_PLATFORM_SONY_PS4 = 70;
int RESTYPE_RES = 0;
...
int RESTYPE_CAF = 2082;
// Parse the given string as a valid json value, and returns the corresponding type.
// Returns a JSON_TYPE_NULL on error.
// Check JsonGetError() to see the parse error, if any.
// NB: The parsed string needs to be in game-local encoding, but the generated json structure
// will contain UTF-8 data.
json JsonParse(string sJson);
// Dump the given json value into a string that can be read back in via JsonParse.
// nIndent describes the indentation level for pretty-printing; a value of -1 means no indentation and no linebreaks.
// Returns a string describing JSON_TYPE_NULL on error.
// NB: The dumped string is in game-local encoding, with all non-ascii characters escaped.
string JsonDump(json jValue, int nIndent = -1);
// Describes the type of the given json value.
// Returns JSON_TYPE_NULL if the value is empty.
int JsonGetType(json jValue);
// Returns the length of the given json type.
// For objects, returns the number of top-level keys present.
// For arrays, returns the number of elements.
// Null types are of size 0.
// All other types return 1.
int JsonGetLength(json jValue);
// Returns the error message if the value has errored out.
// Currently only describes parse errors.
string JsonGetError(json jValue);
// Create a NULL json value, seeded with a optional error message for JsonGetError().
json JsonNull(string sError = "");
// Create a empty json object.
json JsonObject();
// Create a empty json array.
json JsonArray();
// Create a json string value.
// NB: Strings are encoded to UTF-8 from the game-local charset.
json JsonString(string sValue);
// Create a json integer value.
json JsonInt(int nValue);
// Create a json floating point value.
json JsonFloat(float fValue);
// Create a json bool valye.
json JsonBool(int bValue);
// Returns a string representation of the json value.
// Returns "" if the value cannot be represented as a string, or is empty.
// NB: Strings are decoded from UTF-8 to the game-local charset.
string JsonGetString(json jValue);
// Returns a int representation of the json value, casting where possible.
// Returns 0 if the value cannot be represented as a float.
// Use this to parse json bool types.
// NB: This will narrow down to signed 32 bit, as that is what NWScript int is.
// If you are trying to read a 64 bit or unsigned integer, you will lose data.
// You will not lose data if you keep the value as a json element (via Object/ArrayGet).
int JsonGetInt(json jValue);
// Returns a float representation of the json value, casting where possible.
// Returns 0.0 if the value cannot be represented as a float.
// NB: This will narrow doubles down to float.
// If you are trying to read a double, you will lose data.
// You will not lose data if you keep the value as a json element (via Object/ArrayGet).
float JsonGetFloat(json jValue);
// Returns a json array containing all keys of jObject.
// Returns a empty array if the object is empty or not a json object, with GetJsonError() filled in.
json JsonObjectKeys(json jObject);
// Returns the key value of sKey on the object jObect.
// Returns a null json value if jObject is not a object or sKey does not exist on the object, with GetJsonError() filled in.
json JsonObjectGet(json jObject, string sKey);
// Returns a modified copy of jObject with the key at sKey set to jValue.
// Returns a json null value if jObject is not a object, with GetJsonError() filled in.
json JsonObjectSet(json jObject, string sKey, json jValue);
// Returns a modified copy of jObject with the key at sKey deleted.
// Returns a json null value if jObject is not a object, with GetJsonError() filled in.
json JsonObjectDel(json jObject, string sKey);
// Gets the json object at jArray index position nIndex.
// Returns a json null value if the index is out of bounds, with GetJsonError() filled in.
json JsonArrayGet(json jArray, int nIndex);
// Returns a modified copy of jArray with position nIndex set to jValue.
// Returns a json null value if jArray is not actually an array, with GetJsonError() filled in.
// Returns a json null value if nIndex is out of bounds, with GetJsonError() filled in.
json JsonArraySet(json jArray, int nIndex, json jValue);
// Returns a modified copy of jArray with jValue inserted at position nIndex.
// All succeeding objects in the array will move by one.
// By default (-1), inserts objects at the end of the array ("push").
// nIndex = 0 inserts at the beginning of the array.
// Returns a json null value if jArray is not actually an array, with GetJsonError() filled in.
// Returns a json null value if nIndex is not 0 or -1 and out of bounds, with GetJsonError() filled in.
json JsonArrayInsert(json jArray, json jValue, int nIndex = -1);
// Returns a modified copy of jArray with the element at position nIndex removed,
// and the array resized by one.
// Returns a json null value if jArray is not actually an array, with GetJsonError() filled in.
// Returns a json null value if nIndex is out of bounds, with GetJsonError() filled in.
json JsonArrayDel(json jArray, int nIndex);
// Transforms the given object into a json structure.
// The json format is compatible with what https://github.com/niv/neverwinter.nim@1.4.3+ emits.
// Returns the null json type on errors, or if oObject is not serializable, with GetJsonError() filled in.
// Supported object types: creature, item, trigger, placeable, door, waypoint, encounter, store, area (combined format)
// If bSaveObjectState is TRUE, local vars, effects, action queue, and transition info (triggers, doors) are saved out
// (except for Combined Area Format, which always has object state saved out).
json ObjectToJson(object oObject, int bSaveObjectState = FALSE);
// Deserializes the game object described in jObject.
// Returns OBJECT_INVALID on errors.
// Supported object types: creature, item, trigger, placeable, door, waypoint, encounter, store, area (combined format)
// For areas, locLocation is ignored.
// If bLoadObjectState is TRUE, local vars, effects, action queue, and transition info (triggers, doors) are read in.
object JsonToObject(json jObject, location locLocation, object oOwner = OBJECT_INVALID, int bLoadObjectState = FALSE);
// Returns the element at the given JSON pointer value.
// See https://datatracker.ietf.org/doc/html/rfc6901 for details.
// Returns a json null value on error, with GetJsonError() filled in.
json JsonPointer(json jData, string sPointer);
// Return a modified copy of jData with jValue inserted at the path described by sPointer.
// See https://datatracker.ietf.org/doc/html/rfc6901 for details.
// Returns a json null value on error, with GetJsonError() filled in.
// jPatch is an array of patch elements, each containing a op, a path, and a value field. Example:
// [
// { "op": "replace", "path": "/baz", "value": "boo" },
// { "op": "add", "path": "/hello", "value": ["world"] },
// { "op": "remove", "path": "/foo"}
// ]
// Valid operations are: add, remove, replace, move, copy, test
json JsonPatch(json jData, json jPatch);
// Returns the diff (described as a json structure you can pass into JsonPatch) between the two objects.
// Returns a json null value on error, with GetJsonError() filled in.
json JsonDiff(json jLHS, json jRHS);
// Returns a modified copy of jData with jMerge merged into it. This is an alternative to
// JsonPatch/JsonDiff, with a syntax more closely resembling the final object.
// See https://datatracker.ietf.org/doc/html/rfc7386 for details.
// Returns a json null value on error, with GetJsonError() filled in.
json JsonMerge(json jData, json jMerge);
// Get oObject's local json variable sVarName
// * Return value on error: json null type
json GetLocalJson(object oObject, string sVarName);
// Set oObject's local json variable sVarName to jValue
void SetLocalJson(object oObject, string sVarName, json jValue);
// Delete oObject's local json variable sVarName
void DeleteLocalJson(object oObject, string sVarName);
// Bind an json to a named parameter of the given prepared query.
// Json values are serialised into a string.
// Example:
// sqlquery v = SqlPrepareQueryObject(GetModule(), "insert into test (col) values (@myjson);");
// SqlBindJson(v, "@myjson", myJsonObject);
// SqlStep(v);
void SqlBindJson(sqlquery sqlQuery, string sParam, json jValue);
// Retrieve a column cast as a json value of the currently stepped row.
// You can call this after SqlStep() returned TRUE.
// In case of error, a json null value will be returned.
// In traditional fashion, nIndex starts at 0.
json SqlGetJson(sqlquery sqlQuery, int nIndex);
// This stores a json out to the specified campaign database
// The database name:
// - is case insensitive and it must be the same for both set and get functions.
// - can only contain alphanumeric characters, no spaces.
// The var name must be unique across the entire database, regardless of the variable type.
// If you want a variable to pertain to a specific player in the game, provide a player object.
void SetCampaignJson(string sCampaignName, string sVarName, json jValue, object oPlayer=OBJECT_INVALID);
// This will read a json from the specified campaign database
// The database name:
// - is case insensitive and it must be the same for both set and get functions.
// - can only contain alphanumeric characters, no spaces.
// The var name must be unique across the entire database, regardless of the variable type.
// If you want a variable to pertain to a specific player in the game, provide a player object.
json GetCampaignJson(string sCampaignName, string sVarName, object oPlayer=OBJECT_INVALID);
// Gets a device property/capability as advertised by the client.
// sProperty is one of PLAYER_DEVICE_PROPERTY_xxx.
// Returns -1 if
// - the property was never set by the client,
// - the the actual value is -1,
// - the player is running a older build that does not advertise device properties,
// - the player has disabled sending device properties (Options->Game->Privacy).
int GetPlayerDeviceProperty(object oPlayer, string sProperty);
// Returns the LANGUAGE_xx code of the given player, or -1 if unavailable.
int GetPlayerLanguage(object oPlayer);
// Returns one of PLAYER_DEVICE_PLATFORM_xxx, or 0 if unavailable.
int GetPlayerDevicePlatform(object oPlayer);
// Deserializes the given resref/template into a JSON structure.
// Supported GFF resource types:
// * RESTYPE_CAF (and RESTYPE_ARE, RESTYPE_GIT, RESTYPE_GIC)
// * RESTYPE_UTC
// * RESTYPE_UTI
// * RESTYPE_UTT
// * RESTYPE_UTP
// * RESTYPE_UTD
// * RESTYPE_UTW
// * RESTYPE_UTE
// * RESTYPE_UTM
// Returns a valid gff-type json structure, or a null value with GetJsonError() set.
json TemplateToJson(string sResRef, int nResType);
// Returns the resource location of sResRef.nResType, as seen by the running module.
// Note for dedicated servers: Checks on the module/server side, not the client.
// Returns "" if the resource does not exist in the search space.
string ResManGetAliasFor(string sResRef, int nResType);
// Finds the nNth available resref starting with sPrefix.
// * Set bSearchBaseData to TRUE to also search base game content stored in your game installation directory.
// WARNING: This can be very slow.
// * Set sOnlyKeyTable to a specific keytable to only search the given named keytable (e.g. "OVERRIDE:").
// Returns "" if no such resref exists.
string ResManFindPrefix(string sPrefix, int nResType, int nNth = 1, int bSearchBaseData = FALSE, string sOnlyKeyTable = "");
// Create a NUI window from the given resref(.jui) for the given player.
// * The resref needs to be available on the client, not the server.
// * The token is a integer for ease of handling only. You are not supposed to do anything with it, except store/pass it.
// * The window ID needs to be alphanumeric and short. Only one window (per client) with the same ID can exist at a time.
// Re-creating a window with the same id of one already open will immediately close the old one.
// * See nw_inc_nui.nss for full documentation.
// Returns the window token on success (>0), or 0 on error.
int NuiCreateFromResRef(object oPlayer, string sResRef, string sWindowId = "");
// Create a NUI window inline for the given player.
// * The token is a integer for ease of handling only. You are not supposed to do anything with it, except store/pass it.
// * The window ID needs to be alphanumeric and short. Only one window (per client) with the same ID can exist at a time.
// Re-creating a window with the same id of one already open will immediately close the old one.
// * See nw_inc_nui.nss for full documentation.
// Returns the window token on success (>0), or 0 on error.
int NuiCreate(object oPlayer, json jNui, string sWindowId = "");
// You can look up windows by ID, if you gave them one.
// * Windows with a ID present are singletons - attempting to open a second one with the same ID
// will fail, even if the json definition is different.
// Returns the token if found, or 0.
int NuiFindWindow(object oPlayer, string sId);
// Destroys the given window, by token, immediately closing it on the client.
// Does nothing if nUiToken does not exist on the client.
// Does not send a close event - this immediately destroys all serverside state.
// The client will close the window asynchronously.
void NuiDestroy(object oPlayer, int nUiToken);
// Returns the originating player of the current event.
object NuiGetEventPlayer();
// Gets the window token of the current event (or 0 if not in a event).
int NuiGetEventWindow();
// Returns the event type of the current event.
// * See nw_inc_nui.nss for full documentation of all events.
string NuiGetEventType();
// Returns the ID of the widget that triggered the event.
string NuiGetEventElement();
// Get the array index of the current event.
// This can be used to get the index into an array, for example when rendering lists of buttons.
// Returns -1 if the event is not originating from within an array.
int NuiGetEventArrayIndex();
// Returns the window ID of the window described by nUiToken.
// Returns "" on error, or if the window has no ID.
string NuiGetWindowId(object oPlayer, int nUiToken);
// Gets the json value for the given player, token and bind.
// * json values can hold all kinds of values; but NUI widgets require specific bind types.
// It is up to you to either handle this in NWScript, or just set compatible bind types.
// No auto-conversion happens.
// Returns a json null value if the bind does not exist.
json NuiGetBind(object oPlayer, int nUiToken, string sBindName);
// Sets a json value for the given player, token and bind.
// The value is synced down to the client and can be used in UI binding.
// When the UI changes the value, it is returned to the server and can be retrieved via NuiGetBind().
// * json values can hold all kinds of values; but NUI widgets require specific bind types.
// It is up to you to either handle this in NWScript, or just set compatible bind types.
// No auto-conversion happens.
// * If the bind is on the watch list, this will immediately invoke the event handler with the "watch"
// even type; even before this function returns. Do not update watched binds from within the watch handler
// unless you enjoy stack overflows.
// Does nothing if the given player+token is invalid.
void NuiSetBind(object oPlayer, int nUiToken, string sBindName, json jValue);
// Swaps out the given element (by id) with the given nui layout (partial).
// * This currently only works with the "group" element type, and the special "_window_" root group.
void NuiSetGroupLayout(object oPlayer, int nUiToken, string sElement, json jNui);
// Mark the given bind name as watched.
// A watched bind will invoke the NUI script event every time it's value changes.
// Be careful with binding nui data inside a watch event handler: It's easy to accidentally recurse yourself into a stack overflow.
int NuiSetBindWatch(object oPlayer, int nUiToken, string sBind, int bWatch);
// Returns the nNth window token of the player, or 0.
// nNth starts at 0.
// Iterator is not write-safe: Calling DestroyWindow() will invalidate move following offsets by one.
int NuiGetNthWindow(object oPlayer, int nNth = 0);
// Return the nNth bind name of the given window, or "".
// If bWatched is TRUE, iterates only watched binds.
// If FALSE, iterates all known binds on the window (either set locally or in UI).
string NuiGetNthBind(object oPlayer, int nToken, int bWatched, int nNth = 0);
// Returns the event payload, specific to the event.
// Returns JsonNull if event has no payload.
json NuiGetEventPayload();
// Get the userdata of the given window token.
// Returns JsonNull if the window does not exist on the given player, or has no userdata set.
json NuiGetUserData(object oPlayer, int nToken);
// Sets an arbitrary json value as userdata on the given window token.
// This userdata is not read or handled by the game engine and not sent to clients.
// This mechanism only exists as a convenience for the programmer to store data bound to a windows' lifecycle.
// Will do nothing if the window does not exist.
void NuiSetUserData(object oPlayer, int nToken, json jUserData);
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.
// 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();
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);
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:
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!
// 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);
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.
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.
Greetings, dear players and creators! Patch 8193.26 for Neverwinter Nights: Enhanced Edition arrives today! The update includes dozens of features and fixes plus adds two epic adventures to our trove of curated community content! Check out full patch notes below!
Hello, dear community. Today's development patch is a small one: Most importantly, it fixes one crash we found in testing. It also addresses some compatibility issues with the unofficial Cyrillic language support, that hopefully helps our Russian friends maintain their community translation. We know that some strings in the new UI scenes are still not translatable. This will be addressed in a future patch!
Hello, friends! Today we are releasing patch .24 to the development branch of Neverwinter Nights: Enhanced Edition! This patch addresses some of the concerns raised with the latest stable release, while also bringing consistency, compatibility and performance improvements. As always, we appreciate your feedback and help in bringing these changes to the next stable release!
Greetings friends! Were launching a new patch for Neverwinter Nights: Enhanced Edition with some of the biggest feature sets yet! Todays update brings a new game launcher with featured community content, performance improvements, plus hundreds of fixes. Check out full details on Patch 8193.23 below...
Greetings, dear community! This patch release contains another set of small bug fixes and improvements that will hopefully see us shipping this to the stable branch really soon. Thank you for reporting any issues you find! Your help will catch all the corner cases with multiplayer and custom content we cannot test for.
Hello, friends! A new patch marks another iteration towards an upcoming stable release. Please help us test this build and report any issues you spot.
Fair greetings, one and all! This development build is a huge one. As usual, you can use it to play on .20.1 servers (current stable release); and wed like to encourage you to do so and report any issues you find with us! Thank you.
float SetObjectVisualTransform(object oObject, int nTransform, float fValue, int nLerpType = OBJECT_VISUAL_TRANSFORM_LERP_NONE, float fLerpDuration = 0.0, int bPauseWithGame = TRUE);
int OBJECT_VISUAL_TRANSFORM_LERP_NONE = 0; // 1
int OBJECT_VISUAL_TRANSFORM_LERP_LINEAR = 1; // x
int OBJECT_VISUAL_TRANSFORM_LERP_SMOOTHSTEP = 2; // x * x * (3 - 2 * x)
int OBJECT_VISUAL_TRANSFORM_LERP_INVERSE_SMOOTHSTEP = 3; // 0.5 - sin(asin(1.0 - 2.0 * x) / 3.0)
int OBJECT_VISUAL_TRANSFORM_LERP_EASE_IN = 4; // (1 - cosf(x * M_PI * 0.5))
int OBJECT_VISUAL_TRANSFORM_LERP_EASE_OUT = 5; // sinf(x * M_PI * 0.5)
int OBJECT_VISUAL_TRANSFORM_LERP_QUADRATIC = 6; // x * x
int OBJECT_VISUAL_TRANSFORM_LERP_SMOOTHERSTEP = 7; // (x * x * x * (x * (6.0 * x - 15.0) + 10.0))
// Returns the currently executing event (EVENT_SCRIPT_*) or 0 if not determinable.
// Note: Will return 0 in DelayCommand/AssignCommand. ExecuteScript(Chunk) will inherit their event ID from their parent event.
int GetCurrentlyRunningEvent();
// Get the integer parameter of eEffect at nIndex.
// * nIndex bounds: 0 >= nIndex < 8.
// * Some experimentation will be needed to find the right index for the value you wish to determine.
// Returns: the value or 0 on error/when not set.
int GetEffectInteger(effect eEffect, int nIndex);
// Get the float parameter of eEffect at nIndex.
// * nIndex bounds: 0 >= nIndex < 4.
// * Some experimentation will be needed to find the right index for the value you wish to determine.
// Returns: the value or 0.0f on error/when not set.
float GetEffectFloat(effect eEffect, int nIndex);
// Get the string parameter of eEffect at nIndex.
// * nIndex bounds: 0 >= nIndex < 6.
// * Some experimentation will be needed to find the right index for the value you wish to determine.
// Returns: the value or "" on error/when not set.
string GetEffectString(effect eEffect, int nIndex);
// Get the object parameter of eEffect at nIndex.
// * nIndex bounds: 0 >= nIndex < 4.
// * Some experimentation will be needed to find the right index for the value you wish to determine.
// Returns: the value or OBJECT_INVALID on error/when not set.
object GetEffectObject(effect eEffect, int nIndex);
// Get the vector parameter of eEffect at nIndex.
// * nIndex bounds: 0 >= nIndex < 2.
// * Some experimentation will be needed to find the right index for the value you wish to determine.
// Returns: the value or {0.0f, 0.0f, 0.0f} on error/when not set.
vector GetEffectVector(effect eEffect, int nIndex);
// Check if nBaseItemType fits in oTarget's inventory.
// Note: Does not check inside any container items possessed by oTarget.
// * nBaseItemType: a BASE_ITEM_* constant.
// * oTarget: a valid creature, placeable or item.
// Returns: TRUE if the baseitem type fits, FALSE if not or on error.
int GetBaseItemFitsInInventory(int nBaseItemType, object oTarget);
// Get oObject's local cassowary variable reference sVarName
// * Return value on error: empty solver
// * NB: cassowary types are references, same as objects.
// Unlike scalars such as int and string, solver references share the same data.
// Modifications made to one reference are reflected on others.
cassowary GetLocalCassowary(object oObject, string sVarName);
// Set a reference to the given solver on oObject.
// * NB: cassowary types are references, same as objects.
// Unlike scalars such as int and string, solver references share the same data.
// Modifications made to one reference are reflected on others.
void SetLocalCassowary(object oObject, string sVarName, cassowary cSolver);
// Delete local solver reference.
// * NB: cassowary types are references, same as objects.
// Unlike scalars such as int and string, solver references share the same data.
// Modifications made to one reference are reflected on others.
void DeleteLocalCassowary(object oObject, string sVarName);
// Clear out this solver, removing all state, constraints and suggestions.
// This is provided as a convenience if you wish to reuse a cassowary variable.
// It is not necessary to call this for solvers you simply want to let go out of scope.
void CassowaryReset(cassowary cSolver);
// Add a constraint to the system.
// * The constraint needs to be a valid comparison equation, one of: >=, ==, <=.
// * This implementation is a linear constraint solver.
// * You cannot multiply or divide variables and expressions with each other.
// Doing so will result in a error when attempting to add the constraint.
// (You can, of course, multiply or divide by constants).
// * fStrength must be >= CASSOWARY_STRENGTH_WEAK && <= CASSOWARY_STRENGTH_REQUIRED.
// * Any referenced variables can be retrieved with CassowaryGetValue().
// * Returns "" on success, or the parser/constraint system error message.
string CassowaryConstrain(cassowary cSolver, string sConstraint, float fStrength = CASSOWARY_STRENGTH_REQUIRED);
// Suggest a value to the solver.
// * Edit variables are soft constraints and exist as an optimisation for complex systems.
// You can do the same with Constrain("v == 5", CASSOWARY_STRENGTH_xxx); but edit variables
// allow you to suggest values without having to rebuild the solver.
// * fStrength must be >= CASSOWARY_STRENGTH_WEAK && < CASSOWARY_STRENGTH_REQUIRED
// Suggested values cannot be required, as suggesting a value must not invalidate the solver.
void CassowarySuggestValue(cassowary cSolver, string sVarName, float fValue, float fStrength = CASSOWARY_STRENGTH_STRONG);
// Get the value for the given variable, or 0.0 on error.
float CassowaryGetValue(cassowary cSolver, string sVarName);
// Gets a printable debug state of the given solver, which may help you debug
// complex systems.
string CassowaryDebug(cassowary cSolver);
// Overrides a given strref to always return sValue instead of what is in the TLK file.
// Setting sValue to "" will delete the override
void SetTlkOverride(int nStrRef, string sValue="");
// Constructs a custom itemproperty given all the parameters explicitly.
// This function can be used in place of all the other ItemPropertyXxx constructors
// Use GetItemProperty{Type,SubType,CostTableValue,Param1Value} to see the values for a given itemproperty.
itemproperty ItemPropertyCustom(int nType, int nSubType=-1, int nCostTableValue=-1, int nParam1Value=-1);
Greetings Adventurers,
We just launched Patch 8193.20 for Neverwinter Nights: Enhanced Edition! The update adds scores of features & fixes to the core campaigns, premium modules and toolsets. Todays patch also addresses the voiceover issue for non-english localizations.
Huge thanks to our amazing community for helping to test out the beta versions of this patch we couldnt have done it without you!
Check out the Patch Highlights & Full Details below!
Greetings everyone! Were just about ready to ship Patch 8193.20 for Neverwinter Nights: Enhanced Edition but we need your help to test the Beta (Round 2)! Based on your feedback from the latest beta test, weve updated the build of the next Neverwinter Nights: Enhanced Edition patch with a few fixes. Huge thanks to all testers for their feedback on this! Now we'd like to gather your thoughts on the new build: Is it stable & solid? Is it ready for release? Let us know!
Greetings adventurers, Were just about ready to ship Patch 8193.19 for Neverwinter Nights: Enhanced Edition but we need your help to test the Beta! Last month we shipped an epic patch with some huge graphical upgrades. This month were looking to tackle a few bugs that big patch introduced, and improve the overall polish of our favorite RPG.
Hello, dear community! This is dev patch 82.8193.19. As always, it is cross-compatible with all 8193-series releases, though newer features will not work on older servers, and vice versa. Please test, and report any issues you find. Thank you!
Hello friends! We're shipping Dev Patch 8193.18 today. This is stabilisation and bugfixes, with just a tiny selection of existing feature improvements.
// Sets the current hitpoints of oObject.
// * You cannot destroy or revive objects or creatures with this function.
// * For currently dying PCs, you can only set hitpoints in the range of -9 to 0.
// * All other objects need to be alive and the range is clamped to 1 and max hitpoints.
// * This is not considered damage (or healing). It circumvents all combat logic, including damage resistance and reduction.
// * This is not considered a friendly or hostile combat action. It will not affect factions, nor will it trigger script events.
// * This will not advise player parties in the combat log.
void SetCurrentHitPoints(object oObject, int nHitPoints);
Hello! This is a hotfix patch to 8193.15, which we released yesterday. The changes in this patch are clientside only. You do not need to upgrade your dedicated server if it is already on .15 for full feature support.
// 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.
// 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);
// 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.
// 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);
// Sets the cursor (MOUSECURSOR_*) to use when hovering over oObject
void SetObjectMouseCursor(object oObject, int nCursor = -1);
// 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 = "");
// 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);
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]);
// Convert sHex, a string containing a hexadecimal object id,
// into a object reference. Counterpart to ObjectToString().
object StringToObject(string sHex);
Hello, dear community! This is development build 8193.15, which stabilises the previous .14 release. This is in all likelihood the last release before a stable patch, right around the corner.
Hello Neverwinter friends! Today is the day for a new development patch, and it is a big one. Please test it thoroughly, as we intend this to hit stable in the coming weeks! This patch is compatible with the current stable (8193.13), so you can play on servers with it that have not yet upgraded. However, some of the new features will not work on servers. To get the full experience, you will have to update both server and clients to this patch.
// 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.
// 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);
// 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.
// 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);
// Sets the cursor (MOUSECURSOR_*) to use when hovering over oObject
void SetObjectMouseCursor(object oObject, int nCursor = -1);
// 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 = "");
// 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);
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]);
// Convert sHex, a string containing a hexadecimal object id,
// into a object reference. Counterpart to StringToObject().
object StringToObject(string sHex);
Hello, everyone! Today, we are shipping patch 8193.13 to the stable branch of the game. This patch is crossplay-compatible with all 8193 game releases, but we recommend upgrading to the newest version to gain access to the latest features! We'd like to thank you, our faithful and patient community, for your help in providing feedback, reporting bugs, and testing our development branch in between!
// Returns the build number of oPlayer (i.e. 8193).
// Returns 0 if the given object isn't a player or did not advertise their build info.
int GetPlayerBuildVersionMajor(object oPlayer);
// Returns the patch revision of oPlayer (i.e. 8).
// Returns 0 if the given object isn't a player or did not advertise their build info.
int GetPlayerBuildVersionMinor(object oPlayer);
Hello friends, We just released a patch for Dark Dreams of Furiae, the new premium module for Neverwinter Nights: Enhanced Edition from developers at Silverstring Media and Phantom Compass. PATCH DETAILS
// Returns the build number of oPlayer (i.e. 8193).
// Returns 0 if the given object isn't a player or did not advertise their build info.
int GetPlayerBuildVersionMajor(object oPlayer);
// Returns the patch revision of oPlayer (i.e. 8).
// Returns 0 if the given object isn't a player or did not advertise their build info.
int GetPlayerBuildVersionMinor(object oPlayer);
Developers at Silverstring Media & Phantom Compass just launched a brand new module for Neverwinter Nights: Enhanced Edition. Dark Dreams of Furiae is a mystery adventure on the edge of hell! Get it now > $4.99 USD
Hello friends, Today we're shipping a hefty new patch for Neverwinter Nights: Enhanced Edition on Windows, macOS and Linux! Huge thanks goes out to our heroic community members who helped test the many features and fixes in previous development patches over the last several months. Read on for details!
mymodel_0
40 mymodel_1
80.5 mymodel_2
The game supports LOD files with up to three levels, as shown above. You may omit the last entry. The first line is the high-resolution model; the other two are meant to be lower-resolution model files, that will be dynamically swapped out as the camera reaches the given distance.
Please note that LODs are highly dependent on the screen resolution of the client. The actual mechanisms here need to still be figured out; but for now, we'd suggest choosing LOD distances as if the user had a 1080p screen. To support other resolutions, there is a configuration slider in the debug settings (Ctrl-Shift-F12, select "Config", key: "graphics.lod.scale-factor") that users can influence LOD distances with.
// Makes oPC load texture sNewName instead of sOldName.
// If oPC is OBJECT_INVALID, it will apply the override to all active players
// Setting sNewName to "" will clear the override and revert to original.
void SetTextureOverride(string sOldName, string sNewName = "", object oPC = OBJECT_INVALID);
Changes made through this call will appear immediately on clients.
int DOMAIN_AIR = 0;
int DOMAIN_ANIMAL = 1;
int DOMAIN_DEATH = 3;
int DOMAIN_DESTRUCTION = 4;
int DOMAIN_EARTH = 5;
int DOMAIN_EVIL = 6;
int DOMAIN_FIRE = 7;
int DOMAIN_GOOD = 8;
int DOMAIN_HEALING = 9;
int DOMAIN_KNOWLEDGE = 10;
int DOMAIN_MAGIC = 13;
int DOMAIN_PLANT = 14;
int DOMAIN_PROTECTION = 15;
int DOMAIN_STRENGTH = 16;
int DOMAIN_SUN = 17;
int DOMAIN_TRAVEL = 18;
int DOMAIN_TRICKERY = 19;
int DOMAIN_WAR = 20;
int DOMAIN_WATER = 21;
// Returns oCreature's spell school specialization in nClass (SPELL_SCHOOL_* constants)
// Unless custom content is used, only Wizards have spell schools
// Returns -1 on error
int GetSpecialization(object oCreature, int nClass = CLASS_TYPE_WIZARD);
// Returns oCreature's domain in nClass (DOMAIN_* constants)
// nDomainIndex - 1 or 2
// Unless custom content is used, only Clerics have domains
// Returns -1 on error
int GetDomain(object oCreature, int nDomainIndex = 1, int nClass = CLASS_TYPE_CLERIC);
int SCREEN_ANCHOR_TOP_LEFT = 0;
int SCREEN_ANCHOR_TOP_RIGHT = 1;
int SCREEN_ANCHOR_BOTTOM_LEFT = 2;
int SCREEN_ANCHOR_BOTTOM_RIGHT = 3;
int SCREEN_ANCHOR_CENTER = 4;
// Displays sMsg on oPC's screen.
// The message is displayed on top of whatever is on the screen, including UI elements
// nX, nY - coordinates of the first character to be displayed. The value is in terms
// of character 'slot' relative to the nAnchor anchor point.
// If the number is negative, it is applied from the bottom/right.
// nAnchor - SCREEN_ANCHOR_* constant
// fLife - Duration in seconds until the string disappears.
// nRGBA, nRGBA2 - Colors of the string in 0xRRGGBBAA format. String starts at nRGBA,
// but as it nears end of life, it will slowly blend into nRGBA2.
// nID - Optional ID of a string. If not 0, subsequent calls to PostString will
// remove the old string with the same ID, even if it's lifetime has not elapsed.
// Only positive values are allowed.
// sFont - If specified, use this custom font instead of default console font.
void PostString(object oPC, string sMsg, int nX = 0, int nY = 0, int nAnchor = SCREEN_ANCHOR_TOP_LEFT, float fLife = 10.0f, int nRGBA = 2147418367, int nRGBA2 = 2147418367, int nID = 0, string sFont="");
Greetings! Patch 8193.8 on the Development branch fixes all known regressions introduced by .7; and brings in some neat, new features for you to play with. Please help us test it and report any bugs you find!
int DOMAIN_AIR = 0;
int DOMAIN_ANIMAL = 1;
int DOMAIN_DEATH = 3;
int DOMAIN_DESTRUCTION = 4;
int DOMAIN_EARTH = 5;
int DOMAIN_EVIL = 6;
int DOMAIN_FIRE = 7;
int DOMAIN_GOOD = 8;
int DOMAIN_HEALING = 9;
int DOMAIN_KNOWLEDGE = 10;
int DOMAIN_MAGIC = 13;
int DOMAIN_PLANT = 14;
int DOMAIN_PROTECTION = 15;
int DOMAIN_STRENGTH = 16;
int DOMAIN_SUN = 17;
int DOMAIN_TRAVEL = 18;
int DOMAIN_TRICKERY = 19;
int DOMAIN_WAR = 20;
int DOMAIN_WATER = 21;
// Returns oCreature's spell school specialization in nClass (SPELL_SCHOOL_* constants)
// Unless custom content is used, only Wizards have spell schools
// Returns -1 on error
int GetSpecialization(object oCreature, int nClass = CLASS_TYPE_WIZARD);
// Returns oCreature's domain in nClass (DOMAIN_* constants)
// nDomainIndex - 1 or 2
// Unless custom content is used, only Clerics have domains
// Returns -1 on error
int GetDomain(object oCreature, int nDomainIndex = 1, int nClass = CLASS_TYPE_CLERIC);
int SCREEN_ANCHOR_TOP_LEFT = 0;
int SCREEN_ANCHOR_TOP_RIGHT = 1;
int SCREEN_ANCHOR_BOTTOM_LEFT = 2;
int SCREEN_ANCHOR_BOTTOM_RIGHT = 3;
int SCREEN_ANCHOR_CENTER = 4;
// Displays sMsg on oPC's screen.
// The message is displayed on top of whatever is on the screen, including UI elements
// nX, nY - coordinates of the first character to be displayed. The value is in terms
// of character 'slot' relative to the nAnchor anchor point.
// If the number is negative, it is applied from the bottom/right.
// nAnchor - SCREEN_ANCHOR_* constant
// fLife - Duration in seconds until the string disappears.
// nRGBA, nRGBA2 - Colors of the string in 0xRRGGBBAA format. String starts at nRGBA,
// but as it nears end of life, it will slowly blend into nRGBA2.
// nID - Optional ID of a string. If not 0, subsequent calls to PostString will
// remove the old string with the same ID, even if it's lifetime has not elapsed.
// Only positive values are allowed.
// sFont - If specified, use this custom font instead of default console font.
void PostString(object oPC, string sMsg, int nX = 0, int nY = 0, int nAnchor = SCREEN_ANCHOR_TOP_LEFT, float fLife = 10.0f, int nRGBA = 2147418367, int nRGBA2 = 2147418367, int nID = 0, string sFont="");
Hello, friends. This development patch brings NWN:EE to version 8193.7. You can crossplay on all 8193 servers, as well as with friends on the same major version! We appreciate any and all testing on this! Tileset changes
Happy New Year, friends! Were kicking off 2020 with a brand new development patch for you to play with! Development Patch 8193.6 focuses on creation for both single player and multiplayer. This dev patch is best suited for our content creator community, as it requires technical knowledge of our toolsets (and a willingness to endure a few issues). We hope you have some fun breaking these features fair warning: were expecting there to be some outstanding bugs in this build. This patch is network-compatible with all other 8193 releases; however, new features will not work when the patch revision differs (and characters may fail to pass ELC). Check out the full patch notes below! All the best, - Beamdog NWNEE Team
mymodel_0
40 mymodel_1
80.5 mymodel_2
The game supports LOD files with up to three levels, as shown above. You may omit the last entry. The first line is the high-resolution model; the other two are meant to be lower-resolution model files, that will be dynamically swapped out as the camera reaches the given distance.
Please note that LODs are highly dependent on the screen resolution of the client. The actual mechanisms here need to still be figured out; but for now, we'd suggest choosing LOD distances as if the user had a 1080p screen. To support other resolutions, there is a configuration slider in the debug settings (Ctrl-Shift-F12, select "Config", key: "graphics.lod.scale-factor") that users can influence LOD distances with.
// Makes oPC load texture sNewName instead of sOldName.
// If oPC is OBJECT_INVALID, it will apply the override to all active players
// Setting sNewName to "" will clear the override and revert to original.
void SetTextureOverride(string sOldName, string sNewName = "", object oPC = OBJECT_INVALID);
Changes made through this call will appear immediately on clients.
[[nwsync.downloader.repositories]]
name = "NWVault"
url = "http://sync.neverwintervault.org/"
To actually generate a repository of your own that can offer singleplayer modules for download, you need to generate NWSync manifests that have module contents in them (nwsync_write --with-module --group-id N ...). Finally, add all manifests into a big json array in modules.json in the repository root (the nwsync_write tooling will update soon to do this for you). See the sample repository if it is unclear.
Modules downloaded this way will show up under "Other Modules" when clicking Singleplayer -> New Game.
Hello everyone! We'd like to wish you a relaxing holiday season with dear ones, and the time to do the things you love most as you ring in a brand new year. See you in 2020!
8193.4 contains small, incremental fixes to the stable branch! Thank you all for reporting these issues. We know there are remaining open problems - we'll get to them in future incremental patches.
Hello, again! Today we are shipping 8193.3 to the stable branch. This update includes all of the changes contained in 8193.1 and 8193.2!
Greetings! We're fixing some more things in this minor update to 8193.1. Again, this release is (mostly) compatible with the current stable release, 8193. Please test it thoroughly and report issues to us; as this is intended to replace 8193 on stable very soon.
Hello everyone. This build is a hotfix for 8193, which has shipped on Monday to the stable branch. You can play on non-hotfixed 8193 servers with this, and you can update your server to this build and players on the current stable branch will still be able to connect, though some ELC issues may unfortunately present on chargen. A NWNX build will be available momentarily. We would like to encourage you to test this build, so that it can migrate to stable in a timely manner!
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.
This patch also brings crossplay compatibility with Nintendo Switch and Xbox One!
Major Features
-=-=-=-=-=-=-=
* 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.
* Achievements have been added to the Steam release. These are the same as have been available on Android for a while. There is a Debug UI panel that allows you to clear previously-achieved achievements if youd like to start fresh.
* 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 dont want anymore.
* New script calls (see below).
Further Features
-=-=-=-=-=-=-=-=
* 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
This patch is the Release Candidate for 1.79, which will be released in a few days. Please help test this build! Specifically, if you run a server, you can help ensure a smooth transition by trying this build out. Server download packages and a docker image are available later today; NWNX:EE will update soon as well.
Yet another patch with which we are working towards a stable patch release. Not far off now! We appreciate any and all bug reports and feedback your testing will generate.
Yet another stabilising patch! This one fixes a long-outstanding memleak that manifested when players stuck around for a while with skinmeshes on screen (robes, cloaks, certain monsters). It was framerate-dependent, and for some people, this resulted in memory exhaustion and crashes after anywhere between 30 minutes and a few hours. We appreciate any and all bug reports and feedback your testing will generate.
We're still working towards a stable patch. This is one step closer, knocking off a few required items off the TODO list for it. We appreciate any and all bug reports and feedback your testing will generate.
Hail adventurers!
We released a new premium module for Neverwinter Nights: Enhanced Edition from the developers of Darkness Over Daggerford, Ossian Studios.
Tyrants of the Moonsea is available now on Steam!
Based on the original module by Luke Scull, this newly enhanced adventure vastly expands the former module by adding 70% more story and gameplay, plus new art and audio!
Tyrants of the Moonsea
The harsh frontier land known as the Moonsea is besieged by demons. A mysterious cult has arisen, bent on death and destruction. Amid the chaos, war is imminent between the powerful city-states and their tyrannical rulers.
Accompanied by the dwarf merchant Madoc, you approach the town of Voonlar just as the worst snowstorm of the year hits. You soon discover that only you can prevent the total annihilation of the Moonsea at the hands of a legendary and ancient evil...
Features
A 20+ hour high-level adventure set in the perilous Moonsea region of the Forgotten Realms! Featuring new monsters, new tilesets, 35 minutes of new music, and 1,000 lines of new character VO.
- An expansion-sized high-level adventure with 20+ hours of gameplay
- Use the world map to explore 18 areas in the Moonsea region including Zhentil Keep, Cormanthor, Thar, and prominent city-states.
- Recruit from 5 different companions for your party
- 5 new monsters to do battle with
- 14 new character portraits
- 35 minutes of inspiring new music including exhilarating combat tracks
- 1,000 lines of new character VO
Deluxe Bundle!
We've added to the Neverwinter Nights: Enhanced Edition Deluxe Bundle:
- Tyrants of the Moonsea
- Tyrants of the Moonsea Official Soundtrack
Complete your bundle & save on ALL enhanced NWN:EE products!
Steam Daily Deal: 75% OFF
Get Neverwinter Nights: Enhanced Edition! Join the community today & snag the classic D&D adventure today and open the gates to scores of community content, premium modules, DM Toolsets, persistent worlds and more...
Today's Deal: Save 75% on Neverwinter Nights: Enhanced Edition!*
Look for the deals each day on the front page of Steam. Or follow us on twitter or Facebook for instant notifications wherever you are!
*Offer ends Saturday at 10AM Pacific Time
From the developers of acclaimed adventure Darkness Over Daggerford, Ossian Studios, comes a new premium module for Neverwinter Nights: Enhanced Edition --> Tyrants of the Moonsea!
Based on the original module by Luke Scull, this new, enhanced version of Tyrants of the Moonsea vastly expands this former premium module by adding 70% more story and gameplay, as well as a a large amount of new art and audio content. Read on for details!
STORY
The harsh frontier land known as the Moonsea is besieged by demons. A mysterious cult has arisen, bent on death and destruction. Amid the chaos, war is imminent between the powerful city-states and their tyrannical rulers.
Accompanied by the dwarf merchant Madoc, you approach the town of Voonlar just as the worst snowstorm of the year hits. You soon discover that only you can prevent the total annihilation of the Moonsea at the hands of a legendary and ancient evil...
FEATURES
A 20+ hour high-level adventure set in the perilous Moonsea region of the Forgotten Realms! Featuring new monsters, new tilesets, 35 minutes of new music, and 1,000 lines of new character VO.
- An expansion-sized high-level adventure with 20+ hours of gameplay
- Use the world map to explore 18 areas in the Moonsea region including Zhentil Keep, Cormanthor, Thar, and prominent city-states.
- Recruit from 5 different companions for your party
- 5 new monsters to do battle with
- 14 new character portraits
- 35 minutes of inspiring new music including exhilarating combat tracks
- 1,000 lines of new character VO
PLUS - THE ORIGINAL SOUNDTRACK!
Composed by Mark Braga, Kalen Smith and Will Musser, the inspiring original soundtrack for Tyrants of the Moonsea will also be available on Steam!
This is a stabilisation effort following 8188. Were working towards a stable patch before the new renderer will happen. Please help test, your feedback is invaluable!
Hello everyone! This development patch brings in a features that lay the groundwork for a followup patch to the stable branch. We are releasing this to the dev branch now so that you can help us test it and provide feedback on the direction things are taking. Thus, this patch contains a lot of experimental features with moderate chance for breakage. Please report any issues you might face on our bug tracker - https://support.baldursgate.com/projects/nwn-ee-public-bugs. We're aware it's been a long wait since our last patch. Thank you for your patience! We assure you, we are still hard at work on Neverwinter Nights: Enhanced Edition. Please note that this patch does not represent the full set of features we are working on. Instead, we have split away partial changes so that the community could test and evaluate them while were working on other features including the new graphics rendering engine, improved NWSync capabilities, and softening up more parts of the ruleset. This patch introduces backwards-breaking changes to save games and character files (specifically, the Red Dragon Disciple). Please read the patch notes carefully and make backups of your saves and characters.
// 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);
Hello, friends!
Weve been substantially updating the Neverwinter Nights Toolset, and want you to test our newest build which adds tons of fixes, optimizations, & new features!
Grab the new Neverwinter Nights: Enhanced Edition Toolset build at this link, test it out, and share your feedback!
We've uploaded an out-of-band update for the Toolset so that content creators could test it without having to wait for a patch (which will take a while with the work on the renderer and 64-bit integration).
Check out a small video illustrating new features: https://www.facebook.com/Beamdog/videos/2319128681662635/
We're shipping a quick pre-holidays development patch for Neverwinter Nights: Enhanced Edition. We're at 8187 now!
Todays the day for Android Neverwinter Nights fans! Neverwinter Nights: Enhanced Edition has just launched on Google Play and it's cross-play compatible with desktop versions!
NWN:EE on Google Play introduces true type font, new main menu art, achievements, bug fixes, features, and more which Steam and other desktop players will be seeing in future patches.
Check out the Google Play trailer here: https://youtu.be/5qAYBJ-boEE
Find out more on the Beamdog blog: http://blog.beamdog.com/2018/12/neverwinter-nights-enhanced-edition.html
Check out NWN:EE on Google Play: https://play.google.com/store/apps/details?id=com.beamdog.nwnandroid&hl=en
Today, we are shipping Development Build 8186 to the stable branch of Neverwinter Nights: Enhanced Edition as 1.78! This is the very same build that was recently updated on the development branch and contains no changes since then. The previous build (8181) is available as a Steam branch, so you can switch back if your favorite persistent world needs more time to update. To do so, select 'oldstable' under the beta dropdown list in the Neverwinter Nights: Enhanced Edition Steam properties.
Same week, new patch! 8186 contains another update preparing for the next stable release. We'd like to thank the online PW community for their help in testing NWSync. Your feedback has been incredibly helpful in making NWSync a reality! With the Android beta now released, we're looking to keep feature parity by pushing a new release on both platforms; leading to a stable release for desktop that is cross-play compatible with Android.
New week, new patch. 8185 contains stabilization fixes for a upcoming stable release. As always, we appreciate your support in testing development patches. With the upcoming Android beta, we are looking to keep feature parity by pushing a stable release soon.
We're sending Dev patch 8184 your way! This patch refactors the NWSync client-side storage concept in a major way. Data is now sharded out to multiple databases, to support Android file systems on MicroSD cards, where files cannot grow larger than 2GB, give or take. As part of this refactor, the game will both save and load faster as de/compression, reading and writing can be done in parallel (on multi-core systems with fast SSDs at least). Additionally, this change will make it much easier on the system to vacuum deleted data in the background, and free up disk space. Unfortunately, part of this change means that previously-downloaded data will be left sitting in your userhome/nwsync/ directory, as it is not migrated automatically. You can delete the file "nwsync.sqlite3" if you still have it from testing previous dev patches. To backfill this data, a re-download will be required.
This is patch 8183 for the Development branch of NWN:EE! This patch is a quick iteration on the previous Development patch. Build 8182 introduced NWSync, a feature allowing clients to download needed gameplay data from servers without having to manually hunt down HAK and TLK files.
NWN:EE Development Update 8182 is being rolled out. This patch contains a major new feature: NWSync, a mechanism to transparently and automatically download user content when joining a multiplayer server. The first development release now exists to serve as an invitation to test for the community.
We're shipping build 8181 to Stable today. This is the same build that has been on the Development branch for a short while now. If you'd like to stay on 1.76 until your favourite persistent world has migrated, please select the "oldstable" branch in Steam. For a full changelog compared to 1.76, read on.
We're shipping Neverwinter Nights: Enhanced Edition Development Build 8181 shortly after 8180 to address community-found feedback and issues. This build is the next release candidate for 1.77.
We're now shipping Neverwinter Nights: Enhanced Edition Development Build 8180. This build is a potential release candidate for 1.77.
The next stable patch for Neverwinter Nights: Enhanced Edition is live! If you have been following the Development branch announcements, you know what’s coming! This patch focuses on stabilisation and addresses issues found since the previous update shipped. In particular, the patch includes fixes for the majority of Intel-GPU related crashes. The full list of changes since v1.75 (Build 8176) is:
Neverwinter Nights: Enhanced Edition Development Build 8179 is now available. This build is a release candidate for 1.76. Thank you all for your assistance in hunting down bugs and testing these development builds.
Neverwinter Nights: Enhanced Edition Development Build 8178 is now up. This release is a step towards the next official NWN:EE update that will address many of the issues discovered since 1.75. The full list of changes since Build 8177 is:
Neverwinter Nights: Enhanced Edition Development Build 8177 is now available. The full list of changes since v1.75 (Build 8176) is:
Beamdog and Ossian Studios are excited to announce the award winning premium module Darkness over Daggerford has been enhanced for Neverwinter Nights: Enhanced Edition!
This expansion-size adventure has 25+ hours of story-rich gameplay, 12 new music tracks, 12 new character portraits, new voice over, and nearly 500 gameplay improvements over the original!
Neverwinter Nights: Darkness over Daggerford is now available on Steam for $9.99 USD and will be coming soon to Beamdog.com and other stores.
http://blog.beamdog.com/2018/06/neverwinter-nights-darkness-over.html
We're shipping the next stable patch for Neverwinter Nights: Enhanced Edition. If you have been following the Development branch and it's announcements, you will know what to expect! The full list of changes since v1.74 (Build 8166) is:
int OBJECT_VISUAL_TRANSFORM_SCALE = 10;
int OBJECT_VISUAL_TRANSFORM_ROTATE_X = 21;
int OBJECT_VISUAL_TRANSFORM_ROTATE_Y = 22;
int OBJECT_VISUAL_TRANSFORM_ROTATE_Z = 23;
int OBJECT_VISUAL_TRANSFORM_TRANSLATE_X = 31;
int OBJECT_VISUAL_TRANSFORM_TRANSLATE_Y = 32;
int OBJECT_VISUAL_TRANSFORM_TRANSLATE_Z = 33;
int OBJECT_VISUAL_TRANSFORM_ANIMATION_SPEED = 40;
// Gets a visual transform on the given object.
// - oObject can be any valid Creature, Placeable, Item or Door.
// - nTransform is one of OBJECT_VISUAL_TRANSFORM_*
// Returns the current (or default) value.
float GetObjectVisualTransform(object oObject, int nTransform);
// Sets a visual transform on the given object.
// - oObject can be any valid Creature, Placeable, Item or Door.
// - nTransform is one of OBJECT_VISUAL_TRANSFORM_*
// - fValue depends on the transformation to apply.
// Returns the old/previous value.
float SetObjectVisualTransform(object oObject, int nTransform, float fValue);
// Sets an integer material shader uniform override.
// - sMaterial needs to be a material on that object.
// - sParam needs to be a valid shader parameter already defined on the material.
void SetMaterialShaderUniformInt(object oObject, string sMaterial, string sParam, int nValue);
// Sets a vec4 material shader uniform override.
// - sMaterial needs to be a material on that object.
// - sParam needs to be a valid shader parameter already defined on the material.
// - You can specify a single float value to set just a float, instead of a vec4.
void SetMaterialShaderUniformVec4(object oObject, string sMaterial, string sParam, float fValue1, float fValue2 = 0.0, float fValue3 = 0.0, float fValue4 = 0.0);
// Resets material shader parameters on the given object:
// - Supply a material to only reset shader uniforms for meshes with that material.
// - Supply a parameter to only reset shader uniforms of that name.
// - Supply both to only reset shader uniforms of that name on meshes with that material.
void ResetMaterialShaderUniforms(object oObject, string sMaterial = "", string sParam = "");
Development build 8175 for Neverwinter Nights: Enhanced Edition is here. This build is the new and likely last release candidate for 1.75! We very much appreciate any feedback that comes in from the community. Please try to break this build, and if you are adventurous, even update your server. Let us know if you run into any issues on the usual channels.
Development build 8174 for Neverwinter Nights: Enhanced Edition is now available. This build is the release candidate for 1.75! We would appreciate any and all testing you can give it. If all goes well, we will ship this build as 1.75. This will give NWNX:EE time to prepare ahead of time, and also allow server admins to test and migrate over the coming days. We'll make sure to keep everyone appraised on timing!
Development build 8172 for Neverwinter Nights: Enhanced Edition is now available.
Development build 8171 for Neverwinter Nights: Enhanced Edition is available now. We intend to ship the next stable release (1.75) soon. Please give this development patch a good test, and as always - your issue reports on support.baldursgate.com are read and appreciated. As usual, we will be collaborating with the NWNXEE developers to make sure everything is ready for persistent worlds to migrate in a timely manner.
Neverwinter Nights: Enhanced Edition 8170 has shipped to the development branch today. We're now stabilising and working our way towards a 1.75 stable release in the coming weeks.
// Sets an integer material shader uniform override.
// - sMaterial needs to be a material on that object.
// - sParam needs to be a valid shader parameter already defined on the material.
void SetMaterialShaderUniformInt(object oObject, string sMaterial, string sParam, int nValue);
// Sets a vec4 material shader uniform override.
// - sMaterial needs to be a material on that object.
// - sParam needs to be a valid shader parameter already defined on the material.
// - You can specify a single float value to set just a float, instead of a vec4.
void SetMaterialShaderUniformVec4(object oObject, string sMaterial, string sParam, float fValue1, float fValue2 = 0.0, float fValue3 = 0.0, float fValue4 = 0.0);
// Resets material shader parameters on the given object:
// - Supply a material to only reset shader uniforms for meshes with that material.
// - Supply a parameter to only reset shader uniforms of that name.
// - Supply both to only reset shader uniforms of that name on meshes with that material.
void ResetMaterialShaderUniforms(object oObject, string sMaterial = "", string sParam = "");
Neverwinter Nights: Enhanced Edition development build 8169 is coming your way. Enjoy these patch notes as the build uploads.
int OBJECT_VISUAL_TRANSFORM_SCALE = 10;
int OBJECT_VISUAL_TRANSFORM_ROTATE_X = 21;
int OBJECT_VISUAL_TRANSFORM_ROTATE_Y = 22;
int OBJECT_VISUAL_TRANSFORM_ROTATE_Z = 23;
int OBJECT_VISUAL_TRANSFORM_TRANSLATE_X = 31;
int OBJECT_VISUAL_TRANSFORM_TRANSLATE_Y = 32;
int OBJECT_VISUAL_TRANSFORM_TRANSLATE_Z = 33;
int OBJECT_VISUAL_TRANSFORM_ANIMATION_SPEED = 40;
// Gets a visual transform on the given object.
// - oObject can be any valid Creature, Placeable, Item or Door.
// - nTransform is one of OBJECT_VISUAL_TRANSFORM_*
// Returns the current (or default) value.
float GetObjectVisualTransform(object oObject, int nTransform);
// Sets a visual transform on the given object.
// - oObject can be any valid Creature, Placeable, Item or Door.
// - nTransform is one of OBJECT_VISUAL_TRANSFORM_*
// - fValue depends on the transformation to apply.
// Returns the old/previous value.
float SetObjectVisualTransform(object oObject, int nTransform, float fValue);
last week v8167 was released on the Development Build containing a few small changes.
Last week v8167 was released on the Development Build containing a few small changes.
Great news for Neverwinter Nights fans! Neverwinter Nights: Enhanced Edition is now live on Steam! Catch the official launch day blog here: http://blog.beamdog.com/2018/03/neverwinter-nights-enhanced-edition_27.html A full changelog taking us from NWN 1.69 to today's Neverwinter Nights: Enhanced Edition is available here: https://www.beamdog.com/files/release_notes/nwnee_release_notes_final.pdf And watch (or re-watch) today's NWN:EE launch day livestream on YouTube: https://youtu.be/S-NA55IW4ZM
Neverwinter Nights: Enhanced Edition v8166 is now available on Steam and Beamdog. We’re closing in on the March 27 release date fast! This build brings Steam and Beamdog versions back in line and focuses on camera, audio, and part-based item/character issues.
Neverwinter Nights: Enhanced Edition Patch 8165 is now available on Steam-only. This patch contains Linux-only fixes required for pre-release testing. 8165 will temporarily disable cross play between Steam and Beamdog players. We plan to follow up with another patch in the very near future that will address issues introduced in 8164 and brings Steam and Beamdog versions back in line.
Busy times at Beamdog! With the March 27 Steam release less than two weeks away, the team is locking down features and fixes. Build 8164 is now available on Steam and Beamdog.com.
During Friday’s livestream, Beamdog CEO Trent Oster and Studio Director Phillip Daigle announced the March 27 release date of Neverwinter Nights: Enhanced Edition on Steam and showed the new look of the Hall of Justice from the Wailing Death campaign.
Find out more in the livestream recap! --> http://blog.beamdog.com/2018/03/march-9-livestream-recap.html
The latest update to the Development build is here. Lots of exciting stuff here including re-enabling multiplayer for some premium modules. Enjoy!
[Control Options]
CameraMaxPitch=89.000000
CameraMinDist=1.000000
Neverwinter Nights: Enhanced Edition Patch 8162 is here and it brings all kinds of multiplayer goodness! Thanks to all our Steam players for trying out builds 8160 and 8161 in the new Development branch.
// Get if oPlayer is currently connected over a relay (instead of directly).
// Returns FALSE for any other object, including OBJECT_INVALID.
int GetIsPlayerConnectionRelayed(object oPlayer);
What follows is a sample material file that includes examples for all currently supported fields:
customshaderVS vsSkinned
// Specifies a custom vertex shader: vsSkinned.shd
customshaderFS fsFancyNew
// Specifies a custom fragment shader: fsFancyNew.shd
texture0 myDecal
// Specifies a texture that will be bound to texUnit0 in the fragment shader. Will override bitmap/tetxure0 in the model
texture1 myMask
// Binds to texUnit1 in the fragment shader. We support up to fifteen of these textures: texture0 - texture14.
parameter float vDiffuse 0.8 1.0 0.65 1.0
// Creates a 4-float parameter that will be bound to a shader uniform of the same name (if it exists)
parameter float fModulator 0.5
// Creates a float parameter that will be bound to a shader uniform of the same name (if it exists)
parameter int iCount 2
// Creates an int parameter that will be bound to a shader uniform of the same name (if it exists)
To use a material like this one on a mesh, simple add the following line in the .mdl file: materialname myNewMaterialBuild 8161 is now available in the Neverwinter Nights: Enhanced Edition Development branch. These features and fixes will make their way into the main branch after testing.
The Development branch is available on the Beta tab after opening the game properties menu.
We heard you like betas for your betas. The Development beta branch for Neverwinter Nights: Enhanced Edition has just been opened.
This development branch will remain open beyond the launch of NWN:EE for brave souls to supply feedback on early versions of features and fixes. Access it through the Beta tab after opening the game properties menu.
A full list of Development beta branch patch notes will be published as we release new builds.
// Get if oPlayer is currently connected over a relay (instead of directly).
// Returns FALSE for any other object, including OBJECT_INVALID.
int GetIsPlayerConnectionRelayed(object oPlayer);
Neverwinter Nights: Enhanced Edition patch 8159 is here and so begins the beta on Steam!
All Head Start owners from Beamdog.com have been provided a Steam key to participate. Join the fun by pre-ordering on Beamdog!
Over the next few weeks, we’d love to hear feedback from Steam players on Friend Lists, Steam Workshop, stability, and about any translation errors.
Find out more in today's blog: http://blog.beamdog.com/2018/02/nwnee-8159-patch-notes-and-steam-beta.html …
Don't forget to tune into the weekly Beamdog livestream on Twitch to get the latest Neverwinter Nights: Enhanced Edition news. We'll be live at 10am PT https://www.twitch.tv/beamdog
Last week's update introduced a number of features in preparation for a beta on Steam. It also gave us a first glimpse of the brand new Aribeth character model, now available to view through Steam Workshop. While not final, this model shows the standard for future Neverwinter Nights: Enhanced Edition content.
Catch the full stream here:
https://youtu.be/jaLoDNLP7Z0
Steam Beta
Steam beta keys will be available this week. Watch for future announcements here and on Beamdog's social channels for more information.
If you can't wait, pop on over to our beta Discord and request a key from BeamdogBetaManager.
https://discord.gg/fRKuujh
Curious about what's coming for Neverwinter Nights: Enhanced Edition in future Head Start updates? Want to help decide what should be added to NWN:EE?
We've set up Trello boards to help!
Check out the NWN:EE Roadmap --> https://trello.com/b/K0…/neverwinter-nights-enhanced-edition
Vote for your favorite features & fixes in the Input board --> https://trello.com/b/Lb79bbgy/neverwinter-nights-input
[ 6079 ]
[ 2063 ]
[ 4245 ]