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

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

Вопросы по скриптингу

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.371
Благодарности
7.804
Баллы
995
  • Первое сообщение
  • #1
Прежде чем задавать вопросы, ознакомьтесь с документацией..
1) Читать онлайн
2) Архив с офлайн-версией(chm) во вложении
 

Вложения

  • Vam_tutor.rar
    171,6 KB · Просмотры: 515
Последнее редактирование модератором:

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.943
Благодарности
936
Баллы
275
RPD, пиши код инстанции НПС. так тяжело угадывать чего ему не хватает для счастья.

if (Hlp_GetInstanceID(slf) == Hlp_GetInstanceID(Gil_666_Nikita)) // это новый НПС
тут надо получать ссылку на НПС или написать свою функцию. вот например код неоф. обновл. D36. ещё бы для счастья добавить проверку на Hlp_IsValidNpc :)

Daedalus:
func int C_IsNpc(var C_Npc slf,var int npcInstance)
{
    var C_Npc npc;
    npc = Hlp_GetNpc(npcInstance);
    if(Hlp_GetInstanceID(slf) == Hlp_GetInstanceID(npc))
    {
        return TRUE;
    };
    return FALSE;
};

тогда
Daedalus:
func int B_SelectSpell (var C_NPC slf, var C_NPC oth)
{
        ...
        if (C_IsNpc(slf,Gil_666_Nikita)) // это новый НПС
        {
            return B_ReadyRune(slf, ItRu_Firerain); // B_ReadyRune возвращает true
        };
        ...
};
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.943
Благодарности
936
Баллы
275
(ну может чередовать с милишкой, но это сложнее).

Код:
func int B_SelectSpell (var C_NPC slf, var C_NPC oth)
{
        ...
        if (C_IsNpc(slf,Gil_666_Nikita)) // это новый НПС
        {
            if(slf.aivar[AIV_SelectSpell] >= 3) // сделал три каста
            {
                return false; // отказ от магии. будет пытаться достать оружие
            };
            return B_ReadyRune(slf, ItRu_Firerain); // B_ReadyRune возвращает true
        };
        ...
};

значение aivar[AIV_SelectSpell] увеличивается непосредственно после каста. внутри B_SelectSpell его руками изменять не надо, так как до фактического каста в игре на уровне скриптов B_SelectSpell может быть вызван несколько раз. из-за этого можно наблюдать всякие глюки у ищущих когда они достают магию и не сделав каста её меняют.
 

RPD

Участник форума
Регистрация
13 Ноя 2023
Сообщения
76
Благодарности
2
Баллы
20
Код:
func int B_SelectSpell (var C_NPC slf, var C_NPC oth)
{
        ...
        if (C_IsNpc(slf,Gil_666_Nikita)) // это новый НПС
        {
            if(slf.aivar[AIV_SelectSpell] >= 3) // сделал три каста
            {
                return false; // отказ от магии. будет пытаться достать оружие
            };
            return B_ReadyRune(slf, ItRu_Firerain); // B_ReadyRune возвращает true
        };
        ...
};

значение aivar[AIV_SelectSpell] увеличивается непосредственно после каста. внутри B_SelectSpell его руками изменять не надо, так как до фактического каста в игре на уровне скриптов B_SelectSpell может быть вызван несколько раз. из-за этого можно наблюдать всякие глюки у ищущих когда они достают магию и не сделав каста её меняют

исправил, работает. c_is_npc крашил игру, я без него поставил. Все отлично, спасибо. Все таки это не чередование, а просто после достижения счетчиком значения нпс берет меч и с ним и остается до нового сражения. Я попробую сам что-нибудь придумать уже :) Проблему нашел одну только, может это и нормально - нпс при протыкании и возвращении в анимацию PracticeSword роняет меч и машет рукой) может есть идеи?
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.340
Благодарности
3.186
Баллы
525
как заставить нпс нападать первым, причем на всех абсолютно при их виде
Среди активных восприятий неписей есть восприятие персонажа под управлением игрока PERC_ASSESSPLAYER, восприятие врага PERC_ASSESSENEMY и восприятие персонажа в боевом режиме PERC_ASSESSFIGHTER. Последнее в Г2, кажется, не используется. Ни одно из них не подходит под решение твоей задачи, если только не сделать так:
создать новую гильдию и сделать враждебной ко всем остальным

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

ElderGamer


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

RPD

Участник форума
Регистрация
13 Ноя 2023
Сообщения
76
Благодарности
2
Баллы
20
Нужно править функции выбора оружия. У меня в мод-фиксе маги умеют браться за саблю, если доступные им заклинания не подходят в конкретной ситуации боя против конкретного противника. Но это не "пара строк" кода. Там чутка посложнее будет. Если хочешь, могу дать ссылку на скрипты, сам посмотри
Да, пожалуйста!
 

ElderGamer


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

RPD

Участник форума
Регистрация
13 Ноя 2023
Сообщения
76
Благодарности
2
Баллы
20
1699971813679.png
Запутался я в этом квадрате. Как все тут распределяется?
 

N1kX


Модостроитель
Регистрация
13 Ноя 2009
Сообщения
5.879
Благодарности
5.326
Баллы
910
Мне бы понять в каком порядке они расставлены, как именно, принцип
Возьми MDK скрипты из установщика G2MDK, в которых все понятно, что и куда. Пользоваться декомпилом без коментов брх.
 

RPD

Участник форума
Регистрация
13 Ноя 2023
Сообщения
76
Благодарности
2
Баллы
20
Хочу реализовать появление нового экземпляра нпс после смерти предыдущего в x метрах от точки, где умер прошлый . Звучит просто, однако у меня нет определенного понимания, куда именно писать функции и как и где их вызывать. Помогите, пожалуйста.
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.943
Благодарности
936
Баллы
275
RPD, найти внутри функции zs_dead подходящее место.
Сделай проверку на то погиб ли твой НПС. Далее сделай проверку где находится сейчас нпс и в зависимости от его местонахождения вставляй нового нпс на то или иное место.
Daedalus:
func void ZS_Dead ()
{
    ...
    var c_npc npc; npc = Hlp_GetNpc(sld_666_name);
    if Hlp_GetInstanceID(self) == Hlp_GetInstanceID(npc)
    {
        var string Insertwp;
        if      (Npc_GetDistToWP(npc,"OW_NEWMINE_03")<2500)     { Insertwp = "OW_NEWMINE_03_b";   }
        else if (Npc_GetDistToWP(npc,"OW_NEWMINE_05")<2500)     { Insertwp = "OW_NEWMINE_05_b";   }
        else if (Npc_GetDistToWP(npc,"OW_NEWMINE_09")<2500)     { Insertwp = "OW_NEWMINE_09_b";   };
   
        Wld_InsertNpc(sld_333_name, Insertwp);
    };
    ...
};
 
Последнее редактирование:

RPD

Участник форума
Регистрация
13 Ноя 2023
Сообщения
76
Благодарности
2
Баллы
20
RPD, найти внутри функции zs_dead подходящее место.
Сделай проверку на то погиб ли твой НПС. Далее сделай проверку где находится сейчас нпс и в зависимости от его местонахождения вставляй нового нпс на то или иное место.
Daedalus:
func void ZS_Dead ()
{
    ...
    var c_npc npc; npc = Hlp_GetNpc(sld_666_name);
    if Hlp_GetInstanceID(self) == Hlp_GetInstanceID(npc)
    {
        var string Insertwp;
        if      (Npc_GetDistToWP(npc,"OW_NEWMINE_03")<2500)     { Insertwp = "OW_NEWMINE_03_b";   }
        else if (Npc_GetDistToWP(npc,"OW_NEWMINE_05")<2500)     { Insertwp = "OW_NEWMINE_05_b";   }
        else if (Npc_GetDistToWP(npc,"OW_NEWMINE_09")<2500)     { Insertwp = "OW_NEWMINE_09_b";   };
  
        Wld_InsertNpc(sld_333_name, Insertwp);
    };
    ...
};

Всегда опасался вставлять проверку для конкретных нпс в код главных функций. Типа всякие лаги там, подвисания. Оказывается это вполне нормально?
 

ElderGamer


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

D36


Модостроитель
Регистрация
3 Дек 2014
Сообщения
2.128
Благодарности
3.221
Баллы
485
Wld_InsertNpc(sld_333_name, Insertwp);
Возможно, лучше будет использовать Wld_SpawnNpcRange, как в заклинаниях вызова. Точное расстояние или точку нельзя будет указать, но появление всегда будет рядом с погибшим.
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.943
Благодарности
936
Баллы
275
Наверное, правильным будет пометить таких особых неписей особым флагом, и уже по флагу запускать проверку, какой именно квестовый непись помер.
а смысл? если НПС уникальный можно сразу сделать проверку по его айди.



лучше будет использовать Wld_SpawnNpcRange,
а как сделать бессрочный вызов? указать вместо времени "-1" ?
 
Последнее редактирование:
Сверху Снизу