Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Предложения по правкам движка
GAMEINATOR forums > S.T.A.L.K.E.R. > Мастерская: создание модов для S.T.A.L.K.E.R.
Страницы: 1, 2, 3, 4, 5, 6
krovosnork
Возможно ли сделать перезагрузку текстур не выходя из игры? Пригодилось бы тем, кто работает с текстурами, что-бы не перегружать по 100 раз игру.
dromundus
вот наверно тоже через движок надо...
есть хит оглушение - shock
надо сделать его не сильно смертельным ...но вырубающим ...до потери сознания...
ставим на кулаки вырубаем НПС парой тычков - тот в отключке соответствующие анимации
(и вот тут для двигла) таскать оглушённого, шмонать оглушённого..(как дохлика)
а потом лечить оглушённого дать аптечку , а поскольку у того после удара лёгкая потеря памяти то комунити после такого не меняется...
В результате можно брать НПС в плен глуша свето-шумовыми гранатами или мордуя...
Базарить слово за слово в случае чего не доводя дело до перестрелки....
и соответственно монстры которые пользуются данными хитами по другому будут воздействовать на нпс...
Короче добавить временную отключку на соответственный хит с последствиями...
ту конечно ещё надо и скрипты поправить ... но думаю это уже легче будет....ПЫСЫ похоже изначально так и планировали только потом забросили это дело и свели всё к ранению..
Цикл на telepatic в принципе восстановить удалось....
ещё бы разрыв тел на wound
и горение на burn
sergy172
Цитата(_призрак_ @ 14.06.2014, 10:51) *
вместо того чтобы работать над стабильностью и управлением, они пилят свистелки-перделки типа ПДА или сна в мультиплеере

Однако, они оригиналы. blink.gif
По сути, первым делом лучше всего организовать кооператив для двух игроков, без всяких доп. функций типа передачи денег.
По большому счёту больше то и не особо надо.
А вот потом, можно допиливать куда и как угодно.
Lagos
Недавно вспомнил ещё про одно нововведение..не знаю, сложно реализовать или нет, но поделюсь своей мыслью:
В СДК при генерировании травы получается много 'ячеек', в которых располагаются уже модели. Ничего с ними кроме как выделить - сделать нельзя. Реально ли сделать простые операции с данными ячейками(перемещение\удаление\вращение\копирование\вставка).?
Просто как идея.
K.D.
Цитата(Lagos @ 28.06.2014, 00:19) *
Реально ли сделать простые операции с данными ячейками

Нет. И это абсолютно ни к чему.
Lagos
Цитата(K.D. @ 28.06.2014, 16:29) *
Цитата(Lagos @ 28.06.2014, 00:19) *
Реально ли сделать простые операции с данными ячейками

Нет. И это абсолютно ни к чему.

Ну ни к чему, ещё как сказать..а вот то что нереально - это печально. Спасибо за ответ.
macron
Надысь экспериментировал с HOM-окклюдерами, удалось в подвалах/катакомбах некоторых больших наземных лок (например, бар-подвал в OLR) даже на r2 прилично поднять fps, оградив сами подвалы двустороними окклюдерами. Вот тут подумалось, а почему бы движку сразу автоматом не воспринимать любую статическую геометрию как окклюдер? Может, бред, конечно...
MegaNub
Цитата(krovosnork @ 14.06.2014, 23:39) *
Возможно ли сделать перезагрузку текстур не выходя из игры? Пригодилось бы тем, кто работает с текстурами, что-бы не перегружать по 100 раз игру.

Ага, было бы хорошо, если не нашлась текстура, то накладываем какую-нибудь дефолтную, например с надписью 'ERROR', как в некоторых движках реализовано, ну это пожелание упоминалось ранее. И добавить консольную команду 'textures_reload', ну или 'tex_reload', чтобы можно было перепроверить (перезагрузить) директорию с текстурами. Еще было бы не плохо, если не нашлась какая секция в конфиге, то не крэшить игру, а просто красным в консоль: 'Can't find section: [alalal]'.
krovosnork
Может есть какой способ реализовать крепление различных моделей прицелов\глушителей на оружие? (без кучи одинаковых моделей и подмены секций)
Lagos
Цитата(K.D. @ 28.06.2014, 16:29) *
Цитата(Lagos @ 28.06.2014, 00:19) *
Реально ли сделать простые операции с данными ячейками

Нет. И это абсолютно ни к чему.

Даже просто удалять - это уже будет огромный плюс.
K.D.
Цитата(MegaNub @ 28.06.2014, 21:53) *
Ага, было бы хорошо, если не нашлась текстура, то накладываем какую-нибудь дефолтную, например с надписью 'ERROR', как в некоторых движках реализовано, ну это пожелание упоминалось ранее.

Это уже давно есть.

Цитата(Lagos @ 28.06.2014, 23:03) *
Даже просто удалять

Зачем удалять, если можно сделать маской?
Lagos
Цитата(K.D. @ 28.06.2014, 23:23) *
Цитата(MegaNub @ 28.06.2014, 21:53) *
Ага, было бы хорошо, если не нашлась текстура, то накладываем какую-нибудь дефолтную, например с надписью 'ERROR', как в некоторых движках реализовано, ну это пожелание упоминалось ранее.

Это уже давно есть.

Цитата(Lagos @ 28.06.2014, 23:03) *
Даже просто удалять

Зачем удалять, если можно сделать маской?

Бывают 'вырожденные' кустики травы, которые висят в воздухе(или ещё где), и к сожалению, даже маска это не исправит. Это конечно не критично - но всё-таки не приятно.
RayTwitty
Цитата(Lagos @ 28.06.2014, 23:47) *
Бывают 'вырожденные' кустики травы, которые висят в воздухе(или ещё где), и к сожалению, даже маска это не исправит

Кстати да, косяков у этой маски хватает - не только висячие кустики, но и ещё они иногда растут там, где не надо - например в зданиях (по краям), хотя на самой маске там не был указан какой-либо детейл. Это либо надо с запасом брать и рисовать маску, либо хз. Надо экспериментировать.
Капитошка
Цитата(K.D. @ 28.06.2014, 23:23) *
Цитата(Lagos @ 28.06.2014, 23:03) *
Даже просто удалять

Зачем удалять, если можно сделать маской?

По пикселю править маску то ещё удовольствие, потом грузить СДК, грузить локацию, опять расставлять траву, если не удалось, повторяем с начала, и так много-много-много-много раз пока не получим удовлетворяющий нас результат.

Цитата(Lagos @ 28.06.2014, 23:03) *
Даже просто удалять - это уже будет огромный плюс.

Это единственное чего не хватает.

Цитата(Shadows @ 29.06.2014, 01:40) *
Кстати да, косяков у этой маски хватает - не только висячие кустики, но и ещё они иногда растут там, где не надо - например в зданиях (по краям), хотя на самой маске там не был указан какой-либо детейл. Это либо надо с запасом брать и рисовать маску, либо хз. Надо экспериментировать.

Во всём виновата аппроксимация. Размер маски не позволяет делать сверточную расстановку травы. Или маска должна быть больших размеров 4096*4096
dromundus
надо сделать так что бы у неписей патроны заканчивались.....Что бы бегал и искал на базе схемы мародёрства...Хоть какая цель будет в их бессмысленном существовании .. и с едой тоже пусть ищут или покупают...
Vampir35
Одной из самых важных правок, лично для меня, является возможность работать с костями худовых моделей, реализованная в X-RAY Extensions. Получение позиции кости, установление/получение видимости кости, вот эти правки хочется видеть в новой версии движка.
Также вопрос:
изменение параметров оружия во время игры в том же X-RAY Extensions перенесено? Или оно относилось к универсальному хаку актора? В этом моменте немного на разобрался.
Заранее спасибо.
umad
K.D, вопрос - у вас в ОГСЕ Камикадзе написал скриптоввю боевку для неписей взамен движковой. Так вот - имеет ли смысл перенести ее в движок вместо старой?
Vampir35
Цитата(umad @ 11.07.2014, 13:00) *
K.D, вопрос - у вас в ОГСЕ Камикадзе написал скриптоввю боевку для неписей взамен движковой. Так вот - имеет ли смысл перенести ее в движок вместо старой?

А зачем? Почему бы не оставить ее скриптовой? Имхо, лишняя работа для людей только.
macron
Предлагаю, если возможно, пофиксить, чтобы при вылетах связанных со спавнами/логикой, в лог с фразой типа:

Цитата
FATAL ERROR

[error]Expression : child
[error]Function : xrServer::Perform_destroy
[error]File : E:\stalker\sources\trunk\xr_3da\xrGame\xrServer_sls_clear.cpp
[error]Line : 22
[error]Description : child registered but not found [36118]

в квадратных скобках выводилось не непонятное цифровое внутриигровое обозначение проблемного объекта, а конкретное название из спавна.
Modera
Цитата
непонятное цифровое внутриигровое обозначение проблемного объекта

Это же айди. Но сего объекта всё-ровно не существует, судя по описанию вылета.
Pavel_Blend
Люди, а сложно ли сделать редактор погоды в игре? Т.е. запустил уровень, и в реальном времени видишь результат настройки, изменяя значения в полях или передвигая ползунки.

И ещё: взять из движка или из сдк всё, что относится к рендеру и сделать просмотрщик моделей ogf, object, geom ... Что бы производительность была нормальной. К примеру, level.geom игра без тормозов тянет, а вьюверы врядли смогут столько полигонов без лагов держать. Реально ли сделать так, чтобы производительность во вьюверах была как в игре при таком же количестве полигонов, текстур и т.д.?
Tron
Можно
Ронин
Цитата(Pavel_Blend @ 21.07.2014, 15:04) *
Люди, а сложно ли сделать редактор погоды в игре? Т.е. запустил уровень, и в реальном времени видишь результат настройки, изменяя значения в полях или передвигая ползунки.

Было бы неплохо..

Насчет СДК, почему бы не сделать единую оболочку для всех редакторов? Например, вверху сделать 4 кнопки для переключения режимов АЕ - LE - SE - PE. Ну или еще как-нибудь.
Trollz0r
Pavel_Blend, Scarabay
как говаривал в свое время Сергей Григорович - "sweet dreams, are made of this" z_lol1.gif
Tron
Цитата(RedPython @ 23.07.2014, 00:53) *
Pavel_Blend, Scarabay
как говаривал в свое время Сергей Григорович - "sweet dreams, are made of this" z_lol1.gif

Я уже писал как это делается.
Trollz0r
написать, как делается, могу и я. проблема в том, чтобы _сделать_
Tron
Цитата(RedPython @ 23.07.2014, 12:03) *
написать, как делается, могу и я. проблема в том, чтобы _сделать_

Ну это уже кому интересно будетsmile.gif
lafugix
Можно ли как-нибудь отключить "оптимизацию" статики при компиляции уровней? Из-за нее просто невозможно детализированные модели ставить как статику.
Borovos
Hello programmers,

Sorry, if i write in english, but i don't speak russian and googletranslator isn't a good way.

I'm not a programmer, so this is a list of ideas/changes for SDK/Xray:
- Increase the maximum polygon/vertex value for dynamic object, to create more detailed skins or dynamic anomaly (as the old liana)

- Fix sound_occ:
A vertical plan sound_occ is working (as around the ClearSky base in Marsh) but boxes and horizontal plan aren't perfect. I'm thinking about a sound_occ around a short underground place, like a cavern, the Bar...
About the same subject, fix Sound_env could be fine.

Activate this function:
LE>Object Library>Properties> Sort by: Name/Texture/Shader

Improve the grass system:
LE>Scenes>Detail Objects:
The current "Clear Slots" button is in fact a "reset all slots" function.
It could be perfect to select few slot and delete them, not all.
Like this, a level designer can create easily a way in grass, polish grass around buildings or roads or crevasse as example.
This way could be better than working with _det and _mask textures (this current system is a approximate way, because textures never fit exactly to the object).
Fix misplaced grass object (grass object is flying in case of slope)

In the same way ,the ability to edit properties to each slot could be very fine too.
I dream to edit properties slot by slot : delete grass, edit grass density, resize object and edit the object list.

LE>Scenes>Aimap:
Add a restriction to "aimap generate" function (no link between two aimap slots if the distance is too high)

To finish, i'm very interesting by all improvement in CoP engine and SDK. Keep up your good work.

Best regards



Tron
Цитата(Borovos @ 29.09.2014, 20:20) *
- Fix sound_occ:
A vertical plan sound_occ is working (as around the ClearSky base in Marsh) but boxes and horizontal plan aren't perfect. I'm thinking about a sound_occ around a short underground place, like a cavern, the Bar...
About the same subject, fix Sound_env could be fine.

Fixed in my fork(but not public,currently)
You can fix it manually,you must just compare sound-system files of COP and CS
Borovos
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
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
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
K.D.
Цитата(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.
Borovos
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
Цитата(K.D. @ 23.10.2014, 22:59) *
HDR

А вот Lost Coast например специально сделали, чтобы похвастаться свежевнедренным в игровой движок хдром shuffle.gif
lvg_brest
Правки некоторых движковых ошибок ТЧ 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
Наверное это из разряда губу раскатал, но все же предложу...
Возможно ли добавить gloss? Помимо имеющегося spec канала в бамп файле в канале R, если не путаю.
lvg_brest
Правки некоторых движковых ошибок ТЧ 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
lvg_brest, а ты умеешь с патчами работать smile.gif
K.D.
Цитата(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
Цитата(K.D. @ 07.12.2014, 15:36) *
Не совсем понял, зачем это исправлять? Это не ошибки, это сигнал аварийного прерывания игры.

Не обязательно аварийно прерывать игру во всех случаях. Можно послать в лог сообщение о нештатной ситуации и вернуть значение, которое движок и скрипты нормально отработают. Если посмотреть в исходники ЗП, например, видно что разработчики применяли аналогичные решения, в отличие от ТЧ, наверное пришло с опытом. Вылетать не обязательно, если есть иное решение в виде адекватной отработки нештатной ситуации. Но, повторюсь, это не панацея от ошибок вообще: надо отлаживать свои моды для исключения (минимизации) скриптово/конфиговых причин вылетов.
hi_flyer
Цитата(lvg_brest @ 07.12.2014, 18:58) *
Исправлена ошибка с вылетом типа «there is no specified level in the game graph».

При тестировании 1.0007, было замечено что в некоторых случаях можно просто нажать "продолжить" при этой ошибке.
K.D.
Цитата(lvg_brest @ 07.12.2014, 18:03) *
Не обязательно аварийно прерывать игру во всех случаях.

Да я не про все говорю, а про эти. «there is no specified level in the game graph» - значит, кто-то заспавнился вне аи-сетки, и ситуация эта сама не решится, возврат левого уровня не поможет. Нужно соответственно модифицировать планировщики для мобов. «xrServer::Process_event_reject...e_parent && e_entity» означает проблемы с преждевременным удалением клиентского объекта. Затычка вылета означает гарантированные глюки и вылеты в дальнейшем, только зачастую без лога. Ничего из этого не будет нормально отработано чем бы то ни было.
Капитошка
Да уж, всё равно как лечить переломы ампутацией конечностей dry.gif
Da Man
Цитата(lvg_brest @ 07.12.2014, 16:03) *
Цитата(K.D. @ 07.12.2014, 15:36) *
Не совсем понял, зачем это исправлять? Это не ошибки, это сигнал аварийного прерывания игры.

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

Логи никто никогда не смотрит, соответственно ошибку никогда не исправят. А вот если игра будет падать - то никуда не отвертишься, придется фиксить smile.gif
AndreySol
А можно аналог cam_inert, но вверх\вниз ? Движок такое могет ?
lvg_brest
Правки некоторых движковых ошибок ТЧ 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
lvg_brest, было бы неплохо, если правки выкладывались в виде дифф-файлов.
chriotmao
Кто нибудь пилит движок зп? rolleyes.gif
Идея для исправлений:
1. Поднятие предмета происходит только тогда, когда выводится его иконка. Т.е. наводим курсор на предмет, загорается надпись "Поднять предмет "Х" " но он не подбирается. Тем самым невозможно подобрать некоторые тайники (напр. в подвалах ВНЗ Круг под лежащей решеткой или же напр. под мостом на юпитере, невозможно поднять СВУ.)
2. Не знаю баг или фитча, но предметы поднимаются группами, а не по одному. Наверное лучше бы тоже исправить.
Идея для добавлений:
1. В инвентаре в описании оружия выводится только 2 типа (иконки) используемых патронов, даже если оружие использует 3 и больше, из-за этого ПЫС выпилили некоторые типы патронов (напр. 12х70 Дротик, Снайперские 9x39 и т.д.) Стоит либо выпилить полностью, либо добавить все типы используемых. rolleyes.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.