• Уважаемые гости и новички, приветствуем Вас на нашем форуме
    Здесь вы можете найти ответы практически на все свои вопросы о серии игр «Готика» (в том числе различных модах на нее), «Ведьмак», «Ризен», «Древние свитки», «Эра дракона» и о многих других играх. Можете также узнать свежие новости о разработке новых проектов, восхититься творчеством наших форумчан, либо самим показать, что вы умеете. Ну и наконец, можете обсудить общие увлечения или просто весело пообщаться с посетителями «Таверны».

    Чтобы получить возможность писать на форуме, оставьте сообщение в этой теме.
    Удачи!

Важно Динамическая модель: описание eventTag'ов

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'у, но записывается внутри блока aniEnum и распространяется на все анимации модели.

Проверка допустимости параметров eventTag'а выполняется не во время компиляции динамической модели, а непосредственно во время анимации - то есть в процессе игры. Недопустимое имя просто не обрабатывается, вылета в Windows не будет.

Действие, выполняемое eventTag'ом, зависит от имени. Ниже приведен список вариантов eventTag'а с разными именами.

1. Операции над слотами
1.1. DEF_CREATE_ITEM

Синтаксис:
Код:
*eventTag(КАДР "DEF_CREATE_ITEM" "СЛОТ" "ПРЕДМЕТ")
Создает предмет в слоте. При этом новый предмет вставляется в мир, т.е. предмет берется не из инвентаря NPC. «ПРЕДМЕТ» - это имя инстанции предмета. Предмет вставляется в мир не насовсем, а только до конца выполнения текущего набора анимаций, связанного с использованием предмета/MOB'а.

Пример (использование наковальни):
Код:
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)
}
В Spacer'е определено, что наковальня используется с предметом «ItMiSwordrawhot» (Раскаленная сталь), поэтому строка (1) на 4-м кадре вставит в левую руку NPC предмет ItMiSwordrawhot. Далее, строка (2) создаст в правой руке NPC предмет «ItMw_1H_Mace_L_04» (Кузнечный молот). В строке (3) используемый предмет «ItMiSwordrawhot» удаляется из мира. Вместо раскаленной стали уже скриптом вставляется тот или иной меч.

1.2. DEF_INSERT_ITEM
Синтаксис:
Код:
*eventTag(КАДР "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)
}
Строка (1) на 5-м кадре анимации удаляет напиток из инвентаря и вставляет в левую руку NPC. Строка (2) удаляет напиток из левой руки NPC и из мира.

Замечание. Один известный баг Готик: если ГГ пьет напиток и его в этот момент кто-то бьет, то эффект напитка применяется, однако напиток остается в инвентаре. Причина бага в том, что использованный напиток удаляется из мира в конце анимации питья, в то время как эффект напитка (скриптовая функция, увеличивающая характеристику ГГ) применяется в самом начале анимации. Когда ГГ бьют, анимация питья до конца не проигрывается, и напиток не успевает удалиться из мира.

Другой пример (использование MOB'а):

В Spacer'е записывается (поле useWithItem), какой предмет нужен для использования MOB'а. Этот предмет и будет вставлен в слот по команде eventTag «DEF_INSERT_ITEM».

1.3. DEF_REMOVE_ITEM
Синтаксис:
Код:
*eventTag(КАДР "DEF_REMOVE_ITEM")
Убирает предмет, вставленный в слот через «DEF_INSERT_ITEM», из слота назад в инвентарь.

1.4. DEF_DESTROY_ITEM
Синтаксис:
Код:
*eventTag(КАДР "DEF_DESTROY_ITEM")
Уничтожает предмет, вставленный в слот через «DEF_INSERT_ITEM». Предмет удаляется из мира.

1.5. DEF_PLACE_ITEM
Синтаксис:
Код:
*eventTag(КАДР "DEF_PLACE_ITEM")
Удаляет предмет, вставленный через eventTag «DEF_INSERT_ITEM», из слота и из мира. По своему действию eventTag «DEF_INSERT_ITEM» является синонимом «DEF_DESTROY_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)
Выполнение строки (1) приводит к тому, что на 60-м кадре ГГ достает меч орочьего жреца (из инвентаря), а строка (2), предположительно, должна была оставлять вставленный в сердце меч торчащим из этого сердца. Для этого слот «ZS_SLOT» для MOB'а и нужен - чтобы указать местонахождение меча после вставки в сердце.

На самом деле, строка (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" "БОЕВОЙ_РЕЖИМ")
Используется в переходных анимациях типа «t_1h_2_1hRun» и выполняет переключение NPC в один из боевых режимов.

Здесь «БОЕВОЙ_РЕЖИМ» - одно из значений:
  • »» - убрать оружие;
  • «FIST» - кулаки;
  • «1H» или «1HS» - одноручное оружие;
  • «2H» или «2HS» - двуручное оружие;
  • «BOW» - лук;
  • «CBOW» - арбалет;
  • «MAG» - магия.
Например, для параметра «1H» выполняется удаление меча из слота «ZS_SWORD» и вставка меча в слот «ZS_RIGHTHAND», устанавливается следующая анимация (запустится после завершения текущей) «s_1h».

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")
Удаляет ранее экипированную амуницию (см. описание DEF_PLACE_MUNITION).

2.4. DEF_DRAWSOUND
Синтаксис:
Код:
*eventTag(КАДР "DEF_DRAWSOUND")
Начинает проигрывание звукового эффекта вытаскивания оружия:
  • «DrawSound_WO.wav» - для деревянного оружия;
  • «DrawSound_ME.wav» - для металлического оружия.
2.5. DEF_UNDRAWSOUND
Синтаксис:
Код:
*eventTag(КАДР "DEF_UNDRAWSOUND")
Начинает проигрывание звукового эффекта убирания оружия:
  • «UndrawSound_WO.wav» - для деревянного оружия;
  • «UndrawSound_ME.wav» - для металлического оружия.
2.6. DEF_SWAPMESH
Синтаксис:
Код:
*eventTag(КАДР "DEF_SWAPMESH" "СЛОТ1" "СЛОТ2")
Поменяет местами предметы в слотах; «СЛОТ1» и «СЛОТ2» - это имена слотов, объекты в которых нужно поменять. Пустые имена не допускаются.

Не рекомендуется использовать «ZS_RIGHTHAND» и «ZS_LEFTHAND» в качестве имени первого или второго слота, т.к. в этом случае движок произведет попытку перевести NPC в один из боевых режимов (аналогично eventTag «DEF_FIGHTMODE»), что иногда может закончиться зависанием игры.

Существует похожий способ переставлять предметы в слотах - это команда
Код:
*eventSwapMesh(КАДР "СЛОТ1" "СЛОТ2")
Основные отличия: eventSwapMesh меняет местами только меши предметов в слотах, а eventTag «DEF_SWAPMESH» меняет местами сами эти предметы. Кроме того, eventSwapMesh одинаково работает для любых имен слотов, а eventTag «DEF_SWAPMESH» имеет особое поведение, когда один из слотов является «ZS_LEFTHAND» или «ZS_RIGHTHAND».

3. Операции с факелами
3.1. DEF_DRAWTORCH

Синтаксис:
Код:
*eventTag(КАДР "DEF_DRAWTORCH")
Ничего не делает.
3.2. DEF_INV_TORCH
Синтаксис:
Код:
*eventTag(КАДР "DEF_INV_TORCH")
Если в левой руке NPC нет факела, то ничего не делает.

Если же в левой руке NPC держит факел, то убирает факел в инвентарь до конца текущего набора анимаций, связанных с использованием предмета/MOB'а. Пример: NPC подходит с горящим факелом к кровати, ложится спать. Нужно временно убрать факел из левой руки, иначе NPC может поджечь кровать ;)
3.3. DEF_DROP_TORCH
Синтаксис:
Код:
*eventTag(КАДР "DEF_DROP_TORCH")
То же, что и DEF_INV_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" "НАПРАВЛЕНИЕ")
Устанавливает направление удара - влияет на выбор анимации защиты. Например, если первый NPC бьет другого посредством анимации
Код:
ani ("s_2hAttack" ...)
{
        ...
        *eventTag (0 "DEF_DIR"  "U")
        ...
}
а другой, дерущийся одноручным оружием, успевает заблокировать удар, то будет использована анимация «t_1hParade_U» для блока. То есть при определении анимации атаки можно указать, какой анимацией нужно поставить блок. (Понятно, что если атакуемый NPC - сам игрок, то выбор соответствующей анимации для блока выполнит движок, а не человек.)
«НАПРАВЛЕНИЕ» - любая строка текста длиной до 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")
    ...
}
то это означает, что эта атака будет наносить урон вдвое больший, чем вообще-то положено при таких соотношениях силы, урона оружия и брони противника. Урон будет умножаться на два независимо от того, критическая атака или нет. Можно написать число, меньшее 1.0, и тогда урон будет уменьшен.

4.4. DEF_PAR_FRAME
Синтаксис:
Код:
*eventTag(0 "DEF_PAR_FRAME" "НАЧ_КАДР КОН_КАДР")
Используется для анимации блокирования. Указывает, начиная с какого кадра и заканчивая каким блок будет давать защиту от урона. Если не указать такой eventTag или указать «0 0» в качестве начального и конечного кадров, то блок будет давать защиту все время проигрывания анимации.

4.5. DEF_OPT_FRAME
Синтаксис:
Код:
*eventTag(0 "DEF_OPT_FRAME" "КАДР1 КАДР2 КАДР3 ... КАДР10")
Используется для анимации атаки. Указываются кадры (числом от 1 до 10), когда нужно проверять на столкновение повреждающей конечности (см. описание «DEF_HIT_LIMB») и жертвы. Несколько кадров указывается, чтобы реализовать комбоудар. Таким образом, комбоудар может состоять из максимум 10 ударов. Обычно eventTag «DEF_OPT_FRAME» применяется вместе с «DEF_HIT_END» и «DEF_WINDOW».
Пример (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")
    ...
}
Анимация содержит кадры с 1 по 150. Полный комбоудар будет состоять из 4 ударов - на 5, 45, 90 и 138 кадрах. При этом возможны случаи:
  • Если игрок не нажмет клавишу «вверх» между 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")
Указывает кадр, на котором «обрубается» комбоудар, если не нажать во время клавишу «вверх» (Г1) или левую кнопку мыши (Г2). Баг Готик в том, что в этом случае мы услышим все звуковые эффекты, следующие за этим кадром, а анимация заканчивается характерным передёргиванием персонажа.
Число кадров, указанное в этой записи, должно совпадать с числом кадров eventTag'а «DEF_OPT_FRAME».

4.7. DEF_WINDOW
Синтаксис:
Код:
*eventTag(0 "DEF_WINDOW" "НАЧ_КАДР1 КОН_КАДР1 НАЧ_КАДР2 КОН_КАДР2 ... НАЧ_КАДР10 КОН_КАДР10")
позволяет задать «окно» на анимации - интервал кадров, в течение которого нужно нажать клавишу «вверх» (Г1) или левую кнопку мыши (Г2), чтобы продолжить комбоудар. Если не успеть - см. выше, что будет.

Число интервалов должно совпадать с числом кадров eventTag'а «DEF_OPT_FRAME» (см. пример выше).

*P.S.* Спасибо *alex_draven* и *Ukur*'у за ценные замечания.

Автор - Kerrax.
 

Bezio

Участник форума
Регистрация
27 Июн 2012
Сообщения
211
Благодарности
206
Баллы
200
На сию тему появился вопрос:

Нигде не написано (Да и сам найти в скриптах не смог), какая же функция отвечает за переход предмета "из слота в мир"? Единственное, что по этому поводу есть в статье - DEF_DROP_TORCH, однако она действует, вроде, только с факелом в левой руке и только при определенных условиях... Просто есть несколько действий, при который предмет действительно из слота (К примеру Zs_Righthand) переходит в мир и падает, а именно: Непосредственно сам ItemDrop, при нем определенный предмет из инвентаря появляется в слоте правой руки (Zs_Righthand) и на 7-ом кадре выпадает из него "В мир", однако в MDS-файле ни малейшего упоминания об этих процессах:

ani ("t_Stand_2_IDrop" 1 "s_IDrop" 0.1 0.0 M. "Hum_ItemDrop_A01.asc" F 1 6)
ani ("s_IDrop" 1 "s_IDrop" 0.0 0.0 M. "Hum_ItemDrop_A01.asc" F 7 7)
ani ("t_IDrop_2_Stand" 1 "" 0.0 0.1 M. "Hum_ItemDrop_A01.asc" F 8 14)

Так же и с неиспользованным броском предмета из Г1 (Происходит, когда в положении Ambient (Стандартное положение, без каких-либо боевых режимов) в слоте правой руки есть какой-либо предмет, тогда при зажатии действия ГГ размахнется и швырнет этот предмет, хотя и пролетит он недалеко - упадет на таком же расстоянии, что и если его просто из инвентаря сбросить), Однако суть в том, что тут тоже действует этот самый переход "из слота в мир" и, опять же, в скрипте нигде ничего не сказано:

ani ("t_Stand_2_IAim" 1 "s_IAim" 0.1 0.1 M. "Hum_ItemThrow_M01.asc" F 1 6)

ani ("c_IAim_1" 4 "" 0.0 0.0 . "Hum_ItemThrow_M01.asc" F 47 47)
ani ("c_IAim_2" 4 "" 0.0 0.0 . "Hum_ItemThrow_M01.asc" F 8 8)
ani ("c_IAim_3" 4 "" 0.0 0.0 . "Hum_ItemThrow_M01.asc" F 125 125)
ani ("c_IAim_4" 4 "" 0.0 0.0 . "Hum_ItemThrow_M01.asc" F 86 86)
aniComb ("s_IAim" 1 "s_IAim" 0.2 0.2 M. "c_IAim_" 4)

aniAlias ("t_IAim_2_Stand" 1 "" 0.1 0.1 M. "t_Stand_2_IAim" R)

ani ("c_IAim_2_IThrow_1" 4 "" 0.0 0.0 . "Hum_ItemThrow_M01.asc" F 48 58)
ani ("c_IAim_2_IThrow_2" 4 "" 0.0 0.0 . "Hum_ItemThrow_M01.asc" F 9 19)
ani ("c_IAim_2_IThrow_3" 4 "" 0.0 0.0 . "Hum_ItemThrow_M01.asc" F 126 136)
ani ("c_IAim_2_IThrow_4" 4 "" 0.0 0.0 . "Hum_ItemThrow_M01.asc" F 87 97)
aniComb ("t_IAim_2_IThrow" 1 "s_IThrow" 0.2 0.2 M. "c_IAim_2_IThrow_" 4)

ani ("c_IThrow_1" 4 "" 0.0 0.0 . "Hum_ItemThrow_M01.asc" F 59 59)
ani ("c_IThrow_2" 4 "" 0.0 0.0 . "Hum_ItemThrow_M01.asc" F 20 20)
ani ("c_IThrow_3" 4 "" 0.0 0.0 . "Hum_ItemThrow_M01.asc" F 137 137)
ani ("c_IThrow_4" 4 "" 0.0 0.0 . "Hum_ItemThrow_M01.asc" F 98 98)
aniComb ("s_IThrow" 1 "s_IThrow" 0.2 0.2 M. "c_IThrow_" 4)

ani ("c_IThrow_2_Stand_1" 4 "" 0.0 0.0 . "Hum_ItemThrow_M01.asc" F 60 83)
ani ("c_IThrow_2_Stand_2" 4 "" 0.0 0.0 . "Hum_ItemThrow_M01.asc" F 21 44)
ani ("c_IThrow_2_Stand_3" 4 "" 0.0 0.0 . "Hum_ItemThrow_M01.asc" F 138 161)
ani ("c_IThrow_2_Stand_4" 4 "" 0.0 0.0 . "Hum_ItemThrow_M01.asc" F 99 122)
aniComb ("t_IThrow_2_Stand" 1 "" 0.2 0.2 M. "c_IThrow_2_Stand_" 4)

Добавлял его к себе в Humans.mds из Г2 и, что странно, в скрипте тоже нигде не написано или же я этого не вижу, при таком же положении и нажатии действия ГГ тоже вставал в позу броска, но так в ней и замирал (Даже с управлением из Г1), похоже особое управление в самой Г1 активировало продолжение фаз, или же где-то в скриптах (Не представляю, где) это написано, однако тогда непонятно, зачем было оставлять реакцию на этот "Бросок", если самих анимаций и их фаз в Г2 нет... Но отошел от темы..

Так же переход "из слота в мир" происходит, если опять же, в амбиент-состоянии иметь в правой руке какой-нибудь предмет, а потом открыть меч, или же перейти в какой-либо другой боевой режим - предмет из слота правой руки снова выпадет (И в случае "вытеснения" его другим предметом в слоте, и даже если перейти в режим кулаков (Fist))

Еще, конечно же, переход "из слота в мир" происходит, когда персонаж погибает или оглушается с оружием в руках: и орудие и снаряд выпадают (Хотя, когда в Темной Саге щиты и дуал-мечи были "арбалетами", искусственно вставленными в слот левой руки (Zs_Leftthand), они при гибели или оглушении либо прятались в инвентарь, либо оставались висеть в слоте, что указывает на "движковую" природу этого дропа)

У Сатураса в AST-е (Я было дело, немного тестил) при выстреле из какого-либо стрелкового орудия, не поразивший цель и упавший (Теперь и воткнувшийся) снаряд можно подобрать, пока он не "Растворился", что тоже из себя представляет некий переход "в мир".

Лично мне это нужно для пары своих идей, и самая простая из них - бросок камня (Как эксперимент, при активации его из инвентаря, потом можно доразвить до того же ItemThrow, но с нормально дугой), анимация пролета камня по нормальной дуге - анимация слота Zs_Righthand, по окончанию полета, но еще в воздухе камень должен выйти из слота в мир и под хоть какой-то физикой Готики доупасть на землю. Да, есть небольшие казусы, к примеру, если дуга окажется ниже ландшафта, тогда камень пройдет сквозь него, или же если дуга окажется наоборот, значительно выше уровня ландшафта, тогда в момент выхода в мир камень будет лететь по прямой вниз, что будет выглядеть угловато.

ЗЫ. DEF_PLACE_ITEM - по идее был переход предмета из слота персонажа в слот Mobsi-объекта, в Г1 были так же орочий саркофаг, на грудь которому нужно было что-то поставить, напольная платформа, в которую нужно вставить меч (Использовалась для открывания ворот в храме Спящего), те же сердца орочьих жрецов. Можно ли как-нибудь реанимировать этот необычный переход?


И кстати да, из моей заезженной темы о взаимодействиях между NPC, вроде, в более ранних версиях Г1 (К примеру, дэмо-версия) я нашел такую анимацию, как "Передать предмет" (TradeItem) и выглядит она соответственно: Персонаж протягивает руку вперед ладонью (Если бы она у него была...) вверх. Можно было бы сделать передачу предмета более детально, чем есть в Готике (Надписи о получении и отдаче), при которых бы ГГ доставал предмет (или сверток\кошелек) и протягивал его персонажу, а тот бы его брал обычной анимацией поднятия предмета на средней высоте (Тут бы и происходил переход из слота одного персонажа в слот другого). Мелочь, а добавила бы красивости в диалоге. (В моде Одиссея эта анимация используется в диалогах)
 
Последнее редактирование:

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.371
Благодарности
7.801
Баллы
995

alex_draven


Модостроитель
Регистрация
13 Сен 2007
Сообщения
2.184
Благодарности
2.879
Баллы
420
Движок, конечно. Остальное - разной степени огрызки от нереализованных идей. Подчищено в Готике 2.
DEF_PLACE_ITEM - по идее был переход предмета из слота персонажа в слот Mobsi-объекта
Именно так. Но не доведено до ума.
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.321
Благодарности
3.166
Баллы
525
Можно ли как-нибудь реанимировать этот необычный переход?
Вот цитата камрада Керракс:

Типы объектов EVT_TPL_TRIGGER_SLEEPERHEARTS_01..EVT_TPL_TRIGGER_SLEEPERHEARTS_05 (сердца шаманов около Спящего)
должны быть oCMobItemSlot, а не oCMobInter. Дело в том, что eventTag "DEF_PLACE_ITEM" нормально работает только
с объектами типа oCMobItemSlot, у которых есть слот ZS_SLOT.
Если для сердец шаманов поставить правильный тип (т.е. oCMobItemSlot), то мечи, вставленные в сердца,
остануться торчать в них, а не исчезнут.

С оригинальным движком Г1 это работает. По иронии судьбы в Генжине взаимодействие с объектом oCMobItemSlot вызывает вылет. Недостатки:
1. после загрузки сохранения объект возвращается в первоначальное состояние S0;
2. предмет не перестаёт появляться в фокусе, и его можно взять без проигрывания анимаций взаимодействия с объектом.
 

SinnerSmile

Участник форума
Регистрация
3 Фев 2017
Сообщения
87
Благодарности
45
Баллы
170
Добрый день, было бы чУдно добавить к DEF_WINDOW информацию о том, что именно конец каждого интервала в DEF_WINDOW используется движком для определения с какого кадра начинать следующую анимацию удара в комбо. А не HIT_END, как можно было бы подумать.
 

НастасьСанна

Участник форума
Регистрация
6 Дек 2012
Сообщения
351
Благодарности
521
Баллы
325
Выяснила особенность работы DEF_CREATE_ITEM - может, сбережет кому-то немного нервов.

DEF_CREATE_ITEM корректно работает только в связке с DEF_INSERT_ITEM. Об этом выводится предупреждение в zSpy:
Код:
CNpc :: EV_CreateInteractItem: DEF_CREATE_ITEM w/o previously called DEF_INSERT_ITEM, did you forget to set a valid mobsi useOnItem string ? ....
И в результате получаем один из трех вариантов:
  1. Если дальше ничего не делать с итемом или использовать DEF_REMOVE_ITEM - то предмет убирается в инвентарь и дублируется, если он там уже был.
  2. Если удалить итем через DEF_DESTROY_ITEM, то он и из инвентаря удалится (если он там был, конечно).
  3. Если потом использовать DEF_EXCHANGE_ITEM на том же слоте - тогда все в порядке.
Т.е. просто удалить итем, как будто его не было, не получается.

Что делать, если все-таки надо создать итем в анимации и там же его удалить? Сразу использовать DEF_EXCHANGE_ITEM, он без проблем срабатывает с пустым слотом.


P.S. Для чего это вообще может быть надо? Для mobsi-объектов можно настроить conditionFunc, но если она возвращает FALSE, то тоже получаем баги с изчезновением/дублированием итема, указанного в useWithItem. Т.е. одновременно useWithItem и conditionFunc использовать не получается.
 
Сверху Снизу