Clear out experimental .35 files

Clear out experimental .35 files
This commit is contained in:
Jaysyn904
2024-02-11 13:04:14 -05:00
parent 2112b92e24
commit 618cd42b82
22356 changed files with 0 additions and 1248956 deletions

View File

@@ -1,42 +0,0 @@
; NWNX2 configuration file
; These are the default values for NWNX2. Values specified on the command
; line take precedence.
[NWNX]
ServerPort = 5121
ModuleName = ""
WatchdogProcess = yes
UpdateIntervalProcess = 5
WatchdogGamespy = no
UpdateIntervalGamespy = 20
GamespyRetries = 5
OldGamespyProtocol = no
RestartDelay = 5
[ODBC2]
; Log file
MaxLogSize = 512 ; in KByte
LogLevel = 2 ; 0=nothing, 1=only errors, 2=everything
; Use these two settings for the SQLite internal database
source = sqlite
file = sqlite.db
; Use these two settings for ODBC connections
;source = odbc
;dsn = nwn
; Use these five settings for MySQL connections
;source = mysql
;server = localhost
;user = nwn
;pwd = password
;db = nwn
; Set hookscorco to false if you want to disable hooking of
; StoreCampaignObject and RetrieveCampaignObject entirely
hookscorco = true
[PROFILER]
MaxLogSize = 512 ; in KByte
LogLevel = 1 ; 1=overall statistics, 2=full script callstack

View File

@@ -1,332 +0,0 @@
<html>
<head>
<title> NWNX Documentation </title>
</head>
<body style="font-family:Arial,Verdana,sans-serif;">
<h2>Neverwinter Nights Extender 2</h2>
<h4>This documentation is &#169; by the Avlis Team. Version 2.6.1 of 14.01.2005.</h4>
<b>Visit us... </b>
<table border=1>
<tr>
<td> NWNX homepage</td>
<td> <a href="http://www.nwnx.org"> http://www.nwnx.org</a> </td>
</tr>
<tr>
<td> The Avlis homepage</td>
<td> <a href="http://www.avlis.org"> http://www.avlis.org</a> </td>
</tr>
<tr>
<td> Sourceforge project page </td>
<td> <a href="http://sourceforge.net/projects/apsnwnx/"> http://sourceforge.net/projects/apsnwnx/ </a> </td>
</tr>
<tr>
<td> NWNX2 page on NWVault </td>
<td> <a href="http://nwvault.ign.com/Files/other/data/1046636009723.shtml"> http://nwvault.ign.com/Files/other/data/1046636009723.shtml </a> </td>
</tr>
</table>
<h3>Table of Contents:</h3>
<table>
<tr>
<td> <a href="#I">I.</a></td>
<td> <a href="#I">Introduction to NWNX</a></td>
</tr>
<tr>
<td> <a href="#II">II.</a></td>
<td> <a href="#II">NWNX plugins</a></td>
</tr>
<tr>
<td> <a href="#III">III.</a></td>
<td> <a href="#III">Available plugins </a></td>
</tr>
<tr>
<td> <a href="#IV">IV.</a></td>
<td> <a href="#IV">Installing NWNX</a></td>
</tr>
</table>
<a name="I"></a>
<h3>I. Introduction to NWNX</h3>
<p>The Neverwinter Nights Extender (NWNX) is a program that has the power to
push the limits on what you can do with NWN and its integrated script language.
<p>While NWN and the toolkit are complex and powerful tools, we at Avlis often
felt that some things are just too limited, in order to successfully run a large
persistent world. The first incarnation of NWNX brought the community realtime
database access over ODBC, giving advanced scripters access to every conceivable
DB they might want to use. During the time since the first release in February
2003, I tried out various new ideas like linking servervaults with the help of
NWNX, creating advanced data structures like hashmaps and linked lists, and played
around with some debugging and profiling code.
<p>NWNX actually consists of two parts: The executable, which displays the NWNX
window and runs the process and gamespy watchdogs, and a dynamically linked
library (DLL in the Windows version, .so in the linux version), which runs
inside the NWN server.
<p>In order to establish communication between scripts and the outside world,
NWNX intercepts calls to the NWScript function SetLocalString() and examines the
variable name that is passed to this function. If it begins with the string
"NWNX!", NWNX parses the request and stores any resulting data into the value of
that variable, which in turn can be read by a script with GetLocalString().
Easy, huh ?
<p>After NWNX2 has loaded the server and rotated the log files, it takes over
responsibility for restarting the server should it crash. It does not depend on
a specific version of the server (1.65 as of this writing) and thus should work
with upcoming releases, too. The current version supports all known versions of
Microsoft Windows.
<p><b>Licence</b><br> NWNX is distributed unter the terms of the GNU
GENERAL PUBLIC LICENSE included in <a href="licence.txt">licence.txt</a>. NWNX
uses Mathias Rauen's excellent library <a
href="http://www.madshi.net">"madCHook"</a> which is licensed under the
terms included in <a href="licence.txt">licence.txt</a>
<a name="II"></a>
<h3>II. NWNX plugins</h3>
<p>NWNX plugins are a new concept introduced in version 2.5. Because it soon became
apparent that the wide variety of possible uses for NWNX would lead to bloated
and unreadable code, if all that functionality would be in a single library,
Avlis team member Jeroen created a "plugin framework" around the original NWNX.
Every NWNX plugin is contained in a single library (DLL), which name begins with
"nwnx_", e.g. "nwnx_odbc.dll" for the ODBC interface.
<p>One of the advantages of this approach is that you can choose which
functionality you want to have available, and then just make use of a subset of
the existing plugins. Say for example, you want to have database connectivity
and a linked list implementation. Then you would just copy the two files
"nwnx_odbc.dll" and "nwnx_llist.dll" into your NWN directory. NWNX dynamically
loads these plugins on startup, enabling the functionality contained in these
plugins.
<p>Another important advantage is that now third party developers can easily
extend NWNX with their own ideas and make their plugin available to others in a
unified way. So instead of having many different, incompatible versions of NWNX
floating around, you always have one NWN executable, one NWN main library, and
as many NWNX plugins as you like.
<p>Starting with version 2.5.4, the plugins are available as <i>separate downloads</i>
and no longer included in the main distribution package. This will make it
easier for us and our users to stay up to date with the latest releases of NWNX
and the various plugins.
<a name="III"></a>
<h3>III. Available plugins</h3>
<p>To give an overview of what is possible with NWNX, we list of some of the
available plugins here. Get the latest versions of those plugins on <a
href="http://www.nwnx.org"> nwnx.org</a>. The plugins come complete with
documentation and a small demo module that demonstrates their usage.
<h4>A. ODBC </h4>
<p>The historically most important plugin is the ODBC interface for Neverwinter
Nights. Not so long ago, there wasn't any realtime database solution for NWN,
when the Avlis team released the first version of NWNX, which suddenly opened a
whole new world for owners of persistent worlds. This plugin and the accompanying
APS (Avlis Persistence System) script is what made NWNX known in the community.
<h4>B. PROFILER </h4>
<p>The "Profiler" is a NWNX plugin that spits out statistics about running scripts.
It shows how often a script has been called, how much time it took to complete,
and gives some overall statistics. It also shows how much time CPU NPCs need for
pathfinding.
<h4>C. HASHSET </h4>
<p>This plugin implements an advanced data structure, combining a hashmap and a
set. This means you can set up associations between key - value pairs (hashmap),
and also cycle through all stored data (set). You can even use this like an
array, although it has much more to offer than just that.
<h4>D. FUNCTIONS </h4>
<p>This is an experimental plugin that gives access to some new functions to use
with items. It's main purpose is to demonstrate how to modify the server's
memory in order to change various properties on items.
<h4>E. TIME </h4>
<p>This plugin implements a simple, yet highly accurate timer. Perfect for
knowing how long your functions really take to execute.
<a name="IV"></a>
<h3>IV. Installing NWNX</h3>
<p>NWNX2 has been extensively tested on MS Windows 2000 and XP. Windows 9x has
also been tested and we encountered no problems with NWNX2.
<p>Installing NWNX2 is super easy. Download the file and unzip it. Take the
files "NWNX2.exe", "NWNX.INI", "nwnx-module.dll", and "madCHook.dll" and place
them in the directory where your NWN installation resides (usually
C:\Neverwinternights\NWN). Done! If you want to change the default configuration
parameters of NWNX, edit the section [NWNX] in NWNX.INI accordingly.
<p>If you have a previous version of NWNX installed, remove the files
nwnx.dll and madCodeHookLib.dll.
<p><b>Now copy the NWNX plugins you want to use into the NWN directory.</b>
<a name="V"></a>
<h3>V. Running NWNX</h3>
<p>Go to the directory where you installed Neverwinter Nights and double-click
on "NWNX2.exe". You will see the small window of NWNX2 and shortly after that
the NWN server starts. The NWNX2 window contains some statistics and checkboxes
that control the watchdogs, i.e. the functionality which restarts the server
after a crash. (you need to add the "-module" option so NWNX2 knows what module
it should load after a crash). If you don't need the watchdogs, simply close
NWNX2 after it started the server.
<p>Right before NWNX2 loads the server, it rotates it's own and the server's log files. You
will find directories named "1"..."9" below your "logs.0" directory. The
directory "1" always contains the newest logs, and "9" contains the oldest logs.
All log files older than those in "9" are deleted to preserve disk space.
<p>All activity is logged to a file called "nwnx.txt". This file is created
in your "logs.0" (or .1, .2, etc.) directory and looks like this:
<pre>
NWN Extender V.2.6.1.0
(c) 2004 by Ingmar Stieger (Papillon) and Jeroen Broekhuizen
visit us at http://www.nwnx.org
* Loading plugins...
* Plugin functions is loaded.
* Plugin odbc is loaded.
* NWNX2 activated.
</pre>
<p>The NWN Extender will make sure your server is restarted should the module
crash. You can specify any commandline options Bioware's dedicated server
understands, e.g. you can automatically load a module on startup (or restart
after a crash) with: "NWNX2.exe" -module MODULENAME,
<h4>NWNX command line options</h4>
These options are understood by NWNX2. All other (i.e. unknown to NWNX2) options
are passed to the server. <br>
Example command line:
<pre>
C:\Neverwinter Nights\NWN\NWNX2.EXE -module "My Module" -publicserver 1 -gamespywatchdog 1
</pre>
<table border=1 cellpadding="5" width="80%">
<tr>
<th>Option</th>
<th>Default value</th>
<th>Description</th>
<th>Example</th>
</tr>
<tr>
<td> <nobr>-processwatchdog [0|1]</td>
<td> <center>1 </td>
<td> Set to 0 to disable the process type of watchdog, 1 to enable it.</td>
<td> <nobr>-processwatchdog 1</td>
</tr>
<tr>
<td> <nobr>-processinterval 1..n </td>
<td> <center>5 </td>
<td> In seconds. How often the process watchdog will check if the NWNights server process is still there.</td>
<td> <nobr>-processinterval 7</td>
</tr>
<tr>
<td> <nobr>-gamespywatchdog [0|1]</td>
<td> <center>0 </td>
<td> Set to 0 to disable the gamespy type of watchdog, 1 to enable it.</td>
<td> <nobr>-gamespywatchdog 1</td>
</tr>
<tr>
<td> <nobr>-gamespyinterval 1..n</td>
<td> <center>20 </td>
<td> In seconds. How often the gamespy watchdog will check if the NWNights server process is still there and still responding to clients.</td>
<td> <nobr>-gamespyinterval 60</td>
</tr>
<tr>
<td> <nobr>-gamespyretries 1..n</td>
<td> <center>5 </td>
<td> How many chances the gamespy watchdog will give the server to answer. If it got no answer after this many tries, the server process is killed and restarted. </td>
<td> <nobr>-gamespyretries 3</td>
</tr>
<tr>
<td> <nobr>-oldgamespyprotocol [0|1]</td>
<td> <center>0 </td>
<td> Set to 1 if you have a pre 1.32 server and make use of the gamespy watchdog.</td>
<td> <nobr>-oldgamespyprotocol 1</td>
</tr>
<tr>
<td> <nobr>-restartdelay 1..n</td>
<td> <center>5 </td>
<td> In seconds. How long NWNX will wait before it restarts the server.</td>
<td> <nobr>-restartdelay 5</td>
</tr>
</table>
<h4>NWNX.INI file</h4>
In adddition to the command line options, you can also set configuration
parameters in the [NWNX] section of the NWNX.INI file, which should be in the
same directory as NWNX2.EXE is. The following parameters are understood by the
main program:
<pre>
ServerPort = 5121
ModuleName = "aps_demo"
WatchdogProcess = yes
UpdateIntervalProcess = 5
WatchdogGamespy = no
UpdateIntervalGamespy = 20
GamespyRetries = 5
OldGamespyProtocol = no
RestartDelay = 5
</pre>
(the values shown here are the default values).
<p>These values can be overriden by command line parameters, so you could put
most of your default options into the INI file, and specify special options
(e.g. -port) on the command line.
<a name="VI"></a>
<h3>VI. FAQ & Troubleshooting </h3>
<p><b>Q. What is NWNX?</b><br>
A. NWNX2 is a program that loads the NWN server and injects the functionality
contained in the various NWNX plugins into the server. Setting special string
variables using NWScript triggers the NWNX requests. The resulting data can
be read with the usual string functions.
<p><b>Q.What are the system Requirements for NWNX?</b><br>
A. NWNX currently works with all Windows operating systems. If your system
processor can handle running Neverwinter Nights, it can more than handle NWNX.
<p><b>Q. Will there be a LINUX port?</b><br>
A. We have a version of NWNX2 for Linux available. Refer to
<a href="http://sourceforge.net/projects/apsnwnx/"> our sourceforge page</a>.
<p><b>Q. Since NWNX is running the server as a child process, does the parent also have crash monitoring so it can
auto-reboot the server if it crashes?</b><br>
A. If the child process crashes or becomes unresponsive to network traffic, NWNX will reboot it.
<p><b>Q. Will I still be able to start my server up with firedaemon(or any other server crash utility)?</b><br>
A. NWNX will restart the server if needed. Firedaemon may possibly be able to restart NWNX instead of
the server, but we have not looked into this at all.
<p><b>Q. Any chance the source code will be open sourced?</b><br>
A. Shortly after the initial release, the complete source code was released as part of the distribution of APS/NWNX2.
</body>
</html>

View File

@@ -1,108 +0,0 @@
Changelog for APS/NWNX
NWNX Core 2.7-beta4
Changelog:
2.7-beta4 (07.05.2008)
- [Linux/Win32] Fixed compatibility problems with Hashset plugin
2.7-beta3 (28.01.2008)
---
- [Linux] Fixed a bug in CNWNXBase::Log function.
2.7-beta2 (15.04.2007)
- [Linux/Win32] Added dynamic allocation for results (= no more need for spacers)
- [Linux] Improved the INI parser
- [Win32] Added debuglevel, confKey variables to NWNXBase (the main plugin class)
- [Linux/Win32] Added OBJECT_INVALID constant
2.7-beta1 (10.03.2007)
- [Linux/Win32] Hooked GetLocalObject, added OnRequestObject to NWNXBase
Previous Version Notes
* 14.01.2005: v.2.6.1
- Added RestartDelay parameter
* 11.01.2005: v.2.6.0
- Added INI File support to main program and plugins
* 07.12.2004: v2.5.4
- Split NWNX main program and plugins into separately downloadable packages
- Upgrade to MadCodeHookLib version 2.1a
- NWNX module loading stage won't be aborted if a module fails to load
* 31.12.2003: v2.5.3
- NWNX_PROFILER: The timeing measurement should be more accurate now. (v1.2)
- NWNX_PROFILER: Updated for NWN 1.61, now hooking a single function in the server instead of two
- NWNX_FUNCTIONS: SetStolenFlag_() removed, since it is now a standard function
- APS: Changed names of location and vector functions in aps_include to avoid duplicate function names
- NWNX: Fixed a rare crash bug (%-signs in query strings)
- NWNX: Fixed a bug where NWNX would crash with huge query strings (>1024 bytes)
- NWNX_HASHSET: New module that offers an advanced data structure (v1.0)
* 16.10.2003: v2.5.2
- NWNX_PROFILER: Now logs even nested scripts and got some performance optimizations (v1.1)
- NWNX_PROFILER: Functions called directly with DelayCommand() are now logged too (v1.1)
* 29.09.2003: v2.5.1
- NWNX2: Updated gamespy watchdog to work with NWN version 1.32
- NWNX2: New command line switch -oldgamespyprotocol for pre-1.32 servers
- NWNX2: Fixed command line switch -gamespyretries which actually did not work
* 12.09.2003: v2.5.0.1
- NWNX2: Fixed a small problem that might prevent NWNX from restarting the server
* 05.09.2003: v2.5
- NWNX2: Introduced new design by Jeroen: NWNX plugins
- NWNX2: Fixed a problem where server name was not set correctly
- NWNX2: Fixed unusual handling of quotation marks in the command line
- NWNX_FUNCTIONS: New module that offers some new functions for NWScript (v0.1)
- NWNX_PROFILER: New module that helps profiling scripts (v1.0)
- Released v2.5 to the public
* 18.06.2003: v2.03
- NWNX2: Added NWNX specific command line options
- NWNX2: New watchdog type "Gamespy"
* 16.03.2003: v2.02
- NWNX2: Source code released, as usual licensed under the GPL
* 04.03.2003: v2.01
- Fixed a potential crash in NWNX2
* 01.03.2003: v2.00
- First release of NWNX2
- Updated APS to support new functionality of NWNX2
* 17.02.2003: v1.23
- NWNX: licensed under the GPL, source code is included now.
- NWNX: NWNX can attach to the nwnserver instead of starting it in debug mode
* 07.02.2003: v1.22
- APS: Fixed SetPersistentString (quotes around expiration parameter removed)
- NWNX: Added some statistics (counters for requests and sql errors)
- NWNX: SQL error messages are printed on the NWNX console now
- NWNX: Added support for italian version of NWN
- NWNX: Code cleanup
* 04.02.2003: v1.21
- Added code to APS and NWNX that prevents potential startup problems
- Fixed a problem in NWNX that may cause problems after a server crashed
* 31.01.2003: v1.12
- Fixed a potential problem in the Extender that may cause problems after the
server crashed
* 30.01.2003: v1.11
- Added MySQL create table statement to persistent container demo
- Modified MySQL create table statement in aps_demo slightly (column expire)
- Made some minor modifications to the documentation
* 29.01.2003: v1.1
- APS: Fixed SetPersistent* iExpiration parameter to default 0
- NWNX: Added support for non-english languages (Spanish, German, French)
- Made some minor modifications to the documentation
* 28.01.2003: v1.0
- initial release

View File

@@ -1,216 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>PRC Server Pack 1.8.3</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
</head>
<body>
<h1>PRC Server Pack Install</h1>
<p>The server pack contains many useful utilities for running a server with the PRC. It is available as a Windows installer or a rar archive for manual installation. This covers manually installing the server pack and what to do with the components. While it is designed for a server running on Windows, the server pack is still useful for Linux servers because it contains the precacher.</p>
<p>The current version of the server pack is 1.8.3.</p>
<!--more-->
<h2>Why Do a Manual Install?</h2>
<ul>
<li>The Windows installer only works on a PC running Windows and that has NWN installed, so is no use for:
<ul>
<li>Other operating systems</li>
<li>PCs without NWN installed</li>
<li>The standalone server (it looks for registry entries the server doesn't create)</li>
</ul>
</li>
<li>It includes utilities you either don't need or use already</li>
<li>It makes its own registry entries</li>
</ul>
<h2>Installing the Server Pack - File List</h2>
<p>If you have a previous version of the server pack, uninstall that first. Download and unpack the rar file. It should contain the following:
<ul>
<li>NWNX 2.6.1</li>
<li>NWNX core 2.7-beta4</li>
<li>NWNX-ODBC 0.9.2.5</li>
<li>NWNX-Letoscript 03+build 24</li>
<li>NWNX-Profiler 1.62</li>
<li>SQLite 3.7.10</li>
<li>Precacher (prc.jar, erf.exe, batch files to run it)</li>
<li>documentation</li>
</ul>
</p>
<h2>Installing the Server Pack - NWNx</h2>
<p>The server pack contains NWNx, various NWNx plugins and the NWNx documentation. Further information and the Linux binaries can be found on the <a href="http://www.nwnx.org" title="NWNx">NWNx site</a>. To install the NWNx core, put the following files in your NWN directory:
<ul>
<li>nwnx2.exe</li>
<li>nwnx.ini</li>
<li>madCHook.dll</li>
<li>nwnx-module.dll</li>
</ul>
</p>
<p>That's it - installed. Look at nwnx.ini to configure it. The default .ini is usually fine, all you need to do is add the name of the module to load in the right place <strong>leaving out the .mod extension</strong> eg. <br />
<code>Module = "MyModule"</code></p>
<p>The most common NWNx plugins are included in the server pack. While they are optional, the Conversation Character Creator <em>requires</em> the ODBC (database) and Letoscript plugins to work. </p>
<h3>ODBC Plugin (nwnx_odbc.dll)</h3>
<p>This provides the database connectivity. The <a href="http://www.nwnx.org/index.php?id=doc_odbc2" title="nwnx odbc plugin docs">online documentation</a> for the plugin covers pretty much everything. There's a copy of it in the server pack (nwnx_odbc2.html). The PRC scripts include the APS functions in inc_2dacache.nss and the initialisation function is already in the PRC's module load event script. Therefore there is no need to import the APS erf.</p>
<p>To use MySQL with the ODBC plugin, you need to download it from the <a href="http://dev.mysql.com/downloads/mysql/5.1.html#downloads" title="MySQL downloads page">MySQL website</a>. Follow their install instructions. If using their Windows installer, the defaults are generally ok, but check the option to add mySQL to the PATH variable. You'll only have to add it later otherwise. Also see Appendix A: Creating a NWN user and database.</p>
<h3>LetoScript Plugin (LetoScript.dll, nwnx_leto.dll)</h3>
<p>The server pack comes with LetoScript version 3+24, which uses the Unicorn syntax. For the LetoScript functions to work, the server needs to be using servervault characters - strangely enough Letoscript can't edit files on a remote computer. Also be aware that LetoScript works out the bic filename by using the first 16 characters of the PC's first name + last name.</p>
<h3>Profiler Plugin (nwnx_profiler.dll)</h3>
<p>The plugin profiles running scripts, logging how often a script has been called and how much time it took to complete. The <a href="http://www.nwnx.org/index.php?id=doc_profiler" title="nwnx profiler plugin docs">online documentation</a> explains how it can be used. There's also a copy of it in the server pack (nwnx_profiler.html). It's not required for any PRC functions, but it's very useful.</p>
<h2>Installing the Server Pack - The Precacher</h2>
<h3>Why Bother?</h3>
<p>Using the NWNx database as the 2da cache is <em>required</em> for the Conversation Character Creator to work.</p>
<p>In a single player game, the PRC scripts read 2da data from the Bioware database (that's what the PRC_DATA.xxx files are for). For the Conversation Character Creator, the Bioware one isn't really fast enough, so the 2das for character creation are stored in the database used by NWNx. The precacher reads the PRC and some Bioware 2das into the database as doing this while playing causes the game to become unresponsive.</p>
<h3>Running the precacher on Windows</h3>
<p>First, install the PRC, then put the following files in the main NWN install directory:
<ul>
<li>7za.exe</li>
<li>erf.exe</li>
<li>bioware2das.7z</li>
<li>prc.jar (the precacher)</li>
<li>Either precacher sqlite prc.bat or precacher mysql.bat, depending on which database you are using with NWNx</li>
<li>sqlite.exe if using sqlite</li>
</ul>
<p>Double click on the appropriate batch file (precacher sqlite prc.bat for sqlite, precacher mysql.bat for mySQL).</p>
<h3>Running the precacher on Linux</h3>
<p>First, in the directory where you extracted prc.jar, create a directory called precacher2das. Add the following files to the precacher2das directory:
<ul>
<li>extract Bioware 2da files from bioware2das.7z</li>
<li>extract the 2da files from prc_2das.hak and prc_race.hak, overwriting any duplicates</li>
</ul>
<p>Using the command line, go to the directory prc.jar is in and enter: <code>java -Xmx100m -jar prc.jar 2datosql precacher2das MySQL</code></p>
<p>Note: this method will also work for Windows if you don't want to use the batch file.</p>
<h3>Note for modules using custom content</h3>
<p>If you are using custom content that modifies 2das used by the conversation character creator, then those 2das will need to be used by the precacher. If the default ones are used, the custom content will not show up in the ConvoCC (e.g. to get custom appearances to show up as options, you would need to precache using your custom appearance.2da instead of the default Bioware one).</p>
<p>The convoCC uses the following 2das:
<ul>
<li>appearance.2da</li>
<li>classes.2da</li>
<li>cls_atk_*.2da</li>
<li>cls_bfeat_*.2da</li>
<li>cls_feat_*.2da</li>
<li>cls_pres_*.2da</li>
<li>cls_savthr_*.2da</li>
<li>cls_skill_*.2da</li>
<li>cls_spgn_*.2da</li>
<li>cls_spkn_*.2da</li>
<li>colours.2da (for the palette colour names)</li>
<li>domains.2da</li>
<li>feat.2da</li>
<li>hen_companion.2da</li>
<li>hen_familiar.2da</li>
<li>portraits.2da</li>
<li>racialappearance.2da (optional, used to restrict appearance choices in the convocc)</li>
<li>racialtypes.2da</li>
<li>race_feat_*.2da</li>
<li>skills.2da</li>
<li>soundset.2da</li>
<li>spells.2da</li>
<li>tailmodel.2da</li>
<li>wingmodel.2da</li>
</ul>
</p>
<h2>Installing the Server Pack - Making the 2DA Cache Database</h2>
<h3>Using sqlite</h3>
<p>After the precacher has finished, a file called sqlite.db will have been created. This is the database and it just needs moving to the NWN install directory on the server.</p>
<h3>Using mySQL</h3>
<p>This assumes mySQL is in the PATH for Windows. The precacher creates a file called out.sql, which needs moving to the server where the mySQL database is going to be created.</p>
<ol>
<li>open a command prompt</li>
<li>go to the directory you put out.sql in</li>
<li>type: <code>mysql -u user -p databasename &lt; out.sql &gt; out.log</code> (replace the user and databasename with whatever it should be)</li>
<li>enter the password when prompted</li>
</ol>
<p>For Linux, the command line is:<br />
<code>cat out.sql| mysql -u user -p databasename</code></p>
<p>There are several arguments that mysql takes, eg -u username and user=username are equivalent, see the <a href="http://dev.mysql.com/doc/refman/5.1/en/mysql-command-options.html" title="MySQL 5.1 Reference Manual :: 8.6.1 mysql Options">MySQL manual</a>.</p>
<p>The log file will be empty, but it stops mySQL echoing a confirmation after every line of the sql file (it has a lot of lines) and it stops if it encounters an error.</p>
<p>Note: the Linux version of NWNx only has MySQL support, also there is no Linux version of sqlite.</p>
<h2>That's It</h2>
<p>Suggestions please, particularly if something's missing or incorrect.</p>
<h3>Except for the mini FAQ</h3>
<p>Q1. I don't know how to run an installer/open a command prompt/change directory etc. Why didn't you include that in the instructions?</p>
<p>A. If the instructions covered every detail, they would be huge. Try the NWNx and MySQL documentation or the PRC forums to get help for anything not covered here.</p>
<h2>Appendix A: Creating a NWN user and database</h2>
<p>To use the NWNx database plugin with MySQL, you need to create:
<ul>
<li>a user for the NWN server/NWNx to access the database with</li>
<li>a database</li>
</ul></p>
<p>There is an example setup file (newMySQLinstall.sql) to to this for you. It will create a database and a user that has rights
to read and modify that database. You should edit the file to change the example password to something sensible ("password" is not a
sensible password!). The username and database name are fine to be left as is for most setups.</p>
<p>To get the MySQL server to read newMySQLinstall.sql file, you should do the following:
<ol>
<li>open a command prompt</li>
<li>go to the directory you put newMySQLinstall.sql in</li>
<li>type: <code>mysql -u root -p &lt; newMySQLinstall.sql</code></li>
<li>enter the password when prompted</li>
</ol>
</p>
<p>You usually need to log in as root to create a user and a database. On Windows, you need to add MySQL's bin directory to the PATH variable unless you did that already.</p>
<h2>Credits</h2>
<p>The ODBC and profiler plugins are from <a href="http://www.nwnx.org/index.php?id=nwnx2" title="plugin download page">nwnx.org</a> and virusman's site (see <a href="http://www.nwnx.org/phpBB2/viewtopic.php?t=1141" title="Windows NWNX2 Plugins list">this NWNx forum thread</a>)
, the LetoScript plugin from <a href="http://sourceforge.net/projects/leto/">Project Leto's sourceforge site</a>. SQLite is avaliable from <a href="www.sqlite.org">www.sqlite.org</a>. The Precacher is based on a version made for the PRC by Yuritch, but rewritten into java by the PRC.</p>
</body>
</html>

View File

@@ -1,39 +0,0 @@
PRC Server Pack v1.8
This is an server package for the PRC, avalibale in self-install and manual-install editions. This should only be installed after the main PRC packages. To make full use of this you should be using PRC 3.2 or higher.
More detailed install information in server_pack_install.html, mostly useful if doing a manual install.
This package includes:
NWNX 2.6.1
NWNX-core 2.7-beta4 (this is the dll)
NWNX-ODBC 0.9.2.5
NWNX-Letoscript 03+build 24
NWNX-Profiler 1.62
SQLite 3.7.10
Precacher part of prc.jar
You do not need to download anything else, but for reference:
NWNX is avaliable from www.nwnx.org.
NWNX core, NWNX profiler and NWNX-ODBC are available from Virusman's site (see http://www.nwnx.org/phpBB2/viewtopic.php?t=1141)
NWNX-Letoscript is avaliable from http://sourceforge.net/projects/leto
Source code for NWNX and its plugins is available from the above sites.
SQLite is avaliable from www.sqlite.org.
The Precacher is based on a version made for the PRC by Yuritch, but rewritten into java by the PRC. As a .jar file its source code and the source code for sqlite are included in the .jar.
For full instructions, see the PRC Web site http://www.nwn2prc.com/index.php?location=manual . In particular see the PRC Server Pack installation instructions (PRC_ServerPack_Install.html) and http://www.nwn2prc.com/index.php?location=manual&lang=en&section=installation&page=prc_server_pg01 (these are a little out of date but may be useful).
Changelog
v1.8.3 Updated Changelog files. Updated PRC.JAR precacher file to be compatible with latest version of SQLite; Provided latest versions of sqlite.exe and nwnx-odbc.dll. Updated batch scripting and installation files.
v1.8 Removed NWNX-InvFixpl as no longer needed. Removed linux nwnx as there's now a precompiled binary (see http://www.nwnx.org/phpBB2/viewtopic.php?t=1038).
v1.7 Installation instructions added, plus precacher is now much faster
v1.6 Removed a few unneeded bioware 2das, updated rest to NWN 1.68, added NWNx for Linux to the manual-install version
v1.3 New version to go with PRC 3.0c & NWN 1.67
v1.2 Replaced Yuriched precacher with a java version
Removed many bioware 2das because they arent needed and dont meet biowares specifications
v1.1 Fixed issue with incorect version of SQLite
Added SSed step to filter output from precacher to be SQLite compatible
Added bioware 2das to the cacher
Added override\directory.2da creation
v1.0 Initial Release

View File

@@ -1,37 +0,0 @@
rd /s /q precacher2das
mkdir precacher2das
7za x bioware2das.7z -oprecacher2das
erf -x hak\prc_2das.hak
erf -x hak\prc_race.hak
copy cls_feat*.2da precacher2das\*.2da
copy cls_skill*.2da precacher2das\*.2da
copy race_feat*.2da precacher2das\*.2da
copy spells.2da precacher2das\*.2da
copy racialappear.2da precacher2das\*.2da
copy racialtypes.2da precacher2das\*.2da
copy classes.2da precacher2das\*.2da
copy feat.2da precacher2das\*.2da
copy domains.2da precacher2das\*.2da
copy appearance.2da precacher2das\*.2da
copy portraits.2da precacher2das\*.2da
copy soundset.2da precacher2das\*.2da
copy wingmodel.2da precacher2das\*.2da
copy tailmodel.2da precacher2das\*.2da
copy gender.2da precacher2das\*.2da
copy hen_companion.2da precacher2das\*.2da
copy hen_familiar.2da precacher2das\*.2da
copy custom2das\*.2da precacher2das\*.2da
del *.2da
del *.nss
del *.ncs
java -Xmx100m -jar prc.jar 2datosql precacher2das MySQL
rd /s /q precacher2das
@pause
rem del 7za.exe
rem del erf.exe
rem del bioware2das.7z
rem del prc.jar
rem del sqlite.exe
rem del Precacher_SQLite.bat
rem del Precacher_MySQL.bat

View File

@@ -1,31 +0,0 @@
rd /s /q precacher2das
mkdir precacher2das
7za x bioware2das.7z -oprecacher2das
erf -x hak\prc_2das.hak
erf -x hak\prc_race.hak
copy cls_feat*.2da precacher2das\*.2da
copy cls_skill*.2da precacher2das\*.2da
copy race_feat*.2da precacher2das\*.2da
copy spells.2da precacher2das\*.2da
copy racialappear.2da precacher2das\*.2da
copy racialtypes.2da precacher2das\*.2da
copy classes.2da precacher2das\*.2da
copy feat.2da precacher2das\*.2da
copy domains.2da precacher2das\*.2da
copy appearance.2da precacher2das\*.2da
copy portraits.2da precacher2das\*.2da
copy soundset.2da precacher2das\*.2da
copy wingmodel.2da precacher2das\*.2da
copy tailmodel.2da precacher2das\*.2da
copy gender.2da precacher2das\*.2da
copy hen_companion.2da precacher2das\*.2da
copy hen_familiar.2da precacher2das\*.2da
copy custom2das\*.2da precacher2das\*.2da
del *.2da
del *.nss
del *.ncs
java -Xmx100m -jar prc.jar 2datosql precacher2das sqlite
sqlite sqlite.db ".read out.sql"
del out.sql
rd /s /q precacher2das
@pause

View File

@@ -1,265 +0,0 @@
; Script generated with the Venis Install Wizard
!ifndef PRCSPVERSION
!define PRCSPVERSION "183"
!endif
!ifndef PRCSPINSTALLVERSION
!define PRCSPINSTALLVERSION "1.8.3"
!endif
; Define your application name
!define APPNAME "PRC Server Pack"
!define APPNAMEANDVERSION "PRC Server Pack ${PRCSPINSTALLVERSION}"
; Enable LZMA compression for the smallest EXE.
SetCompressor lzma
; Main Install settings
Name "${APPNAMEANDVERSION}"
InstallDir "$PROGRAMFILES\PRC Server Pack"
InstallDirRegKey HKLM "Software\${APPNAME}" ""
OutFile "Setup PRC Server ${PRCSPINSTALLVERSION}.exe"
Var NWNVERSION
Var NWNPATH
Var NWNPRCPATH
Var NWNMINVERSION
; Modern interface settings
!include "MUI.nsh"
!define MUI_ABORTWARNING
!define MUI_FINISHPAGE_TEXT "The PRC Server Pack is now installed. You can now run NWNX2 to start a server."
!define MUI_WELCOMEPAGE_TEXT "The PRC Server Pack will now be installed into your installation of Neverwinter Nights.\r\n\r\n\r\nNeverwinter Nights version $NWNVERSION is currently installed at $NWNPATH."
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES
; Set languages (first is default language)
!insertmacro MUI_LANGUAGE "English"
!insertmacro MUI_RESERVEFILE_LANGDLL
Section "PRC Pack" Section1
; Set Section properties
SetOverwrite on
; Set Section Files and Shortcuts
SetOutPath "$NWNPATH\"
File "LetoScript.dll"
File "licence.txt"
File "madCHook.dll"
File "NWNX.ini"
File "NWNX2.exe"
File "NWNX2.html"
File "NWNX2_Changelog.txt"
File "nwnx_core_readme.txt"
File "nwnx_funcs.dll"
File "nwnx_funcs_readme.txt"
File "nwnx_leto.dll"
File "nwnx_odbc2.html"
File "nwnx_odbc.dll"
File "nwnx_odbc2_changelog.txt"
File "nwnx-module.dll"
File "nwnx_profiler.dll"
File "nwnx_profiler.html"
File "PRC_ServerPack_Install.html"
File "PRC_ServerPack_ReadMe.txt"
;Precacher specifics
File "Precacher_SQLite.bat"
File "Precacher_MySQL.bat"
File "sqlite.exe"
File "7za.exe"
File "bioware2das.7z"
File "..\prc.jar"
File "newMySQLinstall.sql"
;erf for manipulating hak/erf erc
File "..\erf.exe"
CreateShortCut "$DESKTOP\NWNX2.lnk" "$NWNPATH\NWNX2.exe"
CreateDirectory "$SMPROGRAMS\PRC Pack"
CreateShortCut "$SMPROGRAMS\PRC Pack\NWNX2.lnk" "$NWNPATH\NWNX2.exe"
CreateShortCut "$SMPROGRAMS\PRC Pack\Server Uninstall.lnk" "$NWNPRCPATH\PRCPack\Server Uninstall.exe"
; Now try to output the dir to a 2da file
FileOpen $0 $NWNPATH\override\directory.2da w
FileWrite $0 "2DA V2.0$\n"
FileWrite $0 "$\n"
FileWrite $0 " Dir$\n"
FileWrite $0 "0 $\"$NWNPATH$\"$\n"
FileClose $0
SectionEnd
Section -FinishSection
WriteRegStr HKLM "Software\${APPNAME}" "" "$NWNPRCPATH\PRCPack"
WriteRegStr HKLM "Software\${APPNAME}" "PRCPath" "$NWNPRCPATH"
WriteRegStr HKLM "Software\${APPNAME}" "NWNPath" "$NWNPATH"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "DisplayName" "${APPNAME}"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "UninstallString" "$NWNPRCPATH\PRCPack\Server Uninstall.exe"
WriteUninstaller "$NWNPRCPATH\PRCPack\Server Uninstall.exe"
SectionEnd
; Modern install component descriptions
!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
!insertmacro MUI_DESCRIPTION_TEXT ${Section1} ""
!insertmacro MUI_FUNCTION_DESCRIPTION_END
;Uninstall section
Section Uninstall
; Read the install paths from the registry. Then delete them.
ReadRegStr $NWNPRCPATH HKLM "Software\${APPNAME}" "PRCPath"
ReadRegStr $NWNPATH HKLM "Software\${APPNAME}" "NWNPath"
;Remove from registry...
DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}"
DeleteRegKey HKLM "SOFTWARE\${APPNAME}"
; Delete self
Delete "$NWNPRCPATH\PRCPack\Server Uninstall.exe"
; Delete Shortcuts
Delete "$SMPROGRAMS\PRC Pack\NWNX2.lnk.lnk"
Delete "$SMPROGRAMS\PRC Pack\Server Uninstall.lnk"
Delete "$DESKTOP\NWNX2.lnk"
; Clean up PRC Pack
Delete "$NWNPATH\LetoScript.dll"
Delete "$NWNPATH\licence.txt"
Delete "$NWNPATH\madCHook.dll"
Delete "$NWNPATH\NWNX2.exe"
Delete "$NWNPATH\NWNX2_Changelog.txt"
Delete "$NWNPATH\NWNX2.html"
Delete "$NWNPATH\NWNX.ini"
Delete "$NWNPATH\nwnx_core_readme.txt"
Delete "$NWNPATH\nwnx_funcs.dll"
Delete "$NWNPATH\nwnx_funcs_readme.txt"
Delete "$NWNPATH\nwnx_leto.dll"
Delete "$NWNPATH\nwnx_odbc2.html"
Delete "$NWNPATH\nwnx_odbc.dll"
Delete "$NWNPATH\nwnx-module.dll"
Delete "$NWNPATH\nwnx_odbc2_changelog.txt"
Delete "$NWNPATH\nwnx_profiler.dll"
Delete "$NWNPATH\nwnx_profiler.html"
Delete "$NWNPATH\PRC_ServerPack_Install.html"
Delete "$NWNPATH\PRC_ServerPack_ReadMe.txt"
;Precacher specifics
Delete "$NWNPATH\Precacher_SQLite.bat"
Delete "$NWNPATH\Precacher_MySQL.bat"
Delete "$NWNPATH\sqlite.exe"
Delete "$NWNPATH\7za.exe"
Delete "$NWNPATH\bioware2das.7z"
Delete "$NWNPATH\prc.jar"
Delete "newMySQLinstall.sql"
;erf for manipulating hak/erf erc
Delete "$NWNPATH\erf.exe"
; Remove remaining directories
RMDir "$SMPROGRAMS\PRC Pack"
RMDir "$NWNPRCPATH\PRCPack\"
SectionEnd
; This function loads the NWN installed version and path from the registry
; aborting the install if they are not there.
Function .onInit
; Minimum version of NWN that the installer requires, just set
; the string to the part after the 1., i.e. for 1.62 set the
; string to "62"
StrCpy $NWNMINVERSION "69"
; Read the NWN intall path and installed version from the registry. If we get any
; errors assume NWN is not installed correctly.
ReadRegStr $NWNVERSION HKEY_LOCAL_MACHINE "SOFTWARE\BioWare\NWN\Neverwinter" "Version"
ReadRegStr $NWNPATH HKEY_LOCAL_MACHINE "SOFTWARE\BioWare\NWN\Neverwinter" "Location"
IfErrors noNWN
; Validate that NWNMINVERSION or later of NWN is installed.
Push $0
StrCpy $0 $NWNVERSION 2 2
IntCmp $0 $NWNMINVERSION okNWN badNWN
Pop $0
okNWN:
; Validate that XP1 and XP2 are installed
Push $0
ClearErrors
ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\BioWare\NWN\Undrentide" "GUID"
IfErrors noXP
ClearErrors
ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\BioWare\NWN\Underdark" "GUID"
IfErrors noXP
Pop $0
; Get the parent directory of the $NWNPATH to use for the prc pack, since
; the NWN install path always has the nwn\ folder which contains the game,
; we want the PRC installer EXE and readme's to be parallel to that.
Push $NWNPATH
Call GetParent
Pop $NWNPRCPATH
Return
badNWN:
MessageBox MB_OK|MB_ICONEXCLAMATION "The PRC pack requires at least version 1.69 of NWN and HotU. You must upgrade NWN before installing the PRC pack."
Abort
noXP:
MessageBox MB_OK|MB_ICONEXCLAMATION "The PRC pack requires Shadows of Undrentide and Hordes of the Underdark to be installed. You must upgrade NWN before installing the PRC pack. If you installed the expansions by copying the files directly and did not install them using Bioware's setup applications, then you must reinstall using Bioware's setup applications."
Abort
noNWN:
MessageBox MB_OK|MB_ICONEXCLAMATION "Neverwinter Nights is not installed on your PC. The PRC pack cannot be installed until Neverwinter Nights is installed."
Abort
FunctionEnd
; GetParent
; input, top of stack (e.g. C:\Program Files\Poop)
; output, top of stack (replaces, with e.g. C:\Program Files)
; modifies no other variables.
;
; Usage:
; Push "C:\Program Files\Directory\Whatever"
; Call GetParent
; Pop $R0
; ; at this point $R0 will equal "C:\Program Files\Directory"
Function GetParent
Exch $R0
Push $R1
Push $R2
Push $R3
StrCpy $R1 0
StrLen $R2 $R0
loop:
IntOp $R1 $R1 + 1
IntCmp $R1 $R2 get 0 get
StrCpy $R3 $R0 1 -$R1
StrCmp $R3 "\" get
Goto loop
get:
StrCpy $R0 $R0 -$R1
Pop $R3
Pop $R2
Pop $R1
Exch $R0
FunctionEnd
; eof

View File

@@ -1,305 +0,0 @@
; Script generated with the Venis Install Wizard
!ifndef PRCVERSION
!define PRCVERSION ""
!endif
!ifndef PRCINSTALLVERSION
!define PRCINSTALLVERSION ""
!endif
; Define your application name
!define APPNAME "PRC Server Pack"
!define APPNAMEANDVERSION "PRC Server Pack ${PRCINSTALLVERSION}"
; Enable LZMA compression for the smallest EXE.
SetCompressor lzma
; Main Install settings
Name "${APPNAMEANDVERSION}"
InstallDir "$PROGRAMFILES\PRC Server Pack"
InstallDirRegKey HKLM "Software\${APPNAME}" ""
OutFile "Setup PRC Server ${PRCVERSION}.exe"
Var NWNVERSION
Var NWNPATH
Var NWNPRCPATH
Var NWNMINVERSION
; Modern interface settings
!include "MUI.nsh"
!define MUI_ABORTWARNING
!define MUI_FINISHPAGE_TEXT "The PRC Server Pack is now installed. You can now run NWNX2 to start a server."
!define MUI_WELCOMEPAGE_TEXT "The PRC Server Pack will now be installed into your installation of Neverwinter Nights.\r\n\r\n\r\nNeverwinter Nights version $NWNVERSION is currently installed at $NWNPATH."
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES
; Set languages (first is default language)
!insertmacro MUI_LANGUAGE "English"
!insertmacro MUI_RESERVEFILE_LANGDLL
Section "PRC Pack" Section1
; Set Section properties
SetOverwrite on
; Set Section Files and Shortcuts
SetOutPath "$NWNPATH\"
File "LetoScript.dll"
File "licence.txt"
File "madCHook.dll"
File "NWNX2.exe"
File "nwnx changelog.txt"
File "NWNX.html"
File "NWNX.ini"
File "nwnx_leto.dll"
File "nwnx_odbc2.html"
File "nwnx_odbc.dll"
File "nwnx-module.dll"
File "nwnxsrc.exe"
File "odbc2 changelog.txt"
File "odbc2src.exe"
File "erf.exe"
CreateShortCut "$DESKTOP\NWNX2.lnk" "$NWNPATH\NWNX2.exe"
CreateDirectory "$SMPROGRAMS\PRC Pack"
CreateShortCut "$SMPROGRAMS\PRC Pack\NWNX2.lnk" "$NWNPATH\NWNX2.exe"
CreateShortCut "$SMPROGRAMS\PRC Pack\Server Uninstall.lnk" "$NWNPRCPATH\PRCPack\Server Uninstall.exe"
; Now try to output the dir to a 2da file
FileOpen $0 $NWNPATH\override\directory.2da w
FileWrite $0 "2DA V2.0$\n"
FileWrite $0 "$\n"
FileWrite $0 " Dir$\n"
FileWrite $0 "0 $\"$NWNPATH$\"$\n"
FileClose $0
SectionEnd
Section -FinishSection
WriteRegStr HKLM "Software\${APPNAME}" "" "$NWNPRCPATH\PRCPack"
WriteRegStr HKLM "Software\${APPNAME}" "PRCPath" "$NWNPRCPATH"
WriteRegStr HKLM "Software\${APPNAME}" "NWNPath" "$NWNPATH"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "DisplayName" "${APPNAME}"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "UninstallString" "$NWNPRCPATH\PRCPack\Server Uninstall.exe"
WriteUninstaller "$NWNPRCPATH\PRCPack\Server Uninstall.exe"
SectionEnd
; Modern install component descriptions
!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
!insertmacro MUI_DESCRIPTION_TEXT ${Section1} ""
!insertmacro MUI_FUNCTION_DESCRIPTION_END
;Uninstall section
Section Uninstall
; Read the install paths from the registry. Then delete them.
ReadRegStr $NWNPRCPATH HKLM "Software\${APPNAME}" "PRCPath"
ReadRegStr $NWNPATH HKLM "Software\${APPNAME}" "NWNPath"
;Remove from registry...
DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}"
DeleteRegKey HKLM "SOFTWARE\${APPNAME}"
; Delete self
Delete "$NWNPRCPATH\PRCPack\Server Uninstall.exe"
; Delete Shortcuts
Delete "$SMPROGRAMS\PRC Pack\NWNX2.lnk.lnk"
Delete "$SMPROGRAMS\PRC Pack\Server Uninstall.lnk"
Delete "$DESKTOP\NWNX2.lnk"
; Clean up PRC Pack
Delete "$NWNPATH\LetoScript.dll"
Delete "$NWNPATH\licence.txt"
Delete "$NWNPATH\madCHook.dll"
Delete "$NWNPATH\NWNX2.exe"
Delete "$NWNPATH\nwnx changelog.txt"
Delete "$NWNPATH\NWNX.html"
Delete "$NWNPATH\NWNX.ini"
Delete "$NWNPATH\nwnx_leto.dll"
Delete "$NWNPATH\nwnx_odbc2.html"
Delete "$NWNPATH\nwnx.odbc.dll"
Delete "$NWNPATH\nwnx-module.dll"
Delete "$NWNPATH\nwnxsrc.exe"
Delete "$NWNPATH\odbc2 changelog.txt"
Delete "$NWNPATH\odbc2src.exe"
Delete "$NWNPATH\erf.exe"
Delete "$NWNPATH\Override\directory.2da"
; Remove remaining directories
RMDir "$SMPROGRAMS\PRC Pack"
RMDir "$NWNPRCPATH\PRCPack\"
SectionEnd
; This function loads the NWN installed version and path from the registry
; aborting the install if they are not there.
Function .onInit
; Minimum version of NWN that the installer requires, just set
; the string to the part after the 1., i.e. for 1.62 set the
; string to "62"
StrCpy $NWNMINVERSION "66"
; Read the NWN intall path and installed version from the registry. If we get any
; errors assume NWN is not installed correctly.
ReadRegStr $NWNVERSION HKEY_LOCAL_MACHINE "SOFTWARE\BioWare\NWN\Neverwinter" "Version"
ReadRegStr $NWNPATH HKEY_LOCAL_MACHINE "SOFTWARE\BioWare\NWN\Neverwinter" "Location"
IfErrors noNWN
; Validate that NWNMINVERSION or later of NWN is installed.
Push $0
StrCpy $0 $NWNVERSION 2 2
IntCmp $0 $NWNMINVERSION okNWN badNWN
Pop $0
okNWN:
; Validate that XP1 and XP2 are installed
Push $0
ClearErrors
ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\BioWare\NWN\Undrentide" "GUID"
IfErrors noXP
ClearErrors
ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\BioWare\NWN\Underdark" "GUID"
IfErrors noXP
Pop $0
; Get the parent directory of the $NWNPATH to use for the prc pack, since
; the NWN install path always has the nwn\ folder which contains the game,
; we want the PRC installer EXE and readme's to be parallel to that.
Push $NWNPATH
Call GetParent
Pop $NWNPRCPATH
; Make sure that 1.1 or later of the .NET framework is installed.
Call IsDotNETInstalled
Pop $0
StrCmp $0 1 foundNETFramework noNETFramework
foundNETFramework:
Return
noNETFramework:
MessageBox MB_OK|MB_ICONEXCLAMATION "The .NET Framework 1.1 is not installed on your PC. The PRC pack cannot be installed until the .NET Framwwork 1.1 is installed. Use Windows Update to install the .NET Framework 1.1 or later, or download it from the following web page."
ExecShell open "http://www.microsoft.com/downloads/details.aspx?FamilyID=262d25e3-f589-4842-8157-034d1e7cf3a3&DisplayLang=en"
Abort
badNWN:
MessageBox MB_OK|MB_ICONEXCLAMATION "The PRC pack requires at least version 1.66 of NWN and HotU. You must upgrade NWN before installing the PRC pack."
Abort
noXP:
MessageBox MB_OK|MB_ICONEXCLAMATION "The PRC pack requires Shadows of Undrentide and Hordes of the Underdark to be installed. You must upgrade NWN before installing the PRC pack. If you installed the expansions by copying the files directly and did not install them using Bioware's setup applications, then you must reinstall using Bioware's setup applications."
Abort
noNWN:
MessageBox MB_OK|MB_ICONEXCLAMATION "Neverwinter Nights is not installed on your PC. The PRC pack cannot be installed until Neverwinter Nights is installed."
Abort
FunctionEnd
; GetParent
; input, top of stack (e.g. C:\Program Files\Poop)
; output, top of stack (replaces, with e.g. C:\Program Files)
; modifies no other variables.
;
; Usage:
; Push "C:\Program Files\Directory\Whatever"
; Call GetParent
; Pop $R0
; ; at this point $R0 will equal "C:\Program Files\Directory"
Function GetParent
Exch $R0
Push $R1
Push $R2
Push $R3
StrCpy $R1 0
StrLen $R2 $R0
loop:
IntOp $R1 $R1 + 1
IntCmp $R1 $R2 get 0 get
StrCpy $R3 $R0 1 -$R1
StrCmp $R3 "\" get
Goto loop
get:
StrCpy $R0 $R0 -$R1
Pop $R3
Pop $R2
Pop $R1
Exch $R0
FunctionEnd
; IsDotNETInstalled
;
; Usage:
; Call IsDotNETInstalled
; Pop $0
; StrCmp $0 1 found.NETFramework no.NETFramework
Function IsDotNETInstalled
Push $0
Push $1
Push $2
Push $3
Push $4
ReadRegStr $4 HKEY_LOCAL_MACHINE \
"Software\Microsoft\.NETFramework" "InstallRoot"
# remove trailing back slash
Push $4
Exch $EXEDIR
Exch $EXEDIR
Pop $4
# if the root directory doesn't exist .NET is not installed
IfFileExists $4 0 noDotNET
StrCpy $0 0
EnumStart:
EnumRegKey $2 HKEY_LOCAL_MACHINE \
"Software\Microsoft\.NETFramework\Policy" $0
IntOp $0 $0 + 1
StrCmp $2 "" noDotNET
StrCmp $2 "v1.0" EnumStart
StrCpy $1 0
EnumPolicy:
EnumRegValue $3 HKEY_LOCAL_MACHINE \
"Software\Microsoft\.NETFramework\Policy\$2" $1
IntOp $1 $1 + 1
StrCmp $3 "" EnumStart
IfFileExists "$4\$2.$3" foundDotNET EnumPolicy
noDotNET:
StrCpy $0 0
Goto done
foundDotNET:
StrCpy $0 1
done:
Pop $4
Pop $3
Pop $2
Pop $1
Exch $0
FunctionEnd
; eof

View File

@@ -1,443 +0,0 @@
================================================
Avlis Persistence System (APS) and NWNX2 Licence
================================================
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Library General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Library General
Public License instead of this License.
======================================
madCodeHookLibLight
======================================
-------------------
Freeware for non-commercial use
Copyright (C) 1999 - 2000 Mathias Rauen, www.madshi.net, All Rights Reserved
----------------------------------------------------------------------------
This light version of madCodeHookLib has exactly the same features as the full
version, but does not contain any sources. Furthermore the first instance of
madCodeHookLibLight, that gets loaded at the same time, pops up a little info
window for 1 second. If you don't like that, you can ask me for a modified
madCodeHookLibLight version, which doesn't show that box. Please use "noBox.htm"
for this purpose.
-----------------
SOFTWARE LICENSE AGREEMENT
--------------------------
You should carefully read the following terms and conditions before using this
software. Unless you have a different license agreement signed by Mathias Rauen,
your use of this software indicates your acceptance of this license agreement
and warranty.
-------------
FREEWARE USE
------------
The madCodeHookLibLight package is freeware for non-commercial use and may be
used freely, without bying a license, provided that:
(1) I'm given proper credit for my work.
(2) You do not claim that the library is written by you.
(3) You do not use the library in commercial software (including shareware).
(4) madCodeHookLibLight must not be transferred to any third party unless
such third party receives a copy of this agreement and agrees to be bound
by all of its terms and conditions.
-----------------------------------------
COMMERCIAL USE
--------------
Commercial use of madCodeHookLibLight is not allowed. If you want to use
madCodeHookLib for commercial purposes you have to order the full madCodeHookLib
package here:
http://shareit1.element5.com/programs.html?productid=138883
-----------------------------------------------------------
RESTRICTIONS
------------
You must not use madCodeHookLibLight in any other product that directly or
indirectly competes with madCodeHookLibLight. Specifically, you must not include
madCodeHookLibLight as part of any code library, as source code or in compiled
form. You must not provide any means by which your users could create, modify,
or incorporate any part of this library into their own products.
----------------------------------------------------------------
DISCLAIMER
----------
This product and the accompanying files and documentation are distributes/sold
"as is" and without warranties as to performance or merchantability or any other
warranties whether expressed or implied. The user and/or licensee assume the
entire risk as to the use of this product. The Author does not assume liability
for the use of this product beyond the original purchase price (if applicable).
In no event will the author be liable for additional direct or indirect damages
including any lost profits, lost savings, or other incidental or consequential
damages arising from any defects, or the use or inability to use this product,
even if the Author has been advised of the possibility of such damages.
-----------------------------------------------------------------------
TITLE
-----
Title, ownership rights, and intellectual property rights in and to the software
shall remain in the author. The software is protected by the copyright laws of
Germany and international copyright treaties.
---------------------------------------------
CONTENT
-------
Title, ownership rights, and intellectual property rights in and to the content
accessed through the software is the property of the applicable content owner
and may be protected by applicable copyright or other law. This license gives
you no rights to such content.
------------------------------
TERMINATION
-----------
This Agreement shall automatically terminate upon failure by you to comply with
its terms, in which case you shall immediately discontinue the use of the
software and shall within ten (10) days destroy all copies of the software.
You may also terminate this Agreement at any time by destroying the software
and all copies thereof.
-----------------------

View File

@@ -1,11 +0,0 @@
-- You only need this if you have a new mySQL install
-- nwn server user
-- assumes mysql is running on same computer as nwn server
CREATE USER 'nwn'@'localhost';
-- set the password
-- see for why it is done like this http://dev.mysql.com/doc/refman/5.1/en/old-client.html )
SET PASSWORD FOR 'nwn'@'localhost' = OLD_PASSWORD('password'); -- change this to a better password!!!
-- make the database
CREATE DATABASE nwn;
-- let the nwn server read and modify it
GRANT ALL ON nwn.* TO 'nwn'@'localhost';

View File

@@ -1,18 +0,0 @@
NWNX Core 2.7-beta4
Changelog:
2.7-beta4 (07.05.2008)
- [Linux/Win32] Fixed compatibility problems with Hashset plugin
2.7-beta3 (28.01.2008)
---
- [Linux] Fixed a bug in CNWNXBase::Log function.
2.7-beta2 (15.04.2007)
- [Linux/Win32] Added dynamic allocation for results (= no more need for spacers)
- [Linux] Improved the INI parser
- [Win32] Added debuglevel, confKey variables to NWNXBase (the main plugin class)
- [Linux/Win32] Added OBJECT_INVALID constant
2.7-beta1 (10.03.2007)
- [Linux/Win32] Hooked GetLocalObject, added OnRequestObject to NWNXBase

View File

@@ -1,25 +0,0 @@
INSTALLATION INSTRUCTIONS
- Copy nwnx_funcs.dll into your main Neverwinter Nights folder (e.g.: "C:\Program Files\Neverwinter Nights\"
- Add nwnx_funcs.nss to your module (or include directory)
- Add the following lines to your nwnx.ini
[FUNCS]
;Number_of_Skills, the amount of skills from skills.2da (last row+1)
Number_of_Skills=28
;debugLevel: 1 should only show basic information, 2 should include errors and 3 should log pretty much everything
debugLevel=0
;Set this to 1 to use the CustomTrapGeometry functions
HOOK_CustomTrapGeometry=1
;Hook for a new OnPlayerLeave event which runs before OnClientLeave
;Makes it possible to retrieve information about the player object as usual (GetName, GetArea, etc)
;In the onplayerleaving script, OBJECT_SELF is the player object about to leave
HOOK_OnPlayerLeaving=1
OnPlayerLeavingScript=onplayerleaving
Dll compiled with Visual C++ 2008 Express

View File

@@ -1,107 +0,0 @@
<P>
<B>About NWNX-Leto</b>
<P>
NWNX-Leto is a module (plugin) for NWNX2, allowing you to run LetoScript from NWScript. NWNX2 was developed by Ingmar Stieger (Papillon), papillon@blackdagger.com. You will need NWNX2 for NWNX-Leto to be of much use to you. NWNX now has its own <A href="http://www.nwnx.org">site</a>, including forums. (The majority of discussion on NWNX-Leto in particular is on the Leto <A href="http://weathersong.infopop.cc">forums</a>.)
<P>
This is <B>build 03</b> of the plugin, with LetoScript support compiled in from <B>build 4.0.24</b> of the LetoScript engine. There has been some confusion about the difference between these two numbers / versions / DLLs. The difference between them is in fact quite simple:
<P>
<B>nwnx_leto.dll/so</b> is bridge code that is written in C++ (MSVC on Windows, ANSI C on Linux) and accomodates the differences between NWNX's C++ code, and LetoScript's Delphi code. These differences are prototypical, and don't change from release to release - they may never change, for that matter. The code has nothing to do with the LetoScript engine itself, so you don't need a different version for Phoenix or Unicorn. Instead, you need a different LetoScript lib:
<P>
<B>LetoScript.dll/so</b> is the entire LetoScript engine (the equivalent of Moneo) in a library. This is what the "+24" in the name means - this version of the library is the same code as for Moneo 4.0.24. (And <I>exactly</i> the same code, with but a wrapper around it so that NWNX!LETO commands can reach it.) If your code uses Phoenix syntax, you need build 18 of this library, instead, which is no longer supported or available on SourceForge (to clear up much confusion). If you need this library, <A href="mailto:dragon@weathersong.net">e-mail</a> me and I can send it to you, along with full source code.
<P>
To summarize, each platform consists of two library files: DLLs for Windows, and SOs for Linux. If you aren't a developer, all you need to worry about is copying the files files for your platform into your NWN directory (where you have NWNX2 installed) in order to get it to "work".
<P>
For the Windows platform, the files you need are nwnx_leto.dll, and LetoScript.dll.
<P>
For the Linux platform, the files you need are nwnx_leto.so, and LetoScript.so. Note that nwnx_leto.so was compiled around the new features in beta 5 pre 2, so if you want to recompile it, you will need that source or better. <B>You will also need to initialize NWNX2 with "NWNX!INIT" "1" in your OnModuleLoad event.</b>
<P>
NWNX-Leto will create a logfile, nwnx-leto.txt, which can provide you with clues in the event that the plugin does not start.
<P>
The namespace for the plugin is LETO. The functions it currently supports are:
<P>
<LI> <B>SCRIPT</b>, taking a LetoScript script as a parameter. Example:
<P>
<PRE>
void main()
{
SendMessageToAllDMs("Firing LetoScript test...");
string LetoTest;
SetLocalString(GetModule(), "NWNX!LETO!SCRIPT", "&lt;file:open BOB 'g:/nwn/localvault/bob.bic'&gt;&lt;FirstName&gt; &lt;LastName&gt;");
LetoTest = GetLocalString(GetModule(), "NWNX!LETO!SCRIPT");
SendMessageToAllDMs("Result: #" + LetoTest + "#");
}
</pre>
<P>
<LI> <B>SPAWN</b>, taking a LetoScript script as a parameter. Unlike SCRIPT, this creates a new thread that runs (simultaneously) in the background while your server goes on doing its business. Running a SCRIPT that takes 10 seconds to complete means your server will hang for 10 seconds while it waits for the script to complete. Running the same script as a SPAWN means the server doesn't hang at all, but the script runs "in the background" instead (and still takes 10 seconds to complete). The result you get back from SPAWN is the ThreadId created for your script. Record it! Unless you POLL for that ThreadId, the thread will hang around indefinitely, costing system resources, until NWNX is shut down. Note that SPAWN does not share the state that SCRIPT maintains. That is, you cannot operate on a handle that you have previously opened in a SCRIPT. (In fact, allowing SPAWN and QFORGET to share state with SCRIPT could have disastrous consequences, and force scripters using NWNX-Leto to write "thread safe" LetoScript!)
<P>
<LI> <B>POLL</b>, taking a ThreadId as a parameter. The result will tell you whether this thread is still working, or has completed. You will get one of three results: "Error: ### not done." (### is your ThreadId) if the thread is still working, "Error: ..." for some other error (... is the exact error), or you will not get "Error:" at the beginning of the string, and instead you will get the result of your script. ZombieBench provides a very good example of how to use POLL correctly.
<P>
<LI> <B>QFORGET</b>, taking a LetoScript script as a parameter. This is a "Queue and Forget" version of SPAWN. Like SPAWN, the script is queued (it will not run until all previous SPAWN and QFORGET scripts have completed), but you cannot POLL for a QFORGET thread, and upon completion the thread is automatically terminated. You would use QFORGET when you want to multithread a script, but you don't care what the results are, and you don't need to wait for it to complete to do something else (such as RCO). There is no result from QFORGET (just an empty string).
<P>
<LI> <B>FFORGET</b>, taking a LetoScript script as a parameter. This is the "Fire and Forget" version of SPAWN, but unlike QFORGET, the thread is created and the script run <I>immediately</i>, rather than being put at the end of the queue. Although this sounds like a tempting alternative to QFORGET for a script you want completed quickly, <B>EXTREME CAUTION</b> must be exercised when using FFORGET. It is unstable and prone to cause exceptions in the script it runs. There should be no danger to NWNX itself - although even that isn't a guarantee.
<P>
There are a lot of additional details on these mutli-threading functions. Please refer to the documentation for a much more in-depth explanation, and some examples. (If you prefer to learn by practical application, take a look at "zb_queue" in ZombieBench.)
<P>
<LI> <B>LOG</b>, which takes a few parameters of its own, to control NWNX-Leto logging. Logging is disabled by default, because the current logging mechanism is hell on the NWN server, and can cause severe lag. Its use is suggested only for debugging. Turn it off for a live server!
<P>
There are three params you can give to LOG, which are <I>Enable</i>, <I>Dir</i>, and <I>File</i>. Setting <I>Enable</i> to "true" or 1 will turn on logging. Likewise, "false" or 0 turns it off again. <I>Dir</i> and <I>File</i> tell NWNX-Leto where you want your logfile. You should probably specify at least a directory, though the filename is optional (defaults to letoscript_log.txt).
<P>
Logging examples:
<P>
<PRE>
// Turn logging on:
SetLocalString(GetModule(), "NWNX!LETO!LOG", "Enable=1, Dir=g:/nwn/leto/logs");
// You can change the dir or file while logging is on:
SetLocalString(GetModule(), "NWNX!LETO!LOG", "File=letoscript.log2.txt");
// And this shuts it down:
SetLocalString(GetModule(), "NWNX!LETO!LOG", "Enable=0");
</pre>
<P>
Remember that logging comes at a penalty. It involves some rather heavy file I/O, and should only be used for debugging cranky scripts (which is when you put those scripts in Moneo to effectively troubleshoot them). Leave it off for a production server.
<P>
<B>Known limitations</b>
<P>
<LI> The use of NWNX!LETO!SCRIPT is blocking. If your script takes 10 seconds to run, the entire server will seem "locked up" for those 10 seconds, same as with any other NWScript you run that takes 10 seconds to complete. Your players will think the server is lagging, of course. You can get around that with SPAWN / QFORGET, but...
<P>
<LI> All of the multi-threading functions (SPAWN, QFORGET, FFORGET) are still pretty beta. In early tests, they were prone to cause exceptions in the script (that is, you will get an [EXCEPTION] result), and in such a random pattern that it was difficult to isolate and fix whatever the underlying problem was. This ESPECIALLY applies to FFORGET, which runs the extra risk of thread collision. Although some time has passed since early tests, it is difficult to say how many servers actually use multi-threaded LetoScript. Use with caution - and if you have experiences good or bad, I'd be interested in hearing about them.
<P>
<B>Technical details</b>
<P>
(These notes are old, and probably need updating.)
<P>
There are two libraries (DLLs / SOs) involved because Leto and LetoScript are written in Delphi, whereas NWNX is written in C. This requires a bridge DLL be compiled in the native environment (MSVC on Windows), which is nwnx_leto.dll/so. The bridge DLL talks to the Delphi DLL, LetoScript.dll. Since I don't own a copy of MSVC, I wrote all of the source for nwnx_leto in Notepad, had a volunteer on the APS/NWNX Guild compile it for me (thanks Taryn Winterblade!) and then designed the LetoScriptDll library to talk to it. For Linux, I scoured Google for sufficient examples and then re-wrote the source to compile with gcc. There are still two libraries involved to keep it more aligned with the Windows release, and because a bridge design pattern is actually useful in terms of de-coupled development of each component.
<P>
Note how the name of the Delphi library is "LetoScriptDll". This is so there is no confusion with the language, LetoScript, by calling it just "LetoScript". This means that compiling LetoScriptDll.dpr will give you LetoScriptDll.dll / libLetoScriptDll.so, however, and you MUST rename it to LetoScript.dll / LetoScript.so. nwnx_leto.dll/so is very specific about this, it wants a library named LetoScript.dll (on Windows) or LetoScript.so (on Linux).
<P>
To recompile nwnx_leto.so and LetoScript.so, you will need the Linux NWNX source. Stick the files in your nwnx-leto-so-linux directory into a subdirectory of nwnx2 such as "letoscript", then edit configure.ac as necessary. Then run autoconf && ./configure && make && make install. If you need help or more information on this, please make a post on the weathersong forums.

View File

@@ -1,660 +0,0 @@
<html>
<head>
<title> APS/NWNX_ODBC Documentation </title>
</head>
<body style="font-family:Arial,Verdana,sans-serif;">
<h2>Avlis Persistence System</h2>
<h3>Table of Contents:</h3>
<table>
<tr>
<td> <a href="#I">I.</a></td>
<td> <a href="#I">Introduction - What does APS do?</a></td>
</tr>
<tr>
<td><a href="#II">II.</a></td>
<td><a href="#II">Installing and updating APS</a></td>
</tr>
<tr>
<td><a href="#III">III.</a></td>
<td><a href="#III">Setting up a database</a></td>
</tr>
<tr>
<td><a href="#IV">IV.</a></td>
<td><a href="#IV">Customization</a></td>
</tr>
<tr>
<td><a href="#V">V.</a></td>
<td><a href="#V">Speed comparison</a></td>
</tr>
<tr>
<td><a href="#VI">VI.</a></td>
<td><a href="#VI">Troubleshooting</a></td>
</tr>
</table>
<a name="I"></a>
<h3>I. Introduction - What does APS/NWNX ODBC2 do?</h3>
<p>APS is a set of scripts written for Neverwinter Nights that work with NWNX2 to
produce reliable persistence in a module. At the heart of the APS is
an include file that lists a number of custom made functions for governing
persistence. These functions can be used as is in your module or changed to
suit your needs.
<p>Whenever a script work with persistent data, it calls our APS functions
and the Extender pulls the query out of the memory of the NWN server. It then
passes it to the database, and writes the result of the query back into the
memory of the server. The database has been tested with MySQL, MS-SQL,
PostgresSQL, Microsoft Access, and the internal SQL database engine so far. Conceivably, any database with a
decent ODBC driver will work.
<p>We have included a demo module that illustrates how to use APS/NWNX ODBC2 and makes
creating the database tables easy, and a second module demonstrating how
persistent containers could be implemented.
<p><b>Licence</b><br> APS and NWNX2 ODBC2 are distributed unter the terms of the GNU
GENERAL PUBLIC LICENSE included in <a href="../licence.txt">licence.txt</a>.
<a name="II"></a>
<h3>II. Installing and updating APS</h3>
<h4>A. Installing the plugin</h4>
<p>Copy the file nwnx_odbc.dll to you NWN folder, and aps_demo.mod
to your NWN module folder.
<h4>B. Importing the erf</h4>
<p>In order to be able to use the APS functions, you will need to import
the aps_include file into your module.
<ol>
<li>Place the file "aps2.erf" into the C:\Neverwinternights\NWN\erf directory.
<li>In the toolset, open up the module into which you wish to install the
scripts.
<li>Under the File Menu, click Import. A window will pop up.
<li>Make sure the contents of the C:\Neverwinternights\NWN\erf directory are
showing in the window
<li>Select "aps2.erf" from the list
<li>Click Import and ignore any messages about missing resources (click Yes).
</ol>
<p>The following scripts should now be imported: aps_onload, aps_include.
<h4>C. Updating from previous versions</h4>
<ul>
<li>from ODBC v2.5 to ODBC2: Copy the new DLL into your NWN folder.
Edit the database connection parameters in your nwnx.ini file (check the
supplied example INI file what parameters can be used). Import the updated
aps_include file (from ap2.erf) into your module.
</ul>
<a name="III"></a>
<h3>Setting up a database</h3>
<p>The first choice you have to make is what database you are going to use.
We strongly suggest starting out with the internal SQL database (SQLite), which
is one of the fastest and easiest options. It also comes with a prepared datase
that is ready to go. Read the section "Configuration for the internal database" on
how to set this up.
<p>If you are using MySQL, go to the section "Configuration for MySQL
database". If you are using any other database with an ODBC driver, go
to the section "Configuration for ODBC database".
<h4>3.a. Configuration for the internal database</h4>
The internal NWNX ODBC2 database is based on SQLite v3, which is a fast SQL
compliant database that developers can package with their applications - and
that is what we did ! The main benefits of SQLite for NWN users are twofold:
<ol>
<li>It is fast.
<li>It is easy to setup (zero configuration).
</ol>
<p>Note: We recommend this type of database for single instance servers,
meaning setups where only one NWN server is accessing the database.
We recommend against using it in setups where multiple computers access
the database simultaneously.
<p>Edit the nwnx.ini file and set the source= parameter to SQLite, and
the file= parameter to the path and file where you want your database file:
<pre>
[ODBC2]
source = sqlite
file = sqlite.db
</pre>
<p>Note: Omitting the path like in the example above will put the database
file into your NWN folder. If you want it somewhere else, set the file
parameter to e.g. c:\temp\nwn.db.
<p>Hint: One of the tools for working with the internal database is
<a href="http://home.student.uu.se/frax0795/">SQLiteCC</a>. It is not
needed to follow the setup instructions in this document, but will come in
handy later.
<p>Advanced note: After opening the database file, an implicit transaction
is started automatically, since SQLite is significantly faster when access to
the database is happening inside a transaction. If you want to access the
database concurrently, or if you want to handle transactions yourself, issue
a COMMIT right after the call to SQLInit to commit the implicit transaction.
<h4>3.b. Configuration for MySQL database</h4>
<p>Below the various parameters are listed which are required in the
configuration file nwnx.ini:
<ul>
<li>Server: Either the name or IP address of the database system which you are
using. Most of the time this will be your local machine: 'localhost'.
<li>User/pwd: This is the username and password of the user which will be
used to connect to the database. For security reasons it is best to
create a special user which has only access to the nwn database.
<li>DB: The database name.
</ul>
<p>An example configuration file is displayed below. In this configuration you
tell the plugin to use the direct mysql connection to the database nwn.
This database resides on the localhost (same machine as NWN runs)
and should be connected with user 'your_user' and password 'your_pwd'.
<pre>
[ODBC2]
source = mysql
server = localhost
user = your_user
pwd = your_pwd
db = nwn
</pre>
<p>Note: If your MySQL installation is not on the same machine you are
installing this plugin too, you will need to copy the library libmysql.dll to
your NWN folder as well, or ODBC2 will complain about a missing module.
<h4>3.c. Configuration for ODBC database</h4>
<p>If you have a different database system than MySQL you will use
the ODBC connection method. In this section we will describe
the steps needed to setup your system correctly. In the description
below we asume that you are using Windows XP or a similar system.
<ul>
<li>Make sure your database system (including ODBC support) is installed
and running correctly on your machine (with a remote database system you
only need the ODBC drivers on your machine).
<li>Create an ODBC datasource: in the Control Panel select
Administrative Tools and then Data Sources (ODBC). In the System Tab
click on Add, and fill in the required fields. When finished the
datasource should appear in the list (if not, consult your database
system manual).
</ul>
Edit the nwnx.ini file and set the dsn= parameter to the name you
have just entered, e.g.:
<pre>
[ODBC2]
source = odbc
dsn = nwn
</pre>
<h4>3.c. Creating the database tables</h4>
<p>Note: As there is an almost unlimited amount of different databases
out there, we can not give detailed instructions for all of them. If you want
to use a database server like MSSQL or PostgresSQL, try to follow the steps
described below accordingly. If you are using the internal database, all tables have already been
created for you (in the file sqlite.db).
<p>Make sure your database is up and running and that you have a
database that is accessible to the ODBC2 plugin. In order to store data in it,
you have to create some tables in the database. The included module
"aps_demo.mod" makes this easy for the internal database and MySQL.
By default, it creates tables for the internal database. If you want to use
MySQL instead, open the module with the toolset and edit the scripts
"demo_createtable" and "demo_obj_create" accordingly.
<p>Next connect to your server with the Neverwinter Nights client.
On the left side, you will see several different signs in front of you:
<ul>
<li>Create table: Issues a database command that creates a table
in the database
<li>Store variable in database: Tries to save a test variable named
"demoName" with the value "testValue" in the database
<li>Load variable from database: Tries to retrieve the variable
"demoName" from the database and prints the results in the
server message window.
</ul>
<p>Now click every sign once, starting with the one on the
left (Create Tables).
<p>If the last sign sends you the message "Retrieved variable from
database: testValue" your setup is ok and you're ready to start using APS.
Note: This is the most basic setup. We encourage you to use more
sophisticated databases and data structures if you feel confident
to do so (see below).
<p> On the right side, you will see several different signs that do almost
the same as the other signs, but they are dealing with object instead
of strings storage.
<p> If the variable is not retrieved correctly, check out the log file
nwnx_odbc.txt for errors. Also check your database if the table really
has been created. The SQL statement that is executed by default is suitable for MySQL. If you use a
different database server, you should adjust that statement accordingly:
<p>Create a table "pwdata" with the following fields
player, tag, name, val, expire, last. Here is an example for MySQL
(taken from aps_demo.mod, script demo_createtable):
<pre>
SQLExecDirect("CREATE TABLE pwdata (" +
"player varchar(64) default NULL," +
"tag varchar(64) default NULL," +
"name varchar(64) default NULL," +
"val text," +
"expire int(11) default NULL," +
"last timestamp(14) NOT NULL," +
"KEY idx (player,tag,name)" +
")" );
</pre>
<h4>E. Using the persistence functions in your module</h4>
<ol>
<li>After installing according to the instructions above, go to Module
Properties under the Edit menu.
<li> Select aps_onload for your module OnModuleLoad event.<br>
&nbsp;&nbsp;OR<br>
Open aps_onload in the script editor and paste the contents of it into your
pre-existing module's OnModuleLoad script. We only recommend doing this if you
are familiar with NWScript.
</ol>
The functions below are now implemented. Here is a lexicon containing
information on their purpose and use:
<p><b>void SQLInit()</b>
<p>Setup placeholders for ODBC requests and responses. This functions reserves memory APS and NWNX
use for communication. Call this function <b>once</b> in the module load event.
<p><b>SetPersistentString(object oObject, string sVarName, string sValue,
int iExpiration=0, string sTable="pwdata")</b>
<p>This sets a persistent string on an object. The object can be
any valid object in the game. The command works the same way the usual
SetLocalString function works, except you can optionally add a little more
information:
<ul>
<li>object oObject - The object which you wish to set the persistent variable
upon.
<li>string sVarName - The name of the persistent variable. Ex: "Quest Flag 1"
or "QuestCompleted_True_False"
<li>string sValue - The string you want to store.
<li>int Expiration - (optional) The number of days after which the variable should
expire, i.e. be deleted from the database. If you don't specify this parameter
or pass 0 here, the variable will never be purged from the database.
<li>string sTable - (optional) You can specify in which database table the value
should be stored. This parameter defaults to "pwdata".
</ul>
<p><b>SetPersistentInt(object oObject, string sVarName, int iValue,
int iExpiration=0, string sTable="pwdata")</b>
<p>This sets a persistent integer value on an object. The object can be
any valid object in the game. The command works the same way the usual
SetLocalInt function works, except you can optionally add a little more
information:
<ul>
<li>object oObject - The object which you wish to set the persistent variable
upon.
<li>string sVarName - The name of the persistent variable. Ex: "Quest Flag 1"
or "QuestCompleted_True_False"
<li>int iValue - The integer value of the variable. 1, 2, 3... etc.
<li>int Expiration - (optional) The number of days after which the variable should
expire, i.e. be deleted from the database. If you don't specify this parameter
or pass 0 here, the variable will never be purged from the database.
<li>string sTable - (optional) You can specify in which database table the value
should be stored. This parameter defaults to "pwdata".
</ul>
<p><b>SetPersistentFloat(object oObject, string sVarName, float fValue,
int iExpiration=0, string sTable="pwdata")</b>
<p>This sets a persistent float value on an object. The object can be
any valid object in the game. The command works the same way the usual
SetLocalFloat function works, except you can optionally add a little more
information:
<ul>
<li>object oObject - The object which you wish to set the persistent variable
upon.
<li>string sVarName - The name of the persistent variable. Ex: "Quest Flag 1"
or "QuestCompleted_True_False"
<li>float fValue - The float value of the variable. 1.6, 2.542, 3.0989... etc.
<li>int Expiration - (optional) The number of days after which the variable should
expire, i.e. be deleted from the database. If you don't specify this parameter
or pass 0 here, the variable will never be purged from the database.
<li>string sTable - (optional) You can specify in which database table the value
should be stored. This parameter defaults to "pwdata".
</ul>
<p><b>SetPersistentLocation(object oObject, string sVarName, location lLocation,
int iExpiration=0, string sTable="pwdata")</b>
<p>This sets a persistent location on an object. The object can be
any valid object in the game. The command works the same way the usual
SetLocalLocation function works, except you can optionally add a little more
information:
<ul>
<li>object oObject - The object which you wish to set the persistent variable
upon.
<li>string sVarName - The name of the persistent variable. Ex: "Quest Flag 1"
or "QuestCompleted_True_False"
<li>location lLocation - The location you want to store.
<li>int Expiration - (optional) The number of days after which the variable should
expire, i.e. be deleted from the database. If you don't specify this parameter
or pass 0 here, the variable will never be purged from the database.
<li>string sTable - (optional) You can specify in which database table the value
should be stored. This parameter defaults to "pwdata".
</ul>
<p><b>SetPersistentVector(object oObject, string sVarName, vector vVector,
int iExpiration=0, string sTable="pwdata")</b>
<p>This sets a persistent vector on an object. The object can be
any valid object in the game. The command works the same way the usual
Set local variable functions work, except you can optionally add a little more
information:
<ul>
<li>object oObject - The object which you wish to set the persistent variable
upon.
<li>string sVarName - The name of the persistent variable. Ex: "Quest Flag 1"
or "QuestCompleted_True_False"
<li>vector vVector - The vector you want to store.
<li>int Expiration - (optional) The number of days after which the variable should
expire, i.e. be deleted from the database. If you don't specify this parameter
or pass 0 here, the variable will never be purged from the database.
<li>string sTable - (optional) You can specify in which database table the value
should be stored. This parameter defaults to "pwdata".
</ul>
<p><b>GetPersistentString(object oObject, string sVarName, string sTable="pwdata")</b>
<p>This function works in the same manner as GetLocalString. It gets the
persistent string from object oObject.
<ul>
<li>object oObject - This is the object from which you are retrieving the
value of the variable.
<li>string sVarName - This is the name of the variable that will be retrieved
off of oObject. Ex: "Quest Flag 1"
<li>string sTable - (optional) You can specify in which database table the value
can be found. This parameter defaults to "pwdata".
</ul>
<p><b>GetPersistentInt(object oObject, string sVarName, string sTable="pwdata")</b>
<p>This function works in the same manner as GetLocalInt. It gets the
persistent integer value from object oObject.
<ul>
<li>object oObject - This is the object from which you are retrieving the
value of the variable.
<li>string sVarName - This is the name of the variable that will be retrieved
off of oObject. Ex: "Quest Flag 1"
<li>string sTable - (optional) You can specify in which database table the value
can be found. This parameter defaults to "pwdata".
</ul>
<p><b>GetPersistentFloat(object oObject, string sVarName, string sTable="pwdata")</b>
<p>This function works in the same manner as GetLocalFloat. It gets the
persistent float value from object oObject.
<ul>
<li>object oObject - This is the object from which you are retrieving the
value of the variable.
<li>string sVarName - This is the name of the variable that will be retrieved
off of oObject. Ex: "Quest Flag 1"
<li>string sTable - (optional) You can specify in which database table the value
can be found. This parameter defaults to "pwdata".
</ul>
<p><b>GetPersistentLocation(object oObject, string sVarName, string sTable="pwdata")</b>
<p>This function works in the same manner as GetLocalLocation. It gets the
persistent location value from object oObject.
<ul>
<li>object oObject - This is the object from which you are retrieving the
value of the variable.
<li>string sVarName - This is the name of the variable that will be retrieved
off of oObject. Ex: "Quest Flag 1"
<li>string sTable - (optional) You can specify in which database table the value
can be found. This parameter defaults to "pwdata".
</ul>
<p><b>GetPersistentVector(object oObject, string sVarName, string sTable="pwdata")</b>
<p>This function works in the same manner as the other get local variable functions. It gets the
persistent vector value from object oObject.
<ul>
<li>object oObject - This is the object from which you are retrieving the
value of the variable.
<li>string sVarName - This is the name of the variable that will be retrieved
off of oObject. Ex: "Quest Flag 1"
<li>string sTable - (optional) You can specify in which database table the value
can be found. This parameter defaults to "pwdata".
</ul>
<p><b>void DeletePersistentVariable(object oObject, string sVarName, string sTable="pwdata")</b>
<p>This function deletes a variable from the database.
<ul>
<li>object oObject - This is the object on which the variable has been stored.
<li>string sVarName - This is the name of the variable that will be deleted.
<li>string sTable - (optional) You can specify in which database table the value
can be found. This parameter defaults to "pwdata".
</ul>
<p><b>void SQLExecDirect(string sSQL)</b>
<p> Executes a SQL statement. If the statement returns a result set, you can read the data
with the next two functions.
<p><b>int SQLFetch()</b>
<p> Position cursor on next row of the resultset. Call this function before using SQLGetData().<br>
Returns
<ul>
<li>SQL_SUCCESS if there is a row
<li>SQL_ERROR if there are no more rows
</ul>
<p><b>int SQLFirstRow() (*deprecated*)</b>
<p> Function is deprecated but still there for backward compability. Simply calls SQLFetch().
<p><b>int SQLNextRow() (*deprecated*)</b>
<p> Function is deprecated but still there for backward compability. Simply calls SQLFetch().
<p><b>string SQLGetData(int iCol)</b>
<p> Return value of column iCol in the current row of result set sResultSetName.
<p><b>Comments</b>
<ul>
<li>Make sure you include aps_include in every script where you want to use these functions,
i.e. add the line
<pre>
#include "aps_include"
</pre>
at the top of your script.
</ul>
<a name="IV"></a>
<h3>IV. Customization</h3>
<p>The APS is merely a set of custom functions that were originally used for the Avlis
persistent world. The names of the functions and their parameters can be set to whatever
is convenient for your module. Below is a hypothetical example of how customization can be done.
<p>The "PowerG I33t" persistent world maintains their persistence with the Joe Bloe Persistence
system (JBPS). In that system, a persistent string is set with the following JBPS function:
<p>SetStickySring(string sVariableName, string sVariableValue, object oTarget)
<p>All 5000 scripts in PowerG's elite world are written with the SetStickyString function, and they
wish to retrofit their world to use NWNX. They would follow these steps:
<ol>
<li>Open up the file aps_include in the script editor.
<li>Change the name of the APS function called SetPersistentString to SetStickyString.
<li>Rearrange the parameters of:
<p>SetPersistentString(object oObject, string sVarName, string sVarValue, int iExpiration, string sTable = "pwdata")<br>
&nbsp;&nbsp;to:<br>
SetStickyString(string VarName, string VarValue, object oObject, int iExpiration = 0, string sTable = "pwdata")<br>
<li>Build the module, i.e. recompile all scripts.
</ol>
<p>Once the module is restarted, all of PowerG I33t's old persistent string scripts should be running the
new persistence system. All it took was changing one script.
<p>The above example is a simplified one, and the rest of the functions in the JBPS would need to be changed
in the same manner. In cases where the function parameters were completely not equivalent to those used
by the APS, they may have to be changed throughout every script in the module. Many but not all of the
persistence systems out there should be convertible by the above method. We encourage further modification
of aps_include to tailor the variable handling to your needs.
<p>For persistence systems that use tokens, conversion will not be as easy. In these systems, token items
are used to represent information on a player character. These tokens are not lost because they are
actually in the inventory of the character. Because these systems work with tokens and not actual variables
it will be hard to convert them into a database format. The module will most likely have to be completely
re-fitted.
<p>On possible idea to do this scriptomatically would be to write a module OnEnter script that strips the
character of their tokens and issues SetPersistent variable commands into the database before destroying
them. That would preserve the information that is there, but handling the actual scripts throughout the
module will have to be done separately.
<p>Alternatively, you can have a look at the GetPersistentString() function in
"aps_include". There are some comments in this functions that should give you
ideas on how to convert persistent data from your current system to APS.
<a name="V"></a>
<h3>V. Speed comparison </h3>
<p>To give you an idea what to expect from the various database options, we
conducted a small test involving 500 writes and reads. Note that this test is
very artificial, since many aspects like table fragmentation, concurrent access,
database size, and more realistic queries are not factored in. All tests were
done on a Athlon 64 3200+ with database server, NWServer, and NWClient
running local (NWClient with reduced process priority).
<p>Writes were done with the following code:
<pre>
for (i = 0; i < 500; i++)
{
SQLExecDirect("INSERT INTO pwdata (player, tag, name,val) values " +
"('~', '~', 'iter_" + IntToString(i) + "', 'value')");
}
</pre>
<p>Reads were done with the following code:
<pre>
SQLExecDirect("SELECT * from pwdata");
while (SQLFetch() == SQL_SUCCESS) {}
</pre>
<p>Bioware DB reads and write were done with the following code:
<pre>
for (i = 0; i < 500; i++)
{
SetCampaignString("test", "iter_" + IntToString(i), "value");
-- respecively --
s = GetCampaignString("test", "iter_" + IntToString(i));
}
</pre>
<p>Results:
<table border="1" width="300" style="margin-left:2em;">
<tr>
<td>Database</td>
<td>Write</td>
<td>Read</td>
</tr>
<tr>
<td>SQLite (1)</td>
<td>30 ms</td>
<td>20 ms</td>
</tr>
<tr>
<td>SQLite (2)</td>
<td>36 ms</td>
<td>20 ms</td>
</tr>
<tr>
<td>SQLite (3)</td>
<td>2800 ms</td>
<td>20 ms</td>
</tr>
<tr>
<td>MySQL via ODBC</td>
<td>71 ms</td>
<td>38 ms</td>
</tr>
<tr>
<td>MySQL direct</td>
<td>68 ms</td>
<td>22 ms</td>
</tr>
<tr>
<td>Bioware DB (4)</td>
<td>856 ms</td>
<td>10 ms</td>
</tr>
<table>
<p>Comments:
<ul>
<li>SQLITE (1): Using a transaction. No commit after the for loop.
<li>SQLITE (2): Using a transaction. Commit after the for loop.
<li>SQLITE (3): Not using a transaction. Terribly slow ! Note that
NWNX ODBC2 starts an implicit transaction automatically. If you want
to handle transactions yourself, issue a COMMIT right after SQLInit()
to end the implicit transaction.
<li>Bioware DB (4): This comparison is a bit unfair, since the call to the
Bioware database is significantly simpler and less flexible than its ODBC2
counterpart. Real world examples utilizing e.g. SQL resultsets would probably
favor ODBC2.
</ul>
<a name="VI"></a>
<h3>VI. Troubleshooting </h3>
<p> Starting out with NWNX ODBC2 can be a bit daunting at first, especially
if you are on your own. We highly encourage you to visit us at
<a href="http://www.nwnx.org">www.nwnx.org</a> to ask question and get
help with setting this system up.
</body>
</html>

View File

@@ -1,31 +0,0 @@
Changelog for APS/NWNX ODBC2
* 24.03.2011: v.0.9.2.5
- Updated to be compatible with latest version of SQLite3.
- Any additional notes that need to go in here.
* 02.02.2005: v.0.9.2.4
- Fixed a crash that would occur with the MySQL connection when the connection could not be established
- Modified table create statement for MySQL to make it compatible with version 4.0
- ReceiveCampaign returns the correct object size to NWServer now.
- Removed last remnants of dynamic memory allocation for SCORCO
* 23.01.2005: v.0.9.2.3
- Static memory allocation for improved stability on older operating systems
- Implicit transaction for SQLite connection is commited now. Ouch.
* 18.01.2005: v.0.9.2.2
- Implicit transaction for SQLite connection type resulting in better performance
* 16.01.2005: v.0.9.2.1
- Removed dependency on the libmysql.dll file.
* 15.01.2005: v.0.9.2
- New database option: internal database SQLite
* 07.01.2005: v0.9.0
- Hooks for StoreCampaignObject and ReceiveCampaign Object added
- aps_include updated to support the new functions
* 01.01.2005: v0.8.8
- Initial release of the plugin

View File

@@ -1,177 +0,0 @@
<html>
<head>
<title> Profiler Module Documentation </title>
</head>
<body style="font-family:Arial,Verdana,sans-serif;">
<h2>Profiler Module Documentation</h2>
<h4>Documentation and program are &#169; by Ingmar Stieger (Papillon). Version 1.6 of 13.01.2005.</h4>
<h3>Table of Contents:</h3>
<table>
<tr>
<td> <a href="#I">I.</a></td>
<td> <a href="#I">What does this module do?</a></td>
</tr>
<tr>
<td><a href="#II">II.</a></td>
<td><a href="#II">Using the module</a></td>
</tr>
</table>
<a name="I">
<h3>I. What does this module do?</h3>
<h4>A. General introduction</h4>
<p> The "Profiler" is a NWNX module that spits out statistics about running
scripts. It shows how often a script has been called, how much time it took to
complete, and gives some overall statistics. This is especially useful if you
want to identify scripts with performance problems, or want to determine which
scripts should be put in the script cache.
<p>You do not need to put any special code in your scripts.... just copy the
nwnx_profile.dll in your NWN directory, load up a module, and check the
<b>logs.0</b> directory for <b>nwnx_profile.txt</b>. Every 10 seconds, this module will
append the current statistics into this file, so remember to re-open it once in
a while to get updated statistics.
<p><b>Licence</b><br> This module is distributed unter the terms of the GNU
GENERAL PUBLIC LICENSE included in <a href="licence.txt">licence.txt</a>.
<h4>B. Changelog v1.1</h4>
<p>The original version 1.0 overlooked some scripts. First of all, nested scripts
weren't correctly logged. A script which called another script with ExecuteScript()
wasn't accounted at all. Props go out to FastFrench for pointing this out.
<p>Also, there was another script constellation that also went wrong in the previous
version. When you call a function directly with ExecuteScript(1.0f,
MyFunction()), not the whole script, but only a "part" of the script is
executed, namely just that function. Version 1.1 takes this special case into
consideration, too. "Partly" executed scripts are denoted with a '>' sign before the
script name.
<h4>C. Changelog v1.2</h4>
<p>The timeing measurement should be more accurate now. Previous versions took
the time it took for a script to be loaded by the server into memory into
account (either from disk or from the disk cache), but since NWN can cache
scripts now, the profiler only measures the real execution time. This means you
will get somewhat lower accumulative times compared to previous versions.
<p>Note that scripts called via DelayCommand (e.g. DelayCommand(1.0f,
ExecuteScript("myscript", OBJECT_SELF))) are counted twice, one time as a normal
script call, and a second time as a "partly" called script. Thus when the line
above is executed ten times, you will get two entries for this script: 10 times
"myscript" and 10 times ">myscript". This is due to the way the NWN engine works
and I currently do not know of a way to code around it.
<h4>D. Changelog v1.5</h4>
<p>Logfiles have a fixed size limit now, which can be set at compile time. In
the binary distribution, a hard limit of 512 KByte has been chosen. If the log
file exceeds this limit, it will be emptied and the profiler starts again with a
clean file.
<p>During my tests, I found that pathfinding can be a big performance hog in
NWN, especially under circumstances where creatures are blocked in a somewhat
narrow space or where they are repeatedly trying to pathfind across several
areas. Therefore, this updated version supports profiling the two pathfinding
routines in NWN (that's a bit of a oversimplification, but that's how you can
think of it).
<p>There are two types of NPC pathfinding in NWN:
<ul>
<li>finding a path within an area (called <i>Tile pathfinding</i>)
<li>finding a path to another area (called <i>Cross area pathfinding</i>)
</ul>
<p>Pathfinding can't be totally avoided of course, but you should be able to
considerably reduce CPU cycles wasted by useless pathfinding in your module.
Useless pathfinding can happen for example, when you place a NPC inside a small
confined space, e.g. four fence placeables laid out as a square. It can also
happen if a NPC does waypoint walking and tries to reach a waypoint that exists
in the module, but is not reachable on foot. You will see excessive pathfinding
events in the log file in these cases.
<p>For tile pathfinding events, the name of the area where the pathfinding is
happening is written to the log file and marked with a dollar ($) symbol. For
cross area pathfinding, it's the tag of the creature marked with an at (@) symbol.
<p>Another new feature: Updated entries are marked with a star (*) symbol.
Previously, it was very hard to find out what scripts caused the delta in
runtime between two logging events. Now it's easy to see which scripts eat up
your valuable CPU cycles.
<h4>E. Changelog v1.6</h4>
<p>Support for NWNX.INI file has been added. There are two options that can be
configured:
<pre>
[PROFILER]
MaxLogSize = 512 ; in KByte
LogLevel = 1 ; 1=overall statistics, 2=full script callstack
</pre>
<p>LogLevel 2 produces LOTS of output, be careful. Its main purpose is to help with
identifying possible causes for server crashes.
<a name="II">
<h3>II. Using the module</h3>
<h4>A. Running the NWNX Profiler on your module</h4>
<p>The nice thing about this NWNX module is that you don't need to modify anything.
Just drop the .dll in the NWN directory.
<h4>B. The statistics</h4>
<p>The Profiler generates statistics that look like this:
<pre>
Current statistics
-----------------------------------------------------------------------------------------------
NW_G0_Conversat 0 msec 1 calls | m1q0bstud_2 0 msec 36 calls |
nw_all_feedback7 0 msec 1 calls | m1q0caribeth_1 0 msec 7 calls *|
nw_ch_ac1 0 msec 7 calls *| area_m1q0e_1 0 msec 5 calls |
>m1q0bmagic_d 0 msec 5 calls | >m1q0bmagicb_2 0 msec 1 calls |
m1q0bmagic_2 0 msec 1 calls | m1_initdlg_9 0 msec 2 calls |
>m1q0atrig_2 0 msec 4 calls | m1q0bdendy_4 0 msec 7 calls *|
m1q0bpatient_9 0 msec 1 calls | >nw_od_feedback8 0 msec 1 calls |
m1q0brogue_d 1 msec 14 calls *| m1q0bclericb_2 0 msec 8 calls |
m1q0cstud_9 1 msec 7 calls | nw_ch_ac2 0 msec 4 calls |
m1q0apaveend 0 msec 1 calls | m1q0dpavel_9 0 msec 1 calls |
nw_all_feedback8 0 msec 1 calls | nw_c2_default1 0 msec 77 calls *|
>m1q0ddeadgob_9 0 msec 18 calls | m0q01a01pavesck1 0 msec 1 calls |
m0q00plot 0 msec 1 calls | m1q0bmagicb_2 0 msec 1 calls |
nw_c2_j_assvict1 0 msec 1 calls | m1q0dgeld_1 0 msec 7 calls *|
m1q0d_area_1 0 msec 13 calls | m1q0bmagic_d 0 msec 7 calls |
nw_od_feedback8 64 msec 1 calls | area_m1q0_1 0 msec 3 calls |
m1q0apavel_1 1 msec 36 calls *| >nw_c2_default9 8 msec 116 calls *|
area_m1q0b_1 0 msec 33 calls | m1q0bcleric_2 0 msec 8 calls |
m1q0atrig_3 0 msec 1 calls | m1q0apavel_2 0 msec 20 calls |
nw_c2_default2 0 msec 128 calls | nw_all_feedback1 0 msec 1 calls |
nw_c2_default9 1 msec 3 calls | m1q0atrig_2 0 msec 2 calls |
m1q0ddeadgob_9 0 msec 9 calls |
-----------------------------------------------------------------------------------------------
Elapsed time : 3175 msec
Runtime delta : 0 msec
Total cumulative runtime : 76 msec
Total number of scriptcalls : 602
</pre>
(this is from the official "Prelude" module, running one minute).
<ul>
<li>The first column is the scriptname, e.g. "m1q0bstud_2". If the first
character is a '>' sign, a function within the script was called with an
ExecuteScript call (e.g. ExecuteScript(1.0f, MyFunction()))
<li>The second column contains the amount of time this script has used up (accumulated).
<li>The third column contains the number of times this script has been called.
<li>The footer contains some overall information about the scripts.
</ul>
</body>
</html>