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

