Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
Изменение параметров вещей.
#1
Оружие, броня, параметры скиллов сохранены в XML файлах и в базе данных. В скором времени использование базы данных для скиллов будет удалено. В XML файлах сохранено описание как вещи и скиллы должны влиять на статы (которые используются для подсчета повреждений, шансов и т.д.).

Вот пример XML файла для оружия и брони:

<?xml version='1.0' encoding='utf-8'?>
<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> ), и каждый стат будет добавлен только в том случае когда условие будет выполнено.

Конечно, всё это не обязательно. Для большинства предметов брони и оружия вы будете иметь что-то простое похожее на это:

<?xml version='1.0' encoding='utf-8'?>
<item id='21' name="shirt">
<for>
<add stat='pDef' order='0x10' val='36'/>
</for>
</item>

которое всего лишь добавляет 36 пунктов к power defence для каждого игрока который оденет её, без каких-либо условий.

Скиллы описаны практически так же, но с одним дополнением - у скиллов есть уровни. По-этому значение для увеличения\уменьшения стата будет зависеть от уровня скилла. Для этих целей мы имеем таблицы:

<?xml version='1.0' encoding='utf-8'?>
<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> вы выборочно указываете количество уровней. Затем вы провозглашаете таблицу (вы можете провозгласить много *04 ), каждый из них будет иметь '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='...'/> <!-- разделить на значение -->


Операция для "случайных" чисел и корней и других математический функций возможно будут добавлены позже, в случае необходимости.

Вы должны указать значение не как константу, а как выражение:

<?xml version='1.0' encoding='utf-8'?>
<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'


Это не все, это всего лишь часть статов, которые мне пришли в голову, но могут вам быть полезными для редактирование шмота и т.д.

Теперь рассмотрим как сделать какой-либо шмот уникальным.

И так, выбираем шмотик который хотим усовершенствовать: я для себя выбрал:

<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\armor600-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>


Автор тектста: VersuS
Ответ
#2
А после создания этих вещей при обновлении сервера надо будет их переносить дополнительно или они как то пропишутся ?
Ответ
#3
Если датапак полностью обновлять то придётся прописывать заново.
Я не прав? Докажите это тут или тут
* Интересная тема * для новичков *
Ответ
#4
а как можно добавить новый ресурс (к примеру Quest Item с новым названием)
пробую по методики добавления нового персонажа
таблица etcitem
капирую строку в базе данных
заменяю Item_ID и Name
захожу в игру... при ввоже Item_ID придмет не дабавляется в инвентарь

что я не так делаю и как это можно реализавать?
Ответ
#5
pomoshnik Написал:а как можно добавить новый ресурс (к примеру Quest Item с новым названием)
пробую по методики добавления нового персонажа
таблица etcitem
капирую строку в базе данных
заменяю Item_ID и Name
захожу в игру... при ввоже Item_ID придмет не дабавляется в инвентарь

что я не так делаю и как это можно реализавать?

Скорее всего дело в том что клиент просто "не видит" новый предмет, и никак его не отображает т.к. нету никаких иконок, описания и т.п.
Возможно косвенно определить "наличие предмета", добавить итему ВЕС и поглядеть на изменение в рюкзаке.

п.с.
Что за "методика добавления нового персонажа"?
Ответ
#6
marvellously Написал:Скорее всего дело в том что клиент просто "не видит" новый предмет, и никак его не отображает т.к. нету никаких иконок, описания и т.п.
Возможно косвенно определить "наличие предмета", добавить итему ВЕС и поглядеть на изменение в рюкзаке.

п.с.
Что за "методика добавления нового персонажа"?

да всё уже вроде как нашёл как сделать чтоб видно всё было ...

методика добавления новых персонажей NPС
лезим в Navicat открываем там таблицу NPC
копируем строку одного из NPC меняем:
ID - новый номер для добавления спаун точки
Name - имя персонажа
ServerSideName - подленнасть имяни если 0 настоящие имя, 1 то имя которое вы ему дали
ServerSideTitle - подленнасть титула если 0 настоящие имя, 1 то титул которое вы ему дали

если хотите научить говорить его с вами, создайте HTM фаил с номером его нового ID в папке характерной его типу в таблице
(type => L2Merchant - htm/merchant/)
в нём уже по примеру соседних *.HTM файлов пишим деалог

вот такая вот наука ....
ЗЫ: когда окончательно прощупую всю систему добавление новых рецептов и тп напишу FAQ =)
Ответ
#7
ясненько =) я думал "персонаж" в смысле игрок, меня интересует как можно добавить новый "класс" в игре, но это немного другая тема, наверное стоит создать отдельную..
Ответ
#8
А подскажите пожалуйста как сделать чтобы мою новую вещь мог одеть скажем только гном
(как рапира у камаэль)
в каких файлах и какие значения менять. не могу найти
Ответ
#9
avemaria Написал:А подскажите пожалуйста как сделать чтобы мою новую вещь мог одеть скажем только гном
(как рапира у камаэль)
в каких файлах и какие значения менять. не могу найти

Смотри в самом верху.
<cond><player race="Human"/></cond>

Если только для гнома, то вместо Human - Dwarf.
Если я в чём то неправ - поправьте.
Ответ
#10
Большое Спасибо.
За столь замечательное описание.
Очень понравилось.
+интересно.
+заинтересовало.
Ответ


Перейти к форуму:


Пользователи, просматривающие эту тему: 1 Гость(ей)