move()

move()

FUNKTION:
Fuer unbelebte Gegenstaende (/std/thing):
varargs int move(object|string dest, int method);
Fuer Lebewesen (/std/living, /std/npc, usw.):
varargs int move(object|string dest, int method, string dir,
string textout, string textin);

DEFINIERT IN

/std/thing/moving.c
/std/living/moving.c

ARGUMENTE

dest
     Das Zielobjekt (entweder der Dateiname oder das Objekt selbst).

method
     Die Art der Bewegung (eine der unten aufgefuehrten Arten; es
     koennen auch mehrere zusammenge-ODER-t werden).

dir
     Die Richtung, in die ein Lebewesen geht. Normalerweise ist das die
     eingeschlagene Laufrichtung (zB. "nach Norden").

textout
     Verlaesst ein Lebewesen einen Raum, so wird diese Meldung in den
     Raum geschickt. Ist bei dir ein String angegeben, so wird dieser
     noch an textout angehaengt. Der Name des Lebewesens wird der
     Meldung in jedem Fall vorangestellt.

textin
     Dieser Text wird im Zielraum ausgegeben, wenn ein Lebewesen ihn
     betritt. Bei normaler Fortbewegung ist das "kommt an". Dem Text
     wird noch der Name des Spielers vorangestellt.

BESCHREIBUNG

Es wird versucht, das Objekt in das Zielobjekt dest zu bewegen.
Abhaengig vom momentanen Aufenthaltsort und dem Zielobjekt ist die
Bewegungsmethode method zu waehlen.

In <moving.h> sind folgende Konstanten fuer die Art der Bewegung
definiert:
M_NOCHECK
     Es werden keine Abfragen durchgefuehrt, ob das Objekt ueberhaupt
     in das Zielobjekt hineinpasst (was zB. aus Gewichtsgruenden der
     Fall sein koennte).

M_GO
     Ein Lebewesen bewegt sich gehend von einem Raum in den naechsten.
     Bei normalem Gehen wird diese Methode benutzt; man sollte sie auch
     benutzen, wenn man Spieler ueber einen SpecialExit in einen
     benachbarten Raum bewegt.

M_TPORT
     Ein Lebewesen wird von einem Raum in einen anderen teleportiert.
     Im Gegensatz zu M_GO kann ein Raum verhindern, dass man ihn
     mittels M_TPORT verlaesst oder betritt.

M_NO_SHOW
     Beim Bewegen von Lebewesen bekommen diese die Beschreibung des
     Zielraumes nicht ausgegeben.

M_NO_ATTACK
     Beim Bewegen von Lebewesen bekommen diese keinen
     Begruessungsschlag, wenn ein Feind im Zielraum steht.

M_SILENT
     Es werden beim Bewegen keine Meldungen ausgegeben. Dieser
     Parameter wirkt sich nur auf das Bewegen von Lebenwesen aus.
     (Magier mit 'mschau an' sehen die Bewegungen dennoch, es wird
      eine Standardmeldung ausgegeben.)

M_GET
     Das Objekt wird von einem unbelebten Objekt (zB. einem Raum, einer
     Leiche, einem Beutel) in ein lebendes Objekt (Spieler oder NPC)
     bewegt.

M_PUT
     Das Objekt wird von einem lebenden Objekt in ein unbelebtes Objekt
     bewegt.

M_GIVE
     Das Objekt wird von einem Lebewesen an ein anderes Lebewesen
     weitergereicht.

M_MOVE_ALL (Nur fuer Objekte, die /std/unit.c erben)
     Es wird die gesamte Menge bewegt, nicht nur ein Teil.

Soll das Objekt auf jeden Fall und ohne jede Abfrage bewegt werden, so
reicht es, als method M_NOCHECK zu uebergeben.

Waffen und Ruestungen werden, soweit sie gezueckt bzw. angezogen sind,
beim Bewegen auf jeden Fall weggesteckt bzw. ausgezogen. Ist in method
M_SILENT enthalten, so geschieht dies ohne Meldungen.

Die erste Art des Funktionsaufrufs ist sowohl beim Bewegen von
Lebewesen als auch von unbelebten Objekten moeglich. Die zweite Art
laesst sich nur bei Lebewesen anwenden.

ANMERKUNG

Diese Funktion sollte nicht (mehr) ueberschrieben werden. Stattdessen
greift bitte auf PreventMove() und NotifyMove() zurueck. RMs sind
aufgerufen, Objekt mit ueberschriebenen move() nur noch dann
anzuschliessen, wenn der Zweck sonst nicht erreicht werden kann. Solltet
ihr move() ueberschreiben: Seid euch sehr genau im klaren, was move()
genau macht. ;-)



Wenn Livings bewegt werden, sorgt move() automatisch in Abhaengigkeit
von P_PARA dafuer, dass das Lebewesen in der korrekten (Parallel-)Welt
landet.

Bei Gegenstaenden wird ebenfalls versucht, die richtige Zielwelt
auszuwaehlen (damit z.B. in der Parallelwelt geworfene Bumerangs auch nur
innerhalb der Parallelwelt fliegen). Um Rechenzeit zu sparen, wird das
allerdings nur versucht, wenn 'dest' ein Filename ist und kein Objekt.

Grund: bei Zielobjekten handelt es sich meist um Bewegungen in das Inv
oder Env eines Spielers - und die sind uninteressant. Raumwechsel dagegen
erfolgen fast immer unter Angabe eines Filenamens anstatt eines Objektes.

RUeCKGABEWERT

Alle Rueckgabewerte sind als symbolische Konstanten in <moving.h>
definiert. (MOVE_OK ist 1, alle anderen sind <0 und symbolisieren Fehler.
Traditionell erfolgt die Pruefung auf erfolgreiches Move mit == 1, in
Zukunft wird == MOVE_OK empfohlen.)



MOVE_OK
     Die Bewegung wurde erfolgreich abgeschlossen.

ME_PLAYER
     Lebewesen lassen sich nicht ohne weiteres bewegen. Es muss
     mindestens eine der Methoden M_NOCHECK, M_GO oder M_TPORT
     angegeben werden.

ME_TOO_HEAVY
     Das Zielobjekt kann dieses Objekt aus Gewichtsgruenden nicht mehr
     aufnehmen.

ME_CANT_TPORT_IN
     Das Zielobjekt verbietet das Teleportieren in sich hinein (nur bei
     M_TPORT ohne M_NOCHECK).

ME_CANT_TPORT_OUT
     Der Raum, in dem sich das Lebewesen befindet, verbietet das
     Teleportieren aus sich hinaus (nur bei M_TPORT ohne M_NOCHECK).

ME_CANT_BE_DROPPED
     Das Objekt kann nicht fallen gelassen werden (zB. weil P_NODROP
     gesetzt ist).

ME_CANT_BE_TAKEN
     Das Objekt kann nicht genommen werden (zB. weil P_NOGET gesetzt
     ist).

ME_CANT_BE_INSERTED
     Das Zielobjekt verhindert das Einfuegen aus bestimmten Gruenden.

ME_CANT_LEAVE_ENV
     Der Container verhindert ein verlassen des Objektes

ME_TOO_HEAVY_FOR_ENV
     Ein Objekt kann einen Behaelter nicht verlassen, da es dem
     Lebewesen sonst zu schwer wuerde.

TOO_MANY_OBJECTS
     Das Zielobjekt kann soviele Objekte nicht mehr aufnehmen.

ME_NOT_ALLOWED
     Raeume mit gesetzter Property P_NO_PLAYERS koennen nur von
     Testspielern und Magiern betreten werden. Bei Spielern oder
     Gildentesties gibt es diese Fehlermeldung.
ME_WAS_DESTRUCTED
     Das Objekt hat sich entweder im Verlaufe der Bewegung selbst
     zerstoert oder wurde zerstoert, sodass move() nicht erfolgreich
     beendet werden konnte. (Bsp: sensitive Objekte)

ME_DONT_WANT_TO_BE_MOVED
     Das Objekt moechte nicht bewegt werden.

BEISPIELE

o Ein Objekt "gibt sich" dem Spieler:

  move(this_player(), M_GET);

o Ein Lebewesen wird in die Abenteurergilde teleportiert:

  lv->move("/gilden/abenteurer", M_TPORT);

o Ein Spieler "wird in die Gilde gegangen":

  this_player()->move("/gilden/abenteurer", M_GO, "in die Gilde");

  Spieler, die mit ihm im gleichen Raum stehen, sehen folgende
  Meldung:
  "<name> geht in die Gilde."

o Ein Spieler schwimmt durchs Meer:

  this_player()->move("meer_xy", M_GO, "nach Norden", "schwimmt",
                      "schwimmt herein");

  Spieler in seinem Startraum sehen "<name> schwimmt nach Norden.",
  Spieler in seinem Zielraum sehen "<name> schwimmt herein."

SIEHE AUCH

Seherkommandos
    setmin, setmmin, setmout, setmmout, review
Verwandt:
    move_object(), remove(), PreventInsert(), PreventLeave(),
    PreventInsertLiving(), PreventLeaveLiving(), PreventMove(),
    NotifyInsert(), NotifyLeave(), NotifyMove(), NotifyRemove(),
    init(), exit()
Properties:
    P_MSGIN, P_MSGOUT, P_MMSGIN, P_MMSGOUT, P_NO_PLAYERS, P_PARA,
    P_NO_TPORT
Objekte:
    /std/thing/moving.c, /std/living/moving.c

2019-Aug-20, Arathorn