the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
at master 606 lines 30 kB view raw
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