#include "TypeRegistry.h" #include "BlockTypeGeneratorRule.h" #include "OverworldDimensionGenerator.h" #include "TreeTemplate.h" #include "OverworldDimension.h" TypeRegistry::TypeRegistry() : ReferenceCounter() { // register dimension generators registerDimensionGeneratorFactory(new OverworldDimensionGeneratorFactory()); // register dimensions registerDimension(new OverworldDimensionFactory()); // register rules registerGeneratorRuleFactory(new BlockTypeGeneratorRuleFactory()); // register templates registerGeneratorTemplate(new TreeTemplateFactory()); } void TypeRegistry::registerGeneratorRuleFactory(GeneratorRuleFactory* factory) { generatorRules.add(factory); } GeneratorRule* TypeRegistry::createGeneratorRule( Framework::JSON::JSONValue* zConfig, JExpressionMemory* zMemory) { for (GeneratorRuleFactory* f : generatorRules) { Framework::JSON::Validator::JSONValidator* validator = f->getValidator(); if (validator->isValid(zConfig)) { validator->release(); return f->createRule(zConfig, zMemory); } validator->release(); } return 0; } Framework::JSON::Validator::JSONValidator* TypeRegistry::getGeneratorRuleValidator() { auto validator = Framework::JSON::Validator::JSONValidator::buildForOneOf() ->typeSpecifiedByAttribute("type"); for (GeneratorRuleFactory* f : generatorRules) { validator->addAcceptedType(f->getValidator()); } return validator->finishOneOf(); } void TypeRegistry::registerDimensionGeneratorFactory( DimensionGeneratorFactory* factory) { dimensionGenerators.add(factory); } DimensionGenerator* TypeRegistry::createDimensionGenerator( Framework::JSON::JSONValue* zConfig, int worldSeed) { for (DimensionGeneratorFactory* f : dimensionGenerators) { Framework::JSON::Validator::JSONValidator* validator = f->getConfigValidator(); if (validator->isValid(zConfig)) { validator->release(); std::cout << "Loaded Config for dimension '" << f->getName() << "' with id " << f->getDimensionId() << "\n"; return f->createDimensionGenerator(worldSeed, zConfig); } validator->release(); } return 0; } Framework::JSON::Validator::JSONValidator* TypeRegistry::getDimensionGeneratorValidator() { auto validator = Framework::JSON::Validator::JSONValidator::buildForOneOf() ->typeSpecifiedByAttribute("dimension"); for (DimensionGeneratorFactory* f : dimensionGenerators) { validator->addAcceptedType(f->getConfigValidator()); } return validator->finishOneOf(); } const Framework::RCArray& TypeRegistry::getDimensionGeneratorFactories() const { return dimensionGenerators; } void TypeRegistry::registerDimension(DimensionFactory* factory) { dimensionFactories.add(factory); } Dimension* TypeRegistry::createDimension(int id) { for (DimensionFactory* factory : dimensionFactories) { if (factory->getDimensionId() == id) { return factory->createDimension(); } } return 0; } void TypeRegistry::registerGeneratorTemplate(GeneratorTemplateFactory* factory) { generatorTemplates.add(factory); } GeneratorTemplate* TypeRegistry::createGeneratorTemplate( Framework::JSON::JSONValue* zConfig) { for (GeneratorTemplateFactory* f : generatorTemplates) { Framework::JSON::Validator::JSONValidator* validator = f->getValidator(); if (validator->isValid(zConfig)) { validator->release(); return f->createTemplate(zConfig); } validator->release(); } return 0; } Framework::JSON::Validator::JSONValidator* TypeRegistry::getGeneratorTemplateValidator() { auto validator = Framework::JSON::Validator::JSONValidator::buildForOneOf() ->typeSpecifiedByAttribute("type"); for (GeneratorTemplateFactory* f : generatorTemplates) { validator->addAcceptedType(f->getValidator()); } return validator->finishOneOf(); }