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

Версия Minecraft
1.12.2

GoogleTan

Картошка :3
1,354
43
310
Собственно установить мечу скорость атаки. И желательно без хуков.....
 
Решение
Не очень понимаю эту механику, но в ванильном коде значение этого параметра отрицательно
multimap.put(SharedMonsterAttributes.ATTACK_SPEED.getName(), new AttributeModifier(ATTACK_SPEED_MODIFIER, "Weapon modifier", -2.4000000953674316D, 0))
Нужно сделать очень низкую скорость атаки?
Еслм посмотреть значение этого параметра у инструментов, то значение еще меньше(-2.8).
Поэтому попробуй поставить очень низкое значение, типо, -100
7,099
324
1,509
По идее, нужно переопределить getItemAttributeModifiers в своем мече, установив для SharedMonsterAttributes.ATTACK_SPEED нужное значение скорости
 

GoogleTan

Картошка :3
1,354
43
310
Что я не так делаю?:
@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;
    }
 
7,099
324
1,509
Не очень понимаю эту механику, но в ванильном коде значение этого параметра отрицательно
multimap.put(SharedMonsterAttributes.ATTACK_SPEED.getName(), new AttributeModifier(ATTACK_SPEED_MODIFIER, "Weapon modifier", -2.4000000953674316D, 0))
Нужно сделать очень низкую скорость атаки?
Еслм посмотреть значение этого параметра у инструментов, то значение еще меньше(-2.8).
Поэтому попробуй поставить очень низкое значение, типо, -100
 
7,099
324
1,509
А должно быть можно? Это броня?
Если не должно быть, добавь проверку equipmentSlot
 

tox1cozZ

aka Agravaine
8,454
598
2,890
7,099
324
1,509

GoogleTan

Картошка :3
1,354
43
310
Оказалось что для начала надо удалить старую скорость атаки, а потом добавить новую.
Что вышло:
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. помогло не это
 
7,099
324
1,509

tox1cozZ

aka Agravaine
8,454
598
2,890
112
5
16
Я переопределял
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
8,454
598
2,890
Что за дибилизм? Господи, зачем брать заполненную мапу из супера и удалять так костыльно из нее элементы, если можно СОЗДАТЬ НОВУЮ МАПУ И СРАЗУ ЗАПОЛНИТЬ НУЖНЫМИ ЗНАЧЕНИЯМИ?
 
112
5
16
Что за дибилизм? Господи, зачем брать заполненную мапу из супера и удалять так костыльно из нее элементы, если можно СОЗДАТЬ НОВУЮ МАПУ И СРАЗУ ЗАПОЛНИТЬ НУЖНЫМИ ЗНАЧЕНИЯМИ?
нашел эту реализацию на англ. форуме , не стал переделывать за незнанием.
но сейчас попробую переписать новую мапу как ты советуешь
 
Сверху