mirror of
https://github.com/minetest/minetest.git
synced 2024-09-12 00:26:50 +02:00
Improve (re)spawn, add cache_block_before_spawn and max_spawn_height settings
This commit is contained in:
parent
000da6b25d
commit
22dbbf0a6f
@ -266,6 +266,10 @@
|
|||||||
#disable_anticheat = false
|
#disable_anticheat = false
|
||||||
# If true, actions are recorded for rollback
|
# If true, actions are recorded for rollback
|
||||||
#enable_rollback_recording = false
|
#enable_rollback_recording = false
|
||||||
|
# If true, blocks are cached (and generated if not before) before a player is spawned.
|
||||||
|
#cache_block_before_spawn = true
|
||||||
|
# Defines the maximum height a player can spawn in a map, above water level
|
||||||
|
#max_spawn_height = 50
|
||||||
|
|
||||||
# Profiler data print interval. #0 = disable.
|
# Profiler data print interval. #0 = disable.
|
||||||
#profiler_print_interval = 0
|
#profiler_print_interval = 0
|
||||||
|
@ -182,6 +182,8 @@ void set_default_settings(Settings *settings)
|
|||||||
settings->setDefault("disallow_empty_password", "false");
|
settings->setDefault("disallow_empty_password", "false");
|
||||||
settings->setDefault("disable_anticheat", "false");
|
settings->setDefault("disable_anticheat", "false");
|
||||||
settings->setDefault("enable_rollback_recording", "false");
|
settings->setDefault("enable_rollback_recording", "false");
|
||||||
|
settings->setDefault("cache_block_before_spawn", "true");
|
||||||
|
settings->setDefault("max_spawn_height", "50");
|
||||||
|
|
||||||
settings->setDefault("profiler_print_interval", "0");
|
settings->setDefault("profiler_print_interval", "0");
|
||||||
settings->setDefault("enable_mapgen_debug_info", "false");
|
settings->setDefault("enable_mapgen_debug_info", "false");
|
||||||
|
78
src/map.cpp
78
src/map.cpp
@ -3185,48 +3185,56 @@ void ServerMap::prepareBlock(MapBlock *block) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
s16 ServerMap::findGroundLevel(v2s16 p2d)
|
/**
|
||||||
|
* Get the ground level by searching for a non CONTENT_AIR node in a column from top to bottom
|
||||||
|
*/
|
||||||
|
s16 ServerMap::findGroundLevel(v2s16 p2d, bool cacheBlocks)
|
||||||
{
|
{
|
||||||
#if 0
|
|
||||||
/*
|
s16 level;
|
||||||
Uh, just do something random...
|
|
||||||
*/
|
// The reference height is the original mapgen height
|
||||||
// Find existing map from top to down
|
s16 referenceHeight = m_emerge->getGroundLevelAtPoint(p2d);
|
||||||
s16 max=63;
|
s16 maxSearchHeight = 63 + referenceHeight;
|
||||||
s16 min=-64;
|
s16 minSearchHeight = -63 + referenceHeight;
|
||||||
v3s16 p(p2d.X, max, p2d.Y);
|
v3s16 probePosition(p2d.X, maxSearchHeight, p2d.Y);
|
||||||
for(; p.Y>min; p.Y--)
|
v3s16 blockPosition = getNodeBlockPos(probePosition);
|
||||||
|
v3s16 prevBlockPosition = blockPosition;
|
||||||
|
|
||||||
|
// Cache the block to be inspected.
|
||||||
|
if(cacheBlocks) {
|
||||||
|
emergeBlock(blockPosition, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Probes the nodes in the given column
|
||||||
|
for(; probePosition.Y > minSearchHeight; probePosition.Y--)
|
||||||
{
|
{
|
||||||
MapNode n = getNodeNoEx(p);
|
if(cacheBlocks) {
|
||||||
if(n.getContent() != CONTENT_IGNORE)
|
// Calculate the block position of the given node
|
||||||
|
blockPosition = getNodeBlockPos(probePosition);
|
||||||
|
|
||||||
|
// If the node is in an different block, cache it
|
||||||
|
if(blockPosition != prevBlockPosition) {
|
||||||
|
emergeBlock(blockPosition, true);
|
||||||
|
prevBlockPosition = blockPosition;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
MapNode node = getNodeNoEx(probePosition);
|
||||||
|
if (node.getContent() != CONTENT_IGNORE &&
|
||||||
|
node.getContent() != CONTENT_AIR) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if(p.Y == min)
|
|
||||||
goto plan_b;
|
|
||||||
// If this node is not air, go to plan b
|
|
||||||
if(getNodeNoEx(p).getContent() != CONTENT_AIR)
|
|
||||||
goto plan_b;
|
|
||||||
// Search existing walkable and return it
|
|
||||||
for(; p.Y>min; p.Y--)
|
|
||||||
{
|
|
||||||
MapNode n = getNodeNoEx(p);
|
|
||||||
if(content_walkable(n.d) && n.getContent() != CONTENT_IGNORE)
|
|
||||||
return p.Y;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Move to plan b
|
// Could not determine the ground. Use map generator noise functions.
|
||||||
plan_b:
|
if(probePosition.Y == minSearchHeight) {
|
||||||
#endif
|
level = referenceHeight;
|
||||||
|
} else {
|
||||||
|
level = probePosition.Y;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
Determine from map generator noise functions
|
|
||||||
*/
|
|
||||||
|
|
||||||
s16 level = m_emerge->getGroundLevelAtPoint(p2d);
|
|
||||||
return level;
|
return level;
|
||||||
|
|
||||||
//double level = base_rock_level_2d(m_seed, p2d) + AVERAGE_MUD_AMOUNT;
|
|
||||||
//return (s16)level;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ServerMap::loadFromFolders() {
|
bool ServerMap::loadFromFolders() {
|
||||||
|
@ -428,7 +428,7 @@ public:
|
|||||||
void prepareBlock(MapBlock *block);
|
void prepareBlock(MapBlock *block);
|
||||||
|
|
||||||
// Helper for placing objects on ground level
|
// Helper for placing objects on ground level
|
||||||
s16 findGroundLevel(v2s16 p2d);
|
s16 findGroundLevel(v2s16 p2d, bool cacheBlocks);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Misc. helper functions for fiddling with directory and file
|
Misc. helper functions for fiddling with directory and file
|
||||||
|
@ -2285,8 +2285,9 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*infostream<<"Server::ProcessData(): Moved player "<<peer_id<<" to "
|
/*infostream<<"Server::ProcessData(): Moved player "<<peer_id<<" to "
|
||||||
<<"("<<position.X<<","<<position.Y<<","<<position.Z<<")"
|
<<"("<<position.X<<","<<position.Y<<","<<position.Z<<")"
|
||||||
<<" pitch="<<pitch<<" yaw="<<yaw<<std::endl;*/
|
<<" pitch="<<pitch<<" yaw="<<yaw<<std::endl;*/
|
||||||
|
|
||||||
}
|
}
|
||||||
else if(command == TOSERVER_GOTBLOCKS)
|
else if(command == TOSERVER_GOTBLOCKS)
|
||||||
{
|
{
|
||||||
@ -5318,10 +5319,10 @@ v3f findSpawnPos(ServerMap &map)
|
|||||||
-range + (myrand() % (range * 2)));
|
-range + (myrand() % (range * 2)));
|
||||||
|
|
||||||
// Get ground height at point
|
// Get ground height at point
|
||||||
s16 groundheight = map.findGroundLevel(nodepos2d);
|
s16 groundheight = map.findGroundLevel(nodepos2d, g_settings->getBool("cache_block_before_spawn"));
|
||||||
if (groundheight <= water_level) // Don't go underwater
|
if (groundheight <= water_level) // Don't go underwater
|
||||||
continue;
|
continue;
|
||||||
if (groundheight > water_level + 6) // Don't go to high places
|
if (groundheight > water_level + g_settings->getS16("max_spawn_height")) // Don't go to high places
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
nodepos = v3s16(nodepos2d.X, groundheight, nodepos2d.Y);
|
nodepos = v3s16(nodepos2d.X, groundheight, nodepos2d.Y);
|
||||||
|
Loading…
Reference in New Issue
Block a user