RegisterHelperNPC()
*******************


FUNKTION
========

   public int RegisterHelperNPC(object npc, int flags);


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

   /std/player/combat.c
   /sys/living/combat.h


ARGUMENTE
=========

   object npc
     Objekt des helfenden NPC, der angemeldet werden soll.

   int flags
     ver-oder-te Konstanten, die die Art des Helfer-NPC beschreiben (s.u.)


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

   Mit dieser Funktion wird ein einem Spieler helfender NPC im Spieler
   angemeldet. Hierdurch kann spaeter herausgefunden werden, welche NPC
   einem Spieler helfen und ggf. den von diesen verursachten Schaden im
   Kampf dem Spieler zuzurechnen.

   Die Flags sind eine der folgenden Konstanten oder eine beliebige durch
   ver-oder-ung gebildete Kombination.

   Momentan gibt es 2 Klassen von Helfer-NPC:
   + GUILD_HELPER: der Helfer-NPC ist ein Gilden-NPC
   + MISC_HELPER:  der Helfer-NPC ist irgendein NPC, der nicht zu einer Gilde
                   gehoert.

   Zusaetzlich zu den Klassen gibt es noch weitere Flags, die etwas ueber
   den Helfer-NPC sagen:

   + EXCLUSIVE_HELPER: dieser Helfer-NPC duldet keinen weiteren NPC der
                       gleichen Klasse.
   + ACTIVE_HELPER: ist dieses Flag gesetzt, ist der NPC mehr als nur reiner
                    Schlagfaenger.

   Wird EXCLUSIVE_HELPER gesetzt und es ist in der gleichen Klasse schon ein
   NPC angemeldet, schlaegt die Registrierung fehl.
   Ist in der gleichen Klasse bereits ein NPC mit EXCLUSIVE_HELPER
   angemeldet, schlaegt die Registierung ebenfalls fehl, auch wenn der neue
   NPC kein EXCLUSIVE_HELPER setzt.


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

   1, wenn die Registrierung erfolgreich war.
   0 sonst. In diesem Fall darf der NPC dem Spieler NICHT helfen, weder
     passiv (Schlagfaenger), noch aktiv.


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

   Diese Funktion setzt bei der Erfolg die Property P_HELPER_NPC in <npc>
   auf passende Werte.
   Bitte auf gar keinen Fall die numerischen Werte der Konstanten fuer
   <flags> nutzen, diese koennen sich jederzeit aendern.


BEISPIELE
=========

   1. Ein nicht-exklusiver Gilden-NPC, der dem Spieler folgt.
   if (spieler->RegisterHelperNPC(this_object(), GUILD_HELPER) == 1) {
     move(environment(spieler), M_GO);
     spieler->AddPursuer(this_object());
     // meldung ausgebene...
   }

   2a. Ein exklusiver Nicht-Gilden-NPC
   if (spieler->RegisterHelperNPC(this_object(),
                                  MISC_HELPER|EXCLUSIVE_HELPER) == 1) {
     move(environment(spieler), M_GO);
   }

   2b. Ein nicht-exklusiver Nicht-Gilde-NPC, der nach 2a. kommt.
   if (spieler->RegisterHelperNPC(this_object(), MISC_HELPER) == 1) {
     // ... wenn der NPC aus 2a noch existiert, trifft dies hier nie zu.
   }

   3. Ein exklusiver NPC, der weitere Gilden- und sonstige NPC ausschliesst
      (Solche Kombination bitte mit der Gilden-Balance abstimmen.)
   if (spieler->RegisterHelperNPC(this_object(),
                          MISC_HELPER|GUILD_HELPER|EXCLUSIVE_HELPER) == 1) {
     move(environment(spieler), M_GO);
   }

   4. Die Registrierung ohne Klasse schlaegt fehl, z.B.:
     spieler->RegisterHelperNPC(this_object(), 0);
     spieler->RegisterHelperNPC(this_object(), EXCLUSIVE_HELPER);


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

   UnregisterHelperNPC()
   P_HELPER_NPC
