Lambda Posted November 29, 2016 Posted November 29, 2016 Hello, So I recently started rewrite the Dual Input frunace from previous post. My issue is however, is creating a map that can store all 3 ItemStacks.. I know I have 2 options: - A Wrapper - Itteration However, I dont really know how to create a Wrapper and apply it to the class, and I dont know how to iterate through the ItemStacks. Any tips? Quote Relatively new to modding. Currently developing: https://github.com/LambdaXV/DynamicGenerators
Lambda Posted November 29, 2016 Author Posted November 29, 2016 Okay, I'm having 'good' progress so far: I now have the wrapper class that will hopefully will handle the ItemStacks. package com.lambda.plentifulmisc.recipe; import net.minecraft.item.ItemStack; /** * Created by Blake on 11/29/2016. */ public class InscriberWrapper { public final ItemStack item; public InscriberWrapper(ItemStack first, ItemStack i) { item = i; } @Override public int hashCode() { return 37*item.getItem().hashCode() + item.getMetadata(); } @Override public boolean equals(Object o) { if(o instanceof InscriberWrapper) { InscriberWrapper other = (InscriberWrapper)o; return other.item == this.item && (other.item.getMetadata() == -1 || this.item.getMetadata() == -1 || other.item.getMetadata() == this.item.getMetadata()); } return false; } } Also, I have some progress in the recipes, but here is where I'm stuck, comparing the Items: public void getResult(ItemStack stack) { for(Map.Entry<List<InscriberWrapper>, ItemStack> entry : this.dualList.entrySet()) { if(ItemUtil.areItemsEqual(stack, entry.getKey()) { // Here, I know why, but I dont know how'd I do this } } } ItemUtil#areItemsEqual method is a simple comparison using the item &metadata. Here is the Hash: private Map<List<InscriberWrapper>, ItemStack> dualList = new HashMap(); Quote Relatively new to modding. Currently developing: https://github.com/LambdaXV/DynamicGenerators
Draco18s Posted November 29, 2016 Posted November 29, 2016 Uh...? public class InscriberWrapper { public final ItemStack item1; public final ItemStack item2; public final ItemStack item3; public InscriberWrapper(ItemStack first, ItemStack second, ItemStack third) { item1 = first; item2 = second; item3 = third; } ... private Map<InscriberWrapper, ItemStack> dualList = new HashMap(); Quote Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable. If you think this is the case, JUST REPORT ME. Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice. Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked. DO NOT PM ME WITH PROBLEMS. No help will be given.
Draco18s Posted November 29, 2016 Posted November 29, 2016 Ah, yes, a list that way. I was more focused on writing a proper "wrapper" around the three ingredients. Quote Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable. If you think this is the case, JUST REPORT ME. Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice. Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked. DO NOT PM ME WITH PROBLEMS. No help will be given.
Lambda Posted November 29, 2016 Author Posted November 29, 2016 How would I handle the hashcode + equals functions? This should work right?: private List<InscriberWrapper> dualList = new ArrayList<InscriberWrapper>(); Quote Relatively new to modding. Currently developing: https://github.com/LambdaXV/DynamicGenerators
Draco18s Posted November 29, 2016 Posted November 29, 2016 On 11/29/2016 at 10:25 PM, Lambda said: How would I handle the hashcode + equals functions? this.item1 == that.item1 && this.item2 == that.item2, etc. Quote Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable. If you think this is the case, JUST REPORT ME. Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice. Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked. DO NOT PM ME WITH PROBLEMS. No help will be given.
Lambda Posted November 29, 2016 Author Posted November 29, 2016 Okay, how bout the hashcode? or would I not need that due to using an ArrayList instead? return other.item1 == this.item1 && (other.item1.getMetadata() == -1 || this.item1.getMetadata() == -1 || other.item1.getMetadata() == this.item1.getMetadata()) && other.item2 == this.item2 &&(other.item2.getMetadata() == -1 || this.item2.getMetadata() == -1 || other.item2.getMetadata() == this.item2.getMetadata()) && other.item3 == this.item3 &&(other.item3.getMetadata() == -1 || this.item3.getMetadata() == -1 || other.item3.getMetadata() == this.item3.getMetadata()); This is what equals returns now. Quote Relatively new to modding. Currently developing: https://github.com/LambdaXV/DynamicGenerators
Draco18s Posted November 29, 2016 Posted November 29, 2016 "other.item1 == this.item1" was not meant to be used literally. You can't compare ItemStacks that way Quote Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable. If you think this is the case, JUST REPORT ME. Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice. Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked. DO NOT PM ME WITH PROBLEMS. No help will be given.
Lambda Posted November 29, 2016 Author Posted November 29, 2016 Yeah I somewhat knew that when writing, so I'm guessing just compare the metadatas? or is there a more effient way. Quote Relatively new to modding. Currently developing: https://github.com/LambdaXV/DynamicGenerators
Draco18s Posted November 29, 2016 Posted November 29, 2016 Well, if you want Blue Carpet and Blue Wool to be considered the same... Quote Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable. If you think this is the case, JUST REPORT ME. Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice. Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked. DO NOT PM ME WITH PROBLEMS. No help will be given.
Lambda Posted November 29, 2016 Author Posted November 29, 2016 Oh, well thats exactly what I dont want... So is this how'd I do it: other.item1.getItem() == this.item1.getItem(); Quote Relatively new to modding. Currently developing: https://github.com/LambdaXV/DynamicGenerators
larsgerrits Posted November 29, 2016 Posted November 29, 2016 Well, only if you want red wool and blue wool to be considered the same... You have to check both the Item and the metadata. Quote Don't PM me with questions. They will be ignored! Make a thread on the appropriate board for support. 1.12 -> 1.13 primer by williewillus. 1.7.10 and older versions of Minecraft are no longer supported due to it's age! Update to the latest version for support. http://www.howoldisminecraft1710.today/
Choonster Posted November 29, 2016 Posted November 29, 2016 Use ItemStack#isItemEqual or ItemStack.areItemsEqual to check if the Item and metadata of the two ItemStack s are equal. Use ItemStack.areItemStacksEqual to check if the Item , metadata and NBT of the two ItemStack s are equal. Quote Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.
Lambda Posted November 30, 2016 Author Posted November 30, 2016 here is the hash my IDE created. @Override public int hashCode() { int result = item1 != null ? item1.hashCode() : 0; result = 31 * result + (item2 != null ? item2.hashCode() : 0); result = 31 * result + (item3 != null ? item3.hashCode() : 0); return result; } Aswell, here is the updated equals: return ItemUtil.areItemsEqual(other.item1, this.item2, true) && ItemUtil.areItemsEqual(other.item2, this.item2, true) && ItemUtil.areItemsEqual(other.item1, this.item3, true); areItemsEqual: public static boolean areItemsEqual(ItemStack stack1, ItemStack stack2, boolean checkWildcard){ return StackUtil.isValid(stack1) && StackUtil.isValid(stack2) && (stack1.isItemEqual(stack2) || (checkWildcard && stack1.getItem() == stack2.getItem() && (stack1.getItemDamage() == UtilBase.WILDCARD || stack2.getItemDamage() == UtilBase.WILDCARD))); } Quote Relatively new to modding. Currently developing: https://github.com/LambdaXV/DynamicGenerators
Lambda Posted November 30, 2016 Author Posted November 30, 2016 Okay I belive these are correct now.. So would I just iterate like I do with regular lists, and get the result? Or is there something else? Quote Relatively new to modding. Currently developing: https://github.com/LambdaXV/DynamicGenerators
Lambda Posted November 30, 2016 Author Posted November 30, 2016 Okay futher progress: getResult has been finished I belive: public InscriberWrapper getResult(ItemStack input, ItemStack inputSecond) { for(InscriberWrapper recipe : dualList) { if(ItemUtil.areItemsEqual(recipe.item1, stack, true) && ItemUtil.areItemsEqual(recipe.item2, inputSecond, true)) { return recipe; } } return null; } however, addDualListRecipes is confusing me a bit, how would I 'put' ItemStacks into the ArrayList public void addDualRecipes(ItemStack input, ItemStack inputSecond, ItemStack output) { } Quote Relatively new to modding. Currently developing: https://github.com/LambdaXV/DynamicGenerators
Animefan8888 Posted November 30, 2016 Posted November 30, 2016 On 11/30/2016 at 2:25 AM, Lambda said: Okay futher progress: getResult has been finished I belive: public InscriberWrapper getResult(ItemStack input, ItemStack inputSecond) { for(InscriberWrapper recipe : dualList) { if(ItemUtil.areItemsEqual(recipe.item1, stack, true) && ItemUtil.areItemsEqual(recipe.item2, inputSecond, true)) { return recipe; } } return null; } however, addDualListRecipes is confusing me a bit, how would I 'put' ItemStacks into the ArrayList public void addDualRecipes(ItemStack input, ItemStack inputSecond, ItemStack output) { } Add a new entry to your list. Quote VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect. Forge and vanilla BlockState generator.
Lambda Posted November 30, 2016 Author Posted November 30, 2016 however, dualList.add(//adding an itemstack or .... Quote Relatively new to modding. Currently developing: https://github.com/LambdaXV/DynamicGenerators
Animefan8888 Posted November 30, 2016 Posted November 30, 2016 On 11/30/2016 at 2:33 AM, Lambda said: however, dualList.add(//adding an itemstack or .... You created a wrapper for a reason. Quote VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect. Forge and vanilla BlockState generator.
Choonster Posted November 30, 2016 Posted November 30, 2016 ItemStack doesn't override Object#hashCode , so two ItemStack s will only have the same hash code if they're the same object. You shouldn't actually need to override Object#hashCode if your recipe class isn't being used as the key of a HashMap . If you do override it, you need to generate your own hash code for each ItemStack based on the parts your recipe cares about ( Item , metadata, NBT and/or capabilities). Are you sure your updated equals method is correct? You're comparing item1 and item2 , item2 and item2 and item1 and item3 . Should you not be comparing item1 and item1 , item2 and item2 , item3 and item3 ? Quote Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.
Lambda Posted November 30, 2016 Author Posted November 30, 2016 public void addDualRecipes(InscriberWrapper input, InscriberWrapper inputSecond) { dualList.add(input); dualList.add(inputSecond); } So this then :? and Choonster: (Quotes got screwed up) Yeah, I updated them.. saw that after I posted it and forgot to edit and Yes, I'm using an ArrayList to store my ItemStacks now. So I would not need the HashMap key correct? here is the entire class for reference: Reveal hidden contents package com.lambda.plentifulmisc.recipe; import com.google.common.collect.Maps; import com.lambda.plentifulmisc.items.InitItems; import com.lambda.plentifulmisc.util.ItemUtil; import com.lambda.plentifulmisc.util.StackUtil; import net.minecraft.block.Block; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * Created by Blake on 11/28/2016. */ public class InscriberRecipes { private static final InscriberRecipes SMELTING_BASE = new InscriberRecipes(); private final Map<ItemStack, ItemStack> smeltingList = Maps.<ItemStack, ItemStack>newHashMap(); private List<InscriberWrapper> dualList = new ArrayList<InscriberWrapper>(); private final Map<ItemStack, Float> experienceList = Maps.<ItemStack, Float>newHashMap(); private final int recipeStart = dualList.size(); /** * Returns an instance of FurnaceRecipes. */ public static InscriberRecipes instance() { return SMELTING_BASE; } private InscriberRecipes() { // this.addSmeltingRecipeForBlock(Blocks.IRON_ORE, new ItemStack(Items.IRON_INGOT), 0.7F); this.addSmelting(InitItems.item_infused_celestrium_plate, new ItemStack(InitItems.item_refined_celestrium_plate), 0.55F); this.addSmelting(InitItems.item_celestrium_ingot, new ItemStack(InitItems.item_refined_celestrium), .55f); this.addSmelting(InitItems.item_rubber, new ItemStack(InitItems.item_organic_material), .55f); } /** * Adds a smelting recipe, where the input item is an instance of Block. */ public void addSmeltingRecipeForBlock(Block input, ItemStack stack, float experience) { this.addSmelting(Item.getItemFromBlock(input), stack, experience); } public void addDualRecipes(Item inputFirst, Item inputSecond, ItemStack output) { } /** * Adds a smelting recipe using an Item as the input item. */ public void addSmelting(Item input, ItemStack stack, float experience) { this.addSmeltingRecipe(new ItemStack(input, 1, 32767), stack, experience); } /** * Adds a smelting recipe using an ItemStack as the input for the recipe. */ public void addSmeltingRecipe(ItemStack input, ItemStack stack, float experience) { if (getSmeltingResult(input) != ItemStack.field_190927_a) { net.minecraftforge.fml.common.FMLLog.info("Ignored smelting recipe with conflicting input: " + input + " = " + stack); return; } this.smeltingList.put(input, stack); this.experienceList.put(stack, Float.valueOf(experience)); } public void addDualRecipes(InscriberWrapper input, InscriberWrapper inputSecond) { dualList.add(input); dualList.add(inputSecond); } public InscriberWrapper getResult(ItemStack input, ItemStack inputSecond) { for(InscriberWrapper recipe : dualList) { if(ItemUtil.areItemsEqual(recipe.item1, input, true) && ItemUtil.areItemsEqual(recipe.item2, inputSecond, true)) { return recipe; } } return null; } /** * Returns the smelting result of an item. */ public ItemStack getSmeltingResult(ItemStack stack) { for (Map.Entry<ItemStack, ItemStack> entry : this.smeltingList.entrySet()) { if (this.compareItemStacks(stack, (ItemStack)entry.getKey())) { return (ItemStack)entry.getValue(); } } return ItemStack.field_190927_a; } /** * Compares two itemstacks to ensure that they are the same. This checks both the item and the metadata of the item. */ private boolean compareItemStacks(ItemStack stack1, ItemStack stack2) { return stack2.getItem() == stack1.getItem() && (stack2.getMetadata() == 32767 || stack2.getMetadata() == stack1.getMetadata()); } public Map<ItemStack, ItemStack> getSmeltingList() { return this.smeltingList; } public List<InscriberWrapper> getDualList() { return this.dualList;} public float getSmeltingExperience(ItemStack stack) { float ret = stack.getItem().getSmeltingExperience(stack); if (ret != -1) return ret; for (Map.Entry<ItemStack, Float> entry : this.experienceList.entrySet()) { if (this.compareItemStacks(stack, (ItemStack)entry.getKey())) { return ((Float)entry.getValue()).floatValue(); } } return 0.0F; } } Quote Relatively new to modding. Currently developing: https://github.com/LambdaXV/DynamicGenerators
Draco18s Posted November 30, 2016 Posted November 30, 2016 Your experienceList is also probably not going to work (it's a map and ItemStack does not override equals or hashcode, making it a bad class to use as a key). public void addDualRecipes(InscriberWrapper input, InscriberWrapper inputSecond) { dualList.add(input); dualList.add(inputSecond); } For fuck's sake. Your "add recipe" method should take ItemStacks and you wrap them in the wrapper then add that wrapper to the list. Quote Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable. If you think this is the case, JUST REPORT ME. Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice. Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked. DO NOT PM ME WITH PROBLEMS. No help will be given.
Animefan8888 Posted November 30, 2016 Posted November 30, 2016 On 11/30/2016 at 2:41 AM, Lambda said: public void addDualRecipes(InscriberWrapper input, InscriberWrapper inputSecond) { dualList.add(input); dualList.add(inputSecond); } So this then :? No keep the ItemStacks add a new instance to your list, your list should ask for your wrapper. Quote VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect. Forge and vanilla BlockState generator.
Lambda Posted November 30, 2016 Author Posted November 30, 2016 public void addDualRecipes(ItemStack input, ItemStack inputSecond, ItemStack output) { dualList.add(new InscriberWrapper(input, inputSecond, output)); } Ah! So that should work now! Is everything else 'ok', because all I have to do now is integrate it into my TE. Note: Should I remove the output ItemStack? Quote Relatively new to modding. Currently developing: https://github.com/LambdaXV/DynamicGenerators
Draco18s Posted November 30, 2016 Posted November 30, 2016 Your input is two itemstacks, then yes, you need to make your wrapper a 2-stack object. Quote Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable. If you think this is the case, JUST REPORT ME. Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice. Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked. DO NOT PM ME WITH PROBLEMS. No help will be given.
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.