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 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 Но твоя версия тоже сделана неплохо.