#java
#Ява
Вопрос:
Я программирую моды для Майнкрафт уже 3 недели, и у меня есть вопрос. Я хочу, чтобы переменная дистанция зависела от того, сколько брони вы наденете. Это мой код:
package com.E2Z1.pickaxemod.item.custom; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ArmorItem; import net.minecraft.world.item.ArmorMaterial; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import com.E2Z1.pickaxemod.item.ModArmorMaterial; public class ModArmorItem extends ArmorItem { public ModArmorItem(ArmorMaterial material, EquipmentSlot slot, Properties settings) { super(material, slot, settings); } @Override public void inventoryTick(ItemStack stack, Level world, Entity entity, int slot, boolean selected) { if(!world.isClientSide()) { if(entity instanceof Player) { Player player = (Player)entity; GlobalVar.distance = howmanyarmor(ModArmorMaterial.PICKAXE_ARMOR, player); } } super.inventoryTick(stack, world, entity, slot, selected); } private int howmanyarmor(ArmorMaterial material, Player player) { ArmorItem boots = ((ArmorItem)player.getInventory().getArmor(0).getItem()); ArmorItem leggings = ((ArmorItem)player.getInventory().getArmor(1).getItem()); ArmorItem breastplate = ((ArmorItem)player.getInventory().getArmor(2).getItem()); ArmorItem helmet = ((ArmorItem)player.getInventory().getArmor(3).getItem()); ItemStack boots2 = player.getInventory().getArmor(0); ItemStack leggings2 = player.getInventory().getArmor(1); ItemStack breastplate2 = player.getInventory().getArmor(2); ItemStack helmet2 = player.getInventory().getArmor(3); int numberofarmor = 0; if (!helmet2.isEmpty()) { if (helmet.getMaterial() == material){ numberofarmor = 1; }} if (!breastplate2.isEmpty()) { if (breastplate.getMaterial() == material){ numberofarmor = 1; }} if (!leggings2.isEmpty()) { if (leggings.getMaterial() == material){ numberofarmor = 1; }} if (!boots2.isEmpty()) { if (boots.getMaterial() == material){ numberofarmor = 1; }} return numberofarmor; } }
Когда я начинаю мир, эта ошибка приходит:
Caused by: java.lang.ClassCastException: class net.minecraft.world.item.AirItem cannot be cast to class net.minecraft.world.item.ArmorItem (net.minecraft.world.item.AirItem and net.minecraft.world.item.ArmorItem are in module minecraft@1.17.1 of loader 'TRANSFORMER' @2c8662ac)
Версия Forge: 37.0.104 Версия Майнкрафт: 1.17.1
(Извините за плохой английский)
Я надеюсь, что вы сможете помочь
Комментарии:
1.
getArmor(X).getItem()
возвращает несовместимый тип, поэтому вы не можете привести его к экземпляруArmorItem
. Я бы рекомендовал удалить приведение и выполнить отладку с помощью кода. Если вы правильно установили точки останова или некоторые отпечатки, вы можете получить исходный тип элемента. Так что в целом у вас здесь неправильные предположения. Не каждый предмет является предметом брони, поэтому вам нужно добавить туда проверку экземпляра/типа и что делать, если это другой тип.
Ответ №1:
Я на самом деле не увлекаюсь моддингом minecraft, однако, похоже, что вы извлекаете с getArmor
помощью Добытчиков части брони персонажа игрока. Если игрок не носит никакой брони в слоте, я полагаю, вы не получите экземпляр ArmorItem
, а вместо этого получите AirItem
(в основном пустой слот).
Поэтому вам, возможно, потребуется на самом деле проверить тип экземпляра, который вы получаете. Точно так же вы проверяете public void inventoryTick
, является ли entity
экземпляр типа Player
.
Результирующая реализация может выглядеть примерно так:
private int howmanyarmor(ArmorMaterial material, Player player) { int numberofarmor = 0; Item bootsItem = player.getInventory().getArmor(0).getItem(); if (bootsItem instanceof ArmorItem) { ArmorItem boots = (ArmorItem)bootsItem; ItemStack boots2 = player.getInventory().getArmor(0); if (!boots2.isEmpty()) { if (boots.getMaterial() == material){ numberofarmor = 1; }} } // [... re-do for remaining slots ...] return numberofarmor; }