Files
minecraft-pe-0.6.1/src/world/entity/item/FallingTile.cpp
2026-03-02 22:04:18 +03:00

118 lines
2.2 KiB
C++
Executable File

#include "FallingTile.h"
#include "../../level/Level.h"
#include "../../../util/Random.h"
#include "../../../nbt/CompoundTag.h"
FallingTile::FallingTile( Level* level )
: Entity(level),
tile(0),
data(0)
{
init();
}
FallingTile::FallingTile( Level* level, float x, float y, float z, int tile, int data)
: Entity(level),
tile(tile),
data(data)
{
init();
setPos(x, y, z);
xo = xOld = x;
yo = yOld = y;
zo = zOld = z;
}
void FallingTile::init() {
entityRendererId = ER_FALLINGTILE_RENDERER;
time = 0;
blocksBuilding = true;
setSize(0.98f, 0.98f);
heightOffset = bbHeight / 2.0f;
makeStepSound = false;
xd = 0;
yd = 0;
zd = 0;
}
bool FallingTile::isPickable() {
return !removed;
}
void FallingTile::tick() {
if (tile == 0) {
remove();
return;
}
xo = x;
yo = y;
zo = z;
time++;
yd -= 0.04f;
move(xd, yd, zd);
xd *= 0.98f;
yd *= 0.98f;
zd *= 0.98f;
if (!level->isClientSide) {
int xt = Mth::floor(x);
int yt = Mth::floor(y);
int zt = Mth::floor(z);
if (time == 1) {
if (level->getTile(xt, yt, zt) == tile) {
level->setTile(xt, yt, zt, 0);
} else {
remove();
return;
}
}
if (onGround) {
xd *= 0.7f;
zd *= 0.7f;
yd *= -0.5f;
remove();
if (level->mayPlace(tile, xt, yt, zt, true, 1) && level->setTileAndData(xt, yt, zt, tile, data)) {
} else if (!level->isClientSide) {
//spawnAtLocation(tile, 1);
}
} else if (time > SharedConstants::TicksPerSecond * 5 && !level->isClientSide) {
//spawnAtLocation(tile, 1);
remove();
}
}
}
float FallingTile::getShadowHeightOffs() {
return 0;
}
Level* FallingTile::getLevel() {
return level;
}
void FallingTile::addAdditonalSaveData( CompoundTag* tag ) {
tag->putByte("Tile", (char) tile);
tag->putByte("Data", (char) data);
tag->putByte("Time", (char) time);
}
void FallingTile::readAdditionalSaveData( CompoundTag* tag ) {
tile = tag->getByte("Tile");
data = tag->getByte("Data");
time = tag->getByte("Time");
}
int FallingTile::getEntityTypeId() const {
return EntityTypes::IdFallingTile;
}