Wayback Machinekoobas.hobune.stream
May JUN Jul
Previous capture 12 Next capture
2021 2022 2023
1 capture
12 Jun 22 - 12 Jun 22
sparklines
Close Help
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
  • Asset Store
  • Get Unity

UNITY ACCOUNT

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account
  • Blog
  • Forums
  • Answers
  • Evangelists
  • User Groups
  • Beta Program
  • Advisory Panel

Navigation

  • Home
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
    • Blog
    • Forums
    • Answers
    • Evangelists
    • User Groups
    • Beta Program
    • Advisory Panel

Unity account

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account

Language

  • Chinese
  • Spanish
  • Japanese
  • Korean
  • Portuguese
  • Ask a question
  • Spaces
    • Default
    • Help Room
    • META
    • Moderators
    • Topics
    • Questions
    • Users
    • Badges
  • Home /
  • Help Room /
avatar image
0
Question by Sicmish · Jan 22, 2017 at 12:23 AM · inventorycrafting

Crafting help checking for more than one material

Well I need help with my checking if inventory contains the itemID and the itemAmount, my code works just fine but it checks for only one of the materials at a time. Lets say I need: 3 wood and 5 rocks to make a firepit.

So I run this:

 //Getting all the recipes.
         for (int i = 0; i < recipes.Count; i++)
         {
             //Getting the materials for the recipe.
             foreach (KeyValuePair<int, int> materials in recipes[i].materials)
             {
                 //Splitting up the materials in the recipe [itemID = materials.Key, itemAmount = materials.Value]
                 //And checking if the inventory contains the itemID and the itemAmount.
                 print("Material: " + materials.Key + " Amount: " + materials.Value);
 
                 if (inventory.CheckForItemIDAndItemAmount(materials.Key, materials.Value))
                 {
                     //If inventory contains the itemID and itemAmount add blank item to the craftible list.
                     craftableItems.Add(new ItemTest());
                 }
             }
         }

The proplem is lets say I do have the 3 wood. it returns true and adds the blank item even though I don't have the 5 rocks. or vise versa Because its only checking for the materials one at a time and returning true.

 public bool CheckForItemIDAndItemAmount(int itemID, int itemAmount)
     {
         //Checks how many items are in the inventory
         for (int i = 0; i < inventoryItems.Count; i++)
         {
             //For every item in the inventory it checks the itemID and the itemAmount
             if (inventoryItems[i].item.itemID == itemID && inventoryItems[i].itemAmount >= itemAmount)
             {
                //So the inventory does contain the item and the right amount
                 return true;
             }
         }
         //The inventory either doesn't have that item or not enough of that item
         return false;
     }

So how could I check if the inventory contains all the materials and amounts before adding the blank item.

Comment
Add comment
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users

3 Replies

· Add your reply
  • Sort: 
avatar image
1
Best Answer

Answer by PizzaPie · Jan 22, 2017 at 03:26 PM

Something like that should work with the info you provide

 for (int i = 0; i < recipes.Count; i++)
         {
             
                 if (CheckRecipesMats(i))
                 {
                     //If inventory contains the itemID and itemAmount add blank item to the craftible list.
                     craftableItems.Add(new ItemTest());
                 }
             }
         }


 bool CheckRecipesMats(int recID)
     {
         foreach (KeyValuePair<int, int> materials in recipes[recID].materials)
         {
             print("Material: " + materials.Key + " Amount: " + materials.Value);
             
             if (!inventory.CheckForItemIDAndItemAmount(materials.Key, materials.Value))
             {
                 return false;       //Breaks the loop and returns false on the first missing item
             }
         }
         return true;    //Inventory Contains All
     }

All that does is Checkin all the materials in a single function (it uses your function CheckForItemIDAndItemAmount to do so) and if all are present it returns true if any of them missing it will break the loop and return false. Hope that helps. For clarifications ask away.

Comment
Add comment · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image
0

Answer by GarretLawrence · Jan 23, 2017 at 01:08 PM

 for (int i = 0; i < recipes.Count; i++)
 {
     bool flag = true;
     foreach (KeyValuePair<int, int> materials in recipes[i].materials)
     {
         print("Material: " + materials.Key + " Amount: " + materials.Value);
 
         if (!inventory.CheckForItemIDAndItemAmount(materials.Key, materials.Value))
         {
             flag = false;
         }
     }
     if (flag)
         craftableItems.Add(new ItemTest());
 }

Just use a flag variable.

If all materials are available then flag will remain true -> show item.

If missing one ore more then flag == false -> not show.

Comment
Add comment · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image
0

Answer by Sicmish · Jan 22, 2017 at 09:52 PM

Yeah, that fixed my propblem. I never thought that its was something so simple either.

Thank you. Thanks alot!!!

Comment
Add comment · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users

Your answer

Hint: You can notify a user about this post by typing @username

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this Question

Answers Answers and Comments

6 People are following this question.

avatar image avatar image avatar image avatar image avatar image avatar image

Related Questions

For Loop Outputting Double 0 Answers

How can i loop through stack and take a set number from each? 0 Answers

How to convert object types? 0 Answers

For loop not looping, Conditional break and return question? 0 Answers

How to display character in inventory? Please help 1 Answer


Enterprise
Social Q&A

Social
Subscribe on YouTube social-youtube Follow on LinkedIn social-linkedin Follow on Twitter social-twitter Follow on Facebook social-facebook Follow on Instagram social-instagram

Footer

  • Purchase
    • Products
    • Subscription
    • Asset Store
    • Unity Gear
    • Resellers
  • Education
    • Students
    • Educators
    • Certification
    • Learn
    • Center of Excellence
  • Download
    • Unity
    • Beta Program
  • Unity Labs
    • Labs
    • Publications
  • Resources
    • Learn platform
    • Community
    • Documentation
    • Unity QA
    • FAQ
    • Services Status
    • Connect
  • About Unity
    • About Us
    • Blog
    • Events
    • Careers
    • Contact
    • Press
    • Partners
    • Affiliates
    • Security
Copyright © 2020 Unity Technologies
  • Legal
  • Privacy Policy
  • Cookies
  • Do Not Sell My Personal Information
  • Cookies Settings
"Unity", Unity logos, and other Unity trademarks are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere (more info here). Other names or brands are trademarks of their respective owners.
  • Anonymous
  • Sign in
  • Create
  • Ask a question
  • Spaces
  • Default
  • Help Room
  • META
  • Moderators
  • Explore
  • Topics
  • Questions
  • Users
  • Badges