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