====== Добавление инструментов ======
==== Создание ToolMaterial ====
Для инструментов требуется ''ToolMaterial'', который определяет следующее поведение:
* прочность
* скорость копания
* урон
* уровень копания
* зачаровываемость
* предмет для починки
Другими словами, Tool Materials определяет //базовую// функциональность //base// для инструментов этого типа, и инструменты могут использовать значения, предоставляемые материалом, или использовать свои собственные.
Материалы для ванильных инструментов можно найти в разделе ''ToolMaterials''. Мы создадим отдельный класс для нашего материала:
public class PotatoToolMaterial implements ToolMaterial {
[...]
}
''ToolMaterial'' содержит ряд методов, которые вам необходимо будет реализовать:
=== Прочность ===
''getDurability'' определяет базовую прочность инструментов при использовании этого материала. В ваниле все инструменты одного и того же типа обладают одинаковой прочностью.
@Override
public int getDurability() {
return 500;
}
=== Скорость копания ===
''getMiningSpeedMultiplier'' определяет, насколько быстры инструменты при добыче блоков. Для общего понимания масштаба скорость предметов из дерева составляет 2,0 F, а скорость предметов из алмазов - 8,0 F.
@Override
public float getMiningSpeedMultiplier() {
return 5.0F;
}
=== Урон ===
''getAttackDamage'' возвращает базовый урон инструмента. Обратите внимание, что //большинство// инструментов запрашивают в своем конструкторе целочисленную сумму ущерба, что означает, что результирующий ущерб равен ''(float) materialDamage + (int) toolDamage + 1''. Если вы хотите, чтобы ваш инструмент полностью контролировал величину урона в своем конструкторе, вы можете заставить свой материал возвращать урон от атаки 0F.
@Override
public float getAttackDamage() {
return 3.0F;
}
=== Уровень копания ===
''getMiningLevel'' задает уровень копания инструмента. Алмаз имеет уровень копания 3, а для добычи обсидиана требуется значение 3+.
@Override
public int getMiningLevel() {
return 2;
}
=== Зачаровываемость ===
''getEnchantability'' определяет, насколько зачаровываемым является инструмент. Золотой инструмент имеет 22-ую зачаровываемость, в то время как Алмазный инструмент имеет 10-ую. Более высокая зачаровываемость означает лучшие (и более высокоуровневые) чары.
@Override
public int getEnchantability() {
return 15;
}
=== Предмет для починки ===
''getRepairIngredient'' возращает ''Ingredient'', необходимый для ремонта инструмента на наковальне.
@Override
public Ingredient getRepairIngredient() {
return Ingredient.ofItems(Items.POTATO);
}
''ToolMaterial'' //не// должен быть зарегистрирован. Хороший способ передать их инструментам, которые в них нуждаются, - это сохранить где-нибудь экземпляр (а затем ссылаться на него, когда он вам понадобится). В этом случае мы поместим наш экземпляр в начало класса ToolMaterial:
public class PotatoToolMaterial implements ToolMaterial {
public static final PotatoToolMaterial INSTANCE = new PotatoToolMaterial();
[...]
}
На ''PotatoToolMaterial'' теперь можно ссылаться с помощью ''PotatoToolMaterial.INSTANCE''.
==== Создание инструмента ====
Для всех базовых классов инструментов (''PickaxeItem'', ''ShovelItem'', ''HoeItem'', ''AxeItem'', ''SwordItem'') требуется ''ToolMaterial'', скорость атаки (float), дополнительная сумма урона от атаки (float для AxeItem; int для остальных), и экземпляр ''Item.Settings''.
public static ToolItem POTATO_SHOVEL = new ShovelItem(PotatoToolMaterial.INSTANCE, 1.5F, -3.0F, new Item.Settings().group(ItemGroup.TOOLS));
public static ToolItem POTATO_SWORD = new SwordItem(PotatoToolMaterial.INSTANCE, 3, -2.4F, new Item.Settings().group(ItemGroup.COMBAT));
`PickaxeItem` , `HoeItem` и `AxeItem` имеют защищенные конструкторы, что означает, что вам нужно будет создавать свои собственные классы с общедоступными конструкторами:
public class CustomPickaxeItem extends PickaxeItem {
public CustomPickaxeItem(ToolMaterial material, int attackDamage, float attackSpeed, Settings settings) {
super(material, attackDamage, attackSpeed, settings);
}
}
Использование общедоступных классов:
public static ToolItem POTATO_PICKAXE = new CustomPickaxeItem(PotatoToolMaterial.INSTANCE, 1, -2.8F, new Item.Settings().group(ItemGroup.TOOLS));
public static ToolItem POTATO_AXE = new CustomAxeItem(PotatoToolMaterial.INSTANCE, 7.0F, -3.2F, new Item.Settings().group(ItemGroup.TOOLS));
public static ToolItem POTATO_HOE = new CustomHoeItem(PotatoToolMaterial.INSTANCE, 7, -3.2F, new Item.Settings().group(ItemGroup.TOOLS));
Если вы хотите добавить какие-либо специальные атрибуты или поведение к своему инструменту, создайте подкласс, который расширяет один из базовых классов инструментов, и переопределите все необходимые методы.
==== Регистрация предметов ====
Для краткого ознакомления с регистрацией предметов ознакомьтесь с руководством по предметам [[ru:tutorial:items|здесь]].
==== Заставить ваш инструмент работать с не-ванильными блоками ====
Посетите последний раздел [[ru:tutorial:mining_levels|этой страницы]]