Перейти к содержимому


Фотография

Изменение времени интерактивных взаимодействий


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 12

#1 PawnLomaster

PawnLomaster

    Участник

  • Пользователь
  • PipPip
  • 116 сообщений

Отправлено 03 Май 2021 - 19:56

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

Менять квары не вариант, так как нужно для каждого персонажа отдельно, да и не всё можно кварами отловить.


  • Elllymn это нравится

#2 dragokas

dragokas

    Постоянный пользователь

  • Пользователь
  • PipPipPipPipPip
  • 792 сообщений

Отправлено 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 PawnLomaster

PawnLomaster

    Участник

  • Пользователь
  • PipPip
  • 116 сообщений

Отправлено 04 Май 2021 - 3:14

Попробовал. Глухо.

Связка пропов m_flProgressBarStartTime и m_flProgressBarDuration влияет только на визуальное отображение шкалы. Не более. Такое чувство, что на этот случай есть энтити или эдикт. Изменения других пропов никак не связаны со временем взаимодействия. Анимации, usetarget'ы, позиция камеры... Ничего интересного


Сообщение отредактировал PawnLomaster: 04 Май 2021 - 3:22


#4 BHaType

BHaType

    Пользователь

  • Пользователь
  • PipPipPip
  • 358 сообщений

Отправлено 10 Май 2021 - 11:25

Вот так можно

 

Скрытый текст

Сообщение отредактировал BHaType: 11 Май 2021 - 1:50

  • dragokas и PawnLomaster это нравится

#5 PawnLomaster

PawnLomaster

    Участник

  • Пользователь
  • PipPip
  • 116 сообщений

Отправлено 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 8rutu5

8rutu5

    Пользователь

  • Пользователь
  • PipPipPip
  • 397 сообщений

Отправлено 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 трейсами вычислять. А это ненадёжно.

 

А если так:

 

  1. public MRESReturn GetActionDuration (int entity, DHookReturn retn)
  2. {
  3. static char name[36];
  4. GetEntityNetClass(entity, name, sizeof name);
  5.  
  6. float newretn = GetRandomFloat(0.5, 5.0);
  7. int HealTarget = GetEntProp(id-хилера, Prop_Send, "m_healTarget");
  8. PrintToServer("GetActionDuration(%s) newretn %f", name, newretn);
  9. retn.Value = newretn;
  10. return MRES_ChangedOverride;
  11. }

Сообщение отредактировал 8rutu5: 28 Сентябрь 2021 - 0:41


#7 PawnLomaster

PawnLomaster

    Участник

  • Пользователь
  • PipPip
  • 116 сообщений

Отправлено 28 Сентябрь 2021 - 4:02

 

А если так:

 

  1. int HealTarget = GetEntProp(id-хилера, Prop_Send, "m_healTarget");

Этот проп есть только в первой части L4D. Во второй его заменили на UseTartget'ы. Заранее скажу, что m_useActionTarget выдаст -1, тк на момент нука действие ещё не началось. В следующем фрейме этот проп уже инициализируется и примет значение экземпляра класса игрока, которого лечат. Но поезд уже уйдёт.


Сообщение отредактировал PawnLomaster: 28 Сентябрь 2021 - 4:12


#8 BHaType

BHaType

    Пользователь

  • Пользователь
  • PipPipPip
  • 358 сообщений

Отправлено 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 PawnLomaster

PawnLomaster

    Участник

  • Пользователь
  • PipPip
  • 116 сообщений

Отправлено 29 Сентябрь 2021 - 19:29

Логично было догадаться, что увеличение времени взаимодействия поломает анимации. Есть ли возможность замедлить анимацию игрока или воспроизвести её повторно?



#10 8rutu5

8rutu5

    Пользователь

  • Пользователь
  • PipPipPip
  • 397 сообщений

Отправлено 29 Сентябрь 2021 - 19:36

Логично было догадаться, что увеличение времени взаимодействия поломает анимации. Есть ли возможность замедлить анимацию игрока или воспроизвести её повторно?

Честно скажу, сам еще не делал такого, тоже была мысль в голове, но если стоит left4dhooks, то попробуй так:

L4D2Direct_DoAnimationEvent(clientACT_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 PawnLomaster

PawnLomaster

    Участник

  • Пользователь
  • PipPip
  • 116 сообщений

Отправлено 29 Сентябрь 2021 - 20:06

 

Честно скажу, сам еще не делал такого, тоже была мысль в голове, но если стоит left4dhooks, то попробуй так:

L4D2Direct_DoAnimationEvent(clientACT_TERROR_HEAL_FRIEND);

Набор всех анимаций, связанных с лечением/подъемом:

Текстовое название              Event ID (int)
"ACT_TERROR_HEAL_SELF"          "544"
"ACT_TERROR_HEAL_FRIEND"        "545"
"ACT_TERROR_HEAL_INCAPACITATED" "546"

Пробовал. Глухо. Ничего не происходит. С этими значениями не работает.

 

А вот эти подошли

42 = ACT_TERROR_HEAL_SELF
43 = ACT_TERROR_HEAL_FRIEND
44 = ACT_TERROR_HEAL_INCAPACITATED

Сообщение отредактировал PawnLomaster: 29 Сентябрь 2021 - 20:06


#12 8rutu5

8rutu5

    Пользователь

  • Пользователь
  • PipPipPip
  • 397 сообщений

Отправлено 29 Сентябрь 2021 - 20:14

 

Пробовал. Глухо. Ничего не происходит. С этими значениями не работает.

 

А вот эти подошли

42 = ACT_TERROR_HEAL_SELF
43 = ACT_TERROR_HEAL_FRIEND
44 = ACT_TERROR_HEAL_INCAPACITATED

 

 

У меня л4дхукс самый последний почти стоит, может там что-то поменялось. Я оттуда брал



#13 8rutu5

8rutu5

    Пользователь

  • Пользователь
  • PipPipPip
  • 397 сообщений

Отправлено 16 Май 2023 - 23:12

В общем вернулся к этой теме, но так и не получилось изменить скорость анимации. Многие в своих плагинах юзают m_flPlaybackRate. Но мне что-то не помогает. Какое значение не ставь - скорость анимации одинаковая. Есть идеи?


Сообщение отредактировал 8rutu5: 17 Май 2023 - 0:01



Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных