TypeRegistry.cpp 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. #include "TypeRegistry.h"
  2. #include "BasicBlocks.h"
  3. #include "BlockFilter.h"
  4. #include "BlockInstanceGeneratorRule.h"
  5. #include "BlockTypeGeneratorRule.h"
  6. #include "Chest.h"
  7. #include "Dimension.h"
  8. #include "DimensionGenerator.h"
  9. #include "FluidBlock.h"
  10. #include "GeneratorRule.h"
  11. #include "Grass.h"
  12. #include "GrowingPlant.h"
  13. #include "LightSources.h"
  14. #include "ModelInfo.h"
  15. #include "OverworldDimension.h"
  16. #include "OverworldDimensionGenerator.h"
  17. #include "PlaceableProof.h"
  18. #include "Quest.h"
  19. #include "TreeSeblingBlock.h"
  20. #include "TreeTemplate.h"
  21. #include "BasicItems.h"
  22. #include "BasicTool.h"
  23. #include "FluidContainer.h"
  24. TypeRegistry::TypeRegistry()
  25. : ReferenceCounter()
  26. {
  27. // register dimension generators
  28. registerDimensionGeneratorFactory(new OverworldDimensionGeneratorFactory());
  29. // register dimensions
  30. registerDimension(new OverworldDimensionFactory());
  31. // register rules
  32. registerGeneratorRuleFactory(new BlockTypeGeneratorRuleFactory());
  33. registerGeneratorRuleFactory(new BlockInstanceGeneratorRuleFactory());
  34. // register templates
  35. registerSubType(new TreeTemplateFactory());
  36. // register quest datastructures
  37. registerType(new QuestRequirementStorageType());
  38. registerType(new QuestStorageType());
  39. registerType(new QuestPartyType());
  40. registerType(new QuestType());
  41. registerType(new QuestCollectionType());
  42. registerSubType(new QuestRequirementOpenDialogType());
  43. registerType(new ItomJsonType());
  44. registerType(new ItemStackInfoType());
  45. registerSubType(new QuestRewardGiveItemsType());
  46. // block types
  47. registerType(new ModelInfoFactory());
  48. registerSubType(new BasicBlockTypeFactory());
  49. registerSubType(new AdditionalItemSpawningBlockTypeFactory());
  50. registerSubType(new BasicLightSourceBlockTypeFactory());
  51. registerSubType(new ChestBlockTypeFactory());
  52. registerSubType(new FluidBlockTypeFactory());
  53. registerSubType(new GrassBlockTypeFactory());
  54. registerSubType(new GrowingPlantBlockTypeFactory());
  55. registerSubType(new TreeSeblingBlockTypeFactory());
  56. // block filter
  57. registerSubType(new BlockFilterAndFactory());
  58. registerSubType(new BlockFilterOrFactory());
  59. registerSubType(new BlockFilterNotFactory());
  60. registerSubType(new BlockFilterBlockTypeFactory());
  61. registerSubType(new BlockFilterTypeGroupFactory());
  62. registerSubType(new BlockFilterMaxHardnessFactory());
  63. registerSubType(new BlockFilterMinHardnessFactory());
  64. registerSubType(new BlockFilterMaxHeatFactory());
  65. // placeable proof
  66. registerSubType(new PlaceableProofAndFactory());
  67. registerSubType(new PlaceableProofOrFactory());
  68. registerSubType(new PlaceableProofNotFactory());
  69. registerSubType(new PlaceableProofBlockFilterFactory());
  70. // item types
  71. registerSubType(new BasicBlockItemTypeFactory());
  72. registerSubType(new BasicItemTypeFactory());
  73. registerSubType(new BasicToolItemTypeFactory());
  74. registerSubType(new FluidContainerItemTypeFactory());
  75. // item skills
  76. registerSubType(new XPBasedLevelUpRuleFactory());
  77. registerType(new DamagingItemSkillConfigFactory());
  78. registerSubType(new DamagingItemSkillFactory());
  79. registerType(new BlockReplaceItemSkillConfigFactory());
  80. registerSubType(new BlockReplaceItemSkillFactory());
  81. registerType(new FluidContainerItemSkillConfigFactory());
  82. registerSubType(new FluidContainerItemSkillFactory());
  83. }
  84. void TypeRegistry::registerGeneratorRuleFactory(GeneratorRuleFactory* factory)
  85. {
  86. generatorRules.add(factory);
  87. }
  88. GeneratorRule* TypeRegistry::createGeneratorRule(
  89. Framework::JSON::JSONValue* zConfig, JExpressionMemory* zMemory)
  90. {
  91. for (GeneratorRuleFactory* f : generatorRules)
  92. {
  93. Framework::JSON::Validator::JSONValidator* validator
  94. = f->getValidator();
  95. if (validator->isValid(zConfig))
  96. {
  97. validator->release();
  98. return f->createRule(zConfig, zMemory);
  99. }
  100. validator->release();
  101. }
  102. return 0;
  103. }
  104. Framework::JSON::Validator::JSONValidator*
  105. TypeRegistry::getGeneratorRuleValidator()
  106. {
  107. auto validator = Framework::JSON::Validator::JSONValidator::buildForOneOf()
  108. ->typeSpecifiedByAttribute("type");
  109. for (GeneratorRuleFactory* f : generatorRules)
  110. {
  111. validator->addAcceptedType(f->getValidator());
  112. }
  113. return validator->finishOneOf();
  114. }
  115. void TypeRegistry::registerDimensionGeneratorFactory(
  116. DimensionGeneratorFactory* factory)
  117. {
  118. dimensionGenerators.add(factory);
  119. }
  120. DimensionGenerator* TypeRegistry::createDimensionGenerator(
  121. Framework::JSON::JSONValue* zConfig, int worldSeed)
  122. {
  123. for (DimensionGeneratorFactory* f : dimensionGenerators)
  124. {
  125. Framework::JSON::Validator::JSONValidator* validator
  126. = f->getConfigValidator();
  127. if (validator->isValid(zConfig))
  128. {
  129. validator->release();
  130. std::cout << "Loaded Config for dimension '" << f->getName()
  131. << "' with id " << f->getDimensionId() << "\n";
  132. return f->createDimensionGenerator(worldSeed, zConfig);
  133. }
  134. validator->release();
  135. }
  136. return 0;
  137. }
  138. Framework::JSON::Validator::JSONValidator*
  139. TypeRegistry::getDimensionGeneratorValidator()
  140. {
  141. auto validator = Framework::JSON::Validator::JSONValidator::buildForOneOf()
  142. ->typeSpecifiedByAttribute("dimension");
  143. for (DimensionGeneratorFactory* f : dimensionGenerators)
  144. {
  145. validator->addAcceptedType(f->getConfigValidator());
  146. }
  147. return validator->finishOneOf();
  148. }
  149. const Framework::RCArray<DimensionGeneratorFactory>&
  150. TypeRegistry::getDimensionGeneratorFactories() const
  151. {
  152. return dimensionGenerators;
  153. }
  154. void TypeRegistry::registerDimension(DimensionFactory* factory)
  155. {
  156. dimensionFactories.add(factory);
  157. }
  158. Dimension* TypeRegistry::createDimension(int id)
  159. {
  160. for (DimensionFactory* factory : dimensionFactories)
  161. {
  162. if (factory->getDimensionId() == id)
  163. {
  164. return factory->createDimension();
  165. }
  166. }
  167. return 0;
  168. }