4jcraft/Minecraft.World/Blocks/CocoaTile.cpp
Nikita Edel a006cc5aa0 uninitialized vptr
the vptr to isSolidRender() is not known before contruction of the Tile. Its true by default. if false, need to pass false. that is what i did. i verfied what isSolidRender() is in every file. and did exactly what isSolidRender() would return
2026-03-10 23:22:34 +01:00

177 lines
4.5 KiB
C++

#include "../Platform/stdafx.h"
#include "../Headers/net.minecraft.world.item.h"
#include "../Headers/net.minecraft.world.level.h"
#include "../Headers/net.minecraft.world.level.tile.h"
#include "../Headers/net.minecraft.world.h"
#include "../Headers/net.minecraft.h"
#include "CocoaTile.h"
const std::wstring CocoaTile::TEXTURE_AGES[] = { L"cocoa_0", L"cocoa_1", L"cocoa_2"};
CocoaTile::CocoaTile(int id) : DirectionalTile(id, Material::plant, false)
{
setTicking(true);
}
Icon *CocoaTile::getTexture(int face, int data)
{
return icons[2];
}
Icon *CocoaTile::getTextureForAge(int age)
{
if (age < 0 || age >= COCOA_TEXTURES_LENGTH)
{
age = COCOA_TEXTURES_LENGTH - 1;
}
return icons[age];
}
void CocoaTile::tick(Level *level, int x, int y, int z, Random *random)
{
if (!canSurvive(level, x, y, z))
{
this->spawnResources(level, x, y, z, level->getData(x, y, z), 0);
level->setTile(x, y, z, 0);
}
else if (level->random->nextInt(5) == 0)
{
int data = level->getData(x, y, z);
int age = getAge(data);
if (age < 2)
{
age++;
level->setData(x, y, z, (age << 2) | (getDirection(data)));
}
}
}
bool CocoaTile::canSurvive(Level *level, int x, int y, int z)
{
int dir = getDirection(level->getData(x, y, z));
x += Direction::STEP_X[dir];
z += Direction::STEP_Z[dir];
int attachedTo = level->getTile(x, y, z);
return attachedTo == Tile::treeTrunk_Id && TreeTile::getWoodType(level->getData(x, y, z)) == TreeTile::JUNGLE_TRUNK;
}
int CocoaTile::getRenderShape()
{
return SHAPE_COCOA;
}
bool CocoaTile::isCubeShaped()
{
return false;
}
bool CocoaTile::isSolidRender(bool isServerLevel)
{
return false;
}
AABB *CocoaTile::getAABB(Level *level, int x, int y, int z)
{
updateShape(level, x, y, z);
return DirectionalTile::getAABB(level, x, y, z);
}
AABB *CocoaTile::getTileAABB(Level *level, int x, int y, int z)
{
updateShape(level, x, y, z);
return DirectionalTile::getTileAABB(level, x, y, z);
}
void CocoaTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, std::shared_ptr<TileEntity> forceEntity)
{
int data = level->getData(x, y, z);
int dir = getDirection(data);
int age = getAge(data);
int width = 4 + age * 2;
int height = 5 + age * 2;
float hWidth = width / 2.0f;
switch (dir)
{
case Direction::SOUTH:
setShape((8.0f - hWidth) / 16.0f, (12.0f - height) / 16.0f, (15.0f - width) / 16.0f, (8.0f + hWidth) / 16.0f, (12.0f) / 16.0f, (15.0f) / 16.0f);
break;
case Direction::NORTH:
setShape((8.0f - hWidth) / 16.0f, (12.0f - height) / 16.0f, (1.0f) / 16.0f, (8.0f + hWidth) / 16.0f, (12.0f) / 16.0f, (1.0f + width) / 16.0f);
break;
case Direction::WEST:
setShape((1.0f) / 16.0f, (12.0f - height) / 16.0f, (8.0f - hWidth) / 16.0f, (1.0f + width) / 16.0f, (12.0f) / 16.0f, (8.0f + hWidth) / 16.0f);
break;
case Direction::EAST:
setShape((15.0f - width) / 16.0f, (12.0f - height) / 16.0f, (8.0f - hWidth) / 16.0f, (15.0f) / 16.0f, (12.0f) / 16.0f, (8.0f + hWidth) / 16.0f);
break;
}
}
void CocoaTile::setPlacedBy(Level *level, int x, int y, int z, std::shared_ptr<Mob> by, std::shared_ptr<ItemInstance> itemInstance)
{
int dir = (((Mth::floor(by->yRot * 4 / (360) + 0.5)) & 3) + 0) % 4;
level->setData(x, y, z, dir);
}
int CocoaTile::getPlacedOnFaceDataValue(Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, int itemValue)
{
if (face == Facing::UP || face == Facing::DOWN)
{
face = Facing::NORTH;
}
return Direction::DIRECTION_OPPOSITE[Direction::FACING_DIRECTION[face]];
}
void CocoaTile::neighborChanged(Level *level, int x, int y, int z, int type)
{
if (!canSurvive(level, x, y, z))
{
this->spawnResources(level, x, y, z, level->getData(x, y, z), 0);
level->setTile(x, y, z, 0);
}
}
int CocoaTile::getAge(int data)
{
return (data & DirectionalTile::DIRECTION_INV_MASK) >> 2;
}
void CocoaTile::spawnResources(Level *level, int x, int y, int z, int data, float odds, int playerBonusLevel)
{
int age = getAge(data);
int count = 1;
if (age >= 2)
{
count = 3;
}
for (int i = 0; i < count; i++)
{
popResource(level, x, y, z, std::shared_ptr<ItemInstance>( new ItemInstance(Item::dye_powder, 1, DyePowderItem::BROWN) ));
}
}
int CocoaTile::cloneTileId(Level *level, int x, int y, int z)
{
return Item::dye_powder_Id;
}
int CocoaTile::cloneTileData(Level *level, int x, int y, int z)
{
return DyePowderItem::BROWN;
}
void CocoaTile::registerIcons(IconRegister *iconRegister)
{
icons = new Icon*[COCOA_TEXTURES_LENGTH];
for (int i = 0; i < COCOA_TEXTURES_LENGTH; i++)
{
icons[i] = iconRegister->registerIcon(TEXTURE_AGES[i]);
}
}