mirror of
https://github.com/celisej567/mcpe.git
synced 2025-12-31 17:49:17 +03:00
131 lines
2.9 KiB
C++
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);
|
|
}
|