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