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.87 by root, Thu Jan 18 19:32:37 2007 UTC vs.
Revision 1.98 by root, Sat Apr 21 23:03:54 2007 UTC

237 * is needed after the players have been updated. 237 * is needed after the players have been updated.
238 */ 238 */
239static void 239static void
240process_players1 () 240process_players1 ()
241{ 241{
242 int flag;
243
244 /* Basically, we keep looping until all the players have done their actions. */ 242 /* Basically, we keep looping until all the players have done their actions. */
245 for (flag = 1; flag != 0;) 243 for (int flag = 1; flag != 0;)
246 { 244 {
247 flag = 0; 245 flag = 0;
248 for_all_players (pl) 246 for_all_players (pl)
249 { 247 {
250 pl->refcnt_chk (); 248 pl->refcnt_chk ();
251 249
252 if (!pl->ob || !pl->ns || !pl->ob->active) 250 if (!pl->ob || !pl->ns || !pl->ob->active)
253 continue; 251 continue;
254 252
255 if (pl->ob->speed_left > 0) 253 if (pl->ob->speed_left > 0 && pl->ns)
256 if (handle_newcs_player (pl->ob)) 254 if (handle_newcs_player (pl->ob))
257 flag = 1; 255 flag = 1;
258 256
259 /* If the player is not actively playing, don't make a 257 /* If the player is not actively playing, don't make a
260 * backup save - nothing to save anyway. Plus, the 258 * backup save - nothing to save anyway. Plus, the
329 LOG (llevError, "BUG: process_events(): Free object on list\n"); 327 LOG (llevError, "BUG: process_events(): Free object on list\n");
330 op->set_speed (0); 328 op->set_speed (0);
331 continue; 329 continue;
332 } 330 }
333 331
334 /* I've seen occasional crashes due to this - the object is removed,
335 * and thus the map it points to (last map it was on) may be bogus
336 * The real bug is to try to find out the cause of this - someone
337 * is probably calling remove_ob without either an insert_ob or
338 * free_object afterwards, leaving an object dangling. But I'd
339 * rather log this and continue on instead of crashing.
340 * Don't remove players - when a player quits, the object is in
341 * sort of a limbo, of removed, but something we want to keep
342 * around.
343 */
344 if (QUERY_FLAG (op, FLAG_REMOVED) && op->type != PLAYER && op->map && op->map->in_memory != MAP_IN_MEMORY)
345 {
346 LOG (llevError, "BUG: process_events(): Removed object on list\n");
347 char *dump = dump_object (op);
348 LOG (llevError, dump);
349 free (dump);
350 op->destroy ();
351 continue;
352 }
353
354 if (!op->has_active_speed ()) 332 if (!op->has_active_speed ())
355 { 333 {
356 LOG (llevError, "BUG: process_events(): Object %s has no speed (%f), " 334 LOG (llevError, "BUG: process_events(): Object %s has no speed (%f), "
357 "but is on active list\n", op->debug_desc (), op->speed); 335 "but is on active list\n", op->debug_desc (), op->speed);
358 op->set_speed (0); 336 op->set_speed (0);
359 continue; 337 continue;
360 } 338 }
361 339
362 if (op->map == NULL && op->env == NULL && op->name && op->type != MAP) 340 if (op->flag [FLAG_REMOVED])
363 { 341 {
364 LOG (llevError, "BUG: process_events(): Object without map or " 342 LOG (llevError, "BUG: process_events(): removed object is on active list: %s\n",
365 "inventory is on active list: %s (%d)\n", &op->name, op->count); 343 op->debug_desc ());
366 op->set_speed (0); 344 op->set_speed (0);
367 continue; 345 continue;
368 } 346 }
369 347
370 /* Animate the object. Bug or feature that anim_speed 348 /* Animate the object. Bug or feature that anim_speed
371 * is based on ticks, and not the creatures speed? 349 * is based on ticks, and not the creatures speed?
372 */ 350 */
373 if (op->anim_speed && op->last_anim >= op->anim_speed) 351 if (op->anim_speed && op->last_anim >= op->anim_speed)
374 { 352 {
375 if ((op->type == PLAYER)) 353 animate_object (op, op->type == PLAYER ? op->facing : op->direction);
376 animate_object (op, op->facing);
377 else
378 animate_object (op, op->direction);
379 354
380 op->last_anim = 1; 355 op->last_anim = 1;
381 } 356 }
382 else 357 else
383 op->last_anim++; 358 op->last_anim++;
439 new_draw_info_format (flags, 0, 0, "Cause for this shutdown: %s\n", cause); 414 new_draw_info_format (flags, 0, 0, "Cause for this shutdown: %s\n", cause);
440 415
441 if (make_core) 416 if (make_core)
442 new_draw_info_format (flags, 0, 0, "This is considered a crash, but all maps and players have been saved.\n"); 417 new_draw_info_format (flags, 0, 0, "This is considered a crash, but all maps and players have been saved.\n");
443 else 418 else
444 new_draw_info_format (flags, 0, 0, "This is considered to be a clean shutdown, and all maps and players have been saved.\n"); 419 new_draw_info_format (flags, 0, 0, "This is considered to be a clean shutdown, and all maps and players will be saved now.\n");
445 420
446 new_draw_info_format (flags, 0, 0, "%s\n", CLEANUP_MESSAGE); 421 new_draw_info_format (flags, 0, 0, "%s\n", CLEANUP_MESSAGE);
447 422
448 flush_sockets (); 423 flush_sockets ();
449} 424}
476 LOG (llevDebug, "cleanup done.\n"); 451 LOG (llevDebug, "cleanup done.\n");
477 452
478 if (make_core) 453 if (make_core)
479 { 454 {
480 cleanup_inform (cause, make_core); 455 cleanup_inform (cause, make_core);
456 cfperl_cleanup (make_core);
481 _exit (1); 457 _exit (1);
482 } 458 }
483 else 459 else
460 {
461 new_draw_info_format (NDI_UNIQUE | NDI_ALL | NDI_GREEN, 0, 0, "Maps and players successfully saved, exiting.\n");
462 new_draw_info_format (NDI_UNIQUE | NDI_ALL | NDI_GREEN, 0, 0, "And again: " CLEANUP_MESSAGE "\n");
463 flush_sockets ();
464 cfperl_cleanup (make_core);
484 _exit (0); 465 _exit (0);
466 }
485} 467}
486 468
487int 469int
488forbid_play (void) 470forbid_play (void)
489{ 471{
545 * done on the same tick, but that will happen very infrequently 527 * done on the same tick, but that will happen very infrequently
546 * 528 *
547 * I also think this code makes it easier to see how often we really are 529 * I also think this code makes it easier to see how often we really are
548 * doing the various things. 530 * doing the various things.
549 */ 531 */
550
551extern unsigned long todtick;
552
553void 532void
554do_specials (void) 533do_specials (void)
555{ 534{
556 if (!(pticks % PTICKS_PER_CLOCK)) 535 if (!(pticks % TICKS_PER_HOUR))
557 tick_the_clock (); 536 adjust_daylight ();
558 537
559 if (!(pticks % 7)) 538 if (!(pticks % 7))
560 shstr::gc (); 539 shstr::gc ();
561 540
562 if (!(pticks % 2503)) 541 if (!(pticks % 2503))

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines