--- deliantra/server/socket/lowlevel.C 2007/06/10 04:44:21 1.46 +++ deliantra/server/socket/lowlevel.C 2007/06/24 04:09:29 1.48 @@ -49,7 +49,8 @@ #if HAVE_TCP_INFO // check about once per second, spread evenly over all clients - if (!((pticks + fd) & 7)) + // do this only when player is active + if (!((pticks + fd) & 7) && pl && pl->active) { // check time of last ack, and, if too old, kill connection struct tcp_info tcpi; @@ -86,7 +87,7 @@ // write a nop to the socket at least every IDLE_NOP seconds. if (!outputbuffer.len) { - if (last_send + IDLE_PING <= NOW) + if (last_send + IDLE_PING <= NOW && pl && pl->active) { // this is a bit ugly, but map1/map1a seem to be the only // nop'able commands and they are quite small. @@ -512,28 +513,32 @@ send_packet (sl); } -void -client::send_drawinfo (const char *msg, int flags) -{ - send_packet_printf ("drawinfo %d %s", flags, msg); +// returns true when the message needs special (read: perl) treatment +static bool +msg_is_special (const char *msg) +{ + return msg [strcspn (msg, "<[&\n")]; } void client::send_msg (int color, const char *type, const char *msg) { - if (can_msg) + if (msg_is_special (msg)) + cfperl_send_msg (this, color, type, msg); + else if (can_msg) send_packet_printf ("msg %d %s %s", color, type, msg); else if (color < 0) return; // client cannot handle this - else if (strchr (msg, '<') || strchr (msg, '&')) - { - //TODO: should escape/modify to old syntax - send_packet_printf ("drawinfo %d %s", color, msg); - } else send_packet_printf ("drawinfo %d %s", color, msg); } +void +client::send_drawinfo (const char *msg, int flags) +{ + send_msg (flags, "log", msg); +} + /*********************************************************************** * * packet functions/utilities