Jump to content
View in the app

A better way to browse. Learn more.

Forge Forums

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Featured Replies

Posted

So i was trying adding the smelting enchant on the pickaxe, using the CraftPlusPlus code, but is not working. This is the first time i try adding an enchant, so i don't know nothing about them. I've also tried looking into other enchantments classes, like silk touch, but there is no code of the tool behavior on that enchant.

At the moment i'm using this as a base class for all the custom enchantments

package com.mineworld.core;

import java.util.List;
import java.util.OptionalInt;
import java.util.stream.IntStream;

import com.google.common.collect.Lists;
import com.mineworld.MW;

import net.minecraft.client.resources.I18n;
import net.minecraft.enchantment.Enchantment;
import net.minecraft.enchantment.EnchantmentHelper;
import net.minecraft.enchantment.EnumEnchantmentType;
import net.minecraft.entity.Entity;
import net.minecraft.inventory.EntityEquipmentSlot;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.fml.common.eventhandler.Event;
import net.minecraftforge.fml.common.registry.GameRegistry;

public abstract class MWEnchantment extends Enchantment {
/**
 * A list of all of Craft++'s enchantments
 */
public static List<MWEnchantment> Enchantments = Lists.newArrayList();

protected MWEnchantment(String name, Enchantment.Rarity rarityIn, EnumEnchantmentType typeIn, EntityEquipmentSlot... slots) {
	super(rarityIn, typeIn, slots);
	this.setName(name);
	Enchantment.REGISTRY.register(findFreeEnchantmentID(name), new ResourceLocation(MW.MODID + ":" + name), this);
	Enchantments.add(this);
}

/**
 * Finds the first free enchantment ID to register this enchantment
 *
 * @param enchantmentName the name of the enchantment
 * @return The enchantment ID for this enchantment to use
 */
private static int findFreeEnchantmentID(String enchantmentName) {
	OptionalInt freeEnchantmentID = IntStream.range(0, 256).filter(i -> Enchantment.getEnchantmentByID(i) == null).findFirst();
	if (!freeEnchantmentID.isPresent())
		throw new NoFreeEnchantmentIDException(enchantmentName);
	return freeEnchantmentID.getAsInt();
}

@Override
public boolean isAllowedOnBooks() {
	return true;
}

/**
 * Gets the enchantment level of this enchantment on the specified ItemStack
 *
 * @param itemstack The ItemStack to check
 * @return The enchantment level of this enchantment on the ItemStack
 */
protected int getEnchantmentLevel(ItemStack itemstack) {
	return EnchantmentHelper.getEnchantmentLevel(this, itemstack);
}

@Override
public int getMinEnchantability(int enchantmentLevel) {
	return getMinimumEnchantability(enchantmentLevel);
}

@Override
public int getMaxEnchantability(int enchantmentLevel) {
	return getMaximumEnchantability(enchantmentLevel);
}

/**
 * Performs the action this enchantment does
 *
 * @param entity    The entity to go along with the enchantment
 * @param baseEvent The event to go along with the enchantment
 */
public abstract void performAction(Entity entity, Event baseEvent);

public abstract int getMinimumEnchantability(int enchantmentLevel);

public abstract int getMaximumEnchantability(int enchantmentLevel);

private static class NoFreeEnchantmentIDException extends RuntimeException {
	private NoFreeEnchantmentIDException(String enchantmentName) {
		super("Could not find a free enchantment ID for " + I18n.format("enchantment." + enchantmentName));
	}
}
}

 

And this as the class of the smelting enchant

package com.mineworld.enchantments;

import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Random;

import com.mineworld.core.MWEnchantment;

import net.minecraft.enchantment.EnumEnchantmentType;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.inventory.EntityEquipmentSlot;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.FurnaceRecipes;
import net.minecraftforge.event.world.BlockEvent.HarvestDropsEvent;
import net.minecraftforge.fml.common.eventhandler.Event;

public class EnchantmentSmelting extends MWEnchantment {

public EnchantmentSmelting() {
	super("smelting", Rarity.UNCOMMON, EnumEnchantmentType.DIGGER,new EntityEquipmentSlot[]{EntityEquipmentSlot.MAINHAND, EntityEquipmentSlot.OFFHAND});
}


@Override
public int getMaxLevel() {
	return 1;
}

@Override
public String getName() {
	return "enchantment.smelting.name";
}

@Override
public boolean canApplyAtEnchantingTable(ItemStack stack) {
	return true;
}

@Override
public boolean isAllowedOnBooks() {
	return true;
}

@Override
public void performAction(Entity entity, Event baseEvent) {
	if (entity != null && this.getEnchantmentLevel(((EntityLivingBase) entity).getHeldItemMainhand()) > 0) {
		HarvestDropsEvent event = (HarvestDropsEvent) baseEvent;
		List<ItemStack> drops = event.getDrops();
		List<ItemStack> dropsCopy = this.copyList(drops);
		drops.clear();
		for (ItemStack drop : dropsCopy)
			if (drop != null) {
				ItemStack smeltingResult = FurnaceRecipes.instance().getSmeltingResult(drop);
				if (smeltingResult != null) {
					smeltingResult = smeltingResult.copy();
					smeltingResult.stackSize *= drop.stackSize;
					int fortuneLevel = event.getFortuneLevel();
					if (!(smeltingResult.getItem() instanceof ItemBlock))
						smeltingResult.stackSize *= new Random().nextInt(fortuneLevel + 1) + 1;
					drops.add(smeltingResult);
				} else
					drops.add(drop);
			}
	}
}

public static <T> List<T> copyList(List<T> list) {
	try {
		Constructor constructor = list.getClass().getConstructor(Collection.class);
		return (List<T>) constructor.newInstance(list);
	} catch (Exception exception) {
		return new ArrayList<>(list);
	}
}

@Override
public int getMinimumEnchantability(int enchantmentLevel) {
	return 1 + 10 * (enchantmentLevel - 1);
}

@Override
public int getMaximumEnchantability(int enchantmentLevel) {
	return super.getMinEnchantability(enchantmentLevel) + 50;
}

}

 

I'm also registring the enchant in the preInit method by simply calling the EnchantmentSmelting class

new EnchantmentSmelting();

 

As i said the performAction function is never called, so wich function i had to write to make this enchant actually work? :) Thanks in advance for your help :)

Don't blame me if i always ask for your help. I just want to learn to be better :)

  • Author

As i said i'm new to enchantments, so which will be a good approach to add one? :)

I've deleted that base class, so now i have only the enchantment class

package com.mineworld.enchantments;

import net.minecraft.enchantment.Enchantment;
import net.minecraft.enchantment.EnumEnchantmentType;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.init.Enchantments;
import net.minecraft.inventory.EntityEquipmentSlot;
import net.minecraft.item.ItemStack;

public class EnchantmentSmelting extends Enchantment {

public EnchantmentSmelting() {
	super(Rarity.UNCOMMON, EnumEnchantmentType.DIGGER,new EntityEquipmentSlot[]{EntityEquipmentSlot.MAINHAND, EntityEquipmentSlot.OFFHAND});
	this.setRegistryName("smelting");
}


@Override
public int getMaxLevel() {
	return 1;
}

@Override
public String getName() {
	return "enchantment.smelting.name";
}

@Override
public boolean canApplyAtEnchantingTable(ItemStack stack) {
	return true;
}

@Override
public boolean isAllowedOnBooks() {
	return true;
}

@Override
public boolean canApplyTogether(Enchantment ench) {
	return super.canApplyTogether(ench) && ench != Enchantments.SILK_TOUCH;
}

@Override
public int getMinEnchantability(int enchantmentLevel) {
	return 1 + 10 * (enchantmentLevel - 1);
}

@Override
public int getMaxEnchantability(int enchantmentLevel) {
	return super.getMinEnchantability(enchantmentLevel) + 50;
}

}

 

But looking at the function i can override in this class i don't find anything that could lead me to define what the performAction function do

Don't blame me if i always ask for your help. I just want to learn to be better :)

  • Author

Mmm, so i could check the BlockBreakingEvent and there check if the tool i'm using is enchanted with this enchant right?

Don't blame me if i always ask for your help. I just want to learn to be better :)

  • Author

Oh, that was easier than i thought :D

Don't blame me if i always ask for your help. I just want to learn to be better :)

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...

Important Information

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

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.