• Уважаемые гости и новички, приветствуем Вас на нашем форуме
    Здесь вы можете найти ответы практически на все свои вопросы о серии игр «Готика» (в том числе различных модах на нее), «Ведьмак», «Ризен», «Древние свитки», «Эра дракона» и о многих других играх. Можете также узнать свежие новости о разработке новых проектов, восхититься творчеством наших форумчан, либо самим показать, что вы умеете. Ну и наконец, можете обсудить общие увлечения или просто весело пообщаться с посетителями «Таверны».

    Чтобы получить возможность писать на форуме, оставьте сообщение в этой теме.
    Удачи!

Не стесняюсь спросить....

4eserka

Участник форума
Регистрация
5 Авг 2024
Сообщения
5
Благодарности
0
Баллы
5
ElderGamer, слушай, знаю, что ты шаришь за MDS.
Не подскажешь, что отвечает за дальность использования с MDS объектами. Кузнеца, сундуки, факела, стулья и тд.
На стульях прописана одна, на верстак по ощущениям другая, мне нужно понять, где это можно редактировать. В самой МДС не нашел, в спейсере тоже, остаются похоже только скрипты.
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.408
Благодарности
3.238
Баллы
525
В скриптах есть файл Focus.d. Но мне кажется, тут вопросы к движку. :oops:
 

4eserka

Участник форума
Регистрация
5 Авг 2024
Сообщения
5
Благодарности
0
Баллы
5
В скриптах есть файл Focus.d. Но мне кажется, тут вопросы к движку. :oops:
фокус прям очень спорно, непонятно все равно, на основе чего новым верстакам прописывается расстояние контакта и тд...
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.408
Благодарности
3.238
Баллы
525
Гм, может, я неправильно тебя понял? О каком расстоянии ты говоришь? Может быть, ты имеешь в виду взаимодействие моделей на уровне анимаций?
 

4eserka

Участник форума
Регистрация
5 Авг 2024
Сообщения
5
Благодарности
0
Баллы
5
Гм, может, я неправильно тебя понял? О каком расстоянии ты говоришь? Может быть, ты имеешь в виду взаимодействие моделей на уровне анимаций?
Смотри, в самой игре при использование табуретки условной, анимация воспроизводится начинает гораздо дальше, чем при использование той же лабы алхимика.
В Г1 допустим к факелам ГГ вообще чуть ли не телепортируется, возможно там одинаковое расстояние, но по ощущениям это не так. Допустим сундук гг же не открывает с расстояния, как зажечь ту же стойку факела.
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.408
Благодарности
3.238
Баллы
525
На примере стула. В составе модели стула есть специальный объект для того, чтобы модель человека с ним взаимодействовала. Этот объект ZS_POS0_DIST выделен на скринах.

Анимация 1.jpg


Здесь стартовый кадр анимации взаимодействия. Модель человека телепортируется таким образом, чтобы базовая кость Bip01 совместилась с положением ZS_POS0_DIST.

Анимация 2.jpg


Здесь финальный кадр анимации взаимодействия. положение ZS_POS0_DIST хорошо видно.
 

RPD

Участник форума
Регистрация
13 Ноя 2023
Сообщения
118
Благодарности
3
Баллы
40
Такой вопрос:
Daedalus:
func void C_IsNpcRespawning(var C_NPC npc, var int firstCheck)
{
    if(Hlp_IsValidNpc(npc))
    {
        if(Npc_IsDead(npc))
        {
            if(firstCheck == true)
            {
                npc.aivar[AIV_WillRespawn] = false;
                Wld_InsertNpc(???),"NW_CITY_ENTRANCE_01");
            };
            if((firstCheck == false) && (npc.aivar[AIV_WillRespawn] == true))
            {
                Wld_InsertNpc(???,"NW_CITY_ENTRANCE_01");
            };
        }   else{ npc.aivar[AIV_WillRespawn] = true;};
    };
};

Daedalus:
func void B_RespawnDeadPeople(var int Fchk)
{
    var C_NPC npc001; npc001 = Hlp_GetNpc(Mil_326_Miliz);
    var C_NPC npc002; npc002 = Hlp_GetNpc(Mil_309_Stadtwache);
    var C_NPC npc003; npc003 = Hlp_GetNpc(Mil_310_Stadtwache);
    //...//

    C_IsNpcRespawning(npc001,Fсhk);
    C_IsNpcRespawning(npc002,Fсhk);
    C_IsNpcRespawning(npc003,Fсhk);
    //...//
};

Я в B_RespawnDeadPeople() получаю через Hlp_GetNpc() разных неписей, с которыми отдельной функцией произвожу необходимые мне махинации. Проблема заключается в том, что я в душе ни чаю, как мне из ссылки на нпс с класслм C_NPC получить инстанцию, чтобы вставить ее в Wld_InsertNpc(), где она необходима, ибо если просто вписать туда тот же var C_NPC npc - вылезет exception. Как это лучше реализовать? (Для справки: инстанция должна совпадать с проверяемым C_NPC npc)
 

D36


Модостроитель
Регистрация
3 Дек 2014
Сообщения
2.198
Благодарности
3.391
Баллы
485
RPD
Есть много вопросов по самой логике, но пока попробуй так:
Daedalus:
func void C_IsNpcRespawning(var int npcInstance,var int firstCheck)
{
    var C_Npc npc;
    npc = Hlp_GetNpc(npcInstance);
    if(Hlp_IsValidNpc(npc)) //а что делать если npc не валиден (не вставлен в мир или труп уже удален)?
    {
        if(Npc_IsDead(npc))
        {
            if(firstCheck == TRUE)
            {
                Wld_RemoveNpc(npcInstance); //удаляем труп
                Wld_InsertNpc(npcInstance,"NW_CITY_ENTRANCE_01"); //вставляем нового npc
                npc = Hlp_GetNpc(npcInstance); //берем ссылку на нового npc
                npc.aivar[AIV_WillRespawn] = FALSE;
            }
            else if(npc.aivar[AIV_WillRespawn] == TRUE)
            {
                Wld_RemoveNpc(npcInstance); //удаляем труп
                Wld_InsertNpc(npcInstance,"NW_CITY_ENTRANCE_01"); //вставляем нового npc
            };
        }
        else
        {
            npc.aivar[AIV_WillRespawn] = TRUE;
        };
    };
};

func void B_RespawnDeadPeople(var int firstCheck)
{
    C_IsNpcRespawning(Mil_326_Miliz,firstCheck);
    C_IsNpcRespawning(Mil_309_Stadtwache,firstCheck);
    C_IsNpcRespawning(Mil_310_Stadtwache,firstCheck);
};
 
Последнее редактирование:

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.408
Благодарности
3.238
Баллы
525
Если компилить Соурсером, то он, возможно, будет ругаться на неправильный тип аргумента в строке

Daedalus:
C_IsNpcRespawning(Mil_326_Miliz,Fсhk);

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

D36


Модостроитель
Регистрация
3 Дек 2014
Сообщения
2.198
Благодарности
3.391
Баллы
485
Если компилить Соурсером, то он, возможно, будет ругаться на неправильный тип аргумента в строке
Не будет, там теперь ожидается int. Так же сделано, например, для B_KillNpc в Г2НВ.
 

RPD

Участник форума
Регистрация
13 Ноя 2023
Сообщения
118
Благодарности
3
Баллы
40
RPD
Есть много вопросов по самой логике, но пока попробуй так:
Daedalus:
func void C_IsNpcRespawning(var int npcInstance,var int firstCheck)
{
    var C_Npc npc;
    npc = Hlp_GetNpc(npcInstance);
    if(Hlp_IsValidNpc(npc)) //а что делать если npc не валиден (не вставлен в мир или труп уже удален)?
    {
        if(Npc_IsDead(npc))
        {
            if(firstCheck == TRUE)
            {
                Wld_RemoveNpc(npcInstance); //удаляем труп
                Wld_InsertNpc(npcInstance,"NW_CITY_ENTRANCE_01"); //вставляем нового npc
                npc = Hlp_GetNpc(npcInstance); //берем ссылку на нового npc
                npc.aivar[AIV_WillRespawn] = FALSE;
            }
            else if(npc.aivar[AIV_WillRespawn] == TRUE)
            {
                Wld_RemoveNpc(npcInstance); //удаляем труп
                Wld_InsertNpc(npcInstance,"NW_CITY_ENTRANCE_01"); //вставляем нового npc
            };
        }
        else
        {
            npc.aivar[AIV_WillRespawn] = TRUE;
        };
    };
};

func void B_RespawnDeadPeople(var int firstCheck)
{
    C_IsNpcRespawning(Mil_326_Miliz,firstCheck);
    C_IsNpcRespawning(Mil_309_Stadtwache,firstCheck);
    C_IsNpcRespawning(Mil_310_Stadtwache,firstCheck);
};
Спасибо большое! Насчет невалидности нпс: все те нпс, которых я проверяю - всегда вставлены в мир. Я думаю, что проверка на валидность ссылки здесь вообще лишняя, НО только в случае, если функция Npc_IsDead обращается к инстанции нпс и проверяет его состояние. Если она обращается к ссылке на определенного нпс (а я почти уверен, что она так и делает) - то это действительно огромная проблема. В целом мне нужно просто корректно отследить состояние всех нпс, которых я проверяю и произвести следующие действия: Если нпс был мертв до вызова функции - возродить его и пометить, как "уже возрожденного", лишить права на очередное возрождение. Если жив - ничего не делать и оставить право на возрождение. Это во время первого вызова, о чем свидетельствует параметр firstCheck. Во время второго вызова возродить мертвого нпс, если у него есть право на возрождение (aivar[AIV_WillRespawn]) или выдать это право, но при этом не возрождать. Функция вызывается два раза.

P.S
Проверил, вроде отлично работает без доп проверок на валидность)
 
Последнее редактирование:

MazaHacker

Участник форума
Регистрация
15 Янв 2023
Сообщения
5
Благодарности
0
Баллы
20
Приветствую, кто может подсказать, где можно достать зен и меши колонии из Г1 для Г2?
 

MazaHacker

Участник форума
Регистрация
15 Янв 2023
Сообщения
5
Благодарности
0
Баллы
20
Доброго времени суток! Нужен ZEN старой шахты из Готики 1 для Готики 2, может кто-нибудь скинуть? Сам не смог найти.
 

Scarecrow

Участник форума
Регистрация
11 Авг 2014
Сообщения
163
Благодарности
85
Баллы
235
Подскажите пожалуйста, в г1 есть два неиспользуемых навыка (регенерация и мастер огня), как сделать, что бы они отображались в меню вместе с акробатикой и подкрадыванием? в мрачных тайнах например регенерацию заменили на ковку оружия и она отображалась. Как менять текст понятно, но как именно отобразить его на экране никак не могу найти.
 

D36


Модостроитель
Регистрация
3 Дек 2014
Сообщения
2.198
Благодарности
3.391
Баллы
485
Подскажите пожалуйста, в г1 есть два неиспользуемых навыка (регенерация и мастер огня), как сделать, что бы они отображались в меню вместе с акробатикой и подкрадыванием? в мрачных тайнах например регенерацию заменили на ковку оружия и она отображалась. Как менять текст понятно, но как именно отобразить его на экране никак не могу найти.
Две строки с "|" - значения навыков регенерации и мастера огня (GOTHIC.DAT - Story/Text.d):
Daedalus:
const string TXT_TALENTS_SKILLS[12] =
{
    "",
    "не обучен|обучен|мастер",
    "не обучен|обучен|мастер",
    "не обучен|обучен|мастер",
    "не обучен|обучен|мастер",
    "не обучен|обучен|мастер",
    "не обучен|обучен|мастер",
    "не обучен|Круг 1|Круг 2|Круг 3|Круг 4|Круг 5|Круг 6",
    "не обучен|обучен",
    "|",
    "|",
    "не обучен|обучен"
};

Поставь вместо них "не обучен|обучен" и они появятся в меню:
1726403315385.png
 
Сверху Снизу