NBT,Клиент/Сервер, а также данные игрока и передача пакетов.

212
0
Еле влезло все в название! А ведь и действительно, чем дальше я продвигаюсь по лестнице сложности моего мода, тем больше вопросов у меня возникает! Но я стараюсь не загружать форум всякой фигней.
Однако все же данный вопрос может быть полезен некоторым людям, из за чего я и пишу сюда.
Итак, мне нужно что бы ентити игрока(далее игрок1) могло запомнить некое значение (далее ИД) и синхронизировать его с сервером. К тому же клиенты других игроков(далее игрок2) должны знать, что данное ентити , олицетворяет игрока1 именно данным ИД.
Для особенно любопытных я скажу, что ИД мне нужен для рендера, и готов выслушать и переварить все ваши поучения, а не ждать пока вы кинете в меня готовым кодом.
Я уже пробовал настроить синхронизацию с помощи пакетов, но, в процессе изучения наткнулся на теорию о том, что НБТ самостоятельно синхронизируется. Неужели это правда? 
P.S Я уже сделал рендер на клиенте, ИД работает на игроке1 от 3-го лица, но другие персонажи его не видят.
 
Ситуация в корне поменялась! Узнал о том, что DataWatcher автоматически синхронизирует данные, теперь очень нужно узнать об этом по подробнее. Работал ли с ним кто либо?
 
Не, DataWatcher для игрока вообще не трогай, ибо там максимум 32 слота под данные, которые забиваются парочкой модов и игра крашится.
Пакетами надо, да. Слать можно в StartTracking ивенте.
 
Agravaine написал(а):
Не, DataWatcher для игрока вообще не трогай, ибо там максимум 32 слота под данные, которые забиваются парочкой модов и игра крашится.
Пакетами надо, да. Слать можно в StartTracking ивенте.
Ситуация такова, что мод будет в закрытом доступе, под моим присмотром и грамотном администрировании, а слотов мне нужно либо 4, либо, если совсем изхитриться и использовать String как буфер, то 1.
 
Другие моды могут забить.
Можно ID сунуть в IExtendedEntityProperties. Можешь тут почитать
 
Dahaka написал(а):
Другие моды могут забить.
Можно ID сунуть в IExtendedEntityProperties. Можешь тут почитать
Спасибо за статью, однако я уже писал выше, что за другими модами будем тщательно следить и использовать лишь свободные ячейки.
ОБНОВЛЕНИЕ ДАННЫХ
Я покопался в различных ванильных файлах и построил требуемую систему.
Если все будет работать требуемым способом, я выложу сюда все что нужно знать о DataWatcher(из того что я уже узнал).
 
Я сделал бы наблюдатель, который сам отсылает, как только изменится переменная. В котлине есть встроенный функционал такого. В джаве можно создать делегат, определить методы set/get и там не только ставить значение, но и отсылать пакет. Ну, как-то так
 
Зачем следить, когда можно не следить?
 
Затем, что данные могут меняться в какой-то период. Дабы не париться, я слежу через observable. Ну и дополнительно, права(булевы) я храню в 1 байте, 8 штук
 
Странно, я записываю данные в DataWatcher, однако игрок2 все равно не видит на игроке1 последствия ID. С чем это может быть связано? Может нужно кинуть какой либо ивент, что бы обновить у всех игроков на серве DataWatcher игрока?
 
Походу вы меня не поняли...
Я про то, что зачем следить за сборкой, если можно не следить, сделав нормально, не изобретая велосипеды. И не пользуясь старинными, непродуманными механизмами
 
Dahaka написал(а):
Походу вы меня не поняли...
Я про то, что зачем следить за сборкой, если можно не следить, сделав нормально, не изобретая велосипеды. И не пользуясь старинными, непродуманными механизмами
Да понял я вас, я всего лишь искал более простой способ, нежели синхронизация пакетами. Теперь действительно буду пользовать тот способ, на который вы указали в начале.
 
wilah написал(а):
А что в пакетах сложного?
Ничего, если так подумать, но все же проще тогда было написать все через DataWatcher, кто ж знал, что этот способ не сработает.
 
Каким способом лучше всего слать пакеты? Я вот начал педалить Нетти, по гайду, что нашел на форуме, пока что успехов 0;
 
Ну создаешь класс пакета и его обработчика
Код:
public class Msg implements IMessage
{    
    public Msg() {}
    
    @Override
    public void fromBytes(ByteBuf buf) {}

    @Override
    public void toBytes(ByteBuf buf) {}
    
    public static class Handler implements IMessageHandler<Msg, IMessage>
    {
        @Override
        public IMessage onMessage(Msg message, MessageContext ctx)
        {
            return null;
        }
    }
}

Регаешь его где-нибудь. Side - сторона обработчик.
Код:
public static SimpleNetworkWrapper net = new SimpleNetworkWrapper(ТвойМод.ИД);

...

int i = 0;
net.registerMessage(Msg.Handler.class, Msg.class, i++, Side.SERVER);

Ну и потом со стороны клиента шлешь.
Код:
Какой-тоКласс.net.sendToServer(new Msg());
[merge_posts_bbcode]Добавлено: 19.05.2016 19:06:04[/merge_posts_bbcode]

Это 1.7.10
 
Я уже сделал с помощью нетти и packetPipeline. Спасибо всем большое.
 
Если у тебя 1.7.10, то спешу разачаровать - там утечка памяти.
 
svk2140 написал(а):
Если у тебя 1.7.10, то спешу разачаровать - там утечка памяти.
Ну вот сколько тестирую, она мне не сильно мешает, а как с ней бороться - я не вникал просто в код pipeline?
 
Назад
Сверху