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:
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;
}
string GetKey(object oTarget)
{
string sKey;
if (GetIsPC(oTarget))
sKey = GetPCPlayerName(oTarget) + "," + GetName(oTarget);
else
sKey = GetTag(oTarget) + "," + GetName(oTarget);
return sKey;
}
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)
{
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)
{
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)
{
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)
{
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)
{
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)
{
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)
{
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)
{
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)
{
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)
{
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);
}
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;
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("" + sOwnerKey + "", "" +
sFullVarName + "");");
}
else if ((!bSaveNewOnly || bChanged) && !bDeleted)
{
PrintString(" SetPersistantStringByKey("" + sOwnerKey +
"","" + sVarName + "", "" + GetLocalString(oPWDBVars, sID + "_VALUE") +
"", FALSE);");
}
if (!bSaveNewOnly && bChanged)
DeleteLocalInt(oPWDBVars, sID + "_CHANGED");
}
else if (sType == "I")
{
if (bSaveNewOnly && bDeleted)
{
PrintString(" DeletePersistantByKey("" + sOwnerKey + "", "" +
sFullVarName + "");");
}
else if ((!bSaveNewOnly || bChanged) && !bDeleted)
{
PrintString(" SetPersistantIntByKey("" + sOwnerKey +
"", "" + sVarName + "", " + IntToString(GetLocalInt(oPWDBVars, sID + "_VALUE")) +
", FALSE);");
}
if (!bSaveNewOnly && bChanged)
DeleteLocalInt(oPWDBVars, sID + "_CHANGED");
}
else if (sType == "F")
{
if (bSaveNewOnly && bDeleted)
{
PrintString(" DeletePersistantByKey("" + sOwnerKey + "", "" +
sFullVarName + "");");
}
else if ((!bSaveNewOnly || bChanged) && !bDeleted)
{
PrintString(" SetPersistantFloatByKey("" + sOwnerKey +
"", "" + sVarName + "", " + FloatToString(GetLocalFloat(oPWDBVars, sID + "_VALUE")) +
"f, FALSE);");
}
if (!bSaveNewOnly && bChanged)
DeleteLocalInt(oPWDBVars, sID + "_CHANGED");
}
else if (sType == "L")
{
if (bSaveNewOnly && bDeleted)
{
PrintString(" DeletePersistantByKey("" + sOwnerKey + "", "" +
sFullVarName + "");");
}
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("" + sArea + ""), vPos, " + FloatToString(fFacing) + "f);");
PrintString(" SetPersistantLocationByKey("" + sOwnerKey +
"", "" + sVarName + "", lLoc, FALSE);");
}
if (!bSaveNewOnly && bChanged)
DeleteLocalInt(oPWDBVars, sID + "_CHANGED");
}
else if (sType == "O")
{
if (bSaveNewOnly && bDeleted)
{
PrintString(" DeletePersistantByKey("" + sOwnerKey + "", "" +
sFullVarName + "");");
}
else if ((!bSaveNewOnly || bChanged) && !bDeleted)
{
PrintString(" SetPersistantObjectByKey("" + sOwnerKey +
"", "" + sVarName + "", GetObjectByTag("" +
GetTag(GetLocalObject(oPWDBVars, sID + "_VALUE")) + ""), FALSE);");
}
if (!bSaveNewOnly && bChanged)
DeleteLocalInt(oPWDBVars, sID + "_CHANGED");
}
}
PrintString("}");
PrintString("</script>");
WriteTimestampedLogEntry("************************** END PWDB SAVE *****************************************");
if (bSaveNewOnly)
SetLocalInt(oPWDBVars, "CHANGED", 2);
else
SetLocalInt(oPWDBVars, "CHANGED", 0);
}
void PWDBSaveAll()
{
PWDBSave(FALSE);
}
void PWDBSaveChanged()
{
PWDBSave(TRUE);
}
pwdb_data (with sample data):
NWScript:
#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:
#include "pwdb_data"
void main()
{
PWDBLoad();
PWDBLoadChanged();
}
module_OnHeartbeat:
NWScript:
#include "pwdb_functions"
void main()
{
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();
}
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:
#include "pwdb_functions"
void main()
{
object oClient = GetExitingObject();
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:
#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:
#include "pwdb_functions"
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)
{
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)))
{
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();
if (!GetIsPC(oClient))
return;
PrintString("PName: " + GetPCPlayerName(oClient) + ", Name: " + GetName(oClient) + ".\n");
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 (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.
|