
AddItem()
*********


FUNKTION
========

   varargs object AddItem(mixed filename,int refresh,mixed props);


DEFINIERT IN
============

   /std/room/items.c
   /std/npc/items.c


ARGUMENTE
=========

   filename
     String mit dem Namen des zu erzeugenden Objektes oder Array von
     Strings mit den Namen der zu erzeugenden Objekte. Bei einem Array
     wird ein Name zufaellig ausgewaehlt.
   refresh
     Wann und wie soll das Objekt erneuert werden:
     - REFRESH_NONE      - Kein Refresh bis zum Neuladen des Raums
                   - oder NPCs.
     - REFRESH_DESTRUCT  - Refresh bei Reset, wenn Item zerstoert
                           wurde.
     - REFRESH_REMOVE    - Refresh bei Reset, wenn Item entfernt wurde.
     - REFRESH_ALWAYS    - Neuer Clone bei jedem Reset.
     - REFRESH_MOVE_HOME - Objekt wird bei Reset automatisch
                           zurueckgeholt, wenn es wegbewegt wurde.
                     Wurde das Objekt zerstoert, wird es automatisch neu
                     erzeugt, wie bei REFRESH_DESTRUCT.
                           (nur in Raeumen!)
     Bei NPC's gilt zusaetzlich:
     - CLONE_WEAR       - Item Anziehen, wenn es eine Ruestung ist.
     - CLONE_WIELD      - Item zuecken, wenn es eine Waffe ist.
     - CLONE_NO_CHECK   - Zuecken oder Anziehen ohne Ueberpruefungen.
   props (optional)
     Mapping mit denen in einem geclonten Objekt zu setzenden
     Properties oder 1 fuer die Erzeugung einer Blueprint.


RUeCKGABEWERT
=============

   Innerhalb von Raeumen wird das erzeugte Objekt zurueckgeliefert. Bei
   NPC's klappt dies leider nicht, da dort die Objekte nicht sofort
   erzeugt werden, sondern erst, nachdem der NPC an seinen
   Bestimmungsort transferiert wurde. Daher wird bei NPC immer 0
   zurueckgegeben.


BESCHREIBUNG
============

     Abhaengig von <filename> und <props> wird ein Objekt erzeugt und in
     den Raum bzw. NPC bewegt. Dabei gibt es folgende Moeglichkeiten:
     - <filename> ist ein Dateiname.
       Es wird ein Clone dieser Datei erstellt oder (wenn <props>=1 ist)
       deren Blueprint verwendet.
     - <filename> ist ein Array von Dateinamen.
       Es wird eine Datei zufaellig aus dem Array ausgewaehlt und von
       dieser Datei ein Clone erstellt oder (wenn <props>=1 ist) deren
       Blueprint verwendet.
     Uebergibt man fuer <props> ein Mapping mit dem Aufbau
       ([prop_name:prop_wert,...]),
     so werden diese Properties im erzeugten Objekt gesetzt.
     Der Parameter <refresh> gibt an, was waehrend eines Resets im Raum
     bzw. in NPC's oder was beim Erzeugen von NPC's geschehen soll:
     In <rooms.h> sind dazu folgende Moeglichkeiten definiert:
     - REFRESH_NONE
         Das Objekt wird niemals erneuert; falls es zerstoert wurde, wird
         es erst dann wieder erzeugt, wenn der Raum erneut geladen bzw.
         der NPC neu erzeugt wird. Man beachte, dass nicht jeder NPC
         wirklich refreshende Objekte benoetigt, REFRESH_NONE spart
         hierbei sowohl Rechenzeit als auch Speicher!
     - REFRESH_DESTRUCT
         Das Objekt wird nur dann erneuert, wenn es in der Zwischenzeit
         zerstoert wurde (bei NPC's ist das zum Beispiel der Fall, wenn
         sie getoetet wurden).
         REFRESH_NONE & REFRESH_DESTRUCT + Blueprint-Objekt bedeutet bei
         NPC's ein Unique-Objekt, es wird also nicht beim Neuerzeugen des
         NPC's zurueckgesetzt.
     - REFRESH_REMOVE
         Das Objekt wird erneuert, wenn es sich nicht mehr im Raum bzw.
         im NPC befindet. Das kein sein, weil es zerstoert wurde, aber
         auch zum Beispiel in folgenden Faellen:
         * weil es jemand mitgenommen hat
            (in Raeumen bei Gegenstaenden)
         * weil es fortgegangen ist
            (in Raeumen bei NPC's, die herumlaufen)
         * weil es weggeworfen wurde
            (in NPC's bei Gegenstaenden)
     - REFRESH_ALWAYS
         Das Objekt wird immer erneuert. Von dieser Refreshmethode sollte
         man allerdings Abstand nehmen, da sich sonst mit der Zeit
         gewaltige Mengen von Objekten ansammeln koennen!
     - REFRESH_MOVE_HOME
         Das Objekt wird in einen Raum zurueckbewegt, sofern es noch
         existiert, jedoch nicht mehr in dem Raum ist. Sinnvoll ist dies
         eigentlich nur fuer Lebewesen, funktioniert aber auch bei
         beliebigen Objekten. Hauptsaechlich geht es hierbei darum,
         herumlaufende NPCs oder bei erzwungenen Bewegungen nicht von
         P_GUARD zurueckgehaltene NPCs wieder an einen definierten
         Ausgangsort zurueckzubringen.
   Wurde das Objekt zerstoert, wird es neu erzeugt.
     Hat man in Raeumen als <filename> ein Array von Dateinamen
     uebergeben, so wird beim Reset jedesmal aufs Neue ein zufaelliges
     Objekt aus der Liste ausgewaehlt (nicht in NPC's).
     In NPC's gilt der Grundsatz der Vermeidung von ueberfluessigen
     Objekten im MUD. Neu erzeugt werden Objekte beim Erzeugen eines
     NPC's oder bei einem Reset im selbigen. Anstatt die Objekte gleich
     neu zu erschaffen, wird erst geschaut, ob sich identische Objekte
     schon im Raum befinden. Ist dies der Fall, so nimmt der NPC sie auf,
     ruft jedoch vorher nochmals create() in ihnen auf!
       (noetig wegen moeglicher Veraenderungen an den Objekten)
     Was dann passiert, haengt von weiteren Angaben in <refresh> ab.
     Folgende weitere Moeglichkeiten sind in <npc.h> definiert:
     - CLONE_WEAR
       Ist das hinzugefuegte Item eine Ruestung, so wird sie nach
       Aufnahme oder Neuerzeugung angezogen.
     - CLONE_WIELD
       Ist das hinzugefuegte Item eine Waffe, so wird sie nach Aufnahme
       oder Neuerzeugung gezueckt.
     - CLONE_NO_CHECK
       Hiermit verhindert man eine Ueberpruefung, ob eine Ruestung
       angezogen oder eine Waffe gezueckt werden kann. Es ist jedoch
       Vorsicht geboten: So kann es ohne weiteres passieren, dass ein NPC
       mehrere Ruestungen gleichen Typs angezogen oder mehrere Waffen
       gezueckt hat.
     Benutzt man Blueprints (<props>=1) mit REFRESH_REMOVE oder
     REFRESH_ALWAYS, so kann es zu ungewollten Ueberraschungen kommen, da
     die Blueprint dann unabhaengig von ihrem momentanen Aufenthaltsort
     wieder in den Raum bzw. NPC bewegt wird, von dem sie erzeugt wurde!


BEMERKUNGEN
===========

   Wenn man Blueprints benutzt, sollte man daran denken, dass sich von
   dieser dann keine Clones mehr erstellen lassen!

   Die Option CLONE_NEW ist veraltet. Die Objekte werden nun immer
   neu erzeugt. Die Option darf noch angegeben werden, hat aber keine
   Bedeutung mehr.


BEISPIELE
=========

   // Ein Wuerfel, der sich nach Entfernen erneuert:
     AddItem("/obj/misc/wuerfel",REFRESH_REMOVE);
   // Ein etwas veraenderter Wuerfel:
     AddItem("/obj/misc/wuerfel",
             REFRESH_REMOVE,
             ([P_SHORT :"Ein schwerer Wuerfel",
               P_WEIGHT:100]));
   // Eine Blueprint, die nur einmal im MUD existiert. Wenn sie
   // zerstoert wurde, wird sie bei Reset neu erzeugt:
     AddItem("/mon/angsthase",REFRESH_DESTRUCT,1);
   // Eine Blueprint, die nur einmal im MUD existiert. Wenn sie aus dem
   // Raum entfernt wurde, wird sie bei Reset zurueckgeholt:
     AddItem("/mon/angsthase",REFRESH_MOVE_HOME,1);
   // Ein zufaelliges Objekt:
     AddItem(({"/obj/misc/lolli",
               "/obj/misc/bonbon",
               "/obj/misc/bier"}),REFRESH_REMOVE);
   // Eine Ruestung, die auch angezogen wird (nur in NPC's):
     AddItem("/ruestung/sommerkleid",REFRESH_REMOVE|CLONE_WEAR);
   // Eine Unique-Waffe, die auch gezueckt wird (nur in NPC's):
     AddItem("/waffe/zapper",REFRESH_DESTRUCT|CLONE_WIELD,1);


SIEHE AUCH
==========

   RemoveItem(), replace_program(), create(), P_GUARD,
   /std/room/items.c, /std/npc/items.c,
   /sys/rooms.h, /sys/npc.h

Last modified: Thu Nov 23 13:43:30 CET 2006 by Rumata
