aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.World/Tile.h
blob: 307c4106a98f7a8739045544c7d394048209d3e8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
#pragma once
#include "Material.h"
#include "Vec3.h"
#include "Definitions.h"
#include "SoundTypes.h"
using namespace std;

class GrassTile;
class LeafTile;
class TallGrass;
class DeadBushTile;
class FireTile;
class PortalTile;
class MycelTile;
class PistonExtensionTile;
class PistonMovingPiece;
class StoneTile;
class stoneBrick;
class Bush;
class StairTile;
class LiquidTile;
class PistonBaseTile;
class ChestTile;
class RedStoneDustTile;
class RepeaterTile;
class CauldronTile;
class TripWireSourceTile;
class BeaconTile;
class ComparatorTile;
class DaylightDetectorTile;
class Random;
class HitResult;
class Level;
class HopperTile;
class Player;
class LevelSource;
class Mob;
class TileEntity;
class HalfSlabTile;
class Icon;
class IconRegister;

class ChunkRebuildData;

class Tile
{
	// 4J Stu - Stair tile accesses the protected members of a Tile object passed in
	friend class StairTile;
	friend class ChunkRebuildData;
	friend class WallTile;

protected:
	// 4J added so we can have separate shapes for different threads
	class ThreadStorage
	{
	public:
		double xx0, yy0, zz0, xx1, yy1, zz1;
		int tileId;
		ThreadStorage();
	};
	static DWORD tlsIdxShape;
public:
	// Each new thread that needs to use Vec3 pools will need to call one of the following 2 functions, to either create its own
	// local storage, or share the default storage already allocated by the main thread
	static void CreateNewThreadStorage();
	static void ReleaseThreadStorage();

public:
	static const int TILE_NUM_COUNT = 4096;
	static const int TILE_NUM_MASK = 0xfff; // 4096 - 1
	static const int TILE_NUM_SHIFT = 12; // 4096 is 12 bits

	// tile update flags
	// neighbors: notify neighbors the block changed
	static const int UPDATE_NEIGHBORS = (1 << 0);
	// clients: send tile update over network connections
	static const int UPDATE_CLIENTS = (1 << 1);
	// invisible: this update is invisible, so don't rebuild graphics
	static const int UPDATE_INVISIBLE = (1 << 2);
	// clients: send tile update over network connections
	static const int UPDATE_INVISIBLE_NO_LIGHT = (1 << 3) | UPDATE_INVISIBLE;

	static const int UPDATE_NONE = UPDATE_INVISIBLE;
	static const int UPDATE_ALL = UPDATE_NEIGHBORS | UPDATE_CLIENTS;

private:
	// 4J Stu - Was const but had to change it so that we can initialise it in TileStaticInit
	static wstring TILE_DESCRIPTION_PREFIX;
protected:
	static const float INDESTRUCTIBLE_DESTROY_TIME;

	wstring iconName;

public:

	class SoundType
	{
	public:
		//         wstring name;
		// 		wstring breakSound;
		// 		wstring stepSound;
		eMATERIALSOUND_TYPE eMaterialSound;
		int iBreakSound,iStepSound,iPlaceSound;
		float volume;
		float pitch;

		SoundType(eMATERIALSOUND_TYPE eMaterialSound, float volume, float pitch, int iBreakSound = -1, int iPlaceSound = -1);

		float getVolume() const;
		float getPitch() const;
		//wstring getBreakSound() const { return breakSound; }
		//wstring getStepSound()	const { return stepSound; }
		int getBreakSound() const;
		int getStepSound()	const;
		int getPlaceSound() const;
	};

	static SoundType *SOUND_NORMAL;
	static SoundType *SOUND_WOOD;
	static SoundType *SOUND_GRAVEL;
	static SoundType *SOUND_GRASS;
	static SoundType *SOUND_STONE;
	static SoundType *SOUND_METAL;
	static SoundType *SOUND_GLASS;
	static SoundType *SOUND_CLOTH;
	static SoundType *SOUND_SAND;
	static SoundType *SOUND_SNOW;
	static SoundType *SOUND_LADDER;
	static SoundType *SOUND_ANVIL;

	static const int SHAPE_INVISIBLE = -1;
	static const int SHAPE_BLOCK = 0;
	static const int SHAPE_CROSS_TEXTURE = 1;
	static const int SHAPE_TORCH = 2;
	static const int SHAPE_FIRE = 3;
	static const int SHAPE_WATER = 4;
	static const int SHAPE_RED_DUST = 5;
	static const int SHAPE_ROWS = 6;
	static const int SHAPE_DOOR = 7;
	static const int SHAPE_LADDER = 8;
	static const int SHAPE_RAIL = 9;
	static const int SHAPE_STAIRS = 10;
	static const int SHAPE_FENCE = 11;
	static const int SHAPE_LEVER = 12;
	static const int SHAPE_CACTUS = 13;
	static const int SHAPE_BED = 14;
	static const int SHAPE_REPEATER = 15;
	static const int SHAPE_PISTON_BASE = 16;
	static const int SHAPE_PISTON_EXTENSION = 17;
	static const int SHAPE_IRON_FENCE = 18;
	static const int SHAPE_STEM = 19;
	static const int SHAPE_VINE = 20;
	static const int SHAPE_FENCE_GATE = 21;
	static const int SHAPE_ENTITYTILE_ANIMATED = 22;
	static const int SHAPE_LILYPAD = 23;
	static const int SHAPE_CAULDRON = 24;
	static const int SHAPE_BREWING_STAND = 25;
	static const int SHAPE_PORTAL_FRAME = 26;
	static const int SHAPE_EGG = 27;
	static const int SHAPE_COCOA = 28;
	static const int SHAPE_TRIPWIRE_SOURCE = 29;
	static const int SHAPE_TRIPWIRE = 30;
	static const int SHAPE_TREE = 31;
	static const int SHAPE_WALL = 32;
	static const int SHAPE_FLOWER_POT = 33;
	static const int SHAPE_BEACON = 34;
	static const int SHAPE_ANVIL = 35;
	static const int SHAPE_DIODE = 36;
	static const int SHAPE_COMPARATOR = 37;
	static const int SHAPE_HOPPER = 38;
	static const int SHAPE_QUARTZ = 39;
	static const int SHAPE_THIN_PANE = 40;

	static const int SHAPE_COUNT = 41;

	static  Tile **tiles;

	static	bool	mipmapEnable[TILE_NUM_COUNT];
	static  bool	solid[TILE_NUM_COUNT];
	static  int		lightBlock[TILE_NUM_COUNT];
	static  bool	transculent[TILE_NUM_COUNT];
	static  int		lightEmission[TILE_NUM_COUNT];
	static  unsigned char _sendTileData[TILE_NUM_COUNT];		// 4J - was bool, changed to bitfield so we can indicate which bits are important to be sent
	static  bool	propagate[TILE_NUM_COUNT];

	// 4J - this array of simple constants made so the compiler can optimise references to Ids that were previous of the form Tile::<whatever>->id, and are now simply Tile::whatever_Id
	static const int stone_Id = 1;
	static const int grass_Id = 2;
	static const int dirt_Id = 3;
	static const int cobblestone_Id = 4;
	static const int wood_Id = 5;
	static const int sapling_Id = 6;
	static const int unbreakable_Id = 7;
	static const int water_Id = 8;
	static const int calmWater_Id = 9;
	static const int lava_Id = 10;

	static const int calmLava_Id = 11;
	static const int sand_Id = 12;
	static const int gravel_Id = 13;
	static const int goldOre_Id = 14;
	static const int ironOre_Id = 15;
	static const int coalOre_Id = 16;
	static const int treeTrunk_Id = 17;
	static const int leaves_Id = 18;
	static const int sponge_Id = 19;
	static const int glass_Id = 20;

	static const int lapisOre_Id = 21;
	static const int lapisBlock_Id = 22;
	static const int dispenser_Id = 23;
	static const int sandStone_Id = 24;
	static const int noteblock_Id = 25;
	static const int bed_Id = 26;
	static const int goldenRail_Id = 27;
	static const int detectorRail_Id = 28;
	static const int pistonStickyBase_Id = 29;
	static const int web_Id = 30;

	static const int tallgrass_Id = 31;
	static const int deadBush_Id = 32;
	static const int pistonBase_Id = 33;
	static const int pistonExtensionPiece_Id = 34;
	static const int wool_Id = 35;
	static const int pistonMovingPiece_Id = 36;
	static const int flower_Id = 37;
	static const int rose_Id = 38;
	static const int mushroom_brown_Id = 39;
	static const int mushroom_red_Id = 40;

	static const int goldBlock_Id = 41;
	static const int ironBlock_Id = 42;
	static const int stoneSlab_Id = 43;
	static const int stoneSlabHalf_Id = 44;
	static const int redBrick_Id = 45;
	static const int tnt_Id = 46;
	static const int bookshelf_Id = 47;
	static const int mossyCobblestone_Id = 48;
	static const int obsidian_Id = 49;
	static const int torch_Id = 50;

	static const int fire_Id = 51;
	static const int mobSpawner_Id = 52;
	static const int stairs_wood_Id = 53;
	static const int chest_Id = 54;
	static const int redStoneDust_Id = 55;
	static const int diamondOre_Id = 56;
	static const int diamondBlock_Id = 57;
	static const int workBench_Id = 58;
	static const int wheat_Id = 59;
	static const int farmland_Id = 60;

	static const int furnace_Id = 61;
	static const int furnace_lit_Id = 62;
	static const int sign_Id = 63;
	static const int door_wood_Id = 64;
	static const int ladder_Id = 65;
	static const int rail_Id = 66;
	static const int stairs_stone_Id = 67;
	static const int wallSign_Id = 68;
	static const int lever_Id = 69;
	static const int pressurePlate_stone_Id = 70;

	static const int door_iron_Id = 71;
	static const int pressurePlate_wood_Id = 72;
	static const int redStoneOre_Id = 73;
	static const int redStoneOre_lit_Id = 74;
	static const int redstoneTorch_off_Id = 75;
	static const int redstoneTorch_on_Id = 76;
	static const int button_stone_Id = 77;
	static const int topSnow_Id = 78;
	static const int ice_Id = 79;
	static const int snow_Id = 80;

	static const int cactus_Id = 81;
	static const int clay_Id = 82;
	static const int reeds_Id = 83;
	static const int jukebox_Id = 84;
	static const int fence_Id = 85;
	static const int pumpkin_Id = 86;
	static const int netherRack_Id = 87;
	static const int soulsand_Id = 88;
	static const int glowstone_Id = 89;
	static const int portalTile_Id = 90;

	static const int litPumpkin_Id = 91;
	static const int cake_Id = 92;
	static const int diode_off_Id = 93;
	static const int diode_on_Id = 94;
	static const int stained_glass_Id = 95;
	static const int trapdoor_Id = 96;
	static const int monsterStoneEgg_Id = 97;
	static const int stoneBrick_Id = 98;
	static const int hugeMushroom_brown_Id = 99;
	static const int hugeMushroom_red_Id = 100;

	static const int ironFence_Id = 101;
	static const int thinGlass_Id = 102;
	static const int melon_Id = 103;
	static const int pumpkinStem_Id = 104;
	static const int melonStem_Id = 105;
	static const int vine_Id = 106;
	static const int fenceGate_Id = 107;
	static const int stairs_bricks_Id = 108;
	static const int stairs_stoneBrick_Id = 109;
	static const int mycel_Id = 110;

	static const int waterLily_Id = 111;
	static const int netherBrick_Id = 112;
	static const int netherFence_Id = 113;
	static const int stairs_netherBricks_Id = 114;
	static const int netherStalk_Id = 115;
	static const int enchantTable_Id = 116;
	static const int brewingStand_Id = 117;
	static const int cauldron_Id = 118;
	static const int endPortalTile_Id = 119;
	static const int endPortalFrameTile_Id = 120;

	static const int endStone_Id = 121;
	static const int dragonEgg_Id = 122;
	static const int redstoneLight_Id = 123;
	static const int redstoneLight_lit_Id = 124;
	static const int woodSlab_Id = 125;
	static const int woodSlabHalf_Id = 126;
	static const int cocoa_Id = 127;
	static const int stairs_sandstone_Id = 128;
	static const int emeraldOre_Id = 129;
	static const int enderChest_Id = 130;

	static const int tripWireSource_Id = 131;
	static const int tripWire_Id = 132;
	static const int emeraldBlock_Id = 133;
	static const int stairs_sprucewood_Id = 134;
	static const int stairs_birchwood_Id = 135;
	static const int stairs_junglewood_Id = 136;
	static const int commandBlock_Id = 137;
	static const int beacon_Id = 138;
	static const int cobbleWall_Id = 139;
	static const int flowerPot_Id = 140;

	static const int carrots_Id = 141;
	static const int potatoes_Id = 142;
	static const int button_wood_Id = 143;
	static const int skull_Id = 144;
	static const int anvil_Id = 145;
	static const int chest_trap_Id = 146;
	static const int weightedPlate_light_Id = 147;
	static const int weightedPlate_heavy_Id = 148;
	static const int comparator_off_Id = 149;
	static const int comparator_on_Id = 150;

	static const int daylightDetector_Id = 151;
	static const int redstoneBlock_Id = 152;
	static const int netherQuartz_Id = 153;
	static const int hopper_Id = 154;
	static const int quartzBlock_Id = 155;
	static const int stairs_quartz_Id = 156;
	static const int activatorRail_Id = 157;
	static const int dropper_Id = 158;
	static const int clayHardened_colored_Id = 159;
	static const int stained_glass_pane_Id = 160;

	static const int hayBlock_Id = 170;
	static const int woolCarpet_Id = 171;
	static const int clayHardened_Id = 172;
	static const int coalBlock_Id = 173;


	static Tile *stone;
	static GrassTile *grass;
	static Tile *dirt;
	static Tile *cobblestone;
	static Tile *wood;
	static Tile *sapling;
	static Tile *unbreakable;
	static LiquidTile *water;
	static Tile *calmWater;
	static LiquidTile *lava;
	static Tile *calmLava;
	static Tile *sand;
	static Tile *gravel;
	static Tile *goldOre;
	static Tile *ironOre;
	static Tile *coalOre;
	static Tile *treeTrunk;
	static LeafTile *leaves;
	static Tile *sponge;
	static Tile *glass;
	static Tile *lapisOre;
	static Tile *lapisBlock;
	static Tile *dispenser;
	static Tile *sandStone;
	static Tile *noteblock;
	static Tile *bed;
	static Tile *goldenRail;
	static Tile *detectorRail;
	static PistonBaseTile *pistonStickyBase;
	static Tile *web;
	static TallGrass *tallgrass;
	static DeadBushTile *deadBush;
	static PistonBaseTile *pistonBase;
	static PistonExtensionTile *pistonExtension;
	static Tile *wool;
	static PistonMovingPiece *pistonMovingPiece;
	static Bush *flower;
	static Bush *rose;
	static Bush *mushroom_brown;
	static Bush *mushroom_red;
	static Tile *goldBlock;
	static Tile *ironBlock;
	//     static Tile *stoneSlab;
	//     static Tile *stoneSlabHalf;
	static Tile *redBrick;
	static Tile *tnt;
	static Tile *bookshelf;
	static Tile *mossyCobblestone;
	static Tile *obsidian;
	static Tile *torch;
	static FireTile *fire;
	static Tile *mobSpawner;
	static Tile *stairs_wood;
	static ChestTile *chest;
	static RedStoneDustTile *redStoneDust;
	static Tile *diamondOre;
	static Tile *diamondBlock;
	static Tile *workBench;
	static Tile *wheat;
	static Tile *farmland;
	static Tile *furnace;
	static Tile *furnace_lit;
	static Tile *sign;
	static Tile *door_wood;
	static Tile *ladder;
	static Tile *rail;
	static Tile *stairs_stone;
	static Tile *wallSign;
	static Tile *lever;
	static Tile *pressurePlate_stone;
	static Tile *door_iron;
	static Tile *pressurePlate_wood;
	static Tile *redStoneOre;
	static Tile *redStoneOre_lit;
	static Tile *redstoneTorch_off;
	static Tile *redstoneTorch_on;
	static Tile *button;
	static Tile *topSnow;
	static Tile *ice;
	static Tile *snow;
	static Tile *cactus;
	static Tile *clay;
	static Tile *reeds;
	static Tile *jukebox;
	static Tile *fence;
	static Tile *pumpkin;
	static Tile *netherRack;
	static Tile *soulsand;
	static Tile *glowstone;
	static PortalTile *portalTile;
	static Tile *litPumpkin;
	static Tile *cake;
	static RepeaterTile *diode_off;
	static RepeaterTile *diode_on;
	static Tile *stained_glass;
	static Tile *trapdoor;

	static Tile *monsterStoneEgg;
	static Tile *stoneBrick;
	static Tile *hugeMushroom_brown;
	static Tile *hugeMushroom_red;
	static Tile *ironFence;
	static Tile *thinGlass;
	static Tile *melon;
	static Tile *pumpkinStem;
	static Tile *melonStem;
	static Tile *vine;
	static Tile *fenceGate;
	static Tile *stairs_bricks;
	static Tile *stairs_stoneBrickSmooth;

	static MycelTile *mycel;
	static Tile *waterLily;
	static Tile *netherBrick;
	static Tile *netherFence;
	static Tile *stairs_netherBricks;
	static Tile *netherStalk;
	static Tile *enchantTable;
	static Tile *brewingStand;
	static CauldronTile *cauldron;
	static Tile *endPortalTile;
	static Tile *endPortalFrameTile;
	static Tile *endStone;
	static Tile *dragonEgg;
	static Tile *redstoneLight;
	static Tile *redstoneLight_lit;

	static Tile *stairs_sandstone;
	static Tile *woodStairsDark;
	static Tile *woodStairsBirch;
	static Tile *woodStairsJungle;
	static Tile *commandBlock;
	static BeaconTile *beacon;
	static Tile *button_wood;
	static HalfSlabTile *woodSlab;
	static HalfSlabTile *woodSlabHalf;
	static HalfSlabTile *stoneSlab;
	static HalfSlabTile *stoneSlabHalf;
	static Tile *emeraldOre;
	static Tile *enderChest;
	static TripWireSourceTile *tripWireSource;
	static Tile *tripWire;
	static Tile *emeraldBlock;

	static Tile *cocoa;
	static Tile *skull;

	static Tile *cobbleWall;
	static Tile *flowerPot;
	static Tile *carrots;
	static Tile *potatoes;
	static Tile *anvil;
	static Tile *chest_trap;
	static Tile *weightedPlate_light;
	static Tile *weightedPlate_heavy;
	static ComparatorTile *comparator_off;
	static ComparatorTile *comparator_on;

	static DaylightDetectorTile *daylightDetector;
	static Tile *redstoneBlock;

	static Tile *netherQuartz;
	static HopperTile *hopper;
	static Tile *quartzBlock;
	static Tile *stairs_quartz;
	static Tile *activatorRail;
	static Tile *dropper;
	static Tile *clayHardened_colored;
	static Tile *stained_glass_pane;

	static Tile *hayBlock;
	static Tile *woolCarpet;
	static Tile *clayHardened;
	static Tile *coalBlock;

	static void staticCtor();

	int id;
protected:
	float destroySpeed;
	float explosionResistance;
	bool isInventoryItem;
	bool collectStatistics;
	bool _isTicking;
	bool _isEntityTile;
	int m_iMaterial;
	int m_iBaseItemType;

	// 4J Stu - Removed this in favour of a TLS version
	//double xx0, yy0, zz0, xx1, yy1, zz1;

public:
	const SoundType *soundType;

	float gravity;
	Material *material;
	float friction;

private:
	unsigned int descriptionId;
	unsigned int useDescriptionId; // 4J Added

protected:
	Icon *icon;

protected:
	void _init(int id, Material *material, bool isSolidRender);
	Tile(int id, Material *material, bool isSolidRender = true);
	virtual ~Tile() {}
protected:
	virtual Tile *sendTileData(unsigned char importantMask=15);		// 4J - added importantMask to indicate which bits in the data are important
protected:
	virtual void init();
	virtual Tile *setSoundType(const SoundType *soundType);
	virtual Tile *setLightBlock(int i);
	virtual Tile *setLightEmission(float f);
	virtual Tile *setExplodeable(float explosionResistance);
	Tile *setBaseItemTypeAndMaterial(int iType,int iMaterial);
public:
	static bool isSolidBlockingTile(int t);
	virtual bool isCubeShaped();
	virtual bool isPathfindable(LevelSource *level, int x, int y, int z);
	virtual int getRenderShape();
	// 4J-PB added
	int getBaseItemType();
	int getMaterial();
protected:
	virtual Tile *setDestroyTime(float destroySpeed);
	virtual Tile *setIndestructible();
public:
	virtual float getDestroySpeed(Level *level, int x, int y, int z);
protected:
	virtual Tile *setTicking(bool tick);
	virtual Tile *disableMipmap();
public:
	virtual bool isTicking();
	virtual bool isEntityTile();
	virtual void setShape(float x0, float y0, float z0, float x1, float y1, float z1);
	virtual float getBrightness(LevelSource *level, int x, int y, int z);
	virtual int getLightColor(LevelSource *level, int x, int y, int z, int tileId=-1);		// 4J - brought forward from 1.8.2
	static bool isFaceVisible(Level *level, int x, int y, int z, int f);
	virtual bool shouldRenderFace(LevelSource *level, int x, int y, int z, int face);
	virtual bool isSolidFace(LevelSource *level, int x, int y, int z, int face);
	virtual Icon *getTexture(LevelSource *level, int x, int y, int z, int face);
	virtual Icon *getTexture(int face, int data);
	virtual Icon *getTexture(int face);
	virtual AABB *getTileAABB(Level *level, int x, int y, int z);
	virtual void addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, shared_ptr<Entity> source);
	virtual AABB *getAABB(Level *level, int x, int y, int z);
	virtual bool isSolidRender(bool isServerLevel = false);							// 4J - Added isServerLevel param
	virtual bool mayPick(int data, bool liquid);
	virtual bool mayPick();
	virtual void tick(Level *level, int x, int y, int z, Random *random);
	virtual void animateTick(Level *level, int x, int y, int z, Random *random);
	virtual void destroy(Level *level, int x, int y, int z, int data);
	virtual void neighborChanged(Level *level, int x, int y, int z, int type);
	virtual void addLights(Level *level, int x, int y, int z);
	virtual int getTickDelay(Level *level);
	virtual void onPlace(Level *level, int x, int y, int z);
	virtual void onRemove(Level *level, int x, int y, int z, int id, int data);
	virtual int getResourceCount(Random *random);
	virtual int getResource(int data, Random *random, int playerBonusLevel);
	virtual float getDestroyProgress(shared_ptr<Player> player, Level *level, int x, int y, int z);
	virtual void spawnResources(Level *level, int x, int y, int z, int data, int playerBonusLevel);
	virtual void spawnResources(Level *level, int x, int y, int z, int data, float odds, int playerBonusLevel);
protected:
	virtual void popResource(Level *level, int x, int y, int z, shared_ptr<ItemInstance> itemInstance);
	virtual void popExperience(Level *level, int x, int y, int z, int amount);

public:
	virtual int getSpawnResourcesAuxValue(int data);
	virtual float getExplosionResistance(shared_ptr<Entity> source);
	virtual HitResult *clip(Level *level, int xt, int yt, int zt, Vec3 *a, Vec3 *b);
private:
	virtual bool containsX(Vec3 *v);
	virtual bool containsY(Vec3 *v);
	virtual bool containsZ(Vec3 *v);
public:
	virtual void wasExploded(Level *level, int x, int y, int z, Explosion *explosion);
	virtual int getRenderLayer();
	virtual bool mayPlace(Level *level, int x, int y, int z, int face, shared_ptr<ItemInstance> item);
	virtual bool mayPlace(Level *level, int x, int y, int z, int face);
	virtual bool mayPlace(Level *level, int x, int y, int z);
	virtual bool TestUse();
	virtual bool TestUse(Level *level, int x, int y, int z, shared_ptr<Player> player);
	virtual bool 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
	virtual void stepOn(Level *level, int x, int y, int z, shared_ptr<Entity> entity);
	virtual int getPlacedOnFaceDataValue(Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, int itemValue);
	virtual void prepareRender(Level *level, int x, int y, int z);
	virtual void attack(Level *level, int x, int y, int z, shared_ptr<Player> player);
	virtual void handleEntityInside(Level *level, int x, int y, int z, shared_ptr<Entity> e, Vec3 *current);
	virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr<TileEntity> forceEntity = shared_ptr<TileEntity>());	// 4J added forceData, forceEntity param
	virtual double getShapeX0();
	virtual double getShapeX1();
	virtual double getShapeY0();
	virtual double getShapeY1();
	virtual double getShapeZ0();
	virtual double getShapeZ1();
	virtual int getColor() const;
	virtual int getColor(int auxData);
	virtual int getColor(LevelSource *level, int x, int y, int z);
	virtual int getColor(LevelSource *level, int x, int y, int z, int data);		// 4J added
	virtual int getSignal(LevelSource *level, int x, int y, int z, int dir);
	virtual bool isSignalSource();
	virtual void entityInside(Level *level, int x, int y, int z, shared_ptr<Entity> entity);
	virtual int getDirectSignal(LevelSource *level, int x, int y, int z, int dir);
	virtual void updateDefaultShape();
	virtual void playerDestroy(Level *level, shared_ptr<Player> player, int x, int y, int z, int data);
	virtual bool canSurvive(Level *level, int x, int y, int z);
protected:
	virtual bool isSilkTouchable();
	virtual shared_ptr<ItemInstance> getSilkTouchItemInstance(int data);
public:
	virtual int getResourceCountForLootBonus(int bonusLevel, Random *random);
	virtual void setPlacedBy(Level *level, int x, int y, int z, shared_ptr<LivingEntity> by, shared_ptr<ItemInstance> itemInstance);
	virtual void finalizePlacement(Level *level, int x, int y, int z, int data);
	virtual Tile *setDescriptionId(unsigned int id);
	virtual wstring getName();
	virtual unsigned int getDescriptionId(int iData = -1);
	virtual Tile *setUseDescriptionId(unsigned int id); // 4J Added
	virtual unsigned int getUseDescriptionId(); // 4J Added
	virtual bool triggerEvent(Level *level, int x, int y, int z, int b0, int b1);
	virtual bool isCollectStatistics();

	// 4J Added so we can check before we try to add a tile to the tick list if it's actually going to do seomthing
	// Default to true (it's also checking a bool array) and just override when we need to be able to say no
	virtual bool shouldTileTick(Level *level, int x,int y,int z) { return true; }
protected:
	virtual Tile *setNotCollectStatistics();
public:
	virtual int getPistonPushReaction();
	virtual float getShadeBrightness(LevelSource *level, int x, int y, int z);	// 4J - brought forward from 1.8.2
	virtual void fallOn(Level *level, int x, int y, int z, shared_ptr<Entity> entity, float fallDistance);
	virtual int cloneTileId(Level *level, int x, int y, int z);
	virtual int cloneTileData(Level *level, int x, int y, int z);
	virtual void playerWillDestroy(Level *level, int x, int y, int z, int data, shared_ptr<Player> player);
	virtual void onRemoving(Level *level, int x, int y, int z, int data);
	virtual void handleRain(Level *level, int x, int y, int z);
	virtual void levelTimeChanged(Level *level, int64_t delta, int64_t newTime);
	virtual bool useOwnCloneData();
	virtual bool canInstantlyTick();
	virtual bool dropFromExplosion(Explosion *explosion);
	virtual bool isMatching(int id);
	static bool isMatching(int tileIdA, int tileIdB);
	virtual bool hasAnalogOutputSignal();
	virtual int getAnalogOutputSignal(Level *level, int x, int y, int z, int dir);

protected:
	virtual Tile *setIconName(const wstring &iconName);
	virtual wstring getIconName();

public:
	virtual void registerIcons(IconRegister *iconRegister);
	virtual wstring getTileItemIconName();

	// AP - added this function so we can generate the faceFlags for a block in a single fast function
	int getFaceFlags(LevelSource *level, int x, int y, int z);
};

class stoneBrick : public Tile {};