From 395b1b33462c6de9801b77457d347bf62024c2de Mon Sep 17 00:00:00 2001 From: Paul Ouellette Date: Mon, 22 Jul 2019 01:15:50 -0400 Subject: [PATCH] Initialize priority in CraftDefinition constructors The priority is used by getCraftResult, which may be used before initHash is called. --- src/craftdef.cpp | 107 ++++++++++++++++++++++++++++++++--------------- src/craftdef.h | 49 ++++++++++------------ 2 files changed, 94 insertions(+), 62 deletions(-) diff --git a/src/craftdef.cpp b/src/craftdef.cpp index 9482fce6a..fb82bb396 100644 --- a/src/craftdef.cpp +++ b/src/craftdef.cpp @@ -37,6 +37,15 @@ inline bool isGroupRecipeStr(const std::string &rec_name) return str_starts_with(rec_name, std::string("group:")); } +static bool hasGroupItem(const std::vector &recipe) +{ + for (const auto &item : recipe) { + if (isGroupRecipeStr(item)) + return true; + } + return false; +} + inline u64 getHashForString(const std::string &recipe_str) { /*errorstream << "Hashing craft string \"" << recipe_str << '"';*/ @@ -320,6 +329,19 @@ std::string CraftReplacements::dump() const CraftDefinitionShaped */ +CraftDefinitionShaped::CraftDefinitionShaped( + const std::string &output_, + unsigned int width_, + const std::vector &recipe_, + const CraftReplacements &replacements_): + output(output_), width(width_), recipe(recipe_), replacements(replacements_) +{ + if (hasGroupItem(recipe)) + priority = SHAPED_AND_GROUPS; + else + priority = SHAPED; +} + std::string CraftDefinitionShaped::getName() const { return "shaped"; @@ -425,20 +447,10 @@ void CraftDefinitionShaped::initHash(IGameDef *gamedef) hash_inited = true; recipe_names = craftGetItemNames(recipe, gamedef); - bool has_group = false; - for (const auto &recipe_name : recipe_names) { - if (isGroupRecipeStr(recipe_name)) { - has_group = true; - break; - } - } - if (has_group) { + if (hasGroupItem(recipe_names)) hash_type = CRAFT_HASH_TYPE_COUNT; - priority = SHAPED_AND_GROUPS; - } else { + else hash_type = CRAFT_HASH_TYPE_ITEM_NAMES; - priority = SHAPED; - } } std::string CraftDefinitionShaped::dump() const @@ -454,6 +466,18 @@ std::string CraftDefinitionShaped::dump() const CraftDefinitionShapeless */ +CraftDefinitionShapeless::CraftDefinitionShapeless( + const std::string &output_, + const std::vector &recipe_, + const CraftReplacements &replacements_): + output(output_), recipe(recipe_), replacements(replacements_) +{ + if (hasGroupItem(recipe)) + priority = SHAPELESS_AND_GROUPS; + else + priority = SHAPELESS; +} + std::string CraftDefinitionShapeless::getName() const { return "shapeless"; @@ -542,20 +566,10 @@ void CraftDefinitionShapeless::initHash(IGameDef *gamedef) recipe_names = craftGetItemNames(recipe, gamedef); std::sort(recipe_names.begin(), recipe_names.end()); - bool has_group = false; - for (const auto &recipe_name : recipe_names) { - if (isGroupRecipeStr(recipe_name)) { - has_group = true; - break; - } - } - if (has_group) { + if (hasGroupItem(recipe_names)) hash_type = CRAFT_HASH_TYPE_COUNT; - priority = SHAPELESS_AND_GROUPS; - } else { + else hash_type = CRAFT_HASH_TYPE_ITEM_NAMES; - priority = SHAPELESS; - } } std::string CraftDefinitionShapeless::dump() const @@ -571,6 +585,12 @@ std::string CraftDefinitionShapeless::dump() const CraftDefinitionToolRepair */ +CraftDefinitionToolRepair::CraftDefinitionToolRepair(float additional_wear_): + additional_wear(additional_wear_) +{ + priority = TOOLREPAIR; +} + static ItemStack craftToolRepair( const ItemStack &item1, const ItemStack &item2, @@ -665,6 +685,19 @@ std::string CraftDefinitionToolRepair::dump() const CraftDefinitionCooking */ +CraftDefinitionCooking::CraftDefinitionCooking( + const std::string &output_, + const std::string &recipe_, + float cooktime_, + const CraftReplacements &replacements_): + output(output_), recipe(recipe_), cooktime(cooktime_), replacements(replacements_) +{ + if (isGroupRecipeStr(recipe)) + priority = SHAPELESS_AND_GROUPS; + else + priority = SHAPELESS; +} + std::string CraftDefinitionCooking::getName() const { return "cooking"; @@ -735,13 +768,10 @@ void CraftDefinitionCooking::initHash(IGameDef *gamedef) hash_inited = true; recipe_name = craftGetItemName(recipe, gamedef); - if (isGroupRecipeStr(recipe_name)) { + if (isGroupRecipeStr(recipe_name)) hash_type = CRAFT_HASH_TYPE_COUNT; - priority = SHAPELESS_AND_GROUPS; - } else { + else hash_type = CRAFT_HASH_TYPE_ITEM_NAMES; - priority = SHAPELESS; - } } std::string CraftDefinitionCooking::dump() const @@ -758,6 +788,18 @@ std::string CraftDefinitionCooking::dump() const CraftDefinitionFuel */ +CraftDefinitionFuel::CraftDefinitionFuel( + const std::string &recipe_, + float burntime_, + const CraftReplacements &replacements_): + recipe(recipe_), burntime(burntime_), replacements(replacements_) +{ + if (isGroupRecipeStr(recipe_name)) + priority = SHAPELESS_AND_GROUPS; + else + priority = SHAPELESS; +} + std::string CraftDefinitionFuel::getName() const { return "fuel"; @@ -828,13 +870,10 @@ void CraftDefinitionFuel::initHash(IGameDef *gamedef) hash_inited = true; recipe_name = craftGetItemName(recipe, gamedef); - if (isGroupRecipeStr(recipe_name)) { + if (isGroupRecipeStr(recipe_name)) hash_type = CRAFT_HASH_TYPE_COUNT; - priority = SHAPELESS_AND_GROUPS; - } else { + else hash_type = CRAFT_HASH_TYPE_ITEM_NAMES; - priority = SHAPELESS; - } } std::string CraftDefinitionFuel::dump() const diff --git a/src/craftdef.h b/src/craftdef.h index d8ad2eb22..a385a5c88 100644 --- a/src/craftdef.h +++ b/src/craftdef.h @@ -196,15 +196,12 @@ class CraftDefinitionShaped: public CraftDefinition { public: CraftDefinitionShaped() = delete; - CraftDefinitionShaped( - const std::string &output_, - unsigned int width_, - const std::vector &recipe_, - const CraftReplacements &replacements_): - output(output_), width(width_), recipe(recipe_), - replacements(replacements_) - {} + const std::string &output_, + unsigned int width_, + const std::vector &recipe_, + const CraftReplacements &replacements_); + virtual ~CraftDefinitionShaped() = default; virtual std::string getName() const; @@ -245,11 +242,10 @@ class CraftDefinitionShapeless: public CraftDefinition public: CraftDefinitionShapeless() = delete; CraftDefinitionShapeless( - const std::string &output_, - const std::vector &recipe_, - const CraftReplacements &replacements_): - output(output_), recipe(recipe_), replacements(replacements_) - {} + const std::string &output_, + const std::vector &recipe_, + const CraftReplacements &replacements_); + virtual ~CraftDefinitionShapeless() = default; virtual std::string getName() const; @@ -288,9 +284,8 @@ class CraftDefinitionToolRepair: public CraftDefinition { public: CraftDefinitionToolRepair() = delete; - CraftDefinitionToolRepair(float additional_wear_): - additional_wear(additional_wear_) - {} + CraftDefinitionToolRepair(float additional_wear_); + virtual ~CraftDefinitionToolRepair() = default; virtual std::string getName() const; @@ -305,7 +300,6 @@ public: virtual void initHash(IGameDef *gamedef) { hash_type = CRAFT_HASH_TYPE_COUNT; - priority = TOOLREPAIR; } virtual std::string dump() const; @@ -328,12 +322,11 @@ class CraftDefinitionCooking: public CraftDefinition public: CraftDefinitionCooking() = delete; CraftDefinitionCooking( - const std::string &output_, - const std::string &recipe_, - float cooktime_, - const CraftReplacements &replacements_): - output(output_), recipe(recipe_), cooktime(cooktime_), replacements(replacements_) - {} + const std::string &output_, + const std::string &recipe_, + float cooktime_, + const CraftReplacements &replacements_); + virtual ~CraftDefinitionCooking() = default; virtual std::string getName() const; @@ -372,11 +365,11 @@ class CraftDefinitionFuel: public CraftDefinition { public: CraftDefinitionFuel() = delete; - CraftDefinitionFuel(const std::string &recipe_, - float burntime_, - const CraftReplacements &replacements_): - recipe(recipe_), burntime(burntime_), replacements(replacements_) - {} + CraftDefinitionFuel( + const std::string &recipe_, + float burntime_, + const CraftReplacements &replacements_); + virtual ~CraftDefinitionFuel() = default; virtual std::string getName() const; -- 2.25.1