MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 1 | // MorgenGrauen MUDlib |
| 2 | // |
| 3 | // players.c |
| 4 | // |
| 5 | // $Id: players.c 9551 2016-04-20 22:54:58Z Arathorn $ |
| 6 | #pragma strict_types |
| 7 | #pragma save_types |
| 8 | #pragma range_check |
| 9 | #pragma no_clone |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 10 | |
| 11 | #include <wizlevels.h> |
| 12 | #include <ansi.h> |
| 13 | #include <logging.h> |
| 14 | #define NEED_PROTOTYPES |
| 15 | #include <magier.h> |
| 16 | #include <thing/properties.h> |
| 17 | #include <thing/description.h> |
| 18 | #include <living/comm.h> |
| 19 | #include <player.h> |
| 20 | #undef NEED_PROTOTYPES |
| 21 | #include <properties.h> |
| 22 | #include <moving.h> |
| 23 | |
| 24 | static mixed _query_localcmds() |
| 25 | { |
| 26 | return ({({"zap","_zap",0,WIZARD_LVL}), |
| 27 | ({"verfolge","_verfolge",0,LEARNER_LVL}), |
| 28 | ({"trans","_trans",0,LEARNER_LVL}), |
| 29 | ({"peace","_frieden",0,LEARNER_LVL}), |
| 30 | ({"frieden","_frieden",0,LEARNER_LVL}), |
| 31 | ({"pwho","_pwho",0,WIZARD_LVL}), |
| 32 | ({"zwinge","_zwinge",0,WIZARD_LVL}), |
| 33 | ({"heal","_heile",0,WIZARD_LVL}), |
| 34 | ({"heil","_heile",1,WIZARD_LVL}), |
| 35 | ({"people","_people",0,LEARNER_LVL}), |
| 36 | ({"spieler","_spieler",0,WIZARD_LVL})}); |
| 37 | } |
| 38 | |
| 39 | // ####### |
| 40 | //################################ ZAP ################################## |
| 41 | // ####### |
| 42 | |
| 43 | private string _zap_message(string str, object obj) |
| 44 | { |
Vanion | bda305b | 2020-03-10 20:53:16 +0100 | [diff] [blame] | 45 | str=regreplace(str,"@@wer@@",({string})obj->name(WER,2),1); |
| 46 | str=regreplace(str,"@@wessen@@",({string})obj->name(WESSEN,2),1); |
| 47 | str=regreplace(str,"@@wem@@",({string})obj->name(WEM,2),1); |
| 48 | str=regreplace(str,"@@wen@@",({string})obj->name(WEN,2),1); |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 49 | str=regreplace(str,"@@ich@@",name(WER,2),1); |
| 50 | return capitalize(str); |
| 51 | } |
| 52 | |
| 53 | static int _zap(string str) |
| 54 | { |
| 55 | object opfer; |
| 56 | string *message, dummy; |
| 57 | int spieler; |
| 58 | |
| 59 | if (!str) return USAGE("zap <name>"); |
| 60 | if (sscanf( str, "spieler %s", dummy )) |
| 61 | { |
| 62 | str = dummy; |
| 63 | spieler = 1; |
| 64 | } |
| 65 | if (opfer=present(str,environment())) |
| 66 | { |
| 67 | if ( !living(opfer) ) |
| 68 | { |
| 69 | printf("%s ist doch gar kein Lebewesen!\n",capitalize(str) ); |
| 70 | return 1; |
| 71 | } |
| 72 | if (query_once_interactive(opfer)&&!spieler ) |
| 73 | { |
| 74 | printf( "Spieler kannst Du nur mit der Syntax 'zap spieler <name>' " |
| 75 | "toeten!\n" ); |
| 76 | return 1; |
| 77 | } |
| 78 | else |
| 79 | if ( !query_once_interactive(opfer) && spieler ) |
| 80 | { |
| 81 | printf( "Aber %s ist doch gar kein Spieler!\n",capitalize(str)); |
| 82 | return 1; |
| 83 | } |
| 84 | |
| 85 | message = QueryProp(P_ZAP_MSG); |
| 86 | |
| 87 | if ( !pointerp(message) || sizeof(message) != 3 ){ |
| 88 | tell_room(environment(),sprintf("%s beschwoert einen Blitz " |
| 89 | "vom Himmel.\n",capitalize(getuid())),({ this_object() })); |
| 90 | printf("Du toetest %s.\n",opfer->name( WEN,2)); |
| 91 | } |
| 92 | else |
| 93 | { |
| 94 | printf(_zap_message(message[0],opfer)); |
| 95 | tell_room(environment(),_zap_message(message[1],opfer), |
| 96 | ({this_player(),opfer})); |
| 97 | tell_object(opfer,_zap_message(message[2],opfer)); |
| 98 | } |
| 99 | |
| 100 | opfer->die(); |
| 101 | return 1; |
| 102 | } |
| 103 | else{ |
| 104 | printf("Sowas siehst Du hier nicht.\n"); |
| 105 | return 1; |
| 106 | } |
| 107 | } |
| 108 | |
| 109 | |
| 110 | // ############ |
| 111 | //############################## VERFOLGE ################################ |
| 112 | // ############ |
| 113 | |
| 114 | static int _verfolge(string str) |
| 115 | { |
| 116 | // Wenn nichts eingegeben wurde, wird ver Verfolgungsmodus beendet, sofern |
| 117 | // er zuvor eingeschaltet war. Ansonsten wird eine Fehlermeldung |
| 118 | // ausgegeben. |
| 119 | if (!sizeof(str)) |
| 120 | { |
| 121 | mixed *pur = Query(P_PURSUERS); |
| 122 | if ( pointerp(pur) && sizeof(pur) && objectp(pur[0]) ) |
| 123 | { |
| 124 | pur[0]->RemovePursuer(this_object()); |
| 125 | ReceiveMsg("Verfolgungsmodus abgeschaltet.", MT_NOTIFICATION); |
| 126 | } |
| 127 | else |
| 128 | { |
| 129 | ReceiveMsg("Du verfolgst doch ueberhaupt niemanden.", MT_NOTIFICATION); |
| 130 | } |
| 131 | return 1; |
| 132 | } |
| 133 | str=lower_case(str); |
| 134 | |
| 135 | // match_living() erlaubt die Pruefung, ob die Angabe eindeutig war. |
| 136 | int|string lv = match_living(str); |
| 137 | if ( intp(lv) ) |
| 138 | { |
| 139 | if ( lv == -2 ) |
| 140 | ReceiveMsg("Kein solches Wesen gefunden.", MT_NOTIFICATION); |
| 141 | else |
| 142 | ReceiveMsg(sprintf("verfolge: '%s' ist nicht eindeutig.\n", str), |
| 143 | MT_NOTIFICATION); |
| 144 | return 1; |
| 145 | } |
| 146 | |
| 147 | // Spieler zuerst auswaehlen, danach im Raum anwesende Lebewesen. |
| 148 | object ziel = find_player(lv) || present(lv, environment(this_player())); |
| 149 | |
| 150 | // Wurde kein Lebewesen gefunden, wird das erste Element aus der Liste der |
| 151 | // Lebewesen dieses Namens gewaehlt, falls vorhanden. Nur Lebewesen mit |
| 152 | // Environment kommen in Frage, denn sonst gibt es keinen Raum, in den der |
| 153 | // neue Verfolger bewegt werden koennte. |
| 154 | if ( !objectp(ziel) ) { |
| 155 | object* eligible_livings = filter(find_livings(lv), #'environment); |
| 156 | if (sizeof(eligible_livings)) |
| 157 | ziel = eligible_livings[0]; |
| 158 | } |
| 159 | |
| 160 | // Endlich etwas gefunden? Dann Verfolger eintragen und zum Ziel bewegen. |
| 161 | if ( objectp(ziel) ) |
| 162 | { |
| 163 | if ( ziel == this_player() ) |
| 164 | { |
| 165 | ReceiveMsg("Du kannst Dich nicht selbst verfolgen.", MT_NOTIFICATION); |
| 166 | } |
| 167 | else |
| 168 | { |
| 169 | ReceiveMsg(sprintf( |
| 170 | "Du verfolgst jetzt %s. [%s]", ziel->name(WEN), object_name(ziel)), |
| 171 | MT_NOTIFICATION, MA_MOVE); |
| 172 | ziel->AddPursuer(this_object()); |
| 173 | ziel->TakeFollowers(); |
| 174 | } |
| 175 | } |
| 176 | else |
| 177 | { |
| 178 | ReceiveMsg("Kein Wesen mit dem Namen '"+lv+"' gefunden, oder nur " |
| 179 | "solche ohne Environment.", MT_NOTIFICATION, 0, "verfolge: "); |
| 180 | } |
| 181 | return 1; |
| 182 | } |
| 183 | |
| 184 | |
| 185 | // ######### |
| 186 | //############################### TRANS ################################# |
| 187 | // ######### |
| 188 | |
| 189 | static int _trans(string str) |
| 190 | { |
| 191 | object living; |
| 192 | |
| 193 | if (!sizeof(str)) |
| 194 | return _notify_fail("Syntax: trans <spielername>\n"),0; |
Zesstra | 20888b5 | 2019-12-08 21:11:06 +0100 | [diff] [blame] | 195 | string|int livname=match_living(str,0); |
| 196 | if (intp(livname)) |
| 197 | switch (livname) |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 198 | { |
| 199 | case -1: write("Das war nicht eindeutig.\n"); return 1; |
| 200 | case -2: write("So ein Wesen gibt es nicht.\n"); return 1; |
| 201 | } |
Zesstra | 20888b5 | 2019-12-08 21:11:06 +0100 | [diff] [blame] | 202 | if(living=find_living(livname)) |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 203 | { |
| 204 | if (living->move(object_name(environment()), |
| 205 | M_TPORT|M_NOCHECK)<=0) |
| 206 | { |
| 207 | printf("Teleportieren von %s fehlgeschlagen.\n",living->Name(WEM)); |
| 208 | if (IS_LEARNER(living)) |
| 209 | tell_object(living,sprintf("%s wollte Dich teleportieren, " |
| 210 | "hat aber versagt!\n",capitalize(getuid()))); |
| 211 | return 1; |
| 212 | } |
| 213 | tell_object(living,sprintf( |
| 214 | "Ein seltsames Gefuehl ueberkommt Dich ...\n" |
| 215 | "Du verlierst die Orientierung ...\n" |
| 216 | +(QueryProp(P_INVIS)?"":"%s holt Dich zu sich.\n"), |
| 217 | capitalize(getuid()))); |
| 218 | printf("%s wurde herbeizitiert.\n",living->Name(WER)); |
| 219 | return 1; |
| 220 | } |
| 221 | printf("Das Lebewesen '%s' konnte nicht gefunden werden.\n", |
| 222 | capitalize(str)); |
| 223 | return 1; |
| 224 | } |
| 225 | |
| 226 | // ########### |
| 227 | //############################## FRIEDEN ################################# |
| 228 | // ########### |
| 229 | |
| 230 | static int _frieden(string sname) |
| 231 | { |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 232 | if (!sname) |
| 233 | { |
Zesstra | 98982a4 | 2020-03-10 23:05:02 +0100 | [diff] [blame] | 234 | object *enemies=all_inventory(environment()); |
| 235 | map_objects(enemies,"StopHuntingMode"); |
| 236 | tell_room(environment(),sprintf("%s stiftet Frieden.\n", |
| 237 | capitalize(getuid())), ({ this_object()})); |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 238 | printf("Du stiftest Frieden.\n"); |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 239 | } |
| 240 | else |
| 241 | { |
Zesstra | 98982a4 | 2020-03-10 23:05:02 +0100 | [diff] [blame] | 242 | object obj = find_living(sname); |
| 243 | if (!obj) |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 244 | { |
Zesstra | 98982a4 | 2020-03-10 23:05:02 +0100 | [diff] [blame] | 245 | printf("Kein solches Lebewesen im Spiel.\n"); |
| 246 | return 1; |
| 247 | } |
| 248 | string him=({string})obj->name(WEM); |
| 249 | mapping enemies = ({mapping})obj->StopHuntingMode(1); |
| 250 | foreach(object en : enemies) |
| 251 | { |
| 252 | en->StopHuntFor(obj, 1); |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 253 | tell_object(obj,sprintf("%s beendet Deinen Kampf mit %s.\n", |
Zesstra | 98982a4 | 2020-03-10 23:05:02 +0100 | [diff] [blame] | 254 | capitalize(getuid()),en->Name(WEM))); |
| 255 | tell_object(en,sprintf("%s beendet Deinen Kampf mit %s.\n", |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 256 | capitalize(getuid()),him)); |
| 257 | } |
Zesstra | 98982a4 | 2020-03-10 23:05:02 +0100 | [diff] [blame] | 258 | printf("%s und alle Gegner wurden befriedet.\n",obj->Name(WER)); |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 259 | } |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 260 | return 1; |
| 261 | } |
| 262 | |
| 263 | // ######## |
| 264 | //############################### PWHO ################################## |
| 265 | // ######## |
| 266 | |
| 267 | #if __VERSION__ < "3.2.9" |
| 268 | private int _pwho_learner_test(object ob) |
| 269 | { |
| 270 | return !IS_LEARNER(ob); |
| 271 | } |
| 272 | #endif |
| 273 | |
| 274 | static int _pwho() |
| 275 | { |
| 276 | mixed* spieler, res, *hands; |
| 277 | int i; |
| 278 | #if __VERSION__ < "3.2.9" |
| 279 | spieler = filter(users(),#'_pwho_learner_test); |
| 280 | #else |
| 281 | spieler = filter(users(),(: return !IS_LEARNER($1); :)); |
| 282 | #endif |
| 283 | spieler = sort_array(spieler, function int (object a, object b) |
| 284 | { return a->QueryProp(P_LEVEL) > b->QueryProp(P_LEVEL); } ); |
| 285 | |
| 286 | res = "Lvl Name Erfahrung QP Int Str Dex Con WC " |
| 287 | "AC HANDS HP (max)\n" |
| 288 | "--------------------------------------------------------------" |
| 289 | "-----------------\n"; |
| 290 | for (i=sizeof(spieler)-1; i>=0; i--) |
| 291 | res += sprintf("%3d %-12s %9d %5d %3d %3d %3d %3d %4d %4d %5d " |
| 292 | "%4d (%4d)\n", |
| 293 | spieler[i]->QueryProp(P_LEVEL), |
| 294 | capitalize(getuid(spieler[i])), |
| 295 | spieler[i]->QueryProp(P_XP), |
| 296 | spieler[i]->QueryProp(P_QP), |
| 297 | spieler[i]->QueryAttribute(A_INT), |
| 298 | spieler[i]->QueryAttribute(A_STR), |
| 299 | spieler[i]->QueryAttribute(A_DEX), |
| 300 | spieler[i]->QueryAttribute(A_CON), |
| 301 | spieler[i]->QueryProp(P_TOTAL_WC), |
| 302 | spieler[i]->QueryProp(P_TOTAL_AC), |
Vanion | bda305b | 2020-03-10 20:53:16 +0100 | [diff] [blame] | 303 | (sizeof(hands=(({int *})spieler[i]->QueryProp(P_HANDS)))?hands[1]:0), |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 304 | spieler[i]->QueryProp(P_HP), |
| 305 | spieler[i]->QueryProp(P_MAX_HP)); |
| 306 | More(res); |
| 307 | return 1; |
| 308 | } |
| 309 | |
| 310 | // ########## |
| 311 | //############################## ZWINGE ################################# |
| 312 | // ########## |
| 313 | |
| 314 | static int _zwinge(string str) |
| 315 | { |
| 316 | object living; |
| 317 | string what, rest; |
| 318 | string living_name; |
| 319 | |
| 320 | str = _unparsed_args(); |
| 321 | if(!str|| sscanf( str, "%s %s", living_name, what ) != 2 ) |
| 322 | return _notify_fail("Zwinge WEN zu WAS?\n"),0; |
| 323 | if( sscanf( what, "zu %s", rest ) == 1 ) what = rest; |
| 324 | if (!(living = find_living(living_name))) |
| 325 | return printf ("Ein Lebewesen namens '%s' konnte nicht gefunden werden!\n", |
| 326 | capitalize(living_name)),1; |
| 327 | if (living->command_me(what)) |
| 328 | { |
| 329 | printf("Du zwingst %s zu \"%s\".\n",capitalize(living_name),what); |
Vanion | bda305b | 2020-03-10 20:53:16 +0100 | [diff] [blame] | 330 | if (!IS_ARCH(this_object()) && |
| 331 | getuid()!=({string|int})living->QueryProp(P_TESTPLAYER)) |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 332 | log_file(SHELLLOG("ZWINGE"), |
| 333 | sprintf("%s zwingt %s (%s) zu %s [%s]\n", |
| 334 | capitalize(getuid()),living->Name(),capitalize(getuid(living)), |
| 335 | what,dtime(time()))); |
| 336 | } |
| 337 | else |
| 338 | write("Hat leider nicht geklappt!\n"); |
| 339 | return 1; |
| 340 | } |
| 341 | |
| 342 | // ######### |
| 343 | //############################### HEILE ################################# |
| 344 | // ######### |
| 345 | |
| 346 | static int _heile(string name) |
| 347 | { |
| 348 | object ob; |
| 349 | int lpv, mpv; |
| 350 | |
| 351 | if (!name) return USAGE("heile <name>"); |
| 352 | name = lower_case(name); |
| 353 | if ((!(ob = present(name,environment()))) |
| 354 | ||!living(ob)) |
| 355 | ob = find_living(name); |
| 356 | if (!ob) |
| 357 | { |
| 358 | printf("'%s' ist momentan nicht da.\n",capitalize(name)); |
| 359 | return 1; |
| 360 | } |
Vanion | bda305b | 2020-03-10 20:53:16 +0100 | [diff] [blame] | 361 | lpv = ({int})ob->QueryProp(P_HP); |
| 362 | mpv = ({int})ob->QueryProp(P_SP); |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 363 | ob->heal_self(1000000); |
Vanion | bda305b | 2020-03-10 20:53:16 +0100 | [diff] [blame] | 364 | string|int testie = ({string|int})ob->QueryProp(P_TESTPLAYER); |
| 365 | if (!IS_LEARNER(ob) |
| 366 | && (!testie || (to_string(testie)[<5..<1] == "Gilde"))) |
| 367 | { |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 368 | log_file(SHELLLOG("HEAL"), |
| 369 | sprintf("%s heilt %s (%s) %s (LP: %d -> %d, MP: %d -> %d)\n", |
| 370 | capitalize(geteuid(this_player())), |
| 371 | call_other(ob,"name"), capitalize(geteuid(ob)), |
Vanion | bda305b | 2020-03-10 20:53:16 +0100 | [diff] [blame] | 372 | dtime(time()), lpv, ({int})ob->QueryProp(P_HP), |
| 373 | mpv,({int})ob->QueryProp(P_SP))); |
| 374 | } |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 375 | tell_object(ob, QueryProp(P_NAME) + " heilt Dich.\n"); |
| 376 | printf("Du heilst %s.\n",capitalize(name)); |
| 377 | return 1; |
| 378 | } |
| 379 | |
| 380 | // ########## |
| 381 | //############################## PEOPLE ################################# |
| 382 | // ########## |
| 383 | |
| 384 | private string _people_filename(object obj) |
| 385 | { |
| 386 | string str; |
| 387 | str=object_name(environment(obj)); |
| 388 | if (!str) return 0; |
| 389 | if (str[0..2] == "/d/") return sprintf("+%s",str[3..<1]); |
| 390 | if (str[0..8] == "/players/") return sprintf("~%s",str[9..<1]); |
| 391 | return str; |
| 392 | } |
| 393 | |
| 394 | static int _people() |
| 395 | { |
| 396 | mixed *list, res; |
| 397 | int i,j, a; |
| 398 | string a_age,a_ipnum,a_name,a_level,a_idle,a_room,a_end, a_title; |
| 399 | |
| 400 | switch(QueryProp("tty")) |
| 401 | { |
| 402 | case "vt100": |
| 403 | a_ipnum = ""; a_name = ANSI_BOLD; |
| 404 | a_level = ANSI_NORMAL; a_idle = ANSI_BLINK; |
| 405 | a_room = ANSI_NORMAL; a_end = ANSI_NORMAL; |
| 406 | a_title = ANSI_INVERS; a_age = ANSI_NORMAL; |
| 407 | break; |
| 408 | case "ansi": |
| 409 | a_ipnum = ANSI_BLUE; a_name = ANSI_BOLD; |
| 410 | a_level = ANSI_RED; a_idle = ANSI_BLACK+ANSI_BOLD; |
| 411 | a_room = ANSI_BOLD+ANSI_BLUE; a_end = ANSI_NORMAL; |
| 412 | a_title = ANSI_INVERS; a_age = ANSI_PURPLE; |
| 413 | break; |
| 414 | default: |
| 415 | a_title = a_ipnum = a_name = a_level = a_idle = a_room = a_end = ""; |
| 416 | a_age = ""; |
| 417 | } |
| 418 | list = sort_array(users(), function int (object a, object b) { |
| 419 | return query_ip_number(a)>query_ip_number(b);} ); |
| 420 | |
| 421 | j=sizeof(list); |
| 422 | a=0;res=""; |
| 423 | for(i=0; i<sizeof(list); i++) { |
| 424 | string name_; |
| 425 | name_ = capitalize(list[i]->query_real_name()||"<logon>"); |
| 426 | res += sprintf( "%s%-15s%s %s%-13s%s %s%3d%s %s %s %s%s%s%s %s%s\n", |
| 427 | a_ipnum, query_ip_number(list[i]),a_end,a_name, |
| 428 | (list[i]->QueryProp(P_INVIS)?"("+name_+")":name_), |
| 429 | a_end,a_level, MASTER->get_wiz_level(getuid(list[i])), |
| 430 | a_end,a_age, |
Vanion | bda305b | 2020-03-10 20:53:16 +0100 | [diff] [blame] | 431 | time2string("%4x %0X",(({int})list[i]->QueryProp(P_AGE))*2), |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 432 | query_idle(list[i])>=300?(a++,(a_idle+"I")):" ", |
| 433 | a_end, |
| 434 | query_editing(list[i])?a_idle+"E"+a_end:" ", |
| 435 | query_input_pending(list[i])?a_idle+"M"+a_end:" ", |
| 436 | environment(list[i])?a_room+_people_filename(list[i]):"", |
| 437 | a_end); |
| 438 | } |
| 439 | if (a) |
| 440 | res = sprintf("%s%d Spieler anwesend (%d aktiv). %s%s\n",a_title,j, |
| 441 | (j-a),query_load_average(),a_end)+res; |
| 442 | else |
| 443 | res = sprintf("%s%d Spieler anwesend. %s%s\n",a_title,j, |
| 444 | query_load_average(),a_end)+res; |
| 445 | More(res); |
| 446 | |
| 447 | return 1; |
| 448 | } |
| 449 | |
| 450 | |
| 451 | // ########### |
| 452 | //############################## SPIELER ################################# |
| 453 | // ########### |
| 454 | |
| 455 | private string _spieler_time2string(int time) |
| 456 | { |
| 457 | string ret; |
| 458 | |
| 459 | ret=""; |
| 460 | if (time>=86400) |
| 461 | { |
| 462 | ret+=time/86400+"d "; |
| 463 | time%=86400; |
| 464 | } |
| 465 | if(time<36000) ret+="0"; |
| 466 | ret+=time/3600+":"; |
| 467 | time%=3600; |
| 468 | if(time<600) ret+="0"; |
| 469 | ret+=time/60+":"; |
| 470 | time%=60; |
| 471 | if(time<10) ret+="0"; |
| 472 | ret+=time+""; |
| 473 | return ret; |
| 474 | } |
| 475 | |
| 476 | |
| 477 | static int _spieler(string arg) |
| 478 | { |
| 479 | string dummy,ip; |
Zesstra | 7bf785e | 2020-01-21 21:03:46 +0100 | [diff] [blame] | 480 | |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 481 | arg=_unparsed_args(); |
| 482 | if(!sizeof(arg) || sscanf(arg,"aus ip %s",dummy)!=1) |
| 483 | return USAGE("spieler aus ip [von <spieler>|<ip>]"); |
| 484 | arg=dummy; |
| 485 | if (sscanf(arg,"von %s",dummy)==1) |
| 486 | { |
| 487 | dummy=lower_case(dummy); |
Zesstra | 7bf785e | 2020-01-21 21:03:46 +0100 | [diff] [blame] | 488 | object pl = find_player(dummy); |
| 489 | if (!pl) { |
| 490 | notify_fail(sprintf("Spieler '%s' konnte nicht gefunden " |
| 491 | "werden.\n",capitalize(dummy))); |
| 492 | return 0; |
| 493 | } |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 494 | ip=query_ip_number(pl); |
| 495 | } |
Zesstra | 7bf785e | 2020-01-21 21:03:46 +0100 | [diff] [blame] | 496 | else |
| 497 | ip=arg; |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 498 | |
Zesstra | 7bf785e | 2020-01-21 21:03:46 +0100 | [diff] [blame] | 499 | ip=implode((explode(ip,".")-({""})+({"*","*","*","*"}))[0..3],"."); |
Zesstra | 2a82c46 | 2020-01-21 21:11:52 +0100 | [diff] [blame] | 500 | object *spieler; |
| 501 | if (catch(spieler=filter(users(), |
Zesstra | 7bf785e | 2020-01-21 21:03:46 +0100 | [diff] [blame] | 502 | function int (object u, string re) { |
| 503 | return sizeof(regexp(({query_ip_number(u)}),re)); |
| 504 | } ))) |
| 505 | { |
| 506 | printf("In der IP duerfen nur Zahlen(0-255), Punkte (.) und " |
| 507 | "Sterne (*) vorkommen.\n"); |
| 508 | return 1; |
| 509 | } |
| 510 | |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 511 | if (!sizeof(spieler)) |
| 512 | return printf("Es konnte kein Spieler mit der IP '%s' gefunden " |
| 513 | "werden.\n",ip),1; |
Zesstra | 7bf785e | 2020-01-21 21:03:46 +0100 | [diff] [blame] | 514 | |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 515 | arg=sprintf("\nFolgende Spieler haben die IP %s:\n" |
| 516 | "================================================================" |
| 517 | "===========\n" |
| 518 | "Name: Zweitie von: Eingeloggt: " |
| 519 | "Idle seit:\n" |
| 520 | "----------------------------------------------------------------" |
| 521 | "-----------\n",ip); |
Zesstra | 2a82c46 | 2020-01-21 21:11:52 +0100 | [diff] [blame] | 522 | |
Zesstra | 7bf785e | 2020-01-21 21:03:46 +0100 | [diff] [blame] | 523 | foreach(object u: spieler) |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 524 | { |
Zesstra | 2a82c46 | 2020-01-21 21:11:52 +0100 | [diff] [blame] | 525 | string second=u->QueryProp(P_SECOND); |
Zesstra | 7bf785e | 2020-01-21 21:03:46 +0100 | [diff] [blame] | 526 | if (stringp(second) && sizeof(second)) |
| 527 | { |
| 528 | if (!master()->find_userinfo(second)) |
| 529 | second = "*ungueltig*"; |
| 530 | else |
| 531 | second = capitalize(second); |
| 532 | } |
| 533 | else |
| 534 | second = ""; |
| 535 | |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 536 | arg+=sprintf("%-11s %-17s %26s %-15s\n", |
Zesstra | 7bf785e | 2020-01-21 21:03:46 +0100 | [diff] [blame] | 537 | capitalize(getuid(u)), second, |
Zesstra | 2a82c46 | 2020-01-21 21:11:52 +0100 | [diff] [blame] | 538 | dtime(u->QueryProp(P_LAST_LOGIN)), |
| 539 | _spieler_time2string(query_idle(u))); |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 540 | } |
| 541 | arg+="===============================================================" |
| 542 | "============\n\n"; |
| 543 | More(arg); |
| 544 | return 1; |
| 545 | } |