Случайный урон у меча

Версия Minecraft
1.12.2
Здравствуйте! Есть WeaponDagger extends ItemSword, которому через Multimap задается дамаг:
Java:
package ru.afvbkz.tescraft.Weapon;

import com.google.common.collect.Multimap;

import net.minecraft.entity.SharedMonsterAttributes;
import net.minecraft.entity.ai.attributes.AttributeModifier;
import net.minecraft.inventory.EntityEquipmentSlot;
import net.minecraft.item.ItemSword;
import ru.afvbkz.tescraft.TESCraft;

public class WeaponDagger extends ItemSword
{
    private double attackDamage;
    public WeaponDagger(String name, ToolMaterial material)
    {
        super(material);
        this.setRegistryName(name);
        this.setUnlocalizedName(name);
        this.attackDamage = Math.random()*10
        this.setMaxDamage(250);
        this.setCreativeTab(TESCraft.TESC);
       
    }
    public Multimap<String, AttributeModifier> getItemAttributeModifiers(EntityEquipmentSlot equipmentSlot)
    {
        Multimap<String, AttributeModifier> multimap = super.getItemAttributeModifiers(equipmentSlot);
        multimap.clear();
        if (equipmentSlot == EntityEquipmentSlot.MAINHAND)
        {
            multimap.put(SharedMonsterAttributes.ATTACK_DAMAGE.getName(), new AttributeModifier(ATTACK_DAMAGE_MODIFIER, "Weapon modifier", (double)this.attackDamage, 0));
            multimap.put(SharedMonsterAttributes.ATTACK_SPEED.getName(), new AttributeModifier(ATTACK_SPEED_MODIFIER, "Weapon modifier", -1.5D, 0));
        }

        return multimap;
    }
}

При таком коде, очевидно, при запуске майнкрафта генерируется рандомный урон кинжала. Как сделать так, чтобы при каждом ударе был случайный урон?
 
Последнее редактирование:
Есть одна проблема: у меня все оружия используют свою приватную переменную attackDamage. И у всех она рассчитывается по собственной формуле, исходя из материала. В эвенте надо проверять, какое оружие лежит в руке? Или есть нормальный способ?
 
2,505
81
397
Есть одна проблема: у меня все оружия используют свою приватную переменную attackDamage. И у всех она рассчитывается по собственной формуле, исходя из материала. В эвенте надо проверять, какое оружие лежит в руке? Или есть нормальный способ?

Создай в своем мече, например, такой метод:
Java:
public int modifyDamage(EntityLivingBase entity, ItemStack stack, int currDamage) {
    return currDamage;
}

В ивенте проверяй, что активный итем - это твой меч и вызывай этот метод, тем самым изменяя урон.

Если у тебя нет своего какого-нибудь базового итема, куда можно было бы всунуть этот метод, то создай интерфейс с таким методом. И в своих мечах реализуй этот интерфейс.
 
Не совсем понял, что делает этот метод, ведь он никак не связан с Multimap и не может изменить урон.

У меня 17 классов оружия и 9 материалов. Тогда, получается, в ивенте проверять, какой из 153 экземпляров лежит в руке игрока?
 
А возможно ли дамажить на рандомное количество единиц, иcходя из дамага оружия, которое лежит в руке? Типа hitEntity(Player.getItemInMainHand.attackDamage)? Ну я примерно. Должен же быть определенный надбавок в уроне, который зависит от типа самого оружия?
 
2,505
81
397
Я бы просто в hitEntity дамажил моба еще на рандомное количество единиц.
Это немного костыль. И там непонятно, какой урон будет применен на цель. Может там крит прыжка, может модификаторы зелья, может еще что-нибудь. Мне в свое время такое решение не подошло.
 
178
4
42
Это немного костыль. И там непонятно, какой урон будет применен на цель. Может там крит прыжка, может модификаторы зелья, может еще что-нибудь. Мне в свое время такое решение не подошло.
Можно же вызвать super() в начале метода, и выставить стандартный урон предмета на 0.
Тогда применится туда все, что должно, и потом можно в hitEntity нанести урон, который надо.
 
2,505
81
397
Тогда добавлять прям в мультимапу рандомный урон. Ну и как-то обновлять стак при ударе(в нбт флаг добавлять или что-то типа этого), что метод снова вызвался.
Да ну, бред.
Я у себя просто хукнулся в метод, где урон применяется на сущность. И перед самим применением урона вызываю свой ивент, тем самым накладывая изменения так, как мне нужно. Но такое решение конечно же не подойдет ТСу. На самом деле, так сделал из-за того, что все равно пришлось еще пару ивентов запускать.

Можно же вызвать super() в начале метода, и выставить стандартный урон предмета на 0.
Тогда применится туда все, что должно, и потом можно в hitEntity нанести урон, который надо.
Ну я даже не знаю, что более извращенное) Мое решение или твое. Но разница в том, что у тебя реально костыль, а у меня нет :)
 
Но такое решение конечно же не подойдет ТСу.
Почему?

Странно, что некостыльных методов нет.

А вообще, может, когда играю с модами, мне кажется, что урон рандомный? Может, это все обстоятельства? Стоит ли над этим заморачиваться?
 
178
4
42
Да, просто я не знаю, как это реализовать.
Написал же я выше, как это реализовать:
Переопредели метод hitEntity в классе своего предмета. И там уже наноси урон, который нужно.
Можно же вызвать super() в начале метода, и выставить стандартный урон предмета на 0.
Тогда применится туда все, что должно, и потом можно в hitEntity нанести урон, который надо.
 
Пусть я создам метод
Java:
        public int hitEntity(){
        final int max = (int) Math.round(1.3*100);
        final int min = (int) Math.round(max*2/3);
        return (int)(Math.random() * ((max - min) + 1)) + min;
        
        
    }


Тогда в Multimap я должен заменить this.attackDamage = this.hitEntity?
Для чего это нужно? Я не понимаю принцип
 
Сверху