#include <message_class.h> #include <dirs.h> #include <privs.h> private mixed array PersistentInventory = 0; private static int LastSave = time(); private int PersistentInventoryEnabled = 0; private static string wut, savename, nom = ""; string GetSaveName(){ mixed tmp = directory_exists(domain(this_object(),1)+"/save"); string ret; if(tmp){ tmp = query_unique_name(this_object()); ret = domain(this_object(),1)+"/save/"+tmp; } return ret; } int GetPersistent(){ return PersistentInventoryEnabled; } int GetLastSave(){ return LastSave; } static varargs int SaveObject(mixed str, int i){ int ret; savename = GetSaveName(); if(!undefinedp(str) && intp(str)) i = str; if(str) savename = str; #if ENABLE_INSTANCES savename = new_savename(savename); #endif if(!sizeof(savename) || savename[0..0] == ".") return 0; if(PersistentInventoryEnabled){ PersistentInventory = filter(map(all_inventory(), (: $1->GetSaveString() :)), (: $1 :)); } ret = unguarded( (: save_object, savename, i :) ); LastSave = time(); return ret; } int SetPersistent(int x){ if(x > 0) x = 1; else x = 0; PersistentInventoryEnabled = x; return PersistentInventoryEnabled; } mixed GetPersistentInventory(){ return copy(PersistentInventory); } static varargs int RestoreObject(mixed str, int i){ object env; int ret; if(!undefinedp(str) && intp(str)) i == str; if(!interactive() && env && env->GetPersistent()) return; if(!str) savename = GetSaveName(); else savename = str; if(!sizeof(savename)) return 0; #if ENABLE_INSTANCES str = new_savename(savename); if(file_exists(str)) savename = str; #else str = old_savename(savename); if(file_exists(str)) savename = str; #endif ret = unguarded((: restore_object, savename :)); if(GetPersistent() && sizeof(PersistentInventory)){ foreach(string obdata in PersistentInventory){ object ob; mixed tmp; tmp = restore_variable(obdata); if( arrayp(tmp) ){ int howmany, mclones; wut = tmp[0]; howmany = sizeof(objects((: base_name($1) == wut && environment($1) :))); mclones = wut->GetMaxClones(); if(wut->GetUnique() && howmany) continue; if(mclones && mclones <= howmany ) continue; ob = new(wut); if( ob ) ob->eventConvertObject(tmp, 1); } else { int howmany, mclones; wut = tmp["#base_name#"]; howmany = sizeof(objects((: base_name($1) == wut && environment($1) :))); mclones = wut->GetMaxClones(); if(wut->GetUnique() && howmany) continue; if(mclones && mclones <= howmany ) continue; if( !catch(ob = new(wut)) ){ if( ob ){ ob->eventLoadObject(tmp, 1); } } } } } PersistentInventory = 0; return ret; } varargs void create(){ RestoreObject(); } int eventDestruct(){ if(PersistentInventoryEnabled){ SaveObject(); } return 1; }