1
0
Fork 0
mirror of https://github.com/luanti-org/luanti.git synced 2025-06-27 16:36:03 +00:00

Fix bug when craft input isn't replaced

This commit is contained in:
TeTpaAka 2015-06-02 20:30:04 +02:00 committed by est31
parent 0b76e85a71
commit 17ba584fe2
7 changed files with 128 additions and 59 deletions

View file

@ -199,6 +199,7 @@ static void craftDecrementInput(CraftInput &input, IGameDef *gamedef)
// Example: if replacements contains the pair ("bucket:bucket_water", "bucket:bucket_empty"),
// a water bucket will not be removed but replaced by an empty bucket.
static void craftDecrementOrReplaceInput(CraftInput &input,
std::vector<ItemStack> &output_replacements,
const CraftReplacements &replacements,
IGameDef *gamedef)
{
@ -213,26 +214,30 @@ static void craftDecrementOrReplaceInput(CraftInput &input,
for (std::vector<ItemStack>::iterator
it = input.items.begin();
it != input.items.end(); it++) {
if (it->count == 1) {
// Find an appropriate replacement
bool found_replacement = false;
for (std::vector<std::pair<std::string, std::string> >::iterator
j = pairs.begin();
j != pairs.end(); j++) {
if (it->name == craftGetItemName(j->first, gamedef)) {
// Find an appropriate replacement
bool found_replacement = false;
for (std::vector<std::pair<std::string, std::string> >::iterator
j = pairs.begin();
j != pairs.end(); j++) {
if (it->name == craftGetItemName(j->first, gamedef)) {
if (it->count == 1) {
it->deSerialize(j->second, gamedef->idef());
found_replacement = true;
pairs.erase(j);
break;
} else {
ItemStack rep;
rep.deSerialize(j->second, gamedef->idef());
it->remove(1);
found_replacement = true;
output_replacements.push_back(rep);
break;
}
}
// No replacement was found, simply decrement count to zero
if (!found_replacement)
it->remove(1);
} else if (it->count >= 2) {
// Ignore replacements for items with count >= 2
it->remove(1);
}
// No replacement was found, simply decrement count to zero
if (!found_replacement)
it->remove(1);
}
}
@ -408,9 +413,10 @@ CraftInput CraftDefinitionShaped::getInput(const CraftOutput &output, IGameDef *
return CraftInput(CRAFT_METHOD_NORMAL,width,craftGetItems(recipe,gamedef));
}
void CraftDefinitionShaped::decrementInput(CraftInput &input, IGameDef *gamedef) const
void CraftDefinitionShaped::decrementInput(CraftInput &input, std::vector<ItemStack> &output_replacements,
IGameDef *gamedef) const
{
craftDecrementOrReplaceInput(input, replacements, gamedef);
craftDecrementOrReplaceInput(input, output_replacements, replacements, gamedef);
}
CraftHashType CraftDefinitionShaped::getHashType() const
@ -529,9 +535,10 @@ CraftInput CraftDefinitionShapeless::getInput(const CraftOutput &output, IGameDe
return CraftInput(CRAFT_METHOD_NORMAL, 0, craftGetItems(recipe, gamedef));
}
void CraftDefinitionShapeless::decrementInput(CraftInput &input, IGameDef *gamedef) const
void CraftDefinitionShapeless::decrementInput(CraftInput &input, std::vector<ItemStack> &output_replacements,
IGameDef *gamedef) const
{
craftDecrementOrReplaceInput(input, replacements, gamedef);
craftDecrementOrReplaceInput(input, output_replacements, replacements, gamedef);
}
CraftHashType CraftDefinitionShapeless::getHashType() const
@ -661,7 +668,8 @@ CraftInput CraftDefinitionToolRepair::getInput(const CraftOutput &output, IGameD
return CraftInput(CRAFT_METHOD_COOKING, additional_wear, stack);
}
void CraftDefinitionToolRepair::decrementInput(CraftInput &input, IGameDef *gamedef) const
void CraftDefinitionToolRepair::decrementInput(CraftInput &input, std::vector<ItemStack> &output_replacements,
IGameDef *gamedef) const
{
craftDecrementInput(input, gamedef);
}
@ -720,9 +728,10 @@ CraftInput CraftDefinitionCooking::getInput(const CraftOutput &output, IGameDef
return CraftInput(CRAFT_METHOD_COOKING,cooktime,craftGetItems(rec,gamedef));
}
void CraftDefinitionCooking::decrementInput(CraftInput &input, IGameDef *gamedef) const
void CraftDefinitionCooking::decrementInput(CraftInput &input, std::vector<ItemStack> &output_replacements,
IGameDef *gamedef) const
{
craftDecrementOrReplaceInput(input, replacements, gamedef);
craftDecrementOrReplaceInput(input, output_replacements, replacements, gamedef);
}
CraftHashType CraftDefinitionCooking::getHashType() const
@ -811,9 +820,10 @@ CraftInput CraftDefinitionFuel::getInput(const CraftOutput &output, IGameDef *ga
return CraftInput(CRAFT_METHOD_COOKING,(int)burntime,craftGetItems(rec,gamedef));
}
void CraftDefinitionFuel::decrementInput(CraftInput &input, IGameDef *gamedef) const
void CraftDefinitionFuel::decrementInput(CraftInput &input, std::vector<ItemStack> &output_replacements,
IGameDef *gamedef) const
{
craftDecrementOrReplaceInput(input, replacements, gamedef);
craftDecrementOrReplaceInput(input, output_replacements, replacements, gamedef);
}
CraftHashType CraftDefinitionFuel::getHashType() const
@ -871,7 +881,8 @@ public:
}
virtual bool getCraftResult(CraftInput &input, CraftOutput &output,
bool decrementInput, IGameDef *gamedef) const
std::vector<ItemStack> &output_replacement, bool decrementInput,
IGameDef *gamedef) const
{
output.item = "";
output.time = 0;
@ -922,7 +933,7 @@ public:
// Get output, then decrement input (if requested)
output = def->getOutput(input, gamedef);
if (decrementInput)
def->decrementInput(input, gamedef);
def->decrementInput(input, output_replacement, gamedef);
/*errorstream << "Check RETURNS TRUE" << std::endl;*/
return true;
}