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.