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.



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • Losing a significant amount of money to scammers can be a bizarre experience that leaves you feeling helpless and betrayed. This was the situation I found myself in after investing over a hundred thousand dollars in a crypto platform that turned out to be a scam. I was introduced to this platform by a friend of my cousin, and everything seemed legitimate until it was too late for me to realize that I had been duped. The days following the realization of my loss were some of the darkest I have ever experienced. I was consumed by feelings of depression and desperation as I tried everything in my power to retrieve my hard-earned money. I reached out to various authorities and sought advice from friends and family, but it seemed like there was no way to recover what I had lost. It was during this time that a friend mentioned a platform called Wizard Web Recovery that specialized in recovering funds lost to scams. At first, I was skeptical and hesitant to trust another company with my money, but I was running out of options and decided to give them a chance. Looking back, this decision turned out to be the best one I could have made. From the moment I contacted Wizard Web Recovery, I was impressed by their dedication to helping me recover my funds. Their team of experts guided me through the process step by step, explaining each stage clearly and answering all of my questions along the way. They kept me informed of their progress and worked tirelessly to ensure that my case was given the attention it deserved. I was amazed at how quickly Wizard Web Recovery was able to track down the scammers and retrieve my money. Within a relatively short period, I received the news that my funds had been successfully recovered, and I couldn't believe it. It felt like a weight had been lifted off my shoulders, and I was filled with gratitude for the team at Wizard Web Recovery who had made it possible.    
    • my game crashed and I have no idea why here is a link to the pastebin of the crash https://pastebin.com/vv89r9vC
    • ok apparently the issue is even stupider than that. the folder the server was in was called "𝓯𝓻𝓮𝓪𝓴𝔂 server" and apparently the special characters in the folder name break the whole damn thing. this is the stupidest thing in the history of ever
    • Thanks, but now I have the 3d model in hand (and in inventory bcz I won't need that anymore) but now when I try to throw it, it doesnt rotate and its just the end of the trident not the head part. Edit: I removed the 3d custom model. I use the original minecraft files. Json and etc. In minecraft the rendering is made in code. I sent the code in the first message. I have mostly the code. But I don't know how to register the renderers like minecraft do. For example, in minecraft there are 2 jsons: trident_in_hand and trident_throwing , I have both of them. They don't render while I have the item in hand. That's the main problem. I checked the code but I still can't figure out how to register and render the entity basically, in hand
  • Topics

×
×
  • Create New...

Important Information

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