DMH-Online

Dungeon Masters Helper · Est. 2005

Misc Scripts

NWN Script: pers_world_database.htm

Author Sticky: Post Working Scripts Here
Zane_NBK Posted: Saturday, 29 June 08:16PM
Title: PWDB - Persistant World Database (Ok, it's no Oracle )

This script exposes a set of functions that behave like GetLocalString, GetLocalInt, GetLocalFloat, GetLocalLocation and GetLocalObject. They're named GetPersistant<Type> (ie: GetPersistantString). The only caveat is that Persistant objects are saved by a Tag + Name identifier, so you want to make sure any objects that are important (that you want to store as a persistant var) have a unique Tag + Name in your module. Player variables are stored under PCPlayerName (login ID) + Char Name.

PWDBSaveAll() and PWDBSaveChanged() (called from the heartbeat script) output two scripts in your log file (enclosed in <script> tags) called PWDBLoad() and PWDBLoadChanged(). When you edit a module (add areas, etc..) you copy the latest versions of those from the log file to pwdb_data (instructions included in that script). If PWDBLoad() is newer than PWDBLoadChanged() then you won't need a PWDBLoadChanged().

Any script that uses the persistant variables will have to include pwdb_functions.

Steps:

1) Create a 2x2 area with the micro tileset, name it anything.
2) Create two objects, one with a tag "PWDB_OBJECTS" and another with the tag "PWDB_VALUES". Place these two objects anywhere in the area you created.
3) Add pwdb_data and pwdb_functions scripts to your module.
4) Look at the example heart_beat, client_exit, and mod_load scripts for saving/load and getting/setting variables.

Main scripts:

pwdb_functions:
NWScript:
//:://////////////////////////////////////////////////
//:: Created By:   E.J. Wilburn - zane@supernova.org
//:: Created On:   6/28/2002
//:://////////////////////////////////////////////////
/*
    Persistant World DB functions.
*/
// Get our persistant ID, if one isn't in the ID list and bCreate is set
// to TRUE then create a new ID and return it, else return 0.
int GetID(string sKey, int bCreate = FALSE)
{
    object oPWDBObjs = GetObjectByTag("PWDB_OBJECTS");
    int iID = GetLocalInt(oPWDBObjs, sKey);
    if (!iID && bCreate)
    {
        iID = GetLocalInt(oPWDBObjs, "COUNT") + 1;
        SetLocalInt(oPWDBObjs, "COUNT", iID);
        SetLocalInt(oPWDBObjs, sKey, iID);
        SetLocalString(oPWDBObjs, IntToString(iID), sKey);
    }
    return iID;
}
// Determine an Object's key.
string GetKey(object oTarget)
{
    string sKey;
    if (GetIsPC(oTarget))
        sKey = GetPCPlayerName(oTarget) + "," + GetName(oTarget);
    else
        sKey = GetTag(oTarget) + "," + GetName(oTarget);
    return sKey;
}
// Get a persistant var ID, if the var isn't in the list and bCreate is TRUE
// then create the ID and return it, else return 0.
// iObjID is obtained from GetID, sVarName is the Variable Name to retrieve.
int GetVarID(int iObjID, string sVarName, int bCreate = FALSE)
{
    string sKey = IntToString(iObjID) + "_" + sVarName;
    object oPWDBVars = GetObjectByTag("PWDB_VALUES");
    int iID = GetLocalInt(oPWDBVars, sKey);
    if (!iID && bCreate)
    {
        iID = GetLocalInt(oPWDBVars, "COUNT") + 1;
        SetLocalInt(oPWDBVars, "COUNT", iID);
        SetLocalInt(oPWDBVars, sKey, iID);
        string sID = IntToString(iID);
        SetLocalString(oPWDBVars, sID + "_KEY", sKey);
        SetLocalString(oPWDBVars, sID + "_VARNAME", sVarName);
        SetLocalInt(oPWDBVars, sID + "_OWNER", iObjID);
        SetLocalInt(oPWDBVars, sID + "_CHANGED", 1);
    }
    return iID;
}
string GetPersistantString(object oTarget, string sName)
{
    // Get our object's persistant ID.
    int iObjID = GetID(GetKey(oTarget));
    if (!iObjID)
        return "";
    int iVarID = GetVarID(iObjID, "S" + sName);
    if (!iVarID)
        return "";
    object oPWDBValues = GetObjectByTag("PWDB_VALUES");
    return GetLocalString(oPWDBValues, IntToString(iVarID) + "_VALUE");
}
int GetPersistantInt(object oTarget, string sName)
{
    // Get our object's persistant ID.
    int iObjID = GetID(GetKey(oTarget));
    if (!iObjID)
        return 0;
    int iVarID = GetVarID(iObjID, "I" + sName);
    if (!iVarID)
        return 0;
    object oPWDBValues = GetObjectByTag("PWDB_VALUES");
    return GetLocalInt(oPWDBValues, IntToString(iVarID) + "_VALUE");
}
float GetPersistantFloat(object oTarget, string sName)
{
    // Get our object's persistant ID.
    int iObjID = GetID(GetKey(oTarget));
    if (!iObjID)
        return 0.0f;
    int iVarID = GetVarID(iObjID, "F" + sName);
    if (!iVarID)
        return 0.0f;
    object oPWDBValues = GetObjectByTag("PWDB_VALUES");
    return GetLocalFloat(oPWDBValues, IntToString(iVarID) + "_VALUE");
}
location GetPersistantLocation(object oTarget, string sName)
{
    // Get our object's persistant ID.
    int iObjID = GetID(GetKey(oTarget));
    int iVarID = GetVarID(iObjID, "L" + sName);
    object oPWDBValues = GetObjectByTag("PWDB_VALUES");
    return GetLocalLocation(oPWDBValues, IntToString(iVarID) + "_VALUE");
}
object GetPersistantObject(object oTarget, string sName)
{
    // Get our object's persistant ID.
    int iObjID = GetID(GetKey(oTarget));
    if (!iObjID)
        return OBJECT_INVALID;
    int iVarID = GetVarID(iObjID, "O" + sName);
    if (!iVarID)
        return OBJECT_INVALID;
    object oPWDBValues = GetObjectByTag("PWDB_VALUES");
    return GetLocalObject(oPWDBValues, IntToString(iVarID) + "_VALUE");
}
void SetPersistantStringByKey(string sKey, string sName, string sValue, int bMarkChanged = TRUE)
{
    // Get our object's persistant ID.
    int iObjID = GetID(sKey, TRUE);
    int iVarID = GetVarID(iObjID, "S" + sName, TRUE);
    object oPWDBValues = GetObjectByTag("PWDB_VALUES");
    string sVarID = IntToString(iVarID);
    SetLocalString(oPWDBValues, sVarID + "_VALUE", sValue);
    if (bMarkChanged)
    {
        SetLocalInt(oPWDBValues, sVarID + "_CHANGED", 1);
        SetLocalInt(oPWDBValues, "CHANGED", 1);
    }
    DeleteLocalInt(oPWDBValues, sVarID + "_DELETED");
}
void SetPersistantString(object oTarget, string sName, string sValue)
{
    SetPersistantStringByKey(GetKey(oTarget), sName, sValue);
}
void SetPersistantIntByKey(string sKey, string sName, int iValue, int bMarkChanged = TRUE)
{
    // Get our object's persistant ID.
    int iObjID = GetID(sKey, TRUE);
    int iVarID = GetVarID(iObjID, "I" + sName, TRUE);
    object oPWDBValues = GetObjectByTag("PWDB_VALUES");
    string sVarID = IntToString(iVarID);
    SetLocalInt(oPWDBValues, sVarID + "_VALUE", iValue);
    if (bMarkChanged)
    {
        SetLocalInt(oPWDBValues, sVarID + "_CHANGED", 1);
        SetLocalInt(oPWDBValues, "CHANGED", 1);
    }
    DeleteLocalInt(oPWDBValues, sVarID + "_DELETED");
}
void SetPersistantInt(object oTarget, string sName, int iValue)
{
    SetPersistantIntByKey(GetKey(oTarget), sName, iValue);
}
void SetPersistantFloatByKey(string sKey, string sName, float fValue, int bMarkChanged = TRUE)
{
    // Get our object's persistant ID.
    int iObjID = GetID(sKey, TRUE);
    int iVarID = GetVarID(iObjID, "F" + sName, TRUE);
    object oPWDBValues = GetObjectByTag("PWDB_VALUES");
    string sVarID = IntToString(iVarID);
    SetLocalFloat(oPWDBValues, sVarID + "_VALUE", fValue);
    if (bMarkChanged)
    {
        SetLocalInt(oPWDBValues, sVarID + "_CHANGED", 1);
        SetLocalInt(oPWDBValues, "CHANGED", 1);
    }
    DeleteLocalInt(oPWDBValues, sVarID + "_DELETED");
}
void SetPersistantFloat(object oTarget, string sName, float fValue)
{
    SetPersistantFloatByKey(GetKey(oTarget), sName, fValue);
}
void SetPersistantLocationByKey(string sKey, string sName, location lValue, int bMarkChanged = TRUE)
{
    // Get our object's persistant ID.
    int iObjID = GetID(sKey, TRUE);
    int iVarID = GetVarID(iObjID, "L" + sName, TRUE);
    object oPWDBValues = GetObjectByTag("PWDB_VALUES");
    string sVarID = IntToString(iVarID);
    SetLocalLocation(oPWDBValues, sVarID + "_VALUE", lValue);
    if (bMarkChanged)
    {
        SetLocalInt(oPWDBValues, sVarID + "_CHANGED", 1);
        SetLocalInt(oPWDBValues, "CHANGED", 1);
    }
    DeleteLocalInt(oPWDBValues, sVarID + "_DELETED");
}
void SetPersistantLocation(object oTarget, string sName, location lValue)
{
    SetPersistantLocationByKey(GetKey(oTarget), sName, lValue);
}
void SetPersistantObjectByKey(string sKey, string sName, object oValue, int bMarkChanged = TRUE)
{
    // Get our object's persistant ID.
    int iObjID = GetID(sKey, TRUE);
    int iVarID = GetVarID(iObjID, "O" + sName, TRUE);
    object oPWDBValues = GetObjectByTag("PWDB_VALUES");
    string sVarID = IntToString(iVarID);
    SetLocalObject(oPWDBValues, sVarID + "_VALUE", oValue);
    if (bMarkChanged)
    {
        SetLocalInt(oPWDBValues, sVarID + "_CHANGED", 1);
        SetLocalInt(oPWDBValues, "CHANGED", 1);
    }
    DeleteLocalInt(oPWDBValues, sVarID + "_DELETED");
}
void SetPersistantObject(object oTarget, string sName, object oValue)
{
    SetPersistantObjectByKey(GetKey(oTarget), sName, oValue);
}
void DeletePersistantString(object oTarget, string sName)
{
    int iObjID = GetID(GetKey(oTarget));
    if (!iObjID)
        return;
    int iVarID = GetVarID(iObjID, "S" + sName);
    if (!iVarID)
        return;
    object oPWDBValues = GetObjectByTag("PWDB_VALUES");
    string sVarID = IntToString(iVarID);
    SetLocalInt(oPWDBValues, sVarID + "_DELETED", 1);
    DeleteLocalString(oPWDBValues, sVarID + "_VALUE");
    SetLocalInt(oPWDBValues, "CHANGED", 1);
}
void DeletePersistantInt(object oTarget, string sName)
{
    int iObjID = GetID(GetKey(oTarget));
    if (!iObjID)
        return;
    int iVarID = GetVarID(iObjID, "I" + sName);
    if (!iVarID)
        return;
    object oPWDBValues = GetObjectByTag("PWDB_VALUES");
    string sVarID = IntToString(iVarID);
    SetLocalInt(oPWDBValues, sVarID + "_DELETED", 1);
    DeleteLocalInt(oPWDBValues, sVarID + "_VALUE");
    SetLocalInt(oPWDBValues, "CHANGED", 1);
}
void DeletePersistantFloat(object oTarget, string sName)
{
    int iObjID = GetID(GetKey(oTarget));
    if (!iObjID)
        return;
    int iVarID = GetVarID(iObjID, "F" + sName);
    if (!iVarID)
        return;
    object oPWDBValues = GetObjectByTag("PWDB_VALUES");
    string sVarID = IntToString(iVarID);
    SetLocalInt(oPWDBValues, sVarID + "_DELETED", 1);
    DeleteLocalFloat(oPWDBValues, sVarID + "_VALUE");
    SetLocalInt(oPWDBValues, "CHANGED", 1);
}
void DeletePersistantLocation(object oTarget, string sName)
{
    int iObjID = GetID(GetKey(oTarget));
    if (!iObjID)
        return;
    int iVarID = GetVarID(iObjID, "L" + sName);
    if (!iVarID)
        return;
    object oPWDBValues = GetObjectByTag("PWDB_VALUES");
    string sVarID = IntToString(iVarID);
    SetLocalInt(oPWDBValues, sVarID + "_DELETED", 1);
    DeleteLocalLocation(oPWDBValues, sVarID + "_VALUE");
    SetLocalInt(oPWDBValues, "CHANGED", 1);
}
void DeletePersistantObject(object oTarget, string sName)
{
    int iObjID = GetID(GetKey(oTarget));
    if (!iObjID)
        return;
    int iVarID = GetVarID(iObjID, "O" + sName);
    if (!iVarID)
        return;
    object oPWDBValues = GetObjectByTag("PWDB_VALUES");
    string sVarID = IntToString(iVarID);
    SetLocalInt(oPWDBValues, sVarID + "_DELETED", 1);
    DeleteLocalObject(oPWDBValues, sVarID + "_VALUE");
    SetLocalInt(oPWDBValues, "CHANGED", 1);
}
void DeletePersistantByKey(string sOwnerKey, string sVarKey)
{
    int iObjID = GetID(sOwnerKey);
    if (!iObjID)
        return;
    int iVarID = GetVarID(iObjID, sVarKey);
    if (!iVarID)
        return;
    object oPWDBValues = GetObjectByTag("PWDB_VALUES");
    string sVarID = IntToString(iVarID);
    SetLocalInt(oPWDBValues, sVarID + "_DELETED", 1);
    string sType = GetStringLeft(sVarKey, 1);
    if (sType == "S")
        DeleteLocalString(oPWDBValues, sVarID + "_VALUE");
    else if (sType == "I")
        DeleteLocalInt(oPWDBValues, sVarID + "_VALUE");
    else if (sType == "F")
        DeleteLocalFloat(oPWDBValues, sVarID + "_VALUE");
    else if (sType == "L")
        DeleteLocalLocation(oPWDBValues, sVarID + "_VALUE");
    else if (sType == "O")
        DeleteLocalObject(oPWDBValues, sVarID + "_VALUE");
    if (!GetLocalInt(oPWDBValues, "CHANGED"))
        SetLocalInt(oPWDBValues, "CHANGED", 2);
}
// Save the persistant DB.  If bSaveNewOnly is set to TRUE then only objects
// created since the module was last loaded will be saved, else all objects
// are saved.
void PWDBSave(int bSaveNewOnly)
{
    object oPWDBObjs = GetObjectByTag("PWDB_OBJECTS");
    object oPWDBVars = GetObjectByTag("PWDB_VALUES");
    int iVarCount = GetLocalInt(oPWDBVars, "COUNT");
    int iCounter;
    string sID;
    string sType;
    string sVarName;
    string sFullVarName;
    int iObjID;
    string sOwnerKey;
    vector vPos;
    float fFacing;
    string sArea;
    location lLoc;
    int bDeleted;
    int bChanged;
    int iTotalChange = GetLocalInt(oPWDBVars, "CHANGED");
    if (bSaveNewOnly && iTotalChange != 1)
        return;
    else if (!bSaveNewOnly && iTotalChange == 0)
        return;
    // Output the header to the log file.
    if (bSaveNewOnly)
    {
        WriteTimestampedLogEntry("************************** BEGIN PWDB SAVE CHANGED *******************************");
        PrintString("<script type='changed'>");
        PrintString("void PWDBLoadChanged()\n{");
    }
    else
    {
        WriteTimestampedLogEntry("************************** BEGIN PWDB SAVE ALL ***********************************");
        PrintString("<script type='all'>");
        PrintString("void PWDBLoad()\n{");
    }
    PrintString("    vector vPos;\n    location lLoc;");
    for (iCounter = 1; iCounter <= iVarCount; iCounter++)
    {
        sID = IntToString(iCounter);
        bChanged = GetLocalInt(oPWDBVars, sID + "_CHANGED");
        if (bSaveNewOnly && !bChanged)
            continue;
        sFullVarName = GetLocalString(oPWDBVars, sID + "_VARNAME");
        bDeleted = GetLocalInt(oPWDBVars, sID + "_DELETED");
        sType = GetStringLeft(sFullVarName, 1);
        sVarName = GetStringRight(sFullVarName, GetStringLength(sFullVarName) - 1);
        iObjID = GetLocalInt(oPWDBVars, sID + "_OWNER");
        sOwnerKey = GetLocalString(oPWDBObjs, IntToString(iObjID));
        if (sType == "S")
        {
            if (bSaveNewOnly && bDeleted)
            {
                PrintString("    DeletePersistantByKey(&quot;" + sOwnerKey + "&quot;, &quot;" +
                            sFullVarName + "&quot;);");
            }
            else if ((!bSaveNewOnly || bChanged) && !bDeleted)
            {
                PrintString("    SetPersistantStringByKey(&quot;" + sOwnerKey +
                    "&quot;,&quot;" + sVarName + "&quot;, &quot;" + GetLocalString(oPWDBVars, sID + "_VALUE") +
                    "&quot;, FALSE);");
            }
            if (!bSaveNewOnly && bChanged)
                DeleteLocalInt(oPWDBVars, sID + "_CHANGED");
        }
        else if (sType == "I")
        {
            if (bSaveNewOnly && bDeleted)
            {
                PrintString("    DeletePersistantByKey(&quot;" + sOwnerKey + "&quot;, &quot;" +
                            sFullVarName + "&quot;);");
            }
            else if ((!bSaveNewOnly || bChanged) && !bDeleted)
            {
                PrintString("    SetPersistantIntByKey(&quot;" + sOwnerKey +
                    "&quot;, &quot;" + sVarName + "&quot;, " + IntToString(GetLocalInt(oPWDBVars, sID + "_VALUE")) +
                    ", FALSE);");
            }
            if (!bSaveNewOnly && bChanged)
                DeleteLocalInt(oPWDBVars, sID + "_CHANGED");
        }
        else if (sType == "F")
        {
            if (bSaveNewOnly && bDeleted)
            {
                PrintString("    DeletePersistantByKey(&quot;" + sOwnerKey + "&quot;, &quot;" +
                            sFullVarName + "&quot;);");
            }
            else if ((!bSaveNewOnly || bChanged) && !bDeleted)
            {
                PrintString("    SetPersistantFloatByKey(&quot;" + sOwnerKey +
                    "&quot;, &quot;" + sVarName + "&quot;, " + FloatToString(GetLocalFloat(oPWDBVars, sID + "_VALUE")) +
                    "f, FALSE);");
            }
            if (!bSaveNewOnly && bChanged)
                DeleteLocalInt(oPWDBVars, sID + "_CHANGED");
        }
        else if (sType == "L")
        {
            if (bSaveNewOnly && bDeleted)
            {
                PrintString("    DeletePersistantByKey(&quot;" + sOwnerKey + "&quot;, &quot;" +
                            sFullVarName + "&quot;);");
            }
            else if ((!bSaveNewOnly || bChanged) && !bDeleted)
            {
                lLoc = GetLocalLocation(oPWDBVars, sID + "_VALUE");
                vPos = GetPositionFromLocation(lLoc);
                fFacing = GetFacingFromLocation(lLoc);
                sArea = GetTag(GetAreaFromLocation(lLoc));
                PrintString("    vPos.x = " + FloatToString(vPos.x) + "f;");
                PrintString("    vPos.y = " + FloatToString(vPos.y) + "f;");
                PrintString("    vPos.z = " + FloatToString(vPos.z) + "f;");
                PrintString("    lLoc = Location(GetObjectByTag(&quot;" + sArea + "&quot;), vPos, " + FloatToString(fFacing) + "f);");
                PrintString("    SetPersistantLocationByKey(&quot;" + sOwnerKey +
                    "&quot;, &quot;" + sVarName + "&quot;, lLoc, FALSE);");
            }
            if (!bSaveNewOnly && bChanged)
                DeleteLocalInt(oPWDBVars, sID + "_CHANGED");
        }
        else if (sType == "O")
        {
            if (bSaveNewOnly && bDeleted)
            {
                PrintString("    DeletePersistantByKey(&quot;" + sOwnerKey + "&quot;, &quot;" +
                            sFullVarName + "&quot;);");
            }
            else if ((!bSaveNewOnly || bChanged) && !bDeleted)
            {
                PrintString("    SetPersistantObjectByKey(&quot;" + sOwnerKey +
                    "&quot;, &quot;" + sVarName + "&quot;, GetObjectByTag(&quot;" +
                    GetTag(GetLocalObject(oPWDBVars, sID + "_VALUE")) + "&quot;), FALSE);");
            }
            if (!bSaveNewOnly && bChanged)
                DeleteLocalInt(oPWDBVars, sID + "_CHANGED");
        }
    }
    // Output the footer to the log file.
    PrintString("}");
    PrintString("</script>");
    WriteTimestampedLogEntry("************************** END PWDB SAVE *****************************************");
    if (bSaveNewOnly)
        SetLocalInt(oPWDBVars, "CHANGED", 2);
    else
        SetLocalInt(oPWDBVars, "CHANGED", 0);
}
// This should be run in the modules OnUnload event; it dumps the entire
// persistant DB to the log file in script format.
void PWDBSaveAll()
{
    PWDBSave(FALSE);
}
// This should be run in the modules OnHeartBeat event and triggered every
// 10-15 minutes (more or less depending on how active your PW is).  It dumps
// all changed values since the module was loaded.  This is basically in case
// the module crashes before it has a chance to unload and call PWDBSaveAll.
// You should be able to use this script and the prior exit's script to get
// back up to date (or close).
void PWDBSaveChanged()
{
    PWDBSave(TRUE);
}



pwdb_data (with sample data):

NWScript:
//:://////////////////////////////////////////////////
//:: Created By:   E.J. Wilburn - zane@supernova.org
//:: Created On:   6/29/2002
//:://////////////////////////////////////////////////
// ***************************************************************************
// Past the loading functions from your log files here.  You should delete the
// prior functions before putting in the new ones unless you're doing a crash
// recovery.  In the case of a crash recovery keep your old script and add in
// the changed script and call both from your module OnLoad event.  This file
// should be included in your module's OnLoad script (as well as any others
// that need to take advantage of persistant variables).
//
// If your PWBLoad() is completely current and you don't need a PWDBLoadChanged()
// then empty the contents of PWDBLoadChanged() but keep that function here.
//
// *** REMEMBER TO HIT CTRL-R AND REPLACE ALL &QUOT; WITH A DOUBLE QUOTE (")
#include "pwdb_functions"
void PWDBLoad()
{
}
void PWDBLoadChanged()
{
    vector vPos;
    location lLoc;
    vPos.x =      119.453514099f;
    vPos.y =       12.346485138f;
    vPos.z =        0.000000000f;
    lLoc = Location(GetObjectByTag("Loquefort"), vPos,        6.364533424f);
    SetPersistantLocationByKey("Zane_NBK,Clayman Orin", "PV_START_LOCATION", lLoc);
    SetPersistantStringByKey("Zane_NBK,Clayman Orin","PV_TEST_STRING", "Testing");
    SetPersistantIntByKey("Zane_NBK,Clayman Orin", "PV_TEST_INT", 99);
    SetPersistantFloatByKey("Zane_NBK,Clayman Orin", "PV_TEST_FLOAT",        9.899999619f);
    SetPersistantObjectByKey("Zane_NBK,Clayman Orin", "PV_TEST_OBJECT", GetObjectByTag("Loquefort"));
}



Sample usage scripts:

module_OnLoad:

NWScript:
//:://////////////////////////////////////////////////
//:: Created By:   E.J. Wilburn - zane@supernova.org
//:: Created On:   6/28/2002
//:://////////////////////////////////////////////////
/*
  Load the persistant database here.
*/
#include "pwdb_data"
void main()
{
    PWDBLoad();
    PWDBLoadChanged();
}



module_OnHeartbeat:

NWScript:
//:://////////////////////////////////////////////////
//:: Created By:   E.J. Wilburn - zane@supernova.org
//:: Created On:   6/28/2002
//:://////////////////////////////////////////////////
// Saves the changes to the persistant DBs.
#include "pwdb_functions"
void main()
{
    // Set some test vars on PCs who haven't had them.
    object oPC = GetFirstPC();
    while (oPC != OBJECT_INVALID)
    {
        if (GetLocalInt(oPC, "PV_TEST_VARS_SET"))
        {
          oPC = GetNextPC();
          continue;
        }
        SetPersistantLocation(oPC, "PV_START_LOCATION", GetLocation(oPC));
        SetPersistantString(oPC, "PV_TEST_STRING", "Testing");
        SetPersistantInt(oPC, "PV_TEST_INT", 99);
        SetPersistantFloat(oPC, "PV_TEST_FLOAT", 9.9f);
        SetPersistantObject(oPC, "PV_TEST_OBJECT", GetArea(oPC));
        SetLocalInt(oPC, "PV_TEST_VARS_SET", 1);
        oPC = GetNextPC();
    }
    object oMod = GetModule();
    int iHeartBeat = GetLocalInt(oMod, "TMP_HBMONITOR");
    if (iHeartBeat == 0)
    {
        SetLocalInt(oMod, "TMP_HBMONITOR", 1);
        PWDBSaveAll();
    }
    else
    {
        SetLocalInt(oMod, "TMP_HBMONITOR", 0);
        PWDBSaveChanged();
    }
    // If all clients have left, save the entire database.
    object oTemp = GetFirstPC();
    int iPlayerCount = 0;
    while (oTemp != OBJECT_INVALID)
    {
        iPlayerCount++;
        oTemp = GetNextPC();
    }
    int iSavedAll = GetLocalInt(oMod, "PWDB_SAVEDALL");
    if (iPlayerCount < 1 && !iSavedAll)
    {
        SetLocalInt(oMod, "PWDB_SAVEDALL", 1);
        PWDBSaveAll();
    }
    else if (iPlayerCount > 0 && iSavedAll)
    {
        SetLocalInt(oMod, "PWDB_SAVEDALL", 0);
    }
}



module_OnClientExit:

NWScript:
//:://////////////////////////////////////////////////
//:: Created By:   E.J. Wilburn - zane@supernova.org
//:: Created On:   6/26/2002
//:://////////////////////////////////////////////////
/*
  Store the player's location in a persistant variable.
*/
#include "pwdb_functions"
void main()
{
    object oClient = GetExitingObject();
    // Exit and do nothing if this isn't a player.
    if (!GetIsPC(oClient))
        return;
    SetPersistantLocation(oClient, "PV_START_LOCATION", GetLocation(oClient));
    SetPersistantString(oClient, "PV_TEST_STRING", "Testing");
    SetPersistantInt(oClient, "PV_TEST_INT", 99);
    SetPersistantFloat(oClient, "PV_TEST_FLOAT", 9.9f);
    SetPersistantObject(oClient, "PV_TEST_OBJECT", GetArea(oClient));
}



player_OnRest:

NWScript:
//:://////////////////////////////////////////////////
//:: Created By:   E.J. Wilburn - zane@supernova.org
//:: Created On:   6/29/2002
//:://////////////////////////////////////////////////
// Temp script to test PW Variables.
#include "pwdb_functions"
void main()
{
    object oPC = GetLastPCRested();
    if (GetLocalInt(oPC, "TMP_REST_RUN") == 0)
    {
        if (GetPersistantInt(oPC, "PV_TEST_INT"))
        {
            DeletePersistantInt(oPC, "PV_TEST_INT");
            SendMessageToPC(oPC, "Deleted test int.");
        }
        else
        {
            int iRand = Random(9999);
            SetPersistantInt(oPC, "PV_TEST_INT", iRand);
            SendMessageToPC(oPC, "Set test int to " + IntToString(iRand) + ".");
        }
        SetLocalInt(oPC, "TMP_REST_RUN", 1);
    }
    else
        SetLocalInt(oPC, "TMP_REST_RUN", 0);
}



my_foyer_enter:

NWScript:
//:://////////////////////////////////////////////////
//:: Created By:   E.J. Wilburn - zane@supernova.org
//:: Created On:   6/26/2002
//:://////////////////////////////////////////////////
/*
    Respawn players according to their saved location on logout
    or a racial specific location if this is their first time
    logging in.  (Or the location object is missing for some reason)
*/
#include "pwdb_functions"
// Return a PC race name by integer (from GetRacialType)
string GetRaceName(int iRace)
{
    switch (iRace)
    {
        case RACIAL_TYPE_HUMAN:
            return "HUMAN";
        case RACIAL_TYPE_ELF:
            return "ELF";
        case RACIAL_TYPE_GNOME:
            return "GNOME";
        case RACIAL_TYPE_HALFELF:
            return "HALFELF";
        case RACIAL_TYPE_HALFLING:
            return "HALFLING";
        case RACIAL_TYPE_HALFORC:
            return "HALFORC";
        case RACIAL_TYPE_DWARF:
            return "DWARF";
    }
    return "UNKNOWN";
}
location GetRaceLocation(object oPC)
{
    //* Place PC in the proper starting town.
    string sDefaultDest = "NW_DEFAULT_START";
    string sDestTag = "NW_";
    string sRace = GetRaceName(GetRacialType(oPC));
    if (sRace != "UNKNOWN")
        sDestTag = sDestTag + sRace + "_START";
    else
        sDestTag = sDefaultDest;
    int iValidSpawn = 0;
    if (GetIsObjectValid(GetObjectByTag(sDestTag)))
    {
        iValidSpawn = 1;
    }
    else if (sDestTag != sDefaultDest && GetIsObjectValid(GetObjectByTag(sDefaultDest)))
    {
        // Unable to find the race specific start point, trying default start point.
        sDestTag = sDefaultDest;
        iValidSpawn = 1;
    }
    SetLocalInt(oPC, "TMP_VALID_SPAWN", iValidSpawn);
    return GetLocation(GetObjectByTag(sDestTag));
}
location GetSavedLocation(object oPC)
{
    location lLoc = GetPersistantLocation(oPC, "PV_START_LOCATION");
    if (GetAreaFromLocation(lLoc) == OBJECT_INVALID)
        SetLocalInt(oPC, "TMP_VALID_SPAWN", 0);
    else
        SetLocalInt(oPC, "TMP_VALID_SPAWN", 1);
    return lLoc;
}
void main()
{
    location lStartPoint;
    object oClient = GetEnteringObject();
    // Exit and do nothing if this isn't a player.
    if (!GetIsPC(oClient))
        return;
    PrintString("PName: " + GetPCPlayerName(oClient) + ", Name: " + GetName(oClient) + ".\n");
    // First check and see if the player has a saved prior location.
    lStartPoint = GetSavedLocation(oClient);
    if (GetLocalInt(oClient, "TMP_VALID_SPAWN") == 0)
        lStartPoint = GetRaceLocation(oClient);
    int iValidSpawn = GetLocalInt(oClient, "TMP_VALID_SPAWN");
    DeleteLocalInt(oClient, "TMP_VALID_SPAWN");
    // If the start is valid, move us there, else do nothing and let the game
    // use the standard start point.
    if (iValidSpawn == 1)
        AssignCommand(oClient, JumpToLocation(lStartPoint));
    else
        WriteTimestampedLogEntry("ERROR: Unable to find spawn point for player.  Player: " +
            GetPCPlayerName(oClient)+ ", Char: " + GetName(oClient) +
            ", Race: " + GetRaceName(GetRacialType(oClient)) + ".\n");
 }



Feel free to e-mail me bugs and stuff.

⌂ All Scripts ← PreviousNext → 👁 Category List

All Misc Scripts

📄 arena 📄 cast_bless_on_PC 📄 change_music 📄 chess_game 📄 climbing 📄 climbing_002 📄 common_includes_002 📄 cone_aoe 📄 cron 📄 cross_country_travel 📄 daoc_style_graves 📄 determine_time 📄 effects 📄 escort 📄 ez_respawn 📄 faction 📄 floating_text 📄 function_includes 📄 gambling 📄 include_sounds 📄 include_time_date 📄 jail 📄 jail_system 📄 journal_entry 📄 logbook 📄 manage_action_queue 📄 mmorpg_vault 📄 mod_intro 📄 mod_intro_002 📄 mod_intro_003 📄 mod_intro_005 📄 pers_world_database 📄 pers_world_database_002 📄 piller_of_fire 📄 plot_item 📄 portal_system 📄 portal_system_002 📄 puking 📄 quest_escort 📄 rep_per 📄 reward_rp 📄 rotation 📄 save_pc_location_002 📄 save_pc_location_003 📄 skill_checks 📄 skill_checks_002 📄 slot_machine 📄 story 📄 swimming 📄 take20_bypass 📄 vis_waypoint 📄 working_temple 📄 working_temple_002 📄 xp_gold_loss 📄 xp_gold_loss_002 📄 xp_loss_action