Files
mcpe/source/world/tile/LadderTile.cpp
2023-08-10 13:27:30 +03:00

131 lines
2.9 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 "LadderTile.hpp"
#include "world/level/Level.hpp"
LadderTile::LadderTile(int ID, int texture) : Tile(ID, texture, Material::decoration)
{
}
int LadderTile::getRenderShape()
{
return SHAPE_LADDER;
}
int LadderTile::getResourceCount(Random* random)
{
return 1;
}
bool LadderTile::isCubeShaped()
{
return false;
}
bool LadderTile::isSolidRender()
{
return false;
}
AABB* LadderTile::getAABB(Level* level, int x, int y, int z)
{
int data = level->getData(x, y, z);
switch (data)
{
case 2:
setShape(0.0f, 0.0f, 0.875, 1.0f, 1.0f, 1.0f);
break;
case 3:
setShape(0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.125f);
break;
case 4:
setShape(0.875, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f);
break;
case 5:
setShape(0.0f, 0.0f, 0.0f, 0.125, 1.0f, 1.0f);
break;
}
return Tile::getAABB(level, x, y, z);
}
AABB LadderTile::getTileAABB(Level* level, int x, int y, int z)
{
int data = level->getData(x, y, z);
switch (data)
{
case 2:
setShape(0.0f, 0.0f, 0.875, 1.0f, 1.0f, 1.0f);
break;
case 3:
setShape(0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.125f);
break;
case 4:
setShape(0.875, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f);
break;
case 5:
setShape(0.0f, 0.0f, 0.0f, 0.125, 1.0f, 1.0f);
break;
}
return Tile::getTileAABB(level, x, y, z);
}
void LadderTile::setPlacedOnFace(Level* level, int x, int y, int z, int face)
{
int data = level->getData(x, y, z);
if ((data == 0 || face == DIR_ZNEG) && level->isSolidTile(x, y, z + 1)) data = 2;
if ((data == 0 || face == DIR_ZPOS) && level->isSolidTile(x, y, z - 1)) data = 3;
if ((data == 0 || face == DIR_XNEG) && level->isSolidTile(x + 1, y, z)) data = 4;
if ((data == 0 || face == DIR_XPOS) && level->isSolidTile(x - 1, y, z)) data = 5;
level->setData(x, y, z, data);
assert(level->getData(x, y, z) == data);
}
void LadderTile::neighborChanged(Level* level, int x, int y, int z, int dir)
{
int data = level->getData(x, y, z);
switch (data)
{
case 2:
if (level->isSolidTile(x, y, z + 1)) return;
break;
case 3:
if (level->isSolidTile(x, y, z - 1)) return;
break;
case 4:
if (level->isSolidTile(x + 1, y, z)) return;
break;
case 5:
if (level->isSolidTile(x - 1, y, z)) return;
break;
case 0:
// hasn't decided on anything right now?
break;
default:
// invalid state
assert(!"invalid ladder state");
break;
}
spawnResources(level, x, y, z, data);
level->setTile(x, y, z, TILE_AIR);
}
bool LadderTile::mayPlace(Level* level, int x, int y, int z)
{
return
level->isSolidTile(x - 1, y, z) ||
level->isSolidTile(x + 1, y, z) ||
level->isSolidTile(x, y, z - 1) ||
level->isSolidTile(x, y, z + 1);
}