--- deliantra/server/socket/loop.C 2007/07/01 04:08:14 1.54
+++ deliantra/server/socket/loop.C 2007/07/24 04:55:35 1.61
@@ -1,23 +1,22 @@
/*
- * This file is part of Crossfire TRT, the Multiplayer Online Role Playing Game.
+ * This file is part of Crossfire TRT, the Roguelike Realtime MORPG.
*
* Copyright (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Crossfire TRT team
* Copyright (©) 2002-2003,2007 Mark Wedel & The Crossfire Development Team
* Copyright (©) 1992,2007 Frank Tore Johansen
*
- * Crossfire TRT is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the Free
- * Software Foundation; either version 2 of the License, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with Crossfire TRT; if not, write to the Free Software Foundation, Inc. 51
- * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * Crossfire TRT is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
*
* The authors can be reached via e-mail to
*/
@@ -169,7 +168,7 @@
if (!faces_sent [scrub_idx])
{
- send_face (scrub_idx);
+ send_face (scrub_idx, -120);
flush_fx ();
bg_scrub = 1; // send up to one face per tick, unless an image was requested
@@ -179,7 +178,7 @@
rate_avail = max_rate - outputbuffer_len ();
}
- else
+ else if (!outq) // only send when bandwidth allows it
{
int ol = outputbuffer_len ();
@@ -202,14 +201,21 @@
{
if (fxix)
{
- // 9 bytes is enough for fx_FFFOOO, 40 leaves some room for image data
- int chunk = min (min (avail - 40, MAXSOCKBUF - 9), ix.ofs);
+ // only transfer something if the amount of data transferred
+ // has a healthy relation to the header overhead
+ if (avail <= 40)
+ break;
+
+ // 9 bytes is enough for fx_FFFOOO
+ int chunk = min (min (avail, MAXSOCKBUF - 9), (int)ix.ofs);
if (chunk <= 0)
break;
ix.ofs -= chunk;
+ //fprintf (stderr, "i%dx %6d: %5d+%4d (%4d)\n", fxix, ix.idx,ix.ofs,chunk, ixface.size());//D
+
packet sl ("ix");
sl << ber32 (ix.idx)
@@ -227,7 +233,7 @@
else
ix.ofs = 0;
- int consumed = ol - outputbuffer_len ();
+ int consumed = outputbuffer_len () - ol;
avail -= consumed;
rate_avail -= consumed;
@@ -237,6 +243,7 @@
if (!ix.ofs)
{
ixface.pop_back ();
+
if (ixface.empty ())
break;
}