Броня

Версия Minecraft
1.7.10
929
30
66
Всем привет.

Кто может помочь , не разбираюсь в нбт , нужно если ты не владелец , то чужая броня на тебе ломается или нельзя одевать.
Java:
public static class Helmet extends ItemArmor {

      public Helmet(ArmorMaterial armorMaterial, int par3, int par4) {
         super(armorMaterial, par3, par4);
         this.setCreativeTab(bestfoxy.creativeTab);
         this.setUnlocalizedName("Helmet");
         this.setTextureName("bestfoxy:helmet0");
      }

      public void onUpdate(ItemStack stack, World world, Entity entity, int par4, boolean par5) {
         if(!stack.hasTagCompound()) {
            stack.stackTagCompound = new NBTTagCompound();
         
         if(!world.isRemote && !stack.stackTagCompound.hasKey(owner) && entity instanceof EntityPlayer) {
            EntityPlayer player = (EntityPlayer)entity;
            stack.stackTagCompound.setString(owner, player.getDisplayName());
         }

    }
 
Последнее редактирование:
@BestFoxy:
Во-первых код не мой, я лишь его поправил,
Во-вторых если это был мой код, то код был по больше (если конечно-бы я не разошёлся-бы, тогда он ещё больше было-бы).
WhiteWarrior предложил тебе код, есть вероятность, что даже при этом понадобиться код, чтобы эту броню убрать из слота, если itemStack.stackSize меньше или равно 0, то в этом слоте делать его null.
И ты должен сам дополнять свой код, то что могут предложить, это может быть абстрактным кодом, а не точным.
 
Извиняюсь за оффтоп.
@WhiteWarrior, на счёт брони не знаю, а у итемом в инвентаре бывает такое, что "stackSize <= 0", а они ещё в инвентаре и даже бывают в так называем призрачном состоянии. На клиенте их нет, а на сервере есть или даже наоборот. Чтобы их обнаружит (на клиенте) нужно нажать на слот из которого он исчез (на клиенте) и бывает что инвентарь глючит, меняются предметы местами в слотах или выкидывает с ошибкой (Null) о том что мы пытаемся брать того чего нет.
 
Взять аргумент ItemStack,
проверить его на ItemStack#stackSize <= 0,
взять из него Item, этот Item сделать ItemArmor'ом,
взять int значение в какой слот он вставляется,
получить слот в котором находиться,
(не обязательно) проверить на то, что ItemStack == ItemStack'у из аргумента,
и этот слот обнулить - null.
 
Хм... Даже есть куда проще есть способ, тот способ который я описывал, он больше подходит для тик эвента игрока. А в броне можно и так:
Java:
@Override
public void onArmorTick(World world, EntityPlayer player, ItemStack itemStack) {
    if (itemStack.stackSize <= 0)
        player.inventory.armorInventory[3 - armorType] = null;
}
 
Ясно. Если бы был свой, то можно было бы просто запретить надевание чужой брони в Slot. Да и метку хозяина вешать там же при надевании. Дамажить броню, проверять и назначать владельца в тикерах - костыли. Прилично такое не сделать без ASM (для ванильного инвентаря).
 
Забыл и не хотел отключать доп.инвентарь для видео.
Java:
    @Override
    public void onArmorTick(World world, EntityPlayer player, ItemStack itemStack) {
        if (!world.isRemote) {

            if (itemStack.hasTagCompound() && itemStack.getTagCompound().hasKey(owner, NBT.TAG_STRING) &&
                    !itemStack.getTagCompound().getString(owner).equals(player.getCommandSenderName()))
                itemStack.setItemDamage(itemStack.getItemDamage()+1);

            if (itemStack.getItemDamage() >= itemStack.getMaxDamage())
                itemStack.stackSize--;

            if (itemStack.stackSize <= 0)
                player.inventory.armorInventory[3 - armorType] = null;
        }
    }

    @Override
    public void onUpdate(ItemStack itemStack, World world, Entity entity, int slot, boolean isHand) {
        if (!itemStack.hasTagCompound())
            itemStack.setTagCompound(new NBTTagCompound());

        if (!world.isRemote && !itemStack.getTagCompound().hasKey(owner, NBT.TAG_STRING)) {
            itemStack.getTagCompound().setString(owner, entity.getCommandSenderName());
        }

    }

    @Override
    public void addInformation(ItemStack itemStack, EntityPlayer playerIn, List lines, boolean advanced) {
        if(itemStack.hasTagCompound() && itemStack.getTagCompound().hasKey(owner, NBT.TAG_STRING)) {
            lines.add(EnumChatFormatting.GRAY + "Owner: " + itemStack.getTagCompound().getString(owner));
        }
    }
 
Последнее редактирование:
Назад
Сверху