EVENT-TYPEN
ET_GET - 'Nimm' Event
ET_PUT - 'Lege/Stecke' (in/auf etwas) Event
ET_GIVE - 'Gib/Schenke/Ueberreiche' Event
ET_DROP - 'Wegleg/Wegwerf' Event
BEDEUTUNG
Put&Get-Events fuer Lebewesen. Aufgrund der Aehnlichkeit zu ET_GET
erklaert diese manpage auch ET_PUT, ET_GIVE, ET_DROP.
DEFAULT HANDLER
/global/handler/put_and_get.c
EVENT DEFINES
/sys/events.h
/sys/moving.h
EVENT DATEN
Das Event-Mapping enthaelt IMMER folgende Daten:
Key | Inhalt
---------------+----------------------------------------------------
Eintraege, die automatisch gesetzt werden (NICHT VERAENDERN!)
E_SENDER | (object) Event-Erzeuger. (Meist ein Lebwesen)
E_DESTINATIONS | (array) Objekte, an die der Event gesandt wird. (Im
| Normalfall das aeusserste Environment, da put&get
| in 'Nachbarraeume' wohl nicht moeglich sein sollte)
E_COMMAND | (string) Das eingegebene Kommando. (das Verb)
Moving-Daten, die veraendert werden duerfen:
E_MOVE_OBJ | (object) Die zu bewegende Sache.
E_ACTOR | Das agierende Lebewesen. Also das Lebwesen, was die
| Bewegung des Objekts bewirkt. Also z.B. der Spieler
| der etwas weglegt usw. E_ACTOR kann benutzt werden,
| um Meldungen an den Spieler auszugeben, wenn er etwa
| tut. (Vorausgesetzt es ist richtig gesetzt)
E_MOVE_SOURCE | (object) Die Umgebung des Objekts vor der Bewegung.
E_MOVE_DEST | (object) Dahin soll die Sache gelegt/gegeben/ge-
| nommen werden.
E_MOVE_METHOD | (int) Wenn gesetzt, zusaetzliche Move-Methoden.
E_MOVE_RVALUE | (int) Enthaelt den Returnwert des move()-Aufrufs
| mit der Methode M_NOEVENT.
Nach oder waehrend der Abarbeitung EVENTUELL enthalten:
E_HANDLED | (int) Wenn gesetzt, wurde der Event ausgefuehrt.
| Der Wert entspricht dem Returnwert von obj->move().
E_HANDLER | (object) Der ausfuehrende Handler.
E_CANCELLED | (mixed) Wenn gesetzt, wurde der Event abgebrochen.
| Der Inhalt kann beliebig sein.
E_CANCELLER | (object) Das abbrechende Object.
E_MOVE_RVALUE | (int) Enthaelt den Returnwert des move()-Aufrufs
| mit der Methode M_NOEVENT. Enthaelt nur einen Wert,
| wenn der Event nicht abgebrochen wurde!
EVENT-LAUSCHER
Siehe allgemeine Syntaxen in event_listeners(WL).
EVENT-SENDER
Siehe allgemeine Syntaxen in event_senders(WL). Gesendet werden
muessen mindestens:
E_MOVE_OBJ, E_ACTOR (soll nur weggelassen werden, wenn ein Objekt
wirklich 'aus dem Nichts' kommen soll), E_MOVE_SOURCE, E_MOVE_DEST
Automatisch werden immer gesetzt:
E_SENDER, E_DESTINATION und E_COMMAND
Ziel des Events sollte immer all_environment(this_object())[<1]
sein, oder falls es das wirklich nicht gibt (???) this_object().
BESCHREIBUNG
Die Put&Get-Events werden normalerweise im move() des zu bewegenden
Objekts erzeugt, wenn sie mit einer Movemethode (M_GET, M_DROP,
M_PUT, M_GIVE) und NICHT mit M_NOEVENT und/oder M_NOCHECK bewegt
werden.
Der Event geht mit Prioritaet EPRIO_DEF_HANDLE (0) an den Default-
Handler (siehe oben). Dieser macht dann das eigentliche Geben oder
Nehmen usw. indem er wiederum das move() des Objekts aufruft mit
M_NOEVENT, um Rekursionen zu vermeiden. Der Returnwert dieses
move() wird in E_MOVE_RVALUE gespeichert.
Objekte die mit hoeherer Prioritaet lauschen (z.B.: EPRIO_MODIFY
(700) bzw. EPRIO_CANCEL (400)), koennen VOR dem Bewegen Modifizie-
rungen vornehmen (Lostrommel *grins*) oder den Event ganz abbrechen
(Falle). Wird der Event abgebrochen, bevor der Handler ihn
abarbeiten kann, ist E_MOVE_RVALUE nicht gesetzt!
Objekte, die mit kleinerer Prioritaet (z.B.: EPRIO_REACT (-300))
lauschen, koennen NACH dem Bewegen entsprechend auf die Bewegung
reagieren. Abbrechen oder Modifizieren der Daten ist dann aber
VERBOTEN.
VERALTETE FUNKTIONALITAETEN
Die Put&Get-Events sollen, wenn immer es geht, statt folgendem ver-
wendet werden:
1. Die MOVE-HOOKS.
2. Aufruf von LeaveMe().
3. Aufruf von PreventInsert().
BEISPIEL
Will man in einem Raum einem GET-Event lauschen, um dem Spieler mit
10% auf die Finger zu klopfen, wenn er eine Fackel nimmt, sieht das
wie folgt aus:
void finger_klopfen(mapping data, string type); // Prototyp
void create() {
...
// fuer das reine Abbrechen des Events:
listen_event(ET_GET, EPRIO_CANCEL, #'finger_klopfen);
// wenn wir der Abbrecher waren, wollen wir noch was tun:
listen_event(ET_GET, EPRIO_C_HANDLE, #'finger_klopfen);
...
}
void finger_klopfen(mapping data, string type) {
object opfer, fackel;
if(!mappingp(data) || !living(opfer=data[E_ACTOR]) ||
!objectp(fackel=data[E_MOVE_OBJ] || !fackel->id("fackel")))
return;
switch (prio)
{
case EPRIO_CANCEL: // nur abbrechen
if(random(100)>9) return; // nur in 10% der Faelle
cancel_event();
break;
// Erst wenn wir sicher sind, dass wir auch wirklich der
// Abbrecher waren (koennten ja noch andere Objekte
// versuchen), geben wir den Text aus und verbrennen
// den Spieler ;-)
// (Den Event mit EPRIO_C_HANDLE bekommt im Gegensatz zum
// EPRIO_C_REACT _nur_ das abbrechende Objekt)
case EPRIO_C_HANDLE:
tell_object(opfer, "Du verbrennst Dir Deine Fingerchen.\n");
opfer->reduce_hit_point(10); // Weh tun muss es B->
}
return;
}
SIEHE AUCH
move(L), events(WL), event_types(WL), event_prioritaeten(WL),
listen_event(S)
|