дело тут не только в фпс.
Во первых чем ниже фпс, тем больше фрейм-тайм, и как следствие - тем большее расстояние проходит игрок за 1 кадр.
Во вторых, как я уже говорил дамага при падении об землю вычисляется из времени, проведенного в воздухе, а вовсе не исходя из высоты, с которой упал игрок. Именно благодаря этому и возможны всякие трюки.
Опять же есть зона безопасности - время за которое игрок упадёт без дамаги. Ну с этим все сталкивались - прыгаешь вниз стоя или в прыжке - получаешь дамагу. Прыгаешь вниз в полуприсяде - дамагу не получаешь.
Хотя казалось бы какая разница? А разница как раз в том, что прыгая из положения сидя, ты уменьшаешь дистанцию падения. Немного - на 16 юнитов, но вполне достаточно, чтобы не преодолеть некий порог, после которого наносится дамага.
Дядя Миша писал: Во вторых, как я уже говорил дамага при падении об землю вычисляется из времени, проведенного в воздухе, а вовсе не исходя из высоты, с которой упал игрок.
Всю жизнь наивно полагал, что вычисляется она из m_flFallVelocity, а тут прям какой-то срыв покровов
См. CBasePlayer::PostThink, CHalfLifeRules::FlPlayerFallDamage
Или ты хочешь сказать, что в PM-коде баг и велосити нарастает, если игрок застрял?
XaeroX писал: Всю жизнь наивно полагал, что вычисляется она из m_flFallVelocity, а тут прям какой-то срыв покровов
хыхыхыхыхыхыххыхыххы. А fallvelocity по твоему как считается? От времени проведенного в воздухе. Чем больше времени в воздухе провёл - тем она выше. На первый взгляд это правильно, игрок падает на землю с возрастающей скоростью, но! Существуют случаи, когда игрок чотко застревает между двумя брашами, которые сходятся под определенным углом. Там где-то интересный баг в PM_FlyMove, благодаря которому считается что игрок по прежнему летит вниз, хотя на самом деле он висит между двумя брашами, зажав кнопку "вперед". Баг воспроизводим и на ксаше и в халфе.
Цитата:
XaeroX писал: и велосити нарастает, если игрок застрял?
не застрял, говорю же! Есть случаи, когда можно висеть в воздухе, зажав кнопку "вперед". Причём висеть неограниченно долго.
Дядя Миша, а про Edge Bug так же раскидать сможешь? Когда с любой высоты (даже очень огромной) можно приземлиться уголком игрока на край плоскости (едва коснуться) и не потерять ни HP.
qpAHToMAS скорее всего pmove->onground раньше обнуляет flFallVelocity чем она успевает причинить игроку повреждения. Ты краешком коснулся тебе назначили землю и ускорение обнулилось.
Что-то такое, но я толком не разбирался.
Таких забавных багов в первой халфе предостаточно, но их никто не правит, потому что они дают охрененные преимсущества тем, кто их освоил.
Дядя Миша писал: А fallvelocity по твоему как считается?
-pev->velocity.z
Цитата:
Дядя Миша писал: Там где-то интересный баг в PM_FlyMove, благодаря которому считается что игрок по прежнему летит вниз, хотя на самом деле он висит между двумя брашами, зажав кнопку "вперед".
Я с халфовским пмувом не особо знаком, но логично предположить, что есть wishvel, которая увеличивается перед Pmovesingle, и есть реальная скорость, которая присваивается после колоизации и клипвелосити по бампплейнам.
Дядя Миша если повреждения считаются по времени проведенному в воздухе, то как можно в опфоре подпрыгнуть на батуте на огромную высоту и не потерять хп?
Government-Man писал: Дядя Миша дык... получается что повреждение рассчитывается по дистанции которую пролетел игрок вниз по оси Z - ну это совсем другое дело...
он же написал что по времени в воздухе а не по z
как я понял, что дальше мы получаем fallvelocity а потом уже расчитываем дамадж там по mp_falldamage и величины fallvelocity
marikcool а с какого момента начинает считаться это время? С момента отрыва ног от земли или же с того момента когда вертикальная скорость стала отрицательной?
Government-Man писал: marikcool а с какого момента начинает считаться это время? С момента отрыва ног от земли или же с того момента когда вертикальная скорость стала отрицательной?
получается с момента как он оторвался от земли.
в претхинке
C++ Source Code:
1
if ( !FBitSet ( pev->flags, FL_ONGROUND ) )
2
{
3
m_flFallVelocity = -pev->velocity.z;
4
}
в постхинке
C++ Source Code:
1
if (FBitSet(pev->flags, FL_ONGROUND))
2
{
3
//..
4
m_flFallVelocity = 0;
5
}
само выставление флага FL_ONGROUND я чето ненашол, походу сам движок его выставляет я хз,
я искал конструкцию типо как тут, у класса игрока и у тех классов у кого он наследуется.
C++ Source Code:
1
void CFlockingFlyer :: FallHack( void )
2
{
3
if ( pev->flags & FL_ONGROUND )
4
{
5
if ( !FClassnameIs ( pev->groundentity, "worldspawn" ) )
6
{
7
pev->flags &= ~FL_ONGROUND;
8
...
интересно бы разобрать полную цепочку от получения новых координат от клиента, валидации данных, предикт игрока, обновления данных в логике игры.