#include "environment.h"
#include "map.h"
#include "emerge.h"
-#include "serverobject.h" // TODO this is used for cleanup of only
+#include "content_sao.h" // TODO this is used for cleanup of only
#include "log.h"
#include "util/srp.h"
if (player == NULL)
return;
+ PlayerSAO *sao = player->getPlayerSAO();
+ if (sao == NULL)
+ return;
+
// Won't send anything if already sending
if(m_blocks_sending.size() >= g_settings->getU16
("max_simultaneous_block_sends_per_client"))
return;
}
- v3f playerpos = player->getPosition();
+ v3f playerpos = sao->getBasePosition();
v3f playerspeed = player->getSpeed();
v3f playerspeeddir(0,0,0);
if(playerspeed.getLength() > 1.0*BS)
v3s16 center = getNodeBlockPos(center_nodepos);
// Camera position and direction
- v3f camera_pos = player->getEyePosition();
+ v3f camera_pos = sao->getEyePosition();
v3f camera_dir = v3f(0,0,1);
- camera_dir.rotateYZBy(player->getPitch());
- camera_dir.rotateXZBy(player->getYaw());
+ camera_dir.rotateYZBy(sao->getPitch());
+ camera_dir.rotateXZBy(sao->getYaw());
/*infostream<<"camera_dir=("<<camera_dir.X<<","<<camera_dir.Y<<","
<<camera_dir.Z<<")"<<std::endl;*/
*/
s32 new_nearest_unsent_d = -1;
- const s16 full_d_max = g_settings->getS16("max_block_send_distance");
+ // get view range and camera fov from the client
+ s16 wanted_range = sao->getWantedRange();
+ float camera_fov = sao->getFov();
+ // if FOV, wanted_range are not available (old client), fall back to old default
+ if (wanted_range <= 0) wanted_range = 1000;
+ if (camera_fov <= 0) camera_fov = (72.0*M_PI/180) * 4./3.;
+
+ const s16 full_d_max = MYMIN(g_settings->getS16("max_block_send_distance"), wanted_range);
+ const s16 d_opt = MYMIN(g_settings->getS16("block_send_optimize_distance"), wanted_range);
+ const s16 d_blocks_in_sight = full_d_max * BS * MAP_BLOCKSIZE;
+ //infostream << "Fov from client " << camera_fov << " full_d_max " << full_d_max << std::endl;
+
s16 d_max = full_d_max;
- s16 d_max_gen = g_settings->getS16("max_block_generate_distance");
+ s16 d_max_gen = MYMIN(g_settings->getS16("max_block_generate_distance"), wanted_range);
// Don't loop very much at a time
s16 max_d_increment_at_time = 2;
// If this is true, inexistent block will be made from scratch
bool generate = d <= d_max_gen;
- {
- /*// Limit the generating area vertically to 2/3
- if(abs(p.Y - center.Y) > d_max_gen - d_max_gen / 3)
- generate = false;*/
-
- // Limit the send area vertically to 1/2
- if (abs(p.Y - center.Y) > full_d_max / 2)
- continue;
- }
-
/*
Don't generate or send if not in sight
FIXME This only works if the client uses a small enough
FOV setting. The default of 72 degrees is fine.
*/
- float camera_fov = (72.0*M_PI/180) * 4./3.;
- if(isBlockInSight(p, camera_pos, camera_dir, camera_fov, 10000*BS) == false)
+ if(isBlockInSight(p, camera_pos, camera_dir, camera_fov, d_blocks_in_sight) == false)
{
continue;
}
Block is near ground level if night-time mesh
differs from day-time mesh.
*/
- if(d >= 4)
+ if(d >= d_opt)
{
if(block->getDayNightDiff() == false)
continue;
} else if(nearest_emergefull_d != -1){
new_nearest_unsent_d = nearest_emergefull_d;
} else {
- if(d > g_settings->getS16("max_block_send_distance")){
+ if(d > full_d_max){
new_nearest_unsent_d = 0;
m_nothing_to_send_pause_timer = 2.0;
} else {