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.4 by elmex, Wed Feb 22 18:53:56 2006 UTC vs.
Revision 1.15 by elmex, Fri Aug 11 12:21:35 2006 UTC

1/* 1/*
2 * static char *rcsid_main_c = 2 * static char *rcsid_main_c =
3 * "$Id: main.c,v 1.4 2006/02/22 18:53:56 elmex Exp $"; 3 * "$Id: main.c,v 1.15 2006/08/11 12:21:35 elmex Exp $";
4 */ 4 */
5 5
6/* 6/*
7 CrossFire, A Multiplayer game for X-windows 7 CrossFire, A Multiplayer game for X-windows
8 8
511 exit_ob->name, exit_ob->x, exit_ob->y, exit_ob->map->path); 511 exit_ob->name, exit_ob->x, exit_ob->y, exit_ob->map->path);
512 return; 512 return;
513 } 513 }
514 *sourcemap++ = '\0'; 514 *sourcemap++ = '\0';
515 515
516 /* If we are not coming from a template map, we can use reletive directories 516 /* If we are not coming from a template map, we can use relative directories
517 * for the map to generate from. 517 * for the map to generate from.
518 */ 518 */
519 if (!exit_ob->map->template) { 519 if (!exit_ob->map->template) {
520 sourcemap = path_combine_and_normalize(exit_ob->map->path, sourcemap); 520 sourcemap = path_combine_and_normalize(exit_ob->map->path, sourcemap);
521 } 521 }
785 else 785 else
786 newmap = ready_map_name(EXIT_PATH(exit_ob), 0); 786 newmap = ready_map_name(EXIT_PATH(exit_ob), 0);
787 } 787 }
788 if (!newmap) 788 if (!newmap)
789 { 789 {
790 if (exit_ob->name)
790 new_draw_info_format(NDI_UNIQUE, 0, op, "The %s is closed.", exit_ob->name); 791 new_draw_info_format(NDI_UNIQUE, 0, op, "The %s is closed.", exit_ob->name);
792 /* don't cry to momma if name is not set - as in tmp objects
793 * used by the savebed code and character creation */
791 return; 794 return;
792 } 795 }
793 796
794 /* This supports the old behaviour, but it really should not be used. 797 /* This supports the old behaviour, but it really should not be used.
795 * I will note for example that with this method, it is impossible to 798 * I will note for example that with this method, it is impossible to
936 if ((pl->last_save_tick+AUTOSAVE)<pticks && pl->state==ST_PLAYING) { 939 if ((pl->last_save_tick+AUTOSAVE)<pticks && pl->state==ST_PLAYING) {
937 /* Don't save the player on unholy ground. Instead, increase the 940 /* Don't save the player on unholy ground. Instead, increase the
938 * tick time so it will be about 10 seconds before we try and save 941 * tick time so it will be about 10 seconds before we try and save
939 * again. 942 * again.
940 */ 943 */
941 if (get_map_flags(pl->ob->map, NULL, pl->ob->x, pl->ob->y, NULL, NULL) & P_NO_CLERIC) { 944// if (get_map_flags(pl->ob->map, NULL, pl->ob->x, pl->ob->y, NULL, NULL) & P_NO_CLERIC) {
942 pl->last_save_tick += 100; 945// pl->last_save_tick += 100;
943 } else { 946// } else {
944 save_player(pl->ob,1); 947 save_player(pl->ob,1);
945 pl->last_save_tick = pticks; 948 pl->last_save_tick = pticks;
946 } 949// }
947 } 950 }
948#endif 951#endif
949 } /* end of for loop for all the players */ 952 } /* end of for loop for all the players */
950 } /* for flag */ 953 } /* for flag */
951 for(pl=first_player;pl!=NULL;pl=pl->next) { 954 for(pl=first_player;pl!=NULL;pl=pl->next) {
1086 continue; 1089 continue;
1087 1090
1088 /* Animate the object. Bug of feature that andim_speed 1091 /* Animate the object. Bug of feature that andim_speed
1089 * is based on ticks, and not the creatures speed? 1092 * is based on ticks, and not the creatures speed?
1090 */ 1093 */
1091 if (op->anim_speed && op->last_anim >= op->anim_speed) { 1094 if (op->anim_speed && op->last_anim >= op->anim_speed)
1095 {
1096 if ((op->type==PLAYER)||(op->type==MONSTER))
1097 animate_object(op, op->facing);
1098 else
1092 animate_object (op, op->direction); 1099 animate_object (op, op->direction);
1100
1093 op->last_anim = 1; 1101 op->last_anim = 1;
1094 } else { 1102 }
1103 else
1095 op->last_anim++; 1104 op->last_anim++;
1096 }
1097 1105
1098 if (op->speed_left > 0) { 1106 if (op->speed_left > 0) {
1099#if 0 1107#if 0
1100 /* I've seen occasional crashes in move_symptom() with it 1108 /* I've seen occasional crashes in move_symptom() with it
1101 * crashing because op is removed - add some debugging to 1109 * crashing because op is removed - add some debugging to
1184#endif 1192#endif
1185 exit(0); 1193 exit(0);
1186} 1194}
1187 1195
1188void leave(player *pl, int draw_exit) { 1196void leave(player *pl, int draw_exit) {
1189 char buf[MAX_BUF];
1190
1191 if (pl!=NULL) { 1197 if (pl != NULL) {
1192 /* We do this so that the socket handling routine can do the final 1198 /* We do this so that the socket handling routine can do the final
1193 * cleanup. We also leave that loop to actually handle the freeing 1199 * cleanup. We also leave that loop to actually handle the freeing
1194 * of the data. 1200 * of the data.
1195 */ 1201 */
1196 if (draw_exit==0) 1202 if (pl->ob->type != DEAD_OBJECT)
1197 { 1203 {
1198 } 1204 execute_global_event (EVENT_LOGOUT, pl, pl->socket.host);
1199 pl->socket.status=Ns_Dead;
1200 LOG(llevInfo,"LOGOUT: Player named %s from ip %s\n", pl->ob->name, 1205 LOG (llevInfo,"LOGOUT: Player named %s from ip %s\n", pl->ob->name, pl->socket.host);
1201 pl->socket.host);
1202 1206
1203 (void) sprintf(buf,"%s left the game.",pl->ob->name); 1207 pl->socket.status = Ns_Dead;
1204 if (pl->ob->map) { 1208
1205 if (pl->ob->map->in_memory==MAP_IN_MEMORY)
1206 pl->ob->map->timeout = MAP_TIMEOUT(pl->ob->map);
1207 pl->ob->map->players--;
1208 pl->ob->map=NULL;
1209 }
1210 pl->ob->type = DEAD_OBJECT; /* To avoid problems with inventory window */
1211 }
1212 /* If a hidden dm dropped connection do not create 1209 /* If a hidden dm dropped connection do not create
1213 * inconsistencies by showing that they have left the game 1210 * inconsistencies by showing that they have left the game
1214 */ 1211 */
1215 if (!(QUERY_FLAG(pl->ob,FLAG_WIZ) && pl->ob->contr->hidden) && 1212 if (!(QUERY_FLAG(pl->ob,FLAG_WIZ) && pl->ob->contr->hidden)
1216 (pl!=NULL && draw_exit) && 1213 && draw_exit
1217 (pl->state != ST_GET_NAME && pl->state!=ST_GET_PASSWORD && pl->state != ST_CONFIRM_PASSWORD)) 1214 && (pl->state != ST_GET_NAME && pl->state!=ST_GET_PASSWORD && pl->state != ST_CONFIRM_PASSWORD))
1215 {
1216 char buf[MAX_BUF];
1217 sprintf (buf, "%s left the game.", pl->ob->name);
1218 new_draw_info(NDI_UNIQUE | NDI_ALL | NDI_DK_ORANGE, 5, NULL, buf); 1218 new_draw_info(NDI_UNIQUE | NDI_ALL | NDI_DK_ORANGE, 5, NULL, buf);
1219 }
1220
1221 if (!QUERY_FLAG (pl->ob, FLAG_REMOVED))
1222 leave_map (pl->ob);
1223
1224 pl->ob->type = DEAD_OBJECT; /* To avoid problems with inventory window */
1225 }
1226 }
1219} 1227}
1220 1228
1221int forbid_play(void) 1229int forbid_play(void)
1222{ 1230{
1223#if !defined(_IBMR2) && !defined(___IBMR2) && defined(PERM_FILE) 1231#if !defined(_IBMR2) && !defined(___IBMR2) && defined(PERM_FILE)
1336 doeric_server(); 1344 doeric_server();
1337 process_events(NULL); /* "do" something with objects with speed */ 1345 process_events(NULL); /* "do" something with objects with speed */
1338 cftimer_process_timers();/* Process the crossfire Timers */ 1346 cftimer_process_timers();/* Process the crossfire Timers */
1339 /* Lauwenmark : Here we handle the CLOCK global event */ 1347 /* Lauwenmark : Here we handle the CLOCK global event */
1340 execute_global_event(EVENT_CLOCK); 1348 execute_global_event(EVENT_CLOCK);
1349 flush_sockets();
1341 check_active_maps(); /* Removes unused maps after a certain timeout */ 1350 check_active_maps(); /* Removes unused maps after a certain timeout */
1342 do_specials(); /* Routines called from time to time. */ 1351 do_specials(); /* Routines called from time to time. */
1343 1352
1344 sleep_delta(); /* Slepp proper amount of time before next tick */ 1353 sleep_delta(); /* Slepp proper amount of time before next tick */
1345 } 1354 }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines