From 375a1ec93f030b7d457b099ea4a02ffc5cb245ea Mon Sep 17 00:00:00 2001 From: JonnyW Date: Thu, 1 Mar 2018 09:50:53 +0000 Subject: [PATCH] fix reverse craft book. clear recipe/result boxes if no item. --- src/content_craft.cpp | 16 +++-- src/nodemeta/content_nodemeta_book_guide.cpp | 71 ++++++++++++++++---- 2 files changed, 66 insertions(+), 21 deletions(-) diff --git a/src/content_craft.cpp b/src/content_craft.cpp index 6b65650..95fcada 100644 --- a/src/content_craft.cpp +++ b/src/content_craft.cpp @@ -987,19 +987,20 @@ FoundReverseRecipe getReverseRecipe(InventoryItem *iitem, int index) } //how to update an ingredient list given a range of new craft items -void addToIngredientList(std::vector results, uint32_t begin, std::vector& ingredient_list) +void addToIngredientList(contentlist_t *list, uint32_t begin, std::vector& ingredient_list) { using namespace std; //make a set to hold the items as the list is compiled set ingredients (ingredient_list.begin(), ingredient_list.end()); - //go through the result list - for (std::vector::iterator it = results.begin()+begin; it != results.end(); ++it) { + listdata_t *d = list->data; + + //go through the result list + while (d) { - listdata_t d = *it; //make a temporary inventory item for the result - InventoryItem *result = InventoryItem::create(d.content, 1, 0, d.data); + InventoryItem *result = InventoryItem::create(d->content, 1, 0, d->data); //go through every recipe for this item for (int rec_ind = getRecipeCount(result); rec_ind--;) { @@ -1020,6 +1021,8 @@ void addToIngredientList(std::vector results, uint32_t begin, std::v //clean up delete result; + + d = d->next; } //ignore CONTENT_IGNORE @@ -1050,8 +1053,7 @@ std::vector& getCraftGuideIngredientList() if (list_size > last_craftguide_count) { //if so, add the new stuff - /* TODO: basically everything for reverse lookup */ - //addToIngredientList(craft_list, last_craftguide_count, ingredient_list); + addToIngredientList(cl, last_craftguide_count, ingredient_list); //and update the craftguide count last_craftguide_count = list_size; diff --git a/src/nodemeta/content_nodemeta_book_guide.cpp b/src/nodemeta/content_nodemeta_book_guide.cpp index b7e6422..a5d4f34 100644 --- a/src/nodemeta/content_nodemeta_book_guide.cpp +++ b/src/nodemeta/content_nodemeta_book_guide.cpp @@ -136,8 +136,17 @@ bool CraftGuideNodeMetadata::step(float dtime, v3s16 pos, ServerEnvironment *env { InventoryList *l = m_inventory->getList("result"); InventoryItem *t = l->getItem(0); - if (!t || t->getContent() == CONTENT_IGNORE) + + if (!t || t->getContent() == CONTENT_IGNORE){ + // nothing in result box so clear recipe list + InventoryList *rec_list = m_inventory->getList("recipe"); + if (rec_list) { + //clear out the recipe grid if the item slot is empty + rec_list->clearItems(); + return true; + } return false; + } content_t *r = crafting::getRecipe(t,m_recipe); if (!r) { if (m_recipe == 0) @@ -468,12 +477,24 @@ void ReverseCraftGuideNodeMetadata::inventoryModified() } bool ReverseCraftGuideNodeMetadata::step(float dtime, v3s16 pos, ServerEnvironment *env) { + //make sure there's a valid item list + InventoryList *item_list = m_inventory->getList("item"); + if (!item_list) return false; + //get the item in the item box - InventoryItem *item = m_inventory->getList("item")->getItem(0); + InventoryItem *item = item_list->getItem(0); //if there's no item in the item box, do nothing - if (!item || item->getContent() == CONTENT_IGNORE) - return false; + if (!item || item->getContent() == CONTENT_IGNORE) { + // nothing in item box so clear recipe and result lists + InventoryList *rec_list = m_inventory->getList("recipe"); + if (rec_list) + rec_list->clearItems(); + InventoryList *res_list = m_inventory->getList("result"); + if (res_list) + res_list->clearItems(); + return true; + } //attempt to look up the recipe crafting::FoundReverseRecipe recipe = crafting::getReverseRecipe(item, m_recipe); @@ -731,8 +752,17 @@ bool CookBookNodeMetadata::step(float dtime, v3s16 pos, ServerEnvironment *env) { InventoryList *l = m_inventory->getList("result"); InventoryItem *t = l->getItem(0); - if (!t || t->getContent() == CONTENT_IGNORE) + + if (!t || t->getContent() == CONTENT_IGNORE){ + // nothing in result box so clear recipe list + InventoryList *rec_list = m_inventory->getList("recipe"); + if (rec_list) { + //clear out the recipe grid if the item slot is empty + rec_list->clearItems(); + return true; + } return false; + } InventoryItem *cookresult = t->createCookResult(); if (!cookresult || cookresult->getContent() == CONTENT_IGNORE) return false; @@ -992,16 +1022,29 @@ bool DeCraftNodeMetadata::step(float dtime, v3s16 pos, ServerEnvironment *env) { InventoryList *l = m_inventory->getList("result"); InventoryItem *t = l->getItem(0); + + int leave = 0; + if (!t || t->getContent() == CONTENT_IGNORE) - return false; - if ((t->getContent()&CONTENT_CRAFTITEM_MASK) == CONTENT_CRAFTITEM_MASK) - return false; - if ((t->getContent()&CONTENT_TOOLITEM_MASK) == CONTENT_TOOLITEM_MASK) - return false; - if ((t->getContent()&CONTENT_CLOTHESITEM_MASK) == CONTENT_CLOTHESITEM_MASK) - return false; - if (content_features(t->getContent()).dug_item == "" && content_features(t->getContent()).extra_dug_item == "") - return false; + leave=1; + else if ((t->getContent()&CONTENT_CRAFTITEM_MASK) == CONTENT_CRAFTITEM_MASK) + leave=1; + else if ((t->getContent()&CONTENT_TOOLITEM_MASK) == CONTENT_TOOLITEM_MASK) + leave=1; + else if ((t->getContent()&CONTENT_CLOTHESITEM_MASK) == CONTENT_CLOTHESITEM_MASK) + leave=1; + else if (content_features(t->getContent()).dug_item == "" && content_features(t->getContent()).extra_dug_item == "") + leave=1; + if (leave) { + // nothing in item box so clear recipe and result lists + InventoryList *rec_list = m_inventory->getList("recipe"); + if (rec_list) + rec_list->clearItems(); + InventoryList *ran_list = m_inventory->getList("random"); + if (ran_list) + ran_list->clearItems(); + return true; + } l = m_inventory->getList("recipe"); l->clearItems(); if (content_features(t->getContent()).dug_item != "") {