Временные предметы

BadStealth

Величайший
Партнер
Emu-Dev
Победитель в номинации 2023
Победитель в номинации 2022
Победитель в номинации 2021
Победитель в номинации 2020
Просветитель
Клиент разработчик
Старожил I степени
Преподаватель
За веру и верность форуму
Победитель в номинации 2019
Сообщения
309
Розыгрыши
0
Репутация
419
Реакции
528
Баллы
1 573
Народ т.к. предыдущую тему закрыли. Остался вопрос.
В игре есть временные петомцы (как и в ивенте Lovers' Jubilee (Юбилей Влюбленных)
У меня в сборке реализованы Теневые предметы- у которых кончается манна при одевании и временные предметы которые попадя в инвентарь начинают отсчет времени.
Но вот есть такие предметы у которых отсчет начинается только после того как ты призвал Пета или Агатиона. Ну не суть важно кого!!! А когда отозвал то таймер останавливается. И так продолжается до истечения всего времени.
Если время призыва 3 часа- то отсчет идет только когда пет призван.
Всю голову сломал но так и не понял как такое прикрутить? Общарил кучу исходников- и так и сяк смотрел. Но нет не нашел реализации. Если кто реализовал такое и кому не жалко - поделитесь пожалуйста или скажите в какой сборке уже такое реализовано- скачаю, посмотрю да подстрою под себя.
Ивент почти весь сделал- хотя его даже и не было на Эпилоге. Все работает- но вот встал на вопросе с временными предметами. И таск делал для отсчета и пихал чтобы включался таск во время призыва пета. Или я еще мал для таких работ или чего недопонянимаю еще в сборке и клиенте.
Кстате 2 вопрос. С витаминными петами не играл --- поэтому не знаю что и к чему.
У них не капает ХР и SP?
У них уровень всегда как у владельца?
И что насчет кормления? У меня голод бежит а вот чем их кормить и надо ли вообще?
А вообще было бы круто если бы у таких петов полоса голода совпадала с отсчетом времени предмета для призыва.
 
Обратите внимание, что данный пользователь заблокирован! Не совершайте с ним никаких сделок! Перейдите в его профиль, чтобы узнать причину блокировки.
А вообще было бы круто если бы у таких петов полоса голода совпадала с отсчетом времени предмета для призыва.
Оно так и работает у этих петов
 
Оно так и работает у этих петов
А как это реализовано? Если можно часть кода...
Просто у меня ну никак на предмете отсчет не идет. Я так думаю что на айтеме тоже должно показывать сколько времени призыва осталось как у темр айтемов.
 
да по аналогии с теневыми и делаешь - у меня к примеру так оно и работает.
только таск, уменьшающий время, включаешь/выключаешь при призыве/отзыве этих петов.

ну и вместо макс./тек. значения сытости я в пакетах с инфой о пете в данном случае шлю макс./тек. значение времени жизни предмета через который пет был призван.

можно было конечно и в FeedTask делать для таких петов отсчет оставшейся жизни и т.д., но лично мне проще и удобнее было сдлеать именно по аналогии с теневыми вещами.

КУсочек из PetInstance, отвечающий за время жизни таких петов, не все конечно, но большая часть.
 
Последнее редактирование:
Ребят вот интересно а можно ли прикрутить счетчик как у временных предметов?
Я все испробовал- но как остановить таймер я так и не понял.
Код:
if (_lifeTimeTask != null)
            {
                _lifeTimeTask.cancel(false);
                _lifeTimeTask = null;
            }
Этот вариант не работае. Такое ощущение что после запуска таймера он уже в клиенте дальше сам идет.
Вот код таска на запуск таймера L2ItemInstance.java
Код:
    public class LifeTimeTask implements Runnable
    {
        @Override
        public void run()
        {
            L2Player owner = getOwner();
            if(owner == null || !owner.isOnline())
            {
                return;
            }
           
            if(isShadowItem())
            {
                if(!isEquipped())
                {
                    return;
                }
                setLifeTimeRemaining(owner, getLifeTimeRemaining() - 1);
            }
            if(checkDestruction(owner))
            {
                return;
            }
            _itemLifeTimeTask = ThreadPoolManager.getInstance().scheduleGeneral(this, 60000); // У шэдовов 1 цикл = 60 сек.
        }
    }
А вот все что к нему прилагается.
Код:
    private boolean checkDestruction(L2Player owner)
    {
        if(!isShadowItem() && !isTemporalItem())
        {
            return true;
        }
        int left = getLifeTimeRemaining();
        if(isTemporalItem())
        {
            left /= 60;
        }
        if(left == 10 || left == 5 || left == 1 || left <= 0)
        {
            if(isShadowItem())
            {
                SystemMessage sm;
                if(left == 10)
                {
                    sm = new SystemMessage(SystemMessage.S1S_REMAINING_MANA_IS_NOW_10);
                }
                else if(left == 5)
                {
                    sm = new SystemMessage(SystemMessage.S1S_REMAINING_MANA_IS_NOW_5);
                }
                else if(left == 1)
                {
                    sm = new SystemMessage(SystemMessage.S1S_REMAINING_MANA_IS_NOW_1_IT_WILL_DISAPPEAR_SOON);
                }
                else
                {
                    sm = new SystemMessage(SystemMessage.S1S_REMAINING_MANA_IS_NOW_0_AND_THE_ITEM_HAS_DISAPPEARED);
                }
                sm.addItemName(getItemId());
                owner.sendPacket(sm);
            }
            if(left <= 0)
            {
                owner.getInventory().unEquipItem(this);
                owner.getInventory().destroyItem(this, getCount(), true);
                if(isTemporalItem())
                {
                    owner.sendPacket(new SystemMessage(SystemMessage.THE_LIMITED_TIME_ITEM_HAS_BEEN_DELETED).addItemName(_itemTemplate.getItemId()));
                }
                owner.sendPacket(new ItemList(owner, false)); // перестраховка
                owner.broadcastUserInfo(true);
                return true;
            }
        }
        return false;
    }
Код:
    public void startTemporalTask(L2Player owner)
    {
        if(!isTemporalItem() || owner == null) // Вещь не временная? До свидания.
        {
            return;
        }
        if(_itemLifeTimeTask != null && !_itemLifeTimeTask.isDone()) // Если таск уже тикает, то повторно дергать не надо
        {
            return;
        }
        if(!checkDestruction(owner)) // Если у вещи ещё есть мана - запустить таск уменьшения
        {
            _itemLifeTimeTask = ThreadPoolManager.getInstance().scheduleGeneral(new LifeTimeTask(), 60000);
        }
    }
Метод как написал Gaikotsu хороший и в пищи пета показывает сколько ему осталось а вот на самой вещи не идет отсчет а очень бы хотелось видеть отсчет и на самой вещи призыва.
Единственное не понял как остановить таск на эту вещи и потом уже ее запускать и останавливать в L2PetInstance.java
 
Назад
Сверху Снизу