Поглощающий блок

Версия Minecraft
1.12.2
49
5
Сделал блок, надо устроить так, чтобы при ударе по нему он записывал силу удара в NBT блока, но если по нему ударят не один раз - брать самый сильный удар и записать как раз таки силу этого удара в NBT блока. Как реализовать?
 
49
5
В каком смысле "сила удара"? Ты имеешь ввиду урон?
Если да, то боюсь это невозможно сделать для блока, тебе придется создавать энтити или тайлэнтити.
Ладно. Тогда как просто записать ударил ли игрок по блоку - или нет?
 
336
32
128
В обработчик событий
Java:
@SubscribeEvent
    public void writeDamageInNBT(LivingHurtEvent e) {
        if (e.entityLiving instanceof EntityPlayer) {
            if (e.source instanceof EntityDamageSource) {
                EntityPlayer to = ((EntityPlayer) e.entityLiving);
                if (to.getHeldItem().getItem() instanceof ItemsCommon.ItemElvenIngot) {
                    if (to.getHeldItem().hasTagCompound() == true) {
                        NBTTagCompound nbt = to.getHeldItem().getTagCompound();
                        e.setCanceled(true);

                        if (e.ammount > nbt.getInteger("damage")) {
                            nbt.setFloat("damage", e.ammount);

                        }

                    } else {
                        NBTTagCompound nbt = new NBTTagCompound();

                        nbt.setFloat("damage", e.ammount);
                        to.getHeldItem().setTagCompound(nbt);
                        e.setCanceled(true);

                    }
                }
            }

        }
    }
Значение в нбт получай с помощью nbt.getFloat("damage");
 
49
5
хм..
Java:
@SubscribeEvent
    public void writeDamageInNBT(LivingHurtEvent e) {
        if (e.getEntityLiving() instanceof EntityPlayer) {
            if (e.getSource() instanceof EntityDamageSource) {
                EntityPlayer to = ((EntityPlayer) e.getEntityLiving());
                if (to.getHeldItemMainhand().getItem() instanceof G8ussIngot) {
                    if (to.getHeldItemMainhand().hasTagCompound() == true) {
                        NBTTagCompound nbt = to.getHeldItemMainhand().getTagCompound();
                        e.setCanceled(true);
                        Minecraft.getMinecraft().world.playSound(to, to.getPosition(), RegisterS.TestSound, SoundCategory.PLAYERS, 1.0F, 1.0F);

                        if (e.getAmount() > nbt.getInteger("damage")) {
                            nbt.setFloat("damage", e.getAmount());

                        }

                    } else {
                        NBTTagCompound nbt = new NBTTagCompound();

                        nbt.setFloat("damage", e.getAmount());
                        to.getHeldItemMainhand().setTagCompound(nbt);
                        e.setCanceled(true);

                    }
                }
            }

        }
    }

чёт ниробит
 

Icosider

iMixin
Администратор
3,298
85
500
хм..
Java:
@SubscribeEvent
    public void writeDamageInNBT(LivingHurtEvent e) {
        if (e.getEntityLiving() instanceof EntityPlayer) {
            if (e.getSource() instanceof EntityDamageSource) {
                EntityPlayer to = ((EntityPlayer) e.getEntityLiving());
                if (to.getHeldItemMainhand().getItem() instanceof G8ussIngot) {
                    if (to.getHeldItemMainhand().hasTagCompound() == true) {
                        NBTTagCompound nbt = to.getHeldItemMainhand().getTagCompound();
                        e.setCanceled(true);
                        Minecraft.getMinecraft().world.playSound(to, to.getPosition(), RegisterS.TestSound, SoundCategory.PLAYERS, 1.0F, 1.0F);

                        if (e.getAmount() > nbt.getInteger("damage")) {
                            nbt.setFloat("damage", e.getAmount());

                        }

                    } else {
                        NBTTagCompound nbt = new NBTTagCompound();

                        nbt.setFloat("damage", e.getAmount());
                        to.getHeldItemMainhand().setTagCompound(nbt);
                        e.setCanceled(true);

                    }
                }
            }

        }
    }

чёт ниробит
Если у тебя крашит, то это потому-что Minecraft класса нет на сервере. И проверку !isRemote надо запилить, ибо данный код надо применять на серверной стороне, а не на клиенте.
 
336
32
128
Я же сделал проверку!
} else { NBTTagCompound nbt = new NBTTagCompound(); nbt.setFloat("damage", e.getAmount()); to.getHeldItemMainhand().setTagCompound(nbt); e.setCanceled(true);
это else условия о том что у стака есть нбт
 
49
5
Если у тебя крашит
Ну, не крашит но были ошибки, сейчас вроде уже нет когда зашёл и проверил, но когда меня бьёт моб - урон же должен отменяться, ведь так?
И проверку !isRemote надо запилить
так её делать надо не через if (!Minecraft.getMinecraft().world.isRemote) ? Вообщем сделал - не решило.

А ещё я не уверен, возможно нужно заменять
Java:
if (to.getHeldItemMainhand().getItem() instanceof G8ussIngot) {
на
Java:
if (to.getHeldItemMainhand().getItem() instanceof items.G8ussIngot) {
?
 

Maxik

Золотой Петушок
4,949
46
720
5,456
182
1,010
Есть мод MmmMmmMmmMmm, весь его контент - стойка для битья. можно посмотреть как там сделано
 
Сверху