
add_action(E)
*************


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

   1. Das Verhalten dieser efun wird durch AddCmd aus
      /std/thing/commands.c komfortabler widergespiegelt. Darauf
      sollte man zurueckgreifen.

   2. add_action() sollte immer innerhalb von init() benutzt werden

   3. das definierende Objekt muss im inventory des Spielers oder
      environment() des kommandogebenden Lebewesens sein

   4. im init() spaeter eingetragene Kommandos oder spaeter
      hinzukommende Objekte werden bei der Kommandoauswertung VOR den
      alten beruecksichtigt. (Daher bewegt sich das Xtool der Magier
      regelmaessing neu in das Inventory, um immer "erstes" Objekt zu
      sein.)


BEISPIELE
=========

   1. ein Kommando in einem Schirm

            void init() {
              ::init();
              add_action("action_oeffne", "oeffne");
            }

            int action_oeffne(string str) {
              if(stringp(str) && id(str)) // Argument da und bin ich gemeint?
              {
                write("Du oeffnest den Schirm.\n");
                say(break_string(this_player()->Name(WER)+" oeffnet einen Schirm.",
                      78));
                return 1;
              }
              notify_fail("Was willst Du oeffnen?\n");
              return 0;
            }

      2. Kommandoblockierer: frueher beliebt um Spieler
         lahmzulegen, da es _alle_ Kommandos triggert. Heute jedoch
         dafuer eher P_DISABLE_COMMANDS verwenden. *Achtung*: siehe
         Implikation von (4) oben.

            add_action("action_nothing", "",1 );
            ...
            int action_nothing(string str) {
              write("Dir sind die Haende gebunden.\n");
              return 1;
            }
