Как очищать пакет или же как бороться с большим размером пакета

Сообщения
20
Лучшие ответы
0
Реакции
2
Версия Minecraft
1.7.10
Здравствуйте! Хочу попросить дать информацию и подискутировать над этой проблемой.
Собственно сейчас столкнулся с проблемой, которая вызывается тем, что у меня слишком тяжелый пакет передается, из-за чего всех игроков на сервере будет кикать.

Собственно сама ошибка:
[13:38:04 ERROR]: [Channel: DailyRewards] Payload may not be larger than 2097050 bytes
[13:38:04 INFO]: whoami lost connection: Internal Exception: io.netty.handler.codec.EncoderException: java.lang.IllegalArgumentException: unable to fit 2099217 into 3

Я прекрасно понимаю, почему она появляется, имею представление, как её побороть. Но я бы хотел мнение экспертов и их советов. На данном форуме ничего дельного не нашел.

Я видел только мод от gamerforea, который убирает ограничения на вес пакетов, но тут же у меня возникает еще один вопрос: Как это будет отражаться на сервере? Ну сниму я ограничение данным модом с пакетов, а пакеты будут больше и больше со временем весить. Что по нагрузке на сервер? Критично ли это вообще? Я понимаю, что его мод - решение моей проблемы, но так же меня интересуют вопросы, что я задал выше, а конкретнее, нагрузка от этого чуда.
П.С. собственно речь идет об этом прекраснейшем моде gamerforEA/Minecraft-PacketUnlimiter

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

Если есть какой-либо другой способ решение этой проблемы, был бы благодарен за его предоставление.
Надеюсь получить очень интересные и поучительный ответы от гениев данного форума
 

tox1cozZ

aka Agravaine
Модератор
Сообщения
7,031
Лучшие ответы
438
Реакции
2,074
Что по нагрузке на сервер? Критично ли это вообще?
Да. Если будут пакеты в пару мегабайт, то игрока будет нормально так фризить.

Как бороться? Разбивать пакет на мелкие части и отправлять уже несколько маленьких пакетов, а потом собирать всё в кучу.
Лучше скажи что ты там такое передаешь огромное.
 
Сообщения
20
Лучшие ответы
0
Реакции
2
Делал для своего проекта мод на ежедневные награды. В представлениях своей логики получилось так, что я передаю с сервера на клиент информацию, нужную для отрисовки в GUI на клиенте.
Я одним пакетом передаю на клиент такие переменные, как:
1. Текущий предмет за наигранные часы в сутки
2. Текущий предмет за месяц
3. Текущее наигранное время игрока (PlayTime)
4. Текущая серия дней-заходов подряд на сервер
5. Последняя дата захода на сервер для того, чтобы потом сбрасывать награды.
Получается 5 переменных.
Ах, да забыл, я туда еще передаю списки из конфига, который лежит на сервере, но отдельными пакетами уже(Ну по типу там, картинки предметов, еще что-то такое)
Так же, я думаю проблема в том, что каждую секунду отправляются пакеты, т.к. я клоун и использую это все в PlayerTickEvent

Я еще новичек в создании модов, так что за код прошу не ругать, я итак знаю, что я клоун, если есть притензии, лучше тыкните лицом и скажите как лучше:

Java:
@SubscribeEvent
public void tick(TickEvent.PlayerTickEvent event)
{
    if(ticker % 20L == 0L)
    {
        Timestamp n = new Timestamp(Calendar.getInstance().getTimeInMillis());
        LocalDateTime NowResult = n.toLocalDateTime();

        if(!(new File(DailyRewards.ConfigDirectory + "Players/" + event.player.getDisplayName().toLowerCase() + ".info")).exists())
            new NBTHelper(event.player.getDisplayName(), 1, 1, 1, NowResult.toString(), InjectionManager.getPlayTime(BukkitHook.toBukkitEntity(event.player)));

        this.ItemsHourly.addAll(Arrays.asList(ModConfig.ItemsHourly));
        this.ItemsMonth.addAll(Arrays.asList(ModConfig.ItemsMonth));
        this.ItemsMonthPremium.addAll(Arrays.asList(ModConfig.ItemsMonthPremium));
        this.PlayTimeHours.addAll(Arrays.asList(ModConfig.PlayTimeHours));

        NetworkHandler.network.sendTo(new PacketItemsHourly(this.ItemsHourly), (EntityPlayerMP)event.player);
        NetworkHandler.network.sendTo(new PacketItemsMonth(this.ItemsMonth), (EntityPlayerMP)event.player);
        NetworkHandler.network.sendTo(new PacketItemsMonthPremium(this.ItemsMonthPremium), (EntityPlayerMP)event.player);
        NetworkHandler.network.sendTo(new PacketPlayTimeHours(this.PlayTimeHours), (EntityPlayerMP)event.player);

        try
        { Я думаю вот этот пакет вызывает проблемы
            NetworkHandler.network.sendTo(new PacketGetPlayerStat(event.player, NBTHelper.CurrentItemHourly(event.player), NBTHelper.CurrentItemMonth(event.player), NBTHelper.CurrentDay(event.player), NBTHelper.LastReward(event.player), NowResult.toString(), NBTHelper.LastPlayTime(event.player), InjectionManager.getPlayTime(BukkitHook.toBukkitEntity(event.player))), (EntityPlayerMP)event.player);
        }
        catch(Exception ioException)
        {
            ioException.printStackTrace();
        }
    }
}
 

Ivasik

Porting GrandBombaster
Администратор
Сообщения
3,247
Лучшие ответы
84
Реакции
457
Всю статичную информацию отсылай при входе. За текущий день можешь отослать информацию о награде или т.п. при открытии гуи. Не надо каждую секунду слать информацию, которая может в течении дня вообще не поменяться.
 
Сообщения
20
Лучшие ответы
0
Реакции
2
Я уже все сделал, мне просто было интересно пару моментов. На них я ответы получил, поэтому вопрос в принципе закрыт

Я свою проблему решал тем, что отправлял пакеты по нажатию на кнопку(Так у меня открывается гуи)
 
Сверху