13#include "../PrefabScanner.h"
14#include "../prefabfactory.h"
15#include "../third_party/nlohmann/json.hpp"
26 for (
char c : treePath)
45 if (treePath.find(
"..") != std::string::npos)
49 if (treePath[0] ==
'/' || treePath[0] ==
'\\')
53 if (treePath.find(
"Blueprints/") != 0)
57 for (
char c : treePath)
59 if (!std::isalnum(
c) &&
c !=
'/' &&
c !=
'_' &&
c !=
'-' &&
c !=
'.')
66std::vector<BehaviorTreeDependencyScanner::BTDependency>
74 if (
compDef.componentType ==
"BehaviorTreeRuntime_data" ||
75 compDef.componentType ==
"BehaviorTreeRuntime")
86 std::cerr <<
"[BTDepScanner] WARNING: Invalid or unsafe BT path rejected: "
87 << treePath <<
" (in prefab: " <<
prefab.prefabName <<
")\n";
94 std::cout <<
"[BTDepScanner] Found BT dependency: " << treePath
95 <<
" (ID=" << treeId <<
")\n";
103std::vector<BehaviorTreeDependencyScanner::BTDependency>
113 std::cerr <<
"[BTDepScanner] ERROR: Too many prefabs to scan (" <<
prefabNames.size()
114 <<
" > " <<
MAX_PREFABS <<
"). Possible DoS attempt.\n";
118 std::cout <<
"[BTDepScanner] Scanning " <<
prefabNames.size() <<
" prefabs for BT dependencies...\n";
125 std::cerr <<
"[BTDepScanner] Warning: Prefab not found: " << prefabName <<
"\n";
141 std::cout <<
"[BTDepScanner] Found " <<
allDependencies.size() <<
" unique BT dependencies\n";
154 if (prefabName.find(
"..") != std::string::npos)
158 if (prefabName.find(
'/') != std::string::npos || prefabName.find(
'\\') != std::string::npos)
162 for (
char c : prefabName)
164 if (!std::isalnum(
c) &&
c !=
'_' &&
c !=
'-')
175 std::cout <<
"[BTDepScanner] Extracting prefab types from level...\n";
180 std::cerr <<
"[BTDepScanner] Warning: No 'layers' array in level JSON\n";
186 const auto& layers =
levelJson[
"layers"];
189 std::cerr <<
"[BTDepScanner] ERROR: Too many layers in level JSON (" << layers.size()
190 <<
" > " <<
MAX_LAYERS <<
"). Possible DoS attempt.\n";
194 for (
const auto& layer : layers)
197 std::string
layerType = layer.value(
"type",
"");
201 if (layer.contains(
"objects") && layer[
"objects"].is_array())
203 const auto& objects = layer[
"objects"];
209 std::cerr <<
"[BTDepScanner] WARNING: Too many objects in layer (" << objects.size()
214 for (
const auto&
obj : objects)
217 if (
obj.contains(
"type") &&
obj[
"type"].is_string())
219 std::string prefabType =
obj[
"type"].get<std::string>();
226 else if (!prefabType.empty())
228 std::cerr <<
"[BTDepScanner] WARNING: Invalid prefab name rejected: "
229 << prefabType <<
"\n";
234 if (
obj.contains(
"class") &&
obj[
"class"].is_string())
245 std::cerr <<
"[BTDepScanner] WARNING: Invalid prefab name rejected: "
254 std::cout <<
"[BTDepScanner] Extracted " <<
prefabNames.size() <<
" unique prefab types\n";
static bool IsValidPrefabName(const std::string &prefabName)
static bool IsValidBehaviorTreePath(const std::string &treePath)
ComponentTypeID GetComponentTypeID_Static()
static uint32_t GenerateTreeIdFromPath(const std::string &treePath)
static std::vector< BTDependency > ScanPrefab(const PrefabBlueprint &prefab)
static std::vector< BTDependency > ScanPrefabs(const std::vector< std::string > &prefabNames)
static std::set< std::string > ExtractPrefabsFromLevel(const nlohmann::json &levelJson)
const PrefabRegistry & GetPrefabRegistry() const
Get the cached prefab registry.
static PrefabFactory & Get()
Get singleton instance.
const PrefabBlueprint * Find(const std::string &name) const