dsIIr4/bin/
dsIIr4/extra/creremote/
dsIIr4/extra/wolfpaw/
dsIIr4/lib/cmds/admins/
dsIIr4/lib/cmds/common/
dsIIr4/lib/cmds/creators/include/
dsIIr4/lib/cmds/creators/include/SCCS/
dsIIr4/lib/daemon/services/
dsIIr4/lib/doc/
dsIIr4/lib/domains/Ylsrim/
dsIIr4/lib/domains/Ylsrim/adm/
dsIIr4/lib/domains/Ylsrim/armor/
dsIIr4/lib/domains/Ylsrim/broken/
dsIIr4/lib/domains/Ylsrim/fish/
dsIIr4/lib/domains/Ylsrim/meal/
dsIIr4/lib/domains/Ylsrim/npc/
dsIIr4/lib/domains/Ylsrim/virtual/
dsIIr4/lib/domains/Ylsrim/weapon/
dsIIr4/lib/domains/campus/adm/
dsIIr4/lib/domains/campus/etc/
dsIIr4/lib/domains/campus/meals/
dsIIr4/lib/domains/campus/npc/
dsIIr4/lib/domains/campus/save/
dsIIr4/lib/domains/campus/txt/
dsIIr4/lib/domains/campus/txt/ai/charles/
dsIIr4/lib/domains/campus/txt/ai/charles/bak2/
dsIIr4/lib/domains/campus/txt/ai/charles/bak2/bak1/
dsIIr4/lib/domains/campus/txt/ai/charly/
dsIIr4/lib/domains/campus/txt/ai/charly/bak/
dsIIr4/lib/domains/campus/txt/jenny/
dsIIr4/lib/domains/default/creator/
dsIIr4/lib/domains/default/doors/
dsIIr4/lib/domains/default/etc/
dsIIr4/lib/domains/default/virtual/
dsIIr4/lib/domains/default/weap/
dsIIr4/lib/domains/town/virtual/
dsIIr4/lib/lib/comp/
dsIIr4/lib/lib/lvs/
dsIIr4/lib/lib/user/
dsIIr4/lib/lib/virtual/
dsIIr4/lib/log/
dsIIr4/lib/obj/book_source/
dsIIr4/lib/obj/include/
dsIIr4/lib/realms/template/
dsIIr4/lib/realms/template/adm/
dsIIr4/lib/realms/template/area/armor/
dsIIr4/lib/realms/template/area/npc/
dsIIr4/lib/realms/template/area/obj/
dsIIr4/lib/realms/template/area/room/
dsIIr4/lib/realms/template/area/weap/
dsIIr4/lib/realms/template/bak/
dsIIr4/lib/realms/template/cmds/
dsIIr4/lib/save/
dsIIr4/lib/save/kills/o/
dsIIr4/lib/secure/cfg/classes/
dsIIr4/lib/secure/cmds/creators/include/
dsIIr4/lib/secure/cmds/players/
dsIIr4/lib/secure/cmds/players/include/
dsIIr4/lib/secure/daemon/include/
dsIIr4/lib/secure/lib/
dsIIr4/lib/secure/lib/include/
dsIIr4/lib/secure/lib/net/include/
dsIIr4/lib/secure/lib/std/
dsIIr4/lib/secure/modules/
dsIIr4/lib/secure/npc/
dsIIr4/lib/secure/obj/include/
dsIIr4/lib/secure/room/
dsIIr4/lib/secure/save/
dsIIr4/lib/secure/save/boards/
dsIIr4/lib/secure/save/players/g/
dsIIr4/lib/secure/tmp/
dsIIr4/lib/secure/verbs/creators/
dsIIr4/lib/shadows/
dsIIr4/lib/spells/
dsIIr4/lib/std/board/
dsIIr4/lib/std/lib/
dsIIr4/lib/tmp/
dsIIr4/lib/verbs/admins/include/
dsIIr4/lib/verbs/common/
dsIIr4/lib/verbs/common/include/
dsIIr4/lib/verbs/creators/include/
dsIIr4/lib/verbs/players/include/SCCS/
dsIIr4/lib/verbs/rooms/
dsIIr4/lib/verbs/rooms/include/
dsIIr4/lib/www/
dsIIr4/v22.2b14-dsouls2/
dsIIr4/v22.2b14-dsouls2/ChangeLog.old/
dsIIr4/v22.2b14-dsouls2/Win32/
dsIIr4/v22.2b14-dsouls2/compat/
dsIIr4/v22.2b14-dsouls2/compat/simuls/
dsIIr4/v22.2b14-dsouls2/include/
dsIIr4/v22.2b14-dsouls2/mudlib/
dsIIr4/v22.2b14-dsouls2/testsuite/
dsIIr4/v22.2b14-dsouls2/testsuite/clone/
dsIIr4/v22.2b14-dsouls2/testsuite/command/
dsIIr4/v22.2b14-dsouls2/testsuite/data/
dsIIr4/v22.2b14-dsouls2/testsuite/etc/
dsIIr4/v22.2b14-dsouls2/testsuite/include/
dsIIr4/v22.2b14-dsouls2/testsuite/inherit/
dsIIr4/v22.2b14-dsouls2/testsuite/inherit/master/
dsIIr4/v22.2b14-dsouls2/testsuite/log/
dsIIr4/v22.2b14-dsouls2/testsuite/single/
dsIIr4/v22.2b14-dsouls2/testsuite/single/tests/compiler/
dsIIr4/v22.2b14-dsouls2/testsuite/single/tests/efuns/
dsIIr4/v22.2b14-dsouls2/testsuite/single/tests/operators/
dsIIr4/v22.2b14-dsouls2/testsuite/u/
dsIIr4/v22.2b14-dsouls2/tmp/
dsIIr4/win32/
/*    /secure/cmds/adm/decre.c 
 *    from the Dead Souls LPC Library
 *    turns a creator into a player
 *    created by Descartes of Borg 950323
 */

#include <lib.h>
#include <privs.h>
#include <rooms.h>
#include <daemons.h>

inherit LIB_DAEMON;

string home_dir, PlayerName;
object ob, player_ob;

mixed cmd(string args) {
    object *inv, *purge_array;
    string nom, file;

    if( !((int)master()->valid_apply(({ PRIV_ASSIST, PRIV_SECURE, LIB_CONNECT }))) )
	error("Illegal decre attempt: "+get_stack()+" "+identify(previous_object(-1)));

    ob = 0;
    player_ob = 0;

    if( args == "" || !stringp(args) ) 
	return "Who do you want to make a player?";
    nom = convert_name(args);
    if( !user_exists(nom) ) return capitalize(nom) + " is not a member of " +
	possessive_noun(mud_name()) + " reality.";
    if( !strsrch(file = save_file(nom), DIR_PLAYERS) )
	return "You cannot make "+capitalize(args)+" a player.";

    if(ob == this_player()){
	return "Nonsense.";
    }

    if(!ob = find_player(nom)){
	PLAYERS_D->RemovePendingEncre(lower_case(nom));
	PLAYERS_D->AddPendingDecre(lower_case(nom));
	write(capitalize(nom)+" will be demoted on their next login.");
	return 1;
    }

    else {
	mixed attrape;
	home_dir = homedir(ob);
	write("You decre "+capitalize(nom)+".");
	PlayerName = nom;

	//Try to remove inventory and move the guy to the pod
	//
	ob->eventMove(ROOM_POD);
	inv = deep_inventory(ob);
	if(sizeof(inv))
	    foreach(object thing in inv){
	    if(thing) {
		thing->eventMove(ROOM_FURNACE);
	    }
	}	//Save the user to sync its state with his inventory
	unguarded( (: ob->save_player((string)ob->GetKeyName()) :) );

	//Move the user file to the player dir
	//
	   if( file_size(DIR_PLAYERS+"/"+nom[0..0]) != -2) 
	mkdir(DIR_PLAYERS+"/"+nom[0..0]);
	if(rename(file+__SAVE_EXTENSION__, DIR_PLAYERS+"/"+nom[0..0]+"/"+nom+__SAVE_EXTENSION__))
	    return "You failed due to lack of write access to "+DIR_PLAYERS+".";
	//Remove their homedir, save it to a backup dir.
	if(home_dir && directory_exists(home_dir))
	    rename(home_dir,"/secure/save/decre/"+nom+"."+timestamp());
	//Remove their name from the creator list in the player daemon, add it to the player list.
	PLAYERS_D->eventDecre(lower_case(nom));

	//Try to create the new player object
	//
	attrape = catch(player_ob = (object)master()->player_object(nom));
	PlayerName = 0;
	if( attrape || !player_ob ) {
	    message("system", "\nFailed to create a player object.", 
	      this_player());
	    message("system", "Please log out and log back in.", ob);
	    return 1;
	}

	//Do the decre
	//
	exec(player_ob, ob);
	player_ob->Setup();

	//Remove creator channels and such
	//
	foreach(string channel in player_ob->GetChannels())
	player_ob->RemoveChannel(channel);
	if( avatarp(player_ob) ) player_ob->AddChannel(({ "avatar" }));
	if( high_mortalp(player_ob) ) player_ob->AddChannel( ({ "hm" }) );
	if( newbiep(player_ob) ) player_ob->AddChannel( ({ "newbie" }) );
	player_ob->AddChannel( ({ "gossip" }) );
	if( councilp(player_ob) ) player_ob->AddChannel( ({ "council" }) );
	player_ob->AddChannel(player_ob->GetClass());

	//Destroy any objects loaded from their homedir
	//
	purge_array = filter(objects(), (: !strsrch(base_name($1), home_dir) :) );
	foreach(object tainted in purge_array){
	    if(clonep(tainted)){
		tainted->eventMove(ROOM_FURNACE);
		purge_array -= ({ tainted });
	    }
	}
	foreach(object tainted in purge_array){
	    tainted->eventDestruct();
	}
    }
    call_out( (: ob->eventMove(ROOM_FURNACE) :), 1 );
    player_ob->eventMoveLiving(ROOM_START);
    player_ob->SetLoginSite(ROOM_START);
    unguarded( (: player_ob->save_player((string)player_ob->GetKeyName()) :) );
    message("system", "You are now a player.", player_ob);
    message("system", (string)player_ob->GetName() + " is now a player!",
      this_player());
    return 1;
}

string GetKeyName() { return PlayerName; }
void help() {
    message("help",
      "Syntax: decre <person>\n\n"
      "Demotes the specified creator to player status. "
      "If the target is not "
      "logged in, they will be made a player when "
      "they next log in."
      "\n\n"
      "See also: encre, rid", this_player()
    );
}