@verb #14:"_copy_verb _copy!_verb" this none this rxdo #55 @program #14:"_copy_verb _copy!_verb" this none this "Copy a verb. Called by @copy & _move_verb." "Returns 1 if copy was successful." set_task_perms(caller_perms()) "I wonder if this is secure. - whiz" {object, vname, iobjstr} = args if (!player.programmer) player:tell("You need to be a programmer to do this; you appear to have lost your programmer's bit. Are you over-quota?") return elseif (iobjstr[1] == ":") "@copy me:foo to :bar" to = {object, iobjstr[2..$], "verb"} elseif (valid(iobj)) "@copy me:foo to $ref" to = {iobj, vname, "verb"} elseif (to = $code_utils:parse_verbref(iobjstr)) "@copy me:foo to here:bar" if ($command_utils:object_match_failed(tobj = player:my_match_object(to[1]), to[1])) return endif to = {tobj, to[2], "verb"} elseif (iobjstr[1] == "!") "@copy me:foo to !bar" to = {object, iobjstr[2..$], "file"} elseif (to = $code_utils:parse_fileref(iobjstr)) "@copy me:foo to here!bar" if ($command_utils:object_match_failed(tobj = player:my_match_object(to[1]), to[1])) return endif to = {tobj, to[2], "file"} elseif (iobjstr[1] == ".") "@copy me:foo to .bar" to = {object, iobjstr[2..$], "prop"} elseif (to = $code_utils:parse_propref(iobjstr)) "@copy me:foo to here.bar" if ($command_utils:object_match_failed(tobj = player:my_match_object(to[1]), to[1])) return endif to = {tobj, to[2], "prop"} else "@copy me:foo to here" iobj = player:my_match_object(iobjstr) if ($command_utils:object_match_failed(iobj, iobjstr)) return endif to = {iobj, vname, "verb"} endif "----------------------------------" "All required info has been parsed." "----------------------------------" if (to[3] == "prop" || to[3] == "file") try vinfo = verb_info(object, vname) vargs = verb_args(object, vname) vcode = verb_code(object, vname) except v (ANY) player:tell("Retrieving ", object, ":", vname, " --> ", v[1]) return endtry spec = tostr(object, ":\"", vname, "\" ", $su:from_list(vargs, " ")) data = {tostr("@verb ", spec, " ", vinfo[2], " ", vinfo[1])} data = {@data, "@program " + spec} data = {@data, @vcode} data = {@data, "."} if (to[3] == "prop") if (!to[1]:has_property(to[2])) perms = index(vinfo[2], "r") ? "rc" | "c" owner = caller_perms().wizard ? vinfo[1] | caller_perms() if (E_INVARG == (e = `add_property(@to[1..2], data, {owner, perms}) ! ANY')) player:tell("Property is already defined on one or more descendents.") player:tell("Try @check-prop ", to[1], ".", to[2]) return elseif ($ERR == typeof(e)) player:tell("Adding ", to[1], ".", to[2], " --> ", e) return endif elseif (to[2] in $code_utils.builtin_props) player:tell("Can't set builtin properties this way.") player:tell("Use @rename for .name, @move/@eject for .location/.contents, and @chmod for .r, .w, and .f") return elseif (verb == "_copy_verb") player:tell(to[1], ".", to[2], " already exists. Either @rmprop it, or use @copy! to overwrite it.") return endif try to[1].(to[2]) = data except v (ANY) player:tell("Writing ", to[1], ".", to[2], " --> ", v[1]) return endtry player:tell(to[1], ".", to[2], " value set.") elseif (to[3] == "file") if (verb == "_copy_verb" && to[1]:fileexists(to[2])) player:tell(to[1], "!", to[2], " already exists. Either @rmfile it, or use @copy! to overwrite it.") return endif try result = to[1]:filewrite(to[2], data) except v (ANY) player:tell("Writing ", to[1], "!", to[2], " --> ", v[1]) return endtry player:tell(to[1], "!", to[2], " written.") else raise(E_VARNF, "This error can't happen!") endif elseif (to[3] == "verb") to_firstname = strsub(to[2][1..index(to[2] + " ", " ") - 1], "*", "") || "*" if (!(hv = $object_utils:has_verb(to[1], to_firstname)) || hv[1] != to[1]) if (!(info = `verb_info(object, vname) ! ANY') || !(vargs = `verb_args(object, vname) ! ANY')) player:tell("Retrieving ", object, ":", vname, " --> ", info && vargs) return endif if (!player.wizard) info[1] = player endif if (vname != to[2]) info[3] = to[2] endif if ($ERR == typeof(e = `add_verb(to[1], info, vargs) ! ANY')) player:tell("Adding ", to[1], ":", to[2], " --> ", e) return endif elseif (verb == "_copy_verb") player:tell(to[1], ":", to[2], " already exists. Either @rmverb it, or use @copy! to overwrite it.") return endif code = verb_code(object, vname) owner = verb_info(object, vname)[1] if (owner != player) code = {tostr("\"Copied from ", object:nn(), ":", vname, object == owner ? " " | tostr(" by ", owner:nn(), " "), ctime()[5..24], "\";"), @code} if (callers()[1][2][1..4] != "_mov") player:tell("Use of @copy is discouraged. Please do not use @copy if you can use inheritance or features instead. Use @copy carefully, and only when absolutely necessary, as it is wasteful of database space.") endif endif old_ilmd = player.include_last_modified_date player.include_last_modified_date = 0 if ($ERR == typeof(e = `set_verb_code(to[1], to_firstname, code) ! ANY')) player.include_last_modified_date = old_ilmd player:tell("Copying ", object, ":", vname, " to ", to[1], ":", to[2], " --> ", e) return endif player.include_last_modified_date = old_ilmd player:tell(to[1], ":", to[2], " code set.") else raise(E_VARNF, "This error can't happen!") endif return 1 "Last modified by Dax (#789) on Tue May 3 15:38:52 2005 MDT." .