event.entity.invulnerable = true;
Не получается, ибо "The field Entity.invulnerable is not visible".
И не стоит, потому что см.ниже.
Можно сделать свою реализацию EntityItem и заменять на нее ванильную по событию EntityJoinWorldEvent
Отличная идея. Работает.
переопределить setDead с пустой реализацией
А вот это лишнее. Что если предмет в портал упал? Лень смотреть, но по-моему, тут случится дюп. Ну и вещь может, например, выпасть из мира.
Я сделал так:
@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 сделал так:
@Override
public boolean attackEntityFrom(DamageSource dmgsrc, float z)
{
if(this.getEntityItem() != null && dmgsrc.equals(DamageSource.outOfWorld))super.attackEntityFrom(dmgsrc, z);// оставил урон от пустоты
return false;
}
И осталась проблема. Если вещь загорелась и лежит рядом с пламенем или лавой - она просто лежит, пока не подберешь. А вот если она утонула в лаве или попала в центр блока огня - если, короче, её стало не видно игроку - то при убирании лавы и огня она визуально исчезает. Если теперь подойти поближе - она падает в инвентарь. Короче, она становится невидимой. Как это исправить?
Хук в attackEntityFrom предмета.
В таких случаях я обычно пишу "дай готовый код".