What I'd recommend is having an item that you automatically give to players to help with this. Possibly you already outfit players with items, such as a climb tool or other 'system' tool that they won't try to drop, sell, your death system wont take, can't be pickpocketed, etc.. Essentially a plot item that's not droppable.
Then, periodically save the PC's location to that item. After each rest, for example, and/or as part of each area enter script. Lots of servers give PCs location-saving widgets that when used, allow the PC to save that exact location to augment the auto-saving that they've set up.
Then, when your PC enters the world, your OnEnter module script looks for that variable, say the "LastLocation", on the item and then moves the PC to that location.
This is how we set the do it in our area OnEnter:
object oArea = GetArea(oPC);
object oDatabase = GetItemPossessedBy(oPC, "database");
string sID = GetStringLeft(GetName(oPC),10)+GetPCPublicCDKey(oPC);
string sAreaTag = GetTag(oArea); // Sets up a string using the Tag of the Area
if(!GetLocalInt(oArea,"NoSave"))
{
vector vPosition = GetPositionFromLocation(GetLocation(oPC));
int nAreaX = FloatToInt(vPosition.x);
int nAreaY = FloatToInt(vPosition.y);
int nAreaZ = FloatToInt(vPosition.z);
SetLocalInt(oDatabase, "LocationSet" + sID, 1);
SetLocalInt(oDatabase, "AreaX_" + sHID, nAreaX);
SetLocalInt(oDatabase, "AreaY_" + sHID, nAreaY);
SetLocalInt(oDatabase, "AreaZ_" + sHID, nAreaZ);
SetLocalString(oDatabase, "AreaTag_"+ sHID, sAreaTag); }
Then, as part of the entering script when a PC returns to the server after a reset, the below occurs. I don't run it on the Module's OnEnter event, but rather through an NPC in the start area that grants access to the world.
string sID = GetStringLeft(GetName(oPC),10)+GetPCPublicCDKey(oPC);
object oArea = GetArea(GetObjectByTag(GetLocalString(oDatabase, "AreaTag_"+ sID)));
if (GetLocalInt(oDatabase, "LocationSet_" + sID))
{
if (oArea !=OBJECT_INVALID)
{
SendMessageToPC(oPC,"Jumping to your saved location");
DelayCommand(1.5, AssignCommand(oPC, ActionJumpToLocation(Location(oArea, Vector(IntToFloat(GetLocalInt(oDatabase, "AreaX_" + sHID)), IntToFloat(GetLocalInt(oDatabase, "AreaY_" + sHID)), IntToFloat(GetLocalInt(oDatabase, "AreaZ_" + sHID))), 0.0))));
}
}