
create()
********


FUNKTION
========

   protected void create();


DEFINIERT IN
============

   allen Standardobjekten


ARGUMENTE
=========

   keine


BESCHREIBUNG
============

   Diese Funktion wird aufgerufen, wenn ein Objekt geladen oder
   geclont wird. In dieser Funktion wird das Objekt initialisiert und
   konfiguriert. Waehrend des create() kann es einen
   this_player()/this_interactive() geben, muss aber nicht! Im
   create() hat das Objekt noch kein environment(). create() wird nur
   gerufen, wenn das Objekte geclont oder explizit geladen wird. Wenn
   es aufgrund eines inherit in einem anderen Objekt vom Driver
   geladen wird, wird das create() nicht ausgefuehrt (s.
   create_super()).


RUeCKGABEWERT
=============

   keiner


BEMERKUNGEN
===========

   Erbt man von anderen Objekten, so besteht die erste Aktion
   innerhalb von create() normalerweise darin, in diesen Objekten
   create() aufzurufen.

   In altem Code wird create() haeufig ohne Sichtbarkeitsmodifikator
   verwendet, es sollte aber immer protected gewaehlt werden, es gibt
   keinen guten Grund create() mehr als einmal zu rufen, im Gegenteil,
   wird das geerbte create() mehrfach gerufen kann das zu schwer zu
   findenden Bugs fuehren.

   Um Speicher zu sparen, kann man bei Blueprints von der
   Konfigurierung absehen (siehe Beispiel). Dies sollte man allerdings
   nicht bei Objekten machen, von denen keine Clones erzeugt werden
   sollen (zB. bei Raeumen).

   Man sollte bei Abbruch des create() in BP unbedingt
   set_next_reset(-1); rufen, da sonst die (nicht konfigurierte) BP
   resetten kann und dann buggt.


BEISPIELE
=========

   Ein Gegenstand wuerde wie folgt konfiguriert:

   inherit "/std/thing";

   #include <properties.h>

   protected void create()
   {
     // Wenn wir die Blueprint sind: NICHT konfigurieren!
     // Bei normalen Raeumen oder Transportern sind diese
     // Zeilen wegzulassen!!!
     if (!clonep(this_object()))
     {
       set_next_reset(-1);    // wichtig, damit die BP nicht resettet.
       return;
     }

     // Ansonsten die allgemeinen Eigenschaften von /std/thing
     // konfigurieren...
     ::create();

     // ...und nun unsere speziellen Eigenschaften:
     SetProp(P_NAME, "Muell");
     SetProp(P_SHORT, "Muell");
     SetProp(P_LONG, "Voellig unnuetzer Muell!\n");
     SetProp(P_ARTICLE, 0);
     SetProp(P_VALUE, 0);
     SetProp(P_GENDER, MALE);
   }


SIEHE AUCH
==========

   create(), reset(), create_super() set_next_reset()

Letzte Aenderung: 27.10.2018, Bugfix
