--- deliantra/server/socket/lowlevel.C 2006/12/19 04:58:05 1.26 +++ deliantra/server/socket/lowlevel.C 2007/01/06 14:42:31 1.30 @@ -1,6 +1,7 @@ /* CrossFire, A Multiplayer game for X-windows + Copyright (C) 2005, 2006, 2007 Marc Lehmann & Crossfire+ Development Team Copyright (C) 1992 Frank Tore Johansen This program is free software; you can redistribute it and/or modify @@ -53,6 +54,9 @@ void client::flush () { + if (destroyed ()) + return; + #ifdef __linux__ // check time of last ack, and, if too old, kill connection struct tcp_info tcpi; @@ -189,7 +193,6 @@ {"examine", PC(ExamineCmd) PF_PLAYING }, {"apply", PC(ApplyCmd) PF_PLAYING }, - {"reply", PC(ReplyCmd) 0 }, {"lookat", PC(LookAt) PF_PLAYING }, {"lock", PC(LockItem) PF_PLAYING }, {"mark", PC(MarkItem) PF_PLAYING }, @@ -198,6 +201,7 @@ {"mapredraw", PC(MapRedrawCmd) 0 }, /* Added: phil */ {"mapinfo", PC(MapInfoCmd) 0 }, /* CF+ */ + {"reply", SC(ReplyCmd) 0 }, {"exti", SC(ExtiCmd) 0 }, /* CF+ */ {"addme", SC(AddMeCmd) 0 }, {"askface", SC(SendFaceCmd) 0 }, /* Added: phil */ @@ -215,7 +219,7 @@ client::may_execute (const packet_type *pkt) const { return (!(pkt->flags & PF_PLAYER) || pl) - && (!(pkt->flags & PF_PLAYING) || (pl && pl->state == ST_PLAYING)); + && (!(pkt->flags & PF_PLAYING) || state == ST_PLAYING); } void @@ -296,7 +300,7 @@ client::socket_cb (iow &w, int got) { //TODO remove when we have better socket cleanup logic - if (status == Ns_Dead) + if (destroyed ()) { socket_ev.poll (0); return; @@ -382,7 +386,7 @@ char *pos = buf; int amt = 0; - if (status == Ns_Dead || !buf) + if (destroyed () || !buf) return; if ((len + outputbuffer.len) > SOCKETBUFSIZE) @@ -423,7 +427,7 @@ void client::send_packet (packet &sl) { - if (status == Ns_Dead) + if (destroyed ()) return; if (sl.length () >= MAXSOCKBUF) @@ -480,6 +484,15 @@ * **********************************************************************/ +packet::packet (const char *name) +{ + reset (); + + int len = strlen (name); + memcpy (cur, name, len); cur += len; + *cur++ = ' '; +} + packet &packet::operator <<(const data &v) { if (room () < v.len)