Skip to content

Commit

Permalink
Objectpos over limit: Avoid crash caused by sector over limit
Browse files Browse the repository at this point in the history
Reduce the object limit by mapblock size, to avoid objects being
added just inside the map generation limit but in a block and sector
that extend beyond the map generation limit.

Change notification of 'objectpos over limit' from red in-chat ERROR
to in-terminal only WARNING, since this will happen often using mob
mods near the world's edge.
  • Loading branch information
paramat committed Feb 16, 2017
1 parent 2dcbc01 commit 3955f51
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 9 deletions.
20 changes: 12 additions & 8 deletions src/mapblock.h
Expand Up @@ -669,14 +669,18 @@ typedef std::vector<MapBlock*> MapBlockVect;

inline bool objectpos_over_limit(v3f p)
{
const float map_gen_limit_bs = MYMIN(MAX_MAP_GENERATION_LIMIT,
g_settings->getU16("map_generation_limit")) * BS;
return (p.X < -map_gen_limit_bs
|| p.X > map_gen_limit_bs
|| p.Y < -map_gen_limit_bs
|| p.Y > map_gen_limit_bs
|| p.Z < -map_gen_limit_bs
|| p.Z > map_gen_limit_bs);
// MAP_BLOCKSIZE must be subtracted to avoid an object being spawned just
// within the map generation limit but in a block and sector that extend
// beyond the map generation limit.
// This avoids crashes caused by sector over limit in createSector().
const float object_limit = (MYMIN(MAX_MAP_GENERATION_LIMIT,
g_settings->getU16("map_generation_limit")) - MAP_BLOCKSIZE) * BS;
return (p.X < -object_limit
|| p.X > object_limit
|| p.Y < -object_limit
|| p.Y > object_limit
|| p.Z < -object_limit
|| p.Z > object_limit);
}

/*
Expand Down
2 changes: 1 addition & 1 deletion src/serverenvironment.cpp
Expand Up @@ -1667,7 +1667,7 @@ u16 ServerEnvironment::addActiveObjectRaw(ServerActiveObject *object,

if (objectpos_over_limit(object->getBasePosition())) {
v3f p = object->getBasePosition();
errorstream << "ServerEnvironment::addActiveObjectRaw(): "
warningstream << "ServerEnvironment::addActiveObjectRaw(): "
<< "object position (" << p.X << "," << p.Y << "," << p.Z
<< ") outside maximum range" << std::endl;
if (object->environmentDeletes())
Expand Down

0 comments on commit 3955f51

Please sign in to comment.