Files
minecraft-pe-0.6.1/src/world/level/Region.cpp
2026-03-02 22:04:18 +03:00

141 lines
3.8 KiB
C++
Executable File

#include "Region.h"
#include "chunk/LevelChunk.h"
#include "material/Material.h"
#include "tile/Tile.h"
#include "Level.h"
Region::Region(Level* level, int x1, int y1, int z1, int x2, int y2, int z2) {
this->level = level;
xc1 = x1 >> 4;
zc1 = z1 >> 4;
int xc2 = x2 >> 4;
int zc2 = z2 >> 4;
size_x = xc2 - xc1 + 1;
size_z = zc2 - zc1 + 1;
chunks = new LevelChunk**[size_x];
for (int i = 0; i < size_x; ++i)
chunks[i] = new LevelChunk*[size_z];
for (int xc = xc1; xc <= xc2; xc++) {
for (int zc = zc1; zc <= zc2; zc++) {
chunks[xc - xc1][zc - zc1] = level->getChunk(xc, zc);
}
}
}
Region::~Region() {
for (int i = 0 ; i < size_x; ++i)
delete[] chunks[i];
delete[] chunks;
}
int Region::getTile(int x, int y, int z) {
if (y < 0) return 0;
if (y >= Level::DEPTH) return 0;
int xc = (x >> 4) - xc1;
int zc = (z >> 4) - zc1;
if (xc < 0 || xc >= size_x || zc < 0 || zc >= size_z) {
return 0;
}
LevelChunk* lc = chunks[xc][zc];
if (lc == NULL) return 0;
return lc->getTile(x & 15, y, z & 15);
}
bool Region::isEmptyTile( int x, int y, int z )
{
//return getTile(x, y, z) == 0; //@todo?
return Tile::tiles[getTile(x, y, z)] == NULL;
}
//TileEntity getTileEntity(int x, int y, int z) {
// int xc = (x >> 4) - xc1;
// int zc = (z >> 4) - zc1;
// return chunks[xc][zc].getTileEntity(x & 15, y, z & 15);
//}
float Region::getBrightness(int x, int y, int z) {
return level->dimension->brightnessRamp[getRawBrightness(x, y, z)];
}
int Region::getRawBrightness(int x, int y, int z) {
return getRawBrightness(x, y, z, true);
}
int Region::getRawBrightness(int x, int y, int z, bool propagate) {
if (x < -Level::MAX_LEVEL_SIZE || z < -Level::MAX_LEVEL_SIZE || x >= Level::MAX_LEVEL_SIZE || z > Level::MAX_LEVEL_SIZE) {
return Level::MAX_BRIGHTNESS;
}
if (propagate) {
int id = getTile(x, y, z);
if (id == Tile::stoneSlabHalf->id || id == Tile::farmland->id) {
int br = getRawBrightness(x, y + 1, z, false);
int br1 = getRawBrightness(x + 1, y, z, false);
int br2 = getRawBrightness(x - 1, y, z, false);
int br3 = getRawBrightness(x, y, z + 1, false);
int br4 = getRawBrightness(x, y, z - 1, false);
if (br1 > br) br = br1;
if (br2 > br) br = br2;
if (br3 > br) br = br3;
if (br4 > br) br = br4;
return br;
}
}
if (y < 0) return 0;
if (y >= Level::DEPTH) {
int br = Level::MAX_BRIGHTNESS - level->skyDarken;
if (br < 0) br = 0;
return br;
}
int xc = (x >> 4) - xc1;
int zc = (z >> 4) - zc1;
return chunks[xc][zc]->getRawBrightness(x & 15, y, z & 15, level->skyDarken);
}
int Region::getData(int x, int y, int z) {
if (y < 0) return 0;
if (y >= Level::DEPTH) return 0;
int xc = (x >> 4) - xc1;
int zc = (z >> 4) - zc1;
return chunks[xc][zc]->getData(x & 15, y, z & 15);
}
const Material* Region::getMaterial(int x, int y, int z) {
int t = getTile(x, y, z);
if (t == 0) return Material::air;
return Tile::tiles[t]->material;
}
bool Region::isSolidBlockingTile(int x, int y, int z)
{
Tile* tile = Tile::tiles[getTile(x, y, z)];
if (tile == NULL) return false;
return tile->material->isSolidBlocking() && tile->isCubeShaped();
}
bool Region::isSolidRenderTile(int x, int y, int z) {
Tile* tile = Tile::tiles[getTile(x, y, z)];
if (tile == NULL) return false;
return tile->isSolidRender();
}
Biome* Region::getBiome( int x, int z ) {
return level->getBiome(x, z);
}
//BiomeSource getBiomeSource() {
// return level.getBiomeSource();
//}