Автоматическая синхронизация IEEP

Версия Minecraft
1.7.10
1,159
38
544
У меня есть IEEP с несколькими IInventory и данными разного рода. Я хочу сделать так, чтобы клиетский IEEP постоянно синхронизировался с серверным. Изучая код игры, я понял как майн синзронизирует основной инвентарь игрока - он всегда держит контейнер игрока открытым и каждый тик выполняет Container#detectAndSendChanges(). Я пробовал сделать так же и держать свой класс постоянно открытым, но тогда мне придется изменять EntityPlayerMP#sendContainerAndContentsToPlayer(), а я не думаю что это лучшее решение.

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

И да, я слышал по DataWatcher, но кажется он синхронизирует только float'ы. В общем, ваши мысли и советы по этому поводу категорически приветствуются.
 
2,505
81
397
DataWatcher синхронит не только float. Но там проблема в том, что доступна только 32 индекса, и при этом вероятна коллизия с другими модами.
Но ты можешь написать свой DataWatcher для кастомный типов. Реализация может быть любой, но главное, чтобы изменения твоих данных самостоятельно отлавливались и синхронизировались. Лучше, если все изменённые данные отправятся одним разом.
 
1,159
38
544
вероятна коллизия с другими модами
Это вроде из-за одинаковых индексов вотчеров? Это фиксится как-нибудь на корню?

Лучше, если все изменённые данные отправятся одним разом
А чем конкретно лучше? Чем это лучше чем отсылать изменения в нескольких пакетах?
 
2,505
81
397
Ну чем меньше пакетов, тем лучше. А еще защита от мульти синхронизаций в один тик. Ну это уже смотря как реализовал, конечно же. Почему-то представляется отправка одного объекта в одном пакете в каком-нибудь сеттере. Это с одной стороны удобно, с другой возможно множественное изменение этого поля за один тик, из-за этого полетит много пакетов. А ведь можно просто устанавливать dirty flag и отправлять измененные данные где-нибудь в конце тика (или с любой другой частотой). Можно кучей пакетов, но лучше одним. Не забывай, что пакет это не только те данные, которые ты хочешь отправить, это еще куча всего.
 
1,159
38
544
Ну чем меньше пакетов, тем лучше
Я вот тоже так думаю, но не могу ообъяснить почему. Вот поэтому и спрашиваю.

А еще защита от мульти синхронизаций в один тик
Защита от мульти синхронизации? Что это за зверь?

А вообще, подумал я и склоняюсь к мысли, что я мастерю велосипед. Посидел поковырял исходники игры и оказалось, что майн не синхронит ИНВЕНТАРЬ EntityPlayer'а. Он синхронит КОНТЕЙНЕР, слоты которого подсоединены к ИНВЕНТАРЮ. Именно поэтому EntityPlayer всегда держит свой контейнер открытым. Т.е. я же могу просто сделать так же + оверрайдить Container#detectAndSendChanges() и зарегать новый IMessage для синхронизации с клиентом.

Единственное, что мне сейчас дейсвительно интересно, так это как устранить возможность коллизии с датавотчерами?
 
7,099
324
1,510
1,159
38
544
@Dahaka И да, сам майн-то отправляет клиенту изменения для каждого слота контейнера по одному пакету. А не одним пакетом. Как думаешь, почему так сделано?
 
Сверху