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)
|