Помогите с пакетом ShortCutInit

Статус
В этой теме нельзя размещать новые ответы.

nesss

Путник
Участник
Сообщения
129
Розыгрыши
0
Решения
3
Репутация
-2
Реакции
14
Баллы
85
Хроники
  1. Interlude
Исходники
Присутствуют
Сборка
Собственная
Всем привет, начал реализацию панели быстрого доступа, проблема вот в чем, при добавлении на панель действия, все хорошо работает, при добавлении предмета, все хорошо, потом делаю рестарт все отображается хорошо, потом еще раз делаю рестарт и предметы пропадают с панели, а действия все четко отображаются, в списке на сервере предметы есть, клиенту они отправляются без проблем, если на слот, на котором должен быть предмет, добавить новый предмет, предмет не добавляется, как будь-то слот занят.

Использую пакет вот так:

Java:
    @Override
    public void write() {

        final ShortCut shortCut = clientSocket.getAccount().getCharacter().getShortCut();
        final List<ShortCutTemplate> iconsActive = new ArrayList<>();

        for (ShortCutTemplate shortCutTemplate : shortCut.getIcons()) {

            if (shortCutTemplate.isActive()) iconsActive.add(shortCutTemplate);

        }

        writeByte(0x45);
        writeInt(iconsActive.size());

        for (ShortCutTemplate shortCutTemplate : iconsActive) {

            writeInt(shortCutTemplate.getType().getNumber());
            writeInt(shortCutTemplate.getSlot() + shortCutTemplate.getPage() * 12);

            switch (shortCutTemplate.getType()) {

                case ITEM -> {

                    writeInt(shortCutTemplate.getIdObject());
                    writeInt(shortCutTemplate.getCharacterType());
                    writeInt(-1);
                    writeInt(0x00);
                    writeInt(0x00);
                    writeInt(0x00);

                }
                case SKILL -> {

                    writeInt(shortCutTemplate.getIdObject());
                    writeInt(shortCutTemplate.getLevel());
                    writeInt(0x00);
                    writeInt(shortCutTemplate.getCharacterType());

                }
                default -> {

                    writeInt(shortCutTemplate.getIdObject());
                    writeInt(shortCutTemplate.getCharacterType());

                }

            }

        }

    }
 
Смотри в какой последовательности у тебя данные при входе восстанавливает.
Может возникает ситуация когда шорткаты грузятся и отправляются раньше чем загружаются предметы и отправляется инфа о них.
 
Не, точно позже, я ж говорю, вот смотри: захожу, пустая панель, я переношу предмет на панель, все четко, он там стоит. Я делаю рестарт в клиенте на окно выбора персонажа и обратно захожу в игру. Предметы четко отображаются на панели, как я их и добавил, но если я делаю еще один раз рестарт, они пропадают с панели. То есть первый раз отправляет все четко. Я вот думаю, нету там такой штуки типо как в макросах, что отправлять список нужно со своим уникальным ID списка, или что-то в этом роде. Типа первый раз четко отображает и загружает, но когда я делаю рестарт, в клиенте остается этот список с предыдущей загрузки и я захожу заново, и оно поверх загружает еще раз иконки, может такое быть?

Сорян за лишний пост, еще проверил со скилом, все четко как и в случае действий, только предметы глючат.
 
Последнее редактирование модератором:
Сорян за лишний пост, еще проверил со скилом, все четко как и в случае действий, только предметы глючат.
добавьте логи
shortCut.getIcons() полный список и то что добавляет if (shortCutTemplate.isActive())

дальше уже смотрите разницу
 
Все проверил, все передается четко. Если б было проблема в передаче, тогда иконки вообще не отображались бы при входе в игру, у меня отображаются все иконки, и предметы в том числе, вот только после рестарта они пропадают, в БД есть, в списке есть, только в клиенте пропадают, как будь-то из-за ошибки, вот решаю, где ошибка
 
может дело в каком-то из пакетов или их последовательности при выходе/входе при рестарте?
 
Есть ошибка в генерации части пакета для умения (skill).

Вместо:
Java:
writeInt(shortCutTemplate.getIdObject());
writeInt(shortCutTemplate.getLevel());
writeInt(0x00);
writeInt(shortCutTemplate.getCharacterType());

Нужно написать:
Java:
writeInt(shortCutTemplate.getIdObject());
writeInt(shortCutTemplate.getLevel());
writeByte(0x00);
writeInt(shortCutTemplate.getCharacterType());

Длина секции пакета на skill дожна быть в 13 байтов.
 
Поменял, ну умения как работали так и работают. Сейчас видео сниму.

 
Реально, просто добавь в вариант для предметов вывод инфы о том, есть ли у игрока уже в инвентаре предмет с objId передаваемым в шорткате - это уже прояснит ситуацию с вариантом что клиент не знает еще об этом предмете.

З.Ы. и дозаполни блок полей для итемов :) там где у тебя 4 d пустых идут - это группа реюза, текущий реюз, полное время реюза, аугментация. последнее вобще можно представить как hh, если слать опции ауги раздельно.
 
Действительно, но почему так, вот проверку влупил, что-бы выводило лог при отправке пакета с иконками:

Первые 3 это когда я запустил серв, открыл клиент и первы раз на чара зашел.
gameserver.data.template.item.ItemBoxTemplate@3af4fc3a
gameserver.data.template.item.ItemBoxTemplate@7b42529c
gameserver.data.template.item.ItemBoxTemplate@3af4fc3a

А вот это после рестарта.
null
null
null

Но итемы то в инвентаре есть.

З.Ы. и дозаполни блок полей для итемов :) там где у тебя 4 d пустых идут - это группа реюза, текущий реюз, полное время реюза, аугментация. последнее вобще можно представить как hh, если слать опции ауги раздельно.
Да я аргументацию выпилил, я не по шаблону делаю, некоторые функции убираю, некоторые с нуля создаю.
 
ну значит разбирайся с загрузкой предметов - видимо при первом входе и при перезаходе они у тебя как-то по разному грузятся...
 
)))) ужас, но проверил количество предметов, оно что там что там одинаковое ))) Ладно, немного хоть понятно стало, сейчас буду смотреть.
 
Из варианта бреда - там, где ты берешь список предметов для показа в шорткатах, заполнение идет только при первом входе, но не при последующих. Ну и при перезаходе ссылки на предметы в этом списке "протухают", ссылаясь уже на null.
 
Я беру из списка, а он формируется до того как я посылаю пакет с панелью клиенту
 
Я беру из списка, а он формируется до того как я посылаю пакет с панелью клиенту

К слову об оптимизации, незачем формировать список предметов, так как достаточно просто просчитать сколько предметов нужно отсылать, в первом for цикле, ну а потом во втором циклe иx записать. Меньше проблем будет с garbage collector.
 
Вот взял втупую и начала перезаходить, и что обнаружил, отображается то 1, то 2 предмета, то 0, может не успевает загружать с базы данных? хотя отправляю пакет после того как список сформирован.
 
по уму у тебя не должно каждый раз при заходе грузить предметы с базы, а класть при первой загрузке из бд данные в кэш в памяти и при перезаходах брать уже оттуда. повторно же из базы грузить только когда предметы будут выкинуты из кэша по причине того что к ним долго не обращались. ибо каждый раз при входе грузить это все из бд - это прямой путь к лишним нагрузкам на базу, особенно если игроки с забитым доверху инвентарем будут в большом количестве специально нонстопом перезаходить в игру - у тебя бд офигеет от количества запросов :)

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

советую посмотреть в сторону того же Ehcache, который например в овере используется в частности как раз для подобного кэширования предметов и не только для этого.
Ты пишешь так, как будто там транзакции в базу БД по талонам выдают и у сервака лимит на них дневной стоит.
Я хз даже, сколько там чаров должно одновременно входить/выходить нонстоп, чтобы эта нагрузка хотя бы пик образовала на графике io сервера БД, я уж молчу про офигевание. Преждевременная оптимизация - корень дохера проблем.
 
Учитывая что зачастую 99% "админов" серверов запускают их на дохленьких впсках, у которых ресурсов кот наплакал, такие оптимизации вполне разумны. Все что можно закэшировать для ускорения работы - стоит кэшировать.
А то зачастую смотришь в код какой нибудь сборки и прямо кровь из глаз - на каждый чих лезет в базу с запросами там, где можно раз прочесть и потом уже это хранить и отдавать из памяти...

З.Ы. Помнится я комиссионку в той сборке, что взял за основу после хф, переделывал - там тоже был положен большой и толстый на кэширование - каждое обращение, каждого игрока, к выставленным на продажу предметам - новый запрос в бд...
З.З.Ы. Еще таким часто страдают писатели бафферов и всего такого - зачастую тоже персональные схемы баффов и т.п. каждый раз пересчитываются из бд при обращении к бафферу
 
Последнее редактирование:
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху Снизу