mud/lib/verbs/builders/delete.c
2020-09-06 05:43:07 -07:00

187 lines
4.9 KiB
C

#include <lib.h>
#include <daemons.h>
#include ROOMS_H
#include <modules.h>
#include <commands.h>
inherit LIB_VERB;
int eventDeleteExit(string str);
int eventDeleteObject(object ob1, object ob2);
static void create() {
verb::create();
SetVerb("delete");
SetRules("enter STR", "room STR", "enter STR", "exit STR", "OBJ", "OBJ from OBJ", "OBJ from here", "OBJ from room");
SetErrorMessage("Delete what?");
SetHelp("Syntax: delete exit <DIRECTION>\n"
" delete <OBJECT>\n"
" delete <OBJECT> from <OBJECT>\n"
" This command removes an object from the permanent "
"inventory of another object. When only one object is specified, "
"this command assumes you mean to remove an object from the "
"inventory of the room you are in.\n"
" If the \"exit\" keyword is used, this command attempts to "
"remove the exit in the direction you specify.\n"
"See also: add, copy, create, delete, modify, reload, initfix");
}
mixed can_delete_exit_str(string str) {
return 1;
}
mixed can_delete_enter_str(string str) {
return 1;
}
mixed can_delete_room_str(string str) {
return 1;
}
mixed can_delete_obj(object ob){
return 1;
}
mixed can_delete_obj_from_obj(object ob1, object ob2){
return 1;
}
mixed can_delete_obj_from_here(object ob){
return 1;
}
mixed can_delete_obj_from_room(object ob){
return 1;
}
mixed do_delete_exit_str(string str) {
return eventDeleteExit(str);
}
mixed do_delete_enter_str(string str) {
return do_delete_exit_str(str);
}
mixed do_delete_room_str(string str) {
return do_delete_exit_str(str);
}
mixed do_delete_obj(object ob){
return eventDeleteObject(ob, environment(this_player()));
}
mixed do_delete_obj_from_obj(object ob1, object ob2){
return eventDeleteObject(ob1,ob2);
}
mixed do_delete_obj_from_room(object ob){
return do_delete_obj_from_obj(ob, environment(this_player()));
}
mixed do_delete_obj_from_here(object ob){
return do_delete_obj_from_obj(ob, environment(this_player()));
}
int eventDeleteObject(object ob1, object ob2){
string door;
object staff;
staff = present("tanstaafl",this_player());
if(!staff) {
write("You must be holding the creator staff in order to use this command.");
write("If you don't know where you put it, get another one from the chest ");
write("in your workroom.");
return 1;
}
if(userp(ob1) || userp(ob2)){
write("No.");
return 1;
}
if(environment(ob1) != ob2) {
write("That doesn't exist there.");
return 1;
}
if(!check_privs(this_player(),base_name(ob2))){
write("You lack sufficient privileges for this operation on "+ob2->GetShort()+". Fail.");
return 0;
}
door = ob1->GetDoor();
if(door){
staff->eventDeleteDoor(door);
return 1;
}
if(starts_with(base_name(ob2),"/lib/")) {
write("This appears to be a library object. Canceling modification.");
return 1;
}
if(ob2->GetNoModify()){
write("This object must be modified by hand.");
return 1;
}
staff->eventGeneralStuff(base_name(ob1)+".c");
staff->eventGeneralStuff(base_name(ob2)+".c");
staff->eventDeleteItem(ob1, ob2);
return 1;
}
int eventDeleteExit(string str){
string filename;
string *exits;
string *enters;
object *players;
object staff;
staff = present("tanstaafl",this_player());
if(!staff) {
write("You must be holding the creator staff in order to use this command.");
write("If you don't know where you put it, get another one from the chest ");
write("in your workroom.");
return 1;
}
filename = base_name(environment(this_player()))+".c";
exits = load_object(filename)->GetExits();
enters = load_object(filename)->GetEnters();
if(member_array(str,exits) == -1 && member_array(str,enters) == -1) {
write("That exit does not exist here.");
return 1;
}
if(base_name(environment(this_player())) == ROOM_START){
write("You should edit the start room by hand. Change cancelled.");
return 1;
}
if(!check_privs(this_player(),filename)){
write("You can't delete an exit from a room that is not yours.");
return 1;
}
players = get_livings(environment(this_player()),1);
if(member_array(str,exits) != -1) staff->eventRemoveExit(str, filename);
else staff->eventRemoveEnter(str, filename);
load_object("/secure/cmds/creators/update")->cmd("-a "+filename);
players->eventMove(load_object(filename));
exits = load_object(filename)->GetExits();
if(member_array(str,exits) == -1) {
write("Exit successfully removed.");
say(this_player()->GetCapName()+" removes an exit.");
return 1;
}
else {
write("Exit removal failed.");
return 1;
}
}