P_NO_ATTACK
***********


NAME
====

   P_NO_ATTACK "no_attack"


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

   <living/combat.h>


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

   Wenn ein NPC nicht angreifbar sein soll (weil er zum Beispiel in einer
   Gilde oder einer Quest Informationen vermittelt oder aehnlichen), sollte
   man diese Property auf einen Wert ungleich Null setzen. Sie wird immer
   abgefragt, wenn ermittelt wird, ob ein Lebewesen prinzipiell angreifbar
   ist. D.h. auch, dass nach Abfragen von P_NO_ATTACK _nicht_ immer ein
   Kampf gestartet wird und dass man dabei _nicht_ im Kampf sein muss!

   Gibt man hier einen String an (mit einem Satzzeichen und "\n" abge-
   schlossen), wird dieser bei direkten Angriffen ausgegeben. Bei anderen
   Datentypen wird eine Defaultmeldung ausgegeben. Die Defaultmeldung
   lautet: "<Name> laesst sich nicht angreifen!\n"

   Mit direkten Angriffen sind 'toete <name>' und Angriffszauber gemeint
   (bzw. alles, was living/life::Kill(), spellbook::TryAttackSpell(),
   spellbook::TryDefaultAttackSpell() und spellbook::FindEnemyVictim()
   aufruft).


ACHTUNG
=======

   1) Zum Thema QueryMethoden auf P_NO_ATTACK
      Grundsaetzlich legt man entweder eine Query-Methode auf P_NO_ATTACK:
         Set(P_NO_ATTACK, #'my_no_attack, F_QUERY_METHOD);
      oder definiert eine Funktion _query_no_attack() im NPC.

      Wie muss nun eine solche Funktion aussehen? Z.B.:



      int|string my_no_attack() {
        if (!objectp(this_player())) return 0;
        if (opfer==getuid(this_player()) || this_player()==this_object())
          return(0);
        return(1); //nicht angreifbar
      }

      Diese Funktion macht den NPC nun nur fuer den Spieler 'opfer' angreifbar.
      Stattdessen kann natuerlich auch jede andere Bedingung genutzt werden.

      Aber warum die zweite Bedingung, this_player()==this_object()?
      Warum sollte der NPC sich selber angreifen duerfen?

      Das liegt an folgenden 2 Dingen:

      1. Kaempfer kriegen bei eingeschaltetem Fokus Probleme, wenn man das
      nicht macht. Das liegt an folgendem: Wenn der NPC angreift, ruft er
      natuerlich Defend() im Spieler auf. Dieses schaut nach, ob der Spieler
      den Skill SK_MAGICAL_DEFENSE hat. Dieser ist bei Kaempfern das Parieren.
      Dieses schaut nach, ob der Fokus aktiv ist, wenn ja, wird dem
      ge'fokus'te Gegner besonders gut ausgewichen. Zu diesem Zweck wird die
      Liste der Feind im Raum erstellt mit PresentEnemies() abgerufen. Dieses
      fragt aber in allen (potentiellen) Gegnern P_NO_ATTACK ab und beendet
      den Kampf mit allen Gegnern, die nicht angreifbar sind. Bei dieser
      Abfrage ist jedoch TP==NPC, weil der ja angreift. Wenn er nun 1
      zurueckgibt, wird der Kampf an der Stelle beendet.

      2. Wenn der NPC den Spieler angreift, wird im Spieler InsertEnemy(NPC)
      aufgerufen. Auch diesem Fall findet die Abfrage von P_NO_ATTACK statt,
      da InsertEnemy() ja erstmal rausfinden muss, ob der Gegner angreifbar
      ist, bevor er in die Feindliste eingetragen wird. Da der NPC den
      Angriff beginnt, ist TP der NPC. Wenn die Query-Methode auf P_NO_ATTACK
      hier abbricht, wird der NPC nicht in die Feindliste des Spielers
      eingetragen. Dann bekaempft der NPC den Spieler, aber der Spieler nicht
      den NPC.


   2) P_NO_ATTACK des NPC wird z.B. beim Kampf eines Kaempfers mit dem NPC
      pro Kampfrunde um die 10mal abgerufen. Wenn der Kaempfer nur eine
      Attacke macht. Wenn er noch Sonderattacken machen, Spells ausfuehrt,
      etc. wird das noch mehr. D.h. was auch immer ihr in der Query-Methode
      im NPC macht:
      Es sollte schnell sein, jeder Tick an Rechenzeit zaehlt hier xfach!


LETZTE AENDERUNG
================

09.11.2015, Arathorn
