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.
	                        (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.
	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!
	RemoveItem() zum Entfernen von Items ist nur fuer Raeume definiert!

	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
