Скорость атаки

Сообщения
687
Лучшие ответы
10
Реакции
125
Версия Minecraft
1.12.2
Собственно установить мечу скорость атаки. И желательно без хуков.....
 
Сообщения
4,883
Лучшие ответы
145
Реакции
798
По идее, нужно переопределить getItemAttributeModifiers в своем мече, установив для SharedMonsterAttributes.ATTACK_SPEED нужное значение скорости
 
Сообщения
687
Лучшие ответы
10
Реакции
125
Что я не так делаю?:
@Override
    public Multimap<String, AttributeModifier> getItemAttributeModifiers(EntityEquipmentSlot equipmentSlot) {
        Multimap<String, AttributeModifier> multimap = super.getItemAttributeModifiers(equipmentSlot);
        multimap.put(SharedMonsterAttributes.ATTACK_SPEED.getName(), new AttributeModifier(ATTACK_SPEED_MODIFIER, "Weapon modifier", 0.000000001D, 1));
        return multimap;
    }
 
Сообщения
4,883
Лучшие ответы
145
Реакции
798
Не очень понимаю эту механику, но в ванильном коде значение этого параметра отрицательно
multimap.put(SharedMonsterAttributes.ATTACK_SPEED.getName(), new AttributeModifier(ATTACK_SPEED_MODIFIER, "Weapon modifier", -2.4000000953674316D, 0))
Нужно сделать очень низкую скорость атаки?
Еслм посмотреть значение этого параметра у инструментов, то значение еще меньше(-2.8).
Поэтому попробуй поставить очень низкое значение, типо, -100
 
Сообщения
687
Лучшие ответы
10
Реакции
125
1581695881429.png
P.S. В слоты под броню надеть нельзя.
 
Сообщения
687
Лучшие ответы
10
Реакции
125
Вообще это мечь.... Это к тому что написано если на ногах, если на голове и т.д.
-----
Кстати что делает nameIn?
 
Сообщения
687
Лучшие ответы
10
Реакции
125
Теперь не пишет) Но все ровно тоже самое все - скорость= 1.6
 
Сообщения
4,883
Лучшие ответы
145
Реакции
798
Сообщения
687
Лучшие ответы
10
Реакции
125
Оказалось что для начала надо удалить старую скорость атаки, а потом добавить новую.
Что вышло:
Java:
    @Override
    public Multimap<String, AttributeModifier> getItemAttributeModifiers(EntityEquipmentSlot equipmentSlot)
    {
        if (equipmentSlot == EntityEquipmentSlot.MAINHAND)
        {
            Multimap<String, AttributeModifier> multimap = super.getItemAttributeModifiers(EntityEquipmentSlot.MAINHAND);
            multimap.removeAll(SharedMonsterAttributes.ATTACK_SPEED.getName());
            multimap.put(SharedMonsterAttributes.ATTACK_SPEED.getName(), new AttributeModifier(ATTACK_SPEED_MODIFIER, "Weapon modifier", 10D, 0));
            return multimap;
        }
        return super.getItemAttributeModifiers(equipmentSlot);
    }
-----
@hohserg1 if (equipmentSlot == EntityEquipmentSlot.MAINHAND)
p.s. помогло не это
 
Сообщения
4,883
Лучшие ответы
145
Реакции
798

tox1cozZ

aka Agravaine
Модератор
Сообщения
6,440
Лучшие ответы
370
Реакции
1,699
Сообщения
17
Лучшие ответы
0
Реакции
4
Я переопределял
Java:
@Override
    public Multimap<String, AttributeModifier> getAttributeModifiers(EntityEquipmentSlot slot, ItemStack stack) {
        final Multimap<String, AttributeModifier> modifiers = super.getAttributeModifiers(slot, stack);

        if (slot == EntityEquipmentSlot.MAINHAND) {
            replaceModifier(modifiers, SharedMonsterAttributes.ATTACK_DAMAGE, ATTACK_DAMAGE_MODIFIER, attackDamage);
            replaceModifier(modifiers, SharedMonsterAttributes.ATTACK_SPEED, ATTACK_SPEED_MODIFIER, attackSpeed);
        }

        return modifiers;
    }


    private void replaceModifier(Multimap<String, AttributeModifier> modifierMultimap, IAttribute attribute, UUID id, double multiplier) {
        // Get the modifiers for the specified attribute
        final Collection<AttributeModifier> modifiers = modifierMultimap.get(attribute.getName());
        // Find the modifier with the specified ID, if any
        final Optional<AttributeModifier> modifierOptional = modifiers.stream().filter(attributeModifier -> attributeModifier.getID().equals(id)).findFirst();

        if (modifierOptional.isPresent()) { // If it exists,
            final AttributeModifier modifier = modifierOptional.get();
            modifiers.remove(modifier); // Remove it
            modifiers.add(new AttributeModifier(modifier.getID(), modifier.getName(), modifier.getAmount() * multiplier, modifier.getOperation())); // Add the new modifier
        }
    }
и после этого в классе где ты инициализируешь итемы расчеты сделал.
Java:
public static final Item Valik= new SwordWeap("Vitalik1", Putin_Tool , 7.0F , -3.5F);
Сделал расчеты и получил так :

// damage ЗА КАЖДЫЕ (0 ИЗНАЧАЛЬНО ИМЕЕТ 1 атаку!!!) 0,25 ДАЁТ 1 УРОН
// speed attack 1.0(значение в коде) == 1.6(в игре)
// за каждые 0,1 +- 0,24 СПИДАТАКИ
// 1.0 = 1.6
// ЧЕМ МЕНЬШЕ МОДИФИКАТОР ТЕМ БОЛЬШЕ СКОРОСТЬ АТАКИ!!1
// за 0.1 = 0.24 спидатаки
//
 

tox1cozZ

aka Agravaine
Модератор
Сообщения
6,440
Лучшие ответы
370
Реакции
1,699
Что за дибилизм? Господи, зачем брать заполненную мапу из супера и удалять так костыльно из нее элементы, если можно СОЗДАТЬ НОВУЮ МАПУ И СРАЗУ ЗАПОЛНИТЬ НУЖНЫМИ ЗНАЧЕНИЯМИ?
 
Сообщения
17
Лучшие ответы
0
Реакции
4
Что за дибилизм? Господи, зачем брать заполненную мапу из супера и удалять так костыльно из нее элементы, если можно СОЗДАТЬ НОВУЮ МАПУ И СРАЗУ ЗАПОЛНИТЬ НУЖНЫМИ ЗНАЧЕНИЯМИ?
нашел эту реализацию на англ. форуме , не стал переделывать за незнанием.
но сейчас попробую переписать новую мапу как ты советуешь
 
Сверху