the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
1#include "stdafx.h"
2#include "net.minecraft.stats.h"
3#include "net.minecraft.locale.h"
4#include "net.minecraft.world.entity.h"
5#include "net.minecraft.world.entity.item.h"
6#include "net.minecraft.world.entity.player.h"
7#include "net.minecraft.world.item.h"
8#include "net.minecraft.world.item.enchantment.h"
9#include "net.minecraft.world.level.material.h"
10#include "net.minecraft.world.level.tile.h"
11#include "net.minecraft.world.level.tile.entity.h"
12#include "net.minecraft.world.level.h"
13#include "net.minecraft.world.level.redstone.h"
14#include "net.minecraft.world.phys.h"
15#include "net.minecraft.world.food.h"
16#include "net.minecraft.world.h"
17#include "net.minecraft.h"
18#include "Tile.h"
19
20wstring Tile::TILE_DESCRIPTION_PREFIX = L"Tile.";
21
22const float Tile::INDESTRUCTIBLE_DESTROY_TIME = -1.0f;
23
24Tile::SoundType *Tile::SOUND_NORMAL = NULL;
25Tile::SoundType *Tile::SOUND_WOOD = NULL;
26Tile::SoundType *Tile::SOUND_GRAVEL = NULL;
27Tile::SoundType *Tile::SOUND_GRASS = NULL;
28Tile::SoundType *Tile::SOUND_STONE = NULL;
29Tile::SoundType *Tile::SOUND_METAL = NULL;
30Tile::SoundType *Tile::SOUND_GLASS = NULL;
31Tile::SoundType *Tile::SOUND_CLOTH = NULL;
32Tile::SoundType *Tile::SOUND_SAND = NULL;
33Tile::SoundType *Tile::SOUND_SNOW = NULL;
34Tile::SoundType *Tile::SOUND_LADDER = NULL;
35Tile::SoundType *Tile::SOUND_ANVIL = NULL;
36
37bool Tile::solid[TILE_NUM_COUNT];
38int Tile::lightBlock[TILE_NUM_COUNT];
39bool Tile::transculent[TILE_NUM_COUNT];
40int Tile::lightEmission[TILE_NUM_COUNT];
41unsigned char Tile::_sendTileData[TILE_NUM_COUNT]; // 4J changed - was bool, now bitfield to indicate which bits are important to be sent
42bool Tile::mipmapEnable[TILE_NUM_COUNT];
43bool Tile::propagate[TILE_NUM_COUNT];
44
45Tile **Tile::tiles = NULL;
46
47Tile *Tile::stone = NULL;
48GrassTile *Tile::grass = NULL;
49Tile *Tile::dirt = NULL;
50Tile *Tile::cobblestone = NULL;
51Tile *Tile::wood = NULL;
52Tile *Tile::sapling = NULL;
53Tile *Tile::unbreakable = NULL;
54LiquidTile *Tile::water = NULL;
55Tile *Tile::calmWater = NULL;
56LiquidTile *Tile::lava = NULL;
57Tile *Tile::calmLava = NULL;
58Tile *Tile::sand = NULL;
59Tile *Tile::gravel = NULL;
60Tile *Tile::goldOre = NULL;
61Tile *Tile::ironOre = NULL;
62Tile *Tile::coalOre = NULL;
63Tile *Tile::treeTrunk = NULL;
64LeafTile *Tile::leaves = NULL;
65Tile *Tile::sponge = NULL;
66Tile *Tile::glass = NULL;
67Tile *Tile::lapisOre = NULL;
68Tile *Tile::lapisBlock = NULL;
69Tile *Tile::dispenser = NULL;
70Tile *Tile::sandStone = NULL;
71Tile *Tile::noteblock = NULL;
72Tile *Tile::bed = NULL;
73Tile *Tile::goldenRail = NULL;
74Tile *Tile::detectorRail = NULL;
75PistonBaseTile *Tile::pistonStickyBase = NULL;
76Tile *Tile::web = NULL;
77TallGrass *Tile::tallgrass = NULL;
78DeadBushTile *Tile::deadBush = NULL;
79PistonBaseTile *Tile::pistonBase = NULL;
80PistonExtensionTile *Tile::pistonExtension = NULL;
81Tile *Tile::wool = NULL;
82PistonMovingPiece *Tile::pistonMovingPiece = NULL;
83Bush *Tile::flower = NULL;
84Bush *Tile::rose = NULL;
85Bush *Tile::mushroom_brown = NULL;
86Bush *Tile::mushroom_red = NULL;
87Tile *Tile::goldBlock = NULL;
88Tile *Tile::ironBlock = NULL;
89HalfSlabTile *Tile::stoneSlab = NULL;
90HalfSlabTile *Tile::stoneSlabHalf = NULL;
91Tile *Tile::redBrick = NULL;
92Tile *Tile::tnt = NULL;
93Tile *Tile::bookshelf = NULL;
94Tile *Tile::mossyCobblestone = NULL;
95Tile *Tile::obsidian = NULL;
96Tile *Tile::torch = NULL;
97FireTile *Tile::fire = NULL;
98Tile *Tile::mobSpawner = NULL;
99Tile *Tile::stairs_wood = NULL;
100ChestTile *Tile::chest = NULL;
101RedStoneDustTile *Tile::redStoneDust = NULL;
102Tile *Tile::diamondOre = NULL;
103Tile *Tile::diamondBlock = NULL;
104Tile *Tile::workBench = NULL;
105Tile *Tile::wheat = NULL;
106Tile *Tile::farmland = NULL;
107Tile *Tile::furnace = NULL;
108Tile *Tile::furnace_lit = NULL;
109Tile *Tile::sign = NULL;
110Tile *Tile::door_wood = NULL;
111Tile *Tile::ladder = NULL;
112Tile *Tile::rail = NULL;
113Tile *Tile::stairs_stone = NULL;
114Tile *Tile::wallSign = NULL;
115Tile *Tile::lever = NULL;
116Tile *Tile::pressurePlate_stone = NULL;
117Tile *Tile::door_iron = NULL;
118Tile *Tile::pressurePlate_wood = NULL;
119Tile *Tile::redStoneOre = NULL;
120Tile *Tile::redStoneOre_lit = NULL;
121Tile *Tile::redstoneTorch_off = NULL;
122Tile *Tile::redstoneTorch_on = NULL;
123Tile *Tile::button = NULL;
124Tile *Tile::topSnow = NULL;
125Tile *Tile::ice = NULL;
126Tile *Tile::snow = NULL;
127Tile *Tile::cactus = NULL;
128Tile *Tile::clay = NULL;
129Tile *Tile::reeds = NULL;
130Tile *Tile::jukebox = NULL;
131Tile *Tile::fence = NULL;
132Tile *Tile::pumpkin = NULL;
133Tile *Tile::netherRack = NULL;
134Tile *Tile::soulsand = NULL;
135Tile *Tile::glowstone = NULL;
136PortalTile *Tile::portalTile = NULL;
137Tile *Tile::litPumpkin = NULL;
138Tile *Tile::cake = NULL;
139RepeaterTile *Tile::diode_off = NULL;
140RepeaterTile *Tile::diode_on = NULL;
141Tile *Tile::stained_glass = NULL;
142Tile *Tile::trapdoor = NULL;
143
144Tile *Tile::monsterStoneEgg = NULL;
145Tile *Tile::stoneBrick = NULL;
146Tile *Tile::hugeMushroom_brown = NULL;
147Tile *Tile::hugeMushroom_red = NULL;
148Tile *Tile::ironFence = NULL;
149Tile *Tile::thinGlass = NULL;
150Tile *Tile::melon = NULL;
151Tile *Tile::pumpkinStem = NULL;
152Tile *Tile::melonStem = NULL;
153Tile *Tile::vine = NULL;
154Tile *Tile::fenceGate = NULL;
155Tile *Tile::stairs_bricks = NULL;
156Tile *Tile::stairs_stoneBrickSmooth = NULL;
157
158MycelTile *Tile::mycel = NULL;
159Tile *Tile::waterLily = NULL;
160Tile *Tile::netherBrick = NULL;
161Tile *Tile::netherFence = NULL;
162Tile *Tile::stairs_netherBricks = NULL;
163Tile *Tile::netherStalk = NULL;
164Tile *Tile::enchantTable = NULL;
165Tile *Tile::brewingStand = NULL;
166CauldronTile *Tile::cauldron = NULL;
167Tile *Tile::endPortalTile = NULL;
168Tile *Tile::endPortalFrameTile = NULL;
169Tile *Tile::endStone = NULL;
170Tile *Tile::dragonEgg = NULL;
171Tile *Tile::redstoneLight = NULL;
172Tile *Tile::redstoneLight_lit = NULL;
173
174// TU9
175Tile *Tile::stairs_sandstone = NULL;
176Tile *Tile::woodStairsDark = NULL;
177Tile *Tile::woodStairsBirch = NULL;
178Tile *Tile::woodStairsJungle = NULL;
179Tile *Tile::commandBlock = NULL;
180BeaconTile *Tile::beacon = NULL;
181Tile *Tile::button_wood = NULL;
182HalfSlabTile *Tile::woodSlab = NULL;
183HalfSlabTile *Tile::woodSlabHalf = NULL;
184
185Tile *Tile::emeraldOre = NULL;
186Tile *Tile::enderChest = NULL;
187TripWireSourceTile *Tile::tripWireSource = NULL;
188Tile *Tile::tripWire = NULL;
189Tile *Tile::emeraldBlock = NULL;
190
191
192Tile *Tile::cocoa = NULL;
193Tile *Tile::skull = NULL;
194
195Tile *Tile::cobbleWall = NULL;
196Tile *Tile::flowerPot = NULL;
197Tile *Tile::carrots = NULL;
198Tile *Tile::potatoes = NULL;
199Tile *Tile::anvil = NULL;
200Tile *Tile::chest_trap = NULL;
201Tile *Tile::weightedPlate_light = NULL;
202Tile *Tile::weightedPlate_heavy = NULL;
203ComparatorTile *Tile::comparator_off = NULL;
204ComparatorTile *Tile::comparator_on = NULL;
205
206DaylightDetectorTile *Tile::daylightDetector = NULL;
207Tile *Tile::redstoneBlock = NULL;
208
209Tile *Tile::netherQuartz = NULL;
210HopperTile *Tile::hopper = NULL;
211Tile *Tile::quartzBlock = NULL;
212Tile *Tile::stairs_quartz = NULL;
213Tile *Tile::activatorRail = NULL;
214Tile *Tile::dropper = NULL;
215Tile *Tile::clayHardened_colored = NULL;
216Tile *Tile::stained_glass_pane = NULL;
217
218Tile *Tile::hayBlock = NULL;
219Tile *Tile::woolCarpet = NULL;
220Tile *Tile::clayHardened = NULL;
221Tile *Tile::coalBlock = NULL;
222
223DWORD Tile::tlsIdxShape = TlsAlloc();
224
225Tile::ThreadStorage::ThreadStorage()
226{
227 xx0 = yy0 = zz0 = xx1 = yy1 = zz1 = 0.0;
228 tileId = 0;
229}
230
231void Tile::CreateNewThreadStorage()
232{
233 ThreadStorage *tls = new ThreadStorage();
234 TlsSetValue(Tile::tlsIdxShape, tls);
235}
236
237void Tile::ReleaseThreadStorage()
238{
239 ThreadStorage *tls = (ThreadStorage *)TlsGetValue(Tile::tlsIdxShape);
240 delete tls;
241}
242
243void Tile::staticCtor()
244{
245 Tile::SOUND_NORMAL = new Tile::SoundType(eMaterialSoundType_STONE, 1, 1);
246 Tile::SOUND_WOOD = new Tile::SoundType(eMaterialSoundType_WOOD, 1, 1);
247 Tile::SOUND_GRAVEL = new Tile::SoundType(eMaterialSoundType_GRAVEL, 1, 1);
248 Tile::SOUND_GRASS = new Tile::SoundType(eMaterialSoundType_GRASS, 1, 1);
249 Tile::SOUND_STONE = new Tile::SoundType(eMaterialSoundType_STONE, 1, 1);
250 Tile::SOUND_METAL = new Tile::SoundType(eMaterialSoundType_STONE, 1, 1.5f);
251 Tile::SOUND_GLASS = new Tile::SoundType(eMaterialSoundType_STONE, 1, 1, eSoundType_RANDOM_GLASS,eSoundType_STEP_STONE);
252 Tile::SOUND_CLOTH = new Tile::SoundType(eMaterialSoundType_CLOTH, 1, 1);
253 Tile::SOUND_SAND = new Tile::SoundType(eMaterialSoundType_SAND, 1, 1);
254 Tile::SOUND_SNOW = new Tile::SoundType(eMaterialSoundType_SNOW, 1, 1);
255 Tile::SOUND_LADDER = new Tile::SoundType(eMaterialSoundType_LADDER, 1, 1,eSoundType_DIG_WOOD);
256 Tile::SOUND_ANVIL = new Tile::SoundType(eMaterialSoundType_ANVIL, 0.3f, 1, eSoundType_DIG_STONE, eSoundType_RANDOM_ANVIL_LAND);
257
258 Tile::tiles = new Tile *[TILE_NUM_COUNT];
259 memset( tiles, 0, sizeof( Tile *)*TILE_NUM_COUNT );
260
261 Tile::stone = (new StoneTile(1)) ->setDestroyTime(1.5f)->setExplodeable(10)->setSoundType(Tile::SOUND_STONE)->setIconName(L"stone")->setDescriptionId(IDS_TILE_STONE)->setUseDescriptionId(IDS_DESC_STONE);
262 Tile::grass = (GrassTile *) (new GrassTile(2)) ->setDestroyTime(0.6f)->setSoundType(Tile::SOUND_GRASS)->setIconName(L"grass")->setDescriptionId(IDS_TILE_GRASS)->setUseDescriptionId(IDS_DESC_GRASS);
263 Tile::dirt = (new DirtTile(3)) ->setDestroyTime(0.5f)->setSoundType(Tile::SOUND_GRAVEL)->setIconName(L"dirt")->setDescriptionId(IDS_TILE_DIRT)->setUseDescriptionId(IDS_DESC_DIRT);
264 Tile::cobblestone = (new Tile(4, Material::stone)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_structblock, Item::eMaterial_stone)->setDestroyTime(2.0f)->setExplodeable(10)->setSoundType(Tile::SOUND_STONE)->setIconName(L"cobblestone")->setDescriptionId(IDS_TILE_STONE_BRICK)->setUseDescriptionId(IDS_DESC_STONE_BRICK);
265 Tile::wood = (new WoodTile(5)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_structwoodstuff, Item::eMaterial_wood)->setDestroyTime(2.0f)->setExplodeable(5)->setSoundType(Tile::SOUND_WOOD)->setIconName(L"planks")->setDescriptionId(IDS_TILE_OAKWOOD_PLANKS)->sendTileData()->setUseDescriptionId(IDS_DESC_WOODENPLANKS);
266 Tile::sapling = (new Sapling(6)) ->setDestroyTime(0.0f)->setSoundType(Tile::SOUND_GRASS)->setIconName(L"sapling")->setDescriptionId(IDS_TILE_SAPLING)->sendTileData()->setUseDescriptionId(IDS_DESC_SAPLING)->disableMipmap();
267 Tile::unbreakable = (new Tile(7, Material::stone)) ->setIndestructible()->setExplodeable(6000000)->setSoundType(Tile::SOUND_STONE)->setIconName(L"bedrock")->setDescriptionId(IDS_TILE_BEDROCK)->setNotCollectStatistics()->setUseDescriptionId(IDS_DESC_BEDROCK);
268 Tile::water = (LiquidTile *)(new LiquidTileDynamic(8, Material::water)) ->setDestroyTime(100.0f)->setLightBlock(3)->setIconName(L"water_flow")->setDescriptionId(IDS_TILE_WATER)->setNotCollectStatistics()->sendTileData()->setUseDescriptionId(IDS_DESC_WATER);
269 Tile::calmWater = (new LiquidTileStatic(9, Material::water)) ->setDestroyTime(100.0f)->setLightBlock(3)->setIconName(L"water_still")->setDescriptionId(IDS_TILE_WATER)->setNotCollectStatistics()->sendTileData()->setUseDescriptionId(IDS_DESC_WATER);
270 Tile::lava = (LiquidTile *)(new LiquidTileDynamic(10, Material::lava)) ->setDestroyTime(00.0f)->setLightEmission(1.0f)->setLightBlock(255)->setIconName(L"lava_flow")->setDescriptionId(IDS_TILE_LAVA)->setNotCollectStatistics()->sendTileData()->setUseDescriptionId(IDS_DESC_LAVA);
271
272 Tile::calmLava = (new LiquidTileStatic(11, Material::lava)) ->setDestroyTime(100.0f)->setLightEmission(1.0f)->setLightBlock(255)->setIconName(L"lava_still")->setDescriptionId(IDS_TILE_LAVA)->setNotCollectStatistics()->sendTileData()->setUseDescriptionId(IDS_DESC_LAVA);
273 Tile::sand = (new HeavyTile(12)) ->setDestroyTime(0.5f)->setSoundType(Tile::SOUND_SAND)->setIconName(L"sand")->setDescriptionId(IDS_TILE_SAND)->setUseDescriptionId(IDS_DESC_SAND);
274 Tile::gravel = (new GravelTile(13)) ->setDestroyTime(0.6f)->setSoundType(Tile::SOUND_GRAVEL)->setIconName(L"gravel")->setDescriptionId(IDS_TILE_GRAVEL)->setUseDescriptionId(IDS_DESC_GRAVEL);
275 Tile::goldOre = (new OreTile(14)) ->setDestroyTime(3.0f)->setExplodeable(5)->setSoundType(Tile::SOUND_STONE)->setIconName(L"gold_ore")->setDescriptionId(IDS_TILE_ORE_GOLD)->setUseDescriptionId(IDS_DESC_ORE_GOLD);
276 Tile::ironOre = (new OreTile(15)) ->setDestroyTime(3.0f)->setExplodeable(5)->setSoundType(Tile::SOUND_STONE)->setIconName(L"iron_ore")->setDescriptionId(IDS_TILE_ORE_IRON)->setUseDescriptionId(IDS_DESC_ORE_IRON);
277 Tile::coalOre = (new OreTile(16)) ->setDestroyTime(3.0f)->setExplodeable(5)->setSoundType(Tile::SOUND_STONE)->setIconName(L"coal_ore")->setDescriptionId(IDS_TILE_ORE_COAL)->setUseDescriptionId(IDS_DESC_ORE_COAL);
278 Tile::treeTrunk = (new TreeTile(17))->setDestroyTime(2.0f) ->setSoundType(Tile::SOUND_WOOD)->setIconName(L"log")->setDescriptionId(IDS_TILE_LOG)->sendTileData()->setUseDescriptionId(IDS_DESC_LOG);
279 // 4J - for leaves, have specified that only the data bits that encode the type of leaf are important to be sent
280 Tile::leaves = (LeafTile *)(new LeafTile(18)) ->setDestroyTime(0.2f)->setLightBlock(1)->setSoundType(Tile::SOUND_GRASS)->setIconName(L"leaves")->setDescriptionId(IDS_TILE_LEAVES)->sendTileData(LeafTile::LEAF_TYPE_MASK)->setUseDescriptionId(IDS_DESC_LEAVES);
281 Tile::sponge = (new Sponge(19)) ->setDestroyTime(0.6f)->setSoundType(Tile::SOUND_GRASS)->setIconName(L"sponge")->setDescriptionId(IDS_TILE_SPONGE)->setUseDescriptionId(IDS_DESC_SPONGE);
282 Tile::glass = (new GlassTile(20, Material::glass, false)) ->setDestroyTime(0.3f)->setSoundType(Tile::SOUND_GLASS)->setIconName(L"glass")->setDescriptionId(IDS_TILE_GLASS)->setUseDescriptionId(IDS_DESC_GLASS);
283
284 Tile::lapisOre = (new OreTile(21)) ->setDestroyTime(3.0f)->setExplodeable(5)->setSoundType(Tile::SOUND_STONE)->setIconName(L"lapis_ore")->setDescriptionId(IDS_TILE_ORE_LAPIS)->setUseDescriptionId(IDS_DESC_ORE_LAPIS);
285 Tile::lapisBlock = (new Tile(22, Material::stone)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_block, Item::eMaterial_lapis)->setDestroyTime(3.0f)->setExplodeable(5)->setSoundType(Tile::SOUND_STONE)->setIconName(L"lapis_block")->setDescriptionId(IDS_TILE_BLOCK_LAPIS)->setUseDescriptionId(IDS_DESC_BLOCK_LAPIS);
286 Tile::dispenser = (new DispenserTile(23)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_redstoneContainer, Item::eMaterial_undefined)->setDestroyTime(3.5f)->setSoundType(Tile::SOUND_STONE)->setIconName(L"dispenser")->setDescriptionId(IDS_TILE_DISPENSER)->sendTileData()->setUseDescriptionId(IDS_DESC_DISPENSER);
287 Tile::sandStone = (new SandStoneTile(24)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_structblock, Item::eMaterial_sand)->setSoundType(Tile::SOUND_STONE)->setDestroyTime(0.8f)->sendTileData()->setIconName(L"sandstone")->setDescriptionId(IDS_TILE_SANDSTONE)->setUseDescriptionId(IDS_DESC_SANDSTONE)->sendTileData();
288 Tile::noteblock = (new NoteBlockTile(25)) ->setDestroyTime(0.8f)->setIconName(L"noteblock")->setDescriptionId(IDS_TILE_MUSIC_BLOCK)->sendTileData()->setUseDescriptionId(IDS_DESC_NOTEBLOCK);
289 Tile::bed = (new BedTile(26)) ->setDestroyTime(0.2f)->setIconName(L"bed")->setDescriptionId(IDS_TILE_BED)->setNotCollectStatistics()->sendTileData()->setUseDescriptionId(IDS_DESC_BED);
290 Tile::goldenRail = (new PoweredRailTile(27)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_rail, Item::eMaterial_gold)->setDestroyTime(0.7f)->setSoundType(Tile::SOUND_METAL)->setIconName(L"rail_golden")->setDescriptionId(IDS_TILE_GOLDEN_RAIL)->sendTileData()->setUseDescriptionId(IDS_DESC_POWEREDRAIL)->disableMipmap();
291 Tile::detectorRail = (new DetectorRailTile(28)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_rail, Item::eMaterial_detector)->setDestroyTime(0.7f)->setSoundType(Tile::SOUND_METAL)->setIconName(L"rail_detector")->setDescriptionId(IDS_TILE_DETECTOR_RAIL)->sendTileData()->setUseDescriptionId(IDS_DESC_DETECTORRAIL)->disableMipmap();
292 Tile::pistonStickyBase = (PistonBaseTile *)(new PistonBaseTile(29, true)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_piston, Item::eMaterial_stickypiston)->setIconName(L"pistonStickyBase")->setDescriptionId(IDS_TILE_PISTON_STICK_BASE)->setUseDescriptionId(IDS_DESC_STICKY_PISTON)->sendTileData();
293 Tile::web = (new WebTile(30)) ->setLightBlock(1)->setDestroyTime(4.0f)->setIconName(L"web")->setDescriptionId(IDS_TILE_WEB)->setUseDescriptionId(IDS_DESC_WEB);
294
295 Tile::tallgrass = (TallGrass *)(new TallGrass(31)) ->setDestroyTime(0.0f)->setSoundType(Tile::SOUND_GRASS)->setIconName(L"tallgrass")->setDescriptionId(IDS_TILE_TALL_GRASS)->setUseDescriptionId(IDS_DESC_TALL_GRASS)->disableMipmap();
296 Tile::deadBush = (DeadBushTile *)(new DeadBushTile(32)) ->setDestroyTime(0.0f)->setSoundType(Tile::SOUND_GRASS)->setIconName(L"deadbush")->setDescriptionId(IDS_TILE_DEAD_BUSH)->setUseDescriptionId(IDS_DESC_DEAD_BUSH)->disableMipmap();
297 Tile::pistonBase = (PistonBaseTile *)(new PistonBaseTile(33,false)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_piston, Item::eMaterial_piston)->setIconName(L"pistonBase")->setDescriptionId(IDS_TILE_PISTON_BASE)->setUseDescriptionId(IDS_DESC_PISTON)->sendTileData();
298 Tile::pistonExtension = (PistonExtensionTile *)(new PistonExtensionTile(34))->setDescriptionId(IDS_TILE_PISTON_BASE)->setUseDescriptionId(-1)->sendTileData();
299 Tile::wool = (new ColoredTile(35, Material::cloth)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_cloth, Item::eMaterial_cloth)->setDestroyTime(0.8f)->setSoundType(Tile::SOUND_CLOTH)->setIconName(L"wool_colored")->setDescriptionId(IDS_TILE_CLOTH)->sendTileData()->setUseDescriptionId(IDS_DESC_WOOL);
300 Tile::pistonMovingPiece = (PistonMovingPiece *)(new PistonMovingPiece(36)) ->setDescriptionId(IDS_TILE_PISTON_BASE)->setUseDescriptionId(-1);
301 Tile::flower = (Bush *) (new Bush(37)) ->setDestroyTime(0.0f)->setSoundType(Tile::SOUND_GRASS)->setIconName(L"flower_dandelion")->setDescriptionId(IDS_TILE_FLOWER)->setUseDescriptionId(IDS_DESC_FLOWER)->disableMipmap();
302 Tile::rose = (Bush *) (new Bush(38)) ->setDestroyTime(0.0f)->setSoundType(Tile::SOUND_GRASS)->setIconName(L"flower_rose")->setDescriptionId(IDS_TILE_ROSE)->setUseDescriptionId(IDS_DESC_FLOWER)->disableMipmap();
303 Tile::mushroom_brown = (Bush *) (new Mushroom(39)) ->setDestroyTime(0.0f)->setSoundType(Tile::SOUND_GRASS)->setLightEmission(2 / 16.0f)->setIconName(L"mushroom_brown")->setDescriptionId(IDS_TILE_MUSHROOM)->setUseDescriptionId(IDS_DESC_MUSHROOM)->disableMipmap();
304 Tile::mushroom_red = (Bush *) (new Mushroom(40)) ->setDestroyTime(0.0f)->setSoundType(Tile::SOUND_GRASS)->setIconName(L"mushroom_red")->setDescriptionId(IDS_TILE_MUSHROOM)->setUseDescriptionId(IDS_DESC_MUSHROOM)->disableMipmap();
305
306 Tile::goldBlock = (new MetalTile(41)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_block, Item::eMaterial_gold)->setDestroyTime(3.0f)->setExplodeable(10)->setSoundType(Tile::SOUND_METAL)->setIconName(L"gold_block")->setDescriptionId(IDS_TILE_BLOCK_GOLD)->setUseDescriptionId(IDS_DESC_BLOCK_GOLD);
307 Tile::ironBlock = (new MetalTile(42)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_block, Item::eMaterial_iron)->setDestroyTime(5.0f)->setExplodeable(10)->setSoundType(Tile::SOUND_METAL)->setIconName(L"iron_block")->setDescriptionId(IDS_TILE_BLOCK_IRON)->setUseDescriptionId(IDS_DESC_BLOCK_IRON);
308 Tile::stoneSlab = (HalfSlabTile *) (new StoneSlabTile(Tile::stoneSlab_Id, true)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_slab, Item::eMaterial_stone)->setDestroyTime(2.0f)->setExplodeable(10)->setSoundType(Tile::SOUND_STONE)->setIconName(L"stoneSlab")->setDescriptionId(IDS_TILE_STONESLAB)->setUseDescriptionId(IDS_DESC_SLAB);
309 Tile::stoneSlabHalf = (HalfSlabTile *) (new StoneSlabTile(Tile::stoneSlabHalf_Id, false)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_halfslab, Item::eMaterial_stone)->setDestroyTime(2.0f)->setExplodeable(10)->setSoundType(Tile::SOUND_STONE)->setIconName(L"stoneSlab")->setDescriptionId(IDS_TILE_STONESLAB)->setUseDescriptionId(IDS_DESC_HALFSLAB);
310 Tile::redBrick = (new Tile(45, Material::stone)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_structblock, Item::eMaterial_brick)->setDestroyTime(2.0f)->setExplodeable(10)->setSoundType(Tile::SOUND_STONE)->setIconName(L"brick")->setDescriptionId(IDS_TILE_BRICK)->setUseDescriptionId(IDS_DESC_BRICK);
311 Tile::tnt = (new TntTile(46)) ->setDestroyTime(0.0f)->setSoundType(Tile::SOUND_GRASS)->setIconName(L"tnt")->setDescriptionId(IDS_TILE_TNT)->setUseDescriptionId(IDS_DESC_TNT);
312 Tile::bookshelf = (new BookshelfTile(47)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_paper, Item::eMaterial_bookshelf)->setDestroyTime(1.5f)->setSoundType(Tile::SOUND_WOOD)->setIconName(L"bookshelf")->setDescriptionId(IDS_TILE_BOOKSHELF)->setUseDescriptionId(IDS_DESC_BOOKSHELF);
313 Tile::mossyCobblestone = (new Tile(48, Material::stone)) ->setDestroyTime(2.0f)->setExplodeable(10)->setSoundType(Tile::SOUND_STONE)->setIconName(L"cobblestone_mossy")->setDescriptionId(IDS_TILE_STONE_MOSS)->setUseDescriptionId(IDS_DESC_MOSS_STONE);
314 Tile::obsidian = (new ObsidianTile(49)) ->setDestroyTime(50.0f)->setExplodeable(2000)->setSoundType(Tile::SOUND_STONE)->setIconName(L"obsidian")->setDescriptionId(IDS_TILE_OBSIDIAN)->setUseDescriptionId(IDS_DESC_OBSIDIAN);
315 Tile::torch = (new TorchTile(50)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_torch, Item::eMaterial_wood)->setDestroyTime(0.0f)->setLightEmission(15 / 16.0f)->setSoundType(Tile::SOUND_WOOD)->setIconName(L"torch_on")->setDescriptionId(IDS_TILE_TORCH)->setUseDescriptionId(IDS_DESC_TORCH)->disableMipmap();
316
317 Tile::fire = (FireTile *) ((new FireTile(51)) ->setDestroyTime(0.0f)->setLightEmission(1.0f)->setSoundType(Tile::SOUND_WOOD))->setIconName(L"fire")->setDescriptionId(IDS_TILE_FIRE)->setNotCollectStatistics()->setUseDescriptionId(-1);
318 Tile::mobSpawner = (new MobSpawnerTile(52)) ->setDestroyTime(5.0f)->setSoundType(Tile::SOUND_METAL)->setIconName(L"mob_spawner")->setDescriptionId(IDS_TILE_MOB_SPAWNER)->setNotCollectStatistics()->setUseDescriptionId(IDS_DESC_MOB_SPAWNER);
319 Tile::stairs_wood = (new StairTile(53, Tile::wood,0)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_stairs, Item::eMaterial_wood) ->setIconName(L"stairsWood")->setDescriptionId(IDS_TILE_STAIRS_WOOD) ->sendTileData()->setUseDescriptionId(IDS_DESC_STAIRS);
320 Tile::chest = (ChestTile *)(new ChestTile(54, ChestTile::TYPE_BASIC)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_chest, Item::eMaterial_wood)->setDestroyTime(2.5f)->setSoundType(Tile::SOUND_WOOD)->setIconName(L"chest")->setDescriptionId(IDS_TILE_CHEST)->sendTileData()->setUseDescriptionId(IDS_DESC_CHEST);
321 Tile::redStoneDust = (RedStoneDustTile *)(new RedStoneDustTile(55)) ->setDestroyTime(0.0f)->setSoundType(Tile::SOUND_NORMAL)->setIconName(L"redstone_dust")->setDescriptionId(IDS_TILE_REDSTONE_DUST)->setNotCollectStatistics()->sendTileData()->setUseDescriptionId(IDS_DESC_REDSTONE_DUST);
322 Tile::diamondOre = (new OreTile(56)) ->setDestroyTime(3.0f)->setExplodeable(5)->setSoundType(Tile::SOUND_STONE)->setIconName(L"diamond_ore")->setDescriptionId(IDS_TILE_ORE_DIAMOND)->setUseDescriptionId(IDS_DESC_ORE_DIAMOND);
323 Tile::diamondBlock = (new MetalTile(57)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_block, Item::eMaterial_diamond)->setDestroyTime(5.0f)->setExplodeable(10)->setSoundType(Tile::SOUND_METAL)->setIconName(L"diamond_block")->setDescriptionId(IDS_TILE_BLOCK_DIAMOND)->setUseDescriptionId(IDS_DESC_BLOCK_DIAMOND);
324 Tile::workBench = (new WorkbenchTile(58)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_device, Item::eMaterial_wood)->setDestroyTime(2.5f)->setSoundType(Tile::SOUND_WOOD)->setIconName(L"crafting_table")->setDescriptionId(IDS_TILE_WORKBENCH)->setUseDescriptionId(IDS_DESC_CRAFTINGTABLE);
325 Tile::wheat = (new CropTile(59)) ->setIconName(L"wheat")->setDescriptionId(IDS_TILE_CROPS)->setNotCollectStatistics()->sendTileData()->setUseDescriptionId(IDS_DESC_CROPS)->disableMipmap();
326 Tile::farmland = (new FarmTile(60)) ->setDestroyTime(0.6f)->setSoundType(Tile::SOUND_GRAVEL)->setIconName(L"farmland")->setDescriptionId(IDS_TILE_FARMLAND)->setUseDescriptionId(IDS_DESC_FARMLAND)->sendTileData();
327
328 Tile::furnace = (new FurnaceTile(61, false)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_device, Item::eMaterial_stone)->setDestroyTime(3.5f)->setSoundType(Tile::SOUND_STONE)->setIconName(L"furnace")->setDescriptionId(IDS_TILE_FURNACE)->sendTileData()->setUseDescriptionId(IDS_DESC_FURNACE);
329 Tile::furnace_lit = (new FurnaceTile(62, true)) ->setDestroyTime(3.5f)->setSoundType(Tile::SOUND_STONE)->setLightEmission(14 / 16.0f)->setIconName(L"furnace")->setDescriptionId(IDS_TILE_FURNACE)->sendTileData()->setUseDescriptionId(IDS_DESC_FURNACE);
330 Tile::sign = (new SignTile(63, eTYPE_SIGNTILEENTITY, true)) ->setDestroyTime(1.0f)->setSoundType(Tile::SOUND_WOOD)->setIconName(L"sign")->setDescriptionId(IDS_TILE_SIGN)->setNotCollectStatistics()->sendTileData()->setUseDescriptionId(IDS_DESC_SIGN);
331 Tile::door_wood = (new DoorTile(64, Material::wood)) ->setDestroyTime(3.0f)->setSoundType(Tile::SOUND_WOOD)->setIconName(L"door_wood")->setDescriptionId(IDS_TILE_DOOR_WOOD)->setNotCollectStatistics()->sendTileData()->setUseDescriptionId(IDS_DESC_DOOR_WOOD);
332 Tile::ladder = (new LadderTile(65)) ->setDestroyTime(0.4f)->setSoundType(Tile::SOUND_LADDER)->setIconName(L"ladder")->setDescriptionId(IDS_TILE_LADDER)->sendTileData()->setUseDescriptionId(IDS_DESC_LADDER)->disableMipmap();
333 Tile::rail = (new RailTile(66)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_rail, Item::eMaterial_iron)->setDestroyTime(0.7f)->setSoundType(Tile::SOUND_METAL)->setIconName(L"rail_normal")->setDescriptionId(IDS_TILE_RAIL)->sendTileData()->setUseDescriptionId(IDS_DESC_RAIL)->disableMipmap();
334 Tile::stairs_stone =(new StairTile(67, Tile::cobblestone,0)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_stairs, Item::eMaterial_stone) ->setIconName(L"stairsStone")->setDescriptionId(IDS_TILE_STAIRS_STONE) ->sendTileData()->setUseDescriptionId(IDS_DESC_STAIRS);
335 Tile::wallSign = (new SignTile(68, eTYPE_SIGNTILEENTITY, false)) ->setDestroyTime(1.0f)->setSoundType(Tile::SOUND_WOOD)->setIconName(L"sign")->setDescriptionId(IDS_TILE_SIGN)->setNotCollectStatistics()->sendTileData()->setUseDescriptionId(IDS_DESC_SIGN);
336 Tile::lever = (new LeverTile(69)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_lever, Item::eMaterial_wood)->setDestroyTime(0.5f)->setSoundType(Tile::SOUND_WOOD)->setIconName(L"lever")->setDescriptionId(IDS_TILE_LEVER)->sendTileData()->setUseDescriptionId(IDS_DESC_LEVER);
337 Tile::pressurePlate_stone = (Tile *)(new PressurePlateTile(70, L"stone", Material::stone, PressurePlateTile::mobs)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_pressureplate, Item::eMaterial_stone)->setDestroyTime(0.5f)->setSoundType(Tile::SOUND_STONE)->setDescriptionId(IDS_TILE_PRESSURE_PLATE)->sendTileData()->setUseDescriptionId(IDS_DESC_PRESSUREPLATE);
338
339 Tile::door_iron = (new DoorTile(71, Material::metal)) ->setDestroyTime(5.0f)->setSoundType(Tile::SOUND_METAL)->setIconName(L"door_iron")->setDescriptionId(IDS_TILE_DOOR_IRON)->setNotCollectStatistics()->sendTileData()->setUseDescriptionId(IDS_DESC_DOOR_IRON);
340 Tile::pressurePlate_wood = (new PressurePlateTile(72, L"planks_oak", Material::wood, PressurePlateTile::everything)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_pressureplate, Item::eMaterial_wood)->setDestroyTime(0.5f)->setSoundType(Tile::SOUND_WOOD)->setDescriptionId(IDS_TILE_PRESSURE_PLATE)->sendTileData()->setUseDescriptionId(IDS_DESC_PRESSUREPLATE);
341 Tile::redStoneOre = (new RedStoneOreTile(73,false)) ->setDestroyTime(3.0f)->setExplodeable(5)->setSoundType(Tile::SOUND_STONE)->setIconName(L"redstone_ore")->setDescriptionId(IDS_TILE_ORE_REDSTONE)->sendTileData()->setUseDescriptionId(IDS_DESC_ORE_REDSTONE);
342 Tile::redStoneOre_lit = (new RedStoneOreTile(74, true)) ->setLightEmission(10 / 16.0f)->setDestroyTime(3.0f)->setExplodeable(5)->setSoundType(Tile::SOUND_STONE)->setIconName(L"redstone_ore")->setDescriptionId(IDS_TILE_ORE_REDSTONE)->sendTileData()->setUseDescriptionId(IDS_DESC_ORE_REDSTONE);
343 Tile::redstoneTorch_off = (new NotGateTile(75, false)) ->setDestroyTime(0.0f)->setSoundType(Tile::SOUND_WOOD)->setIconName(L"redstone_torch_off")->setDescriptionId(IDS_TILE_NOT_GATE)->sendTileData()->setUseDescriptionId(IDS_DESC_REDSTONETORCH)->disableMipmap();
344 Tile::redstoneTorch_on = (new NotGateTile(76, true)) ->setDestroyTime(0.0f)->setLightEmission(8 / 16.0f)->setSoundType(Tile::SOUND_WOOD)->setIconName(L"redstone_torch_on")->setDescriptionId(IDS_TILE_NOT_GATE)->sendTileData()->setUseDescriptionId(IDS_DESC_REDSTONETORCH)->disableMipmap();
345 Tile::button = (new StoneButtonTile(77)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_button, Item::eMaterial_stone)->setDestroyTime(0.5f)->setSoundType(Tile::SOUND_STONE)->setIconName(L"button")->setDescriptionId(IDS_TILE_BUTTON)->sendTileData()->setUseDescriptionId(IDS_DESC_BUTTON);
346 Tile::topSnow = (new TopSnowTile(78)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_structblock, Item::eMaterial_snow)->setDestroyTime(0.1f)->setSoundType(Tile::SOUND_SNOW)->setIconName(L"snow")->setDescriptionId(IDS_TILE_SNOW)->setUseDescriptionId(IDS_DESC_TOP_SNOW)->sendTileData()->setLightBlock(0);
347 Tile::ice = (new IceTile(79)) ->setDestroyTime(0.5f)->setLightBlock(3)->setSoundType(Tile::SOUND_GLASS)->setIconName(L"ice")->setDescriptionId(IDS_TILE_ICE)->setUseDescriptionId(IDS_DESC_ICE);
348 Tile::snow = (new SnowTile(80)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_structblock, Item::eMaterial_snow)->setDestroyTime(0.2f)->setSoundType(Tile::SOUND_CLOTH)->setIconName(L"snow")->setDescriptionId(IDS_TILE_SNOW)->setUseDescriptionId(IDS_DESC_SNOW);
349
350 Tile::cactus = (new CactusTile(81)) ->setDestroyTime(0.4f)->setSoundType(Tile::SOUND_CLOTH)->setIconName(L"cactus")->setDescriptionId(IDS_TILE_CACTUS)->setUseDescriptionId(IDS_DESC_CACTUS)->disableMipmap();
351 Tile::clay = (new ClayTile(82)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_structblock, Item::eMaterial_clay)->setDestroyTime(0.6f)->setSoundType(Tile::SOUND_GRAVEL)->setIconName(L"clay")->setDescriptionId(IDS_TILE_CLAY)->setUseDescriptionId(IDS_DESC_CLAY_TILE);
352 Tile::reeds = (new ReedTile(83)) ->setDestroyTime(0.0f)->setSoundType(Tile::SOUND_GRASS)->setIconName(L"reeds")->setDescriptionId(IDS_TILE_REEDS)->setNotCollectStatistics()->setUseDescriptionId(IDS_DESC_REEDS)->disableMipmap();
353 Tile::jukebox = (new JukeboxTile(84)) ->setDestroyTime(2.0f)->setExplodeable(10)->setSoundType(Tile::SOUND_STONE)->setIconName(L"jukebox")->setDescriptionId(IDS_TILE_JUKEBOX)->sendTileData()->setUseDescriptionId(IDS_DESC_JUKEBOX);
354 Tile::fence = (new FenceTile(85, L"planks_oak", Material::wood)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_fence, Item::eMaterial_wood)->setDestroyTime(2.0f)->setExplodeable(5)->setSoundType(Tile::SOUND_WOOD)->setDescriptionId(IDS_TILE_FENCE)->setUseDescriptionId(IDS_DESC_FENCE);
355 Tile::pumpkin = (new PumpkinTile(86, false)) ->setDestroyTime(1.0f)->setSoundType(Tile::SOUND_WOOD)->setIconName(L"pumpkin")->setDescriptionId(IDS_TILE_PUMPKIN)->sendTileData()->setUseDescriptionId(IDS_DESC_PUMPKIN);
356 Tile::netherRack = (new NetherrackTile(87)) ->setDestroyTime(0.4f)->setSoundType(Tile::SOUND_STONE)->setIconName(L"netherrack")->setDescriptionId(IDS_TILE_HELL_ROCK)->setUseDescriptionId(IDS_DESC_HELL_ROCK);
357 Tile::soulsand = (new SoulSandTile(88)) ->setDestroyTime(0.5f)->setSoundType(Tile::SOUND_SAND)->setIconName(L"soul_sand")->setDescriptionId(IDS_TILE_HELL_SAND)->setUseDescriptionId(IDS_DESC_HELL_SAND);
358 Tile::glowstone = (new Glowstonetile(89, Material::glass)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_torch, Item::eMaterial_glowstone)->setDestroyTime(0.3f)->setSoundType(Tile::SOUND_GLASS)->setLightEmission(1.0f)->setIconName(L"glowstone")->setDescriptionId(IDS_TILE_LIGHT_GEM)->setUseDescriptionId(IDS_DESC_GLOWSTONE);
359 Tile::portalTile = (PortalTile *) ((new PortalTile(90)) ->setDestroyTime(-1)->setSoundType(Tile::SOUND_GLASS)->setLightEmission(0.75f))->setIconName(L"portal")->setDescriptionId(IDS_TILE_PORTAL)->setUseDescriptionId(IDS_DESC_PORTAL);
360
361 Tile::litPumpkin = (new PumpkinTile(91, true)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_torch, Item::eMaterial_pumpkin)->setDestroyTime(1.0f)->setSoundType(Tile::SOUND_WOOD)->setLightEmission(1.0f)->setIconName(L"pumpkin")->setDescriptionId(IDS_TILE_LIT_PUMPKIN)->sendTileData()->setUseDescriptionId(IDS_DESC_JACKOLANTERN);
362 Tile::cake = (new CakeTile(92)) ->setDestroyTime(0.5f)->setSoundType(Tile::SOUND_CLOTH)->setIconName(L"cake")->setDescriptionId(IDS_TILE_CAKE)->setNotCollectStatistics()->sendTileData()->setUseDescriptionId(IDS_DESC_CAKE);
363 Tile::diode_off = (RepeaterTile *)(new RepeaterTile(93, false)) ->setDestroyTime(0.0f)->setSoundType(Tile::SOUND_WOOD)->setIconName(L"repeater_off")->setDescriptionId(IDS_ITEM_DIODE)->setNotCollectStatistics()->sendTileData()->setUseDescriptionId(IDS_DESC_REDSTONEREPEATER)->disableMipmap();
364 Tile::diode_on = (RepeaterTile *)(new RepeaterTile(94, true)) ->setDestroyTime(0.0f)->setLightEmission(10 / 16.0f)->setSoundType(Tile::SOUND_WOOD)->setIconName(L"repeater_on")->setDescriptionId(IDS_ITEM_DIODE)->setNotCollectStatistics()->sendTileData()->setUseDescriptionId(IDS_DESC_REDSTONEREPEATER)->disableMipmap();
365 Tile::stained_glass = (new StainedGlassBlock(95, Material::glass))->setBaseItemTypeAndMaterial(Item::eBaseItemType_glass, Item::eMaterial_glass)->setDestroyTime(0.3f)->setSoundType(SOUND_GLASS)->setIconName(L"glass")->setDescriptionId(IDS_TILE_STAINED_GLASS)->setUseDescriptionId(IDS_DESC_STAINED_GLASS);
366 Tile::trapdoor = (new TrapDoorTile(96, Material::wood)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_door, Item::eMaterial_trap)->setDestroyTime(3.0f)->setSoundType(Tile::SOUND_WOOD)->setIconName(L"trapdoor")->setDescriptionId(IDS_TILE_TRAPDOOR)->setNotCollectStatistics()->sendTileData()->setUseDescriptionId(IDS_DESC_TRAPDOOR);
367 Tile::monsterStoneEgg = (new StoneMonsterTile(97)) ->setDestroyTime(0.75f)->setIconName(L"monsterStoneEgg")->setDescriptionId(IDS_TILE_STONE_SILVERFISH)->setUseDescriptionId(IDS_DESC_STONE_SILVERFISH);
368 Tile::stoneBrick = (new SmoothStoneBrickTile(98)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_structblock, Item::eMaterial_stoneSmooth)->setDestroyTime(1.5f)->setExplodeable(10)->setSoundType(SOUND_STONE)->setIconName(L"stonebrick")->setDescriptionId(IDS_TILE_STONE_BRICK_SMOOTH)->setUseDescriptionId(IDS_DESC_STONE_BRICK_SMOOTH);
369 Tile::hugeMushroom_brown = (new HugeMushroomTile(99, Material::wood, HugeMushroomTile::MUSHROOM_TYPE_BROWN)) ->setDestroyTime(0.2f)->setSoundType(SOUND_WOOD)->setIconName(L"mushroom_block")->setDescriptionId(IDS_TILE_HUGE_MUSHROOM_1)->setUseDescriptionId(IDS_DESC_MUSHROOM)->sendTileData();
370 Tile::hugeMushroom_red = (new HugeMushroomTile(100, Material::wood, HugeMushroomTile::MUSHROOM_TYPE_RED)) ->setDestroyTime(0.2f)->setSoundType(SOUND_WOOD)->setIconName(L"mushroom_block")->setDescriptionId(IDS_TILE_HUGE_MUSHROOM_2)->setUseDescriptionId(IDS_DESC_MUSHROOM)->sendTileData();
371
372
373 Tile::ironFence = (new ThinFenceTile(101, L"iron_bars", L"iron_bars", Material::metal, true)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_fence, Item::eMaterial_iron)->setDestroyTime(5.0f)->setExplodeable(10)->setSoundType(SOUND_METAL)->setDescriptionId(IDS_TILE_IRON_FENCE)->setUseDescriptionId(IDS_DESC_IRON_FENCE);
374 Tile::thinGlass = (new ThinFenceTile(102, L"glass", L"glass_pane_top", Material::glass, false)) ->setDestroyTime(0.3f)->setSoundType(SOUND_GLASS)->setDescriptionId(IDS_TILE_THIN_GLASS)->setUseDescriptionId(IDS_DESC_THIN_GLASS);
375 Tile::melon = (new MelonTile(103)) ->setDestroyTime(1.0f)->setSoundType(SOUND_WOOD)->setIconName(L"melon")->setDescriptionId(IDS_TILE_MELON)->setUseDescriptionId(IDS_DESC_MELON_BLOCK);
376 Tile::pumpkinStem = (new StemTile(104, Tile::pumpkin)) ->setDestroyTime(0.0f)->setSoundType(SOUND_WOOD)->setIconName(L"pumpkin_stem")->setDescriptionId(IDS_TILE_PUMPKIN_STEM)->sendTileData();
377 Tile::melonStem = (new StemTile(105, Tile::melon)) ->setDestroyTime(0.0f)->setSoundType(SOUND_WOOD)->setIconName(L"melon_stem")->setDescriptionId(IDS_TILE_MELON_STEM)->sendTileData();
378 Tile::vine = (new VineTile(106))->setDestroyTime(0.2f) ->setSoundType(SOUND_GRASS)->setIconName(L"vine")->setDescriptionId(IDS_TILE_VINE)->setUseDescriptionId(IDS_DESC_VINE)->sendTileData();
379 Tile::fenceGate = (new FenceGateTile(107)) ->setDestroyTime(2.0f)->setExplodeable(5)->setSoundType(SOUND_WOOD)->setIconName(L"fenceGate")->setDescriptionId(IDS_TILE_FENCE_GATE)->sendTileData()->setUseDescriptionId(IDS_DESC_FENCE_GATE);
380 Tile::stairs_bricks = (new StairTile(108, Tile::redBrick,0)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_stairs, Item::eMaterial_brick) ->setIconName(L"stairsBrick")->setDescriptionId(IDS_TILE_STAIRS_BRICKS) ->sendTileData()->setUseDescriptionId(IDS_DESC_STAIRS);
381 Tile::stairs_stoneBrickSmooth = (new StairTile(109, Tile::stoneBrick,0)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_stairs, Item::eMaterial_stoneSmooth)->setIconName(L"stairsStoneBrickSmooth")->setDescriptionId(IDS_TILE_STAIRS_STONE_BRICKS_SMOOTH) ->sendTileData()->setUseDescriptionId(IDS_DESC_STAIRS);
382 Tile::mycel = (MycelTile *)(new MycelTile(110)) ->setDestroyTime(0.6f)->setSoundType(SOUND_GRASS)->setIconName(L"mycelium")->setDescriptionId(IDS_TILE_MYCEL)->setUseDescriptionId(IDS_DESC_MYCEL);
383
384 Tile::waterLily = (new WaterlilyTile(111)) ->setDestroyTime(0.0f)->setSoundType(SOUND_GRASS)->setIconName(L"waterlily")->setDescriptionId(IDS_TILE_WATERLILY)->setUseDescriptionId(IDS_DESC_WATERLILY);
385 Tile::netherBrick = (new Tile(112, Material::stone)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_structblock, Item::eMaterial_netherbrick)->setDestroyTime(2.0f)->setExplodeable(10)->setSoundType(SOUND_STONE)->setIconName(L"nether_brick")->setDescriptionId(IDS_TILE_NETHERBRICK)->setUseDescriptionId(IDS_DESC_NETHERBRICK);
386 Tile::netherFence = (new FenceTile(113, L"nether_brick", Material::stone)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_fence, Item::eMaterial_netherbrick)->setDestroyTime(2.0f)->setExplodeable(10)->setSoundType(SOUND_STONE)->setDescriptionId(IDS_TILE_NETHERFENCE)->setUseDescriptionId(IDS_DESC_NETHERFENCE);
387 Tile::stairs_netherBricks = (new StairTile(114, Tile::netherBrick,0)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_stairs, Item::eMaterial_netherbrick)->setIconName(L"stairsNetherBrick")->setDescriptionId(IDS_TILE_STAIRS_NETHERBRICK) ->sendTileData()->setUseDescriptionId(IDS_DESC_STAIRS);
388 Tile::netherStalk = (new NetherWartTile(115)) ->setIconName(L"nether_wart")->setDescriptionId(IDS_TILE_NETHERSTALK)->sendTileData()->setUseDescriptionId(IDS_DESC_NETHERSTALK);
389 Tile::enchantTable = (new EnchantmentTableTile(116)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_device, Item::eMaterial_magic)->setDestroyTime(5.0f)->setExplodeable(2000)->setIconName(L"enchanting_table")->setDescriptionId(IDS_TILE_ENCHANTMENTTABLE)->setUseDescriptionId(IDS_DESC_ENCHANTMENTTABLE);
390 Tile::brewingStand = (new BrewingStandTile(117)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_device, Item::eMaterial_blaze)->setDestroyTime(0.5f)->setLightEmission(2 / 16.0f)->setIconName(L"brewing_stand")->setDescriptionId(IDS_TILE_BREWINGSTAND)->sendTileData()->setUseDescriptionId(IDS_DESC_BREWING_STAND);
391 Tile::cauldron = (CauldronTile *)(new CauldronTile(118)) ->setDestroyTime(2.0f)->setIconName(L"cauldron")->setDescriptionId(IDS_TILE_CAULDRON)->sendTileData()->setUseDescriptionId(IDS_DESC_CAULDRON);
392 Tile::endPortalTile = (new TheEndPortal(119, Material::portal)) ->setDestroyTime(INDESTRUCTIBLE_DESTROY_TIME)->setExplodeable(6000000)->setDescriptionId(IDS_TILE_END_PORTAL)->setUseDescriptionId(IDS_DESC_END_PORTAL);
393 Tile::endPortalFrameTile = (new TheEndPortalFrameTile(120)) ->setSoundType(SOUND_GLASS)->setLightEmission(2 / 16.0f)->setDestroyTime(INDESTRUCTIBLE_DESTROY_TIME)->setIconName(L"endframe")->setDescriptionId(IDS_TILE_ENDPORTALFRAME)->sendTileData()->setExplodeable(6000000)->setUseDescriptionId(IDS_DESC_ENDPORTALFRAME);
394
395 Tile::endStone = (new Tile(121, Material::stone)) ->setDestroyTime(3.0f)->setExplodeable(15)->setSoundType(SOUND_STONE)->setIconName(L"end_stone")->setDescriptionId(IDS_TILE_WHITESTONE)->setUseDescriptionId(IDS_DESC_WHITESTONE);
396 Tile::dragonEgg = (new EggTile(122)) ->setDestroyTime(3.0f)->setExplodeable(15)->setSoundType(SOUND_STONE)->setLightEmission(2.0f / 16.0f)->setIconName(L"dragon_egg")->setDescriptionId(IDS_TILE_DRAGONEGG)->setUseDescriptionId(IDS_DESC_DRAGONEGG);
397 Tile::redstoneLight = (new RedlightTile(123, false)) ->setDestroyTime(0.3f)->setSoundType(SOUND_GLASS)->setIconName(L"redstone_lamp_off")->setDescriptionId(IDS_TILE_REDSTONE_LIGHT)->setUseDescriptionId(IDS_DESC_REDSTONE_LIGHT);
398 Tile::redstoneLight_lit = (new RedlightTile(124, true)) ->setDestroyTime(0.3f)->setSoundType(SOUND_GLASS)->setIconName(L"redstone_lamp_on")->setDescriptionId(IDS_TILE_REDSTONE_LIGHT)->setUseDescriptionId(IDS_DESC_REDSTONE_LIGHT);
399 Tile::woodSlab = (HalfSlabTile *) (new WoodSlabTile(Tile::woodSlab_Id, true)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_slab, Item::eMaterial_wood)->setDestroyTime(2.0f)->setExplodeable(5)->setSoundType(SOUND_WOOD)->setIconName(L"woodSlab")->setDescriptionId(IDS_DESC_WOODSLAB)->setUseDescriptionId(IDS_DESC_WOODSLAB);
400 Tile::woodSlabHalf = (HalfSlabTile *) (new WoodSlabTile(Tile::woodSlabHalf_Id, false)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_halfslab, Item::eMaterial_wood)->setDestroyTime(2.0f)->setExplodeable(5)->setSoundType(SOUND_WOOD)->setIconName(L"woodSlab")->setDescriptionId(IDS_DESC_WOODSLAB)->setUseDescriptionId(IDS_DESC_WOODSLAB);
401 Tile::cocoa = (new CocoaTile(127)) ->setDestroyTime(0.2f)->setExplodeable(5)->setSoundType(SOUND_WOOD)->setIconName(L"cocoa")->sendTileData()->setDescriptionId(IDS_TILE_COCOA)->setUseDescriptionId(IDS_DESC_COCOA);
402 Tile::stairs_sandstone = (new StairTile(128, Tile::sandStone,0)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_stairs, Item::eMaterial_sand) ->setIconName(L"stairsSandstone")->setDescriptionId(IDS_TILE_STAIRS_SANDSTONE) ->sendTileData()->setUseDescriptionId(IDS_DESC_STAIRS);
403 Tile::emeraldOre = (new OreTile(129)) ->setDestroyTime(3.0f)->setExplodeable(5)->setSoundType(SOUND_STONE)->setIconName(L"emerald_ore")->setDescriptionId(IDS_TILE_EMERALDORE)->setUseDescriptionId(IDS_DESC_EMERALDORE);
404 Tile::enderChest = (new EnderChestTile(130)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_chest, Item::eMaterial_ender)->setDestroyTime(22.5f)->setExplodeable(1000)->setSoundType(SOUND_STONE)->setIconName(L"enderChest")->sendTileData()->setLightEmission(.5f)->setDescriptionId(IDS_TILE_ENDERCHEST)->setUseDescriptionId(IDS_DESC_ENDERCHEST);
405
406
407 Tile::tripWireSource = (TripWireSourceTile *)( new TripWireSourceTile(131) ) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_lever, Item::eMaterial_undefined)->setIconName(L"trip_wire_source")->sendTileData()->setDescriptionId(IDS_TILE_TRIPWIRE_SOURCE)->setUseDescriptionId(IDS_DESC_TRIPWIRE_SOURCE);
408 Tile::tripWire = (new TripWireTile(132)) ->setIconName(L"trip_wire")->sendTileData()->setDescriptionId(IDS_TILE_TRIPWIRE)->setUseDescriptionId(IDS_DESC_TRIPWIRE);
409 Tile::emeraldBlock = (new MetalTile(133)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_block, Item::eMaterial_emerald)->setDestroyTime(5.0f)->setExplodeable(10)->setSoundType(SOUND_METAL)->setIconName(L"emerald_block")->setDescriptionId(IDS_TILE_EMERALDBLOCK)->setUseDescriptionId(IDS_DESC_EMERALDBLOCK);
410 Tile::woodStairsDark = (new StairTile(134, Tile::wood, TreeTile::DARK_TRUNK)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_stairs, Item::eMaterial_sprucewood)->setIconName(L"stairsWoodSpruce")->setDescriptionId(IDS_TILE_STAIRS_SPRUCEWOOD) ->sendTileData()->setUseDescriptionId(IDS_DESC_STAIRS);
411 Tile::woodStairsBirch = (new StairTile(135, Tile::wood, TreeTile::BIRCH_TRUNK)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_stairs, Item::eMaterial_birchwood)->setIconName(L"stairsWoodBirch")->setDescriptionId(IDS_TILE_STAIRS_BIRCHWOOD) ->sendTileData()->setUseDescriptionId(IDS_DESC_STAIRS);
412 Tile::woodStairsJungle =(new StairTile(136, Tile::wood, TreeTile::JUNGLE_TRUNK))->setBaseItemTypeAndMaterial(Item::eBaseItemType_stairs, Item::eMaterial_junglewood)->setIconName(L"stairsWoodJungle")->setDescriptionId(IDS_TILE_STAIRS_JUNGLEWOOD) ->sendTileData()->setUseDescriptionId(IDS_DESC_STAIRS);
413 Tile::commandBlock = (new CommandBlock(137)) ->setIndestructible()->setExplodeable(6000000)->setIconName(L"command_block")->setDescriptionId(IDS_TILE_COMMAND_BLOCK)->setUseDescriptionId(IDS_DESC_COMMAND_BLOCK);
414 Tile::beacon = (BeaconTile *) (new BeaconTile(138)) ->setLightEmission(1.0f)->setIconName(L"beacon")->setDescriptionId(IDS_TILE_BEACON)->setUseDescriptionId(IDS_DESC_BEACON);
415 Tile::cobbleWall = (new WallTile(139, Tile::stoneBrick)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_fence, Item::eMaterial_stone)->setIconName(L"cobbleWall")->setDescriptionId(IDS_TILE_COBBLESTONE_WALL)->setUseDescriptionId(IDS_DESC_COBBLESTONE_WALL);
416 Tile::flowerPot = (new FlowerPotTile(140)) ->setDestroyTime(0.0f)->setSoundType(SOUND_NORMAL)->setIconName(L"flower_pot")->setDescriptionId(IDS_TILE_FLOWERPOT)->setUseDescriptionId(IDS_DESC_FLOWERPOT);
417
418 Tile::carrots = (new CarrotTile(141)) ->setIconName(L"carrots")->setDescriptionId(IDS_TILE_CARROTS)->setUseDescriptionId(IDS_DESC_CARROTS)->disableMipmap();
419 Tile::potatoes = (new PotatoTile(142)) ->setIconName(L"potatoes")->setDescriptionId(IDS_TILE_POTATOES)->setUseDescriptionId(IDS_DESC_POTATO)->disableMipmap();
420 Tile::button_wood = (new WoodButtonTile(143)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_button, Item::eMaterial_wood)->setDestroyTime(0.5f)->setSoundType(Tile::SOUND_WOOD)->setIconName(L"button")->setDescriptionId(IDS_TILE_BUTTON)->sendTileData()->setUseDescriptionId(IDS_DESC_BUTTON);
421 Tile::skull = (new SkullTile(144)) ->setDestroyTime(1.0f)->setSoundType(SOUND_STONE)->setIconName(L"skull")->setDescriptionId(IDS_TILE_SKULL)->setUseDescriptionId(IDS_DESC_SKULL);
422 Tile::anvil = (new AnvilTile(145)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_device, Item::eMaterial_iron)->setDestroyTime(5.0f)->setSoundType(SOUND_ANVIL)->setExplodeable(2000)->setIconName(L"anvil")->sendTileData()->setDescriptionId(IDS_TILE_ANVIL)->setUseDescriptionId(IDS_DESC_ANVIL);
423 Tile::chest_trap = (new ChestTile(146, ChestTile::TYPE_TRAP)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_chest, Item::eMaterial_trap)->setDestroyTime(2.5f)->setSoundType(SOUND_WOOD)->setDescriptionId(IDS_TILE_CHEST_TRAP)->setUseDescriptionId(IDS_DESC_CHEST_TRAP);
424 Tile::weightedPlate_light = (new WeightedPressurePlateTile(147, L"gold_block", Material::metal, Redstone::SIGNAL_MAX)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_pressureplate, Item::eMaterial_gold)->setDestroyTime(0.5f)->setSoundType(SOUND_WOOD)->setDescriptionId(IDS_TILE_WEIGHTED_PLATE_LIGHT)->setUseDescriptionId(IDS_DESC_WEIGHTED_PLATE_LIGHT);
425 Tile::weightedPlate_heavy = (new WeightedPressurePlateTile(148, L"iron_block", Material::metal, Redstone::SIGNAL_MAX * 10))->setBaseItemTypeAndMaterial(Item::eBaseItemType_pressureplate, Item::eMaterial_iron)->setDestroyTime(0.5f)->setSoundType(SOUND_WOOD)->setDescriptionId(IDS_TILE_WEIGHTED_PLATE_HEAVY)->setUseDescriptionId(IDS_DESC_WEIGHTED_PLATE_HEAVY);
426 Tile::comparator_off = (ComparatorTile *) (new ComparatorTile(149, false)) ->setDestroyTime(0.0f)->setSoundType(SOUND_WOOD)->setIconName(L"comparator_off")->setDescriptionId(IDS_TILE_COMPARATOR)->setUseDescriptionId(IDS_DESC_COMPARATOR);
427 Tile::comparator_on = (ComparatorTile *) (new ComparatorTile(150, true)) ->setDestroyTime(0.0f)->setLightEmission(10 / 16.0f)->setSoundType(SOUND_WOOD)->setIconName(L"comparator_on")->setDescriptionId(IDS_TILE_COMPARATOR)->setUseDescriptionId(IDS_DESC_COMPARATOR);
428
429 Tile::daylightDetector = (DaylightDetectorTile *) (new DaylightDetectorTile(151))->setDestroyTime(0.2f)->setSoundType(SOUND_WOOD)->setIconName(L"daylight_detector")->setDescriptionId(IDS_TILE_DAYLIGHT_DETECTOR)->setUseDescriptionId(IDS_DESC_DAYLIGHT_DETECTOR);
430 Tile::redstoneBlock = (new PoweredMetalTile(152)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_block, Item::eMaterial_redstone)->setDestroyTime(5.0f)->setExplodeable(10)->setSoundType(SOUND_METAL)->setIconName(L"redstone_block")->setDescriptionId(IDS_TILE_REDSTONE_BLOCK)->setUseDescriptionId(IDS_DESC_REDSTONE_BLOCK);
431 Tile::netherQuartz = (new OreTile(153)) ->setDestroyTime(3.0f)->setExplodeable(5)->setSoundType(SOUND_STONE)->setIconName(L"quartz_ore")->setDescriptionId(IDS_TILE_NETHER_QUARTZ)->setUseDescriptionId(IDS_DESC_NETHER_QUARTZ_ORE);
432 Tile::hopper = (HopperTile *)(new HopperTile(154)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_redstoneContainer, Item::eMaterial_undefined)->setDestroyTime(3.0f)->setExplodeable(8)->setSoundType(SOUND_WOOD)->setIconName(L"hopper")->setDescriptionId(IDS_TILE_HOPPER)->setUseDescriptionId(IDS_DESC_HOPPER);
433 Tile::quartzBlock = (new QuartzBlockTile(155)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_structblock, Item::eMaterial_quartz)->setSoundType(SOUND_STONE)->setDestroyTime(0.8f)->setIconName(L"quartz_block")->setDescriptionId(IDS_TILE_QUARTZ_BLOCK)->setUseDescriptionId(IDS_DESC_QUARTZ_BLOCK);
434 Tile::stairs_quartz = (new StairTile(156, Tile::quartzBlock, QuartzBlockTile::TYPE_DEFAULT)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_stairs, Item::eMaterial_quartz)->setIconName(L"stairsQuartz")->setDescriptionId(IDS_TILE_STAIRS_QUARTZ)->setUseDescriptionId(IDS_DESC_STAIRS);
435 Tile::activatorRail = (new PoweredRailTile(157)) ->setDestroyTime(0.7f)->setSoundType(SOUND_METAL)->setIconName(L"rail_activator")->setDescriptionId(IDS_TILE_ACTIVATOR_RAIL)->setUseDescriptionId(IDS_DESC_ACTIVATOR_RAIL);
436 Tile::dropper = (new DropperTile(158)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_redstoneContainer, Item::eMaterial_undefined)->setDestroyTime(3.5f)->setSoundType(SOUND_STONE)->setIconName(L"dropper")->setDescriptionId(IDS_TILE_DROPPER)->setUseDescriptionId(IDS_DESC_DROPPER);
437 Tile::clayHardened_colored = (new ColoredTile(159, Material::stone)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_clay, Item::eMaterial_clay)->setDestroyTime(1.25f)->setExplodeable(7)->setSoundType(SOUND_STONE)->setIconName(L"hardened_clay_stained")->setDescriptionId(IDS_TILE_STAINED_CLAY)->setUseDescriptionId(IDS_DESC_STAINED_CLAY);
438 Tile::stained_glass_pane = (new StainedGlassPaneBlock(160)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_glass, Item::eMaterial_glass)->setDestroyTime(0.3f)->setSoundType(SOUND_GLASS)->setIconName(L"glass")->setDescriptionId(IDS_TILE_STAINED_GLASS_PANE)->setUseDescriptionId(IDS_DESC_STAINED_GLASS_PANE);
439
440 Tile::hayBlock = (new HayBlockTile(170)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_block, Item::eMaterial_wheat)->setDestroyTime(0.5f)->setSoundType(SOUND_GRASS)->setIconName(L"hay_block")->setDescriptionId(IDS_TILE_HAY)->setUseDescriptionId(IDS_DESC_HAY);
441 Tile::woolCarpet = (new WoolCarpetTile(171)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_carpet, Item::eMaterial_cloth)->setDestroyTime(0.1f)->setSoundType(SOUND_CLOTH)->setIconName(L"woolCarpet")->setLightBlock(0)->setDescriptionId(IDS_TILE_CARPET)->setUseDescriptionId(IDS_DESC_CARPET);
442 Tile::clayHardened = (new Tile(172, Material::stone)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_clay, Item::eMaterial_clay)->setDestroyTime(1.25f)->setExplodeable(7)->setSoundType(SOUND_STONE)->setIconName(L"hardened_clay")->setDescriptionId(IDS_TILE_HARDENED_CLAY)->setUseDescriptionId(IDS_DESC_HARDENED_CLAY);
443 Tile::coalBlock = (new Tile(173, Material::stone)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_block, Item::eMaterial_coal)->setDestroyTime(5.0f)->setExplodeable(10)->setSoundType(SOUND_STONE)->setIconName(L"coal_block")->setDescriptionId(IDS_TILE_COAL)->setUseDescriptionId(IDS_DESC_COAL_BLOCK);
444
445
446 // Special cases for certain items since they can have different icons
447 Item::items[wool_Id] = ( new WoolTileItem(Tile::wool_Id- 256) )->setIconName(L"cloth")->setDescriptionId(IDS_TILE_CLOTH)->setUseDescriptionId(IDS_DESC_WOOL);
448 Item::items[clayHardened_colored_Id]= ( new WoolTileItem(Tile::clayHardened_colored_Id - 256))->setIconName(L"clayHardenedStained")->setDescriptionId(IDS_TILE_STAINED_CLAY)->setUseDescriptionId(IDS_DESC_STAINED_CLAY);
449 Item::items[stained_glass_Id] = ( new WoolTileItem(Tile::stained_glass_Id - 256))->setIconName(L"stainedGlass")->setDescriptionId(IDS_TILE_STAINED_GLASS)->setUseDescriptionId(IDS_DESC_STAINED_GLASS);
450 Item::items[stained_glass_pane_Id] = ( new WoolTileItem(Tile::stained_glass_pane_Id - 256))->setIconName(L"stainedGlassPane")->setDescriptionId(IDS_TILE_STAINED_GLASS_PANE)->setUseDescriptionId(IDS_DESC_STAINED_GLASS_PANE);
451 Item::items[woolCarpet_Id] = ( new WoolTileItem(Tile::woolCarpet_Id - 256))->setIconName(L"woolCarpet")->setDescriptionId(IDS_TILE_CARPET)->setUseDescriptionId(IDS_DESC_CARPET);
452 Item::items[treeTrunk_Id] = ( new MultiTextureTileItem(Tile::treeTrunk_Id - 256, treeTrunk, (int *)TreeTile::TREE_NAMES, 4) )->setIconName(L"log")->setDescriptionId(IDS_TILE_LOG)->setUseDescriptionId(IDS_DESC_LOG);
453 Item::items[wood_Id] = ( new MultiTextureTileItem(Tile::wood_Id - 256, Tile::wood, (int *)WoodTile::WOOD_NAMES, 4, IDS_TILE_PLANKS))->setIconName(L"wood")->setDescriptionId(IDS_TILE_OAKWOOD_PLANKS)->setUseDescriptionId(IDS_DESC_LOG); // <- TODO
454 Item::items[monsterStoneEgg_Id] = ( new MultiTextureTileItem(Tile::monsterStoneEgg_Id - 256, monsterStoneEgg, (int *)StoneMonsterTile::STONE_MONSTER_NAMES, 3))->setIconName(L"monsterStoneEgg")->setDescriptionId(IDS_TILE_STONE_SILVERFISH)->setUseDescriptionId(IDS_DESC_STONE_SILVERFISH); // 4J - Brought forward from post-1.2 to fix stacking problem
455 Item::items[stoneBrick_Id] = ( new MultiTextureTileItem(Tile::stoneBrick_Id - 256, stoneBrick,(int *)SmoothStoneBrickTile::SMOOTH_STONE_BRICK_NAMES, 4))->setIconName(L"stonebricksmooth")->setDescriptionId(IDS_TILE_STONE_BRICK_SMOOTH);
456 Item::items[sandStone_Id] = ( new MultiTextureTileItem(sandStone_Id - 256, sandStone, SandStoneTile::SANDSTONE_NAMES, SandStoneTile::SANDSTONE_BLOCK_NAMES) )->setIconName(L"sandStone")->setDescriptionId(IDS_TILE_SANDSTONE)->setUseDescriptionId(IDS_DESC_SANDSTONE);
457 Item::items[quartzBlock_Id] = ( new MultiTextureTileItem(quartzBlock_Id - 256, quartzBlock, QuartzBlockTile::BLOCK_NAMES, QuartzBlockTile::QUARTZ_BLOCK_NAMES) )->setIconName(L"quartzBlock")->setDescriptionId(IDS_TILE_QUARTZ_BLOCK)->setUseDescriptionId(IDS_DESC_QUARTZ_BLOCK);
458 Item::items[stoneSlabHalf_Id] = ( new StoneSlabTileItem(Tile::stoneSlabHalf_Id - 256, Tile::stoneSlabHalf, Tile::stoneSlab, false) )->setIconName(L"stoneSlab")->setDescriptionId(IDS_TILE_STONESLAB)->setUseDescriptionId(IDS_DESC_HALFSLAB);
459 Item::items[stoneSlab_Id] = ( new StoneSlabTileItem(Tile::stoneSlab_Id - 256, Tile::stoneSlabHalf, Tile::stoneSlab, true))->setIconName(L"stoneSlab")->setDescriptionId(IDS_DESC_STONESLAB)->setUseDescriptionId(IDS_DESC_SLAB);
460 Item::items[woodSlabHalf_Id] = ( new StoneSlabTileItem(Tile::woodSlabHalf_Id - 256, Tile::woodSlabHalf, Tile::woodSlab, false))->setIconName(L"woodSlab")->setDescriptionId(IDS_DESC_WOODSLAB)->setUseDescriptionId(IDS_DESC_WOODSLAB);
461 Item::items[woodSlab_Id] = ( new StoneSlabTileItem(Tile::woodSlab_Id - 256, Tile::woodSlabHalf, Tile::woodSlab, true))->setIconName(L"woodSlab")->setDescriptionId(IDS_DESC_WOODSLAB)->setUseDescriptionId(IDS_DESC_WOODSLAB);
462 Item::items[sapling_Id] = ( new MultiTextureTileItem(Tile::sapling_Id - 256, Tile::sapling, Sapling::SAPLING_NAMES, 4) )->setIconName(L"sapling")->setDescriptionId(IDS_TILE_SAPLING)->setUseDescriptionId(IDS_DESC_SAPLING);
463 Item::items[leaves_Id] = ( new LeafTileItem(Tile::leaves_Id - 256) )->setIconName(L"leaves")->setDescriptionId(IDS_TILE_LEAVES)->setUseDescriptionId(IDS_DESC_LEAVES);
464 Item::items[vine_Id] = ( new ColoredTileItem(Tile::vine_Id - 256, false))->setDescriptionId(IDS_TILE_VINE)->setUseDescriptionId(IDS_DESC_VINE);
465 int idsData[3] = {IDS_TILE_SHRUB, IDS_TILE_TALL_GRASS, IDS_TILE_FERN};
466 intArray ids = intArray(idsData, 3);
467 Item::items[tallgrass_Id] = ( (ColoredTileItem *)(new ColoredTileItem(Tile::tallgrass_Id - 256, true))->setDescriptionId(IDS_TILE_TALL_GRASS))->setDescriptionPostfixes(ids);
468 Item::items[topSnow_Id] = ( new SnowItem(topSnow_Id - 256, topSnow) );
469 Item::items[waterLily_Id] = ( new WaterLilyTileItem(Tile::waterLily_Id - 256));
470 Item::items[pistonBase_Id] = ( new PistonTileItem(Tile::pistonBase_Id - 256) )->setDescriptionId(IDS_TILE_PISTON_BASE)->setUseDescriptionId(IDS_DESC_PISTON);
471 Item::items[pistonStickyBase_Id] = ( new PistonTileItem(Tile::pistonStickyBase_Id - 256) )->setDescriptionId(IDS_TILE_PISTON_STICK_BASE)->setUseDescriptionId(IDS_DESC_STICKY_PISTON);
472 Item::items[cobbleWall_Id] = ( new MultiTextureTileItem(cobbleWall_Id - 256, cobbleWall, (int *)WallTile::COBBLE_NAMES, 2) )->setDescriptionId(IDS_TILE_COBBLESTONE_WALL)->setUseDescriptionId(IDS_DESC_COBBLESTONE_WALL);
473 Item::items[anvil_Id] = ( new AnvilTileItem(anvil) )->setDescriptionId(IDS_TILE_ANVIL)->setUseDescriptionId(IDS_DESC_ANVIL);
474
475
476 for (int i = 0; i < 256; i++)
477 {
478 if ( Tile::tiles[i] != NULL )
479 {
480 if( Item::items[i] == NULL)
481 {
482 Item::items[i] = new TileItem(i - 256);
483 Tile::tiles[i]->init();
484 }
485
486 bool propagate = false;
487 if (i > 0 && Tile::tiles[i]->getRenderShape() == Tile::SHAPE_STAIRS) propagate = true;
488 if (i > 0 && dynamic_cast<HalfSlabTile *>(Tile::tiles[i]) != NULL)
489 {
490 propagate = true;
491 }
492 if (i == Tile::farmland_Id) propagate = true;
493 if (Tile::transculent[i])
494 {
495 propagate = true;
496 }
497 if (Tile::lightBlock[i] == 0)
498 {
499 propagate = true;
500 }
501 Tile::propagate[i] = propagate;
502 }
503 }
504 Tile::transculent[0] = true;
505
506 Stats::buildItemStats();
507
508 // */
509}
510
511// 4J - added for common ctor code
512void Tile::_init(int id, Material *material, bool isSolidRender)
513{
514 destroySpeed = 0.0f;
515 explosionResistance = 0.0f;
516 isInventoryItem = true;
517 collectStatistics = true;
518
519 // 4J Stu - Removed these in favour of TLS versions
520 //xx0 = yy0 = zz0 = xx1 = yy1 = zz1 = 0;
521
522 soundType = Tile::SOUND_NORMAL;
523 gravity = 1.0f;
524 friction = 0.6f;
525 _isTicking = false;
526 _isEntityTile = false;
527
528 /* 4J - TODO
529 if (Tile.tiles[id] != null)
530 {
531 throw new IllegalArgumentException("Slot " + id + " is already occupied by " + Tile.tiles[id] + " when adding " + this);
532 }
533 */
534 this->material = material;
535 Tile::tiles[id] = this;
536 this->id = id;
537 updateDefaultShape();
538 // 4J - note these used to call isSolidRender(), but that always calls Tile::isSolidRender in C++ so have added as a parameter that can be varied from
539 // derived ctors
540 solid[id] = isSolidRender;
541 lightBlock[id] = isSolidRender ? 255 : 0;
542 transculent[id] = !material->blocksLight();
543 mipmapEnable[id] = true; // 4J added
544 iconName = L"";
545}
546
547Tile::Tile(int id, Material *material, bool isSolidRender)
548{
549 _init(id,material, isSolidRender);
550 m_iMaterial=Item::eMaterial_undefined;
551 m_iBaseItemType=Item::eBaseItemType_undefined;
552 icon = NULL;
553}
554
555Tile *Tile::sendTileData(unsigned char importantMask/*=15*/)
556{
557 Tile::_sendTileData[id] = importantMask; // 4J - changed was bool, now bitfield to indicate which bits are important to be sent. Default behaviour with this method is all 4 bits
558 return this;
559}
560
561void Tile::init()
562{
563}
564
565
566// 4J-PB - adding so we can class different items together for the new crafting menu
567// so pickaxe_stone would get tagged with pickaxe and stone
568Tile *Tile::setBaseItemTypeAndMaterial(int iType,int iMaterial)
569{
570 this->m_iBaseItemType = iType;
571 this->m_iMaterial = iMaterial;
572 return this;
573}
574
575int Tile::getBaseItemType()
576{
577 return this->m_iBaseItemType;
578}
579
580int Tile::getMaterial()
581{
582 return this->m_iMaterial;
583}
584
585
586Tile *Tile::setSoundType(const SoundType *soundType)
587{
588 this->soundType = soundType;
589 return this;
590}
591
592Tile *Tile::setLightBlock(int i)
593{
594 lightBlock[id] = i;
595 return this;
596}
597
598Tile *Tile::setLightEmission(float f)
599{
600 Tile::lightEmission[id] = (int) (Level::MAX_BRIGHTNESS * f);
601 return this;
602}
603
604Tile *Tile::setExplodeable(float explosionResistance)
605{
606 this->explosionResistance = explosionResistance * 3;
607 return this;
608}
609
610bool Tile::isSolidBlockingTile(int t)
611{
612 Tile *tile = Tile::tiles[t];
613 if (tile == NULL) return false;
614 return tile->material->isSolidBlocking() && tile->isCubeShaped() && !tile->isSignalSource();
615}
616
617bool Tile::isCubeShaped()
618{
619 return true;
620}
621
622bool Tile::isPathfindable(LevelSource *level, int x, int y, int z)
623{
624 return !material->blocksMotion();
625}
626
627int Tile::getRenderShape()
628{
629 return SHAPE_BLOCK;
630}
631
632Tile *Tile::setDestroyTime(float destroySpeed)
633{
634 this->destroySpeed = destroySpeed;
635 if (explosionResistance < destroySpeed * 5) explosionResistance = destroySpeed * 5;
636 return this;
637}
638
639Tile *Tile::setIndestructible()
640{
641 setDestroyTime(INDESTRUCTIBLE_DESTROY_TIME);
642 return this;
643}
644
645float Tile::getDestroySpeed(Level *level, int x, int y, int z)
646{
647 return destroySpeed;
648}
649
650Tile *Tile::setTicking(bool tick)
651{
652 _isTicking = tick;
653 return this;
654}
655
656bool Tile::isTicking()
657{
658 return _isTicking;
659}
660
661bool Tile::isEntityTile()
662{
663 return _isEntityTile;
664}
665
666Tile *Tile::disableMipmap()
667{
668 mipmapEnable[id] = false;
669 return this;
670}
671
672void Tile::setShape(float x0, float y0, float z0, float x1, float y1, float z1)
673{
674 ThreadStorage *tls = (ThreadStorage *)TlsGetValue(Tile::tlsIdxShape);
675 tls->xx0 = x0;
676 tls->yy0 = y0;
677 tls->zz0 = z0;
678 tls->xx1 = x1;
679 tls->yy1 = y1;
680 tls->zz1 = z1;
681 tls->tileId = this->id;
682
683 //this->xx0 = x0;
684 //this->yy0 = y0;
685 //this->zz0 = z0;
686 //this->xx1 = x1;
687 //this->yy1 = y1;
688 //this->zz1 = z1;
689}
690
691float Tile::getBrightness(LevelSource *level, int x, int y, int z)
692{
693 // Lighting fix brought forward from ~1.5 here - used to use the lightEmission level for this tile rather than getting the for the passed in x/y/z coords
694 return level->getBrightness(x, y, z, lightEmission[level->getTile(x,y,z)]);
695}
696
697// 4J - brought forward from 1.8.2
698int Tile::getLightColor(LevelSource *level, int x, int y, int z, int tileId/*=-1*/)
699{
700 // Lighting fix brought forward from ~1.5 here - used to use the lightEmission level for this tile rather than getting the for the passed in x/y/z coords
701 if( tileId == -1 )
702 {
703 return level->getLightColor(x, y, z, lightEmission[level->getTile(x,y,z)], -1);
704 }
705 else
706 {
707 return level->getLightColor(x, y, z, lightEmission[tileId], tileId);
708 }
709}
710
711bool Tile::isFaceVisible(Level *level, int x, int y, int z, int f)
712{
713 if (f == 0) y--;
714 if (f == 1) y++;
715 if (f == 2) z--;
716 if (f == 3) z++;
717 if (f == 4) x--;
718 if (f == 5) x++;
719 return !level->isSolidRenderTile(x, y, z);
720}
721
722bool Tile::shouldRenderFace(LevelSource *level, int x, int y, int z, int face)
723{
724 ThreadStorage *tls = (ThreadStorage *)TlsGetValue(Tile::tlsIdxShape);
725 // 4J Stu - Added this so that the TLS shape is correct for this tile
726 if(tls->tileId != this->id) updateDefaultShape();
727 if (face == 0 && tls->yy0 > 0) return true;
728 if (face == 1 && tls->yy1 < 1) return true;
729 if (face == 2 && tls->zz0 > 0) return true;
730 if (face == 3 && tls->zz1 < 1) return true;
731 if (face == 4 && tls->xx0 > 0) return true;
732 if (face == 5 && tls->xx1 < 1) return true;
733 return (!level->isSolidRenderTile(x, y, z));
734}
735
736// AP - added this function so we can generate the faceFlags for a block in a single fast function
737int Tile::getFaceFlags(LevelSource *level, int x, int y, int z)
738{
739 int faceFlags = 0;
740
741 ThreadStorage *tls = (ThreadStorage *)TlsGetValue(Tile::tlsIdxShape);
742 // 4J Stu - Added this so that the TLS shape is correct for this tile
743 if(tls->tileId != this->id) updateDefaultShape();
744
745 if( tls->yy0 > 0 || (!level->isSolidRenderTile(x, y - 1, z))) faceFlags |= 0x01;
746 if( tls->yy1 < 1 || (!level->isSolidRenderTile(x, y + 1, z))) faceFlags |= 0x02;
747 if( tls->zz0 > 0 || (!level->isSolidRenderTile(x, y, z - 1))) faceFlags |= 0x04;
748 if( tls->zz1 < 1 || (!level->isSolidRenderTile(x, y, z + 1))) faceFlags |= 0x08;
749 if( tls->xx0 > 0 || (!level->isSolidRenderTile(x - 1, y, z))) faceFlags |= 0x10;
750 if( tls->xx1 < 1 || (!level->isSolidRenderTile(x + 1, y, z))) faceFlags |= 0x20;
751
752 return faceFlags;
753}
754
755bool Tile::isSolidFace(LevelSource *level, int x, int y, int z, int face)
756{
757 return (level->getMaterial(x, y, z)->isSolid());
758}
759
760Icon *Tile::getTexture(LevelSource *level, int x, int y, int z, int face)
761{
762 // 4J - addition here to make rendering big blocks of leaves more efficient. Normally leaves never consider themselves as solid, so
763 // blocks of leaves will have all sides of each block completely visible. Changing to consider as solid if this block is surrounded by
764 // other leaves (or solid things). This is paired with another change in Level::isSolidRenderTile/Region::isSolidRenderTile which makes things solid
765 // code-wise (ie for determining visible sides of neighbouring blocks). This change just makes the texture a solid one (tex + 1) which
766 // we already have in the texture map for doing non-fancy graphics. Note: this tile-specific code is here rather than making some new virtual
767 // method in the tiles, for the sake of efficiency - I don't imagine we'll be doing much more of this sort of thing
768
769 int tileId = level->getTile(x, y, z);
770 int tileData = level->getData(x, y, z);
771
772 if( tileId == Tile::leaves_Id )
773 {
774 bool opaque = true;
775
776 int axo[6] = { 1,-1, 0, 0, 0, 0};
777 int ayo[6] = { 0, 0, 1,-1, 0, 0};
778 int azo[6] = { 0, 0, 0, 0, 1,-1};
779 for( int i = 0; (i < 6) && opaque; i++ )
780 {
781 int t = level->getTile(x + axo[i], y + ayo[i] , z + azo[i]);
782 if( ( t != Tile::leaves_Id ) && ( ( Tile::tiles[t] == NULL ) || !Tile::tiles[t]->isSolidRender() ) )
783 {
784 opaque = false;
785 }
786 }
787
788 Icon *icon = NULL;
789 if(opaque)
790 {
791 Tile::leaves->setFancy(false);
792 icon = getTexture(face, tileData);
793 Tile::leaves->setFancy(true);
794 }
795 else
796 {
797 icon = getTexture(face, tileData);
798 }
799 return icon;
800 }
801 return getTexture(face, tileData);
802}
803
804Icon *Tile::getTexture(int face, int data)
805{
806 return icon;
807}
808
809Icon *Tile::getTexture(int face)
810{
811 return getTexture(face, 0);
812}
813
814AABB *Tile::getTileAABB(Level *level, int x, int y, int z)
815{
816 ThreadStorage *tls = (ThreadStorage *)TlsGetValue(Tile::tlsIdxShape);
817 // 4J Stu - Added this so that the TLS shape is correct for this tile
818 if(tls->tileId != this->id) updateDefaultShape();
819 return AABB::newTemp(x + tls->xx0, y + tls->yy0, z + tls->zz0, x + tls->xx1, y + tls->yy1, z + tls->zz1);
820}
821
822void Tile::addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, shared_ptr<Entity> source)
823{
824 AABB *aabb = getAABB(level, x, y, z);
825 if (aabb != NULL && box->intersects(aabb)) boxes->push_back(aabb);
826}
827
828AABB *Tile::getAABB(Level *level, int x, int y, int z)
829{
830 ThreadStorage *tls = (ThreadStorage *)TlsGetValue(Tile::tlsIdxShape);
831 // 4J Stu - Added this so that the TLS shape is correct for this tile
832 if(tls->tileId != this->id) updateDefaultShape();
833 return AABB::newTemp(x + tls->xx0, y + tls->yy0, z + tls->zz0, x + tls->xx1, y + tls->yy1, z + tls->zz1);
834}
835
836bool Tile::isSolidRender(bool isServerLevel)
837{
838 return true;
839}
840
841bool Tile::mayPick(int data, bool liquid)
842{
843 return mayPick();
844}
845
846bool Tile::mayPick()
847{
848 return true;
849}
850
851void Tile::tick(Level *level, int x, int y, int z, Random *random)
852{
853}
854
855void Tile::animateTick(Level *level, int x, int y, int z, Random *random)
856{
857}
858
859void Tile::destroy(Level *level, int x, int y, int z, int data)
860{
861}
862
863void Tile::neighborChanged(Level *level, int x, int y, int z, int type)
864{
865}
866
867void Tile::addLights(Level *level, int x, int y, int z)
868{
869}
870
871int Tile::getTickDelay(Level *level)
872{
873 return 10;
874}
875
876void Tile::onPlace(Level *level, int x, int y, int z)
877{
878}
879
880void Tile::onRemove(Level *level, int x, int y, int z, int id, int data)
881{
882}
883
884int Tile::getResourceCount(Random *random)
885{
886 return 1;
887}
888
889int Tile::getResource(int data, Random *random, int playerBonusLevel)
890{
891 return id;
892}
893
894float Tile::getDestroyProgress(shared_ptr<Player> player, Level *level, int x, int y, int z)
895{
896 float destroySpeed = getDestroySpeed(level, x, y, z);
897 if (destroySpeed < 0) return 0;
898 if (!player->canDestroy(this))
899 {
900 return player->getDestroySpeed(this, false) / destroySpeed / 100.0f;
901 }
902 return (player->getDestroySpeed(this, true) / destroySpeed) / 30;
903}
904
905void Tile::spawnResources(Level *level, int x, int y, int z, int data, int playerBonusLevel)
906{
907 spawnResources(level, x, y, z, data, 1, playerBonusLevel);
908}
909
910void Tile::spawnResources(Level *level, int x, int y, int z, int data, float odds, int playerBonusLevel)
911{
912 if (level->isClientSide) return;
913 int count = getResourceCountForLootBonus(playerBonusLevel, level->random);
914 for (int i = 0; i < count; i++)
915 {
916 if (level->random->nextFloat() > odds) continue;
917 int type = getResource(data, level->random, playerBonusLevel);
918 if (type <= 0) continue;
919
920 popResource(level, x, y, z, shared_ptr<ItemInstance>( new ItemInstance(type, 1, getSpawnResourcesAuxValue(data) ) ) );
921 }
922}
923
924void Tile::popResource(Level *level, int x, int y, int z, shared_ptr<ItemInstance> itemInstance)
925{
926 if( level->isClientSide || !level->getGameRules()->getBoolean(GameRules::RULE_DOTILEDROPS) ) return;
927
928 float s = 0.7f;
929 double xo = level->random->nextFloat() * s + (1 - s) * 0.5;
930 double yo = level->random->nextFloat() * s + (1 - s) * 0.5;
931 double zo = level->random->nextFloat() * s + (1 - s) * 0.5;
932 shared_ptr<ItemEntity> item = shared_ptr<ItemEntity>( new ItemEntity(level, x + xo, y + yo, z + zo, itemInstance ) );
933 item->throwTime = 10;
934 level->addEntity(item);
935}
936
937// Brought forward for TU7
938void Tile::popExperience(Level *level, int x, int y, int z, int amount)
939{
940 if (!level->isClientSide)
941 {
942 while (amount > 0)
943 {
944 int newCount = ExperienceOrb::getExperienceValue(amount);
945 amount -= newCount;
946 level->addEntity(shared_ptr<ExperienceOrb>( new ExperienceOrb(level, x + .5, y + .5, z + .5, newCount)));
947 }
948 }
949}
950
951int Tile::getSpawnResourcesAuxValue(int data)
952{
953 return 0;
954}
955
956float Tile::getExplosionResistance(shared_ptr<Entity> source)
957{
958 return explosionResistance / 5.0f;
959}
960
961HitResult *Tile::clip(Level *level, int xt, int yt, int zt, Vec3 *a, Vec3 *b)
962{
963 updateShape(level, xt, yt, zt);
964
965 a = a->add(-xt, -yt, -zt);
966 b = b->add(-xt, -yt, -zt);
967
968 ThreadStorage *tls = (ThreadStorage *)TlsGetValue(Tile::tlsIdxShape);
969 Vec3 *xh0 = a->clipX(b, tls->xx0);
970 Vec3 *xh1 = a->clipX(b, tls->xx1);
971
972 Vec3 *yh0 = a->clipY(b, tls->yy0);
973 Vec3 *yh1 = a->clipY(b, tls->yy1);
974
975 Vec3 *zh0 = a->clipZ(b, tls->zz0);
976 Vec3 *zh1 = a->clipZ(b, tls->zz1);
977
978 Vec3 *closest = NULL;
979
980 if (containsX(xh0) && (closest == NULL || a->distanceToSqr(xh0) < a->distanceToSqr(closest))) closest = xh0;
981 if (containsX(xh1) && (closest == NULL || a->distanceToSqr(xh1) < a->distanceToSqr(closest))) closest = xh1;
982 if (containsY(yh0) && (closest == NULL || a->distanceToSqr(yh0) < a->distanceToSqr(closest))) closest = yh0;
983 if (containsY(yh1) && (closest == NULL || a->distanceToSqr(yh1) < a->distanceToSqr(closest))) closest = yh1;
984 if (containsZ(zh0) && (closest == NULL || a->distanceToSqr(zh0) < a->distanceToSqr(closest))) closest = zh0;
985 if (containsZ(zh1) && (closest == NULL || a->distanceToSqr(zh1) < a->distanceToSqr(closest))) closest = zh1;
986
987 if (closest == NULL) return NULL;
988
989 int face = -1;
990
991 if (closest == xh0) face = Facing::WEST;
992 if (closest == xh1) face = Facing::EAST;
993 if (closest == yh0) face = Facing::DOWN;
994 if (closest == yh1) face = Facing::UP;
995 if (closest == zh0) face = Facing::NORTH;
996 if (closest == zh1) face = Facing::SOUTH;
997
998 return new HitResult(xt, yt, zt, face, closest->add(xt, yt, zt));
999}
1000
1001bool Tile::containsX(Vec3 *v)
1002{
1003 if( v == NULL) return false;
1004
1005 ThreadStorage *tls = (ThreadStorage *)TlsGetValue(Tile::tlsIdxShape);
1006 // 4J Stu - Added this so that the TLS shape is correct for this tile
1007 if(tls->tileId != this->id) updateDefaultShape();
1008 return v->y >= tls->yy0 && v->y <= tls->yy1 && v->z >= tls->zz0 && v->z <= tls->zz1;
1009}
1010
1011bool Tile::containsY(Vec3 *v)
1012{
1013 if( v == NULL) return false;
1014
1015 ThreadStorage *tls = (ThreadStorage *)TlsGetValue(Tile::tlsIdxShape);
1016 // 4J Stu - Added this so that the TLS shape is correct for this tile
1017 if(tls->tileId != this->id) updateDefaultShape();
1018 return v->x >= tls->xx0 && v->x <= tls->xx1 && v->z >= tls->zz0 && v->z <= tls->zz1;
1019}
1020
1021bool Tile::containsZ(Vec3 *v)
1022{
1023 if( v == NULL) return false;
1024
1025 ThreadStorage *tls = (ThreadStorage *)TlsGetValue(Tile::tlsIdxShape);
1026 // 4J Stu - Added this so that the TLS shape is correct for this tile
1027 if(tls->tileId != this->id) updateDefaultShape();
1028 return v->x >= tls->xx0 && v->x <= tls->xx1 && v->y >= tls->yy0 && v->y <= tls->yy1;
1029}
1030
1031void Tile::wasExploded(Level *level, int x, int y, int z, Explosion *explosion)
1032{
1033}
1034
1035bool Tile::mayPlace(Level *level, int x, int y, int z, int face, shared_ptr<ItemInstance> item)
1036{
1037 return mayPlace(level, x, y, z, face);
1038}
1039
1040int Tile::getRenderLayer()
1041{
1042 return 0;
1043}
1044
1045bool Tile::mayPlace(Level *level, int x, int y, int z, int face)
1046{
1047 return mayPlace(level, x, y, z);
1048}
1049
1050bool Tile::mayPlace(Level *level, int x, int y, int z)
1051{
1052 int t = level->getTile(x, y, z);
1053 return t == 0 || Tile::tiles[t]->material->isReplaceable();
1054}
1055
1056// 4J-PB - Adding a TestUse for tooltip display
1057bool Tile::TestUse()
1058{
1059 return false;
1060}
1061
1062bool Tile::TestUse(Level *level, int x, int y, int z, shared_ptr<Player> player)
1063{
1064 return false;
1065}
1066
1067bool Tile::use(Level *level, int x, int y, int z, shared_ptr<Player> player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly/*=false*/) // 4J added soundOnly param
1068{
1069 return false;
1070}
1071
1072void Tile::stepOn(Level *level, int x, int y, int z, shared_ptr<Entity> entity)
1073{
1074}
1075
1076int Tile::getPlacedOnFaceDataValue(Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, int itemValue)
1077{
1078 return itemValue;
1079}
1080
1081void Tile::prepareRender(Level *level, int x, int y, int z)
1082{
1083}
1084
1085void Tile::attack(Level *level, int x, int y, int z, shared_ptr<Player> player)
1086{
1087}
1088
1089void Tile::handleEntityInside(Level *level, int x, int y, int z, shared_ptr<Entity> e, Vec3 *current)
1090{
1091}
1092
1093void Tile::updateShape(LevelSource *level, int x, int y, int z, int forceData, shared_ptr<TileEntity> forceEntity) // 4J added forceData, forceEntity param
1094{
1095 ThreadStorage *tls = (ThreadStorage *)TlsGetValue(Tile::tlsIdxShape);
1096 // 4J Stu - Added this so that the TLS shape is correct for this tile
1097 if(tls->tileId != this->id) updateDefaultShape();
1098}
1099
1100double Tile::getShapeX0()
1101{
1102 ThreadStorage *tls = (ThreadStorage *)TlsGetValue(Tile::tlsIdxShape);
1103 // 4J Stu - Added this so that the TLS shape is correct for this tile
1104 if(tls->tileId != this->id) updateDefaultShape();
1105 return tls->xx0;
1106}
1107
1108double Tile::getShapeX1()
1109{
1110 ThreadStorage *tls = (ThreadStorage *)TlsGetValue(Tile::tlsIdxShape);
1111 // 4J Stu - Added this so that the TLS shape is correct for this tile
1112 if(tls->tileId != this->id) updateDefaultShape();
1113 return tls->xx1;
1114}
1115
1116double Tile::getShapeY0()
1117{
1118 ThreadStorage *tls = (ThreadStorage *)TlsGetValue(Tile::tlsIdxShape);
1119 // 4J Stu - Added this so that the TLS shape is correct for this tile
1120 if(tls->tileId != this->id) updateDefaultShape();
1121 return tls->yy0;
1122}
1123
1124double Tile::getShapeY1()
1125{
1126 ThreadStorage *tls = (ThreadStorage *)TlsGetValue(Tile::tlsIdxShape);
1127 // 4J Stu - Added this so that the TLS shape is correct for this tile
1128 if(tls->tileId != this->id) updateDefaultShape();
1129 return tls->yy1;
1130}
1131
1132double Tile::getShapeZ0()
1133{
1134 ThreadStorage *tls = (ThreadStorage *)TlsGetValue(Tile::tlsIdxShape);
1135 // 4J Stu - Added this so that the TLS shape is correct for this tile
1136 if(tls->tileId != this->id) updateDefaultShape();
1137 return tls->zz0;
1138}
1139
1140double Tile::getShapeZ1()
1141{
1142 ThreadStorage *tls = (ThreadStorage *)TlsGetValue(Tile::tlsIdxShape);
1143 // 4J Stu - Added this so that the TLS shape is correct for this tile
1144 if(tls->tileId != this->id) updateDefaultShape();
1145 return tls->zz1;
1146}
1147
1148int Tile::getColor() const
1149{
1150 return 0xffffff;
1151}
1152
1153int Tile::getColor(int auxData)
1154{
1155 return 0xffffff;
1156}
1157
1158int Tile::getColor(LevelSource *level, int x, int y, int z)
1159{
1160 return 0xffffff;
1161}
1162
1163int Tile::getColor(LevelSource *level, int x, int y, int z, int data)
1164{
1165 return 0xffffff;
1166}
1167
1168int Tile::getSignal(LevelSource *level, int x, int y, int z, int dir)
1169{
1170 return Redstone::SIGNAL_NONE;
1171}
1172
1173bool Tile::isSignalSource()
1174{
1175 return false;
1176}
1177
1178void Tile::entityInside(Level *level, int x, int y, int z, shared_ptr<Entity> entity)
1179{
1180}
1181
1182int Tile::getDirectSignal(LevelSource *level, int x, int y, int z, int dir)
1183{
1184 return Redstone::SIGNAL_NONE;
1185}
1186
1187void Tile::updateDefaultShape()
1188{
1189 setShape(0,0,0,1,1,1);
1190}
1191
1192void Tile::playerDestroy(Level *level, shared_ptr<Player> player, int x, int y, int z, int data)
1193{
1194 // 4J Stu - Special case - only record a crop destroy if is fully grown
1195 if( id==Tile::wheat_Id )
1196 {
1197 if( Tile::wheat->getResource(data, NULL, 0) > 0 )
1198 player->awardStat(
1199 GenericStats::blocksMined(id),
1200 GenericStats::param_blocksMined(id,data,1)
1201 );
1202 }
1203 else if (id == Tile::potatoes_Id)
1204 {
1205 if (Tile::potatoes->getResource(data, NULL, 0) > 0)
1206 player->awardStat(
1207 GenericStats::blocksMined(id),
1208 GenericStats::param_blocksMined(id,data,1)
1209 );
1210 }
1211 else if (id == Tile::carrots_Id)
1212 {
1213 if (Tile::potatoes->getResource(data, NULL, 0) > 0)
1214 player->awardStat(
1215 GenericStats::blocksMined(id),
1216 GenericStats::param_blocksMined(id,data,1)
1217 );
1218 }
1219 else
1220 {
1221 player->awardStat(
1222 GenericStats::blocksMined(id),
1223 GenericStats::param_blocksMined(id,data,1)
1224 );
1225 }
1226 player->awardStat(GenericStats::totalBlocksMined(), GenericStats::param_noArgs()); // 4J : WESTY : Added for other award.
1227 player->causeFoodExhaustion(FoodConstants::EXHAUSTION_MINE);
1228
1229 if( id == Tile::treeTrunk_Id )
1230 player->awardStat(GenericStats::mineWood(), GenericStats::param_noArgs());
1231
1232
1233 if (isSilkTouchable() && EnchantmentHelper::hasSilkTouch(player))
1234 {
1235 shared_ptr<ItemInstance> item = getSilkTouchItemInstance(data);
1236 if (item != NULL)
1237 {
1238 popResource(level, x, y, z, item);
1239 }
1240 }
1241 else
1242 {
1243 int playerBonusLevel = EnchantmentHelper::getDiggingLootBonus(player);
1244 spawnResources(level, x, y, z, data, playerBonusLevel);
1245 }
1246}
1247
1248bool Tile::isSilkTouchable()
1249{
1250 return isCubeShaped() && !_isEntityTile;
1251}
1252
1253shared_ptr<ItemInstance> Tile::getSilkTouchItemInstance(int data)
1254{
1255 int popData = 0;
1256 if (id >= 0 && id < Item::items.length && Item::items[id]->isStackedByData())
1257 {
1258 popData = data;
1259 }
1260 return shared_ptr<ItemInstance>(new ItemInstance(id, 1, popData));
1261}
1262
1263int Tile::getResourceCountForLootBonus(int bonusLevel, Random *random)
1264{
1265 return getResourceCount(random);
1266}
1267
1268bool Tile::canSurvive(Level *level, int x, int y, int z)
1269{
1270 return true;
1271}
1272
1273void Tile::setPlacedBy(Level *level, int x, int y, int z, shared_ptr<LivingEntity> by, shared_ptr<ItemInstance> itemInstance)
1274{
1275}
1276
1277void Tile::finalizePlacement(Level *level, int x, int y, int z, int data)
1278{
1279}
1280
1281Tile *Tile::setDescriptionId(unsigned int id)
1282{
1283 this->descriptionId = id;
1284 return this;
1285}
1286
1287wstring Tile::getName()
1288{
1289 return L"";//I18n::get(getDescriptionId() + L".name");
1290}
1291
1292unsigned int Tile::getDescriptionId(int iData /*= -1*/)
1293{
1294 return descriptionId;
1295}
1296
1297Tile *Tile::setUseDescriptionId(unsigned int id)
1298{
1299 this->useDescriptionId = id;
1300 return this;
1301}
1302
1303unsigned int Tile::getUseDescriptionId()
1304{
1305 return useDescriptionId;
1306}
1307
1308bool Tile::triggerEvent(Level *level, int x, int y, int z, int b0, int b1)
1309{
1310 return false;
1311}
1312
1313bool Tile::isCollectStatistics()
1314{
1315 return collectStatistics;
1316}
1317
1318Tile *Tile::setNotCollectStatistics()
1319{
1320 collectStatistics = false;
1321 return this;
1322}
1323
1324int Tile::getPistonPushReaction()
1325{
1326 return material->getPushReaction();
1327}
1328
1329// 4J - brought forward from 1.8.2
1330float Tile::getShadeBrightness(LevelSource *level, int x, int y, int z)
1331{
1332 return level->isSolidBlockingTile(x, y, z) ? 0.2f : 1.0f;
1333}
1334
1335void Tile::fallOn(Level *level, int x, int y, int z, shared_ptr<Entity> entity, float fallDistance)
1336{
1337}
1338
1339int Tile::cloneTileId(Level *level, int x, int y, int z)
1340{
1341 return id;
1342}
1343
1344int Tile::cloneTileData(Level *level, int x, int y, int z)
1345{
1346 return getSpawnResourcesAuxValue(level->getData(x, y, z));
1347}
1348
1349void Tile::playerWillDestroy(Level *level, int x, int y, int z, int data, shared_ptr<Player> player)
1350{
1351}
1352
1353void Tile::onRemoving(Level *level, int x, int y, int z, int data)
1354{
1355}
1356
1357void Tile::handleRain(Level *level, int x, int y, int z)
1358{
1359}
1360
1361void Tile::levelTimeChanged(Level *level, __int64 delta, __int64 newTime)
1362{
1363}
1364
1365bool Tile::useOwnCloneData()
1366{
1367 return false;
1368}
1369
1370bool Tile::canInstantlyTick()
1371{
1372 return true;
1373}
1374
1375bool Tile::dropFromExplosion(Explosion *explosion)
1376{
1377 return true;
1378}
1379
1380bool Tile::isMatching(int id)
1381{
1382 return this->id == id;
1383}
1384
1385bool Tile::isMatching(int tileIdA, int tileIdB)
1386{
1387 if (tileIdA == tileIdB)
1388 {
1389 return true;
1390 }
1391 if (tileIdA == 0 || tileIdB == 0 || tiles[tileIdA] == NULL || tiles[tileIdB] == NULL)
1392 {
1393 return false;
1394 }
1395 return tiles[tileIdA]->isMatching(tileIdB);
1396}
1397
1398bool Tile::hasAnalogOutputSignal()
1399{
1400 return false;
1401}
1402
1403int Tile::getAnalogOutputSignal(Level *level, int x, int y, int z, int dir)
1404{
1405 return Redstone::SIGNAL_NONE;
1406}
1407
1408Tile *Tile::setIconName(const wstring &iconName)
1409{
1410 this->iconName = iconName;
1411 return this;
1412}
1413
1414wstring Tile::getIconName()
1415{
1416 return iconName.empty() ? L"MISSING_ICON_TILE_" + _toString<int>(id) + L"_" + _toString<int>(descriptionId) : iconName;
1417}
1418
1419void Tile::registerIcons(IconRegister *iconRegister)
1420{
1421 icon = iconRegister->registerIcon(getIconName());
1422}
1423
1424wstring Tile::getTileItemIconName()
1425{
1426 return L"";
1427}
1428
1429Tile::SoundType::SoundType(eMATERIALSOUND_TYPE eMaterialSound, float volume, float pitch, int iBreakSound, int iPlaceSound)
1430{
1431 this->eMaterialSound = eMaterialSound;
1432 if( iBreakSound>-1 )
1433 {
1434 this->iBreakSound = iBreakSound;
1435 }
1436 else
1437 {
1438 switch(eMaterialSound)
1439 {
1440 case eMaterialSoundType_STONE:
1441 this->iBreakSound=eSoundType_DIG_STONE;
1442 break;
1443 case eMaterialSoundType_WOOD:
1444 this->iBreakSound=eSoundType_DIG_WOOD;
1445 break;
1446 case eMaterialSoundType_GRAVEL:
1447 this->iBreakSound=eSoundType_DIG_GRAVEL;
1448 break;
1449 case eMaterialSoundType_GRASS:
1450 this->iBreakSound=eSoundType_DIG_GRASS;
1451 break;
1452 case eMaterialSoundType_METAL:
1453 this->iBreakSound=eSoundType_DIG_STONE;
1454 break;
1455 case eMaterialSoundType_GLASS:
1456 this->iBreakSound=eSoundType_RANDOM_GLASS;
1457 break;
1458 case eMaterialSoundType_CLOTH:
1459 this->iBreakSound=eSoundType_DIG_CLOTH;
1460 break;
1461 case eMaterialSoundType_SAND:
1462 this->iBreakSound=eSoundType_DIG_SAND;
1463 break;
1464 case eMaterialSoundType_SNOW:
1465 this->iBreakSound=eSoundType_DIG_SNOW;
1466 break;
1467 case eMaterialSoundType_LADDER:
1468 this->iBreakSound=eSoundType_DIG_WOOD;
1469 break;
1470 default:
1471 app.DebugPrintf("NO BREAK SOUND!\n");
1472 this->iBreakSound=-1;
1473 break;
1474 }
1475 //this->breakSound = L"step." + this->name;
1476 }
1477
1478 if( iPlaceSound>-1 )
1479 {
1480 this->iPlaceSound = iPlaceSound;
1481 }
1482 else
1483 {
1484 this->iPlaceSound = this->iBreakSound;
1485 }
1486
1487 switch(eMaterialSound)
1488 {
1489 case eMaterialSoundType_STONE:
1490 this->iStepSound=eSoundType_STEP_STONE;
1491 break;
1492 case eMaterialSoundType_WOOD:
1493 this->iStepSound=eSoundType_STEP_WOOD;
1494 break;
1495 case eMaterialSoundType_GRAVEL:
1496 this->iStepSound=eSoundType_STEP_GRAVEL;
1497 break;
1498 case eMaterialSoundType_GRASS:
1499 this->iStepSound=eSoundType_STEP_GRASS;
1500 break;
1501 case eMaterialSoundType_METAL:
1502 this->iStepSound=eSoundType_STEP_METAL;
1503 break;
1504 case eMaterialSoundType_CLOTH:
1505 this->iStepSound=eSoundType_STEP_CLOTH;
1506 break;
1507 case eMaterialSoundType_SAND:
1508 this->iStepSound=eSoundType_STEP_SAND;
1509 break;
1510 case eMaterialSoundType_SNOW:
1511 this->iStepSound=eSoundType_STEP_SNOW;
1512 break;
1513 case eMaterialSoundType_LADDER:
1514 this->iStepSound=eSoundType_STEP_LADDER;
1515 break;
1516 default:
1517 app.DebugPrintf("NO STEP SOUND!\n");
1518
1519 this->iStepSound=-1;
1520 break;
1521
1522 }
1523
1524 //this->stepSound = L"step." + this->name;
1525 this->volume = volume;
1526 this->pitch = pitch;
1527}
1528
1529float Tile::SoundType::getVolume() const
1530{
1531 return volume;
1532}
1533float Tile::SoundType::getPitch() const
1534{
1535 return pitch;
1536}
1537//wstring getBreakSound() const { return breakSound; }
1538//wstring getStepSound() const { return stepSound; }
1539int Tile::SoundType::getBreakSound() const
1540{
1541 return iBreakSound;
1542}
1543int Tile::SoundType::getStepSound() const
1544{
1545 return iStepSound;
1546}
1547int Tile::SoundType::getPlaceSound() const
1548{
1549 return iPlaceSound;
1550}
1551
1552
1553/*
15544J: These are necessary on the PS3.
1555(and 4 and Vita).
1556*/
1557#if (defined __PS3__ || defined __ORBIS__ || defined __PSVITA__)
1558const int Tile::stone_Id;
1559const int Tile::grass_Id;
1560const int Tile::dirt_Id;
1561// 4
1562const int Tile::wood_Id;
1563const int Tile::sapling_Id;
1564const int Tile::unbreakable_Id;
1565const int Tile::water_Id;
1566const int Tile::calmWater_Id;
1567const int Tile::lava_Id;
1568const int Tile::calmLava_Id;
1569const int Tile::sand_Id;
1570const int Tile::gravel_Id;
1571const int Tile::goldOre_Id;
1572const int Tile::ironOre_Id;
1573const int Tile::coalOre_Id;
1574const int Tile::treeTrunk_Id;
1575const int Tile::leaves_Id;
1576const int Tile::sponge_Id;
1577const int Tile::glass_Id;
1578const int Tile::lapisOre_Id;
1579const int Tile::lapisBlock_Id;
1580const int Tile::dispenser_Id;
1581const int Tile::sandStone_Id;
1582// 25
1583const int Tile::bed_Id;
1584const int Tile::goldenRail_Id;
1585const int Tile::detectorRail_Id;
1586const int Tile::pistonStickyBase_Id;
1587const int Tile::web_Id;
1588const int Tile::tallgrass_Id;
1589const int Tile::deadBush_Id;
1590const int Tile::pistonBase_Id;
1591const int Tile::pistonExtensionPiece_Id;
1592const int Tile::wool_Id;
1593const int Tile::pistonMovingPiece_Id;
1594const int Tile::flower_Id;
1595const int Tile::rose_Id;
1596const int Tile::mushroom_brown_Id;
1597const int Tile::mushroom_red_Id;
1598const int Tile::goldBlock_Id;
1599const int Tile::ironBlock_Id;
1600const int Tile::stoneSlab_Id;
1601const int Tile::stoneSlabHalf_Id;
1602const int Tile::redBrick_Id;
1603const int Tile::tnt_Id;
1604const int Tile::bookshelf_Id;
1605const int Tile::mossyCobblestone_Id;
1606const int Tile::obsidian_Id;
1607const int Tile::torch_Id;
1608const int Tile::fire_Id;
1609const int Tile::mobSpawner_Id;
1610const int Tile::stairs_wood_Id;
1611const int Tile::chest_Id;
1612const int Tile::redStoneDust_Id;
1613const int Tile::diamondOre_Id;
1614const int Tile::diamondBlock_Id;
1615const int Tile::workBench_Id;
1616const int Tile::wheat_Id;
1617const int Tile::farmland_Id;
1618const int Tile::furnace_Id;
1619const int Tile::furnace_lit_Id;
1620const int Tile::sign_Id;
1621const int Tile::door_wood_Id;
1622const int Tile::ladder_Id;
1623const int Tile::rail_Id;
1624const int Tile::stairs_stone_Id;
1625const int Tile::wallSign_Id;
1626const int Tile::lever_Id;
1627const int Tile::pressurePlate_stone_Id;
1628const int Tile::door_iron_Id;
1629const int Tile::pressurePlate_wood_Id;
1630const int Tile::redStoneOre_Id;
1631const int Tile::redStoneOre_lit_Id;
1632const int Tile::redstoneTorch_off_Id;
1633const int Tile::redstoneTorch_on_Id;
1634const int Tile::button_stone_Id;
1635const int Tile::topSnow_Id;
1636const int Tile::ice_Id;
1637const int Tile::snow_Id;
1638const int Tile::cactus_Id;
1639const int Tile::clay_Id;
1640const int Tile::reeds_Id;
1641const int Tile::jukebox_Id;
1642const int Tile::fence_Id;
1643const int Tile::pumpkin_Id;
1644const int Tile::netherRack_Id;
1645const int Tile::soulsand_Id;
1646const int Tile::glowstone_Id;
1647const int Tile::portalTile_Id;
1648const int Tile::litPumpkin_Id;
1649const int Tile::cake_Id;
1650const int Tile::diode_off_Id;
1651const int Tile::diode_on_Id;
1652const int Tile::stained_glass_Id;
1653const int Tile::trapdoor_Id;
1654const int Tile::monsterStoneEgg_Id;
1655const int Tile::stoneBrick_Id;
1656const int Tile::hugeMushroom_brown_Id;
1657const int Tile::hugeMushroom_red_Id;
1658const int Tile::ironFence_Id;
1659const int Tile::thinGlass_Id;
1660const int Tile::melon_Id;
1661const int Tile::pumpkinStem_Id;
1662const int Tile::melonStem_Id;
1663const int Tile::vine_Id;
1664const int Tile::fenceGate_Id;
1665const int Tile::stairs_bricks_Id;
1666const int Tile::stairs_stoneBrick_Id;
1667const int Tile::mycel_Id;
1668const int Tile::waterLily_Id;
1669const int Tile::netherBrick_Id;
1670const int Tile::netherFence_Id;
1671const int Tile::stairs_netherBricks_Id;
1672const int Tile::netherStalk_Id;
1673const int Tile::enchantTable_Id;
1674const int Tile::brewingStand_Id;
1675const int Tile::cauldron_Id;
1676const int Tile::endPortalTile_Id;
1677const int Tile::endPortalFrameTile_Id;
1678const int Tile::endStone_Id;
1679const int Tile::dragonEgg_Id;
1680const int Tile::redstoneLight_Id;
1681const int Tile::redstoneLight_lit_Id;
1682const int Tile::woodSlab_Id;
1683const int Tile::woodSlabHalf_Id;
1684const int Tile::cocoa_Id;
1685const int Tile::stairs_sandstone_Id;
1686const int Tile::stairs_sprucewood_Id;
1687const int Tile::stairs_birchwood_Id;
1688const int Tile::stairs_junglewood_Id;
1689const int Tile::emeraldOre_Id;
1690const int Tile::enderChest_Id;
1691const int Tile::tripWireSource_Id;
1692const int Tile::tripWire_Id;
1693const int Tile::emeraldBlock_Id;
1694const int Tile::cobbleWall_Id;
1695const int Tile::flowerPot_Id;
1696const int Tile::carrots_Id;
1697const int Tile::potatoes_Id;
1698const int Tile::anvil_Id;
1699const int Tile::button_wood_Id;
1700const int Tile::skull_Id;
1701const int Tile::netherQuartz_Id;
1702const int Tile::quartzBlock_Id;
1703const int Tile::stairs_quartz_Id;
1704const int Tile::woolCarpet_Id;
1705#endif