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