P_NETDEAD_INFO
==============

NAME
----
::

    P_NETDEAD_INFO                "netdead_info"                

DEFINIERT IN
------------
::

    /sys/player.h

BESCHREIBUNG
------------
::

     Wird im Raum X gesetzt und wirkt nur, falls dieser Raum ein '#' im
     object_name() hat (normale Clones, zB "/room/void#10153018").

     

     Bei Einschlafen eines Spielers in diesem Raum werden die Werte aus
     der Property im Spieler gespeichert (Netztoteninformationen).

     Ist beim Aufwachen des Spielers das Raumobjekt X zerstoert worden, dann
     wird bei der Blueprint von X per SetProp() die gespeicherte Information
     gesetzt. Der Rueckgabewert des SetProp wird als Pfad zu einem Ausweich-
     Aufwach-Raum interpretiert und der Spieler wird in dem Fall dorthin
     bewegt.

BEMERKUNGEN
-----------
::

     Zum Clonen von Raeumen sollten Virtual Compiler benutzt werden:
     Wird in den erzeugten Objektnamen KEIN '#' verwendet, dann ist diese
     Property nicht sinnvoll und wird nicht verwendet. Ein ordentlicher
     VC kann Bewegen eines Spielers in dessen alten, nicht mehr existierenden
     Raum oder einen Ersatzraum beim Aufwachen selbst loesen.

BEISPIELE
---------
::

     // #1: geclonter Raum mit Ausweich-Aufwachraum: Klerus-Gilde
     #include <properties.h>
     inherit "/std/room";

     

     void create() {
       ::create();

       SetProp(P_NETDEAD_INFO, "/gilden/klerus");
       SetProp(P_LIGHT, 1);
     }

     

     // #2: komplexerer Beispielraum fuer P_NETDEAD_INFO-Funktionalitaet
     // Siehe auch: /doc/beispiele/testobjekte/netdead_info_testraum.c
     #include <properties.h>
     inherit "/std/room";

     void create() {
       ::create();

       if (clonep(this_object()))
         // setze Informationen, die im Netztoten gespeichert werden sollen
         Set(P_NETDEAD_INFO, random(5));
       else
         // Blueprint: hier kann man zu einem Cloneraum gehen
         AddExit("cloneraum", #'create_room);

       // Set-Method, um die Informationen aus P_NETDEAD_INFO beim Aufwachen
       // in der Blueprint auswerten zu koennen
       Set(P_NETDEAD_INFO, #'create_destiny, F_SET_METHOD);
       SetProp(P_LIGHT, 1);
     }

     

     // Raum entfernen, normalerweise so KEINE GUTE IDEE!
     void BecomesNetDead(object pl) {
       call_out(#'remove, 30);
     }

     // erzeuge einen Cloneraum und bewege den Spieler dahin
     int create_room(string dir) {
       object dest = clone_object(object_name(this_object()));
       this_player()->move(dest, M_NOCHECK);
       return 1;
     }

     

     // Set-Method fuer P_NETDEAD_INFO: gibt Pfad zurueck
     // benutze die Informationen aus dem jetzt aufwachenden Netztoten, um
     // einen alternativen Aufwachraum zu ermitteln, da der Einschlafraum
     // zerstoert ist
     string create_destiny(mixed val) {
       if (intp(val)) {
         switch (val) {
           case 0:
             return "/d/ebene/room/PortVain/po_haf1";
           case 1:
             return "/gilden/klerus";
           case 2:
             return "/gilden/karate";
           default:
         }
         return "/d/ebene/room/waldweg4";
       }
     }

2. Jan 2012 Gloinson

