浏览代码

Introduced "map" scope for accessing identifier on map loading.

Currently it allows access to all mods, should be restricted to mods
that map depends on
Ivan Savenko 2 年之前
父节点
当前提交
abe11aaf54

+ 16 - 7
lib/CModHandler.cpp

@@ -208,8 +208,14 @@ std::vector<CIdentifierStorage::ObjectData> CIdentifierStorage::getPossibleIdent
 
 	if (request.remoteScope.empty())
 	{
+		if (request.localScope == "map")
+		{
+			for (auto const & modName : VLC->modh->getActiveMods())
+				allowedScopes.insert(modName);
+		}
+
 		// normally ID's from all required mods, own mod and virtual "core" mod are allowed
-		if(request.localScope != "core" && !request.localScope.empty())
+		else if(request.localScope != "core" && !request.localScope.empty())
 		{
 			allowedScopes = VLC->modh->getModDependencies(request.localScope, isValidScope);
 
@@ -222,23 +228,26 @@ std::vector<CIdentifierStorage::ObjectData> CIdentifierStorage::getPossibleIdent
 	else
 	{
 		//...unless destination mod was specified explicitly
-		//note: getModDependencies does not work for "core" by design
 
-		//for map format support core mod has access to any mod
-		//TODO: better solution for access from map?
-		if(request.localScope == "core" || request.localScope.empty())
+		if(request.remoteScope == "core" )
+		{
+			//"core" mod is an implicit dependency for all mods, allow access into it
+			allowedScopes.insert(request.remoteScope);
+		}
+		else if(request.remoteScope == request.localScope )
 		{
+			// allow self-access
 			allowedScopes.insert(request.remoteScope);
 		}
 		else
 		{
-			// allow only available to all core mod or dependencies
+			// allow access only if mod is in our dependencies
 			auto myDeps = VLC->modh->getModDependencies(request.localScope, isValidScope);
 
 			if(!isValidScope)
 				return std::vector<ObjectData>();
 
-			if(request.remoteScope == "core" || request.remoteScope == request.localScope || myDeps.count(request.remoteScope))
+			if(myDeps.count(request.remoteScope))
 				allowedScopes.insert(request.remoteScope);
 		}
 	}

+ 2 - 2
lib/mapObjects/CObjectClassesHandler.cpp

@@ -319,9 +319,9 @@ TObjectTypeHandler CObjectClassesHandler::getHandlerFor(si32 type, si32 subtype)
 	throw std::runtime_error("Object type handler not found");
 }
 
-TObjectTypeHandler CObjectClassesHandler::getHandlerFor(std::string type, std::string subtype) const
+TObjectTypeHandler CObjectClassesHandler::getHandlerFor(std::string scope, std::string type, std::string subtype) const
 {
-	boost::optional<si32> id = VLC->modh->identifiers.getIdentifier("core", "object", type, false);
+	boost::optional<si32> id = VLC->modh->identifiers.getIdentifier(scope, "object", type, false);
 	if(id)
 	{
 		auto object = objects.at(id.get());

+ 1 - 1
lib/mapObjects/CObjectClassesHandler.h

@@ -303,7 +303,7 @@ public:
 
 	/// returns handler for specified object (ID-based). ObjectHandler keeps ownership
 	TObjectTypeHandler getHandlerFor(si32 type, si32 subtype) const;
-	TObjectTypeHandler getHandlerFor(std::string type, std::string subtype) const;
+	TObjectTypeHandler getHandlerFor(std::string scope, std::string type, std::string subtype) const;
 	TObjectTypeHandler getHandlerFor(CompoundMapObjectID compoundIdentifier) const;
 
 	std::string getObjectName(si32 type) const;

+ 1 - 1
lib/mapping/MapFormatJson.cpp

@@ -1121,7 +1121,7 @@ void CMapLoaderJson::MapObjectLoader::construct()
 		return;
 	}
 
-	auto handler = VLC->objtypeh->getHandlerFor(typeName, subtypeName);
+	auto handler = VLC->objtypeh->getHandlerFor( "map", typeName, subtypeName);
 
 	auto appearance = new ObjectTemplate;