*
* Known contributors to this file:
* Marc Olzheim, 2004
- * Markus Armbruster, 2004-2011
+ * Markus Armbruster, 2004-2012
*/
/*
"Maximum number of BTUs a country can have")
EMPCFBOTH("max_idle", max_idle, int, NSC_INT, 0,
"Maximum number of minutes a player can sit idle while logged in")
+EMPCFBOTH("login_grace_time", login_grace_time, int, NSC_INT, 0,
+ "Grace time for clients to complete login and logout (seconds)")
EMPCFBOTH("players_at_00", players_at_00, int, NSC_INT, 0,
"Players have their coordinate system at deity 0,0 (0 - no, 1 - yes)")
EMPCFBOTH("at_least_one_100", at_least_one_100, int, NSC_INT, KM_INTERNAL,
extern struct player *player_prev(struct player *);
extern struct player *getplayer(natid);
extern void player_accept(void *);
+extern time_t player_io_deadline(struct player *, int);
/* dispatch.c */
extern int dispatch(char *, char *);
/* empdis.c */
* Known contributors to this file:
* Ken Stevens, 1995
* Steve McClure, 1996
- * Markus Armbruster, 2004-2011
+ * Markus Armbruster, 2004-2012
*/
#include <config.h>
char *game_hours = ""; /* hours game is running */
char *pre_update_hook = "";
int max_idle = 15; /* session dies after max_idle minutes idle */
+int login_grace_time = 120; /* Grace time for completing login (sec) */
int sect_mob_max = 127; /* sector mobility limits */
float sect_mob_scale = 1.0; /* accumulation multiplier */
if (lp->iop) {
/* it's a real player */
- io_close(lp->iop, player->curup + minutes(max_idle));
+ io_close(lp->iop, player->curup + login_grace_time);
lp->iop = NULL;
}
back = (struct player *)lp->queue.q_back;
return NULL;
}
+time_t
+player_io_deadline(struct player *pl, int write)
+{
+ if (pl->may_sleep < (write ? PLAYER_SLEEP_FREELY : PLAYER_SLEEP_ON_INPUT))
+ return 0;
+ if (pl->state != PS_PLAYING)
+ return pl->curup + login_grace_time;
+ return pl->curup + minutes(max_idle);
+}
+
/*ARGSUSED*/
void
player_accept(void *unused)
pr_id(player, C_INIT, "Empire server ready\n");
for (;;) {
- deadline = player->curup + minutes(max_idle);
+ deadline = player_io_deadline(player, 0);
if (io_outputwaiting(player->iop)) {
if (io_output(player->iop, deadline) <= 0)
break;
#include "empio.h"
#include "journal.h"
-#include "optlist.h"
#include "player.h"
#include "prototypes.h"
* Flush all queued output before potentially sleeping in
* io_input(), to make sure player sees the prompt.
*/
- deadline = player->curup + minutes(max_idle);
- if (player->may_sleep < PLAYER_SLEEP_ON_INPUT)
- deadline = 0;
+ deadline = player_io_deadline(player, 0);
while (io_output(player->iop, deadline) > 0)
;
/*
- * Try to receive some input. Need to check player->may_sleep
- * again; command abortion during io_output() might have
- * changed it.
+ * Try to receive some input. Need to recompute deadline;
+ * command abortion during io_output() might have changed it.
*/
- deadline = player->curup + minutes(max_idle);
- if (player->may_sleep < PLAYER_SLEEP_ON_INPUT)
- deadline = 0;
+ deadline = player_io_deadline(player, 0);
res = io_input(player->iop, deadline);
if (res > 0)
;
#include "journal.h"
#include "misc.h"
#include "nat.h"
-#include "optlist.h"
#include "player.h"
#include "proto.h"
#include "prototypes.h"
static void
player_output_some(void)
{
- time_t deadline;
+ time_t deadline = player_io_deadline(player, 1);
- deadline = player->curup + minutes(max_idle);
- if (player->may_sleep != PLAYER_SLEEP_FREELY)
- deadline = 0;
while (io_output_if_queue_long(player->iop, deadline) > 0)
;
}