# [pravn@mvp.com: Re: parents and locking, listening etc]

"Robert J. Brown" (rj@eli.wariat.org)
Mon, 10 Mar 1997 18:36:10 -0600

- Messages sorted by:[ date ][ thread ][ subject ][ author ]

    ------- Start of forwarded message -------
    Return-Path: moo-cows-errors@parc.xerox.com
    From: Petrea Mitchell <pravn@mvp.com>
    Subject: Re: parents and locking, listening etc
    To: tim@itchen.hants.gov.uk
    Date: Mon, 10 Mar 1997 14:19:58 PST
    Cc: moo-cows@parc.xerox.com
    In-Reply-To: <332443A8.46A9@itchen.hants.gov.uk> from Tim MacLachlan at "Mar 10, 97 09:23:52 am"
    X-Mailer: ELM [version 2.4ME+ PL22 (25)]
    MIME-Version: 1.0
    Content-Type: text/plain; charset=US-ASCII
    Content-Transfer-Encoding: 7bit
    Sender: MOO-Cows-Errors@parc.xerox.com
    Precedence: bulk

    > I have an object which is a parent 'generic beer'#380. An object
    > 'barmaid' creates() a child of the generic beer when a player
    > asks for a beer. The child beer emotes messages 4 times then recycles
    > itself. However, if the player doesnt drink the beer enough so that
    > the object recycles itself I dont want the player to be able to
    > leave the tavern if they still have the child beer object on them.
    > (Else my quota will run out!).

    [...]

    You can't lock an exit with classes, and you're forgetting that people
    can teleport out anyway. But there are ways around this.

    Solution #1: @verb <room>:exitfunc tnt rxd
    Have exitfunc check args[1].contents (or, if you're really paranoid, use
    $object_utils:all_contents()) for children of the generic beer. Call
    $recycler:_recycle (<beer>) when you find one. (If your MOO doesn't use
    the LambdaCore, then just use "recycle (<beer>)".) If your generic beer
    is fertile, then make sure to check that the beers you're recycling are
    really yours first.

    Solution #2: @verb <beer>:create tnt rxd
    Use fork() (or, better, your local in-db scheduler if you have one) here
    to spawn a task to recycle the beer after a certain amount of time. This
    code will be activated every time a child of the generic beer is brought
    into being through any means-- @create, @chparent, function calls, whatever.

    Two potential problems here: if the beer is fertile, your code won't be
    able to recycle the beers that other people create unless you're a wizard
    (and even then, do you necessarily want to recycle them?), and if a lot of
    beers are created, that means a lot of forked tasks lying around. You could
    set up the barmaid as a rudimentary scheduler if you're worried about this.

    In this and the next solution, you'll also need to modify <beer>:recycle
    to somehow kill the forked task if the beer is recycled before its time.

    Solution #3: Modify the barmaid
    Essentially the same as #2, only add the fork to the code on the barmaid
    that produces the beer, thereby recycling only the beers that she creates.

    Make sure to add a "pass (@args)" somewhere when you modify :create,
    :recycle, or :exitfunc, to avoid the possibility of Bad Things happening.

    > Also, I want to create an object that 'listens' in a room and runs
    > a verb when a certain string is matched...I'm wondering what the best
    > way of doing this is. I hacked the #0:notify verb so that it
    > also sent the message to the object in a room if it is a child of
    > a generic 'puppet' (an object that will listen).

    I think you're getting too complicated here-- in the LambdaCore at least,
    $room:announce(), :announce_all, and :announce_all_but don't discriminate
    between players and other objects. Put your string-matching code in
    <object>:tell().

    Or am I missing something here...

    Mitchell aka Spindizzy aka the Information Overload Wizard

    - --
        /
    Petrea Mitchell    <|> <|>      <pravn@mvp.com>   <pem4958@is.nyu.edu>
    "What sort of man takes the `frau' out of Jungfrau, Lewis?"
    "The sort who gets strangled for his jokes, sir?"           ---Mystery!
    ------- End of forwarded message -------