4jcraft/Minecraft.World/Blocks/CactusTile.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

119 lines
2.9 KiB
C++

#include "../Platform/stdafx.h"
#include "../Headers/net.minecraft.world.level.h"
#include "../Headers/net.minecraft.world.level.material.h"
#include "../Headers/net.minecraft.world.entity.h"
#include "../Headers/net.minecraft.world.phys.h"
#include "../Headers/net.minecraft.world.damagesource.h"
#include "../Headers/net.minecraft.h"
#include "../Headers/net.minecraft.world.h"
#include "CactusTile.h"
CactusTile::CactusTile(int id) : Tile(id, Material::cactus, false)
{
setTicking(true);
iconTop = NULL;
iconBottom = NULL;
}
void CactusTile::tick(Level *level, int x, int y, int z, Random *random)
{
if (level->isEmptyTile(x, y + 1, z))
{
int height = 1;
while (level->getTile(x, y - height, z) == id)
{
height++;
}
if (height < 3)
{
int age = level->getData(x, y, z);
if (age == 15)
{
level->setTile(x, y + 1, z, id);
level->setData(x, y, z, 0);
} else
{
level->setData(x, y, z, age + 1);
}
}
}
}
AABB *CactusTile::getAABB(Level *level, int x, int y, int z)
{
float r = 1 / 16.0f;
return AABB::newTemp(x + r, y, z + r, x + 1 - r, y + 1 - r, z + 1 - r);
}
AABB *CactusTile::getTileAABB(Level *level, int x, int y, int z)
{
float r = 1 / 16.0f;
return AABB::newTemp(x + r, y, z + r, x + 1 - r, y + 1, z + 1 - r);
}
Icon *CactusTile::getTexture(int face, int data)
{
if (face == Facing::UP) return iconTop;
if (face == Facing::DOWN) return iconBottom;
else return icon;
}
bool CactusTile::isCubeShaped()
{
return false;
}
bool CactusTile::isSolidRender(bool isServerLevel)
{
return false;
}
int CactusTile::getRenderShape()
{
return Tile::SHAPE_CACTUS;
}
bool CactusTile::mayPlace(Level *level, int x, int y, int z)
{
if (!Tile::mayPlace(level, x, y, z)) return false;
return canSurvive(level, x, y, z);
}
void CactusTile::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);
}
}
bool CactusTile::canSurvive(Level *level, int x, int y, int z)
{
if (level->getMaterial(x - 1, y, z)->isSolid()) return false;
if (level->getMaterial(x + 1, y, z)->isSolid()) return false;
if (level->getMaterial(x, y, z - 1)->isSolid()) return false;
if (level->getMaterial(x, y, z + 1)->isSolid()) return false;
int below = level->getTile(x, y - 1, z);
return below == Tile::cactus_Id || below == Tile::sand_Id;
}
void CactusTile::entityInside(Level *level, int x, int y, int z, std::shared_ptr<Entity> entity)
{
entity->hurt(DamageSource::cactus, 1);
}
void CactusTile::registerIcons(IconRegister *iconRegister)
{
icon = iconRegister->registerIcon(L"cactus_side");
iconTop = iconRegister->registerIcon(L"cactus_top");
iconBottom = iconRegister->registerIcon(L"cactus_bottom");
}
bool CactusTile::shouldTileTick(Level *level, int x,int y,int z)
{
return level->isEmptyTile(x, y + 1, z);
}