From 3891bc43e084b9bd1c345638dfbbffa9d71658c9 Mon Sep 17 00:00:00 2001 From: Perttu Ahola Date: Mon, 17 Jan 2011 02:40:53 +0200 Subject: fine-tuning of map generator and server and stuff. --- src/server.cpp | 55 ++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 46 insertions(+), 9 deletions(-) (limited to 'src/server.cpp') diff --git a/src/server.cpp b/src/server.cpp index da643339b..3b3dfb657 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -328,6 +328,13 @@ void RemoteClient::GetNextBlocks(Server *server, float dtime, v3s16 center_nodepos = floatToInt(playerpos); v3s16 center = getNodeBlockPos(center_nodepos); + + // Camera position and direction + v3f camera_pos = + playerpos + v3f(0, BS+BS/2, 0); + v3f camera_dir = v3f(0,0,1); + camera_dir.rotateYZBy(player->getPitch()); + camera_dir.rotateXZBy(player->getYaw()); /* Get the starting value of the block finder radius. @@ -496,6 +503,15 @@ void RemoteClient::GetNextBlocks(Server *server, float dtime, if(abs(p.Y - center.Y) > d_max_gen - d_max_gen / 3) generate = false; } + + /* + Don't draw if not in sight + */ + + if(isBlockInSight(p, camera_pos, camera_dir, 10000*BS) == false) + { + continue; + } /* Don't send already sent blocks @@ -511,6 +527,7 @@ void RemoteClient::GetNextBlocks(Server *server, float dtime, { /* Ignore block if it is not at ground surface + but don't ignore water surface blocks */ v2s16 p2d(p.X*MAP_BLOCKSIZE + MAP_BLOCKSIZE/2, p.Z*MAP_BLOCKSIZE + MAP_BLOCKSIZE/2); @@ -519,7 +536,8 @@ void RemoteClient::GetNextBlocks(Server *server, float dtime, if(y > GROUNDHEIGHT_VALID_MINVALUE) { f32 by = p.Y*MAP_BLOCKSIZE + MAP_BLOCKSIZE/2; - if(fabs(by - y) > MAP_BLOCKSIZE + MAP_BLOCKSIZE/3) + if(fabs(by - y) > MAP_BLOCKSIZE + MAP_BLOCKSIZE/3 + && fabs(by - WATER_LEVEL) >= MAP_BLOCKSIZE) continue; } } @@ -839,8 +857,11 @@ void RemoteClient::GotBlock(v3s16 p) if(m_blocks_sending.find(p) != NULL) m_blocks_sending.remove(p); else - dstream<<"RemoteClient::GotBlock(): Didn't find in" - " m_blocks_sending"< GROUNDHEIGHT_VALID_MINVALUE); // Don't go underwater if(groundheight < WATER_LEVEL) + { + //dstream<<"-> Underwater"<emergeBlock(blockpos); // Don't go inside ground try{ - v3s16 footpos(nodepos.X, groundheight+1, nodepos.Y); - v3s16 headpos(nodepos.X, groundheight+2, nodepos.Y); + /*v3s16 footpos(nodepos.X, groundheight+1, nodepos.Y); + v3s16 headpos(nodepos.X, groundheight+2, nodepos.Y);*/ + v3s16 footpos = nodepos3d + v3s16(0,0,0); + v3s16 headpos = nodepos3d + v3s16(0,1,0); if(m_env.getMap().getNode(footpos).d != CONTENT_AIR || m_env.getMap().getNode(headpos).d != CONTENT_AIR) { + dstream<<"-> Inside ground"< Invalid position"<