Эффекты при ношении брони.

Версия Minecraft
1.12.2
586
32
136
Как изменить к примеру макс. кол-во ХП, когда броня одета, а когда снята, сделать как было раньше?
Пример: Я одел свои поножи, у меня здоровье выросло на 10%
 
Последнее редактирование:
145
7
31
Как изменить к примеру макс. кол-во ХП, когда броня одета, а когда снята, сделать как было раньше?
Пример: Я одел свои поножи, у меня здоровье выросло на 10%
Каждый тик проверяй, что находится в слотах брони игрока, если это определённая броня, то изменяй макс. количество хп(setMaxHealth).
 

tox1cozZ

aka Agravaine
8,456
598
2,893
2,505
81
397
Открой ванильный меч. Там должен быть метод, где в мапу (multimap) кладутся аттрибуты (урон и скорость). Теперь скопипасти этот метод себе в броню, заменив урон и скорость на здоровье.
 
586
32
136
Java:
        private static UUID uuid = UUID.fromString("42c8426d-7e85-4a61-a883-72e85c656fab");
    @Override
    public void onArmorTick(World world, EntityPlayer player, ItemStack itemStack) {
        if(world.isRemote)return;
        AbstractAttributeMap map = player.getAttributeMap();
        if(map.getAttributeInstance(SharedMonsterAttributes.MOVEMENT_SPEED).getModifier(uuid) != null){
            map.getAttributeInstance(SharedMonsterAttributes.MOVEMENT_SPEED).removeModifier(uuid);
        }
        if(player.inventory.armorItemInSlot(0).getItem() == ItemsMod.DARK_BOOTS) {
            if (player.inventory.armorItemInSlot(1).getItem() == ItemsMod.DARK_LEGS) {
                if (player.inventory.armorItemInSlot(2).getItem() == ItemsMod.DARK_CHEST) {
                    if (player.inventory.armorItemInSlot(3).getItem() == ItemsMod.DARK_HEAD) {
                        map.getAttributeInstance(SharedMonsterAttributes.MOVEMENT_SPEED).applyModifier(new AttributeModifier(uuid, "Lol", -10F, 1));
                    }
                }
            }
        }
    }
Сделал вот такой вот код, нормально?
 
2,505
81
397
Ну не в инвентаре, а в руке. И можно с таким же успехом вставить проверки.
А ещё все атрибуты применятся только при надевании и сейвово исчезнут при снятии.
А в его коде атрибут изменяется каждый тик. Это дёргает лишнюю синхронизацию на клиент. Дак ещё и есть шанс, что он вовсе не исчезнет при снятии.
 

tox1cozZ

aka Agravaine
8,456
598
2,893
Вот, можно переделать ванильный код и добавить свои проверки там и т.д
Java:
for (int j = 0; j < 5; ++j)
            {
                ItemStack itemstack = this.previousEquipment[j];
                ItemStack itemstack1 = this.getEquipmentInSlot(j);

                if (!ItemStack.areItemStacksEqual(itemstack1, itemstack))
                {
                    ((WorldServer)this.worldObj).getEntityTracker().func_151247_a(this, new S04PacketEntityEquipment(this.getEntityId(), j, itemstack1));

                    if (itemstack != null)
                    {
                        this.attributeMap.removeAttributeModifiers(itemstack.getAttributeModifiers());
                    }

                    if (itemstack1 != null)
                    {
                        this.attributeMap.applyAttributeModifiers(itemstack1.getAttributeModifiers());
                    }

                    this.previousEquipment[j] = itemstack1 == null ? null : itemstack1.copy();
                }
            }
 
Сверху