Никто не знает, как изменить время взаимодействия с объектами (лечение, оживление, открытие дверей, заправка бензином)? По идее это возможно раз есть адреналин, который именно это и делает.
Менять квары не вариант, так как нужно для каждого персонажа отдельно, да и не всё можно кварами отловить.

Изменение времени интерактивных взаимодействий
#1
Отправлено 03 Май 2021 - 19:56
- Elllymn это нравится
#2
Отправлено 03 Май 2021 - 21:25
Попробуй найти нужные значения и пропы через tEntDev, начинаешь лечить, sm_ted_selectself, забираешь дамп kvtest.txt, потом ближе к окончанию лечения - sm_ted_selectself, сравниваешь два дампа.
Для L4D2 на большинство таких действий, вероятно влияет:
SetEntPropFloat(target_save, Prop_Send, "m_flProgressBarDuration", 0.0);
Попробуй подставить разные значения после начала лечения.
Я бы еще сравнил дельту, когда изменяется значение квара, прямо влияющего на это, т.е. first_aid_kit_use_duration (до, и после ее изменения).
#3
Отправлено 04 Май 2021 - 3:14
Попробовал. Глухо.
Связка пропов m_flProgressBarStartTime и m_flProgressBarDuration влияет только на визуальное отображение шкалы. Не более. Такое чувство, что на этот случай есть энтити или эдикт. Изменения других пропов никак не связаны со временем взаимодействия. Анимации, usetarget'ы, позиция камеры... Ничего интересного
Сообщение отредактировал PawnLomaster: 04 Май 2021 - 3:22
#4
Отправлено 10 Май 2021 - 11:25
Вот так можно
Сообщение отредактировал BHaType: 11 Май 2021 - 1:50
- dragokas и PawnLomaster это нравится
#5
Отправлено 27 Сентябрь 2021 - 21:23
Прошло много времени, но...
Вот так можно
Это действительно работает. Супер! Но есть один нюанс. Чтобы изменять время, нужно знать кто и над кем выполняет действие.
В теории узнать, кто выполняет действие, не трудно. Достаточно узнать владельца. А вот узнать над кем выполняют уже так не получится. Действие ещё не началось, и определить через пропы не выйдет.
Я попытался покопаться глубже. Нашёл следующее
CCFirstAidKit::OnStartAction(CBaseBackpackItem::BackpackItemActionType,CTerrorPlayer *,CBaseEntity *,float) int __cdecl CFirstAidKit::OnStartAction(int a1, int a2, CBaseEntity *a3, int a4)
Захукал эту функцию
Но, как оказалось, эта функция уже как постфактум действия и мало на что влияет. хотя и содержит всю нужную инфу.
Если использовать только GetActionDuration, то того, кого лечат, придётся hull трейсами вычислять. А это ненадёжно.
Сообщение отредактировал PawnLomaster: 28 Сентябрь 2021 - 4:10
#6
Отправлено 28 Сентябрь 2021 - 0:40
Прошло много времени, но...
Это действительно работает. Супер! Но есть один нюанс. Чтобы изменять время, нужно знать кто и над кем выполняет действие.
В теории узнать, кто выполняет действие, не трудно. Достаточно узнать владельца. А вот узнать над кем выполняют уже так не получится. Действие ещё не началось, и определить через пропы не выйдет.
Я попытался покопаться глубже. Нашёл следующее
CCFirstAidKit::OnStartAction(CBaseBackpackItem::BackpackItemActionType,CTerrorPlayer *,CBaseEntity *,float) int __cdecl CFirstAidKit::OnStartAction(int a1, int a2, CBaseEntity *a3, int a4)Захукал эту функцию
Скрытый текст
Но, как оказалось, эта функция уже как постфактум действия и мало на что влияет. хотя и содержит всю нужную инфу.
Если использовать только GetActionDuration, то того, кого лечат, придётся hull трейсами вычислять. А это ненадёжно.
А если так:
- public MRESReturn GetActionDuration (int entity, DHookReturn retn)
- {
- static char name[36];
- GetEntityNetClass(entity, name, sizeof name);
- float newretn = GetRandomFloat(0.5, 5.0);
- int HealTarget = GetEntProp(id-хилера, Prop_Send, "m_healTarget");
- PrintToServer("GetActionDuration(%s) newretn %f", name, newretn);
- retn.Value = newretn;
- return MRES_ChangedOverride;
- }
Сообщение отредактировал 8rutu5: 28 Сентябрь 2021 - 0:41
#7
Отправлено 28 Сентябрь 2021 - 4:02
А если так:
- int HealTarget = GetEntProp(id-хилера, Prop_Send, "m_healTarget");
Этот проп есть только в первой части L4D. Во второй его заменили на UseTartget'ы. Заранее скажу, что m_useActionTarget выдаст -1, тк на момент нука действие ещё не началось. В следующем фрейме этот проп уже инициализируется и примет значение экземпляра класса игрока, которого лечат. Но поезд уже уйдёт.
Сообщение отредактировал PawnLomaster: 28 Сентябрь 2021 - 4:12
#8
Отправлено 28 Сентябрь 2021 - 5:43
Игра для выбора цели почти везде использует FindUseEntity, данный случай не исключение, так что можно даже не добавлять проверки на валидность игрока, если использовать аргументы что и в оригинале.
public MRESReturn GetActionDuration (int entity, DHookReturn retn) { int client = GetEntPropEnt(entity, Prop_Send, "m_hOwner"); PrintToServer("Healer (%N) Target (%N)", client, GetUseTarget(client)); return MRES_Ignored; } int GetUseTarget (int client, float use_radius = 96.0 /* default of player_use_radius */, float use_tolerance = 0.98 /* default of z_use_belt_item_tolerance */) { return SDKCall(g_hUseEntity, client, use_radius, 0.0, use_tolerance, 0, 1); }
- PawnLomaster это нравится
#9
Отправлено 29 Сентябрь 2021 - 19:29
Логично было догадаться, что увеличение времени взаимодействия поломает анимации. Есть ли возможность замедлить анимацию игрока или воспроизвести её повторно?
#10
Отправлено 29 Сентябрь 2021 - 19:36
Логично было догадаться, что увеличение времени взаимодействия поломает анимации. Есть ли возможность замедлить анимацию игрока или воспроизвести её повторно?
Честно скажу, сам еще не делал такого, тоже была мысль в голове, но если стоит left4dhooks, то попробуй так:
L4D2Direct_DoAnimationEvent(client, ACT_TERROR_HEAL_FRIEND);
Набор всех анимаций, связанных с лечением/подъемом: Текстовое название Event ID (int) "ACT_TERROR_HEAL_SELF" "544" "ACT_TERROR_HEAL_FRIEND" "545" "ACT_TERROR_HEAL_INCAPACITATED" "546"
Сообщение отредактировал 8rutu5: 29 Сентябрь 2021 - 19:39
- PawnLomaster это нравится
#11
Отправлено 29 Сентябрь 2021 - 20:06
Честно скажу, сам еще не делал такого, тоже была мысль в голове, но если стоит left4dhooks, то попробуй так:
L4D2Direct_DoAnimationEvent(client, ACT_TERROR_HEAL_FRIEND);Набор всех анимаций, связанных с лечением/подъемом: Текстовое название Event ID (int) "ACT_TERROR_HEAL_SELF" "544" "ACT_TERROR_HEAL_FRIEND" "545" "ACT_TERROR_HEAL_INCAPACITATED" "546"
Пробовал. Глухо. Ничего не происходит. С этими значениями не работает.
А вот эти подошли
Сообщение отредактировал PawnLomaster: 29 Сентябрь 2021 - 20:06
#12
Отправлено 29 Сентябрь 2021 - 20:14
Пробовал. Глухо. Ничего не происходит. С этими значениями не работает.
А вот эти подошли
42 = ACT_TERROR_HEAL_SELF43 = ACT_TERROR_HEAL_FRIEND44 = ACT_TERROR_HEAL_INCAPACITATED
У меня л4дхукс самый последний почти стоит, может там что-то поменялось. Я оттуда брал
#13
Отправлено 16 Май 2023 - 23:12
В общем вернулся к этой теме, но так и не получилось изменить скорость анимации. Многие в своих плагинах юзают m_flPlaybackRate. Но мне что-то не помогает. Какое значение не ставь - скорость анимации одинаковая. Есть идеи?
Сообщение отредактировал 8rutu5: 17 Май 2023 - 0:01
Количество пользователей, читающих эту тему: 0
0 пользователей, 0 гостей, 0 анонимных