Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Тестер S.T.A.L.K.E.R.'а
GAMEINATOR forums > S.T.A.L.K.E.R. > Мастерская: создание модов для S.T.A.L.K.E.R.
NanoBot-AMK
Вот канал интересного ютубера.
https://www.youtube.com/channel/UCEfAA4DKipSAvCpz6kqea0g
Спидран, поиск багов в сталкере. Очень интересно, особенно программистам XRay, вроде меня.
Вот некоторые баги я устранил, но их там ещё много. Некоторые устранены в ЧН и ЗП.
А какие баги вы нашли и устранили в своих модифицированных движках XRay?
Так же, тут можно приводить код этих багов и код устраняющий их.
buildshunter
Это именно ОН пробежал сталкер тч за менее 10 минут
macron
Хексом для 1.0006 фиксил дальность/плавность проявления/исчезновения теней от динамических моделей на r1 и исчезновение тени гг вприсяди на r1.


@rem исправляем исчезновение тени в присяде (значение 194 -> 193) (при 192 двоится)
patch2.exe xrRender_R1.dll $00058743 $C1

@rem увеличиваем дальность проявления теней от динамических объектов (значение 0.02 -> 0)
patch2.exe xrRender_R1.dll $00058744 $00 $00 $00 $00


NanoBot-AMK

Баги с гранатомётами.
Основная ошибка, это - то, что это делал идиот. Шутка. Нет.
Класс гранатомётов отличается от родительских, тем, что при выстреле выстреливает гранату. Кэп.
Нам надо найти метод, где безусловно происходить выстрел. Это метод FireTrace, он должен быть виртуальным, в оригинале это не так, переделываем.
Файл Weapon.h
Код
void    virtual FireTrace(const Fvector& P, const Fvector& D);

Теперь мы должны переопределить этот метод в наших гранатомётах.
Например для РГ-6. Файл WeaponRG6.cpp
Код
void CWeaponRG6::FireTrace(const Fvector& P, const Fvector& D)
{
    LPCSTR    curr_ammo = m_magazine.back().m_ammoSect.c_str();
    if(pSettings->line_exist(curr_ammo, "fake_grenade_name"))
    {
        StartRocket(P, D, IsZoomed());
    }
    inheritedSG::FireTrace(P, D);
}

Да тут надо создать новый метод StartRocket в классе CRocketLauncher в этом файле.
RocketLauncher.cpp
Код
void            CRocketLauncher::StartRocket(const Fvector& P, const Fvector& D, bool is_aim)
{
    CExplosiveRocket*    pGrenade = smart_cast<CExplosiveRocket*>(getCurrentRocket());
    if (!pGrenade)
        return;
    Fvector p1, d;
    p1.set    (P);
    d.set    (D);
  
    Fmatrix launch_matrix;
    launch_matrix.identity();
    launch_matrix.k.set(d);
    Fvector::generate_orthonormal_basis(launch_matrix.k, launch_matrix.j, launch_matrix.i);
    launch_matrix.c.set(p1);
    CGameObject*    obj = smart_cast<CGameObject*>(this);

    CObject*    parent = obj->H_Parent();
    if (is_aim)    //
    {
        parent->setEnabled(FALSE);
        obj->setEnabled(FALSE);
    
        collide::rq_result RQ;
        BOOL HasPick = Level().ObjectSpace.RayPick(p1, d, 500.0f, collide::rqtBoth, RQ, obj);

        obj->setEnabled(TRUE);
        parent->setEnabled(TRUE);
        //метод RealGravity возвращает реальную гравитацию с учЄтом работы двигател¤ при определЄном условии.
        float    gravity = pGrenade->RealGravity();
        if (HasPick && gravity>0.f)
        {
            Fvector        Transference;
            Transference.mul(d, RQ.range);
            Fvector        res[2];                    
#ifdef DEBUG
            DBG_OpenCashedDraw();
            DBG_DrawLine(p1,Fvector().add(p1,d),D3DCOLOR_XRGB(255,0,0));
#endif
            u8 canfire0 = TransferenceAndThrowVelToThrowDir(Transference, m_fLaunchSpeed, gravity, res);
#ifdef DEBUG
            if(canfire0>0)DBG_DrawLine(p1,Fvector().add(p1,res[0]),D3DCOLOR_XRGB(0,255,0));
            if(canfire0>1)DBG_DrawLine(p1,Fvector().add(p1,res[1]),D3DCOLOR_XRGB(0,0,255));
            DBG_ClosedCashedDraw(30000);
#endif
            if (canfire0 != 0)
            {
//                    Msg ("d[%f,%f,%f] - res [%f,%f,%f]", d.x, d.y, d.z, res[0].x, res[0].y, res[0].z);
                d = res[0];
            };
        }
    };

    d.mul(m_fLaunchSpeed);
    LaunchRocket(launch_matrix, d, zero_vel);
    pGrenade->SetInitiator(parent->ID());

    if (OnServer())
    {
        NET_Packet P;
        obj->u_EventGen(P, GE_LAUNCH_ROCKET, obj->ID());
        P.w_u16(u16(pGrenade->ID()));
        obj->u_EventSend(P);
    }
    dropCurrentRocket();
}

А метод FireStart во обще удаляем из CWeaponRG6.
Так же переделаем метод AddCartridge
Код
u8 CWeaponRG6::AddCartridge        (u8 cnt)
{
    u8 t = inheritedSG::AddCartridge(cnt);
    u8 k = cnt-t;
    LPCSTR    ammo = m_ammoTypes[m_ammoType].c_str();
    if(pSettings->line_exist(ammo, "fake_grenade_name"))
    {
        LPCSTR    fake_grenade_name = pSettings->r_string(ammo, "fake_grenade_name");
        while(k){
            --k;
            inheritedRL::SpawnRocket(fake_grenade_name, this);
        }
    }
    else
        k = 0;
    return k;
}


Это надо чтобы РГ-6 мог стрелять картечью, при этом никакая ракета не вылетает.
Вот как то так. Так же надо переделать и доработать класс CWeaponMagazinedWGrenade и CWeaponRPG7, там тоже полно ошибок.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.