@verb #17:"@make-core-database" any none none rdo #55 @program #17:"@make-core-database" any none none if (player != $slacker || !player.wizard) player:notify("Sorry, only $slacker is allowed to run this verb. If you want to destroy the Moo then login as $slacker and try again.") return elseif (args == {}) player:tell("Continuing with this command will destroy all but the central core of the database. If you're really sure that you want to do this, type '", verb, " ", task_id(), "' within the next 60 seconds.") suspend(60) player:tell("The ", task_id(), " password has expired.") return elseif (!(task = listassoc(toint(args[1]), queued_tasks())) || task[7] != verb) player:notify(tostr("Nice try, but you mistyped the self-destruct password. Type '", verb, "' again to get a new password.")) return endif kill_task(task[1]) $wiz_utils:guard_alert(player.name + " is about to do a core extraction on this Moo. Everything but the core will be deleted. If you do not hoof this wizard within 30 seconds, this Moo will be obliterated!!!") suspend(30) if (player:connected()) $wiz_utils:guard_alert("Proceeding with core extraction...") else $wiz_utils:guard_alert("Aborting the core extraction.") return endif "----------------------------------------" player:notify("Identifying objects to be saved...") saved = {} "Save everything between #0 and #100" for x in [#0..#100] saved = {@saved, x} endfor saved_props = {} "Also save all $ objects" "-- except those listed in $noncore and #105" for p in ($noncore) for o in ($ancestors()) `delete_property(o, p) ! E_PROPNF' endfor endfor for p in (properties($ref_db)) delete_property($ref_db, p) endfor $noncore = {"This is a list of properties that should be stripped from #0 and its ancestors when making a core extraction."} suspend(0) for p in ($all_properties_suspended()) v = #0.(p) if (typeof(v) == $OBJ && valid(v)) saved = setadd(saved, v) saved_props = {@saved_props, p} endif endfor "Also save all ancestors of saved objects" for o in (saved) p = parent(o) while (valid(p)) saved = setadd(saved, p) p = parent(p) endwhile endfor $player_class = $player "----------------------------------------" player:notify("Killing all queued tasks ...") for t in (queued_tasks()) kill_task(t[1]) endfor "----------------------------------------" player:notify("Stripping you of any personal verbs and/or properties ...") suspend(0) for i in [1..length(verbs(player))] delete_verb(player, 1) endfor for p in (properties(player)) delete_property(player, p) endfor for f in (player:filelist()) player:filedelete(f) endfor chparent(player, $wiz) for p in ($set_utils:diff(player:all_properties(), $code_utils.builtin_props)) clear_property(player, p) endfor player.name = "Wizard" player.aliases = {"Wizard"} player.description = "" player.key = 0 player.password = 0 "----------------------------------------" suspend(0) player:notify("Making you or $hacker the owner of every saved object, verb and property ...") protect_s_p_i = $server_options.protect_set_property_info $server_options.protect_set_property_info = 0 load_server_options() for i in [1..length(saved)] if ($command_utils:running_out_of_time()) suspend(0) player:notify(tostr("... finished ", i - 1, " out of ", length(saved), " saved objects ...")) endif o = saved[i] if (valid(o.owner) && o.owner.wizard) o.owner = player else o.owner = $hacker endif old_verbs = {} for v in [1..length(verbs(o))] $command_utils:suspend_if_needed() && player:tell("... finished ", i - 1, " out of ", length(saved), " saved objects ...") info = verb_info(o, v) if (valid(info[1]) && info[1].wizard) info[1] = player else info[1] = $hacker endif `set_verb_info(o, v, info) ! ANY => player:tell("WARNING! ", o, ":", v, " could not be chowned to ", info[1], ". Please do this manually.")' if (index(info[3], "(old)")) old_verbs = {v, @old_verbs} endif endfor for v in (old_verbs) delete_verb(o, v) endfor for p in ($set_utils:diff(o:all_properties(), $code_utils.builtin_props)) $command_utils:suspend_if_needed() && player:tell("... finished ", i - 1, " out of ", length(saved), " saved objects ...") info = property_info(o, p) if (valid(info[1]) && info[1].wizard) info[1] = player else info[1] = $hacker endif set_property_info(o, p, info) endfor endfor $server_options.protect_set_property_info = protect_s_p_i load_server_options() "----------------------------------------" player:notify("Recycling unsaved objects ...") counter = toint(max_object()) while (counter > 0) suspend(0) o = toobj(counter) if (valid(o) && !(o in saved)) player:tell("Recycling ", $string_utils:nn(o), "...") if (is_player(o)) set_player_flag(o, 0) endif $hard_creating_tasks = {@$hard_creating_tasks, task_id()} `recycle(o) ! ANY' endif counter = counter - 1 endwhile "----------------------------------------" suspend(0) player:notify("Killing queued tasks ...") for t in (queued_tasks()) kill_task(t[1]) endfor "----------------------------------------" player:notify("Compacting object numbers ...") for old in [#0..max_object()] $command_utils:suspend_if_needed() if (!valid(old)) elseif (typeof(new = renumber(old)) != $OBJ) player:tell("Renumbering returned -> ", new) else for core_obj in ({#0, @$ancestors(), $web.names}) for prop in (properties(core_obj)) if (core_obj.(prop) == old) core_obj.(prop) = new endif $command_utils:suspend_if_needed() endfor endfor reset_max_object() endif endfor "----------------------------------------" player:notify("Performing miscellaneous cleanups ...") for o in [#0..max_object()] $command_utils:suspend_if_needed() if ($object_utils:has_callable_verb(o, "init_for_core")) o:init_for_core() endif endfor $wiz_utils:initialize_owned() player:notify("Core database extraction is complete. Type @shutdown to save it.") "Last modified by Dax (#789) on Thu May 5 17:05:23 2005 MDT." .