LHTC2007 Posted November 21, 2020 Share Posted November 21, 2020 So,I'm new to minecraft modding and I've been following Turty Wurty's modding tutorial to try to learn it. Right now, I'm stuck. I have made everything I think is the necessary for my custom kind of recipe to work, but it doesn't. I don't know if I missed something, but I appreciate your help. Here is my Recipe Class: Quote import com.LHTC2007.oreduping.init.RecipeSerializerInit; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.IRecipeSerializer; import net.minecraft.item.crafting.Ingredient; import net.minecraft.util.NonNullList; import net.minecraft.util.ResourceLocation; import net.minecraft.world.World; import net.minecraftforge.items.wrapper.RecipeWrapper; public class CrusherRecipe implements ICrusherRecipe{ private final ResourceLocation id; private Ingredient input; private final ItemStack output; public CrusherRecipe(ResourceLocation id, Ingredient input, ItemStack output) { this.id = id; this.output = output; this.input = input; } @Override public boolean matches(RecipeWrapper inv, World worldIn) { if (this.input.test(inv.getStackInSlot(0))) { return true; } return false; } @Override public ItemStack getCraftingResult(RecipeWrapper inv) { return this.output; } @Override public ItemStack getRecipeOutput() { return this.output; } @Override public ResourceLocation getId() { return this.id; } @Override public IRecipeSerializer<?> getSerializer() { return RecipeSerializerInit.CRUSHER_SERIALIZER.get(); } @Override public Ingredient getInput() { return this.input; } @Override public NonNullList<Ingredient> getIngredients() { return NonNullList.from(null, this.input); } } Here my IRecipe Class: Quote package com.LHTC2007.oreduping.recipes; import javax.annotation.Nonnull; import com.LHTC2007.oreduping.OreDupingMod; import net.minecraft.item.crafting.IRecipe; import net.minecraft.item.crafting.IRecipeType; import net.minecraft.item.crafting.Ingredient; import net.minecraft.util.ResourceLocation; import net.minecraft.util.registry.Registry; import net.minecraftforge.items.wrapper.RecipeWrapper; public interface ICrusherRecipe extends IRecipe<RecipeWrapper>{ ResourceLocation RECIPE_TYPE_ID = new ResourceLocation(OreDupingMod.MOD_ID, "crusher_recipe"); @Nonnull @Override default IRecipeType<?> getType() { return Registry.RECIPE_TYPE.getValue(RECIPE_TYPE_ID).get(); } @Override default boolean canFit(int width, int height) { return false; } Ingredient getInput(); } Here is my RecipeSerializer Class: Quote package com.LHTC2007.oreduping.recipes; import com.google.gson.JsonObject; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.IRecipeSerializer; import net.minecraft.item.crafting.Ingredient; import net.minecraft.network.PacketBuffer; import net.minecraft.util.JSONUtils; import net.minecraft.util.ResourceLocation; import net.minecraftforge.common.crafting.CraftingHelper; import net.minecraftforge.registries.ForgeRegistryEntry; public class CrusherRecipeSerializer extends ForgeRegistryEntry<IRecipeSerializer<?>> implements IRecipeSerializer<CrusherRecipe>{ @Override public CrusherRecipe read(ResourceLocation recipeId, JsonObject json) { ItemStack output = CraftingHelper.getItemStack(JSONUtils.getJsonObject(json, "output"), true); Ingredient input = Ingredient.deserialize(JSONUtils.getJsonObject(json, "input")); return new CrusherRecipe(recipeId, input, output); } @Override public CrusherRecipe read(ResourceLocation recipeId, PacketBuffer buffer) { ItemStack output = buffer.readItemStack(); Ingredient input = Ingredient.read(buffer); return new CrusherRecipe(recipeId, input, output); } @Override public void write(PacketBuffer buffer, CrusherRecipe recipe) { Ingredient input = recipe.getIngredients().get(0); input.write(buffer); buffer.writeItemStack(recipe.getRecipeOutput(), false); } } Now, about the Crusher Block (the one with the custom recipe): It's class: Quote package com.LHTC2007.oreduping.block_classes; import java.util.Random; import com.LHTC2007.oreduping.init.TileEntityTypesInit; import com.LHTC2007.oreduping.tileentities.CrusherTileEntity; import com.LHTC2007.oreduping.util.ItemHandler; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.item.ItemEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.inventory.container.Container; import net.minecraft.inventory.container.INamedContainerProvider; import net.minecraft.item.BlockItemUseContext; import net.minecraft.item.ItemStack; import net.minecraft.particles.ParticleTypes; import net.minecraft.state.BooleanProperty; import net.minecraft.state.DirectionProperty; import net.minecraft.state.StateContainer.Builder; import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ActionResultType; import net.minecraft.util.Direction; import net.minecraft.util.Hand; import net.minecraft.util.Mirror; import net.minecraft.util.Rotation; import net.minecraft.util.SoundCategory; import net.minecraft.util.SoundEvents; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockRayTraceResult; import net.minecraft.world.IBlockReader; import net.minecraft.world.World; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.fml.network.NetworkHooks; public class CrusherBlock extends Block{ public static final DirectionProperty FACING = BlockStateProperties.HORIZONTAL_FACING; public static final BooleanProperty ACTIVE = BooleanProperty.create("active"); public CrusherBlock(Block.Properties properties) { super(properties); } @Override public boolean hasTileEntity(BlockState state) { return true; } @Override public TileEntity createTileEntity(BlockState state, IBlockReader world) { return TileEntityTypesInit.CRUSHER.get().create(); } @Override protected void fillStateContainer(Builder<Block, BlockState> builder) { super.fillStateContainer(builder); builder.add(FACING, ACTIVE); } @Override public BlockState mirror(BlockState state, Mirror mirrorIn) { return state.rotate(mirrorIn.toRotation(state.get(FACING))); } @Override public BlockState rotate(BlockState state, Rotation rot) { return state.with(FACING, rot.rotate(state.get(FACING))); } @SuppressWarnings("deprecation") @Override public int getLightValue(BlockState state) { return state.get(ACTIVE) ? super.getLightValue(state) : 0; } @Override public BlockState getStateForPlacement(BlockItemUseContext context) { return this.getDefaultState().with(FACING, context.getPlacementHorizontalFacing().getOpposite()); } @Override public void onBlockPlacedBy(World worldIn, BlockPos pos, BlockState state, LivingEntity placer, ItemStack stack) { super.onBlockPlacedBy(worldIn, pos, state, placer, stack); if (stack.hasDisplayName()) { TileEntity tile = worldIn.getTileEntity(pos); if (tile instanceof CrusherTileEntity) { ((CrusherTileEntity) tile).setCustomName(stack.getDisplayName()); } } } @Override public boolean hasComparatorInputOverride(BlockState state) { return true; } @Override public int getComparatorInputOverride(BlockState blockState, World worldIn, BlockPos pos) { return Container.calcRedstone(worldIn.getTileEntity(pos)); } @Override @OnlyIn(Dist.CLIENT) public void animateTick(BlockState stateIn, World worldIn, BlockPos pos, Random rand) { if (stateIn.get(ACTIVE)) { double d0 = (double) pos.getX() + 0.5D; double d1 = (double) pos.getY(); double d2 = (double) pos.getZ() + 0.5D; if (rand.nextDouble() < 0.1D) { worldIn.playSound(d0, d1, d2, SoundEvents.BLOCK_FURNACE_FIRE_CRACKLE, SoundCategory.BLOCKS, 1.0F, 1.0F, false); } Direction direction = stateIn.get(FACING); Direction.Axis direction$axis = direction.getAxis(); double d4 = rand.nextDouble() * 0.6D - 0.3D; double d5 = direction$axis == Direction.Axis.X ? (double) direction.getXOffset() * 0.52D : d4; double d6 = rand.nextDouble() * 6.0D / 16.0D; double d7 = direction$axis == Direction.Axis.Z ? (double) direction.getZOffset() * 0.52D : d4; worldIn.addParticle(ParticleTypes.SMOKE, d0 + d5, d1 + d6, d2 + d7, 0.0D, 0.0D, 0.0D); worldIn.addParticle(ParticleTypes.FLAME, d0 + d5, d1 + d6, d2 + d7, 0.0D, 0.0D, 0.0D); } } @Override public ActionResultType onBlockActivated(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, BlockRayTraceResult hit) { if (worldIn != null && !worldIn.isRemote) { TileEntity tile = worldIn.getTileEntity(pos); if (tile instanceof CrusherTileEntity) { NetworkHooks.openGui((ServerPlayerEntity) player, (INamedContainerProvider) tile, pos); return ActionResultType.SUCCESS; } } return ActionResultType.SUCCESS; } @Override public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) { TileEntity tile = worldIn.getTileEntity(pos); if (tile instanceof CrusherTileEntity && state.getBlock() != newState.getBlock()) { CrusherTileEntity crusher = (CrusherTileEntity) tile; ((ItemHandler) crusher.getInventory()).toNonNullList().forEach(item -> { ItemEntity itemEntity = new ItemEntity(worldIn, pos.getX(), pos.getY(), pos.getZ(), item); worldIn.addEntity(itemEntity); }); } if (state.hasTileEntity() && state.getBlock() != newState.getBlock()) { worldIn.removeTileEntity(pos); } } } The Crusher Tile Entity: Quote package com.LHTC2007.oreduping.tileentities; import java.util.Collections; import java.util.HashSet; import java.util.Set; import java.util.stream.Collectors; import javax.annotation.Nullable; import com.LHTC2007.oreduping.OreDupingMod; import com.LHTC2007.oreduping.block_classes.CrusherBlock; import com.LHTC2007.oreduping.containers.CrusherContainer; import com.LHTC2007.oreduping.init.RecipeSerializerInit; import com.LHTC2007.oreduping.init.TileEntityTypesInit; import com.LHTC2007.oreduping.recipes.CrusherRecipe; import com.LHTC2007.oreduping.util.ItemHandler; import net.minecraft.client.Minecraft; import net.minecraft.client.world.ClientWorld; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.inventory.ItemStackHelper; import net.minecraft.inventory.container.Container; import net.minecraft.inventory.container.INamedContainerProvider; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.IRecipe; import net.minecraft.item.crafting.IRecipeType; import net.minecraft.item.crafting.Ingredient; import net.minecraft.nbt.CompoundNBT; import net.minecraft.network.NetworkManager; import net.minecraft.network.play.server.SUpdateTileEntityPacket; import net.minecraft.tileentity.ITickableTileEntity; import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; import net.minecraft.util.NonNullList; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TranslationTextComponent; import net.minecraft.world.World; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.util.Constants; import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandlerModifiable; import net.minecraftforge.items.wrapper.RecipeWrapper; public class CrusherTileEntity extends TileEntity implements ITickableTileEntity, INamedContainerProvider{ private ITextComponent customName; public int currentSmeltTime; public final int maxSmeltTime = 100; private ItemHandler inventory; public CrusherTileEntity(TileEntityType<?> tileEntityTypeIn) { super(tileEntityTypeIn); this.inventory = new ItemHandler(2); } public CrusherTileEntity() { this(TileEntityTypesInit.CRUSHER.get()); } @Override public Container createMenu(final int windowID, final PlayerInventory playerInv, final PlayerEntity playerIn) { return new CrusherContainer(windowID, playerInv, this); } @Override public void tick() { boolean dirty = false; if (this.world != null && !this.world.isRemote) { if (this.world.isBlockPowered(this.getPos())) { if (this.getRecipe(this.inventory.getStackInSlot(0)) != null) { if (this.currentSmeltTime != this.maxSmeltTime) { this.world.setBlockState(this.getPos(), this.getBlockState().with(CrusherBlock.ACTIVE, true)); this.currentSmeltTime++; dirty = true; } else { this.world.setBlockState(this.getPos(), this.getBlockState().with(CrusherBlock.ACTIVE, false)); this.currentSmeltTime = 0; ItemStack output = this.getRecipe(this.inventory.getStackInSlot(0)).getRecipeOutput(); this.inventory.insertItem(1, output.copy(), false); this.inventory.decrStackSize(0, 1); dirty = true; } } } } if (dirty) { this.markDirty(); this.world.notifyBlockUpdate(this.getPos(), this.getBlockState(), this.getBlockState(), Constants.BlockFlags.BLOCK_UPDATE); } } public void setCustomName(ITextComponent name) { this.customName = name; } public ITextComponent getName() { return this.customName != null ? this.customName : this.getDefaultName(); } private ITextComponent getDefaultName() { return new TranslationTextComponent("container." + OreDupingMod.MOD_ID + ".crusher"); } @Override public ITextComponent getDisplayName() { return this.getName(); } @Nullable public ITextComponent getCustomName() { return this.customName; } @Override public void read(CompoundNBT compound) { super.read(compound); if (compound.contains("CustomName", Constants.NBT.TAG_STRING)) { this.customName = ITextComponent.Serializer.fromJson(compound.getString("CustomName")); } NonNullList<ItemStack> inv = NonNullList.<ItemStack>withSize(this.inventory.getSlots(), ItemStack.EMPTY); ItemStackHelper.loadAllItems(compound, inv); this.inventory.setNonNullList(inv); this.currentSmeltTime = compound.getInt("CurrentSmeltTime"); } @Override public CompoundNBT write(CompoundNBT compound) { super.write(compound); if (this.customName != null) { compound.putString("CustomName", ITextComponent.Serializer.toJson(this.customName)); } ItemStackHelper.saveAllItems(compound, this.inventory.toNonNullList()); compound.putInt("CurrentSmeltTime", this.currentSmeltTime); return compound; } @Nullable private CrusherRecipe getRecipe(ItemStack stack) { if (stack == null) { return null; } Set<IRecipe<?>> recipes = findRecipesByType(RecipeSerializerInit.CRUSHER_TYPE, this.world); for (IRecipe<?> iRecipe : recipes) { CrusherRecipe recipe = (CrusherRecipe) iRecipe; if (recipe.matches(new RecipeWrapper(this.inventory), this.world)) { return recipe; } } return null; } public static Set<IRecipe<?>> findRecipesByType(IRecipeType<?> typeIn, World world) { return world != null ? world.getRecipeManager().getRecipes().stream() .filter(recipe -> recipe.getType() == typeIn).collect(Collectors.toSet()) : Collections.emptySet(); } @SuppressWarnings("resource") @OnlyIn(Dist.CLIENT) public static Set<IRecipe<?>> findRecipesByType(IRecipeType<?> typeIn) { ClientWorld world = Minecraft.getInstance().world; return world != null ? world.getRecipeManager().getRecipes().stream() .filter(recipe -> recipe.getType() == typeIn).collect(Collectors.toSet()) : Collections.emptySet(); } public static Set<ItemStack> getAllRecipeInputs(IRecipeType<?> typeIn, World worldIn) { Set<ItemStack> inputs = new HashSet<ItemStack>(); Set<IRecipe<?>> recipes = findRecipesByType(typeIn, worldIn); for (IRecipe<?> recipe : recipes) { NonNullList<Ingredient> ingredients = recipe.getIngredients(); ingredients.forEach(ingredient -> { for (ItemStack stack : ingredient.getMatchingStacks()) { inputs.add(stack); } }); } return inputs; } public final IItemHandlerModifiable getInventory() { return this.inventory; } @Nullable @Override public SUpdateTileEntityPacket getUpdatePacket() { CompoundNBT nbt = new CompoundNBT(); this.write(nbt); return new SUpdateTileEntityPacket(this.pos, 0, nbt); } @Override public void onDataPacket(NetworkManager net, SUpdateTileEntityPacket pkt) { this.read(pkt.getNbtCompound()); } @Override public CompoundNBT getUpdateTag() { CompoundNBT nbt = new CompoundNBT(); this.write(nbt); return nbt; } @Override public void handleUpdateTag(CompoundNBT nbt) { this.read(nbt); } @Override public <T> LazyOptional<T> getCapability(Capability<T> cap, Direction side) { return CapabilityItemHandler.ITEM_HANDLER_CAPABILITY.orEmpty(cap, LazyOptional.of(() -> this.inventory)); } } And the Crusher Container Class: Quote package com.LHTC2007.oreduping.containers; import java.util.Objects; import javax.annotation.Nonnull; import com.LHTC2007.oreduping.init.BlockInit; import com.LHTC2007.oreduping.init.ContainerTypesInit; import com.LHTC2007.oreduping.tileentities.CrusherTileEntity; import com.LHTC2007.oreduping.util.FunctionalIntReferenceHolder; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.inventory.container.Container; import net.minecraft.inventory.container.Slot; import net.minecraft.item.ItemStack; import net.minecraft.network.PacketBuffer; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.IWorldPosCallable; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.items.SlotItemHandler; public class CrusherContainer extends Container{ public CrusherTileEntity tileEntity; private IWorldPosCallable canInteractWithCallable; public FunctionalIntReferenceHolder currentSmeltTime; // Server Constructor public CrusherContainer(final int windowID, final PlayerInventory playerInv, final CrusherTileEntity tile) { super(ContainerTypesInit.CRUSHER_CONTAINER.get(), windowID); this.tileEntity = tile; this.canInteractWithCallable = IWorldPosCallable.of(tile.getWorld(), tile.getPos()); final int slotSizePlus2 = 18; final int startX = 8; // Hotbar int hotbarY = 142; for (int column = 0; column < 9; column++) { this.addSlot(new Slot(playerInv, column, startX + (column * slotSizePlus2), hotbarY)); } // Main Player Inventory final int startY = 84; for (int row = 0; row < 3; row++) { for (int column = 0; column < 9; column++) { this.addSlot(new Slot(playerInv, 9 + (row * 9) + column, startX + (column * slotSizePlus2), startY + (row * slotSizePlus2))); } } this.addSlot(new SlotItemHandler(tile.getInventory(), 0, 56, 34)); this.addSlot(new SlotItemHandler(tile.getInventory(), 1, 116, 35)); this.trackInt(currentSmeltTime = new FunctionalIntReferenceHolder(() -> this.tileEntity.currentSmeltTime, value -> this.tileEntity.currentSmeltTime = value)); } // Client Constructor public CrusherContainer(final int windowID, final PlayerInventory playerInv, final PacketBuffer data) { this(windowID, playerInv, getTileEntity(playerInv, data)); } private static CrusherTileEntity getTileEntity(final PlayerInventory playerInv, final PacketBuffer data) { Objects.requireNonNull(playerInv, "playerInv cannot be null"); Objects.requireNonNull(data, "data cannot be null"); final TileEntity tileAtPos = playerInv.player.world.getTileEntity(data.readBlockPos()); if (tileAtPos instanceof CrusherTileEntity) { return (CrusherTileEntity) tileAtPos; } throw new IllegalStateException("TileEntity is not correct " + tileAtPos); } @Override public boolean canInteractWith(PlayerEntity playerIn) { return isWithinUsableDistance(canInteractWithCallable, playerIn, BlockInit.CRUSHER.get()); } @Nonnull @Override public ItemStack transferStackInSlot(final PlayerEntity player, final int index) { ItemStack returnStack = ItemStack.EMPTY; final Slot slot = this.inventorySlots.get(index); if (slot != null && slot.getHasStack()) { final ItemStack slotStack = slot.getStack(); returnStack = slotStack.copy(); final int containerSlots = this.inventorySlots.size() - player.inventory.mainInventory.size(); if (index < containerSlots) { if (!mergeItemStack(slotStack, containerSlots, this.inventorySlots.size(), true)) { return ItemStack.EMPTY; } } else if (!mergeItemStack(slotStack, 0, containerSlots, false)) { return ItemStack.EMPTY; } if (slotStack.getCount() == 0) { slot.putStack(ItemStack.EMPTY); } else { slot.onSlotChanged(); } if (slotStack.getCount() == returnStack.getCount()) { return ItemStack.EMPTY; } slot.onTake(player, slotStack); } return returnStack; } @OnlyIn(Dist.CLIENT) public int getSmeltProgressionScaled() { return this.currentSmeltTime.get() != 0 && this.tileEntity.maxSmeltTime != 0 ? this.currentSmeltTime.get() * 24 / this.tileEntity.maxSmeltTime : 0; } } So, here is the recipe .json file that I'm trying to make work. It's location is at src/main/resources/data/oreduping/recipes/crusher_recipe Quote { "type": "oreduping:crusher_recipe", "output": { "item": "minecraft:nether_star" }, "input": { "item": "minecraft:gold_ore" } } Just for good measure, here is my main mod class: Quote package com.LHTC2007.oreduping; import net.minecraft.item.BlockItem; import net.minecraft.item.Item; import net.minecraft.item.ItemGroup; import net.minecraft.item.ItemStack; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.RegistryEvent; import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.RegistryObject; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod.EventBusSubscriber.Bus; import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.registries.IForgeRegistry; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import com.LHTC2007.oreduping.init.BlockInit; import com.LHTC2007.oreduping.init.ContainerTypesInit; import com.LHTC2007.oreduping.init.ItemInit; import com.LHTC2007.oreduping.init.RecipeSerializerInit; import com.LHTC2007.oreduping.init.TileEntityTypesInit; @Mod("oreduping") @Mod.EventBusSubscriber(modid = OreDupingMod.MOD_ID, bus = Bus.MOD) public class OreDupingMod { private static final Logger LOGGER = LogManager.getLogger(); public static final String MOD_ID = "oreduping"; public static OreDupingMod instance; public OreDupingMod() { final IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); modEventBus.addListener(this::setup); ItemInit.ITEMS.register(modEventBus); BlockInit.BLOCKS.register(modEventBus); TileEntityTypesInit.TILE_ENTITY_TYPES.register(modEventBus); RecipeSerializerInit.RECIPE_SERIALIZERS.register(modEventBus); ContainerTypesInit.CONTAINER_TYPES.register(modEventBus); instance = this; MinecraftForge.EVENT_BUS.register(this); } @SubscribeEvent public static void onRegisterItems(final RegistryEvent.Register<Item> event) { final IForgeRegistry<Item> registry = event.getRegistry(); BlockInit.BLOCKS.getEntries().stream().map(RegistryObject::get) .forEach(block -> { final Item.Properties properties = new Item.Properties().group(OreDupingTab.tab); final BlockItem blockItem = new BlockItem(block, properties); blockItem.setRegistryName(block.getRegistryName()); registry.register(blockItem); }); LOGGER.debug("BlockItems registered!!"); } private void setup(final FMLCommonSetupEvent event) { } public static final class OreDupingTab extends ItemGroup{ public static final ItemGroup tab = new OreDupingTab(ItemGroup.GROUPS.length, "oredupingtab"); private OreDupingTab(int index, String label) { super(index, label); } @Override public ItemStack createIcon() { return new ItemStack(ItemInit.IRON_POWDER.get()); } } } Once again, thanks for the help and patience. PS: I'm from Brazil, so I'm sorry if my English is bad. Quote Link to comment Share on other sites More sharing options...
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.