This is taken from a tutorial I posted all the way back in June 2000 in the Willing Victims Guild on FurryMuck; the article has been exempted from expiration and will probably be there indefinitely. I've been asked to explain how to make a collar that the wearer can't (easily) remove lots of times, so instead of repeating myself a lot I've written foolproof fool-resistant instructions. Right up top here you'll read about how to make the basic Mark I mostly secure collar; if you feel like tackling something more sophisticated, keep reading in the goodies, security, and variations sections.
You'll need two players, who I call here the master and the slave I don't care what you call yourselves and one of you needs a B bit and building quota for one more thing.
First, create the object (@create collar). Obviously! Either one can do this. Describe it in the usual way. Set the collar chownable (@set collar=c). Set the collar Slipery (@set collar=s); this means that it will go home if dropped rather than laying around in the room.
If the master created the object, it should be handed to the slave and the slave should type @chown collar.
The slave should type @link collar=me; this sets the object's home as being upon the slave.
The slave then hands the collar to the master, who takes ownership of it (@chown collar) and sets it not chownable (@set collar=!c). The master can then hand it back or just drop it; the collar will return to its home, which is on the slave.
Variation: Instead of the @chown shuffle described above, the slave can set herself L, letting the master @link the collar to her without her owning it. (Don't forget to set the slave !L afterwards.) I haven't personally checked this under all conditions yet.
At this point, unless I've forgotten something, you're done. The slave can't destroy the collar, since it belongs to the master, and will have a hard time getting it off of themselves it'll teleport back on at the earliest opportunity. (A wizard can remove it, of course, and there are ways to work around this, but it's secure enough.) Locking the collar against other players can't hurt.
This is the basic secure slave collar; enhancements such as look-notifies can follow later. I do drop the step by step instructions and paint in few broad strokes with big blotches of real code; also, it gets pretty long...who'd have thought there were so many things to do with a collar object?
Now we get into the more complicated stuff. It's also where I stop outlining every detail. You don't have to read the whole webpage, just as much technobabble as you're comfortable with. You can stop right here and have a perfectly good collar.Enhancements: Goodies
Look notifies are easy enough. Check out the code block below, which notifies both the master and the slave of looks. (It can get away with that because the master owns the object and the slave is right there.) The slave is notified, and the master knows both who and where. The {with} business means that the collar doesn't need properties to be reset if the slave's name changes. You can tailor the notification messages to be anything you want, of course, and all the master has to do is stuff this MPI into the @desc somewhere.{null:{with:slave,{name:{loc:this}}, {tell: <+> {name:me} reads {&slave}'s collar (in {name:here})! <+>,{owner:this}} {tell: <+> {name:me} reads your collar! <+>,{&slave}} }}![]()
It's actually not easy to make a doodad that reports the slave's location to a remote master. You can, however, have a collar inscription like '{name:{loc:this}}: Property of {name:{owner:this}}' and have it follow automagically whatever names the master and slave might have.
Enhancements: Security
Gotta hand it to 'em...
The canonical dodge for the basic collar is to use hand. No hand program I've found checks the lock on objects before moving them around (and if it touches any MPI trigger I haven't found it. Also, different mucks have different versions of hand, such as LJM's which lets you set objects un-handable). Now, handing the collar off to another player isn't going to work for long, because people are flaky and will drop it or go home or give it to someone even less reliable or try to eat it for all I know. Pretty soon, though, poof, it's back on the slave. So people use puppets. Almost everyone has a thing or two somewhere lying around unused (and if you don't you have plenty of quota to make one); if the slave hands the collar to her puppet, then sets the puppet !X!Z, and maybe stuffs it inside something else...it might never come to light at all; that's not the point of a locked collar. So is 'hand' an unblockable escape? Certainly not! The proper countermove is to add to the collar a 'hand' action that blocks the muck's hand action the subtle point to making this a good trick rather than a nuisance is NOT to disable hand for any other objects! It works like this.
You'll need an action to catch the attempted handing of the collar. To do this, log onto the muck and be carrying (and owning) the collar, then copy the MPI below and paste it to the muck, changing 'DBREF' to the dbref or name of the collar object. This will output the command you need to enter to create the hand blocking action. (Yeah, you can do it by hand, but I thought up this scheme to automatically generate the command, so what the heck.) Once you have done this, link it to the do-nothing action and give it an @succ message telling the slave that they can't hand off the collar.
@mpi {null:{with:out,,{with:c,{sublist:{name:DBREF},1,1, },{for:a,1,{strlen:{&c}},1,{set:out,{&out};hand {midstr:{&c},1,{&a}}}}{tell: \r@action {midstr:{&out},2,-1}={&c}\r }}}}
Confession: I haven't actually gotten around to trying this; it should work, but I haven't tested it. Please let me know what you discover...
Getting in touch with your inner puppet
This one isn't as obvious as handing it to a puppet, but it is more clever. The slave makes a puppet, picks up the puppet, then has the puppet pick up the collar while they're both inside the slave! Now that the puppet has the collar the scheme follows the handing plan above. While it's quite clever, this is also easy to guard against; it relies on the puppet being able to pick up the collar, so a simple @lock collar=me&!me will prevent anyone from picking up that object.Homeward bound... A backup to the hand-resistant collar is some code that will make the collar go home if it's not on the slave as it should be. I haven't written up a tidy explanation of how to do this yet, but it's entirely possible. Watch this space.
![]()
The Forbidden Zone
Technically possible security ideas you can't use include putting a go-home MPI trigger on a ~listen property and putting a thread on the timequeue that auto-returns the collar to the slave periodically. (Self-perpetuating timequeue entries are verboten on FurryMuck and should be looked at skeptically other places).Enhancements: Variations
The leash program is MUF and you probably don't have the M-bit for it anyway. Besides, they vary from muck to muck; ask around at home.
Between collars and the leash programs, you'd think it would be easy to write a kennel program, something that would keep a person in a particular room; MUF coders I know tell me that in fact it's not. Go figure. Prison rooms have been made for many years and it's an venerable building stunt; most of them aren't too hard to escape from.
Me: Page me on FurryMuck, where I'm often awake and positively not a member of the RSS. (I'm also on Le Jardin Muck about as often, but Furry is bigger.) You can also go back to the main building page, to the Auction II page or over to the MPI page from here.
This page was last updated 8 Sep 2004 and isn't done yet; consider this a work in progress.