--- deliantra/server/socket/loop.C 2009/10/12 14:00:59 1.82 +++ deliantra/server/socket/loop.C 2012/01/03 11:25:37 1.92 @@ -1,9 +1,7 @@ /* * This file is part of Deliantra, the Roguelike Realtime MMORPG. * - * Copyright (©) 2005,2006,2007,2008 Marc Alexander Lehmann / Robin Redeker / the Deliantra team - * Copyright (©) 2002-2003,2007 Mark Wedel & The Crossfire Development Team - * Copyright (©) 1992,2007 Frank Tore Johansen + * Copyright (©) 2005,2006,2007,2008,2009,2010,2011,2012 Marc Alexander Lehmann / Robin Redeker / the Deliantra team * * Deliantra is free software: you can redistribute it and/or modify it under * the terms of the Affero GNU General Public License as published by the @@ -45,8 +43,6 @@ #include #include -#include - #define BG_SCRUB_RATE 4 // how often to send a face in the background #define MAX_QUEUE_DEPTH 50 @@ -69,7 +65,6 @@ if (cmd_queue.size () >= MAX_QUEUE_DEPTH) { - //TODO: just disconnect here? reset_state (); send_packet_printf ("drawinfo %d command queue overflow, ignoring.", NDI_RED); } @@ -128,8 +123,12 @@ /* Update the players stats once per tick. More efficient than * sending them whenever they change, and probably just as useful */ + pl->need_updated_stats (); esrv_update_stats (pl); + if (pl->ns->update_spells) + esrv_update_spells (pl); + sint32 weight = pl->ob->client_weight (); if (last_weight != weight) @@ -181,13 +180,14 @@ } #endif - rate_avail = min (max_rate + mss, rate_avail + max_rate); + // limit budget surplus/deficit by one mss, add per-tick budget + rate_avail = min (rate_avail, mss) + max_rate; int max_send = rate_avail; #if HAVE_TCP_INFO // further restrict the available bandwidth by the excess bandwidth available - max_send = min (max_send, (tcpi.tcpi_snd_cwnd - tcpi.tcpi_unacked + tcpi.tcpi_sacked) * mss); + min_it (max_send, (tcpi.tcpi_snd_cwnd - tcpi.tcpi_unacked + tcpi.tcpi_sacked) * mss); #endif // round to next-lowest mss @@ -247,7 +247,7 @@ sl << ber32 (ix.idx) << ber32 (ix.ofs) - << data (d->data.data () + ix.ofs, chunk); + << data (d->data + ix.ofs, chunk); send_packet (sl); } @@ -268,14 +268,14 @@ } void -client::flush_sockets (void) +client::flush_sockets () { for (sockvec::iterator i = clients.begin (); i != clients.end (); ++i) (*i)->flush (); } void -client::clock (void) +client::clock () { for (sockvec::iterator i = clients.begin (); i != clients.end (); ++i) (*i)->tick ();