Синхронизация тайла

Версия Minecraft
1.12+
4,045
63
645
Всем привет!
Не подскажете ли, в каком эвенте/не эвенте/месте можно разместить синхронизацию определённого параметра тайла для рендера?

А теперь по человечески:
Есть у меня тайл энтити и его рендер... На сервере лежит параметр, который должен использоваться в рендере.
Однако стандартная сейвНБТ для клиента, видимо, не очень работает...
Приходится посылать пакеты. Однако, когда и где это можно сделать?

Пробовал из ЭнтитиДжойнЭвента, но в этот момент список тайлов на клиент ещё не загружен и я не могу заменить параметр. Такая же фигня происходит, если посылать из лоадНБТ.

Единственное рабочее решение, это отправлять запрос из самого рендера и дожидаться ответа сервера.
При этом всё работает, но при загрузке мира на пару-тройку кадров в рендере этого параметра нет, что бросается в глаза...

Есть мысли?
 
4,045
63
645
У тебя просто синхронизация с клиентом...
У меня немного другой случай. Мне нужно синхронизироваться в момент появления игрока в мире.
Но беда в том, что у игрока в это время ещё нет списка тайлов...
 
4,045
63
645
Что именно должно работать? Пакеты у меня и так работают, я тайл на клиенте не могу найти.


Или я что-то не понимаю...
Методы из примера срабатывают при загрузке/выгрузке/апдейте?
Ща попробую.


Дыа!
Спасибо! )))
Я ж с этим весь день промучился, а всё было так просто )))

Один вопросик, что означает 2-й параметр в new SPacketUpdateTileEntity(this.pos, this.getBlockMetadata(), tag);
Звучит как tileEntityType.
 
5,020
47
784
Чем дольше ты бьешься над проблемой, тем более простое решение будет)
 
4,045
63
645
Народ! Вернёмся к нашим баранам...
Опять тайл, опять синхронизация...
Расчёт идёт на сервере, и один параметр меняется практически постоянно... Считайте каждый тик... Ну, можно уменьшить тиков до двух-четырёх, но не желательно...
Так вот! Этот параметр имеет своё отражение в рендере.
Как мне его синхронизировать?
Знаю, в контейнере есть метод специальный... Но у меня не контейнер...
Имеет ли смысл каждый тик посылать пакеты всем в определённом радиусе или же есть способы проще?

Спасибо за ответ )
 
3,005
192
592
Зачем пакеты?
Лично у меня это все делается без пакетов и все обновляется на клиенте.
Тебе нужно переопрелелить те методы (с сообщения Тандера) и сделать клиентский markDirty.
 
4,045
63
645
Ок... Я это сделал... Но получается, что он будет каждый тик упаковывать все параметры, пересылать клиенту и распаковывать там...
Меня вот это смущает.
Хотя, на самом деле, я уже сделал тикер, который ограничивает число "пересыланий"...
 
4,045
63
645
Хм...
А как это фильтровать?
В смысле, при обычных обновлениях, скажем, при загрузке/выгрузке чанка, передаваться должны все параметры... А каждый тик - только один...
И всё это осуществляется через markDyrty();
...
То есть мне создать какой-нибудь булеан для фильтрации апдейт или тик?
Перед markDyrty(); я меняю его на true, передаю инфу, а после меняю обратно на false?
Так что ли?
...
Нужно протестить...
 
2,505
81
397
Отправлять
Хм...
А как это фильтровать?
В смысле, при обычных обновлениях, скажем, при загрузке/выгрузке чанка, передаваться должны все параметры... А каждый тик - только один...
И всё это осуществляется через markDyrty();
...
То есть мне создать какой-нибудь булеан для фильтрации апдейт или тик?
Перед markDyrty(); я меняю его на true, передаю инфу, а после меняю обратно на false?
Так что ли?
...
Нужно протестить...
Ну ты чо? Ты же пакет сам собираешь. Положи в него только то, что нужно для рендера в мире.
 
4,045
63
645
Так я ж и говорю, я использую стандартные методы, которые показал Thunder в первом ответе.
Там у него в пакете собирается вся информация о тайле из ридНБТ и врайтНБТ. И эта информация мне на клиенте тоже нужна... не только для рендера, но и для других целей... Но нужна она мне только при серъёзном обновлении тайла...
А для рендера нужен один параметр...
И синхронизировать его я хочу через те же методы...
Вопрос: как мне это сделать, если на них уже завязат врайтНБТ/ридНБТ?
 
4,045
63
645
Ок... Допустим... Но как мне обновлять клиент при заходе в мир, например? Или при других изменениях тайла?
Каждый раз это будет разный тэг... Как мне его фильтровать?
Или ладно, поставлю вопрос иначе: в какой момент выполняются эти стандартные методы? Только при маркДёти() или ещё и при загрузке чанка с тайлом?
 
3,005
192
592
Посмотри как реализовано тут:
ActuallyAdditions/TileEntityBase.java at 1.10.2 · Ellpeck/ActuallyAdditions · GitHub
В данном примере идет 3 вида синхронизации: сейв самого тайла (all), синхронизация (sync), сейв блока (???).
В обычном readFromNBT пишешь сейв тайла, в синхронизации сунс, все.
 
Сверху