Сделать итем несгораемым в лаве/огне

Версия Minecraft
1.7.10
210
1
19
Сделать EntityItem непропадающим со временем понял как - в ItemExpireEvent выставлять e.extraLife > 0.

Насколько я понимаю, EntityItem имеет свои символические хп, которые получают урон при соприкосновении с огнём или лавой. Однако я не понял, где это отловить. LivingHurtEvent этот урон не обрабатывает. Подскажите, куда смотреть.
 
Решение
Можно сделать свою реализацию EntityItem и заменять на нее ванильную по событию EntityJoinWorldEvent.
В своей реализации можно сделать че угодно, например, переопределить setDead с пустой реализацией, чтобы предотвратить любое уничтожение выброшенного предмета
~~~
А еще стоит посмотреть в тинкерс констракте, там инструменты неуничтожимы, пока валяются в мире
7,099
324
1,510
Можно сделать свою реализацию EntityItem и заменять на нее ванильную по событию EntityJoinWorldEvent.
В своей реализации можно сделать че угодно, например, переопределить setDead с пустой реализацией, чтобы предотвратить любое уничтожение выброшенного предмета
~~~
А еще стоит посмотреть в тинкерс констракте, там инструменты неуничтожимы, пока валяются в мире
 
210
1
19
Java:
event.entity.invulnerable = true;
Не получается, ибо "The field Entity.invulnerable is not visible".
И не стоит, потому что см.ниже.

Можно сделать свою реализацию EntityItem и заменять на нее ванильную по событию EntityJoinWorldEvent
Отличная идея. Работает.
переопределить setDead с пустой реализацией
А вот это лишнее. Что если предмет в портал упал? Лень смотреть, но по-моему, тут случится дюп. Ну и вещь может, например, выпасть из мира.

Я сделал так:
Java:
@SubscribeEvent
    public void onEntityJoinWorld(EntityJoinWorldEvent event)
    {
        if (event.entity instanceof EntityItem && !(event.entity instanceof InvulnerableEntityItem)){
            EntityItem oldentity = (EntityItem) event.entity;
            ItemStack olditem = oldentity.getEntityItem();
            Item type = olditem.getItem();
            boolean swap = false;
            if(type == мой_предмет) swap = true; // тут мой список, ясен пень
            if(swap){
                InvulnerableEntityItem newentity = new InvulnerableEntityItem(event.world);
                newentity.setEntityItemStack(olditem);
                newentity.copyLocationAndAnglesFrom(oldentity);
                newentity.setVelocity(oldentity.motionX, oldentity.motionY, oldentity.motionZ);
                newentity.delayBeforeCanPickup = oldentity.delayBeforeCanPickup; // иначе подбирается при выкидывании
                oldentity.setDead();
                event.world.spawnEntityInWorld(newentity);
            }
        }
    }

В InvulnerableEntityItem сделал так:
Java:
    @Override
    public boolean attackEntityFrom(DamageSource dmgsrc, float z)
    {
        if(this.getEntityItem() != null && dmgsrc.equals(DamageSource.outOfWorld))super.attackEntityFrom(dmgsrc, z);// оставил урон от пустоты
        return false;
    }

И осталась проблема. Если вещь загорелась и лежит рядом с пламенем или лавой - она просто лежит, пока не подберешь. А вот если она утонула в лаве или попала в центр блока огня - если, короче, её стало не видно игроку - то при убирании лавы и огня она визуально исчезает. Если теперь подойти поближе - она падает в инвентарь. Короче, она становится невидимой. Как это исправить?


Хук в attackEntityFrom предмета.
В таких случаях я обычно пишу "дай готовый код".
 
210
1
19
сделай переменную публичной
Как я уже писал выше, делать вещь абсолютно неуязвимой я не хочу. И объяснил, почему. К тому же вопрос уже почти решён другим способом.
 

tox1cozZ

aka Agravaine
8,455
598
2,892
Переопределяем два метода у себя в предмете и выкидываем всю эту помойку с ивентами которую нагородили.
Java:
public boolean hasCustomEntity(ItemStack stack) {
        return true;
    }

    public Entity createEntity(World world, Entity location, ItemStack itemstack) {
        return new MyEntityItem(...);
    }
 
210
1
19
Переопределяем два метода у себя в предмете и выкидываем всю эту помойку с ивентами которую нагородили.
Java:
public boolean hasCustomEntity(ItemStack stack) {
        return true;
    }

    public Entity createEntity(World world, Entity location, ItemStack itemstack) {
        return new MyEntityItem(...);
    }
На самом деле предметов много, поэтому оставлю, как уже есть. К тому же в список несгораемых я добавил пару ванильных.


А по моему последнему вопросу есть идеи?
 
Сверху