MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame^] | 1 | P_NO_ATTACK |
| 2 | |
| 3 | NAME: |
| 4 | P_NO_ATTACK "no_attack" |
| 5 | |
| 6 | DEFINIERT IN: |
| 7 | <living/combat.h> |
| 8 | |
| 9 | BESCHREIBUNG: |
| 10 | Wenn ein NPC nicht angreifbar sein soll (weil er zum Beispiel in einer |
| 11 | Gilde oder einer Quest Informationen vermittelt oder aehnlichen), sollte |
| 12 | man diese Property auf einen Wert ungleich Null setzen. Sie wird immer |
| 13 | abgefragt, wenn ermittelt wird, ob ein Lebewesen prinzipiell angreifbar |
| 14 | ist. D.h. auch, dass nach Abfragen von P_NO_ATTACK _nicht_ immer ein |
| 15 | Kampf gestartet wird und dass man dabei _nicht_ im Kampf sein muss! |
| 16 | |
| 17 | Gibt man hier einen String an (mit einem Satzzeichen und "\n" abge- |
| 18 | schlossen), wird dieser bei direkten Angriffen ausgegeben. Bei anderen |
| 19 | Datentypen wird eine Defaultmeldung ausgegeben. Die Defaultmeldung |
| 20 | lautet: "<Name> laesst sich nicht angreifen!\n" |
| 21 | |
| 22 | Mit direkten Angriffen sind 'toete <name>' und Angriffszauber gemeint |
| 23 | (bzw. alles, was living/life::Kill(), spellbook::TryAttackSpell(), |
| 24 | spellbook::TryDefaultAttackSpell() und spellbook::FindEnemyVictim() |
| 25 | aufruft). |
| 26 | |
| 27 | ACHTUNG: |
| 28 | |
| 29 | 1) Zum Thema QueryMethoden auf P_NO_ATTACK |
| 30 | Grundsaetzlich legt man entweder eine Query-Methode auf P_NO_ATTACK: |
| 31 | Set(P_NO_ATTACK, #'my_no_attack, F_QUERY_METHOD); |
| 32 | oder definiert eine Funktion _query_no_attack() im NPC. |
| 33 | |
| 34 | Wie muss nun eine solche Funktion aussehen? Z.B.: |
| 35 | |
| 36 | int|string my_no_attack() { |
| 37 | if (!objectp(this_player())) return 0; |
| 38 | if (opfer==getuid(this_player()) || this_player()==this_object()) |
| 39 | return(0); |
| 40 | return(1); //nicht angreifbar |
| 41 | } |
| 42 | |
| 43 | Diese Funktion macht den NPC nun nur fuer den Spieler 'opfer' angreifbar. |
| 44 | Stattdessen kann natuerlich auch jede andere Bedingung genutzt werden. |
| 45 | |
| 46 | Aber warum die zweite Bedingung, this_player()==this_object()? |
| 47 | Warum sollte der NPC sich selber angreifen duerfen? |
| 48 | |
| 49 | Das liegt an folgenden 2 Dingen: |
| 50 | |
| 51 | 1. Kaempfer kriegen bei eingeschaltetem Fokus Probleme, wenn man das |
| 52 | nicht macht. Das liegt an folgendem: Wenn der NPC angreift, ruft er |
| 53 | natuerlich Defend() im Spieler auf. Dieses schaut nach, ob der Spieler |
| 54 | den Skill SK_MAGICAL_DEFENSE hat. Dieser ist bei Kaempfern das Parieren. |
| 55 | Dieses schaut nach, ob der Fokus aktiv ist, wenn ja, wird dem |
| 56 | ge'fokus'te Gegner besonders gut ausgewichen. Zu diesem Zweck wird die |
| 57 | Liste der Feind im Raum erstellt mit PresentEnemies() abgerufen. Dieses |
| 58 | fragt aber in allen (potentiellen) Gegnern P_NO_ATTACK ab und beendet |
| 59 | den Kampf mit allen Gegnern, die nicht angreifbar sind. Bei dieser |
| 60 | Abfrage ist jedoch TP==NPC, weil der ja angreift. Wenn er nun 1 |
| 61 | zurueckgibt, wird der Kampf an der Stelle beendet. |
| 62 | |
| 63 | 2. Wenn der NPC den Spieler angreift, wird im Spieler InsertEnemy(NPC) |
| 64 | aufgerufen. Auch diesem Fall findet die Abfrage von P_NO_ATTACK statt, |
| 65 | da InsertEnemy() ja erstmal rausfinden muss, ob der Gegner angreifbar |
| 66 | ist, bevor er in die Feindliste eingetragen wird. Da der NPC den |
| 67 | Angriff beginnt, ist TP der NPC. Wenn die Query-Methode auf P_NO_ATTACK |
| 68 | hier abbricht, wird der NPC nicht in die Feindliste des Spielers |
| 69 | eingetragen. Dann bekaempft der NPC den Spieler, aber der Spieler nicht |
| 70 | den NPC. |
| 71 | |
| 72 | |
| 73 | 2) P_NO_ATTACK des NPC wird z.B. beim Kampf eines Kaempfers mit dem NPC |
| 74 | pro Kampfrunde um die 10mal abgerufen. Wenn der Kaempfer nur eine |
| 75 | Attacke macht. Wenn er noch Sonderattacken machen, Spells ausfuehrt, |
| 76 | etc. wird das noch mehr. D.h. was auch immer ihr in der Query-Methode |
| 77 | im NPC macht: |
| 78 | Es sollte schnell sein, jeder Tick an Rechenzeit zaehlt hier xfach! |
| 79 | |
| 80 | |
| 81 | LETZTE AENDERUNG: |
| 82 | 09.11.2015, Arathorn |