Use std::queue for HTTPFetchRequest and std::vector for log_output instead of std...
[oweals/minetest.git] / src / craftdef.cpp
index 5c7c3a4659d5012ace8901179e61c331cdedafa2..80937ccb79ee0a671ba93d3491e585bd012f9e98 100644 (file)
@@ -418,27 +418,28 @@ bool CraftDefinitionShaped::check(const CraftInput &input, IGameDef *gamedef) co
                return false;  // it was empty
 
        // Different sizes?
-       if(inp_max_x - inp_min_x != rec_max_x - rec_min_x)
-               return false;
-       if(inp_max_y - inp_min_y != rec_max_y - rec_min_y)
+       if(inp_max_x - inp_min_x != rec_max_x - rec_min_x ||
+                       inp_max_y - inp_min_y != rec_max_y - rec_min_y)
                return false;
 
        // Verify that all item names in the bounding box are equal
        unsigned int w = inp_max_x - inp_min_x + 1;
        unsigned int h = inp_max_y - inp_min_y + 1;
-       for(unsigned int y=0; y<h; y++)
-       for(unsigned int x=0; x<w; x++)
-       {
-               unsigned int inp_x = inp_min_x + x;
-               unsigned int inp_y = inp_min_y + y;
-               unsigned int rec_x = rec_min_x + x;
-               unsigned int rec_y = rec_min_y + y;
-
-               if(!inputItemMatchesRecipe(
-                               inp_names[inp_y * inp_width + inp_x],
-                               rec_names[rec_y * rec_width + rec_x], gamedef->idef())
-               ){
-                       return false;
+
+       for(unsigned int y=0; y < h; y++) {
+               unsigned int inp_y = (inp_min_y + y) * inp_width;
+               unsigned int rec_y = (rec_min_y + y) * rec_width;
+
+               for(unsigned int x=0; x < w; x++) {
+                       unsigned int inp_x = inp_min_x + x;
+                       unsigned int rec_x = rec_min_x + x;
+
+                       if(!inputItemMatchesRecipe(
+                                       inp_names[inp_y + inp_x],
+                                       rec_names[rec_y + rec_x], gamedef->idef())
+                       ) {
+                               return false;
+                       }
                }
        }
 
@@ -525,7 +526,7 @@ bool CraftDefinitionShapeless::check(const CraftInput &input, IGameDef *gamedef)
        }
 
        // Try with all permutations of the recipe
-       std::vector<std::string> recipe_copy = recipe;
+       std::vector<std::string> recipe_copy = craftGetItemNames(recipe, gamedef);
        // Start from the lexicographically first permutation (=sorted)
        std::sort(recipe_copy.begin(), recipe_copy.end());
        //while(std::prev_permutation(recipe_copy.begin(), recipe_copy.end())){}
@@ -954,7 +955,9 @@ public:
 
                        try {
                                tmpout = def->getOutput(input, gamedef);
-                               if(tmpout.item.substr(0,output.item.length()) == output.item)
+                               if((tmpout.item.substr(0,output.item.length()) == output.item) &&
+                                       ((tmpout.item[output.item.length()] == 0) ||
+                                       (tmpout.item[output.item.length()] == ' ')))
                                {
                                        // Get output, then decrement input (if requested)
                                        input = def->getInput(output, gamedef);