Создание измерения 1.12.2

Версия Minecraft
1.12.2
API
Forge
428
41
108
Добрый вечер, столкнулся с такой вот проблемой: Измерение создал, но в нем неправильно работают сущности на стороне клиента.
Это работает у меня примерно так: Спавню условного слайма - его ,,как бы нет,, (вообще не видно, хоть в отладке), однако ставить блок на это место нельзя. Ну и этот ,,отсутствующий слайм,, беспрепятственно меня атакует. С гравитацией похожая история (визуально песок парит, но на самом деле уже упал)
Все остальное работает нормально (блоки, сохранения)

Код создания измерения ниже (Если ткнете в нормальный гайд по измерениям на 1.12 - буду благодарен)
Java:
public class EmptyWorld extends WorldServer{
    //вызывается где-то на стороне сервера, и после этого в это измерение после можно войти
    public EmptyWorld(MinecraftServer server, int dimensionId, String name, WorldType type) {
        super(server, new AnvilSaveHandler(
                    new File("dyn_worlds"),
                        "d_"+name, false, server.getDataFixer()
                ), worldInfo(server, name, type), regDimIfNeed(dimensionId), server.profiler
        );
        initialize(new WorldSettings(getWorldInfo()));
        init();
    }


    private static int regDimIfNeed(int dimID){
        if(!DimensionManager.isDimensionRegistered(dimID)){
            DimensionManager.registerDimension(dimID, DimensionType.OVERWORLD);
        }
        return dimID;
    }


    private static WorldInfo worldInfo(MinecraftServer server, String name, WorldType type){
        return new WorldInfo(new WorldSettings(
                server.worlds[0].getSeed(),
                server.getGameType(),
                server.canStructuresSpawn(),
                server.isHardcore(), type
            ), name
        );
    }
}
 
Решение
А откуда регаешь?
Может, не вовремя?
Это натолкнуло меня на решение. Мир либо нужно создавать до вызова MinecraftServer#loadAllWorlds либо добавить пару строк в конструктор
Java:
    public EmptyWorld(MinecraftServer server, int dimensionId, String name, WorldType type) {
        super(server, new AnvilSaveHandler(
                    new File("dyn_worlds"),
                        "d_"+name, false, server.getDataFixer()
                ), worldInfo(server, name, type), regDimIfNeed(dimensionId), server.profiler
        );
        initialize(new WorldSettings(getWorldInfo()));
        init();
        this.addEventListener(new ServerWorldEventHandler(server, this))...
1,038
57
229
У меня такое было когда Моб спавнился исключительно на сервере.
И вроде ещё надо было где то зарегистрировать его настройка спавна на клиенте. То ли я его в глобальном списке забыл добавить. Дело не в самой модели в общем.
Сервер хоть и является главным, это не означает что клиент бесполезная сторона.
В старых версиях, моб должен был заспавнится с обоих сторон. А так как поведение и random у них одинаковый, то получалось что их поведение совпадало. Ну и там ещё пакеты для обмена данных о позиции (Update Data Watcher или что то такое, где то должна быть синхронизация внутри entity также как обновляется TileEntity для блоков).
 
Последнее редактирование:
1,074
72
372
У меня такое было когда Моб спавнился исключительно на сервере.
На сервере как раз должен. Сервер - за главного. На клиент EntityTracker отправит сообщение о спавне нового моба. На клиенте тоже спавнят сущности, что-то простое вроде частиц.
 
4,045
63
645
428
41
108
А откуда регаешь?
По задумке новые миры должны ,,создаваться,, на лету, но ,,на пока,, я затолкал инициализацию в конец IntegratedServer#loadAllWorlds

UPD Проверил - если зарегистрировать измерение в пост-ините ничего не изменится
В сумеречном всё это дело в пост ините происходит.
 
Последнее редактирование:
428
41
108
А откуда регаешь?
Может, не вовремя?
Это натолкнуло меня на решение. Мир либо нужно создавать до вызова MinecraftServer#loadAllWorlds либо добавить пару строк в конструктор
Java:
    public EmptyWorld(MinecraftServer server, int dimensionId, String name, WorldType type) {
        super(server, new AnvilSaveHandler(
                    new File("dyn_worlds"),
                        "d_"+name, false, server.getDataFixer()
                ), worldInfo(server, name, type), regDimIfNeed(dimensionId), server.profiler
        );
        initialize(new WorldSettings(getWorldInfo()));
        init();
        this.addEventListener(new ServerWorldEventHandler(server, this));
        net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(
                new net.minecraftforge.event.world.WorldEvent.Load(this)
        );
    }
 
Сверху