void CObjectClassesHandler::loadObjectEntry(const JsonNode & entry, ObjectContainter * obj) { if (!handlerConstructors.count(obj->handlerName)) { logGlobal->errorStream() << "Handler with name " << obj->handlerName << " was not found!"; return; } si32 id = selectNextID(entry["index"], obj->objects, 1000); auto handler = handlerConstructors.at(obj->handlerName)(); handler->setType(obj->id, id); if (customNames.count(obj->id) && customNames.at(obj->id).size() > id) handler->init(entry, customNames.at(obj->id).at(id)); else handler->init(entry); if (handler->getTemplates().empty()) { auto range = legacyTemplates.equal_range(std::make_pair(obj->id, id)); for (auto & templ : boost::make_iterator_range(range.first, range.second)) { handler->addTemplate(templ.second); } legacyTemplates.erase(range.first, range.second); } logGlobal->debugStream() << "Loaded object " << obj->id << ":" << id; assert(!obj->objects.count(id)); // DO NOT override obj->objects[id] = handler; }
CObjectClassesHandler::ObjectContainter * CObjectClassesHandler::loadFromJson(const JsonNode & json) { auto obj = new ObjectContainter(); obj->name = json["name"].String(); obj->handlerName = json["handler"].String(); obj->base = json["base"]; obj->id = selectNextID(json["index"], objects, 256); for (auto entry : json["types"].Struct()) { loadObjectEntry(entry.second, obj); } return obj; }
CObjectClassesHandler::ObjectContainter * CObjectClassesHandler::loadFromJson(const JsonNode & json, const std::string & name) { auto obj = new ObjectContainter(); obj->identifier = name; obj->name = json["name"].String(); obj->handlerName = json["handler"].String(); obj->base = json["base"]; obj->id = selectNextID(json["index"], objects, 256); if(json["defaultAiValue"].isNull()) obj->groupDefaultAiValue = boost::none; else obj->groupDefaultAiValue = json["defaultAiValue"].Integer(); for (auto entry : json["types"].Struct()) { loadObjectEntry(entry.first, entry.second, obj); } return obj; }
void CObjectClassesHandler::loadObjectEntry(const std::string & identifier, const JsonNode & entry, ObjectContainter * obj) { if (!handlerConstructors.count(obj->handlerName)) { logGlobal->error("Handler with name %s was not found!", obj->handlerName); return; } std::string convertedId = VLC->modh->normalizeIdentifier(entry.meta, "core", identifier); si32 id = selectNextID(entry["index"], obj->subObjects, 1000); auto handler = handlerConstructors.at(obj->handlerName)(); handler->setType(obj->id, id); handler->setTypeName(obj->identifier, convertedId); if (customNames.count(obj->id) && customNames.at(obj->id).size() > id) handler->init(entry, customNames.at(obj->id).at(id)); else handler->init(entry); if (handler->getTemplates().empty()) { auto range = legacyTemplates.equal_range(std::make_pair(obj->id, id)); for (auto & templ : boost::make_iterator_range(range.first, range.second)) { handler->addTemplate(templ.second); } legacyTemplates.erase(range.first, range.second); } logGlobal->debug("Loaded object %s(%d)::%s(%d)", obj->identifier, obj->id, convertedId, id); assert(!obj->subObjects.count(id)); // DO NOT override obj->subObjects[id] = handler; obj->subIds[convertedId] = id; }