blob: aa1cb66aa51e6c833b94a9e584e23f38a37ede6f [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001
2FUNKTION:
3 int RegisterHelperObject(object helper, int type,
4 string|closure callback);
5
6DEFINIERT IN:
7 /std/living/helpers.c
8
9ARGUMENTE:
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
23BESCHREIBUNG:
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
42HINWEIS:
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
49RUECKGABEWERTE:
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
55BEISPIELE:
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
107SIEHE AUCH:
108 Funktionen: UnregisterHelperObject()
109 Properties: P_HELPER_OBJECTS, P_AERIAL_HELPERS, P_AQUATIC_HELPERS
110 Sonstiges: /sys/living/helpers.h
111
11205.02.2015 Arathorn
113