Деспавн моба при выходе из мира

Версия Minecraft
1.7.10
API
Forge
Здравствуйте. знает ли кто, как можно убрать моба, когда игрок выходит из мира?

Правда есть пару (почти) замечаний:

1) PlayerEvent.PlayerLoggedOutEvent не подходит, тк не работает на интегрированном сервере

2) WorldEvent.Unload также не подходит, тк чанки уже выгружены, и я не могу ничего сделать с мобом

3) WorldEvent.Save хоть и работает, но тоже не подходит. Цель кода - спавнить моба (который не может деспавнится, и будет каждые n тиков телепортироваться к игроку), а WorldEvent.Save срабатывает даже если зайти в меню паузы, а не выйти из мира.

Еще одна важная вещь:
моб должен быть создан только 1 раз в PlayerEvent.PlayerLoggedInEvent, и на протяжении игры оставаться нетронутым (нельзя удалить во время игры, после чего заспавнить еще раз), и может быть удален только после выхода из мира.

Хотя уже даже не знаю что можно использовать, но может быть есть еще способы или ивенты для этого?


Java:
public static final HashMap<UUID, EntityZombie> Entities = new HashMap<>();

    @SubscribeEvent
    public void PlayerLoggedInEvent(PlayerEvent.PlayerLoggedInEvent event) {
        if (!event.player.worldObj.isRemote) {
            EntityPlayer player = event.player;
            UUID playerID = player.getUniqueID();

            EntityZombie newEnt = new EntityZombie(player.worldObj);
            newEnt.setPosition(player.posX, player.posY, player.posZ);
            player.worldObj.spawnEntityInWorld(newEnt);
            Entities.put(playerID, newEnt);
        }
    }

    @SubscribeEvent
    public void WorldEventSave(WorldEvent.Save event) {
        if (!event.world.isRemote) {
            for (Map.Entry<UUID, EntityZombie> entry : Entities.entrySet()) {
                EntityZombie acac = entry.getValue();
                if (acac != null) {
                    acac.setDead();
                    event.world.removeEntity(acac);

                    Chunk chunk = event.world.getChunkFromBlockCoords((int) acac.posX, (int) acac.posZ);
                    chunk.isModified = true;
                }
            }
            Entities.clear();
        }
    }
 
Решение
Вроде как нашел решение: в качестве ивента для SP использовал FMLServerStoppingEvent с getSide() == CLIENT, потом находил чанк где находится моб (getChunkFromBlockCoords(entity.posX, entity.posZ)) и ставил chunk.isModified = true; (чтоб entity.setDead(); применялся). А для MP использовал все тот-же PlayerLoggedOutEvent. Работает как на выделенном, так и на интегрированном
Ищи события LivingSpawnEvent.AllowDespawn (или подобные) на своей версии
Если моб твой, то переопредели canDespawn()
LivingSpawnEvent.AllowDespawn запускается вроде же каждый тик? А как привязать его к выходу из мира?
 
Вроде как нашел решение: в качестве ивента для SP использовал FMLServerStoppingEvent с getSide() == CLIENT, потом находил чанк где находится моб (getChunkFromBlockCoords(entity.posX, entity.posZ)) и ставил chunk.isModified = true; (чтоб entity.setDead(); применялся). А для MP использовал все тот-же PlayerLoggedOutEvent. Работает как на выделенном, так и на интегрированном
 
Назад
Сверху