forked from Kolyah35/minecraft-pe-0.6.1
156 lines
4.3 KiB
C++
Executable File
156 lines
4.3 KiB
C++
Executable File
#include "StoneSlabTile.h"
|
|
#include "../../../util/Random.h"
|
|
#include "../material/Material.h"
|
|
#include "../Level.h"
|
|
#include "../../Facing.h"
|
|
|
|
const std::string StoneSlabTile::SLAB_NAMES[] = {
|
|
"stone", "sand", "wood", "cobble", "brick", "smoothStoneBrick"
|
|
};
|
|
const int StoneSlabTile::SLAB_NAMES_COUNT = sizeof(SLAB_NAMES) / sizeof(std::string);
|
|
|
|
StoneSlabTile::StoneSlabTile(int id, bool fullSize)
|
|
: Tile(id, 6, Material::stone)
|
|
{
|
|
this->fullSize = fullSize;
|
|
|
|
if (!fullSize) {
|
|
setShape(0, 0, 0, 1, 0.5f, 1);
|
|
}
|
|
setLightBlock(255);
|
|
}
|
|
|
|
void StoneSlabTile::updateShape(LevelSource* level, int x, int y, int z)
|
|
{
|
|
if (fullSize) {
|
|
setShape(0, 0, 0, 1, 1, 1);
|
|
} else {
|
|
bool upper = (level->getData(x, y, z) & TOP_SLOT_BIT) != 0;
|
|
if (upper) {
|
|
setShape(0, 0.5f, 0, 1, 1, 1);
|
|
} else {
|
|
setShape(0, 0, 0, 1, 0.5f, 1);
|
|
}
|
|
}
|
|
}
|
|
|
|
void StoneSlabTile::updateDefaultShape()
|
|
{
|
|
if (fullSize) {
|
|
setShape(0, 0, 0, 1, 1, 1);
|
|
} else {
|
|
setShape(0, 0, 0, 1, 0.5f, 1);
|
|
}
|
|
}
|
|
|
|
int StoneSlabTile::getTexture(int face, int data) {
|
|
data = data & TYPE_MASK;
|
|
if (data == STONE_SLAB) {
|
|
if (face <= 1) return 6;
|
|
return 5;
|
|
} else if (data == SAND_SLAB) {
|
|
if (face == Facing::DOWN) return 13 * 16;
|
|
if (face == Facing::UP) return 11 * 16;
|
|
return 12 * 16;
|
|
} else if (data == WOOD_SLAB) {
|
|
return 4;
|
|
} else if (data == COBBLESTONE_SLAB) {
|
|
return 16;
|
|
} else if (data == BRICK_SLAB) {
|
|
return Tile::redBrick->tex;
|
|
} else if (data == SMOOTHBRICK_SLAB) {
|
|
return Tile::stoneBrickSmooth->tex;
|
|
}
|
|
return 6;
|
|
}
|
|
|
|
int StoneSlabTile::getTexture(int face) {
|
|
return getTexture(face, 0);
|
|
}
|
|
|
|
bool StoneSlabTile::isSolidRender() {
|
|
return fullSize;
|
|
}
|
|
|
|
int StoneSlabTile::getPlacedOnFaceDataValue(Level* level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, int itemValue)
|
|
{
|
|
if (fullSize) return itemValue;
|
|
|
|
if (face == Facing::DOWN || (face != Facing::UP && clickY > 0.5)) {
|
|
return itemValue | TOP_SLOT_BIT;
|
|
}
|
|
return itemValue;
|
|
}
|
|
|
|
/*
|
|
void StoneSlabTile::onPlace(Level* level, int x, int y, int z) {
|
|
if (this != Tile::stoneSlabHalf) Tile::onPlace(level, x, y, z);
|
|
int below = level->getTile(x, y - 1, z);
|
|
|
|
int myData = level->getData(x, y, z);
|
|
int belowData = level->getData(x, y - 1, z);
|
|
|
|
if (myData != belowData) {
|
|
return;
|
|
}
|
|
|
|
if (below == Tile::stoneSlabHalf->id) {
|
|
level->setTile(x, y, z, 0);
|
|
level->setTileAndData(x, y - 1, z, Tile::stoneSlab->id, myData);
|
|
}
|
|
}
|
|
*/
|
|
|
|
int StoneSlabTile::getResource(int data, Random* random) {
|
|
return Tile::stoneSlabHalf->id;
|
|
}
|
|
|
|
int StoneSlabTile::getResourceCount(Random* random) {
|
|
if (fullSize) {
|
|
return 2;
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
bool StoneSlabTile::isCubeShaped() {
|
|
return fullSize;
|
|
}
|
|
|
|
void StoneSlabTile::addAABBs( Level* level, int x, int y, int z, const AABB* box, std::vector<AABB>& boxes ) {
|
|
updateShape(level, x, y, z);
|
|
super::addAABBs(level, x, y, z, box, boxes);
|
|
}
|
|
|
|
static bool isHalfSlab(int tileId) {
|
|
return tileId == Tile::stoneSlabHalf->id;// || tileId == Tile::woodSlabHalf->id;
|
|
}
|
|
|
|
bool StoneSlabTile::shouldRenderFace(LevelSource* level, int x, int y, int z, int face) {
|
|
|
|
if (fullSize) return super::shouldRenderFace(level, x, y, z, face);
|
|
|
|
if (face != Facing::UP && face != Facing::DOWN && !super::shouldRenderFace(level, x, y, z, face)) {
|
|
return false;
|
|
}
|
|
|
|
int ox = x, oy = y, oz = z;
|
|
ox += Facing::STEP_X[Facing::OPPOSITE_FACING[face]];
|
|
oy += Facing::STEP_Y[Facing::OPPOSITE_FACING[face]];
|
|
oz += Facing::STEP_Z[Facing::OPPOSITE_FACING[face]];
|
|
|
|
bool isUpper = (level->getData(ox, oy, oz) & TOP_SLOT_BIT) != 0;
|
|
if (isUpper) {
|
|
if (face == Facing::DOWN) return true;
|
|
if (face == Facing::UP && super::shouldRenderFace(level, x, y, z, face)) return true;
|
|
return !(isHalfSlab(level->getTile(x, y, z)) && (level->getData(x, y, z) & TOP_SLOT_BIT) != 0);
|
|
} else {
|
|
if (face == Facing::UP) return true;
|
|
if (face == Facing::DOWN && super::shouldRenderFace(level, x, y, z, face)) return true;
|
|
return !(isHalfSlab(level->getTile(x, y, z)) && (level->getData(x, y, z) & TOP_SLOT_BIT) == 0);
|
|
}
|
|
}
|
|
|
|
int StoneSlabTile::getSpawnResourcesAuxValue(int data) {
|
|
return data & TYPE_MASK;
|
|
}
|