the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
1#pragma once
2using namespace std;
3class InputStream;
4
5// This file aims to provide functionality to mimic the subset of java's Class class that we require. Classes that require this
6// functionality derive from BaseObject, and each contain a unique nested class definition Class. There are #defines here to
7// simplify declaring classes with this added functionality.
8
9
10// 0b FFFF CCCC CCCC CCCC CCCC CCCC CCEE EEEE
11// |||| |||| |||| |||| |||| |||| |||| ||||
12// |||| |||| |||| |||| |||| |||| |||| |||\- BIT00: ENUM:
13// |||| |||| |||| |||| |||| |||| |||| ||\-- BIT01: ENUM:
14// |||| |||| |||| |||| |||| |||| |||| |\--- BIT02: ENUM:
15// |||| |||| |||| |||| |||| |||| |||| \---- BIT03: ENUM:
16// |||| |||| |||| |||| |||| |||| ||||
17// |||| |||| |||| |||| |||| |||| |||\------ BIT04: ENUM:
18// |||| |||| |||| |||| |||| |||| ||\------- BIT05: ENUM:
19// |||| |||| |||| |||| |||| |||| |\-------- BIT06: CLASS: WATER_MOB
20// |||| |||| |||| |||| |||| |||| \--------- BIT07: CLASS: AMBIENT_MOB
21// |||| |||| |||| |||| |||| ||||
22// |||| |||| |||| |||| |||| |||\----------- BIT08: CLASS: !ENTITY (so we can hide TILE_ENTITY and DISPENSER_TILE_ENTITY bits which aren't relevant for entities)
23// |||| |||| |||| |||| |||| ||\------------ BIT09: CLASS: MINECART_CONTAINER
24// |||| |||| |||| |||| |||| |\------------- BIT10: CLASS: SLIME
25// |||| |||| |||| |||| |||| \-------------- BIT11: CLASS: ZOMBIE
26// |||| |||| |||| |||| ||||
27// |||| |||| |||| |||| |||\---------------- BIT12: CLASS: SPIDER
28// |||| |||| |||| |||| ||\----------------- BIT13: CLASS: COW
29// |||| |||| |||| |||| |\------------------ BIT14: CLASS: TAMABLE
30// |||| |||| |||| |||| \------------------- BIT15: CLASS: ANIMAL
31// |||| |||| |||| ||||
32// |||| |||| |||| |||\--------------------- BIT16: CLASS: MONSTER
33// |||| |||| |||| ||\---------------------- BIT17: CLASS: GOLEM
34// |||| |||| |||| |\----------------------- BIT18: CLASS: AGABLE_MOB
35// |||| |||| |||| \------------------------ BIT19: CLASS: PATHFINDER_MOB
36// |||| |||| ||||
37// |||| |||| |||\-------------------------- BIT20: CLASS: PLAYER
38// |||| |||| ||\--------------------------- BIT21: CLASS: MOB
39// |||| |||| |\---------------------------- BIT22: CLASS: HANGING_ENTITY
40// |||| |||| \----------------------------- BIT23: CLASS: THROWABLE
41// |||| ||||
42// |||| |||\------------------------------- BIT24: CLASS: FIREBALL
43// |||| ||\-------------------------------- BIT25: CLASS: MINECART
44// |||| |\--------------------------------- BIT26: CLASS: LIVING_ENTITY
45// |||| \---------------------------------- BIT27: CLASS: ENTITY
46// ||||
47// |||\------------------------------------ BIT28: FLAGS: valid in spawner flag
48// ||\------------------------------------- BIT29: FLAGS: Spawnlimitcheck
49// |\-------------------------------------- BIT30: FLAGS: Enemy
50// \--------------------------------------- BIT31: FLAGS: projectile
51
52
53#define Bit(a) ((1)<<(a))
54
55const unsigned int BIT_NOT_LIVING_ENTITY = Bit(25);
56
57// Classes
58
59const unsigned int BIT_FLYING_MOB = Bit( 9);
60const unsigned int BIT_WATER_MOB = Bit(10);
61const unsigned int BIT_AMBIENT_MOB = Bit(11);
62
63const unsigned int BIT_NOT_ENTITY = Bit(12);
64const unsigned int BIT_SLIME = Bit(13);
65const unsigned int BIT_ZOMBIE = Bit(14);
66const unsigned int BIT_SPIDER = Bit(15);
67
68const unsigned int BIT_COW = Bit(16);
69const unsigned int BIT_TAMABLE = Bit(17);
70const unsigned int BIT_ANIMAL = Bit(18);
71const unsigned int BIT_MONSTER = Bit(19); const unsigned int BIT_MINECART_CONTAINER = Bit(19) | BIT_NOT_LIVING_ENTITY;
72
73const unsigned int BIT_GOLEM = Bit(20); const unsigned int BIT_HANGING_ENTITY = Bit(20) | BIT_NOT_LIVING_ENTITY;
74const unsigned int BIT_AGABLE_MOB = Bit(21); const unsigned int BIT_THROWABLE = Bit(21) | BIT_NOT_LIVING_ENTITY;
75const unsigned int BIT_PATHFINDER_MOB = Bit(22); const unsigned int BIT_FIREBALL = Bit(22) | BIT_NOT_LIVING_ENTITY;
76const unsigned int BIT_PLAYER = Bit(23); const unsigned int BIT_MINECART = Bit(23) | BIT_NOT_LIVING_ENTITY;
77
78const unsigned int BIT_MOB = Bit(24); const unsigned int BIT_GLOBAL_ENTITY = Bit(24) | BIT_NOT_LIVING_ENTITY;
79//const unsigned int BIT_NOT_LIVING_ENTITY = Bit(25);
80const unsigned int BIT_LIVING_ENTITY = Bit(26);
81const unsigned int BIT_ENTITY = Bit(27);
82
83// Flags
84const unsigned int BIT_VALID_IN_SPAWNER = Bit(28);
85const unsigned int BIT_ANIMALS_SPAWN_LIMIT_CHECK = Bit(29);
86const unsigned int BIT_ENEMY = Bit(30);
87const unsigned int BIT_PROJECTILE = Bit(31U);
88
89// Tile Entities
90const unsigned int BIT_TILE_ENTITY = Bit(24) | BIT_NOT_ENTITY;
91const unsigned int BIT_DISPENSERTILEENTITY = Bit(25) | BIT_NOT_ENTITY;
92const unsigned int BIT_OTHER_NOT_ENTITIES = Bit(26) | BIT_NOT_ENTITY;
93
94
95// 4J-JEV: These abstract classes only have one subclass, so ignore them.
96//const unsigned int BIT_WATER_MOB = Bit(15);
97//const unsigned int BIT_FLYING_MOB = Bit(17);
98//const unsigned int BIT_AMBIENT_MOB = Bit(18);
99//const unsigned int BIT_GLOBAL_ENTITY = Bit();
100
101// #define ETYPE(a,b,c) ( (a) | (b) | (c) )
102
103// 4J Stu - This Enum can be used as a more lightweight version of the above, without having do dynamic casts
104// 4J-PB - for replacement of instanceof
105enum eINSTANCEOF
106{
107 eTYPE_NOTSET=0,
108
109 // Flags.
110 eTYPE_VALID_IN_SPAWNER_FLAG = BIT_VALID_IN_SPAWNER,
111 eTYPE_ANIMALS_SPAWN_LIMIT_CHECK = BIT_ANIMALS_SPAWN_LIMIT_CHECK,
112 eTYPE_ENEMY = BIT_ENEMY,
113 eTYPE_PROJECTILE = BIT_PROJECTILE,
114
115 eTYPE_ENTITY = BIT_ENTITY,
116
117 eTYPE_LIVINGENTITY = eTYPE_ENTITY | BIT_LIVING_ENTITY,
118
119 eTYPE_MOB = eTYPE_LIVINGENTITY | BIT_MOB,
120
121 eTYPE_PATHFINDER_MOB = eTYPE_MOB | BIT_PATHFINDER_MOB,
122
123 eTYPE_AGABLE_MOB = eTYPE_PATHFINDER_MOB | BIT_AGABLE_MOB,
124
125 eTYPE_VILLAGER = eTYPE_AGABLE_MOB | 0x1, //0x12000,
126
127 // 4J Stu - When adding new categories, please also update ConsoleSchematicFile::generateSchematicFile so these can be saved out to schematics
128 eTYPE_ANIMAL = eTYPE_AGABLE_MOB | BIT_ANIMAL,
129
130 eTYPE_TAMABLE_ANIMAL = eTYPE_ANIMAL | BIT_TAMABLE,
131
132 eTYPE_OCELOT = eTYPE_TAMABLE_ANIMAL | eTYPE_ANIMALS_SPAWN_LIMIT_CHECK | 0x1,
133 eTYPE_WOLF = eTYPE_TAMABLE_ANIMAL | 0x2,
134
135 eTYPE_HORSE = eTYPE_ANIMAL | eTYPE_ANIMALS_SPAWN_LIMIT_CHECK | 0x1,
136 eTYPE_SHEEP = eTYPE_ANIMAL | eTYPE_ANIMALS_SPAWN_LIMIT_CHECK | 0x2,
137 eTYPE_PIG = eTYPE_ANIMAL | eTYPE_ANIMALS_SPAWN_LIMIT_CHECK | 0x3,
138 eTYPE_CHICKEN = eTYPE_ANIMAL | 0x4,
139
140 eTYPE_COW = eTYPE_ANIMAL | eTYPE_ANIMALS_SPAWN_LIMIT_CHECK | BIT_COW,
141 eTYPE_MUSHROOMCOW = eTYPE_COW | 0x1,
142
143
144 eTYPE_WATERANIMAL = eTYPE_PATHFINDER_MOB | BIT_WATER_MOB, //0x100,
145 eTYPE_SQUID = eTYPE_WATERANIMAL| 0x1,
146
147 eTYPE_GOLEM = eTYPE_PATHFINDER_MOB | BIT_GOLEM,
148
149 eTYPE_SNOWMAN = eTYPE_GOLEM | eTYPE_ANIMALS_SPAWN_LIMIT_CHECK | 0x1, //0x4,
150 eTYPE_VILLAGERGOLEM = eTYPE_GOLEM | 0x2, //0x1000,
151
152
153 // 4J Stu - If you add new hostile mobs here you should also update the string lookup function at CConsoleMinecraftApp::getEntityName
154 eTYPE_MONSTER = eTYPE_ENEMY | eTYPE_PATHFINDER_MOB | BIT_MONSTER,
155
156 eTYPE_SPIDER = eTYPE_MONSTER | eTYPE_VALID_IN_SPAWNER_FLAG | BIT_SPIDER,
157 eTYPE_CAVESPIDER = eTYPE_SPIDER | 0x1,
158
159 eTYPE_ZOMBIE = eTYPE_MONSTER | eTYPE_VALID_IN_SPAWNER_FLAG | BIT_ZOMBIE,
160 eTYPE_PIGZOMBIE = eTYPE_ZOMBIE | 0x1,
161
162 eTYPE_CREEPER = eTYPE_MONSTER | eTYPE_VALID_IN_SPAWNER_FLAG | 0x1,
163 eTYPE_GIANT = eTYPE_MONSTER | eTYPE_VALID_IN_SPAWNER_FLAG | 0x2,
164 eTYPE_SKELETON = eTYPE_MONSTER | eTYPE_VALID_IN_SPAWNER_FLAG | 0x3,
165 eTYPE_ENDERMAN = eTYPE_MONSTER | eTYPE_VALID_IN_SPAWNER_FLAG | 0x4,
166 eTYPE_SILVERFISH = eTYPE_MONSTER | eTYPE_VALID_IN_SPAWNER_FLAG | 0x5,
167 eTYPE_BLAZE = eTYPE_MONSTER | eTYPE_VALID_IN_SPAWNER_FLAG | 0x6,
168 eTYPE_WITCH = eTYPE_MONSTER | eTYPE_VALID_IN_SPAWNER_FLAG | 0x7,
169 eTYPE_WITHERBOSS = eTYPE_MONSTER | eTYPE_VALID_IN_SPAWNER_FLAG | 0x8,
170
171
172 eTYPE_AMBIENT = eTYPE_MOB | BIT_AMBIENT_MOB,
173 eTYPE_BAT = eTYPE_AMBIENT | eTYPE_VALID_IN_SPAWNER_FLAG | 0x1,
174
175 eTYPE_FLYING_MOB = eTYPE_MOB | BIT_FLYING_MOB,
176 eTYPE_GHAST = eTYPE_FLYING_MOB | eTYPE_VALID_IN_SPAWNER_FLAG | eTYPE_ENEMY | 0x1,
177
178 eTYPE_SLIME = eTYPE_MOB | eTYPE_VALID_IN_SPAWNER_FLAG | eTYPE_ENEMY | BIT_SLIME,
179 eTYPE_LAVASLIME = eTYPE_SLIME | 0x1,
180
181 eTYPE_ENDERDRAGON = eTYPE_MOB | 0x5,
182
183 eTYPE_PLAYER = eTYPE_LIVINGENTITY | BIT_PLAYER, //0x8000,
184 eTYPE_SERVERPLAYER = eTYPE_PLAYER | 0x1,
185 eTYPE_REMOTEPLAYER = eTYPE_PLAYER | 0x2,
186 eTYPE_LOCALPLAYER = eTYPE_PLAYER | 0x3,
187
188 eTYPE_GLOBAL_ENTITY = eTYPE_ENTITY | BIT_GLOBAL_ENTITY,
189 eTYPE_LIGHTNINGBOLT = eTYPE_GLOBAL_ENTITY | 0x1,
190
191 eTYPE_MINECART = eTYPE_ENTITY | BIT_MINECART, //0x200000,
192
193 eTYPE_MINECART_RIDEABLE = eTYPE_MINECART | 0x1,
194 eTYPE_MINECART_SPAWNER = eTYPE_MINECART | 0x6,
195 eTYPE_MINECART_FURNACE = eTYPE_MINECART | 0x3,
196 eTYPE_MINECART_TNT = eTYPE_MINECART | 0x4,
197
198 eTYPE_MINECART_CONTAINER = eTYPE_MINECART | BIT_MINECART_CONTAINER,
199
200 eTYPE_MINECART_CHEST = eTYPE_MINECART_CONTAINER | 0x2,
201 eTYPE_MINECART_HOPPER = eTYPE_MINECART_CONTAINER | 0x5,
202
203
204 eTYPE_FIREBALL = eTYPE_ENTITY | eTYPE_PROJECTILE | BIT_FIREBALL, //0x2,
205
206 eTYPE_DRAGON_FIREBALL = eTYPE_FIREBALL | 0x1,
207 eTYPE_WITHER_SKULL = eTYPE_FIREBALL | 0x2,
208 eTYPE_LARGE_FIREBALL = eTYPE_FIREBALL | 0x3,
209 eTYPE_SMALL_FIREBALL = eTYPE_FIREBALL | 0x4,
210
211
212 eTYPE_THROWABLE = eTYPE_ENTITY | eTYPE_PROJECTILE | BIT_THROWABLE,
213
214 eTYPE_SNOWBALL = eTYPE_THROWABLE | 0x1,
215 eTYPE_THROWNEGG = eTYPE_THROWABLE | 0x2,
216 eTYPE_THROWNENDERPEARL = eTYPE_THROWABLE | 0x3,
217 eTYPE_THROWNPOTION = eTYPE_THROWABLE | 0x4,
218 eTYPE_THROWNEXPBOTTLE = eTYPE_THROWABLE | 0x5,
219
220
221 eTYPE_HANGING_ENTITY = eTYPE_ENTITY | BIT_HANGING_ENTITY,
222
223 eTYPE_PAINTING = eTYPE_HANGING_ENTITY | 0x1,
224 eTYPE_ITEM_FRAME = eTYPE_HANGING_ENTITY | 0x2,
225 eTYPE_LEASHFENCEKNOT = eTYPE_HANGING_ENTITY | 0x3,
226
227
228 // Other Entities.
229
230 eTYPE_OTHER_ENTITIES = eTYPE_ENTITY + 1,
231
232 eTYPE_EXPERIENCEORB = (eTYPE_OTHER_ENTITIES + 2), // 1.8.2
233 eTYPE_EYEOFENDERSIGNAL = (eTYPE_OTHER_ENTITIES + 3) | eTYPE_PROJECTILE,
234 eTYPE_FIREWORKS_ROCKET = (eTYPE_OTHER_ENTITIES + 4) | eTYPE_PROJECTILE,
235 eTYPE_FISHINGHOOK = (eTYPE_OTHER_ENTITIES + 5) | eTYPE_PROJECTILE,
236 eTYPE_DELAYEDRELEASE = (eTYPE_OTHER_ENTITIES + 6), // 1.8.2
237 eTYPE_BOAT = (eTYPE_OTHER_ENTITIES + 7),
238 eTYPE_FALLINGTILE = (eTYPE_OTHER_ENTITIES + 8),
239 eTYPE_ITEMENTITY = (eTYPE_OTHER_ENTITIES + 9),
240 eTYPE_PRIMEDTNT = (eTYPE_OTHER_ENTITIES + 10),
241 eTYPE_ARROW = (eTYPE_OTHER_ENTITIES + 11) | eTYPE_PROJECTILE,
242 eTYPE_MULTIENTITY_MOB_PART = (eTYPE_OTHER_ENTITIES + 12),
243 eTYPE_NETHER_SPHERE = (eTYPE_OTHER_ENTITIES + 13),
244 eTYPE_ENDER_CRYSTAL = (eTYPE_OTHER_ENTITIES + 14),
245
246
247 // === PARTICLES === //
248
249 eType_BREAKINGITEMPARTICLE,
250 eType_BUBBLEPARTICLE,
251 eType_EXPLODEPARTICLE,
252 eType_FLAMEPARTICLE,
253 eType_FOOTSTEPPARTICLE,
254 eType_HEARTPARTICLE,
255 eType_LAVAPARTICLE,
256 eType_NOTEPARTICLE,
257 eType_NETHERPORTALPARTICLE,
258 eType_REDDUSTPARTICLE,
259 eType_SMOKEPARTICLE,
260 eType_SNOWSHOVELPARTICLE,
261 eType_SPLASHPARTICLE,
262 eType_TAKEANIMATIONPARTICLE,
263 eType_TERRAINPARTICLE,
264 eType_WATERDROPPARTICLE,
265
266 // 1.8.2
267 eType_CRITPARTICLE,
268 eType_CRITPARTICLE2,
269 eType_HUGEEXPLOSIONPARTICLE,
270 eType_HUGEEXPLOSIONSEEDPARTICLE,
271 eType_PLAYERCLOUDPARTICLEPARTICLE,
272 eType_SUSPENDEDPARTICLE,
273 eType_SUSPENDEDTOWNPARTICLE,
274
275 //1.0.1
276 eTYPE_DRIPPARTICLE,
277 eTYPE_ENCHANTMENTTABLEPARTICLE,
278 eTYPE_SPELLPARTICLE,
279
280 //TU9
281 eTYPE_DRAGONBREATHPARTICLE,
282 eType_ENDERPARTICLE,
283
284 eType_FIREWORKSSTARTERPARTICLE,
285 eType_FIREWORKSSPARKPARTICLE,
286 eType_FIREWORKSOVERLAYPARTICLE,
287
288 // === Tile Entities === //
289
290 eTYPE_TILEENTITY = BIT_TILE_ENTITY,
291
292 eTYPE_CHESTTILEENTITY = eTYPE_TILEENTITY | 0x01,
293 eTYPE_MOBSPAWNERTILEENTITY = eTYPE_TILEENTITY | 0x02,
294 eTYPE_FURNACETILEENTITY = eTYPE_TILEENTITY | 0x03,
295 eTYPE_SIGNTILEENTITY = eTYPE_TILEENTITY | 0x04,
296 eTYPE_MUSICTILEENTITY = eTYPE_TILEENTITY | 0x05,
297 eTYPE_RECORDPLAYERTILE = eTYPE_TILEENTITY | 0x06,
298 eTYPE_PISTONPIECEENTITY = eTYPE_TILEENTITY | 0x07,
299 eTYPE_BREWINGSTANDTILEENTITY = eTYPE_TILEENTITY | 0x08,
300 eTYPE_ENCHANTMENTTABLEENTITY = eTYPE_TILEENTITY | 0x09,
301 eTYPE_THEENDPORTALTILEENTITY = eTYPE_TILEENTITY | 0x0A,
302 eTYPE_SKULLTILEENTITY = eTYPE_TILEENTITY | 0x0B,
303 eTYPE_ENDERCHESTTILEENTITY = eTYPE_TILEENTITY | 0x0C,
304 eTYPE_BEACONTILEENTITY = eTYPE_TILEENTITY | 0x0D,
305 eTYPE_COMMANDBLOCKTILEENTITY = eTYPE_TILEENTITY | 0x0E,
306 eTYPE_COMPARATORTILEENTITY = eTYPE_TILEENTITY | 0x0F,
307 eTYPE_DAYLIGHTDETECTORTILEENTITY = eTYPE_TILEENTITY | 0x10,
308 eTYPE_HOPPERTILEENTITY = eTYPE_TILEENTITY | 0x11,
309
310 eTYPE_DISPENSERTILEENTITY = eTYPE_TILEENTITY | BIT_DISPENSERTILEENTITY,
311 eTYPE_DROPPERTILEENTITY = eTYPE_DISPENSERTILEENTITY | 0x1,
312
313
314 // === Never used === //
315 // exists to ensure all later entities don't match the bitmasks above
316
317 eTYPE_OTHERS = BIT_OTHER_NOT_ENTITIES,
318
319 eType_NODE,
320 eType_ITEM,
321 eType_ITEMINSTANCE,
322 eType_MAPITEM,
323 eType_TILE,
324 eType_FIRETILE,
325};
326
327inline bool eTYPE_DERIVED_FROM(eINSTANCEOF super, eINSTANCEOF sub)
328{
329 if ( (super & 0x3F) != 0x00 ) return super == sub;
330 else return (super & sub) == super;
331}
332
333inline bool eTYPE_FLAGSET(eINSTANCEOF flag, eINSTANCEOF claz)
334{
335 return (flag & claz) == flag;
336}
337
338
339/// FOR CHECKING ///
340
341#if !(defined _WINDOWS64)
342
343class SubClass
344{
345 static void checkDerivations() {}
346};
347
348#else
349
350class SubClass
351{
352public:
353 bool m_isTerminal;
354 const string m_name;
355 const eINSTANCEOF m_id;
356 vector<eINSTANCEOF> m_parents;
357
358 static unordered_map<eINSTANCEOF, SubClass*> s_ids;
359
360 SubClass(const string &name, eINSTANCEOF id)
361 : m_name(name), m_id(id)
362 {
363 s_ids.insert( pair<eINSTANCEOF,SubClass*>(id,this) );
364 m_isTerminal = true;
365 }
366
367 SubClass *addParent(eINSTANCEOF id)
368 {
369 SubClass *parent = s_ids.at(id);
370 parent->m_isTerminal = false;
371
372 m_parents.push_back(id);
373
374 for (AUTO_VAR(itr, parent->m_parents.begin()); itr != parent->m_parents.end(); itr++)
375 {
376 m_parents.push_back(*itr);
377 }
378
379 return this;
380 }
381
382 bool justFlag()
383 {
384 return (m_id & 0xF00000) == m_id;
385 }
386
387#define SUBCLASS(x) (new SubClass( #x , x ))
388
389 static void checkDerivations()
390 {
391 vector<SubClass *> *classes = new vector<SubClass*>();
392
393 classes->push_back( SUBCLASS(eTYPE_VALID_IN_SPAWNER_FLAG) );
394 classes->push_back( SUBCLASS(eTYPE_ANIMALS_SPAWN_LIMIT_CHECK) );
395 classes->push_back( SUBCLASS(eTYPE_ENEMY) );
396 classes->push_back( SUBCLASS(eTYPE_PROJECTILE) );
397
398 classes->push_back( SUBCLASS(eTYPE_ENTITY) );
399 classes->push_back( SUBCLASS(eTYPE_LIVINGENTITY)->addParent(eTYPE_ENTITY) );
400 classes->push_back( SUBCLASS(eTYPE_MOB)->addParent(eTYPE_LIVINGENTITY) );
401 classes->push_back( SUBCLASS(eTYPE_PATHFINDER_MOB)->addParent(eTYPE_MOB) );
402 classes->push_back( SUBCLASS(eTYPE_AGABLE_MOB)->addParent(eTYPE_PATHFINDER_MOB) );
403 classes->push_back( SUBCLASS(eTYPE_VILLAGER)->addParent(eTYPE_AGABLE_MOB) );
404 classes->push_back( SUBCLASS(eTYPE_ANIMAL)->addParent(eTYPE_AGABLE_MOB) );
405 classes->push_back( SUBCLASS(eTYPE_TAMABLE_ANIMAL )->addParent( eTYPE_ANIMAL ) );
406 classes->push_back( SUBCLASS(eTYPE_OCELOT )->addParent( eTYPE_TAMABLE_ANIMAL)->addParent(eTYPE_ANIMALS_SPAWN_LIMIT_CHECK ) );
407 classes->push_back( SUBCLASS(eTYPE_WOLF )->addParent( eTYPE_TAMABLE_ANIMAL ) );
408 classes->push_back( SUBCLASS(eTYPE_HORSE )->addParent( eTYPE_ANIMAL)->addParent(eTYPE_ANIMALS_SPAWN_LIMIT_CHECK ) );
409 classes->push_back( SUBCLASS(eTYPE_SHEEP )->addParent( eTYPE_ANIMAL)->addParent(eTYPE_ANIMALS_SPAWN_LIMIT_CHECK ) );
410 classes->push_back( SUBCLASS(eTYPE_PIG )->addParent( eTYPE_ANIMAL)->addParent(eTYPE_ANIMALS_SPAWN_LIMIT_CHECK ) );
411 classes->push_back( SUBCLASS(eTYPE_CHICKEN )->addParent( eTYPE_ANIMAL ) );
412 classes->push_back( SUBCLASS(eTYPE_COW )->addParent( eTYPE_ANIMAL)->addParent(eTYPE_ANIMALS_SPAWN_LIMIT_CHECK ) );
413 classes->push_back( SUBCLASS(eTYPE_MUSHROOMCOW )->addParent( eTYPE_COW ) );
414 classes->push_back( SUBCLASS(eTYPE_WATERANIMAL )->addParent(eTYPE_PATHFINDER_MOB) );
415 classes->push_back( SUBCLASS(eTYPE_SQUID )->addParent( eTYPE_WATERANIMAL ) );
416 classes->push_back( SUBCLASS(eTYPE_GOLEM )->addParent( eTYPE_PATHFINDER_MOB ) );
417 classes->push_back( SUBCLASS(eTYPE_SNOWMAN )->addParent( eTYPE_GOLEM)->addParent(eTYPE_ANIMALS_SPAWN_LIMIT_CHECK ) );
418 classes->push_back( SUBCLASS(eTYPE_VILLAGERGOLEM )->addParent( eTYPE_GOLEM ) );
419 classes->push_back( SUBCLASS(eTYPE_MONSTER )->addParent( eTYPE_ENEMY)->addParent(eTYPE_PATHFINDER_MOB ) );
420 classes->push_back( SUBCLASS(eTYPE_SPIDER )->addParent( eTYPE_MONSTER)->addParent(eTYPE_VALID_IN_SPAWNER_FLAG ) );
421 classes->push_back( SUBCLASS(eTYPE_CAVESPIDER )->addParent( eTYPE_SPIDER ) );
422 classes->push_back( SUBCLASS(eTYPE_ZOMBIE )->addParent( eTYPE_MONSTER)->addParent(eTYPE_VALID_IN_SPAWNER_FLAG ) );
423 classes->push_back( SUBCLASS(eTYPE_PIGZOMBIE )->addParent( eTYPE_ZOMBIE ) );
424 classes->push_back( SUBCLASS(eTYPE_CREEPER )->addParent( eTYPE_MONSTER)->addParent(eTYPE_VALID_IN_SPAWNER_FLAG ) );
425 classes->push_back( SUBCLASS(eTYPE_GIANT )->addParent( eTYPE_MONSTER)->addParent(eTYPE_VALID_IN_SPAWNER_FLAG ) );
426 classes->push_back( SUBCLASS(eTYPE_SKELETON )->addParent( eTYPE_MONSTER)->addParent(eTYPE_VALID_IN_SPAWNER_FLAG ) );
427 classes->push_back( SUBCLASS(eTYPE_ENDERMAN )->addParent( eTYPE_MONSTER)->addParent(eTYPE_VALID_IN_SPAWNER_FLAG ) );
428 classes->push_back( SUBCLASS(eTYPE_SILVERFISH )->addParent( eTYPE_MONSTER)->addParent(eTYPE_VALID_IN_SPAWNER_FLAG ) );
429 classes->push_back( SUBCLASS(eTYPE_BLAZE )->addParent( eTYPE_MONSTER)->addParent(eTYPE_VALID_IN_SPAWNER_FLAG ) );
430 classes->push_back( SUBCLASS(eTYPE_WITCH )->addParent( eTYPE_MONSTER)->addParent(eTYPE_VALID_IN_SPAWNER_FLAG ) );
431 classes->push_back( SUBCLASS(eTYPE_WITHERBOSS )->addParent( eTYPE_MONSTER)->addParent(eTYPE_VALID_IN_SPAWNER_FLAG ) );
432 classes->push_back( SUBCLASS(eTYPE_AMBIENT )->addParent( eTYPE_MOB ) );
433 classes->push_back( SUBCLASS(eTYPE_BAT )->addParent( eTYPE_AMBIENT )->addParent(eTYPE_VALID_IN_SPAWNER_FLAG ) );
434 classes->push_back( SUBCLASS(eTYPE_FLYING_MOB )->addParent( eTYPE_MOB ) );
435 classes->push_back( SUBCLASS(eTYPE_GHAST )->addParent( eTYPE_FLYING_MOB )->addParent(eTYPE_VALID_IN_SPAWNER_FLAG)->addParent(eTYPE_ENEMY ) );
436 classes->push_back( SUBCLASS(eTYPE_SLIME )->addParent( eTYPE_MOB )->addParent(eTYPE_VALID_IN_SPAWNER_FLAG)->addParent(eTYPE_ENEMY ) );
437 classes->push_back( SUBCLASS(eTYPE_LAVASLIME )->addParent( eTYPE_SLIME ) );
438 classes->push_back( SUBCLASS(eTYPE_ENDERDRAGON )->addParent( eTYPE_MOB ) );
439 classes->push_back( SUBCLASS(eTYPE_PLAYER )->addParent( eTYPE_LIVINGENTITY ) );
440 classes->push_back( SUBCLASS(eTYPE_SERVERPLAYER )->addParent( eTYPE_PLAYER ) );
441 classes->push_back( SUBCLASS(eTYPE_REMOTEPLAYER )->addParent( eTYPE_PLAYER ) );
442 classes->push_back( SUBCLASS(eTYPE_LOCALPLAYER )->addParent( eTYPE_PLAYER ) );
443 classes->push_back( SUBCLASS(eTYPE_MINECART )->addParent( eTYPE_ENTITY ) );
444 classes->push_back( SUBCLASS(eTYPE_MINECART_RIDEABLE )->addParent( eTYPE_MINECART ) );
445 classes->push_back( SUBCLASS(eTYPE_MINECART_SPAWNER )->addParent( eTYPE_MINECART ) );
446 classes->push_back( SUBCLASS(eTYPE_MINECART_FURNACE )->addParent( eTYPE_MINECART ) );
447 classes->push_back( SUBCLASS(eTYPE_MINECART_TNT )->addParent( eTYPE_MINECART ) );
448 classes->push_back( SUBCLASS(eTYPE_MINECART_CONTAINER )->addParent( eTYPE_MINECART ) );
449 classes->push_back( SUBCLASS(eTYPE_MINECART_CHEST )->addParent( eTYPE_MINECART_CONTAINER ) );
450 classes->push_back( SUBCLASS(eTYPE_MINECART_HOPPER )->addParent( eTYPE_MINECART_CONTAINER ) );
451 classes->push_back( SUBCLASS(eTYPE_FIREBALL )->addParent( eTYPE_ENTITY)->addParent(eTYPE_PROJECTILE ) );
452 classes->push_back( SUBCLASS(eTYPE_DRAGON_FIREBALL )->addParent( eTYPE_FIREBALL ) );
453 classes->push_back( SUBCLASS(eTYPE_WITHER_SKULL )->addParent( eTYPE_FIREBALL ) );
454 classes->push_back( SUBCLASS(eTYPE_LARGE_FIREBALL )->addParent( eTYPE_FIREBALL ) );
455 classes->push_back( SUBCLASS(eTYPE_SMALL_FIREBALL )->addParent( eTYPE_FIREBALL ) );
456 classes->push_back( SUBCLASS(eTYPE_THROWABLE )->addParent( eTYPE_ENTITY)->addParent(eTYPE_PROJECTILE ) );
457 classes->push_back( SUBCLASS(eTYPE_SNOWBALL )->addParent( eTYPE_THROWABLE ) );
458 classes->push_back( SUBCLASS(eTYPE_THROWNEGG )->addParent( eTYPE_THROWABLE ) );
459 classes->push_back( SUBCLASS(eTYPE_THROWNENDERPEARL )->addParent( eTYPE_THROWABLE ) );
460 classes->push_back( SUBCLASS(eTYPE_THROWNPOTION )->addParent( eTYPE_THROWABLE ) );
461 classes->push_back( SUBCLASS(eTYPE_THROWNEXPBOTTLE )->addParent( eTYPE_THROWABLE ) );
462 classes->push_back( SUBCLASS(eTYPE_HANGING_ENTITY )->addParent( eTYPE_ENTITY ) );
463 classes->push_back( SUBCLASS(eTYPE_PAINTING )->addParent( eTYPE_HANGING_ENTITY ) );
464 classes->push_back( SUBCLASS(eTYPE_ITEM_FRAME )->addParent( eTYPE_HANGING_ENTITY ) );
465 classes->push_back( SUBCLASS(eTYPE_LEASHFENCEKNOT )->addParent( eTYPE_HANGING_ENTITY ) );
466 classes->push_back( SUBCLASS(eTYPE_GLOBAL_ENTITY )->addParent( eTYPE_ENTITY ) );
467 classes->push_back( SUBCLASS(eTYPE_LIGHTNINGBOLT )->addParent( eTYPE_GLOBAL_ENTITY ) );
468
469 //classes->push_back( SUBCLASS(eTYPE_OTHER_ENTITIES )->addParent( eTYPE_ENTITY ) );
470 classes->push_back( SUBCLASS(eTYPE_EXPERIENCEORB )->addParent( eTYPE_ENTITY ) );
471 classes->push_back( SUBCLASS(eTYPE_EYEOFENDERSIGNAL )->addParent( eTYPE_ENTITY)->addParent(eTYPE_PROJECTILE ) );
472 classes->push_back( SUBCLASS(eTYPE_FIREWORKS_ROCKET )->addParent( eTYPE_ENTITY)->addParent(eTYPE_PROJECTILE ) );
473 classes->push_back( SUBCLASS(eTYPE_FISHINGHOOK )->addParent( eTYPE_ENTITY)->addParent(eTYPE_PROJECTILE ) );
474 classes->push_back( SUBCLASS(eTYPE_DELAYEDRELEASE )->addParent( eTYPE_ENTITY ) );
475 classes->push_back( SUBCLASS(eTYPE_BOAT )->addParent( eTYPE_ENTITY ) );
476 classes->push_back( SUBCLASS(eTYPE_FALLINGTILE )->addParent( eTYPE_ENTITY ) );
477 classes->push_back( SUBCLASS(eTYPE_ITEMENTITY )->addParent( eTYPE_ENTITY ) );
478 classes->push_back( SUBCLASS(eTYPE_PRIMEDTNT )->addParent( eTYPE_ENTITY ) );
479 classes->push_back( SUBCLASS(eTYPE_ARROW )->addParent( eTYPE_ENTITY )->addParent(eTYPE_PROJECTILE ) );
480 classes->push_back( SUBCLASS(eTYPE_MULTIENTITY_MOB_PART )->addParent( eTYPE_ENTITY ) );
481 classes->push_back( SUBCLASS(eTYPE_NETHER_SPHERE )->addParent( eTYPE_ENTITY ) );
482 classes->push_back( SUBCLASS(eTYPE_ENDER_CRYSTAL )->addParent( eTYPE_ENTITY ) );
483
484 classes->push_back( SUBCLASS(eType_BREAKINGITEMPARTICLE)->addParent(eTYPE_ENTITY) );
485 classes->push_back( SUBCLASS(eType_BUBBLEPARTICLE)->addParent(eTYPE_ENTITY) );
486 classes->push_back( SUBCLASS(eType_EXPLODEPARTICLE)->addParent(eTYPE_ENTITY) );
487 classes->push_back( SUBCLASS(eType_FLAMEPARTICLE)->addParent(eTYPE_ENTITY) );
488 classes->push_back( SUBCLASS(eType_FOOTSTEPPARTICLE)->addParent(eTYPE_ENTITY) );
489 classes->push_back( SUBCLASS(eType_HEARTPARTICLE)->addParent(eTYPE_ENTITY) );
490 classes->push_back( SUBCLASS(eType_LAVAPARTICLE)->addParent(eTYPE_ENTITY) );
491 classes->push_back( SUBCLASS(eType_NOTEPARTICLE)->addParent(eTYPE_ENTITY) );
492 classes->push_back( SUBCLASS(eType_NETHERPORTALPARTICLE)->addParent(eTYPE_ENTITY) );
493 classes->push_back( SUBCLASS(eType_REDDUSTPARTICLE)->addParent(eTYPE_ENTITY) );
494 classes->push_back( SUBCLASS(eType_SMOKEPARTICLE)->addParent(eTYPE_ENTITY) );
495 classes->push_back( SUBCLASS(eType_SNOWSHOVELPARTICLE)->addParent(eTYPE_ENTITY) );
496 classes->push_back( SUBCLASS(eType_SPLASHPARTICLE)->addParent(eTYPE_ENTITY) );
497 classes->push_back( SUBCLASS(eType_TAKEANIMATIONPARTICLE)->addParent(eTYPE_ENTITY) );
498 classes->push_back( SUBCLASS(eType_TERRAINPARTICLE)->addParent(eTYPE_ENTITY) );
499 classes->push_back( SUBCLASS(eType_WATERDROPPARTICLE)->addParent(eTYPE_ENTITY) );
500 classes->push_back( SUBCLASS(eType_CRITPARTICLE)->addParent(eTYPE_ENTITY) );
501 classes->push_back( SUBCLASS(eType_CRITPARTICLE2)->addParent(eTYPE_ENTITY) );
502 classes->push_back( SUBCLASS(eType_HUGEEXPLOSIONPARTICLE)->addParent(eTYPE_ENTITY) );
503 classes->push_back( SUBCLASS(eType_HUGEEXPLOSIONSEEDPARTICLE)->addParent(eTYPE_ENTITY) );
504 classes->push_back( SUBCLASS(eType_PLAYERCLOUDPARTICLEPARTICLE)->addParent(eTYPE_ENTITY) );
505 classes->push_back( SUBCLASS(eType_SUSPENDEDPARTICLE)->addParent(eTYPE_ENTITY) );
506 classes->push_back( SUBCLASS(eType_SUSPENDEDTOWNPARTICLE)->addParent(eTYPE_ENTITY) );
507 classes->push_back( SUBCLASS(eTYPE_DRIPPARTICLE)->addParent(eTYPE_ENTITY) );
508 classes->push_back( SUBCLASS(eTYPE_ENCHANTMENTTABLEPARTICLE)->addParent(eTYPE_ENTITY) );
509 classes->push_back( SUBCLASS(eTYPE_SPELLPARTICLE)->addParent(eTYPE_ENTITY) );
510 classes->push_back( SUBCLASS(eTYPE_DRAGONBREATHPARTICLE)->addParent(eTYPE_ENTITY) );
511 classes->push_back( SUBCLASS(eType_ENDERPARTICLE)->addParent(eTYPE_ENTITY) );
512 classes->push_back( SUBCLASS(eType_FIREWORKSSTARTERPARTICLE)->addParent(eTYPE_ENTITY) );
513 classes->push_back( SUBCLASS(eType_FIREWORKSSPARKPARTICLE)->addParent(eTYPE_ENTITY) );
514 classes->push_back( SUBCLASS(eType_FIREWORKSOVERLAYPARTICLE)->addParent(eTYPE_ENTITY) );
515 classes->push_back( SUBCLASS(eTYPE_TILEENTITY) );
516 classes->push_back( SUBCLASS(eTYPE_CHESTTILEENTITY )->addParent( eTYPE_TILEENTITY ) );
517 classes->push_back( SUBCLASS(eTYPE_MOBSPAWNERTILEENTITY )->addParent( eTYPE_TILEENTITY ) );
518 classes->push_back( SUBCLASS(eTYPE_FURNACETILEENTITY )->addParent( eTYPE_TILEENTITY ) );
519 classes->push_back( SUBCLASS(eTYPE_SIGNTILEENTITY )->addParent( eTYPE_TILEENTITY ) );
520 classes->push_back( SUBCLASS(eTYPE_MUSICTILEENTITY )->addParent( eTYPE_TILEENTITY ) );
521 classes->push_back( SUBCLASS(eTYPE_RECORDPLAYERTILE )->addParent( eTYPE_TILEENTITY ) );
522 classes->push_back( SUBCLASS(eTYPE_PISTONPIECEENTITY )->addParent( eTYPE_TILEENTITY ) );
523 classes->push_back( SUBCLASS(eTYPE_BREWINGSTANDTILEENTITY )->addParent( eTYPE_TILEENTITY ) );
524 classes->push_back( SUBCLASS(eTYPE_ENCHANTMENTTABLEENTITY )->addParent( eTYPE_TILEENTITY ) );
525 classes->push_back( SUBCLASS(eTYPE_THEENDPORTALTILEENTITY )->addParent( eTYPE_TILEENTITY ) );
526 classes->push_back( SUBCLASS(eTYPE_SKULLTILEENTITY )->addParent( eTYPE_TILEENTITY ) );
527 classes->push_back( SUBCLASS(eTYPE_ENDERCHESTTILEENTITY )->addParent( eTYPE_TILEENTITY ) );
528 classes->push_back( SUBCLASS(eTYPE_BEACONTILEENTITY )->addParent( eTYPE_TILEENTITY ) );
529 classes->push_back( SUBCLASS(eTYPE_COMMANDBLOCKTILEENTITY )->addParent( eTYPE_TILEENTITY ) );
530 classes->push_back( SUBCLASS(eTYPE_COMPARATORTILEENTITY )->addParent( eTYPE_TILEENTITY ) );
531 classes->push_back( SUBCLASS(eTYPE_DAYLIGHTDETECTORTILEENTITY )->addParent( eTYPE_TILEENTITY ) );
532 classes->push_back( SUBCLASS(eTYPE_HOPPERTILEENTITY )->addParent( eTYPE_TILEENTITY ) );
533 classes->push_back( SUBCLASS(eTYPE_DISPENSERTILEENTITY )->addParent( eTYPE_TILEENTITY ) );
534 classes->push_back( SUBCLASS(eTYPE_DROPPERTILEENTITY )->addParent( eTYPE_DISPENSERTILEENTITY ) );
535
536 //classes->push_back( SUBCLASS(eTYPE_OTHERS) );
537 classes->push_back( SUBCLASS(eType_NODE) );
538 classes->push_back( SUBCLASS(eType_ITEM) );
539 classes->push_back( SUBCLASS(eType_ITEMINSTANCE) );
540 classes->push_back( SUBCLASS(eType_MAPITEM) );
541 classes->push_back( SUBCLASS(eType_TILE) );
542 classes->push_back( SUBCLASS(eType_FIRETILE) );
543
544 vector< pair<SubClass*,SubClass*> > m_falsePositives;
545 vector< pair<SubClass*,SubClass*> > m_falseNegatives;
546
547 vector<SubClass*>::iterator it1;
548 for (it1=classes->begin(); it1!=classes->end(); it1++)
549 {
550 SubClass *current = *it1;
551 //if ( current->justFlag() ) continue;
552
553 vector<SubClass *>::iterator it2;
554 for (it2=classes->begin(); it2!=classes->end(); it2++)
555 {
556 SubClass *comparing = *it2;
557 //if ( comparing->justFlag() ) continue;
558
559 // We shouldn't be comparing to leaf classes anyway.
560 //if ( comparing->m_isTerminal ) continue;
561
562 eINSTANCEOF typeCurr, typeComp;
563 typeCurr = current->m_id;
564 typeComp = comparing->m_id;
565
566 bool shouldDerive, doesDerive;
567
568 {
569 vector<eINSTANCEOF>::iterator it3;
570 it3 = find(current->m_parents.begin(), current->m_parents.end(), typeComp);
571 shouldDerive = (typeComp == typeCurr) || (it3 != current->m_parents.end());
572 }
573
574 doesDerive = eTYPE_DERIVED_FROM(typeComp, typeCurr);
575
576 if (shouldDerive != doesDerive)
577 {
578 vector< pair<SubClass*,SubClass*> > *errorArray;
579 if (shouldDerive) errorArray = &m_falseNegatives;
580 else errorArray = &m_falsePositives;
581
582 errorArray->push_back( pair<SubClass*,SubClass*>(comparing, current) );
583 }
584 }
585 }
586
587 vector< pair<SubClass*,SubClass*> >::iterator itrErr;
588 for (itrErr = m_falsePositives.begin(); itrErr != m_falsePositives.end(); itrErr++)
589 {
590 SubClass *sub = itrErr->first, *super = itrErr->second;
591 printf( "[Class.h] Error: '%s' incorrectly derives from '%s'.\n", sub->m_name.c_str(), super->m_name.c_str() );
592 }
593 for (itrErr = m_falseNegatives.begin(); itrErr != m_falseNegatives.end(); itrErr++)
594 {
595 SubClass *sub = itrErr->first, *super = itrErr->second;
596 printf( "[Class.h] Error: '%s' doesn't derive '%s'.\n", sub->m_name.c_str(), super->m_name.c_str() );
597 }
598
599 if ( (m_falsePositives.size() > 0) || (m_falseNegatives.size() > 0) )
600 {
601 __debugbreak();
602 }
603 }
604};
605
606#endif