Перейти к содержанию

Gaikotsu

Постоялец
  • Публикаций

    1569
  • Зарегистрирован

  • Посещение

  • Победитель дней

    62
  • Отзывы

    0%

Весь контент Gaikotsu

  1. Список данных из карт дополнен - так же добавил данные карт из Helios и Grand Crusade. Лежат все так же на OneDrive - http://1drv.ms/1OqtHDe
  2. Gaikotsu

    .acp как соулшоты

    не очень твой вопрос понял если честно. на скилл-тоггл повешен хэндлер скилла, в котором чекаются все условия дял применения и собственно говоря происходит применение бутылок а за периодичность проверок сам тоггл отвечает чисто для примера покажу часть моей реализации вот к примеру сами скиллы <skill id="90081" levels="1" name="Auto Use HP Potion"> <set name="icon" val="icon.etc_potion_red_i00" /> <set name="magicLevel" val="85" /> <set name="target" val="SELF" /> <set name="skillType" val="CONT" /> <set name="operateType" val="OP_TOGGLE" /> <set name="isSaveable" val="false" /> <set name="protectType" val="DEATH;REFLECTION;SUBCLASS;CANCEL;SELF_DISPEL" /> <for> <effect count="0x7fffffff" name="Handler" time="0.333" val="1" /> </for> </skill> <skill id="90082" levels="1" name="Auto Use CP Potion"> <set name="icon" val="icon.etc_potion_yellow_i00" /> <set name="magicLevel" val="85" /> <set name="target" val="SELF" /> <set name="skillType" val="CONT" /> <set name="operateType" val="OP_TOGGLE" /> <set name="isSaveable" val="false" /> <set name="protectType" val="DEATH;REFLECTION;SUBCLASS;CANCEL;SELF_DISPEL" /> <for> <effect count="0x7fffffff" name="Handler" time="0.333" val="2" /> </for> </skill> <skill id="90083" levels="1" name="Auto Use MP Potion"> <set name="icon" val="icon.etc_potion_blue_i00" /> <set name="magicLevel" val="85" /> <set name="target" val="SELF" /> <set name="skillType" val="CONT" /> <set name="operateType" val="OP_TOGGLE" /> <set name="isSaveable" val="false" /> <set name="protectType" val="DEATH;REFLECTION;SUBCLASS;CANCEL;SELF_DISPEL" /> <for> <effect count="0x7fffffff" name="Handler" time="0.333" val="3" /> </for> </skill> с периодичностью в 333мс дергает хэндлер скилла, где и происходят проверки и использование. вот этот хэндлер package custom.auto_use; import handler.skills.ScriptSkillEffect; import l2p.gameserver.config.CustomConfig; import l2p.gameserver.model.Creature; import l2p.gameserver.model.Effect; import l2p.gameserver.model.Player; import l2p.gameserver.model.items.ItemInstance; import l2p.gameserver.utils.ItemUtils; /** * @[member='Authority'] Gaikotsu */ public class AutoUseSkill extends ScriptSkillEffect { private static final int[] _skillIds = { AutoUse.AU_HP_POTION.getId(), AutoUse.AU_CP_POTION.getId(), AutoUse.AU_MP_POTION.getId() }; @[member='override'] public boolean checkCondition(Effect effect, Creature caster, Creature target) { if (!CustomConfig.AUTO_USE_ENABLED) return false; Player player = (Player) caster; if (player == null) return false; if (!AutoUse.isAllowed(player)) return false; if (AutoUse.getPotion(player, (int) effect.calc()) == null) { player.sendPopupMessage("Активация невозможна по причине отсутствия подходящих зелий."); return false; } return true; } @[member='override'] public boolean onActionTime(Effect effect, Creature caster, Creature target) { if (caster == null) return false; Player player = (Player) caster; if (!AutoUse.checkPlayer(player)) return true; AutoUseData data = AutoUse.getData(player); if (data == null) return false; int type = (int) effect.calc(); switch (type) { case AutoUse.HP_POTION: if (player.getCurrentHpRatio() > data.getHpRatio()) return true; break; case AutoUse.CP_POTION: if (player.getCurrentCpRatio() > data.getCpRatio()) return true; break; case AutoUse.MP_POTION: if (player.getCurrentMpRatio() > data.getMpRatio()) return true; break; default: return false; } ItemInstance potion = AutoUse.getPotion(player, type); if (potion == null) { player.sendMessage("Зелья закончились. Автоиспользование отключается."); return false; } ItemUtils.useItem(player, potion, false, false, false); return true; } @[member='override'] public int[] getSkillIds() { return _skillIds; } } класс AutoUse и другие задействованные не дам - его если что додумывайте сами, он по логике достаточно простой ну а для настроек порога срабатывания заведена voiced-команда, в которой можно указать % при котором начинают юзаться соответсвующие бутылки + эта же команда показывает список всех разрешенных для использования банок и их количество З.Ы. если что полный пример реализации есть на конкурирующем форуме (о котором многие знают), который я не буду указывать по причине нежелания получить предупреждение/бан.
  3. Gaikotsu

    .acp как соулшоты

    на тогглах как раз таки и самый простой и быстрый способ запилить нормальное ацп
  4. Переполнение буфера данных пакета. Как вариант хтмлка слишком большая.
  5. код в блокноте чтоли пишется? Мне вот что интерестно - религия чтоли не позволяет пользоваться эклипсом/идеей, в которых подобыне проблемы, типа неправильных импортов, исправляются на раз, т.к. сама IDE подскажет набиболее вероятные правильные импорты.
  6. Доработать указанный класс, чтобы исключал ид проф 58-87, 119-122 ибо это ид-пустышки, не используемые ни одной из проф.
  7. эм... неужели в этом вашем пвсофт для суммонов не обрабатывается телепортация их хозяина? по моему даже в самых ущербных сборках для суммонов/петов есть обработка события "хозяин телепортировался", телепортирующий суммонов/петов за хоязином.
  8. Брать что-то с исходниками и допиливать до нужных хроник. Я в свое время так и поднимал сырцы одной сборки полухармони/полутаути сначала до линдвиора, а потом уже и до артеи. А готовые сборки в состоянии "все работает" ты в шаре не найдешь.
  9. Gaikotsu

    кнопки диалогов

    public static enum ButtonType { SMALL("L2UI_CT1.Button_DF_Small", "L2UI_CT1.Button_DF_Small_Down", -1, 24), NORMAL("L2UI_CT1.Button_DF", "L2UI_CT1.Button_DF_Down", -1, 26), LARGE("L2UI_CT1.Button_DF_Large", "L2UI_CT1.Button_DF_Large_Down", -1, 35), UP("L2UI_CH3.UpButton", "L2UI_CH3.upbutton_down", 15, 15), DOWN("L2UI_CH3.DownButton", "L2UI_CH3.downbutton_down", 15, 15), PREV("L2UI_CH3.prev1", "L2UI_CH3.prev1_down", 15, 15), NEXT("L2UI_CH3.next1", "L2UI_CH3.next1_down", 15, 15), ABOUT("L2UI_CH3.aboutotpicon", "L2UI_CH3.aboutotpicon_down", 15, 15), INPUT("L2UI_CT1.Button_DF_Input", "L2UI_CT1.Button_DF_Input_Down", 15, 15), LIST("L2UI_CT1.PostWnd_DF_Btn_List", "L2UI_CT1.PostWnd_DF_Btn_List_Down", 15, 15), OLYMPIAD_APPLY("L2UI_CT1.OlympiadWnd_DF_Apply", "L2UI_CT1.OlympiadWnd_DF_Apply_Down", 197, 29), OLYMPIAD_BACK("L2UI_CT1.OlympiadWnd_DF_Back", "L2UI_CT1.OlympiadWnd_DF_Back_Down", 197, 29), OLYMPIAD_BUY_EQUIP("L2UI_CT1.OlympiadWnd_DF_BuyEquip", "L2UI_CT1.OlympiadWnd_DF_BuyEquip_Down", 197, 29), OLYMPIAD_BUY_ETC("L2UI_CT1.OlympiadWnd_DF_BuyEtc", "L2UI_CT1.OlympiadWnd_DF_BuyEtc_Down", 197, 29), OLYMPIAD_FIGHT_1("L2UI_CT1.OlympiadWnd_DF_Fight1None", "L2UI_CT1.OlympiadWnd_DF_Fight1None_Down", 197, 29), OLYMPIAD_FIGHT_3("L2UI_CT1.OlympiadWnd_DF_Fight3None", "L2UI_CT1.OlympiadWnd_DF_Fight3None_Down", 197, 29), OLYMPIAD_HERO_CONFIRM("L2UI_CT1.OlympiadWnd_DF_HeroConfirm", "L2UI_CT1.OlympiadWnd_DF_HeroConfirm_Down", 197, 29), OLYMPIAD_INFO("L2UI_CT1.OlympiadWnd_DF_Info", "L2UI_CT1.OlympiadWnd_DF_Info_Down", 197, 29), OLYMPIAD_REWARD("L2UI_CT1.OlympiadWnd_DF_Reward", "L2UI_CT1.OlympiadWnd_DF_Reward_Down", 197, 29), OLYMPIAD_WATCH("L2UI_CT1.OlympiadWnd_DF_Watch", "L2UI_CT1.OlympiadWnd_DF_Watch_Down", 197, 29); private final String _foreTexture; private final String _backTexture; private final int _width; private final int _height; private ButtonType(String foreTexture, String backTexture, int width, int height) { _foreTexture = foreTexture; _backTexture = backTexture; _width = width; _height = height; } public String getForeTexture() { return _foreTexture; } public String getBackTexture() { return _backTexture; } public int getWidth(int width) { return _width > 0 ? _width : width; } public int getHeight(int height) { return _height > 0 ? _height : height; } } ну тут само собой далеко не все + не все из этого могут быть в хрониках которые ты юзаешь З.Ы. можете спросить на кой этот изврат с энумом? дык чтоб на лету генерить кнопки нужного вида и при этом не писать кучу хтмл-кода, в просто писать что-то типа HtmlUtils.button(ButtonType.SMALL, "Вкл.", "bypass -h admin_event_start " + event.getImpl(), 40); и получать готовый код для кнопки.
  10. :рукалицо: З.Ы. но вы продолжайте, продолжайте - иногда весело всякий бред почитать.
  11. Опираться на мозги и прямые руки. Понять как писать новые инстансы можно изучив реализацию уже имеющихся - это самый простой путь.
  12. Gaikotsu

    Проблема с bypass

    у твоего другого нпс должен быть такой же класс как у старого или же с наследованием от оного.
  13. Gaikotsu

    Пойду учиться!

    Я даже не знаю - смеяться с этой темы или же плакать...
  14. Для примера можно посмотреть реализацию клан гейта, правда я не помню - была ли уже эта функция в интерлюде.
  15. Gaikotsu

    Проблема с Fear

    :рукалицо: ты хоть понял что ты посоветовал? ты посоветовал убрать из проверок на возможность кастовать и атаковать проверку на наличие наложенного фира. т.е. если нигде более нет доп проверок на эту тему - под наложенным фиром после твоего фикса можно будет кастовать скиллы и т.д.
  16. Gaikotsu

    Проблема с Fear

    какой п...цкод сообщением выше - не лучше. автор, сомтри как феар реализован в овероподобных сборках, а конкретно расчет движения и пробуй адаптировать под свою сборку package l2p.gameserver.skills.effects; import l2p.gameserver.ai.CtrlIntention; import l2p.gameserver.geodata.GeoEngine; import l2p.gameserver.model.Effect; import l2p.gameserver.model.Player; import l2p.gameserver.model.entity.events.impl.SiegeEvent; import l2p.gameserver.model.instances.SummonInstance; import l2p.gameserver.network.serverpackets.components.SystemMsg; import l2p.gameserver.stats.Env; import l2p.gameserver.utils.PositionUtils; public final class EffectFear extends Effect { public static final double FEAR_RANGE = 900; public EffectFear(Env env, EffectTemplate template) { super(env, template); } @[member='override'] public boolean checkCondition() { if (_effected.isOutOfControlImmune()) { getEffector().sendPacket(SystemMsg.THAT_IS_AN_INCORRECT_TARGET); return false; } // Fear нельзя наложить на осадных саммонов Player player = _effected.getPlayer(); if (player != null) { SiegeEvent<?, ?> siegeEvent = player.getEvent(SiegeEvent.class); if (_effected.isServitor() && siegeEvent != null && siegeEvent.containsSiegeSummon((SummonInstance) _effected)) { getEffector().sendPacket(SystemMsg.THAT_IS_AN_INCORRECT_TARGET); return false; } } if (_effected.isInPeaceZone()) { getEffector().sendPacket(SystemMsg.YOU_MAY_NOT_ATTACK_IN_A_PEACEFUL_ZONE); return false; } return super.checkCondition(); } @[member='override'] public void onStart() { super.onStart(); if (!_effected.startFeared()) { if (_effected.isServitor()) _effected.saveAttackTarget(); _effected.abortAttack(true, true); _effected.abortCast(true, true); _effected.stopMove(); } onActionTime(); } @[member='override'] public void onExit() { super.onExit(); _effected.stopFeared(); _effected.getAI().setIntention(CtrlIntention.AI_INTENTION_ACTIVE); if (_effected.isServitor()) _effected.restoreAttackTarget(); } @[member='override'] public boolean onActionTime() { final double angle = Math.toRadians(PositionUtils.calculateAngleFrom(_effector, _effected)); final int oldX = _effected.getX(); final int oldY = _effected.getY(); final int x = oldX + (int) (FEAR_RANGE * Math.cos(angle)); final int y = oldY + (int) (FEAR_RANGE * Math.sin(angle)); _effected.setRunning(); _effected.moveToLocation(GeoEngine.moveCheck(oldX, oldY, _effected.getZ(), x, y, _effected.getGeoIndex()), 0, false); return true; } } что представляет собой calculateAngleFrom public static double calculateAngleFrom(GameObject obj1, GameObject obj2) { return calculateAngleFrom(obj1.getX(), obj1.getY(), obj2.getX(), obj2.getY()); } public static double calculateAngleFrom(int obj1X, int obj1Y, int obj2X, int obj2Y) { double angleTarget = Math.toDegrees(Math.atan2(obj2Y - obj1Y, obj2X - obj1X)); if (angleTarget < 0) angleTarget = 360 + angleTarget; return angleTarget; }
  17. а зачем вводить отдельные предметы и модифицировать клиент на эту тему, если можно обойтись без этого?
  18. hardcode way наше все З.Ы. это сарказм, если что
  19. как вариант не под той версией явы запускаешь, если у тебя их стоит несколько в системе в этом случае указывай полностью путь до нужной java.exe
  20. И причем интересно тут мульттиселлы? если список наносимых красок у татуировщика вобще-то не мультиселл, а отдельный список, генерируемый отлеьным пакетом.
  21. ну так собери из class-файлов jar если делаешь компиляцию при помощи инструкций в build.xml или подобном, то в нем добавь еще операцию по сбору компиленного в jar
  22. ни сборки ни еще каких подоробностей... а вобще если у тебя такое поведение в мультиселах, то тебе только один путь - лезть в исходники ядра и дорабатывать процесс покупки/продажи через мультиселы.
  23. 1. запускаю сервер в режиме отладки непосредственно в IDE, таким образом все изменения в коде сразу же вносятся в работающий сервер. Рассинхронизация и значит невозможность применить изменения обычно происходят только при достаточно серьезных изменениях кода, так что в целом рестартить сервер для их применения приходится редко. 2. работаю в эклипсе, в идее наверняка тоже есть возможность запускать сервер в режиме отладки.
  24. Вопрос не очень понятен. где получить objId, когда, зачем?
×
×
  • Создать...