Перейти в начало страницы

Здравствуйте, гость ( Авторизация | Регистрация )

Gameru.net останавливает работу в связи с вторжением армии РФ в Украину. Следите за дальнейшими анонсами.
Support Gameru!

> Помощь по разделу

Сайт S.T.A.L.K.E.R. Inside / [ЗП] Параметры командной строки / Распаковщик ресурсов

14 страниц V  « < 8 9 10 11 12 > »   
Ответить в данную темуНачать новую тему
> Предложения по правкам движка, Ваши предложения
Borovos
сообщение 29.09.2014, 19:34
Сообщение #181


Опытный Игрок
****

Репутация:   6  
Группа: Участник
Сообщений: 51
Награды: 2
Регистрация: 03.05.2014




Вставить ник Цитировать выделенное в форуму быстрого ответа


Thanks for your reply. I hope you will release your work in near future.

As I'm a level designer, i can only propose ideas to improve SDK and the game.
Another life is needed to learn C language and become a programmer.


--------------------
Перейти в начало страницы
 
Borovos
сообщение 01.10.2014, 20:08
Сообщение #182


Опытный Игрок
****

Репутация:   6  
Группа: Участник
Сообщений: 51
Награды: 2
Регистрация: 03.05.2014




Вставить ник Цитировать выделенное в форуму быстрого ответа


Please, can you tell me what files compare?
A friend check xrSound but he only see minor differences and nothing about sound_occ.

Thk

Сообщение отредактировал Borovos - 01.10.2014, 20:09


--------------------
Перейти в начало страницы
 
Borovos
сообщение 22.10.2014, 22:33
Сообщение #183


Опытный Игрок
****

Репутация:   6  
Группа: Участник
Сообщений: 51
Награды: 2
Регистрация: 03.05.2014




Вставить ник Цитировать выделенное в форуму быстрого ответа


Hello guys,

Another idea about change in Xray engines (SoC, CS, CoP).

This is a small variation of brightness when player go to exterior or go in a building. As adaptation of vision in function of luminosity.

To be more clear, something like this but for interior environment and dark spaces:
http://tof.canardpc.com/view/ce12ade4-6810...5c0b66272e5.jpg

Regards

Сообщение отредактировал Borovos - 22.10.2014, 22:34


--------------------
Перейти в начало страницы
 
K.D.
сообщение 23.10.2014, 23:04
Сообщение #184


Почти Мастер
***********

Репутация:   311  
Группа: Участник
Сообщений: 1092
Награды: 5
Регистрация: 01.03.2011




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(Borovos @ 22.10.2014, 23:28) *
As adaptation of vision in function of luminosity.

This is called "HDR" and surely it presents in stalker. See r2_tonemap.

Сообщение отредактировал K.D. - 23.10.2014, 23:05
Перейти в начало страницы
 
Borovos
сообщение 24.10.2014, 00:36
Сообщение #185


Опытный Игрок
****

Репутация:   6  
Группа: Участник
Сообщений: 51
Награды: 2
Регистрация: 03.05.2014




Вставить ник Цитировать выделенное в форуму быстрого ответа


QUOTE (K.D. @ 23.10.2014, 23:59) *
This is called "HDR" and surely it presents in stalker. See r2_tonemap.


Ok, i didn't know this name. For my part, i'm not really interesting by graphism. As i saw a guy report this point in a french forum, i wanted to report it here.
Sorry for mistake and thk for reply


--------------------
Перейти в начало страницы
 
Trollz0r
сообщение 24.10.2014, 14:25
Сообщение #186


Почти Мастер
***********

Репутация:   1357  
Группа: Участник
Сообщений: 1155
Награды: 5
Регистрация: 28.05.2010




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(K.D. @ 23.10.2014, 22:59) *
HDR

А вот Lost Coast например специально сделали, чтобы похвастаться свежевнедренным в игровой движок хдром shuffle.gif


--------------------
Сверхнарод, не желающий кормить своего уицраора шаввой, будет кормить чужого гаввахом!
---------------
------------
----------
--------
------
----
--
Перейти в начало страницы
 
lvg_brest
сообщение 29.11.2014, 18:13
Сообщение #187


Новичок
*

Репутация:   10  
Группа: Участник
Сообщений: 9
Регистрация: 12.11.2014




Вставить ник Цитировать выделенное в форуму быстрого ответа


Правки некоторых движковых ошибок ТЧ 1.0007. Правки протестированы и работоспособны.
Можете использовать в своих модах.

Исправление "залипания" курсора в игровых меню. Исправление центрирования курсора в главном меню. Исправление не появления курсора в главном меню при запуске игры.
Спасибо alpet за информационную помощь.

Код.
Код
1) UICursor.cpp

CUICursor::CUICursor()
{    
    bVisible                = false;
    // Исправление центрирования курсора в главном меню при запуске игры
    vPrevPos.set            (512.f,384.f);
    vPos.set                (512.f,384.f);
    InitInternal            ();
    Device.seqRender.Add    (this,2);
}

2) UICursor.h

public:
                    CUICursor        ();
    virtual            ~CUICursor        ();
    virtual void    OnRender        ();
    
    Fvector2        GetCursorPositionDelta();

    Fvector2        GetCursorPosition        ();
    void            SetUICursorPosition        (Fvector2 pos);
    void            UpdateCursorPosition    ();

    bool            IsVisible        () {return bVisible;}
    // Исправление "залипания" курсора мыши в игровых меню
    void            Show            () {SetUICursorPosition(vPrevPos);bVisible = true;}
    void            Hide            () {vPrevPos = GetCursorPosition();bVisible = false;}
};

3) MainMenu.cpp

void CMainMenu::Activate    (bool bActivate)
{
    if (    !!m_Flags.test(flActive) == bActivate)        return;
    if (    m_Flags.test(flGameSaveScreenshot)    )        return;
    if (    (m_screenshotFrame == Device.dwFrame)    ||
            (m_screenshotFrame == Device.dwFrame-1) ||
            (m_screenshotFrame == Device.dwFrame+1))    return;

    bool b_is_single        = IsGameTypeSingle();

    if(g_dedicated_server && bActivate) return;

    if(bActivate)
    {
        b_shniaganeed_pp            = true;
        Device.Pause                (TRUE, FALSE, TRUE, "mm_activate1");
            m_Flags.set                (flActive|flNeedChangeCapture,TRUE);
            // Исправление не появления курсора в главном меню при запуске игры
            m_Flags.set                (flRestoreCursor,GetUICursor()->IsVisible());
        {
            DLL_Pure* dlg = NEW_INSTANCE(TEXT2CLSID("MAIN_MNU"));
            if(!dlg)
            {
                m_Flags.set                (flActive|flNeedChangeCapture,FALSE);
                return;
            }
            xr_delete                    (m_startDialog);
            m_startDialog                = smart_cast<CUIDialogWnd*>(dlg);
            VERIFY                        (m_startDialog);
        }

        m_Flags.set                    (flRestoreConsole,Console->bVisible);
        
        if(b_is_single)    m_Flags.set    (flRestorePause,Device.Paused());
        
        Console->Hide                ();
        // Исправление не появления курсора в главном меню при запуске игры
        //m_Flags.set                    (flRestoreCursor,GetUICursor()->IsVisible());

        if(b_is_single)
        {
            m_Flags.set                    (flRestorePauseStr, bShowPauseString);
...



Исправление отображения параметра "отношение" при обыске тел монстров. Исправление заливки иконки красным цветом при обыске тел монстров и людей.

Код.
Код
1) UICarBodyWnd.cpp

void CUICarBodyWnd::InitCarBody(CInventoryOwner* pOur, CInventoryOwner* pOthers)
{

    m_pOurObject                                    = pOur;
    m_pOthersObject                                    = pOthers;
    m_pInventoryBox                                    = NULL;
    
    u16 our_id                                        = smart_cast<CGameObject*>(m_pOurObject)->ID();
    u16 other_id                                    = smart_cast<CGameObject*>(m_pOthersObject)->ID();

    m_pUICharacterInfoLeft->InitCharacter            (our_id);
    m_pUIOthersIcon->Show                            (true);
    
    // Исправление отображения параметра "отношение" при обыске тел монстров
    m_pUICharacterInfoRight->ClearFlags        ();
    CBaseMonster *monster = NULL;
    if(m_pOthersObject) {
        monster                                        = smart_cast<CBaseMonster *>(m_pOthersObject);
        if (monster || m_pOthersObject->use_simplified_visual() )
        {
            m_pUICharacterInfoRight->ClearInfo        ();
            if(monster)
            {
                // Исправление отображения параметра "отношение" при обыске тел монстров
                m_pUICharacterInfoRight->SetMonsterFlag        ();
                shared_str monster_tex_name = pSettings->r_string(monster->cNameSect(),"icon");
                m_pUICharacterInfoRight->UIIcon().InitTexture(monster_tex_name.c_str());
                m_pUICharacterInfoRight->UIIcon().SetStretchTexture(true);
            }
        }else
        {
            // Исправление заливки иконки красным цветом при обыске тел монстров и людей
            m_pUICharacterInfoRight->SetHumanFlag        ();
            m_pUICharacterInfoRight->InitCharacter    (other_id);
        }
    }

    m_pUIPropertiesBox->Hide                        ();
    EnableAll                                        ();
    UpdateLists                                        ();
....


void CUICarBodyWnd::Hide()
{
    InventoryUtilities::SendInfoToActor            ("ui_car_body_hide");
    m_pUIOurBagList->ClearAll                    (true);
    m_pUIOthersBagList->ClearAll                (true);
    // Исправление отображения параметра "отношение" при обыске тел монстров
    m_pUICharacterInfoRight->ClearFlags    ();
    inherited::Hide                                ();
    if(m_pInventoryBox)
        m_pInventoryBox->m_in_use                = false;
}


2) UICharacterInfo.cpp

// Исправление отображения параметра "отношение" при обыске тел монстров
bool MonsterFlag    = false;
bool HumanFlag        = false;

void CUICharacterInfo::Update()
{
    inherited::Update();


    if(hasOwner() && (m_bForceUpdate||(Device.dwFrame%100==0))  ){
        m_bForceUpdate = false;
        CSE_ALifeTraderAbstract* T = ch_info_get_from_id    (m_ownerID);
        if (NULL==T){
            m_ownerID = u16(-1);
            return;
        }else
            UpdateRelation();

        if(m_icons[eUIIcon]){
            CSE_ALifeCreatureAbstract*        pCreature = smart_cast<CSE_ALifeCreatureAbstract*>(T);
            // Исправление отображения параметра "отношение" при обыске тел монстров
            if((pCreature && !pCreature->g_Alive() && MonsterFlag) || (Actor()->ID()==m_ownerID || !hasOwner()))
            {
                if(m_icons[eUIRelationCaption])    m_icons[eUIRelationCaption]->Show    (false);
                if(m_icons[eUIRelation])        m_icons[eUIRelation]->Show            (false);
            }
            // Исправление заливки иконки красным цветом при обыске тел монстров и людей
            if(pCreature && !pCreature->g_Alive() && !MonsterFlag && !HumanFlag)
            {
                m_icons[eUIIcon]->SetColor    (color_argb(255,255,160,160));
            }
        }
    }
}


В конце  UICharacterInfo.cpp (после void CUICharacterInfo::ClearInfo()) дописать:

// Исправление отображения параметра "отношение" при обыске тел монстров
void CUICharacterInfo::SetMonsterFlag()
{
MonsterFlag = true;
}

void CUICharacterInfo::SetHumanFlag()
{
HumanFlag = true;
}

void CUICharacterInfo::ClearFlags()
{
MonsterFlag = false;
HumanFlag    = false;
}


3) UICharacterInfo.h

public:
                        CUICharacterInfo();
    virtual                ~CUICharacterInfo();

    void                Init                    (float x, float y, float width, float height, CUIXml* xml_doc);
    void                Init                    (float x, float y, float width, float height, const char* xml_name);
    void                InitCharacter            (u16 id);
    void                ClearInfo                ();

    virtual void        Update                    ();

    u16                    OwnerID                    ()    const {return m_ownerID;}
    CUIStatic&            UIIcon                    ()        {VERIFY(m_icons[eUIIcon]);return *m_icons[eUIIcon];}    
    CUIStatic&            UIName()                {VERIFY(m_icons[eUIName]);return *m_icons[eUIName];}    
    const shared_str&    IconName                () {return m_texture_name;}
    // Исправление отображения параметра "отношение" при обыске тел монстров
    void                SetMonsterFlag            ();
    void                SetHumanFlag            ();
    void                ClearFlags                ();
};



Исправление не отключения света после выключения аномалии.
Спасибо K.D. за информационную помощь.

Код.
Код
CustomZone.cpp

    //загрузить параметры световой вспышки от взрыва
    m_zone_flags.set(eBlowoutLight, pSettings->r_bool (section, "blowout_light"));

    if(m_zone_flags.test(eBlowoutLight) ){
        sscanf(pSettings->r_string(section,"light_color"), "%f,%f,%f", &m_LightColor.r, &m_LightColor.g, &m_LightColor.b);
        m_fLightRange            = pSettings->r_float(section,"light_range");
        m_fLightTime            = pSettings->r_float(section,"light_time");
        m_fLightTimeLeft        = 0.f; // Правильно задать тип переменной

        m_fLightHeight        = pSettings->r_float(section,"light_height");
    }


void CCustomZone::UpdateBlowoutLight    ()
{
    if(m_fLightTimeLeft>0.f)
    {
        m_fLightTimeLeft -= Device.fTimeDelta;
        // Исправление не отключения света после выключения аномалии
        if (m_fDistanceToCurEntity>29.f)
        {
            if (m_fLightTime<=1.f)
            {
                m_fLightTimeLeft = m_fLightTimeLeft/1.45f;
            }
            else
            {
                m_fLightTimeLeft = m_fLightTimeLeft/1.15f;
            }
        }
        clamp(m_fLightTimeLeft,0.0f,m_fLightTime);
....



Исправление отображения зеленым цветом прочитанных записей в разделе КПК "Дневник".

Код.
Код
1) UIDiaryWnd2.cpp

void CUIDiaryWnd::LoadJournalTab            (ARTICLE_DATA::EArticleType _type)
{
    delete_data                    (m_ArticlesDB);

    m_UILeftWnd->AttachChild    (m_SrcListWnd);
    m_SrcListWnd->Show            (true);

    m_UIRightWnd->AttachChild    (m_DescrView);
    m_DescrView->Show            (true);

    if(Actor()->encyclopedia_registry->registry().objects_ptr())
    {
        ARTICLE_VECTOR::const_iterator it = Actor()->encyclopedia_registry->registry().objects_ptr()->begin();
        for(; it != Actor()->encyclopedia_registry->registry().objects_ptr()->end(); it++)
        {
            if (_type == it->article_type)
                
            {
                // Исправление отображения зеленым цветом прочитанных записей в дневнике КПК
                AddDiaryArticle(it->article_id, it->readed);
            
            }
        }
    }
    g_pda_info_state    &=    !pda_section::journal;

}

void CUIDiaryWnd::OnSrcListItemClicked    (CUIWindow* w,void* p)
{
    CUITreeViewItem*    pSelItem    = (CUITreeViewItem*)p;
    m_DescrView->Clear    ();
    if (!pSelItem->IsRoot())
    {
        CUIEncyclopediaArticleWnd*    article_info = xr_new<CUIEncyclopediaArticleWnd>();
        article_info->Init            ("encyclopedia_item.xml","encyclopedia_wnd:objective_item");
        article_info->SetArticle    (m_ArticlesDB[pSelItem->GetValue()]);
        m_DescrView->AddWindow        (article_info, true);

        // Исправление отображения зеленым цветом прочитанных записей в дневнике КПК
        if (!pSelItem->IsArticleReaded())
        {
            if(Actor()->encyclopedia_registry->registry().objects_ptr())
            {
                for(ARTICLE_VECTOR::iterator it = Actor()->encyclopedia_registry->registry().objects().begin();
                    it != Actor()->encyclopedia_registry->registry().objects().end(); it++)
                {
                    if (ARTICLE_DATA::eJournalArticle == it->article_type &&
                        m_ArticlesDB[pSelItem->GetValue()]->Id() == it->article_id)
                    {
                        it->readed = true;
                        break;
                    }
                }
            }
        }
    }
}

В конце UIDiaryWnd2.cpp дописать:

// Исправление отображения зеленым цветом прочитанных записей в дневнике КПК
void CUIDiaryWnd::AddDiaryArticle(shared_str article_id, bool bReaded)
{
    m_ArticlesDB.resize(m_ArticlesDB.size() + 1);
    CEncyclopediaArticle*& a = m_ArticlesDB.back();
    a = xr_new<CEncyclopediaArticle>();
    a->Load(article_id);

    CreateTreeBranch(a->data()->group, a->data()->name, m_SrcListWnd, m_ArticlesDB.size()-1,
        m_pTreeRootFont, m_uTreeRootColor, m_pTreeItemFont, m_uTreeItemColor, bReaded);
}

2) UIDiaryWnd.h

            void        UnloadNewsTab            ();
            void        LoadNewsTab                ();
            void        Reload                    (EDiaryFilter new_filter);
            // Исправление отображения зеленым цветом прочитанных записей в дневнике КПК
            void        AddDiaryArticle            (shared_str, bool bReaded);


Исправление работы статика биографии в разделе КПК "Ранги".
Правка перенесена из проекта XRay-extensions.

Код.
Код
UICharacterInfo.cpp

        if (chInfo.Bio().size())
        {
            CUIStatic* pItem                = xr_new<CUIStatic>();
            pItem->SetWidth                    (pUIBio->GetDesiredChildWidth());
            // Исправление работы статика биографии
            pItem->SetTextComplexMode        (true);
            pItem->SetText                    (*(chInfo.Bio()));
            pItem->AdjustHeightToText        ();
            pUIBio->AddWindow                (pItem, true);
        }


Исправление учета статистики убийства сталкеров и мутантов, выполненных квестов.
Использован алгоритм из мода Fixed Statistics автора kstn.

Код.
Код
actor_statistic_mgr.cpp

void CActorStatisticMgr::AddPoints(const shared_str& key, const shared_str& detail_key, s32 cnt, s32 pts)
{
    SStatSectionData& sect        = GetSection        (key);
    SStatDetailBData& d            = sect.GetData        (detail_key);
    d.int_count                    += cnt;
    // Исправление учета статистики убийства сталкеров и мутантов, выполненных квестов
    d.int_points                = pts;
}
Перейти в начало страницы
 
Alex Ros
сообщение 29.11.2014, 22:28
Сообщение #188


Грандмастер
**************

Репутация:   482  
Группа: Участник
Сообщений: 1851
Награды: 6
Регистрация: 22.08.2009




Вставить ник Цитировать выделенное в форуму быстрого ответа


Наверное это из разряда губу раскатал, но все же предложу...
Возможно ли добавить gloss? Помимо имеющегося spec канала в бамп файле в канале R, если не путаю.
Перейти в начало страницы
 
lvg_brest
сообщение 07.12.2014, 13:03
Сообщение #189


Новичок
*

Репутация:   10  
Группа: Участник
Сообщений: 9
Регистрация: 12.11.2014




Вставить ник Цитировать выделенное в форуму быстрого ответа


Правки некоторых движковых ошибок ТЧ 1.0007. Правки протестированы и работоспособны.
Можете использовать в своих модах.

Исправление отображения курсора во время проигрывания видеороликов. Исправление центрирования курсора после проигрывания титров. Исправление "залипания" курсора мыши в игровых меню (дополнение).

Код.
Код
1) UIGameTutorial.h

protected:
    enum {    
        etiNeedPauseOn        = (1<<0),
        etiNeedPauseOff        = (1<<1),
        etiStoredPauseState    = (1<<2),
        etiCanBeStopped        = (1<<3),
        etiGrabInput        = (1<<4),
        etiNeedPauseSound    = (1<<5),
        // Исправление отображения курсора во время проигрывания видеороликов
        etiStoredCursorState= (1<<6),
        eti_last            = 7,
    };

2) UIGameTutorialSimpleItem.cpp

void CUISequenceSimpleItem::Load(CUIXml* xml, int idx)
{
    CUISequenceItem::Load    (xml,idx);

    XML_NODE* _stored_root    = xml->GetLocalRoot();
    xml->SetLocalRoot        (xml->NavigateToNode("item",idx));
    
    LPCSTR m_snd_name        = xml->Read                ("sound",0,""            );
    if (m_snd_name&&m_snd_name[0]){
        m_sound.create        (m_snd_name,st_Effect,sg_Undefined);    
        VERIFY                (m_sound._handle());
    }
    m_time_length            = xml->ReadFlt            ("length_sec",0,0        );
    // Исправление центрирования курсора после проигрывания титров
    m_desired_cursor_pos.x    = xml->ReadAttribFlt    ("cursor_pos",0,"x",512    );
    m_desired_cursor_pos.y    = xml->ReadAttribFlt    ("cursor_pos",0,"y",384    );
    strcpy                    (m_pda_section, xml->Read("pda_section",0,"")    );
...

void CUISequenceSimpleItem::Update            ()
{
    // Исправление отображения курсора во время проигрывания титров
    if(GetUICursor()->IsVisible())
    {
        m_flags.set(etiStoredCursorState, TRUE);
        GetUICursor()->Hide    ();
    }
    float gt                        = float(Device.dwTimeContinual)/1000.0f;
    SubItemVecIt _I                    = m_subitems.begin();
    SubItemVecIt _E                    = m_subitems.end();
    for(;_I!=_E;++_I){
        SSubItem& s                    = *_I;
        bool bPlaying                = (gt>(m_time_start+s.m_start))&&(gt<(m_time_start+s.m_start+s.m_length));
        if (true==bPlaying&&(false==s.m_visible))            s.Start    ();
        else if ((false==bPlaying)&&(true==s.m_visible))    s.Stop    ();
    }
    
    if (g_pGameLevel){
    CUIGameSP* ui_game_sp    = smart_cast<CUIGameSP*>(HUD().GetUI()->UIGame());

    if(ui_game_sp)
    {
        if(!m_pda_section || 0 == xr_strlen(m_pda_section) )
            if ( ui_game_sp->PdaMenu->IsShown()            ||
                ui_game_sp->InventoryMenu->IsShown()    ||
                ui_game_sp->TalkMenu->IsShown()            ||
                ui_game_sp->UICarBodyMenu->IsShown()    ||
                ui_game_sp->UIChangeLevelWnd->IsShown()            )
                m_UIWindow->Show                        (false);
            else
                m_UIWindow->Show                        (true);
        }
    }
    // Исправление "залипания" курсора мыши в игровых меню
    if(m_desired_cursor_pos.x && m_desired_cursor_pos.y)
        GetUICursor()->SetUICursorPosition(m_desired_cursor_pos);
}

void CUISequenceSimpleItem::Start()
{
    inherited::Start                ();
    m_flags.set                        (etiStoredPauseState, Device.Paused());
    
    if(m_flags.test(etiNeedPauseOn) && !m_flags.test(etiStoredPauseState)){
        Device.Pause            (TRUE, TRUE, FALSE, "simpleitem_start");
        bShowPauseString        = FALSE;
    }

    if(m_flags.test(etiNeedPauseOff) && m_flags.test(etiStoredPauseState))
        Device.Pause            (FALSE, TRUE, FALSE, "simpleitem_start");

    if(m_flags.test(etiNeedPauseSound))
        Device.Pause            (TRUE, FALSE, TRUE, "simpleitem_start");
    
    // Исправление "залипания" курсора мыши в игровых меню
    if(m_desired_cursor_pos.x && m_desired_cursor_pos.y)
        GetUICursor()->SetUICursorPosition(m_desired_cursor_pos);

    m_time_start                            = float(Device.dwTimeContinual)/1000.0f;
...

bool CUISequenceSimpleItem::Stop            (bool bForce)
{
    // Исправление отображения курсора во время проигрывания титров
    if(m_flags.test(etiStoredCursorState))
        GetUICursor()->Show    ();

    if(!m_flags.test(etiCanBeStopped)&&!bForce)
        return false;
...

3) UIGameTutorialVideoItem.cpp

...
#include "../../xr_input.h"
#include "../xr_level_controller.h"
// Исправление отображения курсора во время проигрывания видеороликов
#include "../UICursor.h"
...

void CUISequenceVideoItem::Update()
{
    // Исправление отображения курсора во время проигрывания видеороликов
    if(GetUICursor()->IsVisible())
    {
        m_flags.set(etiStoredCursorState, TRUE);
        GetUICursor()->Hide    ();
    }
    // deferred start
...

bool CUISequenceVideoItem::Stop    (bool bForce)
{
    // Исправление отображения курсора во время проигрывания видеороликов
    if(m_flags.test(etiStoredCursorState))
        GetUICursor()->Show    ();

    if(!m_flags.test(etiCanBeStopped) && !bForce && IsPlaying())
        return false;
...


Исправление некоторых распространенных движковых вылетов. Для достижения эффекта от движковых правок существует необходимое условие: скрипты и конфиги в ваших модах не должны содержать ошибок, провоцирующих эти вылеты. Правки рассчитаны на исключение редких вылетов, спровоцированных движком. Применение правок не даст желаемого эффекта без тщательной отладки кода в своих модах.
Исправлена ошибка с вылетом типа «there is no specified level in the game graph».
Исправлена ошибка с вылетом типа «There is no proper graph point neighbour!».
Исправлена ошибка с вылетом типа «There is no specified level...in the game graph!».
Исправлена ошибка с вылетом типа «xrServer::Process_event_reject...e_parent && e_entity».
Исправлена ошибка с вылетом типа «error in stalker with visual...».

Код.
Код
1) stalker_animation_manager_update.cpp

// Исправление вылета типа "! error in stalker with visual"
void CStalkerAnimationManager::update                        ()
{
    START_PROFILE("stalker/client_update/animations")
    try {
        update_impl            ();
    }
    catch(...) {
        Msg                    ("Error in stalker with visual [%s]",*object().cNameVisual());
        global().reset            ();
        head().reset            ();
        torso().reset            ();
        legs().reset            ();
        return;
    }
    STOP_PROFILE
}

2) game_graph_inline.h

// Исправление вылета типа "There is no proper graph point neighbour!"
IC    float CGameGraph::distance                                        (const _GRAPH_ID tGraphID0, const _GRAPH_ID tGraphID1) const
{
    float mDist = 54.767998f;
    const_iterator                i, e;
    begin                        (tGraphID0,i,e);
    for (; i != e; ++i){
        if (value(tGraphID0,i) == tGraphID1){
            return                (edge_weight(i));
        }
    }
    Msg ("ERROR: There is no proper graph point neighbour!");    
    return                (mDist);
}

// Исправление вылета типа "there is no specified level in the game graph:"
IC    const GameGraph::SLevel &GameGraph::CHeader::level                (const _LEVEL_ID &id) const
{
    LEVEL_MAP::const_iterator    I = levels().find(id);
    if(I != levels().end()){
        return                        ((*I).second);
    }
    else{
        Msg ("ERROR: There is no specified level in the game graph: [%d]",id);
        return                        (levels().begin()->second);
    }
}

// Исправление вылета типа "! There is no specified level %s in the game graph!"
IC    const GameGraph::SLevel &GameGraph::CHeader::level                (LPCSTR level_name) const
{
    LEVEL_MAP::const_iterator    I = levels().begin();
    LEVEL_MAP::const_iterator    E = levels().end();
    for (; I != E; ++I){
        if (!xr_strcmp((*I).second.name(),level_name)){
            return                ((*I).second);
        }
    }
    Msg                            ("ERROR: There is no specified level [%s] in the game graph!",level_name);
    return                        (levels().begin()->second);
}

3) xrServer_process_event_reject.cpp (приводится целиком)

#include "stdafx.h"
#include "xrserver.h"
#include "xrserver_objects.h"

bool xrServer::Process_event_reject    (NET_Packet& P, const ClientID sender, const u32 time, const u16 id_parent, const u16 id_entity, bool send_message)
{
    // Parse message
    CSE_Abstract*        e_parent    = game->get_entity_from_eid    (id_parent);
    CSE_Abstract*        e_entity    = game->get_entity_from_eid    (id_entity);

#ifdef DEBUG
    Msg("sv reject. id_parent %s id_entity %s [%d]",ent_name_safe(id_parent).c_str(),ent_name_safe(id_entity).c_str(), Device.dwFrame);
#endif
    
    // Исправление вылета по "xrServer::Process_event_reject ... e_parent && e_entity"
    if ( !e_entity ) {
        Msg                ( "ERROR: Entity not found. parent_id = [%d], entity_id = [%d], frame = [%d]. Process_event_reject()", id_parent, id_entity, Device.dwFrame );
        return (false);
    }
    
    if ( !e_parent ) {
        Msg                ( "ERROR: Parent not found. parent_id = [%d], entity_id = [%d], frame = [%d]. Process_event_reject()", id_parent, id_entity, Device.dwFrame );
        return (false);
    }

    xr_vector<u16>& C        = e_parent->children;
    xr_vector<u16>::iterator c    = std::find    (C.begin(),C.end(),id_entity);
    if (c == C.end())
    {
        Msg("ERROR: SV: Can't find children [%d] of parent [%d]", id_entity, e_parent);
        return (false);
    }

    if (0xffff == e_entity->ID_Parent)
    {
        Msg    ("ERROR: Can't detach independant object. entity[%s][%d], parent[%s][%d], section[%s]",
            e_entity->name_replace(), id_entity, e_parent->name_replace(), id_parent, e_entity->s_name.c_str() );
        return            (false);
    }

    if (e_entity->ID_Parent != id_parent)
    {
        Msg("ERROR: e_entity->ID_Parent = [%d], parent = [%d][%s], entity_id = [%d], frame = [%d]",
            e_entity->ID_Parent, id_parent, e_parent->name_replace(), id_entity, Device.dwFrame);
    }

    game->OnDetach(id_parent,id_entity);

    // Rebuild parentness
    e_entity->ID_Parent        = 0xffff;
    C.erase                    (c);

    // Signal to everyone (including sender)
    if (send_message)
    {
        DWORD MODE        = net_flags(TRUE,TRUE, FALSE, TRUE);
        SendBroadcast    (BroadcastCID,P,MODE);
    }
    
    return                (true);
}
Перейти в начало страницы
 
Da Man
сообщение 07.12.2014, 13:21
Сообщение #190


Архимагистр Игры
*****************

Репутация:   364  
Группа: Забанен
Сообщений: 2765
Награды: 1
Регистрация: 06.06.2008




Вставить ник Цитировать выделенное в форуму быстрого ответа


lvg_brest, а ты умеешь с патчами работать smile.gif


--------------------
Играть в шутеры на консолях - все равно, что заниматься сексом с резиновой женщиной
Перейти в начало страницы
 
K.D.
сообщение 07.12.2014, 15:41
Сообщение #191


Почти Мастер
***********

Репутация:   311  
Группа: Участник
Сообщений: 1092
Награды: 5
Регистрация: 01.03.2011




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(lvg_brest @ 07.12.2014, 13:58) *
Исправлена ошибка с вылетом типа «there is no specified level in the game graph».
Исправлена ошибка с вылетом типа «There is no proper graph point neighbour!».
Исправлена ошибка с вылетом типа «There is no specified level...in the game graph!».
Исправлена ошибка с вылетом типа «xrServer::Process_event_reject...e_parent && e_entity».
Исправлена ошибка с вылетом типа «error in stalker with visual...».

Не совсем понял, зачем это исправлять? Это не ошибки, это сигнал аварийного прерывания игры.
Перейти в начало страницы
 
lvg_brest
сообщение 07.12.2014, 17:08
Сообщение #192


Новичок
*

Репутация:   10  
Группа: Участник
Сообщений: 9
Регистрация: 12.11.2014




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(K.D. @ 07.12.2014, 15:36) *
Не совсем понял, зачем это исправлять? Это не ошибки, это сигнал аварийного прерывания игры.

Не обязательно аварийно прерывать игру во всех случаях. Можно послать в лог сообщение о нештатной ситуации и вернуть значение, которое движок и скрипты нормально отработают. Если посмотреть в исходники ЗП, например, видно что разработчики применяли аналогичные решения, в отличие от ТЧ, наверное пришло с опытом. Вылетать не обязательно, если есть иное решение в виде адекватной отработки нештатной ситуации. Но, повторюсь, это не панацея от ошибок вообще: надо отлаживать свои моды для исключения (минимизации) скриптово/конфиговых причин вылетов.
Перейти в начало страницы
 
hi_flyer
сообщение 07.12.2014, 17:20
Сообщение #193


Мастер Игры
************

Репутация:   232  
Группа: Друзья GM
Сообщений: 1299
Награды: 4
Регистрация: 05.03.2012




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(lvg_brest @ 07.12.2014, 18:58) *
Исправлена ошибка с вылетом типа «there is no specified level in the game graph».

При тестировании 1.0007, было замечено что в некоторых случаях можно просто нажать "продолжить" при этой ошибке.


--------------------
Перейти в начало страницы
 
K.D.
сообщение 07.12.2014, 18:23
Сообщение #194


Почти Мастер
***********

Репутация:   311  
Группа: Участник
Сообщений: 1092
Награды: 5
Регистрация: 01.03.2011




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(lvg_brest @ 07.12.2014, 18:03) *
Не обязательно аварийно прерывать игру во всех случаях.

Да я не про все говорю, а про эти. «there is no specified level in the game graph» - значит, кто-то заспавнился вне аи-сетки, и ситуация эта сама не решится, возврат левого уровня не поможет. Нужно соответственно модифицировать планировщики для мобов. «xrServer::Process_event_reject...e_parent && e_entity» означает проблемы с преждевременным удалением клиентского объекта. Затычка вылета означает гарантированные глюки и вылеты в дальнейшем, только зачастую без лога. Ничего из этого не будет нормально отработано чем бы то ни было.
Перейти в начало страницы
 
Капитошка
сообщение 07.12.2014, 18:52
Сообщение #195


Почти Игроман
*********

Репутация:   113  
Группа: Участник
Сообщений: 685
Награды: 2
Регистрация: 16.06.2013




Вставить ник Цитировать выделенное в форуму быстрого ответа


Да уж, всё равно как лечить переломы ампутацией конечностей dry.gif

Сообщение отредактировал Капитошка - 07.12.2014, 18:53


--------------------
Прошу насчёт исходников мне больше в личку не писать. У себя я их удалила и где взять не знаю.
Перейти в начало страницы
 
Da Man
сообщение 07.12.2014, 19:22
Сообщение #196


Архимагистр Игры
*****************

Репутация:   364  
Группа: Забанен
Сообщений: 2765
Награды: 1
Регистрация: 06.06.2008




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(lvg_brest @ 07.12.2014, 16:03) *
Цитата(K.D. @ 07.12.2014, 15:36) *
Не совсем понял, зачем это исправлять? Это не ошибки, это сигнал аварийного прерывания игры.

Не обязательно аварийно прерывать игру во всех случаях. Можно послать в лог сообщение о нештатной ситуации и вернуть значение, которое движок и скрипты нормально отработают.

Логи никто никогда не смотрит, соответственно ошибку никогда не исправят. А вот если игра будет падать - то никуда не отвертишься, придется фиксить smile.gif


--------------------
Играть в шутеры на консолях - все равно, что заниматься сексом с резиновой женщиной
Перейти в начало страницы
 
AndreySol
сообщение 13.12.2014, 18:49
Сообщение #197


Опытный Геймер
*******

Репутация:   3  
Группа: Участник
Сообщений: 150
Награды: 3
Регистрация: 16.02.2014




Вставить ник Цитировать выделенное в форуму быстрого ответа


А можно аналог cam_inert, но вверх\вниз ? Движок такое могет ?
Перейти в начало страницы
 
lvg_brest
сообщение 23.12.2014, 21:09
Сообщение #198


Новичок
*

Репутация:   10  
Группа: Участник
Сообщений: 9
Регистрация: 12.11.2014




Вставить ник Цитировать выделенное в форуму быстрого ответа


Правки некоторых движковых ошибок ТЧ 1.0007. Правки протестированы и работоспособны. Можете использовать в своих модах.

Исправление "залипания" курсора мыши в главном меню после просмотра титров.
Предыдущие правки в UIGameTutorialSimpleItem.cpp можно заменить всего одной этой правкой, в таком случае поведение курсора после просмотра титров и туториальных сообщений будет аналогично патчу 1.0006.

Код.
Код
1) UIGameTutorialSimpleItem.cpp

bool CUISequenceSimpleItem::Stop            (bool bForce)
{
    if(!m_flags.test(etiCanBeStopped)&&!bForce)
        return false;

    m_owner->MainWnd()->DetachChild    (m_UIWindow);
    m_sound.stop                ();

    if(m_flags.test(etiNeedPauseOn) && !m_flags.test(etiStoredPauseState))
        Device.Pause            (FALSE, TRUE, FALSE, "simpleitem_stop");

    if(m_flags.test(etiNeedPauseOff) && m_flags.test(etiStoredPauseState))
        Device.Pause            (TRUE, TRUE, FALSE, "simpleitem_stop");

    if(m_flags.test(etiNeedPauseSound))
        Device.Pause            (FALSE, FALSE, TRUE, "simpleitem_stop");

    // Исправление "залипания" курсора мыши в главном меню после просмотра титров
    if (!g_pGameLevel){
        GetUICursor()->SetUICursorPosition        (m_desired_cursor_pos);
    }
    if (g_pGameLevel){
        CUIGameSP* ui_game_sp    = smart_cast<CUIGameSP*>(HUD().GetUI()->UIGame());
        if( ui_game_sp && ui_game_sp->PdaMenu->IsShown() )
            HUD().GetUI()->StartStopMenu            (ui_game_sp->PdaMenu, true);
    }
    inherited::Stop                ();
    return true;
}
Перейти в начало страницы
 
RayTwitty
сообщение 23.12.2014, 22:30
Сообщение #199


Игровой Бог
**********************

Репутация:   648  
Группа: Участник
Сообщений: 5354
Награды: 9
Регистрация: 24.09.2010




Вставить ник Цитировать выделенное в форуму быстрого ответа


lvg_brest, было бы неплохо, если правки выкладывались в виде дифф-файлов.


--------------------
Перейти в начало страницы
 
chriotmao
сообщение 14.07.2015, 11:36
Сообщение #200


Кандидат Игровых Наук
******************

Репутация:   546  
Группа: Участник
Сообщений: 3016
Награды: 8
Регистрация: 21.04.2010




Вставить ник Цитировать выделенное в форуму быстрого ответа


Кто нибудь пилит движок зп? rolleyes.gif
Идея для исправлений:
1. Поднятие предмета происходит только тогда, когда выводится его иконка. Т.е. наводим курсор на предмет, загорается надпись "Поднять предмет "Х" " но он не подбирается. Тем самым невозможно подобрать некоторые тайники (напр. в подвалах ВНЗ Круг под лежащей решеткой или же напр. под мостом на юпитере, невозможно поднять СВУ.)
2. Не знаю баг или фитча, но предметы поднимаются группами, а не по одному. Наверное лучше бы тоже исправить.
Идея для добавлений:
1. В инвентаре в описании оружия выводится только 2 типа (иконки) используемых патронов, даже если оружие использует 3 и больше, из-за этого ПЫС выпилили некоторые типы патронов (напр. 12х70 Дротик, Снайперские 9x39 и т.д.) Стоит либо выпилить полностью, либо добавить все типы используемых. rolleyes.gif


--------------------
Перейти в начало страницы
 

14 страниц V  « < 8 9 10 11 12 > » 
Ответить в данную темуНачать новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 15.05.2024, 12:44