Простите за некропостинг =[ но как бы давно на форуме не был, забрел, полистал темы, нашел интересную. Кратенько опишу как сделать пистолет в левую руку. Делал с год назад, все забыл, но проникся, установил варбанду снова, откопал трупик мода и вспомнил =)
Текущий вариант, мягко говоря, не готовый: он не учитывает навык стрельбы персонажа, при экипированном пистолете не показывается прицел, не тратятся патроны, да и работает 100% только для ГГ, но самую главную задачку - выстрел из пистолета в левой руке оно решает. Ах да, еще Грей так и не вкурил как следует как работает система событие-реализация в сетевой игре, потому все скрипты для сингла онли.
Итак начнем. Во-первых добавляем в module_items сам пистолет:
#lefthandpistol
["lefthandpistol ", "lefthand pistol ", [("lefthandpistol ",0)],
itp_merchandise|itp_type_shield|itcf_carry_revolver_right|itp_wooden_parry|itp_force_attach_left_hand, 0, 60 , weight(2)|hit_points(400)|body_armor(4)|spd_rtng(100)|shield_width(1)|shield_height(1),imodbits_shield],
Т.е. наш пистолет - на самом деле щит.
Затем в module_mission_templates в начале объявляем свои процедуры, которые собственно и будет производить выстрел.
lpistol_down = (
0,0,0,[],
[
(try_for_agents,":agent_no"),
(agent_get_wielded_item,":item_no",":agent_no",1),
(eq, ":item_no", "itm_lefthandpistol"),
(agent_get_defend_action, ":action", ":agent_no"),
(eq, ":action", 2),
(agent_set_defend_action, ":agent_no", -2, 1000),
(agent_set_slot,":agent_no",99,1),
(agent_set_animation, ":agent_no", "anim_ready_pistol", 1),
(try_end),
]
lpistol_click =(
0,0,0.5,[(game_key_released, gk_defend),],
[
(get_player_agent_no, ":agent_no"),
(agent_get_slot,":ready",":agent_no",99),
(agent_get_wielded_item,":item_no",":agent_no",1),
(try_begin),
(eq, ":ready", 1),
(eq, ":item_no", "itm_lefthandpistol"),
(agent_set_animation, ":agent_no", "anim_release_pistol"),
(init_position,pos20),
(agent_get_position,pos1,":agent_no"),
(agent_get_bone_position, pos20, ":agent_no", hb_hand_l),
(position_transform_position_to_parent,pos20,pos1,pos20),
(play_sound,"snd_pistol_shot"),
(particle_system_burst, "psys_pistol_smoke", pos20, 15),
(add_missile, ":agent_no", pos20, 55000, "itm_lasgun",0, "itm_cartridges",0),
(agent_set_slot,":agent_no",99,0),
(try_end),
]
)
Первая процедура отлавливает всех агентов, которые кастуют действие "защита", проверяет наличие нужного предмета и, если предмет найден, выполняет три вещи:
- убирает действие "защита". Мы же не можем блочить пистолем, верно?
- выставляет в агентский слот 99 значение 1. Это для нас - скриптеров - отметочка, что прицеливание выполнено.
- проигрывает анимацию прицеливания из пистолета.
Вторая функция при каждом релизе клавиши блока (т.е. в момент, когда мы отпускаем ПКМ) проверяет слот 99, если он равен 1, т.е. было произведено прицеливание из пистолета, то проверяем наличие пистолета-щита, а если и это верно, то:
- запускаем анимацию выстрела
- выхватываем позицию кости левой кисти агента
- переводим ее в глобальные координаты
- играем звук выстрела
- добавляем дыма
- и, самое главное, спавним мизайл (т.е. пульку летящую) в позиции левой руки.
- выставляем прицеливание в 0.
Собственно, вторую процедуру по идее стоить перевесить не на релиз клавиши блока, а на окончание блока агентом - тогда будет работать и для неписей. Однако, несчастный ИИ все равно будут пытаться "блокировать" пистолетом и буде держать "прицеливание" до последнего, умирая с гордо поднятым пистолетом. Так что все равно это бесполезно, увы.
Чтобы все заработало последнее, что нам надо сделать - это прописать в каждой сцене в конце, после всех системных и модных триггеров такой текст:
lpistol_down,
lpistol_click,
Компилимся, заходим, покупаем пистолетик, идем стрелять и... ой! Персонаж "стреляет" мечом, а пулька вылетает из левой руки и уходит в землю. А почему? А потому что мы не поменяли анимацию выстрела. Подробно описать как это сделать сейчас не могу, сорри, за год с лишним все позабыл. Но в целом, план такой:
- найти аниму пистолетного прицеливания и аниму пистолетного выстрела
- выгрузить из
- отзеркалить в любом удобном редакторе (я, кажется, блендер юзал, но на 100% не поручусь)
- загрузить с тем же именем.
- если у вас в моде есть и обычные пистолеты, а не только "леворукие", то грузим с другим именем и прописываем новую аниму в module_animations и соответствующем хедере.
Эти скрипты вроде "скелета" можно их улучшать до нетпределасовершенству. Например анализировать агенский навык стрельбы и в соответствии с ним поворачивать позицию выстрела на рандомный небольшой угол. Можно проверять для выстрела не только наличие пистолета-щита но и наличие патронов к нему, а после выстрела уменьшать число патронов. Единственно в чем не уверен - это в возможности рисовать прицел и делать его актуальным вероятному отклонению выстрела. Тут лучше спросить мастеров, умеющих всякие менюшки, текстовые окна и прочие рисования на экране вызывать.
Надеюсь кому-то был полезен ^^