FB4 Changes
I'm still in the process of hypertexting this document. Until I'm done,
here's the flat ASCII version. -- Telzey
2.2fb4.42
Fixed:
Hopefully have fixed the bug where the input file isn't changed over to
the latest dumpfile when using DISKBASE.
Added:
You can now easily change the name of the Currency from Pennies to whatever
you might want by simply changing the PENNY, PENNIES, CPENNY, and CPENNIES
#defines in params.h
2.2fb4.41
Fixed:
BAD bug in db_grow() when not using #define DB_DOUBLING that caused a
coredump when loading in the db.
Bug where FORCE primitive would have it's program string overwritten.
This involved having process_command() copy it's input to a temp buffer.
Changed:
Changed several routines to use local char buffers instead of strdup()
to reduce memory fragmentation. Especially in property accessing.
I estimate that this cuts the number of calls to malloc() by about
a third to a half.
pronoun_substitute() no longer searched down the environment tree for
%n, %a, %s, %o, %p, or %r properties. It only looks for those on the
object that you specified in the call.
Changed how property checks in boolean expressions are saved to disk.
This prevents crashing the server on loading when certain characters
are used in property checking expressions.
Added:
There is a new #define option, DARK_SLEEPERS, that makes sleeping players
effectively DARK so that they can't be seen in a normal 'look'.
There is a new preprocessor command, $def, that is similar to $define,
except that it only takes the definition to the end of the line, and
it doesn't use a terminating $enddef. For example, the line:
$def TRUE 1
would be the same as the line:
$define TRUE 1 $enddef
A wizard (quelled or unquelled) may preceed a command with a '!' to tell
the server to run the built in version of the command, instead of trig-
gering an action with that command's name. For example, if someone were
to somehow set up bogus command trap exits for several of the builtins
like @unlink, @shutdown, @set, @recycle, @action, etc., then a wizard
could still use one of those commands, with a line like the following:
!@recycle #1234 or
!examine #1234
The '!' can be redefined to being any other character by changing the
OVERIDE_TOKEN #define in params.h
2.2fb4.4
Changed:
The NEWEXIT primitive will no longer let Mucker Level 3 players put new
exits on objects that they do not own. You now need a wizbit to do that.
The NEWEXIT primitive now require Mucker Level 3 or better to work. This
closes a security loophole that could let a muf virus be written.
Permissions have been changed a bit. An @desc program will run HARDUID.
That is, with the UID permissions of the owner of the object that the
@desc is on. Programs in @succs, @fails, @drops, @locks, or propqueues
like _arrive and _connect, are similarly run HARDUID. This modification
was made to close a security loophole that allowed nasty muf viruses
to be written. These modifications to MUF permissions might make it
neccesary to fix the permissions or mucker levels of a few programs on
existing systems.
Added:
@version command to list the current server version.
Primitives:
CHECKARGS (??? s -- ) Takes a string argument that contains an expression
that is used to test the arguments on the stack below
the given string. If they do not match what the
expression says should be there, then it aborts the
running program with an appropriate Program Error
Message. The expression is formed from single
character argument tests that refer to different
argument types. See 'man checkargs' for more info
on forming the expression strings.
2.2fb4.3
Fixed:
A problem where @dump didn't dump the database in fb4.3alpha4.
A bunch of different minor memory leaks.
Minor bugs with do_open() and do_create() where it registered objects that
weren't created due to lack of pennies.
Minor bug with do_dig where it looked for an ABODE parent.
Bug with @dumping to a new filename where it didn't allocate space for the
new filename string.
Changed:
Changed it so the compiler recognized user defined words before primitives.
This means that new primitives will not cause havok with old programs that
happen to use functiones named the same as the primitives.
Changed the DBdump to dump out the database in reverse order. Named the
new dbdump format the Foxen2 database dump format. The reverse dump makes
db_grow() allocate the memory for db[] in one shot on loading.
When a MUF error occurrs, it gives the name of the owner of the program
triggered by the user, instead of the owner of the program running. This
means that if someone calls a library routine from their program, and they
pass it bad arguments, if the routine crashes, then the error message will
say to contact the owner of the program, not the owner of the library.
Database dumps are now driven similarly to timequeue events, instead of
being run by the alarm() handling stuff. This seems a bit more elegant.
There is now a 2 minute warning before database dumps. This time period
is defined with DUMP_WARNTIME.
The long abort_compile() macros in compile.c have been replaced by short
macros that reference a function that does all the dirtywork.
2.2fb4.2
Fixed:
Bug with dumps occurring while queued programs are running.
Bugs with killing QUEUEd timequeue processes.
Crashing bug with loading a db with AUTOSTART programs.
Myriad bugs with shared strings, CHECKOP(), abort_interp(), CLEAR(), &c.
Bug with failed recompiled programs having garbage program in memory.
Bug with pronoun_substitute and %X properties.
Buffer overflow potential crash bug in pronoun_sub.
Crashing bug with @booting oneself.
Hanging bug with @toading players who are still online.
Various other BUFSIZ problems.
Bug with program string corruption stemming from re-entrancy bug in interp.
Various other bugs.
Added:
@find, @owned, and @entrances now accept the U flag in their flag string
field. Uf you specify U, it will match Unlinked objects. !U means objects
that are linked. Players and Things are always linked, while Garbage and
Programs are never linked. Rooms are linked if they have a dropto. Exits
act as you would expect. Example: '@find =EU' finds all your unlinked
exits.
@find, @owned, and @entrances also now accept a third argument. Thi arg
is a work that specifies what type of output you want. The default is
to just show the name and dbref of the matched object. If you specify
'owners' (or an abbreviation of that), then it will also show the name
of the owner for each object, beside the object name. If you specify
'links' (also abbreviateable), then it will show either *UNLINKED*, the
name of the destination for single link exits, or *METALINK* for exits
with more than one destination. The last option is 'locations', which
will have it display the name of the location of each matched item.
Examples:
'@find button=T=locations' lists all things named 'button' with locations.
'@entrances here=E=owners' lists all exits linked to here, with owners.
'@owned Revar=R=links' lists all the rooms owned by Revar, with dropto's.
Changed:
The 'info' command now accepts an optional second argument specifying what
lines of the file to list, similar to the @list command. For example,
'info changesfb4= 10-20' would list lines 10 through 20 of the changesfb4
file. '-10' is the same as '1-10' and '10-' lists line 10 through to the
end of the file. '-' lists the entire file. If no second arg is given to
the info command, it lists the entire file.
Programs refered to by props in _depart/_arrive/_connect/_disconnect propdirs
will now be all queued up, eliminating the need for a dispatcher program.
An example would be _connect/announce:1234 That would queue up program
#1234 when a player connects. The name ("announce") is not important, and
can be anything you want, but they are executed in alphabetic order.
Players can now use '@stats <player>' on themselves to see how many objects
they own.
Programs set BUILDER (BLOCKED) run in preempt mode, regardless of the mode
of the program. ie: a foreground program, while running in a program set
BLOCKED, will run pre-empt, with the multitasking effectively shut off.
Programs set HARDUID and SETUID, that are owned by a Wizard, run at the same
mucker level as the calling program. This is useful for writing libraries.
Now the server will clear properties from memory based on how old they are,
when you are using DISKBASED, and when too many objects (that haven't been
changed) have been loaded into memory.
Tabs sent to the server are now interpreted as single spaces to help solve
a problem with tabbed comments in MUF programs being uploaded.
The server now sends a message to the players at the successful completion
of a dump.
A #define'able max # of unchanged objects will be allowed into memory
before an automatic memory purge is performed now.
When USE_NOFORK and DISKBASE are both defined, then changed objects in
memory will be purged out to disk at a dump.
Primitives:
ABORT (s -- ) Halts the interpreter with an error of the string given.
DESCRCON (i -- i) Takes a descriptor and returns the associated connection
number, or 0 if no match was found.
DESCRIPTORS (d -- ix...i1 i) Takes a player dbref, or #-1, and returns the
range of descriptor numbers associated with
that dbref (or all for #-1) with their count
on top.
ISPID? (i -- i) Takes a process id and checks to see if an event with that
pid is in the timequeue. It returns 1 if it is, and 0 if
it is not. NOTE: since the program that is running is not
on the timequeue WHILE it is executing, but only when it
is swapped out letting other programs run, 'pid ispid?'
will always return 0.
2.2fb4.1
Fixed:
The bug with the FORK primitive not working.
A bug where a dumping process wouldn't free props loaded in for the dump.
Changed:
Background programs can be PREEMPTed now, but they can never use a READ or
be switched into the foreground.
Programs run from _connect and _disconnect now have the proper values for
the trigger @ and loc @ variables, instead of #-1. _connect and _disconnect
properties can also now refer to registered programs. ie: $connect-announce
Added:
There is an available #define MORTAL_DARKING that sets it up to let
non-wizards set objects and exits they own to be DARK.
There are now _arrive and _depart program triggering properties set up
so that when you leave a room, it QUEUEs up the programs referred to
by the _depart properties in all the rooms down the environment from
the room left, and when you enter a room, it QUEUEs up all the programs
referred to by all the _arrive properties down the environment from the
room entered. These properties can refer to either dbrefs of programs,
or registered objects, similarly to _connect and _disconnect. The
loc @ for a _depart run program is the dbref of the room left, and will
not match the value of 'me @ location' which will be the room they went
to.
Primitives:
PID ( -- i) Returns the timequeue process ID of the running program.
2.2fb4.0
Fixed:
Memory leak with trying to run programs when timequeue table is full.
Crashing bug with _listen being set to large or negative numbers.
Bug with @find listing ALL objects regardless of player's control of them.
Changed:
The interpreter has been split from the old huge case statement into a set
of functions pointed to by an array of function pointers. This makes for
a slight increase in speed, and also for easier addition of primitives.
You can now connect to a player via dbref. Just give the dbref where you
would normally put your name in the connection request. For example:
connect #1234 craZypassWord
@boot now @boots the oldest connection of a player instead of the youngest.
Added the #define SECURE_TELEPORT in config.h for making exits on a player
require either that the player own the room they are in, or else the room
must be JUMP_OK to allow them to use the exit to leave the room. If this
is not defined, then exits work like in standard MUCK2.2.
Cleaned up notify_listeners code. Now NOTIFY and NOTIFY_EXCLUDE will not
trigger _listen's that would run the current program.
NOTIFY_EXCEPT has been removed and replaced by a $define to NOTIFY_EXCLUDE.
It is effectively $define notify_except 1 swap notify_exclude $enddef
There are now four levels of MUCKERs in fb4.0. Level zero is a non-mucker.
They cannot use the editor, and MUF programs owned by them run as if
they were level 1 MUCKERs.
Level one MUCKER's are apprentices. Their powers are restricted as they
cannot get information about any object that is not in the same room they
are. ie: OWNER, NAME, LOCATION, etc all fail if the object isn't in the
same room as the player. Level one MUCKER programs always run as if they
are set SETUID. NOTIFY, NOTIFY_EXCEPT, and NOTIFY_EXCLUDE will refuse to
send messages to rooms the user is not in. Level one programs cannot use
ADDPENNIES. They also cannot set properties on objects not owned by the
program's owner.
Level two MUCKERs are also called Journeymen. Their permissions are
equivalent to the permissions for a normal MUCKER under older versions
of the server.
Level three MUCKERs are referred to as Masters. They can use the con-
nection info primitives (ie: CONDBREF, ONLINE, etc.), read the EXITS list
of any room, use NEXTOBJ on objects, can use NEWROOM, NEWOBJECT, NEWEXIT,
and COPYOBJ without limitations, can use QUEUE and KILL, and can override
the permissions restrictions of MOVETO. You only give a player MUCKER
level 3 if they are very trusted.
A player who is wizbitted is effectively Mucker Level 4. MUCKER level
four is required for the RECYCLE primitive, the CONHOST primitive, the
FORCE primitive, and the SETOWN primitive. ML4 also allows overriding
of permissions of the SET* primitives, and property permissions. Props
not listed by NEXTPROP with ML3 are listed with ML4.
The MUCKER level permissions that a program runs at is the lesser of
it's own MUCKER level and the MUCKER level of it's owner.
If it is owned by a player who is MUCKER level 2, and it is MUCKER
level 3, then it runs at Muckr level 2. The one exception to this is
programs owned by a Wizard player. They run at Mucker level 2 if the
program itself is not wizbit, and at Mucker level 4 if the program IS
set wizbit.
Mucker level is referred to in flags lists by M# where the # is the
Mucker level. Level zero objects don't show a flag for it. Example:
Revar(#37PM3)
In verbose flags lists, Mucker levels greater than zero are shown
by MUCKER# where # is the mucker level.
To set a level on a player or program, use the level number as the
flag name. MUCKER is the same as 2, and !MUCKER is the same as 0.
Example: @set Revar=2
A player may set the MUCKER level on a program they own to any level
lower than or equal to their own level, and a wizard may set a program
or player to any MUCKER level. A program cannot be set to Mucker Level
Zero, since it has no meaning for programs. (You expect them to use the
MUF editor or something?)
When a program is created, it is automatically set to the same MUCKER
level as the creating player. When a program is loaded from the db, if
it is Mucker Level 0, it is upgraded to Mucker Level 2.
When a program crashes, now even the errors within interp_loop() will tell
what MUF program dbref and line number it occurred at.
Added:
INSTRING and RINSTRING are now inserver defines that let you do case
insensitive versions of their INSTR and RINSTR counterparts. They
are effectively defined as:
$define instring tolower swap tolower swap instr $enddef
$define rinstring tolower swap tolower swap rinstr $enddef
@uncompile command for uncompiling all the programs in memory. This
frees them from memory, and lets them be recompiled when they are
next used. This is a useful command to use when a macro is redefined.
Ability to load Mage DB Dump Format databases. (FurryMUCK.)
RESTRICT_KILL #define in config.h that lets you compile the server with
Kill_OK bits for players. Both the killing player and the victim must
have their KILL_OK flags set for the kill to work.
There is now a #define option for limited disk basing. #define DISKBASE
in config.h to make the server not load up properties from the input
database file until they are needed. If an object's properties are
not changed, and they haven't been accessed for longer than the database
DUMP_INTERVAL, then it will clear the properties back out of memory when
it comes time to dump the db again. Properties for objects that have
had some properties added/removed/changed will remain in memory. When
DISKBASE is defined, @stats will also tell how many objects are loaded
into memory for wizards.
Ability for a wizard to append a timestamped message to the MOTD file by
using the command 'motd <message>'. The file can also be cleared by
a wizard simply by typing 'motd clear'.
New Primitives:
FORK ( -- i) This primitive forks off a BACKGROUND (muf) process from
the currently running program. It returns the pid of
the child process to the parent process, and returns a
0 to the child. This does NOT do a UNIX fork. It only
copies the current stack frame and puts the background
muf process on the time queue. (Requires Mucker Level 3)
FORK returns a -1 if the timequeue was full.
STATS (d -- 7 ints) Takes a dbref and returns 7 integers, giving, in order,
The total number of objects owned by the given dbref,
the number of rooms owned, the number of exits owned,
the number of things owned, number of programs owned,
number of players, and number of garbage items owned.
If the given dbref was #-1, then the stats are the
totals for the entire database. (Needs Mucker Level 3)
Return to the TinyMUCK Page
Page created by Telzey, and maintained by Tugrik d'Itichi.
Comments/Questions/Flames
to: FMPages@furry.com