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

    Чтобы получить возможность писать на форуме, оставьте сообщение в этой теме.
    Удачи!
  • Друзья, доброго времени суток!
    Стартовал новый литературный конкурс от "Ордена Хранителей" - "Пираты Миртанского моря".
    Каждый может принять в нём участие и снискать славу и уважение, а в случае занятия призового места ещё и получить награду. Дерзайте
  • Дорогие друзья, год подходит к концу, и пришло время подвести его итоги и наградить достойных

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

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

MaGoth

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

Вложения

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

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.931
Благодарности
560
Баллы
275
Приветствую всех, у меня всё тот же вопрос.
Подскажите, пожалуйста, что я здесь делаю не так?
Daedalus:
func void player_mob_missing_lockpick()
{
    var int rnd;
    var int UnionPickLockStrNum;
    var int DEX_Lock_KTS_1
   
    DEX_Lock_KTS_1 = hero.attribute[ATR_DEXTERITY] / 10;
   
    if(!Npc_GetTalentSkill(hero,NPC_TALENT_PICKLOCK))
    {
        Print(PRINT_NoPicklockTalent);
        AI_PlayAni(self,"T_DONTKNOW");
        B_Say_Overlay(self,self,"$NOPICKLOCKTALENT");
    }
    if(UnionPickLockStrNum >= DEX_Lock_KTS_1)
    {
        Print("Нужно больше ловкости");
        AI_PlayAni(self,"T_DONTKNOW");
        B_Say_Overlay(self,self,"$MISSINGITEM");
    }
    else
    {
        AI_PlayAni(self,"T_DONTKNOW");
        rnd = Hlp_Random(2);
        if(rnd == 0)
        {
            Print(PRINT_PicklockMissing);
            B_Say_Overlay(self,self,"$PICKLOCKMISSING");
        }
        else if(rnd == 1)
        {
            Print("У меня больше нет отмычек!");
            B_Say_Overlay(self,self,"$NOMOREPICKS");
        };
    };
};
 

Slavemaster


Модостроитель
Регистрация
10 Июн 2019
Сообщения
1.086
Благодарности
1.910
Баллы
320
KirTheSeeker, разве UnionPickLockStrNum не должна быть глобальной переменной?
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.931
Благодарности
560
Баллы
275

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.011
Благодарности
981
Баллы
295
Сделай глобальной.
KirTheSeeker, глобальная это когда переменная пишется в самом начале файла
Daedalus:
    var int UnionPickLockStrNum;


func void player_mob_missing_lockpick()
{
    var int rnd;
    var int DEX_Lock_KTS_1
 
    DEX_Lock_KTS_1 = hero.attribute[ATR_DEXTERITY] / 10;
 
    if(!Npc_GetTalentSkill(hero,NPC_TALENT_PICKLOCK))
    {
        Print(PRINT_NoPicklockTalent);
        AI_PlayAni(self,"T_DONTKNOW");
        B_Say_Overlay(self,self,"$NOPICKLOCKTALENT");
    }
    if(UnionPickLockStrNum >= DEX_Lock_KTS_1)
    {
        Print("Нужно больше ловкости");
        AI_PlayAni(self,"T_DONTKNOW");
        B_Say_Overlay(self,self,"$MISSINGITEM");
    }
    else
    {
        AI_PlayAni(self,"T_DONTKNOW");
        rnd = Hlp_Random(2);
        if(rnd == 0)
        {
            Print(PRINT_PicklockMissing);
            B_Say_Overlay(self,self,"$PICKLOCKMISSING");
        }
        else if(rnd == 1)
        {
            Print("У меня больше нет отмычек!");
            B_Say_Overlay(self,self,"$NOMOREPICKS");
        };
    };
};
Пост автоматически объединён:

твоя задача объявить у себя где-нибудь var int UnionPickLockStrNum; и тогда плагин будет его обновлять
плагин что делает? просто записывает в UnionPickLockStrNum кол-во успешных поворотов? или на уровне движка не даёт открывать дальше?
 
Последнее редактирование:

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.931
Благодарности
560
Баллы
275
плагин что делает? просто записывает в UnionPickLockStrNum кол-во успешных поворотов?
Верно, но не кол-во "успешных" поворотов, а сколько НУЖНО этих самых поворотов для открытия конкретного замка.
Дальше нужно сравнить эту переменную с DEX/10, и просто не давать взаимодействовать с замком, если UnionPickLockStrNum >= DEX/10.
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.011
Благодарности
981
Баллы
295

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.931
Благодарности
560
Баллы
275
если это всё что делает плагин тогда https://worldofplayers.ru/threads/13039/page-201#post-1165568
Типа этого?
Daedalus:
var int UnionPickLockStrNum;

func void G_PickLock(var int bSuccess,var int bBrokenOpen)
{
    var int rnd;
    var int DEX_Lock_KTS_1   
    DEX_Lock_KTS_1 = hero.attribute[ATR_DEXTERITY] / 10;
    
    if(UnionPickLockStrNum >= DEX_Lock_KTS_1)
    {
        Print("Нужно больше ловкости.");
        AI_PlayAni(self,"T_DONTKNOW");
        B_Say_Overlay(self,self,"$MISSINGITEM");
    }
    if(bSuccess)
    {
        if(bBrokenOpen)
        {
            TotalLocksPicked += 1;
            //Snd_Play3d(self,"PICKLOCK_UNLOCK");
            //Print(PRINT_PICKLOCK_UNLOCK);
        }
        else
        {
            Snd_Play3d(self,"PICKLOCK_SUCCESS");
            Print(PRINT_PICKLOCK_SUCCESS);
        };
    }
    else if(bBrokenOpen)
    {
        Snd_Play3d(self,"PICKLOCK_BROKEN");
        Print(PRINT_PICKLOCK_BROKEN);
        rnd = Hlp_Random(100);
        if(rnd <= 25)
        {
            Npc_SendPassivePerc(hero,PERC_ASSESSQUIETSOUND,hero,hero);
        };
    }
    else
    {
        Snd_Play3d(self,"PICKLOCK_FAILURE");
        Print(PRINT_PICKLOCK_FAILURE);
    };
};

3.png
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.011
Благодарности
981
Баллы
295
var int rnd;
var int DEX_Lock_KTS_1 ;
DEX_Lock_KTS_1 = hero.attribute[ATR_DEXTERITY] / 10;

if(UnionPickLockStrNum >= DEX_Lock_KTS_1)
{
Print("Нужно больше ловкости.");
AI_PlayAni(self,"T_DONTKNOW");
B_Say_Overlay(self,self,"$MISSINGITEM");
} ;
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.931
Благодарности
560
Баллы
275
var int rnd;
var int DEX_Lock_KTS_1 ;
DEX_Lock_KTS_1 = hero.attribute[ATR_DEXTERITY] / 10;

if(UnionPickLockStrNum >= DEX_Lock_KTS_1)
{
Print("Нужно больше ловкости.");
AI_PlayAni(self,"T_DONTKNOW");
B_Say_Overlay(self,self,"$MISSINGITEM");
} ;
Так, сообщение отображается корректно, но ГГ всё таки начинает взаимодействие с сундуком.
Как здесь можно прописать отказ от взаимодействия?
Типа такого?
Код:
if(UnionPickLockStrNum >= DEX_Lock_KTS_1)
    {
        Print("Нужно больше ловкости.");
        AI_PlayAni(self,"T_DONTKNOW");
        B_Say_Overlay(self,self,"$MISSINGITEM");
    };
    return
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.011
Благодарности
981
Баллы
295
Так, сообщение отображается корректно, но ГГ всё таки начинает взаимодействие с сундуком.
Как здесь можно прописать отказ от взаимодействия?
это надо попросить совета у ElderGamer у него большой опыт в таких делах и много наработок.
 

D36


Модостроитель
Регистрация
3 Дек 2014
Сообщения
2.224
Благодарности
3.454
Баллы
485
Подскажите пожалуйста почему не работает заклинание. ГГ просто садится на одно колено и все. Заклинание превращение в вепря.
Стандартными средствами можно только заменить существующие заклинания превращения. Используй для SPL_SummonBoar значения 47-58 от существующих SPL_Trf* и убери из Spell_ProcessMana заменяемое заклинание.

Подскажите почему призванный зверь пропадает при трансформации, и можно это как-то исправить?
Покажи заклинание призыва и инстанцию призываемого зверя.
 

iLoveHeavyMetal

Участник форума
Регистрация
15 Авг 2019
Сообщения
1.158
Благодарности
1.228
Баллы
280
Есть кто то кто разбирается в скриптах готики 3, есть ряд проблем которые созданы, по моему скорее всего скриптами. Инструменты моддинга позволяют настраивать урон нпс по нпс, HP, SP, MP нпс, но эти изменения не работают в игре после, я так полагаю есть какие то ограничения, наложенные как заплатки через скрипты, для достижения играбельности с минимальными вложениями усилий. У меня есть желание, вручную проработать всех нпс в игре, потому было бы очень полезно если кто то глянул скрипты г3, может можно увидеть наложенные ограничения, быстрые фиксы какие либо направленные на параметры нпс в игре.
Сейчас есть только два параметра которые регулируют урон хп нпс, это уровни, все остальное игра не учитывает, по герою добавляется урон оружия, но не стрелкового, стрелковый урон, так же высчитывается по уровню.
Так же может на примере г 2 поможет кто с вопросом, нужен параметр для дистанции стрельбы нпс, с которой они начинают стрелять по противнику, в г 3 дистанция ничтожно низкая, возможно параметр будет иметь такую же строчку и в г3, ну и совет нужен где его стоит искать, в общем ини, или это более глубокие параметры интеллекта? Может кто то разбирающийся опытным взглядом скрипты взглянуть и посмотреть какие там есть параметры настраиваемые в интересующих меня вопросах?
 
Последнее редактирование:

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.410
Благодарности
3.241
Баллы
525
надо попросить совета у @ElderGamer
Я уже выше писал, что функция player_mob_missing_lockpick, как я думаю, вызывается движком в случаях, если
Здесь описаны действия при попытке открыть замок, а) не имея навыка вскрытия замков отмычками и б) имея навык, но не имея отмычек в инвентаре. Функция автоматически вызывается движком в этих случаях.
Вызов этой функции в случае, когда ГГ изучил навык вскрытия замков и имеет в инвентаре отмычки, не должен производиться. Незачем это. Соответственно, она не подходит для той цели, которую поставил перед собой KirTheSeeker. Если я правильно понял задачу - прервать взаимодействие, если замок слишком сложный. Или не начинать взаимодействия в этом случае.

Так, сообщение отображается корректно, но ГГ всё таки начинает взаимодействие с сундуком.
Из этого следует, что функция всё-таки была вызвана. Не понимаю, как это происходит. Если движок разрешил взаимодействие с объектом, зачем ему вызывать функцию, где объясняется отказ от взаимодействия? Может, плагины там что-то накосячили? :oops:
 

ElderGamer


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

iLoveHeavyMetal

Участник форума
Регистрация
15 Авг 2019
Сообщения
1.158
Благодарности
1.228
Баллы
280
Какая дистанция имеется в виду? Описание может быть понято в разных вариантах. Например, можно подумать, что речь идёт о дистанции перехода в режим атаки, когда противник приближается к неписю.
Нпс видин противника дальше чем начинает в него стрелять. Агр происходит сразу, потом нпс бежит к противнику, и сократив дистанцию вдвое начинает стрелять. Нужно что бы стрелять начинал как только увидит. В большей степени интересуют именно спутники
 
Последнее редактирование:

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.410
Благодарности
3.241
Баллы
525
Нужно что бы стрелять начинал как только увидит.
Как устроены скрипты Г3, не имею ни малейшего понятия. Также не знаю, как устроен ИИ в Г3. Но поиграв в прошлом году в Элекс, я поймал себя на мысли, что за прошедшие годы ИИ в игре мало изменился. Скриптеры используют те же подходы и решения, что и в Г1.

ИИ в Г1 построен на восприятиях. Есть активные восприятия, которые работают постоянно, с определённой периодичностью, например, раз в секунду. Есть пассивные восприятия, которые работают по факту возникновения события, например, убийство одного персонажа другим персонажем. Дистанция работы активных восприятий задаётся в инстанции непися параметром senses_range. У разных неписей этот параметр может быть разным. Дистанция работы пассивных восприятий задаётся в специальной функции в скриптах InitPerceptions. Эти дистанции одинаковы для всех неписей.

В число активных восприятий входит восприятие врага PERC_ASSESSENEMY. Если в радиусе senses_range от непися оказывается персонаж, к которому непись настроен враждебно, начинает периодически вызываться скриптовая функция-обработчик восприятия, например, B_AssessEnemy. В этой или в подобной ей функции производится анализ обстановки и выбираются действия непися. Причём, факт вызова этой функции не означает немедленного перехода в состояние атаки. В функции может анализироваться расстояние до противника и сравниваться со значениями констант, прописанных в скриптах, или переменных, прописанных в инстанции непися в качестве порогов для реакции. В Г1 у каждого непися есть целочисленный массив переменных ИИ aivar. И вот в этом массиве могут храниться такие переменные, например, как aivar[AIV_MM_PercRange] или aivar[AIV_MM_AttackRange]. Первая переменная определяет дистанцию, при превышении которой непись (в данном случае это монстр или орк) вообще не реагирует на врага, даже если враг находится внутри зоны радиусом senses_range. Вторая переменная определяет дистанцию перехода в состояние атаки, если ИИ предусматривает какое-то промежуточное состояние между обнаружением присутствия врага и стартом атаки (предупреждение врага, чтобы тот не приближался, например).

Возможно, что-то подобное есть и в Г3. Думаю, что там примерно также всё устроено.
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.011
Благодарности
981
Баллы
295
Из этого следует, что функция всё-таки была вызвана. Не понимаю, как это происходит. Если движок разрешил взаимодействие с объектом, зачем ему вызывать функцию, где объясняется отказ от взаимодействия? Может, плагины там что-то накосячили? :oops:
он всё таки перенёс в G_PickLock. соответственно теперь происходит вызов после каждого поворота отмычка. вопрос в том как на скриптах корректно прервать взаимодействие с сундуком и встать.
 
Последнее редактирование:

WoOliN

Участник форума
Регистрация
13 Окт 2012
Сообщения
347
Благодарности
196
Баллы
210
AI_Standup(hero);
или попробуй
AI_StopProcessInfos(hero);
или может даже
Npc_ClearAIQueue(hero);
AI_StandUpQuick(hero);


Фиг знает, что ты там задумал)
 
Последнее редактирование:
Сверху Снизу