PreventMove()

PreventMove()

FUNKTION

protected int PreventMove(object dest, object oldenv, int method);

DEFINIERT IN

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

ARGUMENTE

dest
Das Ziel des Moves
oldenv
Das (Noch-)Environment des Objekts
method
Die Move-Methode(n), mit der/denen bewegt werden soll

BESCHREIBUNG

Mit dieser Funktion prueft ein Objekt, ob es von ‘oldenv’ nach ‘dest’ bewegt werden mag. Dabei wird ‘method’ beruecksichtigt (z.B. schaltet M_NOCHECK die meisten Pruefungen ab). Bei Gegenstaenden wird z.B. P_NODROP, P_NOGET, das Gewicht, ob das Ziel das Objekt aufnehmen will (MayAddWeight(), PreventInsert) oder auch PreventLeave() geprueft. Bei Lebewesen wird z.B. P_NO_TPORT in ‘dest’ und ‘oldenv’ und PreventLeaveLiving/PreventInsertLiving() ausgewertet. Bei Spielern wird auch noch getestet, ob method M_GO oder M_TPORT enthaelt und ob das Ziel nur von Testspielern betreten werden kann.

RUeCKGABEWERT

0, wenn das Objekt bewegt werden darf. Wenn es nicht bewegt werden darf, sind als Rueckgabewerte die in /sys/moving.h definierten Move-Fehlerwerte zulaessig (s. move()). Sollte hier ein ungueltiger Fehlerwert zurueckgegeben werden, wird das move() ebenfalls abgebrochen und ME_DONT_WANT_TO_BE_MOVED zurueckgeben.

BEMERKUNGEN

Diese Funktion kann ueberschrieben, um feinere Kontrolle ueber die Bewegungen des Objekt zu haben. Dabei aber bitte einige Dinge beachten:

1. Denkt daran, ggf. M_NOCHECK zu beruecksichtigen und und eure Pruefungen nur zu machen, wenn es nicht in method vorkommt.

2. GANZ WICHTIG: Wenn ihr mit euren Pruefungen fertig sein und das Objekt bewegt werden duerfte, die geerbten Pruefungen noch testen, also IMMER das geerbte PreventMove() noch aufrufen und dessen Wert zurueckgeben/beruecksichtigen, da sonst Pruefungen des Gewichts etc. nicht funktionieren oder bei Lebewesen die Prevent*() im Environment nicht gerufen werden!

3. Die Funktion ist nur objektintern zu verwenden, Call-Other von aussen sind nicht moeglich, beim Ueberschreiben ‘protected’ nicht vergessen.

  1. Nochmal: Geerbtes PreventMove() NICHT VERGESSEN!

BEISPIELE

Ein Objekt, was nur im Sternenlicht aufgenommen werden kann (warum auch immer):
protected int PreventMove(object dest, object oldenv, int method) {
  if ( (method & M_NOCHECK) ) {
      // wenn mit M_NOCHECK bewegt, ist das Sternenlicht egal, nur
      // geerbtes PreventMove() beruecksichten:
      return ::PreventMove(dest, oldenv, method);
  }
  else if ( method & M_GET) {
      // wenn es aufgenommen werden soll: nach Sternenlicht im Raum
      // gucken:
      if (objectp(dest) &&
          (dest->QueryProp(P_LIGHT_TYPE) != LT_STARS))
          return ME_CANT_BE_TAKEN;
  }
  // Fall-through:
  return ::PreventMove(dest, oldenv, method);
}