blob: 6c80ffe701be2a32c77c162e3e81075c1c3261ba [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001// 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 User88f12472016-06-24 23:31:02 +020010
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
24static 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
43private string _zap_message(string str, object obj)
44{
Vanionbda305b2020-03-10 20:53:16 +010045 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 User88f12472016-06-24 23:31:02 +020049 str=regreplace(str,"@@ich@@",name(WER,2),1);
50 return capitalize(str);
51}
52
53static 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() }));
bugfixd94d0932020-04-08 11:27:13 +020090 printf("Du toetest %s.\n",({string})opfer->name( WEN,2));
MG Mud User88f12472016-06-24 23:31:02 +020091 }
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
bugfixd94d0932020-04-08 11:27:13 +0200100 ({void})opfer->die();
MG Mud User88f12472016-06-24 23:31:02 +0200101 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
114static 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 {
bugfixd94d0932020-04-08 11:27:13 +0200124 ({void})pur[0]->RemovePursuer(this_object());
MG Mud User88f12472016-06-24 23:31:02 +0200125 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(
bugfixd94d0932020-04-08 11:27:13 +0200170 "Du verfolgst jetzt %s. [%s]", ({string})ziel->name(WEN), object_name(ziel)),
MG Mud User88f12472016-06-24 23:31:02 +0200171 MT_NOTIFICATION, MA_MOVE);
bugfixd94d0932020-04-08 11:27:13 +0200172 ({void})ziel->AddPursuer(this_object());
173 ({void})ziel->TakeFollowers();
MG Mud User88f12472016-06-24 23:31:02 +0200174 }
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
189static int _trans(string str)
190{
191 object living;
192
193 if (!sizeof(str))
194 return _notify_fail("Syntax: trans <spielername>\n"),0;
Zesstra20888b52019-12-08 21:11:06 +0100195 string|int livname=match_living(str,0);
196 if (intp(livname))
197 switch (livname)
MG Mud User88f12472016-06-24 23:31:02 +0200198 {
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 }
Zesstra20888b52019-12-08 21:11:06 +0100202 if(living=find_living(livname))
MG Mud User88f12472016-06-24 23:31:02 +0200203 {
bugfixd94d0932020-04-08 11:27:13 +0200204 if (({int})living->move(object_name(environment()),
MG Mud User88f12472016-06-24 23:31:02 +0200205 M_TPORT|M_NOCHECK)<=0)
206 {
bugfixd94d0932020-04-08 11:27:13 +0200207 printf("Teleportieren von %s fehlgeschlagen.\n",({string})living->Name(WEM));
MG Mud User88f12472016-06-24 23:31:02 +0200208 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())));
bugfixd94d0932020-04-08 11:27:13 +0200218 printf("%s wurde herbeizitiert.\n",({string})living->Name(WER));
MG Mud User88f12472016-06-24 23:31:02 +0200219 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
230static int _frieden(string sname)
231{
MG Mud User88f12472016-06-24 23:31:02 +0200232 if (!sname)
233 {
Zesstra98982a42020-03-10 23:05:02 +0100234 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 User88f12472016-06-24 23:31:02 +0200238 printf("Du stiftest Frieden.\n");
MG Mud User88f12472016-06-24 23:31:02 +0200239 }
240 else
241 {
Zesstra98982a42020-03-10 23:05:02 +0100242 object obj = find_living(sname);
243 if (!obj)
MG Mud User88f12472016-06-24 23:31:02 +0200244 {
Zesstra98982a42020-03-10 23:05:02 +0100245 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 {
bugfixd94d0932020-04-08 11:27:13 +0200252 ({int})en->StopHuntFor(obj, 1);
MG Mud User88f12472016-06-24 23:31:02 +0200253 tell_object(obj,sprintf("%s beendet Deinen Kampf mit %s.\n",
bugfixd94d0932020-04-08 11:27:13 +0200254 capitalize(getuid()),({string})en->Name(WEM)));
Zesstra98982a42020-03-10 23:05:02 +0100255 tell_object(en,sprintf("%s beendet Deinen Kampf mit %s.\n",
MG Mud User88f12472016-06-24 23:31:02 +0200256 capitalize(getuid()),him));
257 }
bugfixd94d0932020-04-08 11:27:13 +0200258 printf("%s und alle Gegner wurden befriedet.\n",({string})obj->Name(WER));
MG Mud User88f12472016-06-24 23:31:02 +0200259 }
MG Mud User88f12472016-06-24 23:31:02 +0200260 return 1;
261}
262
263// ########
264//############################### PWHO ##################################
265// ########
266
267#if __VERSION__ < "3.2.9"
268private int _pwho_learner_test(object ob)
269{
270 return !IS_LEARNER(ob);
271}
272#endif
273
274static 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)
bugfixd94d0932020-04-08 11:27:13 +0200284 { return ({int})a->QueryProp(P_LEVEL) > ({int})b->QueryProp(P_LEVEL); } );
MG Mud User88f12472016-06-24 23:31:02 +0200285
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",
bugfixd94d0932020-04-08 11:27:13 +0200293 ({int})spieler[i]->QueryProp(P_LEVEL),
MG Mud User88f12472016-06-24 23:31:02 +0200294 capitalize(getuid(spieler[i])),
bugfixd94d0932020-04-08 11:27:13 +0200295 ({int})spieler[i]->QueryProp(P_XP),
296 ({int})spieler[i]->QueryProp(P_QP),
297 ({int})spieler[i]->QueryAttribute(A_INT),
298 ({int})spieler[i]->QueryAttribute(A_STR),
299 ({int})spieler[i]->QueryAttribute(A_DEX),
300 ({int})spieler[i]->QueryAttribute(A_CON),
301 ({int})spieler[i]->QueryProp(P_TOTAL_WC),
302 ({int})spieler[i]->QueryProp(P_TOTAL_AC),
303 (sizeof(hands=(({<int|string|string*>*})spieler[i]->QueryProp(P_HANDS)))?hands[1]:0),
304 ({int})spieler[i]->QueryProp(P_HP),
305 ({int})spieler[i]->QueryProp(P_MAX_HP));
MG Mud User88f12472016-06-24 23:31:02 +0200306 More(res);
307 return 1;
308}
309
310// ##########
311//############################## ZWINGE #################################
312// ##########
313
314static 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;
bugfixd94d0932020-04-08 11:27:13 +0200327 if (({int})living->command_me(what))
MG Mud User88f12472016-06-24 23:31:02 +0200328 {
329 printf("Du zwingst %s zu \"%s\".\n",capitalize(living_name),what);
Vanionbda305b2020-03-10 20:53:16 +0100330 if (!IS_ARCH(this_object()) &&
331 getuid()!=({string|int})living->QueryProp(P_TESTPLAYER))
MG Mud User88f12472016-06-24 23:31:02 +0200332 log_file(SHELLLOG("ZWINGE"),
333 sprintf("%s zwingt %s (%s) zu %s [%s]\n",
bugfixd94d0932020-04-08 11:27:13 +0200334 capitalize(getuid()),({string})living->Name(),capitalize(getuid(living)),
MG Mud User88f12472016-06-24 23:31:02 +0200335 what,dtime(time())));
336 }
337 else
338 write("Hat leider nicht geklappt!\n");
339 return 1;
340}
341
342// #########
343//############################### HEILE #################################
344// #########
345
346static 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 }
Vanionbda305b2020-03-10 20:53:16 +0100361 lpv = ({int})ob->QueryProp(P_HP);
362 mpv = ({int})ob->QueryProp(P_SP);
bugfixd94d0932020-04-08 11:27:13 +0200363 ({void})ob->heal_self(1000000);
Vanionbda305b2020-03-10 20:53:16 +0100364 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 User88f12472016-06-24 23:31:02 +0200368 log_file(SHELLLOG("HEAL"),
369 sprintf("%s heilt %s (%s) %s (LP: %d -> %d, MP: %d -> %d)\n",
370 capitalize(geteuid(this_player())),
bugfixd94d0932020-04-08 11:27:13 +0200371 ({string})call_other(ob,"name"), capitalize(geteuid(ob)),
Vanionbda305b2020-03-10 20:53:16 +0100372 dtime(time()), lpv, ({int})ob->QueryProp(P_HP),
373 mpv,({int})ob->QueryProp(P_SP)));
374 }
MG Mud User88f12472016-06-24 23:31:02 +0200375 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
384private 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
394static 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_;
bugfixd94d0932020-04-08 11:27:13 +0200425 name_ = capitalize(({string})list[i]->query_real_name()||"<logon>");
MG Mud User88f12472016-06-24 23:31:02 +0200426 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,
bugfixd94d0932020-04-08 11:27:13 +0200428 (({int})list[i]->QueryProp(P_INVIS)?"("+name_+")":name_),
429 a_end,a_level, ({int})MASTER->get_wiz_level(getuid(list[i])),
MG Mud User88f12472016-06-24 23:31:02 +0200430 a_end,a_age,
Vanionbda305b2020-03-10 20:53:16 +0100431 time2string("%4x %0X",(({int})list[i]->QueryProp(P_AGE))*2),
MG Mud User88f12472016-06-24 23:31:02 +0200432 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
455private 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
477static int _spieler(string arg)
478{
479 string dummy,ip;
Zesstra7bf785e2020-01-21 21:03:46 +0100480
MG Mud User88f12472016-06-24 23:31:02 +0200481 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);
Zesstra7bf785e2020-01-21 21:03:46 +0100488 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 User88f12472016-06-24 23:31:02 +0200494 ip=query_ip_number(pl);
495 }
Zesstra7bf785e2020-01-21 21:03:46 +0100496 else
497 ip=arg;
MG Mud User88f12472016-06-24 23:31:02 +0200498
Zesstra7bf785e2020-01-21 21:03:46 +0100499 ip=implode((explode(ip,".")-({""})+({"*","*","*","*"}))[0..3],".");
Zesstra2a82c462020-01-21 21:11:52 +0100500 object *spieler;
501 if (catch(spieler=filter(users(),
Zesstra7bf785e2020-01-21 21:03:46 +0100502 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 User88f12472016-06-24 23:31:02 +0200511 if (!sizeof(spieler))
512 return printf("Es konnte kein Spieler mit der IP '%s' gefunden "
513 "werden.\n",ip),1;
Zesstra7bf785e2020-01-21 21:03:46 +0100514
MG Mud User88f12472016-06-24 23:31:02 +0200515 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);
Zesstra2a82c462020-01-21 21:11:52 +0100522
Zesstra7bf785e2020-01-21 21:03:46 +0100523 foreach(object u: spieler)
MG Mud User88f12472016-06-24 23:31:02 +0200524 {
bugfixd94d0932020-04-08 11:27:13 +0200525 string second=({string})u->QueryProp(P_SECOND);
Zesstra7bf785e2020-01-21 21:03:46 +0100526 if (stringp(second) && sizeof(second))
527 {
bugfixd94d0932020-04-08 11:27:13 +0200528 if (!({int})master()->find_userinfo(second))
Zesstra7bf785e2020-01-21 21:03:46 +0100529 second = "*ungueltig*";
530 else
531 second = capitalize(second);
532 }
533 else
534 second = "";
535
MG Mud User88f12472016-06-24 23:31:02 +0200536 arg+=sprintf("%-11s %-17s %26s %-15s\n",
Zesstra7bf785e2020-01-21 21:03:46 +0100537 capitalize(getuid(u)), second,
bugfixd94d0932020-04-08 11:27:13 +0200538 dtime(({int})u->QueryProp(P_LAST_LOGIN)),
Zesstra2a82c462020-01-21 21:11:52 +0100539 _spieler_time2string(query_idle(u)));
MG Mud User88f12472016-06-24 23:31:02 +0200540 }
541 arg+="==============================================================="
542 "============\n\n";
543 More(arg);
544 return 1;
545}