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