Jump to content

Recommended Posts

Posted

Goal: Add a custom enchantment to an enchantment book, place that enchanted book into a custom creative tab

 

I've tried a few different methods, but I finally gave in and came for help when trying to add it via fillItemGroup on the item. I'm probably doing everything wrong, but I'm solely working off of what I can find in the code base. The first attempt I tried to directly add the group through a new instance of EnchantmentBookItem and setting new properties. Second attempt grabbing the items creative tab and setting it, this caused an error (probably for a good reason). I've primarily been working on trying to find how the game adds them, but it's not easily found since it's not calling the ItemGroup's directly. I've traced ENCHANTED_BOOK back through every usage and didn't see anything, but I'm working on finding where they are added. I'm working through all the methods I find relevant right now. 

 

I'm guessing I'm not properly creating the EnchantmentBookItem, applying the enchantment and registering it (which happens to be everything). I'm looking for some guidance as where to go, a point in the right direction would be appreciated. I provided the latest log and debug log just as a safeguard. 

 

NOTE: This is never going public, it's a learning environment. So please point out anything that's a mess and could cause problems in the future if applicable.

 

 

ItemRegistry.java

package pooter.pot.pie.StompingGround.items;

import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.util.NonNullList;
import net.minecraftforge.event.RegistryEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;
import pooter.pot.pie.StompingGround.enchantment.ModEnchantmentsRegistry;
import pooter.pot.pie.StompingGround.inventory.StompingGroundItemGroup;

@Mod.EventBusSubscriber(modid="stompingground",bus=Mod.EventBusSubscriber.Bus.MOD)
public class ItemRegistry {

    @SubscribeEvent
    public static void registerItems(RegistryEvent.Register<Item> event) {
        ItemStack enchantedBook = new ItemStack(Items.ENCHANTED_BOOK);
        enchantedBook.addEnchantment(ModEnchantmentsRegistry.CONCUSSIVEINATOR,1);

        NonNullList<ItemStack> itemStackList = NonNullList.create();
        itemStackList.add(enchantedBook);

        enchantedBook.getItem().fillItemGroup(StompingGroundItemGroup.STOMPING_GROUND,itemStackList);
        event.getRegistry().registerAll(enchantedBook.getItem());
    }
}

 

StompingGroundItemGroup.java

package pooter.pot.pie.StompingGround.inventory;

import net.minecraft.item.ItemGroup;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import pooter.pot.pie.StompingGround.StompingGround;

import java.util.function.Supplier;

public class StompingGroundItemGroup extends ItemGroup {

    public final Supplier<ItemStack> iconSupplier;
    public static final ItemGroup STOMPING_GROUND = new StompingGroundItemGroup(StompingGround.MODID,()->new ItemStack(Items.CAMPFIRE));

    public StompingGroundItemGroup(String name, Supplier<ItemStack> supplier){
        super(name);
        this.iconSupplier = supplier;
        this.setTabPath("stomping_ground");
    }

    @Override
    public ItemStack createIcon(){
        return iconSupplier.get();
    }

}

 

Debug Log: https://gist.github.com/johnslw26/5a0217bb989490b062826a520543f6b6

latest.log

Posted (edited)
1 hour ago, hoodzeay said:

enchantedBook.getItem().fillItemGroup(StompingGroundItemGroup.STOMPING_GROUND,itemStackList);

This doesn't do what you seem to think it does.

 

Especially not when you do this afterwards:

  

1 hour ago, hoodzeay said:

event.getRegistry().registerAll(enchantedBook.getItem());

 

Edited by Draco18s

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.

Posted

I have figured out how the fillItemGroup method works. I've iterated through all the ItemGroup.SEARCH ItemStack's and found my two by comparing the id to my resource path. I feel like I'm over complicating this. New files are below, had an issue where the two enchantments didn't exist yet so I moved them to the class that registers the enchantments. I thought I could just copy the ItemStack and add the ItemGroup in to it's properties but I was wrong. Mind pushing me in the right direction again?

 

package pooter.pot.pie.StompingGround.enchantment;

import net.minecraft.enchantment.Enchantment;
import net.minecraft.item.ItemGroup;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.nbt.INBT;
import net.minecraft.util.NonNullList;
import net.minecraftforge.event.RegistryEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;

@Mod.EventBusSubscriber(bus=Mod.EventBusSubscriber.Bus.MOD)
public class ModEnchantmentsRegistry {
    public static final SwinglineInator SWINGLINEINATOR = new SwinglineInator();
    public static final ConcussiveInator CONCUSSIVEINATOR = new ConcussiveInator();

    @SubscribeEvent
    public static void registerEnchantment(RegistryEvent.Register<Enchantment> event){
        event.getRegistry().registerAll(SWINGLINEINATOR,CONCUSSIVEINATOR);

        NonNullList<ItemStack> enchantedBooks = NonNullList.create();
        Items.ENCHANTED_BOOK.fillItemGroup(ItemGroup.SEARCH, enchantedBooks);

        for (ItemStack enchantedBook : enchantedBooks) {
            if(getStoredEnchantment(enchantedBook).getString() == ModEnchantmentsRegistry.CONCUSSIVEINATOR.getRegistryName().toString()){
                ItemStack enchantedBookCopy = enchantedBook.copy();
            }
        }
    }

    /**
     * Return the enchantment id from the StoredEnchantments tag
     * @param itemstack
     * @return
     */
    public static INBT getStoredEnchantment(ItemStack itemstack){
        return !itemstack.getTag().isEmpty() ? itemstack.getTag().getList("StoredEnchantments",10).getCompound(0).get("id") : itemstack.getOrCreateTag();
    }
}

 

Posted

I appreciate the help, It has been a few years since I’ve worked with Java. Should have known to use .equals instead of comparing object references and apologies for bringing basic Java errors in. I’ll try this out and hopefully I can call this solved.

Posted

Solely for clarification regarding the first point, I should be using a single class to handle all of the registry events. Is that what's meant by

Quote

Do not create registry entries in static initializers.

 

I've looked through a few of your previous posts mentioning this and one corrected the issue, but some mods were not updated. The diff looks like that's the solution. 

Posted
package pooter.pot.pie.StompingGround.enchantment;

import net.minecraft.enchantment.Enchantment;
import net.minecraft.item.ItemGroup;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.nbt.INBT;
import net.minecraft.util.NonNullList;
import net.minecraftforge.event.RegistryEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;

@Mod.EventBusSubscriber(bus=Mod.EventBusSubscriber.Bus.MOD)
public class ModEnchantmentsRegistry {


    @SubscribeEvent
    public static void registerEnchantment(RegistryEvent.Register<Enchantment> event){
        SwinglineInator SWINGLINEINATOR = new SwinglineInator();
        ConcussiveInator CONCUSSIVEINATOR = new ConcussiveInator();
        
        event.getRegistry().registerAll(SWINGLINEINATOR,CONCUSSIVEINATOR);

        NonNullList<ItemStack> enchantedBooks = NonNullList.create();
        Items.ENCHANTED_BOOK.fillItemGroup(ItemGroup.SEARCH, enchantedBooks);

        for (ItemStack enchantedBook : enchantedBooks) {
            if(getStoredEnchantment(enchantedBook).getString() == CONCUSSIVEINATOR.getRegistryName().toString()){
                ItemStack enchantedBookCopy = enchantedBook.copy();
            }
        }
    }

    /**
     * Return the enchantment id from the StoredEnchantments tag
     * @param itemstack
     * @return
     */
    public static INBT getStoredEnchantment(ItemStack itemstack){
        return !itemstack.getTag().isEmpty() ? itemstack.getTag().getList("StoredEnchantments",10).getCompound(0).get("id") : itemstack.getOrCreateTag();
    }
}

 

I moved the following inside the registerEnchantment event so the two enchantments are no longer a static variable:

 

public static final SwinglineInator SWINGLINEINATOR = new SwinglineInator();
public static final ConcussiveInator CONCUSSIVEINATOR = new ConcussiveInator();

 

Is this what's meant then? My main purpose with this is to improve my skills, so please pardon my ignorance. I understand many here answer these questions multiple times a day, but it's not mentioned. I've researched what a static initializer is and the explanation from oracle confused me with this application.

Posted
3 hours ago, hoodzeay said:

        for (ItemStack enchantedBook : enchantedBooks) {
            if(getStoredEnchantment(enchantedBook).getString() == CONCUSSIVEINATOR.getRegistryName().toString()){
                ItemStack enchantedBookCopy = enchantedBook.copy();
            }
        }

This code does actively nothing.

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.

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.