Вызвано: java.lang.Исключение ClassCastException: класс net.minecraft.world.item.Элемент AirItem не может быть отнесен к классу net.minecraft.world.item.Бронетехника

#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;  }