From the NannyMUD documentation

LAST CHANGE

2001-12-11

NAME

        line_control - The controller for a stdline.

INHERITS

	/std/basic.c

INCLUDES

	/std/line/line.h
	/include/level.h

FUNCTIONS

SETUP FUNCTIONS

	set_linename
	set_default_columns
	set_line_cost
	set_lineto_cost
	add_object

QUERY FUNCTIONS

	query_linename
	query_default_columns
	query_line_cost
	query_lineto_cost
	query_local_objects
	query_entry
	query_special
	query_offline

OTHER FUNCTIONS

	remove_object

	apply_remote_object
	do_line_cost
	send_line_message
	add_reviewer
	print_offline_status

	treat_message
	reset

	set_entry
	set_special
	set_offline

	cmd_line
	cmd_lineto
	cmd_reply
	cmd_simple_online
	cmd_simple_offline
	cmd_online
	cmd_offline
	cmd_linewho
	cmd_review

	remote_do_line_cost
	remote_pass_offline_message
	remote_treat_message
	remote_check_one_player
	remote_reinit
	remote_prevent_init
	remote_init
	remote_prevent_exit
	remote_exit
	remote_block_send
	remote_block_lineto
	remote_do_lineto

PROPERTIES

INTERNAL PROPERTIES


PROPERTY NAME

        no_soul - Don't clone a soul in the line's initial setup.

DESCRIPTION

	Don't clone a soul in the line's initial setup.

PROPERTY NAME

        __remote - Sets the remote object.

DESCRIPTION

	Sets the remote object.

PROPERTY NAME

        wizard_linecost - Wizards must pay to use the line.

DESCRIPTION

	Wizards must pay to use the line.

PROPERTY NAME

        prevent_cost_modifiers - Don't check the value_line_cost_hook.

DESCRIPTION

	Don't check the value_line_cost_hook.

PROPERTY NAME

        linename_low - Alternate linename for low-priority messages.

DESCRIPTION

	Alternate linename for low-priority messages.

PROPERTY NAME

        linename_pri - Alternate linename for high-priority messages.

DESCRIPTION

	Alternate linename for high-priority messages.

PROPERTY NAME

        linename_tell - Alternate linename for linetos.

DESCRIPTION

	Alternate linename for linetos.

PROPERTY NAME

        alternate_lineplayer - Clone this instead of the standard line player.

DESCRIPTION

	Clone this instead of the standard line player.

PROPERTY NAME

        use_reviewer - Use alternate reviewer

DESCRIPTION

	What add_reviewer() should use instead of the default reviewer;
	can be either a filename or an object.

PROPERTY NAME

        level_reports - Default reporting of level advancement and deaths.

DESCRIPTION

	Use the default reporting of level advancement and deaths.

PROPERTY NAME

        connect_reports - Default reporting of login and logout.

DESCRIPTION

	Use the default reporting of login and logout.

PROPERTY NAME

        line_reports - Default reporting of off-/on-line.

DESCRIPTION

	Use the default reporting of off-/on-line.

NOTE

	This is only for simple_online/offline.

PROPERTY NAME

        ld_reports - Default reporting related to linkdeath.

DESCRIPTION

	Use the default reporting related to linkdeath (including crumbling).

PROPERTY NAME

        pk_reports - Default reporting related to playerkilling.

DESCRIPTION

	Use the default reporting related to playerkilling.

PROPERTY NAME

        no_feelings - The line does not allow feelings.

DESCRIPTION

	The line does not allow feelings.

PROPERTY NAME

        no_emote - The line does not allow emotes.

DESCRIPTION

	The line does not allow emotes.

PROPERTY NAME

        no_free_linetos - Paragons don't get free linetos.

DESCRIPTION

	Paragons don't get free linetos.

PROPERTY NAME

        no_check_away - Don't check away message when sending a lineto.

DESCRIPTION

	Don't check a player's away message when sending a lineto.

PROPERTY NAME

        no_set_reply_to - Don't set the reply-to when sending a lineto or a reply.

DESCRIPTION

	Don't set the reply-to value when sending a lineto or a reply.

DESCRIPTION

	This is the master object for a line-- the controller. All
	setup of the line happens here.

FUNCTION


NAME

        quit_hook - The player logs out.

SYNTAX

-

DESCRIPTION

	This report type also calls a function called
	remote_signal_login, as a remote function if possible
	and as a local function otherwise.	This function is used by connect_reports.

NOTE

	All of these functions are executed in the remote
	object if it exists so if it's different from the
	line control, you will have to define your own
	functions instead.

NOTE

	The init() function in this object has been dummied out; the
	only way to access the commands linked by add_command() is
	through the line_inherit facility of calling do_cmd()
	directly.

SEE ALSO

        value_line_cost_hook in hooks/value_line_cost_hook

FUNCTION


NAME

        connection_hook - A player loses/regains connection.

DESCRIPTION

	This function is used by ld_reports.

NOTE

	See the notes from quit_hook().

FUNCTION


NAME

        kill_hook - A player kills something.

SYNTAX

-

DESCRIPTION

	This function is used by pk_reports.

NOTE

        See the notes from quit_hook().

FUNCTION


NAME

        die_hook - A player is killed.

SYNTAX

-

DESCRIPTION

        This function is used by pk_reports, or if
	pk_reports didn't use it, by level_reports.

NOTE

        See the notes from quit_hook().

FUNCTION


NAME

        changed_level_hook - A player advances.

SYNTAX

-

DESCRIPTION

        This function is used by level_reports.

NOTE

        See the notes from quit_hook().

FUNCTION


NAME

        set_linename - Set the name for a line.

SYNTAX

void set_linename(string name)

DESCRIPTION

	This function sets the string that prefaces all text sent
	on the line. 

NOTE

	The query_linename() function is run through eval(), so you
	can have a name that periodically changes, if you wish.
	This feature has not been well-tested though, so you will
	need to do so before adding this to your line.

NOTE

	Note that certain messages will only use the name set by this
	function if the alternate linenames are not set.
	(see the descriptions of the linename_* properties below)

NOTE

        Would yield messages like: [Test] Beldin: Hi there.
        Note the space in set_linename().

NOTE

        Would result in: [Test]Beldin: Hi there.

EXAMPLE

	set_linename("[Test] ");

EXAMPLE

	set_linename("[Test]");

FUNCTION


NAME

        query_linename - Show the name for a line.

SYNTAX

string query_linename()

DESCRIPTION

	This returns the linename set by set_linename(), as processed
	by the eval() function.

FUNCTION


NAME

        set_default_columns - Set the line's default column width.

SYNTAX

        void set_default_columns(int val)

DESCRIPTION

	This function is probably hardly ever useful. If a player's
	column data is not set, or is set to a value too low to be
	meaningful, then the value set by set_default_columns is
	used to linebreak the messages that come across the line.

FUNCTION


NAME

        query_default_columns - Show the line's default column width.

SYNTAX

        int query_default_columns()

DESCRIPTION

	Simply returns the default column width for the line. This
	is not routed through eval.

FUNCTION


NAME

        set_line_cost - Set the cost for sending a message.

SYNTAX

        void set_line_cost(int val|string eval_call)

DESCRIPTION

	This function sets the cost for sending a message on a line.
	The line cost is run through eval(). If this is not enough
	versatility for what you need, the do_line_cost function
	gives you a couple of ways to further modify the cost of
	sending a message over the line.

NOTE

	There are rules on what the minimum cost of sending a message
	on the line can be. These are mentioned in the RULES section
	of the helpsystem.

SEE ALSO

        guilds in RULES/guilds

SEE ALSO

        clubs in RULES/clubs

FUNCTION


NAME

        query_line_cost - Show the cost of sending a message.

SYNTAX

        int query_line_cost()

DESCRIPTION

	Show the cost of sending a message, parsed by eval.

FUNCTION


NAME

        set_lineto_cost - Set the cost of a 'sendto' message.

SYNTAX

        void set_lineto_cost(int val|string eval_call)

DESCRIPTION

	This sets the cost of sending a tell to another player across
	the line. The cost is run through eval(). Like with the
	set_line_cost function, you can further modify the cost of a
	lineto with the do_line_cost() alternatives, if the eval call
	doesn't give you what you need.

NOTE

	This is used for replies across the line as well as simple
	tells, if the reply feature is enabled.

FUNCTION


NAME

        query_lineto_cost - Get the cost of a 'sendto' message.

SYNTAX

        int query_lineto_cost()

DESCRIPTION

	Show the cost of sending a lineto, parsed by eval().

FUNCTION


NAME

        add_object - Add a resident object.

SYNTAX

        void add_object(mixed ob)

DESCRIPTION

	Given a filename, this function will clone that object every
	reset and move it into the line, unless the object is still
	in the line.	You can also give an already cloned object to 'add_object',
	this is meaningless unless you need to do so to leave the
	object as a placeholder for your query_local_objects() array.

NOTE

	You are not able to add objects from /std/lib as in the
	/std/room analog of this function; likewise, since the line
	is not subject to clean_up, all of the clean_up related
	features of add_object used in /std/room are not replicated
	here.

NOTE

	You need a ::reset(arg) first in you reset(arg) for this
	function to work. Also, calling this function _every_ reset
	will make you wind up with a lot of objects in your room, so
	don't do that.

NOTE

	Usually, you want to have the add_object() call in the part
	of reset executed when the room is created, i.e. reset(0). If
	then reset is called again with an argument of 0, you get yet
	another object added.

NOTE

	This usually happens when some wizard patches reset, without
	knowing	what he/she/it is doing.

EXAMPLE

        add_object("@add_reviewer(25)");

EXAMPLE

	add_object("/guilds/foo/mark/guild_feelings");

EXAMPLE

	add_property("no_soul"); // don't add a default soul
	add_object("@my_soul()"); // clones and patches a soul

FUNCTION


NAME

        remove_object - Removes a resident object.

SYNTAX

        void remove_object(mixed ob)

DESCRIPTION

	This function removes a file from the list to clone every
	reset. 	Note that it does not destruct already cloned
	objects.

FUNCTION


NAME

        query_local_objects - Show resident objects.

SYNTAX

        mixed *query_local_objects()

DESCRIPTION

	Show the list of objects to clone every reset. Note that
	the array contains both the filename AND the object cloned,
	if any. See the code itself for information on how this
	array is ordered.

FUNCTION


NAME

        reset - Facilitate add_object() and default setup code.

SYNTAX

        void reset(int arg)

DESCRIPTION

	The stdline needs a couple of default features on setup.
	One of these is just a set_light(1), just in case some code
	depends on the 'sendroom' being light.
	The other is to add a soul to the room, unless the property
	'no_soul' is set.
	Objects cloned by add_object() are also restocked at this
	point, if they have somehow been destructed.

NOTE

	Your line_control's reset function needs to call
		::reset(arg);
	for the default behaviors described above to work properly.

FUNCTION


NAME

        apply_remote_object - Run a remote function.

SYNTAX

	static varargs mixed apply_remote_object(string function,
	                                         mixed arg1,
                                                 mixed arg2,
                                                 mixed arg3)

DESCRIPTION

	Run a function in the remote object, if any exists. Actually
	this function isn't necessary, it was just added to the code
	to make the use of remote functions in functions more
	readable.

NOTE

	The first argument supplied to every remote function is the
	line controller itself.

NOTE

	When the remote function is called, the string 'remote_' is
	added at the head of the function name.

	For example:
		apply_remote_object("init",this_player());
	gets run as:
		__remote->remote_init(this_object(),this_player());
	but it is only run _if_ a valid remote object exists.
	Otherwise 0 is returned.

NOTE

	This function is declared static for security.

FUNCTION


NAME

        set_entry - Set a player's line data entry.

SYNTAX

        void set_entry(object player,mixed *entry)

DESCRIPTION

	Set a player's line data. The size and construction of the
	'entry' array is defined by line.h; read it to see how the
	data is constructed, and be aware that elements may be added
	to the array at a later date, if the need arises.

NOTE

	Calling set_entry() does not call check_one_entry().
	In fact, the opposite is the case. So if you do decide to
	redefine set_entry() to add some security to it, don't call
	check_one_entry(), or for that matter any other function from
	line_control which is capable of changing line data.

NOTE

	Calling set_entry() with a 0 as the second argument will
	delete a player's data from the database. More importantly,
	it will do this WITHOUT destructing the line_player or doing
	any other kind of clean up on the player. The best way to
	remove a player from the line is by destructing his line mark.

NOTE

	Handle this function with care! If set_entry determines the
	data passed to it to be bad, the call will be thrown out!
	Unless you're _exactly_ sure of what you're doing, it's best
	to only use set_entry when the second argument is simply an
	entry you got by using query_entry() and modifying it.

FUNCTION


NAME

        query_entry - Show a player's line data.

SYNTAX

        mixed *query_entry(object player)

DESCRIPTION

	Return the player's entry in the line database.

NOTE

	The entry returned is a pointer, not a copy-- be aware of
	this as you make modifications.

FUNCTION


NAME

        set_special - Set a special value for the player.

SYNTAX

        void set_special(object player,mixed name,mixed value)

DESCRIPTION

	Set a special value for the player in the database.
	The only special value used by the default line_control
	is 'linecursed'. This is just a means of storing internal
	data for your club/guild which is related to the line.
	For example, with proper use of some remote functions, you
	could use set_special to store the number of times a player
	has sent a message across the line, this login.

NOTE

	When set_special is run, if the old list of special entries
	is not a mapping, the old copy of the list is saved in the
	special value 'old_data'. This is probably not useful, but
	it's been added just in case.

NOTE

	The linecursed entry, when set to a true value, prevents the
	player from sending or receiving messages on the line.

NOTE

	There is no remove_special, and therefore no way to actually
	delete an entry other than just setting the value to 0.
	There is also no way to determine if an entry with a value of
	0 has been added to the list.

	Actually, in both cases, query_entry() can be used to get
	this data. But it's still clumsier than a remove_special
	would be. Maybe one will be added someday, if there is a
	real need.

EXAMPLE

	set_special(find_player("pyro"),"linecursed",1); // cursed

EXAMPLE

	set_special(find_player("pyro"),"linecursed",0); // uncursed

FUNCTION


NAME

        query_special - Show a special value for a player.

SYNTAX

        mixed query_special(object player,mixed name)

DESCRIPTION

	Show the value of a special entry for the player.

NOTE

	There is no way to distinguish between a 0 resulting from
	'no such entry' and a 0 that was set by set_special.

NOTE

	Arrays, mappings, and possibly strings returned by
	query_special are shared; this could present a security issue
	in certain places.

FUNCTION


NAME

        set_offline - Set a player's offline status.

SYNTAX

        varargs void set_offline(object player,int value[,int level])

DESCRIPTION

	This function is used to set a player's offline status.
	Offline is handled two ways in stdline. The first of these
	is to allow players to go entirely offline (except for tells)
	or entirely online. The second way is to let players turn
	off certain aspects of the line, but not others.
	The second way uses values for line messages:
		tells
		normal messages
		low-priority messages
		high priority messages
	All of these can be turned off individually, although using
	the default online and offline commands, mortals can not turn
	off the high priority messages.
	In any case, the functioning of those commands is discussed
	further in the descriptions of each individual function.	The way the set_offline function works is this:
	The first argument is the player to go offline.
	The second argument is a 1 or a 0.
	If it's a 1, the player is to go offline. 0 means online.
	The third argument is optional. If it is not given, then the
	1 or 0 means totally offline (except for tells) or totally
	online, respectively. Otherwise, it is a specific level of
	messages which are turned off or on. This is accomplished
	by the use of a bit-flag. The valid values for the third
	argument to set_offline are defined in line.h; use the tokens
	provided instead of the actual number, so that if the numbers
	change your code doesn't break.
	The tokens are, at the time of this writing:
		OFFLINE_LOW
		OFFLINE_PRI
		OFFLINE_STD
		OFFLINE_TELL
		OFFLINE_ALL
	There is an OFFLINE_NONE token, but this is for internal use
	only; don't use it in set_offline or query_offline.

NOTE

	The effect of providing a third argument other than a correct
	usage of the OFFLINE* tokens is undefined.

NOTE

	The effect of set_offline can be accomplished without sanity
	checks by using set_entry instead. As will all other
	applications of set_entry, use at your own risk!

EXAMPLE

	set_offline(this_player(),1,OFFLINE_LOW);
		Turns off low-priority messages like login messages.

EXAMPLE

	set_offline(this_player(),0);
		Go totally online.

EXAMPLE

	set_offline(this_player(),1,OFFLINE_ALL)
		Go _totally_ offline, even tells.

FUNCTION


NAME

        query_offline - Check a player's offline status.

SYNTAX

        varargs int query_offline(object player[,int level])

DESCRIPTION

	Returns the offline value for a player. If the optional
	second argument is provided (e.g. OFFLINE_LOW), then 1 is
	returned if the player is offline toward that priority level
	of messages, and 0 is returned otherwise.
	If the second argument is not given, then the actual value
	of the offline flag is returned. This will be a number
	between 0 and OFFLINE_ALL. It is the result of all the
	offline flags ORed together by the | operator.

NOTE

	If you're using the simple online and offline commands, then
	you don't need to give the second argument to query_offline;
	barring interference through commands like patch, the only
	value other than 0 that you should get is OFFLINE_ALL.

NOTE

	A message can get through even if the player is offline, if
	the remote function remote_pass_offline_message() allows it.

NOTE

	If the second argument is given and it is something other
	than a correct usage of the OFFLINE_* tokens, the result from
	this function may not be meaningful.

FUNCTION


NAME

        do_line_cost - Extract a cost for using the line.

SYNTAX

        int do_line_cost(object player,int cost,string message)

DESCRIPTION

	This function extracts a cost from the player for using the
	line. A true result means that the cost was successfully
	extracted, and a result of 0 means that the player was not
	able to pay some or all of the costs necessary to use the
	line, and that proper notify_fail messages have been set.

	Wizards pay no cost unless the property wizard_linecost has
	been set. For tells only, paragons pay no cost if the
	no_free_linetos property has not been set (although that
	property is checked in cmd_lineto, not do_line_cost).

	After those two properties have been checked, the remote
	function remote_do_line_cost is called (see the description
	of that function). The player may be asked to pay optional,
	mandatory, or alternative costs at this point.

	Once the remote_do_line_cost has been dealt with, if the
	property prevent_cost_modifiers has not been set, then the
	value_line_cost_hook is evaluated; this works in a similar
	fashion to remote_do_line_cost (and is documented in the help
	for hooks), but allows guilds, objects, and other items to
	require the player to pay extra mandatory, optional, or even
	alternative costs (for example, the Khorne guild could use a
	hook that lets their members spend hp instead of sp).

	Finally, after all the properties, remote functions, and
	hooks have been checked, if the player has the sp to pay for
	the message, they do so.

FUNCTION


NAME

        remote_do_line_cost - Remote function for do_line_cost.

SYNTAX

	int remote_do_line_cost(object line,
				object player,
				int cost,
	                        string message)

DESCRIPTION

	This is the remote function for do_line_cost. It lets the
	programmer implement special costs either as an alternative
	for spell points or above and beyond spell points.

	Do whatever you need to in this code to handle the line
	costs; there are three possible results from this function.

RETURN VALUES

	0: A line cost might have been paid, but the player is still
	expected to owe spell points. Just keep going.
	1: The player paid a line cost, and they don't owe sp or
	anything else. We're finished, let the player send the
	message.
	-1: The player was not able to pay a cost that they are
	required to pay. Don't allow the player to send the message.
	You must use your own notify_fail() here; no other will be
	sent.

FUNCTION


NAME

        treat_message - Process a message to be sent to a player.

SYNTAX

	varargs mixed treat_message(string message,
				    object player,
	                            int is_tell)

DESCRIPTION

	This is the function where most of the text processing for
	messages sent across the line happens. Priority levels of
	messages are determined and handled here, linebreaking
	happens here, preventing linecursed players from hearing
	anything that goes across the line happens here, and
	other miscellaneous processing of messages (like the old
	Sadclub's converting of all :), :-), etc to :(, :-(, etc) is
	also handled here. Other than basic things like addressing
	message priority levels, linecursing, and offline values,
	two hooks and three properties are used here.

	The properties are the alternate linenames used for low
	priority messages, high priority messages, and incoming
	linetos. For example, you could have something like this:

		(Test) Beldinjr enters the game.
		[Test] Beldin: Hi there.
	        [Test] Beldinjr tells you: this is really an emote
		 Beldinjr tells you: but this is a real tell
	        [Test] Test Daemon: The pub is now restocked.
	By doing:
		set_linename("[Test] ");
		add_property("linename_low","(Test) ");
		add_property("linename_tell"," ");
		add_property("linename_pri","[Test] Test Daemon: ");

	And all that is handled in treat_message().

	The first remote function is remote_pass_offline_message.
	This does exactly what you might think-- passes a message to
	a player even though they are offline in respect to that type
	of message. For example, a fascist guildhead might code
	the line so that even offline players hear anything he says
	on the line. :)

	The second remote function is remote_treat_message. This is
	used to give the coder a chance to modify what a player hears
	between when it's sent and when it's received. The Sadclub
	example mentioned above would operate using this.

	Other than that, treat_message is largely internal and you
	probably won't need to know anything more about it. But it
	is good to know that it's there.
	Both remote functions are described below.

NOTE

	It is possible that the second argument to this function, the
	player, might be 0. This case is probably the line reviewer,
	which also calls treat_message().

FUNCTION


NAME

        remote_pass_offline_message - Allow a message to reach an offline player.

SYNTAX

	int remote_pass_offline_message(object control,
	                                object player,
	                                string message,
	                                int priority_code)

DESCRIPTION

	The message is processed in respect to line names, but not
	linebroken or modified by remote_treat_message.	The priority code is a number, as detailed above in the
	description of set_offline().

RETURN VALUES

	A true value means the message reaches the player.
	A false value means the message doesn't reach the player.

NOTE

	Just because you return 1 here doesn't mean the player is
	certain to get the message. If they are linecursed they will
	miss the message anyway, unless it's high-priority.

FUNCTION


NAME

        remote_treat_message - Process the text of a message.

SYNTAX

	string remote_treat_message(object control,
	                            string message,
	                            string linename,
	                            object player)

DESCRIPTION

	If a string is returned, that message is sent to the player
	instead of 'message' variable.
	Note that a return of "" will still allow the message to pass
	through to the player, as the linename with nothing trailing.

NOTE

	This is a cpu-intensive function, as it will be executed once
	for every player that hears the message sent. So if you use
	it, make sure that this function has as low a cpu-cost as
	possible. Particularly, avoid using catch, call_other, and
	long loops if at all possible.

FUNCTION


NAME

        send_line_message - Send a system message across the line.

SYNTAX

        void send_line_message(string message,int priority_flag)

DESCRIPTION

	This function sends a system message across the line. The
	first argument is the message to send. The second argument,
	if true, sends the message at high priority. If the second
	argument is false, the message is sent at low priority. The
	logic behind this is that the only messages blocked by
	OFFLINE_STD should be messages sent from other players. This
	way a player can turn off chatter on the line without turning
	off messages sent by the line itself.

NOTE

	This is a support function separate from the actual 'send'
	command and players should never have access to it directly.

NOTE

	Use this message to generate a system message instead of any
	other means-- this is the one that will be maintained, in
	respect to how priority codes are handled (it may change in
	the future).

FUNCTION


NAME

        remote_check_one_player - A callback after a player's data has gone through a sanity check.

SYNTAX

	void remote_check_one_player(object control,
				     object player,
				     mixed *entry)

DESCRIPTION

	This function is simply here so that when a player's data
	survives a sanity check, you have the opportunity to run a
	sanity check of your own.

NOTE

	This function is never called if the player's database entry
	fails a sanity test: at that point the entry is erased.

FUNCTION


NAME

        remote_prevent_init - remote_prevent_init

SYNTAX

	int remote_prevent_init(object control,
	                        object player,
				object linemark)

DESCRIPTION

	It happens when init() is run in a player's line mark.
	It executes when a player tries to connect to the
	line for the first time. A true result prevents the player
	from being allowed to join the line, but their line mark is
	not destructed.

NOTE

	remote_signal_login happens even before remote_prevent_init
	executes.

FUNCTION


NAME

        remote_init - remote_init

SYNTAX

	void remote_init(object control,
	                 object player,
			 mixed *database_entry)

DESCRIPTION

	It happens when init() is run in a player's line mark.
	It is run after a player has successfully connected
	to the line for the first time. At this point, the player is
	totally ready to start sending messages on the line.

FUNCTION


NAME

        remote_reinit - remote_reinit

SYNTAX

	void remote_reinit(object control,
	                   object player,
			   object linemark)

DESCRIPTION

	It happens when init() is run in a player's line mark.
	It happens when the player has reconnected to the line or
	when init() has been recalled in the object for some other
	reason. It is probably not useful, except for sanity checks.

FUNCTION


NAME

        remote_signal_login - remote_signal_login

SYNTAX

	void remote_signal_login(object control,
	                         object player,
				 string init_argument)

DESCRIPTION

	It runs if connect reports are active.
	It prints a message to the line, and is triggered by init_arg
	in the player's line mark.

NOTE

	remote_signal_login happens even before remote_prevent_init
	executes.

NOTE

	remote_signal_login is executed in the line control if no
	remote object has been defined. This is the only remote
	function in stdline where this is the case.

FUNCTION


NAME

        remote_prevent_exit - remote_prevent_exit

SYNTAX

	int remote_prevent_exit(object control,
	                        object player,
				object linemark)

DESCRIPTION

	When remote_prevent_exit returns a true value, it prevents
	the player's data from being taken off the line even though
	the linemark is desting; there is probably never a valid
	reason for this-- rather, it is a sort of last chance to do
	something that requires that the player's line data still be
	there.

FUNCTION


NAME

        remote_exit - remote_exit

SYNTAX

	void remote_exit(object control,
	                 object player,
			 object linemark)

DESCRIPTION

	It simply runs immediately after all the data has
	been removed. It's a chance to do any additional cleanup
	which is associated with the player leaving the line.

FUNCTION


NAME

        cmd_line - The default 'send' command.

SYNTAX

        int cmd_line(string junk,string message)

DESCRIPTION

	These are the default commands for stdline. You link them
	into your line with add_command() in your line_control:
		add_command("Test %s","@cmd_line()");
	Where 'Test' is the send command.
	See the line object in the examples directory for a more
	complete example.

        In the SYNTAX section above, the functions with arguments need
	an add_command like this:
		add_command("Test %s","@cmd_line()");
	but the ones without arguments need not use the %s.
	If you want your send command without arguments to be your
	who command, you can do:
		add_command("Test %s","@cmd_line()");
		add_command("Test","@cmd_linewho()");

	If any of the commands are unsatisfactory for any reason, all
	you need to do is write your own-- you can use the command in
	/std/line/line_control.c as a template on which to base your
	new command.

NOTE

	Note that if you have a remote object other than your line
	controller defined, you will have to change the code thus:
		add_command("Test %s","@line_control->cmd_line()");
	where line_control is the filename of your line controller.

NOTE

	If you have add_command()'ed cmd_review, but your line
	controller has no reviewer in it, cmd_review will still
	be a valid command, not even producing a 'What?'.

NOTE

	You probably don't need to define print_offline_status as a
	command by way of add_command-- cmd_offline and	cmd_online
	both call it already. But you might want to redefine it to
	give a little bit more or less information, or to give the
	information in a different layout.

FUNCTION


NAME

        cmd_lineto - The default 'sendto' command.

SYNTAX

        int cmd_lineto(string junk, string destination+message)

DESCRIPTION

	See the descriptions and notes from cmd_line.

FUNCTION


NAME

        cmd_reply - The default 'sendreply' command.

SYNTAX

        int cmd_reply(string junk,string message)

DESCRIPTION

	See the descriptions and notes from cmd_line.

FUNCTION


NAME

        cmd_simple_online - The simple way to go online.

SYNTAX

        int cmd_simple_online()

DESCRIPTION

	See the descriptions and notes from cmd_line.

FUNCTION


NAME

        cmd_simple_offline - The simple way to go offline.

SYNTAX

        int cmd_simple_offline()

DESCRIPTION

	See the descriptions and notes from cmd_line.

FUNCTION


NAME

        cmd_online - The smart way to go online.

SYNTAX

        int cmd_online(string junk,string message)

DESCRIPTION

	See the descriptions and notes from cmd_line.

FUNCTION


NAME

        cmd_offline - The smart way to go offline.

SYNTAX

        int cmd_offline(string junk,string message)

DESCRIPTION

	See the descriptions and notes from cmd_line.

FUNCTION


NAME

        cmd_linewho - The default linewho command.

SYNTAX

        int cmd_linewho()

DESCRIPTION

	See the descriptions and notes from cmd_line.

FUNCTION


NAME

        cmd_review - The review command.

SYNTAX

        int cmd_review()

DESCRIPTION

	See the descriptions and notes from cmd_line.

FUNCTION


NAME

        print_offline_status - Print offline status.

SYNTAX

        int print_offline_status()

DESCRIPTION

	See the descriptions and notes from cmd_line.

FUNCTION


NAME

        remote_block_send - Prevent a message from being sent.

SYNTAX

	int remote_block_send(object control,
	                      object player,
	                      string message)

DESCRIPTION

	remote_block_send, remote_block_lineto and remote_do_lineto
	are used to get a little bit of extra control over the
	cmd_line and cmd_lineto functions, so that there won't be as
	much of a need to redefine them.	remote_block_send and remote_block_lineto both block their
	respective actions from happening when a true value is
	returned.

FUNCTION


NAME

        remote_block_lineto - Prevent a lineto from being sent.

SYNTAX

	int remote_block_lineto(object control,
	                        string target,
	                        string message)

DESCRIPTION

	remote_block_send, remote_block_lineto and remote_do_lineto
	are used to get a little bit of extra control over the
	cmd_line and cmd_lineto functions, so that there won't be as
	much of a need to redefine them.	remote_block_send and remote_block_lineto both block their
	respective actions from happening when a true value is
	returned.

NOTE

	The message in remote_block_lineto is unprocessed, while the
	message in remote_do_lineto is processed.
The message in remote_block_lineto is unprocessed.

FUNCTION


NAME

        remote_do_lineto - Callback after a lineto has been sent.

SYNTAX

	void remote_do_lineto(object control,
	                      object player,
	                      object target_line_player,
	                      string message)

DESCRIPTION

	remote_block_send, remote_block_lineto and remote_do_lineto
	are used to get a little bit of extra control over the
	cmd_line and cmd_lineto functions, so that there won't be as
	much of a need to redefine them.	remote_do_lineto executes after the lineto has been sent. 

NOTE

	The message in remote_block_lineto is unprocessed, while the
	message in remote_do_lineto is processed.

FUNCTION


NAME

        add_reviewer - A function for add_object() to add a reviewer to the line.

SYNTAX

        object add_reviewer(mixed x)

DESCRIPTION

	This function is the means of adding a reviewer to the line.
	You do so by the syntax used in the example below.
	The argument is the number of lines stored in the reviewer.
	If none is given it defaults to 20.
	The property use_reviewer can be used to give a non-standard
	reviewer object.

NOTE

	Just like with cmd_line() and the other default command
	functions, if you have a remote object other than your line
	controller, you must do "@line_control->add_reviewer(20)"
	instead.

EXAMPLE

	add_object("@add_reviewer()");

EXAMPLE

	add_object("@add_reviewer(20)");