FUNKTION:
int CheckIgnore(string uid, string verb, object act_o, string desc)
IMPLEMENTIERT:
/std/player/comm.c
ARGUMENTE:
uid : Uid oder Uid-Aequivalent des Akteurs.
verb : Standardform des Verbs / Name der Aktion.
act_o : Objekt des Akteurs.
desc : Zusaetzliche generelle Beschreibung der Aktion.
Alle Argumente sind optional.
BESCHREIBUNG:
Mit dieser Funktion kann man testen, ob ein Spieler eine Aktion
ignorieren moechte. Hierbei wird sein P_IGNORE und P_EARMUFFS
beachtet.
Die Eintraege in P_IGNORE koennen folgende Syntax haben:
"UID", "UID.ACTION", "UID.DESC.ACTION", "DESC.ACTION",
"ACTION", "UID.DESC", "UID.ACTION.DESC", "ACTION.DESC",
"DESC"
Ist ein Akteur-Objekt uebergeben worden, so wird dessen P_LEVEL
und wiz_level relativ zu P_EARMUFFS des Spielers geprueft.
BEMERKUNG:
Vorsicht ist geboten, wenn man die Uid eines Lebewesens bestimmen
moechte. Bei Spielern geht dies einfach mit getuid(E), NPCs haben
hier jedoch keinen sinnvollen Wert (sondern zb "d:wunderland").
Hier bietet sich an, auf etwas mehr oder weniger eindeutiges wie
seinen Namen zurueckzugreifen:
if (interactive(act)) uid = getuid(act);
else {
uid = act->name(RAW);
if (uid) uid = lower_case(uid);
}
Dies liefert bei manchen NPCs zwar komische Werte (zB "Prem Kokus"),
das muessen die Spieler dann eben wissen.
Wenn man 'uid' nicht angegeben hat, jedoch ein 'act_o', so wird
auf genau diese Art die Uid bestimmt. Dies ist nicht immer das,
was man haben will (dann muss man 'uid' explizit angeben), jedoch
meistens.
RÜCKGABEWERT:
0 Ok (kein ignorieren).
-1 Der Akteur (besser die Uid) wird komplett ignoriert.
-2 Die Aktion wird ignoriert (verb oder desc).
-3 Ignorieren wegen P_EARMUFFS.
-4 Ignoriert den Befehls des Akteurs
BEISPIEL:
uid = getuid(PL);
i = vic->CheckIgnore(uid, "knuddel", PL, "remote");
switch (i) {
-1: ret = " ignoriert Dich"; break;
-2: ret = " ignoriert Knuddeln"; break;
-3: ret = " ignoriert gerade alles"; break;
-4: ret = " ignoriert Dein Knuddeln"; break;
default: /* nix tun */ break;
}
oder auch:
i = vic->CheckIgnore(0, "rufe", 0, "anniquest");
Normalerweise will man danach eine Ausgabe erzeugen. Hier sollte
man wie folgt vorgehen:
foreach (spieler : users()) {
if (spieler->CheckIgnore(0, "rufe", 0, "anniquest") < 0) continue;
spieler->Message(text, 0, 0, 0, C_KOB_IGN);
}
Dies ermoeglicht dem Spieler den Ruf mit folgenden Werten zu
ignorieren:
- ignoriere rufe
- ignoriere anniquest
- ignoriere anniquest.rufe
- ignoriere rufe.anniquest
Etwas aehnliches, aber subtil anders bewirkt:
foreach (spieler : users()) {
spieler->Message(text, "rufe", 0, "anniquest",
C_KOB_IGN | C_MSG_IGNCHK);
}
Das 2. Beispiel versucht die Uid des Rufers zu bestimmen (also
z.B. Anni) und testet weiterhin, ob der Spieler vielleicht den
ausloesenden Spieler (z.B. den, der die Quest loeste) komplett
ignoriert und unterdrueckt die Ausgabe dann auch:
- ignoriere anni
- ignoriere anni.rufe
- ignoriere anni.anniquest
- ignoriere anni.anniquest.rufe
- ignoriere anni.rufe.anniquest
- ignoriere spieler
- ignoriere spieler.anniquest
SIEHE AUCH:
P_IGNORE, P_EARMUFFS, Message(L)
|