HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Half-Life SDK (https://hlfx.ru/forum/forumdisplay.php?forumid=8)
-- Подскажите пожалуйста как сделать эффект падения экрана как в ку2 (https://hlfx.ru/forum/showthread.php?threadid=4047)
Отправлено SteamPlay43 08-08-2013 в 19:34:
Подскажите пожалуйста как сделать эффект падения экрана как в ку2
Искал имеющиеся в pm_shared.c нечего не нашёл кроме звука падения со средней высоты.
Отправлено XaeroX 08-08-2013 в 20:12:
В ку2 эффект падения экрана такой же, как и везде: экран падает на пол и разбивается. После чего ты везёшь его в сервис или покупаешь новый экран.
__________________
Отправлено Cybermax 08-08-2013 в 20:41:
Видео с ютуба с примером для наглядности в студию.
[off]Что неужели ещё кто то делает мод ля q2
[/off]
Отправлено Ku2zoff 09-08-2013 в 02:43:
SteamPlay43 а поискать по словосочетанию PunchAxis не пробовал? В Паранойе это сделано, например. Да и в самой халфе тоже есть, только раскачивается камера не так как в кваке. Погляди исходники самой второкваки, там найдёшь нужное.
Отправлено SteamPlay43 09-08-2013 в 08:59:
Ku2zoff Спасибо, но я думал что PunchAxis только для v_модели применяется!
Добавлено 09-08-2013 в 15:57:
Ku2zoff В кваке на нашёл PM_Jump
Добавлено 09-08-2013 в 15:58:
Добавлено 09-08-2013 в 15:59:
Ku2zoff А в калфе это вроде функция punchangle
Отправлено Decay 09-08-2013 в 09:59:
SteamPlay43
p_view.c: ClientEndServerFrame():
C++ Source Code:
// detect hitting the floor |
// apply all the damage taken this frame |
p_view.c:
C++ Source Code:
5 | Handles color blends and view kicks |
8 | void P_DamageFeedback (edict_t *player) |
Отправлено SteamPlay43 09-08-2013 в 10:02:
DedoK Мне это в pm_shared вставить?
Отправлено Decay 09-08-2013 в 10:38:
SteamPlay43, ни в коем случае. Тебе какой именно эффект нужен? Только поворот камеры при падении?
Отправлено SteamPlay43 09-08-2013 в 11:12:
DedoK Когда спрыгиваешь со средней высоты или с большой когда наносит урон экран опускается вниз, мне только это надо. В халфе какой то незначительный эффект тряски экрана!
Добавлено 09-08-2013 в 18:12:
DedoK Да поворот камеры
Отправлено Ku2zoff 09-08-2013 в 12:07:
Цитата:
SteamPlay43 писал:
но я думал что PunchAxis только для v_модели применяется!
Она применяется для взгляда игрока.
Отправлено Decay 09-08-2013 в 12:15:
Не знаю, как решить это. Меняю индекс на 0, и камера поворачивается вниз по X только при небольших падениях. С Y и Z все работает.
pm_shared.c: PM_CheckFalling()
C++ Source Code:
pmove->punchangle[ 2 ] = pmove->flFallVelocity * 0.013; // punch z axis |
Отправлено SteamPlay43 09-08-2013 в 12:31:
DedoKВот это наверное с большой высоты
C++ Source Code:
if ( pmove->punchangle[ 0 ] > 8 ) |
pmove->punchangle[ 0 ] = 8; |
Отправлено Decay 09-08-2013 в 12:43:
SteamPlay43, ну да. 2 — это стандартное значение, а при 1 камера поворачивается вправо (это ось Y).
Скорее всего, где-то X обнуляется, или что...
Добавлено 09-08-2013 в 19:43:
SteamPlay43, это условие я убирал — то же самое.
Отправлено SteamPlay43 09-08-2013 в 13:00:
DedoK У меня получилось! Я это тоже убрал и поменял на 0.
Добавлено 09-08-2013 в 19:47:
DedoK Может быть вот это виновато?
C++ Source Code:
if ( pmove->onground != -1 ) |
pmove->flFallVelocity = 0; |
Добавлено 09-08-2013 в 19:58:
DedoK Нашёл вот это надо убрать:
#define PLAYER_FALL_PUNCH_THRESHHOLD (float)350 // won't punch player's screen/make scrape noise unless player falling at least this fast.
Добавлено 09-08-2013 в 20:00:
SteamPlay43 Заменить это в функции на что нибудь другое!
Отправлено fire64 09-08-2013 в 13:25:
гм, а зачем (float)350 ?
Почему не 350.0f ?
__________________
Вся сила лысого кощея,
Сокрыта в башне из костей
Воздвигнутой, под небесами
На месте похорон людей
Отправлено SteamPlay43 09-08-2013 в 13:34:
fire64 Такой уж сдк что сделать!
Отправлено Decay 11-08-2013 в 04:39:
Пока что вот так:
pm_shared.c:
C++ Source Code:
1 | vec_t punchX = 0; // HACK: rotate camera by X axis |
2 | void PM_CheckFalling(void) |
4 | if (pmove->onground != -1 && !pmove->dead && pmove->flFallVelocity >= PLAYER_FALL_PUNCH_THRESHHOLD) { |
7 | if (pmove->waterlevel > 0) { |
8 | } else if (pmove->flFallVelocity > PLAYER_MAX_SAFE_FALL_SPEED) { |
9 | pmove -> PM_PlaySound(CHAN_VOICE, "player/pl_fallpain3.wav", 1, ATTN_NORM, 0, PITCH_NORM); |
11 | } else if (pmove->flFallVelocity < PLAYER_MIN_BOUNCE_SPEED) { |
17 | // Play landing step right away |
18 | pmove->flTimeStepSound = 0; |
22 | // play step sound for current texture |
23 | PM_PlayStepSound(PM_MapTextureTypeStepType(pmove->chtexturetype), fvol); |
25 | // Knock the screen around a little bit, temporary effect |
26 | punchX = pmove->flFallVelocity * 0.013; |
29 | if(pmove->onground != -1) |
30 | pmove->flFallVelocity = 0; |
В функции PM_CheckParamters():
pm_shared.c: PM_CheckParamters():C++ Source Code:
1 | // Take angles from command. |
5 | pmove->punchangle[0] = punchX; |
6 | VectorCopy ( pmove->cmd.viewangles, v_angle ); |
7 | VectorAdd( v_angle, pmove->punchangle, v_angle ); |
11 | // Set up view angles. |
Отправлено SteamPlay43 12-08-2013 в 17:12:
DedoK Спасибо!
Отправлено SteamPlay43 22-10-2014 в 17:56:
Decay Теперь этот эффект применяется на всех игроков одновременно)
Отправлено Ku2zoff 22-10-2014 в 20:10:
Цитата:
SteamPlay43 писал:
Теперь этот эффект применяется на всех игроков одновременно)
То есть, когда падает один, камера качается у всех? Decay намудрил чего-то там, завёл ненужный вектор punchX, который задекларирован не внутри функции, а вне неё (соответственно он меняется ни в одном конкретном случае, для одного игрока, а когда любой игрок падает), вот тебе и для всех игроков эффект. Сделай в PM_CheckFalling вот так:
C++ Source Code:
2 | // Play landing step right away |
3 | pmove->flTimeStepSound = 0; |
7 | // play step sound for current texture |
8 | PM_PlayStepSound(PM_MapTextureTypeStepType(pmove->chtexturetype), fvol); |
10 | // Knock the screen around a little bit, temporary effect |
11 | [color=blue]pmove->punchangle[0] = pmove->flFallVelocity * 0.013;[/color]// теперь будет только для одного игрока |
И будет тебе счастье.
Я вам щас покажу, как я у себя сделал.
player.cpp, функция void CBasePlayer::PostThink(), там есть такой блок кода:
C++ Source Code:
1 | // check to see if player landed hard enough to make a sound |
2 | // falling farther than half of the maximum safe distance, but not as far a max safe distance will |
3 | // play a bootscrape sound, and no damage will be inflicted. Fallling a distance shorter than half |
4 | // of maximum safe distance will make no sound. Falling farther than max safe distance will play a |
5 | // fallpain sound, and damage will be inflicted based on how far the player fell |
7 | if ( (FBitSet(pev->flags, FL_ONGROUND)) && (pev->health > 0) && m_flFallVelocity >= PLAYER_FALL_PUNCH_THRESHHOLD ) |
9 | // ALERT ( at_console, "%f\n", m_flFallVelocity ); |
10 | [color=blue]float punch = (m_flFallVelocity > 700 ? 700 : m_flFallVelocity) * 0.02;[/color] |
12 | if (pev->watertype == CONTENT_WATER) |
14 | // Did he hit the world or a non-moving entity? |
15 | // BUG - this happens all the time in water, especially when |
16 | // BUG - water has current force |
17 | // if ( !pev->groundentity || VARS(pev->groundentity)->velocity.z == 0 ) |
18 | // EMIT_SOUND(ENT(pev), CHAN_BODY, "player/pl_wade1.wav", 1, ATTN_NORM); |
20 | else if ( m_flFallVelocity > PLAYER_MAX_SAFE_FALL_SPEED ) |
21 | {// after this point, we start doing damage |
23 | float flFallDamage = g_pGameRules->FlPlayerFallDamage( this ); |
25 | if ( flFallDamage > pev->health ) |
27 | // note: play on item channel because we play footstep landing on body channel |
28 | EMIT_SOUND(ENT(pev), CHAN_ITEM, "common/bodysplat.wav", 1, ATTN_NORM); |
31 | if ( flFallDamage > 0 ) |
33 | TakeDamage(VARS(eoNullEntity), VARS(eoNullEntity), flFallDamage, DMG_FALL ); |
34 | // pev->punchangle.x = 0; здесь я закомментировал |
36 | UTIL_ScreenShake(pev->origin, flFallDamage, flFallDamage * 0.5, flFallDamage * 0.03, 8.0); |
38 | punch += flFallDamage / 3; |
39 | pev->punchangle[0] += punch; |
40 | pev->punchangle[1] += RANDOM_FLOAT(-punch, punch); |
41 | pev->punchangle[2] = RANDOM_FLOAT(-punch, punch);[/color] |
44 | else if (m_flFallVelocity > PLAYER_MAX_SAFE_FALL_SPEED / 2) |
47 | pev->punchangle[0] += punch; |
48 | pev->punchangle[1] += RANDOM_FLOAT(punch / -10, punch / 10); |
49 | pev->punchangle[2] = RANDOM_FLOAT(punch / -10, punch / 10);[/color] |
54 | SetAnimation( PLAYER_WALK ); |
Добавлено 23-10-2014 в 03:10:
Синим выделено новое. Если игрок не получает повреждений, то экран качается на манер ку2 или паранойи. Если получает, то экран трясёт скриншейком. Если повреждения большие, то его ещё и перекашивает будь здоров по оси Z. Кое-что подглядел в Паранойе, остальное додумал сам.
З.Ы. код перекашивания камеры по оси Z из pm_shared.c (находится после комментария // Knock the screen around a little bit, temporary effect) можно убрать, чтобы не конфликтовал с кодом в player.cpp
Отправлено SteamPlay43 24-10-2014 в 14:39:
Ku2zoff Как у тебя всё сложно) Я на днях закомментиравал одну строку, и всё заработало со стандартным параметром pmove->punchangle [ 0 ] )
Надо в функции PreThink закомментировать
C++ Source Code:
Что огород городить? Было ведь понятно что обнуляется только по оси x.
Добавлено 24-10-2014 в 21:39:
Ku2zoff Но твоя версия тоже сделана неплохо.