[PENNMUSH-ANNOUNCE] 1.7.6-patch04
dunemush at tala.mede.uic.edu
dunemush at tala.mede.uic.edu
Mon Jan 6 16:19:57 CST 2003
This is patch04 to PennMUSH 1.7.6. After applying this patch, you will
have version 1.7.6p4
To apply this patch, save it to a file in your top-level MUSH directory,
and do the following:
patch -p1 < 1.7.6-patch04
make install
If you use GNU patch 2.2, you probably want the above to be 'patch -b -p1',
not just 'patch -p1'.
Unix (or cygwin) users need not worry about failed hunks in src/switchinc.c,
hdrs/switches.h, hdrs/cmds.h, or hdrs/funs.h. These files are automatically
rebuilt on compile.
Then @shutdown and restart your MUSH.
- Alan/Javelin
In this patch:
Minor Changes:
* English-style matching now applies to exits in the room
(so '1st down' can match the first 'down' exit if you're not carrying
anything that matches 'down'). New english-style matching adjective
'toward' restricts the match to exits (so: 'look toward 1st down').
Fixes:
* Code cleanup to fix several potential buffer overflows.
* The wildcard matcher had problems with backslash escapes in
some cases, making matching a : in a $command very hard.
Reported by Wayne at PDX. * @chzone could cause crashes on some systems. Reported by Wayne at PDX. * When two exits match, one is no longer chosen at random.
Instead, the ambiguity should be reported as an error.
Reported by Intrevis at MS*H.
* The dbref returned by locate when given the X parameter is
no longer random, but the last one found (as per the help).
* Serious bug in reading locks from the db on startup corrected.
* The profiling timer is turned off duing dumps, as some systems
(FreeBSD?) appear to continue to use it and interrupt dumps
due to cpu limiting. Reported by Nathan Schuette.
Prereq: 1.7.6p3
*** 1_7_6.82/Patchlevel Sun, 22 Dec 2002 17:19:09 -0600 dunemush (pennmush/5_Patchlevel 1.17.1.11.1.1.1.3 600)
--- 1_7_6.99(w)/Patchlevel Thu, 02 Jan 2003 23:31:05 -0600 dunemush (pennmush/5_Patchlevel 1.17.1.11.1.1.1.4 600)
***************
*** 1,2 ****
Do not edit this file. It is maintained by the official PennMUSH patches.
! This is PennMUSH 1.7.6p3
--- 1,2 ----
Do not edit this file. It is maintained by the official PennMUSH patches.
! This is PennMUSH 1.7.6p4
*** 1_7_6.82/CHANGES Tue, 24 Dec 2002 15:13:59 -0600 dunemush (pennmush/g/17_CHANGES 1.10.1.6.1.2.1.2.1.1.1.1.1.2.1.1.1.1.1.1.1.1.1.1.1.3.1.1.1.1.1.9.1.1.1.1.1.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1 600)
--- 1_7_6.99(w)/CHANGES Mon, 06 Jan 2003 11:36:30 -0600 dunemush (pennmush/g/17_CHANGES 1.10.1.6.1.2.1.2.1.1.1.1.1.2.1.1.1.1.1.1.1.1.1.1.1.3.1.1.1.1.1.9.1.1.1.1.1.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1 600)
***************
*** 18,23 ****
--- 18,47 ----
==========================================================================
+ Version 1.7.6 patchlevel 4 January 2, 2003
+
+ Minor Changes:
+ * English-style matching now applies to exits in the room
+ (so '1st down' can match the first 'down' exit if you're not carrying
+ anything that matches 'down'). New english-style matching adjective
+ 'toward' restricts the match to exits (so: 'look toward 1st down').
+ Fixes:
+ * Code cleanup to fix several potential buffer overflows.
+ * The wildcard matcher had problems with backslash escapes in
+ some cases, making matching a : in a $command very hard.
+ Reported by Wayne at PDX.+ * @chzone could cause crashes on some systems. Reported by Wayne at PDX.+ * When two exits match, one is no longer chosen at random.
+ Instead, the ambiguity should be reported as an error.
+ Reported by Intrevis at MS*H.
+ * The dbref returned by locate when given the X parameter is
+ no longer random, but the last one found (as per the help).
+ * Serious bug in reading locks from the db on startup corrected.
+ * The profiling timer is turned off duing dumps, as some systems
+ (FreeBSD?) appear to continue to use it and interrupt dumps
+ due to cpu limiting. Reported by Nathan Schuette.
+
+
Version 1.7.6 patchlevel 3 December 22, 2002
Minor changes:
*** 1_7_6.82/game/txt/hlp/pennvers.hlp Tue, 24 Dec 2002 15:13:59 -0600 dunemush (pennmush/12_pennvers.h 1.169.1.42.1.3.1.2.2.2.1.1.1.3.1.1.1.5.1.4.1.1.1.1.1.1.1.1.1.5.1.1.1.3.1.1.1.3.1.1.1.54.1.10.1.2.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.7.1.1.1.1.1.2.1.1.1.4.1.1 600)
--- 1_7_6.99(w)/game/txt/hlp/pennvers.hlp Mon, 06 Jan 2003 12:48:02 -0600 dunemush (pennmush/12_pennvers.h 1.169.1.42.1.3.1.2.2.2.1.1.1.3.1.1.1.5.1.4.1.1.1.1.1.1.1.1.1.5.1.1.1.3.1.1.1.3.1.1.1.54.1.10.1.2.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.7.1.1.1.1.1.2.1.1.1.4.1.2.1.1.1.1.1.1.1.2.1.1 600)
***************
*** 1,5 ****
& changes
! & 1.7.6p3
This is a list of changes in this patchlevel which are probably of
interest to players. More information about new commands and functions
can probably be gotten via 'help <name of whatever>'. 'help credits'
--- 1,5 ----
& changes
! & 1.7.6p4
This is a list of changes in this patchlevel which are probably of
interest to players. More information about new commands and functions
can probably be gotten via 'help <name of whatever>'. 'help credits'
***************
*** 11,16 ****
--- 11,41 ----
A list of the patchlevels associated with each release can
be read in 'help patchlevels'.
+ Version 1.7.6 patchlevel 4 January 2, 2003
+
+ Minor Changes:
+ * English-style matching now applies to exits in the room
+ (so '1st down' can match the first 'down' exit if you're not carrying
+ anything that matches 'down'). New english-style matching adjective
+ 'toward' restricts the match to exits (so: 'look toward 1st down').
+ Fixes:
+ * Code cleanup to fix several potential buffer overflows.
+ * The wildcard matcher had problems with backslash escapes in
+ some cases, making matching a : in a $command very hard.
+ Reported by Wayne at PDX.+ * @chzone could cause crashes on some systems. Reported by Wayne at PDX.+ * When two exits match, one is no longer chosen at random.
+ Instead, the ambiguity should be reported as an error.
+ Reported by Intrevis at MS*H.
+ * The dbref returned by locate when given the X parameter is
+ no longer random, but the last one found (as per the help).
+ * Serious bug in reading locks from the db on startup corrected.
+ * The profiling timer is turned off duing dumps, as some systems
+ (FreeBSD?) appear to continue to use it and interrupt dumps
+ due to cpu limiting. Reported by Nathan Schuette.
+
+
+ & 1.7.6p3
Version 1.7.6 patchlevel 3 December 22, 2002
Minor changes:
***************
*** 5796,5802 ****
For information on a specific patchlevel of one of the versions listed,
type 'help <version>p<patchlevel>'. For example, 'help 1.7.2p3'
! 1.7.6: 0, 1, 2, 3
1.7.5: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
1.7.4: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
19, 20
--- 5821,5827 ----
For information on a specific patchlevel of one of the versions listed,
type 'help <version>p<patchlevel>'. For example, 'help 1.7.2p3'
! 1.7.6: 0, 1, 2, 3, 4
1.7.5: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
1.7.4: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
19, 20
*** 1_7_6.82/game/txt/hlp/penntop.hlp Tue, 26 Nov 2002 14:28:59 -0600 dunemush (pennmush/13_penntop.hl 1.2.1.27.1.3.1.2.1.2.1.1.1.1.1.1.1.1.1.12 600)
--- 1_7_6.99(w)/game/txt/hlp/penntop.hlp Mon, 30 Dec 2002 23:30:31 -0600 dunemush (pennmush/13_penntop.hl 1.2.1.27.1.3.1.2.1.2.1.1.1.1.1.1.1.1.1.12.1.1 600)
***************
*** 1781,1790 ****
Adjectives include:
* my <obj> - an object you're carrying
* this <obj> - an object in your location (also: this here <obj>)
* 1st, 2nd, etc. <obj> - one of a set of objects with the same names.
Objects are ordered in the order in which they're listed in your
! inventory or room contents.
! You may combine some adjectives (my 1st box, this here 2nd box.
& &HELP
This is the AHELP index.
& RESTRICT
--- 1781,1791 ----
Adjectives include:
* my <obj> - an object you're carrying
* this <obj> - an object in your location (also: this here <obj>)
+ * toward <exit> - an exit in your location
* 1st, 2nd, etc. <obj> - one of a set of objects with the same names.
Objects are ordered in the order in which they're listed in your
! inventory, room contents, and exit list (in that order).
! You may combine some adjectives (my 1st box, this here 2nd box).
& &HELP
This is the AHELP index.
& RESTRICT
*** 1_7_6.82/game/txt/hlp/pennfunc.hlp Tue, 24 Dec 2002 15:13:59 -0600 dunemush (pennmush/16_pennfunc.h 1.2.1.50.1.1.1.1.1.2.1.7.1.8.1.1.1.1.1.1.1.1.1.1.1.1.1.3.1.1.1.1.1.1.1.1.1.1.1.1.1.9.1.1.1.1.1.3.1.1.1.1.1.1 600)
--- 1_7_6.99(w)/game/txt/hlp/pennfunc.hlp Mon, 30 Dec 2002 18:33:47 -0600 dunemush (pennmush/16_pennfunc.h 1.2.1.50.1.1.1.1.1.2.1.7.1.8.1.1.1.1.1.1.1.1.1.1.1.1.1.3.1.1.1.1.1.1.1.1.1.1.1.1.1.9.1.1.1.1.1.3.1.1.1.1.1.1.1.1 600)
***************
*** 1823,1829 ****
T - Things
F - Return #-1 if what's found is of a different type than the
preferred one.
! X - Never return #-2. Use the last dbref found if the match is
ambiguous.
If you specify more than one type, the last one will be preferred. Unless
you specify an F option, if an object of a different type is found and
--- 1823,1829 ----
T - Things
F - Return #-1 if what's found is of a different type than the
preferred one.
! X - Never return #-2. Use the last dbref found if the match is
ambiguous.
If you specify more than one type, the last one will be preferred. Unless
you specify an F option, if an object of a different type is found and
*** 1_7_6.82/src/wiz.c Sun, 22 Dec 2002 01:03:36 -0600 dunemush (pennmush/b/23_wiz.c 1.44.1.1.1.1.1.2.1.7.1.1.1.1.1.1.1.1.1.1.1.8.1.2.2.2.1.2.1.1.1.1.1.1.1.2.1.1 660)
--- 1_7_6.99(w)/src/wiz.c Mon, 06 Jan 2003 15:51:33 -0600 dunemush (pennmush/b/23_wiz.c 1.44.1.1.1.1.1.2.1.7.1.1.1.1.1.1.1.1.1.1.1.8.1.2.2.2.1.2.1.1.1.1.1.1.1.2.1.1.1.1 660)
***************
*** 1899,1904 ****
--- 1899,1905 ----
if (paranoid_checkpt < 1)
paranoid_checkpt = 1;
}
+ fork_and_dump(0);
#ifndef WIN32
/* Some broken libcs appear to retain the itimer across exec!
* So we make sure that if we get a SIGPROF in our next incarnation,
***************
*** 1906,1912 ****
*/
ignore_signal(SIGPROF);
#endif
- fork_and_dump(0);
dump_reboot_db();
#ifdef INFO_SLAVE
kill_info_slave();
--- 1907,1912 ----
*** 1_7_6.82/src/wild.c Tue, 20 Aug 2002 09:48:05 -0500 dunemush (pennmush/b/24_wild.c 1.11.1.1.1.8 660)
--- 1_7_6.99(w)/src/wild.c Mon, 06 Jan 2003 15:51:33 -0600 dunemush (pennmush/b/24_wild.c 1.11.1.1.1.8.1.1.1.4.1.1 660)
***************
*** 52,57 ****
--- 52,58 ----
(const char *tstr, const char *dstr, int arg, char *wbuf, int cs);
static int wild(const char *s, const char *d, int p, int cs);
static int check_literals(const char *tstr, const char *dstr, int cs);
+ static char *strip_backslashes(const char *str);
/* ---------------------------------------------------------------------------
* quick_wild: do a wildcard match, without remembering the wild data.
***************
*** 525,532 ****
char *sp, *dp;
strncpy(dbuf1, dstr, BUFFER_LEN - 1);
dbuf1[BUFFER_LEN - 1] = '\0';
! strncpy(tbuf1, tstr, BUFFER_LEN - 1);
! tbuf1[BUFFER_LEN - 1] = '\0';
if (!cs) {
upcasestr(tbuf1);
upcasestr(dbuf1);
--- 526,532 ----
char *sp, *dp;
strncpy(dbuf1, dstr, BUFFER_LEN - 1);
dbuf1[BUFFER_LEN - 1] = '\0';
! strcpy(tbuf1, strip_backslashes(tstr));
if (!cs) {
upcasestr(tbuf1);
upcasestr(dbuf1);
***************
*** 543,545 ****
--- 543,562 ----
}
return 1;
}
+
+
+ static char *
+ strip_backslashes(const char *str)
+ {
+ /* Remove backslashes from a string, and return it in a static buffer */
+ static char buf[BUFFER_LEN];
+ int i = 0;
+
+ while (*str && (i < BUFFER_LEN - 1)) {
+ if (*str == '\\' && *(str + 1))
+ str++;
+ buf[i++] = *str++;
+ }
+ buf[i] = '\0';
+ return buf;
+ }
*** 1_7_6.82/src/unparse.c Sun, 10 Nov 2002 14:27:19 -0600 dunemush (pennmush/b/28_unparse.c 1.16.1.7 660)
--- 1_7_6.99(w)/src/unparse.c Mon, 06 Jan 2003 15:51:33 -0600 dunemush (pennmush/b/28_unparse.c 1.16.1.7.1.1 660)
***************
*** 85,91 ****
real_unparse(dbref player, dbref loc, int obey_myopic, int use_nameformat,
int use_nameaccent)
{
! static char buf[BUFFER_LEN];
static char tbuf1[BUFFER_LEN];
char *p;
int got_nameformat = 0;
--- 85,91 ----
real_unparse(dbref player, dbref loc, int obey_myopic, int use_nameformat,
int use_nameaccent)
{
! static char buf[BUFFER_LEN], *bp;
static char tbuf1[BUFFER_LEN];
char *p;
int got_nameformat = 0;
***************
*** 123,138 ****
/* show everything */
if (SUPPORT_PUEBLO)
couldunparse = 1;
if (ANSI_NAMES && ShowAnsi(player) && !got_nameformat)
! sprintf(buf, "%s%s%s(#%d%s)", ANSI_HILITE, tbuf1,
! ANSI_NORMAL, loc, unparse_flags(loc, player));
else
! sprintf(buf, "%s(#%d%s)", tbuf1, loc, unparse_flags(loc, player));
return buf;
} else {
/* show only the name */
if (ANSI_NAMES && ShowAnsi(player) && !got_nameformat) {
! sprintf(buf, "%s%s%s", ANSI_HILITE, tbuf1, ANSI_NORMAL);
return buf;
} else
return tbuf1;
--- 123,143 ----
/* show everything */
if (SUPPORT_PUEBLO)
couldunparse = 1;
+ bp = buf;
if (ANSI_NAMES && ShowAnsi(player) && !got_nameformat)
! safe_format(buf, &bp, "%s%s%s(#%d%s)", ANSI_HILITE, tbuf1,
! ANSI_NORMAL, loc, unparse_flags(loc, player));
else
! safe_format(buf, &bp, "%s(#%d%s)", tbuf1, loc,
! unparse_flags(loc, player));
! *bp = '\0';
return buf;
} else {
/* show only the name */
if (ANSI_NAMES && ShowAnsi(player) && !got_nameformat) {
! bp = buf;
! safe_format(buf, &bp, "%s%s%s", ANSI_HILITE, tbuf1, ANSI_NORMAL);
! *bp = '\0';
return buf;
} else
return tbuf1;
*** 1_7_6.82/src/set.c Sat, 30 Nov 2002 15:49:22 -0600 dunemush (pennmush/b/38_set.c 1.26.1.5.1.1.2.1.1.1.1.1.1.11 660)
--- 1_7_6.99(w)/src/set.c Mon, 06 Jan 2003 15:51:32 -0600 dunemush (pennmush/b/38_set.c 1.26.1.5.1.1.2.1.1.1.1.1.1.11.1.1 660)
***************
*** 368,374 ****
return 0;
}
/* Don't allow circular zones */
! {
dbref tmp;
for (tmp = Zone(zone); GoodObject(tmp); tmp = Zone(tmp)) {
if (tmp == thing) {
--- 368,374 ----
return 0;
}
/* Don't allow circular zones */
! if (GoodObject(zone)) {
dbref tmp;
for (tmp = Zone(zone); GoodObject(tmp); tmp = Zone(tmp)) {
if (tmp == thing) {
*** 1_7_6.82/src/rob.c Sat, 30 Nov 2002 15:49:22 -0600 dunemush (pennmush/b/42_rob.c 1.18.1.2.1.3.1.3.1.6 660)
--- 1_7_6.99(w)/src/rob.c Mon, 06 Jan 2003 15:51:32 -0600 dunemush (pennmush/b/42_rob.c 1.18.1.2.1.3.1.3.1.7 660)
***************
*** 23,29 ****
do_kill(dbref player, const char *what, int cost, int slay)
{
dbref victim;
! char tbuf1[BUFFER_LEN], tbuf2[BUFFER_LEN];
if (slay && !Wizard(player)) {
notify(player, T("You do not have such power."));
--- 23,29 ----
do_kill(dbref player, const char *what, int cost, int slay)
{
dbref victim;
! char tbuf1[BUFFER_LEN], tbuf2[BUFFER_LEN], *tp;
if (slay && !Wizard(player)) {
notify(player, T("You do not have such power."));
***************
*** 76,83 ****
if (((get_random_long(0, KILL_BASE_COST) < cost) || slay) &&
!Wizard(victim)) {
/* you killed him */
! sprintf(tbuf1, T("You killed %s!"), Name(victim));
! sprintf(tbuf2, "killed %s!", Name(victim));
do_halt(victim, "", victim);
did_it(player, victim, "DEATH", tbuf1, "ODEATH", tbuf2, "ADEATH",
NOTHING);
--- 76,87 ----
if (((get_random_long(0, KILL_BASE_COST) < cost) || slay) &&
!Wizard(victim)) {
/* you killed him */
! tp = tbuf1;
! safe_format(tbuf1, &tp, T("You killed %s!"), Name(victim));
! *tp = '\0';
! tp = tbuf2;
! safe_format(tbuf2, &tp, "killed %s!", Name(victim));
! *tp = '\0';
do_halt(victim, "", victim);
did_it(player, victim, "DEATH", tbuf1, "ODEATH", tbuf2, "ADEATH",
NOTHING);
*** 1_7_6.82/src/player.c Wed, 16 Oct 2002 18:01:52 -0500 dunemush (pennmush/b/47_player.c 1.15.1.1.1.1.1.4.1.6 660)
--- 1_7_6.99(w)/src/player.c Mon, 06 Jan 2003 15:51:32 -0600 dunemush (pennmush/b/47_player.c 1.15.1.1.1.1.1.4.1.6.1.1 660)
***************
*** 504,513 ****
const char *host;
{
char *s;
! char last_place[MAX_COMMAND_LEN];
s = ctime(&mudtime);
! s[strlen(s) - 1] = 0;
! sprintf(last_place, T("%s on %s"), host, s);
(void) atr_add(player, "LASTFAILED", last_place, GOD, NOTHING);
}
--- 504,515 ----
const char *host;
{
char *s;
! char last_place[BUFFER_LEN], *bp;
s = ctime(&mudtime);
! s[strlen(s) - 1] = '\0';
! bp = last_place;
! safe_format(last_place, &bp, T("%s on %s"), host, s);
! *bp = '\0';
(void) atr_add(player, "LASTFAILED", last_place, GOD, NOTHING);
}
*** 1_7_6.82/src/move.c Mon, 07 Oct 2002 22:44:39 -0500 dunemush (pennmush/b/51_move.c 1.1.1.18.1.5.1.13.1.3.1.9.1.1.1.1.1.2.1.1.1.1.1.5 660)
--- 1_7_6.99(w)/src/move.c Mon, 06 Jan 2003 15:51:32 -0600 dunemush (pennmush/b/51_move.c 1.1.1.18.1.5.1.13.1.3.1.9.1.1.1.1.1.2.1.1.1.1.1.9 660)
***************
*** 292,299 ****
if (!strcasecmp(direction, "home") && !Fixed(player))
return 1;
! /* otherwise match on exits */
! return (last_match_result(player, direction, TYPE_EXIT, MAT_EXIT) != NOTHING);
}
static dbref
--- 292,300 ----
if (!strcasecmp(direction, "home") && !Fixed(player))
return 1;
! /* otherwise match on exits - don't use GoodObject here! */
! return (match_result(player, direction, TYPE_EXIT, MAT_ENGLISH | MAT_EXIT) !=
! NOTHING);
}
static dbref
***************
*** 309,315 ****
char buff[BUFFER_LEN], *bp;
ATTR *a;
dbref dest_room;
-
/* We'd like a DESTINATION attribute, but we'll settle for EXITTO,
* for portability
*/
--- 310,315 ----
***************
*** 318,324 ****
a = atr_get(exit_obj, "EXITTO");
if (!a)
return NOTHING;
-
abuf = safe_uncompress(a->value);
if (!abuf)
return NOTHING;
--- 318,323 ----
***************
*** 332,338 ****
PE_DEFAULT, PT_DEFAULT, NULL);
*bp = '\0';
dest_room = parse_dbref(buff);
-
free((Malloc_t) abuf);
return (dest_room);
}
--- 331,336 ----
***************
*** 345,351 ****
int type; /* type 0 is normal, type 1 is global, type 2 is zone */
{
dbref exit_m, loc, var_dest;
-
if (!strcasecmp(direction, "home")) {
/* send him home */
/* but steal all his possessions */
--- 343,348 ----
***************
*** 370,383 ****
if (DO_GLOBALS && (type == 1))
exit_m =
match_result(player, direction, TYPE_EXIT,
! MAT_EXIT | MAT_GLOBAL | MAT_CHECK_KEYS);
else if (DO_GLOBALS && (type == 2))
exit_m =
match_result(player, direction, TYPE_EXIT,
! MAT_EXIT | MAT_REMOTES | MAT_CHECK_KEYS);
else
exit_m =
! match_result(player, direction, TYPE_EXIT, MAT_EXIT | MAT_CHECK_KEYS);
switch (exit_m) {
case NOTHING:
/* try to force the object */
--- 367,381 ----
if (DO_GLOBALS && (type == 1))
exit_m =
match_result(player, direction, TYPE_EXIT,
! MAT_ENGLISH | MAT_EXIT | MAT_GLOBAL | MAT_CHECK_KEYS);
else if (DO_GLOBALS && (type == 2))
exit_m =
match_result(player, direction, TYPE_EXIT,
! MAT_ENGLISH | MAT_EXIT | MAT_REMOTES | MAT_CHECK_KEYS);
else
exit_m =
! match_result(player, direction, TYPE_EXIT,
! MAT_ENGLISH | MAT_EXIT | MAT_CHECK_KEYS);
switch (exit_m) {
case NOTHING:
/* try to force the object */
***************
*** 418,424 ****
did_it(player, exit_m, "SUCCESS", NULL, "OSUCCESS", NULL,
"ASUCCESS", NOTHING);
did_it(player, exit_m, "DROP", NULL, "ODROP", NULL, "ADROP", var_dest);
-
switch (Typeof(var_dest)) {
case TYPE_ROOM:
--- 416,421 ----
***************
*** 430,436 ****
if (Location(player) != loc)
follower_command(player, loc, tprintf("%s #%d", "move", exit_m));
break;
-
case TYPE_PLAYER:
case TYPE_THING:
if (IsGarbage(var_dest)) {
--- 427,432 ----
***************
*** 466,476 ****
{
dbref thing;
dbref loc;
!
! if ((thing = noisy_match_result(player, what, TYPE_EXIT, MAT_EXIT)) ==
! NOTHING)
return;
-
loc = Home(thing);
if (!controls(player, loc)) {
notify(player, T("You cannot modify exits in that room."));
--- 462,471 ----
{
dbref thing;
dbref loc;
! if ((thing =
! noisy_match_result(player, what, TYPE_EXIT,
! MAT_ENGLISH | MAT_EXIT)) == NOTHING)
return;
loc = Home(thing);
if (!controls(player, loc)) {
notify(player, T("You cannot modify exits in that room."));
***************
*** 490,508 ****
{
dbref loc = Location(player);
dbref thing;
! char tbuf1[BUFFER_LEN], tbuf2[BUFFER_LEN];
long match_flags =
MAT_NEIGHBOR | MAT_ABSOLUTE | MAT_CHECK_KEYS | MAT_NEAR | MAT_ENGLISH;
char *myenv[10];
int i;
-
if (!IsRoom(loc) && !EnterOk(loc) && !controls(player, loc)) {
notify(player, T("Permission denied."));
return;
}
if (!Long_Fingers(player))
match_flags |= MAT_CONTROL;
-
if (match_result(player, what, TYPE_THING, match_flags) == NOTHING) {
if (POSSESSIVE_GET) {
/* take care of possessive get (stealing) */
--- 485,501 ----
{
dbref loc = Location(player);
dbref thing;
! char tbuf1[BUFFER_LEN], tbuf2[BUFFER_LEN], *tp;
long match_flags =
MAT_NEIGHBOR | MAT_ABSOLUTE | MAT_CHECK_KEYS | MAT_NEAR | MAT_ENGLISH;
char *myenv[10];
int i;
if (!IsRoom(loc) && !EnterOk(loc) && !controls(player, loc)) {
notify(player, T("Permission denied."));
return;
}
if (!Long_Fingers(player))
match_flags |= MAT_CONTROL;
if (match_result(player, what, TYPE_THING, match_flags) == NOTHING) {
if (POSSESSIVE_GET) {
/* take care of possessive get (stealing) */
***************
*** 524,533 ****
notify_format(Location(thing),
T("%s was taken from you."), Name(thing));
notify_format(thing, T("%s took you."), Name(player));
! sprintf(tbuf1, T("You take %s from %s."), Name(thing),
! Name(Location(thing)));
! sprintf(tbuf2, T("takes %s from %s."), Name(thing),
! Name(Location(thing)));
moveto(thing, player);
did_it(player, thing, "SUCCESS", tbuf1, "OSUCCESS", tbuf2, "ASUCCESS",
NOTHING);
--- 517,530 ----
notify_format(Location(thing),
T("%s was taken from you."), Name(thing));
notify_format(thing, T("%s took you."), Name(player));
! tp = tbuf1;
! safe_format(tbuf1, &tp, T("You take %s from %s."), Name(thing),
! Name(Location(thing)));
! *tp = '\0';
! tp = tbuf2;
! safe_format(tbuf2, &tp, T("takes %s from %s."), Name(thing),
! Name(Location(thing)));
! *tp = '\0';
moveto(thing, player);
did_it(player, thing, "SUCCESS", tbuf1, "OSUCCESS", tbuf2, "ASUCCESS",
NOTHING);
***************
*** 570,577 ****
if (could_doit(player, thing)) {
moveto(thing, player);
notify_format(thing, T("%s took you."), Name(player));
! sprintf(tbuf1, T("You take %s."), Name(thing));
! sprintf(tbuf2, T("takes %s."), Name(thing));
did_it(player, thing, "SUCCESS", tbuf1, "OSUCCESS", tbuf2,
"ASUCCESS", NOTHING);
myenv[0] = (char *) mush_malloc(BUFFER_LEN, "dbref");
--- 567,578 ----
if (could_doit(player, thing)) {
moveto(thing, player);
notify_format(thing, T("%s took you."), Name(player));
! tp = tbuf1;
! safe_format(tbuf1, &tp, T("You take %s."), Name(thing));
! *tp = '\0';
! tp = tbuf2;
! safe_format(tbuf2, &tp, T("takes %s."), Name(thing));
! *tp = '\0';
did_it(player, thing, "SUCCESS", tbuf1, "OSUCCESS", tbuf2,
"ASUCCESS", NOTHING);
myenv[0] = (char *) mush_malloc(BUFFER_LEN, "dbref");
***************
*** 604,614 ****
{
dbref loc;
dbref thing;
! char tbuf1[BUFFER_LEN], tbuf2[BUFFER_LEN];
!
if ((loc = Location(player)) == NOTHING)
return;
-
switch (thing =
match_result(player, name, TYPE_THING,
MAT_POSSESSION | MAT_ABSOLUTE | MAT_CONTROL |
--- 605,613 ----
{
dbref loc;
dbref thing;
! char tbuf1[BUFFER_LEN], tbuf2[BUFFER_LEN], *tp;
if ((loc = Location(player)) == NOTHING)
return;
switch (thing =
match_result(player, name, TYPE_THING,
MAT_POSSESSION | MAT_ABSOLUTE | MAT_CONTROL |
***************
*** 647,654 ****
}
break;
}
! sprintf(tbuf1, T("You drop %s."), Name(thing));
! sprintf(tbuf2, T("drops %s."), Name(thing));
did_it(player, thing, "DROP", tbuf1, "ODROP", tbuf2, "ADROP", NOTHING);
}
--- 646,657 ----
}
break;
}
! tp = tbuf1;
! safe_format(tbuf1, &tp, T("You drop %s."), Name(thing));
! *tp = '\0';
! tp = tbuf2;
! safe_format(tbuf2, &tp, T("drops %s."), Name(thing));
! *tp = '\0';
did_it(player, thing, "DROP", tbuf1, "ODROP", tbuf2, "ADROP", NOTHING);
}
***************
*** 661,671 ****
dbref thing;
dbref loc;
long match_flags = MAT_CHECK_KEYS | MAT_NEIGHBOR | MAT_ENGLISH | MAT_ABSOLUTE;
-
if ((thing = noisy_match_result(player, what, TYPE_THING, match_flags))
== NOTHING)
return;
-
switch (Typeof(thing)) {
case TYPE_ROOM:
case TYPE_EXIT:
--- 664,672 ----
***************
*** 707,713 ****
{
dbref loc;
loc = Location(player);
! if (IsRoom(loc) || IsGarbage(loc) || IsGarbage(Location(loc)) || NoLeave(loc)
|| !eval_lock(player, loc, Leave_Lock)
) {
did_it(player, loc, "LFAIL", T("You can't leave."), "OLFAIL",
--- 708,715 ----
{
dbref loc;
loc = Location(player);
! if (IsRoom(loc) || IsGarbage(loc) || IsGarbage(Location(loc))
! || NoLeave(loc)
|| !eval_lock(player, loc, Leave_Lock)
) {
did_it(player, loc, "LFAIL", T("You can't leave."), "OLFAIL",
***************
*** 719,740 ****
follower_command(player, loc, "leave");
}
! dbref
global_exit(player, direction)
dbref player;
const char *direction;
{
! return (last_match_result
! (player, direction, TYPE_EXIT, MAT_GLOBAL | MAT_EXIT) != NOTHING);
}
! dbref
remote_exit(player, direction)
dbref player;
const char *direction;
{
! return (last_match_result
! (player, direction, TYPE_EXIT, MAT_REMOTES | MAT_EXIT) != NOTHING);
}
void
--- 721,742 ----
follower_command(player, loc, "leave");
}
! int
global_exit(player, direction)
dbref player;
const char *direction;
{
! return (GoodObject
! (match_result(player, direction, TYPE_EXIT, MAT_GLOBAL | MAT_EXIT)));
}
! int
remote_exit(player, direction)
dbref player;
const char *direction;
{
! return (GoodObject
! (match_result(player, direction, TYPE_EXIT, MAT_REMOTES | MAT_EXIT)));
}
void
***************
*** 748,754 ****
if (!Mobile(player))
return;
-
if (!strcasecmp(command, "home") && Fixed(player)) {
notify(player, T("You can't do that IC!"));
return;
--- 750,755 ----
***************
*** 756,765 ****
if (DO_GLOBALS) {
if (can_move(player, command))
do_move(player, command, 0);
! else if ((Zone(Location(player)) != NOTHING) &&
! remote_exit(player, command))
do_move(player, command, 2);
! else if ((Location(player) != MASTER_ROOM) && global_exit(player, command))
do_move(player, command, 1);
else
do_move(player, command, 0);
--- 757,767 ----
if (DO_GLOBALS) {
if (can_move(player, command))
do_move(player, command, 0);
! else
! if ((Zone(Location(player)) != NOTHING) && remote_exit(player, command))
do_move(player, command, 2);
! else if ((Location(player) != MASTER_ROOM)
! && global_exit(player, command))
do_move(player, command, 1);
else
do_move(player, command, 0);
***************
*** 786,795 ****
notify(player, T("I can't tell which one to follow."));
return;
}
! if (!GoodObject(leader) || !GoodObject(Location(player)) ||
! (IsPlayer(leader) && !Connected(leader)) ||
! ((DarkLegal(leader) || (Dark(Location(player)) && !Light(leader))) &&
! !See_All(player))) {
notify(player, T("You don't see that here."));
return;
}
--- 788,798 ----
notify(player, T("I can't tell which one to follow."));
return;
}
! if (!GoodObject(leader) || !GoodObject(Location(player))
! || (IsPlayer(leader) && !Connected(leader))
! || ((DarkLegal(leader)
! || (Dark(Location(player)) && !Light(leader)))
! && !See_All(player))) {
notify(player, T("You don't see that here."));
return;
}
***************
*** 808,815 ****
}
/* Ok, are we allowed to follow them? */
if (!eval_lock(player, leader, Follow_Lock)) {
! notify_format(player, T("You're not allowed to follow %s."),
! Name(leader));
return;
}
/* Ok, looks good */
--- 811,818 ----
}
/* Ok, are we allowed to follow them? */
if (!eval_lock(player, leader, Follow_Lock)) {
! notify_format(player,
! T("You're not allowed to follow %s."), Name(leader));
return;
}
/* Ok, looks good */
***************
*** 903,911 ****
return;
}
/* Are we following or leading them? */
! if (!is_following(who, player) && !is_following(player, who)) {
! notify_format(player, T("%s isn't following you, nor vice versa."),
! Name(who));
return;
}
/* Ok, looks good */
--- 906,915 ----
return;
}
/* Are we following or leading them? */
! if (!is_following(who, player)
! && !is_following(player, who)) {
! notify_format(player,
! T("%s isn't following you, nor vice versa."), Name(who));
return;
}
/* Ok, looks good */
***************
*** 928,934 ****
ATTR *a;
char tbuf1[BUFFER_LEN];
char *bp;
-
a = atr_get_noparent(leader, "FOLLOWERS");
if (!a) {
(void) atr_add(leader, "FOLLOWERS", unparse_dbref(follower), GOD, NOTHING);
--- 932,937 ----
***************
*** 951,957 ****
ATTR *a;
char tbuf1[BUFFER_LEN];
char *bp;
-
a = atr_get_noparent(follower, "FOLLOWING");
if (!a) {
(void) atr_add(follower, "FOLLOWING", unparse_dbref(leader), GOD, NOTHING);
--- 954,959 ----
***************
*** 992,1006 ****
ATTR *a;
char tbuf1[BUFFER_LEN];
char flwr[BUFFER_LEN];
-
a = atr_get_noparent(leader, "FOLLOWERS");
if (!a)
return; /* No followers, so no deletion */
/* Let's take it apart and put it back together w/o follower */
strcpy(flwr, unparse_dbref(follower));
strcpy(tbuf1, uncompress(AL_STR(a)));
! (void) atr_add(leader, "FOLLOWERS", remove_word(tbuf1, flwr, ' '), GOD,
! NOTHING);
}
/* Delete someone from a player's FOLLOWING attribute */
--- 994,1007 ----
ATTR *a;
char tbuf1[BUFFER_LEN];
char flwr[BUFFER_LEN];
a = atr_get_noparent(leader, "FOLLOWERS");
if (!a)
return; /* No followers, so no deletion */
/* Let's take it apart and put it back together w/o follower */
strcpy(flwr, unparse_dbref(follower));
strcpy(tbuf1, uncompress(AL_STR(a)));
! (void) atr_add(leader, "FOLLOWERS",
! remove_word(tbuf1, flwr, ' '), GOD, NOTHING);
}
/* Delete someone from a player's FOLLOWING attribute */
***************
*** 1012,1026 ****
ATTR *a;
char tbuf1[BUFFER_LEN];
char ldr[BUFFER_LEN];
-
a = atr_get_noparent(follower, "FOLLOWING");
if (!a)
return; /* Not following, so no deletion */
/* Let's take it apart and put it back together w/o leader */
strcpy(ldr, unparse_dbref(leader));
strcpy(tbuf1, uncompress(AL_STR(a)));
! (void) atr_add(follower, "FOLLOWING", remove_word(tbuf1, ldr, ' '), GOD,
! NOTHING);
}
static void
--- 1013,1026 ----
ATTR *a;
char tbuf1[BUFFER_LEN];
char ldr[BUFFER_LEN];
a = atr_get_noparent(follower, "FOLLOWING");
if (!a)
return; /* Not following, so no deletion */
/* Let's take it apart and put it back together w/o leader */
strcpy(ldr, unparse_dbref(leader));
strcpy(tbuf1, uncompress(AL_STR(a)));
! (void) atr_add(follower, "FOLLOWING",
! remove_word(tbuf1, ldr, ' '), GOD, NOTHING);
}
static void
***************
*** 1035,1042 ****
if (noisy) {
strcpy(msg, tprintf(T("You stop following %s."), Name(leader)));
notify_format(leader, T("%s stops following you."), Name(follower));
! did_it(follower, leader, "UNFOLLOW", msg, "OUNFOLLOW", NULL,
! "AUNFOLLOW", NOTHING);
}
}
--- 1035,1042 ----
if (noisy) {
strcpy(msg, tprintf(T("You stop following %s."), Name(leader)));
notify_format(leader, T("%s stops following you."), Name(follower));
! did_it(follower, leader, "UNFOLLOW", msg, "OUNFOLLOW",
! NULL, "AUNFOLLOW", NOTHING);
}
}
***************
*** 1052,1058 ****
char *bp;
dbref who;
int first = 1;
-
a = atr_get_noparent(player, "FOLLOWERS");
if (!a)
return (char *) "";
--- 1052,1057 ----
***************
*** 1085,1091 ****
char *bp;
dbref who;
int first = 1;
-
a = atr_get_noparent(player, "FOLLOWING");
if (!a)
return (char *) "";
--- 1084,1089 ----
***************
*** 1140,1146 ****
char *s, *sp;
char tbuf1[BUFFER_LEN];
dbref flwr;
-
a = atr_get_noparent(leader, "FOLLOWERS");
if (!a)
return; /* No one's following me */
--- 1138,1143 ----
***************
*** 1167,1173 ****
char *s, *sp;
char tbuf1[BUFFER_LEN];
dbref ldr;
-
a = atr_get_noparent(follower, "FOLLOWING");
if (!a)
return; /* I'm not following anyone */
--- 1164,1169 ----
***************
*** 1196,1202 ****
char *s, *sp;
char tbuf1[BUFFER_LEN];
char combuf[BUFFER_LEN];
-
if (!com || !*com)
return;
strcpy(combuf, com);
--- 1192,1197 ----
***************
*** 1208,1217 ****
while (s) {
sp = split_token(&s, ' ');
follower = parse_dbref(sp);
! if (GoodObject(follower) && (Location(follower) == loc) &&
! (Connected(follower) || IsThing(follower)) &&
! (!(DarkLegal(leader) || (Dark(Location(follower)) && !Light(leader))) ||
! See_All(follower))) {
/* This is a follower who was in the room with the leader. Follow. */
notify_format(follower, T("You follow %s."), Name(leader));
process_command(follower, combuf, follower, 0);
--- 1203,1213 ----
while (s) {
sp = split_token(&s, ' ');
follower = parse_dbref(sp);
! if (GoodObject(follower) && (Location(follower) == loc)
! && (Connected(follower) || IsThing(follower))
! && (!(DarkLegal(leader)
! || (Dark(Location(follower)) && !Light(leader)))
! || See_All(follower))) {
/* This is a follower who was in the room with the leader. Follow. */
notify_format(follower, T("You follow %s."), Name(leader));
process_command(follower, combuf, follower, 0);
*** 1_7_6.82/src/match.c Sat, 30 Nov 2002 15:49:22 -0600 dunemush (pennmush/c/2_match.c 1.24.1.1.1.4 660)
--- 1_7_6.99(w)/src/match.c Mon, 06 Jan 2003 15:51:32 -0600 dunemush (pennmush/c/2_match.c 1.24.1.1.1.4.1.1.1.1.1.1.1.1.1.1 660)
***************
*** 82,88 ****
const int type, const long int flags,
dbref *last_match, int *match_count);
static dbref match_exit(const dbref who, const char *name,
! const int type, const long int flags);
static dbref match_exit_internal(const dbref match_who,
const char *match_name, const int type,
const long int flags, const dbref loc,
--- 82,88 ----
const int type, const long int flags,
dbref *last_match, int *match_count);
static dbref match_exit(const dbref who, const char *name,
! const int type, const long int flags, int *match_count);
static dbref match_exit_internal(const dbref match_who,
const char *match_name, const int type,
const long int flags, const dbref loc,
***************
*** 98,103 ****
--- 98,104 ----
static dbref choose_thing(const dbref match_who, const int preferred_type,
long int flags, dbref thing1, dbref thing2,
int *match_count);
+ extern int check_alias(const char *command, const char *list); /* game.c */
/* A wrapper for returning a match, AMBIGUOUS, or NOTHING
***************
*** 210,256 ****
match =
match_remote_contents(who, name, type, flags, &last_match, &match_count);
if (GoodObject(match)) {
! exact_match_count++;
exact_match = match;
}
}
if (flags & MAT_NEIGHBOR) {
match = match_neighbor(who, name, type, flags, &last_match, &match_count);
if (GoodObject(match)) {
! exact_match_count++;
exact_match = match;
}
}
if (flags & MAT_POSSESSION) {
match = match_possession(who, name, type, flags, &last_match, &match_count);
if (GoodObject(match)) {
! exact_match_count++;
exact_match = match;
}
}
if (flags & MAT_EXIT) {
! match = match_exit(who, name, type, flags);
if (GoodObject(match)) {
! exact_match_count++;
exact_match = match;
}
}
if (flags & MAT_CONTAINER) {
match = match_container(who, name, type, flags, &last_match, &match_count);
if (GoodObject(match)) {
! exact_match_count++;
exact_match = match;
}
}
if (flags & MAT_CARRIED_EXIT) {
match = match_exit_internal(who, name, type, flags, who, &match_count);
if (GoodObject(match)) {
! exact_match_count++;
exact_match = match;
}
}
! if ((flags & MAT_ENGLISH) && !GoodObject(last_match)
! && !GoodObject(exact_match)) {
match = match_english(who, name, flags);
if (GoodObject(match)) {
exact_match_count++;
--- 211,257 ----
match =
match_remote_contents(who, name, type, flags, &last_match, &match_count);
if (GoodObject(match)) {
! exact_match_count += match_count;
exact_match = match;
}
}
if (flags & MAT_NEIGHBOR) {
match = match_neighbor(who, name, type, flags, &last_match, &match_count);
if (GoodObject(match)) {
! exact_match_count += match_count;
exact_match = match;
}
}
if (flags & MAT_POSSESSION) {
match = match_possession(who, name, type, flags, &last_match, &match_count);
if (GoodObject(match)) {
! exact_match_count += match_count;
exact_match = match;
}
}
if (flags & MAT_EXIT) {
! match = match_exit(who, name, type, flags, &match_count);
if (GoodObject(match)) {
! exact_match_count += match_count;
exact_match = match;
}
}
if (flags & MAT_CONTAINER) {
match = match_container(who, name, type, flags, &last_match, &match_count);
if (GoodObject(match)) {
! exact_match_count += match_count;
exact_match = match;
}
}
if (flags & MAT_CARRIED_EXIT) {
match = match_exit_internal(who, name, type, flags, who, &match_count);
if (GoodObject(match)) {
! exact_match_count += match_count;
exact_match = match;
}
}
! if ((flags & MAT_ENGLISH) && !GoodObject(exact_match)
! && !((flags & MAT_LAST) && GoodObject(last_match))) {
match = match_english(who, name, flags);
if (GoodObject(match)) {
exact_match_count++;
***************
*** 365,370 ****
--- 366,372 ----
alias_match = lookup_player(match_name);
DOLIST(first, first) {
if (first == absolute) {
+ (*match_count)++;
return first;
} else if (!strcasecmp(Name(first), match_name) ||
(GoodObject(alias_match) && (alias_match == first))) {
***************
*** 372,383 ****
/* if there are multiple exact matches, don't match any but
* make sure match_count is high enough that we report ambiguity
*/
- *match_count += 2;
*last_match =
choose_thing(match_who, type, flags, the_match, first, match_count);
return NOTHING;
! } else
the_match = first;
} else if (string_match(Name(first), match_name)) {
*last_match =
choose_thing(match_who, type, flags, *last_match, first, match_count);
--- 374,386 ----
/* if there are multiple exact matches, don't match any but
* make sure match_count is high enough that we report ambiguity
*/
*last_match =
choose_thing(match_who, type, flags, the_match, first, match_count);
return NOTHING;
! } else {
the_match = first;
+ (*match_count)++;
+ }
} else if (string_match(Name(first), match_name)) {
*last_match =
choose_thing(match_who, type, flags, *last_match, first, match_count);
***************
*** 418,441 ****
}
static dbref
! match_exit(who, name, type, flags)
const dbref who;
const char *name;
const int type;
const long flags;
{
dbref loc;
loc = (IsRoom(who)) ? who : Location(who);
if (DO_GLOBALS) {
if (flags & MAT_REMOTES) {
if (GoodObject(loc))
! return match_exit_internal(who, name, type, flags, Zone(loc), NULL);
else
return NOTHING;
} else if (flags & MAT_GLOBAL)
! return match_exit_internal(who, name, type, flags, MASTER_ROOM, NULL);
}
! return match_exit_internal(who, name, type, flags, loc, NULL);
}
static dbref
--- 421,447 ----
}
static dbref
! match_exit(who, name, type, flags, match_count)
const dbref who;
const char *name;
const int type;
const long flags;
+ int *match_count;
{
dbref loc;
loc = (IsRoom(who)) ? who : Location(who);
if (DO_GLOBALS) {
if (flags & MAT_REMOTES) {
if (GoodObject(loc))
! return match_exit_internal(who, name, type, flags, Zone(loc),
! match_count);
else
return NOTHING;
} else if (flags & MAT_GLOBAL)
! return match_exit_internal(who, name, type, flags, MASTER_ROOM,
! match_count);
}
! return match_exit_internal(who, name, type, flags, loc, match_count);
}
static dbref
***************
*** 449,456 ****
{
dbref exit_tmp;
dbref absolute;
- const char *match;
- const char *p;
dbref the_match = NOTHING;
if (!GoodObject(loc) || !match_name || !*match_name)
--- 455,460 ----
***************
*** 459,497 ****
return NOTHING;
absolute = match_absolute(match_name);
DOLIST(exit_tmp, Exits(loc)) {
! if (exit_tmp == absolute) {
the_match = exit_tmp;
! } else {
! match = Name(exit_tmp);
! while (*match) {
! /* check out this one */
! for (p = match_name; (*p && DOWNCASE(*p) == DOWNCASE(*match)
! && *match != EXIT_DELIMITER); p++, match++) ;
! /* did we get it? */
! if (*p == '\0') {
! /* make sure there's nothing afterwards */
! while (isspace((unsigned char) *match))
! match++;
! if (*match == '\0' || *match == EXIT_DELIMITER) {
! /* we got it */
! the_match =
! choose_thing(match_who, type, flags, the_match, exit_tmp,
! match_count);
! goto next_exit;
! }
! }
! /* we didn't get it, find next match */
! while (*match && *match++ != EXIT_DELIMITER) ;
! while (isspace((unsigned char) *match))
! match++;
! }
! }
! next_exit:
! ;
}
return the_match;
}
static dbref
match_remote_contents(who, name, type, flags, last_match, match_count)
const dbref who;
--- 463,478 ----
return NOTHING;
absolute = match_absolute(match_name);
DOLIST(exit_tmp, Exits(loc)) {
! if (exit_tmp == absolute)
the_match = exit_tmp;
! else if (check_alias(match_name, Name(exit_tmp)))
! the_match =
! choose_thing(match_who, type, flags, the_match, exit_tmp, match_count);
}
return the_match;
}
+
static dbref
match_remote_contents(who, name, type, flags, last_match, match_count)
const dbref who;
***************
*** 531,536 ****
--- 512,518 ----
{
int do_loc;
int do_cont;
+ int do_exits, doing_exits;
int num, matchnum;
char *dupname, *p;
char *mname;
***************
*** 549,566 ****
do_cont = 1;
else
do_cont = 0;
if (do_loc && (!strncasecmp(dupname, "this here ", 10))) {
dupname += 10;
! do_cont = 0;
} else if (do_loc && (!strncasecmp(dupname, "here ", 5)
|| !strncasecmp(dupname, "this ", 5))) {
dupname += 5;
! do_cont = 0;
} else if (do_cont && (!strncasecmp(dupname, "my ", 3)
|| !strncasecmp(dupname, "me ", 3))) {
dupname += 3;
! do_loc = 0;
}
while (*dupname == ' ')
--- 531,555 ----
do_cont = 1;
else
do_cont = 0;
+ if (flags & MAT_EXIT)
+ do_exits = 1;
+ else
+ do_exits = 0;
if (do_loc && (!strncasecmp(dupname, "this here ", 10))) {
dupname += 10;
! do_cont = do_exits = 0;
} else if (do_loc && (!strncasecmp(dupname, "here ", 5)
|| !strncasecmp(dupname, "this ", 5))) {
dupname += 5;
! do_cont = do_exits = 0;
} else if (do_cont && (!strncasecmp(dupname, "my ", 3)
|| !strncasecmp(dupname, "me ", 3))) {
dupname += 3;
! do_loc = do_exits = 0;
! } else if (do_exits && (!strncasecmp(dupname, "toward ", 7))) {
! dupname += 7;
! do_loc = do_cont = 0;
}
while (*dupname == ' ')
***************
*** 607,624 ****
num = 1;
}
! while (do_cont || do_loc) {
if (do_cont) {
item = Contents(who);
do_cont = 0;
! } else {
item = Contents(Location(who));
do_loc = 0;
}
matchnum = 0;
DOLIST(item, item) {
! if (!strcasecmp(Name(item), dupname)
! || string_match(Name(item), dupname)) {
matchnum++;
if (matchnum == num) {
mush_free(p, "string");
--- 596,619 ----
num = 1;
}
! doing_exits = 0;
! while (do_cont || do_loc || do_exits) {
if (do_cont) {
item = Contents(who);
do_cont = 0;
! } else if (do_loc) {
item = Contents(Location(who));
do_loc = 0;
+ } else {
+ item = Exits(Location(who));
+ doing_exits = 1;
+ do_exits = 0;
}
matchnum = 0;
DOLIST(item, item) {
! if (doing_exits ? (check_alias(dupname, Name(item)))
! : (!strcasecmp(Name(item), dupname)
! || string_match(Name(item), dupname))) {
matchnum++;
if (matchnum == num) {
mush_free(p, "string");
***************
*** 631,636 ****
--- 626,632 ----
return NOTHING;
}
+
static dbref
choose_thing(match_who, preferred_type, flags, thing1, thing2, match_count)
const dbref match_who;
***************
*** 671,675 ****
}
if (match_count)
(*match_count)++;
! return (get_random_long(0, 1) ? thing1 : thing2);
}
--- 667,671 ----
}
if (match_count)
(*match_count)++;
! return (thing1 > thing2 ? thing1 : thing2);
}
*** 1_7_6.82/src/look.c Sun, 22 Dec 2002 01:03:36 -0600 dunemush (pennmush/c/4_look.c 1.21.1.2.1.9.1.1 660)
--- 1_7_6.99(w)/src/look.c Mon, 06 Jan 2003 15:51:32 -0600 dunemush (pennmush/c/4_look.c 1.21.1.2.1.9.1.1.1.1 660)
***************
*** 599,610 ****
dbref player;
{
static char buf[BUFFER_LEN];
CHANLIST *c;
if (Chanlist(player)) {
! strcpy(buf, T("Channels:"));
! for (c = Chanlist(player); c; c = c->next)
! sprintf(buf, "%s %s", buf, ChanName(c->chan));
} else
strcpy(buf, T("Channels: *NONE*"));
return buf;
--- 599,615 ----
dbref player;
{
static char buf[BUFFER_LEN];
+ char *bp;
CHANLIST *c;
if (Chanlist(player)) {
! bp = buf;
! safe_str(T("Channels:"), buf, &bp);
! for (c = Chanlist(player); c; c = c->next) {
! safe_chr(' ', buf, &bp);
! safe_str(ChanName(c->chan), buf, &bp);
! }
! *bp = '\0';
} else
strcpy(buf, T("Channels: *NONE*"));
return buf;
*** 1_7_6.82/src/log.c Sat, 30 Nov 2002 17:42:23 -0600 dunemush (pennmush/c/5_log.c 1.10.1.2.2.4.1.1.2.1 660)
--- 1_7_6.99(w)/src/log.c Mon, 06 Jan 2003 15:51:32 -0600 dunemush (pennmush/c/5_log.c 1.10.1.2.2.4.1.1.2.2 660)
***************
*** 44,64 ****
quick_unparse(object)
dbref object;
{
! static char buff[BUFFER_LEN];
switch (object) {
case NOTHING:
! sprintf(buff, T("*NOTHING*"));
break;
case AMBIGUOUS:
! sprintf(buff, T("*VARIABLE*"));
break;
case HOME:
! sprintf(buff, T("*HOME*"));
break;
default:
! sprintf(buff, "%s(#%d%s)",
! Name(object), object, unparse_flags(object, GOD));
}
return buff;
--- 44,66 ----
quick_unparse(object)
dbref object;
{
! static char buff[BUFFER_LEN], *bp;
switch (object) {
case NOTHING:
! strcpy(buff, T("*NOTHING*"));
break;
case AMBIGUOUS:
! strcpy(buff, T("*VARIABLE*"));
break;
case HOME:
! strcpy(buff, T("*HOME*"));
break;
default:
! bp = buff;
! safe_format(buff, &bp, "%s(#%d%s)",
! Name(object), object, unparse_flags(object, GOD));
! *bp = '\0';
}
return buff;
*** 1_7_6.82/src/lock.c Tue, 17 Dec 2002 15:56:03 -0600 dunemush (pennmush/c/6_lock.c 1.17.1.13.1.1 660)
--- 1_7_6.99(w)/src/lock.c Mon, 06 Jan 2003 15:51:31 -0600 dunemush (pennmush/c/6_lock.c 1.17.1.13.1.1.1.1 660)
***************
*** 382,387 ****
--- 382,429 ----
return 1;
}
+ /* Set the lock type on thing to boolexp.
+ * Used only on db load, when we can't safely test the player's
+ * permissions because they're not loaded yet.
+ */
+ int
+ add_lock_raw(dbref player, dbref thing, lock_type type, struct boolexp *key,
+ int flags)
+ {
+ lock_list *ll, **t;
+ lock_type real_type = type;
+
+ if (!GoodObject(thing)) {
+ return 0;
+ }
+
+ ll = next_free_lock();
+ if (!ll) {
+ /* Oh, this sucks */
+ do_log(LT_ERR, 0, 0, "Unable to malloc memory for lock_list!");
+ } else {
+ real_type = st_insert(type, &lock_names);
+ ll->type = real_type;
+ ll->key = key;
+ ll->creator = player;
+ if (flags == -1) {
+ const lock_list *l2 = get_lockproto(real_type);
+ if (l2)
+ ll->flags = l2->flags;
+ else
+ ll->flags = 0;
+ } else {
+ ll->flags = flags;
+ }
+ t = &Locks(thing);
+ while (*t && strcmp(L_TYPE(*t), L_TYPE(ll)) < 0)
+ t = &L_NEXT(*t);
+ L_NEXT(ll) = *t;
+ *t = ll;
+ }
+ return 1;
+ }
+
/* Very primitive. */
static void
free_one_lock_list(lock_list *ll)
*** 1_7_6.82/src/game.c Tue, 17 Dec 2002 00:16:47 -0600 dunemush (pennmush/c/10_game.c 1.50.1.8.1.1.1.1.2.1.1.1.2.1.1.4.1.1.1.1.1.1.1.1.1.1.2.1.1.2.1.1.1.1.1.1.1.2.1.1.1.2.1.1.1.1.1.1.1.1.1.5.1.3.1.2.1.2.1.1 660)
--- 1_7_6.99(w)/src/game.c Mon, 06 Jan 2003 15:51:31 -0600 dunemush (pennmush/c/10_game.c 1.50.1.8.1.1.1.1.2.1.1.1.2.1.1.4.1.1.1.1.1.1.1.1.1.1.2.1.1.2.1.1.1.1.1.1.1.2.1.1.1.2.1.1.1.1.1.1.1.1.1.5.1.3.1.2.1.2.1.1.1.1 660)
***************
*** 327,332 ****
--- 327,335 ----
char tmpfl[2048];
FILE *f = NULL;
+ #ifndef WIN32
+ ignore_signal(SIGPROF);
+ #endif
#ifdef I_SETJMP
if (setjmp(db_err)) {
/* The dump failed. Disk might be full or something went bad with the
***************
*** 334,339 ****
--- 337,345 ----
do_rawlog(LT_ERR, T("ERROR! Database save failed."));
flag_broadcast(WIZARD | ROYALTY, 0,
T("GAME: ERROR! Database save failed!"));
+ #ifdef HAS_ITIMER
+ install_sig_handler(SIGPROF, signal_cpu_limit);
+ #endif
} else {
#endif
local_dump_database();
***************
*** 408,414 ****
#ifdef I_SETJMP
}
#endif
!
}
void
--- 414,422 ----
#ifdef I_SETJMP
}
#endif
! #ifdef HAS_ITIMER
! install_sig_handler(SIGPROF, signal_cpu_limit);
! #endif
}
void
*** 1_7_6.82/src/flags.c Sun, 01 Dec 2002 13:48:44 -0600 dunemush (pennmush/c/20_flags.c 1.1.1.1.1.1.1.1.1.1.1.1.1.6.1.2.1.1.1.1.1.2.2.2.2.1.2.1.1.3.1.2.1.1.1.1.1.1.1.1.1.3.1.9.1.2.2.1.1.2 660)
--- 1_7_6.99(w)/src/flags.c Mon, 06 Jan 2003 15:51:31 -0600 dunemush (pennmush/c/20_flags.c 1.1.1.1.1.1.1.1.1.1.1.1.1.6.1.2.1.1.1.1.1.2.2.2.2.1.2.1.1.3.1.2.1.1.1.1.1.1.1.1.1.3.1.9.1.2.2.1.1.2.1.1.1.1 660)
***************
*** 701,720 ****
if (IsThing(thing) && (f->type == TYPE_THING) &&
GoodObject(Location(thing)) && (hear || listener) &&
!Hearer(thing) && !Listener(thing)) {
! sprintf(tbuf1, T("%s is no longer listening."), Name(thing));
notify_except(Contents(Location(thing)), NOTHING, tbuf1);
notify_except(Contents(thing), NOTHING, tbuf1);
}
if (IsRoom(thing) && (f->type == TYPE_ROOM) &&
(f->flag == ROOM_LISTEN) && !hear && !Listener(thing)) {
! sprintf(tbuf1, T("%s is no longer listening."), Name(thing));
notify_except(Contents(thing), NOTHING, tbuf1);
}
if ((f->flag == AUDIBLE) && (f->type == NOTYPE)) {
switch (Typeof(thing)) {
case TYPE_EXIT:
if (Audible(Source(thing))) {
! sprintf(tbuf1, T("Exit %s is no longer broadcasting."), Name(thing));
notify_except(Contents(Source(thing)), NOTHING, tbuf1);
}
break;
--- 701,727 ----
if (IsThing(thing) && (f->type == TYPE_THING) &&
GoodObject(Location(thing)) && (hear || listener) &&
!Hearer(thing) && !Listener(thing)) {
! tp = tbuf1;
! safe_format(tbuf1, &tp, T("%s is no longer listening."), Name(thing));
! *tp = '\0';
notify_except(Contents(Location(thing)), NOTHING, tbuf1);
notify_except(Contents(thing), NOTHING, tbuf1);
}
if (IsRoom(thing) && (f->type == TYPE_ROOM) &&
(f->flag == ROOM_LISTEN) && !hear && !Listener(thing)) {
! tp = tbuf1;
! safe_format(tbuf1, &tp, T("%s is no longer listening."), Name(thing));
! *tp = '\0';
notify_except(Contents(thing), NOTHING, tbuf1);
}
if ((f->flag == AUDIBLE) && (f->type == NOTYPE)) {
switch (Typeof(thing)) {
case TYPE_EXIT:
if (Audible(Source(thing))) {
! tp = tbuf1;
! safe_format(tbuf1, &tp, T("Exit %s is no longer broadcasting."),
! Name(thing));
! *tp = '\0';
notify_except(Contents(Source(thing)), NOTHING, tbuf1);
}
break;
***************
*** 767,779 ****
GoodObject(Location(thing)) &&
((f->flag == THING_PUPPET) || (f->flag == THING_LISTEN)) &&
!hear && !listener) {
! sprintf(tbuf1, T("%s is now listening."), Name(thing));
notify_except(Contents(Location(thing)), NOTHING, tbuf1);
notify_except(Contents(thing), NOTHING, tbuf1);
}
if (IsRoom(thing) && (f->type == TYPE_ROOM) &&
(f->flag == ROOM_LISTEN) && !hear && !listener) {
! sprintf(tbuf1, T("%s is now listening."), Name(thing));
notify_except(Contents(thing), NOTHING, tbuf1);
}
/* notify for audible exits */
--- 774,790 ----
GoodObject(Location(thing)) &&
((f->flag == THING_PUPPET) || (f->flag == THING_LISTEN)) &&
!hear && !listener) {
! tp = tbuf1;
! safe_format(tbuf1, &tp, T("%s is now listening."), Name(thing));
! *tp = '\0';
notify_except(Contents(Location(thing)), NOTHING, tbuf1);
notify_except(Contents(thing), NOTHING, tbuf1);
}
if (IsRoom(thing) && (f->type == TYPE_ROOM) &&
(f->flag == ROOM_LISTEN) && !hear && !listener) {
! tp = tbuf1;
! safe_format(tbuf1, &tp, T("%s is now listening."), Name(thing));
! *tp = '\0';
notify_except(Contents(thing), NOTHING, tbuf1);
}
/* notify for audible exits */
***************
*** 781,787 ****
switch (Typeof(thing)) {
case TYPE_EXIT:
if (Audible(Source(thing))) {
! sprintf(tbuf1, T("Exit %s is now broadcasting."), Name(thing));
notify_except(Contents(Source(thing)), NOTHING, tbuf1);
}
break;
--- 792,801 ----
switch (Typeof(thing)) {
case TYPE_EXIT:
if (Audible(Source(thing))) {
! tp = tbuf1;
! safe_format(tbuf1, &tp, T("Exit %s is now broadcasting."),
! Name(thing));
! *tp = '\0';
notify_except(Contents(Source(thing)), NOTHING, tbuf1);
}
break;
*** 1_7_6.82/src/extmail.c Sun, 22 Dec 2002 01:53:52 -0600 dunemush (pennmush/c/22_extmail.c 1.44.1.7.1.5.1.9.1.1 660)
--- 1_7_6.99(w)/src/extmail.c Mon, 06 Jan 2003 15:51:31 -0600 dunemush (pennmush/c/22_extmail.c 1.44.1.7.1.5.1.9.1.1.1.1 660)
***************
*** 425,431 ****
/* print a mail message(s) */
struct mail *mp;
! char tbuf1[BUFFER_LEN];
char folderheader[BUFFER_LEN];
struct mail_selector ms;
int j, folder;
--- 425,431 ----
/* print a mail message(s) */
struct mail *mp;
! char tbuf1[BUFFER_LEN], *bp;
char folderheader[BUFFER_LEN];
struct mail_selector ms;
int j, folder;
***************
*** 453,463 ****
} else
strcpy(folderheader, T("Folder:"));
notify(player, DASH_LINE);
if (IsPlayer(mp->from))
! sprintf(tbuf1, "%s", Name(mp->from));
else
! sprintf(tbuf1, "%s (owner: %s)", Name(mp->from),
! Name(Owner(mp->from)));
notify_format(player,
T
("From: %-55s %s\nDate: %-25s %s %2d Message: %d\nStatus: %s"),
--- 453,465 ----
} else
strcpy(folderheader, T("Folder:"));
notify(player, DASH_LINE);
+ bp = tbuf1;
if (IsPlayer(mp->from))
! safe_str(Name(mp->from), tbuf1, &bp);
else
! safe_format(tbuf1, &bp, "%s (owner: %s)", Name(mp->from),
! Name(Owner(mp->from)));
! *bp = '\0';
notify_format(player,
T
("From: %-55s %s\nDate: %-25s %s %2d Message: %d\nStatus: %s"),
*** 1_7_6.82/src/db.c Sat, 30 Nov 2002 15:49:22 -0600 dunemush (pennmush/c/25_db.c 1.26.1.1.1.1.1.6 660)
--- 1_7_6.99(w)/src/db.c Mon, 06 Jan 2003 15:51:30 -0600 dunemush (pennmush/c/25_db.c 1.26.1.1.1.1.1.6.1.1 660)
***************
*** 1056,1062 ****
flags = parse_integer(val);
/* boolexp */
b = getboolexp(f, type);
! add_lock(creator, i, type, b, flags);
}
}
--- 1056,1062 ----
flags = parse_integer(val);
/* boolexp */
b = getboolexp(f, type);
! add_lock_raw(creator, i, type, b, flags);
}
}
***************
*** 1084,1090 ****
/* getboolexp() would already have complained. */
return;
} else {
! add_lock(Owner(i), i, buf, b, -1);
}
}
ungetc(c, f);
--- 1084,1090 ----
/* getboolexp() would already have complained. */
return;
} else {
! add_lock_raw(Owner(i), i, buf, b, -1);
}
}
ungetc(c, f);
*** 1_7_6.82/hdrs/version.h Sun, 22 Dec 2002 17:19:09 -0600 dunemush (pennmush/c/47_version.h 1.32.1.2.1.7.1.9.1.1.1.17.1.2.1.2 660)
--- 1_7_6.99(w)/hdrs/version.h Mon, 06 Jan 2003 15:51:37 -0600 dunemush (pennmush/c/47_version.h 1.32.1.2.1.7.1.9.1.1.1.17.1.2.1.3 660)
***************
*** 1,2 ****
! #define VERSION "PennMUSH version 1.7.6 patchlevel 3 [12/22/2002]"
! #define SHORTVN "PennMUSH 1.7.6p3"
--- 1,2 ----
! #define VERSION "PennMUSH version 1.7.6 patchlevel 4 [01/02/2003]"
! #define SHORTVN "PennMUSH 1.7.6p4"
*** 1_7_6.82/hdrs/lock.h Wed, 20 Nov 2002 09:43:49 -0600 dunemush (pennmush/d/6_lock.h 1.13 660)
--- 1_7_6.99(w)/hdrs/lock.h Mon, 06 Jan 2003 15:51:37 -0600 dunemush (pennmush/d/6_lock.h 1.15 660)
***************
*** 54,59 ****
--- 54,61 ----
const lock_list *get_lockproto(lock_type type);
int add_lock(dbref player, dbref thing, lock_type type, struct boolexp *key,
int flags);
+ int add_lock_raw(dbref player, dbref thing, lock_type type,
+ struct boolexp *key, int flags);
void free_locks(lock_list *ll);
int eval_lock(dbref player, dbref thing, lock_type ltype);
void do_unlock(dbref player, const char *name, lock_type type);
***************
*** 64,82 ****
void do_lset(dbref player, char *what, char *flags);
const char *lock_flags(lock_list *ll);
const char *lock_flags_long(lock_list *ll);
-
#define L_FLAGS(lock) ((lock)->flags)
#define L_CREATOR(lock) ((lock)->creator)
#define L_TYPE(lock) ((lock)->type)
#define L_KEY(lock) ((lock)->key)
#define L_NEXT(lock) ((lock)->next)
-
/* can p read/evaluate lock l on object x? */
int lock_visual(dbref, lock_type);
#define Can_Read_Lock(p,x,l) \
(See_All(p) || controls(p,x) || ((Visual(x) || lock_visual(x, l)) && \
eval_lock(p,x,Examine_Lock)))
-
/* The actual magic cookies. */
extern const lock_type Basic_Lock;
extern const lock_type Enter_Lock;
--- 66,81 ----
***************
*** 101,107 ****
extern const lock_type Dropto_Lock; /* Who follows the dropto of this room? */
extern const lock_type Destroy_Lock; /* Who can @dest me if I'm dest_ok? */
/* Declare new lock types here! */
-
#include "boolexp.h"
-
#endif /* __LOCK_H */
--- 100,104 ----
*** 1_7_6.82/hdrs/game.h Mon, 26 Aug 2002 19:47:41 -0500 dunemush (pennmush/d/12_game.h 1.28.1.2.1.1.1.1.1.1.1.7 660)
--- 1_7_6.99(w)/hdrs/game.h Mon, 06 Jan 2003 15:51:34 -0600 dunemush (pennmush/d/12_game.h 1.28.1.2.1.1.1.1.1.1.1.7.1.1 660)
***************
*** 159,164 ****
--- 159,165 ----
/* From timer.c */
extern void init_timer(void);
+ extern void signal_cpu_limit(int signo);
/* From version.c */
extern void do_version(dbref player);
*** 1_7_6.82/hdrs/externs.h Sat, 09 Nov 2002 19:47:06 -0600 dunemush (pennmush/d/16_externs.h 1.1.1.53.1.2.1.8.2.1.1.2.1.1.1.1.1.2.1.6.1.3.1.4 660)
--- 1_7_6.99(w)/hdrs/externs.h Mon, 06 Jan 2003 15:51:33 -0600 dunemush (pennmush/d/16_externs.h 1.1.1.53.1.2.1.8.2.1.1.2.1.1.1.1.1.2.1.6.1.3.1.4.3.1 660)
***************
*** 178,185 ****
extern void do_move(dbref player, const char *direction, int type);
extern void moveto(dbref what, dbref where);
extern void safe_tel(dbref player, dbref dest, int nomovemsgs);
! extern dbref global_exit(dbref player, const char *direction);
! extern dbref remote_exit(dbref loc, const char *direction);
extern void move_wrapper(dbref player, const char *command);
extern void do_follow(dbref player, const char *arg);
extern void do_unfollow(dbref player, const char *arg);
--- 178,185 ----
extern void do_move(dbref player, const char *direction, int type);
extern void moveto(dbref what, dbref where);
extern void safe_tel(dbref player, dbref dest, int nomovemsgs);
! extern int global_exit(dbref player, const char *direction);
! extern int remote_exit(dbref loc, const char *direction);
extern void move_wrapper(dbref player, const char *command);
extern void do_follow(dbref player, const char *arg);
extern void do_unfollow(dbref player, const char *arg);
*** 1_7_6.82/win32/funs.h Sun, 22 Dec 2002 00:51:08 -0600 dunemush (pennmush/f/12_funs.h 1.11.1.9.2.8.2.1.1.1.1.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.8.1.3.1.7.1.1.1.1.1.1.1.1 660)
--- 1_7_6.99(w)/win32/funs.h Mon, 06 Jan 2003 12:47:57 -0600 dunemush (pennmush/f/12_funs.h 1.11.1.9.2.8.2.1.1.1.1.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.8.1.3.1.7.1.1.1.1.1.1.1.1.1.1 660)
***************
*** 310,312 ****
--- 310,313 ----
FUNCTION_PROTO(fun_zemit);
FUNCTION_PROTO(fun_zfun);
FUNCTION_PROTO(fun_zone);
+ FUNCTION_PROTO(local_fun_silly);
*** 1_7_6.82/win32/cmds.h Sun, 22 Dec 2002 00:51:08 -0600 dunemush (pennmush/f/15_cmds.h 1.9.1.4.1.1.1.1.1.1.1.1.2.1.1.1.2.1.1.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.9.1.7.2.4 660)
--- 1_7_6.99(w)/win32/cmds.h Mon, 06 Jan 2003 12:47:57 -0600 dunemush (pennmush/f/15_cmds.h 1.9.1.4.1.1.1.1.1.1.1.1.2.1.1.1.2.1.1.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.9.1.7.2.4.1.1 660)
***************
*** 62,67 ****
--- 62,68 ----
COMMAND_PROTO(cmd_link);
COMMAND_PROTO(cmd_list);
COMMAND_PROTO(cmd_listmotd);
+ COMMAND_PROTO(cmd_local_silly);
COMMAND_PROTO(cmd_lock);
COMMAND_PROTO(cmd_log);
COMMAND_PROTO(cmd_logwipe);
More information about the Pennmush-announce
mailing list