فهرست منبع

Attempt to fix crash on rewardable configuration

Ivan Savenko 2 سال پیش
والد
کامیت
31cef2e7d7
3فایلهای تغییر یافته به همراه9 افزوده شده و 7 حذف شده
  1. 4 2
      lib/rewardable/Configuration.cpp
  2. 1 1
      lib/rewardable/Configuration.h
  3. 4 4
      lib/rewardable/Info.cpp

+ 4 - 2
lib/rewardable/Configuration.cpp

@@ -34,14 +34,16 @@ std::optional<int> Rewardable::Configuration::getVariable(const std::string & ca
 	return std::nullopt;
 }
 
-JsonNode Rewardable::Configuration::getPresetVariable(const std::string & category, const std::string & name) const
+const JsonNode & Rewardable::Configuration::getPresetVariable(const std::string & category, const std::string & name) const
 {
+	static const JsonNode emptyNode;
+
 	std::string variableID = category + '@' + name;
 
 	if (variables.preset.count(variableID))
 		return variables.preset.at(variableID);
 	else
-		return JsonNode();
+		return emptyNode;
 }
 
 void Rewardable::Configuration::presetVariable(const std::string & category, const std::string & name, const JsonNode & value)

+ 1 - 1
lib/rewardable/Configuration.h

@@ -167,7 +167,7 @@ struct DLL_LINKAGE Configuration
 	ui16 getResetDuration() const;
 
 	std::optional<int> getVariable(const std::string & category, const std::string & name) const;
-	JsonNode getPresetVariable(const std::string & category, const std::string & name) const;
+	const JsonNode & getPresetVariable(const std::string & category, const std::string & name) const;
 	void presetVariable(const std::string & category, const std::string & name, const JsonNode & value);
 	void initVariable(const std::string & category, const std::string & name, int value);
 	

+ 4 - 4
lib/rewardable/Info.cpp

@@ -272,18 +272,18 @@ void Rewardable::Info::replaceTextPlaceholders(MetaString & target, const Variab
 
 void Rewardable::Info::configureRewards(
 		Rewardable::Configuration & object,
-		CRandomGenerator & rng, const
-		JsonNode & source,
+		CRandomGenerator & rng,
+		const JsonNode & source,
 		Rewardable::EEventType event,
 		const std::string & modeName) const
 {
 	for(size_t i = 0; i < source.Vector().size(); ++i)
 	{
-		const JsonNode reward = source.Vector()[i];
+		const JsonNode & reward = source.Vector().at(i);
 
 		if (!reward["appearChance"].isNull())
 		{
-			JsonNode chance = reward["appearChance"];
+			const JsonNode & chance = reward["appearChance"];
 			std::string diceID = std::to_string(chance["dice"].Integer());
 
 			auto diceValue = object.getVariable("dice", diceID);