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

    Чтобы получить возможность писать на форуме, оставьте сообщение в этой теме.
    Удачи!
  • Друзья, спешите принять участие в поэтическом конкурсе "Весенние поэты 2024"!
    Ждем именно вас!

    Ссылка на конкурсную тему - тык

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

N1kX


Модостроитель
Регистрация
13 Ноя 2009
Сообщения
5.871
Благодарности
5.309
Баллы
910
Сделал вот такую проверку сейчас.
На старте у ГГ все по дефолту, все таланты по 10%.
В диалоге с НПС поднимаем таланты до 22/22/30/30
Берем меч, получаем 30/22/30/30
Сохранение-загрузка и оверлей не слетает...
Получается плохая идея как-то менять стартовые таланты ГГ в самой инстанции.
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.340
Благодарности
3.186
Баллы
525
Получается плохая идея как-то менять стартовые таланты ГГ в самой инстанции.
Если не сделать это одноразовым явлением. А сделать можно, наверное.
 

N1kX


Модостроитель
Регистрация
13 Ноя 2009
Сообщения
5.871
Благодарности
5.309
Баллы
910
Сделал
Daedalus:
var int TempTalans;

func void TempTalante()
{
    if(TempTalans == FALSE)
    {
        var C_NPC her;
        her = Hlp_GetNpc(PC_Hero);
        TempTalans = TRUE;
        B_SetFightSkills1H(her,22);
       B_SetFightSkills2H(her,22);
       B_SetFightSkillsBow(her,30);
       B_SetFightSkillsCrossBow(her,30);
    };
};

instance PC_Hero(Npc_Default)
{
   name[0] = "Ja";
   guild = GIL_NONE;
   id = 0;
   voice = 15;
   level = 0;
   npcType = npctype_main;
   bodyStateInterruptableOverride = TRUE;
   exp = 0;
   exp_next = 700;
   lp = 0;
   attribute[ATR_STRENGTH] = 25;
    aivar[REAL_STRENGTH] = 25;
    attribute[ATR_DEXTERITY] = 25;
    aivar[REAL_DEXTERITY] = 25;
    attribute[ATR_MANA_MAX] = 25;
    aivar[REAL_MANA_MAX] = 25;
    attribute[ATR_MANA] = 25;
   attribute[ATR_HITPOINTS_MAX] = 120;
   attribute[ATR_HITPOINTS] = 120;
   Npc_SetTalentSkill(self,NPC_TALENT_MAGE,3);
   Npc_SetTalentSkill(self,NPC_TALENT_SNEAK,1);
   Npc_SetTalentSkill(self,NPC_TALENT_SMITH,1);
   PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_Fur] = TRUE;
   PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_Teeth] = TRUE;
   PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_Claws] = TRUE;
   PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_BFSting] = TRUE;
   PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_BFWing] = TRUE;
   PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_ReptileSkin] = TRUE;
   PLAYER_TALENT_TAKEANIMALTROPHY[TROPHY_Mandibles] = TRUE;
   Mdl_SetVisual(self,"HUMANS.MDS");
   Mdl_SetVisualBody(self,"hum_body_Naked0",9,0,"Hum_Head_Pony",Face_N_Player,0,ITAR_Vlk_NEW1);
   //B_SetFightSkills(self,10);
   /*B_SetFightSkills1H(self,22);
   B_SetFightSkills2H(self,22);
   B_SetFightSkillsBow(self,30);
   B_SetFightSkillsCrossBow(self,30);*/
   TempTalante();
};

instance ITWr_testingTalent(C_Item)
{
    name = "Test";
    mainflag = ITEM_KAT_DOCS;
    flags = ITEM_MISSION;
    value = 0;
    visual = "ItWr_Scroll_01.3DS";
    material = MAT_LEATHER;
    on_state[0] = Use_test;
    scemeName = "MAP";
    description = name;
};


func void Use_test()
{
    var string concatText;
    var string concatText2;
    var string concatText3;
    concatText = ConcatStrings("NPC_TALENT_1H = ",IntToString(self.HitChance[NPC_TALENT_1H]));
    concatText2 = ConcatStrings("REAL_TALENT_1H = ",IntToString(self.aivar[REAL_TALENT_1H]));
    concatText3 = ConcatStrings("REAL_STRENGTH = ",IntToString(self.aivar[REAL_STRENGTH]));
    PrintScreen(concatText,-1,36,FONT_ScreenSmall,10);
    PrintScreen(concatText2,-1,38,FONT_ScreenSmall,10);
    PrintScreen(concatText3,-1,40,FONT_ScreenSmall,10);
};
Увы не прокатило, анимация так же слетает.
Скорее всего функции Npc_SetTalentSkill прям важно, чтобы циферки менялись на стороне и она это видела, тогда и не происходит удаление оверлея.
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.340
Благодарности
3.186
Баллы
525
Гм, возможно, на стадии чтения данных из инстанции переменные ещё не могут быть использованы. В смысле, они в этот момент равны нулю. Припоминаю, сталкивался с чем-то подобным, когда хотел воткнуть костыли в распорядки неписей.

B_SetFightSkills1H(her,22);
Вот смотри. Эта функция вызывается в момент чтения данных из инстанции. И при этом в качестве аргумента указано значение "22". По этой причине в функции происходит сброс оверлея. Возможно, сброс оверлея приводит к невозможности его восстановления из сохранёнки. :oops:
 
Последнее редактирование:

D36


Модостроитель
Регистрация
3 Дек 2014
Сообщения
2.128
Благодарности
3.221
Баллы
485
Что происходит в движке Г2НВ при действии on_unequip у класса C_ITEM? В частности, интересует проверка требований экипированного оружия и его снятие, если после on_unequip амулета/кольца атрибуты ГГ снизились ниже этих требований (надели амулет - поднялась сила - надели оружие - сняли амулет - снизилась сила - оружие снялось само).
Проблема в том, что подобная проверка, похоже, происходит только при on_unequip и не происходит при снижении атрибутов с помощью Npc_ChangeAttribute, что приводит к зависанию оружия в экипированном состоянии и "двойному" снятию при снятии вручную. Также проверка затрагивает только силу и ловкость, из-за чего магический посох с требованием к максимальной мане и свиток "Кулак ветра" тоже могут зависнуть.
 

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.290
Благодарности
4.585
Баллы
625
D36, тут уже все давно пофикшено, если я правильно понял о чем идет речь Union - мини плагины
ЗЫ еще сам Union с 1.0h правит некоторые баги. Он хоть и помечен как тестовый, но по факту это стабильный рабочий билд
1587850395028.png
 

N1kX


Модостроитель
Регистрация
13 Ноя 2009
Сообщения
5.871
Благодарности
5.309
Баллы
910
Вот смотри. Эта функция вызывается в момент чтения данных из инстанции. И при этом в качестве аргумента указано значение "22". По этой причине в функции происходит сброс оверлея. Возможно, сброс оверлея приводит к невозможности его восстановления из сохранёнки. :oops:
Провел небольшие тесты.
Если делать изначальные таланты больше 29, тогда проблем не будет. При загрузке сохранения будет восстановлен талант равный 0, потом если у НПС значение таланта было больше 29, делаются нужные присвоения оверлея и самого таланта 1/2
Если делать 30-59%, тогда если талант перешел рубеж в 60%, к нему применится оверлей мастера, при сохранении, он будет удален и повторная экипировка не избавить от этой проблемы, оверлей будет утерян, останутся лишь оверлеи бойца/новичка.
Если делать 60+ проблемы нет (я не проверял с оружием, которое убавляет таланты, возможна потеря оверлея новичка/бойца).

Также проверил код NicoDE, он тоже терпит крах, наш такой проблемы не имеет.
Единственное, что неудобно, если нужно, чтобы НПС был с каким-то особыми параметрами, тогда придется делать присвоение талантов через диалог/триггер-скрипт прямо у начала игры.
Через инстанцию НПС и всяческими доп. функциями в самой инстанции не помогает - проверил очень много вариантов.
 

alex_draven


Модостроитель
Регистрация
13 Сен 2007
Сообщения
2.184
Благодарности
2.879
Баллы
420
Делайте как в Готике 1 и ничего слетать не будет. Проще всего просто оверлей прописать в инстанции и задать навык через SetTalentValue руками.
Ну и в целом в движке есть баг, когда он неправильно восстанавливает из сейва очередь оверлеев.
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.340
Благодарности
3.186
Баллы
525
N1kX, наверное, как уже посоветовал Укур, нужно назначать оверлеи для ГГ в функциях инициализации локаций. А в инстанции нужно выставить начальные значения талантов.
 

Хазариэл

Участник форума
Регистрация
13 Май 2018
Сообщения
53
Благодарности
51
Баллы
170
Как можно поменять текстуру брони не затрагивая оригинал? Для примера, беру штаны рудокопа, меняю их с броней наемников, получается что у наемников и рудокопов одна и та же броня, а если я изменю текстуру, то это затронет обе брони, но ведь можно переименовать текстуру и как-то указать путь к нужной модели?
 

N1kX


Модостроитель
Регистрация
13 Ноя 2009
Сообщения
5.871
Благодарности
5.309
Баллы
910
Как можно поменять текстуру брони не затрагивая оригинал? Для примера, беру штаны рудокопа, меняю их с броней наемников, получается что у наемников и рудокопов одна и та же броня, а если я изменю текстуру, то это затронет обе брони, но ведь можно переименовать текстуру и как-то указать путь к нужной модели?
Нужен голый оригинал доспехов в формате ASC
Плохой вариант: открываешь его в текстовом редакторе, ищешь текстуры по форме .tga, меняешь название текстуры. Компилируешь в игре вставкой этих доспехов), оригинальные доспехи должны быть удалены в _compiled и отключены anims.vdf/anims_addon.vdf
Хороший вариант: через blender/3d max экспортируешь доспехи туда, меняешь текстуру, сохраняешь модель, компилишь точно также.

У доспехов ты можешь посмотреть какие используются текстуры в их asc, обычно это тело - Hum_body.... + текстура доспехов (может ещё быть доп. текстуры, какие-то детали)

Если хочешь просто поменять текстуры без изменения самих доспехов, поставив G2mdk с распаковкой текстур они будут лежать в npc\armor, вот так и меняй на текстуру, которая тебе нужна.
 

Хазариэл

Участник форума
Регистрация
13 Май 2018
Сообщения
53
Благодарности
51
Баллы
170
Нужен голый оригинал доспехов в формате ASC
Плохой вариант: открываешь его в текстовом редакторе, ищешь текстуры по форме .tga, меняешь название текстуры. Компилируешь в игре вставкой этих доспехов), оригинальные доспехи должны быть удалены в _compiled и отключены anims.vdf/anims_addon.vdf
Хороший вариант: через blender/3d max экспортируешь доспехи туда, меняешь текстуру, сохраняешь модель, компилишь точно также.

У доспехов ты можешь посмотреть какие используются текстуры в их asc, обычно это тело - Hum_body.... + текстура доспехов (может ещё быть доп. текстуры, какие-то детали)

Если хочешь просто поменять текстуры без изменения самих доспехов, поставив G2mdk с распаковкой текстур они будут лежать в npc\armor, вот так и меняй на текстуру, которая тебе нужна.
Спасибо, попробую
 

Alwssmile

Участник форума
Регистрация
16 Май 2020
Сообщения
37
Благодарности
1
Баллы
60
Доброго времени суток! Подскажите пожалуйста, есть ли какой-нибудь мод, который показывал бы кого можно обворовать а кого нет. Где-то натыкался на такое но не могу найти, может кто поможет.
P.S. Если я не ошибаюсь такое было реализована в Возвращении...
 

deadcorpseeater

Участник форума
Регистрация
23 Янв 2019
Сообщения
13
Благодарности
0
Баллы
100
Добрый день. Интересно узнать, как заменить значения в скриптах Неофициального обновления Готика 2 НВ (которое в комплекте стим фикса идет). Декомпилировал Gothic.dat в gothic sourcer, изменил необходимые мне параметры, но при замене файла в work/scripts/compiled изменения не произошли. Почему?
 

N1kX


Модостроитель
Регистрация
13 Ноя 2009
Сообщения
5.871
Благодарности
5.309
Баллы
910
Добрый день. Интересно узнать, как заменить значения в скриптах Неофициального обновления Готика 2 НВ (которое в комплекте стим фикса идет). Декомпилировал Gothic.dat в gothic sourcer, изменил необходимые мне параметры, но при замене файла в work/scripts/compiled изменения не произошли. Почему?
1. Мод нужно пересобрать с твоим gothic.dat используя gothicvdfs, соблюдая все папки. Подробнее в этом уроке Структура модификации
2. Скрипты выложены на github, декомпиляция лишняя.
 

deadcorpseeater

Участник форума
Регистрация
23 Янв 2019
Сообщения
13
Благодарности
0
Баллы
100
1. Мод нужно пересобрать с твоим gothic.dat используя gothicvdfs, соблюдая все папки. Подробнее в этом уроке Структура модификации
2. Скрипты выложены на github, декомпиляция лишняя.
спасибо за информацию, постараюсь разобраться на днях

P.S. То есть теоретически я могу достать готик.дат из нынешней модификации, изменить, что мне нужно, и вернуть уже обновленный обратно?
 

N1kX


Модостроитель
Регистрация
13 Ноя 2009
Сообщения
5.871
Благодарности
5.309
Баллы
910
спасибо за информацию, постараюсь разобраться на днях

P.S. То есть теоретически я могу достать готик.дат из нынешней модификации, изменить, что мне нужно, и вернуть уже обновленный обратно?
Конечно.
Если серьезных изменений не было, пойдет на старых сохранениях, а так начало новой игры всегда требуется.
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.340
Благодарности
3.186
Баллы
525
P.S. То есть теоретически я могу достать готик.дат из нынешней модификации, изменить, что мне нужно, и вернуть уже обновленный обратно?
Во-первых, нужно использовать нормальные исходники скриптов, полученные от автора, а не декомпил. Декомпил может содержать ошибки. Во-вторых, следует иметь в виду, что некоторые изменения вступают в силу, только с началом новой игры. Иногда это может сбить с толку начинающего моддера.
 

deadcorpseeater

Участник форума
Регистрация
23 Янв 2019
Сообщения
13
Благодарности
0
Баллы
100
Daedalus:
var int levelupsduringtransform;

func void b_levelup(var int levels)
{
    hero.level += levels;
    if(PLAYERISTRANSFORMED == TRUE)
    {
        LEVELUPSDURINGTRANSFORM += levels;
    };
    hero.exp_next = (XP_PER_LEVEL / 1) * (hero.level + 0) * (hero.level + 0);
    hero.attribute[ATR_HITPOINTS_MAX] += levels * HP_PER_LEVEL;
    hero.attribute[ATR_HITPOINTS] += levels * HP_PER_LEVEL;
    hero.lp += levels * LP_PER_LEVEL;
    PrintScreen(PRINT_LevelUp,-1,YPOS_LevelUp,FONT_Screen,2);
    Snd_Play("LevelUp");
};

func int calculatelowerxp(var int add_xp)
{
    var int modifier;
    var int lower_xp;
    modifier = 100 - HARDMODEXPMODIFIER;
    lower_xp = (add_xp * modifier) / 100;
    return lower_xp;
};

func void B_GivePlayerXP(var int add_xp)
{
    var string concatText;
    if(HARDMODEENABLED == TRUE)
    {
        add_xp = calculatelowerxp(add_xp);
    };
    if(hero.level == 0)
    {
        hero.exp_next = XP_PER_LEVEL;
    };
    if(hero.attribute[ATR_HITPOINTS] > 0)
    {
        hero.exp += add_xp;
        if(add_xp >= 0)
        {
            concatText = PRINT_XPGained;
        }
        else
        {
            if(hero.exp < 0)
            {
                hero.exp = 0;
            };
            concatText = PRINT_XPLOST;
        };
        concatText = ConcatStrings(concatText,IntToString(add_xp));
        PrintScreen(concatText,-1,YPOS_XPGained,FONT_ScreenSmall,2);
        if(hero.exp >= hero.exp_next)
        {
            b_levelup(1);
        };
    };
    B_CheckLog();
};

func void b_givedeathxp(var C_Npc killer,var C_Npc victim)
{
    if((Npc_IsPlayer(killer) || ((killer.aivar[AIV_PARTYMEMBER] == TRUE) && !Npc_IsPlayer(victim))) && (victim.aivar[AIV_VictoryXPGiven] == FALSE) && (victim.level != 0))
    {
        B_GivePlayerXP(victim.level * XP_PER_VICTORY);
        victim.aivar[AIV_VictoryXPGiven] = TRUE;
    };
};

интересный вот скрипт по опыту. В классической готике, вроде бы, другой был. Не могу понять где искать значения XP_Per_Victory и XP_PER_LEVEL
 
Последнее редактирование модератором:
Сверху Снизу