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

155 lines
3.8 KiB
C++

#include "../Platform/stdafx.h"
#include "ThinFenceTile.h"
#include "../Headers/net.minecraft.world.level.h"
#include "../Headers/net.minecraft.world.h"
ThinFenceTile::ThinFenceTile(int id, const std::wstring &tex, const std::wstring &edgeTex, Material *material, bool dropsResources) : Tile(id, material, false)
{
iconSide = NULL;
edgeTexture = edgeTex;
this->dropsResources = dropsResources;
this->texture = tex;
}
int ThinFenceTile::getResource(int data, Random *random, int playerBonusLevel)
{
if (!dropsResources)
{
return 0;
}
return Tile::getResource(data, random, playerBonusLevel);
}
bool ThinFenceTile::isSolidRender(bool isServerLevel)
{
return false;
}
bool ThinFenceTile::isCubeShaped()
{
return false;
}
int ThinFenceTile::getRenderShape()
{
return Tile::SHAPE_IRON_FENCE;
}
bool ThinFenceTile::shouldRenderFace(LevelSource *level, int x, int y, int z, int face)
{
int id = level->getTile(x, y, z);
if (id == this->id) return false;
return Tile::shouldRenderFace(level, x, y, z, face);
}
void ThinFenceTile::addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, std::shared_ptr<Entity> source)
{
bool n = attachsTo(level->getTile(x, y, z - 1));
bool s = attachsTo(level->getTile(x, y, z + 1));
bool w = attachsTo(level->getTile(x - 1, y, z));
bool e = attachsTo(level->getTile(x + 1, y, z));
if ((w && e) || (!w && !e && !n && !s))
{
setShape(0, 0, 7.0f / 16.0f, 1, 1, 9.0f / 16.0f);
Tile::addAABBs(level, x, y, z, box, boxes, source);
}
else if (w && !e)
{
setShape(0, 0, 7.0f / 16.0f, .5f, 1, 9.0f / 16.0f);
Tile::addAABBs(level, x, y, z, box, boxes, source);
}
else if (!w && e)
{
setShape(.5f, 0, 7.0f / 16.0f, 1, 1, 9.0f / 16.0f);
Tile::addAABBs(level, x, y, z, box, boxes, source);
}
if ((n && s) || (!w && !e && !n && !s))
{
setShape(7.0f / 16.0f, 0, 0, 9.0f / 16.0f, 1, 1);
Tile::addAABBs(level, x, y, z, box, boxes, source);
}
else if (n && !s)
{
setShape(7.0f / 16.0f, 0, 0, 9.0f / 16.0f, 1, .5f);
Tile::addAABBs(level, x, y, z, box, boxes, source);
}
else if (!n && s)
{
setShape(7.0f / 16.0f, 0, .5f, 9.0f / 16.0f, 1, 1);
Tile::addAABBs(level, x, y, z, box, boxes, source);
}
}
void ThinFenceTile::updateDefaultShape()
{
setShape(0, 0, 0, 1, 1, 1);
}
void ThinFenceTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, std::shared_ptr<TileEntity> forceEntity) // 4J added forceData, forceEntity param
{
float minX = 7.0f / 16.0f;
float maxX = 9.0f / 16.0f;
float minZ = 7.0f / 16.0f;
float maxZ = 9.0f / 16.0f;
bool n = attachsTo(level->getTile(x, y, z - 1));
bool s = attachsTo(level->getTile(x, y, z + 1));
bool w = attachsTo(level->getTile(x - 1, y, z));
bool e = attachsTo(level->getTile(x + 1, y, z));
if ((w && e) || (!w && !e && !n && !s))
{
minX = 0;
maxX = 1;
}
else if (w && !e)
{
minX = 0;
}
else if (!w && e)
{
maxX = 1;
}
if ((n && s) || (!w && !e && !n && !s))
{
minZ = 0;
maxZ = 1;
}
else if (n && !s)
{
minZ = 0;
}
else if (!n && s)
{
maxZ = 1;
}
setShape(minX, 0, minZ, maxX, 1, maxZ);
}
Icon *ThinFenceTile::getEdgeTexture()
{
return iconSide;
}
bool ThinFenceTile::attachsTo(int tile)
{
return Tile::solid[tile] || tile == id || tile == Tile::glass_Id;
}
bool ThinFenceTile::isSilkTouchable()
{
return true;
}
std::shared_ptr<ItemInstance> ThinFenceTile::getSilkTouchItemInstance(int data)
{
return std::shared_ptr<ItemInstance>(new ItemInstance(id, 1, data));
}
void ThinFenceTile::registerIcons(IconRegister *iconRegister)
{
icon = iconRegister->registerIcon(texture);
iconSide = iconRegister->registerIcon(edgeTexture);
}