==========================================================
Оружие, броня, параметры скиллов сохранены в XML файлах и в базе
данных. В скором времени использование базы данных для скиллов будет
удалено. В XML файлах сохранено описание как вещи и скиллы должны
влиять на статы (которые используются для подсчета повреждений, шансов
и т.д.). Вот пример XML файла для оружия и брони:
<item id='21'
name="shirt"> <for> <cond><player
race="Human"/></cond> <add stat='pDef' order='0x10'
val='36'> <target kind="skeleton"> </add> </for>
</item> Первая строчка нужна только для самого языка XML, пропустите её. Вторая строка указывает ID вещи и её название (они должны совпадать с такими же в БД). Затем есть некоторые условия (condition) для принятия вещью изменений для статов (когда оружие одето или снято). Таких условий может быть от ноль, один, два, или более. Условие заключено в тэг <for>.
Тэг условия состоит из самого условия которое следует проверить на
игроке и эффекта на статы игрока. В вышенаписанном примере условие
добавление эффекта - это расса людей (если не хуман - эффект не
включится). Условие заключено в тэг <cond>, и оно не обязательно.
Если условия не указаны - все игроки (которые одевают эту броню\оружие)
будут получать эффект от него. Эффект - это добавление или
умножение статов игрока на заданное количество. В примере стат 'pDef'
(power defence) и его значение 36. Это означает, что к power defence
игрока будет добавлено значение 36. Я опишу 'order' ниже. В
конце, даже если функцию подключена к игроку, необходимо чтобы было
условие когда оно будет работать. В нашем примере условие таково: pDef
будет увеличен только тогда, когда цель игрока - атака skeleton.
И снова: может быть множество условий <for>, они могут иметь
условие присоединенное к игроку <cond>, и каждый из них может
влиять на один или несколько статов игрока ( <add>, <sub>,
<mul>, <div> ), и каждый стат будет добавлен только в том
случае когда условие будет выполнено. Конечно, всё это не обязательно. Для большинства предметов брони и оружия вы будете иметь что-то простое похожее на это:
<item id='21'
name="shirt"> <for> <add stat='pDef' order='0x10'
val='36'/> </for> </item> которое всего лишь добавляет 36 пунктов к power defence для каждого игрока который оденет её, без каких-либо условий.
Скиллы описаны практически так же, но с одним дополнением - у скиллов
есть уровни. По-этому значение для увеличения\уменьшения стата будет
зависеть от уровня скилла. Для этих целей мы имеем таблицы:
<skill id='113'
levels='2' name="Long Shot"> <table name="#dist"> 200 400
</table> <for> <add stat='rAtk' order='0x10'
val='#dist'> <using kind="Bow"/> </add> </for>
</skill> В строке <skill> вы выборочно указываете
количество уровней. Затем вы провозглашаете таблицу (вы можете
провозгласить много ), каждый из них будет иметь 'level' значения
отделенные друг от друга пробелами. Название таблицы может быть любым,
но должно начинаться с символа #. В значениях вы указываете название
вашей таблицы. Сейчас я опишу "order" параметр. "Order" это
порядок проведения расчетов. Давайте представим что мы имеем base power
defence игрока: basePDef защита одетого доспеха: armourPDef level modifier of the player: lvl passive skill of power defence которое надо добавить: skillPDef1 buff of power defence которое надо умножить: skillPDef2 Получаем такую формулу: basePDef + armorPDef)*lvl + skillPDef1)*skillPDef2 Знаки умножение\суммы в этой формуле указаны 'order'ом расчета. Получается: basePDef будеть иметь order 0x10 armorPDef будеть иметь order 0x10 lvl будеть иметь order 0x30 skillPDef1 будеть иметь order 0x40 skillPDef2 будеть иметь order 0x50
Значения с одинаковыми 'order'ами расчета будут рассчитаны в не
предсказуемом порядке. По-этому, никогда не указывай одинаковый order
параметрам add/substiture и multiplay/divide. Немного больше о условиях. Вы можете указывать логические операции <and>, <or>, <not>:
=========================================================
==========================================================
<and><player race="Human"/><player
level="11"/></and> <or><player
race="Human"/><player race="Orc"/></or>
<not><player race="Human"/></not> <and>
<not> <player race="Human"/> </not> <or>
<player level="11"/> <not> <player level=40>
</not> </or> </and> Условиями являются: Код: <player race="..."/> <!-- проверяет рассу игрока --> <player level="..."/> <!-- проверяет является ли уровень игрока таким, или выше указанного здесь --> <player state="..."/> <!-- Делает проверку игрока на выполнение действий: sit, walk, run, swim, etc --> <target level="..."> <!-- проверяет является ли уровень цели таким, или выше указанного здесь --> <using kind="..."/> <!-- игроков одета броня указанного типа, или оружие указанного вида. Броня бывает Light, Heavy, Magic, оружие: Shield, Sword, Blunt, Dagger, Bow, Pole, Etc, Fist, Dual Sword, Dual Fist - список типа разделен запятыми --> Операциями над значениями являются:
<add stat='...' val='...'/> <!-- add a value --> <sub
stat='...' val='...'/> <!-- значение подстановки --> <mul
stat='...' val='...'/> <!-- умножить на значение --> <div
stat='...' val='...'/> <!-- разделить на значение -->
Операция для "случайных" чисел и корней и других математический функций
возможно будут добавлены позже, в случае необходимости. Вы должны указать значение не как константу, а как выражение:
<skill id='256'
levels='1' name="Accuracy"> <table name="#acc"> 10
</table> <table name="#mana"> 0.2 </table>
<for> <add val='#acc' order='0x10' stat='accCombat'/>
<effect name="ManaDamOverTime" time="5" count="0x7fffffff">
<val> <add val="$player_level"/> <mul val="#mana"/>
</val> </effect> </for> </skill> Такое
выражение начинает расчитывать со значение 0, и для примера вверху мы
имеем уровень игрока умноженный на значение с таблицы, и это значение
будет использовано для для расчета повреждений манны для каждого
периода эффекта. Итого, в результате мы имеем - повышеную точность
(accuracy) в бою плюс отнимание за это манны (МР). Возможные значения для рассчетов: $player_level $target_level $player_max_hp $player_max_mp Продолжительными эффектами скиллов являются:
==========================================================
==========================================================
<effect name="Buff"> <!-- buff/debuff, для debuff исользуйте
отрицательные значения --> <effect name="DamOverTime"> <!--
единоразовое отнятие HP --> <effect name="ManaDamOverTime">
<!-- единоразовое отнятие MP --> <effect
name="HealOverTime"> <!-- единоразовое увеличение HP -->
<effect name="Charge"> <!-- "заряжает" игрока, подготавливает
его для использования другого скилла --> <effect
name="Relaxing"> <!-- relaxing skill --> Вот некоторые статы для редактирования. 'rEvas' 'cAtk' 'pAtkSpd' 'mAtkSpd' 'maxНp' 'maxMp' 'pAtk' 'mAtk' 'regMp' 'mDef' 'pDef' 'runSpd' 'reflectDam' ' sleepRes' 'rootRes' 'stunRes' 'poisonRes' 'bleedRes' Их можно посмотреть в ядре сервера \net\sf\l2j\gameserver\skills\stats.java И так, выбираем шмотик который хотим усовершенствовать: я для себя выбрал
<item id='616' name="cloak_of_magic"> <for> <add
val='11' order='0x10' stat='pDef' /> <enchant val='0'
order='0x0C' stat='pDef' /> </for> </item> Открываем data\stats\armor\0600-0699.xml, находим строчку с нашим "плащом магии".
Так как он плащ магии, неп***о было бы сделать его для магов. А что
надо магам? Правильно МР, реген МР, скорость каста, сила каста. Но
давать всё это сразу - слишком много, по-этому сделаем какие-нибудь три
изменения, например увеличим интеллект на +1, regMp, ну и скорость
каста (mAtkSpd). Хм, с бонусами вроде определились, теперь
надо определится в количестве этого бонуса, будет ли оно просто
добавлять какое-то заданное число (константу) либо проценты от уже
имеющегося стата (тобишь был mdef 100, добавили 10% - получили 110). Для себя я выбираю так: INTу добавляю 1. Регенерацию МР - повышаю на 20%. Скорость каста на 25%. Теперь что касается соответсвующего кода: Так как мы добавляем (знак +) INT, то используем тэг <add>: <add val='1' order='0x10' stat='INT'/> С интом разобрались, теперь что касающееся regMp (знак *, умножение): <mul val='1.20' order='0x20' stat='regMp'/> Обратите внимание на order! Теперь скорость каста на 25%: <mul val='1.20' order='0x20' stat='mAtkSpd'/> В итоге наш плащ будет иметь такой вид:
<item id='616' name="cloak_of_magic"> <for> <add
val='11' order='0x10' stat='pDef' /> <add val='1' order='0x10'
stat='INT'/> <mul val='1.20' order='0x20' stat='regMp'/>
<mul val='1.20' order='0x20' stat='mAtkSpd'/> <enchant val='0'
order='0x0C' stat='pDef' /> </for> </item> Все, встраивание бонуса закончено Теперь этот плащик можно попробывать спихнуть за реал глупым игрокам А вообще я такого рода шмот, даю в награду за турниры.
==========================================================
|