Dokumentation zu: AddItem(L)

HR Image


FUNKTION:
	vargs object AddItem( mixed filename, int flags, mixed extra );

ARGUMENTE:
	filename: Der Pfadname des zu clonenden Objektes, oder ein Array
		  von Pfadnamen zu clonender Objekte.
	flags:    Ein ganzzahliger Wert der das Resetverhalten oder
                  die Tageszeitabhaengigkeit angibt
	props:    Ein Mapping mit extra zu setzenden Properties (optional),
                  eine Eins (1) oder ein Array aus zwei Strings (die
                  Strings duerfen auch Closures sein).

BESCHREIBUNG:
	Dem Raum wird ein Objekt (Ding/Lebewesen) als Inventar hinzugefuegt.
	Hierbei sind zwei Varianten moeglich:
	  * Ein klassisches 'rumliegendes' Objekt, welches automatisch
	    erneuert wird, wenn es weggenommen und/oder zerstoert wird.
	  * Ein so genanntes 'Timed Item' welches nur tageszeitabhaengig
            im Raum anzutreffen ist, und dessen Erneuerung ausschliesslich
	    auf den Tageszeiten beruht.

	Zunaechst die klassischen Objekte:
	----------------------------------
	Sie werden sofort in den Raum bewegt und verbleiben (wenn keine
	Spielerinteraktion eingreift) fuer immer dort.

	Ob sie automatisch erneuert werden sollen, wenn ein Spieler sie
	wegnimmt oder sogar zerstoert ist mit folgenden Flags steuerbar.
	Die Erneuerung findet jeweils im reset() des Raumes statt.

	REFRESH_NONE - Das Objekt wird bis zum naechsten Reboot nicht
	  neu erzeugt (es wird sogar komplett aus den Infos des Raumes
          entfernt).
	REFRESH_DESTRUCT - Das Objekt wird beim naechsten reset() des
	  Raumes neu erzeugt, falls das jetzige Objekt zerstoert worden
          sein sollte. Typisches Flag fuer NPCs.
          Bitte Hinweis am Ende der Hilfeseite beachten.
	REFRESH_REMOVE - Das Objekt wird beim naechsten reset() des Raumes
	  neu erzeugt, falls das jetzige Objekt aus dem Raum entfernt wurde.
          Typisches Flag fuer einsammelbare Dinge.
	REFRESH_ALWAYS - Das Objekt wird bei jedem reset() des Raumes neu
          erzeugt. Typisches Sinnlosflag. Bitte nie benutzen, da nach
          einigen reset()s der Raum natuerlich vor Objekten ueberquillt.

	Das Argument 'extra' kann bei diesem Typus von Objekten entweder
	Null (0), Eins (1) oder ein Mapping sein.

	Wenn es ein Mapping ist, so wird dieses ueber die Properties gelegt.
	So kann man zB die P_LONG eines Dinges unabhaengig von dem
	angegebenen File festlegen, indem man als 'extra' angibt:
	([ P_LONG: "Blah Fasel, toll toll." ]).

	Wenn man '1' als extra angibt, so wird statt eines Clons der
	Blueprint in den Raum gelegt. Dies ist nur fuer ganz wenige
	Spezialfaelle interessant.


	Die 'Timed Items':
	------------------
	Diese Objekte werden nur dann in den Raum bewegt, wenn gerade
	eine bestimmte Tageszeit vorliegt. Also zB auch nicht unbedingt
	sofort, wenn diese Funktion aufgerufen wird. Weiterhin werden sie
	niemals im reset() erneuert wie normale Objekte, sondern nur im
	Rahmen der Tageszeitaenderungen. (Klassische Flags werden
        ignoriert wenn ein Timed-Flag angegeben wurde!)

	Zu welchen Zeiten das Objekt anzutreffen sein soll, gibt man mit
	folgenden Flags an: 
		TIMED_DAWN = Morgengrauen (die Zeit von 'Dem Morgen 
		             graut' bis 'Es wird Tag')
		TIMED_MORN = tagsueber bis zur Abenddaemmerung
		TIMED_DUSK = Abendrot (wieder die 5 minuetige Spanne 
		             bis es Nacht wird)
		TIMED_EVEN = nachts bis zum Morgenrot
	Ein Ding, was also vom Beginn des Morgengrauens bis zum Ende der
	Abenddaemmerung vorhanden sein soll, solte als 'flags' den
	Wert TIMED_DAWN|TIMED_MORN|TIMED_DUSK gesetzt bekommen.

	Moechte man, dass die Bewegung 'leise' erfolgt (zB weil schon
	anderweitig eine Meldung ausgegeben wird), kann man zusaetzlich
	noch das Flag TIMED_SILENT setzen.

	Wenn das Objekt entfernt wird, so wird das Objekt zunaechst aus dem
	Raum bewegt und dann dessen deep_inventory() und dann das Objekt
	selbst zerstoert.

	Als 'extra' kann ein biszu zweielementiges Array angegeben werden.
	Das erste Element ist ein Text, ausgegeben wird, bevor das neue
	Objekt in den Raum bewegt wird. Ist es eine Closure, so wird deren
	Rueckgabewert ausgegeben. Das zweite Element wird entsprechend vor
	dem Entfernen des Objekts ausgegeben; auch hier ist eine Closure
	moeglich. Die Ausgabe beim Entfernen wird in dem Raum erzeugt, wo
	sich das Objekt zu dem Zeitpunkt befindet, was nicht unbedingt der
	erzeugende Raum sein muss. Siehe auch Abschnitt Bemerkung.

	Beide Closuren koennen statt eines Strings auch Null liefern.
	In diesem Fall wird die Aenderung des Objektstatus _nicht_ vorge-
	nommen. Also das Objekt bleibt vorhanden bzw abwesend. Hiermit
	kann man noch bei fortgeschrittener Programmierkunst staerker ins
	Geschehen eingreifen. Wichtig zu wissen ist, moechte man mit der
	Closure keine Ausgabe erzeugen, so muss sie "" zurueckliefern.

	(Bei der Erzeugemeldung bekommt die Closure den Filenamen als
	Argument, bei der Entfernmeldung einen Zeiger auf das fragliche
	Objekt selbst.)

	Weiterhin ist zu beachten, dass die speziellen Funktionen, die
	die Uhr zu Zeitwechseln aufruft, nicht blockiert werden. Wenn man
	also Morgen(), Tag(), Abend() oder Nacht() benutzt, muss man
	auf jeden Fall die entsprechende ererbte Funktion aufrufen, also
	in etwa mit ::Morgen().


	Bei beiden Objektarten gilt:
	Wird ein Array von Pfadnamen angegeben, so wird ein zufaelliges
	Element ausgewaehlt und gecloned, welches beim naechsten reset()
	oder Tageszeitwechsel durchaus ein anderes Objekt sein kann.

RÜCKGABEWERT:
	Das Objekt welches in dem Raum gecloned wurde.	

BEMERKUNG:
	AddItem()s sollten in Raeumen immer als _allerletzes_ gemacht
	werden. Nach allen AddCmd() und vor allem nach allen AddExit()s.
	Ansonsten koennen fuer Spieler groessere Schwierigkeiten auftreten,
	wenn das Erzeugen eines Objektes einmal fehlschlaegt.

        Objekte die mit REFRESH_DESTRUCT erzeugt werden zeigen ein
	Spezialverhalten. Da diese Dinge jeweils nur einmal im Mud
	vorkommen sollen, wird bei einem (Neu-)Laden des Raums nach bereits
	von einer Vorinstanz des Raums erzeugten Objekten gesucht, und diese
	ggf verwendet. Bei mehreren noch vorhandenen Clonen wird der neueste
        benutzt.
        Dieses Verhalten gibt es jedoch nicht, wenn:
	  - der Raum nur ein Clone ist (Raeume vom VC zaehlen nicht als Clone)
          - ein Blueprint als Objekt verwendet wird (3. Argument == 1)
          - mehrere Dateinamen verwendet wurden (1. Argument Array)

	Timed Items muessen auf jeden Fall auch nach dem Setzen der
	Zeitzone erzeugt werden, nicht vorher. Ein Aendern der Zeitzone
	fuehrt auf jeden Fall zu unerwartetem Verhalten, da einige Daten
	der Zeitzonen in Variablen des Raum gehalten werden!

	Timed Items koennen nur bedingt aus ihrem Heimatraum entfernt
	werden. Ein evt vorhandener 'Entferne'-Text wird zwar im momentanen
	Raum des Objekts ausgegeben, jedoch ist nicht gewaerleistet, dass
	die Erscheinungszeit des Objektes stimmt. Diese wird ausschliesslich
	im erzeugenden Raum geprueft. Wird dieser nicht betreten, findet
	auch keine Kontrolle statt. Nehmbare Dinge oder Mnpcs erfordern also
	spezielle Massnamen. Gegebenenfalls sollte man sich in so einer
	Situation an einen erfahrenen Magier wenden.

	Moechte man wissen, wann das letzte Mal in einem Raum die Objekte
	'reset'tet wurden, kann man dazu die Lfun QueryLastReset() benutzen.

BEISPIEL:
	
	void create() {
	  ...
	  AddItem("/obj/seil", REFRESH_REMOVE);
	  // in dem Raum liegt ein Seil, was zum naechsten reset() neu
	  // gecloned wird, wenn es jemand genommen hat

	  AddItem( ({ "/obj/sahnebonbon",
		      "/obj/minzbonbon",
		      "/obj/himbeerbonbon"}), REFRESH_REMOVE);
	  // in dem Raum liegt ein beliebiges Bonbon, was bei einem
	  // reset() neu gecloned wird, wenn es aus dem Raum entfernt
	  // wurde, dabei kann es immer ein anderes Bonbon sein.
	  ...

	  AddItem("/npc/fee", TIMED_MORN|TIMED_SILENT,
	    ({ "In der Daemmerung kannst Du ploetzlich eine Fee "
	       "ausmachen.", "" }) );
	  // Ab der Morgendaemmerung (d.h. tagsueber) ist eine Fee anwesend,
	  // wenn die Sonne untergeht, verschwindet sie (ohne Meldung) 
	  // wieder.
	}

SIEHE AUCH:
	P_ITEMS, P_TIMEZONE, RemoveItem(L), reset(A), uhr(WL),
	QueryLastReset(L)


Start » Magierhandbuch » Docu » Lfun » AddItem Letzte Generierung: 25.04.2021, 01:58
Email an: mud@wl.mud.de
Valid HTML 4.01!