Нужна помощь по Агатионам и их реализации

  • Автор темы Автор темы XaPu3Ma
  • Дата начала Дата начала

XaPu3Ma

Свой человек
Местный
Сообщения
341
Розыгрыши
0
Решения
2
Репутация
104
Реакции
526
Баллы
523
Хроники
  1. Interlude
Сборка
Lucera 3
Вообщем нужен совет знающих, имеем сборку дизера ИТ люцера3. Хочется добавить агатионов, проблем с этим нет, но возник другой вопрос, как то можно убрать окно интерфейса пета, чтобы агатион был просто как тень, и не вылазило его меню с уровнем хп и скилами.

З.Ы Вырожай мысли правильно )))

Проще скажу, как то можно их реализовать наподобе кубиков суммонов
 
Вообщем нужен совет знающих, имеем сборку дизера ИТ люцера3. Хочется добавить агатионов, проблем с этим нет, но возник другой вопрос, как то можно убрать окно интерфейса пета, чтобы агатион был просто как тень, и не вылазило его меню с уровнем хп и скилами.

З.Ы Вырожай мысли правильно )))

Проще скажу, как то можно их реализовать наподобе кубиков суммонов
только петом (сам дизер говорил 2-3 года назад)
 
Можно предположить, что если в интерфейс приходит окошко - следовательно отдаётся какая то информация - ИД, число ХП и т.п., за что можно зацепиться и поставить в интерфейсе простейшую заглушку, в нужное место:

C#:
if(ID == %agat_ID%)
{
    Me.HideWindow();
    return;
}
 
Можно предположить, что если в интерфейс приходит окошко - следовательно отдаётся какая то информация - ИД, число ХП и т.п., за что можно зацепиться и поставить в интерфейсе простейшую заглушку, в нужное место:

C#:
if(ID == %agat_ID%)
{
    Me.HideWindow();
    return;
}
спасибо добрый человек
 
А кто может подсказать, как добавить в агатиона (они у меня реализованы как петы, сборка acis) получение бонуса к статам чара? Чтобы просто вызвав пета, (он же агатион), чар получал, к примеру, +30% к п.атаке и м.атаке?
 
Ну я бы листенер повесил на вызов и в нем к примеру накладывал бафф, но вряд ли в сборке есть листенеры на это событие.
 
А кто может подсказать, как добавить в агатиона (они у меня реализованы как петы, сборка acis) получение бонуса к статам чара? Чтобы просто вызвав пета, (он же агатион), чар получал, к примеру, +30% к п.атаке и м.атаке?
Создаёшь скил для агатиона, на него прикручиваешь статы к п атаки
 
Ага, и он у тебя волшебным образом сам активируется при вызове агатиона, да? :)
 
  • Ха-ха-ха
Реакции: Rolo
Ага, особенно если у тебя агатионы, просто прикрученные текстуры, поверх стандартной системы петов. (Интерлюд хроники все же). :) Пробовал я скил новый создавать и втыкать по типу того, как реализованы скилы у петов. Но не получается/работает нифига увы.
 
блин вот столько читаю на иле сделать хочу то то, ну емае апните пару пакетов минимум до сальвы и 80% хотелок реализуете без каких либо проблем. а если так прямо сильно нужен ифейс ила откатите этот синий на любом клиенте. Так быстрее и безопаснее и дешевле будет.
 
Бентли с тюнингом под запорожец.
не ну есть такие :D но я просто для информации тем кому нужен именно ил ифейс) проще откатить его чем реализовать большую часть функционала новых клиентов.
 
не ну есть такие :D но я просто для информации тем кому нужен именно ил ифейс) проще откатить его чем реализовать большую часть функционала новых клиентов.
Да тут по сути, все что нужно, чтобы вызванный пет, он же агатион, давал хоть какие то плюшки/статы хозяину. Пусть даже в виде заглушки в коде ядра тупо на п. и м. Атаку. Реализовывать всю систему агатиона более поздних хроник никто и не собирается, тем более на основе интерлюда. Ибо если хочешь весь функционал, ставь последние хроники, а не ил допотопный ковыряй
 
Ну вот у меня к примеру при вызове суммонов/петов/кубиков/агатионов дергается отдельный тип листенеров.
Так что если мне вдруг что-то требуется делать при определенном призыве - я просто могу добавить такой листенер в зареганные и в нем делать что мне хочется.
Раньше я это для тех же особых агатионов типа прем. агатиона использовал, чтобы через определенное время после вызова такого агатиона выдавать ежедневную награду.
Сейчас правда уже такой листенер не требуется, т.к. полностью переписал у себя систему кубиков и агатионов - агатионы у меня сейчас просто разновидность кубиков, как и на оффе. Ну и для выполнения разных действий у конкретных кубиков или агатионов не требуется расписывать индивидуальные листенеры и все такое.

Java:
package listeners.items;

import java.util.Calendar;

import l2p.commons.threading.RunnableImpl;
import l2p.commons.util.Rnd;
import l2p.gameserver.ThreadPoolManager;
import l2p.gameserver.enums.LogAction;
import l2p.gameserver.enums.SummonType;
import l2p.gameserver.listener.actor.player.OnPlayerEnterListener;
import l2p.gameserver.listener.actor.player.OnPremiumStatusListener;
import l2p.gameserver.listener.actor.player.OnSummonListener;
import l2p.gameserver.model.Player;
import l2p.gameserver.model.Summon;
import l2p.gameserver.model.actor.listener.PlayerListenerList;
import l2p.gameserver.scripts.ScriptFile;
import l2p.gameserver.utils.ItemUtils;
import l2p.gameserver.utils.Log;

/**
 * @author Gaikotsu
 */
public class PremiumAgathion implements ScriptFile
{
    private static final int AgathionItemId = 20970;
    private static final int AgathionNpcId = 1575;

    private static final PremiumStatsusListener _premiumStatusListener = new PremiumStatsusListener();
    private static final PlayerEnterListener _playerEnterListener = new PlayerEnterListener();
    private static final SummonListener _summonListener = new SummonListener();

    @Override
    public void onLoad()
    {
        PlayerListenerList.addGlobal(_premiumStatusListener);
        PlayerListenerList.addGlobal(_playerEnterListener);
        PlayerListenerList.addGlobal(_summonListener);
    }

    @Override
    public void onReload()
    {
        PlayerListenerList.removeGlobal(_premiumStatusListener);
        PlayerListenerList.removeGlobal(_playerEnterListener);
        PlayerListenerList.removeGlobal(_summonListener);
    }

    @Override
    public void onShutdown()
    {}

    public static class PremiumStatsusListener implements OnPremiumStatusListener
    {

        @Override
        public void onStarted(Player player, int hours)
        {
            // Добавляем премиального агатиона
            if (player.getItemCount(AgathionItemId) == 0)
                ItemUtils.addItem(player, AgathionItemId, 1, true);

            // Добавляем премиальный куб, если премиум куплен на 30 дней и более
            if (hours >= 720)
                ItemUtils.addItem(player, 23813, hours / 720, true);
        }

        @Override
        public void onEnded(Player player)
        {
            if (player.getItemCount(AgathionItemId) > 0)
                ItemUtils.removeItem(player, AgathionItemId, 1, true);
        }
    }

    public static class PlayerEnterListener implements OnPlayerEnterListener
    {
        @Override
        public void onPlayerEnter(Player player)
        {
            if (player.getRateBonusExpire() > 0)
            {
                if (player.getItemCount(AgathionItemId) == 0)
                    ItemUtils.addItem(player, AgathionItemId, 1, true);
            }
            else
            {
                if (player.getItemCount(AgathionItemId) > 0)
                    ItemUtils.removeItem(player, AgathionItemId, 1, true);
            }
        }
    }

    public static class SummonListener implements OnSummonListener
    {
        @Override
        public void onSummon(Player player, Summon summon, int id, SummonType type)
        {
            if (type != SummonType.AGATHION)
                return;

            if (id == AgathionNpcId)
                player.addSpecialTask(AgathionItemId, ThreadPoolManager.getInstance().scheduleAtFixedRate(new PremiumAgathionTask(player), Rnd.get(5, 10) * 60 * 1000L, 10 * 60 * 1000L));
            else
                player.removeSpecialTask(AgathionItemId);
        }
    }

    public static class PremiumAgathionTask extends RunnableImpl
    {
        private final Player _player;

        public PremiumAgathionTask(Player player)
        {
            _player = player;
        }

        @Override
        public void runImpl() throws Exception
        {
            if (_player == null || !_player.isConnected() || _player.isInOfflineMode() || _player.isLogoutStarted() || _player.getRateBonusExpire() <= 0 || _player.getAgathionId() != AgathionNpcId)
                return;

            int dayOfYear = Calendar.getInstance().get(Calendar.DAY_OF_YEAR);

            if (_player.getVariables().getVar("lastPremiumEgg", -1) != dayOfYear)
            {
                _player.getVariables().setVar("lastPremiumEgg", dayOfYear);
                ItemUtils.addItem(_player, 22649, 1, true);
                Log.logItem(_player, LogAction.AddPremiumEgg, 22649, 1);
            }
        }
    }
}
XML:
    <agathion id="1575" level="1" slot="1" delay="300">    <!-- Змей Горыныч / Three-headed Dragon -->
        <skill id="23448" level="1" chance="100" action="TIME" target="MASTER" delay="600" reuse_type="DAILY" />    <!-- Подарок Избушки на Курьих Ножках / Blessed Three-headed Dragon's Egg -->
    </agathion>
 
Ну вот у меня к примеру при вызове суммонов/петов/кубиков/агатионов дергается отдельный тип листенеров.
Так что если мне вдруг что-то требуется делать при определенном призыве - я просто могу добавить такой листенер в зареганные и в нем делать что мне хочется.
Раньше я это для тех же особых агатионов типа прем. агатиона использовал, чтобы через определенное время после вызова такого агатиона выдавать ежедневную награду.
Сейчас правда уже такой листенер не требуется, т.к. полностью переписал у себя систему кубиков и агатионов - агатионы у меня сейчас просто разновидность кубиков, как и на оффе. Ну и для выполнения разных действий у конкретных кубиков или агатионов не требуется расписывать индивидуальные листенеры и все такое.

Java:
package listeners.items;

import java.util.Calendar;

import l2p.commons.threading.RunnableImpl;
import l2p.commons.util.Rnd;
import l2p.gameserver.ThreadPoolManager;
import l2p.gameserver.enums.LogAction;
import l2p.gameserver.enums.SummonType;
import l2p.gameserver.listener.actor.player.OnPlayerEnterListener;
import l2p.gameserver.listener.actor.player.OnPremiumStatusListener;
import l2p.gameserver.listener.actor.player.OnSummonListener;
import l2p.gameserver.model.Player;
import l2p.gameserver.model.Summon;
import l2p.gameserver.model.actor.listener.PlayerListenerList;
import l2p.gameserver.scripts.ScriptFile;
import l2p.gameserver.utils.ItemUtils;
import l2p.gameserver.utils.Log;

/**
 * @author Gaikotsu
 */
public class PremiumAgathion implements ScriptFile
{
    private static final int AgathionItemId = 20970;
    private static final int AgathionNpcId = 1575;

    private static final PremiumStatsusListener _premiumStatusListener = new PremiumStatsusListener();
    private static final PlayerEnterListener _playerEnterListener = new PlayerEnterListener();
    private static final SummonListener _summonListener = new SummonListener();

    @Override
    public void onLoad()
    {
        PlayerListenerList.addGlobal(_premiumStatusListener);
        PlayerListenerList.addGlobal(_playerEnterListener);
        PlayerListenerList.addGlobal(_summonListener);
    }

    @Override
    public void onReload()
    {
        PlayerListenerList.removeGlobal(_premiumStatusListener);
        PlayerListenerList.removeGlobal(_playerEnterListener);
        PlayerListenerList.removeGlobal(_summonListener);
    }

    @Override
    public void onShutdown()
    {}

    public static class PremiumStatsusListener implements OnPremiumStatusListener
    {

        @Override
        public void onStarted(Player player, int hours)
        {
            // Добавляем премиального агатиона
            if (player.getItemCount(AgathionItemId) == 0)
                ItemUtils.addItem(player, AgathionItemId, 1, true);

            // Добавляем премиальный куб, если премиум куплен на 30 дней и более
            if (hours >= 720)
                ItemUtils.addItem(player, 23813, hours / 720, true);
        }

        @Override
        public void onEnded(Player player)
        {
            if (player.getItemCount(AgathionItemId) > 0)
                ItemUtils.removeItem(player, AgathionItemId, 1, true);
        }
    }

    public static class PlayerEnterListener implements OnPlayerEnterListener
    {
        @Override
        public void onPlayerEnter(Player player)
        {
            if (player.getRateBonusExpire() > 0)
            {
                if (player.getItemCount(AgathionItemId) == 0)
                    ItemUtils.addItem(player, AgathionItemId, 1, true);
            }
            else
            {
                if (player.getItemCount(AgathionItemId) > 0)
                    ItemUtils.removeItem(player, AgathionItemId, 1, true);
            }
        }
    }

    public static class SummonListener implements OnSummonListener
    {
        @Override
        public void onSummon(Player player, Summon summon, int id, SummonType type)
        {
            if (type != SummonType.AGATHION)
                return;

            if (id == AgathionNpcId)
                player.addSpecialTask(AgathionItemId, ThreadPoolManager.getInstance().scheduleAtFixedRate(new PremiumAgathionTask(player), Rnd.get(5, 10) * 60 * 1000L, 10 * 60 * 1000L));
            else
                player.removeSpecialTask(AgathionItemId);
        }
    }

    public static class PremiumAgathionTask extends RunnableImpl
    {
        private final Player _player;

        public PremiumAgathionTask(Player player)
        {
            _player = player;
        }

        @Override
        public void runImpl() throws Exception
        {
            if (_player == null || !_player.isConnected() || _player.isInOfflineMode() || _player.isLogoutStarted() || _player.getRateBonusExpire() <= 0 || _player.getAgathionId() != AgathionNpcId)
                return;

            int dayOfYear = Calendar.getInstance().get(Calendar.DAY_OF_YEAR);

            if (_player.getVariables().getVar("lastPremiumEgg", -1) != dayOfYear)
            {
                _player.getVariables().setVar("lastPremiumEgg", dayOfYear);
                ItemUtils.addItem(_player, 22649, 1, true);
                Log.logItem(_player, LogAction.AddPremiumEgg, 22649, 1);
            }
        }
    }
}
XML:
    <agathion id="1575" level="1" slot="1" delay="300">    <!-- Змей Горыныч / Three-headed Dragon -->
        <skill id="23448" level="1" chance="100" action="TIME" target="MASTER" delay="600" reuse_type="DAILY" />    <!-- Подарок Избушки на Курьих Ножках / Blessed Three-headed Dragon's Egg -->
    </agathion>
Да мне намного проще надо. Просто чтобы при вызове пета, чару (его хозяину) давался пассивный скил. Саму систему я менять не хочу, меня и так вполне все устраивает. Единственное что, чтобы от них была реальная польза, сделаю вкусные статы в самом этом пассивном скиле. Только вот с Явой дружу я как гусь со свиньёй :)
Хотя вроде понимаю, что там пару строк кода, по типу: если пет призван, то владелец получает скилл айди и уровень.
 
Ну вот у меня к примеру при вызове суммонов/петов/кубиков/агатионов дергается отдельный тип листенеров.
Так что если мне вдруг что-то требуется делать при определенном призыве - я просто могу добавить такой листенер в зареганные и в нем делать что мне хочется.
Раньше я это для тех же особых агатионов типа прем. агатиона использовал, чтобы через определенное время после вызова такого агатиона выдавать ежедневную награду.
Сейчас правда уже такой листенер не требуется, т.к. полностью переписал у себя систему кубиков и агатионов - агатионы у меня сейчас просто разновидность кубиков, как и на оффе. Ну и для выполнения разных действий у конкретных кубиков или агатионов не требуется расписывать индивидуальные листенеры и все такое.

Java:
package listeners.items;

import java.util.Calendar;

import l2p.commons.threading.RunnableImpl;
import l2p.commons.util.Rnd;
import l2p.gameserver.ThreadPoolManager;
import l2p.gameserver.enums.LogAction;
import l2p.gameserver.enums.SummonType;
import l2p.gameserver.listener.actor.player.OnPlayerEnterListener;
import l2p.gameserver.listener.actor.player.OnPremiumStatusListener;
import l2p.gameserver.listener.actor.player.OnSummonListener;
import l2p.gameserver.model.Player;
import l2p.gameserver.model.Summon;
import l2p.gameserver.model.actor.listener.PlayerListenerList;
import l2p.gameserver.scripts.ScriptFile;
import l2p.gameserver.utils.ItemUtils;
import l2p.gameserver.utils.Log;

/**
 * @author Gaikotsu
 */
public class PremiumAgathion implements ScriptFile
{
    private static final int AgathionItemId = 20970;
    private static final int AgathionNpcId = 1575;

    private static final PremiumStatsusListener _premiumStatusListener = new PremiumStatsusListener();
    private static final PlayerEnterListener _playerEnterListener = new PlayerEnterListener();
    private static final SummonListener _summonListener = new SummonListener();

    @Override
    public void onLoad()
    {
        PlayerListenerList.addGlobal(_premiumStatusListener);
        PlayerListenerList.addGlobal(_playerEnterListener);
        PlayerListenerList.addGlobal(_summonListener);
    }

    @Override
    public void onReload()
    {
        PlayerListenerList.removeGlobal(_premiumStatusListener);
        PlayerListenerList.removeGlobal(_playerEnterListener);
        PlayerListenerList.removeGlobal(_summonListener);
    }

    @Override
    public void onShutdown()
    {}

    public static class PremiumStatsusListener implements OnPremiumStatusListener
    {

        @Override
        public void onStarted(Player player, int hours)
        {
            // Добавляем премиального агатиона
            if (player.getItemCount(AgathionItemId) == 0)
                ItemUtils.addItem(player, AgathionItemId, 1, true);

            // Добавляем премиальный куб, если премиум куплен на 30 дней и более
            if (hours >= 720)
                ItemUtils.addItem(player, 23813, hours / 720, true);
        }

        @Override
        public void onEnded(Player player)
        {
            if (player.getItemCount(AgathionItemId) > 0)
                ItemUtils.removeItem(player, AgathionItemId, 1, true);
        }
    }

    public static class PlayerEnterListener implements OnPlayerEnterListener
    {
        @Override
        public void onPlayerEnter(Player player)
        {
            if (player.getRateBonusExpire() > 0)
            {
                if (player.getItemCount(AgathionItemId) == 0)
                    ItemUtils.addItem(player, AgathionItemId, 1, true);
            }
            else
            {
                if (player.getItemCount(AgathionItemId) > 0)
                    ItemUtils.removeItem(player, AgathionItemId, 1, true);
            }
        }
    }

    public static class SummonListener implements OnSummonListener
    {
        @Override
        public void onSummon(Player player, Summon summon, int id, SummonType type)
        {
            if (type != SummonType.AGATHION)
                return;

            if (id == AgathionNpcId)
                player.addSpecialTask(AgathionItemId, ThreadPoolManager.getInstance().scheduleAtFixedRate(new PremiumAgathionTask(player), Rnd.get(5, 10) * 60 * 1000L, 10 * 60 * 1000L));
            else
                player.removeSpecialTask(AgathionItemId);
        }
    }

    public static class PremiumAgathionTask extends RunnableImpl
    {
        private final Player _player;

        public PremiumAgathionTask(Player player)
        {
            _player = player;
        }

        @Override
        public void runImpl() throws Exception
        {
            if (_player == null || !_player.isConnected() || _player.isInOfflineMode() || _player.isLogoutStarted() || _player.getRateBonusExpire() <= 0 || _player.getAgathionId() != AgathionNpcId)
                return;

            int dayOfYear = Calendar.getInstance().get(Calendar.DAY_OF_YEAR);

            if (_player.getVariables().getVar("lastPremiumEgg", -1) != dayOfYear)
            {
                _player.getVariables().setVar("lastPremiumEgg", dayOfYear);
                ItemUtils.addItem(_player, 22649, 1, true);
                Log.logItem(_player, LogAction.AddPremiumEgg, 22649, 1);
            }
        }
    }
}
XML:
    <agathion id="1575" level="1" slot="1" delay="300">    <!-- Змей Горыныч / Three-headed Dragon -->
        <skill id="23448" level="1" chance="100" action="TIME" target="MASTER" delay="600" reuse_type="DAILY" />    <!-- Подарок Избушки на Курьих Ножках / Blessed Three-headed Dragon's Egg -->
    </agathion>
Я же правильно понимаю, ты агатионов используешь как суммой кубики, на сборке ИТ? Как это реализовать?
 
Я же правильно понимаю, ты агатионов используешь как суммой кубики, на сборке ИТ? Как это реализовать?
неправильно понимаешь :)
агатионы у меня на стороне сервера просто считаются "наследниками" кубиков. Ну в том же принципе что к примеру мобы - это "наследники" мирных нпс и т.п.

Т.е. по сути можно сказать большая функционала что кубиков, что агатионов лежит в классе кубиков, а в наследном от него классе агатионов довписан только специфичный чисто для агатионов функционал.

 
Последнее редактирование:
  • Мне нравится
Реакции: kick
неправильно понимаешь :)
агатионы у меня на стороне сервера просто считаются "наследниками" кубиков. Ну в том же принципе что к примеру мобы - это "наследники" мирных нпс и т.п.

Т.е. по сути можно сказать большая функционала что кубиков, что агатионов лежит в классе кубиков, а в наследном от него классе агатионов довписан только специфичный чисто для агатионов функционал.

*** Скрытый текст не может быть процитирован. ***
Агатионы типо миньенов у Мобов, так что ли?
 
Агатионы типо миньенов у Мобов, так что ли?
забей. для интерлюда вобщем реализация эта никак не подойдет - речь у меня то идет чисто про особенности реализации на сервере. А для клиента ничем другим агатионы не прикидываются.

Изначально просто кубики на сервере у меня (основа - овер) работали как невидимый бафф и именно в эффекте этого баффа все действия кубика выполнялись.
Да вобщем вроде и на большинстве сборок до сих пор так кубики и реализованы - через костыль в виде баффа-невидимки.

А с агатионами тоже в большинстве сборок все печально - по сути чисто хранится ид нпс вызванного агатиона и все, чтобы было что в пакетах слать. и больше ничего.
В итоге если требуется реализовать поведение особых агатионов, типа премиального и т.п. - приходится устраивать пляски с бубном и писать костыли через всякое разное.
 
Последнее редактирование:
  • Мне нравится
Реакции: kick
Назад
Сверху Снизу