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

237 lines
5.2 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 "StairTile.hpp"
#include "world/level/Level.hpp"
// @NOTE: All this work for some stairs; damn
StairTile::StairTile(int id, Tile* pTile) : Tile(id, pTile->m_TextureFrame, pTile->m_pMaterial)
{
m_pParent = pTile;
// inherit these properties from the parent tile
setDestroyTime(pTile->m_hardness);
setExplodeable(pTile->m_blastResistance / 3.0f);
setSoundType(*pTile->m_pSound);
}
void StairTile::addAABBs(Level* level, int x, int y, int z, const AABB* aabb, std::vector<AABB>& out)
{
int data = level->getData(x, y, z);
switch (data)
{
case 0:
{
setShape(0.0f, 0.0f, 0.0f, 0.5f, 0.5f, 1.0f);
Tile::addAABBs(level, x, y, z, aabb, out);
setShape(0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f);
Tile::addAABBs(level, x, y, z, aabb, out);
break;
}
case 1:
{
setShape(0.0f, 0.0f, 0.0f, 0.5f, 1.0f, 1.0f);
Tile::addAABBs(level, x, y, z, aabb, out);
setShape(0.5f, 0.0f, 0.0f, 1.0f, 0.5f, 1.0f);
Tile::addAABBs(level, x, y, z, aabb, out);
break;
}
case 2:
{
setShape(0.0f, 0.0f, 0.0f, 1.0f, 0.5f, 0.5f);
Tile::addAABBs(level, x, y, z, aabb, out);
setShape(0.0f, 0.0f, 0.5f, 1.0f, 1.0f, 1.0f);
Tile::addAABBs(level, x, y, z, aabb, out);
break;
}
case 3:
{
setShape(0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.5f);
Tile::addAABBs(level, x, y, z, aabb, out);
setShape(0.0f, 0.0f, 0.5f, 1.0f, 0.5f, 1.0f);
Tile::addAABBs(level, x, y, z, aabb, out);
break;
}
}
setShape(0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f);
}
bool StairTile::isSolidRender()
{
return false;
}
bool StairTile::isCubeShaped()
{
return false;
}
int StairTile::getRenderShape()
{
return SHAPE_STAIRS;
}
void StairTile::addLights(Level* level, int x, int y, int z)
{
m_pParent->addLights(level, x, y, z);
}
void StairTile::animateTick(Level* level, int x, int y, int z, Random* random)
{
m_pParent->animateTick(level, x, y, z, random);
}
void StairTile::updateShape(LevelSource* level, int x, int y, int z)
{
setShape(0, 0, 0, 1, 1, 1);
}
float StairTile::getBrightness(LevelSource* level, int x, int y, int z)
{
return m_pParent->getBrightness(level, x, y, z);
}
int StairTile::getTexture(int a)
{
return m_pParent->getTexture(a);
}
int StairTile::getTexture(int a, int b)
{
return m_pParent->getTexture(a, b);
}
int StairTile::getTexture(LevelSource* level, int x, int y, int z, int data)
{
return m_pParent->getTexture(level, x, y, z, data);
}
AABB StairTile::getTileAABB(Level* level, int x, int y, int z)
{
return m_pParent->getTileAABB(level, x, y, z);
}
bool StairTile::mayPick()
{
return m_pParent->mayPick();
}
bool StairTile::mayPick(int a, bool b)
{
return m_pParent->mayPick(a, b);
}
bool StairTile::mayPlace(Level* level, int x, int y, int z)
{
return m_pParent->mayPlace(level, x, y, z);
}
int StairTile::getTickDelay()
{
return m_pParent->getTickDelay();
}
void StairTile::tick(Level* level, int x, int y, int z, Random* random)
{
m_pParent->tick(level, x, y, z, random);
}
void StairTile::destroy(Level* level, int x, int y, int z, int dir)
{
m_pParent->destroy(level, x, y, z, dir);
}
void StairTile::onPlace(Level* level, int x, int y, int z)
{
neighborChanged(level, x, y, z, 0);
m_pParent->onPlace(level, x, y, z);
}
void StairTile::onRemove(Level* level, int x, int y, int z)
{
m_pParent->onRemove(level, x, y, z);
}
int StairTile::getResource(int a, Random* random)
{
return m_pParent->getResource(a, random);
}
int StairTile::getResourceCount(Random* random)
{
return m_pParent->getResourceCount(random);
}
void StairTile::spawnResources(Level* level, int x, int y, int z, int d)
{
m_pParent->spawnResources(level, x, y, z, d);
}
void StairTile::spawnResources(Level* level, int x, int y, int z, int d, float f)
{
m_pParent->spawnResources(level, x, y, z, d, f);
}
float StairTile::getExplosionResistance(Entity* entity)
{
return m_pParent->getExplosionResistance(entity);
}
void StairTile::wasExploded(Level* level, int x, int y, int z)
{
return m_pParent->wasExploded(level, x, y, z);
}
int StairTile::getRenderLayer()
{
return m_pParent->getRenderLayer();
}
int StairTile::use(Level* level, int x, int y, int z, Player* player)
{
return m_pParent->use(level, x, y, z, player);
}
void StairTile::stepOn(Level* level, int x, int y, int z, Entity* entity)
{
m_pParent->stepOn(level, x, y, z, entity);
}
void StairTile::setPlacedBy(Level* level, int x, int y, int z, Mob* mob)
{
int rot = Mth::floor(0.5f + (mob->m_yaw * 4.0f / 360.0f)) & 3;
int data = 0;
switch (rot)
{
case 0: data = 2; break;
case 1: data = 1; break;
case 2: data = 3; break;
}
level->setData(x, y, z, data);
}
void StairTile::prepareRender(Level* level, int x, int y, int z)
{
return m_pParent->prepareRender(level, x, y, z);
}
void StairTile::attack(Level* level, int x, int y, int z, Player* player)
{
m_pParent->attack(level, x, y, z, player);
}
void StairTile::handleEntityInside(Level* level, int x, int y, int z, Entity* entity, Vec3& vec)
{
m_pParent->handleEntityInside(level, x, y, z, entity, vec);
}