Автоплавка руд1.12.2

Версия Minecraft
1.12.2
28
2
Решил попробовать написать мод, на автопереплавку руд тк не нашёл подходящего. Можете оценить что получилось? Явно что-то надо изменить. Но как реализовать не понимаю. 1) обобщить все руды, чтобы не прописывать для каждой руды, 2) вынести колво опыта в конфиг. Не подскажете как такое можно сделать?


Главный класс:
package ru.maxed.smelting;

import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;

@Mod(modid = "smelting")
public class Smelting {
    
    @Mod.EventHandler
    public void load(FMLInitializationEvent event)
    {
        MinecraftForge.EVENT_BUS.register(new changeDrop());

    }

}
Обработчик Ивента:
package ru.maxed.smelting;

import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.item.ItemStack;
import net.minecraftforge.event.world.BlockEvent;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;

class changeDrop {

    @SubscribeEvent
    public void handleBlockDrops(BlockEvent.HarvestDropsEvent e){
        if(e.getState().getBlock() == Blocks.IRON_ORE){
        e.getDrops().clear();
        e.getDrops().add(new ItemStack(Items.IRON_INGOT, 1));
        }
        if(e.getState().getBlock() == Blocks.GOLD_ORE){
            e.getDrops().clear();
            e.getDrops().add(new ItemStack(Items.GOLD_INGOT, 1));
        }
    }

    @SubscribeEvent
    public void handleExpDrops(BlockEvent.BreakEvent e){
        if(e.getState().getBlock() == Blocks.IRON_ORE){
            e.setExpToDrop(100);
        }
        if(e.getState().getBlock() == Blocks.GOLD_ORE){
            e.setExpToDrop(200);
        }
    }
}
 
Последнее редактирование:
Решение
new ItemStack(out.getItem(), quantityDropped(fortuneLvl,rand))
Тут ты теряешь метадату(damage) предмета. Возможно, термал переопределяет ванильные предметы и с нулевой метой получается другой переплавленный предмет.
Используй out.copy(), чтобы получить копию предмета и setCount, чтобы установить количество
28
2
С астралом играл? Вот реализация логики зачарования автопереплавки
Я мог переписать и всё отлично работает с ванильными рудами, Я решил добавить термал для проверки и у меня с любой термаловской руды падает железная пыль. С чем может быть связано? Может FurnaceRecipes.instance().getSmeltingResult(stack); Уже не подходит и надо менять на что то другое? Или заранее где то обновить рецепты?
 
7,099
324
1,510
Вот тут используется тот же подход: TeamTwilight/twilightforest
Видимо, проблема не в нем, а в том, как ты его юзаешь. Покажи код
 
28
2
Ивент:
package ru.maxed.smelting;

import net.minecraft.block.Block;
import net.minecraft.block.BlockOre;
import net.minecraft.enchantment.EnchantmentHelper;
import net.minecraft.init.Enchantments;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.FurnaceRecipes;
import net.minecraft.util.NonNullList;
import net.minecraftforge.common.ForgeHooks;
import net.minecraftforge.event.world.BlockEvent;
import net.minecraftforge.fml.common.eventhandler.EventPriority;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;

import javax.annotation.Nonnull;
import java.util.Iterator;
import java.util.Random;


public class oreBreakIvent {

    public int quantityDropped(int fortune, Random random) {
        if (fortune > 0 )
        {
            int i = random.nextInt(fortune + 2)-1;

            if (i < 0)
            {
                i = 0;
            }

            return  (i + 1);
        }
        else
        {
            return 1;
        }
    }

    @SubscribeEvent(priority = EventPriority.LOW)
    public void dropSmelting(BlockEvent.HarvestDropsEvent event) {
        Random rand = new Random();
        if(event.getHarvester() != null && !event.isSilkTouching() && event.getState().getBlock().getUnlocalizedName().toLowerCase().contains("ore")) {
            ItemStack main = event.getHarvester().getHeldItemMainhand();
            if(!main.isEmpty()) {
                    int fortuneLvl = EnchantmentHelper.getEnchantmentLevel(Enchantments.FORTUNE, main);
                    NonNullList<ItemStack> newStacks = NonNullList.create();
                    Iterator<ItemStack> iterator = event.getDrops().iterator();
                    while (iterator.hasNext()) {
                        ItemStack stack = iterator.next();
                        if (stack.isEmpty()) {
                            continue;
                        }
                        ItemStack out = FurnaceRecipes.instance().getSmeltingResult(stack);

                        if (out.isEmpty()) {
                            continue;
                        }
                        iterator.remove();
                        newStacks.add(new ItemStack(out.getItem(), quantityDropped(fortuneLvl,rand)));
                    }
                    event.getDrops().addAll(newStacks);
                }
            }
    }

    @SubscribeEvent
    public void handleExpDrops(BlockEvent.BreakEvent event){
        boolean canHarvest = ForgeHooks.canHarvestBlock(event.getState().getBlock(), event.getPlayer(), event.getWorld(), event.getPos());
        if(canHarvest  && event.getPlayer() != null && !(EnchantmentHelper.getEnchantmentLevel(Enchantments.SILK_TOUCH, event.getPlayer().getHeldItemMainhand()) > 0) && event.getState().getBlock().getUnlocalizedName().toLowerCase().contains("ore")){
            event.setExpToDrop(3);
        }
    }
}
 
7,099
324
1,510
new ItemStack(out.getItem(), quantityDropped(fortuneLvl,rand))
Тут ты теряешь метадату(damage) предмета. Возможно, термал переопределяет ванильные предметы и с нулевой метой получается другой переплавленный предмет.
Используй out.copy(), чтобы получить копию предмета и setCount, чтобы установить количество
 
7,099
324
1,510
Сверху