forked from oerkki/voxelands
some optimisations to searchNear*
This commit is contained in:
parent
6d355b4aab
commit
2c6f916c4e
|
@ -732,16 +732,33 @@ static void getMob_dungeon_master(Settings &properties)
|
|||
|
||||
bool ServerEnvironment::searchNear(v3s16 pos, v3s16 radius_min, v3s16 radius_max, std::vector<content_t> c, v3s16 *found)
|
||||
{
|
||||
v3s16 blockpos = getNodeBlockPos(pos);
|
||||
MapBlock *block = m_map->getBlockNoCreateNoEx(blockpos);
|
||||
if (block == NULL)
|
||||
return false;
|
||||
v3s16 relpos = blockpos*MAP_BLOCKSIZE;
|
||||
v3s16 p;
|
||||
v3s16 bp;
|
||||
|
||||
for(s16 x=-radius_min.X; x<=radius_max.X; x++) {
|
||||
for(s16 y=-radius_min.Y; y<=radius_max.Y; y++) {
|
||||
for(s16 z=-radius_min.Z; z<=radius_max.Z; z++) {
|
||||
if (!x && !y && !z)
|
||||
continue;
|
||||
MapNode n_test = m_map->getNodeNoEx(pos+v3s16(x,y,z));
|
||||
p = pos+v3s16(x,y,z);
|
||||
MapNode n_test;
|
||||
bp = getNodeBlockPos(p);
|
||||
if (p == blockpos) {
|
||||
n_test = block->getNodeNoCheck(p-relpos);
|
||||
}else{
|
||||
MapBlock *b = m_map->getBlockNoCreateNoEx(bp);
|
||||
if (b)
|
||||
n_test = b->getNodeNoEx(p-(bp*MAP_BLOCKSIZE));
|
||||
}
|
||||
for (std::vector<content_t>::iterator i=c.begin(); i != c.end(); i++) {
|
||||
if (n_test.getContent() == *i) {
|
||||
if (found != NULL)
|
||||
*found = pos+v3s16(x,y,z);
|
||||
*found = p;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@ -753,12 +770,28 @@ bool ServerEnvironment::searchNear(v3s16 pos, v3s16 radius_min, v3s16 radius_max
|
|||
|
||||
bool ServerEnvironment::searchNearInv(v3s16 pos, v3s16 radius_min, v3s16 radius_max, std::vector<content_t> c, v3s16 *found)
|
||||
{
|
||||
v3s16 blockpos = getNodeBlockPos(pos);
|
||||
MapBlock *block = m_map->getBlockNoCreateNoEx(blockpos);
|
||||
if (block == NULL)
|
||||
return false;
|
||||
v3s16 relpos = blockpos*MAP_BLOCKSIZE;
|
||||
v3s16 p;
|
||||
v3s16 bp;
|
||||
for(s16 x=radius_min.X; x<=radius_max.X; x++) {
|
||||
for(s16 y=radius_min.Y; y<=radius_max.Y; y++) {
|
||||
for(s16 z=radius_min.Z; z<=radius_max.Z; z++) {
|
||||
if (!x && !y && !z)
|
||||
continue;
|
||||
MapNode n_test = m_map->getNodeNoEx(pos+v3s16(x,y,z));
|
||||
p = pos+v3s16(x,y,z);
|
||||
MapNode n_test;
|
||||
bp = getNodeBlockPos(p);
|
||||
if (p == blockpos) {
|
||||
n_test = block->getNodeNoCheck(p-relpos);
|
||||
}else{
|
||||
MapBlock *b = m_map->getBlockNoCreateNoEx(bp);
|
||||
if (b)
|
||||
n_test = b->getNodeNoEx(p-(bp*MAP_BLOCKSIZE));
|
||||
}
|
||||
bool s = false;
|
||||
for (std::vector<content_t>::iterator i=c.begin(); i != c.end(); i++) {
|
||||
if (n_test.getContent() == *i) {
|
||||
|
@ -768,7 +801,7 @@ bool ServerEnvironment::searchNearInv(v3s16 pos, v3s16 radius_min, v3s16 radius_
|
|||
}
|
||||
if (!s) {
|
||||
if (found != NULL)
|
||||
*found = pos+v3s16(x,y,z);
|
||||
*found = p;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue