From 395b1b33462c6de9801b77457d347bf62024c2de Mon Sep 17 00:00:00 2001 From: Paul Ouellette Date: Mon, 22 Jul 2019 01:15:50 -0400 Subject: Initialize priority in CraftDefinition constructors The priority is used by getCraftResult, which may be used before initHash is called. --- src/craftdef.cpp | 107 +++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 73 insertions(+), 34 deletions(-) (limited to 'src/craftdef.cpp') 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 -- cgit v1.2.3