Dokumentation zu: shadow(E)

HR Image


SYNOPSIS
        int shadow(object ob)

DESCRIPTION
        The current object will become a shadow of ob. This efun
        returns 1 on success, 0 otherwise.

        The calling object must be permitted by the master object to
        do the shadowing. In most installations, an object that
        defines the function query_prevent_shadow() to return 1
        can't be shadowed, and the shadow() function will return 0
        instead of ob.

        shadow() also fails if the calling object tries to shadow
        a function that was defined as ``nomask'', if the program was
        compiled with the #pragma no_shadow, or if the calling
        object is already shadowing, is being shadowed, or has an
        environment. Also the target ob must not be shadowing
        something else.

        If an object A shadows an object B then all call_other() to B
        will be redirected to A. If object A has not defined the
        function, then the call will be passed to B. There is only on
        object that can call functions in B with call_other(), and
        that is A. Not even object B can call_other() itself. All
        normal (internal) function calls inside B will however remain
        internal to B.

EXAMPLES
        With the three objects a.c, b.c and c.c

            --- a.c ---
            int fun() {
                debug_message(sprintf("%O [a] fun()\n", this_object()));
            }

            void fun3() {
                debug_message(sprintf("%O [a] fun3()\n", this_object()));
            }

            --- b.c ---
            int fun() {
                debug_message(sprintf("%O [b] fun()\n", this_object()));
                find_object("a")->fun();
            }
            void fun2() {
                debug_message(sprintf("%O [b] fun2()\n", this_object()));
                find_object("a")->fun3();
                this_object()->fun3();
            }

            void do_shadow(object target) { shadow(target, 1); }

            --- c.c ---
            int fun() {
                debug_message(sprintf("%O [c] fun()\n", this_object()));
                find_object("a")->fun();
            }
            void fun3() {
                debug_message(sprintf("%O [c] fun3()\n", this_object()));
            }
            void do_shadow(object target) { shadow(target, 1); }

        code like the following

            object a, b, c;

            a = load_object("a");
            b = load_object("b");
            c = load_object("c");
            b->do_shadow(a);
            c->do_shadow(a);
            debug_message("--- a->fun() ---\n");
            a->fun();
            debug_message("--- b->fun() ---\n");
            b->fun();
            debug_message("--- c->fun() ---\n");
            c->fun();
            debug_message("--- b->fun2() ---\n");
            b->fun2();

        produces this output:

            --- a->fun() ---
            /c [c] fun()
            /b [b] fun()
            /a [a] fun()
            --- b->fun() ---
            /c [c] fun()
            /b [b] fun()
            /a [a] fun()
            --- c->fun() ---
            /c [c] fun()
            /b [b] fun()
            /a [a] fun()
            --- b->fun2() ---
            /b [b] fun2()
            /a [a] fun3()
            /c [c] fun3()

        Note that the first call in b::fun2() find c::fun3()! Reason is that
        for calls originating from b to a the driver assumes that all
        shadows beyond c already had their chance. The second call however
        was to b itself, which the gamedriver recognized as being shadowed
        by c.

HISTORY
        Up to 3.2.1@46, destructing a shadowed object also destructs
        all shadows. Since 3.2.1@47, shadows may survive the
        destruction of the shadowee (unless the prepare_destruct() in
        the master object destructs them manually).

        Since LDMud 3.2.8, programs may protect themselves from being
        shadowed with the #pragma no_shadow.

SEE ALSO
        query_shadowing(E), unshadow(E), query_allow_shadow(M)

Die Seite ist auch in Deutsch vorhanden.

Start » Magierhandbuch » Docu » Efun » Shadow Letzte Generierung: 25.04.2021, 01:58
Email an: mud@wl.mud.de
Valid HTML 4.01!