SYNOPSIS
        object present(string str)
        object present(string str, int n)
        object present(string str, object env)
        object present(string str, int n, object env)

        object present(object ob)
        object present(object ob, object env)

BESCHREIBUNG
        Wenn ein Objekt mit der Id <str> sich im Inventar oder in der Umgebung
        von this_object() befindet, wird es zurueck geliefert.
        
        Ist das Argument <n> gegeben, wird das n-te Objekt mit Namen <id>
        zurueck geliefert. Das heisst, der Driver fuehrt fuer alle Objekte
        im Inventar und in der Umgebung von this_object() die Funktion
        id(str) aus, bis ein Treffer erzielt wird (wenn ueberhaupt).

        Ist <n> nicht gegeben, aber <str> hat die Form "<id> <n>" , wird
        ebenfalls das n-te Objekt mit Namen <id> zurueckgeliefert.

        Es ist: id(str) { return str == <name>; }

        <str> kann auch ein Objekt (anstatt einem object_name()) sein, was den
        Test schneller und einfacher macht.

        Das Argument <env> ist optional. <env> gibt an, wo nach <str> gesucht
        wird. Nur das Inventory von <env> wird durchsucht, nicht jedoch dessen
        Umgebung. Oftmals wird fuer <env> this_player() gesetzt.


ANMERKUNG
        Diese efun kann u.U. _sehr_ teuer sein! Bitte schaut euch auf jeden
        Fall auch die efun present_clone() an und schaut, ob die evtl. das
        kann, was ihr machen wollt. present_clone() ist erheblich billiger.

        Wenn die efun sowohl in this_object() als auch dessen Umgebung
        sucht, werden, soweit es die Numerierung betrifft, die beiden
        Umgebungen zusammenhaengend betrachtet.

BEISPIELE
        present("chest");
          --> findet das erste 'chest' Objekt

        present("chest 2");
          --> findet das zweite 'chest' Objekt

        present("chest 2", 1);
          --> findet das erste 'chest 2' Objekt

        Wenn sich eine "chest" im this_object() befindet, und zwei
        ausserhalb:
          present("chest", 1) -> findet die chest im Objekt
          present("chest", 2) -> findet die erste chest ausserhalb
          present("chest", 3) -> findet die zweite chest ausserhalb
        
        Wenn ein Objekt die Forum "<id> <n>" in Verbindung mit einem selbst
        ueber add_action() gesetzten Verb unterstuetzen soll (damit z. B.
        "oeffne Kiste 3" funktioniert), kann das folgendermassen geloest
        werden:

            void init() { add_action("oeffne_kiste", "oeffne"); }

            int oeffne_kiste(string str)
            {
                if(present(str) != this_object() )
                {
                    return 0; /* nicht diese Kiste */
                    ...
                }
            }

HISTORY
        LDMud 3.2.11/3.3.610 fuehrte die (str, n)-Form ein.
        LDMud 3.3.713 aenderte die Numerierung wenn sowohl Inventory
          als auch Umgebung durchsucht werden. In der vorherigen
          Implementierung wurde eine Numerierung auf beiden Umgebungen
          einzeln angewandt, was zur Folge hatte, dass niedere Objekte
          in der aeusseren Umgebung nicht gefunden werden koennten, da
          sie von den Objekten in Inneren verdeckt wurden.

SIEHE AUCH
        move_object(E), environment(E), this_object(E), present_clone(E),
        id(A), init(A)
