Здесь предоставлен урок по детальному изучению и освоению "XML" для работы с датапаком сервера l2 ява. Как вы уже поняли, речь пойдет о датапаке, а именно о его части - xml документах. Для начала, приведу вам мое понимание "xml". XML в сборках ява серверов l2, это набор каких либо заранее установленных переменных, с введением в них ограничений и ряда правил выполнения. Тоесть, xml файлы не описывают процесс, а лиш придают ему численные значения, такие как стоимость(шмот), время, сила, эффект, радиус, скорость и так далее(скилы), координаты и ограничения(зоны) и прочие. Глава 1. Распространенность файлов в датапаке (xml) Итак, рассмотрим архитектуру, где же мы можем встретить .xml файлы и за что они отвечают. 1. Мультиселлы. Место расположения - /data/multisell. Файлы, имеют формат .xml. Основное предназначение - листы магазинов(покупка/обмен). Зачастую применимы в так называемых "гм шопах" и прочих шалостях. 2. Статы - файлы, располагаются в папке /data/stats, здесь можно выделить несколько типов "статов" : a) Статы арморов(/data/stats/armor) - предназначены для обозначения параметров того или иного армора (брони в мире lineage2), к примеру - p-def , m-def, и прочие. b) Статы оружия(/data/stats/weapon) - предназначены для обозначения параметров Weapons(оружия) в мире Lineage2 и ява эмулятора, к примеру - p-atack, m-atack и другие. c) Статы скилов (/data/stats/skill) - предназначены для описания скилов, придают им совокупность каких то свойств под каким то "id" (номером), к примеру - m-damage, m-def, critical rate, effect. d) Аугментации (/data/stats/augmentation) - используется для описания лайф стонов и их действия когда находятся "в рабочем состоянии" (тоесть какой скилл или стат юзать). 3. Зоны. Место расположения - /data/zones/ , используются для работы с различными квадратами мира Lineage2, точек возрождения и прочих. Активно сотрудничают с базой данных(аналогичная таблица). Зачастую, помогают при отсутствии гео-даты (ограничивают зону - по координатам Y к примеру, это удобно). 4. Прочие файлы. Это файлы, одиночно встречающиеся в датапаке ява эмулятора. Вот вам некоторые из них (не все) : /data/ тут файлы : servername.xml (отвечает за имена серверов при их регистрации), recipes.xml(отвечает за рецепты - что заберет и что получим), dimentionalrift.xml (обеспечивает респавн мобов с промежутком в ремени в комнатах дименшин рифта), а так же другие файлы (найти можно руками и подумать над их назначением). Глава 2. Основные теги и их использование. В xml, как и в хтмл - есть как контейнерные теги, так и одиночные. Напомню вам, контейнерные теги, это те теги, которые имеют сначала открывающий тег : а после окончания его описания - закрывающий тег . Пример : Или, может использоваться сокращенная запись : Одиночные теги - те теги, которые не имеют закрывающего тега после значений. Пример : Основным тегом, принятым почти в каждом файле считается : Это характеризует - версию документа(version), и тип его языка (encoding=). Это - что то похожее на мета-теги(поясняют его). Вроде бы это просто, останавливатся не будем. В каждом документе, обязательно будет "основной контейнерный тег", который обозначит начало документа(открытый тег) и конец документа (закрытый тег). Вот вам пример документа, думаю с выше поясненным вы поймете его : Таким образом - тело документа, которое будет считываться и обрабатываться : В теле документа, может быть уйма тегов, чаше всего - они однотипны (так как содержимое одного xml документа - однотипно, тоесть описание 1го похоже на другое, кроме значений). Итак, приступим к описанию по разделам документов. Глава 3. Описание общепринятых значений в мультиселлах. Как мы уже выяснили с вами, мультиселы находятся в папке /data/multisell. Цель использования - листы итемов в магазинах (их покупка, цены и т д). Рассмотрим употребляемые здесь теги. 1. Тег начала документа : Этот контейнерный тег отвечает за начало документа и его конец. При его отсутствии - файл считываться не будет. Обязателен как в начале каждого документа-мультиселла () так и в его конце ( ) 2. Тег описания итема : Данный тег, поясняет начало и конец описания того или иного итема. Заметте, параметр id="порядковый номер", отвечает за место итема в том или ином листе в игре. Важно - id здесь не могут повторятся, и эти id - это НЕ id предмета или чего либо. Как правило, нумеруются порядково. Тоесть цифрами, 1, 2, 3, и так далее. Приведу пример : 3. Теги пояснения цен итемов. Их два. а) тег который показывает - что мы отдадим за тот или иной итем : Другими словами, это то что у вас ЗАБЕРЕТ при покупке того или иного итема. Тоесть что вы должны ОТДАТЬ.. id="ид_предмета" - это предмет, который у вас заберет. Пример : id="57" - значит заберет адену. count="кол-во_которое_заберет" - ну тут все понятно, кол-во забраных предметов. К примеру при count="100" - заберет 100 штук id=".." б) тег который показывает, что мы получим за тот или иной итем : Здесь - аналогично вышесказанному. Только учитываем - здесь, описывается то что мы ПОЛУЧИМ. Id="ид_предмета" - показывает, какой предмет мы получим, count="кол-во" - показывает сколько мы получим количественно того или иного предмета. Пример : id="57" - получаем адену, count="500" - получаем 500 штук id="..". Теперь, обьединим наши знания одним примером : В первом случае - мы отдадим магазину 500 итемов с id 57 и получим один итем с id 4037. Во втором случае - наоборот, мы отдадим магазину 1 итем с id 4037 и получим 500 аден. Так же, можете эксперементировать с шмотками, банками да всем чем угодно. Глава 4. Описание общепринятых значений в статах armor и weapon. Как мы с вами уже выяснили, статы могут быть как у weapon, так и у armor. Начнем рассматривать некоторые значения и как с ними работать. Данным тегом принято обозначение начала описания того или иного предмета (armor / weapon). Тег, обязательно должен быть контейнерным - начало и конец В id - принято указывать "id" предмета. Как мы с вами знаем, все ID фиксируются в базе данных. Так что "от фары" ставить не получится. Рассмотрим самые распространёные описания итемов. а) - данный тег, означает прибавление того или иного параметра(несет действие "+" в расчетах). Приведем пример : На казаном примере, мы видим - что в add может быть несколько переменных. Разберемся с ними. val="значение" - указывает, сколько же нужно добавить. К примеру, если мы поставим "100" - то получим в формуле "+100 единиц". order="место_в_формуле" - это место расположения данного параметра в формуле расчета. Для параметра "ADD" приняты 2 значения "order" : -0x10 -0x08(почти не используется) -0x40(для производных значений - к примеру "regHP", "rootRes" и прочие) Не буду вам морочить голову этими формулами, приведу лиш небольшой пример расчета функционала того или иного значения. Припустим, у нашего итема несколько "add" и есть и другие значения "mul" , "sub" и прочие. В какое место машина должна пихнуть их? Всё очень просто. Это, как арифметика - сначала сложение, потом - умножение / деление. Здесь - аналогично. Вот наглядный пример : Так вот, за скобки и будет отвечать "order". Если его не будет, или он будет не правильный - догадываемся что получиться (попробуйте убрать скобки и решить уравнение). stat="что_добавлять" - здесь всё просто. Как вы наверно догадались - здесь должен быть указан тот или иной параметр который будет "увеличен"(+) при использовании данного значения. Тоесть по простому, здесь должен быть указан "стат". Примеры : "pDef", "mDef", "evesion", "shield_rate", "pDam", "mDam" и так далее. Более подробно эти значения - можете найти в ДП вашего кода. Пример готового значения : Здесь - мы добавим "150" (+150) к параметру "pDef". Как работает? Пример - шмотка. Одели бронь - получили бонус "+150" к защите. Дальше - ваша фантазия. б) - параметр, обозначающий "вычитание" значений. Принцип работы - аналогично выше изложенному (про добавление) - только работает в обратную сторону - вычитает статы. Вот небольшой пример и принцип его работы : При его обработке(одели шмотку/оружие) - будет уменьшена ваша защита на "8" единиц( -8 ). Описывать не буду, работает как выше изложенное, order - аналогично будет 0x10, так как действие обратно "сложению". в) - тег, который "назначает" кол-во того или иного стата. Он - исполняется в формуле до "+" или "-", и поэтому - имеет первое место. Это, как бы назначение того или иного стата для дальнейшей работы. Пример : Растолкую вам : это назначение "значения" того или иного "стат"`a. Пояснение "val" и "stat" есть выше. Order используется "0x08" (то о чем я говорил в "add"). г) - тег, используемый для "умножения" того или иного значения. Приведем пример : Итак, аналогично val="значение" - это значение на которое нужно умножить ваш "стат". Возможные order : -0x30 Приведем пример : Это означает, что стат 'pDef' при выполнении умножится на 3.5 (тоесть станет больше в 3.5 раза). Если использовать грамотно, можно реализовывать и деление, к примеру : Это означает, что стат 'pDef' будет умножен на '0.5', а тоесть - станет в 2 раза меньше(тут на любителей). г) - тег, показывающий, на сколько при заточке на уровень выше (при каждом +1) будет увеличен тот или иной стат. Пример : Обычно, order здесь "0x0C". Глава 5. Описание общепринятых значений в скиллах (skill). Данную главу - считаем наиболее важной. Здесь не будут описаны те или иные значения, которые употреблялись выше (мы же не попугаи повторять несколько раз). Любой скил, начинается с открытого тега и заканчивается - закрывающим тегом Вот вам наглядный пример : Итак приступим по пунктам. а) Минимально необходимые теги (обязательные). Как вы наверное догадались - у любого описания какого либо скила - должны быть какие-либо минимальные значения, чтобы его смог обработать ява код. В скилах - выделяют ТРИ обязательных тега, без которых не произойдет прогрузка скила(ошибка в контролерах ява кода, из-за отсутствия одного из них). target="val" - Один из обязательных тегов. При его отсутствии - не будет работать не 1н скилл. Что он делает? Он определяет - на ково будет направлен тот или иной скил. Возможные "val"(значения). -TARGET_SELF - обозначает, что скилл будет использоваться исключительно на его владельца (в мире линягеров - селф баф и т д). -TARGET_NONE - обозначает, что цель - не определена (неизвестно на кого будет использовано и как). -TARGET_ONE - обозначает, что цель вашего скила - тот кто в таргете. -TARGET_AGGREMENT (не везде работает) - обозначает, что целью будет тот, кто вас бьет(не важно в таргете он или нет) -TARGET_AREA - обозначает, что скилл будет массовым (сплеш) Так же есть и другие значения, но они менее важны. skillType - указывает на тип скилла. Тоесть, какой градировкой обозначен его ефект (в ядре). От типа скила - зависит его исполнение. Приведем некие примеры типов скилов : -BUFF - обозначает, что скил имеет магический / физический тип, и выступает как "баф" - тоесть имеет время каста или использование. -DEBUFF - обозначает, что скилл будет иметь какой либо маг / физ негативный ефект, у линягеров - дебаф. Все рамки этих типов забиты в ядре. А так же другие типы скилов, найти вы их сможете в вашем датапаке скилов (/data/stats/skill) operateType - назначает тип скила по принципу - Active / Passive. Для использования, приняты значения : -OP_ACTIVE - активный скилл, значит он может быть использован -OP_PASSIVE - пассивный скил, скил с таким operateType не может быть использован (он пассивный). б) Общепринятая орфография. В скилах, принято так, что большинство стандартных параметров(значений) - начинаются с тега . Приведем наглядный пример : в name - указывают "тип переменной", тоесть значение с которым будем работать. Вот как выглядит к примеру тэг "target". При таком использовании - мы видим, что назначается тип переменой - "target" со значением : "TARGET_ONE". Как это сработает - описано выше. Аналогично и другие переменные приобретают подобный вид, такие как "operateType", "power" и другие. Так же, есть еще здесь контейнерные теги, здесь орфография немного иная. Не редко, для удобства использования левелов скилов (если он не один, а к примеру 15 и т.д) применяются "табличные значения". Что же это такое? Ну к примеру, у нас есть скилл, который имеет 15 уровней прокачки и на каждом уровне - у него разная сила действия. Как же быть с этим? Для этого, мы используем некий контейнерный тег : В таком случае, при использовании : "#тип_переменной" - будет использоваться табличная структура. Не буду грузить теорией, объясню вам это наглядно, на моём небольшом примере : Здесь нам интересно, как же будут использоваться значения в теге ?! А очень просто. Здесь будет выполняться некое "условие". Как мы видем (параметр levels="5") что у скила есть 5 уровней прокачки. Если у игрока, скилл находится в состоянии level='1' (тоесть уровень изучения скила = 1), то будет принято ПЕРВОЕ значение из тега . Если уровень скила будет level='3' у игрока, то будет выбрано третье значение из тега (а тоесть, - "30"). Ну и так далее. Вот и весь основной принцип орфографии. в) Другие употребляемые теги в скиллах. Не секрет, что переменных в скилах - уйма. Я постараюсь вам описать некоторые из них и слегка принцип их работы. -power - отвечает за "силу" скила (тоесть сколько нанесет урона или на сколько эффективен) -hitTime - отвечает за "скорость" нанесения того или иного скила (если баф - то скорость чтения, боевой - скорость удара) -reuseDelay - отвечает за "скорость перезарядки" того или иного скила. -hpconsume , mpconsume - сколько потребляет hp / mp тот или иной скилл -castRage - это дальность использования того или иного скила (дистанция) -isMagic, isDebuff, isBuff - это наводящие теги, могут иметь значение "true" и "false". Определяют - 'да' или 'нет'. К примеру, isMagic = true, обозначит скилл как "магический" -efectRage - это радиус на который будет действовать скилл (к примеру у сплешевых скилов) -agro - с какой силой агрить И многие другие переменные, устанавливаем их роль самостоятельно (а то всё я расказываю а вы лодарничаете). г) Значение в скиллах. Нередко, мы встречаем использование тега в наших скилах. Зачастую, данный тег используется для "добавления сложны действий" к скиллу. Если скил, имеет сложный вариант реализации - то зачастую, в тег добавляют некоторые отдельные значения, которые реализованы в ЯДРЕ ява сервера l2. Самый важный тег для использования здесь - Приведем пример использования тега и тега Расскажем о каждой буковке эффекта нашего : name - это тип эффекта используемого скилом. Все эффекты - реализованы скилом. В каждой сборке или ядре - свои эффекты. Их список вы можете составить колупаясь по файлам скилов. val - это значение того или иного эффекта. Если это боевой эффект - то это его сила, если дебаф - то шанс прохождения (как и у бафа) ну и так далее. time - это время действия того или иного эффекта. StackOrder и stackType - это значения уже описные в данном скиле (использование переменных) или же значения и переменные с ядра сервера. Внимание! Некогда не вставляйте эффекты с одной сборки на другую - так как их в ядре той сборки просто может не быть (получите грабли). Думаю со скилами мы с вами разобрались, движемся дальше. П.с. - argumentation - вам на досугу (изучение лично). Там сложного нечего нету. Глава 6. Описание общепринятых значений в зонах(zones). Как мы уже выяснили, файлы xml зон находятся в /data/zones/ Описание квадратов зон - находятся в базе данных, и сопоставляются с ID наших XML зон. Итак, для начала описания зон используется тег : Итак по буквам : a) id - это идентификатор той или иной зоны. Он не столь важен, важен он только для базы данных. б) type - это тип зоны. Для понятия - рассмотрим некоторые : -Town - это означает, что зона будет являться мирной (город) -Arena - зона будет боевой (пвп) -JailZone - это для тюрьмы(запрещает Телепорт и прочие шалости). И многие другие типы. Они выступают неким "ограничителем" на ту или иную площадь. в) shape - это вид зоны. Увы, сам точно не помню. Они могут быть 2х типов : -nPoly -Cupoid г)minZ - это минимально допустимая координата высоты (z) в данной зоне(квадрате). д)maxZ - это максимально допустимая координата высоты (z) в этом квадрате. minZ и maxZ используются для избежания "провалов" чаров, "прохождения через текстуры" и т.д. Внутри тегов используется описание точек "респавна" чара в них. Приведем пример : они создадут некую точку появления чара, если он находится в этой зоне. Для более настырных - это совокупность координат, которые образуют точку в декартовом пространстве(для школьников - декартовые координаты) - {x;y;z}=Respawn_pice. Так же, зоны могут иметь имена, задаются они так : Вот собственно по зонам и всё.