Ограничение использования предметов

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

Psycho

I salute the valkyries calling me home!
Легенда
Орден Золотого Заката
Сообщения
5 056
Розыгрыши
1
Решения
4
Репутация
4 485
Реакции
3 534
Баллы
2 648
Кто-нибудь знает как это пофиксить?
Крч, если предмету ставим условие использования, не важно, лвл, скил, класс, то клиент блокирует предмет, и даже если выполняешь условие, до релога не сможешь использовать предмет.
В датках где-то или же зашито в интерфейсе?

Screenshot_5.webp
 
Оверпостинг
так поставь брекпоинт(Breakpoint) и посмотри что в классы передается

но если как ты пишешь что после релога все норм, я бы копал в сторону обновления инвентаря
 
Последнее редактирование модератором:
Типо слать обнову инвентаря при лвл апе, получении скила и тд?
ну у нас вообще реализовано при каких то действиях
Но мы в кэше с этим работаем
Ну если есть исходы начни с отладки, глянь что в классах передается
 
//summon Gaikotsu Aristo

ну у нас вообще реализовано при каких то действиях
Но мы в кэше с этим работаем
Ну если есть исходы начни с отладки, глянь что в классах передается
Все равно не понимаю, при чем здесь сервер, если клиент блокирует предмет.
Ну типо, по факту условия, при попытке одеть предмет, должно отсылаться сообщение об этом, но как только иконка предмета становится красная, жми по итему, не жми, побоку вообще. Выполняем условие, к примеру у итема ограничение по лвлу, одевается и все такое, снижаем лвл, чтобы не подходил под условие, предмет в инвентаре не красный, жмешь на него, и вылетает сообщение, что условия не соблюдены, делаешь релог, предмет красный.
 
Последнее редактирование модератором:
В пакете ItemList - ну или любом другом записи ItemInfo - есть поле "is blocked".
Результат записи нуля:
1748984207004.webp
То-есть итемы блокируются.
// На более новых хрониках и такое можешь делать
1748984381137.webp

Ну не важно.
Сделай чтобы item.isBlocked() возвращал false
Java:
        packetWriter.writeD(item.getShadowLifeTime());
        packetWriter.writeD(item.getTemporalLifeTime());
        packetWriter.writeC(!item.isBlocked());
        packetWriter.writeH(item.isLocked()); // 140 PROTOCOL
        if (containsMask(flags, ItemListType.IS_AUGMENTED))
Ну и нужно отследить где еще такие проверки есть.
Еще как вариант - посмотреть где применяется Condition - и запретить их парсить.
 
Все равно не понимаю, при чем здесь сервер, если клиент блокирует предмет.
Ну типо, по факту условия, при попытке одеть предмет, должно отсылаться сообщение об этом, но как только иконка предмета становится красная, жми по итему, не жми, побоку вообще. Выполняем условие, к примеру у итема ограничение по лвлу, одевается и все такое, снижаем лвл, чтобы не подходил под условие, предмет в инвентаре не красный, жмешь на него, и вылетает сообщение, что условия не соблюдены, делаешь релог, предмет красный.
Ну за клиент не подскажу, у нас на стороне сервера реализовано это.
 
Все равно не понимаю, при чем здесь сервер, если клиент блокирует предмет.
вобще-то это сервер блочит, в блоках инфы о предмете, в пакетах ItemList, InventoryUpdate и т.п.
так что только на стороне сервера тщательно все расписать на тему блокировки/разблокировки
ну и для клиента это все чисто визуально блокирует - все проверки на возможность использования надо все равно расписывать на сервере
Java:
    protected void writeItem(ItemInfo item, long count, int mask)
    {
        writeH(mask);
        writeD(item.getObjectId());
        writeD(item.getTemplate().getId());
        writeC(item.getEquipSlot());
        writeQ(count);
        writeC(item.getTemplate().getType2ForPackets());
        writeC(item.getCustomType1());
        writeH(item.isEquipped());
        writeQ(item.getTemplate().getBodyPart());
        writeH(item.getEnchantLevel()); // уровень заточки (уровень пета, если это предмет для его призыва)
        writeC(item.getCustomType2()); // 0 - пет с стандартным именем (имя NPC), 1 - пет с именем, заданным игроком
        writeD(item.getRemainingDurationTime());
        writeD(item.getAppearanceId() == 0 ? item.getRemainingPeriodTime() : item.getAppearanceTimeForPackets()); // оставшееся время жизни для временного предмета/временной внешки
        writeC(item.isUseable()); // <=== блок предмета на использование (красная иконка)
        writeH(item.isLocked()); // <=== блок действий, которые могут уничтожить предмет или поменять его состояние (значок замка на иконке)

        if (containsMask(mask, ItemListType.AUGMENTATION_OPTIONS))
            writeItemAugment(item);

        if (containsMask(mask, ItemListType.ELEMENTAL_ATTRIBUTE))
            writeItemElemental(item);

        if (containsMask(mask, ItemListType.ENCHANT_OPTIONS))
            writeItemEnchantEffect(item);

        if (containsMask(mask, ItemListType.APPEARANCE))
            writeD(item.getAppearanceId());

        if (containsMask(mask, ItemListType.ENSOUL_OPTIONS))
            writeItemEnsoulOptions(item);

        if (containsMask(mask, ItemListType.USE_COUNT))
            writeH(item.getCurrentUseCount());

        if (containsMask(mask, ItemListType.REUSE_DELAY))
            writeD(item.getCurrentReuse());

        if (containsMask(mask, ItemListType.PET_DATA))
            writePetData(item);

        if (containsMask(mask, ItemListType.BLESS_OPTION))
            writeC(1);
    }
Если речь идет о более старых клиентах, то там список блокировок/разблокировок слался в ItemList отдельным списком id предметов котрые надо заблочить/разблочить, после отправки основной инфы о предметах.
 
  • Мне нравится
Реакции: Psycho

    Psycho

    Баллов: 50
    За ответ
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху