Разная погода (и время) в разных измерениях

Версия Minecraft
1.12.2
API
Forge

VeniVidiVici

Санта Барбарис
327
15
198
Доброго времени суток (кстати, благодаря этой фразе на форуме очень осложнён поиск тем по вопросам с механикой времени суток). Задался целью сделать процесс начала дождя в разных мирах более "разнопоточным", так как сейчас при начале дождя в одном измерении он идёт и во всех остальных.

Разумеется сначала я пошёл изучать ванильный код. В классе WorldProvider есть метод
WorldProvider:
public void resetRainAndThunder()
{
    world.worldInfo.setRainTime(0);
    world.worldInfo.setRaining(false);
    world.worldInfo.setThunderTime(0);
    world.worldInfo.setThundering(false);
}
Из него у меня возникают первый вопрос:
1) Класс WorldInfo является же персональным для каждого провайдера (и измерения) ?
Также я где-то натыкался на тему, в которой @Liahim боролся с грозами, и там поднимался вопрос того, что первый тайминг у дождя и шторма идёт одинаковый:
2) Следует ли из этого что первый дождь в мирах идёт по одинаковому таймингу, а в дальнейшем просто по одному и тому же методу (World.updateWeatherBody() ) приобретает одинаковые интервалы? Т.е. его можно сместить вручную относительно тайминга в иных мирах?
Пока не проверил суждение эмпирическим путём, но может кто-то уже знает ответ.

И третий вопрос, не по теме дождя, но косвенно связанный с рассуждениями выше.
3) Можно ли сделать разное время суток в мирах? С той же скоростью течения времени, но разным текущим временем суток.
 

tox1cozZ

aka Agravaine
8,456
598
2,893
Класс WorldInfo является же персональным для каждого провайдера (и измерения) ?
Нет. Он один для всего сейва (всех измерений).

3) Можно ли сделать разное время суток в мирах? С той же скоростью течения времени, но разным текущим временем суток.
Нет, WorldInfo один на все измерения.
 

VeniVidiVici

Санта Барбарис
327
15
198
Нет, WorldInfo один на все измерения.
Погоди, а откуда такая информация?
Такое ощущение, что оно не общее
1628787788734.png

1628787821878.png



Ой не знаю, мне кажется моды другие офигеют.
Да мне для себя, других не будет
 
Последнее редактирование:

VeniVidiVici

Санта Барбарис
327
15
198
С временем всё оказалось довольно просто, при использовании своего измерения. Вот как это можно сделать:
По умолчанию в WorlProvider есть метод
WorlProvider.getWorldTime():
public long getWorldTime()
{
    return world.worldInfo.getWorldTime();
}
Он обращается к главному времени в WorldInfo (см. сообщения выше).

Но если мы создадим свою переменную private long worldTime; в нашем новом провайдере, в инициализации сделаем её сверку
Java:
protected void init() {
    super.init();
    // ...
    NBTTagCompound nbttagcompound = this.world.getWorldInfo().getDimensionData(this.world.provider.getDimension());
    this.worldTime = this.world instanceof WorldServer ? nbttagcompound.getLong("OurWorldTime") : 0L;
    // ...
}
а в сохранении мира её запись
Java:
public void onWorldSave() {
    NBTTagCompound nbttagcompound = new NBTTagCompound();
    nbttagcompound.setLong("OurWorldTime", this.worldTime);
}
То нам никто не мешает назначить методы записи и получения времени таким вот образом:
Java:
public void setWorldTime(long time) {
    this.worldTime = time;
}
public long getWorldTime() {
    return this.worldTime;
}

Время по такой схеме будет идти отдельно от мира, и вполне можно при создании измерения задавать например 0, тем самым начиная здесь день независимо от основного мира.

Теперь буду с основным вопросом разбираться, с погодой
 

VeniVidiVici

Санта Барбарис
327
15
198
Только время нужно синхронизировать каждую секунду, как это делает майн.
А вот и нет, мы задаём начальный ориентир, а дальше оно крутиться само. Только что проверял всё, работает
 

VeniVidiVici

Санта Барбарис
327
15
198
По идее, так же можно разобраться и с погодой. В World есть методы, которые обращаются к WorldProvider, который в свою очередь стучится обратно в World, а уже из него в WorldInfo. Так что можно перехватить на полпути, а те проверки, которые нельзя перезаписать напрямую в WorldProvider, уже поменять какими-нибудь доп фичами типо миксинов.

1628792496177.png
 

tox1cozZ

aka Agravaine
8,456
598
2,893
А вот и нет, мы задаём начальный ориентир, а дальше оно крутиться само. Только что проверял всё, работает
Друк, у тебя клиент/сервер залагает и время рассинхронизируется на клиенте и сервере. А потом думай почему спавнятся мобы днем xD Для этого и делается синхронизация раз в n время.
 

VeniVidiVici

Санта Барбарис
327
15
198
Друк, у тебя клиент/сервер залагает и время рассинхронизируется на клиенте и сервере. А потом думай почему спавнятся мобы днем xD Для этого и делается синхронизация раз в n время.
Не, ты либо что-то путаешь, либо не так понял принцип работы. Я проверял на серверной сборке, время вообще задаётся у меня только на стороне сервера. И ничего, клиент прекрасно видит разное время суток и там и там
 
Сверху