
InformDefend()
**************


FUNKTION
========

   void InformDefend(object enemy);


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

   /std/living/combat.c


ARGUMENTE
=========

   enemy
      Der Feind, der ein zu verteidigendes Lebewesen angegriffen hat.


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

   Es ist moeglich, dass Objekte ueber Angriffe auf Lebewesen
   informiert werden, sofern diese Objekte bei dem angegriffenen
   Lebewesen mittels AddDefender() angemeldet wurden und sich der
   selben Umgebung befinden. Zumeist wird es sich bei den Objekten
   natuerlich ebenfalls um andere Lebewesen handeln, die das
   Lebewesen, bei dem sie angemeldet sind, verteidigen sollen. Bei
   einem Angriff auf das Lebewesen werden alle Objekte per Aufruf von
   InformDefend() darueber informiert, wobei der Angreifer als
   Parameter uebergeben wird. Standardmaessig ist diese Funktion in
   Lebewesen bereits definiert, wobei der Skill SK_INFORM_DEFEND,
   sofern vorhanden, aufgerufen wird.


BEISPIEL
========

   Sehr beliebt sind in Gilden NPCs, die den Beschwoerer begleiten und
   verteidigen, z.B. beschworene Daemonen:

   inherit "/std/npc";

   #include <properties.h>

   object owner;

   protected void create()
   {
     ::create();
     SetProp(P_NAME,"Daemon");
     ...
   }

   // nach Clonen des Daemons folgende Funktion mit Beschwoerer als
   // Parameter aufrufen

   void Identify(object caster)
   {
     if(!objectp(caster))
       call_out(#'remove,0);
     owner=caster;
     owner->AddDefender(this_object());
   }

   // folgende Funktion wird automatisch aufgerufen, wenn der
   // Beschwoerer angegriffen wird

   public void InformDefend(object enemy)
   {
     if(!IsEnemy(enemy)&&enemy!=owner)
       Kill(enemy);
   }

   Soll der Daemon sich auch in ein Team einordnen, in welchem sich der
   Beschwoerer eventuell befindet, so ist zusaetzlich AssocMember() in
   diesem Beschwoerer aufzurufen, wobei der Daemon als Parameter
   uebergeben wird.


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

   AddDefender(), RemoveDefender(), QueryDefenders(),
   QueryPresentDefenders(), QueryNearDefenders(), DefendOther(),
   *../props/P_DEFENDER*, /std/living/combat.c

Letzte Aenderung: 28.10.2022, Bugfix
