mirror of
https://github.com/celisej567/mcpe.git
synced 2025-12-31 17:49:17 +03:00
* macOS Support & Cleanup * Fix malformed comments in build-wasm.bat * Emscripten Fixes * * Add shebang to the grabsounds.py script Since it was changed from rw- to rwx, I'll add the shebang so that it actually runs properly. * * Re-add the patch_data and readme files. * * Remove sound data. * Fix some more things. * Think it's ready to pull now... --------- Co-authored-by: BrentDaMage <BrentDaMage@users.noreply.github.com> Co-authored-by: iProgramInCpp <iprogramincpp@gmail.com>
104 lines
2.3 KiB
C++
104 lines
2.3 KiB
C++
/********************************************************************
|
|
Minecraft: Pocket Edition - Decompilation Project
|
|
Copyright (C) 2023 iProgramInCpp
|
|
|
|
The following code is licensed under the BSD 1 clause license.
|
|
SPDX-License-Identifier: BSD-1-Clause
|
|
********************************************************************/
|
|
|
|
#include "SandTile.hpp"
|
|
#include "world/level/Level.hpp"
|
|
#include "world/entity/FallingTile.hpp"
|
|
|
|
//@NOTE: True for now
|
|
bool SandTile::instaFall = true;
|
|
|
|
SandTile::SandTile(int ID, int texture, Material* pMtl) : Tile(ID, texture, pMtl)
|
|
{
|
|
#ifdef ENH_ALLOW_SAND_GRAVITY
|
|
// the reason sand doesn't fall in the original MCPE:
|
|
setTicking(true);
|
|
#endif
|
|
}
|
|
|
|
int SandTile::getTickDelay()
|
|
{
|
|
return 3;
|
|
}
|
|
|
|
void SandTile::checkSlide(Level* level, int x, int y, int z)
|
|
{
|
|
//TileID tile = level->getTile(x, y - 1, z);
|
|
|
|
if (!isFree(level, x, y - 1, z))
|
|
// standing on something, don't fall
|
|
return;
|
|
|
|
if (y <= 0)
|
|
return;
|
|
|
|
if (SandTile::instaFall || !level->hasChunksAt(x - 32, y - 32, z - 32, x + 32, y + 32, z + 32))
|
|
{
|
|
level->setTile(x, y, z, 0);
|
|
|
|
int y2;
|
|
for (y2 = y - 1; y2 >= 0; y2--)
|
|
{
|
|
if (!isFree(level, x, y2, z))
|
|
break;
|
|
}
|
|
|
|
if (y2 > -1)
|
|
level->setTile(x, y2 + 1, z, m_ID);
|
|
}
|
|
else
|
|
{
|
|
// The original code attempts to spawn a falling tile entity, but it fails since it's not a player.
|
|
// The falling sand tile
|
|
#if defined(ORIGINAL_CODE) || defined(ENH_ALLOW_SAND_GRAVITY)
|
|
level->addEntity(new FallingTile(level, float(x) + 0.5f, float(y) + 0.5f, float(z) + 0.5f, m_ID));
|
|
#endif
|
|
}
|
|
}
|
|
|
|
bool SandTile::isFree(Level* level, int x, int y, int z)
|
|
{
|
|
TileID tile = level->getTile(x, y, z);
|
|
if (!tile)
|
|
return true;
|
|
|
|
if (tile == Tile::fire->m_ID)
|
|
return true;
|
|
|
|
if (Tile::tiles[tile]->m_pMaterial == Material::water)
|
|
return true;
|
|
|
|
if (Tile::tiles[tile]->m_pMaterial == Material::lava)
|
|
return true;
|
|
|
|
return false;
|
|
}
|
|
|
|
void SandTile::tick(Level* level, int x, int y, int z, Random* random)
|
|
{
|
|
if (level->m_bIsMultiplayer)
|
|
return;
|
|
|
|
checkSlide(level, x, y, z);
|
|
}
|
|
|
|
void SandTile::neighborChanged(Level* level, int x, int y, int z, int dir)
|
|
{
|
|
#ifdef ENH_ALLOW_SAND_GRAVITY
|
|
level->addToTickNextTick(x, y, z, m_ID, getTickDelay());
|
|
#endif
|
|
}
|
|
|
|
void SandTile::onPlace(Level* level, int x, int y, int z)
|
|
{
|
|
#ifdef ENH_ALLOW_SAND_GRAVITY
|
|
level->addToTickNextTick(x, y, z, m_ID, getTickDelay());
|
|
#endif
|
|
}
|
|
|