blob: fe394ae14cb291661e0bc1c966d0bcdf1ab514a3 [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001// MorgenGrauen MUDlib
2/** \file /std/player/pklog.c
3* Funktion zur Detektion und Loggen von Angriffen von Spielern auf Spieler.
4* \author Zesstra
5* \date 12.08.2008
6* \version $Id$
7*/
8/* Changelog:
9*/
10#pragma strong_types
11#pragma save_types
12#pragma no_clone
13#pragma no_shadow
MG Mud User88f12472016-06-24 23:31:02 +020014#pragma range_check
15
16#include <defines.h>
17#include <commands.h>
18#include <wizlevels.h>
19#include <player/base.h>
20
21#define RNAME(x) capitalize(getuid(x))
22
23/** Ist victim in einer Arena oder Schattenwelt?
24 */
25nomask int CheckArenaFight(object victim) {
26 return (object_name(environment(victim))[0..14]=="/d/schattenwelt");
27}
28
29nomask protected int CheckPlayerAttack(object attacker, object victim,
30 string angriffsmsg)
31{
32 // falls mal jemand ne Closure auf diese Funktion in die Finger bekommt und
33 // protected umgeht.
34 if (extern_call())
35 raise_error(sprintf("Extern Call to CheckPlayerAttack in %O!\n",ME));
36
37 // nur Spieler sind interessant.
38 if ( query_once_interactive(attacker) && query_once_interactive(victim)
39 && !( IS_LEARNER(attacker) && IS_LEARNER(victim) ) ) {
40 string filemessage, wizshout;
41 int arena;
42
43 // Arena- oder Schattenweltkampf?
44 arena=CheckArenaFight(attacker);
45
46 wizshout = sprintf("\n**** %s greift %s an. (%s) ***\n",
47 RNAME(attacker), RNAME(victim), object_name(ME));
48 filemessage = sprintf("\n[%s] %s greift %s an. (%s) %s %s\n",
49 strftime("%d%m%y-%H:%M:%S",time()), RNAME(attacker),
50 RNAME(victim), object_name(this_object()),
51 (arena ? "(ARENA)" : ""),
52 (victim->QueryProp(P_TESTPLAYER) ? "(Testspieler)" : ""));
53
54 // Angriffsmsg vom Aufrufer anhaengen.
55 if (stringp(angriffsmsg) && sizeof(angriffsmsg)) {
56 wizshout += angriffsmsg;
57 filemessage += angriffsmsg;
58 }
59 // ggf. echten TI anhaengen oder warnen, falls keiner existiert.
60 if ( this_interactive() != attacker ) {
61 if ( this_interactive() ) {
62 wizshout += "ACHTUNG: TI = " + getuid(this_interactive())
63 +"\n";
64 filemessage += "ACHTUNG: TI = "+getuid(this_interactive())
65 +"\n";
66 }
67 else {
68 filemessage += " ACHTUNG: Kein TI vorhanden!\n";
69 wizshout += " ACHTUNG: Kein TI vorhanden!\n";
70 }
71 }
72 // caller_stack() mitloggen (aber nicht Magier vollscrollen).
73 filemessage += "Callerstack: " + CountUp(map(caller_stack(1),
74 function string (object po) {return to_string(po);}),
75 ", ", ", ") + "\n";
76 // Commandstack anhaengen
77 mixed cstack = command_stack();
78 filemessage += "Commandstack: " + CountUp(map(cstack,
79 function string (mixed arr) {
80 return sprintf("({Original-TP: %O, TP: %O, Kommando: %s})",
81 arr[CMD_ORIGIN],arr[CMD_PLAYER],arr[CMD_TEXT] || "");
82 },", ",", ")) + "\n";
83 // fuer Magier originaeren Befehl anhaengen:
84 if (sizeof(cstack))
85 wizshout += sprintf("Kommando: %s\n",
86 cstack[0][CMD_TEXT] || "<unbekannt>");
87
88 wizshout += "\n";
89
90 // erstmal loggen
91 if ( arena )
92 log_file("ATTACKS_ARENA", filemessage);
93 else
94 log_file("ATTACKS", filemessage);
95
96 // dann Magiern bescheidgeben
97 if ( !arena && !(victim->QueryProp(P_TESTPLAYER)) ) {
98 foreach(object wiz: users()) {
99 if ( IS_LORD(wiz) || IS_DEPUTY(wiz) )
100 tell_object(wiz, wizshout);
101 }
102 }
103 return 1; // Spieler-Spielerkampf
104 }
105 return 0; // kein Spieler-Spielerkampf
106}
107