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
This commit is contained in:
Nikita Edel 2026-03-10 23:22:34 +01:00
parent 8865194e47
commit a006cc5aa0
48 changed files with 74 additions and 68 deletions

View file

@ -11,7 +11,7 @@ UIGroup::UIGroup(EUIGroup group, int iPad)
m_bIgnoreAutosaveMenuDisplayed = false;
m_bIgnorePlayerJoinMenuDisplayed = false;
// 4jcraft, moved this to the top
// initialized memory was read.
// uninitialized memory was read.
m_viewportType = C4JRender::VIEWPORT_TYPE_FULLSCREEN;
m_updateFocusStateCountdown = 0;

View file

@ -17,7 +17,7 @@ std::wstring AnvilTile::TEXTURE_DAMAGE_NAMES[ANVIL_NAMES_LENGTH] = {
L"anvil_top", L"anvil_top_damaged_1", L"anvil_top_damaged_2"
};
AnvilTile::AnvilTile(int id) : HeavyTile(id, Material::heavyMetal, isSolidRender() )
AnvilTile::AnvilTile(int id) : HeavyTile(id, Material::heavyMetal, false)
{
part = PART_BASE;
setLightBlock(0);
@ -114,4 +114,4 @@ void AnvilTile::onLand(Level *level, int xt, int yt, int zt, int data)
bool AnvilTile::shouldRenderFace(LevelSource *level, int x, int y, int z, int face)
{
return true;
}
}

View file

@ -12,7 +12,7 @@ int BedTile::HEAD_DIRECTION_OFFSETS[4][2] =
{ 0, 1 }, { -1, 0 }, { 0, -1 }, { 1, 0 }
};
BedTile::BedTile(int id) : DirectionalTile(id, Material::cloth, isSolidRender())
BedTile::BedTile(int id) : DirectionalTile(id, Material::cloth, false)
{
setShape();
@ -329,4 +329,4 @@ int BedTile::getPistonPushReaction()
int BedTile::cloneTileId(Level *level, int x, int y, int z)
{
return Item::bed_Id;
}
}

View file

@ -8,7 +8,7 @@
const std::wstring BrewingStandTile::TEXTURE_BASE = L"brewingStand_base";
BrewingStandTile::BrewingStandTile(int id) : EntityTile(id, Material::metal, isSolidRender())
BrewingStandTile::BrewingStandTile(int id) : EntityTile(id, Material::metal, false)
{
random = new Random();
iconBase = NULL;
@ -133,4 +133,4 @@ void BrewingStandTile::registerIcons(IconRegister *iconRegister)
Icon *BrewingStandTile::getBaseTexture()
{
return iconBase;
}
}

View file

@ -6,7 +6,7 @@
#include "ButtonTile.h"
#include "../Util/SoundTypes.h"
ButtonTile::ButtonTile(int id, bool sensitive) : Tile(id, Material::decoration,isSolidRender())
ButtonTile::ButtonTile(int id, bool sensitive) : Tile(id, Material::decoration, false)
{
this->setTicking(true);
this->sensitive = sensitive;

View file

@ -8,7 +8,7 @@
#include "../Headers/net.minecraft.world.h"
#include "CactusTile.h"
CactusTile::CactusTile(int id) : Tile(id, Material::cactus,isSolidRender())
CactusTile::CactusTile(int id) : Tile(id, Material::cactus, false)
{
setTicking(true);
iconTop = NULL;

View file

@ -9,7 +9,7 @@
#include "CakeTile.h"
CakeTile::CakeTile(int id) : Tile(id, Material::cake,isSolidRender())
CakeTile::CakeTile(int id) : Tile(id, Material::cake, false)
{
setTicking(true);
@ -148,4 +148,4 @@ int CakeTile::getResource(int data, Random *random, int playerBonusLevel)
int CakeTile::cloneTileId(Level *level, int x, int y, int z)
{
return Item::cake_Id;
}
}

View file

@ -11,7 +11,7 @@
const std::wstring CauldronTile::TEXTURE_INSIDE = L"cauldron_inner";
const std::wstring CauldronTile::TEXTURE_BOTTOM = L"cauldron_bottom";
CauldronTile::CauldronTile(int id) : Tile(id, Material::metal, isSolidRender())
CauldronTile::CauldronTile(int id) : Tile(id, Material::metal, false)
{
iconInner = NULL;
iconTop = NULL;
@ -174,4 +174,4 @@ int CauldronTile::getResource(int data, Random *random, int playerBonusLevel)
int CauldronTile::cloneTileId(Level *level, int x, int y, int z)
{
return Item::cauldron_Id;
}
}

View file

@ -10,7 +10,7 @@
#include "../Util/Facing.h"
#include "../Entities/Mobs/Ocelot.h"
ChestTile::ChestTile(int id) : EntityTile(id, Material::wood, isSolidRender() )
ChestTile::ChestTile(int id) : EntityTile(id, Material::wood, false)
{
random = new Random();

View file

@ -8,7 +8,7 @@
const std::wstring CocoaTile::TEXTURE_AGES[] = { L"cocoa_0", L"cocoa_1", L"cocoa_2"};
CocoaTile::CocoaTile(int id) : DirectionalTile(id, Material::plant, isSolidRender() )
CocoaTile::CocoaTile(int id) : DirectionalTile(id, Material::plant, false)
{
setTicking(true);
}
@ -173,4 +173,4 @@ void CocoaTile::registerIcons(IconRegister *iconRegister)
{
icons[i] = iconRegister->registerIcon(TEXTURE_AGES[i]);
}
}
}

View file

@ -9,7 +9,7 @@
const double DiodeTile::DELAY_RENDER_OFFSETS[4] = { -1.0f / 16.0f, 1.0f / 16.0f, 3.0f / 16.0f, 5.0f / 16.0f };
const int DiodeTile::DELAYS[4] = { 1, 2, 3, 4 };
DiodeTile::DiodeTile(int id, bool on) : DirectionalTile(id, Material::decoration,isSolidRender())
DiodeTile::DiodeTile(int id, bool on) : DirectionalTile(id, Material::decoration, false)
{
this->on = on;
updateDefaultShape();

View file

@ -10,7 +10,7 @@
const std::wstring DoorTile::TEXTURES[] = { L"doorWood_lower", L"doorWood_upper", L"doorIron_lower", L"doorIron_upper" };
DoorTile::DoorTile(int id, Material *material) : Tile(id, material,isSolidRender())
DoorTile::DoorTile(int id, Material *material) : Tile(id, material, false)
{
icons = NULL;

View file

@ -4,7 +4,7 @@
#include "../Headers/net.minecraft.world.level.tile.h"
#include "../Headers/net.minecraft.world.entity.item.h"
EggTile::EggTile(int id) : Tile(id, Material::egg, isSolidRender())
EggTile::EggTile(int id) : Tile(id, Material::egg, false)
{
}
@ -170,4 +170,4 @@ void EggTile::generateTeleportParticles(Level *level,int xt,int yt, int zt,int d
bool EggTile::shouldRenderFace(LevelSource *level, int x, int y, int z, int face)
{
return true;
}
}

View file

@ -9,7 +9,7 @@ const std::wstring EnchantmentTableTile::TEXTURE_SIDE = L"enchantment_side";
const std::wstring EnchantmentTableTile::TEXTURE_TOP = L"enchantment_top";
const std::wstring EnchantmentTableTile::TEXTURE_BOTTOM = L"enchantment_bottom";
EnchantmentTableTile::EnchantmentTableTile(int id) : EntityTile(id, Material::stone, isSolidRender())
EnchantmentTableTile::EnchantmentTableTile(int id) : EntityTile(id, Material::stone, false)
{
updateDefaultShape();
setLightBlock(0);

View file

@ -7,7 +7,7 @@
#include "../Headers/net.minecraft.h"
#include "EnderChestTile.h"
EnderChestTile::EnderChestTile(int id) : EntityTile(id, Material::stone, isSolidRender())
EnderChestTile::EnderChestTile(int id) : EntityTile(id, Material::stone, false)
{
updateDefaultShape();
}

View file

@ -6,7 +6,7 @@
#include "FarmTile.h"
FarmTile::FarmTile(int id) : Tile(id, Material::dirt,isSolidRender())
FarmTile::FarmTile(int id) : Tile(id, Material::dirt, false)
{
iconWet = NULL;
iconDry = NULL;

View file

@ -5,7 +5,7 @@
#include "../Headers/net.minecraft.h"
#include "../Level/Events/LevelEvent.h"
FenceGateTile::FenceGateTile(int id) : DirectionalTile(id, Material::wood, isSolidRender() )
FenceGateTile::FenceGateTile(int id) : DirectionalTile(id, Material::wood, false)
{
}
@ -144,4 +144,4 @@ void FenceGateTile::registerIcons(IconRegister *iconRegister)
bool FenceGateTile::shouldRenderFace(LevelSource *level, int x, int y, int z, int face)
{
return true;
}
}

View file

@ -4,7 +4,7 @@
#include "../Headers/net.minecraft.world.h"
#include "FenceTile.h"
FenceTile::FenceTile(int id, const std::wstring &texture, Material *material) : Tile( id, material, isSolidRender())
FenceTile::FenceTile(int id, const std::wstring &texture, Material *material) : Tile( id, material, false)
{
this->texture = texture;
}
@ -129,4 +129,4 @@ void FenceTile::registerIcons(IconRegister *iconRegister)
bool FenceTile::shouldRenderFace(LevelSource *level, int x, int y, int z, int face)
{
return true;
}
}

View file

@ -16,7 +16,7 @@
const std::wstring FireTile::TEXTURE_FIRST = L"fire_0";
const std::wstring FireTile::TEXTURE_SECOND = L"fire_1";
FireTile::FireTile(int id) : Tile(id, Material::fire,isSolidRender())
FireTile::FireTile(int id) : Tile(id, Material::fire, false)
{
flameOdds = new int[256];
memset( flameOdds,0,sizeof(int)*256);

View file

@ -5,7 +5,7 @@
#include "../Headers/net.minecraft.world.level.tile.h"
#include "FlowerPotTile.h"
FlowerPotTile::FlowerPotTile(int id) : Tile(id, Material::decoration, isSolidRender() )
FlowerPotTile::FlowerPotTile(int id) : Tile(id, Material::decoration, false)
{
updateDefaultShape();
sendTileData();
@ -189,4 +189,4 @@ int FlowerPotTile::getTypeFromItem(std::shared_ptr<ItemInstance> item)
}
return 0;
}
}

View file

@ -3,7 +3,7 @@
#include "../Headers/net.minecraft.world.h"
#include "HalfTransparentTile.h"
HalfTransparentTile::HalfTransparentTile(int id, const std::wstring &tex, Material *material, bool allowSame) : Tile(id,material,isSolidRender())
HalfTransparentTile::HalfTransparentTile(int id, const std::wstring &tex, Material *material, bool allowSame) : Tile(id,material, false)
{
this->allowSame = allowSame;
this->texture = tex;
@ -29,4 +29,4 @@ bool HalfTransparentTile::blocksLight()
void HalfTransparentTile::registerIcons(IconRegister *iconRegister)
{
icon = iconRegister->registerIcon(texture);
}
}

View file

@ -3,7 +3,7 @@
#include "LadderTile.h"
LadderTile::LadderTile(int id) : Tile(id, Material::decoration,isSolidRender())
LadderTile::LadderTile(int id) : Tile(id, Material::decoration, false)
{
}
@ -109,4 +109,4 @@ void LadderTile::neighborChanged(Level *level, int x, int y, int z, int type)
int LadderTile::getResourceCount(Random* random)
{
return 1;
}
}

View file

@ -15,7 +15,11 @@ const unsigned int LeafTile::LEAF_NAMES[LEAF_NAMES_LENGTH] = { IDS_TILE_LEAVES_O
const std::wstring LeafTile::TEXTURES[2][4] = { {L"leaves", L"leaves_spruce", L"leaves", L"leaves_jungle"}, {L"leaves_opaque", L"leaves_spruce_opaque", L"leaves_opaque", L"leaves_jungle_opaque"},};
LeafTile::LeafTile(int id) : TransparentTile(id, Material::leaves, false, isSolidRender())
// 4jcraft, this is the unitinialized vpointer fiassco of isSolidRender()
// isSolidRender() returns !allowSame if !isServerLevel, else true
// scince allowSame for TransparentTile right here is set to false
// setting isSolidRender to true by default totally correct.
LeafTile::LeafTile(int id) : TransparentTile(id, Material::leaves, false, true)
{
checkBuffer = NULL;
fancyTextureSet = 0;

View file

@ -4,7 +4,7 @@
#include "LeverTile.h"
#include "../Util/SoundTypes.h"
LeverTile::LeverTile(int id) : Tile(id, Material::decoration,isSolidRender())
LeverTile::LeverTile(int id) : Tile(id, Material::decoration, false)
{
}

View file

@ -12,7 +12,7 @@ const std::wstring LiquidTile::TEXTURE_WATER_STILL = L"water";
const std::wstring LiquidTile::TEXTURE_WATER_FLOW = L"water_flow";
const std::wstring LiquidTile::TEXTURE_LAVA_FLOW = L"lava_flow";
LiquidTile::LiquidTile(int id, Material *material) : Tile(id, material,isSolidRender())
LiquidTile::LiquidTile(int id, Material *material) : Tile(id, material, false)
{
float yo = 0;
float e = 0;

View file

@ -3,7 +3,7 @@
#include "../Headers/net.minecraft.world.level.tile.entity.h"
#include "MobSpawnerTile.h"
MobSpawnerTile::MobSpawnerTile(int id) : EntityTile(id, Material::stone, isSolidRender() )
MobSpawnerTile::MobSpawnerTile(int id) : EntityTile(id, Material::stone, false)
{
}
@ -46,4 +46,4 @@ void MobSpawnerTile::spawnResources(Level *level, int x, int y, int z, int data,
int MobSpawnerTile::cloneTileId(Level *level, int x, int y, int z)
{
return 0;
}
}

View file

@ -36,7 +36,7 @@ void PistonBaseTile::ignoreUpdate(bool set)
TlsSetValue(tlsIdx,(LPVOID)(intptr_t)(set?1:0));
}
PistonBaseTile::PistonBaseTile(int id, bool isSticky) : Tile(id, Material::piston, isSolidRender() )
PistonBaseTile::PistonBaseTile(int id, bool isSticky) : Tile(id, Material::piston, false)
{
// 4J - added initialiser
ignoreUpdate(false);

View file

@ -4,7 +4,7 @@
#include "../Util/Facing.h"
#include "../Headers/net.minecraft.world.level.h"
PistonExtensionTile::PistonExtensionTile(int id) : Tile(id, Material::piston,isSolidRender() )
PistonExtensionTile::PistonExtensionTile(int id) : Tile(id, Material::piston, false)
{
// 4J added initialiser
overrideTopTexture = NULL;
@ -207,4 +207,4 @@ int PistonExtensionTile::getFacing(int data)
int PistonExtensionTile::cloneTileId(Level *level, int x, int y, int z)
{
return 0;
}
}

View file

@ -6,7 +6,7 @@
#include "../Util/Facing.h"
#include "../Util/AABB.h"
PistonMovingPiece::PistonMovingPiece(int id) : EntityTile(id, Material::piston, isSolidRender() )
PistonMovingPiece::PistonMovingPiece(int id) : EntityTile(id, Material::piston, false )
{
setDestroyTime(INDESTRUCTIBLE_DESTROY_TIME);
}

View file

@ -9,12 +9,12 @@ void Bush::_init()
updateDefaultShape();
}
Bush::Bush(int id, Material *material) : Tile(id, material, isSolidRender())
Bush::Bush(int id, Material *material) : Tile(id, material, false)
{
_init();
}
Bush::Bush(int id) : Tile(id, Material::plant, isSolidRender())
Bush::Bush(int id) : Tile(id, Material::plant, false)
{
_init();
}

View file

@ -7,7 +7,7 @@
#include "PressurePlateTile.h"
#include "../Util/SoundTypes.h"
PressurePlateTile::PressurePlateTile(int id, const std::wstring &tex, Material *material, Sensitivity sensitivity) : Tile(id, material, isSolidRender())
PressurePlateTile::PressurePlateTile(int id, const std::wstring &tex, Material *material, Sensitivity sensitivity) : Tile(id, material, false)
{
this->sensitivity = sensitivity;
this->setTicking(true);
@ -208,4 +208,4 @@ int PressurePlateTile::getPistonPushReaction()
void PressurePlateTile::registerIcons(IconRegister *iconRegister)
{
icon = iconRegister->registerIcon(texture);
}
}

View file

@ -363,7 +363,9 @@ bool RailTile::isRail(int id)
return id == Tile::rail_Id || id == Tile::goldenRail_Id || id == Tile::detectorRail_Id;
}
RailTile::RailTile(int id, bool usesDataBit) : Tile(id, Material::decoration, isSolidRender())
// 4jcraft, changed from isSolidRender() to false, _init was changed by 4jstudios
// to take in a bool to avoid calling isSolidRender before the vptr is set,
RailTile::RailTile(int id, bool usesDataBit) : Tile(id, Material::decoration, false)
{
this->usesDataBit = usesDataBit;
this->setShape(0, 0, 0, 1, 2 / 16.0f, 1);
@ -673,4 +675,4 @@ void RailTile::registerIcons(IconRegister *iconRegister)
{
iconTurn = iconRegister->registerIcon(L"rail_turn");
}
}
}

View file

@ -16,7 +16,7 @@ const std::wstring RedStoneDustTile::TEXTURE_LINE = L"redstoneDust_line";
const std::wstring RedStoneDustTile::TEXTURE_CROSS_OVERLAY = L"redstoneDust_cross_overlay";
const std::wstring RedStoneDustTile::TEXTURE_LINE_OVERLAY = L"redstoneDust_line_overlay";
RedStoneDustTile::RedStoneDustTile(int id) : Tile(id, Material::decoration,isSolidRender())
RedStoneDustTile::RedStoneDustTile(int id) : Tile(id, Material::decoration, false)
{
shouldSignal = true;

View file

@ -6,7 +6,7 @@
#include "../Headers/net.minecraft.world.phys.h"
#include "ReedTile.h"
ReedTile::ReedTile(int id) : Tile( id, Material::plant,isSolidRender() )
ReedTile::ReedTile(int id) : Tile( id, Material::plant, false)
{
this->updateDefaultShape();
this->setTicking(true);

View file

@ -5,7 +5,7 @@
#include "TileEntities/SignTileEntity.h"
#include "SignTile.h"
SignTile::SignTile(int id, eINSTANCEOF clas, bool onGround) : EntityTile(id, Material::wood, isSolidRender())
SignTile::SignTile(int id, eINSTANCEOF clas, bool onGround) : EntityTile(id, Material::wood, false)
{
this->onGround = onGround;
this->clas = clas;
@ -126,4 +126,4 @@ int SignTile::cloneTileId(Level *level, int x, int y, int z)
void SignTile::registerIcons(IconRegister *iconRegister)
{
// None
}
}

View file

@ -5,7 +5,7 @@
#include "../Headers/net.minecraft.h"
#include "SkullTile.h"
SkullTile::SkullTile(int id) : EntityTile(id, Material::decoration, isSolidRender() )
SkullTile::SkullTile(int id) : EntityTile(id, Material::decoration, false)
{
setShape(4.0f / 16.0f, 0, 4.0f / 16.0f, 12.0f / 16.0f, .5f, 12.0f / 16.0f);
}
@ -267,4 +267,4 @@ std::wstring SkullTile::getTileItemIconName()
{
return L"";
//return SkullItem::ICON_NAMES[0];
}
}

View file

@ -10,7 +10,7 @@ int StairTile::DEAD_SPACES[8][2] = {
{0, 4}, {1, 5}, {0, 1}, {4, 5}
};
StairTile::StairTile(int id, Tile *base,int basedata) : Tile(id, base->material, isSolidRender())
StairTile::StairTile(int id, Tile *base,int basedata) : Tile(id, base->material, false)
{
this->base = base;
this->basedata = basedata;

View file

@ -6,7 +6,7 @@
const std::wstring TheEndPortalFrameTile::TEXTURE_EYE = L"endframe_eye";
TheEndPortalFrameTile::TheEndPortalFrameTile(int id) : Tile(id, Material::glass, isSolidRender() )
TheEndPortalFrameTile::TheEndPortalFrameTile(int id) : Tile(id, Material::glass, false )
{
iconTop = NULL;
iconEye = NULL;

View file

@ -21,7 +21,7 @@ void TheEndPortal::allowAnywhere(bool set)
TlsSetValue(tlsIdx,(LPVOID)(intptr_t)(set?1:0));
}
TheEndPortal::TheEndPortal(int id, Material *material) : EntityTile(id, material, isSolidRender())
TheEndPortal::TheEndPortal(int id, Material *material) : EntityTile(id, material, false)
{
this->setLightEmission(1.0f);
}

View file

@ -3,7 +3,7 @@
#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,isSolidRender())
ThinFenceTile::ThinFenceTile(int id, const std::wstring &tex, const std::wstring &edgeTex, Material *material, bool dropsResources) : Tile(id, material, false)
{
iconSide = NULL;
edgeTexture = edgeTex;

View file

@ -13,7 +13,7 @@ const int TopSnowTile::MAX_HEIGHT = 6;
const int TopSnowTile::HEIGHT_MASK = 7; // max 8 steps
TopSnowTile::TopSnowTile(int id) : Tile(id, Material::topSnow,isSolidRender())
TopSnowTile::TopSnowTile(int id) : Tile(id, Material::topSnow, false)
{
setShape(0, 0, 0, 1, 2 / 16.0f, 1);
setTicking(true);

View file

@ -4,7 +4,7 @@
#include "../Headers/net.minecraft.world.level.tile.h"
#include "TorchTile.h"
TorchTile::TorchTile(int id) : Tile(id, Material::decoration,isSolidRender())
TorchTile::TorchTile(int id) : Tile(id, Material::decoration, false)
{
this->setTicking(true);
}

View file

@ -6,7 +6,7 @@
#include "TrapDoorTile.h"
TrapDoorTile::TrapDoorTile(int id, Material *material) : Tile(id, material,isSolidRender())
TrapDoorTile::TrapDoorTile(int id, Material *material) : Tile(id, material, false)
{
float r = 0.5f;
float h = 1.0f;
@ -206,4 +206,4 @@ bool TrapDoorTile::attachesTo(int id)
Tile *tile = Tile::tiles[id];
return tile != NULL && (tile->material->isSolidBlocking() && tile->isCubeShaped()) || tile == Tile::lightGem || (dynamic_cast<HalfSlabTile *>(tile) != NULL) || (dynamic_cast<StairTile *>(tile) != NULL);
}
}

View file

@ -4,7 +4,7 @@
#include "../Headers/net.minecraft.world.level.tile.h"
#include "TripWireSourceTile.h"
TripWireSourceTile::TripWireSourceTile(int id) : Tile(id, Material::decoration, isSolidRender())
TripWireSourceTile::TripWireSourceTile(int id) : Tile(id, Material::decoration, false)
{
this->setTicking(true);
}

View file

@ -5,7 +5,7 @@
#include "../Headers/net.minecraft.world.phys.h"
#include "TripWireTile.h"
TripWireTile::TripWireTile(int id) : Tile(id, Material::decoration, isSolidRender())
TripWireTile::TripWireTile(int id) : Tile(id, Material::decoration, false)
{
setShape(0, 0, 0, 1, 2.5f / 16.0f, 1);
this->setTicking(true);

View file

@ -8,7 +8,7 @@
#include "../Headers/net.minecraft.stats.h"
#include "../Headers/net.minecraft.world.level.biome.h"
VineTile::VineTile(int id) : Tile(id, Material::replaceable_plant, isSolidRender() )
VineTile::VineTile(int id) : Tile(id, Material::replaceable_plant, false)
{
setTicking(true);
}

View file

@ -15,7 +15,7 @@ const unsigned int WallTile::COBBLE_NAMES[2] = { IDS_TILE_COBBLESTONE_WALL,
IDS_TILE_COBBLESTONE_WALL_MOSSY,
};
WallTile::WallTile(int id, Tile *baseTile) : Tile(id, baseTile->material, isSolidRender())
WallTile::WallTile(int id, Tile *baseTile) : Tile(id, baseTile->material, false)
{
setDestroyTime(baseTile->destroySpeed);
setExplodeable(baseTile->explosionResistance / 3);

View file

@ -4,7 +4,7 @@
#include "../Util/SharedConstants.h"
#include "WoolCarpetTile.h"
WoolCarpetTile::WoolCarpetTile(int id) : Tile(id, Material::clothDecoration, isSolidRender() )
WoolCarpetTile::WoolCarpetTile(int id) : Tile(id, Material::clothDecoration, false)
{
setShape(0, 0, 0, 1, 1 / 16.0f, 1);
setTicking(true);