static-method void initTiles() = 0xc358c;

vtable 0x115670;
vtable-size 0x104;

constructor (int id, int texture, const Material *material) = 0xc33a0;
size 0x5c;

method Tile *init() = 0xc34dc;

virtual-method bool isCubeShaped() = 0x8;
virtual-method int getRenderShape() = 0xc;
virtual-method void setShape(float x1, float y1, float z1, float x2, float y2, float z2) = 0x10;
virtual-method void updateShape(LevelSource *level, int x, int y, int z) = 0x14;
virtual-method void updateDefaultShape() = 0x18;
virtual-method float getBrightness(LevelSource *level, int x, int y, int z) = 0x20;
virtual-method int getTexture1(int face) = 0x28;
virtual-method int getTexture2(int face, int data) = 0x2c;
virtual-method int getTexture3(LevelSource *level, int x, int y, int z, int face) = 0x30;
virtual-method AABB *getAABB(Level *level, int x, int y, int z) = 0x34;
// Chain Tile_setShape_non_virtual and Tile_addAABBs_non_virtual, look at how stairs and fences do it
virtual-method void addAABBs(Level *level, int x, int y, int z, const AABB *intersecting, std::vector<AABB> &aabbs) = 0x38;
virtual-method bool isSolidRender() = 0x40;
virtual-method bool mayPlace(Level *level, int x, int y, int z, uchar face) = 0x4c;
virtual-method bool mayPlace2(Level *level, int x, int y, int z) = 0x50;
virtual-method void tick(Level *level, int x, int y, int z, Random *random) = 0x58;
virtual-method void neighborChanged(Level *level, int x, int y, int z, int neighborId) = 0x64;
virtual-method void onPlace(Level *level, int x, int y, int z) = 0x68;
virtual-method void onRemove(Level *level, int x, int y, int z) = 0x6c;
// Resource is the dropped item
virtual-method int getResource(int data, Random *random) = 0x70;
virtual-method int getResourceCount(Random *random) = 0x74;
// Returns 1 (default, not transparent), 2 (transparent when the texture is, like bushes), or 3 (semi-transparent, like water)
virtual-method int getRenderLayer() = 0x94;
virtual-method int use(Level *level, int x, int y, int z, Player *player) = 0x98;
virtual-method void setPlacedBy(Level *level, int x, int y, int z, Mob *placer) = 0xa8;
virtual-method void handleEntityInside(Level *level, int x, int y, int z, Entity *entity, Vec3 *speed) = 0xb4;
// Note that this may be ignored depending on the value of getRenderShape
virtual-method int getColor(LevelSource *level_source, int x, int y, int z) = 0xb8;
// This doesn't mean that it *is* producing a signal, rather that it might be
// Called by trapdoors, doors, and tnt. Never overridden (always returns false)
virtual-method bool isSignalSource() = 0xbc;
// Doesn't seem to be used, but it's hard to tell with virtual methods
// Yes, this IS a bool and not a char.
virtual-method bool getSignal(LevelSource *level, int x, int y, int z) = 0xc0;
// Called at the end of Level_getSignal
virtual-method bool getSignal2(LevelSource *level, int x, int y, int z, int direction) = 0xc4;
// Called by Level_hasDirectSignal
virtual-method bool getDirectSignal(Level *level, int x, int y, int z, int direction) = 0xc8;
virtual-method void entityInside(Level *level, int x, int y, int z, Entity *entity) = 0xcc;
virtual-method std::string getName() = 0xd8;
virtual-method std::string getDescriptionId() = 0xdc;
virtual-method Tile *setDescriptionId(const std::string &description_id) = 0xe0;
virtual-method Tile *setSoundType(const Tile_SoundType &sound_type) = 0xe8;
virtual-method Tile *setLightEmission(float light) = 0xf0;
virtual-method Tile *setExplodeable(float explodeable) = 0xf4;
virtual-method Tile *setDestroyTime(float destroy_time) = 0xf8;
virtual-method void spawnResources(Level *level, int x, int y, int z, int data, float chance) = 0x80;
virtual-method Tile *setLightBlock(int strength) = 0xec;
virtual-method bool shouldRenderFace(LevelSource *level_source, int x, int y, int z, int face) = 0x24;

property int texture = 0x4;
property int id = 0x8;
property float x1 = 0xc;
property float y1 = 0x10;
property float z1 = 0x14;
property float x2 = 0x18;
property float y2 = 0x1c;
property float z2 = 0x20;
property float destroyTime = 0x34;
property float explodeable = 0x38;
property int category = 0x3c;
property AABB aabb = 0x40;

// Globals, all of theses are 256 elements long
static-property Tile *tiles[256] = 0x180e08;
static-property int lightEmission[256] = 0x181214;
static-property bool isEntityTile[256] = 0x181f20;

// Tiles
static-property Tile *grass = 0x181b14;
static-property Tile *leaves = 0x18120c;
static-property Tile *chest = 0x181d60;
static-property Tile *water = 0x181b3c;
static-property Tile *lava = 0x181cc8;
static-property Tile *calmWater = 0x181b40;
static-property Tile *calmLava = 0x181ccc;
static-property Tile *glowingObsidian = 0x181dcc;
static-property Tile *web = 0x181d08;
static-property Tile *topSnow = 0x181b30;
static-property Tile *ice = 0x181d80;
static-property Tile *invisible_bedrock = 0x181d94;
static-property Tile *netherReactor = 0x181dd0;
static-property Tile *info_updateGame1 = 0x181c68;
static-property Tile *info_updateGame2 = 0x181c6c;
static-property Tile *bedrock = 0x181cc4;
static-property Tile *tallgrass = 0x181d0c;
static-property Tile *stoneSlab = 0x181b44;
static-property Tile *fire = 0x181de0;

// "Carried" Tiles
static-property Tile *leaves_carried = 0x181dd8;
static-property Tile *grass_carried = 0x181dd4;

// Sounds
static-property Tile_SoundType SOUND_STONE = 0x181c80;
static-property Tile_SoundType SOUND_WOOD  = 0x181cb4;
static-property Tile_SoundType SOUND_GRASS  = 0x181c94;
