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

Alios

Пользователи
  • Публикаций

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

  • Посещение

  • Отзывы

    100%

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

  1. Доброго времени суток, уважаемые форумчане. Работаю с исходниками эпилога от команды L2NextGen rev 7083 из шары. И возникло у меня 3 вопроса, которые уже достаточно долго не могу решить. Видимо, потому что опыта работы с ядром маловато. Чтобы не захламлять форум кучей тем, решил их все изложить в одной теме. За любые подсказки по любому из них буду весьма признателен, да и на спасибки не зажлоблюсь. 1)Наиболее важный из этих вопросов - дуэли. Дело в том, что после окончания дуэли все дебаффы на игроках возвращаются в свое исходное состояние до дуэли. То есть, если в дуэли игрок получил дебафф, то после дуэли он снимется(ну и если до дуэли висел дебафф, а в дуэли его сняли клинсом - после дуэли он вернется). Это правильно, к этому претензий не имею. Но вот с баффами в этой версии сборки такого не предусмотрели, что очень нехорошо. По себе знаю, как неприятно, когда в дуэли кансельнут баффы, а после нее их приходится бафать заново, вот и хотелось бы это исправить, как и сделали на большинстве успешных серверов. Поискав нужную часть кода, наткнулся на файл l2n\game\model\entity\Duel.java В нем заострил внимание на этой части кода: // Nested Class public static class PlayerCondition { private long _playerStoreId = 0; private double _hp, _mp, _cp; private boolean _paDuel; private int _x, _y, _z; private DuelState _duelState; private GArray<L2Effect> _debuffs; public PlayerCondition(final L2Player player, final boolean partyDuel) { if(player == null) return; _playerStoreId = player.getStoredId(); _hp = player.getCurrentHp(); _mp = player.getCurrentMp(); _cp = player.getCurrentCp(); _paDuel = partyDuel; if(_paDuel) { _x = player.getX(); _y = player.getY(); _z = player.getZ(); } } public void registerDebuff(final L2Effect debuff) { if(_debuffs == null) _debuffs = new GArray<L2Effect>(); _debuffs.add(debuff); } public void RestoreCondition(final boolean abnormalEnd) { final L2Player player = getPlayer(); if(player == null) return; if(_debuffs != null) for(final L2Effect e : _debuffs) if(e != null) e.exit(); // for(L2Effect e : _player.getAllEffects()) // if(e.getSkill().isOffensive()) // e.exit(); // if it is an abnormal DuelEnd do not restore hp, mp, cp if(!abnormalEnd && !player.isDead()) { player.setCurrentHp(_hp, false); player.setCurrentMp(_mp); player.setCurrentCp(_cp); } if(_paDuel) TeleportBack(); } А также в конце файла на этот public void onBuff(final L2Player player, final L2Effect debuff) { if(player == null || debuff == null || _playerConditions == null) return; final PlayerCondition pcon = _playerConditions.get(player.getStoredId()); if(pcon != null) pcon.registerDebuff(debuff); } Подумав, что все просто, попробовал добавить аналогичный массив для баффов и аналогичные функции(или как там это правильно назвать), в итоге, получилось вот что: public static class PlayerCondition { private long _playerStoreId = 0; private double _hp, _mp, _cp; private boolean _paDuel; private int _x, _y, _z; private DuelState _duelState; private GArray<L2Effect> _debuffs; private GArray<L2Effect> _buffs; public PlayerCondition(final L2Player player, final boolean partyDuel) { if(player == null) return; _playerStoreId = player.getStoredId(); _hp = player.getCurrentHp(); _mp = player.getCurrentMp(); _cp = player.getCurrentCp(); _paDuel = partyDuel; if(_paDuel) { _x = player.getX(); _y = player.getY(); _z = player.getZ(); } } public void registerDebuff(final L2Effect debuff) { if(_debuffs == null) _debuffs = new GArray<L2Effect>(); _debuffs.add(debuff); } public void registerBuff(final L2Effect buff) { if(_buffs == null) _buffs = new GArray<L2Effect>(); _buffs.add(buff); } public void RestoreCondition(final boolean abnormalEnd) { final L2Player player = getPlayer(); if(player == null) return; if(_debuffs != null) for(final L2Effect e : _debuffs) if(e != null) e.exit(); if(_buffs != null) for(final L2Effect e : _buffs) if(e != null) e.exit(); // for(L2Effect e : _player.getAllEffects()) // if(e.getSkill().isOffensive()) // e.exit(); // if it is an abnormal DuelEnd do not restore hp, mp, cp if(!abnormalEnd && !player.isDead()) { player.setCurrentHp(_hp, false); player.setCurrentMp(_mp); player.setCurrentCp(_cp); } if(_paDuel) TeleportBack(); } и в конце файла public void onBuff(final L2Player player, final L2Effect debuff) { if(player == null || debuff == null || _playerConditions == null) return; final PlayerCondition pcon = _playerConditions.get(player.getStoredId()); if(pcon != null) pcon.registerDebuff(debuff); } public void onBuff1(final L2Player player, final L2Effect buff) { if(player == null || buff == null || _playerConditions == null) return; final PlayerCondition pcon = _playerConditions.get(player.getStoredId()); if(pcon != null) pcon.registerBuff(buff); } Но, попробовав это, я увидел, что не изменилось НИЧЕГО. Как возвращались дебаффы и было пофигу на баффы, так и осталось. Пробовал даже в коде этого файла везде, где только можно, менять слово debuff на buff, но даже после этого ничего не менялось при тесте в игре. Создалось впечатление, что сборке будто пофигу на код, описанный в этом файле. Но более похожего на нужный кода я не нашел в файлах исходников этой сборке. Вот и отчаялся со временем. Вся надежда на то, что более шарящие в работе с ядром и яве в целом люди с форума что-нибудь подскажут, натолкнут на истину и укажут на мои ошибки. 2) Вторым нерешенным вопросом остались банки на баффы. Взял за основу добавленные когда-то на руоффе кокткйли(Sweet Fruit Coctail и Fresh Fruit Coctail), изменил даваемые баффы из обычных скромненьких, на точеные резисты, вику, кк и так далее. Все получилось без особых проблем, но тот факт, что эти банки просто безоткатные, не дает мне покоя. И вот, промучившись несколько дней, я так и не смог сделать на них откат, даже идеи толком закончились. И снова надежда на ваши подсказки, господа. Вот получившийся код этих банок(файл в датапаке ItemHandlers.java): private final int[] sweet_list = { // Sweet Fruit Cocktail 1191, // Resist Fire 1182, // Resist Aqua 1189, // Resist Wind 1232, // Blazing Skin 1259, // Resist Shock }; private final int[] sweet_list1 = { // Sweet Fruit Cocktail 1392, // Holy Resistance 1393, // Unholy Resistance }; private final int[] sweet_list2 = { // Sweet Fruit Cocktail 1364, // Eye of Pa'agrio 1542, // Resist Shock }; private final int[] sweet_list3 = { // Sweet Fruit Cocktail 1363, // Chant of Victory }; // Sweet Fruit Cocktail public void ItemHandler_10178(L2Player player) { L2Player p = player; if(p.isInZone(ZoneType.OlympiadStadia)) { p.sendMessage("Невозможно использовать на олимпиаде."); return; } if(p.isInCombat()) { p.sendMessage("Невозможно использовать в бою."); return; } for(int skill : sweet_list) { p.broadcastPacket(new MagicSkillUse(p, p, skill, 1, 0, 300000)); p.altOnMagicUseTimer(p, SkillTable.getInstance().getInfo(skill, 330)); } for(int skill : sweet_list1) { p.broadcastPacket(new MagicSkillUse(p, p, skill, 1, 0, 300000)); p.altOnMagicUseTimer(p, SkillTable.getInstance().getInfo(skill, 130)); } for(int skill : sweet_list2) { p.broadcastPacket(new MagicSkillUse(p, p, skill, 1, 0, 300000)); p.altOnMagicUseTimer(p, SkillTable.getInstance().getInfo(skill, 1)); } for(int skill : sweet_list3) { p.broadcastPacket(new MagicSkillUse(p, p, skill, 1, 0, 300000)); p.altOnMagicUseTimer(p, SkillTable.getInstance().getInfo(skill, 315)); } } private final int[] fresh_list = { // Fresh Fruit Cocktail 1191, // Resist Fire 1182, // Resist Aqua 1189, // Resist Wind 1238, // Freezing Skin 1259, // Resist Shock }; private final int[] fresh_list1 = { // Fresh Fruit Cocktail 1392, // Holy Resistance 1393, // Unholy Resistance }; private final int[] fresh_list2 = { // Fresh Fruit Cocktail 1364, // Eye of Pa'agrio 1542, // Resist Shock }; private final int[] fresh_list3 = { // Fresh Fruit Cocktail 1357, // Prophecy of Wind }; // Fresh Fruit Cocktail public void ItemHandler_10179(L2Player player) { L2Player p = player; if(p.isInZone(ZoneType.OlympiadStadia)) { p.sendMessage("Невозможно использовать на олимпиаде."); return; } if(p.isInCombat()) { p.sendMessage("Невозможно использовать в бою."); return; } for(int skill : fresh_list) { p.broadcastPacket(new MagicSkillUse(p, p, skill, 1, 0, 0)); p.altOnMagicUseTimer(p, SkillTable.getInstance().getInfo(skill, 330)); } for(int skill : fresh_list1) { p.broadcastPacket(new MagicSkillUse(p, p, skill, 1, 0, 0)); p.altOnMagicUseTimer(p, SkillTable.getInstance().getInfo(skill, 130)); } for(int skill : fresh_list2) { p.broadcastPacket(new MagicSkillUse(p, p, skill, 1, 0, 0)); p.altOnMagicUseTimer(p, SkillTable.getInstance().getInfo(skill, 1)); } for(int skill : fresh_list3) { p.broadcastPacket(new MagicSkillUse(p, p, skill, 1, 0, 0)); p.altOnMagicUseTimer(p, SkillTable.getInstance().getInfo(skill, 315)); } } 3) Вопрос касается болячек с Хот Спрингс. Сделал их баффом, чтобы не снимались клинсом и занимали бафф-слот, убрал с них эффект стонов персонажа и облака типа как от яда. Клинс их действительно не снимает, бафф-слот, по идее, тоже занимают. Вклиенте отображаются точно так же и там же, в строке дебаффов, как и до этого - это не критично. Но хотелось бы еще сделать возможность игроку снимать их с себя через шифт-клик, но, хоть они и являются бафом, через шифт-клик не снимаются. А теперь вопрос: для того, чтобы они таким образом снимались. нужно менять что-то в клиенте, так как он по-прежнему воспринимает их дебаффом и при попытке даже не шлет серверу пакет, который обычно посылает при шифт-клике на баффе, или в датапаке еще что-то нужно сделась, или же лезть в ядро? Сам я, по сути, сделал совсем немного, просто в датапаке поменял тип скилла, вот пример: <skill id="4554" levels="10" name="Hot Spring Malaria"> <!-- L2NextGen Team --> <!-- Need correct: pAtk Description: Infected with Hot Springs Malaria. While afflicted, your Casting Spd. is increased and MP consumption is decreased. Effect 1-10 --> <table name="#mAtkSpd"> 1.04 1.08 1.12 1.16 1.08 1 1 1 1 1 </table> <table name="#mpConsum"> 1 0.96 0.96 0.96 0.92 0.92 0.92 0.88 0.88 0.84 </table> <set name="mpInitialConsume" val="14" /> <set name="mpConsume" val="55" /> <set name="isDebuff" val="false" /> <set name="target" val="TARGET_ONE" /> <set name="operateType" val="OP_ACTIVE" /> <set name="reuseDelay" val="4000" /> <set name="skillType" val="BUFF" /> <set name="isMagic" val="true" /> <set name="operateType" val="OP_ACTIVE" /> <set name="castRange" val="600" /> <for> <effect count="1" name="Buff" time="3600" val="0"> <mul order="0x30" stat="mAtkSpd" val="#mAtkSpd" /> <mul order="0x30" stat="mpConsum" val="#mpConsum" /> </effect> </for> </skill> При этом <set name="isDebuff" val="false" /> там не было изначально, я его добавил в надежде на то, что это поможет, но, как оказалось, его хоть добавляй, хоть не добавляй - ничего не меняет в данной ситуации. Вот и все вопросы, дорогие друзья. За любую помощь или подсказку по любому из них буду очень признателен. Спасибо за внимание.
  2. Спасибо, информация дельная. Вот только сейчас посмотрел и увидел, что в с4 файла interface.xdat попросту нет) Как и interface.u Так что, похоже, прикрутить такую функцию, как возможность отображения нескольких панелек одновременно в с4, где ее просто не предусмотрено изначально, будет довольно сложно. Что же, интересный вызов. Не знаю, получится ли, но поизучать и попробовать стоит Тоже интересная информация к размышлению. Было бы интересно на этот патч глянуть, ну да вряд ли уже найду его. Они-то на сервере фиксируются, вот только что в с4, что в грации панелек 12, и в базе ярлыки на них записываются примерно как 1-я панелька - ф5, семьдам панелька - ф8... и так далее. Эти панели можно же заполнить и в с4, стрелочкой ту единственную переключая. Фишка в том, что, если получится сделать отображение одновременно трех панелек ранее заполненных без изменения клиента, то нарушений работы с сервером нет. Мы же не создаем никаких новых панелек, которых изначально не предусматривает сервер, а лишь просто одновременно отображаем не 1, а 3 существующих панели. Хотя, возможно, ты и прав, ничего нельзя отрицать. Надеюсь, свою мысль изложил понятно)
  3. Что ж вы все так агрессивно настроились? Смело заявлено? Я написал, что вполне может заработать,а не что я уверен, что заработает. Ну не знает человек какого-то нюанса, ну так каждый чего-то да не знает, чего так агриться-то? Если я неправильно формулирую мысль, то поправьте: те же .dat файлы в папке систем тоже ведь компилированы, но ведь декомпилятся и компилятся обратно файл-эдитом. Значит и с другими файлами можно проделать то же самое, по идее. Просто другим редактором или несколькими программами, мануалы по использованию которых можно и прогуглить. Подозреваю, что за панельку отвечает какой-то из .utx файлов в систекстурес? Или группа взаимосвязанных фалов. Знать бы каких. А там бы поискал инфу о просмотре и редактировании такого типа файлов да постарался разобраться. Или вы хотите сказать, что для того, чтобы изменить 1-2 файла, отвечающих за панельку, придется чуть ли не пол клиента декомпилить?))
  4. Автор, твое предложение заинтересовало. Уже несколько месяцев планирую всерьез открывать х50 эпилога, но никак не решаюсь. Работаю на основе исходников l2nextgen rev 7083. Есть креативные идеи, много планов, стартовый онлайн планирую минимум 1к. По самому серверу сделал и реализовал уже практически все, что планировал - осталось лишь 2 пункта чисто по серваку. Насчет сайта: думаю, брать лицензионный стрессвеб или шаровый тщательно вычищать от шеллов. Есть собственный дизайн(не рип) для стресса. О себе скажу, что серверами линейки интересуюсь уже достаточно давно, несколько лет назад открывал свой сервер и держал около года, но онлайн был около 50 человек, так как страшно было вкладываться в рекламу(боялся прогореть), да и бюджета тогда особо не было. Делал для души и опыта, расширения знаний. Сейчас ищу напарника, с кем вместе можно было бы поднять проект, так как в себе я до конца не уверен по некоторым аспектам. Если реализовывать задумки на уровне датапака и иногда ядра, сайта, патча я умею достаточно хорошо, то, например, с ддос-защитой, леймгвардом и, особенно, тонкостями маркетинга я дел почти не имел. И даже если я вычитаю много информации о рекламе серверов линяги, то все равно живой напарник, уже имеющий в этом опыт и на которого можно будет положиться в данном вопросе, будет намного полезнее. Да и, в любом случае, одна голова - хорошо, а две - лучше. Самому даже морально серьезный проект потянуть трудно, особенно если не имел опыта открытия серьезных проектов с высоким стартовым онлайном. Поэтому буду рад обзавестись адекватным напарником, с которым можно будет вместе воплотить в жизнь такой проект. Не на уровне заказчик - исполнитель, а на уровне партнеров с распределением обязанностей, взаимопомощью и честной дележкой прибыли. Так что. если тебя заинтересует мое предложение, пиши вот сюда http://vk.com/crazygen1us Обсудим детали уже лично.
  5. Опять же, смотря сколько заплатить. Ну а по сути: я прекрасно понимаю, что просто заменить файл не выйдет, ибо будет ругаться на несоответствие версий. Но если открыть редактором файл в с4 и в той же грации, после чего из аналогичного файла грации аккуратно выдрать нужную часть кода - вполне может заработать.
  6. Да я смотрю, ты изначально агрессивно так настроен) Ну а читом я бы это однозначно не назвал. Для меня читы - это дюпы, например. Что-то, что позволяет неигровым путем получить игровые ценности, доступ к разным мультиселлам, бафать в бафере те бафы, которые не предусмотрены на сервере. А в моем случае это, скорее, просто изменение интерфейса на более удобный мне.
  7. Сервер, на котором я играю, непростой, а топовый с4, похоже. Там админы постарались впилить неплохую защиту. Так что в клиент можно вносить лишь минимальные изменения, и то аккуратно, иначе вряд ли на сервер пустит. Поэтому "опущенный до с4" изначальный клиент интерлюда вряд ли пустит. Хотя попробовать можно. Но, думаю, лучше знать, какие конкретно файлы отвечают за количество панелек и менять а клиенте именно эти файлы.
  8. Всем доброго времени суток. Поиграв длительное время на грации и хф, решил поностальгировать и зайти поиграть на классический сервер с4 и столкнулся с таким неудобством: привыкнув к тройной панели снизу(которая на 12 слотов для скиллов, предметов, макросов и т.д.), зайдя на с4, где такая панель одна, ощутил, насколько катастрофически ее не хватает. Даже на 30 лвл уже приходилось периодически стрелочкой переключать на другую, а теперь страшно представить, насколько сильно ее будет не хватать некру на хай-лвл. И у меня возникла идея и вопрос одновременно: как считаете, реально ли на уровне клиента влепить в с4 такую вот тройную панельку, как на грации? Ведь что на с4, что на грации, что на хф, по сути, таких панелек 12, они есть, разница лишь в том, что на с4 отображается только одна, а на грации одновременно 3, но использовать-то их можно везде, переключаясь на нужную. Вот и думаю, возможно ли на с4 сделать так, чтобы одновременно отображалась не одна, а несколько этих панелек, пусть даже использовать все, кроме самой нижней, можно будет только мышкой. Прошу знающих людей поделиться своим мнением. И если считаете, что это возможно, буду весьма признателен, если подскажите, какие файлы в клиенте могут за это отвечать. Тогда попробую их как-то вытащить из той же грации. Да и сама идея, думаю, может показаться интересной любителям старых хроник, счтающих себя пианистами, которым мало 12 слотов на панели)) Всем прочитавшим этот текст до конца - спасибо за внимание.
×
×
  • Создать...