Кривой молот

Версия Minecraft
1.12.2
1,031
19
87
Здравствуйте. Создал я значит свой молот со свойствами кирки и меча. Большинство функционала работает, в точности разрушаются и добываются нужные блоки, а также мобам наносится нужный урон. Но при крафте отнимается одна единичка прочности и дальше не крафтится. Плюс складыванием двух молотов они не чинятся в один. Как это решить?

Java:
public class ItemHammerBase extends ItemTool {
    
    private static final Set<Block> EFFECTIVE_ON = Sets.newHashSet(Blocks.ACTIVATOR_RAIL, Blocks.COAL_ORE, Blocks.COBBLESTONE, Blocks.DETECTOR_RAIL, Blocks.DIAMOND_BLOCK, Blocks.DIAMOND_ORE, Blocks.DOUBLE_STONE_SLAB, Blocks.GOLDEN_RAIL, Blocks.GOLD_BLOCK, Blocks.GOLD_ORE, Blocks.ICE, Blocks.IRON_BLOCK, Blocks.IRON_ORE, Blocks.LAPIS_BLOCK, Blocks.LAPIS_ORE, Blocks.LIT_REDSTONE_ORE, Blocks.MOSSY_COBBLESTONE, Blocks.NETHERRACK, Blocks.PACKED_ICE, Blocks.RAIL, Blocks.REDSTONE_ORE, Blocks.SANDSTONE, Blocks.RED_SANDSTONE, Blocks.STONE, Blocks.STONE_SLAB, Blocks.STONE_BUTTON, Blocks.STONE_PRESSURE_PLATE);
    
    public ItemHammerBase(Item.ToolMaterial material, String NameRegistry, String NameLocalized, float Speed, float Damage) {
        
        super(Damage, Speed, material, EFFECTIVE_ON);
        
        this.setUnlocalizedName(NameLocalized);
        this.setRegistryName(NameRegistry);
        this.setMaxStackSize(1);
        this.setNoRepair();
        
    }

    public boolean hasContainerItem(ItemStack stack) {
        
        return true;
        
    }

    @Override
    public ItemStack getContainerItem(ItemStack itemStack) {
        
        ItemStack result = itemStack.copy();
        result.setItemDamage(result.getItemDamage() + 1);
        if (result.getItemDamage() >= result.getMaxDamage())
            return ItemStack.EMPTY;
        return result;
    }
    
    @Override
    public boolean canHarvestBlock(IBlockState blockIn) {
        Block block = blockIn.getBlock();

        if (block == Blocks.OBSIDIAN) return this.toolMaterial.getHarvestLevel() == 3;
        else if (block != Blocks.DIAMOND_BLOCK && block != Blocks.DIAMOND_ORE) {
            if (block != Blocks.EMERALD_ORE && block != Blocks.EMERALD_BLOCK) {
                if (block != Blocks.GOLD_BLOCK && block != Blocks.GOLD_ORE) {
                    if (block != Blocks.IRON_BLOCK && block != Blocks.IRON_ORE) {
                        if (block != Blocks.LAPIS_BLOCK && block != Blocks.LAPIS_ORE) {
                            if (block != Blocks.REDSTONE_ORE && block != Blocks.LIT_REDSTONE_ORE) {

                                Material material = blockIn.getMaterial();
                                if (material == Material.ROCK) return true;
                                else if (material == Material.IRON) return true;
                                else return material == Material.ANVIL;

                            } else return this.toolMaterial.getHarvestLevel() >= 2;
                        } else return this.toolMaterial.getHarvestLevel() >= 1;
                    } else return this.toolMaterial.getHarvestLevel() >= 1;
                } else return this.toolMaterial.getHarvestLevel() >= 2;
            } else return this.toolMaterial.getHarvestLevel() >= 2;
        } else return this.toolMaterial.getHarvestLevel() >= 2;
    }

    @Override
    public float getDestroySpeed(ItemStack stack, IBlockState state) {
        Material material = state.getMaterial();
        return material != Material.IRON && material != Material.ANVIL ? super.getDestroySpeed(stack, state) : this.efficiency;
    }

    @Override
    public boolean hitEntity(ItemStack stack, EntityLivingBase target, EntityLivingBase attacker) {
        stack.damageItem(1, attacker);
        if (attacker instanceof EntityPlayer)
            target.attackEntityFrom(DamageSource.causePlayerDamage((EntityPlayer)attacker), attackDamage);
        else
            target.attackEntityFrom(DamageSource.causeMobDamage(attacker), attackDamage);

        if ((target instanceof EntitySkeleton || target instanceof EntitySkeletonHorse) && !target.world.isRemote) {
            boolean flag = true;

            for (ItemStack armor : target.getArmorInventoryList()) {
                if (!armor.isEmpty()) {
                    flag = false;
                    break;
                }
            }

            if (flag && target.world.rand.nextBoolean())
                target.world.spawnEntity(new EntityItem(target.world, target.posX, target.posY, target.posZ, new ItemStack(Items.DYE, 1, 15)));
        }
        return true;
    }
Java:
public class RegisterItem {

    public static Item COPPER_INGOT = new ItemCraftBase("copper_ingot", "ingot.copper", 64);
    public static Item COPPER_NUGGET = new ItemCraftBase("copper_nugget", "nugget.copper", 64);
    public static Item COPPER_HELMET = new ItemArmorBase(MaterialArmor.COPPER, EntityEquipmentSlot.HEAD, "copper_helmet", "helmet.copper", 1);
    public static Item COPPER_CHESTPLATE = new ItemArmorBase(MaterialArmor.COPPER, EntityEquipmentSlot.CHEST, "copper_chestplate", "chestplate.copper", 1);
    public static Item COPPER_LEGGINGS = new ItemArmorBase(MaterialArmor.COPPER, EntityEquipmentSlot.LEGS, "copper_leggings", "leggings.copper", 2);
    public static Item COPPER_BOOTS = new ItemArmorBase(MaterialArmor.COPPER, EntityEquipmentSlot.FEET, "copper_boots", "boots.copper", 1);
    public static Item COPPER_HOE = new ItemHoeBase(MaterialTool.COPPER, "copper_hoe", "hoe.copper");
    public static Item COPPER_SWORD = new ItemSwordBase(MaterialTool.COPPER, "copper_sword", "sword.copper");
    public static Item COPPER_AXE = new ItemAxeBase(MaterialTool.COPPER, "copper_axe", "axe.copper", 7.0F, -3.2F);
    public static Item COPPER_SHOVEL = new ItemShovelBase(MaterialTool.COPPER, "copper_shovel", "shovel.copper");
    public static Item COPPER_PICKAXE = new ItemPickaxeBase(MaterialTool.COPPER, "copper_pickaxe", "pickaxe.copper");
    public static Item DIAMOND_HAMMER = new ItemHammerBase(ToolMaterial.DIAMOND, "diamond_hammer", "hammer.diamond", -3.0F, 10.0F);
    public static Item IRON_PLATE = new ItemCraftBase("iron_plate", "plate.iron", 32);
    public static Item FRIED_EGG = new ItemFoodBase("fried_egg", "fried.egg", false, 0.5F, 2, 2);
    
    public static void register() {
        
        setRegister(COPPER_INGOT);
        setRegister(COPPER_NUGGET);
        setRegister(COPPER_HELMET);
        setRegister(COPPER_CHESTPLATE);
        setRegister(COPPER_LEGGINGS);
        setRegister(COPPER_BOOTS);
        setRegister(COPPER_HOE);
        setRegister(COPPER_SWORD);
        setRegister(COPPER_AXE);
        setRegister(COPPER_SHOVEL);
        setRegister(COPPER_PICKAXE);
        setRegister(DIAMOND_HAMMER);
        setRegister(IRON_PLATE);
        setRegister(FRIED_EGG);
        
    }

    @SideOnly(Side.CLIENT)
    public static void registerRender() {
        
        setRender(COPPER_INGOT);
        setRender(COPPER_NUGGET);
        setRender(COPPER_HELMET);
        setRender(COPPER_CHESTPLATE);
        setRender(COPPER_LEGGINGS);
        setRender(COPPER_BOOTS);
        setRender(COPPER_HOE);
        setRender(COPPER_SWORD);
        setRender(COPPER_AXE);
        setRender(COPPER_SHOVEL);
        setRender(COPPER_PICKAXE);
        setRender(DIAMOND_HAMMER);
        setRender(IRON_PLATE);
        setRender(FRIED_EGG);
        
    }

    private static void setRegister(Item item) {
        
        ForgeRegistries.ITEMS.register(item);
        
    }

    @SideOnly(Side.CLIENT)
    private static void setRender(Item item) {
        
        Minecraft.getMinecraft().getRenderItem().getItemModelMesher().register(item, 0, new ModelResourceLocation(item.getRegistryName(), "inventory"));

    }
 
Решение
То-есть сделать починку складыванием никак не получится?
Ты использовал мой код, в конструкторе setNoRepair(), по этому он не починиться другим молотом. Но ...
Нужно будет использовать не стандартный рецепт (IRecipe), на новой версии я не знаю как это делается.
А почему именно 32767?
OreDictionary.WILDCARD_VALUE;
WILDCARD_VALUE = Short.MAX_VALUE;
MAX_VALUE = 32767;
Подобное значение значит, что будет использоваться любая метадата (/ любая прочность).
7,099
324
1,510
Рецепт покажи
 

timaxa007

Модератор
5,831
409
672
Плюс складыванием двух молотов они не чинятся в один.
Или иначе будет дюп молотов. Нужно будет использовать не стандартный рецепт (IRecipe), на новой версии я не знаю как это делаеться.
 

timaxa007

Модератор
5,831
409
672
То-есть сделать починку складыванием никак не получится?
Ты использовал мой код, в конструкторе setNoRepair(), по этому он не починиться другим молотом. Но ...
Нужно будет использовать не стандартный рецепт (IRecipe), на новой версии я не знаю как это делается.
А почему именно 32767?
OreDictionary.WILDCARD_VALUE;
WILDCARD_VALUE = Short.MAX_VALUE;
MAX_VALUE = 32767;
Подобное значение значит, что будет использоваться любая метадата (/ любая прочность).
 
Сверху