summaryrefslogtreecommitdiff
path: root/src/craftdef.cpp
diff options
context:
space:
mode:
authorFoghrye4 <foghrye4@gmail.com>2016-04-25 18:50:10 +0300
committerest31 <MTest31@outlook.com>2016-07-05 21:40:13 +0200
commit281e9f39fdffd106e79122ae23e2b5443a5daea3 (patch)
tree38456eaaed63d4d4bd9fea72438e9dd64d9d5706 /src/craftdef.cpp
parent7a532056e29d00006382caad9ccde66e54ca8aa5 (diff)
downloadminetest-281e9f39fdffd106e79122ae23e2b5443a5daea3.tar.gz
minetest-281e9f39fdffd106e79122ae23e2b5443a5daea3.tar.bz2
minetest-281e9f39fdffd106e79122ae23e2b5443a5daea3.zip
Adding minetest.clear_craft
Modifications by est31: grammar fixes in doc + error messages and a little style fix, no functional change.
Diffstat (limited to 'src/craftdef.cpp')
-rw-r--r--src/craftdef.cpp90
1 files changed, 90 insertions, 0 deletions
diff --git a/src/craftdef.cpp b/src/craftdef.cpp
index d3f1edaf9..45d3018a7 100644
--- a/src/craftdef.cpp
+++ b/src/craftdef.cpp
@@ -960,6 +960,96 @@ public:
return recipes;
}
+
+ virtual bool clearCraftRecipesByOutput(const CraftOutput &output, IGameDef *gamedef)
+ {
+ std::map<std::string, std::vector<CraftDefinition*> >::iterator vec_iter =
+ m_output_craft_definitions.find(output.item);
+
+ if (vec_iter == m_output_craft_definitions.end())
+ return false;
+
+ std::vector<CraftDefinition*> &vec = vec_iter->second;
+ for (std::vector<CraftDefinition*>::iterator i = vec.begin();
+ i != vec.end(); ++i) {
+ CraftDefinition *def = *i;
+ // Recipes are not yet hashed at this point
+ std::vector<CraftDefinition*> &unhashed_inputs_vec = m_craft_defs[(int) CRAFT_HASH_TYPE_UNHASHED][0];
+ std::vector<CraftDefinition*> new_vec_by_input;
+ /* We will preallocate necessary memory addresses, so we don't need to reallocate them later.
+ This would save us some performance. */
+ new_vec_by_input.reserve(unhashed_inputs_vec.size());
+ for (std::vector<CraftDefinition*>::iterator i2 = unhashed_inputs_vec.begin();
+ i2 != unhashed_inputs_vec.end(); ++i2) {
+ if (def != *i2) {
+ new_vec_by_input.push_back(*i2);
+ }
+ }
+ m_craft_defs[(int) CRAFT_HASH_TYPE_UNHASHED][0].swap(new_vec_by_input);
+ }
+ m_output_craft_definitions.erase(output.item);
+ return true;
+ }
+
+ virtual bool clearCraftRecipesByInput(CraftMethod craft_method, unsigned int craft_grid_width,
+ const std::vector<std::string> &recipe, IGameDef *gamedef)
+ {
+ bool all_empty = true;
+ for (std::vector<std::string>::size_type i = 0;
+ i < recipe.size(); i++) {
+ if (!recipe[i].empty()) {
+ all_empty = false;
+ break;
+ }
+ }
+ if (all_empty)
+ return false;
+
+ CraftInput input(craft_method, craft_grid_width, craftGetItems(recipe, gamedef));
+ // Recipes are not yet hashed at this point
+ std::vector<CraftDefinition*> &unhashed_inputs_vec = m_craft_defs[(int) CRAFT_HASH_TYPE_UNHASHED][0];
+ std::vector<CraftDefinition*> new_vec_by_input;
+ bool got_hit = false;
+ for (std::vector<CraftDefinition*>::size_type
+ i = unhashed_inputs_vec.size(); i > 0; i--) {
+ CraftDefinition *def = unhashed_inputs_vec[i - 1];
+ /* If the input doesn't match the recipe definition, this recipe definition later
+ will be added back in source map. */
+ if (!def->check(input, gamedef)) {
+ new_vec_by_input.push_back(def);
+ continue;
+ }
+ CraftOutput output = def->getOutput(input, gamedef);
+ got_hit = true;
+ std::map<std::string, std::vector<CraftDefinition*> >::iterator
+ vec_iter = m_output_craft_definitions.find(output.item);
+ if (vec_iter == m_output_craft_definitions.end())
+ continue;
+ std::vector<CraftDefinition*> &vec = vec_iter->second;
+ std::vector<CraftDefinition*> new_vec_by_output;
+ /* We will preallocate necessary memory addresses, so we don't need
+ to reallocate them later. This would save us some performance. */
+ new_vec_by_output.reserve(vec.size());
+ for (std::vector<CraftDefinition*>::iterator i = vec.begin();
+ i != vec.end(); ++i) {
+ /* If pointers from map by input and output are not same,
+ we will add 'CraftDefinition*' to a new vector. */
+ if (def != *i) {
+ /* Adding dereferenced iterator value (which are
+ 'CraftDefinition' reference) to a new vector. */
+ new_vec_by_output.push_back(*i);
+ }
+ }
+ // Swaps assigned to current key value with new vector for output map.
+ m_output_craft_definitions[output.item].swap(new_vec_by_output);
+ }
+ if (got_hit)
+ // Swaps value with new vector for input map.
+ m_craft_defs[(int) CRAFT_HASH_TYPE_UNHASHED][0].swap(new_vec_by_input);
+
+ return got_hit;
+ }
+
virtual std::string dump() const
{
std::ostringstream os(std::ios::binary);