Kerrax
Почетный форумчанин
- Регистрация
- 19 Фев 2008
- Сообщения
- 222
- Благодарности
- 682
- Баллы
- 220
Код:
*eventTag(0 "DEF_DAM_MULTIPLY" "МНОЖИТЕЛЬ")
Описание формата MDS-файлов можно прочитать на «этой странице»:Динамическая модель (3DS Max, анимация и меши). Однако тот документ не содержит информации о событии eventTag, встречающейся в MDS-файле. Что ж, восполним пробел.
Замечание. Информация, приведенная ниже, может быть местами неполной или даже неверной. Если у кого-то из моддеров будут дополнения/возражения, пишите, не стесняйтесь.
Событие eventTag опционально и помещается в блок событий, который следует сразу за фазой анимации ani. Событие – это определенное действие, которое запускается во время проигрывания фазы анимации в определённом кадре или кадрах.
Синтаксис:
Код:
ani ( ... НАЧ_КАДР КОН_КАДР )
{
*eventTag (КАДР "ИМЯ" "ПАРАМ1" "ПАРАМ2" "ПАРАМ3" "ПАРАМ4")
}
Имя указывает тип eventTag'а - см. ниже. Число параметров может меняться от 0 до 4.
Каждый eventTag имеет локальный характер - то есть указывает действия во время конкретной анимации. Еще применяется команда
Код:
modelTag (КАДР "ИМЯ" "ПАРАМ1" "ПАРАМ2" "ПАРАМ3" "ПАРАМ4")
Проверка допустимости параметров eventTag'а выполняется не во время компиляции динамической модели, а непосредственно во время анимации - то есть в процессе игры. Недопустимое имя просто не обрабатывается, вылета в Windows не будет.
Действие, выполняемое eventTag'ом, зависит от имени. Ниже приведен список вариантов eventTag'а с разными именами.
1. Операции над слотами
1.1. DEF_CREATE_ITEM
Синтаксис:
Код:
*eventTag(КАДР "DEF_CREATE_ITEM" "СЛОТ" "ПРЕДМЕТ")
Пример (использование наковальни):
Код:
ani ("t_BSANVIL_Stand_2_S0" 1 "s_BSANVIL_S0" 0.1 0.0 M. "Hum_BSAnvil_Jue00.asc" F 0 2)
ani ("s_BSANVIL_S0" 1 "s_BSANVIL_S0" 0.0 0.0 M. "Hum_BSAnvil_Jue00.asc" F 3 3)
ani ("t_BSANVIL_S0_2_Stand" 1 "" 0.0 0.1 M. "Hum_BSAnvil_Jue00.asc" R 0 2)
ani ("t_BSANVIL_S0_2_S1" 1 "s_BSANVIL_S1" 0.0 0.0 M. "Hum_BSAnvil_Jue00.asc" F 4 9)
{
*eventTag (4 "DEF_INSERT_ITEM" "ZS_LEFTHAND") // (1)
*eventTag (4 "DEF_CREATE_ITEM" "ZS_RIGHTHAND" "ItMw_1H_Mace_L_04") // (2)
}
ani ("s_BSANVIL_S1" 1 "s_BSANVIL_S1" 0.0 0.0 M. "Hum_BSAnvil_Jue00.asc" F 10 47)
ani ("t_BSANVIL_S1_2_S0" 1 "s_BSANVIL_S0" 0.0 0.0 M. "Hum_BSAnvil_Jue00.asc" R 4 9)
{
*eventTag (4 "DEF_DESTROY_ITEM") // (3)
}
1.2. DEF_INSERT_ITEM
Синтаксис:
Код:
*eventTag(КАДР "DEF_INSERT_ITEM" "СЛОТ")
Код:
// POTIONFAST
ani ("t_potionfast_Stand_2_S0" 1 "s_potionfast_S0" 0.1 0.0 M. "Hum_DrinkPotion_M02.ASC" F 1 5)
{
*eventTag (5 "DEF_INSERT_ITEM" "ZS_LEFTHAND") // (1)
}
ani ("s_potionfast_S0" 1 "s_potionfast_S0" 0.0 0.0 M. "Hum_DrinkPotion_M02.asc" F 6 6)
ani ("t_potionfast_S0_2_Stand" 1 "" 0.0 0.1 M. "Hum_DrinkPotion_M02.asc" F 7 39)
{
*eventSFX (19 "DrinkBottle" R:1000 )
*eventTag (35 "DEF_DESTROY_ITEM") // (2)
}
Замечание. Один известный баг Готик: если ГГ пьет напиток и его в этот момент кто-то бьет, то эффект напитка применяется, однако напиток остается в инвентаре. Причина бага в том, что использованный напиток удаляется из мира в конце анимации питья, в то время как эффект напитка (скриптовая функция, увеличивающая характеристику ГГ) применяется в самом начале анимации. Когда ГГ бьют, анимация питья до конца не проигрывается, и напиток не успевает удалиться из мира.
Другой пример (использование MOB'а):
В Spacer'е записывается (поле useWithItem), какой предмет нужен для использования MOB'а. Этот предмет и будет вставлен в слот по команде eventTag «DEF_INSERT_ITEM».
1.3. DEF_REMOVE_ITEM
Синтаксис:
Код:
*eventTag(КАДР "DEF_REMOVE_ITEM")
1.4. DEF_DESTROY_ITEM
Синтаксис:
Код:
*eventTag(КАДР "DEF_DESTROY_ITEM")
1.5. DEF_PLACE_ITEM
Синтаксис:
Код:
*eventTag(КАДР "DEF_PLACE_ITEM")
Замечание. Предположительно, изначально подразумевалось другое поведение eventTag'а «DEF_PLACE_ITEM», а именно: Если NPC взаимодействует с MOB'ом и у этого MOB'а есть слот «ZS_SLOT», то переместить предмет, вставленный через «DEF_INSERT_ITEM», из слота NPC в слот «ZS_SLOT» MOB'а. Пример (сердца орочьих жрецов в храме Спящего, Г1):
Код:
// Sleeper Portal
ani ("t_SPORTAL_Stand_2_S0" 1 "s_SPORTAL_S0" 0.0 0.0 M. "Hum_SleeperPortal_M01.asc" F 0 19)
ani ("s_SPORTAL_S0" 1 "s_SPORTAL_S0" 0.0 0.0 M. "Hum_SleeperPortal_M01.asc" F 20 20)
ani ("t_SPORTAL_S0_2_Stand" 1 "" 0.0 0.2 M. "Hum_SleeperPortal_M01.asc" R 0 19)
ani ("t_SPORTAL_S0_2_S1" 1 "s_SPORTAL_S1" 0.0 0.0 M. "Hum_SleeperPortal_M01.asc" F 21 90 FPS:10)
{
*eventTag (60 "DEF_INSERT_ITEM" "ZS_RIGHTHAND") // (1)
*eventTag (90 "DEF_PLACE_ITEM") // (2)
}
ani ("s_SPORTAL_S1" 1 "s_SPORTAL_S1" 0.0 0.0 M. "Hum_SleeperPortal_M01.asc" F 91 91)
ani ("t_SPORTAL_S1_2_Stand" 1 "" 0.0 0.2 M. "Hum_SleeperPortal_M01.asc" F 90 100)
На самом деле, строка (2) просто удаляет меч из мира, как «DEF_DESTROY_ITEM». Предположительно, eventTag «DEF_PLACE_ITEM» -это еще одна задумка Пираний, не доведенная до конца в Г1. В Г2 eventTag «DEF_PLACE_ITEM» не используется.
1.6. DEF_EXCHANGE_ITEM
Синтаксис:
Код:
*eventTag(КАДР "DEF_EXCHANGE_ITEM" "СЛОТ" "ПРЕДМЕТ")
2. Доставание и убирание оружия
2.1. DEF_FIGHTMODE
Синтаксис:
Код:
*eventTag(КАДР "DEF_FIGHTMODE" "БОЕВОЙ_РЕЖИМ")
Здесь «БОЕВОЙ_РЕЖИМ» - одно из значений:
- »» - убрать оружие;
- «FIST» - кулаки;
- «1H» или «1HS» - одноручное оружие;
- «2H» или «2HS» - двуручное оружие;
- «BOW» - лук;
- «CBOW» - арбалет;
- «MAG» - магия.
2.2. DEF_PLACE_MUNITION
Синтаксис:
Код:
*eventTag(КАДР "DEF_PLACE_MUNITION" "СЛОТ")
Допустимы только два наименования слота: «ZS_LEFTHAND» и «ZS_RIGHTHAND». Амуниция всегда соответствует экипированному оружию стрелковому оружию(поле munition в описании инстанции C_Item). Пример:
Код:
instance ItRw_Sld_Bow(C_Item)
{
name = "Лук";
mainflag = ITEM_KAT_FF;
flags = ITEM_BOW;
material = MAT_WOOD;
value = Value_SldBogen;
damageTotal = Damage_SldBogen;
damagetype = DAM_POINT;
munition = ItRw_Arrow;
cond_atr[2] = ATR_DEXTERITY;
cond_value[2] = Condition_SldBogen;
visual = "ItRw_Sld_Bow.mms";
description = name;
text[2] = NAME_Damage;
count[2] = damageTotal;
text[3] = NAME_Dex_needed;
count[3] = cond_value[2];
text[5] = NAME_Value;
count[5] = value;
};
2.3. DEF_REMOVE_MUNITION
Синтаксис:
Код:
*eventTag(КАДР "DEF_REMOVE_MUNITION")
2.4. DEF_DRAWSOUND
Синтаксис:
Код:
*eventTag(КАДР "DEF_DRAWSOUND")
- «DrawSound_WO.wav» - для деревянного оружия;
- «DrawSound_ME.wav» - для металлического оружия.
Синтаксис:
Код:
*eventTag(КАДР "DEF_UNDRAWSOUND")
- «UndrawSound_WO.wav» - для деревянного оружия;
- «UndrawSound_ME.wav» - для металлического оружия.
Синтаксис:
Код:
*eventTag(КАДР "DEF_SWAPMESH" "СЛОТ1" "СЛОТ2")
Не рекомендуется использовать «ZS_RIGHTHAND» и «ZS_LEFTHAND» в качестве имени первого или второго слота, т.к. в этом случае движок произведет попытку перевести NPC в один из боевых режимов (аналогично eventTag «DEF_FIGHTMODE»), что иногда может закончиться зависанием игры.
Существует похожий способ переставлять предметы в слотах - это команда
Код:
*eventSwapMesh(КАДР "СЛОТ1" "СЛОТ2")
3. Операции с факелами
3.1. DEF_DRAWTORCH
Синтаксис:
Код:
*eventTag(КАДР "DEF_DRAWTORCH")
3.2. DEF_INV_TORCH
Синтаксис:
Код:
*eventTag(КАДР "DEF_INV_TORCH")
Если же в левой руке NPC держит факел, то убирает факел в инвентарь до конца текущего набора анимаций, связанных с использованием предмета/MOB'а. Пример: NPC подходит с горящим факелом к кровати, ложится спать. Нужно временно убрать факел из левой руки, иначе NPC может поджечь кровать
3.3. DEF_DROP_TORCH
Синтаксис:
Код:
*eventTag(КАДР "DEF_DROP_TORCH")
4. Атака и защита
4.1. DEF_HIT_LIMB
Синтаксис:
Код:
*eventTag(0 "DEF_HIT_LIMB" "КОНЕЧНОСТЬ1" "КОНЕЧНОСТЬ2" "КОНЕЧНОСТЬ3" "КОНЕЧНОСТЬ4")
Пример:
Код:
//для кулачной драки устанавливается
*eventTag(0 "DEF_HIT_LIMB" "Bip01 R Hand")
//для драки одноручным оружием устанавливается
*eventTag(0 "DEF_HIT_LIMB" "ZS_RIGHTHAND")
//(в боевом режиме одноручное оружие находится в слоте "ZS_RIGHTHAND")
//для кусающегося снеппера устанавливается
*eventTag(0 "DEF_HIT_LIMB" "BIP01 HEAD")
4.2. DEF_HIT_DIR
Синтаксис:
Код:
*eventTag(0 "DEF_HIT_DIR" "НАПРАВЛЕНИЕ")
Код:
ani ("s_2hAttack" ...)
{
...
*eventTag (0 "DEF_DIR" "U")
...
}
«НАПРАВЛЕНИЕ» - любая строка текста длиной до 10 символов. Направление по умолчанию - «O» (заглавная английская буква, не ноль). То есть
Код:
//отсутствие строчки
*eventTag (0 "DEF_DIR" ...)
//дает то же, что и присутствие
*eventTag (0 "DEF_DIR" "O")
4.3. DEF_DAM_MULTIPLY
Синтаксис:
Код:
*eventTag(0 "DEF_DAM_MULTIPLY" "МНОЖИТЕЛЬ")
Код:
ani ("s_2hAttack_1" ...)
{
...
*eventTag (0 "DEF_DAM_MULTIPLIER" "2.0")
...
}
4.4. DEF_PAR_FRAME
Синтаксис:
Код:
*eventTag(0 "DEF_PAR_FRAME" "НАЧ_КАДР КОН_КАДР")
4.5. DEF_OPT_FRAME
Синтаксис:
Код:
*eventTag(0 "DEF_OPT_FRAME" "КАДР1 КАДР2 КАДР3 ... КАДР10")
Пример (mds_overlay\human_2hST2.mds, Г2):
Код:
ani ("s_2hAttack" 1 "s_2hAttack" 0.0 0.2 M. "Hum_2hAttackComboT3_M02.asc" F 1 150)
{
*eventTag (0 "DEF_HIT_LIMB" "ZS_RIGHTHAND")
*eventTag (0 "DEF_OPT_FRAME" "5 45 90 138")
*eventTag (0 "DEF_HIT_END" "35 75 120 147")
*eventTag (0 "DEF_WINDOW" "13 41 53 81 98 126 146 149")
...
}
- Если игрок не нажмет клавишу «вверх» между 13 и 41 кадрами, то его персонаж нанесет только 1 удар и анимация закончится на 35 кадре;
- Если игрок нажмет клавишу «вверх» между 13 и 41 кадрами, но не нажмет клавишу «вверх» между 53 и 81 кадрами, то его персонаж нанесет 2 удара и анимация закончится на 75 кадре;
- Если игрок нажмет клавишу «вверх» между 13 и 41 кадрами, нажмет клавишу «вверх» между 53 и 81 кадрами, но не нажмет клавишу «вверх» между 98 и 126 кадрами, то его персонаж нанесет 3 удара и анимация закончится на 120 кадре;
- и т.д.
4.6. DEF_HIT_END
Синтаксис:
Код:
*eventTag(0 "DEF_HIT_END" "КАДР1 КАДР2 КАДР3 ... КАДР10")
Число кадров, указанное в этой записи, должно совпадать с числом кадров eventTag'а «DEF_OPT_FRAME».
4.7. DEF_WINDOW
Синтаксис:
Код:
*eventTag(0 "DEF_WINDOW" "НАЧ_КАДР1 КОН_КАДР1 НАЧ_КАДР2 КОН_КАДР2 ... НАЧ_КАДР10 КОН_КАДР10")
Число интервалов должно совпадать с числом кадров eventTag'а «DEF_OPT_FRAME» (см. пример выше).
*P.S.* Спасибо *alex_draven* и *Ukur*'у за ценные замечания.
Автор - Kerrax.