diff --git a/src/ObjCommon/Json/JsonExtension.h b/src/ObjCommon/Json/JsonExtension.h index 3b84b35a..897dc4fe 100644 --- a/src/ObjCommon/Json/JsonExtension.h +++ b/src/ObjCommon/Json/JsonExtension.h @@ -18,7 +18,7 @@ namespace nlohmann template void optional_from_json(const nlohmann::json& j, const char* name, std::optional& value) { const auto it = j.find(name); - if (it != j.end()) + if (it != j.end() && !it->is_null()) value = it->get(); else value = std::nullopt; diff --git a/src/ObjLoading/Game/IW4/Leaderboard/JsonLeaderboardDefLoader.cpp b/src/ObjLoading/Game/IW4/Leaderboard/JsonLeaderboardDefLoader.cpp index 4133b5eb..cff973f9 100644 --- a/src/ObjLoading/Game/IW4/Leaderboard/JsonLeaderboardDefLoader.cpp +++ b/src/ObjLoading/Game/IW4/Leaderboard/JsonLeaderboardDefLoader.cpp @@ -36,8 +36,17 @@ namespace return false; } - const auto jLeaderboard = jRoot.get(); - return CreateLeaderboardFromJson(jLeaderboard, leaderboardDef); + try + { + const auto jLeaderboard = jRoot.get(); + return CreateLeaderboardFromJson(jLeaderboard, leaderboardDef); + } + catch (const json::exception& e) + { + std::cerr << std::format("Failed to parse json of leaderboard: {}\n", e.what()); + } + + return false; } private: diff --git a/src/ObjLoading/Game/IW5/Leaderboard/JsonLeaderboardDefLoader.cpp b/src/ObjLoading/Game/IW5/Leaderboard/JsonLeaderboardDefLoader.cpp index afb5650f..092a510d 100644 --- a/src/ObjLoading/Game/IW5/Leaderboard/JsonLeaderboardDefLoader.cpp +++ b/src/ObjLoading/Game/IW5/Leaderboard/JsonLeaderboardDefLoader.cpp @@ -36,8 +36,17 @@ namespace return false; } - const auto jLeaderboard = jRoot.get(); - return CreateLeaderboardFromJson(jLeaderboard, leaderboardDef); + try + { + const auto jLeaderboard = jRoot.get(); + return CreateLeaderboardFromJson(jLeaderboard, leaderboardDef); + } + catch (const json::exception& e) + { + std::cerr << std::format("Failed to parse json of leaderboard: {}\n", e.what()); + } + + return false; } private: diff --git a/src/ObjLoading/Game/IW5/Weapon/JsonWeaponAttachmentLoader.cpp b/src/ObjLoading/Game/IW5/Weapon/JsonWeaponAttachmentLoader.cpp index 5957ba83..71a77664 100644 --- a/src/ObjLoading/Game/IW5/Weapon/JsonWeaponAttachmentLoader.cpp +++ b/src/ObjLoading/Game/IW5/Weapon/JsonWeaponAttachmentLoader.cpp @@ -44,8 +44,17 @@ namespace return false; } - const auto jAttachment = jRoot.get(); - return CreateWeaponAttachmentFromJson(jAttachment, attachment); + try + { + const auto jAttachment = jRoot.get(); + return CreateWeaponAttachmentFromJson(jAttachment, attachment); + } + catch (const json::exception& e) + { + std::cerr << std::format("Failed to parse json of attachment: {}\n", e.what()); + } + + return false; } private: diff --git a/src/ObjLoading/Game/T6/Leaderboard/JsonLeaderboardDefLoader.cpp b/src/ObjLoading/Game/T6/Leaderboard/JsonLeaderboardDefLoader.cpp index 9971a218..1fb1d400 100644 --- a/src/ObjLoading/Game/T6/Leaderboard/JsonLeaderboardDefLoader.cpp +++ b/src/ObjLoading/Game/T6/Leaderboard/JsonLeaderboardDefLoader.cpp @@ -37,8 +37,17 @@ namespace return false; } - const auto jLeaderboard = jRoot.get(); - return CreateLeaderboardFromJson(jLeaderboard, leaderboardDef); + try + { + const auto jLeaderboard = jRoot.get(); + return CreateLeaderboardFromJson(jLeaderboard, leaderboardDef); + } + catch (const json::exception& e) + { + std::cerr << std::format("Failed to parse json of leaderboard: {}\n", e.what()); + } + + return false; } private: diff --git a/src/ObjLoading/Game/T6/Material/JsonMaterialLoader.cpp b/src/ObjLoading/Game/T6/Material/JsonMaterialLoader.cpp index c714a955..09517f39 100644 --- a/src/ObjLoading/Game/T6/Material/JsonMaterialLoader.cpp +++ b/src/ObjLoading/Game/T6/Material/JsonMaterialLoader.cpp @@ -39,8 +39,17 @@ namespace return false; } - const auto jMaterial = jRoot.get(); - return CreateMaterialFromJson(jMaterial, material); + try + { + const auto jMaterial = jRoot.get(); + return CreateMaterialFromJson(jMaterial, material); + } + catch (const json::exception& e) + { + std::cerr << std::format("Failed to parse json of material: {}\n", e.what()); + } + + return false; } private: diff --git a/src/ObjLoading/Game/T6/WeaponCamo/JsonWeaponCamoLoader.cpp b/src/ObjLoading/Game/T6/WeaponCamo/JsonWeaponCamoLoader.cpp index fada1b6e..3c8a4c60 100644 --- a/src/ObjLoading/Game/T6/WeaponCamo/JsonWeaponCamoLoader.cpp +++ b/src/ObjLoading/Game/T6/WeaponCamo/JsonWeaponCamoLoader.cpp @@ -39,8 +39,17 @@ namespace return false; } - const auto jWeaponCamo = jRoot.get(); - return CreateWeaponCamoFromJson(jWeaponCamo, weaponCamo); + try + { + const auto jWeaponCamo = jRoot.get(); + return CreateWeaponCamoFromJson(jWeaponCamo, weaponCamo); + } + catch (const json::exception& e) + { + std::cerr << std::format("Failed to parse json of weapon camo: {}\n", e.what()); + } + + return false; } private: diff --git a/src/ObjLoading/Game/T6/XModel/JsonXModelLoader.cpp b/src/ObjLoading/Game/T6/XModel/JsonXModelLoader.cpp index 692a340f..2f142638 100644 --- a/src/ObjLoading/Game/T6/XModel/JsonXModelLoader.cpp +++ b/src/ObjLoading/Game/T6/XModel/JsonXModelLoader.cpp @@ -40,8 +40,17 @@ namespace return false; } - const auto jXModel = jRoot.get(); - return CreateXModelFromJson(jXModel, xmodel); + try + { + const auto jXModel = jRoot.get(); + return CreateXModelFromJson(jXModel, xmodel); + } + catch (const json::exception& e) + { + std::cerr << std::format("Failed to parse json of xmodel: {}\n", e.what()); + } + + return false; } private: diff --git a/thirdparty/json.lua b/thirdparty/json.lua index 2e6e34f3..ddca7815 100644 --- a/thirdparty/json.lua +++ b/thirdparty/json.lua @@ -2,6 +2,9 @@ json = {} function json:include(includes) if includes:handle(self:name()) then + defines { + "JSON_DIAGNOSTICS=1" + } includedirs { path.join(ThirdPartyFolder(), "json", "single_include") }