====== Добавление инструментов ====== ==== Создание 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|этой страницы]]