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

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

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

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

MaGoth

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

Вложения

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

ElderGamer


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

B_ExchangeRoutine(GUR_1200_YBerion,"Stand");
Здесь в качестве аргумента должна быть переменная класса C_NPC, не инстанция. В данном диалоге это YBerion. При этом цвет текста субтитров может быть красным.

B_ExchangeRoutine(GUR_1200_YBerion,"Stand");
Возможно, это следует перенести в конец инстанции диалога.

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

В оригинале эпизод около тела Ю`Бериона, в котором ГГ приносит травы, а Ангар обнаруживает, что Ю`Берион умер, выполнен в одном диалоге. Из-за этого не получается сделать его "красиво". ГГ может подойти к Ангару с разных направлений и начать диалог с разных дистанций. Собираюсь разбить этот диалог. Первый диалог - ГГ приносит травы и отдаёт их Ангару. После этого Ангар переводится в специальное ZS-состояние, в котором подходит к телу Ю`Бериона и осматривает его. Из этого же состояния, скорее всего, можно будет отобрать у игрока управление ГГ и заставить ГГ подойти к телу Ю`Бериона и к Ангару для старта следующего диалога. После этого стартует второй диалог, в котором Ангар сообщает ГГ, что Ю`Берион мёртв. Нечто подобное нужно и в твоём случае.
 

STARK

Участник форума
Регистрация
20 Янв 2011
Сообщения
566
Благодарности
142
Баллы
220
Со смертью Ю`Бериона разобрался. Когда Ангар вручал руну, шёл вызов функции, которая вновь его делала мертвым.
Анимацию вставания добавил.
Осталась задача реализовать реплику Ю`Бериона в диалоге между героем и Кор Ангаром.

Есть возможность проверить состояние нпс как условие для диалога? Например, начинать диалог, только если нпс сидит?

Интересно, почему соурсер не распознает оператор else и что с этим делать?
 
Последнее редактирование:

ElderGamer


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

Есть возможность проверить состояние нпс как условие для диалога? Например, начинать диалог, только если нпс сидит?
Можно проверить и ZS-состояние, и состояние тела (сидит, стоит, идёт и т.д.).

Первое посмотри, например, в диалогах с крутильщиками болотника, когда они находятся в лагере Квентина. Там идёт проверка на состояние диалога. Второе поищи в скриптах по фрагменту "BodyState".

Интересно, почему соурсер не распознает оператор else и что с этим делать?
Скорее всего, имеет место ошибка синтаксиса. Скобочку забыл поставить или поставил не ту скобку.
 

STARK

Участник форума
Регистрация
20 Янв 2011
Сообщения
566
Благодарности
142
Баллы
220
Замена ссылки на Ю`Бериона не помогла?
Нет, по разному пробовал, GUR_1200_YBerion - YBerion, hero - other.
Скорее всего, имеет место ошибка синтаксиса. Скобочку забыл поставить или поставил не ту скобку.
Поставил лишнюю точку с запятой после блока if. Теперь все норм.

Вопрос не по теме, правильно ли сказать: "Я возвожу тебя в ранг Гуру"?
 

Venzern

Участник форума
Регистрация
24 Фев 2008
Сообщения
692
Благодарности
211
Баллы
220
STARK, как вариант "Посвящаю" (Посвященный проходит испытание на преданность Ордену), "Приобщаю" (приобщёнными к тесному кругу тайных посвящённых).

Т.е. в данном случае что-то типа этого "Теперь я приобщаю тебя к тесному кругу посвященных более известных в нашем братстве, как "Гуру"." или "Теперь за твои заслуги перед братством, я посвящаю тебя в тесный круг посвященных более известных, как "Гуру"."

З.Ы. У меня кстати вопрос, если начать делать простенькую модификацию для Г2:НВ, то что сейчас брать за платформу? Ванильные скрипты и миры Г2:НВ или есть улучшенная какая-нить "основа" для этого?
 
Последнее редактирование:

Lorddemonik

★★★★★
Редактор раздела
Регистрация
17 Дек 2011
Сообщения
1.119
Благодарности
584
Баллы
350
STARK, как вариант "Посвящаю" (Посвященный проходит испытание на преданность Ордену), "Приобщаю" (приобщёнными к тесному кругу тайных посвящённых).

Т.е. в данном случае что-то типа этого "Теперь я приобщаю тебя к тесному кругу посвященных более известных в нашем братстве, как "Гуру"." или "Теперь за твои заслугу перед братством, я посвящаю тебя в тесный круг посвященных более известных всем, как "Гуру"."

З.Ы. У меня кстати вопрос, если начать делать простенькую модификацию для Г2:НВ, то что сейчас брать за платформу? Ванильные скрипты и миры Г2:НВ или есть улучшенная какая-нить "основа" для этого?
Неофициальные обновления первой и второй части. К второй даже исходники идут
 

Myxomop

Почетный форумчанин
Регистрация
28 Май 2005
Сообщения
3.239
Благодарности
2.581
Баллы
455
Venzern,
Че-то Ю-Юберион из лаконичного чрезмерно болтливым стал после выхода из коматоза..
"Теперь за твои заслуги перед братством, я посвящаю тебя в тесный круг посвященных более известных всем, как "Гуру"."
А можно и еще растянуть :D
"Теперь, в этот знаменательный день, за твои неоценимые заслуги перед братством, я, Юберион - верховный лидер болотного братства, известный во всех трех лагерях и за пределами Хориниса, повелитель болотожеров и всех болотных тварей, волею Спящего посвящаю тебя в тесный круг посвященных, более известных всем, как "Гуру"."
 

Venzern

Участник форума
Регистрация
24 Фев 2008
Сообщения
692
Благодарности
211
Баллы
220
Myxomop, ну я писал просто для примера. А так поди пойми, как на дяденьку курение косяков и коматоз повлияли :D
 

Lorddemonik

★★★★★
Редактор раздела
Регистрация
17 Дек 2011
Сообщения
1.119
Благодарности
584
Баллы
350
Есть в г2а возможность менять цену продажи предметов на протяжении сессии? Любая попытка изменить TRADE_VALUE_MULTIPLIER позволяет установить цену один раз и на всю игру. Нашел на форуме такое:
Если динамическое изменение цен я сам делал, причем без вских "Извращенских функций" достаточно было просто изменить const float TRADE_VALUE_MULTIPLIER
на переменную var float TRADE_VALUE_MULTIPLIER
и все! Хотя по идеи такая реализация работать не должна.. но все же работает, даже если менять const string
Вот только не помогло. Пробовал инициализировать в init в итоге всегда только первый установленный множитель
Daedalus:
if(TRADE_VALUE_NOW == 0)
    {
        TRADE_VALUE_MULTIPLIER = 0.1;
    }
    else if (TRADE_VALUE_NOW == 1)
        {
        TRADE_VALUE_MULTIPLIER = 0.2;
    }
 

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.301
Благодарности
4.641
Баллы
625
Lorddemonik, не знаю где ты нашел это сообщение, но судя по всему этот сказочник обманул законы физики :) Не имеет значения константа или переменная - технически это одно и тоже. Суть тут в другом. Символ с данным именем действительно используется движком, но лишь один раз в момент инициализации множителя. Можно попробовать обойти эту систему оптимизации и вынудить движок считать значение каждый раз, добавив небольшой .patch файл в каталог игры.
Union:
#engine [G2A]
  #patch [Dynamic trade multiplier]
    HEX @0x00704719 = '90 90 90 90 90 90'
  #/patch
#/engine
 

N1kX


Модостроитель
Регистрация
13 Ноя 2009
Сообщения
6.176
Благодарности
5.697
Баллы
910
Есть в г2а возможность менять цену продажи предметов на протяжении сессии? Любая попытка изменить TRADE_VALUE_MULTIPLIER позволяет установить цену один раз и на всю игру. Нашел на форуме такое:

Вот только не помогло. Пробовал инициализировать в init в итоге всегда только первый установленный множитель
Daedalus:
if(TRADE_VALUE_NOW == 0)
    {
        TRADE_VALUE_MULTIPLIER = 0.1;
    }
    else if (TRADE_VALUE_NOW == 1)
        {
        TRADE_VALUE_MULTIPLIER = 0.2;
    }

Источник

Daedalus:
const int trade_Value_multiplier_ptr = 11211032; //0xAB1118

func void SetSellingValuePercent (var int percent) {
    //int to float:
    percent = divf (mkf (percent), mkf (100));
    MEM_WriteInt (trade_Value_multiplier_ptr, percent);
    
    /* This line does basically the following:
        MEM_InformationMan -> DlgTrade -> DlgInventoryNpc -> ValueMultiplier = percent; */
    MEM_WriteInt (MEM_ReadInt(MEM_InformationMan.DlgTrade + 248/*0xF8*/) + 268 /*0x10C*/, percent);
};

В нужном место просто вызываешь SetSellingValuePercent(15); //15 - стандартное число торговли. 0.15
 

Saturas


Модостроитель
Регистрация
11 Фев 2009
Сообщения
2.512
Благодарности
1.334
Баллы
315
Так это ширкарус, нахрен оно?
 

STARK

Участник форума
Регистрация
20 Янв 2011
Сообщения
566
Благодарности
142
Баллы
220
Готика 1. Есть необходимость поменять броню нескольким нпс в процессе игры, через диалог с другим нпс. Команда CreateInvItem(TPL_1420_Templer,tpl_armor_m); работает а вот дальше проблемы.
AI_EquipArmor(TPL_1420_Templer,tpl_armor_m);
AI_UnequipArmor(TPL_1420_Templer);
AI_EquipBestArmor(TPL_1420_Templer);
Ничего с префиксом AI не работает.
Вот эта команда:
EquipItem(TPL_1420_Templer,tpl_armor_m);
Пытается надеть новую броню, но не выходит, так как старая не снимается.
Может кто подскажет способ?
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.410
Благодарности
3.241
Баллы
525
Где находятся неписи в момент диалога? В зоне действия ИИ или за её пределами?
 

STARK

Участник форума
Регистрация
20 Янв 2011
Сообщения
566
Благодарности
142
Баллы
220
Где находятся неписи в момент диалога? В зоне действия ИИ или за её пределами?
Диалог у Галома, а испытуемый страж охраняет храм.
Попробовал на Каине, что стоял рядом:
CreateInvItem(NOV_1301_Caine,tpl_armor_m);
AI_EquipArmor(NOV_1301_Caine,tpl_armor_m);
Вторая команда не сработала.
 
Последнее редактирование:

ElderGamer


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

Переодевать непися в другие доспехи - неблагодарное занятие. Дело в том, что визуал непися периодически читается из его инстанции, в которой прописан первоначальный доспех. Я бы порекомендовал для описанного тобой случая использовать непися-дублёра, у которого в инстанции прописан нужный тебе доспех. В диалоге один непись удаляется из мира, а на его место вставляется другой непись. Можно, при желании скопировать некоторые параметры первого непися в состояние второго. Например, переменную, отмечающую, что непись был ранее побит ГГ, чтобы исключить повторное получение опыта за избиение.

Следует обратить внимание на то, что вызов функций удаления и вставки неписей нужно располагать в самом конце инстанции диалога, поскольку при их выполнении переопределяется идентификатор self.

AI_EquipArmor(NOV_1301_Caine,tpl_armor_m);
Вторая команда не сработала.
Если правильно помню, здесь нужен аргумент класса C_Npc, не инстанция. Возможно, причина в этом. Также, если непись выполняет свою рутину, его нужно сначала остановить, очистить текущую очередь AI-команд, и только потом выдавать ему новую последовательность AI-команд.
 
Последнее редактирование:

STARK

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

Если правильно помню, здесь нужен аргумент класса C_Npc, не инстанция. Возможно, причина в этом.
Пробовал так:
var C_Npc Caine;
Caine = Hlp_GetNpc(NOV_1301_Caine);
CreateInvItem(Caine,tpl_armor_m);
AI_EquipArmor(Caine,tpl_armor_m);
Результат так же отрицательный.

Также, если непись выполняет свою рутину, его нужно сначала остановить, очистить текущую очередь AI-команд, и только потом выдавать ему новую последовательность AI-команд.
Можно пример, как это сделать?
 

STARK

Участник форума
Регистрация
20 Янв 2011
Сообщения
566
Благодарности
142
Баллы
220
CreateInvItem(NOV_1301_Caine,tpl_armor_m);
B_FullStop(NOV_1301_Caine);
AI_EquipArmor(NOV_1301_Caine,tpl_armor_m);

Так работает, но только если нпс отрисован рядом, иначе не работает.
 

Saturas


Модостроитель
Регистрация
11 Фев 2009
Сообщения
2.512
Благодарности
1.334
Баллы
315
А чоб через юнион не запилить это? Вон пусть Gratt запилит в парсер екстендер функцию принудительного одевания доспеха
 
Сверху Снизу