ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/server/main.C
(Generate patch)

Comparing deliantra/server/server/main.C (file contents):
Revision 1.111 by root, Sun Jun 24 04:09:29 2007 UTC vs.
Revision 1.119 by root, Mon Oct 22 05:46:45 2007 UTC

3 * 3 *
4 * Copyright (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Crossfire TRT team 4 * Copyright (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Crossfire TRT team
5 * Copyright (©) 2001-2003,2007 Mark Wedel & Crossfire Development Team 5 * Copyright (©) 2001-2003,2007 Mark Wedel & Crossfire Development Team
6 * Copyright (©) 1992,2007 Frank Tore Johansen 6 * Copyright (©) 1992,2007 Frank Tore Johansen
7 * 7 *
8 * Crossfire TRT is free software; you can redistribute it and/or modify it 8 * Crossfire TRT is free software: you can redistribute it and/or modify
9 * under the terms of the GNU General Public License as published by the Free 9 * it under the terms of the GNU General Public License as published by
10 * Software Foundation; either version 2 of the License, or (at your option) 10 * the Free Software Foundation, either version 3 of the License, or
11 * any later version. 11 * (at your option) any later version.
12 * 12 *
13 * This program is distributed in the hope that it will be useful, but 13 * This program is distributed in the hope that it will be useful,
14 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * for more details. 16 * GNU General Public License for more details.
17 * 17 *
18 * You should have received a copy of the GNU General Public License along 18 * You should have received a copy of the GNU General Public License
19 * with Crossfire TRT; if not, write to the Free Software Foundation, Inc. 51 19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 * 20 *
22 * The authors can be reached via e-mail to <crossfire@schmorp.de> 21 * The authors can be reached via e-mail to <crossfire@schmorp.de>
23 */ 22 */
24 23
25#include <global.h> 24#include <global.h>
148 147
149 // remove, so stupid ob_locked does not trigger a failure 148 // remove, so stupid ob_locked does not trigger a failure
150 remove (); 149 remove ();
151 150
152 /* try to find a spot for the player */ 151 /* try to find a spot for the player */
153 if (ob_blocked (this, newmap, x, y)) 152 if (blocked (newmap, x, y))
154 { /* First choice blocked */ 153 { /* First choice blocked */
155 /* We try to find a spot for the player, starting closest in. 154 /* We try to find a spot for the player, starting closest in.
156 * We could use find_first_free_spot, but that doesn't randomize it at all, 155 * We could use find_first_free_spot, but that doesn't randomize it at all,
157 * So for example, if the north space is free, you would always end up there even 156 * So for example, if the north space is free, you would always end up there even
158 * if other spaces around are available. 157 * if other spaces around are available.
344 343
345// send all clients some informational text 344// send all clients some informational text
346static void 345static void
347cleanup_inform (const char *cause, bool make_core) 346cleanup_inform (const char *cause, bool make_core)
348{ 347{
349 int flags = NDI_UNIQUE | NDI_ALL | (make_core ? NDI_RED : NDI_GREEN); 348 int flags = NDI_REPLY | NDI_UNIQUE | NDI_ALL | (make_core ? NDI_RED : NDI_GREEN);
350 349
351 new_draw_info_format (flags, 0, 0, "The server will now shutdown."); 350 new_draw_info_format (flags, 0, 0, "The server will now shutdown.");
352 new_draw_info_format (flags, 0, 0, "Cause for this shutdown: %s", cause); 351 new_draw_info_format (flags, 0, 0, "Cause for this shutdown: %s", cause);
353 352
354 if (make_core) 353 if (make_core)
356 else 355 else
357 new_draw_info_format (flags, 0, 0, "This is considered to be a clean shutdown, and all maps and players will be saved now."); 356 new_draw_info_format (flags, 0, 0, "This is considered to be a clean shutdown, and all maps and players will be saved now.");
358 357
359 new_draw_info_format (flags, 0, 0, "%s", CLEANUP_MESSAGE); 358 new_draw_info_format (flags, 0, 0, "%s", CLEANUP_MESSAGE);
360 359
361 flush_sockets (); 360 client::flush_sockets ();
362} 361}
363 362
364/* clean up everything before exiting */ 363/* clean up everything before exiting */
365void 364void
366cleanup (const char *cause, bool make_core) 365cleanup (const char *cause, bool make_core)
394 cfperl_cleanup (make_core); 393 cfperl_cleanup (make_core);
395 _exit (1); 394 _exit (1);
396 } 395 }
397 else 396 else
398 { 397 {
399 new_draw_info_format (NDI_UNIQUE | NDI_ALL | NDI_GREEN, 0, 0, "Maps and players successfully saved, exiting."); 398 new_draw_info_format (NDI_REPLY | NDI_UNIQUE | NDI_ALL | NDI_GREEN, 0, 0, "Maps and players successfully saved, exiting.");
400 new_draw_info_format (NDI_UNIQUE | NDI_ALL | NDI_GREEN, 0, 0, "And again: " CLEANUP_MESSAGE); 399 new_draw_info_format (NDI_REPLY | NDI_UNIQUE | NDI_ALL | NDI_GREEN, 0, 0, "And again: " CLEANUP_MESSAGE);
401 flush_sockets (); 400 client::flush_sockets ();
402 cfperl_cleanup (make_core); 401 cfperl_cleanup (make_core);
403 _exit (0); 402 _exit (0);
404 } 403 }
405}
406
407int
408forbid_play (void)
409{
410#if !defined(_IBMR2) && !defined(___IBMR2) && defined(PERM_FILE)
411 char buf[MAX_BUF], day[MAX_BUF];
412 FILE *fp;
413 time_t clock;
414 struct tm *tm;
415 int i, start, stop, forbit = 0, comp;
416
417 clock = time (NULL);
418 tm = (struct tm *) localtime (&clock);
419
420 sprintf (buf, "%s/%s", settings.confdir, PERM_FILE);
421 if ((fp = open_and_uncompress (buf, 0, &comp)) == NULL)
422 return 0;
423
424 while (fgets (buf, MAX_BUF, fp))
425 {
426 if (buf[0] == '#')
427 continue;
428
429 if (!strncmp (buf, "msg", 3))
430 {
431 if (forbit)
432 while (fgets (buf, MAX_BUF, fp)) /* print message */
433 fputs (buf, logfile);
434 break;
435 }
436 else if (sscanf (buf, "%s %d%*c%d\n", day, &start, &stop) != 3)
437 {
438 LOG (llevDebug, "Warning: Incomplete line in permission file ignored.\n");
439 continue;
440 }
441
442 for (i = 0; i < 7; i++)
443 {
444 if (!strncmp (buf, days[i], 3) && (tm->tm_wday == i) && (tm->tm_hour >= start) && (tm->tm_hour < stop))
445 forbit = 1;
446 }
447 }
448
449 close_and_delete (fp, comp);
450
451 return forbit;
452#else
453 return 0;
454#endif
455} 404}
456 405
457/* 406/*
458 * do_specials() is a collection of functions to call from time to time. 407 * do_specials() is a collection of functions to call from time to time.
459 * Modified 2000-1-14 MSW to use the global pticks count to determine how 408 * Modified 2000-1-14 MSW to use the global pticks count to determine how
471do_specials (void) 420do_specials (void)
472{ 421{
473 if (expect_false (!(pticks % TICKS_PER_HOUR))) 422 if (expect_false (!(pticks % TICKS_PER_HOUR)))
474 adjust_daylight (); 423 adjust_daylight ();
475 424
476 if (expect_false (!(pticks % 7))) 425 if (expect_false (!(pticks % 89)))
477 shstr::gc (); 426 shstr::gc ();
478 427
479 if (expect_false (!(pticks % 2503))) 428 if (expect_false (!(pticks % 2503)))
480 fix_weight (); /* Hack to fix weightproblems caused by bugs */ 429 fix_weight (); /* Hack to fix weightproblems caused by bugs */
481 430
494 443
495void 444void
496server_tick () 445server_tick ()
497{ 446{
498 // first do the user visible stuff 447 // first do the user visible stuff
499 doeric_server ();
500 INVOKE_GLOBAL (CLOCK); 448 INVOKE_GLOBAL (CLOCK);
501 process_events (); /* "do" something with objects with speed */ 449 process_events (); // "do" something with objects with speed
502 flush_sockets (); 450 client::clock (); // draw client maps etc.
503 451
504 // then do some bookkeeping, should not really be here 452 // then do some bookkeeping, should not really be here
505 do_specials (); /* Routines called from time to time. */ 453 do_specials (); /* Routines called from time to time. */
506 attachable::check_mortals (); 454 attachable::check_mortals ();
507 455
563 settings.argc = argc; 511 settings.argc = argc;
564 settings.argv = argv; 512 settings.argv = argv;
565 513
566 init (argc, argv); 514 init (argc, argv);
567 515
568 initPlugins ();
569
570 for (;;) 516 for (;;)
571 cfperl_main (); 517 cfperl_main ();
572} 518}
573#endif 519#endif
574 520
521#if 0
522int xyzzy ()
523{
524 return rndm(8);
525}
526
527void xyzzy (object_ptr &a, object_ptr &o)
528{
529 asm volatile ("int3");
530 a = o;
531 asm volatile ("int3");
532}
533#endif
534

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines