--- deliantra/server/socket/image.C 2007/03/14 16:23:26 1.33 +++ deliantra/server/socket/image.C 2007/04/10 09:35:24 1.40 @@ -257,13 +257,15 @@ faces_sent[facenum] = true; + // if for some reason we let a client without face caching connect, + // we better support that decision here and implement it. if (!facecache) + return send_image (facenum); + + if (fxix) { - send_drawinfo ( - "*** Please enable image/face caching in preferences or use a client that supports it.\n", - NDI_RED - ); - return send_image (facenum); + fxface.push_back (facenum); + return; } packet sl; @@ -279,17 +281,62 @@ print_facename (sl, *d); send_packet (sl); - faceinfo *f = face_info (facenum); - if (f->smooth && EMI_smooth) + if (EMI_smooth) { - send_face (f->smooth); + faceinfo *f = face_info (facenum); - packet sl ("smooth"); + if (f->smooth) + { + send_face (f->smooth); - sl << uint16 (facenum) - << uint16 (f->smooth); + packet sl ("smooth"); - send_packet (sl); + sl << uint16 (facenum) + << uint16 (f->smooth); + + send_packet (sl); + } + } +} + +void client::flush_fx () +{ + while (!fxface.empty ()) + { + packet fx ("fx"); + packet sx ("sx"); + + do + { + faceidx facenum = fxface.back (); fxface.pop_back (); + + const facedata *d = face_data (facenum, faceset); + + if (d) + { + fx << ber32 (facenum) + << data8 (d->chksum, CHKSUM_SIZE); + + if (smoothing) + { + faceinfo *f = face_info (facenum); + + if (f->smooth) + { + send_face (f->smooth); + sx << ber32 (facenum) + << ber32 (f->smooth) + << ber32 (f->smoothlevel); + } + } + } + } + while (!fxface.empty () + && fx.room () > ber32::size + CHKSUM_SIZE + 1 + && sx.room () > ber32::size * 3); + + send_packet (fx); + if (sx.length () > 3) send_packet (sx); } } @@ -308,6 +355,11 @@ return; } + faces_sent[facenum] = true; + + if (force_image_newmap) + force_newmap = true; + packet sl; sl << (image2 ? "image2 " : "image ")