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

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

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

MaGoth

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

Вложения

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

N1kX


Модостроитель
Регистрация
13 Ноя 2009
Сообщения
6.124
Благодарности
5.622
Баллы
910
CreateInvItem(NOV_1301_Caine,tpl_armor_m);
B_FullStop(NOV_1301_Caine);
AI_EquipArmor(NOV_1301_Caine,tpl_armor_m);

Так работает, но только если нпс отрисован рядом, иначе не работает.
Чет все мудрите
Только что попробовал, работает и даже пишется в сохранение изменение через функцию Mdl_SetVisualBody
Тестировал на бедном Орри, визуал (точнее изменяется лишь доспех, остальной визуал остается без изменений) меняется без проблем, хоть рядом, хоть за 100 км.
Параметры защиты меняются, как и добавляется новая броня в инвентарь непися.
Daedalus:
func void gameloop()
{
    //Original Orry Mdl_SetVisualBody (GRD_254_Orry,"hum_body_Naked0", 0, 1,"Hum_Head_Psionic", 14,  1, GRD_ARMOR_L);

    if (Hlp_KeyToggled(10)) //Key_9
    {
        Mdl_SetVisualBody (GRD_254_Orry,"hum_body_Naked0", 0, 1,"Hum_Head_Psionic", 14,  1, GRD_ARMOR_M);
    };
    if (Hlp_KeyToggled(9)) //Key_8
    {
        Mdl_SetVisualBody (GRD_254_Orry,"hum_body_Naked0", 0, 1,"Hum_Head_Psionic", 14,  1, VLK_ARMOR_L);
    };

};

Примечание, функция сработает сразу первой после запуска функции диалога _info
1. Если нужно, чтобы сработала где-то в середине/в конце диалога используй AI_CallScript из zParserExtender
2. Либо можно создать фейковый диалог выхода или продолжение диалога, где уже будет вызов функции
1.
Daedalus:
func void ExangeArmorTPL_01()
{
    Mdl_SetVisualBody (xxxx);
    Mdl_SetVisualBody (xxxx);
    Mdl_SetVisualBody (xxxx);
};

func void DIA_TEST_INFO
{
    AI_Output (other, self,"DIA_TEST_15_00"); //bla
    AI_Output (self, other,"DIA_TEST_02_01"); //Bla
    AI_Output (self, other,"DIA_TEST_02_02"); //Bla
    AI_CallScript("ExangeArmorTPL_01",self,other); //поместить в очередь AI NPC self выполнение функции ExangeArmorTPL_01
};
2.
Daedalus:
func void ExangeArmorTPL_01()
{
    Mdl_SetVisualBody (xxxx);
    Mdl_SetVisualBody (xxxx);
    Mdl_SetVisualBody (xxxx);
};

func void DIA_TEST_INFO
{
    AI_Output (other, self,"DIA_TEST_15_00"); //bla
    AI_Output (self, other,"DIA_TEST_02_01"); //Bla
    AI_Output (self, other,"DIA_TEST_02_02"); //Bla
    Info_ClearChoices(DIA_TEST);
    Info_AddChoice(DIA_TEST,Dialog_ENDE,DIA_TEST_ENDE);
};

func void DIA_TEST_ENDE()
{
    AI_StopProcessInfos(self);
    ExangeArmorTPL_01();
};
 
Последнее редактирование:

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.407
Благодарности
3.232
Баллы
525
Так работает, но только если нпс отрисован рядом, иначе не работает.
Непись, находящийся вне зоны действия ИИ, не выполняет ни каких AI-действий. Ну, разве что, происходит имитация передвижения от одной точки выполнения распорядка к другой, при необходимости. Поэтому для переодевания таких неписей нужно использовать, как сказал камрад N1kX, функцию
Mdl_SetVisualBody. Правда, эта функция не встраивается в AI-очередь. Она выполняется при старте диалога. Ну, об этом тоже сказал камрад N1kX.

работает и даже пишется в сохранение
У меня, кажется, не получалось запомнить это изменение в Г1. Поэтому визуал ГГ обновляется при каждой инициализации локации.
 
Последнее редактирование:

N1kX


Модостроитель
Регистрация
13 Ноя 2009
Сообщения
6.124
Благодарности
5.622
Баллы
910
У меня, кажется, не получалось запомнить это изменение в Г1. Поэтому визуал ГГ обновляется при каждой инициализации локации.
Для ГГ не проверял, но Бедный Орри стоит в одежде рудокопа :D
Проверял как просто сейф/лоад, так и уход в другую локу и обратно, также полный перезапуск готики (самый правильный способ). Облик Орри сохранялся на всем протяжений.
 
Последнее редактирование:

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.407
Благодарности
3.232
Баллы
525
Для ГГ не проверял
Для ГГ у меня меняется текстура тушки (в одежде или без одежды).

Орри стоит в одежде рудокопа
Сейчас, по ходу тестов, один раз поймал такую ситуациию, когда непись после смены доспеха остался в трусах. Новый доспех появился в инвентаре и числился там экипированным, но не заменил тушку непися. Повторить не удалось. Возможно, причина связана с использованием читов (полёт камеры к месту нахождения непися).
 

Myxomop

Почетный форумчанин
Регистрация
28 Май 2005
Сообщения
3.239
Благодарности
2.581
Баллы
455
Готика 1. Есть необходимость поменять броню нескольким нпс в процессе игры, через диалог с другим нпс. Команда CreateInvItem(TPL_1420_Templer,tpl_armor_m); работает а вот дальше проблемы.
В Г1 и Г2 для этих целей используется
AI_EquipBestArmor (self);
Естественно, до этого из инвентаря нужно удалить все другие доспехи.
 

STARK

Участник форума
Регистрация
20 Янв 2011
Сообщения
555
Благодарности
142
Баллы
220
Попробовал Mdl_SetVisualBody. В итоге 3 из 9 стали голыми. После сохранения и загрузки вдали от этих нпс, они стали одетыми. В целом, результат хороший.

Что интересно, повторил эксперимент, и голыми оказались все те же трое. Сохранение и загрузка рядом так же решили проблему.
 
Последнее редактирование:

STARK

Участник форума
Регистрация
20 Янв 2011
Сообщения
555
Благодарности
142
Баллы
220
Хотел сделать диалог, который бы повторялся при определенном условии, а при другом условии пропал (стал бы одноразовым). После неудачной попытки решил заменить это двумя одноразовыми диалогами, но всё равно хотелось бы знать, есть ли способ осуществить первоначальную задумку.
Daedalus:
instance Info_Milten_Death_Sword(C_Info)
{
    npc = PC_Mage;
    condition = Info_Milten_Death_Sword_Condition;
    information = Info_Milten_Death_Sword_Info;
    permanent = 1;
    description = "text";
};


func int Info_Milten_Death_Sword_Condition()
{
    if(Npc_KnowsInfo(hero,Info_YBerion_About_Sword))
    {
        return TRUE;
    };
};

func void Info_Milten_Death_Sword_Info()
{
    AI_Output(hero,self,"Info_Milten_Death_Sword_15_01");    //text
    if (Npc_GetDistToWP(self,"OCC_CHAPEL_ENTRANCE") < 1000)
    {    
    AI_Output(self,hero,"Info_Milten_Death_Sword_02_02");    //text
    AI_Output(self,hero,"Info_Milten_Death_Sword_02_03");    //text
    Info_ClearChoices(Info_Milten_Death_Sword);  //Неудачная попытка убрать этот диалог.
    }
    else
    {
    AI_Output(self,hero,"Info_Milten_Death_Sword_02_04");    //Поговорим об этом, когда я вернусь в замок.
    };
};
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.860
Благодарности
6.740
Баллы
1.625
STARK,
permanent = 1;
Означает постоянность.
permanent = false;
означает единоразово
 

STARK

Участник форума
Регистрация
20 Янв 2011
Сообщения
555
Благодарности
142
Баллы
220
MEG@VOLT, ну это я знаю. Я хотел чтобы диалог был перманентным, но при определенном условии исчез, как одноразовый.
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.407
Благодарности
3.232
Баллы
525
есть ли способ осуществить первоначальную задумку.
Делаешь многоразовый диалог. В условии этого диалога проверяешь значение переменной. Значение переменной изменяется в теле этого диалога, если соблюдены другие условия, нужные фразы сказаны, и диалог больше не нужен (условие больше не сработает).
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.860
Благодарности
6.740
Баллы
1.625
STARK, А, ну создай какой нить var int. Запиши го в условие, например


Daedalus:
var int odinraz;

func int Info_Milten_Death_Sword_Condition()

{

    if(Npc_KnowsInfo(hero,Info_YBerion_About_Sword) && odinraz != 38)

    {

        return TRUE;

    };

};

Ну и в определенный момент поставь odinraz = 38;
 

STARK

Участник форума
Регистрация
20 Янв 2011
Сообщения
555
Благодарности
142
Баллы
220
ElderGamer MEG@VOLT, спасибо, и как я сам не догадался:)
Пост автоматически объединён:

Не подскажите, была ли в первой Готике ситуация, когда нпс или ГГ берёт меч и осматривает его?
Пока могу вспомнить только ситуацию с Родом из Готики 2.

А, вроде Ксардас смотрел Уризель, щас гляну.
 
Последнее редактирование:

ElderGamer


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

STARK

Участник форума
Регистрация
20 Янв 2011
Сообщения
555
Благодарности
142
Баллы
220
Пробовал "стандартным" путём:
Daedalus:
    CreateInvItem(self,ItMw_1H_Sword_Long_05_Mil);
    AI_EquipBestMeleeWeapon(self);
    AI_ReadyMeleeWeapon(self);
    AI_PlayAni(self,"T_1HSINSPECT");
    AI_RemoveWeapon(self);
    AI_UnequipWeapons(self);
    Npc_RemoveInvItem(self,ItMw_1H_Sword_Long_05_Mil);
Но команда удаления предмета происходит сразу же, а не после очереди AI. Можно это как-то исправить?
 

N1kX


Модостроитель
Регистрация
13 Ноя 2009
Сообщения
6.124
Благодарности
5.622
Баллы
910
Пробовал "стандартным" путём:
Daedalus:
    CreateInvItem(self,ItMw_1H_Sword_Long_05_Mil);
    AI_EquipBestMeleeWeapon(self);
    AI_ReadyMeleeWeapon(self);
    AI_PlayAni(self,"T_1HSINSPECT");
    AI_RemoveWeapon(self);
    AI_UnequipWeapons(self);
    Npc_RemoveInvItem(self,ItMw_1H_Sword_Long_05_Mil);
Но команда удаления предмета происходит сразу же, а не после очереди AI. Можно это как-то исправить?
Как уже было сказано выше, либо удаляешь предмет в диалоге подделке, либо с помощью AI_CallScript (функция безопасна, т.к. использует неиспользуемый эвент EV_CALLSCRIPT , который наверно и был предназначен для таких целей)

Все функции, которые не имеют приставки AI_ (Это не относится к функциям, которые вызывают функцию с приставкой AI_ ) выполняются сразу, также выполняется сразу присвоения, проверки.
 
Последнее редактирование:

STARK

Участник форума
Регистрация
20 Янв 2011
Сообщения
555
Благодарности
142
Баллы
220
В моём случае можно удалить предмет в следующем диалоге, который идёт вскоре после этого.
 

STARK

Участник форума
Регистрация
20 Янв 2011
Сообщения
555
Благодарности
142
Баллы
220
Нужно экипировать в диалоге меч. Вышел из ситуации командой AI_EquipBestMeleeWeapon(hero); .
Но что делать, если оружие не является лучшим?
EquipItem(hero,ItMw_1H_Sword_Long_05); нормально не работает, может есть еще команды? Я не нашёл.
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.407
Благодарности
3.232
Баллы
525
А чем не устраивает способ из мод-фикса? Там, правда, потребуется прописать инстанцию нового служебного предмета по аналогии с двумя существующими. Только назначить визуал того меча, который нужно "осмотреть".
 

STARK

Участник форума
Регистрация
20 Янв 2011
Сообщения
555
Благодарности
142
Баллы
220
ElderGamer, во втором случае мне уже не осмотреть его нужно, а героем получить его, экипировать и достать на 10 сек для ритуала.
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.407
Благодарности
3.232
Баллы
525
Ты не сможешь его экипировать, если это не самое мощное оружие в инвентаре. Во всяком случае, если говорить о стандартных средствах.

ДОБАВЛЕНО:
Впрочем, можно попробовать костыль с временным изменением параметров меча. Возможно, в диалоге получится увеличить параметры меча, чтобы он гарантированно стал самым лучшим. Также нужно предусмотреть возвращение параметров меча к норме впоследствии.
 
Последнее редактирование:
Сверху Снизу