только петом (сам дизер говорил 2-3 года назад)Вообщем нужен совет знающих, имеем сборку дизера ИТ люцера3. Хочется добавить агатионов, проблем с этим нет, но возник другой вопрос, как то можно убрать окно интерфейса пета, чтобы агатион был просто как тень, и не вылазило его меню с уровнем хп и скилами.
З.Ы Вырожай мысли правильно )))
Проще скажу, как то можно их реализовать наподобе кубиков суммонов
Отключить интерфейс Пета можно как то? В датнике или на стороне серверной части?только петом (сам дизер говорил 2-3 года назад)
if(ID == %agat_ID%)
{
Me.HideWindow();
return;
}
спасибо добрый человекМожно предположить, что если в интерфейс приходит окошко - следовательно отдаётся какая то информация - ИД, число ХП и т.п., за что можно зацепиться и поставить в интерфейсе простейшую заглушку, в нужное место:
C#:if(ID == %agat_ID%) { Me.HideWindow(); return; }
Создаёшь скил для агатиона, на него прикручиваешь статы к п атакиА кто может подсказать, как добавить в агатиона (они у меня реализованы как петы, сборка acis) получение бонуса к статам чара? Чтобы просто вызвав пета, (он же агатион), чар получал, к примеру, +30% к п.атаке и м.атаке?
Бентли с тюнингом под запорожец.а если так прямо сильно нужен ифейс ила откатите этот синий на любом клиенте.
не ну есть такиеБентли с тюнингом под запорожец.
Да тут по сути, все что нужно, чтобы вызванный пет, он же агатион, давал хоть какие то плюшки/статы хозяину. Пусть даже в виде заглушки в коде ядра тупо на п. и м. Атаку. Реализовывать всю систему агатиона более поздних хроник никто и не собирается, тем более на основе интерлюда. Ибо если хочешь весь функционал, ставь последние хроники, а не ил допотопный ковыряйне ну есть такиено я просто для информации тем кому нужен именно ил ифейс) проще откатить его чем реализовать большую часть функционала новых клиентов.
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);
}
}
}
}
<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>
неправильно понимаешьЯ же правильно понимаю, ты агатионов используешь как суммой кубики, на сборке ИТ? Как это реализовать?
Агатионы типо миньенов у Мобов, так что ли?неправильно понимаешь
агатионы у меня на стороне сервера просто считаются "наследниками" кубиков. Ну в том же принципе что к примеру мобы - это "наследники" мирных нпс и т.п.
Т.е. по сути можно сказать большая функционала что кубиков, что агатионов лежит в классе кубиков, а в наследном от него классе агатионов довписан только специфичный чисто для агатионов функционал.
*** Скрытый текст не может быть процитирован. ***
забей. для интерлюда вобщем реализация эта никак не подойдет - речь у меня то идет чисто про особенности реализации на сервере. А для клиента ничем другим агатионы не прикидываются.Агатионы типо миньенов у Мобов, так что ли?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?