[1.12.2] Не могу создать топор...

Статус
В этой теме нельзя размещать новые ответы.
Версия Minecraft
1.12.2
Прошу помочь мне решить проблему, из-за которой Minecraft не инициализирует мой мод. Я написал код (прямо как на mcmodding.ru), который отвечал за новые инструменты. Почему-то, при запуске игры со следующим набором инструментов: киркой, лопатой и мечом, все работает корректно. Но как только я убираю комментирование со строчки, которая отвечает за загрузку топора в клиент, Minecraft "крашится". Заранее всем спасибо.
Код:
package ru.ninecraft.addons.items;

import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraft.item.ItemAxe;
import net.minecraftforge.common.util.EnumHelper;
import ru.ninecraft.addons.IHasModel;
import ru.ninecraft.addons.InitItems;
import ru.ninecraft.addons.Main;

public class ItemDamascusAxe extends ItemAxe implements IHasModel {
    
    public ItemDamascusAxe(String name) {
        
        super(EnumHelper.addToolMaterial("ninecraftaddons:damascus_axe", 2, 500, 10.0F, 2.0F, 0));
        setRegistryName(name);
        setUnlocalizedName("Damascus Axe");
        setCreativeTab(Main.EQUIPMENTS_TAB);
        setMaxStackSize(1);
        
        InitItems.ITEMS.add(this);
    }

    @Override
    public void registerModels() {
        
        Main.proxy.registerItemRenderer(this, 0, "inventory");
        
    }
    
}
 
Решение
За место создания этого класса ты бы мог просто изменить
super(EnumHelper.addToolMaterial("ninecraftaddons:damascus_axe", 2, 500, 10.0F, 2.0F, 0));
На:
Код:
super(EnumHelper.addToolMaterial("ninecraftaddons:damascus_axe", 2, 500, 10.0F, 2.0F, 0), 8.0F, -3.1F);
И результат был бы такой же.
7,099
324
1,510
Прости, но он вроде не знал, что не разбирается: он предположил, что если все предыдущие инструменты не имели такого поведения, то и топор не должен, при этом проигнорировал то, что у них у всех разные конструкторы
 
91
1
5
Код:
public class ToolAxe extends ItemTool implements IHasModel {
    private static final Set<Block> EFFECTIVE_ON = Sets.newHashSet(Blocks.PLANKS, Blocks.BOOKSHELF, Blocks.LOG, Blocks.LOG2, Blocks.CHEST, Blocks.PUMPKIN, Blocks.LIT_PUMPKIN, Blocks.MELON_BLOCK, Blocks.LADDER, Blocks.WOODEN_BUTTON, Blocks.WOODEN_PRESSURE_PLATE);

    public ToolAxe(String name, ToolMaterial material, CreativeTabs tab) {
        super(material, EFFECTIVE_ON);
        setUnlocalizedName(name);
        setRegistryName(name);
        setCreativeTab(tab);
        
        ТвойРеестрПредметов.ITEMS.add(this);
    }

    @Override
    public void registerModels() {
        Main.proxy.registerModel(this, 0);
    }
}
 
Я конечно не эксперт, но
Код:
Caused by: java.lang.ArrayIndexOutOfBoundsException: 5
    at net.minecraft.item.ItemAxe.<init>(ItemAxe.java:19)
В моей версии Forge показывается, что ItemAxe.java:19 находится:
Java:
package net.minecraft.item;

import com.google.common.collect.Sets;
import java.util.Set;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.block.state.IBlockState;
import net.minecraft.init.Blocks;

public class ItemAxe extends ItemTool
{
    private static final Set<Block> EFFECTIVE_ON = Sets.newHashSet(Blocks.PLANKS, Blocks.BOOKSHELF, Blocks.LOG, Blocks.LOG2, Blocks.CHEST, Blocks.PUMPKIN, Blocks.LIT_PUMPKIN, Blocks.MELON_BLOCK, Blocks.LADDER, Blocks.WOODEN_BUTTON, Blocks.WOODEN_PRESSURE_PLATE);
    private static final float[] ATTACK_DAMAGES = new float[] {6.0F, 8.0F, 8.0F, 8.0F, 6.0F};
    private static final float[] ATTACK_SPEEDS = new float[] { -3.2F, -3.2F, -3.1F, -3.0F, -3.0F};

    protected ItemAxe(Item.ToolMaterial material)
    {
        super(material, EFFECTIVE_ON);                              // НИЖЕ
        this.attackDamage = ATTACK_DAMAGES[material.ordinal()];     // ВОТ ЗДЕСЬ
        this.attackSpeed = ATTACK_SPEEDS[material.ordinal()];       // ВЫШЕ
    }

    protected ItemAxe(Item.ToolMaterial material, float damage, float speed)
    {
        super(material, EFFECTIVE_ON);
        this.attackDamage = damage;
        this.attackSpeed = speed;
    }

    public float getDestroySpeed(ItemStack stack, IBlockState state)
    {
        Material material = state.getMaterial();
        return material != Material.WOOD && material != Material.PLANTS && material != Material.VINE ? super.getDestroySpeed(stack, state) : this.efficiency;
    }
}

Предположительно у тебя ошибка в том, что либо ATTACK_DAMAGES задан выше чем 5F, либо у тебя криво работает material.ordinal(), либо думайте сами
 
7,099
324
1,510
Разрешите поВанговать.
В какой-то версии форджа конструктор у топора почему-то был приватным. Возможно, крашит из-за этого.
Хотя IDE тебе бы сказала, что так нельзя... Но всё-таки проверь.
Возможно имеет смысл обновить фордж до более новой версии.
Я сейчас посмотрел в библиотеку "net.minecraft.item.ItemAxe". ItemAxe является public классом. Так что, этот вариант уже можно не рассматривать.
 
Вот это взывает краш, алло. Материалы добавленные через forge enum helper не добавляют свои значения в те два массива
У меня указан урон в 2.0F, т.к. мне нужен урон с железного топора. Тогда в чем может быть проблема?
 
Покажи актуальный код
Код:
package net.minecraft.item;

import com.google.common.collect.Sets;
import java.util.Set;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.block.state.IBlockState;
import net.minecraft.init.Blocks;

public class ItemAxe extends ItemTool
{
    private static final Set<Block> EFFECTIVE_ON = Sets.newHashSet(Blocks.PLANKS, Blocks.BOOKSHELF, Blocks.LOG, Blocks.LOG2, Blocks.CHEST, Blocks.PUMPKIN, Blocks.LIT_PUMPKIN, Blocks.MELON_BLOCK, Blocks.LADDER, Blocks.WOODEN_BUTTON, Blocks.WOODEN_PRESSURE_PLATE);
    private static final float[] ATTACK_DAMAGES = new float[] {6.0F, 8.0F, 8.0F, 8.0F, 6.0F};
    private static final float[] ATTACK_SPEEDS = new float[] { -3.2F, -3.2F, -3.1F, -3.0F, -3.0F};

    protected ItemAxe(Item.ToolMaterial material)
    {
        super(material, EFFECTIVE_ON);
        this.attackDamage = ATTACK_DAMAGES[material.ordinal()];
        this.attackSpeed = ATTACK_SPEEDS[material.ordinal()];
    }

    protected ItemAxe(Item.ToolMaterial material, float damage, float speed)
    {
        super(material, EFFECTIVE_ON);
        this.attackDamage = damage;
        this.attackSpeed = speed;
    }

    public float getDestroySpeed(ItemStack stack, IBlockState state)
    {
        Material material = state.getMaterial();
        return material != Material.WOOD && material != Material.PLANTS && material != Material.VINE ? super.getDestroySpeed(stack, state) : this.efficiency;
    }
}
 
Код:
public class ToolAxe extends ItemTool implements IHasModel {
    private static final Set<Block> EFFECTIVE_ON = Sets.newHashSet(Blocks.PLANKS, Blocks.BOOKSHELF, Blocks.LOG, Blocks.LOG2, Blocks.CHEST, Blocks.PUMPKIN, Blocks.LIT_PUMPKIN, Blocks.MELON_BLOCK, Blocks.LADDER, Blocks.WOODEN_BUTTON, Blocks.WOODEN_PRESSURE_PLATE);

    public ToolAxe(String name, ToolMaterial material, CreativeTabs tab) {
        super(material, EFFECTIVE_ON);
        setUnlocalizedName(name);
        setRegistryName(name);
        setCreativeTab(tab);
       
        ТвойРеестрПредметов.ITEMS.add(this);
    }

    @Override
    public void registerModels() {
        Main.proxy.registerModel(this, 0);
    }
}
Можешь пояснить свое решение, пожалуйста?
 
Ура! Я решил проблему, создав новый класс ItemToolAxe (поставил такое название, чтобы не путать с ItemAxe).

Код:
package ru.ninecraft.addons;

import com.google.common.collect.Sets;
import java.util.Set;
import net.minecraft.item.*;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.block.state.IBlockState;
import net.minecraft.init.Blocks;

public class ItemToolAxe extends ItemTool
{
    private static final Set<Block> EFFECTIVE_ON = Sets.newHashSet(Blocks.PLANKS, Blocks.BOOKSHELF, Blocks.LOG, Blocks.LOG2, Blocks.CHEST, Blocks.PUMPKIN, Blocks.LIT_PUMPKIN, Blocks.MELON_BLOCK, Blocks.LADDER, Blocks.WOODEN_BUTTON, Blocks.WOODEN_PRESSURE_PLATE);
    private static final float[] ATTACK_DAMAGES = new float[] {6.0F, 8.0F, 8.0F, 8.0F, 6.0F};
    private static final float[] ATTACK_SPEEDS = new float[] { -3.2F, -3.2F, -3.1F, -3.0F, -3.0F};

    protected ItemToolAxe(Item.ToolMaterial material)
    {
        super(material, EFFECTIVE_ON);
        this.attackDamage = 8.0F;
        this.attackSpeed = -3.1F;
    }

    protected ItemToolAxe(Item.ToolMaterial material, float damage, float speed)
    {
        super(material, EFFECTIVE_ON);
        this.attackDamage = damage;
        this.attackSpeed = speed;
    }

    public float getDestroySpeed(ItemStack stack, IBlockState state)
    {
        Material material = state.getMaterial();
        return material != Material.WOOD && material != Material.PLANTS && material != Material.VINE ? super.getDestroySpeed(stack, state) : this.efficiency;
    }
}
И вместо того, чтобы обращаться к массиву (как раз при этом обращении игра крашится), я ЗАРАНЕЕ прописал эти значения. Потом уже можно будет создать другой класс, если вам нужен топор с другим количеством урона или скоростью атаки.
Теперь, осталось только изменить (в моем случае) public class ItemDamascusAxe extends ItemAxe implements IHasModel на public class ItemDamascusAxe extends ItemToolAxe implements IHasModel и импортировать библиотеку com.name.modid.class_name (в моем случае, ru.ninecraft.addons.ItemToolAxe) и убрать строчку, в которой происходит импорт библиотеки net.minecraft.item.ItemAxe. Загружаем необходимую текстурку и модель, запускаем игру и наслаждаемся полностью работающим топором.
P.S. Да, я понимаю, что это костыль, к тому же, не совсем рациональный, но меня это решение полностью устраивает.
 
Последнее редактирование:
3,005
192
592
За место создания этого класса ты бы мог просто изменить
super(EnumHelper.addToolMaterial("ninecraftaddons:damascus_axe", 2, 500, 10.0F, 2.0F, 0));
На:
Код:
super(EnumHelper.addToolMaterial("ninecraftaddons:damascus_axe", 2, 500, 10.0F, 2.0F, 0), 8.0F, -3.1F);
И результат был бы такой же.
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху