HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Half-Life SDK (https://hlfx.ru/forum/forumdisplay.php?forumid=8)
-- Оглушение монстров (https://hlfx.ru/forum/showthread.php?threadid=4687)
Отправлено Engineer 11-11-2015 в 22:14:
Оглушение монстров
При атаке игроком монстра, он некоторое время бездействует, как-бы оглушен.
Если монстр начинает атаковать игрока и игрок в это время атакует монстра, то он (монстр) прекратит атаку и будет бездействовать.
Помогите найти код, где это можно посмотреть и отключить. С HLSDK дружу не сильно, поэтому возникли трудности.
Отправлено ~ X ~ 11-11-2015 в 22:58:
Всё, что сейчас вспонилось: анимации flinch проигрываются при появлении кондишенов bits_COND_*_DAMAGE. Копай в том направлении. Еще где-то должно выставляться время m_flNextAttack.
__________________
Минутка полезного:
Бесплатный UT-подобный Half-Life mod.
Бесплатный редактор для 32-битных текстур. Без дотнета.
Бесплатный IDE для любых компиляторов и ЯП.
Бесплатная Windows-подобная ОС.
Проверка грамматики русского языка.
Чат по hl[fx]: [email protected]
Отправлено Engineer 12-11-2015 в 10:59:
Покопался в коде, нашел следующее:
monsterstate.cpp:
C++ Source Code:
1 | else if ( iConditions & bits_COND_LIGHT_DAMAGE ) |
3 | MakeIdealYaw ( m_vecEnemyLKP ); |
4 | m_IdealMonsterState = MONSTERSTATE_ALERT; |
6 | else if ( iConditions & bits_COND_HEAVY_DAMAGE ) |
8 | MakeIdealYaw ( m_vecEnemyLKP ); |
9 | m_IdealMonsterState = MONSTERSTATE_ALERT; |
shedule.cpp
C++ Source Code:
1 | if ( HasConditions(bits_COND_LIGHT_DAMAGE | bits_COND_HEAVY_DAMAGE) ) |
3 | if ( fabs( FlYawDiff() ) < (1.0 - m_flFieldOfView) * 60 ) // roughly in the correct direction |
5 | return GetScheduleOfType( SCHED_TAKE_COVER_FROM_ORIGIN ); |
9 | return GetScheduleOfType( SCHED_ALERT_SMALL_FLINCH ); |
Попробовал закомментить, чтобы проверить будут ли монстры продолжать атаку. Атаковать не прекращают.
Что-то мне подсказывает, что нужно копать в сторону defaultai.cpp и переменных Schedule_t
Отправлено XaeroX 12-11-2015 в 11:34:
AI_BaseNPC_Schedule.cpp, 1434-1437 - закомментируй эти строки.
C++ Source Code:
else if (HasConditions(bits_COND_LIGHT_DAMAGE) && !HasMemory( bits_MEMORY_FLINCHED) ) |
return GetScheduleOfType( SCHED_SMALL_FLINCH ); |
Отправлено Engineer 12-11-2015 в 11:46:
Нужно было в переменных Schedule_t убирать биты bits_COND_LIGHT_DAMAGE и bits_COND_HEAVY_DAMAGE
На примере монстра houndeye нужно было поменять следующее в коде:
C++ Source Code:
1 | Schedule_t slHoundRangeAttack[] = |
5 | ARRAYSIZE ( tlHoundYell1 ), |
6 | [COLOR=red]bits_COND_LIGHT_DAMAGE | |
7 | bits_COND_HEAVY_DAMAGE,[/COLOR] |
13 | ARRAYSIZE ( tlHoundYell2 ), |
14 | [COLOR=red]bits_COND_LIGHT_DAMAGE | |
15 | bits_COND_HEAVY_DAMAGE,[/COLOR] |
Меняем на:
C++ Source Code:
1 | Schedule_t slHoundRangeAttack[] = |
5 | ARRAYSIZE ( tlHoundYell1 ), |
6 | [COLOR=green]bits_COND_ENEMY_DEAD,[/COLOR] |
12 | ARRAYSIZE ( tlHoundYell2 ), |
13 | [COLOR=green]bits_COND_ENEMY_DEAD,[/COLOR] |
Отправлено XaeroX 12-11-2015 в 11:58:
Да, флаги прерываний тоже имеет смысл поправить.
Отправлено Engineer 12-11-2015 в 11:59:
Цитата:
XaeroX писал:
AI_BaseNPC_Schedule.cpp, 1434-1437 - закомментируй эти строки.
C++ Source Code:
2 | else if (HasConditions(bits_COND_LIGHT_DAMAGE) && !HasMemory( bits_MEMORY_FLINCHED) ) |
4 | ____return GetScheduleOfType( SCHED_SMALL_FLINCH ); |
Этот вариант не работает
Без фрагов прерываний.
Отправлено XaeroX 12-11-2015 в 12:28:
Смотря что ты понимаешь под "работой".
Атаку монстр будет прерывать, факт. Но тратить время на дёрганье уже не будет.
Отправлено Engineer 12-11-2015 в 13:01:
Цитата:
XaeroX писал:
Смотря что ты понимаешь под "работой".
Атаку монстр будет прерывать, факт. Но тратить время на дёрганье уже не будет.
Да, виноват. Под "работой" я имел ввиду описанное мной в первом посте, т.е. прерывание атаки.
Атака останавливается - не работает.
Атака не останавливается - работает.
Отправлено XaeroX 12-11-2015 в 13:05:
Цитата:
Engineer писал:
он некоторое время бездействует, как-бы оглушен
Ну я вот про это подумал.