Using c_move() isn't a good idea due to collision problems and overshooting because of it. For my game I send the positions using send_rate and then interpolated the positions. The only problem with this is the entities appear a bit behind each other on the clients, but on the server they are all in their right posiitons. This poses a problem in a racing game where on your comp it shows the vehicle behind you, but in reality(on the server) it's a little ahead of you. Mabye this doesn't matter much in other genres as much... I'm thinking of something to tackle this, in the meantime you can change this code to still keep them quite close... on lan you dont notice this(since you update every frame).

Code:
 
function movement_smooth() //collision box
{my.invisible = on; //ent_morph(my, "kart2.mdl");
var rotate[3]; var s_angle[3]; var old_angle[3]; var new_angle[3]; var angle_direct; var oangle_direct; var pan_factor;
var calc_angle[3]; var move[3]; var move_old[3]; var xdirect; var move_factor; var zspeed; var length;

while(1)
{
if(my != decoy_1)&&(!lan)
{
my.passable = on;

vec_set(s_angle.pan, my.server_angle);
rotate.pan = ang(s_angle.pan - my.pan); my.pan += rotate.pan * 0.4 * time;
rotate.tilt = ang(s_angle.tilt - my.tilt); my.tilt += rotate.tilt * 0.4 * time;
rotate.roll = ang(s_angle.roll - my.roll); my.roll += rotate.roll * 0.4 * time;
vec_set(old_angle.pan, my.server_angle);

vec_set(move.x, my.server_origin);
if(move_old.x != move.x){vec_set(length.x, move.x); vec_sub(length.x, my.x); vec_set(temp.x, move.x); vec_sub(temp.x, my.x); vec_to_angle(calc_angle.pan, temp.x);}
my.x += length.x * 0.6 * time;
my.y += length.y * 0.6 * time;
my.z += length.z * 0.6 * time;

if(key_v){vec_set(my.x, my.server_origin);}
if(my.fspeed < 5){vec_set(my.x, my.server_origin);}

vec_set(temp.x, nullvector);
if(my.server_origin != move_old.x){my.fspeed = vec_dist(my.server_origin, move_old.x); my.fspeed /= 2.74; zspeed = move.z - move_old.z; zspeed /= 2.74;}
if(my.tracekart){you = ptr_for_handle(my.tracekart); vec_set(you.x, my.x); if(you.spin == 0){vec_set(you.pan, my.pan);} you.z -= 27;}

vec_set(move_old.x, my.server_origin);
}
if(my != decoy_1)&&(lan)
{
my.passable = on;
vec_set(s_angle.pan, my.server_angle);
rotate.pan = ang(s_angle.pan - my.pan); my.pan += rotate.pan * 0.4 * time;
rotate.tilt = ang(s_angle.tilt - my.tilt); my.tilt += rotate.tilt * 0.4 * time;
rotate.roll = ang(s_angle.roll - my.roll); my.roll += rotate.roll * 0.4 * time;
vec_set(old_angle.pan, my.server_angle);

vec_set(move.x, my.server_origin);
if(move_old.x != move.x){vec_set(length.x, move.x); vec_sub(length.x, my.x); vec_set(temp.x, move.x); vec_sub(temp.x, my.x); vec_to_angle(calc_angle.pan, temp.x);}
my.x += length.x * 0.6 * time;
my.y += length.y * 0.6 * time;
my.z += length.z * 0.6 * time;

if(my.server_origin != move_old.x){my.fspeed = vec_dist(my.server_origin, move_old.x); my.fspeed /= 2.74; zspeed = move.z - move_old.z; zspeed /= 2.74;}
if(my.tracekart){you = ptr_for_handle(my.tracekart); vec_set(you.x, my.x); if(you.spin == 0){vec_set(you.pan, my.pan);} you.z -= 27;}

vec_set(move_old.x, my.server_origin);
}

wait(1);
}
}




Check out Silas. www.kartsilas.com

Hear my band Finding Fire - www.myspace.com/findingfire

Daily dev updates - http://kartsilas.blogspot.com/