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

Версия 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;
    }
}

При таком коде, очевидно, при запуске майнкрафта генерируется рандомный урон кинжала. Как сделать так, чтобы при каждом ударе был случайный урон?
 
Последнее редактирование:
178
4
42
Что такого непонятного в слове "переопределить"? В классе Item есть метод hitEntity. Берешь и переопределяешь его в своем классе:
Java:
@Override
public boolean hitEntity(ItemStack par1ItemStack, EntityLivingBase par2EntityLivingBase, EntityLivingBase par3EntityLivingBase) {  
    super(par1ItemStack, par2EntityLivingBase, par3EntityLivingBase);
    if (par2EntityLivingBase instanceof EntityPlayer)
        par2EntityLivingBase.attackEntityFrom(DamageSource.causePlayerDamage((EntityPlayer) par2EntityLivingBase), damage);
    else
        par2EntityLivingBase.attackEntityFrom(DamageSource.causeMobDamage(par2EntityLivingBase), damage);

    par1ItemStack.damageItem(1, par3EntityLivingBase);
    return true;
}
damage меняешь на урон, который тебе нужен.
А тут
Тогда в Multimap я должен заменить this.attackDamage = this.hitEntity?
нужно this.attackDamage = 0 // ну или другой стандартный урон, к которому ты прибавляешь рандомный
 
Получилось, но пока урон фиксированный. Надо в эвенте обновлять дамаг конкретного оружия (прибавлять определенное кол-во урона?)
 
Аааа, понятненько

Сейчас класс кинжала выглядит вот так:
Java:
package ru.afvbkz.tescraft.Weapon;

import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.item.ItemSword;
import net.minecraft.util.DamageSource;
import ru.afvbkz.tescraft.TESCraft;

public class WeaponDagger extends ItemSword
{
    public static int attackDamage;
    public WeaponDagger(String name, ToolMaterial material)
    {
        super(material);
        this.setRegistryName(name);
        this.setUnlocalizedName(name);
        this.setMaxDamage(250);
        this.setCreativeTab(TESCraft.TESC);
        
    }

    @Override
    public boolean hitEntity(ItemStack par1ItemStack, EntityLivingBase par2EntityLivingBase, EntityLivingBase par3EntityLivingBase)
    { 
        super.hitEntity(par1ItemStack, par2EntityLivingBase, par3EntityLivingBase);
        if (par2EntityLivingBase instanceof EntityPlayer)
            par2EntityLivingBase.attackEntityFrom(DamageSource.causePlayerDamage((EntityPlayer) par2EntityLivingBase), 100);
        else
            par2EntityLivingBase.attackEntityFrom(DamageSource.causeMobDamage(par2EntityLivingBase), 100);
        par1ItemStack.damageItem(1, par3EntityLivingBase);
        return true;
    }
}

Несмотря на то, что урон выставлен 100, даггер дамажит 14. Думаю, что он берет урон из ItemSword и рассчитывает, исходя из материала, не обращая внимания на hitEntity. Если убрать super(material), жалуется на его отсутствие
 

Eifel

Модератор
1,624
79
609
Мне кажется, что тут в самом методе код написан плохо. par2EntityLivingBase это по-моему тот, кто ударяет, а par3EntityLivingBase - кого ударяют. Т.е. если это так и ты тестишь в креативе, то дамажит не твою цель а тебя, а цели идет стандартный урон... Может такое быть
 
2,505
81
397
И при убийстве игрока получать в консоль что-то типа "Игрок выпал из мира". Такое себе.
На самом деле вот чистый урон (в данном случае от игрока): DamageSource.causePlayerDamage(player).setDamageBypassesArmor().
 
7,099
324
1,510
Ты рандом не юзаешь для attackEntityFrom.
Нужно как-то так:
par2EntityLivingBase.attackEntityFrom(DamageSource.causePlayerDamage((EntityPlayer) par2EntityLivingBase), par2EntityLivingBase.world.rand.nextInt(100));
rand.nextInt(100) - вернет случайное целое число от 0 до 100(вроде не включительно)
 
Так что делать? Игнорировать броню некоторых мобов? Поставить урон, не считая брони, но тогда это читерство по отношению к другим игрокам. Нужен ли вообще рандом, или оставить все постоянным и зависящим только от крита?
 
178
4
42
В случае, когда атакуемый - моб, можешь попробовать вписать это:
Java:
par2EntityLivingBase.attackEntityFrom(DamageSource.causeMobDamage(par2EntityLivingBase).setDamageBypassesArmor(), par2EntityLivingBase.world.rand.nextInt(100));
Вообще, сиди и экспериментируй. В подобных случаях я так и делал.
 
Сверху