| |
| 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 |