blob: 685b1ed42d0e2f1111b08f578f34063f617b8b41 [file] [log] [blame]
// /p/service/mupfel/getkill.c
// Ermittelt, wenn in 'die' aufgerufen, den Killer, auch wenn
// mit Bumerang, Kampfdaemon o.ae. Hilfsmitteln getoetet wurde
// 22-07-1996 - Mupfel@MorgenGrauen -
// Jetzt wird auch ein Beistand (Schutzengel, Phoenix, etc) erkannt
// 06-07-1997 - Mupfel@MorgenGrauen -
// Args der Pflanzenkrieger hat ja auch die id "Beistand" ;(
// 09-01-2001 - Mupfel@MorgenGrauen -
// Immer neue Retrowaffen... jetzt wird auch Tsunamis Toga erkannt
// 04-01-2005 - Mupfel@MorgenGrauen -
// 21.11.2006 - Zesstra
// Der Bumerang ist umgezogen. Pfad aktualisiert
// 13.10.2013 - Zesstra
// Einmal auf Basis von P_KILLER neugebaut.
// 16.10.2013 - Zesstra
// Man muss es jetzt nicht mehr erben, sondern kann auch per Callother
// abfragen. Dann wird der Killer vom previous_object() ermittelt.
// 12.06.2016 - Mupfel
// Zesstra war fleissig und hat diese Kruecke ueberfluessig gemacht.
// Siehe Manpage zu "get_killing_player"
#define NEED_PROTOTYPES
#include <thing/properties.h>
#undef NEED_PROTOTYPES
#include <thing/language.h>
#include <properties.h>
public mixed get_killer_data(int extern)
{
object killer;
// wenn von ausser gerufen und ein PO existiert, fragen wir P_KILLER darin
// ab. Dann muss man dieses Ding hier nicht unbedingt erben.
if ((extern || extern_call()) && previous_object())
killer=previous_object()->QueryProp(P_KILLER);
else
killer=QueryProp(P_KILLER);
// Eigentlich tritt dieser Fall nur bei Vergiftungen auf.
if (!objectp(killer))
return ({0,"<unbekannt>"});
// Spieler selber? Ist ja einfach.
if (query_once_interactive(killer))
return ({killer,killer->Name(WER)});
// Helfer-NPC?
mixed helperdata = killer->QueryProp(P_HELPER_NPC);
if (pointerp(helperdata) && objectp(helperdata[0]))
return ({helperdata[0], helperdata[0]->Name(WER) + " mit Helfer-NPC"});
// Einige Gilden-NPC verweisen auf ihren Spieler. Diese wird natuerlich nur
// abgefragt, wenn die Gilde noch keinen Helfer-NPC registrieren.
else if (killer->id("\nchaos_gilden_daemon"))
{
killer=find_player(killer->QueryProp("chaos_daem_beschwoerer"));
return ({killer, killer->Name(WER)+" (mit Kampfdaemon)"});
}
else if (killer->id("Beistand") && !killer->id("P-KRIEGER"))
{
killer = killer->QueryProp("klerus_owner");
return ({killer, killer->Name(WER)+" (mit Beistand)"});
}
// Einige toetende Objekte gesondert behandeln und Spieler als Killer
// liefern.
switch(object_name(blueprint(killer)))
{
case "/d/ebene/obj/gring":
killer = killer->QueryProp(P_WORN);
return ({killer, killer->name(RAW)+" (mit Goblinring)"});
case "/d/unterwelt/wurzel/dorf/shabz":
killer = killer->QueryProp(P_WORN);
return ({killer, killer->name(RAW)+" (mit Abzeichen)"});
case "/d/wueste/tsunami/schule/rue/hex_toga2":
killer = killer->QueryProp(P_WORN);
return ({killer, killer->name(RAW)+" (mit Toga)"});
case "/p/seher/laden/obj/bumerang":
killer = killer->query_werfer();
return ({killer, killer->name(RAW)+" (mit Bumerang)"});
}
// killer ist jedenfalls kein Spieler hier.
return ({killer, killer->name(RAW)});
}
// Name des Killers
public string get_killer()
{
return get_killer_data(extern_call())[1];
}
// Objekt des Killers
public object get_killer_object()
{
return get_killer_data(extern_call())[0];
}