Размещение сущностей в мире

Версия Minecraft
1.12.2
API
Forge
172
5
14
я задолбался, мудохался с этим 2 дня, в итоге решил спросить здесь
В общем план таков, у меня есть мир, в мире есть данж, в данже нужно разместить сущности каждый раз при заходе сущность будут пере генерироваться генерироваться они будут на основе двумерного массива который будет генерироваться на основе карты данжа и бла бла бла
Это не особо важно я совсем разобрался, кроме размещения сущностей точнее когда их размещать, вот в чем проблема когда генерируется сам данж "генерируется он до того как игрок попал в измерение" при их размещении они не размещаются при этом если вести команду "вызывает тот же метод что и при генерации" находясь в измерении все работает
но видимо от объема сущностей серверу становится плохо он виснет "площадь 17 на 17 чанков в каждом чанке кто-то да есть"
для размещения использую:
Java:
WorldServer world = FMLCommonHandler.instance().getMinecraftServerInstance().getWorld(ancient_world_dim_id);

EntityEldritchGuardian e = new EntityEldritchGuardian(world);
e.getEntityData().setLong("A_ID", mobId);
e.setPositionAndUpdate(x, 81, z);
world.spawnEntity(e);
чанки я грузил
Java:
if (!world.getChunkFromBlockCoords(new BlockPos(x, 81, z)).isLoaded())
    world.getChunkFromBlockCoords(new BlockPos(x, 81, z)).markLoaded(true);
как вариант дробить массив записывать в NBT, и когда чанк грузится получать его координату на основе этой координаты получать координату в массиве и спавнить сущности.
но мне лень переписывать это еще раз, м.б я делаю что-то не правильно, и еще не решен вопрос с диспавном
 
Последнее редактирование:
Решение
Я без понятия как это реализовать тот-же эвент onWorldLoad вызывается раз 10 причем если грузить мир из главного меню то вызывался он будет другое количество раз но надо будет попробовать
При заходе в мир, сначала загружаются все измерения, однако почти сразу выгружается, если в нем нет игроков.
У твоего ивента есть поле dimension (не помню так ли оно называется). Сделай проверку на конкретный номер.
Но враждебные мобы же деспавнятся
Либо через определëнное время либо если не взаимодействуют с игроком возможно в выгруженом чанке они не деспавнятся
У меня не деспавятся. Хз, как-то не находил логику с деспавном, мб вечером посмотрю. Помню только, что поле forceSpawn является одним из 2-х факторов появления entity в чанке.
116
13
13
я совсем разобрался, кроме размещения сущностей точнее когда их размещать
Так а в чем проблема спавнить их, когда на сервере загружается нужный dimension.
и еще не решен вопрос с диспавном
А вот тут вообще не понял. Спавн entity же зависит либо от того загружен ли чанк или, если не загружен, чему равна переменная forceSpawn у самого entity.
А как мы знаем - если чанк выгружается, то соответственно все entity в этом чанке пропадают из списка активных в самом мире.

Если я как-то неправильно понял, то просьба переформулировать вопрос
 
346
25
94
Тот же Twilight Forest генерирует не сами сущности, а спавнера с ними, которые заспавнят сущность и самоуничтожатся при загрузке чанка. Хороший вариант, если хочешь закрепить сущность за определённой позицией в структуре. Я не особо понял задачу про перегенерирование и деспавн, но думаю дал наводку, в какую сторону копать, плюсом, у тайлов есть метод, который вызывается при загрузке чанка, onChunkLoad/onChunkLoaded/onLoaded, что-то подобное.
 
172
5
14
Так а в чем проблема спавнить их, когда на сервере загружается нужный dimension.
Я без понятия как это реализовать тот-же эвент onWorldLoad вызывается раз 10 причем если грузить мир из главного меню то вызывался он будет другое количество раз, но надо будет попробовать
А вот тут вообще не понял. Спавн entity же зависит либо от того загружен ли чанк или, если не загружен, чему равна переменная forceSpawn у самого entity.
А как мы знаем - если чанк выгружается, то соответственно все entity в этом чанке пропадают из списка активных в самом мире.
Это факт
Но враждебные мобы же деспавнятся
Либо через определëнное время либо если не взаимодействуют с игроком возможно в выгруженом чанке они не деспавнятся
Мобы не мои
 
Последнее редактирование:
172
5
14
Тот же Twilight Forest генерирует не сами сущности, а спавнера с ними, которые заспавнят сущность и самоуничтожатся при загрузке чанка. Хороший вариант, если хочешь закрепить сущность за определённой позицией в структуре.
Уточнение: структура одна на мир и привязана к координатам, так что по идее возится со спавнерами нет смысла
Но идея прекрасная!
Я не особо понял задачу про перегенерирование
Каждый раз когда игрок умирает структура сносится и генерируется заново сущности в том числе
Решил присваиванием индефикатора если он устаревший то сущность не появляется
Хотя можно было бы и легче
 
Последнее редактирование:
116
13
13
Я без понятия как это реализовать тот-же эвент onWorldLoad вызывается раз 10 причем если грузить мир из главного меню то вызывался он будет другое количество раз но надо будет попробовать
При заходе в мир, сначала загружаются все измерения, однако почти сразу выгружается, если в нем нет игроков.
У твоего ивента есть поле dimension (не помню так ли оно называется). Сделай проверку на конкретный номер.
Но враждебные мобы же деспавнятся
Либо через определëнное время либо если не взаимодействуют с игроком возможно в выгруженом чанке они не деспавнятся
У меня не деспавятся. Хз, как-то не находил логику с деспавном, мб вечером посмотрю. Помню только, что поле forceSpawn является одним из 2-х факторов появления entity в чанке.
 
Последнее редактирование:
172
5
14
У меня не деспавятся
Вот например книперы деспавнятся днем на оф Вики так написано
Если бы не деспавнились то майнкрафт превратился бы в криперкрафт
они были бы везе
 
172
5
14
если делать все в ChunkEventLoad то все работает
Java:
    @SubscribeEvent
    public void ChunkEventLoad(ChunkEvent.Load e) {
        if (e.getWorld().provider.getDimension() == ancient_world_dim_id) {
            if (e.getChunk().getPos().equals(new ChunkPos(0, 0))) {
                World world = FMLCommonHandler.instance().getMinecraftServerInstance().getWorld(ancient_world_dim_id);
                EntityEldritchGuardian q = new EntityEldritchGuardian(world);
                q.setPositionAndUpdate(8, 81, 8);
                q.forceSpawn = true;
                world.spawnEntity(q);
                System.out.println("Eldritch Guardian is gen XYZ " + 8 + " " + 81 + " " + 8);
            }
        }
    }
 
172
5
14
короче в итоге придется все переписывать как я сказал
как вариант дробить массив записывать в NBT, и когда чанк грузится получать его координату на основе этой координаты получать координату в массиве и спавнить сущности.
в любом случае Ingresso спасибо большое во многих других отраслях помог
 
Сверху