Энергия брони

Версия Minecraft
1.12.2
API
Forge
36
0
Доброго времени суток, формучане. Я сделал собственную броню и попытался сделать для нее свою энергию, могу сказать что у меня получилось, почти.
Вообщем, вроде бы емкость пополняется, но все бы ничего, но заряд пополняется на нагрудники которые находятся в инвенторе и даже тот, который находится в вкладке креатива, вопрос, как мне сделать так, чтобы заряд пополнялся только при надетом нагруднике? Я пытался сделать, но что то не получилось
Класс нагрудника:
public class ItemHeavenlyChest extends ItemArmor implements IHasModel {
    private int energyCapacity = 500;
    private int currentEnergy = 0;
    private int tickCounter = 0;
    private int ticksPerEnergy = 20;
    
    public ItemHeavenlyChest(String name, int layer,ArmorMaterial materialIn, EntityEquipmentSlot equipmentSlotIn)
    {
        super(materialIn, layer, equipmentSlotIn);
        this.setRegistryName(name);
        this.setUnlocalizedName(name);
        this.setCreativeTab(Main.HEAVENLY_TABS);
        InitItems.ITEMS.add(this);
    }
    
    @Override
    public void registerModels() {
        Main.proxy.registerItemRenderer(this, 0, "inventory");
    }
    
    public String getArmorTexture(ItemStack stack, Entity entity, EntityEquipmentSlot slot, String type) {
        return "ht:textures/models/armor/heavenly_model_layer_3.png";
    }
 
    @Override
    public void addInformation(ItemStack stack, World worldIn, List<String> tooltip, ITooltipFlag flagIn) {
        tooltip.add("Energy: " + this.currentEnergy + "/" + this.energyCapacity);
        super.addInformation(stack, worldIn, tooltip, flagIn);
    }

    @Override
    public void onArmorTick(World world, EntityPlayer player, ItemStack itemStack) {
        if (player.getItemStackFromSlot(EntityEquipmentSlot.CHEST) == itemStack) {
            if (this.currentEnergy < this.energyCapacity) {
                this.tickCounter++;
                if (this.tickCounter >= this.ticksPerEnergy) {
                    this.currentEnergy++;
                    this.tickCounter = 0;
                }
            }
        }
    }
    
    @Override
    public ModelBiped getArmorModel(EntityLivingBase entityLiving, ItemStack itemStack, EntityEquipmentSlot armorSlot,
            ModelBiped _default) {
        if (itemStack != ItemStack.EMPTY) {
            if (itemStack.getItem() instanceof ItemArmor) {
                HeavenlyChestModel model = new HeavenlyChestModel();
                model.bipedHead.showModel = armorSlot == EntityEquipmentSlot.HEAD;
                model.bipedHeadwear.showModel = false;
                model.bipedBody.showModel = armorSlot == EntityEquipmentSlot.CHEST || armorSlot == EntityEquipmentSlot.LEGS;
                model.bipedRightArm.showModel = armorSlot == EntityEquipmentSlot.CHEST;
                model.bipedLeftArm.showModel = armorSlot == EntityEquipmentSlot.CHEST;
                model.bipedRightLeg.showModel = armorSlot == EntityEquipmentSlot.LEGS || armorSlot == EntityEquipmentSlot.FEET;
                model.bipedLeftLeg.showModel = armorSlot == EntityEquipmentSlot.LEGS || armorSlot == EntityEquipmentSlot.FEET;
                
                model.isChild = _default.isChild;
                model.isRiding = _default.isRiding;
                model.isSneak = _default.isSneak;
                model.rightArmPose = _default.rightArmPose;
                model.leftArmPose = _default.leftArmPose;
                
                return model;
            }
        }
        return null;
    }
}
 

Вложения

  • Screenshot_15.png
    Screenshot_15.png
    23.4 KB · Просмотры: 3
Данные предметов майн сохраняет в NBT. Тебе тоже следует хранить там заряд.
Иначе говоря,
private int energyCapacity = 500; private int currentEnergy = 0; private int tickCounter = 0; private int ticksPerEnergy = 20;
не использовать. Делать все расчёты в тиках.
 
Суть в том, что NBT должны быть привязаны к ItemStack, а не к Item.
Так как Item является одиночным экземпляром, то соответственно все ItemStack, полученные на основе конкретного Item, получат его свойства. Именно поэтому ты видишь заряд у всей брони, а не у конкретной. Поэтому тебе нужно получать ItemStack у этой брони.

Можешь делать это в onArmorTick, где через itemStack проверяй на наличие NBT через NBTTagCompound#hasKey() и создавай его, если не существует. А потом по необходимости записывай в него через ItemStack#setTagCompound(nbt) или читай через ItemStack#getTagCompound()
 
Назад
Сверху