FUNKTION:
#include <moving.h>
varargs int move(mixed dest, int method, string dir, string* msgs)
int move(mixed dest, int method); //bei !livings
Veraltet (NICHT MEHR VERWENDEN!):
varargs int move(mixed dest, int meth, string dir, string out,
string in);
ARGUMENTE:
dest: Wohin soll das Objekt (String oder Objekt)
method: Wie soll das Objekt bewegt werden
dir: String oder 0 der die Bewegungsrichtung enthaelt
msgs: Hier koennen Meldungen bei Betreten und Verlassen des
Raumes gesetzt werden, wenn man nicht die vom Spieler
gesetzten verwenden moechte
BESCHREIBUNG:
Move bewegt das Objekt nach "dest". Beim Bewegen des Objektes
werden einige Tests durchgefuehrt, die unterschiedliche Werte
zurueckliefern. Die Fehler koennen dadurch gezielt ausgewertet
werden. (In aller Regel wird ein Event erzeugt nach Art der Move-
methode: ET_GO, ET_TPORT, ET_GET, ET_PUT, ET_GIVE, ET_DROP.)
"method" kann aus den unten aufgefuehrten Makros zusammengesetzt
werden. Irgendein Wert ist auf jeden Fall zu benutzen! Die einzelnen
Werte verknuepft man mit 'logisch-oder' (|).
Bei Livings MUSS M_GO oder M_TPORT angegeben werden, damit ein
Event erzeugt wird, es sei denn das Living ist ein nehmbarer
NPC. Fuer nehmbare NPCs sind auch die anderen Methoden erlaubt;
ist eins von M_GET, M_DROP, M_GIVE, M_PUT gesetzt, so wird
M_SILENT automatisch mitgesetzt; ist keine Methode gesetzt,
so wird mit M_TPORT bewegt.
Bei !Livings MUSS M_GET, M_PUT, M_GIVE oder M_DROP angegeben
werden, damit ein Event erzeugt wird. Der Event kann dennoch
unterdrueckt werden mit zusaetzlicher Methode M_NOEVENT.
M_NOCHECK unterdrueckt den Event ebenfalls. Es ist aber
nach aller Moeglichkeit IMMER ein Event zu senden, damit andere
Objekte die Moeglichkeit haben, darauf zu reagieren. M_NOEVENT
und M_NOCHECK sollten deshalb im wesentlichen der Mudlib vorbe-
halten sein. Verwendung bitte mit einem Region/Erzmagier absprechen!
Ist "msgs" Null, so werden die (moeglichen) Bewegungsmeldungen
vom Lebewesen selbst erzeugt. Dazu wird P_MMSGIN usw benutzt.
Moechte man andere Ausgaben erzeugen, so ist "msgs" zu setzen
in der Art ({ Meldung an Lebewesen selbst, Meldung an verlassenen
Raum, Meldung an betretenen Raum }). Dabei werden in den Strings
"&Name" und "&name" durch den Namen des Lebewesens ersetzt.
Sind einzelne Elemente Null, so werden diese automatisch er-
zeugt, sind sie "", also leere Strings, so werden sie unter-
drueckt. Alle Texte werden bei der Ausgabe umgebrochen.
Hat man jedoch ein Lebewesen, welches auf jeden Fall mit den
eigenen Meldungen bewegt werden soll, so ist in diesem die
Eigenschaft P_MSG_FORCE zu setzen. Eventuell angegebene "msgs"
werden dann ignoriert.
Soll in den ganz wenigen verbliebenen Ausnahmefaellen auch solch
ein Lebewesen mit den beim move() uebergebenen Meldungen bewegt
werden, so ist M_MY_MSG bei method mitanzugeben.
Herrscht in einem der Raeume Dunkelheit so wird die entsprechende
Meldung nicht ausgegeben. Ebenso wenn ein unsichtbarer Magier
bewegt wird. Ausnahme hiervon Bewegungen mit M_MY_MSG, wo die
Verantwortung der Ausgaben vollstaendig beim aufrufenden Objekt
liegt.
Zum Bewegen gibt es verschiedene Methoden:
FUER LIVINGS:
M_GO : wie normales Gehen
M_TPORT : Teleporting (magische Bewegung)
M_SILENT : ohne Mitteilung an den Raum
M_NO_SHOW : Zeigt nicht die Raumbeschreibung beim Ankommen
M_NO_ATTACK : Es wird kein Begruessungsschlag ausgefuehrt
M_MY_MSG : Es werden auf jeden Fall die angegeben Meldungen
verwendet, auch wenn im Lebewesen P_MSG_FORCE
FUER OBJEKTE:
M_GET : z.B. vom Raum zum Living
M_PUT : z.B. vom Living in einen Behaelter oder auf einen Tray
(im Sinn von Ablegen, Reinstecken)
M_GIVE : z.B. von Living zu Living
M_DROP : z.B. vom Living zum Raum (im Sinn von Fallenlassen)
FUER UNITS:
M_MOVE_ALL: bewegt ein komlettes Unitobjekt
M_FORCE_SPLIT: bewegt Teile davon
M_NO_JOIN: verhindert das automatische 'Vereinigen' von Units
FUER ALLE: (Benutzung bitte mit Regions/Erzmagier absprechen!!!)
M_NOCHECK: es werden keinerlei Tests durchgefuert und es wird
KEIN EVENT erzeugt. ( Units werden aber vereinigt! )
M_NOEVENT es wird kein Event erzeugt.
Haeufig wir M_NOCHECK benutzt, wenn ein Objekt in einen Raum bewegt
wird, weil es so schoen einfach ist. Da Raeume aber keine Pruefungen
auf Gewicht/Bulkiness/etc. unternehmen (sollten), ist dies ueber-
ssig! Das Moven wird am Raum nicht scheitern und wenn einen vernuenf-
tige Move-Methode benutzt wird, haben Event-Lauscher Gelegenheit,
darauf zu reagieren. Objekte in ein Living zu moven ohne Methode
und mit M_NOCHECK oder M_NOEVENT ist ebenfalls ein schlechter Stil.
Damit wird die Bulkiness/Gewichtskontrolle bei Livings voellig aus-
gehebelt!
RÜCKGABEWERT:
Erfolgsmeldung:
MOVE_OK (1) : Bewegung durchgefuehrt
MOVE_OK_SILENT (2) : Bewegung still durchgefuehrt
Misserfolg:
ME_PLAYER (-1) : ist ein Living
ME_TOO_HEAVY (-2) : Objekt ist zu schwer
ME_CANT_TPORT_IN (-3) : es kann nicht hineintelepotiert werden
ME_CANT_TPORT_OUT (-4) : hier darf nicht telepotiert werden
ME_CANT_BE_DROPPED (-5) : Objekt kann nicht abgelegt werden
ME_CANT_BE_TAKEN (-6) : Objekt kann nicht genommen werden
ME_CANT_BE_INSERTED (-7) : Behaelter verhindert das Reinlegen
ME_TOO_BULKY (-8) : Objekt ist zu sperrig
ME_WORN (-9) : Ruestung ist noch angezogen
ME_WIELDED (-10) : Waffe ist noch gezueckt
MOVE_EVENT_CANCELLED (-11) : Das Bewegen wurde abgebrochen, ohne
dass ein Grund angegeben wurde. Eine
Begruendung muss idr der Abbrecher
ausgeben.
ME_DESTRUCTED (-12) : Das Objekt wurde bei der Bewegung
zerstoert.
BEMERKUNGEN:
Die Methoden/Events kann man nochmal in /sys/moving.h nachlesen.
BEISPIELE:
Das Beispiel teleportiert den Spieler mit Event in den Wohnwagen:
Bitte 'result' auswerten, wenn es sehr wichtig ist!
result = spieler->move("/room/wohnwagen", M_TPORT,
"in den Wohnwagen", ({"Du fliegst in den Wohnwagen.",
"&Name fliegt in den Wohnwagen.", "&Name kommt angeflogen."}) );
Naechstes Beispiel bewegt die Fackel mit Event in den Spieler:
Bitte 'result' IMMER AUSWERTEN!!!
result = fackel->move(spieler, M_GET);
if (result < MOVE_OK)
{
// Fehlerbehandlung
write("Du kannst die Fackel nicht mehr tragen.\n");
...
}
else
{
// Erfolgsbehandlung
write("Du nimmst die Fackel.\n");
...
}
Folgendes Beispiel ist ein Notfall-Teleport fuer diverse Tools. Es
ist hier nicht erwuenscht, dass irgendwer das verhindert:
spieler->move("/room/void", M_TPORT|M_NOCHECK);
SIEHE AUCH:
moving(C), move_object(E), events(WL), ET_GO(WL), ET_TPORT(WL),
ET_GET(WL), ET_PUT(WL), ET_DROP(WL), ET_GIVE(WL)
|