Синхронизация IEEP между игроками

Версия Minecraft
1.6.4
355
2
17
Добро!

Такая вот тема, с синхронизацией IEEP между игроком и сервером вроде как проблем не вызывает, но что если мне нужно получить IEEP другого игрока на уровне клиента? Чтобы в нём хранить информацию о нажатии ПКМ у игрока, его экипировки (отдельные слота)?

Отправлять постоянно информацию о всех игроках каждому игроку с постоянной частотой (ПКМ то может быстро нажиматься), как-то накладно выглядит. Ограничивать радиус отправки? Не думаю что лучшая идея.

Какие еще есть варианты?

Получать нужно не только нажатие, но и кастомные эффекты на игроке (Не те, которые зельки), наличие определенных предметов у него.
 
2,505
81
397
Если нужно отображать информацию в мире/худе, то можно использовать атрибуты, которые как раз умеют сами синхронить данные.
Если в гуи с контейнером, то пусть сервер сам отправляет всю нужную инфу клиенту при открытии.
Если в гуи без контейнера, то клиент должен запросить инфу, а сервер ее отправит.
Других юзкейсов, вроде, нет.
 
355
2
17
Ну со всеми перечисленными элементами проблем нет. Интересует конкретная информация о других игроках.

Вот к примеру, игрок А должен знать, что игрок Б держит ПКМ и какой ItemStack одет у него в слоте щита.
И конкретно чтобы это был ближайший игрок в радиусе, ибо игроку А не важна информация, если игрок Б находиться в другой части карты, это ведь лишние действия для сервера.

На ум приходит только в методе тиков пробегаться по игрокам и каждому отправлять информацию другого игрока если тот в радиусе, но это постоянный спам не совсем нужно информации.

---

Посмотрел еще мельком реализацию щита на 1.10, насколько я понял, там нажатие щита записывается в DataManager, затем он помечается как dirty ( ??))) ) и видимо каждый тик проверяется не грязный ли этот DataManager и в случае обратного - синхронизирует изменения, видать среди всех игроков, ну а информация о слоте щита игрока и так синхронна на версии выше.

Но DataWatcher \ DataManager, как по мне не совсем хорош, если используются несколько сторонних модов.

---

Какие еще есть варианты?
 
355
2
17
@Dahaka, что-то это не совсем то, Атрибутам больше подойдут свойственные этому значению параметры, а передавать через них такие вещи как нажатие мыши и IS, вообще не к месту. Да еще и эта атрибутика автоматом в NBT записывает, зачем мне нажатие и дублированный IS в дате игрока?

Может я конечно не туда смотрю, но все же
 
355
2
17
Отправляй тогда всем игрокам данные при его появлении
Вот этот момент с самого начала мне интересен. Как такового хендлера "Прорисовки игрока в радиусе" нет, то нужно отлавливать момент когда игрок появляется в радиусе видимости.

Насколько я еще понял, клиент хранит и обновляет информацию о всех игроках сервера, а рендерит уже проверяя по радиусу? Или я все-таки заблуждаюсь? Ибо момент когда игрок появляется впервые в поле рендера игрока, весьма такой, не плавный, как будто только что пакетом свеженький прилетел.
 

tox1cozZ

aka Agravaine
8,454
598
2,890
Насколько я еще понял, клиент хранит и обновляет информацию о всех игроках сервера, а рендерит уже проверяя по радиусу
Нет конечно. У клиента есть инфа только о игроках которые находятся в радиусе 512 блоков.
Ибо момент когда игрок появляется впервые в поле рендера игрока, весьма такой, не плавный, как будто только что пакетом свеженький прилетел.
Так и есть. Глянь в EntityTracker, там эта вся магия происходит. Если вкратце: как только энтити появляется в заданном радиусе от игрока - игроку летит пакет спавна энтити. Там же каждый тик проверяется обновления DataWatcher'a, если они есть - тоже отсылается пакет с этими данными. То есть клиенту отсылаются пакеты только тех сущностей, которые находятся в определенном радиусе.
 
355
2
17
Так и есть. Глянь в EntityTracker, там эта вся магия происходит. Если вкратце: как только энтити появляется в заданном радиусе от игрока - игроку летит пакет спавна энтити. Там же каждый тик проверяется обновления DataWatcher'a, если они есть - тоже отсылается пакет с этими данными. То есть клиенту отсылаются пакеты только тех сущностей, которые находятся в определенном радиусе.
Вот я сейчас и копаюсь как раз в этом районе.

Т.е. по сути эта информация обрабатывается сервером и тогда проще хукаться где-то в нём и передавать инфу совместно с этим всем.
 
Сверху