657 lines
23 KiB
Plaintext
657 lines
23 KiB
Plaintext
#include "inc_utility"
|
||
#include "inc_sql"
|
||
|
||
//defining directories
|
||
//must be changed to each install
|
||
//it will use a local string on the module named NWN_DIR if set
|
||
|
||
|
||
const string DB_NAME = "prcnwnxleto";
|
||
const string DB_GATEWAY_VAR = "prcnwnxleto";
|
||
|
||
//set this to true if using build 18 or earlier of letoscript.dll
|
||
//again this is a PRC switch
|
||
|
||
|
||
/*YOU MUST ADD THE FOLLOWING TO YOUR ON CLIENT EXIT EVENT
|
||
|
||
object oPC = GetExitingObject();
|
||
LetoPCExit(oPC);
|
||
|
||
*/
|
||
|
||
/*YOU MUST ADD THE FOLLOWING TO YOUR ON CLIENT ENTER EVENT
|
||
|
||
object oPC = GetExitingObject();
|
||
LetoPCEnter(oPC);
|
||
|
||
*/
|
||
|
||
|
||
/* local copies for easy redistribution out of the PRC
|
||
|
||
//these are the names of local variables, normally ints, to set on the module
|
||
|
||
//set this if using any letoscript
|
||
const string PRC_USE_LETOSCRIPT = "PRC_USE_LETOSCRIPT";
|
||
|
||
//* Set this to 1 if using build 18
|
||
const string PRC_LETOSCRIPT_PHEONIX_SYNTAX = "PRC_LETOSCRIPT_PHEONIX_SYNTAX";
|
||
|
||
//* Letoscript needs a string named PRC_LETOSCRIPT_NWN_DIR set to the
|
||
//* directory of NWN. If it doesnt work, try different slash options: // \\ / \
|
||
const string PRC_LETOSCRIPT_NWN_DIR = "PRC_LETOSCRIPT_NWN_DIR";
|
||
|
||
//* Switch so that Unicorn will use the SQL database for SCO/RCO
|
||
//* Must have the zeoslib.dlls installed for this
|
||
//*
|
||
//* UNTESTED!!!
|
||
const string PRC_LETOSCRIPT_UNICORN_SQL = "PRC_LETOSCRIPT_UNICORN_SQL";
|
||
|
||
//* This is a string, not integer.
|
||
//* If the IP is set, Letoscript will use ActivatePortal instead of booting.
|
||
//* The IP and Password must be correct for your server or bad things will happen.
|
||
//* - If your IP is non-static make sure this is kept up to date.
|
||
//*
|
||
//* See the Lexicon entry on ActivatePortal for more information.
|
||
//*
|
||
//* @see PRC_LETOSCRIPT_PORTAL_PASSWORD
|
||
const string PRC_LETOSCRIPT_PORTAL_IP = "PRC_LETOSCRIPT_PORTAL_IP";
|
||
|
||
//* This is a string, not integer.
|
||
//* If the IP is set, Letoscript will use ActivatePortal instead of booting.
|
||
//* The IP and Password must be correct for your server or bad things will happen.
|
||
//* - If your IP is non-static make sure this is kept up to date.
|
||
//*
|
||
//* See the Lexicon entry on ActivatePortal for more information.
|
||
//*
|
||
//* @see PRC_LETOSCRIPT_PORTAL_IP
|
||
const string PRC_LETOSCRIPT_PORTAL_PASSWORD = "PRC_LETOSCRIPT_PORTAL_PASSWORD";
|
||
|
||
//* If set you must be using Unicorn.
|
||
//* Will use getnewest bic instead of filename reconstruction (which fails if
|
||
//* multiple characters have the same name)
|
||
const string PRC_LETOSCRIPT_GETNEWESTBIC = "PRC_LETOSCRIPT_GETNEWESTBIC";
|
||
|
||
// * Set this if you are using SQLite (the built-in database in NWNX-ODBC2).
|
||
// * This will use transactions and SQLite specific syntax.
|
||
const string PRC_DB_SQLLITE = "PRC_DB_SQLLITE";
|
||
|
||
const int PRC_SQL_ERROR = 0;
|
||
const int PRC_SQL_SUCCESS = 1;
|
||
// Function defintions
|
||
int GetPRCSwitch(string sSwitch);
|
||
void PRC_SQLExecDirect(string sSQL);
|
||
|
||
|
||
void PRC_SQLInit()
|
||
{
|
||
int i;
|
||
|
||
// Placeholder for ODBC persistence
|
||
string sMemory;
|
||
|
||
for (i = 0; i < 8; i++) // reserve 8*128 bytes
|
||
sMemory +=
|
||
"................................................................................................................................";
|
||
|
||
SetLocalString(GetModule(), "NWNX!ODBC!SPACER", sMemory);
|
||
}
|
||
|
||
void PRC_SQLExecDirect(string sSQL)
|
||
{
|
||
//PrintString(sSQL);
|
||
SetLocalString(GetModule(), "NWNX!ODBC!EXEC", sSQL);
|
||
}
|
||
|
||
int PRC_SQLFetch()
|
||
{
|
||
string sRow;
|
||
object oModule = GetModule();
|
||
|
||
SetLocalString(oModule, "NWNX!ODBC!FETCH", GetLocalString(oModule, "NWNX!ODBC!SPACER"));
|
||
sRow = GetLocalString(oModule, "NWNX!ODBC!FETCH");
|
||
if (GetStringLength(sRow) > 0)
|
||
{
|
||
SetLocalString(oModule, "NWNX_ODBC_CurrentRow", sRow);
|
||
return PRC_SQL_SUCCESS;
|
||
}
|
||
else
|
||
{
|
||
SetLocalString(oModule, "NWNX_ODBC_CurrentRow", "");
|
||
return PRC_SQL_ERROR;
|
||
}
|
||
}
|
||
|
||
string PRC_SQLGetTick()
|
||
{
|
||
string sTick;
|
||
if(GetPRCSwitch(PRC_DB_SQLLITE))
|
||
sTick = "";
|
||
else
|
||
sTick = "`";
|
||
return sTick;
|
||
}
|
||
|
||
string PRC_SQLGetData(int iCol)
|
||
{
|
||
int iPos;
|
||
string sResultSet = GetLocalString(GetModule(), "NWNX_ODBC_CurrentRow");
|
||
|
||
// find column in current row
|
||
int iCount = 0;
|
||
string sColValue = "";
|
||
|
||
iPos = FindSubString(sResultSet, "<22>");
|
||
if ((iPos == -1) && (iCol == 1))
|
||
{
|
||
// only one column, return value immediately
|
||
sColValue = sResultSet;
|
||
}
|
||
else if (iPos == -1)
|
||
{
|
||
// only one column but requested column > 1
|
||
sColValue = "";
|
||
}
|
||
else
|
||
{
|
||
// loop through columns until found
|
||
while (iCount != iCol)
|
||
{
|
||
iCount++;
|
||
if (iCount == iCol)
|
||
sColValue = GetStringLeft(sResultSet, iPos);
|
||
else
|
||
{
|
||
sResultSet = GetStringRight(sResultSet, GetStringLength(sResultSet) - iPos - 1);
|
||
iPos = FindSubString(sResultSet, "<22>");
|
||
}
|
||
|
||
// special case: last column in row
|
||
if (iPos == -1)
|
||
iPos = GetStringLength(sResultSet);
|
||
}
|
||
}
|
||
|
||
return sColValue;
|
||
}
|
||
|
||
|
||
string ReplaceSingleChars(string sString, string sTarget, string sReplace)
|
||
{
|
||
if (FindSubString(sString, sTarget) == -1) // not found
|
||
return sString;
|
||
|
||
int i;
|
||
string sReturn = "";
|
||
string sChar;
|
||
|
||
// Loop over every character and replace special characters
|
||
for (i = 0; i < GetStringLength(sString); i++)
|
||
{
|
||
sChar = GetSubString(sString, i, 1);
|
||
if (sChar == sTarget)
|
||
sReturn += sReplace;
|
||
else
|
||
sReturn += sChar;
|
||
}
|
||
return sReturn;
|
||
}
|
||
|
||
int GetPRCSwitch(string sSwitch)
|
||
{
|
||
return GetLocalInt(GetModule(), sSwitch);
|
||
}
|
||
|
||
void DoDebug(string sString, object oAdditionalRecipient = OBJECT_INVALID)
|
||
{
|
||
SendMessageToPC(GetFirstPC(), sString);
|
||
if(oAdditionalRecipient != OBJECT_INVALID)
|
||
SendMessageToPC(oAdditionalRecipient, sString);
|
||
WriteTimestampedLogEntry(sString);
|
||
}
|
||
|
||
//*/
|
||
|
||
//instanty runs the letoscript sScript
|
||
//for sType see abive
|
||
//if sType is POLL, PollThread is atomatically started
|
||
//and sPollScript is passed as the script name
|
||
string LetoScript(string sScript, string sType = "SCRIPT", string sPollScript = "");
|
||
|
||
//This command adds the script to the cuttent superscript
|
||
//to run the superscript use StackedLetoScripRun
|
||
void StackedLetoScript(string sScript);
|
||
|
||
//poll an existing thread
|
||
//when the thread is finished, script sScript is run
|
||
void PollThread(string sThreadID, string sScript);
|
||
|
||
//credit to demux
|
||
//gets a bicpath of a pc
|
||
//must be servervault to work
|
||
string GetBicPath(object oPC);
|
||
|
||
//credit to demux
|
||
//gets the filename of a PCs bic
|
||
//must be servervault
|
||
string GetBicFileName(object oPC);
|
||
|
||
//This will automatically add the required code before and after, and will
|
||
//adapt based on PC/NPC/etc.
|
||
//This overwites the existing object which will break stored references
|
||
//such as henchmen. The new object is returned.
|
||
//the result of the script is stored on the module in LetoResult for 1 second
|
||
//if nDestroyOriginal is set then PCs will be booted and non-pcs will be destroyed
|
||
object RunStackedLetoScriptOnObject(object oObject, string sLetoTag = "OBJECT", string sType = "SCRIPT", string sPollScript = "", int nDestroyOriginal = TRUE);
|
||
|
||
//const int DEBUG = TRUE;
|
||
|
||
string GetNWNDir()
|
||
{
|
||
string sReturn = GetLocalString(GetModule(), PRC_LETOSCRIPT_NWN_DIR);
|
||
/*
|
||
if(GetStringRight(sReturn, 1) != "\"
|
||
&& GetStringRight(sReturn, 1) != "/")
|
||
sReturn += "\";
|
||
//" this is here so textpad doesnt go screwy becasue it escapes the quotes above.
|
||
*/
|
||
return sReturn;
|
||
}
|
||
|
||
//credit to demux
|
||
string GetBicFileName(object oPC)
|
||
{
|
||
string sChar, sBicName;
|
||
string sPCName = GetStringLowerCase(GetName(oPC));
|
||
int i, iNameLength = GetStringLength(sPCName);
|
||
|
||
for(i=0; i < iNameLength; i++) {
|
||
sChar = GetSubString(sPCName, i, 1);
|
||
if (TestStringAgainstPattern("(*a|*n|*w|'|-|_)", sChar)) {
|
||
if (sChar != " ") sBicName += sChar;
|
||
}
|
||
}
|
||
return GetStringLeft(sBicName, 16);
|
||
}
|
||
|
||
//credit to demux
|
||
string GetBicPath(object oPC)
|
||
{
|
||
// Gets a local var stored on oPC on "event client enter". I do this because
|
||
// "on even client leave", function GetPCPlayerName() can not be used. Since
|
||
// a .bic file can not be changed while the owner is logged in, it is typical
|
||
// to execute leto scripts when the client leaves (on event client leave).
|
||
string PlayerName = GetLocalString(oPC, "PlayerName");
|
||
if(PlayerName == "")
|
||
PlayerName = GetPCPlayerName(oPC);
|
||
|
||
// Retruns the full path to a .bic file.
|
||
return GetNWNDir()+"servervault/"+PlayerName+"/"+GetBicFileName(oPC)+".bic";
|
||
}
|
||
|
||
void VoidLetoScript(string sScript, string sType = "SCRIPT", string sPollScript = "")
|
||
{
|
||
LetoScript(sScript,sType,sPollScript);
|
||
}
|
||
|
||
string LetoScript(string sScript, string sType = "SCRIPT", string sPollScript = "")
|
||
{
|
||
string sAnswer;
|
||
if (DEBUG) DoDebug(sType+" >: "+sScript);
|
||
SetLocalString(GetModule(), "NWNX!LETO!"+sType, sScript);
|
||
sAnswer = GetLocalString(GetModule(), "NWNX!LETO!"+sType);
|
||
if (DEBUG) DoDebug(sType+" <: "+sAnswer);
|
||
if(sType == "SPAWN")
|
||
DelayCommand(1.0, PollThread(sAnswer, sPollScript));
|
||
return sAnswer;
|
||
}
|
||
|
||
void LetoPCEnter(object oPC)
|
||
{
|
||
SetLocalString(oPC, "Leto_Path", GetBicPath(oPC));
|
||
SetLocalString(oPC, "PCPlayerName", GetPCPlayerName(oPC));
|
||
DeleteLocalString(oPC, "LetoScript");
|
||
}
|
||
|
||
void LetoPCExit(object oPC)
|
||
{
|
||
string sScript = GetLocalString(oPC, "LetoScript");
|
||
if(sScript != "")
|
||
{
|
||
string sPath = GetLocalString(oPC, "Leto_Path");
|
||
if(sPath == "")
|
||
if (DEBUG) DoDebug("Path is Null");
|
||
if(GetPRCSwitch(PRC_LETOSCRIPT_PHEONIX_SYNTAX))
|
||
{
|
||
//pheonix syntax
|
||
sScript = "<file:open CHAR <qq:"+sPath+">>"+sScript;
|
||
sScript += "<file:save CHAR <qq:"+sPath+">>";
|
||
sScript += "<file:close CHAR >";
|
||
}
|
||
else
|
||
{
|
||
if(GetPRCSwitch(PRC_LETOSCRIPT_GETNEWESTBIC))
|
||
{
|
||
sScript = "%char = FindNewestBic('"+GetNWNDir()+"servervault/"+GetLocalString(oPC, "PCPlayerName")+"'); "+sScript;
|
||
sScript += "%char = '>'; ";
|
||
sScript += "close %char; ";
|
||
}
|
||
else
|
||
{
|
||
//unicorn syntax
|
||
sScript = "%char= q{"+sPath+"}; "+sScript;
|
||
sScript += "%char = '>'; ";
|
||
sScript += "close %char; ";
|
||
}
|
||
}
|
||
string sScriptResult = LetoScript(sScript);
|
||
SetLocalString(GetModule(), "LetoResult", sScriptResult);
|
||
AssignCommand(GetModule(), DelayCommand(1.0, DeleteLocalString(GetModule(), "LetoResult")));
|
||
}
|
||
}
|
||
|
||
void StackedLetoScript(string sScript)
|
||
{
|
||
if (DEBUG) DoDebug("SLS :"+sScript);
|
||
SetLocalString(GetModule(), "LetoScript", GetLocalString(GetModule(), "LetoScript")+ sScript);
|
||
}
|
||
|
||
void PollThread(string sThreadID, string sScript)
|
||
{
|
||
if(GetLocalInt(GetModule(), "StopThread"+sThreadID) == TRUE)
|
||
return;
|
||
if (DEBUG) DoDebug("Polling: "+sThreadID);
|
||
//add blank space to capture error messages
|
||
string sResult = LetoScript(sThreadID+" "
|
||
+" "
|
||
+" "
|
||
+" "
|
||
+" "
|
||
+" "
|
||
+" "
|
||
+" "
|
||
+" ", "POLL");
|
||
if(sResult == "Error: "+sThreadID+" not done.")
|
||
{
|
||
DelayCommand(1.0, PollThread(sThreadID, sScript));
|
||
return;
|
||
}
|
||
else
|
||
{
|
||
if (DEBUG) DoDebug("Poll: Executing: "+sScript);
|
||
SetLocalInt(GetModule(), "StopThread"+sThreadID, TRUE);
|
||
DelayCommand(6.0, DeleteLocalInt(GetModule(), "StopThread"+sThreadID));
|
||
location lLoc = GetLocalLocation(GetModule(), "Thread"+sThreadID+"_loc");
|
||
DelayCommand(1.0, DeleteLocalLocation(GetModule(), "Thread"+sThreadID+"_loc"));
|
||
if (DEBUG) DoDebug("Thread"+sThreadID+"_loc");
|
||
if (DEBUG) DoDebug(GetName(GetAreaFromLocation(lLoc)));
|
||
object oReturn;
|
||
if(GetPRCSwitch(PRC_LETOSCRIPT_PHEONIX_SYNTAX))
|
||
{
|
||
oReturn = RetrieveCampaignObject(DB_NAME, DB_GATEWAY_VAR, lLoc);
|
||
}
|
||
else
|
||
{
|
||
if(GetPRCSwitch(PRC_LETOSCRIPT_UNICORN_SQL))
|
||
{
|
||
string sSQL = "SELECT blob FROM "+DB_NAME+" WHERE "+DB_GATEWAY_VAR+"="+DB_GATEWAY_VAR+" LIMIT 1";
|
||
SetLocalString(GetModule(), "NWNX!ODBC!SETSCORCOSQL", sSQL);
|
||
oReturn = RetrieveCampaignObject("NWNX", "-", lLoc);
|
||
}
|
||
else
|
||
{
|
||
oReturn = RetrieveCampaignObject(DB_NAME, DB_GATEWAY_VAR, lLoc);
|
||
}
|
||
}
|
||
if (DEBUG) DoDebug(GetName(oReturn));
|
||
SetLocalString(GetModule(), "LetoResult", sResult);
|
||
AssignCommand(GetModule(), DelayCommand(1.0, DeleteLocalString(GetModule(), "LetoResult")));
|
||
SetLocalObject(GetModule(), "LetoResultObject", oReturn);
|
||
AssignCommand(GetModule(), DelayCommand(1.0, DeleteLocalObject(GetModule(), "LetoResultObject")));
|
||
SetLocalString(GetModule(), "LetoResultThread", sThreadID);
|
||
AssignCommand(GetModule(), DelayCommand(1.0, DeleteLocalString(GetModule(), "LetoResultThread")));
|
||
ExecuteScript(sScript, OBJECT_SELF);
|
||
}
|
||
}
|
||
|
||
void VoidRunStackedLetoScriptOnObject(object oObject, string sLetoTag = "OBJECT",
|
||
string sType = "SCRIPT", string sPollScript = "", int nDestroyOriginal = TRUE)
|
||
{
|
||
RunStackedLetoScriptOnObject(oObject,sLetoTag,sType,sPollScript,nDestroyOriginal);
|
||
}
|
||
|
||
object RunStackedLetoScriptOnObject(object oObject, string sLetoTag = "OBJECT",
|
||
string sType = "SCRIPT", string sPollScript = "", int nDestroyOriginal = TRUE)
|
||
{
|
||
if(!GetIsObjectValid(oObject))
|
||
{
|
||
WriteTimestampedLogEntry("ERROR: "+GetName(oObject)+"is invalid");
|
||
WriteTimestampedLogEntry("Script was "+GetLocalString(GetModule(), "LetoScript"));
|
||
return OBJECT_INVALID;
|
||
}
|
||
string sCommand;
|
||
object oReturn;
|
||
location lLoc;
|
||
object oWPLimbo = GetObjectByTag("HeartOfChaos");
|
||
location lLimbo;
|
||
if(GetIsObjectValid(oWPLimbo))
|
||
lLimbo = GetLocation(oWPLimbo);
|
||
else
|
||
lLimbo = GetStartingLocation();
|
||
string sScript = GetLocalString(GetModule(), "LetoScript");
|
||
DeleteLocalString(GetModule(), "LetoScript");
|
||
string sScriptResult;
|
||
//check if its a DM or PC
|
||
//these use bic files
|
||
if(GetIsPC(oObject) || GetIsDM(oObject))
|
||
{
|
||
if(!nDestroyOriginal)//dont boot
|
||
{
|
||
string sPath = GetLocalString(oObject, "Leto_Path");
|
||
if(GetPRCSwitch(PRC_LETOSCRIPT_PHEONIX_SYNTAX))
|
||
{
|
||
sCommand = "<file:open '"+sLetoTag+"' <qq:"+sPath+">>";
|
||
sScript = sCommand+sScript;
|
||
sCommand = "<file:close '"+sLetoTag+"'>";
|
||
sScript = sScript+sCommand;
|
||
//unicorn
|
||
}
|
||
else
|
||
{
|
||
if(GetPRCSwitch(PRC_LETOSCRIPT_GETNEWESTBIC))
|
||
{
|
||
sCommand = "%"+sLetoTag+" = FindNewestBic('"+GetNWNDir()+"servervault/"+GetLocalString(oObject, "PCPlayerName")+"'); ";
|
||
}
|
||
else
|
||
{
|
||
//unicorn syntax
|
||
sCommand = "%"+sLetoTag+" = q{"+sPath+"}; "; //qq{} doesnt work for me at the moment, wrong slashes
|
||
}
|
||
sScript = sCommand+sScript;
|
||
sCommand = "close %"+sLetoTag+"; ";
|
||
sScript = sScript+sCommand;
|
||
|
||
|
||
|
||
}
|
||
sScriptResult = LetoScript(sScript, sType, sPollScript);
|
||
}
|
||
else//boot
|
||
{
|
||
//this triggers the OnExit code to fire the letoscript
|
||
SetLocalString(oObject, "LetoScript", GetLocalString(oObject, "LetoScript")+sScript);
|
||
if(GetLocalString(GetModule(), PRC_LETOSCRIPT_PORTAL_IP) == "")
|
||
{
|
||
BootPC(oObject);
|
||
}
|
||
else
|
||
{
|
||
ActivatePortal(oObject,
|
||
GetLocalString(GetModule(), PRC_LETOSCRIPT_PORTAL_IP),
|
||
GetLocalString(GetModule(), PRC_LETOSCRIPT_PORTAL_PASSWORD),
|
||
"", //waypoint, may need to change
|
||
TRUE);
|
||
}
|
||
return oReturn;
|
||
}
|
||
}
|
||
//its an NPC/Placeable/Item, go through DB
|
||
else if(GetObjectType(oObject) == OBJECT_TYPE_CREATURE
|
||
|| GetObjectType(oObject) == OBJECT_TYPE_ITEM
|
||
|| GetObjectType(oObject) == OBJECT_TYPE_PLACEABLE
|
||
|| GetObjectType(oObject) == OBJECT_TYPE_STORE
|
||
|| GetObjectType(oObject) == OBJECT_TYPE_WAYPOINT)
|
||
{
|
||
if(GetPRCSwitch(PRC_LETOSCRIPT_PHEONIX_SYNTAX))
|
||
{
|
||
//Put object into DB
|
||
StoreCampaignObject(DB_NAME, DB_GATEWAY_VAR, oObject);
|
||
// Reaquire DB with new object in it
|
||
sCommand += "<file:open FPT <qq:" + GetNWNDir() + "database/" + DB_NAME + ".fpt>>";
|
||
//Extract object from DB
|
||
sCommand += "<fpt:extract FPT '"+DB_GATEWAY_VAR+"' "+sLetoTag+">";
|
||
sCommand += "<file:close FPT>";
|
||
sCommand += "<file:use "+sLetoTag+">";
|
||
}
|
||
else
|
||
{
|
||
if(GetPRCSwitch(PRC_LETOSCRIPT_UNICORN_SQL))
|
||
{
|
||
//unicorn
|
||
//Put object into DB
|
||
string sSQL = "SELECT "+DB_GATEWAY_VAR+" FROM "+DB_NAME+" WHERE "+DB_GATEWAY_VAR+"="+DB_GATEWAY_VAR+" LIMIT 1";
|
||
PRC_SQLExecDirect(sSQL);
|
||
|
||
if (PRC_SQLFetch() == PRC_SQL_SUCCESS)
|
||
{
|
||
// row exists
|
||
sSQL = "UPDATE "+DB_NAME+" SET val=%s WHERE "+DB_GATEWAY_VAR+"="+DB_GATEWAY_VAR;
|
||
SetLocalString(GetModule(), "NWNX!ODBC!SETSCORCOSQL", sSQL);
|
||
}
|
||
else
|
||
{
|
||
// row doesn't exist
|
||
// assume table doesnt exist too
|
||
sSQL = "CREATE TABLE "+DB_NAME+" ( "+DB_GATEWAY_VAR+" TEXT, blob BLOB )";
|
||
PRC_SQLExecDirect(sSQL);
|
||
sSQL = "INSERT INTO "+DB_NAME+" ("+DB_GATEWAY_VAR+", blob) VALUES" +
|
||
"("+DB_GATEWAY_VAR+", %s)";
|
||
SetLocalString(GetModule(), "NWNX!ODBC!SETSCORCOSQL", sSQL);
|
||
}
|
||
StoreCampaignObject ("NWNX", "-", oObject);
|
||
// Reaquire DB with new object in it
|
||
//force data to be written to disk
|
||
sSQL = "COMMIT";
|
||
PRC_SQLExecDirect(sSQL);
|
||
sCommand += "sql.connect 'root', '' or die $!; ";
|
||
sCommand += "sql.query 'SELECT blob FROM "+DB_NAME+" WHERE "+DB_GATEWAY_VAR+"="+DB_GATEWAY_VAR+" LIMIT 1'; ";
|
||
sCommand += "sql.retrieve %"+sLetoTag+"; ";
|
||
}
|
||
else
|
||
{
|
||
//Put object into DB
|
||
StoreCampaignObject(DB_NAME, DB_GATEWAY_VAR, oObject);
|
||
sCommand += "%"+sLetoTag+"; ";
|
||
//Extract object from DB
|
||
sCommand += "extract '"+GetNWNDir()+"database/"+DB_NAME+".fpt', '"+DB_GATEWAY_VAR+"', %"+sLetoTag+" or die $!;";
|
||
}
|
||
}
|
||
//store their location
|
||
lLoc = GetLocation(oObject);
|
||
if(!GetIsObjectValid(GetAreaFromLocation(lLoc)))
|
||
lLoc = GetStartingLocation();
|
||
|
||
sScript = sCommand + sScript;
|
||
sCommand = "";
|
||
|
||
//destroy the original
|
||
if(nDestroyOriginal)
|
||
{
|
||
AssignCommand(oObject, SetIsDestroyable(TRUE));
|
||
DestroyObject(oObject);
|
||
//its an NPC/Placeable/Item, go through DB
|
||
if(GetPRCSwitch(PRC_LETOSCRIPT_PHEONIX_SYNTAX))
|
||
{
|
||
sCommand = "<file:open FPT <qq:" + GetNWNDir() + "database/" + DB_NAME + ".fpt>>";
|
||
sCommand += "<fpt:replace FPT '" +DB_GATEWAY_VAR+ "' "+sLetoTag+">";
|
||
sCommand += "<file:save FPT>";
|
||
sCommand += "<file:close FPT>";
|
||
sCommand += "<file:close "+sLetoTag+">";
|
||
}
|
||
else
|
||
{
|
||
if(GetPRCSwitch(PRC_LETOSCRIPT_UNICORN_SQL))
|
||
{
|
||
//unicorn
|
||
sCommand += "sql.query 'SELECT blob FROM "+DB_NAME+" WHERE "+DB_GATEWAY_VAR+"="+DB_GATEWAY_VAR+" LIMIT 1'; ";
|
||
sCommand += "sql.store %"+sLetoTag+"; ";
|
||
sCommand += "close %"+sLetoTag+"; ";
|
||
}
|
||
else
|
||
{
|
||
sCommand += "inject '"+GetNWNDir()+"database/"+DB_NAME+".fpt', '"+DB_GATEWAY_VAR+"', %"+sLetoTag+" or die $!;";
|
||
sCommand += "close %"+sLetoTag+"; ";
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if(GetPRCSwitch(PRC_LETOSCRIPT_PHEONIX_SYNTAX))
|
||
sCommand += "<file:close "+sLetoTag+">";
|
||
else
|
||
sCommand += "close %"+sLetoTag+"; ";
|
||
}
|
||
|
||
sScript = sScript + sCommand;
|
||
sScriptResult = LetoScript(sScript, sType, sPollScript);
|
||
|
||
if(nDestroyOriginal && sType != "SPAWN")
|
||
{
|
||
if(GetPRCSwitch(PRC_LETOSCRIPT_PHEONIX_SYNTAX))
|
||
{
|
||
if(GetObjectType(oObject) == OBJECT_TYPE_CREATURE)
|
||
{
|
||
oReturn = RetrieveCampaignObject(DB_NAME, DB_GATEWAY_VAR, lLimbo);
|
||
AssignCommand(oReturn, JumpToLocation(lLoc));
|
||
}
|
||
else
|
||
oReturn = RetrieveCampaignObject(DB_NAME, DB_GATEWAY_VAR, lLoc);
|
||
}
|
||
else
|
||
{
|
||
if(GetPRCSwitch(PRC_LETOSCRIPT_UNICORN_SQL))
|
||
{
|
||
string sSQL = "SELECT blob FROM "+DB_NAME+" WHERE "+DB_GATEWAY_VAR+"="+DB_GATEWAY_VAR+" LIMIT 1";
|
||
SetLocalString(GetModule(), "NWNX!ODBC!SETSCORCOSQL", sSQL);
|
||
if(GetObjectType(oObject) == OBJECT_TYPE_CREATURE)
|
||
{
|
||
oReturn = RetrieveCampaignObject("NWNX", "-", lLimbo);
|
||
AssignCommand(oReturn, JumpToLocation(lLoc));
|
||
}
|
||
else
|
||
oReturn = RetrieveCampaignObject("NWNX", "-", lLoc);
|
||
}
|
||
else
|
||
{
|
||
if(GetObjectType(oObject) == OBJECT_TYPE_CREATURE)
|
||
{
|
||
oReturn = RetrieveCampaignObject(DB_NAME, DB_GATEWAY_VAR, lLimbo);
|
||
AssignCommand(oReturn, JumpToLocation(lLoc));
|
||
}
|
||
else
|
||
oReturn = RetrieveCampaignObject(DB_NAME, DB_GATEWAY_VAR, lLoc);
|
||
}
|
||
}
|
||
}
|
||
else if(nDestroyOriginal && sType == "SPAWN")
|
||
{
|
||
SetLocalLocation(GetModule(), "Thread"+IntToString(StringToInt(sScriptResult))+"_loc", lLoc);
|
||
if (DEBUG) DoDebug("Thread"+IntToString(StringToInt(sScriptResult))+"_loc");
|
||
}
|
||
}
|
||
SetLocalString(GetModule(), "LetoResult", sScriptResult);
|
||
AssignCommand(GetModule(), DelayCommand(1.0, DeleteLocalString(GetModule(), "LetoResult")));
|
||
|
||
return oReturn;
|
||
} |