Вопрос Player collision bug

Пользователь
Статус
Оффлайн
Регистрация
22 Июн 2020
Сообщения
183
Реакции[?]
69
Поинты[?]
37K
Иногда (на сервере почти всегда) багается коллизия игрока, и TraceRay как будто его игнорирует, игра думает что игрок прозрачный, из-за этого подсаживаться нереально. Однако баг возникает в основном с противниками, на рейджбот это не влияет, но ломает зевсбот. Подозреваю что проблема в том что я что то не бекаплю в лагкомпе.
Пожалуйста, авторизуйтесь для просмотра ссылки.

LagComp.cpp (не полный):
LagRecord* CLagCompensation::BackupData(CBasePlayer* player) {
    LagRecord* record = new LagRecord;

    record->player = player;
    record->m_vecAbsOrigin = player->GetAbsOrigin();
    RecordDataIntoTrack(player, record);

    return record;
}

void CLagCompensation::RecordDataIntoTrack(CBasePlayer* player, LagRecord* record) {
    record->player = player;

    record->m_angEyeAngles = player->m_angEyeAngles();
    record->m_flSimulationTime = player->m_flSimulationTime();
    record->m_vecOrigin = player->m_vecOrigin();
    record->m_fFlags = player->m_fFlags();
    record->m_flCycle = player->m_flCycle();
    record->m_nSequence = player->m_nSequence();
    record->m_flDuckAmout = player->m_flDuckAmount();
    record->m_flDuckSpeed = player->m_flDuckSpeed();
    record->m_vecMaxs = player->GetCollideable()->OBBMaxs();
    record->m_vecMins = player->GetCollideable()->OBBMins();
    record->m_vecVelocity = player->m_vecVelocity();
    record->m_vecAbsAngles = player->GetAbsAngles();

    if (!record->bone_matrix_filled) {
        memcpy(record->bone_matrix, player->GetCachedBoneData().Base(), sizeof(matrix3x4_t) * player->GetCachedBoneData().Count());
        record->bone_matrix_filled = true;
    }

    if (player->GetActiveWeapon())
        if (player->GetActiveWeapon()->m_fLastShotTime() <= player->m_flSimulationTime())
            if (player->GetActiveWeapon()->m_fLastShotTime() > player->m_flOldSimulationTime())
                record->shooting = true;

    memcpy(record->animlayers, player->GetAnimlayers(), sizeof(AnimationLayer) * 13);
}

void CLagCompensation::BacktrackEntity(LagRecord* record, bool copy_matrix, bool use_aim_matrix) {
    CBasePlayer* player = record->player;

    player->m_flSimulationTime() = record->m_flSimulationTime;
    player->m_vecOrigin() = record->m_vecOrigin;
    player->SetAbsOrigin(record->m_vecAbsOrigin);
    player->m_fFlags() = record->m_fFlags;
    player->m_flCycle() = record->m_flCycle;
    player->m_nSequence() = record->m_nSequence;
    player->m_flDuckAmount() = record->m_flDuckAmout;
    player->m_flDuckSpeed() = record->m_flDuckSpeed;
    player->m_vecVelocity() = record->m_vecVelocity;
    player->SetAbsAngles(record->m_vecAbsAngles);
    player->ForceBoneCache();

    player->SetCollisionBounds(record->m_vecMins, record->m_vecMaxs);

    if (copy_matrix) {
        if (use_aim_matrix) {
            memcpy(player->GetCachedBoneData().Base(), record->clamped_matrix, player->GetCachedBoneData().Count() * sizeof(matrix3x4_t));
        }
        else {
            memcpy(player->GetCachedBoneData().Base(), record->bone_matrix, player->GetCachedBoneData().Count() * sizeof(matrix3x4_t));
        }
    }
}
Подскажите пожалуйста в чем может быть проблема, возможно кто то сталкивался с такой.
 
get good get legendware
Участник
Статус
Оффлайн
Регистрация
22 Сен 2020
Сообщения
435
Реакции[?]
200
Поинты[?]
47K
you should call UpdateColisionBounds before setting mins and maxs
also show your SetColisionBounds

C++:
void player_t::SetCollisionBounds(const Vector& OBBMins, const Vector& OBBMaxs)
{
    const auto Collideable = GetCollideable();
    if (!Collideable)
        return;


    auto& flCollisionChangeOrigin = *reinterpret_cast<float*>(
        reinterpret_cast<std::uintptr_t>(this) + 0x9920
        );

    auto& flCollisionChangeTime = *reinterpret_cast<float*>(
        reinterpret_cast<std::uintptr_t>(this) + 0x9924
        );

    auto borigin = flCollisionChangeOrigin;
    auto btime = flCollisionChangeTime;

    flCollisionChangeOrigin = *reinterpret_cast<float*>(this + 0x4B) + Collideable->OBBMaxs().z;
    flCollisionChangeTime = m_globals()->m_curtime;

    static const auto nSetCollisionBounds = reinterpret_cast<void(__thiscall*)(ICollideable*, const Vector&, const Vector&)>(util::FindSignature(crypt_str("client.dll"),
        crypt_str("53 8B DC 83 EC 08 83 E4 F8 83 C4 04 55 8B 6B 04 89 6C 24 04 8B EC 83 EC 18 56 57 8B 7B 08 8B D1 8B 4B 0C")));

    nSetCollisionBounds(Collideable, OBBMins , OBBMaxs);

    flCollisionChangeOrigin = borigin;
    flCollisionChangeTime = btime;
}

void player_t::UpdateCollisionBounds()
{

    typedef void(__thiscall* oUpdateCollisionBounds)(PVOID);
    return call_virtual< oUpdateCollisionBounds >(this, 340)(this);
}
 
Пользователь
Статус
Оффлайн
Регистрация
22 Июн 2020
Сообщения
183
Реакции[?]
69
Поинты[?]
37K
you should call UpdateColisionBounds before setting mins and maxs
also show your SetColisionBounds

C++:
void player_t::SetCollisionBounds(const Vector& OBBMins, const Vector& OBBMaxs)
{
    const auto Collideable = GetCollideable();
    if (!Collideable)
        return;


    auto& flCollisionChangeOrigin = *reinterpret_cast<float*>(
        reinterpret_cast<std::uintptr_t>(this) + 0x9920
        );

    auto& flCollisionChangeTime = *reinterpret_cast<float*>(
        reinterpret_cast<std::uintptr_t>(this) + 0x9924
        );

    auto borigin = flCollisionChangeOrigin;
    auto btime = flCollisionChangeTime;

    flCollisionChangeOrigin = *reinterpret_cast<float*>(this + 0x4B) + Collideable->OBBMaxs().z;
    flCollisionChangeTime = m_globals()->m_curtime;

    static const auto nSetCollisionBounds = reinterpret_cast<void(__thiscall*)(ICollideable*, const Vector&, const Vector&)>(util::FindSignature(crypt_str("client.dll"),
        crypt_str("53 8B DC 83 EC 08 83 E4 F8 83 C4 04 55 8B 6B 04 89 6C 24 04 8B EC 83 EC 18 56 57 8B 7B 08 8B D1 8B 4B 0C")));

    nSetCollisionBounds(Collideable, OBBMins , OBBMaxs);

    flCollisionChangeOrigin = borigin;
    flCollisionChangeTime = btime;
}

void player_t::UpdateCollisionBounds()
{

    typedef void(__thiscall* oUpdateCollisionBounds)(PVOID);
    return call_virtual< oUpdateCollisionBounds >(this, 340)(this);
}
SetCollisionBounds:
void CBaseEntity::SetCollisionBounds(Vector mins, Vector maxs) {
         static auto setCollisionBounds = reinterpret_cast<void(__thiscall*)(ICollideable*, const Vector&, const Vector&)>(Utils::PatternScan("client.dll", "53 8B DC 83 EC 08 83 E4 F8 83 C4 04 55 8B 6B 04 89 6C 24 04 8B EC 83 EC 18 56 57 8B 7B"));

         auto collidable = GetCollideable();

         if (!collidable)
                 return;

         setCollisionBounds(collidable, mins, maxs);
}
This function works normally in local animfix, but I will try your code
 
Участник
Статус
Оффлайн
Регистрация
19 Апр 2020
Сообщения
1,169
Реакции[?]
313
Поинты[?]
151K
record->m_vecMaxs = player->GetCollideable()->OBBMaxs(); record->m_vecMins = player->GetCollideable()->OBBMins();
у тебя в твоем старом коде был правильный парт, не вижу смысла гетать через колизион и фиксить его когда он идеально ворк
record->m_vecMaxs = player->GetCollideable()->OBBMaxs(); record->m_vecMins = player->GetCollideable()->OBBMins();
перед сетапом нужно же обновлять колюжин бонс ?
 
Сверху Снизу