93 lines
2.3 KiB
C
93 lines
2.3 KiB
C
/* /lib/user/autosave.c
|
|
* From the Dead Souls Mud Library
|
|
* Object to save a player to file
|
|
* Created by Descartes of Borg 940216
|
|
* Version: @(#) autosave.c 1.3@(#)
|
|
* Last modified: 97/01/03
|
|
*/
|
|
|
|
#include <message_class.h>
|
|
#include <dirs.h>
|
|
#include <privs.h>
|
|
|
|
private mixed array Inventory = 0;
|
|
private static int LastSave = time();
|
|
|
|
// abstract methods
|
|
string GetKeyName();
|
|
varargs void eventPrint(string str, mixed args...);
|
|
varargs int RestoreObject(mixed str, int i);
|
|
varargs int SaveObject(mixed str, int i);
|
|
// end abstract methods
|
|
|
|
nomask void restore_inventory();
|
|
nomask void save_player(string nom);
|
|
|
|
int Setup(){
|
|
master()->create_save();
|
|
call_out( (: save_player, GetKeyName() :), 2 );
|
|
restore_inventory();
|
|
return 1;
|
|
}
|
|
|
|
nomask void restore_inventory(){
|
|
if( Inventory ){
|
|
foreach(string obdata in Inventory){
|
|
object ob;
|
|
mixed tmp;
|
|
|
|
tmp = restore_variable(obdata);
|
|
if( arrayp(tmp) ){
|
|
ob = new(tmp[0]);
|
|
if( ob ) ob->eventConvertObject(tmp, 1);
|
|
}
|
|
else {
|
|
if( !catch(ob = new(tmp["#base_name#"])) ){
|
|
if( ob ){
|
|
ob->eventLoadObject(tmp, 1);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Inventory = 0;
|
|
}
|
|
|
|
nomask int restore_player(string nom){
|
|
string file;
|
|
int ret;
|
|
if( previous_object(0) != master() ){
|
|
return 0;
|
|
}
|
|
file = player_save_file(nom);
|
|
ret = unguarded((: restore_object, file, 1 :));
|
|
return ret;
|
|
}
|
|
|
|
nomask void save_player(string nom){
|
|
string file;
|
|
mixed ret;
|
|
if( !nom || nom != GetKeyName() ){
|
|
return;
|
|
}
|
|
catch(this_object()->CalculateCarriedMass());
|
|
Inventory = filter(map(all_inventory(), (: $1->GetSaveString() :)),
|
|
(: $1 :));
|
|
file = player_save_file(GetKeyName());
|
|
ret = unguarded((: save_object, file, 1 :));
|
|
Inventory = 0;
|
|
}
|
|
|
|
static void heart_beat(){
|
|
int x = time();
|
|
if( x - LastSave < AUTOSAVE_TIME ){
|
|
return;
|
|
}
|
|
LastSave = x;
|
|
save_player(GetKeyName());
|
|
if( !builderp(this_object()) && !present("visitor pass",this_object())
|
|
&& !testp(this_object()) ){
|
|
eventPrint("Autosaving...", MSG_SYSTEM);
|
|
}
|
|
}
|