Jump to content

[1.11][SOLVED] Dual Input Recipes Issue


Lambda

Recommended Posts

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?

Relatively new to modding.

Currently developing:

https://github.com/LambdaXV/DynamicGenerators

Link to comment
Share on other sites

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();

Relatively new to modding.

Currently developing:

https://github.com/LambdaXV/DynamicGenerators

Link to comment
Share on other sites

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();

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.

Link to comment
Share on other sites

Ah, yes, a list that way. I was more focused on writing a proper "wrapper" around the three ingredients.

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.

Link to comment
Share on other sites

How would I handle the hashcode + equals functions?

 

this.item1 == that.item1 && this.item2 == that.item2, etc.

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.

Link to comment
Share on other sites

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.

Relatively new to modding.

Currently developing:

https://github.com/LambdaXV/DynamicGenerators

Link to comment
Share on other sites

"other.item1 == this.item1" was not meant to be used literally. You can't compare ItemStacks that way

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.

Link to comment
Share on other sites

Well, if you want Blue Carpet and Blue Wool to be considered the same...

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.

Link to comment
Share on other sites

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.

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/

Link to comment
Share on other sites

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.

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.

Link to comment
Share on other sites

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)));
    }

Relatively new to modding.

Currently developing:

https://github.com/LambdaXV/DynamicGenerators

Link to comment
Share on other sites

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)
    {
        
    }

Relatively new to modding.

Currently developing:

https://github.com/LambdaXV/DynamicGenerators

Link to comment
Share on other sites

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.

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.

Link to comment
Share on other sites

however,

 

dualList.add(//adding an itemstack or ....

You created a wrapper for a reason.

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.

Link to comment
Share on other sites

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

?

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.

Link to comment
Share on other sites

:blank:

 

    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:

 

 

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;
    }
}

 

 

 

 

Relatively new to modding.

Currently developing:

https://github.com/LambdaXV/DynamicGenerators

Link to comment
Share on other sites

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.

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.

Link to comment
Share on other sites

:blank:

 

    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.

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.

Link to comment
Share on other sites

    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?

Relatively new to modding.

Currently developing:

https://github.com/LambdaXV/DynamicGenerators

Link to comment
Share on other sites

Your input is two itemstacks, then yes, you need to make your wrapper a 2-stack object.

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.

Link to comment
Share on other sites

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.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.