| Zesstra | 953f997 | 2017-02-18 15:37:36 +0100 | [diff] [blame] | 1 | RegisterHelperObject() |
| 2 | ********************** |
| MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 3 | |
| MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 4 | |
| Zesstra | 953f997 | 2017-02-18 15:37:36 +0100 | [diff] [blame] | 5 | FUNKTION |
| 6 | ======== |
| MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 7 | |
| Zesstra | 953f997 | 2017-02-18 15:37:36 +0100 | [diff] [blame] | 8 | int RegisterHelperObject(object helper, int type, |
| 9 | string|closure callback); |
| MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 10 | |
| MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 11 | |
| Zesstra | 953f997 | 2017-02-18 15:37:36 +0100 | [diff] [blame] | 12 | DEFINIERT IN |
| 13 | ============ |
| MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 14 | |
| Zesstra | 953f997 | 2017-02-18 15:37:36 +0100 | [diff] [blame] | 15 | /std/living/helpers.c |
| MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 16 | |
| MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 17 | |
| Zesstra | 953f997 | 2017-02-18 15:37:36 +0100 | [diff] [blame] | 18 | ARGUMENTE |
| 19 | ========= |
| MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 20 | |
| Zesstra | 953f997 | 2017-02-18 15:37:36 +0100 | [diff] [blame] | 21 | object helper |
| 22 | Das Objekt, das bei einem Lebewesen als Hilfsobjekt registriert |
| 23 | werden soll. Das Objekt muss sich dazu nicht im Inventar des |
| 24 | Lebewesens befinden. |
| 25 | int type |
| 26 | Helfertyp, einer der in /sys/living/helpers.h definierten Typen: |
| 27 | - HELPER_TYPE_AERIAL fuer die Flug-/Segelunterstuetzung |
| 28 | - HELPER_TYPE_AQUATIC fuer Tauchunterstuetzung |
| 29 | string|closure callback |
| 30 | Closure oder Funktionsname als String; dies ist die Funktion, die im |
| 31 | Objekt helper gerufen wird, um abzufragen, ob es sich aktuell fuer |
| 32 | zustaendig erklaert oder nicht. |
| 33 | |
| 34 | |
| 35 | BESCHREIBUNG |
| 36 | ============ |
| 37 | |
| 38 | Das Objekt "helper" wird als Hilfsobjekt fuer bestimmte Aktivitaeten wie |
| 39 | zum Beispiel Fliegen oder Tauchen registriert. |
| 40 | |
| 41 | |
| 42 | |
| 43 | Die als Callback uebergebene Funktion wird bei der Abfrage der |
| 44 | P_*_HELPERS-Properties (siehe unten) aufgerufen und deren |
| 45 | Rueckgabewert in der Property vermerkt. |
| 46 | |
| 47 | |
| 48 | |
| 49 | Der Rueckgabewert der Callback-Methode muss im Wertebereich |
| 50 | 0..10000 liegen, wobei ein Wert von 0 bedeutet, dass das Hilfsobjekt |
| 51 | sich gerade nicht zustaendig fuehlt. Bei den Werten >0 ist es dem |
| 52 | abfragenden Objekt ueberlassen, wie es diese Daten bewertet. |
| 53 | |
| 54 | Die Funktion muss existieren und public sein, d.h. von aussen gerufen |
| 55 | werden koennen. |
| 56 | |
| 57 | |
| 58 | |
| 59 | Die Funktion bekommt das Spielerobjekt und das abfragende Objekt als |
| 60 | Parameter uebergeben. |
| 61 | |
| 62 | |
| 63 | HINWEIS |
| 64 | ======= |
| 65 | |
| 66 | Es ist ein Unterschied, ob sich ein Objekt via UnregisterHelperObject() |
| 67 | als Helfer austraegt, oder ob der Aufruf der Callback-Funktion eine |
| 68 | 0 zurueckgibt. Im letzteren Fall ist das Objekt nach wie vor |
| 69 | registriert und kann trotzdem vom abfragenden Objekt als |
| 70 | funktionsfaehig angesehen werden. |
| 71 | |
| 72 | |
| 73 | RUECKGABEWERTE |
| 74 | ============== |
| 75 | |
| 76 | 1 Objekt wurde erfolgreich registriert (HELPER_SUCCESS) |
| 77 | -1 angegebenes Hilfsobjekt existiert nicht (HELPER_NO_CALLBACK_OBJECT) |
| 78 | -2 angegebenes Hilfsobjekt ist bereits fuer diese Art der |
| 79 | Unterstuetzung registriert (HELPER_ALREADY_LISTED) |
| 80 | |
| 81 | |
| 82 | BEISPIELE |
| 83 | ========= |
| 84 | |
| 85 | a) Eine luftgefuellte Blase will sich als Tauch-Helfer am Spieler |
| 86 | anmelden und ist zustaendig, solange sich noch Luft in ihr befindet: |
| 87 | |
| 88 | int luft = 5; // globale Variable z.B. fuer Luftinhalt von 5 Atemzuegen |
| 89 | |
| 90 | // Registrierung im Spielerobjekt |
| 91 | if ( TP->RegisterHelperObject(ME, HELPER_TYPE_AQUATIC, |
| 92 | "DivingCallback") == HELPER_SUCCESS ) { |
| 93 | tell_object(TP, "Du kannst jetzt mit Hilfe der Luftblase unter Wasser " |
| 94 | "atmen.\n"); |
| 95 | } |
| 96 | |
| 97 | // hier koennen natuerlich auch noch komplexere Dinge ablaufen, z.B. |
| 98 | // wenn ein Wert zurueckgegeben werden soll, der nicht nur 0 oder 1 ist. |
| 99 | public int DivingCallback(object player, object caller) { |
| 100 | return (environment(ME)==player && luft>0); |
| 101 | } |
| 102 | |
| 103 | b) Ein Spieler befindet sich in einem Raum mit einem steilen Abhang, den |
| 104 | man hinunterspringen kann. Dies geht aber nur dann gefahrlos, wenn es |
| 105 | Hilfsobjekte gibt, die den (Segel)flug erlauben: |
| 106 | |
| 107 | // cmd_springen() sei die Funktion, die bei der Eingabe des Befehls durch |
| 108 | // den Spieler aufgerufen wird. |
| 109 | static int cmd_springen(string str) { |
| 110 | [...] |
| 111 | // Property abfragen |
| 112 | mapping helpers = TP->QueryProp(P_AERIAL_HELPERS); |
| 113 | // Liste der Werte fuer die einzelnen Unterstuetzungsobjekte ermitteln |
| 114 | int *values = m_values(helpers,0); |
| 115 | // Spieler schonmal runterbewegen, die Folgen seines Handelns spuert |
| 116 | // er dann, wenn er unten angekommen ist. |
| 117 | TP->move(zielraum, M_GO|M_SILENT); |
| 118 | // "helpers" ist immer ein Mapping, das pruefen wir nicht extra. |
| 119 | // Wenn die Liste der Objekte noch mindestens ein Element enthaelt, |
| 120 | // nachdem alle unzustaendigen Hilfsobjekte (Rueckgabewert der |
| 121 | // Callback-Funktion == 0) rausgerechnet wurden, existiert mindestens |
| 122 | // ein geeignetes Hilfsobjekt. |
| 123 | if ( sizeof(values-({0})) ) { |
| 124 | tell_object(TP, "Sanft segelst Du den Hang hinab.\n"); |
| MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 125 | } |
| Zesstra | 953f997 | 2017-02-18 15:37:36 +0100 | [diff] [blame] | 126 | else { |
| 127 | tell_object(TP, BS("Todesmutig springst Du den Hang hinab und " |
| 128 | "schlaegst hart unten auf. Du haettest vielleicht daran denken " |
| 129 | "sollen, Dir geeignete Hilfsmittel fuer so eine Aktion zu " |
| 130 | "besorgen."); |
| 131 | TP->Defend(800, ({DT_BLUDGEON}), ([SP_NO_ACTIVE_DEFENSE:1]), ME); |
| MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 132 | } |
| Zesstra | 953f997 | 2017-02-18 15:37:36 +0100 | [diff] [blame] | 133 | return 1; |
| 134 | } |
| MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 135 | |
| MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 136 | |
| Zesstra | 953f997 | 2017-02-18 15:37:36 +0100 | [diff] [blame] | 137 | SIEHE AUCH |
| 138 | ========== |
| MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 139 | |
| Zesstra | bfab6ac | 2018-08-29 22:36:57 +0200 | [diff] [blame] | 140 | Funktionen: UnregisterHelperObject(), GetHelperObject() |
| Zesstra | 953f997 | 2017-02-18 15:37:36 +0100 | [diff] [blame] | 141 | Properties: P_HELPER_OBJECTS, P_AERIAL_HELPERS, P_AQUATIC_HELPERS |
| 142 | Sonstiges: /sys/living/helpers.h |
| MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 143 | |
| 144 | 05.02.2015 Arathorn |