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

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

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

Saturas


Модостроитель
Регистрация
11 Фев 2009
Сообщения
2.512
Благодарности
1.332
Баллы
315
какие триггеры? вы что полоумные тут все? Кошмар! У нпс есть восприятие игрока, вызывается оно постоянно, просто объявляешь переменную, и по завершении диалога ее инкриментируешь, и когда она достигает нужного значения из восприятия нпс запускаешь диалог с гг.

p.s. вообще, по хорошему я бы закрыл раздел модостроения, и ввел бы капчу с кучей рандомных вопросов по логике работы скриптовых потрахов готана, ибо эти вопросы это просто кошмар какойто.

B_AssessPlayer() тут. по моему каждую секунду вызывается этот блок.
 
Последнее редактирование:

Myxomop

Почетный форумчанин
Регистрация
28 Май 2005
Сообщения
3.235
Благодарности
2.575
Баллы
455
Можно ли в инстанции самого диалога выставить границы времени,в которых НПС после предыдущего разговора с ГГ "уйдет в несозанку ненадолго"?
В предыдущем диалоге ставишь:
Npc_SetRefuseTalk(self,60);
собеседник self не будет доступен ГГ в течение 60 секунд.
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.331
Благодарности
3.178
Баллы
525
Npc_SetRefuseTalk(self,60);
Это только установка персонального таймера. Для проверки его состояния в condition-функции диалога должно проверяться условие
Код:
if(!Npc_RefuseTalk(self))

Но с использованием этого таймера нужно быть осторожным. Если таймер обнуляется в момент, когда открыто окно с выбором опций диалога с неписем, то при выборе опций диалога возможна путаница - игрок выберет одну опцию, а стартует другой диалог. Во всяком случае, это имеет место в Г1.

B_AssessPlayer() тут. по моему каждую секунду вызывается этот блок
Периодичность может быть разной. Но дело не в этом. Такой подход имеет изъяны. Во-первых, ГГ может удалиться от непися на расстояние, когда у него перестанет работать ИИ, в том числе и восприятие ГГ. Во-вторых, активные восприятия НЕ РАБОТАЮТ, если непись не видит того, на кого они рассчитаны (ГГ, вооружённый персонаж, враг). ;)
 
Последнее редактирование:

Myxomop

Почетный форумчанин
Регистрация
28 Май 2005
Сообщения
3.235
Благодарности
2.575
Баллы
455
Для проверки его состояния в condition-функции диалога должно проверяться условие
Угу...
Код:
//Условие следующего диалога.
if(!Npc_RefuseTalk(self)) //Время вышло
{
 return TRUE;
};
Кроме того проверка есть в функции B_AssessTalk...

Но с использованием этого таймера нужно быть осторожным. Если таймер обнуляется в момент, когда открыто окно с выбором опций диалога с неписем, то при выборе опций диалога возможна путаница - игрок выберет одну опцию, а стартует другой диалог. Во всяком случае, это имеет место в Г1.
Ну да, при выборе варианта с установкой таймера нужно завершать диалог:
AI_StopProcessInfos(self);
Примеров в обеих играх достаточно.
 
Последнее редактирование:

Lorddemonik

★★★★★
Редактор раздела
Регистрация
17 Дек 2011
Сообщения
1.003
Благодарности
511
Баллы
350
О, вот насчёт этой функции я не знал. А видимо стоило. Тогда сразу встречный и довольно идиотский вопрос, но все же: какие ещё есть условного говоря "таймеры" в игре, без костылей?
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.331
Благодарности
3.178
Баллы
525
Других я не знаю. Этот вид таймера задумывался, если исходить из названия, для временного отказа от диалога. Но это не значит, что его нельзя использовать для других целей. Также нужно учитывать, что состояние этого таймера теряется при загрузке сохранённой игры, если не путаю.
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.157
Благодарности
6.137
Баллы
1.565
Как через марвин var int в TRUE перевести?
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.331
Благодарности
3.178
Баллы
525
Скорее всего, никак. А зачем нужно?
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.157
Благодарности
6.137
Баллы
1.565
Да, чтоб не проходить кучу квестов во время тестирования, перевести в тру и вперед дальше...
Можно конечно через тестового непися это все сделать, но думал что через марвин моно...
 

ElderGamer


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

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.157
Благодарности
6.137
Баллы
1.565
Все позабывал...*wall*
Есть диалог:
Код:
func void lalalala_info()
{
    AI_Output(self,other,"lalalalad_15_00");    //Ляляля?
    AI_Output(other,self,"lalalala_04_01");    //Нет
    AI_Output(self,other,"lalalala_04_08");    //Сам такой.
    Info_AddChoice(lalalala,"ЗАКОНЧИТЬ",lalalala_end); - первый вариант
    lalalala_end(); - второй варриант
};
по нажатии "закончить" - идем в lalalala_end
там:
Код:
func void lalalala_end()
{
    AI_StopProcessInfos(self);
    AI_PlayAni(self,"T_STAND_2_WOUNDEDB");
    B_KillNPC(self);
};
В прицнипе все правильно, но есть большая НО.
В первом варианте, непись просто падает, диалог не завершается.
Во втором варианте. Непись до начала диалога падает замертво, и видна фраза только ГГ. Диалог не завершается.
Помню лет 10 назад как-то решал этот баг, что функция, которая указана в конце диалога, начиналась ТОЛЬКО после окончания всех фраз. А сейчас ни как вспомнить не могу.
AI_WaitTillEnd использовал - непомогает
 
Последнее редактирование:

Jr13San


Модостроитель
Регистрация
1 Апр 2010
Сообщения
435
Благодарности
261
Баллы
230
Попробуй через цикл диалога, например, как здесь:
Не стесняюсь спросить....

Как вариант так:
PHP:
var int bKillNpc; //убивать НПС после разговора? (1 - да, 0 - нет)

func void lalalala_end()
{
    Print("lalalala_end"); //test
    bKillNpc = TRUE; //разрешаем
    AI_StopProcessInfos(self);
    AI_PlayAni(self,"T_STAND_2_WOUNDEDB");
};

func void lalalala_info()
{
   AI_Output(self,other,"lalalalad_15_00");    //Ляляля?
   AI_Output(other,self,"lalalala_04_01");    //Нет
   AI_Output(self,other,"lalalala_04_08");    //Сам такой.
   Info_AddChoice(lalalala,"ЗАКОНЧИТЬ",lalalala_end);
};


func void ZS_Talk_End()
{
    Print("ZS_Talk_End"); //test
 
    if (bKillNpc) //если разрешено убить
    {
        Print("Kill Npc"); //test
        B_KillNPC(self); //убиваем НПС
        bKillNpc = FALSE; //отмена флага, чтобы следующий собеседник не умер
        return; //выходим из функции
    };
 
    Npc_SetRefuseTalk(other,20);
    if(C_NpcIsBotheredByPlayerRoomGuild(self) || ((Wld_GetPlayerPortalGuild() == GIL_PUBLIC) && (Npc_GetAttitude(self,other) != ATT_FRIENDLY)))
    {
        AI_StartState(self,ZS_ObservePlayer,0,"");
    }
    else
    {
    };
};
 
Последнее редактирование:

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.157
Благодарности
6.137
Баллы
1.565
Спасибо, но не выросло))
Сделал немного по другому)
Код:
func void lalala_end()
{
    AI_StopProcessInfos(self);
    AI_PlayAni(self,"T_STAND_2_WOUNDEDB");
    Wld_PlayEffect("spellFX_INCOVATION_VIOLET",self,self,0,0,0,FALSE);
    AI_Teleport(self,"DI_UNDEADDRAGON_TRAP_03");
    Npc_ExchangeRoutine(self,"END");
};
 

Haart

Участник форума
Регистрация
24 Окт 2011
Сообщения
188
Благодарности
106
Баллы
185
Люди, кто знает, на win10 запустится Spacer ? На 7 идет нормально, но, говорят на десятке не хочет фурычить.
 

Jr13San


Модостроитель
Регистрация
1 Апр 2010
Сообщения
435
Благодарности
261
Баллы
230
Люди, кто знает, на win10 запустится Spacer ?
Работает и "Spacer" и "Spacer II".
Правда, может зависать с ошибкой связанной с перерисовкой вьюпорта. Как вариант, запускать через пакетник (cmd или bat) с таким содержанием:
Код:
@echo off
start Spacer.exe -zMaxFramerate:30
Здесь ограничение по частоте кадров.
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.157
Благодарности
6.137
Баллы
1.565
ну, говорят не запускается, вообще. Даже в режиме совместимости.
Все запускается и все работает.
Если не запустится после обновления на win10 - пиши симптомы. Будем решать коллегиально.
 

Haart

Участник форума
Регистрация
24 Окт 2011
Сообщения
188
Благодарности
106
Баллы
185
@MEG@VOLT, угу, посмотрю что там у потерпевшего)
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.157
Благодарности
6.137
Баллы
1.565
О, дак пусть потерпевший регистрируется у нас, и добро пожаловать в наш мир мордостроя)
 

Frog

Участник форума
Регистрация
7 Авг 2018
Сообщения
7
Благодарности
0
Баллы
150
По моду
Gothic Mod Fix

Приветствую, хотелось бы сыграть с этим модом, но мне нужно слегка поменять скрипт гг, поэтому залез в архив с файлами мода. Но при компиляции такая ошибка выскакивает: AI\Orc\B_Orc_AssessWarn.d(90): Ошибка: Неизвестный Идентификатор: B_ORC_REMOVEWEAPON.SLF


Что мне нужно исправить чтобы компилировать нормально?
 
Последнее редактирование модератором:
Сверху Снизу