• Новые темы в этом разделе публикуются автоматически при добавлении файла в менеджер ресурсов.
    Ручное создание новых тем невозможно.
Иконка ресурса

Мануал Пак гайдов от *rage*

*Immortal Pony*

Заблокирован
Заблокирован
Победитель в номинации 2019
Победитель в номинации 2018
Победитель в номинации 2016
Победитель в номинации 2015
Сообщения
1 680
Розыгрыши
0
Репутация
1 222
Реакции
801
Баллы
1 283
Обратите внимание, что данный пользователь заблокирован! Не совершайте с ним никаких сделок! Перейдите в его профиль, чтобы узнать причину блокировки.
Пак гайдов от *rage* (взято из ево сурса и закопипастено сюда, так как народ очень часто стал теряться в таких вещах) - с 2010 года.

Справка по мультиселлам
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

1. Формат файлов xml

<?xml version='1.0' encoding='utf-8'?>
<list>
<config showall="true" notax="false" keepenchanted="false" nokey="false" />

<!-- Harvester -->
<item>
<ingredient id="57" count="500"/>
<production id="5125" count="1"/>
</item>
</list>

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

<?xml version='1.0' encoding='utf-8'?>
Начало файла, заголовок

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

<list>
Начало списка предметов, в конце файла нужно закрыть тегом </list>

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

<config showall="true" notax="false" keepenchanted="false" />
Глобальные настройки мультиселла
showall - показывать весь мультиселл либо только те предметы что можно приобрести
notax - отключить налоги с мультиселла
keepenchanted - сохранять заточку у экипировки
Внимание: keepenchanted НЕ должно быть установлено в мультиселлах, где в одном блоке возможны два одинаковых нестекуемых предмета (напрмиер dual)
nokey - управляет обработкой showall, если true то наличие любого ингридиента списка разрешает отображение, иначе только экипировки
Если ключ не указан он устанавливается равным false
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

Комментарии согласно спецификации XML ограничиваются тегами <!-- -->
Рекомендуется для каждого блока оставлять комментарий с расшифровкой

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

Блок item описывает одну вещь в мультиселле, должен содержать минимум по одному элменту ingredient и production

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

Блок ingredient описывает цену предмета, должен содержать id и count

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

Блок production описывает итоговую вещь, должен содержать id и count

Справка по скиллам:
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

Все теги должны открываться и закрываться.
Теги, которые можно уместить в одну строку могут закрываться внутри себя.

Пример:
<add .....> ..... </add>
<add ...../>

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
формат xml-файлов:

Код:
<?xml version='1.0' encoding='utf-8'?>
<list>
<skill id="1312" levels="1" name="Fishing">
  <set name="weaponsAllowed" val="8192"/>
  <set name="mpConsume" val="1"/>
  <set name="reuseDelay" val="1000"/>
  <set name="target" val="TARGET_SELF"/>
  <set name="skillType" val="FISHING"/>
  <set name="operateType" val="OP_ACTIVE"/>
  <for>
  </for>
</skill>
<skill id="1313" levels="27" name="Pumping">
  <table name="#power"> 19 28 38 50 55 60 65 70 86 92 97 103 109 115 136 143 149 156 187 195 202 245 253 262 271 312 321 </table>
  <set name="weaponsAllowed" val="8192"/>
  <set name="mpConsume" val="2"/>
  <set name="power" val="#power"/>
  <set name="reuseDelay" val="2000"/>
  <set name="target" val="TARGET_SELF"/>
  <set name="skillType" val="PUMPING"/>
  <set name="operateType" val="OP_ACTIVE"/>
  <for>
  </for>
</skill>
</list>
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

1. <?xml version='1.0' encoding='utf-8'?>
Начало файла, заголовок
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

2. <list>
Начало списка скиллов, в конце файла нужно закрыть тегом </list>

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
3. <skill id="1312" levels="1" name="Fishing">
Начало описания скилла. После всех тегов должно завершаться </skill>
skill id - уникальный id для всех скиллов (и для мобов и для чаров)
levels - максимальное количество уровней у этого скилла
name - его название

Описание скиллов:
A) <table name="#power"> 19 28 38 50 </table>
Таблица. При ссылке на параметр #power, будет браться значение, соответствующее текущему левелу скилла.
Таблиц может быть несколько. Значения могут быть целыми и дробными, и должны отделяться пробелами.
Значений должно быть столько, сколько левелов у этого скилла.

B) <set name="COMMAND" val="VALUE"/>

Обязательные параметры для каждого скилла:
mpConsume - сколько маны требует
reuseDelay - время перезарядки
target - кто может быть целью
skillType - тип скилла
operateType - активный, пассивный, переключаемый (toggle)

Список параметров:
Код:
COMMAND: canLearn            - (value = "" - Этот скилл нельзя будет выучить. default - не прописывать)
         castRange           - Радиус действия каста
         activateRate        - VALUE
         absorbAbs           - VALUE
         absorbPart          - VALUE
         advancedFlag        - true/false
         advancedMultiplier  - VALUE
         behind              - true/false
         cancelable          - true/false
         cancelTarget        - true/false
         charge_skill_id     - skill_id для charge
         corpse              - true/false
         critical            - true/false
         crush               - true/false
         deathlink           - true/false
         displayId           - VALUE
         element             - VALUE
         expPenalty          - пенальти на эксп ("0.9")
         hitTime             - VALUE
         hpConsume           - VALUE
         isCubic             - true/false
         isDwarven           - true/false
         isMagic             - true/false
         itemConsumeCount    - VALUE
         itemConsumeCountInTime - VALUE
         itemConsumeDelay    - VALUE
         itemConsumeId       - item_id предмета, который будет использован "1458"
         itemConsumeIdInTime - item_id предмета, который будет использован регулярно "1458"
         itemConsumePeriods  - период за который будет идти регулярный расход предмета
         lethal              - true/false
         levelModifier       - VALUE
         magicLevel          - VALUE
         minPledgeClass      - VALUE
         mpConsume           - VALUE
         negateDebuffs       - true/false
         negateEffects       - "SLEEP"
         negateEffects       - "STUN SLEEP MUTE POISON BLEED BUFF DEBUFF PARALYZE"
         negatePower         - VALUE
         negateStats         - "mAtk mAtkSpd"
         npcId               - VALUE
         num_charges         - VALUE
         onCrit              - true/false
         operateType         - OP_ACTIVE/OP_PASSIVE/OP_TOGGLE
         overHit             - true/false
         power               - VALUE
         reuseDelay          - VALUE
         save                - VALUE
         seed_any            - true/false
         seed1               - VALUE
         seed2               - VALUE
         seedCount           - VALUE
         seedcount1          - VALUE
         skillInterrupt      - true/false
         skillRadius         - VALUE
         skillTime           - VALUE
         skillType           - AGGRESSION/AIEFFECTS/BALANCE/BLEED/BUFF/CANCEL/CHARGE/CHARGEDAM/COMBATPOINTHEAL/
CONFUSION/CONT/CRAFT/DANCE/DEBUFF/DOT/DRAIN/DRAIN_SOUL/ENCHANT_ARMOR/ENCHANT_WEAPON/FATALBLOW/FEED_PET/FISHING/HEAL
HEAL_PERCENT/HOT/INTERRUPT_DISARM/LETHAL_SHOT/LUCK/MANADAM/MANAHEAL/MDAM/MDAM_ELEMENTAL/MDOT/MUTE
NEGATE_EFFECTS/NEGATE_STATS/NOTDONE/PARALYZE/PASSIVE/PDAM/PDAM/POISON/PUMPING/RECALL/REELING/RESURRECT
ROOT/SEED/SIEGEFLAG/SLEEP/SONG/SOULSHOT/SPIRITSHOT/SPOIL/STUN/SUMMON/SUMMON/SUMMON_ITEM/SWEEP/TAKECASTLE
TELEPORT_NPC/TURNER/UNLOCK
         SummonItemId        - VALUE
         SummonMinCount      - VALUE
         target              - TARGET_ALLY/TARGET_AREA/TARGET_AREA_AIM_CORPSE/TARGET_AURA/TARGET_CORPSE/
  TARGET_CORPSE_PLAYER/TARGET_HOLY/TARGET_ITEM/TARGET_MULTIFACE/TARGET_NONE/TARGET_ONE/TARGET_PARTY/
  TARGET_PET/TARGET_SELF/TARGET_UNLOCKABLE
         unaggroing          - true/false
         undeadOnly          - true/false
         weaponsAllowed      - VALUE
C) <cond>...</cond>
условия для активации скилла. Не используется в пассивках. Если скилл уже активирован, а условие
не соответствует, он НЕ отключается. условия проверяются только для активации.

Примеры использования:
<cond msg="Too much hit points."><player percentHP="25"/></cond> (будет выдаваться сообщение)

без сообщения:
<cond><player percentHP="25"/></cond> (25% hp)
или
<cond><player minHP="25"/></cond> (>25 hp)


D) <for>...</for>
список эффектов, которые применяются при активном скилле или пассивных.
Пример:
<!-- добавить к параметру MEN значение 2. -->
<for>
<add order="0x10" stat="MEN" val="2"/>
</for>

<!-- умножить значение maxHP на значение взятое из таблицы Tab-maxHP и высветить иконку баффа -->
Код:
     <for>
       <effect count="1" name="Buff" time="1200" val="0" stackOrder="#stack" stackType="hp_up">
         <mul order="0x50" stat="maxHp" val="#Tab-maxHp"/>
       </effect>
     </for>
эффекты добавляются словами:
<add - добавить
<mul - умножить
<set - установить
<sub - отнять
<div - разделить

order означает порядок вычисления. (order 0x08, 0x10, 0x30, 0x40, 0x50, 0x60)
Код:
   0x08 используется для базовой установки параметра
   0x10 используется для базовой модификации параметра
   0x30 используется для добавления базовых бонусов к параметру
   0x40 для прибавления статических бонусов к параметру
   0x50 для множителей параметров
   0x60 для прибавления статических бонусов ПОСЛЕ множителей
Список изменяемых параметров:

статы:
Код:
             CON
             DEX
             INT
             MEN
             STR
             WIT
параметры:
Код:
accCombat
             cAtk
             cAtkStatic
             hpEff
             mAtk
             mAtkSpd
             maxCp
             maxHp
             maxLoad
             maxMp
             mDef
             mpConsum
             mpConsumePhysical
             mpEff
             mReuse
             pAtk
             pAtkRange
             pAtkSpd
             pDef
             pReuse
             rCrit
             rCritPercent
             regCp
             regHp
             regMp
             sDef
остальное:
Код:
absorbDam
             breath
             concentration
             element
             ExpSpMultiplier
             poleAngle
             rEvas
             rShld
             runSpd
             shldAngle
             transferDam
             bighead
рефлекты:
Код:
reflectDam
             reflectMagicSkill
             reflectPhysicSkill
разное:
Код:
CommonRecipeLimit
             DwarvenRecipeLimit
             inventoryLimit
             storageLimit
             tradeLimit
рейты:
Код:
activateRate
             blowRate
             mCritRate
резисты:
Код:
  bleedRcpt
             bluntWpnRcpt
             bowWpnRcpt
             cancelRcpt
             daggerWpnRcpt
             debuffRcpt
             earthRcpt
             fearRcpt
             fireRcpt
             paralyzeRcpt
             poisonRcpt
             poleWpnRcpt
             rootRcpt
             sacredRcpt
             sleepRcpt
             stunRcpt
             swordWpnRcpt
             unholyRcpt
             waterRcpt
             windRcpt
E) условия:
<COMMAND VARIABLE="VALUE">
могут быть заключены в теги <and> <or> <not>

пример:
Код:
   <sub order="0x10" stat="STR" val="1">
    <game night="true"/>
   </sub>

   <and>
     <player riding="strider"/>
     <target castledoor="true"/>
   </and>
список команд (COMMAND):
Код:
  <player VARIABLE="PARAM">
          VARIABLE: race    (Undead/MagicCreatures/Beasts/Animals/Plants/Humanoids/Spirits/Angels/Demons/Dragons/Giants/Bugs/Fairies/Humans/Elves/DarkElves/Orcs/Dwarves/Others/NonLivingBeings/SiegeWeapons/DefendingArmy/Mercenaries/UnknownCreature)
                    level
                    resting (true/false)
                    moving  (true/false)
                    running (true/false)
                    riding  (strider/wyvern/none)
                    hp

  <target VARIABLE="PARAM">
          VARIABLE: aggro  (true/false)
                    undead (true/false)
                    pvp    (true/false)
                    mob    (true/false)
                    race   (Undead/MagicCreatures/Beasts/Animals/Plants/Humanoids/Spirits/Angels/Demons/Dragons/Giants/Bugs/Fairies/Humans/Elves/DarkElves/Orcs/Dwarves/Others/NonLivingBeings/SiegeWeapons/DefendingArmy/Mercenaries/UnknownCreature)
                    castledoor (true/false)
                    direction  (behind/front/side)

  <using VARIABLE="PARAM">
         VARIABLE: kind    (Shield/Sword/Blunt/Dagger/Bow/Pole/Etc/Fist/Dual Sword/Dual Fist/Big Sword/Pet/Rod)
                   armor   (None/Light/Heavy/Magic/Pet)
                   skill   (skill_id)
                   slotitem

  <game VARIABLE="PARAM">
        VARIABLE: night (true/false)
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
F) Эффекты:

<effect count="1" name="Buff" time="1200" val="0" stackOrder="#stack" stackType="hp_up">

count = кол-во тиков, которые длится эффект
time = длина тика в секундах для этого эффекта (В примере у нас имеется один тик длинной 1200сек=20мин)
name = что это за эффект. У эффектов могут быть аффекты на старт, стоп и на время действия.
val = значение для "name"
stackOrder = "Сила эффекта", чтобы сравнивать какой более сильный при обновлении
stackType = "Тип эффекта", чтобы не накладывались схожие баффы

пример: добавляется скорость атаки на 25%, но при этом отнимается mana каждые 2 тика 35 HP
длительность эффекта не ограничена (это у нас toggle)
Код:
   <for>
     <effect count="0x7fffffff" name="HealOverTime" time="2" val="-35">
       <mul order="0x50" stat="pAtkSpd" val="1.25"/>
     </effect>
   </for>
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

Saboteur.
Данный хелп действителен на 12.09.2006 (сборка Fortress 3992)

P.S. Особая благодарность Муркту за разъяснение многих моментов.

Старый мануал, делаем по его образцу

Редактируем petsummon.java которая находится хз гдето в сервере

Код:
Код:
/   // all the items ids that this handler knowns
   private static final int[] _itemIds = { 2375, 3500, 3501, 3502, 4422, 4423, 4424, 69000, 69001, //Здесь дописываем ID предмета, который будет использоваться для вызова пета// **;

   /* (non-Javadoc)
    * @see net.sf.l2j.gameserver.handler.IItemHandler#useItem(net.sf.l2j.gameserver.model.L2PcInstance, net.sf.l2j.gameserver.model.L2ItemInstance)
    */
   public void useItem(L2PlayableInstance playable, L2ItemInstance item)
   {
      if (!(playable instanceof L2PcInstance))
         return;
      L2PcInstance activeChar = (L2PcInstance)playable;
      int npcId;
      
      if (activeChar.getPet() != null)
      {
         if (Config.DEBUG) _log.fine("player has a pet already. ignore use item");
         return;
      **
      
        if (activeChar.isMounted())
            return;
      
      switch (item.getItemId())
      {
         // wolf pet a
         case 2375:
            npcId = 12077;
            break;
        
         // hatchling of wind
         case 3500:
            npcId = 12311;
            break;
            
         // hatchling of star
         case 3501:
            npcId = 12312;
            break;
            
         // hatchling of twilight
         case 3502:
            npcId = 12313;
            break;
         //  wind strider
         case 4422:
            npcId = 12526;
            break;
         //   Star strider
         case 4423:
            npcId = 12527;
            break;     
         // Twilight strider
         case 4424:
            npcId = 12528;
            break;
                           //Название пета
                           case //ид предмета для вызова//:
                                     npcId = //Id монстра который будет вызываться//;
                                     break;
    




Теперь редактируем l2petinstance.java в хз гдето в сервере

Код:

            **
            L2ItemInstance food = null;
            switch (getTemplate().npcId)
            {
               // wolf
               case 12077:
                  food = getInventory().findItemByItemId(2515);
                  break;
               //hatchling of wind   
               case 12311:
                  food = getInventory().findItemByItemId(4038);
                  break;
               // hatchling of star
               case 12312:
                  food = getInventory().findItemByItemId(4038);
                  break;
               // hatchling of twilight
               case 12313:
                  food = getInventory().findItemByItemId(4038);
                  break;
               //  wind strider
               case 12526:
                  food = getInventory().findItemByItemId(5168);
                  break;
               //   Star strider
               case 12527:
                  food = getInventory().findItemByItemId(5168);
                  break;     
               // Twilight strider
               case 12528:
                  food = getInventory().findItemByItemId(5168);
                  break;
//Новый Пет
case //ID пета[/COLOR]:
        food = getInventory().findItemByItemId(5168);   // Здесь можно использовать ID любово предмета который будет использоваться в качестве пищи - здесь для удобство взята еда для волка//
         break;


С серверной частью закончили.
Теперь нужно править клиент.
Добавляем нового пета в npcgrp.dat и npcname-e.dat
Добавляем новый итем в etcitem.dat и itemname-e.dat

Возвращаемся к серверу.
Заносите пета и колар в свою базу данных.

Теперь осталось сделать XML для пета, который будет хранится в l2jfolder/data/script/PetData.zip

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

L2.ini Содержит основные настройки клиента, движка игры, видео, звука, DirectX, OpenGL и т.д.
Настроек много, можете сами попробовать разобраться )
Наиболее интересные:
ServerAddr=10.0.0.5 - IP адрес сервера
L2UseKeyCrypt=false - включение/выключение криптования при вводе логина и пассворда (при L2UseKeyCrypt=true - не сможете писать буквами в ID и Pass при коннекте на сервер)

[CharacterDisplay]
Dist=1000 - дистанция видимости PC и NPC (при Dist=10000 можно видеть очень далеко (в игре тоже стоит тогда включить все параметры видимости (PC Limit, PC/NPC Range, Terrain Range) на максимум - 5

[WinDrv.WindowsClient]
WindowedViewportX=640
WindowedViewportY=480 - разрешение экрана игры в оконном режиме
FullscreenViewportX=1024
FullscreenViewportY=768 - разрешение экрана игры в полноэкранном режиме
UseJoystick=False - использовать/не использовать джойстик для ходьбы в игре, при True - не позволит бегать с помощью клавиатуры
StartupFullscreen=True - запускать игру в полноэкранном режиме (False - в оконном режиме)

[D3DDrv.D3DRenderDevice]
DesiredRefreshRate=60 - желательная частота обновления экрана в игре (Например, если вы в игре поставили частоту 85 Гц, то иногда при переключении в винду, а потом обратно в игру - частота падает до 60 Гц и сразу режет глаза. В этом случае следует попробовать поменять в DesiredRefreshRate= на 85)

В принципе все, в остальном можно разобраться самому, там все интуитивно понятно, а можно вообще ничего больше не трогать.


User.ini

Не открывается сразу блокнотом, закриптован 412 ключом.

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

[Engine.LineagePlayerController]
MaxZoomingDist=250 - максимальная дистанция удаления камеры (меняем на MaxZoomingDist=65000 и получаем неограниченное удаление камеры, т.н. Zoom Patch
MinZoomingDist=-200 - минимальная дистанция удаления камеры

MouseWheelDown=ZoomInPress Speed=20.0
MouseWheelUp=ZoomOutPress Speed=20.0 - скорости удаления/приближения камеры с помощью прокрутки колесика мышки

Можно много и долго экспериментировать с индивидуальными настройками управления.

Декодирование Файлов Клиента, L2encdec


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

Кодировать и раскодировать файлы клиента Lineage2 можно с помощью специальной программы L2encdec или любой другой, какую найдете в Интернете и способную делать это.

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

Как правило (но совсем не факт), необходимый ключ для каждого конкретного файла можно посмотреть в нем самом, попробовав его открыть блокнотом и получив что-то в виде: "Lineage2Ver412.... <тут неразборчивые каракули> ... ", где 412 (или любое другое число) и является необходимым ключом.

L2encdec

Раскодировка:

Перед использованием программы L2encdec для раскодировки файла необходимо нужный файл сначало пропатчить. Патчер (patcher) находится в одном архиве с L2encdec.

- копируем файл куда-нибудь в одну папку с L2encdec и Patcher
- запускаем Patcher, он патчит файл (при этом предварительно сам создает его бэкап)
- запускаем L2encdec с параметрами -s <название файла>
- получаем раскодированный файл с приставкой в названии dec- , который уже можно использовать и изменять

Кодировка:

- запускаем L2encdec с параметрами -h <ключ> <название файла>
- получаем закодированный файл с приставкой в названии enc-
- изменяем название на первоначальное, какое оно должно быть в клиенте, вставляем файл в клиент


!!! Внимание !!! При использовании L2encdec в <название файла> нужно писать только полное его название вместе с расширением.

!!! Внимание !!! Чтобы после всех процедур файлы работали (точнее клиент их понял и запустился) нужно предварительно пропатчить сам движок клиента - L2.exe, engine.dll, ... и т.д.

Легче всего это сделать пропатчив сразу всю папку System:

- делаем бекап папки System куда-нибудь на всякий случай
- кидаем L2encdec и Patcher в System и запускаем Patcher
- патч займет 1-2 минуты

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

Для примера всего, что было написано выше, возьмем файл Env.int из папки System в директории с игрой

- делаем бекап папки System куда-нибудь на всякий случай
- кидаем L2encdec и Patcher в System и запускаем Patcher
- патч займет 1-2 минуты
- пробуем открыть Env.int блокнотом, видим ключ Lineage2Ver111
- запускаем L2encdec с параметрами -s Env.int


Код
l2encdec.exe -s Env.int (проще всего выполнять эти действия в windows commander, прописывая это в командной строке)


- получаем dec-Env.int, открываем блокнотом, редактируем по своему усмотрению (а лучше не трогаем ), сохраняем
- запускаем L2encdec с параметрами -h 111 dec-Env.int


Код
l2encdec.exe -h 111 dec-Env.int


- получем enc-dec-Env.int, переименовываем в Env.int, кидаем обратно в System, играем

1. Dat файлы, что и где.
sysstring-e.dat - Тут храниться инфа из меню логин, чар и т.д.

zonename-e.dat - Тут храниться все то что появляется когда мы находимся на какой либо территории. Тоесть по среди экрана текст высвечивается - Gludio Territory и тд.

systemmsg-e.dat- Тут храниться системные сообщения. Пример: Вы нанесли X урона. Вы подобрали 12 аден. Я думаю понятно про что я говорю.

symbolname-e.dat - Точно незнаю, но точно знаю, что здесь есть тот текст или "смайл" когда в клиенте мы ругаемся матом вместо мата появляется.

staticobject-e.dat - Невижу смысла этого файла, но в нем хранятся названия дверей которые существуют в Lineage 2.

skillname-e.dat - В этом файле находятся названия скилов и их описание.

servername-e.dat - Здесь распологаются названия серверов. Тоесть когда мы заходим в Lineage 2, авторизовавшись мы вибираем сервер. Так вот в этом файле хранятся их имена и их можно изменить на собственное. Например на My server. И когда вы дадите патч другому пользователю он увидит не сервер Bartz (первый сервер по умолчанию), а My server. Красиво, согласен

questname-e.dat - В этом файле хранятся все названия квестов которые вы видите в клиенте когда берете квест.

obscene-e.dat - Здесь находится фильтр мата, а если говорить конкретней не сам фильтр, а тот текст который фильтрует сервер. Декодера для этого файла я ненашел, а жалко, можно было бы русский мат превращать в безабидный смайлик Ну да ладно оно может и к лудшему

npcname-e.dat - Здесь хранятся имена NPC и многое другое, я бы нестал здесь ничего менять. Это может дезинформировать пользователей вашего сервера.

itemname-e.dat - Здесь хранятся имена вещей, я его нестал переводить на русский так как люди уже привыкли к обычным английским названиям, да это и удобней, но если вы захотите все же его руссифицировать то лучше для начало используйте поиск, на данный момент уже имеется русская, но не полная версия этого файла.

hennagrp-e.dat - Как я понял тут находятся имена тату. При сильной потребности можно руссифицировать.

eula-e.dat - Говорят здесь хранится лицензионное соглашение которое показывается при конекте к серверу....

creditgrp-e.dat - Здесь хранится информация о настройке заставки о создателях игры. Ничего интересного честно скажу.

commandname-e.dat - Здесь хранится информация о командах которые можно прописывать в чате. Пример:/loc - выведет ваше месторасположение по 3 осям - x,y,z. Не стал бы это трогать так как можно нарушить структуру и игра может зависать или вылетать. Нам не нужны лишние баги.

classinfo-e.dat - Без понятия что это, но и без него все хорошо работает. Если узнаю дополню

castlename-e.dat - Из названия уже все понятно Если нет, то скажу - название замков и клан холлов в этом файле лежит.

actionname-e.dat- В этом файле находятся название и описание стандартных скилов или умений если так можно выразиться. Такие как сесть, обмен и тд. Это не файл в котором находятся комманды, прошу не путать с commandname-e.dat. Тоесть те умения которые можно поместить в специальное меню быстрого реагирования .

==========Редактирование файла L2Font-e.utx==========
1) Программа UT Package Tool v2.0 beta 5 (сокращенно UTPT)-для просмотра и вытаскивания нужных текстур.

2) Программа l2decrypt - для кодирования и декодирования файлов


3) Программа l2tool - для замены отредактированных текстур в файлах .utx
Качаем dstuff.luftbrandzlung.org/l2asylum/

4) Плагин Fotoshop DDS - для открытия и редактирования файлов DDS в Fotoshop.
(ложим его в ....\Photoshop 7.0\Plug-Ins\File Formats )
-----------------------------------------------------------------------------------------------
Работа:

1) Создаем папку с любым названием и помещаем в неё файл L2Font-e.utx и программу 2decrypt. Затем открываем эту папку в стандартном Проводнике Windows(обязательно). Далее берем L2Font-e.utx и перетаскиваем его на файл программы l2decrypt.exe. Открывается окно l2decrypt и ждём появления внизу этого окошечка надписи: All tasks have be finished,hit return to exit. Дождавшись этой надписи, можно закрыть окошечко l2 decrypt.Теперь в этой самой папке после расшифровки образовался файл "L2Font-e.clear.utx"

2) Теперь с помощью UTPT.exe вытаскиваем нужную текстуру, в нашем случае это-"loading02-e" и сохраняешь её в формате DDS в нашу созданную папочку.
Дальше редактируем её в Фотошопе. Рекомендуемый размер картинки которой вы будете заменять экран Загрузки или карту=1600х1200

==Теперь главное:СОХРАНЕНИЕ dds в Фотошопе!==
Файл>Сохранить как>Ставим расширение DDS и нажимаем сохранить>Откроется окошко "NVIDIA dds format" (если не откроется, то скачать этот файлик из инета). В нем несколько настроек: Нажимаем кнопочку "MIP maps.." и ставим параметр "Generate MIP maps" равное 1.
(это очень важно) ,если возник вопрос что такое MIP maps, то идем по ссылке
Параметр Save Format должен быть DXT3 ARGB(Explicit Alpha) и 2D Texture.
Остальные параметры не меняем.
!!!Если вы сохраните файл с кол-вом MIP maps больше 1,то получите размытую картинку во время заставки с эффектом пикселезации!!!

3) Открываем l2tool (она на японском языке) и
--в первой строке указываем запакованный(исходный) архив L2Font-e.utx
--во второй строке указываем свой отредактированный в Фотошопе файл DDS с тем же названием,с которым вынимал из UTPT.exe.
--в третьей строке указываем расшифрованный архив L2Font-e.clear.utx, который вы расшифровали с помощью l2 decrypt, сразу же появляется окно в котором вы должены выбрать название текстуры, которую редактировали. После всего этого нажимаем кнопку "set", и вуаля, все готово.

4) Ваша отредактированная текстура сохранилась в расшифрованном вами архиве L2Font-e.clear.utx

5) Дальше переименовываем файл в L2Font-e.utx, копируем его в папку Systextures игры и заменяем им старый оригинальный зашифрованный архив.
 
Последнее редактирование:

такой вопрос а ежедневные задание - за них какой датник отвечает?
 
operateType - активный, пассивный, переключаемый (toggle) Плохо нет АУРЫ :Banzai:
 
ну тоггл и есть по сути аура
 
У меня не получается сделать Ауру на пати на HF ))
пфф...
на кастера тоггл с эффектом типа CastSkill или подобным, а в нем вызывать каст скилла на всю пати.
пример подобного дела для овероподобных
XML:
    <!-- Аура Вызова / Challenge Aura -->
    <skill id="10030" levels="1" name="Аура Вызова">
        <!-- Расход MP для умений -25%, время перезарядки умений -10%. Для члена группы расход MP для умений -15%, время перезарядки умений -5%. Одновременно можно использовать только одну ауру. -->
        <stat name="icon" value="icon.skill10030" />
        <stat name="magicLevel" value="85" />
        <stat name="reuseDelay" value="1000" />
        <stat name="target" value="SELF" />
        <stat name="skillType" value="CONT" />
        <stat name="operateType" value="OP_TOGGLE" />
        <for>
            <effect name="CastSkill" count="0x7fffffff" time="3" stackOrder="2" stackType="aura" abnormal="yellow_blue_glow">
                <def name="skill" value="10031,1" />
                <mul order="0x30" stat="mpCost" value="0.75">
                    <using magicType="0;1;3" />
                </mul>
                <mul order="0x30" stat="reuseDelay" value="0.9">
                    <using magicType="0;1;3" />
                </mul>
                <mul order="0x30" stat="hateBonus" value="3">
                    <using kind="Sword, Big Sword, Blunt, Big Blunt" />
                </mul>
            </effect>
        </for>
    </skill>
    <!-- Аура Вызова / Challenge Aura -->
    <skill id="10031" levels="1" name="Аура Вызова">
        <!-- Расход MP для умений -15%, время перезарядки умений -5%. -->
        <stat name="icon" value="icon.skill10030" />
        <stat name="magicLevel" value="85" />
        <stat name="effectPoint" value="2" />
        <stat name="hitTime" value="500" />
        <stat name="reuseDelay" value="1000" />
        <stat name="affectRange" value="1000" />
        <stat name="target" value="PARTY_WITHOUT_ME" />
        <stat name="skillType" value="BUFF" />
        <stat name="operateType" value="OP_ACTIVE" />
        <for>
            <effect name="Buff" time="11" stackOrder="1" stackType="aura" abnormal="yellow_glow">
                <mul order="0x30" stat="mpCost" value="0.85">
                    <using magicType="0;1;3" />
                </mul>
                <mul order="0x30" stat="reuseDelay" value="0.95">
                    <using magicType="0;1;3" />
                </mul>
            </effect>
        </for>
    </skill>
пример реализации самого эффекта
Java:
package l2p.gameserver.model.skills.effects;

import java.util.ArrayList;

import l2p.gameserver.data.holder.SkillHolder;
import l2p.gameserver.enums.SkillTargetType;
import l2p.gameserver.model.Creature;
import l2p.gameserver.model.skills.Effect;
import l2p.gameserver.model.skills.Skill;
import l2p.gameserver.network.components.SystemMsg;
import l2p.gameserver.network.s2c.SystemMessage;
import l2p.gameserver.stats.Env;
import l2p.gameserver.utils.Util;

public class EffectCastSkill extends Effect
{
    private final ArrayList<Skill> _skills = new ArrayList<>();
    private final boolean _excludeCaster;

    public EffectCastSkill(Env env, EffectTemplate template)
    {
        super(env, template);

        String[] s = template.getParams().getStringArray("skill", new String[0]);
        boolean excludeCaster = false;

        for (String temp : s)
        {
            String[] t = temp.split(",");
            int id = Util.parseValue(t[0], 0);
            int level = t.length > 1 ? Util.parseValue(t[1], 0) : 1;
            int subLevel = t.length > 2 ? Util.parseValue(t[2], 0) : 0;

            if (level == -1)
                level = _skill.getLevel();

            if (subLevel == -1)
                subLevel = _skill.getSubLevel();

            Skill skill = SkillHolder.getInstance().getSkill(id, level, subLevel);

            if (skill == null)
            {
                _log.warn("Not found skill [" + id + ":" + level + ":" + subLevel + "] for effect CastSkill in skill " + _skill);
                continue;
            }

            if (skill.getTargetType() == SkillTargetType.PARTY_WITHOUT_ME)
                excludeCaster = true;

            _skills.add(skill);
        }

        _excludeCaster = template.getParams().getBool("excludeCaster", excludeCaster);
    }

    @Override
    public void onStart()
    {
        super.onStart();

        onTick();
    }

    @Override
    public boolean onTick()
    {
        if (_effected == null || _effected.isAlikeDead())
            return false;

        double manaDam = calc();

        if (manaDam > _effected.getCurrentMp() && _skill.isToggle())
        {
            _effected.sendPacket(SystemMsg.NOT_ENOUGH_MP, new SystemMessage(SystemMsg.THE_EFFECT_OF_S1_HAS_BEEN_REMOVED).addSkillName(_skill));
            return false;
        }

        double minTime = 2. * getPeriod() / 1000.;

        for (Skill skill : _skills)
        {
            for (Creature target : skill.getTargets(_effector, skill.getAimingTarget(_effector, null), false))
            {
                if (target == null || target.isDead())
                    continue;

                if (_excludeCaster && target == _effector)
                    continue;

                Effect ef = target.getEffectList().getEffectBySkill(skill);

                if (ef == null || ef.getTimeLeft() <= minTime)
                    skill.getEffects(_effector, target, skill.getActivateRate() > 0);
            }
        }

        if (manaDam > 0.)
            _effected.reduceCurrentMp(manaDam, null);

        return true;
    }
}
 
Последнее редактирование:
Назад
Сверху Снизу